@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/assets/bricolage-grotesque-vietnamese-wght-normal-BUzh504Q.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/assets/bricolage-grotesque-latin-ext-wght-normal-CcLUaPy7.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/assets/bricolage-grotesque-latin-wght-normal-DLoelf7F.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Figtree Variable;font-style:normal;font-display:swap;font-weight:300 900;src:url(/assets/figtree-latin-ext-wght-normal-DCwSJGxG.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Figtree Variable;font-style:normal;font-display:swap;font-weight:300 900;src:url(/assets/figtree-latin-wght-normal-D_ZTVpCC.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--bg:#fff5ea;--bg-2:#f6e8d6;--card:#fffdf9;--ink:#2b2118;--dim:#8d7c6c;--faint:#eadbc8;--line:#f1e2cf;--accent:#ff7a59;--warn:#c98a12;--danger:#d2492f;--display:"Bricolage Grotesque Variable", "Bricolage Grotesque", ui-rounded, sans-serif;--text:"Figtree Variable", "Figtree", ui-sans-serif, sans-serif;--shadow:0 1px 0 #2b21180f, 0 6px 18px -12px #2b211840;--safe-top:env(safe-area-inset-top,0px);--safe-bottom:env(safe-area-inset-bottom,0px);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}*{box-sizing:border-box;margin:0;padding:0}html,body{background:var(--bg);color:var(--ink);font-family:var(--text);-webkit-font-smoothing:antialiased}body{-webkit-tap-highlight-color:transparent;overscroll-behavior-y:none;min-height:100dvh}button{font:inherit;color:inherit;cursor:pointer;background:0 0;border:0}input,select,textarea{font:inherit;color:inherit;font-size:16px}.app{max-width:520px;min-height:100dvh;padding:calc(var(--safe-top) + 20px) 0 calc(var(--safe-bottom) + 108px);margin:0 auto;position:relative}.head{align-items:center;gap:18px;padding:0 22px;display:flex}.head .date{color:var(--dim);font-size:13px;font-weight:600}.head h1{font-family:var(--display);letter-spacing:-.02em;margin-top:4px;font-size:34px;font-weight:800;line-height:1}.head .back{color:var(--accent);margin-top:6px;font-size:13px;font-weight:700}.ring{flex:none;width:92px;height:92px;margin-left:auto;position:relative}.ring svg{display:block;transform:rotate(-90deg)}.ring circle{fill:none;stroke-width:11px;stroke-linecap:round}.ring .bg{stroke:var(--line)}.ring .fg{stroke:var(--accent);transition:stroke-dashoffset .6s cubic-bezier(.2,.9,.2,1)}.ring .lab{text-align:center;font-family:var(--display);place-items:center;font-size:22px;font-weight:800;line-height:1;display:grid;position:absolute;inset:0}.ring .lab small{font-family:var(--text);color:var(--dim);margin-top:3px;font-size:10.5px;font-weight:600;display:block}.strip{justify-content:space-between;margin:20px 18px 4px;display:flex}.strip button{color:var(--dim);flex-direction:column;align-items:center;gap:6px;padding:2px;font-size:11.5px;font-weight:600;display:flex}.strip .dot{background:conic-gradient(var(--accent) calc(var(--p) * 1%), var(--line) 0);border-radius:50%;place-items:center;width:36px;height:36px;display:grid;position:relative}.strip .dot:before{content:"";background:var(--bg);border-radius:50%;position:absolute;inset:4px}.strip .dot b{color:var(--ink);font-size:13px;font-weight:700;position:relative}.strip .sel .dot:before{background:var(--ink)}.strip .sel .dot b{color:#fff}.strip .sel{color:var(--ink)}.sec{font-family:var(--display);align-items:center;gap:8px;padding:20px 22px 8px;font-size:15px;font-weight:700;display:flex}.sec span{color:var(--dim);font-size:12px;font-family:var(--text);font-weight:600}.sec.muted{color:var(--dim)}.row{background:var(--card);box-shadow:var(--shadow);--tint:color-mix(in srgb, var(--col) 16%, #fffdf9);border-radius:20px;align-items:center;gap:12px;margin:0 14px 10px;padding:10px 10px 10px 12px;display:flex}.row.off{opacity:.62;box-shadow:none;outline:1.5px dashed var(--faint);outline-offset:-1.5px;background:0 0}.row .open{text-align:left;flex:1;align-items:center;gap:12px;min-width:0;display:flex}.emo{background:var(--tint);width:44px;height:44px;font-size:22px;font-family:var(--display);color:var(--col);border-radius:14px;flex:none;place-items:center;font-weight:800;display:grid}.row .txt{flex:1;min-width:0}.row .t{white-space:nowrap;text-overflow:ellipsis;font-size:16px;font-weight:700;overflow:hidden}.row .m{color:var(--dim);white-space:nowrap;align-items:center;gap:8px;margin-top:3px;font-size:12.5px;display:flex}.row.done .t{-webkit-text-decoration:line-through #2b211840;text-decoration:line-through #2b211840;text-decoration-thickness:2px}.flame{color:#e8603c;background:#ffe7dc;border-radius:99px;align-items:center;gap:3px;padding:1px 8px 1px 6px;font-size:12px;font-weight:700;display:inline-flex}.flame.cold{color:var(--dim);background:#f4ebe0}.pips{gap:3px;display:inline-flex}.pips i{background:var(--faint);border-radius:50%;width:7px;height:7px}.pips i.on{background:var(--col)}.chk{border-radius:50%;flex:none;place-items:center;width:52px;height:52px;display:grid}.chk .c{border:3px solid var(--col);color:#fff;border-radius:50%;place-items:center;width:38px;height:38px;transition:background .2s;display:grid}.chk svg{opacity:0;transition:all .3s cubic-bezier(.3,1.7,.5,1);transform:scale(.3)rotate(-20deg)}.row.done .chk .c{background:var(--col)}.row.done .chk svg{opacity:1;transform:none}.chk:active .c{transform:scale(.92)}.pending-dot{background:var(--warn);border-radius:50%;width:7px;height:7px;display:inline-block}.next{background:var(--ink);color:#fff5ea;border-radius:20px;align-items:center;gap:14px;margin:14px 14px 0;padding:14px 16px;display:flex}.next .badge{width:46px;height:46px;color:var(--ink);font-family:var(--display);background:#f5c443;border-radius:50%;flex:none;place-items:center;font-size:17px;font-weight:800;display:grid}.next p{color:#e9dccd;font-size:13px;line-height:1.4}.next p b{color:#fff}.empty{text-align:center;color:var(--dim);margin:40px 22px;line-height:1.5}.empty h2{font-family:var(--display);color:var(--ink);margin-bottom:8px;font-size:22px;font-weight:800}.btn{background:var(--accent);color:#fff;height:48px;box-shadow:0 8px 20px -10px var(--accent);border-radius:16px;justify-content:center;align-items:center;gap:8px;padding:0 20px;font-size:15px;font-weight:700;display:inline-flex}.btn.ghost{background:var(--bg-2);color:var(--ink);box-shadow:none}.btn.danger{color:var(--danger);box-shadow:none;background:#fbe1da}.btn:disabled{opacity:.5}.empty .btn{margin-top:18px}.sync{border-radius:14px;align-items:center;gap:10px;margin:0 14px 12px;padding:10px 14px;font-size:13px;font-weight:600;display:flex}.sync.offline{color:#7a5506;background:#fff0cc}.sync.error{color:#8a2a17;background:#fbe1da}.sync .act{gap:6px;margin-left:auto;display:flex}.sync .act button{background:#ffffffb3;border-radius:10px;padding:6px 10px;font-size:12px;font-weight:700}.tabbar{width:min(100%,520px);height:calc(84px + var(--safe-bottom));padding:12px 0 var(--safe-bottom);background:linear-gradient(transparent, var(--bg) 35%);color:var(--dim);z-index:10;justify-content:space-around;align-items:flex-start;font-size:12px;font-weight:700;display:flex;position:fixed;bottom:0;left:50%;transform:translate(-50%)}.tabbar .on{color:var(--ink)}.tabbar>button:not(.plus){padding:14px 18px}.tabbar .plus{background:var(--accent);color:#fff;width:56px;height:56px;box-shadow:0 8px 20px -8px var(--accent);border-radius:18px;margin-top:-6px;font-size:30px;font-weight:600;line-height:1}.weeknav{align-items:center;gap:8px;margin-top:10px;padding:0 22px;display:flex}.weeknav span{flex:1;font-size:14px;font-weight:700}.weeknav button{background:var(--bg-2);border-radius:12px;width:36px;height:36px;font-size:16px;font-weight:800}.weeknav button:disabled{opacity:.35}.perfect{background:var(--card);box-shadow:var(--shadow);border-radius:20px;align-items:center;gap:14px;margin:16px 14px 0;padding:16px;display:flex}.perfect .big{font-family:var(--display);color:var(--accent);text-align:center;min-width:48px;font-size:40px;font-weight:800;line-height:1}.perfect p{color:var(--dim);font-size:13px;line-height:1.4}.perfect p b{color:var(--ink);font-size:15px;display:block}.grid{background:var(--card);box-shadow:var(--shadow);border-radius:20px;margin:12px 14px 0;padding:6px 14px 10px}.grid .gh,.grid .dots{grid-template-columns:repeat(7,1fr);justify-items:center;display:grid}.grid .gh{color:var(--dim);padding:6px 0 4px;font-size:11px;font-weight:700}.grid .gh .today{color:var(--ink)}.grid .gr{border-top:1px solid var(--line);text-align:left;width:100%;padding:10px 0 8px;display:block}.grid .gr .top{align-items:center;gap:8px;margin-bottom:8px;font-size:14px;font-weight:700;display:flex}.grid .gr .top span{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.grid .gr .top i{text-align:center;width:20px;font-size:16px;font-style:normal}.grid .gr .top .cnt{color:var(--dim);flex:none;font-size:12px;font-weight:700}.cell{border-radius:50%;width:24px;height:24px}.cell.done{background:var(--col)}.cell.miss{border:2px solid var(--faint)}.cell.free:after{content:"";background:var(--faint);border-radius:50%;width:4px;height:4px;margin:10px auto;display:block}.cell.todo{border:2px dashed color-mix(in srgb, var(--col) 60%, transparent)}.chips{flex-wrap:wrap;gap:8px;padding:0 14px;display:flex}.chip{background:var(--card);box-shadow:var(--shadow);border-radius:99px;align-items:center;gap:6px;padding:7px 12px;font-size:13px;font-weight:600;display:inline-flex}.chip b{font-family:var(--display);color:var(--accent);font-weight:800}.sheet-wrap{z-index:30;-webkit-backdrop-filter:blur(3px);background:#2b211852;justify-content:center;align-items:flex-end;animation:.18s ease-out fade;display:flex;position:fixed;inset:0}.sheet{background:var(--bg);width:min(100%,520px);max-height:94dvh;padding:10px 0 calc(var(--safe-bottom) + 24px);overscroll-behavior:contain;border-radius:28px 28px 0 0;animation:.28s cubic-bezier(.2,.9,.2,1) rise;overflow-y:auto}.sheet .grab{background:var(--faint);border-radius:3px;width:40px;height:5px;margin:0 auto 10px}.sheet .bar{align-items:center;gap:12px;padding:4px 18px 12px;display:flex}.sheet .bar h2{font-family:var(--display);letter-spacing:-.01em;flex:1;font-size:22px;font-weight:800}.sheet .bar .x{background:var(--bg-2);border-radius:50%;width:36px;height:36px;font-size:18px;font-weight:700}@media (width>=640px){.sheet-wrap{align-items:center}.sheet{border-radius:28px;max-height:88dvh}}@keyframes fade{0%{opacity:0}}@keyframes rise{0%{opacity:0;transform:translateY(40px)}}.stats{grid-template-columns:repeat(2,1fr);gap:10px;padding:0 14px;display:grid}.stat{background:var(--card);box-shadow:var(--shadow);border-radius:18px;padding:12px 14px}.stat b{font-family:var(--display);font-size:28px;font-weight:800;line-height:1.05;display:block}.stat span{color:var(--dim);font-size:12px;font-weight:600}.heat{background:var(--card);box-shadow:var(--shadow);scrollbar-width:none;border-radius:18px;margin:14px 14px 0;padding:12px;overflow-x:auto}.heat .months{color:var(--dim);grid-auto-columns:15px;grid-auto-flow:column;gap:3px;height:14px;margin-left:16px;font-size:10px;font-weight:600;display:grid}.heat .body{gap:3px;display:flex}.heat .days{color:var(--dim);grid-template-rows:repeat(7,15px);gap:3px;width:13px;font-size:9px;font-weight:600;display:grid}.heat .cols{grid-template-rows:repeat(7,15px);grid-auto-columns:15px;grid-auto-flow:column;gap:3px;display:grid}.heat i{background:#f6efe6;border-radius:4px;width:15px;height:15px}.heat i.done{background:var(--col)}.heat i.miss{background:color-mix(in srgb, var(--col) 14%, #fffdf9)}.heat i.none{background:0 0}.heat i.today{outline:2px solid var(--ink);outline-offset:-2px}.badges{scrollbar-width:none;gap:10px;padding:0 14px 4px;display:flex;overflow-x:auto}.heat::-webkit-scrollbar{display:none}.badges::-webkit-scrollbar{display:none}.badge-m{text-align:center;width:64px;color:var(--dim);flex:none;font-size:11px;font-weight:600}.badge-m .disc{width:54px;height:54px;font-family:var(--display);border:2.5px dashed var(--faint);color:var(--dim);border-radius:50%;place-items:center;margin:0 auto 6px;font-size:18px;font-weight:800;display:grid}.badge-m.won .disc{color:var(--ink);background:#f5c443;border:0;box-shadow:inset 0 -4px #00000014}.hist{padding:0 14px}.hist li{border-bottom:1px solid var(--line);justify-content:space-between;padding:10px 4px;font-size:14px;list-style:none;display:flex}.hist li span{color:var(--dim);font-variant-numeric:tabular-nums}.actions{gap:10px;padding:20px 14px 0;display:flex}.actions .btn{flex:1}.confirm{color:#6d2414;background:#fbe1da;border-radius:18px;margin:16px 14px 0;padding:14px;font-size:14px;line-height:1.45}.confirm .actions{padding:12px 0 0}.form{gap:18px;padding:0 18px;display:grid}.field>label{color:var(--dim);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px;font-size:12px;font-weight:700;display:block}.field input[type=text],.field input[type=email],.field input[type=password]{border:2px solid var(--line);background:var(--card);border-radius:14px;outline:none;width:100%;height:50px;padding:0 14px}.field input:focus{border-color:var(--accent)}.namebox{align-items:center;gap:10px;display:flex}.namebox .emo{width:50px;height:50px;font-size:24px}.emojis{grid-template-columns:repeat(8,1fr);gap:6px;display:grid}.emojis button{background:var(--card);border-radius:12px;height:40px;font-size:20px}.emojis button.on{outline:2.5px solid var(--accent)}.colors{flex-wrap:wrap;gap:10px;display:flex}.colors button{background:var(--c);border-radius:50%;width:36px;height:36px}.colors button.on{box-shadow:0 0 0 3px var(--bg), 0 0 0 5.5px var(--c)}.seg{background:var(--bg-2);border-radius:14px;grid-auto-columns:1fr;grid-auto-flow:column;gap:4px;padding:4px;display:grid}.seg button{height:40px;color:var(--dim);border-radius:11px;font-size:13.5px;font-weight:700}.seg button.on{background:var(--card);color:var(--ink);box-shadow:var(--shadow)}.wd{grid-template-columns:repeat(7,1fr);gap:6px;margin-top:10px;display:grid}.wd button{background:var(--card);height:40px;color:var(--dim);border-radius:12px;font-weight:700}.wd button.on{background:var(--accent);color:#fff}.stepper{align-items:center;gap:14px;margin-top:10px;display:flex}.stepper button{background:var(--card);width:40px;height:40px;box-shadow:var(--shadow);border-radius:12px;font-size:20px;font-weight:700}.stepper b{font-family:var(--display);text-align:center;min-width:24px;font-size:22px;font-weight:800}.form-error{color:var(--danger);font-size:13.5px;font-weight:600}.login{max-width:400px;padding:calc(var(--safe-top) + 80px) 22px 40px;margin:0 auto}.login .logo{width:72px;height:72px;margin-bottom:22px}.login h1{font-family:var(--display);letter-spacing:-.02em;font-size:36px;font-weight:800}.login p{color:var(--dim);margin:6px 0 28px}.login .btn{width:100%;margin-top:8px}.party{z-index:50;-webkit-backdrop-filter:blur(4px);background:#2b21188c;place-items:center;padding:24px;animation:.2s fade;display:grid;position:fixed;inset:0}.party .card{background:var(--bg);text-align:center;border-radius:32px;width:min(100%,360px);padding:30px 24px 22px;animation:.5s cubic-bezier(.3,1.5,.5,1) pop}.party .medal{width:120px;height:120px;font-family:var(--display);color:var(--ink);background:#f5c443;border-radius:50%;place-items:center;margin:0 auto 18px;font-size:46px;font-weight:800;display:grid;box-shadow:inset 0 -8px #00000014,0 0 0 10px #f5c44340}.party .medal small{margin-top:-6px;font-size:13px;font-weight:700;display:block}.party h2{font-family:var(--display);font-size:26px;font-weight:800;line-height:1.1}.party p{color:var(--dim);margin:8px 0 20px;line-height:1.45}.party .btn{width:100%}@keyframes pop{0%{opacity:0;transform:scale(.6)}}.confetti{pointer-events:none;z-index:60;border-radius:2px;width:8px;height:8px;animation:.9s ease-out forwards fly;position:fixed}@keyframes fly{to{transform:translate(var(--dx), var(--dy)) rotate(540deg);opacity:0}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}
