@zigrivers/scaffold 3.30.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 +8 -5
- package/content/guides/cli/index.html +367 -14
- package/content/guides/concepts/index.html +367 -14
- package/content/guides/dashboard/index.html +367 -14
- package/content/guides/index.html +368 -15
- package/content/guides/install/index.html +373 -20
- package/content/guides/install/index.md +6 -6
- package/content/guides/knowledge/index.html +367 -14
- package/content/guides/knowledge-freshness/index.html +369 -16
- package/content/guides/knowledge-freshness/index.md +2 -2
- package/content/guides/mmr/index.html +373 -20
- package/content/guides/multi-agent/index.html +369 -16
- package/content/guides/multi-agent/index.md +2 -2
- package/content/guides/observability/index.html +367 -14
- package/content/guides/pipeline/index.html +378 -37
- package/content/guides/pipeline/index.md +8 -8
- package/content/guides/review-workflow/index.html +367 -14
- package/dist/guides/build.d.ts +1 -1
- package/dist/guides/build.d.ts.map +1 -1
- package/dist/guides/build.js +14 -7
- package/dist/guides/build.js.map +1 -1
- package/dist/guides/build.test.js +39 -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-tabs.test.js +47 -0
- package/dist/guides/directives-tabs.test.js.map +1 -1
- package/dist/guides/directives.d.ts.map +1 -1
- package/dist/guides/directives.js +14 -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/sanitize.d.ts.map +1 -1
- package/dist/guides/sanitize.js +4 -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
package/dist/guides/chrome.js
CHANGED
|
@@ -39,12 +39,69 @@ export const CHROME_JS = /* js */ `(function(){
|
|
|
39
39
|
});
|
|
40
40
|
});
|
|
41
41
|
|
|
42
|
-
// ─── Mobile nav
|
|
42
|
+
// ─── Mobile nav (drawer + backdrop; aria-expanded + Escape-to-close) ──────
|
|
43
|
+
function setNav(open) {
|
|
44
|
+
var rail = document.querySelector('.rail');
|
|
45
|
+
if (rail) rail.classList.toggle('open', open);
|
|
46
|
+
var toggle = document.querySelector('.nav-toggle');
|
|
47
|
+
if (toggle) toggle.setAttribute('aria-expanded', open ? 'true' : 'false');
|
|
48
|
+
// Modal-drawer focus containment: while open, make the page content inert
|
|
49
|
+
// (out of tab order + a11y tree) and move focus into the drawer; on close,
|
|
50
|
+
// restore content and return focus to the toggle.
|
|
51
|
+
var main = document.querySelector('.content');
|
|
52
|
+
if (main) main.inert = open;
|
|
53
|
+
if (open) {
|
|
54
|
+
var first = rail && rail.querySelector('a, button, [tabindex]:not([tabindex="-1"])');
|
|
55
|
+
if (first) first.focus();
|
|
56
|
+
else if (rail) { rail.setAttribute('tabindex', '-1'); rail.focus(); }
|
|
57
|
+
} else if (toggle) {
|
|
58
|
+
toggle.focus();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// If the viewport grows past the mobile breakpoint while the drawer is open,
|
|
62
|
+
// the rail becomes the desktop sidebar and the toggle hides — clear the open
|
|
63
|
+
// state so .content doesn't stay inert with no way to close it.
|
|
64
|
+
if (window.matchMedia) {
|
|
65
|
+
var mq = window.matchMedia('(max-width: 860px)');
|
|
66
|
+
var onMq = function() {
|
|
67
|
+
if (mq.matches) return;
|
|
68
|
+
var rail = document.querySelector('.rail');
|
|
69
|
+
if (rail) rail.classList.remove('open');
|
|
70
|
+
var toggle = document.querySelector('.nav-toggle');
|
|
71
|
+
if (toggle) toggle.setAttribute('aria-expanded', 'false');
|
|
72
|
+
var main = document.querySelector('.content');
|
|
73
|
+
if (main) main.inert = false;
|
|
74
|
+
};
|
|
75
|
+
if (mq.addEventListener) mq.addEventListener('change', onMq);
|
|
76
|
+
else if (mq.addListener) mq.addListener(onMq);
|
|
77
|
+
}
|
|
43
78
|
document.querySelectorAll('[data-action="nav"]').forEach(function(btn) {
|
|
44
79
|
btn.addEventListener('click', function() {
|
|
45
80
|
var rail = document.querySelector('.rail');
|
|
46
|
-
|
|
81
|
+
setNav(!(rail && rail.classList.contains('open')));
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
// Selecting a TOC link closes the drawer (so the now-active content isn't
|
|
85
|
+
// left inert behind the panel) before the anchor navigation scrolls.
|
|
86
|
+
var drawerRail = document.querySelector('.rail');
|
|
87
|
+
if (drawerRail) {
|
|
88
|
+
drawerRail.querySelectorAll('a').forEach(function(a) {
|
|
89
|
+
a.addEventListener('click', function() {
|
|
90
|
+
if (drawerRail.classList.contains('open')) setNav(false);
|
|
91
|
+
});
|
|
47
92
|
});
|
|
93
|
+
}
|
|
94
|
+
document.addEventListener('keydown', function(e) {
|
|
95
|
+
var rail = document.querySelector('.rail');
|
|
96
|
+
if (!rail || !rail.classList.contains('open')) return;
|
|
97
|
+
if (e.key === 'Escape') { setNav(false); return; } // setNav restores focus to the toggle
|
|
98
|
+
// Trap Tab within the open drawer (modal pattern).
|
|
99
|
+
if (e.key !== 'Tab') return;
|
|
100
|
+
var f = rail.querySelectorAll('a[href], button, [tabindex]:not([tabindex="-1"])');
|
|
101
|
+
if (!f.length) return;
|
|
102
|
+
var first = f[0], last = f[f.length - 1];
|
|
103
|
+
if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); }
|
|
104
|
+
else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); }
|
|
48
105
|
});
|
|
49
106
|
|
|
50
107
|
// ─── Copy buttons ─────────────────────────────────────────────────────────
|
|
@@ -71,17 +128,31 @@ export const CHROME_JS = /* js */ `(function(){
|
|
|
71
128
|
wrapper.insertBefore(btn, pre);
|
|
72
129
|
});
|
|
73
130
|
|
|
74
|
-
// ─── Tabs
|
|
131
|
+
// ─── Tabs (ARIA pattern: aria-selected + roving tabindex + arrow keys) ────
|
|
132
|
+
function activateTab(group, btn, focus) {
|
|
133
|
+
var idx = btn.getAttribute('data-tab');
|
|
134
|
+
group.querySelectorAll('.tab-btn').forEach(function(b) {
|
|
135
|
+
var on = b === btn;
|
|
136
|
+
b.classList.toggle('active', on);
|
|
137
|
+
b.setAttribute('aria-selected', on ? 'true' : 'false');
|
|
138
|
+
b.setAttribute('tabindex', on ? '0' : '-1');
|
|
139
|
+
});
|
|
140
|
+
group.querySelectorAll('.tabpane').forEach(function(pane) {
|
|
141
|
+
pane.classList.toggle('active', pane.getAttribute('data-tab') === idx);
|
|
142
|
+
});
|
|
143
|
+
if (focus) btn.focus();
|
|
144
|
+
}
|
|
75
145
|
document.querySelectorAll('.tabs').forEach(function(group) {
|
|
76
|
-
group.querySelectorAll('.tab-btn')
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
146
|
+
var btns = [].slice.call(group.querySelectorAll('.tab-btn'));
|
|
147
|
+
btns.forEach(function(btn, i) {
|
|
148
|
+
btn.addEventListener('click', function() { activateTab(group, btn, false); });
|
|
149
|
+
btn.addEventListener('keydown', function(e) {
|
|
150
|
+
var ni = -1;
|
|
151
|
+
if (e.key === 'ArrowRight' || e.key === 'ArrowDown') ni = (i + 1) % btns.length;
|
|
152
|
+
else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') ni = (i - 1 + btns.length) % btns.length;
|
|
153
|
+
else if (e.key === 'Home') ni = 0;
|
|
154
|
+
else if (e.key === 'End') ni = btns.length - 1;
|
|
155
|
+
if (ni >= 0) { e.preventDefault(); activateTab(group, btns[ni], true); }
|
|
85
156
|
});
|
|
86
157
|
});
|
|
87
158
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../src/guides/chrome.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GACxB,8DAA8D;IAC9D,4FAA4F;IAC5F,+EAA+E,CAAA;AAEjF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,SAAS,GAAW,QAAQ,CAAC
|
|
1
|
+
{"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../src/guides/chrome.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GACxB,8DAA8D;IAC9D,4FAA4F;IAC5F,+EAA+E,CAAA;AAEjF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,SAAS,GAAW,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmKpC,CAAA"}
|
|
@@ -41,9 +41,13 @@
|
|
|
41
41
|
--yellow: #d97706;
|
|
42
42
|
--yellow-bg: #fffbeb;
|
|
43
43
|
--yellow-border:#fde68a;
|
|
44
|
+
--red: #dc2626;
|
|
45
|
+
--red-bg: #fef2f2;
|
|
46
|
+
--red-border: #fecaca;
|
|
44
47
|
--gray: #9ca3af;
|
|
45
48
|
--gray-bg: #f3f4f6;
|
|
46
49
|
--gray-border: #e5e7eb;
|
|
50
|
+
--scrim: rgba(15, 17, 23, 0.45);
|
|
47
51
|
|
|
48
52
|
/* Semantic: Next Banner */
|
|
49
53
|
--next-bg: #eef2ff;
|
|
@@ -126,9 +130,13 @@
|
|
|
126
130
|
--yellow: #fbbf24;
|
|
127
131
|
--yellow-bg: rgba(120, 53, 15, 0.25);
|
|
128
132
|
--yellow-border:rgba(251, 191, 36, 0.20);
|
|
133
|
+
--red: #f87171;
|
|
134
|
+
--red-bg: rgba(127, 29, 29, 0.25);
|
|
135
|
+
--red-border: rgba(248, 113, 113, 0.22);
|
|
129
136
|
--gray: #6b7294;
|
|
130
137
|
--gray-bg: #252940;
|
|
131
138
|
--gray-border: #363c58;
|
|
139
|
+
--scrim: rgba(0, 0, 0, 0.6);
|
|
132
140
|
|
|
133
141
|
/* Semantic: Next Banner */
|
|
134
142
|
--next-bg: rgba(30, 27, 75, 0.50);
|
|
@@ -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":"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"}
|
|
@@ -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 ?? {};
|
|
@@ -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
|