/*! trentpower.fr · authored source */ /* trentpower.fr print stylesheet Role: prints a one-page executive profile from the dedicated .print-profile block. loaded only at print time via media="print". Constraints: - hide the live interface - keep the profile to one a4 page - browser headers and footers are controlled by the print dialogue */ /*! Cascade-layer: every @media print block lives inside @layer print-overrides. the 367+ !important declarations in this file exist because @media print has to re-author the world for paper; the layer wrapper documents that intent and lets the architecture validator enforce the contract. */ @layer print-overrides; @layer print-overrides { @page { size: A4; margin: 11mm 12mm 11mm 12mm; } @media print { /* ─────────────────────────────────────────────────────────── defensive baseline. Re-authors the print intent inside @media print on top of every other rule, anchored against cascade-layer interactions between the screen `@layer overrides` (which sets `display: none !important` on `.print-only` and friends) and this `@layer print-overrides`. the baseline does not un-hide `main`, `.site`, `article`, or `.home-profile`; the homepage's print-profile model owns those decisions below. ios safari has historically composed these layers unevenly; the explicit `display: revert` guarantees the print containers always become visible. ─────────────────────────────────────────────────────────── */ html, body { background: #fff !important; color: #1F1E1C !important; width: auto !important; /* One-page constraint. the @page rule above defines a4 with 11mm × 12mm margins, leaving a printable area of (297-22) = 275mm tall. capping body to that exact height with overflow:hidden guarantees no spill from .print-profile / .print-trust-sheet / .print-utility-sheet (each 252mm) can ever generate a second page — even on ios safari, which was inserting a sliver second page despite each .print-X-sheet's own `overflow: hidden`. */ height: calc(297mm - 22mm) !important; max-height: calc(297mm - 22mm) !important; overflow: hidden !important; } /* new screen-only wrappers added in the semantic refactor — none should print on any page. `.site-header` was the culprit for the blank-page regression; the rest are defensive. */ .site-header, .modal-overlay, .skip-link, script, noscript { display: none !important; } /* make print containers visible regardless of layer interactions. each container is opt-in: pages without that container are unaffected. `display: revert` returns to the user-agent default (`block` for sections); a more specific rule below overrides to `grid` where the print profile needs CSS-grid layout. */ .print-only, .print-profile, .print-trust-sheet, .print-utility-sheet, .print-section, .print-trajectory, .print-project, .print-architecture-strip, .page-title, .page-body { display: revert !important; visibility: visible !important; opacity: 1 !important; } /* homepage. print only the dedicated profile. data-page="home" is set on both and ; the direct-child rule suppresses everything else under , so the screen layout, nav, modal and footer do not print. */ body[data-page="home"] > :not(.print-profile) { display: none !important; } body[data-page="home"] > .print-profile { display: grid !important; } body[data-page="home"] .print-profile, body[data-page="home"] .print-profile * { visibility: visible !important; } /* defensive belt , neutralises every old homepage live-layout print rule from earlier two-page-memo iterations. if anything is still reachable it gets hidden here. inert once the direct-child rule above has done its job. */ body[data-page="home"] .site-header, body[data-page="home"] main, body[data-page="home"] .site, body[data-page="home"] .nav, body[data-page="home"] .skip-link, body[data-page="home"] .site-footer, body[data-page="home"] .modal-overlay, body[data-page="home"] .cite-drawer, body[data-page="home"] .trust-mark, body[data-page="home"] .project-preview, body[data-page="home"] .cite-btn, body[data-page="home"] button, body[data-page="home"] .hero, body[data-page="home"] .hero-name, body[data-page="home"] .hero-statement, body[data-page="home"] .hero-body, body[data-page="home"] .section-approach, body[data-page="home"] .section-trajectory, body[data-page="home"] .section-projects, body[data-page="home"] .section-contact, body[data-page="home"] .principles, body[data-page="home"] .principle, body[data-page="home"] .trajectory-list, body[data-page="home"] .trajectory-item, body[data-page="home"] .project-card, body[data-page="home"] .contact, body[data-page="home"] .print-header, body[data-page="home"] > .print-header { display: none !important; } /* ─────────────────────────────────────────────────────────── subpages , privacy / integrity / security / errors. no print-profile; print the page-title + page-body scaffold. hide screen chrome only. ─────────────────────────────────────────────────────────── */ body:not([data-page="home"]) .site-header, body:not([data-page="home"]) .nav, body:not([data-page="home"]) .skip-link, body:not([data-page="home"]) .site-footer, body:not([data-page="home"]) .modal-overlay, body:not([data-page="home"]) .cite-drawer, body:not([data-page="home"]) .page-back, body:not([data-page="home"]) .cite-btn, body:not([data-page="home"]) .code-copy, body:not([data-page="home"]) .copy-fingerprint, body:not([data-page="home"]) button { display: none !important; } /* ─────────────────────────────────────────────────────────── Page-level type , applies to every printed page. ─────────────────────────────────────────────────────────── */ html, body { background: #fff !important; color: #1F1E1C !important; font-family: 'Söhne', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important; font-size: 8.4pt !important; line-height: 1.3 !important; overflow: visible !important; -webkit-print-color-adjust: exact; print-color-adjust: exact; } /* no joined words in extracted pdf text. reset tracking, kerning and ligature features globally; mono labels reapply tracking below. */ * { text-rendering: auto !important; font-kerning: normal !important; font-variant-ligatures: none !important; font-feature-settings: normal !important; letter-spacing: 0 !important; word-spacing: 0.025em !important; box-sizing: border-box !important; } /* block any uppercase-on-screen rule from leaking into print copy. */ .print-profile h1, .print-profile h2, .print-profile h3, .print-summary, .print-prin, .print-trajectory dd, .print-project p { text-transform: none !important; } /* ─────────────────────────────────────────────────────────── PRINT-PROFILE container , page-physical sizing. constrains the profile to one a4 page (252mm tall, leaving a 23mm safety margin for browser print-engine rounding on ios / safari / chrome / firefox). overflow: hidden clips any spill; break rules below also forbid a second page. ─────────────────────────────────────────────────────────── */ body[data-page="home"] { width: 186mm; margin: 0 !important; padding: 0 !important; background: #fff !important; color: #1F1E1C !important; overflow: visible !important; } /* sheet frame , 252mm, not 275mm. the 23mm safety margin protects against print-engine rounding (chrome / safari / firefox / ios), scaling, browser-injected headers/footers, and edge-of-paper push. footer is pinned absolutely with 18mm reservation, so its dimensions cannot push residue to a second page. */ .print-profile { position: relative !important; width: 100% !important; max-width: none !important; height: 252mm !important; max-height: 252mm !important; min-height: 0 !important; margin: 0 !important; padding: 0 0 18mm 0 !important; display: grid !important; /* Rhythm: every in-flow row is auto-sized so the lower block sits directly under the approach block (was `1fr` on the lower row, which stretched it down and produced a large empty centre). the footer is position:absolute and stays pinned to the 18mm bottom reservation regardless. */ grid-template-rows: auto auto auto; row-gap: 3.2mm; align-content: start; overflow: hidden !important; page-break-after: avoid !important; break-after: avoid !important; page-break-inside: avoid !important; break-inside: avoid !important; } /* archival lightning seal , top-right of the printed sheet, oxblood, low visual weight. inline svg inside .print-profile uses fill="currentcolor" so this `color` rule is the only oxblood cue. hidden on screen by styles.css's `.print-seal { display: none }` rule; restored here. */ .print-seal { display: block !important; position: absolute !important; top: 14mm !important; right: 14mm !important; height: 8mm !important; width: auto !important; color: #6E1A14 !important; opacity: 0.55 !important; pointer-events: none; } /* ── 1. identity block , title-page opening, no banner ───── */ .print-top { margin: 0 0 7mm !important; padding: 0 !important; border: 0 !important; } .print-eyebrow { font-family: 'Söhne Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important; font-size: 6.6pt !important; line-height: 1.2 !important; font-weight: 500 !important; letter-spacing: 0.12em !important; text-transform: uppercase !important; color: #706B66 !important; margin: 0 0 5mm !important; } .print-headline { font-family: 'Signifier', Georgia, serif !important; font-size: 24pt !important; line-height: 0.98 !important; font-weight: 300 !important; letter-spacing: -0.02em !important; color: #1F1E1C !important; margin: 0 0 1.2mm !important; max-width: 165mm !important; } /* contact line directly under the headline , quiet söhne body weight; not a block of metadata, just a single readable address. */ .print-contact-line { font-family: 'Söhne', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important; font-size: 7pt !important; line-height: 1.28 !important; letter-spacing: 0.02em !important; color: #1F1E1C !important; margin: 0 0 3mm !important; } .print-summary { font-family: 'Signifier', Georgia, serif !important; font-size: 8.4pt !important; line-height: 1.32 !important; font-weight: 300 !important; color: #2A2826 !important; margin: 0 !important; max-width: 150mm !important; } /* hairline + tighter spacing above each structured lower section. */ .print-section { border-top: 0.4pt solid #E6E1D8; padding-top: 3.5mm; margin-top: 4mm; } /* ── 2. approach , five numbered principles, two-column grid ── */ .print-approach { break-inside: avoid; } .print-label { font-family: 'Söhne Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important; font-size: 6.4pt !important; line-height: 1.2 !important; font-weight: 500 !important; letter-spacing: 0.06em !important; text-transform: uppercase !important; color: #706B66 !important; margin: 0 0 3mm !important; } .print-principles { list-style: none !important; margin: 0 !important; padding: 0 !important; display: grid !important; grid-template-columns: 1fr 1fr; column-gap: 10mm; row-gap: 2mm; } .print-principles li { display: grid !important; grid-template-columns: 7mm 1fr; column-gap: 2mm; align-items: baseline; break-inside: avoid; } .print-num { font-family: 'Söhne Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important; font-size: 6.4pt !important; font-weight: 500 !important; letter-spacing: 0.04em !important; color: #6E1A14 !important; } .print-prin { font-family: 'Signifier', Georgia, serif !important; font-size: 8.4pt !important; line-height: 1.16 !important; font-weight: 400 !important; color: #1F1E1C !important; } /* ── 3. trajectory + project paired grid ─────────────────── */ .print-lower { display: grid !important; grid-template-columns: 1.2fr 1fr; column-gap: 6mm; align-items: start; margin-bottom: 0 !important; } .print-trajectory { break-inside: avoid; } .print-trajectory dl { display: grid; grid-template-columns: 24mm 1fr; column-gap: 4mm; row-gap: 2.5mm; margin: 0; } .print-trajectory dt { font-family: 'Söhne Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important; font-size: 6.4pt !important; line-height: 1.25 !important; color: #706B66 !important; text-transform: uppercase; letter-spacing: 0.04em !important; } .print-trajectory dd { font-family: 'Söhne', system-ui, sans-serif !important; font-size: 6.7pt !important; line-height: 1.22 !important; color: #1F1E1C !important; margin: 0 !important; } /* editorial column rule on the project block, not a full-frame box. */ .print-project { border-left: 0.4pt solid #D8D4CC; padding-left: 6mm; break-inside: avoid; } .print-project p.print-project-title { font-family: 'Signifier', Georgia, serif !important; font-size: 10pt !important; line-height: 1.1 !important; font-weight: 400 !important; color: #1F1E1C !important; margin: 1.5mm 0 1.5mm !important; } .print-project p { font-family: 'Söhne', system-ui, sans-serif !important; font-size: 6.7pt !important; line-height: 1.22 !important; color: #2A2826 !important; margin: 0 !important; } /* ── 4. micro architecture strip (homepage profile only). 6-cell trust chain in mono evidence type. Hairline-ruled. one oxblood cue on the leading cell. ~10mm tall total. inert as a quiet signature; never appears on screen, never on trust or utility sheets. */ body[data-page="home"] .print-architecture-strip { display: block !important; border-top: 0.5pt solid #E6E1D8; padding: 1.8mm 0 0 !important; margin: 1mm 0 0 !important; break-inside: avoid !important; page-break-inside: avoid !important; } body[data-page="home"] .print-architecture-caption { font-family: 'Söhne Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important; font-size: 5.5pt !important; line-height: 1.1 !important; letter-spacing: 0.025em !important; color: #706B66 !important; text-transform: uppercase !important; margin: 0 0 1.4mm !important; text-align: left !important; } body[data-page="home"] .print-architecture-chain { display: grid !important; grid-template-columns: repeat(6, minmax(0, 1fr)); column-gap: 1.6mm; list-style: none !important; margin: 0 !important; padding: 0 !important; } body[data-page="home"] .print-architecture-chain li { position: relative; min-width: 0; border: 0.4pt solid #D8D4CC; padding: 1.1mm 1mm; font-family: 'Söhne Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important; font-size: 5.2pt !important; line-height: 1.05 !important; letter-spacing: 0 !important; color: #1F1E1C !important; text-align: center; white-space: nowrap; overflow: hidden; text-overflow: clip; } /* single oxblood cue , leading "browser" cell carries an oxblood left border. reads as the entry point of the chain. */ body[data-page="home"] .print-architecture-chain li:first-child { border-left: 0.6pt solid #6E1A14; } /* hairline connector between cells, centred vertically in the gutter. */ body[data-page="home"] .print-architecture-chain li:not(:last-child)::after { content: ""; position: absolute; top: 50%; right: -1.0mm; width: 0.4mm; height: 0.4pt; background: #D8D4CC; } /* ── 5. footer , text lines stacked left + 13mm qr pinned right. the text block uses tight mono evidence type; the proof line prints in oxblood as the single accent. the qr is explicitly constrained at 13mm × 13mm so the svg cannot use its intrinsic dimensions. */ /* footer sits at the bottom of the parent grid track via `align-self: end`. was `position: absolute` previously, but ios safari was paginating the absolute child onto a separate page despite the parent's overflow: hidden — a known print-engine quirk. In-flow grid placement keeps it on the same page. */ .print-profile-footer { align-self: end !important; display: grid !important; grid-template-columns: 1fr auto; column-gap: 6mm; align-items: end; border-top: 0.5pt solid #D8D4CC !important; padding-top: 2mm !important; margin: 0 !important; break-inside: avoid !important; page-break-inside: avoid !important; } .print-profile-footer-text { display: grid; row-gap: 0.6mm; min-width: 0; padding-right: 4mm; } .print-profile-footer-text p { font-family: 'Söhne Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important; font-size: 5.9pt !important; line-height: 1.18 !important; letter-spacing: 0.025em !important; color: #706B66 !important; margin: 0 !important; } .print-profile-footer-text .print-proof { color: #6E1A14 !important; text-transform: uppercase !important; letter-spacing: 0.04em !important; } /* compact evidence chip , just below the proof line, just above the edition + citation. sits in the same monospace footer column. public record · html · 23 kb · validated 2026-05-02. the size + date are stamped at build time by generate_site.py. */ .print-profile-footer-text .print-evidence { color: #5C5955 !important; letter-spacing: 0.025em !important; } /* qr block , 13mm column with 11.5mm image inside (was 15mm/13mm). smaller still scans well; the extra ~1.5mm of breathing room lets the url label sit inside the absolute footer without pushing residue to a second page on ios / safari print engines. */ .print-qr-block { width: 13mm !important; min-width: 13mm !important; max-width: 13mm !important; justify-self: end !important; align-self: end !important; text-align: center !important; line-height: 1 !important; margin: 0 !important; padding: 0 !important; overflow: hidden !important; } .print-qr-image { display: block !important; width: 11.5mm !important; height: 11.5mm !important; min-width: 11.5mm !important; min-height: 11.5mm !important; max-width: 11.5mm !important; max-height: 11.5mm !important; object-fit: contain !important; margin: 0 auto 0.8mm !important; padding: 0 !important; image-rendering: -webkit-optimize-contrast; } .print-qr-url { font-family: 'Söhne Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important; font-size: 4.6pt !important; line-height: 1 !important; letter-spacing: 0 !important; color: #706B66 !important; margin: 0 !important; padding: 0 !important; white-space: nowrap !important; } /* ─────────────────────────────────────────────────────────── utility pages , 403 / 404 / 500 / source / releases. each page carries its own