@charset "UTF-8";
/* ==========================================================================
   상품 목록/상세 (product) — /products, /products/{id}
   site.css 의 토큰과 .card/.btn/.badge 를 재사용하고 여기서 확장만 한다.
   모바일 퍼스트, 브레이크포인트 640px / 1024px
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. 카테고리 탭
   -------------------------------------------------------------------------- */
.product-tabs {
    display: flex;
    flex-wrap: nowrap;
    gap: var(--space-2);
    margin-bottom: var(--space-5);
    padding-bottom: var(--space-2);
    overflow-x: auto;               /* 모바일에서 가로 스크롤 */
    -webkit-overflow-scrolling: touch;
    scrollbar-width: thin;
}

.product-tabs__link {
    flex: 0 0 auto;
    /* 실측 44px. WCAG 최소치이긴 하나 손이 떨리는 분에게는 부족하다 */
    display: inline-flex;
    align-items: center;
    min-height: var(--tap-min);
    padding: var(--space-2) var(--space-4);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-pill);
    background: var(--color-surface);
    color: var(--color-text-muted);
    font-size: var(--font-size-base);
    font-weight: 700;
    white-space: nowrap;
    transition: background var(--transition), color var(--transition), border-color var(--transition);
}

.product-tabs__link:hover,
.product-tabs__link:focus-visible {
    border-color: var(--color-primary);
    color: var(--color-primary);
}

.product-tabs__link--active {
    background: var(--color-primary);
    border-color: var(--color-primary);
    color: #fff;
}

.product-tabs__link--active:hover,
.product-tabs__link--active:focus-visible {
    background: var(--color-primary-dark);
    color: #fff;
}

@media (min-width: 640px) {
    .product-tabs {
        flex-wrap: wrap;
        overflow-x: visible;
    }
}

/* --------------------------------------------------------------------------
   2. 목록 그리드 / 상품 카드
   -------------------------------------------------------------------------- */
.product-list__count {
    margin-bottom: var(--space-3);
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}

.product-list__count strong {
    color: var(--color-primary);
}

.product-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: var(--space-4);
}

@media (min-width: 640px) {
    .product-grid {
        gap: var(--space-5);
    }
}

.product-card {
    color: inherit;
    text-decoration: none;
}

/* 품절 뱃지 기준점 */
.product-card__media {
    position: relative;
}

.product-card__soldout {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(35, 36, 31, .45);
    color: #fff;
    font-size: var(--font-size-md);
    font-weight: 700;
    letter-spacing: .05em;
}

/* ------------------------------------------------------------ 예약판매
   ★ "아직 안 열림" 은 품절과 <반대 뜻>이다. 품절은 끝난 것이고 이건 시작 전이다.
     같은 회색 덮개를 쓰되 글자를 다르게, 그리고 색을 죽이지 않는다 —
     회색 "품절" 로 읽히는 순간 손님은 다시 안 들어온다. */
.product-card__soldout--soon {
    background: rgba(35, 36, 31, .55);
    letter-spacing: 0;
    text-align: center;
    padding: 0 var(--space-3);
    line-height: 1.4;
}

/* 예약 기간 중인 카드: 덮개 없이 <모서리 띠>로만 알린다. 살 수 있는 상품이라 가려선 안 된다. */
.product-card__preorder {
    position: absolute;
    top: var(--space-2);
    left: var(--space-2);
    padding: 4px 10px;
    border-radius: var(--radius-sm);
    background: var(--color-primary-dark);
    color: #fff;
    font-size: var(--font-size-sm);
    font-weight: 700;
}

.product-card--preorder {
    border-color: var(--color-primary-dark);
}

/* 상세 화면의 안내 한 줄. 가격 바로 위에 온다. */
.preorder-notice {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-2);
    margin: var(--space-3) 0 0;
    padding: var(--space-3) var(--space-4);
    border: 1px solid var(--color-primary-dark);
    border-radius: var(--radius);
    background: var(--color-tint);
    /* 본문 크기 그대로 둔다. 이 줄을 작게 만들면 정작 읽어야 할 사람이 못 읽는다. */
    font-size: var(--font-size-md);
    line-height: var(--line-height-base);
}

.preorder-notice__tag {
    flex: none;
    padding: 2px 10px;
    border-radius: var(--radius-sm);
    background: var(--color-primary-dark);
    color: #fff;
    font-weight: 700;
    white-space: nowrap;
}

/* 아직 안 열린 상품은 초록(살 수 있음)이 아니라 중립색이다. */
.preorder-notice--soon {
    border-color: var(--color-border-strong);
}
.preorder-notice--soon .preorder-notice__tag {
    background: var(--color-dark);
}

.product-detail__soldout--soon {
    letter-spacing: 0;
    text-align: center;
    padding: 0 var(--space-4);
    line-height: 1.4;
}

/*
  카드의 상품명.
  ★ 실측에서 본문과 같은 17px 이었다. 상품 그리드에서 <앞장서야 하는 것은 상품명>인데,
    요약·뱃지와 같은 무게라 눈이 카드 안에서 어디부터 읽을지 매번 다시 판단해야 했다.
    한 단계 올려 카드 안의 위계를 세운다(상품명 22 → 판매가 22 → 요약 15).
*/
.product-card__name {
    display: block;
    font-size: var(--font-size-lg);
    line-height: var(--line-height-tight);
}

.product-card__summary {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
    line-height: 1.5;
}

/* 홈(home/index.html)의 .card2 카드가 이 이름을 함께 쓴다. home.css 가 이 파일보다 먼저 로드돼
   같은 특이도에서 여기가 이기므로, 이 선언을 고치면 홈이 같이 움직인다. 건드리지 마라.
   목록 카드의 스마트스토어식 가격 줄은 아래 .product-card__pricebox 를 새로 쓴다. */
.product-card__price {
    display: block;
    margin-top: auto;
    padding-top: var(--space-2);
    font-size: var(--font-size-lg);
    font-weight: 700;
    color: var(--color-accent);
}

/* 가격 줄 — [할인율] [정가 취소선] 판매가 (네이버 스마트스토어 형식).
   baseline 정렬이라 글자 크기가 다른 세 값의 밑선이 맞는다. */
.product-card__pricebox {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--space-2);
    padding-top: var(--space-2);
}

/* 카드 높이 정렬용 margin-top:auto 는 .product-grid 안에서만 건다.
   홈의 상품 구획은 .products 라 여기에 걸리지 않는다(홈 레이아웃을 건드리지 않기 위해서다). */
.product-grid .product-card__pricebox {
    margin-top: auto;
}

.product-card__discount {
    color: var(--color-accent);
    font-weight: 700;
}

.product-card__list-price {
    text-decoration: line-through;
    color: var(--color-text-muted);
    font-size: var(--font-size-sm);
}

.product-card__sale-price {
    font-size: var(--font-size-lg);
    font-weight: 700;
    color: var(--color-accent);
}

.product-card__badges {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-1);
    padding-top: var(--space-2);
}

.product-list__notice {
    margin-top: var(--space-8);
}

/* --------------------------------------------------------------------------
   3. 상세 - 레이아웃
   -------------------------------------------------------------------------- */
.product-detail {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--space-6);
    margin-bottom: var(--space-10);
}

.product-detail > * {
    min-width: 0;
}

@media (min-width: 640px) {
    .product-detail {
        grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
        gap: var(--space-8);
    }
}

/* 좌: 이미지 */
.product-detail__media {
    position: relative;
    aspect-ratio: 4 / 3;
    background: var(--color-tint);
    border: 1px solid var(--color-border);
    border-radius: var(--radius);
    overflow: hidden;
}

.product-detail__media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

.product-detail__soldout {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(35, 36, 31, .45);
    color: #fff;
    font-size: var(--font-size-xl);
    font-weight: 700;
    letter-spacing: .08em;
}

/* 우: 정보 */
.product-detail__category {
    font-size: var(--font-size-sm);
    font-weight: 700;
    color: var(--color-primary);
    margin-bottom: var(--space-1);
}

.product-detail__name {
    font-size: var(--font-size-xl);
    line-height: var(--line-height-tight);
    margin-bottom: var(--space-2);
}

.product-detail__summary {
    font-size: var(--font-size-base);
    color: var(--color-text-muted);
    margin-bottom: var(--space-4);
}

.product-detail__price {
    font-size: var(--font-size-2xl);
    font-weight: 700;
    color: var(--color-accent);
    padding-bottom: var(--space-4);
    border-bottom: 1px solid var(--color-border);
}

/* 좌측 컬럼(대표 사진 + 썸네일 줄)을 감싸는 상자. .product-detail 이 2열 그리드라
   대표와 썸네일이 각각 칸을 차지하지 않도록 한 칸으로 묶는다. */
.product-detail__gallery {
    min-width: 0;
}

.product-detail__thumbs {
    display: flex;
    gap: var(--space-2);
    margin-top: var(--space-2);
    overflow-x: auto;
}

.product-detail__thumb {
    flex: 0 0 auto;
    width: 72px;
    height: 72px;
    padding: 0;
    background: none;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    overflow: hidden;
    cursor: pointer;
}

.product-detail__thumb img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

.product-detail__thumb--active {
    border-color: var(--color-primary);
}

.product-detail__pricebox {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--space-2);
}

.product-detail__discount {
    color: var(--color-accent);
}

/* 부모(.product-detail__price)가 2xl · accent 라 여기서 되돌린다 —
   취소선 친 정가가 판매가만큼 크면 어느 쪽이 실제 값인지 한눈에 안 보인다. */
.product-detail__list-price {
    font-size: var(--font-size-base);
    font-weight: 400;
    color: var(--color-text-muted);
    text-decoration: line-through;
}

@media (min-width: 1024px) {
    .product-detail__name {
        font-size: var(--font-size-2xl);
    }

    /* 스마트스토어처럼 사진 쪽을 조금 더 크게 잡는다 */
    .product-detail {
        grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
    }
}

/* --------------------------------------------------------------------------
   4. 상세 - 스펙 목록
   -------------------------------------------------------------------------- */
.product-spec {
    display: grid;
    grid-template-columns: 88px 1fr;
    gap: var(--space-2) var(--space-3);
    padding: var(--space-4) 0;
    border-bottom: 1px solid var(--color-border);
    font-size: var(--font-size-base);
}

.product-spec dt {
    color: var(--color-text-muted);
    font-weight: 700;
}

.product-spec dd {
    color: var(--color-text);
}

.product-spec__note {
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
}

/* --------------------------------------------------------------------------
   5. 상세 - 구매 폼 (수량 + 장바구니)
   -------------------------------------------------------------------------- */
.product-buy {
    padding-top: var(--space-5);
}

/*
  ★ 라벨과 조절기를 붙여 둔다. 예전에는 space-between 이라 '수량' 은 칸 왼쪽 끝,
    조절기는 오른쪽 끝에 떨어져 있었다.

    두 가지가 나빴다.
    1) 붙어 있지 않으면 어느 라벨이 어느 칸의 것인지 눈으로 다시 이어야 한다.
       이 화면은 값·배송비·원산지·재고가 전부 <이름 왼쪽 / 값 오른쪽> 이라
       조절기도 그 줄들과 같은 모양으로 보이는데, 실제로는 <누르는 것> 이다.
    2) 조절기가 칸 오른쪽 끝에 붙어 있으면 768px 에서 우하단 상담 독과 겹친다.
       실측으로 확인했다 — + 버튼을 눌러도 카카오톡 버튼이 눌렸다.
       왼쪽으로 당기면 그 자리에서 벗어난다.
*/
.product-qty {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: flex-start;
    gap: var(--space-4);
    margin-bottom: var(--space-4);
}

/* 재고 상한 안내("남은 재고가 3개라 3개까지 …"). 줄을 바꿔 조절기 아래에 붙는다.
   동의 안내(.consent-alert)와 같은 굵기 · 색 — 이 화면에서 "여기를 보세요" 는 한 모양이다. 비면 자리도 안 차지한다. */
.product-qty__note {
    flex-basis: 100%;
    margin: calc(var(--space-2) * -1) 0 0;
    font-size: var(--font-size-base);
    font-weight: 700;
    color: var(--color-danger);
}

.product-qty__note:empty {
    display: none;
}

.product-qty__label {
    font-size: var(--font-size-base);
    font-weight: 700;
}

/* 수량 조절기 전체가 하나의 부품이다. 테두리가 그 경계를 말하므로 강한 선을 쓴다. */
.product-qty__control {
    display: inline-flex;
    align-items: stretch;
    border: 1px solid var(--color-border-strong);
    border-radius: var(--radius-sm);
    background: var(--color-surface);
    overflow: hidden;
}

/* 44px → --tap-min 으로 올렸다 (2026-09-20). 수량 - / + 버튼. 10kg 한 상자를 두 개 사시려면 여기를 눌러야 한다. */
.product-qty__btn {
    width: var(--tap-min);
    min-height: var(--tap-min);
    border: 0;
    background: var(--color-tint);
    color: var(--color-text);
    font-size: var(--font-size-lg);
    font-weight: 700;
    cursor: pointer;
    transition: background var(--transition);
}

.product-qty__btn:hover:not([disabled]) {
    background: var(--color-primary-light);
}

.product-qty__btn[disabled] {
    opacity: .5;
    cursor: not-allowed;
}

/* 44px → --tap-min 으로 올렸다 (2026-09-20). 수량 입력칸. */
.product-qty__input {
    width: 64px;
    min-height: var(--tap-min);
    padding: 0 var(--space-2);
    border: 0;
    border-inline: 1px solid var(--color-border);
    text-align: center;
    font-size: var(--font-size-base);
    font-weight: 700;
    background: var(--color-surface);
    color: var(--color-text);
}

.product-buy__total {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--space-2);
    padding: var(--space-3) var(--space-4);
    margin-bottom: var(--space-4);
    background: var(--color-tint);
    border-radius: var(--radius-sm);
    font-size: var(--font-size-base);
}

.product-buy__total strong {
    font-size: var(--font-size-lg);
    color: var(--color-accent);
}

.product-buy__total .text-muted {
    font-size: var(--font-size-xs);
}

/* ★ min-height:52px 을 뺐다. 바로 위 [장바구니 담기](.btn 48px)와 세로로 붙는 버튼이라
     4px 차이가 계단으로 보였다. 두 버튼은 같은 자리에서 고르는 같은 급의 선택지다 —
     무게 차이는 색(.btn--accent)이 이미 내고 있다. 글자 크기는 남긴다. */
.product-buy .btn-group .btn {
    /* 두 버튼을 같은 글자 크기로 묶는다. 한쪽만 19px 이면 min-height 48px 을 넘겨
       48 / 50px 로 2px 어긋나고, 세로로 붙어 있어 그 2px 이 계단으로 보인다.
       19px 은 --font-size-md 가 정한 <버튼 글자> 크기다 — 어르신 화면이라 큰 쪽으로 맞춘다. */
    font-size: var(--font-size-md);
}

.product-buy__help {
    margin-top: var(--space-3);
    font-size: var(--font-size-sm);
    color: var(--color-text-muted);
}

.product-buy__help a {
    color: var(--color-primary);
    font-weight: 700;
}

/* --------------------------------------------------------------------------
   6. 상세 - 하단 탭 (상세정보 · 고시 · 배송/교환반품 · 문의)

   ★ 위쪽 .product-tabs 는 <카테고리 탭>이다. 이름이 비슷하다고 재사용하면
     하단 탭이 알약 모양이 되어 카테고리 탭과 구분되지 않는다.
   -------------------------------------------------------------------------- */
.product-tabs2 {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-1);
    margin-top: var(--space-8);
    border-bottom: 2px solid var(--color-border);
}

.product-tabs2__link {
    appearance: none;
    background: none;
    border: 0;
    border-bottom: 2px solid transparent;
    margin-bottom: -2px;
    padding: var(--space-3) var(--space-4);
    font-family: inherit;
    font-size: var(--font-size-base);
    font-weight: 700;
    color: var(--color-text-muted);
    cursor: pointer;
}

.product-tabs2__link--active {
    color: var(--color-primary);
    border-bottom-color: var(--color-primary);
}

/* 스크립트가 첫 패널만 남기고 감춘다. 마크업에는 hidden 이 없다 —
   JS 가 죽어도 네 구획이 이어진 한 페이지로 읽힌다. */
.product-panel[hidden] {
    display: none;
}

/* --------------------------------------------------------------------------
   7. 상세 - 하단 영역
   -------------------------------------------------------------------------- */
.product-description .content-body {
    padding: var(--space-2) 0;
}

/* 상세 설명은 평문으로 저장된다(관리자 입력을 th:utext 로 흘리지 않는다). 줄바꿈은 여기서 살린다.
   ★ 이 규칙을 부모(.content-body)로 올리지 마라 — 태그 사이의 들여쓰기 줄바꿈까지 살아나
   문단과 사진 사이에 빈 줄이 생긴다. 관리자가 친 줄바꿈만 살아나야 한다. */
/* 상품 상세 설명. 이 화면에서 가장 오래 읽는 글이고, 사장이 직접 쓴 문장이다.
   실측 104자/줄이었다 — 폭을 제한해 눈이 다음 줄을 놓치지 않게 한다. */
.product-description__text {
    max-width: var(--measure);
    /* ★ white-space:pre-line 을 걷어 냈다. 본문이 이제 HTML 이고 줄바꿈은 <br> 이 맡는다 —
       둘을 같이 두면 한 줄이 두 줄로 벌어진다. RichText.toHtml 주석 참고. */
}

.product-related .product-card__price,
.product-related .product-card__sale-price {
    font-size: var(--font-size-base);
}

/* ==========================================================================
   목록 정렬 · 카드에서 바로 담기 · 모바일 하단 구매 바
   (스마트스토어 대체 + 어르신 사용성)
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. 정렬

   드롭다운(select)이 아니라 버튼이다. 어르신에게 select 는 두 번 누르고 작은 목록에서
   골라야 하는 조작이고, 무엇이 선택돼 있는지도 잘 보이지 않는다.
   -------------------------------------------------------------------------- */
.product-sort {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-2);
    margin-bottom: var(--space-4);
}

.product-sort__link {
    display: inline-flex;
    align-items: center;
    min-height: var(--tap-min);
    padding: 0 var(--space-4);
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: 999px;
    font-size: var(--font-size-base);
    color: var(--color-text-muted);
    text-decoration: none;
    white-space: nowrap;
}

.product-sort__link:hover,
.product-sort__link:focus-visible {
    border-color: var(--color-primary);
    color: var(--color-primary);
}

/* 고른 것이 한눈에 보여야 한다. 테두리 색만 바꾸면 어르신 눈에는 차이가 없다. */
.product-sort__link.is-active {
    background: var(--color-primary);
    border-color: var(--color-primary);
    color: #fff;
    font-weight: 700;
}

/* --------------------------------------------------------------------------
   2. 카드에서 바로 담기

   카드가 <a> 에서 <div> 로 바뀌었다(안에 폼이 들어가야 해서).
   그래서 예전에 .product-card 가 anchor 로서 갖던 성질을 여기서 되살린다.
   -------------------------------------------------------------------------- */
.product-card {
    display: flex;
    flex-direction: column;
}

/* 사진 + 본문이 통째로 링크다. 누를 수 있는 면적을 예전만큼 넓게 유지한다. */
.product-card__link {
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
    color: inherit;
    text-decoration: none;
}

.product-card__link:hover .product-card__name,
.product-card__link:focus-visible .product-card__name {
    text-decoration: underline;
}

.product-card__buy {
    margin-top: auto;
    padding: var(--space-3);
    padding-top: 0;
}

/* 손가락이 굵어도 빗나가지 않는 높이 */
.product-card__buy .btn {
    min-height: 48px;
    font-size: var(--font-size-md);
}

/* --------------------------------------------------------------------------
   3. 모바일 하단 고정 구매 바

   ★ 상세 화면은 길다. 고시 표·배송 안내·후기까지 내려가면 구매 버튼은 화면 밖으로
     한참 올라가 있고, 어르신은 "사려면 어디로 가야 하는지" 를 잃어버린다.
   ★ 폼을 복제하지 않는다 — 버튼이 form="productBuyForm" 으로 위의 폼을 그대로 제출한다.
     복제하면 수량 칸이 둘이 되어 위에서 3개로 고치고 아래를 누르면 1개가 담긴다.
   -------------------------------------------------------------------------- */
.buy-bar {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    /* 상담 독(50)보다 위. 아래에 두면 '바로 구매' 를 독이 덮어 눌리지 않는다. */
    z-index: var(--z-buybar);
    display: flex;
    align-items: center;
    gap: var(--space-2);
    padding: var(--space-3);
    /* 아이폰 홈 인디케이터에 버튼이 가리지 않게 한다 */
    padding-bottom: calc(var(--space-3) + env(safe-area-inset-bottom, 0px));
    background: var(--color-surface);
    border-top: 1px solid var(--color-border);
    box-shadow: 0 -2px 12px rgba(0, 0, 0, .08);
}

.buy-bar__price {
    display: flex;
    flex: 1 1 auto;
    min-width: 0;
    flex-direction: column;
    line-height: 1.3;
}

.buy-bar__name {
    font-size: var(--font-size-xs);
    color: var(--color-text-muted);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.buy-bar__price > strong {
    font-size: var(--font-size-md);
    color: var(--color-accent);
}

.buy-bar .btn {
    flex: 0 0 auto;
    min-height: 48px;
    padding: 0 var(--space-4);
    font-size: var(--font-size-md);
    font-weight: 700;
}

/* 바가 페이지 마지막 내용을 덮지 않게 자리를 비워 둔다.
   비워 두지 않으면 푸터의 사업자정보 마지막 줄이 영영 가려진다(법적으로 보여야 하는 값이다). */
@media (max-width: 1023px) {
    body:has(.buy-bar) {
        /*
          ★ 76px 고정이었다. 바의 실제 높이는 padding 12 + 버튼 48 + padding 12 + 안전영역 이라,
            홈 인디케이터가 있는 아이폰(안전영역 약 34px)에서 바는 106px 인데 자리는 76px 이었다.
            바로 위 주석이 가려지면 안 된다고 못박아 둔 사업자정보 마지막 줄이 30px 가려져 있었다.
          ★★ 그래서 숫자를 적지 않고 바를 이루는 값 그대로 계산한다. 버튼 높이를 바꾸면 따라온다.
        */
        padding-bottom: calc(var(--space-3) * 2 + var(--tap-min) + var(--space-2)
                             + env(safe-area-inset-bottom, 0px));
    }
}

/* 데스크톱에서는 감춘다 — 구매 영역이 이미 화면 안에 있다. */
@media (min-width: 1024px) {
    .buy-bar {
        display: none;
    }
}


/* ============================================================ 규격 고르기 (옵션)
   ★ 라디오를 <카드처럼> 만든다. 어르신 손가락이 닿는 면이 동그라미 하나가 아니라 줄 전체여야 한다
     — 프로젝트의 48px 터치타깃 기준을 여기서도 지킨다.
   ★★ 품절 규격은 지우지 않고 흐리게만 둔다. 사라지면 "사던 게 없어졌다" 로 읽히는데,
     실제로는 그 규격만 다 나간 것이다. */
.product-options {
    margin: var(--space-5) 0 0;
    padding: 0;
    border: 0;
}

.product-options__legend {
    padding: 0;
    margin-bottom: var(--space-2);
    font-weight: 700;
    font-size: var(--font-size-md);
}

.product-options__list {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
}

.product-option {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-2) var(--space-3);
    /* 줄 전체가 누르는 자리다. 48px 은 이 프로젝트의 최소 터치타깃이다. */
    min-height: 48px;
    padding: var(--space-3) var(--space-4);
    border: 1px solid var(--color-border);
    border-radius: var(--radius);
    background: var(--color-surface);
    cursor: pointer;
}

.product-option:hover { border-color: var(--color-border-strong); }

/* 고른 줄을 테두리로 알린다. :has 를 못 읽는 브라우저에서는 라디오 점으로만 보이는데,
   그래도 <고를 수 있다>는 사실은 그대로라 기능이 깨지지 않는다. */
.product-option:has(input:checked) {
    border-color: var(--color-primary-dark);
    border-width: 2px;
    padding: calc(var(--space-3) - 1px) calc(var(--space-4) - 1px);
}

.product-option:has(input:focus-visible) {
    outline: 3px solid var(--color-focus, #1F5FA9);
    outline-offset: 2px;
}

.product-option__name { flex: 1 1 auto; font-weight: 600; }
.product-option__price { font-weight: 700; font-variant-numeric: tabular-nums; }
.product-option__note { color: var(--color-text-muted); font-size: var(--font-size-sm); }

.product-option--out {
    background: var(--color-tint);
    color: var(--color-text-muted);
    cursor: not-allowed;
}
.product-option--out .product-option__price { text-decoration: line-through; }

/* 값 범위 한 줄. 대표값만 찍으면 19,000원을 보고 들어온 손님이 아래에서 45,000원을 만난다. */
.product-detail__range {
    margin: var(--space-2) 0 0;
    color: var(--color-text-muted);
    font-size: var(--font-size-md);
}

/* ==========================================================================
   상품 — 목업 테마 (2026-09-24)
   목업 165~187 · 1100~1138 행의 카드: 정사각 사진, 산지직송 딱지, 둥근 흰 카드, 빨강 값.
   분류 탭과 정렬은 원래 알약 모양이라 토큰(빨강)만으로 목업과 같아졌다.
   ========================================================================== */

/* 이 화면의 검색칸은 휴대폰에서도 보인다(머리의 검색칸은 1024px 미만에서 숨는다). */
.header-search--page {
    display: flex;
    max-width: 36rem;
    margin-bottom: var(--space-5);
}

.product-list__query {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--space-2);
    margin: 0 0 var(--space-4);
    font-size: var(--font-size-base);
}

.product-list__query strong {
    color: var(--color-primary-dark);
}

.product-list__query a {
    /* 누르는 자리 29px → 45px. 음수 여백으로 줄 높이는 그대로 둔다. */
    padding-block: 8px;
    margin-block: -8px;
    margin-left: var(--space-2);
    color: var(--color-text-muted);
    text-decoration: underline;
}

.product-grid .product-card {
    position: relative;
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm);
    transition: box-shadow var(--transition), transform var(--transition);
}

.product-grid .product-card:hover {
    box-shadow: var(--shadow);
}

.product-grid .product-card__media {
    display: block;
    aspect-ratio: 1 / 1;
    overflow: hidden;
    background: #f3f4f6;
}

.product-grid .product-card__media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform .3s ease;
}

.product-grid .product-card:hover .product-card__media img {
    transform: scale(1.04);
}

.product-card__origin {
    position: absolute;
    top: var(--space-3);
    left: var(--space-3);
    z-index: 1;
    padding: 4px 12px;
    border-radius: var(--radius-pill);
    background: var(--color-primary);
    color: #fff;
    font-size: var(--font-size-xs);
    font-weight: 700;
    box-shadow: var(--shadow-sm);
}

.product-grid .product-card__sale-price {
    color: var(--color-primary);
}

.product-card__preorder {
    border-radius: var(--radius-pill);
}

@media (prefers-reduced-motion: reduce) {
    .product-grid .product-card__media img {
        transition: none;
    }

    .product-grid .product-card:hover .product-card__media img {
        transform: none;
    }
}

/* 1024px 이상에서는 머리의 검색칸이 보이므로 이 화면의 검색칸은 한 번만 보이게 감춘다. */
@media (min-width: 1024px) {
    .header-search--page {
        display: none;
    }
}

/* ==========================================================================
   상품 상세 — 목업 테마 (2026-09-24)
   목업에는 상세 화면이 없다. 목업 카드와 같은 말투로 맞춘다: 둥근 사진, 빨강 값, 흰 카드 구매칸, 고르는 카드 규격.
   ========================================================================== */

.product-detail__media,
.product-detail__media img {
    border-radius: var(--radius-lg);
}

.product-detail__media {
    overflow: hidden;
    box-shadow: var(--shadow);
}

.product-detail__thumb {
    border-radius: var(--radius);
}

.product-detail__category {
    display: inline-flex;
    align-items: center;
    padding: 4px 12px;
    border-radius: var(--radius-pill);
    background: var(--color-primary-light);
    color: var(--color-primary-dark);
    font-weight: 700;
}

.product-detail__name {
    font-weight: 800;
    letter-spacing: -0.03em;
}

.product-detail__price {
    color: var(--color-primary);
}

/* 규격 값은 본문 크기라 큰 글자 기준(3:1)을 못 쓴다. 고른 줄의 옅은 빨강 바탕 위에서 주색은 4.41 — AA 에 못 미쳤다.
   한 단계 진한 빨강(흰 바탕 6.47)으로 둔다. */
.product-option__price {
    color: var(--color-primary-dark);
}

.product-buy {
    padding: var(--space-5);
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow);
}

.product-option {
    border-radius: var(--radius);
}

.product-option:has(input:checked) {
    background: var(--color-primary-light);
    border-color: var(--color-primary);
}

/* 아래 정보 탭: 알약 */
.product-tabs2__link {
    border-radius: var(--radius-pill);
}

.product-panel {
    border-radius: var(--radius-lg);
}

@media (min-width: 1024px) {
    .product-grid {
        gap: 28px;
    }

    .product-detail {
        column-gap: clamp(32px, 3vw, 56px);
    }
}
