/* 패드 먼저(가로·세로 모두). 악보 쪽은 언제나 흰 종이, 둘레만 테마를 따른다.
   테마는 기기 설정이 아니라 메뉴의 '다크 모드'로 고른다(기본 다크, html[data-theme], index.html이 먼저 정한다). */
:root{
  --logo:#231815;   /* 교회 로고(검은 로고) */
  --bg:#eef1f4; --surface:#ffffff; --ink:#1a1e24; --muted:#5d6673; --line:#d6dbe1;
  --accent:#d4652a; --accent-ink:#ffffff; --accent-soft:#fbeee6;
  --stage:#dde2e8; --chrome:#1d2733; --chrome-ink:#eef2f6; --chrome-muted:#9fb0c2; --chrome-line:#2e3b4a;
  --ok:#2f7d4f; --ok-soft:#e5f3ea; --warn:#a8670b; --warn-soft:#fbf1df; --new:#1f5fd6; --new-soft:#e6eefc;
  --mine:#7d3fc4; --mine-soft:#f1e9fb; --merged:#0b7f86; --merged-soft:#e1f4f5;
  --font:-apple-system,BlinkMacSystemFont,"Apple SD Gothic Neo","Noto Sans KR","Malgun Gothic",system-ui,sans-serif;
  color-scheme:light;
}
:root[data-theme="dark"]{
  --logo:#ffffff;   /* 교회 로고(흰 로고) */
  --bg:#121519; --surface:#1b1f25; --ink:#e6e9ed; --muted:#9aa3ae; --line:#2b3139;
  --accent:#ea8650; --accent-ink:#1a0d05; --accent-soft:#3a2418;
  --stage:#0c0e11; --chrome:#161b22; --chrome-ink:#e6e9ed; --chrome-muted:#8a96a6; --chrome-line:#262e38;
  --ok:#6cc48f; --ok-soft:#1b2e23; --warn:#e3a94f; --warn-soft:#33281a; --new:#7fa3ff; --new-soft:#1c2740;
  --mine:#c49bf5; --mine-soft:#2c2140; --merged:#5fd0d6; --merged-soft:#16302f;
  color-scheme:dark;
}

*{box-sizing:border-box}
html,body{height:100%}
/* 악보 보기가 떠 있는 동안(app.js show): 아래 목록 때문에 문서 스크롤 막대가 생겨 악보 보기가 좁아지지 않게 */
html.viewer-up{overflow:hidden}
body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.5 var(--font);
  -webkit-text-size-adjust:100%;overscroll-behavior:none;-webkit-tap-highlight-color:transparent}
[hidden]{display:none!important}
button{font:inherit;color:inherit;cursor:pointer;border:1px solid var(--line);background:var(--surface);
  border-radius:9px;padding:8px 13px;min-height:40px;touch-action:manipulation}
button:disabled{opacity:.4;cursor:default}
button.ghost{background:transparent}
button:focus-visible,a:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
a{color:var(--accent)}
.msg{min-height:1.5em;font-size:.92rem;color:var(--muted)}
.msg.err{color:#c4372b}

/* ---------- 시작 화면(스플래시): 교회 로고. 다크는 흰 로고, 라이트는 검은 로고 ----------
   'B' 표시가 먼저 들어오고 이름이 뒤따른다. 아래 네 점(교회 색: 파랑·초록·분홍·주황)은 오래 걸릴 때만
   보인다. 앱이 준비되면 흐려지며 사라진다(app.js leaveSplash, 너무 빨리 깜빡이지 않게 잠깐은 보여 준다). */
.splash{position:fixed;inset:0;z-index:60;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:34px;
  background:var(--bg);color:var(--logo);transition:opacity .4s ease,visibility .4s;
  padding:env(safe-area-inset-top) 24px env(safe-area-inset-bottom)}
.splash[hidden]{display:none}
.splash.out{opacity:0;visibility:hidden;pointer-events:none}
.splash .logo{width:min(460px,76vw);height:auto;fill:currentColor;overflow:visible}
.splash .logo g{transform-box:fill-box}
.lg-mark{animation:lg-mark .7s cubic-bezier(.2,.7,.2,1) both}
.lg-en{animation:lg-name .7s .2s cubic-bezier(.2,.7,.2,1) both}
.lg-ko{animation:lg-name .7s .35s cubic-bezier(.2,.7,.2,1) both}
@keyframes lg-mark{from{opacity:0;transform:translateX(-18px)}}
@keyframes lg-name{from{opacity:0;transform:translateX(10px)}}
.splash-dots{display:flex;gap:10px;height:8px;animation:lg-name .4s 2.4s both}
.splash-dots i{width:8px;height:8px;border-radius:50%;animation:dot 1.2s infinite ease-in-out both}
.splash-dots i:nth-child(1){background:#6299d2}
.splash-dots i:nth-child(2){background:#55b47b;animation-delay:.15s}
.splash-dots i:nth-child(3){background:#e373a9;animation-delay:.3s}
.splash-dots i:nth-child(4){background:#ef7f47;animation-delay:.45s}
@keyframes dot{0%,80%,100%{transform:scale(.6);opacity:.45}40%{transform:scale(1);opacity:1}}
/* 아주 좁은 화면: 한글 이름은 너무 작아서 뺀다(영문 로고만) */
@media (max-width:340px){ .lg-ko{display:none} }
@media (prefers-reduced-motion: reduce){ .splash .logo g,.splash-dots i{animation:none} .splash-dots{animation-duration:.01s} }
.center{min-height:100%;display:flex;align-items:center;justify-content:center;
  padding:max(16px,env(safe-area-inset-top)) max(16px,env(safe-area-inset-right)) max(16px,env(safe-area-inset-bottom)) max(16px,env(safe-area-inset-left))}
.brand{display:flex;align-items:center;gap:12px;font-size:1.5rem;letter-spacing:-.01em}
.brand.small{font-size:1.1rem;gap:8px}
.brand img{border-radius:22%}
.login-card{max-width:420px;width:100%;background:var(--surface);border:1px solid var(--line);border-radius:16px;
  padding:28px;display:flex;flex-direction:column;gap:16px}
.login-card p{margin:0;color:var(--muted)}
#gbtn{min-height:44px}

/* ---------- 목록 ---------- */
#list{min-height:100%;padding-bottom:max(24px,env(safe-area-inset-bottom));overflow-x:clip}   /* 옆으로 밀 때 가로 스크롤이 생기지 않게(clip은 위 막대 sticky를 깨지 않는다) */
/* 목록은 위아래 스크롤만 브라우저가 하고, 좌우 밀기는 보기 넘기기(listswipe.js) */
.weeks,.songs{touch-action:pan-y}
.topbar{position:sticky;top:0;z-index:5;display:flex;align-items:center;gap:12px;background:var(--bg);
  padding:calc(10px + env(safe-area-inset-top)) max(16px,env(safe-area-inset-right)) 10px max(16px,env(safe-area-inset-left));
  border-bottom:1px solid var(--line)}
.topbar .sync{margin-left:auto}
.menu-wrap{position:relative}
.menu{position:absolute;right:0;top:calc(100% + 6px);min-width:220px;background:var(--surface);border:1px solid var(--line);
  border-radius:12px;padding:6px;display:flex;flex-direction:column;gap:2px;box-shadow:0 8px 30px rgba(0,0,0,.18)}
.menu button{border:0;text-align:left;background:transparent}
/* 메뉴의 다크 모드 켜고 끄기 */
.menu-switch{display:flex;align-items:center;justify-content:space-between;gap:12px}
.menu-switch .knob{flex:none;width:40px;height:24px;border-radius:12px;background:var(--line);position:relative;transition:background .15s}
.menu-switch .knob::after{content:"";position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:#fff;
  box-shadow:0 1px 2px rgba(0,0,0,.3);transition:left .15s}
.menu-switch[aria-checked="true"] .knob{background:var(--accent)}
.menu-switch[aria-checked="true"] .knob::after{left:19px}
.topbar > *{flex:none}
.topbar .brand b,#menuBtn,#installBtn{white-space:nowrap}
#who{display:inline-block;max-width:7em;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}
.brand-t{display:flex;align-items:baseline;gap:8px}
.menu-who{display:none;padding:8px 12px;border-bottom:1px solid var(--line);margin-bottom:4px;font-size:.82rem;color:var(--muted);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 동기화 상태는 글자 그대로 보이되, 자리가 모자라면 줄을 바꾸지 않고 '…'로 줄인다(위 막대는 늘 한 줄) */
.topbar .sync{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}
.ver{font-size:.74rem;font-weight:500;color:var(--muted);font-variant-numeric:tabular-nums;letter-spacing:0}
#hints{display:flex;flex-direction:column;gap:8px;padding:12px max(16px,env(safe-area-inset-right)) 0 max(16px,env(safe-area-inset-left))}
.hint{background:var(--surface);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:8px;
  padding:10px 14px;font-size:.9rem;display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.hint.warn{border-left-color:var(--warn)}
.hint button{min-height:32px;padding:4px 10px}
/* 첫 줄: 목록 종류 | (오른쪽) 보기 방식·만들기 단추, 둘째 줄: 검색·거르기·정렬. 어느 너비에서나 같은 모양
   — 단추 글자(보기마다 다른 '＋' 단추)나 동기화 글자에 따라 줄 수가 바뀌지 않게. */
.lviews{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:12px max(16px,env(safe-area-inset-right)) 0 max(16px,env(safe-area-inset-left))}
.lviews .seg.lay{margin-left:auto}
.lviews .lfind{order:3;flex-basis:100%}
.lviews .seg{width:fit-content;border-color:var(--line);background:var(--surface);flex:none}
.lviews .seg button{min-height:38px}
/* 검색 옵션: 곡 제목·날짜 기간 */
.lfind{display:flex;flex-wrap:wrap;align-items:center;gap:8px;flex:1 1 320px;min-width:0}
.lq-wrap{position:relative;display:flex;align-items:center;flex:1 1 220px;min-width:0}
.lopts{display:flex;gap:8px;flex:0 1 auto;min-width:0}
.lq-wrap .ico{position:absolute;left:10px;width:18px;height:18px;fill:none;stroke:var(--muted);stroke-width:2;stroke-linecap:round;pointer-events:none}
#lq{width:100%;min-height:38px;padding:6px 34px 6px 34px;border:1px solid var(--line);border-radius:10px;background:var(--surface);
  color:var(--ink);font:inherit;font-size:16px;-webkit-appearance:none;appearance:none}
#lq::-webkit-search-cancel-button{display:none}
#lq:focus,.lopts select:focus,.lcustom input:focus{outline:2px solid var(--accent);outline-offset:-1px}
.lq-clear{position:absolute;right:4px;width:30px;height:30px;min-height:0;padding:0;border:0;border-radius:50%;background:transparent;
  color:var(--muted);font-size:1.3rem;line-height:1}
.lopts select{min-width:0;min-height:38px;padding:6px 10px;border:1px solid var(--line);border-radius:10px;background:var(--surface);color:var(--ink);font:inherit;font-size:16px}
.lcustom{display:inline-flex;align-items:center;gap:6px;color:var(--muted)}
.lcustom[hidden]{display:none}
.lcustom input{min-height:38px;padding:4px 8px;border:1px solid var(--line);border-radius:10px;background:var(--surface);color:var(--ink);font:inherit;font-size:16px}
/* 보기 옵션: 카드·목록 */
.seg.lay .ico{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.seg.lay button{display:inline-flex;align-items:center;gap:6px}
.lcount{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px max(16px,env(safe-area-inset-right)) 0 max(16px,env(safe-area-inset-left));
  font-size:.9rem;color:var(--muted)}
.lcount[hidden]{display:none}
.lcount b{color:var(--ink)}
.lcount button{min-height:32px;padding:4px 12px;font-size:.86rem}
.wk-songs li.hit span{background:var(--accent-soft);color:var(--accent);font-weight:700;border-radius:4px;padding:0 3px}
.weeks{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:14px;
  padding:16px max(16px,env(safe-area-inset-right)) 0 max(16px,env(safe-area-inset-left))}
/* 곡별 보기: 한 번 작업한 악보는 세트리스트와 따로 남는다 */
.songs{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px;
  padding:16px max(16px,env(safe-area-inset-right)) 0 max(16px,env(safe-area-inset-left))}
.song{display:flex;flex-direction:column;align-items:stretch;gap:6px;text-align:left;padding:14px 16px;
  border-radius:14px;background:var(--surface);border:1px solid var(--line);cursor:pointer}
.song[data-ink="1"]{border-color:var(--accent)}
.sg-title{font-size:1.02rem;font-weight:700}
.sg-badges{display:flex;flex-wrap:wrap;gap:6px}
.sg-foot{font-size:.8rem;color:var(--muted)}
.empty{color:var(--muted);padding:40px 8px;text-align:center;grid-column:1/-1}
.week{display:flex;flex-direction:column;align-items:stretch;gap:8px;text-align:left;padding:16px 18px;border-radius:14px;
  background:var(--surface);border:1px solid var(--line)}
.week:first-child{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent) inset}
.wk-date{font-size:1.08rem;font-weight:700}
.wk-title{font-size:.8rem;color:var(--muted)}
.wk-songs{margin:0;padding-left:1.3em;display:flex;flex-direction:column;gap:2px;font-size:.92rem}
.wk-songs li span{margin-right:6px}
.wk-songs i{font-style:normal;font-size:.78rem;color:var(--muted);font-variant-numeric:tabular-nums}
.wk-badges{display:flex;flex-wrap:wrap;gap:6px;margin-top:2px}
.week{cursor:pointer}
.wk-foot{display:flex;gap:8px;margin-top:4px}
.wk-yt{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);border-radius:9px;padding:6px 12px;
  text-decoration:none;color:var(--ink);font-weight:600;font-size:.88rem;background:var(--bg)}
.wk-yt::before{content:"";width:0;height:0;border-left:9px solid #e62117;border-top:6px solid transparent;border-bottom:6px solid transparent}
.wk-yt[aria-disabled="true"]{opacity:.45;pointer-events:none}

/* 목록 보기: 줄마다 날짜 | 제목·곡·표시 | 유튜브 */
.weeks.list,.songs.list{grid-template-columns:1fr;gap:0}
.weeks.list .week,.songs.list .song{display:grid;border-radius:0;border-width:0 0 1px;box-shadow:none;padding:12px 6px;background:transparent;
  column-gap:14px;row-gap:4px;align-items:center}
.weeks.list .week:first-child,.songs.list .song:first-child{border-top-width:1px}
.weeks.list .week{grid-template-columns:max-content minmax(0,1fr) auto;grid-template-areas:"date title foot" "date songs foot" "date badges foot";align-items:start}
.weeks.list .week:first-child{border-color:var(--line)}
.weeks.list .week:first-child .wk-date{color:var(--accent)}
.weeks.list .wk-date{grid-area:date;font-size:.98rem;white-space:nowrap;min-width:8.5em}
.weeks.list .wk-title{grid-area:title}
.weeks.list .wk-songs{grid-area:songs;display:block;padding:0;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.weeks.list .wk-songs li{display:inline}
.weeks.list .wk-songs li + li::before{content:" · ";color:var(--muted)}
.weeks.list .wk-songs i{display:none}
.weeks.list .wk-badges{grid-area:badges;margin:0}
.weeks.list .wk-badges .pill{font-size:.7rem;padding:1px 8px}
.weeks.list .wk-foot{grid-area:foot;margin:0;align-self:center}
.weeks.list .wk-yt{padding:6px 10px}
.songs.list .song{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"title badges" "foot badges"}
.songs.list .song[data-ink="1"]{border-color:var(--line)}
.songs.list .song[data-ink="1"] .sg-title::before{content:"";display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--accent);margin-right:8px;vertical-align:middle}
.songs.list .sg-title{grid-area:title}
.songs.list .sg-badges{grid-area:badges;justify-content:flex-end}
.songs.list .sg-foot{grid-area:foot}
.weeks.list .week:hover,.songs.list .song:hover{background:var(--surface)}
@media (max-width: 640px){
  .weeks.list .week{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"date foot" "title title" "songs songs" "badges badges"}
  .weeks.list .wk-date{min-width:0}
  .songs.list .song{grid-template-columns:minmax(0,1fr);grid-template-areas:"title" "badges" "foot"}
  .songs.list .sg-badges{justify-content:flex-start}
  .seg.lay span{display:none}
  /* 좁은 화면(폰): 검색은 한 줄, 기간·팀/개인·정렬은 그 아래 한 줄에 나눠 */
  .lq-wrap{flex-basis:100%}
  .lopts{flex:1 1 100%}
  .lopts select{flex:1 1 0;padding:6px 6px}
  .lviews .seg button{padding:6px 10px}
  .add-btn{padding:6px 12px}
  .add-btn .long{display:none}
  /* 위 막대: 늘 한 줄. 버전은 앱 이름 아래 작게, 동기화 상태는 작은 글자로(사용자 2026-10-28: 둘 다 보이게) */
  .topbar{gap:6px}
  .topbar .brand{gap:6px}
  .brand-t{flex-direction:column;align-items:flex-start;gap:0;line-height:1.15}
  .topbar .brand b{font-size:.92rem}
  .topbar .ver{font-size:.66rem}
  .topbar .sync{font-size:.7rem;padding:3px 8px}
  #menuBtn{padding:6px 10px}
  #installBtn{padding:6px 10px}
  #installBtn .i-long{display:none}       /* '설치'만 */
  #who{max-width:4.5em}
}
@media (max-width: 360px){
  .lviews .add-btn .short{display:none}   /* 아주 좁으면 '＋'만, 위 막대는 앱 이름 없이 아이콘·버전만 */
  .topbar .brand b{display:none}
  #who{display:none}                       /* 메뉴 단추는 '▾'만(이름은 메뉴 맨 위에) */
  .menu-who{display:block}
  .lviews .seg button{padding:6px 8px}
}
.pill{font-size:.74rem;font-weight:600;padding:2px 9px;border-radius:999px;background:var(--bg);color:var(--muted);white-space:nowrap}
.pill.new{background:var(--new-soft);color:var(--new)}
.pill.again{background:var(--accent-soft);color:var(--accent)}
.pill.ink{background:var(--accent);color:var(--accent-ink)}
.pill.ok{background:var(--ok-soft);color:var(--ok)}
.pill.warn{background:var(--warn-soft);color:var(--warn)}
/* 어디서 온 것인지: 팀(예배팀 주간도구) · 개인(이 앱에서 직접) · 통합(같은 악보 파일이 양쪽에) */
.pill.o-team{background:var(--new-soft);color:var(--new)}
.pill.o-mine{background:var(--mine-soft);color:var(--mine)}
.pill.o-merged{background:var(--merged-soft);color:var(--merged)}
.week.mine,.song.mine{border-left:4px solid var(--mine)}
.weeks.list .week.mine,.songs.list .song.mine{border-left-width:3px;padding-left:10px}
.week.mine .wk-title{color:var(--ink);font-weight:600;font-size:.9rem}
.wk-edit{min-height:34px;padding:4px 14px;font-size:.88rem}
.sg-foot{display:flex;align-items:center;justify-content:space-between;gap:8px}
.sg-del{min-height:30px;padding:2px 10px;font-size:.8rem;color:var(--muted)}
/* 곡 뱃지(js/badges.js): 제목 옆에 붙인 뱃지들(목록의 곡 옆·제목 옆, 악보 보기의 제목 옆). 스티커라서
   색은 테마와 상관없이 같다. 겹쳐 붙인 스티커처럼 살짝 포갠다. */
.badge-mark{display:inline-flex;align-items:center;margin-left:6px;vertical-align:-.28em;white-space:nowrap}
.badge-mark .bdg{width:1.3em;height:1.3em;flex:none}
.badge-mark .bdg + .bdg{margin-left:-.18em}
/* 곡별 목록의 코멘트 개수(말풍선 + 숫자), 검색어가 코멘트에 걸리면 그 코멘트 */
.note-mark{display:inline-flex;align-items:center;gap:3px;font-size:.78em;color:var(--muted);font-weight:700;margin-left:8px;white-space:nowrap;vertical-align:1px}
.note-mark svg{width:1.05em;height:1.05em;fill:none;stroke:currentColor;stroke-width:2;stroke-linejoin:round}
.sg-hit{font-size:.82rem;color:var(--muted)}
.sg-hit mark{background:var(--accent-soft);color:var(--accent);font-weight:700;border-radius:4px;padding:0 3px}
.add-btn .short{display:none}
@media (max-width: 640px){ .add-btn .short{display:inline} }
.add-btn{flex:none;min-height:38px;border-color:var(--accent);color:var(--accent);font-weight:700;white-space:nowrap}

/* 동기화 상태. 누르면 지금 동기화(자동 동기화는 그대로). 단추지만 알약 모양 그대로 */
.sync{font-size:.74rem;font-weight:600;padding:3px 10px;border-radius:999px;white-space:nowrap;background:var(--ok-soft);color:var(--ok);
  border:0;min-height:0;line-height:1.5;position:relative}
.sync::after{content:"";position:absolute;inset:-8px -4px}   /* 손가락으로 누르기 쉽게 */
.sync:active{filter:brightness(.92)}
.sync::before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;background:currentColor;margin-right:6px;vertical-align:1px}
.sync[data-state="syncing"]{background:var(--new-soft);color:var(--new)}
.sync[data-state="offline"]{background:var(--bg);color:var(--muted)}
.sync[data-state="error"],.sync[data-state="login"]{background:var(--warn-soft);color:var(--warn)}

/* ---------- 악보 보기 ---------- */
#viewer{position:fixed;inset:0;display:flex;flex-direction:column;background:var(--stage);
  -webkit-user-select:none;user-select:none;-webkit-touch-callout:none}
.vbar,.toolbar,.vfoot,.banner,.v-structure{flex:none}
.vbar{display:flex;align-items:center;gap:12px;background:var(--chrome);color:var(--chrome-ink);
  padding:calc(6px + env(safe-area-inset-top)) max(12px,env(safe-area-inset-right)) 6px max(12px,env(safe-area-inset-left))}
.vbar button:not(.sync){border-color:var(--chrome-line);background:transparent;color:var(--chrome-ink)}
.v-info{min-width:0;flex:1;display:flex;flex-direction:column;line-height:1.3}
/* 글자가 없어도 줄 높이는 둔다 — 곡마다(KEY가 없는 곡 등) 위 막대 높이가 바뀌면 악보 크기가 바뀐다 */
.v-title,.v-songline,.v-meta{min-height:1.3em}
.v-title{font-size:.72rem;color:var(--chrome-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.vbar button,.vbar .seg button{white-space:nowrap}
.v-songline{display:flex;align-items:center;min-width:0}
.v-song{font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
/* 제목 옆 뱃지는 높이 0인 칸에 띄워서 줄 높이에 끼지 않게 — 뱃지가 있는 곡과 없는 곡의 위 막대 높이가
   달라지면(약 4px) 곡마다 악보 크기가 바뀌고 다시 그린다(2026-10-28 '들어갈 때 커졌다 작아졌다') */
.v-badge-mark{flex:none;display:flex;align-items:center;height:0;overflow:visible}
.v-badge-mark .badge-mark{font-size:.95rem;vertical-align:0}
/* 뱃지·코멘트 창: 펜 설정 창(.pop)과 같은 모양 */
.bp-song{text-align:center;color:var(--muted);font-size:.88rem;margin-top:-6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.badge-pop{max-height:calc(100dvh - 130px);overflow-y:auto}
.bp-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:6px 4px}
.bp-b{display:flex;flex-direction:column;align-items:center;gap:5px;border:0;background:transparent;padding:8px 2px 6px;border-radius:14px;
  min-height:0;font-size:.8rem;font-weight:700;color:var(--muted);position:relative;-webkit-tap-highlight-color:transparent}
.bp-b .bdg{transition:transform .15s ease,opacity .15s ease,filter .15s ease;opacity:.42;filter:saturate(.55)}
.bp-b[aria-pressed="true"]{background:var(--bg);color:var(--ink)}
.bp-b[aria-pressed="true"] .bdg{opacity:1;filter:none}
/* 붙인 것: 오른쪽 위에 작은 체크 */
.bp-b[aria-pressed="true"]::after{content:"";position:absolute;top:5px;right:calc(50% - 32px);width:18px;height:18px;border-radius:50%;
  background:var(--ink) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18'%3E%3Cpath d='M5 9.4l2.6 2.5L13 6.4' fill='none' stroke='white' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/100% no-repeat;
  border:2px solid var(--surface)}
.bp-b.bump .bdg{animation:bdg-pop .32s cubic-bezier(.3,1.6,.5,1)}
@keyframes bdg-pop{0%{transform:scale(.7)}60%{transform:scale(1.14)}100%{transform:scale(1)}}
.bp-notes{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:6px}
.bp-notes li{display:inline-flex;align-items:center;gap:2px;background:var(--bg);border-radius:999px;padding:2px 2px 2px 12px;font-size:.86rem;max-width:100%}
.bp-notes li span{overflow-wrap:anywhere}
.bp-notes li button{min-height:30px;min-width:30px;padding:0;border:0;border-radius:50%;color:var(--muted);font-size:1.1rem;line-height:1}
.bp-notes .bp-none{background:none;padding:0;color:var(--muted);font-size:.84rem}
.bp-add{display:flex;gap:8px}
.bp-input{flex:1;min-width:0;min-height:40px;padding:6px 10px;border:1px solid var(--line);border-radius:10px;background:var(--bg);color:var(--ink);font:inherit;font-size:16px}
.bp-input:focus{outline:2px solid var(--accent);outline-offset:-1px}
.bp-add button{flex:none}
/* 도구 막대의 뱃지 단추: 붙였으면 그 뱃지들, 없으면 웃는 얼굴 + '뱃지' */
.v-badge{display:inline-flex;align-items:center;gap:6px}
.v-badge[data-on]{gap:0;padding-left:8px;padding-right:8px}
.v-badge[data-on] .bdg + .bdg{margin-left:-5px}
.vb-empty{width:18px;height:18px;flex:none;background:currentColor;
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='9' fill='none' stroke='black' stroke-width='2.2'/%3E%3Ccircle cx='9' cy='10' r='1.4'/%3E%3Ccircle cx='15' cy='10' r='1.4'/%3E%3Cpath d='M8.2 14.2c2 2.3 5.6 2.3 7.6 0' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round'/%3E%3C/svg%3E") center/contain no-repeat;
  mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='9' fill='none' stroke='black' stroke-width='2.2'/%3E%3Ccircle cx='9' cy='10' r='1.4'/%3E%3Ccircle cx='15' cy='10' r='1.4'/%3E%3Cpath d='M8.2 14.2c2 2.3 5.6 2.3 7.6 0' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round'/%3E%3C/svg%3E") center/contain no-repeat}
.v-meta{font-size:.78rem;color:var(--chrome-muted);font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.keychg{color:#ffb27f;font-weight:700}
.v-right{display:flex;align-items:center;gap:10px}
.v-pos{font-size:.8rem;color:var(--chrome-muted);font-variant-numeric:tabular-nums;white-space:nowrap}
.seg{display:flex;border:1px solid var(--chrome-line);border-radius:10px;overflow:hidden}
.seg button{border:0;border-radius:0;min-height:38px;padding:6px 12px}
.seg button[aria-pressed="true"]{background:var(--accent);color:var(--accent-ink);font-weight:700}

/* 도구 막대(GoodNotes 비슷하게): 도구 아이콘 | 도구마다 바뀌는 칸(굵기 3·색 5 / 지우개 / 기호) | 실행취소 …
   늘 한 줄. 화면이 좁으면 줄을 바꾸지 않고 옆으로 밀어서 본다(2026-10-26 '좁은 화면에서 도구 막대가 너무 높다') */
.toolbar{display:none;flex-wrap:nowrap;gap:12px;align-items:center;background:var(--surface);border-bottom:1px solid var(--line);
  padding:6px max(12px,env(safe-area-inset-right)) 6px max(12px,env(safe-area-inset-left));
  overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.toolbar::-webkit-scrollbar{display:none}
/* 옆에 더 있으면 그쪽 가장자리를 흐리게(밀어 볼 수 있다는 표시) */
.toolbar.more-r{-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 36px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 36px),transparent)}
.toolbar.more-l{-webkit-mask-image:linear-gradient(to left,#000 calc(100% - 36px),transparent);mask-image:linear-gradient(to left,#000 calc(100% - 36px),transparent)}
.toolbar.more-l.more-r{-webkit-mask-image:linear-gradient(to right,transparent,#000 36px,#000 calc(100% - 36px),transparent);
  mask-image:linear-gradient(to right,transparent,#000 36px,#000 calc(100% - 36px),transparent)}
.toolbar > *{flex:none}
.toolbar .tools{order:1}
.toolbar .ctx{order:2}
.toolbar .stamps{order:3}
.toolbar > .grp:not(.tools):not(.ctx){order:4}
.tools button{min-width:48px;padding:0 6px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:0;border-color:transparent;background:transparent}
.tools .ico{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.tools .tlabel{font-size:.62rem;line-height:1;margin-top:1px;color:var(--muted);white-space:nowrap}
.toolbar .tools button[aria-pressed="true"]{background:var(--accent-soft);border-color:transparent}
.toolbar .tools button[aria-pressed="true"] .tlabel{color:var(--accent)}
.ctx{gap:10px;flex-wrap:nowrap}
.ctx:empty{display:none}
.cgrp{display:flex;gap:3px;align-items:center}
.cgrp + .cgrp{padding-left:10px;border-left:1px solid var(--line)}
.wpre{width:44px;padding:0!important;display:flex;align-items:center;justify-content:center;border-color:transparent!important;background:transparent}
.wpre i{display:block;width:22px;border-radius:9px;background:var(--ink)}
.toolbar .wpre[aria-pressed="true"]{background:var(--bg)!important}
/* 원은 가로·세로를 같게(모든 단추의 최소 높이 40px가 덮어쓰면 타원이 된다) */
.toolbar .swatch{width:40px;height:40px;min-height:0;padding:0;border-radius:50%;border-color:transparent;background:transparent;position:relative;flex:none}
/* 선명하게: 반투명 그림자(가장자리가 번져 흐려 보인다) 대신 얇은 실선 테두리 */
.swatch::after{content:"";position:absolute;inset:8px;border-radius:50%;background:var(--c);border:1px solid rgba(0,0,0,.14)}
.toolbar .swatch[aria-pressed="true"]{background:transparent;border-color:transparent}
.swatch.on::before{content:"";position:absolute;inset:2px;border-radius:50%;border:2px solid var(--c)}
.swatch.on::after{inset:9px}
/* 색 고르는 칸(펜·형광펜·글자): 막대 바탕과 구분되는 둥근 칸에 모은다 — 큐티 앱과 같은 모양(2026-10-28 사용자) */
.toolbar .cgrp.colors{gap:0;padding:0 3px;border-radius:999px;background:var(--bg);box-shadow:0 0 0 1px var(--line) inset}
.cgrp + .cgrp.colors{border-left:0;padding-left:3px;margin-left:8px}
/* 다크 모드: 검정·진한 색 동그라미가 바탕에 묻히지 않게 밝은 테두리, 고른 칸의 고리도 밝게 */
:root[data-theme="dark"] .swatch::after,:root[data-theme="dark"] .pc,:root[data-theme="dark"] .cwell{border-color:rgba(255,255,255,.5)}
:root[data-theme="dark"] .swatch.on::before{border-color:color-mix(in srgb,var(--c) 50%,#fff)}
.seg2 button{min-height:36px;padding:4px 12px}
.switch{display:inline-flex;align-items:center;gap:8px;min-height:36px;padding:4px 10px;font-size:.86rem}
.switch .knob{width:30px;height:18px;border-radius:9px;background:var(--line);position:relative;transition:background .15s}
.switch .knob::after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:#fff;transition:left .15s;box-shadow:0 1px 2px rgba(0,0,0,.3)}
.switch[aria-pressed="true"] .knob{background:var(--accent)}
.switch[aria-pressed="true"] .knob::after{left:14px}
.toolbar .switch[aria-pressed="true"]{background:transparent;color:var(--ink);font-weight:400}
.esize{width:44px;flex:none;padding:0!important;display:flex;align-items:center;justify-content:center;border-color:transparent!important;background:transparent}
.esize i{display:block;flex:none;aspect-ratio:1;border-radius:50%;border:2px solid var(--muted);background:repeating-conic-gradient(var(--line) 0 25%,transparent 0 50%) 0 0/6px 6px}
.toolbar .esize[aria-pressed="true"] i{border-color:var(--new)}
.chint{font-size:.84rem;color:var(--muted)}

/* 굵기·색 설정 창 */
.pop,.badge-pop{position:fixed;z-index:12;width:min(340px,calc(100vw - 16px));background:var(--surface);color:var(--ink);border-radius:18px;
  padding:16px 18px;box-shadow:0 18px 50px rgba(0,0,0,.28);display:flex;flex-direction:column;gap:12px}
.pop::before,.badge-pop::before{content:"";position:absolute;top:-8px;left:calc(var(--arrow, 50%) - 8px);border:8px solid transparent;border-top:0;border-bottom-color:var(--surface)}
.badge-pop{width:min(340px,calc(100vw - 16px))}
.pop-h{font-weight:700;font-size:1rem;text-align:center}
.pop.wide{width:min(380px,calc(100vw - 16px));max-height:calc(100vh - 140px);overflow-y:auto}
.pop-preview{width:100%;height:90px;display:block}
.ptypes{display:flex;gap:6px}
.ptypes button{flex:1;display:flex;flex-direction:column;align-items:center;gap:4px;font-size:.84rem;padding:8px 4px;border-color:transparent;background:transparent}
.ptypes .ico{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
.ptypes button[aria-pressed="true"]{background:var(--bg);font-weight:700}
.opts{display:flex;flex-direction:column;gap:6px;background:var(--bg);border-radius:14px;padding:10px 14px}
.opts .pop-row output{font-variant-numeric:tabular-nums;font-size:.86rem;color:var(--muted)}
/* 연필 진하기 1~5: 단계마다 진해지는 결 막대 */
.dks{display:flex;gap:6px}
.dks button{flex:1;display:flex;flex-direction:column;align-items:center;gap:4px;min-height:0;padding:8px 2px 6px;font-size:.8rem;
  border-color:transparent;background:transparent;color:var(--muted)}
.dks button i{display:block;width:70%;height:6px;border-radius:3px;background:var(--ink);opacity:var(--d)}
.dks button[aria-pressed="true"]{background:var(--surface);border-color:var(--line);color:var(--ink);font-weight:700}
.opt output{font-variant-numeric:tabular-nums;font-size:.86rem;color:var(--muted)}
.opt .pop-row{font-size:.86rem}
.pop-sec{font-weight:700;font-size:.9rem;color:var(--muted);margin-top:2px}
.sets{display:flex;flex-direction:column;background:var(--bg);border-radius:14px;padding:4px 14px}
.setrow{min-height:44px}
.setrow + .setrow{border-top:1px solid var(--line)}
.setrow .switch{padding:0;min-height:0;border:0;background:transparent}
.setrow .switch .knob{width:44px;height:26px;border-radius:13px}
.setrow .switch .knob::after{top:3px;left:3px;width:20px;height:20px}
.setrow .switch[aria-pressed="true"] .knob{background:#34c759}
.setrow .switch[aria-pressed="true"] .knob::after{left:21px}
.pop-row{display:flex;justify-content:space-between;align-items:center;gap:10px;font-size:.9rem}
.pop-mm{font-variant-numeric:tabular-nums;font-weight:700}
.pop input[type="range"]{width:100%;accent-color:var(--accent)}
.lstyles button{flex:1;display:flex;flex-direction:column;align-items:center;gap:4px;font-size:.82rem;padding:8px 4px;border-color:transparent;background:var(--bg)}
.lstyles svg{width:40px;height:10px;stroke:var(--new);stroke-width:3}
.lstyles button[aria-pressed="true"]{border-color:var(--new);background:var(--new-soft)}
.pop-tabs{display:flex;background:var(--bg);border-radius:10px;padding:3px}
.pop-tabs button{flex:1;border:0;min-height:32px;background:transparent;font-size:.86rem}
.pop-tabs button[aria-pressed="true"]{background:var(--surface);box-shadow:0 1px 3px rgba(0,0,0,.12);font-weight:700}
.pop-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:8px;justify-items:center}
.pc{width:36px;height:36px;min-height:0;padding:0;flex:none;aspect-ratio:1;border-radius:50%;border:1px solid rgba(0,0,0,.14);background:var(--c)}
.pc.on{outline:2.5px solid var(--new);outline-offset:2px}
/* 사용자 색: 아이패드의 색 고르기 칸은 그대로 두면 흐리게 늘어난다. 원은 직접 그리고, 색 고르기 칸은
   그 위에 투명하게 겹쳐 누르면 열리게 한다. */
.cwell{position:relative;display:block;width:36px;height:36px;flex:none;border-radius:50%;background:var(--c);
  border:1px solid rgba(0,0,0,.14);overflow:hidden}
.cwell::after{content:"+";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;
  text-shadow:0 0 2px rgba(0,0,0,.6);pointer-events:none}
.cwell input[type="color"]{position:absolute;inset:0;width:100%;height:100%;opacity:0;border:0;padding:0;cursor:pointer}

/* 지우개 크기 원(지우개로 누르거나 펜을 띄워 둘 때) */
.eraser-cursor{position:fixed;left:0;top:0;z-index:9;pointer-events:none;border-radius:50%;
  border:1.5px solid rgba(60,64,72,.85);background:rgba(255,255,255,.35);box-shadow:0 0 0 1px rgba(255,255,255,.8)}
#viewer[data-view="edit"] .toolbar{display:flex}
.grp{display:flex;gap:4px;align-items:center}
.toolbar button{min-height:40px;padding:6px 11px}
.toolbar button[aria-pressed="true"]{border-color:var(--accent);background:var(--accent-soft);color:var(--accent);font-weight:700}


.stamps{display:flex;flex-wrap:nowrap;gap:4px}
.stamps button{min-width:46px;font-weight:700}

.banner{display:flex;flex-wrap:wrap;gap:8px;align-items:center;background:var(--warn-soft);color:var(--warn);
  padding:8px max(12px,env(safe-area-inset-right)) 8px max(12px,env(safe-area-inset-left));font-size:.9rem}
.banner .what{flex:1;min-width:220px}
.banner button{min-height:34px;padding:4px 10px}

/* 스크롤 막대는 숨긴다(도구 막대·곡 목록처럼). PC에서 가로 창이면 쪽이 너비에 맞아 세로로 길어 막대가 생기는데,
   막대가 차지한 너비만큼 쪽(너비 + 여백)이 넘쳐 가로 막대까지 생겼다. 손가락·휠·끌기로 민다. */
.stage{flex:1;min-height:0;overflow:auto;touch-action:none;position:relative;scrollbar-width:none}
.stage::-webkit-scrollbar{display:none}
/* 쪽 넘김: 지금 펼침과 옆 펼침(.ghost)을 함께 옆으로 민다 */
.track{position:relative;min-width:100%;min-height:100%;width:max-content;will-change:transform}
/* 옆 펼침은 지금 펼침과 똑같은 자리에 오게: 높이를 늘리지 않는다. 예전에는 높이 100%라 악보가 세로 가운데에
   왔다가 넘김이 끝나면 위로 붙어 '위에 공백이 있다가 올라갔다'(2026-10-25 안드로이드 패드 악보만 모드.
   아이패드는 악보가 세로를 꽉 채워서 티가 안 났다) */
.spread.ghost{position:absolute;inset:0 auto auto 0;width:100%;height:auto}
.stage.sliding{overflow:hidden}
/* 펼침은 늘 합성 레이어로 둔다. 두 손가락으로 확대하는 동안 다시 그리지 않고 늘리기만 하게. */
.spread{min-width:100%;display:flex;align-items:center;justify-content:center;gap:12px;padding:10px;width:max-content;margin:0 auto;
  will-change:transform;transform-origin:0 0}
.spread.zoomed{align-items:flex-start}
#viewer[data-view="clean"] .spread,#viewer.wide .spread{padding:0}

/* 전체 화면 편집: 위아래 막대를 숨기고 도구 막대를 악보 위에 띄운다 */
#viewer.wide .vbar,#viewer.wide .vfoot,#viewer.wide .v-structure{display:none}
#viewer.wide .toolbar{position:absolute;z-index:6;top:calc(8px + env(safe-area-inset-top));left:0;right:0;margin:0 auto;
  width:max-content;max-width:calc(100% - 16px);border:1px solid var(--line);border-radius:14px;box-shadow:0 6px 24px rgba(0,0,0,.22)}
#viewer.wide.tools-off .toolbar{display:none}
.v-tools-hide{display:none}
/* 전체 화면: 위 막대의 편집·읽기·악보만 오른쪽(편집 모드에서만). 전체 화면 중에는 위 막대가 숨으니
   떠 있는 도구 막대에 '전체 화면 끝'만 둔다 */
#viewer:not([data-view="edit"]) .v-wide-top{display:none}
.toolbar .v-wide{display:none}
#viewer.wide .toolbar .v-wide{display:inline-flex;align-items:center}
#viewer.wide .v-tools-hide{display:inline-block}
.v-tools-show{display:none;position:fixed;z-index:6;top:calc(10px + env(safe-area-inset-top));right:calc(10px + env(safe-area-inset-right));
  background:var(--accent);color:var(--accent-ink);border-color:transparent;font-weight:700;box-shadow:0 4px 14px rgba(0,0,0,.25)}
#viewer.wide.tools-off .v-tools-show{display:block}
.v-mini{display:none;position:fixed;z-index:6;right:calc(10px + env(safe-area-inset-right));bottom:calc(10px + env(safe-area-inset-bottom));
  align-items:center;gap:4px;background:rgba(20,24,30,.78);color:#fff;border-radius:12px;padding:3px;font-size:.8rem}
.v-mini button{background:transparent;color:#fff;border:0;min-height:36px;width:40px;padding:0;font-size:1.2rem}
.v-mini-pos{max-width:40vw;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 4px}
#viewer.wide .v-mini{display:flex}
.v-loading{color:var(--muted)}
.page{position:relative;flex:none;background:#fff;box-shadow:0 1px 4px rgba(0,0,0,.25);overflow:hidden}
/* 쪽 = 캔버스 네 장(악보·필기, 확대하면 보이는 부분의 고해상도 악보·필기). 캔버스는 바뀌므로
   터치는 받지 않고 늘 .page가 받는다(대상이 사라지면 그 손가락의 움직임을 못 받는다). */
.page .sheet-c,.page .ink{position:absolute;inset:0;display:block;width:100%;height:100%;pointer-events:none}
.page .detail,.page .ink-detail{position:absolute;display:block;pointer-events:none}
/* 젖은 잉크(펜이 닿아 있는 동안): 화면 크기, 위치는 화면이 정한다 */
/* 젖은 잉크: 확정된 앞부분(.wet)과 펜 끝 꼬리(.pred). 형광펜은 상자째 반투명으로 해서 겹친 곳이 진해지지 않게 */
.wetbox{position:fixed;inset:0;z-index:4;pointer-events:none;visibility:hidden}   /* 쓰는 동안만 보인다(js/ink.js) */
.wet,.pred{position:fixed;pointer-events:none}
#viewer:not([data-view="edit"]) .wetbox{display:none}
.msgpage{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;
  color:#555;padding:24px;text-align:center}
.msgpage b{font-size:1.2rem;color:#222}
#viewer[data-view="edit"] .stage{cursor:crosshair}
#viewer[data-view="edit"] .stage[data-tool="eraser"]{cursor:cell}
#viewer[data-view="edit"] .stage[data-tool="text"],#viewer[data-view="edit"] .stage[data-tool="stamp"]{cursor:text}
.text-input{position:absolute;z-index:3;min-width:120px;border:2px solid var(--new);border-radius:4px;padding:0 4px;
  background:rgba(255,255,255,.95);color:#1f5fd6;font-family:var(--font);font-weight:700;line-height:1.2;-webkit-user-select:text;user-select:text}

.v-structure{font-size:.8rem;color:var(--muted);background:var(--surface);border-top:1px solid var(--line);
  padding:4px max(12px,env(safe-area-inset-right)) 4px max(12px,env(safe-area-inset-left));white-space:nowrap;overflow-x:auto}
.v-structure:empty{display:none}
/* 세트리스트에 구조가 있는 곡이 있으면 없는 곡에서도 줄 자리를 둔다(곡마다 쪽 크기가 달라지지 않게) */
#viewer.has-structure .v-structure:empty{display:block}
#viewer.has-structure .v-structure:empty::before{content:"\00a0"}
.vfoot{display:flex;align-items:center;gap:8px;background:var(--surface);border-top:1px solid var(--line);
  padding:6px max(10px,env(safe-area-inset-right)) calc(6px + env(safe-area-inset-bottom)) max(10px,env(safe-area-inset-left))}
.vfoot > button{font-size:1.4rem;width:48px;padding:0}
.songnav{flex:1;min-width:0;display:flex;gap:6px;overflow-x:auto;scrollbar-width:none}
.songnav button{white-space:nowrap;min-height:36px;padding:4px 12px;font-size:.88rem}
.songnav button i{font-style:normal;color:var(--muted);margin-left:6px;font-size:.78rem}
.songnav button.on{border-color:var(--accent);color:var(--accent);font-weight:700}

#viewer.chrome-off .vbar,#viewer.chrome-off .vfoot,#viewer.chrome-off .v-structure{display:none}
#viewer[data-view="clean"]{background:#0b0c0e}
#viewer[data-view="clean"] .vbar,#viewer[data-view="clean"] .vfoot,#viewer[data-view="clean"] .banner,
#viewer[data-view="clean"] .v-structure{display:none}
.v-exit{display:none;position:fixed;z-index:6;top:calc(12px + env(safe-area-inset-top));right:calc(12px + env(safe-area-inset-right));
  background:rgba(20,24,30,.85);color:#fff;border-color:transparent}
#viewer[data-view="clean"].show-exit .v-exit{display:block}

.dlg-back{position:fixed;inset:0;z-index:30;background:rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center;padding:16px}
.dlg{background:var(--surface);color:var(--ink);border-radius:16px;max-width:440px;width:100%;padding:22px 24px;display:flex;flex-direction:column;gap:12px;
  box-shadow:0 20px 60px rgba(0,0,0,.35)}
.dlg h2{margin:0;font-size:1.15rem}
.dlg ol{margin:0;padding-left:1.3em;display:flex;flex-direction:column;gap:8px}
.dlg-note{margin:0;font-size:.86rem;color:var(--muted)}
.dlg-row{display:flex;justify-content:flex-end;gap:10px}
.dlg-sp{flex:1}
.dlg-back.top{z-index:35}
button.danger{color:#c4372b;border-color:transparent}
/* 입력 칸(개인 세트리스트·악보 올리기) */
.fld{display:flex;flex-direction:column;gap:4px;font-size:.84rem;color:var(--muted);min-width:0}
.fld input{min-height:40px;padding:6px 10px;border:1px solid var(--line);border-radius:10px;background:var(--bg);color:var(--ink);
  font:inherit;font-size:16px;width:100%}
.fld input[type="file"]{padding:6px}
.fld input:focus,.ms-tools input:focus{outline:2px solid var(--accent);outline-offset:-1px}
.fld-row{display:flex;gap:10px;flex-wrap:wrap}
.fld-row .grow{flex:1 1 220px}
/* 개인 세트리스트 창: 넣은 악보(순서) | 고를 악보. 좁으면 위아래로 */
.dlg.wide{max-width:860px;max-height:calc(100dvh - 32px);overflow:auto}
.ms-cols{display:grid;grid-template-columns:1fr 1fr;gap:14px;min-height:0}
.ms-col{display:flex;flex-direction:column;gap:8px;min-width:0}
.ms-col h3{margin:0;font-size:.92rem}
.ms-col h3 b{color:var(--accent);margin-left:4px}
.ms-tools{display:flex;gap:8px}
.ms-tools input{flex:1;min-width:0;min-height:38px;padding:6px 10px;border:1px solid var(--line);border-radius:10px;background:var(--bg);
  color:var(--ink);font:inherit;font-size:16px}
.ms-tools button{flex:none;min-height:38px;white-space:nowrap}
.ms-list{list-style:none;margin:0;padding:4px;border:1px solid var(--line);border-radius:12px;background:var(--bg);
  display:flex;flex-direction:column;gap:4px;height:min(46vh,420px);overflow:auto}
.dlg .ms-list{padding-left:4px}
.ms-list li{display:flex;align-items:center;gap:8px;min-width:0}
.ms-picked li{padding:4px 4px 4px 8px;background:var(--surface);border-radius:9px}
.ms-no{flex:none;width:1.6em;text-align:right;color:var(--muted);font-variant-numeric:tabular-nums}
.ms-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}
.ms-ops{flex:none;display:flex;gap:4px}
.ms-ops button{min-height:34px;min-width:34px;padding:0}
.ms-add{flex:1;display:flex;align-items:center;gap:8px;min-width:0;border:0;background:var(--surface);min-height:42px;padding:6px 10px}
.ms-in{flex:none;color:var(--muted);font-size:.82rem;min-width:3.6em;text-align:right}
.ms-none{color:var(--muted);font-size:.88rem;padding:14px 10px}
@media (max-width:640px){
  .ms-cols{grid-template-columns:1fr}
  .ms-list{height:auto;max-height:32vh}
}
/* 업데이트 창: 크게, 가운데 */
.dlg-back.update{z-index:40;background:rgba(0,0,0,.55)}
.update .dlg{max-width:440px;padding:28px 28px 22px;align-items:center;text-align:center;gap:14px}
.update h2{font-size:1.4rem}
.up-icon{width:64px;height:64px;border-radius:50%;background:var(--accent-soft);color:var(--accent);display:flex;align-items:center;justify-content:center;font-size:2rem;font-weight:700}
.up-ver{margin:0;font-variant-numeric:tabular-nums;color:var(--muted)}
.up-ver b{color:var(--ink)}
.update .dlg-row{width:100%}
.update .dlg-row button{flex:1;min-height:52px;font-size:1.05rem;border-radius:12px}
button.primary{background:var(--accent);color:var(--accent-ink);border-color:var(--accent);font-weight:700}
button.primary:disabled{opacity:.6}
#installBtn{border-color:var(--accent);color:var(--accent);font-weight:700}

#toast{position:fixed;z-index:20;left:50%;transform:translateX(-50%);bottom:calc(76px + env(safe-area-inset-bottom));
  background:#1d2733;color:#fff;border-radius:12px;padding:10px 14px;display:flex;gap:12px;align-items:center;
  max-width:calc(100% - 32px);box-shadow:0 8px 30px rgba(0,0,0,.3);font-size:.92rem}
#toast button{background:var(--accent);color:var(--accent-ink);border:0;min-height:34px;padding:4px 12px;font-weight:700}

@media (max-width:700px){
  .v-pos{display:none}
  .seg button{padding:6px 9px}
  .vbar{gap:8px}
  .v-right{gap:6px}
}
/* 좁은 화면(폰): 전체 화면은 아이콘만, 동기화 상태는 점만 */
@media (max-width:560px){
  .v-wide-top{font-size:0;padding:6px 10px;min-width:40px}
  .v-wide-top::before{content:"⛶";font-size:1.15rem;line-height:1}
  .vbar .sync{font-size:0;padding:6px}
  .vbar .sync::before{margin-right:0;width:9px;height:9px}
  .v-back{padding:6px 10px}
}
/* ---------- 움직임: 네이티브 앱처럼 부드럽게(2026-10-28 사용자) ----------
   메뉴의 '애니메이션'을 끄면(고른 적이 없으면 기기의 '동작 줄이기'면) 모두 끈다. 곡선은 iOS 화면 전환과 비슷하게
   빠르게 나가서 천천히 멈춘다. 나타날 때만 움직이고 사라질 때는 바로 사라진다(hidden). */
:root{--ease-out:cubic-bezier(.32,.72,0,1);--ease-pop:cubic-bezier(.2,.9,.3,1.15)}
/* 앱 설정 '애니메이션'(메뉴)이 켜져 있을 때만(html[data-motion="on"], index.html이 먼저 정한다). 고른 적이
   없으면 기기 설정의 '동작 줄이기'를 따른다(2026-10-28 사용자: '이 앱만 적용할 수 있게'). */
/* 화면 이동(app.js show): 화면 요소를 그대로 움직인다(View Transitions의 화면 사진을 쓰지 않는다 — 아이패드에서
   악보 보기에 들어갈 때 화면 전체 크기가 떨리고 가끔 악보가 하얗게 남았다, 2026-10-28). 앞으로(목록 → 악보 보기)는
   악보 보기가 오른쪽에서 덮으며 들어오고 목록은 왼쪽으로 조금 밀리며 어두워진다. 뒤로는 그 반대(악보 보기가 위에서
   오른쪽으로 빠진다). 악보 보기는 position:fixed라 늘 목록 위에 있다. */
html[data-motion="on"] .push-in{animation:vt-push-in .38s var(--ease-out) both}
html[data-motion="on"] .push-under{animation:vt-push-out .38s var(--ease-out) both}
html[data-motion="on"] .pop-out{animation:vt-pop-out .34s var(--ease-out) both}
html[data-motion="on"] .pop-under{animation:vt-pop-in .34s var(--ease-out) both}
.leaving{pointer-events:none}
@keyframes vt-push-in{from{transform:translateX(100%);box-shadow:-12px 0 32px rgba(0,0,0,.25)}to{transform:none;box-shadow:-12px 0 32px rgba(0,0,0,0)}}
@keyframes vt-push-out{to{transform:translateX(-28%);filter:brightness(.82)}}
@keyframes vt-pop-out{from{box-shadow:-12px 0 32px rgba(0,0,0,.25)}to{transform:translateX(100%);box-shadow:-12px 0 32px rgba(0,0,0,0)}}
@keyframes vt-pop-in{from{transform:translateX(-28%);filter:brightness(.82)}}
@keyframes vt-fade-in{from{opacity:0;transform:scale(.985)}}
/* 그 밖(로그인 ↔ 목록): 들어오는 화면만 나타난다 */
html[data-motion="on"] .enter-fade{animation:vt-fade-in .3s var(--ease-out) both}

/* 목록 보기 바꾸기(세트리스트별 ↔ 곡별): 페이지를 넘기듯 옆에서 밀려 들어온다(단추·좌우 밀기 모두) */
html[data-motion="on"] .weeks.slide-next,html[data-motion="on"] .songs.slide-next{animation:slide-next .34s var(--ease-out) both}
html[data-motion="on"] .weeks.slide-prev,html[data-motion="on"] .songs.slide-prev{animation:slide-prev .34s var(--ease-out) both}
@keyframes slide-next{from{transform:translateX(100%);opacity:.3}}
@keyframes slide-prev{from{transform:translateX(-100%);opacity:.3}}
/* 카드·줄을 누르는 동안 살짝 들어간다 */
html[data-motion="on"] .week,html[data-motion="on"] .song{transition:transform .16s var(--ease-out),background-color .16s}
html[data-motion="on"] .week:active,html[data-motion="on"] .song:active{transform:scale(.985)}

/* 창: 바탕이 어두워지고 창이 아래에서 떠오르며 */
html[data-motion="on"] .dlg-back:not([hidden]){animation:vt-dim-in .2s ease both}
@keyframes vt-dim-in{from{opacity:0}}
html[data-motion="on"] .dlg-back:not([hidden]) > .dlg{animation:dlg-in .32s var(--ease-pop) both}
@keyframes dlg-in{from{opacity:0;transform:translateY(18px) scale(.97)}}
/* 메뉴·설정 창(펜·뱃지): 누른 단추 쪽에서 커지며 */
html[data-motion="on"] .menu:not([hidden]){animation:menu-in .2s var(--ease-out) both;transform-origin:top right}
html[data-motion="on"] .pop:not([hidden]),html[data-motion="on"] .badge-pop:not([hidden]){animation:menu-in .22s var(--ease-out) both;transform-origin:var(--arrow,50%) top}
@keyframes menu-in{from{opacity:0;transform:scale(.94) translateY(-4px)}}
/* 알림: 아래에서 올라오며 */
html[data-motion="on"] #toast:not([hidden]){animation:toast-in .3s var(--ease-pop) both}
@keyframes toast-in{from{opacity:0;transform:translate(-50%,16px)}to{transform:translate(-50%,0)}}
/* 편집 도구 막대: 위에서 내려오며 */
html[data-motion="on"] #viewer[data-view="edit"] .toolbar{animation:bar-in .26s var(--ease-out) both}
@keyframes bar-in{from{opacity:0;transform:translateY(-8px)}}
@media (prefers-reduced-motion: reduce){*{scroll-behavior:auto!important}}
