
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
input, textarea { font: inherit; letter-spacing: inherit; }
button { font: inherit; letter-spacing: inherit; color: inherit; cursor: pointer; }
a { color: inherit; text-decoration: none; }
.boot { min-height: 100vh; display: grid; place-items: center; font: 600 13px/1 Inter, Arial, sans-serif; letter-spacing: .09em; }

.brand b { display: grid; place-items: center; font-weight: 500; letter-spacing: 0; }
.nav a:hover, .nav a.active { color: var(--ink); }


/* Home */
.search { position: relative; width: 100%; }
.search-icon {
  position: absolute; left: 14px; top: 50%; width: 13px; height: 13px;
  border: 1.5px solid var(--muted); border-radius: 50%; transform: translateY(-55%); pointer-events: none;
}
.search-icon::after { content: ""; position: absolute; width: 5px; height: 1.5px; right: -4px; bottom: -2px; background: var(--muted); transform: rotate(45deg); transform-origin: left center; }
.search input {
  width: 100%; height: 42px; padding: 0 14px 0 40px; border: 1px solid var(--line); border-radius: var(--radius); outline: none;
   color: var(--ink); font-size: 12.5px; transition: border-color .15s ease, background .15s ease;
}
.search input:focus { border-color: var(--accent); background: #fff; }
.search-large .search-icon::after { width: 8px; right: -7px; bottom: -3px; background: var(--ink); }
.brief-trigger { width: 100%; padding: 0 1px; display: flex; align-items: center; justify-content: space-between; font: 560 10px/1 Inter, sans-serif; text-transform: uppercase; }
.brief-trigger span::after { content: " / NATURAL LANGUAGE"; color: var(--faint); font-weight: 450; }
.brief-trigger i { display: grid; place-items: center; font-style: normal; font-weight: 350; }
.brief-panel textarea:focus { border-color: var(--accent); }


.index-rail {
  position: relative;


  display: flex;
  flex-direction: column;

}
.index-rail > * { position: relative; z-index: 1; }


.simple-head { display: flex; align-items: center; justify-content: space-between; gap: 20px; }

.simple-head a, .text-action { padding: 0 0 3px; border: 0; border-bottom: 1px solid var(--ink); background: transparent; color: var(--ink); font: 500 9px/1 Inter, sans-serif; }
.simple-head a:hover, .text-action:hover { color: var(--accent); border-color: var(--accent); }
/* COMPARE_CLEAR_V1 — 제목줄에 셋째 요소(Clear all)가 오면 space-between 이 개수를
   한가운데로 밀어냅니다. margin-left:auto 로 남는 공간을 여기서 흡수해
   개수와 버튼이 오른쪽에 붙게 합니다. 자식이 둘일 때는 결과가 같습니다. */
.page-title-row > span { margin-left: auto; color: var(--faint); font: 500 8.5px/1 Inter, sans-serif; letter-spacing: .08em; }

/* Cards */
.card:hover .material-image, .card:hover .material-fallback { transform: scale(1.03); }
.card:hover .card-actions { opacity: 1; }


/* Explore */
.page-title-row { min-height: 62px; display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 54px 0 16px; }
/* top: 62px 은 헤더 높이(65px)보다 3px 작다. 일부러 그렇다 — 정확히 65px 로 맞추면
   배율이 소수인 화면에서 헤더와 툴바 사이에 1px 틈이 벌어지고 그 사이로 스크롤되는
   내용이 비친다. 3px 밀어 넣어 헤더가 덮게 둔다. 640px 이하는 58 / 헤더 59.
   backdrop-filter 는 아래 .filter-menu 의 위치 기준이기도 하다. 지우지 말 것. */
.filters { display: flex; gap: 5px; }
.filter { position: relative; }
.filter > button { height: 37px; padding: 0 10px; display: flex; align-items: center; gap: 7px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface); color: #5d6158; font: 500 9px/1 Inter, sans-serif; }
.chevron { width: 5px; height: 5px; border-right: 1px solid currentColor; border-bottom: 1px solid currentColor; transform: rotate(45deg) translateY(-2px); }
/* 640px 이하에서 이 메뉴는 position: fixed 가 되는데(395행 미디어쿼리),
   좌표는 화면이 아니라 .explore-toolbar 기준으로 풀린다. 툴바의
   backdrop-filter: blur(16px) 이 고정 위치의 기준 상자를 만들기 때문이다.
   그래서 top: 109px 은 '화면 위에서 109px' 이 아니라 '툴바 위에서 109px' 이고,
   결과적으로 버튼 아래 11px 에 안정적으로 붙는다 (스크롤해도 안 움직인다).
   툴바의 blur 를 지우면 이 메뉴가 화면 기준으로 튄다. 같이 봐야 한다. */
.filter.open .filter-menu { display: block; }
.filter-option { width: 100%; padding: 8px 7px; border: 0; border-radius: 3px; display: flex; align-items: center; gap: 9px; background: transparent; text-align: left; font: 450 9.5px/1.3 Inter, "Pretendard Variable", sans-serif; }
.check { width: 11px; height: 11px; border: 1px solid var(--line-dark); border-radius: 1px; }
.clear-btn { height: 37px; padding: 0 5px; border: 0; background: transparent; color: var(--muted); font: 450 9px/1 Inter, sans-serif; }
.active-chips { display: flex; flex-wrap: wrap; gap: 6px; padding: 13px 0 0; }
.active-chips button { padding: 5px 8px; border: 1px solid var(--line); border-radius: 999px; background: transparent; color: #5e6259; font-size: 9px; }
.result-meta { padding: 17px 0 13px; color: var(--faint); font: 450 9px/1 Inter, sans-serif; }
.result-meta strong { color: var(--ink); font-weight: 550; }

/* Detail */
.breadcrumb { padding: 31px 0 17px; display: flex; gap: 8px; color: var(--faint); font: 450 9px/1 Inter, sans-serif; }
.breadcrumb a { color: var(--muted); }
.detail-grid { display: grid; grid-template-columns: minmax(0, 1.18fr) minmax(390px, .82fr); gap: 58px; align-items: start; padding-bottom: 68px; }
.detail-media-wrap { position: sticky; top: 94px; }


.detail-side { padding-top: 3px; }
.detail-family { margin: 0 0 12px; color: var(--muted); font: 520 9px/1 Inter, sans-serif; text-transform: uppercase; letter-spacing: .07em; }
.detail-heading h1 { margin: 0; font: 500 clamp(30px, 3vw, 47px)/1.07 Inter, "Pretendard Variable", sans-serif; letter-spacing: -.05em; }
.detail-ko { margin: 8px 0 0; color: var(--muted); font-size: 12.5px; }
.detail-actions { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 25px; }
.btn { min-height: 37px; padding: 0 13px; border: 1px solid var(--ink); border-radius: var(--radius); background: var(--ink); color: #fff; display: inline-flex; align-items: center; justify-content: center; font: 500 9.5px/1 Inter, "Pretendard Variable", sans-serif; }
.btn.secondary { border-color: var(--line-dark); background: transparent; color: var(--ink); }
.btn.secondary:hover { background: var(--surface); }
.passport { position: relative; margin-top: 33px; border-top: 1px solid var(--ink); }
.passport > div { display: grid; grid-template-columns: 102px 1fr; gap: 16px; padding: 11px 0; border-bottom: 1px solid var(--line); }
.passport span { color: var(--muted); font: 450 9px/1.4 Inter, sans-serif; }
.passport strong { font-size: 10.5px; line-height: 1.55; font-weight: 500; }
.decision-block { margin-top: 30px; }
.decision-line { display: grid; grid-template-columns: 102px 1fr; gap: 16px; padding: 12px 0; border-top: 1px solid var(--line); }
.decision-line:last-child { border-bottom: 1px solid var(--line); }
.decision-line h2 { margin: 0; color: var(--muted); font: 500 9px/1.5 Inter, sans-serif; }
.decision-line ul { list-style: none; margin: 0; padding: 0; }
.decision-line li { display: inline; font-size: 10.5px; line-height: 1.68; }
.decision-line li:not(:last-child)::after { content: " · "; color: var(--faint); }
.decision-line.consider li { color: #62564d; }
/* 구분선이 가장 넓은 내용(Properties 표 1080px)에서 끝나게 한다.
   180 + 34(gap) + 1080 = 1294. 1330px 이하에서는 어차피 안 걸린다.
   이 값을 안 주면 1680px에서 선만 208px 더 나가 내용이 붕 떠 보인다. */
.detail-section { display: grid; grid-template-columns: 180px 1fr; gap: 34px; max-width: 1294px; padding: 32px 0; border-top: 1px solid var(--line); }
.detail-section h2 { margin: 0; font: 540 10px/1.4 Inter, sans-serif; letter-spacing: .02em; }
/* 폭만 넓히면 한 줄이 74자 → 87자가 된다. 글씨를 같이 키워야 줄 길이가 유지된다.
   810px/13.5px = 한 줄 약 78자. 근거·출처 목록과 오른쪽 끝(1113)이 맞는다. */
.detail-section > p { margin: 0; max-width: 810px; color: #5e6258; font-size: 13.5px; line-height: 1.85; }
/* 2열 표는 810px면 답답해서 /about과 같은 넓은 단(1080px)을 쓴다.
   1680px에서 1288px까지 늘어나 다른 블록과 오른쪽 끝이 크게 어긋나던 것을 줄인다. */
.data-list { display: grid; grid-template-columns: 1fr 1fr; gap: 0 34px; max-width: 1080px; }
.data-row { display: grid; grid-template-columns: 112px 1fr; gap: 14px; padding: 10px 0; border-top: 1px solid var(--line); font-size: 10px; }
.data-row:nth-child(-n+2) { border-top: 0; padding-top: 0; }
.data-row > span { color: var(--muted); font: 450 9px/1.5 Inter, sans-serif; }
/* 근거 목록 — 150px 라벨 + 20px gap + 640px 본문 = 810px. 본문 폭 기준은 design-rules 2항. */
.evidence-list { display: grid; max-width: 810px; }
.evidence-item { display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: 20px; align-items: start; padding: 12px 0; border-top: 1px solid var(--line); font-size: 10px; }
.evidence-item:first-child { border-top: 0; padding-top: 0; }
.evidence-item strong { font-weight: 520; line-height: 1.5; }
.evidence-item > div { line-height: 1.5; }
/* 근거 수준은 소재가 아니라 '그 출처'에 붙는 주석이다. 값 아래 출처 줄 맨 앞에 두어
   주장과 붙이고, 모든 행에서 같은 x에 놓여 세로로 스캔된다.
   오른쪽 끝 정렬(예전 auto 열)은 1680px에서 주장과 800px 떨어져 짝을 못 찾는다. */
.evidence-item small { display: flex; align-items: baseline; gap: 9px; margin-top: 5px; font-size: 8.5px; }
.evidence-source { color: var(--faint); }
.level {
  display: inline-block;
  flex: none;
  /* 가장 긴 라벨은 '제조사 표기' 5자. 한글 자소블록은 대개 1em 폭이라 8.5px×5 + 공백
     ≈ 45px. 내용 폭 54px(70 - 좌우 padding 14 - 테두리 2)이면 한글 advance가 1.2em인
     폰트에서도 안 넘칩니다. 폰트를 바꿔도 정렬이 흔들리지 않게 여유를 둔 값입니다. */
  min-width: 70px;
  padding: 2px 7px;
  border: 1px solid var(--line);
  border-radius: 2px; /* 알약(999px)은 인증 씰처럼 읽힌다. 문서 태그로 낮춘다. */

  font-size: 8.5px;
  font-weight: 450;
  line-height: 1.5;
  text-align: center;
  white-space: nowrap;
}
/* 4단계를 색 가짓수가 아니라 '채움 정도'로 구분한다. 색은 기존 --positive 계열 하나만.
   확인 전은 점선 — 테두리가 닫히지 않은 것이 곧 상태 표시다. */
.level.verified   { border-color: #b3c2b1; background: #e9efe6; color: #3f5544; font-weight: 550; }
.level.documented { border-color: #c4d0c5; background: transparent; color: #55684f; font-weight: 500; }
.level.claimed    { border-color: var(--line); background: transparent; color: var(--muted); }
.level.unknown    { border-style: dashed; border-color: var(--line-dark); background: transparent; color: var(--faint); }
/* LOG_V1 — 다섯 번째 라벨 `공공기관 발표`. 위 4단계와 **다른 축**이다:
   4단계는 소재에 관한 주장의 등급이고, 이건 발표된 사실이다. 그래서 --positive 계열
   눈금 안에 다섯 번째 칸을 만들지 않고 중립 채움으로 뺀다.
   라임(--signal)은 쓰지 않는다 — 뉴스레터 챗이 "라임 막대"를 요청했지만 라임은
   '확인된 것' 표식이고 근거 배지 체계는 처음부터 색 가짓수가 아니라 채움 정도로
   구분한다(위 주석). 여기에 라임을 넣으면 두 체계가 동시에 깨진다.
   읽을거리 본문에서만 쓴다. */
.level.official   { border-color: var(--line-dark); background: rgba(255, 255, 255, .72); color: var(--ink); font-weight: 500; }
/* LOG_V1 — 여섯 번째 라벨 `자체 조사`. 우리가 직접 세어 만든 1차 자료다.
   ⚠ `.official`(공공기관 발표)과 같은 훅을 쓰면 안 된다 — 기관이 발표한 것과
     우리가 센 것이 화면에서 같은 모양이 되면 근거의 성격이 뭉개진다.
   4단계 눈금(--positive 계열) 밖의 중립이고 라임은 쓰지 않는다.
   official 은 **채운** 중립, self 는 **테두리만 진한** 중립으로 가른다. */
.level.self       { border-color: var(--ink); background: transparent; color: var(--ink); font-weight: 500; }
/* passport 안에서는 옆 행(10.5px)과 광학적 무게를 맞춘다. 가장 중요한 구분이
   가장 작은 글씨가 되지 않도록. 여기서는 열 정렬이 필요 없으므로 폭은 내용에 맡긴다. */
.passport .level { min-width: 0; padding: 3px 9px; font-size: 9.5px; }
.technical-list .data-row:nth-child(-n+2) { border-top: 1px solid var(--line); padding-top: 10px; }
/* 근거 목록과 같은 810px. 끝의 ↗가 1150px 떨어져 어느 줄 것인지 안 보이던 문제. */
/* RELATED_V1 (2026-08-21) — 관련 소재 목록은 출처 목록과 **같은 줄 모양**을 쓴다.
   새 표기를 만들지 않는다. 왼쪽 열에는 왜 관련인지(공유하는 원료)를 적는다.
   다른 것은 화살표 하나뿐 — `↗` 는 바깥으로 나가는 링크, `→` 는 아카이브 안이다. */
.source-list, .related-list { display: grid; max-width: 810px; }
.source-list a, .related-list a { min-height: 43px; display: grid; grid-template-columns: 120px 1fr 24px; gap: 16px; align-items: center; border-top: 1px solid var(--line); font-size: 9.5px; }
.source-list a:first-child, .related-list a:first-child { border-top: 0; }
.source-list a span, .related-list a span { color: var(--muted); font: 450 8.5px/1 Inter, sans-serif; text-transform: uppercase; letter-spacing: .04em; }
.source-list a strong, .related-list a strong { font-weight: 500; }
.source-list a i, .related-list a i { font-style: normal; color: var(--faint); text-align: right; font-variant-emoji: text; }
.source-list a:hover strong, .source-list a:hover i,
.related-list a:hover strong, .related-list a:hover i { color: var(--ink); }
.supplier-row { max-width: 810px; display: flex; justify-content: space-between; gap: 20px; align-items: center; }
.supplier-row > div { display: flex; flex-direction: column; gap: 4px; }
.supplier-row strong { font-size: 10.5px; font-weight: 520; }
.supplier-row span { color: var(--muted); font-size: 9px; }

/* Saved / Compare / About */
.empty { min-height: 280px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; border-top: 1px solid var(--line); color: var(--muted); font-size: 10.5px; }
.empty strong { color: var(--ink); font-weight: 520; }
.empty button, .empty a { border: 0; background: transparent; color: var(--ink); text-decoration: underline; text-underline-offset: 3px; font-size: 9.5px; }
.empty.standalone { margin-top: 60px; }
.compare-wrap { overflow-x: auto; border-top: 1px solid var(--line); }
/* table-layout: fixed — 소재 열을 내용량과 무관하게 균등 분할.
   auto였을 때 3개 비교에서 열이 434/418/369px로 갈렸고 Safari에서는 더 벌어졌다.
   fixed는 첫 행(thead) 폭을 기준으로 잡으므로 라벨 열 폭을 thead th:first-child에 준다. */
.compare-table { width: 100%; min-width: 820px; border-collapse: collapse; table-layout: fixed; font-size: 9.5px; }
.compare-table th, .compare-table td { padding: 13px; border-bottom: 1px solid var(--line); text-align: left; vertical-align: top; font-weight: 400; overflow-wrap: break-word; }
.compare-table thead th { padding-top: 18px; }
.compare-table tbody th { width: 140px; color: var(--muted); font-family: Inter, sans-serif; }
.compare-table thead th:first-child { width: 140px; }  /* fixed 레이아웃의 기준 행 */
/* 담긴 개수가 적으면 열이 과하게 넓어진다. 1개일 때 열 하나가 1362px까지 갔다.
   140(라벨) + 소재당 480 안팎으로 묶는다. 3개일 때는 상한에 안 걸린다. */
.compare-table.cols-1 { min-width: 0; max-width: 620px; }
.compare-table.cols-2 { max-width: 1100px; }
.compare-mini { width: 100%; height: 150px; margin-bottom: 10px; overflow: hidden; border-radius: var(--radius); }
.compare-mini .material-image { width: 100%; height: 100%; object-fit: cover; }
/* 열 머리의 소재명은 이 표의 주어다. 표 기본이 9.5px 이라 이름도 9.5px 로 나와서
   왼쪽 행 라벨(9px)과 크기가 거의 같았다. 무엇과 무엇을 비교하는지가 안 읽힌다.
   13px 로 올려 라벨·값보다 확실히 위에 둔다. 한글 이름은 아래 small 이 맡는다. */
.compare-table thead strong { display: block; font-family: Inter, sans-serif; font-size: 13px; font-weight: 600; line-height: 1.3; letter-spacing: -.015em; }
.compare-table thead small { display: block; margin-top: 4px; color: var(--muted); font-size: 9px; line-height: 1.4; }
.remove-link { margin-top: 9px; padding: 0; border: 0; background: transparent; color: var(--faint); font: 450 8.5px/1 Inter, sans-serif; }
@media (max-width: 640px) {
  /* 라벨 열을 줄여 두 번째 소재 열이 화면 안으로 들어오게 한다.
     140px일 때는 첫 열 오른쪽 끝이 화면 폭과 정확히 맞아떨어져서, 옆에 열이
     더 있다는 단서가 하나도 없었다. 420px에서 444px가 스크롤 뒤에 숨어 있었다.
     라벨을 줄이면 소재 열은 오히려 넓어진다 (227 → 243px). */
  .compare-table tbody th, .compare-table thead th:first-child { width: 92px; }
  /* 이 폭에서는 표(min-width 820px)가 항상 화면보다 넓다. 오른쪽 끝을 흐려
     "여기서 끝이 아니다"를 보인다. 28px 삐져나온 것만으로는 단서가 약하다. */
  .compare-wrap { mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent 100%); }
}
/* LAYOUT_RULE_V1 — 아래 두 줄은 같이 다닌다.
   .main 은 1580px 중앙 정렬 컨테이너다. 그 안의 콘텐츠 블록에 max-width 만 주고
   margin-inline 을 빼먹으면 왼쪽에 붙고 오른쪽이 통째로 빈다. 폭을 제한할 때는
   반드시 가운데로 보낼 것. 자세한 규칙은 research/design-rules.md 참조. */
.about-grid { display: grid; }
.about-grid section { display: grid; border-top: 1px solid var(--line); }
.about-grid section:last-child { border-bottom: 1px solid var(--line); }
.about-grid span { color: var(--muted); }

.footer-links { display: flex; gap: 18px; }
.footer a { color: var(--muted); }
.toast { position: fixed; left: 50%; bottom: 22px; z-index: 100; padding: 8px 12px; border-radius: 999px; background: var(--ink); color: #fff; font-size: 9.5px; opacity: 0; transform: translate(-50%, 12px); transition: .2s ease; pointer-events: none; }
.toast.show { opacity: 1; transform: translate(-50%, 0); }

@media (max-width: 1180px) {
  .filters { flex-wrap: wrap; }
  .clear-btn { justify-self: start; }
  .detail-grid { grid-template-columns: 1fr 410px; gap: 34px; }
}

@media (max-width: 900px) {


  .detail-grid { grid-template-columns: 1fr; }
  .detail-media-wrap { position: relative; top: auto; }
  .detail-side { max-width: 700px; }
}

@media (max-width: 640px) {
  .page-title-row { padding-top: 35px; }
  .filters { overflow-x: auto; flex-wrap: nowrap; padding-bottom: 2px; scrollbar-width: none; }
  .filters::-webkit-scrollbar { display: none; }
  .filter > button { white-space: nowrap; }
    .detail-grid { padding-bottom: 50px; }
  .detail-heading h1 { font-size: 33px; }
  .passport > div, .decision-line { grid-template-columns: 86px 1fr; }
  .detail-section { grid-template-columns: 1fr; gap: 17px; padding: 27px 0; }
  .data-list { grid-template-columns: 1fr; }
  .data-row, .data-row:nth-child(-n+2) { border-top: 1px solid var(--line); padding-top: 10px; }
  .evidence-item { grid-template-columns: 1fr; gap: 5px; }
  .level { justify-self: start; }
  .source-list a { grid-template-columns: 86px 1fr 18px; }
  .supplier-row { align-items: flex-start; flex-direction: column; }
 }


/* v0.7 editorial responsive */
@media (max-width: 900px) {
  .index-rail {
 display: none; }
 }
@media (max-width: 640px) {
  .section-meta { display: none; }
}

@media print {
  .header, .footer, .text-action, .media-role, .reference-note { display: none !important; }
  body { background: #fff; }
  .main { max-width: none; padding: 0; }
  .material-grid { grid-template-columns: repeat(3, 1fr); }
}


/* v0.9 — retro-balanced palette + quieter editorial rail */
.quick-use button:hover::after { color: var(--accent-dark); }


.editorial-head > div {
  align-items: center;
 gap: 10px; }


/* All archive cards use one consistent editorial grid size. */
.home-grid .card { grid-column: auto !important; }
.home-grid .card-media { aspect-ratio: 1 / .82 !important; }

/* v1.0 — bright modern archive palette + standardized swatch cards */

.search input::placeholder { color: #9ba09d; }
.brief-panel textarea {
  width: 100%;


  border-radius: 0;
  outline: none;
  color: var(--ink);

 }


.filter-option:hover { background: #f1f3ef; }

/* Standardized archive cards: swatch window + fixed information stack. */
.card-meta span:first-child {
  color: var(--ink);
  font-weight: 540;
}
.card-meta span:last-child {
  max-width: 58%;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  text-align: right;
}


/* =========================================================
   v1.1 — Approved mockup / White Archive + Acid Marker
   Structural rules only: no decorative paper grain/halftone.
   ========================================================= */
:root {
  --page: 1580px;
  --rail-bg: #edf0f6;
  --rail-ink: #293b83;
  --bg: #F6F6F2;
  --surface: #FFFFFF;
  --surface-strong: #FFFFFF;
  --ink: #151615;
  --muted: #6A6D68;
  --faint: #92958F;
  --line: #DADCD7;
  --line-dark: #BFC2BC;
  --signal: #E1FF22;
  --signal-soft: #F1FF9A;
  --accent: #3E4B84;
  --accent-dark: #303A68;
  --accent-soft: #ECEEF5;
  --positive: #4F6254;
  --radius: 0px;
  --shadow: none;
}

body {
  margin: 0;
  font-family: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif;
  font-size: 14px;
  line-height: 1.58;
  letter-spacing: -0.012em;
  word-break: keep-all;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  background: var(--bg);
  background-image: none;
  color: var(--ink);
}

.header {
  position: sticky;
  top: 0;
  z-index: 60;
  border-bottom: 1px solid var(--line-dark);
  background: rgba(246, 246, 242, .96);
  backdrop-filter: blur(14px);
}
.header-inner {
  max-width: var(--page);
  margin: 0 auto;
  display: flex;
  align-items: center;
  justify-content: space-between; height: 64px; padding: 0 38px; }
.brand {
  display: inline-flex;
  align-items: center;
  font: 650 13px/1 Inter, Arial, sans-serif; gap: 12px; color: var(--ink); font-size: 12px; letter-spacing: .055em; }
.brand .brand-mark {
  width: 21px; height: 21px; border: 1px solid var(--ink); border-radius: 50%;
  background: transparent; color: var(--ink); font-size: 13px;
}
.nav {
  display: flex;
  align-items: center; gap: 34px; }
.nav a { font: 450 11.5px/1 Inter, "Pretendard Variable", sans-serif; transition: .15s ease; color: var(--ink); font-size: 10px; font-weight: 560; text-transform: uppercase; letter-spacing: .025em; }
.nav a.active::after {
  content: "";
  display: block; height: 5px; margin-top: 8px; background: var(--signal); }
.nav a span {
  margin-left: 3px;
  font-size: 9px; color: var(--accent); }
/* I18N_V1 (2026-08-19) — 헤더 언어 스위치. 글자만(EN | 한국어), 국기 없음. nav 맨 끝.
   .nav a 의 대문자·자간을 여기서만 되돌린다. 현재 언어는 채움, 다른 언어는 흐리게. */
.nav-lang { display: inline-flex; align-items: stretch; border: 1px solid var(--line-dark); border-radius: 2px; }
.nav .nav-lang a { padding: 5px 7px 4px; font-size: 9px; text-transform: none; letter-spacing: 0; color: var(--faint); }
.nav .nav-lang a + a { border-left: 1px solid var(--line-dark); }
.nav .nav-lang a:hover, .nav .nav-lang a[aria-current] { color: var(--ink); }
.nav .nav-lang a[aria-current] { background: #F0F1ED; }
/* .nav a span 이 주는 여백·색·크기를 되돌린다 (저장·비교 개수 배지용 규칙). */
.nav .nav-lang a span { margin-left: 0; font-size: inherit; color: inherit; }
.nav .nav-lang .nav-lang-short { display: none; }

.main {
  min-height: calc(100vh - 134px);
  margin: 0 auto;
  max-width: var(--page);
  padding: 0 38px 96px;
  border-left: 1px solid rgba(191,194,188,.55);
  border-right: 1px solid rgba(191,194,188,.55);
}

/* Home layout */
.home-top {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr) 360px;
  gap: 0;
  min-height: 610px;
  padding: 0;
  align-items: stretch;
  border-bottom: 1px solid var(--line-dark);
}
.home-top::after { content: ""; position: absolute; left: 0; right: 336px; bottom: 58px; height: 5px; background: repeating-linear-gradient(90deg, rgba(23,25,21,.13) 0 1px, transparent 1px 10px); opacity: .28; pointer-events: none; }
@media (max-width: 1180px) {
  .home-top::after { right: 292px; }
}
.home-top::after { display: none; }
.home-search-block {
  width: 100%;
  max-width: none;
  position: relative;
  z-index: 1;
  padding: 72px 50px 56px 18px;
  border-right: 1px solid var(--line-dark);
}
.home-kicker {
  display: flex;
  align-items: center;
  gap: 10px;
  font: 560 8px/1 Inter, sans-serif;
  height: auto;
  margin: 0 0 17px;
  color: var(--accent);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .04em;
}
.home-kicker::before { content: ""; width: 8px; height: 8px; background: var(--accent); display: none; }
.home-title {
  margin: 0;
  font: 650 clamp(34px, 3.4vw, 54px)/.96 "Pretendard Variable", Pretendard, sans-serif;
  letter-spacing: -.055em;
}
.home-deck {
  margin: 14px 0 24px;
  color: #343633;
  font-size: 12px;
  line-height: 1.6;
}
.search-large { position: relative; }
.search-large input {


  border-radius: 0;
  height: 102px;
  padding: 20px 70px 20px 20px;
  border: 1px solid var(--line-dark);

  color: var(--ink);
  font-size: 13px;
  font-weight: 450;
  letter-spacing: -.018em;
}
.search-large input::placeholder { color: #9A9D97; }
.search-large::after {
  content: "SEARCH / MATERIALS";
  position: absolute;
  right: 0;
  top: -18px;
  color: var(--accent);
  font: 600 7.5px/1 Inter,sans-serif;
  letter-spacing: .09em; display: none; }
.search-large .search-icon { left: 5px; width: 19px; height: 19px; border-color: var(--ink); }
@media (max-width: 640px) {
  .search-large .search-icon { width: 15px; height: 15px; }
}
.search-large .search-icon { display: none; }
/* EXT_ARROW_V1 — 라임 화살표. 글자는 app.js 의 EXT_ARROW(U+2197 + U+FE0E)다.
   `font-variant-emoji: text` 는 VS15 를 못 읽는 브라우저용 이중 안전장치다(모르면 무시된다). */
.search-arrow {
  position: absolute;
  right: 19px;
  top: 13px;
  color: var(--signal);
  font: 350 34px/1 Arial, sans-serif;
  font-variant-emoji: text;
}
.home-search-example {
  min-height: 25px;
  margin-top: -29px;
  padding: 0 14px 0 20px;
  position: relative;
  z-index: 2;
  display: flex;
  justify-content: flex-end;
  gap: 24px;
  color: var(--faint);
  font-size: 8px;
}
.home-search-example b { font-weight: 450; }
.quick-head {
  margin-top: 34px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 18px;
}
.quick-head strong { font-size: 10px; font-weight: 650; }
.quick-head a {
  color: var(--accent);
  font: 650 9px/1 Inter, sans-serif;
  letter-spacing: .015em;
}
.quick-head a span { margin-left: 7px; font-size: 15px; font-weight: 350; vertical-align: -1px; }
.quick-use {
  display: grid;


  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 7px;
  margin-top: 12px;
  border: 0;
}
.quick-use button { border-radius: 0; text-align: left; font-size: 10px; transition: background .15s ease, color .15s ease; position: relative; }
@media (max-width: 640px) {
  .quick-use button { font-size: 10px; }
}
.quick-use button {
  min-height: 64px;
  padding: 12px 13px;
  border: 1px solid var(--line-dark);
  background: rgba(255,255,255,.42);
  display: grid;
  align-content: center;
  gap: 5px;
  color: var(--ink);
}
/* EXT_ARROW_V1 (2026-08-24) — `\2197` 는 이모지 표현형이 있는 글자다. `\FE0E`(VS15)를 붙여
   텍스트 표현형을 강제한다. 안 붙이면 글꼴 대체가 이모지 글꼴까지 가서 컬러 그림이 나온다.
   app.js 의 EXT_ARROW 상수와 **같은 두 코드포인트**여야 한다. */
.quick-use button::after {
  content: "\2197\FE0E";
  font-variant-emoji: text;
  position: absolute;
  right: 9px;
  top: 50%;
  transform: translateY(-50%);
  color: var(--faint);
  font-size: 8px; display: none; }
.quick-use button b { font: 650 10px/1.1 Inter, sans-serif; }
.quick-use button span { color: var(--muted); font-size: 9px; }
.quick-use button:hover {
  border-color: var(--accent);
  background: var(--accent-soft);
  color: var(--accent-dark);
}
.quick-use button:hover span { color: var(--accent-dark); }

/* Right archive column */
.home-side {
  min-width: 0;
  display: flex;
  flex-direction: column;
  background: rgba(255,255,255,.16);
}
.index-rail {
  min-height: 0;
  padding: 29px 26px 25px;
  background: transparent;
  color: var(--ink);
  /* 480·576행에서 온 사면 테두리를 끈다. 레일이 파란 카드였을 때 남은 것인데,
     배경이 transparent가 된 뒤로는 이미 있는 선을 한 번 더 그릴 뿐이다.
       위   y=65   → header의 border-bottom과 같은 자리 (1px 두 겹)
       왼쪽 x=1231 → .home-search-block의 border-right와 같은 자리 (1px 두 겹)
       오른쪽 x=1591 → .main의 border-right(1630)와 39px 평행. 죽은 띠가 생긴다.
     레일의 경계는 이미 있는 선으로 충분하다. 아래쪽만 자기 선을 갖는다. */
  border: 0;
  border-bottom: 1px solid var(--line-dark);
  overflow: visible;
}
.rail-heading {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font: 600 7.5px/1 Inter, sans-serif;
  min-height: 24px;
  gap: 11px;
  color: var(--accent);
  font-size: 8px;
  letter-spacing: .035em;
}
.rail-heading > span { white-space: nowrap; font-weight: 700; }
.rail-heading > i { flex: 1; height: 1px; background: var(--line-dark); }
.rail-heading > b { color: var(--ink); font-size: 16px; font-weight: 350; }
.rail-overview {
  margin-top: 17px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 15px;
}
.rail-overview h2 { margin: 0; font: 650 20px/1 Inter, sans-serif; letter-spacing: -.035em; }
.rail-live { display: inline-flex; align-items: center; gap: 6px; color: #7A8100; font-size: 8px; font-weight: 650; }
.rail-live i {
  border-radius: 0;
  box-shadow: 0 0 0 1px rgba(31,55,127,.18); width: 7px; height: 7px; background: var(--signal); }
.rail-date { margin-top: 13px; padding-bottom: 15px; border-bottom: 1px dotted var(--line-dark); color: var(--muted); font-size: 7px; text-align: right; }
.rail-bigstats {
  display: grid;
  grid-template-columns: 1fr 1fr;
  margin-top: 0;
  border-bottom: 1px dotted var(--line-dark);
}
.rail-bigstats > div { padding: 20px 0 17px; }
.rail-bigstats > div + div { padding-left: 24px; border-left: 1px dotted var(--line-dark); }
.rail-bigstats b { display: block; color: var(--ink); font: 540 38px/.9 Inter, sans-serif; letter-spacing: -.075em; }
.rail-bigstats span { display: block; margin-top: 8px; font: 650 8px/1 Inter, sans-serif; letter-spacing: .02em; }
.rail-subhead {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font: 560 6.8px/1 Inter,sans-serif; margin-top: 22px; color: var(--accent); font-size: 8px; font-weight: 700; letter-spacing: .02em; }
.rail-categories { margin-top: 10px; display: grid; gap: 0; }
/* INTERNAL_LINKS_V1 (2026-08-21) — 이 목록은 원래 <span> 이었다. 이제 각 줄이
   `/explore/origin/<slug>` 로 가는 링크다. 겉모습은 그대로 두고(밑줄 없음),
   가리켰을 때만 원료명에 밑줄을 그어 누를 수 있다는 것을 알린다.
   왜: 하이드레이트된 화면에 패싯 페이지로 가는 링크가 사이트 전체에 하나도 없었다
   (2026-08-21 실측 — 홈 19개 링크 중 패싯 0). 새 문구 없이 링크가 되는 자리다. */
.rail-categories a {
  min-height: 24px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  color: var(--ink);
  text-decoration: none;
}
.rail-categories a:hover b { text-decoration: underline; text-underline-offset: 2px; }
.rail-categories b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 620 8px/1 Inter, sans-serif; }
.rail-categories em { color: var(--ink); font: 650 8px/1 Inter, sans-serif; font-style: normal; }

/* INTERNAL_LINKS_V1 — 패스포트와 Properties 의 원료 값이 패싯 페이지 링크가 됐다.
   읽는 글(.log-body a)과 같은 집안 문법을 쓴다 — 색은 물려받고, 밑줄은 연한 선으로,
   가리키면 진해진다. 여기에만 쓰는 새 색을 만들지 않는다. */
.passport a, .data-row a {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 2px;
  text-decoration-color: var(--line-dark);
}
.passport a:hover, .data-row a:hover { text-decoration-color: currentColor; }

/* Project brief lives in the sidebar and is open by default */
.home-side .brief-wrap {
  margin: 0;
  padding: 0 26px 22px;
  border: 0;
  border-bottom: 1px solid var(--line-dark);
  background: transparent;
}
.home-side .brief-trigger {
  min-height: 58px;
  border: 0;
  background: transparent;
  font-size: 8px;
  letter-spacing: .03em;
}
.home-side .brief-trigger::after {
  content: "";
  height: 1px;
  flex: 1;
  margin: 0 10px 0 14px;
  background: var(--signal);
}
.home-side .brief-trigger span::after { content: none; }
.home-side .brief-trigger i { width: auto; height: auto; background: transparent; font-size: 14px; }
.home-side .brief-panel { padding: 0; }
.home-side .brief-panel > p { margin: -3px 0 12px; color: var(--ink); font-size: 8px; line-height: 1.55; }
.home-side .brief-panel textarea {
  min-height: 108px;
  padding: 14px;
  resize: none;
  border: 1px solid var(--line-dark);
  background: rgba(255,255,255,.7);
  font-size: 9px;
  line-height: 1.65;
}
.brief-count { margin: -23px 10px 0 0; position: relative; z-index: 2; text-align: right; color: var(--faint); font-size: 7px; pointer-events: none; }
.brief-submit {
  width: 100%;
  min-height: 39px;
  margin-top: 15px;
  padding: 0 13px;
  border: 1px solid #BDD400;
  background: var(--signal);
  color: var(--ink);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  font-size: 9px;
  font-weight: 700;
}
.brief-submit span { margin-left: auto; font-size: 15px; font-weight: 400; }
.brief-submit:hover { filter: brightness(.97); }
.archive-note { padding: 22px 26px 25px; }
.archive-note b { color: var(--accent); font: 700 8px/1 Inter, sans-serif; }
.archive-note p { margin: 9px 0 12px; max-width: 245px; color: #343633; font-size: 9px; line-height: 1.55; }
.archive-note a { color: var(--accent); font-size: 8px; font-weight: 650; }
.archive-note a span { margin-left: 8px; }

/* Materials section */
.home-materials {
  position: relative;
  border-top: 0;
  padding: 0 18px 0;
}
.home-materials::before {
  content: "";
  position: absolute;
  top: -5px;
  left: 0;
  width: 88px;
  height: 5px;
  background: var(--signal); display: none; }
.editorial-head { min-height: 80px; }
.section-title-stack {
 display: block !important; }
.section-title-line { display: flex; align-items: baseline; gap: 12px; }
.section-index { color: var(--accent); font: 700 10px/1 Inter, sans-serif; }
.simple-head h1 { margin: 0; font: 700 13px/1 Inter, sans-serif; letter-spacing: -.01em; }
.section-meta {
  font: 520 7.5px/1 Inter,sans-serif;
  padding: 0;
  margin: 0 0 0 4px;
  border: 0;
  color: var(--muted);
  font-size: 8px;
  letter-spacing: .015em;
}
.simple-head > a { color: var(--accent); border-bottom: 0; font-size: 9px; font-weight: 650; }
.simple-head > a:hover { color: var(--accent-dark); border-color: transparent; }

.material-grid {
  display: grid;
  align-items: stretch;
}
.material-grid, .home-grid {
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 18px 13px;
}
.card {
  height: 100%;
  min-width: 0;
  border: 1px solid var(--line-dark);
  background: var(--surface);
  transition: border-color .16s ease, transform .16s ease;
}
.card:hover {
  box-shadow: 0 8px 20px rgba(22,26,23,.045); border-color: var(--accent); transform: translateY(-1px); }
.card > a { padding: 10px; grid-template-rows: auto 1fr; }
@media (max-width: 700px) {
  .card > a { padding: 8px; }
}
.card > a { height: 100%; display: flex; flex-direction: column; }
.card-media {
  position: relative;
  border-radius: 0;
  margin: 9px 9px 0;
  aspect-ratio: 16 / 10;
  overflow: hidden;
  background: #EBECE8;
}
.card-media::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none; box-shadow: inset 0 0 0 1px rgba(21,22,21,.055); }
.material-image, .material-fallback {
  width: 100%;
  height: 100%;
  display: block;
  transform: scale(1.003);
  transition: transform .34s cubic-bezier(.2,.65,.3,1), filter .2s ease; object-fit: cover; }
.material-index {
  position: absolute;
  z-index: 2;
  font: 560 8px/1 Inter, sans-serif;
  letter-spacing: .05em;
  border: 1px solid rgba(23,25,26,.10);
  left: 0;
  top: 0;
  min-width: 30px;
  padding: 7px 7px 6px;
  background: rgba(255,255,255,.94) !important;
  color: var(--accent) !important;
  backdrop-filter: none;
  font-size: 8px;
  font-weight: 750;
}
/* 배지는 네 종류다 — REF 99, PROCESS 4, IN USE 3, PRODUCT 3 (배포본 109장 기준).
   예전에는 넷 다 라임이라 "실제 제품이 아니다"(99장)가 화면에서 가장 셌다.
   허락받은 실제 제품 사진(3장)이 이 아카이브에서 가장 얻기 어려운 자산인데
   가장 조용했다. 뒤집혀 있었다.
   REF·PROCESS·IN USE 는 반투명 검정으로 물러난다. 텍스처 밝기가 제각각이라
   (tornex 평균 RGB 202) 밝은 칩은 대비가 무너지는데, 검정은 배경과 무관하게 읽힌다.
   라임은 PRODUCT 하나에만 남긴다. 109장 중 3장이라 라임이 실제로 드물어진다. */
.media-role {
  position: absolute;

  font: 560 8px/1 Inter, sans-serif;
  letter-spacing: .05em;
  padding: 4px 5px;


  background: rgba(18,19,17,.72);
  color: #fff;
  backdrop-filter: blur(3px);
}
.media-role.role-product { background: var(--signal); color: var(--ink); backdrop-filter: none; }
.icon-btn {
  padding: 0;
  border: 1px solid rgba(20,22,18,.15);
  backdrop-filter: blur(8px);
  display: grid;
  place-items: center;
  font: 500 11px/1 Inter, sans-serif; width: 25px; height: 25px; border-radius: 0; background: rgba(255,255,255,.94); }
.icon-btn.active {
  color: #fff; background: var(--accent); border-color: var(--accent); }
.card-content {
  position: relative;
  min-height: 154px;
  padding: 10px 31px 11px 10px;
  display: flex;
  flex-direction: column;
}
.card-title-block h3 { margin: 0; font-size: 10px; line-height: 1.35; font-weight: 700; letter-spacing: -.018em; }
.card-title-block span { display: block; margin-top: 2px; color: var(--muted); font-size: 8px; line-height: 1.25; }
.card-description {
  min-height: 2.9em;
  margin: 9px 0 10px;
  color: #3F423D;
  /* 8.5 → 9px (2026-08-14, 홍연조 확정 '핵심만 키운다'). 아래 조달 칩과 함께
     사이트에서 가장 작은 층만 올린다. 모바일 확대는 파일 뒤 SMALL_TEXT_MOBILE_V1. */
  font-size: 9px;
  line-height: 1.55;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
/* 근거 수준은 원산지·국가와 같은 급의 패싯이 아니다. 칩 줄에 네 번째로 섞으면
   'UK'와 같은 무게가 된다. 한 줄을 따로 주고 칩보다 위에 둔다.
   폭은 내용에 맡긴다 — 줄 맨 앞이라 왼쪽 기준선은 어차피 맞는다. */
.card-evidence {
  margin-top: auto;
  padding-top: 9px;
  border-top: 1px solid var(--line);
}
.card-evidence .level { min-width: 0; padding: 2px 6px; font-size: 7.5px; line-height: 1.45; }
.card-meta {
  align-items: flex-end;
  color: #858b87;
  font: 470 7.8px/1.25 Inter, "Pretendard Variable", sans-serif;
  margin-top: 6px;
  /* 구분선은 이제 .card-evidence가 갖는다. 695행 규칙의 hairline·padding을 끈다.
     안 끄면 선이 두 줄로 겹친다. */
  padding-top: 0;
  border-top: 0;
  padding-right: 2px;
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-start;
  gap: 4px;
}
.card-meta span {
  max-width: 100%;
  padding: 4px 5px 3px;
  background: #F0F1ED;
  color: #4E514C;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  /* 6.5 → 7.5px (2026-08-14). 조달 확인/미확인은 이 사이트의 핵심 구분인데
     가장 작은 글씨였다. 근거 배지(.card-evidence .level 7.5px)와 같은 급으로. */
  font: 620 7.5px/1 Inter, sans-serif;
  text-transform: uppercase;
}
/* 조달 표시의 축은 좋음/나쁨이 아니라 확인/미확인이다. '국내 미유통'은 찾아본
   결과이므로 확인된 쪽이다 (데이터 챗 확인). 발행 101건 중 확인 27 / 미확인 74.
   예전에는 미확인 74건이 화면에서 가장 밝은 라임이었다. 신호가 뒤집혀 있었다.
   근거 배지와 같은 어휘를 쓴다 — 확인된 것은 채우고, 확인 못 한 것은 점선. */
.card-meta span.avail.confirmed   { background: #E7EAE4; color: #3C4A3E; }
/* 테두리 1px 만큼 안쪽 여백을 줄여 폭·높이를 채움 칩과 똑같이 맞춘다.
   안 그러면 칩 줄이 1280px 에서 두 줄로 접히고 카드가 8px 커진다. */
.card-meta span.avail.unconfirmed { background: transparent; border: 1px dashed var(--line-dark); color: var(--faint); padding: 3px 4px 2px; }
/* AVAIL_EVERYWHERE_V1 — 확인/미확인 구분을 카드 밖(상세 패스포트·Access·비교표)에도.
   카드와 같은 어휘(채움/점선), 크기는 .passport .level(9.5px)과 같은 급.
   점선 쪽은 테두리 1px만큼 padding을 줄여 채움 칩과 상자 크기를 맞춘다. */
.passport .avail, .supplier-row .avail, .compare-table .avail {
  display: inline-block;
  padding: 3px 9px;
  border-radius: 2px; /* .level과 같은 이유 — 알약은 인증 씰처럼 읽힌다 */
  font: 500 9.5px/1.5 Inter, "Pretendard Variable", sans-serif;
  white-space: nowrap;
}
.passport .avail.confirmed, .supplier-row .avail.confirmed, .compare-table .avail.confirmed {
  background: #E7EAE4; color: #3C4A3E;
}
.passport .avail.unconfirmed, .supplier-row .avail.unconfirmed, .compare-table .avail.unconfirmed {
  background: transparent; border: 1px dashed var(--line-dark); color: var(--faint); padding: 2px 8px;
}
/* DISCONTINUED_V1 (2026-08-17) — 단종은 '확인 못 한 것'이 아니라 '확인된 나쁜 소식'이라
   점선(미확인)과 구분한다. 색을 새로 만들지 않고 취소선으로 "있었지만 이제 없다"를 읽힌다.
   라임(--signal)은 회수 표식이므로 쓰지 않는다.
   PRODUCT_STATE_V1 (2026-08-21) — 일시 품절(.paused)이 같은 급으로 붙는다.
   테두리·색·여백은 단종과 같다(둘 다 '확인된 소식'이라 실선이다). **취소선만 다르다** —
   일시 품절은 사라진 것이 아니다. 그래서 실선 규칙과 취소선 규칙을 두 줄로 나눠 둔다.
   순서를 바꾸지 말 것: 취소선 규칙은 공통 규칙 바로 뒤에 있어야 한다. */
.card-meta span.avail.discontinued, .card-meta span.avail.paused {
  background: transparent; border: 1px solid var(--line-dark); color: var(--faint);
  padding: 3px 4px 2px;
}
.card-meta span.avail.discontinued { text-decoration: line-through; text-decoration-thickness: 1px; }
.passport .avail.discontinued, .supplier-row .avail.discontinued, .compare-table .avail.discontinued,
.passport .avail.paused, .supplier-row .avail.paused, .compare-table .avail.paused {
  background: transparent; border: 1px solid var(--line-dark); color: var(--faint);
  padding: 2px 8px;
}
.passport .avail.discontinued, .supplier-row .avail.discontinued, .compare-table .avail.discontinued {
  text-decoration: line-through; text-decoration-thickness: 1px;
}
/* .detail-section > p (0,1,1) 가 .product-note (0,1,0) 를 이긴다 — 뒤에 써도 진다.
   .gseed-note 와 똑같은 함정이라 똑같이 특이도를 맞춘다.
   grid-column 이 없으면 .detail-section(180px 1fr 그리드)의 세 번째 항목이 되어
   라벨 열(180px)로 떨어진다 — 실제로 그렇게 나갔다 (2026-08-17 실측: x=39, w=180). */
.detail-section > p.product-note {
  grid-column: 2;
  margin: 12px 0 0;
  max-width: 640px;   /* 규칙 2 — 본문 폭. .gseed-note 와 같은 급 */
  color: var(--faint);
  font-size: 10.5px;
  line-height: 1.7;
}
/* 640px 이하에서 .detail-section 은 1열이다 (246행). 2열 지정이 남으면 빈 열이 생긴다. */
@media (max-width: 640px) {
  .detail-section > p.product-note { grid-column: 1; }
}
/* SMALL_TEXT_MOBILE_V1 (2026-08-14) — 420px에서도 목록 글씨가 데스크톱과 똑같았다.
   핵심 층(조달 칩·카드 설명)만 모바일에서 한 단계 더 키운다.
   기본 정의보다 뒤에 있어야 사는 규칙이다 (규칙 9 — 앞의 @media는 뒤 기본값에 죽는다). */
@media (max-width: 640px) {
  .card-meta span { display: block; margin-top: 2px; font-size: 8.5px; }
  .card-description { font-size: 10px; }
}
/* EXT_ARROW_V1 — 카드의 라임 화살표. 위 .search-arrow 주석 참조. */
.card-link-mark { position: absolute; right: 10px; bottom: 11px; color: var(--signal); font: 350 22px/1 Arial, sans-serif; font-variant-emoji: text; }
.more-materials {
  width: max-content;
  margin: 25px auto 0;
  display: flex;
  align-items: center;
  gap: 10px;
  color: var(--accent);
  font-size: 9px;
  font-weight: 650;
}
.more-materials span { font-size: 15px; }

/* Explore/detail inherit the same neutral system */
.page-title-row h1 {
  margin: 0;
  font: 560 12px/1 Inter, "Pretendard Variable", sans-serif;
  font-size: 22px;
  font-weight: 510;
  letter-spacing: -.035em;
  color: var(--ink);
}
.explore-toolbar { position: sticky; top: 62px; z-index: 45; padding: 11px 0; display: grid; grid-template-columns: minmax(230px, 1fr) auto auto; gap: 8px; align-items: center; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); backdrop-filter: blur(16px); }
@media (max-width: 1180px) {
  .explore-toolbar { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
  .explore-toolbar { top: 58px; }
}
.explore-toolbar { background: rgba(246,246,242,.96); }
.filter-menu { display: none; position: absolute; top: 43px; left: 0; min-width: 222px; max-height: 340px; overflow: auto; padding: 6px; border: 1px solid var(--line); border-radius: 5px; box-shadow: var(--shadow); }
@media (max-width: 640px) {
  .filter-menu { position: fixed; top: 109px; left: 14px; right: 14px; min-width: 0; }
}
.search input, .filter-menu { background: var(--surface); }
.filter > button.active, .btn.active { background: var(--signal); color: var(--ink); border-color: #BDD400; }
.filter-option.selected .check {
  box-shadow: inset 0 0 0 2px #fff; background: var(--signal); border-color: #AFC300; }
.passport::before {
  content: "";
  position: absolute;
  left: 0;
  top: -3px;
  width: 52px;
  height: 3px; background: var(--signal); }
/* 발행 101건 중 100건이 representative 라 이 띠는 사실상 모든 상세페이지에 뜬다.
   늘 떠 있는 경고는 읽히지 않는다. 저작권상 요구되는 수준도 없다 — 대표 이미지
   99장이 CC0 1.0 이다 (데이터 챗 확인). 문장과 띠는 남기고 라임 틴트만 뺀다. */
.reference-note {
  margin: 0 0 24px;
  padding: 10px 12px;
  display: flex;
  gap: 11px;
  align-items: center;
  border: 1px solid #c9cf9f;
  color: #5d6254;
  font-size: 9.5px; background: var(--surface); border-color: var(--line); }
.reference-note b {
  padding: 3px 5px;
  font: 600 8px/1 Inter, sans-serif; background: rgba(18,19,17,.72); color: #fff; }

.footer {
  border-top: 1px solid var(--line); background: var(--bg); }
.footer-inner { max-width: var(--page); min-height: 72px; margin: 0 auto; padding: 0 32px; display: flex; align-items: center; justify-content: space-between; gap: 20px; color: var(--faint); font: 450 8.5px/1 Inter, "Pretendard Variable", sans-serif; }
@media (max-width: 900px) {
  .footer-inner { padding-left: 22px; padding-right: 22px; }
}
@media (max-width: 640px) {
  .footer-inner { min-height: 84px; align-items: flex-start; justify-content: center; flex-direction: column; gap: 5px; }
}
.footer-inner { border-color: var(--line-dark); }

@media (max-width: 1180px) {
  .home-top { grid-template-columns: minmax(0, 1fr) 320px; }
  .home-search-block { padding-right: 32px; }
  .quick-use { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .material-grid, .home-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

@media (max-width: 920px) {
  .header-inner { padding-left: 22px; padding-right: 22px; }
  .main { padding-left: 22px; padding-right: 22px; border-left: 0; border-right: 0; }
  .home-top { grid-template-columns: 1fr; }
  .home-search-block { padding: 54px 0 42px; border-right: 0; }
  .home-side { border-top: 1px solid var(--line-dark); }
  .index-rail { padding-left: 0; padding-right: 0; }
  .home-side .brief-wrap, .archive-note { padding-left: 0; padding-right: 0; }
  .home-materials { padding-left: 0; padding-right: 0; }
}

@media (max-width: 680px) {
  .header-inner { height: 58px; }
  .brand span { font-size: 10px; }
  /* I18N_V1 — 언어 스위치가 들어와 항목이 다섯이 됐다. gap 14→11 이 아니면 420px 에서
     브랜드 글자가 두 줄로 접힌다 (실측: nav 238px, 브랜드 글자 폭 ~130px 필요). */
  .nav { gap: 11px; }
  .nav a { font-size: 8px; }
  /* 좁은 폭(360px)에서는 nav 네 항목만으로 꽉 찬다. 스위치는 **다른 언어 하나**를 두 글자로만 —
     현재 언어 칸은 숨기고 '한국어' 는 'KO' 로. 테두리 상자는 그대로라 버튼으로 읽힌다.
     유일한 컨트롤이라 흐리게 두지 않는다. */
  .nav .nav-lang a { padding: 4px 5px 3px; font-size: 8px; color: var(--ink); }
  .nav .nav-lang a[aria-current] { display: none; }
  .nav .nav-lang a + a { border-left: 0; }
  .nav .nav-lang .nav-lang-long { display: none; }
  .nav .nav-lang .nav-lang-short { display: inline; }
  .home-title { font-size: 36px; }
  /* iOS Safari 는 포커스된 입력의 글씨가 16px 미만이면 페이지를 확대한다.
     확대되면 사용자가 직접 되돌려야 하고, 그 사이 레이아웃이 다 어긋난다.
     글씨를 키운 만큼 좌우 여백을 줄여 placeholder 가 덜 잘리게 한다.
     화살표는 입력 오른쪽 끝에서 53px 지점부터라 56px 이면 안 겹친다. */
  .search-large input { height: 92px; font-size: 16px; padding-left: 16px; padding-right: 56px; }
  .quick-use { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .editorial-head { min-height: 70px; }
  .section-title-line { gap: 8px; flex-wrap: wrap; }
  .material-grid, .home-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px 9px; }
  .card-media { margin: 7px 7px 0; }
  .card-content { min-height: 142px; padding-left: 8px; padding-bottom: 9px; }
}
@media (max-width: 400px) {
  /* I18N_V1 — 360·375px 에서 브랜드 글자가 두 줄로 접히지 않게 한 칸 더 줄인다 (실측 2026-08-19). */
  .brand { gap: 8px; }
  .brand span { font-size: 9px; }
  .nav { gap: 8px; }
}

/* =========================================================
   v1.5 — viewport midpoint material scroll cue
   One canonical cue rule; no legacy overrides.
   ========================================================= */
.material-scroll-cue {
  border: 0;
  background: transparent;
  color: var(--accent);
  cursor: pointer;
  font: 700 8px/1 Inter, Arial, sans-serif;
  letter-spacing: .14em;
  text-transform: uppercase;
}

@media (min-width: 921px) {
  .home-search-block {
    min-height: calc(100svh - 64px);
    padding-bottom: 64px;
 }

  .material-scroll-cue {
    position: absolute;
    z-index: 4;
    left: 50%;
    top: 78%; /* fallback until JS measures the actual midpoint */
    bottom: auto;
    width: 172px;
    margin: 0;
    padding: 0;
    transform: translate(-50%, -50%);
    display: grid;
    justify-items: center;
    gap: 10px;
 }

  .material-scroll-cue span {
    display: block;
    white-space: nowrap;
 }

  .material-scroll-cue::before {
    content: "";
    display: block;
    width: 1px;
    height: 38px;
    background: linear-gradient(to bottom, var(--accent) 0 62%, var(--signal) 62% 100%);
 }

  .material-scroll-cue i {
    width: 38px;
    height: 38px;
    display: grid;
    place-items: center;
    border: 1px solid var(--accent);
    background: var(--signal);
    color: var(--accent-dark);
    font: 700 19px/1 Inter, Arial, sans-serif;
    font-style: normal;
    box-shadow: 3px 3px 0 rgba(62,75,132,.11);
    transition: transform .18s ease, box-shadow .18s ease;
 }

  .material-scroll-cue:hover i {
    transform: translateY(3px);
    box-shadow: 1px 1px 0 rgba(62,75,132,.11);
 }

  .material-scroll-cue:focus-visible {
    outline: 1px solid var(--accent);
    outline-offset: 8px;
 }
}

/* 창이 낮으면 큐(기본 104px)가 Quick Explore 타일과 뷰포트 바닥 사이에 안 들어간다.
   1280×600 에서 타일 아래 남는 높이가 113px 뿐이다. 잇는 선과 간격을 줄여 78px 로.
   화살표 크기는 그대로 둔다 — 누르는 표적이라 줄이면 안 된다. */
@media (min-width: 921px) and (max-height: 760px) {
  .material-scroll-cue { gap: 7px; }
  .material-scroll-cue::before { height: 18px; }
}

@media (max-width: 920px) {
  .material-scroll-cue {
    position: static;
    width: 160px;
    margin: 56px auto 4px;
    padding: 0;
    display: grid;
    justify-items: center;
    gap: 9px;
 }

  .material-scroll-cue::before {
    content: "";
    width: 1px;
    height: 30px;
    background: linear-gradient(to bottom, var(--accent) 0 62%, var(--signal) 62% 100%);
 }

  .material-scroll-cue i {
    width: 36px;
    height: 36px;
    display: grid;
    place-items: center;
    border: 1px solid var(--accent);
    background: var(--signal);
    color: var(--accent-dark);
    font: 700 18px/1 Inter, Arial, sans-serif;
    font-style: normal;
 }
}

/* v1.6 — inline material expansion */
button.more-materials {
  appearance: none;
  border: 0;
  background: transparent;
  padding: 0;
  cursor: pointer;
  font-family: inherit;
}
button.more-materials:hover {
  color: var(--ink);
}
button.more-materials:focus-visible {
  color: var(--ink);
  outline: 1px solid var(--accent);
  outline-offset: 6px;
}


/* SEARCH_COLOR_V1: Look & Feel > Color + zero-result recovery */
.filter-section-label {
  padding: 10px 11px 7px;
  border-top: 1px solid var(--line, #deded8);
  color: var(--faint, #797b76);
  font: 650 7px/1 Inter, sans-serif;
  letter-spacing: .09em;
}
.filter-section-label:first-child { border-top: 0; padding-top: 7px; }
.filter-section-label.color-label { margin-top: 4px; }
.filter-empty-note { padding: 8px 11px 11px; color: var(--faint, #797b76); font-size: 8px; }
.color-option { grid-template-columns: 14px 1fr; }
.color-swatch {
  width: 11px;
  height: 11px;
  border: 1px solid rgba(25,25,25,.22);
  border-radius: 50%;
  background: var(--swatch);
  box-sizing: border-box;
}
.color-swatch.custom { background: transparent; border-style: dashed; }
.color-option.selected .color-swatch { outline: 2px solid var(--signal); outline-offset: 1px; }
.search-empty p { max-width: 420px; margin: 8px auto 14px; color: var(--muted, #676a65); font-size: 9px; line-height: 1.5; }
.empty-suggestions { width: min(440px, 100%); margin: 0 auto 14px; display: grid; gap: 6px; }
.relax-option {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  padding: 9px 10px;
  text-align: left;
  /* border·background 는 두지 않는다 — .empty button (0,1,1) 이 이겨서 어차피 안 먹었다.
     테두리 있는 상자로 보이게 하려면 .empty button.relax-option 으로 올려야 한다. */
}
.relax-option b { font-size: 8px; font-weight: 650; }
.relax-option span { color: var(--muted, #676a65); font-size: 8px; }
.relax-option:hover { border-color: var(--ink, #161714); }


/* MEDIA_GALLERY_V1 */
.media-gallery { width: 100%; height: 100%; position: relative; }
.media-gallery-viewport { width: 100%; height: 100%; position: relative; overflow: hidden; background: #EBECE8; }
.media-gallery-track {
  width: 100%;

  display: flex;
  height: 100%;
  will-change: transform;
  transition: transform .26s cubic-bezier(.2,.65,.3,1);
}
.media-gallery-slide {
  width: 100%;

  position: relative;
  flex: 0 0 100%;
  min-width: 100%;
  height: 100%;
  overflow: hidden;
}
.media-gallery-slide .material-image { width: 100%; height: 100%; object-fit: cover; }
.gallery-role { z-index: 4; left: auto; }
.media-nav {
  position: absolute;
  z-index: 5;
  top: 50%;
  width: 28px;
  height: 28px;
  padding: 0;
  border: 1px solid rgba(21,22,21,.20);
  background: rgba(255,255,255,.92);
  color: var(--ink);
  display: grid;
  place-items: center;
  transform: translateY(-50%);
  font: 550 12px/1 Inter, sans-serif;
  opacity: 0;
  transition: opacity .15s ease, background .15s ease;
}
.media-prev { left: 6px; }
.media-next { right: 6px; }
.media-gallery:hover .media-nav, .media-nav:focus-visible { opacity: 1; }
.media-nav:hover { background: var(--signal); }
.media-count {
  position: absolute;
  z-index: 5;
  left: 7px;
  bottom: 7px;
  padding: 4px 6px;
  border: 1px solid rgba(21,22,21,.12);
  background: rgba(255,255,255,.90);
  color: var(--ink);
  font: 650 7px/1 Inter, sans-serif;
  letter-spacing: .025em;
}
.card-gallery { height: 100%; }
/* 화살표는 미리보기 가운데 기준 대칭 — prev left 6px = next right 6px (기본값 사용).
   예전의 right:38px는 근거 없는 비대칭이라 제거 (2026-08-14, 홍연조 지시).
   card-actions(우하단)·gallery-role(우상단)과 세로로 안 만나 겹침 없음. */
.card-gallery .gallery-role { top: 7px; right: 7px; }

.detail-media {
  border-radius: var(--radius);
  aspect-ratio: auto;
  overflow: visible;
  background: transparent;
}
.detail-gallery .media-gallery-viewport {
  aspect-ratio: 1.12 / .88;
  height: auto;
  overflow: hidden;
}
.detail-gallery .media-nav { width: 34px; height: 34px; }
.detail-gallery .media-prev { left: 10px; }
.detail-gallery .media-next { right: 10px; }
.detail-gallery .media-count { left: 10px; bottom: 10px; }
.detail-gallery .gallery-role { top: 10px; right: 10px; }

.media-gallery-meta {
  width: 100%;
  min-height: 38px;
  border-bottom: 1px solid var(--line);
}
.media-meta-item { padding: 9px 0 8px; }
.media-meta-item[hidden] { display: none; }
.media-meta-top {
  min-height: 18px;
  display: flex;
  justify-content: space-between;
  gap: 14px;
  align-items: center;
  color: var(--faint);
  font: 450 8px/1.35 Inter, sans-serif;
}
.media-meta-top > span:first-child {
  flex: 0 0 auto;
  color: var(--accent);
  font-weight: 700;
  letter-spacing: .055em;
}
.media-meta-top a {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.media-meta-top a:hover { color: var(--ink); }
.media-meta-item p {
  margin: 5px 0 0;
  color: var(--muted);
  font-size: 8.5px;
  line-height: 1.45;
}
.card-actions { position: absolute; display: flex; gap: 5px; opacity: 0; transition: opacity .15s ease; }
@media (max-width: 640px) {
  .card-actions { opacity: 1; }
}
@media print {
  .card-actions { display: none !important; }
}
.card-actions { right: 6px; bottom: 6px; }
.card-actions { z-index: 7; }

@media (hover: none), (max-width: 700px) {
  .media-nav { opacity: 1; width: 25px; height: 25px; }
  .card-gallery .media-prev { left: 5px; }
  .card-gallery .media-next { right: 5px; }  /* prev와 대칭 */
}

@media print {
  .media-nav, .media-count { display: none !important; }
  .media-gallery-track { transform: none !important; }
  .media-gallery-slide:not(:first-child) { display: none !important; }
}

/* SEO_EXPLORE_V1 — server-rendered facet page fallback (api/explore.js).
   크롤러와 app.js 부팅 직전에만 보이므로 의도적으로 단순하게 둔다. */
.seo-explore-fallback { max-width:1040px; margin:0 auto; padding:32px 22px 64px; color:var(--ink,#1c1e1a); }
.seo-explore-fallback nav[aria-label="breadcrumb"] { font-size:11px; letter-spacing:.02em; color:var(--muted,#6e7168); }
.seo-explore-fallback nav[aria-label="breadcrumb"] a { color:inherit; }
.seo-explore-fallback header { margin:18px 0 26px; }
.seo-explore-fallback h1 { margin:0 0 8px; font-size:26px; font-weight:700; letter-spacing:-.028em; }
.seo-explore-fallback h1 small { margin-left:9px; font-size:13px; font-weight:500; color:var(--muted,#6e7168); }
.seo-explore-fallback header p { margin:0; max-width:62ch; font-size:13.5px; line-height:1.7; color:var(--muted,#6e7168); }
.seo-card-list { list-style:none; margin:0; padding:0; display:grid; grid-template-columns:repeat(auto-fill,minmax(250px,1fr)); gap:18px; }
.seo-card article { height:100%; padding:15px 16px 14px; border:1px solid var(--line,#dedcd2); border-radius:8px; background:rgba(255,255,255,.45); }
.seo-idx { font:650 9px/1 Inter,sans-serif; letter-spacing:.1em; color:var(--faint,#9a9d93); }
.seo-card h3 { margin:6px 0 2px; font-size:14.5px; font-weight:650; letter-spacing:-.018em; }
.seo-card h3 a { color:inherit; text-decoration:none; }
.seo-card h3 a:hover { text-decoration:underline; }
.seo-card img { width:100%; height:auto; margin:8px 0 10px; border-radius:5px; object-fit:cover; }
.seo-card p { margin:0 0 10px; font-size:12.5px; line-height:1.6; color:var(--muted,#6e7168); }
.seo-card dl { margin:0; display:grid; gap:3px; font-size:11.5px; }
.seo-card dl > div { display:flex; gap:8px; }
.seo-card dt { flex:none; width:60px; color:var(--faint,#9a9d93); }
.seo-card dd { margin:0; min-width:0; }
.seo-related { margin-top:40px; }
.seo-related h2 { margin:0 0 12px; font:650 10px/1 Inter,sans-serif; letter-spacing:.1em; text-transform:uppercase; color:var(--muted,#6e7168); }
.seo-related ul { list-style:none; margin:0; padding:0; display:flex; flex-wrap:wrap; gap:7px; }
.seo-related a { display:inline-block; padding:5px 11px; border:1px solid var(--line-dark,#c9c7bb); border-radius:999px; font-size:12px; color:inherit; text-decoration:none; }
.seo-related a:hover { border-color:var(--accent,#3f5d2e); background:var(--accent-soft,#eaf0dc); }


/* ABOUT_CRITERIA_V1 — 검증 기준 공개 페이지.
   기존 .about-page / .about-grid 위에 얹는다. 두 클래스의 기본 규칙은
   styles.css 상단(약 304행)에 있으니 같이 확인할 것. */
.about-criteria { max-width: 1080px; margin-inline: auto; padding: 76px 0 96px; }
.about-criteria .about-lead { margin-bottom: 46px; }
.about-eyebrow { display: block; margin-bottom: 22px; color: var(--faint); font: 550 9px/1 Inter, sans-serif; letter-spacing: .13em; text-transform: uppercase; }
.about-criteria h1 { margin: 0 0 26px; font: 500 38px/1.26 "Pretendard Variable", Pretendard, sans-serif; letter-spacing: -.035em; }
.about-deck { margin: 0 0 15px; max-width: 640px; color: #4a4e46; font-size: 13.5px; line-height: 1.85; }
.about-deck:last-child { margin-bottom: 0; }
.about-link { border-bottom: 1px solid var(--line-dark); }
.about-link:hover { border-bottom-color: var(--ink); }

.about-stats { display: grid; gap: 1px; margin-bottom: 54px; background: var(--line); border: 1px solid var(--line); }
.about-stats-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.about-stat { padding: 17px 16px 15px; background: var(--surface); }
.about-stat b { display: block; font: 500 25px/1 Inter, sans-serif; letter-spacing: -.035em; }
.about-stat span { display: block; margin-top: 9px; color: var(--muted); font: 550 8.5px/1 Inter, sans-serif; letter-spacing: .11em; }
.about-stat em { display: block; margin-top: 5px; color: var(--faint); font-size: 10.5px; font-style: normal; }

/* 본문 블록은 <p>가 아니라 <div>를 감싸므로 상단의 .about-grid p 규칙이
   그대로 먹지 않는다. 아래에서 다시 잡아준다. */
.about-criteria .about-grid section { grid-template-columns: 190px minmax(0, 1fr); gap: 56px; padding: 30px 0; align-items: start; }
.about-criteria .about-grid section > div { max-width: 640px; }
.about-criteria .about-grid span { padding-top: 3px; font: 550 9px/1.5 Inter, sans-serif; letter-spacing: .11em; text-transform: uppercase; }
/* 본문 글씨는 사이트 전체가 13.5px 이다 (.about-deck, 상세 .detail-section > p).
   여기만 12.5px 라 한 줄이 최대 74자까지 늘어났다. 폭은 그대로 두고 글씨만 맞춘다. */
.about-criteria .about-grid p { margin: 0 0 11px; color: #4f534b; font-size: 13.5px; line-height: 1.92; }
.about-criteria .about-grid p:last-child { margin-bottom: 0; }
.about-criteria .about-grid b { font-weight: 600; color: var(--ink); }
.about-criteria code { padding: 1px 5px; border-radius: 2px; background: rgba(23,26,23,.055); font-family: Inter, ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; letter-spacing: 0; }

.about-list { margin: 0 0 11px; padding: 0; list-style: none; display: grid; gap: 9px; }
.about-list:last-child { margin-bottom: 0; }
.about-list li { padding-left: 15px; position: relative; color: #4f534b; font-size: 12.5px; line-height: 1.85; }
.about-list li::before { content: ""; position: absolute; left: 0; top: .78em; width: 5px; height: 1px; background: var(--line-dark); }


.about-mail { margin-top: 14px !important; }
.about-mail a { border-bottom: 1px solid var(--line-dark); font-size: 13px; }
.about-mail a:hover { border-bottom-color: var(--ink); }

/* 타일 3개일 때 2열로 두면 하나가 혼자 남는다. 좁아지면 바로 1열로 간다. */
@media (max-width: 640px) {
  .about-stats-3 { grid-template-columns: 1fr; }
}
@media (max-width: 1180px) {
  .about-criteria .about-grid section { grid-template-columns: 150px minmax(0, 1fr); gap: 34px; }
}
@media (max-width: 640px) {
  .about-criteria { padding-top: 50px; }
  .about-criteria h1 { font-size: 24px; }
  .about-criteria .about-grid section { grid-template-columns: 1fr; gap: 10px; }
  .about-criteria .about-grid span { padding-top: 0; }
  /* 헤더 nav는 좁은 화면에서 이미 8px까지 줄어 있다. 항목을 하나 더 밀어넣지 않고
     여기서만 숨긴다 — 푸터 About 링크와 홈 레일 링크가 같은 곳을 가리킨다. */
  .nav a.nav-about { display: none; }
  /* LOG_V1 — Log 를 넣으면 좁은 화면 nav 가 넷이 된다. Log 는 숨기지 않는다:
     인스타 유입이 거의 전부 모바일이라 여기서 가려지면 탭을 만든 뜻이 없다.
     대신 저장·비교 개수 배지를 숨긴다. 실측(2026-08-17, 320~420px):

       배지 상태            Log 전        Log 후        배지 숨김 후
       빈칸(처음 온 사람)     한 줄         한 줄         한 줄
       1~2자리(재방문)      ≤375 두 줄    ≤420 두 줄     한 줄

     Log 없이도 ≤375px 에서 이미 두 줄이었다. 이 한 줄이 그 회귀까지 같이 없앤다.
     배지를 다시 보이려면 이 선언만 지우면 된다 — 그러면 재방문 화면이 두 줄이 된다.
     숫자는 9px 이라 이 폭에서 사실상 안 읽히고, 담긴 것은 Collections 화면에 있다. */
  .nav a span { display: none; }
}


/* CERTIFICATION_V1 — 상세 페이지 인증서 목록.
   국내 소재는 환경표지·환경성적표지·저탄소·GR 이 주 근거라 이 자리가 비면
   근거를 넣어도 보이지 않는다. 근거 등급 배지는 .evidence-item 과 같은 체계를 쓴다. */
/* 810px 상한은 .evidence-list·.source-list와 같다. 없으면 1680px에서 1288px까지
   늘어나 오른쪽 끝 .level 배지가 인증서 이름에서 1100px 떨어진다 (규칙 5). */
.cert-list { display: grid; gap: 1px; max-width: 810px; background: var(--line); border: 1px solid var(--line); }
.cert-item { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 6px 14px; padding: 12px 14px; background: var(--surface); align-items: start; }
.cert-item strong { grid-column: 1; font-size: 12.5px; font-weight: 600; letter-spacing: -.01em; }
.cert-item > div { grid-column: 1; display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px; }
.cert-item .cert-no { font: 450 10.5px/1.4 Inter, ui-monospace, monospace; color: var(--muted); letter-spacing: .02em; }
.cert-item small { font-size: 10.5px; }
.cert-item .level { grid-column: 2; grid-row: 1 / span 2; align-self: center; }
.cert-item.expired strong { color: var(--muted); }
.cert-item.expired small { color: #a2534b; }

/* =========================================================
   SSR 폴백 — app.js 가 부팅하기 전 한 프레임 동안 보이는 화면.
   구글은 렌더링을 하므로 이 상태를 본다. 부팅되면 #app 이 통째로 갈아치워지므로
   아래 규칙은 그 뒤로는 어디에도 안 걸린다. 기존 선택자를 건드리지 않는 순수 추가.
   마크업은 api 의 explore.js · material.js 가 만든다.
   ========================================================= */

/* /explore·패싯 — 컨테이너와 목록은 이미 잡혀 있다. 붙어 나오는 조각만 뗀다.
   지금은 "01HONEXT® Board재생 셀룰로오스 인테리어 보드" 처럼 한 덩어리로 읽힌다. */
.seo-card .seo-idx { margin-right: 9px; }
.seo-card .seo-ko { display: block; margin-top: 3px; }

/* 소재 상세 폴백 — 여기는 아무것도 안 걸려 있었다.
   컨테이너 폭이 없어 본문이 1680px 를 한 줄로 채우고,
   <img> 에 max-width 가 없어 420px 화면에서 문서가 1800px 로 벌어졌다
   (가로 1,380px 넘침). 구글 모바일 사용성 신호에 걸리는 상태였다. */
.seo-material-fallback {
  max-width: 1040px;
  margin-inline: auto; /* 규칙 1 — max-width 와 같이 다닌다 */
  padding: 32px 22px 64px;
}
.seo-material-fallback img {
  display: block;
  max-width: 100%;
  height: auto;
  margin: 18px 0;
}

/* =========================================================
   NEWSLETTER_V1 — 구독 블록. 홈 하단과 /about 하단 두 자리에 같은 마크업이 온다.
   (SPA 라 동시에 살아 있지 않다 — 스티비의 "한 페이지에 폼 하나" 제약을 지킨다.)

   기존 선택자를 하나도 건드리지 않는 순수 추가다. 규칙 9 에 따라 이 컴포넌트의
   기본값과 반응형을 여기 한자리에 붙여 둔다. 뒤에 조건 없는 블록을 더 얹지 말 것.

   라임(--signal)은 쓰지 않는다. 라임은 "확인된 것·귀한 것" 표식이고
   구독 권유는 거기 해당하지 않는다 (design-rules 라임 용법).
   ========================================================= */
.newsletter {
  max-width: 1080px;
  margin: 64px auto 0; /* 규칙 1 — max-width 와 margin-inline 은 같이 다닌다 */
  padding-top: 42px;
  border-top: 1px solid var(--line);
  display: grid;
  grid-template-columns: minmax(0, 1fr) 320px;
  gap: 56px;
  align-items: start;
}
/* /about 은 이미 96px 아래 여백을 갖고 끝난다. 둘을 더하면 160px 이 된다. */
.about-page + .newsletter { margin-top: 0; }
.newsletter-eyebrow {
  display: block;
  margin-bottom: 14px;
  color: var(--faint);
  font: 550 9px/1 Inter, sans-serif;
  letter-spacing: .13em;
  text-transform: uppercase;
}
.newsletter h2 {
  margin: 0 0 14px;
  font: 500 22px/1.35 "Pretendard Variable", Pretendard, sans-serif;
  letter-spacing: -.03em;
}
.newsletter p {
  margin: 0 0 10px;
  max-width: 640px; /* 규칙 2 — 한국어 본문 40~50자 */
  color: #4a4e46;
  font-size: 13.5px;
  line-height: 1.85;
}
/* .newsletter-note 는 규칙을 두지 않는다 — .newsletter p (0,1,1) 이 이겨서 어차피
   안 먹었고, 지금 화면(본문과 같은 13.5px)이 확정된 모습이다. 작고 흐리게 하려면
   .newsletter p.newsletter-note 로 올릴 것. */
/* --- 스티비가 내보낸 마크업에 우리 값을 준다 ---------------------------------
   id·class 는 스티비 스크립트가 잡는 이름이라 바꾸지 않는다. 스티비 기본
   스타일시트(resource.stibee.com/…/stb_subscribe_form_style.css)는 부러 안
   불러온다 — 사이트 디자인과 충돌한다. CSS 는 각자 쓰는 것이라고 문서에 있다.

   ⚠ `.blind` 는 스티비 스타일시트에 있던 규칙이다. 여기서 다시 정의하지 않으면
     **동의 안내 모달이 처음부터 열린 채로 보인다.** 남의 스타일시트를 빼면
     그쪽이 숨기고 있던 것까지 같이 딸려 온다.
   ⚠ 모달은 position: fixed 다. 조상에 transform·filter·backdrop-filter 가 생기면
     기준 상자가 그 조상으로 바뀐다 (/explore 툴바에서 같은 일이 있었다). */
#stb_subscribe .blind { display: none; }
.stb_form_set, .stb_form_set_submit { margin: 0; padding: 0; border: 0; min-inline-size: 0; }
.stb_form_set_label {
  display: block;
  margin-bottom: 7px;
  color: var(--muted);
  font: 550 8.5px/1 Inter, sans-serif;
  letter-spacing: .11em;
  text-transform: uppercase;
}
.stb_asterisk { margin-left: 3px; color: var(--faint); }
.stb_form_set_input {
  width: 100%;
  min-height: 39px;
  padding: 0 12px;
  border: 1px solid var(--line-dark);
  border-radius: 0;
  background: var(--surface);
  color: var(--ink);
  font-size: 13px;
}
.stb_form_set_input:focus { border-color: var(--accent); outline: none; }
/* 체크박스를 흐름에서 빼내 "(필수) 개인정보 수집 및 이용에 동의합니다." 가
   한 문장으로 이어지게 둔다. flex 로 묶으면 버튼 뒤의 "에 동의합니다." 가
   따로 떨어져 줄이 갈린다. */
.stb_form_policy { margin-top: 12px; color: var(--muted); font-size: 10.5px; line-height: 1.6; }
.stb_form_policy > label { display: block; position: relative; padding-left: 21px; cursor: pointer; }
.stb_form_policy > label > input { position: absolute; left: 0; top: 2px; margin: 0; accent-color: var(--accent); }
.stb_form_policy > label > span { color: var(--faint); }
.stb_form_modal_open_btn {
  padding: 0;
  border: 0;
  border-bottom: 1px solid var(--line-dark);
  background: transparent;
  color: var(--muted);
  font-size: 10.5px;
}
.stb_form_modal_open_btn:hover { color: var(--ink); border-bottom-color: var(--ink); }
.stb_form_msg_error { margin-top: 5px; color: #a2534b; font-size: 10px; line-height: 1.5; }
.stb_form_result { margin-top: 10px; font-size: 10.5px; line-height: 1.6; }
.stb_form_msg_error:empty, .stb_form_result:empty { display: none; }
.stb_form_submit_button {
  width: 100%;
  min-height: 39px;
  margin-top: 14px;
  border: 1px solid var(--ink);
  border-radius: 0;
  background: var(--ink);
  color: #fff;
  font-size: 9px;
  font-weight: 700;
  letter-spacing: .06em;
}
.stb_form_submit_button:hover { background: #000; }

/* 동의 안내 모달 */
.stb_form_modal { position: fixed; inset: 0; z-index: 200; display: grid; place-items: center; }
.stb_form_modal_bg { position: absolute; inset: 0; background: rgba(21, 22, 21, .45); }
.stb_form_modal_body {
  position: relative;
  z-index: 1;
  max-width: 460px;
  margin: 22px;
  padding: 26px 26px 20px;
  border: 1px solid var(--line-dark);
  background: var(--surface);
}
/* .stb_form_modal_title 도 두지 않는다 — .newsletter h2 (0,1,1) 가 이긴다.
   모달 제목은 지금 .newsletter h2 값(22px)으로 나오고 그게 확정된 모습이다. */
.stb_form_modal_text { color: #4a4e46; font-size: 12px; line-height: 1.8; white-space: pre-line; }
.stb_form_modal_btn { margin-top: 18px; text-align: right; }
.stb_form_modal_close_btn {
  min-height: 32px;
  padding: 0 16px;
  border: 1px solid var(--line-dark);
  background: transparent;
  color: var(--ink);
  font-size: 9px;
  font-weight: 700;
  letter-spacing: .06em;
}
.stb_form_modal_close_btn:hover { border-color: var(--ink); }

@media (max-width: 900px) {
  .newsletter { grid-template-columns: minmax(0, 1fr); gap: 30px; margin-top: 48px; padding-top: 34px; }
}
/* iOS Safari 는 포커스된 입력의 글씨가 16px 미만이면 페이지를 확대한다.
   .search-large input 과 같은 이유·같은 브레이크포인트. */
@media (max-width: 680px) {
  .stb_form_set_input { font-size: 16px; }
}

/* =========================================================
   GSEED_V1 — 인증 행 옆 G-SEED 항목 칩 + 안내 한 줄. 순수 추가.
   근거 배지(.level)와 같은 규칙 — 색 한 계열, 채움 정도로 구분, 모서리 2px (규칙 7).
   verified 만 채움, documented 는 테두리, unknown 은 점선. 인증 마크처럼 보이면 안 된다.
   ========================================================= */
.gseed-chip {
  display: inline-block;
  vertical-align: 2px;
  margin-left: 8px;
  padding: 1px 6px;
  border: 1px solid var(--line-dark);
  border-radius: 2px;
  font: 600 8.5px/1.6 Inter, sans-serif;
  letter-spacing: .04em;
  /* 이 color 는 지우지 말 것. 아래 네 상태 클래스에 늘 가려 css-winners 가
     "한 번도 못 이기는 선언" 으로 보고하지만, evidence_level 에는 claimed 도 있고
     .gseed-chip.claimed 규칙은 없다. claimed 인증이 들어오면 이게 유일한 색이다. */
  color: var(--muted);
  background: transparent;
  white-space: nowrap;
}
.gseed-chip.verified   { border-color: #b3c2b1; background: #e9efe6; color: #3f5544; }
.gseed-chip.documented { border-color: #c4d0c5; color: #55684f; }
.gseed-chip.unknown    { border-style: dashed; color: var(--faint); }
.gseed-chip.expired    { border-style: dashed; color: var(--faint); background: transparent; text-decoration: line-through; }
/* .detail-section > p (0,1,1) 가 .gseed-note (0,1,0) 를 이긴다 — 뒤에 써도 진다.
   특이도를 맞춘다. 하네스로 잡았다 (max-width 810 · 13.5px 이 그대로 나옴). */
.detail-section > p.gseed-note {
  grid-column: 2;     /* .detail-section 은 180px 1fr 그리드 — 이게 없으면 라벨 열(180px)로 떨어진다. */
  margin: 12px 0 0;
  max-width: 640px;   /* 규칙 2 — 본문 폭 */
  color: var(--faint);
  font-size: 10.5px;
  line-height: 1.7;
}
/* 마지막 필터의 메뉴는 오른쪽 기준으로 편다. left:0 이면 min-width 222px 메뉴가 툴바
   오른쪽 끝을 넘어 가로 스크롤을 만든다 (Availability 가 마지막일 때부터 있던 문제 —
   하네스가 첫 메뉴만 열어서 못 봤다. G-SEED 가 6번째로 붙으면서 확인). 640px 이하는
   position:fixed 규칙이 따로 있어 그대로 둔다. */
@media (min-width: 641px) {
  .filters > .filter:last-child > .filter-menu { left: auto; right: 0; }
}
/* 640px 이하에서 .detail-section 은 1열이다 (246행). 2열 지정이 남으면 빈 열이 생긴다. */
@media (max-width: 640px) {
  .detail-section > p.gseed-note { grid-column: 1; }
}

/* ===========================================================================
   LOG_V1 (2026-08-17) — 읽을거리 /log · /log/:slug
   ---------------------------------------------------------------------------
   본문은 DB(`log_archive_public.body_html`)가 원본이라 여기서 쓸 수 있는 훅이
   태그와 소수의 클래스뿐이다. 그래서 `.log-body` 를 조상으로 잡는다.
   ⚠ 두 부분 선택자(0,1,1)가 단일 클래스(0,1,0)를 이긴다. `.log-body p` 를 둔 뒤에
     `.log-draft-note` 같은 단일 클래스로 그 값을 되돌리려 하면 진다.
     본문 안의 예외는 전부 `.log-body <태그>.<클래스>` 로 특이도를 맞춰 쓸 것.
   ⚠ 라임(--signal)은 "확인된 것" 표식이다. 이 블록 어디에도 쓰지 않는다.
     구독 버튼도 기존대로 --ink 검정이다.
   =========================================================================== */

.log-page { max-width: 1040px; margin-inline: auto; padding: 0 0 8px; }
/* 글 페이지는 **읽는 폭 하나**로 통일하고 가운데 정렬한다.
   목록(1040px)의 폭을 그대로 쓰면서 본문만 640px 로 두면 오른쪽에 400px 가 비고
   글이 왼쪽으로 몰린 것처럼 보인다 (2026-08-19 실측: 본문 left 180 / right 580).
   /about 은 190px 라벨 열이 그 자리를 채우지만 글에는 라벨 열이 없다.
   머리글·본문·표·카드가 같은 단을 쓰게 해서 축을 하나로 만든다. */
.log-page.log-entry { max-width: 720px; }
.log-page.log-entry .log-body { max-width: none; }
.log-head { margin-bottom: 30px; padding-bottom: 22px; border-bottom: 1px solid var(--line); }
.log-lede { margin: 12px 0 0; max-width: 62ch; color: var(--muted); font-size: 13.5px; line-height: 1.75; }
.log-list-skeleton { min-height: 320px; }

/* 목록 */
.log-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 0; }
.log-item { border-bottom: 1px solid var(--line); }
.log-item > a { display: block; position: relative; padding: 24px 44px 24px 0; color: inherit; text-decoration: none; }
.log-item > a:hover { background: rgba(255, 255, 255, .45); }
.log-item-kind { margin: 0; font: 550 8.5px/1 Inter, sans-serif; letter-spacing: .11em; text-transform: uppercase; color: var(--muted); }
.log-item h2 { margin: 9px 0 0; max-width: 34ch; font-size: 20px; font-weight: 650; letter-spacing: -.026em; line-height: 1.35; }
.log-item-deck { margin: 8px 0 0; max-width: 58ch; color: var(--muted); font-size: 13px; line-height: 1.7; }
.log-item-date { margin: 11px 0 0; color: var(--faint); font-size: 10.5px; letter-spacing: .02em; }
.log-item .card-link-mark { position: absolute; top: 24px; right: 6px; }

/* 글 */
.log-crumb { font-size: 11px; letter-spacing: .02em; color: var(--muted); }
.log-crumb a { color: inherit; }
.log-entry-head { margin: 16px 0 34px; padding-bottom: 26px; border-bottom: 1px solid var(--line); }
.log-entry-head h1 { margin: 10px 0 0; max-width: 22ch; font-size: 34px; font-weight: 700; letter-spacing: -.032em; line-height: 1.22; }
.log-deck { margin: 14px 0 0; max-width: 54ch; color: var(--muted); font-size: 15px; line-height: 1.7; }

/* 본문 — 폭은 위 `.log-page.log-entry`(720px) 한 곳에서만 정한다.
   2026-08-19 단 통일 전에는 여기 `.log-body { max-width: 640px }` 가 있었는데,
   `.log-page.log-entry .log-body { max-width: none }`(0,3,0)에 늘 져서 한 번도 안 먹었다.
   `.log-body` 는 app.js 에서 `article.log-page.log-entry` 안에서만 만들어진다(app.js 2055행).
   같은 이유로 `@media (max-width:640px)` 안의 `.log-body { max-width: none }` 도 같이 뺐다 —
   미디어 쿼리는 특이도를 올려 주지 않으므로 그것도 한 번도 못 이기고 있었다.
   2026-08-20 css-winners 가 둘 다 "한 번도 못 이기는 선언" 으로 보고, 전수 스냅샷 차이 0 으로 확인함. */
.log-body h2 { margin: 44px 0 14px; font-size: 19px; font-weight: 650; letter-spacing: -.024em; line-height: 1.4; }
.log-body h3 { margin: 30px 0 10px; font-size: 14.5px; font-weight: 650; letter-spacing: -.014em; }
.log-body p { margin: 0 0 15px; font-size: 14px; line-height: 1.85; }
.log-body ul, .log-body ol { margin: 0 0 18px; padding-left: 20px; }
.log-body li { margin-bottom: 8px; font-size: 14px; line-height: 1.8; }
.log-body a { color: inherit; text-decoration: underline; text-underline-offset: 2px; text-decoration-color: var(--line-dark); }
.log-body a:hover { text-decoration-color: currentColor; }
.log-body code { padding: 1px 5px; border: 1px solid var(--line); background: rgba(255, 255, 255, .55); font-size: 12px; }
.log-body pre { margin: 0 0 18px; padding: 14px 15px; overflow-x: auto; border: 1px solid var(--line); background: rgba(255, 255, 255, .45); }
.log-body pre code { padding: 0; border: 0; background: none; font-size: 12px; line-height: 1.8; white-space: pre-wrap; }
.log-body blockquote { margin: 0 0 22px; padding-left: 17px; border-left: 2px solid var(--line-dark); }
.log-body blockquote p { color: var(--muted); font-size: 15px; line-height: 1.8; }
.log-body figure { margin: 0 0 20px; }
.log-body img { display: block; max-width: 100%; height: auto; }
.log-body figcaption { margin-top: 7px; color: var(--faint); font-size: 10.5px; line-height: 1.6; }

/* 표 — 근거 표(.log-evidence)와 자료 표(.log-table).
   좁은 화면에서 가로 스크롤을 허용한다. 셀을 접으면 어느 값이 어느 열인지 무너진다. */
.log-body table { width: 100%; margin: 0 0 20px; border-collapse: collapse; font-size: 12.5px; }
.log-body caption { margin-bottom: 8px; text-align: left; color: var(--faint); font-size: 10.5px; line-height: 1.6; }
.log-body th, .log-body td { padding: 9px 10px; border-bottom: 1px solid var(--line); text-align: left; vertical-align: top; line-height: 1.6; }
.log-body thead th { border-bottom-color: var(--line-dark); color: var(--muted); font: 550 8.5px/1.4 Inter, sans-serif; letter-spacing: .09em; text-transform: uppercase; }
.log-body table.log-evidence { border: 1px solid var(--line-dark); table-layout: fixed; }
.log-body table.log-evidence th, .log-body table.log-evidence td { padding-inline: 12px; }
/* 열 폭을 균등하게 주지 않는다 — 주장은 길고 근거는 짧다 (뉴스레터 챗 D절).
   table-layout: fixed 라서 첫 행의 th 폭이 표 전체를 결정한다. */
.log-body table.log-evidence th:nth-child(1) { width: 46%; }
.log-body table.log-evidence th:nth-child(2) { width: 21%; }
.log-body table.log-evidence th:nth-child(3) { width: 33%; }
/* 출처 셀 — <a> 가 있는 줄과 없는 줄이 같은 크기·같은 자리로 보여야 한다.
   링크 없는 줄에 빈 <a> 나 # 를 넣지 않는다. */
.log-body table.log-evidence td:nth-child(3) { color: var(--muted); font-size: 11.5px; line-height: 1.65; }
/* 근거 셀 — 배지는 기존 .level 을 그대로 쓴다(4단계 + .official).
   강등 사유 <small> 은 배지 **아래 줄**로 내린다. 한 줄로 붙으면 등급이 안 보인다. */
.log-body td.evidence-cell .level { min-width: 0; padding: 2px 8px; font-size: 9px; }
.log-body td.evidence-cell small { display: block; margin-top: 5px; color: var(--faint); font-size: 10px; line-height: 1.6; }

/* 확인하지 못한 것 — 점선 테두리. 미확인 표식은 라임이 아니라 점선이다
   (research/design-rules.md, 라임 용법 2026-08-13). */
.log-body ul.log-unconfirmed { margin: 0 0 20px; padding: 15px 17px 15px 34px; border: 1px dashed var(--line-dark); list-style: disc; }
.log-body ul.log-unconfirmed li { margin-bottom: 9px; color: var(--muted); font-size: 13px; }
.log-body ul.log-unconfirmed li:last-child { margin-bottom: 0; }
.log-body ul.log-sources li { color: var(--muted); font-size: 12.5px; line-height: 1.75; }

/* 초안 표시 — 원고에 아직 문장이 안 들어간 자리.
   발행분에는 남아 있으면 안 된다. 눈에 띄게 둔 것이 목적이다. */
.log-body p.log-draft-note {
  margin: 0 0 15px;
  padding: 10px 12px;
  border: 1px dashed #b08a4a;
  background: rgba(255, 249, 235, .7);
  color: #7a5c22;
  font-size: 12px;
  line-height: 1.7;
}

/* 본문 안 소재 카드 */
/* 본문 안 소재 카드.
   ⚠ `.material-grid`(5열 고정)를 물려받으면 안 된다 — 640px 본문 단 안에서 카드 하나가
     1/5 폭(약 115px)으로 쪼그라들어 왼쪽에 붙는다. 2026-08-19 배포에서 그렇게 나갔다.
     여기서는 카드 수에 맞춰 폭을 잡고 가운데로 모은다. */
.log-materials { margin: 26px 0 24px; display: grid; gap: 14px; justify-content: center;
  grid-template-columns: repeat(auto-fit, minmax(240px, 320px)); }
.seo-card-list.log-materials { grid-template-columns: repeat(auto-fit, minmax(240px, 320px)); justify-content: center; }
.log-web { margin: 30px 0 0; font-size: 12.5px; }
.log-web a { color: var(--muted); }
.log-foot { margin-top: 38px; padding-top: 20px; border-top: 1px solid var(--line); font-size: 12.5px; }
.log-foot a { color: var(--muted); }

@media (max-width: 640px) {
  .log-entry-head h1 { font-size: 26px; }
  .log-deck { font-size: 14px; }
  .log-item h2 { font-size: 17px; }
  /* 자료 표(.log-table)는 **비교하는 표**라 열을 지킨다. 가로로 민다. */
  .log-body table { display: block; overflow-x: auto; white-space: nowrap; }
  .log-body td, .log-body th { white-space: normal; min-width: 96px; }

  /* 근거 표(.log-evidence)는 **읽는 표**다. 한 행이 주장 하나라서 세로로 접는다.
     가로 스크롤을 주면 주장 셀이 길어서 근거·출처가 화면 밖으로 나간다 —
     근거를 보여주려고 만든 표에서 근거가 안 보이게 된다.
     열 이름은 thead 를 숨기고 출처에만 다시 붙인다. 첫 열은 주장 자체라
     이름이 필요 없고, 근거는 배지가 스스로 말한다.
     ⚠ `.log-body table` (0,1,1) 을 이기려고 전부 (0,2,2) 이상으로 쓴다. */
  .log-body table.log-evidence { display: block; overflow-x: visible; white-space: normal; border: 0; table-layout: auto; }
  .log-body table.log-evidence thead { display: none; }
  .log-body table.log-evidence tbody,
  .log-body table.log-evidence tr,
  .log-body table.log-evidence td { display: block; width: auto; min-width: 0; }
  .log-body table.log-evidence tr { padding: 15px 0; border-bottom: 1px solid var(--line); }
  .log-body table.log-evidence tr:first-child { padding-top: 0; }
  .log-body table.log-evidence td { padding: 0; border: 0; }
  .log-body table.log-evidence td:nth-child(1) { font-size: 13.5px; line-height: 1.75; }
  .log-body table.log-evidence td:nth-child(2) { margin-top: 10px; }
  .log-body table.log-evidence td:nth-child(3) { margin-top: 11px; font-size: 11.5px; }
  .log-body table.log-evidence td:nth-child(3)::before {
    content: "출처";
    display: block;
    margin-bottom: 3px;
    font: 550 8.5px/1 Inter, sans-serif;
    letter-spacing: .11em;
    color: var(--faint);
  }
}

/* SSR 폴백 — 부팅 전 한 프레임 동안 보이고, 구글은 이 상태를 본다.
   부팅 뒤에는 .seo-* 가 DOM 에 없으므로 이 규칙들은 어디에도 안 걸린다.
   ⚠ tools/harness-lib.js 의 ROUTES 에 log 라우트를 등록해 두지 않으면
     다음 CSS 정리 회차에서 "죽은 선택자"로 지워진다. 토스트·뉴스레터에서
     이미 두 번 밟은 함정이다. */
.seo-log-fallback { max-width: 1040px; margin: 0 auto; padding: 32px 22px 64px; color: var(--ink, #1c1e1a); }
.seo-log-fallback nav[aria-label="breadcrumb"] { font-size: 11px; letter-spacing: .02em; color: var(--muted, #6e7168); }
.seo-log-fallback nav[aria-label="breadcrumb"] a { color: inherit; }
.seo-log-fallback header { margin: 18px 0 26px; }
.seo-log-fallback h1 { margin: 0 0 8px; font-size: 26px; font-weight: 700; letter-spacing: -.028em; }
.seo-log-fallback h1 small { margin-left: 9px; font-size: 13px; font-weight: 500; color: var(--muted, #6e7168); }
.seo-log-fallback header p { margin: 0; max-width: 62ch; font-size: 13.5px; line-height: 1.7; color: var(--muted, #6e7168); }
.seo-log-list { list-style: none; margin: 0; padding: 0; }
.seo-log-item { padding: 16px 0; border-bottom: 1px solid var(--line, #dedcd2); }
.seo-log-item h2 { margin: 5px 0 4px; font-size: 17px; font-weight: 650; letter-spacing: -.022em; }
.seo-log-item h2 a { color: inherit; text-decoration: none; }
.seo-log-item p { margin: 0; font-size: 12.5px; line-height: 1.65; color: var(--muted, #6e7168); }
.seo-log-kind { font: 550 8.5px/1 Inter, sans-serif; letter-spacing: .11em; text-transform: uppercase; }
/* .seo-log-item p (0,1,1) 가 .seo-log-date (0,1,0) 를 이긴다 — 뒤에 써도 진다.
   margin-top·color·font-size 셋이 전부 가려졌다 (css-winners 로 잡음).
   .gseed-note·.product-note 와 똑같은 함정이라 똑같이 특이도를 맞춘다. */
.seo-log-item p.seo-log-date { margin-top: 6px; color: var(--faint, #9a9d93); font-size: 10.5px; }
.seo-log-body { max-width: 640px; margin-top: 8px; font-size: 14px; line-height: 1.85; }
.seo-log-body img { display: block; max-width: 100%; height: auto; margin: 16px 0; }
.seo-log-body table { width: 100%; margin: 0 0 18px; border-collapse: collapse; font-size: 12.5px; }
.seo-log-body th, .seo-log-body td { padding: 8px 10px; border-bottom: 1px solid var(--line, #dedcd2); text-align: left; vertical-align: top; }
.seo-log-web { margin-top: 24px; font-size: 12.5px; }
