/* Breakpoints: >=1024px desktop (default in main.css), 768-1024px tablet, <768px mobile */

/* ---------- Tablet (<=1024px) ---------- */
@media (max-width: 1024px) {
  .hub-grid {
    grid-template-columns: repeat(2, 1fr);
  }
  .card-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  /* 이메일 컬럼 우선순위 최하 — 좁아지면 먼저 줄어들고(1024px), 더 좁아지면
     아예 숨김(768px, 아래). 가입/서비스명/로그인ID/비밀번호는 이 브레이크
     포인트로는 안 줄임(list-table-colgroup.ejs 고정 폭 + .data-table
     min-width로 보장) — 단, 이 4개 컬럼 자체의 폭 값은 실사용 피드백에 따라
     계속 재조정될 수 있음(현재 값은 항상 main.css의 .col-subject 등 참고).
     .col-email의 폭이 바뀌므로 .data-table의 min-width도 같이 맞춰야 함
     (0[선택, 기본]+76[가입]+200+250+165+130 = 821px) — 안 맞추면 이 구간에서
     다시 폭 계산이 애매해짐(auto 컬럼이 없어도, min-width 자체가 실제
     컬럼 합과 안 맞으면 브라우저가 강제로 늘리려 할 수 있음). */
  .col-email {
    width: 130px;
  }
  /* Scoped to account only — see main.css's comment on why .data-table's
     min-width can never be shared across categories. */
  [data-category="account"] .data-table {
    min-width: 821px;
  }

  /* 주소정보 — 2026-07-27 3차 수정으로 컬럼폭을 px 고정값에서 %로 전환한
     뒤(main.css의 .col-address-* 참고)부터는 태블릿 구간 전용 오버라이드가
     필요 없어짐: %는 화면이 좁아져도 항상 합계 100%를 유지하며 함께
     비례해서 줄어들어, "우편번호 최우선 축소" 같은 순서를 별도로 지정하지
     않아도 화면 오른쪽에 빈 여백이 생기는 문제(3차 요구사항 1번) 자체가
     구조적으로 발생하지 않음. 예전에는 우편번호를 0으로 접고 주소만 px로
     줄이는 방식이었는데, 이걸 %와 섞어 쓰면 합계가 100%를 벗어나 다시 여백/
     계산 혼란이 재발할 수 있어(이 프로젝트가 반복 겪은 "명시값 섞어쓰기"
     함정과 같은 계열) 완전히 제거함 — 768px 이하는 아래 모바일 블록에서
     완전히 다른 flex 카드형 레이아웃으로 전환되므로 이 구간과도 무관. */
}

/* ---------- Mobile (<=768px) ---------- */
@media (max-width: 768px) {
  .page {
    padding: 20px 14px 48px;
  }

  /* 하단 고정 바(계정칩+신규입력 버튼)가 화면 맨 아래까지 완전히 밀착되도록
     bottom padding을 0으로(2026-07-18) — 기존 24px 여백 동안 이 요소 자체엔
     배경이 없어(투명) body의 배경 이미지가 그 틈으로 비쳐 보였음. 홈 인디케이터/
     노치가 있는 기기에서 버튼이 그 영역에 가려지지 않도록 env(safe-area-
     inset-bottom)은 유지(head.ejs의 viewport-fit=cover와 함께 필요, 없는
     기기에서는 0으로 처리됨). PC는 이 미디어쿼리 밖이라 기존 24px 그대로 유지. */
  .list-shell__bottom {
    padding-bottom: env(safe-area-inset-bottom, 0px);
  }
  .list-shell__bottom:empty {
    padding-bottom: 0;
  }
}

/* PWA(standalone) 모드 전용 — 홈 화면에 설치된 상태에서 하단 계정칩 바가
   기기의 제스처 내비게이션 바에 가려 잘리는 문제 수정(2026-07-23, 실기기
   확인으로 발견). 일반 브라우저 탭에서는 env(safe-area-inset-bottom)이
   보통 0이라 바로 위 규칙(padding-bottom: env(...)) 그대로 화면 맨 아래에
   밀착되는 게 맞고(2026-07-18에 이렇게 고친 이유가 바로 위 주석 참고 — 이
   틈으로 배경이 비쳐 보이던 버그), 그 동작은 그대로 유지해야 함. 문제는
   standalone 모드에서 일부 기기/브라우저가 제스처 바 영역을 env()로 정확히
   보고하지 않아(특히 Android) env()가 0을 반환해도 실제로는 그 영역을
   제스처 바가 차지하고 있는 경우가 있다는 것 — 그래서 이 조합에서만 최소
   12px 기본 여백을 추가로 더해(env가 0이어도 항상 최소한의 간격은 확보),
   env가 실제 값을 정확히 보고하는 기기(주로 iOS)에서는 그 값 위에 12px가
   더 얹어짐. `@media (display-mode: standalone)`는 설치된 PWA로 실행 중일
   때만 참이라 일반 브라우저 탭에는 전혀 영향 없음(선택자 자체가 다른
   컨텍스트에서는 매치되지 않음) — 위 "배경 비쳐 보임" 수정과 충돌하지 않음.
   `.list-shell__bottom:empty`는 클래스+가상클래스라 특정성(0,2,0)이 이
   규칙(0,1,0)보다 항상 높아, 별도로 안 다뤄도 빈 바는 계속 0 유지됨. */
@media (max-width: 768px) and (display-mode: standalone) {
  .list-shell__bottom {
    padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
  }
}

/* ---------- Mobile (<=768px), 계속 — 위 standalone 전용 블록과 분리하기
   위해 여기서 다시 열림(나머지 전부 일반 모바일 브라우저 탭에도 그대로
   적용되어야 하므로 display-mode 조건에 절대 안 걸리게 함). ---------- */
@media (max-width: 768px) {
  /* 배경 이미지 모바일 버전(세로형)으로 교체(2026-07-17 UI 디자인 확정 사양) —
     PC 기본값은 main.css/.auth-page 참고. */
  .auth-page {
    background-image: url('/images/backgrounds/style-background-mobile.png?v=2');
  }
  body[data-bg-category="account"] { background-image: url('/images/backgrounds/spring-mobile.png'); }
  body[data-bg-category="device"] { background-image: url('/images/backgrounds/summer-mobile.png'); }
  body[data-bg-category="product"] { background-image: url('/images/backgrounds/autumn-mobile.png'); }
  body[data-bg-category="address"] { background-image: url('/images/backgrounds/winter-mobile.png'); }
  /* 원본 lake-afternoon-mobile.png 오른쪽 끝에 투명 띠(~50px)와 그 안에 반투명
     반원 조각(잘린 장식 요소로 추정)이 있어 "파란 부분이 튀어나온 것처럼"
     보이는 문제가 있었음(2026-07-18, 알파채널로 확인 후 사용자 승인) —
     1560px→1510px로 크롭해 투명 영역을 완전히 제거한 별도 파일
     (lake-afternoon-personal-mobile.png)로 교체. admin과 동일하게 배경이
     우측 끝까지 오도록 background-size도 살짝 확대. */
  body[data-bg-category="personal"] {
    background-image: url('/images/backgrounds/lake-afternoon-personal-mobile.png');
    background-size: 110% auto;
  }
  /* 권한관리 매트릭스 표는 계정이 늘어나면 가로 스크롤이 필요한데(가로축
     계정 컬럼), 스크롤해서 오른쪽으로 이동한 영역까지는 배경 이미지가 원래
     안 덮임(2026-07-18, 실기기 스크린샷 "우측"에서 확인 — body/표 스크롤이
     되어도 배경은 처음 뷰포트 기준 cover로만 계산되기 때문). 이미지를 새로
     자르는 대신, 이 카테고리에서만 background-size를 cover보다 살짝 더 키워
     (auto로 세로 비율은 유지) 스크롤된 영역까지 조금 더 여유 있게 덮도록 함. */
  body[data-bg-category="admin"] {
    background-image: url('/images/backgrounds/lake-afternoon-mobile.png?v=2');
    background-size: 110% auto;
  }
  body[data-bg-category="dashboard"] {
    background-image: url('/images/backgrounds/style-background-mobile.png?v=2');
  }

  /* ---------- 홈 대시보드(2026-07-20) — 스마트폰에서 스크롤 없이 한 화면에
     들어와야 한다는 요구사항 때문에 PC보다 훨씬 압축된 표시량/여백을 씀.
     **(2026-07-20 후속) 4/5번째 항목을 nth-child로 숨기던 방식은 폐기** —
     사용자 요청으로 "만료임박/최근등록은 항상 4줄 높이 고정(처음엔 3줄이었다가
     변경) + 넘치는 항목은 카드 내부 스크롤로"로 전환(PC/모바일 동일 조건,
     main.css의 `.dashboard-card__body` 참고 — 미디어쿼리 없이 공통 규칙
     하나로 처리되고 여기서는 모바일 전용 높이 값만 덮어씀). ---------- */
  .page--dashboard {
    padding: 10px 12px 14px;
  }
  .dashboard-shell {
    gap: 8px;
  }
  .dashboard-search input {
    padding: 8px 12px;
    font-size: 14px;
  }
  .dashboard-sections {
    gap: 8px;
  }
  /* PC에서 만료임박/최근등록을 좌우 배치로 바꾸며 main.css의 기본값이
     row가 됐는데(2026-07-20), 모바일은 "더 이상 수정하지 말 것"으로 확정된
     상태라 여기서 명시적으로 되돌려 기존 상하 배치를 그대로 유지. */
  .dashboard-top-row {
    flex-direction: column;
    gap: 8px;
  }
  .dashboard-card {
    padding: 10px 12px;
  }
  .dashboard-card__title {
    margin: 0 0 6px;
    font-size: 13.5px;
  }
  /* **2026-07-21 후속**: 이 고정 px 값(4줄/5줄, 특정 스마트폰 화면 기준으로
     튜닝됐던 값)은 더 이상 실제로 쓰이지 않음 — public/js/dashboard.js가
     페이지 로드 시 매번 실제 사용 가능한 높이를 재고 인라인 style로 3~5줄
     사이 값을 직접 계산해서 덮어씀(화면 높이가 기기마다 달라도 "내소유
     요약"이 항상 화면 안에 들어오도록). 여기 남겨둔 값은 JS가 실행되지
     않는 경우(자바스크립트 비활성화 등)에 대한 안전망(fallback)일 뿐. */
  .dashboard-card__body {
    height: 136px; /* fallback: 4줄 (31×4 + 4×3) */
  }
  .dashboard-card--recent .dashboard-card__body {
    height: 171px; /* fallback: 5줄 (31×5 + 4×4) */
  }
  .dashboard-list {
    gap: 4px;
  }
  .dashboard-list__item {
    padding: 6px 8px;
  }
  .dashboard-list__label {
    font-size: 12.5px;
  }
  .dashboard-list__meta,
  .dashboard-list__badge {
    font-size: 11px;
  }
  .dashboard-own-grid {
    gap: 6px;
  }
  /* PC에서 칩을 가로 1줄로 바꾸며 main.css 기본값이 row가 됐는데
     (2026-07-20), 모바일은 확정된 기존 2줄 모양을 그대로 유지하기 위해
     명시적으로 column으로 되돌림. */
  .dashboard-own-chip {
    flex-direction: column;
    align-items: center;
    padding: 8px 4px;
    gap: 1px;
  }
  .dashboard-own-chip__count {
    font-size: 16px;
  }
  .dashboard-own-chip__label {
    font-size: 11px;
  }

  /* 이메일 컬럼 완전히 숨김(2026-07-16, 두 차례 실기기 검증 후 최종 수정) —
     처음엔 <col>에 display:none을 줬는데(th/td 개별 셀이 아니라 <colgroup>의
     <col> 자체라 컬럼 매칭은 안 깨지는 안전한 방식이라 판단했음), 실기기
     (네이버 인앱브라우저)에서 이 방식만으로는 컬럼이 전혀 안 접히고 계속
     살짝 보임 — 이후 셀에도 padding:0+overflow:hidden을 추가했지만(특정성
     문제까지 고쳤음에도) 여전히 안 접혀서, **<col> 자체의 display:none이
     이 브라우저에서 아예 지원되지 않는 것으로 최종 판단**함. 주소정보
     우편번호 컬럼에서 이미 검증된 방식(<col width:0> + 셀 자신에 padding:0+
     overflow:hidden 이중 적용)으로 전면 교체 — display:none이 아니라
     width:0이라는 점이 핵심(폭 기반 축소는 이 브라우저에서도 정상 동작함이
     우편번호 컬럼으로 이미 실증됨). */
  .col-email {
    width: 0;
  }
  /* 아래 [data-category="account"] .data-table th/td { padding: 8px 6px }가
     .email-cell { padding:0 }보다 특정성이 높아(속성+클래스+태그 vs 클래스
     하나) 소스 순서와 무관하게 항상 이겨버려 padding:0이 전혀 먹히지
     않았던 게 실제 원인이었음(2026-07-16, "이메일이 여전히 살짝 보임" 재현
     후 확인) — .data-table th/td까지 셀렉터에 포함시켜 특정성을 맞춰서 고침. */
  [data-category="account"] .data-table th.email-cell,
  [data-category="account"] .data-table td.email-cell {
    padding: 0;
    overflow: hidden;
  }
  /* 가입정보 스마트폰 화면 전면 압축(2026-07-16, 실기기 스크린샷 기준) —
     가입/서비스명/로그인ID/비밀번호 4개 컬럼이 가로 스크롤 없이 한 화면에
     전부 들어와야 한다는 요구사항. 이전 회차(150px/150px)는 이 4개 컬럼
     합이 여전히 스마트폰 가용폭(약 332px, 360px 화면에서 좌우 페이지 패딩
     28px 제외 — address 카테고리 때와 동일 기준)을 크게 넘어 가로 스크롤이
     필요했음. 폭만 줄이는 걸로는 부족해서 글자 크기/셀 패딩도 함께 줄임
     (계정 카테고리 전용 스코프 — 다른 카테고리 테이블 폰트에는 영향 없음).
     합계: 48(가입)+118(서비스명)+98(로그인ID)+108(비밀번호) = 372px. 비밀번호는
     처음 100px로 뒀다가 실기기에서 마스킹 점 8개+"보기" 버튼이 다 안 들어가서
     버튼이 잘려 사라지는 문제가 있어 108px로 확정(해결 확인됨). 서비스명은
     92px→104px→118px로 두 차례 더 늘림(마지막은 사용자 요청 "한 글자분만
     더"). 로그인ID도 72px→84px→98px로 동일하게 두 차례 늘림 — 최초 목표였던
     360px 화면(가용폭 332px) 기준보다 상당히 넘지만, 실사용 기기가 대부분
     이보다 넓어(390px 이상) 여유가 있다고 판단해 그대로 반영(2026-07-16). */
  [data-category="account"] .data-table {
    min-width: 372px;
    font-size: 12px;
  }
  [data-category="account"] .data-table th {
    font-size: 11px;
  }
  [data-category="account"] .data-table th,
  [data-category="account"] .data-table td {
    padding: 8px 6px;
  }
  .col-subject {
    /* 헤더 라벨 "가입"(11px) + 정렬 아이콘(1em+margin-left 2px) + 좌우
       패딩(6px×2=12px)을 감안한 최소 폭 — 앞서 겪었던 "헤더가 잘림" 회귀를
       또 반복하지 않도록 데이터 값(JM/HDS)이 아니라 헤더 자신의 폭부터 계산. */
    width: 48px;
  }
  .col-service {
    width: 118px; /* 2026-07-16: 한 글자분(약 14px) 추가 요청으로 104px→118px */
  }
  .col-login-id {
    width: 98px; /* 2026-07-16: 한 글자분(약 14px) 추가 요청으로 84px→98px */
  }
  .col-password {
    width: 108px;
  }
  /* 서비스명/로그인ID 모두 이 폭에서는 원래 길이의 내용이 잘리므로 최대
     2줄까지 줄바꿈해서 보여줌(주소정보 .address-cell-link와 동일 패턴) —
     완전히 압축된 화면에서도 내용 자체가 안 보이는 일은 없도록 함. */
  .service-cell-link,
  .login-id-cell {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    white-space: normal;
    word-break: break-word;
    text-align: left;
  }
  /* 비밀번호 컬럼("보기" 버튼이 사라지는 버그 수정, 2026-07-16) — 마스킹 점
     8개(.masked-value)+"보기" 버튼(.btn-toggle-mask)이 셀 폰트 축소만으로는
     108px 안에 다 안 들어가서, 부모 <td>의 기본 white-space:nowrap +
     overflow:hidden(.data-table td) 때문에 버튼이 통째로 잘려 안 보이는
     증상이 실기기에서 확인됨. 두 요소를 감싸는 별도 span(.password-cell)에
     flex-wrap을 줘서, 폭에 못 들어가면 버튼이 다음 줄로 넘어가되(줄바꿈)
     절대 사라지지는 않게 함 — 동시에 점/버튼 자체 크기도 더 줄여 대부분은
     실제로 한 줄에 들어가도록 함. */
  .password-cell {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    column-gap: 4px;
    white-space: normal;
  }
  .password-cell .masked-value {
    font-size: 11px;
    letter-spacing: 0;
  }
  .password-cell .btn-toggle-mask {
    margin-left: 0;
    font-size: 11px;
  }

  /* 제품정보 스마트폰 화면 압축(2026-07-16, 가입정보와 동일한 방식 적용) —
     소유/분류/제목 3개 컬럼이 가로 스크롤 없이 한 화면에 들어오도록 폰트
     크기/셀 패딩/컬럼폭을 함께 줄임(제품정보 전용 스코프 — 다른 카테고리
     테이블에는 영향 없음). 합계: 48(소유)+90(분류)+194(제목) = 332px
     (360px 화면, 좌우 페이지 패딩 28px 제외한 가용폭 기준 — 가입정보 최초
     설계와 동일한 기준값). */
  [data-category="product"] .data-table {
    min-width: 332px;
    font-size: 12px;
  }
  [data-category="product"] .data-table th {
    font-size: 11px;
  }
  [data-category="product"] .data-table th,
  [data-category="product"] .data-table td {
    padding: 8px 6px;
  }
  .col-product-subject {
    /* 헤더 라벨 "소유"(11px) + 정렬 아이콘 + 좌우 패딩(12px) 감안 — 가입정보의
       .col-subject와 동일한 논리로 산정(데이터 값이 아니라 헤더 자신 기준). */
    width: 48px;
  }
  .col-product-type {
    width: 90px;
  }
  .col-product-title {
    width: 194px;
  }
  /* 제목 컬럼은 이 폭에서 잘리는 대신 최대 2줄까지 줄바꿈(가입정보
     .service-cell-link와 동일 패턴) — 내용이 사라지지 않게 함. */
  .product-title-link {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    white-space: normal;
    word-break: break-word;
    text-align: left;
  }

  /* 주소정보 목록(2026-07-27 재설계, 같은 날 후속 3차 수정) — 항목당 2줄
     카드형 레이아웃(건물명+출입번호 1줄, 주소 2줄)은 유지하되, 항목마다
     반복되던 라벨(.mobile-field-label)은 제거하고 PC처럼 맨 위에 헤더
     행을 한 번만(sticky) 보여주는 방식으로 전환(2026-07-27 3차 요청).
     우편번호는 여전히 모바일에서 표시 안 함.
     <tr>을 flex 컨테이너로 바꾸는 순간부터 <colgroup>/<col>은 이 행의 렌더링에
     더 이상 관여하지 않음(table-layout 알고리즘 자체가 적용 안 됨) — 그래서 이
     구간에서는 개별 td/th에 display:none을 걸어도 "colgroup 매칭이 깨지는"
     기존 버그(주소정보 우편번호 컬럼에서 실제로 겪었던 것, main.css 관련 주석
     참고)가 재발할 위험이 없음: PC/태블릿 구간(진짜 table-layout:fixed가 적용
     중)과는 아예 다른 렌더링 모드이기 때문. */
  /* ⚠️ #data-table는 product-list.ejs/personal-list.ejs/list-table.ejs(가입정보)도
     동일하게 쓰는 id라서(카테고리마다 별도 id를 안 씀), 아래 규칙들을 스코프
     없이 걸면 다른 카테고리 모바일 화면까지 전부 이 flex 레이아웃으로 깨짐 —
     반드시 [data-category="address"](list-shell에 slug로 렌더링됨)로
     범위를 좁힐 것. */
  /* ⚠️ 2026-07-27 실기기 확인 결과 "모바일에서 데이터가 아예 안 보임" 버그
     발견 — <table>/<tbody>는 그대로 display:table/table-row-group인 채로
     자식 <tr>만 display:flex로 바꿔서 일부 모바일 브라우저의 테이블 렌더링
     알고리즘이 깨진 것으로 추정(테이블 자식 요소 중 일부만 display를 바꾸면
     브라우저마다 처리가 다름). <table>/<tbody>/<thead> 모두 명시적으로
     display:block으로 바꿔 테이블 렌더링 모드 자체에서 완전히 빠져나오도록
     수정 — 이렇게 하면 <tr>(display:flex)/<td>가 일반 블록 문서 흐름의
     자식처럼 안정적으로 렌더링됨(반응형 테이블→카드 전환의 표준적인 방식). */
  [data-category="address"] #data-table {
    display: block;
    width: 100%;
  }
  [data-category="address"] #data-table tbody {
    display: block;
    width: 100%;
  }
  /* 헤더(thead)도 더 이상 숨기지 않고 block으로 유지 — position:sticky/
     top/z-index/background는 main.css의 카테고리 공용 규칙([data-category=
     "address"] #data-table thead)을 그대로 물려받으므로 여기서는 display만
     table-header-group에서 block으로 바꿔줌(PC/태블릿과 마찬가지로 모바일도
     스크롤 시 항목명이 안 사라져야 한다는 3차 요구사항 3번). */
  [data-category="address"] #data-table thead {
    display: block;
  }
  [data-category="address"] #data-table thead tr {
    display: flex;
    flex-wrap: wrap;
    width: 100%;
    padding: 10px 14px;
    border-bottom: 1px solid var(--color-border);
  }
  [data-category="address"] #data-table thead th {
    border: none;
    padding: 0;
    font-weight: 600;
    font-size: 12.5px;
    color: var(--color-text-muted);
    text-align: left;
  }
  /* 주소는 헤더에서 라벨 자체가 없는 필드(항목의 "제목" 역할)라 헤더 행에서만
     숨김 — 데이터 행(tbody)의 주소 셀은 그대로 표시. */
  [data-category="address"] #data-table thead .address-cell-street-cell {
    display: none;
  }
  [data-category="address"] #data-table tbody tr {
    display: flex;
    flex-wrap: wrap;
    width: 100%;
    padding: 10px 14px;
  }
  [data-category="address"] #data-table tbody tr td {
    /* 셀 하나하나가 아니라 행(tr) 전체에 padding/구분선을 한 번만 주므로
       기본 셀 padding/border는 제거(중복 방지). */
    border-bottom: none;
    padding: 3px 0;
  }
  [data-category="address"] #data-table tbody tr:not(.js-empty-row) {
    border-bottom: 1px solid var(--color-border);
  }
  [data-category="address"] .js-empty-row .empty-row {
    flex: 1 1 100%;
  }
  .col-address-postal-cell {
    display: none;
  }
  /* 1번째 줄: 건물명(왼쪽 절반) + 출입번호(오른쪽 절반), 2번째 줄: 주소(전체 폭,
     길면 자동으로 여러 줄) — DOM 순서(우편번호-건물명-주소-출입번호, PC와
     동일하게 유지)와 무관하게 order로만 시각적 순서를 재배치(헤더 행에도 th가
     동일 클래스를 공유하므로 그대로 적용됨 — PC와 같은 좌우 배치). 건물명/
     출입번호가 50%씩 나눠 쓰다 내용이 넘치면(2026-07-27 요구사항: 항상 전체
     표시) 잘리지 않고 줄바꿈되도록 main.css의 공통 규칙(.address-cell-building
     등 white-space:normal)을 그대로 물려받음 — 여기서 따로 안 건드림. */
  .address-cell-building {
    order: 1;
    flex: 1 1 50%;
  }
  .address-cell-entrance-cell {
    order: 2;
    flex: 1 1 50%;
  }
  .address-cell-street-cell {
    order: 3;
    flex: 1 1 100%;
    margin-top: 4px;
  }
  /* 모바일에서 건물명 "데이터"만 굵게(2026-07-27 3차 요청 4번) — 헤더 라벨
     "건물명"은 그대로 두고 tbody의 실제 값에만 적용. */
  [data-category="address"] #data-table tbody .address-cell-building {
    font-weight: 700;
  }

  /* 모바일 네비게이션 2줄 구조(2026-07-18) — 1줄: 사이트명 텍스트만(세이지그린
     배너), 2줄: 로고 아이콘+카테고리 탭+햄버거(기존 그대로). 데스크톱/태블릿은
     이 미디어쿼리 밖이라 전혀 영향 없음(기존 1줄 구조 그대로 유지). */
  .app-header__top-mobile {
    display: block;
    background: #E9F0E3;
    color: #5E7A4E;
    font-weight: 600;
    font-size: 13px;
    padding: 6px 12px;
    text-align: center;
  }

  /* 모바일 상단 네비게이션 전면 재구성(2026-07-14) — 맨 윗줄 1개(로고 아이콘 +
     카테고리 탭 5개 축약형 + 햄버거)만 항상 고정 노출하고, 계정정보/로그아웃/
     권한관리는 전부 햄버거 드롭다운(.app-nav__dropdown-menu)으로 이동. 데스크톱/
     태블릿의 .app-nav(풀네임 링크 + 인라인 계정정보, "임시열람권 관리" 탭 포함)는
     이 미디어쿼리 밖이라 전혀 영향 없음 — 그대로 유지됨. */
  .app-header__inner {
    flex-wrap: nowrap;
    gap: 8px;
    padding: 0 12px;
    position: relative; /* .app-nav__dropdown-menu의 위치 기준점 */
  }

  .app-header__brand-text {
    display: none;
  }
  .app-header__brand-icon {
    display: inline-flex;
  }

  .app-nav {
    flex: 1;
    min-width: 0; /* flex item이 콘텐츠 크기 밑으로 줄어들 수 있어야 안의 overflow-x:auto가 실제로 동작함 */
  }
  .app-nav__links {
    flex: 1;
    min-width: 0;
    flex-wrap: nowrap;
    overflow-x: auto;
    gap: 4px;
    -webkit-overflow-scrolling: touch;
  }
  /* 컨테이너 padding-right만으로는 일부 브라우저가 스크롤 끝의 여백을 무시하는
     경우가 있어(flex+overflow 조합에서 흔한 현상), 실제 flex 아이템인 가상
     스페이서를 하나 더 둬서 "가로스크롤 끝까지 밀어도 마지막 탭이 잘리는" 문제를
     확실하게 막음 — 지난 회차에 발견됐던 문제의 재발 방지. */
  .app-nav__links::after {
    content: '';
    flex: 0 0 4px;
  }
  .app-nav__link {
    padding: 10px 10px;
    flex: 0 0 auto;
    /* 2026-07-14: 축약형(가입/기기/제품/주소/개인) 대신 풀네임을 유지하되 폰트
       크기를 10% 줄여서(14px→12.6px) 폭을 최대한 확보 — 계산상 완전히 한 줄에
       들어간다고 보장되진 않아 .app-nav__links의 overflow-x:auto 안전장치는
       그대로 유지(실브라우저 확인 예정). */
    font-size: 12.6px;
  }
  /* 태블릿/PC는 이 미디어쿼리 밖이라 원래 폰트 크기(14px)와 풀네임을 그대로 유지. */
  .app-nav__link-full {
    display: inline;
  }
  .app-nav__link-short {
    display: none;
  }
  /* "권한관리" 탭은 원래 모바일 맨 윗줄에서 제거하고 햄버거 드롭다운으로만
     접근하게 했었는데(카테고리 탭과 다른 성격이라는 판단), 카테고리 탭 줄에도
     보여야 한다는 피드백으로 숨김을 해제함(2026-07-17) — 드롭다운 메뉴에도
     여전히 남아있어 두 경로 모두로 접근 가능(중복이지만 해가 되지 않아 그대로 둠). */
  /* 데스크톱 전용 인라인 계정정보/로그아웃 — 모바일에서는 드롭다운 버전으로 대체. */
  .app-nav__user {
    display: none;
  }

  .app-nav__toggle-label {
    display: flex;
    align-items: center;
    flex: 0 0 auto;
  }

  .app-nav__dropdown-menu {
    position: absolute;
    top: 100%;
    right: 12px;
    margin-top: 6px;
    min-width: 180px;
    background: var(--color-surface);
    color: var(--color-text);
    border-radius: var(--radius);
    box-shadow: var(--shadow-md);
    padding: 8px;
    z-index: 30;
  }
  .app-nav__toggle-input:checked ~ .app-nav__dropdown-menu {
    display: flex;
    flex-direction: column;
    gap: 4px;
  }
  .app-nav__dropdown-account {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    padding: 8px 10px;
    border-bottom: 1px solid var(--color-border);
    margin-bottom: 4px;
  }
  .app-nav__dropdown-account .app-nav__user-name {
    color: var(--color-text);
    font-weight: 600;
  }
  .app-nav__dropdown-link {
    padding: 10px;
    border-radius: var(--radius);
    color: var(--color-text);
    font-size: 14px;
  }
  .app-nav__dropdown-link:hover {
    background: var(--color-bg);
    text-decoration: none;
  }
  .app-nav__dropdown-link.is-active {
    /* 이 드롭다운엔 현재 "권한관리" 항목만 들어있어(mobileMenuItems, nav.ejs)
       계정(account) 색이 아니라 admin 색을 쓰는 게 맞음 — 예전엔 무관하게
       account-bg를 재사용하고 있었음(2026-07-17 정리). */
    background: var(--color-admin-bg);
    font-weight: 600;
  }

  .hub-grid {
    grid-template-columns: 1fr;
  }
  .card-grid {
    grid-template-columns: 1fr;
  }

  /* 검색어 입력란 + 정렬 드롭다운은 스마트폰 폭까지 줄어들어도 세로로 안
     쌓이고 한 줄에 같이 보이게 함(2026-07-16) — 기존엔 flex-direction:column
     으로 강제 스택시켰던 게 원인. 검색 입력란의 min-width(180px, main.css
     .list-toolbar input[type=search])를 그대로 두면 좁은 화면에서 select와
     합쳐 컨테이너 폭을 넘어 nowrap이어도 잘릴 수 있어 여기서만 0으로 풀어줌 —
     select는 내용 기준 자동 폭이라 별도 처리 불필요. */
  .list-toolbar {
    flex-wrap: nowrap;
  }
  .list-toolbar input[type="search"] {
    min-width: 0;
  }
  .list-toolbar select {
    flex: 0 0 auto;
  }

  .detail-field {
    grid-template-columns: 1fr;
    gap: 4px;
  }
  .detail-field__label {
    font-size: 12px;
  }

  .page__header {
    flex-direction: column;
    align-items: flex-start;
  }

  /* "신규 데이터 입력" 버튼: 모바일은 아이콘만(라벨 span 자체를 감춤, 2026-07-16) —
     계정칩(계정명)과 버튼 텍스트가 같은 줄에서 같이 표시되면 좁은 화면에서
     줄바꿈/잘림이 생기는 문제를 피하기 위함. PC/태블릿은 main.css 기본값대로
     아이콘+텍스트 둘 다 유지(이 미디어쿼리 밖). */
  .btn--icon-only__label {
    display: none;
  }
  .btn--icon-only {
    padding: 9px 12px;
  }

  /* 권한관리 매트릭스 표 설명 — 모바일에서는 앞뒤 문장("셀을 클릭하면"/"순서대로
     바뀌면서 즉시 저장됩니다")을 감추고 괄호로 묶인 아이콘 순서 부분만 한 줄로
     보여줌(2026-07-17). 폭이 좁아 그래도 한 줄에 다 안 들어갈 경우를 대비해
     nowrap + overflow-x:auto로 안전하게 가로 스크롤 처리(칸이 넘칠 때 줄바꿈
     대신 스크롤 — 이 프로젝트의 테이블 컬럼과 동일한 원칙). */
  .grant-matrix-legend {
    flex-wrap: nowrap;
    overflow-x: auto;
  }
  .grant-matrix-legend-prefix,
  .grant-matrix-legend-suffix {
    display: none;
  }
  .grant-matrix-legend-cycle {
    /* display/align-items/gap은 main.css 기본 규칙(상하 중앙정렬)으로 이미
       적용됨 — 모바일에서만 다른 값(한 줄 강제 + 폰트 축소)만 여기서 추가.
       "열람+수정+삭제" 뒤에 &nbsp;를 추가(괄호 앞 두 칸 간격)하면서 12px에서는
       마지막 ")"까지 화면 밖으로 밀려 안 보이는 문제가 생겨(2026-07-17,
       실기기 스크린샷으로 확인) 11px로 살짝 더 줄임. */
    white-space: nowrap;
    font-size: 11px;
  }

  /* 권한관리 매트릭스 — 스마트폰 실기기 스크린샷 기준 가로 스크롤 전에 계정
     6개 정도만 보이던 걸 개선하기 위해 셀 패딩/폭/폰트를 축소(2026-07-17).
     PC/태블릿은 이 미디어쿼리 밖이라 기존 값(56px, 패딩 12px 14px) 그대로 유지.
     컬럼 폭은 <td>/<th> 자체의 width로 지정했었는데 table-layout:auto에서
     브라우저가 힌트로만 취급해 무시하는 것으로 확인됨(서로 다른 브라우저 2개,
     캐시 완전 삭제 후에도 30~60px 변경이 전혀 반영 안 됨) — 내부
     span(.grant-cell__inner/.grant-matrix-grantee-label__inner/
     .grant-matrix-axis-caption__inner, 전부 display:block 또는 inline-block)에
     width를 주는 방식으로 교체(main.css 참고). 이 방식으로 바꾸자 실제로 폭
     조정이 반영되기 시작했고, 처음 시도한 60px는 실제로 적용되니 계정
     4~5개만 보일 정도로 과하게 넓었음(2026-07-17 스크린샷으로 확인) — 목표인
     "공용까지 스크롤 없이, HK는 스크롤" 기준으로 대폭 축소. */
  .grant-matrix-table th,
  .grant-matrix-table td {
    padding: 6px 4px;
  }
  .grant-cell {
    font-size: 13px;
  }
  .grant-cell__inner {
    /* 30px에서도 IH까지만 보이고 IJ/공용은 여전히 스크롤해야 보였다는
       피드백(2026-07-17)으로 24px로 추가 축소. */
    width: 24px;
  }
  .grant-matrix-owner-label {
    font-size: 11px;
  }
  .grant-matrix-table th.grant-matrix-grantee-label {
    font-size: 11px;
  }
  .grant-matrix-grantee-label__inner {
    width: 22px;
  }
  .grant-matrix-axis-caption--left {
    font-size: 10px;
  }
  .grant-matrix-axis-caption__inner {
    width: 16px;
  }
  .grant-matrix-table th.grant-matrix-axis-caption--top {
    font-size: 10px;
  }
}
