/* Hallmark · genre: playful · macrostructure: Ecosystem Index (픽 → 최저 캐러셀 → 내림 목록) · theme: custom
 * vibe: 크림 종이 위 배(pear) 노랑 스티커 + 잉크 2px 선 + 하드 섀도 — 리소 포스터
 * paper #FFFBF2 · ink #2A2418 · accent pear #F7DD5A / coral #BF3F2A · display Black Han Sans + Gothic A1 900 · body Noto Sans KR · numbers Manrope
 * 대비: 코럴 글자 5.13 · 코럴 버튼 위 흰 글자 5.72 · 회색 5.41 · 다크 회색 7.78 (2026-09-06 계산) */
:root {
  --paper: #FFFBF2; --paper-2: #FFFFFF; --ink: #2A2418; --muted: #6F6758; --line: #E9E1CC;
  --pear: #F7DD5A; --pear-ink: #2A2418; --ava-bg: #FFFBF2; --coral: #BF3F2A; --coral-face: #B83A25; --on-coral: #FFFFFF;
  --green: #1F7A4D; --sk: #EFE8D4; --sk-2: #F8F3E6; --shadow: #2A2418;
  /* 배 판은 테마와 무관하게 노랑이라, 그 위 강조색도 뒤집지 않는다(#A8331F 는 pear 위 4.89:1) */
  --on-pear-accent: #A8331F;
  --font-display: "Black Han Sans", "Gothic A1", "Noto Sans KR", sans-serif;
  --font-head: "Gothic A1", "Noto Sans KR", sans-serif;
  --font-body: "Noto Sans KR", -apple-system, "Apple SD Gothic Neo", sans-serif;
  --font-num: "Manrope", "Noto Sans KR", sans-serif;
  --ease-out: cubic-bezier(.16, 1, .3, 1); --dur: 220ms; --r: 18px;
}
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) {
  --paper: #1B1912; --paper-2: #26231B; --ink: #F1ECDF; --muted: #B3AC9B; --line: #3A362A;
  --coral: #FF8A6E; --coral-face: #C4402A; --green: #6FD39A; --sk: #2C2920; --sk-2: #36322A; --shadow: #000;
  --pin-edge: drop-shadow(0 0 1.5px #FFFBF2) drop-shadow(0 0 .5px #FFFBF2);
} }
:root[data-theme="dark"] {
  --paper: #1B1912; --paper-2: #26231B; --ink: #F1ECDF; --muted: #B3AC9B; --line: #3A362A;
  --coral: #FF8A6E; --coral-face: #C4402A; --green: #6FD39A; --sk: #2C2920; --sk-2: #36322A; --shadow: #000;
  --pin-edge: drop-shadow(0 0 1.5px #FFFBF2) drop-shadow(0 0 .5px #FFFBF2);
}
* { box-sizing: border-box; }
html { color-scheme: light dark; overflow-x: clip; }
body { margin: 0; background: var(--paper); color: var(--ink); font: 16px/1.5 var(--font-body); word-break: keep-all; overflow-wrap: break-word; overflow-x: clip; }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }
:focus-visible { outline: 3px solid var(--coral); outline-offset: 2px; }
main { max-width: 640px; margin: 0 auto; padding: 0 0 120px; }
.num { font-family: var(--font-num); font-variant-numeric: tabular-nums; }

/* 헤더 — 로고는 스티커처럼 배 노랑 위 잉크.
   위 여백에 안전 영역을 더한다 — iOS 앱(핫딜오리, contentInset never)에서 머리가 상태 막대 밑에 깔리지 않게.
   웹(Safari · 홈 화면 앱 status-bar-style default)에서는 이 값이 0 이라 지금 모습 그대로다 */
header.top { position: sticky; top: 0; z-index: 25; background: var(--paper);
  display: flex; justify-content: space-between; align-items: center; padding: calc(16px + env(safe-area-inset-top, 0px)) 18px 10px; }
/* 스크롤해서 내용이 헤더 밑으로 들어갈 때만 경계선을 준다 — 맨 위에서는 선이 없는 지금 모습 그대로 */
body.scrolled header.top { box-shadow: 0 2px 0 var(--ink); }
header.top h1 { margin: 0; font: 400 24px/1 var(--font-display); letter-spacing: 0; }
/* 로고 끝의 오리는 이름 쪽(왼쪽)을 본다 — 글자와 같은 잉크색 */
header.top h1 .duck { width: 22px; height: 22px; margin-left: 5px; vertical-align: -2px; }
header.top h1 a { display: inline-block; background: var(--pear); color: var(--pear-ink); padding: 6px 10px 4px; border: 2px solid var(--ink); box-shadow: 3px 3px 0 var(--shadow); transform: rotate(-1.5deg); }
header.top nav { display: flex; gap: 4px; align-items: center; margin-left: auto; }
/* 로그인했을 때 머리줄 오른쪽 프로필(2026-10-26). 계정 카드 아바타(44px · 닉네임 첫 글자 · 내 색)를 그대로 옮기고,
   로고 스티커처럼 그림자를 준다. 폰에선 탭이 아래로 내려가 머리줄에 로고와 이것만 남는다 */
/* 위아래 -3 · -2px: 누르는 칸은 44px 그대로 두되 줄 높이는 로고(39px) 기준 65px 를 지킨다 — 안 그러면 로그인한
   사람만 머리줄이 70px 가 되어 아래 화면이 5px 밀렸다(390px 실측) */
header.top .me-av { flex: none; width: 44px; height: 44px; margin: -3px 0 -2px 12px; display: grid; place-items: center; border: 2px solid var(--ink);
  border-radius: 999px; background: var(--pear); color: var(--pear-ink); font: 900 18px/1 var(--font-head); box-shadow: 3px 3px 0 var(--shadow); }
header.top .me-av[hidden] { display: none; }
/* 로그인하면 내 오리(핀 그림, 몸 색이 사람마다 다르다). 동그라미 바탕은 두 테마 모두 크림색 — 오리의 검은 니켈
   테두리가 어두운 바탕에 묻히지 않게(--ava-bg 는 다크 토큰에서 다시 정하지 않는다). 로그인 전엔 사람 모양 */
header.top .me-av { background: var(--ava-bg); overflow: hidden; }
header.top .me-av img, .acct-row .avatar img { width: 82%; height: auto; display: block; }
header.top .me-av.anon { background: var(--paper); color: var(--ink); }
header.top .me-av.anon svg { width: 22px; height: 22px; }
header.top nav a { font-size: 14px; font-weight: 700; padding: 7px 8px; border: 2px solid transparent; border-radius: 999px; white-space: nowrap; }
header.top nav a.on { border-color: var(--ink); }
/* 폰(640px 이하)에선 앱처럼 탭을 아래 고정 막대로(2026-10-23, 사용자가 목업에서 고름). 탭이 넷('인기')이 되자
   머리 한 줄에 안 들어갔다 — 로고 131 + 탭 236 = 367px > 390px 폰의 354px. 탭을 로고 아래 줄로 내리던 것(머리 111px)
   대신 엄지가 닿는 아래로 옮기고 머리는 로고 한 줄(65px)로 둔다. 생김새는 그대로: 켜진 칸은 로고 같은 배 노랑 스티커.
   아래 단추(.cta)가 있는 상세 · 공유 화면은 앱의 한 겹 들어간 화면처럼 탭 · 검색 · 띠를 걷고 머리에 뒤로 단추. */
header.top .tab-ic, .hback, .htitle { display: none; }
@media (max-width: 640px) {
  header.top nav { position: fixed; left: 0; right: 0; bottom: 0; z-index: 35; display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px;
    padding: 8px 10px calc(8px + env(safe-area-inset-bottom, 0px)); background: var(--paper); border-top: 2px solid var(--ink); }
  header.top nav a { flex-direction: column; justify-content: center; gap: 3px; min-height: 54px; padding: 4px 0; border-radius: 14px; }
  header.top nav a.on { background: var(--pear); color: var(--pear-ink); box-shadow: 3px 3px 0 var(--shadow); }
  header.top .tab-ic { display: block; width: 24px; height: 24px; }
  main { padding-bottom: calc(120px + env(safe-area-inset-bottom, 0px)); }
  /* body 를 붙인 건 세기를 올리려고 — 아래쪽 기본 규칙(.totop 20px · .toast 96px · .pwabar 12px)이 같은 세기로
     뒤에 와서 이 값을 덮었고, '맨 위로' · 설치 막대가 탭 막대의 '내 관심' 위에 얹혔다(2026-10-23 390px 실측) */
  body .totop { bottom: calc(96px + env(safe-area-inset-bottom, 0px)); }
  body .toast { bottom: calc(100px + env(safe-area-inset-bottom, 0px)); }
  body .pwabar { bottom: calc(90px + env(safe-area-inset-bottom, 0px)); }
  footer .foot-links { display: none; }          /* 내 관심 맨 아래(.mine-links)로 옮겼다. 파트너스 고지는 그대로.
                                                    footer 를 붙인 건 아래쪽 .foot-links { display: flex } 를 이기려고 */
  body:has(.cta) header.top nav, body:has(.cta) #searchForm, body:has(.cta) .ticker, body:has(.cta) #view > .back,
  body:has(.cta) header.top h1, body:has(.cta) header.top .me-av { display: none; }
  body:has(.cta) .hback { display: inline-flex; align-items: center; gap: 4px; min-height: 44px; padding: 0 14px 0 6px; font: 800 16px/1 var(--font-body);
    border: 2px solid var(--ink); border-radius: 999px; background: var(--paper-2); box-shadow: 3px 3px 0 var(--shadow); }
  body:has(.cta) .hback svg { width: 22px; height: 22px; }
  body:has(.cta) .htitle { display: block; font: 400 20px/1 var(--font-display); }
  body:has(.cta) header.top::after { content: ''; width: 84px; }   /* 제목을 가운데에 두는 오른쪽 짝 */
}
.mine-links { display: none; }
@media (max-width: 640px) {
  .mine-links { display: flex; flex-wrap: wrap; gap: 0 16px; margin: 20px 18px 0; }
  .mine-links a { min-height: 44px; display: inline-flex; align-items: center; font-weight: 700; text-decoration: underline; text-underline-offset: 3px; }
}



/* 내 계정 */
.acct { margin: 14px 18px 0; }
.acct-row { display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 12px 14px; border: 2px solid var(--ink); background: var(--paper-2); }
.acct-row b { font: 900 16px/1.3 var(--font-head); }
.acct-row .grow { flex: 1; min-width: 0; }
.acct-row .avatar { flex: none; width: 64px; height: 64px; display: grid; place-items: center; overflow: hidden;
  border: 2px solid var(--ink); border-radius: 999px; background: var(--ava-bg); box-shadow: 3px 3px 0 var(--shadow); }
.acct-btns { display: flex; flex-direction: column; gap: 6px; flex: none; }
.acct-row .sub { font-size: 13.5px; color: var(--muted); margin-top: 3px; line-height: 1.5; }
.acct-row .btn { padding: 8px 12px; font-size: 13.5px; white-space: nowrap; }
.acct-links { display: flex; gap: 16px; margin-top: 12px; }
.acct-links button { font: 700 13.5px/1 var(--font-head); color: var(--muted); text-decoration: underline; text-underline-offset: 3px; min-height: 32px; }
/* 평소엔 다른 링크와 같은 회색이다. 지우기는 자주 할 일이 아닌데 늘 빨갛게 두면
   그 화면에서 제일 눈에 띄는 것이 '지우기' 가 된다 — 한 번 누른 뒤에만 경고한다.
   그리고 armed 는 id 선택자(1,1,1)를 이겨야 한다. 예전엔 .armed(0,2,1) 가 져서
   빨간 바탕에 빨간 글자(대비 1.08:1)로 글자가 안 보였다. */
.acct-links button#wipe { color: var(--muted); }
.acct-links button#wipe.armed { color: var(--on-coral); background: var(--coral-face); border-color: var(--coral-face); border-radius: 999px; padding: 7px 12px; text-decoration: none; }
.acct-note { margin: 8px 18px 0; font-size: 13px; color: var(--muted); line-height: 1.6; }
/* 로그인 전 카드도 .acct 안에 들어간다 — 바깥 여백은 .acct 가 이미 갖고 있다 */
.acct .loginbox { margin: 0; }
.acct .acct-note { margin-left: 0; margin-right: 0; }
.acct-note a { text-decoration: underline; text-underline-offset: 3px; }
.nickedit { display: inline-flex; gap: 6px; align-items: center; }
.nickedit input { font: 700 15px/1 var(--font-body); padding: 7px 9px; border: 2px solid var(--ink); background: var(--paper); color: var(--ink); width: 8em; }
.nickedit .btn { padding: 7px 11px; font-size: 13.5px; }

/* 티커 — 오늘 숫자를 한 줄로 흘린다. 정보라서 있고, 움직임은 reduce 에서 멈춘다 */
.ticker { border-top: 2px solid var(--ink); border-bottom: 2px solid var(--ink); overflow: hidden; white-space: nowrap; font-size: 14px; font-weight: 700; padding: 7px 0; }
.ticker span { display: inline-block; padding-left: 100%; animation: tick 22s linear infinite; }
.ticker b { color: var(--coral); }
@keyframes tick { to { transform: translateX(-100%); } }
.ticker.sample { background: var(--pear); color: var(--pear-ink); }

/* 검색창. 입력 글자 16px 아래로 내리면 iOS 가 화면을 확대한다 — 안내 문구만 줄인다 */
.search { display: grid; grid-template-columns: 1fr auto; margin: 14px 18px 0; border: 2px solid var(--ink); background: var(--paper-2); box-shadow: 4px 4px 0 var(--shadow); }
.search input { font: 500 16px/1.2 var(--font-body); color: var(--ink); background: none; border: 0; padding: 12px 14px; min-width: 0; -webkit-appearance: none; border-radius: 0; }
.search input::placeholder { font-size: 14px; color: var(--muted); }
.search input:focus { outline: none; }
.search button { font-weight: 900; font-size: 15px; padding: 0 16px; border-left: 2px solid var(--ink); background: var(--pear); color: var(--pear-ink); }
.res-head { padding: 22px 18px 4px; font: 900 22px/1.2 var(--font-head); }
.res-head small { font: 800 14px/1 var(--font-num); color: var(--coral); margin-left: 6px; vertical-align: 3px; }
.live { margin: 14px 18px 0; padding: 12px 14px; border: 2px dashed var(--ink); font-size: 15px; }
.live .btn { margin-top: 10px; padding: 11px; }
/* margin 을 통째로 적는다. `margin-top` 만 적으면 141행의 전역 `.note`(좌우 18px)가
   좌우·아래에 그대로 남아 이 줄만 안쪽으로 밀린다 — 특이도로 이기는 것은 내가 이름을
   적은 속성뿐이다. 실측: 다른 줄은 왼쪽 34px 인데 이 줄만 52px 이었다. */
.live .note { font-size: 13px; color: var(--muted); margin: 8px 0 0; }
.live .sub { color: var(--muted); font-size: 14px; margin-top: 4px; }

/* 오늘의 픽 — 한 장의 포스터 */
.pick { display: block; margin: 18px 18px 0; background: var(--pear); color: var(--pear-ink); border: 2px solid var(--ink); box-shadow: 5px 5px 0 var(--shadow); padding: 18px 126px 16px 18px;   /* 오른쪽은 사진/이모지 자리 */ position: relative; overflow: hidden; transition: transform var(--dur) var(--ease-out); }
.pick:active { transform: translate(2px, 2px); box-shadow: 3px 3px 0 var(--shadow); }
.pick .kicker { font-size: 14px; font-weight: 700; letter-spacing: .06em; }
.pick h2 { font: 400 26px/1.2 var(--font-display); margin: 6px 0 10px; letter-spacing: 0; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.pick .thumb { position: absolute; right: 14px; bottom: 14px; width: 96px; height: 96px; background: var(--paper-2); border: 2px solid var(--ink); box-shadow: 3px 3px 0 var(--shadow); transform: rotate(4deg); overflow: hidden; }
/* object-fit 로 칸에 맞추는 이미지에는 min-width/min-height: 0 이 짝이다. 그리드·플렉스
   항목의 기본 최소 크기가 auto(= 콘텐츠 크기)라 height:100% 를 이기고, 칸이 정사각이 아니면
   그만큼 잘린다 — 상세 사진은 칸 480x360 에 이미지 476x476 로 위아래 116px 이 잘리고 있었다.
   예전에 'contain' 으로 고쳤다고 적어 둔 커밋(4f1cd04)이 사실은 안 먹고 있었다. */
.pick .thumb img { width: 100%; height: 100%; object-fit: contain; min-width: 0; min-height: 0; }
.pick .pr { display: flex; gap: 10px; align-items: baseline; }
.pick .now { font: 800 28px/1 var(--font-num); letter-spacing: -.02em; }
.pick .pct { color: var(--on-pear-accent); font: 800 18px/1 var(--font-num); }
.pick .unit { font-size: 14px; margin-top: 6px; opacity: .85; }
.pick .em { position: absolute; right: 12px; bottom: 6px; font-size: 64px; line-height: 1; transform: rotate(8deg); }
.sticker { position: absolute; right: 12px; top: 12px; background: var(--ink); color: var(--paper); font-size: 14px; font-weight: 800; padding: 5px 9px; transform: rotate(6deg); }

/* 섹션 머리 */
/* 제목과 오른쪽 버튼은 같은 줄로 읽혀야 한다. baseline 으로 두면 제목의 어센트만큼
   줄 상자가 위로 커져서, 그 안에 가운데 맞춘 버튼이 6px 아래로 내려앉았다(실측) */
.sec { display: flex; justify-content: space-between; align-items: center; padding: 26px 18px 10px; }
.sec h3 { margin: 0; font: 900 22px/1.1 var(--font-head); letter-spacing: -.02em; }
.sec h3 small { font: 800 14px/1 var(--font-num); color: var(--coral); margin-left: 6px; vertical-align: 3px; }
.sec button, .sec a { font-size: 14px; font-weight: 700; color: var(--muted); }
.sec button { display: inline-flex; align-items: center; gap: 5px; min-height: 32px; }
.sec button.ftog { padding: 6px 11px; border: 1.5px solid var(--line); border-radius: 999px; }
.sec button.ftog.on { border-color: var(--ink); background: var(--pear); color: var(--pear-ink); }
.sec button svg { width: 15px; height: 15px; flex: none; }

/* 30일 최저 — 가로 카드. 좌우 버튼은 넘칠 때만 나타난다(.scrollable 은 JS 가 실측해서 붙인다) */
.railwrap { position: relative; }
.rnav { position: absolute; top: 50%; transform: translateY(-50%); z-index: 2; width: 34px; height: 34px;
  display: none; place-items: center; border: 2px solid var(--ink); border-radius: 999px;
  background: var(--paper); box-shadow: 2px 2px 0 var(--shadow); padding: 0; }
.railwrap.scrollable .rnav { display: grid; }
.rnav svg { width: 17px; height: 17px; }
.rnav.prev { left: 4px; }
.rnav.next { right: 4px; }
.rnav[disabled] { opacity: 0; pointer-events: none; }
.rail { display: flex; gap: 14px; overflow-x: auto; padding: 12px 18px 12px; scroll-snap-type: x mandatory; scroll-padding-inline: 18px; scrollbar-width: none; }
.rail::-webkit-scrollbar { display: none; }
.mini { flex: 0 0 148px; scroll-snap-align: start; background: var(--paper-2); border: 2px solid var(--ink); box-shadow: 4px 4px 0 var(--shadow); padding: 10px; position: relative; transition: transform var(--dur) var(--ease-out); }
.mini:active { transform: translate(2px, 2px); box-shadow: 2px 2px 0 var(--shadow); }
.mini .im { height: 88px; background: var(--sk-2); display: grid; place-items: center; font-size: 40px; overflow: hidden; }
.mini .im img { width: 100%; height: 100%; object-fit: contain; background: #fff; min-width: 0; min-height: 0; }
.mini .nm { font-size: 14px; line-height: 1.3; margin: 8px 0 6px; height: 36px; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.mini .now { font: 800 16px/1 var(--font-num); }
.mini .pct { color: var(--coral); font: 800 14px/1 var(--font-num); margin-left: 5px; }
.mini .sticker { top: -8px; right: -8px; padding: 3px 7px; }
.mini .seen { font-size: 14px; line-height: 1.2; color: var(--muted); margin-top: 6px; }

.note { margin: 0 18px 10px; font-size: 14px; color: var(--muted); }

/* 필터를 누르면 이 덩어리만 갈아끼운다. 흐려지는 동안 두 번 눌리지 않게 막는다 */
#listBlock.is-loading { opacity: .45; pointer-events: none; transition: opacity .12s; }

/* 장보기 노트 카드. 홈(픽 아래)과 상세(같이 읽을 것)가 같은 모양을 쓴다 */
.notecard { display: block; margin: 0 18px; padding: 14px; border: 2px solid var(--ink);
  background: var(--paper-2); box-shadow: 4px 4px 0 var(--shadow); transition: transform var(--dur) var(--ease-out); }
.notecard:active { transform: translate(2px, 2px); box-shadow: 2px 2px 0 var(--shadow); }
.notecard h3 { margin: 0 0 6px; font: 900 17.5px/1.35 var(--font-head); letter-spacing: -.01em; word-break: keep-all; }
.notecard p { margin: 0; font-size: 14px; color: var(--muted); line-height: 1.55; word-break: keep-all; }
.notecard .foot { margin-top: 10px; font: 700 13px/1 var(--font-head); color: var(--muted); }

/* 카테고리 칩 */
.chips { display: flex; gap: 8px; overflow-x: auto; padding: 0 18px 8px; scrollbar-width: none; }
.chips::-webkit-scrollbar { display: none; }
.chips button { flex: 0 0 auto; font-size: 14px; font-weight: 700; padding: 6px 12px; border: 2px solid var(--ink); border-radius: 999px; background: var(--paper-2); }
.chips button.on { background: var(--pear); color: var(--pear-ink); box-shadow: 3px 3px 0 var(--shadow); }

/* 오늘 내림 — 목록 */
.row { display: grid; grid-template-columns: 64px minmax(0, 1fr) auto; gap: 14px; align-items: center; padding: 12px 18px; border-bottom: 1px solid var(--line); }
.row .im { width: 64px; height: 64px; background: var(--paper-2); border: 2px solid var(--ink); display: grid; place-items: center; font-size: 30px; overflow: hidden; }
.row .im img { width: 100%; height: 100%; object-fit: contain; background: #fff; min-width: 0; min-height: 0; }
.row .nm { font-size: 15px; font-weight: 500; line-height: 1.35; }
.row .un { font-size: 14px; color: var(--muted); margin-top: 3px; }
/* '몇 시간 전 값' — 어절 셋이라 줄 끝에서 갈린다. 통째로 다음 줄로 넘긴다. */
.row .un .seen, .pick .unit .seen { white-space: nowrap; }
.row .pr { text-align: right; white-space: nowrap; }
.row .now { font: 800 17px/1.2 var(--font-num); }
.row .was { font: 600 14px/1 var(--font-num); color: var(--muted); text-decoration: line-through; }
.row .pct { display: block; font: 800 14px/1.4 var(--font-num); color: var(--coral); }
.row .pct.up { color: var(--muted); }
/* 인기 — 카테고리별 베스트 순위. 순위표와 하트는 줄(<a>) 밖에 겹쳐 둔다: 링크 안 버튼은 눌림이 상세로 샌다 */
.rk-sub { padding: 0 18px 10px; font-size: 14px; color: var(--muted); }
.rkrow { position: relative; }
.rkrow .row { padding-right: 72px; }
.rk-n { position: absolute; left: 10px; top: 4px; z-index: 1; min-width: 24px; padding: 4px 6px; text-align: center;
  background: var(--ink); color: var(--paper); font: 800 14px/1 var(--font-num); pointer-events: none; }
.rk-h { position: absolute; right: 18px; top: 50%; transform: translateY(-50%); width: 44px; height: 44px; display: grid; place-items: center;
  border: 2px solid var(--ink); border-radius: 999px; background: var(--paper-2); color: var(--coral); }
.rk-h svg { width: 20px; height: 20px; }
.rk-h:disabled { opacity: .5; }
.tag { display: inline-block; font-size: 12px; font-weight: 800; color: var(--green); border: 1.2px solid currentColor; border-radius: 999px; padding: 0 6px; margin-left: 5px; vertical-align: 1px; letter-spacing: -.01em; }
.more { display: block; margin: 18px 18px 0; text-align: center; padding: 13px; border: 2px solid var(--ink); font-weight: 800; font-size: 15px; background: var(--paper-2); box-shadow: 4px 4px 0 var(--shadow); }
/* hidden 속성은 UA 스타일시트의 display:none 인데, 바로 위 .row 의 display:grid 가 그걸
   이긴다 — 감춘 줄이 그대로 보인다. 줄을 감추는 자리를 만들었으면 이 한 줄이 짝이다. */
.row[hidden] { display: none; }

/* 카테고리 펼치기. 필터(.ftog)와 달리 테두리를 안 준다 — 고르는 게 아니라 여는 것이다 */
.sec button.catmore svg { transition: transform var(--dur) var(--ease-out); }
.sec button.catmore.open svg { transform: rotate(180deg); }

.empty { padding: 48px 18px; color: var(--muted); text-align: center; font-size: 15px; }
/* 오리 — 오리 앱(hanjang)과 같은 Boxicons 오리(MIT), 부리가 왼쪽. 빈 화면 · 없는 페이지에는 한 마리가 기다린다.
   그림은 마스크 하나라 색은 글자색(--muted)을 따르고, 테마가 바뀌어도 따로 칠할 것이 없다 */
.empty::before, .nf-duck { content: ""; display: block; width: 44px; height: 44px; margin: 0 auto 12px; background: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%221.97%202.01%2020%2020%22%3E%3Cpath%20d%3D%22M21.38%2010.08a.98.98%200%200%200-1.09.22l-.22.22c-.41.41-.83.72-1.24.93c-1.7.85-3.69.71-5.2-.33a5.48%205.48%200%200%200%201.27-4.6c-.39-2.18-2.09-3.94-4.24-4.39c-1.66-.34-3.35.06-4.64%201.11a5.5%205.5%200%200%200-2.01%203.81l-.03-.04h-2s0%202.72%202.6%202.97q.21.405.48.78A6.01%206.01%200%200%200%202%2016.58c.28%203.04%203%205.43%206.18%205.43h6.1c4.38%200%207.69-3.01%207.69-7v-4c0-.4-.24-.77-.62-.92ZM20%2015c0%202.9-2.39%205-5.69%205h-6.1c-2.16%200-4-1.59-4.19-3.61c-.16-1.72.79-3.35%202.37-4.05c.28-.12.56-.28.88-.49c.27-.18.44-.47.45-.79s-.13-.63-.38-.83C6.49%209.56%206%208.56%206%207.5s.47-2.05%201.29-2.72c.63-.52%201.4-.78%202.2-.78c.25%200%20.51.03.77.08c1.34.28%202.44%201.42%202.68%202.78c.24%201.34-.3%202.67-1.4%203.47a.98.98%200%200%200-.41.73c-.02.29.08.58.29.79l.1.1c2.15%202.15%205.45%202.67%208.21%201.29c.09-.04.18-.09.27-.14v1.92Z%22%2F%3E%3Cpath%20d%3D%22M9%206a1%201%200%201%200%200%202a1%201%200%201%200%200-2%22%2F%3E%3C%2Fsvg%3E") center / contain no-repeat; mask: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%221.97%202.01%2020%2020%22%3E%3Cpath%20d%3D%22M21.38%2010.08a.98.98%200%200%200-1.09.22l-.22.22c-.41.41-.83.72-1.24.93c-1.7.85-3.69.71-5.2-.33a5.48%205.48%200%200%200%201.27-4.6c-.39-2.18-2.09-3.94-4.24-4.39c-1.66-.34-3.35.06-4.64%201.11a5.5%205.5%200%200%200-2.01%203.81l-.03-.04h-2s0%202.72%202.6%202.97q.21.405.48.78A6.01%206.01%200%200%200%202%2016.58c.28%203.04%203%205.43%206.18%205.43h6.1c4.38%200%207.69-3.01%207.69-7v-4c0-.4-.24-.77-.62-.92ZM20%2015c0%202.9-2.39%205-5.69%205h-6.1c-2.16%200-4-1.59-4.19-3.61c-.16-1.72.79-3.35%202.37-4.05c.28-.12.56-.28.88-.49c.27-.18.44-.47.45-.79s-.13-.63-.38-.83C6.49%209.56%206%208.56%206%207.5s.47-2.05%201.29-2.72c.63-.52%201.4-.78%202.2-.78c.25%200%20.51.03.77.08c1.34.28%202.44%201.42%202.68%202.78c.24%201.34-.3%202.67-1.4%203.47a.98.98%200%200%200-.41.73c-.02.29.08.58.29.79l.1.1c2.15%202.15%205.45%202.67%208.21%201.29c.09-.04.18-.09.27-.14v1.92Z%22%2F%3E%3Cpath%20d%3D%22M9%206a1%201%200%201%200%200%202a1%201%200%201%200%200-2%22%2F%3E%3C%2Fsvg%3E") center / contain no-repeat; }
.nf-duck { margin: 0 0 14px; color: var(--muted); }
/* 에나멜 핀 오리(2026-10-26, Codex 로 만든 그림 · public/pins). 위의 선 오리 마스크를 끄고 그림으로 바꾼다.
   검색 결과 없음은 돋보기 든 같은 오리. 어두운 화면에선 검은 니켈 테두리가
   바탕에 묻혀서 크림색 윤곽을 한 겹 두른다(--pin-edge) */
.empty::before, .nf-duck { width: 120px; height: 100px; -webkit-mask: none; mask: none; background: url(/pins/duck.png) center / contain no-repeat;
  filter: var(--pin-edge, none); }
.empty.search-empty::before { width: 150px; background-image: url(/pins/search.png); }

/* 상세 */
.back { display: inline-block; margin: 14px 18px 0; font-size: 14px; font-weight: 700; color: var(--muted); }
.dimg { margin: 12px 18px 0; aspect-ratio: 4 / 3; max-height: 360px; background: #fff; border: 2px solid var(--ink); box-shadow: 5px 5px 0 var(--shadow); display: grid; place-items: center; font-size: 96px; position: relative; overflow: hidden; }
.dimg img { width: 100%; height: 100%; object-fit: contain; min-width: 0; min-height: 0; }
.dbody { padding: 18px 18px 0; }
.dbody h2 { font: 900 22px/1.3 var(--font-head); margin: 0 0 6px; letter-spacing: -.02em; }
.dbody .meta { font-size: 14px; color: var(--muted); }
.big { display: flex; align-items: baseline; gap: 10px; margin-top: 12px; flex-wrap: wrap; }
.big .now { font: 800 36px/1 var(--font-num); letter-spacing: -.03em; }
.big .pct { color: var(--coral); font: 800 18px/1 var(--font-num); }
.big .was { font: 600 14px/1 var(--font-num); color: var(--muted); text-decoration: line-through; }
.verdict { display: inline-block; margin-top: 12px; background: var(--pear); color: var(--pear-ink); border: 2px solid var(--ink); box-shadow: 3px 3px 0 var(--shadow); padding: 6px 12px; font-weight: 900; font-size: 15px; transform: rotate(-1.5deg); }
.verdict.wait { background: var(--paper-2); color: var(--ink); }
/* 판정의 근거. 배지는 이름만 말하고 무엇을 보고 나왔는지는 여기서 말한다 —
   같은 화면의 큰 %(직전 수집 대비)와 기준이 달라서, 안 적으면 서로 어긋나 보인다. */
.vwhy { font-size: 13px; color: var(--muted); margin: 8px 2px 0; }
.unitline { font-size: 15px; margin: 14px 0 0; }
.unitline span { color: var(--muted); font-size: 14px; }
.stats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0; margin: 16px 0 14px; border: 2px solid var(--ink); }
.stats div { padding: 10px 12px; }
.stats div + div { border-left: 2px solid var(--ink); }
.stats dt { font-size: 14px; color: var(--muted); font-weight: 700; }
.stats dd { margin: 2px 0 0; font: 800 17px/1.2 var(--font-num); }
.chartbox { background: var(--paper-2); border: 2px solid var(--ink); padding: 10px 10px 6px; }
.chart { width: 100%; height: auto; display: block; }
.chart .l { stroke: var(--ink); fill: none; stroke-width: 2.5; stroke-linejoin: round; }
.chart .a { fill: var(--pear); opacity: .55; }
.chart .g { stroke: var(--line); stroke-width: 1; }
.chart text { font: 700 14px var(--font-num); fill: var(--muted); }
.chart .lo { fill: var(--coral); }
/* 그래프를 눌러 그날 값을 본다. 세로로는 계속 스크롤돼야 하므로 pan-y 는 남긴다. */
.chart { touch-action: pan-y; }
.chart .hit { fill: transparent; }
/* SVG 요소에는 HTML 의 hidden 속성이 안 먹는다 — 여기서 직접 감춘다. */
.chart .cur[hidden] { display: none; }
.chart .cur line { stroke: var(--ink); stroke-width: 1.5; stroke-dasharray: 3 4; opacity: .55; }
.chart .cur circle { fill: var(--paper-2); stroke: var(--ink); stroke-width: 3; }
/* 값은 선 위에 얹히므로 배 노랑 면 위에서도 읽혀야 한다 — 종이색 테두리를 글자 뒤에 깐다. */
.chart .cur text { font: 800 20px var(--font-num); fill: var(--ink);
  paint-order: stroke; stroke: var(--paper-2); stroke-width: 5px; stroke-linejoin: round; }
/* 값을 적었다 지웠다 해도 줄 수가 안 바뀌게 높이를 잡아 둔다. */
.chart-cap { font-size: 14px; color: var(--muted); margin: 6px 2px 0; min-height: 20px; }
.chart-cap .lo { color: var(--coral); font-weight: 700; }
.events { margin-top: 22px; }
.events h3 { font: 900 17px/1.2 var(--font-head); margin: 0 0 4px; }
.events ul { list-style: none; padding: 0; margin: 0; }
.events li { display: block; padding: 9px 0; border-bottom: 1px solid var(--line); font: 700 14.5px/1.45 var(--font-num); }
.events time { display: block; color: var(--muted); font-weight: 600; font-size: 13px; white-space: nowrap; margin-bottom: 2px; }
.events .d { color: var(--coral); } .events .u { color: var(--muted); }
.events .ev { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.events .pp { white-space: nowrap; }
.events .tag { flex: none; margin-left: 0; }
.sortnote { margin: 2px 18px 0; font-size: 14px; color: var(--muted); }
/* 관심·공유는 아이콘, 쿠팡만 글자 버튼. 예전엔 셋 다 같은 알약이라 어느 것이 주 동작인지 안 보였다
   (390px 에서 폭 111/56/167px, 형태 신호는 동률). 주 버튼이 226px 로 넓어진다. */
/* z-index 가 없으면 문서에서 뒤에 오는 층(푸터 .build 의 opacity .65)이 막대 위에 그려진다 — 2026-10-28
   스크롤 중 'build …' 글자가 '쿠팡에서 보기' 위에 비쳤다. 머리(25) · 맨 위로(30) · 설치 막대(40) 밑에 둔다. */
.cta { z-index: 20; position: fixed; left: 0; right: 0; bottom: 0; display: grid; grid-template-columns: auto auto 1fr; gap: 10px; padding: 12px 18px calc(14px + env(safe-area-inset-bottom)); background: var(--paper); border-top: 2px solid var(--ink); max-width: 640px; margin: 0 auto; }
.btn { display: block; text-align: center; padding: 14px 12px; font-weight: 900; font-size: 15px; border: 2px solid var(--ink); border-radius: 999px; background: var(--paper-2); white-space: nowrap; transition: transform var(--dur) var(--ease-out); }
.btn:active { transform: translateY(1px); }
.btn.icon { width: 52px; padding: 0; display: grid; place-items: center; }
.btn.icon svg { width: 22px; height: 22px; display: block; }
.btn.on { background: var(--ink); color: var(--paper); }
.btn.buy { background: var(--coral-face); color: var(--on-coral); border-color: var(--coral-face); box-shadow: 3px 3px 0 var(--shadow); }
.btn.buy:active { box-shadow: 1px 1px 0 var(--shadow); transform: translate(2px, 2px); }

.build { display: block; margin-top: 12px; font: 600 11px/1 var(--font-num); color: var(--muted); opacity: .65; }

/* 사진이 없는 상품 자리. 이모지 대신 우리 선(2px 잉크)과 같은 그림을 쓴다 */

/* 사진이 없는 상품 자리. 이모지 대신 우리 선(2px 잉크)과 같은 그림을 쓴다 */
.noimg { width: 40%; max-width: 44px; height: auto; color: var(--muted); opacity: .42; }
.dimg .noimg { max-width: 84px; }
.pwabar .x svg { width: 16px; height: 16px; }

/* 맨 위로. 상세의 하단 버튼 줄과 설치 배너가 같은 구석을 쓰므로 그 위로 올리거나 비킨다 */
.totop { position: fixed; right: 18px; bottom: calc(20px + env(safe-area-inset-bottom)); z-index: 30;
  width: 46px; height: 46px; display: grid; place-items: center; border: 2px solid var(--ink); border-radius: 999px;
  background: var(--paper-2); color: var(--ink); box-shadow: 4px 4px 0 var(--shadow);
  opacity: 0; transform: translateY(10px); pointer-events: none; transition: opacity var(--dur) var(--ease-out), transform var(--dur) var(--ease-out); }
.totop.on { opacity: 1; transform: none; pointer-events: auto; }
.totop:active { box-shadow: 2px 2px 0 var(--shadow); transform: translate(2px, 2px); }
.totop svg { width: 21px; height: 21px; }
body:has(.cta) .totop { bottom: calc(96px + env(safe-area-inset-bottom)); }
body:has(.pwabar.on) .totop { opacity: 0; pointer-events: none; }
@media (prefers-reduced-motion: reduce) { .totop { transition: none; } }

/* 홈 화면에 추가 배너. 상세 화면의 하단 버튼 줄과 같은 자리라 그 화면에서는 안 띄운다(app.js) */
.pwabar { position: fixed; left: 10px; right: 10px; bottom: calc(12px + env(safe-area-inset-bottom)); z-index: 40;
  display: flex; align-items: center; gap: 12px; padding: 12px 14px; max-width: 620px; margin: 0 auto;
  background: var(--paper-2); border: 2px solid var(--ink); box-shadow: 5px 5px 0 var(--shadow);
  transform: translateY(140%); transition: transform var(--dur) var(--ease-out); }
.pwabar.on { transform: none; }
.pwabar img { border: 2px solid var(--ink); flex: none; }
.pwabar .t { min-width: 0; flex: 1; }
.pwabar .t b { display: block; font: 900 15px/1.2 var(--font-head); }
.pwabar .t span { display: block; font-size: 14px; line-height: 1.45; color: var(--muted); margin-top: 3px; }
.pwabar .t svg { width: 14px; height: 14px; vertical-align: -2px; }
.pwabar .add { flex: none; font: 900 14px/1 var(--font-head); padding: 11px 14px; border: 2px solid var(--coral-face);
  border-radius: 999px; background: var(--coral-face); color: var(--on-coral); }
.pwabar .x { flex: none; font-size: 16px; color: var(--muted); padding: 6px; min-width: 32px; min-height: 32px; }
@media (prefers-reduced-motion: reduce) { .pwabar { transition: none; } }

/* 지우기 — 되돌릴 수 없는 동작이라 목록 끝에 조용히 두고, 누르면 스스로 경고가 된다 */
.wipe { margin: 34px 18px 0; padding-top: 16px; border-top: 2px solid var(--line); }
.wipe button { font: 800 15px/1 var(--font-head); color: var(--coral); border: 2px solid var(--coral); padding: 11px 14px; border-radius: 999px; background: none; }
.wipe button.armed { background: var(--coral-face); color: var(--on-coral); border-color: var(--coral-face); }
.wipe button:disabled { opacity: .6; }
.wipe .sub { font-size: 14px; color: var(--muted); margin-top: 8px; line-height: 1.6; }
.wipe .sub a { text-decoration: underline; text-underline-offset: 3px; }

.sec-sub { font-size: 13.5px; color: var(--muted); font-weight: 500; }

.sortchips { margin-top: 10px; }

/* 아티클. 읽는 화면이라 본문 17px, 상품 카드만 눌리는 물건처럼 보이게 한다 */
.art { margin: 20px 18px 0; max-width: 62ch; font-size: 17px; line-height: 1.85; }
.art h1 { font: 400 clamp(27px, 7vw, 36px)/1.25 var(--font-display); margin: 14px 0 12px; }
.art h2 { font: 900 21px/1.4 var(--font-head); margin: 40px 0 10px; padding-top: 16px; border-top: 2px solid var(--ink); }
.art h3 { font: 800 17px/1.5 var(--font-head); margin: 26px 0 6px; }
.art p { margin: 0 0 15px; }
.art ul, .art ol { margin: 0 0 15px; padding-left: 20px; }
.art li { margin-bottom: 8px; }
.art a { text-decoration: underline; text-underline-offset: 3px; }
.art img { max-width: 100%; height: auto; border: 2px solid var(--ink); }
.art blockquote { margin: 18px 0; padding: 12px 16px; border-left: 4px solid var(--coral); background: var(--paper-2); }
.art-date { font: 700 14px/1 var(--font-num); color: var(--muted); margin-bottom: 26px; }
.art .back { display: inline-block; font: 700 14px/1 var(--font-head); color: var(--muted); }
/* 장보기 노트 A안(2026-10-23 대표 승인): 요약은 노란 포스트잇 · 출처는 위첨자 각주 · 표는 사이트 테두리 · 끝에 좋아요/공유 */
.art-lede { position: relative; margin: 6px 4px 18px; padding: 18px 18px 16px; background: var(--pear); color: var(--pear-ink); border: 2px solid var(--ink); box-shadow: 4px 4px 0 var(--shadow); transform: rotate(-1deg); font-size: 17px; line-height: 1.7; }
.art-lede-k { display: block; font: 800 13px/1 var(--font-head); letter-spacing: .02em; margin-bottom: 8px; color: var(--on-pear-accent); }
.art sup.fn { font: 800 11.5px/0 var(--font-num); margin-left: 1px; }
.art sup.fn a { text-decoration: none; color: var(--coral); padding: 0 2px; }
.art .fns { margin: 34px 0 0; padding-top: 14px; border-top: 2px solid var(--ink); font-size: 14px; line-height: 1.6; color: var(--muted); }
.art .fns h2 { font: 800 14px/1 var(--font-head); color: var(--ink); margin: 0 0 10px; padding: 0; border: 0; }
.art .fns ol { margin: 0; padding-left: 22px; }
.art .fns li { margin-bottom: 6px; }
.art .fns a { color: var(--muted); }
.art .fns li.on { color: var(--ink); }
.art .tblw { overflow-x: auto; margin: 18px 0 20px; border: 2px solid var(--ink); box-shadow: 4px 4px 0 var(--shadow); background: var(--paper-2); }
.art table { border-collapse: collapse; width: 100%; font-size: 15px; line-height: 1.5; }
.art th { background: var(--pear); color: var(--pear-ink); font: 800 14px/1.4 var(--font-head); text-align: left; padding: 10px 12px; border-bottom: 2px solid var(--ink); white-space: nowrap; }
.art td { padding: 10px 12px; border-top: 1px solid var(--line); vertical-align: top; }
.art td:not(:first-child) { font-family: var(--font-num); font-weight: 700; }
.art-end { margin: 36px 0 10px; padding: 18px; border: 2px solid var(--ink); background: var(--paper-2); box-shadow: 4px 4px 0 var(--shadow); }
.art-end p { margin: 0 0 12px; font: 800 16px/1.4 var(--font-head); }
.art-end-row { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.art-end button { display: flex; align-items: center; justify-content: center; gap: 8px; min-height: 48px; border: 2px solid var(--ink); background: var(--paper); color: var(--ink); font: 800 15px/1 var(--font-head); box-shadow: 3px 3px 0 var(--shadow); cursor: pointer; }
.art-end button:active { transform: translate(2px, 2px); box-shadow: 1px 1px 0 var(--shadow); }
.art-end .art-like { background: var(--pear); color: var(--pear-ink); }
.art-end .art-like[aria-pressed="true"] svg { color: var(--on-pear-accent); }
.art-end svg { width: 20px; height: 20px; flex: none; }
.art-end .n { font-family: var(--font-num); }
/* 알림 받을 길(app.js renderArtApp). 좋아요 · 공유(옅은 면)와 갈리게 앱 단추만 진한 면 */
.art-end .art-app { margin-top: 16px; padding-top: 14px; border-top: 2px dashed var(--line); }
.art-end .art-app-t { margin: 0 0 10px; font: 700 15px/1.45 var(--font-head); }
.art-end .art-app-how { margin: 0; font-size: 14px; line-height: 1.6; color: var(--muted); }
.art-end .art-app-how .ic { width: 16px; height: 16px; vertical-align: -3px; }
.art-end .art-app-btn { display: flex; align-items: center; justify-content: center; gap: 10px; width: 100%; min-height: 48px; border: 2px solid var(--ink); background: var(--ink); color: var(--paper); font: 800 15px/1 var(--font-head); box-shadow: 3px 3px 0 var(--shadow); text-decoration: none; cursor: pointer; }
.art-end .art-app-btn:active { transform: translate(2px, 2px); box-shadow: 1px 1px 0 var(--shadow); }
.art-end .art-app-btn img { display: block; flex: none; width: 28px; height: 28px; max-width: none; border-radius: 7px; }
@media (prefers-reduced-motion: reduce) { .art-lede { transform: none; } }

/* 본문에 끼우는 상품. 글 흐름을 끊되 광고처럼 보이지 않게 테두리만 준다 */
.artcard { display: flex; align-items: center; gap: 12px; margin: 20px 0; padding: 12px 14px;
  border: 2px solid var(--ink); background: var(--paper-2); box-shadow: 4px 4px 0 var(--shadow); text-decoration: none; }
.artcard .im { flex: none; width: 56px; height: 56px; display: grid; place-items: center; background: #fff; border: 2px solid var(--ink); overflow: hidden; }
.artcard .im img { width: 100%; height: 100%; object-fit: contain; min-width: 0; min-height: 0; }
.artcard .t { flex: 1; min-width: 0; font-size: 15.5px; line-height: 1.45; }
.artcard .t small { display: block; color: var(--muted); font-size: 13px; margin-top: 2px; }
.artcard .pr { flex: none; font: 800 16px/1 var(--font-num); }
/* .art a 의 밑줄(0,1,1)이 카드 글자 전체에 그어졌다 — 카드 자리만 되돌린다 */
.art a.artcard, .art a.mini { text-decoration: none; color: inherit; }
/* 값이 내린 상품 줄([[내린값:…]]). 홈 '30일 최저' 의 작은 카드를 글 여백(18px) 밖까지 펼친다.
   스티커가 카드 위로 10px 나오므로 위 여백을 그만큼 더 둔다. 면은 채운 코랄 토큰 — 글자용 --coral 위 흰 글자는 다크에서 2.3 */
.art .artrail { margin: 18px -18px 22px; padding: 16px 18px 14px; scroll-padding-inline: 18px; }
.artrail .mini .was { display: block; font: 600 13px/1.3 var(--font-num); color: var(--muted); text-decoration: line-through; margin-bottom: 3px; }
.artrail .mini .low { font-size: 13px; line-height: 1.3; color: var(--coral); font-weight: 700; margin-top: 6px; }
.artrail .stk { position: absolute; top: -10px; right: -10px; z-index: 1; display: flex; align-items: center; gap: 2px;
  background: var(--coral-face); color: var(--on-coral); border: 2px solid var(--ink); box-shadow: 2px 2px 0 var(--shadow);
  padding: 4px 8px 4px 5px; font: 800 16px/1 var(--font-num); transform: rotate(6deg); }
.artrail .stk svg { width: 17px; height: 17px; }
@media (prefers-reduced-motion: reduce) { .artrail .stk { transform: none; } }

/* 노트 목록 */
.artlist { margin: 8px 18px 0; }
.artrow { display: flex; gap: 14px; align-items: baseline; padding: 16px 0; border-bottom: 1px solid var(--line); }
.artrow .d { flex: none; font: 700 13px/1.6 var(--font-num); color: var(--muted); }
.artrow .t { flex: 1; min-width: 0; }
.artrow .t b { display: block; font: 900 18px/1.4 var(--font-head); }
.artrow .t small { display: block; color: var(--muted); font-size: 14.5px; line-height: 1.6; margin-top: 3px; }

/* 방침·안내 같은 읽는 문서. 본문 17px — 이 화면은 훑는 게 아니라 읽는 것이다 */
.doc { margin: 22px 18px 0; max-width: 62ch; font-size: 17px; line-height: 1.7; }
.doc h2 { font: 900 26px/1.2 var(--font-head); margin: 0 0 10px; }
.doc h3 { font: 900 19px/1.3 var(--font-head); margin: 30px 0 8px; padding-top: 14px; border-top: 2px solid var(--ink); }
.doc h4 { font: 800 16px/1.4 var(--font-head); margin: 18px 0 6px; color: var(--muted); }
.doc p { margin: 0 0 12px; }
.doc ul { margin: 0 0 12px; padding-left: 20px; }
.doc li { margin-bottom: 8px; }
.doc a { text-decoration: underline; text-underline-offset: 3px; }
.doc-lede { color: var(--muted); }
.doc-date { margin-top: 26px; padding-top: 14px; border-top: 2px solid var(--line); font-size: 15px; color: var(--muted); }
.doc-back { margin-top: 32px; font-weight: 700; }

/* 목록 더 보기 — 행과 같은 폭, 점선 테두리로 "여기까지" 를 말한다 */
.more { display: block; width: calc(100% - 36px); margin: 14px 18px 0; padding: 14px; text-align: center;
  font: 900 15px/1 var(--font-head); border: 2px dashed var(--ink); background: var(--paper-2); color: var(--ink); }
.more .num { color: var(--muted); font-weight: 700; margin-left: 6px; }
.more:disabled { color: var(--muted); border-style: solid; }

/* 뭐 사지? */
/* "살 것 120 · 기다릴 것 92" 는 한 줄로 읽혀야 한다 — 26px 로는 390px 에서 갈렸다.
   .pick h2 의 3줄 클램프도 여기선 안 맞으므로 되돌린다. 숫자가 네 자리로 늘어도
   안 갈리게 폭에 비례해 줄인다(값이 커질 때 UI 가 흐트러지면 안 된다). */
/* 이 카드에는 사진이 없다. .pick 은 오른쪽 126px 를 사진 자리로 비워 두는데(그래서
   390px 화면에서 글자가 쓸 수 있는 폭이 206px 밖에 안 됐다), 요약 카드는 그 자리를
   쓸 일이 없다. 돌려받으면 314px 이다 — 글자를 줄이기 전에 칸을 먼저 넓힌다. */
.pick.what-sum { padding-right: 18px; }

/* 한 줄로 읽혀야 한다 — 26px 로는 390px 에서 갈렸다. 그런데 nowrap 만 걸면 이번엔
   .pick h2 의 overflow:hidden 에 잘려서 숫자가 사라진다. 그래서 "안 갈리게" 가 아니라
   "들어가게" 크기를 정한다. 320px 기준 칸이 244px 이고 네 자리 숫자 둘이면 12.6×글자크기
   만큼 필요하다(실측) — 5.8vw 면 320 에서 18.6px·233px 라 들어간다.
   @media (max-width:360px) 의 .pick h2 가 같은 특이도로 뒤에 있어 .pick.what-sum 으로 이긴다. */
.pick.what-sum h2 { max-width: 100%; display: block; -webkit-line-clamp: none; white-space: nowrap;
  font-size: clamp(18px, 5.8vw, 24px); }
.vt { display: inline-block; font-size: 14px; font-weight: 900; background: var(--pear); color: var(--pear-ink); border: 2px solid var(--ink); padding: 2px 8px; transform: rotate(-2deg); margin-top: 4px; }
.vt.wait { background: var(--paper-2); color: var(--muted); border-color: var(--line); transform: none; }
/* 크게 내린 줄에만 붙는다. 바로 위 변동률과 같은 색이라 새 신호가 아니라 그 강조로 읽힌다 */
.vt.big { background: var(--coral-face); color: var(--on-coral); border-color: var(--coral-face); }
header.top nav a { min-height: 44px; display: inline-flex; align-items: center; }   /* 탭 목표 44px */

/* 목표가 */
.target { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 10px; margin: 6px 0 4px; border: 2px solid var(--ink); background: var(--paper-2); padding: 6px 6px 6px 12px; }
.target label { font-weight: 800; font-size: 15px; }
.target input { font: 600 16px var(--font-num); color: var(--ink); background: none; border: 0; min-width: 0; padding: 8px 4px; }
.target input:focus { outline: none; }
.target button { font-weight: 900; font-size: 14px; padding: 8px 12px; background: var(--pear); color: var(--pear-ink); border: 2px solid var(--ink); }
.target-sub { font-size: 14px; color: var(--muted); margin-bottom: 14px; }
.pick.saving { margin-top: 14px; padding-right: 18px; }
.pick.saving h2 { font: 800 40px/1 var(--font-num); letter-spacing: -.02em; margin: 4px 0 8px; }

/* 로그인 — 카카오 버튼은 브랜드 노랑(#FEE500)에 검정 글씨, 카카오 가이드 그대로. 우리 배(pear)와 비슷해서 테두리로 구분 */
.loginbox { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 14px 18px 0; padding: 12px 14px; border: 2px solid var(--ink); background: var(--paper-2); }
.loginbox .sub { font-size: 14px; color: var(--muted); margin-top: 2px; }
.loginbox .btn { padding: 9px 14px; font-size: 14px; white-space: nowrap; }
.loginbox .btn.kakao, .login-sheet .btn.kakao { background: #FEE500; color: #191919; border-color: #191919; }
/* 앱 안 로그인(Apple · Google · 카카오). 글을 카드 폭 그대로 두고 버튼은 아래에 한 줄씩, 누르는 칸 48px.
   Apple 은 잉크색 판(어두운 테마에선 밝은 판 — Apple 안내의 흰 버튼), Google 은 흰 판에 회색 테두리(Google 안내 그대로) */
.loginbox.stack { display: block; }
.login-btns { display: grid; gap: 8px; margin-top: 12px; }
.loginbox .login-btns .btn, .login-sheet .login-btns .btn { display: flex; align-items: center; justify-content: center; gap: 8px; min-height: 48px; padding: 0 14px; font-size: 15px; }
.login-btns svg { width: 18px; height: 18px; flex: none; }
.loginbox .btn.apple, .login-sheet .btn.apple { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.loginbox .btn.google, .login-sheet .btn.google { background: #FFFFFF; color: #1F1F1F; border-color: #747775; }
/* 첫 방문 로그인 시트(app.js maybeLoginAsk). 덮개는 잉크 50% — 뒤의 홈이 보여야 무슨 앱인지 알고 고른다.
   아래 탭 막대(z 35) · 설치 막대(z 40) 위에 놓는다. 글자 층: 제목 22/900 · 혜택 16/700 · 설명 14/400 muted */
.login-scrim { position: fixed; inset: 0; z-index: 60; background: rgba(42, 36, 24, .5); opacity: 0; transition: opacity var(--dur) var(--ease-out); }
/* 화면 끝에 붙이면 아이폰의 둥근 화면 모서리가 시트 아래 양 끝 테두리를 잘랐다(2026-10-26 시뮬레이터 iPhone 17 Pro).
   설치 막대(.pwabar)처럼 양옆 10px · 아래 (홈 막대 여백 + 10px) 띄운 카드로 둔다 */
.login-sheet { position: fixed; left: 10px; right: 10px; bottom: calc(10px + env(safe-area-inset-bottom, 0px)); z-index: 61; max-width: 560px; margin: 0 auto;
  background: var(--paper); border: 2px solid var(--ink); border-radius: var(--r); box-shadow: 5px 5px 0 var(--shadow);
  padding: 22px 20px 12px; transform: translateY(calc(100% + 60px)); transition: transform var(--dur) var(--ease-out); }
.login-ask.on > .login-scrim { opacity: 1; }
.login-ask.on > .login-sheet { transform: none; }
@media (prefers-reduced-motion: reduce) { .login-scrim, .login-sheet { transition: none; } }
.login-title { margin: 0; font-family: var(--font-head); font-size: 22px; font-weight: 900; line-height: 1.3; color: var(--ink); }
.login-perks { list-style: none; margin: 14px 0 0; padding: 0; display: grid; gap: 10px; }
.login-perks li { display: flex; gap: 10px; align-items: flex-start; }
.login-perks svg { width: 20px; height: 20px; flex: none; margin-top: 1px; color: var(--green); }
.login-perks b { display: block; font-size: 16px; font-weight: 700; line-height: 1.35; color: var(--ink); }
.login-perks span { display: block; font-size: 14px; font-weight: 400; line-height: 1.45; color: var(--muted); }
.login-sheet .login-btns { margin-top: 18px; }
.login-later { display: block; width: 100%; min-height: 44px; margin-top: 6px; background: none; border: 0; font: inherit; font-size: 15px; font-weight: 700; color: var(--muted); }
/* 첫 방문 '관심 고르기'(app.js openOnboard, 2026-10-27). 로그인 시트와 같은 판에 단계만 바꿔 그린다. 상품 목록이 길어
   시트 높이를 화면(안전 영역 뺀 것) 안에 묶고 목록만 스크롤한다. 글자 층: 제목 22/900(.login-title) · 단계 13/700 muted ·
   설명 14 muted · 칩 15/700 · 묶음 머리 15/900 · 상품 이름 14/400 · 값 15/800 · 카테고리 메타 13 muted */
.login-sheet.onb { display: flex; flex-direction: column; max-height: calc(100dvh - 30px - env(safe-area-inset-top, 0px) - env(safe-area-inset-bottom, 0px)); }
.onb-step { font: 700 13px/1 var(--font-body); color: var(--muted); margin-bottom: 8px; }
.onb-sub { margin: 6px 0 0; font-size: 14px; line-height: 1.5; color: var(--muted); }
.onb-cats { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; overflow-y: auto; min-height: 0; }
.onb-cats button { min-height: 44px; padding: 0 14px; font: 700 15px/1 var(--font-body); border: 2px solid var(--ink); border-radius: 999px; background: var(--paper-2); color: var(--ink); }
.onb-cats button.on { background: var(--pear); color: var(--pear-ink); box-shadow: 3px 3px 0 var(--shadow); }
.onb-list { overflow-y: auto; margin: 12px -20px 0; padding: 0 20px; flex: 1; min-height: 0; overscroll-behavior: contain; }
.onb-cat { font: 900 15px/1.3 var(--font-head); margin: 14px 0 4px; display: flex; justify-content: space-between; align-items: baseline; }
.onb-cat small { font: 700 13px/1 var(--font-body); color: var(--muted); }
.onb-row { display: grid; grid-template-columns: 48px minmax(0, 1fr) 44px; gap: 10px; align-items: center; padding: 8px 0; border-bottom: 1px solid var(--line); cursor: pointer; }
.onb-row img { width: 48px; height: 48px; border-radius: 8px; border: 1px solid var(--line); object-fit: cover; background: #fff; }
.onb-row .nm { font-size: 14px; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.onb-row .pr { font: 800 15px/1.3 var(--font-body); margin-top: 2px; }
.onb-meta { font: 400 13px/1 var(--font-body); color: var(--muted); margin-left: 6px; }
.onb-row.off .nm, .onb-row.off .pr, .onb-row.off img { opacity: .4; }
.onb-tg { width: 44px; height: 44px; display: grid; place-items: center; }
.onb-tg span { width: 26px; height: 26px; border: 2px solid var(--ink); border-radius: 8px; display: grid; place-items: center; background: var(--paper-2); }
.onb-row:not(.off) .onb-tg span { background: var(--pear); color: var(--pear-ink); }
.onb-tg svg { width: 18px; height: 18px; }
.onb-row.off .onb-tg svg { display: none; }
.onb-more { margin-top: 14px; }
.onb-more summary { list-style: none; min-height: 44px; display: flex; align-items: center; gap: 8px; font: 700 15px/1 var(--font-body); cursor: pointer; border-top: 2px solid var(--ink); }
.onb-more summary::-webkit-details-marker { display: none; }
.onb-more summary small { font: 400 13px/1 var(--font-body); color: var(--muted); }
.onb-more summary::after { content: ""; margin-left: auto; width: 10px; height: 10px; border-right: 2.5px solid var(--ink); border-bottom: 2.5px solid var(--ink); transform: rotate(45deg) translate(-3px, -3px); }
.onb-more[open] summary::after { transform: rotate(-135deg) translate(-3px, -3px); }
.onb-go { flex: none; width: 100%; min-height: 48px; margin-top: 12px; border: 2px solid var(--ink); border-radius: 999px; background: var(--coral); color: var(--on-coral); font: 800 16px/1 var(--font-body); box-shadow: 3px 3px 0 var(--shadow); }
.onb-go:disabled { background: var(--line); color: var(--muted); box-shadow: none; }

/* 내 관심 */
.tgbox { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 14px 18px 0; padding: 12px 14px; border: 2px solid var(--ink); background: var(--paper-2); }
.tgbox.on { background: var(--pear); color: var(--pear-ink); }
.tgbox .sub { font-size: 14px; color: var(--muted); margin-top: 2px; }
.tgbox.on .sub { color: var(--pear-ink); opacity: .8; }
.tgbox .btn { padding: 9px 14px; font-size: 14px; }

.mine-head { padding: 18px 18px 0; font: 900 22px/1.1 var(--font-head); }

.foot-links { display: flex; gap: 14px; margin-bottom: 10px; }
.foot-links a { font-weight: 700; color: var(--ink); text-decoration: underline; text-underline-offset: 3px; }
footer { margin: 40px 18px 0; font-size: 13px; color: var(--muted); line-height: 1.6; border-top: 2px solid var(--ink); padding-top: 14px; }
footer p { margin: 0 0 4px; }
footer p:last-of-type { margin-bottom: 0; }
.toast { position: fixed; left: 50%; bottom: 96px; transform: translateX(-50%) rotate(-1deg); background: var(--ink); color: var(--paper); padding: 10px 16px; border: 2px solid var(--paper); box-shadow: 3px 3px 0 var(--shadow); font-size: 15px; font-weight: 700; opacity: 0; transition: opacity .2s; pointer-events: none; white-space: nowrap; }
.toast.show { opacity: 1; }

/* 스켈레톤 — 실제 레이아웃과 같은 자리에 같은 크기로. 그래야 데이터가 오는 순간 화면이 안 뛴다 */
.sk { background: linear-gradient(90deg, var(--sk) 25%, var(--sk-2) 50%, var(--sk) 75%); background-size: 240% 100%; animation: sh 1.4s linear infinite; border-radius: 6px; display: block; }
@keyframes sh { 0% { background-position: 120% 0; } 100% { background-position: -120% 0; } }
.sk-pick { margin: 18px 18px 0; height: 150px; border: 2px solid var(--line); box-shadow: none; }
.sk-mini { flex: 0 0 148px; height: 174px; border: 2px solid var(--line); }
.sk-row { display: grid; grid-template-columns: 64px minmax(0, 1fr) auto; gap: 14px; align-items: center; padding: 12px 18px; }
.sk-row .sk { height: 15px; }

/* 첫 페인트용. 서버가 #view 를 채우거나 app.js 가 그리는 순간 저절로 사라진다 —
   예전엔 #view 가 빈 채로 그려져서 화면 맨 위에 푸터(장보기 노트)가 먼저 보였다 */
#view:not(:empty) ~ #boot { display: none; }

@media (prefers-reduced-motion: reduce) {
  .sk, .ticker span { animation: none; }
  .pick, .mini, .btn, .notecard, .sec button.catmore svg { transition: none; }
}
@media (max-width: 360px) {
  .pick { padding-right: 18px; }
  .pick h2 { font-size: 24px; }
  .pick .em, .pick .thumb { display: none; }
}

/* 아티클의 고르기 위젯(lib/pick.js 가 SSR, app.js 가 토글). 행 전체가 링크이고 화살표 하나만
   신호로 둔다 — 줄마다 노란 버튼을 채우면 세 줄이 전부 "눌러라" 가 되어 고르는 화면이 아니게 된다.
   이름이 chooser-* 인 이유: .pick 은 이미 홈 요약 카드다(오른쪽 126px 가 사진 자리라 그 규칙을
   물려받으면 위젯이 반쪽이 된다). 흔한 한 단어 클래스를 쓰기 전에 스타일시트에서 세어 볼 것. */
.chooser { border: 2px solid var(--ink); border-radius: var(--r); background: var(--paper-2);
  box-shadow: 3px 3px 0 var(--shadow); overflow: hidden; margin: 22px 0;
  font-size: 14px; line-height: 1.6; }   /* .art 의 본문 치수(17px/1.85)를 위젯 안에서는 끈다 */
.chooser-head { background: var(--pear); color: var(--pear-ink); padding: 9px 16px;
  font-family: var(--font-head); font-weight: 800; font-size: 14px;
  border-bottom: 2px solid var(--ink); display: flex; justify-content: space-between;
  gap: 10px; align-items: center; }
.chooser-head small { font-weight: 500; font-size: 13px; color: var(--on-pear-accent); }
.chooser-body { padding: 16px; }
.chooser-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.chooser-chip { font-family: var(--font-head); font-weight: 700; font-size: 14px; cursor: pointer;
  border: 2px solid var(--ink); background: var(--paper-2); color: var(--ink);
  border-radius: 999px; padding: 7px 13px; line-height: 1.2; }
.chooser-chip[aria-pressed="true"] { background: var(--ink); color: var(--paper); }
.chooser-ans { margin-top: 14px; border-top: 1px dashed var(--line); padding-top: 14px; }
/* display 를 지정한 뒤 hidden 을 걸면 UA 기본값이 져서 안 감춰진다 — 여기서 못 박는다 */
.chooser-ans[hidden] { display: none !important; }
.chooser-pick { font-family: var(--font-display); font-size: 21px; line-height: 1.25;
  margin: 0 0 2px; word-break: keep-all; }
.chooser-why { font-size: 14px; color: var(--muted); margin: 0 0 10px; word-break: keep-all; }
.chooser-r { display: grid; grid-template-columns: minmax(0, 1fr) auto 18px; align-items: center;
  gap: 0 10px; padding: 9px 8px; border-radius: 10px; color: inherit; }
/* :first-of-type 은 <a> 와 <div> 를 따로 센다 — 상품 없는 줄이 첫 <div> 면 테두리가 빠진다 */
.chooser-r + .chooser-r { border-top: 1px solid var(--line); }
/* .art a 의 밑줄이 (0,1,1) 로 이긴다. 본문 링크 규칙이라 지우면 안 되고 이 자리만 되돌린다 */
.chooser a.chooser-r { text-decoration: none; }
a.chooser-r:hover, a.chooser-r:focus-visible { background: var(--sk-2); }
.chooser-r .c-nm { font-size: 14.5px; word-break: keep-all; min-width: 0; }
.chooser-r .c-tp { font-family: var(--font-num); font-variant-numeric: tabular-nums; font-size: 13px;
  color: var(--muted); white-space: nowrap; min-width: 58px; text-align: right; }
.chooser-r .c-go { font-family: var(--font-num); font-size: 17px; font-weight: 700;
  color: var(--coral); text-align: right; }

/* 값이 얼마 사이에서 움직였나(lib/band.js · render.js 의 bandBarHtml). 눈금 하나가 관측된 값
   하나이고 굵기는 그 값이 나온 횟수다 — 두 끝점으로 그리면 두 값만 오가는 24% 에만 맞는다.
   폭 3% 미만이면 막대 대신 한 줄로만 적는다: 없는 차이를 있는 것처럼 만들지 않는다.
   이름에 band- 를 붙인 이유는 .lo 가 이미 이 스타일시트에 있기 때문이다. */
.band { margin: 12px 0 0; }
.band-t { font: 700 13px/1.5 var(--font-head); margin: 0 0 8px; word-break: keep-all; }
.band-bar { position: relative; height: 30px; }
.band-track { position: absolute; left: 9px; right: 9px; top: 13px; height: 3px;
  background: var(--line); border-radius: 2px; }
.band-tick { position: absolute; width: 3px; border-radius: 2px; background: var(--muted);
  transform: translateX(-1.5px); }
.band-now { position: absolute; top: 4px; width: 16px; height: 16px; border-radius: 50%;
  background: var(--ink); border: 2px solid var(--paper-2); box-shadow: 0 0 0 2px var(--ink);
  transform: translateX(-8px); }
.band-lab { display: flex; justify-content: space-between; font-family: var(--font-num);
  font-variant-numeric: tabular-nums; font-size: 13px; margin-top: 1px; }
.band-lab .band-lo { color: var(--green); font-weight: 700; }
.band-lab .band-hi { color: var(--muted); }
.band-msg { font-size: 13.5px; margin: 9px 0 0; word-break: keep-all; }
.band-msg b { color: var(--green); }
.band-flat { font-size: 13.5px; color: var(--muted); margin: 12px 0 0; word-break: keep-all; }
.band-flat b { color: var(--ink); }

/* 폰에서 누르는 높이 44 — 2026-10-18 375px 실측: 뒤로 가기 21 · 바닥글 링크 21 · 레일 이전/다음 34 ·
   칩 37 · '전체/내린 것만' 35 · 기록 지우기 32 · 로고 41 · 검색칸 43. 글자 크기와 자리는 그대로
   두고 보이지 않는 ::after 로 누르는 범위만 넓힌다(크기를 키우면 줄이 밀린다). 데스크톱(마우스 · 넓은 창)은 그대로. */
@media (pointer: coarse), (max-width: 640px) {
  /* .rnav 는 이미 position: absolute 라 넣지 않는다(relative 로 덮으면 레일 위 제자리를 잃는다) */
  .back, .foot-links a, .chips button, .sec button.ftog, .acct-links button, header.top h1 a, .btn { position: relative; }
  .back::after, .foot-links a::after, .rnav::after, .chips button::after, .sec button.ftog::after,
  .acct-links button::after, header.top h1 a::after, .btn::after { content: ''; position: absolute; left: 0; right: 0; }
  .back::after, .foot-links a::after { top: -12px; bottom: -12px; }
  .rnav::after { inset: -7px; }
  .chips button::after { top: 0; bottom: -8px; }
  .sec button.ftog::after { top: -6px; bottom: -6px; }
  .acct-links button::after { top: -6px; bottom: -6px; }
  header.top h1 a::after { top: -6px; bottom: -6px; }
  .btn::after { top: -2px; bottom: -2px; }
  /* 칩 줄은 가로 스크롤 상자라 위로 넘친 ::after 가 잘린다 — 이미 있는 아래 여백(8px) 안으로만 넓힌다 */
  /* 검색칸은 ::after 를 못 단다 — 1px 키우고 아래 여백을 1px 당겨 밑의 자리를 그대로 둔다 */
  .search input { min-height: 44px; }
  .search { margin-bottom: -1px; }
}
.in-app .build { display: none; }
