/* Quality Web Library bundle: built by bq-cdn/tools/bundle.py from bq-cdn d42a76f on 2026-10-23. Do not edit; re-run the tool.
   Files: css/v1/tokens.css, css/v1/base.css, css/v1/motion.css */

/* ---- css/v1/tokens.css ---- */
/* ==========================================================================
   Quality Web Library, v1
   tokens.css: the variable layer every site overrides

   Source: cdn.brandquality.com/css/v1/tokens.css
   Read the README at cdn.brandquality.com/README.md before using.

   HOW A SITE USES THIS
   Link this file first, then define the client's brand in a :root block
   AFTER it. Override the semantic tokens (--color-*, --font-*). Never edit
   this file for one client. Components reference these names and nothing
   else, so a rebrand is a token swap, never a find-and-replace.

   NAMING
   Category namespaces per design-system/naming-conventions.md section 3:
   --color-*  --font-*  --text-*  --space-*  --radius-*  --shadow-*
   --ease-*   --dur-*   --reveal-*  --nav-*  --container-*

   VALUES
   Ported from shipped builds, not invented here. Motion and reveal values
   are the ones NBA Region IX and the RCOC campaign pages agree on. Type
   floor and breakpoint follow _shared/web-patterns/mobile-floors.md.
   Typeface: Montserrat, locked for now across its weights (September 11, 2026).
   ========================================================================== */

:root {
  /* ---------- Color: semantic layer (the client overrides these) ---------- */
  --color-bg: #ffffff;              /* page background */
  --color-surface: #f6f6f4;         /* cards, panels, insets */
  --color-surface-dark: #161616;    /* dark bands, review-page header end */
  --color-ink: #141414;             /* primary text */
  --color-ink-muted: #6a6a6a;       /* secondary text, captions */
  --color-ink-on-dark: #ffffff;     /* text on dark surfaces */
  --color-line: #d9d9d6;            /* default border */
  --color-line-soft: #ebebe8;       /* hairlines, dividers */
  --color-primary: #141414;         /* the brand's main action color */
  --color-primary-hover: #3a3a3a;   /* a hover has to be a visible shift, not a shade */
  --color-on-primary: #ffffff;      /* text and icon on the primary fill */
  /* Accent: none. Neutral means achromatic (Diallo, September 11, 2026): the
     stock draws its underline, dots and hover in ink and gray, and a brand
     supplies the hue in its own :root block. The Brand Quality palette lives
     in library.json as a palette, not here. */
  --color-accent: #141414;          /* highlights, active underline, dots */
  --color-accent-hover: #3a3a3a;
  --color-on-accent: #ffffff;       /* text and icon on an accent fill. Every palette sets this;
                                       a button never guesses its text colour from --color-ink */
  /* --color-ghost-ink is NOT set here on purpose. button.css reads
     var(--color-ghost-ink, var(--color-primary)); a palette whose primary sits
     close to its ground (NBA wine on wine) sets it to its ink. Defining it here
     as var(--color-primary) would freeze it to the neutral value at :root and
     it would never follow an override. */
  --color-link: #141414;
  --color-link-hover: #6a6a6a;

  /* Review-page dark header values, shared by every client review page.
     Read from first-option/sacnas, bwl/installation, nul/ull. Do not re-derive. */
  --color-black: #000000;
  --color-header-end: #161616;
  --color-dark-line: #3a3a3a;
  --color-dark-line-soft: #262626;
  --color-dark-muted: #9a9a9a;


  /* ---------- Light bands and the form register ----------
     Added September 11, 2026, after the harvest found 19 entries reading these
     with a source client's hex as the fallback, so a card pulled onto another
     brand quietly arrived in that client's colours. Neutral is achromatic here
     like the rest of this file; every palette in library.json carries its own
     set. A "band" is a light section on a dark site (the news, person and
     affiliate cards, the article body, the form card). */
  --color-band-light: #ffffff;        /* the band's ground */
  --color-band-light-tint: #f6f6f4;   /* a second, quieter ground on the same band */
  --color-band-card: #ffffff;         /* a card sitting on the band */
  --color-band-stone: #ebebe8;        /* the band's edge and dividers */
  --color-band-ink: #141414;          /* text on the band */
  --color-band-ink-muted: #6a6a6a;
  --color-band-accent-ink: #141414;   /* the band's accent text; a hue on a branded palette */

  --color-form-tint: #d9d9d6;         /* the control's resting border and fill tint */
  --color-form-ink: #141414;          /* label and value */
  --color-form-focus: #141414;        /* the focus ring */

  /* Radial pools in a mesh-gradient section. Two stops, light then bright. */
  --color-mesh-1: #e4e4e0;
  --color-mesh-2: #d4d4cf;

  /* Semantic states */
  --color-success: #3d7a4d;
  --color-warning: #ac8838;
  --color-error: #b83232;
  --color-info: #3b5773;

  /* ---------- Typography ---------- */
  /* Montserrat is the neutral typeface (Diallo, September 11, 2026): the face on
     every BQ review page and on Brand Quality's own pages. This file names it;
     the page loads it (library.json include.fonts carries the Google Fonts link,
     weights 300 to 900). A client on another face overrides both tokens. */
  --font-heading: "Montserrat", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
  --font-body: "Montserrat", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
  --font-mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace;

  /* Type scale. --text-body is the mobile floor: body copy never below 17px. */
  --text-xs: 12px;
  --text-sm: 14px;
  --text-body: 17px;
  --text-md: 18px;
  --text-lg: 20px;
  --text-xl: 24px;
  --text-2xl: 36px;
  --text-3xl: 56px;
  --text-display: 72px;
  --text-label: 12.5px;             /* nav links, button labels, eyebrows */

  --leading-tight: 1.1;
  --leading-snug: 1.25;
  --leading-body: 1.55;

  --tracking-label: .16em;          /* uppercase nav links */
  --tracking-button: .14em;         /* uppercase button labels */
  --tracking-eyebrow: .2em;

  /* ---------- Spacing (4px base) ---------- */
  --space-xs: 4px;
  --space-sm: 8px;
  --space-md: 16px;
  --space-lg: 24px;
  --space-xl: 40px;
  --space-2xl: 64px;
  --space-3xl: 96px;
  --gutter: clamp(20px, 4vw, 60px); /* horizontal page padding */

  /* ---------- Layout ---------- */
  --container-max: 1280px;
  --container-wide: 1680px;         /* review-page nav width */
  --container-narrow: 720px;
  --nav-h: 64px;
  --bp-phone: 640px;                /* reference only; media queries cannot read vars */

  /* ---------- Radius and shadow ---------- */
  --radius-sm: 4px;
  --radius-md: 8px;
  --radius-lg: 12px;
  --radius-xl: 16px;
  --radius-full: 999px;

  --shadow-sm: 0 2px 8px rgba(0, 0, 0, .08);
  --shadow-md: 0 10px 26px rgba(0, 0, 0, .14);
  --shadow-lg: 0 24px 60px rgba(0, 0, 0, .22);

  /* ---------- Motion: easing ---------- */
  /* One signature reveal curve everywhere. Slow start, fast middle, slow finish. */
  --ease-reveal: cubic-bezier(0.22, 1, 0.36, 1);
  --ease-state: cubic-bezier(0.4, 0, 0.2, 1);      /* hover and state changes */
  --ease-cinema: cubic-bezier(0.65, 0, 0.35, 1);   /* long ambient moves */
  --ease-emph: cubic-bezier(0.16, 1, 0.3, 1);      /* emphatic arrivals */

  /* ---------- Motion: duration ---------- */
  --dur-fast: 220ms;
  --dur: 480ms;
  --dur-slow: 820ms;

  /* ---------- Motion: scroll reveal ---------- */
  --reveal-distance: 22px;
  --reveal-duration: 1500ms;
  --reveal-stagger: 200ms;
}

/* A page can opt into a dark base by setting data-theme="dark" on <html>.
   Client sites that are dark by design (NBA Region IX) override the semantic
   tokens directly instead; this block is the neutral default only. */
:root[data-theme="dark"] {
  --color-bg: #0f0f0f;
  --color-surface: #161616;
  --color-ink: #f4f4f2;
  --color-ink-muted: #9a9a9a;
  --color-line: #3a3a3a;
  --color-line-soft: #262626;
  --color-primary: #f4f4f2;
  --color-primary-hover: #cfcfca;   /* darker on hover: white to whiter is not a hover */
  --color-on-primary: #0f0f0f;
  --color-link: #f4f4f2;
  --color-accent: #f4f4f2;
  --color-accent-hover: #cfcfca;
  --color-on-accent: #0f0f0f;
  --color-link-hover: #9a9a9a;
  --color-band-light: #1a1a1a;
  --color-band-light-tint: #202020;
  --color-band-card: #161616;
  --color-band-stone: #262626;
  --color-band-ink: #f4f4f2;
  --color-band-ink-muted: #9a9a9a;
  --color-band-accent-ink: #f4f4f2;
  --color-form-tint: #3a3a3a;
  --color-form-ink: #f4f4f2;
  --color-form-focus: #f4f4f2;
  --color-mesh-1: #1e1e1e;
  --color-mesh-2: #262626;
  --shadow-sm: 0 2px 8px rgba(0, 0, 0, .4);
  --shadow-md: 0 10px 26px rgba(0, 0, 0, .5);
  --shadow-lg: 0 24px 60px rgba(0, 0, 0, .6);
}

/* ---- css/v1/base.css ---- */
/* ==========================================================================
   Quality Web Library, v1
   base.css: reset, typography, layout primitives, utilities

   Source: cdn.brandquality.com/css/v1/base.css
   Requires tokens.css first.

   Mobile-first. Base styles are the phone; min-width queries layer desktop.
   The floors in _shared/web-patterns/mobile-floors.md are enforced here:
   body copy never below 17px, hover states only under (hover: hover),
   reduced motion honored, Safari aspect-ratio grids use align-items: start.
   ========================================================================== */

*, *::before, *::after { box-sizing: border-box; }

html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  scroll-behavior: auto; /* Lenis owns the scroll when present; see motion.js */
}

body {
  margin: 0;
  background: var(--color-bg);
  color: var(--color-ink);
  font-family: var(--font-body);
  font-size: var(--text-body);
  line-height: var(--leading-body);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

img, svg, video, canvas { display: block; max-width: 100%; }
img { height: auto; }
button, input, select, textarea { font: inherit; color: inherit; }
button { cursor: pointer; background: none; border: 0; padding: 0; }
a { color: var(--color-link); text-decoration-thickness: 1px; text-underline-offset: .14em; }

@media (hover: hover) {
  /* :where() keeps this at zero specificity, so a component's own hover colour
     (a button's text on its fill) always wins. Without it a:hover (0,1,1)
     beat .qw-btn (0,1,0) and every button's label went link-gray on hover. */
  :where(a:hover) { color: var(--color-link-hover); }
}

/* ---------- Headings ---------- */
h1, h2, h3, h4 {
  margin: 0 0 var(--space-md);
  font-family: var(--font-heading);
  line-height: var(--leading-tight);
  font-weight: 700;
  text-wrap: balance;
}
h1 { font-size: clamp(var(--text-2xl), 5vw, var(--text-3xl)); }
h2 { font-size: clamp(var(--text-xl), 3.4vw, var(--text-2xl)); }
h3 { font-size: var(--text-xl); }
h4 { font-size: var(--text-lg); }
p  { margin: 0 0 var(--space-md); }
p:last-child { margin-bottom: 0; }

/* Eyebrow: the small uppercase label above a heading */
.qw-eyebrow {
  display: block;
  margin-bottom: var(--space-sm);
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: var(--tracking-eyebrow);
  text-transform: uppercase;
  color: var(--color-ink-muted);
}

/* ---------- Layout primitives ---------- */
.qw-container {
  width: 100%;
  max-width: var(--container-max);
  margin-inline: auto;
  padding-inline: var(--gutter);
}
.qw-container--wide { max-width: var(--container-wide); }
.qw-container--narrow { max-width: var(--container-narrow); }

.qw-section { padding-block: var(--space-2xl); }
@media (min-width: 900px) {
  .qw-section { padding-block: var(--space-3xl); }
}

/* Section header contract: eyebrow, heading, one line of lead copy */
.qw-section__head { max-width: 62ch; margin-bottom: var(--space-xl); }
.qw-section__head--center { margin-inline: auto; text-align: center; }

/* Grid that survives Safari: aspect-ratio children collapse under stretch */
.qw-grid {
  display: grid;
  gap: var(--space-lg);
  align-items: start;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
}

/* ---------- Utilities (u- prefix, one job each) ---------- */
.u-visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0);
  white-space: nowrap; border: 0;
}
.u-text-center { text-align: center; }
.u-mono { font-family: var(--font-mono); }

/* Mobile-only line break. Desktop keeps the space; phone breaks the line. */
.u-br-mobile { display: none; }
@media (max-width: 640px) {
  .u-br-mobile { display: inline; }
}

/* ---------- Focus ---------- */
:focus-visible {
  outline: 2px solid var(--color-accent);
  outline-offset: 3px;
}

/* ---------- Reduced motion base ---------- */
@media (prefers-reduced-motion: reduce) {
  :root { --dur-fast: 0ms; --dur: 0ms; --dur-slow: 0ms; --reveal-duration: 0ms; }
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}

/* ---- css/v1/motion.css ---- */
/* ==========================================================================
   Quality Web Library, v1
   motion.css: the scroll reveal system

   Source: cdn.brandquality.com/css/v1/motion.css
   Requires tokens.css. Pair with js/v1/motion.js for the observer and Lenis.

   Ported from nba-region-ix/css/motion.css and the RCOC campaign pages,
   which agree on every value. This is the same reveal that runs on every
   BQ property built since June 2026. Do not re-derive it per site.

   Design principles (Diallo):
   - Smooth, subtle, easy. Ease-out, never ease-in.
   - Nothing harsh, nothing abrupt. Patient, intentional, dynamic.

   THE PATTERN
   <div data-reveal>              fades up 22px when it enters the viewport
   <div data-reveal="left">       slides in from the left
   <div data-reveal="right">      slides in from the right
   <div data-reveal="fade">       opacity only
   <div data-reveal="up-large">   double travel
   <div data-reveal="scale">      up plus a slight scale from .96
   <div data-reveal="scale-down"> settles from 1.15 to 1
   <div data-reveal="rule">       does not animate itself; takes .is-revealed
                                  so a component can drive its own parts

   <ul data-reveal-group>         children with data-reveal auto-stagger
   <ul data-reveal-group data-reveal-stagger="180">   custom stagger in ms
   <li data-reveal data-reveal-delay="380">           explicit delay in ms

   Reveals fire once (IntersectionObserver + unobserve) and use keyframes,
   not transitions, so timing is deterministic even if the render pipeline
   pauses. Reduced motion makes everything visible instantly.
   ========================================================================== */

@keyframes qw-reveal-up {
  from { opacity: 0; transform: translateY(var(--reveal-distance)); }
  to   { opacity: 1; transform: translateY(0); }
}
@keyframes qw-reveal-left {
  from { opacity: 0; transform: translateX(calc(var(--reveal-distance) * -1)); }
  to   { opacity: 1; transform: translateX(0); }
}
@keyframes qw-reveal-right {
  from { opacity: 0; transform: translateX(var(--reveal-distance)); }
  to   { opacity: 1; transform: translateX(0); }
}
@keyframes qw-reveal-fade {
  from { opacity: 0; }
  to   { opacity: 1; }
}
@keyframes qw-reveal-up-large {
  from { opacity: 0; transform: translateY(calc(var(--reveal-distance) * 2)); }
  to   { opacity: 1; transform: translateY(0); }
}
@keyframes qw-reveal-scale {
  from { opacity: 0; transform: translateY(var(--reveal-distance)) scale(.96); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes qw-reveal-scale-down {
  from { opacity: 0; transform: scale(1.15); }
  to   { opacity: 1; transform: scale(1); }
}

/* Oct 18, 2026 (Safari): the page can sit unpainted for a second or two while its
   fonts load, and an entrance that starts in that time finishes unseen, so the
   content pops in. motion.js puts .qw-wait on <html> until the stylesheets and
   fonts are in and a frame has been drawn; until then every animation holds on its
   first frame. Add the class in an inline <head> script as well, so animations that
   start before motion.js runs hold too:
     <script>document.documentElement.classList.add('js','qw-wait');setTimeout(function(){document.documentElement.classList.remove('qw-wait')},4000)</script> */
html.qw-wait *, html.qw-wait *::before, html.qw-wait *::after { animation-play-state: paused !important; }

[data-reveal] { opacity: 0; }

[data-reveal].is-revealed {
  animation: qw-reveal-up var(--reveal-duration) var(--ease-reveal) var(--reveal-delay, 0ms) forwards;
}
[data-reveal="left"].is-revealed       { animation-name: qw-reveal-left; }
[data-reveal="right"].is-revealed      { animation-name: qw-reveal-right; }
[data-reveal="fade"].is-revealed       { animation-name: qw-reveal-fade; }
[data-reveal="up-large"].is-revealed   { animation-name: qw-reveal-up-large; }
[data-reveal="scale"].is-revealed      { animation-name: qw-reveal-scale; }
[data-reveal="scale-down"].is-revealed { animation-name: qw-reveal-scale-down; }

/* data-reveal="rule": the element stays put and only registers with the observer.
   A component reads .is-revealed and animates its own parts (the step's rule
   draws in, a chapter band's numeral settles). Defined here, September 11, 2026,
   because four entries used the value while only step.css implemented it, so any
   page linking one of the other three without the step got the default reveal. */
[data-reveal="rule"] { opacity: 1; transform: none; }
[data-reveal="rule"].is-revealed { animation: none; }

/* ---------- Page load entrance ----------
   For hero content that should rise on load without waiting for scroll.
   Pure CSS so it has no JS dependency. Stagger with --rise-delay. */
@keyframes qw-rise-in {
  from { opacity: 0; transform: translateY(16px); }
  to   { opacity: 1; transform: translateY(0); }
}
[data-rise] {
  opacity: 0;
  animation: qw-rise-in 2200ms var(--ease-reveal) var(--rise-delay, 200ms) forwards;
}

/* ---------- Back to top ----------
   Mobile-first floating control. Shown by motion.js after the reader has
   scrolled past ~80% of a viewport. Hidden on desktop unless a site opts in
   with .qw-back-to-top--always. */
.qw-back-to-top {
  position: fixed;
  right: 16px;
  bottom: 16px;
  z-index: 70;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: var(--radius-full);
  background: rgba(8, 8, 18, .62);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
  border: 1px solid rgba(255, 255, 255, .42);
  color: #fff;
  box-shadow: var(--shadow-md);
  opacity: 0;
  transform: translateY(8px);
  pointer-events: none;
  transition: opacity var(--dur-fast) var(--ease-reveal), transform var(--dur-fast) var(--ease-reveal);
}
.qw-back-to-top svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
.qw-back-to-top.is-visible { opacity: 1; transform: translateY(0); pointer-events: auto; }
@media (min-width: 900px) {
  .qw-back-to-top:not(.qw-back-to-top--always) { display: none; }
}

/* ---------- Reduced motion ---------- */
@media (prefers-reduced-motion: reduce) {
  [data-reveal], [data-rise] { opacity: 1; animation: none; transform: none; }
}

/* ---- assets/fonts/fonts.css (the site's own type) ---- */
/* NBA Region IX · self-hosted type (Standard 21, Oct 18, 2026).
   Served from this site, never from Google, so Safari's first paint waits on no other host.
   All three faces are SIL Open Font License 1.1; each licence sits beside its file
   (OFL-inter.txt, OFL-playfair-display.txt, OFL-jetbrains-mono.txt). The files are the
   same latin-subset WOFF2s the site has shipped since May 22, 2026, unmodified (Inter
   4.001 and Playfair Display 1.203 are variable files: one each now, renamed only; until
   Oct 18 each was committed four times under per-weight names, byte for byte the same).
   Each face keeps the exact weights it declared before, all pointing at its one file, so
   the browser picks the same weights it always has and downloads the file once.
   url()s are root-relative because this file is bundled into /css/qw-lib.css
   (bq-cdn/tools/bundle.py); the review page still links it directly. */

@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/assets/fonts/inter-variable.woff2?v=1') 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: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('/assets/fonts/inter-variable.woff2?v=1') 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: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('/assets/fonts/inter-variable.woff2?v=1') 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: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('/assets/fonts/inter-variable.woff2?v=1') 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: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/assets/fonts/jetbrains-mono-400-normal.woff2?v=1') 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: 'Playfair Display';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/assets/fonts/playfair-display-variable.woff2?v=1') 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: 'Playfair Display';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('/assets/fonts/playfair-display-variable.woff2?v=1') 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: 'Playfair Display';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('/assets/fonts/playfair-display-variable.woff2?v=1') 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: 'Playfair Display';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url('/assets/fonts/playfair-display-variable.woff2?v=1') 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;
}
