/*
 * Self-hosted rather than linked from Google Fonts.
 *
 * This app is self-hosted on purpose, and a webfont link puts a third-party
 * request on every page — including the sign-in page, before anyone has
 * agreed to anything. About 100KB of woff2 in the repo avoids that entirely,
 * and there is no build step to complicate it.
 *
 * Since the 18 October 2026 retune: Outfit 600 for headings, Public Sans for
 * the body, and Figtree for the wordmark only.
 *
 *   Outfit ships ONE weight, 600, because --font-heading-weight is the only
 *   weight anything asks the heading face for. It is a static instance cut
 *   from the variable font by Google; asking for another weight renders 600.
 *   It is the face wyome.com sets its titles in (the owner's choice, 19
 *   October 2026, over the mockup's Archivo 800); wyome ships one variable
 *   file without latin-ext, so these are Google's subsets instead.
 *
 *   Public Sans is a VARIABLE font: one file covers 400 through 700, which is
 *   why that range resolves to a single src. Do not add per-weight files.
 *
 *   Figtree (variable, 400-700) stays for the wordmark alone: .athenana-logo
 *   is pinned to it so the live-text mark matches the traced SVG, the emails
 *   and the apps. It is also what tools/build-og-image.py draws its caption in.
 *
 * Caprasimo's two files stay in public/fonts/ with no @font-face here: every
 * weekly email sent before the retune names /fonts/caprasimo-*.woff2, and an
 * old issue reopened should not lose its headings. Nothing in the app loads
 * them, and the service worker no longer precaches them.
 *
 * The unicode-range values are Google's own subsetting (the newer faces carry
 * its current latin-ext range, which runs to U+20C4). latin-ext is included
 * because saved article titles carry accented characters and the fallback
 * would otherwise show through mid-word.
 *
 * All three families are SIL OFL 1.1; the licences ship beside them in this
 * directory, which is what the licence requires.
 */


@font-face {
    font-family: 'Outfit';
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url('/fonts/outfit-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'Outfit';
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url('/fonts/outfit-latin-ext.woff2') format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
    font-family: 'Public Sans';
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url('/fonts/public-sans-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'Public Sans';
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url('/fonts/public-sans-latin-ext.woff2') format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
    font-family: 'Figtree';
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url('/fonts/figtree-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'Figtree';
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url('/fonts/figtree-latin-ext.woff2') format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}


/*
 * METRIC-MATCHED FALLBACKS (25 October 2026).
 *
 * `font-display: swap` shows the next face in the stack until a woff2 lands,
 * and system-ui is neither Outfit's width nor Public Sans's, so the page used
 * to reflow as each one painted: titles rewrapped and cards changed height
 * under the reader's eye. These faces are the reader's own Arial, scaled to
 * the web font's average width and given its ascent and descent, so the swap
 * changes letterforms and leaves the lines where they were.
 *
 * The numbers are measured, not tuned by eye: tools/font-fallback-metrics.py
 * prints these blocks from the woff2 files beside this one. Re-run it if
 * either file is replaced. Weights are declared so a browser picks Arial Bold
 * rather than synthesising bold over Arial (or over Arial Bold, twice). A
 * device with no Arial skips the face and falls through to system-ui as
 * before.
 */

@font-face {
    font-family: 'Outfit Fallback';
    font-weight: 600;
    src: local('Arial Bold'), local('Arial-BoldMT');
    size-adjust: 94.55%;
    ascent-override: 105.77%;
    descent-override: 27.50%;
    line-gap-override: 0.00%;
}

@font-face {
    font-family: 'Public Sans Fallback';
    font-weight: 400;
    src: local('Arial'), local('ArialMT');
    size-adjust: 104.84%;
    ascent-override: 90.61%;
    descent-override: 21.46%;
    line-gap-override: 0.00%;
}

@font-face {
    font-family: 'Public Sans Fallback';
    font-weight: 700;
    src: local('Arial Bold'), local('Arial-BoldMT');
    size-adjust: 99.88%;
    ascent-override: 95.12%;
    descent-override: 22.53%;
    line-gap-override: 0.00%;
}
