/* Outfit and Figtree, served from this origin.
 *
 * WHY THIS FILE EXISTS. Every page used to pull these from
 * fonts.googleapis.com as a render-blocking <link> in the <head>. On
 * 2026-09-07 that host stopped answering — measured at 15s+ per request while
 * this app's own server replied in under a second — so every page, including
 * invoice.html, proposal.html and book.html, sat blank for a client.
 * Ryan: "google has been down a little and cuely is running slow."
 *
 * A third party in the critical path is a third party who can take the app
 * down. These are open-source faces; there is no reason to rent them.
 *
 * WHY font-display:block AND NOT swap. Ryan: "I dont want the fall back font to
 * load first than google cause that just looks kinda ameture." swap paints the
 * system font immediately and then reflows — the flash he means. block holds
 * the text briefly and then paints it correctly, once. That is only a good
 * trade because these now come from the same origin, immutably cached: the
 * hold is imperceptible. Against a remote host block would risk seconds of
 * invisible text, which is why it was the wrong setting before and is the right
 * one now.
 *
 * Variable files, so one download covers every weight the app uses (300, 400,
 * 500, 600, 700, and 800 for the wordmark, the dashboard greeting and the list
 * and calendar titles). 31KB + 19KB, against the 108KB Outfit.ttf this replaces
 * — which was itself never used, because the Google <link> was declared after
 * it on all seven pages that had it.
 */

/* The ?v= on every font URL is not decoration. _headers serves /fonts/* with
 * max-age=31536000, immutable — the same rule as /js/ and /css/ — so a file
 * replaced in place would keep being served from cache for a year. Replacing
 * a face means bumping the ?v= HERE and on the <link> to this stylesheet on
 * every page, in the same commit. (The old Outfit.ttf had no buster at all.)
 */
@font-face {
  font-family: 'Outfit';
  src: url('/fonts/Outfit-variable.woff2?v=20260907a') format('woff2-variations'),
       url('/fonts/Outfit-variable.woff2?v=20260907a') format('woff2');
  font-weight: 100 900;
  font-style: normal;
  font-display: block;
}

@font-face {
  font-family: 'Figtree';
  src: url('/fonts/Figtree-variable.woff2?v=20260907a') format('woff2-variations'),
       url('/fonts/Figtree-variable.woff2?v=20260907a') format('woff2');
  font-weight: 300 900;
  font-style: normal;
  font-display: block;
}

/* Fraunces is the display serif on every client-facing document — the proposal
 * cover, the quote pages, the "Payment received" heading. Ten pages loaded it
 * from Google alongside Outfit and Figtree, so it has to come with them or the
 * proposal a client opens renders in Georgia.
 *
 * Two files because the italic is a separate design, not a slant, and proposal
 * .html sets font-style:italic on the couple's names, the pull quotes and the
 * step numbers. The opsz build (9-144) is the one Google served — declaring the
 * axis is what lets font-optical-sizing:auto, the CSS default, keep 120px cover
 * type and 16px body type on their intended drawings. Measured, not assumed:
 * fvar reports opsz 9..144 and wght 100..900 in both files.
 */
@font-face {
  font-family: 'Fraunces';
  src: url('/fonts/Fraunces-variable-normal.woff2?v=20260907a') format('woff2-variations'),
       url('/fonts/Fraunces-variable-normal.woff2?v=20260907a') format('woff2');
  font-weight: 100 900;
  font-style: normal;
  font-display: block;
}

@font-face {
  font-family: 'Fraunces';
  src: url('/fonts/Fraunces-variable-italic.woff2?v=20260907a') format('woff2-variations'),
       url('/fonts/Fraunces-variable-italic.woff2?v=20260907a') format('woff2');
  font-weight: 100 900;
  font-style: italic;
  font-display: block;
}
