:root{color-scheme:light;--cream: #fff6ee;--cream-deep: #f9e6da;--paper: #fffdf9;--blush: #f7c9d4;--blush-deep: #eeaabd;--rose: #d9416a;--rose-bright: #ef6b8f;--rose-deep: #b52a55;--burgundy: #5c0f2b;--burgundy-night: #2a0613;--burgundy-dusk: #6b1636;--lavender: #cdbdf3;--lavender-soft: #ece5fc;--text: var(--burgundy);--text-muted: #87465f;--surface-glass: rgb(255 251 248 / .62);--surface-glass-strong: rgb(255 252 250 / .82);--border-glass: rgb(255 255 255 / .85);--focus-ring: #7b5bd6;--radius-sm: 12px;--radius-md: 20px;--radius-lg: 32px;--radius-pill: 999px;--shadow-soft: 0 1px 0 rgb(255 255 255 / .9) inset, 0 18px 40px -22px rgb(110 16 52 / .45);--shadow-lifted: 0 1px 0 rgb(255 255 255 / .9) inset, 0 26px 60px -26px rgb(110 16 52 / .55);--glow-rose: 0 0 0 1px rgb(255 255 255 / .25) inset, 0 14px 34px -10px rgb(217 65 106 / .6);--ease-out: cubic-bezier(.22, 1, .36, 1);--ease-spring: cubic-bezier(.34, 1.56, .64, 1);--ease-soft-spring: cubic-bezier(.22, 1.25, .36, 1);--beat-duration: 1.35s;--gutter: max(1.25rem, env(safe-area-inset-left), env(safe-area-inset-right));--heart-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Cpath d='M50 90C22 71 5 53 5 33 5 18 16 8 30 8c9 0 16 5 20 13 4-8 11-13 20-13 14 0 25 10 25 25 0 20-17 38-45 57Z'/%3E%3C/svg%3E")}*,*:before,*:after{box-sizing:border-box}[hidden]{display:none!important}html{-webkit-text-size-adjust:100%;text-size-adjust:100%;background:var(--cream);scrollbar-gutter:stable}html.js:not(.intro-done){overflow:hidden;background:var(--burgundy-night)}html.js:not(.intro-done) .page{visibility:hidden}body{margin:0;min-height:100svh;overflow-x:clip;font-family:var(--font-body);font-size:1.0625rem;line-height:1.55;color:var(--text);background:radial-gradient(120% 70% at 10% -10%,rgb(247 201 212 / .85),transparent 60%),radial-gradient(90% 60% at 110% 20%,rgb(205 189 243 / .55),transparent 65%),radial-gradient(100% 70% at 50% 120%,rgb(249 214 196 / .7),transparent 70%),var(--cream);background-attachment:fixed;-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent}h1,h2,h3{margin:0;font-family:var(--font-display);font-weight:750;line-height:1.08;letter-spacing:-.01em;font-variant-numeric:lining-nums;text-wrap:balance}p{margin:0;text-wrap:pretty;overflow-wrap:break-word}button{font:inherit;color:inherit}:focus-visible{outline:3px solid var(--focus-ring);outline-offset:3px;border-radius:8px}.visually-hidden{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;min-height:3rem;padding:.75rem 1.5rem;border:0;border-radius:var(--radius-pill);font-weight:700;font-size:1rem;line-height:1.2;text-align:center;cursor:pointer;touch-action:manipulation;transition:transform .25s var(--ease-spring),box-shadow .25s var(--ease-out),background-color .25s var(--ease-out)}.btn:active{transform:scale(.96)}.btn:disabled{cursor:progress}.btn--rose{color:#fff;background:linear-gradient(180deg,var(--rose-bright),var(--rose) 55%,var(--rose-deep));box-shadow:var(--glow-rose)}.btn--soft{color:var(--burgundy);background:var(--surface-glass-strong);box-shadow:var(--shadow-soft);border:1px solid var(--border-glass)}@media(hover:hover){.btn:hover{transform:translateY(-2px)}.btn:active{transform:scale(.96)}}.heart-layer{position:fixed;inset:0;z-index:60;overflow:hidden;pointer-events:none}.heart-particle{position:absolute;pointer-events:none;-webkit-mask:var(--heart-mask) center / contain no-repeat;mask:var(--heart-mask) center / contain no-repeat;will-change:transform,opacity}@keyframes heartbeat{0%,to{transform:scale(1)}14%{transform:scale(1.12)}28%{transform:scale(.99)}42%{transform:scale(1.07)}70%{transform:scale(1)}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}.moment{position:fixed;inset:0;width:100%;max-width:100%;height:100%;max-height:100%;margin:0;padding:max(1.5rem,env(safe-area-inset-top)) var(--gutter) max(1.5rem,env(safe-area-inset-bottom));border:0;overflow:hidden;color:var(--text);background:radial-gradient(70% 50% at 50% 42%,rgb(255 255 255 / .9),transparent 75%),radial-gradient(120% 90% at 50% 40%,#ffecf2e6,#f7c9d4eb);-webkit-backdrop-filter:blur(18px) saturate(1.2);backdrop-filter:blur(18px) saturate(1.2)}.moment[open]{display:grid;place-items:center;animation:moment-in .4s var(--ease-out)}.moment::backdrop{background:#5c0f2b4d}.moment__body{position:relative;z-index:1;display:grid;justify-items:center;gap:1.25rem;width:min(100%,30rem);text-align:center}.moment__title{font-family:var(--font-display);font-size:clamp(1.6rem,6vw,2.4rem);font-weight:750;line-height:1.12;text-wrap:balance}.moment__meta{font-weight:600;color:var(--text-muted)}@keyframes moment-in{0%{opacity:0;transform:scale(1.02)}}.digit{display:inline-grid;overflow:hidden;padding-block:.1em;margin-block:-.1em}.digit__face{grid-area:1 / 1}.reveal-word{display:inline-block}@media(prefers-reduced-motion:no-preference){html.js [data-reveal]{transition:opacity .8s var(--ease-out) var(--reveal-delay, 0ms),transform 1s var(--ease-out) var(--reveal-delay, 0ms)}html.js [data-reveal]:not(.is-revealed){opacity:0;transform:translateY(28px) scale(.97)}html.js [data-reveal=tag]{transform-origin:0 50%;transition:opacity .4s ease var(--reveal-delay, 0ms),transform 1.1s var(--ease-spring) var(--reveal-delay, 0ms)}html.js [data-reveal=tag]:not(.is-revealed){transform:translateY(-26px) rotate(-22deg)}html.js [data-reveal=stamp]{transition:opacity .15s linear var(--reveal-delay, 0ms),transform .42s cubic-bezier(.5,0,.3,1.5) var(--reveal-delay, 0ms)}html.js [data-reveal=stamp]:not(.is-revealed){transform:scale(2.6) rotate(-14deg)}html.js [data-reveal=words],html.js [data-reveal=words]:not(.is-revealed){opacity:1;transform:none;transition:none}html.js [data-reveal=words] .reveal-word{transition:opacity .55s var(--ease-out),transform .9s var(--ease-soft-spring),filter .6s var(--ease-out);transition-delay:calc(var(--reveal-delay, 0ms) + var(--w, 0) * 65ms)}html.js [data-reveal=words]:not(.is-revealed) .reveal-word{opacity:0;transform:translateY(.55em) rotate(4deg);filter:blur(10px)}}
