/* MOMYA-SKIN v20260722-12 momya.css */
/* ── Design tokens ─────────────────────────────────────────
   TYPE SCALE (px): 11 · 12 · 13 · 14 · 15 · 16 · 17 · 18 · 20 · 22
     11 meta/caption · 12 secondary · 13 body · 14 body-emphasis · 15 card
     16 subhead/section · 17 comment head · 18 detail title · 20 page title · 22 brand/logo
   WEIGHTS: 400 body · 500 medium · 700 bold · 800 heading/brand
   ─────────────────────────────────────────────────────────── */
:root{
  --bg:#fff; --surface:#fff; --surface-2:#F3F4F6;
  --green:#15803D; --green-d:#166534; --green-soft:#F0FDF4;
  --black:#111827;
  --text:#111827; --text-2:#6B7280; --text-3:#9CA3AF;
  --border:#E5E7EB; --border-2:#D1D5DB; --border-soft:#F0F1F4;
  --radius:12px; --radius-sm:9px;
  /* 타이포 스케일 (역할별 글씨 규칙) — 화면 공통
     화면제목 20·700 / 상세글제목 18·700 / 섹션헤더 17·700(head)·16·700(section) / 카드제목 15·600
     본문 14·400 / 보조라벨 13·500~600 / 캡션 12·400(text-3) / 마이크로뱃지 11·600
     title·head 는 글상세 CSS 대조(design/prototype.css 21행) 로 추가됨 */
  --fs-display:20px; --fs-title:18px; --fs-head:17px; --fs-section:16px; --fs-card:15px;
  --fs-body:14px; --fs-label:13px; --fs-caption:12px; --fs-micro:11px;
  --shadow:0 1px 0 rgba(0,0,0,.04),0 4px 20px -8px rgba(0,0,0,.12);
 --red:#EF4444; --red-d:#DC2626; --red-soft:#FEF2F2;
 --link:#2563EB;
 --tabbar-h:64px; /* [2026-08-03 조정] 56px→64px, "약간 좁아 보인다"는 피드백으로 8px
   키움 — 이 값 하나만 바꾸면 main padding-bottom/토스트 bottom이 자동으로 같이
   따라온다는 걸 로컬 mockup으로 재검증 완료(계산식이 전부 var(--tabbar-h) 참조라 값
   교체만으로 연쇄 적용, 다른 곳은 안 건드림). [모바일 앱형 UI 2-2단계, 2026-08-03]
   하단 고정 탭바(.tabbar) 높이 —
   main padding-bottom·토스트 bottom 계산이 전부 이 값을 공유한다(board.momya.css도
   :root가 momya.css 하나뿐이라 그대로 참조 가능 — 문서 루트에 선언된 커스텀 속성은
   파일 구분 없이 같은 페이지의 모든 스타일시트에서 보인다). 나중에 탭바 높이를 바꿀
   일이 있으면 이 값 하나만 고치면 세 군데(탭바 자신/main/토스트)가 같이 맞는다. */}
*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%;text-size-adjust:100%}
body{font-family:"Pretendard",system-ui,sans-serif;background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;line-height:1.5;font-weight:400;letter-spacing:-.2px}
a{color:inherit;text-decoration:none}
svg{display:block}

/* ── Header ── */
header{position:sticky;top:0;z-index:40;background:rgba(255,255,255,.93);backdrop-filter:blur(12px);border-bottom:1px solid var(--border)}
.bar{max-width:1060px;margin:0 auto;display:flex;align-items:center;gap:10px;padding:11px 20px}
.logo{font-weight:700;font-size:22px;color:var(--black);flex-shrink:0;letter-spacing:-1px;display:flex;align-items:center;gap:6px;line-height:1}
.logo-img{height:24px;width:auto}
.search{flex:1;min-width:0;max-width:440px;margin-right:auto;display:flex;align-items:center;gap:9px;background:var(--surface-2);border:1px solid var(--border);border-radius:999px;padding:9px 16px;transition:border-color .15s,box-shadow .15s;color:var(--text-3)}
.search:focus-within{border-color:var(--green);box-shadow:0 0 0 3px var(--green-soft)}
.search input{border:none;outline:none;background:none;font-family:inherit;font-size:14px;width:100%;color:var(--text)}
.search input::placeholder{color:var(--text-3)}
/* [2026-07-31] 검색 아이콘을 순수 svg 에서 실제 type=submit 버튼으로 교체하며
   추가 — .mobile-search-inner button(864행 아래)이 이미 쓰는 것과 동일한
   "버튼 크롬은 지우고 아이콘만 보이게" 패턴. color 는 명시하지 않고 상속시켜
   .search 자신의 color:var(--text-3)(위 34행)를 그대로 물려받는다 — 이전에
   svg 가 stroke="currentColor"로 부모 색을 상속하던 것과 동일한 결과. */
.search button{background:none;border:none;cursor:pointer;color:inherit;display:flex;align-items:center;flex-shrink:0;padding:0}
.btn-signup{background:var(--black);color:#fff;border:none;border-radius:999px;padding:8px 16px;font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;flex-shrink:0;transition:opacity .15s}
.btn-signup:hover{opacity:.82}
.btn-login{background:var(--green);color:#fff;border:none;border-radius:999px;padding:8px 16px;font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;flex-shrink:0;transition:background .15s}
.btn-login:hover{background:var(--green-d)}
.btn-write{display:flex;align-items:center;gap:6px;flex-shrink:0;cursor:pointer;background:var(--black);color:#fff;border:none;border-radius:999px;padding:9px 17px;font-family:inherit;font-size:13px;font-weight:600;line-height:16px;transition:background .15s,transform .08s}
.btn-write:hover{background:#333}
.btn-write:active{transform:scale(.96)}
.btn-mypage-icon{display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:50%;background:var(--green);color:#fff;border:none;cursor:pointer;flex-shrink:0;text-decoration:none;transition:background .15s,transform .08s}
.btn-mypage-icon:hover{background:var(--green-d)}
.btn-mypage-icon:active{transform:scale(.94)}
.logout{font-size:13px;color:var(--text-2);cursor:pointer;flex-shrink:0;padding:6px}
.logout:hover{color:var(--text)}
.icon-btn{background:none;border:none;cursor:pointer;color:var(--text-2);flex-shrink:0;display:flex;align-items:center;padding:6px;border-radius:8px;transition:background .15s}
.icon-btn:hover{background:var(--surface-2)}
.only-mobile{display:none}

/* ── Layout ── */
main{max-width:1060px;margin:0 auto;padding:22px 20px;position:relative;z-index:1}
.layout{display:flex;gap:10px;align-items:flex-start}

/* ── Sidebar ── */
.sidebar{width:220px;flex-shrink:0;position:sticky;top:68px;padding:8px 6px}

.sb-item{display:flex;align-items:center;gap:12px;padding:9px 12px;border-radius:var(--radius-sm);font-size:14px;font-weight:500;color:var(--text-2);cursor:pointer;transition:all .12s;margin-bottom:2px;user-select:none}
.sb-item:hover{background:var(--surface-2);color:var(--text)}
.sb-item.active{background:var(--green-soft);color:var(--green);font-weight:600}

.sb-divider{height:1px;background:var(--border);margin:10px 12px 12px}

.sb-board-item{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:var(--radius-sm);font-size:13px;font-weight:500;color:var(--text-2);cursor:pointer;transition:all .12s;margin-bottom:2px;user-select:none}
.sb-board-item:hover{background:var(--surface-2);color:var(--text)}
.sb-board-item.active{background:var(--green-soft);color:var(--green);font-weight:600}
.sb-avatar{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0;color:#fff}

/* [2026-08-03 추가] PC 사이드바 아이콘 10개(인기/최신/추천/공지사항/이벤트/게시판
   5개) 이미지 교체 — widgets/momya_category 위젯에서 쓰는 것과 같은 이미지를
   layouts/momya/img/ 에 복사해 이 레이아웃 자신의 폴더 안에서 독립적으로 참조한다
   (레이아웃이 특정 위젯의 내부 폴더에 의존하지 않도록, 파일이 두 곳에 중복되는
   대신 각자 자기 폴더 안에 자기 복사본을 둔다). 기존엔 정렬탭/섹션 5개가 stroke
   색상 SVG 선(.sb-item svg, 이제 삭제됨), 게시판 5개가 원형 이모지 아바타(.sb-avatar,
   원형이라 카테고리 페이지의 "모서리 둥근 사각형"과 달라 이번 대상에서 제외하고
   새 클래스로 통일)였는데, 이제 10개 전부 .sb-icon-box 하나로 통일된 모서리 둥근
   사각형 이미지가 됐다. 크기는 새로 만들지 않고 기존 .sb-avatar 의 24px를 그대로
   재사용했다(이미 이 사이드바 행 높이/여백에 맞게 검증된 값이라 안전). 모바일
   드로어(.ditem-icon.sb-avatar)는 이번 라운드에서 안 건드려 원형 이모지 그대로다
   — .sb-avatar 규칙 자체를 지우지 않은 이유이기도 하다.
   [background: 축약형 함정 재발 방지] 카테고리 페이지에서 겪은 문제(축약형이
   background-size 등 다른 하위 속성을 초기값으로 리셋)를 피하려고 배경색은
   background-color, 이미지는 background-image로 분리해서 썼다. */
.sb-icon-box{width:24px;height:24px;border-radius:var(--radius-sm);flex-shrink:0;background-color:var(--surface-2);background-size:cover;background-position:center;background-repeat:no-repeat}
.sb-icon-box.icon-hot{background-image:url('../img/hot.webp')}
.sb-icon-box.icon-new{background-image:url('../img/new.webp')}
.sb-icon-box.icon-top{background-image:url('../img/top.webp')}
.sb-icon-box.icon-notices{background-image:url('../img/notices.webp')}
.sb-icon-box.icon-event{background-image:url('../img/event.webp')}
.sb-icon-box.icon-free{background-image:url('../img/free.webp')}
.sb-icon-box.icon-ss{background-image:url('../img/ss.webp')}
.sb-icon-box.icon-preg{background-image:url('../img/preg.webp')}
.sb-icon-box.icon-info{background-image:url('../img/info.webp')}
.sb-icon-box.icon-tip{background-image:url('../img/tip.webp')}

/* ── Content ── */
.content{flex:1;min-width:0}

/* 홈: 배너 위 + 피드 아래 (세로 1단) / 게시판: 피드 좌 + 배너 우 (가로 2단) */
.content-inner{display:flex;flex-direction:column-reverse;gap:22px}
.feed-col{min-width:0}
.banner-col{min-width:0}
.content-inner.board-mode{flex-direction:row;gap:22px;align-items:flex-start}
.content-inner.board-mode .feed-col{flex:1;min-width:0;order:1}
.content-inner.board-mode .banner-col{width:240px;flex-shrink:0;order:2;position:sticky;top:68px}
/* 목록/피드 페이지(글상세 아님): 사이드바(220px)+배너(240px)가 둘 다 켜진 채로 우측
   고정이면 721~959px 근방에서 feed-col 이 배너보다 좁아지는 문제가 있었다(2026-07-22
   폴드 펼침 폭에서 실제로 겪음). 처음엔 이 구간에서 배너를 숨겼는데, 그러면 1024px
   랩탑처럼 배너를 보여줘도 충분한 폭에서까지 배너가 사라지는 부작용이 있었다
   (2026-07-22 재수정) — "숨김" 대신 이 구간만 모바일과 같은 방식(본문 아래로 스택)을
   쓰기로 바꿨다. 960px 기준 근거: 사이드바220+gap10+배너240+gap22+본문좌우패딩40=532px
   를 제해도 feed-col 이 960-532=428px 남아 넉넉하다(그 아래로는 배너를 세로 고정폭으로
   유지할수록 feed-col 이 배너보다 좁아짐). 960px 이상은 베이스 규칙(위 83~85행) 그대로
   우측 세로 배치. :not(.is-post-view) 로 글상세 쪽 기존 오버라이드(오버라이드 6,
   761px 이상 가로유지)와는 안 겹치게 분리했다 — 그쪽은 안 건드림. */
@media(max-width:959px) and (min-width:721px){
  body:not(.is-post-view) .content-inner.board-mode{flex-direction:column;gap:0;align-items:stretch}
  body:not(.is-post-view) .content-inner.board-mode .banner-col{display:contents}
  body:not(.is-post-view) .content-inner.board-mode .pick-wrap{order:1;margin-bottom:18px}
  body:not(.is-post-view) .content-inner.board-mode .feed-col{order:2}
  body:not(.is-post-view) .content-inner.board-mode .ev-wrap{order:3;margin-top:24px}
  body:not(.is-post-view) .content-inner.board-mode .pick-side{flex-direction:row}
  body:not(.is-post-view) .content-inner.board-mode .pick-side .sban{flex:1 1 0;min-width:0}
  body:not(.is-post-view) .content-inner.board-mode .ev-grid{grid-template-columns:repeat(2,1fr);gap:14px;margin-bottom:0}
  body:not(.is-post-view) .content-inner.board-mode .roller{aspect-ratio:16/9}
  body:not(.is-post-view) .content-inner.board-mode .pick-label{margin-bottom:11px}
  body:not(.is-post-view) .content-inner.board-mode .ev-label{margin:0 0 11px}
  body:not(.is-post-view) .content-inner.board-mode .ev-img-ph{font-size:22px;font-weight:700}
  /* [2026-08-03 삭제] .ev-ttl/.ev-sub 전용 규칙 제거 — 아래 192행대 board-mode
     unconditional 규칙이 홈과 동일값(13px/13px)으로 통일되면서 이 태블릿 전용
     재선언(기존에도 같은 14px/12px)이 완전히 무의미해졌다.
     [2026-08-03 추가 삭제] .ev-body(padding) 재선언도 같은 이유로 제거 — 기존에도
     이미 10px 11px 12px 로 홈과 같은 값이었고(데스크톱만 7px 9px 9px 로 달랐음),
     아래 204행대 unconditional 규칙을 홈과 통일하면서 이 재선언도 무의미해졌다. */
}

/* [2026-07-31, 더 이상 도달 불가 — 참고용으로 남기고 삭제는 안 함] 공지/이벤트 글이
   잘 안 보인다는 피드백으로 2026-07-23 결정을 뒤집어, 공지/이벤트도 이제 다른
   게시판과 동일하게 board-mode 를 쓴다(layout.html $momya_content_mode 참고) —
   layout.html 이 section-mode 클래스를 더 이상 출력하지 않아 아래 선택자들은 이제
   어떤 페이지에도 매치되지 않는다. 아래는 2026-07-23~07-31 사이의 과거 동작 기록:
   공지/이벤트 섹션 "목록" 화면만 board-mode(우측 세로 고정)를 안 썼다. 1024px
   이상은 80행 기본 규칙(column-reverse)이 그대로 적용돼 홈과 같은 "다 몰림"이 됐고,
   1023px 이하만 PICK 은 위, 이벤트카드는 본문 아래로 나눴다. 같은 게시판이라도 글
   상세는 layout.html 에서 이때도 이미 board-mode 를 그대로 썼으므로 안 겹쳤다. */
@media(max-width:1023px){
  .content-inner.section-mode{flex-direction:column;gap:0;align-items:stretch}
  .content-inner.section-mode .banner-col{display:contents}
  .content-inner.section-mode .pick-wrap{order:1;margin-bottom:18px}
  .content-inner.section-mode .feed-col{order:2}
  .content-inner.section-mode .ev-wrap{order:3;margin-top:24px}
  /* 롤링 배너 아래에 작은 배너 2개를 가로로(게시판 부류 board-mode와 동일 값, 2026-07-24 확정) */
  .content-inner.section-mode .pick-area{grid-template-columns:1fr}
  .content-inner.section-mode .pick-side{flex-direction:row}
  .content-inner.section-mode .pick-side .sban{flex:1 1 0;min-width:0}
}

/* 홈(비-board-mode) PICK 구획: 721~1023px(태블릿·폴드 펼침)도 모바일과 같은 구조
   (롤링 전체폭 + 사이드 가로 한 줄)로 확장한다(2026-07-24 확정, 사이드 배너가 2fr/1fr
   그리드의 좁은 1fr 칸에 눌리는 문제). 720px 이하의 헤더/내비게이션(사이드바↔햄버거)
   전환 기준값(742행 @media(max-width:720px))은 그대로 두기 위해 PICK 구획만 따로
   분리한 전용 구간이다 — 720px 블록에 값만 올리면 헤더 전환까지 같이 밀린다.
   board-mode(게시판 목록, 공지/이벤트 포함 — 2026-07-31부터)는 96행에 이미
   721~959px 전용 규칙이 있어 대상이 아니다. section-mode 는 2026-07-31부터 어떤
   페이지에도 안 붙는 죽은 클래스라(바로 위 @media(max-width:1023px) 블록 주석
   참고) 겹칠 일 자체가 없다.
   이벤트 그리드도 같은 구간: PC(1024px 이상, 199행 기본값)는 3열 유지, 이 구간만
   2열로 줄인다(2026-07-24 추가 확정). */
@media(min-width:721px) and (max-width:1023px){
  .content-inner:not(.board-mode) .pick-area{grid-template-columns:1fr}
  .content-inner:not(.board-mode) .pick-side{flex-direction:row}
  .content-inner:not(.board-mode) .pick-side .sban{flex:1 1 0;min-width:0;aspect-ratio:16/9;min-height:auto}
  .content-inner:not(.board-mode) .ev-grid{grid-template-columns:repeat(2,1fr)}
}

/* 게시판 모드에선 배너를 세로로 압축 */
.content-inner.board-mode .pick-area{grid-template-columns:1fr;margin-bottom:14px}
.content-inner.board-mode .pick-side{flex-direction:column;gap:7px}
.content-inner.board-mode .ev-grid{grid-template-columns:1fr;margin-bottom:0;gap:7px}
.content-inner.board-mode .roller{min-height:120px}
.content-inner.board-mode .pick-label{margin-bottom:8px}
.content-inner.board-mode .ev-label{margin:12px 0 8px}
/* [2026-08-03 갱신] 홈(13px/13px)과 통일 — 기존 14px/12px에서 변경. PC/태블릿
   전 구간에 적용되는 unconditional 규칙이라 이 한 곳만 고치면 됨(태블릿 전용
   재선언은 위에서 삭제, 모바일 전용은 아래 720px 블록에서 별도 관리). */
.content-inner.board-mode .ev-ttl{font-size:13px}
.content-inner.board-mode .ev-sub{font-size:13px}
/* [2026-08-03 삭제] .ev-body(padding) 전용 규칙(7px 9px 9px) 제거 — 홈과
   통일(10px 11px 12px)되면서 293행대 unconditional 기본 규칙과 완전히 같은
   값이 되어 무의미해졌다. 태블릿/모바일 전용 재선언도 같은 이유로 함께 삭제. */

.board-title{font-weight:700;font-size:20px;letter-spacing:-.5px;margin:0 0 14px;display:flex;align-items:center;gap:9px}
.board-title .bt-avatar{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;color:#fff}
/* [2026-08-03 추가, 모바일 전용] 게시판 목록(자유수다방 등) 헤더 — 원형 아이콘
   제거, 게시판 이름을 헤더 로고와 동일 크기(var(--fs-head), 17px)로 축소. PC는
   이 미디어쿼리 밖이라 무관. 공지사항/이벤트는 다른 컴포넌트(.sec-head, 이미
   17px·사각형 SVG 아이콘)를 써서 이 규칙 대상이 아니다 — 보고에 별도 명시. */
@media(max-width:720px){
  .board-title{font-size:var(--fs-head)}
  .board-title .bt-avatar{display:none}
}
/* [2026-08-03 갱신] "PICK" 글자만 초록으로 강조하던 .pick-label span{color:var(--green)}
   규칙을 제거 — 이제 "엄마야"와 같은 색(부모 .pick-label의 상속된 기본 텍스트 색)
   으로 통일된다. */
.pick-label{font-weight:700;font-size:17px;margin:0 0 11px;letter-spacing:-.5px}
/* [2026-08-03 추가] "엄마야 PICK" 라벨을 모바일(720px 이하)에서만 숨김, PC는 유지
   — .pick-label은 layout.html의 .banner-col 안 한 곳에만 있어(홈/게시판 목록 등
   board-mode를 쓰는 모든 화면이 이 하나의 마크업을 공유) 이 규칙 하나로 전체
   적용된다. 다른 .pick-label 규칙들(위, margin-bottom 조정용)은 display를 안
   건드려 충돌 없음. */
@media(max-width:720px){
  /* [2026-08-03 추가] 모바일에서 헤더 로고와 같은 크기(var(--fs-head), 17px —
     header .logo 모바일 규칙과 동일한 토큰)로 — 지금은 바로 위 display:none 때문에
     실제로는 안 보여 시각적 효과는 없지만, 나중에 이 숨김이 풀리면 바로 맞는
     크기가 적용되도록 같이 추가해뒀다. PC(17px, 위 기본 규칙)는 이 미디어쿼리
     밖이라 무관. */
  .pick-label{display:none;font-size:var(--fs-head)}
}

/* ── PICK 배너 영역 ── */
.pick-area{display:grid;grid-template-columns:2fr 1fr;gap:10px;margin-bottom:28px;align-items:stretch}

/* 롤링 슬라이더 (이미지형 광고 슬롯) */
.roller{width:100%;border-radius:var(--radius);overflow:hidden;position:relative;cursor:pointer;aspect-ratio:16/9;container-type:inline-size;align-self:start}
.roller img{width:100%;height:100%;object-fit:cover;display:block;-webkit-user-drag:none;user-drag:none;-webkit-user-select:none;user-select:none}
.roller-track{display:flex;transition:transform .45s cubic-bezier(.4,0,.2,1);height:100%;touch-action:pan-y}
.slide{min-width:100%;display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-start;text-align:left;padding:7% 6%;gap:1.4cqi;position:relative;overflow:hidden}
.slide-0{background:linear-gradient(135deg,#0ea5e9 0%,#6366f1 100%)}
.slide-1{background:linear-gradient(135deg,#f59e0b 0%,#ef4444 100%)}
.slide-2{background:linear-gradient(135deg,#15803d 0%,#0ea5e9 100%)}
/* 글씨를 박스 크기에 비례(cqi)시켜 구간별 점프·겹침 없이 같이 스케일 */
.slide-tag{font-size:clamp(9px,2.4cqi,12px);font-weight:700;background:rgba(255,255,255,.22);color:#fff;padding:.5cqi 2.2cqi;border-radius:999px;align-self:flex-start;line-height:1.5}
.slide-ttl{font-size:clamp(15px,6cqi,28px);font-weight:700;color:#fff;line-height:1.2;letter-spacing:-.5px}
.slide-sub{font-size:clamp(10px,2.9cqi,14px);color:rgba(255,255,255,.88);line-height:1.4}
.roller-dots{position:absolute;bottom:14px;left:0;right:0;display:flex;gap:6px;z-index:3;justify-content:center}
.rdot{width:7px;height:7px;border-radius:50%;background:rgba(255,255,255,.45);cursor:pointer;transition:all .2s;border:none;padding:0}
.rdot.on{background:#fff;width:20px;border-radius:999px}

.slide.img-slide{padding:0;gap:0}
.sban.img-sban{padding:0}

/* 우측 작은 배너 2개 (이미지형 광고 슬롯) */
.pick-side{display:flex;flex-direction:column;gap:10px}
.sban{border-radius:var(--radius-sm);padding:8% 8%;cursor:pointer;display:flex;flex-direction:column;justify-content:space-between;gap:1cqi;text-align:left;aspect-ratio:16/9;overflow:hidden;container-type:inline-size;transition:transform .15s,box-shadow .15s}
.content-inner:not(.board-mode) .pick-side{min-height:0}
.content-inner:not(.board-mode) .pick-side .sban{flex:1 1 0;min-height:0;aspect-ratio:auto}
.sban img{width:100%;height:100%;object-fit:cover;display:block}
.sban:hover{transform:translateY(-2px);box-shadow:var(--shadow)}
.sban-0{background:#F5F3FF;color:#5B21B6}
.sban-1{background:#FFF7ED;color:#9A3412}
.sban-tag{font-size:clamp(9px,4cqi,11px);font-weight:600;padding:.6cqi 2.5cqi;border-radius:999px;align-self:flex-start;line-height:1.5}
.sban-0 .sban-tag{background:#EDE9FE;color:#5B21B6}
.sban-1 .sban-tag{background:#FFEDD5;color:#9A3412}
.sban-ttl{font-size:clamp(13px,7cqi,17px);font-weight:700;line-height:1.3;letter-spacing:-.3px}
.sban-sub{font-size:clamp(10px,3.6cqi,12px);opacity:.85}

/* [2026-08-03 추가, 모바일 전용] 롤링+사이드 통합 슬라이드쇼(#rollerMobile) — PC/
   태블릿(721px 이상)은 기본값 그대로 숨김 유지, 위 .roller(#roller)/.pick-side
   CSS는 이 블록에서 전혀 안 건드림(선택자도 겹치지 않음). 720px 이하에서만 서로
   자리를 바꾼다 — .roller/.slide/.roller-dots/.rdot 클래스는 그대로 공유해서
   시각 스타일(둥근 모서리·16:9·점 표시 등)은 위 PC용 롤러와 동일하게 상속받는다. */
.pick-roller-mobile{display:none}
@media(max-width:720px){
  #roller,.pick-side{display:none}
  .pick-roller-mobile{display:block}
}

/* [2026-08-03 추가, 모바일 전용] 빠른 메뉴 — PICK 배너 바로 아래, 최근 인기글
   위. 커뮤니티 게시판 5개+공지사항+이벤트 7개를 4열 그리드로 배치(홈 mid에서만
   렌더링, cond는 layout.html). 아이콘 배경이미지 클래스(.bg-free 등)는 카테고리
   페이지(momya_category.css)와 동일 접미사를 재사용하되, .quick-menu-icon 과
   묶은 더 구체적인 선택자로만 걸어서 배지 색상 규칙(.badge.bg-free 등)과 전혀
   안 겹치게 했다 — 카테고리 페이지의 .category-icon-box.bg-free 와 같은 원리.
   [2026-08-03 수정, 실기기 확인 후] 배지용 .bg-free 등(529/2311행)이 background:
   축약형을 쓰는데, 그 규칙과 아래 .quick-menu-icon(수정 전)의 background-size가
   명시도(0,1,0)까지 우연히 같아서 파일 뒤쪽인 배지 규칙이 이겨 background-size
   가 초기값(auto)으로 되돌아갔다 — 이미지가 원본 크기 그대로 48px 박스에 잘려
   보인 원인. background-size/position/repeat 를 .quick-menu-icon.bg-X 복합
   선택자(명시도 0,2,0, 배지 규칙보다 항상 높음) 쪽으로 옮겨서 해결 — 이 사이트가
   이미 여러 번 겪은 "축약형이 형제 속성을 초기화하는" 함정과 같은 계열이지만,
   이번엔 축약형 자체가 아니라 명시도가 우연히 같은 별개 규칙이 파일 뒤쪽에서
   이긴 경우였다. background-color 는 base 규칙에서 뺐다 — 배지 규칙의 색이
   게시판마다 다른 톤이라(자유=회색, 생활정보=베이지 등) 그대로 두면 이미지
   로딩 전/실패 시 게시판별로 다른 배경색이 자연스럽게 폴백된다. */
.quick-menu{display:none}
@media(max-width:720px){
  .quick-menu{display:block;margin-bottom:28px}
}
.quick-menu-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px 6px}
.quick-menu-item{display:flex;flex-direction:column;align-items:center;gap:6px;text-decoration:none}
.quick-menu-icon{width:48px;height:48px;border-radius:14px}
.quick-menu-name{font-size:var(--fs-caption);font-weight:500;color:var(--text-2);text-align:center;word-break:keep-all}
.quick-menu-icon.bg-free,
.quick-menu-icon.bg-ss,
.quick-menu-icon.bg-preg,
.quick-menu-icon.bg-info,
.quick-menu-icon.bg-life,
.quick-menu-icon.bg-notice{background-size:cover;background-position:center;background-repeat:no-repeat}
.quick-menu-icon.bg-free{background-image:url('../img/free.webp')}
.quick-menu-icon.bg-ss{background-image:url('../img/ss.webp')}
.quick-menu-icon.bg-preg{background-image:url('../img/preg.webp')}
.quick-menu-icon.bg-info{background-image:url('../img/info.webp')}
.quick-menu-icon.bg-life{background-image:url('../img/tip.webp')}
.quick-menu-icon.bg-notice{background-image:url('../img/notices.webp')}
.quick-menu-icon.bg-notice.cat-event{background-image:url('../img/event.webp')}

/* [2026-08-03 추가, 모바일 전용] 홈 화면 "최근 인기글" 5개 — PICK 배너와 이벤트
   섹션 사이. 서버는 항상 렌더링(layout.html cond="$mid=='home' && ...")하고 PC는
   여기서 숨긴다 — 위 .pick-roller-mobile과 동일 원칙. 카드 자체(.pv-more-*)는
   post-view 관련글 더보기 섹션의 기존 CSS를 그대로 재사용한다. */
.hot-wrap{display:none}
@media(max-width:720px){
  .hot-wrap{display:block;margin-bottom:28px}
}
/* [2026-08-03 추가] 카드 사이 구분선 — .pv-more-item 자체(1041행)는 이 구분선이
   없는 상태 그대로 두고(post-view 관련글 더보기 섹션은 이번 요청 대상이 아니라
   변경 없이 유지), .hot-wrap 안에서만 카테고리 페이지/게시판 목록과 동일한
   var(--surface-2)로 추가했다. 마지막 카드는 다음 섹션(이벤트)과 바로 붙으므로
   :last-child 에서 제거. */
.hot-wrap .pv-more-item{border-bottom:1px solid var(--surface-2)}
.hot-wrap .pv-more-item:last-child{border-bottom:none}
/* [2026-08-03 추가] 썸네일 테두리 제거 — 원본 .pv-more-thumb(1048행, border:1px
   solid var(--border))는 글상세 관련글 더보기 섹션이 여전히 쓰므로 그대로 두고,
   이 섹션 안에서만 덮어썼다. */
.hot-wrap .pv-more-thumb{border:none}

/* [2026-08-03 추가, 홈 모바일 전용] 이벤트 카드 아래로 이어지는 실시간 인기/최신/
   추천순 탭+게시글 목록(.feed-col, 실제로는 홈 mid 에 배치된 momya_feed 위젯
   출력)을 숨긴다. .content-inner:not(.board-mode) 로 스코프를 좁혀서 안전하다 —
   $momya_content_mode 계산(layout.html)이 mid=='home' 일 때만 board-mode 클래스를
   안 붙이므로, 이 선택자는 홈 화면에서만 매치되고 hot/new/top(둘 다 board-mode
   적용 대상이라 이 선택자 자체가 안 걸림)·게시판 목록에는 전혀 영향 없다. */
@media(max-width:720px){
  .content-inner:not(.board-mode) .feed-col{display:none}
}

/* ── 이벤트 섹션 ── */
/* [2026-08-03 갱신] "이벤트" 글자만 초록으로 강조하던 .ev-label span{color:var(--green)}
   규칙을 제거 — .pick-label과 동일하게 "엄마야"와 같은 색으로 통일된다. */
/* [2026-08-03 갱신] 더보기 링크 추가로 flex 배치— 라벨 텍스트(첫 번째 자식)와
   링크(두 번째 자식)를 양끝 정렬. 텍스트가 여러 노드(로고+강조span)라 하나의
   flex item이 되도록 감싸는 span이 layout.html 쪽에 추가됐다(이 규칙만으론 부족,
   마크업도 같이 봐야 함). */
.ev-label{display:flex;align-items:center;justify-content:space-between;font-weight:700;font-size:17px;margin:0 0 11px;letter-spacing:-.5px}
/* [2026-08-03 추가] 모바일에서 헤더 로고와 같은 크기(var(--fs-head), 17px) — 값
   자체는 위 기본 규칙과 같지만, header .logo 모바일 규칙과 같은 토큰을 명시적으로
   참조해서 의도적으로 맞춘 값임을 코드에 남긴다(나중에 --fs-head 값이 바뀌면
   이 라벨도 같이 따라간다). PC는 이 미디어쿼리 밖이라 무관. */
@media(max-width:720px){
  .ev-label{font-size:var(--fs-head)}
}
.ev-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:0}
/* [2026-08-03 갱신] 테두리 색을 var(--border)(#E5E7EB)→var(--surface-2)(#F3F4F6)로
   — 카테고리 페이지 항목 구분선(momya_category.css)에 쓴 것과 동일한 톤으로 통일. */
.ev-card{border-radius:var(--radius-sm);overflow:hidden;cursor:pointer;border:1px solid var(--surface-2);container-type:inline-size;transition:transform .15s,box-shadow .15s}
.ev-card:hover{transform:translateY(-3px);box-shadow:var(--shadow)}
.ev-img{width:100%;height:120px;aspect-ratio:16/9;object-fit:cover;display:block}
.ev-img-ph{width:100%;height:120px;aspect-ratio:16/9;display:flex;align-items:center;justify-content:center;font-size:clamp(16px,12cqi,24px);font-weight:700;letter-spacing:-1px;padding:0 8%;text-align:center}
@supports (aspect-ratio:1){.ev-img,.ev-img-ph{height:auto}}
.ev-body{padding:10px 11px 12px}
/* [2026-08-03 갱신] 제목 2줄 허용(-webkit-line-clamp:2 + min-height:38px, 2줄분
   높이 예약)을 1줄 고정+말줄임으로 교체 — 길어도 카드가 늘어나지 않는다. 2줄
   예약용 min-height도 더 이상 필요 없어 제거(항상 1줄 높이로 고정되므로). */
.ev-ttl{font-size:13px;font-weight:600;color:var(--text);line-height:19px;margin-bottom:6px;letter-spacing:-.3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ev-sub{font-size:13px;color:var(--text-3);display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}

/* ── 공지/이벤트 섹션 리스트 ── */
.sec-head{font-weight:700;font-size:17px;letter-spacing:-.5px;margin:0 0 4px;display:flex;align-items:center;gap:8px}
.sec-desc{font-size:13px;color:var(--text-3);margin-bottom:16px}
/* [2026-08-03 추가, 모바일 전용] 공지사항/이벤트 목록 헤더 아이콘 제거 — 글자
   크기는 이미 17px(--fs-head)라 그대로 둠. .sec-head 는 아이콘(svg)+제목 텍스트
   뿐이라(list.html 확인) svg 자식만 지워도 안전하다. */
@media(max-width:720px){
  .sec-head svg{display:none}
}
.sec-list{list-style:none}
.sec-row{display:flex;align-items:center;gap:12px;padding:15px 8px;border-bottom:1px solid var(--border);cursor:pointer;transition:background .12s;border-radius:8px;position:relative}
.sec-row:hover{background:var(--surface-2)}
/* 행 전체 터치 영역(stretched-link, 2026-07-28 확정) — .post 와 동일 이유·동일 패턴 */
.sec-row-ttl::after{content:'';position:absolute;inset:0}
.sec-pin{font-size:11px;font-weight:700;color:#fff;background:var(--green);padding:2px 8px;border-radius:6px;flex-shrink:0}
.sec-state{font-size:11px;font-weight:600;padding:2px 9px;border-radius:999px;flex-shrink:0}
.sec-state.on{background:#DCFCE7;color:#166534}
.sec-state.off{background:#F3F4F6;color:var(--text-3)}
.sec-row-ttl{flex:1;min-width:0;font-size:14px;font-weight:600;color:var(--text);letter-spacing:-.3px;word-break:break-word}
.sec-row-meta{font-size:12px;color:var(--text-3);flex-shrink:0}

/* ── 검색 결과 ── */
.search-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px;flex-wrap:wrap}
.search-head-l{display:flex;align-items:baseline;gap:8px;min-width:0}
.search-head-ttl{font-size:17px;font-weight:700;letter-spacing:-.5px;color:var(--text)}
.search-head-ttl b{color:var(--green)}
.search-head-cnt{font-size:13px;color:var(--text-3);font-weight:600;flex-shrink:0}
.search-clear{background:var(--surface-2);border:1px solid var(--border);color:var(--text-2);font-family:inherit;font-size:12px;font-weight:600;border-radius:999px;padding:7px 14px;cursor:pointer;flex-shrink:0;transition:background .12s,color .12s}
.search-clear:hover{background:var(--border);color:var(--text)}
.search-list{list-style:none}
.search-row{padding:14px 8px;border-bottom:1px solid var(--border);cursor:pointer;border-radius:8px;transition:background .12s}
.search-row:hover{background:var(--surface-2)}
.search-row-main{display:flex;align-items:baseline;gap:8px;margin-bottom:6px}
.search-board{flex-shrink:0;font-size:11px;font-weight:600;color:var(--green);background:var(--green-soft);border-radius:6px;padding:2px 8px;line-height:1.6}
.search-ttl{font-size:15px;font-weight:600;color:var(--text);word-break:break-word;line-height:1.4}
.search-hl{background:#FEF08A;color:inherit;border-radius:3px;padding:0 1px}
.search-meta{font-size:12px;color:var(--text-3)}
/* 검색 도구바 — 기간/게시판/정렬/개수 드롭다운 + 검색 버튼 한 줄 */
.search-tools{margin:0 0 16px;padding:0 2px}
.sf-ddrow{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
/* 검색 버튼 (개수 옆) — 약간 둥근 사각형, 세로폭은 드롭다운에 맞춰 늘어남 */
.search-go-btn{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;width:44px;height:38px;box-sizing:border-box;border:none;border-radius:11px;background:var(--green);color:#fff;cursor:pointer;transition:filter .12s}
.search-go-btn:hover{filter:brightness(1.07)}
.search-go-btn svg{width:18px;height:18px}
/* 게시판 드롭다운 (게시판 수가 늘어도 안 깨지게 — 메뉴는 스크롤) */
.sf-dd{position:relative;display:inline-block}
.sf-dd-btn{display:inline-flex;align-items:center;gap:7px;height:38px;box-sizing:border-box;border:1px solid var(--border);background:#fff;border-radius:10px;padding:0 11px 0 14px;font-family:inherit;font-size:13px;font-weight:600;color:var(--text-2);cursor:pointer;transition:all .12s;white-space:nowrap}
.sf-dd-btn:hover{border-color:var(--border-2);color:var(--text);background:var(--surface-2)}
.sf-dd.sel .sf-dd-btn{background:var(--green-soft);border-color:var(--green);color:var(--green);font-weight:600}
.sf-dd-btn .sf-chev{width:13px;height:13px;color:var(--text-3);transition:transform .18s;flex-shrink:0}
.sf-dd-btn span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sf-dd.sel .sf-dd-btn .sf-chev{color:var(--green)}
.sf-dd.open .sf-chev{transform:rotate(180deg)}
.sf-dd-menu{position:absolute;top:calc(100% + 5px);left:0;background:#fff;border:1px solid var(--border);border-radius:10px;box-shadow:var(--shadow);padding:4px;display:none;z-index:30;min-width:148px;max-height:260px;overflow:auto}
.sf-dd.open .sf-dd-menu{display:block}
.sf-dd-menu button{display:block;width:100%;text-align:left;border:none;background:none;font-family:inherit;font-size:13px;font-weight:500;color:var(--text);padding:9px 13px;border-radius:7px;cursor:pointer;white-space:nowrap;transition:background .1s}
.sf-dd-menu button:hover{background:var(--surface-2)}
.sf-dd-menu button.sel{color:var(--green);font-weight:600;background:var(--green-soft)}
/* [마이페이지 디자인-23 수정] mypage_only.html 은 .sf-chev 대신 .pp-chev 를
   .sf-dd-btn 안에도 그대로 쓴다(perpage 드롭다운과 셰브론 클래스를 공용) —
   기존 .sf-dd-btn .sf-chev 규칙과 별개로 .pp-chev 전용 규칙이 필요하다. */
.sf-dd-btn .pp-chev{width:14px;height:14px;color:var(--text-3);transition:transform .18s;flex-shrink:0}
.sf-dd.open .pp-chev{transform:rotate(180deg)}
/* 저장한 글 카드의 "이동" 드롭다운처럼 좁은 공간에 쓰는 소형 변형 —
   라벨이 항상 고정 텍스트("이동")라 폴더 이름 길이와 무관하게 폭이 고정된다.
   [갱신, 디자인-25] height:33px — 기본 .sf-dd-btn(height:38px)보다 낮춰
   검색 버튼(.lp-search-btn)의 실제 렌더링 높이와 통일(사용자 결정, 프로토타입
   40px 규칙과 별개). box-sizing:border-box는 기본 .sf-dd-btn 규칙에서 이미
   상속되므로 재선언 불필요. */
.sf-dd-sm .sf-dd-btn{min-width:84px;height:33px;padding:6px 10px;font-size:var(--fs-caption);border-radius:7px}
.sf-dd-sm .sf-dd-menu{min-width:max-content;left:auto;right:0}
/* 기간 직접 지정 (날짜 범위) — 드롭다운 줄 아래 */
.sf-daterange{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-top:10px}
.sf-date{border:1px solid var(--border);border-radius:8px;padding:7px 10px;font-family:inherit;font-size:13px;color:var(--text);background:#fff;cursor:pointer}
.sf-date:focus{outline:none;border-color:var(--green);box-shadow:0 0 0 3px var(--green-soft)}
.sf-daterange .sf-tilde{color:var(--text-3);font-size:12px;font-weight:600}
@media(max-width:560px){
  .sf-ddrow{gap:7px}
  .sf-dd{min-width:0}
  #sddPeriod,#sddBoard{flex:1 1 calc(50% - 4px)}   /* 1줄: 전체 기간 · 전체 게시판 */
  #sddScope,#sddSort,#sddPer{flex:1 1 0}             /* 2줄: 검색범위 · 관련순 · 검색버튼 —
    [2026-07-31, 통합검색 momya 스킨] #sddScope(검색범위: 제목/제목+내용/내용/태그) 신규 추가.
    이 화면은 개수선택을 .sf-dd(#sddPer) 대신 .perpage 로 구현해 #sddPer 는 여전히
    아무 데서도 안 쓰이지만(죽은 셀렉터), 그대로 남겨둔다 — 제거해도 득 없고, 나중에
    다른 화면이 우연히 같은 id 를 쓸 일도 없다. */
  .sf-dd-btn{width:100%;justify-content:space-between}
  .search-go-btn{flex:0 0 50px;width:50px;border-radius:11px}
  .sf-date{flex:1;min-width:0}
}
/* PC: 드롭다운 가로폭 고정 (선택 라벨이 바뀌어도 박스 크기 그대로) */
@media(min-width:561px){
  .sf-dd-btn{justify-content:space-between}
  #sddPeriod .sf-dd-btn{width:120px}
  #sddBoard  .sf-dd-btn{width:134px}
  #sddScope  .sf-dd-btn{width:110px}
  #sddSort   .sf-dd-btn{width:100px}
  #sddPer    .sf-dd-btn{width:100px}
}

/* [마이페이지 디자인-19] 마이페이지 목록 검색줄(.sf-dd 재사용) — 프로토타입의
   .search-row 는 이 파일에 이미 다른 뜻(검색결과 목록의 클릭 가능한 행,
   243행)으로 쓰이고 있어 이름이 겹친다. 겹치면 두 규칙이 합쳐져 검색줄에
   엉뚱한 cursor:pointer/hover 배경이 섞여 들어가므로 새 이름(.dl-search-row)
   을 쓴다. .lp-search-input/.lp-search-btn 은 프로토타입 값 그대로 이식(신규). */
.dl-search-row{display:flex;align-items:center;gap:8px;margin:2px 0 4px}
.lp-search-input{flex:1;min-width:0;font-family:inherit;font-size:var(--fs-body);color:var(--text);border:1.5px solid var(--border-2);border-radius:9px;padding:9px 13px;outline:none;background:var(--surface);transition:border-color .15s,box-shadow .15s}
.lp-search-input::placeholder{color:var(--text-3)}
.lp-search-input:focus{border-color:var(--green);box-shadow:0 0 0 3px var(--green-soft)}
.lp-search-btn{flex-shrink:0;background:var(--black);color:#fff;border:none;border-radius:9px;padding:9px 18px;font-family:inherit;font-size:var(--fs-label);font-weight:500;cursor:pointer;transition:opacity .15s}
.lp-search-btn:hover{opacity:.82}
/* [마이페이지 디자인-27] 실제 flex 컨테이너는 .dl-search-row(class 붙은 div)가
   아니라 그 안의 <form style="display:flex;...">다 — 폼은 GET 검색 제출을 위해
   나중에 추가되면서 인라인 스타일로 flex를 다시 선언했는데, flex-wrap 은 그때
   같이 안 넣었다. 그 결과 아래 .dl-search-row{flex-wrap:wrap}은 자식이 폼 하나
   뿐인 바깥 div에만 적용돼 사실상 무효였고, 진짜 자식(드롭다운/입력칸/버튼)을
   담은 폼은 계속 nowrap이라 order 값만 반영돼 "드롭다운-버튼-입력칸" 순서로
   한 줄에 눌려 나왔다(입력칸 order:3이 버튼(order 미지정=0)보다 뒤로 밀림).
   해결: wrap은 실제 폼에 걸고, 입력칸의 order:3을 없애 DOM 순서(드롭다운→입력→
   버튼)가 그대로 살게 하고, 드롭다운만 flex-basis:100%로 줄을 통째로 차지해
   1줄엔 드롭다운만, 2줄엔 입력칸(넓게)+버튼(끝)이 오도록 만든다. 드롭다운이
   없는 화면(작성한 댓글, .sf-dd 자체가 없음)은 이 규칙이 그냥 안 걸리고
   입력칸+버튼만 한 줄에서 공유해 같은 효과를 낸다. */
@media(max-width:720px){
  .dl-search-row form{flex-wrap:wrap}
  .dl-search-row .sf-dd{flex:1 1 100%}
  .dl-search-row .lp-search-input{flex:1 1 auto;min-width:0}
  .dl-search-row .lp-search-btn{flex:0 0 auto}
}
/* [마이페이지 디자인-28] 위에서 .sf-dd를 flex-basis:100%로 만들어 줄을 혼자
   차지하게 한 것과, 이미 있던 @media(max-width:560px){.sf-dd-btn{width:100%;...}}
   (board 검색 필터용, 셀렉터가 클래스 하나뿐이라 .sf-dd-btn 전역에 걸림, 280행)
   가 겹치면서 실제 버튼 배경까지 줄 전체 폭으로 늘어나 있었다 — 줄바꿈은
   .sf-dd(래퍼)만 차지하면 되고 .sf-dd-btn 자체가 넓어질 필요는 없다.
   .dl-search-row .sf-dd-btn(클래스 2개)가 특이도상 그 전역 규칙(클래스 1개)을
   이기므로, 어느 media 블록에 있든 상관없이 이 규칙이 항상 적용된다. */
.dl-search-row .sf-dd-btn{width:auto;justify-content:flex-start}

.tabs{display:flex;gap:20px;border-bottom:1px solid var(--border);margin-bottom:4px}
.tab{font-size:14px;color:var(--text-2);padding:0 0 11px;cursor:pointer;position:relative;font-weight:500;transition:color .15s}
.tab:hover{color:var(--text)}
.tab.active{color:var(--green);font-weight:600}
.tab.active::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background:var(--green);border-radius:2px}
.period-bar{display:flex;gap:7px;padding:12px 0 4px}
.period-chip{font-size:12px;font-weight:500;color:var(--text-2);background:var(--surface-2);border:1px solid var(--border);border-radius:999px;padding:5px 13px;cursor:pointer;transition:all .12s;font-family:inherit}
.period-chip:hover{border-color:var(--border-2);color:var(--text)}
.period-chip.active{background:var(--green-soft);border-color:var(--green);color:var(--green);font-weight:600}

.feed{list-style:none}
/* [2026-08-03 갱신] 구분선 색을 var(--border)(#E5E7EB)에서 게시판 목록/카테고리
   페이지와 동일한 var(--surface-2)(#F3F4F6, 더 연함)로 통일. */
.post{display:flex;align-items:flex-start;gap:13px;padding:14px 8px;border-bottom:1px solid var(--surface-2);cursor:pointer;transition:background .12s;border-radius:8px;animation:rise .35s ease both;position:relative}
.post:hover{background:var(--surface-2)}
.post.no-vote .pbody{padding-left:2px}
/* 행 전체 터치 영역(stretched-link, 2026-07-28 확정) — 제목 링크 하나만 눌리던 걸
   행 전체로 넓힌다. 행 안에 제목과 다른 목적지로 가는 링크가 없어(썸네일도 같은 글로
   연결) z-index 별도 처리 없이 안전하다 */
.ptitle::after{content:'';position:absolute;inset:0}
@keyframes rise{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.vote{display:flex;flex-direction:column;align-items:center;gap:2px;flex-shrink:0;background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:7px 9px;min-width:46px;cursor:pointer;transition:all .12s;color:var(--text-2)}
.vote:hover{border-color:var(--green);background:var(--green-soft)}
.vote.voted{background:var(--green);border-color:var(--green);color:#fff}
.vote .vn{font-size:12px;font-weight:600;color:var(--text)}
.vote.voted .vn{color:#fff}
.pbody{flex:1;min-width:0}
.pmeta-top{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.badge{font-size:11px;font-weight:600;padding:3px 9px;border-radius:6px;white-space:nowrap;width:auto;text-align:center;box-sizing:border-box;flex-shrink:0;letter-spacing:-.2px}
/* [프로토타입 오버라이드 12] 목록/피드 제목만 15px 로 키움(원래 var(--fs-body)=14px) —
   작성 화면 제목 입력창(.title-textarea)이 15px라 쓸 때보다 목록에서 작아 보인다는
   체감 차이를 없애기 위한 의도적 변경(2026-07-24, board.momya.css 동일 규칙과 동기화).
   CSS 대조에서 "프로토타입은 14px"로 나와도 되돌리지 마라. */
.ptitle{font-size:15px;font-weight:600;margin:6px 0 0;color:var(--text);word-break:break-word;line-height:20px;height:40px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;letter-spacing:-.3px}
.flame{color:var(--green)}
.pmeta{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--text-3);margin-top:7px}
.pmeta .nick-grade>span{font-weight:500;color:var(--text-2)}
.pmeta .m{display:flex;align-items:center;gap:4px}
.bg-ss{background:#FEF2F2;color:#991B1B}
.bg-info{background:#F0FDF4;color:#166534}
.bg-preg{background:#F5F3FF;color:#5B21B6}
.bg-free{background:var(--surface-2);color:var(--text)}
.bg-buy{background:#FFFBEB;color:#92400E}
.bg-local{background:#EFF6FF;color:#1E40AF}
.bg-life{background:#FFFBEB;color:#92400E}
/* [마이페이지 디자인-23 수정] 공지사항/이벤트(mid: notices/event) — 다른 5개
   카테고리 배지(연한 배경+진한 글씨)와 달리 진한 초록 배경+흰 글씨로 눈에 띄게 */
.bg-notice{background:var(--green-d);color:#fff}
.pthumb{width:72px;height:72px;flex-shrink:0;border-radius:9px;overflow:hidden;align-self:center}
.pthumb img{width:100%;height:100%;object-fit:cover;display:block}
.pthumb-empty{width:72px;flex-shrink:0}

/* ── Modal ── */
.overlay{position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:60;display:none;align-items:flex-start;justify-content:center;padding:18px;overflow-y:auto;-webkit-overflow-scrolling:touch}
/* 약관/개인정보 모달 (가입 모달 위에 표시) */
.legal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:110;display:none;align-items:flex-start;justify-content:center;padding:18px;overflow-y:auto;-webkit-overflow-scrolling:touch}
.legal-overlay.show{display:flex;animation:fade .2s ease}
.legal-modal{background:var(--surface);border-radius:16px;width:100%;max-width:520px;margin:auto;animation:pop .22s cubic-bezier(.2,.9,.3,1.2) both;max-height:calc(100vh - 36px);display:flex;flex-direction:column;overflow:hidden}
.legal-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:18px 20px;border-bottom:1px solid var(--border);flex-shrink:0}
.legal-head h2{font-size:16px;font-weight:700;color:var(--text);letter-spacing:-.5px}
.legal-close{background:var(--surface-2);border:none;width:34px;height:34px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--text-2);transition:background .15s;flex-shrink:0}
.legal-close:hover{background:var(--border)}
.legal-body{padding:20px;overflow-y:auto;-webkit-overflow-scrolling:touch;font-size:13px;line-height:1.7;color:var(--text-2);white-space:pre-wrap;word-break:break-word}
.legal-body strong{display:block;color:var(--text);font-weight:600;font-size:14px;margin:16px 0 6px}
.legal-body strong:first-child{margin-top:0}
.overlay.show{display:flex;animation:fade .2s ease}
.overlay.show .modal{margin:auto}
@keyframes fade{from{opacity:0}to{opacity:1}}
.modal{background:var(--surface);border-radius:16px;width:100%;max-width:460px;padding:24px;animation:pop .22s cubic-bezier(.2,.9,.3,1.2) both;max-height:calc(100vh - 36px);overflow-y:auto;-webkit-overflow-scrolling:touch}
@keyframes pop{from{opacity:0;transform:translateY(12px) scale(.97)}to{opacity:1;transform:none}}
.modal h2{font-weight:700;font-size:20px;color:var(--text);letter-spacing:-.5px}
.modal .sub{font-size:12px;color:var(--text-2);margin:5px 0 18px}
.modal .sub b{color:var(--green)}
.field{margin-bottom:13px}
.field label{font-size:12px;color:var(--text-2);display:block;margin-bottom:5px;font-weight:500}
.field input,.field select,.field textarea{width:100%;font-family:inherit;font-size:14px;color:var(--text);border:1px solid var(--border-2);border-radius:9px;padding:10px 12px;background:var(--bg);outline:none;transition:border-color .15s,box-shadow .15s}
.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--green);box-shadow:0 0 0 3px var(--green-soft)}
.field textarea{resize:vertical;min-height:90px}
.two{display:flex;gap:10px}
.two .field{flex:1}
.modal-foot{display:flex;justify-content:flex-end;gap:9px;margin-top:6px}
.btn-ghost{background:none;border:1px solid var(--border-2);border-radius:9px;padding:10px 16px;font-family:inherit;font-size:13px;color:var(--text-2);cursor:pointer}
.btn-ghost:hover{background:var(--surface-2)}
.btn-submit{background:var(--green);color:#fff;border:none;border-radius:9px;padding:10px 18px;font-family:inherit;font-size:13px;font-weight:600;cursor:pointer}
.btn-submit:hover{background:var(--green-d)}

/* ── Drawer ── */
.drawer-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.6);z-index:100;display:none;opacity:0;transition:opacity .25s ease}
.drawer-overlay.show{display:block;opacity:1}
.drawer{position:fixed;top:0;left:0;bottom:0;width:240px;background:var(--surface);z-index:101;transform:translateX(-100%);transition:transform .25s ease;padding:20px;box-shadow:4px 0 24px rgba(0,0,0,.12)}
.drawer.show{transform:none}
.drawer-top{display:flex;align-items:center;justify-content:flex-end;margin-bottom:8px}
.drawer .dlogo{font-weight:700;font-size:20px;color:var(--black);letter-spacing:-1px}
.drawer-close{background:none;border:none;cursor:pointer;color:var(--text-2);display:flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;transition:background .15s;flex-shrink:0}
.drawer-close:hover{background:var(--surface-2)}
.ditem{display:flex;align-items:center;gap:12px;padding:10px 12px;border-radius:9px;font-size:14px;color:var(--text-2);cursor:pointer}
.ditem-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:24px;height:24px}
.ditem-icon svg{stroke:var(--text-3)}
.ditem.active .ditem-icon svg{stroke:var(--green)}
.ditem-icon.sb-avatar{border-radius:50%;color:#fff;font-size:11px;font-weight:700}
.ditem:hover{background:var(--surface-2);color:var(--text)}
.ditem.active{color:var(--green);font-weight:600;background:var(--green-soft)}
.ditem-badge{margin-left:auto;background:var(--red);color:#fff;font-size:var(--fs-micro);font-weight:700;line-height:1;padding:3px 6px;border-radius:999px}
.drawer-divider{height:1px;background:var(--border);margin:8px 0}

/* ── 알림벨 (2026-08-02 재구현, PC 전용 — 모바일은 720px 미디어쿼리에서 .notif-wrap 을
   숨기고, 드로어의 임시 "알림" 링크로 대신한다) ──
   .notif-item/.notif-empty 는 mypage_only_알람창.html 프로토타입의 컴포넌트를 그대로
   가져왔다 — b 대신 라이믹스 core lang 문구가 실제로 쓰는 strong 태그도 같이 스타일링한다. */
.notif-wrap{position:relative;flex-shrink:0}
.notif-dot{position:absolute;top:6px;right:6px;width:8px;height:8px;border-radius:50%;background:var(--red);border:2px solid #fff}
.notif-dd{position:absolute;top:calc(100% + 8px);right:0;width:340px;max-width:calc(100vw - 32px);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);display:none;z-index:50;overflow:hidden}
.notif-dd.open{display:block}
.notif-dd-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 16px;border-bottom:1px solid var(--border)}
.notif-dd-head span{font-size:var(--fs-label);font-weight:700;color:var(--text)}
.notif-clear-all{background:none;border:none;font-family:inherit;font-size:var(--fs-caption);font-weight:500;color:var(--text-3);cursor:pointer;padding:4px 6px;border-radius:6px;transition:all .15s;flex-shrink:0}
.notif-clear-all:hover{color:var(--red);background:var(--red-soft)}
.notif-dd .notif-list{max-height:360px;overflow-y:auto}
.notif-item{display:flex;align-items:flex-start;gap:10px;padding:13px 16px;border-bottom:1px solid var(--border);transition:background .12s}
.notif-item:last-child{border-bottom:none}
.notif-item:hover{background:var(--surface-2)}
.notif-item.unread{background:var(--green-soft)}
.notif-item.unread:hover{background:#E7F8ED}
.notif-item-dot{width:7px;height:7px;border-radius:50%;background:var(--green);flex-shrink:0;margin-top:7px}
.notif-item-dot.read{background:transparent}
.notif-item-body{flex:1;min-width:0}
.notif-item-text{font-size:var(--fs-label);color:var(--text-2);line-height:1.5;word-break:break-word}
.notif-item-text b,.notif-item-text strong{color:var(--text);font-weight:600}
.notif-item-time{font-size:var(--fs-micro);color:var(--text-3);margin-top:3px}
.notif-empty{padding:44px 20px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:8px}
.notif-empty svg{color:var(--text-3)}
.notif-empty-title{font-size:var(--fs-label);font-weight:600;color:var(--text-2)}
.notif-empty-desc{font-size:var(--fs-caption);color:var(--text-3)}
.notif-dd-all{display:block;text-align:center;padding:11px;font-size:var(--fs-caption);font-weight:600;color:var(--text-2);border-top:1px solid var(--border)}
.notif-dd-all:hover{background:var(--surface-2);color:var(--text)}
@media(max-width:480px){
  .notif-dd{position:fixed;top:56px;right:12px;left:12px;width:auto;max-width:none}
}

/* ── 알림 전체화면 페이지(modules/ncenterlite/skins/momya/NotifyList.html, PC/모바일
   겸용) ──
   PC/랩탑(1024px 이상): 별도 처리 없음 — layout.html 이 다른 게시판과 동일한 사이드바+배너
   레이아웃으로 이미 감싸주므로 이 파일은 뒤로가기 헤더를 숨긴 채(.notif-page-header
   기본값 display:none) 가운데 콘텐츠만 평범하게 놓인다.
   모바일+태블릿/폴드(1023px 이하): 전역 헤더 대신 뒤로가기 헤더로 전환 + 다른 화면
   (is-search-view)의 배너 숨김과 동일한 body 클래스 패턴을 재사용하되, 그건 전 폭에서
   숨기고 이건 이 폭에서만 숨긴다는 차이가 있다(PC/랩탑에서는 board-mode 배너 컬럼을
   그대로 보여줘야 하므로 media query 밖으로 빼면 안 된다).
   [갱신, 2026-08-02] 기존엔 720px 이하(순수 모바일)에서만 적용했는데, 태블릿/폴드
   펼침 너비(721~1023px)에서 배너가 그대로 보이고 뒤로가기 버튼도 없이 방치되는 문제가
   실기기에서 확인됐다 — 이 프로젝트가 다른 화면(momya list.html 의 .pick-area/.pick-side/
   .ev-grid 등)에 이미 쓰고 있는 태블릿/폴드 경계값 1023px 로 통일해서 1023px 이하 전체를
   이 화면 취급으로 넓혔다. */
.notif-page-header{display:none}
@media(max-width:1023px){
  /* [원인 확정, 2026-08-02] .notif-page-header 자신도 <header> 태그라(NotifyList.html
     43행 <header class="notif-page-header">), 전역 헤더를 겨눈 이 디센던트 셀렉터
     (body.is-notif-view header)가 명시도(0,0,1,1)로 바로 아래 .notif-page-header{
     display:flex}(0,0,1,0)를 이겨버려 뒤로가기 헤더 자신까지 같이 display:none이
     됐었다 — 로컬 목업(실제 momya.css를 그대로 받아 CSSOM으로 매칭 규칙을 직접
     열거)으로 재현·확정. mypage_fullpage_start.html 이 자기 자신의 미니헤더를
     header:not(.mp-fp-header) 로 이미 걸러낸 것과 동일한 원리로 여기도 걸러낸다. */
  body.is-notif-view header:not(.notif-page-header){display:none}
  body.is-notif-view .banner-col{display:none!important}
  /* [이슈1, 2026-08-02] main{padding:22px 20px}(전역, 61행)의 top이 .notif-page-header
     에도 그대로 적용돼 뷰포트 최상단에서 22px 밀려 여백이 과도해 보였다 — 마이페이지
     쉘이 겪은 것과 동일한 문제(body.is-mypage-view main{padding-top:0}, 위 1773행)를
     실측으로 이미 확정해둔 그대로 재사용한다. mypage와 달리 이 화면은 PC/랩탑(1024px
     이상)에서는 뒤로가기 헤더 자체를 안 쓰므로(기본값 display:none, 위 506행) 이
     override 도 동일하게 이 media query 안에서만 적용한다 — PC에서는 전역 헤더가
     그대로 있으니 그 아래 22px 여백이 여전히 필요하다. */
  body.is-notif-view main{padding-top:0}
  .notif-page-header{position:sticky;top:0;z-index:40;display:flex;align-items:center;gap:10px;padding:11px 16px;background:rgba(255,255,255,.93);backdrop-filter:blur(12px);border-bottom:1px solid var(--border)}
  .notif-page-header .notif-back{background:none;border:none;cursor:pointer;color:var(--text);display:flex;align-items:center;padding:6px;border-radius:8px;margin-left:-6px}
  .notif-page-header .notif-page-title{font-size:var(--fs-head);font-weight:700;color:var(--text)}
}
.notif-page-body{max-width:600px;margin:0 auto}
.notif-load-more{display:block;width:100%;margin-top:10px;padding:11px;background:var(--surface-2);border:none;border-radius:9px;font-family:inherit;font-size:var(--fs-caption);font-weight:600;color:var(--text-2);cursor:pointer;transition:background .15s}
.notif-load-more:hover{background:var(--border-soft)}
.notif-load-more:disabled{opacity:.6;cursor:default}

/* ── 카테고리 전체화면 페이지(widgets/momya_category, PC/모바일 겸용, 모바일 앱형 UI
   3단계, 2026-08-03) ── 알림 전체화면 페이지(.notif-page-header/is-notif-view)와
   완전히 동일한 패턴을 이름만 바꿔 재사용한다 — 명시도 함정(header 자신이 <header>
   태그라 전역 헤더 숨김 규칙에 같이 걸리는 것)도 이미 그쪽에서 확정된 해법
   (header:not(...))을 그대로 적용해뒀다. */
.category-page-header{display:none}
@media(max-width:1023px){
  body.is-category-view header:not(.category-page-header){display:none}
  body.is-category-view .banner-col{display:none!important}
  /* [2026-08-03 갱신] padding-top뿐 아니라 좌우도 0으로 — main은 이 폭에서도
     좌우 패딩이 남아있어(예: 720px 이하 13px/14px), 카드 그룹의 회색 배경
     (#F3F4F8, momya_category.css)이 그 패딩만큼 안쪽에서 시작해 화면 가장자리에
     body의 흰 배경이 테두리처럼 남아 보였다(실사용자 재현) — is-notif-view는
     흰 배경 위에 흰 리스트라 이 패딩이 안 보였을 뿐 같은 구조였다. 카드 그룹의
     바깥 여백은 이제 main이 아니라 .category-page-body 자신의 padding(12px)이
     전담한다. */
  body.is-category-view main{padding:0}
  /* [2026-08-03 추가] 카드 맨 아래(마지막 카드 이후)도 여전히 흰 배경이 보이는
     문제 — 원인은 두 가지 다 main의 형제/자손인데 자기 배경이 없어 body의 흰색이
     그대로 비치는 것: (1) modules/page/tpl/content.html 이 관리자(manager grant)
     에게만 {$page_content}(=이 위젯 출력) 뒤에 붙이는 .btnArea(캐시파일 재생성/
     설정/페이지 수정 버튼, 코어 마크업이라 momya가 새로 만든 게 아님 — 일반
     회원에게는 애초에 안 보임) — main 안에 있음. (2) <footer>(layout.html, "엄마야 ·
     익명 육아 커뮤니티") — margin/padding만 있고 배경이 없어 그 여백만큼 흰색이
     남음, main과 형제 요소라 main 배경만으로는 안 닿음. 개별 요소마다 배경을
     맞추는 대신 body 자체를 이 폭에서 회색으로 칠해 두 경우 다 한 번에 해결 —
     이후 core가 이 영역에 다른 걸 더 추가해도 계속 커버된다. */
  body.is-category-view{background:#F3F4F8}
  .category-page-header{position:sticky;top:0;z-index:40;display:flex;align-items:center;gap:10px;padding:11px 16px;background:rgba(255,255,255,.93);backdrop-filter:blur(12px);border-bottom:1px solid var(--border)}
  .category-page-header .category-back{background:none;border:none;cursor:pointer;color:var(--text);display:flex;align-items:center;padding:6px;border-radius:8px;margin-left:-6px}
  .category-page-header .category-page-title{font-size:var(--fs-head);font-weight:700;color:var(--text)}
}

/* ── Auth Modal ── */
.auth-modal{max-width:420px;padding:32px 32px 24px;position:relative;min-height:320px;max-height:calc(100vh - 36px);overflow-y:auto;-webkit-overflow-scrolling:touch}
/* 공통 닫기 버튼 (마이페이지 등은 동그라미 유지) */
.auth-close{position:absolute;top:16px;right:16px;background:var(--surface-2);border:none;width:32px;height:32px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--text-2);transition:background .15s;z-index:3}
.auth-close:hover{background:var(--border)}
/* 가입/로그인 모달: 동그라미 없이 X만, 제목과 세로 가운데 정렬 */
.auth-modal .auth-close{background:none;border-radius:0;top:30px;right:22px;color:var(--text-3);transition:color .15s}
.auth-modal .auth-close:hover{background:none;color:var(--text)}
.auth-back{position:absolute;top:18px;left:22px;background:none;border:none;cursor:pointer;color:var(--text-3);display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;margin:0;transition:color .15s;z-index:3}
.auth-back:hover{color:var(--text)}
/* 뒤로가기가 있는 스텝에서는 X를 상단 행으로 올려 뒤로가기와 한 줄 정렬 */
.auth-modal:has(.auth-step[style*="block"] .auth-back) .auth-close{top:18px}
/* 뒤로가기가 있는 스텝은 제목을 버튼 아래로 내림 */
.auth-step:has(.auth-back) .auth-title{margin-top:26px}
.auth-logo{font-weight:700;font-size:22px;color:var(--green);letter-spacing:-1px;margin-bottom:10px}
.auth-title{font-weight:700;font-size:16px;letter-spacing:-.5px;margin-bottom:8px}
.auth-desc{font-size:13px;color:var(--text-2);line-height:1.6;margin-bottom:22px}
.auth-link{color:var(--green);cursor:pointer;text-decoration:none;font-weight:500}
.auth-link:hover{text-decoration:underline}
.auth-req{color:var(--red)}
.auth-label{font-size:12px;font-weight:600;color:var(--text-2);display:block;margin-bottom:6px}
.auth-field-wrap{margin-bottom:16px}
.auth-input{width:100%;font-family:inherit;font-size:14px;color:var(--text);border:1.5px solid var(--border-2);border-radius:10px;padding:12px 14px;background:var(--bg);outline:none;transition:border-color .15s,box-shadow .15s}
.auth-input:focus{border-color:var(--green);box-shadow:0 0 0 3px var(--green-soft)}
.auth-input::placeholder{color:var(--text-3)}
.auth-hint{font-size:11px;color:var(--text-3);margin-top:5px}
.auth-err{font-size:12px;color:var(--red);margin-top:5px;min-height:16px}
.auth-btn{width:100%;background:var(--green);color:#fff;border:none;border-radius:10px;padding:13px;font-family:inherit;font-size:14px;font-weight:600;cursor:pointer;margin-top:4px;transition:background .15s,opacity .15s;letter-spacing:-.2px}
.auth-btn:hover:not(:disabled){background:var(--green-d)}
.auth-btn:disabled{background:var(--border-2);color:var(--text-3);cursor:not-allowed}
.auth-foot-txt{font-size:13px;color:var(--text-2);text-align:center;margin-top:18px}

.code-row{display:flex;align-items:center;gap:10px}
.code-input{flex:1}
.code-timer{font-size:14px;font-weight:600;color:var(--red);flex-shrink:0;min-width:38px;text-align:right}
.nick-row,.pw-row{display:flex;align-items:center;gap:8px}
.nick-row .auth-input,.pw-row .auth-input{flex:1}
.nick-check-btn{background:var(--surface-2);border:1.5px solid var(--border-2);border-radius:9px;padding:11px 13px;font-family:inherit;font-size:13px;font-weight:600;color:var(--text-2);cursor:pointer;white-space:nowrap;transition:all .15s;flex-shrink:0}
.nick-check-btn:hover{border-color:var(--green);color:var(--green)}
.pw-row .pw-eye{background:none;border:none;cursor:pointer;color:var(--text-3);display:flex;align-items:center;padding:0 4px;position:absolute;right:12px;top:50%;transform:translateY(-50%)}
.pw-row{position:relative}
.pw-row .auth-input{padding-right:40px}
.auth-agree{border:1.5px solid var(--border);border-radius:10px;padding:14px;margin-bottom:14px}
.agree-row{display:flex;align-items:center;gap:9px;padding:5px 0;cursor:pointer;font-size:13px;color:var(--text-2);user-select:none}
.agree-row input[type=checkbox]{width:16px;height:16px;accent-color:var(--green);cursor:pointer;flex-shrink:0}
.agree-row span{flex:1}
.agree-view{font-size:12px;color:var(--green);text-decoration:none;flex-shrink:0}
.agree-view:hover{text-decoration:underline}
.all-agree{font-weight:600;color:var(--text)}
.agree-divider{height:1px;background:var(--border);margin:8px 0}
.step-indicator{display:flex;justify-content:center;gap:6px;margin-top:22px}
.step-dot{width:7px;height:7px;border-radius:50%;background:var(--border-2);transition:all .2s}
.step-dot.active{background:var(--green);width:20px;border-radius:999px}
.done-wrap{text-align:center;padding:20px 0 10px}
.done-icon{width:64px;height:64px;border-radius:50%;background:var(--green-soft);color:var(--green);display:flex;align-items:center;justify-content:center;margin:0 auto}
.auth-step{animation:rise .25s ease both}

/* ── Mypage Modal ── */
.mypage-modal{max-width:460px;padding:28px 28px 0;position:relative;display:flex;flex-direction:column;max-height:90vh}
.mp-profile{display:flex;align-items:center;gap:14px;margin-bottom:22px;padding-right:32px}
.mp-avatar{width:48px;height:48px;border-radius:50%;background:var(--green);color:#fff;display:flex;align-items:center;justify-content:center;font-size:20px;font-weight:700;flex-shrink:0}
.mp-nick{font-size:16px;font-weight:700;letter-spacing:-.3px}
.mp-email{font-size:12px;color:var(--text-2);margin-top:2px}
.mp-tabs{display:flex;border-bottom:1.5px solid var(--border);margin:0 -28px;padding:0 28px;gap:22px;flex-shrink:0}
.mp-tab{font-size:14px;font-weight:500;color:var(--text-2);padding:0 0 11px;cursor:pointer;position:relative;transition:color .15s}
.mp-tab:hover{color:var(--text)}
.mp-tab.active{color:var(--green);font-weight:600}
.mp-tab.active::after{content:"";position:absolute;left:0;right:0;bottom:-1.5px;height:2px;background:var(--green);border-radius:2px}
.mp-panel{flex:1;overflow-y:auto;padding:14px 0 0;min-height:180px;max-height:320px}
.mp-list{list-style:none}
.mp-post-item{padding:12px 4px;border-bottom:1px solid var(--border);cursor:pointer;transition:background .12s;border-radius:7px}
.mp-post-item:hover{background:var(--surface-2)}
.mp-post-board{font-size:11px;font-weight:600;padding:2px 7px;border-radius:5px;display:inline-block;margin-bottom:4px}
.mp-post-title{font-size:14px;font-weight:600;color:var(--text);line-height:1.35}
.mp-post-meta{font-size:11px;color:var(--text-3);margin-top:4px;display:flex;gap:10px}
.mp-empty{padding:40px 0;text-align:center;color:var(--text-3);font-size:13px}
.mp-info-row{display:flex;align-items:center;justify-content:space-between;padding:13px 0;border-bottom:1px solid var(--border)}
.mp-info-label{font-size:13px;color:var(--text-2);font-weight:500}
.mp-info-val{font-size:13px;color:var(--text)}
.mp-nick-edit{display:flex;align-items:center;gap:10px}
.mp-edit-btn{background:none;border:1px solid var(--border-2);border-radius:7px;padding:4px 10px;font-family:inherit;font-size:12px;color:var(--text-2);cursor:pointer}
.mp-edit-btn:hover{border-color:var(--green);color:var(--green)}
.mp-logout-btn{width:calc(100% + 56px);margin:16px -28px 0;border:none;border-top:1px solid var(--border);padding:15px;font-family:inherit;font-size:14px;font-weight:600;color:var(--red);background:none;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:7px;border-radius:0 0 16px 16px;transition:background .15s}
.mp-logout-btn:hover{background:#FEF2F2}


/* ── 글 상세 ── */
.post-view{position:fixed;inset:0;background:var(--bg);z-index:70;display:none;flex-direction:column}
.post-view.show{display:flex;animation:pvIn .22s ease}
@keyframes pvIn{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:none}}
.pv-bar{border-bottom:1px solid var(--border-soft);background:var(--surface);position:sticky;top:0;z-index:2}
.pv-bar-inner{max-width:720px;margin:0 auto;display:flex;align-items:center;gap:8px;padding:11px 18px}
.pv-bar-inner .pv-back{margin-left:-8px}
.pv-bar-inner .pv-report-btn,.pv-bar-inner .pv-share{margin-right:-8px}
.pv-back,.pv-share{background:none;border:none;cursor:pointer;color:var(--text);display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:50%;transition:background .15s;flex-shrink:0}
.pv-back:hover,.pv-share:hover{background:var(--surface-2)}
.pv-bar-title{flex:1;font-weight:700;font-size:var(--fs-section);color:var(--text)}
/* 저장(스크랩) — 헤더의 다른 아이콘과 같은 모양·크기 */
.pv-save-btn{background:none;border:none;cursor:pointer;color:var(--text);display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:50%;transition:background .15s,color .15s;flex-shrink:0}
.pv-save-btn:hover{background:var(--surface-2)}
.pv-save-btn.on{color:var(--green)}
/* 아이콘이 여러 개일 때 마지막 것만 가장자리에 붙인다 */
.pv-bar-inner .pv-report-btn,.pv-bar-inner .pv-share,.pv-bar-inner .pv-save-btn{margin-right:0}
.pv-bar-inner .pv-report-btn:last-child,.pv-bar-inner .pv-share:last-child,.pv-bar-inner .pv-save-btn:last-child,.pv-bar-inner .cmt-menu-wrap:last-child{margin-right:-8px}
.pv-scroll{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch}
.pv-inner{max-width:720px;margin:0 auto;padding:20px 18px 60px}
.pv-badge{font-size:var(--fs-micro);font-weight:600;padding:3px 10px;border-radius:6px;display:inline-block;margin-bottom:12px}
/* [2026-08-03 갱신] 공지사항/이벤트 글상세 상단 뱃지(.pv-badge)와 하단 "다른
   공지사항/이벤트" 미니 목록 뱃지(.pv-more-badge)를 완전히 동일한 스타일(초록
   배경+흰 글씨)로 통일 — 처음엔 상단만 바꾸고 하단은 기존 스타일(연한 배경+색
   글씨)로 남겨 일부러 분리했었으나, 후속 요청으로 "다르게 보이는 게 의도가
   아니라 완전히 같게"로 확정돼 값을 맞췄다. 선택자 자체는 그대로 분리 유지
   (다른 게시판 .pv-more-badge 는 이 두 규칙과 무관, 영향 없음). 기존 이벤트
   뱃지는 사실 초록이 아니라 주황 계열(#FFF7ED/#9A3412)이었다. */
.pv-badge.notice{background:var(--green);color:#fff}
.pv-badge.event{background:var(--green);color:#fff}
.pv-more-badge.notice{background:var(--green);color:#fff}
.pv-more-badge.event{background:var(--green);color:#fff}
.pv-avatar-admin{background:var(--green-soft)!important;color:var(--green)!important}
.pv-title{font-size:var(--fs-title);font-weight:700;line-height:1.4;letter-spacing:-.5px;color:var(--text);margin-bottom:14px;word-break:break-word}
.pv-author{display:flex;align-items:center;gap:10px;margin-bottom:20px}
.pv-avatar{width:40px;height:40px;border-radius:50%;background:var(--surface-2);color:var(--text-3);display:flex;align-items:center;justify-content:center;flex-shrink:0}
.pv-avatar svg{width:22px;height:22px}
.pv-author-info{flex:1;min-width:0}
/* [버그 수정, 2026-07-31, 간격 통일] 원래 flex 가 아니라 일반 인라인 흐름이라
   닉네임과 등급배지 사이 간격이 "줄바꿈이 한 칸으로 붕괴된 공백"(글꼴에 따라
   다름, 실측 약 4~5px) + .grade-tag.inline{margin-left:4px} 를 더한 값(실측
   8.6px)으로 다른 5곳과 전혀 다른 값이었다. flex+gap:3px 로 바꿔 다른 곳과
   동일한 간격으로 통일 — 이 안엔 닉네임(3종 중 하나)·등급배지·비회원배지가
   전부 형제로 들어있어 별도 래퍼 삽입 없이 부모 규칙만 바꾸면 된다. */
.pv-author-name{display:flex;align-items:center;gap:3px;font-size:var(--fs-label);font-weight:500;color:var(--text-2)}
.pv-author-name .grade-tag.inline{margin-left:0}
.pv-author-meta{font-size:var(--fs-caption);color:var(--text-3);margin-top:2px;display:flex;gap:10px}
.pv-author-meta span{display:flex;align-items:center;gap:3px}
.pv-body{font-size:var(--fs-card);line-height:1.8;color:var(--text);white-space:normal;word-break:break-word;margin-bottom:24px}
/* 라이믹스 본문은 p/br 마크업으로 출력되는데, 코어 rhymix.scss 의 .xe_content p 가
   문단마다 자체 margin 을 또 넣어(rhymix.scss:38) pv-body 의 line-height 여백과 이중으로
   쌓인다. 프로토타입은 실제 <p> 없이 줄바꿈만 있는 순수 텍스트라 이 문제가 없다.
   .xe_content p 와 명시도를 맞추기 위해 momya-read 두 클래스로 무효화한다 */
.momya-read .pv-body .xe_content{line-height:1.8}
/* 본문에 삽입된 표가 화면 폭을 넘기지 않도록 표 자체를 스크롤 컨테이너로 만든다.
   셀 구조(tr/td)는 그대로 두고 표 요소에만 적용 (board.momya.css 동일 규칙과 동기화) */
@media(max-width:720px){
  .momya-read .pv-body table{display:block;overflow-x:auto;max-width:100%}
}
/* 표 셀 기본 여백 — momyaTableGrid 삽입 시 인라인 style로도 넣지만, 인라인 스타일 없이
   붙여넣기 등으로 들어온 표까지 커버하는 기본값(class 없이 태그 선택자만 사용 — 이유는
   config.js 의 momyaTableGrid insertTable() 주석 참고, mediafilter.classes 허용 여부를
   확인할 수 없어 class 의존을 피한다). (board.momya.css 동일 규칙과 동기화) */
/* [긴급] 표에 테두리가 전혀 없어(기본값 border:0) 구조는 멀쩡해도 육안으로는 "표가
   사라진 것처럼" 보였다 — 실제 라이브 글(info/14197)의 렌더링된 DOM을 getComputedStyle로
   직접 재보고 확인(border:0px none, 그 외 display/visibility/치수는 전부 정상). 데이터
   손실이 아니라 순수 시각 결함. border-collapse 로 셀 테두리를 합쳐 이중선 없이 격자를
   표시한다 (board.momya.css 동일 규칙과 동기화) */
.momya-read .pv-body table{border-collapse:collapse}
.momya-read .pv-body table td,.momya-read .pv-body table th{padding:8px;min-height:20px;border:1px solid var(--border-2)}
/* [확인, 2026-07-30] 본문 링크가 텍스트로만 보이는 문제 — 실제 라이브 글(free/14292)의
   렌더링된 DOM을 직접 재봐 확인. autolink 애드온은 정상(<a> 태그 생성·target=_blank
   부여 둘 다 코드로 확인 완료) — 원인은 27행(momya.css 자기 자신 안의) 사이트 전역
   리셋 a{color:inherit;text-decoration:none}. 그 리셋은 그대로 두고(다른 링크들이
   의존) 본문 스코프에서만 더 높은 명시도로 되살린다. (board.momya.css 동일 규칙과 동기화) */
.momya-read .pv-body a{color:var(--link);text-decoration:underline}
/* [수정, 2026-07-30] 위 규칙이 링크 미리보기 카드(write_form.html momyaInsertLinkCard()
   가 삽입하는 .link-preview-card — 마크업 확인: .lp-img a(썸네일 감싸는 링크, 텍스트
   없음) + .lp-title a(제목 텍스트, momyaEscapeHtml(data.title) — 원본 URL 문자열이
   아니라 실제로 가져온 페이지/영상 제목))의 a 태그에도 그대로 걸려, 원래
   .lp-title{color:var(--text)}(1249행대, 카드 전용 의도된 스타일)로 검게 보이던
   제목 텍스트가 파란 밑줄로 바뀌어 있었다 — color 는 상속되는 값이라 자식 a 를 직접
   겨냥하는 규칙이 없으면 그대로 검게 보였을 것을, 이 회차에서 추가한 위 규칙이 직접
   타겟팅해 상속을 덮어썼다. .link-preview-card 라는 이미 구분되는 클래스가 있어 그
   스코프 안에서만 되돌린다 — 밑줄 여부는 사용자 요청대로 안 건드리고 색만 되돌림.
   (board.momya.css 동일 규칙과 동기화) */
.momya-read .pv-body .link-preview-card a{color:var(--text)}
/* 취소선이 크기가 다른 구간을 통째로 감싸면(<s><span style="font-size:32px">..</span></s>)
   취소선 위치가 <s>의 부모 폰트 기준으로 고정돼 실제 글자 크기와 안 맞아 보인다(CSS 표준
   동작 — text-decoration은 지정된 요소의 폰트로 위치가 정해진다). 크기가 다시 지정된
   자손에 text-decoration을 다시 명시하면 그 자손 자신의 폰트 기준으로 다시 잡힌다
   (board.momya.css 동일 규칙과 동기화)
   [2026-07-28, C1 후속] 위 규칙만으로는 안쪽 span에 선을 하나 더 그릴 뿐 바깥 s
   자신의 기본 line-through(여전히 어긋난 위치)가 남아 두 줄로 겹쳐 보인다 —
   s가 font-size 지정된 span을 직접 자식으로 가질 때만 s 자신의 선을 끈다
   (board.momya.css 동일 규칙과 동기화) */
.momya-read .pv-body s span[style*="font-size"]{text-decoration:line-through}
.momya-read .pv-body s:has(> span[style*="font-size"]){text-decoration:none}
/* [줄 간격 fallback 확정] Enter(문단 분리)로 쓴 글이 Shift+Enter(<br>)로 쓴 글보다 넓어
   보였다 — line-height 는 둘 다 27.2px(모바일 실측, free/14211 vs ss/10443)로 동일했고
   차이는 문단 사이 margin-bottom:4px 뿐이었다(<br> 는애초에 margin 이 안 붙는다).
   버튼을 안 눌러도 항상 "같은 화면"이어야 한다는 요구라 문단 margin 을 0으로 없애 <br>
   과 리듬을 맞춘다 — 여러 문단 붙여쓰기와 줄바꿈이 시각적으로 구분 안 되는 트레이드오프는
   있음(design 결정 필요시 재검토) */
.momya-read .pv-body p{margin:0;line-height:1.7}
.pv-img{width:100%;border-radius:12px;margin:8px 0 20px;display:block}
.pv-vote-row{display:flex;justify-content:center;gap:10px;padding:2px 0 6px;margin-bottom:22px}
.pv-vote{display:flex;flex-direction:row;align-items:center;justify-content:center;gap:8px;border:1px solid transparent;background:var(--surface-2);border-radius:999px;padding:11px 0;cursor:pointer;transition:all .15s;width:128px;flex:none}
.pv-vote svg{width:20px;height:20px}
.pv-vote:hover{background:#E9EBEF}
.pv-vote.up.on{background:var(--green-soft);color:var(--green)}
.pv-vote.up.on .pv-vote-n{color:var(--green)}
.pv-vote.down:hover{background:#FEF2F2}
.pv-vote.down.on{background:#FEF2F2;color:var(--red)}
.pv-vote.down.on .pv-vote-n{color:var(--red)}
.pv-vote-n{font-size:var(--fs-card);font-weight:700;color:var(--text)}
.pv-vote-l{font-size:var(--fs-caption);font-weight:500;color:var(--text-3)}
.pv-actions{display:flex;gap:8px;margin:-10px 0 22px}
.pv-act{flex:1;display:flex;align-items:center;justify-content:center;gap:7px;border:1.5px solid transparent;background:var(--surface-2);border-radius:999px;padding:11px 0;cursor:pointer;font-family:inherit;font-size:var(--fs-label);font-weight:600;color:var(--text-2);transition:all .15s}
.pv-act svg{width:18px;height:18px}
.pv-act:hover{border-color:var(--green);background:var(--green-soft);color:var(--green)}
.pv-act.on{border-color:var(--green);background:var(--green);color:#fff}
.pv-act.on svg{stroke:#fff;fill:#fff}
.pv-cmt-head{font-size:var(--fs-head);font-weight:700;margin-bottom:15px;padding-top:22px;border-top:1px solid var(--border)}
.pv-cmt-head span{color:var(--green)}
.pv-best-label{font-size:var(--fs-micro);font-weight:600;color:var(--green);background:var(--green-soft);padding:2px 8px;border-radius:5px}
.pv-cmt{display:flex;gap:11px;padding:0;margin-bottom:15px}

.pv-cmt-avatar{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:var(--surface-2);color:var(--text-3)}
.pv-cmt-avatar svg{width:18px;height:18px}
.pv-cmt-body{flex:1;min-width:0}
.pv-cmt-top{display:flex;align-items:center;gap:8px;margin-bottom:7px}
.cmt-top-left{display:flex;align-items:center;gap:7px;min-width:0;flex:1}
.cmt-top-right{display:flex;align-items:center;gap:8px;flex-shrink:0}
.pv-cmt-nick{font-size:var(--fs-label);font-weight:500;color:var(--text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pv-cmt-time{font-size:var(--fs-caption);color:var(--text-3)}
.pv-cmt-txt{font-size:var(--fs-card);line-height:1.65;color:var(--text);word-break:break-word}
.pv-cmt-img{margin-top:8px}
.pv-cmt-img img{max-width:200px;max-height:200px;width:auto;border-radius:10px;border:1px solid var(--border);cursor:zoom-in;display:block;object-fit:cover}
.pv-reply-img-btn{background:#fff;border:1px solid transparent;border-radius:var(--radius-sm);width:40px;min-height:40px;display:flex;align-items:center;justify-content:center;color:var(--text-2);cursor:pointer;flex-shrink:0;transition:all .15s}
.pv-reply-img-btn:hover{border-color:var(--green);color:var(--green)}
.pv-reply-img-preview{position:relative;display:inline-flex;margin-top:9px}
.pv-reply-img-preview img{max-width:120px;max-height:120px;border-radius:10px;display:block}
/* [6] max-width:120px 자체는 이미 프로토타입과 일치했지만(border 만 프로토타입에 없는 값이라
   제거), 1349행의 momya-module img{max-width:100%;height:auto} 와 명시도가 동률(클래스1+
   엘리먼트1)이라 소스 순서에 기대면 불안정하다 — momya-comment 로 명시도를 확실히 올린다 */
.momya-comment .pv-reply-img-preview img{max-width:120px;max-height:120px;border-radius:10px;display:block}
.pv-reply-img-del{position:absolute;top:-7px;right:-7px;width:22px;height:22px;border-radius:50%;background:var(--black);color:#fff;border:2px solid #fff;cursor:pointer;font-size:var(--fs-caption);line-height:1;display:flex;align-items:center;justify-content:center;padding:0}
/* .imgview-overlay 제거함(2026-07-28) — 자체 이미지 뷰어 폐기, PhotoSwipe만 사용 */
/* PhotoSwipe 공유 버튼·파일명 캡션 숨김 — 확대·닫기 버튼만 유지(2026-07-28 확정).
   addons/photoswipe 자체 CSS 파일은 안 건드리고 여기서 !important 로 덮는다 */
.pswp__button--share,.pswp__caption{display:none!important}
.pv-cmt-actions{display:flex;align-items:center;gap:14px;margin-top:11px}
.pv-cmt-act.cmt-reply{margin-left:auto;margin-right:12px}
.pv-cmt-act{display:flex;align-items:center;gap:4px;font-size:var(--fs-caption);line-height:1;color:var(--text-2);cursor:pointer;text-decoration:none}
.pv-cmt-act svg{width:16px;height:16px;display:block;flex-shrink:0}
.pv-cmt-act:hover{color:var(--green)}
.pv-cmt-act.on{color:var(--green)}
.pv-cmt-act-down.on{color:var(--red)}
.pv-cmt-box{position:sticky;bottom:0;background:var(--surface);border-top:1px solid var(--border);border-top-color:var(--border-soft);padding:12px 14px;display:flex;gap:9px;align-items:center}
.pv-cmt-input{flex:1;border:1px solid transparent;border-radius:999px;padding:9px 15px;font-family:inherit;font-size:var(--fs-label);outline:none;background:var(--surface-2)}
.pv-cmt-input:focus{border-color:var(--green)}
.pv-cmt-send{background:var(--green);color:#fff;border:none;border-radius:999px;padding:9px 16px;font-family:inherit;font-size:var(--fs-label);font-weight:600;cursor:pointer;flex-shrink:0}


.pv-op-badge{font-size:11px;font-weight:600;padding:2px 7px;border-radius:5px;background:#DCFCE7;color:var(--green-d);flex-shrink:0}

/* 댓글 입력 영역 */

.pv-reply-inputs{display:flex;gap:8px;margin-bottom:9px}
.pv-reply-nick,.pv-reply-pw{flex:1;border:1px solid var(--border-2);border-radius:9px;padding:9px 12px;font-family:inherit;font-size:13px;outline:none;background:var(--bg);color:var(--text);min-width:0}
.pv-reply-nick:focus,.pv-reply-pw:focus{border-color:var(--green)}
.pv-reply-row{display:flex;gap:8px;align-items:flex-end}
.pv-reply-txt{flex:1;border:1px solid var(--border-2);border-radius:12px;padding:10px 14px;font-family:inherit;font-size:13px;outline:none;background:var(--bg);resize:none;min-height:40px;max-height:120px;line-height:1.5}
.pv-reply-txt:focus{border-color:var(--green)}
.pv-reply-send{background:var(--green);color:#fff;border:none;border-radius:999px;padding:10px 18px;font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;flex-shrink:0;white-space:nowrap}
.pv-reply-send:hover{background:var(--green-d)}

/* ── 댓글 입력 개선 ── */
.pv-reply-box{border-top:none;padding:12px;background:var(--surface-2);border-radius:var(--radius);margin-top:14px}
.pv-reply-meta{display:flex;align-items:center;gap:8px;margin-bottom:9px}
.pv-reply-nick{flex:1;border:1px solid transparent;border-radius:var(--radius-sm);padding:9px 12px;font-family:inherit;font-size:var(--fs-label);outline:none;background:#fff;color:var(--text);min-width:0;transition:border-color .15s}
.pv-reply-nick:focus{border-color:var(--green)}
.pv-reply-pw{flex:1;border:1px solid transparent;border-radius:var(--radius-sm);padding:9px 12px;font-family:inherit;font-size:var(--fs-label);outline:none;background:#fff;color:var(--text);min-width:0;transition:border-color .15s}
.pv-reply-pw:focus{border-color:var(--green)}
.pv-reply-logged{display:flex;align-items:center;gap:8px;flex:1;padding:7px 0}
.pv-reply-logged-nick{font-size:var(--fs-label);font-weight:500;color:var(--text-2)}
.pv-reply-nick-change{background:#fff;border:1.5px solid transparent;border-radius:var(--radius-sm);padding:4px 10px;font-family:inherit;font-size:var(--fs-caption);font-weight:500;color:var(--text-2);cursor:pointer;transition:all .15s;white-space:nowrap}
.pv-reply-nick-change:hover{border-color:var(--green);color:var(--green)}
.pv-reply-nick-hint{font-size:var(--fs-micro);color:var(--text-3);display:flex;align-items:center;white-space:nowrap}
.pv-reply-nick[readonly]{background:#fff;color:var(--text-2);cursor:default}
.pv-reply-img-btn.on{border-color:var(--green);color:var(--green)}
.pv-reply-meta #pvMemberNick{flex:0 0 auto;width:130px}

.pv-reply-row{display:flex;gap:8px;align-items:flex-end}
.pv-reply-txt{flex:1;border:1px solid transparent;border-radius:var(--radius-sm);padding:10px 12px;font-family:inherit;font-size:var(--fs-label);outline:none;background:#fff;color:var(--text);resize:none;min-height:40px;max-height:120px;line-height:1.5;transition:border-color .15s}
.pv-reply-txt:focus{border-color:var(--green)}
.pv-reply-send{background:var(--green);color:#fff;border:none;border-radius:var(--radius-sm);padding:0 18px;height:40px;font-family:inherit;font-size:var(--fs-label);font-weight:600;cursor:pointer;flex-shrink:0;white-space:nowrap;transition:background .15s}
.pv-reply-send:hover{background:var(--green-d)}

/* ── 글쓴이 답글 스타일 ── */
.pv-cmt.is-op{padding-left:42px;background:none;padding-top:10px;padding-bottom:14px}
/* 답글 바로 앞 댓글(부모)은 아래 선 제거 → 댓글-답글 사이 선 없음 */
.pv-cmt:has(+ .pv-cmt.is-op){border-bottom:none;padding-bottom:6px}
.pv-cmt.parent-of-op{border-bottom:none;padding-bottom:6px}
.pv-cmt.is-op .pv-cmt-avatar{background:var(--green-soft);color:var(--green)}
.pv-op-badge{font-size:var(--fs-micro);font-weight:600;padding:2px 6px;border-radius:4px;background:#DCFCE7;color:var(--green-d);flex-shrink:0}

.pv-cmt{position:relative}
.cmt-tr{position:absolute;top:10px;right:0;display:flex;align-items:center;gap:7px}
.cmt-tr .pv-cmt-time{margin:0}
.cmt-menu-wrap{position:relative}
.cmt-menu-btn{background:none;border:none;cursor:pointer;color:var(--text-3);width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:6px;padding:0;transition:color .12s,background .12s;flex-shrink:0}
.cmt-menu-btn:hover{color:var(--text);background:var(--surface-2)}
.cmt-menu{position:absolute;top:28px;right:0;background:#fff;border:1px solid var(--border);border-radius:11px;box-shadow:var(--shadow);padding:5px;min-width:118px;z-index:30;display:none}
.cmt-menu.show{display:block}
.cmt-menu button{display:block;width:100%;background:none;border:none;cursor:pointer;font-family:inherit;font-size:var(--fs-label);color:var(--text);padding:10px 12px;border-radius:8px;text-align:left;transition:background .12s}
.cmt-menu button:hover{background:var(--surface-2)}
.cmt-menu button.danger{color:var(--red)}
.cmt-member-act{display:inline-flex;align-items:center;gap:4px;font-size:var(--fs-caption);color:var(--text-2);cursor:pointer;transition:color .12s}
.cmt-member-act.edit:hover{color:var(--green)}
.cmt-member-act.del:hover{color:var(--red)}
.cmt-act-dot{color:var(--border-2);font-size:var(--fs-micro)}
.cmt-edit-area{margin-top:8px;display:none}
.cmt-edit-area.open{display:block}
.cmt-edit-textarea{width:100%;font-family:inherit;font-size:var(--fs-body);color:var(--text);border:1.5px solid var(--border-2);border-radius:9px;padding:9px 12px;outline:none;resize:none;min-height:60px;line-height:1.5;transition:border-color .15s}
.cmt-edit-textarea:focus{border-color:var(--green)}
.cmt-edit-foot{display:flex;justify-content:flex-end;gap:6px;margin-top:6px}
.cmt-edit-save{background:var(--green);color:#fff;border:none;border-radius:7px;padding:6px 14px;font-family:inherit;font-size:var(--fs-caption);font-weight:600;cursor:pointer}
.cmt-edit-cancel{background:none;border:1.5px solid var(--border-2);border-radius:7px;padding:6px 11px;font-family:inherit;font-size:var(--fs-caption);font-weight:500;color:var(--text-2);cursor:pointer}

/* ── 인라인 답글 폼 (프로토타입 pv-inline-reply, board.momya.css 와 동일 유지) ──
   음수 마진으로 아바타(32)+gap(11) 밀림을 상쇄해 깊이와 무관하게 댓글 작성 폼과 같은 폭을 유지한다.
   기본(깊이 0 댓글의 답글 폼) = -(32+11) = -43px, .is-reply 안에 중첩되면 그 padding-left(42px)만큼 더 = -85px */
.pv-inline-reply{display:none;margin:12px 0 14px -43px;background:var(--surface-2);border-radius:var(--radius);padding:10px}
.pv-inline-reply.open{display:block}
.momya-comment .pv-cmt.is-reply{padding-left:42px}
.momya-comment .pv-cmt.is-reply .pv-inline-reply{margin-left:-85px}
@media(max-width:720px){
  .momya-comment .pv-cmt.is-reply{padding-left:28px}
  .momya-comment .pv-cmt.is-reply .pv-inline-reply{margin-left:-71px}
}


/* 삭제 확인 모달 */
.del-overlay{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:90;display:none;align-items:center;justify-content:center;padding:20px}
.del-overlay.show{display:flex;animation:fadeDelIn .18s ease}
@keyframes fadeDelIn{from{opacity:0}to{opacity:1}}
.del-modal{background:#fff;border-radius:14px;width:100%;max-width:320px;padding:22px 20px;animation:popDel .2s cubic-bezier(.2,.9,.3,1) both}
@keyframes popDel{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
.del-modal-title{font-size:16px;font-weight:700;color:var(--text);margin-bottom:6px}
.del-modal-desc{font-size:13px;color:var(--text-2);margin-bottom:16px;line-height:1.5}
.del-pw-wrap{border:1.5px solid var(--border-2);border-radius:9px;padding:10px 13px;display:flex;align-items:center;gap:8px;margin-bottom:8px;transition:border-color .15s}
.del-pw-wrap:focus-within{border-color:var(--red)}
.del-pw-input{flex:1;border:none;outline:none;font-family:inherit;font-size:14px;color:var(--text);background:none}
.del-pw-input::placeholder{color:var(--text-3)}
.del-pw-err{font-size:12px;color:var(--red);min-height:16px;margin-bottom:10px}
.del-foot{display:flex;gap:8px;justify-content:flex-end}
.del-cancel-btn{background:none;border:1.5px solid var(--border-2);border-radius:8px;padding:9px 15px;font-family:inherit;font-size:13px;font-weight:500;color:var(--text-2);cursor:pointer}
.del-cancel-btn:hover{border-color:var(--text)}
.del-confirm-btn{background:#ef4444;color:#fff;border:none;border-radius:8px;padding:9px 15px;font-family:inherit;font-size:13px;font-weight:600;cursor:pointer}
.del-confirm-btn:hover{background:var(--red-d)}

/* ── 신고 기능 ── */
.pv-report-btn{background:none;border:none;cursor:pointer;color:var(--text-2);display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:50%;transition:background .15s,color .15s;flex-shrink:0}
.pv-report-btn:hover{background:var(--red-soft);color:var(--red)}
.cmt-report{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;background:none;color:var(--border-2);cursor:pointer;border-radius:50%;transition:color .12s,background .12s;flex-shrink:0}
.cmt-report:hover{color:var(--red)}
.pv-cmt-act-down:hover{color:var(--red)}

.report-overlay{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:95;display:none;align-items:center;justify-content:center;padding:20px}
.report-overlay.show{display:flex;animation:fadeDelIn .18s ease}
.report-modal{background:#fff;border-radius:16px;width:100%;max-width:360px;padding:20px;animation:popDel .2s cubic-bezier(.2,.9,.3,1) both;max-height:85vh;overflow-y:auto}
.report-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}
.report-title{font-size:16px;font-weight:700;color:var(--text)}
.report-x{background:none;border:none;cursor:pointer;color:var(--text-3);width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:50%;font-size:14px;line-height:1;transition:background .15s}
.report-x:hover{background:var(--surface-2);color:var(--text)}
.report-desc{font-size:13px;color:var(--text-2);margin-bottom:16px;line-height:1.5}
.report-reasons{display:flex;flex-direction:column;gap:8px;margin-bottom:14px}
.report-reason{display:flex;align-items:center;gap:10px;padding:11px 13px;border:1.5px solid var(--border-2);border-radius:11px;cursor:pointer;font-size:14px;font-weight:500;color:var(--text);transition:all .12s;user-select:none}
.report-reason:hover{border-color:var(--red);background:var(--red-soft)}
.report-reason.on{border-color:var(--red);background:var(--red-soft);color:var(--red-d);font-weight:600}
.report-radio{width:18px;height:18px;border-radius:50%;border:2px solid var(--border-2);flex-shrink:0;display:flex;align-items:center;justify-content:center;transition:border-color .12s}
.report-reason.on .report-radio{border-color:var(--red)}
.report-reason.on .report-radio::after{content:"";width:9px;height:9px;border-radius:50%;background:var(--red)}
.report-detail{width:100%;font-family:inherit;font-size:14px;color:var(--text);border:1.5px solid var(--border-2);border-radius:11px;padding:10px 13px;outline:none;resize:none;min-height:64px;line-height:1.5;transition:border-color .15s;margin-bottom:6px}
.report-detail:focus{border-color:var(--red)}
.report-err{font-size:12px;color:var(--red);min-height:16px;margin-bottom:8px}
.report-foot{display:flex;gap:8px}
.report-cancel-btn{flex:1;background:none;border:1.5px solid var(--border-2);border-radius:10px;padding:11px 0;font-family:inherit;font-size:14px;font-weight:600;color:var(--text-2);cursor:pointer;transition:border-color .15s}
.report-cancel-btn:hover{border-color:var(--text)}
.report-submit-btn{flex:1.4;background:var(--red);color:#fff;border:none;border-radius:10px;padding:11px 0;font-family:inherit;font-size:14px;font-weight:600;cursor:pointer;transition:background .15s,opacity .15s}
.report-submit-btn:hover:not(:disabled){background:var(--red-d)}
.report-submit-btn:disabled{opacity:.45;cursor:not-allowed}

/* ── 게시글 하단 더보기 목록 ── */
.pv-more-section{padding:22px 0 0;border-top:1px solid var(--border);border-top-color:var(--border-soft);margin-top:24px}
.pv-more-head{font-size:var(--fs-head);font-weight:700;color:var(--text);letter-spacing:-.3px;margin-bottom:12px;display:flex;align-items:center;justify-content:space-between}
.pv-more-head-right{font-size:var(--fs-label);font-weight:500;color:var(--text-3);cursor:pointer}
.pv-more-head-right:hover{color:var(--green)}
.pv-more-head-right{text-decoration:none}
/* 관리자 전용 : 댓글 수치 일괄 조정 페이지 링크 (board.momya.css 와 동일 유지) */
.pac-bulk{font-size:12px;font-weight:600;color:var(--green-d);text-decoration:none;border:1px solid var(--border-2);border-radius:7px;padding:6px 12px;white-space:nowrap}
.pac-bulk:hover{border-color:var(--green);background:var(--green-soft)}
.pv-more-list{list-style:none}
.pv-more-item{display:flex;align-items:center;gap:10px;padding:12px 6px;cursor:pointer;border-radius:8px;transition:background .12s;min-height:80px}
.pv-more-item:last-child{border-bottom:none}
.pv-more-item:hover{background:var(--surface-2)}
.pv-more-badge{font-size:var(--fs-micro);font-weight:600;padding:3px 4px;border-radius:5px;white-space:nowrap;flex-shrink:0;margin-top:0;width:78px;text-align:center;box-sizing:border-box}
.pv-more-body{flex:1;min-width:0}
.pv-more-title{font-size:var(--fs-body);font-weight:600;color:var(--text);line-height:1.4;margin-bottom:4px;word-break:break-word;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.pv-more-meta{font-size:var(--fs-caption);color:var(--text-3);display:flex;gap:8px}
.pv-more-thumb{width:56px;height:56px;flex-shrink:0;border-radius:8px;overflow:hidden;border:1px solid var(--border)}
.pv-more-thumb-empty{width:56px;height:56px;flex-shrink:0}
/* 320px 안팎 좁은 폭: 배지(78px 고정)+썸네일(56px 고정)에 눌려 pv-more-body 가 122px까지
   좁아지면 닉네임/추천/댓글 span 들이 flex-shrink 로 눌리며 텍스트 내부가 줄바꿈돼
   뭉개진다(실기기 확인, 2026-07-24). span 낱개가 깨지는 대신 통째로 다음 줄로
   넘어가게 wrap 만 허용 — 배지/썸네일 확정 크기는 그대로 둔다 */
@media(max-width:360px){
  .pv-more-meta{flex-wrap:wrap;row-gap:2px}
}
/* 320px 안팎: 제목에 122px밖에 안 남는 문제(2026-07-26 실측) — 배지 고정폭(78px)을
   풀고, 썸네일 없는 글은 빈 56px 자리를 아예 없애 제목 폭을 넓힌다. 390px 이상은
   프로토타입 설계 폭이라 유지([1]과 동일 389px 기준, 2026-07-27 확정) */
@media(max-width:389px){
  .pv-more-badge{width:auto}
  .pv-more-thumb-empty{width:0;display:none}
}
.pv-more-thumb img{width:100%;height:100%;object-fit:cover;display:block}

/* 닉네임 인라인 수정 */
.pv-nick-edit-row{display:none;align-items:center;gap:6px;flex:1}
.pv-nick-edit-row.show{display:flex}
.pv-nick-edit-input{flex:1;border:1.5px solid var(--green);border-radius:8px;padding:7px 10px;font-family:inherit;font-size:var(--fs-label);outline:none;background:var(--bg);color:var(--text)}
.pv-nick-edit-save{background:var(--green);color:#fff;border:none;border-radius:7px;padding:6px 11px;font-family:inherit;font-size:var(--fs-caption);font-weight:600;cursor:pointer;white-space:nowrap}
.pv-nick-edit-cancel{background:none;border:1.5px solid var(--border-2);border-radius:7px;padding:6px 9px;font-family:inherit;font-size:var(--fs-caption);font-weight:500;color:var(--text-2);cursor:pointer;white-space:nowrap}

footer{max-width:1060px;margin:10px auto 40px;padding:18px 20px;color:var(--text-3);font-size:12px;text-align:center}

.desktop-only{display:block}
.mobile-search-bar{display:none;border-top:1px solid var(--border);background:#fff;padding:8px 14px;animation:searchDown .18s ease}
@keyframes searchDown{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
.mobile-search-bar.show{display:block}
.mobile-search-inner{display:flex;align-items:center;gap:9px;background:var(--surface-2);border:1px solid var(--border);border-radius:999px;padding:9px 14px}
.mobile-search-inner svg{flex-shrink:0;color:var(--text-3)}
.mobile-search-inner input{border:none;outline:none;background:none;font-family:inherit;font-size:14px;width:100%;color:var(--text)}
.mobile-search-inner input::placeholder{color:var(--text-3)}
.mobile-search-inner button{background:none;border:none;cursor:pointer;color:var(--text-3);display:flex;align-items:center;flex-shrink:0;padding:2px}

/* 태블릿+모바일: 세부 카테고리(board-mode) 배너를 오른쪽 고정 대신 세로 스택 */
/* 목록/피드 페이지의 board-mode 세로 스택은 사이드바가 실제로 숨는 720px 기준에
   맞춘다(이전엔 1024px 기준이라 721~1024px 구간에서 사이드바는 보이는데 콘텐츠는
   이미 세로로 눌려 쌓이는 불일치가 있었다 — 글상세가 761행대 주석에서 이미 지적한
   것과 같은 종류의 "column 규칙 기준 불일치" 버그, 2026-07-22 수정).
   721~1024px 구간은 이제 베이스 규칙(53~86행, flex-direction:row, 배너 240px 고정)을
   그대로 쓴다. is-post-view(글상세) 쪽 별도 오버라이드(728행~)는 안 건드렸다. */
@media(max-width:720px){
  .content-inner.board-mode{flex-direction:column;gap:0;align-items:stretch}
  .content-inner.board-mode .banner-col{display:contents}   /* 래퍼 풀어서 자식을 직접 배치 */
  .content-inner.board-mode .pick-wrap{order:1;margin-bottom:18px}
  .content-inner.board-mode .feed-col{order:2}
  .content-inner.board-mode .ev-wrap{order:3;margin-top:24px}
  .bar{padding:12px 16px;gap:8px}
  /* [모바일 앱형 UI 2단계, 2026-08-03] 바로 아래 .logo{font-size:20px} 단독 규칙은 실제로는
     계속 무효였다 — 코드 대조로 확인: momya.css 뒤쪽의 "글쓰기 페이지 CSS"/"마이페이지 CSS"
     구간(각각 죽은 프로토타입 .fullpage-overlay 흔적, 그 래퍼 자체는 실사용 0건으로 확인됨)에
     스코프 없는 .logo{font-size:22px} 중복 정의가 이 규칙보다 파일 뒤쪽에 있어(중괄호 안 셀렉터
     구체성은 동일 — 나중 선언이 이김) 모바일에서도 항상 22px로 되돌아가고 있었다(기존
     20px 값이 화면에 반영된 적이 없는 사전부터의 버그). 이번에 요청받은 "PICK 라벨과 동일
     크기로" 변경을 실제로 반영시키려면 그 뒤쪽 중복들보다 구체성을 높여야 해서
     header .logo(요소+클래스)로 스코프를 좁혔다 — 이러면 원인이 된 그 중복들보다 셀렉터
     자체가 더 구체적이라 파일 내 위치와 무관하게 항상 이긴다. PC 쪽 .logo(22px, 33/1186/1657행)
     은 이번 프로젝트 원칙대로 그대로 둠.
     [2026-08-03 갱신] 17px 리터럴 대신 var(--fs-head) 토큰으로 교체 — .pick-label/
     .ev-label의 모바일 크기도 같은 토큰을 참조하도록 맞춰서, 세 곳이 "같은 크기"라는
     관계가 우연한 숫자 일치가 아니라 코드에 명시적으로 남도록 했다(값 자체는 17px로
     동일, 시각적 변화 없음). */
  header .logo{font-size:var(--fs-head)}
  /* [2026-08-04 추가] 실기기(Android) 확인 결과 line-height:1 만으로는 완전히
     안 맞고 로고가 텍스트 하단보다 약 2~4px 아래로 처져 보인다는 신고 — 로컬
     환경(대체 폰트)에서는 0px로 정확히 맞아 재현이 안 돼, 신고받은 범위의
     중간값으로 보정했다. 그래도 어긋나 보이면 이 값만 다시 조정하면 된다. */
  .logo-img{height:19px;margin-top:-3px}
  .logo{gap:3px}
  .desktop-search,.btn-logout-txt,.btn-write,.btn-mypage-icon,.btn-signup,.btn-login{display:none!important}
  .only-mobile{display:flex}
  /* [모바일 앱형 UI 2단계, 2026-08-03] 알림벨(.notif-wrap)이 이제 모바일에도 보인다 —
     위 줄(desktop-search 등)과 같은 미디어쿼리 안에서 .btn-write/.btn-mypage-icon도
     같이 숨겼으므로(2026-07-22 "글쓰기 버튼은 모바일에서도 안 숨김" 결정을 이번 개편에
     맞춰 의도적으로 재변경 — momya_helpers.php 등 다른 로직과는 무관, 순수 CSS 변경),
     모바일 헤더 우측엔 이제 알림벨만 남는다.
     [2-2단계 후속, 2026-08-03] .btn-signup/.btn-login도 같은 줄에 추가해서 같이 숨겼다 —
     하단 탭바에 비회원용 로그인/회원가입 탭이 이미 있어 헤더에 중복 노출되고 있었다
     (실사용자 재현 확인). 이 두 버튼의 모바일 전용 크기 조정 규칙(padding:8px 14px;
     font-size:13px)도 이제 안 보이게 돼 무의미해져서 같이 지웠다 — .btn-write/
     .btn-mypage-icon 때와 동일한 정리 패턴. PC는 무변경(탭바 자체가 PC엔 없으므로
     헤더의 가입/로그인 버튼이 여전히 유일한 진입점 — 그대로 유지). */
  .logo{margin-right:auto}
  main{padding:13px 14px}
  /* [모바일 앱형 UI 2-2단계, 2026-08-03, 부수 발견] 바로 위 main{padding:13px 14px}도
     지금까지 계속 무효였다 — 실측(라이브 사이트를 모바일 폭으로 열어 getComputedStyle로
     직접 확인)해보니 실제 padding-bottom은 13px가 아니라 50px였다. 원인은 momya.css
     뒤쪽 "글쓰기 페이지 CSS"(글쓰기 화면 전용으로 의도됐던 것으로 보이지만 스코프 없이
     작성된 구간)의 스코프 없는 main{padding:14px 12px 50px}가 이 규칙보다 파일 뒤쪽에
     있어(동일 구체성, 나중 선언이 이김) 항상 이겼기 때문 — 위 .logo 사고와 정확히 같은
     유형이다. 이번엔 그 레거시 규칙을 직접 고치는 대신(다른 속성(flex-direction 등)에
     대한 이해가 불충분해 건드리면 부작용 위험) body main(요소 2개, 그 레거시 규칙보다
     구체적)으로 새로 걸어서 파일 내 위치와 무관하게 항상 이기도록 했다. 탭바 높이(56px)
     + 여유 12px만큼만 늘린다 — 다른 3면(top/left/right)은 건드리지 않는다. */
  body main{padding-bottom:calc(var(--tabbar-h) + 12px)}
  /* [2-2단계 후속, 2026-08-03] <footer>{$momya_footer}</footer>(layout.html:291)가
     <main>의 형제 요소라 위 body main 규칙(main 자신의 내부 여백)의 적용 범위 밖이다
     — main의 padding-bottom은 main 내부 콘텐츠만 보호할 뿐, main이 끝난 뒤에 오는
     footer에는 아무 여백도 만들어주지 않는다(실사용자 재현: 푸터 문구가 탭바에 살짝
     가려짐). header/main/footer를 공통으로 감싸는 상위 컨테이너가 이 파일에 없어서
     (전부 body의 직계 형제), footer 하나만 고치는 대신 body 자체에 걸었다 — 지금은
     footer가 마지막 콘�텐츠지만, 나중에 body 끝에 뭔가 또 추가돼도 매번 그 요소를
     찾아 따로 여백을 걸 필요 없이 이 규칙 하나로 계속 커버된다. body{}는 이 파일에
     기존 정의가 딱 하나뿐이고(35행, padding/margin 없음) footer{}도 마찬가지(957행,
     중복 없음) — 위 .logo/main과 달리 이번엔 구체성을 신경 쓸 필요가 없어 그냥
     걸었다. */
  body{padding-bottom:calc(var(--tabbar-h) + 12px)}
  /* [모바일 앱형 UI 2-2단계, 2026-08-03] 토스트 2종이 새 탭바에 가리지 않도록 bottom을
     올린다 — 이 파일에 .toast가 2번(위 라인 + 뒤쪽 "마이페이지 CSS" 구간에 스코프 없는
     중복) 정의돼 있어, 여기서도 같은 이유로 body .toast(구체성 확보)로 건다. PC(721px
     이상)는 그대로 bottom:26px 유지 — 이 규칙은 720px 이하에서만 적용됨. */
  body .toast{bottom:calc(var(--tabbar-h) + 14px)}
  body .mpToast{bottom:calc(var(--tabbar-h) + 14px)}
  .sidebar{display:none}
  .layout{display:block}
  .pick-area{grid-template-columns:1fr}
  .pick-side{flex-direction:row}
  .pick-side .sban{flex:1 1 0;min-width:0}
  .content-inner:not(.board-mode) .pick-side .sban{aspect-ratio:16/9;flex:1 1 0;min-width:0;min-height:auto}
  .ev-grid{grid-template-columns:repeat(2,1fr)}
  .content-inner.board-mode .pick-side{flex-direction:row}
  .content-inner.board-mode .pick-side .sban{flex:1 1 0;min-width:0}
  .content-inner.board-mode .ev-grid{grid-template-columns:repeat(2,1fr);gap:14px;margin-bottom:0}

  /* 모바일: 홈/게시판 배너 크기 통일 (16:9, 폭 기준 자동 높이).
     min-height 폴백은 삭제(2026-07-24) — aspect-ratio 가 이제 전 대상 브라우저에서
     지원돼 폴백이 오히려 320px 근방에서 aspect-ratio 계산값(190px 미만)을 강제로
     늘려 이미지 위에 빈 여백이 생기는 버그였다(진단 근거: 337.8px=190÷(9/16) 미만
     롤러 폭에서 재현, 그 이상에서 소멸 확인). */
  .roller,
  .content-inner.board-mode .roller{aspect-ratio:16/9}
  .content-inner.board-mode .pick-label{margin-bottom:11px}

  /* 모바일: board-mode 이벤트 카드도 일반 크기로 복원 */
  .content-inner.board-mode .ev-label{margin:0 0 11px}
  .content-inner.board-mode .ev-img-ph{font-size:22px;font-weight:700}
  /* [2026-08-03 갱신] 이벤트 카드 제목을 모바일에서만 한 단계 키움 — 헤더 로고
     (var(--fs-head), 17px)보다는 작아야 함. 처음엔 홈 13→14px/게시판 15px로
     격차를 유지했으나, 같은 날 후속 요청으로 게시판을 홈과 완전히 동일값
     (14px/13px)으로 통일 — .ev-sub도 이번엔 통일 대상에 포함(12px→13px). */
  .content-inner:not(.board-mode) .ev-ttl{font-size:var(--fs-body)}
  .content-inner.board-mode .ev-ttl{font-size:var(--fs-body)}
  .content-inner.board-mode .ev-sub{font-size:13px}
  /* [2026-08-03 추가] 제목-부제 여백도 모바일에서만 축소(6px→4px) — 홈/게시판
     목록 공통(둘 다 이 여백을 .ev-ttl margin-bottom 하나로 공유). */
  .ev-ttl{margin-bottom:4px}
}

/* ── 글상세 반응형 (body.is-post-view : _read.html 에서만 부여) ──
   사이드바 220px + layout gap 10px + 배너 240px + content-inner gap 22px = 492px, 여기에
   main 좌우 패딩 40px 을 더하면 532px. 본문 720px 를 편하게 확보하려면 뷰포트가
   720+532=1252px 는 돼야 한다는 계산(2026-07-21 [4] 진단)에 따라 아래처럼 폭을 4단계로
   접는다. 아래로 갈수록 큰 요소부터 먼저 포기한다(배너 → 사이드바 → 본문 고정폭).
     1250px 초과   : 사이드바 O / 배너 O / 본문 720px 고정
     990~1250px    : 사이드바 O / 배너 숨김 / 본문 720px 고정
     760~989px     : 사이드바 숨김 / 배너 숨김 / 본문 720px 고정
     721~759px     : 사이드바 숨김 / 배너 숨김 / 본문 유동(최대 720px)
     720px 이하    : 전체화면 모드(별도 블록, 기존 그대로)
   전부 is-post-view 한정이라 목록 등 다른 board-mode 화면(660~676행 전역 규칙)은
   그대로 유지된다 */

/* 배너 : 1250px 이하 전부 숨김 (990~1250 / 760~989 / 721~759 를 한 규칙으로 묶는다.
   전역 규칙(660~676행)의 배너 display:contents 보다 명시도가 높아(세 클래스) 이긴다) */
@media(max-width:1250px){
  .is-post-view .content-inner.board-mode .banner-col{display:none}
}
/* 사이드바 : 989px 이하 전부 숨김 (760~989 / 721~759 를 한 규칙으로 묶는다.
   720px 이하는 전역 규칙(694행 .sidebar{display:none})이 이미 숨기므로 겹쳐도 무해하다) */
@media(max-width:989px){
  .is-post-view .sidebar{display:none}
}
/* 본문 720px 고정 + 중앙정렬 : 761px 이상 전 구간(1250 초과 / 990~1250 / 760~989).
   flex-direction:row 복원이 반드시 같이 있어야 한다 — 원래 목록 페이지용
   @media(max-width:1024px){.content-inner.board-mode{flex-direction:column}} 규칙이
   글상세(.is-post-view)에도 그대로 걸려 990~1250·760~989 구간에서 세로로 바뀌면서
   feed-col 의 flex:1 가로 성장 계산이 무의미해져 720px 를 못 채우고 콘텐츠 크기로
   쪼그라들었다(2026-07-22 실측: 900/1024px 에서 487.7px 로 고정되던 원인).
   [2026-07-22 갱신] 목록 페이지 쪽 그 규칙은 이후 720px 기준으로 옮겨져서(675행 부근)
   지금은 761~1024px 구간에서 애초에 걸리지 않는다 — 이 아래 오버라이드는 더 이상
   막을 문제가 없어졌지만, 글상세 확정 영역이라 이번엔 그대로 남겨둔다(안전망 겸 유지) */
@media(min-width:761px){
  .is-post-view .content-inner.board-mode{flex-direction:row}
  .is-post-view .content-inner.board-mode .feed-col{max-width:720px;margin-left:auto;margin-right:auto}
}
/* 본문 유동폭(720px 를 넘지 않는 선에서 화면폭에 맞춘다) : 721~759px 만 */
@media(min-width:721px) and (max-width:760px){
  .is-post-view .content-inner.board-mode .feed-col{width:100%;max-width:720px;margin-left:0;margin-right:0}
}
/* 모바일(720px 이하) : 글로벌 헤더·좌측 카테고리·우측 배너를 모두 숨기고 pv-bar 만 상단 고정
   (좌측 카테고리는 678~689행 사이트 전역 규칙이 이미 숨김. 여기서는 배너만 추가로 숨긴다) */
@media(max-width:720px){
  .is-post-view header{display:none}
  .is-post-view .content-inner.board-mode .banner-col{display:none}
  /* 가장자리~텍스트 16px(네이버 카페 기준) 확보 — main 의 전역 좌우 패딩을 글상세에서만 없앤다.
     이후 pv-inner 자체의 padding:16px 하나만 기준선을 만든다(momya.css/board.momya.css 양쪽 pv-inner) */
  .is-post-view main{padding-left:0;padding-right:0}
  /* pv-bar 를 화면 끝까지 채우던 음수마진(-14px)은 main 패딩이 14px 라는 가정이었다.
     이제 main 좌우 패딩이 0이라 그 가정이 사라져 0으로 맞춘다(원래도 실측 12px라 2px 어긋나 있었다) */
  .is-post-view .momya-read .pv-bar{position:sticky;top:0;z-index:2;background:var(--surface);border-bottom:1px solid var(--border);margin:-13px 0 0;padding:0}
  .is-post-view .momya-read .pv-bar-inner{max-width:720px;margin:0 auto;display:flex;align-items:center;gap:8px;padding:11px 16px}

  /* [3] 터치 영역 44x44 확보. 시각적 크기·위치는 그대로 두고(아이콘이 [2]의 기준선에서
     안 움직이게) ::before 로 보이지 않는 히트박스만 사방으로 넓힌다.
     38px 아이콘은 3px씩(38+3+3=44), 24px 케밥은 10px씩(24+10+10=44) */
  .is-post-view .pv-bar-inner .pv-back,
  .is-post-view .pv-bar-inner .pv-share,
  .is-post-view .pv-bar-inner .pv-report-btn,
  .is-post-view .pv-bar-inner .pv-save-btn{position:relative}
  .is-post-view .pv-bar-inner .pv-back::before,
  .is-post-view .pv-bar-inner .pv-share::before,
  .is-post-view .pv-bar-inner .pv-report-btn::before,
  .is-post-view .pv-bar-inner .pv-save-btn::before{content:'';position:absolute;inset:-3px}
  .is-post-view .pv-bar-inner .cmt-menu-btn{position:relative}
  .is-post-view .pv-bar-inner .cmt-menu-btn::before{content:'';position:absolute;inset:-10px}
}

/* ── 글쓰기 화면 옆 배너·좌측 카테고리 잔존 노출 완화
   (2026-07-25 신규 → 2026-07-26 폭 무관 숨김 → 2026-07-26 !important 로 재수정,
   2026-07-26 사이드바 숨김 추가) ──
   post-view 전용 요소(위 header 숨김·.pv-bar 등)는 글쓰기 화면에 없는 요소라
   옮기지 않았다 — write_form.html 최상단의 Context::addBodyClass('is-write-view')
   가 이 클래스를 붙인다. layout.html 의 .banner-col/.sidebar 는 화면 종류와 무관하게
   항상 렌더링되므로 이 규칙이 없으면 글쓰기 화면 옆에 이전 화면의 배너·카테고리가
   그대로 남는다.
   [2026-07-26, 1차] 처음엔 is-post-view 와 동일하게 1250px 이하에서만 숨겼는데
   (글상세는 "1250px 초과 = 사이드바·배너 다 보여줄 여유 있음"이 의도된 설계),
   1400px 실측에서 배너가 여전히 보여 폭 조건 자체를 없앴다(is-write-view 만).
   [2026-07-26, 2차 확정] 폭 조건을 없앤 뒤에도 폴드 펼침 폭(약 673px, 721~959px
   범위)에서 여전히 보인다는 재확인 — 원인은 별개의 기존 규칙과의 명시도 싸움이었다:
   94~96행 `body:not(.is-post-view) .content-inner.board-mode .banner-col{display:
   contents}`(721~959px 전용, body 요소 선택자 포함 명시도 0,4,1)가 이 규칙(클래스만
   4개, 0,4,0)보다 명시도가 높아 그 구간에서 항상 이겨버렸다 — is-write-view 는
   is-post-view 가 아니므로 `:not(.is-post-view)` 조건에 걸려 그대로 적용된 것.
   같은 이유로 788행 근처 720px 이하 구간에도 유사 규칙이 있어, 폭별로 일일이
   명시도를 맞추는 대신 !important 로 폭 전체에서 무조건 이기도록 확정했다(요청
   지시와 동일한 방향). 로컬에서 실제 라이브 DOM에 이 CSS를 주입해 375/673/721/
   900/1280px 전부 background-col·sidebar 가 0x0(완전히 숨겨짐)인지 직접 확인
   완료. is-post-view 규칙 자체는 전혀 건드리지 않았다. */
.is-write-view .content-inner.board-mode .banner-col{display:none!important}
.is-write-view .sidebar{display:none!important}
/* [수정4, 2026-07-26] 글쓰기 화면 배경 연한 회색 — 프로토타입 fullpage-overlay
   (prototype.css:679, 글쓰기/마이페이지 공용 오버레이)가 실제 쓰는 값은
   var(--surface-2)=#F3F4F6(이미 momya.css 에 동일 변수로 존재)다. momya 는 이
   오버레이를 안 쓰고 body 에 is-write-view 클래스만 붙이므로, 마이페이지 등
   다른 화면(기본 body 배경 var(--bg)=#fff)에 영향 없이 이 화면에만 scope 되도록
   body.is-write-view 에 직접 건다. */
body.is-write-view{background:var(--surface-2)}
@media(min-width:761px){
  .is-write-view .content-inner.board-mode{flex-direction:row}
  /* 폼 720px + gap 24px + 우측 사이드 3카드 240px = 984px(2026-07-26, [5단계-2]
     사이드 3카드 추가로 폭 확장 — 기존 720px 은 폼 단독 기준이었다). .mw-form 은
     flex:1 이라 뷰포트가 984px 보다 좁으면(761~983px 구간) 사이드는 240px 고정을
     유지한 채 폼 쪽만 자연스럽게 줄어든다. */
  .is-write-view .content-inner.board-mode .feed-col{max-width:984px;margin-left:auto;margin-right:auto}
}
@media(min-width:721px) and (max-width:760px){
  .is-write-view .content-inner.board-mode .feed-col{width:100%;max-width:720px;margin-left:0;margin-right:0}
}

/* ── 글쓰기 우측 사이드 3카드 + 미리보기 오버레이(2026-07-26, [5단계-2])
   design/prototype.html:692-802, prototype.css 703·935-982행 마크업/스타일
   그대로 이식 — 변수명(--green/--text 등)이 momya.css 와 이미 동일해 값 그대로
   복사했다. [수정2, 2026-07-26] 760px 이하에서 .mw-side-col 을 숨기지 않고
   .mw-layout 을 세로(column)로 바꿔 폼 아래로 내린다 — .mw-form(안에 mw-actions
   버튼줄이 마지막 자식) 다음에 .mw-side-col 이 형제로 오는 DOM 순서 그대로라
   세로 스택만으로 폼→버튼→사이드 순서가 자연히 나온다(별도 order 불필요).
   761px 이상(위 write-view 행 레이아웃 기준과 동일 값)에서만 가로 배치로 되돌림.
   이미지 갤러리(.wpv-imgs)/투표(pvPoll)는 momya 에 없는 기능이라 옮기지 않았다. */
.mw-layout{display:flex;flex-direction:column;gap:24px;align-items:stretch}
.mw-form{display:flex;flex-direction:column;gap:14px;flex:1;min-width:0}
.mw-side-col{display:flex;flex-direction:column;gap:10px}
@media(min-width:761px){
  .mw-layout{flex-direction:row;align-items:flex-start}
  .mw-side-col{width:240px;flex-shrink:0}
}
.side-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}
.sc-head{display:flex;align-items:center;gap:7px;padding:12px 14px;border-bottom:1px solid var(--border);font-size:var(--fs-card);font-weight:700;color:var(--text)}
.sc-body{padding:12px 14px;display:flex;flex-direction:column;gap:10px}
.sc-info-item{display:flex;align-items:flex-start;gap:8px;font-size:var(--fs-label);color:var(--text-2);line-height:1.5}
.sc-info-item svg{flex-shrink:0;margin-top:1px;color:var(--green)}
.rule-list{display:flex;flex-direction:column}
.rule-item{display:flex;align-items:flex-start;gap:10px;font-size:var(--fs-label);color:var(--text-2);padding:8px 0;border-bottom:1px solid var(--border);line-height:1.5}
.rule-item:last-child{border-bottom:none}
.rule-num{font-size:var(--fs-label);font-weight:700;color:var(--green);flex-shrink:0;min-width:14px}
.help-list{display:flex;flex-direction:column}
.help-item{display:flex;align-items:center;justify-content:space-between;font-size:var(--fs-label);padding:9px 0;cursor:pointer;color:var(--text-2);transition:color .12s;border-bottom:1px solid var(--border)}
.help-item:last-child{border-bottom:none}
.help-item:hover{color:var(--green)}
.help-item svg{flex-shrink:0;color:var(--text-3)}

.wpv-overlay{position:fixed;inset:0;background:rgba(0,0,0,.48);z-index:60;display:none;align-items:flex-start;justify-content:center;padding:36px 20px;overflow-y:auto}
.wpv-overlay.show{display:flex}
.wpv-modal{background:var(--surface);border-radius:var(--radius);width:100%;max-width:680px;max-height:80vh;display:flex;flex-direction:column;overflow:hidden}
.wpv-head{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--border)}
.wpv-head-ttl{font-size:var(--fs-section);font-weight:700}
.wpv-close{background:var(--bg);border:none;width:30px;height:30px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--text-2)}
.wpv-close:hover{background:var(--border)}
.wpv-body{padding:22px 22px 24px;overflow-y:auto;flex:1 1 auto;min-height:0}
.wpv-board{display:inline-block;font-size:var(--fs-micro);font-weight:600;padding:2px 9px;border-radius:6px;background:var(--green-soft);color:var(--green-d);margin-bottom:10px}
.wpv-title{font-size:var(--fs-title);font-weight:700;letter-spacing:-.5px;margin-bottom:10px;line-height:1.3;word-break:break-word}
.wpv-meta{display:flex;align-items:center;gap:9px;font-size:var(--fs-caption);color:var(--text-2);margin-bottom:18px;padding-bottom:14px;border-bottom:1px solid var(--border)}
.wpv-avatar{width:26px;height:26px;border-radius:50%;background:var(--green);color:#fff;display:flex;align-items:center;justify-content:center;font-size:var(--fs-caption);font-weight:700;flex-shrink:0}
.wpv-content{font-size:var(--fs-card);line-height:1.8;color:var(--text);word-break:break-word}
.wpv-foot{display:flex;justify-content:flex-end;gap:7px;padding:12px 18px;border-top:1px solid var(--border);background:var(--bg)}

/* ── 전체화면 페이지 오버레이 (글쓰기/마이페이지) ── */
.fullpage-overlay{position:fixed;inset:0;background:var(--surface-2);z-index:75;display:none;flex-direction:column;align-items:stretch;overflow-y:auto;-webkit-overflow-scrolling:touch}
.fullpage-overlay.show{display:flex;animation:fpIn .22s ease}
.fullpage-overlay main{background:var(--surface-2)}
.fullpage-overlay header{background:rgba(255,255,255,.95)}
@keyframes fpIn{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:none}}

/* ===== 글쓰기 페이지 CSS ===== */


/* ── Header ── */
header{position:sticky;top:0;z-index:40;background:rgba(255,255,255,.95);backdrop-filter:blur(12px);border-bottom:1px solid var(--border)}
.bar{max-width:1060px;margin:0 auto;display:flex;align-items:center;gap:10px;padding:11px 20px}
.logo{font-weight:700;font-size:22px;color:var(--black);flex-shrink:0;letter-spacing:-1px;cursor:pointer}
.logo:hover{opacity:.75}
.header-sep{color:var(--border-2);font-size:20px;font-weight:400}
.header-page{font-size:14px;font-weight:600;color:var(--text)}
.draft-saved{margin-left:auto;font-size:12px;color:var(--green);display:flex;align-items:center;gap:4px;opacity:0;transition:opacity .3s}
.draft-saved.show{opacity:1}

/* ── Layout ── */
.fullpage-overlay main{width:100%;max-width:1060px;margin:0 auto;padding:26px 20px 60px;display:grid;grid-template-columns:220px minmax(0,1fr);gap:18px;align-items:start;box-sizing:border-box}
/* 글쓰기 페이지는 폼이 넓고 안내 사이드가 좁아야 함 (HTML 순서: 폼 → 사이드) */
#writePageOverlay main{grid-template-columns:minmax(0,1fr) 240px}
.write-col{flex:1;min-width:0;display:flex;flex-direction:column;gap:10px}
.side-col{width:240px;flex-shrink:0;position:sticky;top:68px;display:flex;flex-direction:column;gap:10px}

/* ── 공통 카드 ── */
.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}

.write-close-btn{background:none;border:none;cursor:pointer;color:var(--text-2);display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:50%;transition:background .15s;flex-shrink:0;margin-left:8px}
.write-close-btn:hover{background:var(--surface-2)}
/* ── 카테고리 선택 드롭다운 ── */
.comm-card{padding:0;position:relative;overflow:visible}
.comm-trigger{display:flex;align-items:center;gap:10px;padding:14px 16px;cursor:pointer;user-select:none}
.comm-display{flex:1;font-size:15px;font-weight:500;color:var(--text)}
.comm-display.comm-placeholder{color:var(--text-3);font-weight:400}
.comm-chev{color:var(--text-3);flex-shrink:0;transition:transform .2s}
.comm-card.open .comm-chev{transform:rotate(180deg)}
.comm-panel{display:none;border-top:1px solid var(--border);max-height:0;overflow:hidden;transition:max-height .25s ease}
.comm-card.open .comm-panel{display:block;max-height:340px}
.comm-search{margin:12px 14px 8px;display:flex;align-items:center;gap:9px;background:var(--surface-2);border:1.5px solid var(--border);border-radius:10px;padding:10px 13px;transition:border-color .15s,box-shadow .15s}
.comm-search:focus-within{border-color:var(--green);box-shadow:0 0 0 3px var(--green-soft);background:#fff}
.comm-search input{flex:1;border:none;outline:none;background:none;font-family:inherit;font-size:15px;color:var(--text);min-width:0}
.comm-search input::placeholder{color:var(--text-3)}
.comm-search-clear{background:none;border:none;cursor:pointer;color:var(--text-3);display:flex;align-items:center;padding:2px;flex-shrink:0}
.comm-search-clear:hover{color:var(--text)}
.comm-list{max-height:230px;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:2px 8px 10px}
.comm-opt{display:flex;align-items:center;gap:10px;padding:12px 12px;border-radius:9px;cursor:pointer;transition:background .12s;font-size:15px;color:var(--text);font-weight:500}
.comm-opt:hover{background:var(--surface-2)}
.comm-opt.selected{background:var(--green-soft);color:var(--green);font-weight:600}
.comm-opt .comm-opt-check{margin-left:auto;color:var(--green);opacity:0;flex-shrink:0}
.comm-opt.selected .comm-opt-check{opacity:1}
.comm-empty{padding:26px 12px;text-align:center;color:var(--text-3);font-size:13px}
.comm-card{padding:0}

/* ── 닉네임 카드 ── */
.nick-card{padding:0}
/* [6단계-1, 수정3] 세로 높이를 위아래 카드(.comm-trigger 게시판 선택/.title-inner
   제목)와 맞춘다 — 실측(getBoundingClientRect) 결과 기존 12px 패딩은 .nick-card
   44px, 나머지 둘은 52px/52.5px로 8px 짧았다. 16px로 올리면 52px로 정확히
   일치(폰트 크기는 이번 요청 범위가 아니라 그대로 14px 유지, 패딩만 조정). */
.nick-inner{display:flex;align-items:center;gap:10px;padding:16px 16px}
.nick-avatar{width:34px;height:34px;border-radius:50%;background:var(--green);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0;cursor:pointer;transition:transform .15s,box-shadow .15s;user-select:none}
.nick-avatar:hover{transform:scale(1.08);box-shadow:0 2px 10px rgba(21,128,61,.3)}
/* ── 회원 등급(등업) — 이름 + 동그라미 아이콘 ── */
.grade-tag{display:inline-flex;align-items:center;gap:3px;font-size:11px;font-weight:600;line-height:1;letter-spacing:-.2px;flex-shrink:0;white-space:nowrap;vertical-align:middle;color:var(--text-2)}
/* [버그 수정, 2026-07-31, 재조사] 17px 에서는 마진(3px)을 뺀 실제 아이콘이
   11px(65%)로 너무 작아 보인다는 신고로 21px 로 키웠다(.grade-tag.lg 와 동일
   크기로 수렴 — 우연이 아니라 "마이페이지/배너 2곳만 원래도 크게 보이는 자리라
   제외, 나머지는 전부 이 크기로"가 이번 결정). 라운딩(3px)·마진(calc(100%-6px),
   3px)은 그대로 둬도 M=R 안전조건이 계속 성립한다(수식은 아래 .grade-icon-img
   주석 참고) — 박스만 키워서 잘림 없이 아이콘 자체가 더 커 보이게 한 것. */
.grade-tag .grade-badge{font-style:normal;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden;width:21px;height:21px;padding:0;border-radius:3px;font-size:11px;font-weight:700;line-height:1;margin-left:0;background:transparent}
/* 아래쪽 5단계 이름배지(.grade-badge, 1327행~)가 이 <i> 에도 걸리므로 이름 출력을 막는다 */
.grade-tag .grade-badge::after{content:none}
/* [신규, 2026-07-31, 아이콘 업로드] momya_grade_icon_html() 이 채워주는 두 형태 —
   이미지는 배지를 꽉 채우고(overflow:hidden 인 부모가 모서리를 잘라줌), 이모지는
   폰트가 배지 크기에 맞춰 남는 여백 없이 가운데 온다.
   [버그 수정, 2026-07-31] 부모(.grade-badge)가 min-width만 있고 width가 없으면
   flex 컨테이너의 실제 너비가 "auto"(내용 기준)로 남아 자식의 width:100%가
   기준으로 삼을 값이 없어진다 — 이 상태에서 브라우저는 <img>의 원본 픽셀
   크기를 그대로 써버려 넓적한 이미지가 배지 밖으로 늘어져 보였다(실제 사고,
   게시판 목록 카드). width를 명시로 바꿔 고정 정사각형 기준을 만들었다.
   [버그 재수정, 2026-07-31, 모서리/꼬리 잘림] object-fit(cover/contain) 은
   이미지 "비율"만 다룰 뿐, 박스 자체의 border-radius 가 만드는 둥근 모서리는
   전혀 못 막는다 — 이미지가 박스를 100% 꽉 채우면(예전 상태) 박스 진짜
   모서리에 이미지 모서리가 정확히 겹치는데, border-radius 가 0보다 크면 그
   모서리 영역은 항상 잘려나간다(원형 반지름 R 안쪽은 안전, 바깥쪽은 항상
   잘림 — 이건 라이믹스나 이 프로젝트 CSS만의 특이사항이 아니라 border-radius
   + overflow:hidden 의 일반적인 기하학적 성질이다). 사방으로 살짝 튀어나온
   모양(말풍선+꼬리 등)의 캔버스 가장자리까지 꽉 찬 이미지일수록 이 잘림이
   두드러진다 — 라운딩 값(당시 5~6px)이 박스 크기의 22~29%나 됐던 것도 원인.
   **해결 공식**: 이미지를 박스 가장자리에서 마진 M 만큼 안쪽으로 들여놓으면,
   M이 border-radius R 이상일 때 이미지 모서리가 항상 원의 중심(R,R) 안쪽에
   들어가 절대 안 잘린다(M=R일 때 이미지 모서리가 정확히 원의 중심과 겹침 —
   중심은 그 자체로 항상 반지름 R 안쪽이므로 안전). 아래에서 라운딩을 3px로
   줄이고 이미지에 그와 같은 3px 마진(calc(100% - 6px))을 줘서 이 조건(M=R)을
   맞췄다 — 이미지/이모지가 박스보다 살짝 작게 보이지만(약 65~85%, .nick-avatar
   의 글자 비율과 비슷한 수준) 그 대가로 어떤 모양의 이미지를 올려도 모서리가
   전혀 안 잘리는 걸 코드 레벨에서 보장한다. */
.grade-icon-img{width:calc(100% - 6px);height:calc(100% - 6px);object-fit:cover;display:block}
.grade-icon-emoji{display:inline-flex;align-items:center;justify-content:center;width:calc(100% - 6px);height:calc(100% - 6px);line-height:1}
.grade-tag.badge-only{gap:0}
.grade-tag.lg{font-size:12px;gap:4px}
.grade-tag.lg .grade-badge{width:21px;height:21px;font-size:13px;border-radius:3px}
/* [버그 수정, 2026-07-31, 큰 배지 잘림] object-fit:cover 는 컨테이너가 정사각형
   (17px/21px/24px 전부 1:1)이면 이미지 원본 비율과 무관하게 항상 "같은 비율"로
   자른다 — 즉 17px 에서도 21px 에서도 잘리는 비율 자체는 똑같지만, 절대 픽셀이
   작을 땐 안 보이던 크롭이 배지가 커지면 눈에 띄게 보인다(코드 대조로 확정 —
   컨테이너 크기 차이나 padding 차이가 원인이 아니라 cover 특성이 큰 사이즈에서
   더 도드라지는 것). 사이트 전역 소형 배지(17px, 그대로 유지)는 빽빽한 목록에서
   여백 없이 꽉 찬 모양이 더 자연스러워 cover 를 유지하지만, 이 큰 배지(마이페이지
   프로필 카드)는 커스텀 아이콘이 잘리지 않고 전체가 보이는 게 더 중요하다고
   판단해 contain 으로 바꿨다 — 이미지 비율이 1:1이 아니면 여백(투명, 배경 없음)이
   생길 수 있지만 아이콘이 잘려서 알아보기 어려워지는 것보다 낫다는 판단. */
.grade-tag.lg .grade-icon-img{object-fit:contain}
.grade-tag.inline{margin-left:4px}
/* 닉네임 + 등급 배지를 한 덩어리로 묶어 바짝 붙임 (양옆 컨테이너 gap의 영향 제거) */
.nick-grade{display:inline-flex;align-items:center;gap:3px;min-width:0}
.nick-grade .grade-tag.inline{margin-left:0}
/* 프로필: 닉네임 옆에 등급 배치 */
/* [버그 수정, 2026-07-31, 간격 통일] 6px 로 선언돼 있었지만 실제 렌더된 간격은
   10px 였다 — .grade-tag.lg.inline 에 걸린 .grade-tag.inline{margin-left:4px}
   가 안 지워진 채 flex gap(6px) 위에 그대로 더해지고 있었기 때문(6+4=10, 로컬
   목업 실측으로 확인). .nick-grade 는 이미 .nick-grade .grade-tag.inline{
   margin-left:0} 로 이걸 지우고 있는데 여기엔 그 대응 규칙이 없었던 게 원인 —
   같은 실수가 .member-profile-name-row(타인 프로필 모달)에도 있었다. 이번에
   간격을 6곳 전부 3px(.nick-grade 가 이미 쓰던 값)로 통일하면서 이 마진 중복도
   같이 제거했다. */
.profile-name-row{display:inline-flex;align-items:center;gap:3px;max-width:100%;vertical-align:middle}
.profile-name-row .grade-tag.inline{margin-left:0}
.profile-name-row .profile-name{min-width:0}
/* [갱신, 2026-07-31, 디자인 변경] 등급별 배지 색깔 사각 배경을 완전히 제거하고
   투명 배경 위에 아이콘(이미지 또는 이모지)만 보이게 했다 — 사용자 명시적 요청.
   grade-1~4 색상값 자체(등급 구분용)는 이제 배지에 안 쓰이지만 다른 곳(예:
   .up-* 죽은 CSS)에서 여전히 참조될 수 있어 색상 변수는 그대로 두고 이 4줄의
   .grade-badge 배경 지정만 지웠다. 다시 색깔 배경을 되돌리는 건 아님 — 이전
   버전의 "grade-1~4 고정" 메모는 색상 매핑 값 자체에 대한 것이었지, 배경을
   반드시 채워야 한다는 뜻은 아니었다. */
/* ── 글 목록 도구바 (총 개수 + 페이지당 개수) ── */
.feed-tools{display:flex;align-items:center;justify-content:space-between;gap:10px}
.feed-count{font-size:12px;color:var(--text-3)}
.feed-count b{color:var(--text-2);font-weight:600}
.perpage{position:relative;display:inline-block}
/* [2026-07-31, 통합검색 momya 스킨] .sf-dd 는 처음부터 display:inline-block 로
   자기 폭을 컨텐츠(버튼)에 맞춰 줄여서 .sf-dd-menu 의 우측 정렬(right:0)이
   항상 버튼 바로 밑에 붙는데, .perpage 는 이게 없어 display:flex 인 부모
   (.feed-tools) 안에 있을 때만 flex 아이템 축소로 우연히 같은 효과를 봤다.
   통합검색 결과 화면(header.html)은 .perpage 를 display:block 인 .search-tools
   안에 직접 두는데, 그러면 .perpage 가 부모 전체 폭으로 늘어나 .perpage-menu
   의 right:0 이 화면 오른쪽 끝(부모의 우측 끝)에 붙어버렸다 — 버튼은 왼쪽에
   있는데 메뉴만 오른쪽 끝에 떨어져 보이는 원인. display:inline-block 을
   .perpage 자체에 추가하면 어떤 부모(block/flex 무관)에 있어도 항상
   컨텐츠 폭으로 줄어든다 — flex 부모 안에서는 flexbox 가 자식을 항상
   블록화하므로 이 추가가 기존 동작(.feed-tools 안 사용처)을 전혀 안 바꾼다. */
.perpage-btn{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--border);background:var(--surface);border-radius:8px;padding:6px 9px 6px 8px;font-family:inherit;font-size:12px;font-weight:600;color:var(--text-2);cursor:pointer;transition:background .12s,border-color .12s}
.perpage-btn:hover{background:var(--surface-2)}
.perpage-btn .pp-ic{width:14px;height:14px;color:var(--text-3);flex-shrink:0}
.perpage-btn .pp-chev{width:13px;height:13px;color:var(--text-3);transition:transform .18s;flex-shrink:0}
.perpage.open .pp-chev{transform:rotate(180deg)}
.perpage-menu{position:absolute;top:calc(100% + 5px);right:0;background:var(--surface);border:1px solid var(--border);border-radius:10px;box-shadow:var(--shadow);padding:4px;display:none;z-index:30;min-width:104px}
.perpage.open .perpage-menu{display:block}
.perpage-menu button,.perpage-menu a{display:block;width:100%;text-align:left;border:none;background:none;font-family:inherit;font-size:12px;font-weight:500;color:var(--text);padding:8px 12px;border-radius:7px;cursor:pointer;white-space:nowrap;transition:background .1s}
.perpage-menu button:hover,.perpage-menu a:hover{background:var(--surface-2)}
.perpage-menu button.sel,.perpage-menu a.sel{color:var(--green);font-weight:600}
/* ── 회원 등급 · 등업 패널 ── */
.up-cur{display:flex;align-items:center;gap:13px;background:var(--surface-2);border-radius:14px;padding:15px 17px;margin-bottom:18px}
.up-cur-badge{width:46px;height:46px;border-radius:13px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:18px;flex-shrink:0}
.up-cur-info{min-width:0}
.up-cur-label{font-size:12px;color:var(--text-3);font-weight:600;margin-bottom:1px}
.up-cur-name{font-size:18px;font-weight:700;color:var(--text)}
.up-tier{border:1px solid var(--border);border-radius:14px;padding:15px 16px;margin-bottom:11px}
.up-tier.done{background:var(--surface-2);border-color:transparent;opacity:.72}
.up-tier.current{border-color:var(--green);box-shadow:0 0 0 3px var(--green-soft)}
.up-tier-head{display:flex;align-items:center;gap:8px}
.up-tier-badge{width:23px;height:23px;border-radius:7px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:11px;flex-shrink:0}
.up-tier-name{font-size:15px;font-weight:700;color:var(--text)}
.up-tier-mode{margin-left:auto;font-size:11px;font-weight:600;padding:3px 10px;border-radius:999px}
.up-mode-auto{background:#DCFCE7;color:var(--green-d)}
.up-mode-approve{background:#FEF3C7;color:#B45309}
.up-mode-done{background:var(--border);color:var(--text-2)}
.up-reqs{display:flex;flex-direction:column;gap:2px;margin:12px 0 14px}
.up-req-sum{font-size:12px;font-weight:600;color:var(--text-3);margin-bottom:6px}
.up-req-sum.allmet{color:var(--green)}
.up-req{display:flex;align-items:center;gap:10px;padding:6px 0}
.up-chk{width:21px;height:21px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;border:1.6px solid var(--border-2);color:transparent;background:#fff;transition:all .15s}
.up-req.met .up-chk{background:var(--green);border-color:var(--green);color:#fff}
.up-chk svg{width:12px;height:12px}
.up-req-label{flex:1;min-width:0;font-size:13px;color:var(--text-2);font-weight:600}
.up-req.met .up-req-label{color:var(--text)}
.up-req-num{font-size:13px;font-weight:600;color:var(--text-3);flex-shrink:0;font-variant-numeric:tabular-nums}
.up-req.met .up-req-num{color:var(--green)}
.up-action{display:flex}
.up-apply-btn{flex:1;padding:11px;border:none;border-radius:10px;background:var(--green);color:#fff;font-family:inherit;font-size:14px;font-weight:600;cursor:pointer;transition:filter .12s}
.up-apply-btn:hover{filter:brightness(1.06)}
.up-apply-btn:disabled{background:#D1D5DB;cursor:default;filter:none}
.up-pending{flex:1;text-align:center;padding:11px;border-radius:10px;background:#FEF3C7;color:#B45309;font-size:13px;font-weight:600}
.up-auto-note{flex:1;text-align:center;padding:10px;border-radius:10px;background:var(--surface-2);color:var(--text-2);font-size:12px;font-weight:600}
.up-foot-note{font-size:12px;color:var(--text-3);text-align:center;margin-top:8px;line-height:1.5}
.up-cur-badge.grade-1,.up-tier-badge.grade-1{background:var(--text-3)}
.up-cur-badge.grade-2,.up-tier-badge.grade-2{background:var(--green)}
.up-cur-badge.grade-3,.up-tier-badge.grade-3{background:#0EA5E9}
.up-cur-badge.grade-4,.up-tier-badge.grade-4{background:#D97706}
/* ── 페이지네이션 ── */
.pager{display:flex;align-items:center;justify-content:center;gap:3px;padding:24px 0 6px;flex-wrap:wrap}
.pg-num,.pg-arr{min-width:32px;height:32px;border:none;background:none;border-radius:8px;font-family:inherit;font-size:13px;font-weight:600;color:var(--text-2);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0 6px;transition:background .12s,color .12s}
.pg-num:hover,.pg-arr:hover:not(:disabled){background:var(--surface-2)}
.pg-num.active{background:var(--green);color:#fff;font-weight:600}
.pg-arr{color:var(--text-3)}
.pg-arr svg{width:17px;height:17px}
.pg-arr:disabled{opacity:.3;cursor:default}
.pg-ellipsis{color:var(--text-3);padding:0 3px;font-size:13px;user-select:none}
/* [2026-07-31, 통합검색 momya 스킨] board/skins/momya/css/board.momya.css 의
   .momya-pager(값 전부 그대로 복사, check_css_sync.py 대상)를 재사용 — 검색
   화면은 board.momya.css 가 로드되지 않는 별도 모듈(integration_search)이라
   여기 momya.css 에도 있어야 실제로 적용된다. 게시판 목록(board/skins/momya/
   list.html)과 똑같이 처음/마지막 화살표(«/»)가 경계(1페이지·마지막 페이지)
   에서 cond 로 저절로 숨는 것까지 포함해 완전히 동일한 컴포넌트로 통일했다 —
   기존 .pg-num/.pg-arr(위 1284~1291행, 다른 화면들이 쓰는 별개 컴포넌트)는
   그대로 두고 손대지 않는다. .pg-arr 클래스 이름 자체는 두 컴포넌트가
   우연히 공유하지만 값이 사실상 동일해(폭/높이/모서리반경/글자크기/색 전부
   같음) 서로 섞여도 시각적으로 문제되지 않는다. */
.momya-pager{display:flex;justify-content:center;align-items:center;gap:6px;margin:22px 0 8px;flex-wrap:wrap}
.momya-pager a,.momya-pager strong{min-width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border-radius:8px;font-size:13px;text-decoration:none;color:var(--text-2);border:1px solid transparent}
.momya-pager a:hover{background:var(--surface-2)}
.momya-pager .pg-cur{background:var(--green);color:#fff;font-weight:700}
.momya-pager .pg-arr{color:var(--text-3)}

/* [2026-08-01] Mobile::isFromMobilePhone()이 이 서버(files/config/config.php
   mobile.enabled=false)에서 UA와 무관하게 항상 false만 반환함이 확인돼(
   Mobile.class.php:40, isMobileEnabled()이 false면 UA 검사 자체를 안 하고
   조기 반환) 서버사이드로는 모바일 여부를 구분할 수 없다 — 페이지네이션
   묶음(«/» 그룹 이동)의 데스크톱판(10개)/모바일판(5개)을 둘 다 서버에서
   렌더링해두고, 이 클래스로 실제 화면 폭 기준(다른 곳과 동일한 720px 기준,
   .only-mobile/.desktop-search 와 같은 방식)으로 골라 보여준다. display:contents
   로 감싸 .momya-pager/.pager 자체의 flex 레이아웃(gap 등)에 자식으로 그대로
   참여해 영향이 없다. */
.pg-group-desktop{display:contents}
.pg-group-mobile{display:none}
@media(max-width:720px){
  .pg-group-desktop{display:none}
  .pg-group-mobile{display:contents}
}
.nick-input{flex:1;font-family:inherit;font-size:14px;font-weight:500;color:var(--text);border:none;outline:none;background:none;min-width:0}
.nick-input::placeholder{color:var(--text-3);font-weight:400}
.nick-hint{font-size:12px;color:var(--text-3);flex-shrink:0;white-space:nowrap}

/* ── 제목 카드 ── */
.title-card{padding:0}
.title-inner{display:flex;align-items:flex-start;gap:8px;padding:13px 16px}
.title-textarea{flex:1;font-family:inherit;font-size:15px;font-weight:500;color:var(--text);border:none;outline:none;background:none;resize:none;line-height:1.45;min-height:24px;letter-spacing:-.2px}
.title-textarea::placeholder{color:var(--text-3);font-weight:400}
.title-count{font-size:11px;color:var(--text-3);padding-top:3px;flex-shrink:0;white-space:nowrap}

/* ── 에디터 카드 ── */
.editor-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow)}

/* 툴바 */
.toolbar{display:flex;align-items:center;gap:2px;padding:7px 10px;border-bottom:1px solid var(--border);flex-wrap:wrap}
.tb{background:none;border:none;cursor:pointer;width:30px;height:30px;border-radius:6px;display:flex;align-items:center;justify-content:center;color:var(--text-2);font-family:inherit;font-size:12px;font-weight:600;transition:all .12s;flex-shrink:0}
.tb:hover{background:var(--bg);color:var(--text)}
.tb-div{width:1px;height:16px;background:var(--border);margin:0 3px;flex-shrink:0}

/* 본문 */
.editor-body{padding:14px 16px;min-height:200px}
.editor-content{width:100%;min-height:180px;font-family:inherit;font-size:15px;line-height:1.75;color:var(--text);border:none;outline:none;background:none;resize:none}
.editor-content:empty:before{content:attr(data-placeholder);color:var(--text-3);pointer-events:none}

/* 미디어 프리뷰 */
.media-preview{padding:0 16px 14px;display:none}
.media-grid{display:flex;flex-wrap:wrap;gap:8px}
.media-thumb{width:88px;height:88px;border-radius:9px;overflow:hidden;position:relative;border:1px solid var(--border);flex-shrink:0}
.media-thumb img,.media-thumb video{width:100%;height:100%;object-fit:cover;display:block}
.media-del{position:absolute;top:4px;right:4px;background:rgba(0,0,0,.55);border:none;width:19px;height:19px;border-radius:50%;cursor:pointer;color:#fff;font-size:11px;display:flex;align-items:center;justify-content:center}
.media-del:hover{background:rgba(0,0,0,.82)}
.media-add{width:88px;height:88px;border-radius:9px;border:2px dashed var(--border-2);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;cursor:pointer;color:var(--text-3);font-size:11px;font-weight:500;transition:all .15s;flex-shrink:0}
.media-add:hover{border-color:var(--green);color:var(--green);background:var(--green-soft)}

/* 링크 입력 */
.link-row{padding:0 16px 14px;display:none}
.link-field{display:flex;align-items:center;gap:8px;background:#fff;border:1.5px solid var(--border-2);border-radius:9px;padding:9px 13px;transition:border-color .15s,box-shadow .15s}
.link-field:focus-within{border-color:var(--green);box-shadow:0 0 0 3px var(--green-soft)}
/* [2026-08-03 수정] min-width:0 추가 — flex:1 만으로는 <input>의 브라우저 기본
   최소 너비(min-width:auto)가 축소를 막아, 324px 근방 좁은 화면에서 옆의 확인/X
   버튼이 박스 밖으로 밀려나왔다(실측 확인: 324px 재현, 360px 정상). 흔한 flexbox
   함정 — 이 한 줄로 입력창이 정상적으로 줄어들며 버튼 두 개가 항상 박스 안에 남는다. */
.link-field input{flex:1;min-width:0;font-family:inherit;font-size:14px;color:var(--text);border:none;outline:none;background:none}
.link-field input::placeholder{color:var(--text-3)}
.link-go{background:var(--black);color:#fff;border:none;border-radius:7px;padding:5px 11px;font-family:inherit;font-size:12px;font-weight:600;cursor:pointer;flex-shrink:0}
.link-go:hover{opacity:.8}
.link-cancel{flex-shrink:0;width:26px;height:26px;border:none;background:none;cursor:pointer;color:var(--text-3);border-radius:50%;display:flex;align-items:center;justify-content:center}
.link-cancel:hover{background:var(--surface-2);color:var(--text-2)}
.link-preview-card{margin:6px 16px 12px;border:1.5px solid var(--border);border-radius:9px;overflow:hidden;display:none;position:relative}
.lp-del{position:absolute;top:7px;right:7px;width:24px;height:24px;border-radius:50%;border:none;background:rgba(0,0,0,.5);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;z-index:2}
.lp-del:hover{background:rgba(0,0,0,.7)}
.lp-img{aspect-ratio:16/9;background:linear-gradient(135deg,#dbeafe,#bfdbfe);display:flex;align-items:center;justify-content:center;font-size:22px;overflow:hidden}
.lp-img img{width:100%;height:100%;object-fit:cover;display:block}
.lp-body{padding:9px 13px}
.lp-domain{font-size:11px;color:var(--text-3);margin-bottom:2px}
.lp-title{font-size:13px;font-weight:600;color:var(--text)}

/* 첨부 바 — [6단계-1, 수정7, 2026-07-26] background 가 var(--bg)(흰색) 고정이라
   [수정4]로 글쓰기 화면 배경을 var(--surface-2)(연회색)로 바꾼 뒤에도 이 바만
   흰색으로 남아 있었다. 버튼 2개(사진 첨부/링크 첨부)가 폭 전체를 안 채워
   오른쪽에 남는 빈 공간이 그대로 흰 배경으로 보여 "흰색 사각형" 잔재로
   드러난 것 — 사용되지 않는 요소가 아니라 배경색 갱신 누락이었다. 주변과
   동일한 var(--surface-2)로 맞춘다. */
.attach-bar{display:flex;align-items:center;gap:7px;padding:8px 10px;border-top:1px solid var(--border);background:var(--surface-2);flex-wrap:wrap}
.att-btn{display:flex;align-items:center;justify-content:center;gap:5px;padding:9px 14px;border-radius:999px;border:1.5px solid var(--border-2);background:var(--surface);font-family:inherit;font-size:13px;font-weight:500;color:var(--text-2);cursor:pointer;transition:all .15s;flex-shrink:0}
.att-btn:hover,.att-btn.on{border-color:var(--green);color:var(--green);background:var(--green-soft)}

/* 투표 첨부 인라인 카드 — [6단계-2, 2026-07-26 신규] design/prototype.css:895-911
   값 그대로 이식(변수명이 momya.css 와 이미 동일). "본문에 삽입" 버튼(.poll-submit)은
   프로토타입에 없던 momya 자체 추가 요소 — 링크 첨부의 .link-go(확인 버튼)와 같은
   즉시-삽입 톤에 맞춰 새로 디자인(프로토타입은 투표를 카드에 계속 열어두다 전체
   글 등록 시점에 한꺼번에 수집하는 방식이라 별도 확인 버튼이 없었음 — momya 는
   링크 첨부와 동일하게 "확인 즉시 본문 삽입" 방식으로 이미 확정). */
.poll-editor{display:none;padding:15px 16px}
.poll-editor.show{display:block}
.poll-ed-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:11px}
.poll-ed-title{font-size:var(--fs-label);font-weight:600;color:var(--text);display:flex;align-items:center;gap:6px}
.poll-ed-del{background:none;border:none;cursor:pointer;color:var(--text-3);font-size:var(--fs-caption);display:flex;align-items:center;gap:3px;padding:3px 4px;font-family:inherit}
.poll-ed-del:hover{color:var(--red)}
.poll-q{width:100%;border:1px solid var(--border);border-radius:9px;padding:10px 12px;font-family:inherit;font-size:var(--fs-body);color:var(--text);background:var(--bg);box-sizing:border-box;margin-bottom:9px}
.poll-q:focus{outline:none;border-color:var(--green)}
.poll-opts{display:flex;flex-direction:column;gap:7px}
.poll-opt-row{display:flex;align-items:center;gap:6px}
.poll-opt-row input{flex:1;min-width:0;border:1px solid var(--border);border-radius:9px;padding:9px 11px;font-family:inherit;font-size:var(--fs-label);color:var(--text);background:var(--bg);box-sizing:border-box}
.poll-opt-row input:focus{outline:none;border-color:var(--green)}
.poll-opt-del{flex-shrink:0;width:28px;height:28px;border:none;background:none;cursor:pointer;color:var(--text-3);border-radius:50%;display:flex;align-items:center;justify-content:center}
.poll-opt-del:hover{background:var(--surface-2);color:var(--red)}
.poll-add{margin-top:9px;width:100%;border:1px dashed var(--border-2);border-radius:9px;background:none;cursor:pointer;color:var(--text-2);font-family:inherit;font-size:var(--fs-label);padding:9px;display:flex;align-items:center;justify-content:center;gap:5px}
.poll-add:hover{border-color:var(--green);color:var(--green)}
.poll-add:disabled{opacity:.4;cursor:not-allowed}
.poll-submit{margin-top:9px;width:100%;border:none;border-radius:9px;background:var(--green);color:#fff;font-family:inherit;font-size:var(--fs-label);font-weight:600;padding:11px;cursor:pointer;transition:background .15s}
.poll-submit:hover{background:var(--green-d)}
.poll-submit:disabled{opacity:.6;cursor:not-allowed}

/* 라이믹스 기본 파일첨부 위젯(modules/editor/skins/ckeditor/file_upload.html) 원본
   드래그&드롭 UI — 2026-07-25 신규. .att-btn "사진 첨부" 버튼이 이 위젯의 숨은
   input(#xe-fileupload)을 그대로 클릭시키므로, 원본 UI는 momya-write 화면에서만
   시각적으로 숨긴다. display:none 이어도 내부 input·업로드·자동삽입 JS는 그대로
   동작한다(hidden file input 을 JS 로 .click() 하는 건 프로토타입 자신의 #photoInput
   과 동일한, 널리 쓰이는 패턴). 다른 화면(배너 게시판 등 이 스킨을 안 쓰는 CKEditor)은
   .momya-write 스코프 밖이라 영향 없다. */
.momya-write .xefu-container{display:none}

/* ── 글쓴이 아이콘 카드 ── */
.author-card{padding:14px 16px}
.author-check-row{display:flex;align-items:flex-start;gap:10px;cursor:pointer;user-select:none}
.author-cb{width:16px;height:16px;accent-color:var(--green);cursor:pointer;flex-shrink:0;margin-top:2px}
/* 실제 input은 라이믹스 확장변수 표준 렌더러(modules/extravar/skins/default/
   form_types/checkbox.blade.php)가 만든 <ul class="rx_ev_checkbox"><li><input
   class="checkbox">라벨(옵션 텍스트 "노출")</li></ul> 구조 그대로다(저장/복원
   로직 재사용을 위해 직접 만들지 않음, write_form.html 참고) — 목록 스타일과
   중복 라벨("노출")을 지우고 체크박스만 .author-cb 와 같은 모양으로 맞춘다 */
.author-cb-wrap .rx_ev_checkbox{list-style:none;margin:0;padding:0}
.author-cb-wrap .rx_ev_checkbox li{display:flex;align-items:center;margin-top:2px}
.author-cb-wrap .rx_ev_checkbox li label{display:none}
.author-cb-wrap input.checkbox{width:16px;height:16px;accent-color:var(--green);cursor:pointer;flex-shrink:0;margin:0}
.author-texts{}
.author-title{font-size:14px;font-weight:600;color:var(--text)}
.author-desc{font-size:13px;color:var(--text-2);margin-top:3px;line-height:1.5}
/* 홍보 콘텐츠 활용 동의 */
.promo-card{padding:14px 16px}
.promo-tag{display:inline-block;font-size:11px;font-weight:600;color:var(--text-3);background:var(--surface-2);border-radius:6px;padding:1px 6px;margin-left:4px;vertical-align:middle}
.promo-more{display:inline-flex;align-items:center;gap:3px;margin:9px 0 0 26px;background:none;border:none;cursor:pointer;color:var(--text-2);font-family:inherit;font-size:12px;padding:0}
.promo-more svg{transition:transform .2s}
.promo-more.open svg{transform:rotate(180deg)}
.promo-detail{display:none;margin:8px 0 0 26px;padding:11px 13px;background:var(--surface-2);border-radius:10px}
.promo-detail.show{display:block}
.promo-detail ul{margin:0;padding-left:15px;display:flex;flex-direction:column;gap:6px}
.promo-detail li{font-size:12px;color:var(--text-2);line-height:1.55}
/* ── 투표 작성 에디터 ── */
.poll-editor{display:none;padding:15px 16px}
.poll-editor.show{display:block}
.poll-ed-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:11px}
.poll-ed-title{font-size:13px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:6px}
.poll-ed-del{background:none;border:none;cursor:pointer;color:var(--text-3);font-size:12px;display:flex;align-items:center;gap:3px;padding:3px 4px;font-family:inherit}
.poll-ed-del:hover{color:var(--red)}
.poll-q{width:100%;border:1px solid var(--border);border-radius:9px;padding:10px 12px;font-family:inherit;font-size:14px;color:var(--text);background:var(--bg);box-sizing:border-box;margin-bottom:9px}
.poll-q:focus{outline:none;border-color:var(--green)}
.poll-opts{display:flex;flex-direction:column;gap:7px}
.poll-opt-row{display:flex;align-items:center;gap:6px}
.poll-opt-row input{flex:1;min-width:0;border:1px solid var(--border);border-radius:9px;padding:9px 11px;font-family:inherit;font-size:13px;color:var(--text);background:var(--bg);box-sizing:border-box}
.poll-opt-row input:focus{outline:none;border-color:var(--green)}
.poll-opt-del{flex-shrink:0;width:28px;height:28px;border:none;background:none;cursor:pointer;color:var(--text-3);border-radius:50%;display:flex;align-items:center;justify-content:center}
.poll-opt-del:hover{background:var(--surface-2);color:var(--red)}
.poll-add{margin-top:9px;width:100%;border:1px dashed var(--border-2);border-radius:9px;background:none;cursor:pointer;color:var(--text-2);font-family:inherit;font-size:13px;padding:9px;display:flex;align-items:center;justify-content:center;gap:5px}
.poll-add:hover{border-color:var(--green);color:var(--green)}
.poll-add:disabled{opacity:.4;cursor:not-allowed}
/* ── 투표 렌더 (미리보기/글보기 공용) ── */
.poll-box{border:1px solid var(--border);border-radius:14px;padding:15px 16px;margin:14px 0;background:var(--surface)}
.poll-box-q{font-size:15px;font-weight:600;color:var(--text);margin-bottom:3px;line-height:1.4}
.poll-box-sub{font-size:12px;color:var(--text-3);margin-bottom:12px}
.poll-choice{display:block;position:relative;width:100%;text-align:left;border:1px solid var(--border-2);border-radius:10px;padding:12px 14px;margin-bottom:8px;background:var(--bg);cursor:pointer;font-family:inherit;overflow:hidden;transition:border-color .15s}
.poll-choice:last-of-type{margin-bottom:0}
.poll-choice:hover{border-color:var(--green)}
.pc-fill{position:absolute;left:0;top:0;bottom:0;width:0;background:var(--surface-2);z-index:0;transition:width .55s cubic-bezier(.4,0,.2,1)}
.poll-choice.win .pc-fill{background:#dcfce7}
.pc-row{position:relative;z-index:1;display:flex;align-items:center;justify-content:space-between;gap:8px}
.pc-text{font-size:14px;color:var(--text);font-weight:500}
.poll-choice.win .pc-text{color:var(--green-d);font-weight:600}
.poll-choice.voted-me{border-color:var(--green)}
.pc-pct{font-weight:600;color:var(--text-3);font-size:13px;opacity:0;transition:opacity .3s;flex-shrink:0}
.poll-choice.win .pc-pct{color:var(--green-d)}
.poll-box.done .pc-pct{opacity:1}
.poll-box.done .poll-choice{cursor:default}
.poll-box.done .poll-choice:hover{border-color:var(--border-2)}
.poll-box.done .poll-choice.voted-me:hover{border-color:var(--green)}
.poll-total{font-size:12px;color:var(--text-3);margin-top:11px;text-align:right;opacity:0;transition:opacity .3s}
.poll-box.done .poll-total{opacity:1}

/* ── 하단 액션 ── */
.action-card{padding:14px 16px}
.action-row{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.btn-cancel{background:none;border:1.5px solid var(--border-2);border-radius:9px;padding:9px 16px;font-family:inherit;font-size:13px;font-weight:500;color:var(--text-2);cursor:pointer;transition:all .15s}
.btn-cancel:hover{border-color:var(--text);color:var(--text)}
.btn-draft{background:none;border:1.5px solid var(--border-2);border-radius:9px;padding:9px 16px;font-family:inherit;font-size:13px;font-weight:500;color:var(--text-2);cursor:pointer;transition:all .15s}
.btn-draft:hover{border-color:var(--green);color:var(--green)}
.btn-preview{display:flex;align-items:center;gap:5px;background:none;border:1.5px solid var(--border-2);border-radius:9px;padding:9px 16px;font-family:inherit;font-size:13px;font-weight:500;color:var(--text-2);cursor:pointer;transition:all .15s}
.btn-preview:hover{border-color:var(--black);color:var(--black)}
.act-spacer{flex:1}
.btn-post{background:var(--black);color:#fff;border:none;border-radius:9px;padding:10px 24px;font-family:inherit;font-size:14px;font-weight:600;cursor:pointer;transition:opacity .15s;white-space:nowrap}
.btn-post:hover:not(:disabled){opacity:.8}
.btn-post:disabled{background:var(--border-2);color:var(--text-3);cursor:not-allowed}

/* ── 사이드 카드 ── */
.side-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}
.sc-head{display:flex;align-items:center;gap:7px;padding:12px 14px;border-bottom:1px solid var(--border);font-size:15px;font-weight:700;color:var(--text)}
.sc-body{padding:12px 14px;display:flex;flex-direction:column;gap:10px}
.sc-info-item{display:flex;align-items:flex-start;gap:8px;font-size:13px;color:var(--text-2);line-height:1.5}
.sc-info-item svg{flex-shrink:0;margin-top:1px;color:var(--green)}
.rule-list{display:flex;flex-direction:column}
.rule-item{display:flex;align-items:flex-start;gap:10px;font-size:13px;color:var(--text-2);padding:8px 0;border-bottom:1px solid var(--border);line-height:1.5}
.rule-item:last-child{border-bottom:none}
.rule-num{font-size:13px;font-weight:700;color:var(--green);flex-shrink:0;min-width:14px}
.help-list{display:flex;flex-direction:column}
.help-item{display:flex;align-items:center;justify-content:space-between;font-size:13px;padding:9px 0;cursor:pointer;color:var(--text-2);transition:color .12s;border-bottom:1px solid var(--border)}
.help-item:last-child{border-bottom:none}
.help-item:hover{color:var(--green)}
.help-item svg{flex-shrink:0;color:var(--text-3)}

/* ── 미리보기 오버레이 ── */
.wpv-overlay{position:fixed;inset:0;background:rgba(0,0,0,.48);z-index:60;display:none;align-items:flex-start;justify-content:center;padding:36px 20px;overflow-y:auto}
.wpv-overlay.show{display:flex;animation:fadeIn .2s ease}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
.wpv-modal{background:var(--surface);border-radius:var(--radius);width:100%;max-width:680px;max-height:80vh;display:flex;flex-direction:column;overflow:hidden;animation:popUp .2s cubic-bezier(.2,.9,.3,1) both}
@keyframes popUp{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.wpv-head{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--border)}
.wpv-head-ttl{font-size:16px;font-weight:700}
.wpv-close{background:var(--bg);border:none;width:30px;height:30px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--text-2)}
.wpv-close:hover{background:var(--border)}
.wpv-body{padding:22px 22px 24px;overflow-y:auto;flex:1 1 auto;min-height:0}
.wpv-board{display:inline-block;font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:var(--green-soft);color:var(--green-d);margin-bottom:10px}
.wpv-title{font-size:20px;font-weight:700;letter-spacing:-.5px;margin-bottom:10px;line-height:1.3}
.wpv-meta{display:flex;align-items:center;gap:9px;font-size:12px;color:var(--text-2);margin-bottom:18px;padding-bottom:14px;border-bottom:1px solid var(--border)}
.wpv-avatar{width:26px;height:26px;border-radius:50%;background:var(--green);color:#fff;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;flex-shrink:0}
.wpv-content{font-size:16px;line-height:1.8;color:var(--text);word-break:break-word}
.wpv-imgs{display:flex;flex-wrap:wrap;gap:7px;margin-top:14px}
.wpv-img{width:110px;height:82px;border-radius:8px;object-fit:cover;border:1px solid var(--border)}
.wpv-foot{display:flex;justify-content:flex-end;gap:7px;padding:12px 18px;border-top:1px solid var(--border);background:var(--bg)}

/* ── Toast ── */
.toast{position:fixed;bottom:26px;left:50%;transform:translateX(-50%) translateY(14px);background:var(--black);color:#fff;font-size:13px;font-weight:500;padding:10px 20px;border-radius:999px;opacity:0;transition:all .26s;z-index:100;pointer-events:none;white-space:nowrap}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

@media(max-width:740px){
  main{flex-direction:column;padding:14px 12px 50px}
  #writePageOverlay main{grid-template-columns:1fr}
  .side-col{width:100%;position:static}
  .attach-bar{display:grid;grid-template-columns:1fr 1fr;gap:7px}
  .att-btn{width:100%}
  .action-row{flex-wrap:wrap}
  .act-spacer{display:none}
  .action-row .btn-cancel,.action-row .btn-draft,.action-row .btn-preview{flex:1;text-align:center;justify-content:center}
  .action-row .btn-post{flex:1 0 100%;text-align:center;white-space:nowrap;padding:12px}
  .wpv-foot .btn-post{flex:0 0 auto}
  .wpv-foot .btn-cancel{flex:0 0 auto}
}

/* ===== 마이페이지 CSS ===== */


/* ── Header ── */
header{position:sticky;top:0;z-index:40;background:rgba(255,255,255,.95);backdrop-filter:blur(12px);border-bottom:1px solid var(--border)}
.bar{max-width:1060px;margin:0 auto;display:flex;align-items:center;gap:10px;padding:11px 20px}
.logo{font-weight:700;font-size:22px;color:var(--black);flex-shrink:0;letter-spacing:-1px;cursor:pointer}
.logo:hover{opacity:.75}
.header-sep{color:var(--border-2);font-size:20px;font-weight:400}
.header-page{font-size:14px;font-weight:600;color:var(--text)}

/* ── Layout ── */
.fullpage-overlay main{width:100%;max-width:1060px;margin:0 auto;padding:26px 20px 60px;display:grid;grid-template-columns:220px minmax(0,1fr);gap:18px;align-items:start;box-sizing:border-box}
.left-col{position:sticky;top:68px;display:flex;flex-direction:column;gap:10px;min-width:0}
.right-col{min-width:0;width:100%;display:flex;flex-direction:column;gap:10px;align-items:stretch}

/* ── 공통 카드 ── */
.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}

/* ── 프로필 카드 (왼쪽) ── */
.profile-card{padding:20px 16px;display:flex;flex-direction:column;align-items:center;gap:14px;text-align:center}
.profile-top{display:flex;flex-direction:column;align-items:center;gap:10px;min-width:0;width:100%}
.profile-meta{min-width:0;width:100%}
.profile-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.profile-email{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.profile-avatar{width:72px;height:72px;border-radius:50%;background:var(--surface-2);display:flex;align-items:center;justify-content:center;color:var(--text-3);flex-shrink:0;position:relative}
.profile-avatar-lock{position:absolute;bottom:-2px;right:-2px;width:20px;height:20px;background:var(--border-2);border-radius:50%;border:2px solid var(--surface);display:flex;align-items:center;justify-content:center}
.profile-name{font-size:16px;font-weight:700;color:var(--text);letter-spacing:-.3px}
.profile-email{font-size:12px;color:var(--text-3)}
.profile-stats{display:flex;gap:0;width:100%;border:1px solid var(--border);border-radius:10px;overflow:hidden;margin-top:4px}
.stat-item{flex:1;padding:10px 6px;text-align:center;border-right:1px solid var(--border)}
.stat-item:last-child{border-right:none}
.stat-num{font-size:16px;font-weight:700;color:var(--text)}
.stat-label{font-size:11px;color:var(--text-3);margin-top:1px}

/* ── 네비 카드 (왼쪽) ── */
.nav-card{padding:6px}
.nav-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:9px;font-size:14px;font-weight:500;color:var(--text-2);cursor:pointer;transition:all .12s;user-select:none}
.nav-item:hover{background:var(--bg);color:var(--text)}
.nav-item.active{background:var(--green-soft);color:var(--green);font-weight:600}
.nav-item.active svg{stroke:var(--green)}
.nav-item svg{flex-shrink:0;stroke:var(--text-3);transition:stroke .12s}
.nav-item:hover svg{stroke:var(--text)}
.nav-divider{height:1px;background:var(--border);margin:4px 0}

/* ── 패널 공통 ── */
.panel{display:none}
.panel{align-self:stretch}
.panel.active{display:flex;flex-direction:column;gap:10px;width:100%;align-items:stretch}

/* ── 패널 헤더 ── */
.panel-head{font-size:17px;font-weight:700;color:var(--text);letter-spacing:-.4px;padding:2px 0 6px}
/* 모든 패널 카드 너비/형식 통일 — 항상 꽉 차게 */
.panel .card,.right-col .card{width:100%;align-self:stretch;box-sizing:border-box}
.panel>*{width:100%;box-sizing:border-box}
.panel .card{width:100%;box-sizing:border-box}
.panel-head{width:100%}

/* ── is-mypage-view 활성화(2026-07-28, 마이페이지-27/28 [1단계]) ──
   위 .left-col/.right-col/.profile-card/.nav-card/.panel 등은 진작 프로토타입에서
   그대로 옮겨져 있었지만(마이페이지 CSS 섹션 시작부터) 지금까지 이 클래스들을 쓰는
   HTML이 서버 어디에도 없어(server/ 전체 grep 결과 0건) 죽은 CSS였다 — 이번 단계에서
   처음 실사용. write_form.html(is-write-view)/​_read.html(is-post-view)과 동일한
   원칙: JS로 열고 닫는 .fullpage-overlay(위 997행, 기본 display:none이라 그대로 쓰면
   안 보임)는 안 쓰고, 실제 URL 페이지 + body 클래스로 CSS만 전체화면처럼 보이게 한다.
   레이아웃 대상은 main 전체가 아니라 .feed-col.momya-module(모듈 출력이 실제로 꽂히는
   지점, layout.html 166행) 하나다 — main >.layout>.content>.content-inner 안에 몇
   겹 중첩돼 있어 그 조상들의 board-mode/section-mode flex 규칙과 굳이 안 싸워도,
   .feed-col 자신에게 display:grid 를 주면 그 부모가 어떻게 배치하든 .feed-col 내부
   구조는 그대로 grid로 그려진다.
   header(전역 헤더)는 :not(.mp-fp-header) 로 골라 숨긴다 — 이 화면 자신의 미니헤더도
   같은 <header> 태그라 무조건 숨기면 같이 사라진다(mypage_fullpage_start.html 참고).
   #drawer/#drawerOverlay 는 <header> 밖의 형제 요소라(layout.html 220~221행) 전역
   헤더를 숨겨도 영향 없음 — 미니헤더의 햄버거 버튼이 그대로 toggleDrawer() 호출 가능. */
body.is-mypage-view header:not(.mp-fp-header){display:none}
body.is-mypage-view .sidebar{display:none}
body.is-mypage-view .banner-col{display:none}
/* [마이페이지 디자인-2] 위 두 줄만으로는 720px 이하/721~959px 구간에서 배너가 그대로
   샜다 — is-write-view 가 903~925행에서 이미 겪은 것과 동일한 명시도 싸움: 793행
   `.content-inner.board-mode .banner-col{display:contents}`(0,3,0)·96행
   `body:not(.is-post-view) .content-inner.board-mode .banner-col{display:contents}`
   (0,4,1) 둘 다 위 줄(0,2,1)보다 명시도가 높아 그 구간에서 이겨버린다(마이페이지는
   is-post-view 가 아니고, mid 가 'home'/섹션이 아니라 board-mode 로 떨어짐 —
   layout.html $momya_content_mode 계산 참고). is-write-view 와 동일하게 폭별로
   명시도를 맞추는 대신 !important 로 전 구간 무조건 우선시킨다. */
body.is-mypage-view .content-inner.board-mode .banner-col{display:none!important}

/* [2026-07-31, 통합검색 momya 스킨] 검색결과 화면(전체/문서/댓글)은 우측 배너
   컬럼("엄마야 PICK"/"엄마야 이벤트")을 완전히 숨긴다 — is-write-view/
   is-mypage-view 와 동일한 body 클래스 패턴(신규 CSS 컴포넌트 없음,
   integration_search/skins/momya/header.html 의 Context::addBodyClass
   ('is-search-view') 하나로 충분). 위 is-mypage-view 항목에서 이미 확인한
   명시도 문제(순수 .banner-col{display:none} 만으로는 .content-inner.
   board-mode .banner-col{display:contents}(879행)·body:not(.is-post-view)
   .content-inner.board-mode .banner-col{display:contents}(97행, 명시도 더
   높음)에 특정 폭 구간에서 밀림)가 여기서도 그대로 재현될 수 있어 처음부터
   !important 로 건다. 검색은 board-mode(일반 게시판)뿐 아니라 section-mode
   (공지/이벤트 화면에서 검색했을 때, 119행에 별도 .banner-col{display:
   contents} 규칙 있음)·홈(mode 클래스 없음) 어디서나 시작될 수 있어, 특정
   .content-inner.board-mode 처럼 모드 하나만 좁혀 걸지 않고 .banner-col
   자체를 곧장 겨눈다 — !important 라 명시도 계산과 무관하게 어떤 모드에서든
   이긴다. */
body.is-search-view .banner-col{display:none!important}
body.is-mypage-view{background:var(--surface-2)}
/* [마이페이지 디자인-6] sticky가 전혀 안 되고 상단에 여백이 남는 문제 — 디자인-5의
   overflow-x:hidden 가설을 실측으로 반증했다: 그 두 줄을 빼도 sticky는 그대로
   깨진 채였다(스크롤해도 header가 y=0 그대로가 아니라 스크롤한 만큼 그대로
   같이 밀려 올라갔다 — 실기기 증상과 동일). 진짜 원인은 position:sticky 요소가
   display:grid 컨테이너의 직계 grid item이면 이 사이트가 쓰는 렌더링 엔진에서
   sticky가 전혀 동작하지 않는 것이었다 — grid 유무만 다르고 나머지는 완전히 같은
   최소 재현(<div style="display:grid"><header style="position:sticky">)으로
   확인했고, 컨테이너 높이·overflow-x 유무와 무관하게 재현됐다(1500px 높이를 줘도
   grid 안이면 깨지고, 평범한 div 안이면 그대로 잘 붙는다). 그래서 header를 grid
   밖으로 뺀다 — .feed-col.momya-module 자신은 더 이상 grid가 아니라 폭 제한
   컨테이너 역할만 하고, 실제 2단 레이아웃은 새 안쪽 래퍼 .mp-fp-grid-body 하나로
   옮겼다(left-col/right-col을 감싼다 — mypage_fullpage_start.html/
   mypage_fullpage_end.html에 래퍼 div 추가 수반, 그 파일 쪽 주석 참고). header는
   이제 grid의 자식이 아닌 평범한 형제라 sticky가 정상 동작한다(실측: 500px/1200px
   스크롤 양쪽 다 y=0 유지 확인).
   가로 스크롤 방지도 overflow-x:hidden 대신 근본 원인을 직접 보정하는 방식으로
   바꿨다 — 100vw가 스크롤바 폭까지 포함해서 계산되는 걸 JS로 실제 스크롤바 폭을
   측정해 --mp-sbw CSS 변수로 넘기고 width/margin 계산에서 빼는 방식(JS는
   mypage_fullpage_start.html 스크립트). overflow-x:hidden을 아예 안 써서 sticky를
   깨는 원인 자체가 없다 — html{overflow-x:hidden}도 이번에 제거했다. */
/* [마이페이지 디자인-7] main{padding:22px 20px}(전역, 54행)이 top까지 적용되면서
   .mp-fp-header(main 안에 위치)가 뷰포트 최상단에서 22px 밀려 있었다 — 실측(main의
   padding-top만 0으로 바꿔보니 header top이 정확히 0이 됨, 다른 여백 요소 없음)으로
   확정. mypage 스코프로 top만 override하고 좌우/아래 20px·22px는 그대로 둔다(전역
   main{} 규칙 자체는 안 건드림 — 다른 화면 회귀 없음). */
body.is-mypage-view main{padding-top:0}
body.is-mypage-view .feed-col.momya-module{width:100%;max-width:1060px;margin:0 auto}
/* margin-top:22px — 디자인-6에서 header를 grid 밖으로 빼면서(원래 grid의 gap:18px가
   암묵적으로 담당하던 header↔콘텐츠 세로 간격) 빠졌던 간격을 홈 화면 기준(main
   padding-top 22px와 동일한 값, 디자인-7 조사에서 실측)으로 복원한다. */
body.is-mypage-view .mp-fp-grid-body{display:grid;grid-template-columns:220px minmax(0,1fr);gap:18px;align-items:start;width:100%;margin-top:22px}
body.is-mypage-view .mp-fp-header{
  width:calc(100vw - var(--mp-sbw, 0px));
  margin-left:calc(50% - 50vw + var(--mp-sbw, 0px)/2);
  margin-right:calc(50% - 50vw + var(--mp-sbw, 0px)/2);
}
@media(max-width:720px){
  body.is-mypage-view .mp-fp-grid-body{grid-template-columns:1fr;gap:12px}
  body.is-mypage-view .left-col{width:100%;position:static}
  body.is-mypage-view .profile-card{flex-direction:column;align-items:stretch;text-align:left;padding:16px;gap:16px}
  body.is-mypage-view .profile-top{flex-direction:row;align-items:center;gap:14px;text-align:left}
  body.is-mypage-view .profile-meta{flex:1;min-width:0}
  body.is-mypage-view .right-col{width:100%;max-width:100%}
}

/* ── 게시글 / 댓글 / 좋아요 리스트 ── */
.post-list{display:flex;flex-direction:column}
.post-item{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-bottom:1px solid var(--border);cursor:pointer;transition:background .12s}
.post-item:last-child{border-bottom:none}
.post-item:hover{background:var(--bg)}
.post-badge{font-size:11px;font-weight:600;padding:3px 4px;border-radius:6px;flex-shrink:0;white-space:nowrap;margin-top:1px;width:78px;text-align:center;box-sizing:border-box}
.post-body{flex:1;min-width:0}
.saved-unsave{flex-shrink:0;background:none;border:none;cursor:pointer;color:var(--green);padding:4px;margin-top:-2px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:background .12s,color .12s}
.saved-unsave:hover{background:var(--green-soft)}
.post-title{font-size:14px;font-weight:600;color:var(--text);line-height:1.4;margin-bottom:4px;word-break:break-word;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;max-height:2.8em;min-height:2.8em}
.post-meta{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--text-3)}
.post-meta span{display:flex;align-items:center;gap:3px}
/* [마이페이지 디자인-23 수정] 저장한 글 카드 — mypage_only.html panel-saved
   기준(savedItemHTML/savedMoveDropdownHTML).
   [갱신, 디자인-26, 2026-07-30] 프로토타입은 .saved-item{align-items:center}
   로 부모 자체를 세로 중앙 정렬해서 배지까지 같이 중앙으로 밀렸다(실측 확인:
   document_list 배지는 카드 위에서 15px, 저장한 글 배지는 33.84px — 같은
   카드 높이인데 배지만 아래로 처져 보였다). 배지+제목은 다른 3개 화면과
   동일하게 .post-item 기본값(flex-start)을 그대로 쓰고, 이동/휴지통
   액션 묶음만 align-self 로 개별적으로 세로 중앙에 맞춘다. */
.saved-meta-actions{margin-left:auto;display:flex;align-items:center;gap:14px;flex-shrink:0;padding-right:4px;align-self:center}
.trash-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;color:var(--text-3);cursor:pointer;border-radius:8px;transition:all .15s;flex-shrink:0}
.trash-btn:hover{color:var(--red);background:var(--red-soft)}
.trash-btn svg{width:17px;height:17px}
/* [마이페이지 디자인-32] 임시저장 카드를 클릭해 그 자리에서 펼치는 본문
   미리보기 상자 — mypage_only.html draftItemHTML() 값 그대로(신규 클래스,
   기존 .sv-content 는 스타일이 아예 없는 맨 div였다).
   [마이페이지 디자인-32 수정] getContent(false) 가 에디터 원본(이미지·투표
   위젯 등)을 그대로 뱉는데, 이 카드 폭에 맞춘 제약이 하나도 없어 특정
   중간 폭에서 옆으로 튀어나오는 게 실기기로 확인됐다 — overflow-x:hidden
   을 안전망으로 걸고, img 는 글상세 본문(.momya-read .pv-body img,
   board.momya.css:101)과 동일한 값을 재사용, 투표 위젯은 자체 CSS
   (widgets/pollWidget/skins/momya/css/poll.css)의 .momya-poll-wrap{
   max-width:420px} 가 고정폭이라 그보다 좁은 카드에서 그대로 넘치는 게
   원인이었다 — 이 스코프 안에서만 max-width:100%로 덮어써 카드 폭을
   넘지 않게 한다(위젯 자체 CSS 파일은 다른 화면에도 쓰이므로 안 건드림). */
.draft-preview{background:var(--surface-2);border-radius:9px;padding:12px 14px;margin:8px 0;font-size:var(--fs-label);color:var(--text-2);line-height:1.6;cursor:default;overflow-x:hidden}
.draft-preview img{max-width:100%;height:auto;border-radius:8px}
.draft-preview .momya-poll-wrap{max-width:100%}
.post-thumb{width:60px;height:60px;border-radius:8px;overflow:hidden;flex-shrink:0;border:1px solid var(--border)}
.post-thumb img{width:100%;height:100%;object-fit:cover;display:block}

/* 쪽지함 아이템 — [마이페이지 디자인-33] .post-item 재사용, 게시판 배지가 없는
   대신 안읽음 점 + 본문 미리보기 한 줄이 추가된 변형. 미리보기 줄은 내용이
   비어도 min-height 로 한 줄 분량을 예약해 카드 높이가 흔들리지 않게 한다.
   [2차 수정, 실사용자 데이터로 재발] 제목에 쓰던 -webkit-line-clamp(요구하는
   display:-webkit-box가 있어야만 동작)를 버리고, 이미 문제없이 동작 중이던
   .msg-preview 와 동일한 표준 1줄 말줄임(white-space:nowrap+overflow:hidden+
   text-overflow:ellipsis)으로 통일했다 — 벤더 프리픽스 박스 모델의 표시모드
   충돌 여지 자체를 없앤다. 부모 .post-body 는 이미 flex:1+min-width:0(공용
   .post-item 규칙)이라 형제(체크박스 슬롯)를 밀어내지 않지만, title/preview
   자신에게도 min-width:0 을 명시해 안전장치를 하나 더 둔다. */
.msg-item .post-title{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;max-height:1.4em;min-height:1.4em}
.msg-unread-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--green);vertical-align:middle;margin-right:5px}
.msg-preview{font-size:12px;color:var(--text-3);line-height:1.4;margin-bottom:4px;min-height:1.4em;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.msg-item .post-meta{flex-wrap:wrap;row-gap:3px}
/* 일괄삭제 체크박스 — 4개 마이페이지 목록엔 전례가 없다(전부 개별 행 버튼
   방식, 체크박스 자체가 없음). 대신 스크랩 목록의 이동/삭제 아이콘이 앉는
   자리(.saved-meta-actions, 카드 우측 flex 슬롯)를 그대로 재사용했다 —
   내용물(체크박스)만 다르고 위치·정렬 방식 자체는 기존 관례를 따른 것.
   [3차 수정] 18px가 너무 커 보인다는 피드백으로 16px로 축소(전체선택과 동일값). */
.msg-item .saved-meta-actions input[type="checkbox"]{margin:0;width:16px;height:16px}

/* 전체선택 + 일괄삭제 줄 — 쪽지함 전용 신규 컴포넌트(다른 목록엔 없음).
   전체선택 체크박스는 개별 행 체크박스와 크기를 맞췄다(둘 다 16px, [3차 수정]). */
.msg-select-bar{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:2px 4px 10px}
.msg-selectall-label{display:flex;align-items:center;gap:7px;font-size:var(--fs-label);color:var(--text-2);cursor:pointer;user-select:none}
.msg-selectall-label input[type="checkbox"]{margin:0;width:16px;height:16px}
/* [2차 수정] 프로토타입 원본(빨간 배경+흰 글씨)으로 교체 — 기존엔 배경이
   연한 톤(--red-soft)이라 텍스트만 빨갛게 보였다. */
.btn-delete-red{padding:9px 16px;font-size:var(--fs-caption);font-weight:600;color:#fff;background:var(--red);border:1.5px solid var(--red);border-radius:var(--radius-sm);cursor:pointer;transition:background .12s,border-color .12s}
.btn-delete-red:hover{background:var(--red-d);border-color:var(--red-d)}

/* 쪽지 상세보기 + 인라인 답장 — [마이페이지 디자인-34] mypage_only.html
   #msgDetail/#msgCompose CSS 값 그대로(momya.css 파일 안에 이미 있던 값을
   이번에 처음 연결). [마이페이지-35, 2026-07-30] 답장 에디터는 CKEditor를
   완전히 빼고 순수 textarea로 교체 — momya-write 마커도 같이 제거했다
   (더는 CKEditor 풀 툴바를 물려받을 필요가 없음). */
.msg-detail{margin-bottom:10px;padding:16px}
.msg-detail-title{font-size:var(--fs-card);font-weight:700;color:var(--text);margin-bottom:6px}
.msg-detail-meta{display:flex;align-items:center;gap:10px;font-size:var(--fs-caption);color:var(--text-3);margin-bottom:14px}
.msg-detail-body{font-size:var(--fs-body);color:var(--text-2);line-height:1.8;padding:20px 4px;border-top:1px solid var(--border);border-bottom:1px solid var(--border);margin-bottom:14px;min-height:120px;width:100%;box-sizing:border-box}
.msg-detail-foot{display:flex;gap:8px;flex-wrap:wrap}
.msg-compose{margin-bottom:10px;padding:16px}
.msg-reply-textarea{min-height:140px;resize:vertical;line-height:1.6}
.reply-char-count{font-size:var(--fs-caption);color:var(--text-3);text-align:right;margin-top:4px}
.reply-char-count.over{color:var(--red)}

/* 댓글 아이템 */
/* [마이페이지 디자인-27] 카드 자체의 상하 padding만 14px→12px로 줄임(좌우 16px
   유지) — 배지줄/본문/날짜 사이 내부 줄간격(.comment-origin margin-bottom,
   .comment-meta margin-top)과 .comment-text의 min/max-height:3em(디자인-25에서
   맞춘 2줄 고정 카드높이)은 그대로 둔다. */
.comment-item{display:block;padding:12px 16px;border-bottom:1px solid var(--border);cursor:pointer;transition:background .12s}
.comment-item:last-child{border-bottom:none}
.comment-item:hover{background:var(--bg)}
.comment-origin{font-size:12px;color:var(--text-3);margin-bottom:5px;display:flex;align-items:center;gap:5px}
/* [마이페이지 디자인-25] 원글 제목은 배지+화살표 옆 보조정보라 1줄로 축약 —
   flex 자식은 min-width:0 이 없으면 콘텐츠 크기 밑으로 안 줄어들어 ellipsis가
   무시되므로 반드시 같이 선언한다. */
.comment-origin-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}
/* [마이페이지 디자인-28] word-break:break-word/overflow-wrap:break-word 조합을
   word-break:break-all로 교체 — 로컬 재현 결과: 순수 반복 문자만 있는 텍스트는
   위치(줄 처음이든 아니든) 상관없이 두 방식 다 동일하게 렌더링됐지만, "뱃지/짧은
   텍스트 뒤에 긴 토큰(URL 등 공백 없는 덩어리)이 이어지는" 케이스에서 진짜 차이를
   찾았다 — break-word 계열은 그 긴 토큰이 현재 줄의 남은 폭에 안 들어가면 토큰
   전체를 다음 줄로 통째로 밀어버려 현재 줄이 짧게 남은 채(예: "이거 링크"만 있고
   뒤는 전부 공백) 끝나버린다. break-all 은 그 지점에서 즉시 글자 단위로 잘라
   현재 줄의 남는 폭까지 확실히 채운 뒤 다음 줄로 넘어간다 — line-clamp 와 궁합도
   더 안정적이다. 일반 문장(짧은 단어들, 긴 토큰 없음)은 두 방식 결과가 동일해
   회귀 없음을 로컬 렌더링 실측으로 확인했다. */
.comment-text{font-size:14px;font-weight:600;color:var(--text);line-height:1.5;word-break:break-all;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;max-height:3em;min-height:3em}
.comment-meta{font-size:11px;color:var(--text-3);margin-top:4px}

/* 빈 상태 */
.empty-state{padding:60px 20px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:10px}
.empty-icon{width:56px;height:56px;border-radius:50%;background:var(--bg);display:flex;align-items:center;justify-content:center;margin-bottom:4px}
.empty-title{font-size:14px;font-weight:600;color:var(--text-2)}
.empty-desc{font-size:13px;color:var(--text-3);line-height:1.6}
.btn-go{margin-top:4px;background:var(--black);color:#fff;border:none;border-radius:9px;padding:9px 20px;font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;transition:opacity .15s}
.btn-go:hover{opacity:.8}

/* ── 설정 패널 ── */
.setting-section{margin-bottom:4px;width:100%;box-sizing:border-box}
.setting-section .card{width:100%;box-sizing:border-box}
.setting-label{font-size:11px;font-weight:600;color:var(--text-3);text-transform:uppercase;letter-spacing:.06em;padding:0 16px;margin-bottom:6px}

/* 자동로그인 관리(디자인-10) */
.device-list{display:flex;flex-direction:column}
.device-item{display:flex;flex-direction:column;gap:10px;padding:14px 16px;border-bottom:1px solid var(--border)}
.device-item:last-child{border-bottom:none}
.device-top{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.device-name{font-size:var(--fs-body);font-weight:600;color:var(--text)}
.device-os{font-size:var(--fs-caption);color:var(--text-3);margin-top:2px}
.device-del{flex-shrink:0;background:none;border:none;color:var(--red);font-size:var(--fs-caption);font-weight:600;cursor:pointer;text-decoration:underline;text-underline-offset:2px;padding:2px;font-family:inherit}
.device-del:hover{color:var(--red-d)}
.device-meta{display:flex;gap:24px;flex-wrap:wrap}
.device-meta-col{display:flex;flex-direction:column;gap:3px}
.device-meta-label{font-size:var(--fs-micro);color:var(--text-3);font-weight:600}
.device-meta-val{font-size:var(--fs-caption);color:var(--text-2);line-height:1.5}

/* 수신 설정(디자인-15) */
.radio-row{display:flex;align-items:center;gap:18px;padding:2px 0}
.radio-opt{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-body);color:var(--text-2);cursor:pointer}
.radio-opt input[type="radio"]{width:16px;height:16px;accent-color:var(--green);cursor:pointer;margin:0}

/* 설정 행 */
.setting-row{display:flex;align-items:center;gap:12px;padding:14px 16px;border-bottom:1px solid var(--border)}
.setting-row:last-child{border-bottom:none}
.setting-info{flex:1;min-width:0}
.setting-key{font-size:13px;font-weight:500;color:var(--text-2);margin-bottom:3px}
.setting-val{font-size:14px;font-weight:500;color:var(--text);word-break:break-all}
.btn-change{background:none;border:1.5px solid var(--border-2);border-radius:8px;padding:6px 13px;font-family:inherit;font-size:12px;font-weight:600;color:var(--text-2);cursor:pointer;transition:all .15s;flex-shrink:0;white-space:nowrap}
.btn-change:hover{border-color:var(--green);color:var(--green)}

/* 비밀번호 폼 */
.pw-form{padding:16px;display:flex;flex-direction:column;gap:10px}
.pw-field{display:flex;flex-direction:column;gap:5px}
.pw-label{font-size:12px;font-weight:600;color:var(--text-2)}
.pw-input-wrap{display:flex;align-items:center;border:1.5px solid var(--border-2);border-radius:9px;padding:10px 13px;transition:border-color .15s,box-shadow .15s;background:var(--surface)}
.pw-input-wrap:focus-within{border-color:var(--green);box-shadow:0 0 0 3px var(--green-soft)}
.pw-input-wrap input{flex:1;font-family:inherit;font-size:14px;color:var(--text);border:none;outline:none;background:none;min-width:0}
.pw-input-wrap input::placeholder{color:var(--text-3)}
.pw-eye{background:none;border:none;cursor:pointer;color:var(--text-3);display:flex;align-items:center;padding:0;transition:color .12s;flex-shrink:0}
.pw-eye:hover{color:var(--text)}
/* layout.html 의 auth-modal 용 바깥 범위 .pw-eye{position:absolute;...}(1736행 부근)가
   클래스 명시도가 같아 파일 뒤쪽에 있다는 이유만으로 이 pw-input-wrap 안의 눈알에도
   그대로 얹혀서, 세 아이콘이 전부 같은 위치로 겹쳐 보이던 버그(2026-07-29) 수정.
   .pw-form 은 이 컴포넌트 전용 클래스라 다른 화면에 영향 없음. */
.pw-input-wrap .pw-eye{position:static;transform:none;opacity:1}
.pw-hint{font-size:11px;color:var(--text-3)}
.pw-err{font-size:12px;color:var(--red);min-height:16px}
.pw-foot{display:flex;justify-content:flex-end;gap:7px;padding-top:2px}
.btn-cancel-sm{background:none;border:1.5px solid var(--border-2);border-radius:8px;padding:9px 15px;font-family:inherit;font-size:13px;font-weight:500;color:var(--text-2);cursor:pointer;transition:all .15s}
.btn-cancel-sm:hover{border-color:var(--text);color:var(--text)}
.btn-save{background:var(--black);color:#fff;border:none;border-radius:8px;padding:9px 18px;font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;transition:opacity .15s}
.btn-save:hover:not(:disabled){opacity:.8}
.btn-save:disabled{background:var(--border-2);color:var(--text-3);cursor:not-allowed}

/* 위험 구역 */
.danger-row{padding:14px 16px;display:flex;align-items:center;justify-content:space-between;gap:12px}
.logout-title{font-size:16px;font-weight:700;color:var(--text)}
.danger-info .danger-title{font-size:14px;font-weight:600;color:var(--red)}
.danger-info .danger-desc{font-size:12px;color:var(--text-2);margin-top:2px}
.btn-logout-set{background:none;border:1.5px solid var(--border-2);border-radius:8px;padding:7px 14px;font-family:inherit;font-size:13px;font-weight:600;color:var(--text-2);cursor:pointer;transition:all .15s;flex-shrink:0}
.btn-logout-set:hover{border-color:var(--text-3);color:var(--text);background:var(--surface-2)}
.withdraw-link-wrap{text-align:center;padding:18px 0 4px}
.withdraw-link{font-size:12px;color:var(--text-3);cursor:pointer;text-decoration:underline;text-underline-offset:2px}
.withdraw-link:hover{color:var(--red)}
.btn-danger{background:none;border:1.5px solid var(--red);border-radius:8px;padding:7px 14px;font-family:inherit;font-size:13px;font-weight:600;color:var(--red);cursor:pointer;transition:all .15s;flex-shrink:0}
.btn-danger:hover{background:var(--red-soft)}

/* ── 인라인 수정 폼 ── */
.inline-form{padding:14px 16px;background:var(--bg);border-bottom:1px solid var(--border);display:none;flex-direction:column;gap:10px;animation:slideDown .18s ease}
@keyframes slideDown{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
.inline-form.open{display:flex}
.if-field{display:flex;flex-direction:column;gap:5px}
.if-label{font-size:12px;font-weight:600;color:var(--text-2)}
.if-input{width:100%;font-family:inherit;font-size:14px;color:var(--text);border:1.5px solid var(--border-2);border-radius:9px;padding:10px 13px;outline:none;background:var(--surface);transition:border-color .15s,box-shadow .15s}
.if-input:focus{border-color:var(--green);box-shadow:0 0 0 3px var(--green-soft)}
.if-input::placeholder{color:var(--text-3)}
.if-hint{font-size:11px;color:var(--text-3)}
.if-err{font-size:12px;color:var(--red);min-height:16px}
.if-foot{display:flex;justify-content:flex-end;gap:7px}

/* 인증 코드 행 */
.code-row{display:flex;align-items:center;gap:8px}
.code-row .if-input{flex:1}
.code-timer{font-size:13px;font-weight:600;color:var(--red);flex-shrink:0;min-width:36px;text-align:right}
.send-btn{background:var(--surface);border:1.5px solid var(--border-2);border-radius:8px;padding:9px 13px;font-family:inherit;font-size:12px;font-weight:600;color:var(--text-2);cursor:pointer;transition:all .15s;flex-shrink:0;white-space:nowrap}
.send-btn:hover{border-color:var(--green);color:var(--green)}

/* ── Toast ── */
.toast{position:fixed;bottom:26px;left:50%;transform:translateX(-50%) translateY(14px);background:var(--black);color:#fff;font-size:13px;font-weight:500;padding:10px 20px;border-radius:999px;opacity:0;transition:all .26s;z-index:100;pointer-events:none;white-space:nowrap}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
/* 마이페이지 토스트 (오버레이 위, 긴 문구 줄바꿈) */
.mpToast{position:fixed;bottom:26px;left:50%;transform:translateX(-50%) translateY(14px);background:var(--black);color:#fff;font-size:13px;font-weight:500;padding:11px 20px;border-radius:14px;opacity:0;transition:all .26s;z-index:9999;pointer-events:none;max-width:min(92vw,400px);text-align:center;line-height:1.5;word-break:keep-all;box-shadow:0 8px 24px rgba(0,0,0,.28)}
.mpToast.show{opacity:1;transform:translateX(-50%) translateY(0)}

/* ── 확인 모달 ── */
.confirm-overlay{position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:60;display:none;align-items:center;justify-content:center;padding:20px}
.confirm-overlay.show{display:flex;animation:fadeIn .18s ease}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
.confirm-modal{background:var(--surface);border-radius:var(--radius);width:100%;max-width:380px;padding:24px;animation:popUp .2s cubic-bezier(.2,.9,.3,1) both}
@keyframes popUp{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
.confirm-title{font-size:16px;font-weight:700;margin-bottom:8px;letter-spacing:-.3px}
.confirm-desc{font-size:13px;color:var(--text-2);line-height:1.6;margin-bottom:20px}
.confirm-foot{display:flex;justify-content:flex-end;gap:8px}

/* ── 타인 프로필 모달 [마이페이지-37] — mypage_only.html memberProfileOverlay 값 그대로
   (.confirm-overlay/.confirm-modal 은 위 확인 모달과 공용, .profile-avatar/.profile-name/
   .setting-row/.setting-key/.setting-val/.btn-save 도 기존 클래스 재사용, 새로 정의 안 함) */
.member-profile-modal{max-width:320px;min-width:320px;padding:26px 22px 22px;position:relative}
.member-profile-close{position:absolute;top:14px;right:14px;width:28px;height:28px;border:none;background:none;color:var(--text-3);cursor:pointer;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:all .15s}
.member-profile-close:hover{background:var(--surface-2);color:var(--text)}
.member-profile-close svg{width:16px;height:16px}
.member-profile-top{display:flex;flex-direction:column;align-items:center;gap:12px;margin-bottom:18px}
/* [버그 수정, 2026-07-31, 간격 통일 + 재조사] 5px 로 선언돼 있었지만 실제
   렌더된 간격은 9px 였다 — .profile-name-row 와 완전히 같은 원인
   (.grade-tag.inline{margin-left:4px} 가 안 지워진 채 gap 위에 그대로 더해짐,
   5+4=9, 로컬 목업 실측 확인). 다른 5곳과 동일하게 3px 로 통일하고 마진 중복도
   제거 — "타인 프로필 모달만 유독 더 잘려 보인다"는 재신고의 정체는 사실
   이 간격 문제가 아니라 아이콘 자체 크기(당시 17px, 이번에 21px로 확대)였다는
   게 로컬 목업 재현으로 확인됐다(간격 자체가 잘림에 영향을 주진 않지만, 같은
   라운드에서 발견돼 함께 정리). */
.member-profile-name-row{display:flex;align-items:center;gap:3px}
.member-profile-name-row .grade-tag.inline{margin-left:0}
/* [크기 조정, 2026-07-31, 이 모달 전용] 다른 5곳(글/댓글/목록/피드/마이페이지)은
   21px 유지, 이 모달만 19px 로 축소 — 사용자 명시적 지시. 공용 .grade-tag
   .grade-badge(21px) 규칙은 그대로 두고 이 컨테이너 스코프에서만 덮어쓴다.
   .grade-icon-img/.grade-icon-emoji 는 calc(100% - 6px) 로 부모 크기에 상대적
   이라 부모(.grade-badge)만 19px 로 바뀌면 자동으로 13px(19-6)로 다시 계산되고,
   라운딩(3px)도 그대로 둬도 마진(3px)=라운딩(3px) 안전조건은 박스 크기와
   무관하게 계속 성립한다(수식은 이 파일 위쪽 .grade-icon-img 주석 참고). */
.member-profile-name-row .grade-badge{width:19px;height:19px}
.member-profile-name-row .profile-name{max-width:200px}
.member-profile-info{border-top:1px solid var(--border)}
.member-profile-info .setting-row{padding:12px 2px}
.member-profile-msg-btn{width:100%;margin-top:16px;display:flex;align-items:center;justify-content:center;gap:6px}
.member-profile-msg-btn svg{width:14px;height:14px}

/* ── 공유 시트 (바텀시트) ── */
.share-overlay{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:90;display:none;align-items:flex-end;justify-content:center}
.share-overlay.show{display:flex;animation:fadeIn .2s ease}
.share-sheet{background:var(--surface);width:100%;max-width:480px;border-radius:20px 20px 0 0;padding:8px 20px 26px;animation:sheetUp .26s cubic-bezier(.2,.9,.3,1) both}
@keyframes sheetUp{from{transform:translateY(100%)}to{transform:none}}
.share-grab{width:40px;height:4px;border-radius:999px;background:var(--border-2);margin:8px auto 14px}
.share-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:18px}
.share-title{font-size:16px;font-weight:700;letter-spacing:-.3px;color:var(--text)}
.share-x{background:var(--surface-2);border:none;width:30px;height:30px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--text-2);transition:background .15s}
.share-x:hover{background:var(--border)}
.share-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px 4px;margin-bottom:18px}
.share-item{display:flex;flex-direction:column;align-items:center;gap:7px;background:none;border:none;cursor:pointer;font-family:inherit;padding:0;transition:transform .1s}
.share-item:active{transform:scale(.92)}
.share-ic{width:52px;height:52px;flex:0 0 52px;aspect-ratio:1;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:20px;overflow:hidden}
.share-ic svg{flex-shrink:0}
.share-lbl{font-size:11px;color:var(--text-2);font-weight:500;white-space:nowrap}
.share-copy-row{display:flex;align-items:center;gap:8px;border:1.5px solid var(--border);border-radius:12px;padding:8px 8px 8px 14px;background:var(--surface-2)}
.share-url{flex:1;min-width:0;font-size:12px;color:var(--text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.share-copy-btn{background:var(--black);color:#fff;border:none;border-radius:9px;padding:9px 16px;font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;flex-shrink:0;transition:opacity .15s}
.share-copy-btn:hover{opacity:.82}
@media(min-width:741px){
  .share-overlay{align-items:center}
  .share-sheet{border-radius:18px;max-width:380px;padding:20px 22px 24px}
  .share-grab{display:none}
}

/* 배지 색상 */
.bg-free{background:var(--surface-2);color:var(--text)}
.bg-preg{background:#F5F3FF;color:#5B21B6}
.bg-info{background:#F0FDF4;color:#166534}
.bg-buy{background:#FFFBEB;color:#92400E}
.bg-local{background:#EFF6FF;color:#1E40AF}
.bg-life{background:#FFFBEB;color:#92400E}
.bg-ss{background:#FEF2F2;color:#991B1B}
.bg-notice{background:var(--green-d);color:#fff}

@media(max-width:720px){
  .fullpage-overlay main{grid-template-columns:1fr;padding:14px 12px 50px;gap:12px}
  .left-col{width:100%;position:static}
  /* 모바일 프로필: 위(아바타+이름) → 아래(통계 full-width) */
  .profile-card{flex-direction:column;align-items:stretch;text-align:left;padding:16px;gap:16px}
  .profile-top{flex-direction:row;align-items:center;gap:14px;text-align:left}
  .profile-avatar{width:60px;height:60px}
  .profile-meta{flex:1;min-width:0}
  .profile-name{font-size:16px}
  .profile-email{font-size:12px}
  .profile-stats{margin-top:0;width:100%}
  /* 마이페이지 우측 패널: 모바일에서 글 표시 형식 통일 */
  /* 마이페이지 우측: 모바일 너비/여백 완전 통일 */
  .right-col{width:100%;max-width:100%}
  .panel,.panel.active{width:100%;max-width:100%}
  .right-col .card,.panel .card{width:100%;max-width:100%;box-sizing:border-box}
  .post-list{width:100%}
  .post-item{padding:14px 16px;gap:10px;width:100%;box-sizing:border-box}
  .post-thumb{width:54px;height:54px}
  .post-title{font-size:14px;font-weight:600}
  .comment-item{padding:12px 16px;width:100%;box-sizing:border-box}
  /* [마이페이지 디자인-29] 작성한 글/좋아요한 글만(.post-item-stack 마커 —
     저장한 글은 폴더 이동/삭제 버튼이 있어 구조가 달라 이번 범위에서 제외)
     모바일에서 .comment-item 과 동일한 3단(배지 단독 줄 → 제목 줄 → 메타 줄)
     구조로 전환. flex-direction 만 바꾸면 align-items:flex-start(PC 규칙,
     그대로 상속)가 교차축(세로 모드에선 가로폭)에도 적용돼 .post-body 가
     콘텐츠 크기로만 좁게 잡혀버리므로, .post-body 만 width:100% 로 별도
     지정해 배지는 계속 좁게, 본문(제목+메타)만 전체 폭을 쓰게 한다. PC 규칙
     (미디어쿼리 밖 .post-item{display:flex;...})은 전혀 손대지 않았다. */
  .post-item.post-item-stack{flex-direction:column}
  .post-item.post-item-stack .post-body{width:100%}
}

/* [마이페이지 디자인-30] 저장한 글 모바일 전용 (mypage_only.html 새로고침 후
   재확인한 "저장한 글 모바일 전용" 블록을 그대로 이식 — PC 디자인은 안 건드림).
   #savedList 는 scrapped_list.html 의 .post-list 컨테이너에 이번에 새로 붙인
   id(프로토타입은 <ul id="savedList">지만 이 프로젝트는 <div><a></a></div>
   구조를 그대로 씀 — <ul><a></a></ul> 무효 중첩을 피한 기존 관례 유지, id만
   가져옴). document_list.html/member_info.html 의 .post-item-stack(디자인-29,
   배지 단독 줄 3단 스택)과는 완전히 다른 레이아웃(2열 grid, 이동/삭제 버튼이
   오른쪽 열 전체 높이를 차지)이라 서로 겹치지 않게 #savedList 로 스코프를
   분리했다 — 저장한 글 카드에는 post-item-stack 마커를 안 붙인다.
   아이콘 기본 숨김 규칙을 여기(momya.css, 모바일 override 바로 앞)에 두는 이유:
   member.momya.css 에 뒀더니 그 파일이 <load> 순서상 momya.css 보다 항상
   나중에 로드돼(board.momya.css 와 같은 이유) 명시도가 같은 모바일 override
   (아래 .add-folder-icon{display:block})가 폭과 무관하게 항상 져서 아이콘이
   안 보이는 실측 버그가 났다 — 같은 파일 안에서 소스 순서로만 승부보게 옮김. */
.add-folder-icon,.folder-del-icon{display:none}
/* [마이페이지 디자인-30 수정] 아래 두 선언도 같은 이유(member.momya.css 가
   momya.css 보다 항상 나중에 로드돼 명시도가 같으면 폭과 무관하게 이겨버림)로
   여기로 옮겼다 — PC 기본값(행 정렬/입력창 최대폭)은 여기 두고, 모바일에서
   되살릴 값은 아래 media 블록에서 같은 파일 안 소스 순서로 이긴다.
   [실측으로 확정] #scFolderNameInput 모바일 computed max-width 가 260px로
   나와 member.momya.css 쪽이 이기고 있었음을 확인 — .saved-folder-add-row
   의 align-items 도 동일 패턴(center 로 계속 고정)이라 확인/취소 버튼 wrapper
   가 폭을 못 늘려 justify-content:flex-end 가 무의미해지고 있었다. */
.saved-folder-add-row{align-items:center}
.saved-folder-add-row .if-input{max-width:260px;flex:1}
/* [마이페이지 디자인-30 수정 → 디자인-31 갱신] "이동" 드롭다운 메뉴
   (.sf-dd-menu, position:absolute)가 카드 밖으로 못 나오고 잘리던 원인 —
   .card{overflow:hidden}(momya.css 공용 규칙, 둥근 모서리 클리핑용)이 이
   목록 카드에도 그대로 적용되고 있었다. 사이트 전체 .card 를 건드리면 다른
   화면에도 영향이 가므로 이 목록 카드에만 새 클래스(.saved-list-card)를
   붙였는데, 처음엔 모바일 폭에서만 무조건 overflow:visible 로 풀었다가
   PC에서도 같은 클리핑(폴더 개수 많을 때 "이동" 메뉴가 카드 밑에서 잘림)이
   실기기로 확인돼 디자인-31에서 갱신 — PC 는 카드 모서리를 상시 풀면 hover
   시 사각 모서리가 둥근 테두리 밖으로 삐져나오는 부작용이 있어(디자인-30
   수정에서 이미 확인) 폭 조건 대신 "드롭다운이 실제로 열려있을 때만" 여는
   .dd-open 마커 클래스로 전환했다 — JS(momyaScSyncCardOverflow(), 이 파일
   하단 script)가 .sf-dd.open 이 생기고 없어질 때마다 그 조상 .saved-list-card
   에 이 클래스를 동기화한다. 폭과 무관하게 항상 적용되는 규칙이라 미디어쿼리
   밖에 둔다 — 모바일도 이제 이 방식 하나로 통일(기존 "모바일은 항상 풀림"
   규칙보다 더 안전, 닫혀있을 때는 모바일에서도 모서리가 둥글게 유지됨). */
.saved-list-card.dd-open{overflow:visible}
@media(max-width:720px){
  /* 카드 배치: 1행 카테고리…이동 / 2행 제목 / 3행 메타…삭제 */
  #savedList .post-item{
    display:grid;
    grid-template-columns:1fr auto;
    grid-template-rows:auto auto auto;
    row-gap:6px;
    column-gap:10px;
    align-items:start;
  }
  #savedList .post-item .post-badge{grid-column:1;grid-row:1;margin-top:0}
  #savedList .post-item .post-body{grid-column:1;grid-row:2 / span 2;min-width:0}
  #savedList .post-item .saved-meta-actions{
    grid-column:2;grid-row:1 / span 3;
    display:flex;flex-direction:column;align-items:flex-end;justify-content:space-between;
    align-self:stretch;margin-left:0;padding-right:0;gap:0;
  }
  #savedList .post-meta{flex-wrap:wrap;row-gap:3px}
  /* [정정 판단] 프로토타입은 이 두 클래스를 PC에서도 기본 hidden/none 처리하지만
     (조회수·추천수 자체를 PC 더미에서 안 보여줌), 이 프로젝트는 디자인-23에서
     "작성한 글과 동일하게 조회수/추천수 항상 노출"을 이미 확정했다 — 그 결정과
     충돌하지 않도록 PC 쪽 hidden 규칙은 가져오지 않고, 모바일에서 작성자 닉네임만
     숨기는 이 두 줄만 이식한다(추천수/조회수는 모바일에서도 계속 보임 — 원래도
     숨겨진 적이 없어 아래 표시 규칙은 사실상 스타일 정리용). */
  #savedList .saved-meta-author{display:none}
  #savedList .saved-meta-extra{display:inline-flex;align-items:center;gap:3px}

  /* 폴더 추가 버튼 → 연회색 정사각형 + 아이콘만 */
  .add-folder-btn{width:38px;height:38px;padding:0;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;background:var(--surface-2);color:var(--text-2);border-radius:9px}
  .add-folder-text{display:none}
  .add-folder-icon{display:block;width:18px;height:18px}

  /* 폴더 이름 드롭다운 폭 축소 + 말줄임(실제 id: scFolderDD/scFolderLabel —
     프로토타입은 savedFolderDD/savedFolderLabel 지만 이 파일 실제 id로 교체) */
  #scFolderDD .sf-dd-btn{min-width:0;padding:9px 10px}
  #scFolderLabel{max-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}

  /* 폴더 삭제 버튼 → 휴지통 아이콘만 */
  .folder-del-btn{width:34px;height:34px;padding:0;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center}
  .folder-del-text{display:none}
  .folder-del-icon{display:block;width:15px;height:15px}

  /* 폴더 이름 입력 행: 입력창 풀폭 → 확인/취소 오른쪽 정렬.
     [수정] PC 용 flex:1(member.momya.css, flex-basis:0%)이 flex-direction:
     column 에서는 세로축(높이) 기준으로 재해석돼, height:33px 통일 규칙보다
     flex-grow 로 계산된 높이가 이겨버려 입력창이 18px로 눌리는 실측 버그가
     있었다 — flex:0 0 auto 로 되돌려 flex-basis 를 auto 로 만들면 명시적
     height:33px 가 다시 기준이 된다(가로폭은 align-items:stretch+max-width:
     100%가 이미 담당해 flex-grow 가 없어도 상관없음). */
  .saved-folder-add-row{flex-direction:column;align-items:stretch;gap:10px}
  .saved-folder-add-row .if-input{max-width:100%;flex:0 0 auto}
  .saved-folder-add-actions{justify-content:flex-end}
}

/* [마이페이지 디자인-32] 임시저장 모바일 전용 (mypage_only.html 그대로 이식,
   PC 디자인은 안 건드림) — #savedList 와 마찬가지로 ID 스코프(#draftList)로
   좁혀 다른 화면(.post-item-stack 등)과 겹치지 않게 한다. 저장한 글(#savedList)
   과 달리 "이동" 드롭다운이 없어 액션 열은 삭제 버튼 하나만 끝(justify-content:
   flex-end)에 붙이면 된다 — space-between 이 아님(주의: #savedList 를 참고해
   실수로 space-between 을 복사하지 말 것, 삭제 버튼 하나뿐이라 의미가 다르다).
   [실측으로 발견, 프로토타입 CSS와 의도적으로 다른 점 1가지] 프로토타입 원본은
   grid-template-rows 를 아예 선언 안 해서(암시적 행), 실제 로컬 Chromium
   렌더링에서 grid-row:1/-1 로 걸린 .saved-meta-actions 의 align-self:stretch
   가 적용 안 되고 높이가 배지(32px)만큼만 잡혀 삭제 버튼이 배지 옆(맨 위)에
   붙어버리는 현상을 실측으로 확인했다 — #savedList(폴더 이동이 있어 원래도
   grid-template-rows:auto auto auto 를 명시하고 있었음)와 비교해 "명시적
   grid-template-rows 유무" 차이가 원인임을 직접 격리 테스트로 확정한 뒤, 여기도
   grid-template-rows:auto auto 를 명시적으로 추가했다 — 그 결과 삭제 버튼이
   날짜와 같은 높이(카드 우측 하단)로 정렬됨을 재측정으로 확인. */
@media(max-width:720px){
  /* 카드 배치: 1행 배지 / 2행 제목(+펼치면 내용) / 우측 열에 날짜…삭제 */
  #draftList .post-item{
    display:grid;
    grid-template-columns:1fr auto;
    grid-template-rows:auto auto;
    column-gap:10px;
    row-gap:6px;
    align-items:start;
  }
  #draftList .post-item .post-badge{grid-column:1;grid-row:1;margin-top:0}
  #draftList .post-item .post-body{grid-column:1;grid-row:2}
  #draftList .post-item .saved-meta-actions{
    grid-column:2;grid-row:1 / -1;
    display:flex;flex-direction:column;align-items:flex-end;justify-content:flex-end;
    align-self:stretch;margin-left:0;padding-right:0;
  }
}

/* ══════════ 라이믹스 이식용 추가 (momya layout) ══════════ */
a.sb-board-item,a.ditem{color:inherit;text-decoration:none}
.btn-logout-txt{font-size:13px;font-weight:600;color:var(--text-3);padding:7px 4px;flex-shrink:0;transition:color .15s}
.btn-logout-txt:hover{color:var(--text)}
.bar a.btn-signup,.bar a.btn-login,.bar a.btn-write,.bar a.btn-mypage-icon{display:inline-flex;align-items:center;justify-content:center;gap:5px;text-decoration:none}
/* [모바일 앱형 UI 2-1단계, 2026-08-03] 하단 고정 탭바 — 위 .fab(플로팅 글쓰기 버튼) 완전
   대체. z-index 50은 조사 문서(MOBILE_APP_UI_조사.md "## 4-5")가 확인해둔 안전 구간
   (헤더 40 초과, 오버레이 계열 60 미만 — 오버레이가 뜨면 자동으로 그 밑에 가려짐). 아직
   본문 padding-bottom/토스트 bottom 값 조정은 안 함(2-2단계 범위) — 그 전까지는 탭바가
   화면 최하단 콘텐츠 위에 그냥 겹쳐 보일 수 있다(기존 FAB와 동일한 과도기 상태). */
.tabbar{display:none;position:fixed;left:0;right:0;bottom:0;z-index:50;min-height:var(--tabbar-h);background:rgba(255,255,255,.95);backdrop-filter:blur(12px);border-top:1px solid var(--border);padding:6px 4px calc(6px + env(safe-area-inset-bottom))}
@media(max-width:720px){.tabbar{display:flex}}
/* [2026-08-03 갱신] 아이콘-라벨 간격 2px→6px(너무 붙어보인다는 피드백) */
.tab-item{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:4px 2px;color:var(--text-2);text-decoration:none;font-size:10px;font-weight:600;cursor:pointer}
.tab-item svg{width:22px;height:22px;flex-shrink:0}
.tab-item span{line-height:1.2}
.tab-item.active{color:var(--green)}

/* [2026-08-03 추가, 후속 미세조정] "글쓰기" 가운데 강조(CTA) 탭 — 원형 초록 배경 +
   흰 플러스 + 탭바 위로 튀어나오는 배치(토스뱅크류 앱 패턴). position:absolute로
   원을 배치해 .tab-item의 flex 정렬과 무관하게 독립적으로 위치를 잡는다. 라벨이
   다시 생겨 이제 flex 정상 흐름에 남는 자식이 라벨 하나뿐이라, justify-content를
   center(다른 탭과 동일값이지만 원이 빠지면 라벨 혼자 박스 중앙으로 붕 뜸)에서
   flex-end로 바꿔 라벨을 박스 아래쪽으로 붙여 다른 4개 탭의 라벨 높이와 맞췄다.
   [1차 시도 대비 축소, 참고 이미지 대조 피드백] 48px→40px, 튀어나오는 정도
   -22px→-14px, 그림자 0 4px 12px/.35→0 2px 6px/.22로 전부 낮춰 더 은은하게. */
.tab-item-cta{position:relative;justify-content:flex-end}
.tab-cta-circle{position:absolute;top:-14px;left:50%;transform:translateX(-50%);width:40px;height:40px;border-radius:50%;background:var(--green);color:#fff;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 6px rgba(21,128,61,.22)}
.tab-cta-circle svg{width:20px;height:20px}
/* 헤더 글쓰기(.btn-write)는 모바일에서도 숨기지 않는다(2026-07-22 사용자 최종 결정 —
   지난 라운드에 여기서 숨김 처리했던 걸 되돌림). 전 화면폭 노출이 맞는 상태다. */
/* 모듈(게시판) 출력 영역 기본 보정 — 전용 스킨 적용 전 임시 */
.momya-module{min-width:0}
.momya-module img{max-width:100%;height:auto}
.momya-module table{max-width:100%}
.ev-card .ev-link{display:block;color:inherit;text-decoration:none}

/* ═══ 로그인 모달 ═══ */
/* .overlay 는 333행에 이미 z-index:60 으로 정의돼 있다 — 여기서 9998로 다시
   정의하면(같은 단일 클래스 선택자라 특이도 동일, 나중 선언이 이김) legal-overlay
   (110)보다 위로 올라가 약관 팝업이 인증 모달 뒤에 깔린다(2026-07-28 사고).
   값을 333행과 일치시켜 중복 정의가 서로 충돌하지 않게 한다 */
.overlay{position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:60;display:none;align-items:flex-start;justify-content:center;padding:18px;overflow-y:auto}
.overlay.show{display:flex}
.overlay .modal{margin:auto;background:var(--surface,#fff);border-radius:16px;width:100%;max-width:420px;padding:32px;animation:authPop .22s cubic-bezier(.2,.9,.3,1.2) both;position:relative}
@keyframes authPop{from{opacity:0;transform:translateY(14px) scale(.97)}to{opacity:1;transform:none}}
.auth-close{position:absolute;top:18px;right:18px;background:none;border:none;cursor:pointer;color:var(--text-3,#999);display:flex;padding:4px}
.auth-close:hover{color:var(--text,#333)}
.auth-title{font-weight:800;font-size:20px;letter-spacing:-.5px;margin:0 0 8px;color:var(--text,#222)}
.auth-desc{font-size:13px;color:var(--text-2,#666);line-height:1.6;margin-bottom:22px}
.auth-link{color:var(--green,#16a34a);cursor:pointer;text-decoration:none;font-weight:600}
.auth-label{font-size:12px;font-weight:600;color:var(--text-2,#666);display:block;margin-bottom:6px}
.auth-field-wrap{margin-bottom:16px}
.auth-input{width:100%;font-family:inherit;font-size:14px;color:var(--text,#222);border:1.5px solid var(--border-2,#e5e5e5);border-radius:10px;padding:12px 14px;background:var(--bg,#fafafa);outline:none;transition:border-color .15s;box-sizing:border-box}
.auth-input:focus{border-color:var(--green,#16a34a)}
.auth-err{font-size:12px;color:#dc2626;margin-top:5px;min-height:16px}
.auth-btn{width:100%;background:var(--green,#16a34a);color:#fff;border:none;border-radius:10px;padding:14px;font-family:inherit;font-size:15px;font-weight:700;cursor:pointer;margin-top:4px;transition:background .15s}
.auth-btn:hover:not(:disabled){background:var(--green-d,#15803d)}
.auth-btn:disabled{opacity:.5;cursor:default}
.pw-row{display:flex;align-items:center;position:relative}
.pw-row .auth-input{flex:1}
.pw-eye{background:none;border:none;cursor:pointer;color:var(--text-3,#999);display:flex;align-items:center;padding:0 4px;position:absolute;right:10px;top:50%;transform:translateY(-50%);opacity:.5}

/* ═══ 마이페이지 모달 ═══ */
.mypage-modal{max-width:460px;padding:28px 28px 0;display:flex;flex-direction:column;max-height:90vh}
.mp-profile{display:flex;align-items:center;gap:14px;margin-bottom:22px;padding-right:32px}
.mp-avatar{width:48px;height:48px;border-radius:50%;background:var(--green,#16a34a);color:#fff;display:flex;align-items:center;justify-content:center;font-size:20px;font-weight:700;flex-shrink:0;text-transform:uppercase}
.mp-nick{font-size:16px;font-weight:700;letter-spacing:-.3px;color:var(--text,#222)}
.mp-email{font-size:12px;color:var(--text-2,#666);margin-top:2px}
.mp-tabs{display:flex;border-bottom:1.5px solid var(--border,#eee);margin:0 -28px;padding:0 28px;gap:22px;flex-shrink:0}
.mp-tab{font-size:14px;font-weight:500;color:var(--text-2,#666);padding:0 0 11px;cursor:pointer;position:relative;transition:color .15s}
.mp-tab.active{color:var(--green,#16a34a);font-weight:700}
.mp-tab.active::after{content:"";position:absolute;left:0;right:0;bottom:-1.5px;height:2px;background:var(--green,#16a34a)}
.mp-panel{flex:1;overflow-y:auto;padding:14px 0 0;min-height:180px;max-height:320px}
.mp-list{list-style:none;margin:0;padding:0}
.mp-post-item{padding:12px 4px;border-bottom:1px solid var(--border,#eee);cursor:pointer;transition:background .12s;border-radius:7px}
.mp-post-item:hover{background:var(--surface-2,#f7f7f7)}
.mp-post-title{font-size:14px;font-weight:600;color:var(--text,#222);line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mp-post-meta{font-size:11px;color:var(--text-3,#999);margin-top:4px;display:flex;gap:10px}
.mp-empty{padding:40px 0;text-align:center;color:var(--text-3,#999);font-size:13px;line-height:1.6}
.mp-info-row{display:flex;align-items:center;justify-content:space-between;padding:13px 0;border-bottom:1px solid var(--border,#eee)}
.mp-info-label{font-size:13px;color:var(--text-2,#666);font-weight:500}
.mp-info-val{font-size:13px;color:var(--text,#222)}
.mp-nick-edit{display:flex;align-items:center;gap:10px}
.mp-edit-btn{background:none;border:1px solid var(--border-2,#e5e5e5);border-radius:7px;padding:5px 12px;font-family:inherit;font-size:12px;color:var(--text-2,#666);cursor:pointer;text-decoration:none}
.mp-edit-btn:hover{background:var(--surface-2,#f7f7f7)}
.mp-logout-btn{width:calc(100% + 56px);margin:16px -28px 0;border:none;border-top:1px solid var(--border,#eee);padding:15px;font-family:inherit;font-size:14px;font-weight:600;color:#dc2626;background:none;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:7px;border-radius:0 0 16px 16px;transition:background .15s;text-decoration:none}
.mp-logout-btn:hover{background:#fef2f2}
@media(max-width:760px){.mypage-modal{max-width:100%;padding:22px 20px 0}.mp-tabs{margin:0 -20px;padding:0 20px;gap:16px}.mp-logout-btn{width:calc(100% + 40px);margin:16px -20px 0}}

/* 회원 등급 배지 (1~5단계, 이름형) — 위젯/홈 공용 */
.grade-badge{display:inline-flex;align-items:center;justify-content:center;height:17px;padding:0 7px;border-radius:9px;font-size:0;font-weight:800;color:#fff;margin-left:5px;vertical-align:1px;line-height:1;letter-spacing:-.2px}
.grade-badge::after{font-size:10px}
.grade-badge.grade-1{background:#7cb342}
.grade-badge.grade-1::after{content:"새싹맘"}
.grade-badge.grade-2{background:#26a69a}
.grade-badge.grade-2::after{content:"초보맘"}
.grade-badge.grade-3{background:#ab47bc}
.grade-badge.grade-3::after{content:"열혈맘"}
.grade-badge.grade-4{background:#ff7043}
.grade-badge.grade-4::after{content:"우수맘"}
.grade-badge.grade-5{background:linear-gradient(135deg,#f9a825,#fbc02d);color:#5d4037;box-shadow:0 1px 4px rgba(251,192,45,.5)}
.grade-badge.grade-5::after{content:"소울맘"}

/* 비회원 배지 — 위젯/홈 공용 */
.guest-badge{display:inline-flex;align-items:center;height:17px;padding:0 7px;border-radius:9px;font-size:10px;font-weight:700;color:#fff;background:#9ca3af;margin-left:5px;vertical-align:1px;line-height:1;letter-spacing:-.2px}
