/* ══════════════════════════════════════════════════════════════════════════
   기멱몰 디자인 한 벌 — mall-ui.css                              2026-09-15
   ══════════════════════════════════════════════════════════════════════════

   사장님 지시 2026-09-15
     "소비자몰 전체 디자인을 다시 잡는다. 먼저 디자인을 정립하고 하나씩 확인한 뒤
      반영하는 식으로 최소한 작업을 줄이자."
     "색을 다 칠한 버튼은 다 없앨게. 너무 지저분해보여. 그라디언트 빼고."
     "최대 혜택가 네모 블럭 처리 없애줘." · "전체 온브릭스처럼 가운데 정렬로."

   레퍼런스 (실제로 열어 픽셀로 잰 값만 씁니다 — 눈대중 금지)
     · onbrix   www.onbrix.co.kr/shop/main   — 레이아웃·가운데정렬·하단 알림팝업·타이머
     · 컬리     www.kurly.com/main           — 글씨 굵기 계단(상품명 400 / 가격 700)

   ── 이 파일의 자리 ────────────────────────────────────────────────────────
     /ui.css      ← 몰·라이브·관리자가 **함께** 쓰는 한 벌 (건드리지 않습니다)
     /style.css   ← 몰의 기존 화면들 (담당이 여럿입니다)
     /mall-ui.css ← 이 파일. **맨 마지막에 실려서** 몰의 디자인을 여기서 정합니다.

     ★ 왜 ui.css 를 고치지 않는가
       ui.css 는 네 폴더에 **똑같은 사본**으로 들어가 있습니다
       (mall / live / admin / shared · md5 동일). 거기 손대면 방송 화면과
       관리자 화면까지 같이 바뀝니다. 방송 화면은 사무실 몫이라 몰 디자인 작업이
       남의 화면을 흔들면 안 됩니다. 그래서 **몰에서만** 값을 다시 정합니다.

     ★ 되돌리기
       각 페이지 <head> 의 <link href="/mall-ui.css"> 한 줄만 빼면 전부 원상복구됩니다.
   ══════════════════════════════════════════════════════════════════════════ */


/* ══ 1. 값 다시 정하기 (몰 한정) ══════════════════════════════════════════ */
:root {
  /* ── 자간 0 ──
     ui.css 는 -.02em / -.032em 로 조여 놓았습니다. 그런데 레퍼런스 두 곳을
     실측하니 **둘 다 자간 0** 이었습니다 (onbrix 0 · 컬리 0).
     한글을 조이면 글자끼리 붙어 "빽빽하다"는 인상이 먼저 옵니다. */
  --gi-track:       0;
  --gi-track-title: 0;

  /* ── 색은 세 계열만 ──
     주황 = 브랜드(로고·머리줄·주버튼 테두리·활성)
     핑크빨강 = 장사 신호(할인율·혜택가) — 여기 말고는 쓰지 않습니다
     잉크 = 글자. 이 셋 밖의 색은 '뜻이 있는 색'(성공·경고)뿐입니다. */
  --gm-brand-soft:  #fff4ec;   /* 주황 옅은 바탕 */
  --gm-brand-line:  #ffddc4;
  --gm-brand-ink:   #c2560a;   /* 옅은 주황 위 글자 */
  --gm-hot-soft:    #fff0f3;   /* 핑크빨강 옅은 바탕 */
  --gm-hot-line:    #ffd3dc;
  --gm-ok-soft:     #eefaf2;
  --gm-ok-line:     #cdeedb;

  /* ── 모서리 ──
     ui.css 의 10/14/20 은 몰에서 쓰기에 둥근 편입니다. 레퍼런스는 더 각져 있습니다. */
  --gm-r-s:    8px;
  --gm-r:     10px;
  --gm-r-l:   14px;
  --gm-r-pill: 999px;

  /* ── 글씨 굵기: 400 / 600 / 700 세 가지만 ──
     지금 몰은 900 이 152곳, 800 이 84곳입니다(style.css + 각 페이지 합계).
     전부 굵으면 무엇이 중요한지가 사라집니다. 컬리는 상품명을 400 으로 두고
     가격만 700 으로 세웁니다. */
  --gm-w-body:  400;
  --gm-w-mid:   600;
  --gm-w-bold:  700;

  /* ── 행간 ── */
  --gm-lh-tight: 1.25;   /* 제목·가격 */
  --gm-lh:       1.35;   /* 상품명 */
  --gm-lh-read:  1.45;   /* 본문 */

  /* ══ 옛 색 이름을 새 값으로 ═══════════════════════════════════════════
     style.css 는 제 나름의 색 이름 12개를 쓰고 있고, 몰 전체에서 385곳이
     그 이름을 부릅니다 (--muted 117 · --line 85 · --gimeok 52 …).
     → 이름은 그대로 두고 **값만** 확정 팔레트로 바꿉니다.
       그러면 385곳이 한 번에 맞춰지고, 이 여덟 줄만 지우면 원래대로 돌아옵니다.

     바뀌는 이유 (레퍼런스 실측 기준)
       --muted  #6b7280 → #8b90a0  보조 글자가 너무 진해서 본문과 구별이 안 됐습니다
       --ink    #111827 → #161823  순수 검정에 가깝던 것을 살짝 푸른 먹색으로
       --ink2   #1f2937 → #4b4f5c  본문색. 지금은 제목과 거의 같은 검정이었습니다
       --line   #e5e7eb → #ebecf0  선이 진해서 칸이 많아 보였습니다
       --soft   #f8fafc → #f8f8f8  푸른기 제거 (레퍼런스 두 곳 모두 무채색)
       --hot    #ff3b1f → #f42b54  할인·혜택 신호를 포인트색 하나로 통일
       --gimeok2 #ef4444 → #f42b54 위와 같은 이유
     ★ --gimeok(#f97316) 브랜드 주황은 그대로 둡니다 (사장님: "지금 브랜드 색 지킬 것"). */
  --ink:       #161823;
  --ink2:      #4b4f5c;
  --muted:     #8b90a0;
  --line:      #ebecf0;
  --soft:      #f8f8f8;
  --grey:      #f1f2f5;
  --hot:       #f42b54;
  --gimeok2:   #f42b54;
  --band:      #fff4ec;
  --band-line: #ffddc4;
}

/* ══ 2. 바탕 글씨 ═════════════════════════════════════════════════════════ */
body {
  letter-spacing: 0;
  line-height: var(--gm-lh-read);
}
h1, h2, h3, h4 { letter-spacing: 0; line-height: var(--gm-lh-tight); }

/* ══ 3. 버튼 ══════════════════════════════════════════════════════════════
   ★ 색을 꽉 채운 버튼은 쓰지 않습니다 (사장님 2026-09-15).
     테두리와 글자색만으로 위계를 만듭니다. 그라디언트 버튼은 폐지합니다.
   ★ 딱 하나의 예외 — '최종 구매' 버튼만 먹색으로 채웁니다.
     완전 검정이 아니라 먹색(#161823)입니다 (사장님 "레퍼런스처럼 완전 검정은 아닌, 먹색으로"). */
.gm-btn{
  font-family:inherit; border:1px solid transparent; border-radius:var(--gm-r);
  font-weight:var(--gm-w-mid); letter-spacing:0; cursor:pointer;
  display:inline-flex; align-items:center; justify-content:center; gap:6px;
  height:40px; padding:0 15px; font-size:14px; background:#fff; color:var(--gi-ink);
  transition:background .12s, border-color .12s, color .12s;
}
.gm-btn--l{height:52px; padding:0 20px; font-size:15px; border-radius:var(--gm-r-l)}
.gm-btn--s{height:32px; padding:0 12px; font-size:13px; border-radius:var(--gm-r-s)}
.gm-btn--block{width:100%}

/* 주버튼 — 주황 테두리 (알림받기·장바구니담기 같은 '한 번 더 생각하는' 행동) */
.gm-btn--point{background:#fff; border-color:var(--gi-brand); border-width:1.5px; color:var(--gi-brand)}
.gm-btn--point:active{background:var(--gm-brand-soft)}
/* 보조버튼 — 회색 테두리 */
.gm-btn--basic{background:#fff; border-color:var(--gi-line); color:var(--gi-ink-2)}
.gm-btn--basic:active{background:var(--gi-soft); border-color:#dcdfe6}
/* 있는 듯 없는 듯 (공유·닫기) */
.gm-btn--ghost{background:transparent; color:var(--gi-mute)}
.gm-btn--ghost:active{background:var(--gi-soft); color:var(--gi-ink-2)}
/* ★ 최종 구매 하나에만 */
.gm-btn--ink{background:var(--gi-ink); border-color:var(--gi-ink); color:#fff; font-weight:var(--gm-w-bold)}
.gm-btn--ink:active{background:#242840; border-color:#242840}
.gm-btn:disabled{opacity:.45; cursor:default}

/* ══ 4. 배지 · 칩 ═════════════════════════════════════════════════════════
   배지도 꽉 채우지 않습니다 — 옅은 바탕 + 진한 글자 + 얇은 선. */
.gm-bdg{display:inline-flex; align-items:center; height:22px; padding:0 8px;
  border-radius:var(--gm-r-s); font-size:11.5px; font-weight:var(--gm-w-mid); letter-spacing:0}
.gm-bdg--hot{background:var(--gm-hot-soft); color:var(--gi-point); border:1px solid var(--gm-hot-line)}
.gm-bdg--brand{background:var(--gm-brand-soft); color:var(--gm-brand-ink); border:1px solid var(--gm-brand-line)}
.gm-bdg--soft{background:var(--gi-soft); color:var(--gi-ink-2); border:1px solid var(--gi-line)}
.gm-bdg--ok{background:var(--gm-ok-soft); color:var(--gi-ok); border:1px solid var(--gm-ok-line)}
.gm-bdg--sold{background:#f1f2f5; color:#5b606d; border:1px solid #e2e4ea}

.gm-chip{height:34px; padding:0 14px; border-radius:var(--gm-r-pill); border:1px solid var(--gi-line);
  background:#fff; color:var(--gi-ink-2); font-size:13px; font-weight:var(--gm-w-body);
  cursor:pointer; display:inline-flex; align-items:center; white-space:nowrap; font-family:inherit}
.gm-chip.on{background:var(--gi-ink); border-color:var(--gi-ink); color:#fff; font-weight:var(--gm-w-mid)}

/* ══ 5. 섹션 제목 — 가운데 정렬 ═══════════════════════════════════════════
   사장님 2026-09-15 "전체 온브릭스처럼 가운데 정렬로".
   ★ 제목 줄에 [전체보기]를 붙이지 않습니다 — 붙이면 가운데가 깨집니다.
     전체보기는 목록 **아래**(.gm-more)로 내립니다. */
.gm-sect{text-align:center; padding:18px 16px 12px}
.gm-sect b{display:block; font-size:18px; font-weight:var(--gm-w-bold); line-height:var(--gm-lh-tight)}
.gm-sect span{display:block; font-size:12px; color:var(--gi-mute); margin-top:4px}
.gm-more{display:block; width:calc(100% - 32px); margin:14px 16px 0; height:44px;
  border:1px solid var(--gi-line); border-radius:var(--gm-r); background:#fff;
  font-family:inherit; font-size:13.5px; font-weight:var(--gm-w-mid); color:var(--gi-ink-2); cursor:pointer}

/* ══ 6. 상품 카드 ═════════════════════════════════════════════════════════
   온브릭스식 가격 블록 (사장님 2026-09-15)
     ① 할인 전 금액(위, 취소선) ② 할인율 + 할인 금액 ③ 최대 혜택가(아래, 박스 없이)
   ★ 재고·후기 수·별점은 넣지 않습니다 (사장님: "없애줘").
   ★ '마감 임박' 같은 말 대신 **실제로 줄어드는 숫자**를 보여줍니다. */
.gm-cards{display:grid; grid-template-columns:1fr 1fr; gap:10px}
.gm-card{min-width:0}
.gm-card .th{position:relative; aspect-ratio:1/1; border-radius:var(--gm-r); overflow:hidden; background:#e9ecf1}
.gm-card .th img{width:100%; height:100%; object-fit:cover; display:block}
.gm-card .ov{position:absolute; left:7px; top:7px}
.gm-card .nm{margin:8px 0 5px; font-size:14px; font-weight:var(--gm-w-body); line-height:var(--gm-lh);
  color:var(--gi-ink); display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden}
.gm-card .was{display:block; font-size:12px; color:var(--gi-mute); text-decoration:line-through; line-height:var(--gm-lh)}
.gm-card .nowrow{display:flex; align-items:baseline; gap:6px; margin-top:1px}
.gm-card .rate{font-size:16px; font-weight:var(--gm-w-bold); color:var(--gi-point); line-height:var(--gm-lh-tight)}
.gm-card .now{font-size:16px; font-weight:var(--gm-w-bold); color:var(--gi-ink); line-height:var(--gm-lh-tight);
  font-variant-numeric:tabular-nums}
/* 최대 혜택가는 박스 없이 글자만 (사장님: "네모 블럭 지저분해"). 온브릭스도 같은 방식입니다. */
.gm-card .best{margin-top:4px; display:flex; align-items:baseline; gap:5px}
.gm-card .best small{font-size:11.5px; font-weight:var(--gm-w-mid); color:var(--gi-ink-2); flex:none}
.gm-card .best b{font-size:14px; font-weight:var(--gm-w-bold); color:var(--gi-point); font-variant-numeric:tabular-nums}
/* 썸네일 아래쪽 남은시간 띠 */
.gm-card .cd{position:absolute; left:7px; right:7px; bottom:7px; background:rgba(13,14,18,.85);
  color:#fff; border-radius:var(--gm-r-s); padding:4px 7px; font-size:11px;
  font-weight:var(--gm-w-mid); text-align:center; font-variant-numeric:tabular-nums}
.gm-card .add{margin-top:7px; width:100%; height:32px; border:1px solid var(--gi-line); background:#fff;
  border-radius:var(--gm-r-s); font-family:inherit; font-size:12px; font-weight:var(--gm-w-mid);
  color:var(--gi-ink-2); cursor:pointer}

/* ══ 7. 타이머 알약 ═══════════════════════════════════════════════════════
   온브릭스 상품페이지 실측: 200×32 · 흰 알약 · 라운드 80px · 14px/400 · 가운데.
   상품 썸네일 위에 얹습니다 (사장님 2026-09-15 지시). */
.gm-timer{position:absolute; left:50%; transform:translateX(-50%); top:12px;
  background:#fff; color:var(--gi-ink); border-radius:80px; height:32px; padding:0 16px;
  display:inline-flex; align-items:center; gap:6px; font-size:14px; font-weight:var(--gm-w-body);
  font-variant-numeric:tabular-nums; box-shadow:0 2px 8px rgba(0,0,0,.12); white-space:nowrap}
.gm-timer b{font-weight:var(--gm-w-bold)}

/* ══ 8. 바텀시트 ══════════════════════════════════════════════════════════
   모바일에서 선택(옵션·수량·카테고리 전체)은 새 페이지로 보내지 않고
   아래에서 올라오는 시트로 받습니다. 뒤로가기 한 번이면 닫힙니다. */
.gm-sheet{position:fixed; left:0; right:0; bottom:0; z-index:60;
  border-top:1px solid var(--gi-line); border-radius:16px 16px 0 0; background:#fff;
  box-shadow:0 -6px 24px rgba(22,24,35,.12);
  animation:gmSheetIn .24s cubic-bezier(.2,.9,.3,1) both}
@keyframes gmSheetIn{from{transform:translateY(100%)}to{transform:none}}
.gm-sheet .handle{width:38px; height:4px; border-radius:var(--gm-r-pill); background:#dfe2e9; margin:9px auto 0}
.gm-sheet .sh{display:flex; align-items:center; justify-content:space-between; padding:12px 16px 10px}
.gm-sheet .sh b{font-size:15px; font-weight:var(--gm-w-bold)}
.gm-sheet .sb{padding:0 16px 14px; max-height:56vh; overflow:auto}
.gm-sheet .sf{padding:10px 16px calc(12px + env(safe-area-inset-bottom));
  border-top:1px solid var(--gi-line); display:flex; gap:8px}
.gm-dim{position:fixed; inset:0; z-index:59; background:rgba(22,24,35,.42)}

/* ══ 9. 하단 알림 팝업 ════════════════════════════════════════════════════
   사장님 2026-09-15 "온브릭스 사이트를 보면 하단에서 알림 팝업이 올라와. 그 부분도 가져와줘."
   온브릭스 실측: 136×32 · rgba(0,0,0,.85) · 라운드 100px · bottom 72px · right 43px
   ★ 큰 모달이 아니라 작은 알약입니다 — 쇼핑을 막지 않습니다.
   등록·삭제는 관리자 [설정 › 팝업 및 배너 관리] 에서 합니다. */
.gm-pop{position:fixed; right:14px; bottom:calc(72px + env(safe-area-inset-bottom)); z-index:55;
  display:inline-flex; align-items:center; gap:6px; height:32px; padding:0 6px 0 12px;
  border-radius:var(--gm-r-pill); background:rgba(22,24,35,.88); color:#fff;
  font-size:12.5px; font-weight:var(--gm-w-body); white-space:nowrap;
  -webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px);
  animation:gmPopIn .32s cubic-bezier(.2,.9,.3,1.2) both}
@keyframes gmPopIn{from{opacity:0; transform:translateY(14px)}to{opacity:1; transform:none}}
.gm-pop b{font-weight:var(--gm-w-bold); font-variant-numeric:tabular-nums}
.gm-pop .x{background:none; border:0; color:rgba(255,255,255,.48); font-size:13px;
  cursor:pointer; padding:0 5px; line-height:1; font-family:inherit}
.gm-dot{width:7px; height:7px; border-radius:50%; background:#ff4d4f; flex:none;
  animation:gmBlink 1.2s ease-in-out infinite}
@keyframes gmBlink{0%,100%{opacity:1}50%{opacity:.25}}

/* 움직임을 줄여달라고 설정한 손님에게는 애니메이션을 끕니다 */
@media (prefers-reduced-motion:reduce){
  .gm-sheet, .gm-pop{animation:none}
  .gm-dot{animation:none}
}


/* ══════════════════════════════════════════════════════════════════════════
   10. 홈 정돈 — 큰 네모 박스 걷어내기                              2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "오직 단 하루 옆에 시간 타이머가 빠졌고, 지금 큰 단락마다 있었던
   네모 박스를 없애줘. 이게 너무 지저분해. 없어도 되는 문구는 과감하게 삭제!!"

   ★ 왜 마크업을 지우지 않고 여기서 감추는가
     index.html 의 apply()/tick()(1069~1145)과 예약구매 그리기(984~999)가
     이 요소들을 **널 검사 없이** getElementById 로 잡아 씁니다. 하나라도 없으면
     TypeError → window.onerror(51행) → 홈 전체가 "잠시 문제가 생겼어요" 로 덮입니다.
     게다가 배포 검사(gimeok-test/run.js:11447·11449·11946)가 이 id 들이 HTML 에
     있는지를 합격 조건으로 봅니다. 그래서 **요소는 남기고 화면에서만 걷어냅니다.**
   ★ !important 를 쓰는 곳은 '감추기' 뿐입니다 — 직원 자유 CSS 가 실수로 되살리지
     못하게 하려는 것이고, 색·굵기에는 쓰지 않습니다.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── 10-1. 섹션 경계 — 회색 띠를 빼고 '여백과 제목 크기'로만 (사장님 2026-09-15) ──
   "회색 띠 없어도 될 것 같아. 온브릭스를 보면 블럭 구분이 대제목으로 확실하게 되고 있어.
    블럭 사이의 간격을 온브릭스를 참고해서 조절해서 구분이 되게 해줘."

   ★ 온브릭스 실측 (www.onbrix.co.kr/shop/main · 폰 375px · 2026-09-15)
       섹션 대제목  .comm-title__main  20px / 700 / 행간 24px(1.2) / 자간 0
       부제목 한 줄                    13px / 400 / #666
       제목 아래 첫 내용까지            10px
       섹션 블럭 사이                  margin-top 50px   ← 여기가 구분의 전부입니다
       (회색 띠·선·상자 없음)
   눈대중이 아니라 실제로 열어 잰 값입니다. */
#owf_timesale, #owf_reservation, #owf_groupbuy, #owf_all_products,
#v-ranking, #v-minigame, #photoReviewSec, #reviewSec, .social-bg-box,
.promo-sect{   /* 프로모션 구좌도 같은 간격으로 (2026-09-15) — 여기 빠지면 혼자 32px 이 됩니다 */
  border-top:0; margin-top:50px; padding-top:0;
}
/* ★ 2026-09-15 — 26px 이던 것을 나머지와 같은 50px 로 (사장님 확인:
     "라이브 탭과 오직 단 하루 단락 사이 여백도 다른 단락 사이 여백과 동일하게 띄운거 맞아?")
     → 아니었습니다. 재보니 **26px**, 다른 단락 사이는 전부 **56px** 이었습니다.
     26 으로 좁혀 뒀던 이유는 위 라이브 예고가 자기 아래 여백 18px 을 갖고 있었기 때문인데,
     탭줄이 로고칸 밑으로 올라가면서 그 18px 을 걷어내 이유가 사라졌습니다.
   ★ 왜 50 이 아니라 56 인가 — 다른 단락 사이는 `margin-top:50` + **앞 단락의 아래 여백 6**
     (style.css 의 `section{padding:26px 0 6px}`) 이 더해져 실제로는 56 입니다.
     라이브 칸은 <section> 이 아니라 <div class="pad"> 라 그 6px 이 없습니다 — 여기서 채웁니다. */
#owf_timesale{margin-top:56px}

/* ── 10-2. 섹션 제목 줄 — 가운데 정렬 + 제목 옆 타이머/상태칩 ──
   사장님 2026-09-15 ① "전체 온브릭스처럼 가운데 정렬로" ② "제목 옆에 시간 타이머".
   [더보기]는 가운데를 깨므로 같은 줄 오른쪽 끝에 따로 붙입니다. */
/* ★ 왼쪽 정렬 (사장님 지시 2026-09-15 "지금 단락 제목들을 가운데 정렬로 했는데,
   이거때문에 더 어색한 것 같아. 왼쪽 정렬로 바꾸고").
   레퍼런스 두 곳도 실제로는 왼쪽 정렬입니다 —
     온브릭스 .comm-title__main  text-align:start
     컬리     ⭐일일특가 h2       text-align:start
   제목 아래 10px 은 온브릭스 실측 그대로 둡니다. */
/* ★ align-items 는 baseline 이 아니라 **center** 입니다 (사장님 지적 2026-09-15
   "시계랑 오직 단 하루가 가운데 정렬이 안맞아 보여. 오직 단 하루가 밑에 내려와 보여").
   왜 어긋났나 — 타이머 알약이 flex 상자라서, baseline 정렬을 쓰면 알약의 기준선을
   **첫 자식인 시계 SVG** 에서 가져옵니다. SVG 는 글자가 아니라 기준선이 없어
   상자 아래끝으로 대신 잡히고, 그만큼 제목이 아래로 내려가 보였습니다(실측 1px).
   → 가운데 기준으로 맞추면 제목 상자와 알약 상자의 한가운데가 정확히 겹칩니다. */
.gazit-title{position:relative; display:flex; align-items:center; gap:9px;
  /* ★ 2026-09-17 — `justify-content:flex-start` 를 **되찾습니다**.
       style.css 의 옛 규칙(`space-between`)이 그대로 남아 있어서, 이 줄의 요소들이
       **양끝으로 벌어져** 있었습니다. 아래 `a{margin-left:auto}` 는 원래 '더보기만 오른쪽으로'
       라는 뜻이라, space-between 이 남아 있으면 이 gap:9px 가 아무 일도 못 합니다.
       제목 앞에 아이콘을 붙이고 나서 확실히 드러났습니다 — 아이콘은 화면 왼쪽 끝,
       제목은 오른쪽 끝으로 찢어졌습니다(실측 2026-09-17: 하트 x16 · 제목 x160).
       오늘 특가 줄(시계·타이머·제목)도 같이 왼쪽으로 모입니다 — 원래 의도한 모양입니다. */
  justify-content:flex-start;
  text-align:left; padding:0 16px; margin:0 0 10px}
.gazit-title h2{font-size:20px; font-weight:700;
  line-height:1.2; letter-spacing:0; margin:0}   /* 20/700/1.2 — 온브릭스 실측 */
.gazit-title a{margin-left:auto; flex:none;
  font-size:12px; font-weight:400; color:var(--gi-mute)}

/* 후기 제목만 홀로 남아 있던 가운데 22px — 다른 단락 제목과 같게 맞춥니다.
   (사장님 지시 2026-09-15 "지금 단락 제목들을 가운데 정렬로 했는데 …왼쪽 정렬로 바꾸고")
   .review-head 는 .gazit-title 을 안 쓰는 옛 덩어리라 style.css:346 규칙이 그대로 살아 있었습니다. */
.review-head{text-align:left; padding:0 16px; margin-bottom:10px}
.review-head h3{font-size:20px; font-weight:700; line-height:1.2; letter-spacing:0}

/* ── 제목 옆 남은시간 — 연한 회색 블럭 하나 (사장님 지시 2026-09-15) ──
   "특가 있는 날에도 상품별로 남은 시간이 다 같기 때문에 상품별로 타이머를 켜둘 필요가 없어.
    오히려 중복되는 지저분한 요소가 되는거지.
    시계타이머를 아까처럼 이모지 넣고 메인 제목으로 올리자.
    오직 단 하루 옆에 처음처럼 연한 회색 블럭으로 타이머를 넣어줘."

   맞는 지적입니다 — 한 회차의 상품은 마감 시각이 **전부 같습니다**
   (lib/timesale.js 의 buildRound 가 회차 창 하나로 만듭니다).
   카드가 4장이면 같은 숫자가 4개 도는 셈이었습니다. 그래서 여기 하나로 모읍니다.
   ★ 카드 위 알약(.ts-pill)과 아래 롤링 띠(.roll)는 common.js 가 더 이상 그리지 않습니다.
     규칙만 아래·style.css 에 남겨 둡니다 — 되돌릴 때 쓰고, .roll 은 배포 검사도 봅니다. */
/* ★ 타이머와 제목은 **같은 크기** 입니다 (사장님 지시 2026-09-15
   "타이머와 오직 단 하루 사이즈 똑같이 맞추기"). 둘 다 20px.
   연한 회색 블럭은 그대로 두되, 제목과 밑줄(baseline)이 맞도록 세로 여백으로 높이를 냅니다 —
   height 를 고정하면 20px 글씨가 블럭 밖으로 삐져나옵니다. */
.gazit-title .gt-timer{display:inline-flex; align-items:center; gap:6px; flex:none;
  padding:4px 11px; border-radius:var(--gm-r-pill); background:var(--gi-soft);
  font-size:20px; font-weight:var(--gm-w-bold); color:var(--gi-ink);
  line-height:1.2; font-variant-numeric:tabular-nums; white-space:nowrap}
.gazit-title .gt-timer b{font-weight:inherit; color:inherit; font-size:inherit}
.gazit-title .gt-clock{width:17px; height:17px}   /* 글씨가 커진 만큼 시계도 같이 */
/* ★ 블럭 밖으로 나온 시계 — 이 줄의 **첫 잉크**라서 왼쪽 정렬선(16px)에 딱 서야 합니다.
   .gazit-title 의 padding-left 가 16 이고 시계는 그 첫 자식이므로 그대로 16 입니다.
   블럭(.gt-timer)은 시계 오른쪽에 붙어 숫자만 담습니다. */
.gazit-title .gt-clock-lead{flex:none; margin-right:-3px}
.sect-timer{display:none}

/* ══ 대제목 앞 아이콘 (직원분 지시 2026-09-17) ════════════════════════════
   "예약상품 텍스트 앞에 카카오 아이콘(오늘특가의 돌아가는 시계 크기와 동일) · 딸랑딸랑 모션"
   "공동구매 텍스트 앞에 하트 아이콘(대제목 아이콘 사이즈 통일) · 흰 하트가 붉게 채워지는 모션"
   → 크기는 **오늘 특가의 시계와 같은 17px** 한 벌로 묶습니다(.gt-ico).
     새 아이콘이 생기면 여기에 클래스만 하나 더하면 크기는 저절로 맞습니다. */
.gazit-title .gt-ico{width:17px; height:17px; flex:none; overflow:visible}
.gazit-title .gt-ico-lead{flex:none; margin-right:5px}
/* 카카오 — 브랜드 색 그대로(노랑 #FEE500 · 갈색 #3C1E1E). 작게 줄여도 카카오로 읽히는 이유가 이 두 색입니다. */
.gt-kko .bg{fill:#FEE500}
.gt-kko .fg{fill:#3C1E1E}
/* 딸랑딸랑 — 매다는 점(위 가운데)을 축으로 좌우로 흔듭니다. 계속 흔들면 눈이 아파서
   2.6초마다 한 번, 0.7초만 흔들고 쉽니다(시계 초침과 같은 결). */
.gt-kko{transform-origin:50% 10%; animation:gmJingle 2.6s ease-in-out infinite}
@keyframes gmJingle{
  0%, 74%, 100%{transform:rotate(0)}
  78%{transform:rotate(-13deg)}  82%{transform:rotate(11deg)}
  86%{transform:rotate(-8deg)}   90%{transform:rotate(6deg)}
  94%{transform:rotate(-3deg)}
}
/* 하트 — 흰 속이 붉게 **차오릅니다**. 테두리는 늘 붉은색이라 비어 있어도 하트로 보입니다.
   (SVG 의 fill 은 CSS 로 부드럽게 변합니다. 색 값은 --gi-point 와 같은 #f42b54 을 직접 적습니다 —
    keyframes 안에서 var() 를 쓰면 브라우저에 따라 중간색이 안 섞이고 툭 바뀝니다.) */
.gt-heart path{fill:#fff; stroke:#f42b54; stroke-width:1.7; stroke-linejoin:round; stroke-linecap:round;
  animation:gmHeartFill 2.6s ease-in-out infinite}
@keyframes gmHeartFill{
  0%, 12%{fill:#fff}
  46%, 74%{fill:#f42b54}
  100%{fill:#fff}
}
/* 흔들림·깜빡임을 꺼 둔 손님(어지럼증·멀미) — 움직임만 멈추고 모양은 그대로 둡니다 */
@media (prefers-reduced-motion:reduce){
  .gt-kko{animation:none}
  .gt-heart path{animation:none; fill:#f42b54}
}

/* (되돌리기용) 카드 위 알약 — 지금은 common.js 가 그리지 않습니다 */
.ts-pill{position:absolute; left:50%; transform:translateX(-50%); top:8px; z-index:3;
  display:inline-flex; align-items:center; gap:4px; height:26px; padding:0 10px;
  border-radius:80px; background:#fff; color:var(--gi-ink);
  box-shadow:0 2px 7px rgba(0,0,0,.13); white-space:nowrap; pointer-events:none}
.ts-pill .lb{font-size:10.5px; font-weight:var(--gm-w-mid); color:var(--gi-mute)}
.ts-pill b{font-size:12.5px; font-weight:var(--gm-w-bold); font-variant-numeric:tabular-nums}

/* 섹션 맨 아래 버튼 (타임세일 상품 보러가기 등) */
.sect-more{padding:12px 16px 0; text-align:center}
.sect-more.hide{display:none}
.sect-more .btn{display:inline-block; width:auto; padding:10px 18px; font-size:13px;
  border:1px solid var(--gi-line); color:var(--gi-ink-2); background:#fff}
/* 제목 옆 상태칩 (예약구매 '알림신청 받는 중 3개') — 배지 규칙대로 옅게 */
.gazit-title .gt-chip{display:inline-flex; align-items:center; margin-left:7px;
  vertical-align:middle; height:22px; padding:0 9px; border-radius:var(--gm-r-s);
  background:var(--gm-brand-soft); border:1px solid var(--gm-brand-line);
  color:var(--gm-brand-ink); font-size:11.5px; font-weight:var(--gm-w-mid);
  white-space:nowrap}

/* ── 10-3. 배너 박스 껍데기 제거 ──
   바탕·테두리·라운드·안쪽여백을 전부 걷어냅니다. 상자는 '투명한 칸'만 남습니다
   (관리자 [배너관리]가 이 칸에 이미지를 덮어쓰는 기능이 살아 있어야 해서 남깁니다 —
    server.js SCREEN_ZONES 의 rsvBanner·gbBanner 자리입니다). */
.gazit-banner{background:none; border:0; border-radius:0; padding:0; margin:0 16px 12px;
  text-align:left}
.gazit-banner h2{font-size:15px; font-weight:var(--gm-w-mid); margin:0 0 3px}
.gazit-banner p{font-size:12.5px; color:var(--gi-mute); line-height:1.5}

/* ── 10-4. 없어도 되는 것 — 감춥니다 ──
   · tsTag/tsHead/tsLead/tsState : 제목과 타이머가 이미 말하는 것을 되풀이
   · tsWindow                    : '이번 회차 …~…' — 남은시간 숫자가 더 정확
   · 진행바                       : 남은시간과 같은 말을 두 번
   · rsvHead                     : '최저가 오픈 대기 상품' = 섹션 제목의 되풀이 */
/* ★ #rsvLead 도 감춥니다 — 이 자리는 이제 사무실이 관리자에서 고치는
   [data-sub="reservation"] 한 줄이 맡습니다. 둘 다 보이면 같은 말이 두 줄 납니다.
   요소를 남기는 이유는 위와 같습니다(배포 검사 run.js:11449 가 id 존재를 봅니다). */
#tsTag, #tsHead, #tsLead, #tsState, #tsWindow, #rsvHead, #rsvLead,
#owf_timesale .gazit-progress, #owf_timesale .gazit-progress-text{ display:none !important }
/* 위를 다 감추면 타임특가 배너는 빈 칸이 됩니다 — 자리만 차지하지 않게 */
#owf_timesale .gazit-banner{margin:0}

/* ── 10-5. 공동구매 — 박스는 벗고 초록은 남깁니다 ──
   ★ 여기를 조심해야 합니다. style.css:764~767 이 초록 바탕 위 **흰 글씨**입니다.
     바탕만 지우면 흰 바탕에 흰 글씨가 되어 환불 안내가 통째로 사라집니다.
     공동구매는 지금 내는 돈과 최종 가격이 다른 유일한 섹션이라 이 한 줄이 꼭 보여야 합니다. */
#owf_groupbuy .gazit-banner{background:none; border:0; padding:0; color:var(--gi-ink-2)}
/* ★ 2026-09-15 — 공동구매 한 줄만 12.5px 로 작았습니다 (사장님: "공동구매 밑에 있는 글도
   소제목 폰트 사이즈 동일하게 맞추고"). 이 규칙이 .sect-sub(15px)보다 굵기가 세서 이기고 있었습니다.
   색(초록)은 그대로 둡니다 — 일반 구매와 다른 칸이라는 유일한 신호입니다. */
#owf_groupbuy .gazit-banner p{color:#1B7A43; font-size:15px; font-weight:var(--gm-w-body)}
#owf_groupbuy .gazit-banner p b{font-weight:var(--gm-w-bold); color:#14532d}
/* ★ 제목 앞 초록 점은 뺐습니다 (사장님 2026-09-15 "초록 점도 별로야. 기본 이모지로 들어갈게").
   '일반 구매가 아니다' 라는 신호는 제목의 이모지와 아래 초록 한 줄이 맡습니다.
   제목 앞 그림은 붉은 하트 아이콘이고, 어드민 [화면 미리보기 › 홈 블럭 문구] 제목 앞에 이모지를 넣으면
   하트 대신 그 이모지가 나옵니다 (index.html applySectionCopy · 2026-09-30). */

/* ── 10-6. '준비 중' 안내 — 점선 박스를 벗기고 한 줄로 ──
   ★ 글자색도 같이 바꿉니다. 지금 색(#9a3412·#a16207)은 주황 바탕 위에서 고른 값이라,
     바탕만 지우면 흰 화면에 갈색 글씨가 떠서 더 이상해 보입니다. */
#owf_timesale .ts-pending{background:none !important; border:0 !important;
  padding:4px 16px 10px; margin:0; justify-content:flex-start; text-align:left}
#owf_timesale .ts-pending .ic{display:none}
#owf_timesale .ts-pending .tx{flex:0 1 auto; align-items:center}
#owf_timesale .ts-pending .tx b{color:var(--gi-ink-2); font-size:13.5px; font-weight:var(--gm-w-mid)}
#owf_timesale .ts-pending .tx span{color:var(--gi-mute); font-size:12px}
#owf_timesale .ts-pending .btn{border:1px solid var(--gi-line); color:var(--gi-ink-2)}

/* ── 10-7. 빈 자리 안내 — 점선 상자 제거 ── */
.rail-empty{background:none; border:0; padding:6px 16px 0; text-align:left}
.rail-empty .e-tit{font-size:14px; font-weight:var(--gm-w-mid); color:var(--gi-ink-2)}
.rail-empty .e-txt{font-weight:var(--gm-w-body); color:var(--gi-mute)}
.rail-empty .e-emo{display:none}
#owf_groupbuy .gb-empty{background:none; border:0; padding:18px 16px}

/* ── 10-8. 소통하기 — 회색 박스 제거 ──
   ★ 박스만 지우면 오히려 나빠집니다. 안의 버튼 4개가 색을 꽉 채운 덩어리라
     지금은 회색 바탕이 그걸 한 묶음으로 가두고 있습니다. 흰 바탕에 그대로 풀어놓으면
     홈에서 가장 강한 것이 상품이 아니라 SNS 버튼이 됩니다.
     → 박스를 없애는 것과 **동시에** 버튼도 테두리로 바꿉니다 (버튼 규칙과도 맞습니다). */
.social-bg-box{background:none; border-radius:0; padding:22px 16px 6px; margin:0; text-align:left}
.social-bg-box h2{font-size:19px; font-weight:var(--gm-w-bold)}
.gazit-social a{background:#fff !important; border:1px solid var(--gi-line);
  color:var(--gi-ink-2) !important; font-weight:var(--gm-w-mid)}
.gazit-social .grib{border-color:#ffd9bf; color:#c2560a !important}
.gazit-social .tiktok{border-color:#d9dbe3; color:var(--gi-ink) !important}
.gazit-social .youtube{border-color:#ffd0d0; color:#d32f2f !important}
.gazit-social .insta{border-color:#e6d2f0; color:#8a3ab9 !important}

/* ── 10-9. 하단 3카드 — 상자 대신 목록 행 ── */
.index_ban_500 a{border:0; border-bottom:1px solid var(--gi-line); border-radius:0}

/* ── 10-10. 섹션 제목 아래 '한 줄' (사무실이 관리자에서 고칩니다) ──
   비워두면 hidden 이 붙어 아예 안 나옵니다. 두 줄 이상은 받지 않습니다 —
   여러 줄을 열어두면 2026-09-15 에 걷어낸 '설명 덩어리' 로 되돌아갑니다. */
.sect-sub{margin:-4px 0 10px; padding:0 16px; text-align:left;
  font-size:13px; font-weight:var(--gm-w-body); color:#666; line-height:1.5}
.sect-sub[hidden]{display:none}
/* ★ 관리자가 숨긴 블럭 (직원분 지시 2026-10-02 «눈 버튼으로 블럭들을 홈 화면에서 숨기기 / 켜기») — index.html applySectionCopy 가
   <section> 과 같은 id 의 탭 <a> 에 hidden 을 겁니다. !important — 탭 <a> 는 .gt-live 처럼 display 를 정하는 규칙이 뒤에 와도
   지지 않게(LIVE 칩이 hidden 인데 display:flex 로 되살아나는 것도 함께 막습니다). 빈 탭띠(#tabsWrap)도 같은 식으로 접습니다. */
section[hidden], .gazit-tabs a[hidden], .gazit-tabs-wrap[hidden]{display:none!important}
/* 공동구매 한 줄만 초록 — '이건 일반 구매가 아니다' 라는 신호입니다 */
#owf_groupbuy .sect-sub{color:#1B7A43; margin:0 0 12px}
/* ★ 공동구매 한 줄만 **32px** 에서 시작하고 있었습니다 (다른 단락은 16px).
   감싼 .gazit-banner 에 margin:0 16px 가 있는데(위 351줄) 그 안의 .sect-sub 가
   padding:0 16px 를 또 먹어서 16+16 이 된 것입니다. 감싼 쪽 여백을 0 으로 둡니다. */
.gb-banner{margin-left:0; margin-right:0}

/* ══════════════════════════════════════════════════════════════════════════
   11. 예약구매 카드 — 상품이 보이게                                 2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지적: "예약구매탭의 제품 썸네일에 오픈 안내 시간과 알림신청이 다 들어가 있으니
   상품이 안보여… 알림신청은 버튼으로 해서 썸네일 밑에 만들어 붙여줘."

   ★ 이 자리는 세 번 바뀌었다 되돌아온 곳입니다 (common.js 의 주석에 이력이 있습니다).
     특히 2026-08-25 에는 "아래에 두니 잘 안 보인다" 는 정반대 지시가 있었습니다.
     이번에는 **상품 사진을 살리는 것**이 목적이라 다시 아래로 내립니다.
   ★ style.css 원본은 건드리지 않았습니다 — 배포 검사(run.js:11556)가
     `.restock-wrap{position:absolute;right:0;top:calc(50% - 6px)` 규칙이 그대로 있는지 봅니다.
     여기서 예약 칸만 덮어씁니다.
   ══════════════════════════════════════════════════════════════════════════ */

/* 오픈시각 칩 자리는 아래 12-2 에서 정합니다 (사진 맨 위 띠). */

/* 썸네일 **밖** 아래 가로버튼 */
.card-act{padding:8px 0 0}
.card-act .restock.wide{
  display:flex; width:100%; min-height:38px; margin:0; border-radius:var(--gm-r);
  background:#fff; color:var(--gi-brand); box-shadow:none;
  border:1.5px solid var(--gi-brand); font-size:13px; font-weight:var(--gm-w-mid);
}
/* (2026-09-16 삭제) `#owf_reservation .card.sold.alarm .thumb::after{padding-bottom:0}` — 09-15 '썸네일 밖 가로버튼' 시절
   규칙. 알약이 다시 사진 가운데로 돌아오면서(cardHTML 09-16) 이 줄이 덮개 글씨를 가운데로 끌어내려 **알약과 겹쳤습니다**
   (검토에서 잡음). style.css .card.sold .thumb::after{padding-bottom:64px} 가 글씨를 위로 올려 알약 자리를 비웁니다. */

/* 카드가 높아져도 가로 띠의 형제 카드가 같이 늘어나지 않게.
   .rail 은 flex 인데 align-items 가 없어 기본 stretch 라, 버튼 하나 때문에
   옆 카드까지 늘어나 사진 아래에 빈칸이 생깁니다. */
.rail{align-items:flex-start}

/* ── 12-1. 예약구매 제목 옆 상태칩 숨김 (사장님 2026-09-15 "알림신청 받는 중 3개는 삭제") ──
   요소는 남깁니다 — index.html 의 예약구매 그리기가 #rsvTag 에 널 검사 없이 글을 씁니다. */
#rsvTag{display:none !important}

/* ── 12-2. 오픈시각 칩을 썸네일 **맨 위**로 (사장님 2026-09-15
      "오늘 00시 오픈 은 간격 애매하게 띄우지 말고 상단으로 올려줘") ──
   모서리에서 10px 떠 있던 것을 없애고, 사진 위쪽에 딱 붙는 띠로 바꿉니다. */
#owf_reservation .card.overlay .sched{
  top:0; left:0; right:0; transform:none; display:block;
  /* ★ style.css 의 .sched 에 max-width:calc(100% - 20px) 가 걸려 있어
     띠가 좌우 20px 모자랐습니다(실측 290 / 사진 310). 여기서만 풉니다. */
  max-width:none;
}
/* ★ 딱딱한 검은 막대는 사진 위에 '뚜껑' 처럼 얹혀 어색합니다
   (사장님 2026-09-15 "오픈 예정 알림 시간도 너무 바로 들어가서 어색해보여").
   → 아래로 갈수록 투명해지는 **그늘**로 바꿔 사진과 이어 붙입니다.
     사진 카드에서 글자를 얹을 때 쓰는 기본 방식이고, 경계선이 안 생깁니다. */
#owf_reservation .card.overlay .sched .when{
  display:block; border-radius:0; text-align:left;
  padding:11px 14px 18px; font-size:12.5px; font-weight:var(--gm-w-mid);
  background:linear-gradient(180deg, rgba(13,14,18,.72) 0%,
                                     rgba(13,14,18,.42) 55%,
                                     rgba(13,14,18,0) 100%);
  -webkit-backdrop-filter:none; backdrop-filter:none;
  text-shadow:0 1px 3px rgba(0,0,0,.45);
}

/* ── 12-3. 알림 종을 딸랑딸랑 (사장님 2026-09-15
      "알림신청 버튼이 잘 안보인다는 피드백이 있었으니, 알림 종이 딸랑딸랑 하고 움직이는 모션") ──
   ★ 계속 흔들면 눈이 피로하고 광고처럼 보입니다 — 2.6초에 한 번, 세 번만 흔듭니다.
   ★ 아이콘만 흔들고 버튼은 가만히 둡니다. 버튼이 움직이면 누르려는 손가락이 빗나갑니다. */
.card-act .restock.wide .gi{
  transform-origin:50% 12%;
  animation:gmBell 2.6s ease-in-out infinite;
}
@keyframes gmBell{
  0%, 62%, 100% { transform:rotate(0) }
  66% { transform:rotate(14deg) }
  70% { transform:rotate(-12deg) }
  74% { transform:rotate(9deg) }
  78% { transform:rotate(-7deg) }
  82% { transform:rotate(4deg) }
  86% { transform:rotate(-2deg) }
}
/* 움직임을 줄여달라고 설정한 손님에게는 흔들지 않습니다 */
@media (prefers-reduced-motion:reduce){ .card-act .restock.wide .gi{animation:none} }

/* ══════════════════════════════════════════════════════════════════════════
   13. 도는 시계 · 컬리식 썸네일 배지                                2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   ★ 컬리 메인 「⭐일일특가」 실측 (kurly.com/main · 2026-09-15)
       제목      h2   28px / 500 / 자간 -0.26px / #333 · 왼쪽 정렬, 별 이모지가 제목 앞
       타이머    span 32px / 700 / #333  (시·분·초를 span 3개로 나눠 씀 — 숫자가 제목보다 큽니다)
       시계      36×36 **Lottie 애니메이션** (실제로 돌아가는 것 확인)
       아래 한 줄 p  14px / 400 / #ccc  「망설이면 늦어요!」
       썸네일 배지  absolute top:8px left:8px · 라운드 6px · padding 6px 8px ·
                    바탕 rgb(189,118,255) · 글자 14px / 500 / 흰색

   ★ 컬리는 Lottie(그림 파일)를 쓰지만 우리는 **CSS 로 바늘만 돌립니다** —
     파일을 더 받지 않고, 색도 글자색을 따라가 흑백 화면에서 튀지 않습니다.
     이모지를 CSS 로 돌리는 방법은 쓰지 않았습니다 — 12 숫자까지 같이 돌아
     시계가 넘어진 것처럼 보입니다.
   ══════════════════════════════════════════════════════════════════════════ */
.gt-clock{width:14px; height:14px; flex:none; overflow:visible}
.gt-clock circle{fill:none; stroke:currentColor; stroke-width:1.9}
.gt-clock line{stroke:currentColor; stroke-width:1.9; stroke-linecap:round;
  transform-origin:12px 12px}
/* 분침은 2초에 한 바퀴, 시침은 24초에 한 바퀴 — 눈에 '가고 있다' 가 보이는 속도입니다 */
.gt-clock .mm{animation:gmTick 2s linear infinite}
.gt-clock .hh{animation:gmTick 24s linear infinite}
@keyframes gmTick{ to{ transform:rotate(360deg) } }
@media (prefers-reduced-motion:reduce){
  .gt-clock .mm, .gt-clock .hh{animation:none}
  .gt-clock .mm{transform:rotate(110deg)}   /* 멈춰 있어도 시계로 읽히게 */
}

/* ── 예약구매 오픈시각 — 컬리처럼 썸네일 **왼쪽 위 배지** (사장님 2026-09-15
      "예약구매·오픈특가 시간 안내도, 컬리 썸네일에 왼쪽 상단에 떠있는 알림처럼 해줘") ──
   컬리 실측을 그대로 따르되 바탕만 우리 먹색으로 씁니다(보라는 컬리 브랜드색입니다). */
#owf_reservation .card.overlay .sched{
  top:8px; left:8px; right:auto; transform:none; max-width:calc(100% - 16px);
  /* ★ display:block 이면 .when 이 글줄(인라인) 기준선에 놓여서, 물려받은 큰 행간만큼
     아래로 밀립니다(실측 8px 의도 → 36px 로 내려감). flex 로 두면 위에 딱 붙습니다. */
  display:flex; align-items:flex-start; line-height:1;
}
#owf_reservation .card.overlay .sched .when{
  display:inline-block; border-radius:6px; text-align:left;
  padding:6px 8px; font-size:12.5px; font-weight:var(--gm-w-mid); line-height:1.15;
  background:rgba(13,14,18,.82); color:#fff;
  -webkit-backdrop-filter:none; backdrop-filter:none; text-shadow:none;
}

/* ── 14. 카드 최대 혜택가 (사장님 지시 2026-09-15) ────────────────────────
   온브릭스 카드 실측 (www.onbrix.co.kr/shop/main · 2026-09-15)
     최대 혜택가 라벨   12px / 500 / #F54B3A
     금액             14px / 700 / #F54B3A
   우리는 라벨을 회색으로 둡니다 — 금액만 포인트색이면 숫자가 먼저 읽힙니다.
   ★ 조건(「2,000원 이상」)은 **카드에서 뺐습니다** (사장님 2026-09-15 "복잡하다").
     빼도 거짓이 되지 않는 이유 — 이 값은 lib/db.js 의 publicCouponBest 가
     **이 상품 1개 값(effective)** 으로 계산합니다. 조건에 못 미치면 애초에 null 이라
     카드에 아무것도 안 나옵니다. 즉 **화면에 보이는 금액은 이미 조건을 채운 값**입니다.
     조건은 상품상세의 [최대 혜택가 자세히 보기] 에서 그대로 볼 수 있습니다. */
.card .best{margin-top:4px; display:flex; align-items:baseline; gap:4px; flex-wrap:wrap}
.card .best small{font-size:11px; font-weight:var(--gm-w-mid); color:var(--gi-ink-2); flex:none}
.card .best b{font-size:13.5px; font-weight:var(--gm-w-bold); color:var(--gi-point);
  font-variant-numeric:tabular-nums}
/* 오버레이 카드(예약구매)는 사진 위에 글이 얹혀 자리가 없습니다 — 붙이지 않습니다 */
.card.overlay .best{display:none}

/* ══════════════════════════════════════════════════════════════════════════
   15. 홈 라이브 예고 블록 정돈                                      2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시 — ⑤ 「라이브 예고」 글자 삭제(여백만 차지) ⑥ 방송 제목을 다른 단락 제목과 동일하게
                 ⑦ 판매할 상품이 자리를 너무 많이 차지
   ══════════════════════════════════════════════════════════════════════════ */

/* ⑤ 머리글 자리 — 글자를 뺐으니 높이도 없앱니다 (점만 남습니다) */
/* 점(dots)은 2026-09-16 부터 레일 **아래 가운데**에 — 위 여백 12 (style.css .lp-head 참고). 이 줄이 style.css 보다
   무게가 높아(0,2,0) 여기서 정합니다. */
.live-pre .lp-head{padding:0; margin:12px 0 0; min-height:0; display:flex; justify-content:center}
.live-pre .lp-head:empty{display:none}

/* 예고 카드의 흰 상자도 벗깁니다 — 홈 전체가 상자 없는 결입니다 */
.live-pre .lp-slide{background:none; border:0; box-shadow:none; border-radius:0; padding:0}

/* ⑥ 방송 제목 = 다른 단락 제목과 같은 모양 (20px / 700 / 왼쪽)
   ★ 제목·한줄은 **무대 위**에 있습니다 (사장님 지시 2026-09-15 "미리보기창 위로").
     그래야 아래 단락들과 같은 짜임이 됩니다 — [제목] → [한 줄] → [내용].
     아래 단락의 .gazit-title 은 margin-bottom 10px 이라 그 값을 그대로 씁니다. */
.live-pre .lp-title{font-size:20px; font-weight:var(--gm-w-bold); line-height:1.2;
  letter-spacing:0; text-align:left; color:var(--gi-ink); margin:0 0 4px; padding:0}
.live-pre .lp-note{font-size:13px; font-weight:var(--gm-w-body); color:#666;
  text-align:left; margin:0 0 10px; padding:0; line-height:1.5}
/* 한줄소개가 비어도 자리는 지킵니다 — 옆 장이 걸쳐 보일 때 무대 높이가 어긋나면
   두 장이 삐뚤게 보입니다 (2026-08-26 사장님 지적). 그래서 display:none 을 쓰지 않습니다. */
.live-pre .lp-note:empty{min-height:19px}

/* ⑦ 판매할 상품 — 사진 중심의 작은 줄 */
.live-pre .lp-goods{margin-top:12px; border-top:0; padding-top:0}
.live-pre .lp-goods-h{text-align:left; font-size:13px; font-weight:var(--gm-w-mid);
  color:var(--gi-ink-2); margin-bottom:8px; padding:0}
.live-pre .lp-goods-h span{color:var(--gi-mute); font-weight:var(--gm-w-body)}
.live-pre .lp-goods-list{display:flex; gap:8px; overflow-x:auto; padding-bottom:2px;
  scroll-snap-type:x proximity; -webkit-overflow-scrolling:touch}
.live-pre .lp-goods-list::-webkit-scrollbar{display:none}
.live-pre .lpg{flex:0 0 auto; width:76px; scroll-snap-align:start; text-decoration:none}
.live-pre .lpg-th{position:relative; width:76px; height:76px; border-radius:var(--gm-r);
  background:#e9ecf1 center/cover no-repeat; overflow:hidden}
.live-pre .lpg-th em{position:absolute; left:0; bottom:0; font-style:normal;
  background:rgba(13,14,18,.78); color:#fff; font-size:10.5px; font-weight:var(--gm-w-bold);
  padding:2px 5px; border-radius:0 6px 0 var(--gm-r)}
.live-pre .lpg-nm{display:none}          /* 이름은 눌러 들어가면 바로 나옵니다 */
.live-pre .lpg-pr{margin-top:5px; text-align:left}
.live-pre .lpg-pr b{font-size:12.5px; font-weight:var(--gm-w-bold); color:var(--gi-ink);
  font-variant-numeric:tabular-nums}
.live-pre .lpg-pr em{display:none}

/* ③ 전체상품 보러가기 — 색 없이 테두리만 */
.btn.line{background:#fff; border:1px solid var(--gi-line); color:var(--gi-ink-2); font-weight:var(--gm-w-mid)}

/* ② 소통하기 — 아이콘 하나씩 한 줄 */
.gazit-social.sns1{display:flex; gap:10px; justify-content:flex-start; margin-top:10px}
.gazit-social.sns1 a{width:42px; height:42px; flex:none; border-radius:50%;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:16px; font-weight:700; text-decoration:none;
  background:#fff !important; border:1px solid var(--gi-line)}
.gazit-social.sns1 .grib{color:#c2560a !important; border-color:#ffd9bf}
.gazit-social.sns1 .tiktok{color:var(--gi-ink) !important; border-color:#d9dbe3}
.gazit-social.sns1 .youtube{color:#d32f2f !important; border-color:#ffd0d0}
.gazit-social.sns1 .insta{color:#8a3ab9 !important; border-color:#e6d2f0}
/* 예고 상품 — 사진이 없는 상품은 이모지로 (몰의 일반 카드와 같은 방식) */
.live-pre .lpg-th{display:flex; align-items:center; justify-content:center}
.live-pre .lpg-emo{font-size:30px; line-height:1}

/* ── 15-1. 예고 블록 좌우 여백을 아래 단락과 맞춤 (사장님 지적 2026-09-15) ──
   "미리 보기 창 여백과 밑에 오직 단 하루~ 부터의 좌우 여백이 안 맞아서 더 이상하고."

   ★ 실측으로 원인을 찾았습니다 — 16px 가 **세 겹**으로 쌓여 있었습니다.
       .pad       padding-left 16   (히어로 영역 전체를 감싸는 칸)
       .live-pre  margin-left  16
       .lp-track  padding-left 16
     = 48px. 아래 단락(.gazit-title · .grid2)은 padding-left 16 **한 겹**이라 16px.
     그래서 예고만 32px 안으로 들어가 동떨어져 보였습니다.

   ★ 어느 겹을 남길까 — **.lp-track 것만** 남깁니다.
     예고는 옆으로 넘기는 캐러셀이라, 트랙은 화면 끝까지 닿아야 다음 장이 가장자리에
     걸쳐 보입니다(2026-08-24 사장님 지시). 그래서 바깥 두 겹을 걷고
     .live-pre 에 음수 여백을 줘 .pad 의 16 을 상쇄합니다.
     결과: 예고 내용도 아래 단락과 똑같이 화면에서 16px. */
.live-pre{margin-left:-16px; margin-right:-16px}
.live-pre .lp-track{padding-left:16px; padding-right:16px; scroll-padding-left:16px}

/* 방송중 입장 카드도 같은 규칙으로 (예고와 같은 자리에 번갈아 뜹니다) */
.live-on{margin-left:0; margin-right:0}

/* ── 15-2. 예고 블록 위아래 간격 (사장님 지적 2026-09-15 "위에 창이 너무 동 떨어진 창 같아") ──
   ★ 실측 — 헤더 아래와 예고 무대 사이가 **53px** 이나 벌어져 있었습니다:
       .pad      padding-top 14
       .live-pre margin-top   12
       .live-pre padding-top  26   ← style.css:125 의 `section{padding:26px 0 6px}` 이
                                     <section class="live-pre"> 에도 먹고 있었습니다
     예고는 헤더 바로 아래 첫 화면이라, 여기가 벌어지면 창이 떠 있는 것처럼 보입니다.
   ★ 아래쪽은 반대로 6px 밖에 없어 탭바와 붙어 있었습니다. 둘을 같이 잡습니다. */
.live-pre{margin-top:0; padding-top:0; padding-bottom:18px}

/* ══════════════════════════════════════════════════════════════════════════
   16. PC 라이브 예고 — 왼쪽 설명 / 오른쪽 예고 이미지              2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "pc버전에는 r2w 처럼 왼쪽에 라이브 예고 설명, 오른쪽에 예고 이미지(영상)"

   ★ r2w 실측 (r2w.co.kr/live · PC 1280 · 2026-09-15)
       전체 블록 .FeaturedCampaignPlayer  1180 × 717 · flex
       왼쪽 .wrap-live-desc   393px (글 폭 288)
         날짜 배지  13px / 600 / #EF3434
         제목 h3    26px / 700 / #333 · 행간 36
         설명 p     14px / 400 / #757575 · 행간 20
       오른쪽 영상/이미지 (세로형)

   ★ 우리 값으로 옮긴 것 — 색은 우리 팔레트(브랜드 주황·먹색·회색)를 씁니다.
     제목 크기는 26이 아니라 **24** 로 둡니다. 우리 단락 제목이 20이라
     26이면 예고만 혼자 커져 다른 단락을 눌러 버립니다.
   ══════════════════════════════════════════════════════════════════════════ */
/* ★★ 2026-09-15 — PC 2단을 **걷어냈습니다** (사장님 지시:
     "pc버전에서 라이브 창 화면구성이 영 이상하네... 모바일 기준으로 똑같이 맞춰줘 그냥")

   r2w 를 따라 왼쪽 글 / 오른쪽 사진 2단으로 짰는데, 우리 본문이 700px 로 좁아
   (style.css:670 — 쿠마마켓처럼 폰과 같은 화면) 두 칸이 다 눌려 어색했습니다.
   왼쪽 글칸 320px · 오른쪽 사진 300px — r2w 는 1180px 를 통째로 쓰는 짜임이라
   그 절반 폭에 억지로 욱여넣은 꼴이었습니다.

   → **폰과 똑같은 한 칸**으로 갑니다. 사진 안에 날짜·제목·설명·버튼이 얹히고,
     판매 예정 상품은 그 아래 한 줄. PC 에서는 그 덩어리를 **가운데로 모읍니다**
     (본문 700px 를 사진이 다 먹으면 3:4 비율이라 높이가 900px 가 됩니다).

   ※ 아래 쓰지 않게 된 2단 규칙은 지웠습니다. 되살릴 일이 생기면 이 커밋을 보세요.

   ★★ 2026-09-15 (다시) — **2단으로 되돌렸습니다.** 사장님 지적:
     "pc는 내가 방송에서 판매 예정 상품을 방송 미리보기 옆 오른쪽으로 빼달라고 했잖아."
     원래 원하셨던 것은 2단이 맞고, 한 칸으로 편 것은 제가 **2단의 겹침 버그**를
     레이아웃 문제로 잘못 읽은 탓입니다. 겹침만 고쳐 2단을 살렸습니다 → **§34**.
     여기 PC 규칙은 §34 로 옮겼습니다(목록 규칙이 §31 보다 뒤에 있어야 먹습니다). */
@media (min-width:760px){
  /* ★★ 슬라이드가 **하나뿐일 때만** 가운데로 둡니다 (직원분 지적 2026-09-17 — "PC에서만 레이아웃이 깨짐").
     예전에는 트랙 자체에 justify-content:center 를 걸었습니다. 그런데 flex 는 가운데 정렬일 때
     **넘치는 내용을 양쪽으로 잘라** 버립니다 — 예고가 2장 이상이면 첫 장이 왼쪽으로 171px 잘려
     나가고(실측 · PC 1022px) 스크롤로도 그 자리로 돌아갈 수 없습니다.
     한 장일 때만 margin:auto 로 가운데 두면 두 경우 다 맞습니다. */
  .live-pre .lp-track > .lp-slide:only-child{margin-left:auto; margin-right:auto}
}

/* ══════════════════════════════════════════════════════════════════════════
   17. 방송 중 「지금 판매중인 상품」                                 2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "라이브가 시작되면 라이브 방송 상품들을 한스스타일처럼
                 지금 판매중인 상품으로 리스트해서 보여주기."

   ★ 한스스타일 실측 (hanstyle.tv/shop/page.html?id=25 · PC · 2026-09-15)
       머리   「지금 판매중인 상품」  16px / 500 / #333
       목록   377px 폭 · 세로 스크롤 (22행)
       행     369 × 96 · flex · padding 8px · 행간격 0 (붙어 있음)
       썸네일 64 × 80 (4:5 세로) · 라운드 0
       브랜드 12px / 500 / #757575
       상품명 13px / 700 / #333
       가격   13px / 600 / #333

   ★ 우리 값으로 옮긴 것 — 썸네일은 **1:1** 로 둡니다. 한스는 옷이라 4:5 세로가 맞지만
     우리는 식품·건기식이라 정사각이 상품 전체를 보여줍니다(몰의 다른 카드도 전부 1:1).
     라운드는 우리 규칙(10px)을 씁니다. 브랜드 줄은 없습니다(우리는 자사 상품뿐).
   ══════════════════════════════════════════════════════════════════════════ */
.live-goods{margin:14px 0 0; padding:0 16px}
.live-goods[hidden]{display:none}
.live-goods .lg-h{font-size:16px; font-weight:var(--gm-w-mid); color:var(--gi-ink); margin-bottom:10px}
.live-goods .lg-h span{font-size:13px; font-weight:var(--gm-w-body); color:var(--gi-mute)}
/* 목록 — 행이 붙어 있고, 길면 안에서만 스크롤합니다(페이지가 끝없이 길어지지 않게) */
.live-goods .lg-list{max-height:328px; overflow-y:auto; -webkit-overflow-scrolling:touch;
  border-top:1px solid var(--gi-line)}
.live-goods .lg-list::-webkit-scrollbar{width:0}
.live-goods .lg{display:flex; align-items:center; gap:10px; padding:8px 0;
  border-bottom:1px solid var(--gi-line); text-decoration:none; color:inherit}
.live-goods .lg-th{width:64px; height:64px; flex:none; border-radius:var(--gm-r);
  background:#e9ecf1 center/cover no-repeat; overflow:hidden;
  display:flex; align-items:center; justify-content:center}
.live-goods .lg-emo{font-size:26px; line-height:1}
.live-goods .lg-in{flex:1; min-width:0}
.live-goods .lg-nm{font-size:13px; font-weight:var(--gm-w-mid); color:var(--gi-ink);
  line-height:1.35; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.live-goods .lg-pr{display:flex; align-items:baseline; gap:5px; margin-top:4px;
  font-variant-numeric:tabular-nums}
.live-goods .lg-pr i{font-style:normal; font-size:13px; font-weight:var(--gm-w-bold); color:var(--gi-point)}
.live-goods .lg-pr b{font-size:13px; font-weight:var(--gm-w-bold); color:var(--gi-ink)}
.live-goods .lg-pr s{font-size:11.5px; color:var(--gi-mute)}

/* PC — 왼쪽 방송 영상 / 오른쪽 판매중 상품 (한스스타일과 같은 자리)
   한스는 영상 377 · 목록 377 이지만 우리 본문은 700px 라 영상 300 · 목록 나머지로 둡니다. */
/* ★★ 2026-09-15 — 여기 있던 PC 규칙은 **§34 로 옮겼습니다.**
     한 번 한 칸으로 폈다가(겹침 버그를 레이아웃 문제로 잘못 읽었습니다)
     사장님 지적으로 2단을 되살렸습니다. 겹침의 진짜 원인과 고친 값은 §34 에 적었습니다. */

/* ══════════════════════════════════════════════════════════════════════════
   18. 폰 — 예고를 r2w 레이아웃 그대로                               2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "사진 안으로 넣고, 글이 묻힐 것 같으면 예고 사진을 살짝 어둡게."
                "레이아웃 완전 똑같이 배끼기"

   ★ r2w 모바일 픽셀 실측 (r2w.co.kr/live · 375 · 2026-09-15)
       카드      335 × 503 · left 20 · 라운드 12px · overflow hidden
       안쪽 여백  좌 20 · 하 20
       날짜 알약  bg #FFF1F1 · 라운드 60px · padding 6px 12px · 150×27
                 글자 13px / 600 / #EF3434
       제목      22px / 700 / 흰
       설명      12px / 400 / 흰 · 한 줄
       버튼      14px / 500 / 흰 · 테두리 1px rgba(255,255,255,.5) · 라운드 100px · 90×32
       세로 간격  알약→제목 12 · 제목→설명 12 · 설명→버튼 16 · 버튼→바닥 20
       전부 사진 **아래쪽 왼쪽**에 얹힙니다.

   ★ 우리와 다른 점 둘 — 그대로 따르지 않은 이유를 적어 둡니다.
     ① 카드 비율: r2w 1:1.5 / 우리 3:4. 예고 사진 비율은 2026-08 에
        "폰 카메라 기본이 3:4" 라고 정한 값입니다. 여기를 바꾸면 **기존 예고 사진이 잘립니다.**
     ② r2w 는 카운트다운이 없고 날짜만 있습니다. 우리는 카운트다운이 중요하므로
        **날짜 알약 안에 남은시간을 같이** 넣어 줄 수를 늘리지 않았습니다.
   ★ 색은 우리 팔레트로 — 연분홍 #fff0f3(--gm-hot-soft) + 핑크빨강 #f42b54(--gi-point).
     r2w 의 #FFF1F1 / #EF3434 와 거의 같은 자리입니다.
   ══════════════════════════════════════════════════════════════════════════ */
/* ★★ 2026-09-15 — 원래 `@media (max-width:759px)` 였습니다. PC 2단을 걷어내면서
     **PC 도 이 짜임을 그대로 쓰게** 열었습니다 (사장님: "모바일 기준으로 똑같이 맞춰줘 그냥").
     `@media all` 은 '항상' 이라는 뜻입니다 — 중괄호 짝을 그대로 두려고 이렇게 씁니다. */
@media all{
  /* 사진 밖 제목·한줄은 안 씁니다 — 제목·설명은 사진 안에 얹힙니다 */
  .live-pre .lp-title, .live-pre .lp-note{display:none}

  .live-pre .lp-stage{display:block; position:relative; border-radius:12px}

  /* 사진 안 내용 — 아래쪽 왼쪽, 안쪽 여백 20 */
  .live-pre .lp-over{position:absolute; inset:0; display:flex; flex-direction:column;
    align-items:flex-start; justify-content:flex-end; gap:0; padding:20px; text-align:left}

  /* 날짜 알약 — r2w 실측 그대로 (라운드 60 · padding 6/12 · 13/600) */
  .live-pre .lp-when{align-self:flex-start; background:var(--gm-hot-soft); color:var(--gi-point);
    border-radius:60px; padding:6px 12px; font-size:13px; font-weight:var(--gm-w-mid);
    line-height:1.15; box-shadow:none}
  /* 「라이브까지」 글자는 뺍니다 — 알약 안 남은시간이 그 뜻을 이미 담습니다 */
  .live-pre .lp-lead{display:none}
  /* 남은시간을 알약 옆에 붙여 한 줄로 (r2w 는 날짜만, 우리는 카운트다운이 더 있습니다) */
  .live-pre .lp-timer{position:absolute; left:20px; top:20px; font-size:0}
  .live-pre .lp-timer::after{content:attr(data-left); font-size:13px; font-weight:700;
    color:#fff; background:rgba(13,14,18,.55); border-radius:60px; padding:6px 12px;
    -webkit-backdrop-filter:blur(4px); backdrop-filter:blur(4px)}

  /* 제목 22/700 흰 — 알약에서 12px */
  .live-pre .lp-title-in{margin-top:12px; font-size:22px; font-weight:var(--gm-w-bold);
    color:#fff; line-height:1.25; letter-spacing:0;
    display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden}
  /* 설명 12/400 흰 · 한 줄 — 제목에서 12px */
  .live-pre .lp-note-in{margin-top:12px; font-size:12px; font-weight:var(--gm-w-body);
    color:rgba(255,255,255,.9); line-height:1.5;
    overflow:hidden; text-overflow:ellipsis; white-space:nowrap; max-width:100%}
  .live-pre .lp-note-in:empty{display:none}

  /* 버튼 — 설명에서 16px · 테두리만 · 라운드 100 (r2w 실측) */
  .live-pre .lp-btns{margin-top:16px; width:auto; justify-content:flex-start; gap:8px}
  .live-pre .lp-alarm{min-height:32px; padding:0 14px; font-size:14px; font-weight:var(--gm-w-mid);
    background:transparent; border:1px solid rgba(255,255,255,.5); color:#fff; box-shadow:none}
  .live-pre .lp-share{min-height:32px; padding:0 12px; font-size:14px;
    background:transparent; border:1px solid rgba(255,255,255,.5); color:#fff}
  .live-pre .lp-share span{font-size:14px; font-weight:var(--gm-w-mid)}

  /* ★ 글이 묻히지 않게 아래쪽을 더 어둡게 (사장님 지시).
     위쪽은 그대로 둡니다 — 사진 전체를 어둡게 하면 정작 상품이 안 보입니다. */
  .live-pre .lp-dim{background:linear-gradient(180deg,
    rgba(0,0,0,.14) 0%, rgba(0,0,0,.26) 40%, rgba(0,0,0,.60) 74%, rgba(0,0,0,.88) 100%)}
}
/* (PC 에서 사진 안 제목을 감추던 규칙은 뺐습니다 — 2026-09-15 부터 PC 도 폰과 같은 짜임입니다) */

/* ══════════════════════════════════════════════════════════════════════════
   19. 라이브 예고 — 카운트다운 제거 · 종 모션 · 신청완료 · 한 덩어리  2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시
     ① "카운팅 다운 숫자 빼줘. 굳이 필요할까…?"
     ② "알림 종 딸랑딸랑 움직이는 모션 추가"
     ③ "알림 받기 신청하면 버튼이 알림 신청 완료로 **버튼색 칠해지고**, 종이 체크로"
     ④ "판매 예정 상품 … 좌우 여백 딱 맞게 / 썸네일 크기 그때그때 바뀌게"
     ⑤ "예고와 판매할 상품이 한 덩어리처럼 보이게"
   ══════════════════════════════════════════════════════════════════════════ */

/* ① 카운트다운 제거 — 날짜 알약이 "언제 하는지" 를 이미 말합니다.
   ★ 요소는 남깁니다(display:none) — index.html 의 매초 타이커가 이 요소를 잡습니다.
     지우면 그 코드도 같이 고쳐야 하고, 되살릴 때 또 고쳐야 합니다. */
.live-pre .lp-timer, .live-pre .lp-lead{display:none !important}

/* ② 종 딸랑딸랑 — 2.6초에 한 번, 아이콘만 흔듭니다(버튼이 움직이면 손가락이 빗나갑니다) */
.live-pre .lp-alarm:not(.done) .gi, .card .restock:not(.done) .gi{
  transform-origin:50% 12%; animation:gmBell 2.6s ease-in-out infinite;
}
@media (prefers-reduced-motion:reduce){
  .live-pre .lp-alarm .gi, .card .restock .gi{animation:none}
}

/* ③ 신청 완료 — 채웁니다. 이 화면에서 '이미 한 일' 을 말하는 유일한 표시라
   테두리만으로는 눌렀는지 안 눌렀는지 구별이 약합니다. 종은 체크로 바뀝니다(JS). */
.live-pre .lp-alarm.done{
  background:#fff !important; border-color:#fff !important; color:var(--gi-ink) !important;
  font-weight:var(--gm-w-bold);
}
.card .restock.done, .card-act .restock.wide.done{
  background:var(--gi-brand) !important; border-color:var(--gi-brand) !important;
  color:#fff !important; box-shadow:none;
}

/* ④ 판매 예정 상품 — 개수에 맞춰 칸을 나눠 좌우를 딱 맞춥니다.
   5개까지는 한 줄에 똑같이 나누고(--n), 6개부터는 지금처럼 옆으로 넘깁니다. */
.live-pre .lp-goods-list.fit{display:grid; grid-template-columns:repeat(var(--n,4), 1fr);
  gap:8px; overflow:visible}
.live-pre .lp-goods-list.fit .lpg{width:auto}
.live-pre .lp-goods-list.fit .lpg-th{width:100%; height:auto; aspect-ratio:1/1}

/* ⑤ 예고와 판매할 상품을 한 덩어리로 —
   한스스타일은 영상과 목록을 같은 패널 안에 둡니다. 우리는 홈에서 상자를 다 걷어냈으므로
   **테두리 없는 아주 연한 바탕** 하나로만 묶습니다. 선을 더하면 걷어낸 상자가 되돌아옵니다. */
.live-pre .lp-slide{background:var(--gi-soft); border-radius:14px; padding:10px 10px 14px}
.live-pre .lp-stage{border-radius:10px}
.live-pre .lp-goods{margin-top:12px; padding:0 2px}

/* ── 19-1. 「이 방송에서 판매할 상품 N개」 글자 삭제 (사장님 지시 2026-09-15) ──
   바로 위가 방송 제목이고 아래가 상품 사진이라, 무엇인지는 보면 압니다.
   ★ 요소는 남깁니다 — 개수(N개)를 JS 가 여기에 써넣고 있어서,
     지우면 그 코드도 같이 고쳐야 합니다. 되살릴 때도 한 줄이면 됩니다. */
.live-pre .lp-goods-h{display:none}
.live-pre .lp-goods{margin-top:10px}

/* ── 20. 푸터 SNS (사장님 지시 2026-09-15 — 홈 '기멱과 소통하기' 를 여기로) ──
   푸터 글자와 같은 결로. 색은 아이콘이 stroke:currentColor 라 여기서 한 번에 정합니다. */
#footer .fsns{display:flex; gap:18px; align-items:center; padding:14px 16px 4px}
#footer .fsns a{display:inline-flex; color:var(--gi-mute); line-height:0; text-decoration:none}
#footer .fsns a:active{color:var(--gi-ink-2)}

/* 홈에서 걷어낸 '기멱과 소통하기' 잔여 규칙 정리 */
.social-bg-box{display:none}

/* ══════════════════════════════════════════════════════════════════════════
   21. 왼쪽 정렬선 16px — 글자가 서는 자리를 한 줄로                 2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "전체적으로 왼쪽 레이아웃 글자 정렬 다시 확인해봐 … 전체 홈 화면 페이지
                글자 레이아웃 다 맞춰."

   브라우저에서 **눈에 보이는 글자의 왼쪽 끝**(Range.getClientRects)을 전부 재서
   16px 에서 벗어난 것만 여기 모았습니다. 상자가 아니라 **잉크**를 기준으로 재야 합니다 —
   상자는 16 인데 안쪽 여백 때문에 글자는 27 에서 시작하는 일이 실제로 있었습니다.

   재기 전: 타이머 27 · 공동구매 한 줄 32 · 상품카드 글자 17 · 랭킹 집계줄 18
   재고 나서: 전부 16                                                        */

/* ① 상품카드 속 글자 — 상품명·할인율·가격·최대 혜택가가 **17px** 이었습니다.
      .card 에 테두리는 없고(0px), 원인은 .desc 의 좌우 1px 안쪽 여백입니다
      (style.css:262 `.card.plain .desc{padding:10px 1px 0}`).
      1px 이라 하나만 보면 안 보이지만, 단락 제목(16)과 세로로 겹쳐 보면 어긋납니다.
   ★ 몰의 모든 상품 격자가 이 규칙을 씁니다(홈·전체상품·마이페이지·주문서) — 다 같이 16 이 됩니다. */
.card.plain .desc{padding-left:0; padding-right:0}

/* ② 랭킹 '최근 7일 N건 주문' — 좌우 2px 안쪽 여백으로 18px 이었습니다
      (index.html 안 #v-ranking 블록). 같은 카드 안의 상품명과도 어긋났습니다. */
/* (규칙은 index.html 안 #v-ranking 블록에 직접 고쳤습니다 — 그 <style> 이 이 파일보다 뒤에 실려
   여기서 같은 굵기로 적으면 지기 때문입니다.) */

/* ══════════════════════════════════════════════════════════════════════════
   22. 탭줄을 로고칸 밑으로 · [LIVE] 칩                              2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "이걸 온브릭스처럼 로고칸 밑으로 고정 픽스 시켜.
                앞에 LIVE 블럭 추가해서 거긴 live 예고 칸으로."

   ★ 온브릭스 실측(폰 390px) — 로고줄 50 + 탭줄 51.6 이 **한 덩어리로** fixed top:0.
     탭은 글자 + 활성 밑줄바(65×3). 우리는 자리·고정만 따라 하고 알약은 유지합니다.  */

/* ① 앵커로 뛸 때 헤더+탭줄에 안 가리게 — 잰 값(--gm-sticky-h)을 씁니다.
      전에는 112px 로 박혀 있었는데 실제로 덮는 높이는 약 128~130px 이라
      섹션 제목 윗부분이 늘 조금 잘려 있었습니다(이동 전부터 있던 문제). */
section{scroll-margin-top:var(--gm-sticky-h,130px)}
.pad[id^="owf_"]{scroll-margin-top:var(--gm-sticky-h,130px)}

/* ② 예고 아래 18px — 이유가 사라졌습니다.
      "예고 아래가 6px 뿐이라 탭바와 붙어 있었다" 며 넣은 여백인데, 탭바가 위로 갔으니
      이제는 아래 section 의 padding-top 26px 위에 얹혀 44px 빈칸이 됩니다. */
.live-pre{padding-bottom:0}

/* ③ [LIVE] 칩 — 방송 중이면 빨간 점이 깜빡입니다.
      방송도 예고도 없으면 hidden 이 붙어 통째로 사라집니다(index.html 의 paintLiveHero). */
.gazit-tabs a.gt-live{display:inline-flex; align-items:center; gap:6px}
/* ★ 빨간 점은 **정말 방송 중일 때만** 켭니다.
     예고만 있는데 빨간 점을 켜면 "지금 방송한다" 로 읽혀 손님이 눌러 들어왔다 헛걸음합니다.
     예고일 때는 글자 [LIVE] 만 — 눌러 가면 예고 카드가 언제인지 말해 줍니다. */
.gazit-tabs a.gt-live .gtl-dot{display:none; width:7px; height:7px; border-radius:50%;
  background:var(--gi-hot); flex:none}
.gazit-tabs a.gt-live.on .gtl-dot{display:inline-block; animation:gmLiveDot 1.4s ease-in-out infinite}
@keyframes gmLiveDot{ 0%,100%{opacity:1} 50%{opacity:.25} }
@media (prefers-reduced-motion:reduce){ .gazit-tabs a.gt-live.on .gtl-dot{animation:none} }

/* ③ 방송 중 「지금 판매중인 상품」 제목이 32px 에서 시작하고 있었습니다.
      감싼 .pad 가 이미 16 인데(style.css:33) .live-goods 가 또 16 을 먹었습니다.
      ★ 방송 중에만 보이는 칸이라 평소 화면에서는 안 드러났습니다.
      PC 2단(아래 .live-wrap > .live-goods)은 이미 padding:0 이라 영향 없습니다. */
.live-goods{padding-left:0; padding-right:0}

/* ④ 푸터 SNS 아이콘이 32px — 바로 위 [이용약관…] 줄은 16 입니다.
      푸터가 이미 padding:24px 16px 90px 인데(style.css:365) .fsns 가 또 16 을 먹었습니다.
      (어제 이 줄을 만들면서 제가 넣은 여백입니다.) */
#footer .fsns{padding-left:0; padding-right:0}

/* ⑤ 후기 줄 썸네일이 18px — 좌우 2px 안쪽 여백 때문입니다(style.css:355).
      위아래 13px 은 줄 간격이라 그대로 두고 좌우만 0 으로. */
.review-item{padding-left:0; padding-right:0}

/* ⑥ 로고칸의 좌우 여백만 14px 이라, 바로 밑에 붙은 탭줄(16)과 2px 어긋나 있었습니다.
      전에는 사이에 다른 것이 있어 안 보였지만, 탭줄이 로고 바로 밑으로 온 지금은
      두 줄의 왼쪽 끝이 세로로 맞닿아 그 2px 이 그대로 보입니다. 몰에서 14 를 쓰는 곳은
      여기 한 곳뿐이었습니다. 오른쪽 아이콘들도 같이 2px 안으로 들어옵니다. */
.head-row{padding-left:16px; padding-right:16px}

/* ══════════════════════════════════════════════════════════════════════════
   23. 카드 가격을 세 줄로 — 온브릭스 방식                           2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "제품칸에 할인 %, 할인가, 정상가가 한줄로 표기 되어 있는데,
                온브릭스처럼  정상가 / 할인율%, 할인 금액 / 최대 혜택가  이렇게 3줄로 표기."

   ★ 온브릭스 카드 실측 (onbrix.co.kr · 2026-09-15 · getComputedStyle)
       1줄  정상가      SPAN.price-area--del   12px / 500 / #949494 / 취소선
       2줄  할인율%     SPAN.price-area--sale  16px / 800 / #F54B3A
            할인 금액   SPAN.price-area--main  16px / 800 / #1D1D1B
       3줄  최대 혜택가 SPAN                   12px / 500 / #F54B3A
            금액        B.expected_price       14px / 700 / #F54B3A
       줄 사이 간격 5px · 4px

   ★ 굵기는 800 이 아니라 **700** 을 씁니다 — 이 몰의 굵기는 400/600/700 세 가지로
     정해져 있습니다(mall-ui.css 맨 위 토큰). 800 을 하나만 들이면 그 규칙이 깨집니다.

   ★★ HTML 은 안 건드립니다. 마크업 순서는 [할인율 · 할인가 · 정상가] 그대로 두고
      `order:-1` 로 **정상가만 맨 위로** 올립니다. 이유:
      common.js 의 가격 덩어리는 갈래가 셋(직원가 · 오픈가 · 일반)이고, 몰의 모든 화면
      (홈·전체상품·마이페이지·주문서)이 같은 함수를 씁니다. 순서를 손으로 바꾸면
      세 갈래 × 여러 화면을 다 고쳐야 하고 하나만 빠뜨려도 어긋납니다. */
.card.plain .spec{flex-wrap:wrap; align-items:baseline; gap:0 6px; row-gap:5px}
/* 1줄 — 정상가를 통째로 윗줄로 (order 는 마크업이 아니라 보이는 순서만 바꿉니다) */
.card.plain .spec .list{order:-1; flex:0 0 100%; margin:0;
  font-size:12px; font-weight:var(--gm-w-mid); color:#949494; text-decoration:line-through}
/* 2줄 — 할인율 + 할인가, 둘 다 같은 크기·굵기 (온브릭스도 같습니다) */
.card.plain .spec .rate{font-size:16px; font-weight:var(--gm-w-bold); color:var(--gi-point)}
.card.plain .spec .rate span{font-size:12px; font-weight:var(--gm-w-mid)}   /* % 기호만 작게 */
.card.plain .spec .now{font-size:16px; font-weight:var(--gm-w-bold); color:var(--gi-ink)}
/* 3줄 — 최대 혜택가 (온브릭스는 라벨도 포인트색, 우리는 라벨 회색 · 금액만 포인트색) */
.card.plain .best{margin-top:4px}
.card.plain .best small{font-size:12px}
.card.plain .best b{font-size:14px}
/* 직원가 갈래는 [직원가 | 금액 | 정상가] 한 줄이 맞습니다 — 할인율이 없어 2줄이 안 됩니다 */
.card.plain .spec.staff .list{order:0; flex:none; font-size:12px}

/* ══════════════════════════════════════════════════════════════════════════
   24. 상단 띠 — 두께를 글자에 맞추고 [×] 로 닫기                   2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "최상단 롤링 띠 배너도 x자로 끌 수 있게 처리.
                지금 글자가 너무 많은데 배너가 좁아서 가독성이 안 좋음. 온브릭스처럼 두께 조정."

   ★ 재보니 이랬습니다 — 띠 높이 **34px**, 글자 12px, 줄높이 16.8px, **두 줄**.
     16.8 × 2 = 33.6 → 34px 를 글자가 **꽉 채워** 위아래 여백이 0.2px 이었습니다.
     글자가 띠의 위아래 테두리에 닿아 있으니 읽기 힘든 게 당연합니다.
   → 높이를 숫자로 박지 않고 **글자가 정하게** 둡니다. 여백 9px, 줄높이 1.5.
     한 줄이면 얇게, 두 줄이면 그만큼 두껍게 — 문구를 사무실이 고쳐도 항상 맞습니다.

   ★ 오른쪽은 [×] 자리로 비웁니다. 가운데 정렬이라 오른쪽만 비우면 글자가 왼쪽으로
     치우쳐 보이므로, **좌우를 같은 34px** 로 두고 [×] 를 그 위에 얹습니다. */
.topbanner{min-height:0; padding:9px 34px; line-height:1.5}
.topbanner .tb-line{min-height:0; line-height:1.5}
.topbanner .tb-x{position:absolute; top:0; right:0; bottom:0; width:34px;
  display:inline-flex; align-items:center; justify-content:center;
  border:0; background:none; padding:0; color:inherit; opacity:.65; cursor:pointer}
.topbanner .tb-x:active{opacity:1}

/* ══════════════════════════════════════════════════════════════════════════
   25. 상품명이 한 줄인 카드의 빈칸 없애기                          2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "상품특가에서 상품명이 1줄인 상품은 여백이 생겨 확인."

   ★ 재보니 이랬습니다 (오늘 특가 첫 줄, 폰 390px)
       왼쪽 카드(이름 2줄)  이름 끝 1181.9 → 가격줄 시작 1181.9   틈 0
       오른쪽 카드(이름 1줄) 이름 끝 1162.4 → 가격줄 시작 1181.9   틈 **19.6px**
       (최대 혜택가까지 없는 카드는 틈이 **43.9px**)

   왜 생겼나 — 가격 덩어리에 `margin-top:auto`(style.css:270,272)가 걸려 있어
   **카드 바닥 쪽으로 밀려 내려갑니다.** 옆 카드와 바닥은 맞지만, 이름이 짧은 카드는
   이름과 가격 사이가 그만큼 벌어집니다.

   → 고치는 방법은 **위에서부터 맞추기** 입니다:
     ① 이름 칸은 길든 짧든 **항상 두 줄 높이**를 차지하게 (온브릭스도 두 줄을 비워 둡니다)
     ② 가격 덩어리는 밑으로 안 밀고 이름 바로 아래에
     그러면 모든 카드에서 가격 줄이 **같은 높이**에서 시작합니다.
     최대 혜택가가 없는 카드는 그만큼 아래가 짧아질 뿐인데, 격자가 카드 높이를
     서로 맞춰 주므로(align-items:stretch) 그 빈자리는 눈에 안 보입니다.

   ★ 몰의 모든 상품 격자·띠가 같은 카드를 씁니다(홈·전체상품·마이페이지·프로모션 구좌)
     — 한 곳에서 고치면 전부 같이 맞습니다. */
/* ★★ 2026-09-17 — 두 줄 → **한 줄** (직원분 지시: "우리 제품들이 전체적으로 상품명이 1줄로
     짧은 것들이 많아, 전체 상품카드에는 상품명 2줄→1줄로 변경, 1줄에 맞춰 하단 정보들 올려서
     레이아웃 맞추기").
   위 설명의 ①②는 그대로 살아 있습니다 — 이름 칸 높이를 **고정**해 가격 줄을 같은 높이에서
   시작하게 한다는 뜻이고, 그 고정 높이가 두 줄에서 한 줄로 바뀐 것뿐입니다.
   두 줄이던 시절에는 짧은 이름 카드마다 이름 아래 19.6px 가 비어 있었습니다 — 그만큼 카드가 짧아집니다.
   (자르는 것은 style.css 의 -webkit-line-clamp:1 이 합니다 — 두 값은 **같이** 움직여야 합니다.) */
.card.plain .name{min-height:1.45em}   /* 1.45 = .name 의 줄높이(style.css) */
.card.plain .spec{margin-top:0}

/* ══════════════════════════════════════════════════════════════════════════
   26. 공동구매 카드 — 회색 빈 네모 · 주황 상자 정리                2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "공동구매 구좌에 공동구매 상품을 테스트로 넣고, 상품이 있을때
                어떻게 보여지는지 봐줘."  → 넣어 보니 두 가지가 눈에 걸립니다.

   ① 사진 없는 상품이 **회색 빈 네모**였습니다.
      이 칸은 카드 폭 전체(폰 358px · 4:3)라 회색 덩어리가 통째로 앉습니다.
      상품색 + 이모지로 채웁니다 — 홈의 다른 상품카드와 같은 방식입니다.
      (지금 상품 20개가 전부 사진이 없습니다. 예고 상품에서 똑같은 것을 고쳤습니다.)

   ② 맨 아래 「지금 정가로 결제 → …」 가 **연주황 네모 상자**였습니다.
      사장님 2026-09-15 "네모 박스를 없애줘. 이게 너~~~무 지저분해."
      ★ 글자는 **지우지 않습니다.** 공동구매는 지금 내는 돈과 최종 가격이 다른
        유일한 칸이라, 이 한 줄이 없으면 손님이 평소처럼 사는 줄 알고 결제합니다(환불 분쟁).
        상자만 벗기고 초록 글자로 남깁니다 — 섹션 소제목과 같은 결입니다. */
.gb-emo{position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
  font-size:64px; line-height:1; pointer-events:none}
.gb-rule{background:none; border:0; border-radius:0; padding:8px 2px 0; margin-top:4px;
  color:#1B7A43; font-size:12.5px; line-height:1.5}
.gb-rule.ok{background:none; color:#14532d}

/* ── 26-2. 공동구매 카드 — [친구 소개하기] · 카드를 덮는 링크 ──────────────
   사장님 지시 2026-09-15: "공동구매에 카카오 공유하기 버튼을 넣어줘. 친구 소개하기 버튼 명으로."

   ★ 카드 전체가 상품으로 가는 링크인데 그 안에 버튼이 하나 더 생겼습니다.
     <a> 안에 <button> 을 넣으면 눌림이 겹쳐 버튼을 눌러도 상품 페이지로 끌려갑니다.
     → 카드를 <div> 로 두고 **투명한 링크 한 장**을 카드 위에 깔았습니다(.gb-link).
       버튼은 그 링크보다 위(z-index)에 올라가 자기 눌림만 받습니다. */
.gb-card{position:relative}
.gb-card .gb-link{position:absolute; inset:0; z-index:1; border-radius:20px; text-decoration:none}
.gb-card > *:not(.gb-link){position:relative; z-index:2; pointer-events:none}
/* 버튼·사진 위 알약만 다시 눌리게 (나머지는 링크가 받아야 카드 아무 데나 눌러도 열립니다) */
.gb-card .gb-share{pointer-events:auto}

/* ★★ 2026-09-17 — [친구 소개하기]를 **눈에 띄게** (직원분 지시).
     흰 바탕 + 회색 테두리라 카드 안에서 가장 조용한 요소였습니다. 공동구매는 친구를 부르는 게
     곧 달성률이라, 이 단추가 카드에서 **유일하게 색이 있는 단추**가 되도록 했습니다:
     연한 분홍 바탕(#fff1f4) + 붉은 테두리·글씨. 하트는 아래 .gb-heart 가 까딱입니다.
   ※ 자리는 그대로 카드 맨 아래입니다 — 값·달성률을 다 읽은 다음이 '그래서 뭘 하지' 의 자리입니다. */
.gb-share{display:flex; align-items:center; justify-content:center; gap:7px;
  width:100%; margin-top:13px; padding:12px 14px;
  border:1px solid #ffc9d4; border-radius:var(--gm-r-m, 12px); background:#fff1f4;
  color:#e01b41; font-size:14px; font-weight:var(--gm-w-bold, 700); cursor:pointer}
.gb-share:active{background:#ffe3e9}
/* 하트가 **까딱** — 심장이 한 번 뛰듯 기울었다 돌아옵니다. 2.4초에 한 번만 (계속 움직이면 글을 못 읽습니다) */
.gb-heart{width:16px; height:16px; flex:none; overflow:visible;
  transform-origin:50% 60%; animation:gmHeartNod 2.4s ease-in-out infinite}
.gb-heart path{fill:#e01b41}
@keyframes gmHeartNod{
  0%, 70%, 100%{transform:rotate(0) scale(1)}
  76%{transform:rotate(-14deg) scale(1.16)}
  82%{transform:rotate(9deg) scale(1.06)}
  88%{transform:rotate(-5deg) scale(1.1)}
  94%{transform:rotate(0) scale(1)}
}
@media (prefers-reduced-motion:reduce){ .gb-heart{animation:none} }

/* ── 26-3. 예약해 둔 공동구매 — «오픈 대기중» 카드 (직원분 지시 2026-10-01) ──────────────
   «공동구매 예약을 해두면, 상태가 대기중일때도 홈 화면에 오픈 대기중 / 00월 00일 00시 오픈 예정 으로».
   ★ 진행 중 카드와 같은 틀 — 달성 막대·%·[친구 소개하기] 대신 오픈 시각 한 줄.
   ★ 색은 주황(브랜드) 계열 — 핑크빨강은 장사 신호(할인율·혜택가) 몫이고, 관리자 «시작 전» 표시도 같은 주황입니다. */
.gb-badge.soon{background:var(--gi-brand); color:#fff}
.gb-open{display:flex; align-items:center; gap:7px; margin:13px 0 0; padding:12px 14px;
  border:1px solid var(--gm-brand-line); border-radius:6px; background:var(--gm-brand-soft); color:var(--gm-brand-ink);
  font-size:14px; font-weight:var(--gm-w-mid); line-height:1.4}
.gb-open b{font-weight:var(--gm-w-bold); font-variant-numeric:tabular-nums}
.gb-open .gi{flex:none}

/* ══════════════════════════════════════════════════════════════════════════
   27. 모서리 둥글기를 확 줄임 · 소제목 키움                         2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시:
     "단락들의 소제목 폰트 사이즈 온브릭스 참고하여 크기 키워줘."
     "홈에서 전체적인 라운딩이 너무 들어가서 사이트가 유치해보이는데,
      마켓컬리의 제품 썸네일 라운딩 값을 보고 따라해줘."

   ★ 실측 — 마켓컬리 (kurly.com · 폰 390px · getComputedStyle)
       상품 썸네일(156×203)  border-radius **4px**  (overflow:hidden 인 감싼 칸에)
       [담기] 버튼                          **4px**
       「앱 열기」 버튼                      **6px**
       카드 안 쿠폰 알약                     **6px**
       중간 띠 배너(390×82)                  **0px**
     → 컬리는 통틀어 **4~6px** 한 벌입니다.
   ★ 우리는 12·14·16·18·20·22px 이 섞여 있었습니다. 상품 썸네일만 해도 **12px** —
     컬리의 3배입니다. "유치해 보인다" 는 말이 정확했습니다.

   ★ 새 눈금 (컬리에 맞춤)
       사진·썸네일      4px
       버튼·작은 상자    6px
       카드·패널        8px
       알약(칩·상태뱃지) 999px 그대로 — 컬리·온브릭스 둘 다 이건 알약입니다
       띠 배너          0px (화면 폭 꽉)
   ★ 동그라미(50%)와 알약(999px)은 건드리지 않습니다 — 그건 둥글기가 아니라 모양입니다. */

/* ① 사진·썸네일 — 4px */
.card .thumb, .gb-hero, .lp-stage, .lpg-th, .lg-th, .pcard .ph,
.review-item .th, .rk-item .thumb, .lo-stage{border-radius:4px}

/* ② 버튼·작은 상자 — 6px */
.btn, .btn.line, .btn.ghost, .gb-share, .card .restock, .card-act .restock,
.lp-alarm, .lp-share, .sh-btn, .shbtn{border-radius:6px}

/* ③ 카드·패널 — 8px */
.gb-card, .gb-card .gb-link, .lp-slide, .pcard, .rail-empty, .gb-empty,
.review-roll, .bpsheet{border-radius:8px}

/* ④ 단락 소제목 — 온브릭스 실측 그대로: **15px / 400 / #666 · 제목 아래 10px**
      (온브릭스 8개 단락을 전부 재봤는데 값이 하나도 안 흔들립니다.
       대제목도 재봤습니다 — 20px / 700 / 줄높이 24px. 우리와 **이미 같습니다.**)
      제목 아래 간격은 6px 이었습니다: .gazit-title 의 아래 여백 10 에서
      .sect-sub 가 -4 로 끌어올리고 있었습니다. 그 -4 를 없애 10px 로 맞춥니다. */
.sect-sub{font-size:15px; line-height:1.45; margin-top:0}

/* (공동구매 한 줄도 다른 단락과 같은 15px 입니다 — 위 #owf_groupbuy .gazit-banner p 참고) */

/* ══════════════════════════════════════════════════════════════════════════
   28. 특가 탭 위 작은 알림 배너 — 온브릭스 방식                     2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "특가는 온브릭스처럼 작은 배너 띄우기로 했고,
                랜딩 페이지는 오늘 특가 페이지로 이동. 특가 아이콘은 시계 모양."

   ★ 온브릭스 실측 (onbrix.co.kr · 폰 390px · getComputedStyle)
       알약 136.5 × 32 · border-radius **100px** · 배경 **rgba(0,0,0,.85)** · 글자 14px/400
       하단탭 **위 15px** · 다섯 칸 중 「특가」 칸 **가운데**
       내용 「22% 할인중」 + [닫기]

   ★ 자리 잡는 법 — 탭바가 5칸 균등(grid 5)이라 네 번째 칸의 한가운데는
     왼쪽에서 **70%** 지점입니다(각 칸 20% · 4번째 칸 = 60~80%). 그 점을 기준으로 가운데 정렬합니다.
     탭바가 max-width 700px 라 PC 에서도 탭바 안에서 같이 움직입니다. */
.tabbar{position:fixed}                     /* (이미 fixed 지만, 아래 기준점이 되므로 함께 적어 둡니다) */
.tabbar .tb-pop{position:absolute; bottom:calc(100% + 15px); left:70%; transform:translateX(-50%);
  /* ★ width:max-content 가 꼭 필요합니다 — 자리잡은(absolute) 요소는 기본이
     '남은 폭에 맞춰 줄이기' 라, left:70% 면 오른쪽 117px 안으로 눌려 글자가 두 줄이 됩니다. */
  width:max-content; max-width:calc(100vw - 24px);
  /* 오른쪽 아래 떠 있는 상담·쿠폰 버튼(z 44·45)보다 위에 둡니다 —
     안 그러면 알약 오른쪽 9px 과 [닫기] 가 그 동그라미에 가립니다(실측). */
  z-index:46;
  display:inline-flex; align-items:center; gap:8px; white-space:nowrap;
  height:32px; padding:0 6px 0 14px; border-radius:100px;
  background:rgba(0,0,0,.85); color:#fff; font-size:14px; font-weight:var(--gm-w-body)}
.tabbar .tb-pop.hide{display:none}
/* ★★ 이 <a> 는 `.tabbar a` 규칙(style.css:381)에도 걸립니다 —
     거기 `display:flex; flex-direction:column` 이 있어서 <b>86%</b> 와 「할인중」 이
     **세로로 쌓였습니다**(실측: 폭 27.2 · 높이 33.4 = 두 줄). 탭 글씨 규칙이라
     아이콘 위·글자 아래로 세우려고 둔 것인데, 알약 안의 글자까지 같이 걸린 것입니다.
     → 여기서 가로 한 줄로 되돌리고 글자 크기도 탭 글씨(10.5px)가 아닌 알약 크기로 돌려놓습니다. */
.tabbar .tb-pop a{color:#fff; text-decoration:none; flex:none; white-space:nowrap;
  display:block; text-align:left; font-size:14px; font-weight:var(--gm-w-body); gap:0}
.tabbar .tb-pop button{flex:none}
.tabbar .tb-pop b{font-weight:var(--gm-w-bold)}
.tabbar .tb-pop button{display:inline-flex; align-items:center; justify-content:center;
  width:24px; height:24px; border:0; border-radius:100px; background:none;
  color:rgba(255,255,255,.72); cursor:pointer; padding:0}
.tabbar .tb-pop button:active{color:#fff}
/* 말풍선 꼬리 — 어느 칸을 가리키는지 분명해집니다 */
.tabbar .tb-pop::after{content:''; position:absolute; top:100%; left:50%; transform:translateX(-50%);
  border:6px solid transparent; border-top-color:rgba(0,0,0,.85)}
/* 후기 알림 말풍선 (2026-09-28) — [마이] 는 맨 오른쪽 칸이라 가운데 정렬하면 화면 밖으로 나가고,
   그 위에는 노란 상담 버튼이 떠 있습니다. 상담 버튼 왼쪽에 붙이고(--rv-right), 꼬리는 [마이] 칸을
   가리킬 수 있을 때만(--rv-tail) — 두 거리는 common.js 가 재서 넣습니다. */
.tabbar .tb-pop.tb-pop-rv{left:auto; right:var(--rv-right, 72px); transform:none}
.tabbar .tb-pop.tb-pop-rv::after{left:auto; right:var(--rv-tail, 30px); transform:translateX(50%)}
.tabbar .tb-pop.tb-pop-rv.no-tail::after{display:none}
/* 특가 말풍선과 같이 뜨면 겹치지 않게 한 칸 위로 */
.tabbar .tb-pop:not(.hide) ~ .tb-pop.tb-pop-rv{bottom:calc(100% + 55px)}
/* 「▶ 방송으로 돌아가기」 알약(가운데, z 60)·관리자 하단 알약(#gkPopBar)이 떠 있으면 후기 말풍선을 숨깁니다 —
   탭바(z 40) 안의 말풍선은 그 위로 못 올라와 가려졌습니다(안드로이드 실측, 검토 2026-09-28).
   [마이] 숫자 뱃지는 탭 안이라 그대로 남아 알림 몫을 합니다. 알약을 ✕ 로 닫으면(요소가 빠짐) 다시 보입니다. */
body:has(#liveBackPill) .tabbar .tb-pop-rv, body:has(#gkPopBar) .tabbar .tb-pop-rv{display:none}
/* 말풍선에서 마이페이지로 왔을 때 «후기 작성» 제목이 위 머리줄에 가리지 않게 */
#rvWrite{scroll-margin-top:72px}

/* ══════════════════════════════════════════════════════════════════════════
   29. 상단 탭 — 알약을 걷고 밑줄 한 줄로                           2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "상단 live/오늘특가/예약상품/공동구매/전체상품 탭도 라운딩 된 박스로
                되어 있으니 너무 요소가 많은 느낌이야. 저걸 5개 여백과 간격을 일정하게
                맞추고, 라운딩 박스를 없애고, 색이 칠해지는 대신 하단에 선으로 표시를
                해주는등 심플한 표현으로 바꿔줘."

   ★ 온브릭스 실측 (onbrix.co.kr · 폰 390px · getComputedStyle · 2026-09-15)
       탭줄 높이 51.6 · 칩 하나 **65px 고정폭 · 간격 0 · 첫 칩 left:0**(화면 끝까지)
       글자 16px — 비활성 400 / **활성 700** (색은 둘 다 같은 먹색)
       활성 표시 = **밑줄 바 65×3px**, 칩 아래에 붙어 좌우로 미끄러짐
       칩 안쪽 여백 16px 0 · 테두리·배경·라운딩 **없음**

   ★ 우리는 칸 수가 바뀝니다 — [LIVE] 는 방송도 예고도 없으면 사라져 4칸이 됩니다.
     그래서 65px 고정이 아니라 **flex:1 균등분배**로 둡니다. 4칸이든 5칸이든
     여백과 간격이 저절로 같아집니다(사장님 "5개 여백과 간격을 일정하게").

   ★ 활성색은 **브랜드 포인트색**입니다(먹색 아님).
     ① 하단탭도 활성이 같은 포인트색이라 위아래가 같은 말을 합니다.
     ② 전에 '로고 아래 검정'이 이상하다는 지적이 있었습니다(style.css:106) —
        밑줄은 알약보다 훨씬 얇지만 같은 이야기를 또 만들지 않는 쪽으로 둡니다.
     온브릭스처럼 먹색으로 하시려면 아래 두 줄의 색만 바꾸면 됩니다. */
.gazit-tabs-wrap{padding:0}
.gazit-tabs{gap:0; padding:0; overflow-x:auto}
.gazit-tabs a{flex:1 1 0; min-width:0; text-align:center; justify-content:center;
  padding:15px 4px; border:0; border-radius:0; background:none; box-shadow:none;
  font-size:13.5px; font-weight:var(--gm-w-mid); color:var(--gi-mute);
  position:relative; scroll-margin-inline:0}
.gazit-tabs a.is-active{background:none; border:0; box-shadow:none;
  color:var(--gi-point); font-weight:var(--gm-w-bold)}
/* 밑줄 — 띠의 아래 테두리 위에 겹쳐 그립니다 */
.gazit-tabs a.is-active::after{content:''; position:absolute; left:0; right:0; bottom:-1px;
  height:2.5px; background:var(--gi-point)}
@media (max-width:400px){ .gazit-tabs a{padding:15px 2px; font-size:13px} }
/* [LIVE] 칩은 알약이 아니어도 점과 글자가 한 줄이어야 합니다 */
.gazit-tabs a.gt-live{display:flex; align-items:center; justify-content:center; gap:5px}

/* ══════════════════════════════════════════════════════════════════════════
   30. 머리줄 로고 — 올린 그림 + 원래 기멱기멱 로고 나란히            2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "로고 이미지 옆에 기존의 기멱기멱 로고 똑같이 다시 넣어주고."

   ★ 왜 사라졌었나 — 관리자가 올린 그림이 로고를 **통째로 대신**하고 있었습니다.
     지금 운영에 올라간 그림은 글자가 없는 **원형 인물 사진**(512×512)이라,
     머리줄에 가게 이름이 한 글자도 안 보이는 상태였습니다.

   ★ 말풍선을 뺀 **글자만** 쓰므로(common.js 의 wordmarkOnly) 가로가 훨씬 짧습니다.
     잘라낸 창의 비율이 84 : 54 라, 높이를 정하면 폭은 그 비율로 따라옵니다.
       높이 42 → 폭 65
   ★★ 2026-09-15 — 비율이 112:54 → **84:54** 로 바뀌었습니다(폭 87 → 65).
     아래 작은 글자가 GIMEOK 으로 바뀌면서 오른쪽 빈 칸 31 을 걷어냈기 때문입니다
     (common.js 의 wordmarkOnly 주석 참고). **글자 크기는 그대로입니다** —
     폭만 줄이고 높이를 그대로 두면 잘라낸 비율이 맞아떨어져 글꼴이 안 변합니다.
     여기 폭을 87 로 두면 글자가 1.34배 커져 머리줄을 밀어냅니다.
   ★ 자리 계산 (폰 390px)
       그림 36 + 사이 8 + 글자로고 65 = 109
       + 오른쪽 아이콘 4개(42×4 = 168) + 좌우 여백 32 = 309  →  390 안에 넉넉합니다.
   ★★ 높이를 **반드시 적어야 합니다.** height:auto 로 두면 잘라낸 비율대로
     63.6px 까지 늘어나 머리줄이 68 → 85.5px 로 부풀었습니다(실측). */
.logo .logo-img{width:36px; height:36px; border-radius:50%; object-fit:cover; flex:none}
/* 그림 **바로 뒤에 오는** 로고만 — 그림이 없으면 이 규칙이 안 걸려 예전 로고 그대로입니다 */
.logo .logo-img + svg{width:65px; height:42px; flex:none}
.head-row .logo{gap:8px}
@media (max-width:360px){
  /* 아주 좁은 폰 — 조금씩 줄입니다 (비율 84:54 유지) */
  .logo .logo-img{width:32px; height:32px}
  .logo .logo-img + svg{width:59px; height:38px}
}

/* ══════════════════════════════════════════════════════════════════════════
   31. 예고 상품 = 방송 중 목록과 같은 모양                          2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "pc에서는 라이브 방송중일때 보여지는 레이아웃 그대로,
                방송예고에도 레이아웃 똑같이 적용해줘.
                대신 지금 판매중인 상품 → 방송에서 판매 예정인 상품."

   전에는 예고만 가로로 나눈 작은 썸네일이라 **상품명이 아예 없고 값만** 보였습니다.
   방송 중 목록은 썸네일 + 상품명 + 할인율·값을 한 줄에 보여 줍니다 —
   예고에서도 무엇을 파는지 알아야 알림을 신청합니다.

   ★ 마크업을 방송 중과 **같은 클래스**(.live-goods / .lg-*)로 바꿨습니다(index.html).
     그래서 모양 규칙을 여기서 새로 쓸 필요가 없습니다 — 아래는 예고 패널 안에 들어갈 때의
     여백만 맞추는 것입니다.
   ★ 옛 가로 썸네일 규칙(.lp-goods-list · .lpg · .lp-goods-h)은 남겨 둡니다 —
     되돌릴 때 쓰고, 지금은 그 마크업이 안 그려지므로 화면에 아무 영향이 없습니다. */
.live-pre .lp-goods.live-goods{margin-top:12px; padding-left:0; padding-right:0}
/* 예고 패널 안에서는 목록을 접지 않고 다 보여 줍니다 (방송 중과 달리 개수가 적습니다) */
.live-pre .lp-goods.live-goods .lg-list{max-height:none; overflow:visible; border-top:0}

/* ══════════════════════════════════════════════════════════════════════════
   32. 상품 목록 머리글 — 폰은 빼고, PC 만 살립니다                  2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "모바일에서는 빼고 pc에서는 살려. pc에서는 방송이 켜지면 문구가
                바뀌는거잖아."

   ★ 한 덩이를 두 가지로 말하는 자리입니다 — 방송이 켜지면 「지금 판매중인 상품」,
     꺼져 있으면 「방송에서 판매 예정인 상품」. 글자는 JS 가 상태에 따라 고르고
     (index.html 두 곳), 보이고 안 보이고는 **폭으로만** 정합니다.

   ★ 왜 폰에서는 빼는가 — 바로 위가 방송 카드고 바로 아래가 상품 줄이라
     폰의 좁은 화면에서는 보면 압니다. 첫 화면에서 상품이 한 줄이라도 더 보이는
     쪽이 낫습니다(2026-09-15 오전 지시 "판매할 상품 4개는 글자 삭제" 와 같은 뜻).
   ★ 왜 PC 에서는 살리는가 — PC 는 세로가 남고 칸이 가운데 430px 로 좁아서,
     머리글이 없으면 상품 줄이 어디에 속한 목록인지가 흐려집니다.

   ★★ 요소는 지웁니다가 아니라 **숨깁니다** — 방송 중 개수(N개)를 JS 가
     #lgCount 에 써넣고 있어서, 마크업을 지우면 그 코드도 같이 고쳐야 합니다.
     되살릴 때도 이 한 줄만 지우면 됩니다. */
@media (max-width:759px){
  .live-goods .lg-h{display:none}
}

/* ══════════════════════════════════════════════════════════════════════════
   33. 떠 있는 버튼을 **본문 칸 안쪽**에 붙입니다                   2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지적: "카카오랑 선물박스 창이 화면 밖으로 나가있잖아.. 온브릭스 봐봐."

   ★ 무엇이 잘못돼 있었나 (실측, 화면 1400px)
       본문 칸(.wrap)   350 ~ 1050   ← 가운데 700px
       카카오·선물박스  1340 ~ 1388  ← right:12px 이 **화면** 기준이라 오른쪽 끝에
     본문은 가운데 700px 인데 버튼만 화면 맨 끝에 붙어, PC 에서 회색 여백 위에
     동동 떠 있었습니다. 폰에서는 본문이 화면을 꽉 채우니 안 보이던 문제입니다.
     하단 탭바는 이미 `max-width:var(--wrap); margin:0 auto` 라 제대로 있었고,
     특가 알약도 탭바 안에 들어 있어 괜찮았습니다. **이 두 버튼만** 밖에 있었습니다.

   ★ 온브릭스는 어떻게 하나 (실측, 화면 1400px)
       본문 칸(.m-wrap)      440 ~ 960   ← 가운데 520px
       맨위로 버튼(.top-move) 894 ~ 940  ← 본문 오른쪽 끝에서 **20px 안쪽**
     `left: calc(50% + …)` 으로 **가운데 기준**으로 잡아 둡니다. 우리도 같은 방식입니다.

   ★ 왜 미디어쿼리가 아니라 max() 인가
     본문 폭이 440(폰) / 700(760px 이상) 두 가지인데, 그 사이 폭(예: 660px)에서는
     화면이 본문보다 넓어 **똑같은 문제가 생깁니다.** 지금 보고 계신 미리보기 칸이
     바로 그 660px 입니다. 계산식 하나로 모든 폭을 덮습니다.
       화면 390 → max(12, -13) = 12px   (폰은 지금과 똑같습니다)
       화면 660 → max(12,  122) = 122px (본문 110~550 의 오른쪽 끝 −12)
       화면 1400 → max(12, 362) = 362px (본문 350~1050 의 오른쪽 끝 −12)

   ★★ 되돌리는 법 — 이 파일(mall-ui.css) 을 빼면 --gm-fab-right 가 없어지고,
     버튼은 `var(--gm-fab-right, 12px)` 의 **12px** 로 돌아갑니다. 즉 예전 그대로입니다.
     그래서 버튼 쪽에는 값을 박지 않고 반드시 폴백을 함께 적어 둡니다. */
:root{ --gm-fab-right: max(12px, calc(50% - var(--wrap, 440px) / 2 + 12px)); }

/* ══════════════════════════════════════════════════════════════════════════
   34. PC 라이브 창 — 왼쪽 영상 / 오른쪽 상품 (2단)                 2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지적: "pc는 내가 방송에서 판매 예정 상품을 방송 미리보기 옆 오른쪽으로
                빼달라고 했잖아. 네가 2번으로 레이아웃 짜둔거."

   ★ 제가 뭘 잘못했나 (솔직히 적어 둡니다)
     원래 2단이 맞았는데 **겹침 버그**가 있었습니다 — 칸은 300px 로 잡아 두고
     그 안의 영상은 392px 이라 오른쪽 목록을 68px 침범했습니다(실측 156+392=548 vs 480).
     저는 이걸 "2단이 안 맞는다" 로 읽고 한 칸으로 펴 버렸습니다. 겹침만 고치면 될 일이었습니다.

   ★ 겹침의 진짜 원인 — style.css:684 가 PC 에서 사진 높이를 min(560px,58vh) 로 묶는데
     `aspect-ratio:3/4` 가 살아 있어 **폭이 높이를 따라 제멋대로 커집니다.**
     그래서 칸이 300px 여도 사진은 392px 로 삐져나왔습니다.
     → 고치는 법은 하나뿐입니다: 폭을 칸에 맞추고(width:100%) 높이는 비율이 정하게
       두고(height:auto) **높이 상한을 풀어 줍니다(max-height:none).**
       셋 중 하나라도 빠지면 겹침이 그대로 돌아옵니다.

   ★★ 비율은 **2 : 1** 입니다 (사장님 지시 2026-09-15:
     "레이아웃을 1:1 반반으로 나누면 방송 창이 작아지니까 2:1 정도의 비율로 해.
      상품명이 잘려도 괜찮아... 잘린 상품명은 ...으로 축약하면 되니까")
     처음에 300/334(거의 반반)로 했다가 사장님 지시로 2:1 로 바꿨습니다.

   ★ 자리 계산 (화면 1400px · 본문 700px 기준 · 실측)
       .lp-track  700, 좌우 여백 16씩  →  안쪽 668
       .lp-slide  668, 좌우 여백 10씩  →  안쪽 648
       (648 − 사이 14) 를 2:1 로  →  영상 422.7  +  목록 211.3
       영상 높이 = 422.7 × 4/3 = **563.6px** (3:4)

   ★★ `2fr 1fr` 만 쓰면 **안 먹습니다** — fr 은 minmax(auto,2fr) 이라 칸이
     자기 **최소 폭(min-content)** 밑으로는 안 줄어듭니다. 상품명이
     `white-space:nowrap` 이라 오른쪽 칸의 최소 폭이 **상품명 전체 길이**(실측 336px)로
     잡혀 2:1 이 아니라 0.93:1 이 됐습니다(제가 실제로 한 번 냈습니다).
     → `minmax(0, 2fr) minmax(0, 1fr)` 로 바닥을 0 으로 내려야 비율대로 나뉩니다.

   ★★ 오른쪽 칸 높이를 px 로 박지 않고 `aspect-ratio:3/8` 로 둡니다.
     목록 폭은 늘 영상 폭의 **절반**이므로(2:1), 영상과 같은 높이가 되려면
       목록높이 = 목록폭 × 2 × 4/3 = 목록폭 × 8/3   →   가로:세로 = 3:8
     이 값은 **사이 여백과 무관**하고 화면 폭이 바뀌어도 그대로 맞습니다.
     px 로 박아 두면 본문 폭이 달라지는 순간 두 단의 끝줄이 어긋납니다.

   ★ 상품명이 잘리는 것은 **의도한 것**입니다 — `.lg-nm` 이 이미
     `white-space:nowrap; overflow:hidden; text-overflow:ellipsis` 라 `…` 으로 줄입니다.
     값 줄(.lg-pr)만 칸이 좁아 한 줄에 안 들어가므로 PC 에서 줄바꿈을 허용합니다.

   ★★ 이 규칙들은 **§31 보다 뒤에 있어야 합니다.** §31 이 목록을
     `max-height:none; overflow:visible` 로 풀어 두는데(폰에서는 그게 맞습니다),
     미디어쿼리는 우선순위를 올려 주지 않아 **파일에서 뒤에 오는 쪽이 이깁니다.**
     앞으로 옮기면 PC 목록이 400px 를 넘어 페이지가 늘어집니다. */
/* ★★ display 를 정하는 규칙에는 **반드시 :not([hidden]) 을 붙입니다.**
     방송이 꺼져 있을 때 방송중 칸은 hidden 으로 숨는데, 여기서 그냥 display:flex 라고
     쓰면 `.live-goods[hidden]{display:none}` 과 우선순위가 같아 **뒤에 있는 이 파일이 이겨**
     꺼진 방송 칸이 빈 400px 로 떠 버립니다(제가 실제로 한 번 냈습니다). */
@media (min-width:760px){
  /* ── 예고 ── */
  .live-pre .lp-slide:not([hidden]){
    width:100%; max-width:none; margin-left:0; margin-right:0;
    display:grid; grid-template-columns:minmax(0,2fr) minmax(0,1fr); gap:14px; align-items:start;
  }
  /* 사진 밖 제목·설명은 폰과 같이 계속 숨깁니다(사진 안에 얹힌 것을 씁니다) —
     display:none 이라 칸을 차지하지 않으므로 2단이 어긋나지 않습니다. */
  .live-pre .lp-slide .lp-stage{
    width:100%; height:auto; aspect-ratio:3/4; max-height:none;
    margin-left:0; margin-right:0;
  }
  .live-pre .lp-goods.live-goods:not([hidden]){
    margin-top:0; height:auto; aspect-ratio:3/8;
    display:flex; flex-direction:column; min-height:0;
  }
  .live-pre .lp-goods.live-goods .lg-list{
    flex:1 1 auto; min-height:0; max-height:none;
    overflow-y:auto; overflow-x:hidden; border-top:0;
  }

  /* ── 방송 중 ── 같은 짜임입니다. 손님이 보기에 예고와 방송이 같은 자리여야 합니다. */
  .live-wrap:not([hidden]){
    width:100%; max-width:none; margin-left:0; margin-right:0;
    display:grid; grid-template-columns:minmax(0,2fr) minmax(0,1fr); gap:14px; align-items:start;
  }
  .live-wrap > .live-on{margin-left:0; margin-right:0}
  .live-wrap > .live-on .lo-stage{
    width:100%; height:auto; aspect-ratio:3/4; max-height:none;
    margin-left:0; margin-right:0;
  }
  .live-wrap > .live-goods:not([hidden]){
    margin-top:0; height:auto; aspect-ratio:3/8;
    display:flex; flex-direction:column; min-height:0;
  }
  .live-wrap > .live-goods .lg-list{
    flex:1 1 auto; min-height:0; max-height:none;
    overflow-y:auto; overflow-x:hidden;
  }

  /* ── 좁아진 오른쪽 칸에서 글자 다루기 ──
     상품명은 한 줄 `…` (이미 그렇게 돼 있습니다). 값 줄만 한 줄에 안 들어가므로
     줄바꿈을 허용합니다 — 안 그러면 정가(취소선)가 칸 밖으로 잘려 나갑니다. */
  .live-pre .lp-goods.live-goods .lg-pr,
  .live-wrap > .live-goods .lg-pr{flex-wrap:wrap; row-gap:2px}
}

/* ══════════════════════════════════════════════════════════════════════════
   35. 폰 — 라이브 상품 목록을 한 화면 안에 가둡니다                2026-09-15
   ══════════════════════════════════════════════════════════════════════════
   사장님 지적: "모바일에서 보면 live에서 상품 리스트가 너~~무 길다 ㅋㅋ....
                스크롤기준으로 한 화면에서 너무 안 길어지게 바꾸고 넘기기나 스크롤 해줘"

   ★ 실측 (아이폰 390 × 844)
       손님에게 실제로 보이는 칸   844 − 머리줄 68 − 탭줄 50 − 하단탭 56 = **670**
       라이브 칸 전체                                                 = **811**  ← 141 넘침
         (위 여백 10 + 사진 451 + 사이 12 + 목록 324 + 아래 여백 14)
     상품이 **4개인데도** 넘칩니다. 구좌 한도가 20개라 다 채우면 목록만
     20 × 81 = 1,620px — 손님은 상품 목록만 여덟 번을 밀어야 다음 단락에 닿습니다.

   ★ 무엇을 줄일 수 있나
     사진(451)은 못 줄입니다 — 3:4 는 2026-08 에 "폰 카메라 기본" 으로 정한 값이고,
     여기를 건드리면 **이미 올려둔 예고 사진이 잘립니다.** 게다가 예고는 제목·설명·
     버튼이 사진 **안에** 얹혀 있어서, 사진을 깎으면 글자부터 잘립니다.
     → 그래서 **목록만** 잘라내고 그 안에서 스크롤하게 합니다.

   ★ 왜 186px 인가 (= 두 줄 + 24)
       670 − 위여백 10 − 사진 451 − 사이 12 − 아래여백 14 = **183**
     여기에 딱 맞추면 세 번째 줄이 **완전히** 잘려 "더 있다" 는 게 안 보입니다.
     한 줄이 81px 이므로 81 × 2 + 24 = 186 — 세 번째 줄이 **24px 만 보이게** 두면
     손님이 밀어야 한다는 걸 압니다(잘린 줄이 보이는 것이 가장 흔한 신호입니다).
     전체 673px 로 한 화면(670)과 사실상 같습니다.

   ★★ 상품이 4개든 20개든 **늘 186px** 입니다 — 길이가 상품 수를 따라가지 않습니다.
     이게 이 절의 요점입니다. 자르기만 하고 스크롤을 안 주면 상품이 사라지므로
     반드시 overflow-y:auto 를 같이 줍니다.

   ※ PC 는 §34 가 2단으로 따로 잡습니다(사진 옆이라 길이 문제가 없습니다). */
@media (max-width:759px){
  .live-pre .lp-goods.live-goods .lg-list,
  .live-wrap > .live-goods .lg-list{
    max-height:186px; overflow-y:auto; -webkit-overflow-scrolling:touch;
  }
  /* 스크롤 막대를 숨기는 대신 **아래쪽을 살짝 흐리게** — 잘린 줄과 함께
     "여기 아래로 더 있다" 를 말해 줍니다. 목록이 짧으면 흐림도 안 보입니다. */
  .live-pre .lp-goods.live-goods,
  .live-wrap > .live-goods{position:relative}
  .live-pre .lp-goods.live-goods::after,
  .live-wrap > .live-goods::after{
    content:''; position:absolute; left:0; right:0; bottom:0; height:22px;
    background:linear-gradient(to bottom, rgba(255,255,255,0), var(--gi-bg,#fff));
    pointer-events:none;
  }
}

/* ══════════════════════════════════════════════════════════════════════════
   36. 상품상세 — 구매 버튼을 하단에 고정                           2026-09-16
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "크기만 온브릭스로 바꾸는데, 온브릭스처럼 구매버튼이 하단에 고정되어
                있게 변경. 제품 상세페이지를 스크롤 해도 바로 구매 버튼을 누를 수 있게"

   ★★ 정정 (2026-09-16) — 처음에 여기 "온브릭스에는 고정 구매바가 없습니다" 라고
     적었는데 **틀렸습니다.** 온브릭스에도 있습니다:
       .buy-process { position:fixed; bottom:0; z-index:3000 }
       그 안에 [찜하기 56] [선물하기 274] [구매하기 273] · 높이 56 (실측)
     **내려야 나타나는** 방식이라, 맨 위에서 재던 제 첫 측정이 놓쳤습니다.
     (같은 이유로 "탭줄도 없다" 고 했는데 그것도 틀렸습니다 —
      온브릭스 탭줄은 상품설명 / 상세정보 / 후기 999+ / 문의 101 입니다.)
     → 사장님 지시가 온브릭스와 **정확히 같았습니다.**
     ※ 우리는 늘 보이게 둡니다. 온브릭스처럼 내렸을 때만 띄우려면 스크롤을 지켜보는
       코드가 필요한데, 늘 보이는 쪽이 손님에게 손해가 없고 코드도 단순합니다.

   ★ 크기는 온브릭스에 맞춥니다 (실측 390px)
       버튼 높이 **56** · 라운드 **8** · 좌우 여백 **20** · 버튼 사이 **8**
     (우리는 52 / 6 이었습니다. 개수는 지금처럼 둘 — 온브릭스의 [찜하기]·[선물하기]는
      우리에 아직 기능이 없어서, 버튼만 만들면 눌러도 안 되는 버튼이 됩니다.)

   ★ 자리 — **하단 탭바 바로 위**
     탭바 높이를 박지 않고 --gm-tabbar-h 로 재서 씁니다(common.js 가 넣습니다).
     박아 두면 탭바 글자 크기나 아이폰 안전영역이 달라지는 순간 겹치거나 뜹니다.
   ★ PC 에서는 본문 칸(--wrap) 안에 가둡니다 — §33 에서 카카오 버튼이 회색 여백
     위에 떠 있던 것과 **똑같은 실수**를 여기서 되풀이하지 않기 위해서입니다.

   ★★ 여기 선택자를 `.wrap .actions > .row-btns` 로 쓴 이유 —
     product.html 은 **자기 <style> 을 mall-ui.css 보다 뒤에** 답니다(7~10줄).
     그 안에 `.actions .row-btns{margin-top:9px}` 가 있어서, 우리가 같은 무게로 쓰면
     순서에서 밀려 조용히 안 먹습니다. 한 단 올려서 이깁니다(!important 안 씁니다).

   ※ 페이지 맨 아래가 이 바에 가리지 않도록 푸터 여백을 늘리는 일은
     product.html 쪽에 적어 뒀습니다(그 화면에만 필요한 값이라서). */
.wrap .actions > .row-btns{
  position:fixed; left:0; right:0;
  bottom:var(--gm-tabbar-h, 56px);
  z-index:38;                       /* 탭바(40)·시트(60)·가림막(59) 보다 아래 */
  max-width:var(--wrap); margin:0 auto;
  display:flex; gap:8px;
  padding:10px 20px calc(10px + env(safe-area-inset-bottom) * 0);
  background:#fff; border-top:1px solid var(--gi-line);
}
.wrap .actions > .row-btns > .btn{
  height:56px; border-radius:8px; flex:1; margin-top:0;
}
/* ★★ 화면 아래에 **떠 있는 것들**(특가 알약·카카오 버튼)이 이 바를 덮습니다.
     실제로 덮었습니다 — 노란 카카오 버튼이 [바로 주문하기] 글자 위에 앉았습니다.
     그래서 "아래에 고정바가 얼마나 있는지" 를 값 하나로 알려 주고, 떠 있는 것들은
     늘 그만큼 더 올라갑니다. **기본값은 0** 이라 다른 화면은 지금 그대로입니다.
     상품상세만 product.html 에서 77px 로 덮어씁니다(그 화면에만 바가 있으므로). */
:root{ --gm-buybar-h: 0px; }
/* 특가 알약은 탭바 **안에** absolute 로 떠 있습니다(㉘). 탭바를 기준으로 15px 위인데,
   그 사이에 구매바가 들어오면 알약이 [바로 주문하기] 글자를 덮습니다(실제로 덮었습니다).
   ★ 이름이 .gm-pop 이 아니라 **.tb-pop** 입니다 — 제가 처음에 .gm-pop 으로 찾다가
     "없음" 이 나와 한 번 헛짚었습니다. 여기 적어 둡니다. */
.tabbar .tb-pop{ bottom:calc(100% + 15px + var(--gm-buybar-h, 0px)) }
/* 알림 쪽지(토스트)도 같은 이유로 올립니다 — style.css 는 bottom:96px 인데
   상품상세는 아래를 탭바 56 + 구매바 77 = 133 이 가립니다. 그대로 두면
   「옵션을 먼저 선택해 주세요!」가 방금 누른 [바로 주문하기] 글자 위에 앉습니다. */
.toast{ bottom:calc(96px + var(--gm-buybar-h, 0px)) }
/* 화면 오른쪽 아래에 뜨는 다른 알약(있다면)도 같은 만큼 */
.gm-pop{ bottom:calc(72px + env(safe-area-inset-bottom) + var(--gm-buybar-h, 0px)) }

/* ══════════════════════════════════════════════════════════════════════════
   37. 후기 판 — 이 판에만 남아 있던 옛 색과 큰 모서리                2026-09-16
   ══════════════════════════════════════════════════════════════════════════
   사장님 지시: "후기 판 정리하자"

   ★ 무엇이 남아 있었나 (style.css 545~565 · 실측)
       .rvsum   라운드 **16** · 바탕 --soft
       .rvcta   라운드 **16** · 바탕 살구색(--band) · 테두리 살구(--band-line)
                글자 **#8a7a75**(갈색) — 우리 어디에도 안 쓰는 색입니다
       막대 색  **#ff5a1f** — 우리 토큰이 아닌 한 번 쓰고 만 주황
     ㉗ 에서 몰 전체 모서리를 컬리 기준(사진 4 / 버튼 6 / 카드 8)으로 줄였는데
     이 판만 16 으로 남아, 아래로 내려오다 후기에서 **화면 톤이 한 번 끊깁니다.**

   ★ 어떻게 바꾸나 — 새 색을 만들지 않습니다. 이미 있는 토큰으로만 맞춥니다.
       모서리 16 → **8** (카드 규칙)
       .rvcta 살구 바탕·테두리 → 흰 바탕 + --gi-line 점선 (유도 상자라는 뜻은 점선이 냅니다)
       갈색 글자 → --gi-ink-2 (다른 안내 글과 같은 색)
       막대 #ff5a1f → --gi-point (몰의 강조색 하나로)

   ※ .rvcta 안의 <b>(적립 금액)는 --hot 그대로 둡니다 — 돈은 눈에 띄어야 합니다. */
.rvsum{border-radius:var(--gm-r-s)}
.rvcta{border-radius:var(--gm-r-s); background:#fff; border-color:var(--gi-line);
  color:var(--gi-ink-2)}
.rvsum .barrow .bg span{background:var(--gi-point)}
/* 막대가 없는 날(후기 5건 미만)에는 칸을 옆으로 벌리지 않습니다 */
.rvsum.nobars{display:block}
/* 유도 상자의 곁다리 한 마디 — 제목과 같은 줄에 작고 옅게 (「구매하신 분만 쓸 수 있어요」) */
.rvcta .sub{font-weight:var(--gm-w-body); font-size:12px; color:var(--gi-mute)}

/* 옵션 고르기 시트 안의 줄 — 손가락으로 누르는 자리라 크게 (44px 이상) */
.optsheet{display:flex; flex-direction:column; gap:8px}
.optsheet .osrow{display:flex; align-items:center; justify-content:space-between; gap:10px;
  width:100%; min-height:52px; padding:0 14px; background:#fff; cursor:pointer;
  border:1px solid var(--gi-line); border-radius:var(--gm-r-s);
  font-size:14px; font-weight:var(--gm-w-mid); color:var(--gi-ink); text-align:left}
.optsheet .osrow:active{background:var(--gi-soft)}
.optsheet .osrow[disabled]{opacity:.45; cursor:default}
.optsheet .osrow i{font-style:normal; font-size:12px; color:var(--gi-mute); flex:none}

/* 머리줄 뒤로가기 — 로고 **왼쪽**에, 다른 머리줄 단추와 같은 크기로 */
.head-row .hback{margin-right:2px; margin-left:-6px}

/* 옵션 시트 — 고른 것과 총액 (온브릭스처럼 시트 안에서 확인하고 넘어갑니다) */
.ospicked{margin-top:12px; border-top:1px solid var(--gi-line); padding-top:10px}
.ospicked .opline{display:flex; align-items:center; gap:8px; padding:8px 0;
  border-bottom:1px solid var(--gi-line-2)}
.ospicked .opline .n{flex:1; min-width:0; font-size:13.5px; font-weight:var(--gm-w-mid);
  color:var(--gi-ink); overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.ospicked .qtybox{display:inline-flex; align-items:center; border:1px solid var(--gi-line);
  border-radius:var(--gm-r-s); overflow:hidden; flex:none}
.ospicked .qtybox button{width:30px; height:30px; border:0; background:#fff;
  font-size:15px; color:var(--gi-ink); cursor:pointer}
.ospicked .qtybox b{min-width:26px; text-align:center; font-size:13px; font-weight:var(--gm-w-bold)}
.ospicked .opline .amt{font-size:13.5px; font-weight:var(--gm-w-bold); flex:none;
  font-variant-numeric:tabular-nums}
.ospicked .opline .del{border:0; background:none; color:var(--gi-mute); font-size:13px;
  cursor:pointer; padding:0 2px; flex:none}
.ostotal{display:flex; align-items:baseline; justify-content:space-between; margin-top:12px}
.ostotal span{font-size:13.5px; font-weight:var(--gm-w-mid); color:var(--gi-ink-2)}
.ostotal b{font-size:20px; font-weight:var(--gm-w-bold); font-variant-numeric:tabular-nums}
.osgo{width:100%; height:52px; border-radius:var(--gm-r-s); margin-top:12px}
.oshint{margin-top:14px; text-align:center; font-size:12.5px; color:var(--gi-mute)}
/* 시트 안 「고른 옵션」 머리말 — 아래 줄이 장바구니 줄처럼 생겨서 이미 담긴 것으로
   읽힙니다(수량 ± · 금액 · ✕). 아직 담기 전이라는 것을 한 번 말해 줍니다. */
/* 1인당 구매 제한 안내 (직원분 지시 2026-10-01) — 수량 고르기 바로 앞 한 줄.
   제한을 켠 상품에만 그려집니다. 시트 안 다른 안내(.oslabel)와 같은 크기로 둡니다. */
.oslimit{margin:-2px 0 10px; font-size:12.5px; font-weight:var(--gm-w-mid); color:var(--gi-ink-2);
  background:var(--gi-soft); border-radius:8px; padding:7px 10px}
.oslabel{margin-top:14px; font-size:12.5px; font-weight:var(--gm-w-mid); color:var(--gi-ink-2)}
.oslabel span{margin-left:6px; font-weight:var(--gm-w-body); color:var(--gi-mute)}
.ospicked{margin-top:6px}

/* ④ 바닥에서 튕기는 스크롤 막기 (아이폰 실기기 제보 2026-09-16 —
   "최 하단까지 스크롤하니까 하단 고정 탭이 움직여서 하단에 빈여백이 생겨")
   아이폰은 문서 끝을 지나 당기면 화면 전체가 딸려 올라옵니다(rubber-band).
   그때 position:fixed 인 탭바·구매바가 **같이 움직여** 아래에 바탕색이 드러납니다.
   ★ 맥에서는 이 튕김이 없어서 재현이 안 됩니다 — 실측으로는 여백 0 이 나옵니다.
   ★ 세로 튕김만 막습니다. 가로 스와이프(예고·상품 레일)는 그대로 둡니다. */
/* (2026-09-16 삭제) `html, body{ overscroll-behavior-y:none }` — 바닥 튕김을 막으려던 첫 시도. 효과가 없었고(아래 설명),
   오히려 iOS 16+ WebKit 이 이 속성을 지키면서 **위쪽 튕김까지 막아 앱의 '당겨서 새로고침' 이 안 켜졌습니다**
   (사장님 제보 "메인화면에서 새로고침 안됨"). 바닥 문제는 ③(캔버스 흰색)과 앱 .never 로 잡았으므로 이 줄은 뺍니다. */
/* ★★ 여기까지 두 번 시도했고 **둘 다 안 잡혔습니다.** 세 번째에 원인을 찾았습니다.
     ① overscroll-behavior-y:none  → 그대로 (사장님 재보고 "그대로임")
     ② 탭바·구매바 밑에 흰색 200px 을 깔아 가리기 → 그대로 (사장님 재보고 "여전히 보여")

   ② 가 왜 안 먹었는가 —
     아이폰이 문서 끝에서 튕길 때, **문서 레이어는 화면 안쪽으로 잘립니다.**
     튕겨서 드러난 자리는 문서 바깥이라 거기에 그려지는 것은 우리가 넣은
     흰 덮개가 아니라 **브라우저가 칠하는 '캔버스' 색**입니다.
     그러니 바 안쪽에 무엇을 넣어도 그 자리는 못 덮습니다 — 문서 밖이니까요.

   그 캔버스 색이 무엇인가 —
     html 에 배경이 없으면 **body 의 배경이 캔버스로 올라갑니다** (CSS 규칙).
     style.css:25 가 `body{background:#f5f5f7}` 이라, 튕긴 자리에 드러나던
     회색 띠의 정체가 바로 이 #f5f5f7 이었습니다.

   → 캔버스를 **바와 같은 흰색**으로 칠합니다. 그러면 바가 얼마를 올라가든
     그 아래는 바와 같은 색이라 '빈 곳' 이 눈에 띄지 않습니다.
   ★ html 에 배경을 주면 body 배경은 더 이상 캔버스로 안 올라갑니다. 그래도
     body 상자 자체는 화면을 꽉 채우므로(.wrap 이 min-height:100dvh) PC 의
     좌우 회색(style.css:701 #eef0f3)은 그대로입니다 — 실측으로 확인했습니다.
   ★ 정직하게 적어 둡니다: 이것은 **바를 붙잡아 두지 못합니다.** 색을 맞춰
     티가 안 나게 할 뿐입니다. 바 자체를 못 움직이게 하려면 문서 대신
     .wrap 이 스크롤하게 바꿔야 하는데, 그건 앱의 '당겨서 새로고침'
     (gimeok-app/Sources/WebView.swift:64)과 정면으로 부딪칩니다.
     사장님이 '바가 들썩인다' 를 따로 지적하시면 그때 그 큰 공사를 합니다. */
html{ background:#fff }
.wrap .actions > .row-btns{position:fixed}

/* 쿠폰 목록 시트 — 혜택 / 이름·조건 / 상태 세 칸 */
.cpsheet{display:flex; flex-direction:column; gap:8px}
.cprow{display:flex; align-items:center; gap:12px; padding:12px 14px;
  border:1px solid var(--gi-line); border-radius:var(--gm-r-s); background:#fff}
.cprow .cpv{flex:none; min-width:62px; text-align:center; font-size:16px;
  font-weight:var(--gm-w-bold); color:var(--gi-point); font-variant-numeric:tabular-nums}
.cprow .cpin{flex:1; min-width:0}
.cprow .cpn{font-size:13.5px; font-weight:var(--gm-w-mid); color:var(--gi-ink);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.cprow .cpc{margin-top:3px; font-size:11.5px; color:var(--gi-mute)}
.cprow .cpst{flex:none; font-size:12px; font-weight:var(--gm-w-mid); color:var(--gi-mute)}

/* 상품상세의 [알림신청] 종도 딸랑딸랑 (사장님 지시 2026-09-16)
   ㉜·아래 ② 에서 홈 카드와 예고 버튼에는 이미 붙였는데, 상품상세만 빠져 있었습니다.
   ★ 신청이 끝나면(.done) 멈춥니다 — 할 일이 끝났는데 계속 흔들면 재촉처럼 보입니다. */
.actions #actionBuy:not(.done) .gi{
  transform-origin:50% 12%; animation:gmBell 2.6s ease-in-out infinite;
}
@media (prefers-reduced-motion:reduce){ .actions #actionBuy .gi{animation:none} }
/* 신청을 마친 버튼 — 눌리지 않는 회색 */
.actions #actionBuy.done{background:var(--gi-soft) !important; border-color:var(--gi-line) !important;
  color:var(--gi-mute) !important; cursor:default}

/* 공동구매 달성률 — 사진 오른쪽 아래 (특가 타이머는 왼쪽이라 안 겹칩니다) */
.bigimg .gbbadge{position:absolute; right:16px; bottom:16px; z-index:2;
  display:flex; align-items:baseline; gap:5px;
  background:rgba(0,0,0,.72); color:#fff; border-radius:999px; padding:8px 14px;
  font-size:12px; font-weight:var(--gm-w-mid); backdrop-filter:blur(2px)}
.bigimg .gbbadge b{font-size:18px; font-weight:var(--gm-w-bold); font-variant-numeric:tabular-nums}

/* 공동구매 설명 — 한 줄에 한 가지만 (달성 / 미달) */
.gs-list{margin:10px 0 0; padding-left:18px; font-size:13px; line-height:1.9; color:var(--gi-ink-2)}
.gs-list li{margin:0}
.gs-list b{color:var(--gi-ink); font-weight:var(--gm-w-bold)}

/* ★ 공동구매 띠가 혼자 화면 끝까지 갔습니다 (사장님 지적 2026-09-16 —
   "재고 밑에 공동구매 설명 칸 좌우 레이아웃 여백 맞추기").
   실측: 띠는 왼쪽 0 · 폭 390 인데, 배송·재고 칸과 상품명은 왼쪽 16 · 폭 358.
   띠를 감싼 칸에 여백이 없어서 혼자 밖으로 나가 있었습니다. */
.gb-strip{margin-left:16px; margin-right:16px}

/* ── 환불받을 계좌 시트 (직원분 지시 2026-10-02) ───────────────────────────────
   예전에는 prompt() 를 세 번 띄웠습니다 — 은행 이름을 손으로 적게 해서 조잡했고,
   「국민은행」처럼 적으면 못 알아듣기도 했습니다. 이제 한 장에 모읍니다:
   은행은 **고르고**, 계좌번호·예금주만 적습니다. 폰 한 손 조작 기준(칸 높이 48px). */
.ra-help{margin:0 0 12px; font-size:13px; line-height:1.6; color:var(--gi-ink-2)}
.ra-form{display:flex; flex-direction:column; gap:8px}
.ra-in{width:100%; height:48px; padding:0 13px; font-size:15px; color:var(--gi-ink);
  background:#fff; border:1px solid var(--gi-line); border-radius:10px; -webkit-appearance:none; appearance:none}
.ra-in:focus{outline:none; border-color:var(--gi-point); box-shadow:0 0 0 3px rgba(244,43,84,.12)}
select.ra-in{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath fill='%23888' d='M1 1l5 5 5-5'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right 13px center; background-size:12px; padding-right:36px}
.ra-msg{min-height:19px; margin-top:8px; font-size:12.5px; font-weight:var(--gm-w-mid); color:var(--gi-point)}
.ra-btns{display:flex; gap:8px; margin-top:14px}
.ra-b{flex:1; height:50px; font-size:15px; font-weight:var(--gm-w-mid); border-radius:10px; border:1px solid var(--gi-line);
  background:#fff; color:var(--gi-ink)}
.ra-b.go{flex:2; border-color:transparent; background:var(--gi-point); color:#fff}
/* 적어 둔 계좌 — 번호는 뒷자리만 보여 줍니다(손님 본인 것이지만 어깨너머가 있습니다) */
.ra-card{padding:14px 15px; margin-bottom:12px; border:1px solid var(--gi-line); border-radius:12px; background:var(--gi-soft)}
.ra-bank{font-size:15px; font-weight:var(--gm-w-mid); color:var(--gi-ink)}
.ra-no{margin-top:3px; font-size:18px; font-weight:700; letter-spacing:.02em; color:var(--gi-ink)}
.ra-holder{margin-top:4px; font-size:12.5px; color:var(--gi-mute)}
