/* DMAP 화면 모양 (index.html·app.js에서 씀) */
  :root{
    --bg:#eef1ee;
    --surface:#ffffff;
    --surface-2:#e3e9e5;
    --ink:#16282c;
    --ink-soft:#4c6064;
    --line:#d2dcd7;
    --accent:#a97423;
    --accent-ink:#ffffff;
    --accent-soft:#f3e6cc;
    --live:#e5484d;   /* 축제 시간표 "지금" (사이트 강조색 황토와 겹치지 않게 빨강) */
    --shadow: 0 1px 2px rgba(22,40,44,.06), 0 6px 16px rgba(22,40,44,.06);
    --cat-admin:#3373b3;
    --cat-major:#c98518;
    --cat-student:#2f9155;
    --cat-facility:#d1592a;
    --cat-sports:#0e94a3;
    --cat-etc:#6a7280;
    --sky-top:#eef4f2;
    --sky-bottom:#e4ecec;
    --hill:#c9d6c4;
    --hill-2:#b6c7ae;
    --road:#d8d2c2;
    --brand-green:#1f4d43;
    --brand-coral:#fb8268;
  }
  @media (prefers-color-scheme: dark){
    :root:not([data-theme="light"]){
      --bg:#0e1a1c;
      --surface:#132225;
      --surface-2:#1a2c30;
      --ink:#eef2f0;
      --ink-soft:#9fb3b1;
      --line:#254042;
      --accent:#dcb063;
      --accent-ink:#16282c;
      --accent-soft:#2a2210;
      --shadow: 0 1px 2px rgba(0,0,0,.3), 0 8px 20px rgba(0,0,0,.35);
      --cat-admin:#7fa2c2;
      --cat-major:#dcb063;
      --cat-student:#8db179;
      --cat-facility:#cf8c5c;
      --cat-sports:#5a9998;
      --cat-etc:#9aa6a2;
      --sky-top:#0d191b;
      --sky-bottom:#0a1416;
      --hill:#1c2f27;
      --hill-2:#16261f;
      --road:#2a2620;
      --brand-green:#8fd9c4;
      --brand-coral:#fb8268;
    }
  }
  :root[data-theme="dark"]{
    --bg:#0e1a1c;
    --surface:#132225;
    --surface-2:#1a2c30;
    --ink:#eef2f0;
    --ink-soft:#9fb3b1;
    --line:#254042;
    --accent:#dcb063;
    --accent-ink:#16282c;
    --accent-soft:#2a2210;
    --shadow: 0 1px 2px rgba(0,0,0,.3), 0 8px 20px rgba(0,0,0,.35);
    --cat-admin:#7fa2c2;
    --cat-major:#dcb063;
    --cat-student:#8db179;
    --cat-facility:#cf8c5c;
    --cat-sports:#5a9998;
    --cat-etc:#9aa6a2;
    --sky-top:#0d191b;
    --sky-bottom:#0a1416;
    --hill:#1c2f27;
    --hill-2:#16261f;
    --road:#2a2620;
    --brand-green:#8fd9c4;
    --brand-coral:#fb8268;
  }

  *{box-sizing:border-box;}
  body{
    margin:0;
    background:var(--bg);
    color:var(--ink);
    font-family:"Noto Sans KR", system-ui, sans-serif;
    -webkit-font-smoothing:antialiased;
  }
  .wrap{
    max-width:520px;
    margin:0 auto;
    padding:0 0 48px;
  }
  .col-map, .col-side{min-width:0;}
  @media (max-width:839px){ body.searching .col-side{display:none;} }
  .seo-info{ margin:0 0 10px; font-size:11.5px; color:var(--ink-soft); line-height:1.6; }
  .seo-info summary{ cursor:pointer; font-weight:600; }
  .seo-info ul{ margin:6px 0 0; padding-left:16px; }
  .seo-info p{ margin:6px 0 0; }
  .clear-search{ display:block; margin:14px auto 4px; border:1px solid var(--line); background:var(--surface); color:var(--ink-soft); font-family:inherit; font-size:13px; font-weight:600; padding:9px 16px; border-radius:999px; cursor:pointer; }

  /* desktop: map on the left, actions/search/list on the right */
  @media (min-width:840px){
    .wrap{max-width:1080px;}
    header{padding:22px 32px 16px;}
    .content{
      display:flex;
      align-items:flex-start;
      gap:28px;
      padding:0 32px;
    }
    .col-map{flex:1.5;}
    .col-side{flex:1; max-width:380px;}
    .map-toolbar{margin:20px 0 0;}
    .mapview{margin:10px 0 0;}
    .map-caption{padding:10px 2px 0;}
    .quick-links{margin:10px 0 0;}
    /* PC: 마우스로는 옆으로 밀 수 없어서, 바로가기·분류 버튼이 넘치면 다음 줄로 */
    .quick-links, .chips{flex-wrap:wrap; overflow-x:visible;}
    .actions{padding:20px 0 0;}
    .events{margin:14px 0 0;}
    .controls{padding:18px 0 4px;}
    .chips{padding:12px 0 2px;}
    footer{padding:18px 32px 0;}
  }

  /* header */
  header{
    position:sticky;
    top:0;
    z-index:5;
    background:var(--bg);
    padding:18px 20px 14px;
    border-bottom:1px solid var(--line);
  }
  .brand{
    display:flex;
    align-items:center;
    gap:12px;
  }
  .logo-chip{
    flex:none;
    background:#fff;
    border-radius:12px;
    padding:8px 10px;
    display:flex;
    align-items:center;
    box-shadow:var(--shadow);
  }
  .logo-chip a{ display:flex; }
  .logo{display:block; width:88px; height:auto; cursor:pointer;}
  .brand h1{
    margin:0;
    font-size:19px;
    font-weight:900;
    letter-spacing:-.01em;
  }
  .brand p{
    margin:2px 0 0;
    font-size:12.5px;
    color:var(--ink-soft);
  }
  .tagline{
    margin:12px 0 0;
    font-size:12.5px;
    color:var(--accent);
    font-weight:500;
    display:flex;
    align-items:center;
    gap:6px;
  }
  .tagline svg{flex:none;}
  .tagline{flex-wrap:wrap;}
  /* 홈 화면 추가 안내 — 설명 문구 아래 한 줄 띠 (2026-11-05 운영자: 작게 두니 너무 안 보임 → 띠로. 이미 추가했으면 안 보임) */
  .tagline-install{display:flex; align-items:center; justify-content:space-between; gap:8px; width:100%; margin:10px 0 0; padding:9px 14px; border:none; border-radius:12px; background:var(--accent-soft); color:var(--accent); font:inherit; font-size:13.5px; font-weight:600; text-align:left; cursor:pointer;}
  .tagline-install > span:last-child{font-size:18px; line-height:1;}
  .tagline-install[hidden]{display:none;}

  /* map */
  .map-toolbar{
    display:flex;
    flex-wrap:wrap;
    align-items:center;
    gap:8px 10px;
    margin:16px 20px 0;
  }
  /* 지도 위: [실제 지도|일러스트] [📍 마커 보이기] 색 설명 — 폭이 좁으면 색 설명이 다음 줄로 */
  .map-toolbar .legend{flex:1 1 auto; margin:0; padding:0; border:none; background:none; gap:4px 10px;}
  @media (max-width:839px){ .map-toolbar .legend{flex-basis:100%;} }
  /* 지도 아래: 학교 바로가기 한 줄 (휴대폰은 옆으로 밀어서) */
  .quick-links{display:flex; gap:6px; margin:10px 20px 0; overflow-x:auto; scrollbar-width:none; -webkit-overflow-scrolling:touch;}
  .quick-links::-webkit-scrollbar{display:none;}
  .quick-links a{flex:none; padding:7px 12px; border-radius:999px; background:var(--surface); border:1px solid var(--line); color:var(--ink); font-size:12px; font-weight:600; text-decoration:none; white-space:nowrap;}
  .quick-links a:hover{border-color:var(--accent); color:var(--accent);}
  .mapview{
    position:relative;
    margin:10px 20px 0;
    border-radius:18px;
    overflow:hidden;
    border:1px solid var(--line);
    box-shadow:var(--shadow);
    background:linear-gradient(var(--sky-top), var(--sky-bottom));
    aspect-ratio:990/680;
  }
  .kakao-map{
    position:absolute;
    inset:0;
    width:100%;
    height:100%;
  }
  .marker-toggle[hidden], .fest-zone[hidden]{display:none;}   /* 🎉 축제 핀 버튼은 축제 날에만, 축제 구역은 버튼으로 숨김 */
  .marker-toggle{
    flex:none;
    border:none;
    padding:6px 12px;
    border-radius:999px;
    background:#fff;
    box-shadow:var(--shadow);
    color:#16282c;
    font-family:inherit;
    font-size:11px;
    font-weight:600;
    cursor:pointer;
  }
  .illust-map{
    position:absolute;
    inset:0;
    width:100%;
    height:100%;
    display:block;
    background:linear-gradient(var(--sky-top), var(--sky-bottom));
    overflow:hidden;
  }
  .illust-map[hidden]{display:none;}
  .illust-zoom-layer{
    position:absolute;
    inset:0;
    width:100%;
    height:100%;
    transform-origin:0 0;
    touch-action:none;
  }
  .illust-img{
    position:absolute;
    inset:0;
    width:100%;
    height:100%;
    object-fit:contain;
    pointer-events:none;
  }
  .illust-zoom-controls{
    position:absolute;
    right:10px;
    top:50%;
    transform:translateY(-50%);
    z-index:2;
    display:flex;
    flex-direction:column;
    gap:4px;
    padding:4px;
    border-radius:10px;
    background:rgba(255,255,255,.85);
    backdrop-filter:blur(4px);
    box-shadow:var(--shadow);
  }
  .illust-zoom-controls button{
    width:28px;
    height:28px;
    border:none;
    border-radius:7px;
    background:transparent;
    color:#16282c;
    font-size:16px;
    font-weight:700;
    line-height:1;
    cursor:pointer;
  }
  .illust-zoom-controls button:active{ background:rgba(0,0,0,.08); }
  .illust-pins{
    position:absolute;
    inset:0;
    pointer-events:none;
  }
  .illust-pin{
    position:absolute;
    transform:translate(-50%,-100%);
    width:22px;
    height:28px;
    pointer-events:auto;
    cursor:pointer;
    background:none;
    border:none;
    padding:0;
    filter:drop-shadow(0 2px 3px rgba(0,0,0,.35));
  }
  .illust-pin svg{ width:100%; height:100%; display:block; }
  .illust-pin[hidden]{ display:none; }
  .view-toggle{
    flex:none;
    display:flex;
    gap:3px;
    padding:3px;
    border-radius:999px;
    background:rgba(255,255,255,.85);
    backdrop-filter:blur(4px);
    box-shadow:var(--shadow);
  }
  .view-toggle button{
    border:none;
    background:transparent;
    color:var(--ink-soft);
    font-family:inherit;
    font-size:11px;
    font-weight:600;
    padding:5px 11px;
    border-radius:999px;
    cursor:pointer;
  }
  .view-toggle button[aria-pressed="true"]{
    background:var(--accent);
    color:var(--accent-ink);
  }
  .map-caption{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:10px;
    padding:10px 20px 0;
    font-size:11.5px;
    color:var(--ink-soft);
  }
  .legend{
    display:flex;
    flex-wrap:wrap;
    gap:6px 14px;
    margin:10px 20px 0;
    padding:10px 14px;
    border-radius:12px;
    background:var(--surface);
    border:1px solid var(--line);
  }
  .legend-item{
    display:flex;
    align-items:center;
    gap:5px;
    font-size:11px;
    font-weight:500;
    color:var(--ink-soft);
  }
  .legend-dot{
    width:9px;height:9px;border-radius:50%;flex:none;
  }

  /* bottom sheet */
  .sheet-backdrop{
    position:fixed;
    inset:0;
    background:rgba(10,18,20,.42);
    opacity:0;
    pointer-events:none;
    transition:opacity .18s ease;
    z-index:30;
  }
  .sheet-backdrop.open{opacity:1;pointer-events:auto;}
  .sheet{
    position:fixed;
    left:50%;
    bottom:0;
    transform:translate(-50%,100%);
    width:100%;
    max-width:520px;
    background:var(--surface);
    border-radius:20px 20px 0 0;
    border:1px solid var(--line);
    border-bottom:none;
    box-shadow:0 -8px 30px rgba(0,0,0,.18);
    padding:18px 18px 24px;
    transition:transform .2s ease;
    z-index:31;
    /* 내용이 길면(실기고사장 안내 등) 화면 위로 넘치지 않고 안에서 스크롤 */
    max-height:88vh;
    max-height:88dvh;
    display:flex;
    flex-direction:column;
  }
  #sheetBody{overflow-y:auto; overscroll-behavior:contain; min-height:0; -webkit-overflow-scrolling:touch;}
  .sheet.open{transform:translate(-50%,0);}
  .sheet-grip{
    width:36px;height:4px;border-radius:2px;
    background:var(--line);
    margin:0 auto 14px;
  }
  .sheet-close{
    position:absolute;
    top:14px;right:14px;
    width:28px;height:28px;
    border-radius:50%;
    border:1px solid var(--line);
    background:var(--surface-2);
    color:var(--ink-soft);
    display:flex;align-items:center;justify-content:center;
    cursor:pointer;
  }
  @media (prefers-reduced-motion:reduce){
    .sheet, .sheet-backdrop{transition:none;}
  }

  .cat-bar{
    width:4px;
    border-radius:3px;
    flex:none;
    align-self:stretch;
  }

  /* quick actions */
  .actions{
    display:grid;
    grid-template-columns:repeat(2,1fr);
    gap:8px;
    padding:14px 20px 0;
  }
  .actions a, .actions button{
    display:flex;
    flex-direction:column;
    align-items:center;
    justify-content:center;
    gap:5px;
    padding:11px 6px;
    border-radius:12px;
    background:var(--surface);
    border:1px solid var(--line);
    color:var(--ink);
    font-family:inherit;
    font-size:11.5px;
    font-weight:500;
    text-decoration:none;
    cursor:pointer;
    box-shadow:var(--shadow);
  }
  .actions svg{width:18px;height:18px;stroke:var(--accent);}

  .events{
    margin:14px 20px 0;
    padding:12px 14px;
    border-radius:12px;
    background:var(--surface);
    border:1px solid var(--line);
    box-shadow:var(--shadow);
  }
  .events-title{
    margin:0 0 8px;
    font-size:12.5px;
    font-weight:700;
  }
  .events-list{display:flex; flex-direction:column; gap:6px;}
  .event-row{display:flex; align-items:center; gap:10px; font-size:12.5px;}
  .event-date{
    flex:none; width:84px; white-space:nowrap;
    font-family:"IBM Plex Mono", monospace;
    color:var(--accent); font-weight:600;
  }
  .event-name{color:var(--ink);}
  /* 입시 기간에만 뜨는 실기고사장 안내 */
  .exam-banner{display:flex; align-items:center; gap:8px; box-sizing:border-box; width:calc(100% - 40px); margin:0 20px 14px; padding:12px 16px; border:1px solid var(--accent); border-radius:14px; background:var(--accent-soft); color:var(--ink); font:inherit; font-size:15px; font-weight:700; text-align:left; cursor:pointer;}
  .exam-banner[hidden]{display:none;}
  @media (min-width:840px){ .exam-banner{width:calc(100% - 84px); margin:4px 32px 0 52px;} }   /* 왼쪽은 지도, 오른쪽은 옆 칸 끝에 맞춤 */
  .exam-banner .exam-dates{margin-left:auto; font-size:13px; font-weight:500; color:var(--ink-soft); white-space:nowrap;}
  .install-card{display:flex; align-items:center; gap:10px; box-sizing:border-box; width:calc(100% - 40px); margin:0 20px 14px; padding:10px 12px; border:1px solid var(--line); border-radius:14px; background:var(--surface); font-size:13px; line-height:1.45;}
  .install-card[hidden]{display:none;}
  @media (min-width:840px){ .install-card{width:calc(100% - 84px); margin:10px 32px 0 52px;} }
  .install-icon{font-size:20px;}
  .install-text{flex:1; min-width:0; display:flex; flex-direction:column; gap:1px;}
  .install-text b{font-size:14px;}
  .install-text span{color:var(--ink-soft);}
  .install-share{display:inline-block; vertical-align:-2px; color:var(--ink);}
  .install-go{flex:none; border:none; border-radius:10px; padding:7px 14px; background:var(--accent); color:var(--accent-ink); font:inherit; font-size:13px; font-weight:700; cursor:pointer;}
  .install-close{flex:none; align-self:center; border:none; background:none; color:var(--ink-soft); font-size:14px; cursor:pointer; padding:2px 4px;}
  .exam-sheet h2{font-size:19px; margin:0 0 4px;}
  .exam-sheet .exam-note{font-size:13px; color:var(--ink-soft); margin:0 0 14px; line-height:1.5;}
  .exam-row{padding:12px 0; border-top:1px solid var(--line);}
  .exam-park{font-size:12.5px; color:var(--ink-soft); line-height:1.5; margin:8px 0 0;}
  .exam-park b{color:var(--ink); font-weight:600;}
  .exam-done-toggle{display:block; width:100%; margin:14px 0 0; padding:10px; border:1px solid var(--line); border-radius:12px; background:var(--surface-2); color:var(--ink-soft); font:inherit; font-size:14px; font-weight:600; cursor:pointer;}
  .exam-done-list[hidden]{display:none;}
  .exam-row .exam-dept{font-size:15px; font-weight:700;}
  .exam-row .exam-sub{font-size:12px; color:var(--ink-soft); font-weight:500;}
  .exam-row .exam-when{font-size:13px; color:var(--accent); font-weight:700; margin:2px 0 6px;}
  .exam-row .exam-line{display:flex; flex-wrap:wrap; align-items:center; gap:6px; font-size:13px; margin-top:4px;}
  .exam-row .exam-label{color:var(--ink-soft); min-width:64px;}
  .exam-place{border:1px solid var(--line); background:var(--surface-2); color:var(--ink); border-radius:10px; padding:4px 10px; font:inherit; font-size:13px; cursor:pointer;}
  .fest-map{display:block; width:100%; height:auto; margin:0 0 6px; border:1px solid var(--line); border-radius:12px;}
  .fest-day{font-size:16px; font-weight:700; margin:18px 0 2px;}
  /* 축제 배너 — 총학 포스터처럼 밤하늘·불꽃 느낌 (검정 바탕에 보라·핑크 빛). 다크 모드에서도 같은 색 */
  .fest-banner{position:relative; display:flex; align-items:center; gap:12px; box-sizing:border-box; width:calc(100% - 40px); margin:0 20px 14px; padding:14px 16px; overflow:hidden;
    border:none; border-radius:18px; color:#fff; font:inherit; text-align:left; cursor:pointer;
    background:
      radial-gradient(circle at 88% 15%, rgba(236,72,153,.75), transparent 42%),
      radial-gradient(circle at 8% 110%, rgba(139,92,246,.7), transparent 50%),
      linear-gradient(135deg, #1b1030, #12091c);
    box-shadow:0 6px 18px rgba(40,10,60,.35);}
  .fest-banner[hidden]{display:none;}
  /* 반짝이는 점들 */
  .fest-banner::before{content:""; position:absolute; inset:0; pointer-events:none; opacity:.9;
    background-image:radial-gradient(1.5px 1.5px at 18% 30%, #fff, transparent), radial-gradient(1px 1px at 32% 72%, #fff, transparent),
      radial-gradient(1.5px 1.5px at 58% 22%, #ffd6f0, transparent), radial-gradient(1px 1px at 72% 78%, #fff, transparent),
      radial-gradient(2px 2px at 91% 62%, #fff, transparent), radial-gradient(1px 1px at 45% 50%, #e9d5ff, transparent);}
  .fest-banner .fb-emoji{position:relative; flex:none; font-size:30px; line-height:1;}
  .fest-banner .fb-text{position:relative; flex:1; min-width:0; display:flex; flex-direction:column; gap:2px;}
  .fest-banner .fb-sub{font-size:12px; color:rgba(255,255,255,.78); white-space:nowrap; overflow:hidden; text-overflow:ellipsis;}
  .fest-banner .fb-sub .live{color:#ff7ac2; font-weight:800; letter-spacing:.02em;}
  .fest-banner .fb-title{font-size:16.5px; font-weight:800; letter-spacing:-.01em; line-height:1.3; word-break:keep-all;}   /* 휴대폰에선 "제46회 복정축전 / 좋지 아니한가" 두 줄 */
  .fest-banner .fb-title em{display:block; font-style:normal;background:linear-gradient(90deg, #ffb3dd, #d8b4fe); -webkit-background-clip:text; background-clip:text; color:transparent;}
  .fest-banner .fb-wip{position:absolute; top:7px; right:10px; padding:1px 7px; border-radius:999px; background:#ffd84d; color:#3b2a00; font-size:10.5px; font-weight:800;}   /* 아직 다 안 채워진 안내 */
  .fest-soon{text-align:center; padding:28px 18px;}
  .fest-soon .fest-soon-emoji{margin:0 0 6px; font-size:36px;}
  .fest-soon h3{font-size:17px; margin:0 0 8px;}
  .fest-wip{margin:0 0 10px; padding:10px 12px; border-radius:12px; background:#fff6d6; border:1px solid #f0d27a; color:#5c4300; font-size:13px; line-height:1.5;}
  .fest-banner .fb-go{position:relative; flex:none; padding:7px 11px; border-radius:999px; background:rgba(255,255,255,.16); border:1px solid rgba(255,255,255,.28); font-size:12.5px; font-weight:700; white-space:nowrap;}
  @media (min-width:840px){ .fest-banner{width:calc(100% - 84px); margin:4px 32px 0 52px;} }
  /* 축제 창 (dmapdu.com/?fest) — 화면 전체를 덮는 기간별 행사 안내. 지도는 바로 뒤에 그대로 있어서 "지도에서 보기"는 창만 닫고 이동 */
  .fest-view{position:fixed; inset:0; z-index:35; background:var(--bg); overflow-y:auto; overscroll-behavior:contain;}
  .fest-view[hidden]{display:none;}
  .fest-inner{max-width:720px; margin:0 auto; padding:0 16px 48px;}
  .fest-top{position:sticky; top:0; z-index:2; display:flex; align-items:center; gap:8px; padding:12px 0 8px; background:var(--bg);}
  .fest-top h2{flex:1; min-width:0; margin:0; font-size:17px; line-height:1.35;}
  .fest-top small{display:block; font-size:12.5px; font-weight:500; color:var(--ink-soft);}
  .fest-icon-btn{flex:none; border:1px solid var(--line); background:var(--surface); color:var(--ink); border-radius:999px; padding:7px 12px; font:inherit; font-size:13px; font-weight:700; cursor:pointer;}
  .fest-now{margin:4px 0 12px; padding:14px 16px; border:1px solid var(--accent); border-radius:16px; background:var(--accent-soft);}
  .fest-now .now-label{font-size:12px; font-weight:700; color:var(--accent);}
  .fest-now .now-main{margin-top:2px; font-size:18px; font-weight:700; line-height:1.4;}
  .fest-now .now-next{margin-top:4px; font-size:13px; color:var(--ink-soft);}
  .fest-tabs{position:sticky; top:58px; z-index:2; display:flex; gap:6px; padding:6px 0 10px; background:var(--bg);}
  .fest-tabs button{flex:1; padding:9px 4px; border:1px solid var(--line); border-radius:12px; background:var(--surface); color:var(--ink-soft); font:inherit; font-size:14px; font-weight:700; cursor:pointer;}
  .fest-tabs button[aria-selected="true"]{background:var(--accent); border-color:var(--accent); color:var(--accent-ink);}
  .fest-card{margin-bottom:12px; padding:14px 16px; border:1px solid var(--line); border-radius:14px; background:var(--surface);}
  .fest-card h3{margin:0 0 8px; font-size:15px;}
  .fest-card .fest-note{margin:0 0 8px; font-size:12.5px; color:var(--ink-soft); line-height:1.5;}
  .fest-pending{padding:10px 12px; border-radius:10px; background:var(--surface-2); font-size:13px; color:var(--ink-soft); line-height:1.5;}
  .fest-daytabs{display:flex; gap:6px; margin-bottom:6px;}
  .fest-daytabs button{border:1px solid var(--line); background:var(--surface-2); color:var(--ink-soft); border-radius:999px; padding:5px 12px; font:inherit; font-size:13px; font-weight:700; cursor:pointer;}
  .fest-daytabs button[aria-selected="true"]{background:var(--ink); border-color:var(--ink); color:var(--surface);}
  /* 공연 시간표 — 세로 타임라인 (2026-11-03 운영자가 시안 C로 확정) */
  .tl{margin:12px 0 6px; padding:0; list-style:none;}
  .tl-item{display:grid; grid-template-columns:58px 1fr;}
  .tl-time{padding:1px 12px 0 0; text-align:right; line-height:1.25; font-variant-numeric:tabular-nums;}
  .tl-time b{display:block; font-size:16px; color:var(--ink);}
  .tl-time small{font-size:12px; color:var(--ink-soft);}
  .tl-body{position:relative; min-width:0; padding:0 0 20px 18px; border-left:2px solid var(--line);}
  .tl-item:last-child .tl-body{padding-bottom:4px; border-left-color:transparent;}
  .tl-body::before{content:""; position:absolute; left:-8px; top:3px; width:10px; height:10px; border:2px solid var(--line); border-radius:50%; background:var(--surface);}
  .tl-item.artist .tl-body::before{border-color:var(--accent);}
  .tl-item.now .tl-body::before{border-color:var(--live); background:var(--live); box-shadow:0 0 0 4px color-mix(in srgb, var(--live) 25%, transparent);}
  .tl-head{display:flex; align-items:center; gap:6px; margin-bottom:3px;}
  .tl-kind{font-size:12px; font-weight:700; color:var(--accent);}
  .tl-title{display:block; font-size:15.5px; line-height:1.4; word-break:keep-all;}
  .tl-item.artist .tl-title{font-size:20px; font-weight:800; letter-spacing:-.01em;}
  .tl-item.now .tl-title{color:var(--live);}
  .tl-item.past .tl-time b, .tl-item.past .tl-title{color:var(--ink-soft);}
  /* 총학 공식 타임테이블 그림 + 접어 둔 글자 시간표 */
  .fest-tt-img{max-width:520px; margin:10px auto 6px; display:block; border-radius:12px;}
  .tt-text{margin:4px 0 0; border-top:1px solid var(--line);}
  .tt-text summary{padding:10px 2px; font-size:13.5px; font-weight:700; color:var(--ink-soft); cursor:pointer;}
  .tl-badge{padding:1px 8px; border-radius:999px; background:var(--surface-2); color:var(--ink-soft); font-size:11.5px; font-weight:700;}
  .tl-teams{display:flex; flex-wrap:wrap; gap:5px; margin-top:8px;}
  .tl-teams span{padding:3px 10px; border:1px solid var(--line); border-radius:999px; background:var(--surface-2); font-size:12.5px; white-space:nowrap;}
  .tl-note{margin:4px 0 0; font-size:13px; color:var(--ink-soft);}
  .tl-badge.now{background:var(--live); color:#fff;}
  /* 안내 탭 — 본부 이벤트, 유의사항 */
  .hq-list{margin:0; padding:0; list-style:none;}
  .hq-list li{padding:9px 0; border-top:1px solid var(--line);}
  .hq-list li:first-child{border-top:none; padding-top:2px;}
  .hq-list b{display:flex; align-items:center; gap:7px; font-size:14.5px;}
  .hq-no{padding:1px 6px; border-radius:5px; background:#2b2b2b; color:#fff; font-size:12px;}
  .hq-ev{display:flex; justify-content:space-between; gap:10px; margin-top:5px; padding-left:2px; font-size:13.5px;}
  .hq-ev small{flex:none; color:var(--ink-soft); font-variant-numeric:tabular-nums;}
  .safe-list{margin:0 0 8px; padding:0; list-style:none;}
  .safe-list li{display:flex; gap:12px; padding:10px 0; border-top:1px solid var(--line);}
  .safe-list li:first-child{border-top:none; padding-top:2px;}
  .safe-ic{flex:none; width:34px; height:34px; display:grid; place-items:center; border-radius:10px; background:var(--surface-2); font-size:18px;}
  .safe-list b{display:block; font-size:14.5px; line-height:1.4;}
  .safe-list small{display:block; margin-top:2px; font-size:12.5px; line-height:1.5; color:var(--ink-soft);}
  .fest-btns{display:flex; flex-wrap:wrap; gap:6px; margin-top:8px;}
  .fest-list{margin:0; padding:0; list-style:none;}
  .fest-card .fest-menu{margin:0 0 8px; font-size:13.5px; line-height:1.7; word-break:keep-all;}   /* 푸드트럭 메뉴 (트럭별 이름은 안 나와서 메뉴만) */
  .fest-card .fest-menu-small{font-size:12.5px; color:var(--ink-soft);}   /* 메뉴 사진 아래 글자 메뉴 */
  .fest-truck-img{max-width:540px; margin:0 auto 8px; display:block;}   /* 원본 가로 1075px (폰 화면 3배 밀도까지 선명) */
  .fest-list li{padding:7px 0; border-top:1px solid var(--line); font-size:14px; line-height:1.5;}
  .fest-list li:first-child{border-top:none;}
  .fest-list small{color:var(--ink-soft);}
  /* 일러스트 지도 위 축제 구역 (2026-11-03) — 색은 총학 배치도 범례와 같게 (주점 분홍·본부 검정·푸드트럭 노랑·체험 초록·무대 파랑) */
  .fest-zone{position:absolute; transform:translate(-50%,-50%); pointer-events:auto; cursor:pointer; padding:0; border:2px solid var(--fz); border-radius:6px; background:color-mix(in srgb, var(--fz) 40%, transparent); box-shadow:0 0 0 2px #fff, 0 1px 5px rgba(0,0,0,.35);   /* 흰 테두리 한 겹 — 바탕(잔디·모래·트랙)이 무슨 색이든 경계가 보이게 */}
  /* 색은 총학 배치도 범례를 따르되, 일러스트 바탕과 겹치던 색은 진하게 (2026-11-03): 체험 초록 → 진한 초록(잔디·골프장), 푸드트럭 노랑 → 주황(소운동장 모래) */
  .fzone-stage{--fz:#1e63c6;} .fzone-pubs{--fz:#e8407a;} .fzone-hq{--fz:#2b2b2b;} .fzone-exp{--fz:#17692f;} .fzone-trucks{--fz:#ef6c00;}
  .fest-zone.fzone-stage{background:color-mix(in srgb, var(--fz) 75%, transparent);}   /* 무대는 빨간 트랙·초록 운동장 위라 거의 꽉 채움 */
  .fest-zone.fzone-trucks{background:color-mix(in srgb, var(--fz) 60%, transparent);}
  .fest-zone.fzone-dot{width:12px; height:12px; border-radius:50%; background:var(--fz); border-color:#fff;}
  .fz-tag{position:absolute; bottom:100%; left:50%; transform:translate(-50%,-3px); white-space:nowrap; padding:1px 6px; border:1.5px solid var(--fz); border-radius:999px; background:#fff; color:#16282c; font-size:10.5px; font-weight:700; line-height:1.4; box-shadow:0 1px 3px rgba(0,0,0,.25);}
  .fzone-exp .fz-tag{bottom:auto; top:100%; transform:translate(-50%,3px);}   /* 본부와 붙어 있어서 이름표를 아래로 (겹치지 않게) */
  /* 축제 안내 지도 탭의 축제 지도 — 일러스트에서 구역이 있는 부분만 잘라 보여줌 (fm-inner가 그림 전체, fm-wrap이 창) */
  .fm-wrap{position:relative; overflow:hidden; margin:4px 0 8px; border-radius:12px; background:var(--surface-2);}
  .fm-inner{position:absolute;}
  .fm-img{display:block; width:100%; height:100%;}
  /* 카드 안 지도 + ⤢ 크게 보기 버튼 (2026-11-03) */
  .fm-card{position:relative; margin:4px 0 8px;}
  .fm-card .fm-wrap{margin:0;}
  .fm-big{position:absolute; right:8px; bottom:8px; padding:5px 10px; border:none; border-radius:999px; background:rgba(22,40,44,.82); color:#fff; font:inherit; font-size:12.5px; font-weight:700; cursor:pointer;}
  .fm-scroll{overflow-x:auto; border-radius:12px;}   /* 폰에선 지도를 크게 그리고 옆으로 밀어서 봄 (칸 번호가 읽히게) */
  .fm-scroll .fm-wrap{min-width:620px; margin:0;}
  .fm-full{position:fixed; inset:0; z-index:60; display:flex; flex-direction:column; background:var(--bg);}
  .fm-full[hidden]{display:none;}
  .fm-bar{display:flex; align-items:center; gap:6px; padding:10px 12px calc(10px); padding-top:calc(10px + env(safe-area-inset-top)); border-bottom:1px solid var(--line); background:var(--surface);}
  .fm-bar b{flex:1; font-size:15px;}
  .fm-bar button{width:38px; height:38px; border:1px solid var(--line); border-radius:10px; background:var(--surface-2); color:var(--ink); font:inherit; font-size:18px; font-weight:700; cursor:pointer;}
  .fm-full-scroll{flex:1; display:flex; overflow:auto; -webkit-overflow-scrolling:touch; touch-action:pan-x pan-y;}
  .fm-full-map{flex:none; margin:auto;}   /* 화면보다 작게 줄이면 가운데 (auto 여백은 넘칠 때 잘리지 않음) */
  .fm-full-map .fm-wrap{margin:0; border-radius:0;}
  .fm-full-map .fm-cell{font-size:12px;}
  .fm-full-map .fz-tag{font-size:15px;}
  .fest-zone.fm-row{display:flex; gap:1px; padding:1px; cursor:default;}
  .fm-row button.fz-tag{border:1.5px solid var(--fz); font:inherit; cursor:pointer;}
  .fm-cell{flex:1 1 0; min-width:0; padding:0; border:none; border-radius:3px; background:var(--fz); color:#fff; font:inherit; font-size:9.5px; font-weight:800; line-height:1; letter-spacing:-.02em; cursor:pointer;}
  .fm-wrap .fz-tag{padding:0 3px; font-size:12px; line-height:1.5;}   /* 지도 위엔 아이콘만 */
  .fm-wrap .fzone-exp .fz-tag{bottom:100%; top:auto; transform:translate(-50%,-3px);}
  .fm-keys{display:flex; flex-wrap:wrap; gap:6px; margin:0 0 8px;}
  .fm-key{display:inline-flex; align-items:center; gap:6px; padding:5px 10px; border:1px solid var(--line); border-radius:999px; background:var(--surface); color:var(--ink); font:inherit; font-size:13px; cursor:pointer;}
  .fm-key i{width:12px; height:9px; border:2px solid var(--fz); border-radius:3px; background:color-mix(in srgb, var(--fz) 32%, transparent);}
  .fm-key i.dot{width:9px; height:9px; border-radius:50%; background:var(--fz);}
  /* 구역 배치 그림 */
  .fz-map{margin:8px 0; padding:10px 10px 12px; border-radius:12px; background:var(--surface-2);}
  .fz-cap{margin:0 0 6px; font-size:12.5px; font-weight:700; color:var(--ink-soft);}
  .fz-row{display:flex; gap:4px; justify-content:center;}
  .fz-row + .fz-row{margin-top:6px;}
  .fz-row-hq{justify-content:flex-end;}   /* 배치도: 본부는 1호관 앞 오른쪽 */
  .fz-cell{flex:1 1 0; min-width:0; max-width:58px; padding:9px 0 7px; border:none; border-radius:9px 9px 3px 3px; color:#fff; font:inherit; font-size:12.5px; font-weight:700; cursor:pointer;}
  .fzc-pub{background:#e8407a;} .fzc-exp{background:#17692f;} .fzc-hq{background:#2b2b2b;}
  .fz-cell[aria-pressed="true"]{outline:3px solid #ffc400; outline-offset:2px; animation:fz-blink .9s ease-in-out 3;}
  @keyframes fz-blink{50%{transform:scale(1.15);}}
  @media (prefers-reduced-motion:reduce){ .fz-cell[aria-pressed="true"]{animation:none;} }
  .fz-bar{margin-top:6px; padding:8px; border:1px solid var(--line); border-radius:6px; background:var(--surface); text-align:center; font-size:13px;}
  .fz-bld{margin-bottom:8px; padding:8px; border-radius:6px; background:#cfe0f5; color:#16282c; text-align:center; font-size:13px; font-weight:700;}
  .fz-apart{display:flex; align-items:center; gap:8px; margin-top:12px; padding-top:10px; border-top:1px dashed var(--line); font-size:12.5px; color:var(--ink-soft);}
  .fz-apart .fz-cell{flex:none; width:48px;}
  /* 칸 그림 아래 "어느 칸에 뭐가 있는지" 목록 — 늘 펼쳐 둠 */
  .fz-legend{margin:10px 0 0; padding:0; list-style:none; display:grid; grid-template-columns:repeat(auto-fill, minmax(230px, 1fr)); gap:2px 10px;}
  .fz-li{display:flex; align-items:flex-start; gap:8px; width:100%; padding:5px 6px; border:none; border-radius:8px; background:none; color:var(--ink); font:inherit; font-size:13.5px; line-height:1.45; text-align:left; cursor:pointer;}
  .fz-li b{flex:none; min-width:28px; padding:1px 0; border-radius:5px; color:#fff; font-size:12px; text-align:center;}
  .fz-li small{color:var(--ink-soft);}
  .fz-li.on{background:var(--surface); box-shadow:0 0 0 2px #ffc400 inset;}
  #fz-pubs, #fz-one{scroll-margin-top:150px;}   /* 위에 붙어 있는 제목·탭 줄에 가리지 않게 */
  #fest-trucks{scroll-margin-top:150px;}
  .fz-flash{animation:fz-flash 2s ease-out 1;}   /* 축제 지도·검색·챗봇에서 왔을 때 그 구역을 잠깐 표시 */
  @keyframes fz-flash{0%, 55%{box-shadow:0 0 0 3px #ffc400;} 100%{box-shadow:0 0 0 0 rgba(255,196,0,0);}}
  @media (prefers-reduced-motion:reduce){ .fz-flash{animation:none; box-shadow:0 0 0 3px #ffc400;} }
  /* 메인 지도의 축제 핀 (축제 당일에만) */
  /* 말풍선 + 꼬리 — 꼬리 끝(맨 아래)이 정확한 위치 */
  /* 위성 지도 위에서도 잘 보이게: 축제 핑크 + 흰 테두리, 꼬리 끝에 점(= 정확한 위치) */
  /* 크기 0인 상자에서 아래로 붙여 그림 — 카카오 지도는 핀을 처음 그릴 때 잰 크기로 가운데를 맞추는데, 지도를 멀리 보면
     글자가 이모지로 줄어서 핀이 왼쪽으로 밀렸음(주점 부스 82px). 상자가 0이면 글자 길이와 상관없이 점이 늘 그 좌표 (2026-11-02) */
  .fest-pin{width:0; height:0; justify-content:flex-end;}
  .fest-pin{display:flex; flex-direction:column; align-items:center; cursor:pointer;
    filter:drop-shadow(0 0 1.5px #fff) drop-shadow(0 0 1.5px #fff) drop-shadow(0 2px 4px rgba(0,0,0,.5));}
  .fest-pin .fp-label{padding:4px 10px; border:2.5px solid #ff2d87; border-radius:999px; background:#fff; color:#16282c; font:800 12.5px/18px system-ui, sans-serif; white-space:nowrap;}
  .fest-pin .fp-tail{display:block; width:0; height:0; margin-top:-2px; border-left:9px solid transparent; border-right:9px solid transparent; border-top:16px solid #ff2d87;}
  .fest-pin .fp-dot{display:block; width:11px; height:11px; margin-top:-3px; border-radius:50%; background:#ff2d87; border:2.5px solid #fff; box-sizing:border-box;}
  .fest-pin.compact .fp-label{padding:2px 5px; font-size:15px;}   /* 지도를 멀리 보면 이모지만 (핀끼리 글자가 겹치지 않게) */
  .fest-edit .modes button[aria-pressed="true"]{background:var(--accent); border-color:var(--accent); color:var(--accent-ink);}
  .exam-tag{display:inline-block; margin-left:6px; padding:1px 6px; border-radius:8px; font-size:11px; font-weight:700; color:#fff; background:#c0392b; vertical-align:1px;}
  .event-now{display:inline-block; margin-left:6px; padding:1px 6px; border-radius:8px; font-size:11px; font-weight:700; color:#fff; background:#c0392b; vertical-align:1px;}

  /* search + filters */
  .controls{
    padding:18px 20px 4px;
  }
  .search{
    position:relative;
  }
  .search input{
    width:100%;
    padding:11px 14px 11px 38px;
    border-radius:11px;
    border:1px solid var(--line);
    background:var(--surface);
    color:var(--ink);
    font-family:inherit;
    font-size:14px;
  }
  .search input::placeholder{color:var(--ink-soft);}
  .search svg{
    position:absolute;
    left:12px;
    top:50%;
    transform:translateY(-50%);
    width:16px;height:16px;
    stroke:var(--ink-soft);
  }
  .chips{
    display:flex;
    gap:7px;
    overflow-x:auto;
    padding:12px 20px 2px;
    scrollbar-width:none;
  }
  .chips::-webkit-scrollbar{display:none;}
  .chip{
    flex:none;
    padding:7px 13px;
    border-radius:999px;
    border:1px solid var(--line);
    background:var(--surface);
    color:var(--ink-soft);
    font-size:12.5px;
    font-weight:500;
    cursor:pointer;
    white-space:nowrap;
  }
  .chip[aria-pressed="true"]{
    background:var(--accent);
    border-color:var(--accent);
    color:var(--accent-ink);
  }

  /* list */
  .count{
    padding:14px 20px 6px;
    font-size:12px;
    color:var(--ink-soft);
    font-family:"IBM Plex Mono", monospace;
  }
  .list{
    display:flex;
    flex-direction:column;
    gap:10px;
    padding:2px 20px 0;
  }
  .card{
    background:var(--surface);
    border:1px solid var(--line);
    border-radius:14px;
    padding:14px 14px 14px 12px;
    box-shadow:var(--shadow);
    display:flex;
    gap:12px;
  }
  .badge{
    flex:none;
    width:42px;
    height:42px;
    border-radius:10px;
    background:var(--surface-2);
    color:var(--ink);
    display:flex;
    align-items:center;
    justify-content:center;
    font-family:"IBM Plex Mono", monospace;
    font-weight:600;
    font-size:13px;
    text-align:center;
    line-height:1.1;
  }
  .badge.fest-badge{background:#fde7ef; font-size:20px;}   /* 축제 검색 결과: 건물 번호 대신 축제 아이콘 */
  .card-body{min-width:0;flex:1;}
  .card-top{
    display:flex;
    align-items:baseline;
    justify-content:space-between;
    gap:8px;
  }
  .card-top h2{
    margin:0;
    font-size:15.5px;
    font-weight:700;
  }
  .cat{
    flex:none;
    font-size:10.5px;
    color:var(--ink-soft);
    font-weight:500;
  }
  .entry-loc{
    margin:4px 0 0;
    font-size:12px;
    color:var(--ink-soft);
  }
  .entry-loc.former{ color:var(--accent, #a97423); font-weight:600; }  .similar-note{ padding:10px 12px; margin-bottom:8px; border-radius:12px; font-size:13px; color:var(--ink-soft); background:var(--surface); border:1px dashed var(--line); }
  /* 물어보기 (챗봇) — 검색 결과 위 카드 + 오른쪽 아래 버튼 대화창 */
  .bot-ask{ display:flex; align-items:center; gap:8px; width:100%; box-sizing:border-box; margin-bottom:8px; padding:11px 13px; border-radius:12px; border:1px solid var(--accent); background:var(--accent-soft); color:var(--ink); font:inherit; font-size:14px; font-weight:700; text-align:left; cursor:pointer; }
  .bot-ask small{ margin-left:auto; font-size:12px; font-weight:500; color:var(--ink-soft); white-space:nowrap; }
  .bot-answer{ margin-bottom:10px; padding:11px 13px; border-radius:12px; background:var(--surface-2); font-size:14px; line-height:1.55; color:var(--ink); }
  .bot-text{ white-space:pre-line; word-break:keep-all; overflow-wrap:anywhere; }
  .bot-tools{ display:flex; flex-wrap:wrap; align-items:center; gap:6px; margin-top:8px; }
  .bot-go, .bot-choice{ border:1px solid var(--line); background:var(--surface); color:var(--accent); font:inherit; font-size:12.5px; font-weight:700; padding:5px 11px; border-radius:999px; cursor:pointer; text-decoration:none; display:inline-block; }
  /* 답 안의 작은 일러스트 지도 — 그림과 같은 비율(990/680)이라 핀 %가 그대로 맞음 */
  .bot-minimap{ position:relative; display:block; width:100%; aspect-ratio:990/680; margin-top:8px; padding:0; overflow:hidden; border:1px solid var(--line); border-radius:10px; background:var(--surface); cursor:zoom-in; }
  .bot-minimap img{ position:absolute; max-width:none; height:auto; display:block; pointer-events:none; }
  .bot-minimap-pin{ position:absolute; transform:translate(-50%,-100%); margin-top:-4px; padding:2px 8px; border:2px solid var(--accent); border-radius:999px; background:#fff; color:#16282c; font-size:12px; font-weight:800; line-height:16px; white-space:nowrap; pointer-events:none; box-shadow:0 2px 5px rgba(0,0,0,.35); }
  .bot-minimap-pin::after{ content:""; position:absolute; left:50%; top:100%; transform:translateX(-50%); border-left:6px solid transparent; border-right:6px solid transparent; border-top:8px solid var(--accent); }
  .bot-minimap-real{ cursor:default; }
  .bot-minimap-kakao{ position:absolute; inset:0; }
  .bot-minimap-cover{ position:absolute; inset:0; z-index:2; width:100%; height:100%; padding:0; border:none; background:transparent; cursor:zoom-in; }
  .bot-minimap-pin.below{ transform:translate(-50%,0); margin-top:10px; }
  .bot-minimap-pin.below::after{ top:auto; bottom:100%; border-top:none; border-bottom:8px solid var(--accent); }
  /* "지도에서 크게 보기"로 띄우는 실제 지도 핀 (축제 핀과 같은 모양, 사이트 강조색) — 꼬리 끝 점이 정확한 위치 */
  .bot-map-pin{display:flex; flex-direction:column; align-items:center; cursor:pointer;
    filter:drop-shadow(0 0 1.5px #fff) drop-shadow(0 0 1.5px #fff) drop-shadow(0 2px 4px rgba(0,0,0,.5));}
  .bot-map-pin .bp-label{padding:4px 10px; border:2.5px solid #e5484d; border-radius:999px; background:#fff; color:#16282c; font:800 12.5px/18px system-ui, sans-serif; white-space:nowrap;}
  .bot-map-pin .bp-tail{display:block; width:0; height:0; margin-top:-2px; border-left:9px solid transparent; border-right:9px solid transparent; border-top:16px solid #e5484d;}
  .bot-map-pin .bp-dot{display:block; width:11px; height:11px; margin-top:-3px; border-radius:50%; background:#e5484d; border:2.5px solid #fff; box-sizing:border-box;}
  .bot-map-pin.compact .bp-label{padding:0 6px; border-width:2px; font-size:12px; line-height:16px;}
  .bot-map-pin.compact .bp-tail{border-left-width:5px; border-right-width:5px; border-top-width:9px;}
  .bot-map-pin.compact .bp-dot{width:8px; height:8px; border-width:2px;}
  .bot-vote{ border:1px solid var(--line); background:var(--surface); font-size:13px; padding:3px 9px; border-radius:999px; cursor:pointer; }
  .bot-vote[aria-pressed="true"]{ border-color:var(--accent); background:var(--accent-soft); }
  .bot-ai{ font-size:11px; color:var(--ink-soft); }
  .bot-fab{ position:fixed; right:16px; bottom:calc(18px + env(safe-area-inset-bottom)); z-index:25; display:flex; align-items:center; gap:6px; padding:12px 16px; border:none; border-radius:999px; background:var(--accent); color:var(--accent-ink); font:inherit; font-size:15px; font-weight:700; box-shadow:0 6px 20px rgba(0,0,0,.22); cursor:pointer; }
  .bot-fab[hidden], .bot-panel[hidden]{ display:none; }
  .bot-panel{ position:fixed; right:16px; bottom:calc(16px + env(safe-area-inset-bottom)); z-index:29; display:flex; flex-direction:column; width:min(400px, calc(100vw - 32px)); height:min(560px, calc(100dvh - 90px)); border:1px solid var(--line); border-radius:18px; background:var(--surface); box-shadow:0 12px 40px rgba(0,0,0,.25); overflow:hidden; }
  .bot-head{ display:flex; align-items:center; justify-content:space-between; padding:12px 14px; border-bottom:1px solid var(--line); font-size:15px; }
  .bot-beta{ margin-left:4px; padding:1px 6px; border-radius:6px; background:var(--accent-soft); color:var(--accent); font-size:11px; }
  .bot-close{ border:none; background:none; color:var(--ink-soft); font-size:18px; cursor:pointer; padding:2px 6px; }
  .bot-log{ flex:1; overflow-y:auto; padding:12px; display:flex; flex-direction:column; gap:8px; }
  .bot-msg{ max-width:88%; padding:9px 12px; border-radius:14px; font-size:14px; line-height:1.5; }
  .bot-msg.user{ align-self:flex-end; background:var(--accent); color:var(--accent-ink); white-space:pre-line; overflow-wrap:anywhere; }
  .bot-msg.bot{ align-self:flex-start; background:var(--surface-2); color:var(--ink); }
  .bot-form{ display:flex; gap:6px; padding:10px 12px 4px; border-top:1px solid var(--line); }
  .bot-form input{ flex:1; min-width:0; padding:10px 12px; border-radius:12px; border:1px solid var(--line); background:var(--surface); color:var(--ink); font:inherit; font-size:16px; }
  .bot-form button{ flex:none; border:none; border-radius:12px; padding:0 14px; background:var(--accent); color:var(--accent-ink); font:inherit; font-weight:700; font-size:14px; cursor:pointer; }
  .bot-form button:disabled{ opacity:.6; cursor:default; }
  .bot-note{ margin:0; padding:2px 12px 10px; font-size:11px; line-height:1.4; color:var(--ink-soft); }
  /* 건물 이용 안내 (요일별로 어떻게 쓰이는지) */
  /* 장소 사진(흡연구역 등): 평면도처럼 버튼을 누르면 크게 열림 (카드는 작게 유지) */
  /* 카카오맵 길찾기(도착 = 이 건물): 바깥 길은 카카오맵, 건물 안은 입구 사진·평면도로 */
  .kakao-route{ display:inline-block; margin:8px 6px 2px 0; border:1px solid var(--accent); background:var(--accent); color:var(--accent-ink); font-size:11.5px; font-weight:600; padding:4px 11px; border-radius:999px; text-decoration:none; }
  .place-photo{ margin:8px 0 2px; border:1px solid var(--line); background:var(--surface); color:var(--accent); font-family:inherit; font-size:11.5px; font-weight:600; padding:4px 11px; border-radius:999px; cursor:pointer; }
  .photo-report-btn{ margin:8px 0 2px; border:1px dashed var(--line); background:transparent; color:var(--ink-soft); font-family:inherit; font-size:11.5px; font-weight:600; padding:4px 11px; border-radius:999px; cursor:pointer; }
  .pr-preview{ display:block; width:100%; max-height:240px; object-fit:contain; border-radius:8px; background:var(--surface-2); }
  .pr-preview[hidden]{ display:none; }
  .pr-pick{ position:relative; display:flex; align-items:center; justify-content:center; gap:6px; min-height:120px; border:1.5px dashed var(--line); border-radius:10px; color:var(--ink-soft); font-size:12.5px; cursor:pointer; background:var(--surface-2); }
  .pr-pick input{ position:absolute; width:1px; height:1px; opacity:0; }
  .pr-agree{ display:flex; gap:8px; align-items:flex-start; font-size:11.5px; color:var(--ink-soft); line-height:1.5; }
  .uses{
    margin:8px 0 4px;
    padding:9px 11px;
    border-radius:10px;
    background:var(--surface-2);
  }
  .uses-title{ margin:0 0 5px; font-size:11px; font-weight:700; color:var(--ink-soft); }
  .use-row{ margin:3px 0 0; font-size:12.5px; display:flex; gap:8px; align-items:baseline; }
  .use-when{
    flex:none; min-width:68px;
    font-size:11px; font-weight:700; color:var(--accent);
  }
  .event-flag{
    display:inline-flex;
    align-items:center;
    gap:4px;
    margin:6px 0 2px;
    padding:3px 9px;
    border-radius:999px;
    background:var(--accent-soft);
    color:var(--accent);
    font-size:11px;
    font-weight:700;
  }
  .tags{
    display:flex;
    flex-wrap:wrap;
    gap:5px;
    margin-top:8px;
  }
  .floors{
    display:flex;
    flex-direction:column;
    gap:8px;
    margin-top:8px;
  }
  .floor-row{
    display:flex;
    gap:9px;
  }
  .floor-level{
    flex:none;
    width:34px;
    padding-top:2px;
    font-family:"IBM Plex Mono", monospace;
    font-size:10.5px;
    font-weight:600;
    color:var(--ink-soft);
  }
  .floor-row .tags{margin-top:0;}
  /* 검색 결과에서 눌러 들어온 층 — 어느 층인지 바로 보이게 */
  .floor-row.focus{background:var(--accent-soft); border-radius:9px; padding:6px 8px; margin:0 -8px;}
  .floor-row.focus .floor-level{color:var(--accent);}
  .tag.focus{background:var(--accent); color:var(--accent-ink); font-weight:700;}
  .plan-btn.focus{background:var(--accent); border-color:var(--accent); color:var(--accent-ink);}
  .tag{
    font-size:11.5px;
    color:var(--ink-soft);
    background:var(--surface-2);
    padding:3px 8px;
    border-radius:7px;
  }
  .route-btn{
    align-self:flex-start;
    margin-top:6px;
    border:none;
    background:var(--accent);
    color:var(--accent-ink);
    font-family:inherit;
    font-size:12px;
    font-weight:700;
    padding:6px 13px;
    border-radius:999px;
    cursor:pointer;
  }
  .plan-btn{
    flex:none;
    align-self:flex-start;
    border:1px solid var(--line);
    background:var(--surface);
    color:var(--accent);
    font-family:inherit;
    font-size:10.5px;
    font-weight:600;
    padding:3px 9px;
    border-radius:999px;
    cursor:pointer;
  }
  .fav-btn{
    margin:8px 6px 2px 0;
    border:1px solid var(--line);
    background:var(--surface);
    color:var(--ink-soft);
    font-family:inherit;
    font-size:11.5px;
    font-weight:700;
    padding:4px 11px;
    border-radius:999px;
    cursor:pointer;
  }
  .fav-btn[aria-pressed="true"]{ color:#b7791f; border-color:#e9c46a; background:#fff8e6; }
  /* 첫 화면 ⭐ 즐겨찾기 · 🕘 최근 본 곳 */
  .saved{ display:flex; flex-direction:column; gap:6px; margin:2px 0 8px; }
  .saved[hidden]{ display:none; }
  .saved-title{ margin:0; font-size:12px; font-weight:700; color:var(--ink-soft); display:flex; align-items:center; gap:6px; }
  .saved-clear{ border:none; background:none; padding:0; font:inherit; font-size:11px; font-weight:500; color:var(--ink-soft); text-decoration:underline; cursor:pointer; }
  .saved-chips{ margin:0; }
  .share-btn{
    margin:8px 0 2px;
    border:1px solid var(--line);
    background:var(--surface);
    color:var(--accent);
    font-family:inherit;
    font-size:11.5px;
    font-weight:700;
    padding:4px 11px;
    border-radius:999px;
    cursor:pointer;
  }
  .plan-lightbox{
    position:fixed;
    inset:0;
    z-index:50;
    background:rgba(10,18,20,.9);
    display:none;
    align-items:center;
    justify-content:center;
    padding:24px;
  }
  .plan-lightbox.open{display:flex;}
  .plan-lightbox img{
    max-width:100%;
    max-height:100%;
    border-radius:10px;
    background:#fff;
  }
  .lb-nav{ position:absolute; top:50%; transform:translateY(-50%); width:44px; height:44px; border-radius:50%; border:none; background:rgba(255,255,255,.18); color:#fff; font-size:26px; line-height:1; cursor:pointer; }
  .lb-prev{ left:12px; } .lb-next{ right:12px; }
  .lb-nav[hidden], .lb-caption[hidden]{ display:none; }
  .lb-caption{ position:absolute; left:0; right:0; bottom:18px; margin:0; text-align:center; color:#fff; font-size:13px; text-shadow:0 1px 3px rgba(0,0,0,.6); }
  .plan-lightbox-close{
    position:absolute;
    top:16px;
    right:16px;
    width:36px;
    height:36px;
    border-radius:50%;
    border:none;
    background:rgba(255,255,255,.15);
    color:#fff;
    font-size:18px;
    cursor:pointer;
  }
  .report-form{
    margin-top:8px;
    display:flex;
    flex-direction:column;
    gap:6px;
  }
  .report-input{
    width:100%;
    min-height:56px;
    padding:8px 10px;
    border-radius:8px;
    border:1px solid var(--line);
    background:var(--surface-2);
    color:var(--ink);
    font-family:inherit;
    font-size:12.5px;
    resize:vertical;
  }
  .fb-submit{
    align-self:flex-end;
    border:none;
    background:var(--accent);
    color:var(--accent-ink);
    font-family:inherit;
    font-size:11.5px;
    font-weight:700;
    padding:6px 14px;
    border-radius:999px;
    cursor:pointer;
  }
  .empty{
    padding:40px 20px;
    text-align:center;
    color:var(--ink-soft);
    font-size:13.5px;
  }

  footer{
    margin-top:26px;
    padding:18px 20px 0;
    border-top:1px solid var(--line);
  }
  footer .row{
    display:flex;
    justify-content:space-between;
    gap:10px;
    font-size:11.5px;
    color:var(--ink-soft);
    padding-top:16px;
  }
  footer .contact-mail{color:inherit; text-decoration:none;}
  footer .contact-mail:hover{text-decoration:underline;}
  footer .credit{
    margin-top:10px;
    font-size:11px;
    color:var(--ink-soft);
    opacity:.75;
  }

  .toast{
    position:fixed;
    left:50%;
    bottom:22px;
    transform:translate(-50%,10px);
    background:var(--ink);
    color:var(--bg);
    padding:10px 16px;
    border-radius:10px;
    font-size:12.5px;
    font-weight:500;
    opacity:0;
    pointer-events:none;
    transition:opacity .2s ease, transform .2s ease;
    z-index:20;
  }
  .toast.show{opacity:1;transform:translate(-50%,0);}

  .edit-panel{
    position:fixed;
    left:12px;
    right:12px;
    bottom:12px;
    max-width:480px;
    margin:0 auto;
    z-index:40;
    background:var(--surface);
    border:1px solid var(--line);
    border-radius:14px;
    box-shadow:var(--shadow);
    padding:12px;
  }
  .edit-panel p{margin:0 0 8px; font-size:12.5px; font-weight:600;}
  .edit-panel textarea{
    width:100%;
    height:110px;
    font-family:"IBM Plex Mono", monospace;
    font-size:11px;
    padding:8px;
    border-radius:8px;
    border:1px solid var(--line);
    background:var(--surface-2);
    color:var(--ink);
    resize:vertical;
    box-sizing:border-box;
  }
  .edit-panel button{
    margin-top:8px;
    padding:8px 14px;
    border-radius:8px;
    border:none;
    background:var(--accent);
    color:var(--accent-ink);
    font-family:inherit;
    font-weight:600;
    font-size:12px;
    cursor:pointer;
  }

  /* 길찾기 경로망 그리기 도구 (?route-edit) */
  body.route-edit .mapview{aspect-ratio:auto; height:62vh;}
  .route-edit-panel{
    margin:10px 20px 0;
    background:var(--surface);
    border:1px solid var(--line);
    border-radius:14px;
    box-shadow:var(--shadow);
    padding:12px;
  }
  .route-edit-panel p{margin:0 0 8px; font-size:12.5px;}
  .route-edit-title{font-weight:700;}
  .route-edit-help{color:var(--ink-soft); line-height:1.5;}
  .route-edit-count{font-weight:600;}
  .route-edit-panel .modes, .route-edit-panel .actions-row{display:flex; flex-wrap:wrap; gap:6px; margin-bottom:8px;}
  .route-edit-panel button{
    padding:7px 12px;
    border-radius:999px;
    border:1px solid var(--line);
    background:var(--surface);
    color:var(--ink);
    font-family:inherit;
    font-size:12px;
    font-weight:600;
    cursor:pointer;
  }
  .route-edit-panel .modes button[aria-pressed="true"]{background:var(--accent); border-color:var(--accent); color:var(--accent-ink);}
  .route-edit-panel select{width:100%; margin-bottom:8px; padding:7px; border-radius:8px; border:1px solid var(--line); font-family:inherit; font-size:13px;}
  .route-edit-panel textarea{
    width:100%;
    height:64px;
    font-family:"IBM Plex Mono", monospace;
    font-size:10.5px;
    padding:6px;
    border-radius:8px;
    border:1px solid var(--line);
    background:var(--surface-2);
    color:var(--ink);
    resize:vertical;
  }
  @media (min-width:840px){ .route-edit-panel{margin:10px 0 0;} }
  .rn-dot{
    width:22px; height:22px;
    border-radius:50%;
    background:#2f6fed;
    border:2px solid #fff;
    color:#fff;
    font:700 9px/18px system-ui, sans-serif;
    text-align:center;
    box-shadow:0 1px 3px rgba(0,0,0,.4);
    cursor:pointer;
  }
  /* 경사·계단 표시 (길 그리기 도구·길찾기 경로 공통): 선 가운데 작은 표 — ▲는 올라가는 쪽을 가리킴 */
  .rn-slope{display:flex; align-items:center; gap:1px; padding:1px 5px; border-radius:999px; background:#fff; border:2px solid #f08c00; color:#c25e00; font:700 11px/16px system-ui, sans-serif; box-shadow:0 1px 3px rgba(0,0,0,.35); cursor:pointer; white-space:nowrap;}
  .rn-slope.stairs{border-color:#e5484d; color:#c0353a;}
  .rn-slope b{display:inline-block; font-size:10px;}
  .route-stairs-opt{display:flex; align-items:center; gap:4px; font-size:13px; color:var(--ink-soft); cursor:pointer;}
  .route-bar{display:flex; flex-wrap:wrap; align-items:center; gap:6px; margin:4px 20px 0;}
  .route-bar .route-btn{margin-top:0;}
  .route-dest{
    /* 좁은 폰에선 옆 버튼에 밀려 "∨"만 남던 것 — 최소 9em은 지키고, 모자라면 버튼이 다음 줄로 (2026-11-02 공개 때) */
    flex:1 1 9em; min-width:9em; max-width:220px;
    font-family:inherit; font-size:13px;
    padding:6px 10px; border-radius:999px;
    border:1px solid var(--line); background:var(--surface); color:var(--ink);
  }
  @media (min-width:840px){ .route-bar{margin:4px 0 0;} }
  .route-beta{width:100%; margin:0; font-size:11.5px; color:var(--ink-soft); word-break:keep-all;}
  .route-report{border:none; background:none; padding:0; font:inherit; color:var(--accent); text-decoration:underline; cursor:pointer;}
  /* 걸으며 길 기록하기 (?route-record) — 걸으면서 엄지로 누르기 쉽게 큼직하게 */
  .rec-bar{gap:8px;}
  .rec-bar .rec-toggle{font-size:14px; padding:9px 16px;}
  .rec-bar .rec-toggle.on{background:#e5484d; color:#fff;}
  .rec-stat{font-size:12.5px; color:var(--ink-soft); font-variant-numeric:tabular-nums;}
  .rec-tags, .rec-tools{display:flex; flex-wrap:wrap; gap:6px; width:100%;}
  .rec-tag, .rec-tools button{font:inherit; font-size:13px; font-weight:700; padding:9px 12px; border-radius:999px; border:1px solid var(--line); background:var(--surface); color:var(--ink); cursor:pointer;}
  .rec-tag[aria-pressed="true"]{background:var(--accent); border-color:var(--accent); color:var(--accent-ink);}
  .rec-out{width:100%; height:80px; font:11px/1.4 monospace;}
  /* 진행 상황 지도 (?route-progress) */
  .progress-bar{flex-direction:column; align-items:stretch; gap:6px;}
  .progress-sum{margin:0; font-size:13px; color:var(--ink);}
  .progress-track{height:8px; border-radius:999px; background:var(--line); overflow:hidden;}
  .progress-track span{display:block; height:100%; background:#16a34a;}
  .progress-legend{margin:0; font-size:11.5px; color:var(--ink-soft); display:flex; flex-wrap:wrap; align-items:center; gap:4px 10px;}
  .progress-legend a{color:var(--accent);}
  .lg{display:inline-block; width:18px; height:4px; border-radius:2px; margin-right:-6px; vertical-align:middle;}
  .lg.done{background:#16a34a; height:6px;} .lg.todo{background:#9ca3af;} .lg.ug{background:repeating-linear-gradient(90deg,#7c3aed 0 4px,transparent 4px 7px);}
  .rn-dot.ug{background:#7c3aed; border-radius:5px;}
  .rn-dot.off{background:#f08c00;}
  .rn-dot.sel{background:#e5484d;}
  .rn-dot.dim, .rn-ent.dim{opacity:.35;}
  .route-edit-panel .layer-label{font-size:12px; font-weight:700; color:var(--ink-soft); align-self:center;}
  .route-edit-warn{color:#c2410c; font-weight:600; line-height:1.5;}
  .rn-ent{display:flex; flex-direction:column; align-items:center; cursor:pointer;}
  .rn-ent span{background:#a97423; color:#fff; font-size:11px; font-weight:700; padding:3px 7px; border-radius:6px; white-space:nowrap; box-shadow:0 1px 3px rgba(0,0,0,.4);}
  .rn-ent i{width:10px; height:10px; margin-top:2px; border-radius:50%; background:#a97423; border:2px solid #fff;}

  @media (prefers-reduced-motion:reduce){
    .toast{transition:none;}
  }
