/* 모바일 껍데기 — 세 화면이 함께 쓰는 것만 담는다.
   지금은 둘이다: **하단 탭 바**와 **바텀 시트**.

   ⚠ **왜 skin.css 가 아닌가:** 아이템 화면(index.html)은 style.css 만 싣고 skin.css 를
   안 싣는다(실측 2026-08-07). skin.css 에 넣으면 세 화면 중 하나에만 안 뜨는데,
   마크업은 있으니 tests/mobile.test.js 는 **초록인 채로 샌다.** 한 파일에 두고 세 HTML 이
   다 싣는 것이 유일하게 안전하다.

   ⚠ **이 파일은 혼자 선다.** skin.css 의 --gold 류가 없는 화면에서도 색이 나와야 하므로
   되돌림 값을 아래 :root 에 적어 둔다. **정본은 skin.css 이고 여기 것은 되돌림이다** —
   두 곳이 갈리면 skin.css 를 따른다(var(--gold, …) 가 그렇게 동작한다). */

:root {
  --m-gold: #c8a24c;
  --m-dim: #8d7439;
  --m-muted: #9a8e76;
  --m-cream: #e6dcc4;
  --m-line: #3b3122;
  /* 44px 은 손가락 하나의 최소 크기다(애플·구글 지침이 같은 값을 쓴다).
     2026-08-07 실측: 계산 탭 터치 대상 61개 중 52개가 이 값 미만이었다. */
  --m-touch: 44px;
  /* 하단 탭 바의 높이. **이 값 하나에서 둘이 파생된다** — 탭 바 자신의 높이와
     본문 아래 여백. 따로 적었더니 탭 바가 66px 인데 여백이 52px 이라 14px 이
     가려졌다(2026-08-07 실측). min-height 가 아니라 height 인 이유도 그것이다:
     내용에 따라 자라면 여백이 다시 어긋난다. */
  --m-tabbar: 56px;
}

/* ── 하단 탭 바 (A1) ──────────────────────────────────────────────────────
   데스크톱에는 안 뜬다 — 헤더 링크가 이미 그 일을 하고, 아래를 가리면 손해다.
   375px 에서 헤더 링크가 「4인 파 / 티」로 줄바꿈되던 것을 이것이 대신한다. */
.tabbar { display: none; }

@media (max-width: 720px) {
  .tabbar {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    position: fixed; left: 0; right: 0; bottom: 0; z-index: 40;
    /* 홈 인디케이터가 있는 기기에서 마지막 줄이 가려진다. */
    height: calc(var(--m-tabbar) + env(safe-area-inset-bottom, 0px));
    background: #100e0a;
    box-sizing: border-box;

    /* ⚠ **다른 스타일시트의 nav 규칙을 되돌린다.** style.css:5 가
       `header, nav { padding: var(--gap); border-bottom: … }` 를 걸어서, 아이템
       화면에서는 탭 바가 위 12px 을 먹고 링크가 44px 로 줄었다(2026-08-07 실측:
       바 56 · 링크 44 · 위 12px 은 눌러도 안 먹음). 화면마다 nav 규칙이 다르므로
       여기서 통째로 못박는다 — 값을 물려받지 않는다. */
    margin: 0;
    padding: 0 0 env(safe-area-inset-bottom, 0px);
    border: 0;
    /* style.css 의 `nav { gap: 8px }` 도 샜다 — 아이템 화면만 칸 사이가 8px 벌어져
       링크 폭이 120 대 125 로 갈렸다(리뷰 실측). 격자가 폭을 정하므로 0 이 맞다. */
    gap: 0;
    border-top: 1px solid var(--gold-dim, var(--m-dim));
  }
  .tabbar a {
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 2px;
    /* ⚠ height: 100% 를 쓰면 격자 칸 안에서 42px 로 줄어든다(2026-08-07 실측) —
       바 위쪽 14px 을 눌러도 안 먹었다. 격자의 기본 stretch 에 맡기고 최소만 못박는다. */
    min-height: var(--m-touch); line-height: 1.3;
    font-size: 11px; text-decoration: none;
    color: var(--muted, var(--m-muted));
  }
  .tabbar a.on { color: var(--gold, var(--m-gold)); }
  .tabbar .ti { font-size: 17px; line-height: 1; }

  /* 탭 바가 덮는 만큼 본문 아래를 비운다 — 마지막 줄이 가리면 안 된다.
     **탭 바 높이와 같은 변수에서 나온다.** 따로 적으면 조용히 어긋난다. */
  body { padding-bottom: calc(var(--m-tabbar) + env(safe-area-inset-bottom, 0px)); }

  /* 헤더의 화면 이동 링크는 탭 바와 **같은 말**이라 감춘다.
     ⚠ 마크업이 화면마다 다르다: 빌드·파티는 <header class="bg3-header"><nav><a>,
     아이템 화면은 <header><p><a> 다. 둘 다 적어야 한다.
     ⚠ 스포일러 방지 체크박스와 「출처와 라이선스」는 **남긴다** — 탭 바가 그 일을 안 한다. */
  .bg3-header nav a { display: none; }
  header p a[href="./build.html"] { display: none; }
}

/* ── 바텀 시트 (web/lib/sheet.js) ─────────────────────────────────────────
   「따로 보는 것」 셋이 같이 쓴다: 태그 필터 · 길게 누른 툴팁 · 아이템 상세.
   데스크톱에서는 가운데 창으로, 모바일에서는 아래에서 올라오는 시트로 뜬다. */
.bsheet {
  padding: 0;
  max-width: 560px;
  width: calc(100vw - 24px);
  max-height: 82vh;
  border: 1px solid var(--gold-dim, var(--m-dim));
  background: #17130d;
  color: var(--cream, var(--m-cream));
}
.bsheet::backdrop { background: #000a; }

.bsheet-grab { display: none; }

.bsheet-head {
  padding: 12px 16px 8px;
  font-size: 13px;
  letter-spacing: .16em;
  color: var(--gold-dim, var(--m-dim));
  border-bottom: 1px solid var(--line, var(--m-line));
}

.bsheet-body { padding: 12px 16px; overflow-y: auto; max-height: 62vh; }

/* ⚠ 모양을 **여기서 다 준다.** 예전에는 마크업이 `.btn ghost` 를 달고 나오고 여기는
   `:not(.btn)` 으로 되돌림을 뒀는데, 그 조건이 참인 적이 없어서 정작 .btn 이 없는
   아이템 화면에 브라우저 기본 회색 단추가 떴다(리뷰 M-1). 세 화면이 다 이 파일을
   싣고 이 파일이 마지막에 실리므로 여기 하나면 셋 다 같은 모양이 된다. */
.bsheet-close {
  display: block;
  width: calc(100% - 32px);
  margin: 8px 16px 16px;
  min-height: var(--m-touch);
  border: 1px solid var(--gold-dim, var(--m-dim));
  background: transparent;
  color: var(--cream, var(--m-cream));
  font: inherit;
  cursor: pointer;
}
.bsheet-close:hover { background: #ffffff10; }

@media (max-width: 720px) {
  /* 아래에서 올라온다. 좌우를 꽉 채우고 아래 모서리를 붙인다. */
  .bsheet {
    width: 100vw;
    max-width: none;
    max-height: 88vh;
    margin: auto auto 0;
    border-width: 1px 0 0;
  }
  .bsheet-body { max-height: 68vh; }
  /* 손잡이 — 「위로 끌 수 있다」가 아니라 「아래에서 올라온 것이다」를 말한다. */
  .bsheet-grab {
    display: block;
    width: 40px; height: 4px;
    margin: 8px auto 0;
    border-radius: 2px;
    background: var(--gold-dim, var(--m-dim));
  }
}

/* ── 태그 필터를 바텀 시트로 (A4) ─────────────────────────────────────────
   태그가 416종이라 인라인 <details> 를 펴면 목록이 화면 밖으로 밀린다.
   시안이 바텀 시트를 쓴 이유다 — 목록을 보면서 좁힌다.

   ⚠ **이 부품은 두 곳에 붙는다** — 아이템 화면의 #tagbar 와 빌더 고르기 창의
   #pickerfilter(web/build.js). 그래서 규칙을 style.css(아이템 화면만 싣는다)가
   아니라 여기 둔다. 처음에 style.css 에 뒀더니 build.html 에서 **데스크톱에도 중복
   단추가 떴다**(리뷰 C-1, 2026-08-07). 겨눔도 페이지 id 가 아니라 모듈이 붙이는
   .tagfilter 다 — CLAUDE.md 「공유 어휘는 문자열이 아니라 모듈로」와 같은 자리다.
   tests/mobile.test.js 의 「두 곳에 붙는 부품의 CSS」가 이 규칙을 강제한다.

   ⚠ **`>` 가 이 규칙의 핵심이다.** `.tagpicker { display: none }` 로 적으면 시트
   안으로 옮긴 뒤에도 안 보여서 눌러도 빈 시트가 뜬다. 마운트의 **직계**만 겨눈다. */
.tagsheetopen { display: none; }

@media (max-width: 720px) {
  .tagsheetopen { display: inline-block; min-height: var(--m-touch); }
  .tagfilter > .tagpicker { display: none; }
  /* 목록을 40vh 상자에 가두면 폰에서 한 번에 9개밖에 안 보인다(2026-08-07 실측).
     목록이 아이템 화면의 본문이다 — 페이지가 스크롤하게 둔다. */
  #list { max-height: none; }
  /* 시트 안의 태그 목록은 시트가 이미 스크롤한다 — 이중 스크롤을 없앤다. */
  .bsheet .taglist { max-height: none; overflow: visible; }
}

/* ── 터치 대상 (B3) ───────────────────────────────────────────────────────
   2026-08-07 실측(375×812): 계산 탭 터치 대상 61개 중 **52개**가 44px 미만이었고,
   그중에 **주 내비게이션인 탭(35px)** 이 있었다. 삭제 ✕ 는 23×25px, 체크박스는 13px.

   ⚠ 글자 크기는 안 건드린다 — 누르는 자리만 넓힌다. 글자를 키우면 한 줄에 안 들어가
   줄바꿈이 나고, 그것이 다시 배치를 흔든다.

   두 화면 세계를 다 덮으려고 여기 둔다: 빌드·파티는 skin.css 의 .tab/.btn/.del,
   아이템 화면은 style.css 의 .chip 과 맨 select/input 이다. */
@media (max-width: 720px) {
  /* 탭 모양으로 생긴 것 전부. .acttab 은 막별 계획의 1·2·3막 탭이다 —
     전수로 재고서야 빠진 것을 알았다(2026-08-07). 눈으로 훑지 말고 재서 찾을 것. */
  /* .stab 은 아이템 화면의 검색 탭 넷이다(⑤b). 전수로 재고서야 빠진 것을 알았다 —
     ⑤a 의 .acttab 과 같은 자리다. **눈으로 훑지 말고 재서 찾을 것.** */
  .tabs .tab, .mktab, .hbtab, .acttab, .stab { min-height: var(--m-touch); padding-inline: 14px; }
  .btn, .btn.ghost, .chip { min-height: var(--m-touch); }
  .del { min-width: var(--m-touch); min-height: var(--m-touch); }

  select,
  input[type="search"],
  input[type="text"] { min-height: var(--m-touch); }

  /* AC 슬라이더는 34px 이었다. 끌어야 하는 것이라 더 중요하다. */
  .acslider input[type="range"] { min-height: var(--m-touch); }

  /* 체크박스는 13px 이었다. 상자를 키우고 **라벨 전체**가 누르는 자리가 되게 한다 —
     <label> 안의 체크박스는 라벨 아무 데나 눌러도 켜진다.
     .dummytag 은 계산 탭의 목표 성질 태그·상태 14개다(2026-08-07 실측). */
  .spoilerfree, .raretoggle, .taggroup label, .dummytag {
    display: flex; align-items: center; min-height: var(--m-touch);
  }
  .spoilerfree input[type="checkbox"],
  .raretoggle input[type="checkbox"],
  .taggroup label input[type="checkbox"],
  .dummytag input[type="checkbox"] { width: 20px; height: 20px; flex: none; }

  /* ⚠ **길게 누르면 iOS 가 선택 콜아웃을 띄워 제스처를 가져간다** — 그러면
     pointercancel 이 와서 판정이 취소되고 시트가 안 뜬다. 툴팁이 붙는 칸에서만
     끈다(글을 고르는 것이 뜻이 있는 자리는 안 건드린다). 리뷰 M-6. */
  /* ⚠ **attachTooltip 이 겨누는 것과 같은 것을 겨눈다** — [data-key]·[data-id] 다.
     클래스로 적었더니 .gchip(툴팁 칸이 아니다)은 헛돌고 고르기 목록의
     `#pickerlist li[data-id]`(attachTooltip 의 두 뿌리 중 하나)가 빠졌다 — 리뷰가
     잡았다. 어휘를 두 벌 적지 않고 그쪽 선택자를 그대로 쓴다. */
  #panel [data-key], #panel [data-id], #pickerlist [data-id] {
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    user-select: none;
  }
}
