/* ⚠ scrollbar-gutter:stable 은 쓰지 않는다.
   스크롤바가 이미 있는 상태에서 자리를 한 번 더 예약해, 본문이 왼쪽으로
   스크롤바 폭(15px)만큼 치우쳤다(대칭검사 6,900건, 2026-08-24).
   팝업이 열릴 때의 폭 변화는 ui.js 의 lockScroll() 이 여백으로 보정한다. */

﻿/* ============================================================
   UI 레이어 스타일 — 모달 · 드로어 · 토스트 · 스켈레톤 · 등장효과
   클래스는 전부 u- 접두사 (기존 클래스를 덮지 않는다)
   색은 기존 토큰만 사용: --ink --sub --faint --line --line2 --gray --point --sale
   ============================================================ */

.u-dim{position:absolute;inset:0;background:rgba(15,17,20,.46);opacity:0;transition:opacity .2s ease}

/* ---------- 모달 ---------- */
.u-modal{position:fixed;inset:0;z-index:210;display:flex;align-items:center;justify-content:center;padding:20px}
.u-modal-box{position:relative;z-index:2;background:#fff;width:100%;display:flex;flex-direction:column;max-height:min(86vh,760px);opacity:0;transform:translateY(14px) scale(.985);transition:opacity .2s ease,transform .22s cubic-bezier(.2,.8,.3,1);box-shadow:0 24px 70px rgba(15,17,20,.28)}
.u-sm{max-width:380px}
.u-md{max-width:560px}
.u-lg{max-width:760px}
.u-modal.u-on .u-dim{opacity:1}
.u-modal.u-on .u-modal-box{opacity:1;transform:none}
.u-modal-hd{display:flex;align-items:center;gap:10px;padding:15px 18px;border-bottom:1px solid var(--line);flex:none}
.u-modal-hd b{font-size:15px;font-weight:800;letter-spacing:-.03em}
.u-x{margin-left:auto;width:32px;height:32px;display:grid;place-items:center;color:var(--sub)}
.u-x:hover{color:var(--ink)}
.u-modal-bd{padding:18px;overflow:auto;flex:1;-webkit-overflow-scrolling:touch;overscroll-behavior:contain}
.u-modal-ft{display:flex;gap:8px;justify-content:flex-end;padding:13px 18px;border-top:1px solid var(--line);flex:none;background:var(--gray)}
.u-modal-ft .btn{min-width:110px}

/* 모바일: 바텀시트 */
@media (max-width:760px){
  .u-modal{padding:0;align-items:flex-end}
  .u-modal-box{max-width:none;max-height:88vh;max-height:88dvh;transform:translateY(100%)}
  .u-modal.u-on .u-modal-box{transform:none}
  .u-modal-box::before{content:'';position:absolute;top:7px;left:50%;transform:translateX(-50%);width:40px;height:4px;border-radius:99px;background:var(--line)}
  .u-modal-hd{padding-top:19px}
  .u-modal-ft .btn{flex:1;min-width:0}
  .u-modal-ft{padding-bottom:max(13px,env(safe-area-inset-bottom))}
}

/* ---------- 드로어 ---------- */
.u-drawer{position:fixed;inset:0;z-index:210}
.u-drawer-box{position:absolute;top:0;right:0;bottom:0;z-index:2;width:min(400px,92vw);background:#fff;display:flex;flex-direction:column;transform:translateX(100%);transition:transform .24s cubic-bezier(.2,.8,.3,1);box-shadow:-18px 0 50px rgba(15,17,20,.18)}
.u-drawer.u-on .u-dim{opacity:1}
.u-drawer.u-on .u-drawer-box{transform:none}
.u-drawer-hd{display:flex;align-items:center;gap:10px;padding:15px 18px;border-bottom:1px solid var(--line);flex:none}
.u-drawer-hd b{font-size:15px;font-weight:800;letter-spacing:-.03em}
.u-drawer-bd{padding:14px 18px;overflow:auto;flex:1;-webkit-overflow-scrolling:touch;overscroll-behavior:contain}
.u-drawer-ft{padding:13px 18px 14px;border-top:1px solid var(--line);flex:none;background:#fff}
.u-empty{padding:44px 10px;text-align:center;color:var(--faint);font-size:13px}
@media (max-width:760px){
  .u-drawer-box{top:auto;left:0;width:100%;max-height:82vh;max-height:82dvh;transform:translateY(100%);box-shadow:0 -14px 40px rgba(15,17,20,.2)}
  .u-drawer.u-on .u-drawer-box{transform:none}
  .u-drawer-ft{padding-bottom:max(14px,env(safe-area-inset-bottom))}
}

/* ---------- 토스트 ---------- */
.u-toastwrap{position:fixed;left:0;right:0;bottom:24px;z-index:230;display:flex;justify-content:center;pointer-events:none}
.u-toast{display:flex;align-items:center;gap:12px;background:rgba(17,17,17,.94);color:#fff;font-size:13px;font-weight:600;padding:12px 18px;max-width:min(420px,92vw);opacity:0;transform:translateY(10px);transition:opacity .2s,transform .22s;pointer-events:auto;box-shadow:0 10px 30px rgba(0,0,0,.25)}
.u-toast.u-on{opacity:1;transform:none}
.u-toast-act{color:#ffd8c8;font-weight:800;font-size:12.5px;white-space:nowrap;text-decoration:underline;text-underline-offset:2px}
@media (max-width:760px){.u-toastwrap{bottom:64px}}

/* ---------- 스켈레톤 ---------- */
.u-skel{position:relative;display:block;background:#eef0f2;overflow:hidden}
.u-skel::after{content:'';position:absolute;inset:0;transform:translateX(-100%);background:linear-gradient(90deg,transparent,rgba(255,255,255,.65),transparent);animation:u-shimmer 1.3s infinite}
@keyframes u-shimmer{100%{transform:translateX(100%)}}
.u-skel-card{display:flex;flex-direction:column;gap:7px}
.u-skel-img{aspect-ratio:1/1;width:100%}
.u-skel-t{height:11px}
.u-skel-pr{height:15px}
.u-skel-row{display:flex;gap:12px;align-items:center;padding:10px 0}
.u-skel-sq{width:56px;height:56px;flex:none}
.u-skel-row .u-skel-t{margin-bottom:7px}

/* ---------- 등장 효과 ---------- */
[data-reveal]{opacity:0;transform:translateY(10px);transition:opacity .4s ease,transform .45s cubic-bezier(.2,.7,.3,1)}
[data-reveal].u-in{opacity:1;transform:none}

/* ---------- 감속 모드 존중 ---------- */
@media (prefers-reduced-motion:reduce){
  .u-dim,.u-modal-box,.u-drawer-box,.u-toast,[data-reveal]{transition:none !important}
  [data-reveal]{opacity:1;transform:none}
  .u-skel::after{animation:none}
}

/* ============================================================
   [자리예약] JS 가 채우는 컨테이너의 최종 높이를 미리 확보한다.
   :empty 셀렉터라 내용이 들어오는 순간 규칙이 스스로 풀린다(영구 빈여백 없음).
   브레이크포인트는 실측 전환점 기준: .rankwrap 1열 = 960(style.css),
   lay-brand .quickcats 는 auto-fit 이라 960 / 505 에서 행수가 바뀐다.
   ============================================================ */
#quickcats:empty{min-height:128px}
body.lay-fresh #quickcats:empty{min-height:149px}
body.lay-select #quickcats:empty{min-height:127px}
#dealRail:empty{min-height:398px}
body.rt-tall #dealRail:empty{min-height:456px}
#rankTabs:empty{min-height:20px}
#rank:empty{min-height:405px}
body.lay-market #rank:empty{min-height:325px}
/* 상품 상세 — 가격블록·혜택박스가 뒤늦게 부풀어 상단이 밀리던 것 */
#pRate:empty{min-height:18px}
#pTiers:empty{min-height:102px}
#pBenefit:empty{min-height:108px}
#pInfo:empty{min-height:201px}
#pOpts:empty{min-height:134px}
#moqNote:empty{min-height:17px}
/* 목록 필터 카테고리 — 203px = subs 7개 × .fopt 29px (실측).
   960px 이하는 .filters 가 숨겨져 자동 무력화된다.
   ⚠ pages.mjs 의 <div id="fSub"></div> 사이에 줄바꿈을 넣으면 :empty 가 죽는다. */
#fSub:empty{min-height:203px}
@media (max-width:1180px){
  #quickcats:empty{min-height:233px}
  body.lay-fresh #quickcats:empty{min-height:270px}
  body.lay-select #quickcats:empty{min-height:232px}
  body.lay-brand #quickcats:empty{min-height:128px}
}
@media (max-width:1100px){
  body.lay-market #rank:empty{min-height:370px}
}
@media (max-width:960px){
  body.lay-brand #quickcats:empty{min-height:233px}
  #rank:empty{min-height:810px}
  body.lay-market #rank:empty{min-height:650px}
}
@media (max-width:760px){
  #quickcats:empty{min-height:340px}
  body.lay-fresh #quickcats:empty{min-height:390px}
  body.lay-select #quickcats:empty{min-height:340px}
  body.lay-market #rank:empty{min-height:740px}
  #pBenefit:empty{min-height:168px}
  #pOpts:empty{min-height:142px}
  #moqNote:empty{min-height:35px}
  /* 하단 탭바 아이콘 자리 — SVG 주입 전까지 행 높이를 유지(안 그러면 탭바가 25px 튄다) */
  .mobnav a>[data-ico]:empty{display:block;height:25px}
}
@media (max-width:505px){
  body.lay-brand #quickcats:empty{min-height:340px}
}
@media (max-width:360px){
  body.lay-fresh #quickcats:empty{min-height:409px}
  #rank:empty{min-height:900px}
}

/* ============================================================
   모바일 12px 하한 — ui.css 가 마지막에 로드되므로 !important 없이
   style.css·skin.css 의 후행 규칙을 순서만으로 이긴다.
   ============================================================ */
@media (max-width:760px){
  .tg,p.copyright,.demo-note,
  .rankrow .tx span,.rankrow .delta,
  .revcard .rh span,.revcard .av,
  .cmp-check,
  .pcard .pbrand,body.col6 .pcard .pbrand,body.card-lined .pcard .pbrand,
  .badge,body.lay-discount .badge,
  .promo-inner,.pb-tag,
  .brand-text span,.noticebox li span,.noticebox .nb-h a,
  .benefit span,.soldout span,.cpn-btn,.gal-pager,.slide-nav .pager,.bb-eyebrow,
  .sidecat .sc-foot p,.sidebanner p,.sidebanner a,.bannerstrip .sub span,
  .sug-hd,.sug-hd button,.sug-item .k,.sug-item .pr,
  .priceblock .vat,.opt-guide,.qm-empty,
  .mobnav a{font-size:12px}
  /* 탭바 높이 64px 유지 — .buybar/.cmpbar 의 bottom:64px 가정을 깨지 않는다 */
  .mobnav a{gap:0;padding:6px 0}
}

/* 모달·드로어 닫기 버튼 — 시각 32px 유지, 히트영역만 44px */
.u-x{position:relative}
.u-x::after{content:'';position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:44px;height:44px;min-width:100%;min-height:100%}
