:root{font-family:Inter,ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;color:#25241f;background:#f2eee5;font-synthesis:none}*{box-sizing:border-box}body{margin:0;min-width:320px}.site-nav{height:82px;display:flex;align-items:center;justify-content:space-between;padding:0 clamp(1.2rem,5vw,5rem);position:absolute;inset:0 0 auto;z-index:2}.site-brand{text-decoration:none;font:400 1.35rem Georgia,serif;letter-spacing:.2em}.site-brand span{font-style:italic}.site-login{padding:.65rem 1rem;border:1px solid currentColor;text-decoration:none;font-size:.82rem}.home-hero{min-height:92vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:8rem 1rem 5rem;position:relative;overflow:hidden}.eyebrow{text-transform:uppercase;letter-spacing:.2em;font-size:.7rem;font-weight:700;color:#765345}.home-hero h1{font:400 clamp(3.2rem,9vw,8.4rem)/.86 Georgia,serif;letter-spacing:-.065em;margin:1.4rem 0;position:relative;z-index:1}.home-hero h1 em{font-weight:400;color:#765345}.home-lead{max-width:650px;font-size:clamp(1rem,2vw,1.25rem);line-height:1.65;color:#656259;position:relative}.site-cta{display:inline-flex;align-items:center;gap:2rem;margin-top:1rem;padding:1rem 1.25rem;background:#302820;color:#fff;text-decoration:none;min-height:52px}.home-orbit{position:absolute;width:min(70vw,680px);aspect-ratio:1;border:1px solid rgba(118,83,69,.25);border-radius:50%;animation:spin 40s linear infinite}.home-orbit:before,.home-orbit:after{content:"";position:absolute;border:1px solid rgba(118,83,69,.15);border-radius:50%;inset:12%;transform:rotate(42deg)}.home-orbit:after{inset:25%;transform:rotate(-30deg)}.home-orbit span{position:absolute;width:10px;height:10px;border-radius:50%;background:#765345}.home-orbit span:nth-child(1){top:5%;left:33%}.home-orbit span:nth-child(2){bottom:12%;right:15%}.home-orbit span:nth-child(3){top:50%;left:-5px}.home-features{display:grid;grid-template-columns:repeat(3,1fr);border-top:1px solid #d8d1c5}.home-features article{padding:clamp(2rem,5vw,5rem);border-right:1px solid #d8d1c5}.home-features article:last-child{border:0}.home-features span{font:italic 1rem Georgia,serif;color:#765345}.home-features h2{font:400 2rem Georgia,serif}.home-features p{color:#656259;line-height:1.6}.error-page{min-height:100vh;display:flex;align-items:center;justify-content:center;flex-direction:column;text-align:center;padding:2rem}.error-page h1{font:400 clamp(2.5rem,8vw,6rem) Georgia,serif;margin:.5rem}.error-page p{max-width:500px;line-height:1.6;color:#656259}.error-page .site-brand{margin-bottom:4rem}@keyframes spin{to{transform:rotate(360deg)}}@media(max-width:720px){.home-hero{min-height:100svh}.home-features{grid-template-columns:1fr}.home-features article{border-right:0;border-bottom:1px solid #d8d1c5}}@media(prefers-reduced-motion:reduce){*{animation:none!important;scroll-behavior:auto!important}}
/* Step Y — the recovery shell has two states and the document decides which, before the body is parsed. `pending` is set by invitation-recovery.js only when the fragment actually carries a handle, so a guest with nothing to recover from sees the terminal message immediately and one who is about to be recovered never sees it at all. */
html[data-invi-recovery=pending] [data-recovery-terminal]{display:none}
html[data-invi-recovery=pending] [data-recovery-progress][hidden]{display:block}
