/* 기본 테마: 타이틀 일러스트(assets/ui/title_art.png)의 파스텔 하늘·흰 구름·노란 별 느낌.
   스테이지·곡 선택 화면은 data.js STAGES[].theme 색이 --t-* 변수로 들어와 무대 컨셉을 따라요. */
:root{--bg:#c7ebfb;--bg2:#eaf7ff;--panel:#ffffff;--ink:#27406b;--muted:#5d7396;--accent:#ffcf4a;--accent-ink:#4a3200;--sub:#e4f4fd;--sub-ink:#27406b;--line:#cfe6f5;--field:#eef7fd;--star:#f5b400;--navy:#1f3561}
*{box-sizing:border-box}
html,body{margin:0;height:100%;background:var(--bg);color:var(--ink);overflow:hidden;font-family:'Jua',system-ui,sans-serif;-webkit-user-select:none;user-select:none;touch-action:none;overscroll-behavior:none}
canvas{display:block}
#cv{position:fixed;inset:0}
#ov{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:max(16px,env(safe-area-inset-top)) 16px max(16px,env(safe-area-inset-bottom));background:linear-gradient(180deg,rgba(191,230,251,.96),rgba(234,247,255,.96));z-index:5;overflow:auto;touch-action:pan-y}
#ov.hide{display:none}
#ov.title-mode{padding:0;background:none}
.card{width:100%;max-width:520px;background:var(--panel);border-radius:24px;padding:22px;box-shadow:0 10px 30px rgba(60,120,170,.22),inset 0 0 0 3px #fff;border:2px solid var(--line);max-height:100%;overflow:auto;color:var(--ink)}
h1{font-size:32px;margin:4px 0 6px;font-weight:400;text-align:center;color:var(--navy)}
h2{font-size:22px;margin:16px 0 8px;font-weight:400;color:var(--navy)}
p{margin:6px 0;color:var(--muted);line-height:1.45}
.center{text-align:center}
.btn{display:block;width:100%;padding:14px;margin:8px 0;border:0;border-radius:16px;background:var(--accent);color:var(--accent-ink);font:inherit;font-size:20px;cursor:pointer;box-shadow:0 4px 0 #e0a92a}
.btn:active{transform:translateY(2px);box-shadow:0 2px 0 #e0a92a}
.btn.sub{background:var(--sub);color:var(--sub-ink);box-shadow:0 4px 0 #b9dcf2}
.btn.small{font-size:16px;padding:10px}
.row{display:flex;gap:8px}
.row>*{flex:1}
.chars{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;margin:12px 0}
.ch{background:var(--field);border-radius:16px;padding:12px;cursor:pointer;border:3px solid var(--line);text-align:left;color:var(--ink);font:inherit}
.ch:hover{border-color:var(--accent);background:#fffbea}
.dot{display:inline-flex;flex:none;width:40px;height:40px;border-radius:50%;align-items:center;justify-content:center;font-size:13px;color:#fff;margin-right:10px;text-shadow:0 1px 2px rgba(0,0,0,.4)}
.dot.big{width:96px;height:96px;font-size:28px;margin:6px auto}
.friend{display:flex;align-items:center;padding:8px 0;border-bottom:1px solid var(--line)}
.friend:last-child{border-bottom:0}
.small{font-size:14px;color:var(--muted)}
.songbtn{display:flex;justify-content:space-between;align-items:center;text-align:left}
.songbtn span:last-child{font-size:14px;opacity:.8}
.bar{height:12px;background:#e1eef7;border-radius:6px;overflow:hidden;margin:3px 0 8px}
.bar i{display:block;height:100%}
.tier{font-size:52px;text-align:center;margin:4px 0;text-shadow:0 3px 0 #fff,0 0 1px #fff}
table{width:100%;border-collapse:collapse;font-size:16px}
td{padding:5px 2px;color:var(--muted)}
td:last-child{text-align:right}
td input{width:90px;padding:6px;border-radius:8px;border:2px solid var(--line);background:var(--field);color:var(--ink);font:inherit;text-align:right}
.pill{display:inline-block;padding:2px 8px;border-radius:999px;background:var(--sub);font-size:13px;margin-left:6px;color:var(--sub-ink)}
.quote{background:#fff6d6;border-radius:14px;padding:14px;margin:12px 0;font-size:20px;text-align:center;color:var(--navy)}
.earned-stars{color:var(--star);letter-spacing:3px;white-space:nowrap}
.earned-stars.gold{color:#ff9d00;text-shadow:0 0 12px rgba(255,190,60,.6)}
.result-stars{text-align:center;margin:8px 0;font-size:42px;line-height:1.2}
.fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:12px 0}
.field{background:var(--field);color:var(--ink);font:inherit;text-align:left;padding:12px;border:2px solid var(--line);border-radius:12px;cursor:pointer}
.field strong,.field span{display:block}
.field strong{font-size:17px;font-weight:400}
.field span{font-size:13px;margin-top:6px;color:var(--muted)}
.field.selected{border-color:var(--stage-accent);box-shadow:inset 0 0 0 1px var(--stage-accent)}
button:disabled{opacity:.48;cursor:default}
.songbtn{gap:10px}
.songbtn>span:first-child{flex:1;min-width:0}
.songbtn>span:last-child{max-width:45%}
select#bg-field{width:100%;padding:10px;border-radius:10px;border:2px solid var(--line);background:var(--field);color:var(--ink);font:inherit;font-size:16px}
/* ---------- 타이틀 화면 ---------- */
.title-screen{position:fixed;inset:0;display:flex;flex-direction:column;align-items:center;overflow:hidden;cursor:pointer;
  padding:max(14px,env(safe-area-inset-top)) 12px max(14px,env(safe-area-inset-bottom));
  background:linear-gradient(180deg,#bfe6fb 0%,#c7ebfb 45%,#cdeefe 72%,#e9f7ff 100%)}
.title-screen::after{content:'';position:absolute;left:0;right:0;bottom:0;height:22vh;pointer-events:none;z-index:1;opacity:.95;
  background:radial-gradient(circle at 50% 100%,#fff 0 9vh,transparent 9.2vh) 0 0/20vh 100% repeat-x,radial-gradient(circle at 50% 100%,#fff 0 7vh,transparent 7.2vh) 10vh 2vh/20vh 100% repeat-x,linear-gradient(transparent 45%,rgba(255,255,255,.7) 75%,#fff 100%)}
.title-logo{flex:none;z-index:3;margin-top:7vh;animation:logo-drop .9s cubic-bezier(.3,1.6,.5,1) both}
.logo-text{margin:0;font-weight:400;font-size:clamp(38px,12.5vw,76px);line-height:1.1;letter-spacing:1px;white-space:nowrap;transform:rotate(-4deg);display:flex;justify-content:center}
.logo-text span{display:inline-block;color:var(--c);animation:letter-bob 2.6s ease-in-out var(--d) infinite;
  text-shadow:3px 0 0 #fff,-3px 0 0 #fff,0 3px 0 #fff,0 -3px 0 #fff,2px 2px 0 #fff,-2px 2px 0 #fff,2px -2px 0 #fff,-2px -2px 0 #fff,4px 1px 0 #fff,-4px 1px 0 #fff,0 7px 0 var(--navy),3px 7px 0 var(--navy),-3px 7px 0 var(--navy),0 9px 10px rgba(31,53,97,.35)}
.logo-text .gap{width:.35em}
.logo-image{display:block;width:min(82vw,500px);max-height:21vh;object-fit:contain;filter:drop-shadow(0 6px 0 rgba(31,53,97,.18))}
.title-logo.has-image{width:min(82vw,500px);height:21vh;display:flex;align-items:center;justify-content:center}
.title-art{flex:1 1 auto;min-height:0;width:100%;display:flex;align-items:flex-end;justify-content:center;z-index:2;margin:3vh 0 0}
.title-art img{display:block;max-width:min(100%,560px);max-height:100%;object-fit:contain;animation:art-breathe 4.5s ease-in-out infinite;
  -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 6%,#000 92%,transparent 100%),linear-gradient(90deg,transparent 0,#000 6%,#000 94%,transparent 100%);-webkit-mask-composite:source-in;
  mask-image:linear-gradient(180deg,transparent 0,#000 6%,#000 92%,transparent 100%),linear-gradient(90deg,transparent 0,#000 6%,#000 94%,transparent 100%);mask-composite:intersect}
.title-screen.no-art .title-art img{display:none}
.title-stars{position:absolute;inset:0;pointer-events:none;z-index:2}
.title-stars i{position:absolute;width:var(--s);height:var(--s);background:#ffd23f;clip-path:polygon(50% 0,62% 38%,100% 50%,62% 62%,50% 100%,38% 62%,0 50%,38% 38%);filter:drop-shadow(0 0 4px #fff7c2);animation:twinkle var(--t) ease-in-out var(--d) infinite}
.title-start{flex:none;z-index:3;text-align:center;margin:2.5vh 0 3vh;animation:blink 1.8s ease-in-out infinite}
.title-start b{display:block;font-weight:400;font-family:'Press Start 2P','Jua',monospace;font-size:clamp(11px,3.4vw,17px);letter-spacing:1px;color:var(--navy);text-shadow:2px 0 0 #fff,-2px 0 0 #fff,0 2px 0 #fff,0 -2px 0 #fff,0 3px 0 rgba(31,53,97,.2)}
.title-start small{display:block;font-size:clamp(12px,3.2vw,15px);color:var(--muted);margin-top:8px}
.title-flash{position:absolute;inset:0;background:#fff;opacity:0;pointer-events:none;z-index:5}
.title-screen.leaving .title-flash{animation:flash-out .32s ease-out forwards}
.title-screen.leaving .title-start{animation:none}
@keyframes logo-drop{0%{transform:translateY(-60vh)}60%{transform:translateY(2vh)}80%{transform:translateY(-1vh)}100%{transform:translateY(0)}}
@keyframes letter-bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
@keyframes art-breathe{0%,100%{transform:scale(1)}50%{transform:scale(1.025)}}
@keyframes twinkle{0%,100%{opacity:.15;transform:scale(.6) rotate(0)}50%{opacity:1;transform:scale(1) rotate(20deg)}}
@keyframes blink{0%,100%{opacity:1}50%{opacity:.35}}
@keyframes flash-out{0%{opacity:0}45%{opacity:.95}100%{opacity:1}}
@media (prefers-reduced-motion:reduce){.title-logo,.logo-text span,.title-art img,.title-stars i,.title-start{animation:none}}
/* ---------- 스테이지·곡 선택 화면 ---------- */
.screen{position:fixed;inset:0;display:flex;flex-direction:column;background:var(--t-list,var(--bg2));color:var(--t-ink,var(--ink));max-width:560px;margin:0 auto;overflow:hidden}
.map-wrap{position:relative;overflow:hidden;background:var(--t-list,#bfe6fb);flex:none;display:flex;justify-content:center;border-bottom:3px solid var(--t-border,var(--line))}
.map-wrap canvas{display:block;flex:none;touch-action:pan-y}
.nav{position:absolute;top:50%;transform:translateY(-50%);background:rgba(16,30,54,.72);color:#fff;border:1px solid rgba(255,255,255,.45);border-radius:999px;padding:8px 12px;font:inherit;font-size:15px;cursor:pointer;max-width:42%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.nav.left{left:8px}.nav.right{right:8px}.nav[hidden]{display:none}
.stage-info{padding:10px 16px;font-size:18px;background:var(--t-info,rgba(255,255,255,.6));flex:none}
.list-wrap{flex:1;position:relative;min-height:0}
.song-list{height:100%;overflow:auto;padding:10px 12px 48px;touch-action:pan-y;-webkit-overflow-scrolling:touch}
.song-list .small{color:var(--t-ink,var(--muted));opacity:.75}
.song-card{display:flex;align-items:center;gap:10px;width:100%;background:var(--t-card,#fff);border:2px solid var(--t-border,var(--line));border-radius:14px;padding:10px;margin:0 0 10px;color:var(--t-ink,var(--ink));font:inherit;text-align:left;cursor:pointer;position:relative;overflow:hidden}
.song-card.locked{opacity:.5;filter:saturate(.6)}
.song-card .earned-stars{color:var(--t-star,var(--star))}
.cover{flex:none;width:56px;height:56px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:26px;color:#fff;overflow:hidden;text-shadow:0 1px 2px rgba(0,0,0,.5)}
.cover img{width:100%;height:100%;object-fit:cover;image-rendering:pixelated}
.meta{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}
.title{font-size:18px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;line-height:1.2}
.artist{font-size:13px;opacity:.75}
.badge{font-size:11px;padding:2px 6px;border-radius:6px;color:#1a1a1a;letter-spacing:.5px}
.new{font-size:11px;padding:2px 6px;border-radius:6px;background:var(--t-accent,var(--accent));color:#1a1a1a}
.stars{flex:none;font-size:18px}
.more{position:absolute;left:0;right:0;bottom:0;height:56px;background:linear-gradient(transparent,var(--t-list,var(--bg2)));pointer-events:none;display:none;align-items:flex-end;justify-content:center;font-size:14px;padding-bottom:6px;color:var(--t-accent,var(--accent))}
.list-wrap.has-more .more{display:flex}
.tabbar{flex:none;display:flex;background:var(--t-tab,#d5eefb);border-top:1px solid rgba(127,160,190,.3);padding-bottom:env(safe-area-inset-bottom)}
.tabbar button{flex:1;background:none;border:0;color:var(--t-ink,var(--ink));font:inherit;font-size:14px;padding:8px 4px 10px;cursor:pointer}
.tabbar button span{display:block;font-size:22px;line-height:1.2}
.tab-icon{display:block;width:30px;height:30px;margin:0 auto 3px;image-rendering:pixelated;image-rendering:crisp-edges;filter:drop-shadow(0 2px 0 rgba(0,0,0,.18))}
.tabbar button:active .tab-icon{transform:translateY(2px)}
.tabbar button[aria-current="page"]{background:color-mix(in srgb,var(--t-accent,#edb83a) 22%,transparent);box-shadow:inset 0 3px 0 var(--t-accent,#edb83a)}
.album-screen{background:linear-gradient(160deg,#eef8ff,#e7f2fb 60%,#f8f2e6);--t-tab:#dceef9;--t-ink:#27406b}
.album-header{flex:none;padding:max(14px,env(safe-area-inset-top)) 20px 14px;border-bottom:1px solid #d1e4f1;background:rgba(255,255,255,.66)}
.album-header h1{font-size:28px;margin:6px 0;overflow-wrap:anywhere;outline:none}
.album-header p{text-align:center;font-size:15px}
.album-back{min-height:44px;padding:6px 0;border:0;background:none;font:inherit;color:#385b80;cursor:pointer}
.album-content{flex:1;min-height:0;overflow-y:auto;touch-action:pan-y;padding:20px 18px 28px;overscroll-behavior:contain}
.album-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:22px 16px}
.album-tile{min-width:0;border:0;background:none;padding:0;text-align:left;font:inherit;color:var(--ink);cursor:pointer;border-radius:12px}
.album-tile:focus-visible,.album-back:focus-visible{outline:3px solid #426fa1;outline-offset:4px}
.album-art-wrap{display:block;position:relative;aspect-ratio:1;border-radius:12px;box-shadow:0 5px 12px rgba(39,64,107,.16);overflow:hidden;background:#d9e6f0}
.album-art-wrap img{display:block;width:100%;height:100%;object-fit:cover}
.album-tile:active .album-art-wrap{transform:scale(.97)}
.album-complete{position:absolute;right:6px;bottom:6px;padding:4px 7px;border-radius:8px;background:#fff0ab;color:#5d4614;font-size:12px;box-shadow:0 1px 5px #0002}
.album-name{display:block;margin-top:10px;font-size:17px;line-height:1.25;overflow-wrap:anywhere}
.album-count{display:block;margin-top:4px;font-size:14px;color:#647a96}
.album-detail{max-width:430px;margin:auto}
.album-art{display:block;width:min(70%,250px);aspect-ratio:1;object-fit:cover;margin:0 auto;border-radius:14px;box-shadow:0 7px 18px #27406b26}
.album-detail-count{text-align:center;margin:18px 0;color:#486181}
.album-track-list{list-style:none;margin:0;padding:0;border-radius:16px;background:#ffffffd9;border:1px solid #d5e6f2;overflow:hidden}
.album-track-list li{display:flex;align-items:center;gap:12px;padding:16px;border-bottom:1px solid #e3edf4}
.album-track-list li:last-child{border-bottom:0}
.album-track-list li>div{min-width:0;display:flex;flex-direction:column;gap:4px}
.album-track-check{flex:none;display:grid;place-items:center;width:28px;height:28px;border-radius:50%;color:#247664;background:#def3e8}
.album-track-title{font-size:19px;overflow-wrap:anywhere}
.album-empty{text-align:center;padding:35px 10px;max-width:360px;margin:auto}
.album-empty>img{width:72px;height:72px;image-rendering:pixelated}
.album-empty p{margin:12px 0 24px}
.online-account label,.ranking-controls label{display:flex;flex-direction:column;gap:7px;margin:14px 0;font-size:17px}
.online-account input{width:100%;min-width:0;padding:13px;border:2px solid var(--line);border-radius:12px;background:#fff;font:inherit;color:var(--ink);font-size:18px;user-select:text;touch-action:manipulation}
.online-notice{padding:12px;border-radius:12px;background:#fff5d8;font-size:14px;color:#705521;line-height:1.5}
.online-error{color:#b14443;font-size:15px;min-height:20px;overflow-wrap:anywhere}
.online-account button:disabled{opacity:.6;cursor:wait}
/* 랭킹: 곡 선택과 같은 무대 테마(--t-*) */
.ranking-screen{color:var(--t-ink,var(--ink))}
.rank-head{flex:none;display:flex;align-items:center;padding:max(10px,env(safe-area-inset-top)) 14px 6px}
.rank-head h1{flex:1;margin:0;font-size:26px;color:var(--t-ink,var(--navy))}
.rank-head .album-back{color:var(--t-ink,#385b80);opacity:.85;width:76px;text-align:left}
.rank-head-gap{width:76px}
.rank-stage{flex:none;display:flex;align-items:center;gap:8px;padding:10px 12px;background:var(--t-info);border-top:3px solid var(--t-border);border-bottom:3px solid var(--t-border)}
.rank-stage-name{flex:1;text-align:center;font-size:22px;line-height:1.15}
.rank-stage-name small{display:block;font-size:12px;opacity:.7}
.rank-arrow{flex:none;width:44px;height:44px;border-radius:50%;border:2px solid var(--t-border);background:var(--t-card);color:var(--t-ink);font:inherit;font-size:16px;cursor:pointer;box-shadow:0 3px 0 rgba(0,0,0,.2)}
.rank-arrow:active{transform:translateY(2px);box-shadow:0 1px 0 rgba(0,0,0,.2)}
.rank-arrow[hidden]{display:block;visibility:hidden}
.rank-arrow:disabled{opacity:.3;cursor:default;box-shadow:none}
.rank-song{flex:none;display:flex;align-items:center;gap:8px;padding:12px 12px 4px;touch-action:pan-y}
.rank-song-card{flex:1;margin:0;cursor:default}
.rank-song-card.from-right{animation:rank-from-right .28s ease-out}
.rank-song-card.from-left{animation:rank-from-left .28s ease-out}
@keyframes rank-from-right{from{opacity:0;transform:translateX(40px)}to{opacity:1;transform:none}}
@keyframes rank-from-left{from{opacity:0;transform:translateX(-40px)}to{opacity:1;transform:none}}
.rank-mode{background:none;padding:6px 12px}
.rank-mine{flex:none;display:flex;align-items:center;gap:10px;margin:2px 12px 6px;padding:8px 14px;border-radius:12px;background:var(--t-info);font-size:15px}
.rank-mine span{opacity:.75;font-size:13px}
.rank-mine b{flex:1;font-weight:400;font-size:18px}
.rank-mine b.none{font-size:14px;opacity:.7}
.rank-results{padding:8px 12px 12px}
.rank-results p,.rank-results .album-empty p{color:var(--t-ink,var(--muted));opacity:.8}
.rank-results .album-empty h2{color:var(--t-ink,var(--navy))}
.ranking-screen .online-account-link{flex:none;display:block;text-align:center;color:var(--t-ink,#355c8b);background:var(--t-card);border:1px solid var(--t-border);border-radius:999px;text-decoration:none;padding:6px 16px;min-height:0;margin:4px auto 8px;font-size:13px;box-shadow:none}
.ranking-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
.ranking-list li{display:flex;gap:12px;align-items:center;padding:12px;border-radius:14px;background:var(--t-card,#fff);border:2px solid var(--t-border,var(--line));color:var(--t-ink,var(--ink))}
.ranking-place{flex:none;width:34px;height:34px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:17px;background:rgba(127,140,160,.22)}
.ranking-list li.top1 .ranking-place{background:#ffd23f;color:#5a3a00;box-shadow:0 0 0 3px #fff6c2}
.ranking-list li.top2 .ranking-place{background:#d6dde6;color:#3a4658}
.ranking-list li.top3 .ranking-place{background:#e3a06a;color:#4a2610}
.ranking-name{flex:1;min-width:0;overflow-wrap:anywhere}
.ranking-name small{padding:2px 5px;border-radius:5px;background:#e0f3e8;color:#267358}
.ranking-list strong{flex:none;font-weight:400;font-size:18px;color:var(--t-accent,#355a82)}
.ranking-list .ranking-me{box-shadow:0 0 0 3px var(--t-accent) inset}
/* 메인 캐릭터 고르기: 친구들 화면과 같은 넘김 레이아웃(.friend-*)을 써요. */
.select-card .friend{cursor:pointer}
.select-card #pick-ok{margin-top:10px;box-shadow:0 4px 0 color-mix(in srgb,var(--fc,#e0a92a) 70%,#000)}
.toast{position:absolute;left:50%;bottom:92px;transform:translateX(-50%);background:rgba(16,30,54,.92);color:#fff;padding:10px 16px;border-radius:12px;font-size:15px;opacity:0;transition:opacity .2s;pointer-events:none;white-space:nowrap;z-index:2}
.toast.show{opacity:1}
/* 스테이지별 장식 모티프 (색은 data.js STAGES[].theme에서 변수로 들어와요) */
.song-card::after{position:absolute;right:10px;bottom:4px;font-size:12px;opacity:.45;color:var(--t-accent);pointer-events:none}
.screen[data-motif="note"] .song-card::after{content:'♪ ♫'}
.screen[data-motif="bunting"] .stage-info{background:linear-gradient(var(--t-info),var(--t-info)),repeating-linear-gradient(90deg,#ff7a59 0 14px,#ffcf4a 14px 28px,#70c8ef 28px 42px,#9bd14b 42px 56px);background-size:100% 100%,100% 4px;background-repeat:no-repeat;background-position:0 0,0 0}
.screen[data-motif="bunting"] .song-card::after{content:'';width:7px;height:7px;border-radius:50%;background:#ff7a59;box-shadow:-12px 0 0 #ffcf4a,-24px 0 0 #70c8ef,-36px 0 0 #9bd14b;opacity:.8;bottom:8px}
.screen[data-motif="curtain"] .stage-info{background:repeating-linear-gradient(90deg,rgba(0,0,0,.35) 0 10px,rgba(0,0,0,.15) 10px 20px)}
.screen[data-motif="curtain"] .song-card{border-style:double;border-width:4px}
.screen[data-motif="lightstick"] .song-card{box-shadow:0 0 10px rgba(62,230,212,.25)}
.screen[data-motif="lightstick"] .song-card::after{content:'';width:7px;height:7px;border-radius:50%;background:var(--t-accent);box-shadow:-12px 0 0 #ff7fb6,-24px 0 0 #ffe36b;opacity:.85;bottom:8px}
.screen[data-motif="chandelier"] .song-card::after{content:'✦ ✧ ✦';opacity:.6}
.screen[data-motif="stadium"] .song-card::after{content:'';width:48px;height:6px;background:repeating-linear-gradient(90deg,var(--t-accent) 0 3px,transparent 3px 6px);opacity:.55;bottom:8px}
.mode-select{display:flex;justify-content:center;gap:8px;padding:6px 12px;background:var(--t-list)}
.mode-select[hidden]{display:none}.mode-select button{border:1px solid var(--t-border);border-radius:12px;padding:6px 24px;background:var(--t-card);color:var(--t-ink,var(--ink));font:inherit}
.mode-select button[aria-pressed="true"]{background:var(--t-accent);color:#16263a}
.friends-card{max-width:560px}
.friend-pager{overflow:hidden;border-radius:18px;touch-action:pan-y}
.friend-track{display:flex;transition:transform .35s cubic-bezier(.3,1.25,.5,1)}
.friend{flex:0 0 100%;display:flex;align-items:center;gap:14px;padding:14px 10px;min-height:260px}
.friend-art{flex:0 0 44%;position:relative;aspect-ratio:1;border-radius:20px;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(circle at 50% 55%,#fff 0 45%,color-mix(in srgb,var(--fc) 22%,#fff) 70%);border:3px solid color-mix(in srgb,var(--fc) 55%,#fff)}
.friend-art img{width:92%;height:92%;object-fit:contain;animation:friend-bob 3s ease-in-out infinite}
.friend-art.silhouette{background:radial-gradient(circle at 50% 55%,#eef4fa 0 45%,#dbe5ef 70%);border-color:#c7d3e0}
.friend-art.silhouette img{filter:brightness(0) saturate(0);opacity:.28;animation:none}
.friend-art.silhouette b{position:absolute;font-size:44px;font-weight:400;color:#fff;text-shadow:0 2px 0 #9fb1c6}
.friend-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px}
.friend-name{font-size:26px;display:flex;align-items:center;gap:4px;text-shadow:0 2px 0 #fff}
.friend-name.locked{color:#9fb1c6}
.friend-intro{margin:0;font-size:14px}
.friend-line{position:relative;background:#fff8dc;border:2px solid #ffe08a;border-radius:14px;padding:10px 12px;font-size:16px;color:var(--navy);line-height:1.4}
.friend-line::before{content:'';position:absolute;left:-9px;top:14px;border:8px solid transparent;border-right-color:#ffe08a;border-left:0}
.friend-skill{display:flex;flex-direction:column;gap:2px;background:var(--field);border-radius:12px;padding:8px 10px}
.friend-skill b{font-weight:400;font-size:15px;color:var(--navy)}
.friend-skill span{font-size:13px;color:var(--muted)}
.friend-hint{background:var(--field);border:2px dashed #b9cde0;border-radius:14px;padding:10px 12px;font-size:15px;color:var(--ink);line-height:1.45}
.friend-hint b{display:block;font-weight:400;font-size:13px;color:var(--muted);margin-bottom:2px}
.friend-nav{display:flex;align-items:center;justify-content:center;gap:14px;margin:6px 0 4px}
.pager-btn{width:44px;height:44px;border-radius:50%;border:0;background:var(--sub);color:var(--sub-ink);font:inherit;font-size:18px;cursor:pointer;box-shadow:0 3px 0 #b9dcf2}
.pager-btn:active{transform:translateY(2px);box-shadow:0 1px 0 #b9dcf2}
.friend-dots{display:flex;gap:8px}
.friend-dots button{width:12px;height:12px;padding:0;border-radius:50%;border:2px solid #fff;background:#cbd8e6;cursor:pointer;box-shadow:0 0 0 1px #b9cde0}
.friend-dots button[aria-current="true"]{background:var(--fc);transform:scale(1.25)}
@keyframes friend-bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
@media (max-width:420px){.friends-card{padding:16px 12px}.friend{gap:10px;padding:10px 4px;min-height:220px}.friend-art{flex-basis:42%}.friend-name{font-size:22px}.friend-intro{font-size:13px}.friend-line{font-size:14px;padding:8px 10px}.friend-skill span{font-size:12px}.friend-hint{font-size:14px}}
.unlock-face{width:min(60vw,240px);height:240px;object-fit:contain;animation:friend-arrival .6s ease-out}
@keyframes friend-arrival{from{opacity:0;transform:translateY(24px) scale(.7)}to{opacity:1;transform:translateY(0) scale(1)}}

/* ---------- 랭킹 도트 UI ---------- */
/* 모서리가 깎인 픽셀 상자: 테두리 대신 네 방향 그림자로 계단 모서리를 만들어요. */
.ranking-screen .px{--pxb:var(--t-border);border:0!important;border-radius:0!important;margin:4px;
  box-shadow:0 -4px 0 0 var(--pxb),0 4px 0 0 var(--pxb),-4px 0 0 0 var(--pxb),4px 0 0 0 var(--pxb),0 8px 0 0 rgba(0,0,0,.28),inset 0 3px 0 0 rgba(255,255,255,.14)}
.ranking-screen{background-image:repeating-conic-gradient(rgba(255,255,255,.035) 0 25%,transparent 0 50%);background-size:8px 8px}
.ranking-screen .px-num{font-family:'Press Start 2P','Jua',monospace;font-weight:400;letter-spacing:0}
.rank-head h1{display:flex;align-items:center;justify-content:center;gap:10px;font-family:'Press Start 2P','Jua',monospace;font-size:clamp(15px,4.6vw,20px);letter-spacing:1px;text-shadow:3px 3px 0 rgba(0,0,0,.25)}
.px-trophy{width:26px;height:26px;image-rendering:pixelated}
.rank-stage{border-top-width:4px;border-bottom-width:4px;padding:8px 10px}
.rank-stage-name{display:flex;align-items:center;justify-content:center;gap:10px;text-align:left}
.rank-stage-name small{font-family:'Press Start 2P',monospace;font-size:9px;opacity:.75;margin-bottom:4px}
.px-building{width:114px;height:69px;image-rendering:pixelated;flex:none}
.px-lock{width:14px;height:18px;image-rendering:pixelated;margin-left:6px;vertical-align:-2px}
.ranking-screen .rank-arrow{width:42px;height:42px;display:flex;align-items:center;justify-content:center;padding:0;background:var(--t-card)}
.ranking-screen .rank-arrow:active{transform:translateY(3px)}
.px-arrow{width:14px;height:20px;image-rendering:pixelated}
.px-arrow.left{transform:scaleX(-1)}
.ranking-screen .rank-song-card{padding:10px 12px}
.ranking-screen .rank-song-card .cover{border-radius:0;image-rendering:pixelated}
.rank-count{flex:none;font-size:10px;opacity:.8}
.ranking-screen .rank-mode button{border-radius:0;margin:4px 6px;padding:6px 22px}
.ranking-screen .rank-mode button[aria-pressed="true"]{--pxb:var(--t-accent)}
.ranking-screen .rank-mine{margin:8px 16px 10px;background:var(--t-card)}
.ranking-screen .rank-mine b.px-num{font-size:14px}
.px-stars{display:flex;gap:3px}
.px-star{width:18px;height:18px;image-rendering:pixelated}
.ranking-screen .ranking-list{gap:14px;padding:4px}
.ranking-screen .ranking-list li{padding:10px 12px}
.ranking-screen .ranking-list strong.px-num{font-size:13px}
.ranking-screen .ranking-place{width:36px;height:36px;border-radius:0;background:none}
.ranking-screen .ranking-place .px-num{font-size:13px;opacity:.8}
.px-medal{display:block;width:26px;height:28px;image-rendering:pixelated;background:center/contain no-repeat}
.ranking-screen .ranking-list li.top1{--pxb:#ffd23f}
.ranking-screen .ranking-list .ranking-me{--pxb:var(--t-accent);background:color-mix(in srgb,var(--t-accent) 18%,var(--t-card))}
.ranking-screen .online-account-link{border-radius:0;font-family:'Jua',system-ui,sans-serif}
.ranking-screen .ranking-list li[class*="top"] .ranking-place{background:none;box-shadow:none}
.friend-track .friend{border-bottom:0}

/* 메뉴 풍경 띠: 점선 길 아래 현재 위치(이동 버튼과 같은 글씨·알약 모양) */
.map-here{position:absolute;left:50%;bottom:6px;transform:translateX(-50%);display:flex;align-items:center;gap:6px;background:rgba(16,30,54,.72);color:#fff;border:1px solid rgba(255,255,255,.45);border-radius:999px;padding:6px 14px 6px 12px;font-size:15px;white-space:nowrap;pointer-events:none}
.map-here::before{content:'';width:9px;height:9px;border-radius:50% 50% 50% 0;transform:rotate(-45deg);background:#ff5a6a;box-shadow:0 0 0 2px rgba(255,255,255,.85)}
.map-here.locked::before{background:#a9b8cc}
