/* 청사진 지도 — 이 화면만의 어두운 톤.
 *
 * 프로젝트 원칙은 「다크 모드를 만들지 않는다」다. 그것은 모드 이야기이고, 이것은 한
 * 화면의 고정 톤이다 — 항공사진이 짙은 바다라 밝은 종이 위에서 이질적이고, 빔으로
 * 띄우는 발표 화면이라 어두운 쪽이 그림을 앞세운다.
 *
 * 팔레트를 --bp-* 로 가두고 선택자를 .bp-* 로 가둔다. 다른 화면이 이 파일을 읽어도
 * 아무 일도 일어나지 않는다.
 */
/* 변수는 :root 에 둔다. .bp-sheet·.bp-zoom 은 마크업에서 .bp-stage 의 형제이지 자손이
 * 아니다(mapPage() 참고) — .bp-stage 에 선언하면 상속이 거기서 끊겨 두 오버레이 안에서
 * 모든 --bp-* 가 무효가 되고, 그걸 참조하는 선언까지 통째로 무효가 된다(색·배경·테두리
 * 전부). 새지 않는 이유는 선택자가 아니라 **이 파일이 map/index.html 에서만 읽힌다**는
 * 것이다 — 그래서 :root 에 둬도 안전하다. */
:root {
  --bp-ink: #f2f7fb;
  --bp-ink-2: #b9cdda;
  --bp-deep: #071723;
  --bp-glass: rgba(7, 23, 35, .78);
  --bp-edge: rgba(242, 247, 251, .28);
  --bp-glow: #6fe3f5;
}
.bp-stage { color: var(--bp-ink); background: var(--bp-deep); }

/* 이 화면만의 예외 — 지도가 main 의 너비 상한(archiveCss 의 64rem)에 갇히면 빔 프로젝터
 * 화면에서 지도가 화면 절반도 못 채운다. blueprint.css 는 map/index.html 에서만 읽으므로
 * 이 규칙이 다른 화면으로 새지 않는다. 「선택자를 .bp-* 로 가둔다」규칙의 유일한 예외다.
 *
 * `main { ... }` 만으로는 archive.css 의 같은 특이성(0,0,1) 규칙에 로드 순서로 진다 —
 * page() 는 head(blueprint.css) 를 archive.css 앞에 둔다(그 순서를 지킬 이유가 따로
 * 있으므로 여기서 순서를 바꾸지 않는다). 특이성을 (0,0,2) 로 올려 순서와 무관하게 이긴다. */
body > main { max-width: none; padding: 0; }

/* main 의 패딩이 여기서 0 이 되므로, footer(<footer> 는 page() 에서 main 의 바로 자식)가
 * 다른 안전판 없이는 좁은 화면에서 화면 끝에 붙는다. archiveCss() 의 공유 `footer` 규칙
 * (특이성 0,0,1)은 모든 화면이 같이 쓰므로 거기서 채우면 지도 화면 아닌 곳까지 새 나간다
 * (겪어 본 문제 — 첫 시도 때 이 값을 archiveCss() 에 그대로 넣었다가 걷어냈다). 여기서
 * `main > footer`(특이성 0,0,2)로 이 화면에만, 문서 구조에만 기대어 이긴다. */
main > footer { padding-left: 18px; padding-right: 18px; }

/* base.css 의 `h1,h2,h3 { color: var(--ink) }` 는 요소에 직접 건 색이라 .bp-stage 의
 * 상속색을 이긴다 — 오버레이 안(.bp-card·.bp-zoom)의 제목도 마찬가지로 어둡게 찍힌다.
 * 여기서 명시적으로 되짚어야 한다. */
.bp-stage h1, .bp-stage h2, .bp-stage h3,
.bp-card h1, .bp-card h2, .bp-card h3,
.bp-zoom h1, .bp-zoom h2, .bp-zoom h3 {
  color: var(--bp-ink);
}

.bp-map {
  position: relative;
  width: min(100%, calc(100vh * 1.5));
  aspect-ratio: var(--bp-ratio, 1536 / 1023);
  margin: 0 auto;
  overflow: hidden;
  border-radius: 4px;
  background: var(--bp-deep);
  isolation: isolate;
}
.bp-aerial, .bp-shade { position: absolute; inset: 0; width: 100%; height: 100%; }
.bp-aerial { object-fit: cover; }
.bp-shade {
  pointer-events: none;
  background:
    linear-gradient(180deg, rgba(4, 18, 28, .72) 0%, transparent 26%),
    linear-gradient(0deg, rgba(4, 18, 28, .58) 0%, transparent 20%);
}

.bp-head {
  position: absolute; inset: 0 0 auto 0; z-index: 3;
  display: flex; justify-content: space-between; align-items: flex-start; gap: 1rem;
  padding: 1.2rem 1.4rem;
}
.bp-title h1 { margin: 0; font-size: clamp(1.5rem, 2.6vw, 2.4rem); }
.bp-title p { margin: .3rem 0 0; font-size: clamp(.95rem, 1.2vw, 1.15rem); color: var(--bp-ink-2); }
.bp-acts { display: flex; gap: .5rem; flex: 0 0 auto; }
.bp-btn {
  font: inherit; font-size: 1rem; min-height: 44px; padding: 0 1rem;
  color: var(--bp-ink); background: var(--bp-glass);
  border: 1px solid var(--bp-edge); border-radius: 999px; cursor: pointer;
}
.bp-btn:hover, .bp-btn:focus-visible { border-color: var(--bp-glow); }

/* 힌트 — 화면 한가운데(50/50)에 두면 딱섬 힐링투어(43/48)와 거의 겹친다. 아래 가운데로
 * 옮긴다. 가장 아래 스팟인 바다학교도 79% 에 있고 왼쪽(22%)으로 치우쳐 있어 이 자리와
 * 겹치지 않는다. 클릭을 가로채지 않도록 pointer-events 도 끈다. */
.bp-hint {
  position: absolute; z-index: 3; bottom: 1.2rem; left: 50%; transform: translateX(-50%);
  margin: 0; padding: .5rem 1rem; font-size: 1rem;
  background: var(--bp-glass); border: 1px solid var(--bp-edge); border-radius: 999px;
  pointer-events: none;
}
.bp-hint.gone { display: none; }

/* 스팟 — 아이콘을 좌표에 고정하고 이름표를 오른쪽으로 흘린다.
 * blueprint 원본은 알약 전체를 좌표에 중앙 정렬해서 이름이 길수록 아이콘이 왼쪽으로
 * 밀렸다. 좌표가 곧 가리키는 자리여야 한다. */
.bp-spot {
  position: absolute; z-index: 4;
  transform: translateY(-50%);
  display: flex; align-items: center; gap: .5rem;
  min-height: 44px; padding: .3rem .9rem .3rem .3rem;
  font: inherit; font-size: 1.05rem; font-weight: 700;
  color: var(--bp-ink); background: var(--bp-glass);
  border: 1px solid var(--bp-edge); border-radius: 999px; cursor: pointer;
  white-space: nowrap;
}
.bp-spot::before {
  content: ''; flex: 0 0 auto; width: 1.6rem; height: 1.6rem; border-radius: 50%;
  background: var(--bp-glow); box-shadow: 0 0 0 4px rgba(111, 227, 245, .22);
}
.bp-spot .n { font-size: .85rem; font-weight: 400; color: var(--bp-ink-2); }
.bp-spot:hover, .bp-spot:focus-visible { border-color: var(--bp-glow); }

/* 스팟 모달 */
.bp-sheet {
  position: fixed; inset: 0; z-index: 40;
  display: grid; place-items: center; padding: 1rem;
  background: rgba(3, 12, 20, .88);
}
.bp-card {
  width: min(100%, 78rem); max-height: calc(100vh - 2rem); overflow: auto;
  display: grid; grid-template-columns: 1.4fr 1fr; gap: 0;
  background: var(--bp-deep); color: var(--bp-ink);
  border: 1px solid var(--bp-edge); border-radius: 6px;
}
.bp-gallery { padding: 1rem; min-width: 0; }
.bp-frame { position: relative; background: #04121c; border-radius: 4px; overflow: hidden; }
.bp-frame img, .bp-frame video { display: block; width: 100%; max-height: 62vh; object-fit: contain; }
.bp-frame figcaption, .bp-cap { display: block; padding: .6rem .8rem; font-size: .95rem; color: var(--bp-ink-2); }
.bp-story { font-size: 1.75rem; line-height: 1.75; padding: 1.2rem; }
.bp-story h3 { margin: 0 0 .8rem; font-size: 1.9rem; }
.bp-story .who { display: block; margin-top: 1rem; font-size: 1.1rem; color: var(--bp-ink-2); }
/* 빈 탭 — 들어올 자리를 점선으로 남긴다. 액자만한 높이를 잡아 탭을 오갈 때
   시트가 접혔다 펴지지 않게 한다. */
.bp-empty { display: flex; align-items: center; justify-content: center; text-align: center;
  min-height: 34vh; margin: 0; padding: 1.2rem; font-size: 1.05rem; color: var(--bp-ink-2);
  border: 1px dashed var(--bp-edge); border-radius: 4px; }
.bp-nav { display: flex; justify-content: space-between; gap: .5rem; margin-top: .6rem; }
.bp-tabs { display: flex; gap: .4rem; margin-top: .8rem; flex-wrap: wrap; }
.bp-tab { font: inherit; font-size: 1rem; min-height: 44px; padding: 0 .9rem;
  color: var(--bp-ink-2); background: transparent;
  border: 1px solid var(--bp-edge); border-radius: 999px; cursor: pointer; }
.bp-tab[aria-selected="true"] { color: var(--bp-deep); background: var(--bp-glow); border-color: var(--bp-glow); }
.bp-copy { padding: 1.4rem; border-left: 1px solid var(--bp-edge); }
.bp-copy h2 { margin: 0 0 .5rem; font-size: 1.6rem; }
.bp-copy p { font-size: 1.05rem; color: var(--bp-ink-2); }

/* 라이트박스 — 빔 프로젝터에서 그림 하나를 화면 가득 */
.bp-zoom { position: fixed; inset: 0; z-index: 60; background: #030c14;
  display: grid; grid-template-rows: 1fr auto; }
.bp-zoom img { width: 100%; height: 100%; object-fit: contain; min-height: 0; }
.bp-zoom .meta { padding: 1rem 1.4rem; color: var(--bp-ink-2); font-size: 1.15rem;
  display: flex; justify-content: space-between; align-items: center; gap: 1rem; flex-wrap: wrap; }
.bp-zoom .meta a { color: var(--bp-glow); }

/* 모달·라이트박스는 [hidden] 으로 닫혀 있다. 위 두 규칙이 display: grid 를 적어 두므로
 * 저자 display 선언이 브라우저 기본 [hidden]{display:none} 을 이긴다 — 이 줄이 없으면
 * 페이지가 열리자마자 화면 전체를 뒤덮어 못 쓰게 된다. */
.bp-sheet[hidden], .bp-zoom[hidden] { display: none; }

/* 지도 아래 글 목록 — 스크립트가 막힌 자리와 낭독기를 위한 같은 내용 */
.bp-below { max-width: 60rem; margin: 2rem auto; padding: 0 1rem; }

@media (max-width: 860px) {
  .bp-card { grid-template-columns: 1fr; }
  .bp-copy { border-left: 0; border-top: 1px solid var(--bp-edge); }
  .bp-spot { font-size: .95rem; padding: .25rem .7rem .25rem .25rem; }
  .bp-spot .n { display: none; }
  .bp-story { font-size: 1.25rem; }
}
@media (prefers-reduced-motion: reduce) {
  .bp-spot, .bp-btn, .bp-tab { transition: none; }
}
