/* Wordverse universe UI. One full-screen 3D star map; everything else floats on it as glass. */
:root{
  --space:#06070b;--ink:#f3eee4;--ink-2:#b9b2a5;--ink-3:#7c776e;--gold:#e6cb92;
  --glass:rgba(255,255,255,.075);--glass-hi:rgba(255,255,255,.14);--glass-edge:rgba(255,255,255,.2);--line-dim:rgba(255,255,255,.08);
  --display:'Iowan Old Style','Palatino Linotype','Palatino','Book Antiqua','Georgia',serif;
  --ui:-apple-system,BlinkMacSystemFont,'SF Pro Text','PingFang TC','Noto Sans TC','Microsoft JhengHei',system-ui,sans-serif;
  --chalk:'Kaiti TC','STKaiti','BiauKai','DFKai-SB','標楷體',var(--ui);
  color-scheme:dark;
}
*,*::before,*::after{box-sizing:border-box}
[hidden]{display:none!important}
html,body{height:100%;margin:0}
body{background:var(--space);color:var(--ink);font-family:var(--ui);overflow:hidden;-webkit-font-smoothing:antialiased;overscroll-behavior:none}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer;-webkit-tap-highlight-color:transparent;padding:0}
button:focus-visible,a:focus-visible,input:focus-visible{outline:2px solid var(--gold);outline-offset:3px}
a{color:inherit}
.glass{background:linear-gradient(180deg,var(--glass-hi),var(--glass));backdrop-filter:blur(26px) saturate(170%);-webkit-backdrop-filter:blur(26px) saturate(170%);border:1px solid var(--glass-edge);box-shadow:inset 0 1px 0 rgba(255,255,255,.28),0 18px 40px rgba(0,0,0,.45)}
.app{position:fixed;inset:0;overflow:hidden;overflow:clip}
#stage{position:absolute;inset:0;touch-action:none;cursor:grab;z-index:1}
#stage.drag{cursor:grabbing}
#stage canvas{position:absolute;inset:0;width:100%;height:100%;display:block}
.dim #map{opacity:.55;transition:opacity .6s}
.top{position:absolute;z-index:20;left:max(16px,env(safe-area-inset-left,0px));right:max(16px,env(safe-area-inset-right,0px));top:calc(14px + env(safe-area-inset-top,0px));display:flex;justify-content:space-between;align-items:center;gap:10px;pointer-events:none}
.top>*{pointer-events:auto}
.brand{display:flex;align-items:baseline;gap:8px;font-size:15px;letter-spacing:.02em}
.brand b{font-weight:600}.brand span{font-family:var(--display);font-style:italic;color:var(--ink-2)}
.pill{height:36px;padding:0 16px;border-radius:999px;font-size:14px;display:inline-flex;align-items:center;justify-content:center;gap:6px;white-space:nowrap}
.fit{position:absolute;z-index:14;right:max(16px,env(safe-area-inset-right,0px));top:calc(62px + env(safe-area-inset-top,0px));width:44px;height:44px;border-radius:50%;display:grid;place-items:center}
.hint{position:absolute;z-index:3;left:0;right:0;top:calc(112px + env(safe-area-inset-top,0px));text-align:center;font-size:12px;color:var(--ink-3);letter-spacing:.08em;margin:0;transition:opacity .6s;pointer-events:none}
.off{opacity:0!important;pointer-events:none!important}

/* home */
.home{position:absolute;inset:0;z-index:10;display:flex;flex-direction:column;justify-content:flex-end;padding:0 max(20px,env(safe-area-inset-left,0px)) calc(20px + env(safe-area-inset-bottom,0px));transition:opacity .5s,transform .6s;pointer-events:none}
.home>*{pointer-events:auto}
.home.gone{opacity:0;transform:translateY(24px)}.home.gone *{pointer-events:none}
.home-inner{max-width:520px;width:100%}
.eyebrow{font-size:12px;letter-spacing:.14em;color:var(--gold);margin:0}
.hero-line{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;margin:10px 0 0}
.hero-root{font-family:var(--display);font-style:italic;font-weight:400;font-size:clamp(72px,22vw,120px);line-height:.95;letter-spacing:-.02em}
.hero-mean{font-size:22px;color:#fff;margin:0;white-space:nowrap}
.hero-chain{font-family:var(--display);font-size:17px;color:var(--ink-2);margin:16px 0 22px;line-height:1.6}
.hero-chain em{color:var(--gold);font-style:normal}
.cta{height:56px;border-radius:999px;font-size:17px;font-weight:600;width:100%;display:flex;align-items:center;justify-content:center;gap:8px}
.gold{background:linear-gradient(180deg,#f0d9a8,#c9a463);color:#1b1408;box-shadow:inset 0 1px 0 rgba(255,255,255,.6),0 14px 34px rgba(201,164,99,.28)}
.row{display:flex;gap:10px;margin-top:12px}.row .pill{flex:1;height:46px;font-size:15px;color:var(--ink-2)}
.home-foot{display:flex;flex-wrap:wrap;gap:6px 14px;justify-content:center;margin-top:16px;font-size:11px;color:var(--ink-3)}
.home-foot a,.home-foot button{color:var(--ink-3);text-decoration:none;font-size:11px}

/* word card */
.card{position:absolute;z-index:15;left:max(12px,env(safe-area-inset-left,0px));right:max(12px,env(safe-area-inset-right,0px));bottom:calc(84px + env(safe-area-inset-bottom,0px));border-radius:30px;padding:20px 20px 18px;transition:transform .55s cubic-bezier(.22,.8,.2,1),opacity .4s;max-height:calc(100% - 200px);overflow:auto}
.card.hide{transform:translateY(calc(100% + 140px));opacity:0;pointer-events:none}
.card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.word{font-family:var(--display);font-size:34px;line-height:1.08;margin:0;font-weight:500;overflow-wrap:anywhere}
.word.rootw{font-style:italic;color:var(--gold)}
.mean{font-size:17px;margin:8px 0 0}
.pos{font-size:13px;color:var(--gold);margin-right:8px}
.speak{width:44px;height:44px;border-radius:50%;display:grid;place-items:center;flex:none}
.parts{display:flex;gap:6px;margin:14px 0 0;flex-wrap:wrap}
.parts b{font-family:var(--display);font-weight:400;font-size:16px;padding:4px 10px;border-radius:10px;background:rgba(255,255,255,.06);color:var(--ink-2)}
.parts b.core{color:#1b1408;background:var(--gold)}
.parts b.from{color:var(--ink);background:rgba(230,203,146,.18)}
.ex{margin:14px 0 0;font-family:var(--display);font-size:17px;line-height:1.45}
.ex small{display:block;font-family:var(--ui);font-size:14px;color:var(--ink-2);margin-top:4px}
.card-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:16px}
.step{font-size:13px;color:var(--ink-3);font-variant-numeric:tabular-nums}
.next{height:44px;padding:0 20px;border-radius:999px;font-size:15px;font-weight:600;white-space:nowrap}

/* dock */
.dock{position:absolute;z-index:16;left:50%;transform:translateX(-50%);bottom:calc(16px + env(safe-area-inset-bottom,0px));display:flex;gap:4px;padding:6px;border-radius:999px;transition:opacity .4s}
.dock button{white-space:nowrap;height:46px;min-width:84px;padding:0 16px;border-radius:999px;font-size:14px;color:var(--ink-2)}
.dock button.on{background:rgba(255,255,255,.16);color:var(--ink)}

/* sheets */
.scrim{position:absolute;inset:0;z-index:30;background:rgba(3,4,8,.55);opacity:0;pointer-events:none;transition:opacity .35s}
.scrim.on{opacity:1;pointer-events:auto}
.sheet{position:absolute;z-index:31;left:max(10px,env(safe-area-inset-left,0px));right:max(10px,env(safe-area-inset-right,0px));bottom:calc(10px + env(safe-area-inset-bottom,0px));border-radius:32px;padding:22px 20px 20px;transform:translateY(calc(100% + 120px));transition:transform .5s cubic-bezier(.22,.8,.2,1);max-height:calc(100% - 70px);overflow:auto;background:linear-gradient(180deg,rgba(34,35,44,.9),rgba(16,17,24,.93))}
.sheet.on{transform:none}
.app.tabbed .dock{z-index:33}
.app.tabbed .sheet.tab.on{bottom:calc(84px + env(safe-area-inset-bottom,0px));max-height:calc(100% - 150px)}
.sheet h2{font-size:22px;margin:0 0 6px;padding-right:34px;font-weight:600;text-wrap:balance}
.sheet p{color:var(--ink-2);font-size:15px;line-height:1.6;margin:0}
.grab{width:40px;height:5px;border-radius:3px;background:rgba(255,255,255,.25);margin:-8px auto 14px}
.x{position:absolute;right:14px;top:12px;width:34px;height:34px;border-radius:50%;color:var(--ink-2);font-size:20px;line-height:1}
.field{height:46px;border-radius:14px;padding:0 14px;width:100%;font:inherit;font-size:16px;color:var(--ink);background:rgba(255,255,255,.06);border:1px solid var(--line-dim);outline:none;min-width:0}
.field:focus{border-color:var(--gold)}
.note{font-size:12px!important;color:var(--ink-3)!important;margin-top:12px!important;text-align:center}
.msg{min-height:20px;text-align:center;font-size:13px!important;color:var(--gold)!important;margin-top:8px!important}

/* gift */
.gift-hero{text-align:center;display:flex;flex-direction:column;align-items:center}
.gift-star{width:54px;height:54px;filter:drop-shadow(0 0 18px rgba(230,203,146,.7));animation:twinkle 2.4s ease-in-out infinite}
@keyframes twinkle{50%{transform:scale(1.12) rotate(8deg)}}
.gift .eyebrow{margin:10px 0 4px}.gift h2{font-size:26px;margin:0;padding:0}
.gift-num{font-family:var(--display);font-size:84px;line-height:1;color:var(--gold);margin:14px 0 2px}
.gift-sub{font-size:16px!important;color:var(--ink)!important}
.gift-parts{display:flex;gap:26px;margin:18px 0 6px}
.gift-parts b{display:block;font-family:var(--display);font-weight:400;font-size:28px}
.gift-parts span{font-size:13px;color:var(--ink-2)}
.gift-note{font-size:13px!important;color:var(--ink-3)!important;margin-top:8px!important}
.claim-how{text-align:center;font-size:13px!important;margin:22px 0 10px!important}
.claim-row{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.claim-row .pill{height:44px;font-size:14px;padding:0 8px}
.mail-row{display:flex;gap:8px;margin-top:10px}.mail-row .pill{height:46px;flex:none}
.consent{display:flex;gap:10px;align-items:flex-start;margin:14px 2px 0;font-size:13px;color:var(--ink-2);line-height:1.5;cursor:pointer}
.consent input{width:18px;height:18px;margin:1px 0 0;accent-color:#c9a463;flex:none}
.later{display:block;margin:12px auto 0;font-size:13px;color:var(--ink-3)}
.themes{display:grid;margin:16px 0 0;border-top:1px solid var(--line-dim)}
.themes button{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:12px 2px 12px 10px;border-bottom:1px solid var(--line-dim);text-align:left;width:100%;border-left:2px solid transparent}
.themes button.now{border-left-color:var(--gold)}
.themes b{display:block;font-size:13px;letter-spacing:.1em;color:var(--gold);font-weight:600}
.themes small{display:block;font-size:13px;color:var(--ink-2);margin-top:2px}
.themes i{font-style:normal;font-family:var(--display);font-size:17px;color:var(--ink);font-variant-numeric:tabular-nums;white-space:nowrap}
.row.switch{margin-top:14px}.row.switch .pill{height:40px;font-size:13px}
.row .pill{min-width:0;overflow:hidden;text-overflow:ellipsis}
.focus-chip{position:absolute;z-index:14;left:max(16px,env(safe-area-inset-left,0px));top:calc(64px + env(safe-area-inset-top,0px));height:34px;padding:0 14px;border-radius:999px;font-size:12.5px;letter-spacing:.04em;color:var(--gold);transition:opacity .4s}
.free-back{width:100%;height:46px;margin-top:10px;font-size:15px;color:var(--ink)}
.back-link{font-size:13px;color:var(--ink-2);text-decoration:underline;text-underline-offset:3px;text-align:left}

/* pay */
.exams{display:grid;margin:16px 0 0;border-top:1px solid var(--line-dim)}
.exams>div,.exams>button{display:flex;justify-content:space-between;align-items:baseline;gap:10px;padding:12px 2px;border-bottom:1px solid var(--line-dim);text-align:left;width:100%}
.exams span{font-family:var(--display);font-size:19px}
.exams b{font-family:var(--display);font-weight:400;font-size:19px;color:var(--gold);font-variant-numeric:tabular-nums}
.exams small{font-size:13px;color:var(--ink-2);font-family:var(--ui)}
.weekly{margin-top:12px!important;font-size:14px!important;color:var(--ink)!important}
.weekly::before{content:"✦ ";color:var(--gold)}
.offer{margin:18px 0 16px;padding:14px 16px;border-radius:20px;background:rgba(230,203,146,.08);border:1px solid rgba(230,203,146,.28)}
.offer-t{font-size:13px!important;color:var(--gold)!important;letter-spacing:.06em}
.price{display:flex;align-items:baseline;gap:12px;margin:6px 0 4px}
.price s{color:var(--ink-3);font-size:20px}
.price strong{font-family:var(--display);font-size:56px;font-weight:400;color:var(--gold);line-height:1}
.price span{color:var(--ink-2);font-size:14px;line-height:1.4}
.timer{font-variant-numeric:tabular-nums;font-size:18px;color:var(--gold);font-weight:600}

/* review */
.g-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding-right:34px}
.g-total{display:flex;align-items:baseline;gap:6px}
.g-total b{font-family:var(--display);font-weight:400;font-size:40px;color:var(--gold);line-height:1;font-variant-numeric:tabular-nums}
.g-total span{color:var(--ink-2);font-size:13px}
.galaxy3d{position:relative;margin:6px -20px 0;height:clamp(210px,58vw,280px);touch-action:none;cursor:grab}
.galaxy3d.drag{cursor:grabbing}
.galaxy3d canvas{position:absolute;inset:0;width:100%;height:100%;display:block}
.g-word{position:absolute;margin:0!important;transform:translate(-50%,-130%);padding:5px 10px;border-radius:12px;background:rgba(16,17,24,.82);border:1px solid var(--glass-edge);font-size:13px!important;color:var(--ink)!important;white-space:nowrap;pointer-events:none;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}
.g-word b{font-family:var(--display);font-weight:500;font-size:16px;margin-right:6px}
.g-rows{list-style:none;margin:4px 0 0;padding:0;display:grid;grid-template-columns:repeat(4,1fr);gap:6px}
.g-rows li{display:grid;gap:2px;padding:9px 10px;border-radius:16px;background:rgba(255,255,255,.045);border:1px solid var(--line-dim);min-width:0}
.g-rows span{display:flex;align-items:center;gap:6px;font-size:13px;white-space:nowrap}
.g-rows b{font-family:var(--display);font-weight:400;font-size:24px;line-height:1.1;font-variant-numeric:tabular-nums}
.g-rows small{color:var(--ink-3);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.d{display:inline-block;width:8px;height:8px;border-radius:50%;flex:none}
.d.known{background:#fff3d2;box-shadow:0 0 8px 2px rgba(255,236,190,.7)}
.d.fuzzy{background:var(--gold);box-shadow:0 0 6px rgba(230,203,146,.6)}
.d.forgot{background:#8d7a59}
.d.new{border:1px solid #77736a}
.g-hint{font-size:12px!important;color:var(--ink-3)!important;margin:10px 0 0!important;text-align:center}
.flash{perspective:900px;margin-top:16px}
.flip{position:relative;height:160px;transform-style:preserve-3d;transition:transform .6s cubic-bezier(.22,.8,.2,1);cursor:pointer}
.flip.turn{transform:rotateY(180deg)}
.face{position:absolute;inset:0;border-radius:24px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;backface-visibility:hidden;-webkit-backface-visibility:hidden;background:rgba(255,255,255,.05);border:1px solid var(--line-dim);padding:16px;text-align:center}
.face.back{transform:rotateY(180deg)}
.face .word{font-size:36px}
.tap{font-size:12px;color:var(--ink-3)}
.rate{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:14px}
.rate .pill{height:48px;font-size:14px;padding:0 6px}
.left{text-align:center;font-size:13px!important;color:var(--ink-3)!important;margin-top:10px!important}
.empty{text-align:center;padding:20px 0 6px}
.coach{position:absolute;inset:0;border-radius:32px;background:rgba(10,16,14,.74);z-index:5}
.chalk{position:absolute;left:22px;right:22px;font-family:var(--chalk);font-size:22px;line-height:1.5;color:#f4f1e8;text-shadow:0 0 1px #fff,0 0 6px rgba(255,255,255,.35);letter-spacing:.04em;padding:14px 16px;border-radius:18px;border:1.5px dashed rgba(244,241,232,.45);background:rgba(255,255,255,.04)}
.chalk small{display:block;font-size:15px;opacity:.75;margin-top:4px}
.arrow{position:absolute;width:96px;height:72px;color:#f4f1e8}
.coach-next{position:absolute;right:22px;bottom:22px;height:44px;padding:0 20px;font-weight:600}

/* account */
.acct-rows{display:grid;margin:16px 0 0;border-top:1px solid var(--line-dim)}
.acct-rows>*{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:13px 2px;border-bottom:1px solid var(--line-dim);font-size:15px;text-align:left;width:100%;text-decoration:none}
.acct-rows span{color:var(--ink-2)}
.tg{width:46px;height:28px;border-radius:14px;background:rgba(255,255,255,.14);position:relative;flex:none;transition:background .25s}
.tg::after{content:"";position:absolute;left:3px;top:3px;width:22px;height:22px;border-radius:50%;background:#f3eee4;transition:transform .25s;box-shadow:0 2px 6px rgba(0,0,0,.35)}
.tg.on{background:#c9a463}.tg.on::after{transform:translateX(18px)}
.legal{display:flex;flex-wrap:wrap;gap:8px 16px;margin-top:16px;font-size:12px}
.legal a{color:var(--ink-3);text-decoration:none}

/* consent banner, toast */
.consent-bar{position:absolute;z-index:40;left:max(12px,env(safe-area-inset-left,0px));right:calc(72px + env(safe-area-inset-right,0px));top:calc(64px + env(safe-area-inset-top,0px));border-radius:22px;padding:14px 16px;font-size:13px;line-height:1.55;color:var(--ink-2);max-width:520px;margin:0 auto}
.consent-bar div{display:flex;gap:8px;margin-top:10px}.consent-bar .pill{flex:1;height:38px}
.toast{position:absolute;z-index:50;left:50%;transform:translateX(-50%);top:calc(150px + env(safe-area-inset-top,0px));width:max-content;max-width:calc(100% - 40px);border-radius:18px;padding:10px 16px;font-size:13px;line-height:1.5;text-align:center;transition:opacity .4s}

/* wide screens: same pieces, more room for the map */
@media (min-width:900px){
  .card{left:auto;right:24px;top:calc(120px + env(safe-area-inset-top,0px));bottom:auto;width:400px;max-height:calc(100% - 240px)}
  .card.hide{transform:translateX(120%)}
  .sheet{left:50%;right:auto;width:460px;bottom:auto;top:50%;transform:translate(-50%,-40%);opacity:0;pointer-events:none;transition:transform .45s cubic-bezier(.22,.8,.2,1),opacity .3s;max-height:calc(100% - 80px)}
  .sheet.on{transform:translate(-50%,-50%);opacity:1;pointer-events:auto}
  .grab{display:none}
  .consent-bar{right:auto;left:24px;width:420px;margin:0}
  .app.tabbed .sheet.tab.on{bottom:auto;max-height:calc(100% - 200px);top:calc(50% - 30px)}
  .home{justify-content:center;padding-left:8vw}
  .hint{top:auto;bottom:calc(92px + env(safe-area-inset-bottom,0px))}
  #reviewSheet{width:min(820px,calc(100% - 48px));display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);column-gap:28px;align-content:start}
  #reviewSheet>.g-head,#reviewSheet>.galaxy3d,#reviewSheet>.g-rows,#reviewSheet>.g-hint{grid-column:1}
  #reviewSheet>#reviewBody,#reviewSheet>#reviewEmpty{grid-column:2;grid-row:1/span 4;align-self:center}
  #reviewSheet .galaxy3d{margin:6px -8px 0 -20px;height:300px}
  #reviewSheet .flip{height:220px}
}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{transition-duration:.01ms!important;animation-duration:.01ms!important}}
