@font-face {
  font-family: "Bodoni Moda";
  font-style: normal;
  font-weight: 400 900;
  font-display: swap;
  src: url("bodoni-moda-latin.woff2") format("woff2");
}

@font-face {
  font-family: "Source Serif 4";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("source-serif-4-latin.woff2") format("woff2");
}

:root {
  color-scheme: light;

  --paper: oklch(0.975 0.012 84);
  --paper-2: oklch(0.949 0.019 82);
  --paper-3: oklch(0.916 0.024 79);
  --ink: oklch(0.215 0.024 62);
  --ink-soft: oklch(0.43 0.024 66);
  --rule: oklch(0.79 0.029 78);
  --rule-soft: oklch(0.89 0.019 80);
  --brass: oklch(0.63 0.11 78);
  --brass-deep: oklch(0.43 0.085 73);
  --brass-light: oklch(0.82 0.072 83);
  --forest: oklch(0.22 0.035 151);
  --forest-raised: oklch(0.28 0.041 148);
  --forest-ink: oklch(0.95 0.014 84);
  --forest-quiet: oklch(0.76 0.02 145);
  --color-accent: var(--brass);
  --color-accent-ink: var(--forest);
  --focus: var(--brass-deep);

  --font-display: "Bodoni Moda", Didot, "Bodoni MT", Georgia, serif;
  --font-body: "Source Serif 4", "Iowan Old Style", Georgia, serif;
  --font-label: "Source Serif 4", "Iowan Old Style", Georgia, serif;

  --space-3xs: 0.25rem;
  --space-2xs: 0.5rem;
  --space-xs: 0.75rem;
  --space-sm: 1rem;
  --space-md: 1.5rem;
  --space-lg: 2rem;
  --space-xl: 3rem;
  --space-2xl: 4.5rem;
  --space-3xl: 7rem;

  /* Type ladder. One φ, two roots: every step multiplies by φ^(1/4) on a
     phone and by φ^(1/3) at full sheet width, so the hierarchy opens up as
     the sheet widens instead of scaling flat. Body is step 0 (17px → 20px);
     three desktop steps make a whole golden jump. Every size in this theme
     is a rung — nothing sets a font-size of its own.

     The fluid part is measured in cqi against .invite, not vw, so the
     invitation types itself to the sheet it is printed on: correct inside
     the catalogue's device frames and the host's preview, not just at the
     window width that happens to be open. */
  --text-micro: clamp(0.741rem, 0.719rem + 0.106cqi, 0.773rem);
  --text-label: clamp(0.835rem, 0.788rem + 0.239cqi, 0.907rem);
  --text-sm: clamp(0.942rem, 0.86rem + 0.409cqi, 1.065rem);
  --text-body: clamp(1.063rem, 0.938rem + 0.625cqi, 1.25rem);
  --text-lede: clamp(1.198rem, 1.019rem + 0.897cqi, 1.468rem);
  --text-title-sm: clamp(1.352rem, 1.104rem + 1.238cqi, 1.723rem);
  --text-title: clamp(1.524rem, 1.192rem + 1.661cqi, 2.023rem);
  --text-title-lg: clamp(1.719rem, 1.282rem + 2.184cqi, 2.374rem);
  --text-section: clamp(1.939rem, 1.373rem + 2.829cqi, 2.788rem);
  --text-display-s: clamp(2.187rem, 1.463rem + 3.619cqi, 3.273rem);
  --text-display-m: clamp(2.466rem, 1.549rem + 4.585cqi, 3.842rem);
  --text-display: clamp(3.538rem, 2.367rem + 5.856cqi, 5.295rem);

  /* One leading per job, so two paragraphs of the same rank never set
     differently. --leading-stack is for names broken over several lines. */
  --leading-display: 1.05;
  --leading-stack: 0.95;
  --leading-title: 1.15;
  --leading-lede: 1.55;
  --leading-body: 1.7;
  --leading-small: 1.65;
  --leading-label: 1.4;

  /* One measure for supporting prose, so a paragraph reads the same width
     wherever it sits on the sheet. */
  --measure: 58ch;

  --control-min: 2.75rem;
  --gutter: clamp(1rem, 11.667cqi - 1.333rem, 4.5rem);

  /* The invitation is a sheet of paper, not a web page: it stops at a width
     a card would be printed at and sits on a dark table. */
  --sheet: 52rem;
  --surround: oklch(0.276 0.019 62);

  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-in: cubic-bezier(0.7, 0, 0.84, 0);
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
  --dur-micro: 120ms;
  --dur-short: 180ms;
  --dur-medium: 300ms;
  --dur-slow: 500ms;
  --shadow-whisper: 0 1px 2px oklch(0.2 0.016 62 / 0.08);
  --shadow-paper: 0 1.25rem 4rem oklch(0.2 0.016 62 / 0.22);
  --shadow-seal:
    inset 0 0 0 0.25rem color-mix(in oklab, var(--brass-light) 30%, transparent),
    0 0.45rem 1.2rem oklch(0.2 0.016 62 / 0.2);
  --shadow-seal-hover:
    inset 0 0 0 0.25rem color-mix(in oklab, var(--brass-light) 38%, transparent),
    0 0.6rem 1.4rem oklch(0.2 0.016 62 / 0.24);
  --shadow-seal-pressed:
    inset 0 0 0 0.25rem color-mix(in oklab, var(--brass-light) 24%, transparent),
    0 0.2rem 0.6rem oklch(0.2 0.016 62 / 0.22);
  --z-opening: 90;
  --grain: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='grain'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.82' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23grain)'/%3E%3C/svg%3E");
}
