@datatechsolutions/tympan-tokens 0.4.2 → 0.5.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/THIRD_PARTY_NOTICES.md +5 -5
- package/dist/fonts.css +80 -80
- package/dist/index.d.ts +229 -55
- package/dist/index.js +359 -16
- package/dist/index.js.map +1 -1
- package/dist/print-themes/print-aquarela.css +7 -7
- package/dist/print-themes/print-art-nouveau.css +2 -2
- package/dist/print-themes/print-atlas-oficial.css +7 -7
- package/dist/print-themes/print-azulejo-modernista.css +2 -2
- package/dist/print-themes/print-bauhaus.css +2 -2
- package/dist/print-themes/print-blocos-coloridos.css +5 -5
- package/dist/print-themes/print-brutalista.css +8 -8
- package/dist/print-themes/print-caderno.css +14 -14
- package/dist/print-themes/print-cartao-postal.css +5 -5
- package/dist/print-themes/print-cientifico.css +3 -3
- package/dist/print-themes/print-concretismo.css +8 -8
- package/dist/print-themes/print-construtivismo.css +6 -6
- package/dist/print-themes/print-cordel.css +6 -6
- package/dist/print-themes/print-dados-br.css +12 -12
- package/dist/print-themes/print-dashboard.css +18 -18
- package/dist/print-themes/print-diagrama-modernista.css +3 -3
- package/dist/print-themes/print-divulgacao.css +3 -3
- package/dist/print-themes/print-fluxo-historico.css +3 -3
- package/dist/print-themes/print-grade-holandesa.css +2 -2
- package/dist/print-themes/print-graficos-1900.css +6 -6
- package/dist/print-themes/print-infografico-ilustrado.css +6 -6
- package/dist/print-themes/print-isotype.css +2 -2
- package/dist/print-themes/print-jornal-1959.css +5 -5
- package/dist/print-themes/print-jornal.css +6 -6
- package/dist/print-themes/print-mapa-de-metro.css +1 -1
- package/dist/print-themes/print-memphis.css +5 -5
- package/dist/print-themes/print-minimo-de-tinta.css +4 -4
- package/dist/print-themes/print-papel-recortado.css +2 -2
- package/dist/print-themes/print-papel-salmao.css +6 -6
- package/dist/print-themes/print-pictogramas.css +2 -2
- package/dist/print-themes/print-pop-art.css +2 -2
- package/dist/print-themes/print-prancheta-clara.css +5 -5
- package/dist/print-themes/print-prancheta.css +5 -5
- package/dist/print-themes/print-proporcao-modular.css +2 -2
- package/dist/print-themes/print-riso.css +4 -4
- package/dist/print-themes/print-semanario.css +13 -13
- package/dist/print-themes/print-sinalizacao.css +8 -8
- package/dist/print-themes/print-suico.css +4 -4
- package/dist/print-themes/print-tropicalia.css +3 -3
- package/dist/print-themes.css +133 -133
- package/fonts/ibmplexsans/ibmplexsans-italic-cyrillic-400_500_600.woff2 +0 -0
- package/fonts/ibmplexsans/ibmplexsans-italic-cyrillic-ext-400_500_600.woff2 +0 -0
- package/fonts/ibmplexsans/ibmplexsans-italic-greek-400_500_600.woff2 +0 -0
- package/fonts/ibmplexsans/ibmplexsans-italic-latin-400_500_600.woff2 +0 -0
- package/fonts/ibmplexsans/ibmplexsans-italic-latin-ext-400_500_600.woff2 +0 -0
- package/fonts/ibmplexsans/ibmplexsans-italic-vietnamese-400_500_600.woff2 +0 -0
- package/fonts/manifest.json +998 -820
- package/fonts/nunitosans/nunitosans-normal-cyrillic-400_600_700_800.woff2 +0 -0
- package/fonts/nunitosans/nunitosans-normal-cyrillic-ext-400_600_700_800.woff2 +0 -0
- package/fonts/nunitosans/nunitosans-normal-latin-400_600_700_800.woff2 +0 -0
- package/fonts/nunitosans/nunitosans-normal-latin-ext-400_600_700_800.woff2 +0 -0
- package/fonts/nunitosans/nunitosans-normal-vietnamese-400_600_700_800.woff2 +0 -0
- package/fonts/sourceserif4/sourceserif4-italic-cyrillic-400_600.woff2 +0 -0
- package/fonts/sourceserif4/sourceserif4-italic-cyrillic-ext-400_600.woff2 +0 -0
- package/fonts/sourceserif4/sourceserif4-italic-greek-400_600.woff2 +0 -0
- package/fonts/sourceserif4/sourceserif4-italic-latin-400_600.woff2 +0 -0
- package/fonts/sourceserif4/sourceserif4-italic-latin-ext-400_600.woff2 +0 -0
- package/fonts/sourceserif4/sourceserif4-italic-vietnamese-400_600.woff2 +0 -0
- package/package.json +1 -1
- package/src/fonts.ts +2 -2
- package/src/index.ts +1 -0
- package/src/print-book-themes.ts +239 -0
- package/src/print-presets.ts +220 -10
- /package/fonts/ibmplexsans/{ibmplexsans-italic-cyrillic.woff2 → ibmplexsans-italic-cyrillic-400.woff2} +0 -0
- /package/fonts/ibmplexsans/{ibmplexsans-italic-cyrillic-ext.woff2 → ibmplexsans-italic-cyrillic-ext-400.woff2} +0 -0
- /package/fonts/ibmplexsans/{ibmplexsans-italic-greek.woff2 → ibmplexsans-italic-greek-400.woff2} +0 -0
- /package/fonts/ibmplexsans/{ibmplexsans-italic-latin.woff2 → ibmplexsans-italic-latin-400.woff2} +0 -0
- /package/fonts/ibmplexsans/{ibmplexsans-italic-latin-ext.woff2 → ibmplexsans-italic-latin-ext-400.woff2} +0 -0
- /package/fonts/ibmplexsans/{ibmplexsans-italic-vietnamese.woff2 → ibmplexsans-italic-vietnamese-400.woff2} +0 -0
- /package/fonts/sourceserif4/{sourceserif4-italic-cyrillic.woff2 → sourceserif4-italic-cyrillic-400.woff2} +0 -0
- /package/fonts/sourceserif4/{sourceserif4-italic-cyrillic-ext.woff2 → sourceserif4-italic-cyrillic-ext-400.woff2} +0 -0
- /package/fonts/sourceserif4/{sourceserif4-italic-greek.woff2 → sourceserif4-italic-greek-400.woff2} +0 -0
- /package/fonts/sourceserif4/{sourceserif4-italic-latin.woff2 → sourceserif4-italic-latin-400.woff2} +0 -0
- /package/fonts/sourceserif4/{sourceserif4-italic-latin-ext.woff2 → sourceserif4-italic-latin-ext-400.woff2} +0 -0
- /package/fonts/sourceserif4/{sourceserif4-italic-vietnamese.woff2 → sourceserif4-italic-vietnamese-400.woff2} +0 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["fromLinear","px","builtInPresets","corePresets"],"sources":["../src/color.ts","../src/theme.ts","../src/presets.ts","../src/dtcg.ts","../src/print-presets.ts","../src/print-themes.ts","../src/scripts.ts","../src/stylesheet.ts","../src/flow.ts","../src/fonts.ts","../src/index.ts"],"sourcesContent":["// Colour math for the theme generator: sRGB <-> OKLab <-> OKLCH (from Björn\n// Ottosson's published OKLab definition), gamut mapping by chroma reduction,\n// alpha compositing, WCAG 2 contrast ratio and APCA lightness contrast\n// (informational only). Pure and deterministic; no dependencies.\n\n/** Straight (non-premultiplied) sRGB colour, channels 0..1. */\nexport interface Rgba {\n r: number\n g: number\n b: number\n a: number\n}\n\nexport interface Oklch {\n l: number\n c: number\n h: number\n}\n\nconst clamp01 = (v: number) => Math.min(1, Math.max(0, v))\n\nfunction toLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4\n}\n\nfunction fromLinear(c: number): number {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055\n}\n\nexport function rgbToOklab({ r, g, b }: Rgba): { L: number; a: number; b: number } {\n const lr = toLinear(r)\n const lg = toLinear(g)\n const lb = toLinear(b)\n const l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb)\n const m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb)\n const s = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb)\n return {\n L: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n }\n}\n\n/** OKLab to linear-light sRGB (may be out of gamut). */\nfunction oklabToLinear(L: number, a: number, b: number): [number, number, number] {\n const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3\n const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3\n const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ]\n}\n\nexport function rgbToOklch(c: Rgba): Oklch {\n const { L, a, b } = rgbToOklab(c)\n const chroma = Math.hypot(a, b)\n let h = (Math.atan2(b, a) * 180) / Math.PI\n if (h < 0) h += 360\n return { l: L, c: chroma, h: chroma < 1e-6 ? 0 : h }\n}\n\nfunction inGamut(lin: [number, number, number]): boolean {\n const eps = 1e-6\n return lin.every((v) => v >= -eps && v <= 1 + eps)\n}\n\n/**\n * OKLCH to sRGB. Out-of-gamut colours keep lightness and hue and lose chroma\n * (binary search), which preserves the perceived tone of a ramp step.\n */\nexport function oklchToRgb({ l, c, h }: Oklch, alpha = 1): Rgba {\n const L = clamp01(l)\n const rad = (h * Math.PI) / 180\n const lin = (chroma: number) => oklabToLinear(L, chroma * Math.cos(rad), chroma * Math.sin(rad))\n let chroma = Math.max(0, c)\n if (!inGamut(lin(chroma))) {\n let lo = 0\n let hi = chroma\n for (let i = 0; i < 32; i++) {\n const mid = (lo + hi) / 2\n if (inGamut(lin(mid))) lo = mid\n else hi = mid\n }\n chroma = lo\n }\n // Quantised to 8 bits per channel so every serialisation (hex, DTCG\n // components, rgb()) round-trips to the same value.\n const [r, g, b] = lin(chroma).map((v) => Math.round(clamp01(fromLinear(clamp01(v))) * 255) / 255) as [number, number, number]\n return { r, g, b, a: alpha }\n}\n\nconst hex2 = (v: number) =>\n Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, '0')\n\n/** `#rrggbb` (alpha ignored). */\nexport function toHex(c: Rgba): string {\n return `#${hex2(c.r)}${hex2(c.g)}${hex2(c.b)}`\n}\n\n/** CSS serialisation: hex when opaque, `rgb(r g b / a)` otherwise. */\nexport function toCss(c: Rgba): string {\n if (c.a >= 1) return toHex(c)\n const ch = (v: number) => Math.round(clamp01(v) * 255)\n return `rgb(${ch(c.r)} ${ch(c.g)} ${ch(c.b)} / ${Math.round(c.a * 1000) / 1000})`\n}\n\n/** Parses `#rgb`, `#rrggbb`, `#rrggbbaa`, `rgb(r g b / a)` and `rgba(r, g, b, a)`. */\nexport function parseColor(input: string): Rgba {\n const s = input.trim().toLowerCase()\n if (s.startsWith('#')) {\n let h = s.slice(1)\n if (h.length === 3) h = [...h].map((x) => x + x).join('')\n if (h.length !== 6 && h.length !== 8) throw new Error(`Invalid colour ${input}`)\n const n = (i: number) => parseInt(h.slice(i, i + 2), 16) / 255\n return { r: n(0), g: n(2), b: n(4), a: h.length === 8 ? n(6) : 1 }\n }\n const m = /^rgba?\\(([^)]+)\\)$/.exec(s)\n if (m && m[1]) {\n const parts = m[1].split(/[\\s,/]+/).filter(Boolean).map(Number)\n const [r = 0, g = 0, b = 0, a = 1] = parts\n return { r: r / 255, g: g / 255, b: b / 255, a }\n }\n throw new Error(`Unsupported colour ${input}`)\n}\n\n/** Source-over compositing of `top` onto `bottom`. */\nexport function composite(top: Rgba, bottom: Rgba): Rgba {\n const a = top.a + bottom.a * (1 - top.a)\n if (a === 0) return { r: 0, g: 0, b: 0, a: 0 }\n const mix = (t: number, b: number) => (t * top.a + b * bottom.a * (1 - top.a)) / a\n return { r: mix(top.r, bottom.r), g: mix(top.g, bottom.g), b: mix(top.b, bottom.b), a }\n}\n\n/** Composites a stack given from top to bottom; the last layer should be opaque. */\nexport function flatten(stack: Rgba[]): Rgba {\n return stack.reduceRight<Rgba | null>((acc, layer) => (acc ? composite(layer, acc) : layer), null) ?? { r: 1, g: 1, b: 1, a: 1 }\n}\n\n/** WCAG 2.x relative luminance. */\nexport function luminance(c: Rgba): number {\n return 0.2126 * toLinear(c.r) + 0.7152 * toLinear(c.g) + 0.0722 * toLinear(c.b)\n}\n\n/** WCAG 2.x contrast ratio (1..21) between two opaque colours. */\nexport function contrastRatio(a: Rgba, b: Rgba): number {\n const la = luminance(a)\n const lb = luminance(b)\n const [hi, lo] = la > lb ? [la, lb] : [lb, la]\n return (hi + 0.05) / (lo + 0.05)\n}\n\n/**\n * APCA lightness contrast Lc (text on background), implemented from the\n * public description of the APCA-W3 0.0.98G constants. Informational only:\n * WCAG 2.2 conformance is decided by `contrastRatio`.\n */\nexport function apcaContrast(text: Rgba, background: Rgba): number {\n const y = (c: Rgba) => 0.2126729 * c.r ** 2.4 + 0.7151522 * c.g ** 2.4 + 0.072175 * c.b ** 2.4\n const clampBlack = (v: number) => (v > 0.022 ? v : v + (0.022 - v) ** 1.414)\n const yt = clampBlack(y(text))\n const yb = clampBlack(y(background))\n if (Math.abs(yb - yt) < 0.0005) return 0\n if (yb > yt) {\n const sapc = (yb ** 0.56 - yt ** 0.57) * 1.14\n return sapc < 0.1 ? 0 : (sapc - 0.027) * 100\n }\n const sapc = (yb ** 0.65 - yt ** 0.62) * 1.14\n return sapc > -0.1 ? 0 : (sapc + 0.027) * 100\n}\n\n/** CIE L*a*b* (D65) from sRGB, via CIE XYZ. */\nexport function rgbToLab({ r, g, b }: Rgba): { L: number; a: number; b: number } {\n const lr = toLinear(r)\n const lg = toLinear(g)\n const lb = toLinear(b)\n const x = (0.4124564 * lr + 0.3575761 * lg + 0.1804375 * lb) / 0.95047\n const y = 0.2126729 * lr + 0.7151522 * lg + 0.072175 * lb\n const z = (0.0193339 * lr + 0.119192 * lg + 0.9503041 * lb) / 1.08883\n const f = (t: number) => (t > 216 / 24389 ? Math.cbrt(t) : (24389 / 27 * t + 16) / 116)\n const fx = f(x)\n const fy = f(y)\n const fz = f(z)\n return { L: 116 * fy - 16, a: 500 * (fx - fy), b: 200 * (fy - fz) }\n}\n\n/**\n * CIEDE2000 colour difference (ΔE00) between two opaque colours, implemented\n * from the published formula (Sharma, Wu and Dalal, 2005). About 1 is a just\n * noticeable difference; 10 or more reads as clearly different colours.\n */\nexport function deltaE2000(c1: Rgba, c2: Rgba): number {\n const { L: L1, a: a1, b: b1 } = rgbToLab(c1)\n const { L: L2, a: a2, b: b2 } = rgbToLab(c2)\n const rad = Math.PI / 180\n const C1 = Math.hypot(a1, b1)\n const C2 = Math.hypot(a2, b2)\n const Cm = (C1 + C2) / 2\n const G = 0.5 * (1 - Math.sqrt(Cm ** 7 / (Cm ** 7 + 25 ** 7)))\n const a1p = (1 + G) * a1\n const a2p = (1 + G) * a2\n const C1p = Math.hypot(a1p, b1)\n const C2p = Math.hypot(a2p, b2)\n const hp = (a: number, b: number) => {\n if (a === 0 && b === 0) return 0\n const h = Math.atan2(b, a) / rad\n return h < 0 ? h + 360 : h\n }\n const h1p = hp(a1p, b1)\n const h2p = hp(a2p, b2)\n const dLp = L2 - L1\n const dCp = C2p - C1p\n let dhp = 0\n if (C1p * C2p !== 0) {\n dhp = h2p - h1p\n if (dhp > 180) dhp -= 360\n else if (dhp < -180) dhp += 360\n }\n const dHp = 2 * Math.sqrt(C1p * C2p) * Math.sin((dhp / 2) * rad)\n const Lmp = (L1 + L2) / 2\n const Cmp = (C1p + C2p) / 2\n let hmp = h1p + h2p\n if (C1p * C2p !== 0) {\n if (Math.abs(h1p - h2p) <= 180) hmp = (h1p + h2p) / 2\n else hmp = h1p + h2p < 360 ? (h1p + h2p + 360) / 2 : (h1p + h2p - 360) / 2\n }\n const T =\n 1 - 0.17 * Math.cos((hmp - 30) * rad) + 0.24 * Math.cos(2 * hmp * rad) + 0.32 * Math.cos((3 * hmp + 6) * rad) - 0.2 * Math.cos((4 * hmp - 63) * rad)\n const dTheta = 30 * Math.exp(-(((hmp - 275) / 25) ** 2))\n const Rc = 2 * Math.sqrt(Cmp ** 7 / (Cmp ** 7 + 25 ** 7))\n const Sl = 1 + (0.015 * (Lmp - 50) ** 2) / Math.sqrt(20 + (Lmp - 50) ** 2)\n const Sc = 1 + 0.045 * Cmp\n const Sh = 1 + 0.015 * Cmp * T\n const Rt = -Math.sin(2 * dTheta * rad) * Rc\n return Math.sqrt((dLp / Sl) ** 2 + (dCp / Sc) ** 2 + (dHp / Sh) ** 2 + Rt * (dCp / Sc) * (dHp / Sh))\n}\n","// Deterministic theme generator. Input: seed hues and chroma, a radius base,\n// contrast level, glass on/off and optional pinned colours. Output: 11-step\n// OKLCH ramps, paired semantic roles (X / on-X), shadows, radii and glass\n// values for one mode, with every declared contrast pair checked and, where a\n// role is not pinned, nudged along its lightness axis until WCAG 2.2 AA holds.\n//\n// The role model (paired surface/foreground roles, one radius base deriving\n// the radius scale, themes as a swap of custom properties) and the idea of\n// 11-step ramps in OKLCH are publicly documented concepts (sources in\n// PROVENANCE.md). No code or values were taken from them; the lightness curve,\n// chroma curve, hues and role recipes below are this project's own.\n\nimport { apcaContrast, contrastRatio, flatten, oklchToRgb, parseColor, rgbToOklch, toCss, type Oklch, type Rgba } from './color.ts'\n\nexport type Mode = 'light' | 'dark'\nexport type ContrastLevel = 'default' | 'high'\nexport type Density = 'compact' | 'default' | 'comfortable'\n\nexport interface Seed {\n /** OKLCH hue in degrees. */\n hue: number\n /** Peak OKLCH chroma of the ramp (0..~0.37). */\n chroma: number\n}\n\nexport type SeedName = 'brand' | 'neutral' | 'danger' | 'warning' | 'success' | 'info'\n\n/**\n * Typographic roles a theme may set. They map onto the base font tokens the\n * components read: `display` -> `--ty-font-serif` (headings h1 to h3 and KPI\n * numbers), `body` -> `--ty-font-sans` (everything else), `mono` ->\n * `--ty-font-mono` (identifiers). A role left out keeps the base stack.\n */\nexport type FontRole = 'display' | 'body' | 'mono' | 'sans' | 'serif'\n\n/** CSS token of each font role (`--ty-font-<name>`). */\nexport const FONT_ROLE_TOKENS: Record<FontRole, 'serif' | 'sans' | 'mono'> = { display: 'serif', body: 'sans', mono: 'mono', sans: 'sans', serif: 'serif' }\n\n/** Elevation treatment: blurred shadows, none (flat print), or a hard offset shadow without blur. */\nexport type Elevation = 'soft' | 'flat' | 'offset'\n\nexport interface ThemeConfig {\n /** Identifier used in `data-ty-theme`. Lowercase letters, digits and dashes. */\n name: string\n /** Human label (customizer, docs). */\n label?: string\n seeds: Record<SeedName, Seed>\n /** Hues of the eight chart / categorical colours. */\n chartHues?: number[]\n /** Control radius in px; card and sheet radii derive from it. */\n radius: number\n contrast: ContrastLevel\n /** Translucent blurred surfaces when true; opaque when false. */\n glass: boolean\n /** Call-to-action fill: brand gradient or solid brand. */\n cta: 'gradient' | 'solid'\n /** Exact colours that override generated roles (CSS colour strings). */\n pins?: Partial<Record<Mode, Partial<Record<RoleName, string>>>>\n /** Exact gradient stops for the call to action, per mode. */\n ctaPins?: Partial<Record<Mode, string[]>>\n /** Font families per role, most preferred first, ending with a generic family. */\n fonts?: Partial<Record<FontRole, string[]>>\n /**\n * Stylesheet URL that loads the families of `fonts` (for example a Google\n * Fonts css2 URL). The token CSS never fetches it; the host or\n * ThemeProvider's `fonts` map adds the link.\n */\n fontsUrl?: string\n /** Shadow treatment; `soft` when omitted. */\n elevation?: Elevation\n /** Arbitrary string variables (e.g. for textures) */\n strings?: Record<string, string>\n /**\n * String variables per mode (`--ty-<name>`), for values that differ\n * between light and dark: a glass edge, a fill gradient, a brand mark\n * gradient. Like pins, they are exact design values: the generated\n * high-contrast variant leaves them out, so components fall back.\n */\n modeStrings?: Partial<Record<Mode, Record<string, string>>>\n /** Backdrop saturation of glass surfaces per mode (1.15 when omitted). */\n glassSaturate?: Partial<Record<Mode, number>>\n /** Exact shadow layers per mode, replacing the generated ones by name. */\n shadowPins?: Partial<Record<Mode, Partial<Record<ShadowName, ShadowPin[]>>>>\n /** Card and sheet radii in px, when they do not follow the control radius. */\n radii?: Partial<Record<'card' | 'sheet', number>>\n}\n\nexport type ShadowName = 'sheet' | 'raised' | 'floating' | 'modal' | 'sheet-inset'\n\n/** One shadow layer of `shadowPins`, its colour as a CSS colour string. */\nexport interface ShadowPin {\n x: number\n y: number\n blur: number\n spread: number\n color: string\n inset?: boolean\n}\n\nexport const RAMP_STEPS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950] as const\nexport type RampStep = (typeof RAMP_STEPS)[number]\n\n// Lightness and relative chroma per step (this project's own curve: near\n// white at 50, near black at 950, chroma peaking around 500-600).\nconst RAMP_L = [0.975, 0.94, 0.885, 0.815, 0.725, 0.635, 0.55, 0.47, 0.395, 0.325, 0.255]\nconst RAMP_C = [0.1, 0.2, 0.38, 0.6, 0.84, 1, 0.97, 0.88, 0.76, 0.62, 0.5]\n\n/** 11-step ramp for a seed. */\nexport function generateRamp(seed: Seed): Record<RampStep, Rgba> {\n const out = {} as Record<RampStep, Rgba>\n RAMP_STEPS.forEach((step, i) => {\n out[step] = oklchToRgb({ l: RAMP_L[i] ?? 0.5, c: seed.chroma * (RAMP_C[i] ?? 1), h: seed.hue })\n })\n return out\n}\n\n/** Seed derived from an existing colour (keeps hue; chroma scaled to a ramp peak). */\nexport function seedFromColor(color: string, peakChroma?: number): Seed {\n const { c, h } = rgbToOklch(parseColor(color))\n return { hue: Math.round(h * 10) / 10, chroma: Math.round((peakChroma ?? c) * 1000) / 1000 }\n}\n\n// ---------------------------------------------------------------------------\n// Roles\n// ---------------------------------------------------------------------------\n\nexport const ROLE_NAMES = [\n 'bg', 'on-bg',\n 'surface', 'on-surface', 'surface-raised', 'on-surface-raised', 'surface-sunken', 'on-surface-sunken',\n 'surface-solid', 'surface-raised-solid',\n 'ink', 'ink-2', 'ink-3',\n 'line', 'line-soft', 'line-strong', 'input',\n 'focus-ring',\n 'cursor-now',\n 'brand', 'on-brand', 'brand-strong', 'brand-soft', 'on-brand-soft',\n 'cta-solid', 'on-cta',\n 'secondary', 'on-secondary',\n 'danger', 'on-danger', 'danger-soft', 'on-danger-soft',\n 'warning', 'on-warning', 'warning-soft', 'on-warning-soft',\n 'success', 'on-success', 'success-soft', 'on-success-soft',\n 'info', 'on-info', 'info-soft', 'on-info-soft',\n 'neutral', 'on-neutral', 'neutral-soft', 'on-neutral-soft',\n 'proof-proved', 'proof-proved-soft', 'proof-pending', 'proof-pending-soft', 'proof-refuted', 'proof-refuted-soft',\n 'proof-not-disclosed', 'proof-not-disclosed-soft', 'proof-none', 'proof-none-soft',\n 'actor-person', 'actor-person-soft', 'actor-agent', 'actor-agent-soft', 'actor-system', 'actor-system-soft',\n 'chart-1', 'chart-2', 'chart-3', 'chart-4', 'chart-5', 'chart-6', 'chart-7', 'chart-8',\n 'nav-bg', 'on-nav', 'nav-active', 'on-nav-active', 'nav-line',\n 'backdrop', 'ambient-1', 'ambient-2',\n] as const\nexport type RoleName = (typeof ROLE_NAMES)[number]\n\n/** Design-direction names kept as aliases of the role model. */\nexport const ROLE_ALIASES: Record<string, RoleName> = {\n accent: 'brand',\n 'accent-strong': 'brand-strong',\n 'accent-soft': 'brand-soft',\n 'accent-ink': 'on-brand',\n 'on-accent': 'on-brand',\n 'on-accent-soft': 'on-brand-soft',\n 'categorical-1': 'chart-1',\n 'categorical-2': 'chart-2',\n 'categorical-3': 'chart-3',\n 'categorical-4': 'chart-4',\n 'categorical-5': 'chart-5',\n 'categorical-6': 'chart-6',\n 'categorical-7': 'chart-7',\n 'categorical-8': 'chart-8',\n}\n\ninterface Recipe {\n seed: SeedName | 'chart' | 'ambient'\n /** OKLCH lightness. */\n l: number\n /** Multiplier of the seed chroma. */\n c?: number\n /** Opacity. */\n a?: number\n /** Hue override (chart and ambient). */\n h?: number\n}\n\nconst TONES = ['danger', 'warning', 'success', 'info', 'neutral'] as const\n\nfunction recipes(mode: Mode, contrast: ContrastLevel, glass: boolean): Partial<Record<RoleName, Recipe>> {\n const dark = mode === 'dark'\n const high = contrast === 'high'\n const pick = (light: number, darkV: number) => (dark ? darkV : light)\n const softA = pick(0.1, 0.14) * (high ? 1.6 : 1)\n const r: Partial<Record<RoleName, Recipe>> = {\n bg: { seed: 'neutral', l: pick(0.975, 0.165), c: 0.5 },\n surface: { seed: 'neutral', l: pick(0.993, 0.235), c: 0.4, a: glass ? pick(0.82, 0.72) : 1 },\n 'surface-raised': { seed: 'neutral', l: pick(0.993, 0.275), c: 0.4, a: glass ? pick(0.94, 0.86) : 1 },\n 'surface-solid': { seed: 'neutral', l: pick(0.993, 0.235), c: 0.4 },\n 'surface-raised-solid': { seed: 'neutral', l: pick(0.993, 0.275), c: 0.4 },\n 'surface-sunken': { seed: 'neutral', l: pick(0.955, 0.195), c: 0.6 },\n ink: { seed: 'neutral', l: pick(0.21, 0.955), c: 2 },\n 'ink-2': { seed: 'neutral', l: high ? pick(0.27, 0.93) : pick(0.37, 0.87), c: 2 },\n 'ink-3': { seed: 'neutral', l: high ? pick(0.33, 0.9) : pick(0.5, 0.72), c: 2 },\n line: { seed: 'neutral', l: pick(0.55, 0.78), c: 2.5, a: high ? pick(0.45, 0.4) : pick(0.22, 0.16) },\n 'line-soft': { seed: 'neutral', l: pick(0.55, 0.78), c: 2.5, a: high ? pick(0.3, 0.25) : pick(0.12, 0.09) },\n 'line-strong': { seed: 'neutral', l: pick(0.55, 0.78), c: 2.5, a: high ? pick(0.75, 0.65) : pick(0.38, 0.3) },\n input: { seed: 'neutral', l: high ? pick(0.42, 0.78) : pick(0.6, 0.58), c: 2.5 },\n 'focus-ring': { seed: 'brand', l: high ? pick(0.4, 0.85) : pick(0.47, 0.79), c: 0.75 },\n // The \"now\" cursor of run timelines: magenta/pink, deliberately off every\n // state hue (success/warning/danger/info) so it never reads as a state.\n 'cursor-now': { seed: 'brand', l: pick(0.55, 0.74), c: 0.9, h: 330 },\n brand: { seed: 'brand', l: high ? pick(0.4, 0.85) : pick(0.47, 0.79), c: 0.75 },\n 'brand-strong': { seed: 'brand', l: high ? pick(0.33, 0.9) : pick(0.4, 0.87), c: 0.7 },\n 'brand-soft': { seed: 'brand', l: pick(0.55, 0.75), c: 0.8, a: softA },\n 'on-brand-soft': { seed: 'brand', l: high ? pick(0.36, 0.88) : pick(0.44, 0.82), c: 0.75 },\n 'on-brand': { seed: 'brand', l: pick(0.985, 0.25), c: 0.15 },\n 'cta-solid': { seed: 'brand', l: pick(0.45, 0.45), c: 0.8 },\n 'on-cta': { seed: 'brand', l: 0.985, c: 0.1 },\n secondary: { seed: 'neutral', l: pick(0.993, 0.275), c: 0.4, a: glass ? pick(0.7, 0.6) : 1 },\n 'on-secondary': { seed: 'neutral', l: pick(0.21, 0.955), c: 2 },\n backdrop: { seed: 'neutral', l: pick(0.2, 0.1), c: 2, a: pick(0.4, 0.6) },\n 'ambient-1': { seed: 'brand', l: 0.72, c: 0.9, a: glass ? pick(0.07, 0.12) : 0 },\n 'ambient-2': { seed: 'ambient', l: 0.75, c: 0.12, h: 230, a: glass ? pick(0.05, 0.08) : 0 },\n }\n for (const tone of TONES) {\n const chroma = tone === 'neutral' ? 2 : 1\n r[tone] = { seed: tone, l: high ? pick(0.44, 0.8) : pick(0.51, 0.74), c: chroma }\n r[`${tone}-soft`] = { seed: tone, l: pick(0.6, 0.7), c: chroma, a: softA }\n r[`on-${tone}-soft`] = { seed: tone, l: high ? pick(0.38, 0.86) : pick(0.45, 0.8), c: chroma }\n r[`on-${tone}`] = { seed: 'neutral', l: pick(0.985, 0.18), c: 0.3 }\n }\n return r\n}\n\n/** Contrast pairs every theme must satisfy (WCAG 2.2 AA). */\nexport interface ContrastPair {\n fg: RoleName | `cta-stop-${number}` | 'focus-ring'\n /** Background stack from top to bottom; translucent layers are composited. */\n over: Array<RoleName | `cta-stop-${number}`>\n min: 4.5 | 3\n kind: 'text' | 'ui'\n}\n\nexport function contrastPairs(ctaStops: number): ContrastPair[] {\n const pairs: ContrastPair[] = []\n const text = (fg: ContrastPair['fg'], ...over: ContrastPair['over']) => pairs.push({ fg, over, min: 4.5, kind: 'text' })\n const ui = (fg: ContrastPair['fg'], ...over: ContrastPair['over']) => pairs.push({ fg, over, min: 3, kind: 'ui' })\n for (const ink of ['ink', 'ink-2', 'ink-3'] as const) {\n text(ink, 'bg')\n text(ink, 'surface', 'bg')\n text(ink, 'surface-raised', 'bg')\n text(ink, 'surface-sunken')\n }\n text('on-bg', 'bg')\n text('on-surface', 'surface', 'bg')\n text('on-surface-raised', 'surface-raised', 'bg')\n text('on-surface-sunken', 'surface-sunken')\n text('brand', 'bg')\n text('brand', 'surface', 'bg')\n text('brand', 'surface-raised', 'bg')\n text('brand-strong', 'surface', 'bg')\n text('on-brand', 'brand')\n text('on-brand-soft', 'brand-soft', 'surface', 'bg')\n text('on-cta', 'cta-solid')\n for (let i = 0; i < ctaStops; i++) text('on-cta', `cta-stop-${i}`)\n text('on-secondary', 'secondary', 'bg')\n for (const tone of TONES) {\n text(tone, 'surface', 'bg')\n text(tone, 'surface-raised', 'bg')\n text(`on-${tone}`, tone)\n text(`on-${tone}-soft`, `${tone}-soft`, 'surface', 'bg')\n }\n for (const p of ['proved', 'pending', 'refuted', 'not-disclosed', 'none'] as const) {\n text(`proof-${p}`, 'surface', 'bg')\n text(`proof-${p}`, `proof-${p}-soft`, 'surface', 'bg')\n }\n for (const a of ['person', 'agent', 'system'] as const) text(`actor-${a}`, `actor-${a}-soft`, 'surface', 'bg')\n text('on-nav', 'nav-bg', 'bg')\n text('on-nav-active', 'nav-active', 'nav-bg', 'bg')\n ui('input', 'surface', 'bg')\n ui('input', 'bg')\n ui('input', 'surface-raised', 'bg')\n ui('focus-ring', 'bg')\n ui('focus-ring', 'surface', 'bg')\n ui('focus-ring', 'surface-raised', 'bg')\n ui('brand', 'surface-sunken')\n for (let i = 1; i <= 8; i++) ui(`chart-${i}` as RoleName, 'surface', 'bg')\n return pairs\n}\n\n// ---------------------------------------------------------------------------\n// Resolution\n// ---------------------------------------------------------------------------\n\nexport interface ShadowLayer {\n x: number\n y: number\n blur: number\n spread: number\n color: Rgba\n inset?: boolean\n}\n\nexport interface ContrastResult {\n fg: string\n over: string[]\n kind: 'text' | 'ui'\n min: number\n ratio: number\n apca: number\n pass: boolean\n}\n\nexport interface ResolvedTheme {\n name: string\n mode: Mode\n contrast: ContrastLevel\n colors: Record<string, Rgba>\n ramps: Record<SeedName, Record<RampStep, Rgba>>\n cta: { angle: number; stops: Rgba[] }\n shadows: Record<ShadowName, ShadowLayer[]>\n /** Pixel dimensions (radius, glass blur, focus width). */\n dimensions: Record<string, number>\n /** Font stacks keyed by token name (`serif`, `sans`, `mono`); empty when the theme keeps the base stacks. */\n fonts: Partial<Record<'serif' | 'sans' | 'mono', string[]>>\n numbers: Record<string, number>\n strings?: Record<string, string>\n report: ContrastResult[]\n}\n\n/** Hues of the eight chart colours when a theme sets none. */\nexport const DEFAULT_CHART_HUES = [250, 62, 165, 335, 215, 35, 110, 290]\n\nfunction colorFrom(recipe: Recipe, seeds: Record<SeedName, Seed>): Oklch & { a: number } {\n const seed = recipe.seed === 'chart' || recipe.seed === 'ambient' ? undefined : seeds[recipe.seed]\n const chroma = seed ? seed.chroma * (recipe.c ?? 1) : (recipe.c ?? 0.1)\n return { l: recipe.l, c: chroma, h: recipe.h ?? seed?.hue ?? 0, a: recipe.a ?? 1 }\n}\n\n/** Resolves one theme in one mode. */\nexport function resolveTheme(config: ThemeConfig, mode: Mode, contrastOverride?: ContrastLevel): ResolvedTheme {\n const contrast = contrastOverride ?? config.contrast\n const dark = mode === 'dark'\n const recipeMap = recipes(mode, contrast, config.glass)\n const lch: Partial<Record<RoleName, Oklch & { a: number }>> = {}\n for (const [role, recipe] of Object.entries(recipeMap) as Array<[RoleName, Recipe]>) lch[role] = colorFrom(recipe, config.seeds)\n\n const chartHues = config.chartHues ?? DEFAULT_CHART_HUES\n chartHues.slice(0, 8).forEach((h, i) => {\n lch[`chart-${i + 1}` as RoleName] = { l: dark ? 0.76 : 0.55, c: dark ? 0.13 : 0.14, h, a: 1 }\n })\n\n const pinned = new Set<RoleName>()\n const colors: Record<string, Rgba> = {}\n const pins = config.pins?.[mode] ?? {}\n const pinnedValue = (role: RoleName): Rgba | undefined => {\n // Pins are exact design values; the high-contrast variant regenerates.\n const v = contrast === config.contrast ? pins[role] : undefined\n return v ? parseColor(v) : undefined\n }\n const materialise = (role: RoleName) => {\n const p = pinnedValue(role)\n if (p) {\n pinned.add(role)\n colors[role] = p\n return\n }\n const v = lch[role]\n if (v) colors[role] = oklchToRgb(v, v.a)\n }\n for (const role of Object.keys(lch) as RoleName[]) materialise(role)\n\n // Roles defined as copies of others (after pins so they follow them).\n const copy = (role: RoleName, from: RoleName) => {\n const p = pinnedValue(role)\n if (p) {\n pinned.add(role)\n colors[role] = p\n } else if (colors[from]) {\n colors[role] = { ...colors[from]! }\n if (lch[from]) lch[role] = { ...lch[from]! }\n }\n }\n const aliasRoles = (): void => {\n copy('on-bg', 'ink-2')\n copy('on-surface', 'ink-2')\n copy('on-surface-raised', 'ink-2')\n copy('on-surface-sunken', 'ink-2')\n copy('proof-proved', 'on-success-soft')\n copy('proof-proved-soft', 'success-soft')\n copy('proof-pending', 'on-warning-soft')\n copy('proof-pending-soft', 'warning-soft')\n copy('proof-refuted', 'on-danger-soft')\n copy('proof-refuted-soft', 'danger-soft')\n copy('proof-not-disclosed', 'on-neutral-soft')\n copy('proof-not-disclosed-soft', 'neutral-soft')\n copy('proof-none', 'ink-3')\n copy('proof-none-soft', 'neutral-soft')\n copy('actor-person', 'on-brand-soft')\n copy('actor-person-soft', 'brand-soft')\n copy('actor-agent', 'ink-2')\n copy('actor-agent-soft', 'neutral-soft')\n copy('actor-system', 'ink-3')\n copy('actor-system-soft', 'neutral-soft')\n copy('nav-bg', 'surface')\n copy('on-nav', 'ink-2')\n copy('nav-active', 'brand-soft')\n copy('on-nav-active', 'on-brand-soft')\n copy('nav-line', 'line')\n }\n aliasRoles()\n\n // Call to action stops.\n const brand = config.seeds.brand\n const ctaPin = config.ctaPins?.[mode]\n let ctaStops: Rgba[]\n if (ctaPin && contrast === config.contrast) ctaStops = ctaPin.map(parseColor)\n else if (config.cta === 'solid') ctaStops = [colors['cta-solid']!]\n else\n ctaStops = [\n oklchToRgb({ l: 0.5, c: brand.chroma * 0.85, h: brand.hue - 12 }),\n oklchToRgb({ l: 0.47, c: brand.chroma * 0.8, h: brand.hue + 8 }),\n oklchToRgb({ l: 0.47, c: brand.chroma * 0.85, h: brand.hue + 60 }),\n ]\n\n // Contrast enforcement: nudge non-pinned foreground roles along lightness.\n const pairs = contrastPairs(ctaStops.length)\n const layer = (name: string): Rgba => {\n const m = /^cta-stop-(\\d+)$/.exec(name)\n if (m) return ctaStops[Number(m[1])]!\n return colors[name] ?? { r: 1, g: 1, b: 1, a: 1 }\n }\n const measure = (pair: ContrastPair) => {\n const bgc = flatten([...pair.over.map(layer), dark ? layer('bg') : layer('bg')])\n const fgc = flatten([layer(pair.fg), bgc])\n return { ratio: contrastRatio(fgc, bgc), apca: apcaContrast(fgc, bgc), bgc }\n }\n for (let pass = 0; pass < 3; pass++) {\n for (const pair of pairs) {\n const role = pair.fg as RoleName\n if (pinned.has(role) || !lch[role]) continue\n let guard = 0\n let m = measure(pair)\n while (m.ratio < pair.min && guard++ < 80) {\n const v = lch[role]!\n const bgL = rgbToOklch(m.bgc).l\n const step = bgL > 0.6 ? -0.01 : 0.01\n v.l = Math.min(0.995, Math.max(0.02, v.l + step))\n colors[role] = oklchToRgb(v, v.a)\n m = measure(pair)\n }\n }\n aliasRoles()\n }\n\n\n const report: ContrastResult[] = pairs.map((pair) => {\n const m = measure(pair)\n return {\n fg: pair.fg,\n over: pair.over,\n kind: pair.kind,\n min: pair.min,\n ratio: Math.round(m.ratio * 100) / 100,\n apca: Math.round(m.apca * 10) / 10,\n pass: m.ratio >= pair.min - 1e-9,\n }\n })\n\n // Aliases of the design-direction vocabulary.\n for (const [alias, role] of Object.entries(ROLE_ALIASES)) if (colors[role]) colors[alias] = colors[role]!\n\n const ramps = Object.fromEntries(\n (Object.keys(config.seeds) as SeedName[]).map((s) => [s, generateRamp(config.seeds[s])]),\n ) as Record<SeedName, Record<RampStep, Rgba>>\n\n const tint = oklchToRgb({ l: dark ? 0.12 : 0.2, c: config.seeds.neutral.chroma * 2, h: config.seeds.neutral.hue })\n const shade = (alpha: number) => ({ ...tint, a: Math.min(0.9, alpha * (dark ? 2 : 1)) })\n const inset: ShadowLayer = { x: 0, y: 1, blur: 0, spread: 0, inset: true, color: { r: 1, g: 1, b: 1, a: dark && config.glass ? 0.06 : 0 } }\n const elevation = config.elevation ?? 'soft'\n let shadows: ResolvedTheme['shadows']\n if (elevation === 'flat') {\n // Print-flat: surfaces sit on the page; only overlays keep a faint separation.\n const none: ShadowLayer[] = [{ x: 0, y: 0, blur: 0, spread: 0, color: { ...tint, a: 0 } }]\n shadows = { sheet: none, raised: none, floating: [{ x: 0, y: 2, blur: 6, spread: -2, color: shade(0.12) }], modal: [{ x: 0, y: 16, blur: 40, spread: -16, color: shade(0.3) }], 'sheet-inset': [inset] }\n } else if (elevation === 'offset') {\n // Hard shadow in the ink colour, no blur (cut-paper and poster styles).\n const ink = colors.ink ?? tint\n const hard = (d: number): ShadowLayer[] => [{ x: d, y: d, blur: 0, spread: 0, color: { ...ink, a: 1 } }]\n shadows = { sheet: hard(3), raised: hard(2), floating: hard(4), modal: hard(6), 'sheet-inset': [inset] }\n } else {\n shadows = {\n sheet: [\n { x: 0, y: 1, blur: 2, spread: 0, color: shade(0.04) },\n { x: 0, y: 8, blur: 24, spread: -12, color: shade(0.1) },\n ],\n raised: [{ x: 0, y: 4, blur: 12, spread: -2, color: shade(0.08) }],\n floating: [{ x: 0, y: 12, blur: 24, spread: -8, color: shade(0.14) }],\n modal: [{ x: 0, y: 40, blur: 100, spread: -30, color: shade(0.35) }],\n 'sheet-inset': [inset],\n }\n }\n\n const shadowPins = config.shadowPins?.[mode] ?? {}\n for (const [name, layers] of Object.entries(shadowPins) as Array<[ShadowName, ShadowPin[]]>) {\n shadows[name] = layers.map((l) => ({ ...l, color: parseColor(l.color) }))\n }\n\n const R = config.radius\n const dimensions: Record<string, number> = {\n radius: R,\n 'radius-control': R,\n 'radius-card': config.radii?.card ?? Math.round(R * 1.6),\n 'radius-sheet': config.radii?.sheet ?? Math.round(R * 2.4),\n 'radius-pill': 999,\n 'radius-agent': Math.max(2, Math.round(R * 0.6)),\n 'focus-width': contrast === 'high' ? 3 : 2,\n 'glass-blur-sheet': config.glass ? 20 : 0,\n 'glass-blur-floating': config.glass ? 24 : 0,\n }\n const numbers: Record<string, number> = { 'glass-saturate': config.glass ? (config.glassSaturate?.[mode] ?? 1.15) : 1 }\n\n const fonts: ResolvedTheme['fonts'] = {}\n for (const role of ['display', 'body', 'mono'] as const) {\n const list = config.fonts?.[role]\n if (list?.length) fonts[FONT_ROLE_TOKENS[role]] = [...list]\n }\n\n return { name: config.name, mode, contrast, colors, ramps, cta: { angle: 135, stops: ctaStops }, shadows, dimensions, numbers, fonts, strings: { ...config.strings, ...(contrast === config.contrast ? config.modeStrings?.[mode] : undefined) }, report }\n}\n\n// ---------------------------------------------------------------------------\n// Density (independent of the theme)\n// ---------------------------------------------------------------------------\n\nexport const DENSITIES: Record<Density, Record<string, number>> = {\n compact: { 'control-height': 36, 'control-height-touch': 44, 'control-height-compact': 28, density: 0.875 },\n default: { 'control-height': 40, 'control-height-touch': 44, 'control-height-compact': 32, density: 1 },\n comfortable: { 'control-height': 44, 'control-height-touch': 48, 'control-height-compact': 36, density: 1.125 },\n}\n\n// ---------------------------------------------------------------------------\n// Serialisation to CSS custom property lists\n// ---------------------------------------------------------------------------\n\nexport function shadowToCss(layers: ShadowLayer[]): string {\n return layers\n .map((l) => `${l.inset ? 'inset ' : ''}${l.x}px ${l.y}px ${l.blur}px ${l.spread}px ${toCss(l.color)}`)\n .join(', ')\n}\n\nexport function gradientToCss(angle: number, stops: Rgba[]): string {\n const list = stops.length === 1 ? [stops[0]!, stops[0]!] : stops\n return `linear-gradient(${angle}deg, ${list.map((s, i) => `${toCss(s)} ${Math.round((i / (list.length - 1)) * 100)}%`).join(', ')})`\n}\n\n/** Ordered `[--ty-name, value]` pairs for one resolved theme. */\nexport function themeVariables(t: ResolvedTheme): Array<[string, string]> {\n const out: Array<[string, string]> = []\n for (const [name, c] of Object.entries(t.colors)) out.push([`--ty-${name}`, toCss(c)])\n out.push(['--ty-cta', gradientToCss(t.cta.angle, t.cta.stops)])\n for (const [seed, ramp] of Object.entries(t.ramps)) {\n for (const step of RAMP_STEPS) out.push([`--ty-${seed}-${step}`, toCss(ramp[step])])\n }\n for (const [name, layers] of Object.entries(t.shadows)) out.push([`--ty-shadow-${name}`, shadowToCss(layers)])\n for (const [name, px] of Object.entries(t.dimensions)) out.push([`--ty-${name}`, `${px}px`])\n for (const [name, n] of Object.entries(t.numbers)) out.push([`--ty-${name}`, String(n)])\n for (const [name, list] of Object.entries(t.fonts)) out.push([`--ty-font-${name}`, fontStackToCss(list)])\n for (const [name, s] of Object.entries(t.strings ?? {})) out.push([`--ty-${name}`, s])\n return out\n}\n\n/**\n * CSS `font-family` value of a family list: names with spaces or digits are\n * quoted, keywords and single identifiers are not (the same rule as the\n * Style Dictionary font-family transform of the build).\n */\nexport function fontStackToCss(families: readonly string[]): string {\n return families.map((f) => (/[\\s\\d]/.test(f) && !/^[\\w-]+$/.test(f) ? `'${f}'` : f)).join(', ')\n}\n\n/** Family list of a CSS `font-family` value (quotes removed). */\nexport function parseFontStack(stack: string): string[] {\n return stack\n .split(',')\n .map((f) => f.trim().replace(/^[\"']|[\"']$/g, ''))\n .filter(Boolean)\n}\n\nexport function densityVariables(density: Density): Array<[string, string]> {\n return Object.entries(DENSITIES[density]).map(([k, v]) => [`--ty-${k}`, k === 'density' ? String(v) : `${v}px`])\n}\n","import { seedFromColor, type Seed, type SeedName, type ThemeConfig } from './theme.ts'\n\n// Seeds. The brand hue comes from the design direction's accent (§2.3); the\n// neutral carries a slight tint of the brand hue; semantic hues are chosen so\n// the proof-state greens sit about 30 degrees away from the brand teal (§2.3).\nconst brand = seedFromColor('#166e5a', 0.13)\n\nconst baseSeeds: Record<SeedName, Seed> = {\n brand,\n neutral: { hue: brand.hue, chroma: 0.012 },\n danger: { hue: 12, chroma: 0.2 },\n warning: { hue: 68, chroma: 0.15 },\n success: { hue: 148, chroma: 0.16 },\n info: { hue: 255, chroma: 0.06 },\n}\n\n/**\n * Default theme. Generated from seeds, with the exact colours of design\n * direction §2.3 pinned so the product matches the approved direction.\n */\nexport const tympanPreset: ThemeConfig = {\n name: 'tympan',\n label: 'Tympan',\n seeds: baseSeeds,\n radius: 10,\n contrast: 'default',\n glass: true,\n cta: 'gradient',\n pins: {\n light: {\n brand: '#166e5a',\n 'focus-ring': '#166e5a',\n 'brand-strong': '#0f5a49',\n 'brand-soft': 'rgb(22 110 90 / 0.10)',\n 'on-brand': '#f6fbf9',\n bg: '#f6f8fa',\n surface: 'rgb(252 253 253 / 0.82)',\n 'surface-raised': 'rgb(252 253 253 / 0.94)',\n 'surface-solid': '#fcfdfd',\n 'surface-raised-solid': '#fcfdfd',\n 'surface-sunken': '#eef2f5',\n line: 'rgb(100 116 139 / 0.22)',\n 'line-strong': 'rgb(100 116 139 / 0.38)',\n ink: '#0f172a',\n 'ink-2': '#334155',\n 'ink-3': '#526077',\n success: '#15803d',\n warning: '#a16207',\n danger: '#be123c',\n neutral: '#526077',\n },\n dark: {\n brand: '#34d399',\n 'focus-ring': '#34d399',\n 'brand-strong': '#6ee7b7',\n 'brand-soft': 'rgb(52 211 153 / 0.14)',\n 'on-brand': '#052e25',\n bg: '#0a0f1c',\n surface: 'rgb(20 28 46 / 0.72)',\n 'surface-raised': 'rgb(28 38 60 / 0.86)',\n 'surface-solid': '#141c2e',\n 'surface-raised-solid': '#1c263c',\n 'surface-sunken': '#0f1626',\n line: 'rgb(148 163 184 / 0.16)',\n 'line-strong': 'rgb(148 163 184 / 0.30)',\n ink: '#eef2f7',\n 'ink-2': '#cbd5e1',\n 'ink-3': '#94a3b8',\n success: '#4ade80',\n warning: '#fbbf24',\n danger: '#fb7185',\n neutral: '#94a3b8',\n },\n },\n ctaPins: {\n light: ['#047857', '#0f766e', '#0369a1'],\n dark: ['#047857', '#0f766e', '#0369a1'],\n },\n}\n\n/** Brand-free grey theme for embedding and white-label use. Fully generated. */\nexport const neutralPreset: ThemeConfig = {\n name: 'neutral',\n label: 'Neutral',\n seeds: {\n brand: { hue: 255, chroma: 0.03 },\n neutral: { hue: 255, chroma: 0.008 },\n danger: { hue: 18, chroma: 0.19 },\n warning: { hue: 70, chroma: 0.14 },\n success: { hue: 150, chroma: 0.14 },\n info: { hue: 255, chroma: 0.05 },\n },\n radius: 8,\n contrast: 'default',\n glass: true,\n cta: 'solid',\n}\n\n/**\n * A named product preset, selected by name\n * (`data-ty-theme=\"fakhir\"`). Today it carries the default theme's values; it\n * is a separate preset so an app that selects it keeps its look if the default changes.\n */\nexport const fakhirPreset: ThemeConfig = {\n ...tympanPreset,\n name: 'fakhir',\n label: 'Fakhir',\n}\n\n/**\n * The Astrlabe workflow engine's look (`data-ty-theme=\"astrlabe\"`): slate\n * neutrals, an indigo brand (indigo 500 as the accent family, one step darker\n * where text needs 4.5:1 on light grounds), liquid-glass surfaces (gradient\n * fills, specular edges, a strong saturation boost at night), the rounder\n * corners of that app (12 px controls, 20 px cards, 24 px sheets), its\n * compact type scale and the sky, indigo and violet mark. The call to\n * action is the indigo to purple gradient its primary buttons fill with, and\n * text (headings included) uses the platform's own system fonts. The state\n * contract holds on every ground: running is a cyan clearly off the indigo\n * brand, waiting is amber.\n */\nexport const astrlabePreset: ThemeConfig = {\n name: 'astrlabe',\n label: 'Astrlabe',\n seeds: {\n brand: seedFromColor('#6366f1', 0.2),\n neutral: { hue: 257, chroma: 0.02 },\n danger: { hue: 25, chroma: 0.2 },\n warning: { hue: 70, chroma: 0.15 },\n success: { hue: 150, chroma: 0.16 },\n info: { hue: 240, chroma: 0.1 },\n },\n chartHues: [277, 237, 163, 75, 12, 293, 185, 48],\n radius: 12,\n contrast: 'default',\n glass: true,\n cta: 'gradient',\n pins: {\n light: {\n brand: '#4f46e5',\n 'focus-ring': '#6366f1',\n 'brand-strong': '#4338ca',\n 'brand-soft': 'rgb(99 102 241 / 0.12)',\n 'on-brand': '#ffffff',\n bg: '#f8fafc',\n surface: 'rgb(255 255 255 / 0.72)',\n 'surface-raised': 'rgb(255 255 255 / 0.86)',\n 'surface-solid': '#ffffff',\n 'surface-raised-solid': '#ffffff',\n // The canvas plane: the app's pale lavender ground.\n 'surface-sunken': '#f2f3fa',\n // The liquid divider: slate 400 at about a quarter.\n line: 'rgb(148 163 184 / 0.26)',\n 'line-strong': 'rgb(100 116 139 / 0.45)',\n ink: '#0f172a',\n // Slate 600 for secondary text, as the app always had.\n 'ink-2': '#475569',\n // Slate 500 fails 4.5:1 on the sunken ground by a hair; this is the\n // nearest slate that holds AA there.\n 'ink-3': '#5b6779',\n success: '#15803d',\n // Cyan, deliberately off the indigo brand, for the running state.\n info: '#0e7490',\n warning: '#a16207',\n danger: '#be123c',\n neutral: '#5b6779',\n backdrop: 'rgb(15 23 42 / 0.4)',\n // The three soft colour fields behind the glass: violet above, sky below.\n 'ambient-1': 'rgb(167 139 250 / 0.05)',\n 'ambient-2': 'rgb(56 189 248 / 0.03)',\n },\n dark: {\n brand: '#818cf8',\n 'focus-ring': '#818cf8',\n 'brand-strong': '#a5b4fc',\n 'brand-soft': 'rgb(99 102 241 / 0.2)',\n 'on-brand': '#1e1b4b',\n // Slate 950, the app's night ground.\n bg: '#020617',\n surface: 'rgb(30 41 59 / 0.7)',\n 'surface-raised': 'rgb(30 41 59 / 0.78)',\n 'surface-solid': '#131c2f',\n 'surface-raised-solid': '#1b2539',\n 'surface-sunken': '#0b1222',\n line: 'rgb(148 163 184 / 0.24)',\n 'line-strong': 'rgb(148 163 184 / 0.36)',\n ink: '#ffffff',\n 'ink-2': '#cbd5e1',\n 'ink-3': '#94a3b8',\n success: '#4ade80',\n info: '#22d3ee',\n warning: '#fbbf24',\n danger: '#fb7185',\n neutral: '#94a3b8',\n backdrop: 'rgb(0 0 0 / 0.5)',\n 'ambient-1': 'rgb(124 58 237 / 0.1)',\n 'ambient-2': 'rgb(2 132 199 / 0.08)',\n },\n },\n ctaPins: {\n light: ['#4f46e5', '#7c3aed', '#9333ea'],\n dark: ['#4f46e5', '#7c3aed', '#9333ea'],\n },\n // 12 px controls, 20 px cards and panels, 24 px dialogs and hero sheets.\n radii: { card: 20, sheet: 24 },\n // Glass: a light boost on light grounds (more would amplify the ambient\n // tint into a grey-lavender wash), a strong one on dark grounds.\n glassSaturate: { light: 1.15, dark: 1.5 },\n // The liquid-glass elevation: a soft drop under every sheet, a specular\n // inner highlight on its top edge, and the role-named elevation scale.\n shadowPins: {\n light: {\n sheet: [\n { x: 0, y: 4, blur: 16, spread: -2, color: 'rgb(0 0 0 / 0.1)' },\n { x: 0, y: 12, blur: 40, spread: -8, color: 'rgb(0 0 0 / 0.06)' },\n ],\n 'sheet-inset': [\n { x: 0, y: 1, blur: 2, spread: 0, color: 'rgb(255 255 255 / 0.7)', inset: true },\n { x: 0, y: -1, blur: 2, spread: 0, color: 'rgb(0 0 0 / 0.04)', inset: true },\n ],\n raised: [\n { x: 0, y: 4, blur: 12, spread: -2, color: 'rgb(15 23 42 / 0.08)' },\n { x: 0, y: 2, blur: 4, spread: -2, color: 'rgb(15 23 42 / 0.04)' },\n ],\n floating: [\n { x: 0, y: 12, blur: 24, spread: -8, color: 'rgb(15 23 42 / 0.12)' },\n { x: 0, y: 4, blur: 8, spread: -4, color: 'rgb(15 23 42 / 0.06)' },\n ],\n modal: [\n { x: 0, y: 40, blur: 100, spread: -30, color: 'rgb(0 0 0 / 0.45)' },\n { x: 0, y: 16, blur: 40, spread: -12, color: 'rgb(0 0 0 / 0.18)' },\n ],\n },\n dark: {\n sheet: [{ x: 0, y: 12, blur: 40, spread: -12, color: 'rgb(0 0 0 / 0.5)' }],\n 'sheet-inset': [{ x: 0, y: 1, blur: 1, spread: 0, color: 'rgb(255 255 255 / 0.12)', inset: true }],\n raised: [\n { x: 0, y: 4, blur: 12, spread: -2, color: 'rgb(0 0 0 / 0.5)' },\n { x: 0, y: 2, blur: 4, spread: -2, color: 'rgb(0 0 0 / 0.3)' },\n ],\n floating: [\n { x: 0, y: 12, blur: 24, spread: -8, color: 'rgb(0 0 0 / 0.6)' },\n { x: 0, y: 4, blur: 8, spread: -4, color: 'rgb(0 0 0 / 0.4)' },\n ],\n modal: [\n { x: 0, y: 40, blur: 100, spread: -30, color: 'rgb(0 0 0 / 0.7)' },\n { x: 0, y: 16, blur: 40, spread: -12, color: 'rgb(0 0 0 / 0.5)' },\n ],\n },\n },\n modeStrings: {\n light: {\n // Lit from above: bright top and start edges, grey shaded ones (top end bottom start).\n 'glass-edge': 'rgb(255 255 255 / 0.9) rgb(200 200 210 / 0.3) rgb(200 200 210 / 0.25) rgb(255 255 255 / 0.7)',\n 'glass-edge-width': '1.5px',\n // The inner highlight of raised and floating glass.\n 'glass-highlight': 'inset 0 1px 2px 0 rgb(255 255 255 / 0.8), inset 0 -1px 2px 0 rgb(0 0 0 / 0.05)',\n 'glass-fill': 'linear-gradient(135deg, rgb(255 255 255 / 0.8) 0%, rgb(220 225 240 / 0.62) 40%, rgb(240 245 255 / 0.68) 70%, rgb(255 255 255 / 0.8) 100%)',\n 'glass-fill-raised': 'linear-gradient(135deg, rgb(255 255 255 / 0.86) 0%, rgb(215 220 238 / 0.7) 40%, rgb(235 240 255 / 0.76) 70%, rgb(255 255 255 / 0.86) 100%)',\n 'mark-gradient': 'linear-gradient(135deg, #38bdf8 0%, #6366f1 40%, #a855f7 100%)',\n 'wordmark-gradient': 'linear-gradient(90deg, #0369a1, #4338ca, #7e22ce)',\n },\n dark: {\n 'glass-edge': 'rgb(255 255 255 / 0.2) rgb(255 255 255 / 0.06) rgb(255 255 255 / 0.04) rgb(255 255 255 / 0.12)',\n 'glass-edge-width': '1.5px',\n 'glass-highlight': 'inset 0 1px 1px 0 rgb(255 255 255 / 0.15)',\n 'glass-fill': 'linear-gradient(140deg, rgb(30 41 59 / 0.7) 0%, rgb(15 23 42 / 0.6) 45%, rgb(20 30 50 / 0.55) 100%)',\n 'glass-fill-raised': 'linear-gradient(140deg, rgb(30 41 59 / 0.78) 0%, rgb(15 23 42 / 0.68) 45%, rgb(20 30 50 / 0.62) 100%)',\n 'mark-gradient': 'linear-gradient(135deg, #38bdf8 0%, #6366f1 40%, #a855f7 100%)',\n 'wordmark-gradient': 'linear-gradient(90deg, #38bdf8, #818cf8, #a855f7)',\n },\n },\n // The app's type scale: 30 px display, 24 px page titles, 18 px sections, 16 px\n // sub-sections, 14 px labels, tight tracking on titles.\n strings: {\n // The display step is the 30 px wordmark of the sign-in screens.\n 'font-size-display': '30px',\n 'font-line-height-display': '36px',\n 'font-size-h1': '24px',\n 'font-line-height-h1': '32px',\n 'font-size-h2': '18px',\n 'font-line-height-h2': '28px',\n 'font-size-h3': '16px',\n 'font-line-height-h3': '24px',\n 'font-size-label': '14px',\n 'font-line-height-label': '20px',\n 'font-tracking-h1': '-0.025em',\n },\n // The platform's own UI fonts, headings included (no web font to fetch).\n fonts: {\n display: ['-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'Helvetica Neue', 'Noto Sans', 'Arial', 'sans-serif'],\n body: ['-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'Helvetica Neue', 'Noto Sans', 'Arial', 'sans-serif'],\n mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', 'monospace'],\n },\n}\n\n/**\n * Astrlabe · Sala de Controle (`data-ty-theme=\"astrlabe-controle\"`): the\n * dark-operations variant of the Astrlabe identity for control rooms and\n * monitoring walls. No glass, square corners (2 px controls), deep blue-slate\n * surfaces, and the saturated state colours of operator consoles: ok green,\n * run cyan, wait amber, fail red, now magenta. Everything renders in a\n * monospace stack so columns of numbers line up.\n */\nexport const astrlabeControlePreset: ThemeConfig = {\n name: 'astrlabe-controle',\n label: 'Astrlabe · Sala de Controle',\n seeds: {\n brand: seedFromColor('#6366f1', 0.2),\n neutral: { hue: 257, chroma: 0.02 },\n danger: { hue: 12, chroma: 0.2 },\n warning: { hue: 75, chroma: 0.15 },\n success: { hue: 145, chroma: 0.16 },\n info: { hue: 185, chroma: 0.12 },\n },\n radius: 2,\n contrast: 'default',\n glass: false,\n cta: 'solid',\n pins: {\n light: {\n // The control room is always dark: the light mode carries the same\n // dark grounds and the light-on-dark indigo brand.\n brand: '#818cf8',\n 'focus-ring': '#818cf8',\n 'brand-strong': '#a5b4fc',\n 'brand-soft': 'rgb(99 102 241 / 0.2)',\n 'on-brand': '#1e1b4b',\n bg: '#131a22',\n surface: 'rgb(26 35 46 / 1)',\n 'surface-raised': 'rgb(26 35 46 / 1)',\n 'surface-solid': '#1a232e',\n 'surface-raised-solid': '#1a232e',\n 'surface-sunken': '#0e141b',\n line: '#2e3d4c',\n 'line-strong': '#46586a',\n ink: '#e8eef4',\n 'ink-2': '#bcc9d6',\n 'ink-3': '#93a2b1',\n success: '#3fb950',\n info: '#39c5cf',\n warning: '#d29922',\n danger: '#f85149',\n neutral: '#93a2b1',\n 'cursor-now': '#e34ba9',\n },\n dark: {\n brand: '#818cf8',\n 'focus-ring': '#818cf8',\n 'brand-strong': '#a5b4fc',\n 'brand-soft': 'rgb(99 102 241 / 0.2)',\n 'on-brand': '#1e1b4b',\n bg: '#131a22',\n surface: 'rgb(26 35 46 / 1)',\n 'surface-raised': 'rgb(26 35 46 / 1)',\n 'surface-solid': '#1a232e',\n 'surface-raised-solid': '#1a232e',\n 'surface-sunken': '#0e141b',\n line: '#2e3d4c',\n 'line-strong': '#46586a',\n ink: '#e8eef4',\n 'ink-2': '#bcc9d6',\n 'ink-3': '#93a2b1',\n success: '#3fb950',\n info: '#39c5cf',\n warning: '#d29922',\n danger: '#f85149',\n neutral: '#93a2b1',\n 'cursor-now': '#e34ba9',\n },\n },\n // Mono-friendly: one monospace stack for every role.\n fonts: {\n display: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', 'monospace'],\n body: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', 'monospace'],\n mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', 'monospace'],\n },\n}\n\n/** Default hues with high contrast, opaque surfaces and a thicker focus ring. */\nexport const highContrastPreset: ThemeConfig = {\n name: 'high-contrast',\n label: 'High contrast',\n seeds: baseSeeds,\n radius: 10,\n contrast: 'high',\n glass: false,\n cta: 'solid',\n}\n\nexport const presets: readonly ThemeConfig[] = [tympanPreset, fakhirPreset, astrlabePreset, astrlabeControlePreset, neutralPreset, highContrastPreset]\nexport const DEFAULT_THEME = 'tympan'\n","// Conversion between resolved themes and W3C Design Tokens Community Group\n// (DTCG, 2025.10 format) trees: colour objects with `colorSpace` and\n// `components`, dimension objects with `value` and `unit`.\n// Every generated token carries its CSS custom property name in\n// `$extensions[\"br.com.datatechsolutions.tympan\"].cssName` so any DTCG tool maps it back exactly.\n\nimport { toHex, type Rgba } from './color.ts'\nimport { RAMP_STEPS, type Density, DENSITIES, type ResolvedTheme, type ShadowLayer } from './theme.ts'\n\nexport interface DtcgColor {\n colorSpace: 'srgb'\n components: [number, number, number]\n alpha?: number\n hex: string\n}\n\ntype Tree = { [key: string]: Tree | unknown }\n\nconst r4 = (v: number) => Math.round(v * 10000) / 10000\n\nexport function toDtcgColor(c: Rgba): DtcgColor {\n const out: DtcgColor = { colorSpace: 'srgb', components: [r4(c.r), r4(c.g), r4(c.b)], hex: toHex(c) }\n if (c.a < 1) out.alpha = r4(c.a)\n return out\n}\n\nexport function fromDtcgColor(v: DtcgColor | string): Rgba {\n if (typeof v === 'string') {\n const h = v.replace('#', '')\n return { r: parseInt(h.slice(0, 2), 16) / 255, g: parseInt(h.slice(2, 4), 16) / 255, b: parseInt(h.slice(4, 6), 16) / 255, a: 1 }\n }\n const [r, g, b] = v.components\n return { r, g, b, a: v.alpha ?? 1 }\n}\n\nconst px = (value: number) => ({ value, unit: 'px' as const })\nconst ext = (cssName: string) => ({ 'br.com.datatechsolutions.tympan': { cssName } })\n\nfunction shadowValue(layers: ShadowLayer[]) {\n return layers.map((l) => ({\n color: toDtcgColor(l.color),\n offsetX: px(l.x),\n offsetY: px(l.y),\n blur: px(l.blur),\n spread: px(l.spread),\n ...(l.inset ? { inset: true } : {}),\n }))\n}\n\n/** DTCG tree for one resolved theme and mode. */\nexport function themeToDtcg(t: ResolvedTheme): Tree {\n const color: Tree = { $type: 'color' }\n for (const [name, c] of Object.entries(t.colors)) {\n color[name] = { $value: toDtcgColor(c), $extensions: ext(`--ty-${name}`) }\n }\n const ramp: Tree = { $type: 'color' }\n for (const [seed, steps] of Object.entries(t.ramps)) {\n const group: Tree = {}\n for (const step of RAMP_STEPS) group[String(step)] = { $value: toDtcgColor(steps[step]), $extensions: ext(`--ty-${seed}-${step}`) }\n ramp[seed] = group\n }\n const shadow: Tree = { $type: 'shadow' }\n for (const [name, layers] of Object.entries(t.shadows)) {\n shadow[name] = { $value: shadowValue(layers), $extensions: ext(`--ty-shadow-${name}`) }\n }\n const dimension: Tree = { $type: 'dimension' }\n for (const [name, v] of Object.entries(t.dimensions)) dimension[name] = { $value: px(v), $extensions: ext(`--ty-${name}`) }\n const number: Tree = { $type: 'number' }\n for (const [name, v] of Object.entries(t.numbers)) number[name] = { $value: v, $extensions: ext(`--ty-${name}`) }\n \n \n const fontFamily: Tree = { $type: 'fontFamily' }\n for (const [name, list] of Object.entries(t.fonts)) fontFamily[name] = { $value: [...list], $extensions: ext(`--ty-font-${name}`) }\n return {\n $description: `Theme ${t.name}, ${t.mode} mode, ${t.contrast} contrast. Generated by @datatechsolutions/tympan-tokens.`,\n color,\n ramp,\n gradient: {\n $type: 'gradient',\n cta: {\n $value: t.cta.stops.map((s, i, all) => ({ color: toDtcgColor(s), position: all.length === 1 ? 0 : r4(i / (all.length - 1)) })),\n $extensions: { 'br.com.datatechsolutions.tympan': { cssName: '--ty-cta', angle: t.cta.angle } },\n },\n },\n shadow,\n dimension,\n number,\n ...(Object.keys(t.fonts).length ? { fontFamily } : {})\n }\n}\n\n/** DTCG tree for one density step. */\nexport function densityToDtcg(density: Density): Tree {\n const group: Tree = { $type: 'dimension' }\n for (const [k, v] of Object.entries(DENSITIES[density])) {\n group[k] =\n k === 'density'\n ? { $type: 'number', $value: v, $extensions: ext(`--ty-${k}`) }\n : { $value: px(v), $extensions: ext(`--ty-${k}`) }\n }\n return { $description: `Density ${density}.`, density: group }\n}\n","// Book-style presets for @datatechsolutions/tympan-print: fonts, paper and ink,\n// data and proof-state colours, texture, stroke and the chart renderer of each\n// diagramming style. The first eleven reproduce the author's earlier visual\n// studies (diagramacao/estilos/); the rest are new\n// interpretations of published design traditions. Style ids and labels are\n// neutral, descriptive names; the tradition a style draws on is named only in\n// its `referencia` (\"inspirado em …\"). Renamed ids stay accepted as deprecated\n// aliases (PRINT_STYLE_ALIASES). Fonts are Google Fonts families under the OFL.\n//\n// `printStyleToCss` turns a preset (with optional overrides and a black and\n// white variant) into `--ty-print-*` custom properties on\n// `[data-ty-print-style=\"<name>\"]`.\n\nimport { luminance, parseColor, toHex, type Rgba } from './color.ts'\nimport { PRINT_STYLE_ALIASES, warnDeprecatedPrintId, type PrintStyleAlias } from './print-aliases.ts'\n\nexport type RenderizadorGrafico = 'limpo' | 'mao' | 'isotype' | 'gravura' | 'prancheta' | 'aquarela' | 'riso' | 'pontos'\nexport type MarcaProva = 'pilula' | 'carimbo' | 'circulo' | 'sublinhado' | 'barra' | 'etiqueta' | 'formas' | 'ponto'\nexport type EstadoProva = 'sustentada' | 'refutada' | 'nao-da-para-afirmar' | 'pendente' | 'sem-dado' | 'nao-testada'\n\nexport const ESTADOS_PROVA: readonly EstadoProva[] = ['sustentada', 'refutada', 'nao-da-para-afirmar', 'pendente', 'sem-dado', 'nao-testada']\n\n/** The word printed for each proof state (always visible, whatever the mark's shape). */\nexport const ROTULOS_PROVA: Record<EstadoProva, string> = {\n sustentada: 'Sustentada',\n refutada: 'Refutada',\n 'nao-da-para-afirmar': 'Não dá para afirmar',\n pendente: 'Pendente',\n 'sem-dado': 'Sem dado',\n 'nao-testada': 'Não testada',\n}\n\nexport interface PrintFontes {\n titulo: string\n corpo: string\n numero: string\n rotulo: string\n anotacao: string\n mono: string\n}\n\nexport interface PrintCores {\n papel: string\n tinta: string\n tinta2: string\n tinta3: string\n linha: string\n destaque: string\n destaque2: string\n marcaTexto: string\n contexto: string\n prova: Record<EstadoProva, string>\n /** Colours of page ornaments only (frames, tiles, waves); never data. Up to four. */\n ornamento?: string[]\n}\n\n/** Partial colours: any role, and any subset of the proof states. */\nexport type PrintCoresParciais = Partial<Omit<PrintCores, 'prova'>> & { prova?: Partial<Record<EstadoProva, string>> }\n\nexport type TexturaPapel = 'nenhuma' | 'grao' | 'pauta' | 'milimetrado' | 'fibra'\nexport type Hachura = 'nenhuma' | 'simples' | 'cruzada' | 'pontilhada' | 'goiva'\n\n/**\n * Page structure of a style (addition to the contract, see CONTRATO.md):\n * how panels are framed, how the panel letter is drawn, where notes go, how a\n * figure is marked and how panel labels are cased.\n */\nexport interface PrintEstrutura {\n /** Panel frame: top rule, heavy top rule, box, heavy box, drafting board, soft card, flat title band or none. */\n painel: 'fio' | 'fio-grosso' | 'caixa' | 'caixa-grossa' | 'prancha' | 'cartao' | 'bloco' | 'nenhum' | 'dossie' | 'placa'\n /** Panel letter: plain, in a filled square, in a circle, in parentheses. */\n rotulo: 'letra' | 'quadrado' | 'circulo' | 'parenteses'\n /** Casing of panel labels and eyebrows. */\n rotuloCaixa: 'alta' | 'versalete' | 'normal'\n /** Annotations inside the flow, or as notes in the outer margin (minimo-de-tinta). */\n notas: 'dentro' | 'margem'\n /** Figure mark: none; a short bar and rule on top (semanario); range frame, no grid (minimo-de-tinta). */\n figura: 'simples' | 'barra-topo' | 'amplitude'\n /** Titles and labels in lower case (diagrama-modernista, concrete design). */\n minusculas: boolean\n /** Bar charts drawn as horizontal bars (default) or vertical columns. Lengths come from the data either way. */\n barras?: 'horizontal' | 'vertical'\n /** Page ornament drawn in the margins, outside the type area (never over data). */\n moldura?: Moldura\n /** Running head: plain text (default), a full-width band (mapa-de-metro, constructivism) or a tag with an arrow (signage). */\n cabeco?: 'texto' | 'faixa' | 'etiqueta'\n /**\n * Title treatment: cut-paper word blocks, a band with a hard shadow, an offset colour shadow, the ornament colours;\n * italic (minimo-de-tinta), centred capitals with wide spacing (graficos-1900), centred italic (fluxo-historico), heavier and larger\n * (constructivism), set from the third column (Swiss grid), or underlined by hand (caderno).\n */\n tituloEstilo?: 'normal' | 'recorte' | 'faixa' | 'sombra' | 'arcoiris' | 'italico' | 'centro' | 'centro-italico' | 'pesado' | 'coluna3' | 'sublinhado'\n /** Fill of the square or round panel letter. */\n corRotulo?: 'destaque' | 'destaque2' | 'tinta' | 'marcaTexto' | 'sustentada' | 'refutada'\n /** Bars get an ink outline (Memphis, pop art). */\n contornoBarra?: boolean\n /**\n * Signature shape of the comparison chart (G1 of the style audit). Default: 'barras' ('colunas' when\n * `barras` is 'vertical'). Every shape keeps position and size from the data; see FormaGrafico.\n */\n forma?: FormaGrafico\n /** A line at the cut between the two columns of each group: dashed (minimo-de-tinta, infografico-ilustrado) or solid (diagrama-modernista). */\n linhaCorte?: 'tracejada' | 'cheia'\n /** A marker on the end of each column (diagrama-modernista: a circle). */\n marcador?: 'circulo'\n /** Thin columns (minimo-de-tinta). */\n colunasFinas?: boolean\n /**\n * Callouts drawn inside the chart (G3): numbered list under the plot (default), handwritten notes with an\n * arrow and the value circled (caderno), speech balloons (divulgação, infografico-ilustrado) or text with a leader line (papel-salmao).\n */\n chamadas?: 'numeradas' | 'manuscritas' | 'baloes' | 'guia'\n /** Two figures of one panel stacked (default) or side by side as small multiples. */\n multiplos?: 'empilhados' | 'lado-a-lado'\n /** A letter (A, B…) on each small multiple (scientific figure). */\n letraMultiplo?: boolean\n // Page composition (G2, G4–G8 of the style audit, drawn by tympan-print's page and panel components).\n /** Emblem beside the spread title: decoration in ornament or ink colours, never data. */\n emblema?: Emblema\n /** Panel fills: a pale tint (pictogramas), alternating tints (diagrama-modernista, proporcao-modular, blocos-coloridos, divulgação) or halftone dots (riso). */\n fundoPainel?: 'claro' | 'alternado' | 'pontilhado'\n /** The verdict panel (e): a dark block (mapa-de-metro, sinalizacao, concretism, blocos-coloridos) or a block in the highlighter tint (riso). */\n veredito?: 'bloco-escuro' | 'bloco-cor'\n /** The linking paragraph under a and b: a highlight band (bauhaus), a dark block (constructivism), a thick bar (concretism, proporcao-modular) or a \"você sabia?\" tag (divulgação). */\n costura?: 'faixa' | 'bloco-escuro' | 'barra' | 'selo'\n /** Headline of the method figures: plain, on a band, on a tilted band (constructivism), with a magnifier (divulgação). */\n manchete?: 'texto' | 'faixa' | 'diagonal' | 'lupa'\n /** The trace of a number (g): a list (default), a metro line with stations (mapa-de-metro) or signage plates (sinalizacao). */\n rastro?: 'lista' | 'metro' | 'placa'\n /** Notes of a figure under it (default) or in a column beside it headed \"Leia assim\" (Dados BR). */\n notasFigura?: 'dentro' | 'coluna'\n /** The key numbers (b) marked with the highlighter (caderno). */\n numerosMarcados?: boolean\n /**\n * How a chart highlights: every row in its series colours (default, most studies) or the highlighted row in\n * the accent against the others in ink (NYT Upshot, Tufte).\n */\n realce?: 'serie' | 'linha'\n /** Head of each small multiple: plain title (default), a band in the highlighter colour with an arrow (Schiphol), a dark band (Vignelli), a band in the ornament colour (Aicher), each multiple on its own tinted card (Le Corbusier, Bayer). */\n cabecaMultiplo?: 'titulo' | 'faixa' | 'faixa-escura' | 'faixa-cor' | 'caixa-cor'\n}\n\n/**\n * Emblems drawn beside a spread title (tympan-print Emblema). `'modulor'` is\n * the deprecated name of `'figura-modular'`, still drawn the same; it will be\n * removed with the style aliases (see PRINT_STYLE_ALIASES).\n */\nexport type Emblema = 'pictogramas' | 'formas' | 'circulo-bicolor' | 'figura-modular' | 'casa' | 'lupa' | 'predios' | 'modulor'\n\n/**\n * Shapes of the comparison chart. Lengths, heights and thicknesses always come from the data through one\n * linear scale per figure; the shape only decides how the two series are laid out.\n * - 'barras': horizontal bars from zero. 'colunas': vertical columns.\n * - 'eixo-central': the cut is the axis; the series below the cut grows to the left, the one above to the right.\n * - 'ziguezague': a bar longer than one line folds back and forth (graficos-1900); total length = value.\n * - 'fluxo': bands whose thickness is the value, splitting at the cut (fluxo-historico).\n * - 'predios': columns drawn as buildings (height = value; windows are texture only).\n * - 'cartoes': one card per row with the numbers written large and mini columns on a shared scale.\n * - 'halteres': a dumbbell per row, two dots joined on one axis (NYT Upshot; the only shape that keeps a\n * dumbbell spec as drawn). Every other shape redraws a zero-based dumbbell as its own comparison.\n */\nexport type FormaGrafico = 'barras' | 'colunas' | 'eixo-central' | 'ziguezague' | 'fluxo' | 'predios' | 'cartoes' | 'halteres'\n\n/** Page ornaments (optional, CONTRATO §1). */\nexport type Moldura =\n | 'nenhuma'\n | 'dupla' // double rule frame (fluxo-historico)\n | 'regua' // cartographic neatline with alternating segments (atlas)\n | 'azulejo' // column of modernist tiles (azulejo-modernista)\n | 'ondas' // wavy stripes (tropicalia)\n | 'ramos' // vine with leaves and a rounded frame (art nouveau)\n | 'recortes' // torn paper strips (papel-recortado)\n | 'reticula' // halftone dot columns (pop art)\n | 'memphis' // zigzags, triangles, circles and confetti\n | 'diagonais' // header wedges and a diagonal bar (constructivism)\n | 'formas' // triangle, square and circle (Bauhaus)\n | 'quartos' // quarter circles in the page corners (diagrama-modernista)\n\nexport interface PrintStyle {\n /** Stable id, e.g. 'jornal'. */\n name: string\n /** Human label, e.g. \"Editorial de jornal\". */\n label: string\n /** What the style reproduces or interprets. */\n referencia: string\n /** CSS font stacks. */\n fontes: PrintFontes\n /** Google Fonts css2 family specs (`Family Name:axes@values`); empty for system fonts only. */\n googleFonts: string[]\n cor: PrintCores\n papel: { textura: TexturaPapel; intensidade: number }\n /** Stroke width in mm, tremor 0..2 (0 = ruled), hatching of the second series. */\n traco: { largura: number; tremor: number; hachura: Hachura }\n grafico: RenderizadorGrafico\n marcaProva: MarcaProva\n /** Corner radius in mm; 0 for square styles. */\n raio: number\n /** Chapter and spread titles in capitals. */\n caixaAlta: boolean\n /** Adjustments for black and white print, applied after the grey conversion. */\n pb: PrintCoresParciais\n estrutura: PrintEstrutura\n /**\n * Brand marks in colour (default) or in their official one-ink version,\n * for styles whose technique is one or two inks (woodcut, risograph,\n * cyanotype). The lakebrasil mark is never recoloured; the Datatech mark\n * has approved variations (ink, duotone, per style), see LogoDatatech.\n */\n logo?: 'cor' | 'mono'\n}\n\n/** Any token of a style may be overridden by the editor (partial, nested). */\nexport interface PrintStyleOverrides {\n label?: string\n fontes?: Partial<PrintFontes>\n googleFonts?: string[]\n cor?: PrintCoresParciais\n papel?: Partial<PrintStyle['papel']>\n traco?: Partial<PrintStyle['traco']>\n grafico?: RenderizadorGrafico\n marcaProva?: MarcaProva\n raio?: number\n caixaAlta?: boolean\n pb?: PrintCoresParciais\n estrutura?: Partial<PrintEstrutura>\n logo?: 'cor' | 'mono'\n}\n\n// ---------------------------------------------------------------------------\n// Font stacks\n// ---------------------------------------------------------------------------\n\nconst SERIF = 'Georgia, \"Times New Roman\", serif'\nconst SANS = 'system-ui, \"Helvetica Neue\", Arial, sans-serif'\nconst MONO = 'ui-monospace, \"SFMono-Regular\", Menlo, monospace'\nconst HAND = '\"Comic Neue\", \"Segoe Print\", cursive'\nconst f = (family: string, fallback: string) => `\"${family}\", ${fallback}`\n\nconst PLEX_MONO = 'IBM Plex Mono:wght@400;500'\n\n// ---------------------------------------------------------------------------\n// The presets\n// ---------------------------------------------------------------------------\n\nconst dashboard: PrintStyle = {\n name: 'dashboard',\n label: 'Dashboard editorial',\n referencia: 'Painéis de pesquisa: cartões, estado de prova em pílula, gráfico sóbrio; inspirado em painéis da plataforma Fakhir',\n fontes: {\n titulo: f('Source Serif 4', SERIF),\n corpo: f('IBM Plex Sans', SANS),\n numero: f('IBM Plex Sans', SANS),\n rotulo: f('IBM Plex Sans', SANS),\n anotacao: f('Source Serif 4', SERIF),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: [\n 'Source Serif 4:ital,opsz,wght@0,8..60,400;0,8..60,600;1,8..60,400',\n 'IBM Plex Sans:ital,wght@0,400;0,500;0,600;0,700;1,400',\n PLEX_MONO,\n ],\n cor: {\n papel: '#f7f4ee',\n tinta: '#1c1a17',\n tinta2: '#3d3933',\n tinta3: '#5f594f',\n linha: '#d6cfc2',\n destaque: '#1c1a17',\n destaque2: '#9a4f2a',\n marcaTexto: '#f3e6cf',\n contexto: '#8f877a',\n prova: {\n sustentada: '#3d6b1f',\n refutada: '#a3302a',\n 'nao-da-para-afirmar': '#8a5a0f',\n pendente: '#8a5a0f',\n 'sem-dado': '#5f594f',\n 'nao-testada': '#5f594f',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.25, tremor: 0, hachura: 'simples' },\n grafico: 'limpo',\n marcaProva: 'pilula',\n raio: 1.6,\n caixaAlta: false,\n pb: {},\n estrutura: { painel: 'nenhum', rotulo: 'letra', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false },\n}\n\nconst graficos1900: PrintStyle = {\n name: 'graficos-1900',\n label: 'Gráficos de exposição (1900)',\n referencia: 'Pranchas estatísticas de exposição universal: letreiro à mão, cores chapadas, papel pardo; inspirado em W. E. B. Du Bois (pranchas para a Exposição de Paris de 1900)',\n fontes: {\n titulo: f('Rubik Mono One', SANS),\n corpo: f('Literata', SERIF),\n numero: f('Rubik Mono One', SANS),\n rotulo: f('Patrick Hand SC', HAND),\n anotacao: f('Patrick Hand SC', HAND),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: ['Rubik Mono One', 'Literata:ital,opsz,wght@0,7..72,400;0,7..72,600;1,7..72,400', 'Patrick Hand SC', PLEX_MONO],\n cor: {\n papel: '#eadfc8',\n tinta: '#1d1a16',\n tinta2: '#342e27',\n tinta3: '#564a3d',\n linha: '#1d1a16',\n destaque: '#c23b2e',\n destaque2: '#c98a2b',\n marcaTexto: '#dcc690',\n contexto: '#7a5a3e',\n prova: {\n sustentada: '#3e6a48',\n refutada: '#a8342a',\n 'nao-da-para-afirmar': '#6f4a2e',\n pendente: '#6f4a2e',\n 'sem-dado': '#1d1a16',\n 'nao-testada': '#1d1a16',\n },\n },\n papel: { textura: 'fibra', intensidade: 0.55 },\n traco: { largura: 0.45, tremor: 0.7, hachura: 'nenhuma' },\n grafico: 'mao',\n marcaProva: 'carimbo',\n raio: 0,\n caixaAlta: true,\n pb: { destaque: '#3a3a3a', destaque2: '#9a9a9a' },\n estrutura: { painel: 'caixa-grossa', rotulo: 'letra', rotuloCaixa: 'versalete', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'ziguezague', tituloEstilo: 'centro' },\n}\n\nconst cartaoPostal: PrintStyle = {\n name: 'cartao-postal',\n label: 'Cartão-postal desenhado à mão',\n referencia: 'Cartões-postais de dados desenhados à mão: um ponto por registro, legenda à mão; inspirado em Dear Data (Giorgia Lupi e Stefanie Posavec, 2016)',\n fontes: {\n titulo: f('Newsreader', SERIF),\n corpo: f('Newsreader', SERIF),\n numero: f('Caveat', HAND),\n rotulo: f('Caveat', HAND),\n anotacao: f('Caveat', HAND),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: [\n 'Newsreader:ital,opsz,wght@0,6..72,300;0,6..72,400;0,6..72,600;1,6..72,300;1,6..72,400',\n 'Caveat:wght@400;600',\n PLEX_MONO,\n ],\n cor: {\n papel: '#fbf9f3',\n tinta: '#24211e',\n tinta2: '#45413c',\n tinta3: '#625e58',\n linha: '#3a3632',\n destaque: '#3d3fa0',\n destaque2: '#c9462b',\n marcaTexto: '#f1e7c4',\n contexto: '#9a958c',\n prova: {\n sustentada: '#3d3fa0',\n refutada: '#b53d25',\n 'nao-da-para-afirmar': '#24211e',\n pendente: '#45413c',\n 'sem-dado': '#24211e',\n 'nao-testada': '#24211e',\n },\n },\n papel: { textura: 'grao', intensidade: 0.35 },\n traco: { largura: 0.3, tremor: 1, hachura: 'nenhuma' },\n grafico: 'pontos',\n marcaProva: 'circulo',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#1a1a1a', destaque2: '#8a8a8a' },\n estrutura: { painel: 'caixa', rotulo: 'parenteses', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'eixo-central' },\n}\n\nconst caderno: PrintStyle = {\n name: 'caderno',\n label: 'Caderno de campo',\n referencia: 'Caderno pautado de pesquisa: lápis, hachura cruzada, caneta vermelha e marca-texto',\n fontes: {\n titulo: f('Source Serif 4', SERIF),\n corpo: f('Source Serif 4', SERIF),\n numero: f('Kalam', HAND),\n rotulo: f('Kalam', HAND),\n anotacao: f('Gochi Hand', HAND),\n mono: f('Courier Prime', MONO),\n },\n googleFonts: [\n 'Source Serif 4:ital,opsz,wght@0,8..60,400;0,8..60,600;0,8..60,700;1,8..60,400',\n 'Kalam:wght@400;700',\n 'Gochi Hand',\n 'Courier Prime:wght@400;700',\n ],\n cor: {\n papel: '#f7f2e4',\n tinta: '#2b2b2b',\n tinta2: '#454545',\n tinta3: '#625d54',\n linha: '#474747',\n destaque: '#2b2b2b',\n destaque2: '#b8322a',\n marcaTexto: '#fff45c',\n contexto: '#6b665c',\n prova: {\n sustentada: '#2b2b2b',\n refutada: '#b0302a',\n 'nao-da-para-afirmar': '#2b2b2b',\n pendente: '#625d54',\n 'sem-dado': '#454545',\n 'nao-testada': '#454545',\n },\n },\n papel: { textura: 'pauta', intensidade: 0.6 },\n traco: { largura: 0.3, tremor: 1.2, hachura: 'cruzada' },\n grafico: 'mao',\n marcaProva: 'circulo',\n raio: 0,\n caixaAlta: false,\n pb: { destaque2: '#3a3a3a', marcaTexto: '#dddddd' },\n estrutura: { painel: 'caixa', rotulo: 'parenteses', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'colunas', chamadas: 'manuscritas', multiplos: 'lado-a-lado', tituloEstilo: 'sublinhado', numerosMarcados: true },\n}\n\nconst isotype: PrintStyle = {\n name: 'isotype',\n label: 'Isotype',\n referencia: 'Estatística em pictogramas (Viena, 1925-1934): um ícone = uma quantidade fixa; inspirado em Otto e Marie Neurath e Gerd Arntz',\n fontes: {\n titulo: f('Jost', SANS),\n corpo: f('Jost', SANS),\n numero: f('Jost', SANS),\n rotulo: f('Jost', SANS),\n anotacao: f('Jost', SANS),\n mono: f('Jost', SANS),\n },\n googleFonts: ['Jost:ital,wght@0,400;0,500;0,600;0,700;1,400'],\n cor: {\n papel: '#f3eee2',\n tinta: '#1c1b19',\n tinta2: '#383632',\n tinta3: '#5f5a50',\n linha: '#1c1b19',\n destaque: '#1c1b19',\n destaque2: '#c73a2c',\n marcaTexto: '#e4dcc8',\n contexto: '#8a8577',\n prova: {\n sustentada: '#1c1b19',\n refutada: '#b3342a',\n 'nao-da-para-afirmar': '#1c1b19',\n pendente: '#383632',\n 'sem-dado': '#5f5a50',\n 'nao-testada': '#1c1b19',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.5, tremor: 0, hachura: 'simples' },\n grafico: 'isotype',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque2: '#8c8c8c' },\n estrutura: { painel: 'fio-grosso', rotulo: 'quadrado', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false },\n}\n\nconst cordel: PrintStyle = {\n name: 'cordel',\n label: 'Cordel',\n referencia: 'Xilogravura de cordel: papel pardo, goiva, letreiro em laje; inspirado em J. Borges e Gilvan Samico',\n fontes: {\n titulo: f('Alfa Slab One', SERIF),\n corpo: f('Alegreya', SERIF),\n numero: f('Alfa Slab One', SERIF),\n rotulo: f('Alegreya SC', SERIF),\n anotacao: f('Alegreya', SERIF),\n mono: f('Courier Prime', MONO),\n },\n googleFonts: ['Alfa Slab One', 'Alegreya:ital,wght@0,400;0,500;0,700;1,400', 'Alegreya SC:wght@500;700', 'Courier Prime'],\n cor: {\n papel: '#dcc79c',\n tinta: '#15110d',\n tinta2: '#2c2219',\n tinta3: '#4a3a29',\n linha: '#15110d',\n destaque: '#15110d',\n destaque2: '#15110d',\n marcaTexto: '#c9ae78',\n contexto: '#5a4632',\n prova: {\n sustentada: '#15110d',\n refutada: '#15110d',\n 'nao-da-para-afirmar': '#15110d',\n pendente: '#2c2219',\n 'sem-dado': '#15110d',\n 'nao-testada': '#15110d',\n },\n },\n papel: { textura: 'fibra', intensidade: 0.8 },\n traco: { largura: 0.6, tremor: 0.9, hachura: 'goiva' },\n grafico: 'gravura',\n marcaProva: 'carimbo',\n raio: 0,\n caixaAlta: false,\n pb: {},\n estrutura: { painel: 'caixa-grossa', rotulo: 'quadrado', rotuloCaixa: 'versalete', notas: 'dentro', figura: 'simples', minusculas: false, emblema: 'casa' },\n logo: 'mono',\n}\n\nconst riso: PrintStyle = {\n name: 'riso',\n label: 'Risografia',\n referencia: 'Impressão em risógrafo a duas tintas (azul e rosa fluorescente): grão, meio-tom e registro solto',\n fontes: {\n titulo: f('Bricolage Grotesque', SANS),\n corpo: f('Archivo', SANS),\n numero: f('Bricolage Grotesque', SANS),\n rotulo: f('Archivo', SANS),\n anotacao: f('Space Mono', MONO),\n mono: f('Space Mono', MONO),\n },\n googleFonts: [\n 'Bricolage Grotesque:opsz,wdth,wght@12..96,75..100,400..800',\n 'Archivo:ital,wdth,wght@0,62..125,400;0,62..125,600;1,62..125,400',\n 'Space Mono',\n ],\n cor: {\n papel: '#f5f1e8',\n tinta: '#3d3fa0',\n tinta2: '#3d3fa0',\n tinta3: '#4f51a3',\n linha: '#3d3fa0',\n destaque: '#3d3fa0',\n destaque2: '#ff48b0',\n marcaTexto: '#ffd3ea',\n contexto: '#9a8fc4',\n prova: {\n sustentada: '#3d3fa0',\n refutada: '#c8187a',\n 'nao-da-para-afirmar': '#3d3fa0',\n pendente: '#3d3fa0',\n 'sem-dado': '#3d3fa0',\n 'nao-testada': '#3d3fa0',\n },\n },\n papel: { textura: 'grao', intensidade: 0.6 },\n traco: { largura: 0.5, tremor: 0, hachura: 'pontilhada' },\n grafico: 'riso',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { tinta: '#1a1a1a', tinta2: '#1a1a1a', tinta3: '#3a3a3a', linha: '#1a1a1a', destaque: '#1a1a1a', destaque2: '#8a8a8a' },\n estrutura: { painel: 'caixa', rotulo: 'circulo', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, fundoPainel: 'pontilhado', veredito: 'bloco-cor' },\n logo: 'mono',\n}\n\nconst jornal: PrintStyle = {\n name: 'jornal',\n label: 'Editorial de jornal',\n referencia: 'Gráficos editoriais de jornal: serifa no texto, grotesca nos números, um acento; inspirado em gráficos do NYT The Upshot (Amanda Cox, Kevin Quealy), do The Pudding e da Folha de S.Paulo',\n fontes: {\n titulo: f('Newsreader', SERIF),\n corpo: f('Newsreader', SERIF),\n numero: f('Libre Franklin', SANS),\n rotulo: f('Libre Franklin', SANS),\n anotacao: f('Newsreader', SERIF),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: [\n 'Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,500;0,6..72,600;0,6..72,700;1,6..72,400;1,6..72,500',\n 'Libre Franklin:ital,wght@0,400;0,500;0,600;0,700;1,400',\n PLEX_MONO,\n ],\n cor: {\n papel: '#fdfcfa',\n tinta: '#121212',\n tinta2: '#3d3d3d',\n tinta3: '#636363',\n linha: '#cfcfcf',\n destaque: '#c8431f',\n destaque2: '#121212',\n marcaTexto: '#f7e4db',\n contexto: '#b0b0b0',\n prova: {\n sustentada: '#121212',\n refutada: '#b83c1b',\n 'nao-da-para-afirmar': '#121212',\n pendente: '#636363',\n 'sem-dado': '#636363',\n 'nao-testada': '#636363',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.25, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'pilula',\n raio: 3,\n caixaAlta: false,\n pb: { destaque: '#121212' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'halteres', realce: 'linha' },\n}\n\nconst prancheta: PrintStyle = {\n name: 'prancheta',\n label: 'Prancheta (cianotipia)',\n referencia: 'Desenho técnico em cópia heliográfica: papel azul, milimetrado, cotas e letreiro normógrafo',\n fontes: {\n titulo: f('Share Tech Mono', MONO),\n corpo: f('IBM Plex Sans Condensed', SANS),\n numero: f('Share Tech Mono', MONO),\n rotulo: f('Share Tech Mono', MONO),\n anotacao: f('IBM Plex Sans Condensed', SANS),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: ['Share Tech Mono', 'IBM Plex Sans Condensed:ital,wght@0,400;0,500;1,400', PLEX_MONO],\n cor: {\n papel: '#1d4b8f',\n tinta: '#f6f4ea',\n tinta2: '#e2dfd3',\n tinta3: '#d9d6c8',\n linha: '#f6f4ea',\n destaque: '#f6f4ea',\n destaque2: '#ece9dc',\n marcaTexto: '#4d5d78',\n contexto: '#c9c5b5',\n prova: {\n sustentada: '#f6f4ea',\n refutada: '#f6f4ea',\n 'nao-da-para-afirmar': '#f6f4ea',\n pendente: '#e2dfd3',\n 'sem-dado': '#e2dfd3',\n 'nao-testada': '#e2dfd3',\n },\n },\n papel: { textura: 'milimetrado', intensidade: 0.7 },\n traco: { largura: 0.25, tremor: 0, hachura: 'simples' },\n grafico: 'prancheta',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: true,\n // In black and white the blueprint becomes a white sheet with black ink.\n pb: {\n papel: '#ffffff',\n tinta: '#111111',\n tinta2: '#333333',\n tinta3: '#555555',\n linha: '#111111',\n destaque: '#111111',\n destaque2: '#444444',\n marcaTexto: '#eeeeee',\n contexto: '#9a9a9a',\n prova: { sustentada: '#111111', refutada: '#111111', 'nao-da-para-afirmar': '#111111', pendente: '#333333', 'sem-dado': '#333333', 'nao-testada': '#333333' },\n },\n estrutura: { painel: 'prancha', rotulo: 'circulo', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false },\n logo: 'mono',\n}\n\nconst pranchetaClara: PrintStyle = {\n ...prancheta,\n name: 'prancheta-clara',\n label: 'Prancheta clara',\n referencia: 'Desenho técnico em papel vegetal claro: tinta azul, milimetrado, cotas e letreiro normógrafo',\n cor: {\n papel: '#f6f7f4',\n tinta: '#1f4787',\n tinta2: '#2f5390',\n tinta3: '#4a669a',\n linha: '#1f4787',\n destaque: '#2e3192',\n destaque2: '#2e3192',\n marcaTexto: '#e2dfd3',\n contexto: '#9aa3c4',\n prova: {\n sustentada: '#2e3192',\n refutada: '#2e3192',\n 'nao-da-para-afirmar': '#2e3192',\n pendente: '#2e3192',\n 'sem-dado': '#2e3192',\n 'nao-testada': '#2e3192',\n },\n },\n papel: { textura: 'milimetrado', intensidade: 0.6 },\n pb: { destaque: '#1a1a1a', destaque2: '#1a1a1a' },\n}\n\nconst aquarela: PrintStyle = {\n name: 'aquarela',\n label: 'Aquarela',\n referencia: 'Caderno de aquarela: papel de algodão, lavagens de índigo e siena com borda de pigmento, legenda à mão',\n fontes: {\n titulo: f('Cormorant Garamond', SERIF),\n corpo: f('Crimson Pro', SERIF),\n numero: f('Caveat', HAND),\n rotulo: f('Caveat', HAND),\n anotacao: f('Caveat', HAND),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: [\n 'Cormorant Garamond:ital,wght@0,500;0,600;1,500;1,600',\n 'Crimson Pro:ital,wght@0,400;0,500;0,600;1,400',\n 'Caveat:wght@500;700',\n PLEX_MONO,\n ],\n cor: {\n papel: '#fbf7ee',\n tinta: '#2e2520',\n tinta2: '#4a3d33',\n tinta3: '#635446',\n linha: '#2e2520',\n destaque: '#5b5fa8',\n destaque2: '#cf8448',\n marcaTexto: '#efe0b0',\n contexto: '#b8ab98',\n prova: {\n sustentada: '#3e6a48',\n refutada: '#a4442a',\n 'nao-da-para-afirmar': '#7a5a1c',\n pendente: '#7a5a1c',\n 'sem-dado': '#635446',\n 'nao-testada': '#635446',\n },\n },\n papel: { textura: 'fibra', intensidade: 0.6 },\n traco: { largura: 0.35, tremor: 0.8, hachura: 'nenhuma' },\n grafico: 'aquarela',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#5a5a5a', destaque2: '#b0b0b0' },\n estrutura: { painel: 'caixa', rotulo: 'parenteses', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'colunas', multiplos: 'lado-a-lado', tituloEstilo: 'italico' },\n}\n\nconst minimoDeTinta: PrintStyle = {\n name: 'minimo-de-tinta',\n label: 'Mínimo de tinta',\n referencia: 'Pouca tinta, notas na margem, pequenos múltiplos, moldura de amplitude; inspirado em Edward Tufte (The Visual Display of Quantitative Information, Beautiful Evidence)',\n fontes: {\n titulo: f('EB Garamond', SERIF),\n corpo: f('EB Garamond', SERIF),\n numero: f('EB Garamond', SERIF),\n rotulo: f('EB Garamond', SERIF),\n anotacao: f('EB Garamond', SERIF),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: ['EB Garamond:ital,wght@0,400;0,500;0,600;1,400;1,500', PLEX_MONO],\n cor: {\n papel: '#fffff8',\n tinta: '#111111',\n tinta2: '#333333',\n tinta3: '#575757',\n linha: '#bdbdb5',\n destaque: '#a3261c',\n destaque2: '#111111',\n marcaTexto: '#f3efd6',\n contexto: '#a6a6a0',\n prova: {\n sustentada: '#111111',\n refutada: '#a3261c',\n 'nao-da-para-afirmar': '#333333',\n pendente: '#575757',\n 'sem-dado': '#575757',\n 'nao-testada': '#575757',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.15, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'etiqueta',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#111111' },\n estrutura: { painel: 'nenhum', rotulo: 'letra', rotuloCaixa: 'versalete', notas: 'margem', figura: 'amplitude', minusculas: false, forma: 'colunas', colunasFinas: true, linhaCorte: 'tracejada', tituloEstilo: 'italico', realce: 'linha' },\n}\n\nconst suico: PrintStyle = {\n name: 'suico',\n label: 'Estilo Suíço',\n referencia: 'Estilo tipográfico internacional: grade rígida, grotesca, assimetria, um vermelho; inspirado em Josef Müller-Brockmann (Grid Systems, 1981)',\n fontes: {\n titulo: f('Archivo', SANS),\n corpo: f('Archivo', SANS),\n numero: f('Archivo', SANS),\n rotulo: f('Archivo', SANS),\n anotacao: f('Archivo', SANS),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: ['Archivo:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400', PLEX_MONO],\n cor: {\n papel: '#fbfbf9',\n tinta: '#0d0d0d',\n tinta2: '#2e2e2e',\n tinta3: '#595959',\n linha: '#0d0d0d',\n destaque: '#0d0d0d',\n destaque2: '#e0261b',\n marcaTexto: '#f9d7d2',\n contexto: '#b5b5b0',\n prova: {\n sustentada: '#0d0d0d',\n refutada: '#c8150b',\n 'nao-da-para-afirmar': '#0d0d0d',\n pendente: '#595959',\n 'sem-dado': '#595959',\n 'nao-testada': '#595959',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.35, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque2: '#8a8a8a' },\n estrutura: { painel: 'fio-grosso', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, tituloEstilo: 'coluna3' },\n}\n\nconst concretismo: PrintStyle = {\n name: 'concretismo',\n label: 'Concretismo',\n referencia: 'Design concreto brasileiro (anos 1950-60): geometria, grotesca em caixa-baixa, preto, vermelho e ultramar; inspirado em Alexandre Wollner, Aloísio Magalhães e na ESDI',\n fontes: {\n titulo: f('Barlow', SANS),\n corpo: f('Barlow', SANS),\n numero: f('Barlow', SANS),\n rotulo: f('Barlow Condensed', SANS),\n anotacao: f('Barlow', SANS),\n mono: f('Barlow Condensed', SANS),\n },\n googleFonts: ['Barlow:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400', 'Barlow Condensed:wght@500;600'],\n cor: {\n papel: '#f3efe6',\n tinta: '#141414',\n tinta2: '#2b2b2b',\n tinta3: '#57534c',\n linha: '#141414',\n destaque: '#d7372a',\n destaque2: '#3d3fa0',\n marcaTexto: '#f3d3cc',\n contexto: '#c9c3b6',\n prova: {\n sustentada: '#141414',\n refutada: '#b82e22',\n 'nao-da-para-afirmar': '#3d3fa0',\n pendente: '#57534c',\n 'sem-dado': '#57534c',\n 'nao-testada': '#57534c',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.7, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'etiqueta',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#141414', destaque2: '#8a8a8a' },\n estrutura: { painel: 'fio-grosso', rotulo: 'quadrado', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: true, forma: 'eixo-central', emblema: 'circulo-bicolor', veredito: 'bloco-escuro', costura: 'barra' },\n}\n\nconst semanario: PrintStyle = {\n name: 'semanario',\n label: 'Semanário de economia',\n referencia: 'Gráficos de revista semanal de economia: barra vermelha no topo, título curto, grotesca condensada, grade só horizontal; inspirado em gráficos da revista The Economist',\n fontes: {\n titulo: f('Source Serif 4', SERIF),\n corpo: f('Source Serif 4', SERIF),\n numero: f('Fira Sans Condensed', SANS),\n rotulo: f('Fira Sans Condensed', SANS),\n anotacao: f('Fira Sans Condensed', SANS),\n mono: f('Fira Sans Condensed', SANS),\n },\n googleFonts: [\n 'Fira Sans Condensed:ital,wght@0,400;0,500;0,600;0,700;1,400',\n 'Source Serif 4:ital,opsz,wght@0,8..60,400;0,8..60,600;0,8..60,700;1,8..60,400',\n ],\n cor: {\n papel: '#ffffff',\n tinta: '#121212',\n tinta2: '#333333',\n tinta3: '#595959',\n linha: '#b7c6cf',\n destaque: '#3a4aa0',\n destaque2: '#b0bee0',\n marcaTexto: '#fbdcd8',\n contexto: '#b7c6cf',\n prova: {\n sustentada: '#3a4aa0',\n refutada: '#d7110a',\n 'nao-da-para-afirmar': '#3a4aa0',\n pendente: '#595959',\n 'sem-dado': '#595959',\n 'nao-testada': '#595959',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#121212', destaque2: '#9a9a9a' },\n estrutura: { painel: 'fio', rotulo: 'quadrado', rotuloCaixa: 'normal', notas: 'dentro', figura: 'barra-topo', minusculas: false, multiplos: 'lado-a-lado' },\n}\n\nconst infograficoIlustrado: PrintStyle = {\n name: 'infografico-ilustrado',\n label: 'Infográfico ilustrado',\n referencia: 'Infografia explicativa: pictogramas, cantos redondos, balão de fala, cores amigáveis; inspirado em Nigel Holmes (Time, Wordless Diagrams)',\n fontes: {\n titulo: f('Rubik', SANS),\n corpo: f('Nunito Sans', SANS),\n numero: f('Rubik', SANS),\n rotulo: f('Rubik', SANS),\n anotacao: f('Nunito Sans', SANS),\n mono: f('Nunito Sans', SANS),\n },\n googleFonts: ['Rubik:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400', 'Nunito Sans:ital,opsz,wght@0,6..12,400;0,6..12,600;0,6..12,700;1,6..12,400'],\n cor: {\n papel: '#fbf6ea',\n tinta: '#22303c',\n tinta2: '#34424e',\n tinta3: '#56606a',\n linha: '#22303c',\n destaque: '#e0603f',\n destaque2: '#2b8a86',\n marcaTexto: '#f6e1ad',\n contexto: '#d9cfbb',\n prova: {\n sustentada: '#1f6f6b',\n refutada: '#b8401f',\n 'nao-da-para-afirmar': '#22303c',\n pendente: '#56606a',\n 'sem-dado': '#56606a',\n 'nao-testada': '#56606a',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.5, tremor: 0, hachura: 'nenhuma' },\n grafico: 'isotype',\n marcaProva: 'pilula',\n raio: 2.4,\n caixaAlta: false,\n pb: { destaque: '#2a2a2a', destaque2: '#8a8a8a' },\n estrutura: { painel: 'cartao', rotulo: 'circulo', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'predios', linhaCorte: 'tracejada', chamadas: 'baloes', multiplos: 'lado-a-lado', emblema: 'predios' },\n}\n\nconst diagramaModernista: PrintStyle = {\n name: 'diagrama-modernista',\n label: 'Diagrama modernista',\n referencia: 'Atlas modernista: blocos de cor chapada, sans geométrica em caixa-baixa; inspirado em Herbert Bayer (World Geo-Graphic Atlas, 1953)',\n fontes: {\n titulo: f('League Spartan', SANS),\n corpo: f('Jost', SANS),\n numero: f('League Spartan', SANS),\n rotulo: f('League Spartan', SANS),\n anotacao: f('Jost', SANS),\n mono: f('Jost', SANS),\n },\n googleFonts: ['League Spartan:wght@400;500;600;700', 'Jost:ital,wght@0,400;0,500;0,600;1,400'],\n cor: {\n papel: '#f1ece0',\n tinta: '#1b1a17',\n tinta2: '#36342f',\n tinta3: '#5c574d',\n linha: '#1b1a17',\n destaque: '#c0512d',\n destaque2: '#5a5f93',\n marcaTexto: '#ecd8a8',\n contexto: '#cbc2ae',\n prova: {\n sustentada: '#56602a',\n refutada: '#a8401f',\n 'nao-da-para-afirmar': '#1b1a17',\n pendente: '#5c574d',\n 'sem-dado': '#5c574d',\n 'nao-testada': '#5c574d',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.4, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'ponto',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#2a2a2a', destaque2: '#8a8a8a' },\n estrutura: { painel: 'bloco', rotulo: 'circulo', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: true, forma: 'colunas', linhaCorte: 'cheia', marcador: 'circulo', multiplos: 'lado-a-lado', fundoPainel: 'alternado', moldura: 'quartos', manchete: 'texto', cabecaMultiplo: 'caixa-cor' },\n}\n\nconst papelSalmao: PrintStyle = {\n name: 'papel-salmao',\n label: 'Papel salmão',\n referencia: 'Gráficos de jornal financeiro em papel salmão: serifa editorial no título, grotesca nos rótulos, clarete e azul; inspirado em gráficos do Financial Times',\n fontes: {\n titulo: f('DM Serif Display', SERIF),\n corpo: f('Gelasio', SERIF),\n numero: f('Hanken Grotesk', SANS),\n rotulo: f('Hanken Grotesk', SANS),\n anotacao: f('Hanken Grotesk', SANS),\n mono: f('Hanken Grotesk', SANS),\n },\n googleFonts: ['DM Serif Display:ital@0;1', 'Gelasio:ital,wght@0,400;0,500;0,600;1,400', 'Hanken Grotesk:ital,wght@0,400;0,500;0,600;0,700;1,400'],\n cor: {\n papel: '#fff1e5',\n tinta: '#33302e',\n tinta2: '#4a4543',\n tinta3: '#625c58',\n linha: '#e3d2c3',\n destaque: '#3a4aa0',\n destaque2: '#b0bee0',\n marcaTexto: '#f2dfce',\n contexto: '#c9bcb0',\n prova: {\n sustentada: '#3a4aa0',\n refutada: '#990f3d',\n 'nao-da-para-afirmar': '#33302e',\n pendente: '#625c58',\n 'sem-dado': '#625c58',\n 'nao-testada': '#625c58',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'etiqueta',\n raio: 0,\n caixaAlta: false,\n pb: { papel: '#ffffff', destaque: '#1a1a1a', destaque2: '#a0a0a0' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'colunas', chamadas: 'guia', multiplos: 'lado-a-lado' },\n}\n\n\n// ---------------------------------------------------------------------------\n// Studies 17–41 (diagramacao/estilos/estilo-17 … estilo-41; the archived ones excluded)\n// ---------------------------------------------------------------------------\n\nconst cinzas = (a: string, b = a) => ({ pendente: a, 'sem-dado': b, 'nao-testada': b })\n\nconst dadosBr: PrintStyle = {\n name: 'dados-br',\n label: 'Dados à brasileira',\n referencia: 'Jornalismo de dados brasileiro: grotesca pesada, serifa no texto, vermelho só no lado que importa; inspirado em Núcleo, Folha, Estadão e Agência Pública',\n fontes: { titulo: f('Libre Franklin', SANS), corpo: f('Source Serif 4', SERIF), numero: f('Libre Franklin', SANS), rotulo: f('Libre Franklin', SANS), anotacao: f('Source Serif 4', SERIF), mono: f('IBM Plex Mono', MONO) },\n googleFonts: ['Libre Franklin:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400', 'Source Serif 4:ital,opsz,wght@0,8..60,400;0,8..60,600;1,8..60,400', PLEX_MONO],\n cor: { papel: '#fbfaf6', tinta: '#1f1e1c', tinta2: '#3d3a36', tinta3: '#625d56', linha: '#dcd8cf', destaque: '#c4553a', destaque2: '#b5afa4', marcaTexto: '#f3efe6', contexto: '#b5afa4', prova: { sustentada: '#1f1e1c', refutada: '#b24a31', 'nao-da-para-afirmar': '#1f1e1c', ...cinzas('#625d56') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0.8,\n caixaAlta: false,\n pb: { destaque: '#1f1e1c' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, notasFigura: 'coluna', manchete: 'texto' },\n}\n\nconst fluxoHistorico: PrintStyle = {\n name: 'fluxo-historico',\n label: 'Fluxo histórico (séc. XIX)',\n referencia: 'Cartas figurativas do século XIX: papel envelhecido, tinta sépia, filete duplo, versaletes; inspirado em Charles Joseph Minard e Florence Nightingale',\n fontes: { titulo: f('IM Fell English', SERIF), corpo: f('Old Standard TT', SERIF), numero: f('Old Standard TT', SERIF), rotulo: f('IM Fell English SC', SERIF), anotacao: f('IM Fell English', SERIF), mono: f('Old Standard TT', SERIF) },\n googleFonts: ['IM Fell English:ital@0;1', 'IM Fell English SC', 'Old Standard TT:ital,wght@0,400;0,700;1,400'],\n cor: { papel: '#efe3c6', tinta: '#3b2a1a', tinta2: '#4f3d2a', tinta3: '#5e4a36', linha: '#b89d78', destaque: '#caa472', destaque2: '#3b2a1a', marcaTexto: '#e6d5ae', contexto: '#b89d78', prova: { sustentada: '#3b2a1a', refutada: '#8f4431', 'nao-da-para-afirmar': '#3b2a1a', ...cinzas('#5e4a36') } },\n papel: { textura: 'fibra', intensidade: 0.35 },\n traco: { largura: 0.25, tremor: 0, hachura: 'pontilhada' },\n grafico: 'limpo',\n marcaProva: 'etiqueta',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#8a8a8a' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'versalete', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'dupla', forma: 'fluxo', tituloEstilo: 'centro-italico' },\n}\n\nconst blocosColoridos: PrintStyle = {\n name: 'blocos-coloridos',\n label: 'Blocos coloridos',\n referencia: 'Infografia em cartões de cores claras: colunas, números grandes, grotesca geométrica; inspirado em David McCandless (Information is Beautiful)',\n fontes: { titulo: f('Montserrat', SANS), corpo: f('Lato', SANS), numero: f('Montserrat', SANS), rotulo: f('Montserrat', SANS), anotacao: f('Lato', SANS), mono: f('Lato', SANS) },\n googleFonts: ['Montserrat:ital,wght@0,500;0,600;0,700;0,800;0,900;1,500', 'Lato:ital,wght@0,400;0,700;1,400'],\n cor: { papel: '#ffffff', tinta: '#2b2b2b', tinta2: '#444444', tinta3: '#6b6b76', linha: '#e4e4ea', destaque: '#f0506e', destaque2: '#7b5ea7', marcaTexto: '#ffe9cf', contexto: '#d3d3cf', prova: { sustentada: '#2b2b2b', refutada: '#c93a58', 'nao-da-para-afirmar': '#b8561a', ...cinzas('#6b6b76') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 1.6,\n caixaAlta: false,\n pb: { destaque: '#2b2b2b', destaque2: '#9a9a9a' },\n estrutura: { painel: 'cartao', rotulo: 'quadrado', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, barras: 'vertical', corRotulo: 'tinta', forma: 'cartoes', multiplos: 'lado-a-lado', veredito: 'bloco-escuro', fundoPainel: 'alternado', manchete: 'texto' },\n}\n\nconst construtivismo: PrintStyle = {\n name: 'construtivismo',\n label: 'Construtivismo russo',\n referencia: 'Construtivismo soviético: vermelho e preto, diagonais, grotesca condensada em caixa-alta; inspirado em El Lissitzky, Rodchenko e os irmãos Stenberg',\n fontes: { titulo: f('Oswald', SANS), corpo: f('PT Sans', SANS), numero: f('Oswald', SANS), rotulo: f('Oswald', SANS), anotacao: f('PT Sans Narrow', SANS), mono: f('PT Sans Narrow', SANS) },\n googleFonts: ['Oswald:wght@400;500;600;700', 'PT Sans:ital,wght@0,400;0,700;1,400', 'PT Sans Narrow:wght@400;700'],\n cor: { papel: '#efe6d2', tinta: '#1a1714', tinta2: '#2e2a25', tinta3: '#5e564c', linha: '#1a1714', destaque: '#c8201e', destaque2: '#1a1714', marcaTexto: '#e3d6bb', contexto: '#b9ad97', prova: { sustentada: '#1a1714', refutada: '#b01c1a', 'nao-da-para-afirmar': '#1a1714', ...cinzas('#5e564c') }, ornamento: ['#c8201e', '#1a1714'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.4, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: true,\n pb: { destaque: '#6a6a6a' },\n estrutura: { painel: 'fio-grosso', rotulo: 'quadrado', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'diagonais', corRotulo: 'refutada', tituloEstilo: 'pesado', costura: 'bloco-escuro', manchete: 'diagonal' },\n}\n\nconst bauhaus: PrintStyle = {\n name: 'bauhaus',\n label: 'Bauhaus',\n referencia: 'Escola Bauhaus (1923–1930): triângulo, quadrado e círculo nas três primárias, sans geométrica em caixa-baixa; inspirado em Herbert Bayer e Joost Schmidt',\n fontes: { titulo: f('Jost', SANS), corpo: f('Jost', SANS), numero: f('Jost', SANS), rotulo: f('Jost', SANS), anotacao: f('Jost', SANS), mono: f('Jost', SANS) },\n googleFonts: ['Jost:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400'],\n cor: { papel: '#f6f2e9', tinta: '#141414', tinta2: '#2e2d2b', tinta3: '#5d5a55', linha: '#141414', destaque: '#d4372c', destaque2: '#3a3f9e', marcaTexto: '#ece21c', contexto: '#cfc9bd', prova: { sustentada: '#141414', refutada: '#b52d24', 'nao-da-para-afirmar': '#141414', ...cinzas('#5d5a55') }, ornamento: ['#ece21c', '#d4372c', '#3a3f9e'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.4, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'formas',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#5a5a5a', destaque2: '#a0a0a0', marcaTexto: '#e0e0e0' },\n estrutura: { painel: 'fio-grosso', rotulo: 'circulo', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: true, barras: 'vertical', moldura: 'formas', corRotulo: 'marcaTexto', multiplos: 'lado-a-lado', costura: 'faixa', manchete: 'texto' },\n}\n\nconst brutalista: PrintStyle = {\n name: 'brutalista',\n label: 'Brutalista (dossiê)',\n referencia: 'Design brutalista de dossiê e formulário: mono em caixa-alta, campos numerados, faixas pretas, hachura, carimbo',\n fontes: { titulo: f('Space Mono', MONO), corpo: f('IBM Plex Mono', MONO), numero: f('Space Mono', MONO), rotulo: f('Space Mono', MONO), anotacao: f('IBM Plex Mono', MONO), mono: f('IBM Plex Mono', MONO) },\n googleFonts: ['Space Mono:ital,wght@0,400;0,700;1,400', 'IBM Plex Mono:ital,wght@0,400;0,500;0,600;0,700;1,400'],\n cor: { papel: '#ebeae5', tinta: '#0d0d0d', tinta2: '#2e2e2c', tinta3: '#4d4d4a', linha: '#0d0d0d', destaque: '#0d0d0d', destaque2: '#0d0d0d', marcaTexto: '#d6d5cf', contexto: '#9a9994', prova: { sustentada: '#0d0d0d', refutada: '#0d0d0d', 'nao-da-para-afirmar': '#0d0d0d', ...cinzas('#2e2e2c', '#4d4d4a') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.35, tremor: 0, hachura: 'simples' },\n grafico: 'limpo',\n marcaProva: 'carimbo',\n raio: 0,\n caixaAlta: true,\n pb: {},\n estrutura: { painel: 'dossie', rotulo: 'letra', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false },\n}\n\nconst divulgacao: PrintStyle = {\n name: 'divulgacao',\n label: 'Revista de divulgação',\n referencia: 'Revistas de divulgação científica para jovens: cores vivas, cartões arredondados, balões, títulos pesados; inspirado em Ciência Hoje das Crianças e Superinteressante',\n fontes: { titulo: f('Archivo Black', SANS), corpo: f('Nunito', SANS), numero: f('Archivo Black', SANS), rotulo: f('Nunito', SANS), anotacao: f('Nunito', SANS), mono: f('Nunito', SANS) },\n googleFonts: ['Archivo Black', 'Nunito:ital,wght@0,400;0,600;0,700;0,800;0,900;1,400'],\n cor: { papel: '#fffdf7', tinta: '#1b1446', tinta2: '#2a1d5c', tinta3: '#5f5a7a', linha: '#6a2c91', destaque: '#f58220', destaque2: '#6a2c91', marcaTexto: '#fff4c2', contexto: '#dcd3c4', prova: { sustentada: '#3d6b1f', refutada: '#c4006a', 'nao-da-para-afirmar': '#b35a00', ...cinzas('#5f5a7a') }, ornamento: ['#e6007e', '#f58220', '#8cc63f', '#6a2c91'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.35, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'pilula',\n raio: 3,\n caixaAlta: false,\n pb: { destaque: '#8a8a8a', destaque2: '#2a2a2a' },\n estrutura: { painel: 'cartao', rotulo: 'circulo', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, barras: 'vertical', corRotulo: 'destaque', contornoBarra: true, tituloEstilo: 'normal', forma: 'colunas', chamadas: 'baloes', multiplos: 'lado-a-lado', emblema: 'lupa', fundoPainel: 'alternado', costura: 'selo', manchete: 'lupa' },\n}\n\nconst proporcaoModular: PrintStyle = {\n name: 'proporcao-modular',\n label: 'Proporção modular',\n referencia: 'Proporções modulares e policromia arquitetônica: letras em estêncil, siena e verde, paredes de cor chapada; inspirado em Le Corbusier (policromia de 1931 e 1959)',\n fontes: { titulo: f('Stardos Stencil', SERIF), corpo: f('Work Sans', SANS), numero: f('Work Sans', SANS), rotulo: f('Work Sans', SANS), anotacao: f('Work Sans', SANS), mono: f('Allerta Stencil', SANS) },\n googleFonts: ['Stardos Stencil:wght@400;700', 'Work Sans:ital,wght@0,400;0,500;0,600;1,400', 'Allerta Stencil'],\n cor: { papel: '#f7f2e8', tinta: '#26221d', tinta2: '#3c3630', tinta3: '#6a6259', linha: '#26221d', destaque: '#9a4b33', destaque2: '#2f5f45', marcaTexto: '#e9dcc3', contexto: '#d6cbb8', prova: { sustentada: '#2a5a40', refutada: '#9a4b33', 'nao-da-para-afirmar': '#26221d', ...cinzas('#6a6259') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'etiqueta',\n raio: 0,\n caixaAlta: true,\n pb: { destaque: '#5a5a5a', destaque2: '#a0a0a0' },\n estrutura: { painel: 'bloco', rotulo: 'quadrado', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, barras: 'vertical', corRotulo: 'tinta', multiplos: 'lado-a-lado', emblema: 'figura-modular', fundoPainel: 'alternado', costura: 'barra', manchete: 'texto', cabecaMultiplo: 'caixa-cor' },\n}\n\nconst sinalizacao: PrintStyle = {\n name: 'sinalizacao',\n label: 'Sinalização de aeroporto',\n referencia: 'Sinalização de aeroporto: faixas amarelas, setas, preto, grotesca legível à distância; inspirado em Benno Wissing e Total Design (aeroporto de Schiphol, 1967)',\n fontes: { titulo: f('Hind', SANS), corpo: f('Hind', SANS), numero: f('Hind', SANS), rotulo: f('Hind', SANS), anotacao: f('Hind', SANS), mono: f('Hind', SANS) },\n googleFonts: ['Hind:wght@400;500;600;700'],\n cor: { papel: '#fbfbf8', tinta: '#121212', tinta2: '#2b2b2b', tinta3: '#555553', linha: '#121212', destaque: '#121212', destaque2: '#9d9d9d', marcaTexto: '#fff200', contexto: '#9d9d9d', prova: { sustentada: '#121212', refutada: '#121212', 'nao-da-para-afirmar': '#121212', ...cinzas('#555553') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.35, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'pilula',\n raio: 0,\n caixaAlta: false,\n pb: { marcaTexto: '#d9d9d9' },\n estrutura: { painel: 'placa', rotulo: 'quadrado', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, cabeco: 'etiqueta', corRotulo: 'tinta', veredito: 'bloco-escuro', rastro: 'placa', manchete: 'faixa', cabecaMultiplo: 'faixa' },\n}\n\nconst pictogramas: PrintStyle = {\n name: 'pictogramas',\n label: 'Pictogramas esportivos',\n referencia: 'Identidade de grande evento esportivo: pictogramas em grade, azul-claro, verde e laranja, sans de corpo leve; inspirado em Otl Aicher (Munique, 1972)',\n fontes: { titulo: f('Albert Sans', SANS), corpo: f('Albert Sans', SANS), numero: f('Albert Sans', SANS), rotulo: f('Albert Sans', SANS), anotacao: f('Albert Sans', SANS), mono: f('Albert Sans', SANS) },\n googleFonts: ['Albert Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400'],\n cor: { papel: '#ffffff', tinta: '#1f2a33', tinta2: '#34414b', tinta3: '#5f6b73', linha: '#1f2a33', destaque: '#f28c28', destaque2: '#6b8e3a', marcaTexto: '#d4e6e8', contexto: '#b9bcc0', prova: { sustentada: '#2f5f45', refutada: '#b35a0c', 'nao-da-para-afirmar': '#1f2a33', ...cinzas('#5f6b73') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'etiqueta',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#8a8a8a', destaque2: '#3a3a3a', marcaTexto: '#d9d9d9' },\n estrutura: { painel: 'bloco', rotulo: 'quadrado', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, barras: 'vertical', corRotulo: 'sustentada', multiplos: 'lado-a-lado', emblema: 'pictogramas', fundoPainel: 'claro', manchete: 'faixa', cabecaMultiplo: 'faixa-cor' },\n}\n\nconst mapaDeMetro: PrintStyle = {\n name: 'mapa-de-metro',\n label: 'Mapa de metrô',\n referencia: 'Manual e mapa de metrô: faixa preta no topo, círculos coloridos, grotesca neutra; inspirado em Massimo Vignelli (metrô de Nova York, Unimark, 1970–1972)',\n fontes: { titulo: f('Inter', SANS), corpo: f('Inter', SANS), numero: f('Inter', SANS), rotulo: f('Inter', SANS), anotacao: f('Inter', SANS), mono: f('Inter', SANS) },\n googleFonts: ['Inter:wght@400;500;600;700'],\n cor: { papel: '#ffffff', tinta: '#111111', tinta2: '#2e2e2e', tinta3: '#595959', linha: '#111111', destaque: '#ee352e', destaque2: '#a7a9ac', marcaTexto: '#ebebe6', contexto: '#a7a9ac', prova: { sustentada: '#111111', refutada: '#d6261f', 'nao-da-para-afirmar': '#111111', ...cinzas('#595959') }, ornamento: ['#ee352e', '#ff6319', '#b933ad', '#996633'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'ponto',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#4a4a4a' },\n estrutura: { painel: 'fio', rotulo: 'circulo', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, barras: 'vertical', cabeco: 'faixa', corRotulo: 'tinta', veredito: 'bloco-escuro', rastro: 'metro', manchete: 'texto', cabecaMultiplo: 'faixa-escura' },\n}\n\nconst jornal1959: PrintStyle = {\n name: 'jornal-1959',\n label: 'Jornal modernista (1959)',\n referencia: 'Reforma gráfica de jornal modernista: branco, preto e cinza, filetes, Bodoni no título, grade limpa; inspirado em Amilcar de Castro (reforma do Jornal do Brasil, 1956–1959)',\n fontes: { titulo: f('Libre Bodoni', SERIF), corpo: f('PT Serif', SERIF), numero: f('Libre Bodoni', SERIF), rotulo: f('Libre Franklin', SANS), anotacao: f('PT Serif', SERIF), mono: f('Libre Franklin', SANS) },\n googleFonts: ['Libre Bodoni:wght@400;700', 'PT Serif:ital,wght@0,400;0,700;1,400', 'Libre Franklin:wght@400;500;600;700'],\n cor: { papel: '#fdfdfb', tinta: '#111111', tinta2: '#2b2b2b', tinta3: '#595959', linha: '#111111', destaque: '#111111', destaque2: '#a3a3a3', marcaTexto: '#ececea', contexto: '#a3a3a3', prova: { sustentada: '#111111', refutada: '#111111', 'nao-da-para-afirmar': '#111111', ...cinzas('#595959') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.25, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: {},\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false },\n}\n\nconst azulejoModernista: PrintStyle = {\n name: 'azulejo-modernista',\n label: 'Azulejo modernista',\n referencia: 'Painéis de azulejo modernista: módulo azul e branco com semicírculos e quadrados, acento amarelo, geometria; inspirado em Athos Bulcão (Brasília)',\n fontes: { titulo: f('Jost', SANS), corpo: f('Jost', SANS), numero: f('Jost', SANS), rotulo: f('Jost', SANS), anotacao: f('Jost', SANS), mono: f('Jost', SANS) },\n googleFonts: ['Jost:ital,wght@0,400;0,500;0,600;0,700;1,400'],\n cor: { papel: '#fbfaf5', tinta: '#15171c', tinta2: '#2b2e35', tinta3: '#5f636b', linha: '#3040b0', destaque: '#3040b0', destaque2: '#aab3de', marcaTexto: '#f0efe8', contexto: '#aab3de', prova: { sustentada: '#15171c', refutada: '#3040b0', 'nao-da-para-afirmar': '#15171c', ...cinzas('#5f636b') }, ornamento: ['#3040b0', '#fbfaf5', '#f0b323'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#3a3a3a', destaque2: '#b0b0b0' },\n estrutura: { painel: 'fio', rotulo: 'quadrado', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'azulejo', corRotulo: 'destaque' },\n}\n\nconst tropicalia: PrintStyle = {\n name: 'tropicalia',\n label: 'Tropicália',\n referencia: 'Capas e cartazes tropicalistas (1967–1969): ondas de cor, letreiro exuberante, laranja, roxo e magenta; inspirado em Rogério Duarte',\n fontes: { titulo: f('Shrikhand', SERIF), corpo: f('Work Sans', SANS), numero: f('Work Sans', SANS), rotulo: f('Work Sans', SANS), anotacao: f('Work Sans', SANS), mono: f('Work Sans', SANS) },\n googleFonts: ['Shrikhand', 'Work Sans:ital,wght@0,400;0,500;0,600;0,700;1,400'],\n cor: { papel: '#fff6e3', tinta: '#1e1a24', tinta2: '#332c3b', tinta3: '#61586a', linha: '#5b2a86', destaque: '#5b2a86', destaque2: '#ee8a1c', marcaTexto: '#fde7c2', contexto: '#ead9bf', prova: { sustentada: '#5b2a86', refutada: '#c21f6e', 'nao-da-para-afirmar': '#1e1a24', ...cinzas('#61586a') }, ornamento: ['#e8601c', '#d6247a', '#5b2a86', '#1f8a5b'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#2a2a2a', destaque2: '#a0a0a0' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'ondas', tituloEstilo: 'arcoiris' },\n}\n\nconst atlasOficial: PrintStyle = {\n name: 'atlas-oficial',\n label: 'Atlas oficial (cartografia)',\n referencia: 'Atlas oficiais: moldura cartográfica com régua alternada, hachura, terra e oliva, legenda de convenções; inspirado em atlas oficiais brasileiros (IBGE, Atlas Nacional)',\n fontes: { titulo: f('IBM Plex Sans Condensed', SANS), corpo: f('IBM Plex Serif', SERIF), numero: f('IBM Plex Sans Condensed', SANS), rotulo: f('IBM Plex Sans Condensed', SANS), anotacao: f('IBM Plex Serif', SERIF), mono: f('IBM Plex Sans Condensed', SANS) },\n googleFonts: ['IBM Plex Sans Condensed:wght@400;500;600;700', 'IBM Plex Serif:ital,wght@0,400;0,600;1,400'],\n cor: { papel: '#fbf8ef', tinta: '#23231d', tinta2: '#3a3a31', tinta3: '#666355', linha: '#23231d', destaque: '#8c5a2b', destaque2: '#5c6b2f', marcaTexto: '#eee8d3', contexto: '#d9d3bd', prova: { sustentada: '#23231d', refutada: '#8c5a2b', 'nao-da-para-afirmar': '#23231d', ...cinzas('#666355') }, ornamento: ['#23231d', '#fbf8ef'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'simples' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: true,\n pb: { destaque: '#4a4a4a', destaque2: '#7a7a7a' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'regua' },\n}\n\nconst gradeHolandesa: PrintStyle = {\n name: 'grade-holandesa',\n label: 'Grade holandesa',\n referencia: 'Grade aparente, letreiro modular espaçado, preto e um laranja; inspirado em Wim Crouwel (Stedelijk Museum, New Alphabet, 1967)',\n fontes: { titulo: f('Major Mono Display', MONO), corpo: f('Hanken Grotesk', SANS), numero: f('Hanken Grotesk', SANS), rotulo: f('Hanken Grotesk', SANS), anotacao: f('Hanken Grotesk', SANS), mono: f('Hanken Grotesk', SANS) },\n googleFonts: ['Major Mono Display', 'Hanken Grotesk:wght@400;500;600;700;800'],\n cor: { papel: '#ffffff', tinta: '#111111', tinta2: '#2e2e2e', tinta3: '#595959', linha: '#111111', destaque: '#111111', destaque2: '#f04e23', marcaTexto: '#fde3da', contexto: '#dddddd', prova: { sustentada: '#111111', refutada: '#c8391a', 'nao-da-para-afirmar': '#111111', ...cinzas('#595959') } },\n papel: { textura: 'milimetrado', intensidade: 0.5 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: true,\n pb: { destaque2: '#9a9a9a' },\n estrutura: { painel: 'fio-grosso', rotulo: 'quadrado', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: true, corRotulo: 'destaque2' },\n}\n\nconst papelRecortado: PrintStyle = {\n name: 'papel-recortado',\n label: 'Papel recortado',\n referencia: 'Cartazes e aberturas de filme em papel recortado: preto e laranja, letreiro à mão em blocos; inspirado em Saul Bass (Anatomy of a Murder, Vertigo)',\n fontes: { titulo: f('Londrina Solid', SANS), corpo: f('Work Sans', SANS), numero: f('Londrina Solid', SANS), rotulo: f('Work Sans', SANS), anotacao: f('Work Sans', SANS), mono: f('Work Sans', SANS) },\n googleFonts: ['Londrina Solid:wght@400;900', 'Work Sans:ital,wght@0,400;0,500;0,600;0,700;1,400'],\n cor: { papel: '#f3ead8', tinta: '#161616', tinta2: '#2c2a26', tinta3: '#5e574c', linha: '#161616', destaque: '#161616', destaque2: '#e8591a', marcaTexto: '#ecd9b9', contexto: '#d8cbb0', prova: { sustentada: '#161616', refutada: '#b3431a', 'nao-da-para-afirmar': '#161616', ...cinzas('#5e574c') }, ornamento: ['#161616', '#e8591a'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.35, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque2: '#8a8a8a' },\n estrutura: { painel: 'fio-grosso', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'recortes', tituloEstilo: 'recorte' },\n}\n\nconst popArt: PrintStyle = {\n name: 'pop-art',\n label: 'Pop art',\n referencia: 'Pop art: pontos Ben-Day, contorno preto grosso, primárias, balão e letreiro de quadrinhos; inspirado em Roy Lichtenstein',\n fontes: { titulo: f('Bangers', SANS), corpo: f('Nunito Sans', SANS), numero: f('Bangers', SANS), rotulo: f('Nunito Sans', SANS), anotacao: f('Comic Neue', HAND), mono: f('Nunito Sans', SANS) },\n googleFonts: ['Bangers', 'Nunito Sans:wght@400;600;700;800', 'Comic Neue:wght@400;700'],\n cor: { papel: '#fffdf5', tinta: '#111111', tinta2: '#2b2b2b', tinta3: '#555555', linha: '#111111', destaque: '#2b44b8', destaque2: '#e4252b', marcaTexto: '#f6ea00', contexto: '#d9d4c4', prova: { sustentada: '#111111', refutada: '#c81e24', 'nao-da-para-afirmar': '#111111', ...cinzas('#555555') }, ornamento: ['#e4252b', '#f6ea00', '#2b44b8'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.45, tremor: 0, hachura: 'pontilhada' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: true,\n pb: { destaque: '#2a2a2a', destaque2: '#8a8a8a', marcaTexto: '#d9d9d9' },\n estrutura: { painel: 'fio-grosso', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'reticula', tituloEstilo: 'faixa', contornoBarra: true },\n}\n\nconst cientifico: PrintStyle = {\n name: 'cientifico',\n label: 'Figura de periódico científico',\n referencia: 'Figuras de periódicos científicos: painéis A e B, eixos com rótulo, paleta segura para daltônicos, legenda longa; inspirado em figuras da Nature, da Science e da PNAS',\n fontes: { titulo: f('STIX Two Text', SERIF), corpo: f('STIX Two Text', SERIF), numero: f('Arimo', SANS), rotulo: f('Arimo', SANS), anotacao: f('Arimo', SANS), mono: f('Arimo', SANS) },\n googleFonts: ['STIX Two Text:ital,wght@0,400;0,600;0,700;1,400', 'Arimo:wght@400;700'],\n cor: { papel: '#ffffff', tinta: '#111111', tinta2: '#2e2e2e', tinta3: '#555555', linha: '#111111', destaque: '#3b4aa8', destaque2: '#d97a00', marcaTexto: '#f2f2f2', contexto: '#bdbdbd', prova: { sustentada: '#111111', refutada: '#111111', 'nao-da-para-afirmar': '#111111', ...cinzas('#555555') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.25, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#2a2a2a', destaque2: '#9a9a9a' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, barras: 'vertical', forma: 'colunas', letraMultiplo: true, multiplos: 'lado-a-lado' },\n}\n\nconst artNouveau: PrintStyle = {\n name: 'art-nouveau',\n label: 'Art nouveau',\n referencia: 'Art nouveau: moldura arredondada, ramos e folhas, ocre e verde-oliva, letreiro decorativo; inspirado em Alphonse Mucha',\n fontes: { titulo: f('Federo', SERIF), corpo: f('EB Garamond', SERIF), numero: f('EB Garamond', SERIF), rotulo: f('Federo', SERIF), anotacao: f('EB Garamond', SERIF), mono: f('EB Garamond', SERIF) },\n googleFonts: ['Federo', 'EB Garamond:ital,wght@0,400;0,500;0,600;1,400;1,500'],\n cor: { papel: '#f6eedb', tinta: '#2a2718', tinta2: '#3f3a26', tinta3: '#625a44', linha: '#8a6d2c', destaque: '#4a5a2a', destaque2: '#b9832a', marcaTexto: '#efe2c2', contexto: '#e0d2ae', prova: { sustentada: '#4a5a2a', refutada: '#9a4a36', 'nao-da-para-afirmar': '#2a2718', ...cinzas('#625a44') }, ornamento: ['#4a5a2a', '#b9832a', '#8a6d2c'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'pilula',\n raio: 2,\n caixaAlta: false,\n pb: { destaque: '#3a3a3a', destaque2: '#a0a0a0' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'ramos' },\n}\n\nconst memphis: PrintStyle = {\n name: 'memphis',\n label: 'Memphis',\n referencia: 'Design pós-moderno de Milão (1981): zigue-zagues, triângulos, confete, turquesa, amarelo e rosa, contorno preto; inspirado em Ettore Sottsass e no grupo Memphis',\n fontes: { titulo: f('Bungee', SANS), corpo: f('Rubik', SANS), numero: f('Bungee', SANS), rotulo: f('Rubik', SANS), anotacao: f('Rubik', SANS), mono: f('Rubik', SANS) },\n googleFonts: ['Bungee', 'Rubik:ital,wght@0,400;0,500;0,700;1,400'],\n cor: { papel: '#fffaf0', tinta: '#161616', tinta2: '#2c2b29', tinta3: '#5c5a57', linha: '#161616', destaque: '#1fb5a8', destaque2: '#f6ea00', marcaTexto: '#fff2b8', contexto: '#e2dccb', prova: { sustentada: '#161616', refutada: '#c2185b', 'nao-da-para-afirmar': '#161616', ...cinzas('#5c5a57') }, ornamento: ['#161616', '#f6ea00', '#ff5fa2', '#1fb5a8'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: true,\n pb: { destaque: '#5a5a5a', destaque2: '#d0d0d0' },\n estrutura: { painel: 'caixa', rotulo: 'circulo', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'memphis', tituloEstilo: 'sombra', contornoBarra: true, corRotulo: 'destaque2' },\n}\n\n/** The 39 book styles, by name. */\nexport const printPresets = {\n dashboard,\n 'graficos-1900': graficos1900,\n 'cartao-postal': cartaoPostal,\n caderno,\n isotype,\n cordel,\n riso,\n jornal,\n prancheta,\n 'prancheta-clara': pranchetaClara,\n aquarela,\n 'minimo-de-tinta': minimoDeTinta,\n suico,\n concretismo,\n semanario,\n 'infografico-ilustrado': infograficoIlustrado,\n 'diagrama-modernista': diagramaModernista,\n 'papel-salmao': papelSalmao,\n 'dados-br': dadosBr,\n 'fluxo-historico': fluxoHistorico,\n 'blocos-coloridos': blocosColoridos,\n construtivismo,\n bauhaus,\n brutalista,\n divulgacao,\n 'proporcao-modular': proporcaoModular,\n sinalizacao,\n pictogramas,\n 'mapa-de-metro': mapaDeMetro,\n 'jornal-1959': jornal1959,\n 'azulejo-modernista': azulejoModernista,\n tropicalia,\n 'atlas-oficial': atlasOficial,\n 'grade-holandesa': gradeHolandesa,\n 'papel-recortado': papelRecortado,\n 'pop-art': popArt,\n cientifico,\n 'art-nouveau': artNouveau,\n memphis,\n} satisfies Record<string, PrintStyle>\n\nexport type PrintPresetName = keyof typeof printPresets\nexport const PRINT_PRESET_NAMES = Object.keys(printPresets) as PrintPresetName[]\nexport const DEFAULT_PRINT_STYLE: PrintPresetName = 'jornal'\n\n// ---------------------------------------------------------------------------\n// Deprecated ids\n// ---------------------------------------------------------------------------\n\n/** Any id a style can be named by: a current name or a deprecated alias (PRINT_STYLE_ALIASES). */\nexport type PrintStyleId = PrintPresetName | PrintStyleAlias\n\n/**\n * The current name of a style id: a current name is returned as is, a\n * deprecated alias is mapped (with a one-time development warning), anything\n * else gives `undefined`.\n */\nexport function resolvePrintStyleName(id: string): PrintPresetName | undefined {\n if (Object.hasOwn(printPresets, id)) return id as PrintPresetName\n if (Object.hasOwn(PRINT_STYLE_ALIASES, id)) {\n const current = PRINT_STYLE_ALIASES[id as PrintStyleAlias]\n warnDeprecatedPrintId(id, current)\n return current\n }\n return undefined\n}\n\n/** The preset of a style id (current or deprecated); throws on an unknown id. */\nexport function printPresetById(id: string): PrintStyle {\n const name = resolvePrintStyleName(id)\n if (!name) throw new Error(`tympan: unknown print style \"${id}\"`)\n return printPresets[name]\n}\n\n// ---------------------------------------------------------------------------\n// Resolution: overrides, black and white\n// ---------------------------------------------------------------------------\n\nfunction mergeCores(base: PrintCores, over?: PrintCoresParciais): PrintCores {\n if (!over) return base\n const { prova, ...rest } = over\n const clean = Object.fromEntries(Object.entries(rest).filter(([, v]) => v !== undefined)) as Partial<PrintCores>\n return { ...base, ...clean, prova: { ...base.prova, ...(prova ?? {}) } }\n}\n\n/** A style with the editor's overrides applied (nested, partial). */\nexport function mergePrintStyle(style: PrintStyle, overrides?: PrintStyleOverrides): PrintStyle {\n if (!overrides) return style\n return {\n ...style,\n label: overrides.label ?? style.label,\n fontes: { ...style.fontes, ...overrides.fontes },\n googleFonts: overrides.googleFonts ?? style.googleFonts,\n cor: mergeCores(style.cor, overrides.cor),\n papel: { ...style.papel, ...overrides.papel },\n traco: { ...style.traco, ...overrides.traco },\n grafico: overrides.grafico ?? style.grafico,\n marcaProva: overrides.marcaProva ?? style.marcaProva,\n raio: overrides.raio ?? style.raio,\n caixaAlta: overrides.caixaAlta ?? style.caixaAlta,\n pb: overrides.pb ? mergeCores({ ...style.cor, ...style.pb, prova: { ...style.cor.prova, ...style.pb.prova } }, overrides.pb) : style.pb,\n estrutura: { ...style.estrutura, ...overrides.estrutura },\n logo: overrides.logo ?? style.logo,\n }\n}\n\nconst fromLinear = (c: number) => (c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055)\n\n/** The grey with the same WCAG relative luminance, so every contrast ratio survives the conversion. */\nexport function toGrey(color: string): string {\n const c: Rgba = parseColor(color)\n const y = luminance(c)\n const v = fromLinear(y)\n return toHex({ r: v, g: v, b: v, a: 1 })\n}\n\n/** Colours for black and white print: every role in grey, then the style's own `pb` adjustments. */\nexport function printStyleCoresPb(style: PrintStyle): PrintCores {\n const g = style.cor\n const grey: PrintCores = {\n papel: toGrey(g.papel),\n tinta: toGrey(g.tinta),\n tinta2: toGrey(g.tinta2),\n tinta3: toGrey(g.tinta3),\n linha: toGrey(g.linha),\n destaque: toGrey(g.destaque),\n destaque2: toGrey(g.destaque2),\n marcaTexto: toGrey(g.marcaTexto),\n contexto: toGrey(g.contexto),\n prova: Object.fromEntries(ESTADOS_PROVA.map((e) => [e, toGrey(g.prova[e])])) as Record<EstadoProva, string>,\n ...(g.ornamento ? { ornamento: g.ornamento.map(toGrey) } : {}),\n }\n return mergeCores(grey, style.pb)\n}\n\nexport interface PrintCssOptions {\n /** Black and white variant. */\n pb?: boolean\n /** Editor overrides of any token. */\n overrides?: PrintStyleOverrides\n /** Selector to scope the properties to; defaults to `[data-ty-print-style=\"<name>\"]`. */\n seletor?: string\n}\n\n/**\n * The style as it will print: overrides applied, then (for `pb`) the grey\n * conversion. Takes a preset or a style id; a deprecated id resolves to its\n * current style (`resolvePrintStyle('economist').name === 'semanario'`).\n */\nexport function resolvePrintStyle(style: PrintStyle | PrintStyleId, options: Omit<PrintCssOptions, 'seletor'> = {}): PrintStyle {\n const base = typeof style === 'string' ? printPresetById(style) : style\n const merged = mergePrintStyle(base, options.overrides)\n if (!options.pb) return merged\n return { ...merged, cor: printStyleCoresPb(merged) }\n}\n\nconst kebab: Record<Exclude<keyof PrintCores, 'prova' | 'ornamento'>, string> = {\n papel: 'papel',\n tinta: 'tinta',\n tinta2: 'tinta-2',\n tinta3: 'tinta-3',\n linha: 'linha',\n destaque: 'destaque',\n destaque2: 'destaque-2',\n marcaTexto: 'marca-texto',\n contexto: 'contexto',\n}\n\nconst num = (n: number) => String(Math.round(n * 1000) / 1000)\n\n/** Custom properties of a resolved style, in a stable order. */\nexport function printStyleVariables(style: PrintStyle): Array<[string, string]> {\n const vars: Array<[string, string]> = []\n for (const k of ['titulo', 'corpo', 'numero', 'rotulo', 'anotacao', 'mono'] as const) vars.push([`--ty-print-fonte-${k}`, style.fontes[k]])\n for (const [k, name] of Object.entries(kebab) as Array<[keyof typeof kebab, string]>) vars.push([`--ty-print-${name}`, style.cor[k]])\n for (const e of ESTADOS_PROVA) vars.push([`--ty-print-prova-${e}`, style.cor.prova[e]])\n vars.push(['--ty-print-textura-intensidade', num(style.papel.intensidade)])\n vars.push(['--ty-print-traco', `${num(style.traco.largura)}mm`])\n vars.push(['--ty-print-tremor', num(style.traco.tremor)])\n vars.push(['--ty-print-raio', `${num(style.raio)}mm`])\n const minusculas = style.estrutura.minusculas\n vars.push(['--ty-print-titulo-caixa', style.caixaAlta ? 'uppercase' : minusculas ? 'lowercase' : 'none'])\n vars.push(['--ty-print-titulo-espaco', style.caixaAlta ? '0.04em' : 'normal'])\n const rc = style.estrutura.rotuloCaixa\n vars.push(['--ty-print-rotulo-caixa', minusculas ? 'lowercase' : rc === 'alta' ? 'uppercase' : 'none'])\n vars.push(['--ty-print-rotulo-variante', rc === 'versalete' ? 'small-caps' : 'normal'])\n vars.push(['--ty-print-rotulo-espaco', rc === 'normal' ? 'normal' : '0.07em'])\n const orn = style.cor.ornamento ?? []\n const reserva = [style.cor.destaque, style.cor.destaque2, style.cor.tinta, style.cor.marcaTexto]\n for (let i = 0; i < 4; i++) vars.push([`--ty-print-ornamento-${i + 1}`, orn[i] ?? reserva[i]!])\n const cr = style.estrutura.corRotulo\n if (cr) {\n const fundo = cr === 'sustentada' || cr === 'refutada' ? style.cor.prova[cr] : style.cor[cr]\n vars.push(['--ty-print-rotulo-fundo', fundo])\n vars.push(['--ty-print-rotulo-tinta', luminance(parseColor(fundo)) > 0.4 ? style.cor.tinta : style.cor.papel])\n }\n return vars\n}\n\n/**\n * CSS custom properties (`--ty-print-*`) of a style on\n * `[data-ty-print-style=\"<name>\"]`, with the editor's overrides and, when\n * `pb` is set, the black and white colours.\n */\nexport function printStyleToCss(style: PrintStyle, options: PrintCssOptions = {}): string {\n const resolved = resolvePrintStyle(style, options)\n const selector = options.seletor ?? `[data-ty-print-style=\"${style.name}\"]`\n const body = printStyleVariables(resolved)\n .map(([n, v]) => ` ${n}: ${v};`)\n .join('\\n')\n return `${selector} {\\n${body}\\n}\\n`\n}\n\n/** Google Fonts css2 URL for a style's families (null when it uses system fonts only). */\nexport function googleFontsUrl(style: Pick<PrintStyle, 'googleFonts'>): string | null {\n if (!style.googleFonts.length) return null\n const families = style.googleFonts.map((spec) => `family=${encodeURIComponent(spec).replace(/%20/g, '+').replace(/%3A/g, ':').replace(/%40/g, '@').replace(/%3B/g, ';').replace(/%2C/g, ',')}`)\n return `https://fonts.googleapis.com/css2?${families.join('&')}&display=swap`\n}\n\n/** True when the paper is dark (the brand seal and logo then use the light mono version). */\nexport function papelEscuro(style: Pick<PrintStyle, 'cor'>): boolean {\n return luminance(parseColor(style.cor.papel)) < 0.2\n}\n","\nfunction createTextureSvg(style: any): string | undefined {\n const papel = style.papel\n if (!papel || papel.textura === 'nenhuma' || papel.intensidade <= 0) return undefined\n const k = papel.intensidade\n const n3 = (x: number) => Math.round(x * 1000) / 1000\n const matriz = (cor: string, alfa: number, limiar: number) => {\n const c = parseColor(cor)\n return `0 0 0 0 ${n3(c.r)} 0 0 0 0 ${n3(c.g)} 0 0 0 0 ${n3(c.b)} 0 0 0 ${n3(alfa)} ${n3(limiar)}`\n }\n\n const tinta = style.cor.tinta\n let defs = ''\n let corpo = ''\n\n if (papel.textura === 'grao') {\n defs = `\n <filter id=\"f\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\n <feTurbulence type=\"fractalNoise\" baseFrequency=\"0.8\" numOctaves=\"2\" seed=\"21\" stitchTiles=\"stitch\" />\n <feColorMatrix values=\"${matriz(tinta, 0.9 * k, -0.34)}\" />\n </filter>\n `\n corpo = `<rect width=\"100%\" height=\"100%\" filter=\"url(#f)\" />`\n } else if (papel.textura === 'fibra') {\n defs = `\n <filter id=\"f\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\n <feTurbulence type=\"fractalNoise\" baseFrequency=\"0.035 0.09\" numOctaves=\"3\" seed=\"4\" />\n <feColorMatrix values=\"${matriz(tinta, 0.55 * k, -0.2)}\" />\n </filter>\n <filter id=\"g\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\n <feTurbulence type=\"fractalNoise\" baseFrequency=\"0.85\" numOctaves=\"2\" seed=\"11\" stitchTiles=\"stitch\" />\n <feColorMatrix values=\"${matriz(tinta, 1.1 * k, -0.45)}\" />\n </filter>\n `\n corpo = `\n <rect width=\"100%\" height=\"100%\" filter=\"url(#f)\" opacity=\"0.6\" />\n <rect width=\"100%\" height=\"100%\" filter=\"url(#g)\" />\n `\n } else if (papel.textura === 'pauta') {\n const linha = style.pb ? '#bdbdbd' : '#b7cbe0'\n const passo = n3(7 * 3.7795)\n defs = `\n <pattern id=\"p\" width=\"10\" height=\"${passo}\" patternUnits=\"userSpaceOnUse\" y=\"${n3(16 * 3.7795)}\">\n <line x1=\"0\" x2=\"10\" y1=\"${n3(7 * 3.7795 - 0.5)}\" y2=\"${n3(7 * 3.7795 - 0.5)}\" stroke=\"${linha}\" stroke-width=\"0.9\" />\n </pattern>\n `\n corpo = `\n <g opacity=\"${Math.min(1, 0.4 + k)}\">\n <rect width=\"100%\" height=\"100%\" fill=\"url(#p)\" />\n </g>\n `\n } else if (papel.textura === 'milimetrado') {\n const mm = 3.7795\n const cm = 37.795\n const mmStr = n3(mm)\n const cmStr = n3(cm)\n const op1 = n3(0.09 * k)\n const op2 = n3(0.22 * k)\n const linha = style.cor.linha\n defs = `\n <pattern id=\"mm\" width=\"${mmStr}\" height=\"${mmStr}\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M ${mmStr} 0 L 0 0 0 ${mmStr}\" fill=\"none\" stroke=\"${linha}\" stroke-opacity=\"${op1}\" stroke-width=\"0.5\" />\n </pattern>\n <pattern id=\"cm\" width=\"${cmStr}\" height=\"${cmStr}\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M ${cmStr} 0 L 0 0 0 ${cmStr}\" fill=\"none\" stroke=\"${linha}\" stroke-opacity=\"${op2}\" stroke-width=\"0.8\" />\n </pattern>\n `\n corpo = `\n <rect width=\"100%\" height=\"100%\" fill=\"url(#mm)\" />\n <rect width=\"100%\" height=\"100%\" fill=\"url(#cm)\" />\n `\n } else {\n return undefined\n }\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\"><defs>${defs}</defs>${corpo}</svg>`\n const cleanSvg = svg.replace(/>\\s+</g, '><').trim()\n return `url('data:image/svg+xml;utf8,${encodeURIComponent(cleanSvg)}')`\n}\n\n\n// UI themes derived from the book styles of print-presets.ts. One function,\n// `printStyleToTheme`, maps a PrintStyle onto a ThemeConfig: the paper and ink\n// become the surfaces and text of the style's native mode (light for paper\n// styles, dark for dark-paper styles), the first legible chromatic accent\n// becomes the brand, the proof-state colours become the semantic tones, the\n// display, body and mono families become the font roles, and the corner\n// radius, panel and chart treatment choose radius, glass, call to action and\n// elevation. The other mode is generated from the same hues. Every exact\n// colour is kept as a pin only while the generator's WCAG 2.2 AA pairs hold;\n// a pin that fails is dropped and the role is regenerated (and nudged) from\n// the style's hue, so identity is kept wherever contrast allows.\n\nimport { contrastRatio, deltaE2000, luminance, oklchToRgb, parseColor, rgbToOklch, toCss } from './color.ts'\nimport { PRINT_THEME_PREFIX } from './print-aliases.ts'\nimport { googleFontsUrl, printPresets, type PrintPresetName, type PrintStyle } from './print-presets.ts'\nimport {\n DEFAULT_CHART_HUES,\n parseFontStack,\n resolveTheme,\n type Mode,\n type RoleName,\n type Seed,\n type SeedName,\n type ThemeConfig,\n} from './theme.ts'\n\n\n/** Chroma under which a colour counts as grey (ink, paper, rules). */\nconst CHROMATIC = 0.05\n/** One millimetre of the print radius in CSS pixels (96 dpi). */\nconst MM = 96 / 25.4\n\nconst oklch = (c: string) => rgbToOklch(parseColor(c))\nconst chromatic = (c: string) => oklch(c).c >= CHROMATIC\nconst ratio = (a: string, b: string) => contrastRatio(parseColor(a), parseColor(b))\nconst shiftL = (c: string, dl: number, chromaScale = 1, alpha = 1): string => {\n const v = oklch(c)\n return toCss(oklchToRgb({ l: Math.min(0.998, Math.max(0.02, v.l + dl)), c: v.c * chromaScale, h: v.h }, alpha))\n}\nconst seedOf = (c: string, fallback?: Seed): Seed => {\n const v = oklch(c)\n if (fallback && v.c < CHROMATIC) return fallback\n return { hue: Math.round(v.h * 10) / 10, chroma: Math.round(v.c * 1000) / 1000 }\n}\nconst hueGap = (a: number, b: number) => {\n const d = Math.abs(a - b) % 360\n return d > 180 ? 360 - d : d\n}\n\n/** Default semantic seeds, used where a style's proof colour is grey. */\nconst TONE_FALLBACK: Record<'danger' | 'warning' | 'success' | 'info', Seed> = {\n danger: { hue: 18, chroma: 0.19 },\n warning: { hue: 70, chroma: 0.14 },\n success: { hue: 150, chroma: 0.14 },\n info: { hue: 255, chroma: 0.06 },\n}\n\n/** Per-style adjustments where the derivation misjudges; merged over the derived config. */\nexport interface PrintThemeOverride {\n /** Brand colour to use instead of the derived one. */\n brand?: string\n glass?: boolean\n cta?: ThemeConfig['cta']\n elevation?: ThemeConfig['elevation']\n /** Radius in px. */\n radius?: number\n /** Extra pins per mode (applied before the contrast check, dropped if they fail like any pin). */\n pins?: ThemeConfig['pins']\n}\n\n/**\n * Where the derivation reads a style differently from its tradition. Kept\n * short on purpose: every entry is a judgement the data cannot express.\n */\nexport const PRINT_THEME_OVERRIDES: Partial<Record<PrintPresetName, PrintThemeOverride>> = {}\n\n/** The colour moved along OKLCH lightness (hue and chroma kept) until it reaches `min` against `over`. */\nexport function legibleOn(colour: string, over: string, min = 4.6): string {\n const v = oklch(colour)\n const step = luminance(parseColor(over)) > 0.2 ? -0.005 : 0.005\n let out = colour\n for (let i = 0; i < 200 && ratio(out, over) < min; i++) {\n v.l = Math.min(0.995, Math.max(0.02, v.l + step))\n out = toCss(oklchToRgb(v))\n }\n return out\n}\n\n/**\n * The accent that represents a style, before any legibility adjustment: the\n * first chromatic accent that nearly reads on the paper (3:1), else the most\n * legible chromatic accent, else the first chromatic ornament, else the ink\n * (or, on dark paper, the paper itself).\n */\nexport function printStyleAccent(style: PrintStyle): string {\n const c = style.cor\n const darkPaper = luminance(parseColor(c.papel)) < 0.2\n const accents = [c.destaque, c.destaque2].filter(chromatic)\n const near = accents.find((x) => ratio(x, c.papel) >= 3)\n if (near) return near\n if (accents.length) return [...accents].sort((a, b) => ratio(b, c.papel) - ratio(a, c.papel))[0]!\n const ornament = (c.ornamento ?? []).find(chromatic)\n if (ornament) return ornament\n return darkPaper ? c.papel : c.tinta\n}\n\nfunction chartHues(style: PrintStyle): number[] {\n const c = style.cor\n const sources = [c.destaque, c.destaque2, ...(c.ornamento ?? []), c.prova.refutada, c.prova.sustentada, c.prova['nao-da-para-afirmar'], c.marcaTexto]\n const hues: number[] = []\n for (const s of sources) {\n const v = oklch(s)\n if (v.c < CHROMATIC) continue\n if (hues.every((h) => hueGap(h, v.h) >= 30)) hues.push(Math.round(v.h))\n }\n for (const h of DEFAULT_CHART_HUES) {\n if (hues.length >= 8) break\n if (hues.every((x) => hueGap(x, h) >= 30)) hues.push(h)\n }\n for (const h of DEFAULT_CHART_HUES) if (hues.length < 8 && !hues.includes(h)) hues.push(h)\n return hues.slice(0, 8)\n}\n\n/** Families of a print stack for a UI role; `mono` is kept only when the stack is really monospace. */\nfunction fontsOf(style: PrintStyle): { fonts: NonNullable<ThemeConfig['fonts']>; url?: string } {\n const display = parseFontStack(style.fontes.titulo)\n const body = parseFontStack(style.fontes.corpo)\n const monoStack = parseFontStack(style.fontes.mono)\n const fonts: any = { display, body, serif: display, sans: body }\n if (monoStack.at(-1) === 'monospace') { fonts.mono = monoStack; fonts.mono = monoStack; }\n const used = new Set([display[0], body[0], fonts.mono?.[0]].filter(Boolean))\n const specs = style.googleFonts.filter((g) => used.has(g.split(':')[0]))\n const url = googleFontsUrl({ googleFonts: specs }) ?? undefined\n return { fonts, url }\n}\n\n/**\n * Exact colours of the style's own mode (paper as background, ink as text).\n * Surfaces step lighter than the paper, the sunken well a little darker.\n */\nfunction nativePins(style: PrintStyle, brand: string, glass: boolean, darkPaper: boolean): Partial<Record<RoleName, string>> {\n const c = style.cor\n const paper = c.papel\n const dl = 0\n const surface = shiftL(paper, dl, 1)\n const raised = shiftL(paper, dl, 1)\n const pins: Partial<Record<RoleName, string>> = {\n bg: paper,\n 'surface-solid': surface,\n 'surface-raised-solid': raised,\n surface: glass ? shiftL(paper, dl, 0.7, 0.82) : surface,\n 'surface-raised': glass ? shiftL(paper, dl * 1.8, 0.6, 0.94) : raised,\n 'surface-sunken': shiftL(paper, darkPaper ? -0.04 : -0.03, 1.1),\n secondary: raised,\n ink: c.tinta,\n 'ink-2': c.tinta2,\n 'ink-3': c.tinta3,\n 'on-secondary': c.tinta,\n brand,\n 'focus-ring': brand,\n 'cta-solid': brand,\n 'on-brand': ratio(paper, brand) >= ratio(c.tinta, brand) ? paper : c.tinta,\n 'on-cta': ratio(paper, brand) >= ratio(c.tinta, brand) ? paper : c.tinta,\n }\n // Rules: a pale printed rule is used as is; an ink-weight rule is thinned with alpha.\n const lineRgb = parseColor(c.linha)\n const lineAlpha = (a: number) => toCss({ ...lineRgb, a })\n if (ratio(c.linha, paper) >= 3) {\n pins.line = lineAlpha(0.3)\n pins['line-soft'] = lineAlpha(0.16)\n pins['line-strong'] = lineAlpha(0.55)\n } else {\n pins.line = c.linha\n pins['line-soft'] = lineAlpha(0.6)\n pins['line-strong'] = shiftL(c.linha, darkPaper ? 0.12 : -0.12)\n }\n // The highlighter tint is the soft brand (selected nav item, soft badges) when it reads against the paper.\n if (deltaE2000(parseColor(c.marcaTexto), parseColor(paper)) >= 6) {\n pins['brand-soft'] = c.marcaTexto\n pins['nav-active'] = c.marcaTexto\n }\n for (const [tone, colour] of [\n ['danger', c.prova.refutada],\n ['success', c.prova.sustentada],\n ['warning', c.prova['nao-da-para-afirmar']],\n ] as const) {\n if (chromatic(colour)) pins[tone] = colour\n }\n return pins\n}\n\n/**\n * Exact colours of the other mode, over the generated background: the paper\n * colour becomes the ink, and the accent is tried as the brand as printed (a\n * grey accent, as in one-ink styles, is replaced by the paper colour).\n */\nfunction counterPins(style: PrintStyle, accent: string): Partial<Record<RoleName, string>> {\n const brand = chromatic(accent) ? accent : style.cor.papel\n const pins: Partial<Record<RoleName, string>> = { ink: style.cor.papel, brand, 'focus-ring': brand }\n if (!chromatic(accent)) pins['cta-solid'] = brand\n return pins\n}\n\n/** Resolves both modes and drops every pin that takes part in a failing pair, until all pairs pass. */\nfunction settlePins(config: ThemeConfig): ThemeConfig {\n const pins: Record<Mode, Partial<Record<RoleName, string>>> = { light: { ...config.pins?.light }, dark: { ...config.pins?.dark } }\n for (const mode of ['light', 'dark'] as const) {\n for (let round = 0; round < 12; round++) {\n const failing = resolveTheme({ ...config, pins }, mode).report.filter((r) => !r.pass)\n if (!failing.length) break\n let dropped = false\n // Foreground pins first; a background pin only when its foreground is already generated.\n for (const r of failing) {\n const fg = r.fg as RoleName\n if (fg in pins[mode]) {\n delete pins[mode][fg]\n dropped = true\n }\n }\n if (!dropped) {\n for (const r of failing) {\n for (const layer of r.over) {\n if (layer in pins[mode]) {\n delete pins[mode][layer as RoleName]\n dropped = true\n }\n }\n }\n }\n if (!dropped) break\n }\n }\n return { ...config, pins }\n}\n\n/**\n * The UI theme of a book style, in light and dark. The name is\n * `print-<style name>`; the label is the style's own.\n */\nexport function printStyleToTheme(style: PrintStyle, override?: PrintThemeOverride): ThemeConfig {\n return settlePins(draftPrintTheme(style, override))\n}\n\n/**\n * Exact print colours the derivation had to give up for contrast, per mode\n * (role -> the print colour that was dropped and regenerated).\n */\nexport function printThemeDroppedPins(style: PrintStyle, override?: PrintThemeOverride): Record<Mode, Partial<Record<RoleName, string>>> {\n const draft = draftPrintTheme(style, override)\n const settled = settlePins(draft)\n const out: Record<Mode, Partial<Record<RoleName, string>>> = { light: {}, dark: {} }\n for (const mode of ['light', 'dark'] as const) {\n for (const [role, value] of Object.entries(draft.pins?.[mode] ?? {}) as Array<[RoleName, string]>) {\n if (!(role in (settled.pins?.[mode] ?? {}))) out[mode][role] = value\n }\n }\n return out\n}\n\nfunction draftPrintTheme(style: PrintStyle, override: PrintThemeOverride = PRINT_THEME_OVERRIDES[style.name as PrintPresetName] ?? {}): ThemeConfig {\n const c = style.cor\n const darkPaper = luminance(parseColor(c.papel)) < 0.2\n const accent = override.brand ?? printStyleAccent(style)\n // The brand is text on the paper (links, active states): the accent at a legible lightness.\n const brand = legibleOn(accent, c.papel)\n const e = style.estrutura\n\n // Neutral hue: from the paper, or the ink when the paper is plain white or black.\n const paper = oklch(c.papel)\n const ink = oklch(c.tinta)\n const tinted = paper.c >= ink.c ? paper : ink\n const neutral: Seed = { hue: Math.round(tinted.h * 10) / 10, chroma: Math.min(0.02, Math.round(tinted.c * 1000) / 1000) }\n const brandSeed = seedOf(accent)\n const seeds: Record<SeedName, Seed> = {\n brand: { hue: brandSeed.hue, chroma: Math.max(brandSeed.chroma, 0.01) },\n neutral,\n danger: seedOf(c.prova.refutada, TONE_FALLBACK.danger),\n warning: seedOf(c.prova['nao-da-para-afirmar'], TONE_FALLBACK.warning),\n success: seedOf(c.prova.sustentada, TONE_FALLBACK.success),\n info: TONE_FALLBACK.info,\n }\n\n // Surface treatment: soft (glass, gradient, blurred shadow) only for the card and wash styles.\n const soft = style.grafico === 'aquarela' || (e.painel === 'nenhum' && style.raio > 1)\n const glass = override.glass ?? soft\n const offset = e.tituloEstilo === 'sombra' || e.contornoBarra === true || e.painel === 'dossie'\n const elevation = override.elevation ?? (offset ? 'offset' : soft || e.painel === 'cartao' ? 'soft' : 'flat')\n const { fonts, url } = fontsOf(style)\n\n const native = nativePins(style, brand, glass, darkPaper)\n const counter = counterPins(style, accent)\n const bgTexture = createTextureSvg(style)\n const nativeMode: Mode = darkPaper ? 'dark' : 'light'\n const counterMode: Mode = darkPaper ? 'light' : 'dark'\n\n const config: ThemeConfig = {\n name: `${PRINT_THEME_PREFIX}${style.name}`,\n label: style.label,\n seeds,\n chartHues: chartHues(style),\n radius: override.radius ?? Math.min(16, Math.round(style.raio * MM)),\n contrast: 'default',\n glass,\n cta: override.cta ?? (soft ? 'gradient' : 'solid'),\n elevation,\n fonts,\n ...(url ? { fontsUrl: url } : {}),\n ...(bgTexture ? { strings: { \"bg-image\": bgTexture } } : {}),\n pins: {\n [nativeMode]: { ...native, ...override.pins?.[nativeMode] },\n [counterMode]: { ...counter, ...override.pins?.[counterMode] },\n },\n }\n return config\n}\n\n/** Every book style as a UI theme, in the order of `printPresets`. */\nexport const printThemePresets: readonly ThemeConfig[] = (Object.values(printPresets) as PrintStyle[]).map((s) => printStyleToTheme(s))\n\n/**\n * Legacy: Google Fonts stylesheet URL of the families of each print theme, by\n * theme name. The print theme sheets now declare the bundled fonts\n * (`printThemeFontSpecs`), so ThemeProvider needs no `fonts` map; this stays\n * for hosts that prefer Google's CDN.\n */\nexport const printThemeFontUrls: Readonly<Record<string, string>> = Object.fromEntries(\n printThemePresets.filter((t) => t.fontsUrl).map((t) => [t.name, t.fontsUrl!]),\n)\n\n/**\n * Google Fonts specs of each print theme, by theme name: the families its\n * stacks name, bundled under fonts/ and declared in the theme's sheet.\n */\nexport const printThemeFontSpecs: Readonly<Record<string, readonly string[]>> = Object.fromEntries(\n (Object.values(printPresets) as PrintStyle[]).map((s) => [`${PRINT_THEME_PREFIX}${s.name}`, [...s.googleFonts]]),\n)\n","// Per-script typography (`:lang()` overrides). Tympan serves the humanities and\n// the exact sciences in any language, so the base stacks (IBM Plex / Source\n// Serif with Noto fallbacks) are adapted per writing system:\n// - the script's Noto family is moved to the front (CJK needs the right\n// regional glyph set; Arabic and Indic need their shaping fonts first);\n// - letter-spacing is removed where it breaks joining or reads badly\n// (Arabic, Indic, Thai, CJK) and uppercase eyebrows lose their meaning;\n// - line heights grow for scripts with tall stacks or marks;\n// - line breaking follows the script (CJK strict, Thai by dictionary).\nimport type { VarList } from './stylesheet.ts'\n\ninterface ScriptRule {\n /** BCP 47 language tags matched with :lang(). */\n langs: string[]\n sans: string[]\n serif?: string[]\n /** Line-height multiplier applied to every --ty-font-line-height-* token. */\n leading?: number\n /** Letter-spacing off (tracking tokens set to 0). */\n noTracking?: boolean\n /** Extra declarations for the element itself. */\n text?: string[]\n}\n\nexport const SCRIPT_RULES: ScriptRule[] = [\n { langs: ['ar', 'fa', 'ur', 'ps', 'ckb', 'sd', 'ug'], sans: ['Noto Sans Arabic', 'Noto Naskh Arabic'], serif: ['Noto Naskh Arabic'], leading: 1.2, noTracking: true },\n { langs: ['he', 'yi'], sans: ['Noto Sans Hebrew'], serif: ['Noto Serif Hebrew'], leading: 1.1, noTracking: true },\n { langs: ['hi', 'mr', 'ne', 'sa', 'kok', 'mai'], sans: ['Noto Sans Devanagari'], serif: ['Noto Serif Devanagari'], leading: 1.25, noTracking: true },\n { langs: ['bn', 'as'], sans: ['Noto Sans Bengali'], serif: ['Noto Serif Bengali'], leading: 1.25, noTracking: true },\n { langs: ['ta'], sans: ['Noto Sans Tamil'], serif: ['Noto Serif Tamil'], leading: 1.25, noTracking: true },\n { langs: ['te'], sans: ['Noto Sans Telugu'], leading: 1.25, noTracking: true },\n { langs: ['kn'], sans: ['Noto Sans Kannada'], leading: 1.25, noTracking: true },\n { langs: ['ml'], sans: ['Noto Sans Malayalam'], leading: 1.25, noTracking: true },\n { langs: ['gu'], sans: ['Noto Sans Gujarati'], leading: 1.25, noTracking: true },\n { langs: ['pa'], sans: ['Noto Sans Gurmukhi'], leading: 1.25, noTracking: true },\n { langs: ['si'], sans: ['Noto Sans Sinhala'], leading: 1.25, noTracking: true },\n { langs: ['th'], sans: ['Noto Sans Thai'], serif: ['Noto Serif Thai'], leading: 1.25, noTracking: true, text: ['word-break: normal;', 'line-break: auto;'] },\n { langs: ['lo'], sans: ['Noto Sans Lao'], leading: 1.25, noTracking: true },\n { langs: ['km'], sans: ['Noto Sans Khmer'], leading: 1.25, noTracking: true },\n { langs: ['my'], sans: ['Noto Sans Myanmar'], leading: 1.35, noTracking: true },\n { langs: ['am', 'ti', 'gez'], sans: ['Noto Sans Ethiopic'], serif: ['Noto Serif Ethiopic'], leading: 1.15, noTracking: true },\n { langs: ['hy'], sans: ['Noto Sans Armenian'] },\n { langs: ['ka'], sans: ['Noto Sans Georgian'] },\n { langs: ['ja'], sans: ['Noto Sans JP'], serif: ['Noto Serif JP'], leading: 1.15, noTracking: true, text: ['line-break: strict;', 'word-break: normal;', 'overflow-wrap: anywhere;'] },\n { langs: ['zh', 'zh-Hans', 'zh-CN', 'zh-SG'], sans: ['Noto Sans SC'], serif: ['Noto Serif SC'], leading: 1.15, noTracking: true, text: ['line-break: strict;', 'word-break: normal;', 'overflow-wrap: anywhere;'] },\n { langs: ['zh-Hant', 'zh-TW', 'zh-HK', 'zh-MO'], sans: ['Noto Sans TC'], serif: ['Noto Serif TC'], leading: 1.15, noTracking: true, text: ['line-break: strict;', 'word-break: normal;', 'overflow-wrap: anywhere;'] },\n { langs: ['ko'], sans: ['Noto Sans KR'], serif: ['Noto Serif KR'], leading: 1.15, noTracking: true, text: ['word-break: keep-all;', 'overflow-wrap: anywhere;'] },\n]\n\nconst quote = (family: string) => (/^[\\w-]+$/.test(family) && !/\\s/.test(family) ? family : `\"${family}\"`)\n\nfunction scaledPx(value: string, factor: number): string {\n const m = /^(\\d+(?:\\.\\d+)?)px$/.exec(value.trim())\n if (!m) return value\n // Round up to an even pixel so text keeps sitting on the 4 px rhythm's half-steps.\n return `${Math.ceil((Number(m[1]) * factor) / 2) * 2}px`\n}\n\n/** The `:lang()` blocks, derived from the base token values. */\nexport function scriptRules(base: VarList): string {\n const value = (name: string) => base.find(([n]) => n === name)?.[1] ?? ''\n const sansBase = value('--ty-font-sans')\n const serifBase = value('--ty-font-serif')\n const leadings = base.filter(([n]) => n.startsWith('--ty-font-line-height-'))\n const trackings = base.filter(([n]) => n.startsWith('--ty-font-tracking-'))\n return SCRIPT_RULES.map((r) => {\n const decls: string[] = [`--ty-font-sans: ${r.sans.map(quote).join(', ')}, ${sansBase};`]\n if (r.serif) decls.push(`--ty-font-serif: ${r.serif.map(quote).join(', ')}, ${serifBase};`)\n if (r.leading) for (const [n, v] of leadings) decls.push(`${n}: ${scaledPx(v, r.leading)};`)\n if (r.noTracking) for (const [n] of trackings) decls.push(`${n}: 0em;`)\n decls.push(...(r.text ?? []))\n const selectors = r.langs.map((l) => `:lang(${l})`).join(',\\n')\n return `${selectors} {\\n${decls.map((d) => ` ${d}`).join('\\n')}\\n}`\n }).join('\\n\\n')\n}\n","// Assembles the token stylesheet: selector strategy for themes, modes and\n// densities, plus the user-preference media blocks. Used by the static build\n// (fed by Style Dictionary output) and by the live theme customizer (fed\n// directly by the generator); both produce the same text for the same input.\n\nimport { presets as builtInPresets, DEFAULT_THEME } from './presets.ts'\nimport { printThemePresets } from './print-themes.ts'\nimport { scriptRules } from './scripts.ts'\nimport { DENSITIES, densityVariables, resolveTheme, themeVariables, type Density, type ThemeConfig } from './theme.ts'\n\nexport type VarList = Array<[string, string]>\n\nexport interface ThemeVars {\n name: string\n light: VarList\n dark: VarList\n /** Values used under `prefers-contrast: more` (omitted for themes that are already high contrast). */\n highLight?: VarList\n highDark?: VarList\n}\n\nexport interface StylesheetInput {\n /** Theme-independent tokens (space, type, motion, z, layout). */\n base?: VarList\n themes: ThemeVars[]\n /** Theme applied to `:root` without attributes. `null` scopes every theme to its attribute. */\n defaultTheme?: string | null\n densities?: Partial<Record<Density, VarList>>\n /**\n * Component tokens that reference theme roles through var(). Declared on\n * every theme and mode scope so a nested theme re-resolves them.\n */\n components?: VarList\n /** Extra component rules emitted after the component tokens (e.g. the flow tone mapping). */\n componentRules?: string\n /** Cascade layer; `null` for none. */\n layer?: string | null\n banner?: string\n /**\n * Emit the user-preference blocks (reduced motion and transparency,\n * forced colours). Default true; add-on theme sheets loaded after the main\n * token sheet set it to false because those blocks already apply to every theme.\n */\n preferences?: boolean\n}\n\nconst indent = (s: string, n = 2) =>\n s\n .split('\\n')\n .map((l) => (l ? ' '.repeat(n) + l : l))\n .join('\\n')\nconst decls = (vars: VarList, extra: string[] = []) => [...extra, ...vars.map(([n, v]) => `${n}: ${v};`)].join('\\n')\nconst rule = (selectors: string[], body: string) => `${selectors.join(',\\n')} {\\n${indent(body)}\\n}`\nconst media = (query: string, body: string) => `@media ${query} {\\n${indent(body)}\\n}`\n\n/**\n * Selectors for one theme. The attributes may sit on the same element or on\n * an ancestor: `data-ty-theme` picks the theme, `data-ty-mode` forces light or\n * dark (absent or `system` follows `prefers-color-scheme`).\n */\nexport function themeSelectors(name: string, isDefault: boolean) {\n const t = `[data-ty-theme=\"${name}\"]`\n return {\n light: isDefault ? [':root', t, '[data-ty-mode=\"light\"]'] : [t, `${t} [data-ty-mode=\"light\"]`],\n systemDark: isDefault\n ? [':root:not([data-ty-mode=\"light\"])', `${t}:not([data-ty-mode=\"light\"])`]\n : [`${t}:not([data-ty-mode=\"light\"])`],\n dark: isDefault\n ? ['[data-ty-mode=\"dark\"]', `${t}[data-ty-mode=\"dark\"]`, `${t} [data-ty-mode=\"dark\"]`, `[data-ty-mode=\"dark\"] ${t}`]\n : [`${t}[data-ty-mode=\"dark\"]`, `${t} [data-ty-mode=\"dark\"]`, `[data-ty-mode=\"dark\"] ${t}`],\n explicitLight: [`${t}[data-ty-mode=\"light\"]`, `[data-ty-mode=\"dark\"] ${t}[data-ty-mode=\"light\"]`],\n }\n}\n\nfunction themeBlocks(theme: ThemeVars, isDefault: boolean, light: VarList, dark: VarList): string[] {\n const s = themeSelectors(theme.name, isDefault)\n return [\n rule(s.light, decls(light, ['color-scheme: light;'])),\n media('(prefers-color-scheme: dark)', rule(s.systemDark, decls(dark, ['color-scheme: dark;']))),\n rule(s.dark, decls(dark, ['color-scheme: dark;'])),\n rule(s.explicitLight, decls(light, ['color-scheme: light;'])),\n ]\n}\n\nconst ANY_SCOPE = [':root', '[data-ty-theme]', '[data-ty-mode]']\n\n/** Forced colours: roles map to system colours so boundaries and state stay visible. */\nexport const FORCED_COLORS_VARS: VarList = [\n ['--ty-bg', 'Canvas'],\n ['--ty-surface', 'Canvas'],\n ['--ty-surface-raised', 'Canvas'],\n ['--ty-surface-sunken', 'Canvas'],\n ['--ty-surface-solid', 'Canvas'],\n ['--ty-surface-raised-solid', 'Canvas'],\n ['--ty-secondary', 'ButtonFace'],\n ['--ty-on-secondary', 'ButtonText'],\n ['--ty-ink', 'CanvasText'],\n ['--ty-ink-2', 'CanvasText'],\n ['--ty-ink-3', 'CanvasText'],\n ['--ty-line', 'CanvasText'],\n ['--ty-line-soft', 'CanvasText'],\n ['--ty-line-strong', 'CanvasText'],\n ['--ty-input', 'CanvasText'],\n ['--ty-focus-ring', 'Highlight'],\n ['--ty-brand', 'Highlight'],\n ['--ty-accent', 'Highlight'],\n ['--ty-on-brand', 'HighlightText'],\n ['--ty-accent-ink', 'HighlightText'],\n ['--ty-brand-soft', 'Canvas'],\n ['--ty-accent-soft', 'Canvas'],\n ['--ty-on-brand-soft', 'LinkText'],\n ['--ty-on-accent-soft', 'LinkText'],\n ['--ty-cta', 'ButtonFace'],\n ['--ty-cta-solid', 'ButtonFace'],\n ['--ty-on-cta', 'ButtonText'],\n ['--ty-backdrop', 'transparent'],\n ['--ty-shadow-sheet', 'none'],\n ['--ty-shadow-raised', 'none'],\n ['--ty-shadow-floating', 'none'],\n ['--ty-shadow-modal', 'none'],\n ['--ty-glass-blur-sheet', '0px'],\n ['--ty-glass-blur-floating', '0px'],\n ['--ty-glass-edge', 'CanvasText'],\n ['--ty-glass-fill', 'Canvas'],\n ['--ty-glass-fill-raised', 'Canvas'],\n]\n\n/** Reduced transparency (and no backdrop-filter support): opaque surfaces, no blur, no ambient. */\nexport const OPAQUE_VARS: VarList = [\n ['--ty-surface', 'var(--ty-surface-solid) !important'],\n ['--ty-surface-raised', 'var(--ty-surface-raised-solid) !important'],\n ['--ty-secondary', 'var(--ty-surface-raised-solid) !important'],\n ['--ty-glass-blur-sheet', '0px !important'],\n ['--ty-glass-blur-floating', '0px !important'],\n ['--ty-glass-saturate', '1 !important'],\n ['--ty-glass-fill', 'var(--ty-surface-solid) !important'],\n ['--ty-glass-fill-raised', 'var(--ty-surface-raised-solid) !important'],\n ['--ty-ambient-1', 'transparent !important'],\n ['--ty-ambient-2', 'transparent !important'],\n]\n\nexport function buildStylesheet(input: StylesheetInput): string {\n const parts: string[] = []\n const defaultTheme = input.defaultTheme === undefined ? DEFAULT_THEME : input.defaultTheme\n if (input.base?.length) {\n parts.push(rule([':root'], decls(input.base)))\n parts.push(`/* per-script typography (:lang) */\\n${scriptRules(input.base)}`)\n // Reading direction as a number, for inline-axis translations that must mirror in RTL.\n parts.push(`:root,\\n[dir=\"ltr\"] {\\n --ty-inline-sign: 1;\\n}\\n\\n[dir=\"rtl\"] {\\n --ty-inline-sign: -1;\\n}`)\n }\n\n const densities = input.densities ?? {}\n if (densities.default) parts.push(rule([':root', '[data-ty-density=\"default\"]'], decls(densities.default)))\n for (const d of ['compact', 'comfortable'] as const) {\n const v = densities[d]\n if (v) parts.push(rule([`[data-ty-density=\"${d}\"]`], decls(v)))\n }\n\n if (input.components?.length) {\n parts.push(`/* component tokens */\\n${rule(ANY_SCOPE, decls(input.components))}`)\n }\n if (input.componentRules) parts.push(input.componentRules)\n\n for (const theme of input.themes) {\n parts.push(`/* theme: ${theme.name} */`)\n parts.push(...themeBlocks(theme, theme.name === defaultTheme, theme.light, theme.dark))\n }\n\n const high = input.themes.filter((t) => t.highLight && t.highDark)\n if (high.length) {\n const inner = high.flatMap((t) => themeBlocks(t, t.name === defaultTheme, t.highLight!, t.highDark!))\n parts.push(`/* prefers-contrast: more -> the high-contrast variant of each theme */\\n${media('(prefers-contrast: more)', inner.join('\\n\\n'))}`)\n }\n\n if (input.preferences !== false) {\n const durations = (input.base ?? []).filter(([n]) => n.startsWith('--ty-dur-')).map(([n]) => [n, '0ms'] as [string, string])\n if (durations.length) parts.push(media('(prefers-reduced-motion: reduce)', rule(ANY_SCOPE, decls(durations))))\n parts.push(media('(prefers-reduced-transparency: reduce)', rule(ANY_SCOPE, decls(OPAQUE_VARS))))\n parts.push(`@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\\n${indent(rule(ANY_SCOPE, decls(OPAQUE_VARS)))}\\n}`)\n parts.push(media('(forced-colors: active)', rule(ANY_SCOPE, decls(FORCED_COLORS_VARS))))\n }\n\n const body = parts.join('\\n\\n')\n const layered = input.layer === null ? body : `@layer ${input.layer ?? 'tympan.tokens'} {\\n${indent(body)}\\n}`\n return `${input.banner ? `${input.banner}\\n` : ''}${layered}\\n`\n}\n\n/** Generator output for one theme config, as variable lists. */\nexport function themeVarsFor(config: ThemeConfig): ThemeVars {\n const vars: ThemeVars = {\n name: config.name,\n light: themeVariables(resolveTheme(config, 'light')),\n dark: themeVariables(resolveTheme(config, 'dark')),\n }\n if (config.contrast !== 'high') {\n vars.highLight = themeVariables(resolveTheme(config, 'light', 'high'))\n vars.highDark = themeVariables(resolveTheme(config, 'dark', 'high'))\n }\n return vars\n}\n\nexport interface ThemeCssOptions {\n /** Make this theme the `:root` default (for a standalone stylesheet). */\n asDefault?: boolean\n /** Include the density blocks. */\n densities?: boolean\n layer?: string | null\n}\n\n/** CSS for one theme config, straight from the generator (used by the customizer). */\nexport function generateThemeCss(config: ThemeConfig, options: ThemeCssOptions = {}): string {\n return buildStylesheet({\n themes: [themeVarsFor(config)],\n defaultTheme: options.asDefault ? config.name : null,\n densities: options.densities\n ? { default: densityVariables('default'), compact: densityVariables('compact'), comfortable: densityVariables('comfortable') }\n : undefined,\n layer: options.layer === undefined ? 'tympan.tokens' : options.layer,\n })\n}\n\n/** Variable lists of every built-in preset. */\nexport function presetThemeVars(list: readonly ThemeConfig[] = builtInPresets): ThemeVars[] {\n return list.map(themeVarsFor)\n}\n\n/**\n * The opt-in stylesheet of the print themes (`print-themes.css`): every\n * listed theme scoped to its `data-ty-theme` attribute, with its high-contrast\n * variant, and no user-preference blocks (the main token sheet has them).\n * Load it after `tokens.css`.\n */\nexport function generatePrintThemesCss(list: readonly ThemeConfig[] = printThemePresets, options: { layer?: string | null; banner?: string; themes?: ThemeVars[] } = {}): string {\n return buildStylesheet({\n themes: options.themes ?? list.map(themeVarsFor),\n defaultTheme: null,\n layer: options.layer === undefined ? 'tympan.tokens' : options.layer,\n preferences: false,\n banner: options.banner,\n })\n}\n\nexport { DENSITIES }\n","// Canvas tokens (--ty-flow-*) for the flow canvas (@datatechsolutions/tympan/flow): kind tones, connectors,\n// node frame and state rings, the canvas plane, provenance band and research\n// step sizes, and data shape colours.\n//\n// Colour tokens are references to theme roles, emitted as `var(--ty-role)` so\n// every theme, mode, contrast level and forced-colours mapping follows without\n// a per-theme copy. In DTCG they are aliases (`{color.accent}`,\n// `{dimension.radius-card}`); a soft tint carries its mix in\n// `$extensions[\"br.com.datatechsolutions.tympan\"].mix`. Sizes are plain px dimensions (the\n// provenance layout reads them at mount). No gradients: the design direction\n// reserves the gradient for the primary button.\n\nexport type FlowToken =\n | { type: 'color'; ref: string; mix?: number }\n | { type: 'dimension'; ref: string }\n | { type: 'dimension'; px: number }\n\nexport const FLOW_TONES = [\n 'categorical-1', 'categorical-2', 'categorical-3', 'categorical-4',\n 'categorical-5', 'categorical-6', 'categorical-7', 'categorical-8', 'neutral',\n] as const\nexport type FlowTone = (typeof FLOW_TONES)[number]\n\n/** Tint strength of a tone's soft variant (badge background). */\nconst SOFT_MIX = 14\n\nconst color = (ref: string, mix?: number): FlowToken => (mix === undefined ? { type: 'color', ref } : { type: 'color', ref, mix })\nconst px = (value: number): FlowToken => ({ type: 'dimension', px: value })\n\nfunction toneTokens(): Array<[string, FlowToken]> {\n const out: Array<[string, FlowToken]> = []\n const cats = FLOW_TONES.filter((t) => t !== 'neutral')\n // Full strength (bubble fill, port, overview map), ink on it, soft tint and text in the tone.\n for (const t of cats) out.push([`tone-${t}`, color(t)])\n out.push(['tone-neutral', color('ink-3')])\n for (const t of cats) out.push([`tone-${t}-ink`, color('on-accent')])\n out.push(['tone-neutral-ink', color('surface-solid')])\n for (const t of cats) out.push([`tone-${t}-soft`, color(t, SOFT_MIX)])\n out.push(['tone-neutral-soft', color('surface-sunken')])\n for (const t of cats) out.push([`tone-${t}-text`, color(t)])\n out.push(['tone-neutral-text', color('ink-2')])\n return out\n}\n\n/** Every canvas token, in stylesheet order (name without the `--ty-flow-` prefix). */\nexport const FLOW_TOKENS: ReadonlyArray<readonly [string, FlowToken]> = [\n ...toneTokens(),\n // Connectors. Rest uses the >=3:1 boundary role (WCAG 1.4.11), not line-strong.\n // State colours: traversed success, active info, blocked warning, pending neutral.\n ['connector', color('input')],\n ['connector-active', color('info')],\n ['connector-true', color('success')],\n ['connector-false', color('danger')],\n ['connector-rule', color('categorical-2')],\n ['connector-traversed', color('success')],\n ['connector-blocked', color('warning')],\n ['connector-pending', color('neutral')],\n ['connector-width', px(1.5)],\n ['connector-width-active', px(2.5)],\n // Node frame and state rings. Running is info (cyan), suspended is warning\n // (amber), so \"em execução\" and \"aguardando\" never share a hue.\n ['node-border', color('line-strong')],\n ['node-border-hover', color('input')],\n ['ring-selected', color('accent')],\n ['ring-running', color('info')],\n ['ring-suspended', color('warning')],\n ['ring-succeeded', color('success')],\n ['ring-failed', color('danger')],\n // The \"now\" cursor of run timelines: magenta, off every state hue.\n ['cursor-now', color('cursor-now')],\n ['node-surface', color('surface-raised-solid')],\n ['node-radius', { type: 'dimension', ref: 'radius-card' }],\n // Canvas plane.\n ['plane', color('surface-sunken')],\n ['grid-dot', color('line-strong')],\n ['guide', color('accent')],\n ['marquee', color('accent-soft')],\n // Provenance bands.\n ['band', px(96)],\n ['band-label', px(130)],\n ['node-h', px(72)],\n ['node-w', px(236)],\n // Research steps and the data shapes on their ports (colour always paired with the shape word).\n ['step-w', px(250)],\n ['step-h', px(86)],\n ['col-gap', px(56)],\n ['shape-records', color('accent')],\n ['shape-table', color('categorical-1')],\n ['shape-number', color('warning')],\n ['shape-chart', color('categorical-8')],\n ['shape-decision', color('danger')],\n]\n\nexport const flowCssName = (name: string) => `--ty-flow-${name}`\n\n/** CSS value of one canvas token. */\nexport function flowTokenCss(token: FlowToken): string {\n if ('px' in token) return `${token.px}px`\n const ref = `var(--ty-${token.ref})`\n return token.type === 'color' && token.mix !== undefined ? `color-mix(in oklab, ${ref} ${token.mix}%, transparent)` : ref\n}\n\n/** Ordered `[--ty-flow-name, value]` pairs (the generator's direct serialisation). */\nexport function flowVariables(): Array<[string, string]> {\n return FLOW_TOKENS.map(([name, token]) => [flowCssName(name), flowTokenCss(token)])\n}\n\n/** DTCG tree of the canvas tokens; colour and radius values alias the theme tree. */\nexport function flowToDtcg(): Record<string, unknown> {\n const flow: Record<string, unknown> = {}\n for (const [name, token] of FLOW_TOKENS) {\n const app: Record<string, unknown> = { cssName: flowCssName(name) }\n let $value: unknown\n if ('px' in token) $value = { value: token.px, unit: 'px' }\n else if (token.type === 'color') {\n $value = `{color.${token.ref}}`\n if (token.mix !== undefined) app.mix = { space: 'oklab', amount: token.mix / 100, with: 'transparent' }\n } else $value = `{dimension.${token.ref}}`\n flow[name] = { $type: token.type, $value, $extensions: { 'br.com.datatechsolutions.tympan': app } }\n }\n return {\n $description: 'Canvas tokens for the flow canvas (@datatechsolutions/tympan/flow). Colour values alias theme roles and are emitted as var() references. Generated by @datatechsolutions/tympan-tokens.',\n flow,\n }\n}\n\n/**\n * The `[data-tone]` mapping: a tone name on any element selects its four parts\n * as `--ty-flow-tone`, `-ink`, `-soft` and `-text`.\n */\nexport function flowToneRules(): string {\n return FLOW_TONES.map(\n (t) =>\n `[data-tone=\"${t}\"] {\\n` +\n ['', '-ink', '-soft', '-text'].map((part) => ` --ty-flow-tone${part}: var(--ty-flow-tone-${t}${part});`).join('\\n') +\n '\\n}',\n ).join('\\n\\n')\n}\n","// Bundled web fonts. Tympan ships every family its themes name as woff2\n// files inside this package (packages/tokens/fonts/, fetched once by\n// scripts/fetch-fonts.mjs and committed), declared with @font-face in\n// dist/fonts.css (imported by tokens.css) and in the print theme sheets.\n// The CJK families are the exception: they ship in the optional\n// @datatechsolutions/tympan-fonts-cjk package (see CJK_FONT_FAMILIES).\n// @font-face only downloads a file when text uses that face and falls in its\n// unicode-range, so nothing is fetched from a third party at runtime and an\n// unused script or theme costs nothing.\n//\n// The lists below are the source of truth for what scripts/fetch-fonts.mjs\n// downloads; the specs use the Google Fonts css2 syntax\n// (`Family Name:axes@values`) because that is where the files come from.\n\nimport { SCRIPT_RULES } from './scripts.ts'\n\n/** Base stacks of every preset: Source Serif 4, IBM Plex Sans, IBM Plex Mono. */\nexport const BASE_FONT_SPECS: readonly string[] = [\n 'Source Serif 4:ital,opsz,wght@0,8..60,400;0,8..60,600;0,8..60,700;1,8..60,400',\n 'IBM Plex Sans:ital,wght@0,400;0,500;0,600;0,700;1,400',\n 'IBM Plex Mono:ital,wght@0,400;0,500;0,600;0,700;1,400',\n]\n\nconst NOTO_WEIGHTS = 'wght@400;500;600;700'\n\n/** Noto families named by the base stacks and the per-script `:lang()` rules. */\nexport const SCRIPT_FONT_FAMILIES: readonly string[] = [\n ...new Set([\n 'Noto Sans',\n 'Noto Serif',\n 'Noto Sans Mono',\n 'Noto Naskh Arabic',\n 'Noto Sans Arabic',\n 'Noto Sans Hebrew',\n 'Noto Serif Hebrew',\n 'Noto Sans Devanagari',\n 'Noto Serif Devanagari',\n 'Noto Sans Bengali',\n 'Noto Sans Tamil',\n 'Noto Sans Thai',\n 'Noto Serif Thai',\n 'Noto Sans Ethiopic',\n 'Noto Serif Ethiopic',\n 'Noto Sans Armenian',\n 'Noto Sans Georgian',\n 'Noto Sans JP',\n 'Noto Serif JP',\n 'Noto Sans SC',\n 'Noto Serif SC',\n 'Noto Sans KR',\n 'Noto Serif KR',\n ...SCRIPT_RULES.flatMap((r) => [...r.sans, ...(r.serif ?? [])]),\n ]),\n]\n\nexport const SCRIPT_FONT_SPECS: readonly string[] = SCRIPT_FONT_FAMILIES.map((f) => `${f}:${NOTO_WEIGHTS}`)\n\n/**\n * The CJK Noto families (about 41 MB of woff2). The token stacks and the\n * `:lang()` rules still name them, but their files and @font-face rules live\n * in the optional package @datatechsolutions/tympan-fonts-cjk (activated with\n * `import '@datatechsolutions/tympan-fonts-cjk/fonts.css'`); without it the\n * browser falls back to the system CJK faces.\n */\nexport const CJK_FONT_FAMILIES: readonly string[] = [\n 'Noto Sans JP',\n 'Noto Serif JP',\n 'Noto Sans SC',\n 'Noto Serif SC',\n 'Noto Sans TC',\n 'Noto Serif TC',\n 'Noto Sans KR',\n 'Noto Serif KR',\n]\n\nconst isCjkSpec = (spec: string) => CJK_FONT_FAMILIES.includes(spec.split(':')[0]!)\n\n/** Specs whose faces go into the fonts.css of @datatechsolutions/tympan-fonts-cjk. */\nexport const CJK_FONT_SPECS: readonly string[] = SCRIPT_FONT_SPECS.filter(isCjkSpec)\n\n/** Every spec whose faces go into dist/fonts.css (and so tokens.css): base and non-CJK Noto. */\nexport const CORE_FONT_SPECS: readonly string[] = [...BASE_FONT_SPECS, ...SCRIPT_FONT_SPECS.filter((s) => !isCjkSpec(s))]\n\n/**\n * Family names that are platform faces, generic keywords or legacy aliases\n * kept as fallbacks; they get no @font-face (tests check that every other\n * family a theme names is bundled).\n */\nexport const SYSTEM_FONT_FAMILIES: readonly string[] = [\n 'serif', 'sans-serif', 'monospace', 'cursive', 'fantasy', 'system-ui', 'ui-monospace', 'ui-sans-serif', 'ui-serif',\n '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Segoe Print', 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial',\n 'Georgia', 'Times New Roman', 'Times', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New',\n 'Courier', 'Palatino', 'Palatino Linotype', 'Book Antiqua', 'Garamond', 'Baskerville', 'Didot', 'Futura', 'Gill Sans',\n 'Optima', 'Impact', 'Verdana', 'Tahoma', 'Trebuchet MS', 'Arial Narrow', 'Arial Black', 'Avenir', 'Avenir Next',\n 'American Typewriter', 'Rockwell', 'Copperplate', 'Bodoni 72', 'Hoefler Text', 'Iowan Old Style', 'Charter',\n 'Source Serif Pro',\n]\n\n/** Shape of fonts/manifest.json (written by scripts/fetch-fonts.mjs). */\nexport interface FontManifest {\n families: Record<string, { slug: string; version: string | null; files: number; bytes: number; license: string; licenseFile: string }>\n faces: Record<string, { family: string; style: string; weights: number[]; unicodeRange: string | null; file: string; bytes: number }>\n specs: Record<string, string[]>\n}\n\n/**\n * @font-face rules for the faces of `specs`, with `url(<base><file>)`\n * (`base` is the path from the stylesheet to the fonts/ folder), font-display\n * swap and the unicode-range of each slice. Faces shared by several specs\n * are declared once.\n */\nexport function fontFaceCss(manifest: FontManifest, specs: readonly string[], base: string): string {\n const ids = new Set<string>()\n for (const spec of specs) {\n const faces = manifest.specs[spec]\n if (!faces) throw new Error(`Font spec not bundled (run scripts/fetch-fonts.mjs): ${spec}`)\n for (const id of faces) ids.add(id)\n }\n return [...ids]\n .map((id) => {\n const f = manifest.faces[id]!\n const lo = Math.min(...f.weights)\n const hi = Math.max(...f.weights)\n return [\n '@font-face {',\n ` font-family: '${f.family}';`,\n ` font-style: ${f.style};`,\n ` font-weight: ${lo === hi ? lo : `${lo} ${hi}`};`,\n ' font-display: swap;',\n ` src: url('${base}${f.file}') format('woff2');`,\n ...(f.unicodeRange ? [` unicode-range: ${f.unicodeRange};`] : []),\n '}',\n ].join('\\n')\n })\n .join('\\n')\n}\n","// @datatechsolutions/tympan-tokens: design tokens and the theme generator (FSL-1.1-ALv2).\nexport * from './color.ts'\nexport * from './theme.ts'\nexport * from './presets.ts'\nexport * from './dtcg.ts'\nexport * from './stylesheet.ts'\nexport * from './flow.ts'\nexport * from './print-presets.ts'\nexport * from './print-themes.ts'\nexport * from './print-aliases.ts'\nexport * from './fonts.ts'\n\nimport { presets as corePresets } from './presets.ts'\nimport { printThemePresets } from './print-themes.ts'\nimport type { ThemeConfig } from './theme.ts'\n\n// Unified exported themes: UI + Book themes combined\nexport const allThemes: readonly ThemeConfig[] = [...corePresets, ...printThemePresets]\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["fromLinear","px","builtInPresets","corePresets"],"sources":["../src/color.ts","../src/theme.ts","../src/presets.ts","../src/dtcg.ts","../src/print-presets.ts","../src/print-themes.ts","../src/scripts.ts","../src/stylesheet.ts","../src/flow.ts","../src/fonts.ts","../src/print-book-themes.ts","../src/index.ts"],"sourcesContent":["// Colour math for the theme generator: sRGB <-> OKLab <-> OKLCH (from Björn\n// Ottosson's published OKLab definition), gamut mapping by chroma reduction,\n// alpha compositing, WCAG 2 contrast ratio and APCA lightness contrast\n// (informational only). Pure and deterministic; no dependencies.\n\n/** Straight (non-premultiplied) sRGB colour, channels 0..1. */\nexport interface Rgba {\n r: number\n g: number\n b: number\n a: number\n}\n\nexport interface Oklch {\n l: number\n c: number\n h: number\n}\n\nconst clamp01 = (v: number) => Math.min(1, Math.max(0, v))\n\nfunction toLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4\n}\n\nfunction fromLinear(c: number): number {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055\n}\n\nexport function rgbToOklab({ r, g, b }: Rgba): { L: number; a: number; b: number } {\n const lr = toLinear(r)\n const lg = toLinear(g)\n const lb = toLinear(b)\n const l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb)\n const m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb)\n const s = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb)\n return {\n L: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n }\n}\n\n/** OKLab to linear-light sRGB (may be out of gamut). */\nfunction oklabToLinear(L: number, a: number, b: number): [number, number, number] {\n const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3\n const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3\n const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ]\n}\n\nexport function rgbToOklch(c: Rgba): Oklch {\n const { L, a, b } = rgbToOklab(c)\n const chroma = Math.hypot(a, b)\n let h = (Math.atan2(b, a) * 180) / Math.PI\n if (h < 0) h += 360\n return { l: L, c: chroma, h: chroma < 1e-6 ? 0 : h }\n}\n\nfunction inGamut(lin: [number, number, number]): boolean {\n const eps = 1e-6\n return lin.every((v) => v >= -eps && v <= 1 + eps)\n}\n\n/**\n * OKLCH to sRGB. Out-of-gamut colours keep lightness and hue and lose chroma\n * (binary search), which preserves the perceived tone of a ramp step.\n */\nexport function oklchToRgb({ l, c, h }: Oklch, alpha = 1): Rgba {\n const L = clamp01(l)\n const rad = (h * Math.PI) / 180\n const lin = (chroma: number) => oklabToLinear(L, chroma * Math.cos(rad), chroma * Math.sin(rad))\n let chroma = Math.max(0, c)\n if (!inGamut(lin(chroma))) {\n let lo = 0\n let hi = chroma\n for (let i = 0; i < 32; i++) {\n const mid = (lo + hi) / 2\n if (inGamut(lin(mid))) lo = mid\n else hi = mid\n }\n chroma = lo\n }\n // Quantised to 8 bits per channel so every serialisation (hex, DTCG\n // components, rgb()) round-trips to the same value.\n const [r, g, b] = lin(chroma).map((v) => Math.round(clamp01(fromLinear(clamp01(v))) * 255) / 255) as [number, number, number]\n return { r, g, b, a: alpha }\n}\n\nconst hex2 = (v: number) =>\n Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, '0')\n\n/** `#rrggbb` (alpha ignored). */\nexport function toHex(c: Rgba): string {\n return `#${hex2(c.r)}${hex2(c.g)}${hex2(c.b)}`\n}\n\n/** CSS serialisation: hex when opaque, `rgb(r g b / a)` otherwise. */\nexport function toCss(c: Rgba): string {\n if (c.a >= 1) return toHex(c)\n const ch = (v: number) => Math.round(clamp01(v) * 255)\n return `rgb(${ch(c.r)} ${ch(c.g)} ${ch(c.b)} / ${Math.round(c.a * 1000) / 1000})`\n}\n\n/** Parses `#rgb`, `#rrggbb`, `#rrggbbaa`, `rgb(r g b / a)` and `rgba(r, g, b, a)`. */\nexport function parseColor(input: string): Rgba {\n const s = input.trim().toLowerCase()\n if (s.startsWith('#')) {\n let h = s.slice(1)\n if (h.length === 3) h = [...h].map((x) => x + x).join('')\n if (h.length !== 6 && h.length !== 8) throw new Error(`Invalid colour ${input}`)\n const n = (i: number) => parseInt(h.slice(i, i + 2), 16) / 255\n return { r: n(0), g: n(2), b: n(4), a: h.length === 8 ? n(6) : 1 }\n }\n const m = /^rgba?\\(([^)]+)\\)$/.exec(s)\n if (m && m[1]) {\n const parts = m[1].split(/[\\s,/]+/).filter(Boolean).map(Number)\n const [r = 0, g = 0, b = 0, a = 1] = parts\n return { r: r / 255, g: g / 255, b: b / 255, a }\n }\n throw new Error(`Unsupported colour ${input}`)\n}\n\n/** Source-over compositing of `top` onto `bottom`. */\nexport function composite(top: Rgba, bottom: Rgba): Rgba {\n const a = top.a + bottom.a * (1 - top.a)\n if (a === 0) return { r: 0, g: 0, b: 0, a: 0 }\n const mix = (t: number, b: number) => (t * top.a + b * bottom.a * (1 - top.a)) / a\n return { r: mix(top.r, bottom.r), g: mix(top.g, bottom.g), b: mix(top.b, bottom.b), a }\n}\n\n/** Composites a stack given from top to bottom; the last layer should be opaque. */\nexport function flatten(stack: Rgba[]): Rgba {\n return stack.reduceRight<Rgba | null>((acc, layer) => (acc ? composite(layer, acc) : layer), null) ?? { r: 1, g: 1, b: 1, a: 1 }\n}\n\n/** WCAG 2.x relative luminance. */\nexport function luminance(c: Rgba): number {\n return 0.2126 * toLinear(c.r) + 0.7152 * toLinear(c.g) + 0.0722 * toLinear(c.b)\n}\n\n/** WCAG 2.x contrast ratio (1..21) between two opaque colours. */\nexport function contrastRatio(a: Rgba, b: Rgba): number {\n const la = luminance(a)\n const lb = luminance(b)\n const [hi, lo] = la > lb ? [la, lb] : [lb, la]\n return (hi + 0.05) / (lo + 0.05)\n}\n\n/**\n * APCA lightness contrast Lc (text on background), implemented from the\n * public description of the APCA-W3 0.0.98G constants. Informational only:\n * WCAG 2.2 conformance is decided by `contrastRatio`.\n */\nexport function apcaContrast(text: Rgba, background: Rgba): number {\n const y = (c: Rgba) => 0.2126729 * c.r ** 2.4 + 0.7151522 * c.g ** 2.4 + 0.072175 * c.b ** 2.4\n const clampBlack = (v: number) => (v > 0.022 ? v : v + (0.022 - v) ** 1.414)\n const yt = clampBlack(y(text))\n const yb = clampBlack(y(background))\n if (Math.abs(yb - yt) < 0.0005) return 0\n if (yb > yt) {\n const sapc = (yb ** 0.56 - yt ** 0.57) * 1.14\n return sapc < 0.1 ? 0 : (sapc - 0.027) * 100\n }\n const sapc = (yb ** 0.65 - yt ** 0.62) * 1.14\n return sapc > -0.1 ? 0 : (sapc + 0.027) * 100\n}\n\n/** CIE L*a*b* (D65) from sRGB, via CIE XYZ. */\nexport function rgbToLab({ r, g, b }: Rgba): { L: number; a: number; b: number } {\n const lr = toLinear(r)\n const lg = toLinear(g)\n const lb = toLinear(b)\n const x = (0.4124564 * lr + 0.3575761 * lg + 0.1804375 * lb) / 0.95047\n const y = 0.2126729 * lr + 0.7151522 * lg + 0.072175 * lb\n const z = (0.0193339 * lr + 0.119192 * lg + 0.9503041 * lb) / 1.08883\n const f = (t: number) => (t > 216 / 24389 ? Math.cbrt(t) : (24389 / 27 * t + 16) / 116)\n const fx = f(x)\n const fy = f(y)\n const fz = f(z)\n return { L: 116 * fy - 16, a: 500 * (fx - fy), b: 200 * (fy - fz) }\n}\n\n/**\n * CIEDE2000 colour difference (ΔE00) between two opaque colours, implemented\n * from the published formula (Sharma, Wu and Dalal, 2005). About 1 is a just\n * noticeable difference; 10 or more reads as clearly different colours.\n */\nexport function deltaE2000(c1: Rgba, c2: Rgba): number {\n const { L: L1, a: a1, b: b1 } = rgbToLab(c1)\n const { L: L2, a: a2, b: b2 } = rgbToLab(c2)\n const rad = Math.PI / 180\n const C1 = Math.hypot(a1, b1)\n const C2 = Math.hypot(a2, b2)\n const Cm = (C1 + C2) / 2\n const G = 0.5 * (1 - Math.sqrt(Cm ** 7 / (Cm ** 7 + 25 ** 7)))\n const a1p = (1 + G) * a1\n const a2p = (1 + G) * a2\n const C1p = Math.hypot(a1p, b1)\n const C2p = Math.hypot(a2p, b2)\n const hp = (a: number, b: number) => {\n if (a === 0 && b === 0) return 0\n const h = Math.atan2(b, a) / rad\n return h < 0 ? h + 360 : h\n }\n const h1p = hp(a1p, b1)\n const h2p = hp(a2p, b2)\n const dLp = L2 - L1\n const dCp = C2p - C1p\n let dhp = 0\n if (C1p * C2p !== 0) {\n dhp = h2p - h1p\n if (dhp > 180) dhp -= 360\n else if (dhp < -180) dhp += 360\n }\n const dHp = 2 * Math.sqrt(C1p * C2p) * Math.sin((dhp / 2) * rad)\n const Lmp = (L1 + L2) / 2\n const Cmp = (C1p + C2p) / 2\n let hmp = h1p + h2p\n if (C1p * C2p !== 0) {\n if (Math.abs(h1p - h2p) <= 180) hmp = (h1p + h2p) / 2\n else hmp = h1p + h2p < 360 ? (h1p + h2p + 360) / 2 : (h1p + h2p - 360) / 2\n }\n const T =\n 1 - 0.17 * Math.cos((hmp - 30) * rad) + 0.24 * Math.cos(2 * hmp * rad) + 0.32 * Math.cos((3 * hmp + 6) * rad) - 0.2 * Math.cos((4 * hmp - 63) * rad)\n const dTheta = 30 * Math.exp(-(((hmp - 275) / 25) ** 2))\n const Rc = 2 * Math.sqrt(Cmp ** 7 / (Cmp ** 7 + 25 ** 7))\n const Sl = 1 + (0.015 * (Lmp - 50) ** 2) / Math.sqrt(20 + (Lmp - 50) ** 2)\n const Sc = 1 + 0.045 * Cmp\n const Sh = 1 + 0.015 * Cmp * T\n const Rt = -Math.sin(2 * dTheta * rad) * Rc\n return Math.sqrt((dLp / Sl) ** 2 + (dCp / Sc) ** 2 + (dHp / Sh) ** 2 + Rt * (dCp / Sc) * (dHp / Sh))\n}\n","// Deterministic theme generator. Input: seed hues and chroma, a radius base,\n// contrast level, glass on/off and optional pinned colours. Output: 11-step\n// OKLCH ramps, paired semantic roles (X / on-X), shadows, radii and glass\n// values for one mode, with every declared contrast pair checked and, where a\n// role is not pinned, nudged along its lightness axis until WCAG 2.2 AA holds.\n//\n// The role model (paired surface/foreground roles, one radius base deriving\n// the radius scale, themes as a swap of custom properties) and the idea of\n// 11-step ramps in OKLCH are publicly documented concepts (sources in\n// PROVENANCE.md). No code or values were taken from them; the lightness curve,\n// chroma curve, hues and role recipes below are this project's own.\n\nimport { apcaContrast, contrastRatio, flatten, oklchToRgb, parseColor, rgbToOklch, toCss, type Oklch, type Rgba } from './color.ts'\n\nexport type Mode = 'light' | 'dark'\nexport type ContrastLevel = 'default' | 'high'\nexport type Density = 'compact' | 'default' | 'comfortable'\n\nexport interface Seed {\n /** OKLCH hue in degrees. */\n hue: number\n /** Peak OKLCH chroma of the ramp (0..~0.37). */\n chroma: number\n}\n\nexport type SeedName = 'brand' | 'neutral' | 'danger' | 'warning' | 'success' | 'info'\n\n/**\n * Typographic roles a theme may set. They map onto the base font tokens the\n * components read: `display` -> `--ty-font-serif` (headings h1 to h3 and KPI\n * numbers), `body` -> `--ty-font-sans` (everything else), `mono` ->\n * `--ty-font-mono` (identifiers). A role left out keeps the base stack.\n */\nexport type FontRole = 'display' | 'body' | 'mono' | 'sans' | 'serif'\n\n/** CSS token of each font role (`--ty-font-<name>`). */\nexport const FONT_ROLE_TOKENS: Record<FontRole, 'serif' | 'sans' | 'mono'> = { display: 'serif', body: 'sans', mono: 'mono', sans: 'sans', serif: 'serif' }\n\n/** Elevation treatment: blurred shadows, none (flat print), or a hard offset shadow without blur. */\nexport type Elevation = 'soft' | 'flat' | 'offset'\n\nexport interface ThemeConfig {\n /** Identifier used in `data-ty-theme`. Lowercase letters, digits and dashes. */\n name: string\n /** Human label (customizer, docs). */\n label?: string\n seeds: Record<SeedName, Seed>\n /** Hues of the eight chart / categorical colours. */\n chartHues?: number[]\n /** Control radius in px; card and sheet radii derive from it. */\n radius: number\n contrast: ContrastLevel\n /** Translucent blurred surfaces when true; opaque when false. */\n glass: boolean\n /** Call-to-action fill: brand gradient or solid brand. */\n cta: 'gradient' | 'solid'\n /** Exact colours that override generated roles (CSS colour strings). */\n pins?: Partial<Record<Mode, Partial<Record<RoleName, string>>>>\n /** Exact gradient stops for the call to action, per mode. */\n ctaPins?: Partial<Record<Mode, string[]>>\n /** Font families per role, most preferred first, ending with a generic family. */\n fonts?: Partial<Record<FontRole, string[]>>\n /**\n * Stylesheet URL that loads the families of `fonts` (for example a Google\n * Fonts css2 URL). The token CSS never fetches it; the host or\n * ThemeProvider's `fonts` map adds the link.\n */\n fontsUrl?: string\n /** Shadow treatment; `soft` when omitted. */\n elevation?: Elevation\n /** Arbitrary string variables (e.g. for textures) */\n strings?: Record<string, string>\n /**\n * String variables per mode (`--ty-<name>`), for values that differ\n * between light and dark: a glass edge, a fill gradient, a brand mark\n * gradient. Like pins, they are exact design values: the generated\n * high-contrast variant leaves them out, so components fall back.\n */\n modeStrings?: Partial<Record<Mode, Record<string, string>>>\n /** Backdrop saturation of glass surfaces per mode (1.15 when omitted). */\n glassSaturate?: Partial<Record<Mode, number>>\n /** Exact shadow layers per mode, replacing the generated ones by name. */\n shadowPins?: Partial<Record<Mode, Partial<Record<ShadowName, ShadowPin[]>>>>\n /** Card and sheet radii in px, when they do not follow the control radius. */\n radii?: Partial<Record<'card' | 'sheet', number>>\n}\n\nexport type ShadowName = 'sheet' | 'raised' | 'floating' | 'modal' | 'sheet-inset'\n\n/** One shadow layer of `shadowPins`, its colour as a CSS colour string. */\nexport interface ShadowPin {\n x: number\n y: number\n blur: number\n spread: number\n color: string\n inset?: boolean\n}\n\nexport const RAMP_STEPS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950] as const\nexport type RampStep = (typeof RAMP_STEPS)[number]\n\n// Lightness and relative chroma per step (this project's own curve: near\n// white at 50, near black at 950, chroma peaking around 500-600).\nconst RAMP_L = [0.975, 0.94, 0.885, 0.815, 0.725, 0.635, 0.55, 0.47, 0.395, 0.325, 0.255]\nconst RAMP_C = [0.1, 0.2, 0.38, 0.6, 0.84, 1, 0.97, 0.88, 0.76, 0.62, 0.5]\n\n/** 11-step ramp for a seed. */\nexport function generateRamp(seed: Seed): Record<RampStep, Rgba> {\n const out = {} as Record<RampStep, Rgba>\n RAMP_STEPS.forEach((step, i) => {\n out[step] = oklchToRgb({ l: RAMP_L[i] ?? 0.5, c: seed.chroma * (RAMP_C[i] ?? 1), h: seed.hue })\n })\n return out\n}\n\n/** Seed derived from an existing colour (keeps hue; chroma scaled to a ramp peak). */\nexport function seedFromColor(color: string, peakChroma?: number): Seed {\n const { c, h } = rgbToOklch(parseColor(color))\n return { hue: Math.round(h * 10) / 10, chroma: Math.round((peakChroma ?? c) * 1000) / 1000 }\n}\n\n// ---------------------------------------------------------------------------\n// Roles\n// ---------------------------------------------------------------------------\n\nexport const ROLE_NAMES = [\n 'bg', 'on-bg',\n 'surface', 'on-surface', 'surface-raised', 'on-surface-raised', 'surface-sunken', 'on-surface-sunken',\n 'surface-solid', 'surface-raised-solid',\n 'ink', 'ink-2', 'ink-3',\n 'line', 'line-soft', 'line-strong', 'input',\n 'focus-ring',\n 'cursor-now',\n 'brand', 'on-brand', 'brand-strong', 'brand-soft', 'on-brand-soft',\n 'cta-solid', 'on-cta',\n 'secondary', 'on-secondary',\n 'danger', 'on-danger', 'danger-soft', 'on-danger-soft',\n 'warning', 'on-warning', 'warning-soft', 'on-warning-soft',\n 'success', 'on-success', 'success-soft', 'on-success-soft',\n 'info', 'on-info', 'info-soft', 'on-info-soft',\n 'neutral', 'on-neutral', 'neutral-soft', 'on-neutral-soft',\n 'proof-proved', 'proof-proved-soft', 'proof-pending', 'proof-pending-soft', 'proof-refuted', 'proof-refuted-soft',\n 'proof-not-disclosed', 'proof-not-disclosed-soft', 'proof-none', 'proof-none-soft',\n 'actor-person', 'actor-person-soft', 'actor-agent', 'actor-agent-soft', 'actor-system', 'actor-system-soft',\n 'chart-1', 'chart-2', 'chart-3', 'chart-4', 'chart-5', 'chart-6', 'chart-7', 'chart-8',\n 'nav-bg', 'on-nav', 'nav-active', 'on-nav-active', 'nav-line',\n 'backdrop', 'ambient-1', 'ambient-2',\n] as const\nexport type RoleName = (typeof ROLE_NAMES)[number]\n\n/** Design-direction names kept as aliases of the role model. */\nexport const ROLE_ALIASES: Record<string, RoleName> = {\n accent: 'brand',\n 'accent-strong': 'brand-strong',\n 'accent-soft': 'brand-soft',\n 'accent-ink': 'on-brand',\n 'on-accent': 'on-brand',\n 'on-accent-soft': 'on-brand-soft',\n 'categorical-1': 'chart-1',\n 'categorical-2': 'chart-2',\n 'categorical-3': 'chart-3',\n 'categorical-4': 'chart-4',\n 'categorical-5': 'chart-5',\n 'categorical-6': 'chart-6',\n 'categorical-7': 'chart-7',\n 'categorical-8': 'chart-8',\n}\n\ninterface Recipe {\n seed: SeedName | 'chart' | 'ambient'\n /** OKLCH lightness. */\n l: number\n /** Multiplier of the seed chroma. */\n c?: number\n /** Opacity. */\n a?: number\n /** Hue override (chart and ambient). */\n h?: number\n}\n\nconst TONES = ['danger', 'warning', 'success', 'info', 'neutral'] as const\n\nfunction recipes(mode: Mode, contrast: ContrastLevel, glass: boolean): Partial<Record<RoleName, Recipe>> {\n const dark = mode === 'dark'\n const high = contrast === 'high'\n const pick = (light: number, darkV: number) => (dark ? darkV : light)\n const softA = pick(0.1, 0.14) * (high ? 1.6 : 1)\n const r: Partial<Record<RoleName, Recipe>> = {\n bg: { seed: 'neutral', l: pick(0.975, 0.165), c: 0.5 },\n surface: { seed: 'neutral', l: pick(0.993, 0.235), c: 0.4, a: glass ? pick(0.82, 0.72) : 1 },\n 'surface-raised': { seed: 'neutral', l: pick(0.993, 0.275), c: 0.4, a: glass ? pick(0.94, 0.86) : 1 },\n 'surface-solid': { seed: 'neutral', l: pick(0.993, 0.235), c: 0.4 },\n 'surface-raised-solid': { seed: 'neutral', l: pick(0.993, 0.275), c: 0.4 },\n 'surface-sunken': { seed: 'neutral', l: pick(0.955, 0.195), c: 0.6 },\n ink: { seed: 'neutral', l: pick(0.21, 0.955), c: 2 },\n 'ink-2': { seed: 'neutral', l: high ? pick(0.27, 0.93) : pick(0.37, 0.87), c: 2 },\n 'ink-3': { seed: 'neutral', l: high ? pick(0.33, 0.9) : pick(0.5, 0.72), c: 2 },\n line: { seed: 'neutral', l: pick(0.55, 0.78), c: 2.5, a: high ? pick(0.45, 0.4) : pick(0.22, 0.16) },\n 'line-soft': { seed: 'neutral', l: pick(0.55, 0.78), c: 2.5, a: high ? pick(0.3, 0.25) : pick(0.12, 0.09) },\n 'line-strong': { seed: 'neutral', l: pick(0.55, 0.78), c: 2.5, a: high ? pick(0.75, 0.65) : pick(0.38, 0.3) },\n input: { seed: 'neutral', l: high ? pick(0.42, 0.78) : pick(0.6, 0.58), c: 2.5 },\n 'focus-ring': { seed: 'brand', l: high ? pick(0.4, 0.85) : pick(0.47, 0.79), c: 0.75 },\n // The \"now\" cursor of run timelines: magenta/pink, deliberately off every\n // state hue (success/warning/danger/info) so it never reads as a state.\n 'cursor-now': { seed: 'brand', l: pick(0.55, 0.74), c: 0.9, h: 330 },\n brand: { seed: 'brand', l: high ? pick(0.4, 0.85) : pick(0.47, 0.79), c: 0.75 },\n 'brand-strong': { seed: 'brand', l: high ? pick(0.33, 0.9) : pick(0.4, 0.87), c: 0.7 },\n 'brand-soft': { seed: 'brand', l: pick(0.55, 0.75), c: 0.8, a: softA },\n 'on-brand-soft': { seed: 'brand', l: high ? pick(0.36, 0.88) : pick(0.44, 0.82), c: 0.75 },\n 'on-brand': { seed: 'brand', l: pick(0.985, 0.25), c: 0.15 },\n 'cta-solid': { seed: 'brand', l: pick(0.45, 0.45), c: 0.8 },\n 'on-cta': { seed: 'brand', l: 0.985, c: 0.1 },\n secondary: { seed: 'neutral', l: pick(0.993, 0.275), c: 0.4, a: glass ? pick(0.7, 0.6) : 1 },\n 'on-secondary': { seed: 'neutral', l: pick(0.21, 0.955), c: 2 },\n backdrop: { seed: 'neutral', l: pick(0.2, 0.1), c: 2, a: pick(0.4, 0.6) },\n 'ambient-1': { seed: 'brand', l: 0.72, c: 0.9, a: glass ? pick(0.07, 0.12) : 0 },\n 'ambient-2': { seed: 'ambient', l: 0.75, c: 0.12, h: 230, a: glass ? pick(0.05, 0.08) : 0 },\n }\n for (const tone of TONES) {\n const chroma = tone === 'neutral' ? 2 : 1\n r[tone] = { seed: tone, l: high ? pick(0.44, 0.8) : pick(0.51, 0.74), c: chroma }\n r[`${tone}-soft`] = { seed: tone, l: pick(0.6, 0.7), c: chroma, a: softA }\n r[`on-${tone}-soft`] = { seed: tone, l: high ? pick(0.38, 0.86) : pick(0.45, 0.8), c: chroma }\n r[`on-${tone}`] = { seed: 'neutral', l: pick(0.985, 0.18), c: 0.3 }\n }\n return r\n}\n\n/** Contrast pairs every theme must satisfy (WCAG 2.2 AA). */\nexport interface ContrastPair {\n fg: RoleName | `cta-stop-${number}` | 'focus-ring'\n /** Background stack from top to bottom; translucent layers are composited. */\n over: Array<RoleName | `cta-stop-${number}`>\n min: 4.5 | 3\n kind: 'text' | 'ui'\n}\n\nexport function contrastPairs(ctaStops: number): ContrastPair[] {\n const pairs: ContrastPair[] = []\n const text = (fg: ContrastPair['fg'], ...over: ContrastPair['over']) => pairs.push({ fg, over, min: 4.5, kind: 'text' })\n const ui = (fg: ContrastPair['fg'], ...over: ContrastPair['over']) => pairs.push({ fg, over, min: 3, kind: 'ui' })\n for (const ink of ['ink', 'ink-2', 'ink-3'] as const) {\n text(ink, 'bg')\n text(ink, 'surface', 'bg')\n text(ink, 'surface-raised', 'bg')\n text(ink, 'surface-sunken')\n }\n text('on-bg', 'bg')\n text('on-surface', 'surface', 'bg')\n text('on-surface-raised', 'surface-raised', 'bg')\n text('on-surface-sunken', 'surface-sunken')\n text('brand', 'bg')\n text('brand', 'surface', 'bg')\n text('brand', 'surface-raised', 'bg')\n text('brand-strong', 'surface', 'bg')\n text('on-brand', 'brand')\n text('on-brand-soft', 'brand-soft', 'surface', 'bg')\n text('on-cta', 'cta-solid')\n for (let i = 0; i < ctaStops; i++) text('on-cta', `cta-stop-${i}`)\n text('on-secondary', 'secondary', 'bg')\n for (const tone of TONES) {\n text(tone, 'surface', 'bg')\n text(tone, 'surface-raised', 'bg')\n text(`on-${tone}`, tone)\n text(`on-${tone}-soft`, `${tone}-soft`, 'surface', 'bg')\n }\n for (const p of ['proved', 'pending', 'refuted', 'not-disclosed', 'none'] as const) {\n text(`proof-${p}`, 'surface', 'bg')\n text(`proof-${p}`, `proof-${p}-soft`, 'surface', 'bg')\n }\n for (const a of ['person', 'agent', 'system'] as const) text(`actor-${a}`, `actor-${a}-soft`, 'surface', 'bg')\n text('on-nav', 'nav-bg', 'bg')\n text('on-nav-active', 'nav-active', 'nav-bg', 'bg')\n ui('input', 'surface', 'bg')\n ui('input', 'bg')\n ui('input', 'surface-raised', 'bg')\n ui('focus-ring', 'bg')\n ui('focus-ring', 'surface', 'bg')\n ui('focus-ring', 'surface-raised', 'bg')\n ui('brand', 'surface-sunken')\n for (let i = 1; i <= 8; i++) ui(`chart-${i}` as RoleName, 'surface', 'bg')\n return pairs\n}\n\n// ---------------------------------------------------------------------------\n// Resolution\n// ---------------------------------------------------------------------------\n\nexport interface ShadowLayer {\n x: number\n y: number\n blur: number\n spread: number\n color: Rgba\n inset?: boolean\n}\n\nexport interface ContrastResult {\n fg: string\n over: string[]\n kind: 'text' | 'ui'\n min: number\n ratio: number\n apca: number\n pass: boolean\n}\n\nexport interface ResolvedTheme {\n name: string\n mode: Mode\n contrast: ContrastLevel\n colors: Record<string, Rgba>\n ramps: Record<SeedName, Record<RampStep, Rgba>>\n cta: { angle: number; stops: Rgba[] }\n shadows: Record<ShadowName, ShadowLayer[]>\n /** Pixel dimensions (radius, glass blur, focus width). */\n dimensions: Record<string, number>\n /** Font stacks keyed by token name (`serif`, `sans`, `mono`); empty when the theme keeps the base stacks. */\n fonts: Partial<Record<'serif' | 'sans' | 'mono', string[]>>\n numbers: Record<string, number>\n strings?: Record<string, string>\n report: ContrastResult[]\n}\n\n/** Hues of the eight chart colours when a theme sets none. */\nexport const DEFAULT_CHART_HUES = [250, 62, 165, 335, 215, 35, 110, 290]\n\nfunction colorFrom(recipe: Recipe, seeds: Record<SeedName, Seed>): Oklch & { a: number } {\n const seed = recipe.seed === 'chart' || recipe.seed === 'ambient' ? undefined : seeds[recipe.seed]\n const chroma = seed ? seed.chroma * (recipe.c ?? 1) : (recipe.c ?? 0.1)\n return { l: recipe.l, c: chroma, h: recipe.h ?? seed?.hue ?? 0, a: recipe.a ?? 1 }\n}\n\n/** Resolves one theme in one mode. */\nexport function resolveTheme(config: ThemeConfig, mode: Mode, contrastOverride?: ContrastLevel): ResolvedTheme {\n const contrast = contrastOverride ?? config.contrast\n const dark = mode === 'dark'\n const recipeMap = recipes(mode, contrast, config.glass)\n const lch: Partial<Record<RoleName, Oklch & { a: number }>> = {}\n for (const [role, recipe] of Object.entries(recipeMap) as Array<[RoleName, Recipe]>) lch[role] = colorFrom(recipe, config.seeds)\n\n const chartHues = config.chartHues ?? DEFAULT_CHART_HUES\n chartHues.slice(0, 8).forEach((h, i) => {\n lch[`chart-${i + 1}` as RoleName] = { l: dark ? 0.76 : 0.55, c: dark ? 0.13 : 0.14, h, a: 1 }\n })\n\n const pinned = new Set<RoleName>()\n const colors: Record<string, Rgba> = {}\n const pins = config.pins?.[mode] ?? {}\n const pinnedValue = (role: RoleName): Rgba | undefined => {\n // Pins are exact design values; the high-contrast variant regenerates.\n const v = contrast === config.contrast ? pins[role] : undefined\n return v ? parseColor(v) : undefined\n }\n const materialise = (role: RoleName) => {\n const p = pinnedValue(role)\n if (p) {\n pinned.add(role)\n colors[role] = p\n return\n }\n const v = lch[role]\n if (v) colors[role] = oklchToRgb(v, v.a)\n }\n for (const role of Object.keys(lch) as RoleName[]) materialise(role)\n\n // Roles defined as copies of others (after pins so they follow them).\n const copy = (role: RoleName, from: RoleName) => {\n const p = pinnedValue(role)\n if (p) {\n pinned.add(role)\n colors[role] = p\n } else if (colors[from]) {\n colors[role] = { ...colors[from]! }\n if (lch[from]) lch[role] = { ...lch[from]! }\n }\n }\n const aliasRoles = (): void => {\n copy('on-bg', 'ink-2')\n copy('on-surface', 'ink-2')\n copy('on-surface-raised', 'ink-2')\n copy('on-surface-sunken', 'ink-2')\n copy('proof-proved', 'on-success-soft')\n copy('proof-proved-soft', 'success-soft')\n copy('proof-pending', 'on-warning-soft')\n copy('proof-pending-soft', 'warning-soft')\n copy('proof-refuted', 'on-danger-soft')\n copy('proof-refuted-soft', 'danger-soft')\n copy('proof-not-disclosed', 'on-neutral-soft')\n copy('proof-not-disclosed-soft', 'neutral-soft')\n copy('proof-none', 'ink-3')\n copy('proof-none-soft', 'neutral-soft')\n copy('actor-person', 'on-brand-soft')\n copy('actor-person-soft', 'brand-soft')\n copy('actor-agent', 'ink-2')\n copy('actor-agent-soft', 'neutral-soft')\n copy('actor-system', 'ink-3')\n copy('actor-system-soft', 'neutral-soft')\n copy('nav-bg', 'surface')\n copy('on-nav', 'ink-2')\n copy('nav-active', 'brand-soft')\n copy('on-nav-active', 'on-brand-soft')\n copy('nav-line', 'line')\n }\n aliasRoles()\n\n // Call to action stops.\n const brand = config.seeds.brand\n const ctaPin = config.ctaPins?.[mode]\n let ctaStops: Rgba[]\n if (ctaPin && contrast === config.contrast) ctaStops = ctaPin.map(parseColor)\n else if (config.cta === 'solid') ctaStops = [colors['cta-solid']!]\n else\n ctaStops = [\n oklchToRgb({ l: 0.5, c: brand.chroma * 0.85, h: brand.hue - 12 }),\n oklchToRgb({ l: 0.47, c: brand.chroma * 0.8, h: brand.hue + 8 }),\n oklchToRgb({ l: 0.47, c: brand.chroma * 0.85, h: brand.hue + 60 }),\n ]\n\n // Contrast enforcement: nudge non-pinned foreground roles along lightness.\n const pairs = contrastPairs(ctaStops.length)\n const layer = (name: string): Rgba => {\n const m = /^cta-stop-(\\d+)$/.exec(name)\n if (m) return ctaStops[Number(m[1])]!\n return colors[name] ?? { r: 1, g: 1, b: 1, a: 1 }\n }\n const measure = (pair: ContrastPair) => {\n const bgc = flatten([...pair.over.map(layer), dark ? layer('bg') : layer('bg')])\n const fgc = flatten([layer(pair.fg), bgc])\n return { ratio: contrastRatio(fgc, bgc), apca: apcaContrast(fgc, bgc), bgc }\n }\n for (let pass = 0; pass < 3; pass++) {\n for (const pair of pairs) {\n const role = pair.fg as RoleName\n if (pinned.has(role) || !lch[role]) continue\n let guard = 0\n let m = measure(pair)\n while (m.ratio < pair.min && guard++ < 80) {\n const v = lch[role]!\n const bgL = rgbToOklch(m.bgc).l\n const step = bgL > 0.6 ? -0.01 : 0.01\n v.l = Math.min(0.995, Math.max(0.02, v.l + step))\n colors[role] = oklchToRgb(v, v.a)\n m = measure(pair)\n }\n }\n aliasRoles()\n }\n\n\n const report: ContrastResult[] = pairs.map((pair) => {\n const m = measure(pair)\n return {\n fg: pair.fg,\n over: pair.over,\n kind: pair.kind,\n min: pair.min,\n ratio: Math.round(m.ratio * 100) / 100,\n apca: Math.round(m.apca * 10) / 10,\n pass: m.ratio >= pair.min - 1e-9,\n }\n })\n\n // Aliases of the design-direction vocabulary.\n for (const [alias, role] of Object.entries(ROLE_ALIASES)) if (colors[role]) colors[alias] = colors[role]!\n\n const ramps = Object.fromEntries(\n (Object.keys(config.seeds) as SeedName[]).map((s) => [s, generateRamp(config.seeds[s])]),\n ) as Record<SeedName, Record<RampStep, Rgba>>\n\n const tint = oklchToRgb({ l: dark ? 0.12 : 0.2, c: config.seeds.neutral.chroma * 2, h: config.seeds.neutral.hue })\n const shade = (alpha: number) => ({ ...tint, a: Math.min(0.9, alpha * (dark ? 2 : 1)) })\n const inset: ShadowLayer = { x: 0, y: 1, blur: 0, spread: 0, inset: true, color: { r: 1, g: 1, b: 1, a: dark && config.glass ? 0.06 : 0 } }\n const elevation = config.elevation ?? 'soft'\n let shadows: ResolvedTheme['shadows']\n if (elevation === 'flat') {\n // Print-flat: surfaces sit on the page; only overlays keep a faint separation.\n const none: ShadowLayer[] = [{ x: 0, y: 0, blur: 0, spread: 0, color: { ...tint, a: 0 } }]\n shadows = { sheet: none, raised: none, floating: [{ x: 0, y: 2, blur: 6, spread: -2, color: shade(0.12) }], modal: [{ x: 0, y: 16, blur: 40, spread: -16, color: shade(0.3) }], 'sheet-inset': [inset] }\n } else if (elevation === 'offset') {\n // Hard shadow in the ink colour, no blur (cut-paper and poster styles).\n const ink = colors.ink ?? tint\n const hard = (d: number): ShadowLayer[] => [{ x: d, y: d, blur: 0, spread: 0, color: { ...ink, a: 1 } }]\n shadows = { sheet: hard(3), raised: hard(2), floating: hard(4), modal: hard(6), 'sheet-inset': [inset] }\n } else {\n shadows = {\n sheet: [\n { x: 0, y: 1, blur: 2, spread: 0, color: shade(0.04) },\n { x: 0, y: 8, blur: 24, spread: -12, color: shade(0.1) },\n ],\n raised: [{ x: 0, y: 4, blur: 12, spread: -2, color: shade(0.08) }],\n floating: [{ x: 0, y: 12, blur: 24, spread: -8, color: shade(0.14) }],\n modal: [{ x: 0, y: 40, blur: 100, spread: -30, color: shade(0.35) }],\n 'sheet-inset': [inset],\n }\n }\n\n const shadowPins = config.shadowPins?.[mode] ?? {}\n for (const [name, layers] of Object.entries(shadowPins) as Array<[ShadowName, ShadowPin[]]>) {\n shadows[name] = layers.map((l) => ({ ...l, color: parseColor(l.color) }))\n }\n\n const R = config.radius\n const dimensions: Record<string, number> = {\n radius: R,\n 'radius-control': R,\n 'radius-card': config.radii?.card ?? Math.round(R * 1.6),\n 'radius-sheet': config.radii?.sheet ?? Math.round(R * 2.4),\n 'radius-pill': 999,\n 'radius-agent': Math.max(2, Math.round(R * 0.6)),\n 'focus-width': contrast === 'high' ? 3 : 2,\n 'glass-blur-sheet': config.glass ? 20 : 0,\n 'glass-blur-floating': config.glass ? 24 : 0,\n }\n const numbers: Record<string, number> = { 'glass-saturate': config.glass ? (config.glassSaturate?.[mode] ?? 1.15) : 1 }\n\n const fonts: ResolvedTheme['fonts'] = {}\n for (const role of ['display', 'body', 'mono'] as const) {\n const list = config.fonts?.[role]\n if (list?.length) fonts[FONT_ROLE_TOKENS[role]] = [...list]\n }\n\n return { name: config.name, mode, contrast, colors, ramps, cta: { angle: 135, stops: ctaStops }, shadows, dimensions, numbers, fonts, strings: { ...config.strings, ...(contrast === config.contrast ? config.modeStrings?.[mode] : undefined) }, report }\n}\n\n// ---------------------------------------------------------------------------\n// Density (independent of the theme)\n// ---------------------------------------------------------------------------\n\nexport const DENSITIES: Record<Density, Record<string, number>> = {\n compact: { 'control-height': 36, 'control-height-touch': 44, 'control-height-compact': 28, density: 0.875 },\n default: { 'control-height': 40, 'control-height-touch': 44, 'control-height-compact': 32, density: 1 },\n comfortable: { 'control-height': 44, 'control-height-touch': 48, 'control-height-compact': 36, density: 1.125 },\n}\n\n// ---------------------------------------------------------------------------\n// Serialisation to CSS custom property lists\n// ---------------------------------------------------------------------------\n\nexport function shadowToCss(layers: ShadowLayer[]): string {\n return layers\n .map((l) => `${l.inset ? 'inset ' : ''}${l.x}px ${l.y}px ${l.blur}px ${l.spread}px ${toCss(l.color)}`)\n .join(', ')\n}\n\nexport function gradientToCss(angle: number, stops: Rgba[]): string {\n const list = stops.length === 1 ? [stops[0]!, stops[0]!] : stops\n return `linear-gradient(${angle}deg, ${list.map((s, i) => `${toCss(s)} ${Math.round((i / (list.length - 1)) * 100)}%`).join(', ')})`\n}\n\n/** Ordered `[--ty-name, value]` pairs for one resolved theme. */\nexport function themeVariables(t: ResolvedTheme): Array<[string, string]> {\n const out: Array<[string, string]> = []\n for (const [name, c] of Object.entries(t.colors)) out.push([`--ty-${name}`, toCss(c)])\n out.push(['--ty-cta', gradientToCss(t.cta.angle, t.cta.stops)])\n for (const [seed, ramp] of Object.entries(t.ramps)) {\n for (const step of RAMP_STEPS) out.push([`--ty-${seed}-${step}`, toCss(ramp[step])])\n }\n for (const [name, layers] of Object.entries(t.shadows)) out.push([`--ty-shadow-${name}`, shadowToCss(layers)])\n for (const [name, px] of Object.entries(t.dimensions)) out.push([`--ty-${name}`, `${px}px`])\n for (const [name, n] of Object.entries(t.numbers)) out.push([`--ty-${name}`, String(n)])\n for (const [name, list] of Object.entries(t.fonts)) out.push([`--ty-font-${name}`, fontStackToCss(list)])\n for (const [name, s] of Object.entries(t.strings ?? {})) out.push([`--ty-${name}`, s])\n return out\n}\n\n/**\n * CSS `font-family` value of a family list: names with spaces or digits are\n * quoted, keywords and single identifiers are not (the same rule as the\n * Style Dictionary font-family transform of the build).\n */\nexport function fontStackToCss(families: readonly string[]): string {\n return families.map((f) => (/[\\s\\d]/.test(f) && !/^[\\w-]+$/.test(f) ? `'${f}'` : f)).join(', ')\n}\n\n/** Family list of a CSS `font-family` value (quotes removed). */\nexport function parseFontStack(stack: string): string[] {\n return stack\n .split(',')\n .map((f) => f.trim().replace(/^[\"']|[\"']$/g, ''))\n .filter(Boolean)\n}\n\nexport function densityVariables(density: Density): Array<[string, string]> {\n return Object.entries(DENSITIES[density]).map(([k, v]) => [`--ty-${k}`, k === 'density' ? String(v) : `${v}px`])\n}\n","import { seedFromColor, type Seed, type SeedName, type ThemeConfig } from './theme.ts'\n\n// Seeds. The brand hue comes from the design direction's accent (§2.3); the\n// neutral carries a slight tint of the brand hue; semantic hues are chosen so\n// the proof-state greens sit about 30 degrees away from the brand teal (§2.3).\nconst brand = seedFromColor('#166e5a', 0.13)\n\nconst baseSeeds: Record<SeedName, Seed> = {\n brand,\n neutral: { hue: brand.hue, chroma: 0.012 },\n danger: { hue: 12, chroma: 0.2 },\n warning: { hue: 68, chroma: 0.15 },\n success: { hue: 148, chroma: 0.16 },\n info: { hue: 255, chroma: 0.06 },\n}\n\n/**\n * Default theme. Generated from seeds, with the exact colours of design\n * direction §2.3 pinned so the product matches the approved direction.\n */\nexport const tympanPreset: ThemeConfig = {\n name: 'tympan',\n label: 'Tympan',\n seeds: baseSeeds,\n radius: 10,\n contrast: 'default',\n glass: true,\n cta: 'gradient',\n pins: {\n light: {\n brand: '#166e5a',\n 'focus-ring': '#166e5a',\n 'brand-strong': '#0f5a49',\n 'brand-soft': 'rgb(22 110 90 / 0.10)',\n 'on-brand': '#f6fbf9',\n bg: '#f6f8fa',\n surface: 'rgb(252 253 253 / 0.82)',\n 'surface-raised': 'rgb(252 253 253 / 0.94)',\n 'surface-solid': '#fcfdfd',\n 'surface-raised-solid': '#fcfdfd',\n 'surface-sunken': '#eef2f5',\n line: 'rgb(100 116 139 / 0.22)',\n 'line-strong': 'rgb(100 116 139 / 0.38)',\n ink: '#0f172a',\n 'ink-2': '#334155',\n 'ink-3': '#526077',\n success: '#15803d',\n warning: '#a16207',\n danger: '#be123c',\n neutral: '#526077',\n },\n dark: {\n brand: '#34d399',\n 'focus-ring': '#34d399',\n 'brand-strong': '#6ee7b7',\n 'brand-soft': 'rgb(52 211 153 / 0.14)',\n 'on-brand': '#052e25',\n bg: '#0a0f1c',\n surface: 'rgb(20 28 46 / 0.72)',\n 'surface-raised': 'rgb(28 38 60 / 0.86)',\n 'surface-solid': '#141c2e',\n 'surface-raised-solid': '#1c263c',\n 'surface-sunken': '#0f1626',\n line: 'rgb(148 163 184 / 0.16)',\n 'line-strong': 'rgb(148 163 184 / 0.30)',\n ink: '#eef2f7',\n 'ink-2': '#cbd5e1',\n 'ink-3': '#94a3b8',\n success: '#4ade80',\n warning: '#fbbf24',\n danger: '#fb7185',\n neutral: '#94a3b8',\n },\n },\n ctaPins: {\n light: ['#047857', '#0f766e', '#0369a1'],\n dark: ['#047857', '#0f766e', '#0369a1'],\n },\n}\n\n/** Brand-free grey theme for embedding and white-label use. Fully generated. */\nexport const neutralPreset: ThemeConfig = {\n name: 'neutral',\n label: 'Neutral',\n seeds: {\n brand: { hue: 255, chroma: 0.03 },\n neutral: { hue: 255, chroma: 0.008 },\n danger: { hue: 18, chroma: 0.19 },\n warning: { hue: 70, chroma: 0.14 },\n success: { hue: 150, chroma: 0.14 },\n info: { hue: 255, chroma: 0.05 },\n },\n radius: 8,\n contrast: 'default',\n glass: true,\n cta: 'solid',\n}\n\n/**\n * A named product preset, selected by name\n * (`data-ty-theme=\"fakhir\"`). Today it carries the default theme's values; it\n * is a separate preset so an app that selects it keeps its look if the default changes.\n */\nexport const fakhirPreset: ThemeConfig = {\n ...tympanPreset,\n name: 'fakhir',\n label: 'Fakhir',\n}\n\n/**\n * The Astrlabe workflow engine's look (`data-ty-theme=\"astrlabe\"`): slate\n * neutrals, an indigo brand (indigo 500 as the accent family, one step darker\n * where text needs 4.5:1 on light grounds), liquid-glass surfaces (gradient\n * fills, specular edges, a strong saturation boost at night), the rounder\n * corners of that app (12 px controls, 20 px cards, 24 px sheets), its\n * compact type scale and the sky, indigo and violet mark. The call to\n * action is the indigo to purple gradient its primary buttons fill with, and\n * text (headings included) uses the platform's own system fonts. The state\n * contract holds on every ground: running is a cyan clearly off the indigo\n * brand, waiting is amber.\n */\nexport const astrlabePreset: ThemeConfig = {\n name: 'astrlabe',\n label: 'Astrlabe',\n seeds: {\n brand: seedFromColor('#6366f1', 0.2),\n neutral: { hue: 257, chroma: 0.02 },\n danger: { hue: 25, chroma: 0.2 },\n warning: { hue: 70, chroma: 0.15 },\n success: { hue: 150, chroma: 0.16 },\n info: { hue: 240, chroma: 0.1 },\n },\n chartHues: [277, 237, 163, 75, 12, 293, 185, 48],\n radius: 12,\n contrast: 'default',\n glass: true,\n cta: 'gradient',\n pins: {\n light: {\n brand: '#4f46e5',\n 'focus-ring': '#6366f1',\n 'brand-strong': '#4338ca',\n 'brand-soft': 'rgb(99 102 241 / 0.12)',\n 'on-brand': '#ffffff',\n bg: '#f8fafc',\n surface: 'rgb(255 255 255 / 0.72)',\n 'surface-raised': 'rgb(255 255 255 / 0.86)',\n 'surface-solid': '#ffffff',\n 'surface-raised-solid': '#ffffff',\n // The canvas plane: the app's pale lavender ground.\n 'surface-sunken': '#f2f3fa',\n // The liquid divider: slate 400 at about a quarter.\n line: 'rgb(148 163 184 / 0.26)',\n 'line-strong': 'rgb(100 116 139 / 0.45)',\n ink: '#0f172a',\n // Slate 600 for secondary text, as the app always had.\n 'ink-2': '#475569',\n // Slate 500 fails 4.5:1 on the sunken ground by a hair; this is the\n // nearest slate that holds AA there.\n 'ink-3': '#5b6779',\n success: '#15803d',\n // Cyan, deliberately off the indigo brand, for the running state.\n info: '#0e7490',\n warning: '#a16207',\n danger: '#be123c',\n neutral: '#5b6779',\n backdrop: 'rgb(15 23 42 / 0.4)',\n // The three soft colour fields behind the glass: violet above, sky below.\n 'ambient-1': 'rgb(167 139 250 / 0.05)',\n 'ambient-2': 'rgb(56 189 248 / 0.03)',\n },\n dark: {\n brand: '#818cf8',\n 'focus-ring': '#818cf8',\n 'brand-strong': '#a5b4fc',\n 'brand-soft': 'rgb(99 102 241 / 0.2)',\n 'on-brand': '#1e1b4b',\n // Slate 950, the app's night ground.\n bg: '#020617',\n surface: 'rgb(30 41 59 / 0.7)',\n 'surface-raised': 'rgb(30 41 59 / 0.78)',\n 'surface-solid': '#131c2f',\n 'surface-raised-solid': '#1b2539',\n 'surface-sunken': '#0b1222',\n line: 'rgb(148 163 184 / 0.24)',\n 'line-strong': 'rgb(148 163 184 / 0.36)',\n ink: '#ffffff',\n 'ink-2': '#cbd5e1',\n 'ink-3': '#94a3b8',\n success: '#4ade80',\n info: '#22d3ee',\n warning: '#fbbf24',\n danger: '#fb7185',\n neutral: '#94a3b8',\n backdrop: 'rgb(0 0 0 / 0.5)',\n 'ambient-1': 'rgb(124 58 237 / 0.1)',\n 'ambient-2': 'rgb(2 132 199 / 0.08)',\n },\n },\n ctaPins: {\n light: ['#4f46e5', '#7c3aed', '#9333ea'],\n dark: ['#4f46e5', '#7c3aed', '#9333ea'],\n },\n // 12 px controls, 20 px cards and panels, 24 px dialogs and hero sheets.\n radii: { card: 20, sheet: 24 },\n // Glass: a light boost on light grounds (more would amplify the ambient\n // tint into a grey-lavender wash), a strong one on dark grounds.\n glassSaturate: { light: 1.15, dark: 1.5 },\n // The liquid-glass elevation: a soft drop under every sheet, a specular\n // inner highlight on its top edge, and the role-named elevation scale.\n shadowPins: {\n light: {\n sheet: [\n { x: 0, y: 4, blur: 16, spread: -2, color: 'rgb(0 0 0 / 0.1)' },\n { x: 0, y: 12, blur: 40, spread: -8, color: 'rgb(0 0 0 / 0.06)' },\n ],\n 'sheet-inset': [\n { x: 0, y: 1, blur: 2, spread: 0, color: 'rgb(255 255 255 / 0.7)', inset: true },\n { x: 0, y: -1, blur: 2, spread: 0, color: 'rgb(0 0 0 / 0.04)', inset: true },\n ],\n raised: [\n { x: 0, y: 4, blur: 12, spread: -2, color: 'rgb(15 23 42 / 0.08)' },\n { x: 0, y: 2, blur: 4, spread: -2, color: 'rgb(15 23 42 / 0.04)' },\n ],\n floating: [\n { x: 0, y: 12, blur: 24, spread: -8, color: 'rgb(15 23 42 / 0.12)' },\n { x: 0, y: 4, blur: 8, spread: -4, color: 'rgb(15 23 42 / 0.06)' },\n ],\n modal: [\n { x: 0, y: 40, blur: 100, spread: -30, color: 'rgb(0 0 0 / 0.45)' },\n { x: 0, y: 16, blur: 40, spread: -12, color: 'rgb(0 0 0 / 0.18)' },\n ],\n },\n dark: {\n sheet: [{ x: 0, y: 12, blur: 40, spread: -12, color: 'rgb(0 0 0 / 0.5)' }],\n 'sheet-inset': [{ x: 0, y: 1, blur: 1, spread: 0, color: 'rgb(255 255 255 / 0.12)', inset: true }],\n raised: [\n { x: 0, y: 4, blur: 12, spread: -2, color: 'rgb(0 0 0 / 0.5)' },\n { x: 0, y: 2, blur: 4, spread: -2, color: 'rgb(0 0 0 / 0.3)' },\n ],\n floating: [\n { x: 0, y: 12, blur: 24, spread: -8, color: 'rgb(0 0 0 / 0.6)' },\n { x: 0, y: 4, blur: 8, spread: -4, color: 'rgb(0 0 0 / 0.4)' },\n ],\n modal: [\n { x: 0, y: 40, blur: 100, spread: -30, color: 'rgb(0 0 0 / 0.7)' },\n { x: 0, y: 16, blur: 40, spread: -12, color: 'rgb(0 0 0 / 0.5)' },\n ],\n },\n },\n modeStrings: {\n light: {\n // Lit from above: bright top and start edges, grey shaded ones (top end bottom start).\n 'glass-edge': 'rgb(255 255 255 / 0.9) rgb(200 200 210 / 0.3) rgb(200 200 210 / 0.25) rgb(255 255 255 / 0.7)',\n 'glass-edge-width': '1.5px',\n // The inner highlight of raised and floating glass.\n 'glass-highlight': 'inset 0 1px 2px 0 rgb(255 255 255 / 0.8), inset 0 -1px 2px 0 rgb(0 0 0 / 0.05)',\n 'glass-fill': 'linear-gradient(135deg, rgb(255 255 255 / 0.8) 0%, rgb(220 225 240 / 0.62) 40%, rgb(240 245 255 / 0.68) 70%, rgb(255 255 255 / 0.8) 100%)',\n 'glass-fill-raised': 'linear-gradient(135deg, rgb(255 255 255 / 0.86) 0%, rgb(215 220 238 / 0.7) 40%, rgb(235 240 255 / 0.76) 70%, rgb(255 255 255 / 0.86) 100%)',\n 'mark-gradient': 'linear-gradient(135deg, #38bdf8 0%, #6366f1 40%, #a855f7 100%)',\n 'wordmark-gradient': 'linear-gradient(90deg, #0369a1, #4338ca, #7e22ce)',\n },\n dark: {\n 'glass-edge': 'rgb(255 255 255 / 0.2) rgb(255 255 255 / 0.06) rgb(255 255 255 / 0.04) rgb(255 255 255 / 0.12)',\n 'glass-edge-width': '1.5px',\n 'glass-highlight': 'inset 0 1px 1px 0 rgb(255 255 255 / 0.15)',\n 'glass-fill': 'linear-gradient(140deg, rgb(30 41 59 / 0.7) 0%, rgb(15 23 42 / 0.6) 45%, rgb(20 30 50 / 0.55) 100%)',\n 'glass-fill-raised': 'linear-gradient(140deg, rgb(30 41 59 / 0.78) 0%, rgb(15 23 42 / 0.68) 45%, rgb(20 30 50 / 0.62) 100%)',\n 'mark-gradient': 'linear-gradient(135deg, #38bdf8 0%, #6366f1 40%, #a855f7 100%)',\n 'wordmark-gradient': 'linear-gradient(90deg, #38bdf8, #818cf8, #a855f7)',\n },\n },\n // The app's type scale: 30 px display, 24 px page titles, 18 px sections, 16 px\n // sub-sections, 14 px labels, tight tracking on titles.\n strings: {\n // The display step is the 30 px wordmark of the sign-in screens.\n 'font-size-display': '30px',\n 'font-line-height-display': '36px',\n 'font-size-h1': '24px',\n 'font-line-height-h1': '32px',\n 'font-size-h2': '18px',\n 'font-line-height-h2': '28px',\n 'font-size-h3': '16px',\n 'font-line-height-h3': '24px',\n 'font-size-label': '14px',\n 'font-line-height-label': '20px',\n 'font-tracking-h1': '-0.025em',\n },\n // The platform's own UI fonts, headings included (no web font to fetch).\n fonts: {\n display: ['-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'Helvetica Neue', 'Noto Sans', 'Arial', 'sans-serif'],\n body: ['-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'Helvetica Neue', 'Noto Sans', 'Arial', 'sans-serif'],\n mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', 'monospace'],\n },\n}\n\n/**\n * Astrlabe · Sala de Controle (`data-ty-theme=\"astrlabe-controle\"`): the\n * dark-operations variant of the Astrlabe identity for control rooms and\n * monitoring walls. No glass, square corners (2 px controls), deep blue-slate\n * surfaces, and the saturated state colours of operator consoles: ok green,\n * run cyan, wait amber, fail red, now magenta. Everything renders in a\n * monospace stack so columns of numbers line up.\n */\nexport const astrlabeControlePreset: ThemeConfig = {\n name: 'astrlabe-controle',\n label: 'Astrlabe · Sala de Controle',\n seeds: {\n brand: seedFromColor('#6366f1', 0.2),\n neutral: { hue: 257, chroma: 0.02 },\n danger: { hue: 12, chroma: 0.2 },\n warning: { hue: 75, chroma: 0.15 },\n success: { hue: 145, chroma: 0.16 },\n info: { hue: 185, chroma: 0.12 },\n },\n radius: 2,\n contrast: 'default',\n glass: false,\n cta: 'solid',\n pins: {\n light: {\n // The control room is always dark: the light mode carries the same\n // dark grounds and the light-on-dark indigo brand.\n brand: '#818cf8',\n 'focus-ring': '#818cf8',\n 'brand-strong': '#a5b4fc',\n 'brand-soft': 'rgb(99 102 241 / 0.2)',\n 'on-brand': '#1e1b4b',\n bg: '#131a22',\n surface: 'rgb(26 35 46 / 1)',\n 'surface-raised': 'rgb(26 35 46 / 1)',\n 'surface-solid': '#1a232e',\n 'surface-raised-solid': '#1a232e',\n 'surface-sunken': '#0e141b',\n line: '#2e3d4c',\n 'line-strong': '#46586a',\n ink: '#e8eef4',\n 'ink-2': '#bcc9d6',\n 'ink-3': '#93a2b1',\n success: '#3fb950',\n info: '#39c5cf',\n warning: '#d29922',\n danger: '#f85149',\n neutral: '#93a2b1',\n 'cursor-now': '#e34ba9',\n },\n dark: {\n brand: '#818cf8',\n 'focus-ring': '#818cf8',\n 'brand-strong': '#a5b4fc',\n 'brand-soft': 'rgb(99 102 241 / 0.2)',\n 'on-brand': '#1e1b4b',\n bg: '#131a22',\n surface: 'rgb(26 35 46 / 1)',\n 'surface-raised': 'rgb(26 35 46 / 1)',\n 'surface-solid': '#1a232e',\n 'surface-raised-solid': '#1a232e',\n 'surface-sunken': '#0e141b',\n line: '#2e3d4c',\n 'line-strong': '#46586a',\n ink: '#e8eef4',\n 'ink-2': '#bcc9d6',\n 'ink-3': '#93a2b1',\n success: '#3fb950',\n info: '#39c5cf',\n warning: '#d29922',\n danger: '#f85149',\n neutral: '#93a2b1',\n 'cursor-now': '#e34ba9',\n },\n },\n // Mono-friendly: one monospace stack for every role.\n fonts: {\n display: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', 'monospace'],\n body: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', 'monospace'],\n mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', 'monospace'],\n },\n}\n\n/** Default hues with high contrast, opaque surfaces and a thicker focus ring. */\nexport const highContrastPreset: ThemeConfig = {\n name: 'high-contrast',\n label: 'High contrast',\n seeds: baseSeeds,\n radius: 10,\n contrast: 'high',\n glass: false,\n cta: 'solid',\n}\n\nexport const presets: readonly ThemeConfig[] = [tympanPreset, fakhirPreset, astrlabePreset, astrlabeControlePreset, neutralPreset, highContrastPreset]\nexport const DEFAULT_THEME = 'tympan'\n","// Conversion between resolved themes and W3C Design Tokens Community Group\n// (DTCG, 2025.10 format) trees: colour objects with `colorSpace` and\n// `components`, dimension objects with `value` and `unit`.\n// Every generated token carries its CSS custom property name in\n// `$extensions[\"br.com.datatechsolutions.tympan\"].cssName` so any DTCG tool maps it back exactly.\n\nimport { toHex, type Rgba } from './color.ts'\nimport { RAMP_STEPS, type Density, DENSITIES, type ResolvedTheme, type ShadowLayer } from './theme.ts'\n\nexport interface DtcgColor {\n colorSpace: 'srgb'\n components: [number, number, number]\n alpha?: number\n hex: string\n}\n\ntype Tree = { [key: string]: Tree | unknown }\n\nconst r4 = (v: number) => Math.round(v * 10000) / 10000\n\nexport function toDtcgColor(c: Rgba): DtcgColor {\n const out: DtcgColor = { colorSpace: 'srgb', components: [r4(c.r), r4(c.g), r4(c.b)], hex: toHex(c) }\n if (c.a < 1) out.alpha = r4(c.a)\n return out\n}\n\nexport function fromDtcgColor(v: DtcgColor | string): Rgba {\n if (typeof v === 'string') {\n const h = v.replace('#', '')\n return { r: parseInt(h.slice(0, 2), 16) / 255, g: parseInt(h.slice(2, 4), 16) / 255, b: parseInt(h.slice(4, 6), 16) / 255, a: 1 }\n }\n const [r, g, b] = v.components\n return { r, g, b, a: v.alpha ?? 1 }\n}\n\nconst px = (value: number) => ({ value, unit: 'px' as const })\nconst ext = (cssName: string) => ({ 'br.com.datatechsolutions.tympan': { cssName } })\n\nfunction shadowValue(layers: ShadowLayer[]) {\n return layers.map((l) => ({\n color: toDtcgColor(l.color),\n offsetX: px(l.x),\n offsetY: px(l.y),\n blur: px(l.blur),\n spread: px(l.spread),\n ...(l.inset ? { inset: true } : {}),\n }))\n}\n\n/** DTCG tree for one resolved theme and mode. */\nexport function themeToDtcg(t: ResolvedTheme): Tree {\n const color: Tree = { $type: 'color' }\n for (const [name, c] of Object.entries(t.colors)) {\n color[name] = { $value: toDtcgColor(c), $extensions: ext(`--ty-${name}`) }\n }\n const ramp: Tree = { $type: 'color' }\n for (const [seed, steps] of Object.entries(t.ramps)) {\n const group: Tree = {}\n for (const step of RAMP_STEPS) group[String(step)] = { $value: toDtcgColor(steps[step]), $extensions: ext(`--ty-${seed}-${step}`) }\n ramp[seed] = group\n }\n const shadow: Tree = { $type: 'shadow' }\n for (const [name, layers] of Object.entries(t.shadows)) {\n shadow[name] = { $value: shadowValue(layers), $extensions: ext(`--ty-shadow-${name}`) }\n }\n const dimension: Tree = { $type: 'dimension' }\n for (const [name, v] of Object.entries(t.dimensions)) dimension[name] = { $value: px(v), $extensions: ext(`--ty-${name}`) }\n const number: Tree = { $type: 'number' }\n for (const [name, v] of Object.entries(t.numbers)) number[name] = { $value: v, $extensions: ext(`--ty-${name}`) }\n \n \n const fontFamily: Tree = { $type: 'fontFamily' }\n for (const [name, list] of Object.entries(t.fonts)) fontFamily[name] = { $value: [...list], $extensions: ext(`--ty-font-${name}`) }\n return {\n $description: `Theme ${t.name}, ${t.mode} mode, ${t.contrast} contrast. Generated by @datatechsolutions/tympan-tokens.`,\n color,\n ramp,\n gradient: {\n $type: 'gradient',\n cta: {\n $value: t.cta.stops.map((s, i, all) => ({ color: toDtcgColor(s), position: all.length === 1 ? 0 : r4(i / (all.length - 1)) })),\n $extensions: { 'br.com.datatechsolutions.tympan': { cssName: '--ty-cta', angle: t.cta.angle } },\n },\n },\n shadow,\n dimension,\n number,\n ...(Object.keys(t.fonts).length ? { fontFamily } : {})\n }\n}\n\n/** DTCG tree for one density step. */\nexport function densityToDtcg(density: Density): Tree {\n const group: Tree = { $type: 'dimension' }\n for (const [k, v] of Object.entries(DENSITIES[density])) {\n group[k] =\n k === 'density'\n ? { $type: 'number', $value: v, $extensions: ext(`--ty-${k}`) }\n : { $value: px(v), $extensions: ext(`--ty-${k}`) }\n }\n return { $description: `Density ${density}.`, density: group }\n}\n","// Book-style presets for @datatechsolutions/tympan-print: fonts, paper and ink,\n// data and proof-state colours, texture, stroke and the chart renderer of each\n// diagramming style. The first eleven reproduce the author's earlier visual\n// studies (diagramacao/estilos/); the rest are new\n// interpretations of published design traditions. Style ids and labels are\n// neutral, descriptive names; the tradition a style draws on is named only in\n// its `referencia` (\"inspirado em …\"). Renamed ids stay accepted as deprecated\n// aliases (PRINT_STYLE_ALIASES). Fonts are Google Fonts families under the OFL.\n//\n// `printStyleToCss` turns a preset (with optional overrides and a black and\n// white variant) into `--ty-print-*` custom properties on\n// `[data-ty-print-style=\"<name>\"]`.\n\nimport { contrastRatio, luminance, oklchToRgb, parseColor, rgbToOklch, toHex, type Rgba } from './color.ts'\nimport { PRINT_STYLE_ALIASES, warnDeprecatedPrintId, type PrintStyleAlias } from './print-aliases.ts'\n\nexport type RenderizadorGrafico = 'limpo' | 'mao' | 'isotype' | 'gravura' | 'prancheta' | 'aquarela' | 'riso' | 'pontos'\nexport type MarcaProva = 'pilula' | 'carimbo' | 'circulo' | 'sublinhado' | 'barra' | 'etiqueta' | 'formas' | 'ponto'\nexport type EstadoProva = 'sustentada' | 'refutada' | 'nao-da-para-afirmar' | 'pendente' | 'sem-dado' | 'nao-testada'\n\nexport const ESTADOS_PROVA: readonly EstadoProva[] = ['sustentada', 'refutada', 'nao-da-para-afirmar', 'pendente', 'sem-dado', 'nao-testada']\n\n/** The word printed for each proof state in English (tympan-print picks by the book's `lang`). */\nexport const ROTULOS_PROVA_EN: Record<EstadoProva, string> = {\n sustentada: 'Supported',\n refutada: 'Refuted',\n 'nao-da-para-afirmar': 'Cannot claim',\n pendente: 'Pending',\n 'sem-dado': 'No data',\n 'nao-testada': 'Not tested',\n}\n\n/** The word printed for each proof state (always visible, whatever the mark's shape); pt-BR. */\nexport const ROTULOS_PROVA: Record<EstadoProva, string> = {\n sustentada: 'Sustentada',\n refutada: 'Refutada',\n 'nao-da-para-afirmar': 'Não dá para afirmar',\n pendente: 'Pendente',\n 'sem-dado': 'Sem dado',\n 'nao-testada': 'Não testada',\n}\n\nexport interface PrintFontes {\n titulo: string\n corpo: string\n numero: string\n rotulo: string\n anotacao: string\n mono: string\n}\n\nexport interface PrintCores {\n papel: string\n tinta: string\n tinta2: string\n tinta3: string\n linha: string\n destaque: string\n destaque2: string\n marcaTexto: string\n contexto: string\n prova: Record<EstadoProva, string>\n /** Colours of page ornaments only (frames, tiles, waves); never data. Up to four. */\n ornamento?: string[]\n /** Colours by category key (official party colours…): used by categorical maps, parliament and bars. */\n categorias?: Record<string, string>\n /** Colours of data themes (blocks of a panel page: economia, saude…); --ty-print-tema-<id>. */\n temas?: Record<string, string>\n /** The series of interest in maps and charts (default: `destaque`), when the accent of the page differs from the data ink. */\n interesse?: string\n /** Data palette, diverging: the low and the high side (default destaque2 × destaque). */\n divergente?: [string, string]\n /** Data palette, qualitative (party, category: no implied order), up to eight (default: a colour-blind-safe set). */\n categorica?: string[]\n}\n\n/** Partial colours: any role, and any subset of the proof states. */\nexport type PrintCoresParciais = Partial<Omit<PrintCores, 'prova'>> & { prova?: Partial<Record<EstadoProva, string>> }\n\nexport type TexturaPapel = 'nenhuma' | 'grao' | 'pauta' | 'milimetrado' | 'fibra'\nexport type Hachura = 'nenhuma' | 'simples' | 'cruzada' | 'pontilhada' | 'goiva'\n\n/**\n * Page structure of a style (addition to the contract, see CONTRATO.md):\n * how panels are framed, how the panel letter is drawn, where notes go, how a\n * figure is marked and how panel labels are cased.\n */\nexport interface PrintEstrutura {\n /** Panel frame: top rule, heavy top rule, box, heavy box, drafting board, soft card, flat title band or none. */\n painel: 'fio' | 'fio-grosso' | 'caixa' | 'caixa-grossa' | 'prancha' | 'cartao' | 'bloco' | 'nenhum' | 'dossie' | 'placa'\n /** Panel letter: plain, in a filled square, in a circle, in parentheses. */\n rotulo: 'letra' | 'quadrado' | 'circulo' | 'parenteses'\n /** Casing of panel labels and eyebrows. */\n rotuloCaixa: 'alta' | 'versalete' | 'normal'\n /** Annotations inside the flow, or as notes in the outer margin (minimo-de-tinta). */\n notas: 'dentro' | 'margem'\n /** Figure mark: none; a short bar and rule on top (semanario); range frame, no grid (minimo-de-tinta). */\n figura: 'simples' | 'barra-topo' | 'amplitude'\n /** Titles and labels in lower case (diagrama-modernista, concrete design). */\n minusculas: boolean\n /** Bar charts drawn as horizontal bars (default) or vertical columns. Lengths come from the data either way. */\n barras?: 'horizontal' | 'vertical'\n /** Page ornament drawn in the margins, outside the type area (never over data). */\n moldura?: Moldura\n /** Running head: plain text (default), a full-width band (mapa-de-metro, constructivism) or a tag with an arrow (signage). */\n cabeco?: 'texto' | 'faixa' | 'etiqueta'\n /**\n * Title treatment: cut-paper word blocks, a band with a hard shadow, an offset colour shadow, the ornament colours;\n * italic (minimo-de-tinta), centred capitals with wide spacing (graficos-1900), centred italic (fluxo-historico), heavier and larger\n * (constructivism), set from the third column (Swiss grid), or underlined by hand (caderno).\n */\n tituloEstilo?: 'normal' | 'recorte' | 'faixa' | 'sombra' | 'arcoiris' | 'italico' | 'centro' | 'centro-italico' | 'pesado' | 'coluna3' | 'sublinhado'\n /** Fill of the square or round panel letter. */\n corRotulo?: 'destaque' | 'destaque2' | 'tinta' | 'marcaTexto' | 'sustentada' | 'refutada'\n /** Bars get an ink outline (Memphis, pop art). */\n contornoBarra?: boolean\n /**\n * Signature shape of the comparison chart (G1 of the style audit). Default: 'barras' ('colunas' when\n * `barras` is 'vertical'). Every shape keeps position and size from the data; see FormaGrafico.\n */\n forma?: FormaGrafico\n /** A line at the cut between the two columns of each group: dashed (minimo-de-tinta, infografico-ilustrado) or solid (diagrama-modernista). */\n linhaCorte?: 'tracejada' | 'cheia'\n /** A marker on the end of each column (diagrama-modernista: a circle). */\n marcador?: 'circulo'\n /** Thin columns (minimo-de-tinta). */\n colunasFinas?: boolean\n /**\n * Callouts drawn inside the chart (G3): numbered list under the plot (default), handwritten notes with an\n * arrow and the value circled (caderno), speech balloons (divulgação, infografico-ilustrado) or text with a leader line (papel-salmao).\n */\n chamadas?: 'numeradas' | 'manuscritas' | 'baloes' | 'guia'\n /** Two figures of one panel stacked (default) or side by side as small multiples. */\n multiplos?: 'empilhados' | 'lado-a-lado'\n /** A letter (A, B…) on each small multiple (scientific figure). */\n letraMultiplo?: boolean\n // Page composition (G2, G4–G8 of the style audit, drawn by tympan-print's page and panel components).\n /** Emblem beside the spread title: decoration in ornament or ink colours, never data. */\n emblema?: Emblema\n /** Panel fills: a pale tint (pictogramas), alternating tints (diagrama-modernista, proporcao-modular, blocos-coloridos, divulgação) or halftone dots (riso). */\n fundoPainel?: 'claro' | 'alternado' | 'pontilhado'\n /** The verdict panel (e): a dark block (mapa-de-metro, sinalizacao, concretism, blocos-coloridos) or a block in the highlighter tint (riso). */\n veredito?: 'bloco-escuro' | 'bloco-cor'\n /** The linking paragraph under a and b: a highlight band (bauhaus), a dark block (constructivism), a thick bar (concretism, proporcao-modular) or a \"você sabia?\" tag (divulgação). */\n costura?: 'faixa' | 'bloco-escuro' | 'barra' | 'selo'\n /** Headline of the method figures: plain, on a band, on a tilted band (constructivism), with a magnifier (divulgação). */\n manchete?: 'texto' | 'faixa' | 'diagonal' | 'lupa'\n /** The trace of a number (g): a list (default), a metro line with stations (mapa-de-metro) or signage plates (sinalizacao). */\n rastro?: 'lista' | 'metro' | 'placa'\n /** Notes of a figure under it (default) or in a column beside it headed \"Leia assim\" (Dados BR). */\n notasFigura?: 'dentro' | 'coluna'\n /** The key numbers (b) marked with the highlighter (caderno). */\n numerosMarcados?: boolean\n /**\n * How a chart highlights: every row in its series colours (default, most studies) or the highlighted row in\n * the accent against the others in ink (NYT Upshot, Tufte).\n */\n realce?: 'serie' | 'linha'\n /** Head of each small multiple: plain title (default), a band in the highlighter colour with an arrow (Schiphol), a dark band (Vignelli), a band in the ornament colour (Aicher), each multiple on its own tinted card (Le Corbusier, Bayer). */\n /**\n * Long runs (one page per unit, thousands of pages): no page ornaments, no tinted panel fills, the 'bolso'\n * panel as a rule instead of a filled box. The style's type, colours and frames stay.\n */\n economiaTinta?: boolean\n /**\n * Pages without a molde fill the type area: panels widen to close their row of the six columns and rows of\n * panels share the free height (dashboard). A page can turn it on or off with `preencher`.\n */\n preencher?: boolean\n cabecaMultiplo?: 'titulo' | 'faixa' | 'faixa-escura' | 'faixa-cor' | 'caixa-cor'\n}\n\n/**\n * Emblems drawn beside a spread title (tympan-print Emblema). `'modulor'` is\n * the deprecated name of `'figura-modular'`, still drawn the same; it will be\n * removed with the style aliases (see PRINT_STYLE_ALIASES).\n */\nexport type Emblema = 'pictogramas' | 'formas' | 'circulo-bicolor' | 'figura-modular' | 'casa' | 'lupa' | 'predios' | 'modulor'\n\n/**\n * Shapes of the comparison chart. Lengths, heights and thicknesses always come from the data through one\n * linear scale per figure; the shape only decides how the two series are laid out.\n * - 'barras': horizontal bars from zero. 'colunas': vertical columns.\n * - 'eixo-central': the cut is the axis; the series below the cut grows to the left, the one above to the right.\n * - 'ziguezague': a bar longer than one line folds back and forth (graficos-1900); total length = value.\n * - 'fluxo': bands whose thickness is the value, splitting at the cut (fluxo-historico).\n * - 'predios': columns drawn as buildings (height = value; windows are texture only).\n * - 'cartoes': one card per row with the numbers written large and mini columns on a shared scale.\n * - 'halteres': a dumbbell per row, two dots joined on one axis (NYT Upshot; the only shape that keeps a\n * dumbbell spec as drawn). Every other shape redraws a zero-based dumbbell as its own comparison.\n */\nexport type FormaGrafico = 'barras' | 'colunas' | 'eixo-central' | 'ziguezague' | 'fluxo' | 'predios' | 'cartoes' | 'halteres'\n\n/** Page ornaments (optional, CONTRATO §1). */\nexport type Moldura =\n | 'nenhuma'\n | 'dupla' // double rule frame (fluxo-historico)\n | 'regua' // cartographic neatline with alternating segments (atlas)\n | 'azulejo' // column of modernist tiles (azulejo-modernista)\n | 'ondas' // wavy stripes (tropicalia)\n | 'ramos' // vine with leaves and a rounded frame (art nouveau)\n | 'recortes' // torn paper strips (papel-recortado)\n | 'reticula' // halftone dot columns (pop art)\n | 'memphis' // zigzags, triangles, circles and confetti\n | 'diagonais' // header wedges and a diagonal bar (constructivism)\n | 'formas' // triangle, square and circle (Bauhaus)\n | 'quartos' // quarter circles in the page corners (diagrama-modernista)\n\nexport interface PrintStyle extends PrintTemaExtras {\n /** Stable id, e.g. 'jornal'. */\n name: string\n /** Human label, e.g. \"Editorial de jornal\". */\n label: string\n /** What the style reproduces or interprets. */\n referencia: string\n /** CSS font stacks. */\n fontes: PrintFontes\n /** Google Fonts css2 family specs (`Family Name:axes@values`); empty for system fonts only. */\n googleFonts: string[]\n cor: PrintCores\n papel: { textura: TexturaPapel; intensidade: number }\n /** Stroke width in mm, tremor 0..2 (0 = ruled), hatching of the second series. */\n traco: { largura: number; tremor: number; hachura: Hachura }\n grafico: RenderizadorGrafico\n marcaProva: MarcaProva\n /** Corner radius in mm; 0 for square styles. */\n raio: number\n /** Chapter and spread titles in capitals. */\n caixaAlta: boolean\n /** Adjustments for black and white print, applied after the grey conversion. */\n pb: PrintCoresParciais\n estrutura: PrintEstrutura\n /**\n * Brand marks in colour (default) or in their official one-ink version,\n * for styles whose technique is one or two inks (woodcut, risograph,\n * cyanotype). The lakebrasil mark is never recoloured; the Datatech mark\n * has approved variations (ink, duotone, per style), see LogoDatatech.\n */\n logo?: 'cor' | 'mono'\n /** Typesetting options a book may need against the style's idiom (see PrintTexto). */\n texto?: PrintTexto\n}\n\n/**\n * Typesetting switches for books whose content fights the style: a style in lower case (bauhaus,\n * diagrama-modernista) would print \"boa vista\" for a proper name; a style with old-style figures would\n * misalign table columns.\n */\nexport interface PrintTexto {\n /**\n * 'estilo' (default): page titles and eyebrows follow the style's casing. 'preservar': the level-1 title,\n * eyebrows and table cells keep the casing written in the content (proper names, codes), while panel labels\n * and running heads keep the style's.\n */\n nomesProprios?: 'estilo' | 'preservar'\n /** Figures in table cells: 'tabular' (default, lining and equal width, columns align) or 'proporcional'. */\n numerosTabela?: 'tabular' | 'proporcional'\n /** Font weight per role (titles, key numbers, labels, body, notes, mono), e.g. { titulo: 600, numero: 600 }. */\n pesos?: Partial<Record<keyof PrintFontes, number>>\n /** Figures per role: 'tabular' (equal width, lining) or 'proporcional'. Tables follow `numerosTabela`. */\n algarismos?: Partial<Record<'numero' | 'rotulo' | 'corpo', 'tabular' | 'proporcional'>>\n}\n\n// ---------------------------------------------------------------------------\n// Book-theme extras (see print-book-themes.ts)\n// ---------------------------------------------------------------------------\n\n/** A mark the theme prints (publisher logo, collection seal): an image URL (data: URIs work offline) and its text alternative. */\nexport interface PrintMarca {\n src: string\n alt: string\n /** Width in mm where the mark is placed (default 18 for the logo, 12 for the seal). */\n largura?: number\n /** Image used in black and white print (default: the same `src`, greyed by CSS). */\n srcPb?: string\n}\n\n/** Page format and print finishing. */\nexport interface PrintPagina {\n /** Trim width in mm (default 170). */\n largura?: number\n /** Trim height in mm (default 240). */\n altura?: number\n /** Bleed in mm added around every page when the book prints for the press (default 3). */\n sangria?: number\n /** Crop marks in the slug, outside the bleed (default false). */\n marcasCorte?: boolean\n}\n\n/** Running head and folio. */\nexport interface PrintFolio {\n /** Where the folio sits: outer corner (default) or centred. */\n folio?: 'externo' | 'centro'\n /** Where the running head sits: outer corner (default), centred, or not printed. */\n cabeco?: 'externo' | 'centro' | 'nenhum'\n /** Text before the folio number, e.g. \"p. \". */\n prefixoFolio?: string\n}\n\n/** A local font file (offline, deterministic builds and EPUB): one @font-face. */\nexport interface PrintFonteLocal {\n /** Family name as used in the theme's font stacks. */\n familia: string\n /** URL or path of the .woff2 (relative to the HTML, absolute, or a data: URI). */\n src: string\n peso?: number | string\n estilo?: 'normal' | 'italic'\n}\n\n/** What a theme adds to a preset beyond the style tokens. */\nexport interface PrintTemaExtras {\n marcas?: { editora?: PrintMarca; selo?: PrintMarca }\n pagina?: PrintPagina\n folio?: PrintFolio\n /** Local font files; with them PrintBook can run without network (`fontes=\"locais\"`). */\n fontesLocais?: PrintFonteLocal[]\n /**\n * Trace of a number (Rastro): sign it with the theme's seal (`marcas.selo`) or the lakebrasil mark, and add\n * the lake version seal when the version carries a date. Default: neutral (neither).\n */\n rastro?: { assinatura?: 'selo' | 'lakebrasil' | 'nenhuma'; seloLake?: boolean }\n /** Texts the print components write by themselves, by key (see tympan-print i18n: TEXTOS_PT / TEXTOS_EN). */\n textos?: Record<string, string>\n}\n\n/** Any token of a style may be overridden by the editor (partial, nested). */\nexport interface PrintStyleOverrides extends PrintTemaExtras {\n label?: string\n fontes?: Partial<PrintFontes>\n googleFonts?: string[]\n cor?: PrintCoresParciais\n papel?: Partial<PrintStyle['papel']>\n traco?: Partial<PrintStyle['traco']>\n grafico?: RenderizadorGrafico\n marcaProva?: MarcaProva\n raio?: number\n caixaAlta?: boolean\n pb?: PrintCoresParciais\n estrutura?: Partial<PrintEstrutura>\n logo?: 'cor' | 'mono'\n texto?: PrintTexto\n}\n\n// ---------------------------------------------------------------------------\n// Font stacks\n// ---------------------------------------------------------------------------\n\nconst SERIF = 'Georgia, \"Times New Roman\", serif'\nconst SANS = 'system-ui, \"Helvetica Neue\", Arial, sans-serif'\nconst MONO = 'ui-monospace, \"SFMono-Regular\", Menlo, monospace'\nconst HAND = '\"Comic Neue\", \"Segoe Print\", cursive'\nconst f = (family: string, fallback: string) => `\"${family}\", ${fallback}`\n\nconst PLEX_MONO = 'IBM Plex Mono:wght@400;500'\n\n// ---------------------------------------------------------------------------\n// The presets\n// ---------------------------------------------------------------------------\n\nconst dashboard: PrintStyle = {\n name: 'dashboard',\n label: 'Dashboard editorial',\n referencia: 'Painéis de pesquisa: cartões, estado de prova em pílula, gráfico sóbrio; inspirado em painéis da plataforma Fakhir',\n fontes: {\n titulo: f('Source Serif 4', SERIF),\n corpo: f('IBM Plex Sans', SANS),\n numero: f('IBM Plex Sans', SANS),\n rotulo: f('IBM Plex Sans', SANS),\n anotacao: f('Source Serif 4', SERIF),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: [\n 'Source Serif 4:ital,opsz,wght@0,8..60,400;0,8..60,600;1,8..60,400',\n 'IBM Plex Sans:ital,wght@0,400;0,500;0,600;0,700;1,400',\n PLEX_MONO,\n ],\n cor: {\n papel: '#f7f4ee',\n tinta: '#1c1a17',\n tinta2: '#3d3933',\n tinta3: '#5f594f',\n linha: '#d6cfc2',\n // The highlight is not the ink (a highlighted bar must stand out): rust, AA on the paper, not a party colour.\n destaque: '#9a4f2a',\n destaque2: '#c4b8a8',\n marcaTexto: '#f3e6cf',\n contexto: '#8f877a',\n prova: {\n sustentada: '#3d6b1f',\n refutada: '#a3302a',\n 'nao-da-para-afirmar': '#8a5a0f',\n pendente: '#8a5a0f',\n 'sem-dado': '#5f594f',\n 'nao-testada': '#5f594f',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.25, tremor: 0, hachura: 'simples' },\n grafico: 'limpo',\n marcaProva: 'pilula',\n raio: 1.6,\n caixaAlta: false,\n pb: {},\n estrutura: { painel: 'nenhum', rotulo: 'letra', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, preencher: true },\n}\n\nconst graficos1900: PrintStyle = {\n name: 'graficos-1900',\n label: 'Gráficos de exposição (1900)',\n referencia: 'Pranchas estatísticas de exposição universal: letreiro à mão, cores chapadas, papel pardo; inspirado em W. E. B. Du Bois (pranchas para a Exposição de Paris de 1900)',\n fontes: {\n titulo: f('Rubik Mono One', SANS),\n corpo: f('Literata', SERIF),\n numero: f('Rubik Mono One', SANS),\n rotulo: f('Patrick Hand SC', HAND),\n anotacao: f('Patrick Hand SC', HAND),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: ['Rubik Mono One', 'Literata:ital,opsz,wght@0,7..72,400;0,7..72,600;1,7..72,400', 'Patrick Hand SC', PLEX_MONO],\n cor: {\n papel: '#eadfc8',\n tinta: '#1d1a16',\n tinta2: '#342e27',\n tinta3: '#564a3d',\n linha: '#1d1a16',\n destaque: '#c23b2e',\n destaque2: '#c98a2b',\n marcaTexto: '#dcc690',\n contexto: '#7a5a3e',\n prova: {\n sustentada: '#3e6a48',\n refutada: '#a8342a',\n 'nao-da-para-afirmar': '#6f4a2e',\n pendente: '#6f4a2e',\n 'sem-dado': '#1d1a16',\n 'nao-testada': '#1d1a16',\n },\n },\n papel: { textura: 'fibra', intensidade: 0.55 },\n traco: { largura: 0.45, tremor: 0.7, hachura: 'nenhuma' },\n grafico: 'mao',\n marcaProva: 'carimbo',\n raio: 0,\n caixaAlta: true,\n pb: { destaque: '#3a3a3a', destaque2: '#9a9a9a' },\n estrutura: { painel: 'caixa-grossa', rotulo: 'letra', rotuloCaixa: 'versalete', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'ziguezague', tituloEstilo: 'centro' },\n}\n\nconst cartaoPostal: PrintStyle = {\n name: 'cartao-postal',\n label: 'Cartão-postal desenhado à mão',\n referencia: 'Cartões-postais de dados desenhados à mão: um ponto por registro, legenda à mão; inspirado em Dear Data (Giorgia Lupi e Stefanie Posavec, 2016)',\n fontes: {\n titulo: f('Newsreader', SERIF),\n corpo: f('Newsreader', SERIF),\n numero: f('Caveat', HAND),\n rotulo: f('Caveat', HAND),\n anotacao: f('Caveat', HAND),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: [\n 'Newsreader:ital,opsz,wght@0,6..72,300;0,6..72,400;0,6..72,600;1,6..72,300;1,6..72,400',\n 'Caveat:wght@400;600',\n PLEX_MONO,\n ],\n cor: {\n papel: '#fbf9f3',\n tinta: '#24211e',\n tinta2: '#45413c',\n tinta3: '#625e58',\n linha: '#3a3632',\n destaque: '#3d3fa0',\n destaque2: '#c9462b',\n marcaTexto: '#f1e7c4',\n contexto: '#9a958c',\n prova: {\n sustentada: '#3d3fa0',\n refutada: '#b53d25',\n 'nao-da-para-afirmar': '#24211e',\n pendente: '#45413c',\n 'sem-dado': '#24211e',\n 'nao-testada': '#24211e',\n },\n },\n papel: { textura: 'grao', intensidade: 0.35 },\n traco: { largura: 0.3, tremor: 1, hachura: 'nenhuma' },\n grafico: 'pontos',\n marcaProva: 'circulo',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#1a1a1a', destaque2: '#8a8a8a' },\n estrutura: { painel: 'caixa', rotulo: 'parenteses', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'eixo-central' },\n}\n\nconst caderno: PrintStyle = {\n name: 'caderno',\n label: 'Caderno de campo',\n referencia: 'Caderno pautado de pesquisa: lápis, hachura cruzada, caneta vermelha e marca-texto',\n fontes: {\n titulo: f('Source Serif 4', SERIF),\n corpo: f('Source Serif 4', SERIF),\n numero: f('Kalam', HAND),\n rotulo: f('Kalam', HAND),\n anotacao: f('Gochi Hand', HAND),\n mono: f('Courier Prime', MONO),\n },\n googleFonts: [\n 'Source Serif 4:ital,opsz,wght@0,8..60,400;0,8..60,600;0,8..60,700;1,8..60,400',\n 'Kalam:wght@400;700',\n 'Gochi Hand',\n 'Courier Prime:wght@400;700',\n ],\n cor: {\n papel: '#f7f2e4',\n tinta: '#2b2b2b',\n tinta2: '#454545',\n tinta3: '#625d54',\n linha: '#474747',\n destaque: '#2b2b2b',\n destaque2: '#b8322a',\n marcaTexto: '#fff45c',\n contexto: '#6b665c',\n prova: {\n sustentada: '#2b2b2b',\n refutada: '#b0302a',\n 'nao-da-para-afirmar': '#2b2b2b',\n pendente: '#625d54',\n 'sem-dado': '#454545',\n 'nao-testada': '#454545',\n },\n },\n papel: { textura: 'pauta', intensidade: 0.6 },\n traco: { largura: 0.3, tremor: 1.2, hachura: 'cruzada' },\n grafico: 'mao',\n marcaProva: 'circulo',\n raio: 0,\n caixaAlta: false,\n pb: { destaque2: '#3a3a3a', marcaTexto: '#dddddd' },\n estrutura: { painel: 'caixa', rotulo: 'parenteses', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'colunas', chamadas: 'manuscritas', multiplos: 'lado-a-lado', tituloEstilo: 'sublinhado', numerosMarcados: true },\n}\n\nconst isotype: PrintStyle = {\n name: 'isotype',\n label: 'Isotype',\n referencia: 'Estatística em pictogramas (Viena, 1925-1934): um ícone = uma quantidade fixa; inspirado em Otto e Marie Neurath e Gerd Arntz',\n fontes: {\n titulo: f('Jost', SANS),\n corpo: f('Jost', SANS),\n numero: f('Jost', SANS),\n rotulo: f('Jost', SANS),\n anotacao: f('Jost', SANS),\n mono: f('Jost', SANS),\n },\n googleFonts: ['Jost:ital,wght@0,400;0,500;0,600;0,700;1,400'],\n cor: {\n papel: '#f3eee2',\n tinta: '#1c1b19',\n tinta2: '#383632',\n tinta3: '#5f5a50',\n linha: '#1c1b19',\n destaque: '#1c1b19',\n destaque2: '#c73a2c',\n marcaTexto: '#e4dcc8',\n contexto: '#8a8577',\n prova: {\n sustentada: '#1c1b19',\n refutada: '#b3342a',\n 'nao-da-para-afirmar': '#1c1b19',\n pendente: '#383632',\n 'sem-dado': '#5f5a50',\n 'nao-testada': '#1c1b19',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.5, tremor: 0, hachura: 'simples' },\n grafico: 'isotype',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque2: '#8c8c8c' },\n estrutura: { painel: 'fio-grosso', rotulo: 'quadrado', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false },\n}\n\nconst cordel: PrintStyle = {\n name: 'cordel',\n label: 'Cordel',\n referencia: 'Xilogravura de cordel: papel pardo, goiva, letreiro em laje; inspirado em J. Borges e Gilvan Samico',\n fontes: {\n titulo: f('Alfa Slab One', SERIF),\n corpo: f('Alegreya', SERIF),\n numero: f('Alfa Slab One', SERIF),\n rotulo: f('Alegreya SC', SERIF),\n anotacao: f('Alegreya', SERIF),\n mono: f('Courier Prime', MONO),\n },\n googleFonts: ['Alfa Slab One', 'Alegreya:ital,wght@0,400;0,500;0,700;1,400', 'Alegreya SC:wght@500;700', 'Courier Prime'],\n cor: {\n papel: '#dcc79c',\n tinta: '#15110d',\n tinta2: '#2c2219',\n tinta3: '#4a3a29',\n linha: '#15110d',\n destaque: '#15110d',\n destaque2: '#15110d',\n marcaTexto: '#c9ae78',\n contexto: '#5a4632',\n prova: {\n sustentada: '#15110d',\n refutada: '#15110d',\n 'nao-da-para-afirmar': '#15110d',\n pendente: '#2c2219',\n 'sem-dado': '#15110d',\n 'nao-testada': '#15110d',\n },\n },\n papel: { textura: 'fibra', intensidade: 0.8 },\n traco: { largura: 0.6, tremor: 0.9, hachura: 'goiva' },\n grafico: 'gravura',\n marcaProva: 'carimbo',\n raio: 0,\n caixaAlta: false,\n pb: {},\n estrutura: { painel: 'caixa-grossa', rotulo: 'quadrado', rotuloCaixa: 'versalete', notas: 'dentro', figura: 'simples', minusculas: false, emblema: 'casa' },\n logo: 'mono',\n}\n\nconst riso: PrintStyle = {\n name: 'riso',\n label: 'Risografia',\n referencia: 'Impressão em risógrafo a duas tintas (azul e rosa fluorescente): grão, meio-tom e registro solto',\n fontes: {\n titulo: f('Bricolage Grotesque', SANS),\n corpo: f('Archivo', SANS),\n numero: f('Bricolage Grotesque', SANS),\n rotulo: f('Archivo', SANS),\n anotacao: f('Space Mono', MONO),\n mono: f('Space Mono', MONO),\n },\n googleFonts: [\n 'Bricolage Grotesque:opsz,wdth,wght@12..96,75..100,400..800',\n 'Archivo:ital,wdth,wght@0,62..125,400;0,62..125,600;1,62..125,400',\n 'Space Mono',\n ],\n cor: {\n papel: '#f5f1e8',\n tinta: '#3d3fa0',\n tinta2: '#3d3fa0',\n tinta3: '#4f51a3',\n linha: '#3d3fa0',\n destaque: '#3d3fa0',\n destaque2: '#ff48b0',\n marcaTexto: '#ffd3ea',\n contexto: '#9a8fc4',\n prova: {\n sustentada: '#3d3fa0',\n refutada: '#c8187a',\n 'nao-da-para-afirmar': '#3d3fa0',\n pendente: '#3d3fa0',\n 'sem-dado': '#3d3fa0',\n 'nao-testada': '#3d3fa0',\n },\n },\n papel: { textura: 'grao', intensidade: 0.6 },\n traco: { largura: 0.5, tremor: 0, hachura: 'pontilhada' },\n grafico: 'riso',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { tinta: '#1a1a1a', tinta2: '#1a1a1a', tinta3: '#3a3a3a', linha: '#1a1a1a', destaque: '#1a1a1a', destaque2: '#8a8a8a' },\n estrutura: { painel: 'caixa', rotulo: 'circulo', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, fundoPainel: 'pontilhado', veredito: 'bloco-cor' },\n logo: 'mono',\n}\n\nconst jornal: PrintStyle = {\n name: 'jornal',\n label: 'Editorial de jornal',\n referencia: 'Gráficos editoriais de jornal: serifa no texto, grotesca nos números, um acento; inspirado em gráficos do NYT The Upshot (Amanda Cox, Kevin Quealy), do The Pudding e da Folha de S.Paulo',\n fontes: {\n titulo: f('Newsreader', SERIF),\n corpo: f('Newsreader', SERIF),\n numero: f('Libre Franklin', SANS),\n rotulo: f('Libre Franklin', SANS),\n anotacao: f('Newsreader', SERIF),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: [\n 'Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,500;0,6..72,600;0,6..72,700;1,6..72,400;1,6..72,500',\n 'Libre Franklin:ital,wght@0,400;0,500;0,600;0,700;1,400',\n PLEX_MONO,\n ],\n cor: {\n papel: '#fdfcfa',\n tinta: '#121212',\n tinta2: '#3d3d3d',\n tinta3: '#636363',\n linha: '#cfcfcf',\n destaque: '#c8431f',\n destaque2: '#121212',\n marcaTexto: '#f7e4db',\n contexto: '#b0b0b0',\n prova: {\n sustentada: '#121212',\n refutada: '#b83c1b',\n 'nao-da-para-afirmar': '#121212',\n pendente: '#636363',\n 'sem-dado': '#636363',\n 'nao-testada': '#636363',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.25, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'pilula',\n raio: 3,\n caixaAlta: false,\n pb: { destaque: '#121212' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'halteres', realce: 'linha' },\n}\n\nconst prancheta: PrintStyle = {\n name: 'prancheta',\n label: 'Prancheta (cianotipia)',\n referencia: 'Desenho técnico em cópia heliográfica: papel azul, milimetrado, cotas e letreiro normógrafo',\n fontes: {\n titulo: f('Share Tech Mono', MONO),\n corpo: f('IBM Plex Sans Condensed', SANS),\n numero: f('Share Tech Mono', MONO),\n rotulo: f('Share Tech Mono', MONO),\n anotacao: f('IBM Plex Sans Condensed', SANS),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: ['Share Tech Mono', 'IBM Plex Sans Condensed:ital,wght@0,400;0,500;1,400', PLEX_MONO],\n cor: {\n papel: '#1d4b8f',\n tinta: '#f6f4ea',\n tinta2: '#e2dfd3',\n tinta3: '#d9d6c8',\n linha: '#f6f4ea',\n destaque: '#f6f4ea',\n destaque2: '#ece9dc',\n marcaTexto: '#4d5d78',\n contexto: '#c9c5b5',\n prova: {\n sustentada: '#f6f4ea',\n refutada: '#f6f4ea',\n 'nao-da-para-afirmar': '#f6f4ea',\n pendente: '#e2dfd3',\n 'sem-dado': '#e2dfd3',\n 'nao-testada': '#e2dfd3',\n },\n },\n papel: { textura: 'milimetrado', intensidade: 0.7 },\n traco: { largura: 0.25, tremor: 0, hachura: 'simples' },\n grafico: 'prancheta',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: true,\n // In black and white the blueprint becomes a white sheet with black ink.\n pb: {\n papel: '#ffffff',\n tinta: '#111111',\n tinta2: '#333333',\n tinta3: '#555555',\n linha: '#111111',\n destaque: '#111111',\n destaque2: '#444444',\n marcaTexto: '#eeeeee',\n contexto: '#9a9a9a',\n prova: { sustentada: '#111111', refutada: '#111111', 'nao-da-para-afirmar': '#111111', pendente: '#333333', 'sem-dado': '#333333', 'nao-testada': '#333333' },\n },\n estrutura: { painel: 'prancha', rotulo: 'circulo', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false },\n logo: 'mono',\n}\n\nconst pranchetaClara: PrintStyle = {\n ...prancheta,\n name: 'prancheta-clara',\n label: 'Prancheta clara',\n referencia: 'Desenho técnico em papel vegetal claro: tinta azul, milimetrado, cotas e letreiro normógrafo',\n cor: {\n papel: '#f6f7f4',\n tinta: '#1f4787',\n tinta2: '#2f5390',\n tinta3: '#4a669a',\n linha: '#1f4787',\n destaque: '#2e3192',\n destaque2: '#2e3192',\n marcaTexto: '#e2dfd3',\n contexto: '#9aa3c4',\n prova: {\n sustentada: '#2e3192',\n refutada: '#2e3192',\n 'nao-da-para-afirmar': '#2e3192',\n pendente: '#2e3192',\n 'sem-dado': '#2e3192',\n 'nao-testada': '#2e3192',\n },\n },\n papel: { textura: 'milimetrado', intensidade: 0.6 },\n pb: { destaque: '#1a1a1a', destaque2: '#1a1a1a' },\n}\n\nconst aquarela: PrintStyle = {\n name: 'aquarela',\n label: 'Aquarela',\n referencia: 'Caderno de aquarela: papel de algodão, lavagens de índigo e siena com borda de pigmento, legenda à mão',\n fontes: {\n titulo: f('Cormorant Garamond', SERIF),\n corpo: f('Crimson Pro', SERIF),\n numero: f('Caveat', HAND),\n rotulo: f('Caveat', HAND),\n anotacao: f('Caveat', HAND),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: [\n 'Cormorant Garamond:ital,wght@0,500;0,600;1,500;1,600',\n 'Crimson Pro:ital,wght@0,400;0,500;0,600;1,400',\n 'Caveat:wght@500;700',\n PLEX_MONO,\n ],\n cor: {\n papel: '#fbf7ee',\n tinta: '#2e2520',\n tinta2: '#4a3d33',\n tinta3: '#635446',\n linha: '#2e2520',\n destaque: '#5b5fa8',\n destaque2: '#cf8448',\n marcaTexto: '#efe0b0',\n contexto: '#b8ab98',\n prova: {\n sustentada: '#3e6a48',\n refutada: '#a4442a',\n 'nao-da-para-afirmar': '#7a5a1c',\n pendente: '#7a5a1c',\n 'sem-dado': '#635446',\n 'nao-testada': '#635446',\n },\n },\n papel: { textura: 'fibra', intensidade: 0.6 },\n traco: { largura: 0.35, tremor: 0.8, hachura: 'nenhuma' },\n grafico: 'aquarela',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#5a5a5a', destaque2: '#b0b0b0' },\n estrutura: { painel: 'caixa', rotulo: 'parenteses', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'colunas', multiplos: 'lado-a-lado', tituloEstilo: 'italico' },\n}\n\nconst minimoDeTinta: PrintStyle = {\n name: 'minimo-de-tinta',\n label: 'Mínimo de tinta',\n referencia: 'Pouca tinta, notas na margem, pequenos múltiplos, moldura de amplitude; inspirado em Edward Tufte (The Visual Display of Quantitative Information, Beautiful Evidence)',\n fontes: {\n titulo: f('EB Garamond', SERIF),\n corpo: f('EB Garamond', SERIF),\n numero: f('EB Garamond', SERIF),\n rotulo: f('EB Garamond', SERIF),\n anotacao: f('EB Garamond', SERIF),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: ['EB Garamond:ital,wght@0,400;0,500;0,600;1,400;1,500', PLEX_MONO],\n cor: {\n papel: '#fffff8',\n tinta: '#111111',\n tinta2: '#333333',\n tinta3: '#575757',\n linha: '#bdbdb5',\n destaque: '#a3261c',\n destaque2: '#111111',\n marcaTexto: '#f3efd6',\n contexto: '#a6a6a0',\n prova: {\n sustentada: '#111111',\n refutada: '#a3261c',\n 'nao-da-para-afirmar': '#333333',\n pendente: '#575757',\n 'sem-dado': '#575757',\n 'nao-testada': '#575757',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.15, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'etiqueta',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#111111' },\n estrutura: { painel: 'nenhum', rotulo: 'letra', rotuloCaixa: 'versalete', notas: 'margem', figura: 'amplitude', minusculas: false, forma: 'colunas', colunasFinas: true, linhaCorte: 'tracejada', tituloEstilo: 'italico', realce: 'linha' },\n}\n\nconst suico: PrintStyle = {\n name: 'suico',\n label: 'Estilo Suíço',\n referencia: 'Estilo tipográfico internacional: grade rígida, grotesca, assimetria, um vermelho; inspirado em Josef Müller-Brockmann (Grid Systems, 1981)',\n fontes: {\n titulo: f('Archivo', SANS),\n corpo: f('Archivo', SANS),\n numero: f('Archivo', SANS),\n rotulo: f('Archivo', SANS),\n anotacao: f('Archivo', SANS),\n mono: f('IBM Plex Mono', MONO),\n },\n googleFonts: ['Archivo:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400', PLEX_MONO],\n cor: {\n papel: '#fbfbf9',\n tinta: '#0d0d0d',\n tinta2: '#2e2e2e',\n tinta3: '#595959',\n linha: '#0d0d0d',\n destaque: '#0d0d0d',\n destaque2: '#e0261b',\n marcaTexto: '#f9d7d2',\n contexto: '#b5b5b0',\n prova: {\n sustentada: '#0d0d0d',\n refutada: '#c8150b',\n 'nao-da-para-afirmar': '#0d0d0d',\n pendente: '#595959',\n 'sem-dado': '#595959',\n 'nao-testada': '#595959',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.35, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque2: '#8a8a8a' },\n estrutura: { painel: 'fio-grosso', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, tituloEstilo: 'coluna3' },\n}\n\nconst concretismo: PrintStyle = {\n name: 'concretismo',\n label: 'Concretismo',\n referencia: 'Design concreto brasileiro (anos 1950-60): geometria, grotesca em caixa-baixa, preto, vermelho e ultramar; inspirado em Alexandre Wollner, Aloísio Magalhães e na ESDI',\n fontes: {\n titulo: f('Barlow', SANS),\n corpo: f('Barlow', SANS),\n numero: f('Barlow', SANS),\n rotulo: f('Barlow Condensed', SANS),\n anotacao: f('Barlow', SANS),\n mono: f('Barlow Condensed', SANS),\n },\n googleFonts: ['Barlow:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400', 'Barlow Condensed:wght@500;600'],\n cor: {\n papel: '#f3efe6',\n tinta: '#141414',\n tinta2: '#2b2b2b',\n tinta3: '#57534c',\n linha: '#141414',\n destaque: '#d7372a',\n destaque2: '#3d3fa0',\n marcaTexto: '#f3d3cc',\n contexto: '#c9c3b6',\n prova: {\n sustentada: '#141414',\n refutada: '#b82e22',\n 'nao-da-para-afirmar': '#3d3fa0',\n pendente: '#57534c',\n 'sem-dado': '#57534c',\n 'nao-testada': '#57534c',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.7, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'etiqueta',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#141414', destaque2: '#8a8a8a' },\n estrutura: { painel: 'fio-grosso', rotulo: 'quadrado', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: true, forma: 'eixo-central', emblema: 'circulo-bicolor', veredito: 'bloco-escuro', costura: 'barra' },\n}\n\nconst semanario: PrintStyle = {\n name: 'semanario',\n label: 'Semanário de economia',\n referencia: 'Gráficos de revista semanal de economia: barra vermelha no topo, título curto, grotesca condensada, grade só horizontal; inspirado em gráficos da revista The Economist',\n fontes: {\n titulo: f('Source Serif 4', SERIF),\n corpo: f('Source Serif 4', SERIF),\n numero: f('Fira Sans Condensed', SANS),\n rotulo: f('Fira Sans Condensed', SANS),\n anotacao: f('Fira Sans Condensed', SANS),\n mono: f('Fira Sans Condensed', SANS),\n },\n googleFonts: [\n 'Fira Sans Condensed:ital,wght@0,400;0,500;0,600;0,700;1,400',\n 'Source Serif 4:ital,opsz,wght@0,8..60,400;0,8..60,600;0,8..60,700;1,8..60,400',\n ],\n cor: {\n papel: '#ffffff',\n tinta: '#121212',\n tinta2: '#333333',\n tinta3: '#595959',\n linha: '#b7c6cf',\n destaque: '#3a4aa0',\n destaque2: '#b0bee0',\n marcaTexto: '#fbdcd8',\n contexto: '#b7c6cf',\n prova: {\n sustentada: '#3a4aa0',\n refutada: '#d7110a',\n 'nao-da-para-afirmar': '#3a4aa0',\n pendente: '#595959',\n 'sem-dado': '#595959',\n 'nao-testada': '#595959',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#121212', destaque2: '#9a9a9a' },\n estrutura: { painel: 'fio', rotulo: 'quadrado', rotuloCaixa: 'normal', notas: 'dentro', figura: 'barra-topo', minusculas: false, multiplos: 'lado-a-lado' },\n}\n\nconst infograficoIlustrado: PrintStyle = {\n name: 'infografico-ilustrado',\n label: 'Infográfico ilustrado',\n referencia: 'Infografia explicativa: pictogramas, cantos redondos, balão de fala, cores amigáveis; inspirado em Nigel Holmes (Time, Wordless Diagrams)',\n fontes: {\n titulo: f('Rubik', SANS),\n corpo: f('Nunito Sans', SANS),\n numero: f('Rubik', SANS),\n rotulo: f('Rubik', SANS),\n anotacao: f('Nunito Sans', SANS),\n mono: f('Nunito Sans', SANS),\n },\n googleFonts: ['Rubik:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400', 'Nunito Sans:ital,opsz,wght@0,6..12,400;0,6..12,600;0,6..12,700;1,6..12,400'],\n cor: {\n papel: '#fbf6ea',\n tinta: '#22303c',\n tinta2: '#34424e',\n tinta3: '#56606a',\n linha: '#22303c',\n destaque: '#e0603f',\n destaque2: '#2b8a86',\n marcaTexto: '#f6e1ad',\n contexto: '#d9cfbb',\n prova: {\n sustentada: '#1f6f6b',\n refutada: '#b8401f',\n 'nao-da-para-afirmar': '#22303c',\n pendente: '#56606a',\n 'sem-dado': '#56606a',\n 'nao-testada': '#56606a',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.5, tremor: 0, hachura: 'nenhuma' },\n grafico: 'isotype',\n marcaProva: 'pilula',\n raio: 2.4,\n caixaAlta: false,\n pb: { destaque: '#2a2a2a', destaque2: '#8a8a8a' },\n estrutura: { painel: 'cartao', rotulo: 'circulo', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'predios', linhaCorte: 'tracejada', chamadas: 'baloes', multiplos: 'lado-a-lado', emblema: 'predios' },\n}\n\nconst diagramaModernista: PrintStyle = {\n name: 'diagrama-modernista',\n label: 'Diagrama modernista',\n referencia: 'Atlas modernista: blocos de cor chapada, sans geométrica em caixa-baixa; inspirado em Herbert Bayer (World Geo-Graphic Atlas, 1953)',\n fontes: {\n titulo: f('League Spartan', SANS),\n corpo: f('Jost', SANS),\n numero: f('League Spartan', SANS),\n rotulo: f('League Spartan', SANS),\n anotacao: f('Jost', SANS),\n mono: f('Jost', SANS),\n },\n googleFonts: ['League Spartan:wght@400;500;600;700', 'Jost:ital,wght@0,400;0,500;0,600;1,400'],\n cor: {\n papel: '#f1ece0',\n tinta: '#1b1a17',\n tinta2: '#36342f',\n tinta3: '#5c574d',\n linha: '#1b1a17',\n destaque: '#c0512d',\n destaque2: '#5a5f93',\n marcaTexto: '#ecd8a8',\n contexto: '#cbc2ae',\n prova: {\n sustentada: '#56602a',\n refutada: '#a8401f',\n 'nao-da-para-afirmar': '#1b1a17',\n pendente: '#5c574d',\n 'sem-dado': '#5c574d',\n 'nao-testada': '#5c574d',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.4, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'ponto',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#2a2a2a', destaque2: '#8a8a8a' },\n estrutura: { painel: 'bloco', rotulo: 'circulo', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: true, forma: 'colunas', linhaCorte: 'cheia', marcador: 'circulo', multiplos: 'lado-a-lado', fundoPainel: 'alternado', moldura: 'quartos', manchete: 'texto', cabecaMultiplo: 'caixa-cor' },\n}\n\nconst papelSalmao: PrintStyle = {\n name: 'papel-salmao',\n label: 'Papel salmão',\n referencia: 'Gráficos de jornal financeiro em papel salmão: serifa editorial no título, grotesca nos rótulos, clarete e azul; inspirado em gráficos do Financial Times',\n fontes: {\n titulo: f('DM Serif Display', SERIF),\n corpo: f('Gelasio', SERIF),\n numero: f('Hanken Grotesk', SANS),\n rotulo: f('Hanken Grotesk', SANS),\n anotacao: f('Hanken Grotesk', SANS),\n mono: f('Hanken Grotesk', SANS),\n },\n googleFonts: ['DM Serif Display:ital@0;1', 'Gelasio:ital,wght@0,400;0,500;0,600;1,400', 'Hanken Grotesk:ital,wght@0,400;0,500;0,600;0,700;1,400'],\n cor: {\n papel: '#fff1e5',\n tinta: '#33302e',\n tinta2: '#4a4543',\n tinta3: '#625c58',\n linha: '#e3d2c3',\n destaque: '#3a4aa0',\n destaque2: '#b0bee0',\n marcaTexto: '#f2dfce',\n contexto: '#c9bcb0',\n prova: {\n sustentada: '#3a4aa0',\n refutada: '#990f3d',\n 'nao-da-para-afirmar': '#33302e',\n pendente: '#625c58',\n 'sem-dado': '#625c58',\n 'nao-testada': '#625c58',\n },\n },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'etiqueta',\n raio: 0,\n caixaAlta: false,\n pb: { papel: '#ffffff', destaque: '#1a1a1a', destaque2: '#a0a0a0' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, forma: 'colunas', chamadas: 'guia', multiplos: 'lado-a-lado' },\n}\n\n\n// ---------------------------------------------------------------------------\n// Studies 17–41 (diagramacao/estilos/estilo-17 … estilo-41; the archived ones excluded)\n// ---------------------------------------------------------------------------\n\nconst cinzas = (a: string, b = a) => ({ pendente: a, 'sem-dado': b, 'nao-testada': b })\n\nconst dadosBr: PrintStyle = {\n name: 'dados-br',\n label: 'Dados à brasileira',\n referencia: 'Jornalismo de dados brasileiro: grotesca pesada, serifa no texto, vermelho só no lado que importa; inspirado em Núcleo, Folha, Estadão e Agência Pública',\n fontes: { titulo: f('Libre Franklin', SANS), corpo: f('Source Serif 4', SERIF), numero: f('Libre Franklin', SANS), rotulo: f('Libre Franklin', SANS), anotacao: f('Source Serif 4', SERIF), mono: f('IBM Plex Mono', MONO) },\n googleFonts: ['Libre Franklin:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400', 'Source Serif 4:ital,opsz,wght@0,8..60,400;0,8..60,600;1,8..60,400', PLEX_MONO],\n cor: { papel: '#fbfaf6', tinta: '#1f1e1c', tinta2: '#3d3a36', tinta3: '#625d56', linha: '#dcd8cf', destaque: '#c4553a', destaque2: '#b5afa4', marcaTexto: '#f3efe6', contexto: '#b5afa4', prova: { sustentada: '#1f1e1c', refutada: '#b24a31', 'nao-da-para-afirmar': '#1f1e1c', ...cinzas('#625d56') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0.8,\n caixaAlta: false,\n pb: { destaque: '#1f1e1c' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, notasFigura: 'coluna', manchete: 'texto' },\n}\n\nconst fluxoHistorico: PrintStyle = {\n name: 'fluxo-historico',\n label: 'Fluxo histórico (séc. XIX)',\n referencia: 'Cartas figurativas do século XIX: papel envelhecido, tinta sépia, filete duplo, versaletes; inspirado em Charles Joseph Minard e Florence Nightingale',\n fontes: { titulo: f('IM Fell English', SERIF), corpo: f('Old Standard TT', SERIF), numero: f('Old Standard TT', SERIF), rotulo: f('IM Fell English SC', SERIF), anotacao: f('IM Fell English', SERIF), mono: f('Old Standard TT', SERIF) },\n googleFonts: ['IM Fell English:ital@0;1', 'IM Fell English SC', 'Old Standard TT:ital,wght@0,400;0,700;1,400'],\n cor: { papel: '#efe3c6', tinta: '#3b2a1a', tinta2: '#4f3d2a', tinta3: '#5e4a36', linha: '#b89d78', destaque: '#caa472', destaque2: '#3b2a1a', marcaTexto: '#e6d5ae', contexto: '#b89d78', prova: { sustentada: '#3b2a1a', refutada: '#8f4431', 'nao-da-para-afirmar': '#3b2a1a', ...cinzas('#5e4a36') } },\n papel: { textura: 'fibra', intensidade: 0.35 },\n traco: { largura: 0.25, tremor: 0, hachura: 'pontilhada' },\n grafico: 'limpo',\n marcaProva: 'etiqueta',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#8a8a8a' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'versalete', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'dupla', forma: 'fluxo', tituloEstilo: 'centro-italico' },\n}\n\nconst blocosColoridos: PrintStyle = {\n name: 'blocos-coloridos',\n label: 'Blocos coloridos',\n referencia: 'Infografia em cartões de cores claras: colunas, números grandes, grotesca geométrica; inspirado em David McCandless (Information is Beautiful)',\n fontes: { titulo: f('Montserrat', SANS), corpo: f('Lato', SANS), numero: f('Montserrat', SANS), rotulo: f('Montserrat', SANS), anotacao: f('Lato', SANS), mono: f('Lato', SANS) },\n googleFonts: ['Montserrat:ital,wght@0,500;0,600;0,700;0,800;0,900;1,500', 'Lato:ital,wght@0,400;0,700;1,400'],\n cor: { papel: '#ffffff', tinta: '#2b2b2b', tinta2: '#444444', tinta3: '#6b6b76', linha: '#e4e4ea', destaque: '#f0506e', destaque2: '#7b5ea7', marcaTexto: '#ffe9cf', contexto: '#d3d3cf', prova: { sustentada: '#2b2b2b', refutada: '#c93a58', 'nao-da-para-afirmar': '#b8561a', ...cinzas('#6b6b76') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 1.6,\n caixaAlta: false,\n pb: { destaque: '#2b2b2b', destaque2: '#9a9a9a' },\n estrutura: { painel: 'cartao', rotulo: 'quadrado', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, barras: 'vertical', corRotulo: 'tinta', forma: 'cartoes', multiplos: 'lado-a-lado', veredito: 'bloco-escuro', fundoPainel: 'alternado', manchete: 'texto' },\n}\n\nconst construtivismo: PrintStyle = {\n name: 'construtivismo',\n label: 'Construtivismo russo',\n referencia: 'Construtivismo soviético: vermelho e preto, diagonais, grotesca condensada em caixa-alta; inspirado em El Lissitzky, Rodchenko e os irmãos Stenberg',\n fontes: { titulo: f('Oswald', SANS), corpo: f('PT Sans', SANS), numero: f('Oswald', SANS), rotulo: f('Oswald', SANS), anotacao: f('PT Sans Narrow', SANS), mono: f('PT Sans Narrow', SANS) },\n googleFonts: ['Oswald:wght@400;500;600;700', 'PT Sans:ital,wght@0,400;0,700;1,400', 'PT Sans Narrow:wght@400;700'],\n cor: { papel: '#efe6d2', tinta: '#1a1714', tinta2: '#2e2a25', tinta3: '#5e564c', linha: '#1a1714', destaque: '#c8201e', destaque2: '#1a1714', marcaTexto: '#e3d6bb', contexto: '#b9ad97', prova: { sustentada: '#1a1714', refutada: '#b01c1a', 'nao-da-para-afirmar': '#1a1714', ...cinzas('#5e564c') }, ornamento: ['#c8201e', '#1a1714'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.4, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: true,\n pb: { destaque: '#6a6a6a' },\n estrutura: { painel: 'fio-grosso', rotulo: 'quadrado', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'diagonais', corRotulo: 'refutada', tituloEstilo: 'pesado', costura: 'bloco-escuro', manchete: 'diagonal' },\n}\n\nconst bauhaus: PrintStyle = {\n name: 'bauhaus',\n label: 'Bauhaus',\n referencia: 'Escola Bauhaus (1923–1930): triângulo, quadrado e círculo nas três primárias, sans geométrica em caixa-baixa; inspirado em Herbert Bayer e Joost Schmidt',\n fontes: { titulo: f('Jost', SANS), corpo: f('Jost', SANS), numero: f('Jost', SANS), rotulo: f('Jost', SANS), anotacao: f('Jost', SANS), mono: f('Jost', SANS) },\n googleFonts: ['Jost:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400'],\n cor: { papel: '#f6f2e9', tinta: '#141414', tinta2: '#2e2d2b', tinta3: '#5d5a55', linha: '#141414', destaque: '#d4372c', destaque2: '#3a3f9e', marcaTexto: '#ece21c', contexto: '#cfc9bd', prova: { sustentada: '#141414', refutada: '#b52d24', 'nao-da-para-afirmar': '#141414', ...cinzas('#5d5a55') }, ornamento: ['#ece21c', '#d4372c', '#3a3f9e'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.4, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'formas',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#5a5a5a', destaque2: '#a0a0a0', marcaTexto: '#e0e0e0' },\n estrutura: { painel: 'fio-grosso', rotulo: 'circulo', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: true, barras: 'vertical', moldura: 'formas', corRotulo: 'marcaTexto', multiplos: 'lado-a-lado', costura: 'faixa', manchete: 'texto' },\n}\n\nconst brutalista: PrintStyle = {\n name: 'brutalista',\n label: 'Brutalista (dossiê)',\n referencia: 'Design brutalista de dossiê e formulário: mono em caixa-alta, campos numerados, faixas pretas, hachura, carimbo',\n fontes: { titulo: f('Space Mono', MONO), corpo: f('IBM Plex Mono', MONO), numero: f('Space Mono', MONO), rotulo: f('Space Mono', MONO), anotacao: f('IBM Plex Mono', MONO), mono: f('IBM Plex Mono', MONO) },\n googleFonts: ['Space Mono:ital,wght@0,400;0,700;1,400', 'IBM Plex Mono:ital,wght@0,400;0,500;0,600;0,700;1,400'],\n cor: { papel: '#ebeae5', tinta: '#0d0d0d', tinta2: '#2e2e2c', tinta3: '#4d4d4a', linha: '#0d0d0d', destaque: '#0d0d0d', destaque2: '#0d0d0d', marcaTexto: '#d6d5cf', contexto: '#9a9994', prova: { sustentada: '#0d0d0d', refutada: '#0d0d0d', 'nao-da-para-afirmar': '#0d0d0d', ...cinzas('#2e2e2c', '#4d4d4a') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.35, tremor: 0, hachura: 'simples' },\n grafico: 'limpo',\n marcaProva: 'carimbo',\n raio: 0,\n caixaAlta: true,\n pb: {},\n estrutura: { painel: 'dossie', rotulo: 'letra', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false },\n}\n\nconst divulgacao: PrintStyle = {\n name: 'divulgacao',\n label: 'Revista de divulgação',\n referencia: 'Revistas de divulgação científica para jovens: cores vivas, cartões arredondados, balões, títulos pesados; inspirado em Ciência Hoje das Crianças e Superinteressante',\n fontes: { titulo: f('Archivo Black', SANS), corpo: f('Nunito', SANS), numero: f('Archivo Black', SANS), rotulo: f('Nunito', SANS), anotacao: f('Nunito', SANS), mono: f('Nunito', SANS) },\n googleFonts: ['Archivo Black', 'Nunito:ital,wght@0,400;0,600;0,700;0,800;0,900;1,400'],\n cor: { papel: '#fffdf7', tinta: '#1b1446', tinta2: '#2a1d5c', tinta3: '#5f5a7a', linha: '#6a2c91', destaque: '#f58220', destaque2: '#6a2c91', marcaTexto: '#fff4c2', contexto: '#dcd3c4', prova: { sustentada: '#3d6b1f', refutada: '#c4006a', 'nao-da-para-afirmar': '#b35a00', ...cinzas('#5f5a7a') }, ornamento: ['#e6007e', '#f58220', '#8cc63f', '#6a2c91'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.35, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'pilula',\n raio: 3,\n caixaAlta: false,\n pb: { destaque: '#8a8a8a', destaque2: '#2a2a2a' },\n estrutura: { painel: 'cartao', rotulo: 'circulo', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, barras: 'vertical', corRotulo: 'destaque', contornoBarra: true, tituloEstilo: 'normal', forma: 'colunas', chamadas: 'baloes', multiplos: 'lado-a-lado', emblema: 'lupa', fundoPainel: 'alternado', costura: 'selo', manchete: 'lupa' },\n}\n\nconst proporcaoModular: PrintStyle = {\n name: 'proporcao-modular',\n label: 'Proporção modular',\n referencia: 'Proporções modulares e policromia arquitetônica: letras em estêncil, siena e verde, paredes de cor chapada; inspirado em Le Corbusier (policromia de 1931 e 1959)',\n fontes: { titulo: f('Stardos Stencil', SERIF), corpo: f('Work Sans', SANS), numero: f('Work Sans', SANS), rotulo: f('Work Sans', SANS), anotacao: f('Work Sans', SANS), mono: f('Allerta Stencil', SANS) },\n googleFonts: ['Stardos Stencil:wght@400;700', 'Work Sans:ital,wght@0,400;0,500;0,600;1,400', 'Allerta Stencil'],\n cor: { papel: '#f7f2e8', tinta: '#26221d', tinta2: '#3c3630', tinta3: '#6a6259', linha: '#26221d', destaque: '#9a4b33', destaque2: '#2f5f45', marcaTexto: '#e9dcc3', contexto: '#d6cbb8', prova: { sustentada: '#2a5a40', refutada: '#9a4b33', 'nao-da-para-afirmar': '#26221d', ...cinzas('#6a6259') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'etiqueta',\n raio: 0,\n caixaAlta: true,\n pb: { destaque: '#5a5a5a', destaque2: '#a0a0a0' },\n estrutura: { painel: 'bloco', rotulo: 'quadrado', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, barras: 'vertical', corRotulo: 'tinta', multiplos: 'lado-a-lado', emblema: 'figura-modular', fundoPainel: 'alternado', costura: 'barra', manchete: 'texto', cabecaMultiplo: 'caixa-cor' },\n}\n\nconst sinalizacao: PrintStyle = {\n name: 'sinalizacao',\n label: 'Sinalização de aeroporto',\n referencia: 'Sinalização de aeroporto: faixas amarelas, setas, preto, grotesca legível à distância; inspirado em Benno Wissing e Total Design (aeroporto de Schiphol, 1967)',\n fontes: { titulo: f('Hind', SANS), corpo: f('Hind', SANS), numero: f('Hind', SANS), rotulo: f('Hind', SANS), anotacao: f('Hind', SANS), mono: f('Hind', SANS) },\n googleFonts: ['Hind:wght@400;500;600;700'],\n cor: { papel: '#fbfbf8', tinta: '#121212', tinta2: '#2b2b2b', tinta3: '#555553', linha: '#121212', destaque: '#121212', destaque2: '#9d9d9d', marcaTexto: '#fff200', contexto: '#9d9d9d', prova: { sustentada: '#121212', refutada: '#121212', 'nao-da-para-afirmar': '#121212', ...cinzas('#555553') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.35, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'pilula',\n raio: 0,\n caixaAlta: false,\n pb: { marcaTexto: '#d9d9d9' },\n estrutura: { painel: 'placa', rotulo: 'quadrado', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, cabeco: 'etiqueta', corRotulo: 'tinta', veredito: 'bloco-escuro', rastro: 'placa', manchete: 'faixa', cabecaMultiplo: 'faixa' },\n}\n\nconst pictogramas: PrintStyle = {\n name: 'pictogramas',\n label: 'Pictogramas esportivos',\n referencia: 'Identidade de grande evento esportivo: pictogramas em grade, azul-claro, verde e laranja, sans de corpo leve; inspirado em Otl Aicher (Munique, 1972)',\n fontes: { titulo: f('Albert Sans', SANS), corpo: f('Albert Sans', SANS), numero: f('Albert Sans', SANS), rotulo: f('Albert Sans', SANS), anotacao: f('Albert Sans', SANS), mono: f('Albert Sans', SANS) },\n googleFonts: ['Albert Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400'],\n cor: { papel: '#ffffff', tinta: '#1f2a33', tinta2: '#34414b', tinta3: '#5f6b73', linha: '#1f2a33', destaque: '#f28c28', destaque2: '#6b8e3a', marcaTexto: '#d4e6e8', contexto: '#b9bcc0', prova: { sustentada: '#2f5f45', refutada: '#b35a0c', 'nao-da-para-afirmar': '#1f2a33', ...cinzas('#5f6b73') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'etiqueta',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#8a8a8a', destaque2: '#3a3a3a', marcaTexto: '#d9d9d9' },\n estrutura: { painel: 'bloco', rotulo: 'quadrado', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, barras: 'vertical', corRotulo: 'sustentada', multiplos: 'lado-a-lado', emblema: 'pictogramas', fundoPainel: 'claro', manchete: 'faixa', cabecaMultiplo: 'faixa-cor' },\n}\n\nconst mapaDeMetro: PrintStyle = {\n name: 'mapa-de-metro',\n label: 'Mapa de metrô',\n referencia: 'Manual e mapa de metrô: faixa preta no topo, círculos coloridos, grotesca neutra; inspirado em Massimo Vignelli (metrô de Nova York, Unimark, 1970–1972)',\n fontes: { titulo: f('Inter', SANS), corpo: f('Inter', SANS), numero: f('Inter', SANS), rotulo: f('Inter', SANS), anotacao: f('Inter', SANS), mono: f('Inter', SANS) },\n googleFonts: ['Inter:wght@400;500;600;700'],\n cor: { papel: '#ffffff', tinta: '#111111', tinta2: '#2e2e2e', tinta3: '#595959', linha: '#111111', destaque: '#ee352e', destaque2: '#a7a9ac', marcaTexto: '#ebebe6', contexto: '#a7a9ac', prova: { sustentada: '#111111', refutada: '#d6261f', 'nao-da-para-afirmar': '#111111', ...cinzas('#595959') }, ornamento: ['#ee352e', '#ff6319', '#b933ad', '#996633'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'ponto',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#4a4a4a' },\n estrutura: { painel: 'fio', rotulo: 'circulo', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, barras: 'vertical', cabeco: 'faixa', corRotulo: 'tinta', veredito: 'bloco-escuro', rastro: 'metro', manchete: 'texto', cabecaMultiplo: 'faixa-escura' },\n}\n\nconst jornal1959: PrintStyle = {\n name: 'jornal-1959',\n label: 'Jornal modernista (1959)',\n referencia: 'Reforma gráfica de jornal modernista: branco, preto e cinza, filetes, Bodoni no título, grade limpa; inspirado em Amilcar de Castro (reforma do Jornal do Brasil, 1956–1959)',\n fontes: { titulo: f('Libre Bodoni', SERIF), corpo: f('PT Serif', SERIF), numero: f('Libre Bodoni', SERIF), rotulo: f('Libre Franklin', SANS), anotacao: f('PT Serif', SERIF), mono: f('Libre Franklin', SANS) },\n googleFonts: ['Libre Bodoni:wght@400;700', 'PT Serif:ital,wght@0,400;0,700;1,400', 'Libre Franklin:wght@400;500;600;700'],\n cor: { papel: '#fdfdfb', tinta: '#111111', tinta2: '#2b2b2b', tinta3: '#595959', linha: '#111111', destaque: '#111111', destaque2: '#a3a3a3', marcaTexto: '#ececea', contexto: '#a3a3a3', prova: { sustentada: '#111111', refutada: '#111111', 'nao-da-para-afirmar': '#111111', ...cinzas('#595959') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.25, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: {},\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false },\n}\n\nconst azulejoModernista: PrintStyle = {\n name: 'azulejo-modernista',\n label: 'Azulejo modernista',\n referencia: 'Painéis de azulejo modernista: módulo azul e branco com semicírculos e quadrados, acento amarelo, geometria; inspirado em Athos Bulcão (Brasília)',\n fontes: { titulo: f('Jost', SANS), corpo: f('Jost', SANS), numero: f('Jost', SANS), rotulo: f('Jost', SANS), anotacao: f('Jost', SANS), mono: f('Jost', SANS) },\n googleFonts: ['Jost:ital,wght@0,400;0,500;0,600;0,700;1,400'],\n cor: { papel: '#fbfaf5', tinta: '#15171c', tinta2: '#2b2e35', tinta3: '#5f636b', linha: '#3040b0', destaque: '#3040b0', destaque2: '#aab3de', marcaTexto: '#f0efe8', contexto: '#aab3de', prova: { sustentada: '#15171c', refutada: '#3040b0', 'nao-da-para-afirmar': '#15171c', ...cinzas('#5f636b') }, ornamento: ['#3040b0', '#fbfaf5', '#f0b323'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#3a3a3a', destaque2: '#b0b0b0' },\n estrutura: { painel: 'fio', rotulo: 'quadrado', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'azulejo', corRotulo: 'destaque' },\n}\n\nconst tropicalia: PrintStyle = {\n name: 'tropicalia',\n label: 'Tropicália',\n referencia: 'Capas e cartazes tropicalistas (1967–1969): ondas de cor, letreiro exuberante, laranja, roxo e magenta; inspirado em Rogério Duarte',\n fontes: { titulo: f('Shrikhand', SERIF), corpo: f('Work Sans', SANS), numero: f('Work Sans', SANS), rotulo: f('Work Sans', SANS), anotacao: f('Work Sans', SANS), mono: f('Work Sans', SANS) },\n googleFonts: ['Shrikhand', 'Work Sans:ital,wght@0,400;0,500;0,600;0,700;1,400'],\n cor: { papel: '#fff6e3', tinta: '#1e1a24', tinta2: '#332c3b', tinta3: '#61586a', linha: '#5b2a86', destaque: '#5b2a86', destaque2: '#ee8a1c', marcaTexto: '#fde7c2', contexto: '#ead9bf', prova: { sustentada: '#5b2a86', refutada: '#c21f6e', 'nao-da-para-afirmar': '#1e1a24', ...cinzas('#61586a') }, ornamento: ['#e8601c', '#d6247a', '#5b2a86', '#1f8a5b'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#2a2a2a', destaque2: '#a0a0a0' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'ondas', tituloEstilo: 'arcoiris' },\n}\n\nconst atlasOficial: PrintStyle = {\n name: 'atlas-oficial',\n label: 'Atlas oficial (cartografia)',\n referencia: 'Atlas oficiais: moldura cartográfica com régua alternada, hachura, terra e oliva, legenda de convenções; inspirado em atlas oficiais brasileiros (IBGE, Atlas Nacional)',\n fontes: { titulo: f('IBM Plex Sans Condensed', SANS), corpo: f('IBM Plex Serif', SERIF), numero: f('IBM Plex Sans Condensed', SANS), rotulo: f('IBM Plex Sans Condensed', SANS), anotacao: f('IBM Plex Serif', SERIF), mono: f('IBM Plex Sans Condensed', SANS) },\n googleFonts: ['IBM Plex Sans Condensed:wght@400;500;600;700', 'IBM Plex Serif:ital,wght@0,400;0,600;1,400'],\n cor: { papel: '#fbf8ef', tinta: '#23231d', tinta2: '#3a3a31', tinta3: '#666355', linha: '#23231d', destaque: '#8c5a2b', destaque2: '#5c6b2f', marcaTexto: '#eee8d3', contexto: '#d9d3bd', prova: { sustentada: '#23231d', refutada: '#8c5a2b', 'nao-da-para-afirmar': '#23231d', ...cinzas('#666355') }, ornamento: ['#23231d', '#fbf8ef'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'simples' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: true,\n pb: { destaque: '#4a4a4a', destaque2: '#7a7a7a' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'alta', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'regua' },\n}\n\nconst gradeHolandesa: PrintStyle = {\n name: 'grade-holandesa',\n label: 'Grade holandesa',\n referencia: 'Grade aparente, letreiro modular espaçado, preto e um laranja; inspirado em Wim Crouwel (Stedelijk Museum, New Alphabet, 1967)',\n fontes: { titulo: f('Major Mono Display', MONO), corpo: f('Hanken Grotesk', SANS), numero: f('Hanken Grotesk', SANS), rotulo: f('Hanken Grotesk', SANS), anotacao: f('Hanken Grotesk', SANS), mono: f('Hanken Grotesk', SANS) },\n googleFonts: ['Major Mono Display', 'Hanken Grotesk:wght@400;500;600;700;800'],\n cor: { papel: '#ffffff', tinta: '#111111', tinta2: '#2e2e2e', tinta3: '#595959', linha: '#111111', destaque: '#111111', destaque2: '#f04e23', marcaTexto: '#fde3da', contexto: '#dddddd', prova: { sustentada: '#111111', refutada: '#c8391a', 'nao-da-para-afirmar': '#111111', ...cinzas('#595959') } },\n papel: { textura: 'milimetrado', intensidade: 0.5 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: true,\n pb: { destaque2: '#9a9a9a' },\n estrutura: { painel: 'fio-grosso', rotulo: 'quadrado', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: true, corRotulo: 'destaque2' },\n}\n\nconst papelRecortado: PrintStyle = {\n name: 'papel-recortado',\n label: 'Papel recortado',\n referencia: 'Cartazes e aberturas de filme em papel recortado: preto e laranja, letreiro à mão em blocos; inspirado em Saul Bass (Anatomy of a Murder, Vertigo)',\n fontes: { titulo: f('Londrina Solid', SANS), corpo: f('Work Sans', SANS), numero: f('Londrina Solid', SANS), rotulo: f('Work Sans', SANS), anotacao: f('Work Sans', SANS), mono: f('Work Sans', SANS) },\n googleFonts: ['Londrina Solid:wght@400;900', 'Work Sans:ital,wght@0,400;0,500;0,600;0,700;1,400'],\n cor: { papel: '#f3ead8', tinta: '#161616', tinta2: '#2c2a26', tinta3: '#5e574c', linha: '#161616', destaque: '#161616', destaque2: '#e8591a', marcaTexto: '#ecd9b9', contexto: '#d8cbb0', prova: { sustentada: '#161616', refutada: '#b3431a', 'nao-da-para-afirmar': '#161616', ...cinzas('#5e574c') }, ornamento: ['#161616', '#e8591a'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.35, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque2: '#8a8a8a' },\n estrutura: { painel: 'fio-grosso', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'recortes', tituloEstilo: 'recorte' },\n}\n\nconst popArt: PrintStyle = {\n name: 'pop-art',\n label: 'Pop art',\n referencia: 'Pop art: pontos Ben-Day, contorno preto grosso, primárias, balão e letreiro de quadrinhos; inspirado em Roy Lichtenstein',\n fontes: { titulo: f('Bangers', SANS), corpo: f('Nunito Sans', SANS), numero: f('Bangers', SANS), rotulo: f('Nunito Sans', SANS), anotacao: f('Comic Neue', HAND), mono: f('Nunito Sans', SANS) },\n googleFonts: ['Bangers', 'Nunito Sans:wght@400;600;700;800', 'Comic Neue:wght@400;700'],\n cor: { papel: '#fffdf5', tinta: '#111111', tinta2: '#2b2b2b', tinta3: '#555555', linha: '#111111', destaque: '#2b44b8', destaque2: '#e4252b', marcaTexto: '#f6ea00', contexto: '#d9d4c4', prova: { sustentada: '#111111', refutada: '#c81e24', 'nao-da-para-afirmar': '#111111', ...cinzas('#555555') }, ornamento: ['#e4252b', '#f6ea00', '#2b44b8'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.45, tremor: 0, hachura: 'pontilhada' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: true,\n pb: { destaque: '#2a2a2a', destaque2: '#8a8a8a', marcaTexto: '#d9d9d9' },\n estrutura: { painel: 'fio-grosso', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'reticula', tituloEstilo: 'faixa', contornoBarra: true },\n}\n\nconst cientifico: PrintStyle = {\n name: 'cientifico',\n label: 'Figura de periódico científico',\n referencia: 'Figuras de periódicos científicos: painéis A e B, eixos com rótulo, paleta segura para daltônicos, legenda longa; inspirado em figuras da Nature, da Science e da PNAS',\n fontes: { titulo: f('STIX Two Text', SERIF), corpo: f('STIX Two Text', SERIF), numero: f('Arimo', SANS), rotulo: f('Arimo', SANS), anotacao: f('Arimo', SANS), mono: f('Arimo', SANS) },\n googleFonts: ['STIX Two Text:ital,wght@0,400;0,600;0,700;1,400', 'Arimo:wght@400;700'],\n cor: { papel: '#ffffff', tinta: '#111111', tinta2: '#2e2e2e', tinta3: '#555555', linha: '#111111', destaque: '#3b4aa8', destaque2: '#d97a00', marcaTexto: '#f2f2f2', contexto: '#bdbdbd', prova: { sustentada: '#111111', refutada: '#111111', 'nao-da-para-afirmar': '#111111', ...cinzas('#555555') } },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.25, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: false,\n pb: { destaque: '#2a2a2a', destaque2: '#9a9a9a' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, barras: 'vertical', forma: 'colunas', letraMultiplo: true, multiplos: 'lado-a-lado' },\n}\n\nconst artNouveau: PrintStyle = {\n name: 'art-nouveau',\n label: 'Art nouveau',\n referencia: 'Art nouveau: moldura arredondada, ramos e folhas, ocre e verde-oliva, letreiro decorativo; inspirado em Alphonse Mucha',\n fontes: { titulo: f('Federo', SERIF), corpo: f('EB Garamond', SERIF), numero: f('EB Garamond', SERIF), rotulo: f('Federo', SERIF), anotacao: f('EB Garamond', SERIF), mono: f('EB Garamond', SERIF) },\n googleFonts: ['Federo', 'EB Garamond:ital,wght@0,400;0,500;0,600;1,400;1,500'],\n cor: { papel: '#f6eedb', tinta: '#2a2718', tinta2: '#3f3a26', tinta3: '#625a44', linha: '#8a6d2c', destaque: '#4a5a2a', destaque2: '#b9832a', marcaTexto: '#efe2c2', contexto: '#e0d2ae', prova: { sustentada: '#4a5a2a', refutada: '#9a4a36', 'nao-da-para-afirmar': '#2a2718', ...cinzas('#625a44') }, ornamento: ['#4a5a2a', '#b9832a', '#8a6d2c'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'pilula',\n raio: 2,\n caixaAlta: false,\n pb: { destaque: '#3a3a3a', destaque2: '#a0a0a0' },\n estrutura: { painel: 'fio', rotulo: 'letra', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'ramos' },\n}\n\nconst memphis: PrintStyle = {\n name: 'memphis',\n label: 'Memphis',\n referencia: 'Design pós-moderno de Milão (1981): zigue-zagues, triângulos, confete, turquesa, amarelo e rosa, contorno preto; inspirado em Ettore Sottsass e no grupo Memphis',\n fontes: { titulo: f('Bungee', SANS), corpo: f('Rubik', SANS), numero: f('Bungee', SANS), rotulo: f('Rubik', SANS), anotacao: f('Rubik', SANS), mono: f('Rubik', SANS) },\n googleFonts: ['Bungee', 'Rubik:ital,wght@0,400;0,500;0,700;1,400'],\n cor: { papel: '#fffaf0', tinta: '#161616', tinta2: '#2c2b29', tinta3: '#5c5a57', linha: '#161616', destaque: '#1fb5a8', destaque2: '#f6ea00', marcaTexto: '#fff2b8', contexto: '#e2dccb', prova: { sustentada: '#161616', refutada: '#c2185b', 'nao-da-para-afirmar': '#161616', ...cinzas('#5c5a57') }, ornamento: ['#161616', '#f6ea00', '#ff5fa2', '#1fb5a8'] },\n papel: { textura: 'nenhuma', intensidade: 0 },\n traco: { largura: 0.3, tremor: 0, hachura: 'nenhuma' },\n grafico: 'limpo',\n marcaProva: 'barra',\n raio: 0,\n caixaAlta: true,\n pb: { destaque: '#5a5a5a', destaque2: '#d0d0d0' },\n estrutura: { painel: 'caixa', rotulo: 'circulo', rotuloCaixa: 'normal', notas: 'dentro', figura: 'simples', minusculas: false, moldura: 'memphis', tituloEstilo: 'sombra', contornoBarra: true, corRotulo: 'destaque2' },\n}\n\n/** The 39 book styles, by name. */\nexport const printPresets = {\n dashboard,\n 'graficos-1900': graficos1900,\n 'cartao-postal': cartaoPostal,\n caderno,\n isotype,\n cordel,\n riso,\n jornal,\n prancheta,\n 'prancheta-clara': pranchetaClara,\n aquarela,\n 'minimo-de-tinta': minimoDeTinta,\n suico,\n concretismo,\n semanario,\n 'infografico-ilustrado': infograficoIlustrado,\n 'diagrama-modernista': diagramaModernista,\n 'papel-salmao': papelSalmao,\n 'dados-br': dadosBr,\n 'fluxo-historico': fluxoHistorico,\n 'blocos-coloridos': blocosColoridos,\n construtivismo,\n bauhaus,\n brutalista,\n divulgacao,\n 'proporcao-modular': proporcaoModular,\n sinalizacao,\n pictogramas,\n 'mapa-de-metro': mapaDeMetro,\n 'jornal-1959': jornal1959,\n 'azulejo-modernista': azulejoModernista,\n tropicalia,\n 'atlas-oficial': atlasOficial,\n 'grade-holandesa': gradeHolandesa,\n 'papel-recortado': papelRecortado,\n 'pop-art': popArt,\n cientifico,\n 'art-nouveau': artNouveau,\n memphis,\n} satisfies Record<string, PrintStyle>\n\nexport type PrintPresetName = keyof typeof printPresets\nexport const PRINT_PRESET_NAMES = Object.keys(printPresets) as PrintPresetName[]\nexport const DEFAULT_PRINT_STYLE: PrintPresetName = 'jornal'\n\n// ---------------------------------------------------------------------------\n// Deprecated ids\n// ---------------------------------------------------------------------------\n\n/** Any id a style can be named by: a current name or a deprecated alias (PRINT_STYLE_ALIASES). */\nexport type PrintStyleId = PrintPresetName | PrintStyleAlias\n\n/**\n * The current name of a style id: a current name is returned as is, a\n * deprecated alias is mapped (with a one-time development warning), anything\n * else gives `undefined`.\n */\nexport function resolvePrintStyleName(id: string): PrintPresetName | undefined {\n if (Object.hasOwn(printPresets, id)) return id as PrintPresetName\n if (Object.hasOwn(PRINT_STYLE_ALIASES, id)) {\n const current = PRINT_STYLE_ALIASES[id as PrintStyleAlias]\n warnDeprecatedPrintId(id, current)\n return current\n }\n return undefined\n}\n\n/** The preset of a style id (current or deprecated); throws on an unknown id. */\nexport function printPresetById(id: string): PrintStyle {\n const name = resolvePrintStyleName(id)\n if (!name) throw new Error(`tympan: unknown print style \"${id}\"`)\n return printPresets[name]\n}\n\n// ---------------------------------------------------------------------------\n// Resolution: overrides, black and white\n// ---------------------------------------------------------------------------\n\nfunction mergeCores(base: PrintCores, over?: PrintCoresParciais): PrintCores {\n if (!over) return base\n const { prova, ...rest } = over\n const clean = Object.fromEntries(Object.entries(rest).filter(([, v]) => v !== undefined)) as Partial<PrintCores>\n const temas = base.temas || clean.temas ? { temas: { ...base.temas, ...clean.temas } } : {}\n const categorias = base.categorias || clean.categorias ? { categorias: { ...base.categorias, ...clean.categorias } } : {}\n return { ...base, ...clean, ...temas, ...categorias, prova: { ...base.prova, ...(prova ?? {}) } }\n}\n\nfunction mergeExtras(base: PrintTemaExtras, over: PrintTemaExtras): PrintTemaExtras {\n const out: PrintTemaExtras = {}\n const marcas = { ...base.marcas, ...over.marcas }\n if (Object.keys(marcas).length) out.marcas = marcas\n const pagina = { ...base.pagina, ...over.pagina }\n if (Object.keys(pagina).length) out.pagina = pagina\n const folio = { ...base.folio, ...over.folio }\n if (Object.keys(folio).length) out.folio = folio\n const fl = over.fontesLocais ?? base.fontesLocais\n if (fl) out.fontesLocais = fl\n const rs = { ...base.rastro, ...over.rastro }\n if (Object.keys(rs).length) out.rastro = rs\n const tx = { ...base.textos, ...over.textos }\n if (Object.keys(tx).length) out.textos = tx\n return out\n}\n\n/** A style with the editor's overrides applied (nested, partial). */\nexport function mergePrintStyle(style: PrintStyle, overrides?: PrintStyleOverrides): PrintStyle {\n if (!overrides) return style\n return {\n ...style,\n label: overrides.label ?? style.label,\n fontes: { ...style.fontes, ...overrides.fontes },\n googleFonts: overrides.googleFonts ?? style.googleFonts,\n cor: mergeCores(style.cor, overrides.cor),\n papel: { ...style.papel, ...overrides.papel },\n traco: { ...style.traco, ...overrides.traco },\n grafico: overrides.grafico ?? style.grafico,\n marcaProva: overrides.marcaProva ?? style.marcaProva,\n raio: overrides.raio ?? style.raio,\n caixaAlta: overrides.caixaAlta ?? style.caixaAlta,\n // P&B adjustments stay partial: merging them over the full colour set would put colours back over the greys.\n pb: overrides.pb ? { ...style.pb, ...overrides.pb, ...(style.pb.prova || overrides.pb.prova ? { prova: { ...style.pb.prova, ...overrides.pb.prova } } : {}) } : style.pb,\n estrutura: { ...style.estrutura, ...overrides.estrutura },\n logo: overrides.logo ?? style.logo,\n ...(overrides.texto || style.texto ? { texto: { ...style.texto, ...overrides.texto } } : {}),\n ...mergeExtras(style, overrides),\n }\n}\n\nconst fromLinear = (c: number) => (c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055)\n\n/** The grey with the same WCAG relative luminance, so every contrast ratio survives the conversion. */\nexport function toGrey(color: string): string {\n const c: Rgba = parseColor(color)\n const y = luminance(c)\n const v = fromLinear(y)\n return toHex({ r: v, g: v, b: v, a: 1 })\n}\n\n/** Colours for black and white print: every role in grey, then the style's own `pb` adjustments. */\nexport function printStyleCoresPb(style: PrintStyle): PrintCores {\n const g = style.cor\n const grey: PrintCores = {\n papel: toGrey(g.papel),\n tinta: toGrey(g.tinta),\n tinta2: toGrey(g.tinta2),\n tinta3: toGrey(g.tinta3),\n linha: toGrey(g.linha),\n destaque: toGrey(g.destaque),\n destaque2: toGrey(g.destaque2),\n marcaTexto: toGrey(g.marcaTexto),\n contexto: toGrey(g.contexto),\n prova: Object.fromEntries(ESTADOS_PROVA.map((e) => [e, toGrey(g.prova[e])])) as Record<EstadoProva, string>,\n ...(g.ornamento ? { ornamento: g.ornamento.map(toGrey) } : {}),\n ...(g.interesse ? { interesse: toGrey(g.interesse) } : {}),\n ...(g.temas ? { temas: Object.fromEntries(Object.entries(g.temas).map(([k, v]) => [k, toGrey(v)])) } : {}),\n ...(g.divergente ? { divergente: g.divergente.map(toGrey) as [string, string] } : {}),\n categorica: categoricaDoEstilo(style).map(toGrey),\n }\n return mergeCores(grey, style.pb)\n}\n\nexport interface PrintCssOptions {\n /** Black and white variant. */\n pb?: boolean\n /** Editor overrides of any token. */\n overrides?: PrintStyleOverrides\n /** Selector to scope the properties to; defaults to `[data-ty-print-style=\"<name>\"]`. */\n seletor?: string\n}\n\n/**\n * The style as it will print: overrides applied, then (for `pb`) the grey\n * conversion. Takes a preset or a style id; a deprecated id resolves to its\n * current style (`resolvePrintStyle('economist').name === 'semanario'`).\n */\nexport function resolvePrintStyle(style: PrintStyle | PrintStyleId, options: Omit<PrintCssOptions, 'seletor'> = {}): PrintStyle {\n const base = typeof style === 'string' ? printPresetById(style) : style\n const merged = mergePrintStyle(base, options.overrides)\n if (!options.pb) return merged\n return { ...merged, cor: printStyleCoresPb(merged) }\n}\n\nconst kebab: Record<Exclude<keyof PrintCores, 'prova' | 'ornamento' | 'divergente' | 'categorica' | 'interesse' | 'temas' | 'categorias'>, string> = {\n papel: 'papel',\n tinta: 'tinta',\n tinta2: 'tinta-2',\n tinta3: 'tinta-3',\n linha: 'linha',\n destaque: 'destaque',\n destaque2: 'destaque-2',\n marcaTexto: 'marca-texto',\n contexto: 'contexto',\n}\n\nconst num = (n: number) => String(Math.round(n * 1000) / 1000)\n\n/**\n * `cor` moved along OKLCH lightness (hue and chroma kept) until it reaches `min`:1 against `papel`: the\n * context grey of a theme stays visible on cream paper (areas ≥ 1.5:1, strokes ≥ 3:1).\n */\nexport function contrasteMinimo(cor: string, papel: string, min: number): string {\n const p = parseColor(papel)\n if (contrastRatio(parseColor(cor), p) >= min) return toHex(parseColor(cor))\n const v = rgbToOklch(parseColor(cor))\n const passo = luminance(p) > 0.2 ? -0.005 : 0.005\n let out = parseColor(cor)\n for (let i = 0; i < 200 && contrastRatio(out, p) < min; i++) {\n v.l = Math.min(0.995, Math.max(0.02, v.l + passo))\n out = oklchToRgb(v)\n }\n return toHex(out)\n}\n\nconst SELETORES_PAPEL: Record<keyof PrintFontes, string> = {\n titulo: ':is(h1, h2, h3, h4, .ty-print-title, .ty-print-figure-title, [class*=\"-title\"]:not(.ty-print-panel-title, .ty-print-block-title, .ty-print-margin-title))',\n numero: ':is(.ty-print-number-value, .ty-print-table td[data-numerica], .ty-print-parliament-total, [class*=\"-numero\"], [class*=\"-number\"])',\n rotulo: ':is(.ty-print-panel-title, .ty-print-block-title, .ty-print-margin-title, .ty-print-sobretitle, .ty-print-table th, .ty-print-map-legend, .ty-print-running-head, .ty-print-folio, .ty-print-letter)',\n corpo: '',\n anotacao: ':is(.ty-print-annotation, .ty-print-margin, .ty-print-callout-text)',\n mono: ':is(code, pre, .ty-print-mono, .ty-print-table td[data-mono])',\n}\n\n/**\n * Unlayered rules (they win over `@layer tympan-print`) for a theme's per-role font weights and figures,\n * scoped to `seletor`; '' when the theme sets neither.\n */\nexport function printTextoRolesCss(style: Pick<PrintStyle, 'texto'>, seletor: string): string {\n const out: string[] = []\n for (const [papel, peso] of Object.entries(style.texto?.pesos ?? {}) as Array<[keyof PrintFontes, number]>) {\n const s = SELETORES_PAPEL[papel]\n out.push(`${seletor}${s ? ` ${s}` : ''} { font-weight: ${peso}; }`)\n }\n for (const [papel, a] of Object.entries(style.texto?.algarismos ?? {}) as Array<[keyof PrintFontes, string]>) {\n const s = SELETORES_PAPEL[papel]\n out.push(`${seletor}${s ? ` ${s}` : ''} { font-variant-numeric: ${a === 'tabular' ? 'tabular-nums lining-nums' : 'proportional-nums'}; }`)\n }\n return out.join('\\n')\n}\n\n/** Qualitative palette (Okabe & Ito 2008, colour-blind safe) used when a style defines none. */\nexport const CATEGORICA_PADRAO = ['#0072b2', '#e69f00', '#009e73', '#cc79a7', '#56b4e9', '#d55e00', '#f0e442', '#555555'] as const\n\n/** The eight qualitative data colours of a style: its own `categorica`, completed by CATEGORICA_PADRAO. */\nexport function categoricaDoEstilo(style: Pick<PrintStyle, 'cor'>): string[] {\n const own = style.cor.categorica ?? []\n return Array.from({ length: 8 }, (_, i) => own[i] ?? CATEGORICA_PADRAO[i]!)\n}\n\n/** Custom properties of a resolved style, in a stable order. */\nexport function printStyleVariables(style: PrintStyle): Array<[string, string]> {\n const vars: Array<[string, string]> = []\n for (const k of ['titulo', 'corpo', 'numero', 'rotulo', 'anotacao', 'mono'] as const) vars.push([`--ty-print-fonte-${k}`, style.fontes[k]])\n for (const [k, name] of Object.entries(kebab) as Array<[keyof typeof kebab, string]>) vars.push([`--ty-print-${name}`, style.cor[k]])\n for (const e of ESTADOS_PROVA) vars.push([`--ty-print-prova-${e}`, style.cor.prova[e]])\n vars.push(['--ty-print-textura-intensidade', num(style.papel.intensidade)])\n vars.push(['--ty-print-traco', `${num(style.traco.largura)}mm`])\n vars.push(['--ty-print-tremor', num(style.traco.tremor)])\n vars.push(['--ty-print-raio', `${num(style.raio)}mm`])\n const minusculas = style.estrutura.minusculas\n vars.push(['--ty-print-titulo-caixa', style.caixaAlta ? 'uppercase' : minusculas ? 'lowercase' : 'none'])\n vars.push(['--ty-print-titulo-espaco', style.caixaAlta ? '0.04em' : 'normal'])\n const rc = style.estrutura.rotuloCaixa\n vars.push(['--ty-print-rotulo-caixa', minusculas ? 'lowercase' : rc === 'alta' ? 'uppercase' : 'none'])\n vars.push(['--ty-print-rotulo-variante', rc === 'versalete' ? 'small-caps' : 'normal'])\n vars.push(['--ty-print-rotulo-espaco', rc === 'normal' ? 'normal' : '0.07em'])\n vars.push(['--ty-print-pagina-largura', `${num(style.pagina?.largura ?? 170)}mm`])\n vars.push(['--ty-print-pagina-altura', `${num(style.pagina?.altura ?? 240)}mm`])\n const preservar = style.texto?.nomesProprios === 'preservar'\n vars.push(['--ty-print-titulo1-caixa', preservar ? 'none' : style.caixaAlta ? 'uppercase' : minusculas ? 'lowercase' : 'none'])\n vars.push(['--ty-print-sobretitulo-caixa', preservar ? 'none' : minusculas ? 'lowercase' : rc === 'alta' ? 'uppercase' : 'none'])\n vars.push(['--ty-print-celula-caixa', preservar ? 'none' : minusculas ? 'lowercase' : 'none'])\n vars.push(['--ty-print-tabela-numeros', style.texto?.numerosTabela === 'proporcional' ? 'proportional-nums lining-nums' : 'tabular-nums lining-nums'])\n for (const [k, v] of Object.entries(style.cor.temas ?? {})) vars.push([`--ty-print-tema-${k.replace(/[^a-z0-9-]/gi, '')}`, v])\n vars.push(['--ty-print-interesse', style.cor.interesse ?? style.cor.destaque])\n vars.push(['--ty-print-contexto-area', contrasteMinimo(style.cor.contexto, style.cor.papel, 1.5)])\n vars.push(['--ty-print-contexto-traco', contrasteMinimo(style.cor.contexto, style.cor.papel, 3)])\n const dv = style.cor.divergente ?? [style.cor.destaque2, style.cor.destaque]\n vars.push(['--ty-print-divergente-1', dv[0]])\n vars.push(['--ty-print-divergente-2', dv[1]])\n const cat = categoricaDoEstilo(style)\n cat.forEach((c, i) => vars.push([`--ty-print-categorica-${i + 1}`, c]))\n const orn = style.cor.ornamento ?? []\n const reserva = [style.cor.destaque, style.cor.destaque2, style.cor.tinta, style.cor.marcaTexto]\n for (let i = 0; i < 4; i++) vars.push([`--ty-print-ornamento-${i + 1}`, orn[i] ?? reserva[i]!])\n const cr = style.estrutura.corRotulo\n if (cr) {\n const fundo = cr === 'sustentada' || cr === 'refutada' ? style.cor.prova[cr] : style.cor[cr]\n vars.push(['--ty-print-rotulo-fundo', fundo])\n vars.push(['--ty-print-rotulo-tinta', luminance(parseColor(fundo)) > 0.4 ? style.cor.tinta : style.cor.papel])\n }\n return vars\n}\n\n/**\n * CSS custom properties (`--ty-print-*`) of a style on\n * `[data-ty-print-style=\"<name>\"]`, with the editor's overrides and, when\n * `pb` is set, the black and white colours.\n */\nexport function printStyleToCss(style: PrintStyle, options: PrintCssOptions = {}): string {\n const resolved = resolvePrintStyle(style, options)\n const selector = options.seletor ?? `[data-ty-print-style=\"${style.name}\"]`\n const body = printStyleVariables(resolved)\n .map(([n, v]) => ` ${n}: ${v};`)\n .join('\\n')\n return `${selector} {\\n${body}\\n}\\n`\n}\n\n/** Google Fonts css2 URL for a style's families (null when it uses system fonts only). */\nexport function googleFontsUrl(style: Pick<PrintStyle, 'googleFonts'>): string | null {\n if (!style.googleFonts.length) return null\n const families = style.googleFonts.map((spec) => `family=${encodeURIComponent(spec).replace(/%20/g, '+').replace(/%3A/g, ':').replace(/%40/g, '@').replace(/%3B/g, ';').replace(/%2C/g, ',')}`)\n return `https://fonts.googleapis.com/css2?${families.join('&')}&display=swap`\n}\n\n/** True when the paper is dark (the brand seal and logo then use the light mono version). */\nexport function papelEscuro(style: Pick<PrintStyle, 'cor'>): boolean {\n return luminance(parseColor(style.cor.papel)) < 0.2\n}\n","\nfunction createTextureSvg(style: any): string | undefined {\n const papel = style.papel\n if (!papel || papel.textura === 'nenhuma' || papel.intensidade <= 0) return undefined\n const k = papel.intensidade\n const n3 = (x: number) => Math.round(x * 1000) / 1000\n const matriz = (cor: string, alfa: number, limiar: number) => {\n const c = parseColor(cor)\n return `0 0 0 0 ${n3(c.r)} 0 0 0 0 ${n3(c.g)} 0 0 0 0 ${n3(c.b)} 0 0 0 ${n3(alfa)} ${n3(limiar)}`\n }\n\n const tinta = style.cor.tinta\n let defs = ''\n let corpo = ''\n\n if (papel.textura === 'grao') {\n defs = `\n <filter id=\"f\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\n <feTurbulence type=\"fractalNoise\" baseFrequency=\"0.8\" numOctaves=\"2\" seed=\"21\" stitchTiles=\"stitch\" />\n <feColorMatrix values=\"${matriz(tinta, 0.9 * k, -0.34)}\" />\n </filter>\n `\n corpo = `<rect width=\"100%\" height=\"100%\" filter=\"url(#f)\" />`\n } else if (papel.textura === 'fibra') {\n defs = `\n <filter id=\"f\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\n <feTurbulence type=\"fractalNoise\" baseFrequency=\"0.035 0.09\" numOctaves=\"3\" seed=\"4\" />\n <feColorMatrix values=\"${matriz(tinta, 0.55 * k, -0.2)}\" />\n </filter>\n <filter id=\"g\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\n <feTurbulence type=\"fractalNoise\" baseFrequency=\"0.85\" numOctaves=\"2\" seed=\"11\" stitchTiles=\"stitch\" />\n <feColorMatrix values=\"${matriz(tinta, 1.1 * k, -0.45)}\" />\n </filter>\n `\n corpo = `\n <rect width=\"100%\" height=\"100%\" filter=\"url(#f)\" opacity=\"0.6\" />\n <rect width=\"100%\" height=\"100%\" filter=\"url(#g)\" />\n `\n } else if (papel.textura === 'pauta') {\n const linha = style.pb ? '#bdbdbd' : '#b7cbe0'\n const passo = n3(7 * 3.7795)\n defs = `\n <pattern id=\"p\" width=\"10\" height=\"${passo}\" patternUnits=\"userSpaceOnUse\" y=\"${n3(16 * 3.7795)}\">\n <line x1=\"0\" x2=\"10\" y1=\"${n3(7 * 3.7795 - 0.5)}\" y2=\"${n3(7 * 3.7795 - 0.5)}\" stroke=\"${linha}\" stroke-width=\"0.9\" />\n </pattern>\n `\n corpo = `\n <g opacity=\"${Math.min(1, 0.4 + k)}\">\n <rect width=\"100%\" height=\"100%\" fill=\"url(#p)\" />\n </g>\n `\n } else if (papel.textura === 'milimetrado') {\n const mm = 3.7795\n const cm = 37.795\n const mmStr = n3(mm)\n const cmStr = n3(cm)\n const op1 = n3(0.09 * k)\n const op2 = n3(0.22 * k)\n const linha = style.cor.linha\n defs = `\n <pattern id=\"mm\" width=\"${mmStr}\" height=\"${mmStr}\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M ${mmStr} 0 L 0 0 0 ${mmStr}\" fill=\"none\" stroke=\"${linha}\" stroke-opacity=\"${op1}\" stroke-width=\"0.5\" />\n </pattern>\n <pattern id=\"cm\" width=\"${cmStr}\" height=\"${cmStr}\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M ${cmStr} 0 L 0 0 0 ${cmStr}\" fill=\"none\" stroke=\"${linha}\" stroke-opacity=\"${op2}\" stroke-width=\"0.8\" />\n </pattern>\n `\n corpo = `\n <rect width=\"100%\" height=\"100%\" fill=\"url(#mm)\" />\n <rect width=\"100%\" height=\"100%\" fill=\"url(#cm)\" />\n `\n } else {\n return undefined\n }\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\"><defs>${defs}</defs>${corpo}</svg>`\n const cleanSvg = svg.replace(/>\\s+</g, '><').trim()\n return `url('data:image/svg+xml;utf8,${encodeURIComponent(cleanSvg)}')`\n}\n\n\n// UI themes derived from the book styles of print-presets.ts. One function,\n// `printStyleToTheme`, maps a PrintStyle onto a ThemeConfig: the paper and ink\n// become the surfaces and text of the style's native mode (light for paper\n// styles, dark for dark-paper styles), the first legible chromatic accent\n// becomes the brand, the proof-state colours become the semantic tones, the\n// display, body and mono families become the font roles, and the corner\n// radius, panel and chart treatment choose radius, glass, call to action and\n// elevation. The other mode is generated from the same hues. Every exact\n// colour is kept as a pin only while the generator's WCAG 2.2 AA pairs hold;\n// a pin that fails is dropped and the role is regenerated (and nudged) from\n// the style's hue, so identity is kept wherever contrast allows.\n\nimport { contrastRatio, deltaE2000, luminance, oklchToRgb, parseColor, rgbToOklch, toCss } from './color.ts'\nimport { PRINT_THEME_PREFIX } from './print-aliases.ts'\nimport { googleFontsUrl, printPresets, type PrintPresetName, type PrintStyle } from './print-presets.ts'\nimport {\n DEFAULT_CHART_HUES,\n parseFontStack,\n resolveTheme,\n type Mode,\n type RoleName,\n type Seed,\n type SeedName,\n type ThemeConfig,\n} from './theme.ts'\n\n\n/** Chroma under which a colour counts as grey (ink, paper, rules). */\nconst CHROMATIC = 0.05\n/** One millimetre of the print radius in CSS pixels (96 dpi). */\nconst MM = 96 / 25.4\n\nconst oklch = (c: string) => rgbToOklch(parseColor(c))\nconst chromatic = (c: string) => oklch(c).c >= CHROMATIC\nconst ratio = (a: string, b: string) => contrastRatio(parseColor(a), parseColor(b))\nconst shiftL = (c: string, dl: number, chromaScale = 1, alpha = 1): string => {\n const v = oklch(c)\n return toCss(oklchToRgb({ l: Math.min(0.998, Math.max(0.02, v.l + dl)), c: v.c * chromaScale, h: v.h }, alpha))\n}\nconst seedOf = (c: string, fallback?: Seed): Seed => {\n const v = oklch(c)\n if (fallback && v.c < CHROMATIC) return fallback\n return { hue: Math.round(v.h * 10) / 10, chroma: Math.round(v.c * 1000) / 1000 }\n}\nconst hueGap = (a: number, b: number) => {\n const d = Math.abs(a - b) % 360\n return d > 180 ? 360 - d : d\n}\n\n/** Default semantic seeds, used where a style's proof colour is grey. */\nconst TONE_FALLBACK: Record<'danger' | 'warning' | 'success' | 'info', Seed> = {\n danger: { hue: 18, chroma: 0.19 },\n warning: { hue: 70, chroma: 0.14 },\n success: { hue: 150, chroma: 0.14 },\n info: { hue: 255, chroma: 0.06 },\n}\n\n/** Per-style adjustments where the derivation misjudges; merged over the derived config. */\nexport interface PrintThemeOverride {\n /** Brand colour to use instead of the derived one. */\n brand?: string\n glass?: boolean\n cta?: ThemeConfig['cta']\n elevation?: ThemeConfig['elevation']\n /** Radius in px. */\n radius?: number\n /** Extra pins per mode (applied before the contrast check, dropped if they fail like any pin). */\n pins?: ThemeConfig['pins']\n}\n\n/**\n * Where the derivation reads a style differently from its tradition. Kept\n * short on purpose: every entry is a judgement the data cannot express.\n */\nexport const PRINT_THEME_OVERRIDES: Partial<Record<PrintPresetName, PrintThemeOverride>> = {}\n\n/** The colour moved along OKLCH lightness (hue and chroma kept) until it reaches `min` against `over`. */\nexport function legibleOn(colour: string, over: string, min = 4.6): string {\n const v = oklch(colour)\n const step = luminance(parseColor(over)) > 0.2 ? -0.005 : 0.005\n let out = colour\n for (let i = 0; i < 200 && ratio(out, over) < min; i++) {\n v.l = Math.min(0.995, Math.max(0.02, v.l + step))\n out = toCss(oklchToRgb(v))\n }\n return out\n}\n\n/**\n * The accent that represents a style, before any legibility adjustment: the\n * first chromatic accent that nearly reads on the paper (3:1), else the most\n * legible chromatic accent, else the first chromatic ornament, else the ink\n * (or, on dark paper, the paper itself).\n */\nexport function printStyleAccent(style: PrintStyle): string {\n const c = style.cor\n const darkPaper = luminance(parseColor(c.papel)) < 0.2\n const accents = [c.destaque, c.destaque2].filter(chromatic)\n const near = accents.find((x) => ratio(x, c.papel) >= 3)\n if (near) return near\n if (accents.length) return [...accents].sort((a, b) => ratio(b, c.papel) - ratio(a, c.papel))[0]!\n const ornament = (c.ornamento ?? []).find(chromatic)\n if (ornament) return ornament\n return darkPaper ? c.papel : c.tinta\n}\n\nfunction chartHues(style: PrintStyle): number[] {\n const c = style.cor\n const sources = [c.destaque, c.destaque2, ...(c.ornamento ?? []), c.prova.refutada, c.prova.sustentada, c.prova['nao-da-para-afirmar'], c.marcaTexto]\n const hues: number[] = []\n for (const s of sources) {\n const v = oklch(s)\n if (v.c < CHROMATIC) continue\n if (hues.every((h) => hueGap(h, v.h) >= 30)) hues.push(Math.round(v.h))\n }\n for (const h of DEFAULT_CHART_HUES) {\n if (hues.length >= 8) break\n if (hues.every((x) => hueGap(x, h) >= 30)) hues.push(h)\n }\n for (const h of DEFAULT_CHART_HUES) if (hues.length < 8 && !hues.includes(h)) hues.push(h)\n return hues.slice(0, 8)\n}\n\n/** Families of a print stack for a UI role; `mono` is kept only when the stack is really monospace. */\nfunction fontsOf(style: PrintStyle): { fonts: NonNullable<ThemeConfig['fonts']>; url?: string } {\n const display = parseFontStack(style.fontes.titulo)\n const body = parseFontStack(style.fontes.corpo)\n const monoStack = parseFontStack(style.fontes.mono)\n const fonts: any = { display, body, serif: display, sans: body }\n if (monoStack.at(-1) === 'monospace') { fonts.mono = monoStack; fonts.mono = monoStack; }\n const used = new Set([display[0], body[0], fonts.mono?.[0]].filter(Boolean))\n const specs = style.googleFonts.filter((g) => used.has(g.split(':')[0]))\n const url = googleFontsUrl({ googleFonts: specs }) ?? undefined\n return { fonts, url }\n}\n\n/**\n * Exact colours of the style's own mode (paper as background, ink as text).\n * Surfaces step lighter than the paper, the sunken well a little darker.\n */\nfunction nativePins(style: PrintStyle, brand: string, glass: boolean, darkPaper: boolean): Partial<Record<RoleName, string>> {\n const c = style.cor\n const paper = c.papel\n const dl = 0\n const surface = shiftL(paper, dl, 1)\n const raised = shiftL(paper, dl, 1)\n const pins: Partial<Record<RoleName, string>> = {\n bg: paper,\n 'surface-solid': surface,\n 'surface-raised-solid': raised,\n surface: glass ? shiftL(paper, dl, 0.7, 0.82) : surface,\n 'surface-raised': glass ? shiftL(paper, dl * 1.8, 0.6, 0.94) : raised,\n 'surface-sunken': shiftL(paper, darkPaper ? -0.04 : -0.03, 1.1),\n secondary: raised,\n ink: c.tinta,\n 'ink-2': c.tinta2,\n 'ink-3': c.tinta3,\n 'on-secondary': c.tinta,\n brand,\n 'focus-ring': brand,\n 'cta-solid': brand,\n 'on-brand': ratio(paper, brand) >= ratio(c.tinta, brand) ? paper : c.tinta,\n 'on-cta': ratio(paper, brand) >= ratio(c.tinta, brand) ? paper : c.tinta,\n }\n // Rules: a pale printed rule is used as is; an ink-weight rule is thinned with alpha.\n const lineRgb = parseColor(c.linha)\n const lineAlpha = (a: number) => toCss({ ...lineRgb, a })\n if (ratio(c.linha, paper) >= 3) {\n pins.line = lineAlpha(0.3)\n pins['line-soft'] = lineAlpha(0.16)\n pins['line-strong'] = lineAlpha(0.55)\n } else {\n pins.line = c.linha\n pins['line-soft'] = lineAlpha(0.6)\n pins['line-strong'] = shiftL(c.linha, darkPaper ? 0.12 : -0.12)\n }\n // The highlighter tint is the soft brand (selected nav item, soft badges) when it reads against the paper.\n if (deltaE2000(parseColor(c.marcaTexto), parseColor(paper)) >= 6) {\n pins['brand-soft'] = c.marcaTexto\n pins['nav-active'] = c.marcaTexto\n }\n for (const [tone, colour] of [\n ['danger', c.prova.refutada],\n ['success', c.prova.sustentada],\n ['warning', c.prova['nao-da-para-afirmar']],\n ] as const) {\n if (chromatic(colour)) pins[tone] = colour\n }\n return pins\n}\n\n/**\n * Exact colours of the other mode, over the generated background: the paper\n * colour becomes the ink, and the accent is tried as the brand as printed (a\n * grey accent, as in one-ink styles, is replaced by the paper colour).\n */\nfunction counterPins(style: PrintStyle, accent: string): Partial<Record<RoleName, string>> {\n const brand = chromatic(accent) ? accent : style.cor.papel\n const pins: Partial<Record<RoleName, string>> = { ink: style.cor.papel, brand, 'focus-ring': brand }\n if (!chromatic(accent)) pins['cta-solid'] = brand\n return pins\n}\n\n/** Resolves both modes and drops every pin that takes part in a failing pair, until all pairs pass. */\nfunction settlePins(config: ThemeConfig): ThemeConfig {\n const pins: Record<Mode, Partial<Record<RoleName, string>>> = { light: { ...config.pins?.light }, dark: { ...config.pins?.dark } }\n for (const mode of ['light', 'dark'] as const) {\n for (let round = 0; round < 12; round++) {\n const failing = resolveTheme({ ...config, pins }, mode).report.filter((r) => !r.pass)\n if (!failing.length) break\n let dropped = false\n // Foreground pins first; a background pin only when its foreground is already generated.\n for (const r of failing) {\n const fg = r.fg as RoleName\n if (fg in pins[mode]) {\n delete pins[mode][fg]\n dropped = true\n }\n }\n if (!dropped) {\n for (const r of failing) {\n for (const layer of r.over) {\n if (layer in pins[mode]) {\n delete pins[mode][layer as RoleName]\n dropped = true\n }\n }\n }\n }\n if (!dropped) break\n }\n }\n return { ...config, pins }\n}\n\n/**\n * The UI theme of a book style, in light and dark. The name is\n * `print-<style name>`; the label is the style's own.\n */\nexport function printStyleToTheme(style: PrintStyle, override?: PrintThemeOverride): ThemeConfig {\n return settlePins(draftPrintTheme(style, override))\n}\n\n/**\n * Exact print colours the derivation had to give up for contrast, per mode\n * (role -> the print colour that was dropped and regenerated).\n */\nexport function printThemeDroppedPins(style: PrintStyle, override?: PrintThemeOverride): Record<Mode, Partial<Record<RoleName, string>>> {\n const draft = draftPrintTheme(style, override)\n const settled = settlePins(draft)\n const out: Record<Mode, Partial<Record<RoleName, string>>> = { light: {}, dark: {} }\n for (const mode of ['light', 'dark'] as const) {\n for (const [role, value] of Object.entries(draft.pins?.[mode] ?? {}) as Array<[RoleName, string]>) {\n if (!(role in (settled.pins?.[mode] ?? {}))) out[mode][role] = value\n }\n }\n return out\n}\n\nfunction draftPrintTheme(style: PrintStyle, override: PrintThemeOverride = PRINT_THEME_OVERRIDES[style.name as PrintPresetName] ?? {}): ThemeConfig {\n const c = style.cor\n const darkPaper = luminance(parseColor(c.papel)) < 0.2\n const accent = override.brand ?? printStyleAccent(style)\n // The brand is text on the paper (links, active states): the accent at a legible lightness.\n const brand = legibleOn(accent, c.papel)\n const e = style.estrutura\n\n // Neutral hue: from the paper, or the ink when the paper is plain white or black.\n const paper = oklch(c.papel)\n const ink = oklch(c.tinta)\n const tinted = paper.c >= ink.c ? paper : ink\n const neutral: Seed = { hue: Math.round(tinted.h * 10) / 10, chroma: Math.min(0.02, Math.round(tinted.c * 1000) / 1000) }\n const brandSeed = seedOf(accent)\n const seeds: Record<SeedName, Seed> = {\n brand: { hue: brandSeed.hue, chroma: Math.max(brandSeed.chroma, 0.01) },\n neutral,\n danger: seedOf(c.prova.refutada, TONE_FALLBACK.danger),\n warning: seedOf(c.prova['nao-da-para-afirmar'], TONE_FALLBACK.warning),\n success: seedOf(c.prova.sustentada, TONE_FALLBACK.success),\n info: TONE_FALLBACK.info,\n }\n\n // Surface treatment: soft (glass, gradient, blurred shadow) only for the card and wash styles.\n const soft = style.grafico === 'aquarela' || (e.painel === 'nenhum' && style.raio > 1)\n const glass = override.glass ?? soft\n const offset = e.tituloEstilo === 'sombra' || e.contornoBarra === true || e.painel === 'dossie'\n const elevation = override.elevation ?? (offset ? 'offset' : soft || e.painel === 'cartao' ? 'soft' : 'flat')\n const { fonts, url } = fontsOf(style)\n\n const native = nativePins(style, brand, glass, darkPaper)\n const counter = counterPins(style, accent)\n const bgTexture = createTextureSvg(style)\n const nativeMode: Mode = darkPaper ? 'dark' : 'light'\n const counterMode: Mode = darkPaper ? 'light' : 'dark'\n\n const config: ThemeConfig = {\n name: `${PRINT_THEME_PREFIX}${style.name}`,\n label: style.label,\n seeds,\n chartHues: chartHues(style),\n radius: override.radius ?? Math.min(16, Math.round(style.raio * MM)),\n contrast: 'default',\n glass,\n cta: override.cta ?? (soft ? 'gradient' : 'solid'),\n elevation,\n fonts,\n ...(url ? { fontsUrl: url } : {}),\n ...(bgTexture ? { strings: { \"bg-image\": bgTexture } } : {}),\n pins: {\n [nativeMode]: { ...native, ...override.pins?.[nativeMode] },\n [counterMode]: { ...counter, ...override.pins?.[counterMode] },\n },\n }\n return config\n}\n\n/** Every book style as a UI theme, in the order of `printPresets`. */\nexport const printThemePresets: readonly ThemeConfig[] = (Object.values(printPresets) as PrintStyle[]).map((s) => printStyleToTheme(s))\n\n/**\n * Legacy: Google Fonts stylesheet URL of the families of each print theme, by\n * theme name. The print theme sheets now declare the bundled fonts\n * (`printThemeFontSpecs`), so ThemeProvider needs no `fonts` map; this stays\n * for hosts that prefer Google's CDN.\n */\nexport const printThemeFontUrls: Readonly<Record<string, string>> = Object.fromEntries(\n printThemePresets.filter((t) => t.fontsUrl).map((t) => [t.name, t.fontsUrl!]),\n)\n\n/**\n * Google Fonts specs of each print theme, by theme name: the families its\n * stacks name, bundled under fonts/ and declared in the theme's sheet.\n */\nexport const printThemeFontSpecs: Readonly<Record<string, readonly string[]>> = Object.fromEntries(\n (Object.values(printPresets) as PrintStyle[]).map((s) => [`${PRINT_THEME_PREFIX}${s.name}`, [...s.googleFonts]]),\n)\n","// Per-script typography (`:lang()` overrides). Tympan serves the humanities and\n// the exact sciences in any language, so the base stacks (IBM Plex / Source\n// Serif with Noto fallbacks) are adapted per writing system:\n// - the script's Noto family is moved to the front (CJK needs the right\n// regional glyph set; Arabic and Indic need their shaping fonts first);\n// - letter-spacing is removed where it breaks joining or reads badly\n// (Arabic, Indic, Thai, CJK) and uppercase eyebrows lose their meaning;\n// - line heights grow for scripts with tall stacks or marks;\n// - line breaking follows the script (CJK strict, Thai by dictionary).\nimport type { VarList } from './stylesheet.ts'\n\ninterface ScriptRule {\n /** BCP 47 language tags matched with :lang(). */\n langs: string[]\n sans: string[]\n serif?: string[]\n /** Line-height multiplier applied to every --ty-font-line-height-* token. */\n leading?: number\n /** Letter-spacing off (tracking tokens set to 0). */\n noTracking?: boolean\n /** Extra declarations for the element itself. */\n text?: string[]\n}\n\nexport const SCRIPT_RULES: ScriptRule[] = [\n { langs: ['ar', 'fa', 'ur', 'ps', 'ckb', 'sd', 'ug'], sans: ['Noto Sans Arabic', 'Noto Naskh Arabic'], serif: ['Noto Naskh Arabic'], leading: 1.2, noTracking: true },\n { langs: ['he', 'yi'], sans: ['Noto Sans Hebrew'], serif: ['Noto Serif Hebrew'], leading: 1.1, noTracking: true },\n { langs: ['hi', 'mr', 'ne', 'sa', 'kok', 'mai'], sans: ['Noto Sans Devanagari'], serif: ['Noto Serif Devanagari'], leading: 1.25, noTracking: true },\n { langs: ['bn', 'as'], sans: ['Noto Sans Bengali'], serif: ['Noto Serif Bengali'], leading: 1.25, noTracking: true },\n { langs: ['ta'], sans: ['Noto Sans Tamil'], serif: ['Noto Serif Tamil'], leading: 1.25, noTracking: true },\n { langs: ['te'], sans: ['Noto Sans Telugu'], leading: 1.25, noTracking: true },\n { langs: ['kn'], sans: ['Noto Sans Kannada'], leading: 1.25, noTracking: true },\n { langs: ['ml'], sans: ['Noto Sans Malayalam'], leading: 1.25, noTracking: true },\n { langs: ['gu'], sans: ['Noto Sans Gujarati'], leading: 1.25, noTracking: true },\n { langs: ['pa'], sans: ['Noto Sans Gurmukhi'], leading: 1.25, noTracking: true },\n { langs: ['si'], sans: ['Noto Sans Sinhala'], leading: 1.25, noTracking: true },\n { langs: ['th'], sans: ['Noto Sans Thai'], serif: ['Noto Serif Thai'], leading: 1.25, noTracking: true, text: ['word-break: normal;', 'line-break: auto;'] },\n { langs: ['lo'], sans: ['Noto Sans Lao'], leading: 1.25, noTracking: true },\n { langs: ['km'], sans: ['Noto Sans Khmer'], leading: 1.25, noTracking: true },\n { langs: ['my'], sans: ['Noto Sans Myanmar'], leading: 1.35, noTracking: true },\n { langs: ['am', 'ti', 'gez'], sans: ['Noto Sans Ethiopic'], serif: ['Noto Serif Ethiopic'], leading: 1.15, noTracking: true },\n { langs: ['hy'], sans: ['Noto Sans Armenian'] },\n { langs: ['ka'], sans: ['Noto Sans Georgian'] },\n { langs: ['ja'], sans: ['Noto Sans JP'], serif: ['Noto Serif JP'], leading: 1.15, noTracking: true, text: ['line-break: strict;', 'word-break: normal;', 'overflow-wrap: anywhere;'] },\n { langs: ['zh', 'zh-Hans', 'zh-CN', 'zh-SG'], sans: ['Noto Sans SC'], serif: ['Noto Serif SC'], leading: 1.15, noTracking: true, text: ['line-break: strict;', 'word-break: normal;', 'overflow-wrap: anywhere;'] },\n { langs: ['zh-Hant', 'zh-TW', 'zh-HK', 'zh-MO'], sans: ['Noto Sans TC'], serif: ['Noto Serif TC'], leading: 1.15, noTracking: true, text: ['line-break: strict;', 'word-break: normal;', 'overflow-wrap: anywhere;'] },\n { langs: ['ko'], sans: ['Noto Sans KR'], serif: ['Noto Serif KR'], leading: 1.15, noTracking: true, text: ['word-break: keep-all;', 'overflow-wrap: anywhere;'] },\n]\n\nconst quote = (family: string) => (/^[\\w-]+$/.test(family) && !/\\s/.test(family) ? family : `\"${family}\"`)\n\nfunction scaledPx(value: string, factor: number): string {\n const m = /^(\\d+(?:\\.\\d+)?)px$/.exec(value.trim())\n if (!m) return value\n // Round up to an even pixel so text keeps sitting on the 4 px rhythm's half-steps.\n return `${Math.ceil((Number(m[1]) * factor) / 2) * 2}px`\n}\n\n/** The `:lang()` blocks, derived from the base token values. */\nexport function scriptRules(base: VarList): string {\n const value = (name: string) => base.find(([n]) => n === name)?.[1] ?? ''\n const sansBase = value('--ty-font-sans')\n const serifBase = value('--ty-font-serif')\n const leadings = base.filter(([n]) => n.startsWith('--ty-font-line-height-'))\n const trackings = base.filter(([n]) => n.startsWith('--ty-font-tracking-'))\n return SCRIPT_RULES.map((r) => {\n const decls: string[] = [`--ty-font-sans: ${r.sans.map(quote).join(', ')}, ${sansBase};`]\n if (r.serif) decls.push(`--ty-font-serif: ${r.serif.map(quote).join(', ')}, ${serifBase};`)\n if (r.leading) for (const [n, v] of leadings) decls.push(`${n}: ${scaledPx(v, r.leading)};`)\n if (r.noTracking) for (const [n] of trackings) decls.push(`${n}: 0em;`)\n decls.push(...(r.text ?? []))\n const selectors = r.langs.map((l) => `:lang(${l})`).join(',\\n')\n return `${selectors} {\\n${decls.map((d) => ` ${d}`).join('\\n')}\\n}`\n }).join('\\n\\n')\n}\n","// Assembles the token stylesheet: selector strategy for themes, modes and\n// densities, plus the user-preference media blocks. Used by the static build\n// (fed by Style Dictionary output) and by the live theme customizer (fed\n// directly by the generator); both produce the same text for the same input.\n\nimport { presets as builtInPresets, DEFAULT_THEME } from './presets.ts'\nimport { printThemePresets } from './print-themes.ts'\nimport { scriptRules } from './scripts.ts'\nimport { DENSITIES, densityVariables, resolveTheme, themeVariables, type Density, type ThemeConfig } from './theme.ts'\n\nexport type VarList = Array<[string, string]>\n\nexport interface ThemeVars {\n name: string\n light: VarList\n dark: VarList\n /** Values used under `prefers-contrast: more` (omitted for themes that are already high contrast). */\n highLight?: VarList\n highDark?: VarList\n}\n\nexport interface StylesheetInput {\n /** Theme-independent tokens (space, type, motion, z, layout). */\n base?: VarList\n themes: ThemeVars[]\n /** Theme applied to `:root` without attributes. `null` scopes every theme to its attribute. */\n defaultTheme?: string | null\n densities?: Partial<Record<Density, VarList>>\n /**\n * Component tokens that reference theme roles through var(). Declared on\n * every theme and mode scope so a nested theme re-resolves them.\n */\n components?: VarList\n /** Extra component rules emitted after the component tokens (e.g. the flow tone mapping). */\n componentRules?: string\n /** Cascade layer; `null` for none. */\n layer?: string | null\n banner?: string\n /**\n * Emit the user-preference blocks (reduced motion and transparency,\n * forced colours). Default true; add-on theme sheets loaded after the main\n * token sheet set it to false because those blocks already apply to every theme.\n */\n preferences?: boolean\n}\n\nconst indent = (s: string, n = 2) =>\n s\n .split('\\n')\n .map((l) => (l ? ' '.repeat(n) + l : l))\n .join('\\n')\nconst decls = (vars: VarList, extra: string[] = []) => [...extra, ...vars.map(([n, v]) => `${n}: ${v};`)].join('\\n')\nconst rule = (selectors: string[], body: string) => `${selectors.join(',\\n')} {\\n${indent(body)}\\n}`\nconst media = (query: string, body: string) => `@media ${query} {\\n${indent(body)}\\n}`\n\n/**\n * Selectors for one theme. The attributes may sit on the same element or on\n * an ancestor: `data-ty-theme` picks the theme, `data-ty-mode` forces light or\n * dark (absent or `system` follows `prefers-color-scheme`).\n */\nexport function themeSelectors(name: string, isDefault: boolean) {\n const t = `[data-ty-theme=\"${name}\"]`\n return {\n light: isDefault ? [':root', t, '[data-ty-mode=\"light\"]'] : [t, `${t} [data-ty-mode=\"light\"]`],\n systemDark: isDefault\n ? [':root:not([data-ty-mode=\"light\"])', `${t}:not([data-ty-mode=\"light\"])`]\n : [`${t}:not([data-ty-mode=\"light\"])`],\n dark: isDefault\n ? ['[data-ty-mode=\"dark\"]', `${t}[data-ty-mode=\"dark\"]`, `${t} [data-ty-mode=\"dark\"]`, `[data-ty-mode=\"dark\"] ${t}`]\n : [`${t}[data-ty-mode=\"dark\"]`, `${t} [data-ty-mode=\"dark\"]`, `[data-ty-mode=\"dark\"] ${t}`],\n explicitLight: [`${t}[data-ty-mode=\"light\"]`, `[data-ty-mode=\"dark\"] ${t}[data-ty-mode=\"light\"]`],\n }\n}\n\nfunction themeBlocks(theme: ThemeVars, isDefault: boolean, light: VarList, dark: VarList): string[] {\n const s = themeSelectors(theme.name, isDefault)\n return [\n rule(s.light, decls(light, ['color-scheme: light;'])),\n media('(prefers-color-scheme: dark)', rule(s.systemDark, decls(dark, ['color-scheme: dark;']))),\n rule(s.dark, decls(dark, ['color-scheme: dark;'])),\n rule(s.explicitLight, decls(light, ['color-scheme: light;'])),\n ]\n}\n\nconst ANY_SCOPE = [':root', '[data-ty-theme]', '[data-ty-mode]']\n\n/** Forced colours: roles map to system colours so boundaries and state stay visible. */\nexport const FORCED_COLORS_VARS: VarList = [\n ['--ty-bg', 'Canvas'],\n ['--ty-surface', 'Canvas'],\n ['--ty-surface-raised', 'Canvas'],\n ['--ty-surface-sunken', 'Canvas'],\n ['--ty-surface-solid', 'Canvas'],\n ['--ty-surface-raised-solid', 'Canvas'],\n ['--ty-secondary', 'ButtonFace'],\n ['--ty-on-secondary', 'ButtonText'],\n ['--ty-ink', 'CanvasText'],\n ['--ty-ink-2', 'CanvasText'],\n ['--ty-ink-3', 'CanvasText'],\n ['--ty-line', 'CanvasText'],\n ['--ty-line-soft', 'CanvasText'],\n ['--ty-line-strong', 'CanvasText'],\n ['--ty-input', 'CanvasText'],\n ['--ty-focus-ring', 'Highlight'],\n ['--ty-brand', 'Highlight'],\n ['--ty-accent', 'Highlight'],\n ['--ty-on-brand', 'HighlightText'],\n ['--ty-accent-ink', 'HighlightText'],\n ['--ty-brand-soft', 'Canvas'],\n ['--ty-accent-soft', 'Canvas'],\n ['--ty-on-brand-soft', 'LinkText'],\n ['--ty-on-accent-soft', 'LinkText'],\n ['--ty-cta', 'ButtonFace'],\n ['--ty-cta-solid', 'ButtonFace'],\n ['--ty-on-cta', 'ButtonText'],\n ['--ty-backdrop', 'transparent'],\n ['--ty-shadow-sheet', 'none'],\n ['--ty-shadow-raised', 'none'],\n ['--ty-shadow-floating', 'none'],\n ['--ty-shadow-modal', 'none'],\n ['--ty-glass-blur-sheet', '0px'],\n ['--ty-glass-blur-floating', '0px'],\n ['--ty-glass-edge', 'CanvasText'],\n ['--ty-glass-fill', 'Canvas'],\n ['--ty-glass-fill-raised', 'Canvas'],\n]\n\n/** Reduced transparency (and no backdrop-filter support): opaque surfaces, no blur, no ambient. */\nexport const OPAQUE_VARS: VarList = [\n ['--ty-surface', 'var(--ty-surface-solid) !important'],\n ['--ty-surface-raised', 'var(--ty-surface-raised-solid) !important'],\n ['--ty-secondary', 'var(--ty-surface-raised-solid) !important'],\n ['--ty-glass-blur-sheet', '0px !important'],\n ['--ty-glass-blur-floating', '0px !important'],\n ['--ty-glass-saturate', '1 !important'],\n ['--ty-glass-fill', 'var(--ty-surface-solid) !important'],\n ['--ty-glass-fill-raised', 'var(--ty-surface-raised-solid) !important'],\n ['--ty-ambient-1', 'transparent !important'],\n ['--ty-ambient-2', 'transparent !important'],\n]\n\nexport function buildStylesheet(input: StylesheetInput): string {\n const parts: string[] = []\n const defaultTheme = input.defaultTheme === undefined ? DEFAULT_THEME : input.defaultTheme\n if (input.base?.length) {\n parts.push(rule([':root'], decls(input.base)))\n parts.push(`/* per-script typography (:lang) */\\n${scriptRules(input.base)}`)\n // Reading direction as a number, for inline-axis translations that must mirror in RTL.\n parts.push(`:root,\\n[dir=\"ltr\"] {\\n --ty-inline-sign: 1;\\n}\\n\\n[dir=\"rtl\"] {\\n --ty-inline-sign: -1;\\n}`)\n }\n\n const densities = input.densities ?? {}\n if (densities.default) parts.push(rule([':root', '[data-ty-density=\"default\"]'], decls(densities.default)))\n for (const d of ['compact', 'comfortable'] as const) {\n const v = densities[d]\n if (v) parts.push(rule([`[data-ty-density=\"${d}\"]`], decls(v)))\n }\n\n if (input.components?.length) {\n parts.push(`/* component tokens */\\n${rule(ANY_SCOPE, decls(input.components))}`)\n }\n if (input.componentRules) parts.push(input.componentRules)\n\n for (const theme of input.themes) {\n parts.push(`/* theme: ${theme.name} */`)\n parts.push(...themeBlocks(theme, theme.name === defaultTheme, theme.light, theme.dark))\n }\n\n const high = input.themes.filter((t) => t.highLight && t.highDark)\n if (high.length) {\n const inner = high.flatMap((t) => themeBlocks(t, t.name === defaultTheme, t.highLight!, t.highDark!))\n parts.push(`/* prefers-contrast: more -> the high-contrast variant of each theme */\\n${media('(prefers-contrast: more)', inner.join('\\n\\n'))}`)\n }\n\n if (input.preferences !== false) {\n const durations = (input.base ?? []).filter(([n]) => n.startsWith('--ty-dur-')).map(([n]) => [n, '0ms'] as [string, string])\n if (durations.length) parts.push(media('(prefers-reduced-motion: reduce)', rule(ANY_SCOPE, decls(durations))))\n parts.push(media('(prefers-reduced-transparency: reduce)', rule(ANY_SCOPE, decls(OPAQUE_VARS))))\n parts.push(`@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\\n${indent(rule(ANY_SCOPE, decls(OPAQUE_VARS)))}\\n}`)\n parts.push(media('(forced-colors: active)', rule(ANY_SCOPE, decls(FORCED_COLORS_VARS))))\n }\n\n const body = parts.join('\\n\\n')\n const layered = input.layer === null ? body : `@layer ${input.layer ?? 'tympan.tokens'} {\\n${indent(body)}\\n}`\n return `${input.banner ? `${input.banner}\\n` : ''}${layered}\\n`\n}\n\n/** Generator output for one theme config, as variable lists. */\nexport function themeVarsFor(config: ThemeConfig): ThemeVars {\n const vars: ThemeVars = {\n name: config.name,\n light: themeVariables(resolveTheme(config, 'light')),\n dark: themeVariables(resolveTheme(config, 'dark')),\n }\n if (config.contrast !== 'high') {\n vars.highLight = themeVariables(resolveTheme(config, 'light', 'high'))\n vars.highDark = themeVariables(resolveTheme(config, 'dark', 'high'))\n }\n return vars\n}\n\nexport interface ThemeCssOptions {\n /** Make this theme the `:root` default (for a standalone stylesheet). */\n asDefault?: boolean\n /** Include the density blocks. */\n densities?: boolean\n layer?: string | null\n}\n\n/** CSS for one theme config, straight from the generator (used by the customizer). */\nexport function generateThemeCss(config: ThemeConfig, options: ThemeCssOptions = {}): string {\n return buildStylesheet({\n themes: [themeVarsFor(config)],\n defaultTheme: options.asDefault ? config.name : null,\n densities: options.densities\n ? { default: densityVariables('default'), compact: densityVariables('compact'), comfortable: densityVariables('comfortable') }\n : undefined,\n layer: options.layer === undefined ? 'tympan.tokens' : options.layer,\n })\n}\n\n/** Variable lists of every built-in preset. */\nexport function presetThemeVars(list: readonly ThemeConfig[] = builtInPresets): ThemeVars[] {\n return list.map(themeVarsFor)\n}\n\n/**\n * The opt-in stylesheet of the print themes (`print-themes.css`): every\n * listed theme scoped to its `data-ty-theme` attribute, with its high-contrast\n * variant, and no user-preference blocks (the main token sheet has them).\n * Load it after `tokens.css`.\n */\nexport function generatePrintThemesCss(list: readonly ThemeConfig[] = printThemePresets, options: { layer?: string | null; banner?: string; themes?: ThemeVars[] } = {}): string {\n return buildStylesheet({\n themes: options.themes ?? list.map(themeVarsFor),\n defaultTheme: null,\n layer: options.layer === undefined ? 'tympan.tokens' : options.layer,\n preferences: false,\n banner: options.banner,\n })\n}\n\nexport { DENSITIES }\n","// Canvas tokens (--ty-flow-*) for the flow canvas (@datatechsolutions/tympan/flow): kind tones, connectors,\n// node frame and state rings, the canvas plane, provenance band and research\n// step sizes, and data shape colours.\n//\n// Colour tokens are references to theme roles, emitted as `var(--ty-role)` so\n// every theme, mode, contrast level and forced-colours mapping follows without\n// a per-theme copy. In DTCG they are aliases (`{color.accent}`,\n// `{dimension.radius-card}`); a soft tint carries its mix in\n// `$extensions[\"br.com.datatechsolutions.tympan\"].mix`. Sizes are plain px dimensions (the\n// provenance layout reads them at mount). No gradients: the design direction\n// reserves the gradient for the primary button.\n\nexport type FlowToken =\n | { type: 'color'; ref: string; mix?: number }\n | { type: 'dimension'; ref: string }\n | { type: 'dimension'; px: number }\n\nexport const FLOW_TONES = [\n 'categorical-1', 'categorical-2', 'categorical-3', 'categorical-4',\n 'categorical-5', 'categorical-6', 'categorical-7', 'categorical-8', 'neutral',\n] as const\nexport type FlowTone = (typeof FLOW_TONES)[number]\n\n/** Tint strength of a tone's soft variant (badge background). */\nconst SOFT_MIX = 14\n\nconst color = (ref: string, mix?: number): FlowToken => (mix === undefined ? { type: 'color', ref } : { type: 'color', ref, mix })\nconst px = (value: number): FlowToken => ({ type: 'dimension', px: value })\n\nfunction toneTokens(): Array<[string, FlowToken]> {\n const out: Array<[string, FlowToken]> = []\n const cats = FLOW_TONES.filter((t) => t !== 'neutral')\n // Full strength (bubble fill, port, overview map), ink on it, soft tint and text in the tone.\n for (const t of cats) out.push([`tone-${t}`, color(t)])\n out.push(['tone-neutral', color('ink-3')])\n for (const t of cats) out.push([`tone-${t}-ink`, color('on-accent')])\n out.push(['tone-neutral-ink', color('surface-solid')])\n for (const t of cats) out.push([`tone-${t}-soft`, color(t, SOFT_MIX)])\n out.push(['tone-neutral-soft', color('surface-sunken')])\n for (const t of cats) out.push([`tone-${t}-text`, color(t)])\n out.push(['tone-neutral-text', color('ink-2')])\n return out\n}\n\n/** Every canvas token, in stylesheet order (name without the `--ty-flow-` prefix). */\nexport const FLOW_TOKENS: ReadonlyArray<readonly [string, FlowToken]> = [\n ...toneTokens(),\n // Connectors. Rest uses the >=3:1 boundary role (WCAG 1.4.11), not line-strong.\n // State colours: traversed success, active info, blocked warning, pending neutral.\n ['connector', color('input')],\n ['connector-active', color('info')],\n ['connector-true', color('success')],\n ['connector-false', color('danger')],\n ['connector-rule', color('categorical-2')],\n ['connector-traversed', color('success')],\n ['connector-blocked', color('warning')],\n ['connector-pending', color('neutral')],\n ['connector-width', px(1.5)],\n ['connector-width-active', px(2.5)],\n // Node frame and state rings. Running is info (cyan), suspended is warning\n // (amber), so \"em execução\" and \"aguardando\" never share a hue.\n ['node-border', color('line-strong')],\n ['node-border-hover', color('input')],\n ['ring-selected', color('accent')],\n ['ring-running', color('info')],\n ['ring-suspended', color('warning')],\n ['ring-succeeded', color('success')],\n ['ring-failed', color('danger')],\n // The \"now\" cursor of run timelines: magenta, off every state hue.\n ['cursor-now', color('cursor-now')],\n ['node-surface', color('surface-raised-solid')],\n ['node-radius', { type: 'dimension', ref: 'radius-card' }],\n // Canvas plane.\n ['plane', color('surface-sunken')],\n ['grid-dot', color('line-strong')],\n ['guide', color('accent')],\n ['marquee', color('accent-soft')],\n // Provenance bands.\n ['band', px(96)],\n ['band-label', px(130)],\n ['node-h', px(72)],\n ['node-w', px(236)],\n // Research steps and the data shapes on their ports (colour always paired with the shape word).\n ['step-w', px(250)],\n ['step-h', px(86)],\n ['col-gap', px(56)],\n ['shape-records', color('accent')],\n ['shape-table', color('categorical-1')],\n ['shape-number', color('warning')],\n ['shape-chart', color('categorical-8')],\n ['shape-decision', color('danger')],\n]\n\nexport const flowCssName = (name: string) => `--ty-flow-${name}`\n\n/** CSS value of one canvas token. */\nexport function flowTokenCss(token: FlowToken): string {\n if ('px' in token) return `${token.px}px`\n const ref = `var(--ty-${token.ref})`\n return token.type === 'color' && token.mix !== undefined ? `color-mix(in oklab, ${ref} ${token.mix}%, transparent)` : ref\n}\n\n/** Ordered `[--ty-flow-name, value]` pairs (the generator's direct serialisation). */\nexport function flowVariables(): Array<[string, string]> {\n return FLOW_TOKENS.map(([name, token]) => [flowCssName(name), flowTokenCss(token)])\n}\n\n/** DTCG tree of the canvas tokens; colour and radius values alias the theme tree. */\nexport function flowToDtcg(): Record<string, unknown> {\n const flow: Record<string, unknown> = {}\n for (const [name, token] of FLOW_TOKENS) {\n const app: Record<string, unknown> = { cssName: flowCssName(name) }\n let $value: unknown\n if ('px' in token) $value = { value: token.px, unit: 'px' }\n else if (token.type === 'color') {\n $value = `{color.${token.ref}}`\n if (token.mix !== undefined) app.mix = { space: 'oklab', amount: token.mix / 100, with: 'transparent' }\n } else $value = `{dimension.${token.ref}}`\n flow[name] = { $type: token.type, $value, $extensions: { 'br.com.datatechsolutions.tympan': app } }\n }\n return {\n $description: 'Canvas tokens for the flow canvas (@datatechsolutions/tympan/flow). Colour values alias theme roles and are emitted as var() references. Generated by @datatechsolutions/tympan-tokens.',\n flow,\n }\n}\n\n/**\n * The `[data-tone]` mapping: a tone name on any element selects its four parts\n * as `--ty-flow-tone`, `-ink`, `-soft` and `-text`.\n */\nexport function flowToneRules(): string {\n return FLOW_TONES.map(\n (t) =>\n `[data-tone=\"${t}\"] {\\n` +\n ['', '-ink', '-soft', '-text'].map((part) => ` --ty-flow-tone${part}: var(--ty-flow-tone-${t}${part});`).join('\\n') +\n '\\n}',\n ).join('\\n\\n')\n}\n","// Bundled web fonts. Tympan ships every family its themes name as woff2\n// files inside this package (packages/tokens/fonts/, fetched once by\n// scripts/fetch-fonts.mjs and committed), declared with @font-face in\n// dist/fonts.css (imported by tokens.css) and in the print theme sheets.\n// The CJK families are the exception: they ship in the optional\n// @datatechsolutions/tympan-fonts-cjk package (see CJK_FONT_FAMILIES).\n// @font-face only downloads a file when text uses that face and falls in its\n// unicode-range, so nothing is fetched from a third party at runtime and an\n// unused script or theme costs nothing.\n//\n// The lists below are the source of truth for what scripts/fetch-fonts.mjs\n// downloads; the specs use the Google Fonts css2 syntax\n// (`Family Name:axes@values`) because that is where the files come from.\n\nimport { SCRIPT_RULES } from './scripts.ts'\n\n/** Base stacks of every preset: Source Serif 4, IBM Plex Sans, IBM Plex Mono. */\nexport const BASE_FONT_SPECS: readonly string[] = [\n 'Source Serif 4:ital,opsz,wght@0,8..60,400;0,8..60,600;0,8..60,700;1,8..60,400;1,8..60,600',\n 'IBM Plex Sans:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600',\n 'IBM Plex Mono:ital,wght@0,400;0,500;0,600;0,700;1,400',\n]\n\nconst NOTO_WEIGHTS = 'wght@400;500;600;700'\n\n/** Noto families named by the base stacks and the per-script `:lang()` rules. */\nexport const SCRIPT_FONT_FAMILIES: readonly string[] = [\n ...new Set([\n 'Noto Sans',\n 'Noto Serif',\n 'Noto Sans Mono',\n 'Noto Naskh Arabic',\n 'Noto Sans Arabic',\n 'Noto Sans Hebrew',\n 'Noto Serif Hebrew',\n 'Noto Sans Devanagari',\n 'Noto Serif Devanagari',\n 'Noto Sans Bengali',\n 'Noto Sans Tamil',\n 'Noto Sans Thai',\n 'Noto Serif Thai',\n 'Noto Sans Ethiopic',\n 'Noto Serif Ethiopic',\n 'Noto Sans Armenian',\n 'Noto Sans Georgian',\n 'Noto Sans JP',\n 'Noto Serif JP',\n 'Noto Sans SC',\n 'Noto Serif SC',\n 'Noto Sans KR',\n 'Noto Serif KR',\n ...SCRIPT_RULES.flatMap((r) => [...r.sans, ...(r.serif ?? [])]),\n ]),\n]\n\nexport const SCRIPT_FONT_SPECS: readonly string[] = SCRIPT_FONT_FAMILIES.map((f) => `${f}:${NOTO_WEIGHTS}`)\n\n/**\n * The CJK Noto families (about 41 MB of woff2). The token stacks and the\n * `:lang()` rules still name them, but their files and @font-face rules live\n * in the optional package @datatechsolutions/tympan-fonts-cjk (activated with\n * `import '@datatechsolutions/tympan-fonts-cjk/fonts.css'`); without it the\n * browser falls back to the system CJK faces.\n */\nexport const CJK_FONT_FAMILIES: readonly string[] = [\n 'Noto Sans JP',\n 'Noto Serif JP',\n 'Noto Sans SC',\n 'Noto Serif SC',\n 'Noto Sans TC',\n 'Noto Serif TC',\n 'Noto Sans KR',\n 'Noto Serif KR',\n]\n\nconst isCjkSpec = (spec: string) => CJK_FONT_FAMILIES.includes(spec.split(':')[0]!)\n\n/** Specs whose faces go into the fonts.css of @datatechsolutions/tympan-fonts-cjk. */\nexport const CJK_FONT_SPECS: readonly string[] = SCRIPT_FONT_SPECS.filter(isCjkSpec)\n\n/** Every spec whose faces go into dist/fonts.css (and so tokens.css): base and non-CJK Noto. */\nexport const CORE_FONT_SPECS: readonly string[] = [...BASE_FONT_SPECS, ...SCRIPT_FONT_SPECS.filter((s) => !isCjkSpec(s))]\n\n/**\n * Family names that are platform faces, generic keywords or legacy aliases\n * kept as fallbacks; they get no @font-face (tests check that every other\n * family a theme names is bundled).\n */\nexport const SYSTEM_FONT_FAMILIES: readonly string[] = [\n 'serif', 'sans-serif', 'monospace', 'cursive', 'fantasy', 'system-ui', 'ui-monospace', 'ui-sans-serif', 'ui-serif',\n '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Segoe Print', 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial',\n 'Georgia', 'Times New Roman', 'Times', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New',\n 'Courier', 'Palatino', 'Palatino Linotype', 'Book Antiqua', 'Garamond', 'Baskerville', 'Didot', 'Futura', 'Gill Sans',\n 'Optima', 'Impact', 'Verdana', 'Tahoma', 'Trebuchet MS', 'Arial Narrow', 'Arial Black', 'Avenir', 'Avenir Next',\n 'American Typewriter', 'Rockwell', 'Copperplate', 'Bodoni 72', 'Hoefler Text', 'Iowan Old Style', 'Charter',\n 'Source Serif Pro',\n]\n\n/** Shape of fonts/manifest.json (written by scripts/fetch-fonts.mjs). */\nexport interface FontManifest {\n families: Record<string, { slug: string; version: string | null; files: number; bytes: number; license: string; licenseFile: string }>\n faces: Record<string, { family: string; style: string; weights: number[]; unicodeRange: string | null; file: string; bytes: number }>\n specs: Record<string, string[]>\n}\n\n/**\n * @font-face rules for the faces of `specs`, with `url(<base><file>)`\n * (`base` is the path from the stylesheet to the fonts/ folder), font-display\n * swap and the unicode-range of each slice. Faces shared by several specs\n * are declared once.\n */\nexport function fontFaceCss(manifest: FontManifest, specs: readonly string[], base: string): string {\n const ids = new Set<string>()\n for (const spec of specs) {\n const faces = manifest.specs[spec]\n if (!faces) throw new Error(`Font spec not bundled (run scripts/fetch-fonts.mjs): ${spec}`)\n for (const id of faces) ids.add(id)\n }\n return [...ids]\n .map((id) => {\n const f = manifest.faces[id]!\n const lo = Math.min(...f.weights)\n const hi = Math.max(...f.weights)\n return [\n '@font-face {',\n ` font-family: '${f.family}';`,\n ` font-style: ${f.style};`,\n ` font-weight: ${lo === hi ? lo : `${lo} ${hi}`};`,\n ' font-display: swap;',\n ` src: url('${base}${f.file}') format('woff2');`,\n ...(f.unicodeRange ? [` unicode-range: ${f.unicodeRange};`] : []),\n '}',\n ].join('\\n')\n })\n .join('\\n')\n}\n","// Book themes: how a publisher or a collection defines its own look for\n// @datatechsolutions/tympan-print without touching tympan's code.\n//\n// A theme inherits a base (one of the 39 presets or another registered theme)\n// and overrides any token of PrintStyleOverrides, plus what belongs to a\n// publisher rather than to a style: its marks (publisher logo, collection\n// seal), the page format and bleed, the running head and folio, and local\n// font files. Register it by id and pass the id to PrintBook as `estilo`.\n//\n// A theme may come from JSON, either in the theme's own shape\n// (`PrintBookThemeJson`) or as a DTCG tree (`printThemeFromDtcg`), so a brand's\n// identity can live in the brand's repository.\n\nimport { fromDtcgColor, type DtcgColor } from './dtcg.ts'\nimport { toHex } from './color.ts'\nimport { SYSTEM_FONT_FAMILIES, fontFaceCss, type FontManifest } from './fonts.ts'\nimport {\n mergePrintStyle,\n printPresetById,\n resolvePrintStyleName,\n type PrintCoresParciais,\n type PrintPagina,\n type PrintStyle,\n type PrintStyleOverrides,\n} from './print-presets.ts'\n\n/** A book theme: an id, a base and overrides. */\nexport interface PrintBookTheme extends PrintStyleOverrides {\n /** Registry id, e.g. 'lakebrasil-editorial'. Use it as PrintBook's `estilo`. */\n id: string\n /** A preset name (or deprecated alias) or the id of another registered theme. */\n base: string\n /** What the theme interprets (shown in galleries). */\n referencia?: string\n}\n\n/** The JSON form of a theme: the same fields, colours as hex strings or DTCG colour objects. */\nexport type PrintBookThemeJson = Omit<PrintBookTheme, 'cor' | 'pb'> & {\n cor?: Record<string, unknown>\n pb?: Record<string, unknown>\n}\n\nconst REGISTRO = new Map<string, PrintBookTheme>()\n\n/** A style with overrides and theme extras applied (same as mergePrintStyle, kept for readability). */\nexport const mergePrintTheme = mergePrintStyle\n\n/** Resolves a theme id or a preset id to a complete PrintStyle (`name` = the theme id). */\nexport function printThemeById(id: string, visitados: string[] = []): PrintStyle {\n const tema = REGISTRO.get(id)\n if (!tema) return printPresetById(id)\n if (visitados.includes(id)) throw new Error(`tympan: book theme cycle ${[...visitados, id].join(' → ')}`)\n const base = printThemeById(tema.base, [...visitados, id])\n const { id: _id, base: _base, referencia, ...over } = tema\n return { ...mergePrintTheme(base, over), name: tema.id, label: tema.label ?? base.label, referencia: referencia ?? `Tema sobre ${base.name}: ${base.referencia}` }\n}\n\n/** True when `id` names a registered theme or a preset. */\nexport function isPrintThemeId(id: string): boolean {\n return REGISTRO.has(id) || resolvePrintStyleName(id) !== undefined\n}\n\nfunction normalizarCores(c: Record<string, unknown> | undefined): PrintCoresParciais | undefined {\n if (!c) return undefined\n const cor = (v: unknown): string => (typeof v === 'string' ? v : toHex(fromDtcgColor(v as DtcgColor)))\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(c)) {\n if ((k === 'prova' || k === 'temas' || k === 'categorias') && v && typeof v === 'object') out[k] = Object.fromEntries(Object.entries(v).map(([e, x]) => [e, cor(x)]))\n else if ((k === 'ornamento' || k === 'categorica' || k === 'divergente') && Array.isArray(v)) out[k] = v.map(cor)\n else out[k] = cor(v)\n }\n return out as PrintCoresParciais\n}\n\n/** Validates and normalises a theme read from JSON (colours may be hex or DTCG colour objects). */\nexport function printThemeFromJson(json: PrintBookThemeJson | string): PrintBookTheme {\n const j = (typeof json === 'string' ? JSON.parse(json) : json) as PrintBookThemeJson\n if (!j || typeof j.id !== 'string' || !/^[a-z0-9][a-z0-9-]*$/.test(j.id)) throw new Error('tympan: a book theme needs an `id` in kebab case')\n if (typeof j.base !== 'string') throw new Error(`tympan: book theme \"${j.id}\" needs a \\`base\\` (a preset or a registered theme)`)\n const { cor, pb, ...rest } = j\n const out: PrintBookTheme = { ...rest }\n const c = normalizarCores(cor)\n if (c) out.cor = c\n const p = normalizarCores(pb)\n if (p) out.pb = p\n return out\n}\n\ntype No = Record<string, unknown>\n\n/** Namespaces read for the theme's meta (id/name, base/extends): tympan's own and the short one brand repos use. */\nconst EXTS = ['br.com.datatechsolutions.tympan', 'dev.tympan.print'] as const\n\n/** Unwraps a DTCG group into plain values: `{ $value }` leaves become their value; `$`-keys are dropped. */\nfunction desembrulhar(n: unknown): unknown {\n if (!n || typeof n !== 'object' || Array.isArray(n)) return n\n const o = n as No\n if ('$value' in o) {\n const v = o.$value\n if (o.$type === 'fontFamily' && Array.isArray(v)) return pilhaDeFontes(v as string[])\n if (o.$type === 'color' && v && typeof v === 'object') return toHex(fromDtcgColor(v as DtcgColor))\n if (o.$type === 'dimension' && v && typeof v === 'object' && 'unit' in (v as No)) return emMm(v as { value: number; unit: string })\n return v\n }\n const out: No = {}\n for (const [k, v] of Object.entries(o)) if (!k.startsWith('$')) out[k] = desembrulhar(v)\n return out\n}\n\nconst GENERICAS = /^(serif|sans-serif|monospace|cursive|fantasy|system-ui|ui-[a-z-]+)$/\nconst pilhaDeFontes = (v: string[]) => v.map((x) => (GENERICAS.test(x) || /^[\"']/.test(x) ? x : `\"${x}\"`)).join(', ')\nconst emMm = (v: { value: number; unit: string }) => (v.unit === 'px' ? (v.value * 25.4) / 96 : v.unit === 'pt' ? (v.value * 25.4) / 72 : v.unit === 'cm' ? v.value * 10 : v.value)\n\n/** Figures from the meta: an object by role, or a phrase such as \"tabular-nums em numero e rotulo\". */\nfunction lerAlgarismos(v: unknown): Record<string, 'tabular' | 'proporcional'> | undefined {\n if (v && typeof v === 'object') return v as Record<string, 'tabular' | 'proporcional'>\n if (typeof v !== 'string') return undefined\n const tipo = /proporc|proportional/.test(v) ? 'proporcional' : /tabular/.test(v) ? 'tabular' : undefined\n if (!tipo) return undefined\n const papeis = ['numero', 'rotulo', 'corpo'].filter((p) => v.includes(p))\n return Object.fromEntries((papeis.length ? papeis : ['numero']).map((p) => [p, tipo]))\n}\n\n/**\n * A theme from a DTCG (2025.10) tree. The tree mirrors PrintStyleOverrides: each group is a field\n * (`label`, `fontes.<role>`, `googleFonts`, `cor.<role>`, `cor.prova.<state>`, `cor.categorica.<n>`,\n * `cor.divergente.<n>`, `traco.largura`, `pb.*`, `estrutura.*`, `texto.*`, `marcas.*`, `pagina.*`, `folio.*`,\n * `fontesLocais`…) and each `{ \"$type\", \"$value\" }` leaf becomes its value (colours as hex or DTCG colour\n * objects, `fontFamily` arrays become CSS stacks, dimensions become mm). The theme's id and base come from\n * the root `$extensions[\"dev.tympan.print\"]` (or `[\"br.com.datatechsolutions.tympan\"]`) as `name`/`id` and\n * `extends`/`base`.\n */\nexport function printThemeFromDtcg(tree: No | string): PrintBookTheme {\n const t = (typeof tree === 'string' ? JSON.parse(tree) : tree) as No\n const exts = (t.$extensions ?? {}) as No\n const meta = Object.assign({}, ...EXTS.map((e) => exts[e] as No | undefined).filter(Boolean).map((m) => ({ ...(m!.tema as No | undefined), ...m }))) as No\n const id = (meta.id ?? meta.name) as string | undefined\n const base = (meta.base ?? meta.extends) as string | undefined\n if (!id || !base) throw new Error(`tympan: a DTCG book theme needs $extensions[\"dev.tympan.print\"] with name and extends`)\n const corpo = desembrulhar(t) as No\n // Ordered lists written as groups (\"1\", \"2\"… or \"a\", \"b\"…) become arrays.\n const cor = corpo.cor as No | undefined\n for (const g of [cor, corpo.pb as No | undefined])\n if (g) for (const k of ['categorica', 'divergente', 'ornamento']) if (g[k] && typeof g[k] === 'object' && !Array.isArray(g[k])) g[k] = Object.entries(g[k] as No).sort(([a], [b]) => a.localeCompare(b, 'en', { numeric: true })).map(([, v]) => v)\n // Brand-repo extras in the meta: per-role weights, figures and the data palette.\n const texto = { ...(corpo.texto as No | undefined) }\n if (meta.pesos && typeof meta.pesos === 'object') texto.pesos = { ...(meta.pesos as No), ...(texto.pesos as No | undefined) }\n const alg = lerAlgarismos(meta.algarismos)\n if (alg) texto.algarismos = { ...alg, ...(texto.algarismos as No | undefined) }\n if (Object.keys(texto).length) corpo.texto = texto\n const dado = meta.dado as Record<string, string> | undefined\n if (dado) {\n const c = { ...(corpo.cor as No | undefined) }\n if (dado.interesse && c.interesse === undefined) c.interesse = dado.interesse\n if (dado.contexto) c.contexto = dado.contexto\n if (dado.perdeu && dado.ganhou && c.divergente === undefined) c.divergente = [dado.perdeu, dado.ganhou]\n corpo.cor = c\n }\n return printThemeFromJson({ ...corpo, id, base, ...(meta.referencia ? { referencia: meta.referencia as string } : {}) } as PrintBookThemeJson)\n}\n\n/** Registers (or replaces) a theme; accepts the theme object, its JSON or a DTCG tree. Returns the theme. */\nexport function registerPrintTheme(tema: PrintBookTheme | PrintBookThemeJson | No | string): PrintBookTheme {\n const obj = typeof tema === 'string' ? (JSON.parse(tema) as No) : (tema as No)\n const t = obj.$extensions ? printThemeFromDtcg(obj) : printThemeFromJson(obj as PrintBookThemeJson)\n if (resolvePrintStyleName(t.id)) throw new Error(`tympan: book theme id \"${t.id}\" collides with a preset`)\n REGISTRO.set(t.id, t)\n printThemeById(t.id) // fails now on an unknown base or a cycle\n return t\n}\n\n/** Removes a registered theme (tests, hot reload). */\nexport function unregisterPrintTheme(id: string): boolean {\n return REGISTRO.delete(id)\n}\n\n/** Ids of the registered themes, in registration order. */\nexport function registeredPrintThemes(): string[] {\n return [...REGISTRO.keys()]\n}\n\n/** `@font-face` rules for a style's local font files ('' when it has none). */\nexport function fontesLocaisCss(style: Pick<PrintStyle, 'fontesLocais'>): string {\n return (style.fontesLocais ?? [])\n .map(\n (f) =>\n `@font-face { font-family: \"${f.familia.replace(/\"/g, '')}\"; src: url(\"${f.src.replace(/\"/g, '%22')}\") format(\"woff2\"); font-weight: ${f.peso ?? 400}; font-style: ${f.estilo ?? 'normal'}; font-display: block; }`,\n )\n .join('\\n')\n}\n\n/** Trim and bleed of a style (defaults 170 × 240 mm, 3 mm bleed). */\nexport function paginaDoEstilo(style: Pick<PrintStyle, 'pagina'>): Required<PrintPagina> {\n const p = style.pagina ?? {}\n return { largura: p.largura ?? 170, altura: p.altura ?? 240, sangria: p.sangria ?? 3, marcasCorte: p.marcasCorte ?? false }\n}\n\n/** A neutral example theme (registered nowhere by default): a small press over `semanario`, in two inks. */\nexport const TEMA_EXEMPLO_EDITORA: PrintBookTheme = {\n id: 'editora-exemplo',\n base: 'semanario',\n label: 'Editora Exemplo · coleção ensaios',\n fontes: { titulo: '\"Source Serif 4\", Georgia, serif' },\n cor: { destaque: '#1f4e79', destaque2: '#b5562b', marcaTexto: '#e8eef5' },\n pb: { destaque: '#333333', destaque2: '#8a8a8a' },\n texto: { nomesProprios: 'preservar' },\n folio: { folio: 'centro', cabeco: 'externo' },\n pagina: { largura: 160, altura: 230, sangria: 3 },\n}\n\n\n/** Families named in a style's font stacks (quotes removed), in role order, without generic and system faces. */\nexport function familiasDoEstilo(style: Pick<PrintStyle, 'fontes'>): string[] {\n const out: string[] = []\n for (const pilha of Object.values(style.fontes) as string[])\n for (const f of pilha.split(',').map((x) => x.trim().replace(/^[\"']|[\"']$/g, '')))\n if (f && !SYSTEM_FONT_FAMILIES.includes(f) && !out.includes(f)) out.push(f)\n return out\n}\n\n/** Families the style names (first of each stack) that have neither a bundled file nor a theme `fontesLocais`. */\nexport function familiasSemArquivo(style: Pick<PrintStyle, 'fontes' | 'fontesLocais'>, manifest: FontManifest): string[] {\n const proprias = new Set((style.fontesLocais ?? []).map((f) => f.familia))\n const primeiras = (Object.values(style.fontes) as string[]).map((p) => p.split(',')[0]!.trim().replace(/^[\"']|[\"']$/g, ''))\n return [...new Set(primeiras)].filter((f) => !SYSTEM_FONT_FAMILIES.includes(f) && !proprias.has(f) && !manifest.families[f])\n}\n\n/**\n * @font-face rules for a style from the fonts bundled in this package (`fonts/manifest.json`): every face of\n * every family its font stacks name (so a mono or label family outside `googleFonts` is not forgotten), with\n * URLs `<base><file>`, then the theme's own `fontesLocais`, which win for their family.\n */\nexport function fontesEmpacotadasCss(style: Pick<PrintStyle, 'fontes' | 'googleFonts' | 'fontesLocais'>, manifest: FontManifest, base: string): string {\n const proprias = new Set((style.fontesLocais ?? []).map((f) => f.familia))\n const familias = new Set(familiasDoEstilo(style).filter((f) => manifest.families[f] && !proprias.has(f)))\n // Every bundled spec of those families (faces are de-duplicated by fontFaceCss).\n const specs = Object.keys(manifest.specs).filter((s) => familias.has(s.split(':')[0]!))\n return [specs.length ? fontFaceCss(manifest, specs, base) : '', fontesLocaisCss(style)].filter(Boolean).join('\\n')\n}\n","// @datatechsolutions/tympan-tokens: design tokens and the theme generator (FSL-1.1-ALv2).\nexport * from './color.ts'\nexport * from './theme.ts'\nexport * from './presets.ts'\nexport * from './dtcg.ts'\nexport * from './stylesheet.ts'\nexport * from './flow.ts'\nexport * from './print-presets.ts'\nexport * from './print-book-themes.ts'\nexport * from './print-themes.ts'\nexport * from './print-aliases.ts'\nexport * from './fonts.ts'\n\nimport { presets as corePresets } from './presets.ts'\nimport { printThemePresets } from './print-themes.ts'\nimport type { ThemeConfig } from './theme.ts'\n\n// Unified exported themes: UI + Book themes combined\nexport const allThemes: readonly ThemeConfig[] = [...corePresets, ...printThemePresets]\n"],"mappings":"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"}
|