:root{--ink:#1d1b20;--muted:#8b8791;--line:#ebe9ee;--soft:#f4f3f6;--paper:#fff;--error:#b3261e;--font:ui-rounded, "SF Pro Rounded", "Segoe UI Variable Display", "Segoe UI", system-ui, sans-serif;--spring:cubic-bezier(.2, 1.45, .4, 1);--glide:cubic-bezier(.75, 0, .2, 1);--ease-slow:cubic-bezier(.65, 0, .2, 1);--ease-out:cubic-bezier(.22, 1, .36, 1)}*{box-sizing:border-box}html,body{overscroll-behavior:none;background:var(--paper);height:100%;color:var(--ink);font-family:var(--font);-webkit-font-smoothing:antialiased;margin:0;overflow:hidden}button{font:inherit;color:inherit}:focus-visible{outline:2px dashed var(--ink);outline-offset:3px}.app{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;position:fixed;inset:0}.ring-gem{z-index:1;cursor:grab;touch-action:none;opacity:0;background:0 0;border:0;border-radius:40%;padding:0;position:absolute;transform:translate(-50%,-50%)}.ring-gem img{pointer-events:none;width:100%;height:auto;transform:rotate(var(--tilt,0deg));transition:transform .22s var(--spring), filter .22s ease;display:block}.ring-gem:hover img{transform:scale(1.12) rotate(calc(var(--tilt,0deg) - 5deg));filter:drop-shadow(0 6px 8px #28141e2e)}.ring-gem:active{cursor:grabbing}.phase-docking .ring-gem,.phase-ready .ring-gem{animation:gem-in .8s var(--spring) both}@keyframes gem-in{0%{opacity:0;transform:translate(-50%,-50%)scale(.2)rotate(-30deg)}to{opacity:1;transform:translate(-50%,-50%)}}.stage{z-index:2;flex-direction:column;justify-content:center;align-items:center;gap:14px;transition:opacity .9s 1s;display:flex;position:absolute}.phase-intro .stage{opacity:0;pointer-events:none}.add-photo{cursor:pointer;background:0 0;border:0;place-items:center;padding:0;display:grid;position:absolute;inset:0}.add-photo:focus-visible{outline:none}.glow{opacity:0;pointer-events:none;background:radial-gradient(#0000002b 0%,#00000014 36%,#00000005 58%,#0000 70%);border-radius:50%;transition:opacity .45s;position:absolute;inset:-8% -6%}.plus{background:var(--paper);width:34px;height:34px;color:var(--ink);opacity:0;transition:opacity .3s ease, transform .4s var(--spring);border-radius:50%;place-items:center;display:grid;position:relative;transform:scale(.6);box-shadow:0 1px 2px #0000001f,0 6px 18px #00000014}.add-hint{color:#5d5963;opacity:0;font-size:13px;transition:opacity .3s 80ms,transform .3s 80ms;position:absolute;top:calc(50% + 28px);transform:translateY(-4px)}.add-photo:hover .glow,.add-photo:focus-visible .glow,.file-over .glow{opacity:1}.add-photo:hover .plus,.add-photo:focus-visible .plus,.file-over .plus,.add-photo:hover .add-hint,.add-photo:focus-visible .add-hint,.file-over .add-hint{opacity:1;transform:none}.add-photo:focus-visible .plus{outline:2px dashed var(--ink);outline-offset:3px}@media (hover:none){.glow{opacity:.7}.plus,.add-hint{opacity:1;transform:none}}.photo{animation:photo-in .5s var(--spring) both;touch-action:none;border-radius:4px;flex:none;position:relative;box-shadow:0 22px 60px -24px #1e142866}@keyframes photo-in{0%{opacity:0;scale:.94}}.photo.receiving{outline-offset:6px;outline:2px dashed #1d1b2047}.photo-clip{border-radius:inherit;position:absolute;inset:0;overflow:hidden}.photo-img{object-fit:cover;pointer-events:none;width:100%;height:100%;display:block}.placed{cursor:grab;touch-action:none;filter:drop-shadow(0 2px 2px #28141e47);height:auto;animation:place-in .32s var(--spring);transition:opacity .15s;position:absolute}.placed:active{cursor:grabbing}.placed.leaving{opacity:.35}@keyframes place-in{0%{opacity:0;scale:1.6}}.selection{pointer-events:none;border:1px dashed #1d1b2080;border-radius:12px;position:absolute}.sel-remove,.sel-handle{background:var(--paper);pointer-events:auto;border-radius:50%;place-items:center;display:grid;position:absolute;box-shadow:0 1px 3px #0003}.sel-remove{cursor:pointer;border:0;width:20px;height:20px;padding:0;top:-11px;right:-11px}.sel-handle{border:1.5px solid var(--ink);cursor:grab;touch-action:none;width:14px;height:14px;bottom:-7px;right:-7px}@media (pointer:coarse){.sel-remove,.sel-handle{width:34px;height:34px}.sel-remove{top:-40px;left:-40px;right:auto}.sel-handle{border-width:2px;bottom:-40px;right:-40px}.sel-remove svg{width:14px;height:14px}.sel-remove:after,.sel-handle:after{content:"";position:absolute;inset:-8px}}.generating-veil{background:#ffffff4d;place-items:center;display:grid;position:absolute;inset:0}.generating-veil:before{content:"";background:linear-gradient(105deg,#0000 38%,#ffffffb3 50%,#0000 62%) 0 0/260% 100%;animation:1.7s linear infinite sheen;position:absolute;inset:0}@keyframes sheen{0%{background-position:130% 0}to{background-position:-130% 0}}.twinkle{opacity:0;width:22px;animation:1.8s ease-in-out infinite twinkle;position:absolute;translate:-50% -50%}@keyframes twinkle{0%,to{opacity:0;rotate:none;scale:.3}50%{opacity:1;rotate:45deg;scale:1}}.veil-label{background:var(--paper);border-radius:999px;padding:7px 14px;font-size:13px;font-weight:500;position:relative;box-shadow:0 4px 16px #0000001a}.toolbar{border:1px solid var(--line);-webkit-backdrop-filter:blur(12px);animation:photo-in .5s var(--spring) .12s both;background:#ffffffe0;border-radius:999px;flex-wrap:wrap;justify-content:center;gap:2px;padding:4px;display:flex}.toolbar button,.lightbox-actions button,.lightbox-actions a{white-space:nowrap;height:34px;color:var(--ink);cursor:pointer;background:0 0;border:0;border-radius:999px;padding:0 14px;font-size:13.5px;font-weight:500;line-height:34px;text-decoration:none;transition:background .15s}.toolbar button:hover:not(:disabled),.lightbox-actions button:hover{background:var(--soft)}.toolbar .primary,.lightbox-actions .primary{background:var(--ink);color:var(--paper)}.toolbar .primary:hover:not(:disabled){background:#3a3640}.toolbar button:disabled{opacity:.4;cursor:default}@media (max-width:640px){.toolbar{border-radius:20px}.toolbar button{padding:0 11px;font-size:13px}}.stack{z-index:4;cursor:pointer;transition:transform .85s var(--ease-slow);background:0 0;border:0;padding:0;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.phase-docking .stack,.phase-ready .stack{transform:translate(-50%,-50%)translate(50vw)scale(.46)}.phase-ready .stack{transition:transform .5s var(--glide)}.phase-ready .stack:hover,.phase-ready .stack:focus-visible{transform:translate(-50%,-50%)translate(calc(50vw - 36px))scale(.48)}@media (max-aspect-ratio:20/21){.phase-docking .stack,.phase-ready .stack{transform:translate(-50%, -50%) translateY(calc(50vh - 60px - env(safe-area-inset-bottom,0px))) scale(.34)}.phase-ready .stack:hover,.phase-ready .stack:focus-visible{transform:translate(-50%, -50%) translateY(calc(50vh - 68px - env(safe-area-inset-bottom,0px))) scale(.36)}.with-photo.phase-ready .stack{transform:translate(-50%, -50%) translateY(calc(50vh + 30px - env(safe-area-inset-bottom,0px))) scale(.34)}.with-photo.phase-ready .stack:hover,.with-photo.phase-ready .stack:focus-visible{transform:translate(-50%, -50%) translateY(calc(50vh + 18px - env(safe-area-inset-bottom,0px))) scale(.36)}}.card{background:var(--soft);transform:rotate(var(--rot));animation:card-in 1.2s var(--ease-out) both;transition:transform .45s var(--spring);border-radius:7px;position:absolute;inset:0;overflow:hidden;box-shadow:0 16px 44px -14px #140a1e61}.card img{object-fit:cover;pointer-events:none;width:100%;height:100%;display:block}.phase-ready .stack:hover .card{transform:rotate(calc(var(--rot) * 1.7))}@keyframes card-in{0%{opacity:0;transform:translateY(60px)rotate(0)scale(1.08)}}.ghost{z-index:20;pointer-events:none;filter:drop-shadow(0 12px 14px #1e0a1e40);height:auto;transition:transform .18s var(--spring);position:fixed;transform:translate(-50%,-50%)scale(1.15)rotate(-6deg)}.ghost.over{transform:translate(-50%,-50%)scale(1.28)rotate(4deg)}.ghost.returning{filter:none;transition:left .36s var(--glide), top .36s var(--glide), transform .36s ease, filter .36s ease;transform:translate(-50%,-50%)}.flyer{z-index:30;pointer-events:none;transition:all .78s var(--glide);border-radius:6px;position:fixed;box-shadow:0 20px 50px -16px #140a1e73}.toast{left:50%;bottom:calc(22px + env(safe-area-inset-bottom,0px));z-index:70;background:var(--ink);max-width:min(90vw,460px);color:var(--paper);text-align:center;animation:toast-in .38s var(--spring);border-radius:14px;padding:10px 16px;font-size:13.5px;line-height:1.4;position:fixed;transform:translate(-50%)}.toast.error{background:var(--paper);color:var(--error);border:1px solid #f0d4d2;box-shadow:0 10px 30px -10px #0003}@keyframes toast-in{0%{opacity:0;translate:0 12px}}.gallery{z-index:50;padding:calc(24px + env(safe-area-inset-top,0px)) clamp(16px, 4vw, 56px) calc(96px + env(safe-area-inset-bottom,0px));opacity:0;visibility:hidden;transition:opacity .32s ease, transform .42s var(--glide), visibility 0s linear .42s;-webkit-user-select:none;user-select:none;background:#fffffff7;position:fixed;inset:0;overflow-y:auto;transform:translate(24px)}.gallery.open{opacity:1;visibility:visible;transition:opacity .32s ease, transform .42s var(--glide), visibility 0s;transform:none}.gallery-head{top:calc(-24px - env(safe-area-inset-top,0px));z-index:2;margin:calc(-24px - env(safe-area-inset-top,0px)) 0 20px;padding:calc(24px + env(safe-area-inset-top,0px)) 0 14px;background:#fffffff7;flex-wrap:wrap;align-items:center;gap:18px;display:flex;position:sticky}.gallery-head h1{letter-spacing:-.015em;margin:0;font-size:24px;font-weight:600}.scope{background:var(--soft);border-radius:999px;padding:3px;display:flex}.gallery-head .scope{flex:none}@media (max-width:640px){.gallery-head h1{flex:1 0 100%;font-size:22px}.gallery-head{gap:8px}.gallery-head .scope button{white-space:nowrap;height:28px;padding:0 10px;font-size:12.5px}.gallery-head .close{top:calc(22px + env(safe-area-inset-top,0px));width:34px;height:34px;position:absolute;right:0}}.scope button{height:30px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:999px;padding:0 14px;font-size:13.5px;font-weight:500}.scope button[aria-selected=true]{background:var(--paper);color:var(--ink);box-shadow:0 1px 3px #0000001a}.back-fab{left:50%;bottom:calc(24px + env(safe-area-inset-bottom,0px));z-index:3;background:var(--ink);height:44px;color:var(--paper);white-space:nowrap;cursor:pointer;transition:transform .18s var(--spring);border:0;border-radius:999px;padding:0 22px;font-size:14.5px;font-weight:600;position:fixed;transform:translate(-50%);box-shadow:0 6px 24px #00000038}.back-fab:hover{transform:translate(-50%)scale(1.04)}.close{border:1px solid var(--line);background:var(--paper);cursor:pointer;border-radius:50%;place-items:center;width:38px;height:38px;margin-left:auto;padding:0;display:grid}.gallery-empty{max-width:44ch;color:var(--muted);margin:40px 0;font-size:15px;line-height:1.5}.grid{grid-template-columns:repeat(auto-fill,minmax(min(200px,42vw),1fr));align-items:start;gap:14px;display:grid}.tile{background:var(--soft);border-radius:8px;width:100%;position:relative;overflow:hidden}.tile-open{cursor:zoom-in;background:0 0;border:0;width:100%;height:100%;padding:0;display:block}.heart,.love-btn{cursor:pointer;align-items:center;gap:6px;display:inline-flex}.heart{color:#3a3640;-webkit-backdrop-filter:blur(8px);background:#ffffffeb;border:0;border-radius:999px;height:32px;padding:0 10px;font-size:13px;font-weight:600;position:absolute;bottom:8px;right:8px;box-shadow:0 2px 8px #00000024}.heart.on,.love-btn.on{color:#e2457a}.heart.on svg,.love-btn.on svg{animation:heart-pop .46s var(--spring)}@keyframes heart-pop{0%{scale:.55}}.gallery.open .tile{animation:tile-in .48s var(--spring) both}@keyframes tile-in{0%{opacity:0;translate:0 16px}}.tile img{object-fit:cover;width:100%;height:100%;transition:transform .4s;display:block}.tile:hover img{transform:scale(1.03)}.lightbox{z-index:60;cursor:zoom-out;background:#fffffff7;flex-direction:column;justify-content:center;align-items:center;gap:16px;padding:24px;animation:.3s toast-in;display:flex;position:fixed;inset:0}.lightbox img{cursor:default;border-radius:6px;max-width:min(92vw,900px);max-height:calc(100vh - 140px);box-shadow:0 24px 60px -20px #140a1e66}.lightbox-actions{cursor:default;flex-wrap:wrap;justify-content:center;align-items:center;gap:6px;display:flex}.lightbox-actions .danger-ghost{color:var(--error)}.lightbox-actions .danger{border-color:var(--error);background:var(--error);color:#fff}.lightbox-actions button:disabled{opacity:.5;cursor:default}.confirm-text{color:#5d5963;text-align:center;max-width:34ch;margin-right:6px;font-size:13.5px;line-height:1.35}.lightbox-actions button{border:1px solid var(--line);background:var(--paper)}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;animation-delay:0s!important}}.bake{z-index:3;border-radius:inherit;pointer-events:none;position:absolute;inset:0;overflow:hidden}.bake:before{content:"";background:radial-gradient(at 50% 55%,#ffc48280,#ffa06e24 55%,#0000 78%);animation:1.5s ease-in-out both bake-heat;position:absolute;inset:0}.bake-sweep{background:linear-gradient(100deg,#0000,#fff4ded9 50%,#0000);width:60%;animation:1s cubic-bezier(.55,0,.25,1) .15s both bake-sweep;position:absolute;top:-10%;bottom:-10%;left:0}.bake-flash{opacity:0;background:#fff;animation:1.5s ease-in-out both bake-flash;position:absolute;inset:0}.bake-spark{opacity:0;width:18px;height:auto;animation:.8s ease-out both spark;position:absolute;translate:-50% -50%}.photo.baking .photo-clip{animation:1.5s ease-in-out bake-settle}.photo.baking .placed{animation:bake-gem 1.3s ease-in-out var(--bd,0s) both}@keyframes bake-heat{0%{opacity:0}45%{opacity:1}to{opacity:0}}@keyframes bake-sweep{0%{transform:translate(-100%)skew(-14deg)}to{transform:translate(220%)skew(-14deg)}}@keyframes bake-flash{0%,62%{opacity:0}78%{opacity:.5}to{opacity:0}}@keyframes spark{0%{opacity:0;rotate:none;scale:.2}35%{opacity:1;scale:1.15}to{opacity:0;rotate:80deg;scale:.45}}@keyframes bake-settle{0%{filter:none;scale:1}40%{filter:brightness(1.06)saturate(1.1);scale:1.012}75%{scale:.995}to{filter:none;scale:1}}@keyframes bake-gem{0%{filter:drop-shadow(0 2px 2px #28141e47);scale:1}40%{filter:brightness(1.25)saturate(1.25)drop-shadow(0 0 10px #ffd296f2);scale:1.12}75%{filter:brightness(1.05)drop-shadow(0 0 3px #ffd29680);scale:.94}to{filter:drop-shadow(0 1px 1px #28141e59);scale:1}}
