@charset "UTF-8";
/* ==========================================================================
   장바구니 페이지 (/cart) - site.css 이후에 로드된다
   모바일: 카드 스택 / 640px 이상: 테이블
   ========================================================================== */

/* --------------------------------------------------------------------------
   flash 메시지
   -------------------------------------------------------------------------- */
.cart-message {
    margin: 0 0 var(--space-4);
    padding: var(--space-3) var(--space-4);
    background: var(--color-primary-light);
    border: 1px solid #fecaca;
    border-left: 4px solid var(--color-primary);
    border-radius: var(--radius-sm);
    color: var(--color-primary-dark);
    font-size: var(--font-size-sm);
    font-weight: 700;
}

/* --------------------------------------------------------------------------
   목록 (모바일 = 카드 스택)
   -------------------------------------------------------------------------- */
.cart-table {
    display: block;
    width: 100%;
    border-collapse: collapse;
    background: transparent;
}

.cart-table colgroup,
.cart-table thead {
    display: none;
}

.cart-table tbody {
    display: block;
}

.cart-row {
    display: grid;
    grid-template-columns: 1fr auto;
    grid-template-areas:
        "product product"
        "qty     amount"
        "remove  remove";
    gap: var(--space-3);
    margin-bottom: var(--space-3);
    padding: var(--space-4);
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius);
    box-shadow: var(--shadow-sm);
}

/* site.css 의 .table td 규칙(패딩/보더) 무력화 */
.cart-table td {
    display: block;
    padding: 0;
    border-bottom: 0;
}

.cart-table tbody tr:hover {
    background: var(--color-surface);
}

.cart-row__product {
    grid-area: product;
}

.cart-row__qty {
    grid-area: qty;
}

.cart-row__amount {
    grid-area: amount;
}

/*
  수량을 바꿔 서버에 물어보는 동안의 줄.

  ★ 아주 옅게만 흐린다(0.55). 금액이 <지금 바뀌는 중>이라는 신호는 필요하지만,
    글자를 못 읽을 만큼 흐리면 어르신은 화면이 고장 난 줄 안다.
  ★★ 왕복은 보통 한 순간이라 보이지도 않는다. 이 규칙이 일하는 때는 회선이 느린 경우뿐이고,
    그때가 바로 신호가 있어야 하는 때다.
*/
.cart-row.is-updating .cart-row__amount {
    opacity: .55;
    transition: opacity var(--transition);
}

/*
  ★ 여기서 버튼을 막지 않는다. 한때 pointer-events:none 을 걸었다가 뺐다 —
    회선이 느릴 때 손님이 + 를 눌러도 반응이 없는 구간이 생기고,
    그건 지금 고치려는 증상("눌렀는데 아무 일도 안 일어난다")과 똑같이 보인다.
    겹친 요청은 스크립트가 순번으로 정리한다(늦게 온 옛 응답을 버린다).
*/

/* site.css 의 `.table th, .table td { text-align: left }`(0-1-1) 를 이기려면 0-1-2 이상이어야 한다.
   합계 박스(.cart-summary)가 금액을 오른쪽 정렬하므로 표의 금액 열도 맞춘다. */
.cart-table td.cart-row__amount,
.cart-table th.cart-table__th-amount {
    text-align: right;
}

.cart-row__remove {
    grid-area: remove;
    justify-self: end;
}

/* 모바일 전용 항목 라벨 */
.cart-row__qty::before,
.cart-row__amount::before {
    content: attr(data-label);
    display: block;
    margin-bottom: var(--space-1);
    color: var(--color-text-muted);
    font-size: var(--font-size-xs);
    font-weight: 400;
}

/* --------------------------------------------------------------------------
   상품 셀
   -------------------------------------------------------------------------- */
.cart-row__product-inner {
    display: flex;
    align-items: flex-start;
    gap: var(--space-3);
    min-width: 0;
}

.cart-row__thumb {
    flex: 0 0 72px;
    width: 72px;
    display: block;
    overflow: hidden;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    background: var(--color-tint);
}

.cart-row__thumb img {
    display: block;
    width: 100%;
    height: auto;
    aspect-ratio: 4 / 3;
    object-fit: cover;
}

.cart-row__info {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: var(--space-1);
    min-width: 0;
}

.cart-row__name {
    /* 누르는 자리를 위아래로 넓힌다(23px → 45px). 음수 여백으로 되돌려 줄 간격은 그대로다. */
    display: inline-block;
    padding-block: 11px;
    margin-block: -11px;
    color: var(--color-text);
    font-size: var(--font-size-base);
    font-weight: 700;
    line-height: var(--line-height-tight);
    text-decoration: none;
}

.cart-row__name:hover,
.cart-row__name:focus-visible {
    color: var(--color-primary);
    text-decoration: underline;
}

.cart-row__meta {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-2);
    color: var(--color-text-muted);
    font-size: var(--font-size-xs);
}

/* 담은 뒤 품절로 바뀐 상품 표시.
   서리빛 계열 회색이다. 예전 값(#efedea / #ddd8d0)은 따뜻한 크림이라
   찬 바닥 위에서 혼자 노랗게 떴다. */
.badge--soldout {
    background: #E6E8E4;
    border-color: #CFD3CB;
    color: var(--color-danger);
}

/* --------------------------------------------------------------------------
   수량 스테퍼
   -------------------------------------------------------------------------- */
.qty-stepper {
    display: inline-flex;
    align-items: center;
    gap: var(--space-1);
    flex-wrap: wrap;
}

.qty-stepper__btn {
    width: 36px;
    height: 36px;
    padding: 0;
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    color: var(--color-text);
    font-family: inherit;
    font-size: var(--font-size-md);
    line-height: 1;
    cursor: pointer;
    transition: border-color var(--transition), color var(--transition);
}

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

.qty-stepper__input {
    width: 56px;
    height: 36px;
    padding: 0 var(--space-1);
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    color: var(--color-text);
    font-family: inherit;
    font-size: var(--font-size-base);
    text-align: center;
    -moz-appearance: textfield;
    appearance: textfield;
}

.qty-stepper__input::-webkit-outer-spin-button,
.qty-stepper__input::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

.qty-stepper__input:focus {
    border-color: var(--color-primary);
}

/* JS 가 동작하면 +/- 로 자동 제출되므로 '변경' 버튼은 감춘다 */
.qty-stepper[data-js="on"] .qty-stepper__apply {
    display: none;
}

/* --------------------------------------------------------------------------
   금액 / 삭제
   -------------------------------------------------------------------------- */
.cart-row__amount {
    color: var(--color-accent);
    font-size: var(--font-size-md);
    font-weight: 700;
    white-space: nowrap;
}

/*
  ★ 32px 이었다. 장바구니에서 줄을 지우는 버튼이다.
    작으면 헛누름이 쌓이고, 헛누름이 쌓이면 결국 <엉뚱한 줄>을 지우게 된다.
    --tap-min 을 지키되 글자와 좌우 여백은 작게 둬서 보조 동작으로 읽히게 한다.
*/
.cart-row__remove-btn {
    min-height: var(--tap-min);
    padding: var(--space-1) var(--space-3);
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    color: var(--color-text-muted);
    font-family: inherit;
    font-size: var(--font-size-xs);
    cursor: pointer;
    transition: border-color var(--transition), color var(--transition);
}

.cart-row__remove-btn:hover,
.cart-row__remove-btn:focus-visible {
    border-color: var(--color-danger);
    color: var(--color-danger);
}

/* --------------------------------------------------------------------------
   합계 박스
   -------------------------------------------------------------------------- */
.cart-summary {
    margin-top: var(--space-6);
    padding: var(--space-5);
    background: var(--color-tint);
    border: 1px solid var(--color-border);
    border-radius: var(--radius);
}

.cart-summary__list {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    margin: 0;
}

.cart-summary__row {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--space-4);
}

.cart-summary__row dt {
    color: var(--color-text-muted);
    font-size: var(--font-size-sm);
}

.cart-summary__row dd {
    margin: 0;
    font-weight: 700;
    white-space: nowrap;
}

.cart-summary__row--total {
    margin-top: var(--space-2);
    padding-top: var(--space-3);
    border-top: 1px solid var(--color-border);
}

.cart-summary__row--total dt {
    color: var(--color-text);
    font-size: var(--font-size-md);
    font-weight: 700;
}

.cart-summary__row--total dd {
    color: var(--color-accent);
    font-size: var(--font-size-xl);
}

.cart-summary__note {
    margin-top: var(--space-3);
    color: var(--color-text-muted);
    font-size: var(--font-size-xs);
}

.cart-summary__note--strong {
    margin-top: var(--space-1);
    color: var(--color-primary);
    font-weight: 700;
}

.cart-actions {
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
    margin-top: var(--space-5);
}

.cart-actions__sub {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: var(--space-2);
}

/* --------------------------------------------------------------------------
   640px 이상: 테이블 레이아웃으로 전환
   -------------------------------------------------------------------------- */
@media (min-width: 640px) {
    .cart-table {
        display: table;
        table-layout: fixed;
        background: var(--color-surface);
        border-top: 2px solid var(--color-primary);
    }

    .cart-table colgroup {
        display: table-column-group;
    }

    .cart-table thead {
        display: table-header-group;
    }

    .cart-table tbody {
        display: table-row-group;
    }

    .cart-table__col-qty {
        width: 160px;
    }

    .cart-table__col-amount {
        width: 120px;
    }

    .cart-table__col-remove {
        width: 80px;
    }

    .cart-row {
        display: table-row;
        margin: 0;
        padding: 0;
        background: transparent;
        border: 0;
        border-radius: 0;
        box-shadow: none;
    }

    .cart-table td {
        display: table-cell;
        padding: var(--space-4) var(--space-2);
        border-bottom: 1px solid var(--color-border);
        vertical-align: middle;
    }

    .cart-table tbody tr:hover {
        background: var(--color-bg);
    }

    .cart-row__qty::before,
    .cart-row__amount::before {
        content: none;
    }

    /* 좁은 폭에서도 스테퍼가 한 줄에 들어가도록 축소 */
    .qty-stepper__btn {
        width: 32px;
        height: 32px;
    }

    .qty-stepper__input {
        width: 48px;
        height: 32px;
    }

    .cart-row__thumb {
        flex: 0 0 64px;
        width: 64px;
    }

    .cart-summary {
        max-width: 420px;
        margin-left: auto;
    }
}

/* --------------------------------------------------------------------------
   1024px 이상
   -------------------------------------------------------------------------- */
@media (min-width: 1024px) {
    .cart-table__col-qty {
        width: 180px;
    }

    .cart-table__col-amount {
        width: 140px;
    }

    .cart-table td {
        padding: var(--space-4) var(--space-3);
    }

    .qty-stepper__btn {
        width: 36px;
        height: 36px;
    }

    .qty-stepper__input {
        width: 56px;
        height: 36px;
    }

    .cart-row__thumb {
        flex: 0 0 80px;
        width: 80px;
    }
}

/* 담을 수 있는 수가 재고 때문에 줄었을 때, 그 줄에 적어 주는 값.
   ★ 경고색을 쓰지 않는다. 잘못한 것이 아니라 <남은 수가 그만큼> 이라는 사실일 뿐이다.
     빨갛게 칠하면 손님은 담는 것을 멈칫한다. */
.cart-row__limit {
    font-weight: 700;
    color: var(--color-text);
}

/* ==========================================================================
   장바구니 — 목업 테마 (2026-09-24)

   목업 390~418 · 1232~1247 행: 상품마다 둥근 카드 한 장(사진 · 이름 · 규격 · 빨강 금액 · 수량 · 삭제),
   아래에 합계 상자와 큰 빨강 '주문하기'. 예전에는 640px 이상에서 표로 바뀌었는데, 이제 어느 폭에서든 카드다.

   ★ 수량 단추는 목업(24px)보다 크게 둔다(44px). 손끝이 무딘 분이 − 를 누르려다 삭제를 누르는 일이 없게.
   ★★ 삭제는 아이콘만 두지 않고 글자를 함께 둔다. 휴지통 그림만으로는 무엇을 하는지 모르는 분이 있다.
   ========================================================================== */

.qty-stepper__btn,
.qty-stepper__input {
    height: 44px;
}

.qty-stepper__btn {
    width: 44px;
    border-radius: var(--radius-sm);
    font-size: var(--font-size-md);
    font-weight: 700;
}

.qty-stepper__input {
    width: 56px;
    border-radius: var(--radius-sm);
}

.cart-row__remove-btn {
    display: inline-flex;
    align-items: center;
    gap: 6px;
}

.cart-row__remove-btn .icon {
    width: 1.1em;
    height: 1.1em;
}

.cart-row__amount {
    color: var(--color-primary);
}

.cart-row__thumb img {
    border-radius: var(--radius);
}

@media (min-width: 640px) {
    .cart-table {
        display: block;
        background: transparent;
        border-top: 0;
    }

    .cart-table colgroup,
    .cart-table thead {
        display: none;
    }

    .cart-table tbody {
        display: grid;
        gap: var(--space-3);
    }

    .cart-row {
        display: grid;
        grid-template-columns: minmax(0, 1fr) auto 8.5rem auto;
        grid-template-areas: "product qty amount remove";
        align-items: center;
        gap: var(--space-4);
        margin: 0;
        padding: var(--space-4) var(--space-5);
        background: var(--color-surface);
        border: 1px solid var(--color-border);
        border-radius: var(--radius-lg);
        box-shadow: var(--shadow-sm);
    }

    .cart-table td {
        display: block;
        padding: 0;
        border: 0;
    }

    .cart-table tbody tr:hover {
        background: var(--color-surface);
        box-shadow: var(--shadow);
    }

    .qty-stepper__btn,
    .qty-stepper__input {
        height: 44px;
    }

    .qty-stepper__btn {
        width: 44px;
    }

    .qty-stepper__input {
        width: 56px;
    }
}

/* 합계: 흰 카드 + 빨강 결제금액 */
.cart-summary {
    padding: var(--space-5);
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow);
}

.cart-summary__row--total dd {
    color: var(--color-primary);
}

.cart-actions .btn--accent {
    min-height: 56px;
    font-size: var(--font-size-md);
    box-shadow: var(--shadow);
}

.cart-actions .btn--accent .icon {
    width: 1em;
    height: 1em;
}
