:root{--ink:#523340;--muted:#76545f;--pink:#f8e9ee;--paper:#fff8fa;--rose:#ab4e72;--rose-dark:#873654;--line:#e9cad4;--serif:"Iowan Old Style", Baskerville, Georgia, serif;--sans:"Avenir Next", "Segoe UI", Arial, sans-serif}*{box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--pink);color:var(--ink);font-family:var(--sans);-webkit-font-smoothing:antialiased;margin:0}button,input{font:inherit}button{cursor:pointer}button:focus-visible,input:focus-visible{outline:2px solid var(--rose-dark);outline-offset:4px}h1:focus{outline:none}::selection{color:#fff;background:var(--rose)}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.unlock-shell,.experience{background-color:var(--pink);background-image:url(/hearts.svg);background-repeat:repeat;background-size:310px 310px;min-height:100svh}.unlock-shell{place-items:center;padding:24px;display:grid}.unlock-card{background:var(--paper);text-align:center;width:min(100%,440px);padding:56px clamp(26px,6vw,52px) 54px;box-shadow:0 18px 55px #70344c1f}.heart-mark{width:40px;height:40px;color:var(--rose);place-items:center;margin:0 auto 20px;display:grid}.unlock-card h1{font:400 clamp(3rem, 8vw, 4rem)/1.1 var(--serif);letter-spacing:-.03em;margin:0 0 10px}.unlock-intro{color:var(--muted);font:17px/1.5 var(--serif);margin:0 0 30px}.unlock-form{text-align:left;margin-top:28px}.unlock-form label{margin:0 0 8px;font-size:13px;font-weight:600;display:block}.unlock-form input{width:100%;height:48px;color:var(--ink);background:#fff;border:1px solid #cfabb9;border-radius:4px;padding:0 13px;font-size:16px}.unlock-form input:focus{border-color:var(--rose)}.form-error{color:#98384b;margin:10px 0 0;font-size:13px;line-height:1.5}.primary-button{background:var(--rose-dark);color:#fff;border:0;border-radius:4px;justify-content:space-between;align-items:center;gap:24px;width:100%;min-height:50px;margin-top:25px;padding:0 20px;font-size:14px;font-weight:600;transition:background .2s,transform .2s;display:inline-flex}.primary-button:hover{background:var(--rose);transform:translateY(-2px)}.unlock-form .primary-button{justify-content:center}.experience{place-items:center;padding:clamp(20px,5vw,56px);display:grid}.experience.experience-gallery{justify-content:center;align-items:stretch;height:100svh;min-height:0;display:flex;overflow:hidden}.letter{background:var(--paper);width:min(100%,650px);padding:clamp(38px,7vw,70px);box-shadow:0 20px 65px #70344c21}.letter-heart{color:var(--rose);margin-bottom:20px;display:block}.letter h2{font:400 clamp(2.2rem, 5vw, 3rem)/1.15 var(--serif);letter-spacing:-.025em;margin:0 0 30px}.letter-body{max-width:55ch;color:var(--ink);font:18px/1.75 var(--serif)}.letter-body p{margin:0 0 20px}.ending-heart{color:var(--rose);font-size:1.08em}.letter-signoff{padding-top:9px}.letter-signoff span{color:var(--rose);font-size:25px;font-style:italic}.letter .primary-button{max-width:240px;margin-top:27px}.gallery{flex-direction:column;width:min(100%,760px);height:100%;min-height:0;padding-bottom:84px;display:flex}.gallery-top{justify-content:space-between;align-items:center;gap:22px;margin-bottom:24px;display:flex}.gallery-top h1{font:400 clamp(2.8rem, 6vw, 5rem)/1.1 var(--serif);letter-spacing:-.035em;text-align:center;margin:0}.gallery-heart{color:var(--rose);flex:none}.back-button{color:var(--rose-dark);background:0 0;border:0;align-items:center;gap:9px;padding:0;font-size:14px;font-weight:600;display:inline-flex}.back-button:hover{color:var(--rose)}.back-button svg{width:18px;height:18px}.gallery-content{flex-direction:column;flex:1;min-height:0;display:flex}.photo-stage{touch-action:pan-y;flex:1;justify-content:center;align-items:center;min-height:0;display:flex}.stage-image{object-fit:contain;width:100%;height:100%;animation:.35s ease-out both photo-enter;display:block}.stage-image-rotated{transform:rotate(180deg)}@keyframes photo-enter{0%{opacity:.4}to{opacity:1}}.photo-placeholder{color:#8e4662;background:#e9bacb;flex-direction:column;justify-content:center;align-items:center;gap:19px;width:100%;height:100%;display:flex}.placeholder-1{background:#edc8d3}.placeholder-2{background:#dfb0c1}.placeholder-heart{stroke-width:1.1px;width:62px;height:62px}.photo-placeholder span{font:italic 26px/1.2 var(--serif)}.photo-info{min-width:0;margin-top:18px}.photo-meta{color:var(--rose-dark);flex-wrap:wrap;gap:8px 24px;font-size:13px;font-weight:600;display:flex}.photo-meta span{overflow-wrap:anywhere}.photo-caption{max-width:60ch;font:400 clamp(1.5rem, 2.5vw, 2rem)/1.3 var(--serif);letter-spacing:-.02em;margin:12px 0 0}.gallery-controls{z-index:10;left:50%;bottom:max(16px, env(safe-area-inset-bottom));border:1px solid var(--line);background:#fff8faf5;border-radius:999px;align-items:center;gap:20px;padding:8px 14px;display:flex;position:fixed;transform:translate(-50%);box-shadow:0 8px 28px #70344c26}.gallery-controls button{background:var(--paper);width:45px;height:45px;color:var(--rose-dark);-webkit-tap-highlight-color:transparent;touch-action:manipulation;border:1px solid #c98ca3;border-radius:50%;place-items:center;display:grid}.gallery-controls button:focus:not(:focus-visible){outline:none}.gallery-controls>span{color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;font-weight:600}@media (max-width:750px){.experience{padding:22px 18px 40px;display:block}.letter{margin:7vh auto 0;padding:40px 32px}.gallery{padding-bottom:76px}.gallery-top{margin:0 0 14px}.gallery-top h1{font-size:clamp(2.5rem,7vw,3.5rem)}.photo-info{margin-top:12px}.photo-meta{flex-direction:column;gap:6px}.photo-caption{margin-top:10px;font-size:clamp(1.35rem,5vw,1.8rem)}.gallery-controls{bottom:max(12px, env(safe-area-inset-bottom))}}@media (max-width:420px){.letter{margin-top:4vh;padding:34px 25px}.letter h2{margin-bottom:27px;font-size:2.25rem}.letter-body{font-size:17px}.letter .primary-button{max-width:none}.gallery-top{gap:8px}.gallery-top h1{font-size:2.35rem}.gallery-heart{width:23px;height:23px}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}.stage-image{animation:none}.primary-button,.gallery-controls button{transition:none}}
