/* Woofmas 2026: a family Christmas letter. Warm paper, evergreen ink, a little cranberry.
   Holiday details live on the letter pages; forms stay quiet and roomy. */
@font-face{font-family:Newsreader;src:url(fonts/newsreader-latin-400-normal.woff2) format("woff2");font-weight:400;font-display:swap}
@font-face{font-family:Newsreader;src:url(fonts/newsreader-latin-500-normal.woff2) format("woff2");font-weight:500;font-display:swap}
@font-face{font-family:Newsreader;src:url(fonts/newsreader-latin-600-normal.woff2) format("woff2");font-weight:600;font-display:swap}
@font-face{font-family:Newsreader;src:url(fonts/newsreader-latin-400-italic.woff2) format("woff2");font-weight:400;font-style:italic;font-display:swap}
@font-face{font-family:Newsreader;src:url(fonts/newsreader-latin-500-italic.woff2) format("woff2");font-weight:500;font-style:italic;font-display:swap}
@font-face{font-family:Caveat;src:url(fonts/caveat-latin-500-normal.woff2) format("woff2");font-weight:500;font-display:swap}
@font-face{font-family:Figtree;src:url(fonts/figtree-latin-400-normal.woff2) format("woff2");font-weight:400;font-display:swap}
@font-face{font-family:Figtree;src:url(fonts/figtree-latin-500-normal.woff2) format("woff2");font-weight:500;font-display:swap}
@font-face{font-family:Figtree;src:url(fonts/figtree-latin-600-normal.woff2) format("woff2");font-weight:600;font-display:swap}
@font-face{font-family:Figtree;src:url(fonts/figtree-latin-700-normal.woff2) format("woff2");font-weight:700;font-display:swap}

:root{
  --paper:#f3ead8; --sheet:#fbf6ea; --white:#fffdf8;
  --ink:#1d3a2f; --ink-2:#2f5143; --soft:#5d6b60; --faint:#8a8f80;
  --cran:#9b2433; --cran-2:#7c1b28;
  --rule:#d9ccb2; --field:#cbbd9f; --kraft:#e8d7b5;
  --serif:Newsreader,Georgia,"Times New Roman",serif;
  --hand:Caveat,"Bradley Hand","Segoe Print",cursive;
  --ui:Figtree,system-ui,-apple-system,"Segoe UI",sans-serif;
  --tabs-h:0px;
  --noise:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='240' height='240'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 .45  0 0 0 0 .38  0 0 0 0 .26  0 0 0 .07 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;min-height:100vh;display:flex;flex-direction:column;color:var(--ink);background:var(--paper) var(--noise);
  font:400 17px/1.6 var(--ui);padding-bottom:calc(var(--tabs-h) + env(safe-area-inset-bottom))}
body.has-tabs{--tabs-h:62px}
img{display:block;max-width:100%}
a{color:var(--ink);text-underline-offset:3px;text-decoration-color:var(--rule)}
a:hover{text-decoration-color:currentColor}
p{margin:0 0 1em}
h1,h2,h3{font-family:var(--serif);font-weight:500;letter-spacing:-.015em;line-height:1.15;margin:0 0 .45em}
h2{font-size:clamp(28px,6.4vw,40px)}
h3{font-size:21px}
.muted{color:var(--soft)}
.small{font-size:14px}
.eyebrow,.kicker{font:600 13px var(--ui);letter-spacing:.14em;text-transform:uppercase;color:var(--cran);margin:0 0 10px}
:focus-visible{outline:3px solid var(--cran);outline-offset:3px}
.hide{display:none!important}

/* ---------- letterhead ---------- */
.top{position:sticky;top:0;z-index:50;background:var(--paper) var(--noise);border-bottom:1px solid transparent;transition:border-color .2s}
body.scrolled .top{border-bottom-color:var(--rule)}
.top-in{display:flex;justify-content:space-between;align-items:baseline;gap:16px;max-width:1120px;margin:0 auto;padding:calc(14px + env(safe-area-inset-top)) 20px 12px}
.mark{font:italic 500 25px/1 var(--serif);text-decoration:none;color:var(--ink);letter-spacing:-.01em;white-space:nowrap}
.mark span{font:600 12px var(--ui);letter-spacing:.14em;color:var(--cran);vertical-align:3px;margin-left:5px;font-style:normal}
.topnav{display:flex;gap:22px;align-items:baseline}
.topnav a{font:600 15px var(--ui);color:var(--ink);text-decoration:none;padding:4px 0;border-bottom:2px solid transparent}
.topnav a.on{border-bottom-color:var(--cran)}
.topnav a.in{text-decoration:underline;text-decoration-color:var(--rule);text-underline-offset:4px;border:0}
.topnav .navlink{display:none}
@media (min-width:760px){.topnav .navlink{display:inline-block}}

/* ---------- bottom tabs (installed app on a phone) ---------- */
.tabs{position:fixed;left:0;right:0;bottom:0;z-index:60;display:flex;background:var(--sheet);border-top:1px solid var(--rule);
  padding:6px 4px calc(6px + env(safe-area-inset-bottom))}
.tabs a{flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;text-decoration:none;color:var(--soft);font:600 11px var(--ui);padding:4px 0}
.tabs a svg{width:23px;height:23px;stroke-width:1.7}
.tabs a.on{color:var(--ink)}
.tabs a.on svg{stroke-width:2.3}
.tabs a.on span{box-shadow:0 2px 0 var(--cran)}
@media (min-width:760px){.tabs{display:none!important} body.has-tabs{--tabs-h:0px}}

main{flex:1;width:100%;outline:none}
main:focus,main:focus-visible{outline:none}
.wrap{max-width:1120px;margin:0 auto;padding:0 20px}
.narrow{max-width:640px}
.boot{display:grid;place-items:center;min-height:60vh;font:italic 400 18px var(--serif);color:var(--soft)}
.spin{display:none}

/* ---------- buttons ---------- */
.btn{appearance:none;border:0;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:52px;padding:0 24px;border-radius:8px;
  background:var(--ink);color:var(--sheet);font:600 17px/1 var(--ui);text-decoration:none;box-shadow:0 2px 0 #10261e;transition:background .15s,transform .06s}
.btn:hover{background:var(--ink-2)}
.btn:active{transform:translateY(1px);box-shadow:0 1px 0 #10261e}
.btn.red{background:var(--cran);box-shadow:0 2px 0 #5e1420}.btn.red:hover{background:var(--cran-2)}
.btn.green{background:var(--ink)}
.btn.ghost,.btn.light{background:transparent;color:var(--ink);box-shadow:inset 0 0 0 1.5px var(--field)}
.btn.ghost:hover,.btn.light:hover{background:var(--sheet)}
.btn.sm{min-height:42px;padding:0 16px;font-size:15px}
.btn.block{width:100%}
.btn[disabled]{opacity:.55;pointer-events:none}
.row{display:flex;gap:12px;flex-wrap:wrap;align-items:center}

/* ---------- quiet working pages ---------- */
.page-head{padding:30px 0 14px}
.page-head h2{margin:0}
.page-head .sub{color:var(--soft);margin:6px 0 0}
.back{display:inline-flex;align-items:center;gap:6px;font:600 15px var(--ui);text-decoration:none;margin-bottom:12px;color:var(--soft)}
.card{background:var(--white);border:1px solid var(--rule);border-radius:12px;padding:24px 22px;margin:0 0 18px}
.card h3{margin:0 0 6px}
.card .hint{color:var(--soft);font-size:15px;margin:0 0 18px}
@media (min-width:640px){.card{padding:30px 32px}}

.field{display:block;margin:0 0 20px}
.field>span{display:block;font:600 15px var(--ui);margin:0 0 7px;color:var(--ink)}
.field small{display:block;color:var(--soft);font-size:14px;margin-top:6px;line-height:1.45}
.field input,.field textarea,.field select{width:100%;font:400 17px/1.4 var(--ui);color:var(--ink);background:#fff;border:1.5px solid var(--field);
  border-radius:8px;padding:13px 14px;min-height:52px;transition:border-color .15s,box-shadow .15s}
.field textarea{min-height:140px;resize:vertical;line-height:1.5}
.field input:focus,.field textarea:focus,.field select:focus{outline:none;border-color:var(--ink);box-shadow:0 0 0 3px rgba(29,58,47,.14)}
.field input:disabled{background:#f4efe4;color:var(--soft)}
.grid2{display:grid;grid-template-columns:1fr;gap:0 16px}
@media (min-width:560px){.grid2{grid-template-columns:1fr 1fr}}
.grid3{display:grid;grid-template-columns:1fr 1fr;gap:0 14px}
.grid3>.field:first-child{grid-column:1/-1}
@media (min-width:560px){.grid3{grid-template-columns:2fr 1fr 1fr}.grid3>.field:first-child{grid-column:auto}}
.check{display:flex;gap:12px;align-items:center;font:600 16px var(--ui);cursor:pointer;min-height:48px;margin:4px 0 8px}
.check input{width:22px;height:22px;accent-color:var(--ink)}
.form-sep{border:0;border-top:1px solid var(--rule);margin:26px 0 22px}

/* status words instead of badges */
.pill{font:600 13.5px var(--ui);color:var(--ink-2)}
.pill.red{color:var(--cran)}
.pill.gold{color:#8a6416}
.pill.gray{color:var(--faint)}
.pill+.pill::before{content:"· ";color:var(--faint)}

.todo{border-left:3px solid var(--cran);background:var(--sheet);padding:14px 18px;margin:0 0 20px;font-size:16px}
.todo.done{border-left-color:var(--ink)}
.todo ul{margin:6px 0 0;padding-left:20px}
.todo li{margin:3px 0}

/* pets list */
.pets{display:grid;grid-template-columns:1fr;gap:0}
.pet{display:flex;gap:16px;align-items:center;text-decoration:none;color:inherit;padding:14px 0;border-top:1px solid var(--rule)}
.pets .pet:last-child{border-bottom:1px solid var(--rule)}
.pet img{width:76px;height:84px;object-fit:cover;background:#ebe2cf;flex:none}
.pet h3{margin:0;font-size:21px}
.pet .meta{font-size:14px;color:var(--soft)}
.pet:hover h3{text-decoration:underline;text-decoration-color:var(--rule);text-underline-offset:4px}
.add-pet{font:600 16px var(--ui)}
.add-pet::before{content:"+";display:grid;place-items:center;width:76px;height:84px;border:1.5px dashed var(--field);font:400 30px var(--serif);color:var(--soft);flex:none}

.avatar{width:84px;height:92px;border-radius:0;object-fit:cover;background:#ebe2cf;flex:none}
.avatar.lg{width:104px;height:116px}
.avatar.sq{border-radius:0;width:104px;height:116px}
.ph-pick{position:relative;display:inline-block;cursor:pointer;flex:none}
.ph-pick input{position:absolute;inset:0;opacity:0;cursor:pointer}
.ph-pick .badge{position:absolute;right:-4px;bottom:-4px;background:var(--ink);color:#fff;width:32px;height:32px;border-radius:50%;display:grid;place-items:center;border:3px solid var(--white)}
.ph-pick .badge svg{width:15px;height:15px}
.drop-hint{display:none;font-size:13px;color:var(--soft);margin-top:4px}
@media (hover:hover) and (pointer:fine){.drop-hint{display:block}}
.pk{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:12px 0;border-top:1px solid var(--rule)}

/* address autofill */
.ac-list{position:absolute;left:0;right:0;top:100%;z-index:40;background:#fff;border:1.5px solid var(--ink);border-radius:0 0 8px 8px;box-shadow:0 10px 24px rgba(40,30,10,.12);overflow:hidden}
.ac-item{padding:11px 14px;cursor:pointer;display:flex;flex-direction:column;gap:1px;border-top:1px solid #eee5d3}
.ac-item:first-child{border-top:0}
.ac-item b{font-weight:600}.ac-item span{font-size:13.5px;color:var(--soft)}
.ac-item.on,.ac-item:hover{background:var(--sheet)}
.ac-by{font-size:11px;color:var(--soft);text-align:right;padding:4px 10px;background:#faf6ee}

/* ---------- sign in ---------- */
.signin{padding:34px 0 50px}
.signin h2{margin-bottom:6px}
.or{display:flex;align-items:center;gap:12px;color:var(--soft);font:500 14px var(--ui);margin:22px 0}
.or::before,.or::after{content:"";flex:1;height:1px;background:var(--rule)}
.code-input{letter-spacing:.45em;text-align:center;font-size:26px!important;font-weight:700!important}
#gbtn{display:flex;justify-content:center;min-height:44px}

/* ---------- the letter (home) ---------- */
.open{max-width:1120px;margin:0 auto;padding:4px 20px 36px;display:grid;gap:22px}
.snap{justify-self:center;width:min(78vw,330px);background:#fff;padding:10px 10px 0;margin:6px 0 0;position:relative;
  box-shadow:0 1px 2px rgba(40,30,10,.12),0 10px 26px rgba(40,30,10,.16);transform:rotate(-2.2deg)}
.snap img{width:100%;aspect-ratio:4/4.3;object-fit:cover;object-position:50% 40%;background:#ebe2cf}
.snap figcaption{font:500 25px/1.1 var(--hand);color:#3a3a36;padding:9px 4px 11px}
.snap::before{content:"";position:absolute;top:-11px;left:50%;width:92px;height:24px;transform:translateX(-50%) rotate(3deg);background:rgba(232,215,181,.82);box-shadow:0 1px 1px rgba(0,0,0,.06)}
.letter .date{font:italic 400 16px var(--serif);color:var(--soft);margin:0 0 6px}
.letter .dear{font:italic 400 19px var(--serif);margin:0 0 8px}
.letter h1{font:500 clamp(34px,8.6vw,54px)/1.05 var(--serif);letter-spacing:-.02em;margin:0 0 14px}
.letter h1 em{color:var(--cran);font-style:italic}
.letter .lede{font:400 clamp(18px,4.6vw,21px)/1.5 var(--serif);max-width:34em}
.letter ul.lede{padding-left:1.1em;margin:0 0 1em}
.act{display:flex;flex-wrap:wrap;align-items:center;gap:12px 18px;margin:20px 0 10px}
.quiet{font:500 16px var(--ui)}
.by{font:500 15px var(--ui);color:var(--cran);margin:0}
.open .tag{justify-self:center;margin-top:-34px;margin-left:110px;z-index:3}
@media (min-width:860px){
  .open{grid-template-columns:minmax(0,600px) minmax(0,1fr);justify-content:center;align-items:center;gap:0;padding:30px 40px 72px}
  .letter{grid-column:1;grid-row:1;background:var(--sheet);padding:54px 96px 50px 58px;box-shadow:0 1px 2px rgba(40,30,10,.08),0 18px 44px rgba(40,30,10,.1);position:relative;z-index:1}
  .snap{grid-column:2;grid-row:1;width:430px;justify-self:start;align-self:center;margin:30px 0 0 -64px;z-index:2;transform:rotate(3deg);padding:14px 14px 0}
  .snap figcaption{font-size:30px;padding:12px 6px 14px}
  .snap::before{width:120px;height:28px;top:-13px}
  .open .tag{grid-column:2;grid-row:1;align-self:end;justify-self:start;margin:0 0 -26px 250px}
}

.page{max-width:1120px;margin:0 auto;padding:44px 20px}
.rule{max-width:1080px;width:calc(100% - 40px);margin:0 auto;border:0;border-top:1px solid var(--rule)}
.page h2{margin-bottom:16px}

/* dedication */
.ded{display:grid;gap:30px}
.note{font:400 19px/1.6 var(--serif);max-width:34em}
.note .sig,.close .sig{font:500 31px/1 var(--hand);color:var(--ink-2);display:block;margin-top:6px}
.ofr{margin:30px 0 0}
.ofr button{all:unset;cursor:zoom-in;display:block}
.ofr img{width:100%;aspect-ratio:4/3;object-fit:cover}
.ofr figcaption{font:italic 400 15.5px/1.45 var(--serif);color:var(--soft);margin-top:9px;max-width:40em}
.ofr figcaption b{font-style:normal;font-weight:600;color:var(--ink)}
.who{list-style:none;margin:0;padding:0}
.who li{display:grid;grid-template-columns:96px 1fr;gap:16px;padding:18px 0;border-top:1px solid var(--rule);align-items:start}
.who li:last-child{border-bottom:1px solid var(--rule)}
.who .ph{all:unset;cursor:zoom-in;display:block}
.who img{width:96px;height:112px;object-fit:cover;background:#e9dfca}
.who h3{font-size:23px;margin:0}
.who .fam{font:500 14px var(--ui);color:var(--cran);margin:3px 0 0}
.who p{font:400 16.5px/1.5 var(--serif);margin:6px 0}
.who .more{font:500 14px var(--ui);color:var(--soft);display:flex;flex-wrap:wrap;gap:4px 14px;align-items:center}
.who .more a,.who .more label{color:var(--soft);text-decoration:underline;text-decoration-color:var(--rule);text-underline-offset:3px;cursor:pointer;position:relative}
.who .more label input{position:absolute;inset:0;opacity:0;cursor:pointer;width:100%}
@media (min-width:860px){
  .ded{grid-template-columns:1fr 1fr;gap:56px;align-items:start}
  .who li{grid-template-columns:120px 1fr;gap:20px}
  .who img{width:120px;height:140px}
}

/* what happens next */
.next{display:grid;gap:34px}
.steps{list-style:none;margin:0;padding:0}
.steps li{display:grid;grid-template-columns:92px 1fr;gap:14px;padding:16px 0;border-top:1px solid var(--rule)}
.steps li:last-child{border-bottom:1px solid var(--rule)}
.steps .when{font:500 15px/1.35 var(--ui);color:var(--cran);padding-top:4px}
.steps h3{font-size:21px;margin:0 0 3px}
.steps p{font:400 16.5px/1.5 var(--serif);color:#3d4a42;margin:0}
.steps li.done .when{color:var(--faint);text-decoration:line-through}
.steps li.done h3,.steps li.done p{color:var(--faint)}
.tagwrap{display:flex;justify-content:center;padding:10px 0}
@media (min-width:860px){.next{grid-template-columns:1.25fr .75fr;gap:64px;align-items:center}.steps li{grid-template-columns:130px 1fr}}

/* the gift tag */
.tag{position:relative;width:250px;padding:28px 24px 22px 48px;background:var(--kraft) var(--noise);color:#2b2a22;transform:rotate(-4deg);
  clip-path:polygon(16% 0,100% 0,100% 100%,16% 100%,0 50%);filter:drop-shadow(0 6px 10px rgba(60,40,10,.16))}
.tag::before{content:"";position:absolute;left:22px;top:50%;width:14px;height:14px;margin-top:-7px;border-radius:50%;background:var(--paper);box-shadow:inset 0 0 0 2px #c9b48b}
.tag .l{font:600 11px var(--ui);letter-spacing:.14em;text-transform:uppercase;color:#7a6440}
.tag .h{font:500 30px/1.05 var(--hand);color:var(--ink);margin:2px 0 12px;overflow-wrap:anywhere}
.tag .h.cr{color:var(--cran)}
.tag .s{font:500 21px/1.15 var(--hand);color:#5b4a2c;border-top:1px dashed #b89d6c;padding-top:10px;margin-top:2px}
@media (min-width:860px){.tag{width:280px}}

/* P.S. + sign-off */
.ps{display:grid;gap:22px}
.ps p{font:400 19px/1.6 var(--serif);max-width:34em}
.ps .pp{font:italic 500 19px var(--serif);color:var(--cran);margin-right:4px}
.ps a.link{font:600 16px var(--ui)}
.qr{width:150px;background:#fff;padding:8px}
.close{max-width:34em}

/* ---------- match (the reveal) ---------- */
.reveal{display:grid;justify-items:center;padding:10px 0 20px}
.reveal .snap{width:min(70vw,290px)}
.reveal .tag{margin:-34px 0 0 100px;z-index:2}
.reveal-copy{text-align:center;margin:26px auto 0;max-width:30em}
.reveal-copy h2{margin:0 0 4px}
.reveal-copy p{color:var(--soft);margin:0}
@media (min-width:760px){
  .reveal{grid-template-columns:auto auto;justify-content:center;align-items:center;gap:0}
  .reveal .tag{margin:80px 0 0 -40px}
  .reveal-copy{grid-column:1/-1}
}
.prof{display:grid;gap:6px 16px;grid-template-columns:auto 1fr;font-size:16px;margin:16px 0 0}
.prof dt{font-weight:600;color:var(--soft)}
.prof dd{margin:0}
.bio{font:400 18px/1.6 var(--serif)}
.wish{margin:6px 0 0;padding:0;list-style:none;counter-reset:w}
.wish li{counter-increment:w;padding:12px 0 12px 40px;position:relative;border-top:1px solid var(--rule);font:400 18px/1.4 var(--serif)}
.wish li:last-child{border-bottom:1px solid var(--rule)}
.wish li::before{content:counter(w);position:absolute;left:2px;top:8px;font:500 27px/1 var(--hand);color:var(--cran)}
.allergy{color:var(--cran);font-weight:600}
.label{font:500 17px/1.45 var(--ui);background:#fff;border:1.5px dashed var(--ink);padding:16px 18px;white-space:pre-line}
.status-line{font-size:15px;color:var(--soft);margin:0 0 12px}

/* ---------- map ---------- */
.mapbox{height:min(66vh,620px);border:1px solid var(--rule);background:#e6dfcf}
.paw-pin{width:46px;height:54px;background:#fff center/cover no-repeat;background-origin:content-box;border:4px solid #fff;border-bottom-width:11px;box-shadow:0 3px 8px rgba(40,30,10,.3);
  display:grid;place-items:center;color:var(--ink);font:500 18px var(--serif);transform:rotate(-3deg)}
.leaflet-container{font:15px/1.45 var(--ui)}
.leaflet-popup-content{margin:12px 14px}
.leaflet-popup-content-wrapper{border-radius:6px}
.pop h4{margin:0 0 2px;font:500 18px var(--serif)}
.pop .pp{display:flex;gap:10px;margin-top:8px;flex-wrap:wrap}
.pop .pp div{text-align:center;width:66px;font-size:12.5px;font-weight:600}
.pop .pp img{width:62px;height:68px;object-fit:cover;margin:0 auto 4px;background:#ebe2cf}

/* ---------- admin ---------- */
.tbl{width:100%;border-collapse:collapse;font-size:15px}
.tbl th,.tbl td{text-align:left;padding:11px 8px;border-bottom:1px solid var(--rule);vertical-align:top}
.tbl th{font:600 12px var(--ui);text-transform:uppercase;letter-spacing:.08em;color:var(--soft)}
.scroll-x{overflow-x:auto;-webkit-overflow-scrolling:touch}
.mini{width:44px;height:48px;object-fit:cover;background:#ebe2cf;display:inline-block;vertical-align:middle;margin-right:8px}
details summary{cursor:pointer;font-weight:600}
fieldset.dropzone{border:1px solid var(--rule);border-radius:10px;padding:18px;margin:0 0 14px}

/* ---------- install note ---------- */
.install{display:flex;gap:14px;align-items:center;border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);padding:14px 0;margin:22px 0;text-align:left}
.install img{width:44px;height:44px;border-radius:10px}
.install p{margin:0;font-size:15px;flex:1}

/* ---------- toast + lightbox ---------- */
.toast{position:fixed;left:50%;bottom:calc(var(--tabs-h) + 18px + env(safe-area-inset-bottom));transform:translate(-50%,16px);opacity:0;background:var(--ink);color:#fff;
  padding:12px 18px;border-radius:8px;font:600 15px var(--ui);z-index:90;transition:.22s;pointer-events:none;max-width:calc(100% - 32px);text-align:center}
.toast.on{opacity:1;transform:translate(-50%,0)}
.toast.err{background:var(--cran)}
.lightbox{position:fixed;inset:0;z-index:100;background:rgba(20,24,20,.94);display:flex;align-items:center;justify-content:center}
.lightbox[hidden]{display:none}
.lightbox img{max-width:94vw;max-height:82vh;object-fit:contain}
.lightbox button{position:absolute;background:rgba(255,255,255,.14);color:#fff;border:0;width:48px;height:48px;border-radius:50%;font-size:28px;cursor:pointer;line-height:1}
.lb-x{top:calc(14px + env(safe-area-inset-top));right:14px}
.lb-prev{left:10px;top:50%;transform:translateY(-50%)}
.lb-next{right:10px;top:50%;transform:translateY(-50%)}
.lb-count{position:absolute;bottom:calc(18px + env(safe-area-inset-bottom));left:0;right:0;text-align:center;color:#ddd;font:500 14px var(--ui)}
.lb-count .lb-rm{position:static;width:auto;height:auto;font:600 13px var(--ui);padding:7px 12px;border-radius:6px;margin-left:8px;background:rgba(155,36,51,.9)}

/* drag and drop */
body.dragging .ph-pick,body.dragging .who li,body.dragging label.btn:has(input[type=file]),body.dragging fieldset.dropzone{outline:2px dashed var(--cran);outline-offset:4px}
.drop-hover{outline:3px solid var(--cran)!important;outline-offset:4px;background-color:rgba(155,36,51,.06)!important}

/* ---------- footer ---------- */
.foot{max-width:1120px;width:calc(100% - 40px);margin:30px auto 0;padding:24px 0 30px;border-top:1px solid var(--rule);font:400 13px/1.7 var(--ui);color:var(--soft)}
.foot a{color:var(--soft)}
.site-credit{margin:6px 0 0;overflow-wrap:anywhere}
.site-credit .heart{color:var(--cran);display:inline-block;transform:translateY(1px);font-family:"Segoe UI Symbol","Apple Symbols","Noto Sans Symbols 2","DejaVu Sans",sans-serif}
.site-credit a{color:var(--ink);font-weight:600;white-space:nowrap;text-decoration:underline;text-decoration-color:transparent;text-underline-offset:3px;transition:text-decoration-color .15s}
.site-credit a:hover{text-decoration-color:currentColor}
.site-credit a:focus-visible{outline:2px solid var(--ink);outline-offset:3px;text-decoration-color:currentColor}

@media (prefers-reduced-motion:reduce){*{transition:none!important}}

/* wish list inputs: item + optional link */
.wish-in{border-top:1px solid var(--rule);padding-top:16px;margin-top:4px}
.wish-in .field:first-child{margin-bottom:10px}
.wish-in .field:last-child>span{font-weight:500;color:var(--soft);font-size:14px}
@media (min-width:560px){.wish-in{display:grid;grid-template-columns:1.3fr 1fr;gap:0 14px}.wish-in .field:first-child{margin-bottom:20px}}
.wish-link{display:inline-block;margin-left:6px;font:600 14px var(--ui);color:var(--ink);text-decoration:underline;text-decoration-color:var(--rule);text-underline-offset:3px;white-space:nowrap}

/* iOS draws date inputs wider than their column and centers the text; keep them inside and left-aligned */
.field{min-width:0}
.field input[type=date]{-webkit-appearance:none;appearance:none;display:block;min-width:0;max-width:100%;text-align:left;line-height:1.4}
.field input[type=date]::-webkit-date-and-time-value{text-align:left;margin:0}
.field input[type=date]::-webkit-calendar-picker-indicator{opacity:.7}
.dates{display:grid;grid-template-columns:1fr;gap:0 14px}
@media (min-width:560px){.dates{grid-template-columns:1fr 1fr 1fr}}

/* opening snapshot: slow crossfade through photos of Joseph and Tokki */
.snap.cycle .stack{position:relative;width:100%;aspect-ratio:4/4.3;background:#ebe2cf;overflow:hidden}
.snap.cycle .stack img{position:absolute;inset:0;width:100%;height:100%;aspect-ratio:auto;object-fit:cover;opacity:0;transition:opacity 1.4s ease}
.snap.cycle .stack img.on{opacity:1}
@media (prefers-reduced-motion:reduce){.snap.cycle .stack img{transition:none}}

/* donation QR in the P.S. */
.qrfig{display:flex;gap:16px;align-items:center;margin:0}
.qrfig .qr{width:132px;height:132px;padding:6px;background:#fff;border:1px solid var(--rule);flex:none}
.qrfig figcaption{font:500 25px/1.1 var(--hand);color:var(--ink-2)}
.qrfig figcaption span{font:500 14px var(--ui);color:var(--soft)}
@media (hover:none) and (pointer:coarse){.qrfig figcaption::after{content:"Or tap the link above";display:block;font:500 13px var(--ui);color:var(--faint);margin-top:4px}}

/* admin email log */
.maillist{border-top:1px solid var(--rule)}
.mailrow{border-bottom:1px solid var(--rule)}
.mailrow summary{list-style:none;display:flex;gap:12px;justify-content:space-between;align-items:flex-start;padding:11px 2px;cursor:pointer;font-weight:400}
.mailrow summary::-webkit-details-marker{display:none}
.mailrow summary:hover{background:var(--sheet)}
.mr-main{display:flex;flex-direction:column;min-width:0}
.mr-main b{font-weight:600;font-size:15px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mr-main span,.mr-side>span:first-child{font-size:13px;color:var(--soft)}
.mr-main span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mr-side{display:flex;flex-direction:column;align-items:flex-end;gap:2px;flex:none;text-align:right}
.mr-body{padding:6px 0 16px}
.mail-preview{width:100%;height:520px;border:1px solid var(--rule);border-radius:8px;background:#f6efe2}

/* invite link */
.invite-link{font:600 18px var(--ui);background:var(--sheet);border:1.5px dashed var(--field);border-radius:8px;padding:12px 14px;overflow-wrap:anywhere}
.prefixed{display:flex;align-items:stretch;border:1.5px solid var(--field);border-radius:8px;background:#fff;overflow:hidden}
.prefixed:focus-within{border-color:var(--ink);box-shadow:0 0 0 3px rgba(29,58,47,.14)}
.prefixed>span{display:flex;align-items:center;padding:0 4px 0 12px;color:var(--soft);font-size:15px;white-space:nowrap;background:var(--sheet)}
.field .prefixed input{border:0;box-shadow:none!important;border-radius:0;padding-left:4px;min-width:0}

/* ================= chat ================= */
.tabicon{position:relative;display:inline-flex}
.badge{position:absolute;top:-5px;right:-11px;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--cran);color:#fff;font:700 11px/18px var(--ui);text-align:center;box-shadow:0 0 0 2px var(--sheet)}
.topnav .badge{position:static;display:inline-block;margin-left:5px;vertical-align:1px;box-shadow:none}
.badge[hidden]{display:none}
.dot{position:absolute;right:0;bottom:2px;width:12px;height:12px;border-radius:50%;background:#3c9a5f;box-shadow:0 0 0 2px var(--paper)}
.dot.inline{position:static;display:inline-block;width:8px;height:8px;margin-right:5px;box-shadow:none;vertical-align:1px}
.ch-av{width:48px;height:48px;border-radius:50%;object-fit:cover;background:#e3d8c2;flex:none;display:inline-grid;place-items:center;font:500 20px var(--serif);color:var(--ink-2)}
.ch-av.sm{width:36px;height:36px;font-size:16px}
.ch-av.xs{width:28px;height:28px;font-size:13px}
.ch-list-head{display:flex;justify-content:space-between;align-items:flex-end;gap:12px}
.ch-rows{border-top:1px solid var(--rule)}
.ch-row{display:flex;gap:14px;align-items:center;padding:13px 2px;border-bottom:1px solid var(--rule);text-decoration:none;color:inherit}
.ch-row:hover{background:var(--sheet)}
.ch-row-av{position:relative;flex:none}
.ch-row-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.ch-row-top{display:flex;align-items:baseline;gap:6px}
.ch-row-top b{font:500 19px var(--serif);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ch-row-time{margin-left:auto;font-size:13px;color:var(--soft);flex:none}
.ch-row-snip{font-size:15px;color:var(--soft);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ch-row.unread .ch-row-snip{color:var(--ink);font-weight:600}
.ch-count{flex:none;min-width:24px;height:24px;padding:0 7px;border-radius:12px;background:var(--cran);color:#fff;font:700 13px/24px var(--ui);text-align:center}
.ch-people{max-height:55vh;overflow:auto;margin:0 -4px}
.ch-person{position:relative;display:flex;gap:12px;align-items:center;padding:10px 4px;text-decoration:none;color:inherit;border-bottom:1px solid var(--rule)}
.ch-person .dot{left:38px;right:auto;bottom:10px}
.ch-person span{display:flex;flex-direction:column}
.ch-person b{font-weight:600}

/* the room fills the screen like a messaging app */
body.in-chat{overflow:hidden}
body.in-chat .top,body.in-chat .tabs,body.in-chat .foot{display:none!important}
.chat{position:fixed;left:0;right:0;top:0;height:100vh;height:100dvh;z-index:70;display:flex;flex-direction:column;background:var(--paper) var(--noise)}
@media (min-width:760px){.chat{left:50%;width:min(760px,100%);transform:translateX(-50%);border-left:1px solid var(--rule);border-right:1px solid var(--rule)}}
.ch-head{display:flex;align-items:center;gap:10px;padding:calc(8px + env(safe-area-inset-top)) 12px 8px;background:var(--sheet);border-bottom:1px solid var(--rule)}
.ch-back{font:400 36px/1 var(--serif);text-decoration:none;color:var(--ink);padding:0 6px 4px 2px}
.ch-title{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.2}
.ch-title b{font:500 19px var(--serif);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ch-title span{font-size:13px;color:var(--soft)}
.ch-info{border:0;background:none;font-size:26px;color:var(--ink);width:40px;height:40px;border-radius:50%;cursor:pointer}
.ch-info:hover{background:var(--paper)}
.ch-scroll{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:10px 12px 6px;overscroll-behavior:contain}
.ch-more{text-align:center;margin:6px 0 10px}
.ch-start{font:italic 400 15px/1.5 var(--serif);color:var(--soft);max-width:30em;margin:6px auto 12px}
.ch-day{text-align:center;font:600 12px var(--ui);letter-spacing:.06em;text-transform:uppercase;color:var(--soft);margin:16px 0 8px}
.ch-msg{display:flex;gap:8px;align-items:flex-end;margin-top:2px}
.ch-msg.first{margin-top:10px}
.ch-msg.me{justify-content:flex-end}
.ch-gutter{width:28px;flex:none}
.ch-col{display:flex;flex-direction:column;max-width:min(78%,520px);min-width:0}
.ch-msg.me .ch-col{align-items:flex-end}
.ch-name{font:600 12.5px var(--ui);color:var(--soft);margin:0 0 3px 12px}
.ch-name span{font-weight:500;color:var(--faint)}
.ch-bubble{padding:9px 13px;border-radius:18px;font:400 16.5px/1.42 var(--ui);overflow-wrap:anywhere;cursor:default;-webkit-user-select:text;user-select:text;outline:none}
.ch-msg.them .ch-bubble{background:#fff;border:1px solid var(--rule);color:var(--ink)}
.ch-msg.me .ch-bubble{background:var(--ink);color:#fbf6ea}
.ch-msg.sys .ch-bubble{background:var(--kraft);color:#2b2a22;border:1px solid #d9c49b}
.ch-msg.them.last .ch-bubble,.ch-msg.sys.last .ch-bubble{border-bottom-left-radius:5px}
.ch-msg.me.last .ch-bubble{border-bottom-right-radius:5px}
.ch-bubble:focus-visible{box-shadow:0 0 0 3px rgba(155,36,51,.35)}
.ch-bubble a{color:inherit;text-decoration:underline}
.ch-msg.me .ch-bubble .ch-at{color:#f3d9a2}
.ch-at{color:var(--cran)}
.ch-bubble.gone{background:transparent!important;border:1px dashed var(--field)!important;color:var(--faint)!important;font-style:italic}
.ch-bubble.photo-only{padding:3px;background:transparent!important;border:0!important}
.ch-img{display:block;max-width:260px;width:100%;border-radius:14px;cursor:zoom-in;background:#e3d8c2;object-fit:cover}
.ch-bubble:not(.photo-only) .ch-img{margin:-5px -9px 7px;width:calc(100% + 18px);max-width:none;border-radius:14px 14px 6px 6px}
.ch-quote{display:block;font-size:13.5px;color:var(--soft);border-left:3px solid var(--field);padding:2px 0 2px 8px;margin:0 6px 4px;text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
.ch-quote b{color:var(--ink-2)}
.ch-time{display:none;font-size:12px;color:var(--soft);margin:3px 8px 0}
.ch-msg.show-time .ch-time{display:block}
.ch-receipt{text-align:right;font-size:12.5px;color:var(--soft);margin:4px 6px 0;min-height:1em}
.ch-typing{display:flex;align-items:center;gap:8px;font-size:13.5px;color:var(--soft);margin:10px 0 2px 36px}
.ch-typing[hidden]{display:none}
.dots{display:inline-flex;gap:3px;background:#fff;border:1px solid var(--rule);border-radius:14px;padding:9px 11px}
.dots i{width:6px;height:6px;border-radius:50%;background:var(--faint);animation:bop 1.2s infinite}
.dots i:nth-child(2){animation-delay:.15s}.dots i:nth-child(3){animation-delay:.3s}
@keyframes bop{0%,60%,100%{transform:translateY(0);opacity:.5}30%{transform:translateY(-4px);opacity:1}}
@media (prefers-reduced-motion:reduce){.dots i{animation:none}}
.ch-replybar{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:8px 14px;background:var(--sheet);border-top:1px solid var(--rule);font-size:14px}
.ch-replybar[hidden]{display:none}
.ch-mention{position:absolute;left:12px;right:12px;bottom:calc(64px + env(safe-area-inset-bottom));top:auto!important;border-radius:10px}
.ch-compose{display:flex;align-items:flex-end;gap:8px;padding:8px 10px calc(8px + env(safe-area-inset-bottom));background:var(--sheet);border-top:1px solid var(--rule)}
.ch-plus{position:relative;flex:none;width:40px;height:40px;border-radius:50%;display:grid;place-items:center;font:300 28px/1 var(--ui);color:var(--ink);cursor:pointer;background:var(--paper);border:1px solid var(--rule)}
.ch-plus input{position:absolute;inset:0;opacity:0;cursor:pointer}
.ch-compose textarea{flex:1;resize:none;min-height:40px;max-height:132px;border:1.5px solid var(--field);border-radius:20px;padding:9px 14px;font:400 16.5px/1.35 var(--ui);color:var(--ink);background:#fff}
.ch-compose textarea:focus{outline:none;border-color:var(--ink)}
.ch-send{flex:none;width:40px;height:40px;border-radius:50%;border:0;background:var(--cran);color:#fff;font:700 20px/1 var(--ui);cursor:pointer;transition:opacity .15s}
.ch-send:disabled{opacity:.3;cursor:default}
.ch-newpill{position:absolute;left:50%;transform:translateX(-50%);bottom:calc(76px + env(safe-area-inset-bottom));border:0;border-radius:999px;background:var(--ink);color:#fff;font:600 14px var(--ui);padding:9px 16px;box-shadow:0 4px 14px rgba(0,0,0,.2);cursor:pointer}

/* bottom sheet */
.sheet-wrap{position:fixed;inset:0;z-index:95;background:rgba(20,24,20,0);display:flex;align-items:flex-end;justify-content:center;transition:background .2s}
.sheet-wrap.on{background:rgba(20,24,20,.45)}
.sheet{width:min(560px,100%);max-height:86vh;overflow:auto;background:var(--white);border-radius:16px 16px 0 0;padding:20px 18px calc(16px + env(safe-area-inset-bottom));transform:translateY(100%);transition:transform .2s}
.sheet-wrap.on .sheet{transform:none}
@media (min-width:640px){.sheet-wrap{align-items:center}.sheet{border-radius:14px;transform:translateY(20px);opacity:0;transition:.2s}.sheet-wrap.on .sheet{opacity:1}}
.sheet h3{margin:0 0 8px}
.sheet-btn{display:block;width:100%;text-align:left;border:0;background:none;padding:15px 4px;font:600 17px var(--ui);color:var(--ink);border-top:1px solid var(--rule);cursor:pointer;text-decoration:none}
.sheet-btn.danger{color:var(--cran)}
.sheet-btn.cancel{color:var(--soft);font-weight:500;text-align:center}
.ch-act-preview{font-size:14px;color:var(--soft);padding:0 4px 12px;overflow-wrap:anywhere}
.linkbtn{all:unset;cursor:pointer;font:600 15px var(--ui);color:var(--ink);text-decoration:underline;text-decoration-color:var(--rule);text-underline-offset:4px}
.linkbtn:focus-visible{outline:3px solid var(--cran);outline-offset:3px}

/* pull to refresh */
.ptr{position:fixed;left:50%;top:calc(-44px + env(safe-area-inset-top));z-index:90;width:40px;height:40px;border-radius:50%;background:var(--white);box-shadow:0 2px 10px rgba(0,0,0,.18);display:grid;place-items:center;color:var(--soft);font:400 22px/1 var(--ui);transform:translate(-50%,0);opacity:0;transition:opacity .15s;pointer-events:none}
.ptr.on{opacity:1}
.ptr.ready{color:var(--cran)}
.ptr.spin .ptr-ic{animation:ptrspin .7s linear infinite}
.ptr:not(.on){transition:transform .2s,opacity .15s}
@keyframes ptrspin{to{transform:rotate(360deg)}}
html,body{overscroll-behavior-y:contain}
.chat.drop-hover{box-shadow:inset 0 0 0 3px var(--cran)}
.lightbox img{transition:transform .15s}
.lb-x{z-index:2}
