Decisions (D1–D13)
The scaffold was designed, then peer-reviewed by a five-lens panel (design systems, data publishing, platform/DevEx, red-team, author/reader). These are the decisions that survived, each with the file that implements it. Full ADRs are in docs/decisions/ in the repository.
| ID | Decision | Where |
|---|---|---|
| D1 | Render PatternFly React server-side in Astro, no client:* directive; no hand-written wrappers over PF markup | astro.config.mjs (vite.resolve.noExternal), any .astro importing @patternfly/react-core |
| D2 | Baseline Astro 7 · Starlight 0.41 · Vite 8 · Node 22.12 · static Worker assets, no adapter; unified processor for remark/rehype | pnpm-workspace.yaml catalog, astro.config.mjs (markdown.processor: unified()), wrangler.jsonc |
| D3 | base-min.css: the ~20 lines PF components rely on, without patternfly-base.css | packages/theme/src/base-min.css |
| D4 | Compile PF token Sass mixins for light + [data-theme=dark]; bridge Starlight with ~15 semantic slots + a gray ramp | packages/theme/src/tokens.scss, starlight-bridge.css |
| D5 | Editorial layer = PF type-token overrides on long-form surfaces + primitives PF lacks (measure, display sizes, figure/caption/footnote, print) | packages/theme/src/editorial.css, print.css |
| D6 | Reports in their own ReportLayout outside Starlight, sharing chrome; data-pagefind-body for search | apps/site/src/layouts/ReportLayout.astro |
| D7 | Own thin ECharts theme from PatternFly chart-token values (validated palette); @patternfly/react-charts banned | packages/charts/src/theme.ts, design/allowlist.json |
| D8 | SSR chart contract: animation off, dispose, real text metrics if @napi-rs/canvas is present, mark cap, a11y in <Figure> + data table + downloads | packages/charts/src/ssr.ts, Chart.astro |
| D9 | Content Layer for bundle manifests only; rows via build-time loaders with hash cache; > 25 MiB on R2 | apps/site/src/content.config.ts, apps/site/data/loaders |
| D10 | One repo, workspace:* packages, one PatternFly version via catalog:; allowlist enforced by pnpm check; chrome is .astro + one tiny script | pnpm-workspace.yaml, eslint.config.js, scripts/check-classes.mjs, packages/chrome |
| D11 | Two audiences from one repo: pnpm build = public, CSDR_AUDIENCE=internal = public + src/content/internal + private bundles, deployed as separate Workers; location decides, the internal site is labelled everywhere and gated from deploy/audience.json (amended 2026-08-18) | src/lib/audience.ts, integrations/audience.mjs, worker/internal.ts, scripts/check-audience.mjs, docs/decisions/D11 |
| D12 | PDF and self-contained HTML exports written by pnpm build; page furniture (cover, contents, running head/foot, watermark) is CSS @page on tokens; Chromium prints, pdf-lib stamps metadata; DOCX replaced by the HTML export | packages/theme/src/print.css, scripts/build-pdf.mjs, scripts/export-html.mjs, apps/site/integrations/exports.mjs |
| D13 | Modular colour palettes (default · landscape · goap): one JSON per palette generates the PatternFly palette layer + brand/role tokens and the chart values; check:palette gates contrast, CVD and drift; selected by data-palette (site env, report frontmatter, page prop) | packages/theme/palettes/, scripts/palette-build.mjs, /design/palette |