/* ==========================================================================
   디자인 토큰(2026-09-04) - 지금까지 색/모서리/그림자 값이 파일 곳곳에 리터럴로 흩어져 있어서
   같은 성격의 요소인데도 값이 조금씩 달랐다(회색만 7종, border-radius 9종, box-shadow 8종 -
   "화면이 엉성해 보인다"는 지적의 원인 중 하나). 아래 한 곳에서만 정의하고 나머지는 전부
   var()로 참조한다. 색 계열은 이미 대부분 zinc 계열이었어서 그쪽으로 통일했다(상단 최근본
   바만 혼자 다른 회색 계열(#fafafa/#eceef1/#3a3d42)을 쓰고 있었다).
   ========================================================================== */
:root {
  /* 텍스트 */
  --c-ink: #18181b;        /* 제목/강조/채워진 버튼 배경 */
  --c-text: #3f3f46;       /* 본문 */
  --c-text-soft: #52525b;  /* 메뉴 등 보조 본문 */
  --c-muted: #71717a;      /* 부가 정보 */
  --c-faint: #a1a1aa;      /* 가장 옅은 텍스트 */
  /* 링크 파랑 - CLAUDE.md 무채색 원칙의 의도적 예외(카드 도메인/첨부파일처럼 "진짜 링크"에만) */
  --c-link: #2563eb;
  --c-danger: #e11d48;     /* 삭제 버튼(global.css .is-danger)·검증 에러·비공개 뱃지 - 무채색 원칙의 의도적 예외 */
  /* 포인트 색(2026-09-04 지정) - "지금 여기"를 알리는 선택 표시에만 쓴다: 하단바 선택 칸,
     사이드바 현재 메뉴, 선택된 태그 칩, 정렬 탭 선택, 상단 최근본 바 배경/스크롤바.
     **버튼에는 쓰지 않는다**(2026-09-04 "기본 버튼색은 포인트색 말고 진한 회색으로" 요청) -
     기본 버튼은 --c-ink다. CLAUDE.md 무채색 원칙의 의도적 예외이며, 이 값 하나만 바꾸면
     선택 표시 색이 전부 함께 바뀐다. */
  --c-point: #4bb749;
  --c-point-hover: #41a33f;
  /* 포인트 색을 옅게 깐 배경(상단 최근본 바, 하단바 선택 칸 등) - 불투명 값이어야 스크롤바
     막대를 가늘어 보이게 하는 테두리 기법(아래 .moayo-favbar-scroll)에 그대로 쓸 수 있다. */
  --c-point-soft: #eaf5e9;

  /* 배경/선 */
  --c-bg: #f6f6f7;         /* 페이지 배경(global.css html과 같은 값) */
  --c-surface: #fff;       /* 카드/패널 */
  --c-subtle: #f4f4f5;     /* 옅은 버튼/칩 배경 */
  --c-subtle-hover: #e4e4e7;
  --c-line: #ececef;       /* 기본 경계선 */
  --c-line-strong: #e4e4e7;

  /* 모서리 - 아래 값들로만 쓴다 */
  --r-xs: 5px;   /* 헤더 검색창(2026-09-04 요청으로 알약 -> 각진 5px) */
  --r-sm: 8px;
  --r-md: 12px;
  --r-lg: 16px;
  --r-pill: 999px;

  /* 그림자 - 3단계 */
  --sh-1: 0 1px 2px rgba(24, 24, 27, .04);
  --sh-2: 0 2px 6px rgba(24, 24, 27, .10);
  --sh-3: 0 2px 4px rgba(24, 24, 27, .06), 0 20px 40px -12px rgba(24, 24, 27, .16);

  /* 앱 셸 */
  --header-h: 60px; /* 2026-09-04 요청(64 -> 50 -> 80 -> 60) */
  --sidebar-w: 240px;
  /* 여백/높이 기준(2026-09-04) - "선이 딱딱 맞았으면 좋겠다"는 요청으로 도입. 콘텐츠 좌우 여백,
     카드 사이 간격, 컨트롤 높이를 이 값들로만 쓴다(임의의 rem 값을 새로 만들지 말 것).
     --gutter는 헤더/콘텐츠/푸터/하단바가 모두 공유하는 좌우 여백이라, 이 값 하나만 바꾸면
     화면 전체의 좌측 기준선이 함께 움직인다.
     모바일 16 -> 8px(2026-09-15 요청, "좌우 여백이 너무 크다") - PC(768px~)는 아래 24px 그대로. */
  --gutter: 8px;
  /* 글자 크기 - 6단계(2026-09-05). 그전에는 .62~2.4rem 사이에 26종이 흩어져 있어서 같은 성격의
     글자인데 화면마다 크기가 달랐다(색·모서리·그림자를 토큰으로 묶은 것과 같은 이유). */
  --fs-xs: .72rem;      /* 배지, 날짜, 캡션 */
  --fs-sm: .8rem;       /* 보조 텍스트, 칩/작은 버튼 라벨 */
  --fs-md: .875rem;     /* 기본 UI 텍스트 */
  --fs-lg: .95rem;      /* 강조 UI 텍스트, 리드 문장 */
  --fs-body: 1rem;      /* 읽는 본문 */
  --fs-title: 1.05rem;  /* 섹션 제목 */
  --fs-page: 1.6rem;    /* 페이지 제목 */
  /* 간격 - 4의 배수 6단계. px와 rem을 섞어 쓰던 걸(54종) 이 눈금으로 맞춘다. */
  --sp-1: 4px;
  --sp-2: 8px;
  --sp-3: 12px;
  --sp-4: 16px;
  --sp-5: 20px;
  --sp-6: 28px;
  /* 본문 안 아이콘 - 3단계. 13/16/17/18/21px가 제각각이었다. */
  --ic-sm: 16px;
  --ic-md: 20px;
  --ic-lg: 28px;
  /* 겹침 순서(2026-09-05) - 그전에는 1075/1080/1084/1085/1090/1100이 여기저기 하드코딩돼 있어서
     새 레이어를 올릴 때마다 무엇이 무엇 위인지 파일을 뒤져야 했다. 값의 상하 관계는 그대로 두고
     이름만 붙였다(.claude/references/overlay-modal-conventions.md의 "z-index 계층은 CSS 변수로"). */
  --z-float: 1075;            /* 맨 위로 버튼 */
  --z-header: 1080;           /* 상단 헤더 / 모바일 하단바 */
  --z-drawer-backdrop: 1084;  /* 모바일 사이드바 뒤 어두운 배경 */
  --z-drawer: 1085;           /* 모바일 사이드바 드로어 */
  --z-overlay: 1090;          /* 전체화면 오버레이(계정) */
  --z-confirm: 1095;          /* 공용 확인/알림 모달 - 앱 셸보다 위 */
  --z-toast: 1100;            /* 토스트는 항상 맨 위 */
  --read-w: 68ch;         /* 줄글 최대 폭 - 이보다 길면 다음 줄 첫 글자를 놓친다(2026-09-05) */
  --control-h: 38px;      /* 헤더의 햄버거/검색창/아이콘 버튼/로그인 버튼(헤더 50px 안에 들어감) */
  --control-h-sm: 34px;   /* 본문 안의 작은 컨트롤(정렬 세그먼트, is-small 버튼) */
  --bottombar-h: 64px;    /* 모바일 하단바 - 콘텐츠 아래 여백과 "맨 위로" 버튼 위치가 이 값을 따라간다 */
}
@media (min-width: 768px) {
  :root { --gutter: 24px; }
}

/* Bulma 위에 얹는 최소한의 프로젝트 커스텀 스타일 */

/* 폼 검증 에러 표시 (public/js/form-validate.js) - 관리자 화면(admin/_style.php)과 동일한 규칙 */
/* 클라이언트 검증(form-validate.js)과 서버 검증(Bulma .is-danger)이 서로 다른 빨강을 쓰고 있어서
   같은 필드인데 색이 달랐다(2026-09-05) - global.css의 .is-danger(#e11d48)에 맞춘다. */
.input.field-error, .textarea.field-error, select.field-error, .field-error { border-color: #e11d48; }
.error-message { display: block; color: #e11d48; font-size: 12px; margin: .25rem 0 0; min-height: 14px; }
.error-message:empty { display: none; }

/* html/body에 height:100%를 주면 body가 "뷰포트 높이에 고정된 세로 flex 컨테이너"가 돼서
   두 가지가 망가진다(2026-09-04에 확인): (1) 헤더가 flex-shrink로 찌그러져 height가 무시되고,
   (2) position:sticky의 기준 상자가 그 한 화면으로 제한돼 헤더가 한 화면 넘게 스크롤하면
   따라오지 않는다. 아래 body의 min-height:100vh만으로 원래 의도(내용이 짧아도 화면을 채움)는
   그대로 유지된다. */
html {
  height: auto;
}

/* 풀블리드(전체 폭) 섹션이 100vw 계산 때문에 가로 스크롤을 만드는 걸 막는 안전장치.
   hidden이 아니라 clip인 이유(2026-09-05): overflow-x:hidden은 html을 "스크롤 컨테이너"로
   만들어버려서 그 안의 position:sticky가 통째로 무력화된다(Chrome/Safari의 잘 알려진 동작) -
   실제로 좌측 사이드바가 붙어 있지 못하고 본문과 같이 밀려 올라가 화면에서 사라지고 있었다.
   overflow-x:clip은 스크롤 컨테이너를 만들지 않고 넘치는 부분만 잘라내서 sticky가 그대로 산다.
   (지금은 100vw를 쓰는 곳이 남아 있지 않지만, 다시 생겨도 가로 스크롤이 안 나게 남겨둔다) */
html {
  overflow-x: clip;
}

body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

main {
  flex: 1 0 auto;
}

/* 로그인/회원가입처럼 박스 하나짜리 작은 페이지가 화면 위쪽에 붙어 보이지 않도록
   세로 중앙보다 살짝 위에 오게 배치 (min-height 안에서만 정중앙 정렬하고,
   그 아래 여백을 더 둬서 시각적 중심을 위로 당김) */
.auth-page {
  min-height: 60vh;
  align-items: center;
  padding-bottom: 4rem;
}

/* 소셜 로그인 버튼 - 무채색 원칙의 4번째 예외(frontend-bulma.md 참고). 구글/카카오는
   자기 브랜드 색을 쓰는 게 사용자에게 즉시 인지되는 관용적 UI라 예외로 둔다. */
.social-login-divider { display: flex; align-items: center; text-align: center; color: #999; font-size: var(--fs-xs); }
.social-login-divider::before, .social-login-divider::after { content: ""; flex: 1; border-bottom: 1px solid #e0e0e0; }
.social-login-divider span { padding: 0 .75rem; }
.social-login-btn { border: 1px solid #dbdbdb; font-weight: 600; }
.social-login-btn.google { background: #fff; color: #3c4043; }
.social-login-btn.google:hover { background: #f7f7f7; }
.social-login-btn.kakao { background: #FEE500; color: #191600; border-color: #FEE500; }
.social-login-btn.kakao:hover { background: #f5dc00; }

/* 회원가입 약관동의 - 개별 항목은 접었다 펼 수 있는 <details>로 본문을 보여준다 */
.terms-agreement { padding: 1rem; }
.terms-content summary { cursor: pointer; }
.terms-content-box {
  max-height: 160px;
  overflow-y: auto;
  margin-top: .4rem;
  padding: .6rem .75rem;
  background: #fafafa;
  border: 1px solid #eee;
  border-radius: var(--r-sm);
  color: #555;
  line-height: 1.5;
}

.banner-image {
  width: 100%;
  border-radius: var(--r-sm);
  margin-bottom: 0.75rem;
}

.comment-item {
  padding: 0.65rem 0;
  border-bottom: 1px solid var(--c-line);
}

/* ==========================================================================
   moayo 앱 셸 (layout.php, phpdashapi 기준 레이아웃 재구성 - 2026-08-18,
   .claude/features/moayo 작업사항 "레이아웃은 phpdashapi처럼" 요청)

   phpdashapi(.dash-pc-header/.dash-sidebar/.dash-card/.dash-topbar/.dash-bottombar/
   .dash-mail-modal, public/css/custom.css)의 앱 셸 컴포넌트를 이식했다. 다만 그쪽 콘텐츠는
   채팅함류라 .dash-card가 "고정 높이 + 내부 스크롤"이었던 반면, 이 프로젝트 콘텐츠(목록/상세/
   글쓰기 폼)는 일반 웹페이지처럼 문서 흐름대로 길어져야 하므로 그 부분만 바꿨다:
   - .moayo-topbar는 카드 내부 스크롤이 아니라 sticky로 화면에 붙는다
   - .moayo-bottombar는 모바일에서 position:fixed로 화면 하단에 띄우고, 가려지는 만큼
     .moayo-content가 padding-bottom으로 자리를 비워둔다(데스크톱은 사이드바가 대신하므로 숨김,
     phpdashapi와 동일)
   나머지(사이드바 드로어/콘솔 전환, 오버레이 "←제목" 레이어 등)는 색상/크기/애니메이션까지
   그대로 옮겼다. ========================================================================== */

.moayo-pc-header {
  position: sticky;
  top: 0;
  z-index: var(--z-header);
  /* flex: 0 0 auto가 없으면 height가 통째로 무시된다(2026-09-04에 발견) - body가
     html,body{height:100%} + display:flex;flex-direction:column이라 "뷰포트 높이에 고정된 세로
     flex 컨테이너"가 되는데, 그 안에서 .moayo-wrap은 내용이 커서 못 줄어들고 이 헤더만
     flex-shrink 기본값(1)으로 자기 내용 높이(약 40px)까지 찌그러졌다. 그래서 그동안 CSS에
     적힌 높이(128px -> 64 -> 50)가 화면에 한 번도 반영되지 않았다. */
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 0; /* 좌측 블록(.moayo-pc-header-lead)이 정확히 사이드바 폭이어야 해서 gap을 쓰지 않는다 */
  width: 100%;
  /* 128px였다가 64px로(2026-09-04) - 안에 든 건 햄버거/브랜드/아이콘 2개뿐인데 높이만 128px라
     상단 최근본 바(약 80px)와 합쳐 스크롤 전에 200px 넘게 잡아먹고 있었다. 이 값을 바꾸면
     사이드바/백드롭이 시작하는 위치도 같이 움직여야 해서 --header-h 하나로 묶어 참조한다. */
  height: var(--header-h);
  padding: 0 var(--gutter) 0 0;
  background: rgba(255, 255, 255, .82);
  backdrop-filter: saturate(180%) blur(14px);
  -webkit-backdrop-filter: saturate(180%) blur(14px);
  border-bottom: 1px solid var(--c-line);
  box-sizing: border-box;
}
.moayo-pc-header-brand { overflow: hidden; white-space: nowrap; font-size: var(--fs-page); font-weight: 800; letter-spacing: -.02em; color: var(--c-ink); text-decoration: none; }
/* 햄버거+브랜드를 사이드바와 똑같은 폭으로 묶는다(2026-09-04) - 그래야 그 오른쪽에 오는 검색창의
   왼쪽 선이 콘텐츠(페이지 제목/카드 그리드/푸터)의 왼쪽 선과 정확히 일치한다. */
.moayo-pc-header-lead { display: flex; align-items: center; gap: .6rem; flex: 0 0 auto; padding: 0 var(--gutter); box-sizing: border-box; }
/* 데스크톱에서는 좌측 패딩을 사이드바 안쪽 여백(10px)과 맞춰 햄버거가 사이드바 항목 박스와 같은
   선에서 시작하게 하고, 전체 폭을 사이드바 폭 + --gutter로 잡아 오른쪽의 검색창이 콘텐츠
   좌측선에서 시작하게 한다. 모바일은 사이드바가 없으므로 그냥 --gutter를 쓴다. */
/* 폭을 사이드바와 정확히 같게 둔다(2026-09-04 요청) - 그러면 검색창의 왼쪽 선이 사이드바
   오른쪽 경계선과 딱 맞는다. 예전엔 여기에 --gutter를 더해서 카드/제목의 왼쪽 선(사이드바 +
   콘텐츠 여백)에 맞췄었는데, 요청대로 경계선 기준으로 바꿨다. */
@media (min-width: 768px) { .moayo-pc-header-lead { width: var(--sidebar-w); padding-left: 10px; padding-right: 0; } }
.moayo-pc-header-spacer { flex: 1 1 auto; }

.moayo-sidebar-toggle {
  flex: 0 0 auto;
  display: flex;
  position: relative;
  width: var(--control-h);
  height: var(--control-h);
  border: none;
  border-radius: 50%;
  background: var(--c-subtle);
  color: var(--c-text);
  cursor: pointer;
  transition: background-color .15s, transform .15s;
}
.moayo-sidebar-toggle:hover { background: var(--c-subtle-hover); transform: scale(1.04); }
.moayo-sidebar-toggle-bar { position: absolute; left: calc(50% - 8px); width: 16px; height: 2px; border-radius: 1px; background: currentColor; }
.moayo-sidebar-toggle-bar:nth-child(1) { top: calc(50% - 6px); }
.moayo-sidebar-toggle-bar:nth-child(2) { top: calc(50% - 1px); }
.moayo-sidebar-toggle-bar:nth-child(3) { top: calc(50% + 4px); }

.moayo-topbar-icon-btn {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  width: var(--control-h);
  height: var(--control-h);
  border: none;
  border-radius: 50%;
  background: var(--c-subtle);
  color: var(--c-text);
  cursor: pointer;
  transition: background-color .15s, transform .15s;
}
.moayo-topbar-icon-btn:hover { background: var(--c-subtle-hover); transform: scale(1.04); }
.moayo-topbar-icon-btn + .moayo-topbar-icon-btn, .moayo-topbar-icon-btn + .moayo-header-login { margin-left: 8px; }
.moayo-topbar-icon-btn img { width: 20px; height: 20px; }

/* 헤더 폴다운 메뉴(2026-09-15) - "+" 등록 메뉴(사이트등록/게시글작성/단순링크추가)와 계정 메뉴가 같은 모양을 쓴다.
   "+" 버튼만 참고 캡처처럼 진한 원에 흰 +. */
.moayo-header-menu { position: relative; flex: 0 0 auto; }
.moayo-topbar-icon-btn + .moayo-header-menu, .moayo-header-menu + .moayo-header-menu { margin-left: var(--sp-2); }
.moayo-add-menu-toggle { background: var(--c-ink); }
.moayo-add-menu-toggle:hover { background: var(--c-text); }
.moayo-header-menu-list { position: absolute; top: calc(100% + var(--sp-2)); right: 0; min-width: 180px; padding: var(--sp-1) 0; background: var(--c-surface); border: 1px solid var(--c-line); border-radius: var(--r-md); box-shadow: var(--sh-2); }
.moayo-header-menu-item { display: flex; align-items: center; gap: var(--sp-2); padding: var(--sp-3) var(--sp-4); color: var(--c-text); font-size: var(--fs-md); font-weight: 600; text-decoration: none; white-space: nowrap; }
.moayo-header-menu-item + .moayo-header-menu-item { border-top: 1px solid var(--c-line); }
.moayo-header-menu-item:hover { background: var(--c-subtle); color: var(--c-ink); }
.moayo-header-menu-item img { width: var(--ic-md); height: var(--ic-md); }

/* 내가 등록한 내역(2026-09-15) - 사이트/게시글/단순링크 탭. 참고 캡처처럼 폭을 3등분하고, 선택된 탭만 포인트 색 밑줄(선택 표시 자리). */
.moayo-mine-title { margin: 0 0 var(--sp-3); font-size: var(--fs-title); font-weight: 800; color: var(--c-ink); }
.moayo-mine-tabs { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); margin-bottom: var(--gutter); border-bottom: 1px solid var(--c-line); }
.moayo-mine-tab { display: flex; align-items: center; justify-content: center; gap: var(--sp-2); padding: var(--sp-3) var(--sp-2); margin-bottom: -1px; border-bottom: 2px solid transparent; color: var(--c-text-soft); font-size: var(--fs-lg); font-weight: 600; text-decoration: none; white-space: nowrap; }
.moayo-mine-tab:hover { color: var(--c-ink); background: var(--c-subtle); }
.moayo-mine-tab.is-active { border-bottom-color: var(--c-point); color: var(--c-ink); font-weight: 800; }
.moayo-mine-tab img { width: var(--ic-md); height: var(--ic-md); }
.moayo-mine-tab-count { color: var(--c-muted); font-weight: 600; }

/* 나의글 조회분석(2026-09-15, views/moayo/stats.php) - 요약 카드 → 시간별 막대 → 글별 표.
   막대 색: 상세 조회는 진회색, 사이트 방문은 링크색(바깥 사이트로 "나간" 수라 링크 의미를 그대로 쓴다 - 포인트 색은 선택 표시 전용). */
.moayo-stats-note { max-width: var(--read-w); margin: 0 0 var(--sp-4); font-size: var(--fs-sm); line-height: 1.6; color: var(--c-muted); }
.moayo-stats-cards { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--sp-3); margin-bottom: var(--sp-4); }
.moayo-stats-card { padding: var(--sp-4); background: var(--c-surface); border: 1px solid var(--c-line); border-radius: var(--r-lg); box-shadow: var(--sh-1); }
.moayo-stats-card-label { margin: 0; font-size: var(--fs-sm); font-weight: 600; color: var(--c-muted); }
.moayo-stats-card-value { margin: var(--sp-1) 0 0; font-size: var(--fs-page); font-weight: 800; letter-spacing: -.02em; color: var(--c-ink); font-variant-numeric: tabular-nums; }
.moayo-stats-card-slash { color: var(--c-faint); font-weight: 600; }
.moayo-stats-card-sub { margin: var(--sp-1) 0 0; font-size: var(--fs-xs); color: var(--c-faint); }
.moayo-stats-panel { margin-bottom: var(--sp-4); padding: var(--sp-5); background: var(--c-surface); border: 1px solid var(--c-line); border-radius: var(--r-lg); box-shadow: var(--sh-1); }
.moayo-stats-panel-head { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--sp-2) var(--sp-4); margin-bottom: var(--sp-4); }
.moayo-stats-panel-title { margin: 0; font-size: var(--fs-title); font-weight: 800; color: var(--c-ink); }
.moayo-stats-panel-hint { margin-left: var(--sp-2); font-size: var(--fs-xs); font-weight: 600; color: var(--c-muted); }
.moayo-stats-legend { display: flex; gap: var(--sp-3); font-size: var(--fs-sm); color: var(--c-text-soft); }
.moayo-stats-legend-item::before { content: ""; display: inline-block; width: 10px; height: 10px; margin-right: var(--sp-1); border-radius: var(--r-xs); vertical-align: -1px; }
.moayo-stats-legend-item.is-views::before, .moayo-stats-bar.is-views { background: var(--c-text-soft); }
.moayo-stats-legend-item.is-visits::before, .moayo-stats-bar.is-visits { background: var(--c-link); }
.moayo-stats-scroll { overflow-x: auto; }
/* 칸 수는 기간마다 달라 --bars로 받는다(최근 48시간 = 48, 기간 선택 = 일 수). 칸이 12px보다 얇아지면 가로로 넘긴다. */
.moayo-stats-chart,
.moayo-stats-axis { display: grid; grid-template-columns: repeat(var(--bars, 48), minmax(12px, 1fr)); gap: 2px; min-width: max(640px, calc(var(--bars, 48) * 14px)); }
/* 기간 선택 줄 - 빠른 버튼(.moayo-sort 알약) + 날짜 두 칸 */
.moayo-stats-period { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2) var(--sp-4); margin-bottom: var(--sp-4); }
.moayo-stats-period-dates { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); color: var(--c-muted); }
.moayo-stats-period input[type="date"] { height: var(--control-h-sm); padding: 0 var(--sp-2); border: 1px solid var(--c-line); border-radius: var(--r-sm); background: var(--c-surface); color: var(--c-text); font: inherit; font-size: var(--fs-sm); box-sizing: border-box; }
.moayo-stats-chart { height: 220px; border-bottom: 1px solid var(--c-line-strong); }
.moayo-stats-bar-col { display: flex; align-items: flex-end; justify-content: center; gap: 1px; border-radius: var(--r-xs) var(--r-xs) 0 0; }
.moayo-stats-bar-col:hover { background: var(--c-subtle); }
.moayo-stats-bar { width: 45%; border-radius: 2px 2px 0 0; }
.moayo-stats-axis { margin-top: var(--sp-1); }
.moayo-stats-axis span { font-size: var(--fs-xs); color: var(--c-muted); white-space: nowrap; }
.moayo-stats-empty { margin: 0; font-size: var(--fs-md); color: var(--c-muted); }
.moayo-stats-table { width: 100%; min-width: 600px; border-collapse: collapse; font-size: var(--fs-md); }
.moayo-stats-table th { padding: var(--sp-2) var(--sp-3); border-bottom: 1px solid var(--c-line-strong); text-align: right; font-size: var(--fs-sm); font-weight: 700; color: var(--c-muted); white-space: nowrap; }
.moayo-stats-table th a { color: inherit; text-decoration: none; }
.moayo-stats-table th a:hover, .moayo-stats-table th.is-active { color: var(--c-ink); }
.moayo-stats-table th.is-active a::after { content: " ▼"; font-size: var(--fs-xs); }
.moayo-stats-table td { padding: var(--sp-3); border-bottom: 1px solid var(--c-line); text-align: right; color: var(--c-text); font-variant-numeric: tabular-nums; }
.moayo-stats-table td.is-zero { color: var(--c-faint); }
.moayo-stats-table .moayo-stats-col-site { text-align: left; width: 100%; }
.moayo-stats-site { display: flex; align-items: center; gap: var(--sp-3); min-width: 0; color: inherit; text-decoration: none; }
.moayo-stats-thumb { flex: 0 0 64px; display: flex; align-items: center; justify-content: center; width: 64px; aspect-ratio: 16 / 10; border-radius: var(--r-sm); background: var(--c-subtle); overflow: hidden; font-weight: 800; color: var(--c-faint); }
.moayo-stats-thumb img { max-width: 100%; max-height: 100%; object-fit: scale-down; }
.moayo-stats-site-text { display: flex; flex-direction: column; gap: var(--sp-1); min-width: 0; }
.moayo-stats-site-title { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; font-weight: 700; color: var(--c-ink); }
.moayo-stats-site:hover .moayo-stats-site-title { text-decoration: underline; }
.moayo-stats-site .moayo-site-card__badges { margin-bottom: 0; }
.moayo-stats-pager { display: flex; align-items: center; justify-content: center; gap: var(--sp-3); margin-top: var(--sp-4); font-size: var(--fs-sm); color: var(--c-muted); }
@media (max-width: 767px) {
  .moayo-stats-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .moayo-stats-panel { padding: var(--sp-4); }
}

/* 위 헤더와 같은 이유로 세로 flex 안에서 찌그러지지 않게 못 박아둔다.
   (사이드바가 화면 끝까지 이어지는 건 .moayo-sidebar가 align-self:stretch로 본문 높이만큼
   늘어나기 때문이다 - 아래 데스크톱 블록 참고. 예전 주석은 존재하지도 않는 min-height 규칙을
   설명하고 있어서 2026-09-05에 정리했다.) */
#moayo-favbar-slot { flex: 0 0 auto; }
.moayo-wrap { display: flex; align-items: flex-start; flex: 1 0 auto; min-height: calc(100vh - var(--header-h)); }

/* 사이드바 - 기본값(767px 이하)은 화면 밖에 숨어있는 드로어 */
/* 안쪽 상자(.moayo-sidebar-inner)는 모바일에서는 그냥 세로로 늘어나기만 한다 - 데스크톱에서만
   sticky가 된다(아래 미디어쿼리). 푸터를 바닥에 붙이는 margin-top:auto가 여기서 동작한다. */
.moayo-sidebar-inner { display: flex; flex-direction: column; flex: 1 0 auto; min-height: 100%; box-sizing: border-box; }
.moayo-sidebar {
  display: flex;
  flex-direction: column;
  position: fixed;
  /* 모바일 드로어는 화면 전체 높이를 덮는다(2026-09-04 요청) - 예전엔 헤더 아래(top:--header-h)
     에서 시작해서 위쪽에 최근본 바/헤더가 비쳐 보였다. 닫는 방법은 뒤쪽 배경(백드롭) 클릭이라
     헤더의 햄버거가 가려져도 문제없다(moayo-app.js). */
  top: 0;
  left: 0;
  bottom: 0;
  width: var(--sidebar-w);
  max-width: 80vw;
  background: #fff;
  z-index: var(--z-drawer);
  box-shadow: 4px 0 32px rgba(24, 24, 27, .1);
  padding: 20px 10px 1.25rem; /* 위쪽 여백은 20px(2026-09-04 요청 - 처음엔 0으로 붙였다가 조정) */
  overflow-y: auto;
  box-sizing: border-box;
  transform: translateX(-100%);
  transition: transform .25s ease;
}
.moayo-wrap.is-sidebar-open .moayo-sidebar { transform: translateX(0); }

.moayo-sidebar-backdrop { display: none; position: fixed; inset: 0; background: rgba(20, 20, 30, .45); z-index: var(--z-drawer-backdrop); }
.moayo-wrap.is-sidebar-open .moayo-sidebar-backdrop { display: block; }

.moayo-sidebar-nav { display: flex; flex-direction: column; gap: 2px; }
.moayo-sidebar-item {
  display: flex;
  align-items: center;
  gap: .7rem;
  padding: .5rem .8rem;
  border-radius: var(--r-md);
  color: var(--c-text-soft);
  font-size: var(--fs-md);
  font-weight: 600;
  background: none;
  border: none;
  width: 100%;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
  transition: background-color .15s, color .15s;
}
.moayo-sidebar-item:hover { background: var(--c-subtle); color: var(--c-ink); }
/* 현재 보고 있는 메뉴(2026-09-04, layout.php의 $sidebarActive) - 꽉 찬 검은 막대는 사이드바에서
   너무 무거워서 옅은 배경 + 진한 글씨로 바꿨다. */
.moayo-sidebar-item.is-active { background: var(--c-point); color: #fff; font-weight: 700; }
.moayo-sidebar-item.is-active img { filter: brightness(0) invert(1); }
.moayo-sidebar-divider { margin: 12px .8rem; border: none; border-top: 1px solid var(--c-line); }

@media (min-width: 768px) {
  .moayo-wrap { align-items: stretch; }
  /* 기둥(<aside>)은 본문 길이만큼 늘어난다 - 흰 배경과 오른쪽 경계선이 페이지 끝까지 이어지도록
     (2026-09-05). 예전에는 여기에 position:sticky + height:100vh를 걸어서 상자 자체가 한 화면
     크기였고, 본문이 길면 그 아래가 비어 "기둥이 중간에서 끊긴" 것처럼 보였다. */
  .moayo-sidebar {
    position: static;
    align-self: stretch;
    height: auto;
    overflow: visible;
    padding: 0;
    left: auto;
    bottom: auto;
    max-width: none;
    box-shadow: none;
    z-index: auto;
    transform: none;
    flex: 0 0 var(--sidebar-w);
    width: var(--sidebar-w);
    border-right: 1px solid var(--c-line);
  }
  /* 실제로 화면에 붙어 따라다니는 건 안쪽 상자다 - 메뉴가 화면 위로 사라지지 않고, 항목이 많으면
     이 상자 안에서 따로 스크롤된다(2026-09-04 요청의 동작을 그대로 유지). */
  .moayo-sidebar-inner {
    display: flex;
    flex-direction: column;
    position: sticky;
    top: var(--header-h);
    /* 높이는 한 화면에서 헤더를 뺀 만큼 - 메뉴가 길면 이 상자 안에서 따로 스크롤된다. (예전엔 푸터를 바닥에
       붙이는 margin-top:auto 때문에 height가 필요했는데, 2026-09-15에 푸터를 메뉴 뒤로 붙이며 그 이유는 없어졌다) */
    height: calc(100vh - var(--header-h));
    overflow-y: auto;
    padding: 20px 10px 1.25rem;
    box-sizing: border-box;
  }
  .moayo-sidebar-backdrop { display: none !important; }
  .moayo-wrap.is-sidebar-collapsed .moayo-sidebar { display: none; }
  /* .moayo-bottombar/.moayo-content의 데스크톱 오버라이드는 여기가 아니라 그 base 규칙보다
     뒤(아래 "데스크톱 오버라이드" 블록)에 둔다 - CSS는 media query 유무가 아니라 등장 순서로
     동률 승부를 가르므로, base 규칙이 이 자리보다 파일 아래쪽에 있으면 그게 항상 이겨버려서
     데스크톱에서도 모바일 하단바가 그대로 보이는 버그가 있었다(2026-08-18 수정). */
}

/* 콘텐츠 배경은 body(오프화이트)와 같은 톤으로 두고 - 개별 카드(.box)가 흰 배경+그림자로
   그 위에 살짝 떠 보이게(2026-08-31, "세련되게" 요청 - 예전엔 카드 영역 전체가 흰 배경이라
   카드 하나하나의 경계가 흐릿했다). */
.moayo-card { flex: 1 1 auto; min-width: 0; width: 100%; background: transparent; }

/* .moayo-topbar(콘텐츠 타이틀 줄)는 phpdashapi와 똑같이 뺐다 - layout.php 주석 참고.
   .moayo-content padding-top이 그만큼(원래 topbar 자리) 조금 더 필요해서 보정했다. */
/* 콘텐츠 컨테이너(2026-09-04) - 예전엔 좌우 여백이 10px뿐이라 와이드 모니터에서 카드가 화면
   양끝까지 꽉 차고 한 줄에 7~8개씩 깔려서 "웹페이지"가 아니라 "표"처럼 보였다. 읽기 좋은
   최대 폭에서 멈추고 가운데 정렬한다. */
/* 최대폭을 두면 오른쪽 끝이 헤더와 어긋난다(콘텐츠 1496 vs 헤더 1576) - 앱 셸(사이드바+본문)
   구조라 본문이 남은 폭을 다 쓰는 게 맞고, 그래야 헤더/콘텐츠/푸터의 좌우 선이 --gutter
   하나로 전부 정렬된다(2026-09-04). */
.moayo-content { margin: 0; padding: 24px var(--gutter); padding-bottom: calc(var(--bottombar-h) + 24px); }

/* 하단바 - 모바일 전용 고정 내비(홈/자리표시자 3개/계정), 데스크톱은 사이드바가 대신해서 숨김 */
.moayo-bottombar {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: var(--z-header);
  /* 칸을 균등하게 나눠 아이콘만 놓는다(2026-09-04, 참고 이미지) - 예전엔 항목마다 원/테두리
     배경이 있어서 "메뉴"가 아니라 "버튼 5개"처럼 보였다. 선택된 칸은 아래 .is-active가
     칸 전체를 채운다. */
  display: flex;
  align-items: stretch;
  gap: 0;
  height: var(--bottombar-h);
  padding: 0;
  background: rgba(255, 255, 255, .82);
  backdrop-filter: saturate(180%) blur(14px);
  -webkit-backdrop-filter: saturate(180%) blur(14px);
  border-top: 1px solid var(--c-line);
  /* 아래로 스크롤하면 내려가 사라지고 위로 올리면 다시 올라온다(2026-09-04 요청) -
     실제 토글은 moayo-app.js가 .is-hidden으로 한다. */
  transition: transform .22s ease;
}
.moayo-bottombar.is-hidden { transform: translateY(100%); }
/* 아이콘 + 작은 라벨(2026-09-04) - 아이콘만으로는 무슨 버튼인지 알 수 없었다. */
/* 모든 칸이 같은 모양 - 배경/테두리 없이 아이콘만, 폭은 균등(flex:1), 높이는 바 전체.
   선택된 칸만 짙게 채우고 아이콘을 흰색으로 뒤집는다(brightness(0) invert(1)는 원본 색이
   무엇이든 순백으로 만든다). 참고 이미지는 초록으로 채우지만 이 프로젝트는 무채색 원칙이라
   --c-ink를 쓴다. */
.moayo-bottombar-slot {
  flex: 1 1 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 3px;
  height: 100%;
  padding: 0;
  border: none;
  border-radius: 0;
  background: none;
  color: var(--c-muted);
  text-decoration: none;
  cursor: pointer;
  transition: background-color .15s, color .15s;
}
.moayo-bottombar-slot:hover { background: var(--c-subtle); }
.moayo-bottombar img { width: 33px; height: 33px; } /* 22 -> 33px(2026-09-05 요청, 1.5배 - 라벨 크기는 그대로) */
.moayo-bottombar-label { font-size: .62rem; font-weight: 700; line-height: 1; }
/* 선택된 칸은 포인트 색으로 꽉 채우고 글자/아이콘은 흰색(2026-09-04 요청, 참고 이미지).
   아이콘은 <img>라 CSS로 색을 못 바꾸는데, 흰색으로 만드는 건 원본 색과 무관하게 통하는
   brightness(0) invert(1)로 처리한다(그래서 -nav.svg 대신 원본 아이콘을 그대로 써도 된다). */
.moayo-bottombar-slot.is-active { background: var(--c-point); color: #fff; }
.moayo-bottombar-slot.is-active img { filter: brightness(0) invert(1); }

/* 데스크톱 오버라이드 - 반드시 위 base .moayo-bottombar/.moayo-content 규칙보다 아래에 있어야 한다
   (동률 specificity는 등장 순서로 갈리므로, media query 안에 있어도 base 규칙이 더 아래에 있으면
   그게 이겨버림 - 2026-08-18, 데스크톱에서도 모바일 하단바가 그대로 보이던 버그 원인). */
@media (min-width: 768px) {
  .moayo-bottombar { display: none; }
  .moayo-content { padding-bottom: 2.5rem; }
}

/* 검색/계정 전체화면 오버레이(.moayo-modal)는 없앴다 - 계정은 2026-09-15에 헤더 폴다운 메뉴(.moayo-header-menu)로 바뀌었다. */

/* 부트스트랩 모달(공용 확인/알림창)이 열릴 때 body에 인라인으로 거는 스크롤 잠금을 무효화한다
   (2026-09-05 지적: "모달창 뜰 때는 부모창 변경 없이 그대로 창만 떠야 하는데 상단 헤더가 사라진다").
   부트스트랩은 modal을 열면서 body에 .modal-open을 붙이고 style="overflow:hidden;padding-right:Npx"를
   직접 써 넣는데, 그 두 가지가 각각 이런 문제를 만든다:
     - overflow:hidden -> body가 "스크롤 컨테이너"가 되면서 그 안의 position:sticky(헤더,
       사이드바 안쪽 상자)가 통째로 무력화된다. 스크롤을 내린 상태에서 모달을 열면 헤더가
       제자리(문서 맨 위)로 돌아가 화면에서 사라진다.
     - padding-right -> 세로 스크롤바가 사라진 폭만큼 본문을 밀어서 화면이 옆으로 움찔한다.
   모달은 화면 위에 뜨기만 하면 되고 뒤 화면은 그대로 있어야 하므로 둘 다 되돌린다.
   스타일시트의 !important는 인라인 스타일을 이긴다(그래서 JS로 지우지 않아도 된다). */
body.modal-open {
  overflow: visible !important;
  padding-right: 0 !important;
}

/* moayo 상세보기 팝업 창(hideChrome, layout.php) - 상단바/사이드바/하단바 없이 이 패딩만 있는
   콘텐츠 영역 하나뿐이다(2026-08-31, "상세페이지 팝업창도 세련되게" 요청으로 여백/배경 다시 손봄
   - 읽기 편한 폭으로 좁히고 은은한 배경 위에 콘텐츠가 얹힌 느낌을 준다). */
.moayo-popup-content { padding: 1.75rem 1.5rem 3rem; max-width: 640px; margin: 0 auto; background: var(--c-bg); min-height: 100%; box-sizing: border-box; }

/* moayo 상세보기 팝업 상단 대표이미지(2026-08-26, "상단에 업로드한 이미지 노출 반응형으로" 요청) -
   .moayo-show-thumb(56x56 고정 아이콘)과 달리 원본 비율 그대로 컨테이너 너비에 맞춰 커지고
   줄어드는 하나의 큰 이미지라 height는 고정하지 않는다(global.css의 img{max-width:100%}만으로는
   폭이 좁을 때 세로로 안 줄어들어서 height:auto를 명시). 2026-08-31 "세련되게" 요청으로 모서리를
   더 둥글게, 은은한 그림자를 얹었다. */
/* 대표 이미지 원본이 작은 파비콘일 때 - 폭 100%로 늘리지 않고 가운데에 아이콘처럼 둔다
   (2026-09-04, moayo-app.js의 refineSmallImage가 .is-icon-image를 붙이고 크기를 정한다). */

/* moayo 프로그램(사이트 큐레이션 디렉토리) - src/views/moayo/*.php, src/views/partials/_site_card.php
   (2026-08-18) 원래 Bulma .columns/.column.is-one-quarter-desktop/.image.is-64x64 조합으로
   짰었는데, 이 프로젝트 global.css는 "실사용 클래스만 담은 손 유지 발췌본"이라 그 반응형
   사이즈 클래스들이 애초에 정의돼 있지 않았다(.column{flex:1}만 있고 is-one-quarter-desktop
   같은 변형은 없음) - 그래서 카드가 전부 flex:1로 욱여넣어져 한 줄에 8~9개씩 우글쭈글 찌그러지고,
   .box(카드 배경/그림자)도 <a> 태그 자체에 display가 안 정해져 있어 인라인으로 깨져 보였다("다
   깨지고" 문제 원인). Bulma에 기대는 대신 grid를 직접 정의해서 고쳤다. */
/* align-items: start - 예전엔 카드가 그 줄에서 가장 높은 카드에 맞춰 늘어나서, 설명이 짧거나
   태그가 없는 카드는 아래 절반이 빈칸이었다(2026-09-04). 이제 카드는 자기 내용만큼만 높다. */
.moayo-site-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: var(--gutter); margin: 0; padding: 0; }
/* 무한 스크롤 감시용(2026-08-31 요청) - 눈에 보일 필요는 없고, IntersectionObserver가 관찰할
   교차점 역할만 한다(moayo-app.js). */
.moayo-scroll-sentinel { height: 1px; }
/* 카드 전체 리디자인(2026-08-31, "요즘 트랜드에 맞는, 세련되게" 요청) - 모서리를 더 둥글게,
   그림자를 더 부드럽고 은은하게 했다. .box의 기본 그림자(global.css)에 이 카드만의 hover
   전환을 더 얹는다.
   마우스오버시 카드 전체가 떠오르는(translateY) 효과는 뺐다(2026-08-31, "마우스 오버시
   자체가 위로 올라가는데 썸네일 이미지만 정중앙 기준으로 줌인되게" 요청) - 이제 호버 반응은
   그림자/테두리만 은은하게 남기고, 실제 "줌인" 인터랙션은 아래 썸네일 이미지 쪽에서만
   일어난다(object-fit:cover + thumb 컨테이너의 overflow:hidden 덕분에 이미지가 커져도 카드
   밖으로 안 삐져나오고, 기본 transform-origin이 center라 정중앙 기준으로 확대된다). */
.moayo-site-card {
  position: relative; /* 아래 .moayo-site-card-link::after(카드 전체 클릭 영역)의 기준 */
  display: flex;
  flex-direction: column;
  height: 100%;
  padding: 12px;
  transition: box-shadow .22s cubic-bezier(.2, .8, .2, 1), border-color .22s;
}
/* 가리킨 카드는 크기는 그대로 두고 테두리 색으로만 표시한다(2026-09-15 요청). */
.moayo-site-card:hover {
  box-shadow: var(--sh-3);
  border-color: var(--c-point);
}
/* 한 줄의 카드는 가장 높은 카드에 맞춰 늘어나는데(grid stretch), 태그가 없는 카드는 아래가
   통째로 비어 보였다 - 링크 영역을 세로 flex로 만들어 태그 줄을 항상 바닥에 붙인다(2026-09-04). */
.moayo-site-card-link { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; color: inherit; text-decoration: none; }
/* 예전엔 이미지 링크와 텍스트 링크가 따로여서 그 사이 여백을 누르면 아무 일도 안 났다
   (2026-09-04) - 텍스트 링크를 카드 전체로 늘려서 어디를 눌러도 상세로 간다. 이미지 위에 겹친
   지구본/좋아요 버튼들은 z-index로 이 위에 올려둬야 계속 눌린다(바로 아래 규칙). */
.moayo-site-card-link::after { content: ""; position: absolute; inset: 0; z-index: 1; border-radius: inherit; }
.moayo-site-card__globe, .moayo-site-card__actions { z-index: 2; }
/* 대표이미지가 카드 대부분을 차지(2026-08-31, 캡쳐 이미지 기준 재작업 - _site_card.php 주석
   참고) - 이미지 위에 지구본(바로가기)/좋아요·즐겨찾기·보관함/조회수·등록일이 전부 원형·알약
   배지로 겹쳐 있는 캡쳐 구조라, 이 thumb 컨테이너 하나가 그 배지들의 기준 좌표가 된다.
   이미지가 없는 사이트는 .moayo-site-card__thumb-fallback(제목, 2026-09-15 전엔 첫 글자)이 같은 자리를 채운다. */
/* height 고정값(140px)이었다가 aspect-ratio로 바꿨다(2026-08-31, "카드모양도 전부다르다" 지적) -
   캡쳐는 이미지가 카드 너비만큼 정사각형에 가깝게 큼직한데, 고정 높이라 카드 폭이 늘어나도
   이미지가 납작하게만 넓어지고 상대적으로 작아 보였다. */
.moayo-site-card__thumb { position: relative; flex: 0 0 auto; width: 100%; aspect-ratio: 16 / 10; margin-bottom: 12px; border-radius: var(--r-md); overflow: hidden; background: linear-gradient(160deg, var(--c-subtle), var(--c-subtle-hover)); }
.moayo-site-card__thumb-link { display: block; width: 100%; height: 100%; }
/* 원본이 작은 파비콘일 때(2026-09-04, moayo-app.js의 refineSmallImage 참고) - 억지로 꽉 채우지
   않고 타일 가운데에 아이콘처럼 놓는다. 크기(px)는 원본 크기를 아는 JS가 인라인으로 정한다. */
/* 보여줄 게 작은 아이콘 하나뿐이라 정사각형에 가까운 타일은 대부분이 빈 회색이 된다 -
   아이콘 카드만 타일을 낮춰서(2:1) 카드 전체 높이를 줄인다(2026-09-04). */
/* 제목 대체 타일(.is-fallback)은 2026-09-15부터 이미지 카드와 같은 16:10 - 2:1이면 버튼 아래 남는 자리가 제목 한 줄뿐이었다. */
.moayo-site-card__thumb.is-icon { aspect-ratio: 2 / 1; }
.moayo-site-card__thumb.is-icon .moayo-site-card__thumb-link { display: flex; align-items: center; justify-content: center; }
/* 셀렉터에 .moayo-site-card__thumb-link을 반드시 끼워야 한다 - 타일 위에 겹쳐 있는 지구본/
   좋아요 버튼의 아이콘까지 같이 걸려서 아이콘이 거대해진다(2026-09-04 사고). */
.moayo-site-card__thumb.is-icon .moayo-site-card__thumb-link img {
  height: auto;
  object-fit: contain;
  /* 회색 타일이 카드마다 똑같아 목록이 단조로웠다(2026-09-04) - 아이콘을 흰 칩 위에 올려
     "앱 아이콘"처럼 보이게 한다. content-box라 아래 padding이 JS가 정한 아이콘 크기를
     줄이지 않고 칩만 키운다. */
  box-sizing: content-box;
  padding: .55rem;
  background: var(--c-surface);
  border-radius: var(--r-md);
  box-shadow: var(--sh-1);
}
/* object-fit을 cover가 아니라 scale-down으로 둔다(2026-09-05 요청: 원본 크기 이상으로 키우지
   않는다) - 큰 스크린샷은 그대로 타일을 채우고, 작은 파비콘은 늘어나지 않고 가운데 놓인다.
   JS(refineSmallImage)가 작은 것에 .is-icon을 붙이기 전 첫 페인트에서도 안 뭉개진다. */
.moayo-site-card__thumb img { display: block; width: 100%; height: 100%; object-fit: scale-down; transition: transform .4s cubic-bezier(.2, .8, .2, 1); }
.moayo-site-card:hover .moayo-site-card__thumb img { transform: scale(1.045); }
/* 이미지 없는 카드는 첫 글자 대신 제목(2026-09-15 요청) - 서버가 40자로 자르고, 칸을 넘치면 3줄에서 말줄임. 이제 문양이 아니라 읽는 글자라 글자 스케일을 따른다. */
/* 위아래 여백을 같게(버튼 top .5rem + 40px만큼) - 긴 제목이 겹친 좋아요/즐겨찾기/보관 버튼 밑으로 깔리지 않으면서, 글자는 타일 정중앙에 온다
   (2026-09-15, 처음엔 위쪽만 띄워서 글자가 아래로 치우쳤다). */
/* 2줄까지 - 가장 좁은 카드(타일 약 226x141)에서 위아래 버튼 자리(48px씩)를 빼면 남는 높이가 --fs-lg 2줄분이다.
   3줄이면 좁은 칸에서 글자가 버튼 위로 넘쳤다. */
.moayo-site-card__thumb-fallback { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; padding: calc(.5rem + 40px) var(--sp-4); box-sizing: border-box; }
.moayo-site-card__thumb-fallback-text { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; text-align: center; font-size: var(--fs-lg); line-height: 1.4; font-weight: 800; color: var(--c-muted); word-break: keep-all; overflow-wrap: anywhere; }

/* 지구본(사이트 바로가기) - 이미지 좌상단 원형 배지(2026-08-31 요청). 유리 재질 느낌(반투명 +
   블러)으로 이미지 위에서 은은하게 떠 보이게 했다. */
.moayo-site-card__globe { position: absolute; top: .5rem; left: .5rem; display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 50%; background: rgba(255, 255, 255, .75); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); box-shadow: var(--sh-2); transition: background-color .15s, transform .15s; }
.moayo-site-card__globe:hover { background: #fff; transform: scale(1.08); }
/* 바로 아래 도메인 링크와 기능이 겹치는데 카드마다 항상 떠 있어서 목록이 지저분했다 - 마우스가
   있는 기기에서는 카드에 올렸을 때만 보여준다(2026-09-04). 터치 기기는 hover가 없으니 그대로
   항상 보인다(그쪽은 이 아이콘이 유일한 바로가기 수단). */
@media (hover: hover) {
  .moayo-site-card__globe { opacity: 0; transition: opacity .15s, background-color .15s, transform .15s; }
  .moayo-site-card:hover .moayo-site-card__globe,
  .moayo-site-card__globe:focus-visible { opacity: 1; }
}
.moayo-site-card__globe img { width: 22px; height: 22px; } /* 아래 액션 버튼들과 같이 1.5배 */

/* 제목/도메인/상세정보/태그 레이아웃(2026-08-31, "제목은 한줄, 링크주소는 파랑색, 상세정보는
   strip_tags로 텍스트만 추출해서 2줄, 태그 1줄" 요청 - 캡쳐 이미지 기준). */
/* 1줄 말줄임이던 걸 2줄로(2026-09-04) - "마트잡 | 마트구인구직! 먹거리구인구직! ..."처럼
   대부분의 제목이 첫 줄에서 잘려나갔다. */
.moayo-site-card__title { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; line-height: 1.35; min-height: calc(2 * 1.35em); margin-bottom: 4px !important; }
/* 비공개 표시(2026-08-31 요청) - _site_card.php 주석 참고, show.php와 같은 진회색 뱃지. */
/* 뱃지 줄(2026-09-15) - 종류/비공개 뱃지를 한 줄에 글자 크기만큼만. */
.moayo-site-card__badges { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-1); margin-bottom: .3rem; }
/* 비공개는 빨강(2026-09-15 요청, "가독성 좋게") - 진회색이던 걸 --c-danger로. 무채색 원칙의 의도적 예외. */
.moayo-site-card__private-badge {
  display: inline-block;
  font-size: var(--fs-xs);
  font-weight: 700;
  color: #fff;
  background: var(--c-danger);
  border-radius: var(--r-pill);
  padding: .05rem .5rem;
}
/* 등록 종류(게시글/링크) 표시(2026-09-15) - 비공개 뱃지와 같은 줄·같은 크기, 상태가 아니라 분류라 테두리만 있는 무채색. */
.moayo-site-card__type-badge { display: inline-block; padding: .05rem .5rem; border: 1px solid var(--c-line-strong); border-radius: var(--r-pill); background: var(--c-surface); color: var(--c-text-soft); font-size: var(--fs-xs); font-weight: 700; }
/* 예전엔 항상 파란색이었는데(캡쳐 기준), 무채색 화면에서 유일한 컬러라 제목보다 도메인이 먼저
   눈에 들어왔다 - 평소엔 무채색으로 두고 마우스를 올렸을 때만 링크색을 준다(2026-09-04).
   링크색 자체는 CLAUDE.md 무채색 원칙의 의도적 예외 그대로다(--c-link). */
/* 도메인이 없는 사이트도 그 줄 자리는 비워둔다 - 그래야 같은 줄의 카드들끼리 설명 텍스트가
   시작하는 높이가 어긋나지 않는다(2026-09-04, "선이 딱딱 맞았으면"). */
.moayo-site-card__domain { color: var(--c-muted); min-height: 1.35em; margin-bottom: 6px; font-weight: 600; transition: color .15s; }
.moayo-site-card:hover .moayo-site-card__domain { color: var(--c-link); }
.moayo-site-card__detail {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
  line-height: 1.45;
  min-height: calc(2 * 1.45em); /* 위 도메인과 같은 이유 - 설명이 1줄이어도 태그 줄 높이가 안 밀린다 */
  margin-bottom: 0;
}
.moayo-site-card__tags {
  margin-top: auto; /* 위 .moayo-site-card-link 주석 참고 - 카드마다 태그 줄 높이를 맞춘다 */
  color: var(--c-faint);
  font-size: var(--fs-xs);
  padding-top: 12px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* 좋아요/즐겨찾기/보관함 - 이미지 우상단 원형 배지 줄(2026-08-31 요청, 캡쳐 기준 - 이전엔 카드
   맨 아래 회색 줄이었음). 이미 눌렀으면(.is-active) 채워진 배경으로 구분한다(그레이스케일
   기준 - CLAUDE.md "삭제류 버튼만 빨간색 예외" 원칙에 맞춰 활성 상태도 무채색으로). */
.moayo-site-card__actions { position: absolute; top: .5rem; right: .5rem; display: flex; gap: .3rem; }
.moayo-site-card__action { display: flex; align-items: center; justify-content: center; gap: .2rem; text-decoration: none; height: 40px; min-width: 40px; padding: 0 .5rem; border: none; border-radius: var(--r-pill); background: rgba(255, 255, 255, .75); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); box-shadow: var(--sh-2); cursor: pointer; transition: background-color .15s, transform .15s; }
.moayo-site-card__action:hover { background: #fff; transform: scale(1.08); }
/* 눌린 상태는 원 배경을 검게 채우지 않고 아이콘 색으로 보여준다(2026-09-04 요청, 참고 이미지
   기준 - 좋아요 빨강 / 즐겨찾기 노랑 / 보관함 초록). 색은 아이콘 파일 자체가 갖고 있고(JS가
   src를 갈아끼움) 여기서는 흰 원을 조금 더 또렷하게만 해준다. */
.moayo-site-card__action.is-active { background: #fff; }
.moayo-site-card__action.is-active .moayo-site-card__action-count { color: var(--c-ink); }
.moayo-site-card__action img { width: 21px; height: 21px; } /* 14px에서 1.5배(2026-09-04 요청) */
.moayo-site-card__action-count { font-size: var(--fs-sm); font-weight: 700; color: var(--c-muted); }
.moayo-site-card__action-count:empty { display: none; }
/* 같은 사이트를 여러 사람이 각자 등록한 묶음 표시(2026-09-05) - 카드에 보이는 건 대표 하나뿐이라
   나머지가 있다는 걸 알려줘야 한다. 위쪽은 지구본/액션 버튼이 쓰고 있어서 썸네일 왼쪽 아래에 둔다.
   "지금 선택된 것"을 나타내는 자리가 아니므로 포인트 색이 아니라 무채색이다. */
/* 배지는 화면 어디에 있든 같은 크기·같은 여백이어야 한다(2026-09-05) - .65~.72rem에 패딩도
   1px 6px/2px 8px/3px 9px로 제각각이었다. */
.moayo-site-card__group-badge { position: absolute; left: var(--sp-2); bottom: var(--sp-2); z-index: 2; display: inline-flex; align-items: center; padding: 2px 8px; border-radius: var(--r-pill); background: rgba(24, 24, 27, .78); color: #fff; font-size: var(--fs-xs); font-weight: 700; letter-spacing: -.01em; }
/* 목록 페이지 헤더(2026-09-04) - 제목/총 개수 왼쪽, 정렬+등록 오른쪽 한 줄. 예전엔 "사이트 등록"
   버튼만 오른쪽에 혼자 떠 있고 그 아래 정렬 탭이 왼쪽에 따로 있어서 두 줄이 서로 겉돌았다. */
/* 정렬 줄은 왼쪽 정렬, 위아래 10px(2026-09-15 요청) - 예전엔 오른쪽 끝 + 위 24px(콘텐츠 padding)·아래 --gutter였다.
   위쪽은 목록 화면에서만 콘텐츠 padding-top을 10px로 줄인다(상세 등 다른 화면은 그대로 24px). */
.moayo-list-head { display: flex; align-items: center; justify-content: flex-start; flex-wrap: wrap; gap: 12px var(--gutter); margin-bottom: 10px; }
.moayo-content:has(> .moayo-page) { padding-top: 10px; }
.moayo-list-head-text { min-width: 0; }
/* 지금 걸려 있는 필터(검색어/태그/카테고리)를 한 번에 푸는 칩(2026-09-05) - 태그/카테고리 페이지는
   주소가 경로라 뒤로가기 말고는 전체 목록으로 돌아갈 길이 없었다. 선택된 상태를 나타내는 자리가
   아니라 "해제" 동작이라 포인트 색을 쓰지 않는다(무채색 원칙). */
.moayo-list-clear { display: inline-flex; align-items: center; gap: var(--sp-1); height: 28px; margin-top: var(--sp-1); padding: 0 var(--sp-2) 0 var(--sp-3); border: 1px solid var(--c-line); border-radius: var(--r-pill); background: var(--c-subtle); color: var(--c-text-soft); font-size: var(--fs-sm); font-weight: 700; text-decoration: none; box-sizing: border-box; max-width: 100%; overflow: hidden; white-space: nowrap; /* 긴 검색어 칩이 화면 밖으로 삐져나오거나 28px 안에서 두 줄로 접히지 않게(2026-09-14 QA) */ }
.moayo-list-clear:hover { background: var(--c-subtle-hover); color: var(--c-ink); }
.moayo-list-clear img { width: var(--ic-sm); height: var(--ic-sm); opacity: .6; }
/* 정렬(세그먼트)과 "사이트 등록"은 성격이 다른 컨트롤이라 간격을 벌려 덩어리를 나눈다. */
.moayo-list-head-actions { display: flex; align-items: center; gap: .5rem 1.25rem; flex-wrap: wrap; }

/* 정렬 세그먼트 컨트롤 - Bulma .tabs(밑줄) 대신 알약형으로 통일 */
.moayo-sort { display: inline-flex; align-items: center; gap: .15rem; height: var(--control-h-sm); padding: 0 .2rem; background: var(--c-subtle); border-radius: var(--r-pill); }
.moayo-sort-item { display: inline-flex; align-items: center; height: calc(var(--control-h-sm) - var(--sp-2)); padding: 0 var(--sp-3); border-radius: var(--r-pill); font-size: var(--fs-sm); font-weight: 600; color: var(--c-muted); text-decoration: none; transition: background-color .15s, color .15s; }
.moayo-sort-item:hover { color: var(--c-ink); }
.moayo-sort-item.is-active { background: var(--c-point); color: #fff; box-shadow: var(--sh-1); }

/* 빈 상태(2026-09-04) - 회색 한 줄 텍스트 대신 아이콘 + 안내 + 다음 행동 */
.moayo-empty { display: flex; flex-direction: column; align-items: center; text-align: center; padding: 3.5rem 1.5rem; background: var(--c-surface); border: 1px solid var(--c-line); border-radius: var(--r-lg); box-shadow: var(--sh-1); }
.moayo-empty-icon { width: 32px; height: 32px; opacity: .5; margin-bottom: .75rem; }
.moayo-empty-title { margin: 0; font-weight: 700; color: var(--c-ink); overflow-wrap: anywhere; }
.moayo-empty-desc { margin: .3rem 0 0; font-size: var(--fs-md); color: var(--c-muted); }
.moayo-empty-actions { display: flex; gap: .5rem; margin-top: 1.1rem; }

/* moayo 목록 하단 페이지네이션 위아래 여백(2026-08-26, "위아래 여백도 추가해줘" 요청) - .pagination은
   이 화면에서만 쓰는 클래스라 여기서 바로 여백을 줘도 다른 화면에 영향 없다. */
.moayo-page .pagination { margin: 2rem 0; }
/* 2026-09-05: 페이지 전체를 820px로 묶던 걸 풀었다("콘텐츠 부분에 width 100% 하지 않아?") -
   목록은 콘텐츠 폭을 꽉 채우는데 상세만 820px에서 멈춰서 넓은 화면에서는 오른쪽이 크게 비고
   좌우 기준선이 어긋나 보였다. 대신 "긴 글"만 읽기 좋은 폭에서 멈춘다(--read-w) - 카드·섹션·
   구분선·비슷한 사이트 줄은 폭을 꽉 채우고, 줄글(소개 본문/한줄설명/의견)만 제한한다.
   한 줄에 100자가 넘어가면 눈이 다음 줄 첫 글자를 못 찾는 게 폭을 제한하는 유일한 이유라,
   제한이 필요한 건 글자가 이어지는 요소뿐이다. */
.moayo-show-page { max-width: none; margin: 0; }

/* 목록으로 돌아가기 + 카테고리 브레드크럼 한 줄(2026-09-04) */
.moayo-show-topnav { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 12px; margin-bottom: 20px; min-height: var(--control-h-sm); }
/* 목록으로/탭/액션은 같은 줄 계열의 컨트롤이라 높이를 --control-h-sm 하나로 맞춘다(2026-09-05). */
.moayo-show-back { display: inline-flex; align-items: center; gap: var(--sp-1); height: var(--control-h-sm); padding: 0 var(--sp-3) 0 var(--sp-2); border-radius: var(--r-pill); background: var(--c-subtle); color: var(--c-text); font-size: var(--fs-sm); font-weight: 600; text-decoration: none; box-sizing: border-box; transition: background-color .15s; }
.moayo-show-back:hover { background: var(--c-subtle-hover); color: var(--c-ink); }
.moayo-show-back img { width: var(--ic-sm); height: var(--ic-sm); }
.moayo-show-breadcrumb { margin: 0 !important; font-size: var(--fs-md); }

/* ── 상세페이지 개편(2026-09-05, "그냥 있는 내용들을 나열한 것 같은 수준" 지적) ──────────────
   위에서부터 ①돌아가기 ②같은 사이트 탭 ③핵심 카드 ④큰 이미지(스크린샷일 때만) ⑤소개 ⑥첨부
   ⑦태그 ⑧의견 ⑨비슷한 사이트 ⑩관리·신고. 핵심은 "무슨 사이트인가 + 가보기 + 담아두기"를
   스크롤 없이 첫 화면에서 끝내는 것이다. */

/* 핵심 카드 - 아이콘·제목·도메인·한줄설명 + 방문/좋아요/즐겨찾기/보관 + 조회·등록일 */
/* 카드류는 안쪽 여백을 --sp-5 하나로 맞춘다(2026-09-05) - 20px/16px/14px/10px 14px가 섞여
   있어서 카드마다 글이 시작하는 위치가 조금씩 어긋나 보였다. */
.moayo-show-hero-card { margin: 0 0 var(--sp-4); padding: var(--sp-5); background: var(--c-surface); border: 1px solid var(--c-line); border-radius: var(--r-lg); box-shadow: var(--sh-1); }
.moayo-show-identity { display: flex; align-items: flex-start; gap: 14px; }
/* 아이콘은 원본이 16px 파비콘인 경우가 많아 늘리지 않고(뭉개짐) 가운데에 놓는다 */
/* 대표 이미지(캡처) 칸(2026-09-15, 64px 파비콘 칸 -> 목록 카드와 같은 16:10 비율).
   160 -> 300px(같은 날 요청) - 방문/액션 줄을 오른쪽 칸으로 옮겨 높이를 확보했다. 이 칸은 썸네일이 아니라 원본을 줄여 보여준다(show.php 주석). */
.moayo-show-icon { flex: 0 0 auto; display: flex; align-items: center; justify-content: center; width: 300px; aspect-ratio: 16 / 10; border-radius: var(--r-md); background: var(--c-subtle); border: 1px solid var(--c-line); overflow: hidden; }
.moayo-show-icon img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: scale-down; } /* 원본보다 크게 늘리지 않는다(2026-09-05) */
/* 제목 앞 파비콘(2026-09-15) - 원래 왼쪽 칸에 있던 것. 16px 파비콘이 28px로 뭉개지지 않게 scale-down. */
.moayo-show-title-icon { width: var(--ic-lg); height: var(--ic-lg); margin-right: var(--sp-2); object-fit: scale-down; vertical-align: -.2em; }
/* 상단바 .moayo-favbar-icon-fallback은 "글자"가 아니라 이미지가 없을 때 대신 그리는 첫 글자 문양이라 글자 스케일(--fs-*)을
   따르지 않는다 - 원 크기에 맞춘 값이다. (목록 카드 .moayo-site-card__thumb-fallback과 아래 상세 칸은 2026-09-15부터 제목 전체라
   스케일을 따른다) */
/* 상세 왼쪽 칸 - 이미지가 없으면 제목(2026-09-15 요청). 위에 겹친 버튼이 없어 위아래 여백을 같게 두고 3줄까지. */
.moayo-show-icon-fallback { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden; margin: 0 var(--sp-4); text-align: center; font-size: var(--fs-title); line-height: 1.4; font-weight: 800; color: var(--c-muted); word-break: keep-all; overflow-wrap: anywhere; }
.moayo-show-identity-text { min-width: 0; flex: 1 1 auto; }
/* 모바일은 썸네일을 위, 제목·버튼을 아래로 쌓는다(2026-09-15) - 300px 칸을 옆에 두면 글자 칸이 거의 안 남는다.
   처음엔 600px 구간에 넣었다가 601~767px 창에서 옆에 붙은 채로 남아(사용자 캡처) 목록과 같은 모바일 구간(767px)으로 맞췄다. */
@media (max-width: 767px) {
  .moayo-show-identity { flex-direction: column; }
  /* 원본 이미지라 폭을 꽉 채워도 16:10 칸이 비지 않는다(썸네일일 때는 300px 주위가 빈 회색이었다). */
  .moayo-show-icon { width: 100%; }
}
.moayo-show-title { margin: 0; font-size: var(--fs-page); line-height: 1.3; letter-spacing: -.025em; font-weight: 800; color: var(--c-ink); word-break: keep-all; }
/* 비공개 배지 - 제목 위 한 줄을 통째로 차지하던 걸 제목 옆으로 */
.moayo-show-private-badge { display: inline-block; margin-left: var(--sp-1); padding: 2px 8px; border-radius: var(--r-pill); background: var(--c-danger); color: #fff; font-size: var(--fs-xs); font-weight: 700; vertical-align: middle; }
.moayo-show-domain { margin: var(--sp-1) 0 0; font-size: var(--fs-md); font-weight: 600; color: var(--c-link); word-break: break-all; }
/* 도메인을 누르면 사이트로 간다(2026-09-15 요청) - 이미 링크색이라 평소 모양은 그대로, 가리키면 밑줄. */
.moayo-show-domain a { color: inherit; text-decoration: none; }
.moayo-show-domain a:hover { text-decoration: underline; }
.moayo-show-lead { max-width: var(--read-w); margin: var(--sp-2) 0 0; font-size: var(--fs-lg); line-height: 1.6; color: var(--c-text-soft); }

/* 행동 줄 - 방문(채운 버튼)과 담아두기(아이콘 버튼)의 무게를 확실히 구분한다 */
.moayo-show-cta { display: flex; align-items: center; flex-wrap: wrap; gap: 10px 12px; margin-top: 16px; }
.moayo-show-visit { flex: 0 0 auto; }
.moayo-show-visit-button { display: inline-flex; align-items: center; gap: .45rem; }
.moayo-show-visit-button img { width: var(--ic-sm); height: var(--ic-sm); filter: invert(1); }
.moayo-show-actions { display: flex; flex-wrap: wrap; gap: 6px; }
/* 목록 카드와 같은 아이콘·색 규칙(좋아요=빨강/즐겨찾기=노랑/보관=초록)에 라벨만 붙인 형태 */
.moayo-show-action { display: inline-flex; align-items: center; gap: var(--sp-1); height: var(--control-h-sm); padding: 0 var(--sp-3); border: 1px solid var(--c-line); border-radius: var(--r-pill); background: var(--c-surface); color: var(--c-text-soft); font-size: var(--fs-sm); font-weight: 700; font-family: inherit; text-decoration: none; cursor: pointer; box-sizing: border-box; transition: background-color .15s, border-color .15s, color .15s; }
.moayo-show-action:hover { background: var(--c-subtle); border-color: var(--c-line-strong); color: var(--c-ink); }
.moayo-show-action.is-active { border-color: var(--c-line-strong); color: var(--c-ink); }
.moayo-show-action img { width: var(--ic-sm); height: var(--ic-sm); }
.moayo-show-action-count { font-variant-numeric: tabular-nums; color: var(--c-muted); }
.moayo-show-action.is-active .moayo-show-action-count { color: var(--c-ink); }
.moayo-show-action-count:empty { display: none; }

/* 조회·등록일은 행동이 아니라 맥락 정보라 카드 맨 아래 옅은 한 줄로 분리 */
.moayo-show-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-1) var(--sp-3); margin: var(--sp-4) 0 0; padding-top: var(--sp-3); border-top: 1px solid var(--c-line); font-size: var(--fs-xs); color: var(--c-muted); }
.moayo-show-meta > span + span::before { content: "·"; margin-right: .75rem; color: var(--c-line-strong); }

/* 섹션 - 소개/첨부/태그/의견/비슷한 사이트가 모두 같은 형식이 되도록 통일 */
/* 섹션 제목은 상세(1.05rem)와 등록 폼(.95rem)이 서로 달랐다 - 같은 역할이므로 --fs-title 하나로. */
.moayo-show-section-title { display: flex; align-items: baseline; gap: var(--sp-2); margin: 0 0 var(--sp-4); font-size: var(--fs-title); font-weight: 800; letter-spacing: -.02em; color: var(--c-ink); }
.moayo-show-section-count { display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding: 0 var(--sp-2); border-radius: var(--r-pill); background: var(--c-subtle); color: var(--c-text-soft); font-size: var(--fs-xs); font-weight: 700; }
/* 본문 - <br> 대신 white-space로 줄바꿈을 살려 문단 간격을 CSS가 다룰 수 있게 한다 */
/* 읽는 글은 --fs-body, 그 위 리드는 --fs-lg, 의견은 --fs-md - 1.02/.95/.92rem으로 제각각이라
   위계가 아니라 그냥 다른 크기로 보였다(2026-09-05). */
.moayo-show-content { max-width: var(--read-w); white-space: pre-line; font-size: var(--fs-body); line-height: 1.8; color: var(--c-text); word-break: keep-all; }
/* AI 작성 안내(2026-09-14) - 작성 중/실패/한도 초과는 등록자에게만 소개 위에, "AI가 작성한 내용이에요"는 소개 아래 작게 */
.moayo-show-ai-notice { max-width: var(--read-w); margin: 0 0 var(--sp-5); padding: var(--sp-3) var(--sp-4); border: 1px solid var(--c-line); border-radius: var(--r-sm); background: var(--c-subtle); font-size: var(--fs-md); line-height: 1.7; color: var(--c-text); }
.moayo-show-ai-label { margin: var(--sp-3) 0 0; font-size: var(--fs-xs); color: var(--c-muted); }
.moayo-show-empty { margin: 0; font-size: var(--fs-md); color: var(--c-muted); }

/* 의견 - 흔한 댓글 UI(동그란 프로필 + 말풍선)로 그린다(2026-09-05 요청) - 그전에는 테두리
   상자 안에 날짜와 글만 있어서 "누가 한 말"이라는 느낌이 전혀 없었다. */
.moayo-comment-avatar { flex: 0 0 auto; display: flex; align-items: center; justify-content: center; width: 36px; height: 36px; border-radius: 50%; overflow: hidden; background: var(--c-subtle); border: 1px solid var(--c-line); color: var(--c-text-soft); font-size: var(--fs-md); font-weight: 800; }
/* 프로필 사진만 cover를 그대로 둔다(2026-09-05 "원본보다 키우지 않는다" 규칙의 유일한 예외) -
   36px 원형이라 사진을 원에 맞춰 잘라내는 게 맞고, 회원 프로필 사진은 36px보다 작은 경우가
   사실상 없다. 콘텐츠 이미지(썸네일/대표/첨부)는 전부 scale-down이다. */
.moayo-comment-avatar img { width: 100%; height: 100%; object-fit: cover; }

/* 입력창도 댓글 한 줄처럼 - 내 프로필 옆에서 바로 쓴다 */
.moayo-comment-form { display: flex; align-items: flex-start; gap: 10px; margin: 0 0 18px; }
.moayo-comment-form-body { flex: 1 1 auto; min-width: 0; max-width: var(--read-w); }
.moayo-comment-input { display: block; width: 100%; min-height: 62px; padding: var(--sp-3); border: 1px solid var(--c-line); border-radius: var(--r-md); background: var(--c-subtle); color: var(--c-text); font-family: inherit; font-size: var(--fs-md); line-height: 1.6; resize: vertical; box-sizing: border-box; }
.moayo-comment-input:focus { outline: 0; border-color: var(--c-line-strong); background: var(--c-surface); box-shadow: 0 0 0 3px rgba(24, 24, 27, .06); }
.moayo-comment-form-actions { display: flex; justify-content: flex-end; gap: 6px; margin-top: 8px; }

.moayo-comment-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--sp-4); }
.moayo-comment-more { display: flex; justify-content: center; margin-top: var(--sp-4); }
.moayo-comment-more .button { height: var(--control-h-sm); padding: 0 var(--sp-4); font-size: var(--fs-sm); }
.moayo-comment { display: flex; align-items: flex-start; gap: 10px; }
/* 말풍선 - 카드 안의 카드가 되지 않게 테두리 없이 옅은 면으로만 구분한다 */
.moayo-comment-body { flex: 1 1 auto; min-width: 0; max-width: var(--read-w); padding: var(--sp-3) var(--sp-4); border-radius: var(--r-md); background: var(--c-subtle); }
.moayo-comment.is-mine .moayo-comment-body { background: var(--c-point-soft); }
/* 머리글은 한 줄로 고정한다(2026-09-05 지적) - flex-wrap이 열려 있어서 이름+날짜+수정/삭제가
   말풍선 폭을 넘으면 수정/삭제만 다음 줄로 떨어져 오른쪽 끝에 혼자 붙어 있었다. 넘칠 때 줄여야
   하는 건 길이가 정해지지 않은 "이름"뿐이라, 이름만 말줄임하고 나머지는 제 크기를 지킨다. */
.moayo-comment-head { display: flex; align-items: center; flex-wrap: nowrap; gap: var(--sp-2); margin-bottom: var(--sp-1); }
.moayo-comment-author { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-md); font-weight: 700; color: var(--c-ink); }
.moayo-comment-mine { flex: 0 0 auto; padding: 2px 8px; border-radius: var(--r-pill); background: var(--c-surface); color: var(--c-text-soft); font-size: var(--fs-xs); font-weight: 700; }
.moayo-comment-date { flex: 0 0 auto; white-space: nowrap; font-size: var(--fs-xs); color: var(--c-muted); }
.moayo-comment-text { margin: 0; white-space: pre-line; font-size: var(--fs-md); line-height: 1.7; color: var(--c-text); word-break: break-word; }
/* 수정/삭제(2026-09-05) - 말풍선 머리글 오른쪽 끝에 작은 링크 두 개 */
.moayo-comment-tools { flex: 0 0 auto; display: flex; align-items: center; gap: var(--sp-2); margin-left: auto; }
/* 삭제만 <form>으로 한 겹 더 감싸져 있어서(CSRF 토큰 때문) 그 안에서 버튼이 글줄 기준선 위에
   놓이고, 그 아래 남는 여백만큼 "수정"보다 밑으로 내려가 보였다(2026-09-05 지적) - 폼도 flex로
   만들어 기준선 자체를 없앤다. line-height:1은 두 버튼의 글자 상자 높이를 똑같이 맞춘다. */
.moayo-comment-delete { display: flex; align-items: center; margin: 0; }
.moayo-comment-tool { display: block; padding: 0; border: 0; background: none; color: var(--c-muted); font-size: var(--fs-xs); line-height: 1; font-family: inherit; text-decoration: underline; cursor: pointer; }
.moayo-comment-tool:hover { color: var(--c-ink); }
.moayo-comment-delete .moayo-comment-tool:hover { color: #e11d48; }
/* 수정 중에는 원문을 감추고 입력창만 보여준다 - 같은 글이 두 번 보이면 어느 쪽이 진짜인지 헷갈린다 */
.moayo-comment.is-editing .moayo-comment-text { display: none; }
.moayo-comment-edit { margin: 0; }
.moayo-comment-edit .moayo-comment-input { background: var(--c-surface); }
.moayo-comment-edit .moayo-comment-form-actions { gap: var(--sp-2); }
/* 의견 UI 안의 버튼은 이 영역 스케일(--fs-sm / --control-h-sm)을 따른다 - Bulma .button.is-small의
   기본 크기와 달라 나란히 놓으면 높이가 안 맞았다(2026-09-05). */
.moayo-comment-form-actions .button { height: var(--control-h-sm); padding: 0 var(--sp-4); font-size: var(--fs-sm); }
/* 수정 중에는 "수정" 버튼을 감춘다 - 눌러도 아무 일도 일어나지 않아 고장난 것처럼 보였다. */
.moayo-comment.is-editing [data-comment-action="edit"] { display: none; }

/* 관리·신고 - 페이지 맨 아래 한 줄로 모은다(수정/삭제가 제목 위를 차지하고 있었다) */
.moayo-show-footer-actions { display: flex; align-items: flex-start; justify-content: space-between; flex-wrap: wrap; gap: 12px; margin-top: 8px; padding: 16px 4px 0; border-top: 1px solid var(--c-line); }
.moayo-show-footer-actions:empty { display: none; }
.moayo-show-manage { display: flex; gap: 8px; }
.moayo-show-manage form { margin: 0; }
/* <details> 기본 삼각형 마커를 없애고 링크처럼 보이게 - 예전엔 .button을 씌워 마커와 겹쳤다 */
.moayo-show-report { margin-left: auto; }
.moayo-show-report-toggle { display: inline-block; padding: var(--sp-1) 2px; color: var(--c-muted); font-size: var(--fs-xs); cursor: pointer; list-style: none; }
.moayo-show-report-toggle::-webkit-details-marker { display: none; }
.moayo-show-report-toggle:hover { color: var(--c-ink); text-decoration: underline; }
.moayo-show-report-form { margin-top: var(--sp-2); padding: var(--sp-4); border: 1px solid var(--c-line); border-radius: var(--r-md); background: var(--c-subtle); }

@media (max-width: 600px) {
  .moayo-show-hero-card { padding: 16px; }
  .moayo-show-title { font-size: var(--fs-page); }
  .moayo-show-visit, .moayo-show-visit-button { width: 100%; justify-content: center; }
  .moayo-show-action { flex: 1 1 auto; justify-content: center; }
}




.moayo-show-report-status { margin: 1rem 0; display: flex; align-items: center; gap: .6rem; }
.moayo-show-report-cancel { margin: 0; }
/* 같은 사이트를 소개한 글끼리 오가는 탭(2026-09-05 요청) - 지금 보고 있는 탭만 포인트 색으로
   채운다("선택 표시"에만 포인트 색을 쓴다는 규칙에 맞는 자리). 탭 수가 많아지면 가로로 스크롤. */
.moayo-show-group { margin: 0 0 14px; }
.moayo-show-group-label { margin: 0 0 var(--sp-2); font-size: var(--fs-xs); font-weight: 700; color: var(--c-muted); }
.moayo-show-group-tabs { display: flex; gap: 6px; overflow-x: auto; padding-bottom: 2px; scrollbar-width: thin; }
.moayo-show-group-tab { flex: 0 0 auto; display: inline-flex; align-items: center; gap: var(--sp-1); height: var(--control-h-sm); padding: 0 var(--sp-3); border: 1px solid var(--c-line); border-radius: var(--r-pill); background: var(--c-surface); color: var(--c-text-soft); font-size: var(--fs-sm); font-weight: 700; text-decoration: none; white-space: nowrap; box-sizing: border-box; transition: background-color .15s, border-color .15s, color .15s; }
a.moayo-show-group-tab:hover { border-color: var(--c-line-strong); color: var(--c-ink); }
.moayo-show-group-tab.is-active { background: var(--c-point); border-color: var(--c-point); color: #fff; cursor: default; }
.moayo-show-group-tab-date { font-size: var(--fs-xs); font-weight: 600; color: var(--c-muted); }
.moayo-show-group-tab.is-active .moayo-show-group-tab-date { color: rgba(255, 255, 255, .8); }
.moayo-show-group-tab-private { padding: 2px 8px; border-radius: var(--r-pill); background: rgba(24, 24, 27, .12); font-size: var(--fs-xs); font-weight: 700; }
.moayo-show-group-tab.is-active .moayo-show-group-tab-private { background: rgba(255, 255, 255, .28); }
.moayo-category-checks label.checkbox { display: inline-block; margin-right: 1rem; margin-bottom: .4rem; }
/* 등록/수정 폼 다중 파일 첨부 목록(2026-08-31 요청) - 기존 업로드된 파일들을 링크+삭제 버튼 줄로 */
.moayo-write-files { list-style: none; margin: 0 0 .5rem; padding: 0; }
.moayo-write-files li { display: flex; align-items: center; justify-content: space-between; gap: .5rem; padding: .4rem .6rem; background: var(--c-subtle); border: 1px solid var(--c-line); border-radius: var(--r-sm); margin-bottom: .3rem; font-size: var(--fs-md); }
/* 상세페이지 첨부파일 목록(2026-08-31 요청) */

/* ── 사이트 등록/수정 폼(2026-09-05 개편) ──────────────────────────────────────
   그전까지 .moayo-write-page에는 CSS가 한 줄도 없어서, 상세(.moayo-show-page, 820px)와 달리
   폼이 콘텐츠 폭 전체로 늘어나 입력칸 하나가 화면 끝까지 이어졌다. 폼은 읽는 글보다 더 좁아야
   눈이 왼쪽 기준선을 잃지 않으므로 상세보다 좁은 720px로 둔다. */
/* 2026-09-05: 폼 전체를 720px로 묶던 걸 풀었다(상세와 같은 이유 - 목록과 좌우 기준선이 어긋남).
   구획(fieldset)과 구분선은 콘텐츠 폭을 꽉 채우고, 눈이 라벨에서 입력칸 끝까지 훑어야 하는
   "입력 컨트롤"만 --field-w에서 멈춘다. 칩(카테고리/태그)은 줄바꿈되는 요소라 넓을수록 좋아서
   제한하지 않는다. */
.moayo-write-page { max-width: none; margin: 0; --field-w: 640px; }
.moayo-write-page .input,
.moayo-write-page .textarea,
.moayo-write-page .moayo-label-row,
.moayo-write-page .moayo-dropzone { max-width: var(--field-w); }
.moayo-write-title { margin: 0 0 var(--gutter); }
/* 성격이 같은 입력끼리 묶는 구획 - fieldset 기본 테두리/패딩은 지우고 구분선만 남긴다. */
.moayo-form-section { margin: 0 0 26px; padding: 0; border: 0; }
.moayo-form-section + .moayo-form-section { margin-top: 26px; padding-top: 22px; border-top: 1px solid var(--c-line); }
/* "(선택)"을 라벨과 같은 크기/색으로 쓰면 필수 항목처럼 읽힌다 - 작고 옅은 배지로. */
.moayo-label-optional { margin-left: var(--sp-1); padding: 2px 8px; border-radius: var(--r-pill); background: var(--c-subtle); color: var(--c-muted); font-size: var(--fs-xs); font-weight: 700; vertical-align: middle; }
/* 라벨 오른쪽 끝에 글자수 카운터를 붙이는 줄 */
.moayo-label-row { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.moayo-label-row .label { margin-bottom: .5rem; }
.moayo-field-counter { font-size: var(--fs-xs); font-weight: 700; color: var(--c-muted); font-variant-numeric: tabular-nums; }
.moayo-field-counter.is-near { color: var(--c-text-soft); }
.moayo-field-counter.is-over { color: #e11d48; }

/* 첨부 - 파일 입력에 텍스트 입력용 .input을 씌워 겉돌던 걸 끌어다 놓기 영역으로 바꿨다.
   실제 <input type="file">은 화면에서만 감춘다(display:none으로 지우면 키보드 포커스가 안 간다). */
.moayo-dropzone { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--sp-1); padding: var(--sp-5) var(--sp-4); border: 1.5px dashed var(--c-line-strong); border-radius: var(--r-md); background: var(--c-subtle); text-align: center; cursor: pointer; transition: background-color .15s, border-color .15s; }
.moayo-dropzone:hover { background: var(--c-subtle-hover); }
.moayo-dropzone.is-dragover { background: var(--c-point-soft); border-color: var(--c-point); }
.moayo-dropzone-title { font-size: var(--fs-lg); font-weight: 700; color: var(--c-text); }
.moayo-dropzone-desc { font-size: var(--fs-xs); color: var(--c-muted); }
.moayo-dropzone-input { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
.moayo-dropzone-input:focus-visible + .moayo-dropzone,
.moayo-dropzone:focus-within { outline: 2px solid var(--c-ink); outline-offset: 2px; }
.moayo-file-picker-help { margin-top: .5rem; }

/* 카테고리 - 체크박스 나열 대신 사이드바/상세와 같은 칩. 선택된 것만 포인트 색(선택 표시 자리). */
.moayo-check-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.moayo-check-chip { display: inline-flex; margin: 0; cursor: pointer; }
.moayo-check-chip input { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); }
.moayo-check-chip span { display: inline-flex; align-items: center; height: 28px; padding: 0 var(--sp-3); border: 1px solid var(--c-line); border-radius: var(--r-pill); background: var(--c-surface); color: var(--c-text-soft); font-size: var(--fs-sm); font-weight: 600; box-sizing: border-box; transition: background-color .15s, border-color .15s, color .15s; }
.moayo-check-chip:hover span { border-color: var(--c-line-strong); color: var(--c-ink); }
.moayo-check-chip input:checked + span { background: var(--c-point); border-color: var(--c-point); color: #fff; }
.moayo-check-chip input:focus-visible + span { outline: 2px solid var(--c-ink); outline-offset: 2px; }

/* 태그 - 입력한 대로 칩으로 되비쳐 보여주고, 자주 쓰는 태그는 눌러서 넣는다. */
.moayo-tag-preview { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.moayo-tag-preview:empty { display: none; }
.moayo-tag-preview-item { display: inline-flex; align-items: center; height: 28px; padding: 0 var(--sp-3); border-radius: var(--r-pill); background: var(--c-point-soft); color: var(--c-text); font-size: var(--fs-sm); font-weight: 700; }
.moayo-tag-suggest { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 10px; }
.moayo-tag-suggest-label { font-size: var(--fs-xs); font-weight: 700; color: var(--c-muted); }
.moayo-tag-suggest-item { border: 1px solid var(--c-line); background: var(--c-surface); cursor: pointer; font-family: inherit; }
.moayo-tag-suggest-item.is-added { opacity: .45; pointer-events: none; }

/* 공개등록/비공개등록 버튼 줄(2026-09-15) - "공개 설정" 라디오 카드(.moayo-radio-card)는 이 버튼 두 개로 바뀌어 없앴다. */
.moayo-write-actions { display: flex; align-items: center; gap: .5rem; margin-top: 4px; }
/* 삭제는 저장 버튼과 붙여두면 잘못 누르기 쉬워서 구분선 + 여백으로 떼어놓는다. */
.moayo-write-danger { margin-top: 2.5rem; padding-top: 1.25rem; border-top: 1px solid var(--c-line); }
.moayo-write-danger-label { margin: 0 0 var(--sp-2); font-size: var(--fs-xs); color: var(--c-muted); }
.moayo-write-delete { margin: 0; }

/* 공용 확인/알림 모달(partials/_confirm_modal.php)의 뒤 배경 - Bootstrap JS가 .modal-backdrop을
   .bs-scope 밖(<body> 바로 아래)에 새로 만들기 때문에 스코프된 부트스트랩 CSS(.bs-scope .modal-backdrop)가
   전혀 안 걸린다. .claude/references/ui-confirm-modal.md / admin-list-ui-patterns.md 참고.
   2026-09-05: 그동안 색/투명도만 적어두고 position·크기·z-index를 안 줘서, 요소는 만들어지는데
   크기가 0이라 화면에는 아무것도 안 보였다(모달 뒤가 그냥 밝은 상태였다) - 필요한 속성을 전부
   여기에 적는다. */
.modal-backdrop {
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  background-color: #000;
  /* 헤더(1080)·사이드바(1085)보다 위여야 뒤 화면이 실제로 덮인다 - 안 그러면 어둡게 깔아도
     앱 셸만 그 위로 튀어나온다. */
  z-index: calc(var(--z-confirm) - 1);
}
.modal-backdrop.fade { opacity: 0; transition: opacity .15s linear; }
/* "약간 어두운 투명"(2026-09-05 요청) - 뒤 내용이 비쳐 보이는 정도로만 낮춘다. */
.modal-backdrop.show { opacity: .35; }
/* 모달 상자 자체도 앱 셸 위로 올린다(부트스트랩 기본값 1055는 헤더 1080보다 아래라 가려진다).
   2026-09-05: 처음엔 부모(.bs-scope)에 --bs-modal-zindex만 바꿔 끼웠는데, 정작 .bs-scope .modal이
   자기 규칙 안에서 그 변수를 1055로 다시 정의하고 있어서 부모 값이 전혀 안 먹었다 - 그 바람에
   배경(1094)이 모달(1055) 위로 올라와 모달을 덮어버렸다("배경이 모달창 위에 올라오면 안 되지").
   그래서 변수가 아니라 z-index를 직접 지정한다. bootstrap.scoped.css가 custom.css보다 뒤에
   로드되므로 같은 특정도로는 지고, body를 하나 더 붙여 특정도를 올린다. */
body .bs-scope .modal { z-index: var(--z-confirm); }
/* 모달 안내 문구는 문장마다 줄을 바꿔서 보여준다(2026-09-05 공통 규칙, _confirm_modal.php의
   renderMessage가 <br>로 끊는다) - 여기서는 한국어가 단어 중간에서 잘리지 않게(keep-all) 하고
   줄간격만 읽기 좋게 잡는다. */
#uiConfirmModalBody { line-height: 1.65; word-break: keep-all; }

/* 좌측 사이드바 "보관함/즐겨찾기/좋아요/최근목록"(2026-08-31 요청) - .moayo-sidebar-item이 이미
   flex+gap으로 아이콘/텍스트를 나란히 놓아주므로 아이콘 크기만 맞춘다. */
.moayo-sidebar-item-icon img { width: 27px; height: 27px; flex: 0 0 auto; } /* 18px에서 1.5배(2026-09-04 요청) */

/* 상단 고정바(고정+최근본 내역, 2026-08-31 요청) - 캡쳐 이미지 기준 "아이콘 위 / 이름 아래"
   타일이 가로로 스크롤되는 형태로 다시 그렸다("디자인적인건 하나도 반영안되었는데" 지적으로
   가로 알약(pill) 모양에서 교체). 서버(laravelapi)가 고정 우선 + 최근본 순으로 이미 정렬해서
   주므로 여기서는 타일 레이아웃 + 마우스오버 액션만 담당한다. 색상은 프로젝트 그레이스케일
   기준(CLAUDE.md)을 그대로 따르고, 캡쳐의 초록 브랜드 컬러는 반영하지 않았다. .moayo-pc-header와
   달리 sticky로 붙이지 않는다(그 헤더의 sticky top 계산(--header-h, 사이드바 offset과도 얽혀 있음)에
   맞물리지 않게 하려고 - 실제 브라우저 북마크바도 페이지 스크롤을 안 따라간다는 점에서 자연스러운
   선택이기도 하다). */
/* 상단 최근본 바 배경 - 포인트 색 계열(2026-09-04 요청) */
/* 2026-09-05: 70px로 줄였더니 아이콘이 너무 작다는 지적으로 타일을 80x80으로 키우고, 대신
   가로 스크롤바를 10px -> 6px로 얇게 해서 바가 불필요하게 두꺼워지지 않게 했다. 바 높이는
   내용에 맞춰 자동(타일 80 + 스크롤바 6 + 테두리 1 = 약 87px - 2026-09-05 "좌측/상단에 공간이 있다" 지적으로
   스크롤 영역의 안쪽 여백을 전부 없애 타일이 바의 좌/상단에 딱 붙는다). */
.moayo-favbar { width: 100%; background: var(--c-point-soft); border-bottom: 1px solid var(--c-line); box-sizing: border-box; }
.moayo-favbar-scroll {
  display: flex;
  /* 타일 사이 간격도 0(2026-09-05 요청) - 바 안쪽 여백을 없앤 데 이어 타일끼리도 딱 붙인다. */
  gap: 0;
  overflow-x: auto;
  height: 100%;
  box-sizing: border-box;
  padding: 0;
  /* 스크롤바 디자인(2026-08-31, 실제 moayo.net 캡쳐 기준 "얇게, 높이는 10px정도" 요청) - 브라우저
     기본 굵은 스크롤바 대신 얇고 은은한 회색 막대로. Firefox는 scrollbar-width/-color로 폭까지는
     못 정하고 auto/thin 두 단계뿐이라 thin으로 최대한 얇게, 실제 두께(10px)는 아래
     ::-webkit-scrollbar가 적용되는 브라우저(Chrome/Safari/Edge) 기준. */
  scrollbar-width: thin;
  scrollbar-color: var(--c-point) transparent;
}
.moayo-favbar-scroll::-webkit-scrollbar { height: 6px; }
.moayo-favbar-scroll::-webkit-scrollbar-track { background: transparent; }
.moayo-favbar-scroll::-webkit-scrollbar-thumb {
  background-color: var(--c-point);
  border-radius: var(--r-pill);
  /* 트랙 배경(.moayo-favbar와 같은 var(--c-point-soft))과 같은 색 테두리를 둘러서 막대가 실제보다
     가늘어 보이게 하는 표준 기법 - border-box라 10px 높이 안에서 실질 두께만 줄어든다. */
  border: 1px solid var(--c-point-soft);
}
.moayo-favbar-scroll::-webkit-scrollbar-thumb:hover { background-color: var(--c-point-hover); }
/* 타일 크기/제목 표시를 레거시 moayo.net 상단바와 같게 맞췄다(2026-09-04 요청, 캡쳐 대조) -
   타일 96px, 아이콘 원 56px, 제목은 아이콘 아래 "반투명 검은 띠 + 흰 글자". */
/* 타일 높이는 100px 고정(2026-09-05 요청) - 내용(아이콘 56 + 제목 22)보다 커도 링크가 타일을
   100% 채우게 해서, 마우스오버 오버레이(.moayo-favbar-actions, inset:0)가 타일 전체를 빈틈없이
   덮게 한다. 제목 띠는 margin-top:auto로 항상 맨 아래에 붙는다. */
.moayo-favbar-item { position: relative; flex: 0 0 auto; width: 80px; height: 80px; }
.moayo-favbar-link { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 4px 0 0; height: 100%; box-sizing: border-box; border-radius: var(--r-md); color: var(--c-text); text-decoration: none; }
.moayo-favbar-item:hover .moayo-favbar-link,
.moayo-favbar-item.is-open .moayo-favbar-link { background: rgba(75, 183, 73, .18); }
/* .moayo-favbar-icon은 배지의 위치 기준(position:relative)만 맡고, 사진을 원형으로 잘라내는
   overflow:hidden은 안쪽 .moayo-favbar-icon-inner로 옮겼다(2026-08-31, "이미지 위쪽에
   얹어져야해 지금은 안으로 들어가네" 지적) - 이전엔 이 둘이 한 요소였어서, 원 밖으로 살짝
   튀어나와야 할 핀 배지(top:-4px)까지 같이 잘려서 안으로 눌려 들어간 것처럼 보였다. */
.moayo-favbar-icon { position: relative; display: flex; align-items: center; justify-content: center; width: 54px; height: 54px; flex: 0 0 auto; }
.moayo-favbar-icon-inner { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; border-radius: 50%; overflow: hidden; background: var(--c-subtle); border: 1px solid var(--c-line-strong); }
.moayo-favbar-item.is-pinned .moayo-favbar-icon-inner { border-color: var(--c-muted); border-width: 2px; }
/* 파비콘이 대부분이라 cover로 채우면 16px짜리가 54px로 늘어나 뭉갠다 - 원본보다 크게는 안
   키우고 가운데 정렬한다(2026-09-05 요청). */
.moayo-favbar-icon-inner img { display: block; width: 100%; height: 100%; object-fit: scale-down; }
/* 진짜 파비콘(2026-09-14, laravelapi SiteIconFetcher - 180px 애플 아이콘도 많다)은 원 안에 --ic-lg 크기로만 - "나비야넷 정도
   사이즈" 요청. 작은 원본(16~32px)은 그대로 두고 키우지 않는다(max-width/max-height). */
.moayo-favbar-icon-inner img[data-favicon] { width: auto; height: auto; max-width: var(--ic-lg); max-height: var(--ic-lg); object-fit: contain; }

/* 실제로 찍어 올린 그림(원본이 타일보다 큰 것)은 원 안에 작게 넣지 않고 타일 배경을 꽉 채운다
   (2026-09-05 요청: "파비콘 이미지는 동그랗게 하는 게 맞는데 이미지를 업로드한 경우에는 배경
   전체가 이미지가 되게"). 파비콘인지 그림인지는 원본 크기를 아는 브라우저가 판단해서
   .is-photo를 붙인다(moayo-app.js의 refineFavbarImages).
   그림일 때는 원 대신 타일 모서리(--r-xs)를 따르고, 제목 띠는 그림 위에 그대로 얹힌다. */
.moayo-favbar-item.is-photo .moayo-favbar-icon { position: absolute; inset: 0; width: auto; height: auto; }
/* 모서리를 0으로 두는 건 참고 화면(2026-09-05 캡쳐)처럼 그림이 타일 끝까지 꽉 차야 하기 때문이다 */
.moayo-favbar-item.is-photo .moayo-favbar-icon-inner { width: 100%; height: 100%; border: 0; border-radius: 0; background: none; }
/* 여기서 cover는 원본보다 키우지 않는다 - 가로·세로 둘 다 타일보다 큰 그림에만 이 클래스가 붙는다 */
.moayo-favbar-item.is-photo .moayo-favbar-icon-inner img { object-fit: cover; }
/* 제목 띠와 고정 배지는 그림 위로 올린다(그림이 타일 전체를 덮으므로) */
.moayo-favbar-item.is-photo .moayo-favbar-label { position: relative; z-index: 1; }
.moayo-favbar-item.is-photo .moayo-favbar-pin-badge { z-index: 2; }
.moayo-favbar-icon-fallback { font-size: 1rem; font-weight: 700; color: var(--c-muted); }
/* 고정 배지(2026-08-31 "고정된경우 고정클립의 색상을 줘야지" 요청) - 2026-09-04에 사이트 전체
   활성 표시 방식이 "아이콘에 색"으로 바뀌면서 이 배지도 흰 원 + 파란 핀으로 맞췄다. 크기도
   다른 최근본 바 아이콘과 같이 1.5배 키웠다. */
.moayo-favbar-pin-badge { position: absolute; /* 기준은 .moayo-favbar-icon(원)인데 값은 타일 기준으로 잡는다(2026-09-05 "위여백/좌여백 3px" 요청) - 원은 타일 안에서 위로 4px(.moayo-favbar-link의 padding-top), 왼쪽으로 13px((80-54)/2)만큼 들어와 있어서 top:-1px(4-3), left:-10px(13-3)이 곧 타일 모서리에서 3px다. 예전 값(-4/-13)은 타일 밖으로 나가서 스크롤 영역에 잘려 있었다. */ top: -1px; left: -10px; display: flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 50%; background: #fff; border: 1px solid var(--c-line-strong); z-index: 1; }
.moayo-favbar-pin-badge img { width: 18px !important; height: 18px !important; object-fit: contain !important; }
/* 제목 - 캡쳐처럼 반투명 검은 띠 위에 흰 글자로. 모서리는 0이다(2026-09-05 "배경에 라운드는
   넣을 필요 없어") - 참고 화면의 상단바 제목 띠가 각진 사각이고, 그림 타일에서는 띠가
   그림 위에 얹히므로 모서리가 둥글면 그 틈으로 그림이 비쳐 지저분해진다.
   (2026-09-05 토큰 정리 때 이 값을 2px -> --r-xs(5px)로 바꿨던 건 되돌린 것이다 - 여기는
   직접 지정받은 값이라 스케일을 따르지 않는다.) 높이를 고정해 두면 타일 높이가 제목 길이와
   무관하게 일정해서 상단바 전체 높이가 흔들리지 않는다. */
.moayo-favbar-label { width: calc(100% - 2px); height: 18px; margin: auto 1px 0; line-height: 18px; padding: 0 6px; box-sizing: border-box; background: rgba(0, 0, 0, .62); color: #fff; border-radius: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: center; font-size: .66rem; font-weight: 600; }

/* 마우스오버(터치 기기는 moayo-app.js가 탭으로 .is-open을 붙임) - 고정하기/삭제하기/상세보기/
   링크바로가기 4개 아이콘. 타일 전체를 덮는 오버레이, 평소엔 안 보이다가 열렸을 때만 나타난다. */
.moayo-favbar-actions {
  position: absolute;
  /* 타일 전체(제목 띠까지)를 반투명 흰색으로 덮는다(2026-09-04, 캡쳐 재대조) - 처음엔 제목 띠를
     비워뒀는데, 실제 캡쳐는 제목까지 덮고 그 아래 내용이 살짝 비쳐 보이는 형태였다. */
  inset: 0;
  display: grid;
  grid-template-columns: 1fr 1fr;
  /* 2026-09-05 요청으로 여백/모서리를 전부 없애 타일을 빈틈없이 꽉 채운다(그전엔 padding/gap
     2px + 둥근 모서리라 네 귀퉁이와 가장자리로 뒤쪽 타일이 비쳐 보였다). 흰색 대신 어두운
     반투명이라 위에 얹힌 아이콘은 그대로 또렷하게 보인다. */
  gap: 0;
  padding: 0;
  border-radius: 0;
  background: rgba(24, 24, 27, .72);
  border: none;
  /* 고정 배지(.moayo-favbar-pin-badge, z-index:1)보다 위에 있어야 마우스오버 때 배지까지 함께
     덮인다(2026-09-04 요청) - 그전엔 배지만 오버레이 위로 튀어나와 보였다. */
  z-index: 2;
  opacity: 0;
  pointer-events: none;
  transition: opacity .12s ease;
}
.moayo-favbar-item:hover .moayo-favbar-actions,
.moayo-favbar-item:focus-within .moayo-favbar-actions,
.moayo-favbar-item.is-open .moayo-favbar-actions { opacity: 1; pointer-events: auto; }
.moayo-favbar-action { display: flex; align-items: center; justify-content: center; border: none; background: none; border-radius: 0; cursor: pointer; }
.moayo-favbar-action:hover { background: rgba(255, 255, 255, .18); }
/* 어두운 오버레이 위에 얹히므로 아이콘을 흰색으로 강제한다 - brightness(0)로 일단 검게 만든 뒤
   invert(1)로 뒤집으면 원본 색이 무엇이든 순백이 된다. */
.moayo-favbar-action img { width: 36px; height: 36px; filter: brightness(0) invert(1); } /* 15 -> 22 -> 33px(2026-09-04) -> 20 -> 30 -> 36px(2026-09-05 "여백 다 없애줘" - 40x40 칸을 거의 채우게) */
/* 고정된 상태 표시(2026-08-31 요청) - 카드 액션과 같은 방식으로 2026-09-04에 바꿨다: 진한 배경 +
   흰 아이콘(invert) 대신 "아이콘 자체에 색"(pin-active.svg, 파랑). 배경은 평소와 같게 둔다. */
.moayo-favbar-action.is-active { background: none; }
.moayo-favbar-action.is-active:hover { background: rgba(255, 255, 255, .18); }
/* 고정된 상태만 흰색으로 덮지 않고 아이콘 자체 색(파랑)을 그대로 보여준다. */
.moayo-favbar-action.is-active img { filter: none; }

/* 상세페이지 "공유하기"(2026-08-31 요청, 버튼만 - 실제 동작은 아직 미작업, show.php 주석
   참고) - 신고하기/의견달기와 같은 <details> 아코디언 패턴을 그대로 재사용한다. */
.moayo-show-share { margin: 1rem 0; }
.moayo-show-share-options { display: flex; gap: .5rem; margin-top: .75rem; }

/* 상세페이지 팝업 "신고하기/의견달기"(2026-08-31 요청) - <details>로 접었다 펼치는 것 하나만
   추가하면 되는 정도라 별도 커스텀 모달 없이 네이티브 요소를 쓴다(SPA풍 오버레이 컨벤션은 여러
   레이어가 겹치는 화면에만 필요, 여기는 그 정도 복잡도가 아님). */
.moayo-show-report { margin: 1rem 0; }
.moayo-show-report-form { margin-top: .75rem; max-width: 360px; }
/* 댓글 하나하나를 카드로(2026-08-31 "세련되게" 요청) - 예전엔 구분선만 있는 밋밋한 리스트였다. */

/* 비공개 표시(2026-08-31, "비공개는 나만 볼수 있는건데" 요청) - CLAUDE.md 무채색 원칙을 따라
   레거시(빨간 글씨)와 다르게 진회색 뱃지로 표시한다(삭제 버튼이 아니라 상태 표시라 빨간색
   예외 대상이 아님). */

/* 글쓰기/수정 폼 - 다중 파일 선택 미리보기(2026-08-31, "선택하면 자동으로 썸네일 나와지고
   드래그로 순서변경, 삭제" 요청) + 수정 화면의 기존 첨부 타일(같은 요청 후속 - "수정하기 누르면
   왜 이미지를 수정할수 없지 해당 이미지도 나와져야지")도 같은 타일 스타일을 공유한다. */
.moayo-file-picker-preview {
  display: flex;
  flex-wrap: wrap;
  gap: .6rem;
  margin: .6rem 0;
}
.moayo-file-picker-tile {
  position: relative;
  width: 96px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .3rem;
  padding: .4rem;
  background: #fff;
  border: 1px solid var(--c-line);
  border-radius: var(--r-md);
  box-shadow: var(--sh-1);
  cursor: grab;
  transition: box-shadow .12s ease, transform .12s ease, border-color .12s ease;
}
.moayo-file-picker-tile:active { cursor: grabbing; }
/* 드래그 중인 타일 자체 - "집어 든" 느낌이 나게 살짝 기울이고 그림자를 키운다(전엔 옅어지기만
   해서 "움직이고 있다"는 게 잘 안 느껴진다는 피드백으로 강화, 2026-08-31). */
.moayo-file-picker-tile.is-dragging {
  opacity: .55;
  transform: scale(.94) rotate(-2deg);
  box-shadow: var(--sh-3);
  z-index: 1;
}
.moayo-file-picker-tile-thumb {
  width: 80px;
  height: 80px;
  border-radius: var(--r-sm);
  overflow: hidden;
  background: var(--c-subtle);
  display: flex;
  align-items: center;
  justify-content: center;
}
.moayo-file-picker-tile-thumb img { width: 100%; height: 100%; object-fit: scale-down; } /* 원본보다 크게 늘리지 않는다(2026-09-05) */
.moayo-file-picker-tile-icon { font-size: 1.6rem; }
.moayo-file-picker-tile-name {
  width: 100%;
  font-size: var(--fs-xs);
  color: var(--c-muted);
  text-align: center;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* 첨부파일 목록의 맨 앞(대표 이미지/카드 썸네일로 쓰임)에 붙는 표시(2026-08-31, "대표이미지는
   가장 앞에 있는걸로" 요청) - 별도 필드가 아니라 순서로만 정해지므로 뱃지 하나로 충분하다. */
.moayo-file-picker-tile-badge {
  font-size: .62rem;
  font-weight: 700;
  color: #fff;
  background: var(--c-ink);
  border-radius: var(--r-pill);
  padding: .1rem .5rem;
}
.moayo-file-picker-tile-remove {
  position: absolute;
  top: -6px;
  right: -6px;
  width: 20px;
  height: 20px;
  line-height: 18px;
  padding: 0;
  border: 1px solid var(--c-line-strong);
  border-radius: 50%;
  background: var(--c-ink);
  color: #fff;
  font-size: var(--fs-md);
  cursor: pointer;
}
.moayo-file-picker-tile-remove:hover { background: #d1364a; }
/* 기존 첨부와 새로 고른 파일을 완전히 하나의 목록으로 다루게 되면서(2026-08-31, "파일첨부에서
   올려진것 중에 첫번째것이 대표 이미지가 되는거야... 나누어 관리하는게 아니야" 요청) 둘을
   시각적으로 구분하던 규칙(.moayo-file-picker-existing)은 더 이상 안 쓴다 - 지금은 종류에
   상관없이 전부 같은 .moayo-file-picker-tile 스타일 그대로 보인다. */

/* 공용 확인/알림 모달 본문(2026-08-31, "uiconfirm 창에 있는 텍스트 가독성 좋게 줄바꿈해줘"
   요청) - _confirm_modal.php의 renderMessage()가 문장 단위로 <br>을 넣어 여러 줄로 쪼개는데,
   줄 사이 간격이 기본값(1)이면 답답해 보여서 살짝 넓힌다. */
#uiConfirmModalBody { line-height: 1.6; }

/* 푸터(2026-09-04) - 목록/상세 끝에서 페이지가 그냥 끊기던 걸 마무리한다. */
/* 푸터는 좌측 메뉴 바로 아래(2026-09-15 요청) - 예전엔 margin-top:auto로 사이드바 바닥에 붙였는데, 메뉴가 긴 화면에서
   바닥에 떨어져 있다가 스크롤하면 사라지는 것처럼 보였다. 이제 마지막 메뉴(카테고리) 뒤에 이어 붙어 메뉴와 함께 스크롤된다.
   글자 크기는 사이드바 폭(240px)에 맞춰 작게. */
.moayo-footer { margin: var(--sp-4) 0 0; padding: 16px .8rem 8px; border-top: 1px solid var(--c-line); color: var(--c-muted); font-size: var(--fs-xs); }
.moayo-footer p { margin: 0 0 .25rem; }
.moayo-footer-brand { font-weight: 800; color: var(--c-text); font-size: var(--fs-md); }
.moayo-footer-copy { margin-top: .6rem; color: var(--c-faint); }

/* <details>로 만든 공유하기/신고하기(2026-09-04) - <summary>에 버튼 클래스를 붙여놨더니 브라우저
   기본 삼각형 마커가 버튼 안에 같이 그려져서 어색했다. 마커만 없애고 버튼 모양은 그대로 둔다. */
.moayo-show-share summary, .moayo-show-report summary { list-style: none; display: inline-flex; align-items: center; cursor: pointer; }
.moayo-show-share summary::-webkit-details-marker, .moayo-show-report summary::-webkit-details-marker { display: none; }

/* 무한 스크롤 로딩 표시(2026-09-04) - 다음 20개를 불러오는 동안 아무 표시가 없어서 목록이
   끝난 건지 불러오는 중인지 알 수 없었다. moayo-app.js가 이 요소를 넣고 보였다 감춘다. */
.moayo-scroll-loading { display: none; justify-content: center; padding: 1.5rem 0; }
.moayo-scroll-loading.is-active { display: flex; }
.moayo-scroll-spinner { width: 22px; height: 22px; border: 2px solid var(--c-line-strong); border-top-color: var(--c-ink); border-radius: 50%; animation: moayo-spin .7s linear infinite; }
@keyframes moayo-spin { to { transform: rotate(360deg); } }

/* 키보드 포커스 표시(2026-09-04) - 확인해보니 :focus 스타일이 input/select에만 있어서 탭으로
   이동하면 지금 어디에 있는지 화면에 전혀 안 나왔다. 마우스 클릭에는 안 뜨고 키보드 이동에만
   뜨는 :focus-visible로 공통 규칙 하나만 둔다. */
a:focus-visible,
button:focus-visible,
summary:focus-visible,
[tabindex]:focus-visible {
  outline: 2px solid var(--c-ink);
  outline-offset: 2px;
  border-radius: var(--r-sm);
}

/* 헤더 검색창(2026-09-04) - 아이콘을 눌러 전체화면 오버레이를 여는 대신 헤더에서 바로 검색한다
   (디렉토리 사이트의 표준 배치).
   2026-09-05: 767px 이하에서 검색창을 통째로 숨기고 돋보기+오버레이로 바꾸던 걸 없앴다("창이
   작아진 경우에 사라지는 게 아니고 줄어들게" 요청) - 창이 좁아지면 검색창이 사라지는 게 아니라
   폭만 줄어든다. flex: 1 1 auto + min-width로 줄어들 수 있게 하고(min-width를 0으로 안 풀면
   input의 기본 최소 폭 때문에 헤더가 밀려 넘친다), 좌측 블록(.moayo-pc-header-lead)은
   flex: 0 0 auto라 줄지 않으므로 남는 폭을 검색창이 흡수한다. */
.moayo-header-search { position: relative; display: flex; align-items: center; flex: 1 1 auto; min-width: 60px; max-width: 420px; margin-right: 8px; }
.moayo-header-search input { width: 100%; min-width: 0; height: var(--control-h); padding: 0 2.6rem 0 .9rem; border: 1px solid var(--c-line); border-radius: var(--r-xs); background: var(--c-subtle); font-size: var(--fs-md); color: var(--c-text); }
.moayo-header-search input:focus { outline: 0; border-color: var(--c-line-strong); background: var(--c-surface); box-shadow: 0 0 0 3px rgba(24, 24, 27, .06); }
/* 입력칸 안쪽에 옅은 배경, 돋보기(제출 버튼)는 오른쪽 끝(2026-09-04 요청, 참고 이미지 기준) */
.moayo-header-search-btn { position: absolute; right: 4px; top: 50%; transform: translateY(-50%); display: flex; align-items: center; justify-content: center; width: 30px; height: 30px; padding: 0; border: none; border-radius: var(--r-xs); background: none; cursor: pointer; }
.moayo-header-search-btn:hover { background: var(--c-subtle-hover); }
.moayo-header-search-btn img { width: 17px; height: 17px; opacity: .55; }
/* 검색창이 항상 그 자리에 있으므로 오버레이를 여는 돋보기 아이콘 버튼은 어느 폭에서도 안 쓴다. */
.moayo-topbar-icon-btn[data-overlay-open="search"] { display: none; }
/* 좁은 화면에서는 브랜드 블록도 같이 줄어들 수 있게 둔다 - 사이트명이 길면 검색창이 밀려
   헤더 밖으로 넘어가기 때문(브랜드는 overflow:hidden으로 잘린다). */
@media (max-width: 767px) { .moayo-pc-header-lead { flex: 0 1 auto; min-width: 0; } }
.moayo-header-login { display: inline-flex; align-items: center; height: var(--control-h); padding: 0 1rem; border-radius: var(--r-pill); background: var(--c-ink); color: #fff; font-size: var(--fs-md); font-weight: 700; text-decoration: none; }
.moayo-header-login:hover { background: #000; }

/* 헤더 로고(2026-09-04) - 환경설정에 site_logo/site_logo_mobile 필드가 있는데 화면에서 쓰지
   않고 텍스트 브랜드만 나오고 있었다. 값이 있을 때만 이미지로 바꿔 보여준다.
   2026-09-14 QA: 모바일 폭에서 헤더 내부 공간이 모자라면 옆의 .moayo-sidebar-toggle(flex:0 0
   auto)은 줄지 않고 .moayo-pc-header-brand만 flex-shrink 기본값(1)으로 줄어드는데, brand는
   overflow:hidden이라 flex item의 자동 최소폭이 0이 돼서 로고 정사각형 이미지가 6px대 얇은
   조각으로 찌그러져 사실상 안 보이는 문제가 있었다(예전엔 이 자리가 텍스트 브랜드라 잘려도
   글자가 남았지만 이미지는 그렇지 않음). 로고도 햄버거 버튼처럼 안 줄어들게 고정한다. */
/* 높이 28px 고정을 뺐다(2026-09-15, "이미지가 불필요하게 작아 강제로 줄인 것 같은데") - PC 로고(170x60)가 79x28로
   줄어 있었다. 원본 크기 그대로 두고, 헤더보다 큰 로고를 올렸을 때만 헤더 높이에 맞춰 줄인다. */
.moayo-pc-header-logo { display: block; width: auto; height: auto; max-height: var(--header-h); }
.moayo-pc-header-brand { flex-shrink: 0; }
.moayo-pc-header-logo--mobile { display: none; }
@media (max-width: 767px) {
  /* 모바일 로고(120x120, 고해상도용 정사각형)는 헤더 높이(60px)를 꽉 채우면 검색창에 붙어 답답했다 - 옆의 햄버거/검색창과
     같은 컨트롤 높이에 맞춘다(원본이 2배 크기라 줄여도 흐려지지 않는다). */
  .moayo-pc-header-logo--mobile { display: block; max-height: var(--control-h); }
  .moayo-pc-header-logo--pc.has-mobile { display: none; }
}

/* 사이드바 태그는 칩으로(2026-09-04) - 20개를 한 줄에 하나씩 세로로 쌓으니 사이드바가 화면보다
   길어졌다. 칩으로 흘려 담으면 같은 개수가 1/3 높이에 들어간다. */
/* 사이드바 아코디언 섹션(인기 태그 / 카테고리, 2026-09-04) - 제목 줄을 눌러 접고 편다.
   기본 삼각형 마커는 지우고 오른쪽에 직접 그린 화살표를 쓴다(열리면 180도 회전). */
.moayo-sidebar-section { border-top: 1px solid var(--c-line); margin-top: 8px; padding-top: 8px; }
.moayo-sidebar-section-title {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: .5rem .8rem;
  border-radius: var(--r-md);
  color: var(--c-text-soft);
  font-size: var(--fs-md);
  font-weight: 700;
  cursor: pointer;
  list-style: none;
  transition: background-color .15s, color .15s;
}
.moayo-sidebar-section-title::-webkit-details-marker { display: none; }
.moayo-sidebar-section-title:hover { background: var(--c-subtle); color: var(--c-ink); }
.moayo-sidebar-section-title::after {
  content: "";
  width: 8px;
  height: 8px;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: rotate(45deg) translate(-2px, -2px);
  transition: transform .15s;
}
.moayo-sidebar-section[open] > .moayo-sidebar-section-title::after { transform: rotate(-135deg) translate(-2px, -2px); }

/* 태그 칩을 흘려 담는 자리(2026-09-04) - 칩의 좌우 안쪽 여백(.6rem)만큼 컨테이너 패딩을 줄여서,
   첫 칩의 "글자" 시작선이 위/아래 메뉴 항목의 글자 시작선과 정확히 맞게 한다. */
.moayo-sidebar-tags { display: flex; flex-wrap: wrap; gap: 6px; padding: 4px .2rem 8px; }


/* 애니메이션 최소화 설정을 켠 사용자(2026-09-04) - 확대/그림자 전환 등을 모두 끈다. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}

/* 모바일 목록 오버라이드 - 반드시 위 .moayo-site-card* 기본 규칙들보다 "아래"에 둬야 한다.
   같은 specificity는 media query 유무가 아니라 등장 순서로 갈리기 때문에, 위쪽에 두면 뒤에 오는
   기본 규칙(white-space:nowrap 등)이 그대로 이겨버린다(2026-08-18 하단바에서 겪은 것과 같은
   함정 - 이 파일 위쪽 "데스크톱 오버라이드" 주석 참고). */
/* 모바일은 2열(2026-09-04) - minmax(250px)로는 390px 화면에서 1열이 돼서 카드 하나가 화면을
   가득 채우고 스크롤만 길어졌다. 좁은 화면에서는 열 개수를 직접 지정한다. */
@media (max-width: 639px) {
  /* 좁은 화면에서는 카드가 세로(위 이미지 / 아래 텍스트)가 아니라 가로 한 줄(왼쪽 이미지 /
     오른쪽 텍스트)로 바뀐다(2026-09-04 요청, 레거시 화면 기준) - 한 화면에 더 많이 들어오고
     제목/설명을 읽기도 쉽다. 2열 그리드도 1열로 되돌린다. */
  .moayo-site-grid { grid-template-columns: minmax(0, 1fr); gap: .6rem; }
  .moayo-site-card { flex-direction: row; align-items: stretch; gap: 12px; padding: 10px; }
  .moayo-site-card__thumb { flex: 0 0 130px; width: 130px; aspect-ratio: 1 / 1; margin-bottom: 0; }
  /* 아이콘/첫글자 타일도 이 레이아웃에서는 같은 정사각형으로 맞춘다(세로 카드에서 쓰던
     2:1 비율을 그대로 두면 왼쪽 칸 높이가 텍스트와 안 맞는다). */
  .moayo-site-card__thumb.is-icon,
  .moayo-site-card__thumb.is-fallback { aspect-ratio: 1 / 1; }
  /* 130px 정사각형 칸이라 제목 글자를 한 단계 줄인다. 위아래를 겹친 버튼(top .35rem, 30px)만큼 똑같이 비워 정중앙에 두면 남는 높이가 2줄분이다. */
  .moayo-site-card__thumb-fallback { padding: calc(.35rem + 30px) var(--sp-2); }
  .moayo-site-card__thumb-fallback-text { font-size: var(--fs-md); -webkit-line-clamp: 2; }
  .moayo-site-card-link { flex: 1 1 auto; min-width: 0; }
  /* 130px 폭 안에 겹쳐 놓이는 버튼들이라 데스크톱(40px)보다 작게 - 안 그러면 썸네일을 거의
     다 가리고, 넘치는 부분은 .moayo-site-card__thumb의 overflow:hidden에 잘려버린다. */
  .moayo-site-card__globe,
  .moayo-site-card__action { width: 30px; min-width: 30px; height: 30px; }
  .moayo-site-card__globe { top: .35rem; left: .35rem; }
  .moayo-site-card__actions { top: .35rem; right: .35rem; gap: .2rem; }
  .moayo-site-card__globe img,
  .moayo-site-card__action img { width: var(--ic-sm); height: var(--ic-sm); }
  .moayo-site-card__action-count { font-size: var(--fs-xs); }
  /* 좁은 화면에서 1줄 말줄임은 대부분의 제목이 잘려서 2줄까지 허용한다. */
  .moayo-site-card__title { font-size: var(--fs-md); white-space: normal; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }
}

/* ---- 2026-09-04 상세페이지 정돈 ---- */

/* 대표 이미지가 없는 레코드의 상단 자리(목록 카드의 첫 글자 타일과 같은 모양) */
/* 높이는 고정 - 비율(3/1)로 두니 폭이 넓은 화면에서 회색 띠가 273px까지 커져서 오히려 더
   허전해 보였다(2026-09-04). 배너처럼 얇게 둔다. */

/* 태그 칩 - 사이드바(.moayo-sidebar-tags 안)와 상세페이지가 같은 클래스를 쓴다(2026-09-04에
   두 곳의 모양이 달라서 하나로 합쳤다). */
/* 칩은 사이드바·상세·등록 폼에서 같은 모양이어야 한다(2026-09-05) - 26px/패딩 .6rem,
   28px/패딩 5px 12px, 패딩 6px 14px로 화면마다 달랐다. 높이 28px + 좌우 12px로 통일. */
.moayo-chip { display: inline-flex; align-items: center; height: 28px; padding: 0 var(--sp-3); border-radius: var(--r-pill); background: var(--c-subtle); color: var(--c-text-soft); font-size: var(--fs-sm); font-weight: 600; text-decoration: none; transition: background-color .15s, color .15s; }
.moayo-chip:hover { background: var(--c-subtle-hover); color: var(--c-ink); }
.moayo-chip.is-active { background: var(--c-point); color: #fff; }
.moayo-chip-row { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 20px; }

/* 섹션 구분(의견 / 비슷한 사이트) - 여백만으로는 경계가 흐렸다. */
/* 섹션을 카드로 감싼다(2026-09-05, "뭐가 뭔지 구분이 잘 안 가" + "그 부분도 카드로 해서
   구분해줘야지") - 그전에는 위쪽 구분선 한 줄뿐이라 소개·첨부·태그·의견이 한 덩어리로 흘렀다.
   핵심 카드와 같은 재질(흰 배경 + 옅은 테두리 + 같은 모서리)이라 페이지 전체가 카드 묶음으로
   읽힌다. */
.moayo-show-section { margin: 0 0 var(--sp-4); padding: var(--sp-5); background: var(--c-surface); border: 1px solid var(--c-line); border-radius: var(--r-lg); box-shadow: var(--sh-1); }
.moayo-show-section > .title { margin-bottom: 16px; }
/* 안에 든 게 이미 카드인 섹션(비슷한 사이트)은 카드로 감싸지 않는다 - 흰 카드 안 흰 카드가 되면
   경계가 오히려 흐려진다. */
.moayo-show-section.is-plain { padding: 0; background: transparent; border: 0; box-shadow: none; }

/* 비슷한 사이트 - 가로 스크롤 줄(카드 크기를 목록과 같게 유지) */
/* 비슷한 사이트는 .moayo-site-grid(목록과 같은 그리드)로 아래로 쌓는다(2026-09-15) - 예전 가로 스크롤(flex 250px)은
   긴 URL 같은 끊기지 않는 글자가 든 카드만 폭이 늘어나 혼자 커 보였다. */

/* 맨 아래 신고하기 - 본문 흐름에서 빼서 작은 링크로 */
.moayo-show-footer-actions { margin-top: 32px; padding-top: 20px; border-top: 1px solid var(--c-line); }
.moayo-show-footer-actions .moayo-show-report summary,
.moayo-show-footer-actions .button.is-light { background: none; border: none; padding: 0; color: var(--c-muted); font-size: var(--fs-sm); text-decoration: underline; }
.moayo-show-comment-guide { font-size: var(--fs-md); color: var(--c-muted); margin: 0 0 20px; }
.moayo-show-comment-guide a { font-weight: 700; text-decoration: underline; }

/* 목록 끝 표시 + 맨 위로 버튼(2026-09-04) - 무한 스크롤이 끝났는지 알 수 없고, 한참 내려간 뒤
   위로 돌아갈 방법이 스크롤뿐이었다. 둘 다 moayo-app.js가 만들어 붙인다. */
.moayo-list-end { margin: 24px 0 0; font-size: var(--fs-md); color: var(--c-faint); }
.moayo-to-top {
  position: fixed;
  right: var(--gutter);
  bottom: calc(var(--bottombar-h) + var(--gutter)); /* 모바일 하단바 위 */
  z-index: var(--z-float);
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border: 1px solid var(--c-line);
  border-radius: 50%;
  background: var(--c-surface);
  color: var(--c-ink);
  font-size: var(--fs-title);
  cursor: pointer;
  opacity: 0;
  pointer-events: none;
  transform: translateY(6px);
  transition: opacity .15s, transform .15s;
  box-shadow: var(--sh-2);
}
.moayo-to-top.is-visible { opacity: 1; pointer-events: auto; transform: none; }
@media (min-width: 768px) { .moayo-to-top { bottom: var(--gutter); } }

/* 대표 이미지 밴드(2026-09-04) - 원본이 큰 스크린샷이면 밴드는 없는 것처럼 이미지가 그대로 꽉
   차고, 작은 파비콘이면(.is-icon, moayo-app.js가 부모에 붙임) 옅은 배경 위에 흰 칩으로 놓인다.
   그전엔 아이콘 하나가 빈 공간에 떠 있는 것처럼 보였다. */

