/* ==========================================================================
   zipda.css — 집다오 디자인 시스템 (시안 2 · 비서형 대시보드)
   단일 소스: docs/redesign/DESIGN_TOKENS.md
   기준 목업: docs/redesign/mockups/mockup-2.html

   ※ 목업의 무접두사 클래스(.widget/.list/.tool 등)는 기존 페이지 CSS와
     충돌할 수 있어 전부 `zd-` 접두사로 옮겼다. 신규/리디자인 마크업은
     반드시 zd- 클래스를 쓴다.
   ※ 색·라운드·그림자 값은 레이아웃 inline tailwind.config의 zd 팔레트와
     항상 동일해야 한다(불일치 = 버그).
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. 토큰
   -------------------------------------------------------------------------- */
/* 톤 V2(기관/신뢰형) — 변수명은 그대로 두고 값만 교체한다.
   26개 파일 87곳의 참조를 건드리지 않기 위한 의도된 전략이며,
   그래서 `--zd-violet-*`는 이름만 violet이고 실제 값은 navy 계열이다. */
:root{
  /* 표면 */
  --zd-bg:#F7F8FA;      /* paper */
  --zd-card:#FFFFFF;
  --zd-line:#DFE3E8;

  /* 텍스트 */
  --zd-ink:#16202F;
  --zd-sub:#6B7684;     /* muted */
  --zd-ink-2:#3A4557;   /* 아이콘 버튼·푸터 링크 등 중간 톤 (ink~muted 사이) */
  --zd-ink-3:#6B7684;   /* 비활성 내비 = muted */

  /* 브랜드 — navy 단일 색의 농담으로만 위계를 만든다 */
  --zd-violet:#2E4370;       /* navy 옅은 단계 */
  --zd-violet-deep:#1B2A4A;  /* navy 기준색: CTA·활성 상태 */
  --zd-violet-soft:#EEF1F6;  /* navy-wash */
  --zd-grad:#1B2A4A;         /* 그라디언트 폐기 → 단색 navy */

  /* 상태 — 유지하되 사용처를 최소화(경고가 정말 필요한 곳만) */
  --zd-mint:#0F7B5A;    /* 긍정: 경쟁률 상승·접수중 */
  --zd-amber:#B87503;   /* 주의: 마감 임박 */
  --zd-rose:#C4353F;    /* 위험: D-day 임박·알림 dot */
  --zd-rose-soft:#FBEDEE;

  /* 형태 — 라운드 단일값, 그림자 폐기(구분은 1px 선으로) */
  --zd-r:4px;
  --zd-r-md:4px;
  --zd-r-sm:4px;
  --zd-shadow:none;

  /* 레이아웃 */
  --zd-container:1120px;
  --zd-tabbar-h:80px;   /* 탭바 실높이(패딩+아이콘+safe-area 제외분) */
  --zd-ad-h:51px;       /* 고정 광고 배너 높이(50px + 상단 보더) */
}

/* --------------------------------------------------------------------------
   2. 베이스
   -------------------------------------------------------------------------- */
body.zd{
  font-family:'Pretendard Variable',Pretendard,-apple-system,BlinkMacSystemFont,system-ui,sans-serif;
  background:var(--zd-bg);
  color:var(--zd-ink);
  line-height:1.5;
  letter-spacing:-.01em;
  /* 모바일은 하단 고정물(탭바 + 광고 배너)에 본문이 가리지 않도록 여백 확보 */
  padding-bottom:calc(var(--zd-tabbar-h) + var(--zd-ad-h));
}
.zd-container{max-width:var(--zd-container);margin:0 auto;padding:0 16px}
/* 숫자(경쟁률·가격·D-day)는 자리폭 고정으로 정렬 흔들림 방지 */
.zd-num{font-variant-numeric:tabular-nums}

/* hidden 속성 보장 — .zd-btn(inline-flex) 등 display를 지정한 클래스 규칙은
   UA 기본값 [hidden]{display:none}보다 우선순위가 높아 숨김이 풀린다.
   토글에 hidden을 쓰는 페이지(P5 폼 3종 등)를 위해 명시적으로 눌러 둔다. */
[hidden]{display:none!important}

/* --------------------------------------------------------------------------
   3. 위젯 (벤토 그리드의 기본 단위)
   -------------------------------------------------------------------------- */
/* 1열이어도 minmax(0,1fr)이어야 한다 — 1fr의 최소폭은 min-content라
   긴 단지명이 든 카드가 열을 화면 밖까지 밀어낸다(모바일에서 헤더·히어로만
   좁아 보이던 원인). */
.zd-bento{display:grid;grid-template-columns:minmax(0,1fr);gap:14px;padding:14px 0 0}
/* 그림자를 없앴으므로 구분은 1px 선이 담당한다(카드 = 떠 있는 판이 아니라 지면 위 구획) */
.zd-card{background:var(--zd-card);border-radius:var(--zd-r);border:1px solid var(--zd-line);box-shadow:var(--zd-shadow);padding:20px}

.zd-whead{display:flex;align-items:center;gap:8px;margin-bottom:14px}
.zd-whead h2{font-size:15px;font-weight:800}
.zd-whead .zd-more{margin-left:auto;font-size:12.5px;font-weight:700;color:var(--zd-violet-deep)}
.zd-whead .zd-cap{font-size:12px;color:var(--zd-sub)}

/* --------------------------------------------------------------------------
   4. 공용 컴포넌트
   -------------------------------------------------------------------------- */
/* 4.1 버튼 */
.zd-btn{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  font-size:14px;font-weight:600;padding:12px 18px;border-radius:var(--zd-r);
  background:var(--zd-violet-deep);color:#fff;border:0;cursor:pointer;
  transition:background .15s ease;
}
/* brightness는 네이비를 흐릿하게 만든다 → 더 어두운 ink로 눌러 대비를 유지 */
.zd-btn:hover{background:var(--zd-ink)}
.zd-btn--soft{background:var(--zd-violet-soft);color:var(--zd-violet-deep)}
.zd-btn--ghost{background:transparent;color:var(--zd-ink-2);border:1px solid var(--zd-line)}
.zd-btn--block{width:100%}

/* 4.2 뱃지·pill */
/* 기본 뱃지 = 채운 알약이 아니라 '선' 칩. 배지가 사방에 깔려도 시끄럽지 않게.
   상태색은 정말 경고가 필요한 곳(--hot 등)에만 남긴다. */
.zd-badge{
  display:inline-block;font-size:11px;font-weight:700;padding:3px 7px;
  border-radius:var(--zd-r);background:transparent;color:var(--zd-sub);
  border:1px solid var(--zd-line);white-space:nowrap;font-variant-numeric:tabular-nums;
}
.zd-badge--hot{background:var(--zd-rose-soft);color:var(--zd-rose);border-color:var(--zd-rose-soft)}
.zd-badge--open{background:#E8F3EF;color:var(--zd-mint);border-color:#E8F3EF}   /* 접수중 */
.zd-badge--soon{background:#FBF2E3;color:var(--zd-amber);border-color:#FBF2E3}  /* 마감임박 */
.zd-badge--past{background:var(--zd-bg);color:var(--zd-sub)}                    /* 기한 지남(D+) */

/* 4.3 핀 아이콘 (브랜드 모티프 — 빈 상태·마커·리스트 썸네일에 반복 사용) */
.zd-pin{display:inline-block;width:22px;height:26px;flex:none}
.zd-pin--lg{width:26px;height:31px}

/* 4.4 아이콘 박스 / 썸네일 */
.zd-thumb{
  flex:none;width:44px;height:44px;border-radius:var(--zd-r-sm);
  display:grid;place-items:center;background:var(--zd-violet-soft);
}
.zd-iconbtn{
  width:34px;height:34px;display:grid;place-items:center;border-radius:var(--zd-r-sm);
  background:var(--zd-card);color:var(--zd-sub);border:1px solid var(--zd-line);position:relative;
}
.zd-iconbtn:hover{border-color:var(--zd-sub);color:var(--zd-ink)}
.zd-iconbtn .zd-dot{
  position:absolute;top:9px;right:9px;width:7px;height:7px;border-radius:99px;
  background:var(--zd-rose);border:1.5px solid #fff;
}
.zd-avatar{
  width:38px;height:38px;border-radius:var(--zd-r-sm);background:var(--zd-grad);
  color:#fff;font-weight:800;font-size:14px;display:grid;place-items:center;
}

/* 4.5 리스트 행 (목록 위젯 공통) */
.zd-list .zd-item{display:flex;align-items:center;gap:14px;padding:13px 0;border-bottom:1px solid var(--zd-line)}
.zd-list .zd-item:last-child{border-bottom:0}
/* 순번 — 반복 핀 아이콘을 대체한다(장식 → 정보) */
.zd-list .zd-rank{
  flex:none;width:22px;font-size:12px;font-weight:700;color:var(--zd-sub);
  font-variant-numeric:tabular-nums;text-align:center;
}
.zd-list .zd-info{flex:1;min-width:0}
/* 긴 단지명은 잘라내되 컨테이너 높이는 고정하지 않는다 */
.zd-list .zd-info b{font-size:13.5px;font-weight:600;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;letter-spacing:-.01em}
.zd-list .zd-info small{color:var(--zd-sub);font-size:11.5px;display:block;margin-top:3px}
/* hover 강조는 배경색이 아니라 밑줄 — 색 사용을 줄인다 */
.zd-list .zd-item:hover .zd-info b{color:var(--zd-violet-deep);text-decoration:underline;text-underline-offset:2px}
.zd-list .zd-fig{text-align:right;white-space:nowrap;flex:none}
.zd-list .zd-fig b{font-size:14px;font-weight:700;display:block}
.zd-list .zd-fig small{font-size:10.5px;color:var(--zd-sub)}
.zd-list .zd-fig .zd-up{color:var(--zd-mint)}

/* --------------------------------------------------------------------------
   4.6 페이지 공통 (목록/상세 — P4~P6 전 페이지 재사용)
   -------------------------------------------------------------------------- */
/* 페이지 헤드 */
.zd-page{padding:18px 0 8px}
.zd-page h1{font-size:20px;font-weight:800}
.zd-page .zd-lead{font-size:12.5px;color:var(--zd-sub);margin-top:4px}

/* 필터 바 */
.zd-filters{display:flex;gap:6px;overflow-x:auto;padding-bottom:4px;scrollbar-width:none;margin-bottom:12px}
.zd-filters::-webkit-scrollbar{display:none}
/* 필터 칩도 알약을 버린다 — 사방이 둥글면 그게 '템플릿' 인상을 만든다 */
.zd-chip{
  flex:none;font-size:12.5px;font-weight:600;padding:8px 14px;border-radius:var(--zd-r);
  background:var(--zd-card);color:var(--zd-ink-3);border:1px solid var(--zd-line);
  white-space:nowrap;cursor:pointer;
}
.zd-chip:hover{border-color:var(--zd-violet)}
.zd-chip.active{background:var(--zd-violet-deep);color:#fff;border-color:var(--zd-violet-deep)}

/* 입력 필드 */
.zd-field{
  width:100%;font-size:13.5px;padding:11px 14px;border-radius:var(--zd-r-sm);
  background:var(--zd-card);color:var(--zd-ink);border:1px solid var(--zd-line);
}
.zd-field:focus{outline:none;border-color:var(--zd-violet);box-shadow:0 0 0 3px rgb(27 42 74/.16)}

/* 폼 한 줄 (레이블 + 입력 + 도움말) — P5·P6 폼 페이지 6종이 각자 복사해 두었던 것을
   P7-2에서 여기로 통합했다. 페이지별 미세 차이(여백·행간)는 표준값으로 수렴시켰다. */
.zd-formrow{margin-bottom:16px}
.zd-formrow:last-child{margin-bottom:0}
.zd-formrow > label{display:block;font-size:13px;font-weight:700;margin-bottom:7px}
.zd-formrow .zd-hint{font-size:11.5px;color:var(--zd-sub);margin-top:6px;line-height:1.55}
.zd-formrow .zd-hint b{color:var(--zd-ink-2);font-weight:700}
.zd-formrow .zd-req{color:var(--zd-rose)}                                  /* 필수 표시 * */
.zd-formrow .zd-opt{color:var(--zd-sub);font-weight:500;font-size:11.5px}  /* (선택) 표시 */
.zd-formrow .zd-static{font-size:14px;font-weight:700}                     /* 읽기 전용 값 */

/* 폼 안내 박스 (톤별) */
.zd-info{border-radius:var(--zd-r-sm);padding:13px 15px;font-size:12px;line-height:1.65}
.zd-info b{font-weight:800}
.zd-info .zd-info-t{display:block;font-weight:800;margin-bottom:5px}
.zd-info ul{list-style:disc;padding-left:16px;margin-top:5px}
.zd-info--violet{background:var(--zd-violet-soft);color:#4A3FB0}
.zd-info--amber{background:#FBF2E3;color:#8A5802}

/* 폼 안쪽 보조 설명 박스 */
.zd-subbox{background:var(--zd-bg);border-radius:var(--zd-r-sm);padding:11px 13px;margin-top:8px}
.zd-subbox p{font-size:11.5px;font-weight:700;color:var(--zd-ink-2);margin-bottom:4px}
.zd-subbox ul{list-style:disc;padding-left:15px;font-size:11.5px;color:var(--zd-sub);line-height:1.7}

/* 단위 접미(만원 등)가 붙는 입력 */
.zd-suffix{position:relative}
.zd-suffix .zd-field{padding-right:52px}
.zd-suffix span{position:absolute;right:14px;top:50%;transform:translateY(-50%);
                font-size:11.5px;color:var(--zd-sub);pointer-events:none}

/* 카드 그리드 (모바일 1열 → md 2열 → lg 3열) */
/* 1열도 minmax(0,1fr) — 1fr의 최소폭은 min-content라 긴 단지명이 든
   타일이 열을 화면 밖으로 밀어낸다(.zd-bento와 같은 함정) */
.zd-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:12px}

/* 목록 카드 */
.zd-tile{background:var(--zd-card);border-radius:var(--zd-r-md);border:1px solid var(--zd-line);box-shadow:var(--zd-shadow);padding:16px;display:block}
/* hover에 그림자를 되살리지 않는다 — 테두리를 진하게 해서 반응만 알린다 */
.zd-tile:hover{border-color:var(--zd-sub)}
.zd-tile h3{font-size:15px;font-weight:700;margin-top:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.zd-tile .zd-addr{font-size:12.5px;color:var(--zd-sub);margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.zd-tile .zd-meta{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px;padding-top:12px;
  border-top:1px solid var(--zd-line);font-size:11.5px;color:var(--zd-sub)}
.zd-tile .zd-meta b{color:var(--zd-ink);font-weight:700}

/* 자료형 표 (실거래가·경쟁률)
   모바일은 카드(.zd-cards), md 이상은 표(.zd-table)로 전환한다.
   6열 표는 모바일에서 가로 스크롤 없이 읽기 어렵다. */
.zd-table{display:none;width:100%;font-size:13.5px;border-collapse:collapse}
.zd-table th{font-size:11.5px;color:var(--zd-sub);font-weight:700;padding:8px 6px;text-align:left;white-space:nowrap}
.zd-table td{padding:11px 6px;border-top:1px solid var(--zd-line);white-space:nowrap}
.zd-table tr.cancelled td{color:var(--zd-sub);text-decoration:line-through}
.zd-table a{color:var(--zd-violet-deep);font-weight:600}
.zd-table a:hover{text-decoration:underline}

/* 페이지네이션 */
.zd-pager{display:flex;justify-content:center;gap:5px;margin-top:24px;flex-wrap:wrap}
.zd-pager button{
  min-width:36px;height:36px;padding:0 10px;border-radius:var(--zd-r);font-size:13px;font-weight:700;
  background:var(--zd-card);color:var(--zd-ink-2);border:1px solid var(--zd-line);cursor:pointer;
}
.zd-pager button:hover{border-color:var(--zd-violet)}
.zd-pager button.on{background:var(--zd-violet-deep);color:#fff;border-color:var(--zd-violet-deep)}

/* 상세 2컬럼 (lg 이상: 본문 + 사이드 요약) */
.zd-detail{display:grid;grid-template-columns:minmax(0,1fr);gap:16px;padding:16px 0 8px}

/* 게시글 본문 — 서버(HTMLPurifier)가 허용한 태그에만 스타일을 준다.
   허용 목록: p,br,strong,em,u,s,a,ul,ol,li,h1~h4,blockquote,pre,code,img,table */
.zd-post-body{font-size:14.5px;line-height:1.75;word-break:break-word}
.zd-post-body > * + *{margin-top:12px}
.zd-post-body h1,.zd-post-body h2,.zd-post-body h3,.zd-post-body h4{font-weight:800;line-height:1.4;margin-top:20px}
.zd-post-body h1{font-size:19px}.zd-post-body h2{font-size:17px}
.zd-post-body h3{font-size:15.5px}.zd-post-body h4{font-size:14.5px}
.zd-post-body a{color:var(--zd-violet-deep);font-weight:600;text-decoration:underline}
.zd-post-body ul,.zd-post-body ol{padding-left:20px}
.zd-post-body ul{list-style:disc}.zd-post-body ol{list-style:decimal}
.zd-post-body li+li{margin-top:4px}
.zd-post-body blockquote{border-left:3px solid var(--zd-violet);padding:2px 0 2px 14px;color:var(--zd-ink-2)}
.zd-post-body pre{background:var(--zd-bg);border-radius:var(--zd-r-sm);padding:14px;overflow-x:auto;font-size:13px}
.zd-post-body code{background:var(--zd-bg);border-radius:6px;padding:2px 5px;font-size:13px}
.zd-post-body pre code{background:none;padding:0}
.zd-post-body img{max-width:100%;height:auto;border-radius:var(--zd-r-sm)}
.zd-post-body table{width:100%;border-collapse:collapse;font-size:13.5px;display:block;overflow-x:auto}
.zd-post-body th,.zd-post-body td{border:1px solid var(--zd-line);padding:8px 10px;text-align:left}
.zd-post-body th{background:var(--zd-bg);font-weight:700}

/* --------------------------------------------------------------------------
   5. 내비게이션
   -------------------------------------------------------------------------- */
/* 반투명 blur은 '떠 있는' 인상을 만든다 → 불투명 흰 판 + 1px 선으로 지면에 붙인다 */
.zd-topbar{position:sticky;top:0;z-index:50;background:var(--zd-card);border-bottom:1px solid var(--zd-line)}
.zd-topbar-in{display:flex;align-items:center;height:60px;gap:14px}
.zd-topbar .zd-right{margin-left:auto;display:flex;align-items:center;gap:6px}
.zd-logo{display:flex;align-items:center;gap:6px;font-weight:800;font-size:20px}

/* 데스크톱 내비 — pill(알약) 폐기, 밑줄 방식(시안 4).
   nav 자체가 상단바 높이를 꽉 채워야 밑줄이 하단 경계선에 맞물린다. */
.zd-pillnav{display:none;gap:28px;margin-left:22px;align-self:stretch}
.zd-pillnav a{
  display:flex;align-items:center;font-size:14px;font-weight:600;color:var(--zd-sub);
  border-bottom:2px solid transparent;margin-bottom:-1px;  /* 상단바 border와 겹쳐 1px 밀림 방지 */
}
.zd-pillnav a:hover{color:var(--zd-ink)}
.zd-pillnav a.on{color:var(--zd-ink);font-weight:700;border-bottom-color:var(--zd-violet-deep)}

/* 모바일 하단 탭바 — 추후 Flutter 앱 BottomNavigationBar 이식 기준 */
.zd-tabbar{
  position:fixed;left:0;right:0;bottom:0;z-index:60;
  background:rgb(255 255 255/.94);backdrop-filter:blur(14px);
  border-top:1px solid var(--zd-line);
  display:grid;grid-template-columns:repeat(6,1fr);
  padding:6px 4px calc(6px + env(safe-area-inset-bottom));
}
.zd-tab{display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10.5px;font-weight:600;color:var(--zd-sub);padding:4px 0}
.zd-tab.active{color:var(--zd-violet-deep)}
.zd-tab svg{width:22px;height:22px}

/* --------------------------------------------------------------------------
   5.5 광고 배너
   모바일은 탭바 바로 위 고정, 데스크톱은 흐름 배치(6절에서 해제).
   -------------------------------------------------------------------------- */
.zd-ad{
  position:fixed;left:0;right:0;bottom:var(--zd-tabbar-h);z-index:40;
  background:var(--zd-card);border-top:1px solid var(--zd-line);
}

/* --------------------------------------------------------------------------
   6. 반응형 (모바일 퍼스트 — md 768 / lg 1024 / xl 1280)
   -------------------------------------------------------------------------- */
@media (min-width:768px){
  body.zd{padding-bottom:0}          /* 탭바·고정광고가 사라지므로 여백 제거 */
  .zd-tabbar{display:none}
  .zd-pillnav{display:flex}
  .zd-topbar-in{height:72px}
  /* minmax(0,1fr) 필수 — 1fr의 최소폭은 auto(=min-content)라
     긴 단지명이 든 카드가 제 몫보다 넓어지고 다른 열이 찌그러진다.
     (실측: 580/55/592px로 갈라지며 span 2 카드가 컨테이너를 69px 넘쳤음) */
  .zd-bento{grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;padding-top:8px}
  /* 광고는 화면 고정 해제 → 콘텐츠 흐름 안으로 */
  .zd-ad{position:static;border-top:0;background:transparent;margin:24px 0 8px}

  .zd-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
  .zd-page{padding:26px 0 10px}
  .zd-page h1{font-size:24px}
  /* 자료형 표: 모바일 카드 → 데스크톱 표로 전환 */
  .zd-table{display:table}
  .zd-cards{display:none}
}

@media (min-width:1024px){
  .zd-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}
  /* 상세: 본문 + 사이드 요약(sticky) */
  .zd-detail{grid-template-columns:minmax(0,1fr) 320px;gap:20px;align-items:start}
  .zd-detail .zd-side{position:sticky;top:88px}
}

@media (prefers-reduced-motion:reduce){
  *{transition:none!important;animation:none!important}
}
