@charset "utf-8";
/* ─────────────────────────────────────────────────────────
   shop.css — 반응형 쇼핑몰 (PC/모바일 공용)
   브레이크포인트: 1024px(태블릿) / 768px(모바일)
   ⚠️ /m/* 앱 웹뷰 화면은 mobile.css 에서 별도로 관리한다.
   ───────────────────────────────────────────────────────── */

/* ── 헤더 ─────────────────────────────────────────────────────────────
   출처: guide_images/navigation_guide.png (Header)
     PC     높이 74 · 로고 184×29 · GNB 간격 52 · 우측 아이콘 24
     모바일 높이 48 · 로고 높이 22 · 아이콘 24 · 좌우 여백은 --page-margin(20) */
.header {
    position: sticky; top: 0; z-index: 100;
    background: var(--c-surface);
    /* ⚠️ border 로 그리면 높이에 1px 이 더해져 가이드값(74/48)이 어긋난다 → box-shadow */
    box-shadow: 0 1px 0 var(--c-divider);
}
.header-inner {
    width: 100%; max-width: var(--container-outer); margin: 0 auto; padding: 0 var(--page-margin);
    height: var(--header-h); display: flex; align-items: center;
}
.logo { flex: 0 0 auto; display: block; }
.logo img { height: 29px; width: auto; }

/* 로고와의 간격 210 은 시안(1920) 실측값이다. 화면이 좁아지면 우측 유틸과 부딪히므로
   남는 폭만큼만 준다 — 1010 = 로고 184 + GNB 538 + 유틸(로그인 상태 기준) 200 + 좌우패딩 48 + 최소간격 40.
   ⚠️ 브레이크포인트를 늘리지 않으려고 clamp 로 처리했다(1024 이하는 GNB 자체가 숨는다).
   ⚠️ flex 축소·줄바꿈을 막지 않으면 1128px 부근에서 메뉴가 2줄이 되고 '고객센터'가 유틸과 겹친다(실제 버그였다). */
.gnb {
    flex: 0 0 auto;
    display: flex; gap: 52px; margin-left: clamp(24px, calc(100vw - 1010px), 210px);
    font-size: var(--fs-body1); font-weight: var(--fw-medium);
}
.gnb a { color: var(--c-text-primary); padding: 4px 0; border-bottom: 2px solid transparent; white-space: nowrap; }
.gnb a:hover, .gnb a.is-active { border-color: var(--c-primary); }

.header-util { margin-left: auto; display: flex; align-items: center; gap: 28px; }
.hd-user { font-size: var(--fs-body1); color: var(--c-text-primary); }
.hd-ico { position: relative; display: flex; width: 42px; height: 42px; }
.hd-ico img { width: 42px; height: 42px; }
.hd-ico-mo { display: none; }        /* 모바일에서 교체 */
/* 가이드 PC 헤더는 로그인 상태(홍길동님)만 그려져 있다.
   비로그인 진입점이 없으면 안 되므로 PC/모바일 모두 로그인 버튼을 노출한다. */
.hd-login { flex: 0 0 auto; }

/* 서브페이지(모바일) 뒤로가기 헤더 — PC 에서는 감춘다 */
.hd-back, .hd-title { display: none; }

.badge-count {
    position: absolute; top: 0; right: 0; min-width: 18px; height: 18px;
    padding: 0 5px; border-radius: 999px;
    background: var(--c-red-main); color: var(--c-on-color);
    font-size: var(--fs-sub1); font-weight: var(--fw-bold); line-height: 20px; text-align: center;
}

/* ── 페이지 컨테이너 ─────────────────────────────────── */
/* 아래 여백은 --page-bottom 하나로 통일한다 (푸터 마진·래퍼 패딩 추가 금지) */
.page { width: 100%; max-width: var(--container-outer); margin: 0 auto; padding: 28px var(--page-margin) var(--page-bottom); }
/* 전폭 화면(메인 등) — 배경이 화면 끝까지 가는 섹션형. 여백은 각 섹션의 --sec-pad 가 갖는다. */
.page-full { width: 100%; }

/* 내용이 짧은 화면(이벤트 상세·준비중 등)에서 푸터가 화면 중간에 뜨고 그 아래가 비어 보이던 문제 —
   본문이 남는 높이를 채워 푸터를 항상 화면 바닥 아래로 내린다(sticky footer).
   2026-08-10 · 화면보다 긴 페이지에는 아무 영향이 없다.
   ⚠️ body 를 flex 로 만드는 규칙이라 **레이아웃 전역**에 걸린다.
      헤더·본문·푸터·하단탭이 세로로 쌓이는 구조는 그대로고, 모달·토스트·드로어는 fixed 라 무관하다. */
body { min-height: 100vh; display: flex; flex-direction: column; }
.page, .page-full { flex: 1 0 auto; }
.footer { flex-shrink: 0; }

.page-head {
    display: flex; align-items: baseline; gap: 12px;
    padding-bottom: 16px; margin-bottom: 20px; border-bottom: 1px solid var(--c-line);
}
.page-title { font-size: var(--fs-sh1); font-weight: var(--fw-bold); }
.page-desc { color: var(--c-text-sub); font-size: var(--fs-body2); }
.page-desc strong { color: var(--c-primary); }

.sec { margin-top: 44px; }
.sec-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }
.sec-title { font-size: var(--fs-sh2); font-weight: var(--fw-bold); }
.sec-count { color: var(--c-primary); }
.sec-more { font-size: var(--fs-body2); color: var(--c-text-sub); }
.sec-more:hover { color: var(--c-primary); }

.card {
    background: var(--c-surface); border: 1px solid var(--c-line);
    border-radius: var(--r-lg); padding: 22px; margin-bottom: 16px;
}
.card-title { font-size: var(--fs-sh2); font-weight: var(--fw-bold); margin-bottom: 16px; }

/* ── 상품 그리드 / 카드 ──────────────────────────────── */
/* 카드 4개 = 12컬럼 중 3컬럼씩 (3×88 + 2×24 = 312) */
.pgrid { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--grid-gutter); }

.pcard {
    background: var(--c-surface); border: 1px solid var(--c-line);
    border-radius: var(--r-lg); overflow: hidden;
    transition: transform .15s, box-shadow .15s, border-color .15s;
}
.pcard:hover { transform: translateY(-3px); box-shadow: var(--shadow); border-color: var(--c-primary); }

.pcard-thumb {
    position: relative; aspect-ratio: 4 / 3;
    display: flex; align-items: center; justify-content: center;
    background: linear-gradient(140deg,
        hsl(var(--hue, 158) 55% 94%) 0%,
        hsl(var(--hue, 158) 45% 84%) 100%);
}
.pcard-ico { font-size: 48px; }
.pcard-badge {
    position: absolute; top: 10px; left: 10px;
    padding: 3px 9px; border-radius: 999px;
    background: var(--c-sub-black); color: var(--c-on-color);
    font-size: var(--fs-sub1); font-weight: var(--fw-bold); letter-spacing: .3px;
}
.pcard-badge.is-static { position: static; display: inline-block; margin-bottom: 10px; }

.pcard-body { padding: 14px 16px 18px; }
.pcard-name { font-size: var(--fs-body1); font-weight: var(--fw-bold); margin-bottom: 4px; }
.pcard-sub {
    font-size: var(--fs-body2); color: var(--c-text-sub); margin-bottom: 10px;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.pcard-price { font-size: var(--fs-body2); color: var(--c-text-sub); }
.pcard-price strong { font-size: var(--fs-sh2); color: var(--c-text); }
.pcard-price del { margin-left: 6px; font-size: var(--fs-body2); }
.pcard-meta { margin-top: 8px; font-size: var(--fs-sub1); color: var(--c-text-mute); }

/* ── 목록 필터 ───────────────────────────────────────── */
.filter { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 22px; flex-wrap: wrap; }
.filter-cats { display: flex; gap: 8px; flex-wrap: wrap; }
.chip {
    padding: 7px 15px; border-radius: 999px;
    border: 1px solid var(--c-line); background: var(--c-surface);
    font-size: var(--fs-body2); color: var(--c-text-sub);
}
.chip.is-active { background: var(--c-primary); border-color: var(--c-primary); color: var(--c-on-color); font-weight: var(--fw-semibold); }

.filter-sort { display: flex; gap: 14px; font-size: var(--fs-body2); }
.sort-link { color: var(--c-text-mute); }
.sort-link.is-active { color: var(--c-text); font-weight: var(--fw-bold); }

.filter-search { margin-bottom: 18px; max-width: 420px; }

.search-note { margin-bottom: 16px; font-size: var(--fs-body2); color: var(--c-text-sub); }
.search-note a { margin-left: 8px; color: var(--c-primary); text-decoration: underline; }

/* ── 상품 상세 ───────────────────────────────────────── */
/* ⚠️ 2026-08-12 — 상품·키트 상세의 브레드크럼을 **시안에 없어 뺐다**(두 시안 모두 없다).
   쓰는 화면이 0 이지만 되살릴 때를 위해 규칙은 남겨 둔다. */
.breadcrumb { margin-bottom: 16px; font-size: var(--fs-body2); color: var(--c-text-sub); }
.breadcrumb a:hover { color: var(--c-primary); }

.pdetail { display: grid; grid-template-columns: 1fr 1fr; gap: 36px; align-items: start; }
.pdetail-visual {
    aspect-ratio: 1 / 1; border-radius: var(--r-lg);
    display: flex; align-items: center; justify-content: center;
    font-size: 110px;
    background: linear-gradient(140deg,
        hsl(var(--hue, 158) 55% 94%) 0%,
        hsl(var(--hue, 158) 45% 84%) 100%);
}
.pdetail-name { font-size: var(--fs-sh1); font-weight: var(--fw-bold); letter-spacing: -.5px; }
.pdetail-sub { margin-top: 8px; color: var(--c-text-sub); }
.pdetail-rate { margin-top: 12px; font-size: var(--fs-body2); color: var(--c-sub-gold); }
.pdetail-rate span { color: var(--c-text-mute); margin-left: 4px; }
.pdetail-price { margin: 16px 0 20px; padding-bottom: 20px; border-bottom: 1px solid var(--c-line); }
.pdetail-price strong { font-size: var(--fs-h2); font-weight: var(--fw-bold); }
.pdetail-price del { display: block; font-size: var(--fs-body2); margin-bottom: 2px; }

.pdetail-spec { font-size: var(--fs-body2); }
.pdetail-spec > div { display: flex; padding: 9px 0; border-bottom: 1px solid var(--c-divider); }
.pdetail-spec dt { width: 120px; color: var(--c-text-sub); }
.pdetail-spec dd { font-weight: var(--fw-medium); }

.buy-form { margin-top: 24px; }
.buy-btns { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 14px; }

/* 3개 = 4컬럼씩 (4×88 + 3×24 = 424) */
.item-groups { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--grid-gutter); }
.item-group {
    background: var(--c-surface); border: 1px solid var(--c-line);
    border-radius: var(--r-md); padding: 18px;
}
.item-group h3 { font-size: var(--fs-body1); color: var(--c-primary); margin-bottom: 10px; }
.item-group li { padding: 5px 0 5px 14px; position: relative; font-size: var(--fs-body2); color: var(--c-text-sub); }
.item-group li::before { content: ''; position: absolute; left: 0; top: 13px; width: 4px; height: 4px; border-radius: 50%; background: var(--c-primary); }

.review-list li {
    background: var(--c-surface); border: 1px solid var(--c-line);
    border-radius: var(--r-md); padding: 18px; margin-bottom: 10px;
}
.review-head { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; font-size: var(--fs-body2); }
.review-star { color: var(--c-sub-gold); }
.review-head time { margin-left: auto; font-size: var(--fs-sub1); color: var(--c-text-mute); }
.review-body { color: var(--c-text-sub); }

/* ── 장바구니 ────────────────────────────────────────── */
/* 본문 9컬럼(984) + 사이드 3컬럼(312) */
.cart-wrap { display: grid; grid-template-columns: 1fr 312px; gap: var(--grid-gutter); align-items: start; }

.cart-item {
    display: flex; gap: 16px; align-items: flex-start;
    background: var(--c-surface); border: 1px solid var(--c-line);
    border-radius: var(--r-md); padding: 16px; margin-bottom: 10px;
}
.cart-thumb {
    flex: 0 0 84px; width: 84px; height: 84px; border-radius: var(--r-sm);
    display: flex; align-items: center; justify-content: center; font-size: 34px;
    overflow: hidden;                      /* 상품 이미지가 모서리를 넘지 않게 */
    background: linear-gradient(140deg,
        hsl(var(--hue, 158) 55% 94%) 0%,
        hsl(var(--hue, 158) 45% 84%) 100%);
}
/* 2026-08-07 — 이모지 자리표시자에서 실제 상품 이미지로 전환. 배경 그라디언트는 로딩 전 바탕으로 남긴다 */
.cart-thumb > img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cart-info { flex: 1; min-width: 0; }
.cart-name { font-weight: var(--fw-bold); }
.cart-name:hover { color: var(--c-primary); }
.cart-sub { font-size: var(--fs-body2); color: var(--c-text-sub); margin: 4px 0 10px; }
.cart-right { text-align: right; flex: 0 0 auto; }
.cart-price strong { font-size: var(--fs-sh2); }
.cart-del { margin-top: 10px; font-size: var(--fs-body2); color: var(--c-text-mute); text-decoration: underline; }
.cart-del:hover { color: var(--c-red-text); }

.cart-summary, .order-summary {
    position: sticky; top: calc(var(--header-h) + 20px);
    background: var(--c-surface); border: 1px solid var(--c-line);
    border-radius: var(--r-lg); padding: 22px;
}
.cart-summary h2, .order-summary h2 { font-size: var(--fs-sh2); margin-bottom: 14px; }
.cart-summary dl > div, .order-summary dl > div {
    display: flex; justify-content: space-between; padding: 7px 0; font-size: var(--fs-body2); color: var(--c-text-sub);
}
.cart-total {
    display: flex; justify-content: space-between; align-items: baseline;
    padding: 14px 0; margin-bottom: 14px; border-top: 1px solid var(--c-line);
    font-size: var(--fs-body2);
}
.cart-total strong { font-size: var(--fs-sh1); font-weight: var(--fw-bold); color: var(--c-primary); }
.cart-summary .btn + .btn { margin-top: 8px; }
.cart-note { margin-top: 12px; font-size: var(--fs-sub1); color: var(--c-text-mute); text-align: center; }

/* ── 주문서 ──────────────────────────────────────────── */
.order-wrap { display: grid; grid-template-columns: 1fr 312px; gap: var(--grid-gutter); align-items: start; }
.order-items li { display: flex; align-items: center; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--c-divider); }
.order-items li:last-child { border-bottom: 0; }
.order-thumb {
    flex: 0 0 52px; width: 52px; height: 52px; border-radius: var(--r-sm);
    display: flex; align-items: center; justify-content: center; font-size: 24px;
    background: linear-gradient(140deg,
        hsl(var(--hue, 158) 55% 94%) 0%,
        hsl(var(--hue, 158) 45% 84%) 100%);
}
.order-name { font-weight: var(--fw-semibold); }
.order-qty { font-size: var(--fs-body2); color: var(--c-text-sub); }
.order-price { margin-left: auto; font-weight: var(--fw-semibold); }

.pay-methods { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
.pay-method {
    display: flex; align-items: center; justify-content: center; gap: 6px;
    height: 48px; border: 1px solid var(--c-line); border-radius: var(--r-sm);
    font-size: var(--fs-body2); cursor: pointer;
}
/* 라디오 자체 스타일은 common.css 의 .rdo 가 담당 */
.pay-method:has(input:checked) { border-color: var(--c-primary); background: var(--c-primary-soft); font-weight: var(--fw-semibold); }
.pay-note { margin-top: 12px; font-size: var(--fs-sub1); color: var(--c-text-mute); }

/* ── 주문완료 ────────────────────────────────────────── */
.complete { max-width: 640px; margin: 40px auto; text-align: center; }
.complete-ico { font-size: 52px; }
.complete-title { font-size: var(--fs-sh1); margin: 12px 0 6px; }
.complete-desc { color: var(--c-text-sub); }
.complete-desc strong { color: var(--c-primary); }
.complete-steps {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--grid-gutter); margin: 32px 0;
    text-align: left;
}
.complete-steps li {
    background: var(--c-surface); border: 1px solid var(--c-line);
    border-radius: var(--r-md); padding: 16px; font-size: var(--fs-body2); font-weight: var(--fw-semibold);
}
.complete-steps em { display: block; color: var(--c-primary); font-size: var(--fs-sub1); font-weight: var(--fw-bold); margin-bottom: 6px; }
.complete-steps span { display: block; margin-top: 4px; font-size: var(--fs-sub1); font-weight: var(--fw-regular); color: var(--c-text-sub); }
.complete-btns { display: flex; gap: 10px; justify-content: center; flex-wrap: wrap; }

/* ── 마이페이지 ──────────────────────────────────────── */
.my-profile {
    display: flex; align-items: center; gap: 16px;
    background: var(--c-surface); border: 1px solid var(--c-line);
    border-radius: var(--r-lg); padding: 22px;
}
.my-avatar {
    width: 60px; height: 60px; border-radius: 50%;
    background: var(--c-primary-soft);
    display: flex; align-items: center; justify-content: center; font-size: 28px;
}
.my-name { font-size: var(--fs-sh2); }
.my-contact { font-size: var(--fs-body2); color: var(--c-text-sub); }
.my-stats { margin-left: auto; display: flex; gap: 28px; text-align: center; }
.my-stats dt { font-size: var(--fs-sub1); color: var(--c-text-sub); }
.my-stats dd { font-size: var(--fs-sh1); font-weight: var(--fw-bold); color: var(--c-primary); }

.order-history li {
    background: var(--c-surface); border: 1px solid var(--c-line);
    border-radius: var(--r-md); padding: 18px; margin-bottom: 10px;
}
.oh-head { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; font-size: var(--fs-sub1); color: var(--c-text-mute); }
.oh-no { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
.oh-head .badge { margin-left: auto; }
.oh-name { font-weight: var(--fw-bold); }
.oh-name span { font-weight: var(--fw-regular); font-size: var(--fs-body2); color: var(--c-text-sub); }
.oh-meta { margin-top: 4px; font-size: var(--fs-body2); color: var(--c-text-sub); }
.oh-price { margin-top: 6px; font-size: var(--fs-body1); font-weight: var(--fw-bold); }
.oh-btns { display: flex; gap: 8px; margin-top: 12px; }

.my-menu {
    background: var(--c-surface); border: 1px solid var(--c-line);
    border-radius: var(--r-md); overflow: hidden;
}
.my-menu li + li { border-top: 1px solid var(--c-line); }
.my-menu a { display: block; padding: 15px 18px; font-size: var(--fs-body1); }
.my-menu a::after { content: '›'; float: right; color: var(--c-icon-disabled); }
.my-menu a:hover { background: var(--c-bg-secondary); }

/* ── 인증 화면 ───────────────────────────────────────── */
.auth-body { background: var(--c-bg); }
.auth-wrap { max-width: 420px; margin: 0 auto; padding: 56px 20px 80px; }
.auth-logo { display: block; text-align: center; font-size: var(--fs-sh1); font-weight: var(--fw-bold); margin-bottom: 24px; }
.auth-logo span { color: var(--c-primary); }
.auth-card {
    background: var(--c-surface); border: 1px solid var(--c-line);
    border-radius: var(--r-lg); padding: 28px;
}
.auth-title { font-size: var(--fs-sh1); margin-bottom: 20px; text-align: center; }
.auth-card .btn-block { margin-top: 16px; }
.auth-links { display: flex; justify-content: center; gap: 16px; margin-top: 18px; font-size: var(--fs-body2); color: var(--c-text-sub); }
.auth-links a:hover { color: var(--c-primary); }
.auth-note { margin-top: 20px; font-size: var(--fs-sub1); color: var(--c-text-mute); text-align: center; }

/* ── 푸터 ─────────────────────────────────────────────────────────────
   출처: guide_images/navigation_guide.png (Footer)
     배경 Sub_black · PC 는 [로고 | 링크] 한 줄 → 회사정보 2줄 → 카피라이트
     로고 290×46(에셋 2x) · 로고 상단 69 · 정보 164/195 · 카피 271 */
.footer { background: var(--c-sub-black); }
.footer-inner {
    width: 100%; max-width: var(--container-outer); margin: 0 auto;
    padding: 69px var(--page-margin) 58px;
    display: grid; grid-template-columns: 1fr auto; align-items: start;
    row-gap: 22px;
}
.footer-logo { grid-column: 1; grid-row: 1; }
.footer-logo img { height: 46px; width: auto; }

.footer-links {
    grid-column: 2; grid-row: 1;
    display: flex; gap: 32px; align-items: center;
    font-size: var(--fs-body1); color: var(--c-gray-300);
}
.footer-links a { color: var(--c-gray-300); }
.footer-links a.is-strong { font-weight: var(--fw-bold); }
.footer-links a:hover { color: var(--c-bg-primary); }

.footer-info {
    grid-column: 1 / -1; grid-row: 2;
    font-size: var(--fs-body2); color: var(--c-text-tertiary);
}
.footer-info .fi-row { display: flex; flex-wrap: wrap; gap: 8px 30px; }
.footer-info .fi-row + .fi-row { margin-top: 9px; }
.footer-info span { display: flex; gap: 10px; }
.footer-info dt { font-weight: var(--fw-bold); }

.footer-copy {
    grid-column: 1 / -1; grid-row: 3;
    margin-top: 34px; font-size: var(--fs-sub1); color: var(--c-gray-700);
}

/* ── 모바일 하단 탭 네비 (768px 이하만 노출) ──────────────────────────
   출처: navigation_guide.png (Bottom) — 높이 74 · 아이콘 24(상단 14) · 라벨 12(상단 51) */
.bottom-nav { display: none; }
.bnav-item {
    display: flex; flex-direction: column; align-items: center;
    padding-top: 14px; height: 74px;
}
.bnav-ico { width: 24px; height: 24px; }
.bnav-label { margin-top: 13px; font-size: var(--fs-sub1); line-height: 1; color: var(--c-gray-400); }
.bnav-item.is-active .bnav-label { color: var(--c-text-secondary); font-weight: var(--fw-bold); }

/* ── 반응형 ──────────────────────────────────────────── */
@media (max-width: 1024px) {
    .pgrid { grid-template-columns: repeat(3, 1fr); }
    .gnb { display: none; }
    .cart-wrap, .order-wrap { grid-template-columns: 1fr; }
    .cart-summary, .order-summary { position: static; }
    .item-groups { grid-template-columns: repeat(2, 1fr); }
    .complete-steps { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 768px) {
    .page { padding: 20px var(--page-margin) var(--page-bottom); }

    /* 헤더 — 높이 48, 로고 22, 아이콘 24 (navigation_guide Mobile) */
    .header-inner { padding: 0 var(--page-margin); }
    .logo img { height: 22px; }
    .gnb { display: none; }
    .hd-user { display: none; }
    .header-util { gap: 20px; }
    .hd-ico-pc { display: none; }
    .hd-ico-mo { display: block; }
    .hd-ico {width: 32px;height: 32px;}
    .hd-ico img {width:32px;height:32px;}

    /* 서브페이지 뒤로가기형 — 로고 대신 [‹ 타이틀] */
    .header.has-back .logo { display: none; }
    .header.has-back .hd-back {
        display: flex; align-items: center; justify-content: center;
        width: 24px; height: 24px; margin-left: -4px;
        font-size: 26px; line-height: 1; color: var(--c-icon-primary);
    }
    .header.has-back .hd-title {
        display: block; margin-left: 12px;
        font-size: var(--fs-body1); font-weight: var(--fw-bold); color: var(--c-text-primary);
        overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    }
    .header.has-back .hd-login { display: none; }


    /* 카드 2개 = 6컬럼 중 3컬럼씩 (3×50 + 2×10 = 170) */
    .pgrid { grid-template-columns: repeat(2, 1fr); }
    .pcard-ico { font-size: 38px; }
    .pcard-body { padding: 12px 12px 14px; }
    .pcard-name { font-size: var(--fs-body2); }

    .filter { flex-direction: column; align-items: stretch; }
    /* 칩 행은 가로 스크롤한다. min-width:0 + max-width:100% 가 없으면 flex 항목이
       내용 크기만큼 부풀어 페이지 전체가 가로로 넘친다. */
    .filter-cats, .filter-sort {
        min-width: 0; max-width: 100%;
        overflow-x: auto; -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
    }
    .filter-cats::-webkit-scrollbar, .filter-sort::-webkit-scrollbar { display: none; }
    .filter-cats { flex-wrap: nowrap; padding-bottom: 4px; }
    .chip, .sort-link { flex: 0 0 auto; }

    /* 모바일은 헤더의 뒤로가기가 대신하므로 브레드크럼을 숨긴다 */
    .breadcrumb { display: none; }

    .pdetail { grid-template-columns: 1fr; gap: 20px; }
    .pdetail-visual { aspect-ratio: 4 / 3; font-size: 76px; }
    .item-groups { grid-template-columns: 1fr; }

    .cart-item { flex-wrap: wrap; }
    .cart-right { width: 100%; display: flex; align-items: center; justify-content: space-between; }
    .cart-del { margin-top: 0; }

    .pay-methods { grid-template-columns: repeat(2, 1fr); }
    .my-profile { flex-wrap: wrap; }
    .my-stats { margin-left: 0; width: 100%; justify-content: space-around; padding-top: 14px; border-top: 1px solid var(--c-line); }

    /* 푸터 — 링크 행(구분선) → 로고 → 회사정보 → 카피라이트
       ⚠️ **모바일에서 푸터를 지우지 않는다.** 상호·대표·사업자등록번호·통신판매업 신고번호·
          주소·연락처는 전자상거래법 제10조 표시 의무 항목이고, 카드사·PG 심사에서도
          (대개 모바일 화면으로) 노출 여부를 확인한다. 지우면 심사 반려 사유가 된다.
          → 없애는 대신 **글자·여백을 죄고 항목을 흘려 담아** 높이만 줄인다(2026-08-12). */
    .footer { margin-bottom: 74px; }
    .footer-inner {
        display: block; padding: 0 var(--page-margin) 24px;
    }
    .footer-links {
        justify-content: space-between; gap: 0;
        margin: 0 calc(-1 * var(--page-margin)) 0;
        padding: 14px var(--page-margin);
        font-size: var(--fs-body2);
    }
    .footer-links a { flex: 1; text-align: center; }
    .footer-links a + a { border-left: 1px solid var(--c-gray-700); }
    .footer-logo { margin-top: 24px; }
    .footer-logo img { height: 24px; }
    /* ⚠️ 항목을 한 줄에 하나씩 세우면 7줄 = 200px 를 먹었다.
          **가로로 흘려 담아** 3~4줄로 접는다 — 값은 하나도 빼지 않는다. */
    .footer-info {
        margin-top: 16px; font-size: var(--fs-sub1); line-height: 1.7;
    }
    .footer-info .fi-row { display: flex; flex-wrap: wrap; gap: 2px 12px; }
    .footer-info .fi-row + .fi-row { margin-top: 2px; }
    .footer-info span { display: inline-flex; gap: 5px; margin-bottom: 0; }
    .footer-copy { margin-top: 16px; text-align: center; font-size: var(--fs-sub1); }

    /* 하단 고정 탭 네비 — 높이 74, 5탭 균등 */
    .bottom-nav {
        position: fixed; left: 0; right: 0; bottom: 0; z-index: 120;
        display: grid; grid-template-columns: repeat(5, 1fr);
        background: var(--c-surface);
        box-shadow: 0 -1px 0 var(--c-divider);   /* 높이 74 유지 (border 는 1px 늘어남) */
        padding-bottom: env(safe-area-inset-bottom);
    }
    .toast { bottom: 90px; }
}

/* ── 로그인 ───────────────────────────────────────────────────────────
   출처: page_img/로그인.png (실측, 1920 기준)
     폼 폭 424 · 제목 상단 87 · 입력 48(간격 11) · 로그인 btn-xl(위 25)
     아이디저장 행(위 17) · 구분선(위 60) · SNS 제목/아이콘 52 · 회원가입 btn-xl */
/* ⚠️ 세로 간격은 시안 절대좌표에서 역산한 값이다. 인접 마진은 병합(collapse)되므로
   '.field 11px + 버튼 25px' 은 25px 로 합쳐진다 — 값을 바꿀 때 주의. */
.login { max-width: 424px; margin: 0 auto; padding: 55px 0 0; }
.login-title {
    margin-bottom: 48px;
    font-size: var(--fs-sh1); font-weight: var(--fw-bold);
    color: var(--c-text-primary); text-align: center;
}
.login .field { margin-bottom: 11px; }
.login form .btn-xl { margin-top: 25px; }

.login-sub {
    display: flex; align-items: center; justify-content: space-between;
    margin-top: 17px;
}
.login-keep { display: flex; align-items: center; gap: 8px; cursor: pointer; }
.login-keep span { font-size: var(--fs-body2); color: var(--c-text-secondary); }

.login-find { display: flex; align-items: center; font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.login-find a { padding: 0 15px; }
.login-find a:first-child { padding-left: 0; }
.login-find a:last-child { padding-right: 0; }
.login-find a + a { border-left: 1px solid var(--c-divider); }
.login-find a:hover { color: var(--c-text-primary); }

.login-sns { margin-top: 52px; padding-top: 45px; border-top: 1px solid var(--c-divider); text-align: center; }
.login-sns-title { font-size: var(--fs-body1); color: var(--c-text-primary); }
.sns-list { display: flex; justify-content: center; gap: 36px; margin-top: 22px; }
.sns-btn { display: block; text-align: center; }
.sns-btn img { width: 52px; height: 52px; margin: 0 auto; }
.sns-btn span { display: block; margin-top: 9px; font-size: var(--fs-body2); color: var(--c-text-secondary); }

.login-join { margin-top: 56px; }
.login-note { margin-top: 20px; font-size: var(--fs-sub1); color: var(--c-text-mute); text-align: center; }

/* 헤더 비로그인 링크 */
.hd-join { font-size: var(--fs-body1); color: var(--c-text-primary); }
.hd-join:hover { color: var(--c-primary); }

@media (max-width: 768px) {
    .login { max-width: none; padding: 8px 0 0; }
    .login-title { display: none; }         /* 모바일은 헤더 타이틀이 대신한다 */
    .login-sns { margin-top: 40px; padding-top: 36px; }
    .login-join { margin-top: 40px; }
    .hd-join { display: none; }             /* 모바일 헤더는 로그인 버튼만 */
}

/* ── ID/PW 찾기 ───────────────────────────────────────────────────────
   출처: page_img/아이디 찾기.png (실측, 1920 기준 절대 y)
     제목 161 · 설명 214 · 탭 303(밑줄 330~332) · 이름 라벨 372/입력 396
     휴대폰 라벨 471/입력 495 · 인증번호 495+7 · 제출 653(52)
   ⚠️ 인접 마진 병합 주의 — .field(11) 와 다음 요소 margin-top 은 큰 쪽으로 합쳐진다. */
.find { max-width: 424px; margin: 0 auto; padding: 55px 0 0; }
.find-title {
    font-size: var(--fs-sh1); font-weight: var(--fw-bold);
    color: var(--c-text-primary);
}
.find-desc { margin-top: 20px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }

/* 탭 — 2등분, 활성 3px Main/300 밑줄 / 비활성 1px Gray/300 */
.tabs { display: flex; margin-top: 60px; }
.tab {
    flex: 1; padding-bottom: 12px;
    font-size: var(--fs-body1); font-weight: var(--fw-semibold);
    color: var(--c-text-tertiary); text-align: center;
    border-bottom: 1px solid var(--c-border-primary);
}
.tab.is-active {
    color: var(--c-text-primary);
    border-bottom: 3px solid var(--c-main-300);
    padding-bottom: 10px;                    /* 밑줄 2px 증가분 보정 → 총 높이 유지 */
}

.find .field { margin: 0; }
.find .field:first-of-type { margin-top: 34px; }   /* 탭 밑줄 → 첫 라벨 */
.find .field + .field { margin-top: 23px; }        /* 입력 → 다음 라벨 */
.find .field-label { margin-bottom: 6px; }
.find-code { margin-top: 7px; }
.find-submit { margin-top: 57px; }
.find-note { margin-top: 20px; font-size: var(--fs-sub1); color: var(--c-text-mute); text-align: center; }

/* 인증 타이머 */
.auth-timer {
    flex: 0 0 auto; margin-right: 4px;
    font-size: var(--fs-body2); color: var(--c-red-main);
    font-variant-numeric: tabular-nums;
}
.auth-timer[hidden] { display: none; }

/* ── 아이디 찾기 완료 ─────────────────────────────────────────────────
   출처: page_img/아이디 찾기 완료.png (실측)
     원 194(80×80) · 제목 324 · ID 박스 375(424×92, r12) · 버튼 513(52) */
.found { max-width: 424px; margin: 0 auto; padding: 92px 0 0; text-align: center; }
.found-ico {
    width: 80px; height: 80px; margin: 0 auto; border-radius: 50%;
    background: var(--c-green-bg); color: var(--c-green-main);
    display: flex; align-items: center; justify-content: center;
}
.found-ico svg { width: 40px; height: 40px; }
.found-title {
    margin-top: 43px;
    font-size: var(--fs-sh1); font-weight: var(--fw-bold); color: var(--c-text-primary);
}
.found-id {
    /* ⚠️ flex 컨테이너는 항목 사이 공백 텍스트노드를 버린다 → "ID :" 와 값 사이는 gap 으로 준다 */
    display: flex; align-items: center; justify-content: center; gap: 5px;
    height: 92px; margin-top: 21px;
    border-radius: 12px; background: var(--c-gray-100);
    font-size: var(--fs-body1); color: var(--c-text-primary);
}
.found-id strong { font-weight: var(--fw-bold); }
.found-go { margin-top: 47px; }

@media (max-width: 768px) {
    .find, .found { max-width: none; }
    .find { padding-top: 24px; }
    .found { padding-top: 60px; }
    .find-title { display: none; }        /* 모바일은 헤더 타이틀이 대신한다 */
    .find-desc { margin-top: 0; }
    .tabs { margin-top: 28px; }
}

/* 비밀번호 재설정 — 탭이 없어 첫 필드 위 여백과 제출 버튼 여백만 다르다
   (guide_images/비밀번호 재설정.png: 설명 214 → 라벨 290 → 입력 314 / 입력 461 → 버튼 497) */
.find.is-reset .field:first-of-type { margin-top: 50px; }
.find.is-reset .find-submit { margin-top: 36px; }

/* 완료 화면의 보조 설명 (guide_images/비밀번호 찾기 완료.png: 설명 377 → 버튼 454) */
.found-desc { margin-top: 20px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.found-desc + .found-go { margin-top: 59px; }

/* ── 가입 플로우 (SNS 회원가입) ───────────────────────────────────────
   출처: page_img/소셜 로그인.png · 회원가입_2약관동의.png (실측, 1920 기준 절대 y)
     제목 141 · 스텝 원 212(52) · 라벨 278 · 카드 329(648×565, r24)
     카드 패딩 42/36/46 · 카드 제목 378 · 구분선 439 · 첫 행 476 · 행 간격 25
     라벨열 152 + 입력열 424 = 카드 내부 576 */
.join { max-width: 648px; margin: 0 auto; padding: 32px 0 0; }
.join-title {
    font-size: var(--fs-sh1); font-weight: var(--fw-bold);
    color: var(--c-text-primary); text-align: center;
}

/* 스텝퍼 — 원 52, 중심 간격 108(원 52 + 간격 56) */
.stepper { display: flex; justify-content: center; margin-top: 41px; }
.step { position: relative; width: 52px; text-align: center; }
.step + .step { margin-left: 56px; }
.step-mark {
    width: 52px; height: 52px; border-radius: 50%;
    background: var(--c-gray-200);
    display: flex; align-items: center; justify-content: center;
}
.step.is-current .step-mark { background: var(--c-main-300); }
.step.is-done    .step-mark { background: var(--c-main-200); }
/* 아이콘 에셋이 2x 라 정확히 절반으로 축소한다(모든 아이콘 비율 유지) */
.step-ico { transform: scale(.5); transform-origin: center; }
.step-label {
    display: block; margin-top: 12px;
    font-size: var(--fs-body2); color: var(--c-text-secondary); white-space: nowrap;
}
.step.is-current .step-label { font-weight: var(--fw-semibold); }
/* 연결선 — 앞 단계가 끝났으면(=현재/완료) Main/200 */
.step + .step::before {
    content: ''; position: absolute; left: -56px; top: 26px;
    width: 56px; height: 1px; background: var(--c-gray-200);
}
.step.is-current::before, .step.is-done::before { background: var(--c-main-200); }

/* 카드 */
.join-card {
    margin-top: 32px; padding: 42px 36px 46px;
    background: var(--c-bg-primary); border-radius: 24px;
}
.join-card-title {
    font-size: var(--fs-sh1); font-weight: var(--fw-bold); color: var(--c-text-primary);
}
.join-card form { margin-top: 31px; padding-top: 36px; border-top: 1px solid var(--c-divider); }
.join-submit { margin-top: 57px; }
.join-note { margin-top: 20px; font-size: var(--fs-sub1); color: var(--c-text-mute); text-align: center; }

/* 가로형 필드 행 — 라벨(152) + 입력(424) */
.frow { display: flex; align-items: center; }
.frow + .frow { margin-top: 24px; }   /* 행 피치 72 = 입력 48 + 24 */
.frow-label {
    flex: 0 0 152px; margin: 0;
    font-size: var(--fs-body2); font-weight: var(--fw-semibold); color: var(--c-text-primary);
}
.frow-label em { color: var(--c-sub-gold); }
.frow-body { flex: 1; min-width: 0; }

/* 약관 동의 */
.agree-all { display: flex; align-items: center; gap: 12px; cursor: pointer; }
.agree-all span { font-size: var(--fs-body1); font-weight: var(--fw-bold); color: var(--c-text-primary); }
.agree-item { margin-top: 23px; padding-top: 24px; border-top: 1px solid var(--c-divider); }
.agree-head { display: flex; align-items: center; gap: 12px; cursor: pointer; }
.agree-head span { font-size: var(--fs-body2); font-weight: var(--fw-semibold); color: var(--c-text-primary); }
.agree-body {
    height: 160px; margin-top: 13px; padding: 16px 18px;
    background: var(--c-gray-50); border: 1px solid var(--c-divider); border-radius: 8px;
    font-size: var(--fs-body2); color: var(--c-text-tertiary); line-height: 1.7;
    overflow-y: auto;
}
.agree-body p + p { margin-top: 14px; }

.join-btns { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-top: 47px; }

@media (max-width: 768px) {
    .join { max-width: none; padding-top: 24px; }
    .join-title { display: none; }          /* 모바일은 헤더 타이틀이 대신한다 */
    .stepper { margin-top: 0; }
    .step + .step { margin-left: 40px; }
    .step + .step::before { left: -40px; width: 40px; }
    .join-card { margin-top: 24px; padding: 28px 20px 32px; border-radius: 16px; }
    /* 라벨을 입력 위로 올린다 */
    .frow { display: block; }
    .frow-label { display: block; margin-bottom: 6px; }
    .join-submit { margin-top: 32px; }
    .join-btns { margin-top: 32px; }
}

/* ══ 메인 (page_img/메인.png) ═══════════════════════════════════════════
   레이아웃만 구성했고 이미지는 `.ph` 자리표시자다.
   ⚠️ 이미지 넣는 법: .ph 안에 <img> 만 넣으면 된다. 비율은 CSS 가 고정하고
      img 는 object-fit: cover 로 채워지며 자리표시자 라벨은 자동으로 사라진다.
   섹션 상하 여백은 --sec-pad 하나로 통일한다. */
:root { --sec-pad: 160px; }

/* 이미지 자리표시자 */
.ph { position: relative; overflow: hidden; background: var(--c-gray-200); }
/* ⚠️ **자식 결합자(`>`)만 두면 안 된다.** PC/모바일 이미지를 나눠 쓰려고 `<picture>` 로 감싸는 순간
   `<img>` 가 손자가 되어 규칙이 빠지고, 이미지가 원본 크기로 늘어나 찌그러진다(2026-08-10 실제 버그).
   `display: contents` 로 picture 박스를 없애 `<img>` 가 .ph 를 직접 채우게 한다. */
.ph > picture { display: contents; }
.ph > img,
.ph > picture > img { width: 100%; height: 100%; object-fit: cover; display: block; }
.ph:empty::after {
    content: attr(data-label);
    position: absolute; inset: 0;
    display: flex; align-items: center; justify-content: center;
    padding: 0 12px; text-align: center;
    font-size: var(--fs-sub1); color: var(--c-text-disabled);
}


/* 섹션 공통 */
.msec { padding: var(--sec-pad) 0; }
/* 본문은 흰색(is-plain)이고 BEST 섹션만 Gray/100 으로 띄운다 — 시안과 동일 */
.msec-best { background: var(--c-bg); }
/* STEP 타임라인 선이 100vw 라 가로 스크롤이 생기지 않게 잘라낸다 */
.msec-step { overflow: hidden; }

.msec-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 20px; }
.msec-eyebrow {
    font-size: var(--fs-sh2); font-weight: var(--fw-bold);
    color: var(--c-main-300); letter-spacing: .5px;
}
.msec-title { margin-top: 10px; font-size: var(--fs-h3); font-weight: var(--fw-bold); line-height: 1.35; color: var(--c-gray-900); }
.msec-title.ver2 {font-weight: normal;}
/* STEP 섹션의 가운데 제목만 크다 — 시안 실측 ≈45(H1). 좌측 정렬 섹션 제목(BEST 등)은 ≈31 이라 H2 유지 */
.msec-title.is-center { margin-top: 0; text-align: center; font-size: var(--fs-h1); }
.msec-title strong { font-weight: var(--fw-bold); }
.msec-more {
    display: inline-flex; align-items: center; gap: 8px; flex: 0 0 auto;
    font-size: var(--fs-sh2); color: var(--c-gray-900);   /* 시안 실측 Gray/900 */
}
.msec-more:hover { color: var(--c-main-300); }
/* 실측: 원 24 · Gray/800 (Main/300 아님) */
.msec-more-ico {
    display: inline-flex; align-items: center; justify-content: center;
    width: 24px; height: 24px; border-radius: 50%;
    background: var(--c-gray-800); color: var(--c-on-color); font-size: var(--fs-sub1);
}

/* ── 히어로 ─────────────────────────────────────────────
   PC 는 우측 절반이 이미지(풀블리드), 모바일은 텍스트 아래로 내려간다. */
.mhero {
    position: relative; overflow: hidden;
    background: linear-gradient(180deg, var(--c-gray-50) 0%, var(--c-gray-100) 100%);
}
.mhero-inner {
    position: relative; z-index: 1;      /* 이미지 위에 얹힌다 */
    width: 100%; max-width: var(--container-outer); margin: 0 auto;
    padding: 0 var(--page-margin);
    min-height: 1000px; display: flex; align-items: flex-start;
    padding-top:200px
}
.mhero-text { position: relative; z-index: 1; }
.mhero-eyebrow {
    font-size: var(--fs-body1); font-weight: var(--fw-bold);
    color: var(--c-sub-gold); letter-spacing: .5px;
}
.mhero-title { margin-top: 24px; font-size: var(--fs-hero); font-weight: var(--fw-semibold); line-height: 1.35; }
/* .mhero-title { margin-top: 24px; font-size: var(--fs-h2); font-weight: var(--fw-bold); line-height: 1.35; } */
.mhero-lead { margin-top: 24px; font-size: var(--fs-body1); color: var(--c-text-tertiary); line-height: 1.7; }
.mhero-actions { display: flex; flex-wrap: wrap; gap: 16px; margin-top: 40px; }
/* 히어로 CTA — page_img/메인.png 실측 (2026-08-12)
     · 높이 **56** (btn-xl 은 52 — 이 화면만 4px 크다)
     · 모서리 **완전 둥근(pill)** · 버튼 간격 16 · 좌측 정렬 기준선은 컨테이너 시작(300)
     · 1번 채움색 #6A3BE0 = Main/300 ✓ (btn-primary 그대로)
   ⚠️ 전역 버튼 규격(button_styles.png — radius 8/6, XL 52)은 **건드리지 않는다**.
      전역을 바꾸면 폼·모달·장바구니 등 모든 버튼이 함께 변한다 → 메인 히어로에만 덮어쓴다.
   ⚠️ 높이는 `--btn-h` 토큰으로 덮는다(높이·패딩 계산이 그 변수를 쓴다). */
.mhero-actions .btn { --btn-h: 56px; border-radius: 999px; }
/* 2번 버튼 — 시안은 **테두리 없는 흰 버튼 + 옅은 그림자**다.
   .btn-outline-dark 는 로그인 화면용(검은 1px 테두리)이라 모양이 다르다 → 여기서만 덮어쓴다. */
.mhero-actions .btn-outline-dark {
    border-color: transparent;
    box-shadow: var(--shadow-card);
}
.mhero-actions .btn-outline-dark:hover { background: var(--c-gray-100); }
.btn-arrow { font-size: var(--fs-body1); }
/* ⚠️ 히어로 이미지는 섹션 '전체'를 덮는다(에셋이 전체 폭 한 장이라).
   우측 절반만 쓰는 컷이 오면 object-position 으로 맞추면 되고, 구조는 그대로 둔다. */
.mhero-visual { position: absolute; inset: 0; }
.mhero-visual > img,
.mhero-visual > picture > img { object-position: right center; }

/* ── STEP ─────────────────────────────────────────────
   실측(메인.png): 카드 412×473 · gap 42 · r16 · 테두리 없이 그림자만
   이미지 412×260(에셋 824×520 = 2x) · 본문 좌우 패딩 36
   ⚠️ 이 섹션만 gap 42 / 카드 412 다. **EVENT 섹션은 424 + 거터 24** 라 서로 다르니 복사하지 말 것. */
.step-cards {
    --step-gap: 42px;
    display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--step-gap);
    margin-top: 88px;
}
/* ⚠️ overflow: hidden 은 카드가 아니라 썸네일에 준다 —
      카드에 주면 좌측 모서리 밖으로 나가는 타임라인 점이 잘린다. */
.step-card {
    position: relative;
    background: var(--c-surface); border-radius: var(--r-lg); box-shadow: var(--shadow-step);
}
.step-card-thumb {
    aspect-ratio: 412 / 260;                  /* 에셋 824×520 의 절반 */
    border-radius: var(--r-lg) var(--r-lg) 0 0; overflow: hidden;
}

/* 카드 전체가 이미지인 슬롯 (2026-08-13 · 관리자 등록분)
   STEP 번호·제목·설명까지 이미지 안에 들어가므로 카드에는 이미지 하나만 있다.
   ⚠️ 높이는 **이미지 비율을 그대로 따른다** — aspect-ratio 를 고정하면 관리자가 올린 그림이 잘린다.
   ⚠️ 세 카드의 이미지 비율이 다르면 카드 높이가 제각각이 된다 — 같은 비율로 만들어 올릴 것. */
.step-card-full { display: block; border-radius: var(--r-lg); overflow: hidden; }
.step-card-full > img { display: block; width: 100%; height: auto; }

/* 타임라인 선·점 — 전체 이미지 카드에도 그린다 (2026-08-13)
   기본 카드에서는 "이미지 아래 경계"가 기준선이지만, 전체 이미지에는 그 경계가 없다.
   그래서 **카드 높이 기준 비율**로 위치를 잡는다 — 기본값 55% 는 예전 카드의 경계
   (썸네일 260 / 카드 473 ≒ 55%)와 같은 자리다. 이미지 레이아웃이 다르면 이 값만 조절하면 된다.
   ⚠️ `overflow: hidden` 을 카드에 주면 **좌측 밖으로 나가는 점이 잘린다** → 라운드는 이미지에만 준다. */
.step-card.is-full { --step-line-y: 55%; }
.step-card.is-full::after {
    content: ''; position: absolute; z-index: -1;
    top: var(--step-line-y); left: -50vw; width: calc(100% + 100vw); height: 2px;
    background: var(--c-step-line);
}
.step-card.is-full::before {
    content: ''; position: absolute; z-index: 1;
    top: var(--step-line-y); left: 0; transform: translate(-50%, -50%);
    width: 16px; height: 16px; border-radius: 50%;
    background: var(--c-main-200);
}

/* 본문 — 위쪽 모서리(= 이미지 아래 경계)가 타임라인 기준선이다 */
.step-card-body { position: relative; padding: 30px 36px 36px; }
/* 가로선: 카드마다 좌우로 50vw 씩 뻗어 화면 전체를 잇는다.
   z-index -1 이라 카드 흰 배경 뒤로 들어가고 카드 사이·바깥에서만 보인다(시안과 동일).
   ⚠️ 100vw 가 넘치지 않도록 .msec-step 에 overflow: hidden 이 필요하다. */
.step-card-body::after {
    content: ''; position: absolute; z-index: -1;
    top: -1px; left: -50vw; width: calc(100% + 100vw); height: 2px;
    background: var(--c-step-line);
}
/* 점 16 — 카드 좌측 모서리, 선 위에 얹힌다 */
.step-card-body::before {
    content: ''; position: absolute; z-index: 1;
    top: 0; left: 0; transform: translate(-50%, -50%);
    width: 16px; height: 16px; border-radius: 50%;
    background: var(--c-main-200);
}

/* 글자 크기는 자기 렌더를 자로 삼아 역산했다 — 시안 실측 뱃지 ≈17 · 제목 ≈27 · 설명 ≈17.4 */
.step-card-no {
    display: inline-block; padding: 4px 12px; border-radius: 999px;
    background: var(--c-main-100); color: var(--c-main-300);
    font-size: var(--fs-sh2); font-weight: var(--fw-semibold);
}
.step-card-title { margin-top: 18px; font-size: var(--fs-sh0); font-weight: var(--fw-bold); }
.step-card-desc { margin-top: 9px; font-size: var(--fs-sh2); color: var(--c-gray-800); line-height: 1.4; }
/* ── 형광펜 강조 (시안 공통) — 2026-08-12 ─────────────────────────
   메인 STEP 설명 · 유전자 검사 HOW TO 설명의 **핵심 줄**에 얹는 옅은 보라 띠.
     색 #F4F0FF = Main/100 (두 화면 동일 · 실측)
     위치 글자 위쪽 8px 을 비우고 **아래로 4px 삐져나온다** (두 화면 동일)
     높이 메인 15px(.85em) / 키트 12px(.67em) — 시안이 서로 다르다
   ⚠️ 배경을 통째로 깔면(background: …) 글자가 다 덮여 형광펜이 아니라 '블록'으로 보인다.
      아래쪽에만 얇게 깔아야 강조로 읽힌다 → 크기·위치를 지정한 그라디언트를 쓴다.
   ⚠️ 단위는 em — 타입 스케일이 바뀌어도 비율이 유지된다.
   ⚠️ 줄이 접히면 조각마다 배경을 그려야 한다 → box-decoration-break */
.txt-hl {
    --hl-h: .8em;      /* 띠 높이 */
    --hl-drop: .22em;  /* 글자 아래로 내리는 정도 */
    background-image: linear-gradient(var(--c-main-100), var(--c-main-100));
    background-repeat: no-repeat;
    background-size: 100% var(--hl-h);
    background-position: 0 calc(100% + var(--hl-drop));
    -webkit-box-decoration-break: clone;
    box-decoration-break: clone;
}
.step-card-desc .txt-hl { --hl-h: .85em; }   /* 메인 STEP — 시안 15px */

/* ── BEST 8 ─────────────────────────────────────────── */
.best-grid {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: 48px var(--grid-gutter);
    margin-top: 50px;
}
.best-media { position: relative; border-radius: var(--r-md); overflow: hidden; }
.best-thumb {
    display: block; aspect-ratio: 1 / 1;
    background: var(--c-on-color);   /* 이미지가 들어가면 가려진다 */
}
/* 순위 뱃지 — page_img/메인.png 실측 (2026-08-12)
     · 모양은 **아래가 V자로 파인 리본**이라 CSS 도형으로 못 만든다 → 에셋 `rank_box.png` 사용
       (원본 80×92 = **2x** → 렌더 40×46)
     · 위치 — 카드 좌측에서 **15**, 위쪽은 **0**(카드 상단에 딱 붙는다)
     · 색 #231F20 = Sub_black · 숫자는 흰색
   ⚠️ 숫자를 리본 **직사각 부분**(위 40px)의 한가운데에 둔다 → 아래 V 만큼 padding-bottom 으로 뺀다.
      전체 높이(46)의 중앙에 두면 숫자가 뾰족한 부분으로 내려가 보인다.
   ⚠️ `<em>` 이라 브라우저 기본 이탤릭이 먹는다 → font-style 을 명시적으로 되돌린다. */
.best-rank {
    position: absolute; top: 0; left: 15px; z-index: 2;
    display: flex; align-items: center; justify-content: center;
    width: 40px; height: 46px; padding-bottom: 6px;
    background: url("../img/common/rank_box.png") no-repeat center / 40px 46px;
    border: 0; color: var(--c-on-color);
    font-size: var(--fs-sh2); font-weight: var(--fw-bold); font-style: normal; line-height: 1;
}
/* 호버 시 이미지 하단에 뜨는 액션 바 */
.best-hover {
    position: absolute; left: 0; right: 0; bottom: 0;
    display: flex; opacity: 0; transition: opacity .15s;
    pointer-events: none;
}
.best-media:hover .best-hover, .best-media:focus-within .best-hover { opacity: 1; pointer-events: auto; }
/* 액션바 실측: 높이 48 · 배경 Main/300 60%(이미지가 살짝 비친다) · 아이콘 에셋 2x → scale(.5) */
.best-act {
    flex: 1; height: 48px; background: var(--c-hover-bar);
    display: flex; align-items: center; justify-content: center;
}
.best-act > img {
    flex: 0 0 auto; max-width: none;      /* 전역 img { max-width: 100% } 가 2x 원본을 줄이지 않도록 */
    transform: scale(.5); transform-origin: center;
}
/* 장바구니 담기는 <form> 으로 감싸 제출한다(비 JS 환경에서도 동작).
   ⚠️ 그러면 폼이 flex 아이템이 되어 안쪽 버튼의 flex:1 이 먹지 않는다 → 아이콘이 왼쪽으로 쏠린다.
      폼도 액션바의 한 칸으로 취급한다.
   ⚠️ 칸 나눔은 `flex:1`(basis 0) 이 아니라 **basis 50%** 로 고정한다.
      basis 0 이면 구분선 border 2px 때문에 두 칸이 149/163 으로 갈렸다.
      50% 기준이면 border-box 라 테두리가 폭 안에 들어가 정확히 반반이 된다. */
.best-hover > * { flex: 1 1 50%; min-width: 0; }
.best-hover > form { display: flex; }
.best-hover > form > .best-act { flex: 1; }
/* 두 버튼 사이 구분선 — 시안은 바보다 '밝은' 흰 반투명이다(진한 보라 아님)
   ⚠️ 폼 래퍼가 끼어 있어 `.best-act + .best-act` 로는 잡히지 않는다 → 직접 자식 기준으로 그린다. */
.best-hover > * + * { border-left: 2px solid var(--c-dim); }

.best-body { margin-top: 16px; }
.best-name { display: block; font-size: var(--fs-sh15); font-weight: var(--fw-semibold); }
.best-desc {
    margin-top: 6px; font-size: var(--fs-body2); color: var(--c-gray-700);
    display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden;
}
.best-price { margin-top: 12px; }
.best-price del { display: block; font-size: var(--fs-body2); color: var(--c-gray-400); font-weight: var(--fw-medium);}
.best-price span { display: block; margin-top: 4px; font-size: var(--fs-sh1); font-weight: var(--fw-bold);  }
.best-price strong { font-weight: var(--fw-bold); }
.best-price .rate { color: var(--c-main-300); }

/* ── 유전자 검사 배너 ───────────────────────────────── */
/* ⚠️ 시안 바탕은 Sub_black(중성 검정)이 아니라 **어두운 보라 #2E233E** 다 (2026-08-12 실측).
   그 위에 DNA 이중나선 일러스트가 우측에 깔리는데 **에셋이 없어** 색만 맞춰 둔다.
   에셋이 들어오면 `.dna-banner-bg` 에 background-image 로 얹으면 된다. */
.dna-banner { position: relative; overflow: hidden; background: var(--c-dna-banner); }
.dna-banner-bg { position: absolute; inset: 0; }
.dna-banner-bg:empty::after { align-items: flex-start; padding-top: 16px; color: var(--c-text-tertiary); }
.dna-banner-inner {
    position: relative; z-index: 1;
    padding-top: 94px; padding-bottom: 84px; text-align: center;
}
.dna-banner-title { font-size: var(--fs-h2); font-weight: var(--fw-bold); color: var(--c-on-color); line-height: 1.45; }
.dna-banner-desc { margin-top: 24px; font-size: var(--fs-sh2); color: var(--c-gray-300); }
/* 배너 CTA — 실측 높이 **56** · pill · **반투명 흰 채움**(테두리 없음)
   ⚠️ 예전에는 '투명 배경 + 흰 테두리'(아웃라인)였다. 시안을 재 보니 버튼 안쪽이
      바탕보다 밝다(#2E233E → #4E455C ≒ 흰색 14%) → 테두리가 아니라 **채움**이다. */
.dna-banner-cta {
    --btn-h: 56px;
    margin-top: 44px; border-radius: 999px;
    background: var(--c-dim); border-color: transparent; color: var(--c-on-color);
}
.dna-banner-cta:hover { background: var(--c-dim-strong); }

/* ── EVENT ──────────────────────────────────────────── */
.event-grid {
    display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--grid-gutter);
    margin-top: 50px;
}
.event-card { position: relative; }
/* 배너 이미지에 문구가 들어 있어 **썸네일만** 노출한다 — 카드 위에 얹던 텍스트(.event-caption)는 없앴다.
   비율은 에셋(636×720 = 1.5x)과 같은 424/480. */
.event-thumb { display: block; aspect-ratio: 424 / 480; border-radius: var(--r-lg); }
/* 썸네일 미등록 카드에만 붙는 캡션 — 배너에 문구가 없어 무슨 이벤트인지 알 수 없기 때문이다.
   ⚠️ 썸네일이 등록된 카드에는 렌더되지 않는다(뷰에서 분기). 문구가 이미지 안에 들어 있어 중복이 된다. */
.event-info { margin-top: 16px; }
.event-name {
    font-size: var(--fs-sh2); font-weight: var(--fw-bold);
    line-height: 1.4; color: var(--c-text-primary);
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.event-period { margin-top: 6px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }

/* ── 메인 반응형 ────────────────────────────────────── */
@media (max-width: 1024px) {
    :root { --sec-pad: 100px; }
    .mhero-inner { min-height: 620px; }
    .mhero-text { max-width: 46%; }
    .best-grid { grid-template-columns: repeat(3, 1fr); }
    /* 카드가 좁아져 설명 첫 줄이 3줄로 접히므로 좌우 패딩만 줄인다(글자 크기는 시안 유지) */
    .step-cards { --step-gap: var(--grid-gutter); }
    .step-card-body { padding: 26px 24px 30px; }
}
@media (max-width: 768px) {
    :root { --sec-pad: 60px; }

    /* 히어로 — 모바일도 PC 와 똑같이 사진을 배경으로 깔되,
       여기서만 흰 막(--c-scrim)을 덮어 사진 위 글씨를 읽히게 한다(PC 는 막 없음).
       ⚠️ 예전에는 텍스트/이미지를 위아래로 분리(order 뒤집기)했었다 — 지금은 그 규칙이 없다. */
    .mhero-inner { min-height: 460px; padding-top: 48px; padding-bottom: 36px; }
    .mhero-text { max-width: none; }
    .mhero-title { margin-top: 16px; }
    .mhero-lead { margin-top: 16px; font-size: var(--fs-body2); }
    .mhero-actions { margin-top: 28px; }
    .mhero-actions .btn { flex: 1 1 100%; }
    /* 세로로 긴 화면에서 우측 앵커면 인물만 잡혀 제품이 안 보이므로 가운데로 맞춘다 */
    .mhero-visual > img,
    .mhero-visual > picture > img { object-position: center; }
    /* 사진 위 글씨를 읽히게 하는 흰 막 — **768 이하에서만** 깐다(PC 는 시안 그대로 사진만).
       이미지(z-index 없음) 위, 텍스트(.mhero-inner z-index 1) 아래에 깔린다.
       ⚠️ .mhero::after 를 다른 용도로 쓰지 말 것. */
    .mhero::after { content: ''; position: absolute; inset: 0; background: var(--c-scrim); }

    .msec-head { align-items: center; }
    .msec-title { margin-top: 6px; font-size: var(--fs-sh26);}
    /* 'View more' 를 본문 크기로 — 제목과 한 줄에 들어가야 제목이 2줄로 접히지 않는다 */
    .msec-more { font-size: var(--fs-body2); }
    .msec-more-ico { width: 20px; height: 20px; }

    /* ── STEP · EVENT — 세로 나열 대신 **가로 슬라이드** (2026-08-12) ─────────────
       카드 3장을 세로로 쌓으면 화면을 한참 스크롤해야 다음 섹션이 나온다.
       모바일에서는 손가락으로 밀어 보는 편이 자연스럽다.
       ⚠️ **JS 없이** 브라우저 기본 가로 스크롤 + 스크롤 스냅으로 만든다 —
          웹뷰·저사양 기기에서 가장 안정적이고, 관성 스크롤도 OS 가 알아서 해 준다.
       ⚠️ 컨테이너 좌우 여백(--page-margin)만큼 **밖으로 빼내고 안쪽으로 되돌려**
          트랙이 화면 끝까지 닿게 한다. 그래야 다음 카드가 가장자리에 살짝 걸쳐 보여
          "옆에 더 있다"는 신호가 된다.
       ⚠️ `overscroll-behavior-x: contain` — 끝까지 밀었을 때 브라우저 '뒤로가기' 제스처가
          발동하지 않게 막는다(안 막으면 마지막 카드에서 페이지가 이탈한다). */
    .step-cards, .event-grid {
        display: flex; flex-wrap: nowrap;
        overflow-x: auto; overscroll-behavior-x: contain;
        scroll-snap-type: x mandatory;
        -webkit-overflow-scrolling: touch;
        margin-left: calc(var(--page-margin) * -1);
        margin-right: calc(var(--page-margin) * -1);
        padding-left: var(--page-margin);
        scroll-padding-left: var(--page-margin);
        scrollbar-width: none;                 /* 스크롤바는 감춘다(카드가 잘려 보이는 게 신호다) */
    }
    .step-cards::-webkit-scrollbar,
    .event-grid::-webkit-scrollbar { display: none; }
    /* 끝 여백은 padding-right 가 아니라 **빈 flex 아이템**으로 만든다.
       ⚠️ 사파리(iOS 웹뷰)는 가로 스크롤 flex 컨테이너의 padding-right 를 무시해
          마지막 카드가 화면 끝에 딱 붙는다 — 이 방식이면 어느 브라우저에서나 같다. */
    .step-cards::after,
    .event-grid::after { content: ''; flex: 0 0 var(--page-margin); }
    /* 카드 폭 82% — 다음 카드가 가장자리에 걸쳐 보이게 하는 값 */
    .step-card, .event-card {
        flex: 0 0 82%; scroll-snap-align: start;
    }
    /* ⚠️ 카드에 그림자가 있어 트랙 위아래가 잘리면 안 된다 → 여유를 준다 */
    .step-cards { --step-gap: 16px; margin-top: 32px; padding-bottom: 8px; }
    .event-grid { padding-bottom: 8px; }

    /* 가로 슬라이드라 카드마다 가로 타임라인(선·점)이 그어지면 지저분하다 → 숨긴다
       ⚠️ 전체 이미지 카드(.is-full)는 가상요소 위치가 달라 **따로 꺼 줘야** 한다 (2026-08-13).
          기본 카드만 끄고 있어서 통이미지 카드에는 선이 그대로 남아 있었다. */
    .step-card-body { padding: 22px 20px 26px; }
    .step-card-body::before, .step-card-body::after,
    .step-card.is-full::before, .step-card.is-full::after { display: none; }

    .best-grid { grid-template-columns: repeat(2, 1fr); gap: 32px var(--grid-gutter); margin-top: 24px; }
    .best-hover { display: none; }          /* 터치 기기에서는 호버 액션을 숨긴다 */

    /* BEST 카드 — 2열이라 카드 폭이 PC(312)의 **절반 이하**(≈165)다.
       PC 실측값을 그대로 두면 뱃지·가격이 카드를 눌러 상품 사진이 답답해진다 → 비율을 맞춘다.
       ⚠️ 뱃지는 배경 이미지라 `background-size` 까지 같이 줄여야 한다(폭만 줄이면 잘린다). */
    .best-rank {
        left: 10px; width: 30px; height: 34px; padding-bottom: 4px;
        background-size: 30px 34px; font-size: var(--fs-body2);
    }
    .best-body { margin-top: 12px; }
    /* 카드가 좁아 간략설명이 한 줄로는 대부분 잘린다 → 두 줄까지 보여 준다 */
    .best-desc { -webkit-line-clamp: 2; line-clamp: 2; }
    /* 가격 줄 — sh1(22)이면 "10% 68,400원" 이 좁은 카드에서 어색하게 접힌다 */
    .best-price span { font-size: var(--fs-sh2); }

    .dna-banner-inner { padding-top: 60px; padding-bottom: 56px; }
    /* 부제는 제목(h2=24) 대비 너무 커 보인다 → 본문 크기로 */
    .dna-banner-desc { margin-top: 16px; font-size: var(--fs-body2); }
    .dna-banner-cta { margin-top: 28px; }

    /* ⚠️ grid-template-columns 는 flex 로 바뀌어 의미가 없다 — 간격만 STEP 과 맞춘다 */
    .event-grid { gap: 16px; margin-top: 24px; }
    .event-info { margin-top: 12px; }
    .event-name { font-size: var(--fs-body1); }
}

/* ⚠️ 아주 좁은 폰(≤360)에서 섹션 제목이 'View more' 와 부딪히는 것을 막는 보정.
   ⚠️ 2026-08-12 — 예전에는 `--fs-sh15` 였는데, 그 토큰의 모바일 값이 20→17 로 내려가면서
      섹션 제목이 본문(16)만 해졌다. 제목으로 읽히도록 sh2(18)로 고정한다.
   ⚠️ 프로젝트 브레이크포인트는 1024/768 두 개가 원칙이다 — 여기는 **글자 크기 보정만** 하는
      예외이고, 레이아웃 분기를 이 폭에 추가하지 않는다. */
@media (max-width: 360px) {
    .msec-title { font-size: var(--fs-sh2); }
}

/* ══ 맞춤 영양제 설문 (page_img/맞춤영양제.png) ═════════════════════════
   스텝 원 28 · 구분자 폭 142 · 제목 263 · 툴팁 305 · 카드 312×86(r12, gap 24) · 버튼 888(52)
   ⚠️ 스텝 인디케이터는 회원가입 스텝퍼와 다른 컴포넌트다(.survey-steps ↔ .stepper). */
/* 세로 위치는 시안 절대좌표 역산: 스텝 120 · 제목 256 · 툴팁 314 · 카드 412 · 버튼 888
   ⚠️ .survey 에 max-width 를 주지 말 것 — 스텝퍼는 약 874 로 카드 영역(648)보다 넓다.
      폭 제한은 카드 목록(.pick-list)에만 건다. */
/* ⚠️ .survey 를 flex 컨테이너로 만들지 말 것 (2026-08-14 실패 경험).
   버튼을 화면 하단으로 밀려고 flex + margin-top:auto 를 썼다가 **레이아웃이 깨졌다**:
     · .pick-list / .goal-list / .qbox 는 `max-width + margin:0 auto` 로 폭을 잡는데,
       flex 아이템은 **좌우 margin 이 auto 면 stretch 되지 않아** fit-content 로 쪼그라든다 → 카드가 좁아졌다
     · .survey-tip 은 inline-block(내용만큼 hug)인데 flex 아이템은 블록화되어 **전폭**이 됐다
   → 일반 블록 흐름을 유지하고, **여백 값만 화면 높이에 반응**하게 한다(아래 .survey-actions). */
.survey { padding: 18px 0 0; text-align: center; }

.survey-steps { display: flex; align-items: center; justify-content: center; }
.survey-step { flex: 0 0 auto; display: flex; align-items: center; gap: 25px; }
.survey-step-no {
    flex: 0 0 auto; width: 28px; height: 28px; border-radius: 50%;
    background: var(--c-gray-400); color: var(--c-on-color);
    font-size: var(--fs-sh2); font-weight: var(--fw-semibold);
    display: flex; align-items: center; justify-content: center;
}
.survey-step-label { font-size: var(--fs-sh15); font-weight: var(--fw-semibold); color: var(--c-gray-500); white-space: nowrap; }
/* 지난 단계(is-done)는 시안상 현재 단계와 같은 색이다 — 완료/현재를 구분하지 않는다 */
.survey-step.is-current .survey-step-no,
.survey-step.is-done .survey-step-no { background: var(--c-main-300); }
.survey-step.is-current .survey-step-label,
.survey-step.is-done .survey-step-label { color: var(--c-gray-900); }
/* 구분자는 여유가 없으면 줄어든다 — 고정폭이면 814px 같은 폭에서 스텝이 잘린다 */
.survey-sep { flex: 0 1 142px; min-width: 16px; color: var(--c-gray-400); font-size: var(--fs-sh2); }

.survey-q { margin-top: 108px; font-size: var(--fs-h3); font-weight: var(--fw-semibold); }

/* 말풍선 안내 — 꼬리는 위쪽 중앙 */
.survey-tip {
    position: relative; display: inline-block; margin-top: 21px;
    padding: 10px 24px; border-radius: 8px;
    background: var(--c-main-100); color: var(--c-main-300);
    font-size: var(--fs-body2); font-weight: var(--fw-semibold);
}
.survey-tip::before {
    content: ''; position: absolute; left: 50%; top: -8px; transform: translateX(-50%);
    border-left: 9px solid transparent; border-right: 9px solid transparent;
    border-bottom: 9px solid var(--c-main-100);
}

/* 선택 카드 — 카드 폭은 3컬럼(312), 2개 = 648 */
.pick-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--grid-gutter); max-width: 648px; margin: 56px auto 0; }
.pick {
    display: flex; align-items: center; justify-content: space-between;
    height: 86px; padding: 0 24px; border-radius: 12px;
    background: var(--c-gray-100); border: 1px solid transparent;
    cursor: pointer; transition: background-color .15s, border-color .15s, box-shadow .15s;
}
.pick-label { font-size: var(--fs-sh15); color: var(--c-text-primary); }
.pick:hover { border-color: var(--c-border-primary); }
/* 선택 상태 — 흰 배경 + Main/200 테두리 + 보라 그림자 */
.pick:has(.rdo:checked) {
    background: var(--c-bg-primary);
    border-color: var(--c-main-200);
    box-shadow: var(--shadow-primary);
}
.pick:has(.rdo:checked) .pick-label { font-weight: var(--fw-semibold); color: var(--c-gray-900); }

/* 🔄 2026-08-14 — 시안 고정값 390 → **화면 높이에 반응**하는 값.
   시안이 1920×1080 절대좌표라 낮은 화면(노트북 800·900)에서는 버튼이 접혀 내려가 스크롤해야 눌렸다.
   clamp(최소, 화면비례, 최대) — 화면이 낮으면 40 까지 줄고, 높아도 200 을 넘지 않는다.
   ⚠️ 레이아웃(폭·정렬)은 건드리지 않는다 — 여백 하나만 바꾼다. */
.survey-actions { margin-top: clamp(40px, 14vh, 200px); }
.survey-note { margin-top: 20px; font-size: var(--fs-sub1); color: var(--c-text-mute); }

@media (max-width: 768px) {
    .survey { padding-top: 24px; }
    /* 스텝은 폭이 좁아 현재 단계 라벨만 남긴다 */
    .survey-step-label { display: none; }
    .survey-step.is-current .survey-step-label { display: inline; font-size: var(--fs-body2); }
    .survey-sep { flex: 0 0 auto; padding: 0 10px; }
    .survey-step { gap: 8px; }

    .survey-q { margin-top: 48px; }
    .pick-list { margin-top: 36px; }
    .survey-actions { margin-top: 60px; }
    .survey-actions .btn { width: 100%; }
}

/* 설문 단독 입력 (page_img/맞춤영양제(2).png) — 648×56 · r12 · 어두운 테두리 */
.survey-field { max-width: 648px; margin: 85px auto 0; }
.survey-input {
    width: 100%; height: 56px; padding: 0 20px;
    border: 1px solid var(--c-gray-800); border-radius: 12px;
    background-color: var(--c-bg-primary);
    color: var(--c-text-primary); font-size: var(--fs-body1);
    transition: border-color .15s, box-shadow .15s;
}
.survey-input::placeholder { color: var(--c-text-tertiary); }
.survey-input:focus {
    outline: none; border-color: var(--c-main-200);
    box-shadow: 0 0 0 3px var(--c-focus-ring);
}
/* 버튼 2개(이전/다음) — 각 201, 간격 25
   🔄 2026-08-14 — 시안 고정값 457 → 화면 높이 반응값 (위 .survey-actions 와 같은 이유) */
.survey-actions.is-pair {
    display: flex; justify-content: center; gap: 25px; margin-top: clamp(40px, 14vh, 200px);
}
.survey-actions.is-pair .btn { min-width: 201px; }

@media (max-width: 768px) {
    .survey-field { margin-top: 40px; }
    .survey-actions.is-pair { gap: 10px; margin-top: 60px; }
    .survey-actions.is-pair .btn { flex: 1; min-width: 0; }
}

/* ══ 설문 2단계 — 건강 목표 (page_img/맞춤영양제_2건강목표(여성).png · (남성).png) ═══
   실측: 카드 206×80 · radius 10 · gap 16 · 4열 = 872
         (872 는 스텝퍼와 같은 폭이다. .pick-list 의 648 과 다르니 재사용하지 말 것)
         카드 안 = 아이콘 24 + 간격 8 + 라벨 SH2(18), 가로/세로 중앙
         ⚠️ 라벨을 16 으로 두면 글자폭이 좁아 내용 전체가 3px 밀린다(시안 실측 ≈18)
         선택 배지 18(Main/300 + 흰 체크) 우상단 10
   세로(시안 절대좌표 역산): 스텝 120 · 제목 263 · 부제 318 · 카드 392 · 버튼 888 */
.survey-sub { margin-top: 19px; font-size: var(--fs-sh2); color: var(--c-gray-800); }

.goal-list {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px;
    max-width: 872px; margin: 52px auto 0;
}
.goal {
    position: relative;
    display: flex; align-items: center; justify-content: center; gap: 8px;
    height: 80px; padding: 0 16px; border-radius: 10px;
    background: var(--c-gray-100); border: 1px solid transparent;
    cursor: pointer; transition: background-color .15s, border-color .15s, box-shadow .15s;
}
/* 네이티브 체크박스를 숨기고 카드 자체를 컨트롤로 쓴다(폼 전송·키보드 조작 유지) */
.goal-input { position: absolute; width: 0; height: 0; opacity: 0; }

/* 아이콘 24×24 — 에셋(assets/img/target/)이 **2x 라 scale(.5)** 로 축소한다.
   아이콘마다 원본 크기가 달라(46×28 ~ 35×47) width 를 지정할 수 없어 join_steps 와 같은 방식을 쓴다.
   off/on 두 벌을 겹쳐 두고 선택 상태에 따라 바꾼다(색을 CSS 로 바꾸지 않는다 — 네비 아이콘과 같은 규칙). */
.goal-ico { position: relative; flex: 0 0 auto; width: 24px; height: 24px; }
.goal-ico > img {
    position: absolute; top: 50%; left: 50%;
    max-width: none;                       /* 전역 img { max-width: 100% } 가 2x 원본을 줄이지 않도록 */
    transform: translate(-50%, -50%) scale(.5); transform-origin: center;
}
.goal-ico-on { opacity: 0; }
/* 관리자 등록 이미지(2026-08-07) — 원본 크기를 모르므로 24px 박스에 맞춰 담는다.
   🔄 2026-08-13 — 관리자도 **기본/선택 2장**을 올릴 수 있게 되어 시드 아이콘과 같은 off/on 전환을 탄다.
   ⚠️ 두 장을 겹쳐야 하므로 `position: static` 이면 안 된다(세로로 쌓여 카드가 늘어난다).
   ⚠️ 크롭 방지로 **contain** 을 쓴다 — cover 면 정사각형이 아닌 아이콘의 가장자리가 잘린다.
   선택 이미지를 등록하지 않으면 on = off 라 그림은 그대로고 테두리·체크 배지로만 구분된다. */
.goal-ico.is-photo > img {
    position: absolute; top: 0; left: 0;
    width: 100%; height: 100%;
    transform: none; object-fit: contain;
}

.goal-label { font-size: var(--fs-sh2); color: var(--c-gray-800); white-space: nowrap; }

.goal:hover { border-color: var(--c-border-primary); }
/* 선택 상태 — 흰 배경 + Main/200 테두리 + 보라 그림자 (.pick 과 같은 규칙) */
.goal:has(.goal-input:checked) {
    background: var(--c-bg-primary);
    border-color: var(--c-main-200);
    box-shadow: var(--shadow-primary);
}
.goal:has(.goal-input:checked) .goal-label { color: var(--c-text-primary); }
.goal:has(.goal-input:checked) .goal-ico-off { opacity: 0; }
.goal:has(.goal-input:checked) .goal-ico-on { opacity: 1; }
.goal::after {
    /* 9 = 시안의 10 − 테두리 1 (기준이 카드 padding-box 라 1px 안쪽에서 시작한다) */
    content: ''; position: absolute; top: 9px; right: 9px;
    width: 18px; height: 18px; border-radius: 50%;
    background: var(--c-primary) url(../img/common/chk_icon.png) no-repeat center / 10px auto;
    opacity: 0; transition: opacity .15s;
}
.goal:has(.goal-input:checked)::after { opacity: 1; }
.goal:has(.goal-input:focus-visible) { box-shadow: 0 0 0 3px var(--c-focus-ring); }

/* 이 화면만 카드 하단(760) → 버튼(888) 간격이 128 이다
   🔄 2026-08-14 — 목표 카드가 최대 4줄이라 내용이 이미 길다 → 다른 화면보다 작은 값으로 잡는다 */
.goal-list + .survey-actions.is-pair { margin-top: clamp(32px, 6vh, 96px); }

@media (max-width: 1024px) {
    .goal-list { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 768px) {
    .survey-sub { margin-top: 12px; }
    .goal-list { grid-template-columns: repeat(2, 1fr); gap: var(--grid-gutter); margin-top: 36px; }
    .goal { height: 72px; padding: 0 10px; }
    /* 좁은 폭에서 '호르몬(갱년기)' 가 넘치지 않도록 줄바꿈을 허용한다 */
    .goal-label { white-space: normal; }
    .goal-list + .survey-actions.is-pair { margin-top: 60px; }
}

/* ══ 설문 3단계 — 설문 진행 (page_img/맞춤영양제_3설문조사.png) ══════════
   실측: 콘텐츠 폭 872(2단계와 같은 폭)이지만 이 화면만 **좌측 정렬**이다.
         진행률 카드 872×89 · r16 · 1px Gray/200 + --shadow · 패딩 24 · 막대 6(pill)
         뱃지 pill 64×33(좌우 14) · 보기 카드 872×60 · r12 · gap 15 · 패딩 0 24
         체크 배지 18 은 우측 24, 세로 중앙
   세로(시안 절대좌표): 스텝 120 · 카드 194 · 뱃지 329 · 질문글자 387 · 보기 476 · 버튼 888 */
.qbox { max-width: 872px; margin: 0 auto; text-align: left; }

/* 진행률 카드 */
.qprog {
    margin-top: 46px; padding: 24px; border-radius: var(--r-lg);
    background: var(--c-surface); border: 1px solid var(--c-gray-200); box-shadow: var(--shadow);
    font-weight: var(--fw-medium);
}
.qprog-head { display: flex; align-items: baseline; justify-content: space-between; }
/* 1.375 = 16px 기준 정확히 22px 줄높이. 본문 1.55 로 두면 글자가 3px 내려가고,
   소수점이 남으면 아래 요소가 통째로 0.4px 밀린다. */
.qprog-count, .qprog-pct { line-height: 1.375; font-size: var(--fs-body1);  font-weight: var(--fw-medium);}
.qprog-count { color: var(--c-gray-600); }
.qprog-count strong { font-weight: var(--fw-bold); color: var(--c-text-primary); }
.qprog-pct { font-weight: var(--fw-bold); color: var(--c-primary); }
.qbar { margin-top: 11px; height: 6px; border-radius: 999px; background: var(--c-gray-200); }
.qbar-fill { display: block; height: 100%; border-radius: 999px; background: var(--c-primary); }

/* 건강 목표 뱃지 — pill */
.qgoal {
    display: inline-block; margin-top: 46px; padding: 6px 14px; border-radius: 999px;
    background: var(--c-main-100); color: var(--c-primary);
    font-size: var(--fs-body2); font-weight: var(--fw-semibold); line-height: 1.5;
}
.qtitle { margin-top: 17px; font-size: var(--fs-h3); font-weight: var(--fw-semibold); color: var(--c-gray-900);}

/* 보기 카드 — 선택 규칙은 .goal 과 같다(흰 배경 + Main/200 + 보라 그림자 + 체크 배지) */
.qopts { display: grid; gap: 15px; margin-top: 55px; }
.qopt {
    position: relative; display: flex; align-items: center;
    height: 60px; padding: 0 24px; border-radius: var(--r-md);
    background: var(--c-gray-100); border: 1px solid transparent;
    cursor: pointer; transition: background-color .15s, border-color .15s, box-shadow .15s;
}
.qopt-input { position: absolute; width: 0; height: 0; opacity: 0; }
.qopt-label { font-size: var(--fs-sh2); color: var(--c-gray-800); }

.qopt:hover { border-color: var(--c-border-primary); }
.qopt:has(.qopt-input:checked) {
    background: var(--c-bg-primary);
    border-color: var(--c-main-200);
    box-shadow: var(--shadow-primary);
}
.qopt:has(.qopt-input:checked) .qopt-label { color: var(--c-text-primary); }
.qopt::after {
    /* 23 = 시안의 24 − 테두리 1 (기준이 padding-box) */
    content: ''; position: absolute; top: 50%; right: 23px; transform: translateY(-50%);
    width: 18px; height: 18px; border-radius: 50%;
    background: var(--c-primary) url(../img/common/chk_icon.png) no-repeat center / 10px auto;
    opacity: 0; transition: opacity .15s;
}
.qopt:has(.qopt-input:checked)::after { opacity: 1; }
.qopt:has(.qopt-input:focus-visible) { box-shadow: 0 0 0 3px var(--c-focus-ring); }

/* 보기 하단(686) → 버튼(888)
   🔄 2026-08-14 — 문항·보기로 내용이 이미 길다 → 다른 화면보다 작은 값으로 잡는다 */
.qopts + .survey-actions.is-pair { margin-top: clamp(32px, 8vh, 120px); }

/* ══ 설문 4단계 — 추천 결과 (page_img/맞춤영양제_4추천결과.png) ══════════
   실측: 카드 872×148 · r16 · 1px Gray/300 · gap 15
         순위 28(메달 에셋 2x → scale(.5)) · 이미지 100×100(r8, 1px Gray/200, Gray/100)
         뱃지 pill 높이 23(좌우 9, 간격 6) · 카트 46(에셋 2x)
         하단 버튼 424 × 2, 간격 24(= 그리드 거터)
   세로: 제목 263 · 부제 318 · 카드 396 · 버튼 2067 */
/* 🔄 2026-08-14 — 카드 규격을 **나의 맞춤 영양제(P-406 / `.rv-card`)** 와 통일했다.
   같은 "추천 영양제 목록"인데 한쪽은 148px 고정 높이·썸네일 100, 다른 쪽은 내용 높이·썸네일 80 이라
   두 화면을 오가면 다른 화면처럼 보였다.
   맞춘 값 — 항목 간격 20 · 카드 padding 20/24 · 요소 간격 20 · 썸네일 80 · radius --r-md
   ⚠️ 시안(page_img/맞춤영양제_4추천결과.png) 실측값(높이 148 · 좌25/우29 비대칭 패딩 · 썸네일 100)에서
      **의도적으로 벗어났다.** 시안 복원이 필요하면 이 블록만 되돌리면 된다.
   ⚠️ 순위(메달)·담기 토글은 이 화면 고유 기능이라 그대로 둔다. */
.rec-list { display: flex; flex-direction: column; gap: 20px; max-width: 872px; margin: 56px auto 0; text-align: left; }
.rec-card {
    display: flex; align-items: center; gap: 20px;
    border-radius: var(--r-md);
    background: var(--c-surface); border: 1px solid var(--c-line);
    padding: 20px 24px;
}
/* 순위 — 1~3위 메달, 4위부터 텍스트 */
.rec-rank {
    position: relative; flex: 0 0 28px; height: 40px;
    display: flex; align-items: center; justify-content: center;
    font-size: var(--fs-body2); color: var(--c-text-disabled);
}
.rec-medal {
    position: absolute; top: 50%; left: 50%;
    max-width: none;                        /* 전역 img { max-width: 100% } 가 2x 원본을 줄이지 않도록 */
    transform: translate(-50%, -50%) scale(.5); transform-origin: center;
}
/* 상품 이미지 — 80 정사각(`.rv-thumb` 와 같은 크기). 여백은 카드의 gap 이 준다 */
.rec-thumb {
    flex: 0 0 80px; width: 80px; height: 80px; overflow: hidden;
    border: 1px solid var(--c-gray-200); border-radius: var(--r-sm); background: var(--c-gray-100);
}
.rec-thumb > img { display: block; width: 100%; height: 100%; object-fit: cover; }
/* 썸네일·상품명 → 영양제 상세 (2026-08-10)
   ⚠️ `a.rec-thumb { display:block }` 을 두지 않는다 — 특이도가 `.is-thumb-empty`(display:flex)보다
      높아 **로고 자리표시자의 가운데 정렬을 깨뜨린다**(실제로 로고가 좌상단에 붙었다).
      `.rec-thumb` 는 flex 아이템이라 `<a>` 여도 자동으로 블록화되므로 규칙 자체가 필요 없다. */
.rec-name > a:hover { text-decoration: underline; }


.rec-body { flex: 1 1 auto; min-width: 0; }
.rec-grade, .rec-goal {
    display: inline-flex; align-items: center; height: 23px; padding: 0 9px; border-radius: 999px;
    font-size: var(--fs-sub0); font-weight: var(--fw-semibold); white-space: nowrap;
}
.rec-grade.is-strong { background: var(--c-red-main); color: var(--c-on-color); }
.rec-grade.is-normal { background: var(--c-sub-gold); color: var(--c-on-color); }
.rec-goal { background: var(--c-main-100); color: var(--c-primary); }
/* 이름 + 뱃지 한 줄 (`.rv-name` 과 같은 구성) */
.rec-name {
    display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
    font-size: var(--fs-sh15); font-weight: var(--fw-bold); color: var(--c-text-primary);
}
/* ⚠️ 말줄임(1줄)을 걷어냈다 — `.rv-reason` 처럼 **줄바꿈해서 다 보여 준다**.
   카드 높이가 고정이 아니라 길어져도 잘리지 않는다. */
.rec-reason { margin-top: 10px; font-size: var(--fs-body2); color: var(--c-text-secondary); line-height: 1.6; }

/* 장바구니 담기 — 기본/호버/담김 3벌 에셋을 교체한다(색을 CSS 로 바꾸지 않는다) */
.rec-cart {
    /* ⚠️ 좌측 여백은 카드의 gap 이 준다 — margin 을 함께 두면 간격이 두 번 들어간다 (2026-08-14) */
    flex: 0 0 46px; width: 46px; height: 46px; padding: 0; border: 0;
    border-radius: 50%; cursor: pointer;
    background: url(../img/common/cart_icon_off.png) no-repeat center / 46px 46px;
}
.rec-cart:hover { background-image: url(../img/common/cart_icon_hover.png); }
.rec-cart.is-on  { background-image: url(../img/common/cart_icon_on.png); }
.rec-cart:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }
/* 담기 버튼을 <form> 으로 감싸면서(2026-08-10) **폼이 플렉스 아이템**이 됐다 —
   크기·좌측 여백은 폼이 갖고 버튼은 그 안을 채운다(여백이 두 번 들어가지 않게).
   옵션 상품은 폼 없이 <a class="rec-cart is-option"> 라 기존 규칙을 그대로 쓴다. */
.rec-cart-form { flex: 0 0 46px; }
.rec-cart.is-option { display: block; }

/* 🐛 2026-08-11 — 2열 고정 그리드(`1fr 1fr`)였다.
   [마지막 추천 영양제 보기](4-6)가 붙어 3개가 되자 **3번째가 다음 줄 왼쪽에 반쪽으로** 떨어졌다.
   버튼 개수가 상황에 따라 2~3개로 달라지므로(추천 이력 없으면 2개) 개수에 맞춰 줄을 고르게 채운다.
   ⚠️ 주문 내역(P-402·P-403) 버튼 줄에서 같은 이유로 이미 flex 로 바꾼 적이 있다 — 같은 방식으로 맞춘다. */
.rec-actions {
    display: flex; gap: var(--grid-gutter);
    max-width: 872px; margin: 56px auto 0;
}
/* 폼으로 감싼 버튼([설문 다시하기])도 같은 몫을 갖도록 **직계 자식**에 건다 */
.rec-actions > * { flex: 1 1 0; min-width: 0; }
.rec-actions .btn { width: 100%; }

@media (max-width: 768px) {
    /* 축소 규격도 `.rv-card` 모바일 값과 같게 — 여백 16 · 간격 14 · 썸네일 64 */
    .rec-list { margin-top: 28px; gap: 20px; }
    .rec-card { padding: 16px; gap: 14px; align-items: flex-start; }
    .rec-rank { height: 32px; }
    .rec-thumb { flex-basis: 64px; width: 64px; height: 64px; }
    .rec-actions { flex-direction: column; gap: 10px; margin-top: 36px; }
    .rec-actions > * { flex: 0 0 auto; }   /* 위 .od-actions 와 같은 이유 */
}

@media (max-width: 768px) {
    .qprog { margin-top: 24px; padding: 18px; }
    .qgoal { margin-top: 28px; }
    .qtitle { margin-top: 14px; }
    .qopts { margin-top: 28px; gap: 10px; }
    .qopt { height: 56px; padding: 0 16px; }
    .qopt::after { right: 15px; }
    .qopts + .survey-actions.is-pair { margin-top: 60px; }
}

/* ══ 배너 팝업 (관리자 등록형) ═════════════════════════════════════════
   팝업 648 · r12 · 이미지 648×480(에셋 972×720 = 1.5x) · 하단바 56
   z-index 150 — 헤더(100)·하단탭(120) 위, 토스트(200) 아래.
   ⚠️ 노출 판정 전에는 마크업이 hidden 이다(숨김 처리된 팝업이 깜빡이지 않게). */
.popup-dim {
    position: fixed; inset: 0; z-index: 150;
    display: flex; align-items: center; justify-content: center;
    padding: var(--page-margin);
    background: var(--c-backdrop);
    overflow: auto;
}
.popup-dim[hidden] { display: none; }        /* flex 가 hidden 을 덮지 않도록 */

.popup {
    flex: 0 0 auto; width: 648px; max-width: 100%;
    border-radius: var(--r-md); overflow: hidden;
    background: var(--c-surface);
}

/* ── 슬라이드 (2건 이상 등록 시) — 2026-08-12 ──────────────────────
   상자는 하나고 **미디어만** 넘어간다. 하단바(오늘 하루 보지 않기 · 닫기)는 공용이다.
   ⚠️ 트랙이 flex 라 슬라이드 높이가 **가장 큰 이미지에 맞춰진다**.
      비율이 크게 다른 이미지를 섞으면 짧은 쪽 아래에 여백이 생긴다 — 등록 크기를 맞추는 편이 좋다.
   ⚠️ 화살표·인디케이터는 JS 가 만든다(1건이면 만들지 않는다). */
.popup-view { position: relative; overflow: hidden; }
.popup-track {
    display: flex; align-items: flex-start;
    transition: transform .35s ease;
    /* ⚠️ 드래그로 넘기려면 브라우저에게 **가로 제스처를 넘겨 달라**고 알려야 한다.
       `pan-y` 라서 세로 스크롤은 그대로 브라우저가 처리한다 — 팝업이 페이지 스크롤을 잡아먹지 않는다. */
    touch-action: pan-y;
    -webkit-user-select: none; user-select: none;   /* 드래그 중 글자가 선택되지 않게 */
}
.popup-slide { flex: 0 0 100%; min-width: 0; }
.popup-media img { -webkit-user-drag: none; }       /* 이미지 자체가 끌려나가지 않게(JS 에서도 막는다) */
.popup-view.is-slider .popup-track { cursor: grab; }
.popup-view.is-slider .popup-track:active { cursor: grabbing; }

.popup-nav {
    position: absolute; top: 50%; transform: translateY(-50%);
    width: 36px; height: 36px; padding: 0;
    display: flex; align-items: center; justify-content: center;
    border: 0; border-radius: 50%;
    background: var(--c-backdrop); color: var(--c-on-color);
    cursor: pointer;
}
.popup-nav svg { width: 18px; height: 18px; }
.popup-nav.is-prev { left: 12px; }
.popup-nav.is-next { right: 12px; }
.popup-nav:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }

/* 인디케이터 — **콘텐츠(이미지) 위 하단 가운데** (2026-08-12 하단바에서 옮김)
   ⚠️ 어떤 이미지 위에 얹힐지 알 수 없다 → 알약 배경(딤)을 깔아 밝은 이미지에서도 읽히게 한다.
      점 색도 회색이 아니라 **흰색 계열**이다(딤 위라서). */
.popup-dots {
    position: absolute; left: 50%; bottom: 16px; transform: translateX(-50%);
    z-index: 1;
    display: flex; align-items: center; gap: 6px;
    padding: 7px 10px; border-radius: 999px;
    background: var(--c-backdrop);
}
.popup-dot {
    width: 8px; height: 8px; padding: 0;
    border: 0; border-radius: 50%;
    background: var(--c-scrim); cursor: pointer;
    transition: background-color .15s, width .15s;
}
.popup-dot.is-on { width: 18px; border-radius: 4px; background: var(--c-on-color); }
.popup-dot:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }

/* 에디터(내용) 타입은 이미지가 없어 글이 인디케이터에 가릴 수 있다 → 아래를 비워 준다 */
.popup-view:has(.popup-dots) .popup-text { padding-bottom: 56px; }

.popup-media { display: block; }
.popup-media > img { display: block; width: 100%; height: auto; }

/* 에디터(내용) 타입 — 시안에는 이미지형만 있으나 관리자 팝업은 2종을 지원한다(F-909).
   이미지가 없을 때 빈 상자가 되지 않도록 최소 조판만 둔다. */
.popup-text { padding: 36px 32px; text-align: center; }
.popup-text-title {
    display: block; margin-bottom: 12px;
    font-size: var(--fs-sh2); font-weight: 600; color: var(--c-text-primary);
}
.popup-text-body { font-size: var(--fs-body2); color: var(--c-text-secondary); }

.popup-foot {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    height: 56px; padding: 0 20px;
}
.popup-hide {
    display: inline-flex; align-items: center; gap: 8px; cursor: pointer;
    font-size: var(--fs-body2); color: var(--c-text-secondary);
}
.popup-close { padding: 0; font-size: var(--fs-body2); color: var(--c-text-primary); }
.popup-close:hover { color: var(--c-primary); }
.popup-close:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); border-radius: var(--r-sm); }

@media (max-width: 768px) {
    .popup-dim { align-items: flex-start; padding-top: 60px; }
    .popup-foot { height: 52px; padding: 0 16px; }
    .popup-text { padding: 28px 20px; }
    /* 좁은 화면에서는 화살표가 이미지를 많이 가린다 — 줄이고 붙인다(스와이프가 주 조작이다) */
    .popup-nav { width: 30px; height: 30px; }
    .popup-nav svg { width: 15px; height: 15px; }
    .popup-nav.is-prev { left: 8px; }
    .popup-nav.is-next { right: 8px; }
    .popup-dots { bottom: 12px; padding: 6px 9px; }
    .popup-view:has(.popup-dots) .popup-text { padding-bottom: 48px; }
}

/* 움직임을 줄여 달라는 설정이면 슬라이드 전환을 즉시 처리한다 */
@media (prefers-reduced-motion: reduce) {
    .popup-track, .popup-dot { transition: none; }
}

/* ══ 햄버거 · 전체 메뉴 드로어 ═══════════════════════════════════════
   ⚠️ GNB 는 1024 이하에서 숨고 하단 탭바는 768 이하에서만 뜬다 →
      **769~1024 구간에 메뉴 진입점이 아예 없었다.** 그 구멍을 이 드로어가 메운다.
   ⚠️ navigation_guide.png 에 드로어 시안이 없어 공용 토큰으로 구성했다(시안이 오면 스타일만 교체).
   z-index 160 — 헤더(100)·하단탭(120)·팝업(150) 위, 토스트(200) 아래. */
/* 시안: 막대 3줄 · 두께 2 · 간격 5(피치 7) · **가운데 막대만 짧고 좌측 정렬**(22 / 16 / 22).
   좌측을 맞추려고 padding 으로 내용 영역을 22 로 만들고 flex-start 로 붙인다. */
.hd-menu {
    display: none;                      /* 1025 이상은 GNB 가 있으므로 숨긴다 */
    flex: 0 0 auto; width: 24px; height: 24px; padding: 0 1px;
    flex-direction: column; align-items: flex-start; justify-content: center; gap: 5px;
}
.hd-menu-bar { display: block; width: 22px; height: 2px; border-radius: 2px; background: var(--c-icon-primary); }
.hd-menu-bar:nth-child(2) { width: 16px; }
.hd-menu:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); border-radius: var(--r-sm); }

.drawer {
    position: fixed; inset: 0; z-index: 160;
    background: var(--c-backdrop);
    visibility: hidden; opacity: 0;
    transition: opacity .2s, visibility .2s;
}
.drawer.is-open { visibility: visible; opacity: 1; }

.drawer-panel {
    position: absolute; top: 0; right: 0; bottom: 0;
    width: min(320px, 84vw);
    display: flex; flex-direction: column;
    background: var(--c-surface);
    transform: translateX(100%); transition: transform .25s;
}
.drawer.is-open .drawer-panel { transform: none; }

.drawer-head {
    flex: 0 0 auto; height: var(--header-h);
    display: flex; align-items: center; justify-content: space-between;
    padding: 0 var(--page-margin);
    box-shadow: 0 1px 0 var(--c-divider);
}
.drawer-title { font-size: var(--fs-body1); font-weight: var(--fw-bold); }
.drawer-close { padding: 0; width: 24px; height: 24px; font-size: var(--fs-body1); color: var(--c-icon-primary); }
.drawer-close:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); border-radius: var(--r-sm); }

.drawer-nav { flex: 1 1 auto; overflow-y: auto; padding: 8px 0; }
.drawer-link {
    display: block; padding: 16px var(--page-margin);
    font-size: var(--fs-body1); font-weight: var(--fw-medium); color: var(--c-text-primary);
}
.drawer-link:hover { background: var(--c-gray-100); }
.drawer-link.is-active { color: var(--c-primary); font-weight: var(--fw-bold); }

.drawer-foot {
    flex: 0 0 auto; display: grid; grid-template-columns: 1fr 1fr; gap: 10px;
    padding: 16px var(--page-margin);
    padding-bottom: calc(16px + env(safe-area-inset-bottom));
    box-shadow: 0 -1px 0 var(--c-divider);
    align-items: center;justify-content: center;
}
.drawer-foot .btn { width: 100%; }
/* 🐛 2026-08-14 — 장바구니 개수가 0이면 span 을 **아예 뺀다.**
   `.btn` 은 inline-flex + `gap: var(--btn-gap)`(btn-lg 12px) 이라 **빈 요소도 flex 아이템**이라
   gap 이 그대로 붙어, 글자가 gap 의 절반만큼 왼쪽으로 치우쳐 보였다.
   `visibility: hidden` 이나 폭 0 으로는 안 된다 — 아이템으로 남으면 gap 도 남는다. */
[data-cart-count-text]:empty { display: none; }

@media (max-width: 1024px) {
    .hd-menu { display: flex; }
}
/* ⚠️ 레이아웃 브레이크포인트가 **아니다**(1024/768 두 개 규칙은 그대로).
   300px 이하에서는 로고+로그인+햄버거가 헤더에 다 들어가지 않아 로그인 버튼만 뺀다.
   드로어 하단에 회원가입/로그인이 있어 진입 경로는 유지된다. */
@media (max-width: 300px) {
    .hd-login { display: none; }
}

/* ══ 유전자 검사 (상품 목록) — page_img/유전자검사.png ═══════════════════
   실측: 배너 전폭 400 · HOW TO 카드 312×267(r24, 거터 24) · 상품 이미지 312×350(r20)
         섹션 상하 여백 140 · 카드/상품 모두 3컬럼(312) × 4열
   ⚠️ 시안에 검색·카테고리·정렬·페이지네이션이 없다. */
.kit-hero { position: relative; overflow: hidden; background: var(--c-gray-200); }
.kit-hero-visual { position: absolute; inset: 0; }
.kit-hero-visual > img { object-position: right center; }
.kit-hero-inner {
    position: relative; z-index: 1;      /* 이미지 위에 얹힌다 */
    min-height: 400px; display: flex; flex-direction: column; justify-content: center;
    padding-bottom: 8px;                 /* 시안 텍스트 블록이 정중앙보다 4px 위 */
}
.kit-hero-title { font-size: var(--fs-h1); font-weight: var(--fw-bold); color: var(--c-gray-900); }
.kit-hero-lead { margin-top: 10px; font-size: var(--fs-body1); color: var(--c-gray-800); }

/* 섹션 공통 — 상하 140 */
.kit-how, .kit-products { padding: 140px 0; }
/* 아주 옅은 세로 그라디언트(흰색 → Gray/50). 시안 실측 255 → 252 */
.kit-how { background: linear-gradient(180deg, var(--c-bg-primary), var(--c-gray-50)); }
.kit-products { padding-bottom: 180px; }

/* 섹션 머리말 — ⚠️ 메인의 `.msec-eyebrow`(Body2)와 달리 이 시안은 SH2(18) 다 */
.kit-eyebrow { font-size: var(--fs-sh2); font-weight: var(--fw-bold); color: var(--c-main-300); letter-spacing: .5px; }
.kit-eyebrow.ver2 {font-size: var(--fs-body1);}
.kit-eyebrow.is-center { text-align: center; }
.kit-title { margin-top: 10px; font-size: var(--fs-h40); font-weight: var(--fw-bold); line-height: 1.45; color: var(--c-gray-900);}
.kit-title.ver2 {font-size: var(--fs-h3);}
.kit-title.is-center { text-align: center; }
/* 두 번째 줄은 굵기가 낮다(시안) */
.kit-title em { font-weight: var(--fw-regular); }

/* HOW TO 카드 */
.kit-steps {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--grid-gutter);
    margin-top: 56px;
}
.kit-step {
    min-height: 267px; padding: 36px 30px;
    background: var(--c-surface); border: 1px solid transparent; border-radius: 24px;
    box-shadow: var(--shadow-card);
    transition: transform .15s, border-color .15s;
}
.kit-step:hover { transform: translateY(-8px); border-color: var(--c-main-200); }
/* 글자 크기는 자기 렌더를 자로 삼아 역산했다 — 시안 실측 뱃지 ≈17.2 · 제목 ≈29 · 설명 ≈17.5 */
.kit-step-no {
    display: inline-block; padding: 7px 17px; border-radius: 999px;
    background: var(--c-main-100); color: var(--c-main-300);
    font-size: var(--fs-sh2); font-weight: var(--fw-semibold);
}
.kit-step-title { margin-top: 46px; font-size: var(--fs-h30); font-weight: var(--fw-bold); }
.kit-step-desc { margin-top: 19px; font-size: var(--fs-sh2); color: var(--c-gray-800); line-height: 1.4; }
.kit-step-desc .txt-hl { --hl-h: .67em; }    /* HOW TO — 시안 12px (메인보다 얇다) */

/* 상품 카드 — 이미지 312×350(r20) + 이름 + 설명 + 가격
   ⚠️ 메인 BEST 의 `.pcard`(뱃지·평점 포함)와 다른 컴포넌트다. 재사용하지 말 것. */
.kit-grid {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: 56px var(--grid-gutter);
    /* ⚠️ 28 은 시안(50 남짓)보다 작다 — 이 섹션 제목이 시안 실측 ≈31 인데 스케일상 H2(36) 를 쓰느라
       위쪽이 9px 더 차지한다. 그만큼 빼서 상품 이미지 시작 위치를 시안에 맞춘다. */
    margin-top: 28px;
}
.kit-thumb {
    display: block; aspect-ratio: 312 / 350;
    border-radius: 20px; background: var(--c-gray-100);
}
/* 글자 크기는 같은 문자열을 렌더해 비교했다 — 시안 실측 이름 ≈19 · 설명 ≈13.5 · 가격 ≈23 */
.kit-name { display: block; margin-top: 20px; font-size: var(--fs-sh2); font-weight: var(--fw-bold); line-height: 1.4; color: var(--c-text-primary); }
.kit-desc { margin-top: 5px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.kit-price { margin-top: 7px; }
.kit-price del { display: block; font-size: var(--fs-body2); line-height: 1.2; }
.kit-price span { display: block; margin-top: 1px; font-size: var(--fs-sh1); font-weight: var(--fw-bold); line-height: 1.2; }
.kit-price .rate { margin-right: 8px; color: var(--c-primary); }

@media (max-width: 1024px) {
    .kit-how, .kit-products { padding: 100px 0; }
    .kit-products { padding-bottom: 120px; }
    .kit-steps { grid-template-columns: repeat(2, 1fr); margin-top: 48px; }
    .kit-grid { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 768px) {
    .kit-hero-inner { min-height: 260px; }
    .kit-hero-lead { margin-top: 14px; font-size: var(--fs-body2); }
    .kit-how, .kit-products { padding: 60px 0; }
    .kit-products { padding-bottom: 80px; }
    .kit-steps { grid-template-columns: 1fr; gap: 16px; margin-top: 32px; }
    .kit-step { min-height: 0; padding: 24px 20px; }
    .kit-step-title { margin-top: 18px; }
    .kit-step-desc { margin-top: 14px; }
    /* 🔄 2026-08-27 (요청 1) — 모바일도 **한 줄에 한 상품**. PC 와 같은 가로 카드다.
       2열 세로 카드는 키트가 1~2종뿐이라 칸이 비어 보이고 이름·가격이 잘게 접혔다.
       ⚠️ 그리드 아이템은 기본이 min-width:auto 라 내용(가격 한 줄)보다 좁아지지 못한다.
          0 으로 풀지 않으면 좁은 폭에서 카드가 줄지 않고 가로로 넘친다(실제 발생했던 버그). */
    .kit-grid { grid-template-columns: 1fr; gap: 12px; margin-top: 24px; }
    .kit-card {
        display: grid; grid-template-columns: 96px minmax(0, 1fr); column-gap: 14px;
        min-width: 0; padding: 14px;
        border: 1px solid var(--c-gray-200); border-radius: 16px; background: var(--c-surface);
    }
    /* 썸네일은 세 줄(이름·설명·가격)에 걸쳐 왼쪽에 선다 — 비율(312:350)은 그대로 */
    .kit-thumb { grid-column: 1; grid-row: 1 / span 3; align-self: start; border-radius: 12px; }
    .kit-name  { grid-column: 2; grid-row: 1; margin-top: 0; font-size: var(--fs-body1); }
    .kit-desc  { grid-column: 2; grid-row: 2; margin-top: 6px; }
    .kit-price { grid-column: 2; grid-row: 3; margin-top: 8px; }
    .kit-price span { display: flex; flex-wrap: wrap; align-items: baseline; font-size: var(--fs-sh2); }
}

/* ══ 키트 목록 — PC 가로형 1컬럼 리스트 (2026-08-25 · 클라이언트 요청 #10) ═══════════
   4열 카드 그리드였는데 키트가 1~2종뿐이라 우측이 통째로 비어 보였다.
   → PC 는 **한 줄에 한 상품**, 이미지 왼쪽 · 정보 오른쪽으로 가로 배치한다.
   · 모바일(≤768)은 기존 2열 세로 카드 그대로 — 위 블록이 그대로 적용된다.
   · 썸네일 비율은 312:350 을 유지한다(폭만 260 으로 줄임) — 등록 이미지의 크롭 기준을 바꾸지 않으려는 것.
   · `min-width: 769px` 이라 위쪽 `max-width: 1024px` 의 3열 규칙보다 **뒤에 와야** 이긴다.
     ⚠️ 이 블록을 키트 CSS 위쪽으로 옮기지 말 것. */
@media (min-width: 769px) {
    .kit-grid { grid-template-columns: 1fr; gap: 20px; margin-top: 32px; }

    /* 좌: 썸네일 / 가운데: 이름·설명 / 우: 가격
       ⚠️ 가격을 가운데 칸 아래에 두면 우측 절반이 통째로 빈다(요청 #10 의 원인과 같은 그림).
          가격을 **오른쪽 끝**으로 보내야 한 줄이 실제로 채워진다. */
    .kit-card {
        display: grid;
        /* 769~1024 는 가로가 좁아 썸네일을 200 으로 줄인다 — 260 이면 이름·설명 칸이
           150px 밖에 남지 않아 상품명이 네 줄로 접힌다(가로 스크롤은 나지 않지만 읽기 나쁘다) */
        grid-template-columns: 200px minmax(0, 1fr) auto;
        /* 위·아래 1fr 스페이서로 글 묶음을 이미지 높이 기준 **세로 가운데**에 둔다 */
        grid-template-rows: 1fr auto auto 1fr;
        column-gap: 40px;
        padding: 24px;
        border: 1px solid var(--c-gray-200); border-radius: 20px;
        background: var(--c-surface);
        transition: border-color .15s, box-shadow .15s;
    }
    .kit-card:hover { border-color: var(--c-border-primary); box-shadow: var(--shadow-step); }

    /* ⚠️ align-self 는 start — stretch 로 두면 설명이 긴 카드에서 이미지가 세로로 늘어나
       aspect-ratio(312:350) 를 벗어나 크롭 기준이 달라진다 */
    .kit-thumb { grid-column: 1; grid-row: 1 / -1; align-self: start; }

    .kit-name  { grid-column: 2; grid-row: 2; margin-top: 0; font-size: var(--fs-sh1); }
    .kit-desc  { grid-column: 2; grid-row: 3; margin-top: 10px; font-size: var(--fs-body1); }

    .kit-price { grid-column: 3; grid-row: 1 / -1; align-self: center; margin-top: 0; text-align: right; }
    .kit-price del  { display: block; }
    .kit-price span { margin-top: 4px; justify-content: flex-end; }
}

/* 1025px 이상 — 가로가 넓어 이미지·글자에 여유를 준다 */
@media (min-width: 1025px) {
    .kit-card { grid-template-columns: 300px minmax(0, 1fr) auto; column-gap: 56px; padding: 28px; }
}

/* ══ 상품 상세 — page_img/유전자검사_상품상세.png ═══════════════════════
   실측: 상단 = 이미지 648(정사각, r16, 1px Gray/200) + 간격 112 + 정보 560
         본문 = 좌 872 + 거터 24 + 사이드 424 (합 1320)
         사이드 카드는 **스크롤 시 고정(sticky)** — 헤더(74) 아래로 붙는다. */
/* ⚠️ 상단 여백 33 = 시안 실측 — 이미지 박스 상단이 헤더(74) 아래 61px 이고
   `.page` 가 이미 28 을 갖고 있다(브레드크럼을 뺀 자리, 2026-08-12). */
.pd-top {
    display: grid; grid-template-columns: minmax(0, 648fr) minmax(0, 560fr); gap: 112px;
    align-items: start; margin-top: 33px;
}
.pd-visual {
    aspect-ratio: 1 / 1; border: 1px solid var(--c-gray-200); border-radius: var(--r-lg);
    background: var(--c-surface);
}
.pd-visual > img { object-fit: contain; }

.pd-name { font-size: var(--fs-sh1); font-weight: var(--fw-bold); }
.pd-lead { margin-top: 14px; font-size: var(--fs-body2); color: var(--c-text-tertiary); line-height: 1.7; }

/* 라벨 + 값 한 줄 — 상단 정보와 사이드 카드가 같이 쓴다 */
.pd-row {
    display: flex; align-items: center; gap: 40px;
    padding: 18px 0; border-top: 1px solid var(--c-divider);
}
.pd-label { flex: 0 0 auto; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.pd-top .pd-label { font-size: var(--fs-body1); }   /* 상단 정보는 사이드 카드보다 한 단계 크다(시안) */
.pd-value { font-size: var(--fs-body2); font-weight: var(--fw-semibold); color: var(--c-text-primary); }
.pd-row.is-price { justify-content: space-between; gap: 12px; }
.pd-price { font-size: var(--fs-sh1); font-weight: var(--fw-bold); color: var(--c-primary); }
.pd-buy { width: 100%; margin: 16px 0 24px; }

/* ── 탭 ── */
/* 탭·가이드 폭은 상세 패널의 좌측 칼럼(872)과 같아야 한다 —
   패널이 872fr : 424fr + 거터 24 이므로 같은 비율로 계산한다(고정 872 로 두면 1200px 대에서 어긋난다). */
/* ⚠️ 2026-08-12 — `.pd-guide` 는 이 목록에서 뺐다. 검사 절차 안내가 **패널 좌측 칼럼 안**으로
   들어가면서 이미 872 폭이 되었는데, 여기서 또 872/1296 을 곱하면 한 번 더 줄어든다. */
.pd-tabs { max-width: calc((100% - var(--grid-gutter)) * 872 / 1296); }
/* ⚠️ 실측 (2026-08-12 · 유전자검사·영양제 두 시안이 동일) —
      · 탭 줄 자체는 872 전폭이고 **첫 라벨이 좌측에서 24 들어가 있다** → 줄에 padding-left
      · 활성 밑줄(3px)은 **글자 폭만큼**이다(324~397 = 라벨 잉크와 정확히 일치)
        → 탭에 좌우 padding 을 주면 밑줄이 그만큼 길어져 시안과 어긋난다
      · 라벨 사이 간격 58 (영양제 3탭에서도 58 / 60) */
.pd-tabs {
    display: flex; gap: 58px; margin-top: 74px; padding-left: 24px;
    border-bottom: 1px solid var(--c-divider);
}
.pd-tab {
    padding: 0 0 16px; font-size: var(--fs-sh2); font-weight: var(--fw-semibold);   /* 시안 실측 ≈19 */
    color: var(--c-text-disabled); border-bottom: 3px solid transparent; margin-bottom: -1px;
}
.pd-tab.is-active { color: var(--c-text-primary); border-bottom-color: var(--c-primary); }
.pd-tab:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); border-radius: var(--r-sm); }

.pd-panel.is-detail {
    display: grid; grid-template-columns: minmax(0, 872fr) minmax(0, 424fr); gap: var(--grid-gutter);
    align-items: start;
}
/* ⚠️ display 선언보다 **뒤에** 와야 한다 — 특이도가 같아 앞에 두면 .is-detail 의 display:grid 가 이겨
   탭을 바꿔도 패널이 그대로 보인다(실제 발생했던 버그). */
.pd-panel[hidden] { display: none; }
/* 좌측 칼럼 — 탭으로 갈아끼우는 본문이 들어간다(우측 `.pd-side` 는 탭과 무관하게 고정).
   ⚠️ `min-width: 0` 이 없으면 그리드 아이템 기본값(auto) 때문에 긴 내용이 칼럼을 늘려
      우측 카드를 밀어낸다. */
.pd-main { min-width: 0; }
/* 상세 내용 자리 — 관리자가 등록한 HTML 이 들어온다 */
.pd-detail { margin-top: 25px; min-height: 600px; background: var(--c-gray-50); border-radius: var(--r-md); }

/* 사이드 카드 — 스크롤해도 따라온다 */
.pd-side {
    position: sticky; top: calc(var(--header-h) + 24px);
    padding: 24px; border: 1px solid var(--c-gray-200); border-radius: var(--r-lg);
    background: var(--c-surface);
}
.pd-side-name { font-size: var(--fs-sh2); font-weight: var(--fw-bold); }
.pd-side-lead { margin: 12px 0 18px; font-size: var(--fs-body2); color: var(--c-text-tertiary); line-height: 1.7; }
/* 카드 안에서는 아래 여백을 카드 padding 이 맡는다 — 위 16 만 남긴다(시안 실측) */
.pd-side .pd-buy { margin: 16px 0 0; }
.pd-side .pd-row:first-of-type { border-top: 1px solid var(--c-divider); }

/* ── 검사 절차 안내 ── */
.pd-guide-title { margin-top: 46px; font-size: var(--fs-sh1); font-weight: var(--fw-bold); }
.pd-guide {
    margin-top: 30px; padding: 24px;
    border: 1px solid var(--c-gray-200); border-radius: var(--r-lg);
    display: grid; gap: 10px;
}
.pd-guide-item {
    display: flex; align-items: center; gap: 20px;
    padding: 20px 24px; border-radius: var(--r-md); background: var(--c-gray-50);
}
.pd-guide-no {
    flex: 0 0 36px; width: 36px; height: 36px; border-radius: 50%;
    display: flex; align-items: center; justify-content: center;
    background: var(--c-primary); color: var(--c-on-color);
    font-size: var(--fs-body2); font-weight: var(--fw-bold);
}
.pd-guide-name { font-size: var(--fs-body1); font-weight: var(--fw-bold); }
.pd-guide-desc { margin-top: 6px; font-size: var(--fs-body2); color: var(--c-text-secondary); }

@media (max-width: 1024px) {
    .pd-top { grid-template-columns: 1fr; gap: 32px; }
    .pd-tabs, .pd-guide { max-width: none; }
    /* 1열이 되면 본문이 좌측에 딱 붙으므로 탭 줄의 들여쓰기(PC 시안 24)는 뺀다 */
    .pd-tabs { margin-top: 48px; padding-left: 0; }
    .pd-panel.is-detail { grid-template-columns: 1fr; }
    /* 1열이 되면 사이드 카드가 상세 내용 아래로 내려가므로 고정하지 않는다 */
    .pd-side { position: static; margin-top: 24px; }
}
/* 모바일 하단 고정 구매바 — 768 이하에서만 나온다(그 위에서는 사이드 카드가 그 역할을 한다) */
.pd-buybar { display: none; }

@media (max-width: 768px) {
    /* 사이드 카드는 상단 정보와 내용이 겹쳐 통째로 다시 보여줄 필요가 없다 → 숨기고 고정 구매바로 대체 */
    .pd-side { display: none; }
    .pd-buybar {
        display: block; position: fixed; left: 0; right: 0; z-index: 110;
        bottom: calc(74px + env(safe-area-inset-bottom));   /* 하단 탭바(74) 바로 위 */
        background: var(--c-surface); box-shadow: 0 -1px 0 var(--c-divider);
    }
    .pd-buybar-inner {
        display: flex; align-items: center; gap: 12px;
        padding: 10px var(--page-margin);
    }
    .pd-buybar-price { flex: 1 1 auto; min-width: 0; }
    .pd-buybar .pd-label { display: block; font-size: var(--fs-sub1); }
    .pd-buybar .pd-price { font-size: var(--fs-sh2); }
    /* 버튼이 2개(장바구니 · 바로 구매)로 늘어 남은 폭을 나눠 쓴다 — 280px 에서도 넘치지 않게 */
    .pd-buybar-price { flex: 0 0 auto; }   /* 금액은 줄이지 않는다 — 버튼에 가려지면 안 된다 */
    .pd-buybar form { flex: 1 1 0; min-width: 0; }
    .pd-buybar .btn { width: 100%; min-width: 0; padding: 0 10px; white-space: nowrap; }
    /* 고정바에 본문이 가리지 않도록 푸터 아래 여백을 탭바(74) + 구매바(≈70) 만큼 잡는다 */
    .has-buybar .footer { margin-bottom: calc(74px + 70px); }

    .pd-tabs { gap: 8px; margin-top: 36px; }
    .pd-tab { flex: 1; padding: 0 8px 14px; font-size: var(--fs-body2); }
    .pd-detail { margin-top: 20px; min-height: 320px; }
    .pd-guide { padding: 16px; }
    .pd-guide-item { gap: 12px; padding: 16px; }
    .pd-guide-title { margin-top: 32px; }
    .pd-row { gap: 20px; padding: 14px 0; }
}

/* ══ 키트 결제 — 유전자검사_키트결제.png ═══════════════════════════════
   좌 872(주문 키트 · 배송지 · 결제 수단) + 거터 24 + 우 424(결제 금액) — 상품상세와 같은 골격.
   카드 r16 · 1px Gray/200 · 패딩 36 · 카드 사이 24 */
.page-head.is-eyebrow { display: block; padding-bottom: 0; margin-bottom: 34px; border-bottom: 0; }
.ck-eyebrow { font-size: var(--fs-body2); font-weight: var(--fw-bold); color: var(--c-main-300); letter-spacing: .5px; }
.ck-title { margin-top: 12px; font-size: var(--fs-h2); font-weight: var(--fw-bold); }

.ck {
    display: grid; grid-template-columns: minmax(0, 872fr) minmax(0, 424fr); gap: var(--grid-gutter);
    align-items: start;
}
/* ⚠️ `minmax(0, 1fr)` — 그냥 `1fr`(또는 기본 auto)이면 트랙의 **자동 최소 크기 = min-content** 라
   안에 든 표(적립 포인트 표는 `white-space: nowrap`)가 트랙을 밀어 넓혀 **페이지가 가로로 스크롤**된다.
   0 을 하한으로 못 박아야 트랙이 화면 폭에 맞고, 넘치는 표만 제 컨테이너 안에서 스크롤한다 (2026-08-27 · 요청 1). */
.ck-main { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--grid-gutter); }
.ck-card, .ck-side {
    padding: 36px; border: 1px solid var(--c-gray-200); border-radius: var(--r-lg); background: var(--c-surface);
}
.ck-side { position: sticky; top: calc(var(--header-h) + 24px); }
.ck-card-title { font-size: var(--fs-sh2); font-weight: var(--fw-bold); }
.ck-card-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
/* ⚠️ 반드시 자식 결합자(>)를 쓸 것 — `.ck-card-title + *` 만 쓰면 .ck-card-head 안의
   '배송지 목록' 버튼까지 잡혀 버튼에 padding-top 24 + 위 테두리가 붙어 글자가 밖으로 밀린다(실제 버그). */
.ck-card > .ck-card-title + *,
.ck-card > .ck-card-head + *,
.ck-side > .ck-card-title + * { margin-top: 24px; padding-top: 24px; border-top: 1px solid var(--c-divider); }

/* 주문 키트 행 */
.ck-item { display: flex; align-items: center; gap: 20px; }
/* 여러 상품이 이어질 때 줄이 붙어 보인다 — 첫 줄만 카드 제목과의 간격을 쓰고 이후는 자체 간격 */
.ck-item + .ck-item { margin-top: 20px; }
.ck-item-thumb { flex: 0 0 76px; width: 76px; aspect-ratio: 1 / 1; border-radius: var(--r-sm); background: var(--c-gray-100); }
.ck-item-body { flex: 1 1 auto; min-width: 0; }
.ck-item-name { font-size: var(--fs-body1); font-weight: var(--fw-bold); }
.ck-item-qty { margin-top: 6px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.ck-item-price { flex: 0 0 auto; font-size: var(--fs-sh2); font-weight: var(--fw-bold); }

/* 배송지 */
.ck-picks { display: flex; gap: 32px; }
.ck-pick { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; font-size: var(--fs-body2); }
.ck-addr { margin-top: 22px; }
.ck-addr-line + .ck-addr-line { margin-top: 12px; }
.ck-newaddr { display: grid; gap: 14px; margin-top: 22px; }
/* ⚠️ [hidden] 은 UA 규칙이라 위 display 선언에 진다 — 반드시 명시 가드를 둔다
   (기본 배송지를 골라도 신규 입력 폼이 계속 보이는 문제가 실제로 났다) */
.ck-newaddr[hidden] { display: none; }
.ck-memo { margin-top: 24px; padding-top: 24px; border-top: 1px solid var(--c-divider); }

/* 결제 수단 — 3분할 버튼 */
.ck-methods { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--grid-gutter); }
.ck-method { position: relative; display: block; cursor: pointer; }
.ck-method-input { position: absolute; width: 0; height: 0; opacity: 0; }
.ck-method-label {
    display: flex; align-items: center; justify-content: center;
    height: 56px; border-radius: var(--r-sm);
    background: var(--c-gray-100); border: 1px solid transparent;
    font-size: var(--fs-body2); color: var(--c-text-secondary);
    transition: background-color .15s, border-color .15s, color .15s;
}
.ck-method:hover .ck-method-label { border-color: var(--c-border-primary); }
.ck-method:has(.ck-method-input:checked) .ck-method-label {
    background: var(--c-surface); border-color: var(--c-main-200); color: var(--c-text-primary); font-weight: var(--fw-semibold);
}
.ck-method:has(.ck-method-input:focus-visible) .ck-method-label { box-shadow: 0 0 0 3px var(--c-focus-ring); }

/* 무통장입금 계좌 안내 */
.ck-vbank { margin-top: 24px; padding-top: 24px; border-top: 1px solid var(--c-divider); }
.ck-vbank[hidden] { display: none; }
.ck-bank { padding: 20px 24px; border-radius: var(--r-md); background: var(--c-gray-50); }
.ck-bank > div { display: flex; gap: 24px; font-size: var(--fs-body2); }
.ck-bank > div + div { margin-top: 10px; }
.ck-bank dt { flex: 0 0 72px; color: var(--c-text-tertiary); }
.ck-bank dd strong { font-size: var(--fs-body1); font-weight: var(--fw-bold); color: var(--c-primary); }
.ck-bank-note { margin-top: 12px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.ck-vbank .field { margin-top: 20px; }

/* 결제 금액 */
.ck-sum { display: grid; gap: 12px; }
.ck-sum-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.ck-sum-row[hidden] { display: none; }
.ck-sum-row.is-total {
    margin-top: 22px; padding-top: 22px; border-top: 1px solid var(--c-divider);
    font-size: var(--fs-body1); font-weight: var(--fw-bold); color: var(--c-text-primary);
}
.ck-sum-row.is-total strong { font-size: var(--fs-sh1); color: var(--c-primary); }
.ck-submit { width: 100%; margin-top: 26px; }
.ck-agree-all { display: flex; align-items: center; gap: 10px; margin-top: 26px; font-size: var(--fs-body2); font-weight: var(--fw-semibold); cursor: pointer; }
.ck-agrees { display: grid; gap: 12px; margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--c-divider); }
.ck-agrees li { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.ck-agrees label { display: flex; align-items: center; gap: 10px; cursor: pointer; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.ck-agree-view { flex: 0 0 auto; font-size: var(--fs-body2); color: var(--c-text-tertiary); text-decoration: underline; }

/* ── 배송지 목록 모달 ── */
.ck-addr-add {
    display: flex; align-items: center; justify-content: center; gap: 8px;
    width: 100%; height: 56px; border-radius: var(--r-sm);
    border: 1px solid var(--c-border-primary); background: var(--c-surface);
    font-size: var(--fs-body2); font-weight: var(--fw-semibold); color: var(--c-text-secondary);
}
.ck-addr-add:hover { border-color: var(--c-main-200); color: var(--c-primary); }
.ck-addr-list { display: grid; gap: 16px; margin-top: 16px; }
.ck-addr-list > li { border-radius: var(--r-md); background: var(--c-gray-100); border: 1px solid transparent; overflow: hidden; }
/* 선택된 배송지 — 흰 배경 + Main/200 테두리 */
.ck-addr-list > li:has(.ck-addr-radio:checked) { background: var(--c-surface); border-color: var(--c-main-200); }
.ck-addr-card { position: relative; display: block; padding: 20px 24px 18px; cursor: pointer; }
.ck-addr-radio { position: absolute; top: 20px; right: 24px; }
.ck-addr-label { display: flex; align-items: center; gap: 8px; font-size: var(--fs-body1); font-weight: var(--fw-bold); }
.ck-addr-badge {
    padding: 3px 8px; border-radius: 999px; background: var(--c-main-100); color: var(--c-main-300);
    font-size: var(--fs-sub1); font-weight: var(--fw-semibold);
}
.ck-addr-info { display: grid; gap: 6px; margin-top: 14px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.ck-addr-tools { display: flex; gap: 20px; padding: 12px 24px 16px; border-top: 1px solid var(--c-divider); }
.ck-addr-tools button { font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.ck-addr-tools button:hover { color: var(--c-text-primary); }

@media (max-width: 1024px) {
    /* ⚠️ `1fr` 이 아니라 `minmax(0, 1fr)` — 위 `.ck-main` 주석과 같은 이유다.
       PC 규칙은 이미 minmax(0, …) 인데 이 한 줄만 `1fr` 이라 **모바일에서만** 가로 스크롤이 났다. */
    .ck { grid-template-columns: minmax(0, 1fr); }
    .ck-side { position: static; }
}
@media (max-width: 768px) {
    .ck-card, .ck-side { padding: 20px; }
    /* ⚠️ 적립 포인트 표(.ck-pt*)의 모바일 규칙은 **여기 두면 안 된다** — 기본 선언이 이 블록보다
       아래(.ck-pt 섹션)에 있어 같은 특이도면 뒤가 이긴다. 그 섹션 바로 아래에 따로 뒀다. */
    .ck-methods { gap: 8px; }
    .ck-method-label { height: 48px; font-size: var(--fs-sub1); }
    .ck-item { gap: 12px; }
    .ck-item-thumb { flex-basis: 64px; width: 64px; }
    .ck-picks { gap: 16px; }
    .ck-bank { padding: 16px; }
    .ck-bank > div { gap: 12px; }
    .ck-addr-card { padding: 16px; }
    .ck-addr-radio { top: 16px; right: 16px; }
    .ck-addr-tools { padding: 10px 16px 14px; }
}

/* 약관 모달 본문 — 스크롤 박스 */
.modal-terms {
    max-height: 320px; overflow-y: auto;
    padding: 20px; border-radius: var(--r-sm); background: var(--c-gray-50);
    font-size: var(--fs-body2); color: var(--c-text-secondary); line-height: 1.8;
}

/* ══ 영양제 정보 (P-301) ═══════════════════════════════════════════
   2026-08-07 · 출처 page_img/영양제정보.png (실측)
   카드는 메인 BEST(.best-*)와 같은 규격이라 그대로 재사용하고, 이 화면 전용만 .np-* 로 덧댄다.
   컨테이너 1320 · 카드 312 · 4열 gap 24 — 기존 .best-grid 와 동일 */
/* 추천 배너 — 시안에서 페이지 맨 위. 설문 미완료 회원에게만 */
.np-banner {
    display: flex; align-items: center; justify-content: space-between; gap: 24px;
    min-height: 208px; padding: 0 52px;
    border-radius: var(--r-md); background: var(--c-main-100);
}
.np-banner-title { font-size: var(--fs-h2); font-weight: var(--fw-bold); line-height: 1.4; }
.np-banner-sub { margin-top: 12px; font-size: var(--fs-body1); color: var(--c-text-secondary); }
/* 시안 버튼은 완전한 pill 이다(기본 .btn 의 radius 8 이 아니다) */
.np-banner-btn { flex: 0 0 auto; border-radius: 999px; }

.np-banner + .kit-eyebrow { margin-top: 60px; }

/* 검색 카드 — 라벨 + 필드 3개 + 검색/초기화 */
/* ⚠️ flex-wrap 으로 두면 폭이 애매할 때(1100~1200) **버튼만 다음 줄로 떨어져** 어색했다.
   grid 로 바꿔 각 칸의 최소폭을 정해 두면, 한 줄에 들어가는 동안은 필드가 같이 줄어들고
   좁아지면 아래 미디어쿼리에서 **의도한 모양으로** 줄바꿈한다. */
.np-search {
    display: grid; align-items: end; gap: 12px;
    grid-template-columns: minmax(180px, 1fr) minmax(180px, 1fr) minmax(200px, 1.4fr) auto;
    margin-top: 28px; padding: 32px;
    border: 1px solid var(--c-border-secondary); border-radius: var(--r-md);
    background: var(--c-surface);
}
/* ⚠️ `.field` 는 세로로 쌓이는 폼을 위해 margin-bottom:18 을 갖는다.
   `align-items: end` 는 **margin box** 기준이라 그대로 두면 필드가 버튼보다 18px 아래까지
   차지해 바닥선이 어긋난다. 가로 배치인 이 검색 카드에서는 그 마진이 필요 없다. */
.np-search .field { margin-bottom: 0; }
.np-search-field, .np-search-kw { min-width: 0; }
.np-search-btns { display: flex; gap: 12px; }
/* 검색 버튼은 Sub_black 배경(브랜드 보라가 아니다) */
.np-btn-search {
    width: 80px; height: 48px; border-radius: var(--r-sm);
    background: var(--c-sub-black); color: var(--c-on-color); font-size: var(--fs-body1);
}
.np-btn-search:hover { background: var(--c-gray-800); color: var(--c-on-color); }
.np-btn-reset {
    width: 80px; height: 48px; border-radius: var(--r-sm);
    font-size: var(--fs-sh2); line-height: 1;
}

.np-count { margin-top: 62px; font-size: var(--fs-body1); color: var(--c-text-secondary); }
.np-count > strong { color: var(--c-text-primary); font-weight: var(--fw-bold); }

.np-grid { margin-top: 24px; }
/* 상품명은 시안이 18(SH2)이다 — 메인 BEST(16)보다 한 단계 크다 */
.np-name { font-size: var(--fs-sh2); line-height: 1.4; }
.np-price { margin-top: 12px; font-size: var(--fs-body2); }
.np-price > strong { font-size: var(--fs-sh1); font-weight: var(--fw-bold); }
/* 정가 취소선 + 할인율 (2026-08-13) — 관리자가 정가를 넣은 상품만 나온다 */
.np-price > del { margin-right: 6px; color: var(--c-text-tertiary); font-weight: var(--fw-regular); }
.np-price > .np-off { margin-right: 6px; font-style: normal; font-weight: var(--fw-bold); color: var(--c-red-main); }
.np-subprice { margin-top: 8px; font-size: var(--fs-body2); color: var(--c-primary); }
.np-subprice > strong { font-weight: var(--fw-bold); }
/* 할인율은 보라가 아니라 회색 (시안) */
.np-subprice > em { font-style: normal; color: var(--c-text-tertiary); }

/* 찜한 상태 — 호버 액션바의 하트를 채워 보이게 (에셋이 한 벌이라 색으로 구분) */
/* 찜 완료 — **채워진 하트 에셋으로 교체** (2026-08-10 에셋 수급)
   에셋 규격이 off 와 같아(49×44 · 2x) 위 `transform: scale(.5)` 가 그대로 적용된다.
   ⚠️ 이전에는 on 에셋이 없어 opacity 로 흉내 냈다 — 그 임시 처리를 걷어냈다.
   ⚠️ `content: url()` 이라 shop.js 가 `.is-on` 만 토글하면 초기 렌더·클릭 양쪽에서 알아서 바뀐다. */
.best-act.is-on > img { content: url("../img/common/wish_icon_white_on.png"); }

@media (max-width: 1024px) {
    .np-banner { min-height: 0; padding: 32px; flex-direction: column; align-items: flex-start; }

    /* 한 줄에 다 넣으면 셀렉트가 너무 좁아진다 → **성분·고민 / 검색어+버튼** 두 줄로 나눈다.
       ⚠️ 검색어 basis 를 `100% − 버튼폭` 으로 잡아 **버튼이 검색창 옆에 딱 붙게** 한다.
          그냥 wrap 시키면 폭에 따라 버튼만 또 다음 줄로 떨어진다.
       ⚠️ 성분·고민은 basis 190 이라 폭이 더 좁아지면(≈470px 이하) **한 줄에 하나씩** 내려간다
          — 두 칸으로 붙여 두면 "프로바이오틱스" 같은 긴 항목이 잘린다. 새 브레이크포인트는 쓰지 않는다. */
    .np-search { display: flex; flex-wrap: wrap; align-items: flex-end; }
    .np-search-field { flex: 1 1 190px; }
    .np-search-kw    { flex: 1 1 calc(100% - 184px); }   /* 184 = 버튼 172 + gap 12 */
    .np-search-btns  { flex: 0 0 auto; }
}
@media (max-width: 768px) {
    .np-banner { padding: 24px 20px; }

    /* ── 검색 영역 컴팩트 (2026-08-12) ────────────────────────────────
       예전에는 라벨 3줄 + 컨트롤 3줄 + 버튼 1줄이라 **높이가 340px 를 넘어**
       폰에서 첫 화면이 검색창으로 꽉 찼다(상품이 스크롤해야 보였다).
       두 줄로 줄인다:
           [성분 ▾] [고민 ▾]
           [검색어 ..........] [검색] [↺]
       ⚠️ 라벨은 **지우지 않고 숨긴다**(.sr-only 와 같은 처리) — 화면에서만 빼고
          스크린리더에는 남긴다. 셀렉트 첫 항목('전체 성분')과 placeholder 가 역할을 대신한다.
       ⚠️ 셀렉트를 2칸으로 붙이면 긴 항목명은 잘린다(펼치면 전체가 보인다) —
          폰에서는 영역을 줄이는 쪽을 택했다. */
    /* 제목~검색 사이 여백도 줄인다 — 첫 화면에 상품이 보이는 게 우선이다 */
    .np-banner + .kit-eyebrow { margin-top: 36px; }
    .np-search { margin-top: 16px; padding: 0; gap: 8px; border:none;}
    .np-search .field-label {
        position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
        overflow: hidden; white-space: nowrap; border: 0;
        clip: rect(0 0 0 0); clip-path: inset(50%);
    }
    /* 성분·고민 — 한 줄에 둘 (좁아도 내려가지 않게 50% 고정) */
    .np-search-field { flex: 1 1 calc(50% - 4px); min-width: 0; }
    /* 검색어는 남는 폭을 다 먹고, 버튼 둘은 그 옆에 붙는다 */
    .np-search-kw   { flex: 1 1 120px; }
    .np-search-btns { flex: 0 0 auto; gap: 8px; }

    .np-search .select, .np-search .input { height: 44px; }
    .np-btn-search { width: auto; min-width: 60px; height: 44px; padding: 0 14px; }
    .np-btn-reset  { width: 44px; height: 44px; padding: 0; }

    .np-count { margin-top: 28px; }
}

/* ══ 영양제 상세 (P-302) ═══════════════════════════════════════════
   2026-08-07 · 출처 page_img/영양제정보_상품상세.png (실측)
   골격은 키트 상세(.pd-*)와 같고 이 화면 전용만 .pv-* 로 덧댄다. */

/* 제목 + 찜 하트 가로 배치 (상단 정보 · 사이드 카드 공용) */
.pd-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; }

/* 찜 하트 — 에셋이 없어 문자 ♥ 로 그린다. 켜지면 Red/main */
.nt-wish {
    flex: 0 0 auto;
    display: inline-flex; align-items: center; justify-content: center;
    width: 36px; height: 36px; border-radius: 50%;
    font-size: 18px; line-height: 1;
    color: var(--c-gray-300); background: transparent;
    transition: color .15s, transform .15s;
}
.nt-wish:hover { transform: scale(1.08); }
.nt-wish.is-on { color: var(--c-red-main); }
.nt-wish:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }
.nt-wish.is-lg { width: 40px; height: 40px; font-size: 22px; }

/* '바로 구매' — 시안의 검정 버튼. 기본 팔레트에 없어 여기서 정의한다 */
.btn-dark { background: var(--c-sub-black); color: var(--c-on-color); }
.btn-dark:hover { background: var(--c-gray-800); color: var(--c-on-color); }

.pv-cat {
    display: inline-flex; align-items: center; height: 26px; padding: 0 12px;
    border-radius: 999px; background: var(--c-main-100); color: var(--c-main-300);
    font-size: var(--fs-sub1); font-weight: var(--fw-semibold);
}
.pd-info .pd-head { margin-top: 12px; }
.pv-rating { display: flex; align-items: center; gap: 8px; margin-top: 12px; font-size: var(--fs-body2); }
.pv-star { color: var(--c-sub-gold); }
.pv-rating > strong { font-weight: var(--fw-bold); }
.pv-review-link { color: var(--c-text-tertiary); text-decoration: underline; }

/* 가격 박스 — 단건 / 정기구독 2행, 점선 구분 */
.pv-pricebox {
    margin-top: 20px; padding: 4px 24px; border-radius: var(--r-md);
    background: var(--c-gray-100);
}
.pv-price-row {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    padding: 18px 0;
}
.pv-price-row + .pv-price-row { border-top: 1px dashed var(--c-border-secondary); }
.pv-price-label { font-size: var(--fs-body2); color: var(--c-text-secondary); }
.pv-price { font-size: var(--fs-sh1); font-weight: var(--fw-bold); }
.pv-price.is-accent { color: var(--c-primary); }
.pv-price-right { display: inline-flex; align-items: center; gap: 10px; }
.pv-rate { font-style: normal; font-size: var(--fs-body2); font-weight: var(--fw-semibold); color: var(--c-red-main); }
/* 정가 취소선 (2026-08-13) — 단건 결제가 행. 할인율은 .pv-rate 를 그대로 쓴다(`↓` 없이 `%` 만) */
.pv-listprice { font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.pv-point { font-style: normal; color: var(--c-primary); font-weight: var(--fw-bold); }
.pd-row.is-qty, .pv-price-row.is-qty { justify-content: space-between; }

/* 구매 버튼 3종 — 장바구니 / 바로 구매 / 정기구독 신청 */
.pv-buys { display: flex; gap: 10px; flex-wrap: wrap; margin: 24px 0; }
.pv-buys > form { flex: 0 0 auto; }
.pv-buys > form:last-child {flex:1}
.pv-buys > form > .btn { min-width: 136px;width:100%;}
.pv-buys > .btn { flex: 0 0 auto; min-width: 136px; }
.pv-buys .pv-sub-btn { flex: 2; }
/* 사이드 카드는 폭이 좁아 2열 + 전폭 1개로 접는다 */
.pv-buys.is-side > form, .pv-buys.is-side > .btn { flex: 1 1 calc(50% - 5px); min-width: 0; }
.pv-buys.is-side > form > .btn { width: 100%; min-width: 0; }
.pv-buys.is-side .pv-sub-btn { flex: 1 1 100%; }
.pv-side-note { font-size: var(--fs-sub1); color: var(--c-text-tertiary); margin-top: 16px; }

/* ── 상품 옵션 선택기 ─────────────────────────────────────────── */
.pv-opt { margin-top: 24px; border: 1px solid var(--c-gray-800); border-radius: var(--r-sm); }
.pv-opt-head {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    width: 100%; height: 56px; padding: 0 18px;
    background: var(--c-gray-100); font-size: var(--fs-body1); font-weight: var(--fw-semibold);
    border-radius: var(--r-sm) var(--r-sm) 0 0;
}
.pv-opt-caret { transition: transform .15s; }
.pv-opt-head[aria-expanded="false"] .pv-opt-caret { transform: rotate(180deg); }
.pv-opt-list { border-top: 1px solid var(--c-gray-800); }
.pv-opt-list[hidden] { display: none; }
.pv-opt-item {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    width: 100%; padding: 16px 18px; text-align: left;
}
.pv-opt-list > li + li .pv-opt-item { border-top: 1px solid var(--c-divider); }
.pv-opt-item:hover { background: var(--c-gray-50); }
.pv-opt-item-main { min-width: 0; }
.pv-opt-name { display: block; font-size: var(--fs-body2); color: var(--c-text-primary); }
.pv-opt-price { display: block; margin-top: 6px; font-size: var(--fs-body2); }
.pv-opt-price > strong { font-weight: var(--fw-bold); }
.pv-opt-price > em { font-style: normal; margin-left: 6px; color: var(--c-primary); }
.pv-opt-ship {
    flex: 0 0 auto; display: inline-flex; align-items: center; height: 26px; padding: 0 10px;
    border-radius: var(--r-sm); background: var(--c-primary); color: var(--c-on-color);
    font-size: var(--fs-sub1); font-weight: var(--fw-semibold);
}

/* 선택한 옵션 목록 */
.pv-picked { border-top: 1px solid var(--c-gray-800); }
.pv-picked-item { padding: 16px 18px; background: var(--c-gray-50); }
.pv-picked-item + .pv-picked-item { border-top: 1px solid var(--c-divider); }
.pv-picked-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.pv-picked-name { font-size: var(--fs-body2); color: var(--c-text-primary); }
.pv-picked-name > span { display: block; margin-top: 4px; color: var(--c-text-tertiary); }
.pv-picked-del { color: var(--c-text-tertiary); font-size: var(--fs-body1); }
.pv-picked-del:hover { color: var(--c-text-primary); }
.pv-picked-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 12px; }
.pv-picked-price { font-size: var(--fs-body1); font-weight: var(--fw-bold); }
.pv-picked-empty { padding: 16px 18px; border-top: 1px solid var(--c-gray-800); font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.pv-picked-empty[hidden] { display: none; }
.pv-total { padding: 16px 18px; border-top: 1px solid var(--c-gray-800); text-align: right; font-size: var(--fs-body2); }
.pv-total > strong { margin-left: 8px; font-size: var(--fs-sh1); font-weight: var(--fw-bold); }
.pv-total > em { font-style: normal; margin-left: 6px; color: var(--c-text-tertiary); }

/* ── 탭 sticky ────────────────────────────────────────────────
   ⚠️ 헤더가 sticky 74 라 그 아래에 붙는다. 배경을 깔지 않으면 본문이 비쳐 보인다.
   ⚠️ `padding-top` 이 없으면 탭 글자가 헤더 경계에 딱 붙는다 → 상단 여백을 준다.
      이 패딩까지 포함한 높이가 `--pd-tabs-h` 이고, 아래 사이드 카드가 그만큼 더 내려간다. */
:root { --pd-tabs-h: 67px; }   /* 탭 47 + 상단 패딩 20 */

.pd-tabs.is-sticky {
    position: sticky; top: var(--header-h); z-index: 90;
    padding-top: 20px;
    background: var(--c-bg-primary);
}
/* 우측 구매 카드도 sticky 다. 탭 바가 고정돼 있으므로 **그 아래**에서 멈춰야 가려지지 않는다.
   ⚠️ 키트 상세는 탭이 sticky 가 아니라 기본값(헤더+24)을 그대로 쓴다 → 인접 형제로 한정한다. */
.pd-tabs.is-sticky + .pd-panel .pd-side {
    top: calc(var(--header-h) + var(--pd-tabs-h) + 24px);
}
/* ⚠️ sticky 는 **부모가 자기보다 길어야** 움직인다.
   탭 본문(상세 설명·후기·문의)이 짧으면 패널 높이 = 카드 높이가 되어 이동 여지가 0 이 되고,
   카드가 붙지 않고 페이지와 함께 밀려 올라간다(후기 0건 상품에서 실제로 그랬다).
   패널에 최소 한 화면 높이를 줘서 카드가 붙을 공간을 확보한다. */
.pd-tabs.is-sticky + .pd-panel {
    min-height: calc(100vh - var(--header-h) - var(--pd-tabs-h));
}
.pv-body { min-width: 0; }
/* 탭 패널 — 서버가 셋 다 그리고 JS 가 보이기만 바꾼다 (2026-08-14)
   ⚠️ 브라우저 기본값(`[hidden]{display:none}`)에 기대지 않고 **명시**한다.
      다른 규칙이 `display` 를 주면 기본값이 밀려 **숨겨야 할 탭이 그대로 보인다**
      (`.pd-panel[hidden]` 에서 실제로 겪은 문제와 같은 이유). */
.pv-tabpanel[hidden] { display: none; }
.pv-sec-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 40px; }
.pv-sec-title { font-size: var(--fs-sh1); font-weight: var(--fw-bold); margin-top: 40px; }
.pv-sec-head .pv-sec-title { margin-top: 0; }
.pv-sec-title > em { font-style: normal; color: var(--c-primary); }

/* ── 후기 탭 ─────────────────────────────────────────────────── */
.pv-rate-sum {
    display: flex; align-items: center; gap: 40px;
    margin-top: 20px; padding: 28px 40px; border-radius: var(--r-sm); background: var(--c-gray-50);
}
.pv-rate-avg { text-align: center; flex: 0 0 auto; min-width: 180px; }
.pv-rate-avg > strong { font-size: var(--fs-h2); font-weight: var(--fw-bold); }
.pv-stars { margin-top: 8px; color: var(--c-gray-300); letter-spacing: 2px; }
.pv-stars > span.is-on { color: var(--c-sub-gold); }
.pv-stars.is-sm { margin-top: 6px; font-size: var(--fs-body2); }
.pv-rate-bars { display: flex; align-items: flex-end; gap: 20px; padding-left: 40px; border-left: 1px solid var(--c-divider); }
.pv-rate-bars > li { display: flex; flex-direction: column; align-items: center; gap: 8px; }
.pv-bar { display: block; width: 6px; height: 60px; border-radius: 999px; background: var(--c-gray-200); position: relative; }
.pv-bar > i { position: absolute; left: 0; right: 0; bottom: 0; border-radius: 999px; background: var(--c-primary); }
.pv-bar-label { font-size: var(--fs-sub1); color: var(--c-text-tertiary); }

.pv-reviews { margin-top: 28px; }
.pv-review { padding: 22px 0; border-bottom: 1px solid var(--c-divider); }
.pv-review-head { display: flex; align-items: center; gap: 10px; font-size: var(--fs-body2); }
/* 고정핀 아이콘 — 2x 에셋(40×40)을 20×20 으로. ⚠️ .pv-review-head 가 flex 라 flex-shrink 를 막아야 눌리지 않는다 */
.pv-pin { flex: 0 0 20px; width: 20px; height: 20px; }
.pv-review-who { font-weight: var(--fw-semibold); }
.pv-review-date { margin-left: auto; color: var(--c-text-tertiary); }
.pv-review-body { margin-top: 10px; font-size: var(--fs-body2); color: var(--c-text-primary); }
.pv-review-reply { margin-top: 12px; padding: 12px 14px; border-radius: var(--r-sm); background: var(--c-gray-100); font-size: var(--fs-body2); color: var(--c-text-secondary); }

/* ── 후기 목록 항목 = 버튼(클릭 시 상세 팝업) · 2026-08-12 ─────────
   ⚠️ 안쪽이 <p> 에서 <span> 으로 바뀌었다(버튼 안에 블록 요소를 넣지 않으려고)
      → 줄바꿈이 되도록 display:block 을 명시한다. */
.pv-review-open {
    display: block; width: 100%; padding: 0;
    background: none; border: 0; text-align: left; cursor: pointer; color: inherit;
}
.pv-review-open .pv-review-body,
.pv-review-open .pv-stars { display: block; }
.pv-review-open:hover .pv-review-body { color: var(--c-primary); }
.pv-review-open:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); border-radius: var(--r-sm); }

/* 목록은 요약이다 — 본문 3줄까지만 보이고 나머지는 팝업에서 */
.pv-review-body.is-clamp {
    display: -webkit-box; -webkit-line-clamp: 3; line-clamp: 3;
    -webkit-box-orient: vertical; overflow: hidden;
}

/* 첨부 이미지 — 목록 썸네일(최대 3장 · 넘치면 마지막에 +N) */
.pv-review-thumbs { display: flex; gap: 8px; margin-top: 12px; }
.pv-review-thumb { position: relative; display: block; width: 72px; height: 72px; }
.pv-review-thumb > img {
    width: 100%; height: 100%; object-fit: cover;
    border-radius: var(--r-sm); border: 1px solid var(--c-divider);
}
.pv-review-more {
    position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
    border-radius: var(--r-sm); background: var(--c-backdrop);
    color: var(--c-on-color); font-size: var(--fs-body2); font-weight: var(--fw-semibold); font-style: normal;
}

/* ── 후기 상세 팝업 본문 ─────────────────────────────────────── */
.pv-rvd-head { display: flex; align-items: center; gap: 10px; font-size: var(--fs-body2); }
.pv-rvd-imgs { display: flex; flex-wrap: wrap; gap: 8px; margin: 16px 0 0; padding: 0; list-style: none; }
.pv-rvd-imgs img {
    width: 140px; height: 140px; object-fit: cover;
    border-radius: var(--r-sm); border: 1px solid var(--c-divider);
}
.pv-rvd-body { margin-top: 16px; font-size: var(--fs-body2); color: var(--c-text-primary); line-height: 1.7; }

@media(max-width:1090px){
    .pv-buys > form {flex:1;}
}

@media (max-width: 768px) {
    .pv-review-thumb { width: 64px; height: 64px; }
    .pv-rvd-imgs img { width: calc(50% - 4px); height: auto; aspect-ratio: 1 / 1; }
}

/* ── 상품 문의 탭 ─────────────────────────────────────────────── */
.pv-qna { margin-top: 20px; border-top: 1px solid var(--c-gray-800); }
.pv-qna-item { border-bottom: 1px solid var(--c-divider); }
.pv-qna-row {
    display: flex; align-items: center; gap: 16px; width: 100%; padding: 18px 8px;
    text-align: left; font-size: var(--fs-body2);
}
.pv-qna-row:not(.is-locked):hover { background: var(--c-gray-50); }
.pv-qna-row.is-locked { color: var(--c-text-tertiary); cursor: default; }
.pv-qna-no { flex: 0 0 40px; color: var(--c-text-tertiary); }
.pv-qna-title { flex: 1 1 auto; min-width: 0; display: flex; align-items: center; gap: 12px; }
/* 비밀글 자물쇠 — 에셋 27×30(2x) → 렌더 14. 비율은 높이 auto 로 지킨다 */
.pv-lock { flex: 0 0 auto; width: 14px; height: auto; }
.pv-qna-date { flex: 0 0 auto; color: var(--c-text-tertiary); }
/* 상태 — 시안은 **pill 뱃지**다 (60×24 실측). 예전에는 글자만 색으로 구분했다.
     답변대기  배경 Gray/100 · 글자 Gray/500
     답변완료  배경 Green/bg · 글자 Green/text
   ⚠️ 공통 `.badge` 는 테두리(1px currentColor)가 있어 쓰지 않는다 — 시안 뱃지는 면만 있다. */
.pv-qna-state {
    flex: 0 0 auto;
    display: inline-flex; align-items: center; justify-content: center;
    min-width: 60px; height: 24px; padding: 0 8px; border-radius: 4px;
    background: var(--c-gray-100); color: var(--c-gray-500);
    font-size: var(--fs-sub1); font-weight: var(--fw-semibold); line-height: 1;
}
.pv-qna-state.is-done { background: var(--c-green-bg); color: var(--c-green-text); }
/* 질문 본문 — 시안 실측 #F8F8F9(Gray/100). Gray/50 은 거의 흰색이라 블록이 안 보였다.
   ⚠️ 왼쪽은 **제목 칸에 맞춰 들여쓴다**(8 패딩 + 번호칸 40 + gap 16 = 64) — 시안이 그렇다. */
.pv-qna-body { padding: 18px 8px 22px 64px; background: var(--c-gray-100); }
.pv-qna-body[hidden] { display: none; }
.pv-qna-q { font-size: var(--fs-body2); color: var(--c-text-primary); }
/* 관리자 답변 — 배경 없이 이어 붙는다(질문 블록만 회색) */
.pv-qna-a { margin-top: 18px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
/* ⚠️ 제목은 검정 굵게, **↳ 화살표만 보라**다 (시안). 예전에는 줄 전체가 보라였다. */
.pv-qna-a-head { margin-bottom: 8px; font-weight: var(--fw-semibold); color: var(--c-text-primary); }
.pv-qna-a-head > span { color: var(--c-primary); }
/* ── 상품 문의 작성 폼 (모달) — 시안 실측 ─────────────────────── */
/* 제목 아래 구분선 · 항목 간격은 .field 기본값(margin-bottom 18) */
.pq-form { border-top: 1px solid var(--c-divider); padding-top: 24px; }
.pq-form .field-label > em { color: var(--c-red-main); font-style: normal; }
.pq-form .textarea { min-height: 156px; resize: vertical; }
.pq-content { margin-bottom: 8px; }
.pq-count { margin-top: 8px; text-align: right; font-size: var(--fs-sub1); color: var(--c-text-tertiary); }
/* 체크박스 위에 구분선 (시안) */
.pq-secret {
    display: flex; align-items: center; gap: 8px;
    margin: 0 0 24px; padding-top: 20px; border-top: 1px solid var(--c-divider);
    font-size: var(--fs-body2); color: var(--c-text-secondary); cursor: pointer;
}
/* 취소 / 등록하기 반반 */
.pq-actions { display: flex; gap: 12px; }
.pq-actions > .btn { flex: 1 1 50%; min-width: 0; }
.pq-cancel { background: var(--c-gray-100); color: var(--c-text-primary); }
.pq-cancel:hover { background: var(--c-gray-200); color: var(--c-text-primary); }

@media (max-width: 1024px) {
    .pv-rate-sum { flex-direction: column; align-items: stretch; gap: 24px; padding: 24px; }
    .pv-rate-bars { padding-left: 0; border-left: 0; justify-content: space-between; }
}
@media (max-width: 768px) {
    .pv-buys > form, .pv-buys > .btn { flex: 1 1 calc(50% - 5px); min-width: 0; }
    .pv-buys > form > .btn { width: 100%; min-width: 0; }
    .pv-buys .pv-sub-btn { flex: 1 1 100%; }
    /* 번호·날짜를 숨기므로 본문 들여쓰기(64)도 되돌린다 — 안 그러면 왼쪽이 크게 비어 보인다 */
    .pv-qna-no, .pv-qna-date { display: none; }
    .pv-qna-body { padding-left: 8px; }
    .pd-tabs.is-sticky { top: 48px; }   /* 모바일 헤더 높이 */
}

/* ══ 무통장입금 안내 (2026-08-12) ═══════════════════════════════════
   주문 완료(P-305)·주문 상세(P-403) 공용 — views/partials/deposit_guide.php
   ⚠️ 계좌번호가 이 박스의 핵심이다 → 다른 줄보다 크고 진하게 둔다. */
.dep-guide {
    margin-top: 28px; padding: 24px;
    border: 1px solid var(--c-main-200); border-radius: var(--r-md);
    background: var(--c-main-100); text-align: left;
}
.dep-guide-title { font-size: var(--fs-sh2); font-weight: var(--fw-bold); color: var(--c-text-primary); }
.dep-guide-lead { margin-top: 6px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.dep-guide-rows { margin-top: 16px; display: grid; gap: 10px; }
.dep-guide-rows > div { display: flex; align-items: baseline; gap: 12px; font-size: var(--fs-body2); }
.dep-guide-rows dt { flex: 0 0 76px; color: var(--c-text-tertiary); }
.dep-guide-rows dd { flex: 1 1 auto; min-width: 0; color: var(--c-text-primary); }
.dep-guide-rows dd strong { font-size: var(--fs-sh2); font-weight: var(--fw-bold); }
.dep-guide-amt strong { color: var(--c-primary); }
.dep-guide-note { margin-top: 16px; font-size: var(--fs-sub1); color: var(--c-text-secondary); }

/* ══ 페이지네이션 (사용자단 공용) ═══════════════════════════════════
   2026-08-07 · ⚠️ 관리자 `render_pagination()` 은 Bootstrap 이라 여기서 쓰지 않는다.
   partials/pagination.php 가 이 클래스를 쓴다. */
.pager { display: flex; align-items: center; justify-content: center; gap: 6px; margin-top: 48px; }
.pager-btn, .pager-num {
    display: inline-flex; align-items: center; justify-content: center;
    min-width: 36px; height: 36px; padding: 0 10px; border-radius: var(--r-sm);
    font-size: var(--fs-body2); color: var(--c-text-secondary);
}
.pager-btn:hover, .pager-num:hover { background: var(--c-gray-100); color: var(--c-text-primary); }
.pager-num.is-on { background: var(--c-primary); color: var(--c-on-color); font-weight: var(--fw-semibold); }
.pager-num.is-on:hover { background: var(--c-primary); color: var(--c-on-color); }
.pager-btn.is-disabled { color: var(--c-text-disabled); pointer-events: none; }

/* ══ 장바구니 (P-303) ══════════════════════════════════════════════
   2026-08-07 · 출처 page_img/장바구니(2).png (실측)
   좌 872(선택바 + 목록 카드) + 거터 24 + 우 424(결제 금액) — 결제 화면과 같은 골격 */
.page-eyebrow { font-size: var(--fs-body2); font-weight: var(--fw-bold); color: var(--c-main-300); letter-spacing: .5px; }
.page-head > .page-eyebrow + .page-title { margin-top: 12px; font-size: var(--fs-h2); }

.ct-wrap {
    display: grid; grid-template-columns: minmax(0, 872fr) minmax(0, 424fr); gap: var(--grid-gutter);
    align-items: start;
}
.ct-main { min-width: 0; }

.ct-bar { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 12px; }
.ct-all { display: inline-flex; align-items: center; gap: 10px; font-size: var(--fs-body2); cursor: pointer; }

.ct-card { border: 1px solid var(--c-gray-200); border-radius: var(--r-lg); background: var(--c-surface); overflow: hidden; }
.ct-head {
    display: grid; grid-template-columns: 24px 80px 1fr 140px 120px; align-items: center;
    gap: 20px; padding: 18px 24px; background: var(--c-gray-50);
    font-size: var(--fs-body2); color: var(--c-text-secondary);
}
.ct-col-name { grid-column: 3; }
.ct-col-qty { grid-column: 4; text-align: center; }
.ct-col-sum { grid-column: 5; text-align: right; }

.ct-list { display: grid; }
.ct-item {
    display: grid; grid-template-columns: 24px 80px 1fr 140px 120px; align-items: center;
    gap: 20px; padding: 20px 24px;
}
.ct-item + .ct-item { border-top: 1px solid var(--c-gray-200); }
/* 선택 해제한 줄은 톤을 낮춘다 — 합계에 안 들어간다는 신호 */
.ct-item.is-off { opacity: .45; }

.ct-check { display: inline-flex; }
.ct-thumb { display: block; width: 80px; height: 80px; border-radius: var(--r-sm); overflow: hidden; background: var(--c-gray-100); }
.ct-thumb > img { width: 100%; height: 100%; object-fit: cover; }
.ct-info { min-width: 0; }
.ct-name { display: block; font-size: var(--fs-body1); font-weight: var(--fw-semibold); color: var(--c-text-primary); }
.ct-opt { margin-top: 4px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.ct-unit { margin-top: 6px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.ct-qty { display: flex; justify-content: center; }
.ct-sum { text-align: right; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.ct-sum > strong { font-size: var(--fs-sh2); font-weight: var(--fw-bold); color: var(--c-text-primary); }

/* 결제 금액 카드 — 스크롤해도 따라온다 */
.ct-side { min-width: 0; }
.ct-side-box {
    position: sticky; top: calc(var(--header-h) + 24px);
    padding: 28px; border: 1px solid var(--c-gray-200); border-radius: var(--r-lg); background: var(--c-surface);
}
.ct-side-title { font-size: var(--fs-sh2); font-weight: var(--fw-bold); }

.ct-pay { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-top: 20px; }
.ct-pay-opt {
    display: flex; align-items: center; justify-content: space-between; gap: 8px;
    padding: 16px; border: 1px solid var(--c-gray-200); border-radius: var(--r-md);
    background: var(--c-gray-50); cursor: pointer;
}
.ct-pay-opt:has(.rdo:checked) { border-color: var(--c-primary); background: var(--c-surface); }
.ct-pay-opt.is-disabled { opacity: .5; cursor: not-allowed; }
.ct-pay-name { font-size: var(--fs-body2); font-weight: var(--fw-semibold); }
.ct-pay-off { color: var(--c-red-main); font-weight: var(--fw-medium); }
.ct-pay-note { margin-top: 10px; font-size: var(--fs-sub1); color: var(--c-text-tertiary); line-height: 1.6; }

.ct-sums { margin-top: 24px; display: grid; gap: 12px; }
.ct-sums > div { display: flex; align-items: center; justify-content: space-between; font-size: var(--fs-body2); }
.ct-sums dt { color: var(--c-text-secondary); }

.ct-final {
    display: flex; align-items: center; justify-content: space-between;
    margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--c-gray-200);
    font-size: var(--fs-body1); font-weight: var(--fw-semibold);
}
.ct-final > strong { font-size: var(--fs-sh1); font-weight: var(--fw-bold); color: var(--c-primary); }
.ct-side-box > .btn { margin-top: 16px; }
.ct-side-box > .btn + .btn { margin-top: 10px; }
.ct-note { margin-top: 14px; text-align: center; font-size: var(--fs-sub1); color: var(--c-text-tertiary); }

@media (max-width: 1024px) {
    .ct-wrap { grid-template-columns: 1fr; }
    .ct-side-box { position: static; }
}
@media (max-width: 768px) {
    /* 좁은 폭에서는 표 형태를 버리고 2행으로 접는다 (수량·금액이 아래로) */
    .ct-head { display: none; }
    .ct-item { grid-template-columns: 24px 72px 1fr; gap: 12px; padding: 16px; }
    .ct-thumb { width: 72px; height: 72px; }
    .ct-qty { grid-column: 3; justify-content: flex-start; }
    .ct-sum { grid-column: 3; text-align: left; }
    .ct-side-box { padding: 20px; }
}

/* ══ 주문·결제 추가분 (P-304) ══════════════════════════════════════
   2026-08-07 · 출처 page_img/장바구니_결제.png
   골격(.ck-*)은 키트 결제와 공용이다 — 여기서는 결제 방식·플랜·카드·포인트만 덧댄다. */
.ck-paytype { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 20px; }
.ck-paytype-opt {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    padding: 20px; border: 1px solid var(--c-gray-200); border-radius: var(--r-md);
    background: var(--c-gray-50); cursor: pointer;
}
.ck-paytype-opt:has(.rdo:checked) { border-color: var(--c-primary); background: var(--c-surface); }
.ck-paytype-opt.is-disabled { opacity: .5; cursor: not-allowed; }
.ck-paytype-body { display: grid; gap: 6px; min-width: 0; }
.ck-paytype-name { font-size: var(--fs-body1); font-weight: var(--fw-semibold); }
.ck-paytype-desc { font-size: var(--fs-sub1); color: var(--c-text-secondary); }
.ck-paytype-note { margin-top: 12px; font-size: var(--fs-sub1); color: var(--c-text-tertiary); line-height: 1.6; }
/* ── 내장 테스트 결제창 (2026-08-11) ────────────────────────────────
   포트원 키를 받기 전에 결제 흐름을 밟아 보기 위한 화면이다. **개발 환경에서만** 열린다.
   ⚠️ z-index 180 — 공통 모달(170) 위, 토스트(200) 아래. 결제창은 무엇보다 위에 있어야 한다.
   ⚠️ 실제 PG 창을 흉내 내지 않는다 — 테스트라는 사실을 상단에 명확히 적는다. */
.paymock {
    position: fixed; inset: 0; z-index: 180;
    display: flex; align-items: center; justify-content: center;
    padding: var(--page-margin);
    background: var(--c-backdrop);
}
.paymock-box {
    width: 380px; max-width: 100%;
    padding: 26px 24px 22px; border-radius: var(--r-md);
    background: var(--c-surface); text-align: center;
}
.paymock-flag {
    padding: 8px 10px; border-radius: var(--r-sm);
    background: var(--c-gold-bg); color: var(--c-gold-text);
    font-size: var(--fs-sub1);
}
.paymock-name   { margin-top: 18px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.paymock-amount { margin-top: 6px; font-size: var(--fs-sh1); font-weight: var(--fw-bold); }
.paymock-info   { margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--c-line); text-align: left; }
.paymock-info > div { display: flex; justify-content: space-between; gap: 12px; padding: 5px 0; }
.paymock-info dt { font-size: var(--fs-body2); color: var(--c-text-secondary); }
.paymock-info dd { font-size: var(--fs-body2); }
.paymock-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 22px; }
.paymock-actions .btn { width: 100%; }

/* 포트원 상태 안내 (2026-08-11) — 테스트 결제는 눈에 띄게, 미연결은 담담하게 */
.ck-pg-note { margin-top: 12px; font-size: var(--fs-sub1); color: var(--c-text-tertiary); line-height: 1.6; }
.ck-pg-note.is-test {
    padding: 10px 14px; border-radius: var(--r-sm);
    background: var(--c-gold-bg); color: var(--c-gold-text);
}

.ck-sub-label { margin-top: 28px; margin-bottom: 10px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.ck-plans { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ck-plan { display: block; cursor: pointer; }
.ck-plan-input { position: absolute; opacity: 0; width: 0; height: 0; }
.ck-plan-body {
    display: grid; gap: 6px; justify-items: center; padding: 18px 12px;
    border: 1px solid var(--c-gray-200); border-radius: var(--r-md); background: var(--c-gray-50); text-align: center;
}
.ck-plan-input:checked + .ck-plan-body { border-color: var(--c-primary); background: var(--c-surface); }
.ck-plan-input:focus-visible + .ck-plan-body { box-shadow: 0 0 0 3px var(--c-focus-ring); }
.ck-plan-name { font-size: var(--fs-body1); font-weight: var(--fw-semibold); }
.ck-plan-bonus { font-size: var(--fs-sub1); color: var(--c-text-secondary); }
.ck-plan-input:checked + .ck-plan-body .ck-plan-bonus { color: var(--c-primary); font-weight: var(--fw-semibold); }
.ck-plan-foot { margin-top: 12px; font-size: var(--fs-sub1); color: var(--c-text-tertiary); line-height: 1.6; }

/* ── 플랜별 적립 포인트 표 (2026-08-25 · 요청 #2) ─────────────────────
   완주 보너스만 보이고 월 적립·총액을 알 수 없어 네 값으로 나눠 표기한다.
   ⚠️ 기존 `.ck-plan*` 규칙은 건드리지 않는다 — 카드 안의 '완주 시 +N P' 는 그대로 둔다. */
.ck-pt { margin-top: 14px; padding: 16px 18px; border-radius: var(--r-md); background: var(--c-gray-50); }
.ck-pt-cap {
    display: flex; align-items: baseline; gap: 8px;
    font-size: var(--fs-body2); font-weight: var(--fw-semibold); color: var(--c-text-primary);
}
.ck-pt-cap span { font-size: var(--fs-sub1); font-weight: var(--fw-regular); color: var(--c-text-tertiary); }
/* 좁은 화면에서 표만 가로로 흐르게 — 페이지가 밀리지 않는다 */
.ck-pt-scroll { margin-top: 10px; overflow-x: auto; }
.ck-pt-table { width: 100%; border-collapse: collapse; font-size: var(--fs-body2); white-space: nowrap; }
.ck-pt-table th, .ck-pt-table td { padding: 8px 10px; text-align: right; }
.ck-pt-table thead th {
    font-size: var(--fs-sub1); font-weight: var(--fw-medium); color: var(--c-text-tertiary);
    border-bottom: 1px solid var(--c-line);
}
.ck-pt-table tbody th, .ck-pt-table thead th:first-child { text-align: left; }
.ck-pt-table tbody th { font-weight: var(--fw-semibold); color: var(--c-text-secondary); }
.ck-pt-table tbody tr + tr th, .ck-pt-table tbody tr + tr td { border-top: 1px solid var(--c-divider); }
.ck-pt-table .is-total { font-weight: var(--fw-bold); color: var(--c-text-primary); }
.ck-pt .ck-plan-foot { margin-top: 10px; }
/* 선택한 플랜 강조 — `:has()` 미지원이면 강조만 빠지고 표는 그대로 읽힌다 (건강목표 카드와 같은 방식)
   🔄 2026-08-27 (요청 3) — 강조가 거의 안 보였다. 표 배경이 이미 `--c-gray-50` 인데
   선택 행에 `--c-bg-primary`(흰색)를 깔아 **차이가 사실상 없었다**.
   → 브랜드 색 배경 + 왼쪽 굵은 선 + 글자 강조로 바꾼다.
   ⚠️ `tr` 배경은 셀 배경에 가려질 수 있어 **th/td 에 직접** 준다(border-collapse 표에서 안전하다). */
.ck-subonly:has(.ck-plan-input[value="3"]:checked)  .ck-pt-table tr[data-plan="3"] > *,
.ck-subonly:has(.ck-plan-input[value="6"]:checked)  .ck-pt-table tr[data-plan="6"] > *,
.ck-subonly:has(.ck-plan-input[value="12"]:checked) .ck-pt-table tr[data-plan="12"] > * {
    background: var(--c-main-100);
    color: var(--c-main-300);
    font-weight: var(--fw-semibold);
}
/* 왼쪽 끝에 굵은 선 — 어느 줄이 선택됐는지 표 밖에서도 바로 보인다 */
.ck-subonly:has(.ck-plan-input[value="3"]:checked)  .ck-pt-table tr[data-plan="3"] > *:first-child,
.ck-subonly:has(.ck-plan-input[value="6"]:checked)  .ck-pt-table tr[data-plan="6"] > *:first-child,
.ck-subonly:has(.ck-plan-input[value="12"]:checked) .ck-pt-table tr[data-plan="12"] > *:first-child {
    box-shadow: inset 3px 0 0 var(--c-main-300);
}
.ck-subonly:has(.ck-plan-input[value="3"]:checked)  .ck-pt-table tr[data-plan="3"] .is-total,
.ck-subonly:has(.ck-plan-input[value="6"]:checked)  .ck-pt-table tr[data-plan="6"] .is-total,
.ck-subonly:has(.ck-plan-input[value="12"]:checked) .ck-pt-table tr[data-plan="12"] .is-total {
    color: var(--c-main-300); font-weight: var(--fw-bold);
}
/* 선택되지 않은 줄은 한 톤 낮춰 대비를 키운다 */
.ck-subonly:has(.ck-plan-input:checked) .ck-pt-table tbody tr:not([data-plan="3"]):not([data-plan="6"]):not([data-plan="12"]) { opacity: 1; }
.ck-pt-table tbody tr { transition: background .15s; }

/* 🔄 2026-08-27 (요청 4) — 폰에서 **가로 스크롤을 아예 없앤다.**
   `nowrap` 때문에 마지막 열(총 적립)이 스크롤 밖으로 밀려 있었다 → 줄바꿈을 허용하고
   `table-layout: fixed` 로 네 칸이 화면 폭을 나눠 갖게 한다. 스크롤 컨테이너도 끈다.
   ⚠️ 이 블록은 **`.ck-pt` 기본 선언보다 뒤**에 있어야 한다 — 위쪽 `.ck-card` 모바일 블록에 두면
      기본 선언이 뒤에 와서 덮어쓴다(실제로 그렇게 적용되지 않았다). */
@media (max-width: 768px) {
    .ck-pt { padding: 14px 12px; }
    .ck-pt-scroll { overflow-x: visible; }
    .ck-pt-table { font-size: var(--fs-sub1); white-space: normal; table-layout: fixed; }
    .ck-pt-table th, .ck-pt-table td { padding: 7px 4px; word-break: keep-all; }
    /* 플랜 이름 칸만 고정폭 — 나머지 세 칸이 고르게 나눠 갖는다 */
    .ck-pt-table thead th:first-child, .ck-pt-table tbody th { width: 54px; }
}
/* 아주 좁은 기기(360 이하) — 숫자는 중간에서 끊을 수 없어 칸 폭·글자를 한 단계 더 줄인다 */
@media (max-width: 380px) {
    .ck-pt { padding: 12px 8px; }
    .ck-pt-table { font-size: 11px; }
    .ck-pt-table th, .ck-pt-table td { padding: 6px 2px; }
    .ck-pt-table thead th:first-child, .ck-pt-table tbody th { width: 44px; }
}

.ck-cards { display: grid; gap: 10px; }
.ck-card-pick {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    padding: 18px 20px; border: 1px solid var(--c-gray-200); border-radius: var(--r-md);
    background: var(--c-gray-50); font-size: var(--fs-body1); cursor: pointer;
}
.ck-card-pick:has(.rdo:checked) { border-color: var(--c-primary); background: var(--c-surface); }
/* 결제 방식 전용 영역 — ⚠️ [hidden] 가드 필수 (아래 display 선언이 UA 규칙을 이긴다) */
.ck-singleonly[hidden] { display: none; }

/* 카드 등록 폼 — 화면단만(빌링키 발급 미연동) */
.ck-cardform {
    margin-top: 16px; padding: 24px;
    border: 1px solid var(--c-border-primary); border-radius: var(--r-md); background: var(--c-gray-50);
}
.ck-cardform[hidden] { display: none; }
.ck-cardform .ck-picks { margin-top: 0; margin-bottom: 18px; }
.ck-cardform-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.ck-cardform-row .field[hidden] { display: none; }
.ck-cardform > .btn { margin-top: 8px; }
@media (max-width: 768px) { .ck-cardform-row { grid-template-columns: 1fr; } }

.ck-card-add {
    width: 100%; margin-top: 10px; padding: 18px; border: 1px solid var(--c-gray-200);
    border-radius: var(--r-md); background: var(--c-surface);
    font-size: var(--fs-body1); color: var(--c-text-secondary);
}
.ck-card-add:disabled { color: var(--c-text-disabled); cursor: not-allowed; }
/* 2026-08-12 — <button> 에서 <a> 로 바뀌었다(마이페이지 카드 관리로 이동) */
.ck-card-add { display: block; text-align: center; }
.ck-card-add:hover { border-color: var(--c-main-200); color: var(--c-text-primary); }
.ck-card-add-note { margin-top: 10px; font-size: var(--fs-sub1); color: var(--c-text-tertiary); line-height: 1.6; }
.ck-card-add-note strong { color: var(--c-text-secondary); font-weight: var(--fw-semibold); }

.ck-point-have { font-size: var(--fs-body2); color: var(--c-text-secondary); }
.ck-point-have > strong { color: var(--c-primary); }
.ck-point { display: flex; gap: 10px; margin-top: 20px; }
.ck-point > .input { flex: 1 1 auto; min-width: 0; }
.ck-point > .btn { flex: 0 0 auto; height: 48px; padding: 0 22px; }

.ck-sum-row.is-off > span:last-child { color: var(--c-red-main); }
.ck-subonly[hidden] { display: none; }

/* 주소 검색 — **공통 모달** 안에 다음 우편번호 서비스를 embed 한다.
   · `window.open` 팝업을 안 쓰는 이유: React Native WebView 래퍼에서 안 열리고 팝업 차단에도 걸린다
   · 인라인 레이어도 안 쓴다: 누른 버튼(우편번호)에서 두 칸 아래에 열려 어디서 열린 건지 알기 어려웠다 */
.pc-embed { height: 460px; border: 1px solid var(--c-border-primary); border-radius: var(--r-sm); overflow: hidden; }
.pc-embed > div { width: 100% !important; height: 100% !important; }
@media (max-width: 768px) { .pc-embed { height: 400px; } }

/* 배송지 목록 모달 — 키트 결제와 **같은 컴포넌트**(.ck-addr-*)를 그대로 쓴다.
   ⚠️ 여기서 .ck-addr-card / -label / -badge / -info 를 다시 선언하지 말 것 —
      뒤에 있어 키트 결제 팝업까지 덮어쓴다(실제로 그렇게 깨졌다). 빈 상태 문구만 추가한다. */
.ck-addr-empty {
    padding: 32px 0; text-align: center;
    font-size: var(--fs-body2); color: var(--c-text-secondary); line-height: 1.7;
}

@media (max-width: 768px) {
    .ck-paytype { grid-template-columns: 1fr; }
    /* 🔄 2026-08-27 (요청 2) — 구독 플랜은 **한 줄에 3개** 그대로. 세로로 쌓으면 화면을 다 먹고
       셋을 견줘 고르기 어렵다. 폭이 좁아진 만큼 여백·글자만 줄인다. */
    .ck-plans { grid-template-columns: repeat(3, 1fr); gap: 8px; }
    .ck-plan-body { gap: 4px; padding: 12px 4px; }
    .ck-plan-name { font-size: var(--fs-body2); }
    .ck-plan-bonus { font-size: 11px; line-height: 1.3; word-break: keep-all; }
}

/* ══ 주문 완료 (P-305) ═════════════════════════════════════════════
   2026-08-07 · 출처 page_img/장바구니_결제완료.png — 가운데 정렬 648 폭 */
.oc { max-width: 648px; margin: 0 auto; padding-top: 60px; text-align: center; }
.oc-ico {
    display: flex; align-items: center; justify-content: center;
    width: 80px; height: 80px; margin: 0 auto; border-radius: 50%;
    background: var(--c-green-bg); color: var(--c-green-main); font-size: var(--fs-h2);
}
.oc-title { margin-top: 28px; font-size: var(--fs-sh1); font-weight: var(--fw-bold); }
.oc-desc { margin-top: 12px; font-size: var(--fs-body2); color: var(--c-text-secondary); line-height: 1.7; }

.oc-card {
    margin-top: 40px; padding: 32px; text-align: left;
    border: 1px solid var(--c-gray-200); border-radius: var(--r-lg); background: var(--c-surface);
}
.oc-card-title { font-size: var(--fs-sh2); font-weight: var(--fw-bold); }
.oc-rows { margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--c-gray-200); display: grid; gap: 16px; }
.oc-rows > div { display: flex; align-items: center; justify-content: space-between; gap: 16px; font-size: var(--fs-body2); }
.oc-rows dt { flex: 0 0 auto; color: var(--c-text-secondary); }
.oc-rows dd { min-width: 0; text-align: right; }
.oc-price { font-size: var(--fs-body1); font-weight: var(--fw-bold); color: var(--c-primary); }

.oc-next {
    display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: 10px;
    margin-top: 16px; padding: 20px; border-radius: var(--r-md);
    background: var(--c-main-100); font-size: var(--fs-body2); color: var(--c-text-secondary);
}
.oc-next > strong { color: var(--c-primary); }
.oc-next-bar { color: var(--c-gray-300); }

.oc-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 32px; }

@media (max-width: 768px) {
    .oc { padding-top: 32px; }
    .oc-card { padding: 24px; }
    .oc-rows > div { flex-direction: column; align-items: flex-start; gap: 4px; }
    .oc-rows dd { text-align: left; }
    .oc-actions { grid-template-columns: 1fr; }
}

/* ══ 마이페이지 첫 화면 (요약) ═════════════════════════════════════
   2026-08-10 · 출처 page_img/마이페이지.png (실측)
   골격은 고객센터(.cs-wrap)와 같다 — 좌 사이드 268 + 간격 68 + 콘텐츠 984.
   ⚠️ 브레드크럼·제목·테이블은 고객센터 것(.cs-crumb / .cs-heading / .cs-table)을 그대로 쓴다. */
.mp-wrap { display: grid; grid-template-columns: 268px minmax(0, 1fr); gap: 68px; padding-top: 40px; }

/* 마이페이지의 **서브 텍스트는 Text/Secondary(#3C3E40)** 다 — 2026-08-10 교정.
   ⚠️ `--c-text-sub` 는 Tertiary(gray-600 #787A7D) 별칭이라 시안보다 옅게 나왔다.
      서브 텍스트에는 `--c-text-secondary` 를 쓴다.
   아래 3개는 고객센터와 **공유하는 클래스**라 마이페이지 안에서만 덮어쓴다. */
.mp-wrap .cs-crumb,
.mp-wrap .cs-meta,
.mp-wrap .cs-table th { color: var(--c-text-secondary); }
/* 모달은 .mp-wrap 밖(body 직속)이라 스코프가 안 걸린다 → 마이페이지 팝업만 직접 지정 */
#leave-modal .modal-desc,
#logout-modal .modal-desc,
#address-form .modal-desc,
#address-del .modal-desc,
#address-form .field-label,
#leave-modal .field-label { color: var(--c-text-secondary); }
.mp-side-title { font-size: var(--fs-h3); font-weight: var(--fw-bold); }
.mp-side-group { margin-top: 44px; padding: 0 20px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.mp-side-nav { margin-top: 8px; display: flex; flex-direction: column; }
.mp-side-link {
    padding: 13px 20px; font-size: var(--fs-body2); color: var(--c-text-secondary);
    border-left: 3px solid transparent;
}
a.mp-side-link:hover { color: var(--c-text-primary); }
.mp-side-link.is-active {
    background: var(--c-main-100); border-left-color: var(--c-main-300);
    color: var(--c-main-300); font-weight: var(--fw-semibold);
}
/* 아직 개발 전인 메뉴 — 색은 다른 메뉴와 같게 두고(#3C3E40), 눌리지 않는다는 것만 커서로 알린다.
   2026-08-10 — 옅은 회색(disabled)이면 사이드 메뉴 안에서 색이 두 가지로 보인다. */
.mp-side-link.is-soon { cursor: default; }
/* 로그아웃 (2026-08-14) — 메뉴가 아니라 '나가기' 라 위에 구분선을 두고 톤을 낮춘다.
   ⚠️ `<button>` 이라 리셋(`button{background:none;border:0}`)만으로는 왼쪽 정렬이 안 된다 → 명시한다. */
.mp-side-out { margin-top: 24px; padding-top: 12px; border-top: 1px solid var(--c-line); }
.mp-side-link.is-logout {
    width: 100%; text-align: left; font: inherit;
    font-size: var(--fs-body2); color: var(--c-text-tertiary); cursor: pointer;
}
.mp-side-link.is-logout:hover { color: var(--c-text-primary); }

/* ── 요약 카드 3개 ── */
.mp-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--grid-gutter); margin-top: 30px; }
.mp-card {
    min-width: 0; padding: 26px 28px 24px;
    border: 1px solid var(--c-line); border-radius: var(--r-md); background: var(--c-surface);
    display: flex;
    flex-direction: column;
    justify-content: space-between;
}
.mp-card-label { font-size: var(--fs-body2); color: var(--c-text-secondary); }
.mp-card-value {
    display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 14px;
    font-size: var(--fs-h2); font-weight: var(--fw-bold); line-height: 1.3;
}
.mp-card-value strong {font-size: var(--fs-sh1);}
.mp-card-value.is-point { color: var(--c-primary); }
.mp-card-desc { margin-top: 14px; font-size: var(--fs-sub1); color: var(--c-gray-600); }
/* 모바일 시안(mo_main.JPG) 전용 — PC 에서는 쓰지 않는다 (2026-08-27).
   PC 는 기존대로 `.mp-card-desc` 한 줄로 총 적립·사용을 보여 준다. */
.mp-pt-coin, .mp-pt-sum { display: none; }

/* ── 회원 정보 (P-401) — page_img/마이페이지_회원정보.png ── */
.mi-form { padding-top: 34px; }
.mi-sec { font-size: var(--fs-body1); font-weight: var(--fw-semibold); }
.mi-sec.is-line { margin-top: 44px; padding-top: 44px; border-top: 1px solid var(--c-line); }
/* 라벨 224 + 입력 424 (시안 실측) */
.mi-row { display: grid; grid-template-columns: 224px minmax(0, 424px); align-items: center; gap: 0; margin-top: 24px; }
/* ⚠️ `display: grid` 가 UA 의 [hidden]{display:none} 을 덮어쓴다 → 뒤에서 다시 감춘다.
      휴대폰 인증 단계(인증번호 행)를 숨기는 데 쓴다. */
.mi-row[hidden] { display: none; }
.mi-sec + .mi-row { margin-top: 26px; }
.mi-label { font-size: var(--fs-body1); color: var(--c-gray-900); font-weight: var(--fw-medium); }
.mi-input { width: 100%; }
/* 이메일은 읽기 전용 — 입력창처럼 보이되 만질 수 없다는 걸 배경으로 알린다 */
.mi-input.is-readonly { background: var(--c-gray-100); color: var(--c-text-secondary); }
.mi-chip {
    justify-self: start; padding: 8px 16px; border-radius: var(--r-sm);
    background: var(--c-gray-200); font-size: var(--fs-body2); color: var(--c-gray-900);
    font-weight: var(--fw-semibold);
}
.mi-note { margin-top: 20px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
/* 휴대폰 인증 안내 — 라벨 칸을 비우고 입력 칸 아래에 붙인다 */
.mi-help { margin-top: -8px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.mi-row .input-btn { width: 100%; }

.mi-actions {
    display: flex; align-items: center; justify-content: space-between; gap: 20px;
    margin-top: 44px; padding-top: 34px; border-top: 1px solid var(--c-line);
}
.mi-save { min-width: 200px; }
.mi-links { display: flex; align-items: center; gap: 14px; font-size: var(--fs-body2); }
.mi-logout { color: var(--c-red-main); font-weight: var(--fw-medium); }
.mi-logout:hover { text-decoration: underline; }
.mi-divider { color: var(--c-gray-300); }
.mi-leave { color: var(--c-text-secondary); }
.mi-leave:hover { color: var(--c-text-primary); text-decoration: underline; }

/* ── 회원탈퇴 팝업 — page_img/마이페이지_회원정보_회원탈퇴.png ── */
.lv-sec { font-size: var(--fs-body1); font-weight: var(--fw-bold); }
.lv-notice {
    margin-top: 14px; padding: 22px 24px; border-radius: var(--r-sm); background: var(--c-gray-100);
    font-size: var(--fs-body2); line-height: 1.9; color: var(--c-text-secondary);
    /* 관리자 약관(일반 텍스트)을 그대로 — 줄바꿈·들여쓰기 보존 */
    white-space: pre-wrap; word-break: break-word;
}
.lv-field { margin-top: 26px; }
.lv-req { color: var(--c-red-main); }
.lv-note { margin-top: 22px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
/* 모달 하단 2버튼 줄 — 회원탈퇴·로그아웃 팝업 공용.
   취소는 디자인 시스템의 `.btn-soft` 를 쓴다(별도 변형을 만들지 않는다). */
.modal-pair { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 30px; }
/* 탈퇴는 되돌릴 수 없는 동작이라 시안대로 빨강 — 브랜드 보라(primary)를 쓰지 않는다 */
.lv-submit { background: var(--c-red-main); color: var(--c-on-color); }
.lv-submit:hover { background: var(--c-red-text); }

/* ── 포인트 내역 (P-405) — page_img/마이페이지_포인트내역.png ── */
.pt-banner {
    display: flex; align-items: center; gap: 40px; margin-top: 26px;
    padding: 34px 40px; border-radius: var(--r-md); background: var(--c-main-300); color: var(--c-on-color);
}
.pt-banner-label { font-size: var(--fs-body1); }
.pt-banner-value { display: flex; align-items: center; gap: 12px; font-size: var(--fs-h2); font-weight: var(--fw-bold); }
/* ⚠️ 포인트 마크 에셋이 없어 원 안에 글자로 대신한다 */
.pt-mark {
    display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px;
    border-radius: 50%; background: var(--c-on-color); color: var(--c-main-300);
    font-size: var(--fs-body2); font-weight: var(--fw-bold);
}
.pt-banner-note { margin-left: auto; padding-left: 40px; border-left: 1px solid var(--c-dim-strong); font-size: var(--fs-body2); }
.pt-filter { margin-top: 30px; }
.pt-table { margin-top: 6px; }
.pt-table td { padding: 18px 12px; text-align: center; }
.pt-amount { font-weight: var(--fw-semibold); }
.pt-amount.is-blue { color: var(--c-blue-text); }
.pt-amount.is-red  { color: var(--c-red-main); }

@media (max-width: 768px) {
    .pt-banner { flex-direction: column; align-items: flex-start; gap: 14px; padding: 24px; }
    .pt-banner-note { margin-left: 0; padding-left: 0; border-left: 0; }
    .pt-table td { padding: 14px 6px; }
    /* 좁은 폭에서는 잔여 포인트를 숨긴다 — 변동 금액이 먼저다 */
    /* 2026-08-11 — 좁은 폭에서 '잔여 포인트' 열을 숨기던 규칙 폐기. `is-stack` 세로 카드가 전부 보여 준다 */
}

/* ── 정기구독 결제수단 (P-414) — page_img/마이페이지_정기구독 결제수단.png · _(1).png ── */
.cd-list { margin-top: 30px; display: flex; flex-direction: column; gap: 20px; }
.cd-card {
    display: grid; grid-template-columns: 68px minmax(0, 1fr) auto; align-items: center; gap: 22px;
    padding: 24px 28px; border: 1px solid var(--c-line); border-radius: var(--r-md); background: var(--c-surface);
}
/* ⚠️ 카드사 이미지 에셋이 없어 중립 카드 모양으로 둔다 — 에셋이 오면 <img> 로 교체한다 */
.cd-thumb {
    display: block; width: 68px; aspect-ratio: 68 / 44; border-radius: 6px;
    background: var(--c-gray-200); border: 1px solid var(--c-gray-300);
}
.cd-no { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: var(--fs-sh2); font-weight: var(--fw-bold); }
.cd-company { margin-top: 8px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.cd-tools { display: flex; align-items: center; gap: 12px; font-size: var(--fs-body2); }
/* 삭제 모션 — JS 가 클래스를 붙이고 전환이 끝나면 행을 제거한다(2026-08-10) */
.cd-card { transition: opacity .25s ease, transform .25s ease; }
.cd-card.is-removing { opacity: 0; transform: translateX(16px); }
/* 추가·수정 직후 나타나는 모션 — JS 가 다음 프레임에 클래스를 뗀다 */
.cd-card.is-adding { opacity: 0; transform: translateY(-8px); }
/* ⚠️ `.cd-list` 는 display:flex 라 UA 의 [hidden] 을 덮는다 → 뒤에서 다시 감춘다 */
.cd-list[hidden] { display: none; }
.cd-del-note { font-size: var(--fs-body2); color: var(--c-text-tertiary); }

/* 카드 등록 폼 */
.cf-form .field.cf-gap { margin-top: 20px; }
.cf-radios { display: flex; gap: 28px; margin-top: 12px; }
/* 카드사 인증 창 안내 (2026-08-12) — 카드번호 입력 폼을 대신한다 */
.cf-guide {
    margin-top: 20px; padding: 14px 16px; border-radius: var(--r-sm);
    background: var(--c-main-100); color: var(--c-text-secondary);
    font-size: var(--fs-body2); line-height: 1.6;
}
.cf-guide strong { color: var(--c-text-primary); font-weight: var(--fw-semibold); }
/* 테스트 모드 안내 — 실제 청구가 안 된다는 사실은 **감추지 않는다**(골드 톤으로 눈에 띄게) */
.cf-guide.is-test { background: var(--c-gold-bg); color: var(--c-gold-text); }
.cf-guide.is-test strong { color: var(--c-gold-text); }
.cf-radio { display: flex; align-items: center; gap: 10px; font-size: var(--fs-body1); cursor: pointer; }
/* ⚠️ `.field` 는 display 선언이 없어 [hidden] 이 그대로 먹는다(개인 ↔ 사업자 전환) */

@media (max-width: 768px) {
    .cd-card { grid-template-columns: 56px minmax(0, 1fr); gap: 14px; padding: 18px; }
    .cd-thumb { width: 56px; }
    .cd-tools { grid-column: 2; justify-content: flex-end; }
}

/* ── 주문 내역 (P-402·P-403) — page_img/마이페이지_주문내역.png · _상세.png ── */
.od-tabs { margin-top: 26px; }
.od-filter { display: flex; gap: 8px; margin-top: 26px; flex-wrap: wrap; }
.od-range-info { margin-top: 14px; font-size: var(--fs-body2); color: var(--c-text-secondary); }

.od-list { margin-top: 26px; display: flex; flex-direction: column; gap: 24px; }
.od-card { border: 1px solid var(--c-line); border-radius: var(--r-md); background: var(--c-surface); overflow: hidden; }
.od-card-head {
    display: flex; align-items: center; justify-content: space-between; gap: 16px;
    padding: 20px 28px; border-bottom: 1px solid var(--c-line);
}
.od-state { font-size: var(--fs-sh2); font-weight: var(--fw-bold); }
.od-state.is-blue   { color: var(--c-blue-text); }
.od-state.is-purple { color: var(--c-main-300); }
.od-state.is-green  { color: var(--c-green-text); }
.od-state.is-gold   { color: var(--c-gold-text); }
.od-state.is-red    { color: var(--c-red-text); }
.od-state.is-gray   { color: var(--c-text-tertiary); }
.od-meta { font-size: var(--fs-body2); color: var(--c-text-secondary); }
.od-meta i { margin: 0 8px; color: var(--c-gray-300); font-style: normal; }

.od-item { display: grid; grid-template-columns: 80px minmax(0, 1fr) auto; align-items: center; gap: 22px; padding: 24px 28px; }
.od-thumb { display: block; width: 80px; aspect-ratio: 1 / 1; border-radius: var(--r-sm); }
.od-date { font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.od-name { display: block; margin-top: 6px; font-size: var(--fs-sh2); font-weight: var(--fw-bold); }
.od-name:hover { text-decoration: underline; }
.od-sub { margin-top: 6px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
/* 운송장 — 배송중부터 목록에서도 확인할 수 있게 (2026-08-10) */
.od-track { margin-top: 6px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.od-track > b { font-weight: var(--fw-semibold); color: var(--c-text-secondary); }
.od-price { font-size: var(--fs-sh1); font-weight: var(--fw-bold); white-space: nowrap; }
/* 가격은 PC 에선 우측 칸(.is-side), 모바일에선 **운송장번호 아래 줄**(.is-inline)에 둔다 (2026-08-26) */
.od-price.is-inline { display: none; }
/* 모바일 전용 짧은 안내 — PC 는 hover 툴팁을 쓴다 */
.ov-tip-short { display: none; }


/* ⚠️ 3등분 고정이면 버튼이 1~2개일 때(주문 상태에 따라 [구매확정]·[리뷰작성]이 빠진다) 오른쪽이 비어 보인다.
   → flex + `flex: 1` 로 **몇 개든 줄을 채우게** 한다 (시안의 3버튼·1버튼 배치가 그대로 나온다). */
.od-actions { display: flex; gap: 14px; padding: 0 28px 24px; }
.od-actions > * { flex: 1 1 0; min-width: 0; }
/* 시안 — [구매확정]만 보라 강조, 나머지는 옅은 테두리의 중립 버튼 */
.od-actions .is-neutral { border-color: var(--c-line); color: var(--c-text-primary); }
.od-actions .is-neutral:hover { background: var(--c-gray-100); }

/* ── 상세 ── */
.ov-summary {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px;
    margin-top: 26px; padding: 24px 28px; border-radius: var(--r-md); background: var(--c-gray-100);
}
.ov-summary dt { font-size: var(--fs-body2); color: var(--c-text-secondary); }
.ov-summary dd { margin-top: 10px; font-size: var(--fs-body1); font-weight: var(--fw-semibold); word-break: break-all; }
.ov-summary dd.is-accent { color: var(--c-primary); }

.ov-bonus {
    margin-top: 16px; padding: 18px 24px; border-radius: var(--r-md);
    background: var(--c-main-100); color: var(--c-main-300); font-size: var(--fs-body1);
}

/* 적립 상세 (2026-08-25 · 요청 #2) — `.ov-bonus` 배경·여백을 그대로 물려받고 내용만 나눈다 */
.ov-pt-cap {
    display: flex; align-items: baseline; gap: 8px;
    font-size: var(--fs-body1); font-weight: var(--fw-semibold);
}
.ov-pt-cap span { font-size: var(--fs-sub1); font-weight: var(--fw-regular); opacity: .75; }
.ov-pt-list { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-top: 14px; }
.ov-pt-list dt { font-size: var(--fs-sub1); opacity: .8; }
.ov-pt-list dd { margin-top: 6px; font-size: var(--fs-body1); font-weight: var(--fw-semibold); }
.ov-pt-list .is-total dd { font-size: var(--fs-sh2); font-weight: var(--fw-bold); }
.ov-pt-foot { margin-top: 14px; font-size: var(--fs-sub1); line-height: 1.6; opacity: .85; }
/* 적립 방식 설명 — 접기/펼치기 (2026-08-26) */
.ov-pt-more { margin-top: 12px; }
.ov-pt-more > summary {
    cursor: pointer; list-style: none; display: inline-flex; align-items: center; gap: 6px;
    font-size: var(--fs-sub1); font-weight: var(--fw-semibold);
}
.ov-pt-more > summary::-webkit-details-marker { display: none; }
.ov-pt-more > summary::after { content: '▾'; font-size: 11px; transition: transform .15s; }
.ov-pt-more[open] > summary::after { transform: rotate(180deg); }
.ov-pt-more > summary:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); border-radius: 4px; }

/* 구매확정 — 주문당 1개 (2026-08-26)
   🔄 2026-08-27 (요청 4) — PC 는 **상품 행 우측 끝**(첫 행)에 둔다. 마크업은 상품 행 안의
   `.ov-item-confirm` 이고, 박스 아래의 이 블록은 **모바일 전용**이 된다.
   ⚠️ 두 마크업이 함께 그려지지만 화면 폭에 따라 **한쪽만 보인다** — 둘 다 보이면 같은 버튼이 두 번 나온다. */
.ov-confirm { display: none; margin-top: 14px; text-align: center; }
.ov-confirm-btn { min-width: 200px; }
.ov-confirm-note { margin-top: 8px; font-size: var(--fs-sub1); color: var(--c-text-secondary); }
.ov-sec { margin-top: 46px; margin-bottom: 14px; }
.ov-box { padding: 26px 28px; border: 1px solid var(--c-line); border-radius: var(--r-md); }

.ov-item { display: flex; align-items: center; gap: 20px; }
.ov-item + .ov-item { margin-top: 16px; }
.ov-thumb { display: block; flex: 0 0 72px; width: 72px; aspect-ratio: 1 / 1; border-radius: var(--r-sm); }
.ov-item-name { font-size: var(--fs-body1); font-weight: var(--fw-bold); }
.ov-item-sub { margin-top: 6px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
/* 항목별 [리뷰작성] (2026-08-14) — 상품명·수량이 늘어나도 버튼은 오른쪽 끝에 붙는다.
   🔄 2026-08-27 (요청 6) — PC 에서 **상품 행 우측 끝**으로 되돌린다.
   ⚠️ 마크업상 버튼은 `.ov-item-body` **안**에 있다(모바일에서 수량·금액 아래로 내리기 위한 배치).
      그래서 `margin-left:auto` 만으로는 행 오른쪽으로 가지 않고 이름 아래 줄에 남았다.
      → body 를 2열 그리드로 만들어 **왼쪽 = 이름·수량 / 오른쪽 = 버튼**으로 세운다.
      마크업을 건드리지 않으므로 모바일 배치(아래 미디어쿼리)는 그대로 산다. */
.ov-item-body {
    flex: 1 1 auto; min-width: 0;
    display: grid; grid-template-columns: minmax(0, 1fr) auto;
    align-items: center; column-gap: 20px;
}
.ov-item-name { grid-column: 1; grid-row: 1; }
.ov-item-sub  { grid-column: 1; grid-row: 2; }
.ov-item-review { grid-column: 2; grid-row: 1 / span 2; margin-left: 0; }
/* [구매확정] 도 같은 슬롯을 쓴다 (2026-08-27 · 요청 4) — 첫 상품 행에만 그린다.
   ⚠️ [리뷰작성]과 겹치지 않는다: 리뷰는 구매확정 뒤에만 생긴다. */
.ov-item-confirm > .btn { white-space: nowrap; }

/* 구매확정 툴팁 (2026-08-26 · 요청 #4) — hover 는 물론 **키보드 포커스**에서도 뜬다.
   ⚠️ title 속성만 쓰면 모바일에서 아예 보이지 않아 직접 그린다. */
.ov-tip { position: relative; display: inline-flex; }
.ov-tip-text {
    position: absolute; right: 0; bottom: calc(100% + 8px); z-index: 5;
    width: max-content; max-width: 220px; padding: 8px 10px;
    border-radius: 6px;
    background: var(--c-gray-800); color: var(--c-on-color);
    font-size: var(--fs-sub1); font-weight: var(--fw-regular); line-height: 1.5;
    opacity: 0; visibility: hidden; transform: translateY(4px);
    transition: opacity .15s, transform .15s, visibility .15s;
    pointer-events: none;
}
.ov-tip-text::after {
    content: ''; position: absolute; right: 16px; top: 100%;
    border: 5px solid transparent; border-top-color: var(--c-gray-800);
}
.ov-tip:hover .ov-tip-text,
.ov-tip:focus-within .ov-tip-text,
.ov-tip.is-open .ov-tip-text { opacity: 1; visibility: visible; transform: translateY(0); }

/* 목록(P-402)에서는 버튼이 가로로 늘어난다 — 감싸는 span 도 같이 늘어나야 칸이 어긋나지 않는다 */
.od-actions .ov-tip { display: flex; }
.od-actions .ov-tip > .btn { flex: 1 1 auto; }
/* 툴팁이 붙지 않는 경우(정책 OFF·수정 버튼)는 그냥 감싸기만 한다 */
.ov-tip.is-plain { position: static; }

/* 적립 안내 전용 트리거 (2026-08-26) — 버튼을 누르면 모달이 열려 툴팁을 볼 수 없어 따로 둔다.
   PC 에서는 버튼 hover 로도 뜨므로 아이콘은 보조 수단이다. */
.ov-tip-ico {
    flex: 0 0 auto; width: 28px; height: 28px; align-self: center;
    border: 0; border-radius: 50%; background: transparent;
    color: var(--c-text-tertiary); font-size: 15px; line-height: 1; cursor: pointer;
}
.ov-tip-ico:hover { color: var(--c-primary); }
.ov-tip-ico:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }

.ov-ship { display: grid; grid-template-columns: 1fr 1fr; gap: 14px 40px; margin-top: 26px; padding-top: 24px; border-top: 1px solid var(--c-line); }
.ov-ship > div { display: flex; gap: 20px; font-size: var(--fs-body2); }
.ov-ship dt { flex: 0 0 56px; color: var(--c-text-tertiary); }
.ov-ship dd { min-width: 0; color: var(--c-text-secondary); word-break: break-word; }

/* 포인트 사용 이력 (2026-08-27 · 요청 3) — 결제 정보 바로 아래.
   ⚠️ 위 결제 요약은 주문 시점 스냅샷이고 여기는 실제 기록이라 값이 다를 수 있다(적립·환급·회수 포함). */
.ov-ptlog { margin-top: 14px; padding: 18px 20px; border-radius: var(--r-md); background: var(--c-gray-100); }
.ov-ptlog-cap { font-size: var(--fs-body2); font-weight: var(--fw-semibold); }
.ov-ptlog-list { margin-top: 10px; }
.ov-ptlog-list > li { display: flex; align-items: baseline; gap: 12px; font-size: var(--fs-body2); }
.ov-ptlog-list > li + li { margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--c-divider); }
.ov-ptlog-date { flex: 0 0 auto; color: var(--c-text-tertiary); }
.ov-ptlog-name { flex: 1 1 auto; min-width: 0; color: var(--c-text-secondary); word-break: break-word; }
.ov-ptlog-amt { flex: 0 0 auto; font-weight: var(--fw-semibold); }
.ov-ptlog-amt.is-plus  { color: var(--c-primary); }
.ov-ptlog-amt.is-minus { color: var(--c-red-text); }
/* 내역이 없을 때 — 영역은 남기고 왜 비었는지 알려 준다 (2026-08-27 · 요청 5) */
.ov-ptlog-empty { margin-top: 8px; font-size: var(--fs-body2); color: var(--c-text-tertiary); line-height: 1.6; }

/* 배송 단계 — 지난 단계는 회색, 현재 단계만 강조 */
.ov-steps { display: flex; align-items: center; margin-top: 24px; padding: 18px 20px; border-radius: var(--r-sm); background: var(--c-gray-100); }
.ov-step { flex: 1; text-align: center; font-size: var(--fs-body2); color: var(--c-text-tertiary); position: relative; }
.ov-step + .ov-step::before { content: '›'; position: absolute; left: 0; color: var(--c-gray-400); }
.ov-step.is-done { color: var(--c-text-secondary); }
.ov-step.is-now { color: var(--c-primary); font-weight: var(--fw-bold); }

/* 검체 회수 (2026-08-19) — 키트 주문에서만 나온다. 상태 표기는 P-407 의 `.dr-ship*` 을 그대로 쓴다 */
.ov-return { display: flex; align-items: center; gap: 20px; margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--c-line); }
.ov-return-label { flex: 0 0 56px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }
/* 값 영역 (2026-08-31) — 키트명 + 상태/버튼이 함께 들어온다.
   ⚠️ 키트명을 라벨에 붙이면 56px 칸에 갇혀 글자가 잘린다(실제 발생). 라벨 폭은 위
      배송 정보(`.ov-ship dt`)와 줄을 맞추는 값이라 건드리지 않는다.
   ⚠️ `min-width: 0` — flex 자식의 기본 최소 폭(min-content) 때문에 긴 상품명이
      좌측 라벨을 밀어내는 것을 막는다. */
.ov-return-body { flex: 1 1 auto; display: flex; align-items: center; flex-wrap: wrap; gap: 8px 14px; min-width: 0; }
.ov-return-kit { font-size: var(--fs-body2); color: var(--c-text-secondary); word-break: break-word; }
/* 상태·버튼·안내는 **오른쪽 끝**으로 — 키트명이 왼쪽 공간을 넉넉히 쓴다 (기존 배치 유지) */
.ov-return-body > :not(.ov-return-kit) { margin-left: auto; }
@media (max-width: 768px) {
    /* 좁은 화면에서는 라벨을 위로 — 버튼이 밀려 줄바꿈되는 것을 막는다 */
    .ov-return { flex-direction: column; align-items: flex-start; gap: 10px; }
    .ov-return-label { flex: none; }
    /* 폭이 좁아 어차피 줄이 바뀐다 — 오른쪽으로 밀지 않고 왼쪽 정렬로 둔다 */
    .ov-return-body { width: 100%; }
    .ov-return-body > :not(.ov-return-kit) { margin-left: 0; }
}

/* 정기구독 관리 */
.ov-sub { padding: 26px 28px; border: 1px solid var(--c-main-300); border-radius: var(--r-md); }
.ov-sub-head { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
.ov-sub-head.is-2 { grid-template-columns: repeat(2, 1fr); }   /* 다음 결제 금액은 아래 .ov-sub-next 로 뺐다 */
.ov-sub-next { margin-top: 22px; }
.ov-sub-tag { margin-left: 6px; font-size: var(--fs-sub1); color: var(--c-text-tertiary); }
.ov-sub-head dt { font-size: var(--fs-body2); color: var(--c-text-secondary); }
.ov-sub-head dd { margin-top: 10px; font-size: var(--fs-body1); font-weight: var(--fw-bold); }
.ov-sub-head dd.is-accent { color: var(--c-primary); }
.ov-point { margin-top: 24px; padding: 22px 24px; border-radius: var(--r-sm); background: var(--c-gray-100); }
.ov-point-head { display: flex; align-items: center; justify-content: space-between; font-size: var(--fs-body2); }
.ov-point-have strong { color: var(--c-primary); }
/* [신청]·[취소] 는 서로 다른 <form> 이라 grid 자식으로 묶이지 않아 줄이 갈렸다
   → 두 폼을 감싼 flex 한 줄로 두고, 버튼은 .btn-lg(48px)로 입력 높이에 맞춘다 (2026-08-26 · 요청 #2) */
.ov-point-row { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 10px; margin-top: 14px; }
.ov-point-form { display: flex; flex: 1 1 340px; min-width: 0; gap: 10px; }
.ov-point-form .input { flex: 1 1 auto; min-width: 0; }
.ov-point-cancel { flex: 0 0 auto; }
.ov-empty { padding: 40px 0; text-align: center; font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.ov-table td { padding: 18px 12px; text-align: center; }

/* 결제 정보 */
.ov-pay { padding: 24px 28px; border-radius: var(--r-md); background: var(--c-gray-100); }
.ov-pay > div { display: flex; align-items: center; justify-content: space-between; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.ov-pay > div + div { margin-top: 14px; }
.ov-pay dd.is-minus { color: var(--c-red-main); }
.ov-pay > .is-total { margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--c-line); font-size: var(--fs-body1); color: var(--c-text-primary); }
.ov-pay > .is-total dt { font-weight: var(--fw-bold); }
.ov-pay > .is-total dd { font-size: var(--fs-sh1); font-weight: var(--fw-bold); color: var(--c-primary); }

.ov-actions { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-top: 44px; }
/* 우측 버튼 묶음 — [구매확정]·[후기 작성]·[목록으로] (P-403) */
.ov-actions-right { display: flex; align-items: center; gap: 10px; }
.ov-cancel {
    padding: 12px 20px; border: 1px solid var(--c-line); border-radius: var(--r-sm);
    font-size: var(--fs-body2); color: var(--c-red-main); background: var(--c-surface);
}
.ov-cancel:hover { background: var(--c-red-bg); }
/* 빨간 테두리 버튼 — 되돌릴 수 없는 동작([구독 해지])에만 쓴다 (2026-08-27 · 요청 7).
   ⚠️ `.btn-outline` 뒤에 와야 색을 덮는다 — 클래스 순서가 아니라 **선언 순서**가 이긴다. */
.btn.is-danger { border-color: var(--c-red-main); color: var(--c-red-text); background: var(--c-surface); }
.btn.is-danger:hover { background: var(--c-red-bg); border-color: var(--c-red-text); }
.btn.is-danger:focus-visible { background: var(--c-red-bg); }

.or-form .field.or-gap { margin-top: 16px; }

@media (max-width: 1024px) {
    .ov-summary { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 768px) {
    .od-card-head { flex-direction: column; align-items: flex-start; gap: 6px; padding: 16px 18px; }
    .od-item { grid-template-columns: 64px minmax(0, 1fr); gap: 14px; padding: 18px; }
    .od-thumb { width: 64px; }
    /* 🔄 2026-08-26 (요청 2) — 가격을 **운송장번호 바로 아래 줄**에 둔다.
       카드 맨 아래 따로 떨어져 있으면 어디에 걸린 금액인지 읽히지 않고,
       같은 줄에 붙이면 운송장이 길어질 때 금액과 부딪힌다. */
    .od-price.is-side { display: none; }
    .od-price.is-inline { display: block; margin-top: 6px; font-size: var(--fs-sh2); }
    /* 🔄 2026-08-26 (요청 1) — 버튼이 2개면 **한 줄에 나란히** 둔다.
       전에는 세로로 쌓아 [리뷰작성] / [상세보기] 가 카드마다 두 줄을 먹었다.
       ⚠️ 세로로 눕히면 `flex: 1 1 0` 이 **높이**를 나눠 갖는 값이 되어 `.btn` 의 height 가
          무시된다(실제 발생) → 가로를 유지하고 `flex-basis: 0` 으로 폭만 나눠 갖는다. */
    /* ⚠️ flex 로는 두 칸 폭이 정확히 같아지지 않았다(감싼 span 의 콘텐츠 폭이 남는다) —
          **grid 균등 분할**로 확정한다. 버튼이 1개면 한 칸이라 자연히 전체 폭이 된다. */
    .od-actions {
        display: grid; grid-auto-flow: column; grid-auto-columns: 1fr;
        gap: 10px; padding: 0 18px 18px;
    }
    .od-actions > * { min-width: 0; }
    .od-actions > .btn { width: 100%; }

    /* 🔄 2026-08-26 (요청 1·3) — 적립 안내는 **짧은 문구로 바로** 보여 준다.
       ⓘ 를 눌러야 보이던 툴팁은 모바일에서 잘 눌리지 않았고, 아이콘이 폭을 먹어
       [리뷰작성] 이 [상세보기] 보다 좁아졌다 → 아이콘·툴팁을 숨기고 문구만 남긴다. */
    .od-actions .ov-tip {
        position: relative; display: flex; flex-direction: column;
        align-items: stretch; gap: 4px;
    }
    .od-actions .ov-tip > .btn { width: 100%; }
    .od-actions .ov-tip-ico,
    .od-actions .ov-tip-text { display: none; }
    .od-actions .ov-tip-short {
        display: block; margin-top: 4px;          /* 버튼과 살짝 띄운다 (요청 1) */
        font-size: var(--fs-sub1); color: var(--c-primary);
        text-align: center; line-height: 1.3;
    }
    .od-actions .ov-tip-mark { font-style: normal; }
    /* 🔄 2026-08-26 (요청 3) — 상단 요약·적립 섹션을 **컴팩트하게**.
       한 항목이 한 줄씩 차지해 주문상품·배송까지 한참 스크롤해야 했다.
       ⚠️ 값을 줄이지 않고 **2열 + 라벨/값 한 줄**로 눕혀 높이만 줄인다. */
    .ov-summary {
        grid-template-columns: 1fr 1fr; gap: 10px 14px;
        margin-top: 16px; padding: 14px 16px;
    }
    .ov-summary > div { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
    .ov-summary dt { font-size: var(--fs-sub1); }
    .ov-summary dd { margin-top: 0; font-size: var(--fs-body2); text-align: right; }

    /* 적립 상세 — 4칸 2×2 + 여백·글자 축소 */
    .ov-bonus { margin-top: 10px; padding: 14px 16px; font-size: var(--fs-body2); }
    .ov-pt-cap { font-size: var(--fs-body2); }
    .ov-pt-list { grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 10px; }
    .ov-pt-list dt { font-size: var(--fs-caption, 11px); }
    .ov-pt-list dd { margin-top: 2px; font-size: var(--fs-body2); }
    .ov-pt-list .is-total dd { font-size: var(--fs-body1); }
    .ov-pt-foot { margin-top: 10px; line-height: 1.5; }

    /* 섹션 제목 간격도 줄여 본문이 빨리 올라오게 한다 */
    .ov-sec { margin-top: 22px; margin-bottom: 10px; }
    .ov-sec-row { margin-top: 22px; margin-bottom: 10px; }

    /* 🔄 2026-08-26 (요청 3) — **주문상품 · 배송을 맨 위로**.
       회원이 이 화면에서 먼저 보려는 건 무엇을 샀고 어디까지 왔는지다.
       ⚠️ 마크업은 그대로 두고 `order` 로만 바꾼다 — PC 순서는 손대지 않는다. */
    .mp-body { display: flex; flex-direction: column; }
    .mp-body > .cs-crumb { order: 0; }
    .mp-body > .cs-heading { order: 1; }
    .mp-body > .is-ord1 { order: 2; }   /* 주문번호 요약 */
    .mp-body > .is-ord2 { order: 3; }   /* 주문상품 · 배송 */
    .mp-body > .is-ord3 { order: 4; }   /* 구매확정 */
    .mp-body > .is-ord4 { order: 5; }   /* 정기구독 관리 */
    .mp-body > .is-ord5 { order: 6; }   /* 적립 포인트 */
    .mp-body > * { order: 7; }
    .mp-body > .ov-actions { order: 9; }

    /* 모바일은 **지금 그대로** — 박스 아래 가운데·전체폭 버튼을 쓰고 상품 행의 PC 버튼은 숨긴다 (요청 4) */
    .ov-confirm { display: block; margin-top: 14px; text-align: center; }
    .ov-confirm-btn { width: 100%; min-width: 0; }
    /* ⚠️ 이 요소는 `.ov-item-review` 도 함께 달고 있다 — 아래 `.ov-item-review { display:flex }` 가
       뒤에 나와 같은 특이도면 이긴다. 클래스 둘을 붙여 **특이도로** 확실히 숨긴다. */
    .ov-item-review.ov-item-confirm { display: none; }

    /* 🔄 요청 4 — 적립 4칸을 **한 줄**로. 값이 길어지면 그 칸만 가로로 줄인다. */
    .ov-pt-list { grid-template-columns: repeat(4, 1fr); gap: 6px; margin-top: 10px; }
    .ov-pt-list dt { font-size: 11px; white-space: nowrap; }
    .ov-pt-list dd { margin-top: 2px; font-size: var(--fs-sub1); white-space: nowrap; }
    .ov-pt-list .is-total dd { font-size: var(--fs-body2); }
    .ov-box, .ov-sub, .ov-pay { padding: 18px; }
    .ov-ship { grid-template-columns: 1fr; }
    .ov-sub-head { grid-template-columns: 1fr; gap: 14px; }
    /* 모바일에는 hover 가 없다 — 안내를 **버튼 아래 문구**로 바꿔 항상 보이게 한다 (2026-08-26).
       ⚠️ 주문 목록(.od-actions)만 예외로 툴팁을 유지한다(위 블록) — 카드가 늘어나기 때문이다. */
    .ov-tip { flex-direction: column; align-items: stretch; gap: 6px; }
    .ov-tip-text {
        position: static; opacity: 1; visibility: visible; transform: none;
        width: auto; max-width: none; padding: 0;
        background: transparent; color: var(--c-primary);
        text-align: center; pointer-events: auto;
    }
    .ov-tip-text::after { display: none; }

    /* 🔄 2026-08-26 (요청 3) — 리뷰작성은 상품 행의 **수량 · 금액 아래**에 상품별로 둔다.
       상품명 오른쪽에 붙이면 이름이 접혀 읽기 어려웠다.
       ⚠️ PC 는 body 를 2열 그리드로 세워 버튼을 행 오른쪽 끝에 둔다(요청 6) → 여기서 되돌린다. */
    .ov-item { align-items: flex-start; gap: 14px; }
    .ov-item > .ov-item-body { display: block; flex: 1 1 0; min-width: 0; }
    /* 🔄 2026-08-27 (요청 1) — [리뷰작성] 과 적립 안내를 **한 줄**에 둔다.
       세로로 쌓으면 상품마다 두 줄을 먹어 목록이 길어졌다.
       ⚠️ 안내가 길어지면 버튼 옆에서 두 줄로 접힌다(버튼 폭은 유지). */
    .ov-item-review {
        display: flex; flex-direction: row; align-items: center; gap: 10px;
        margin-left: 0; margin-top: 10px; width: 100%;
    }
    .ov-item-review > .btn { flex: 0 0 auto; width: auto; }
    .ov-item-review .ov-tip-text { display: none; }        /* 모바일은 옆의 짧은 문구를 쓴다 */
    .ov-item-review .ov-tip-short {
        display: block; flex: 1 1 auto; min-width: 0;
        font-size: var(--fs-sub1); color: var(--c-primary);
        text-align: left; line-height: 1.3;
    }

    /* 🔄 2026-08-26 (요청 5) — 정기구독 관리 영역이 다른 카드보다 커 보였다.
       여백과 입력·버튼 높이를 폰 기준으로 줄인다. */
    .ov-sub { padding: 18px; }
    .ov-sub-next { margin-top: 16px; }
    .ov-point { margin-top: 16px; padding: 16px; }
    .ov-point-row { margin-top: 10px; gap: 8px; }
    .ov-point-row .input,
    .ov-point-row .btn { --btn-h: 44px; height: 44px; }

    .ov-point-row { flex-direction: column; align-items: stretch; }
    .ov-point-form, .ov-point-cancel { flex: 1 1 auto; }
    .ov-point-cancel .btn { width: 100%; }
    .ov-steps { padding: 14px 8px; }
    .ov-step { font-size: var(--fs-sub1); }
    .ov-actions { flex-direction: column-reverse; align-items: stretch; }
    .ov-actions-right { flex-direction: column; align-items: stretch; }
    /* 🔄 2026-08-26 (요청 6) — [목록으로] 와 [구독해지] 높이를 맞춘다.
       `.ov-cancel` 은 .btn 이 아니라 padding 으로만 높이가 잡혀 서로 달랐다. */
    .ov-actions .ov-cancel,
    .ov-actions-right .btn {
        display: inline-flex; align-items: center; justify-content: center;
        height: 48px; padding: 0 16px;
    }
}

/* ── 나의 맞춤 영양제 (P-406) — page_img/마이페이지_나의 맞춤 영양제.png · _상세.png ── */
/* .rc-table { margin-top: 6px; } */
.rc-table td { padding: 18px 12px; }
.rc-count { color: var(--c-primary); font-weight: var(--fw-semibold); }
/* 추천 0건 회차의 [상세보기] — 눌리지 않는다 */
.btn.is-disabled { pointer-events: none; opacity: .6; }

/* 상세 */
.rv-head { padding: 34px 16px 24px; border-bottom: 1px solid var(--c-line); }
.rv-title { font-size: var(--fs-sh1); font-weight: var(--fw-semibold); }
.rv-date { margin-top: 14px; font-size: var(--fs-body2); color: var(--c-gray-600); }
.rv-all { display: flex; align-items: center; gap: 10px; margin: 26px 0 18px; font-size: var(--fs-body1); cursor: pointer; font-weight: var(--fw-semibold); color: var(--c-gray-900);}
.rv-list { display: flex; flex-direction: column; gap: 20px; }
.rv-card {
    display: grid; grid-template-columns: auto 80px minmax(0, 1fr); align-items: center; gap: 20px;
    padding: 20px 24px; border: 1px solid var(--c-line); border-radius: var(--r-md); background: var(--c-surface);
}
/* 담을 수 없는(판매종료) 항목은 톤을 낮춘다 */
.rv-card.is-off { background: var(--c-gray-100); }
.rv-card.is-off .rv-thumb { opacity: .5; }
.rv-pick { display: flex; align-items: center; }
.rv-thumb { display: block; width: 80px; aspect-ratio: 1 / 1; border-radius: var(--r-sm); }
.rv-name { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: var(--fs-sh15); font-weight: var(--fw-bold); }
.rv-reason { margin-top: 10px; font-size: var(--fs-body2); color: var(--c-text-secondary); line-height: 1.6; }
.rv-actions { display: grid; grid-template-columns: 1fr 1fr; gap: var(--grid-gutter); margin-top: 40px; }

@media (max-width: 768px) {
    .rv-head { padding: 24px 0 18px; }
    .rv-card { grid-template-columns: auto 64px minmax(0, 1fr); gap: 14px; padding: 16px; }
    .rv-thumb { width: 64px; }
    .rv-actions { grid-template-columns: 1fr; gap: 10px; margin-top: 28px; }
    .rc-table td { padding: 14px 8px; }
}

/* ── 유전자 리포트 (P-407) — page_img/마이페이지_유전자리포트.png ── */
.dr-sec { margin-top: 46px; margin-bottom: 14px; }
.dr-sec:first-of-type { margin-top: 34px; }
.dr-table td { padding: 18px 12px; }

/* 배송현황 칸 — 상태 / 택배사·운송장 / [배송현황] 이 한 줄에 온다 */
.dr-ship { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.dr-ship-state { font-weight: var(--fw-semibold); }
.dr-ship-state.is-blue  { color: var(--c-blue-text); }
.dr-ship-state.is-gold  { color: var(--c-gold-text); }
.dr-ship-state.is-green { color: var(--c-green-text); }
.dr-ship-state.is-gray  { color: var(--c-text-tertiary); }
.dr-ship-no { font-size: var(--fs-body2); color: var(--c-text-secondary); }
.dr-ship-btn {
    padding: 6px 12px; border: 1px solid var(--c-line); border-radius: var(--r-sm);
    font-size: var(--fs-body2); color: var(--c-text-secondary); background: var(--c-surface);
}
.dr-ship-btn:hover { background: var(--c-gray-100); }

/* 분석 진행중 — 시안의 회색 안내 박스 */
.dr-wait {
    margin-top: 6px; padding: 84px 20px; border-radius: var(--r-md);
    background: var(--c-gray-100); text-align: center;
}
.dr-wait-title { font-size: var(--fs-sh1); font-weight: var(--fw-bold); }
.dr-wait-desc { margin-top: 18px; font-size: var(--fs-body1); color: var(--c-text-secondary); line-height: 1.7; }
.dr-wait-cta { margin-top: 40px; min-width: 220px; border-radius: 40px;}

/* 분석 완료 — 카테고리별 리포트 목록 */
.dr-cat { font-weight: var(--fw-semibold); }
.dr-cat-en { margin-left: 8px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.dr-risk { margin-left: 8px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.dr-btn + .dr-btn { margin-left: 6px; }
.dr-note { margin-top: 16px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }

@media (max-width: 768px) {
    .dr-wait { padding: 48px 16px; }
    .dr-wait-desc { font-size: var(--fs-body2); }
    .dr-wait-cta { width: 100%; }
    .dr-ship { gap: 8px; }
    .dr-table td { padding: 14px 8px; }
}

/* ── 배송지 관리 — page_img/마이페이지_배송지관리.png · _추가등록.png ── */
/* 제목 우측에 [＋ 새 배송지 추가] 가 붙는다 → 제목의 밑줄을 떼고 아래에 따로 긋는다 */
.ad-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 20px; }
.cs-heading.is-flush { padding-bottom: 0; border-bottom: 0; }
.ad-line { margin-top: 24px; border-top: 1px solid var(--c-gray-800); }
.ad-add { flex: 0 0 auto; }

.ad-list { margin-top: 30px; display: flex; flex-direction: column; gap: 24px; }
.ad-card { padding: 26px 30px 28px; border: 1px solid var(--c-line); border-radius: var(--r-md); background: var(--c-surface); }
.ad-card-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 18px; }
.ad-name { display: flex; align-items: center; gap: 10px; font-size: var(--fs-sh2); font-weight: var(--fw-bold); }
.ad-tools { display: flex; align-items: center; gap: 12px; font-size: var(--fs-body2); }
.ad-tool { color: var(--c-text-secondary); }
.ad-tool:hover { color: var(--c-text-primary); text-decoration: underline; }
.ad-divider { color: var(--c-gray-300); }
.ad-line-txt { font-size: var(--fs-body1); color: var(--c-text-secondary); line-height: 1.9; }

/* 등록·수정 폼(모달) */
.af-form .field + .field { margin-top: 20px; }
/* 우편번호 → 기본주소 → 상세주소는 한 덩어리라 간격을 좁힌다 */
.af-form .field.af-gap { margin-top: 10px; }
.af-req { color: var(--c-sub-gold); }
.af-default { margin-top: 26px; padding-top: 24px; border-top: 1px solid var(--c-line); }
.af-check { display: flex; align-items: center; gap: 10px; font-size: var(--fs-body2); cursor: pointer; }

@media (max-width: 768px) {
    .ad-head { flex-direction: column; align-items: stretch; }
    .ad-add { width: 100%; }
    .ad-card { padding: 20px; }
    .ad-card-head { flex-wrap: wrap; }
}

/* ── 최근 주문 ── */
.mp-sec-head { display: flex; align-items: center; justify-content: space-between; margin-top: 48px; margin-bottom: 14px; }
.mp-sec-title { font-size: var(--fs-sh15); font-weight: var(--fw-semibold); }
.mp-more { font-size: var(--fs-body2); color: var(--c-text-secondary); }
.mp-more:hover { color: var(--c-primary); }
.mp-more-ico { font-size: var(--fs-body1); }        /* 화살표 = 그래픽 플레이스홀더 */
.mp-table td { padding: 18px 12px; }

@media (max-width: 1024px) {
    /* 사이드를 위로 눕힌다 — 메뉴가 10개라 줄바꿈하면 화면을 다 먹는다.
       그룹 라벨을 숨기고 **한 줄 가로 스크롤**로 흘린다(2026-08-10). */
    /* ⚠️ `1fr` 이 아니라 `minmax(0, 1fr)` 이어야 한다 — 그리드 아이템의 기본 `min-width: auto` 때문에
          아래 가로 스크롤 줄의 **내용 폭만큼 열이 늘어나 페이지 전체가 옆으로 밀린다**(실제로 그랬다). */
    .mp-wrap { grid-template-columns: minmax(0, 1fr); gap: 24px; padding-top: 24px; }
    .mp-side, .mp-body { min-width: 0; }
    .mp-side-group { display: none; }
    .mp-side-scroll {
        display: flex; flex-wrap: nowrap;      /* 그룹 2개를 한 줄에 잇는다 */
        margin-top: 16px; overflow-x: auto; -webkit-overflow-scrolling: touch;
        /* 넘치는 건 이 줄 '안에서만' 스크롤한다 — 부모를 밀지 않게 폭을 묶는다 */
        min-width: 0; max-width: 100%;
        /* 스크롤바는 숨긴다 — 좁은 화면에서 바가 메뉴를 가린다 */
        scrollbar-width: none;
    }
    .mp-side-scroll::-webkit-scrollbar { display: none; }
    .mp-side-nav { flex: 0 0 auto; flex-direction: row; flex-wrap: nowrap; gap: 4px; margin-top: 0; }
    .mp-side-link { border-left: 0; border-bottom: 3px solid transparent; padding: 8px 12px; white-space: nowrap; }
    /* 로그아웃 (2026-08-14) — 칩 줄에서는 구분선을 쓰지 않는다(세로 배치용이라 가로줄에선 어긋난다).
       대신 앞에 살짝 여백을 둬 메뉴들과 떨어뜨린다. */
    .mp-side-out { margin-top: 0; padding-top: 0; border-top: 0; margin-left: 8px; }
    .mp-side-link.is-active { border-left-color: transparent; border-bottom-color: var(--c-main-300); }
    .mp-cards { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 768px) {
    /* ── 마이페이지 헤더 정리 (2026-08-12) ────────────────────────────────
       폰에서는 상단 헤더가 이미 `‹ 회원 정보` 처럼 **화면 이름을 보여 준다**.
       그런데 본문에도 사이드 제목('마이페이지') · 브레드크럼 · 화면 제목이 또 나와
       같은 말이 최대 세 번 반복됐다 → 중복분을 감춘다.
       ⚠️ **제목은 `display: none` 이 아니라 `.sr-only` 방식으로 감춘다** —
          상단 헤더의 화면 이름은 `<span>` 이라 제목 역할을 못 한다. 여기를 아예 지우면
          문서에 제목(h1·h2)이 하나도 남지 않아 보조기기 탐색이 끊긴다.
          화면에서만 빼고 읽히게 두면 `\.cs-heading + …` 여백 규칙도 그대로 맞는다.
       ⚠️ `.mp-wrap` 안으로 한정한다 — 고객센터는 헤더가 '고객센터', 본문이 '공지사항'이라
          서로 다른 정보다(거기서 감추면 무슨 목록인지 알 수 없어진다). */
    .mp-side-title,
    .mp-wrap .cs-heading {
        position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
        overflow: hidden; white-space: nowrap; border: 0;
        clip: rect(0 0 0 0); clip-path: inset(50%);
    }
    .mp-wrap .cs-crumb { display: none; }   /* 브레드크럼은 뒤로가기와 겹치는 길잡이라 지운다 */
    /* 감춘 제목이 먹던 자리만큼 위아래를 죈다 — 선과 본문 사이가 벌어져 보이던 원인 */
    .mp-wrap { gap: 16px; padding-top: 16px; }
    /* ⚠️ 제목이 화면에서 빠졌으니 **바로 다음 요소가 콘텐츠의 첫 줄**이다.
          화면마다 다른 여백(`.cs-heading + …` 30px 등)을 한 값으로 맞춘다.
       ⚠️ 클래스를 셋 겹친 이유 — `.cs-heading + .sb-next {margin-top:30px}` 이 이 블록보다
          **뒤에 있어** 특이도가 같으면 그쪽이 이긴다(미디어쿼리는 특이도를 올리지 않는다). */
    .mp-wrap .mp-body .cs-heading + * { margin-top: 20px; }
    .mi-form { padding-top: 0; }            /* 위 규칙이 여백을 맡는다 (padding 은 겹친다) */
    /* 제목이 빠지면 [＋ 새 배송지 추가] 같은 버튼만 남는다 → 한 줄 전체로 눕혀 누르기 쉽게 */
    .ad-head { display: block; }
    .ad-head > .btn { width: 100%; }
    .ad-line { margin-top: 16px; }

    /* ── 하위 화면의 상단 메뉴 줄은 **감춘다** (2026-08-12) ────────────────
       첫 화면(`/mypage`)이 메뉴 리스트를 갖게 되면서 하위 화면 상단의 칩 줄은
       같은 목록을 한 번 더 보여 주는 셈이 됐다. 폰에서는 본문이 주인공이다.
       메뉴 이동은 **뒤로가기 → 첫 화면 리스트**로 한다(`renderMypage` 기본 back = `/mypage`).
       ⚠️ 769~1024(태블릿)에서는 그대로 둔다 — 거기엔 대신할 리스트가 없다. */
    .mp-wrap:not(.is-hub) .mp-side { display: none; }

    /* ── 마이페이지 첫 화면 (2026-08-12 요청) ────────────────────────────
       ① 요약 3칸을 **한 줄**에 (박스·글자 축소)  ② 보조 설명 문구 제거
       ③ 최근 주문 감춤  ④ 메뉴를 **리스트(행 + ›)** 로, 요약 아래에 배치 */
    .mp-cards { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin-top: 20px; }
    .mp-card { padding: 14px 10px; border-radius: var(--r-sm); }
    .mp-card-label { font-size: var(--fs-sub1); }
    .mp-card-value { margin-top: 8px; gap: 4px; font-size: var(--fs-sh15); }
    .mp-card-value strong { font-size: var(--fs-body2); }
    /* '다음 결제일 …' · '총 적립 …' · '유전자 검사로 더 정밀한 추천…' — 폰에서는 뺀다 */
    .mp-card-desc { display: none; }
    /* 최근 주문 — 아래 메뉴의 '주문 내역' 과 목적이 겹친다 */
    .mp-recent { display: none; }

    /* 요약이 먼저, 메뉴가 그 아래 (`.mp-wrap` 은 1열 그리드라 order 로 뒤집는다) */
    .mp-wrap.is-hub .mp-side { order: 2; }
    .mp-wrap.is-hub .mp-body { order: 1; }
    /* 리스트 모드 — 칩 줄의 가로 스크롤·구분선을 모두 되돌린다 */
    .mp-wrap.is-hub .mp-side-scroll {
        display: block; overflow: visible;
        margin-top: 0; padding: 0; border-bottom: 0;
    }
    .mp-wrap.is-hub .mp-side-nav { display: block; }
    .mp-wrap.is-hub .mp-side-link {
        display: flex; align-items: center; justify-content: space-between;
        width: 100%; margin-top: 8px; padding: 16px 18px;
        border: 0; border-radius: var(--r-md); background: var(--c-gray-100);
        font-size: var(--fs-body1); font-weight: var(--fw-semibold);
        color: var(--c-text-primary); white-space: normal;
    }
    /* 화살표 — 아이콘 에셋이 없어 문자로 그린다(`.mp-more-ico` 와 같은 방식) */
    .mp-wrap.is-hub .mp-side-link::after {
        content: '›'; margin-left: 12px;
        font-size: var(--fs-sh1); font-weight: var(--fw-regular); color: var(--c-text-disabled);
        line-height: 1;
    }
    /* 첫 화면에는 활성 메뉴가 없다(`$mp_menu = ''`) — 혹시 걸려도 리스트 톤을 유지한다 */
    .mp-wrap.is-hub .mp-side-link.is-active {
        background: var(--c-main-100); color: var(--c-main-300);
    }
    .mp-wrap.is-hub .mp-side-link.is-soon { color: var(--c-text-disabled); }
    /* 로그아웃 (2026-08-14) — 리스트에서는 위에 구분선을 두고 톤을 낮춰 메뉴와 구분한다 */
    .mp-wrap.is-hub .mp-side-out {
        margin: 20px 0 0; padding-top: 12px; border-top: 1px solid var(--c-line);
    }
    .mp-wrap.is-hub .mp-side-link.is-logout { background: none; color: var(--c-text-secondary); }
    .mp-wrap.is-hub .mp-side-link.is-logout::after { content: none; }
    /* 회원 정보 — 라벨을 입력 위로 올린다(라벨 224 고정이면 입력이 눌린다) */
    .mi-row { grid-template-columns: 1fr; gap: 6px; margin-top: 16px; }
    .mi-sec + .mi-row { margin-top: 14px; }
    /* ⚠️ 라벨을 **지우지는 않는다** — 값이 채워져 있으면 placeholder 가 보이지 않아
          '웅테스터 / 010-…' 만 남고 무슨 칸인지 알 수 없어진다(입력 오류의 원인).
       대신 본문과 같은 16px 굵은 글씨(제목처럼 보였다)를 **12px 회색 캡션**으로 낮춰
       세로 부피를 없앤다 — 폰에서 흔히 쓰는 방식이다. */
    .mi-label { font-size: var(--fs-sub1); font-weight: var(--fw-regular); color: var(--c-text-tertiary); }
    /* PC 2열 정렬을 맞추려고 둔 **빈 라벨**은 세로로 쌓이면 그냥 빈 줄이다 */
    .mi-label:empty { display: none; }
    .mi-sec.is-line { margin-top: 32px; padding-top: 32px; }
    .mi-actions { flex-direction: column; align-items: stretch; margin-top: 32px; padding-top: 24px; }
    .mi-save { width: 100%; }
    .mi-links { justify-content: center; }
    .lv-notice { padding: 18px; }
    .modal-pair { grid-template-columns: 1fr; }
}

/* ══ 약관 (이용약관 · 개인정보 처리방침) ═══════════════════════════
   2026-08-10 · 출처 page_img/이용약관.png · page_img/개인정보 처리방침.png (실측)
   제목 → 얇은 구분선 → 본문. 사이드 메뉴 없이 컨테이너 전폭을 쓴다.
   ⚠️ 제목은 시안 실측 32px 인데 8단계 스케일에 없다 → H2(36) 로 올렸다(다른 화면과 같은 판단). */
.terms { padding-top: 48px; }
.terms-title { font-size: var(--fs-h2); font-weight: var(--fw-bold); }
.terms-body {
    margin-top: 46px; padding-top: 46px; border-top: 1px solid var(--c-line);
    font-size: var(--fs-body2); line-height: 1.85; color: var(--c-text-sub);
    /* 관리자 입력이 일반 텍스트라 **줄바꿈·들여쓰기를 그대로** 살린다.
       break-word 를 함께 두어 긴 URL·영문이 컨테이너를 넘지 않게 한다. */
    white-space: pre-wrap; word-break: break-word;
}
.terms .empty { margin-top: 46px; padding-top: 70px; border-top: 1px solid var(--c-line); }

@media (max-width: 768px) {
    .terms { padding-top: 24px; }
    .terms-title { font-size: var(--fs-sh1); }
    .terms-body { margin-top: 24px; padding-top: 24px; }
}

/* ══ 고객센터 (P-601 · P-602 · P-603) ══════════════════════════════
   2026-08-10 · 출처 page_img/고객센터_1공지사항.png · _(2).png · _2FAQ.png · _3이벤트.png · _(2).png (실측)
   구조 — 좌 사이드 메뉴 268 + 간격 68 + 콘텐츠 984 = 컨테이너 1320
   ⚠️ 사이드 제목·콘텐츠 제목은 시안 실측 32px 인데 8단계 스케일에 없다 → H2(36) 로 올렸다
      (사업 소개·로그인 화면과 같은 판단 — 스케일 준수 우선). */
.cs-wrap { display: grid; grid-template-columns: 268px minmax(0, 1fr); gap: 68px; padding-top: 40px; }
.cs-side-title { font-size: var(--fs-h3); font-weight: var(--fw-bold); }
.cs-side-nav { margin-top: 48px; display: flex; flex-direction: column; }
.cs-side-link {
    padding: 13px 20px; font-size: var(--fs-body1); color: var(--c-text-sub);
    border-left: 3px solid transparent;
}
.cs-side-link:hover { color: var(--c-text-primary); }
.cs-side-link.is-active {
    background: var(--c-main-100); border-left-color: var(--c-main-300);
    color: var(--c-main-300); font-weight: var(--fw-semibold);
}

.cs-crumb { font-size: var(--fs-sub1); color: var(--c-text-tertiary); }
/* 제목 아래 구분선 — 목록·상세 모두 이 선에서 콘텐츠가 시작한다 */
.cs-heading {
    margin-top: 10px; padding-bottom: 24px; margin-bottom: 0;
    font-size: var(--fs-sh0); font-weight: var(--fw-bold);
    border-bottom: 1px solid var(--c-gray-800);
}

/* ── 목록 테이블 (공지사항) ── */
.cs-table { width: 100%; border-collapse: collapse; table-layout: fixed; }
.cs-table th {
    padding: 15px 12px; background: var(--c-gray-50);
    font-size: var(--fs-body2); font-weight: var(--fw-semibold); color: var(--c-gray-900);
}
.cs-table td { padding: 20px 12px; border-bottom: 1px solid var(--c-line); text-align: center; font-size: var(--fs-body1); }
.cs-table .is-left { text-align: left; }
.cs-no { font-size: var(--fs-body2); color: var(--c-text-sub); }
/* 고정핀 아이콘 — 2x 에셋(40×40)을 20×20 으로 표시. 셀 가운데 정렬(td 가 text-align:center) */
.cs-pin { display: inline-block; width: 20px; height: 20px; vertical-align: middle; }
.cs-subject { font-size: var(--fs-body1); }
.cs-subject:hover { color: var(--c-primary); text-decoration: underline; }
.cs-meta { font-size: var(--fs-body2); color: var(--c-gray-700); }

/* ── 표 → 세로 카드 (모바일 공통) ─────────────────────────────────────
   2026-08-11 신설. `.cs-table` 은 `table-layout: fixed` 라 **고정폭 열의 합이 화면을 넘기면
   자동폭 열이 0에 가까워지고 글자가 옆 칸 위로 넘친다** — 마이페이지 최근 주문에서 실제로 겹쳤다.
   열을 버리는 대신 768 이하에서 **행을 카드처럼 쌓고** 각 값 앞에 라벨을 붙인다.

   마크업 규칙 — 표에 `is-stack` 을 주고 각 `td` 에 아래 중 하나를 지정한다:
     · `data-label="일자"`  → [라벨][값] 두 칸
     · `class="is-stack-full"` → 라벨 없이 한 줄 전부 (제목·이름처럼 그 행의 주인공)
     · `class="is-stack-hide"` → 모바일에서 숨김 (번호처럼 없어도 되는 값)
   ⚠️ 라벨을 빠뜨리면 값만 덩그러니 남는다 — td 마다 셋 중 하나를 반드시 지정할 것. */
@media (max-width: 768px) {
    .cs-table.is-stack,
    .cs-table.is-stack tbody,
    .cs-table.is-stack tr { display: block; }
    .cs-table.is-stack thead,
    .cs-table.is-stack colgroup,
    .cs-table.is-stack td.is-stack-hide { display: none; }

    .cs-table.is-stack tr { padding: 16px 0 18px; border-bottom: 1px solid var(--c-line); }
    .cs-table.is-stack td {
        display: flex; align-items: flex-start; gap: 12px; flex-wrap: wrap;
        padding: 4px 0; border: 0; text-align: left;
    }
    /* 라벨 — 값이 길어도 라벨은 접히지 않는다 */
    .cs-table.is-stack td::before {
        content: attr(data-label);
        flex: 0 0 auto; min-width: 84px;
        font-size: var(--fs-body2); color: var(--c-text-secondary);
        white-space: nowrap;
    }
    .cs-table.is-stack td.is-stack-full {
        display: block;
        margin-bottom: 2px; font-weight: var(--fw-medium); word-break: keep-all;
    }
    .cs-table.is-stack td.is-stack-full::before { content: none; }
}

/* ── 상세 (공지사항 · 이벤트 공용) ── */
.cs-article { padding: 34px 16px 24px; border-bottom: 1px solid var(--c-line); }
.cs-article-title {
    display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
    font-size: var(--fs-sh1); font-weight: var(--fw-bold); line-height: 1.4;
}
/* 이벤트 상세는 뱃지가 우측 끝에 붙는다(시안) */
.cs-article-title > .badge { margin-left: auto; }
.cs-article-meta { display: flex; gap: 28px; margin-top: 14px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.cs-content {
    padding: 40px 16px 60px; min-height: 240px;
    font-size: var(--fs-body1); line-height: 1.75; word-break: break-word;
}
.cs-content-empty { color: var(--c-text-tertiary); }

/* 이전글 / 다음글 */
.cs-siblings { border-top: 1px solid var(--c-line); }
.cs-sibling { display: flex; align-items: center; gap: 40px; padding: 22px 16px; border-bottom: 1px solid var(--c-line); }
.cs-sibling-label { flex: 0 0 60px; font-size: var(--fs-body2); color: var(--c-text-sub); }
.cs-sibling-title { min-width: 0; font-size: var(--fs-body1); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
a.cs-sibling-title:hover { color: var(--c-primary); text-decoration: underline; }
.cs-sibling-title.is-none { color: var(--c-text-tertiary); }

.cs-actions { margin-top: 34px; display: flex; justify-content: flex-end; }
.cs-actions.is-line { padding-top: 34px; margin-top: 0; border-top: 1px solid var(--c-line); }
.cs-back { gap: 8px; }
.cs-back-ico { font-size: var(--fs-body1); }        /* 화살표 = 그래픽 플레이스홀더 */

/* ── FAQ ── */
.faq-search { margin-top: 24px; padding: 32px; background: var(--c-gray-100); }
.faq-form { display: flex; gap: 14px; }
.faq-input { flex: 1; min-width: 0; }
/* 시안의 [검색] 은 브랜드 보라가 아니라 먹색 버튼이다 */
.faq-submit { flex: 0 0 88px; background: var(--c-sub-black); color: var(--c-on-color); }
.faq-submit:hover { background: var(--c-gray-800); }
.faq-cats { display: flex; gap: 8px; margin-top: 20px; flex-wrap: wrap; }

.faq-subject { margin: 44px 0 10px; font-size: var(--fs-sh2); font-weight: var(--fw-bold); }
.faq-subject em { color: var(--c-primary); }
.faq-list { border-top: 1px solid var(--c-gray-800); }
.faq-item { border-bottom: 1px solid var(--c-line); }
.faq-q {
    display: flex; align-items: center; gap: 12px; padding: 22px 44px 22px 16px;
    position: relative; cursor: pointer; list-style: none;
    font-size: var(--fs-body1); font-weight: var(--fw-semibold);
}
.faq-q::-webkit-details-marker { display: none; }   /* 사파리 기본 삼각형 제거 */
.faq-q-mark { color: var(--c-text-primary); font-weight: var(--fw-bold); }
/* 펼침 화살표 — 아이콘 에셋이 없어 CSS 로 그린다(2px 선 두 개) */
.faq-q::after {
    content: ''; position: absolute; right: 20px; top: 50%;
    width: 9px; height: 9px; margin-top: -6px;
    border-right: 2px solid var(--c-gray-600); border-bottom: 2px solid var(--c-gray-600);
    transform: rotate(45deg); transition: transform .15s ease;
}
.faq-item[open] > .faq-q::after { transform: rotate(-135deg); margin-top: -2px; }
.faq-a {
    padding: 28px 16px 32px; background: var(--c-gray-100);
    font-size: var(--fs-body2); line-height: 1.75; color: var(--c-text-sub);
}

/* ── 이벤트 목록 ── */
.ev-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 44px var(--grid-gutter); margin-top: 34px; }
.ev-card { min-width: 0; }
.ev-card-thumb { display: block; aspect-ratio: 310 / 202; border-radius: var(--r-md); }
.ev-card-badge { margin-top: 18px; }
.ev-card-name {
    display: -webkit-box; margin-top: 10px;
    font-size: var(--fs-sh2); font-weight: var(--fw-bold); line-height: 1.4;
    -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.ev-card-date { margin-top: 10px; font-size: var(--fs-body2); color: var(--c-text-tertiary); }

/* ── 이벤트 상세 배너 ── */
.ev-banner { margin: 40px auto 0; max-width: 630px; border-radius: var(--r-md); overflow: hidden; }
.ev-banner > img { display: block; width: 100%; height: auto; }

@media (max-width: 1024px) {
    /* 사이드가 좁아지면 메뉴 글자가 접힌다 — 위로 눕히고 콘텐츠를 전폭으로 */
    /* ⚠️ 마이페이지와 같은 이유로 `minmax(0, 1fr)` — 가로 스크롤 줄이 열을 늘려 페이지를 밀지 않게 한다 */
    .cs-wrap { grid-template-columns: minmax(0, 1fr); gap: 28px; padding-top: 24px; }
    .cs-side, .cs-body { min-width: 0; }
    .cs-side-nav {
        flex-direction: row; margin-top: 20px; gap: 8px;
        overflow-x: auto; min-width: 0; max-width: 100%; scrollbar-width: none;
    }
    .cs-side-nav::-webkit-scrollbar { display: none; }
    .cs-side-link { border-left: 0; border-bottom: 3px solid transparent; padding: 10px 14px; white-space: nowrap; }
    .cs-side-link.is-active { border-left-color: transparent; border-bottom-color: var(--c-main-300); }
    .ev-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 768px) {
    /* ── 고객센터 머리말 정리 (2026-08-12) ────────────────────────────────
       폰에서 같은 말이 네 번 나왔다:
         ① 상단 헤더 `‹ 고객센터`  ② 본문 대제목 '고객센터'
         ③ 브레드크럼 '고객센터 > 공지사항'  ④ 화면 제목 '공지사항'
       ④ 는 **탭이 이미 '공지사항' 을 활성으로 보여 준다** → 전부 감춘다.
       ⚠️ 마이페이지와 같은 이유로 제목은 `display: none` 이 아니라 **`.sr-only` 방식**이다
          (헤더 타이틀은 `<span>` 이라, 지우면 문서에 h1·h2 가 하나도 안 남는다).
       ⚠️ 상세 화면도 같다 — '공지사항 상세' 대신 **글 제목**이 바로 아래 나온다. */
    .cs-side-title,
    .cs-wrap .cs-heading {
        position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
        overflow: hidden; white-space: nowrap; border: 0;
        clip: rect(0 0 0 0); clip-path: inset(50%);
    }
    .cs-wrap .cs-crumb { display: none; }
    .cs-wrap { gap: 16px; padding-top: 16px; }
    /* 감춘 `.cs-heading` 의 구분선을 **탭 줄이 대신 그린다** */
    .cs-side-nav { margin-top: 0; padding-bottom: 0; border-bottom: 1px solid var(--c-gray-800); }
    /* ⚠️ 클래스를 셋 겹친 이유 — 아래쪽 `.cs-heading + …` 규칙이 이 블록보다 뒤에 있어
          특이도가 같으면 그쪽이 이긴다(미디어쿼리는 특이도를 올리지 않는다). */
    .cs-wrap .cs-body .cs-heading + * { margin-top: 20px; }
    /* 2026-08-11 — 조회수 열을 숨기던 규칙 폐기. `is-stack` 세로 카드가 전부 보여 준다 */
    .cs-table td { padding: 16px 8px; }
    .cs-article { padding: 24px 0 20px; }
    .cs-content { padding: 28px 0 40px; min-height: 160px; font-size: var(--fs-body2); }
    .cs-sibling { gap: 16px; padding: 16px 0; }
    .cs-actions { margin-top: 24px; }
    .cs-actions .btn { width: 100%; }
    .faq-search { padding: 20px; }
    .faq-form { flex-wrap: wrap; }
    .faq-submit { flex: 1 1 100%; }
    .ev-grid { grid-template-columns: 1fr; gap: 32px; }
    .ev-banner { margin-top: 24px; }
}

/* ══ 사업 소개 (P-미정) ════════════════════════════════════════════
   2026-08-07 · 출처 page_img/사업소개.png (실측)
   전폭 레이아웃 — 섹션마다 안쪽에 .container(1320) 를 둔다(메인과 같은 방식).
   ⚠️ 사진은 전부 자리표시(.ph) 다. 에셋이 나오면 각 .ph 안에 <img> 를 넣으면 된다.
   ⚠️ 섹션 타이틀은 시안 실측 **32px** 인데 8단계 스케일에 없다 → 가장 가까운 H2(36) 로 올렸다
      (스케일 준수 우선 — 로그인 화면 제목과 같은 판단). */

/* ── 히어로 (전폭 400) ── */
.ab-hero { position: relative; height: 400px; overflow: hidden; }
.ab-hero-visual { position: absolute; inset: 0; }
.ab-hero-inner {
    position: relative; z-index: 1;
    height: 100%; display: flex; flex-direction: column; justify-content: center;
}
.ab-hero-title { font-size: var(--fs-h1); font-weight: var(--fw-bold); }
.ab-hero-sub { margin-top: 20px; font-size: var(--fs-body1); color: var(--c-text-secondary); }

/* ── 섹션 공통 ── */
.ab-sec { padding: var(--sec-pad) 0; }
.ab-sec-title { margin-top: 12px; text-align: center; font-size: var(--fs-h3); font-weight: var(--fw-bold); }
.ab-sec-title.is-on-dark { color: var(--c-on-color); }

/* ── OUR VISION ── */
.ab-vision-copy {
    margin-top: 20px; text-align: center;
    font-size: var(--fs-h3); font-weight: var(--fw-bold); line-height: 1.5;
}
.ab-vision-copy em { font-style: normal; color: var(--c-primary); }
.ab-vision-img { height: 300px; margin-top: 64px; }

/* ── CORE VALUE ── */
.ab-value { background: var(--c-gray-50); }
.ab-value-list {
    display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--grid-gutter);
    margin-top: 60px;
}
.ab-value-card {
    display: flex; flex-direction: column; align-items: center; text-align: center;
    min-height: 308px; padding: 44px 28px;
    border-radius: var(--r-lg); background: var(--c-surface); box-shadow: var(--shadow-card);
}
.ab-value-ico { display: block; height: 52px; width: auto; }   /* 에셋 53px — 시안 실측 52 */
.ab-value-title { margin-top: 34px; font-size: var(--fs-sh26); font-weight: var(--fw-bold); }
/* 제목 아래 짧은 구분선 — 시안 실측 50×1 */
.ab-value-line { display: block; width: 50px; height: 1px; margin: 26px 0; background: var(--c-gray-300); }
.ab-value-desc { font-size: var(--fs-body1); color: var(--c-text-secondary); line-height: 1.6; }

/* ── OUR PROCESS ── */
/* 타이틀 아래 짧은 세로 연결선 — 시안 실측 2×50 */
.ab-proc-line { display: block; width: 2px; height: 50px; margin: 45px auto 0; background: var(--c-gray-200); }

.ab-proc-rows { display: grid; gap: 80px; margin-top: 41px; }
/* 좌우 반반. 이미지는 **화면 끝까지** 붙고 가운데에서 48px 못 미쳐 멈춘다(시안 912 = 50% − 48) */
.ab-proc-row {
    display: grid; grid-template-columns: 1fr 1fr; align-items: center; gap: 0;
}
.ab-proc-row.is-reverse .ab-proc-photo { order: 2; }
.ab-proc-row.is-reverse .ab-proc-text  { order: 1; }

.ab-proc-photo { height: 500px; margin-right: 48px; }
.ab-proc-row.is-reverse .ab-proc-photo { margin-right: 0; margin-left: 48px; }

/* 텍스트는 고정 폭(480)으로 가운데 선에서 24px 띄운다 — 시안 실측 */
.ab-proc-text { width: 480px; max-width: 100%; justify-self: start; margin-left: 24px; }
.ab-proc-row.is-reverse .ab-proc-text { justify-self: end; margin-left: 0; margin-right: 24px; }

.ab-proc-eyebrow { font-size: var(--fs-sh2); color: var(--c-gray-400); }
.ab-proc-title { margin-top: 12px; font-size: var(--fs-h3); font-weight: var(--fw-bold); }
.ab-proc-desc { margin-top: 28px; font-size: var(--fs-sh2); color: var(--c-text-secondary); line-height: 1.7; }
/* 시안의 노란 형광 표시 — gold 뱃지 배경과 같은 톤이라 그대로 쓴다 */
.ab-proc-desc mark { background: var(--c-gold-bg); color: inherit; }

/* ── CERTIFIED (어두운 전폭) ── */
.ab-cert { position: relative; padding: var(--sec-pad) 0; background: var(--c-sub-black); overflow: hidden; }
/* 배경 사진 — Sub_black 위에 얹고 투명도로 어둡게 눌렀다(시안 평균 밝기 71/255 실측 기준) */
.ab-cert-bg { position: absolute; inset: 0; }
.ab-cert-bg > img { width: 100%; height: 100%; object-fit: cover; opacity: .55; }
.ab-cert-inner { position: relative; z-index: 1; }
/* 어두운 배경에서는 Main/300 이 묻힌다 → 한 단계 밝은 Main/200 (시안 실측값과 일치) */
.ab-cert .kit-eyebrow { color: var(--c-main-200); }

.ab-cert-list {
    display: grid; grid-template-columns: repeat(3, 1fr);
    margin-top: 60px; padding: 56px 0;
    border-radius: var(--r-lg); background: var(--c-dim);
}
.ab-cert-item {
    display: flex; flex-direction: column; align-items: center; text-align: center;
    padding: 0 32px;
}
.ab-cert-item + .ab-cert-item { border-left: 1px solid var(--c-dim); }

/* 인증 뱃지 — 흰 선 이미지라 어두운 배경 전용이다. 에셋 121px(≈2x) → 60 으로 표시 */
.ab-cert-badge { display: block; width: 60px; height: 60px; }
.ab-cert-title { margin-top: 30px; font-size: var(--fs-sh26); font-weight: var(--fw-bold); color: var(--c-on-color); }
.ab-cert-line { display: block; width: 50px; height: 1px; margin: 22px 0; background: var(--c-dim-strong); }
.ab-cert-desc { font-size: var(--fs-body1); color: var(--c-gray-300); line-height: 1.6; }

@media (max-width: 1024px) {
    .ab-hero { height: 320px; }
    .ab-value-list { grid-template-columns: 1fr; max-width: 520px; margin-inline: auto; }
    .ab-value-card { min-height: 0; }
    .ab-proc-photo { height: 380px; }
    .ab-proc-text { width: auto; }
    .ab-cert-list { grid-template-columns: 1fr; padding: 40px 0; }
    .ab-cert-item + .ab-cert-item {
        margin-top: 40px; padding-top: 40px;
        border-left: 0; border-top: 1px solid var(--c-dim);
    }
}
@media (max-width: 768px) {
    .ab-hero { height: 280px; }
    .ab-hero-title { font-size: var(--fs-h1); }
    /* 좁은 폭에서는 지그재그를 풀고 이미지 → 텍스트 한 줄로 쌓는다 */
    .ab-proc-rows { gap: 56px; }
    .ab-proc-row, .ab-proc-row.is-reverse { grid-template-columns: 1fr; }
    .ab-proc-row .ab-proc-photo,
    .ab-proc-row.is-reverse .ab-proc-photo { order: 1; height: 240px; margin: 0; }
    .ab-proc-row .ab-proc-text,
    .ab-proc-row.is-reverse .ab-proc-text {
        order: 2; justify-self: stretch; margin: 24px var(--page-margin) 0;
    }
    .ab-vision-img { height: 200px; margin-top: 40px; }
    .ab-value-list, .ab-cert-list { margin-top: 40px; }
    .ab-proc-line { margin-top: 32px; height: 36px; }
    .ab-proc-rows { margin-top: 32px; }
}

/* ══ 상품 이미지 미등록 자리표시자 — 브랜드 로고 ═══════════════════════
   2026-08-07 · 추천 결과 · 키트 목록/상세 · 장바구니 공용 (`product_thumb()`)

   로고가 368×58 가로형이라 cover 면 잘린다 → contain 으로 담고 폭을 줄여 여백을 준다.
   폭을 % 로 잡아 100px(추천 카드)부터 648px(키트 상세)까지 한 규칙으로 커버하고,
   큰 박스에서 과대해지지 않게 상한을 둔다. 상품 사진으로 오인되지 않게 톤을 낮춘다.

   ⚠️ **이 블록은 파일 맨 끝에 있어야 한다.**
      컴포넌트들이 `.kit-thumb { display: block }` · `.xxx > img { object-fit: cover }` 처럼
      같은 특이도(0,1,0)/(0,1,1)로 선언하므로, 앞에 두면 뒤 규칙에 덮인다
      (실제로 키트 카드에서 로고가 세로 중앙에 오지 않는 문제가 났다). */
.is-thumb-empty { display: flex; align-items: center; justify-content: center; background: #fff; }
.is-thumb-empty > .thumb-logo {
    width: 76%; max-width: 240px; height: auto; max-height: 100%;
    object-fit: contain; opacity: .45;
}
/* 장바구니 썸네일은 이모지 시절 초록 그라디언트가 배경이라 로고와 겹쳐 보인다 → 중립 배경으로 */
.cart-thumb.is-thumb-empty { background: var(--c-gray-100); }

/* ── 찜 리스트 (P-415) — page_img/마이페이지_찜리스트.png ──
   행 = 체크박스 / 썸네일 / 상품명·가격 / ✕. 카드는 흰 배경 + 옅은 테두리다. */
/* ⚠️ `.cs-heading` 이 구분선을 그리고 **아래 여백이 없다** → 여기서 띄운다.
   실측(시안): 구분선 → 전체선택 줄 28 · 전체선택 줄 → 첫 카드 18 */
.wl-head {
    display: flex; align-items: center; justify-content: space-between;
    gap: 16px; padding: 28px 0 18px;
}
.wl-all { display: inline-flex; align-items: center; gap: 12px; cursor: pointer; }
.wl-all > span { font-size: var(--fs-body2); color: var(--c-text-secondary); }

/* [선택삭제] — 시안은 버튼이라기보다 옅은 테두리의 작은 칩이다 */
.wl-del-sel {
    flex: 0 0 auto;
    padding: 6px 12px; border: 1px solid var(--c-border-primary); border-radius: 6px;
    background: var(--c-surface); color: var(--c-text-secondary);
    font-size: var(--fs-sub1); cursor: pointer;
}
.wl-del-sel:hover { border-color: var(--c-primary); color: var(--c-primary); }
.wl-del-sel:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }

.wl-list { display: grid; gap: 18px; }
/* 실측(시안): 카드 높이 126 · 썸네일 74 → 상하 패딩 26 / 좌우 24
   열 = 체크박스 24 · 썸네일 74 · 본문(가변) · ✕ */
.wl-card {
    display: grid; grid-template-columns: auto 74px minmax(0, 1fr) auto;
    align-items: center; gap: 24px;
    padding: 26px 24px; border: 1px solid var(--c-line); border-radius: var(--r-md);
    background: var(--c-surface);
}
.wl-pick { display: inline-flex; align-items: center; cursor: pointer; }
.wl-thumb { width: 74px; height: 74px; border-radius: 8px; background: var(--c-gray-100); }
/* ⚠️ 그리드 아이템 기본 `min-width: auto` 라 긴 상품명이 카드를 밀어낸다 */
.wl-body { min-width: 0; }

.wl-name {
    display: block; font-size: var(--fs-body1); font-weight: var(--fw-semibold);
    color: var(--c-text-primary);
}
.wl-name:hover { text-decoration: underline; }
.wl-price { margin-top: 8px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
/* 정가 취소선 + 할인율 — 시안(마이페이지_찜리스트)의 "76,000원 10% 68,400원" 표기 (2026-08-13) */
.wl-price > del { margin-right: 6px; color: var(--c-text-tertiary); }
.wl-price > .wl-off-rate { margin-right: 6px; font-style: normal; font-weight: var(--fw-bold); color: var(--c-red-main); }
.wl-price > strong { font-size: var(--fs-sh2); font-weight: var(--fw-bold); color: var(--c-text-primary); }
.wl-subprice { margin-top: 4px; font-size: var(--fs-body2); color: var(--c-primary); }
.wl-subprice > strong { font-weight: var(--fw-bold); }
/* 할인율은 보라가 아니라 회색 (영양제 목록과 같은 규칙) */
.wl-subprice > em { font-style: normal; color: var(--c-text-tertiary); }
.wl-off { margin-top: 8px; font-size: var(--fs-body2); color: var(--c-text-disabled); }

/* 판매 종료 — 딤 처리하고 선택도 막는다(정책 9-5) */
.wl-card.is-off .wl-thumb, .wl-card.is-off .wl-name { opacity: .5; }

.wl-x {
    display: inline-flex; align-items: center; justify-content: center;
    width: 32px; height: 32px; border: 0; border-radius: 50%;
    background: transparent; color: var(--c-text-tertiary);
    font-size: var(--fs-sh2); line-height: 1; cursor: pointer;
}
.wl-x:hover { background: var(--c-gray-100); color: var(--c-text-primary); }
.wl-x:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }

@media (max-width: 768px) {
    /* 좁은 폭에서는 썸네일과 여백을 줄인다. 280px 에서도 넘치지 않아야 한다. */
    .wl-head { padding: 22px 0 14px; }
    .wl-card { grid-template-columns: auto 64px minmax(0, 1fr) auto; gap: 14px; padding: 18px 16px; }
    .wl-thumb { width: 64px; height: 64px; }
    .wl-x { width: 28px; height: 28px; }
}

/* ── 나의 리뷰 (F-905) — page_img/마이페이지_나의 리뷰.png ──
   주문 카드 = 회색 헤더(주문번호·주문일·구매확정) + 항목 목록. 항목마다 우측에 버튼 1개. */
.rvw-list { margin-top: 28px; display: grid; gap: 24px; }
.rvw-order { border: 1px solid var(--c-line); border-radius: var(--r-md); background: var(--c-surface); overflow: hidden; }
.rvw-order-head {
    display: flex; align-items: center; justify-content: space-between; gap: 16px;
    padding: 18px 24px; background: var(--c-gray-50); border-bottom: 1px solid var(--c-line);
}
.rvw-order-no { font-size: var(--fs-body2); font-weight: var(--fw-semibold); color: var(--c-text-primary); }
.rvw-order-meta { font-size: var(--fs-body2); color: var(--c-text-secondary); }
.rvw-sep { margin: 0 10px; color: var(--c-line); }

.rvw-items { padding: 0 24px; }
/* 항목 사이 구분선 — 마지막 항목 아래에는 긋지 않는다 */
.rvw-item {
    display: grid; grid-template-columns: 80px minmax(0, 1fr) auto;
    align-items: center; gap: 24px; padding: 24px 0;
}
.rvw-item + .rvw-item { border-top: 1px solid var(--c-line); }
.rvw-thumb { width: 80px; height: 80px; border-radius: 8px; background: var(--c-gray-100); }
/* ⚠️ 그리드 아이템 기본 `min-width: auto` 라 긴 상품명이 카드를 밀어낸다 */
.rvw-body { min-width: 0; }
.rvw-name { display: block; font-size: var(--fs-body1); font-weight: var(--fw-semibold); color: var(--c-text-primary); }
.rvw-name:hover { text-decoration: underline; }
.rvw-meta { margin-top: 8px; font-size: var(--fs-body2); color: var(--c-text-secondary); }

/* [리뷰작성] 검정 채움 / [리뷰수정] 흰 배경 + 테두리 (시안) */
.rvw-btn {
    flex: 0 0 auto; min-width: 84px; height: 34px; padding: 0 14px; border-radius: 6px;
    border: 1px solid var(--c-sub-black); background: var(--c-sub-black); color: var(--c-on-color);
    font-size: var(--fs-body2); font-weight: var(--fw-semibold); cursor: pointer;
}
.rvw-btn:hover { background: var(--c-gray-800); border-color: var(--c-gray-800); }
.rvw-btn.is-edit { background: var(--c-surface); color: var(--c-text-primary); }
.rvw-btn.is-edit:hover { background: var(--c-gray-100); }
.rvw-btn:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }

/* ── 리뷰 작성·수정 팝업 ── */
.rvf-target {
    display: flex; align-items: center; gap: 20px;
    padding: 22px 0; border-top: 1px solid var(--c-line); border-bottom: 1px solid var(--c-line);
}
.rvf-thumb { flex: 0 0 auto; width: 80px; height: 80px; border-radius: 8px; background: var(--c-gray-100); }
.rvf-name { font-size: var(--fs-body1); font-weight: var(--fw-semibold); }
.rvf-order { margin-top: 6px; font-size: var(--fs-body2); color: var(--c-text-secondary); }

.rvf-field { margin-top: 24px; }
.rvf-label { font-size: var(--fs-body2); font-weight: var(--fw-semibold); color: var(--c-text-primary); }
.rvf-label > em { font-style: normal; color: var(--c-sub-gold); }
.rvf-sub { font-weight: var(--fw-regular); color: var(--c-text-tertiary); }

.rvf-stars { display: flex; align-items: center; justify-content: space-between; margin-top: 14px; }
.rvf-star-set { display: flex; gap: 8px; }
.rvf-star {
    border: 0; background: transparent; cursor: pointer; padding: 0; line-height: 1;
    font-size: 30px; color: var(--c-gray-300);
}
.rvf-star.is-on { color: var(--c-sub-gold); }
.rvf-star:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); border-radius: 4px; }
.rvf-score { font-size: var(--fs-body1); font-weight: var(--fw-bold); }

/* 글자수 카운터를 입력창 안 우하단에 얹는다 */
.rvf-textarea { position: relative; margin-top: 12px; }
.rvf-textarea .textarea { min-height: 132px; padding-bottom: 30px; }
.rvf-count { position: absolute; right: 14px; bottom: 12px; font-size: var(--fs-sub1); color: var(--c-text-tertiary); }

.rvf-thumbs { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 12px; }
.rvf-add {
    width: 80px; height: 80px; border: 1px dashed var(--c-border-primary); border-radius: 8px;
    background: var(--c-surface); color: var(--c-text-tertiary); font-size: var(--fs-sh1); cursor: pointer;
}
.rvf-add:hover { border-color: var(--c-primary); color: var(--c-primary); }
.rvf-add:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }
/* 업로드 미리보기도 **자르지 않는다** — 올린 그림이 맞는지 확인하는 자리다(1:1 문의 첨부와 동일 규칙) */
.rvf-thumb-item {
    position: relative; width: 80px; height: 80px; padding: 4px;
    display: flex; align-items: center; justify-content: center;
    border: 1px solid var(--c-line); border-radius: 8px; background: var(--c-gray-100);
}
.rvf-thumb-item > img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; }
/* 삭제 배지는 썸네일 밖으로 살짝 걸친다(시안) */
.rvf-thumb-x {
    position: absolute; top: -7px; right: -7px;
    width: 20px; height: 20px; border: 0; border-radius: 50%;
    background: var(--c-red-main); color: var(--c-on-color);
    font-size: 11px; line-height: 1; cursor: pointer;
}
.rvf .modal-pair { margin-top: 28px; }

@media (max-width: 768px) {
    .rvw-order-head { flex-direction: column; align-items: flex-start; gap: 6px; padding: 16px; }
    .rvw-items { padding: 0 16px; }
    /* 좁은 폭에서는 버튼을 아래로 내린다 — 3열이 다 들어가지 않는다 */
    .rvw-item { grid-template-columns: 64px minmax(0, 1fr); gap: 14px; padding: 18px 0; }
    .rvw-thumb { width: 64px; height: 64px; }
    .rvw-btn { grid-column: 1 / -1; width: 100%; height: 40px; }
    .rvf-target { gap: 14px; }
    .rvf-thumb, .rvf-add, .rvf-thumb-item { width: 68px; height: 68px; }
}

/* 나의 리뷰 — 버튼 묶음([리뷰수정] + [삭제]) · 주문 내역에서 넘어왔을 때 강조 */
.rvw-tools { display: flex; align-items: center; gap: 8px; }
.rvw-del {
    padding: 0 10px; height: 34px; border: 1px solid var(--c-line); border-radius: 6px;
    background: var(--c-surface); color: var(--c-text-tertiary);
    font-size: var(--fs-body2); cursor: pointer;
}
.rvw-del:hover { border-color: var(--c-red-main); color: var(--c-red-main); }
.rvw-del:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }
/* 주문 내역의 [리뷰작성] → /mypage/review#order-N 으로 넘어온 주문을 잠깐 표시해 준다 */
.rvw-order.is-focus { border-color: var(--c-primary); box-shadow: 0 0 0 3px var(--c-focus-ring); }

@media (max-width: 768px) {
    .rvw-tools { grid-column: 1 / -1; }
    .rvw-tools .rvw-btn { flex: 1; }
}

/* ── 1:1 문의 (F-907) — page_img/마이페이지_1_1 문의*.png ──
   목록: 게시판형 표 + 우상단 [문의 등록] / 등록: 좌 라벨 + 우 입력 / 상세: 본문 + 관리자 답변 블록 */
.iq-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; }
.iq_head_no {padding-bottom: 24px;border-bottom: 1px solid var(--c-gray-800);}
.iq-head .cs-heading { padding-bottom: 0; border-bottom: 0; }
.iq-head .btn { flex: 0 0 auto; }
/* 제목 줄 아래 구분선은 표가 대신한다 — 헤더 영역과 표 사이만 띄운다 */
.iq-table { margin-top: 24px; border-top: 1px solid var(--c-gray-800); }
/* 🐛 2026-08-14 — 비밀글 자물쇠가 **제목 위 줄에 따로** 떠 있었다.
   전역 리셋이 `img { display: block }` 이라 아이콘이 자기 줄을 차지한 것이다.
   (상품 상세 문의 탭은 부모 `.pv-qna-title` 이 flex 라 문제가 없었다 — 여기만 빠져 있었다)
   ⚠️ `inline-flex` 로 둔다 — `flex` 로 하면 링크가 한 줄을 다 차지해 셀 전체가 클릭 영역이 된다. */
.iq-title { display: inline-flex; align-items: center; gap: 6px; color: var(--c-text-primary); }
.iq-title:hover { text-decoration: underline; }

/* ── 등록 ── */
.iq-sec { margin-top: 28px; }
.iq-row { display: grid; grid-template-columns: 152px minmax(0, 1fr); gap: 20px; align-items: start; margin-top: 20px; }
.iq-label { padding-top: 13px; font-size: var(--fs-body2); font-weight: var(--fw-semibold); color: var(--c-text-primary); }
/* 시안의 필수 표시는 Sub_gold 다(회원가입 폼과 동일) */
.iq-label > em { font-style: normal; color: var(--c-sub-gold); }
.iq-count { font-weight: var(--fw-regular); color: var(--c-text-tertiary); }
.iq-input { min-width: 0; max-width: 424px; }
.iq-textarea { min-height: 120px; }
.iq-thumbs { display: flex; flex-wrap: wrap; gap: 12px; padding-top: 6px; }
.iq-actions { margin-top: 34px; padding-top: 26px; border-top: 1px solid var(--c-line); }
.iq-actions .btn { min-width: 200px; }

/* ── 상세 ── */
.iq-view { margin-top: 26px; }

/* 상품 문의 상세 머리 — 어느 상품에 남긴 글인지 (마이페이지 상품 문의 · F-302c, 2026-08-13)
   ⚠️ 1:1 문의(P-412)에는 상품이 없어 이 블록이 나오지 않는다. 두 화면이 같은 `.iq-view` 를 공유한다. */
.iq-prod {
    display: flex; align-items: center; gap: 16px;
    padding: 16px; margin-bottom: 22px;
    border-radius: var(--r-md); background: var(--c-gray-50);
}
.iq-prod-thumb { flex: 0 0 auto; width: 64px; height: 64px; border-radius: 8px; background: var(--c-gray-100); overflow: hidden; }
.iq-prod-body { min-width: 0; flex: 1 1 auto; }   /* min-width:0 이 없으면 긴 상품명이 버튼을 밀어낸다 */
.iq-prod-name {
    display: block; font-size: var(--fs-body1); font-weight: var(--fw-semibold);
    color: var(--c-text-primary);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
a.iq-prod-name:hover { text-decoration: underline; }
.iq-prod-off { margin-top: 6px; font-size: var(--fs-body2); color: var(--c-text-disabled); }
.iq-prod .btn { flex: 0 0 auto; }

.iq-view-head { padding-bottom: 20px; border-bottom: 1px solid var(--c-line); }
.iq-view-title { font-size: var(--fs-sh1); font-weight: var(--fw-bold); }
.iq-view-meta { display: flex; align-items: center; gap: 10px; margin-top: 12px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
/* 제목 앞 `[유형]` — 제목과 같은 크기·굵기로 두되 색으로만 구분한다(2026-08-12) */
.iq-view-cat { color: var(--c-primary); }
/* 본문이 짧아도 답변 블록과 붙지 않게 최소 높이를 준다(시안의 넉넉한 여백) */
.iq-view-body { min-height: 200px; padding: 28px 0; }
/* 관리자 입력이 textarea 라 줄바꿈을 그대로 살린다 — nl2br 대신 pre-wrap(이중 줄바꿈 방지) */
.iq-text { white-space: pre-wrap; font-size: var(--fs-body1); line-height: 1.7; color: var(--c-text-primary); }
.iq-view-imgs { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 22px; }
/* ⚠️ 첨부는 **증빙**이라 잘리면 안 된다 → `cover`(꽉 채우며 크롭) 대신 `contain`(전체 보이기).
   세로/가로가 긴 이미지도 남는 자리는 배경으로 채운다. 클릭하면 원본이 새 탭에서 열린다. */
.iq-view-img {
    display: flex; align-items: center; justify-content: center;
    width: 120px; height: 120px; padding: 6px;
    border: 1px solid var(--c-line); border-radius: 8px; overflow: hidden; background: var(--c-gray-100);
}
.iq-view-img > img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; }

.iq-reply { padding: 24px 28px; border-radius: var(--r-md); background: var(--c-gray-50); }
.iq-reply-head { display: flex; align-items: center; gap: 12px; padding-bottom: 14px; border-bottom: 1px solid var(--c-line); }
.iq-reply-title { font-size: var(--fs-body1); font-weight: var(--fw-bold); color: var(--c-primary); }
.iq-reply-date { font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.iq-reply .iq-text { margin-top: 18px; }
.iq-reply.is-wait .iq-text { margin-top: 0; color: var(--c-text-tertiary); }
.iq-view-actions { display: flex; justify-content: flex-end; margin-top: 32px; }

@media (max-width: 768px) {
    .iq-head { flex-direction: column; align-items: stretch; gap: 14px; }
    .iq-head .btn { width: 100%; }
    .iq-row { grid-template-columns: 1fr; gap: 8px; }
    .iq-label { padding-top: 0; }
    .iq-input { max-width: none; }
    .iq-actions .btn { width: 100%; }
    .iq-reply { padding: 18px; }
    .iq-view-actions .btn { width: 100%; }
    /* 상품 줄은 세로로 쌓는다 — 좁은 폭에서 [상품 문의 전체 보기] 가 상품명을 밀어낸다 */
    .iq-prod { flex-wrap: wrap; }
    .iq-prod .btn { width: 100%; }
}

/* ── 카카오 채널 상담 버튼 — 전 화면 우측 하단 고정 (2026-08-10) ──
   z-index 130 — 헤더(100)·하단탭(120) 위, 팝업(150)·모달(170)·토스트(200) 아래.
   ⚠️ 모바일은 하단 탭바(74) 위로 올리고, 구매바가 있는 화면(body.has-buybar)은 한 단 더 올린다. */
.kakao-ch {
    position: fixed; right: 24px; bottom: 24px; z-index: 130;
    display: flex; align-items: center; justify-content: center;
    width: 60px; height: 60px; padding: 0;
    border: 0; border-radius: 50%; background: transparent; cursor: pointer;
    /* 아이콘이 원형 PNG 라 박스 그림자가 아니라 **모양을 따라가는** drop-shadow 를 쓴다 */
    filter: drop-shadow(var(--shadow-float));
    transition: transform .15s ease;
}
.kakao-ch:hover { transform: translateY(-3px); }
.kakao-ch:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }
/* 에셋이 140×140(2x 이상)이라 박스에 맞춰 줄인다 — 전역 img{max-width:100%} 와 충돌하지 않게 명시 */
.kakao-ch > img { width: 100%; height: 100%; object-fit: contain; }

@media (max-width: 768px) {
    .kakao-ch {
        right: 16px;
        bottom: calc(74px + 16px + env(safe-area-inset-bottom));   /* 하단 탭바 위 */
        width: 52px; height: 52px;
    }
    /* 상품 상세 구매바(하단 탭바 위 64)까지 있는 화면은 그만큼 더 올린다 */
    body.has-buybar .kakao-ch { bottom: calc(74px + 64px + 16px + env(safe-area-inset-bottom)); }
}

/* ── 배송 · 교환/반품 안내 (F-1003) — 상품 상세 · 주문·결제 공용 (2026-08-10) ──
   관리자 입력이 textarea 라 줄바꿈만 살린다(pre-wrap · nl2br 미사용으로 이중 줄바꿈 방지). */
.dg-box {
    margin-top: 32px; padding: 24px 28px;
    border: 1px solid var(--c-line); border-radius: var(--r-md); background: var(--c-gray-50);
}
.dg-item + .dg-item { margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--c-line); }
.dg-title { font-size: var(--fs-body1); font-weight: var(--fw-semibold); color: var(--c-text-primary); }
.dg-text { margin-top: 10px; white-space: pre-wrap; font-size: var(--fs-body2); color: var(--c-text-secondary); }

/* 주문·결제 사이드(424)는 폭이 좁아 여백을 줄인다 */
.ck-side .dg-box { margin-top: 20px; padding: 18px 20px; }

@media (max-width: 768px) {
    .dg-box { padding: 18px; }
}

/* ══ 마지막 추천 영양제 보기 팝업 (F-203 / P-203 · P-301) — 2026-08-11 ══
   ⚠️ 모달 본문이라 폭이 648(.is-wide)로 고정이다. 카드형(.rv-*)은 너무 커서
      순위·이름·사유 한 줄 구성으로 압축했다(04.screen-design P-203 팝업 구성). */
.np-lastrec { margin: 0 0 12px; text-align: right; }

.lr-meta {
    display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
    margin: 0 0 14px; padding-bottom: 12px;
    border-bottom: 1px solid var(--c-divider);
}
.lr-date { font-size: var(--fs-body2); color: var(--c-text-secondary); }

/* 팝업 안에서만 스크롤한다 — 10개가 들어가면 모달이 화면을 넘긴다 */
.lr-list {
    list-style: none; margin: 0; padding: 0;
    display: flex; flex-direction: column; gap: 10px;
    max-height: 52vh; overflow-y: auto;
}
.lr-item {
    display: flex; align-items: flex-start; gap: 12px;
    padding: 12px 14px;
    border: 1px solid var(--c-border-primary); border-radius: 10px;
}
.lr-item.is-off { background: var(--c-gray-100); }

.lr-rank {
    flex: 0 0 24px; width: 24px; height: 24px;
    display: inline-flex; align-items: center; justify-content: center;
    font-size: var(--fs-sub1); font-weight: var(--fw-bold);
    color: var(--c-on-color); background: var(--c-sub-black);
    border-radius: 50%;
}
/* ⚠️ min-width:0 이 없으면 긴 영양제명이 팝업을 밀어낸다(280px 최소 폭) */
.lr-body { flex: 1 1 auto; min-width: 0; }
.lr-name {
    display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
    margin: 0; font-size: var(--fs-body1); font-weight: var(--fw-semibold);
}
.lr-reason { margin: 4px 0 0; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.lr-off { flex: 0 0 auto; font-size: var(--fs-body2); color: var(--c-text-tertiary); }
.lr-cart { flex: 0 0 auto; }

@media (max-width: 768px) {
    .np-lastrec { text-align: left; }
    .lr-item { flex-wrap: wrap; }
    .lr-cart, .lr-off { margin-left: 36px; }
}

/* ══ 추천 결과 맞춤 안내 팝업 (F-204 / P-203) — 2026-08-11 ══
   상단(설문 추천) · 하단(유전자 검사) 2단. 하단은 배경을 깔아 구분한다. */
.sg { display: flex; flex-direction: column; gap: 16px; }
.sg-block {
    padding: 20px;
    border: 1px solid var(--c-border-primary); border-radius: 12px;
}
.sg-block.is-dna { background: var(--c-main-100); border-color: var(--c-main-200); }

.sg-eyebrow {
    margin: 0 0 6px;
    font-size: var(--fs-sub1); font-weight: var(--fw-semibold); letter-spacing: .08em;
    color: var(--c-primary);
}
.sg-title { margin: 0; font-size: var(--fs-sh2); font-weight: var(--fw-bold); }
.sg-desc {
    margin: 8px 0 16px;
    font-size: var(--fs-body2); color: var(--c-text-secondary);
}

@media (max-width: 768px) {
    .sg-block { padding: 16px; }
}

/* ══ 구독 현황 (P-404) — 2026-08-11 ══
   ⚠️ 시안 없음 — 마이페이지 공통 골격에 맞춰 구성했다.
   ⚠️ `.cs-heading` 은 `margin-bottom: 0` + 아래 테두리라 **첫 내용이 제목 선에 붙는다.**
      화면마다 첫 요소에 상단 여백을 준다(배송지 `.ad-list` 30px 과 같은 방식). */
.cs-heading + .sb-next,
.cs-heading + .sb-card,
.cs-heading + .empty { margin-top: 30px; }
/* 유전자 리포트 상세(P-407)의 [목록으로]·[PDF 다운로드] 도 같은 이유로 제목 선에 붙어 있었다 (2026-08-14).
   ⚠️ `.rp-actions` 자체는 report.css(웹·PDF 공용)에 있으므로 **여기서만** 띄운다 — PDF 여백은 건드리지 않는다. */
.cs-heading + .rp-actions { margin-top: 30px; }
.sb-card {
    position: relative;                 /* [상세이력] 을 우상단에 띄우는 기준 (2026-08-27 · 요청 8) */
    padding: 28px;
    border: 1px solid var(--c-border-primary); border-radius: 12px;
}
.sb-card + .sb-card { margin-top: 20px; }
/* 결제 내역 제목 — 카드 바로 아래 붙지 않게 (다른 마이페이지 화면의 .ov-sec·.dr-sec 과 같은 역할)
   ⚠️ 2026-08-14 — `margin-bottom` 이 빠져 있어 **제목과 내용(빈 안내 박스·표)이 붙어 있었다.**
      `.mp-sec-title` 자체에는 아래 여백이 없다 → 화면별 `-sec` 클래스가 준다(.ov-sec·.dr-sec 도 14px). */
.sb-sec { margin-top: 56px; margin-bottom: 14px; }

.sb-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; flex-wrap: wrap; }
.sb-name {
    display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
    margin: 0; font-size: var(--fs-sh2); font-weight: var(--fw-bold);
}
/* 같은 주문에서 만들어진 구독을 한 카드로 묶었을 때의 '외 N건' (2026-08-27 · 요청 4) */
.sb-name-more { font-size: var(--fs-body2); font-weight: var(--fw-regular); color: var(--c-text-secondary); }
.sb-plan { margin: 6px 0 0; font-size: var(--fs-body2); color: var(--c-text-secondary); }
/* [상세이력] — 마크업은 카드 **마지막**에 있다(모바일에서 카드 하단에 두기 위해).
   PC 에서는 원래 자리인 **카드 우상단**에 띄운다 (2026-08-27 · 요청 8).
   ⚠️ absolute 라 카드 높이에 관여하지 않는다 — 카드 안 내용이 이 버튼 아래로 지나가지 않게
      상단 우측은 상품명·플랜만 있는 영역이라는 전제다. */
.sb-acts { display: flex; gap: 8px; flex-shrink: 0; }
.sb-card > .sb-acts { position: absolute; top: 24px; right: 24px; }

.sb-info {
    display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
    margin: 24px 0 0; padding: 22px 0;
    border-top: 1px solid var(--c-divider);
}
.sb-info > div { min-width: 0; }
.sb-info dt { font-size: var(--fs-sub1); color: var(--c-text-secondary); }
.sb-info dd { margin: 6px 0 0; font-size: var(--fs-body2); }
.sb-info dd strong { font-size: var(--fs-body1); }

/* 구독 상세 (P-405) — 2026-08-26 신규 */
/* 묶인 상품 목록 — 주문 내역 상세(.ov-item)와 **같은 마크업·같은 모양**을 쓴다 (2026-08-27 · 요청 5) */
.sb-items { margin-top: 20px; }
.sb-items .ov-item + .ov-item { margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--c-divider); }
/* 묶인 상품이 여러 개면 포인트 신청도 상품마다 있다 — 어느 상품인지 제목에 붙인다 */
.sb-point + .sb-point { margin-top: 12px; }
.sb-point-of {
    margin-left: 6px; font-weight: var(--fw-regular);
    font-size: var(--fs-sub1); color: var(--c-text-secondary);
}
.sb-bar { margin-top: 6px; height: 5px; border-radius: 3px; background: var(--c-gray-200, #e9ecef); overflow: hidden; }
.sb-bar > span { display: block; height: 100%; border-radius: 3px; background: var(--c-primary); }
.sb-round { margin-top: 6px; }
/* 섹션 제목 + 우측 링크(또는 버튼) 한 줄
   🔄 2026-08-27 (요청 6) — 위쪽 여백을 **줄이 갖는다**. 제목(.ov-sec)에 margin-top 을 두면
   flex 안에서 제목만 내려가고 버튼은 위에 남아 같은 선에 놓이지 않았다. */
.ov-sec-row {
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    margin-top: 46px; margin-bottom: 14px;
}
.ov-sec-row > .mp-sec-title { margin-top: 0; margin-bottom: 0; }
.ov-sec-btn { flex-shrink: 0; }
.ov-sec-link { font-size: var(--fs-sub1); color: var(--c-primary); text-decoration: underline; white-space: nowrap; }
.ov-table tr.is-now > td { background: var(--c-primary-50, #f6f2ff); }
.sb-round-order { font-weight: var(--fw-semibold); color: var(--c-primary); text-decoration: underline; }
@media (max-width: 768px) {
    /* 회차 번호는 카드 제목 줄 — 아래 항목들과 구분되게 */
    .sb-round-no { font-size: var(--fs-body1); font-weight: var(--fw-semibold); }
}
.sb-round td .badge { margin-left: 6px; }
.sb-detail-link { margin-left: auto; }
/* 회차 포인트 사용 (2026-08-27 · 요청 6) — 결제 금액과 헷갈리지 않게 색으로 구분한다 */
.sb-round-pt { font-weight: var(--fw-semibold); color: var(--c-red-text); }
/* 회차 지급(적립) 포인트 (2026-08-27 · 요청 1) — 사용(빨강)과 **반대 색**으로 둬 한눈에 갈린다 */
.sb-round-earn { font-weight: var(--fw-semibold); color: var(--c-primary); }
/* 한 회차에 상품이 여러 개면 주문도 여러 건이다 */
.sb-round-line + .sb-round-line { margin-top: 8px; }

/* 🔄 2026-08-27 (요청 9) — 모바일 회차 이력을 **카드**로.
   `is-stack` 기본형은 밑줄 하나로만 나뉘어, 회차가 쌓이면 어디서 끊기는지 읽히지 않았다.
   ⚠️ `tr` 을 flex 로 바꿔 **회차 번호와 상태 뱃지를 한 줄**(카드 머리)에 세우고
      나머지 항목은 아래에 라벨/값으로 깐다. */
@media (max-width: 768px) {
    .cs-table.sb-round { margin-top: 0; }
    .cs-table.sb-round tr {
        display: flex; flex-wrap: wrap; align-items: baseline; column-gap: 10px;
        margin-top: 12px; padding: 14px 16px;
        border: 1px solid var(--c-border-primary); border-radius: 12px;
        background: var(--c-surface);
    }
    .cs-table.sb-round tr:first-child { margin-top: 0; }
    /* 카드 머리 — 회차(왼쪽) + 상태 뱃지(오른쪽).
       ⚠️ 상태 칸은 마크업상 **맨 뒤**라 `order` 로 끌어올려야 한다 — 안 그러면 카드 맨 아래에 홀로 남는다. */
    .cs-table.sb-round td.sb-round-no {
        order: 0; flex: 1 1 auto; margin-bottom: 0;
        font-size: var(--fs-body1); font-weight: var(--fw-semibold);
    }
    .cs-table.sb-round td.sb-round-no strong { color: var(--c-primary); }
    .cs-table.sb-round td[data-label="상태"] { order: 1; flex: 0 0 auto; padding: 0; }
    .cs-table.sb-round td[data-label="상태"]::before { content: none; }
    /* 나머지 항목 — 머리 아래 한 줄씩 */
    .cs-table.sb-round td:not(.sb-round-no):not([data-label="상태"]) {
        order: 2; flex: 1 1 100%; padding: 6px 0 0;
    }
    /* 머리와 본문을 가르는 선 — 머리 다음 첫 항목(결제일)에 준다 */
    .cs-table.sb-round td[data-label="결제일"] {
        margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--c-divider);
    }
    /* 주문 · 배송은 값이 길다 — 라벨을 윗줄에 두고 아래를 통째로 쓴다 */
    .cs-table.sb-round td.sb-round-ord { display: block; margin-bottom: 0; font-weight: var(--fw-regular); }
    .cs-table.sb-round td.sb-round-ord::before {
        content: attr(data-label);
        display: block; margin-bottom: 4px;
        font-size: var(--fs-body2); color: var(--c-text-secondary);
    }
}

.sb-warn {
    margin: 0 0 16px; padding: 12px 14px;
    background: var(--c-red-bg); color: var(--c-red-text);
    border-radius: 8px; font-size: var(--fs-body2);
}
.sb-warn a { color: inherit; text-decoration: underline; }

/* 포인트 사용 신청 — 카드 안 하위 영역이라 배경으로 구분한다 */
.sb-point { margin-top: 4px; padding: 20px; background: var(--c-gray-100); border-radius: 10px; }
.sb-point-title { margin: 0 0 14px; font-size: var(--fs-body2); font-weight: var(--fw-semibold); }
.sb-point-now { margin: 0 0 10px; font-size: var(--fs-body2); color: var(--c-primary); }
.sb-point-help { margin: 10px 0 0; font-size: var(--fs-sub1); color: var(--c-text-secondary); }
/* 포인트 신청·취소 줄은 주문 내역 상세(P-403)와 **같은 규칙**(.ov-point-row)을 쓴다 (2026-08-26).
   ⚠️ `.sb-point form + form { margin-top }` 은 제거했다 — 두 폼이 이제 한 줄(flex)이라
      위쪽 여백이 들어가면 [취소]만 아래로 밀려 내려간다. 간격은 flex gap 이 맡는다. */
.sb-point .ov-point-row { margin-top: 0; }

.sb-empty-pay {
    padding: 28px; text-align: center;
    color: var(--c-text-secondary); background: var(--c-gray-100); border-radius: 10px;
}

/* 모달 본문 */
.sb-modal-desc { margin: 0 0 16px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.sb-plans { display: flex; flex-direction: column; gap: 10px; }
.sb-plan-opt {
    display: flex; align-items: center; gap: 10px;
    padding: 14px 16px; border: 1px solid var(--c-border-primary); border-radius: 10px;
    cursor: pointer; font-size: var(--fs-body1);
}
.sb-plan-opt:has(.rdo:checked) { border-color: var(--c-primary); background: var(--c-main-100); }
.sb-cancel-notes { margin: 0; padding-left: 18px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.sb-cancel-notes li + li { margin-top: 6px; }

/* 해지 대상 상품 목록 (2026-09-04) — 묶음 구독은 상품명을 전부 적는다.
   ⚠️ 개수가 많아도 팝업이 늘어나지 않게 스크롤을 준다(안내문과 버튼이 화면 밖으로 밀리면 안 된다). */
.sb-cancel-items {
    margin: 0 0 16px; padding: 12px 14px 12px 30px;
    list-style: disc; max-height: 168px; overflow-y: auto;
    background: var(--c-gray-50); border-radius: 10px;
    font-size: var(--fs-body2); color: var(--c-text-primary);
}
.sb-cancel-items li + li { margin-top: 6px; }

@media (max-width: 768px) {
    .sb-card { padding: 20px; }
    .sb-next { padding: 20px; }
    .sb-sec { margin-top: 40px; }
    .sb-info { grid-template-columns: 1fr; gap: 14px; }
    /* 🔄 2026-08-27 (요청 8) — 모바일은 **카드 하단 전체 폭**. PC 의 우상단 고정을 푼다.
       마크업이 이미 카드 마지막에 있어 position 만 되돌리면 제자리에 놓인다. */
    .sb-card > .sb-acts {
        position: static; width: 100%; margin-top: 18px;
        padding-top: 16px; border-top: 1px solid var(--c-divider);
    }
    .sb-acts .btn { flex: 1 1 0; --btn-h: 44px; height: 44px; }
    /* 구독 상세(P-405) — 상품 목록·포인트 카드도 폰 여백에 맞춘다 */
    .sb-items { margin-top: 16px; }
    .sb-point + .sb-point { margin-top: 10px; }
}

/* 주문 상세(P-403)의 포인트 신청 안내 — 구독이 여러 건이면 P-404 로 보낸다 */
.ov-point-note { margin: 0 0 10px; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.ov-point-note a { color: var(--c-primary); text-decoration: underline; }
.ov-point-note strong { color: var(--c-primary); }

/* 다음 회차 청구 예정 요약 (P-404) — 배송비를 포함한 실제 청구액 */
.sb-next {
    padding: 24px 28px; margin-bottom: 20px;
    background: var(--c-main-100); border-radius: 12px;
}
.sb-next-title { margin: 0 0 16px; font-size: var(--fs-body2); font-weight: var(--fw-semibold); color: var(--c-primary); }
.sb-next-sum { margin: 0; }
.sb-next-sum > div { display: flex; justify-content: space-between; gap: 12px; font-size: var(--fs-body2); }
.sb-next-sum > div + div { margin-top: 10px; }
.sb-next-sum dt { color: var(--c-text-secondary); }
.sb-next-sum dd { margin: 0; }
.sb-next-sum dd.is-minus { color: var(--c-red-text); }
.sb-next-island { margin-left: 6px; font-size: var(--fs-sub1); color: var(--c-text-secondary); }
.sb-next-total {
    display: flex; justify-content: space-between; align-items: baseline; gap: 12px;
    margin: 18px 0 0; padding-top: 16px;
    border-top: 1px solid var(--c-border-primary);
    font-size: var(--fs-body2); font-weight: var(--fw-semibold);
}
.sb-next-total strong { font-size: var(--fs-sh2); color: var(--c-primary); }

/* ══ 이용후기 목록 (P-605 / F-905) — 2026-08-11 ══
   ⚠️ 시안 없음 — 별점·마스킹 표기는 상품 상세 후기 탭(.pv-stars)과 **같은 클래스**를 재사용한다.
      같은 후기가 두 화면에서 다르게 보이면 안 된다. */
.rvl-summary {
    display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap;
    margin-top: 28px; padding: 28px;
    background: var(--c-gray-100); border-radius: 12px;
}
.rvl-avg { display: flex; align-items: center; gap: 14px; }
.rvl-avg strong { font-size: var(--fs-h2); font-weight: var(--fw-bold); line-height: 1; }
.rvl-count { margin: 0; font-size: var(--fs-body2); color: var(--c-text-secondary); }
.rvl-count strong { color: var(--c-text-primary); }

/* 별점 필터 — 좁은 폭에서는 가로 스크롤(줄바꿈되면 화면을 다 먹는다) */
.rvl-filter {
    display: flex; gap: 8px; margin: 24px 0 0;
    overflow-x: auto; -webkit-overflow-scrolling: touch;
}
.rvl-chip {
    flex: 0 0 auto;
    padding: 9px 16px; border: 1px solid var(--c-border-primary); border-radius: 999px;
    font-size: var(--fs-body2); color: var(--c-text-secondary); white-space: nowrap;
}
.rvl-chip em { font-style: normal; color: var(--c-text-tertiary); }
.rvl-chip:hover { border-color: var(--c-main-200); color: var(--c-text-primary); }
.rvl-chip.is-on {
    background: var(--c-main-100); border-color: var(--c-primary);
    color: var(--c-primary); font-weight: var(--fw-semibold);
}
.rvl-chip.is-on em { color: var(--c-primary); }

.rvl-list { list-style: none; margin: 28px 0 0; padding: 0; }
.rvl-item {
    display: flex; gap: 20px;
    padding: 24px 0; border-bottom: 1px solid var(--c-divider);
}
.rvl-item:first-child { border-top: 1px solid var(--c-gray-800); }

.rvl-thumb {
    flex: 0 0 88px; width: 88px; height: 88px;
    border-radius: 10px; overflow: hidden; background: var(--c-gray-100);
}
/* ⚠️ min-width:0 이 없으면 긴 후기 내용이 카드를 밀어낸다(최소 폭 280px) */
.rvl-body { flex: 1 1 auto; min-width: 0; }

.rvl-head { display: flex; align-items: center; gap: 6px; margin: 0; }
/* 고정핀 아이콘 — 2x 에셋(40×40)을 20×20 으로. ⚠️ .rvl-head 가 flex 라 flex-shrink 를 막아야 눌리지 않는다 */
.rvl-pin { flex: 0 0 20px; width: 20px; height: 20px; }
.rvl-product { font-size: var(--fs-body2); font-weight: var(--fw-semibold); }
.rvl-product.is-off { color: var(--c-text-tertiary); }

.rvl-meta { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: 8px 0 0; }
.rvl-who, .rvl-date { font-size: var(--fs-sub1); color: var(--c-text-secondary); }

.rvl-content { margin: 12px 0 0; font-size: var(--fs-body2); color: var(--c-text-primary); }

.rvl-imgs { display: flex; gap: 8px; flex-wrap: wrap; list-style: none; margin: 14px 0 0; padding: 0; }
.rvl-imgs img {
    width: 90px; height: 90px; object-fit: cover;
    border-radius: 8px; border: 1px solid var(--c-divider);
}

.rvl-reply {
    margin: 14px 0 0; padding: 14px 16px;
    background: var(--c-gray-100); border-radius: 8px;
}
.rvl-reply-title { margin: 0 0 6px; font-size: var(--fs-sub1); font-weight: var(--fw-semibold); color: var(--c-primary); }
.rvl-reply-body { margin: 0; font-size: var(--fs-body2); color: var(--c-text-secondary); }

@media (max-width: 768px) {
    .rvl-summary { padding: 20px; }
    .rvl-item { gap: 14px; padding: 20px 0; }
    .rvl-thumb { flex-basis: 64px; width: 64px; height: 64px; }
    .rvl-imgs img { width: 72px; height: 72px; }
}

/* ── 에디터 본문 (.rich) — 2026-08-13 ─────────────────────────
   관리자 에디터(Summernote)로 작성한 HTML 이 들어오는 영역.
   적용: 영양제 상세(P-302) · 키트 상세(P-308) · 약관(/terms·/privacy·모달) ·
        배송 안내(P-302·P-304) · 공지 상세(P-602) · 이벤트 상세(P-603)
   ⚠️ CSS 리셋이 목록·제목의 기본 여백을 지워 버려서, **이 영역 안에서만 되살린다.**
      리셋을 전역에서 풀면 다른 화면이 다 틀어진다.
   ⚠️ 폰트 크기는 8단계 토큰만 쓴다(px 리터럴 금지 — 13.user-front-guide). */
.rich { font-size: var(--fs-body1); line-height: 1.7; color: var(--c-text-primary); word-break: break-word; }
.rich > *:first-child { margin-top: 0; }
.rich > *:last-child { margin-bottom: 0; }
.rich p { margin: 0 0 12px; }
.rich br + br { line-height: 1; }
.rich h1, .rich h2 { margin: 28px 0 12px; font-size: var(--fs-sh1); font-weight: var(--fw-bold); }
.rich h3, .rich h4 { margin: 22px 0 10px; font-size: var(--fs-sh2); font-weight: var(--fw-semibold); }
.rich h5, .rich h6 { margin: 18px 0 8px; font-size: var(--fs-body1); font-weight: var(--fw-semibold); }
.rich ul, .rich ol { margin: 0 0 12px; padding-left: 22px; }
.rich ul { list-style: disc; }
.rich ol { list-style: decimal; }
.rich li { margin-bottom: 4px; }
.rich a { color: var(--c-primary); text-decoration: underline; }
.rich strong, .rich b { font-weight: var(--fw-bold); }
.rich hr { margin: 24px 0; border: 0; border-top: 1px solid var(--c-line); }
.rich blockquote {
    margin: 0 0 12px; padding: 12px 18px;
    border-left: 3px solid var(--c-main-200); background: var(--c-gray-50);
    color: var(--c-text-secondary);
}
/* 에디터에서 크기를 지정해도 화면 밖으로 넘치지 않게 — 인라인 width 를 이겨야 해서 !important */
.rich img { max-width: 100% !important; height: auto !important; }
/* 표는 좁은 화면에서 **표만** 가로 스크롤한다(본문이 통째로 밀리면 안 된다) */
.rich table {
    width: 100%; margin: 0 0 12px;
    border-collapse: collapse; font-size: var(--fs-body2);
}
.rich th, .rich td { padding: 10px 12px; border: 1px solid var(--c-line); }
.rich th { background: var(--c-gray-50); font-weight: var(--fw-semibold); }
@media (max-width: 768px) {
    .rich { font-size: var(--fs-body2); }
    .rich table { display: block; overflow-x: auto; white-space: nowrap; }
}


/* ══ 마이페이지 모바일 정리 (2026-08-27 · 요청 2·3) ═══════════════════════
   ⚠️ **PC 는 손대지 않는다** — 이 블록의 모든 규칙은 `max-width: 768` 안에만 있다.
   ⚠️ 파일 **맨 끝**에 두는 이유 — 같은 선택자를 앞쪽 미디어 블록에서 이미 쓰고 있어
      순서가 뒤인 쪽이 이긴다(미디어쿼리는 특이도를 올려 주지 않는다).
      앞쪽 블록에 섞어 넣었다가 적용되지 않은 적이 있다.
   ⚠️ 되돌리려면 이 블록만 지우면 된다. 직전 상태는 `_backup` 의 `mobile_ui_날짜` 폴더에 있다.
   ⚠️ 주석 안에 별표+슬래시를 쓰지 말 것 — 거기서 주석이 닫혀 **뒤 블록이 통째로 파싱되지 않는다**
      (실제로 이 블록 전체가 적용되지 않았다). */
@media (max-width: 768px) {

    /* ── ① 헤더 ~ 첫 콘텐츠 간격 20px 로 통일 (요청 2) ──────────────────
       그전에는 `main.page` 20 + `.mp-wrap` 16 + 첫 요소 20 = **56px** 이었다.
       바깥 20 만 남기고 안쪽 둘을 0 으로 둔다. */
    .mp-wrap { padding-top: 0; gap: 14px; }
    .mp-wrap .mp-body .cs-heading + * { margin-top: 0; }
    .mp-wrap .mp-body > :first-child { margin-top: 0; }
    /* 화면별로 자기 위 여백을 갖고 있던 것들 — 위 규칙이 안 닿는 자리를 막는다 */
    .mp-wrap .mi-form,
    .mp-wrap .ad-head { margin-top: 0; padding-top: 0; }

    /* ── ② 섹션 제목 — 화면마다 22~56px 로 제각각이던 위 여백을 한 값으로 ── */
    .mp-wrap .mp-sec-title { font-size: var(--fs-body1); }
    .mp-wrap .ov-sec,
    .mp-wrap .sb-sec,
    .mp-wrap .dr-sec,
    .mp-wrap .ov-sec-row { margin-top: 26px; margin-bottom: 10px; }

    /* ── ③ 스택 표를 **카드**로 (요청 3) ──────────────────────────────
       밑줄 하나로만 나뉘어 있어 한 건이 어디서 끝나는지 읽히지 않았다
       (포인트 내역 · 나의 맞춤 영양제 · 1:1 문의 · 유전자 리포트).
       ⚠️ `.sb-round` 는 자기 카드 규칙이 따로 있다 — 제외한다. */
    .mp-wrap .cs-table.is-stack:not(.sb-round) { margin-top: 0; }
    .mp-wrap .cs-table.is-stack:not(.sb-round) tr {
        margin-top: 10px; padding: 14px 16px;
        border: 1px solid var(--c-border-primary); border-radius: 12px;
        background: var(--c-surface);
    }
    .mp-wrap .cs-table.is-stack:not(.sb-round) tr:first-child { margin-top: 0; }
    .mp-wrap .cs-table.is-stack:not(.sb-round) td { padding: 3px 0; gap: 10px; }
    .mp-wrap .cs-table.is-stack:not(.sb-round) td::before {
        min-width: 72px; font-size: var(--fs-sub1);
    }
    /* 제목 줄(is-stack-full)은 카드 머리 — 아래 항목과 선으로 가른다 */
    .mp-wrap .cs-table.is-stack:not(.sb-round) td.is-stack-full {
        margin-bottom: 8px; padding-bottom: 10px;
        border-bottom: 1px solid var(--c-divider);
        font-size: var(--fs-body1);
    }
    /* 버튼이 든 칸은 라벨을 빼고 **한 줄 전체**로 — 폰에서 누르기 쉽게.
       버튼이 둘이면(리포트 보기 · PDF) 나란히 반씩 나눠 갖는다. */
    .mp-wrap .cs-table.is-stack:not(.sb-round) td:has(> .btn) {
        display: flex; gap: 8px; margin-top: 10px; padding: 0;
    }
    .mp-wrap .cs-table.is-stack:not(.sb-round) td:has(> .btn)::before { content: none; }
    .mp-wrap .cs-table.is-stack:not(.sb-round) td > .btn {
        flex: 1 1 0; width: auto; --btn-h: 40px; height: 40px;
    }

    /* ── ④ 빈 상태·안내 문구 — 여백만 크고 정보가 적었다 ── */
    .mp-wrap .empty { padding: 44px 16px; }
    .mp-wrap .empty-text { font-size: var(--fs-body2); }

    /* ── ⑤ 구독 회차 이력 — 지급 포인트 칸이 늘어 라벨 폭을 맞춘다 (요청 1) ── */
    .cs-table.sb-round td[data-label="지급 포인트"]::before,
    .cs-table.sb-round td[data-label="포인트 사용"]::before { min-width: 84px; }

    /* ══ 마이페이지 첫 화면 — 모바일 시안 반영 (2026-08-27 · mo_main.JPG) ══════
       구성: ① 보유 포인트(보라 전체 폭 카드 + 총적립·총사용 박스)
             ② 구독 현황 · 유전자 검사 2칸
             ③ 그룹 라벨이 보이는 **평평한 메뉴 리스트**
       ⚠️ 전부 `.is-hub`(첫 화면) 안으로 한정한다 — 다른 마이페이지 화면의 요약/메뉴는 그대로다.
       ⚠️ 마크업은 거의 손대지 않았다 — 뱃지를 라벨 줄로 올리는 것도 `display: contents` 로 한다. */

    /* ① 요약 — 포인트 카드는 한 줄 전체, 그 아래 2칸 */
    .mp-wrap.is-hub .mp-cards { grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 0; }
    .mp-wrap.is-hub .is-point-card { grid-column: 1 / -1; }

    /* 보유 포인트 — 보라 카드. 라벨(좌) + 금액(우) 한 줄, 그 아래 합계 박스 */
    .mp-wrap.is-hub .is-point-card {
        display: grid; grid-template-columns: 1fr auto; align-items: center;
        row-gap: 14px; padding: 16px; border: 0; border-radius: 14px;
        background: linear-gradient(135deg, var(--c-main-300), var(--c-main-200));
        color: var(--c-on-color);
    }
    .mp-wrap.is-hub .is-point-card .mp-card-label {
        grid-column: 1; font-size: var(--fs-sub1); color: rgba(255, 255, 255, .85);
    }
    .mp-wrap.is-hub .is-point-card .mp-card-value {
        grid-column: 2; margin-top: 0; gap: 0;
        font-size: var(--fs-sh1); font-weight: var(--fw-bold); color: var(--c-on-color);
    }
    /* 시안의 동전 아이콘 — 에셋이 없어 원 안의 'P' 로 그린다(`.mp-more-ico` 와 같은 방식) */
    .mp-wrap.is-hub .mp-pt-coin {
        display: inline-flex; align-items: center; justify-content: center;
        width: 20px; height: 20px; margin-right: 6px; border-radius: 50%;
        background: rgba(255, 255, 255, .28);
        font-size: 11px; font-weight: var(--fw-bold); line-height: 1;
    }
    .mp-wrap.is-hub .mp-pt-sum {
        display: grid; gap: 8px; grid-column: 1 / -1;
        padding: 12px 14px; border-radius: 10px; background: rgba(255, 255, 255, .16);
    }
    .mp-wrap.is-hub .mp-pt-sum > div {
        display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
        font-size: var(--fs-sub1);
    }
    .mp-wrap.is-hub .mp-pt-sum dt { color: rgba(255, 255, 255, .85); }
    .mp-wrap.is-hub .mp-pt-sum dd { margin: 0; font-weight: var(--fw-semibold); }
    .mp-wrap.is-hub .is-point-card .mp-card-desc { display: none; }   /* 같은 값을 두 번 보여 주지 않는다 */

    /* ② 구독 현황 · 유전자 검사 — 라벨 줄 오른쪽에 뱃지, 아래 값·설명
       ⚠️ 뱃지는 마크업상 `.mp-card-value` 안에 있다 → `display: contents` 로 부모 그리드에 올린다.
          (마크업을 옮기면 PC 배치까지 바뀐다) */
    .mp-wrap.is-hub .mp-card:not(.is-point-card) {
        display: grid; grid-template-columns: 1fr auto; align-items: center;
        row-gap: 6px; padding: 14px; border-radius: 12px; border-color: var(--c-divider);
    }
    .mp-wrap.is-hub .mp-card:not(.is-point-card) .mp-card-label { grid-column: 1; grid-row: 1; }
    .mp-wrap.is-hub .mp-card:not(.is-point-card) .mp-card-value { display: contents; }
    .mp-wrap.is-hub .mp-card:not(.is-point-card) .mp-card-value > .badge {
        grid-column: 2; grid-row: 1; justify-self: end;
    }
    .mp-wrap.is-hub .mp-card:not(.is-point-card) .mp-card-value > strong {
        grid-column: 1 / -1; grid-row: 2; font-size: var(--fs-body1); line-height: 1.3;
    }
    /* 시안에는 보조 설명이 **있다** — 위쪽 규칙에서 감춘 것을 여기서 되살린다 */
    .mp-wrap.is-hub .mp-card:not(.is-point-card) .mp-card-desc {
        display: block; grid-column: 1 / -1; grid-row: 3;
        margin-top: 2px; font-size: 11px; line-height: 1.4; color: var(--c-text-tertiary);
    }

    /* ③ 메뉴 — 그룹 라벨(회색 띠) + 평평한 리스트. 시안에는 화살표가 없다 */
    .mp-wrap.is-hub .mp-side-group {
        display: block;
        /* `.page` 좌우 여백이 20px 이라 그만큼 빼서 **화면 끝까지** 띠를 깐다 */
        margin: 18px -20px 0; padding: 9px 20px;
        background: var(--c-gray-100);
        font-size: var(--fs-sub1); color: var(--c-text-tertiary);
    }
    .mp-wrap.is-hub .mp-side-nav { margin-top: 0; }
    /* 행도 띠와 같이 **화면 끝까지** — 구분선이 중간에서 끊기지 않게 한다 (시안) */
    .mp-wrap.is-hub .mp-side-link {
        margin: 0 -20px; padding: 13px 20px;
        border: 0; border-bottom: 1px solid var(--c-divider); border-radius: 0;
        background: none;
        font-size: var(--fs-body1); font-weight: var(--fw-medium); color: var(--c-text-primary);
    }
    .mp-wrap.is-hub .mp-side-link::after { content: none; }
    .mp-wrap.is-hub .mp-side-link.is-active { background: none; color: var(--c-main-300); }
    .mp-wrap.is-hub .mp-side-link.is-soon { color: var(--c-text-disabled); }
    /* 로그아웃 — 리스트 마지막. 띠가 없으므로 위 여백만 준다 */
    .mp-wrap.is-hub .mp-side-out { margin: 12px 0 0; padding-top: 0; border-top: 0; }
    .mp-wrap.is-hub .mp-side-out .mp-side-link { margin: 0; padding: 13px 2px; }
    .mp-wrap.is-hub .mp-side-link.is-logout {
        border-bottom: 0; color: var(--c-text-secondary); font-weight: var(--fw-regular);
    }
}


/* ============================================================
   주문·결제 — 단건 결제 적립 포인트 표 (2026-08-31)
   정기 표(.ck-pt)와 같은 상자를 쓰되 **첫 칸이 상품명**이라 폭 규칙만 다르다.
   ⚠️ 이 블록은 파일 맨 끝이어야 한다 — 위쪽 `.ck-pt` 모바일 블록이 같은 특이도로
      첫 칸을 54px(플랜 이름 기준)로 고정해 두어, 뒤에 와야 이긴다.
   ============================================================ */
.ck-pt.is-single .ck-pt-table thead th:first-child,
.ck-pt.is-single .ck-pt-table tbody th { width: auto; }
.ck-pt.is-single .ck-pt-table tbody th { font-weight: var(--fw-medium); color: var(--c-text-primary); }
/* 합계 행 — 상품이 둘 이상일 때만 나온다 */
.ck-pt.is-single .ck-pt-table tr.is-sum th,
.ck-pt.is-single .ck-pt-table tr.is-sum td { border-top: 1px solid var(--c-text-disabled); }

@media (max-width: 768px) {
    /* 상품명은 길이가 제각각이라 고정 배분(table-layout: fixed)이 맞지 않는다 */
    .ck-pt.is-single .ck-pt-table { table-layout: auto; }
    .ck-pt.is-single .ck-pt-table thead th:first-child,
    .ck-pt.is-single .ck-pt-table tbody th { width: auto; word-break: keep-all; }
    .ck-pt.is-single .ck-pt-table th, .ck-pt.is-single .ck-pt-table td { padding: 7px 4px; }
}


/* ============================================================
   주문 내역(P-402) — 버튼이 3개인 카드 (2026-08-31)
   키트 주문에 [검체 회수 요청] 이 붙으면 [구매확정]·[상세보기] 와 함께 **3개**가 된다.
   모바일 규칙은 버튼을 한 줄에 균등 분할하므로 360px 에서 글자가 잘린다 → 두 개씩 줄바꿈한다.
   ⚠️ 버튼이 1·2개인 카드는 건드리지 않는다 — 3번째 자식이 있을 때만 적용한다.
   ⚠️ 이 블록은 파일 맨 끝이어야 한다 — 위쪽 모바일 블록이 같은 선택자를 이미 쓰고 있다.
   ⚠️ :has() 미지원 브라우저는 기존(한 줄) 배치 그대로다 — 깨지지 않는다.
   ============================================================ */
@media (max-width: 768px) {
    .od-actions:has(> :nth-child(3)) {
        grid-auto-flow: row;
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
    /* 세 번째 버튼([상세보기])은 아랫줄을 혼자 쓰므로 전체 폭으로 편다 */
    .od-actions > :nth-child(3):last-child { grid-column: 1 / -1; }
}
