:root{--bg:#f4f2f8;--card:#ffffff;--ink:#1c1a22;--muted:#8a8595;--line:#e8e4ef;--hairline:rgba(60,50,80,0.1);--darling:#e84393;--darling-soft:#fdf0f6;--darling-line:#f8cfe3;--niang:#6c5ce7;--niang-soft:#f3f1fd;--niang-line:#ddd6fa;--green:#00a072;--green-soft:#e9f9f2;--amber:#d97706;--amber-soft:#fff7e6;--blue:#0a84ff;--blue-soft:#eaf4ff;--radius:18px;--shadow:0 1px 3px rgba(40,30,70,0.07),0 8px 28px rgba(40,30,70,0.05)}*{box-sizing:border-box;margin:0;padding:0}html{-webkit-text-size-adjust:100%}body{background:var(--bg);color:var(--ink);font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,Segoe UI,system-ui,sans-serif;-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent;overscroll-behavior-y:none}button,input,select,textarea{touch-action:manipulation;font-family:inherit}.container{max-width:680px;margin:0 auto;padding:14px max(16px,env(safe-area-inset-right)) calc(96px + env(safe-area-inset-bottom)) max(16px,env(safe-area-inset-left));display:flex;flex-direction:column;gap:16px}.hero{position:relative;height:calc(170px + env(safe-area-inset-top));background-size:cover;background-position:center 32%;display:flex;align-items:flex-end}.hero-overlay{width:100%;padding:40px 20px 14px;background:linear-gradient(transparent,rgba(28,20,45,.72));color:#fff}.hero-title{font-size:1.55rem;font-weight:800;letter-spacing:-.02em}.hero-subtitle{font-size:.85rem;opacity:.85}.page-title{padding:calc(18px + env(safe-area-inset-top)) 20px 4px;max-width:680px;margin:0 auto;font-size:1.7rem;font-weight:800;letter-spacing:-.02em}.card{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px}.card h2{font-size:1.02rem;font-weight:700;letter-spacing:-.01em;margin-bottom:2px}.card .sub{color:var(--muted);font-size:.82rem;margin-bottom:14px}.gate{min-height:100dvh;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:22px;padding:20px;text-align:center}.gate h1{font-size:1.7rem;font-weight:800}.gate-options{display:flex;gap:14px;flex-wrap:wrap;justify-content:center}.gate-btn{border:2px solid var(--line);background:var(--card);border-radius:var(--radius);padding:26px 34px;font-size:1.1rem;font-weight:700;color:var(--ink);cursor:pointer;box-shadow:var(--shadow);transition:transform .15s,border-color .15s}.gate-btn:active{transform:scale(.97)}.gate-btn .big{font-size:2.8rem;display:block;margin-bottom:8px}.gate-btn.darling:hover{border-color:var(--darling)}.gate-btn.niang:hover{border-color:var(--niang)}.upcoming{background:linear-gradient(135deg,var(--blue-soft),#f0eaff);border:1px solid #c9defa;border-radius:var(--radius);padding:14px 16px;display:flex;align-items:center;gap:12px}.upcoming .plane{font-size:1.7rem}.upcoming .label{font-size:.68rem;font-weight:800;letter-spacing:.08em;color:var(--blue)}.upcoming .what{font-weight:700;font-size:.95rem}.upcoming .detail{color:var(--muted);font-size:.8rem}.people{display:grid;grid-template-columns:1fr 1fr;grid-gap:12px;gap:12px}@media (max-width:460px){.people{grid-template-columns:1fr}}.person{border-radius:var(--radius);padding:16px;text-align:center;border:1px solid}.person.darling{background:var(--darling-soft);border-color:var(--darling-line)}.person.niang{background:var(--niang-soft);border-color:var(--niang-line)}.person .emoji{font-size:2.1rem}.person h3{font-size:1rem;font-weight:700;margin:2px 0}.person .where{font-size:.92rem;font-weight:600}.person.darling .where{color:var(--darling)}.person.niang .where{color:var(--niang)}.person .clock{font-size:1.8rem;font-weight:800;font-feature-settings:"tnum";font-variant-numeric:tabular-nums;letter-spacing:-.02em;margin-top:4px}.person .date{color:var(--muted);font-size:.8rem}.person .meta{margin-top:6px;font-size:.75rem;color:var(--muted)}.badge-you{display:inline-block;font-size:.58rem;font-weight:800;letter-spacing:.06em;text-transform:uppercase;background:var(--ink);color:#fff;border-radius:99px;padding:2px 7px;margin-left:5px;vertical-align:middle}.call-status{margin-top:14px;border-radius:13px;padding:12px 14px;text-align:center;font-weight:600;font-size:.95rem}.call-status.good{background:var(--green-soft);color:var(--green)}.call-status.meh{background:var(--amber-soft);color:var(--amber)}.call-status.bad{background:#f1f0f4;color:#7a7585}.callbar{margin-top:12px}.callbar-track{display:flex;height:22px;border-radius:7px;overflow:hidden;border:1px solid var(--line)}.callbar-hour{flex:1 1}.callbar-hour.overlap{background:#5fdcb0}.callbar-hour.one{background:#fce29a}.callbar-hour.none{background:#f1f0f4}.callbar-hour.now{outline:2px solid var(--ink);outline-offset:-2px;border-radius:4px}.callbar-labels{display:flex;justify-content:space-between;font-size:.66rem;color:var(--muted);margin-top:4px}.callbar-legend{display:flex;gap:12px;justify-content:center;font-size:.7rem;color:var(--muted);margin-top:7px}.dot{display:inline-block;width:9px;height:9px;border-radius:99px;margin-right:4px}.countdown{background:linear-gradient(135deg,var(--darling-soft),var(--niang-soft));border:1px solid var(--niang-line);border-radius:var(--radius);padding:20px;text-align:center}.countdown .label{font-weight:700;font-size:.85rem;color:var(--niang)}.countdown .num{font-size:3rem;font-weight:800;color:var(--darling);line-height:1.1;letter-spacing:-.03em}.countdown .what{font-weight:700;margin-top:4px}.countdown .detail{color:var(--muted);font-size:.82rem;margin-top:2px}.flight-list{display:flex;flex-direction:column;gap:8px;margin-top:12px}.flight{display:flex;align-items:center;gap:11px;background:#faf9fc;border:1px solid var(--line);border-radius:13px;padding:11px 13px}.flight .who{font-size:1.4rem}.flight .body{flex:1 1;min-width:0}.flight .title{font-weight:700;font-size:.9rem}.flight .info{color:var(--muted);font-size:.78rem}.flight .days{font-weight:700;font-size:.8rem;white-space:nowrap}.flight .days.darling{color:var(--darling)}.flight .days.niang{color:var(--niang)}.flight .del{background:none;border:none;cursor:pointer;color:#cfcad9;font-size:.95rem;padding:4px}.flight .del:hover{color:#ef4444}.flight.reunion{background:var(--green-soft);border-color:#b5ecd6}.add-form{margin-top:14px;background:#faf9fc;border:1px solid var(--line);border-radius:13px;padding:16px;display:flex;flex-direction:column;gap:11px}.form-row{display:grid;grid-template-columns:1fr 1fr;grid-gap:11px;gap:11px}@media (max-width:460px){.form-row{grid-template-columns:1fr}}.field label{display:block;font-size:.76rem;font-weight:600;color:var(--muted);margin-bottom:4px}.field input,.field select,.field textarea{width:100%;padding:10px 11px;border:1px solid var(--line);border-radius:10px;font-size:1rem;background:#fff;color:var(--ink)}.field input:focus,.field select:focus,.field textarea:focus{outline:2px solid var(--niang-line);border-color:var(--niang)}.check{display:flex;align-items:center;gap:8px;font-weight:600;font-size:.86rem}.check input{width:19px;height:19px;accent-color:var(--green)}.btn{font-size:.95rem;font-weight:700;border:none;border-radius:11px;padding:11px 18px;cursor:pointer;transition:filter .15s,transform .1s}.btn:active{transform:scale(.97)}.btn-primary{background:var(--niang);color:#fff}.btn-green{background:var(--green);color:#fff}.btn-ghost{background:#efedf4;color:var(--ink)}.btn-row{display:flex;gap:10px;justify-content:center}.link-btn{background:none;border:none;cursor:pointer;color:var(--niang);font-weight:600;font-size:.88rem;display:block;margin:12px auto 0}.launcher-grid{display:grid;grid-template-columns:1fr 1fr;grid-gap:11px;gap:11px}.launch-tile{border:none;border-radius:var(--radius);padding:20px 12px;color:#fff;cursor:pointer;text-align:center;transition:transform .12s,filter .15s}.launch-tile:active{transform:scale(.97)}.launch-tile .emoji{font-size:2rem;display:block;margin-bottom:5px}.launch-tile .name{font-size:.98rem;font-weight:700;display:block}.launch-tile .sub{font-size:.74rem;opacity:.85}.launcher-hint{text-align:center;color:var(--muted);font-size:.74rem;margin-top:11px}.rate-box{background:var(--green-soft);border-radius:13px;padding:14px;text-align:center;margin-bottom:14px}.rate-box .rate{font-size:1.25rem;font-weight:800;color:var(--green)}.rate-box .when{font-size:.72rem;color:var(--muted);margin-top:2px}.currency-grid{display:grid;grid-template-columns:1fr 1fr;grid-gap:12px;gap:12px}@media (max-width:460px){.currency-grid{grid-template-columns:1fr}}.currency-card{border-radius:13px;padding:15px;text-align:center;border:1px solid}.currency-card.usd{background:var(--blue-soft);border-color:#c9defa}.currency-card.sgd{background:#fff0f0;border-color:#fbd2d2}.currency-card .flag{font-size:1.7rem}.currency-card h3{font-size:.92rem;margin:3px 0}.currency-card .label{font-size:.74rem;color:var(--muted);margin-bottom:7px}.currency-card input{width:100%;padding:11px;border:1px solid var(--line);border-radius:10px;font-size:1.2rem;font-weight:700;text-align:center}.quick-row{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin-top:14px}.quick-row .btn{padding:7px 13px;font-size:.85rem}.card-header-row{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:4px}.card-header-row h2{margin-bottom:0}.card-header-row .sub{margin-top:2px}.btn-ghost{background:transparent;border:1.5px solid var(--line);color:var(--muted);padding:5px 12px;border-radius:999px;font-size:.82rem;font-weight:600}.btn-sm{padding:4px 10px;font-size:.8rem}.cal-form{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px;padding:12px;background:var(--bg);border-radius:12px}.cal-form input[type=date],.cal-form input[type=text]{border:1.5px solid var(--line);border-radius:10px;padding:8px 12px;font-size:.88rem;background:var(--card);color:var(--ink);flex:1 1;min-width:120px}.cal-form input.emoji-input{flex:0 0 72px;min-width:72px;text-align:center}.cal-form input:focus{outline:2px solid var(--niang-line);border-color:var(--niang)}.cal-tag{display:inline-block;margin-left:6px;padding:1px 7px;border-radius:999px;font-size:.68rem;font-weight:700;vertical-align:middle;letter-spacing:.02em}.cal-by{margin-left:5px;font-size:.72rem;font-weight:400}.cal-by,.ics-btn{color:var(--muted)}.ics-btn{background:none;border:none;padding:0;font-size:.7rem;font-weight:600;cursor:pointer;letter-spacing:.02em}.ics-btn:active{color:var(--niang)}.academic-list{display:flex;flex-direction:column}.academic-item{display:flex;align-items:center;gap:11px;padding:10px 2px;border-bottom:1px solid var(--hairline)}.academic-item:last-child{border-bottom:none}.academic-item .emoji{font-size:1.3rem}.academic-item .body{flex:1 1}.academic-item .title{font-weight:600;font-size:.9rem;line-height:1.3}.academic-item .when{color:var(--muted);font-size:.78rem}.academic-item .days{font-weight:700;font-size:.8rem;color:#4f46b8;white-space:nowrap}.board-composer{display:flex;gap:9px;margin-bottom:14px}.board-composer input{flex:1 1;padding:11px 13px;border:1px solid var(--line);border-radius:12px;font-size:1rem;background:#fff}.board-composer input:focus{outline:2px solid var(--darling-line);border-color:var(--darling)}.board-list{display:flex;flex-direction:column;gap:10px}.board-post{border-radius:14px;padding:12px 14px;border:1px solid}.board-post.darling{background:var(--darling-soft);border-color:var(--darling-line)}.board-post.niang{background:var(--niang-soft);border-color:var(--niang-line)}.board-post .head{display:flex;align-items:baseline;gap:7px;margin-bottom:3px}.board-post .name{font-weight:700;font-size:.82rem}.board-post.darling .name{color:var(--darling)}.board-post.niang .name{color:var(--niang)}.board-post .when{color:var(--muted);font-size:.7rem}.board-post .text{font-size:.96rem;line-height:1.45;overflow-wrap:anywhere}.board-post .foot{display:flex;justify-content:flex-end;margin-top:6px}.heart-btn{background:#fff;border:1px solid var(--line);border-radius:99px;padding:4px 11px;font-size:.82rem;font-weight:700;color:var(--darling);cursor:pointer;transition:transform .1s}.heart-btn:active{transform:scale(1.15)}.board-empty{text-align:center;color:var(--muted);font-size:.9rem;padding:18px 0}.board-hearts{text-align:center;color:var(--darling);font-size:.84rem;padding:4px 0}.board-hearts strong{font-weight:700}.ping-banner{background:linear-gradient(135deg,var(--darling-soft),#fde8f1);border:1px solid var(--darling-line);border-radius:var(--radius);padding:12px 16px;text-align:center;font-weight:600;font-size:.92rem;color:var(--darling)}.ping-fab{position:fixed;right:max(16px,env(safe-area-inset-right));bottom:calc(78px + env(safe-area-inset-bottom));width:56px;height:56px;border-radius:99px;border:none;background:var(--darling);color:#fff;font-size:1.5rem;cursor:pointer;box-shadow:0 6px 20px rgba(232,67,147,.4);transition:transform .15s;z-index:50}.ping-fab:active{transform:scale(1.1)}.heart-float{position:fixed;bottom:110px;font-size:1.9rem;animation:floatUp 2.4s ease-out forwards;pointer-events:none;z-index:60}@keyframes floatUp{0%{transform:translateY(0) scale(.6);opacity:1}to{transform:translateY(-65vh) scale(1.4);opacity:0}}.tabbar{position:fixed;left:0;right:0;bottom:0;z-index:40;display:flex;justify-content:space-around;padding:8px 8px calc(8px + env(safe-area-inset-bottom));background:rgba(252,251,254,.88);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);border-top:1px solid var(--hairline)}.tab{flex:1 1;max-width:110px;background:none;border:none;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:2px;padding:4px 0;color:var(--muted);font-size:.64rem;font-weight:600;border-radius:12px}.tab .icon{font-size:1.45rem;line-height:1.2;filter:grayscale(1) opacity(.55)}.tab.active{color:var(--niang)}.tab.active .icon{filter:none}.switch-person{text-align:center;color:var(--muted);font-size:.8rem}.switch-person button{background:none;border:none;cursor:pointer;color:var(--niang);font-weight:600;font-size:.8rem}.offline-note{background:var(--amber-soft);border:1px solid #fbe1ad;color:var(--amber);border-radius:12px;padding:10px 14px;font-size:.82rem;text-align:center}