Files
stack/infra/gitea/theme/theme-fhirworx.css
kert 16f3b43974
Some checks failed
CI / skinny-install (aco) (push) Successful in 1m12s
CI / skinny-install (api) (push) Successful in 30s
CI / skinny-install (bcda) (push) Successful in 36s
CI / skinny-install (bib) (push) Successful in 35s
CI / skinny-install (bls) (push) Successful in 27s
CI / skinny-install (ccw) (push) Successful in 32s
CI / skinny-install (cli) (push) Successful in 41s
CI / skinny-install (cms) (push) Successful in 37s
CI / skinny-install (conf) (push) Successful in 38s
CI / skinny-install (opps) (push) Successful in 33s
CI / skinny-install (perf) (push) Successful in 38s
CI / skinny-install (pfs) (push) Successful in 38s
CI / skinny-install (rex) (push) Successful in 34s
Deploy / build-scan-report (push) Failing after 46s
Infra CI / notebooks (push) Failing after 25s
Infra CI / zotero (push) Successful in 12s
Infra CI / docs (push) Failing after 16s
CI / lint-test (push) Failing after 11m2s
Infra CI / mc (push) Successful in 21s
Infra CI / api (push) Successful in 29s
Package Supply Chain / pkg-supply-chain (push) Failing after 41s
feat: full session — mail servers, comment pipeline, PRISMA fetch, email ingest
Mail: Maddy on DO (corwins.media+Resend, fhirworx.io+Postmark),
touchless/stateless/idempotent. Gitea SMTP via env_file. CMS inbox
at cmsupdates@mail.fhirworx.io with IMAP→bib poller.

Bib: regulations.gov v4 client, Federal Register discovery, 164K
comment backfill (running), IMAP email ingest, Zotero sync routing.

PRISMA: altcha PoW solver, CrossRef DOI resolution, 83/129 PDFs.
Zotero: schema parity, ops module, CLI, fail-fast guard.
CI: docs.Dockerfile COPY glob fix (tracks #341).
Infra: Gitea+marimo fhirworx themes, IOM/OIG modules.
2026-04-16 09:04:38 -04:00

607 lines
24 KiB
CSS

/* =============================================================================
Fhirworx — Gitea theme (light variant)
=============================================================================
Structural reference: Gitea v1.25.4 web_src/css/themes/theme-gitea-light.css.
Variable ORDER in :root below mirrors upstream line-for-line so future Gitea
version bumps produce clean 3-way diffs (git merge). Only the VALUES change.
Component overrides (below :root) target selectors that can't be reshaped by
variable values alone (e.g. #navbar dark-surface sweep).
========================================================================== */
@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;600;700;800&family=Source+Serif+4:ital,wght@0,300;0,400;0,600;1,400&family=JetBrains+Mono:wght@400;500;600&display=swap');
gitea-theme-meta-info {
--theme-display-name: "Fhirworx";
}
:root {
/* --- Fhirworx source-of-truth palette ----------------------------------- */
--fw-background: #F7F5F0; /* cream body */
--fw-foreground: #1A1A18; /* near-black body text */
--fw-card: #FFFFFF; /* pure-white surfaces (separates from body) */
--fw-card-hover: #F3F0EA;
--fw-primary: #1C2B3A; /* dark navy; nav + primary button */
--fw-primary-foreground: #F7F5F0;
--fw-secondary: #EDEBE6; /* warm beige subtle bg */
--fw-muted-foreground: #6B6B68;
--fw-border: #B8B3A4; /* warm beige-darker (visible on cream) */
--fw-nav-bg: #1C2B3A;
--fw-nav-text: #F0F4F8;
--fw-nav-hover-bg: #253748;
--fw-nav-active-bg: #2E4359;
--fw-destructive: #C0392B;
--fw-link: #2D5F7F; /* editorial blue link */
--fw-chart-3: #A88B5C;
--fw-chart-5: #C8702A;
/* Font pipeline: Gitea composes
--fonts-regular: var(--fonts-override, var(--fonts-proportional)), ...
in base.css:59. Setting --fonts-override here propagates to every .ui.*
component, tab, button, dropdown, menu — single hook, whole UI. */
--fonts-override: "Source Serif 4", Georgia, serif;
--fonts-monospace: "JetBrains Mono", "Fira Code", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
/* ======================================================================= */
/* BELOW: Gitea variables in upstream order (theme-gitea-light.css). */
/* Any variable present upstream MUST be present here (clean-diff rule). */
/* ======================================================================= */
--is-dark-theme: false;
--color-primary: var(--fw-primary);
--color-primary-contrast: var(--fw-primary-foreground);
--color-primary-dark-1: #172530;
--color-primary-dark-2: #121F28;
--color-primary-dark-3: #0E1920;
--color-primary-dark-4: #0A1418;
--color-primary-dark-5: #060D11;
--color-primary-dark-6: #030609;
--color-primary-dark-7: #010203;
--color-primary-light-1: #2E4A63;
--color-primary-light-2: #3F6683;
--color-primary-light-3: #5684A3;
--color-primary-light-4: #7BA0BC;
--color-primary-light-5: #A5BCCD;
--color-primary-light-6: #D2DDE6;
--color-primary-light-7: #EEF2F6;
--color-primary-alpha-10: #1C2B3A19;
--color-primary-alpha-20: #1C2B3A33;
--color-primary-alpha-30: #1C2B3A4B;
--color-primary-alpha-40: #1C2B3A66;
--color-primary-alpha-50: #1C2B3A80;
--color-primary-alpha-60: #1C2B3A99;
--color-primary-alpha-70: #1C2B3AB3;
--color-primary-alpha-80: #1C2B3ACC;
--color-primary-alpha-90: #1C2B3AE1;
--color-primary-hover: var(--color-primary-light-1);
--color-primary-active: var(--color-primary-dark-1);
/* Secondary drives nearly every 1px border in Gitea (segments, tables,
menus, inputs, dropdowns). Must be distinct from body. */
--color-secondary: var(--fw-border);
--color-secondary-dark-1: #A49F90;
--color-secondary-dark-2: #908B7D;
--color-secondary-dark-3: #7D7869;
--color-secondary-dark-4: #6A6558;
--color-secondary-dark-5: #5A554A;
--color-secondary-dark-6: #49453C;
--color-secondary-dark-7: #3A372F;
--color-secondary-dark-8: #2C2924;
--color-secondary-dark-9: #221F1B;
--color-secondary-dark-10: #181613;
--color-secondary-dark-11: #0F0E0C;
--color-secondary-dark-12: #050504;
--color-secondary-dark-13: #010100;
--color-secondary-light-1: #C7C3B6;
--color-secondary-light-2: #D4D0C4;
--color-secondary-light-3: #E0DCD1;
--color-secondary-light-4: #ECE9E1;
--color-secondary-alpha-10: #B8B3A419;
--color-secondary-alpha-20: #B8B3A433;
--color-secondary-alpha-30: #B8B3A44B;
--color-secondary-alpha-40: #B8B3A466;
--color-secondary-alpha-50: #B8B3A480;
--color-secondary-alpha-60: #B8B3A499;
--color-secondary-alpha-70: #B8B3A4B3;
--color-secondary-alpha-80: #B8B3A4CC;
--color-secondary-alpha-90: #B8B3A4E1;
--color-secondary-button: var(--color-secondary-dark-4);
--color-secondary-hover: var(--color-secondary-dark-5);
--color-secondary-active: var(--color-secondary-dark-6);
/* console colors */
--color-console-fg: #F7F5F0;
--color-console-fg-subtle: #BDC4CC;
--color-console-bg: #0F1419;
--color-console-border: #2A323A;
--color-console-hover-bg: #1E2730;
--color-console-active-bg: #2A323A;
--color-console-menu-bg: #1A2028;
--color-console-menu-border: #3A4552;
/* named colors (darkened where upstream hue fails AA on cream) */
--color-red: var(--fw-destructive);
--color-orange: var(--fw-chart-5);
--color-yellow: #D4A017;
--color-olive: #8B9A4C;
--color-green: #247058; /* 5.45:1 on cream (upstream #21ba45 = 2.9:1) */
--color-teal: #3A9A94;
--color-blue: var(--fw-link);
--color-violet: #6B52A3;
--color-purple: #8A4BA8;
--color-pink: #B85890;
--color-brown: var(--fw-chart-3);
--color-black: var(--fw-foreground);
--color-red-light: #D66A5C;
--color-orange-light: #DB8A4C;
--color-yellow-light: #E5C04A;
--color-olive-light: #B3C45C;
--color-green-light: #4EA988;
--color-teal-light: #5FB5AF;
--color-blue-light: #4E82A3;
--color-violet-light: #8974B8;
--color-purple-light: #A26BC0;
--color-pink-light: #CE7AAA;
--color-brown-light: #C0A280;
--color-black-light: #4A4A47;
--color-red-dark-1: #A93024;
--color-orange-dark-1: #B4621F;
--color-yellow-dark-1: #B38712;
--color-olive-dark-1: #6E7A38;
--color-green-dark-1: #1E5E49;
--color-teal-dark-1: #2C7E78;
--color-blue-dark-1: #244B63;
--color-violet-dark-1: #55418A;
--color-purple-dark-1: #6E388A;
--color-pink-dark-1: #963F70;
--color-brown-dark-1: #876F49;
--color-black-dark-1: #26252B;
--color-red-dark-2: #8D2720;
--color-orange-dark-2: #9A5018;
--color-yellow-dark-2: #8F6C0E;
--color-olive-dark-2: #54602A;
--color-green-dark-2: #17483A;
--color-teal-dark-2: #225F5B;
--color-blue-dark-2: #1C3A4E;
--color-violet-dark-2: #42336C;
--color-purple-dark-2: #562B6C;
--color-pink-dark-2: #723057;
--color-brown-dark-2: #6B583A;
--color-black-dark-2: #18181C;
/* ansi (terminal) — leave upstream values, these render on dark console bg */
--color-ansi-black: #1E2327;
--color-ansi-red: #CC4848;
--color-ansi-green: #87AB63;
--color-ansi-yellow: #CC9903;
--color-ansi-blue: #3A8AC6;
--color-ansi-magenta: #D22E8B;
--color-ansi-cyan: #00918A;
--color-ansi-white: var(--color-console-fg-subtle);
--color-ansi-bright-black: #46494D;
--color-ansi-bright-red: #D15A5A;
--color-ansi-bright-green: #93B373;
--color-ansi-bright-yellow: #EAAF03;
--color-ansi-bright-blue: #4E96CC;
--color-ansi-bright-magenta: #D74397;
--color-ansi-bright-cyan: #00B6AD;
--color-ansi-bright-white: var(--color-console-fg);
/* other */
--color-grey: var(--fw-muted-foreground);
--color-grey-light: #8A8A87;
--color-gold: var(--fw-chart-3);
--color-white: #FFFFFF;
/* diff colors — softened for cream body */
--color-diff-added-linenum-bg: #CDEED6;
--color-diff-added-row-bg: #E2F5E8;
--color-diff-added-row-border: #C2E0CB;
--color-diff-added-word-bg: #A8E0B7;
--color-diff-moved-row-bg: #EEF4D8;
--color-diff-moved-row-border: #D4DE93;
--color-diff-removed-linenum-bg: #F5C8C5;
--color-diff-removed-row-bg: #FAE8E8;
--color-diff-removed-row-border: #EBBFBF;
--color-diff-removed-word-bg: #F3B5BC;
--color-diff-inactive: #EEECE7;
--color-error-border: #D48B8B;
--color-error-bg: #F6E5E4;
--color-error-bg-active:#E8ADAD;
--color-error-bg-hover: #F0C8C8;
--color-error-text: #8E2E2E;
--color-success-border: #A3C293;
--color-success-bg: #E8F2DD;
--color-success-text: #264F26;
--color-warning-border: #C9BA9B;
--color-warning-bg: #F8F0DC;
--color-warning-text: #5A3D10;
--color-info-border: #A5BCCD;
--color-info-bg: #E8F0F6;
--color-info-text: var(--color-blue); /* distinct from primary navy */
--color-red-badge: var(--color-red);
--color-red-badge-bg: #C0392B1A;
--color-red-badge-hover-bg: #C0392B4D;
--color-green-badge: var(--color-green);
--color-green-badge-bg: #2470581A;
--color-green-badge-hover-bg:#2470584D;
--color-yellow-badge: var(--color-yellow);
--color-yellow-badge-bg: #D4A0171A;
--color-yellow-badge-hover-bg:#D4A0174D;
--color-orange-badge: var(--color-orange);
--color-orange-badge-bg: #C8702A1A;
--color-orange-badge-hover-bg:#C8702A4D;
--color-git: #F05133;
--color-logo: var(--fw-primary);
/* target-based colors */
--color-body: var(--fw-background);
--color-box-header: var(--fw-secondary);
--color-box-body: var(--fw-card);
--color-box-body-highlight: var(--color-primary-light-7);
--color-text-dark: #0D0D0C;
--color-text: var(--fw-foreground);
--color-text-light: #2E2E2C;
--color-text-light-1: #454542;
--color-text-light-2: #595955;
--color-text-light-3: #6E6E6A;
--color-footer: var(--color-nav-bg);
--color-timeline: var(--fw-border);
--color-input-text: var(--color-text-dark);
--color-input-background: var(--fw-card);
--color-input-toggle-background: var(--fw-border);
--color-input-border: var(--color-secondary);
--color-input-border-hover: var(--color-secondary-dark-2);
/* Striped-table "--color-light": upstream is ~3% black on white; on cream
that's ~1.5% darker = invisible stripe. Opaque light-tan instead. */
--color-light: #EFECE5;
--color-light-mimic-enabled: rgba(0, 0, 0, calc(16 / 255 * 222 / 255 / var(--opacity-disabled)));
--color-light-border: #00001728;
--color-hover: #00001710;
--color-hover-opaque: var(--fw-card-hover);
--color-active: #0000171F;
/* Dropdown/menu panel bg: upstream uses #f8f9fb (off-white). We promote to
pure white so panels over the cream body have a real surface break.
This is THE variable the user's recent "transparent dropdown" bug hit —
if it resolves to `initial`/transparent the panel disappears. */
--color-menu: var(--fw-card);
--color-card: var(--fw-card);
--color-markup-table-row: #00306008;
--color-markup-code-block: #00306010;
--color-markup-code-inline:#00306014;
--color-button: var(--fw-card);
--color-code-bg: var(--fw-card);
--color-shadow: #00001726;
--color-shadow-opaque: var(--fw-border);
--color-secondary-bg: var(--fw-secondary);
--color-expand-button: var(--color-primary-light-6);
--color-placeholder-text: var(--color-text-light-3);
--color-editor-line-highlight: var(--color-primary-light-7);
--color-project-column-bg: var(--color-secondary-light-4);
--color-caret: var(--color-text-dark);
--color-reaction-bg: #0000170A;
--color-reaction-hover-bg: var(--color-primary-light-6);
--color-reaction-active-bg: var(--color-primary-light-5);
--color-tooltip-text: var(--fw-primary-foreground);
--color-tooltip-bg: #111B25F0;
/* NAVBAR — fhirworx signature: dark navy bar over cream body. */
--color-nav-bg: var(--fw-nav-bg);
--color-nav-hover-bg: var(--fw-nav-hover-bg);
--color-nav-text: var(--fw-nav-text);
--color-secondary-nav-bg: var(--color-secondary-light-4);
--color-label-text: var(--fw-foreground);
--color-label-bg: #94908648;
--color-label-hover-bg: #9490869E;
--color-label-active-bg: #949086E6;
--color-accent: var(--fw-primary);
--color-small-accent: var(--color-primary-light-6);
--color-highlight-fg: var(--fw-chart-3);
--color-highlight-bg: #FFF3C4;
--color-overlay-backdrop: #000017C0;
/* Convenience aliases consumed by fhirworx custom templates. */
--color-warning: #7F5E08; /* AA both as bg and fg on cream (5.5:1) */
--color-success: var(--color-green);
--color-info: var(--color-blue);
--color-error: var(--color-red);
--color-primary-foreground: var(--fw-primary-foreground);
accent-color: var(--color-accent);
/* `light only` opts out of Chrome auto-dark, Firefox content-override, and
Safari Reader dark. `only` keyword is critical — plain `light` allows UA
overrides; `light only` forbids them. */
color-scheme: light only;
}
/* ============================================================================
Component polish — rules the variable system cannot express.
============================================================================ */
h1, h2, h3, h4, h5, h6 {
font-family: "Playfair Display", Georgia, serif;
letter-spacing: -0.01em;
}
/* Dark navbar accent line (Gitea nav id is #navbar, not .navbar). */
#navbar {
border-bottom: 3px solid var(--fw-foreground);
}
/* ---------- #navbar dark-surface sweep --------------------------------------
Fhirworx inverts the nav: DARK bar over LIGHT body. Gitea base CSS assumes
nav luminance ≈ body luminance, so any Fomantic class with its own color
rule (.ui.button, .ui.label, .ui.input, .ui.dropdown, .ui.menu .item) leaks
near-black text into the dark bar — invisible. Sweep forces nav-text color
on every interactive descendant. `#navbar` id-specificity (1-1-0) beats
Fomantic's single-class rules (0-1-0) without !important. */
#navbar,
#navbar a,
#navbar button,
#navbar .item,
#navbar .ui.button,
#navbar .ui.label,
#navbar .ui.menu,
#navbar .ui.menu .item,
#navbar .ui.dropdown,
#navbar .ui.dropdown > .text,
#navbar .ui.input,
#navbar #navbar-expand-toggle,
#navbar .navbar-left > *,
#navbar .navbar-right > *,
#navbar .navbar-mobile-right > * {
color: var(--color-nav-text);
}
/* SVG icons in nav: follow currentcolor so the sweep above reaches them. */
#navbar svg,
#navbar svg path,
#navbar svg circle,
#navbar svg rect,
#navbar svg polygon {
fill: currentcolor;
color: currentcolor;
}
/* Hover/active state across all interactive elements in nav */
#navbar a:hover,
#navbar button:hover,
#navbar .ui.button:hover,
#navbar .item:hover,
#navbar .item.active,
#navbar #navbar-expand-toggle:hover {
background: var(--color-nav-hover-bg);
color: var(--fw-primary-foreground);
}
/* Fomantic backgrounds inside #navbar must clear so nav bg shows through. */
#navbar .ui.button,
#navbar .item.button {
background: transparent;
}
/* Dropdown popouts FROM the navbar are floating panels OVER the body; they
should NOT inherit the dark nav palette. Flip to body (cream surface, dark
text). This is the main acute pain point — without these 4 rules the menu
panels render with transparent bg + near-black text = invisible. */
#navbar .ui.dropdown > .menu {
background: var(--color-menu);
color: var(--color-text);
border: 1px solid var(--color-secondary);
}
#navbar .ui.dropdown > .menu .item,
#navbar .ui.dropdown > .menu a.item,
#navbar .ui.dropdown > .menu .header.item {
color: var(--color-text);
background: transparent;
}
#navbar .ui.dropdown > .menu .item:hover,
#navbar .ui.dropdown > .menu .item.selected,
#navbar .ui.dropdown > .menu .item.active {
background: var(--color-hover);
color: var(--color-text);
}
#navbar .ui.dropdown > .menu .item svg,
#navbar .ui.dropdown > .menu .item .svg {
color: var(--color-text);
fill: currentcolor;
}
#navbar .ui.dropdown > .menu .divider {
border-color: var(--color-secondary);
}
/* Notification badge: Gitea sets color:var(--color-nav-bg) on the count span
(navbar.css:111), assuming nav-bg is light enough to read on the primary-
colored badge bg. In fhirworx nav-bg == primary — same color = invisible.
Force badge text to primary-contrast. */
#navbar a.item .notification_count,
#navbar a.item .header-stopwatch-dot {
color: var(--fw-primary-foreground);
background: var(--fw-chart-5); /* orange badge, visible on navy */
border-color: var(--fw-nav-bg);
}
#navbar a.item:hover .notification_count,
#navbar a.item:hover .header-stopwatch-dot {
border-color: var(--fw-nav-hover-bg);
}
/* Navbar search input on dark bg: use a slightly-lifted navy so the input is
visible against the bar, with near-white placeholder. */
#navbar input,
#navbar .ui.input input {
background: var(--fw-nav-hover-bg);
color: var(--fw-nav-text);
border-color: var(--fw-nav-active-bg);
}
#navbar input::placeholder,
#navbar .ui.input input::placeholder {
color: var(--color-console-fg-subtle);
}
/* Footer — same dark-surface inversion as navbar. Footer bg defaults to
var(--color-nav-bg) (= dark navy in fhirworx); without overriding, every
text descendant inherits var(--color-text) (= near-black) → contrast 1.2:1.
Force every text/icon descendant to nav-text, same as the #navbar sweep. */
.page-footer {
border-top: 3px solid var(--fw-foreground);
font-family: var(--fonts-monospace);
font-size: 12px;
color: var(--color-nav-text);
}
.page-footer,
.page-footer a,
.page-footer span,
.page-footer strong,
.page-footer .left-links,
.page-footer .right-links,
.page-footer .flex-text-inline,
.page-footer .ui.dropdown,
.page-footer .item {
color: var(--color-nav-text);
}
.page-footer a:hover {
color: var(--fw-primary-foreground);
}
.page-footer svg,
.page-footer svg path {
fill: currentcolor;
}
.commit-sha, .sha, [class*="sha"],
.branch-name, .tag-name, .file-name, code.ref {
font-family: var(--fonts-monospace);
}
/* Yellow / olive / orange labels + buttons: white on these hues fails WCAG
AA. Use --fw-foreground (near-black). The .ui.ui.ui chain matches
Fomantic's triple-class specificity for state-modified labels. */
.ui.ui.ui.yellow.label,
.ui.ui.ui.olive.label,
.ui.ui.ui.orange.label,
.ui.yellow.button,
.ui.olive.button,
.ui.orange.button,
.ui.yellow.button:hover,
.ui.olive.button:hover,
.ui.orange.button:hover {
color: var(--fw-foreground);
}
/* Basic-green label text must darken for AA on cream (base green is 3.8:1). */
.ui.basic.green.label,
.ui.basic.green.labels .label {
color: var(--color-green-dark-1);
border-color: var(--color-green-dark-1);
}
/* Grey-label hover: Fomantic flips text to var(--color-white) while bg stays
semi-transparent beige → invisible. Preserve label-text on hover. */
a.ui.ui.ui.grey.label:hover,
a.ui.ui.ui.grey.label:focus {
color: var(--color-label-text);
background: var(--color-label-hover-bg);
}
/* PR review-comments-counter uses --color-primary-light-4 (pale navy) bg
with cream text → fails contrast. Use opaque primary instead. */
.review-comments-counter {
background-color: var(--color-primary);
color: var(--color-primary-contrast);
}
/* Card .extra divider uses --color-secondary-light-1 (paler than secondary
on cream = invisible divider). Force visible. */
.ui.card > .extra,
.ui.cards .card > .extra {
border-top-color: var(--color-secondary);
}
/* `.text.small` at 0.75em serif renders poorly; keep system font for it. */
.text.small,
.flex-item-body .text.small {
font-family: var(--fonts-proportional), sans-serif;
}
/* base.css uses `color: var(--color-COLOR) !important` for .text.COLOR
helpers. Several hues fail AA on cream; route them through darker shades.
We must use !important here because base.css line 920-ish does too —
without !important we lose the cascade. */
.text.orange { color: var(--color-orange-dark-2) !important; /* AA: base.css uses !important */ }
.text.yellow { color: #7F5E08 !important; /* AA: base.css uses !important */ }
.text.olive { color: var(--color-olive-dark-2) !important; /* AA: base.css uses !important */ }
.text.teal { color: var(--color-teal-dark-2) !important; /* AA: base.css uses !important */ }
.text.brown { color: var(--color-brown-dark-2) !important; /* AA: base.css uses !important */ }
.text.pink { color: var(--color-pink-dark-1) !important; /* AA: base.css uses !important */ }
.text.gold { color: var(--color-brown-dark-2) !important; /* AA: base.css uses !important */ }
.text.green { color: var(--color-green-dark-1) !important; /* AA: base.css uses !important */ }
/* Flash messages: force readable text on pastel bg tints. */
.ui.positive.message, .ui.success.message { color: var(--color-success-text); }
.ui.negative.message, .ui.error.message { color: var(--color-error-text); }
.ui.warning.message { color: var(--color-warning-text); }
.ui.info.message { color: var(--color-info-text); }
/* Secondary-nav (repo breadcrumb strip) — use !important because Fomantic's
.ui.secondary.menu rule uses it too; matching specificity. */
.secondary-nav {
background: var(--color-secondary-nav-bg) !important; /* beats .ui.secondary.menu !important in Fomantic */
border-bottom: 1px solid var(--color-secondary);
}
/* Link color: base.css sets `a { color: var(--color-primary) }`. In fhirworx
--color-primary = dark navy = same family as --color-text, so links look
identical to prose. Route real hyperlinks through a brighter blue. Exclude
UI atoms (.item/.button/.label/.tab) which carry Fomantic color logic. */
a:not(.item):not(.button):not(.label):not(.tab) {
color: var(--color-blue);
}
a:not(.item):not(.button):not(.label):not(.tab):hover {
color: var(--color-blue-dark-1);
}
a.muted, a.suppressed, a.silenced, .muted-links a {
color: inherit;
}
/* Diff detail yellow count fails AA on cream */
.repository .diff-detail-box .diff-detail-stats strong:nth-of-type(1) {
color: var(--color-yellow-dark-1);
}
/* ============================================================================
Defense against client-side dark mode (Chrome auto-dark, Firefox content-
override). Even with `color-scheme: light only`, some UAs still apply
per-element dark adjustments when prefers-color-scheme:dark. Re-assert.
============================================================================ */
@media (prefers-color-scheme: dark) {
:root {
color-scheme: light only !important; /* beats UA-injected dark scheme */
--color-body: var(--fw-background) !important;
--color-text: var(--fw-foreground) !important;
--color-nav-bg: var(--fw-nav-bg) !important;
--color-nav-text: var(--fw-nav-text) !important;
--color-box-body: var(--fw-card) !important;
--color-card: var(--fw-card) !important;
--color-menu: var(--fw-card) !important;
}
body {
background: var(--fw-background) !important; /* beats UA dark bg */
color: var(--fw-foreground) !important; /* beats UA dark text */
}
#navbar {
background: var(--fw-nav-bg) !important; /* beats UA dark bg */
color: var(--fw-nav-text) !important; /* beats UA dark text */
}
}
@media (forced-colors: active) {
#navbar { border-bottom: 3px solid CanvasText; }
}