/* ==========================================================================
   Clay Kit — a small design system for claymation-led websites.
   Light-first, because clay renders read best on paper. One accent per page.
   Swap the accent with  <body data-accent="terracotta | moss | plum | sky">
   ========================================================================== */

:root{
  color-scheme: light dark;

  /* --- ground: unfired porcelain, a cool grey with a faint lilac cast.
         Deliberately not the warm-cream family every craft site defaults to. */
  --paper:#E2E1E7;
  --panel:#F4F3F6;
  --panel-2:#FBFAFC;
  --ink:#211E27;
  --muted:#5B5666;
  --faint:#847E92;
  --line:rgba(33,30,39,.13);
  --line-lit:rgba(33,30,39,.26);

  /* --- clay pigments. The accent is set per page, from these. */
  --terracotta:#C4653F;
  --moss:#69874C;
  --plum:#8A5578;
  --sky:#4A7392;
  --sand:#D8B27A;
  --stone:#B9B3AC;

  --accent:var(--terracotta);
  --accent-ink:#FFFFFF;
  --accent-soft:rgba(196,101,63,.12);
  --accent-lip:rgba(120,58,32,.55);
  --accent-2:var(--moss);

  --shadow-1:0 2px 4px rgba(33,30,39,.06);
  --shadow-2:0 18px 34px -26px rgba(33,30,39,.45);
  --shadow-3:0 40px 70px -50px rgba(33,30,39,.6);

  --r-s:12px; --r-m:20px; --r-l:34px; --r-pill:999px;

  --display: ui-rounded, "SF Pro Rounded", "Hiragino Maru Gothic ProN", "Varela Round", Avenir, "Trebuchet MS", sans-serif;
  --text: system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif;
  --mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;

  --t-hero: clamp(42px, 6.4vw, 88px);
  --t-h2:   clamp(27px, 3.4vw, 44px);
  --t-h3:   clamp(19px, 1.6vw, 23px);
  --t-lede: clamp(17px, 1.4vw, 20px);

  --gap:clamp(16px,2vw,26px);
  --section:clamp(56px,8vw,120px);
  --press: cubic-bezier(.34,1.56,.64,1);
}

body[data-accent="moss"]{      --accent:var(--moss);      --accent-soft:rgba(105,135,76,.13); --accent-lip:rgba(58,78,38,.55); --accent-2:var(--terracotta); }
body[data-accent="plum"]{      --accent:var(--plum);      --accent-soft:rgba(138,85,120,.13); --accent-lip:rgba(80,44,68,.55); --accent-2:var(--sand); }
body[data-accent="sky"]{       --accent:var(--sky);       --accent-soft:rgba(74,115,146,.13); --accent-lip:rgba(38,62,82,.55); --accent-2:var(--terracotta); }

/* --- kiln dark: the same room with the lamp off ------------------------- */
@media (prefers-color-scheme: dark){
  :root{
    --paper:#141218;
    --panel:#1D1A22;
    --panel-2:#26222D;
    --ink:#EFEBF3;
    --muted:#ADA5B8;
    --faint:#867E92;
    --line:rgba(239,235,243,.14);
    --line-lit:rgba(239,235,243,.28);
    --terracotta:#E07C51;
    --moss:#8CAE68;
    --plum:#B3789F;
    --sky:#6C9AC0;
    --shadow-2:0 18px 34px -24px rgba(0,0,0,.8);
    --shadow-3:0 40px 70px -46px rgba(0,0,0,.9);
  }
}
:root[data-theme="dark"]{
  --paper:#141218; --panel:#1D1A22; --panel-2:#26222D;
  --ink:#EFEBF3; --muted:#ADA5B8; --faint:#867E92;
  --line:rgba(239,235,243,.14); --line-lit:rgba(239,235,243,.28);
  --terracotta:#E07C51; --moss:#8CAE68; --plum:#B3789F; --sky:#6C9AC0;
  --shadow-2:0 18px 34px -24px rgba(0,0,0,.8);
  --shadow-3:0 40px 70px -46px rgba(0,0,0,.9);
}
:root[data-theme="light"]{
  --paper:#E2E1E7; --panel:#F4F3F6; --panel-2:#FBFAFC;
  --ink:#211E27; --muted:#5B5666; --faint:#847E92;
  --line:rgba(33,30,39,.13); --line-lit:rgba(33,30,39,.26);
  --terracotta:#C4653F; --moss:#69874C; --plum:#8A5578; --sky:#4A7392;
  --shadow-2:0 18px 34px -26px rgba(33,30,39,.45);
  --shadow-3:0 40px 70px -50px rgba(33,30,39,.6);
}

/* --------------------------------------------------------------- basics */
*{box-sizing:border-box}
html{scroll-behavior:smooth}
@media (prefers-reduced-motion: reduce){ html{scroll-behavior:auto} }

body{
  margin:0;
  background:var(--paper);
  color:var(--ink);
  font-family:var(--text);
  font-size:17px;
  line-height:1.62;
  -webkit-font-smoothing:antialiased;
}
/* the grain that keeps every surface matte rather than glossy */
body::after{
  content:"";
  position:fixed; inset:0; z-index:60; pointer-events:none;
  opacity:.13; mix-blend-mode:multiply;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
}
@media (prefers-color-scheme: dark){ body::after{ mix-blend-mode:overlay; opacity:.09 } }
:root[data-theme="dark"] body::after{ mix-blend-mode:overlay; opacity:.09 }
:root[data-theme="light"] body::after{ mix-blend-mode:multiply; opacity:.13 }

img,svg{max-width:100%;display:block}
a{color:inherit}
::selection{background:var(--accent-soft)}

/* Paul's rule: content is 80% of the viewport, 90% on small screens. */
.wrap{width:80%;max-width:1280px;margin-inline:auto}
@media (max-width:860px){ .wrap{width:90%} }
.wrap-narrow{width:min(72ch,80%);margin-inline:auto}
@media (max-width:860px){ .wrap-narrow{width:90%} }

section{padding-block:var(--section)}
section.tight{padding-block:clamp(36px,5vw,64px)}

/* ----------------------------------------------------------------- type */
h1,h2,h3,h4{font-family:var(--display);font-weight:800;letter-spacing:-.02em;margin:0;text-wrap:balance}
h1{font-size:var(--t-hero);line-height:.98;letter-spacing:-.035em}
h2{font-size:var(--t-h2);line-height:1.06}
h3{font-size:var(--t-h3);line-height:1.25;font-weight:700}
p{margin:0 0 1em}
p:last-child{margin-bottom:0}
.lede{font-size:var(--t-lede);color:var(--muted);max-width:62ch}
.eyebrow{
  font-family:var(--mono);font-size:12px;letter-spacing:.18em;text-transform:uppercase;
  color:var(--faint);margin:0 0 14px;display:block;
}
.tint{color:var(--accent)}
.muted{color:var(--muted)}
.stack{display:flex;flex-direction:column;gap:var(--gap)}
/* a pill is a label, not a bar — stop the column stretching it full width */
.stack>.pill,.stack>.eyebrow{align-self:flex-start}
.stack-s{display:flex;flex-direction:column;gap:10px}
.row{display:flex;flex-wrap:wrap;gap:12px;align-items:center}

/* --------------------------------------------------------------- header */
.head{
  position:sticky;top:0;z-index:40;
  backdrop-filter:blur(10px) saturate(115%);
  background:color-mix(in srgb, var(--paper) 82%, transparent);
  border-bottom:1px solid var(--line);
}
@supports not (backdrop-filter: blur(4px)){ .head{background:var(--paper)} }
.head .bar{display:flex;align-items:center;gap:18px;height:68px}
.brand{display:flex;align-items:center;gap:10px;font-family:var(--display);font-weight:800;font-size:18px;text-decoration:none;letter-spacing:-.02em}
.brand .mark{width:30px;height:30px;flex:none;color:var(--accent)}
.head nav{margin-left:auto;display:flex;align-items:center;gap:6px}
/* :not(.btn) matters — without it this rule outranks .btn-primary's colour
   and the primary button in the header goes muddy. */
.head nav a:not(.btn){
  text-decoration:none;color:var(--muted);font-size:15px;font-weight:500;
  padding:8px 12px;border-radius:var(--r-pill);
}
.head nav a:not(.btn):hover{color:var(--ink);background:var(--panel)}
.head nav a.active:not(.btn){color:var(--ink)}
@media (max-width:760px){
  .head nav a.hide-sm{display:none}
}

/* -------------------------------------------------------------- buttons */
.btn{
  --lip:var(--line-lit);
  display:inline-flex;align-items:center;gap:9px;
  font-family:var(--display);font-weight:700;font-size:15.5px;line-height:1;
  color:var(--ink);background:var(--panel-2);
  border:1px solid var(--line);border-radius:var(--r-pill);
  padding:13px 22px;cursor:pointer;text-decoration:none;
  box-shadow:0 4px 0 var(--lip);
  transition:transform .16s var(--press), box-shadow .16s ease, background .16s ease;
}
.btn:hover{transform:translateY(2px);box-shadow:0 2px 0 var(--lip)}
.btn:active{transform:translateY(4px) scale(1.03,.96);box-shadow:0 0 0 var(--lip)}
.btn:focus-visible{outline:3px solid var(--accent);outline-offset:3px}
.btn-primary{--lip:var(--accent-lip);background:var(--accent);color:var(--accent-ink);border-color:transparent}
.btn-ghost{background:transparent;box-shadow:none}
.btn-ghost:hover{background:var(--panel);transform:none}
.btn-s{padding:10px 16px;font-size:14px}

/* --------------------------------------------------------------- panels */
.panel{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-l);
  box-shadow:var(--shadow-2);
}
.card{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--r-m);
  padding:clamp(18px,2vw,26px);
  box-shadow:var(--shadow-2);
  transition:transform .28s var(--press), box-shadow .28s ease;
}
.card.lift:hover{transform:translateY(-5px);box-shadow:var(--shadow-3)}
.card h3{margin-bottom:6px}
.card p{color:var(--muted);font-size:15.5px;margin:0}

.grid{display:grid;gap:var(--gap)}
.g-2{grid-template-columns:repeat(2,1fr)}
.g-3{grid-template-columns:repeat(3,1fr)}
.g-4{grid-template-columns:repeat(4,1fr)}
.g-auto{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}
@media (max-width:940px){ .g-3,.g-4{grid-template-columns:repeat(2,1fr)} }
@media (max-width:640px){ .g-2,.g-3,.g-4{grid-template-columns:1fr} }

.split{display:grid;grid-template-columns:1.05fr .95fr;gap:clamp(24px,4vw,64px);align-items:center}
.split.flip>*:first-child{order:2}
@media (max-width:880px){ .split{grid-template-columns:1fr} .split.flip>*:first-child{order:0} }

.pill{
  display:inline-flex;align-items:center;gap:7px;
  font-family:var(--mono);font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;
  color:var(--accent);background:var(--accent-soft);
  padding:6px 12px;border-radius:var(--r-pill);
}
.dot{width:7px;height:7px;border-radius:50%;background:currentColor;flex:none}

/* A chip is a quieter pill: grey rather than accent, and it comes in a row.
   Use it as a plain label, or as a filter button — give the button
   aria-pressed and the on state is handled for you. */
.chips{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.chip{
  font-family:var(--mono);font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;
  color:var(--muted);background:var(--panel);
  border:1px solid var(--line);border-radius:var(--r-pill);
  padding:7px 13px;
  transition:transform .16s var(--press), background .16s ease, color .16s ease;
}
button.chip,.chip[role="button"]{cursor:pointer}
button.chip:hover,.chip[aria-pressed]:hover{color:var(--ink);background:var(--panel-2)}
button.chip:active{transform:scale(1.06,.94)}
.chip:focus-visible{outline:3px solid var(--accent);outline-offset:3px}
.chip[aria-pressed="true"]{
  color:var(--accent-ink);background:var(--accent);border-color:transparent;
}

/* ---------------------------------------------------- the image slot
   Every picture on a page is a slot. Drop the real render at the path in
   the note and it takes over; until then the code-drawn clay stands in. */
.slot{
  position:relative;margin:0;
  border-radius:var(--r-l);
  background:radial-gradient(120% 95% at 50% 8%, var(--panel-2), var(--panel) 72%);
  border:1px solid var(--line);
  overflow:hidden;
  isolation:isolate;
}
.slot img{width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .3s ease}
.slot.has-image img{opacity:1}
.slot .clay-art{position:absolute;inset:0;display:grid;place-items:center;padding:3%}
/* width AND height, so the model scales down to fit a short slot instead of
   spilling out of the bottom of it. preserveAspectRatio does the letterboxing. */
.slot .clay-art svg{width:100%;height:100%}
.slot.has-image .clay-art{display:none}
.slot .slot-note{
  position:absolute;left:12px;bottom:12px;right:12px;z-index:2;
  width:max-content;max-width:calc(100% - 24px);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  font-family:var(--mono);font-size:11px;letter-spacing:.06em;
  color:var(--faint);background:color-mix(in srgb, var(--panel) 88%, transparent);
  border:1px solid var(--line);border-radius:var(--r-pill);
  padding:5px 11px;
}
.slot.has-image .slot-note{display:none}
.slot.bare{background:none;border:0;box-shadow:none}

/* ------------------------------------------------------------ the cut-out
   A library picture with a see-through background isn't a photograph of a
   room, it's one object floating. It wants no panel behind it, no crop, and
   a soft pool of accent light underneath instead of a hard shadow.
   Works on its own — <div class="cut cut-s"> — or on a slot, where the
   code-drawn stand-in and the path note still do their job:
   <figure class="slot cut slot-4x3">. */
.cut{
  display:grid;place-items:center;
  aspect-ratio:1/1;
  background:radial-gradient(58% 58% at 50% 56%, var(--accent-soft), transparent 72%);
}
.cut img{width:100%;height:100%;object-fit:contain}
.cut-xs{max-width:110px}   /* an icon inside a card */
.cut-s{max-width:210px}
.cut-m{max-width:340px}
.slot.cut{border:0;box-shadow:none}
/* a cut-out used as a card's icon needs air under it before the heading */
.card>.cut{margin-bottom:14px}

.slot-1x1{aspect-ratio:1/1}
.slot-4x3{aspect-ratio:4/3}
.slot-16x9{aspect-ratio:16/9}
.slot-3x4{aspect-ratio:3/4}
.slot-wide{aspect-ratio:21/9}

/* ----------------------------------------------------------- hero shapes */
.hero-photo{position:relative;min-height:clamp(520px,86vh,880px);display:flex;align-items:flex-end;overflow:hidden}
/* A hero photo is a lit room shot in the dark, so the hero ground stays dark
   in both themes — the white headline then works before and after you drop
   the real render in. */
.hero-photo .slot{
  position:absolute;inset:0;border-radius:0;border:0;
  background:radial-gradient(90% 80% at 66% 26%, #3A2E38 0%, #241C26 46%, #15111A 100%);
}
/* the stand-in model sits top-right so the headline keeps the left third */
.hero-photo .clay-art{place-items:start end;padding:5% 4% 0 0}
.hero-photo .clay-art svg{width:min(58%,720px)}
@media (max-width:880px){ .hero-photo .clay-art svg{width:min(86%,520px)} }
.hero-photo .scrim{
  position:absolute;inset:0;z-index:1;
  background:
    linear-gradient(to top, rgba(16,13,20,.92) 0%, rgba(16,13,20,.64) 34%, rgba(16,13,20,.12) 68%, rgba(16,13,20,0) 100%),
    linear-gradient(to right, rgba(16,13,20,.66) 0%, rgba(16,13,20,.34) 38%, rgba(16,13,20,0) 66%);
}
.hero-photo .hero-copy{position:relative;z-index:2;padding-block:clamp(36px,7vw,84px);color:#F6F3F8}
.hero-photo .hero-copy .lede{color:rgba(246,243,248,.82)}
.hero-photo .hero-copy .eyebrow{color:rgba(246,243,248,.7)}

/* ---------------------------------------------------------------- forms */
input,select,textarea,button{font:inherit;color:inherit}
.field{
  display:flex;gap:10px;flex-wrap:wrap;
}
.input{
  flex:1 1 220px;min-width:0;
  background:var(--panel-2);color:var(--ink);
  border:1px solid var(--line);border-radius:var(--r-pill);
  padding:13px 18px;
}
.input::placeholder{color:var(--faint)}
.input:focus{outline:3px solid var(--accent);outline-offset:2px;border-color:transparent}
.on-photo .input{background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.3);color:#fff}
.on-photo .input::placeholder{color:rgba(255,255,255,.65)}

/* --------------------------------------------------------------- pricing */
.price{display:flex;align-items:baseline;gap:6px;font-family:var(--display)}
.price .n{font-size:44px;font-weight:800;letter-spacing:-.03em}
.price .per{font-size:14px;color:var(--muted);font-family:var(--text)}
.tier{display:flex;flex-direction:column;gap:16px;height:100%}
.product{display:flex;flex-direction:column;height:100%}
.product .buy{margin-top:auto;padding-top:14px;justify-content:space-between}
.tier.featured{border-color:var(--accent);box-shadow:var(--shadow-3), 0 0 0 1px var(--accent)}
.ticks{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px;font-size:15.5px;color:var(--muted)}
.ticks li{display:flex;gap:10px;align-items:flex-start}
.ticks .tick{color:var(--accent);flex:none;margin-top:2px}

/* ------------------------------------------------------------------ faq */
.faq{border-top:1px solid var(--line)}
.faq details{border-bottom:1px solid var(--line)}
.faq summary{
  cursor:pointer;list-style:none;padding:20px 0;
  font-family:var(--display);font-weight:700;font-size:18px;
  display:flex;justify-content:space-between;gap:20px;align-items:center;
}
.faq summary::-webkit-details-marker{display:none}
.faq summary:focus-visible{outline:3px solid var(--accent);outline-offset:3px;border-radius:var(--r-s)}
.faq summary::after{content:"+";font-size:24px;color:var(--accent);line-height:1}
.faq details[open] summary::after{content:"–"}
.faq .answer{padding:0 0 22px;color:var(--muted);max-width:70ch}

/* ---------------------------------------------------------------- stats */
.stat{display:flex;flex-direction:column;gap:2px}
.stat .n{font-family:var(--display);font-weight:800;font-size:clamp(30px,3.4vw,44px);letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.stat .k{font-family:var(--mono);font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--faint)}

/* ---------------------------------------------------------------- tables
   For a short list of facts — jobs and prices, sizes, what's included. */
.table{width:100%;border-collapse:collapse;font-size:15.5px}
.table th,.table td{text-align:left;padding:13px 10px;border-bottom:1px solid var(--line)}
.table th{
  font-family:var(--mono);font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--faint);font-weight:400;
}
.table td:last-child,.table th:last-child{text-align:right;font-variant-numeric:tabular-nums}
.table tr:last-child td{border-bottom:0}

/* --------------------------------------------------------------- avatars
   One head per file — four-heads-1 … four-heads-4 in the picture library,
   cut from the sheet there rather than cropped here. Each head is shot with
   air around it, so the picture is nudged in: the origin sits on the head,
   not on the middle of the tile. .faces overlaps them into the usual row. */
.face{
  position:relative;flex:none;overflow:hidden;border-radius:50%;
  width:56px;height:56px;
  background:var(--panel-2);border:1px solid var(--line);
}
.face img{width:100%;height:100%;object-fit:cover;transform:scale(1.28);transform-origin:56% 54%}
.face-s{width:40px;height:40px}
.faces{display:flex;align-items:center}
.faces .face{margin-right:-14px;box-shadow:0 0 0 3px var(--panel)}
.faces .face:last-child{margin-right:0}

/* ---------------------------------------------------------- small parts
   A row of cut-outs with a line of words under each — features, what's in
   the box, the four things this page does. */
.parts{display:grid;gap:var(--gap);grid-template-columns:repeat(4,1fr)}
@media (max-width:900px){ .parts{grid-template-columns:repeat(2,1fr)} }
.part{display:flex;flex-direction:column;align-items:center;text-align:center;gap:8px}
.part .cut{width:100%;max-width:150px}
.part h3{font-size:16px}
.part p{font-size:14px;color:var(--muted);margin:0}

/* -------------------------------------------------------- clay as ground
   A sheet of clay behind a line of words. Light and dark are separate
   pictures, and the veil over the top is what keeps the words readable —
   never drop text straight onto the texture. Add .band to run it edge to
   edge as a section instead of sitting in a rounded card. */
.texture-strip{
  position:relative;border-radius:var(--r-l);overflow:hidden;
  min-height:clamp(200px,26vw,300px);
  display:grid;place-items:center;text-align:center;
  border:1px solid var(--line);
}
.texture-strip img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.texture-strip .on-top{position:relative;z-index:2;padding:clamp(20px,3vw,34px)}
.texture-strip .on-top h3{margin-bottom:6px}
/* The veil is a fixed colour, so the words over it can't follow the page
   theme — a dark-mode grey on a pale veil goes unreadable. Re-point the
   colour tokens inside the strip and anything you drop in here comes with
   it: stats, pills, eyebrows, a table. */
.texture-strip.light .on-top{
  color:#211E27;
  --ink:#211E27; --muted:#4A4553; --faint:#5E5869;
  --line:rgba(33,30,39,.18); --line-lit:rgba(33,30,39,.3);
}
.texture-strip.dark .on-top{
  color:#F6F3F8;
  --ink:#F6F3F8; --muted:#D5CFDC; --faint:#BDB5C6;
  --line:rgba(246,243,248,.2); --line-lit:rgba(246,243,248,.34);
}
.texture-strip.light::after,.texture-strip.dark::after{
  content:"";position:absolute;inset:0;z-index:1;
}
.texture-strip.light::after{background:rgba(255,255,255,.42)}
.texture-strip.dark::after{background:rgba(10,8,12,.42)}
.texture-strip.band{
  border-radius:0;border-left:0;border-right:0;
  min-height:0;place-items:stretch;text-align:inherit;
}
.texture-strip.band .on-top{width:80%;max-width:1280px;margin-inline:auto}
@media (max-width:860px){ .texture-strip.band .on-top{width:90%} }

/* --------------------------------------------------------------- footer */
.foot{border-top:1px solid var(--line);padding-block:44px;color:var(--muted);font-size:15px}
.foot a{text-decoration:none;color:var(--muted)}
.foot a:hover{color:var(--ink)}
.foot .cols{display:grid;grid-template-columns:1.4fr repeat(3,1fr);gap:var(--gap)}
@media (max-width:760px){ .foot .cols{grid-template-columns:1fr 1fr} }

/* ------------------------------------------------------------- utilities */
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.skip{position:absolute;left:-9999px;top:0;z-index:100;background:var(--accent);color:var(--accent-ink);padding:12px 18px;border-radius:0 0 var(--r-m) 0}
.skip:focus{left:0}
.center{text-align:center}
.center .lede{margin-inline:auto}
.rule{display:flex;align-items:baseline;gap:16px;margin-bottom:clamp(22px,3vw,36px)}
.rule h2{margin:0}
.rule .line{flex:1;height:1px;background:var(--line)}
.rule .count{font-family:var(--mono);font-size:11.5px;letter-spacing:.14em;color:var(--faint)}
.theme-toggle{
  width:38px;height:38px;display:grid;place-items:center;
  background:var(--panel);border:1px solid var(--line);border-radius:var(--r-pill);cursor:pointer;
}
.theme-toggle:hover{background:var(--panel-2)}
.theme-toggle:focus-visible{outline:3px solid var(--accent);outline-offset:3px}

/* clay art sits on its own soft contact shadow */
.clay-art svg{width:100%;height:auto}
.float{animation:float 7s ease-in-out infinite}
@keyframes float{ 0%,100%{transform:translateY(0)} 50%{transform:translateY(-10px)} }
@media (prefers-reduced-motion: reduce){ .float{animation:none} }

/* ==========================================================================
   Motion — everything here jumps between poses instead of gliding, at roughly
   twelve steps a second, because that is how stop-motion moves. Anyone whose
   system asks for reduced motion gets none of it (see the block at the end).
   ========================================================================== */

/* people shift their weight on the spot */
.clay-art .bob{animation:clay-bob 1.25s steps(1,end) infinite}
@keyframes clay-bob{
  0%{transform:translateY(0)}
  25%{transform:translateY(-1.4px)}
  50%{transform:translateY(-2.4px)}
  75%{transform:translateY(-1px)}
}

/* a hot drink actually steams */
.clay-art .steam{opacity:0;animation:clay-steam 2.6s steps(1,end) infinite}
@keyframes clay-steam{
  0%{opacity:0;transform:translateY(0) scale(1)}
  10%{opacity:.42;transform:translateY(-3px)}
  22%{opacity:.55;transform:translateY(-8px)}
  34%{opacity:.42;transform:translateY(-13px) scale(1.15)}
  46%{opacity:.24;transform:translateY(-18px) scale(1.3)}
  58%{opacity:0;transform:translateY(-23px) scale(1.4)}
  100%{opacity:0}
}

/* the shimmer of a model re-shot frame by frame */
.clay-art .anim-boil,.clay-art.boil svg{animation:clay-boil .32s steps(1,end) infinite}
@keyframes clay-boil{
  0%{transform:translate(0,0) rotate(0deg)}
  33%{transform:translate(.9px,-.7px) rotate(.14deg)}
  66%{transform:translate(-.7px,.6px) rotate(-.12deg)}
}

/* press a model and it gives, like a thumb in clay */
.card.lift .clay-art,.swatch .clay-art{transition:transform .3s var(--press)}
.card.lift:hover .clay-art{transform:scale(1.035,.975)}
.slot .clay-art{transition:transform .3s var(--press)}
.card.lift:active .clay-art{transform:scale(1.06,.94)}

/* things arrive on set rather than fading in: three steps, then still */
html.js-reveal [data-reveal]{opacity:0;transform:translateY(14px)}
html.js-reveal [data-reveal].in{
  opacity:1;transform:translateY(0);
  transition:opacity .34s steps(3,end), transform .34s steps(3,end);
}

@media (prefers-reduced-motion: reduce){
  .clay-art .bob,.clay-art .steam,.clay-art .anim-boil,.clay-art.boil svg{animation:none}
  .clay-art .steam{opacity:.4}
  html.js-reveal [data-reveal]{opacity:1;transform:none;transition:none}
  .card.lift:hover .clay-art,.card.lift:active .clay-art{transform:none}
}
