// HTML-first activity-report template — the print-ready layout that the hub's // "Download PDF" button renders to a PDF (OPL-2598). It is the editorial, // paper-styled counterpart to the on-screen report on `/reports`, driven by the // SAME `ActivityReport` view model (`buildActivityReport` / the `generateReport` // capability), so the document a user downloads reflects exactly what they saw. // // Authored to feed the shared HTML -> PDF pipeline (`@scribe.cool/core/pdf`) // without modification: it carries its own scoped, print-ready CSS (`@page`, // break-inside protection, orphan/widow control) under `.scribe-report`. // // Design language: this is Scribe's OWN visual identity in print, not a // generic editorial document — Geist Mono (the app's universal face) with // Geist Pixel Square for the masthead only, the light-mode ink/paper/border // palette, the cyan hue-195 accent, and the app's "bracket corner tick" panel // aesthetic (four small corner ticks, never a full border box). Fonts are // embedded as base64 woff2 (`./report-fonts`, generated from the `geist` npm // package) since the serverless Chromium PDF render has no installed fonts // and no network access — everything must be self-contained. // // Design rules (mirroring the vetted invoice templates): // - NEVER hardcode brand colors inline. Every color is a `--rep-*` CSS // variable. User/org-chosen colors come from `ReportTemplateConfig`; the // neutral paper/ink/border palette has its single source of truth in // `reportConfigToCssVars`. The template references `var(--rep-*)` only, // except for the untrusted per-project color (sanitized at the render // boundary — see `sanitizeHexColor`) and font data URIs (build-time // constants, not user input). // - All report content (project names, highlights, labels, company name) is // rendered as React-escaped children — never interpolated into raw HTML or // the ` {children} ); } // ── Template ─────────────────────────────────────────────── /** * The print-ready activity report. Consumes the framework-free `ActivityReport` * view model. Every user/report value (project names, highlights, labels, * device names, company name) is a React-escaped child, and every color is a * `--rep-*` CSS variable, so untrusted content can never break out of the * markup or the `