Font Inventory Audit

Platform: darmaster  ·  Prepared: 2026-06-15  ·  Scope: all ~98 pages

1. Skin Manager Variable Map

The FONTS tab in the skin manager writes three keys to skin_values.csv (scope = global or per-entity). darx_load_skin() step 8 resolves each key to a real CSS stack and emits the custom properties below.

Serif — body text
CSV keyfont-serif
Sets--font-body + --font-serif
Currentalegreya (Google)
tokens.css defaultalso alegreya → no diff!
Sans-serif — UI text
CSV keyfont-sans
Sets--font-sans
Currentnot set in CSV
tokens.css defaultBahnschrift (system)
Monospace — code & labels
CSV keyfont-mono
Sets--font-mono
Currentjetbrains_mono (Google)
tokens.css defaultSF Mono (system) — different
Display — wordmark only
CSV keyfont-display (text field)
Sets--font-display
CurrentLOCKED — Cinzel Decorative
Self-hosted?Yes — woff2 in css/fonts/

2. Page × Font Source Matrix

For each surface: what CSS declaration actually controls body / mono / sans text, and whether the skin manager can reach it.

Surface Pages Body font source Mono font source Sans font source Skin effective?
DARMASTER cockpit home __darmaster/home.php var(--font-body) var(--font-mono) var(--font-sans) ✓ All 3
DARMASTER section portals __darmaster/01–07/index.php var(--font-body) var(--font-mono) var(--font-sans) ✓ All 3
Entity homepages __darx / __darh / __darm / __darx07–10 / home.php var(--font-body) var(--font-mono) var(--font-sans) ✓ All 3
Entity section portals __darx / __darh / __darm / 01–07 × 8 sites var(--font-body) var(--font-mono) var(--font-sans) ✓ All 3
Skin manager __darmaster/08/skin.php var(--font-body) var(--font-mono) var(--font-sans) ✓ All 3
Widgets / desk / clock __darmaster/10/ × 3 pages var(--font-body) var(--font-mono) var(--font-sans) ✓ All 3
Glossary __darmaster/08/glossary.php var(--font-body) var(--font-mono) var(--font-sans) ✓ All 3
Doc library — body text __darmaster/08/index.php + entity shims × 8 var(--type-sans) → var(--font-sans)
NOT --font-body. Change sans picker, not serif.
var(--type-mono)var(--font-mono) var(--font-sans) ⚠ Partial
Doc library — UI elements webpage_section_generic.css classes (all 8 libs) HARDCODED 'Montserrat' HARDCODED 'DM Mono' HARDCODED 'Montserrat' ✗ None
Doc viewer (TXT) __*/08/txt.php — darx_txt_vwr.php var(--font-body) (viewer only) var(--font-mono) var(--font-sans) ✓ All 3
DARX consumer website __darx/index.php · root index.php · keycard_slide.php var(--f-body) = 'Montserrat'
separate old token system
var(--f-mono) = 'DM Mono' var(--f-display) = 'Bebas Neue' ✗ None

3. CSS Load Order — Doc Library (the main problem surface)

Every __*/08/index.php loads these stylesheets in sequence. Later files WIN the cascade at equal specificity. Annotations show how each affects the font variables.

1 __darmaster/css/base/tokens.css Defines --font-body / --font-sans / --font-mono (defaults). Sets body { font-family: var(--font-body) }.
2 __darmaster/css/base/nav.css Uses var(--font-display), var(--font-mono). Also hardcodes 'Nav Mono' for the section-number glyphs (intentional, not a bug).
3 __darmaster/css/base/portal.css Uses var(--font-body), var(--font-mono). All variable-based, skin works here.
4 <style id="darx-skin-vars"> [step 6] Inline: emits --font-serif: alegreya (the raw CSV key — a string, not a font stack). Has no direct effect on body because body uses --font-body, not --font-serif.
5 <style id="darx-skin-fonts"> [step 8] Inline: resolves keys → real stacks. Emits --font-body / --font-mono / --font-sans. Also emits Google Fonts <link> for selected webfonts.
6 css/darx_tokens.css OLD system. Defines --f-body='Montserrat', --f-mono='DM Mono'. Sets body { font-family: var(--f-body) } — overrides step 1's body rule, but is itself overridden by step 8 below.
7 css/webpage_section_generic.css CRITICAL. 20+ concrete font-family: 'Montserrat' and font-family: 'DM Mono' declarations on UI element classes. These BEAT any var() rule at the same specificity. Skin manager cannot reach these elements.
8 css/theme_section_dark.css Dark palette tokens. No font-family declarations found — neutral.
9 css/type_system.css Defines --type-serif/'Fraunces', --type-sans/'Inter', --type-mono/'IBM Plex Mono'. Sets body { font-family: var(--type-sans) } — wins over all prior body rules. BUT step 10 below re-aliases --type-* back to skin vars.
10 css/webpage_section_browser.css Aliases: --type-serif: var(--font-body) · --type-sans: var(--font-sans) · --type-mono: var(--font-mono). This reconnects the doc library body to skin manager font-sans. Loads AFTER type_system.css so wins.
11 __darmaster/08/skin.css Blueprint skin. Uses var(--type-mono, var(--font-mono)) and var(--font-body) — respects both systems. Self-hosts Cinzel Decorative.
12 __darmaster/08/skin-light.css DARMASTER-only sand variant. No font-family declarations — neutral.

Net result for the doc library body: body { font-family: var(--type-sans) } (step 9) → --type-sans aliased to var(--font-sans) (step 10) → controlled by the Sans-serif picker in the skin manager. Changing Serif — body text has no effect on doc library body text.

4. Hardcoded Fonts in css/webpage_section_generic.css

These declarations are concrete values — no CSS variable can override them from outside the file. They affect every instance of the doc library across all 8 entity sites.

'Montserrat', sans-serif — hardcoded
Line  94 — section header / page title
Line 285 — metadata label class
Line 309 — toolbar action label
Line 336 — filter chip label
Line 480 — breadcrumb / nav label
Line 604 — panel heading
'DM Mono', monospace — hardcoded
Line 177 — document ID / code label
Line 194 — date / timestamp field
Line 218 — status badge
Line 266 — entity code chip
Line 324 — section-number label
Line 352 — dept code field
Line 372 — responsive label (media query)
Line 404 — file-size readout
Line 419 — search result count
Line 491 — list item meta
Line 501 — list item ID
Line 627 — sidebar label (media query)
'Cormorant Garamond', serif — hardcoded
Line 469 — document title / hero heading
css/darx_tokens.css — old variable system
--f-body = 'Montserrat', sans-serif
--f-mono = 'DM Mono', monospace
--f-display = 'Bebas Neue', 'Wide Sans', sans-serif
--f-landing = 'Inter', sans-serif
These vars are NOT --font-* — skin manager cannot change them

5. Root Cause Bugs

1 Doc library body wired to font-sans, not font-serif
Due to the load order (steps 9–10 above), the doc library body font ultimately resolves through var(--type-sans)var(--font-sans). Changing the Serif — body text picker in the skin manager sets --font-body, which the doc library body rule does NOT read. To change doc library body text, use the Sans-serif — UI text picker. Portal and cockpit pages are unaffected — they correctly use var(--font-body).
Portals/cockpit: font-serif → --font-body → body
Doc library: font-serif → --font-body → ignored / body reads --type-sans → --font-sans (= font-sans picker)
2 20+ hardcoded font-family declarations in css/webpage_section_generic.css
css/webpage_section_generic.css contains concrete font-family: 'Montserrat', sans-serif and font-family: 'DM Mono', monospace values on specific class selectors (see section 4 above). These load AFTER the skin step 8 inline style and WIN the cascade at equal specificity. No CSS variable change from the skin manager can override them without either:
(a) Replacing each hardcoded value with var(--font-sans) / var(--font-mono) inside that file, or
(b) Adding a higher-specificity override block that runs last. These classes affect every doc library instance across all 8 entity sites.
webpage_section_generic.css:94 → font-family: 'Montserrat', sans-serif ← concrete, beats var()
Fix: replace with font-family: var(--font-sans)
3 Current serif choice (alegreya) is identical to the tokens.css default — no visible change
skin_values.csv stores global,font-serif,alegreya but tokens.css already defaults --font-body to 'Alegreya', Georgia, serif. Step 8 emits the same stack — no change. Additionally, if Google Fonts is unreachable in the MAMP dev environment, switching between any two Google-Font picks (e.g. Alegreya → Lora) produces identical output because both fall back to Georgia. System-font picks (Georgia, Bahnschrift, Consolas) require no internet and immediately confirm whether the mechanism works.
skin_values.csv: global,font-serif,alegreya
tokens.css :root: --font-body: 'Alegreya', Georgia, serif
Step 8 emits: --font-body: 'Alegreya', Georgia, serif ← same value → zero net change
Test: change font-serif → Georgia (system) → no Google Fonts needed
4 DARX consumer site uses a completely separate token system (--f-* not --font-*)
__darx/index.php and the root index.php load css/darx_tokens.css and css/darx_system.css, which use var(--f-body), var(--f-mono), var(--f-display) — a different variable namespace from the skin manager's --font-* system. The skin manager has zero effect on these pages by design (they are the public-facing consumer brand site, not the internal platform). This is expected behaviour, not a bug — but it is a source of confusion when auditing why font changes appear to have no effect.

6. Fix Guide

Fix 1 — Verify the mechanism works first (5 min)
Go to the skin manager (scope = global, FONTS tab). Change Sans-serif — UI text to Arial (system) — no Google Fonts needed. Click Save. Open a portal page (e.g. /darmaster/__darmaster/01/). Body text and labels should switch to Arial. If they do: the mechanism works and Bug 3 explains why you saw nothing before. If they do not: there is a CSV write-permission issue to investigate first.
Fix 2 — Connect doc library body to font-serif (CSS bridge — minimal change)
In css/webpage_section_browser.css (which already aliases --type-* vars), change the --type-sans alias so the doc library body uses --font-body instead:

--type-serif: var(--font-body); → already correct
--type-sans: var(--font-sans); → change to var(--font-body) if you want serif in doc library body

This is a design call: do you want the doc library body text to be the serif font (as on portals) or the sans font (current, which made sense with Montserrat-era design)?
Fix 3 — Replace hardcoded fonts in webpage_section_generic.css
Each hardcoded declaration listed in section 4 needs to become a CSS variable reference:

font-family: 'Montserrat', sans-seriffont-family: var(--font-sans)
font-family: 'DM Mono', monospacefont-family: var(--font-mono)
font-family: 'Cormorant Garamond', Georgia, seriffont-family: var(--font-body)

After this change, the skin manager's FONTS tab will control all doc library UI elements. The Google Fonts link emitted by step 8 already loads the chosen webfonts for the browser, so no additional loading is needed.
Note on the DARX consumer site (Bug 4): The css/darx_system.css / darx_tokens.css pair is intentionally separate — it is the public brand system predating the internal platform skin manager. If you want the skin manager to control the consumer site too, the variables in darx_tokens.css would need to be aliased to the --font-* system. That is a separate project decision.

7. Summary Table

Surface groupPagesSkin manager controls?Primary issue
Cockpit + portals + entity homepages~60 pages✓ FullBug 3: default selection = no visible change unless Google Fonts loads
Skin manager page itself1 page✓ Full
Widgets / ddesk / clock3 pages✓ Full
Doc library body text~11 pages (8 libs + glossary + fable5 + skin)⚠ font-sans onlyBug 1: body wired to --font-sans not --font-body
Doc library UI elementssame ~11 pages✗ NoneBug 2: hardcoded fonts in webpage_section_generic.css
DARX consumer website~3 pages✗ None by designBug 4: separate --f-* token system

END OF DOCUMENT — DARMASTER_AUDIT_FONT_INVENTORY_20260615.html