/* 상품목록(product/list.html) 브랜드 디자인 재구축(2026-08-06) — 홈페이지 WEEKLY BEST 카드
   (best-items.css의 .bi-item/.bi-thumb/.bi-price/.bi-badge)와 동일한 시각 언어를 재사용하고,
   그 위에 이 페이지 전용 레이아웃(그리드/섹션 헤더/카운트+정렬바)만 얹는다. 벤치마크
   (ecudemo398355.cafe24.com/category/스킨케어/69/, EVERIN)는 카테고리 필터 pill·BEST 캐러셀·
   4단 그리드·할인율+가격 표기 구조를 참고했고, 색/폰트/카드 톤은 SOYONE 자체 것을 그대로 쓴다. */

/* 상품검색(product/search.html) 카드 그리드 재구축(2026-08-06 추가) — 클래스명(.pl-thumb/.pl-info/
   .bi-price/.bi-badge/.prdList.grid4)을 list.html과 동일하게 써서 이 파일을 그대로 재사용한다
   (search_ListItem도 local_server.js 가격서브루프에서 product_ListItem과 동일 처리됨, 데이터 구조
   동일 확인). 검색폼/검색옵션 레이어/검색조건 태그(searchdata.css)는 이번 범위 밖(스톡 유지).

/* 상품상세(.xans-product-detail, G51)와 동일한 좌우 여백 — 게시판(2026-08-06 밤)에 이어
   상품목록도 이 규칙이 없어 콘텐츠가 뷰포트 끝까지 붙어 보이던 것(실측 발견). */
.xans-product-menupackage,
.pl-section,
.xans-product-normalpaging,
.xans-search-paging {
    width: 94%;
    max-width: var(--ml-max-width);
    margin: 0 auto;
}

.pl-title-area { text-align: center; padding: 40px 0 20px; }
.pl-title-area h2 { font-size: 28px; font-weight: 900; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ml-fg); }
/* {$title_text_or_image}가 빈 카테고리(예: cate_no=24)는 <h2></h2>만 남아 패딩(60px)이 텅 빈
   공백으로 보이던 문제(2026-08-18 실측, "상단과 목록 사이 공백은 뭐야?" 지적) — 제목이 없으면
   이 영역 자체를 접는다. */
.pl-title-area:has(h2:empty) { display: none; }

.pl-section { padding: 30px 0; }
.pl-section-head { margin-bottom: 24px; }
.pl-section-head h3 { font-size: 20px; font-weight: 800; color: var(--ml-fg); }

/* 그리드 — 스톡 ec-base-product.css의 `.prdList{font-size:0;line-height:0;min-width:756px;
   margin:-20px 0 0}`가 이 div에도 그대로 걸려 있어, line-height:0이 하위 텍스트에 상속되며
   상품명/가격 줄이 높이 0으로 찌그러져 다음 요소와 겹쳐 보이던 버그(2026-08-06 실측 발견,
   getBoundingClientRect로 height:0 확인) — 전부 명시적으로 재정의해 상속을 끊는다.
   🔴→✅ 2026-08-12 재정정: 아래 두 규칙 다 애초에 "특이도로 이긴다"는 이전 코멘트 자체가
   계산 오류였다 — `.ec-base-product .prdList`(클래스 2개)와 `.prdList.grid4`(클래스 2개)는
   특이도가 정확히 동일(0,2,0)하고, `.ec-base-product ul.grid4 > li`(엘리먼트 2+클래스 2)와
   `ul.prdList.grid4 > li`(엘리먼트 2+클래스 2)도 동일(0,2,2)하다. 카페24 실제 라이브 번들
   (`optimizer_user.php`)을 직접 떠보니 스톡 규칙이 우리 규칙보다 **파일 안에서 더 뒤쪽**에
   위치해(오프셋 실측 확인) 동일 특이도 상황에서 소스 순서로 스톡이 이겨버린다 — 카드가
   컬럼폭의 25%로 찌그러지고 배지 높이가 4px로 뭉개지는 게 라이브에서 실제로 계속 재현됐다
   (2026-08-12, 사용자가 실측 스크린샷으로 재지적). G56과 동일한 근본원인(동일 특이도 + 소스
   순서 통제 불가) — `!important`로 단조 강제한다. */
.prdList.grid4 {
    display: grid !important;
    grid-template-columns: repeat(4, 1fr) !important;
    gap: 32px 20px !important;
    list-style: none;
    width: auto !important;
    min-width: 0 !important;
    margin: 0 !important;
    font-size: 16px !important;
    line-height: normal !important;
}
.prdList.grid4 > li,
ul.prdList.grid4 > li {
    list-style: none; width: auto !important; margin: 0 !important; display: block !important;
    /* 🔴→✅(2026-08-18) 2열 폭이 242px/98.5px처럼 불균등하게 갈라지던 버그. `repeat(2,1fr)`의
       fr 트랙은 기본적으로 `minmax(auto,1fr)`로 계산되는데, `auto` 최소값은 그리드 아이템의
       min-content(내용물이 줄어들 수 있는 최소 너비)를 그대로 반영한다. `.pl-info .name`에
       걸어둔 white-space:nowrap이 제목을 한 줄로 유지하려고 min-content를 "줄바꿈 없는 전체
       글자폭"으로 부풀렸고(예: "GOLD ELEMENTS 인텐시브 클렌징 토너 듀오"), text-overflow:ellipsis는
       화면에 보이는 모양만 잘라줄 뿐 이 min-content 계산엔 전혀 영향을 안 준다 — 그 결과 이
       제목이 있는 열만 트랙이 넓어지고 반대 열이 좁아지는 실측 확인(실기기 380px 스크린샷).
       그리드 아이템에 min-width:0을 명시해 min-content 전파를 끊는다(flex/grid의
       고전적인 "min-width:auto" 함정, 표준 해법). */
    min-width: 0 !important;
}

/* 카드 — .bi-item(best-items.css)과 동일한 톤, 슬라이드 트랙이 아니라 그리드라 폭 계산만 다름 */
.pl-link { display: block; color: inherit; text-decoration: none; }
.pl-thumb {
    position: relative;
    border-radius: 12px;
    overflow: hidden;
    background: #f8f8f8;
    aspect-ratio: 1 / 1.1;
    margin-bottom: 16px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.pl-thumb img { max-width: 78%; max-height: 78%; width: auto; height: auto; object-fit: contain; transition: 0.5s cubic-bezier(0.165, 0.84, 0.44, 1); }
.pl-link:hover .pl-thumb img { transform: scale(1.06); }

.pl-thumb .bi-badge { position: absolute; top: 12px; left: 12px; }
.pl-thumb .bi-badge.new { top: 12px; left: 12px; }
.pl-thumb .bi-badge.best ~ .bi-badge.new { left: auto; top: 12px; right: 12px; }

.pl-info { text-align: left; }
.pl-info .name {
    display: block;
    font-size: 15px;
    line-height: 1.4;
    font-weight: 600;
    color: #111;
    margin-bottom: 8px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* 판매가/할인율 — 🔴→✅(2026-08-18) 위 코멘트의 "li 1~2개가 ul 하나에 들어간다"는 가정이
   실측과 달랐다: 상품에 "요약설명"(simple_desc)이 등록돼 있으면 카페24가 `.pl-info` 안에
   `<ul class="bi-price">`를 요약설명용 1개 + 가격용 1개(할인 상품은 할인정보+할인가까지 더해
   총 4개)로 따로 내려준다. 게다가 **할인 상품은 `<a class="pl-link">`이 이름+요약설명+정가
   ul까지만 감싸고 중간에 닫힌 뒤 할인정보/할인가 ul이 `.pl-info`의 직속 형제로 남는 깨진 중첩
   구조**라, `.pl-info > ul:first-of-type` 같은 순수 CSS 선택자로는 요약설명 ul의 중첩 깊이가
   상품마다 달라 안정적으로 못 잡는다 — 요약설명 숨김은 `list.html`의 인라인 스크립트(JS)로
   처리한다("원" 문자가 없는 첫 `.bi-price`를 숨김, 할인정보 안내 ul은 이미 원래 UI라 그대로 둠). */
.bi-price { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; font-size: 16px; line-height: 1.4; }
.bi-price li { list-style: none; }
.bi-price li:only-child { font-size: 17px; font-weight: 900; color: var(--ml-fg); }
.bi-price li:first-child:not(:only-child) { font-size: 13px; font-weight: 800; color: var(--ml-accent); }
.bi-price li:last-child:not(:only-child) { font-size: 17px; font-weight: 900; color: var(--ml-fg); }

/* 카운트 + 정렬 바 */
.xans-product-normalmenu .function {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 16px 0;
    margin-bottom: 24px;
    border-top: 1px solid var(--ml-border);
    border-bottom: 1px solid var(--ml-border);
}
.xans-product-normalmenu .prdCount { font-size: 13px; color: var(--ml-muted); white-space: nowrap; flex-shrink: 0; }
.xans-product-normalmenu .prdCount strong { color: var(--ml-fg); font-weight: 800; }

/* 정렬 토글(2026-08-18) — 링크 6개를 한 줄에 늘어놓던 것을 버튼+드롭다운 패널로 전환.
   ul#type 내부(li/a)는 카페24 product_Orderby 모듈이 실제 정렬 옵션 개수만큼 채우는
   영역이라 그대로 두고, 바깥에 토글 버튼과 포지셔닝 래퍼만 추가한다. */
.pl-sort { position: relative; flex-shrink: 0; }
.pl-sort-btn {
    display: flex; align-items: center; gap: 6px;
    font-size: 13px; color: var(--ml-fg); background: none; border: 1px solid var(--ml-border);
    border-radius: 999px; padding: 8px 14px; cursor: pointer; white-space: nowrap;
}
.pl-sort-btn svg { transition: transform 0.2s ease; }
.pl-sort.is-open .pl-sort-btn svg { transform: rotate(180deg); }
.xans-product-normalmenu .pl-sort ul#type {
    display: none; flex-direction: column; flex-wrap: nowrap; gap: 0;
    position: absolute; top: calc(100% + 8px); right: 0; z-index: 20;
    min-width: 140px; background: #fff; border: 1px solid var(--ml-border); border-radius: 12px;
    padding: 6px; box-shadow: 0 8px 24px rgba(0,0,0,0.08);
}
.pl-sort.is-open ul#type { display: flex; }
.xans-product-normalmenu ul#type li { list-style: none; }
.xans-product-normalmenu ul#type li a {
    display: block; font-size: 13px; color: var(--ml-muted); text-decoration: none;
    white-space: nowrap; padding: 8px 10px; border-radius: 8px;
}
.xans-product-normalmenu ul#type li a:hover { color: var(--ml-fg); background: var(--ml-bg-soft, #f7f7f7); }

.noData { padding: 80px 0; text-align: center; color: var(--ml-muted); font-size: 14px; }

/* 페이지네이션 아이콘 세로쌓임 수정은 layout/basic/css/ec-base-paginate.css로 이동(2026-08-06,
   product/search.html도 같은 버그를 겪어 이 컴포넌트의 진짜 소유 파일로 옮김 — 이 페이지 전용
   listnormal.css에만 있으면 search.html엔 적용이 안 됨). */

@media (max-width: 768px) {
    /* 2026-08-12 커밋(0265942)이 데스크톱 라이브 번들 특이도 문제를 고치려고 위 기본 규칙에
       !important를 붙이면서, !important는 미디어쿼리 여부와 무관하게 항상 이기기 때문에 이
       모바일 2열 규칙이 무효화되어 모바일에서도 4열이 강제되던 회귀 버그(2026-08-18 실측
       발견 — 카드가 가로로 넘쳐 3번째 카드가 화면 밖으로 잘림). 이 규칙도 !important로
       맞춰야 실제로 적용된다. */
    .prdList.grid4 { grid-template-columns: repeat(2, 1fr) !important; gap: 24px 12px !important; }
    .pl-title-area h2 { font-size: 22px; }
}

/* 🔴→✅(2026-08-18) 1열 전환 브레이크포인트를 560px→360px로 재수정. 사용자 지정으로 560px를
   썼다가 "같은 해상도에서 벤치마크는 2열인데 우리는 1열"이라는 실측 재지적을 받아, 벤치마크
   (ecudemo398355)를 320~600px 전 구간 1px 단위 아닌 20px 간격으로 재실측(Playwright
   getComputedStyle) — 361px까지 2열, 360px에서 1열로 전환되는 걸 재확인(§80 최초 조사와 동일
   결론). 560px는 이 재실측 이전의 눈대중값이었던 것으로 정정, 벤치마크 실측값 360px로 되돌림. */
@media (max-width: 360px) {
    .prdList.grid4 { grid-template-columns: 1fr !important; }
}
