@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.
Files changed (43) hide show
  1. package/content/guides/AUTHORING.md +8 -5
  2. package/content/guides/cli/index.html +367 -14
  3. package/content/guides/concepts/index.html +367 -14
  4. package/content/guides/dashboard/index.html +367 -14
  5. package/content/guides/index.html +368 -15
  6. package/content/guides/install/index.html +373 -20
  7. package/content/guides/install/index.md +6 -6
  8. package/content/guides/knowledge/index.html +367 -14
  9. package/content/guides/knowledge-freshness/index.html +369 -16
  10. package/content/guides/knowledge-freshness/index.md +2 -2
  11. package/content/guides/mmr/index.html +373 -20
  12. package/content/guides/multi-agent/index.html +369 -16
  13. package/content/guides/multi-agent/index.md +2 -2
  14. package/content/guides/observability/index.html +367 -14
  15. package/content/guides/pipeline/index.html +378 -37
  16. package/content/guides/pipeline/index.md +8 -8
  17. package/content/guides/review-workflow/index.html +367 -14
  18. package/dist/guides/build.d.ts +1 -1
  19. package/dist/guides/build.d.ts.map +1 -1
  20. package/dist/guides/build.js +14 -7
  21. package/dist/guides/build.js.map +1 -1
  22. package/dist/guides/build.test.js +39 -0
  23. package/dist/guides/build.test.js.map +1 -1
  24. package/dist/guides/chrome.d.ts.map +1 -1
  25. package/dist/guides/chrome.js +83 -12
  26. package/dist/guides/chrome.js.map +1 -1
  27. package/dist/guides/dashboard-theme.css +8 -0
  28. package/dist/guides/directives-tabs.test.js +47 -0
  29. package/dist/guides/directives-tabs.test.js.map +1 -1
  30. package/dist/guides/directives.d.ts.map +1 -1
  31. package/dist/guides/directives.js +14 -0
  32. package/dist/guides/directives.js.map +1 -1
  33. package/dist/guides/guides.css +268 -0
  34. package/dist/guides/index-page.d.ts.map +1 -1
  35. package/dist/guides/index-page.js +41 -8
  36. package/dist/guides/index-page.js.map +1 -1
  37. package/dist/guides/sanitize.d.ts.map +1 -1
  38. package/dist/guides/sanitize.js +4 -0
  39. package/dist/guides/sanitize.js.map +1 -1
  40. package/dist/guides/template.d.ts.map +1 -1
  41. package/dist/guides/template.js +7 -2
  42. package/dist/guides/template.js.map +1 -1
  43. package/package.json +2 -2
@@ -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
- if (rail) rail.classList.toggle('open');
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').forEach(function(btn) {
77
- btn.addEventListener('click', function() {
78
- var idx = btn.getAttribute('data-tab');
79
- group.querySelectorAll('.tab-btn').forEach(function(b) {
80
- b.classList.toggle('active', b === btn);
81
- });
82
- group.querySelectorAll('.tabpane').forEach(function(pane) {
83
- pane.classList.toggle('active', pane.getAttribute('data-tab') === idx);
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA4FpC,CAAA"}
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,SA+CxB,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"}
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":"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"}
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;AAG5C,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAa1E"}
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
- const items = sorted.map((e) => `<li><a href="${e.topic}/index.html"><strong>${esc(e.frontmatter.title)}</strong></a>` +
5
- `<span class="cat">${esc(e.frontmatter.category)}</span>` +
6
- `<p>${esc(e.frontmatter.description)}</p></li>`).join('');
7
- return wrapInChrome({
8
- title: 'Scaffold Guides',
9
- body: `<h2 id="guides">Guides</h2><ul class="guide-index">${items}</ul>`,
10
- headings: [{ depth: 2, text: 'Guides', id: 'guides' }],
11
- css,
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 &lt;topic&gt; --markdown</code>.</p>';
45
+ return wrapInChrome({ title: 'Scaffold Guides', body: intro + sections, headings, css });
13
46
  }
14
47
  //# sourceMappingURL=index-page.js.map