@import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard@1.3.9/dist/web/static/pretendard.css');
@import url('https://fonts.googleapis.com/css2?family=Nanum+Myeongjo:wght@400;700;800&display=swap');

/* [T116 §H-7] index.html의 <meta name="color-scheme" content="light"> 보강 — 삼성 인터넷/크롬의
   "웹사이트 다크 모드" 강제 반전을 막는다. 다크 테마 신설이 아니라 "라이트 전용" 선언. */
html { color-scheme: light only; }

/* [T230-G, 대표 지시 — "설명문이 줄 끝에서 어색하게 끊긴다... 마침표마다 강제 줄바꿈하지 마라"]
   text-wrap:pretty는 브라우저가 문단 마지막 줄에 한 단어만 남는 "고아 단어"를 피하도록 줄바꿈을
   재배치한다(지원 브라우저에서만, 미지원은 기존 normal과 동일하게 조용히 무시 — 점진적 향상이라
   전 로케일에 안전하게 걸 수 있음). 이 SPA는 설명문 클래스가 `.card-desc`/`.location-desc`/
   `.login-desc`/`.oi-desc`/`.people-desc`/`.t-desc`/`.h2-save-tile-desc`처럼 화면마다 접미사만
   같은 개별 클래스로 흩어져 있어(단일 `.desc` 클래스 없음, 실측 확인) `p`(문단 요소 전반)에
   거는 게 더 안전·완전하다 — 이미 한 줄인 문단엔 영향이 없는 순수 화장용 속성이라 넓게 걸어도
   부작용이 없다. word-break:keep-all은 한국어 전용으로 :lang(ko) 스코프 — 이 문서(<html lang>)는
   로케일 전환마다 lang.js의 setLang()이 갱신한다(그 파일 주석 참고, 예전엔 "ko"로 고정돼 있어
   :lang() 선택자가 무의미했다). ja/zh-Hant는 실측 결과(대표 확정) keep-all을 걸면 공백 없는
   CJK 텍스트가 유효한 줄바꿈 지점을 못 찾아 넘칠 위험이 있어 기본값(normal, 문자 단위 줄바꿈
   허용) 그대로 둔다 — text-wrap:pretty만 공통 적용. */
p { text-wrap: pretty; }
:lang(ko) p { word-break: keep-all; }

/* ── 명조 폰트 단축 ── */
:root {
  --myeongjo: 'Nanum Myeongjo', 'MaruBuri', 'Gungsuh', Georgia, serif;
  --pretendard: 'Pretendard', -apple-system, BlinkMacSystemFont, 'Apple SD Gothic Neo', 'Noto Sans KR', sans-serif; /* #지시서_20260714저녁 1 */
}

:root {
  /* ── 배경 (한지 팔레트) ── */
  /* [T308-6 §1, 대표 지시 — "전 화면 바탕을 흰색으로, --tg-surface는 그대로"] body 캔버스를
     흰색으로 통일 — --bg만 바꾼다(body{background:var(--bg)}, 아래 1줄이 유일한 소비처,
     실측 확인). --bg-2는 손대지 않는다 — 이 토큰은 body 데스크톱 재정의(아래 미디어쿼리) 외에
     서브카드 배경 7곳(라인 629/692/950/1070/1184/1355/1905)에서도 쓰여, 여기서 값을 바꾸면
     "페이지 바탕"이 아니라 그 서브카드들까지 같이 흰색으로 바뀐다(대표 지시 범위 밖 — "카드·
     섹션 면"은 그대로 두라는 지시와 충돌). 대신 데스크톱 재정의 셀렉터(아래) 쪽에서 --bg-2
     참조를 걷어내고 이미 흰색인 --bg-1을 직접 쓴다 — --bg-2 토큰 자체와 그 다른 7개 소비처는
     전부 무변경. --tg-surface(카드·보조버튼·안내박스 면, .shop-band-card 1곳만 참조)도
     완전히 별개 토큰이라 애초에 무관. */
  --bg:       #FFFFFF;                   /* 흰 캔버스 — body 배경(구 한지 미색 #FBF7EF) */
  --bg-1:     #FFFFFF;                   /* 백자 흰 — 카드/화면      */
  --bg-2:     #F5F0E8;                   /* 살짝 아이보리 — 서브 카드(무변경, 페이지 배경과 무관) */
  --bg-nav:   rgba(251,247,239,0.97);    /* 네비 오버레이            */
  --bg-modal: rgba(26,22,20,0.55);       /* 모달 딤 — 어두운 채로 유지 */
  --bg-over:  rgba(251,247,239,0.85);    /* 반투명 오버레이           */

  /* ── 텍스트 계층 (먹 계열) ── */
  --text-1: #1A1614;   /* 먹색       — primary   */
  --text-2: #6B5E52;   /* 담먹       — secondary */
  --text-3: #9A8F80;   /* 옅은 먹    — muted     */
  --line:   #E8E0D4;   /* 한지 경계  — border    */

  /* ── 쪽빛 액센트 (틸→쪽빛) ── */
  --accent:   #26547C;
  --accent-dk:#1A3F6B;
  --ac-70: rgba(38,84,124,0.7);
  --ac-60: rgba(38,84,124,0.6);
  --ac-50: rgba(38,84,124,0.5);
  --ac-35: rgba(38,84,124,0.35);
  --ac-30: rgba(38,84,124,0.3);
  --ac-25: rgba(38,84,124,0.25);
  --ac-20: rgba(38,84,124,0.2);
  --ac-18: rgba(38,84,124,0.18);
  --ac-15: rgba(38,84,124,0.15);
  --ac-12: rgba(38,84,124,0.12);
  --ac-10: rgba(38,84,124,0.1);
  --ac-08: rgba(38,84,124,0.08);

  /* ── 그림자 (라이트 모드 — 훨씬 옅게) ── */
  --sh-65: rgba(0,0,0,0.12);
  --sh-60: rgba(0,0,0,0.1);
  --sh-50: rgba(0,0,0,0.08);
  --sh-40: rgba(0,0,0,0.06);

  /* ── 기능 확장색 (CSS 변수로만 사용 — hex 직접 금지) ── */
  --warn:         #B8912A;   /* 금박       — 부분완료·내여행 탭  */
  --accent-hover: #b03428;   /* 단청 호버  — 버튼 :hover 다크   */
  --border-mid:   #C8C0B4;   /* 중간 경계  — 진한 구분선        */
}

/* [T308 §0, 1차 지시 — 네이비/빨강 2색] 폐기됨, 이력만 보존.
   [T308-1c, 대표 확정 — "트리플 결 밝은 팔레트 + 오션 시안"] 폐기됨(아래 1d가 정정) — 1c는
   --tg-red까지 오션 값으로 재도색해 "행동(CTA)"과 "선택 상태"를 하나의 색으로 합쳤는데, 이
   토큰이 로고("!go!" 글자, views/index.html .h2-logo .go)에도 체인으로 물려 있어(§0 코멘트가
   "로고는 이 토큰 체계와 무관"이라 잘못 적어놨었다 — 실제로는 .h2-logo .go{color:var(--h2-coral)}
   → --h2-coral:var(--tg-red) 2단 체인으로 로고까지 오션으로 물들었다) 로고와 CTA가 둘 다
   시안이 되는 결함으로 이어졌다.
   [T308-1d, 대표 확정(최종) — "1c 색 배정 정정"] 역할별로 다시 분리한다: 로고·주요 CTA
   버튼(일정 만들기·성지 보기·일정 열기 류)·상단 메뉴 활성 밑줄 = 빨강(--tg-red, 리터럴 값으로
   복원, 더 이상 오션 값을 재참조하지 않음). 선택 상태(활성 탭·칩·선택 링·담기 체크)·필터·보조
   요소는 오션 그대로(--tg-navy 계열은 1c 값 유지, 이번에 건드리지 않는다). 이번 라운드부터는
   토큰 값 바꿔치기가 아니라 소비처 단위로 재배선하는 원칙 — 로고는 아예 공유 토큰 체인에서
   빼서 전용 값을 쓴다(아래 §0-b, views/index.html .h2-logo .go 규칙 참고). 기존
   --accent(#26547C 쪽빛)·--accent-hover는 정적 SEO 1,964장·미개편 화면이 계속 참조하므로
   무변경(전량 재생성 금지 원칙). */
:root {
  --tg-accent:       #0a9cbf;   /* 밝은 오션 — 선택 상태(칩 테두리·선택 링·아이콘) 전용, 흰 글자 얹지 않음 */
  --tg-accent-dark:  #0881a0;   /* 진한 오션 — 선택 상태 중 흰 글자가 얹히는 채움(활성 탭·칩 배경)용, 대비 4.51:1 통과 */
  --tg-accent-light: #e4f4f8;   /* 연한 칩 배경 */
  --tg-surface:      #f2f7f9;   /* 카드 배경·보조 버튼·안내 박스 면 */
  --tg-navy:     var(--tg-accent-dark);   /* [1c 유지, 1d 무변경] 선택 상태 계열 */
  --tg-navy-bg:  var(--tg-accent-light);  /* [1c 유지, 1d 무변경] 선택 상태 옅은 배경 */
  /* [1d 정정] --tg-red를 리터럴 빨강으로 복원 — 오션 값 재참조를 끊는다. 이 토큰을 직접/간접
     (--h2-coral 경유) 소비하는 요소는 전부 원래 빨강으로 돌아간다: CTA 버튼(일정 만들기·성지
     보기 등)·상단 메뉴 활성 밑줄·3단계 뱃지(01/02/03)·검색 아이콘. 로고만은 이 토큰조차 거치지
     않도록 별도 값으로 뺐다(views/index.html 참고) — 다음 색 라운드에서 이 토큰이 다시 바뀌어도
     로고가 영향받지 않게 하기 위함. */
  --tg-red:      #d94436;
  --tg-red-hover: #b3352a;   /* [1d 신설] CTA 버튼 호버 전용 — 이전 라운드엔 정의된 호버가 없었다 */
  --tg-bg:       #FFFFFF;   /* 본문 흰 바탕(§0) — 미개편 화면은 여전히 --bg(한지톤) 참조 */
  /* [1d 정정 — 대표 확정 "푸터 색 변경"] 연한 면 폐기 → 진한 오션 채움(흰 글자)으로 재변경.
     밝은 면 버전(1c 한 라운드만 쓰인 값)은 폐기 — 아래 footer 규칙도 전부 흰 글자용으로
     같이 고쳤다. */
  --tg-footer:   var(--tg-accent-dark);
}

/* [T131 재발행 — 레이아웃 전용 개선, 색 변경 없음] 여백·컨테이너·라운드 토큰 — 색 토큰은
   위 블록에서 단 1px도 안 건드렸다(값 무변경 증명은 커밋 보고에 hex 집합 대조로 첨부).
   컨테이너 폭은 그동안 화면마다 1120px/1180px 두 값이 따로 있었다(views/index.html #app-root
   기본 vs 홈(#screen1)만 별도 override, .h2-wrap도 자체적으로 두 값이 충돌) — 여기 하나로
   합쳐서 그 값들을 대체한다. 스페이싱 스케일은 기존에 실제로 가장 많이 쓰이던 값들(app.css
   전체 여백값 실측 집계 — 16px×27회, 14px×24회, 8px×21회, 12px×19회, 24px×13회가 최빈값)을
   그대로 스케일로 승격한 것이지 새로 발명한 임의 값이 아니다. */
:root {
  --content-max: 1240px;      /* [T131] 데스크톱 콘텐츠 최대폭 통일 — 이전 1120px/1180px 두 값을 대체 */
  --bottom-nav-h: 64px;       /* [T131 재발행 §4c 승인] .bottom-nav 높이 — 여러 곳에서 64px를
                                  매직넘버로 따로 박아 쓰고 있었다(.screen 패딩, 이어하기 미니바
                                  bottom 값). 이 변수 하나로 참조하게 정리 */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 24px;
  --space-6: 32px;
  --space-7: 48px;
  --radius-sm: 10px;          /* 칩/입력 등 작은 요소 */
  --radius-md: 14px;          /* 일반 카드 */
  --radius-lg: 20px;          /* 큰 카드/시트 */

  /* ── 레이어 z-index(고정 계층) — [T205, 대표 지시 "임시 땜질이 아니라 모달은 항상 최상위
     레이어 컨테이너에 마운트 원칙으로"] 실측(모바일 시트·데스크톱 팝오버 둘 다) — 확인/경고
     모달 다수가 .h2-sheet(10000)·.h2-popover(10001)보다 낮은 9800~10000대 z-index를 써서
     그 아래 깔렸다(views/index.html의 warnModal·zoneModal·departSearchModal, app.css의
     .location-modal·.cs-modal, ui-core2.js가 동적 생성하는 한도/로그인 모달 4종 전부 동일
     결함 — 상세 목록은 T205 보고서 §2). 새 모달을 추가할 때는 반드시 --z-modal-top을
     재사용할 것(매직넘버 금지) — 이 토큰 하나만 올리면 전체가 함께 올라가 재발을 막는다. */
  --z-sheet: 10000;      /* .h2-sheet(원박스 위젯 모바일 시트) — 화면 전체를 덮는 1차 레이어 */
  --z-popover: 10001;    /* .h2-popover·.cal-overlay 등 시트/화면 위에서 여는 보조 팝오버 */
  --z-modal-top: 10500;  /* 확인·경고·한도 모달 전용 — 시트·팝오버 어느 쪽이 열려 있어도 항상 그 위 */
}

    * { margin: 0; padding: 0; box-sizing: border-box; }

    /* [T131 재발행 §4 승인] 키보드 포커스 링 전면 신설 — 이 파일도 views/index.html도
       :focus-visible이 단 한 곳도 없었다(마우스 클릭시엔 안 보이고 Tab 키 이동시에만 보이는
       현대적 방식이라 클릭 사용자 경험엔 무해). 기존 --accent 토큰을 그대로 재사용(신규 색
       추가 아님, "색상 값 무변경" 원칙 준수) — outline은 배경색과 별개 레이어라 어떤 배경
       위에서도 항상 보인다. */
    :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

    /* [T92-R §B-5 재수정, 대표 실측] 홈 히어로(#h2Hero, views/index.html)의 100vw 풀블리드
       브레이크아웃이 스크롤바 폭만큼 넘치지 않게 하려면 overflow-x:hidden이 "진짜 뷰포트 전체
       폭인" 요소에 있어야 한다 — #app-root(데스크톱에서 max-width:1120px "폰 프레임")나 그 안의
       #h2Root에 걸면 그 좁은 경계에서 브레이크아웃이 잘려버린다(실측 재현 원인). body는 전
       화면·모든 콘텐츠에 공용이라 여기 두는 게 유일하게 안전한 지점(가로 스크롤바 자체를 막는
       흔한 관행이라 다른 화면에도 무해). */
    body {
      background: var(--bg);
      color: var(--text-1);
      font-family: 'Apple SD Gothic Neo', 'Noto Sans KR', sans-serif;
      min-height: 100vh;
      overflow-x: hidden;
      display: flex;
      justify-content: center;
    }

    /* ─── 앱 전체 래퍼 ───
       [T308, 대표 지시 — "#app-root의 max-width:480px 전역 제한을 제거하고, 그 폭 제한을 화면별
       컨테이너 클래스(.screen-narrow)로 내린다"] 이전엔 데스크톱에서도 항상 480px 폰 목업(그림자
       프레임)이었다 — 이제 #app-root 자체는 폭 제한이 없는 순수 래퍼(배경·그림자 장식도 제거,
       "폰 목업 그림자 프레임 장식은 제거" 지시)이고, 개편 대상 화면(홈 등)은 진짜 반응형으로
       퍼지며, 아직 개편 안 된 화면은 각자 .screen-narrow를 붙여 기존 480px 중앙 정렬 외관만
       유지한다(흰 풀폭 배경 가운데 480 콘텐츠 — 그림자 카드 느낌은 없음). */
    #app-root {
      width: 100%;
      min-height: 100vh;
      position: relative;
      background: var(--bg-1);   /* [T308 §0 "본문 흰 바탕"] 배경은 유지(--bg-1은 이미 흰색) —
                                     지시 대상은 max-width·그림자(폰 목업 장식)뿐, 배경 무변경. */
    }
    /* [T308-1, 정지점2 갱신] 미개편 화면 전용 — 기존 480px 폭·중앙정렬만 재현(그림자·배경색 없음).
       정지점2에서 §4(screen5·screen7)·§5(screen3)가 이 클래스에서 빠져나가 남은 대상은 6개
       (screen2·4·6·8·9·10, 아래 320행 인근 코멘트도 같이 갱신). */
    .screen-narrow {
      max-width: 480px;
      margin: 0 auto;
      width: 100%;
    }
    /* [T308-1, 정지점2 — §4 탈프레임 새 셸] screen5(커뮤니티)·screen7(내 여행)는 screen3(§5)처럼
       자체 데스크톱 그리드가 없던 단순 리스트/카드형 화면이라, home의 .h2-wrap(1240px, 마케팅
       레이아웃)을 그대로 쓰기엔 넓다 — 목록·설정류 화면에 흔한 중간 폭(760px)으로 새 셸을 준다.
       .screen-inner 자체에 적용(내부 tab bar padding:0 20px 등 기존 좌우 패딩은 그대로 유지되고,
       이 규칙은 그 바깥에서 전체를 가운데로 좁히기만 한다 — 내부 마크업 무수정). */
    #screen5 > .screen-inner, #screen7 > .screen-inner {
      max-width: 760px;
      margin: 0 auto;
      width: 100%;
    }

    /* [T308-7 C-2, 대표 지시 — "독립 섹션으로 분리해 새 카드 서식으로 보존"] 여행 스타일·페이스
       카드(#tripStyleCard, views/index.html) 등 결과 화면의 일반 카드 섹션에 쓰는 공용 클래스 —
       흰 배경+옅은 테두리로, T308 마라톤 전체가 써온 카드 관례(예: 아래 .mytrip-hero-card)와
       같은 문법. */
    .h2-section-card{background:var(--h2-bg,#fff);border:1px solid var(--h2-line);border-radius:16px;padding:16px;margin-bottom:14px;}
    /* [T308-3 §E, 대표 지시 — "내 여행 시안 레이아웃"] 히어로 카드(예정 탭 최상단 1건)와 컴팩트
       사진 카드(나머지 전부) 공용 CSS. <768px는 그리드 1열(지시 원문), 히어로는 세로 스택(사진
       위·콘텐츠 아래) — 768px부터 히어로는 좌우 분할, 그리드는 다열로 넓어진다. */
    .mytrip-hero-card{display:flex;flex-direction:column;background:var(--h2-cream);border:1px solid var(--h2-line);border-radius:16px;overflow:hidden;margin-bottom:16px;}
    .mytrip-hero-photo{height:160px;background-size:cover;background-position:center;background-color:var(--h2-line);cursor:pointer;flex-shrink:0;}
    .mytrip-hero-body{padding:16px;}
    @media(min-width:768px){
      .mytrip-hero-card{flex-direction:row;}
      .mytrip-hero-photo{width:38%;height:auto;min-height:200px;}
      .mytrip-hero-body{flex:1;padding:22px;}
    }
    .mytrip-grid{display:grid;grid-template-columns:1fr;gap:12px;}
    @media(min-width:768px){ .mytrip-grid{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));} }
    .mytrip-compact-card{position:relative;border-radius:14px;overflow:hidden;height:150px;background-size:cover;background-position:center;background-color:var(--h2-line);cursor:pointer;transition:filter .15s;}
    .mytrip-compact-overlay{position:absolute;left:0;right:0;bottom:0;padding:10px 12px;background:linear-gradient(transparent,rgba(0,0,0,.62));}

    /* ─── §대표님 지시(2026-07-24): 데스크톱 화면배치 정리 — A안 ───
       물놀이 지도 오버레이(#_wpOverlay, document.body에 직접 fixed로 붙는 모바일 전용 오버레이)가
       데스크톱 넓은 뷰포트에서 뷰포트 전체 폭(100vw)으로 퍼져 #app-root(480px 프레임)와 어긋나던 문제.
       JS의 인라인 style(top:0;left:0;right:0;bottom:0;width:100%)은 미디어쿼리를 가질 수 없어
       !important로 데스크톱 폭에서만 좌우를 좁혀 #app-root와 동일한 중앙 정렬 프레임을 적용한다.
       모바일(768px 미만)은 media query 밖이라 기존 풀폭 그대로 — 회귀 없음.
       .demo-nav(위 93~99행)가 이미 쓰는 것과 동일한 left:50%+translateX(-50%) 중앙정렬 패턴 재사용. */
    @media (min-width: 768px) {
      #_wpOverlay {
        left: 50% !important;
        right: auto !important;
        width: 100% !important;
        max-width: 480px !important;
        transform: translateX(-50%);
      }
    }

    /* [T45-3] 데스크톱(≥768px) 프레임 톤 정리, 앱 컨테이너 그림자 소폭 축소. 모바일(768px 미만)은
       media query 밖이라 무변. DOM 변경 없음.
       [T308-6 §1, 대표 지시 — "전 화면 바탕을 흰색으로"] 여기서 쓰던 --bg-2(서브카드와 공유하는
       토큰, 위 :root 코멘트 참고)를 걷어내고 이미 흰색인 --bg-1을 직접 쓴다 — --bg-2 자체 값은
       무변경으로 남겨 다른 7곳 소비처에 영향 없음. */
    @media (min-width: 768px) {
      body { background: var(--bg-1); }
      #app-root { box-shadow: 0 0 40px var(--sh-50); }
    }

    /* ─── 화면 공통 ─── */
    .screen {
      display: none;
      min-height: 100vh;
      background: var(--bg-1);
      flex-direction: column;
      overflow-y: auto;
    }
    .screen.active { display: flex; }
    /* 지도 화면: 고정 높이로 카카오맵 정상 렌더링 */
    #screen8 { min-height: unset; height: 100vh; overflow: hidden; }
    #screen8 .screen-inner { height: 100%; overflow: hidden; }
    /* [T79-G §G4] 대표님 실기기 판정: 33vh 고정이 하단 흰 공간(탭바 위 빈 영역)을 남김 — 뷰포트
       기준 높이로 변경, 남은 공간을 전부 차지하도록 flex:1로 전환(#mapBodyRow가 이미
       flex:1;display:flex;min-height:0로 준비돼 있어 별도 계산식 없이 자연히 탭바 바로 위까지
       채워짐). 과거(T77-3 B2) "flex:1은 hidden 상태에서 0이 됨" 우려는 map.js의 initKakaoMap()
       내 ResizeObserver 대기 로직(0크기면 실제 표시될 때까지 대기 후 재진입)이 이미 방어하고
       있어 무접촉으로 확인. */
    #screen8 #kakaoMapWrap { flex: 1; height: auto; min-height: 220px; }
    #screen8 #kakaoMapContainer { height: 100% !important; min-height: 220px; }
    /* 입력 폼 CTA 버튼 가림 방지 — §[T40-3 A-6-3](2026-07-29, Fable 판정): 하드코딩 150px 폐지.
       --bottombar-h는 JS(lang.js _updateBottomBarPad)가 .bottom-bar 실측 높이로 채운다.
       JS 실행 전(최초 페인트) 폴백으로만 150px 유지 — 평상시엔 실측값이 우선한다. */
    #screen2 .container { padding-bottom: calc(var(--bottombar-h, 150px) + env(safe-area-inset-bottom, 0px)); }

    /* ─── 진행 바 (상단 데모 네비) ─── */
    .demo-nav {
      position: fixed;
      top: 0;
      left: 50%;
      transform: translateX(-50%);
      width: 100%;
      max-width: 480px;
      z-index: 9999;
      background: var(--bg-nav);
      backdrop-filter: blur(8px);
      border-bottom: 1px solid var(--line);
      padding: 8px 16px;
      display: flex;
      align-items: center;
      gap: 6px;
    }
    .demo-nav span {
      font-size: 11px;
      color: var(--text-3);
      letter-spacing: 0.3px;
      margin-right: 6px;
      white-space: nowrap;
    }
    .demo-dot {
      flex: 1;
      height: 4px;
      border-radius: 2px;
      background: var(--line);
      cursor: pointer;
      transition: background 0.2s;
      position: relative;
    }
    .demo-dot::after {
      content: attr(data-label);
      position: absolute;
      top: 8px;
      left: 50%;
      transform: translateX(-50%);
      font-size: 10px;
      color: var(--text-3);
      white-space: nowrap;
    }
    .demo-dot.active { background: var(--accent); }
    .demo-dot.active::after { color: var(--accent); }
    .demo-dot:hover { background: var(--ac-50); }

    /* ─── 로그인 버튼 (우상단) ─── */
    .demo-login-btn {
      background: transparent;
      border: 1px solid var(--line);
      color: var(--text-2);
      font-size: 11px;
      font-weight: 600;
      padding: 4px 10px;
      border-radius: 10px;
      cursor: pointer;
      white-space: nowrap;
      font-family: inherit;
      /* [T79 §A2] .demo-dot(진행바)가 display:none으로 빠지면서 flex 스페이서 역할을 잃어
         로그인 버튼이 로고 옆(좌측)에 붙어버림 — margin-left:auto로 우측 고정. */
      margin-left: auto;
    }
    .demo-login-btn:hover { border-color: var(--accent); color: var(--accent); }

    /* ─── 진행률 대시보드 탭 버튼 ─── */
    .progress-tab-btn {
      background: var(--ac-15);
      border: 1px solid var(--ac-30);
      color: var(--accent);
      font-size: 11px;
      font-weight: 700;
      padding: 4px 10px;
      border-radius: 10px;
      cursor: pointer;
      white-space: nowrap;
      flex-shrink: 0;
    }
    .progress-tab-btn:hover { background: var(--ac-25); }

    /* ─── 화면 래퍼 (데모 바 높이 보상) ─── */
    .screen-inner {
      margin-top: 36px;
      flex: 1;
      display: flex;
      flex-direction: column;
    }

    /* ─── 진행률 대시보드 화면 ─── */
    .progress-screen {
      display: none;
      position: fixed;
      inset: 36px 0 0 0;
      background: var(--bg-1);
      overflow-y: auto;
      z-index: 9990;
    }
    .progress-screen.active { display: block; }
    .progress-screen .ps-inner {
      max-width: 600px;
      margin: 0 auto;
      padding: 24px 20px 60px;
    }
    .ps-title {
      font-size: 18px;
      font-weight: 800;
      margin-bottom: 4px;
    }
    .ps-sub {
      font-size: 13px;
      color: var(--text-3);
      margin-bottom: 24px;
    }

    /* 전체 진행률 큰 원형 */
    .overall-ring {
      display: flex;
      align-items: center;
      gap: 20px;
      background: var(--ac-08);
      border: 1px solid var(--ac-20);
      border-radius: 16px;
      padding: 20px;
      margin-bottom: 20px;
    }
    .ring-wrap {
      position: relative;
      width: 80px;
      height: 80px;
      flex-shrink: 0;
    }
    .ring-wrap svg { transform: rotate(-90deg); }
    .ring-center {
      position: absolute;
      inset: 0;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
    }
    .ring-pct { font-size: 20px; font-weight: 800; color: var(--accent); }
    .ring-label { font-size: 9px; color: var(--text-3); }
    .overall-info .oi-title { font-size: 16px; font-weight: 800; margin-bottom: 4px; }
    .overall-info .oi-day { font-size: 13px; color: var(--accent); font-weight: 700; margin-bottom: 4px; }
    .overall-info .oi-desc { font-size: 12px; color: var(--text-3); line-height: 1.5; }

    /* 섹션 헤더 */
    .ps-section-title {
      font-size: 12px;
      color: var(--text-3);
      letter-spacing: 0.5px;
      text-transform: uppercase;
      margin-bottom: 10px;
      margin-top: 20px;
    }

    /* 진행률 행 */
    .prog-row {
      display: flex;
      align-items: center;
      gap: 10px;
      margin-bottom: 10px;
    }
    .prog-label {
      font-size: 13px;
      min-width: 130px;
      color: var(--text-2);
      flex-shrink: 0;
    }
    .prog-bar-wrap {
      flex: 1;
      height: 6px;
      background: var(--line);
      border-radius: 3px;
      overflow: hidden;
    }
    .prog-bar {
      height: 100%;
      border-radius: 3px;
      transition: width 0.6s ease;
    }
    .prog-bar.done { background: var(--accent); }
    .prog-bar.partial { background: var(--warn); }
    .prog-bar.none { background: var(--line); width: 100% !important; }
    .prog-pct {
      font-size: 12px;
      font-weight: 700;
      min-width: 36px;
      text-align: right;
      flex-shrink: 0;
    }
    .prog-pct.done { color: var(--accent); }
    .prog-pct.partial { color: var(--warn); }
    .prog-pct.none { color: var(--text-3); }

    /* 화면별 3열 진행률 */
    .screen-grid {
      display: grid;
      grid-template-columns: repeat(2, 1fr);
      gap: 10px;
      margin-bottom: 4px;
    }
    .screen-card {
      background: var(--line);
      border: 1px solid var(--line);
      border-radius: 12px;
      padding: 14px;
    }
    .sc-name { font-size: 13px; font-weight: 700; margin-bottom: 10px; }
    .sc-row {
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-bottom: 6px;
    }
    .sc-row-label { font-size: 11px; color: var(--text-3); }
    .sc-row-pct { font-size: 11px; font-weight: 700; }
    .sc-bar-wrap {
      width: 100%;
      height: 4px;
      background: var(--line);
      border-radius: 2px;
      overflow: hidden;
      margin-top: 2px;
    }
    .sc-bar { height: 100%; border-radius: 2px; }

    .close-progress {
      width: 100%;
      margin-top: 24px;
      padding: 14px;
      background: var(--line);
      border: 1px solid var(--line);
      color: var(--text-2);
      border-radius: 12px;
      font-size: 14px;
      cursor: pointer;
    }

    /* ════════════════════════════
       SCREEN 1 — 랜딩
    ════════════════════════════ */

    .top-bar {
      display: flex;
      justify-content: flex-end;
      padding: 20px 28px;
    }
    .lang-btn {
      background: var(--line);
      border: 1px solid var(--line);
      color: var(--text-1);
      padding: 6px 14px;
      border-radius: 20px;
      font-size: 13px;
      cursor: pointer;
      position: relative;
    }
    .lang-btn:hover { background: var(--line); }

    /* ─── 하단 네비게이션 바 ─── */
    .bottom-nav {
      position: fixed;
      bottom: 0;
      left: 50%;
      transform: translateX(-50%);
      width: 100%;
      max-width: 480px;
      height: var(--bottom-nav-h);
      background: var(--bg-1);
      border-top: 1px solid var(--line);
      display: flex;
      align-items: center;
      justify-content: space-around;
      z-index: 9000;
      padding-bottom: env(safe-area-inset-bottom, 0);
      box-shadow: 0 -1px 0 var(--line);
    }
    .nav-item {
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 3px;
      cursor: pointer;
      padding: 6px 16px;
      border-radius: 12px;
      transition: background 0.15s;
      color: var(--text-3);
      font-size: 10px;
      font-weight: 500;
      border: none;
      background: none;
      position: relative;
      overflow: hidden;
      text-decoration: none; /* [T206 §1] 추천코스 항목은 <a href>라 브라우저 기본 밑줄 방지 — 나머지 <button> 항목엔 무해 */
    }
    .nav-item .nav-icon {
      font-size: 20px; line-height: 1;
      display: flex; align-items: center; justify-content: center;
      border-radius: 10px;
      padding: 4px 10px;
      transition: background 0.2s, color 0.2s;
    }
    /* [T76-K §4] 하단 탭 라벨 서체 — 시스템 고딕 대신 Pretendard 600 + letter-spacing -0.01em(크기 무변경) */
    .nav-item span:not(.nav-icon) { font-family: var(--pretendard); font-weight: 600; letter-spacing: -0.01em; }
    .nav-item:hover { color: var(--text-2); }

    /* 기본 active: 무채색 → active 시 한국 색채 + 배경 칩 */
    .nav-item.active { color: inherit; }
    .nav-item.active .nav-icon { transform: scale(1.0); }

    /* 홈 — 쪽빛 */
    #nav-home.active       { color: #26547C; }
    #nav-home.active .nav-icon { background: rgba(38,84,124,0.12); color: #26547C; }

    /* 지도 — 단청홍 */
    #nav-map.active       { color: #C63D2F; }
    #nav-map.active .nav-icon { background: rgba(198,61,47,0.10); color: #C63D2F; }

    /* 내여행 — 금박 */
    #nav-mytrip.active       { color: var(--warn); }
    #nav-mytrip.active .nav-icon { background: rgba(184,145,42,0.12); color: var(--warn); }

    /* 커뮤니티 — 쪽빛 (연) */
    #nav-community.active       { color: #26547C; }
    #nav-community.active .nav-icon { background: rgba(38,84,124,0.12); color: #26547C; }

    /* 내정보 — 먹갈색 */
    /* [T206 §1] nav-myinfo 버튼 자체가 제거돼(내정보→상단 아바타로 이동) 이 자리를 nav-courses로
       교체 — 추천 코스는 SPA 안에서 실제 페이지 이동(location.href)이라 active를 스스로 켜지
       않지만 색상 슬롯은 남겨둔다. [check_colors.js 실측] 처음엔 정적 페이지 쪽(render_header.js
       BOTTOM_NAV_CSS)과 맞춰 teal 계열을 썼는데 이 파일(public/css/*.css)은 7색 팔레트 검사
       대상이라 FAIL(그 teal은 팔레트 밖 — render_header.js는 검사 스캔 범위 밖 js 파일이라 이미
       그 색을 상단메뉴 hover/active에 쓰고 있었지만 이 파일에선 안 됨). 팔레트 안에서 이미
       nav-home/nav-community가 쓰는 navy를 재사용 — 이 하단바 안에서 이미 여러 항목이 같은
       색을 공유하는 기존 관례(홈·커뮤니티 둘 다 navy)와 정합. */
    #nav-courses.active       { color: #26547C; }
    #nav-courses.active .nav-icon { background: rgba(38,84,124,0.12); color: #26547C; }

    /* 하단 네비 높이만큼 스크린 패딩 — [T131 재발행 §7 승인] .bottom-nav 실제 높이는
       --bottom-nav-h + env(safe-area-inset-bottom)인데 이 패딩은 그동안 고정 64px만 반영해서
       노치 기기에서 마지막 콘텐츠 줄이 살짝 가려질 수 있었다(safe-area 몫만큼 부족) — 보정. */
    .screen { padding-bottom: calc(var(--bottom-nav-h) + env(safe-area-inset-bottom, 0px)); }

    /* ─── 위치 허용 팝업 ─── */
    .location-modal {
      display: none;
      position: fixed;
      inset: 0;
      background: var(--sh-65);
      z-index: var(--z-modal-top); /* [T205 §1] 9800→토큰 — 고급옵션(시트/팝오버 안)에서 GPS 허용 열면 그 아래 깔리던 결함 */
      align-items: flex-end;
      justify-content: center;
    }
    .location-modal.open { display: flex; }
    .location-sheet {
      background: var(--bg-2);
      border-radius: 24px 24px 0 0;
      padding: 32px 28px 40px;
      width: 100%;
      max-width: 480px;
      text-align: center;
      animation: slideUp 0.25s ease;
    }
    @keyframes slideUp { from { transform: translateY(100%); } to { transform: translateY(0); } }
    @keyframes inkSpread { from { transform: scale(0); opacity: 1; } to { transform: scale(1); opacity: 0; } }
    /* #지시서_20260722 §1-8: 생성 로딩 오버레이 비행기 아이콘 — 기다림 체감 개선 */
    @keyframes planeFly { 0% { transform: translateX(-6px) rotate(-6deg); } 50% { transform: translateX(6px) rotate(6deg); } 100% { transform: translateX(-6px) rotate(-6deg); } }
    ._planeLoader { animation: planeFly 1.4s ease-in-out infinite; }
    .location-icon { font-size: 48px; margin-bottom: 16px; }
    .location-title { font-size: 18px; font-weight: 700; margin-bottom: 8px; }
    .location-desc { font-size: 13px; color: var(--text-2); line-height: 1.6; margin-bottom: 28px; }
    .location-maps {
      display: flex;
      gap: 12px;
      justify-content: center;
      margin-bottom: 28px;
    }
    .location-map-opt {
      flex: 1;
      max-width: 140px;
      background: var(--line);
      border: 2px solid var(--line);
      border-radius: 16px;
      padding: 16px 8px;
      cursor: pointer;
      transition: border-color 0.15s;
    }
    .location-map-opt.selected { border-color: var(--accent); }
    .location-map-opt .map-emoji { font-size: 32px; margin-bottom: 8px; }
    .location-map-opt .map-label { font-size: 12px; color: var(--text-2); }
    .loc-btn-allow {
      width: 100%; padding: 14px;
      background: var(--accent); border: none; border-radius: 14px;
      color: #FFFFFF; font-size: 15px; font-weight: 700; cursor: pointer;
      margin-bottom: 10px;
    }
    .loc-btn-once {
      width: 100%; padding: 14px;
      background: var(--line); border: none; border-radius: 14px;
      color: var(--text-1); font-size: 15px; cursor: pointer; margin-bottom: 10px;
    }
    .loc-btn-deny {
      width: 100%; padding: 10px;
      background: none; border: none;
      color: var(--text-3); font-size: 13px; cursor: pointer;
    }

    /* ─── 위치 시트 (location-sheet.js) ─── */
    .loc-sheet-overlay {
      display: none;
      position: fixed; inset: 0;
      background: rgba(26,22,20,0.55);
      z-index: 9850;
      align-items: flex-end;
      justify-content: center;
    }
    .loc-sheet-overlay.open { display: flex; }
    .loc-sheet {
      background: var(--bg-2);
      border-radius: 20px 20px 0 0;
      padding: 20px 24px 40px;
      width: 100%; max-width: 480px;
      animation: slideUp 0.22s ease;
    }
    .loc-sheet-handle {
      width: 36px; height: 4px;
      background: var(--line);
      border-radius: 2px;
      margin: 0 auto 18px;
    }
    .loc-sheet-name {
      font-size: 17px; font-weight: 700;
      color: var(--text-1);
      margin-bottom: 14px;
      line-height: 1.3;
    }
    /* [T176-R §C] 시트 내 인앱 지도 — 페이지 이탈 없이 위치를 보여준다. 좌표 없는 장소는
       display:none 유지(기존 "좌표 없음" 안내가 그 자리를 대신함). */
    .loc-sheet-map {
      width: 100%; height: 150px;
      border-radius: 12px;
      margin-bottom: 10px;
      background: var(--line);
      overflow: hidden;
    }
    .loc-sheet-addr-row {
      display: flex; align-items: flex-start; gap: 10px;
      background: var(--line);
      border-radius: 12px;
      padding: 12px 14px;
      margin-bottom: 10px;
    }
    .loc-sheet-addr-text {
      flex: 1;
      font-size: 13px; color: var(--text-1);
      line-height: 1.5;
    }
    .loc-sheet-copy-btn {
      flex-shrink: 0;
      background: var(--accent); border: none;
      border-radius: 8px;
      padding: 5px 11px;
      color: #fff; font-size: 12px; font-weight: 700;
      cursor: pointer;
    }
    .loc-sheet-driver {
      font-size: 11px; color: var(--text-3);
      margin-bottom: 16px;
      text-align: center;
    }
    .loc-sheet-btns {
      display: flex; gap: 10px;
      margin-top: 16px;
    }
    .loc-sheet-map-btn {
      flex: 1;
      padding: 14px 8px;
      border: none; border-radius: 14px;
      font-size: 14px; font-weight: 700;
      cursor: pointer;
    }
    .loc-sheet-nocoord {
      font-size: 12px; color: var(--text-3);
      text-align: center;
      padding: 12px 0;
    }

    /* [T79-H §H5] 데스크톱 — 화면을 덮는 바텀시트 대신 지도 박스(#kakaoMapWrap) 안쪽 하단에
       #mapPlacePopup과 동일한 결의 오버레이로 표시(위치는 location-sheet.js가 그 요소 실측 후
       인라인 style로 지정, 여기선 배경·모서리·그림자·pointer-events만 담당). 모바일은 이 규칙
       자체가 안 걸려 무변경. */
    @media (min-width: 768px) {
      .loc-sheet-overlay.loc-sheet-desktop {
        background: transparent;
        align-items: flex-start;
        justify-content: flex-start;
        pointer-events: none;
      }
      .loc-sheet-overlay.loc-sheet-desktop .loc-sheet {
        pointer-events: auto;
        border-radius: 16px;
        box-shadow: 0 12px 32px rgba(31,27,22,0.22);
        animation: h2LocSheetFadeIn 0.18s ease;
      }
    }
    @keyframes h2LocSheetFadeIn {
      from { opacity: 0; transform: translateY(-6px); }
      to   { opacity: 1; transform: translateY(0); }
    }

    /* ─── 언어 드롭다운 ─── */
    .lang-dropdown {
      display: none;
      position: absolute;
      top: calc(100% + 6px);
      right: 0;
      background: var(--bg-1);
      border: 1px solid var(--line);
      border-radius: 12px;
      overflow: hidden;
      min-width: 120px;
      z-index: 9999;
      box-shadow: 0 8px 24px var(--sh-40);
    }
    .lang-dropdown.open { display: block; }
    .lang-option {
      padding: 10px 16px;
      font-size: 13px;
      color: var(--text-1);
      cursor: pointer;
      display: flex;
      align-items: center;
      gap: 8px;
      transition: background 0.15s;
    }
    .lang-option:hover { background: var(--line); color: var(--text-1); }
    .lang-option.active { color: var(--accent); font-weight: 700; }

    .hero {
      flex: 1;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      padding: 0 24px 60px;
      text-align: center;
    }

    .logo {
      font-size: 45px;          /* 56×0.8 ≈ 45 — 검색창이 주인공 */
      /* #지시서_20260722 최종: 'Apple SD Gothic Neo'는 Bold(700)가 최대 실제 컷이라 font-weight
         800/900이 둘 다 700으로 매칭돼 실기기에서 차이가 없었고, 이후 시도한 text-stroke도 실기기에서
         무효 확인됨(Fable 판정). 이미 로드된 Pretendard(CDN, 100~900 전 웨이트 보유·900 Black 확인됨)로
         font-family를 명시 교체 — 진짜 Black 컷을 로드해 근본 해결. text-stroke는 제거(중복 보강 불필요).
         색·크기·자간 불변. */
      font-family: var(--pretendard);
      font-weight: 900;
      letter-spacing: -1px;
      margin-bottom: 16px;      /* 로고↔슬로건 간격 */
      line-height: 1;
    }
    .logo .k { color: var(--accent); }
    .logo .go, .header-logo .go, .login-logo .go { color: #C63D2F; margin-left: 0; } /* #지시서_20260720: 로고 시안 C 채택 — 간격 조정 폐지, em 마진 제거 */

    /* ── [L-1 마감] Screen4(로그인) 스타일 — 이전엔 클래스만 있고 규칙이 없던 무스타일 상태였음 ── */
    /* [T76-C3 §1] Apple SD Gothic Neo Bold(700) 상한 문제 — Pretendard 900 Black으로 교체(§.logo와 동일 원인) */
    .login-logo { font-size: 26px; font-weight: 900; letter-spacing: -0.5px; text-align: center; font-family: var(--pretendard); }
    .login-logo .k { color: var(--accent); }
    .body-wrap { max-width: 600px; margin: 0 auto; padding: 28px 24px 40px; width: 100%; }
    .logo-area { text-align: center; margin-bottom: 20px; }
    .login-desc { font-size: 13px; color: var(--text-2); text-align: center; margin-top: 8px; line-height: 1.5; }

    .trip-preview {
      background: var(--line);
      border: 1px solid var(--line);
      border-radius: 16px;
      padding: 16px;
      margin-bottom: 20px;
    }
    .trip-preview-label { font-size: 11px; color: var(--text-3); margin-bottom: 6px; }
    .trip-preview-title { font-size: 15px; font-weight: 700; color: var(--text-1); margin-bottom: 8px; }
    .trip-preview-meta { display: flex; gap: 8px; flex-wrap: wrap; font-size: 12px; color: var(--text-2); margin-bottom: 10px; }
    .trip-preview-meta span { background: var(--bg-1); border-radius: 6px; padding: 3px 8px; }
    .trip-preview-footer { font-size: 11px; color: var(--accent); }

    .social-btns { display: flex; flex-direction: column; gap: 10px; margin-bottom: 12px; }
    .social-btn {
      width: 100%;
      padding: 14px;
      border: none;
      border-radius: 12px;
      font-size: 15px;
      font-weight: 700;
      cursor: pointer;
      display: flex;
      align-items: center;
      justify-content: center;
      gap: 8px;
      transition: opacity 0.15s;
    }
    .social-btn:hover { opacity: 0.88; }
    /* 카카오 공식 버튼 가이드: #FEE500 배경 + 검정 텍스트 */
    .btn-kakao { background: #FEE500; color: #1A1614; }
    /* [T120 §2-4] 구글 공식 버튼 가이드 근사: 흰 배경 + 회색 보더 + 짙은 텍스트 */
    .btn-google { background: #FFFFFF; color: #1F1B16; border: 1px solid #DADCE0; }

    /* [T121 §D] 마이페이지(screen10) 데스크톱 레이아웃 — 왼쪽 정렬(내부 정렬)은 그대로 두고,
       콘텐츠 기둥만 최대 560px로 좁혀 화면 가운데로 모은다. 모바일(<768px)은 .profile-col이
       그냥 width:100%라 현행과 완전히 동일 — 이 미디어쿼리 밖에서는 아무 효과가 없다. */
    @media (min-width: 768px) {
      .profile-col { max-width: 560px; margin: 0 auto; width: 100%; }
      /* 메뉴 리스트를 카드로 감싸 경계를 준다 — "휑해 보임" 대응. 기존 행의 인라인 padding/border는
         그대로 두고(모바일과 동일한 내부 구조), 바깥 테두리·배경·라운딩만 추가. */
      #screen10 .profile-menu-list {
        margin: 16px 0;
        border: 1px solid var(--line, #E8E0D4);
        border-radius: 14px;
        overflow: hidden;
        background: var(--bg-0, #FFFFFF);
      }
      #screen10 .profile-menu-row:hover { background: rgba(38, 84, 124, 0.05); }
    }

    .skip-btn {
      width: 100%;
      background: none;
      border: 1px solid var(--line);
      color: var(--text-2);
      padding: 13px;
      border-radius: 12px;
      font-size: 14px;
      cursor: pointer;
      margin-bottom: 16px;
      transition: background 0.15s;
    }
    .skip-btn:hover { background: var(--line); }

    .terms-notice { font-size: 11px; color: var(--text-3); text-align: center; line-height: 1.7; }
    .terms-notice a { color: var(--accent); }

    .slogan {
      font-family: var(--pretendard); /* #지시서_20260714저녁 1: 명조→Pretendard */
      font-size: 18px;          /* Pretendard 500/17~18px */
      font-weight: 500;
      color: var(--text-2);
      line-height: 1.55;
      margin-bottom: 32px;      /* 슬로건↔검색창 간격 */
    }

    .search-wrap {
      width: 100%;
      max-width: 480px;
      position: relative;
      margin-bottom: 28px;
    }
    .search-input {
      width: 100%;
      background: var(--bg-1);
      border: 1.5px solid var(--line);
      border-radius: 14px;
      padding: 14px 52px 14px 20px;  /* 14×2 + line-height ≈ 52px */
      font-size: 15px;
      font-weight: 500;
      color: var(--text-1);
      outline: none;
      transition: border 0.2s;
    }
    .search-input::placeholder { color: var(--text-3); }
    .search-input:focus { border-color: var(--accent); }

    /* ─── 자동완성 드롭다운 ─── */
    .autocomplete-list {
      display: none;
      position: absolute;
      top: calc(100% + 6px);
      left: 0; right: 0;
      background: var(--bg-2);
      border: 1px solid var(--line);
      border-radius: 14px;
      overflow: hidden;
      z-index: 999;
      box-shadow: 0 12px 32px var(--sh-50);
      max-height: 260px;
      overflow-y: auto;
    }
    .autocomplete-list.open { display: block; }
    .ac-item {
      padding: 12px 18px;
      cursor: pointer;
      display: flex;
      align-items: center;
      touch-action: manipulation;
      gap: 12px;
      border-bottom: 1px solid var(--line);
      transition: background 0.12s;
      /* button reset */
      width: 100%; background: none; border-top: none; border-left: none; border-right: none;
      outline: none; font: inherit; color: inherit; text-align: left; box-sizing: border-box;
    }
    /* [T131 재발행 §4 승인] outline:none이 바로 위에 있어 전역 :focus-visible 규칙이 여기선
       안 먹는다(동일 specificity, 나중 규칙이 이김) — 이 요소만 다시 켜준다(음수 offset은
       .autocomplete-list의 overflow:hidden에 링이 잘리지 않게). */
    .ac-item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
    .ac-item:last-child { border-bottom: none; }
    .ac-item:hover, .ac-item.focused { background: var(--ac-15); }
    .ac-ko { font-size: 15px; font-weight: 600; color: var(--text-1); }
    .ac-ko-sub { font-size: 11px; color: var(--text-3); margin-left: 4px; font-weight: 400; }
    .ac-en { font-size: 12px; color: var(--text-3); letter-spacing: 0.5px; }
    .ac-region { font-size: 11px; color: var(--text-3); margin-left: auto; }
    .search-icon {
      position: absolute;
      right: 16px;
      top: 50%;
      transform: translateY(-50%);
      font-size: 18px;
      color: var(--text-3);
      display: flex;
      align-items: center;
      pointer-events: none;
    }

    .city-chips {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      gap: 8px;
      width: 100%;
      max-width: 420px;
      margin-bottom: 36px;
    }
    .chip {
      background: var(--line);
      border: 1px solid var(--line);
      color: var(--text-1);
      padding: 7px 14px;
      border-radius: 8px;
      font-size: 13px;
      cursor: pointer;
      transition: all 0.2s;
      text-align: center;
      white-space: nowrap;
    }
    .chip:hover, .chip.active {
      background: var(--ac-18);
      border-color: var(--accent);
      color: var(--accent);
    }
    /* ── 랜딩 도시칩 카드 스타일 ── */
    .city-chip {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      gap: 4px;
      padding: 10px 4px 8px;
      border-radius: 12px;
      background: rgba(255,255,255,0.06);
      border: 1px solid var(--line); /* #지시서_20260722 §1-4: 다크모드용 rgba 하드코딩 → 라이트 테마 경계색으로 교체 */
      color: var(--text-1);
      white-space: normal;
    }
    .city-chip:hover, .city-chip.active {
      background: var(--ac-18);
      border-color: var(--accent);
      color: var(--accent);
    }
    .city-chip-emoji {
      font-size: 22px;
      line-height: 1;
      pointer-events: none;
    }
    .city-chip .chip-name {
      font-size: 12px;
      font-weight: 600;
      letter-spacing: -0.2px;
      pointer-events: none;
    }

    /* ── 섹션 제목 (명조 위계) ── */
    .sec-ttl {
      font-family: var(--myeongjo);
      font-size: 17px;
      font-weight: 700;
      color: var(--text-1);
      letter-spacing: -0.3px;
    }
    /* #지시서_20260714저녁 1: "지금 인기 여행지" 제목만 Pretendard 600/18~20px — 다른 .sec-ttl 미영향 */
    .sec-ttl[data-i18n="popular_destinations"] {
      font-family: var(--pretendard);
      font-size: 19px;
      font-weight: 600;
    }

    /* ── 도시 카드 이미지 플레이스홀더 ── */
    .city-card-img {
      width: 100%;
      aspect-ratio: 4 / 3;
      background: var(--bg-2);
      display: flex;
      align-items: center;
      justify-content: center;
      overflow: hidden;
    }
    .city-card-initial {
      font-family: var(--myeongjo);
      font-size: 28px;
      font-weight: 700;
      color: var(--text-3);
      opacity: 0.55;
      letter-spacing: -1px;
    }

    .cta-btn {
      background: #C63D2F;
      color: #FFFFFF;
      border: none;
      padding: 16px 40px;
      border-radius: 14px;
      font-size: 16px;
      font-weight: 700;
      cursor: pointer;
      transition: background 0.2s, transform 0.1s;
      box-shadow: 0 4px 20px rgba(198,61,47,0.35);
    }
    .cta-btn:hover { background: var(--accent-hover); transform: translateY(-1px); }
    .cta-btn:active { transform: translateY(0); }

    /* [T308 §1, 1차 지시 — 다크 푸터] 폐기됨, 이력만 보존.
       [T308-1c] 밝은 연한 면 + 진한 글자 — 폐기됨, 1c 한 라운드만 쓰임.
       [T308-1d, 대표 확정 — "푸터 배경을 진한 시안 채움(--tg-accent-dark)으로 변경, 글자는 흰색
       (법정 메뉴 흰색 굵게, 사업자 정보는 rgba(255,255,255,.8)), 구분선은 rgba(255,255,255,.25)"]
       면 자체가 진한 색이라 상단 경계선은 배경과 같은 색이 돼 의미가 없어져 제거. 링크 목록
       구조(6종)는 무변경, 색만 흰 계열로. 공용 규칙이라 법정 페이지 6종 푸터(t308 legal shell,
       별도 인라인 스타일)에도 동일하게 반영했다 — 아래 참고. */
    footer {
      background: var(--tg-footer);
      padding: 24px 28px 20px;
    }
    .footer-links {
      display: flex;
      justify-content: center;
      gap: 20px;
      flex-wrap: wrap;
      margin-bottom: 14px;
      max-width: var(--content-max, 1240px);
      margin-left: auto;
      margin-right: auto;
    }
    footer a {
      color: #fff;
      font-weight: 700;
      font-size: 12px;
      text-decoration: none;
      cursor: pointer;
      transition: opacity 0.2s;
    }
    footer a.highlight { color: #fff; text-decoration: underline; }
    footer a:hover { opacity: 0.75; }
    .footer-biz {
      text-align: center;
      font-size: 10px;
      color: rgba(255,255,255,.8);
      line-height: 1.7;
      border-top: 1px solid rgba(255,255,255,.25);
      padding-top: 12px;
      max-width: var(--content-max, 1240px);
      margin-left: auto;
      margin-right: auto;
    }
    /* [T308-12 §C-5 3단계, 대표 지시 — "일정 상세 화면 맨 아래에 공통 시안 푸터를 추가하라,
       다른 화면과 동일한 컴포넌트·서식"] screen1의 <footer>는 .container(스크롤 없는 평범한
       래퍼) 밖 형제라 자동으로 풀폭이 되지만, screen3의 .container3는 자체 overflow-y:auto+
       flex:1을 쓰는 별도 스크롤 영역(이 마라톤 내내 지도 높이 확보용으로 의도된 설계)이라 —
       그 밖에 형제로 붙이면 .container3가 flex:1로 남은 공간을 다 먼저 가져가버려 푸터가
       "일정 다 스크롤해야 보이는 맨 아래"가 아니라 "항상 떠 있는 고정 하단 바"처럼 동작하게
       된다. 그건 "SHOP 밴드 바로 아래에 온다"는 지시(자연스러운 콘텐츠 흐름상 인접)와 안
       맞아 — 그래서 이 푸터는 #resultShopBand 바로 다음, .container3 **안**(스크롤되는
       콘텐츠의 마지막 자식)에 둔다. 그 대신 .container3가 max-width로 폭을 제한하는 컨테이너라
       풀폭이 저절로 안 되므로, .shop-band-section이 이미 쓰던 것과 똑같은 풀폭 탈출 기법
       (width:100vw+음수 마진)을 이 클래스에도 그대로 적용 — 새 기법 발명 아님. */
    /* [T308-13 §1 갱신, 대표 지시 — "두 어두운 면이 딱 붙어 뭉쳐 보인다, 페이지 배경색이
       드러나는 흰 띠(24~32px)로 분리하라, 구분선은 여백과 병용할지 판단해 보고하라"]
       구분선(border-top rgba(255,255,255,.25))을 지우고 margin-top:var(--space-6,32px)로
       교체했다 — **선은 불필요하다고 판단**: 여백이 있으면 두 면 사이에 이미 페이지 기본
       배경(--h2-bg, 크림색)이 뚜렷하게 드러나 경계 자체가 명확해지고, 그 여백 바로 위쪽 끝에
       거의 안 보이는 흰 선(rgba(255,255,255,.25))을 하나 더 얹는 건 시각적으로 아무 정보도
       더하지 못하는 군더더기다(선의 원래 목적 — "두 어두운 면이 붙어서 안 보이는 경계를
       표시" — 자체가 여백으로 이미 해소됨). 32px(--space-6, 24~32px 지시 범위의 상한)를
       택한 근거: 두 면 다 채도 있는 색이라 시각적 무게가 커, 하한(24px=--space-5)보다 더
       넉넉하게 떼야 "뭉쳐 보인다"던 원 지적이 확실히 해소된다고 판단.
       [T308-13 §2, 대표 지시 — "SHOP 밴드가 숨겨질 때도 간격이 어색하지 않게, 밴드 유무와
       무관하게 적용"] margin-top을 밴드 유무 조건 분기 없이 이 클래스 하나에 고정값으로 둔 게
       핵심 — 밴드가 보이든(다크→여백→다크) 숨겨지든(밝은 카드 또는 페이지 기본 배경→여백→
       다크) 모두 같은 32px 간격이 그대로 적용돼 항상 자연스럽다(별도 JS 조건 없이 CSS 하나로
       두 시나리오 모두 커버). */
    .h2-result-footer{width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;margin-top:var(--space-6,32px);}

    /* [T308-9 §3, 대표 지시 — "여행 준비물 → 페이지 하단 풀폭 다크 밴드 '이 여행에 필요한 것',
       카드 그리드 3/2/1열"] utils/shop_band.js(정적 코스 셸, enabledStatic 미점등 — 이번 라운드
       미노출)·public/js/shop_band.js(라이브 screen3, enabledLive 점등) 양쪽이 만드는 동일한 클래스
       마크업을 공유 — CSS도 한 곳에만 둔다(중복 정의 금지 원칙, T308-1 관례 유지). 이전 버전은
       옅은 면(--tg-surface) 카드가 일반 배경 위에 놓인 형태였는데, 이번 지시는 "풀폭 다크 밴드"로
       명시 — .h2-theme-band와 같은 100vw 브레이크아웃 구조를 재사용하되(신규 패턴 발명 아님),
       그쪽은 T308-1c에서 밝은 면으로 전환된 반면 여기는 지시 원문대로 실제 다크(--h2-ink)를 쓴다.
       다크 배경 위에서는 밝은 카드(--h2-bg, 흰색)로 대비를 주고 카드 안 텍스트는 다시 --h2-ink로
       — 밴드 자체의 제목·면책 문구만 밝은 글자(--h2-cream)를 쓴다. 링크 없는(coupang_url 빈 값)
       카드는 .shop-band-card--inactive로 흐리게 표시하고 hover·클릭을 막는다(아직 실제 상품
       링크가 없다는 뜻이지 오류가 아니다 — 조용히 숨기지 않고 "준비 중"으로 명시). var() 뒤 리터럴
       hex 폴백은 안 둔다(전부 이미 정의된 토큰, check_colors.js가 폴백 값도 미허가 색상으로 잡아냄
       — T308 관례 유지). */
    .shop-band-section{width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;background:var(--h2-ink);padding:32px 0;margin-top:16px;}
    .shop-band-inner{max-width:var(--content-max,1240px);margin:0 auto;padding:0 20px;}
    .shop-band-h2{font-size:18px;font-weight:800;color:var(--h2-cream);margin-bottom:14px;}
    .shop-band-grid{display:grid;grid-template-columns:1fr;gap:12px;}
    @media(min-width:600px){ .shop-band-grid{grid-template-columns:repeat(2,1fr);} }
    @media(min-width:900px){ .shop-band-grid{grid-template-columns:repeat(3,1fr);} }
    /* [T308-12 §4(a), 대표 지시 — "기본 노출을 한 줄로 제한"] shop_band.js가 COLLAPSE_COUNT(3)
       초과 시 .is-collapsed를 붙인다 — 4번째 카드부터 nth-child로 숨긴다. "한 줄" 정의를
       "데스크톱 3열 그리드 기준 3장"으로 단순화(전 화면폭 공통 임계값, 브레이크포인트별 분기
       없음 — 지시 문구 "데스크톱 기준"의 취지는 값의 근거이지 반응형 분기 요구가 아니라고 판단). */
    .shop-band-grid.is-collapsed .shop-band-card:nth-child(n+4){display:none;}
    .shop-band-card{display:block;background:var(--h2-bg);border:1px solid var(--h2-line);border-radius:14px;padding:14px;text-decoration:none;transition:border-color .15s,transform .15s;}
    .shop-band-card:hover{border-color:var(--tg-accent);transform:translateY(-1px);}
    .shop-band-icon{font-size:22px;margin-bottom:8px;line-height:1;}
    .shop-band-title{font-size:13px;font-weight:700;color:var(--h2-ink);margin-bottom:4px;}
    .shop-band-desc{font-size:11px;color:var(--h2-sub);line-height:1.4;margin-bottom:8px;}
    .shop-band-cta{font-size:11px;font-weight:700;color:var(--tg-red);}
    .shop-band-card--inactive{opacity:0.55;cursor:default;pointer-events:none;}
    .shop-band-card--inactive .shop-band-cta{color:var(--h2-sub);}
    /* [T308-12 §4(a)] 다크 밴드 위 보조 버튼 — 카드(밝은 배경)와 달리 밴드 자체 톤을 따라
       테두리만 있는 투명 버튼(제목·면책 문구와 같은 --h2-cream 계열), hover 시 --tg-accent
       테두리로 살짝 강조(카드 hover와 동일한 강조색 재사용, 새 토큰 발명 없음). */
    .shop-band-toggle{display:block;margin:14px auto 0;background:transparent;border:1px solid var(--h2-cream);color:var(--h2-cream);opacity:0.85;border-radius:20px;padding:8px 20px;font-size:11.5px;font-weight:700;cursor:pointer;transition:border-color .15s,opacity .15s;}
    .shop-band-toggle:hover{border-color:var(--tg-accent);opacity:1;}
    .shop-band-disclosure{font-size:10px;color:var(--h2-sub);margin-top:14px;text-align:center;}

    /* ─── 플로팅 고객센터 버튼 ─── */
    .float-cs-btn {
      position: fixed;
      bottom: 80px; right: 20px;
      z-index: 9990;
      width: 52px; height: 52px;
      background: var(--accent);
      border-radius: 50%;
      display: flex; align-items: center; justify-content: center;
      font-size: 22px;
      box-shadow: 0 4px 20px var(--ac-50);
      cursor: pointer;
      border: none;
      transition: transform 0.2s;
    }
    .float-cs-btn:hover { transform: scale(1.08); }

    /* ─── 고객센터 채팅 모달 ─── */
    .cs-modal {
      position: fixed;
      bottom: 88px; right: 16px;
      z-index: var(--z-modal-top); /* [T205 §1] 9991→토큰 — 전 화면 공용 플로팅 버튼이라 시트 위에서도 열릴 수 있음 */
      width: 300px;
      background: var(--bg-2);
      border: 1px solid var(--line);
      border-radius: 20px;
      overflow: hidden;
      box-shadow: 0 8px 32px var(--sh-50);
      display: none;
      flex-direction: column;
    }
    .cs-modal.open { display: flex; }
    .cs-modal-header {
      background: var(--ac-15);
      border-bottom: 1px solid var(--ac-15);
      padding: 12px 14px;
      display: flex; align-items: center; gap: 9px;
    }
    .cs-avatar {
      width: 32px; height: 32px;
      background: var(--accent);
      border-radius: 50%;
      display: flex; align-items: center; justify-content: center;
      font-size: 14px; flex-shrink: 0;
    }
    .cs-title { font-size: 13px; font-weight: 700; }
    .cs-status { font-size: 11px; color: var(--accent); }
    .cs-status::before { content: '● '; font-size: 8px; }
    .cs-close {
      margin-left: auto;
      background: none; border: none;
      color: var(--text-3);
      font-size: 18px; cursor: pointer; line-height: 1;
    }
    .cs-body { padding: 14px; display: flex; flex-direction: column; gap: 10px; max-height: 220px; overflow-y: auto; }
    .cs-msg { max-width: 85%; }
    .cs-msg.bot { align-self: flex-start; }
    .cs-msg.user { align-self: flex-end; }
    .cs-bubble {
      padding: 9px 12px;
      border-radius: 12px;
      font-size: 12px; line-height: 1.5;
    }
    .cs-msg.bot .cs-bubble { background: var(--line); border-bottom-left-radius: 3px; }
    .cs-msg.user .cs-bubble { background: var(--accent); border-bottom-right-radius: 3px; }
    .cs-input-row {
      border-top: 1px solid var(--line);
      padding: 10px 12px;
      display: flex; gap: 7px; align-items: center;
    }
    .cs-input {
      flex: 1; background: var(--line);
      border: 1px solid var(--line);
      border-radius: 16px; padding: 8px 12px;
      font-size: 12px; color: var(--text-1); outline: none;
    }
    /* [T131 재발행 §4 승인] 위와 같은 이유 — outline:none을 국소적으로 다시 켜준다. */
    .cs-input:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
    .cs-input::placeholder { color: var(--text-3); }

    /* [T131 재발행 §4 승인] views/index.html의 인라인 style="outline:none"인 텍스트 입력
       2곳(#cityAddSearch, #departSearchInput) — range 슬라이더류는 자체 트랙/썸 시각 변화로
       이미 상호작용 피드백이 있어 제외, 순수 텍스트 입력만 링을 되살린다. */
    #cityAddSearch:focus-visible, #departSearchInput:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
    .cs-send {
      width: 32px; height: 32px; background: var(--accent);
      border: none; border-radius: 50%; color: var(--text-1);
      font-size: 13px; cursor: pointer;
      display: flex; align-items: center; justify-content: center;
    }

    /* ════════════════════════════
       SCREEN 2 — 검색 입력
    ════════════════════════════ */

    .header {
      display: flex;
      align-items: center;
      padding: 18px 24px;
      border-bottom: 1px solid var(--line);
    }
    .back-btn {
      background: none;
      border: none;
      color: var(--text-2);
      font-size: 20px;
      cursor: pointer;
      margin-right: 12px;
    }
    /* [T76-C3 §1] Apple SD Gothic Neo Bold(700) 상한 문제 — Pretendard 900 Black으로 교체(§.logo와 동일 원인) */
    .header-logo { font-size: 22px; font-weight: 900; letter-spacing: -0.5px; font-family: var(--pretendard); }
    .header-logo .k { color: var(--accent); }

    .container {
      max-width: 600px;
      margin: 0 auto;
      padding: 28px 24px 220px;
      width: 100%;
    }

    .section { margin-bottom: 32px; }
    .section-label {
      font-family: var(--myeongjo);
      font-size: 13px;
      color: var(--text-3);
      letter-spacing: 0.5px;
      margin-bottom: 12px;
      text-transform: uppercase;
    }
    .section-title { font-size: 17px; font-weight: 700; margin-bottom: 14px; }

    .city-grid {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      gap: 10px;
    }
    .city-card {
      background: var(--line);
      border: 1.5px solid var(--line);
      border-radius: 12px;
      padding: 14px 8px;
      text-align: center;
      cursor: pointer;
      transition: all 0.2s;
    }
    .city-card:hover { border-color: var(--ac-50); }
    .city-card.active {
      background: var(--ac-15);
      border-color: var(--accent);
    }
    .city-card .emoji { font-size: 22px; display: block; margin-bottom: 4px; }
    .city-card .name { font-size: 13px; color: var(--text-1); }
    .city-card.active .name { color: var(--accent); font-weight: 700; }

    .more-city-btn {
      margin-top: 10px;
      background: none;
      border: 1px solid var(--line);
      color: var(--text-3);
      padding: 8px 16px;
      border-radius: 8px;
      font-size: 13px;
      cursor: pointer;
      width: 100%;
    }

    .date-row { display: flex; gap: 12px; }
    .date-input-wrap { flex: 1; }
    .date-label-small { font-size: 11px; color: var(--text-3); margin-bottom: 6px; }
    .date-box {
      background: var(--line);
      border: 1.5px solid var(--line);
      border-radius: 10px;
      padding: 12px 14px;
      font-size: 15px;
      color: var(--text-2);
      cursor: pointer;
      transition: border 0.2s;
    }
    .date-box { cursor: pointer; }
    .date-box:hover { border-color: var(--accent); }

    /* ─── 달력 팝업 ─── */
    .cal-overlay {
      display: none; position: fixed; inset: 0;
      background: var(--sh-50); z-index: var(--z-modal-top); /* [T202-1, 대표 지시] --z-popover(10001)→--z-modal-top —
      "정직한 내보내기" 단일 날짜 확인 모달(calendar.js openCalSingle)이 저장·공유 시트(#saveModalSheet) 위에서
      항상 열리도록 확정 토큰으로. 기존 검색화면 범위선택 용도는 이미 z-popover로도 문제없었으나(T205 §1
      주석 참고) 상위 토큰으로 올려도 더 높은 레이어일 뿐 회귀 없음. */
      align-items: flex-start; justify-content: center;
      overflow-y: auto; padding: 56px 16px 24px;
    }
    .cal-overlay.open { display: flex; }
    .cal-wrap {
      background: var(--bg-2);
      border: 1px solid var(--line);
      border-radius: 20px;
      padding: 20px;
      width: 320px;
      max-width: 100%;
      box-shadow: 0 16px 40px var(--sh-60);
      flex-shrink: 0;
    }
    .cal-header {
      display: flex; align-items: center;
      justify-content: space-between; margin-bottom: 16px;
    }
    .cal-nav {
      background: none; border: none; color: var(--text-1);
      font-size: 18px; cursor: pointer; padding: 4px 10px;
      border-radius: 8px;
    }
    .cal-nav:hover { background: var(--line); }
    .cal-month-label { font-size: 15px; font-weight: 700; }
    .cal-grid {
      display: grid; grid-template-columns: repeat(7, 1fr);
      gap: 4px; text-align: center;
    }
    .cal-dow {
      font-size: 11px; color: var(--text-3);
      padding: 4px 0; font-weight: 600;
    }
    .cal-grid > div:nth-child(1)  { color: #C63D2F; } /* 일 */
    .cal-grid > div:nth-child(7)  { color: #26547C; } /* 토 */
    .cal-day {
      padding: 8px 4px; border-radius: 8px; font-size: 13px;
      cursor: pointer; transition: background 0.15s; color: var(--text-1);
    }
    .cal-day:hover:not(.empty):not(.past) { background: var(--ac-25); }
    .cal-day.past { color: var(--text-3); cursor: default; }
    .cal-day.empty { cursor: default; }
    .cal-day.today { border: 1px solid var(--accent); color: var(--accent); font-weight: 700; }
    .cal-day.selected-start { background: var(--accent); color: #FFFFFF; font-weight: 700; border-radius: 8px 0 0 8px; }
    .cal-day.selected-end   { background: var(--accent); color: #FFFFFF; font-weight: 700; border-radius: 0 8px 8px 0; }
    .cal-day.in-range { background: var(--ac-18); border-radius: 0; }
    .cal-day.selected-start.selected-end { border-radius: 8px; }
    .cal-type-label {
      text-align: center; font-size: 12px; color: var(--text-2);
      font-weight: 600; margin-bottom: 14px;
    }
    .cal-confirm {
      width: 100%; margin-top: 16px; padding: 13px;
      background: #C63D2F; border: none; border-radius: 12px;
      color: #FFFFFF; font-size: 14px; font-weight: 700; cursor: pointer;
      transition: background 0.2s;
    }
    .cal-confirm:hover { background: var(--accent-hover); }
    .date-badge {
      margin-top: 10px;
      background: var(--ac-15);
      border: 1px solid var(--ac-30);
      border-radius: 8px;
      padding: 8px 14px;
      font-size: 13px;
      color: var(--accent);
      display: inline-block;
    }

    .people-rows { display: flex; flex-direction: column; gap: 12px; }
    .people-row {
      display: flex;
      align-items: center;
      justify-content: space-between;
      background: var(--line);
      border-radius: 10px;
      padding: 12px 16px;
    }
    .people-info .people-type { font-size: 15px; font-weight: 600; }
    .people-info .people-desc { font-size: 12px; color: var(--text-3); margin-top: 2px; }
    .counter { display: flex; align-items: center; gap: 14px; }
    .counter-btn {
      width: 32px; height: 32px;
      background: var(--line);
      border: 1px solid var(--line);
      border-radius: 50%;
      color: var(--text-1);
      font-size: 18px;
      cursor: pointer;
      display: flex; align-items: center; justify-content: center;
      transition: background 0.2s;
    }
    .counter-btn:hover { background: var(--ac-25); border-color: var(--accent); }
    .counter-val { font-size: 18px; font-weight: 700; min-width: 20px; text-align: center; }

    /* 테마 칩 — 3열 균등 그리드 */
    .concept-chips {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      gap: 8px;
    }
    .concept-chip {
      background: var(--line);
      border: 1.5px solid var(--line);
      color: var(--text-2);
      padding: 9px 4px 8px;
      border-radius: 14px;
      font-size: 11px;
      cursor: pointer;
      transition: all 0.2s;
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 4px;
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
    }
    .concept-chip .ti {
      font-size: 16px;
      line-height: 1;
    }
    .concept-chip:hover { border-color: var(--ac-50); }
    .concept-chip.active {
      background: var(--ac-15);
      border-color: var(--accent);
      color: var(--accent);
      font-weight: 700;
    }
    .rank-badge {
      display: inline-block;
      margin-right: 3px;
      font-size: 13px;
      vertical-align: middle;
    }
    /* [T106 §C-2] 도시×기간별 판매 불가 테마 — 숨기지 않고 흐리게(judge 지시: "숨기지 말고
       흐리게 할 것. 숨기면 왜 없는지 알 수 없다"). 클릭은 여전히 되고(JS가 안내 토스트를 띄움),
       커서만 not-allowed로 바꿔 클릭해도 선택되지 않는다는 걸 미리 암시한다. */
    .concept-chip.h2-theme-unavailable {
      opacity: 0.4;
      cursor: not-allowed;
    }
    .concept-chip.h2-theme-unavailable:hover { border-color: var(--line); }

    /* 이동 수단 — 2열 균등 그리드 */
    .transport-grid {
      display: grid;
      grid-template-columns: repeat(2, 1fr);
      gap: 10px;
    }
    .transport-card {
      background: var(--line);
      border: 1.5px solid var(--line);
      border-radius: 14px;
      padding: 16px 12px;
      cursor: pointer;
      transition: all 0.2s;
      display: flex;
      flex-direction: column;
      align-items: flex-start;
      min-height: 90px;
    }
    .transport-card:hover { border-color: var(--ac-50); }
    .transport-card.active {
      background: var(--ac-12);
      border-color: var(--accent);
    }
    .transport-card .t-icon { font-size: 26px; margin-bottom: 8px; display: block; line-height: 1; }
    .transport-card .t-name { font-size: 14px; font-weight: 700; }
    .transport-card .t-desc { font-size: 11px; color: var(--text-3); margin-top: 3px; line-height: 1.3; }
    .transport-card.active .t-name { color: var(--accent); }

    .depart-section {
      margin-top: 12px;
      padding: 14px;
      background: var(--ac-08);
      border: 1px solid var(--ac-20);
      border-radius: 10px;
    }
    .depart-label { font-size: 13px; color: var(--text-2); margin-bottom: 10px; }
    .depart-chips { display: flex; flex-wrap: wrap; gap: 8px; }
    .depart-chip {
      background: rgba(26,22,20,0.04);
      border: 1px solid var(--border-mid);
      color: #1A1614;
      padding: 6px 13px;
      border-radius: 16px;
      font-size: 13px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s;
    }
    .depart-chip.active {
      background: var(--ac-15);
      border-color: var(--accent);
      color: var(--accent);
      font-weight: 700;
    }
    /* ── 출발 시간 칩 ── */
    .dtime-chip {
      background: rgba(26,22,20,0.04);
      border: 1px solid var(--border-mid);
      color: #1A1614;
      padding: 7px 14px;
      border-radius: 20px;
      font-size: 13px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s;
      white-space: nowrap;
    }
    .dtime-chip.active {
      background: #26547C;
      border-color: #26547C;
      color: #FFFFFF;
      font-weight: 700;
    }
    /* 미선택(data-val="") 활성 상태 — 시간 선택과 구분되도록 중립 스타일 */
    .dtime-chip[data-val=""].active {
      background: rgba(26,22,20,0.04);
      border-color: #9A8F80;
      color: var(--text-2);
      font-weight: 500;
    }
    .dtime-chip:hover:not(.active) {
      background: rgba(38,84,124,0.08);
      border-color: #26547C;
      color: #26547C;
    }

    .bottom-bar {
      position: fixed;
      bottom: 64px;
      left: 50%;
      transform: translateX(-50%);
      width: 100%;
      max-width: 480px;
      box-sizing: border-box;
      background: linear-gradient(to top, var(--bg-1) 80%, transparent);
      padding: 16px 24px 12px;
      z-index: 9001;
    }
    .submit-btn {
      width: 100%;
      display: block;
      margin: 0 auto;
      background: #C63D2F;
      color: #FFFFFF;
      border: none;
      padding: 17px;
      border-radius: 14px;
      font-size: 16px;
      font-weight: 700;
      cursor: pointer;
      box-shadow: 0 4px 20px rgba(198,61,47,0.35);
      transition: background 0.2s;
    }
    .submit-btn:hover { background: var(--accent-hover); }

    .divider {
      border: none;
      border-top: 1px solid var(--line);
      margin: 0 0 32px;
    }

    /* ════════════════════════════
       SCREEN 3 — 결과
    ════════════════════════════ */

    .header-s3 {
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 18px 24px;
      border-bottom: 1px solid var(--line);
    }
    .share-btn {
      background: var(--line);
      border: 1px solid var(--line);
      color: var(--text-2);
      padding: 6px 12px;
      border-radius: 8px;
      font-size: 13px;
      cursor: pointer;
    }

    /* [T76-N §5] --h2-teal-tint를 views/index.html 인라인 :root(check_colors.js 스캔 밖)에서
       이 파일로 이관 — 검사 대상에 정식 편입(C2 후속).
       [T308 §0] "선택 상태 옅은 배경" 슬롯이라 값을 --tg-navy-bg 토큰으로 재도색 — 새 hex를
       여기 또 박지 않고 위 :root의 §0 토큰을 재참조(단일 출처 유지). */
    :root { --h2-teal-tint: var(--tg-navy-bg); }

    /* [T76-K §7] 요약 바 재도색 — 구 팔레트(--line #E8E0D4 황토 톤) → 7색 팔레트(h2-*) 토큰으로 교체
       [T76-L §6] cream → teal 파생 연한 틴트(--h2-teal-tint)로 교체, 상하 경계선 유지 */
    /* [T79-H §H1] 대표님 실기기 판정: 조건 바가 헐거워 보임 — 조사 결과 T79 F/G 커밋에서
       .meta-bar/.meta-item을 직접 건드린 diff는 없었음(app.css:1396 부근 원본값 그대로).
       다만 실기기 확인을 우선해 밀도를 직접 조여 대응(패딩·간격 축소). */
    /* [T230-H, 대표 실측 — "좁은 화면에서 넘칠 때 앞쪽이 잘려 '자유여행'이 '유여행'으로 보인다.
       가로 스크롤 또는 말줄임 중 판단해서 적용"] 가로 스크롤을 택했다 — 말줄임(…)은 조건 정보를
       실제로 잃어버리는데(도시·날짜·인원·이동수단·테마 전부 "확인해야 할 조건"이라 하나라도
       가려지면 안 됨), 스크롤은 다 보여주면서 한 줄 높이를 유지한다(상단 바 성격상 여러 줄로
       불어나는 것도 부적절하다고 판단). flex-wrap:wrap → nowrap+overflow-x:auto로 교체,
       각 .meta-item에 flex-shrink:0을 줘 어느 항목도 압축되지 않게(압축되면 텍스트가 찌그러져
       보이는 다른 종류의 결함이 생김) 한다. 스크롤바는 다른 가로 캐러셀(.yt-carousel 등)과
       동일 관례로 숨김. */
    .meta-bar {
      background: var(--h2-teal-tint);
      border-top: 1px solid var(--h2-line);
      border-bottom: 1px solid var(--h2-line);
      padding: 9px 20px;
      display: flex;
      gap: 10px;
      flex-wrap: nowrap;
      overflow-x: auto;
      -webkit-overflow-scrolling: touch;
      scrollbar-width: none;
      font-size: 13px;
      color: var(--h2-sub);
    }
    .meta-bar::-webkit-scrollbar { display: none; }
    .meta-item { display: flex; align-items: center; gap: 4px; flex-shrink: 0; white-space: nowrap; }
    .meta-item .val { color: var(--h2-ink); font-weight: 600; }
    /* [T308-15 추가, 대표 지시 — "제목 줄이 들어갔으므로 조건 바 정보 5개를 화면에서만 숨겨라
       (DOM은 유지), 컨트롤 두 개만 남으므로 바 높이·여백을 슬림하게"] 도시·날짜·인원·이동수단·
       테마 5개(.h2-meta-info-item, 위 HTML 참고)를 display:none — DOM·id·값 갱신 배선은
       그대로라 제목 줄(_h2UpdateResultTitleLine, T308-14 §A)이 계속 이 값들을 읽어 쓴다(단일
       진실원 유지, 삭제 아님). 남는 게 뒤로가기 버튼+ⓘ 아이콘 둘뿐이라 세로 패딩을 9px→6px로
       줄인다(가로 패딩은 그대로 — 좌우 정렬선은 다른 요소들과 계속 맞춰야 함). overflow-x:auto+
       가로 스크롤(T230-H, 5개 정보가 넘칠 때를 대비한 설계)도 이제 컨트롤 2개뿐이라 넘칠 일이
       없어 사실상 무해하게 남는다(별도 제거 불필요, 트리거될 조건 자체가 없어짐). */
    #resultMetaBar .h2-meta-info-item { display: none; }
    #resultMetaBar { padding-top: 6px; padding-bottom: 6px; }

    .container3 {
      max-width: 600px;
      margin: 0 auto;
      padding: 24px 20px 200px;
      width: 100%;
    }

    .budget-card {
      background: var(--line);
      border: 1px solid var(--line);
      border-radius: 16px;
      padding: 20px;
      margin-bottom: 24px;
      position: relative;
      overflow: hidden;
    }
    .budget-top {
      display: flex;
      justify-content: space-between;
      align-items: flex-start;
      margin-bottom: 16px;
    }
    .budget-label { font-size: 13px; color: var(--text-3); }
    .budget-total {
      font-size: 32px;
      font-weight: 800;
      filter: blur(10px);
      color: var(--accent);
      user-select: none;
    }
    .budget-unlock-hint { font-size: 12px; color: var(--text-3); text-align: right; }
    .budget-breakdown { display: flex; gap: 10px; flex-wrap: wrap; }
    .budget-item {
      flex: 1;
      min-width: 80px;
      background: var(--line);
      border-radius: 10px;
      padding: 10px 12px;
      filter: blur(6px);
      user-select: none;
    }
    .budget-item .bi-label { font-size: 11px; color: var(--text-3); margin-bottom: 4px; }
    .budget-item .bi-val { font-size: 16px; font-weight: 700; }
    .budget-overlay {
      position: absolute;
      inset: 0;
      display: flex;
      align-items: center;
      justify-content: center;
      background: var(--bg-over);
      backdrop-filter: blur(1px);
    }
    .budget-overlay-text { text-align: center; }
    .budget-overlay-text .lock-icon { font-size: 26px; margin-bottom: 6px; }
    .budget-overlay-text p { font-size: 14px; color: var(--text-2); }
    .budget-overlay-text .unlock-link {
      color: var(--accent);
      font-size: 13px;
      cursor: pointer;
      text-decoration: underline;
      margin-top: 4px;
      display: block;
    }

    .day-title {
      font-family: var(--myeongjo);
      font-size: 18px;
      font-weight: 800;
      margin-bottom: 14px;
      margin-top: 32px;           /* 섹션 간 숨 */
      display: flex;
      align-items: center;
      gap: 8px;
    }
    .day-title:first-child { margin-top: 0; }
    .day-badge {
      background: var(--accent);
      color: var(--text-1);
      font-size: 12px;
      padding: 3px 9px;
      border-radius: 10px;
      font-weight: 700;
    }
    .day-badge.locked { background: var(--line); color: var(--text-3); }
    .day-summary { font-size: 13px; color: var(--text-3); margin-bottom: 16px; }

    .itinerary-card {
      background: var(--line);
      border: 1px solid var(--line);
      border-radius: 14px;
      padding: 16px;
      margin-bottom: 12px;
      display: flex;
      gap: 14px;
    }
    .card-icon-wrap {
      width: 44px; height: 44px;
      border-radius: 10px;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 20px;
      flex-shrink: 0;
    }
    .card-icon-wrap.place { background: var(--ac-15); }
    .card-icon-wrap.restaurant { background: rgba(198,61,47,0.1); }  /* 단청홍 */
    .card-icon-wrap.stay { background: rgba(184,145,42,0.1); }       /* 금박 */

    .card-body { flex: 1; }
    .card-type { font-size: 11px; color: var(--text-3); margin-bottom: 3px; }
    .card-name { font-size: 15px; font-weight: 700; margin-bottom: 5px; }
    .card-desc { font-size: 13px; color: var(--text-3); line-height: 1.5; }
    .card-price { font-size: 13px; color: var(--accent); font-weight: 600; margin-top: 6px; }
    .card-price .price-note { color: var(--text-3); font-weight: 400; font-size: 11px; margin-left: 4px; }
    .card-links { margin-top: 8px; display: flex; gap: 8px; flex-wrap: wrap; }
    .card-link {
      font-size: 11px;
      color: var(--text-3);
      background: var(--line);
      padding: 3px 8px;
      border-radius: 6px;
      cursor: pointer;
    }
    .card-link:hover { color: var(--accent); }

    /* 내돈내산 배지 */
    .genuine-badge {
      display: inline-flex;
      align-items: center;
      gap: 4px;
      background: var(--ac-12);
      border: 1px solid var(--ac-25);
      border-radius: 8px;
      padding: 5px 10px;
      margin-top: 8px;
      font-size: 11px;
      color: var(--accent);
      font-weight: 600;
    }
    .genuine-badge .gb-divider {
      width: 1px; height: 10px;
      background: var(--ac-30);
      margin: 0 4px;
    }
    .genuine-badge .gb-muted { color: var(--ac-60); font-weight: 400; }

    .locked-day {
      background: var(--line);
      border: 1px solid var(--line);
      border-radius: 14px;
      padding: 28px 20px;
      text-align: center;
      margin-bottom: 16px;
      position: relative;
      overflow: hidden;
    }
    .locked-day::before {
      content: '';
      position: absolute;
      inset: 0;
      background: repeating-linear-gradient(45deg,var(--line) 0px,var(--line) 1px,transparent 1px,transparent 8px);
    }
    .locked-content { position: relative; }
    .lock-big { font-size: 28px; margin-bottom: 8px; }
    .locked-title { font-size: 15px; font-weight: 700; color: var(--text-2); margin-bottom: 4px; }
    .locked-sub { font-size: 13px; color: var(--text-3); }

    .pricing-section {
      margin-top: 32px;
      background: var(--line);
      border: 1px solid var(--line);
      border-radius: 20px;
      padding: 24px 20px 20px;
    }
    .pricing-title { font-size: 17px; font-weight: 800; text-align: center; margin-bottom: 6px; }
    .pricing-sub { font-size: 13px; color: var(--text-3); text-align: center; margin-bottom: 20px; }
    .pricing-cards { display: flex; flex-direction: column; gap: 10px; }
    .price-card {
      background: var(--line);
      border: 1.5px solid var(--line);
      border-radius: 14px;
      padding: 16px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      cursor: pointer;
      transition: all 0.2s;
    }
    .price-card:hover { border-color: var(--text-3); }
    .price-card.featured { border-color: var(--accent); background: var(--ac-10); }
    .price-card-left .tier-name { font-size: 15px; font-weight: 700; margin-bottom: 3px; }
    .price-card-left .tier-features { font-size: 12px; color: var(--text-3); line-height: 1.5; }
    .price-card-left .tier-badge {
      display: inline-block;
      background: var(--accent);
      color: var(--text-1);
      font-size: 10px;
      padding: 2px 7px;
      border-radius: 6px;
      margin-bottom: 5px;
      font-weight: 700;
    }
    .price-card-right { text-align: right; }
    .price-amount { font-size: 20px; font-weight: 800; color: var(--accent); white-space: nowrap; }
    .price-amount.one-time { color: var(--text-1); }
    .price-unit { font-size: 11px; color: var(--text-3); margin-top: 2px; }

    .pricing-cta { margin-top: 16px; display: flex; flex-direction: column; gap: 10px; }
    .cta-primary {
      width: 100%;
      background: var(--accent);
      color: var(--text-1);
      border: none;
      padding: 16px;
      border-radius: 12px;
      font-size: 16px;
      font-weight: 700;
      cursor: pointer;
      box-shadow: 0 4px 20px var(--ac-30);
    }
    .cta-primary:hover { background: var(--accent-dk); }
    .cta-secondary {
      width: 100%;
      background: none;
      border: 1px solid var(--line);
      color: var(--text-2);
      padding: 14px;
      border-radius: 12px;
      font-size: 14px;
      font-weight: 600;
      cursor: pointer;
    }
    .cta-secondary:hover { background: var(--bg-2); }

    /* [T68-2 재수정, 2026-08-01] 인쇄 전용 스타일 — 화이트리스트 방식으로 재설계.
       원인(실기기 재현 확정): 이전 버전이 blacklist(`.screen:not(#screen4)`)를 썼는데
       #screen4는 로그인 화면이고 결과 화면은 #screen3라 결과 화면 자체가 display:none이 되어
       인쇄 시 백지가 나왔다(DevTools "Emulate CSS media type: print"로 재현·확인).
       화이트리스트: #app-root 직계 자식 중 #screen3만 남기고 전부 숨김 — 모달·다른 화면·
       플로팅 버튼 등을 개별 나열할 필요가 없어 예측 가능하다. */
    @media print {
      #app-root > *:not(#screen3) { display: none !important; }

      /* #screen3 내부에서도 인쇄에 불필요한 요소는 계속 숨김 */
      .demo-nav, .bottom-nav, .share-btn, #editModeBtn,
      #departFallbackBanner, #waterparkAnchorCard, #resultInlineMapTapHint,
      button, a[target="_blank"], .no-print { display: none !important; }

      body { background: #fff !important; }
      #app-root { box-shadow: none !important; max-width: none !important; }
      #screen3 { background: #fff !important; }
      #aiItineraryResult, #resultRadarWrap, #costSummaryCard {
        background: #fff !important; border-color: var(--line) !important; box-shadow: none !important;
      }
      .meta-bar { border-bottom: 1px solid var(--line) !important; padding-bottom: 8px; }
      .print-only { display: block !important; }

      .tl-day { break-before: page; page-break-before: always; }
      .tl-day:first-of-type { break-before: avoid; page-break-before: avoid; }
    }