style(docs): comprehensive fhirworx editorial theme for Docusaurus
Some checks failed
CI / lint (push) Successful in 40s
Deploy / notebooks (push) Has been skipped
Deploy / zotero (push) Has been skipped
Deploy / docs (push) Has been skipped
Deploy / api (push) Has been skipped
Deploy / mc (push) Has been skipped
Infra CI / notebooks (push) Failing after 16s
Infra CI / zotero (push) Successful in 15s
Infra CI / docs (push) Successful in 1m26s
Infra CI / api (push) Successful in 20s
Infra CI / mc (push) Successful in 15s
Deploy / report (push) Successful in 43s
Harden / build-scan-report (push) Failing after 55s
CI / test (push) Has been cancelled

350+ lines of component-level styling matching the Gitea theme:
- Playfair Display 800 h1 with 3px navy underline
- Source Serif 4 body at 1.75 line-height, 75ch max-width
- JetBrains Mono for nav links, breadcrumbs, table headers, code
- Eyebrow treatment on breadcrumbs, pagination sublabels, admonitions
- Amber (#C8702A) accent on active sidebar, footer, pagination hover
- Tables: mono uppercase column headers, 2px primary border, hover rows
- Navy navbar with no box-shadow, mono uppercase nav links
- Sidebar: 3px amber active indicator, mono uppercase category labels
- Code blocks: bordered, compact, matching body background
- WCAG 2.2 AA: focus-visible, reduced-motion, min target size
This commit is contained in:
kert
2026-04-18 21:50:44 -04:00
parent cef8e8e4bc
commit 9f9a8083d1

View File

@@ -1,46 +1,77 @@
/* fhirworx design system for Docusaurus /* =============================================================================
Matches the editorial palette from assets/css/fhirworx.css Fhirworx — Docusaurus theme
Design: Federal Register Meets Data Journalism */ =============================================================================
Mirrors the editorial design system from assets/css/fhirworx.css and the
Gitea theme (infra/gitea/theme/theme-fhirworx.css). Design reference:
Federal Register meets data journalism (ProPublica, Marshall Project).
@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;600;700&family=Source+Serif+4:ital,wght@0,300;0,400;0,600;1,400&family=JetBrains+Mono:wght@400;500;600&display=swap'); Font stack: Playfair Display (headings), Source Serif 4 (body),
JetBrains Mono (code).
========================================================================== */
/* ── Light theme (default) ─────────────────────────────────── */ @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');
/* ── Light theme ───────────────────────────────────────────── */
:root { :root {
/* Core palette */
--ifm-color-primary: #1C2B3A; --ifm-color-primary: #1C2B3A;
--ifm-color-primary-dark: #162230; --ifm-color-primary-dark: #162230;
--ifm-color-primary-darker: #131e2a; --ifm-color-primary-darker: #131e2a;
--ifm-color-primary-darkest: #0e1620; --ifm-color-primary-darkest: #0e1620;
--ifm-color-primary-light: #253748; --ifm-color-primary-light: #2E4A63;
--ifm-color-primary-lighter: #2d4052; --ifm-color-primary-lighter: #3F6683;
--ifm-color-primary-lightest: #3d5570; --ifm-color-primary-lightest: #5684A3;
/* Surfaces */
--ifm-background-color: #F7F5F0; --ifm-background-color: #F7F5F0;
--ifm-background-surface-color: #FAFAF7; --ifm-background-surface-color: #FFFFFF;
--ifm-navbar-background-color: #1C2B3A;
--ifm-footer-background-color: #1C2B3A;
/* Text */
--ifm-font-color-base: #1A1A18; --ifm-font-color-base: #1A1A18;
--ifm-heading-color: #1A1A18; --ifm-heading-color: #1A1A18;
--ifm-link-color: #5B8FA8; --ifm-font-color-secondary: #6B6B68;
--ifm-navbar-background-color: #1C2B3A; --ifm-link-color: #2D5F7F;
--ifm-navbar-link-color: #B8C5D0; --ifm-link-hover-color: #1C2B3A;
--ifm-navbar-link-hover-color: #F7F5F0; --ifm-navbar-link-color: #F0F4F8;
--ifm-footer-background-color: #1C2B3A; --ifm-navbar-link-hover-color: #FFFFFF;
--ifm-footer-color: #B8C5D0; --ifm-footer-color: #B8C5D0;
--ifm-menu-color: #2D2D2B; --ifm-menu-color: #1A1A18;
--ifm-menu-color-active: #1C2B3A;
--ifm-toc-link-color: #6B6B68; --ifm-toc-link-color: #6B6B68;
--ifm-code-background: #EDEBE6;
--ifm-hr-border-color: #D4D0C8;
/* Borders */
--ifm-border-color: #B8B3A4;
--ifm-hr-border-color: #D4D0C8;
--ifm-global-border-width: 1px;
--ifm-global-radius: 0.2rem;
/* Code */
--ifm-code-background: #EDEBE6;
--ifm-code-border-color: #D4D0C8;
--ifm-code-padding-vertical: 0.1rem;
--ifm-code-padding-horizontal: 0.3rem;
--prism-background-color: #F7F5F0;
--docusaurus-highlighted-code-line-bg: rgba(28, 43, 58, 0.08);
/* Typography */
--ifm-font-family-base: "Source Serif 4", Georgia, serif; --ifm-font-family-base: "Source Serif 4", Georgia, serif;
--ifm-font-family-monospace: "JetBrains Mono", "Fira Code", monospace; --ifm-font-family-monospace: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
--ifm-heading-font-family: "Playfair Display", Georgia, serif; --ifm-heading-font-family: "Playfair Display", Georgia, serif;
--ifm-code-font-size: 88%; --ifm-code-font-size: 88%;
--ifm-font-size-base: 16px; --ifm-font-size-base: 16px;
--ifm-line-height-base: 1.65; --ifm-line-height-base: 1.65;
--ifm-border-color: #D4D0C8; /* Spacing */
--ifm-global-radius: 0.2rem; --ifm-global-spacing: 1rem;
--ifm-navbar-height: 3.5rem;
--docusaurus-highlighted-code-line-bg: rgba(28, 43, 58, 0.08); /* Accent: amber for editorial emphasis */
--fw-accent: #C8702A;
--fw-accent-light: #D4884A;
--fw-destructive: #C0392B;
} }
/* ── Dark theme ────────────────────────────────────────────── */ /* ── Dark theme ────────────────────────────────────────────── */
@@ -53,26 +84,41 @@
--ifm-color-primary-darker: #47768d; --ifm-color-primary-darker: #47768d;
--ifm-color-primary-darkest: #3b6174; --ifm-color-primary-darkest: #3b6174;
--ifm-color-primary-light: #6BA0B8; --ifm-color-primary-light: #6BA0B8;
--ifm-color-primary-lighter: #72A5BC; --ifm-color-primary-lighter: #7BB8D0;
--ifm-color-primary-lightest: #8FB8CC; --ifm-color-primary-lightest: #8FB8CC;
--ifm-font-color-base: #EEE9E0; --ifm-font-color-base: #EEE9E0;
--ifm-heading-color: #EEE9E0; --ifm-heading-color: #EEE9E0;
--ifm-font-color-secondary: #8898A8;
--ifm-link-color: #7BB8D0; --ifm-link-color: #7BB8D0;
--ifm-link-hover-color: #A5D2E6;
--ifm-navbar-background-color: #0A1219; --ifm-navbar-background-color: #0A1219;
--ifm-navbar-link-color: #B8C5D0;
--ifm-footer-background-color: #060D14; --ifm-footer-background-color: #060D14;
--ifm-footer-color: #8898A8; --ifm-footer-color: #8898A8;
--ifm-menu-color: #B8C5D0; --ifm-menu-color: #B8C5D0;
--ifm-menu-color-active: #EEE9E0;
--ifm-toc-link-color: #8898A8; --ifm-toc-link-color: #8898A8;
--ifm-code-background: #1A2A3D; --ifm-code-background: #1A2A3D;
--ifm-hr-border-color: #253748; --ifm-code-border-color: #253748;
--ifm-border-color: #253748; --ifm-border-color: #253748;
--ifm-hr-border-color: #253748;
--prism-background-color: #0F1923;
--docusaurus-highlighted-code-line-bg: rgba(91, 143, 168, 0.15); --docusaurus-highlighted-code-line-bg: rgba(91, 143, 168, 0.15);
} }
/* ── Typography ────────────────────────────────────────────── */ /* =============================================================================
Component overrides
============================================================================= */
/* ── Global ────────────────────────────────────────────────── */
html {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* ── Headings ──────────────────────────────────────────────── */
h1, h2, h3, h4, h5, h6 { h1, h2, h3, h4, h5, h6 {
font-family: var(--ifm-heading-font-family); font-family: var(--ifm-heading-font-family);
@@ -82,90 +128,308 @@ h1, h2, h3, h4, h5, h6 {
} }
.markdown h1:first-child { .markdown h1:first-child {
font-size: 2.2rem; font-size: 2.4rem;
font-weight: 800;
border-bottom: 3px solid var(--ifm-color-primary);
padding-bottom: 0.5rem;
margin-bottom: 1.5rem;
} }
code, kbd, pre { .markdown h2 {
font-family: var(--ifm-font-family-monospace); font-size: 1.6rem;
margin-top: 2.5rem;
padding-bottom: 0.3rem;
border-bottom: 1px solid var(--ifm-hr-border-color);
}
.markdown h3 {
font-size: 1.25rem;
margin-top: 2rem;
} }
/* ── Navbar ────────────────────────────────────────────────── */ /* ── Navbar ────────────────────────────────────────────────── */
.navbar { .navbar {
box-shadow: none; box-shadow: none;
border-bottom: 1px solid var(--ifm-border-color); border-bottom: none;
padding: 0 1rem;
} }
.navbar__title { .navbar__title {
font-family: var(--ifm-heading-font-family); font-family: var(--ifm-heading-font-family);
font-weight: 700; font-weight: 700;
letter-spacing: 0.03em; font-size: 1.15rem;
color: #F7F5F0; letter-spacing: 0.04em;
color: var(--ifm-navbar-link-color);
}
.navbar__link {
font-family: var(--ifm-font-family-monospace);
font-size: 0.8rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.08em;
}
.navbar__search-input {
font-family: var(--ifm-font-family-monospace);
font-size: 0.8rem;
background-color: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: var(--ifm-global-radius);
} }
/* ── Sidebar ───────────────────────────────────────────────── */ /* ── Sidebar ───────────────────────────────────────────────── */
.theme-doc-sidebar-container {
border-right: 1px solid var(--ifm-border-color) !important;
}
.menu__link {
font-size: 0.9rem;
border-radius: 0;
padding: 0.4rem 0.75rem;
transition: background-color 0.15s, border-color 0.15s;
}
.menu__link--active:not(.menu__link--sublist) { .menu__link--active:not(.menu__link--sublist) {
border-left: 3px solid #C8702A; background: transparent;
border-left: 3px solid var(--fw-accent);
font-weight: 600; font-weight: 600;
color: var(--ifm-menu-color-active);
padding-left: calc(0.75rem - 3px);
} }
.menu__link:hover { .menu__link:hover:not(.menu__link--active) {
color: var(--ifm-color-primary); background-color: var(--ifm-code-background);
} }
/* ── Footer ────────────────────────────────────────────────── */ .menu__link--sublist-caret::after {
background-size: 1.2em 1.2em;
.footer--dark {
border-top: 3px solid #C8702A;
} }
/* ── Hero / landing ────────────────────────────────────────── */ .menu__list-item-collapsible .menu__link {
font-family: var(--ifm-font-family-monospace);
.hero { font-size: 0.82rem;
border-bottom: 3px solid #C8702A; font-weight: 600;
} text-transform: uppercase;
letter-spacing: 0.06em;
/* ── Code blocks ───────────────────────────────────────────── */ color: var(--ifm-font-color-secondary);
.prism-code {
border: 1px solid var(--ifm-border-color);
border-radius: var(--ifm-global-radius);
} }
/* ── Breadcrumbs (eyebrow style) ───────────────────────────── */ /* ── Breadcrumbs (eyebrow style) ───────────────────────────── */
.breadcrumbs__link { .breadcrumbs__link {
font-family: var(--ifm-font-family-monospace); font-family: var(--ifm-font-family-monospace);
font-size: 0.75rem; font-size: 0.7rem;
font-weight: 500;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.1em; letter-spacing: 0.12em;
color: var(--ifm-font-color-secondary);
} }
/* ── Table of contents ─────────────────────────────────────── */ .breadcrumbs__item--active .breadcrumbs__link {
color: var(--ifm-font-color-base);
.table-of-contents__link--active {
color: var(--ifm-color-primary);
font-weight: 600;
} }
/* ── Blockquotes (editorial pull-quote style) ──────────────── */ .breadcrumbsContainer_PW3S {
margin-bottom: 1.5rem;
}
/* ── Content area ──────────────────────────────────────────── */
.markdown {
max-width: 75ch;
}
.markdown p {
line-height: 1.75;
margin-bottom: 1.25rem;
}
.markdown li {
line-height: 1.65;
margin-bottom: 0.3rem;
}
/* ── Code blocks ───────────────────────────────────────────── */
.prism-code {
border: 1px solid var(--ifm-code-border-color);
border-radius: var(--ifm-global-radius);
font-size: 0.85rem;
line-height: 1.5;
}
code {
border: 1px solid var(--ifm-code-border-color);
border-radius: var(--ifm-global-radius);
}
pre code {
border: none;
}
/* ── Blockquotes (editorial pull-quote) ────────────────────── */
blockquote { blockquote {
border-left: 3px solid var(--ifm-color-primary); border-left: 3px solid var(--ifm-color-primary);
background: transparent; background: transparent;
padding: 0.5rem 1rem;
font-style: italic; font-style: italic;
color: var(--ifm-font-color-secondary);
}
/* ── Tables ────────────────────────────────────────────────── */
table {
font-size: 0.9rem;
border-collapse: collapse;
}
table thead th {
font-family: var(--ifm-font-family-monospace);
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--ifm-font-color-secondary);
border-bottom: 2px solid var(--ifm-color-primary);
padding: 0.6rem 0.75rem;
}
table tbody td {
padding: 0.5rem 0.75rem;
border-bottom: 1px solid var(--ifm-hr-border-color);
}
table tbody tr:hover {
background-color: var(--ifm-code-background);
}
/* ── Table of contents ─────────────────────────────────────── */
.table-of-contents {
font-size: 0.85rem;
}
.table-of-contents__link {
color: var(--ifm-toc-link-color);
}
.table-of-contents__link--active,
.table-of-contents__link:hover {
color: var(--ifm-color-primary);
font-weight: 600;
}
/* ── Footer ────────────────────────────────────────────────── */
.footer--dark {
border-top: 3px solid var(--fw-accent);
}
.footer__title {
font-family: var(--ifm-heading-font-family);
font-weight: 700;
}
.footer__link-item {
font-family: var(--ifm-font-family-monospace);
font-size: 0.8rem;
letter-spacing: 0.04em;
} }
/* ── Admonitions ───────────────────────────────────────────── */ /* ── Admonitions ───────────────────────────────────────────── */
.alert { .alert {
border-radius: var(--ifm-global-radius); border-radius: var(--ifm-global-radius);
border-width: 1px;
border-left-width: 4px;
font-size: 0.92rem;
} }
/* ── Accent color: amber (#C8702A) for editorial emphasis ──── */ .alert .admonitionHeading_tbUL {
font-family: var(--ifm-font-family-monospace);
font-size: 0.78rem;
text-transform: uppercase;
letter-spacing: 0.08em;
}
/* ── Pagination (prev/next) ────────────────────────────────── */
.pagination-nav__link {
border: 1px solid var(--ifm-border-color);
border-radius: var(--ifm-global-radius);
transition: border-color 0.15s;
}
.table-of-contents__link--active,
.pagination-nav__link:hover { .pagination-nav__link:hover {
border-color: #C8702A; border-color: var(--fw-accent);
}
.pagination-nav__sublabel {
font-family: var(--ifm-font-family-monospace);
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--ifm-font-color-secondary);
}
.pagination-nav__label {
font-family: var(--ifm-heading-font-family);
font-weight: 600;
}
/* ── Hero / landing ────────────────────────────────────────── */
.hero {
background: var(--ifm-color-primary);
color: var(--ifm-color-primary-contrast, #F7F5F0);
border-bottom: 4px solid var(--fw-accent);
}
.hero__title {
font-family: var(--ifm-heading-font-family);
font-weight: 800;
font-size: 3rem;
}
.hero__subtitle {
font-family: var(--ifm-font-family-base);
font-size: 1.15rem;
line-height: 1.6;
opacity: 0.85;
}
/* ── Scrollbar ─────────────────────────────────────────────── */
.thin-scrollbar::-webkit-scrollbar-thumb {
background: var(--ifm-border-color);
}
.thin-scrollbar::-webkit-scrollbar-track {
background: transparent;
}
/* ── Back to top button ────────────────────────────────────── */
.theme-back-to-top-button {
background-color: var(--ifm-color-primary) !important;
}
/* ── WCAG 2.2 AA ───────────────────────────────────────────── */
:focus-visible {
outline: 2px solid var(--ifm-color-primary) !important;
outline-offset: 2px !important;
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
} }