@zigrivers/scaffold 3.29.0 → 3.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/content/guides/AUTHORING.md +146 -0
- package/content/guides/cli/index.html +1855 -0
- package/content/guides/cli/index.md +206 -0
- package/content/guides/concepts/index.html +1970 -0
- package/content/guides/concepts/index.md +347 -0
- package/content/guides/dashboard/index.html +1913 -0
- package/content/guides/dashboard/index.md +264 -0
- package/content/guides/index.html +368 -15
- package/content/guides/install/.diagrams/diagram-0.svg +1 -0
- package/content/guides/install/.diagrams/manifest.json +3 -0
- package/content/guides/install/index.html +1653 -0
- package/content/guides/install/index.md +186 -0
- package/content/guides/knowledge/.diagrams/diagram-0.svg +1 -0
- package/content/guides/knowledge/.diagrams/manifest.json +3 -0
- package/content/guides/knowledge/index.html +1765 -0
- package/content/guides/knowledge/index.md +209 -0
- package/content/guides/knowledge-freshness/.diagrams/diagram-0.svg +1 -0
- package/content/guides/knowledge-freshness/.diagrams/manifest.json +3 -0
- package/content/guides/knowledge-freshness/index.html +2795 -0
- package/content/guides/knowledge-freshness/index.md +893 -0
- package/content/guides/mmr/index.html +407 -36
- package/content/guides/mmr/index.md +39 -16
- package/content/guides/multi-agent/.diagrams/diagram-0.svg +1 -0
- package/content/guides/multi-agent/.diagrams/manifest.json +3 -0
- package/content/guides/multi-agent/index.html +1715 -0
- package/content/guides/multi-agent/index.md +243 -0
- package/content/guides/observability/.diagrams/diagram-0.svg +1 -0
- package/content/guides/observability/.diagrams/diagram-1.svg +1 -0
- package/content/guides/observability/.diagrams/diagram-2.svg +1 -0
- package/content/guides/observability/.diagrams/diagram-3.svg +1 -0
- package/content/guides/observability/.diagrams/manifest.json +6 -0
- package/content/guides/observability/index.html +3257 -0
- package/content/guides/observability/index.md +1097 -0
- package/content/guides/pipeline/.diagrams/diagram-0.svg +1 -0
- package/content/guides/pipeline/.diagrams/diagram-1.svg +1 -0
- package/content/guides/pipeline/.diagrams/manifest.json +4 -0
- package/content/guides/pipeline/index.html +1973 -0
- package/content/guides/pipeline/index.md +387 -0
- package/content/guides/review-workflow/.diagrams/diagram-0.svg +1 -0
- package/content/guides/review-workflow/.diagrams/diagram-1.svg +1 -0
- package/content/guides/review-workflow/.diagrams/manifest.json +4 -0
- package/content/guides/review-workflow/index.html +1790 -0
- package/content/guides/review-workflow/index.md +248 -0
- package/dist/guides/build.d.ts +1 -1
- package/dist/guides/build.d.ts.map +1 -1
- package/dist/guides/build.js +21 -9
- package/dist/guides/build.js.map +1 -1
- package/dist/guides/build.test.js +47 -0
- package/dist/guides/build.test.js.map +1 -1
- package/dist/guides/chrome.d.ts.map +1 -1
- package/dist/guides/chrome.js +83 -12
- package/dist/guides/chrome.js.map +1 -1
- package/dist/guides/dashboard-theme.css +8 -0
- package/dist/guides/directives-cite.test.d.ts +2 -0
- package/dist/guides/directives-cite.test.d.ts.map +1 -0
- package/dist/guides/directives-cite.test.js +26 -0
- package/dist/guides/directives-cite.test.js.map +1 -0
- package/dist/guides/directives-tabs.test.js +47 -0
- package/dist/guides/directives-tabs.test.js.map +1 -1
- package/dist/guides/directives.d.ts +1 -0
- package/dist/guides/directives.d.ts.map +1 -1
- package/dist/guides/directives.js +38 -0
- package/dist/guides/directives.js.map +1 -1
- package/dist/guides/guides.css +268 -0
- package/dist/guides/index-page.d.ts.map +1 -1
- package/dist/guides/index-page.js +41 -8
- package/dist/guides/index-page.js.map +1 -1
- package/dist/guides/links.d.ts +14 -0
- package/dist/guides/links.d.ts.map +1 -0
- package/dist/guides/links.js +56 -0
- package/dist/guides/links.js.map +1 -0
- package/dist/guides/links.test.d.ts +2 -0
- package/dist/guides/links.test.d.ts.map +1 -0
- package/dist/guides/links.test.js +72 -0
- package/dist/guides/links.test.js.map +1 -0
- package/dist/guides/render.d.ts +1 -0
- package/dist/guides/render.d.ts.map +1 -1
- package/dist/guides/render.js +1 -1
- package/dist/guides/render.js.map +1 -1
- package/dist/guides/sanitize.d.ts.map +1 -1
- package/dist/guides/sanitize.js +5 -0
- package/dist/guides/sanitize.js.map +1 -1
- package/dist/guides/template.d.ts.map +1 -1
- package/dist/guides/template.js +7 -2
- package/dist/guides/template.js.map +1 -1
- package/package.json +2 -2
|
@@ -48,5 +48,52 @@ describe('remarkTabs', () => {
|
|
|
48
48
|
// First pane is active
|
|
49
49
|
expect(body).toContain('class="tabpane active"');
|
|
50
50
|
});
|
|
51
|
+
it('emits a complete ARIA tabs pattern that survives sanitization', async () => {
|
|
52
|
+
const md = [
|
|
53
|
+
'::::tabs',
|
|
54
|
+
'',
|
|
55
|
+
':::tab{title="A"}',
|
|
56
|
+
'A body',
|
|
57
|
+
':::',
|
|
58
|
+
'',
|
|
59
|
+
':::tab{title="B"}',
|
|
60
|
+
'B body',
|
|
61
|
+
':::',
|
|
62
|
+
'',
|
|
63
|
+
'::::',
|
|
64
|
+
].join('\n') + '\n';
|
|
65
|
+
const { body } = await renderGuideBody(md, { plugins: [remarkTabs] });
|
|
66
|
+
// Buttons: role=tab, controls + selected + roving tabindex
|
|
67
|
+
expect(body).toContain('role="tab"');
|
|
68
|
+
expect(body).toContain('aria-controls="tabpane-0-0"');
|
|
69
|
+
expect(body).toContain('aria-selected="true"');
|
|
70
|
+
expect(body).toContain('aria-selected="false"');
|
|
71
|
+
expect(body).toContain('tabindex="0"');
|
|
72
|
+
expect(body).toContain('tabindex="-1"');
|
|
73
|
+
// Panes: role=tabpanel + back-reference (the casing-sensitive one the
|
|
74
|
+
// sanitize allowlist must match: ariaLabelledBy, not ariaLabelledby)
|
|
75
|
+
expect(body).toContain('role="tabpanel"');
|
|
76
|
+
expect(body).toContain('aria-labelledby="tab-0-0"');
|
|
77
|
+
expect(body).toContain('id="tabpane-0-1"');
|
|
78
|
+
});
|
|
79
|
+
it('renders quoted titles with punctuation without leaking directive text', async () => {
|
|
80
|
+
const md = [
|
|
81
|
+
'::::tabs',
|
|
82
|
+
'',
|
|
83
|
+
':::tab{title="mvp (depth 1)"}',
|
|
84
|
+
'A body',
|
|
85
|
+
':::',
|
|
86
|
+
'',
|
|
87
|
+
':::tab{title="CLI / library"}',
|
|
88
|
+
'B body',
|
|
89
|
+
':::',
|
|
90
|
+
'',
|
|
91
|
+
'::::',
|
|
92
|
+
].join('\n') + '\n';
|
|
93
|
+
const { body } = await renderGuideBody(md, { plugins: [remarkTabs] });
|
|
94
|
+
expect(body).toContain('mvp (depth 1)');
|
|
95
|
+
expect(body).toContain('CLI / library');
|
|
96
|
+
expect(body).not.toContain(':::tab'); // no leaked raw directive text
|
|
97
|
+
});
|
|
51
98
|
});
|
|
52
99
|
//# sourceMappingURL=directives-tabs.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directives-tabs.test.js","sourceRoot":"","sources":["../../src/guides/directives-tabs.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,GAAG;YACT,UAAU;YACV,EAAE;YACF,qBAAqB;YACrB,UAAU;YACV,KAAK;YACL,EAAE;YACF,6BAA6B;YAC7B,EAAE;YACF,MAAM;SACP,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QACrE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,GAAG;YACT,UAAU;YACV,EAAE;YACF,uBAAuB;YACvB,YAAY;YACZ,KAAK;YACL,EAAE;YACF,wBAAwB;YACxB,aAAa;YACb,KAAK;YACL,EAAE;YACF,MAAM;SACP,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QACrE,+BAA+B;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACpC,YAAY;QACZ,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QACtC,0BAA0B;QAC1B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QACrC,gCAAgC;QAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACrD,uBAAuB;QACvB,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"directives-tabs.test.js","sourceRoot":"","sources":["../../src/guides/directives-tabs.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,GAAG;YACT,UAAU;YACV,EAAE;YACF,qBAAqB;YACrB,UAAU;YACV,KAAK;YACL,EAAE;YACF,6BAA6B;YAC7B,EAAE;YACF,MAAM;SACP,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QACrE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,GAAG;YACT,UAAU;YACV,EAAE;YACF,uBAAuB;YACvB,YAAY;YACZ,KAAK;YACL,EAAE;YACF,wBAAwB;YACxB,aAAa;YACb,KAAK;YACL,EAAE;YACF,MAAM;SACP,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QACrE,+BAA+B;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACpC,YAAY;QACZ,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QACtC,0BAA0B;QAC1B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QACrC,gCAAgC;QAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACrD,uBAAuB;QACvB,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,EAAE,GAAG;YACT,UAAU;YACV,EAAE;YACF,mBAAmB;YACnB,QAAQ;YACR,KAAK;YACL,EAAE;YACF,mBAAmB;YACnB,QAAQ;YACR,KAAK;YACL,EAAE;YACF,MAAM;SACP,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QACrE,2DAA2D;QAC3D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAA;QACrD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAA;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAA;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;QACvC,sEAAsE;QACtE,qEAAqE;QACrE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAA;QACnD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,EAAE,GAAG;YACT,UAAU;YACV,EAAE;YACF,+BAA+B;YAC/B,QAAQ;YACR,KAAK;YACL,EAAE;YACF,+BAA+B;YAC/B,QAAQ;YACR,KAAK;YACL,EAAE;YACF,MAAM;SACP,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QACrE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA,CAAC,+BAA+B;IACtE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -3,5 +3,6 @@ export declare const remarkCallout: AnyPlugin;
|
|
|
3
3
|
export declare const remarkTabs: AnyPlugin;
|
|
4
4
|
export declare const remarkChart: AnyPlugin;
|
|
5
5
|
export declare const remarkFilterTable: AnyPlugin;
|
|
6
|
+
export declare const remarkCite: AnyPlugin;
|
|
6
7
|
export declare const remarkSev: AnyPlugin;
|
|
7
8
|
//# sourceMappingURL=directives.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directives.d.ts","sourceRoot":"","sources":["../../src/guides/directives.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAI5C,eAAO,MAAM,aAAa,EAAE,SAU3B,CAAA;AAGD,eAAO,MAAM,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"directives.d.ts","sourceRoot":"","sources":["../../src/guides/directives.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAI5C,eAAO,MAAM,aAAa,EAAE,SAU3B,CAAA;AAGD,eAAO,MAAM,UAAU,EAAE,SA6DxB,CAAA;AAGD,eAAO,MAAM,WAAW,EAAE,SAqDzB,CAAA;AAGD,eAAO,MAAM,iBAAiB,EAAE,SAmB/B,CAAA;AAQD,eAAO,MAAM,UAAU,EAAE,SAgBxB,CAAA;AAKD,eAAO,MAAM,SAAS,EAAE,SAUvB,CAAA"}
|
|
@@ -15,6 +15,7 @@ export const remarkCallout = () => (tree) => {
|
|
|
15
15
|
};
|
|
16
16
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
17
17
|
export const remarkTabs = () => (tree) => {
|
|
18
|
+
let group = 0; // unique id base per tabs group (document order → deterministic)
|
|
18
19
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
20
|
visit(tree, (node) => {
|
|
20
21
|
if (node.type !== 'containerDirective' || node.name !== 'tabs')
|
|
@@ -22,20 +23,29 @@ export const remarkTabs = () => (tree) => {
|
|
|
22
23
|
// With a 4-colon outer fence (::::tabs) wrapping 3-colon (:::tab) children,
|
|
23
24
|
// remark-directive nests tab nodes directly inside node.children — no sibling
|
|
24
25
|
// collection needed, no stray ::: paragraph produced.
|
|
26
|
+
const g = group++;
|
|
27
|
+
const tabId = (i) => `tab-${g}-${i}`;
|
|
28
|
+
const paneId = (i) => `tabpane-${g}-${i}`;
|
|
25
29
|
const tabs = (node.children ?? []).filter(
|
|
26
30
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
31
|
(c) => c.type === 'containerDirective' && c.name === 'tab');
|
|
28
32
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
29
33
|
const others = (node.children ?? []).filter((c) => !(c.type === 'containerDirective' && c.name === 'tab'));
|
|
34
|
+
// Full ARIA tabs pattern: each button controls its pane; roving tabindex +
|
|
35
|
+
// aria-selected track the active tab (chrome.ts updates them on click/arrow).
|
|
30
36
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
31
37
|
const buttons = tabs.map((t, i) => ({
|
|
32
38
|
type: 'paragraph',
|
|
33
39
|
data: {
|
|
34
40
|
hName: 'button',
|
|
35
41
|
hProperties: {
|
|
42
|
+
id: tabId(i),
|
|
36
43
|
className: 'tab-btn' + (i === 0 ? ' active' : ''),
|
|
37
44
|
role: 'tab',
|
|
38
45
|
'data-tab': String(i),
|
|
46
|
+
'aria-controls': paneId(i),
|
|
47
|
+
'aria-selected': i === 0 ? 'true' : 'false',
|
|
48
|
+
tabindex: i === 0 ? '0' : '-1',
|
|
39
49
|
},
|
|
40
50
|
},
|
|
41
51
|
children: [{ type: 'text', value: String(t.attributes?.title ?? `Tab ${i + 1}`) }],
|
|
@@ -51,8 +61,12 @@ export const remarkTabs = () => (tree) => {
|
|
|
51
61
|
t.data = t.data ?? {};
|
|
52
62
|
t.data.hName = 'div';
|
|
53
63
|
t.data.hProperties = {
|
|
64
|
+
id: paneId(i),
|
|
54
65
|
className: 'tabpane' + (i === 0 ? ' active' : ''),
|
|
66
|
+
role: 'tabpanel',
|
|
55
67
|
'data-tab': String(i),
|
|
68
|
+
'aria-labelledby': tabId(i),
|
|
69
|
+
tabindex: '0',
|
|
56
70
|
};
|
|
57
71
|
});
|
|
58
72
|
node.data = node.data ?? {};
|
|
@@ -141,6 +155,30 @@ export const remarkFilterTable = () => (tree) => {
|
|
|
141
155
|
node.children = [input, ...(node.children ?? [])];
|
|
142
156
|
});
|
|
143
157
|
};
|
|
158
|
+
// `:cite[path:line]` (blocking) / `:cite[path:line]{mode=advisory}` (warns).
|
|
159
|
+
// Blocking citations render as `<span class="fp" data-path="…">` so the existing
|
|
160
|
+
// citation-drift checker (scripts/check-reference-citations.mjs FP_RE) verifies
|
|
161
|
+
// the file:line still exists. Advisory citations use a non-`fp` class so the
|
|
162
|
+
// checker's `\bfp\b` match ignores them (the gate never blocks on them).
|
|
163
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
164
|
+
export const remarkCite = () => (tree) => {
|
|
165
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
166
|
+
visit(tree, (node) => {
|
|
167
|
+
if (node.type !== 'textDirective' || node.name !== 'cite')
|
|
168
|
+
return;
|
|
169
|
+
const path = mdToString(node).trim();
|
|
170
|
+
const advisory = String(node.attributes?.mode ?? '').toLowerCase() === 'advisory';
|
|
171
|
+
node.data = node.data ?? {};
|
|
172
|
+
node.data.hName = 'span';
|
|
173
|
+
// camelCase `dataPath` matches the hast property convention and the
|
|
174
|
+
// sanitize allowlist (sanitize.ts) — serializes to the data-path attribute.
|
|
175
|
+
node.data.hProperties = {
|
|
176
|
+
className: advisory ? 'cite-advisory' : 'fp',
|
|
177
|
+
dataPath: path,
|
|
178
|
+
};
|
|
179
|
+
node.children = [{ type: 'text', value: path }];
|
|
180
|
+
});
|
|
181
|
+
};
|
|
144
182
|
const SEV_LEVELS = new Set(['p0', 'p1', 'p2', 'p3', 'pass']);
|
|
145
183
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
146
184
|
export const remarkSev = () => (tree) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directives.js","sourceRoot":"","sources":["../../src/guides/directives.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAI7D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;AAE3E,MAAM,CAAC,MAAM,aAAa,GAAc,GAAG,EAAE,CAAC,CAAC,IAAU,EAAE,EAAE;IAC3D,8DAA8D;IAC9D,KAAK,CAAC,IAAI,EAAE,CAAC,IAAS,EAAE,EAAE;QACxB,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAM;QACzE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;QAClE,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;QACpD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QACvB,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,SAAS,EAAE,mBAAmB,IAAI,EAAE,EAAE,CAAA;IAClE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,8DAA8D;AAC9D,MAAM,CAAC,MAAM,UAAU,GAAc,GAAG,EAAE,CAAC,CAAC,IAAS,EAAE,EAAE;IACvD,8DAA8D;IAC9D,KAAK,CAAC,IAAI,EAAE,CAAC,IAAS,EAAE,EAAE;QACxB,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAM;QACtE,4EAA4E;QAC5E,8EAA8E;QAC9E,sDAAsD;
|
|
1
|
+
{"version":3,"file":"directives.js","sourceRoot":"","sources":["../../src/guides/directives.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
* guides.css — component + layout styles for `scaffold guides` reference pages.
|
|
3
|
+
*
|
|
4
|
+
* Pairs with lib/dashboard-theme.css (the token source) and src/guides/chrome.ts
|
|
5
|
+
* (the behavior). Styles the guide CHROME (.topbar, .layout, .rail, nav.toc,
|
|
6
|
+
* .content) and the markdown DIRECTIVES (callouts, sev chips, filter-tables,
|
|
7
|
+
* charts, tabs, citations) plus base prose typography.
|
|
8
|
+
*
|
|
9
|
+
* DESIGN SYSTEM: all COLORS come from dashboard-theme.css tokens, and spacing
|
|
10
|
+
* uses the --sp-* scale wherever it maps. The few structural layout constants
|
|
11
|
+
* (topbar height, rail/drawer width, chart label column, card min) are declared
|
|
12
|
+
* as local custom properties below; a handful of sub-scale UI values (chip/bar
|
|
13
|
+
* sizing, em-based inline-code padding) and the responsive breakpoint are
|
|
14
|
+
* literal because no token expresses them. Both themes are covered because every
|
|
15
|
+
* color is a token.
|
|
16
|
+
* ==========================================================================*/
|
|
17
|
+
|
|
18
|
+
:root {
|
|
19
|
+
--topbar-h: 52px; /* sticky topbar height; rail sticky offset keys off it */
|
|
20
|
+
--rail-w: 260px; /* desktop TOC sidebar column */
|
|
21
|
+
--drawer-w: 280px; /* mobile off-canvas TOC drawer */
|
|
22
|
+
--card-min: 260px; /* index card min track width */
|
|
23
|
+
--chart-label-w: 90px; /* chart row label column min */
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* ── Base / reset on top of the token base in dashboard-theme.css ─────────── */
|
|
27
|
+
.content a { color: var(--accent); text-decoration: none; }
|
|
28
|
+
.content a:hover { text-decoration: underline; }
|
|
29
|
+
.content strong { font-weight: var(--fw-semi); }
|
|
30
|
+
.content hr { border: 0; border-top: 1px solid var(--border-light); margin: var(--sp-6) 0; }
|
|
31
|
+
|
|
32
|
+
/* Consistent keyboard focus for every interactive control (a11y). */
|
|
33
|
+
.topbar button:focus-visible,
|
|
34
|
+
.copy-btn:focus-visible,
|
|
35
|
+
.tab-btn:focus-visible,
|
|
36
|
+
.filter-input:focus-visible,
|
|
37
|
+
nav.toc a:focus-visible,
|
|
38
|
+
.guide-card:focus-visible,
|
|
39
|
+
.content a:focus-visible {
|
|
40
|
+
outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-sm);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* ── Topbar ────────────────────────────────────────────────────────────────*/
|
|
44
|
+
.topbar {
|
|
45
|
+
position: sticky; top: 0; z-index: 60; height: var(--topbar-h);
|
|
46
|
+
display: flex; align-items: center; gap: var(--sp-3);
|
|
47
|
+
padding: 0 var(--page-pad);
|
|
48
|
+
background: var(--bg-card); border-bottom: 1px solid var(--border);
|
|
49
|
+
}
|
|
50
|
+
.topbar h1 {
|
|
51
|
+
flex: 1; min-width: 0; margin: 0;
|
|
52
|
+
font-size: var(--text-lg); font-weight: var(--fw-bold);
|
|
53
|
+
letter-spacing: var(--ls-tight);
|
|
54
|
+
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
|
|
55
|
+
}
|
|
56
|
+
.topbar button {
|
|
57
|
+
background: var(--bg-card); border: 1px solid var(--border); color: var(--text);
|
|
58
|
+
border-radius: var(--radius-sm); padding: var(--sp-1) var(--sp-3); font-size: var(--text-base);
|
|
59
|
+
line-height: 1; cursor: pointer; font-family: inherit;
|
|
60
|
+
}
|
|
61
|
+
.topbar button:hover { background: var(--bg-hover); border-color: var(--accent); }
|
|
62
|
+
.nav-toggle { display: none; }
|
|
63
|
+
|
|
64
|
+
/* ── Layout: sticky sidebar TOC + reading-width content ──────────────────── */
|
|
65
|
+
.layout {
|
|
66
|
+
max-width: var(--max-w); margin: 0 auto;
|
|
67
|
+
display: grid; grid-template-columns: var(--rail-w) minmax(0, 1fr);
|
|
68
|
+
gap: var(--sp-8); padding: 0 var(--page-pad);
|
|
69
|
+
}
|
|
70
|
+
.rail {
|
|
71
|
+
position: sticky; top: var(--topbar-h); align-self: start;
|
|
72
|
+
height: calc(100vh - var(--topbar-h)); overflow-y: auto;
|
|
73
|
+
padding: var(--sp-5) 0; border-right: 1px solid var(--border-light);
|
|
74
|
+
}
|
|
75
|
+
.content { min-width: 0; padding: var(--sp-6) 0 var(--sp-10); }
|
|
76
|
+
|
|
77
|
+
/* Backdrop behind the mobile drawer (toggled with the rail via chrome.ts). */
|
|
78
|
+
.rail-backdrop { display: none; }
|
|
79
|
+
/* In-drawer close button — hidden on desktop (the rail is a static sidebar). */
|
|
80
|
+
.rail-close { display: none; }
|
|
81
|
+
|
|
82
|
+
/* ── Table of contents (scrollspy marks a.active) ────────────────────────── */
|
|
83
|
+
nav.toc ul { list-style: none; margin: 0; padding: 0; }
|
|
84
|
+
nav.toc li { margin: 0; }
|
|
85
|
+
nav.toc a {
|
|
86
|
+
display: block; padding: var(--sp-1) var(--sp-3); line-height: 1.35;
|
|
87
|
+
color: var(--text-muted); font-size: var(--text-sm);
|
|
88
|
+
text-decoration: none; border-left: 2px solid transparent;
|
|
89
|
+
border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
|
|
90
|
+
}
|
|
91
|
+
nav.toc a:hover { color: var(--text); background: var(--bg-hover); }
|
|
92
|
+
nav.toc a.active {
|
|
93
|
+
color: var(--accent); border-left-color: var(--accent);
|
|
94
|
+
background: var(--accent-glow); font-weight: var(--fw-medium);
|
|
95
|
+
}
|
|
96
|
+
nav.toc li.toc-3 a { padding-left: var(--sp-6); font-size: var(--text-xs); }
|
|
97
|
+
|
|
98
|
+
/* ── Prose typography ──────────────────────────────────────────────────────*/
|
|
99
|
+
.content h2 {
|
|
100
|
+
font-size: var(--text-xl); letter-spacing: var(--ls-tight);
|
|
101
|
+
margin: var(--sp-8) 0 var(--sp-3); padding-bottom: var(--sp-2);
|
|
102
|
+
border-bottom: 1px solid var(--border-light); scroll-margin-top: calc(var(--topbar-h) + var(--sp-3));
|
|
103
|
+
}
|
|
104
|
+
.content h3 {
|
|
105
|
+
font-size: var(--text-lg); margin: var(--sp-5) 0 var(--sp-2);
|
|
106
|
+
scroll-margin-top: calc(var(--topbar-h) + var(--sp-3));
|
|
107
|
+
}
|
|
108
|
+
.content p { margin: var(--sp-3) 0; line-height: var(--lh-relaxed); }
|
|
109
|
+
.content ul, .content ol { margin: var(--sp-3) 0; padding-left: var(--sp-6); }
|
|
110
|
+
.content li { margin: var(--sp-1) 0; line-height: var(--lh-relaxed); }
|
|
111
|
+
.content blockquote {
|
|
112
|
+
margin: var(--sp-3) 0; padding: var(--sp-1) var(--sp-4);
|
|
113
|
+
border-left: 3px solid var(--border); color: var(--text-muted);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/* ── Inline code + code blocks (chrome.ts wraps <pre> in .code + .copy-btn) ──*/
|
|
117
|
+
.content code {
|
|
118
|
+
font-family: var(--font-mono); font-size: 0.85em;
|
|
119
|
+
background: var(--bg-inset); padding: 0.12em 0.4em; border-radius: var(--radius-sm);
|
|
120
|
+
}
|
|
121
|
+
.content .code { position: relative; margin: var(--sp-3) 0; }
|
|
122
|
+
.content .code pre {
|
|
123
|
+
margin: 0; padding: var(--sp-3) var(--sp-4); overflow-x: auto;
|
|
124
|
+
background: var(--bg-inset); border: 1px solid var(--border-light);
|
|
125
|
+
border-radius: var(--radius-sm); font-family: var(--font-mono);
|
|
126
|
+
font-size: var(--text-sm); line-height: var(--lh-relaxed);
|
|
127
|
+
}
|
|
128
|
+
.content .code pre code { background: none; padding: 0; font-size: inherit; }
|
|
129
|
+
.copy-btn {
|
|
130
|
+
position: absolute; top: var(--sp-1); right: var(--sp-1);
|
|
131
|
+
background: var(--bg-card); border: 1px solid var(--border); color: var(--text-muted);
|
|
132
|
+
border-radius: var(--radius-sm); font-size: var(--text-xs); padding: var(--sp-1) var(--sp-2);
|
|
133
|
+
cursor: pointer; opacity: 0.85; font-family: inherit;
|
|
134
|
+
}
|
|
135
|
+
.copy-btn:hover { color: var(--accent); border-color: var(--accent); opacity: 1; }
|
|
136
|
+
|
|
137
|
+
/* ── Callouts ─ (border-color BEFORE border-left-color so the accent wins) ── */
|
|
138
|
+
.callout {
|
|
139
|
+
margin: var(--sp-4) 0; padding: var(--sp-3) var(--sp-4);
|
|
140
|
+
border: 1px solid var(--border); border-left-width: 3px;
|
|
141
|
+
border-radius: var(--radius-sm); background: var(--bg-card);
|
|
142
|
+
}
|
|
143
|
+
.callout > :first-child { margin-top: 0; }
|
|
144
|
+
.callout > :last-child { margin-bottom: 0; }
|
|
145
|
+
.callout-note, .callout-info { background: var(--blue-bg); border-color: var(--blue-border); border-left-color: var(--blue); }
|
|
146
|
+
.callout-tip { background: var(--green-bg); border-color: var(--green-border); border-left-color: var(--green); }
|
|
147
|
+
.callout-warning { background: var(--yellow-bg); border-color: var(--yellow-border); border-left-color: var(--yellow); }
|
|
148
|
+
.callout-danger { background: var(--red-bg); border-color: var(--red-border); border-left-color: var(--red); }
|
|
149
|
+
|
|
150
|
+
/* ── Severity chips (:sev) — tight pill, sub-scale vertical padding ───────── */
|
|
151
|
+
.sev {
|
|
152
|
+
display: inline-block; font-size: var(--text-xs); font-weight: var(--fw-semi);
|
|
153
|
+
padding: 1px var(--sp-2); border-radius: 999px; line-height: 1.5;
|
|
154
|
+
border: 1px solid var(--border); background: var(--bg-inset); color: var(--text-muted);
|
|
155
|
+
white-space: nowrap;
|
|
156
|
+
}
|
|
157
|
+
.sev-p0 { color: var(--sev-p0); border-color: var(--sev-p0); }
|
|
158
|
+
.sev-p1 { color: var(--sev-p1); border-color: var(--sev-p1); }
|
|
159
|
+
.sev-p2 { color: var(--sev-p2); border-color: var(--sev-p2); }
|
|
160
|
+
.sev-p3 { color: var(--sev-p3); border-color: var(--sev-p3); }
|
|
161
|
+
.sev-pass { color: var(--sev-pass); border-color: var(--sev-pass); }
|
|
162
|
+
|
|
163
|
+
/* ── Citations (:cite) — inline provenance refs ──────────────────────────── */
|
|
164
|
+
.fp, .cite-advisory {
|
|
165
|
+
font-family: var(--font-mono); font-size: 0.82em;
|
|
166
|
+
padding: 0.05em 0.35em; border-radius: var(--radius-sm);
|
|
167
|
+
background: var(--bg-inset); border: 1px solid var(--border-light);
|
|
168
|
+
}
|
|
169
|
+
.fp { color: var(--accent); }
|
|
170
|
+
.cite-advisory { color: var(--text-faint); border-style: dashed; }
|
|
171
|
+
|
|
172
|
+
/* ── Tables + filter-tables ──────────────────────────────────────────────── */
|
|
173
|
+
.content table { width: 100%; border-collapse: collapse; margin: var(--sp-3) 0; font-size: var(--text-sm); }
|
|
174
|
+
.content th, .content td { text-align: left; padding: var(--sp-2) var(--sp-3); border-bottom: 1px solid var(--border-light); vertical-align: top; }
|
|
175
|
+
.content th {
|
|
176
|
+
color: var(--text-muted); font-weight: var(--fw-semi); font-size: var(--text-xs);
|
|
177
|
+
text-transform: uppercase; letter-spacing: var(--ls-wide); border-bottom-color: var(--border);
|
|
178
|
+
}
|
|
179
|
+
.content tbody tr:hover { background: var(--bg-hover); }
|
|
180
|
+
.content td code { white-space: nowrap; }
|
|
181
|
+
.filter-table { margin: var(--sp-4) 0; }
|
|
182
|
+
.filter-input {
|
|
183
|
+
width: 100%; max-width: 320px; margin-bottom: var(--sp-2);
|
|
184
|
+
padding: var(--sp-2) var(--sp-3); font-family: inherit; font-size: var(--text-sm);
|
|
185
|
+
color: var(--text); background: var(--bg-card);
|
|
186
|
+
border: 1px solid var(--border); border-radius: var(--radius-sm);
|
|
187
|
+
}
|
|
188
|
+
.filter-input:focus { border-color: var(--accent); }
|
|
189
|
+
|
|
190
|
+
/* ── Charts (:::chart) — label + proportional bar (fill carries inline width%) */
|
|
191
|
+
.chart-block { margin: var(--sp-4) 0; }
|
|
192
|
+
.chart-row {
|
|
193
|
+
display: grid; grid-template-columns: minmax(var(--chart-label-w), 24%) 1fr;
|
|
194
|
+
align-items: center; gap: var(--sp-3); margin: var(--sp-1) 0;
|
|
195
|
+
}
|
|
196
|
+
.chart-label {
|
|
197
|
+
font-size: var(--text-sm); color: var(--text-muted); text-align: right;
|
|
198
|
+
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
|
|
199
|
+
}
|
|
200
|
+
.chart-row .chart-bar {
|
|
201
|
+
height: 0.9em; min-width: 2px; background: var(--accent);
|
|
202
|
+
border-radius: var(--radius-sm);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/* ── Tabs (::::tabs / :::tab) ─────────────────────────────────────────────── */
|
|
206
|
+
.tabs { margin: var(--sp-4) 0; }
|
|
207
|
+
.tablist { display: flex; flex-wrap: wrap; gap: var(--sp-1); border-bottom: 1px solid var(--border); margin-bottom: var(--sp-3); }
|
|
208
|
+
.tab-btn {
|
|
209
|
+
background: none; border: none; border-bottom: 2px solid transparent; margin-bottom: -1px;
|
|
210
|
+
padding: var(--sp-2) var(--sp-3); color: var(--text-muted);
|
|
211
|
+
font-family: inherit; font-size: var(--text-sm); font-weight: var(--fw-medium); cursor: pointer;
|
|
212
|
+
}
|
|
213
|
+
.tab-btn:hover { color: var(--text); }
|
|
214
|
+
.tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); }
|
|
215
|
+
.tabpane { display: none; }
|
|
216
|
+
.tabpane.active { display: block; }
|
|
217
|
+
|
|
218
|
+
/* ── Mermaid diagrams ────────────────────────────────────────────────────── */
|
|
219
|
+
.content figure { margin: var(--sp-4) 0; text-align: center; }
|
|
220
|
+
.content figure svg, .content > svg, .content .mermaid svg { max-width: 100%; height: auto; }
|
|
221
|
+
|
|
222
|
+
/* ── Index page: category card grid ──────────────────────────────────────── */
|
|
223
|
+
.content .lead { color: var(--text-muted); font-size: var(--text-base); max-width: 60ch; margin-top: var(--sp-2); }
|
|
224
|
+
.guide-cards {
|
|
225
|
+
display: grid; grid-template-columns: repeat(auto-fill, minmax(min(var(--card-min), 100%), 1fr));
|
|
226
|
+
gap: var(--sp-4); margin: var(--sp-4) 0 var(--sp-6);
|
|
227
|
+
}
|
|
228
|
+
.guide-card {
|
|
229
|
+
display: flex; flex-direction: column; gap: var(--sp-2);
|
|
230
|
+
padding: var(--sp-4); background: var(--bg-card);
|
|
231
|
+
border: 1px solid var(--border); border-radius: var(--radius);
|
|
232
|
+
color: inherit; text-decoration: none;
|
|
233
|
+
transition: border-color 0.15s ease, box-shadow 0.15s ease;
|
|
234
|
+
}
|
|
235
|
+
.guide-card:hover { border-color: var(--accent); box-shadow: var(--shadow-md); text-decoration: none; }
|
|
236
|
+
.guide-card-title { font-weight: var(--fw-semi); color: var(--accent); font-size: var(--text-base); }
|
|
237
|
+
.guide-card-desc { color: var(--text-muted); font-size: var(--text-sm); line-height: var(--lh-normal); }
|
|
238
|
+
|
|
239
|
+
/* ── Responsive: TOC becomes an off-canvas drawer (chrome.ts toggles .open) ──*/
|
|
240
|
+
/* 860px is literal — media queries cannot read custom properties. Revisit it if
|
|
241
|
+
--topbar-h / --rail-w / --drawer-w change (the drawer sticky offsets key off them). */
|
|
242
|
+
@media (max-width: 860px) {
|
|
243
|
+
.nav-toggle { display: inline-flex; align-items: center; }
|
|
244
|
+
.layout { grid-template-columns: 1fr; gap: 0; }
|
|
245
|
+
.rail {
|
|
246
|
+
position: fixed; top: var(--topbar-h); left: 0; bottom: 0; width: var(--drawer-w); z-index: 50;
|
|
247
|
+
height: auto; background: var(--bg-card); border-right: 1px solid var(--border);
|
|
248
|
+
padding: var(--sp-4); box-shadow: var(--shadow-lg);
|
|
249
|
+
transform: translateX(-100%); transition: transform 0.2s ease, visibility 0.2s ease;
|
|
250
|
+
/* Closed drawer is off-screen AND removed from tab order / pointer events. */
|
|
251
|
+
visibility: hidden; pointer-events: none;
|
|
252
|
+
}
|
|
253
|
+
.rail.open { transform: translateX(0); visibility: visible; pointer-events: auto; }
|
|
254
|
+
.rail-close {
|
|
255
|
+
display: block; margin-left: auto; margin-bottom: var(--sp-2);
|
|
256
|
+
background: var(--bg-card); border: 1px solid var(--border); color: var(--text);
|
|
257
|
+
border-radius: var(--radius-sm); padding: var(--sp-1) var(--sp-3); font-size: var(--text-base);
|
|
258
|
+
line-height: 1; cursor: pointer; font-family: inherit;
|
|
259
|
+
}
|
|
260
|
+
.rail-close:hover { background: var(--bg-hover); border-color: var(--accent); }
|
|
261
|
+
.rail-close:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
262
|
+
.rail-backdrop {
|
|
263
|
+
display: block; position: fixed; inset: var(--topbar-h) 0 0 0;
|
|
264
|
+
background: var(--scrim); z-index: 49;
|
|
265
|
+
opacity: 0; pointer-events: none; transition: opacity 0.2s ease;
|
|
266
|
+
}
|
|
267
|
+
.rail.open ~ .rail-backdrop { opacity: 1; pointer-events: auto; }
|
|
268
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-page.d.ts","sourceRoot":"","sources":["../../src/guides/index-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index-page.d.ts","sourceRoot":"","sources":["../../src/guides/index-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAkB5C,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAsC1E"}
|
|
@@ -1,14 +1,47 @@
|
|
|
1
1
|
import { wrapInChrome, esc } from './template.js';
|
|
2
|
+
const CATEGORY_ORDER = ['concepts', 'reference', 'workflows', 'tools'];
|
|
3
|
+
const CATEGORY_LABEL = {
|
|
4
|
+
concepts: 'Concepts',
|
|
5
|
+
reference: 'Reference',
|
|
6
|
+
workflows: 'Workflows',
|
|
7
|
+
tools: 'Tools',
|
|
8
|
+
};
|
|
9
|
+
function catLabel(c) {
|
|
10
|
+
return CATEGORY_LABEL[c] ?? c.charAt(0).toUpperCase() + c.slice(1);
|
|
11
|
+
}
|
|
12
|
+
function catId(c) {
|
|
13
|
+
return 'cat-' + c.toLowerCase().replace(/[^a-z0-9]+/g, '-');
|
|
14
|
+
}
|
|
2
15
|
export function renderIndexPage(entries, css) {
|
|
3
16
|
const sorted = [...entries].sort((a, b) => a.frontmatter.order - b.frontmatter.order);
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
17
|
+
// Group by category, preserving order within each group.
|
|
18
|
+
const byCat = new Map();
|
|
19
|
+
for (const e of sorted) {
|
|
20
|
+
const c = e.frontmatter.category;
|
|
21
|
+
if (!byCat.has(c))
|
|
22
|
+
byCat.set(c, []);
|
|
23
|
+
byCat.get(c).push(e);
|
|
24
|
+
}
|
|
25
|
+
const cats = [...byCat.keys()].sort((a, b) => {
|
|
26
|
+
const ia = CATEGORY_ORDER.indexOf(a);
|
|
27
|
+
const ib = CATEGORY_ORDER.indexOf(b);
|
|
28
|
+
return (ia < 0 ? 99 : ia) - (ib < 0 ? 99 : ib);
|
|
12
29
|
});
|
|
30
|
+
const headings = cats.map((c) => ({ depth: 2, text: catLabel(c), id: catId(c) }));
|
|
31
|
+
const sections = cats
|
|
32
|
+
.map((c) => {
|
|
33
|
+
const cards = byCat
|
|
34
|
+
.get(c)
|
|
35
|
+
.map((e) => `<a class="guide-card" href="${e.topic}/index.html">` +
|
|
36
|
+
`<span class="guide-card-title">${esc(e.frontmatter.title)}</span>` +
|
|
37
|
+
`<span class="guide-card-desc">${esc(e.frontmatter.description)}</span></a>`)
|
|
38
|
+
.join('');
|
|
39
|
+
return `<h2 id="${catId(c)}">${esc(catLabel(c))}</h2><div class="guide-cards">${cards}</div>`;
|
|
40
|
+
})
|
|
41
|
+
.join('');
|
|
42
|
+
const intro = '<p class="lead">Reference guides for Scaffold — human- and agent-readable. ' +
|
|
43
|
+
'Open a guide to read it in your browser; agents read the markdown source with ' +
|
|
44
|
+
'<code>scaffold guides <topic> --markdown</code>.</p>';
|
|
45
|
+
return wrapInChrome({ title: 'Scaffold Guides', body: intro + sections, headings, css });
|
|
13
46
|
}
|
|
14
47
|
//# sourceMappingURL=index-page.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-page.js","sourceRoot":"","sources":["../../src/guides/index-page.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AAEjD,MAAM,UAAU,eAAe,CAAC,OAAqB,EAAE,GAAW;IAChE,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"index-page.js","sourceRoot":"","sources":["../../src/guides/index-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Return the targets of relative links/images/reference-definitions in
|
|
3
|
+
* `markdown` that do not resolve on disk relative to `guideDir`.
|
|
4
|
+
*
|
|
5
|
+
* Parses the markdown body (frontmatter stripped) to an mdast and inspects only
|
|
6
|
+
* `link`, `image`, and `definition` nodes, so link-like text in code blocks,
|
|
7
|
+
* inline code, or frontmatter is never flagged, and reference-style links are
|
|
8
|
+
* covered. External URLs (`http:`, `mailto:`, …), protocol-relative (`//`), and
|
|
9
|
+
* pure anchors (`#…`) are ignored. A trailing `#anchor` is stripped and the
|
|
10
|
+
* target is percent-decoded before resolving. A `…/index.html` link is accepted
|
|
11
|
+
* when the `index.md` source exists (the HTML may not be built yet, e.g. a stub).
|
|
12
|
+
*/
|
|
13
|
+
export declare function findBrokenRelativeLinks(markdown: string, guideDir: string): string[];
|
|
14
|
+
//# sourceMappingURL=links.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/guides/links.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAgCpF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { unified } from 'unified';
|
|
4
|
+
import remarkParse from 'remark-parse';
|
|
5
|
+
import remarkGfm from 'remark-gfm';
|
|
6
|
+
import { visit } from 'unist-util-visit';
|
|
7
|
+
import { stripFrontmatter } from './render.js';
|
|
8
|
+
/**
|
|
9
|
+
* Return the targets of relative links/images/reference-definitions in
|
|
10
|
+
* `markdown` that do not resolve on disk relative to `guideDir`.
|
|
11
|
+
*
|
|
12
|
+
* Parses the markdown body (frontmatter stripped) to an mdast and inspects only
|
|
13
|
+
* `link`, `image`, and `definition` nodes, so link-like text in code blocks,
|
|
14
|
+
* inline code, or frontmatter is never flagged, and reference-style links are
|
|
15
|
+
* covered. External URLs (`http:`, `mailto:`, …), protocol-relative (`//`), and
|
|
16
|
+
* pure anchors (`#…`) are ignored. A trailing `#anchor` is stripped and the
|
|
17
|
+
* target is percent-decoded before resolving. A `…/index.html` link is accepted
|
|
18
|
+
* when the `index.md` source exists (the HTML may not be built yet, e.g. a stub).
|
|
19
|
+
*/
|
|
20
|
+
export function findBrokenRelativeLinks(markdown, guideDir) {
|
|
21
|
+
const tree = unified().use(remarkParse).use(remarkGfm).parse(stripFrontmatter(markdown));
|
|
22
|
+
const urls = [];
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
|
+
visit(tree, (node) => {
|
|
25
|
+
if ((node.type === 'link' || node.type === 'image' || node.type === 'definition') &&
|
|
26
|
+
typeof node.url === 'string') {
|
|
27
|
+
urls.push(node.url);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
const broken = [];
|
|
31
|
+
for (const raw of urls) {
|
|
32
|
+
const trimmed = raw.trim();
|
|
33
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed))
|
|
34
|
+
continue; // http:, https:, mailto:, …
|
|
35
|
+
if (trimmed.startsWith('#') || trimmed.startsWith('//'))
|
|
36
|
+
continue;
|
|
37
|
+
const target = trimmed.split('#')[0];
|
|
38
|
+
if (!target)
|
|
39
|
+
continue;
|
|
40
|
+
let decoded;
|
|
41
|
+
try {
|
|
42
|
+
decoded = decodeURIComponent(target);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
decoded = target;
|
|
46
|
+
}
|
|
47
|
+
const abs = path.resolve(guideDir, decoded);
|
|
48
|
+
if (fs.existsSync(abs))
|
|
49
|
+
continue;
|
|
50
|
+
if (decoded.endsWith('index.html') && fs.existsSync(abs.replace(/index\.html$/, 'index.md')))
|
|
51
|
+
continue;
|
|
52
|
+
broken.push(raw);
|
|
53
|
+
}
|
|
54
|
+
return broken;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/guides/links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,WAAW,MAAM,cAAc,CAAA;AACtC,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAgB,EAAE,QAAgB;IACxE,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAA;IACxF,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,8DAA8D;IAC9D,KAAK,CAAC,IAAI,EAAE,CAAC,IAAS,EAAE,EAAE;QACxB,IACE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;YAC7E,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAC5B,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;QAC1B,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,SAAQ,CAAC,4BAA4B;QAC/E,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAQ;QACjE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACpC,IAAI,CAAC,MAAM;YAAE,SAAQ;QACrB,IAAI,OAAe,CAAA;QACnB,IAAI,CAAC;YACH,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,MAAM,CAAA;QAClB,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QAChC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;YAAE,SAAQ;QACtG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.test.d.ts","sourceRoot":"","sources":["../../src/guides/links.test.ts"],"names":[],"mappings":""}
|