:root{--brand:#6a5acd;--navy:#3e3a58;--wave:#a9b5f7;--wave-gradient:linear-gradient(90deg,#f2b9dc,#c6a6f1 35%,#a9b5f7 65%,#9ed1fa);--brand-ink:#fff;--accent:#a9b5f7;--bg:#fef9f2;--card:#fff;--ink:#2e2b3b;--muted:#66637a;--line:#e7e3dd;--ok:#15803d;--bad:#b91c1c;--radius:16px}*{box-sizing:border-box}body,html{margin:0;padding:0}body{font-family:system-ui,-apple-system,Segoe UI,Roboto,Noto Sans,sans-serif;background:var(--bg);color:var(--ink);-webkit-tap-highlight-color:transparent}a{color:var(--brand)}.app{max-width:480px;margin:0 auto;min-height:100dvh;padding:calc(env(safe-area-inset-top) + 12px) 16px calc(env(safe-area-inset-bottom) + 96px)}h1{font-size:1.5rem;margin:8px 0 4px}h2{font-size:1.1rem;margin:24px 0 8px}p{line-height:1.45}.muted{color:var(--muted);font-size:.92rem}.center{text-align:center}.error{color:var(--bad);font-size:.95rem}.ok{color:var(--ok)}.topbar{display:flex;justify-content:space-between;margin-bottom:8px}.topbar,.topbar .title{align-items:center;gap:8px}.topbar .title{font-weight:700;font-size:1.2rem;display:inline-flex}.logo{display:block;margin:0 auto 4px}.icon-btn{border:1px solid var(--line);background:var(--card);border-radius:999px;width:40px;height:40px;font-size:1.1rem;color:var(--ink)}.btn,.icon-btn{display:inline-flex;align-items:center;justify-content:center;text-decoration:none;cursor:pointer}.btn{gap:6px;width:100%;padding:14px 18px;border:0;border-radius:12px;background:var(--brand);color:var(--brand-ink);font-size:1rem;font-weight:600}.btn:disabled{opacity:.55;cursor:default}.btn.ghost{background:transparent;color:var(--brand);border:1px solid var(--line)}.btn.small{width:auto;padding:8px 14px;font-size:.9rem}.btn.danger{background:var(--bad)}.btn.google{background:#fff;color:#1f1f1f;border:1px solid #dadce0;justify-content:center}.btn.google,.or{display:flex;align-items:center;gap:10px}.or{color:var(--muted);font-size:.85rem}.or:after,.or:before{content:"";flex:1 1;border-top:1px solid var(--line)}.linkish{background:none;border:0;color:var(--brand);font:inherit;padding:0;cursor:pointer;text-decoration:underline}label{display:block;font-weight:600;margin:14px 0 6px}input{width:100%;padding:14px;font-size:1.05rem;border:1px solid var(--line);border-radius:12px;background:#fff;color:var(--ink)}input:focus{outline:2px solid var(--brand);outline-offset:1px}input.pin{letter-spacing:.6em;text-align:center;font-size:1.6rem;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.stack>*+*{margin-top:12px}.panel{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:18px}.cards{display:grid;grid-gap:12px;gap:12px}.loyalty-card{display:block;text-decoration:none;border-radius:var(--radius);padding:16px 18px;min-height:120px;position:relative;overflow:hidden;border:1px solid rgba(15,31,61,.06);box-shadow:0 6px 18px rgba(10,58,140,.1)}.loyalty-card:after{content:"";position:absolute;right:-40px;top:-40px;width:140px;height:140px;border-radius:50%;background:hsla(0,0%,100%,.4)}.loyalty-card .name{font-weight:700;font-size:1.15rem}.loyalty-card .bal{font-size:2rem;font-weight:800;margin-top:18px}.loyalty-card .bal small{font-size:.9rem;font-weight:600;opacity:.8}.loyalty-card .icon{font-size:1.4rem;margin-right:6px}.empty{text-align:center;padding:40px 12px}.empty .big{font-size:3rem}.hero{border-radius:var(--radius);padding:18px;border:1px solid rgba(15,31,61,.06)}.hero .name{font-weight:700;font-size:1.2rem}.hero .bal{font-size:2.6rem;font-weight:800}.qr-box{background:#fff;border-radius:var(--radius);padding:16px;text-align:center;margin-top:14px;border:1px solid var(--line)}.qr{display:block;margin:0 auto;image-rendering:pixelated}.qr-placeholder{margin:0 auto;background:#f0f0f6;border-radius:8px}.code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:1.4rem;letter-spacing:.15em;font-weight:700}.stamps{display:grid;grid-gap:10px;gap:10px;margin:14px 0 6px}.stamp{aspect-ratio:1;border-radius:50%;border:2px dashed;display:flex;align-items:center;justify-content:center;font-weight:700;color:var(--muted);background:#fff}.stamp.on{color:#fff;border-style:solid}.reward{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 0;border-bottom:1px solid var(--line)}.reward:last-child{border-bottom:0}.reward .t{font-weight:600}.progress{height:6px;background:var(--line);border-radius:999px;overflow:hidden;margin-top:6px}.progress>span{display:block;height:100%;background:linear-gradient(90deg,#c6a6f1,var(--wave))}.history{list-style:none;padding:0;margin:0}.history li{display:flex;justify-content:space-between;padding:10px 0;border-bottom:1px solid var(--line);font-size:.95rem}.plus{color:var(--ok)}.minus,.plus{font-weight:700}.minus{color:var(--bad)}.claim{text-align:center}.claim .digits{font-size:3.4rem;font-weight:800;letter-spacing:.25em;margin:8px 0;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.badge{display:inline-block;font-size:.8rem;padding:3px 8px;border-radius:999px;background:#eeeafd;color:var(--navy)}.install{position:fixed;left:12px;right:12px;bottom:calc(env(safe-area-inset-bottom) + 12px);max-width:456px;margin:0 auto;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:14px;display:flex;gap:12px;align-items:center;box-shadow:0 10px 30px rgba(28,27,46,.18);z-index:10}.install p{margin:4px 0 0;font-size:.9rem;color:var(--muted)}.install-actions{display:flex;flex-direction:column;gap:6px}.scanner{position:relative;border-radius:var(--radius);overflow:hidden;background:#000;aspect-ratio:1}.scanner video{width:100%;height:100%;object-fit:cover;display:block}.scanner-frame{position:absolute;inset:18%;border:3px solid hsla(0,0%,100%,.85);border-radius:18px}.scanner video[hidden]{display:none}.scanner-error{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;color:#fff;padding:24px;text-align:center}.scanner-error p{margin:0}.scanner-start{font:inherit;font-weight:600;padding:12px 22px;border-radius:999px;border:0;background:#fff;color:#222;cursor:pointer}.scanner-start:disabled{opacity:.7}.row{display:flex;gap:10px;align-items:center}.spacer{flex:1 1}.device{display:flex;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--line)}.byline,.device{align-items:center}.byline{display:inline-flex;gap:6px;color:var(--muted);font-size:.85rem;text-decoration:none}.byline img{width:18px;height:18px}.toasts{position:fixed;z-index:50;left:50%;transform:translateX(-50%);bottom:calc(env(safe-area-inset-bottom) + 20px);width:min(92vw,400px);display:flex;flex-direction:column;gap:8px;pointer-events:none}.toast-item{pointer-events:auto;display:flex;align-items:center;gap:10px;cursor:default;background:#fff;color:var(--ink);border:1px solid var(--line);border-radius:12px;padding:11px 14px;font-size:.95rem;line-height:1.35;box-shadow:0 8px 24px rgba(10,58,140,.12);animation:toast-in .22s ease-out}.toast-icon{flex:none;width:22px;height:22px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:.8rem;font-weight:700;color:#fff}.toast-item.success .toast-icon{background:#1f9152}.toast-item.error .toast-icon{background:#c53030}.toast-item.info .toast-icon{background:var(--brand)}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}@media (prefers-reduced-motion:reduce){.toast-item{animation:none}}.ad-slot{margin:4px 0 16px;text-align:center}.ad-label{display:block;color:var(--muted);font-size:.7rem;letter-spacing:.06em;text-transform:uppercase;margin-bottom:4px}.ad-slot iframe{display:block;width:100%;max-width:336px;margin:0 auto;border:0;border-radius:8px}.reward.mystery .t{color:var(--brand,inherit)}.reveal{position:relative;overflow:hidden}.reveal .box{font-size:5rem;height:6rem;line-height:6rem;animation:box-shake .9s ease-in-out .1s,box-pop .35s ease-in 1s forwards}.reveal .prize{position:relative;margin-top:-6rem;opacity:0;animation:prize-in .5s ease-out 1.25s forwards}.reveal .prize h1{font-size:2rem;margin:6px 0}.confetti{position:absolute;inset:0;pointer-events:none}.confetti i{position:absolute;top:-12px;width:8px;height:14px;border-radius:2px;opacity:0;animation:confetti-fall 2.4s ease-in forwards}@keyframes box-shake{0%,to{transform:rotate(0)}20%{transform:rotate(-12deg)}40%{transform:rotate(10deg)}60%{transform:rotate(-8deg)}80%{transform:rotate(6deg)}}@keyframes box-pop{to{transform:scale(1.6);opacity:0;visibility:hidden}}@keyframes prize-in{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:none}}@keyframes confetti-fall{0%{opacity:1;transform:translateY(0) rotate(0)}to{opacity:0;transform:translateY(70vh) rotate(540deg)}}.boxes{display:grid;grid-gap:8px;gap:8px;width:100%;max-width:360px;margin:18px auto}.boxes.n5{gap:6px}.bx{aspect-ratio:1;display:flex;align-items:center;justify-content:center;padding:2px;border:0;border-radius:14px;font:inherit;font-size:1.9rem;line-height:1;background:linear-gradient(145deg,#f2b9dc,#c6a6f1 55%,#a9b5f7);box-shadow:0 3px 0 rgba(62,58,88,.18);color:var(--ink,#3e3a58);overflow:hidden}.boxes.n3 .bx{font-size:2.6rem}.boxes.n5 .bx{font-size:1.5rem;border-radius:10px}button.bx{cursor:pointer;transition:transform .12s}button.bx:active:not(:disabled){transform:scale(.9)}button.bx:disabled:not(.opening){opacity:.55}.bx.opening{animation:box-shake .6s ease-in-out infinite}.bx.open{background:#fff;box-shadow:inset 0 0 0 2px #e6e0f2;font-size:.68rem;font-weight:600;text-align:center;word-break:break-word;animation:bx-open .4s ease-out both}.boxes.n3 .bx.open{font-size:.85rem}.bx.open span{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.bx.open.none{color:var(--muted);font-size:1rem}.bx:not(.mine).open{opacity:.75}.bx.mine{position:relative;z-index:1;animation:box-shake .7s ease-in-out,bx-open .4s ease-out .7s both}.bx.mine.open{background:#fff7d6;box-shadow:inset 0 0 0 3px var(--brand,#6a5acd);opacity:1}.opened .result{opacity:0;animation:prize-in .5s ease-out 1.1s forwards}.opened .result h1{font-size:1.8rem;margin:6px 0}@keyframes bx-open{0%{transform:scale(.4) rotate(-8deg)}to{transform:none}}@media (prefers-reduced-motion:reduce){.confetti,.reveal .box{display:none}.reveal .prize{margin-top:0}.bx,.bx.mine,.bx.open,.bx.opening,.opened .result,.reveal .prize{opacity:1;animation:none}}