:root{
  /* pulled from the original site: #1C012C page, earth indigo/slate, #F7E5FC lavender text */
  --night:#1c012c; --deep:#2a1a47; --indigo:#453b61; --slate:#9aa1bc;
  --lav:#f7e5fc; --lav-dim:#cdbbe0;
  /* iridescent film accents, from the soap in the photos */
  --teal:#6fe3d6; --pink:#ff8ad8; --gold:#ffd66b; --violet:#b48cff;
  --film:linear-gradient(100deg,var(--teal),var(--violet) 35%,var(--pink) 65%,var(--gold));
  --r:28px;
}
*{box-sizing:border-box;margin:0}
html{scroll-behavior:smooth}
body{background:var(--night);color:var(--lav);font:400 1.06rem/1.65 Figtree,system-ui,sans-serif;overflow-x:hidden}
img{max-width:100%;height:auto;display:block}
a{color:inherit}
h1,h2,h3{font-family:"Bricolage Grotesque",sans-serif;line-height:1.02;letter-spacing:-.02em}
.wrap{width:min(1160px,100% - 32px);margin-inline:auto}
.film{background:var(--film);-webkit-background-clip:text;background-clip:text;color:transparent}

#bubbles{position:fixed;inset:0;width:100%;height:100%;z-index:0;pointer-events:none}
main,header,footer{position:relative;z-index:1}

/* nav */
header{position:sticky;top:0;z-index:10;backdrop-filter:blur(14px) saturate(1.4);background:color-mix(in srgb,var(--night) 70%,transparent);border-bottom:1px solid #ffffff12}
header .wrap{display:flex;align-items:center;justify-content:space-between;height:68px;gap:16px}
.logo{font:800 1.35rem "Bricolage Grotesque";text-decoration:none;display:flex;align-items:center;gap:10px}
.logo i{width:26px;height:26px;border-radius:50%;background:radial-gradient(circle at 32% 30%,#fff9 0 12%,transparent 14%),conic-gradient(from 40deg,var(--teal),var(--violet),var(--pink),var(--gold),var(--teal));opacity:.9;box-shadow:inset 0 0 0 2px #ffffff30}
nav{display:flex;gap:26px;font-weight:600;font-size:.95rem}
nav a{text-decoration:none;opacity:.8}
nav a:hover{opacity:1}
.btn{display:inline-flex;align-items:center;gap:8px;padding:.8em 1.4em;border-radius:999px;font-weight:600;text-decoration:none;transition:transform .2s cubic-bezier(.3,1.6,.5,1)}
.btn:hover{transform:translateY(-2px) scale(1.03)}
.btn-film{background:var(--film);color:var(--night)}
.btn-ghost{border:1.5px solid #8b7fa8}
@media (max-width:980px){header nav{display:none}}

/* hero */
.hero{min-height:calc(100svh - 68px);display:grid;grid-template-columns:1.1fr .9fr;align-items:center;gap:40px;padding-block:48px}
.eyebrow{font-weight:600;letter-spacing:.14em;text-transform:uppercase;font-size:.78rem;color:var(--teal)}
.hero h1{font-size:clamp(3.2rem,8.5vw,7.2rem);font-weight:800;margin:.2em 0 .25em}
.hero p{font-size:1.2rem;max-width:34ch;color:var(--lav-dim)}
.hero .ctas{display:flex;gap:12px;flex-wrap:wrap;margin-top:28px}
.orb{position:relative;aspect-ratio:1;border-radius:50%;animation:float 9s ease-in-out infinite}
.orb img{width:100%;height:100%;object-fit:cover;object-position:40% 30%;border-radius:50%}
.orb::before{content:"";position:absolute;inset:-10px;border-radius:50%;padding:10px;background:conic-gradient(from var(--a,0deg),var(--teal),var(--violet),var(--pink),var(--gold),var(--teal));-webkit-mask:linear-gradient(#000 0 0) content-box exclude,linear-gradient(#000 0 0);mask:linear-gradient(#000 0 0) content-box exclude,linear-gradient(#000 0 0);opacity:.7;filter:blur(1px);animation:spin 12s linear infinite}
.orb::after{content:"";position:absolute;inset:0;border-radius:50%;background:radial-gradient(circle at 30% 24%,#ffffffb0 0 5%,transparent 16%),radial-gradient(circle at 50% 50%,transparent 60%,#b48cff40 80%,#6fe3d670);pointer-events:none}
@property --a{syntax:"<angle>";inherits:false;initial-value:0deg}
@keyframes spin{to{--a:360deg}}
@keyframes float{50%{transform:translateY(-14px) rotate(1.5deg)}}
.credit{font-size:.78rem;color:var(--slate);text-align:center;margin-top:14px}
@media (max-width:860px){.hero{grid-template-columns:1fr;text-align:left}.orb{max-width:420px;width:100%;margin-inline:auto;order:-1}}

/* stats strip */
.stats{display:grid;grid-template-columns:repeat(4,1fr);border-block:1px solid #ffffff14;background:#ffffff05}
.stats div{padding:28px 20px;border-left:1px solid #ffffff14}
.stats div:first-child{border-left:0}
.stats b{display:block;font:800 clamp(2rem,4vw,3rem) "Bricolage Grotesque"}
.stats span{color:var(--lav-dim);font-size:.92rem}
@media (max-width:760px){.stats{grid-template-columns:1fr 1fr}.stats div:nth-child(3){border-left:0}.stats div{border-top:1px solid #ffffff14}}

section{padding-block:clamp(72px,11vw,140px)}
.head{max-width:700px;margin-bottom:48px}
.head h2{font-size:clamp(2.4rem,5.5vw,4.2rem);margin:.25em 0 .35em}
.head p{color:var(--lav-dim);font-size:1.12rem}

/* show */
.cards{display:grid;grid-template-columns:repeat(3,1fr);gap:20px}
.card{background:linear-gradient(160deg,#ffffff0d,#ffffff03);border:1px solid #ffffff17;border-radius:var(--r);overflow:hidden;transition:transform .35s cubic-bezier(.3,1.4,.5,1),border-color .3s}
.card:hover{transform:translateY(-6px);border-color:#b48cff66}
.card img{aspect-ratio:4/3;width:100%;object-fit:cover}
.card div{padding:22px 24px 26px}
.card h3{font-size:1.45rem;margin-bottom:.35em}
.card p{color:var(--lav-dim);font-size:.98rem}
@media (max-width:860px){.cards{grid-template-columns:1fr}}

.rules{margin-top:56px;display:grid;grid-template-columns:auto 1fr;gap:28px 48px;align-items:start;padding:36px;border-radius:var(--r);background:var(--deep)}
.rules h3{font-size:1.7rem;max-width:12ch}
.rules ol{list-style:none;padding:0;display:grid;grid-template-columns:repeat(3,1fr);gap:20px;counter-reset:r}
.rules li{counter-increment:r;color:var(--lav-dim)}
.rules li::before{content:counter(r);display:grid;place-items:center;width:40px;height:40px;border-radius:50%;margin-bottom:10px;font:800 1.1rem "Bricolage Grotesque";color:var(--night);background:var(--film)}
.rules li strong{color:var(--lav);display:block}
@media (max-width:860px){.rules{grid-template-columns:1fr}.rules ol{grid-template-columns:1fr}}

/* bubbleosophy */
.poem{text-align:center;background:radial-gradient(ellipse at 50% 40%,#453b6188,transparent 65%)}
.poem blockquote{font:500 clamp(1.4rem,3vw,2.15rem)/1.45 "Bricolage Grotesque";max-width:26ch;margin:0 auto;letter-spacing:-.01em}
.poem blockquote em{font-style:normal}
.poem cite{display:block;margin-top:32px;font:italic 400 1rem Figtree;color:var(--slate)}

/* gallery */
.grid{columns:4 240px;column-gap:14px}
.grid a{cursor:zoom-in;display:block;margin-bottom:14px;border-radius:18px;overflow:hidden;break-inside:avoid;position:relative}
.grid a:focus-visible{outline:3px solid var(--teal);outline-offset:3px}
.grid img{width:100%;transition:transform .6s cubic-bezier(.2,.8,.2,1),filter .4s}
.grid a:hover img{transform:scale(1.05);filter:saturate(1.2)}
dialog{border:0;padding:0;background:transparent;max-width:min(92vw,900px);margin:auto}
dialog::backdrop{background:#0d0016e6;backdrop-filter:blur(8px)}
dialog img{border-radius:20px;max-height:80vh;width:auto;margin:auto}
dialog p{text-align:center;color:var(--lav-dim);margin-top:10px;font-size:.9rem}

/* praise */
.praise{display:grid;grid-template-columns:1.3fr 1fr;gap:20px}
.quote{padding:44px;border-radius:var(--r);background:var(--film);color:var(--night)}
.quote p{font:600 clamp(1.3rem,2.3vw,1.7rem)/1.35 "Bricolage Grotesque"}
.quote footer{margin-top:22px;font-weight:600}
.award{padding:44px;border-radius:var(--r);border:1px solid #ffffff1c;display:flex;flex-direction:column;justify-content:space-between;gap:24px}
.award b{font:800 3.4rem/1 "Bricolage Grotesque"}
.award p{color:var(--lav-dim)}
@media (max-width:860px){.praise{grid-template-columns:1fr}}

/* contact */
.contact{display:grid;grid-template-columns:1fr 1fr;gap:48px;align-items:start}
.note{padding:28px;border-radius:var(--r);background:#ffd66b14;border:1px solid #ffd66b40;color:var(--lav-dim)}
.note strong{color:var(--gold)}
.ways{display:grid;gap:12px}
.ways a,.ways div{display:flex;gap:16px;align-items:center;padding:20px 22px;border-radius:20px;background:#ffffff08;border:1px solid #ffffff14;text-decoration:none;transition:background .2s}
.ways a:hover{background:#ffffff12}
.ways small{display:block;color:var(--slate);font-size:.8rem;text-transform:uppercase;letter-spacing:.1em}
.ways span:first-child{font-size:1.5rem}
.riddle{margin-top:28px;font-style:italic;color:var(--lav-dim)}
@media (max-width:860px){.contact{grid-template-columns:1fr}}

footer.site{border-top:1px solid #ffffff14;padding-block:40px;color:var(--slate);font-size:.9rem}
footer.site .wrap{display:flex;flex-wrap:wrap;gap:12px 28px;justify-content:space-between}

/* reveal */
.js .rv{opacity:0;transform:translateY(24px);transition:opacity .8s,transform .8s cubic-bezier(.2,.8,.2,1)}
.js .rv.in{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important}.js .rv{opacity:1;transform:none}html{scroll-behavior:auto}}

nav a[aria-current]{opacity:1;color:var(--teal)}
/* all-pages menu */
.menu{position:relative}
.menu summary{list-style:none;cursor:pointer;padding:.7em 1.2em;border-radius:999px;background:var(--film);color:var(--night);font-weight:600;font-size:.95rem}
.menu summary::-webkit-details-marker{display:none}
.menu-panel{position:absolute;right:0;top:calc(100% + 10px);width:min(640px,calc(100vw - 32px));display:grid;grid-template-columns:repeat(2,1fr);gap:20px 28px;padding:24px;border-radius:22px;background:var(--deep);border:1px solid #ffffff1c;box-shadow:0 24px 60px #0008}
.navh{margin:0 0 8px;font:600 .72rem Figtree;letter-spacing:.14em;text-transform:uppercase;color:var(--teal);margin-bottom:8px}
.menu-panel a,.sitemap a{display:block;padding:10px 0;text-decoration:none;opacity:.85}
.menu-panel a:hover,.sitemap a:hover{opacity:1;color:var(--pink)}
footer.site .wrap{display:block}
.sitemap{display:grid;grid-template-columns:repeat(4,1fr);gap:24px;margin-bottom:32px;color:var(--lav)}
@media (max-width:760px){.sitemap{grid-template-columns:1fr 1fr}.menu-panel{grid-template-columns:1fr;max-height:70vh;overflow:auto}}

/* inner pages */
.page-hero{padding-block:clamp(56px,9vw,110px) clamp(24px,4vw,48px)}
.page-hero h1{font-size:clamp(2.6rem,7vw,5.4rem);font-weight:800;margin:.2em 0 .25em;max-width:16ch}
.page-hero p{font-size:1.18rem;color:var(--lav-dim);max-width:52ch}
main>.wrap:last-child{padding-bottom:clamp(72px,10vw,120px)}
.prose{max-width:720px;font-size:1.1rem}
.prose p{margin-bottom:1.1em}
.prose p strong{color:#fff}
.prose a{color:var(--teal)}
.prose img{border-radius:20px;margin:28px 0;max-width:100%;height:auto}
.prose, .gallery-page, .movies-page, .gb-page, .contact-page{position:relative}
.prose{padding:clamp(24px,4vw,48px);border-radius:var(--r);background:color-mix(in srgb,var(--night) 82%,transparent);border:1px solid #ffffff12}
h2{font-size:clamp(1.8rem,3.6vw,2.6rem);margin:1.6em 0 .3em}
.sub{color:var(--lav-dim);margin-bottom:24px}
.chips{display:flex;flex-wrap:wrap;gap:10px}
.chips a{padding:.55em 1.1em;border-radius:999px;border:1px solid #ffffff30;text-decoration:none;font-weight:600;font-size:.92rem}
.chips a:hover{background:#ffffff12}
.embed{position:relative;aspect-ratio:16/9;border-radius:20px;overflow:hidden;background:#000}
.embed iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.embed.wide{aspect-ratio:3/2}
.vids{display:grid;grid-template-columns:repeat(2,1fr);gap:28px}
.vids.small{grid-template-columns:repeat(4,1fr);gap:20px}
.vid figcaption{margin-top:10px;font-weight:600}
.vid video{width:100%;border-radius:18px;background:#000;aspect-ratio:4/3;object-fit:cover}
@media (max-width:860px){.vids{grid-template-columns:1fr}.vids.small{grid-template-columns:1fr 1fr}}
.gbs{columns:3 280px;column-gap:18px}
.gb{break-inside:avoid;margin:0 0 18px;padding:22px 24px;border-radius:20px;background:#ffffff08;border:1px solid #ffffff14}
.gb p{font-size:1.02rem}
.gb footer{margin-top:10px;color:var(--slate);font-size:.85rem}
.contact-page .contact{align-items:start}
.contact-page .note{margin-bottom:24px}
.contact-page .note a,.contact-page p a{color:var(--teal)}
.book{display:grid;gap:14px;padding:32px;border-radius:var(--r);background:var(--deep);border:1px solid #ffffff17}
.book h2{margin:0}
.book label{display:grid;gap:6px;font-weight:600;font-size:.92rem}
.book input,.book textarea{font:inherit;color:var(--lav);background:#ffffff0c;border:1px solid #8b7fa8;border-radius:12px;padding:.7em .9em;color-scheme:dark}
.book input:focus,.book textarea:focus{outline:2px solid var(--teal);outline-offset:1px}
.book .two{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.book .three{display:grid;grid-template-columns:2fr 1fr 1fr;gap:14px}
.book button{justify-self:start;border:0;cursor:pointer;font:inherit;font-weight:600}
@media (max-width:560px){.book .two,.book .three{grid-template-columns:1fr}}
/* lightbox controls */
.lb-ctl{display:flex;justify-content:center;gap:12px;margin-top:12px}
.lb-ctl button{width:48px;height:48px;border-radius:50%;border:0;background:var(--lav);color:var(--night);font-size:1.5rem;cursor:pointer}
.lb-ctl button:focus-visible{outline:3px solid var(--teal);outline-offset:2px}
.prose .pager a{color:inherit}.prose .pager{margin-top:32px}

/* review fixes: focus, skip link, pause, credits, poem */
:focus-visible{outline:3px solid var(--teal);outline-offset:3px}
.skip{position:absolute;left:16px;top:-60px;z-index:20;padding:.7em 1.2em;border-radius:999px;background:var(--lav);color:var(--night);font-weight:600;text-decoration:none}
.skip:focus{top:12px}
.pause{margin-top:20px;padding:.6em 1.2em;min-height:44px;border-radius:999px;border:1.5px solid #8b7fa8;background:transparent;color:var(--lav);font:600 .9rem Figtree;cursor:pointer}
.paused .orb,.paused .orb::before{animation:none}
.card .credit{display:block;margin-top:12px;text-align:left}
.h-big{font-size:clamp(2.4rem,5.5vw,4.2rem);margin:.25em 0 .4em}
h2.eyebrow{font-family:Figtree,sans-serif;margin:0 0 20px}
.poem blockquote p{margin-bottom:1em}
.prose h2{font-size:1.6rem;margin:0 0 .6em}
.prose ul{padding-left:1.2em;margin-bottom:1.1em}
.prose li{margin-bottom:.6em}

/* ---- round 2: calmer accents, daylight recipe, page types ---- */
.eyebrow{font-size:.82rem}
.hero h1{max-width:9ch}
.lede{font-size:1.2rem;color:var(--lav-dim);max-width:36ch}
.stats{margin-top:8px;border-radius:24px;overflow:hidden}
.stats b{color:var(--lav)}

.garry{padding-block:clamp(56px,8vw,96px) 0}
.note-from{max-width:820px}
.note-from blockquote p{font:600 clamp(1.5rem,3vw,2.3rem)/1.3 "Bricolage Grotesque";letter-spacing:-.01em;margin-bottom:.6em}
.note-from blockquote p.aside{font:italic 400 1.1rem/1.5 Figtree;color:var(--lav-dim);letter-spacing:0}
.phone-line{font-size:1.1rem}
.phone-line a,.note-from .more{color:var(--teal)}
.note-from .more{display:inline-block;margin-top:10px;font-weight:600}

/* the one light section: outdoor bubbles read better on daylight */
.recipe{--ink:#1c012c;color:var(--ink);background:linear-gradient(160deg,#f3ecfa,#e4f5f1 70%,#fff6dc);position:relative;z-index:1}
.recipe .eyebrow{color:#6b3fa0}
.recipe h2{font-size:clamp(2.2rem,5vw,3.6rem);margin:.2em 0 .4em}
.recipe p{max-width:58ch;margin-bottom:1em;color:#3d2c55}
.recipe-grid{display:grid;grid-template-columns:1.4fr 1fr;gap:48px;align-items:start}
.kit{list-style:none;padding:0;margin:0 0 1.2em;display:grid;gap:8px}
.kit li{padding:12px 16px;border-radius:14px;background:#fff;box-shadow:0 6px 18px #1c012c14;font-weight:600}
.kit li::before{content:"○";margin-right:10px;color:#6b3fa0}
.recipe .btn-film{color:var(--night)}
.weather{padding:28px;border-radius:24px;background:#fff;box-shadow:0 20px 40px #1c012c1f}
.wx-verdict{font:700 1.5rem/1.25 "Bricolage Grotesque";color:var(--ink)!important;margin:.3em 0}
.wx-detail{font-size:.95rem}
.wx-indoor{color:#6b3fa0;font-weight:600}
@media (max-width:860px){.recipe-grid{grid-template-columns:1fr}}

/* poem: left-set, refrains answer from the right */
.poem{text-align:left}
.poem .wrap{max-width:760px}
.poem blockquote{max-width:34ch;margin:0}
.poem blockquote em{display:block;text-align:right;color:var(--teal);font-style:italic}
.poem cite{text-align:left}

.van{position:relative;margin:0;height:min(64vh,560px);overflow:hidden}
.van img{width:100%;height:100%;object-fit:cover;object-position:50% 60%;filter:saturate(1.1)}
.van::after{content:"";position:absolute;inset:0;background:var(--film);mix-blend-mode:soft-light;opacity:.45;pointer-events:none}
.van::before{content:"";position:absolute;inset:auto 0 0;height:55%;background:linear-gradient(transparent,#1c012ce6);z-index:1}
.van figcaption{position:absolute;left:0;right:0;bottom:0;z-index:2;width:min(1160px,100% - 32px);margin:0 auto;padding-bottom:36px;display:flex;justify-content:space-between;align-items:end;gap:16px}
.van figcaption span{font:800 clamp(2rem,6vw,4.4rem)/1 "Bricolage Grotesque"}
.van figcaption small{color:var(--lav-dim)}

/* praise: quieter quote, award as a seal */
.quote{background:transparent;color:var(--lav);padding:24px 0 0 56px;position:relative}
.quote::before{content:"“";position:absolute;left:0;top:-10px;font:800 6rem/1 "Bricolage Grotesque";background:var(--film);-webkit-background-clip:text;background-clip:text;color:transparent}
.quote p{font:600 clamp(1.4rem,2.6vw,2rem)/1.35 "Bricolage Grotesque"}
.quote footer{color:var(--lav-dim)}
.award{justify-self:center;align-self:center;aspect-ratio:1;max-width:320px;border-radius:50%;border:2px dashed #b48cff99;padding:40px;text-align:center;justify-content:center;transform:rotate(-6deg)}
.award b{font-size:1.6rem;line-height:1.1}

.signoff{padding-top:64px;max-width:760px}
.signoff p{font:600 clamp(1.3rem,2.4vw,1.8rem)/1.4 "Bricolage Grotesque"}
.signoff .sig{font:italic 400 1.05rem Figtree;color:var(--lav-dim);margin-top:12px}

/* inner pages: align with the title, one layout per content type */
.prose{margin-left:max(16px,calc((100% - 1160px)/2));margin-right:auto}
.poem-page{background:none;border:0;padding:0;max-width:34em}
.poem-page p{font:500 clamp(1.15rem,2vw,1.4rem)/1.55 "Bricolage Grotesque";margin-bottom:1.3em}
.poem-page p strong{font-weight:700;color:var(--teal)}
.list-page ul{list-style:none;padding:0;counter-reset:m;display:grid;grid-template-columns:1fr 1fr;gap:18px 28px}
.list-page li{counter-increment:m;position:relative;padding-left:52px;margin:0}
.list-page li::before{content:counter(m);position:absolute;left:0;top:-2px;width:38px;height:38px;border-radius:50%;display:grid;place-items:center;font:800 .95rem "Bricolage Grotesque";color:var(--night);background:var(--film)}
@media (max-width:760px){.list-page ul{grid-template-columns:1fr}}
.letter-page{background:#f6effa;color:#2a1a47;border:0;max-width:66ch;box-shadow:0 30px 60px #0006;transform:rotate(-.3deg)}
.letter-page p strong,.letter-page h2{color:#1c012c}
.letter-page a{color:#6b3fa0}
.letter-page li{color:#2a1a47}
.gallery-page h2{padding-bottom:10px;border-bottom:2px solid;border-image:var(--film) 1}
dialog img{max-width:min(92vw,640px)}
html:not(.js) .pause{display:none}

@media print{
  #bubbles,header,footer.site,.skip,.van,.weather,dialog,.pause{display:none!important}
  body{background:#fff;color:#000}
  .recipe,.prose,.letter-page{background:#fff!important;box-shadow:none;transform:none;color:#000}
  a{color:#000}
}
#toast{position:fixed;left:50%;bottom:24px;transform:translate(-50%,140%);max-width:min(520px,calc(100vw - 32px));padding:14px 20px;border-radius:18px;background:var(--lav);color:var(--night);font-weight:600;box-shadow:0 20px 40px #0008;transition:transform .5s cubic-bezier(.3,1.4,.5,1);z-index:30}
#toast.on{transform:translate(-50%,0)}

/* ---- round 3 ---- */
.orb-pair{position:relative}
.orb-small{position:absolute;width:34%;left:-6%;bottom:-4%;z-index:2;animation-duration:7s;animation-delay:-2s;box-shadow:0 20px 40px #0007}
.orb-small::before{animation-direction:reverse;animation-duration:9s}
.orb-pair>.orb:last-child{box-shadow:0 60px 80px -40px #b48cff55}

/* stats as a loose cluster of bubbles */
.stats{display:flex;flex-wrap:wrap;justify-content:center;gap:clamp(12px,3vw,40px);border:0;background:none;padding-block:24px}
.stats div{border:0;width:clamp(150px,19vw,210px);aspect-ratio:1;border-radius:50%;display:grid;place-content:center;text-align:center;padding:18px;
  background:radial-gradient(circle at 30% 25%,#ffffff40 0 5%,transparent 14%),radial-gradient(circle at 50% 50%,transparent 58%,#b48cff2e 78%,#6fe3d64d),#ffffff06;
  box-shadow:inset 0 0 0 1px #ffffff22}
.stats div:nth-child(2){width:clamp(170px,22vw,240px);transform:translateY(-14px)}
.stats div:nth-child(3){transform:translateY(10px)}
.stats span{font-size:.85rem;line-height:1.3}
@media (max-width:760px){.stats div{width:calc(50% - 12px);border-top:0}.stats div:nth-child(n){transform:none}}

/* about page photo strip */
.strip{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;columns:auto;margin:0 0 32px}
.strip a{margin:0;border-radius:16px}
.strip img{aspect-ratio:1;object-fit:cover}
@media (max-width:620px){.strip{grid-template-columns:1fr 1fr}}

/* YouTube: thumbnail until clicked */
.yt{all:unset;position:absolute;inset:0;cursor:pointer;display:block}
.yt img{width:100%;height:100%;object-fit:cover;filter:saturate(1.1) brightness(.85);transition:filter .3s}
.yt span{position:absolute;left:50%;top:50%;width:76px;height:76px;margin:-38px 0 0 -38px;border-radius:50%;background:var(--film);box-shadow:0 10px 30px #0008;transition:transform .25s cubic-bezier(.3,1.6,.5,1)}
.yt span::after{content:"";position:absolute;left:31px;top:24px;border-style:solid;border-width:14px 0 14px 22px;border-color:transparent transparent transparent var(--night)}
.yt:hover img,.yt:focus-visible img{filter:saturate(1.2) brightness(1)}
.yt:hover span,.yt:focus-visible span{transform:scale(1.1)}
.yt:focus-visible{outline:3px solid var(--teal);outline-offset:-3px}
@media (max-width:860px){.orb-small{left:0;bottom:-2%}}

/* Bubble Machine: a small toy box beside the page. */
.bm-dock{position:fixed;right:20px;bottom:max(16px,env(safe-area-inset-bottom));z-index:45;display:flex;gap:8px;align-items:center}
.bm-launch,.bm-quick{display:flex;align-items:center;justify-content:center;gap:10px;min-height:48px;border:1px solid #ffffff30;border-radius:999px;cursor:pointer;background:var(--deep);color:var(--lav);font:600 .95rem Figtree,sans-serif;box-shadow:0 8px 28px #0005}
.bm-launch{padding:6px 16px 6px 6px}.bm-quick{padding:0 16px;min-width:72px}
.bm-launch:hover,.bm-quick:hover{background:#453b61}.bm-launch[aria-expanded=true]{border-color:var(--teal)}
.bm-dot{width:34px;height:34px;border-radius:50%;background:radial-gradient(circle at 32% 28%,#fffc 0 10%,transparent 16%),conic-gradient(from 40deg,var(--teal),var(--violet),var(--pink),var(--gold),var(--teal));box-shadow:inset 0 0 0 2px #ffffff40}
.bm-panel{position:fixed;right:20px;bottom:80px;z-index:44;width:min(380px,calc(100vw - 32px));max-height:calc(100dvh - 112px);padding:0;border-radius:24px;overflow:hidden;display:flex;flex-direction:column;color:var(--lav);background:#2a1a47f5;backdrop-filter:blur(18px);border:1px solid #ffffff26;box-shadow:0 24px 64px #0009;font-size:.95rem;line-height:1.4}
.bm-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px 18px 10px;flex:none}
.bm-head h2{font-size:1.3rem;margin:0 0 3px}.bm-pops{font-size:.78rem;color:var(--lav-dim);font-variant-numeric:tabular-nums}.bm-pops b{color:var(--gold)}
.bm-x{width:44px;height:44px;flex:none;border-radius:50%;border:0;background:#ffffff10;color:var(--lav);font-size:1.6rem;cursor:pointer}
.bm-tabs{display:flex;gap:4px;padding:0 18px 10px;flex:none;border-bottom:1px solid #ffffff16}
.bm-tabs button{flex:1;min-height:44px;border:0;border-radius:12px;color:var(--lav-dim);background:transparent;font:600 .95rem Figtree,sans-serif;cursor:pointer}
.bm-tabs button[aria-selected=true]{color:var(--lav);background:#ffffff13;box-shadow:inset 0 -2px var(--teal)}
.bm-scroll{overflow-y:auto;overscroll-behavior:contain;min-height:0;padding:16px 18px;scrollbar-width:thin;scrollbar-color:#b48cff88 transparent}
.bm-presets{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:16px}
.bm-presets button{min-height:58px;display:flex;align-items:center;gap:9px;padding:8px 10px;text-align:left;border:1px solid #ffffff20;border-radius:14px;background:#ffffff05;color:var(--lav);cursor:pointer;font:inherit}
.bm-presets button:hover{background:#ffffff10}.bm-presets button[aria-pressed=true]{border-color:var(--teal);background:#6fe3d612}
.bm-presets strong{display:block;font-size:.83rem;font-weight:650;line-height:1.3}.bm-presets small{display:block;font-size:.69rem;color:var(--lav-dim);margin-top:3px}
.bm-preset-orb{flex:none;width:23px;height:23px;border-radius:50%;box-shadow:inset 2px 2px 3px #fff7,inset -2px -2px 4px #0004}
.bm-panel fieldset{border:0;padding:0;margin:0;min-width:0}.bm-panel legend{font-weight:600;font-size:.85rem;margin-bottom:10px;padding:0}
.bm-tools{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}
.bm-tools input,.bm-themes input,.bm-modes input{position:absolute;opacity:0;width:1px;height:1px}
.bm-tools label span,.bm-modes label span{display:flex;align-items:center;justify-content:center;min-height:44px;padding:0 12px;border-radius:12px;background:#ffffff09;border:1px solid #ffffff24;font-size:.85rem;font-weight:600;cursor:pointer}
.bm-tools input:checked+span{background:var(--film);color:var(--night);border-color:transparent}
.bm-help{min-height:2.8em;margin:10px 0 14px;font-size:.83rem;color:var(--lav-dim)}
.bm-actions{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.bm-actions button,.bm-allow{min-height:44px;border-radius:12px;border:0;font:700 .9rem Figtree,sans-serif;cursor:pointer;padding:8px 12px}
.bm-storm{background:var(--film);color:var(--night)}.bm-popall{background:#ffffff10;color:var(--lav);box-shadow:inset 0 0 0 1px #ffffff30}
.bm-slider{margin-bottom:16px}.bm-row{display:flex;justify-content:space-between;gap:8px;font-weight:600;font-size:.86rem}.bm-row output{color:var(--teal);font-weight:500;font-variant-numeric:tabular-nums}
.bm-panel input[type=range]{display:block;width:100%;accent-color:var(--violet);height:36px;margin:0;cursor:pointer}
.bm-scale{display:flex;justify-content:space-between;color:var(--lav-dim);font-size:.7rem;margin-top:-2px}
.bm-themes{display:grid;grid-template-columns:repeat(3,1fr);gap:14px 8px}
.bm-themes label{display:grid;justify-items:center;gap:6px;cursor:pointer;font-size:.75rem;color:var(--lav-dim);text-align:center;padding:4px}
.bm-sw{width:44px;height:44px;border-radius:50%;box-shadow:inset 0 0 0 2px #ffffff30;position:relative}
.bm-sw::after{content:"";position:absolute;left:9px;top:7px;width:10px;height:6px;border-radius:50%;background:#fffc;transform:rotate(-30deg)}
.bm-themes input:checked+.bm-sw{box-shadow:0 0 0 3px var(--deep),0 0 0 5px var(--teal)}
.bm-themes input:checked~.bm-name{color:var(--lav);font-weight:600}
.bm-tools input:focus-visible+span,.bm-themes input:focus-visible+.bm-sw,.bm-modes input:focus-visible+span{outline:3px solid var(--teal);outline-offset:3px}
.bm-modes{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.bm-modes label span{padding:0 8px;font-size:.78rem}
.bm-modes input:checked+span{background:#6fe3d618;border-color:var(--teal);color:var(--teal)}
.bm-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 18px;border-top:1px solid #ffffff16;flex:none;background:#25163e}
.bm-check{display:flex;gap:9px;align-items:center;font-size:.83rem;cursor:pointer;min-height:44px}.bm-check input{width:20px;height:20px;accent-color:var(--violet);margin:0}
.bm-reset{min-height:44px;padding:0 12px;border:0;background:transparent;color:var(--lav-dim);font:600 .83rem Figtree,sans-serif;cursor:pointer}
.bm-note,.bm-motion{font-size:.82rem;color:var(--lav-dim);margin:12px 0 0}.bm-motion{padding:12px;border-radius:12px;background:#ffd66b14;margin:0 0 14px}.bm-allow{display:block;margin-top:10px;background:var(--gold);color:var(--night)}
.bm-playbar{position:fixed;left:50%;top:84px;transform:translateX(-50%);z-index:43;display:flex;align-items:center;gap:16px;width:max-content;max-width:calc(100vw - 32px);padding:10px 12px 10px 18px;border:1px solid #ffffff30;border-radius:20px;background:var(--deep);color:var(--lav);box-shadow:0 8px 30px #0006}
.bm-playhint{font-size:.85rem;max-width:36ch}.bm-playbar button{min-height:44px;flex:none;border:0;border-radius:12px;padding:0 14px;background:var(--lav);color:var(--night);font:600 .85rem Figtree,sans-serif;cursor:pointer}
.bm-playing #bubbles{z-index:20;pointer-events:auto;touch-action:none;cursor:crosshair;background:#1c012c20}.bm-grabbing #bubbles{cursor:grab}.bm-grabbing.bm-blowing #bubbles{cursor:grabbing}
.bm-blowing,.bm-blowing *{-webkit-user-select:none;user-select:none}
.bm-typing .bm-dock{visibility:hidden}
.play-machine{background:none;border:0;padding:0;margin-top:14px;color:var(--teal);font:600 1rem Figtree,sans-serif;cursor:pointer;text-decoration:underline;text-underline-offset:4px}
#toast{top:84px;bottom:auto;z-index:46;pointer-events:none;transform:translate(-50%,-160%);opacity:0;visibility:hidden;transition:opacity .2s,transform .2s;}
#toast.on{transform:translate(-50%,0);opacity:1;visibility:visible}
footer.site{padding-bottom:96px}
@media (max-width:600px){
  .bm-dock{right:12px;bottom:max(12px,env(safe-area-inset-bottom))}.bm-launch{padding-right:12px}.bm-launch .bm-label{font-size:.83rem}.bm-quick{font-size:.83rem;min-width:64px;padding:0 12px}
  .bm-panel{right:10px;bottom:72px;width:calc(100vw - 20px);max-height:min(62dvh,560px);border-radius:22px}
  .bm-head{padding:12px 14px 8px}.bm-tabs{padding:0 14px 8px}.bm-scroll{padding:12px 14px}.bm-foot{padding:4px 14px}
  .bm-presets{margin-bottom:12px}.bm-presets button{min-height:52px}.bm-help{margin:8px 0 12px}
  .bm-playbar{top:78px;padding:10px 12px;gap:8px}.bm-playhint{font-size:.78rem}.bm-playbar button{font-size:.78rem;padding:0 10px}
  #toast{top:78px;font-size:.85rem;width:calc(100vw - 32px)}
}
@media print{.bm-dock,.bm-panel,.bm-playbar,#toast{display:none!important}}

/* hidden must win over the display:grid/flex set on components (the machine panel was showing while "hidden") */
[hidden]{display:none!important}

/* gallery photographer filter */
.filters{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 8px}
.filters button{min-height:40px;padding:0 14px;border-radius:999px;border:0;background:#ffffff10;box-shadow:inset 0 0 0 1px #ffffff2a;color:var(--lav);font:600 .9rem Figtree,sans-serif;cursor:pointer}
.filters button span{color:var(--lav-dim);font-weight:400;margin-left:4px}
.filters button[aria-pressed=true]{background:var(--film);color:var(--night);box-shadow:none}
.filters button[aria-pressed=true] span{color:var(--night)}
.filter-status{font-size:.9rem;color:var(--lav-dim);min-height:1.4em;margin:0 0 16px}


@media (max-width:360px){.bm-presets small{display:none}.bm-presets button{min-height:48px}.bm-presets strong{font-size:.78rem}.bm-preset-orb{width:20px;height:20px}}

/* A more immediate introduction to Garry. */
.hero .hero-update{font-size:.85rem;line-height:1.5;color:var(--lav-dim);max-width:48ch;margin-top:20px}
.hero-update a{text-underline-offset:3px;color:var(--teal)}
.hero .play-machine{display:inline-flex;align-items:center;gap:10px;font-size:1.02rem;min-height:44px;text-decoration:none}
.hero .play-machine span{font-size:1.8rem;line-height:1;color:var(--pink)}
.hero .play-machine:hover{text-decoration:underline;text-underline-offset:5px}
@media (max-width:860px){
  .hero{min-height:0;padding-block:32px 48px;gap:0}
  .hero-copy{display:contents}.hero .eyebrow{order:1}.hero h1{order:2;max-width:none;font-size:clamp(2.6rem,8.7vw,4.6rem);margin:.25em 0 .6em}
  .hero-portrait{order:3;width:min(70vw,340px);justify-self:center;margin:0 0 28px}
  .hero .lede{order:4;font-size:1.1rem;max-width:42ch}.hero .ctas{order:5;margin-top:22px;gap:8px}.hero .ctas .btn{font-size:.92rem;padding:.8em 1.15em}
  .hero .play-machine{order:6;margin-top:14px;justify-self:start}.hero .hero-update{order:7;margin-top:12px;max-width:46ch}
  .hero .orb-small{width:30%;left:-5%}.hero .credit{font-size:.7rem;margin-top:18px}
}

/* The playground has its own scene and keeps the story's scroll position. */
html.bm-playground,html.bm-playground body{overflow:hidden}
.bm-playground #bubbles{z-index:20;pointer-events:auto;touch-action:none;background:radial-gradient(ellipse at 14% 90%,#493072,transparent 58%),radial-gradient(ellipse at 85% 10%,#174752,transparent 60%),#140823;cursor:crosshair}
.bm-playground.bm-daylight #bubbles{background:radial-gradient(ellipse at 20% 80%,#fff8e8,transparent 60%),linear-gradient(145deg,#9ad6ea,#d5d1f3 65%,#e9c9dd)}
.bm-stage{position:fixed;inset:0;z-index:21;pointer-events:none;color:var(--lav);font-family:Figtree,system-ui,sans-serif}
.bm-stage button,.bm-stage .bm-panel,.bm-stage .bm-dock{pointer-events:auto}
.bm-stage-head{position:absolute;top:32px;left:40px;right:40px;display:flex;justify-content:space-between;align-items:start;gap:24px}
.bm-stage-label{display:block;font-size:.9rem;color:var(--teal);margin-bottom:12px}
.bm-stage-head h2{font-size:clamp(1.7rem,3.5vw,3.4rem);line-height:1.12;max-width:15ch;font-weight:600;margin:0}
.bm-stage-head button,.bm-stage-meta button{min-height:44px;padding:0 16px;border:1px solid #ffffff40;border-radius:999px;background:#ffffff0a;color:inherit;font:600 .85rem Figtree,sans-serif;cursor:pointer}
.bm-stage-help{position:absolute;top:205px;left:40px;max-width:32ch;color:var(--lav-dim);font-size:.95rem;line-height:1.5}
.bm-stage-bottom{position:absolute;left:50%;bottom:24px;transform:translateX(-50%);display:flex;gap:10px;align-items:center;padding:8px;background:#2a1a47e8;border:1px solid #ffffff26;border-radius:20px;box-shadow:0 12px 40px #0003;color:var(--lav)}
.bm-stage-tools{display:flex;gap:4px}.bm-stage-tools button,.bm-make{min-height:44px;min-width:64px;border:0;border-radius:12px;font:600 .9rem Figtree,sans-serif;padding:0 14px;cursor:pointer;white-space:nowrap}
.bm-stage-tools button{background:transparent;color:var(--lav-dim)}.bm-stage-tools button[aria-pressed=true]{background:var(--film);color:var(--night)}.bm-make{background:#ffffff14;color:var(--lav)}.bm-make:disabled{opacity:.45;cursor:default}
.bm-stage-meta{position:absolute;left:40px;bottom:28px;display:flex;align-items:center;gap:20px;font-size:.85rem}.bm-stage-meta b{font-variant-numeric:tabular-nums}.bm-stage-meta span{color:var(--lav-dim)}
.bm-daylight .bm-stage-head,.bm-daylight .bm-stage-help,.bm-daylight .bm-stage-meta,.bm-daylight .bm-stage-label,.bm-daylight .bm-stage-meta span{color:#322043}
.bm-daylight .bm-stage-head button,.bm-daylight .bm-stage-meta button{border-color:#32204350;background:#ffffff40}
.bm-enter{display:block;width:100%;min-height:44px;margin-top:12px;background:none;border:0;border-top:1px solid #ffffff20;color:var(--teal);font:600 .85rem Figtree,sans-serif;cursor:pointer;padding:12px 0 0}
@media (max-width:1000px){.bm-stage-bottom{bottom:84px}.bm-stage-meta{bottom:22px;left:20px;gap:10px}.bm-stage-head{left:24px;right:24px;top:24px}.bm-stage-help{left:24px;top:175px}}
@media (max-width:600px){
  .bm-stage-head{top:20px;left:20px;right:20px;gap:12px;align-items:start}.bm-stage-label{font-size:.75rem;margin-bottom:8px}.bm-stage-head h2{font-size:1.9rem;max-width:11ch}.bm-stage-head button{font-size:.73rem;padding:0 12px;max-width:108px;line-height:1.3}
  .bm-stage-help{top:174px;left:20px;right:20px;font-size:.85rem;max-width:32ch}
  .bm-stage-bottom{bottom:86px;gap:4px;padding:6px;border-radius:18px;max-width:calc(100vw - 24px)}.bm-stage-tools button,.bm-make{font-size:.8rem;min-width:48px;padding:0 10px}
  .bm-stage-meta{left:16px;bottom:148px;gap:12px}.bm-stage-meta button{padding:0 12px;font-size:.8rem}
  .bm-stage .bm-dock{right:50%;transform:translateX(50%);width:max-content}
  .bm-open .bm-stage-bottom,.bm-open .bm-stage-meta{visibility:hidden}
}

/* Photo viewer: the image, its story, and a clear place in the collection. */
#lb{width:min(94vw,1000px);max-width:1000px;max-height:calc(100dvh - 24px);overflow:auto;color:var(--lav);padding:4px 8px 12px}
.lb-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;gap:12px}.lb-count{font-size:.88rem;font-variant-numeric:tabular-nums}
.lb-top button{min-height:44px;border-radius:999px;border:1px solid #ffffff40;background:#ffffff12;padding:0 16px;color:var(--lav);font:600 .9rem Figtree,sans-serif;cursor:pointer}
#lbImg{max-width:100%;max-height:calc(100dvh - 230px);object-fit:contain;touch-action:pan-y pinch-zoom;border-radius:16px}
#lb .lb-title{font-size:1.05rem;font-weight:600;color:var(--lav);line-height:1.4;margin:14px auto 0;max-width:60ch}
#lbCap{margin:5px auto 0;font-size:.8rem}
#lb .lb-ctl{align-items:center;justify-content:space-between;margin-top:16px;gap:12px}
#lb .lb-ctl button{width:auto;min-height:44px;height:auto;padding:0 16px;font:600 .9rem Figtree,sans-serif;border-radius:999px}
.lb-hint{font-size:.75rem;color:var(--lav-dim)}
@media (max-width:600px){.lb-hint{display:none}#lb .lb-title{font-size:.95rem}#lbImg{max-height:calc(100dvh - 250px)}#lb .lb-ctl button{font-size:.82rem;padding:0 14px}}
@media print{.bm-stage{display:none!important}}

/* buttons inside content keep their own text colour (the contact "Email Garry" button was teal on the gradient) */
.contact-page a.btn,.prose a.btn,.letter-page a.btn{color:var(--night);text-decoration:none}
.contact-page a.btn-ghost,.prose a.btn-ghost{color:var(--lav)}
@media (max-width:600px){.letter-page{transform:none}}
