# 업데이트 이력
## v1.11.45
- 관리자 미디어 화면의 그리드 카드 목록 렌더링을 `AdminMediaGrid` 컴포넌트로 분리.
- 미디어 카드 썸네일·선택 체크·사용처 개수·상태 배지·영상 썸네일 표시 책임을 하위 컴포넌트로 이동.
- 미디어 화면은 목록 데이터 계산과 선택·드래그·상세 열기·이미지 fallback 이벤트 연결만 담당하도록 정리.
## v1.11.44
- 관리자 미디어 화면의 폴더 사이드바 렌더링을 `AdminMediaFolderPanel` 컴포넌트로 분리.
- 라이브러리 폴더 트리와 대표·본문·프로필 이미지 탭 안내 패널 표시 책임을 하위 컴포넌트로 이동.
- 미디어 화면은 폴더 목록 계산·선택·드롭·삭제·생성 액션 연결만 담당하도록 정리.
## v1.11.43
- 관리자 게시물 폼의 우측 설정 패널 렌더링을 `AdminPostSettingsSidebar` 컴포넌트로 분리.
- Post URL·상태·발행 시각·요약·태그·노출 토글·작성 통계·삭제 버튼 표시 책임을 하위 컴포넌트로 이동.
- 게시물 폼은 설정 패널 상태와 태그 입력 ref·블록 패널 이벤트 연결만 담당하도록 정리.
## v1.11.42
- 관리자 게시물 폼의 발행·예약·발행취소 상태 판별과 모달 상태를 `useAdminPostPublishState` composable로 분리.
- 발행 시각 datetime-local 변환·예약 날짜 입력·발행취소 표시 문구 계산을 한 경로로 정리.
- 게시물 저장 payload 생성은 폼에 유지하면서 발행 상태 관리 책임을 축소.
## v1.11.41
- 관리자 게시물 폼의 대표 이미지 선택·검색·페이지네이션·업로드 로직을 `useAdminFeaturedImagePicker` composable로 분리.
- 대표 이미지 모달 상태와 미디어 API 조회 흐름을 게시물 폼 외부에서 관리하도록 정리.
- 글쓰기 폼의 스크립트 책임을 줄이고 대표 이미지 선택 UI 연결만 남김.
## v1.11.40
- 관리자 게시물 폼의 태그 파싱·추천·선택·삭제 로직을 `useAdminPostTags` composable로 분리.
- 태그 입력 상태·키보드 처리·추천 목록 메타 계산을 게시물 폼 외부에서 관리하도록 정리.
- 태그 입력 동작은 유지하면서 글쓰기 폼의 스크립트 책임을 축소.
## v1.11.39
- 어나운스 바 설정 정규화·스냅샷 복사·변경 비교 로직을 `lib/admin-announcement-settings-section.js`로 분리.
- 설정 화면의 어나운스 바 편집 시작·취소·저장 로직을 공통 helper 기반으로 정리.
- 설정 저장 payload의 어나운스 바 설정 필드 정규화를 한 경로로 통합.
## v1.11.38
- 브랜드 설정 정규화·스냅샷 복사·변경 비교 로직을 `lib/admin-brand-settings-section.js`로 분리.
- 설정 화면의 브랜드 컬러 입력 정규화와 편집 시작·취소·저장 로직을 공통 helper 기반으로 정리.
- 설정 저장 payload의 브랜드 설정 필드 정규화를 한 경로로 통합.
## v1.11.37
- 스팸 필터 설정 정규화·스냅샷 복사·변경 비교 로직을 `lib/admin-spam-settings-section.js`로 분리.
- 설정 화면의 스팸 필터 textarea 변환과 편집 시작·취소·저장 로직을 공통 helper 기반으로 정리.
- 설정 저장 payload의 스팸 필터 필드 정규화를 한 경로로 통합.
## v1.11.36
- SNS 설정 정규화·스냅샷 복사·변경 비교 로직을 `lib/admin-social-settings-section.js`로 분리.
- 설정 화면의 SNS 편집 시작·취소·저장 로직을 공통 SNS 설정 helper 기반으로 정리.
- 설정 저장 payload의 SNS 설정 필드 정규화를 한 경로로 통합.
## v1.11.35
- POST 설정 정규화·스냅샷 복사·변경 비교 로직을 `lib/admin-post-settings-section.js`로 분리.
- 설정 화면의 POST 설정 시작·취소·저장 로직을 공통 POST 설정 helper 기반으로 정리.
- 설정 저장 payload의 POST 설정 필드 정규화를 한 경로로 통합.
## v1.11.34
- 관리자 설정의 블로그 제목·설명 카드에서 POST 설정에 속한 업로드 제한 입력을 제거.
- 업로드 제한 표시·편집 위치를 POST 설정 카드로 단일화.
- 설정 화면에서 블로그 제목·설명 카드로 전달하던 업로드 제한 선택지 props를 제거.
## v1.11.33
- 관리자 설정 내비게이션 검색·필터·스크롤 스파이 상태를 `useAdminSettingsNavigation` composable로 분리.
- 설정 화면의 좌측 내비 구역 정의와 활성 구역 계산 로직을 페이지 컴포넌트에서 제거.
- 설정 화면은 composable에서 받은 상태와 이벤트를 내비게이션 컴포넌트에 연결하도록 정리.
## v1.11.32
- 관리자 설정의 단순 섹션 저장 흐름을 `saveSimpleSettingsSection` 헬퍼로 정리.
- 제목·사이트 정보·메인 화면·사이트 코드·광고 슬롯의 스냅샷 복사·복원·저장 후 편집 종료 반복 로직을 필드 목록 기반으로 통합.
- 설정 화면의 카드 상태 로직을 이후 composable로 분리하기 쉽도록 공통 저장 경로를 정리.
## v1.11.31
- 관리자 설정 좌측 내비게이션을 `AdminSettingsNavigation` 컴포넌트로 분리.
- 설정 검색 입력·검색 결과 목록·모바일 구역 선택 렌더링 책임을 설정 화면에서 하위 컴포넌트로 이동.
- 설정 화면은 검색 상태·활성 구역 계산·스크롤 이동 처리만 담당하도록 정리.
## v1.11.30
- 관리자 설정의 메인 화면 카드를 `AdminHomeCoverSettingsCard` 컴포넌트로 분리.
- 라이트·다크 커버 미리보기·드롭존·파일 선택·오버레이 문구 입력 렌더링 책임을 설정 화면에서 하위 컴포넌트로 이동.
- 설정 화면은 메인 화면 편집 상태·저장 요청·커버 업로드 처리만 담당하도록 정리.
## v1.11.29
- 관리자 설정의 SNS 정보 카드를 `AdminSocialSettingsCard` 컴포넌트로 분리.
- 관리자 설정의 어나운스 바 카드를 `AdminAnnouncementSettingsCard` 컴포넌트로 분리.
- 설정 화면은 SNS·어나운스 바 편집 상태와 저장 요청만 담당하도록 정리.
## v1.11.28
- 관리자 설정의 사이트 정보 카드를 `AdminSiteInfoSettingsCard` 컴포넌트로 분리.
- 로고 미리보기·로고 파일 선택·사이트 URL·저작권 문구 렌더링 책임을 설정 화면에서 하위 컴포넌트로 이동.
- 설정 화면은 사이트 정보 편집 상태·저장 요청·로고 업로드 처리만 담당하도록 정리.
## v1.11.27
- 관리자 설정의 블로그 제목·설명 카드를 `AdminTitleDescriptionSettingsCard` 컴포넌트로 분리.
- 제목·설명 읽기 행, 편집 입력, 공개 화면 미리보기 렌더링 책임을 설정 화면에서 하위 컴포넌트로 이동.
- 설정 화면은 제목·설명 편집 상태·저장 요청·스냅샷 복원만 담당하도록 정리.
## v1.11.26
- 관리자 설정의 POST 설정 카드를 `AdminPostSettingsCard` 컴포넌트로 분리.
- 수정일 표시·태그 최대 개수·공개 목록 표시개수·업로드 제한 렌더링 책임을 설정 화면에서 하위 컴포넌트로 이동.
- 설정 화면은 POST 설정 편집 상태·저장 요청·스냅샷 복원만 담당하도록 정리.
## v1.11.25
- 관리자 설정의 브랜드 컬러 카드를 `AdminBrandSettingsCard` 컴포넌트로 분리.
- 브랜드 컬러 읽기 미리보기·색상 입력·텍스트 입력·예시 배지 렌더링 책임을 설정 화면에서 하위 컴포넌트로 이동.
- 설정 화면은 브랜드 컬러 정규화·편집 상태·저장 요청만 담당하도록 정리.
## v1.11.24
- 관리자 설정의 스팸 필터 카드를 `AdminSpamSettingsCard` 컴포넌트로 분리.
- 가입 금지 닉네임 읽기·편집 textarea·저장 버튼 렌더링 책임을 설정 화면에서 하위 컴포넌트로 이동.
- 설정 화면은 스팸 필터 편집 상태·저장 요청·값 정규화만 담당하도록 정리.
## v1.11.23
- 관리자 설정의 최근 게시물 내보내기 작업 목록을 `AdminPostExportJobList` 컴포넌트로 분리.
- Export 작업 상태·진행도·실패 상세·파일 선택·다운로드 버튼 렌더링 책임을 설정 화면에서 하위 컴포넌트로 이동.
- 설정 화면에서 더 이상 사용하지 않는 Export 파일 용량 포맷 함수를 제거.
## v1.11.22
- 관리자 설정의 게시물 내보내기 요청 카드를 `AdminPostExportRequestCard` 컴포넌트로 분리.
- Export 범위·연도·월·직접 날짜·분할 옵션·요청 버튼 렌더링 책임을 설정 화면에서 하위 컴포넌트로 이동.
- 설정 화면은 Export 요청 body 생성·작업 등록·작업 목록 갱신만 담당하도록 정리.
## v1.11.21
- 관리자 설정의 게시물 가져오기 카드를 `AdminPostImportCard` 컴포넌트로 분리.
- Import ZIP 파일 input·드롭존·작업 센터 버튼·적용 버튼 렌더링 책임을 설정 화면에서 하위 컴포넌트로 이동.
- 설정 화면은 Import 파일 검증·작업 생성 요청·작업 모달 연결만 담당하도록 정리.
## v1.11.20
- 관리자 설정의 사이트 용량 카드를 `AdminBackupSummaryCard` 컴포넌트로 분리.
- 사이트 용량 콘텐츠·파일 용량 포맷팅과 행 계산 책임을 설정 화면에서 하위 컴포넌트로 이동.
- 설정 화면은 사이트 용량 데이터 조회·새로고침 이벤트 연결만 담당하도록 정리.
## v1.11.19
- 관리자 설정의 게시물 가져오기 작업 센터 모달을 `AdminPostImportJobModal` 컴포넌트로 분리.
- Import 작업 상태 라벨·진행률·게시물별 행 렌더링 책임을 설정 화면에서 하위 컴포넌트로 이동.
- 설정 화면은 Import 작업 선택·새로고침·삭제 이벤트 연결만 담당하도록 정리.
## v1.11.18
- 게시물 Import를 단일 요청 처리에서 DB job 기반 백그라운드 작업으로 전환.
- 관리자 설정의 게시물 가져오기에 작업 센터 모달 추가.
- Import 작업 센터에서 게시물별 대기·진행중·완료·스킵·오류 상태와 진행률 표시.
- Import 작업 원본 ZIP을 작업 폴더에 보관하고 완료·실패 작업 삭제 시 함께 제거하도록 추가.
- Import 참조 자산 누락 시 게시물을 생성하지 않고 해당 게시물 행을 오류로 남기도록 수정.
- 서버 시작·주기 확인 시 대기 중이거나 중단된 Import 작업 재개 처리 추가.
- 작업용 `_import-jobs` ZIP 경로가 공개 업로드 라우트에서 제공되지 않도록 차단.
## v1.11.17
- 게시물 Import에서 이미 같은 slug가 있는 게시물은 새 slug로 복제하지 않고 건너뛰도록 수정.
- Import 재시도 시 건너뛴 게시물의 자산은 다시 저장하지 않고, 같은 ZIP 자산 또는 같은 해시의 기존 저장 파일은 재사용하도록 보완.
- 관리자 게시물 가져오기 UI에 진행 중 안내와 가져옴·건너뜀·신규 자산·재사용 자산 결과 요약 추가.
## v1.11.16
- 태그 추천 연속 선택, 관리자 미디어 파생 탭 역할 배지, 단일 이미지 `{size=}` 표시 너비 회귀를 확인하는 Playwright E2E 테스트 추가.
- 단일 이미지 너비 테스트는 공개 게시물 화면과 관리자 글쓰기 미리보기 화면을 함께 검증하도록 구성.
## v1.11.15
- 관리자 설정 화면의 업로드 제한·SNS 아이콘·공개 표시개수·게시물 내보내기 범위 select를 공용 `AdminSelectInput`으로 정리.
- 설정 화면 select 옵션을 `{ value, label }` 구조로 모아 반복 마크업과 chevron SVG 중복 제거.
## v1.11.14
- 관리자 멤버 고급 필터의 필드·조건·상태 선택 입력을 공용 `AdminSelectInput` 기준으로 정리.
- 멤버 필터 필드 변경 시 조건·값 초기화 동작을 유지하면서 select 마크업 중복 제거.
## v1.11.13
- 게시물 Export frontmatter에 대표 이미지 본문 상단 표시 여부(`show_featured_image`) 추가.
- 기존 Export ZIP Import 시 `show_featured_image`가 없어도 기본값 `false`로 게시물을 생성하도록 수정.
## v1.11.12
- 관리자 팝오버 표면 스타일을 공용 `AdminPopoverSurface` 컴포넌트로 분리.
- 글쓰기 태그 추천, 게시글 태그 필터, 페이지 섹션 추천, 멤버 작업 메뉴, 행 더보기 메뉴의 반복 border·shadow·radius 마크업 정리.
## v1.11.11
- 관리자 일반 모달 오버레이·패널을 공용 `AdminModalFrame` 컴포넌트로 분리.
- 미디어 폴더 생성과 네비게이션 생성·페이지 섹션·페이지 순서·추천 사이트 편집 모달의 반복 wrapper 제거.
## v1.11.10
- 관리자 페이지네이션 계산 로직을 `lib/admin-pagination.js` 순수 함수로 분리.
- 관리자 페이지네이션 페이지 보정·ellipsis 계산 단위 테스트 추가.
## v1.11.9
- 관리자 공용 select 입력이 숫자 옵션 값을 보존하도록 보완.
- 관리자 미디어 표시 개수 select를 공용 `AdminSelectInput`으로 교체.
- 관리자 미디어 종류·사용 상태 필터를 공용 `AdminFilterPillGroup` 컴포넌트로 분리.
## v1.11.8
- 관리자 목록 select 입력을 공용 `AdminSelectInput` 컴포넌트로 분리.
- 게시글·페이지 목록의 상태·추천·노출·정렬 필터 select 마크업과 chevron 중복 제거.
## v1.11.7
- 관리자 목록 검색 입력을 공용 `AdminSearchInput` 컴포넌트로 분리.
- 게시글·페이지·미디어·멤버 목록의 검색 입력 마크업과 IME 이벤트 연결 중복 제거.
## v1.11.6
- 관리자 번호형 페이지네이션을 공용 `AdminPagination` 컴포넌트로 분리.
- 게시글 목록과 미디어 목록의 페이지 버튼 계산·렌더링 중복 제거.
## v1.11.5
- 관리자 토스트 표시 마크업을 공용 `AdminToast` 컴포넌트로 분리.
- 관리자 화면별 반복 토스트 클래스와 상태 표시 DOM을 `AdminToast` 사용으로 통일.
## v1.11.4
- 관리자 게시글 목록 행 메뉴를 공용 `AdminRowMoreMenu`와 `useAdminRowMenu` 기준으로 통일.
- 게시글 목록의 중복 행 메뉴 위치 계산·Teleport 렌더링 로직 제거.
## v1.11.3
- v1.11 내부 개선 TODO 추가.
- 현재 코드에서 참조되지 않는 구형 `AdminBlockEditor.vue` 제거.
- 파일-화면 매핑 문서를 현재 구현 기준 표현으로 정리.
- v1.11 내부 개선 TODO에서 구형 블록 에디터 검토 항목 완료 처리.
- 게시글 작성·수정, 페이지 작성·수정, 태그 목록, 사이트 설정 토스트를 공용 `useAdminToast` 기준으로 통일.
## v1.11.2
- 관리자 미디어 `카드 썸네일` 탭 명칭을 `대표 이미지`로 변경.
- 관리자 미디어 파생 탭 전환 중 본문·카드 역할 배지가 잠깐 나타나는 표시 문제 수정.
## v1.11.1
- 관리자 글쓰기 태그 추천 선택 후 남은 후보 목록이 유지되도록 수정.
## v1.11.0
- 블로그 게시용 업데이트 기록 `v1.11` 초안 작성(v1.10 개발 구간 정리).
- 관리 버전을 `1.11.0`으로 올리고 이후 패치는 `1.11.1`부터 진행하도록 기준점 정리.
- v1.10.88까지의 품질·보안·미디어 카탈로그 database 전환 내용을 minor 릴리스로 마감.
- `docs/update-log` v1.0~v1.11을 방문자 체감 중심으로 재작성. 관리자·내부 절차·광고/수익 안내 제거.
- update-log 작성 기준을 `docs/convention.md`에 추가.
- v1.1~v1.11 서두를 `안녕하세요. sori.studio입니다.` 형태로 통일하고 `조금 늦게 정리하는`·`이번 업데이트에서는` 반복 문구를 정리.
- v1.1~v1.11 하단 `한 줄 요약` 제거(서두 요지와 중복).
- update-log 각 버전에 minor(`.0`) 릴리스 날짜 추가.
- update-log 제목을 `sori.studio vX.Y 업데이트 — {짧은 요약}` 형식으로 변경.
## v1.10.88
- Playwright API 통합 테스트 10건과 Chromium E2E 테스트 3건 추가.
- Playwright 실행마다 `_test` 전용 PostgreSQL 컨테이너·볼륨과 임시 업로드 루트를 생성하고 종료 시 제거하도록 격리.
- 테스트 중 게시물 Export worker와 추천 사이트 파비콘 cron을 비활성화하고 Playwright worker를 1개로 고정.
- `test:unit`, `test:api`, `test:e2e`, `verify:ci` 검증 명령 추가 및 로컬 `verify`와 CI 전체 검증 범위 분리.
- CSP를 `base-uri 'self'`, `object-src 'none'`, `frame-ancestors 'self'` 강제 최소 정책과 사용자 코드·광고·외부 미디어 호환 관찰용 Report-Only 정책으로 분리.
- 전체 HTML 문서를 반환하는 `/pages/**`에는 강제 CSP를 적용하지 않고 Report-Only 수집만 유지.
- `/api/csp-report`에 32KB 본문 제한, JSON 계열 Content-Type 검증, 최대 20건 payload 검증, IP 해시 기준 분당 60회 제한 추가.
- CSP 보고에서 문서 URL의 쿼리·fragment와 차단 URL의 경로·쿼리를 제거하고 브라우저 계열·지시어·origin 단위로만 DB 집계.
- `068_csp_violation_aggregates.sql` 마이그레이션으로 CSP 위반 집계 테이블·최근 관찰 인덱스 추가.
- `069_media_catalog.sql` 마이그레이션으로 `media_metadata` 카탈로그 필드·상태·관계, `media_references`, `media_catalog_state` 추가.
- 미디어 목록 조회를 `filesystem` 기본, `shadow` 비교, `database` 전환 모드로 분리하고 준비 미완료·집계 불일치·DB 조회 실패 시 파일시스템 결과로 대체.
- DB 모드에서 탭·폴더·종류·미사용·파일명/사용처 검색·50/100/200개 페이지네이션을 SQL로 처리.
- 업로드·Import·썸네일·아바타·이름 변경·삭제와 게시물·페이지·태그·회원·설정·네비게이션 저장에 미디어 파일·참조 카탈로그 최선 노력 dual-write 적용.
- 파일을 삭제하거나 이동하지 않는 안전 reconcile로 발견 파일 upsert, 콘텐츠 참조 백필, 사라진 파일 `missing` 표시, 파일시스템/DB 개수·용량 준비 상태 집계 추가.
- 관리자 `POST /admin/api/media/reconcile`과 로컬 전용 `npm run media:reconcile:dev` 수동 재동기화 경로 추가.
- 관리자 미디어 화면에 임시 전환 도구(장부 정리·비교 모드·DB 모드) 추가. 전환 완료 후 삭제 예정.
- 임시 전환 도구에 기존 방식(filesystem) 버튼을 추가해 shadow·database와 화면 비교가 가능하게 함.
- 개발 검증 완료 후 임시 전환 UI·`catalog-mode`/`catalog-status` API·런타임 모드 덮어쓰기를 제거.
- 개발(`.env.development`)과 예시(`.env.example`)의 `MEDIA_CATALOG_MODE`를 `database`로 고정. 운영도 reconcile 후 동일하게 고정.
- 기존 방식(filesystem) 사용처 계산에 네비게이션 추천 사이트 파비콘(`cachedFaviconUrl`)을 포함해 DB 모드와 맞춤.
- 사이트 설정 미디어 참조 백필 필드명을 camelCase로 정리해 사용처 라벨이 `favicon_url` 원문으로 나오지 않게 수정.
- 기존 방식이 페이지 대표 이미지를 카드 썸네일 상태로만 판정해 `원본` 배지가 빠지던 문제를 수정.
- DB 모드에서 프로필 `avatarOwner`와 `user.avatarUrl` 참조를 중복 합산하던 사용 개수 배지를 기존 방식과 같게 맞춤.
- 프로필에 연결된 미디어 상세에서도 게시물 본문 등 다른 사용처를 함께 표시.
- multipart 업로드에서 busboy가 UTF-8 한글 파일명을 Latin-1로 오해하던 문제를 복구해 macOS NFD 한글 파일명도 NFC로 저장.
- 개발 DB reconcile에서 파일 124개·77,019,754 bytes와 DB 카탈로그의 개수·용량 차이 0 확인.
- DB 모드에서 레거시 `-body.webp`만 있는 원본을 `hasThumbnail`로 오판해 없는 `body-720`을 그리드에 넣어 이미지가 깨지던 문제 수정.
- 카드·본문 파생 존재 판별을 `card`/`body-1600`/`body-720` URL 기준으로 파일시스템 모드와 맞추고, 그리드 배지를 썸네일 프레임 안으로 고정.
- 파생 미리보기 실패 시 Vue 재렌더에도 원본 URL이 유지되도록 폴백 상태를 항목 URL 기준으로 보관.
- 공유형 요청 제한은 현재 단일 서버 운영 방침에 따라 이번 후속 범위에서 제외.
## v1.10.87
- 관리자 사이트 설정을 카드별 부분 저장 API로 변경해 다른 카드의 미저장 입력 덮어쓰기 방지.
- 초안 이탈 직전 자동 저장 실패·진행 중·저장 불가능 상태에서 화면 이동 차단.
- 페이지 작성·수정 화면에 미저장 변경 이탈 확인 추가.
- 저장 요청 중 추가된 페이지 입력을 저장 완료로 오판하지 않도록 서버 전송 payload 기준점 적용.
- 새 페이지 생성 후 이탈이 보류되어도 다음 저장은 생성된 페이지 수정으로 이어지도록 보완.
- 게시물 `:::html` 블록의 정규식 필터를 허용 태그·속성 기반 HTML parser sanitizer로 교체.
- HTML 블록의 이벤트 속성·실행 URL·script/iframe/SVG/form 계열 요소와 인라인 style 차단.
- 외부 새 창 링크에 `noopener noreferrer` 자동 적용 및 `sanitize-html` 의존성 추가.
- 일반 관리자 다중 업로드를 전체 Buffer 적재에서 임시 디스크 스트리밍 방식으로 변경.
- multipart 수신 중 파일 수·전체 용량·종류별 개별 용량을 제한하고 실패 시 임시·이동 파일 정리.
- 미디어 전체 파일·사용처 스캔에 30초 공유 캐시와 동시 요청 단일 실행 적용.
- 업로드·삭제·이름/폴더 변경·썸네일 재생성 시 미디어 캐시 즉시 무효화.
- Export worker를 서버 시작·30초 주기로 복구하고 PostgreSQL advisory lock으로 다중 인스턴스 중복 실행 차단.
- `croner` 직접 의존성 추가 및 운영 의존성 취약점 0건 재확인.
- 존재하지 않는 `/tag/:slug` 요청이 빈 목록 200 대신 실제 404를 반환하도록 수정.
- 같은 댓글 컴포넌트에서 게시물 slug가 바뀔 때 목록·답글·입력·오류·좋아요 진행 상태 초기화 및 재조회.
- 이전 게시물의 지연된 댓글 응답이 새 게시물 상태를 덮어쓰지 않도록 요청 식별 처리.
- 멤버십 본문 접근 권한과 댓글 조회·작성·좋아요 접근 정책 통일.
- 왼쪽·오른쪽 고정 사이드바의 top·높이를 `--site-top-chrome-height` 기준으로 변경해 어나운스 바 겹침 수정.
- Docker PostgreSQL 호스트 포트를 기본 `127.0.0.1`에만 바인딩하고 `DB_BIND_ADDRESS` 환경 변수 추가.
- 개별 마이그레이션 SQL 실행과 `schema_migrations` 이력 기록을 `psql --single-transaction`으로 원자화.
- Node 내장 테스트 러너 기반 HTML sanitizer·multipart 스트리밍 회귀 테스트 4건 추가.
- `npm run verify`를 문법 검사·회귀 테스트·프로덕션 빌드 순서로 보강.
- 전역 `nosniff`·Referrer Policy·SAMEORIGIN·Permissions Policy와 CSP Report-Only 보안 헤더 추가.
- 공개 통계 pageview·heartbeat에 IP 해시 기준 분당 쓰기 요청 상한 추가.
## v1.10.86
- 게시물 Export ZIP을 전체 Buffer 생성 방식에서 디스크 스트리밍 방식으로 변경.
- Export 자산은 이미지·영상·첨부 파일 원본 바이트를 재압축하지 않고 ZIP store 방식으로 보존.
- 게시물 Import multipart ZIP을 메모리 적재 대신 임시 파일 스트리밍 저장으로 변경.
- Import ZIP 엔트리 수·개별/전체 압축 해제 크기·압축률·Markdown 총량 제한 추가.
- Import 자산을 엔트리별 스트림으로 저장하고 처리 완료 후 임시 ZIP 자동 삭제.
- ZIP 스트리밍용 `archiver`, `unzipper`, `busboy` 직접 의존성 추가.
## v1.10.85
- Nuxt 3.21.9와 전이 의존성 보안 패치 적용 및 운영 의존성 취약점 0건 확인.
- 회원·관리자 세션에 DB 세션 버전 검증을 추가하고 비밀번호 변경 시 기존 세션 무효화.
- 회원·관리자 로그인에 계정·IP 기준 15분 실패 횟수 제한 추가.
- 공개 게시물 목록 API에 기본 표시 개수 상한을 강제하고 응답에서 전체 본문 제외.
- 세션 버전용 `067_users_session_version.sql` 마이그레이션 추가.
- Nuxt 3.21.9 CLI 옵션 해석에 맞춰 로컬 preview host·port 인자를 등호 형식으로 수정.
## v1.10.84
- 블로그 게시용 업데이트 기록 `v1.1`, `v1.2`, `v1.5`, `v1.6`, `v1.10` 초안 작성.
- 각 공지는 직전 개발 구간의 주요 변화를 일반 독자가 이해하기 쉬운 설명으로 정리.
## v1.10.83
- 관리자 대시보드 AdSense 잔고 카드에 지급 계정 통화 기준 안내 추가.
- AdSense 보고서 통화와 지급 잔고 통화의 API 기준 차이 문서화.
## v1.10.82
- 관리자 대시보드 AdSense 영역에서 별도 헤더·갱신 표시 제거.
- AdSense 헤더 제거에 따라 사용하지 않는 갱신 상태와 갱신 시각 표시 로직 정리.
## v1.10.81
- 관리자 대시보드 AdSense 설정 안내 문구 제거.
- AdSense 보고서 응답의 `totals` 행을 우선 읽도록 수정.
- AdSense 요약을 오늘 현재까지·어제·지난 7일·이번 달·최근 28일·잔고 형태로 정리.
- AdSense 금액 표시가 보고서 응답 통화 코드와 소수점 두 자리를 반영하도록 수정.
## v1.10.80
- 관리자 대시보드 상단 요약 아래에 AdSense 요약 카드 추가.
- `/admin/api/adsense/summary` API 추가.
- AdSense refresh token 기반 access token 발급과 오늘·어제·이번 달 보고서 조회 유틸 추가.
- AdSense API 통화 코드 환경 변수 예시 추가.
## v1.10.79
- AdSense Management API refresh token 발급용 `npm run adsense:token` 스크립트 추가.
- AdSense 관리자 대시보드 연동에 필요한 환경 변수 예시와 배포 안내 추가.
## v1.10.78
- 관리자 대시보드 디바이스 통계에서 모바일·PC 집계 행을 `방문자 / 조회 / 비율` 한 줄 요약으로 정리.
- 관리자 대시보드 디바이스 통계의 상위 OS 반복 라벨과 내부 구분선을 제거.
- 관리자 대시보드 디바이스 통계의 상위 기기와 하위 OS 목록을 방문자 수 우선으로 정렬.
## v1.10.77
- 단일 이미지 표시 너비 프리셋에서 720px 제거.
- 단일 이미지 표시 너비 프리셋을 갤러리 2장 1칸(356px), 갤러리 3장 1칸(235px), 갤러리 3장 2칸(477px) 기준으로 정리.
- 단일 이미지 직접 너비 입력 중 최소·최대값으로 즉시 보정되어 숫자 입력이 튀던 문제 수정.
## v1.10.76
- 사용자 뷰어와 라이브모드에서 단일 이미지 `{size=}` 표시 너비가 블록 렌더링에 반영되지 않던 문제 수정.
- 레거시 블록 정규화 시 단일 이미지 픽셀 너비 옵션이 사라지지 않도록 수정.
## v1.10.75
- 단일 이미지 표시 너비에서 직접 입력 선택 시 대표 프리셋 값으로 되돌아가 입력창이 숨던 문제 수정.
## v1.10.74
- 관리자 페이지 목록 상단 레이아웃을 게시글 목록과 같은 검색·필터·정렬·새 페이지 버튼 구조로 정리.
- 관리자 페이지 목록에 홈 표시·추천·필터 적용 표시 개수 요약 추가.
- 관리자 페이지 목록 테이블에 추천 별과 썸네일 열 추가.
- 단일 이미지 오른쪽 설정 패널에 전체 너비·대표 크기·직접 입력 셀렉트 추가.
## v1.10.73
- 게시글 백링크 개수 계산에 페이지 본문 참조 포함.
- 게시글 백링크 모달과 삭제 경고에서 게시물·페이지 참조를 함께 표시하도록 수정.
- 관리자 페이지 목록 검색 추가.
- 라이브 글쓰기 인용 입력 중 `>. ` 접두가 섞이는 경우 저장 직전 `> ` 흐름으로 정리.
- 단일 이미지 오른쪽 설정 패널에 표시 너비 입력 추가.
- 관리자 대시보드 상단 요약의 `오늘 접속자` 라벨을 `오늘 방문자`로 수정하고 누적 방문자 표시 추가.
- 관리자 대시보드 현재 접속자 IP와 열린 페이지 개수 표시를 줄바꿈 처리.
- 관리자 대시보드 디바이스 통계를 모바일·PC 합계 카드와 OS별 세부 방문자 비율로 정리.
## v1.10.72
- 관리자 글 목록 백링크 개수를 버튼 박스가 아닌 숫자형 텍스트 액션으로 표시하도록 수정.
- 백링크 모달에서 링크 횟수 문구를 제거하고 게시물 목록 중심으로 정리.
- 백링크 모달 크기를 고정하고 내부 게시물 검색 입력을 추가.
- 백링크 모달 닫기를 사이트 설정 화면과 같은 X 아이콘으로 통일.
- 백링크 모달 이동 액션을 게시물 목록의 공개 보기와 같은 화살표 아이콘으로 축약.
- 관리자 글 목록에서 포커스가 없을 때 `F`뿐 아니라 한글 키보드 `ㄹ` 입력도 검색창 포커스로 처리하도록 수정.
## v1.10.71
- 관리자 글 목록에 백링크 열 추가.
- 백링크 개수를 클릭하면 해당 글을 링크한 게시물 목록 모달을 표시하도록 수정.
- 백링크 모달 항목 오른쪽에 관리자 글 수정 화면 이동 버튼 추가.
- 관리자 글 목록 행 메뉴의 링크 확인 항목 제거.
## v1.10.70
- 관리자 글 목록 행 메뉴에 게시물을 링크하고 있는 게시물 확인 기능 추가.
- 게시물 삭제 전 해당 글을 링크한 게시물이 있으면 확인 메시지에 참조 목록을 표시하도록 수정.
- 관리자 글 목록에서 `F` 키로 검색창에 바로 포커스되도록 수정.
## v1.10.69
- `docs/update-log/` 폴더 추가.
- 블로그 공지용 업데이트 기록 초안 `docs/update-log/v1.0.md` 작성(v0.0~v1.0 회고 포함).
## v1.10.68
- 현재 접속자가 여러 페이지를 열었을 때 대표 페이지와 열린 페이지 목록이 중복 표시되던 문제 수정.
## v1.10.67
- 현재 접속자 목록에서 같은 접속자가 열어둔 페이지 제목 목록을 함께 표시하도록 수정.
- 실시간 접속자 API가 IP/회원 기준 묶음 안의 활성 페이지 목록을 함께 반환하도록 수정.
## v1.10.66
- 현재 접속자 목록에서 SID 표시 제거.
- 현재 접속자 집계를 로그인 사용자는 회원 기준, 익명 방문자는 IP 기준으로 묶어 같은 사람이 여러 페이지를 열어도 1명으로 보이도록 수정.
- 같은 접속자 묶음 안에 여러 페이지가 있으면 `열린 페이지 N개`로 표시하도록 수정.
## v1.10.65
- 관리자 통계 인기 콘텐츠·개별 통계 응답에서 읽음 수가 조회수를 넘지 않도록 정규화.
- 관리자 통계 스크롤 50/75/100 도달 수가 조회수 범위와 단계 순서를 넘지 않도록 정규화.
- 관리자 통계 추이·선택 기간 상세의 50% 스크롤 도달 요약도 게시물 조회수 범위 안으로 정규화.
## v1.10.64
- 관리자 대시보드 인기 콘텐츠 메타에서 `V/R/M` 알파벳만 색상 강조하고 숫자는 보조 텍스트 색상으로 표시하도록 수정.
- `S` 스크롤 메타의 라벨과 50/75/100 값 사이 간격을 명확하게 조정.
## v1.10.63
- 관리자 대시보드 인기 콘텐츠 메타의 `V/R/M` 값을 서로 다른 색상으로 강조.
- 인기 콘텐츠 메타 구분자 `|`를 연한 회색으로 낮춰 보조 구분선처럼 보이도록 수정.
- `S` 스크롤 50/75/100 값을 단계별로 점점 진한 색상으로 표시.
## v1.10.62
- 관리자 대시보드 자동 갱신 시 선택한 통계 날짜·기간이 오늘로 되돌아가던 문제 수정.
- 선택 기간 상세 갱신 중 기존 내용을 유지해 패널 높이 변화로 화면 위치가 흔들리지 않도록 수정.
- 대시보드 선택 기간 상세 레이아웃을 인기 콘텐츠 75%·유입/디바이스 25% 구조로 정리.
- 유입 프로그래스 바 폭을 절반으로 줄여 보조 지표처럼 보이도록 조정.
## v1.10.61
- 관리자 대시보드 선택 기간 상세의 인기 게시물·인기 페이지를 세로 목록으로 정리.
- 선택 기간 인기 콘텐츠 메타를 `V/R/M/C/S` 한 줄 압축 표기로 수정.
- 현재 접속자 목록에 IP와 짧은 세션 ID(SID)를 함께 표시하도록 수정.
- 실시간 접속 세션 IP 저장용 마이그레이션 `066_analytics_active_session_ip.sql` 추가.
## v1.10.60
- 관리자 대시보드 통계 차트 클릭 상세 모달을 제거하고 선택한 기간 상세를 하단 패널에 직접 표시하도록 수정.
- 대시보드 유입 키워드 영역을 제거하고 유입원·디바이스·인기 게시물·인기 페이지를 선택 기간 기준으로 통합 표시.
## v1.10.59
- 글쓰기 이미지/갤러리 미디어 모달 헤더의 선택 개수 문구를 제거해 탭 전환 시 레이아웃 흔들림을 줄임.
- 갤러리 미디어 선택 항목 오른쪽 상단에 선택 순서 배지를 표시하도록 수정.
## v1.10.58
- 글쓰기 중복 슬러그 오류가 표시된 동안 Publish/Update/최종 저장 버튼을 비활성화하도록 수정.
## v1.10.57
- 글쓰기 중복 슬러그 오류를 헤더/토스트 대신 Post URL 입력창 아래 빨간 텍스트로 표시하도록 수정.
## v1.10.56
- 초안 자동 저장이 중복 슬러그 오류로 실패한 뒤 같은 입력값을 반복 재시도해 화면이 깜빡이던 문제 수정.
- 게시글 대표 이미지 선택 모달을 글쓰기 미디어 라이브러리와 같은 서버 페이지네이션·검색 방식으로 수정.
- 대표 이미지 선택 모달 미리보기를 원본 대신 작은 본문/카드 파생 이미지 우선 표시로 정리.
- 글쓰기 미디어 라이브러리와 대표 이미지 선택 모달 높이를 고정해 검색 결과 개수 변화에 따른 모달 크기 흔들림 완화.
## v1.10.55
- 사이트 용량 `기타` 행을 `오디오`·`첨부 파일`로 분리하고 영상·보내기와 동일한 실선 카드로 표시.
## v1.10.54
- 사이트 용량 파일·용량 UI를 이미지 그룹(세로 묶음)·영상/보내기(2열)·기타·합계 순으로 재배치.
- 자동생성·프로필 들여쓰기 제거, 점선 테두리만 유지. 기타는 합계 위 별도 행으로 분리.
## v1.10.53
- 사이트 용량 합계를 이미지·영상·기타·보내기 합산으로 수정(오디오·기타 파일 누락으로 113≠112 불일치 해소).
- 사이트 용량 콘텐츠·파일·용량 UI를 표시개수 설정과 동일한 행 카드 스타일로 통일.
- 이미지 행을 원본·자동생성·프로필 3행으로 분리해 개수·용량을 각각 표시.
## v1.10.52
- 관리자 설정 `백업 현황` 카드를 `사이트 용량`으로 이름 변경.
- 파일·용량 섹션을 이미지·영상·보내기·합계 4행으로 간략화(업로드 미디어·원본·큰 파일 목록 제거).
- 이미지 행에 원본·자동생성·프로필 각각 용량과 개수를 표시.
## v1.10.51
- 관리자 사이트 설정에 백업 현황 카드 추가.
- `/admin/api/settings/backup-summary` 추가: 게시글·페이지·태그·댓글·회원 수와 업로드 미디어·자동 생성 이미지·내보내기 파일 용량 집계.
- 백업 현황에서 큰 업로드 파일 상위 5개를 텍스트 목록으로 표시.
## v1.10.50
- 게시물 상세를 `layouts/post` 대신 `layouts/default`로 통합해 홈↔게시물 이동 시 레이아웃 전체 교체(깜빡임 원인) 제거.
- 전환 베일을 `html::before` CSS로 즉시 표시(Vue 렌더 대기 없음), 내부 링크 클릭 캡처 단계에서 선제 적용.
- 베일 유지 중 `.site-shell` CSS transition 비활성화, 해제 전 48ms 추가 대기로 페인트 완료 후 공개.
- `NuxtLoadingIndicator` 제거(전환 베일과 중복), 스피너만 최상위 z-index로 표시.
## v1.10.49
- 페이지 전환 깜빡임·스크롤 튐을 줄이기 위해 전환 베일 방식을 재정리.
- 오버레이 페이드 제거(`v-show` 즉시 표시/해제), 베일 뒤에서 스크롤 정리 후 화면 공개.
- `history.scrollRestoration = 'manual'`과 `app/router.options.js`로 브라우저 자동 스크롤 복원과 충돌 방지.
- 앞으로 이동은 최상단, 뒤로가기는 저장 위치 복원. `site-page-transition.client.js` 추가.
## v1.10.48
- 페이지 이동 로딩 오버레이 배경을 불투명하게 변경해 이전 홈 헤더 이미지가 비쳐 보이지 않도록 수정.
- 이동 오버레이 해제 시점을 `page:loading:end`에서 `page:finish` 이후 다음 렌더 프레임으로 늦춰 새 화면이 실제로 그려진 뒤 사라지도록 수정.
- 라우터 이동 시작 시에도 오버레이를 즉시 표시하고, 라우트 오류·앱 오류 시에는 즉시 해제하도록 보강.
- 홈에서 게시물로 이동할 때 로딩 뒤 이전 화면 상단이 다시 보이는 문제를 추가 완화.
## v1.10.47
- 게시물 상세 클라이언트 이동을 즉시 전환 방식에서 로딩 후 진입 방식으로 복귀.
- 홈에서 게시물로 이동할 때 이전 홈 헤더 이미지가 순간 노출되는 문제를 피하기 위해 게시물 본문을 블로킹 조회하도록 수정.
- `app/router.options.js`와 `plugins/site-route-scroll.client.js`, 전환 베일 스타일 제거.
- 전역 페이지 이동 로딩 오버레이를 다시 사용해 이전 화면 중간 상태를 가리고 준비된 상세 화면만 표시하도록 정리.
## v1.10.46
- 페이지 이동 시작부터 새 화면 스크롤 정리 완료까지 짧은 전환 베일을 표시하도록 추가.
- 메인에서 게시물로 이동할 때 이전 홈 헤더 이미지가 순간적으로 보이는 현상을 한 번 더 완화.
- 전환 베일은 데이터 로딩 완료를 기다리는 방식이 아니라 화면 교체·스크롤 정리 구간만 가리도록 정리.
## v1.10.45
- 페이지 이동 스크롤 적용 시점을 `router.afterEach` 직후에서 Nuxt `page:finish` 이후로 변경.
- 이전 화면이 먼저 최상단으로 이동하며 헤더 이미지가 잠깐 보이던 현상을 추가 완화.
- 라우트 변경 시점에는 스크롤 요청만 저장하고 새 페이지 렌더링 완료 뒤 한 번만 적용하도록 정리.
## v1.10.44
- Vue Router 기본 스크롤 이동을 비활성화해 페이지 이동 전 이전 화면이 먼저 최상단으로 튀는 현상 완화.
- 클라이언트 라우트 전환 완료 후 새 화면 기준으로 최상단 또는 해시 위치 스크롤을 적용하는 플러그인 추가.
- 게시물 상세 즉시 전환·스켈레톤 방식은 유지하면서 화면 깜빡임 원인인 스크롤 적용 타이밍을 분리.
## v1.10.43
- 사용자 화면 게시물 상세 클라이언트 이동을 즉시 전환 방식으로 변경.
- 게시물 데이터가 준비되기 전에는 이전 화면이 아니라 새 게시물 화면 안의 스켈레톤을 표시하도록 수정.
- 전역 전체 화면 이동 오버레이를 제거하고 `NuxtLoadingIndicator` 상단 진행바만 유지.
- 직접 접속·SSR은 기존처럼 게시물 본문을 먼저 받아 SEO 메타를 유지하도록 정리.
## v1.10.42
- 사용자 화면 페이지 이동 중 전체 로딩 오버레이를 표시해 이전 화면 스크롤 튐이 보이지 않도록 수정.
- 게시물 상세 인접 글 방향을 `PREVIOUS=과거 글`, `NEXT=최신 글` 기준으로 수정.
- 글쓰기 이미지 선택 모달이 전체 미디어 배열 대신 `/admin/api/media?paged=1` 서버 페이지 응답을 사용하도록 수정.
- 이미지 선택 모달에 파일명·사용처 제목 검색과 번호형 페이지 이동을 추가.
## v1.10.41
- 즉시 전환·스켈레톤·커스텀 스크롤 제어를 제거하고 블로킹 로딩 방식으로 복귀.
- 게시물·홈 클라이언트 이동 시 데이터 준비 후 전환(`NuxtLoadingIndicator`·중복 클릭 잠금 유지).
- `app/router.options.js`, `navigation-scroll.client.js`, `usePageReadyGate`, `site-navigation-scroll.js` 삭제.
- 상세 API 인접 글(`previous`/`next`) 최적화는 유지.
## v1.10.40
- 앞으로 이동 후에도 이전 스크롤 위치가 유지되던 문제 수정.
- `scrollBehavior` 비동기 최상단 이동을 제거하고, 앞으로 이동은 `afterEach`에서 `window.scrollTo(0, 0)`로 확실히 초기화.
- 뒤로가기(lazy 홈·게시물)만 복원 좌표를 저장해 본문 준비 후 복원.
## v1.10.39
- 페이지 전환 시 스크롤이 최상단으로 튀며 깜빡이던 현상 완화.
- `app/router.options.js` 추가: 앞으로 이동은 다음 페인트 후 최상단 이동, 뒤로가기는 lazy 홈·게시물 본문 준비 후 스크롤 복원.
- `usePageReadyGate`·`navigation-scroll.client.js`로 lazy 로딩과 스크롤 복원 타이밍 동기화.
- `NuxtPage` 짧은 opacity 전환(0.12s) 추가, 로딩 스켈레톤 `min-h-[70vh]`로 높이 점프 완화.
## v1.10.38
- 게시물·홈 클라이언트 이동을 즉시 전환하도록 변경(`lazy: import.meta.client`). SSR 직접 접속은 기존처럼 블로킹 유지.
- 게시물 상세 로딩 중 스켈레톤 표시, 홈 복귀 시 본문 영역 스켈레톤 표시(히어로는 캐시 설정 즉시 노출).
- 게시물 없음 404는 클라이언트에서 fetch 완료 후 `showError`로 처리.
## v1.10.37
- 게시물 상세 이동 지연 개선: 본문만 블로킹 조회, 태그·광고는 lazy로 전환해 이동 후 채움.
- 이전·다음 글 계산을 위해 받던 전체 게시물(본문 포함) 조회 제거.
- 상세 API가 window 함수(LAG/LEAD)로 인접 글 `previous`·`next`를 계산해 응답에 포함(`getAdjacentPosts` 추가).
- 광고용 `site-settings`를 `app.vue`와 같은 키로 재사용해 중복 요청 제거.
## v1.10.36
- 게시물 카드 보조 피드백 추가: 제목 강조와 함께 썸네일 은은한 확대(데스크톱 hover 기기·모바일 `:active` 눌림).
- 카드 썸네일의 sticky opacity hover 제거, 세 목록(메인·전체·태그) 공통 적용.
- 게시글 댓글 기본 정렬을 인기순에서 최신순으로 변경, 정렬 옵션 순서도 최신순 우선으로 조정.
## v1.10.35
- 게시물 카드 클릭 피드백을 메인·전체 목록·태그 목록에서 제목 포인트 컬러 강조로 통일.
- 전체·태그 목록 카드의 회색 배경 hover 제거(모바일 탭 후 남는 sticky 배경 해소).
- 공통 `.post-title-link` 추가: 데스크톱은 hover 가능 기기에서만 색 변경, 모바일은 `:active` 눌림에만 반영, 회색 탭 하이라이트 제거.
## v1.10.34
- 페이지 이동 중 링크·버튼 중복 클릭(연타) 차단 추가.
- 이동 중 `html.site-navigating` 클래스로 상호작용 요소 pointer-events를 끄는 클라이언트 플러그인 `navigation-lock.client.js` 추가(예외 방지 안전 타임아웃 포함).
- 게시물 클릭 후 재클릭 시 상단으로 점프하던 문제 해결.
## v1.10.33
- HTML 문서 모드 페이지 뒤로가기 시 홈으로 돌아가지 못하던 문제를 근본 수정.
- `/pages/:slug` HTML 문서 페이지로의 클라이언트 소프트 이동을 막고 전체 페이지 이동으로 전환하는 글로벌 미들웨어 `pages-html-document.global.js` 추가.
- 페이지 이동 로딩 피드백을 위해 `app.vue`에 브랜드 컬러 기반 `NuxtLoadingIndicator` 상단 진행바 추가(모바일에서 클릭·뒤로가기 반응 확인 가능).
## v1.10.32
- HTML 문서 모드 페이지 진입 후 뒤로가기 시 주소는 홈이지만 페이지 화면이 남던 문제 수정.
- bfcache 복원 시 라우터 경로와 실제 URL이 어긋나면 새로고침하는 클라이언트 플러그인 `bfcache-page-restore.client.js` 추가.
## v1.10.31
- 헤더 사용자 메뉴의 `Sign up`·`Sign in`을 `회원가입`·`로그인`으로 한글화.
- 헤더 비로그인 표시명 `Guest`를 `방문자`로 한글화.
- 회원가입 안내 문구를 서비스 이용 안내 대신 댓글 작성 목적 중심 문구로 수정.
- 회원가입 제목 표기를 `회원 가입`에서 `회원가입`으로 통일.
## v1.10.30
- 모바일에서 새로고침 시 좌측 사이드바가 열렸다 닫히는 애니메이션 문제 수정.
- `useMenuState`에 `menuMounted` 상태 추가, 모바일은 항상 닫힌 상태로 시작(데스크톱 저장 설정은 보존)하도록 수정.
- 좌측 사이드바 모바일 슬라이드 오버레이·백드롭이 마운트 이후에만 열리도록 게이팅해 첫 페인트 플래시·슬라이드 재생 제거.
## v1.10.29
- 한글 IME 조합 중(`compositionupdate`)에도 검색이 즉시 반영되는 공통 컴포저블 `useImeSearchInput` 추가(NFC 정규화·선택적 디바운스).
- 관리자 글 목록·멤버 목록·미디어 목록·설정 검색·태그 필터·글 목록 태그 필터 콤보박스·글쓰기 미디어 모달 검색을 모두 IME 조합 중 검색되도록 수정.
- 관리자 글 목록 검색 200ms, 미디어 검색 250ms 디바운스 적용.
- 글쓰기 태그 입력·페이지 섹션 콤보박스가 조합 중에도 추천 목록을 갱신하도록 `compositionupdate` 보강(Enter 확정 로직 유지).
- 홈 추천글·페이지 섹션 가로 트랙의 `touch-action: pan-x` 제거로 모바일 세로 스크롤이 막히던 문제 수정.
- 홈 가로 캐러셀 커스텀 드래그를 마우스 전용으로 제한하고, 터치는 네이티브 가로 스크롤·스냅에 맡기도록 수정.
## v1.10.28
- 공개 통합 검색용 `posts.search_text`, `pages.search_text` 컬럼과 `pg_trgm` GIN 인덱스 추가.
- 게시물·페이지 검색 텍스트를 저장/수정 시 DB 트리거로 자동 갱신하도록 추가.
- `/api/search`가 본문 전체 `lower(content)` 스캔 대신 정규화된 검색 컬럼을 기준으로 조회하도록 수정.
- 공개 통합 검색 인덱스 개선 과제를 완료 처리.
## v1.10.27
- 관리자 미디어 사용처 계산이 본문 없는 글 목록 요약 대신 미디어 참조 전용 게시물·페이지 조회를 사용하도록 수정.
- 본문 이미지 탭의 자동 생성 파생 이미지가 실제 본문 사용 중이어도 미사용으로 집계되던 문제 수정.
- 관리자 미디어 상세에서 자동 생성 이미지 파일명 변경 제한과 고아 파생 파일 삭제 용도를 안내하도록 정리.
## v1.10.26
- 관리자 글 목록 전용 상단 고정 플래그(`adminPinned`) 추가.
- 관리자 글 목록 행 메뉴에서 `상단 고정`·`고정 해제`를 토글하도록 추가.
- 관리자 글 목록 정렬에서 고정 글을 항상 먼저 표시하고 제목 옆에 고정 배지를 표시하도록 수정.
## v1.10.25
- 관리자 미디어 원본 이미지 사용처 계산에 카드·페이지 커버·본문 파생 이미지 사용처를 함께 반영하도록 수정.
- 파생 이미지가 본문에서 사용 중인 원본 파일이 미사용으로 분류되어 일괄 삭제 대상에 들어가던 문제 수정.
- 미사용 원본 이미지를 삭제할 때 연결된 카드·페이지 커버·본문 자동 생성 이미지도 함께 삭제되도록 수정.
- 글쓰기 이미지 선택 모달의 라이브러리 그리드가 원본 대신 720px 본문 파생 이미지나 카드 썸네일을 우선 표시하도록 수정.
## v1.10.24
- 관리자 글쓰기 미저장 변경 비교에서 태그 표시명 보조값을 제외해 태그 API 로딩만으로 비공개 글 이탈 경고가 뜨던 문제 수정.
- 신규 글 첫 초안 생성 중 추가 입력된 제목·본문·태그·옵션을 생성된 글에 한 번 더 반영한 뒤 편집 URL로 이동하도록 수정.
- 신규 글 첫 자동 저장 중 초안 저장 준비 안내 오버레이를 표시하도록 추가.
## v1.10.23
- 관리자 글 목록이 `/admin/api/posts?paged=true` 페이지 응답을 사용하도록 수정.
- 관리자 글 목록 검색·상태·태그·추천·정렬 필터를 서버 쿼리 기준으로 전환.
- 관리자 글 목록에 번호형 페이지네이션과 이전·다음 빠른 이동을 추가.
- 관리자 글 목록 태그 필터 후보를 현재 페이지가 아닌 전체 사용 태그 기준으로 표시하도록 수정.
## v1.10.22
- 관리자 글 목록 API가 게시물 전체 본문을 내려주지 않고 목록 요약 필드만 반환하도록 수정.
- 관리자 글 목록 검색 범위를 제목·슬러그·요약·태그 기준으로 정리.
- 관리자 글 목록 추천 토글을 전체 게시물 저장 API가 아닌 전용 `/admin/api/posts/:id/featured` API로 분리.
## v1.10.21
- 관리자 글 목록 태그 필터를 전체 태그 select에서 검색형 combobox로 변경.
- 관리자 글 목록 태그 필터에서 태그 검색·키보드 선택·전체 태그 초기화를 지원하도록 추가.
- 관리자 글 목록 썸네일이 원본 이미지 대신 `featuredImageThumbnail`을 우선 사용하도록 수정.
## v1.10.20
- 관리자 글쓰기 태그 추천 목록에서 최근 사용 태그 5개를 메인 태그보다 먼저 표시하도록 수정.
- 태그 추천 목록의 최근 사용 태그 보조 라벨을 `최근`으로 표시하도록 추가.
- 관리자 미디어 페이지 표시 개수 셀렉트의 화살표를 다른 관리자 셀렉트와 같은 SVG chevron으로 통일.
## v1.10.19
- 라이브 작성 인용·콜아웃·토글 본문에서 멀티라인 블록 마크다운 표시를 보강.
- 콜아웃·토글 공개 렌더링에서 내부 본문을 블록 렌더러로 처리해 목록 문법이 적용되도록 수정.
- 공개 토글 블록에서 화살표뿐 아니라 제목을 눌러도 펼침·접힘이 전환되도록 수정.
- 라이브 작성 콜아웃·토글 내부 목록의 마커 색상과 위/아래 방향키 줄 이동 계산을 공개 렌더링 기준에 맞게 보강.
- 게시물 상태를 공개로 직접 변경할 때 발행 시각이 비어 있으면 현재 시각을 기본값으로 채우도록 수정.
- 관리자 게시물 저장 API에서도 공개 상태의 빈 발행 시각을 현재 시각으로 보정하도록 보강.
## v1.10.18
- 관리자 미디어 관리 화면이 `/admin/api/media?paged=1` 페이지 응답을 사용하도록 수정.
- 관리자 미디어 API에 탭·폴더·종류·미사용·검색 필터와 50·100·200개 페이지네이션 메타 응답 추가.
- 글쓰기·대표 이미지 선택 등 기존 미디어 배열 응답 사용처는 기존 `/admin/api/media` 배열 응답을 유지하도록 호환 처리.
## v1.10.17
- 콜아웃 라이브 편집 본문에서도 굵게·링크 등 인라인 마크다운이 표시되도록 수정.
- 콜아웃 공개 렌더링에서 여러 줄 본문과 인라인 마크다운을 함께 처리하도록 수정.
- `**[링크](url)**`, `::red[**[링크](url)**]`처럼 굵게·색상 안에 링크가 들어간 중첩 인라인 문법을 렌더링하도록 보강.
## v1.10.16
- 관리자 라이브 인용 편집에서 `::red[**텍스트**]` 같은 인라인 색상·굵게 문법을 렌더링하도록 수정.
- 관리자 라이브 토글 블록이 저장된 기본 펼침·닫힘 상태로 처음 표시되도록 수정.
- 관리자 미디어 화면에 50·100·200개 단위 페이지네이션과 번호형 빠른 이동을 추가.
- 관리자 미디어 그리드 이미지가 원본 대신 가능한 작은 파생 이미지를 우선 사용하고, 실패 시 원본으로 fallback하도록 수정.
## v1.10.15
- 새 게시물 본문 파생 이미지 파일명을 `*-body-1600.webp`, `*-body-720.webp`, `*-body-2560.webp` 해상도형 규칙으로 정리.
- 기존 `*-body.webp`, `*-lightbox.webp` 파일은 레거시 본문 이미지로 계속 인식해 관리자 미디어 사용처와 삭제 잠금을 유지하도록 보강.
- 본문 이미지 백필은 해상도형 새 파일이 없으면 다시 생성하도록 유지해 기존 운영 이미지의 새 규칙 전환을 지원.
- 본문 파생 이미지 파일명 정리 검토 과제를 완료 처리.
## v1.10.14
- 게시물 자동 생성 이미지(`card`, `page-cover`, `body`, `body-720`, `lightbox`) 표시 URL에 캐시 버전을 붙여 기존 깨진 브라우저 캐시를 우회하도록 수정.
- `/uploads/posts/**/thumbs/*.webp` 파생 이미지 응답 캐시를 `no-cache`로 낮춰 같은 URL 재생성 후에도 브라우저가 서버에 재검증하도록 수정.
- 관리자 미디어 화면의 파생 이미지 미리보기는 파일 수정 시각·용량 기준 캐시 버전을 사용하도록 수정.
- 관리자 미디어 본문 이미지 탭 안내 문구를 720px·1600px·2560px 파생 이미지 구조에 맞게 정리.
## v1.10.13
- 글쓰기 이미지·갤러리 선택 모달에서 게시물 카드·본문 1600px·본문 720px·라이트박스·Pages 커버 자동 생성 이미지를 숨기고 원본만 선택하도록 수정.
- 대표 이미지 선택 모달과 게시물·페이지 저장 API에서도 자동 생성 이미지 URL 저장을 차단하도록 보강.
- 이미지 파생 파일 생성 시 임시 파일에 먼저 쓰고 Sharp로 읽기 검증 후 최종 파일로 교체하도록 수정.
- 파생 이미지 생성 실패 시 깨진 산출물이 남지 않도록 임시 파일과 대상 파일을 정리하도록 수정.
## v1.10.12
- 홈 Pages 진열장 커버 이미지용 3:4 WebP 썸네일(`thumbs/*-page-cover.webp`, 450×600) 생성 추가.
- 페이지 생성·수정 저장 시 목록 썸네일 원본에서 페이지 커버 썸네일을 자동 생성하도록 수정.
- 공개 홈 Pages 진열장과 관리자 페이지 순서 모달이 `listingImageThumbnail`을 우선 사용하도록 수정.
- 관리자 미디어에서 페이지 커버 썸네일을 카드 썸네일 탭에 분류하고 원본 페이지 이미지 사용처와 연결해 미사용 삭제 대상에서 빠지도록 수정.
- 기존 페이지 커버 이미지 백필 명령(`npm run images:backfill-page-cover-thumbnails`, `sh scripts/backfill-page-cover-thumbnails-production.sh`) 추가.
## v1.10.11
- `/uploads/**` 런타임 파일 제공 API에 `ETag` 조건부 요청 304 응답 추가.
- 고유 URL 업로드 파일은 1년 immutable 캐시를 사용하도록 수정.
- 같은 URL로 재생성 가능한 게시물 `thumbs` 파생 이미지는 1시간 캐시와 `stale-while-revalidate`를 사용하도록 분리.
- 업로드 파일 캐시 정책 개선 과제를 `docs/todo.md`에서 제거.
## v1.10.10
- 관리자 미디어 라이브러리에서 `*-body-720.webp`, `*-lightbox.webp` 파생 이미지가 원본 라이브러리에 섞이던 문제 수정.
- 본문 파생 이미지 1600px·720px·2560px를 모두 원본 본문 이미지의 사용처와 연결해 미사용 일괄 삭제 대상에서 빠지도록 수정.
- 미디어 상세의 본문 이미지 설명에 파생 이미지 해상도 라벨 추가.
- 본문 파생 이미지 파일명 해상도형 전환 검토 과제를 `docs/todo.md`에 기록.
## v1.10.9
- 사이트 설정 POST 설정에 업로드 제한(1회 최대 파일 수·전체 용량) 관리 추가.
- `site_settings`에 `upload_max_file_count`, `upload_max_total_size` 컬럼 추가.
- 관리자 미디어·글쓰기 업로드에서 설정된 파일 수·총량 제한을 클라이언트와 서버 양쪽에서 검사하도록 수정.
- 업로드 메모리 개선 후속 과제를 스트리밍 업로드 파서 검토로 재정리.
## v1.10.8
- 게시물 본문 이미지 저장 시 라이트박스용 WebP(`thumbs/*-lightbox.webp`, 2560px) 생성 추가.
- 공개 본문 라이트박스가 원본 대신 라이트박스용 파생 이미지를 우선 표시하도록 수정.
- 라이트박스 원본 보기 UI는 추가하지 않고 파생 이미지 로드 실패 시에만 원본 fallback 유지.
- 기존 본문 이미지 백필이 1600px·720px·라이트박스용 파생 이미지를 모두 확인하고 누락분을 생성하도록 수정.
- 본문 이미지 최적화 후속 과제 완료로 `docs/todo.md`에서 제거.
## v1.10.7
- 게시물 본문 이미지 저장 시 720px 작은 본문 표시용 WebP(`thumbs/*-body-720.webp`) 생성 추가.
- 공개 본문 단일 이미지와 갤러리 이미지에 720w/1600w `srcset` 적용.
- 기존 본문 이미지 백필이 1600px·720px 파생 이미지를 모두 확인하고 누락분을 생성하도록 수정.
- 본문 이미지 최적화 후속 과제에서 `srcset`·720px 미구현 항목 제거.
## v1.10.6
- NAS 호스트에 npm이 없는 환경에서도 이미지 백필을 실행할 수 있도록 production shell 래퍼 추가.
- 운영 Docker 이미지의 `.output/server` 아래에 이미지 백필 스크립트와 필요한 원본 유틸 파일 포함.
- 카드·본문 이미지 백필 스크립트가 Nuxt repository source import에 의존하지 않고 DB를 직접 조회하도록 수정.
- 로컬 이미지 백필 명령이 `.env.production`을 자동 탐색하지 않도록 조정해 운영 DB 오연결 위험 축소.
- 배포 문서의 운영 보조 명령을 npm 없는 NAS 기준으로 보정.
## v1.10.5
- 기존 게시물 본문 이미지의 표시용 WebP(`thumbs/*-body.webp`)를 일괄 생성하는 백필 스크립트 추가.
- `npm run images:backfill-post-body-thumbnails` 운영 보조 명령 추가.
- 본문 이미지 최적화 후속 과제에서 백필 스크립트 미구현 항목 제거.
## v1.10.4
- 공개 Markdown 본문 블록 사이 Vue fragment 주석(``)을 줄이도록 블록 그룹 렌더러와 인아티클 광고 블록 삽입 방식 정리.
- 인라인 렌더러 첫 줄 `br` 조건 분기를 제거해 단일 줄 문단 내부 주석을 줄임.
## v1.10.3
- 공개 게시물 목록과 태그 게시물 목록 페이지네이션을 번호형 빠른 이동 UI로 교체.
- 페이지 수가 많을 때 처음·끝 페이지와 현재 페이지 주변 번호를 유지하고 중간 구간을 `...`으로 접도록 정리.
- 좁은 화면에서 페이지 번호가 넘칠 때 가로 스크롤로 탐색할 수 있도록 보정.
## v1.10.2
- 게시물 저장 시 본문 이미지의 WebP 표시용 파생 파일(`thumbs/*-body.webp`) 생성 추가.
- 공개 본문 단일 이미지·갤러리 표시에서 본문 표시용 이미지를 우선 사용하고 실패 시 원본으로 대체하도록 수정.
- 관리자 미디어에 `본문 이미지` 탭 추가 및 원본 상세의 본문 이미지 생성·재생성 액션 추가.
- 관리자 미디어 라이브러리의 중복 `전체` 필터 배지 제거 및 `미사용` 토글 동작 정리.
## v1.10.1
- 공개 본문 단일 이미지를 클릭하면 라이트박스로 크게 볼 수 있도록 수정.
- 게시물 안의 단일 이미지와 갤러리 이미지를 하나의 라이트박스 그룹으로 묶어 이전·다음 탐색이 이어지도록 정리.
- 본문 단일 이미지와 갤러리 이미지에 lazy 로딩·비동기 디코딩 속성 추가.
- 이미지 최적화·업로드 총량 제한·업로드 캐시·검색 인덱스 개선 과제를 `docs/todo.md`에 기록.
## v1.10.0
- 관리자 글쓰기 자동 저장 중 추가 입력한 본문·태그가 저장 완료 처리와 화면 이동으로 사라지지 않도록 수정.
- 게시물 저장·발행 요청 중 추가 변경을 실제 저장된 payload와 구분하고, 남은 변경은 저장 완료 후 다시 자동 저장되도록 보정.
- 게시물 발행 저장 진행 중 다른 화면으로 이동하려 할 때 미저장 이탈 확인이 동작하도록 수정.
## v1.9.34
- Markdown 인라인 링크 텍스트 내부의 굵게·기울임·색상 등 중첩 인라인 렌더링 추가.
- Markdown 인라인 색상·링크 내부 `
` 줄바꿈 렌더링 보강.
## v1.9.33
- 공개 Markdown 인라인 렌더러의 fragment 주석 반복을 줄이도록 단일 루트 구조로 정리.
## v1.9.32
- Markdown 리스트 항목이 여러 줄일 때 마커가 첫 줄 기준으로 정렬되도록 수정.
## v1.9.31
- Markdown 표 셀 내부 `
` 줄바꿈 렌더링 추가.
- Markdown 표 헤더·셀 내부 인라인 링크 렌더링 동작 정리.
## v1.9.30
- 홈 Pages 진열장 추천 페이지 표시를 텍스트 배지에서 SVG 아이콘 배지로 변경.
## v1.9.29
- 사이트 단축키·슬래시 명령·Markdown 약식 문법 정리 문서 추가.
## v1.9.28
- 페이지 HTML 문서 모드에서 태그 내부 스마트 따옴표가 HTML 속성 해석을 깨뜨리지 않도록 정규화 추가.
- 게시글 작성 인라인 링크 사용 방식 문서화.
## v1.9.27
- 홈 Featured·Pages 캐러셀에서 포인터 캡처가 일반 클릭까지 가로채 링크가 열리지 않던 문제 수정.
## v1.9.26
- 홈 Featured·Pages 캐러셀 클릭이 드래그 시작 처리에 막혀 링크가 열리지 않던 문제 수정.
- 공개 게시물 전체 목록 카드에 태그 색상 배지와 hover 화살표 링크 표시 추가.
- 오른쪽 사이드바 구분선을 레이아웃 컬럼에서 그려 긴 게시물에서도 끝까지 이어지도록 수정.
## v1.9.25
- 공개 통합 검색이 한글 IME 조합 중에도 입력창의 현재 표시값을 디바운스 검색어로 반영하도록 수정.
- 공개 통합 검색에서 마지막 조합 글자 확정 전 결과가 직전 검색어에 머물던 문제 수정.
## v1.9.24
- 공개 통합 검색 입력의 한글 IME 조합 중 미완성 검색 요청 방지.
- 공개 통합 검색어 앞뒤 공백·연속 공백·Unicode 정규화 처리 추가.
## v1.9.23
- 페이지 섹션 관리 API·관리자 화면·홈 Pages 진열장 연동 변경분 일괄 반영.
- 공개 목록 표시개수 설정 및 관련 서버 조회 로직 변경분 일괄 반영.
## v1.9.22
- 홈 Pages 섹션 슬라이드 화살표를 Featured와 동일한 텍스트형 버튼 스타일로 통일.
## v1.9.21
- 홈 Pages 진열장 선반 폭이 카드 전체 너비로 늘어나 드래그·좌우 버튼이 비활성처럼 보이던 문제 수정.
- 홈 Pages 진열장 레일을 섹션 최대 폭 안에서 가로 스크롤되도록 정리.
## v1.9.20
- 홈 `Posts 더보기` 링크가 Pages 진열장 아래가 아니라 Latest 목록 하단에 표시되도록 위치 수정.
## v1.9.19
- 홈 Pages 진열장 스크롤 상태를 `ResizeObserver`와 스크롤 이벤트로 계속 갱신해 좌우 버튼 표시 상태가 실제 overflow와 맞도록 수정.
- 홈 Featured·Pages 드래그를 문서 레벨 포인터 추적으로 변경해 카드 밖으로 포인터가 이동해도 드래그가 유지되도록 수정.
- 관리자 페이지 순서 변경 모달에서 추천 페이지가 비추천 페이지 뒤로 드롭되어도 즉시 추천 우선 순서로 보정되도록 수정.
## v1.9.18
- 홈 Featured·Pages 가로 트랙에서 이미지 기본 드래그가 발생하지 않도록 수정.
- 홈 Featured·Pages 가로 트랙의 작은 드래그에도 스크롤이 반응하고 드래그 종료 시 가까운 카드로 스냅되도록 수정.
- 홈 Pages 진열장 카드 폭을 키워 여러 페이지가 있을 때 좌우 버튼과 드래그 탐색이 동작하도록 조정.
## v1.9.17
- 관리자 설정 표시개수 셀렉트 화살표를 기존 chevron SVG 패턴으로 통일.
- 공개 게시물 목록 썸네일 placeholder 높이가 대표 이미지 유무와 관계없이 고정되도록 수정.
- `/posts`와 `/tag/:slug` 페이지네이션 이동 시 화면이 목록 상단으로 이동하도록 수정.
- 홈 Latest 하단에 `/posts` 더보기 링크 추가.
- 관리자 네비게이션 페이지 섹션 순서 모달에 추천 페이지 우선 정렬과 추천 배지 반영.
## v1.9.16
- 사이트 설정 POST 설정에 공개 목록 표시개수 설정 추가.
- 홈 Latest·Featured·Pages 진열장 표시 개수를 사이트 설정 기준으로 제한.
- 공개 게시물 목록 `/posts`에 서버 페이지네이션 적용.
- 태그 상세 `/tag/:slug` 게시물 목록에 서버 태그 필터와 페이지네이션 적용.
- 태그 전체 `/tags`에서 게시물 전체 조회 제거 및 태그 API의 공개 게시물 수 사용.
- DB 마이그레이션 `062_site_settings_display_counts.sql` 추가.
## v1.9.15
- 홈 Featured와 Pages 진열장에 드래그 슬라이드와 스냅 이동 적용.
- 홈 Pages 진열장 섹션별 이전·다음 버튼 추가 및 카드 hover 상단 잘림 수정.
- 네비게이션 관리 각 탭의 추가·저장 버튼을 패널 작업줄의 좌우 배치로 통일.
- 페이지 섹션의 페이지 순서 변경 모달을 썸네일 카드형 가로 목록으로 정리.
- 페이지 순서 변경 모달에서 페이지를 해당 섹션에서 바로 제거하는 기능 추가.
## v1.9.14
- 네비게이션 관리의 메인·하단 메뉴 추가 흐름을 모달 입력 후 목록 반영 방식으로 통일.
- 추천 사이트 추가 모달 취소 시 빈 임시 항목이 목록에 남지 않도록 수정.
- 페이지 섹션 추가를 인라인 입력에서 모달 입력 방식으로 변경.
- 페이지 섹션 행별 저장 제거 및 `페이지 섹션 저장` 단일 액션으로 이름·섹션 순서 저장 흐름 정리.
- 페이지 섹션 자체 순서를 버튼 대신 드래그앤드롭으로 변경.
- 네비게이션 저장 버튼을 페이지 섹션 탭에서 숨기고 저장 대상별 버튼 라벨 정리.
## v1.9.13
- 페이지 섹션 관리를 관리자 페이지 목록에서 네비게이션 관리의 `페이지 섹션` 탭으로 이동.
- 네비게이션 탭 이름과 순서를 `메인 네비게이션`·`페이지 섹션`·`하단 네비게이션`·`추천 사이트`로 정리.
- 페이지 섹션 탭에 섹션별 페이지 순서 변경 모달 추가.
- 페이지 작성·수정 화면의 섹션 선택을 등록 섹션 검색형 입력으로 변경.
- 페이지 작성·수정 화면의 목록 노출 설명 제거, 목록 이미지 라벨을 `썸네일 등록`으로 변경.
- 페이지 작성·수정 화면의 정렬 순서 직접 입력 제거 및 HTML 자산 영역 위치 정리.
- `PUT /admin/api/page-sections/:id/pages/reorder` API 추가.
## v1.9.12
- 페이지 섹션을 `page_listing_sections` 관리 테이블로 분리.
- 관리자 페이지 목록에 페이지 섹션 추가·수정·삭제·순서 변경 관리 카드 추가.
- 페이지 작성·수정 화면의 섹션 입력을 등록된 섹션 선택 방식으로 변경.
- 홈 Pages 진열장 섹션 정렬을 페이지 섹션 관리 순서 기준으로 변경.
- HTML 문서 모드 페이지에서 브라우저 뒤로가기 후 화면이 갱신되지 않을 수 있는 클라이언트 재진입 방식을 수정.
- Pages 진열장 썸네일 권장 비율과 제작 크기 문서화.
- DB 마이그레이션 `061_page_listing_sections.sql` 추가.
## v1.9.11
- 페이지 노출 메타 추가: 홈 표시, 추천 표시, 섹션명, 목록 제목, 목록 설명, 목록 이미지, 정렬 순서 저장.
- 공개 홈에 노출 설정된 페이지를 섹션별 도서 진열장형 Pages 선반으로 표시하도록 추가.
- 공개 검색 결과에 홈 표시 페이지 섹션 추가.
- 관리자 페이지 목록에 홈 표시·섹션·추천 배지 추가.
- DB 마이그레이션 `060_page_listing_metadata.sql` 추가.
## v1.9.10
- 관리자 세션으로 공개 게시물·페이지를 조회할 때 페이지뷰·읽음·체류·스크롤·실시간 접속 통계에 포함되지 않도록 수정.
## v1.9.9
- 관리자 글 목록의 공개 게시물 상태 표시와 상태 필터 문구를 `발행`에서 `공개`로 통일.
- 관리자 글·페이지 목록 주소 줄에 hover/focus 시 보이는 공개 보기 바로가기 아이콘 추가.
## v1.9.8
- 게시물·페이지 관리자 슬러그 입력 규칙을 한글·영문 소문자·숫자·하이픈·언더바 허용으로 통일.
- 게시물 본문 제목 `1~3` 같은 텍스트가 오른쪽 목차에서 `13`으로 보이던 문제 수정.
- 메인·태그 게시물 목록의 오른쪽 아래 화살표를 게시물 링크로 연결.
- 메인·게시물 전체·태그 게시물 목록의 태그 배지를 태그 페이지 링크로 통일.
## v1.9.7
- 관리자 통계 차트: 현재 구간 축 라벨(이번 주 등) 줄바꿈·hover 시 글자 안 보임 문제 수정.
- 관리자 대시보드 통계 추이 기본 선택을 주간에서 일간으로 변경, `일일` 버튼명을 `일간`으로 통일.
- 관리자 대시보드 기간 필터: 선택된 버튼 hover 시 `hover:bg-paper`와 `text-white`가 겹치던 스타일 충돌 수정.
## v1.9.6
- 관리자 대시보드 방문자 추이: 검색(빨강)·SNS(청록)·기타(회색) 유입 스택 막대 적용.
- 관리자 통계 차트: 기본은 옅은 색, hover 시 해당 막대만 색상 강조·나머지는 흐리게 표시.
## v1.9.5
- 관리자 대시보드 `/admin/api/analytics/traffic` 오류 수정: 정의되지 않은 `trendPeriod` 참조로 인한 500 응답 제거.
- 관리자 대시보드: 클라이언트에서 서버 전용 `lib/analytics.js` import 제거(`analytics-shared.js` 사용).
## v1.9.4
- 관리자 대시보드 통계 추이: 집계 시작일을 `2026-06-01` 기준으로 고정(`ANALYTICS_COLLECTED_SINCE` 환경 변수로 변경 가능).
- 관리자 대시보드 통계 추이: 집계 시작일 이전 구간은 0으로 표시.
- 관리자 대시보드 통계 추이 안내 문구를 `통계는 2026년 6월 1일부터 집계한 데이터를 표시합니다.` 형식으로 변경.
- `GET /admin/api/analytics/summary` 응답에 `collectedSince` 필드 추가.
- `docs/deploy.md`에서 버전별 QA 참고 섹션을 제거하고 배포·빌드·운영 절차만 남기도록 정리.
## v1.9.3
- 관리자 대시보드 통계 추이: 차트별 네비게이션을 기간 버튼 옆 공통 ‹ › 로 통합.
- 관리자 통계 추이: 서버 버킷 수 확장(일 28·주 24·월 24·년 16)으로 이전 기간 이동 지원.
- 관리자 페이지 목록: 조회수·통계 모달 추가(`GET /admin/api/analytics/pages/:id`).
## v1.9.2
- 관리자 통계 차트 툴팁: 제목 제거, 값·증감 가로 배치·`whitespace-nowrap`으로 세로 늘어짐 완화.
## v1.9.1
- 관리자 통계 차트: 차트 중앙의 중복 기간 라벨(주간·월간 등) 제거, 막대별 일·월·년 축 라벨 및 현재 구간(오늘·이번주·이번달) 표시.
- 관리자 통계 차트: 툴팁에 이전 구간 대비 증감(▲/▼) 표시, 기간별 페이지 이동(‹ ›) 지원.
- `AdminAnalyticsTrendChart` 공통 컴포넌트로 대시보드·게시물 통계 모달·게시물 통계 페이지 차트 통일.
## v1.9.0
- 관리자 대시보드 통계 추이 선택지를 일일·주간·월간·년간으로 변경.
- 관리자 대시보드 통계 추이 집계를 서버 기준 일간 7일·주간 최대 8주·월간 12개월·년간 최대 8년 단위로 정리.
- 관리자 대시보드 통계 추이 막대 클릭 상세 모달이 선택 집계 구간의 시작일·종료일을 사용하도록 정리.
## v1.8.9
- 관리자 글 목록에 게시물별 누적 조회수와 통계 모달 버튼 추가.
- 관리자 글 목록 조회수와 통계 버튼을 제목 영역에서 별도 조회수 열로 분리.
- 관리자 글 목록 조회수는 숫자만 표시하고 통계 버튼은 기본 회색·hover 파란색으로 정리.
- 관리자 글 목록 통계 버튼 클릭 시 게시물 수정 화면 대신 게시물별 통계 모달이 열리도록 수정.
- 관리자 게시물별 통계 모달을 대시보드 통계 상세 모달 스타일과 같은 카드형 구성으로 정리.
- 관리자 게시물별 통계 추이를 7/30/90일 대신 일간·주간·월간 집계로 전환.
- 관리자 게시물별 통계 화면 추가.
- 게시물별 통계 API와 앞으로 수집될 게시물별 유입 집계 테이블 추가.
- DB 마이그레이션 `059_post_analytics_traffic_daily.sql` 추가.
## v1.8.8
- 관리자 대시보드 통계 추이 막대 클릭 시 날짜·구간 상세 모달을 표시하도록 추가.
- 통계 상세 모달에 유입·디바이스·유입 키워드·인기 게시물·인기 페이지 정보를 표시하도록 추가.
- 통계 상세 모달의 유입 키워드 안내 문구를 간결하게 정리.
- 통계 상세 모달 패널에 0.5rem 둥근 모서리 적용.
## v1.8.7
- 태그별 헤더 이미지·오버레이 제목·오버레이 본문 필드 추가.
- 관리자 태그 생성·수정 폼에 태그 헤더 이미지 업로드·삭제와 오버레이 입력 추가.
- 공개 태그 상세에서 헤더 이미지가 있으면 기본 태그명·설명 대신 헤더 이미지를 표시하도록 수정.
- 태그 헤더 이미지가 미디어 사용처로 보호되도록 정리.
## v1.8.6
- 공개 태그 API에 전체 태그 메타 조회 옵션을 추가.
- 태그 상세·게시물 목록·게시물 상세에서 일반 태그도 이름·설명·색상을 표시하도록 수정.
- sitemap 태그 URL 생성 기준을 게시물이 연결된 전체 태그로 정리.
## v1.8.5
- 게시물 요약 자동 생성 시 인라인 색상 토큰과 HTML 태그가 목록 설명에 노출되지 않도록 수정.
## v1.8.4
- 게시물 글쓰기에서 새 태그 배지에 슬러그 대신 입력한 태그명을 표시하도록 수정.
- 새 태그 저장 시 입력한 태그명을 유지하고 `/`는 슬러그에서 `-`로 변환하도록 수정.
- 라이브 코드 블록의 줄번호 숨김 라벨을 `줄번호 표시 안함`으로 변경.
## v1.8.3
- 코드 블록 줄번호 표시 자동 저장 옵션을 `line-numbers`로 변경.
- 기존 `linenos`, `nolinenos`, `no-line-numbers` 옵션은 읽기 호환으로 유지.
## v1.8.2
- 게시물 글쓰기 코드 블록의 줄번호 표시 기본값을 숨김으로 변경.
- 코드 블록 줄번호를 켠 경우에만 펜스 선언 줄에 `linenos` 옵션을 저장하도록 수정.
## v1.8.1
- 게시물 글쓰기 슬래시 명령을 `/html`, `/link`, `/iframe`으로 분리.
- 게시물 본문에 `:::html`, `:::link`, `:::iframe` 블록 저장·렌더링 추가.
- 본문 HTML 블록에서 실행성 태그·속성을 제거하고 표 등 일반 HTML을 표시하도록 정리.
- 기존 HTML/임베드 작성값은 수동으로 새 블록 형식으로 정리하도록 배포 가이드 추가.
## v1.8.0
- 게시물 라이브 편집에서 위·아래 방향키로 인접 블록 이동 시 커서가 화면 밖으로 벗어나면 편집 스크롤 영역이 함께 따라오도록 수정.
## v1.7.9
- 대표 이미지 미디어 라이브러리에서 게시물 카드 썸네일 파생 파일을 숨기고 원본 이미지만 선택하도록 수정.
- 본문 이미지·갤러리·대표 이미지의 카드 썸네일 URL 판별을 공통 유틸로 통일.
- 게시물 저장 API에서 카드 썸네일 URL을 대표 이미지로 지정하지 못하도록 검증 추가.
## v1.7.8
- 게시물 글쓰기 이미지·갤러리 미디어 모달의 기본 탭을 업로드로 변경하고 업로드 탭을 첫 순서로 정리.
- 미디어 모달에서 업로드한 이미지가 라이브러리 전환 후 자동 선택되도록 수정.
- 공개 게시글 수정 아이콘을 로그인 회원 본인의 게시글에서만 표시하도록 관리자 세션 판정 제거.
- 주소·HTML 임베드 블록의 상단 여백을 제거하고 하단 여백만 유지하도록 수정.
## v1.7.7
- Homepage 통계 API에 최근 30일·180일(6개월)·365일(1년) 방문자 합계 추가.
- 기간별 방문자 합계를 단일 집계 쿼리로 처리하고 Homepage 권장 갱신 주기를 5분으로 정리.
## v1.7.6
- gethomepage Custom API에 누적 방문자·페이지뷰와 전체 게시글·댓글·페이지·태그·회원 통계 추가.
- Homepage에서 필요한 통계 필드를 선택해 사용할 수 있도록 `docs/homepage-widget.md` 가이드 추가.
## v1.7.5
- 전체 포트 재정검 결과에 맞춰 앱 포트를 `43080`, PostgreSQL 외부 포트를 `43081`로 변경.
- 개발·운영 환경 파일, Compose 기본값, 개발 서버·미리보기 명령과 관련 문서의 포트 기준을 통일.
## v1.7.4
- 다른 서비스와의 포트 충돌을 피하도록 앱 포트를 `43084`, PostgreSQL 외부 포트를 `43085`로 변경.
- 개발·운영 환경 파일, Compose 기본값, 개발 서버·미리보기 명령과 관련 문서의 포트 기준을 통일.
## v1.7.3
- 로컬 개발 앱 포트를 `43081`, PostgreSQL 포트를 `43082`로 변경.
- 개발 환경 URL·DB 연결 문자열·개발 서버·미리보기 명령의 포트 기준을 통일.
## v1.7.2
- NAS Docker 외부 앱 포트를 `43081`, PostgreSQL 외부 포트를 `43082`로 변경.
- Docker 내부 앱·DB 연결 포트는 기존 `3000`·`5432`로 유지.
## v1.7.1
- 관리자 네비게이션 추천 사이트 편집: 미저장 닫기·삭제 확인을 `AdminConfirmModal` 공통 모달로 교체.
## v1.7.0
- 관리자 멤버 권한: 관리자는 VIP·멤버 정보만 수정·삭제·비밀번호 변경 가능, 소유자·관리자·본인 계정은 조회만.
- 소유자 멤버 관리: 다른 회원을 소유자로 지정 시 확인 모달 후 권한 이전, 기존 소유자는 관리자로 자동 변경.
## v1.6.9
- 버그 수정: 멤버 편집 저장 시 `isSaving` 때문에 등급 변경 API가 건너뛰어져 관리자로 바꿔도 멤버로 되돌아가던 문제 수정.
## v1.6.8
- 버그 수정: 메뉴 관리 페이지에서 네비게이션 API 오류 시 `null.map`으로 SSR이 깨지던 문제 수정.
- `useAdminToast`: SSR 환경에서 `window` 접근으로 터지지 않도록 보호.
## v1.6.7
- 관리자 멤버 편집: 썸네일 업로드는 미리보기만 반영하고 **저장** 시 `PUT /admin/api/members/:id`로 적용.
- 관리자 미디어 프로필 이미지: 연결 회원 배지를 등급(소유자·관리자·VIP·멤버)별로 표시.
## v1.6.6
- 관리자 네비게이션: 메뉴·추천 사이트 삭제 시 `confirm` 확인 추가(하위 메뉴 포함 안내).
- 관리자 추천 사이트 편집 모달: 저장하지 않은 변경이 있을 때 취소·배경 클릭 시 닫기 확인.
## v1.6.5
- 관리자 추천 사이트 목록: 공개 Recommended와 동일한 카드 형태(아이콘·제목·설명/URL), 캐시 갱신 시각은 오른쪽 끝 유지.
- 관리자 추천 사이트: 드래그 시 카드 위·아래 구역에 파란 삽입선·「앞에/뒤에 삽입」 안내 표시.
- 관리자 추천 사이트 편집: URL 접두사 select에 AdminPageForm과 동일한 chevron SVG 적용.
## v1.6.4
- 네비게이션 URL: `uniare.sori.studio`처럼 프로토콜 없이 입력해도 `https://`를 자동 보정, 내부 경로 `/post` 지원 유지.
- 관리자 추천 사이트 편집: URL 입력에 `https://`·`http://`·내부 경로 접두사 선택 추가.
## v1.6.3
- 관리자 추천 사이트: 테이블 대신 공개 Recommended와 같은 카드 목록·편집 모달 UI로 변경.
- 관리자 추천 사이트: 목록은 썸네일·사이트·설명·캐시 갱신 시각·편집 버튼 전체 너비 레이아웃, 모달은 취소만으로 닫기.
## v1.6.2
- 추천 사이트 파비콘: 서버 캐시 컬럼(`cached_favicon_url`, `favicon_cached_at`) 추가 및 `/uploads/system/recommended-favicon-*.png` 저장.
- 추천 사이트 파비콘: 매월 1일 03:00(KST) 자동 갱신 플러그인·`npm run navigation:refresh-recommended-favicons` 스크립트 추가.
- 관리자 추천 사이트: 적용 아이콘 미리보기 열·썸네일 URL 옆 수동 파비콘 새로고침 버튼 추가.
- 공개 Recommended: 수동 썸네일 > 서버 캐시 파비콘 > 외부 프록시 순으로 아이콘 표시.
- 버그 수정: `favicon-refresh` API import 경로 오류로 Nitro 빌드 실패·개발 서버 무응답되던 문제 수정.
- 개발 서버 스크립트: Nitro 빌드 완료 후 링크를 출력하고 Rollup/Nitro ERROR 로그를 터미널에 표시하도록 수정.
## v1.6.1
- 외부 파비콘 URL 생성: Google `s2/favicons?domain=` 대신 `faviconV2`+origin URL을 사용해 서브도메인·신규 사이트에서 기본 지구본만 나오던 문제 수정.
- 공개 왼쪽 사이드바 Recommended: 썸네일 로드 실패 시 파비콘·첫 글자 순으로 fallback.
- 본문 북마크 카드: 파비콘 URL 생성을 `lib/external-favicon-url.js` 공통 유틸로 통일.
## v1.6.0
- 미디어 관리: 카드 썸네일·프로필 이미지 탭의 목록 카드 오른쪽 위에도 실제 사용 개수 배지를 표시하도록 수정.
- 미디어 관리: 상태 배지(회원·원본·카드)와 사용 개수 배지를 분리해 동일 이미지 후보를 목록에서 바로 구분할 수 있도록 정리.
## v1.5.109
- 공개 사이드바: 추천 사이트 Recommended 영역을 오른쪽 사이드바에서 왼쪽 사이드바 태그 아래로 이동.
- 공개 오른쪽 사이드바: 일반 화면에서 추천 사이트 목록 조회와 렌더링을 제거해 광고 슬롯 공간을 더 안정적으로 확보하도록 정리.
## v1.5.108
- 미디어 관리: 전체/미사용 필터를 미디어 라이브러리·카드 썸네일·프로필 이미지 탭 공통 배지형 필터로 표시하도록 수정.
- 미디어 관리: 전체 선택이 현재 필터에서 삭제 가능한 항목만 대상으로 동작하도록 유지하면서 미사용 정리 흐름을 명확히 정리.
- 게시물 글쓰기: 라이브 모드 이미지·갤러리 hover 액션에서 중복되는 편집 버튼을 제거하고 삭제 버튼만 남기도록 수정.
## v1.5.107
- 게시물 글쓰기: `Cmd/Ctrl+Z` 되돌리기·다시 실행 시 본문 값과 함께 선택 위치를 복원하도록 수정.
- 미디어 관리: 카드 썸네일 탭에서 카드 배지를 숨기고 현재 필터의 삭제 가능한 미사용 항목을 전체 선택할 수 있도록 수정.
- 미디어 업로드: 원본 파일명 정리 규칙을 Unicode 문자·숫자 기준으로 확장해 일본어 파일명을 보존하도록 수정.
## v1.5.106
- 게시물 글쓰기: 소스 모드 텍스트 색상 적용 후 textarea와 에디터 스크롤 위치를 함께 복원하도록 수정.
- 게시물 글쓰기: 기존 임베드 UI 라벨을 HTML로 변경하고 `/html`, `/iframe` 검색어로 찾을 수 있도록 수정.
- 게시물 본문: 단독 iframe HTML 또는 `:::embed` 블록 안 iframe HTML을 안전 속성 기반 iframe으로 렌더링하도록 추가.
## v1.5.105
- 게시물 글쓰기: 일반 텍스트 선택 시 오른쪽 블록 설정 패널에 텍스트 색상 선택 패널이 열리도록 추가.
- 게시물 글쓰기: 선택 텍스트 색상 적용 후 라이브 작성 위치가 크게 이동하지 않도록 커서 복원 기준 수정.
- 게시물 글쓰기: 라이브 모드 텍스트 부분 선택 색상 적용 시 선택 시작점이 0으로 잡혀 앞쪽 내용까지 함께 색상이 적용되던 문제 수정.
- 게시물 글쓰기: 소스 모드 텍스트 색상 적용 후 textarea 스크롤 위치를 보존하도록 수정.
- 인라인 마크다운: `::red[텍스트]` 형식의 색상 토큰 렌더링과 색상 내부 굵게·기울임 등 인라인 조합 처리 추가.
- 공개 본문: 회색·파랑·초록·노랑·빨강·보라 인라인 텍스트 색상 표시 추가.
## v1.5.104
- 게시물 상세 목차: 2줄 이상 제목에서 활성 표시선과 텍스트 정렬이 틀어지지 않도록 항목 높이를 최소 24px 기준으로 수정.
## v1.5.103
- 게시물 상세 목차: 활성 표시선을 Tailwind 가상 요소 유틸 대신 scoped CSS `::before`로 직접 그리도록 수정.
## v1.5.102
- 게시물 상세 목차: 활성 표시선을 `border` 대신 가상 요소 배경 막대로 변경해 브랜드 컬러 반응을 복구.
- 게시물 상세 목차: 각 항목 높이를 24px로 고정하고 텍스트를 세로 중앙 정렬하도록 수정.
## v1.5.101
- 게시물 상세 목차: 활성 항목 표시선을 가상 요소로 분리해 브랜드 컬러 라인이 생겨도 텍스트 시작점이 밀리지 않도록 수정.
## v1.5.100
- 게시물 상세 목차: 전체 `nav` 보더 대신 항목별 `li` 보더로 변경해 활성 항목 왼쪽 라인이 브랜드 컬러로 직접 강조되도록 수정.
## v1.5.99
- 게시물 상세 TOC: 섹션 라벨을 `목차`로 변경.
- 게시물 상세 TOC: 활성 항목의 왼쪽 표시선과 텍스트에 브랜드 컬러를 적용하고 표시선을 더 눈에 띄게 조정.
## v1.5.98
- 게시물 상세 TOC: 목차 자체 최대 높이와 내부 스크롤을 제거해 목차 전체가 먼저 펼쳐지고 광고가 그 아래에 이어지도록 수정.
- 게시물 상세 TOC: 활성 항목 자동 보정을 오른쪽 사이드바 전체 스크롤 기준으로 변경.
## v1.5.97
- 게시물 상세 오른쪽 사이드바: 블로그 소개·Follow 섹션을 숨기고 TOC를 최상단에 배치하도록 수정.
- 게시물 상세 광고: 왼쪽 사이드바에서 제거하고 오른쪽 TOC 아래에 표시하도록 이동.
- 게시물 상세 TOC: 광고 영역을 확보하도록 최대 높이를 제한하고, 목차 왼쪽 세로 기준선과 활성 항목 표시선을 추가.
- 관리자 Ads 설정: 게시물 사이드 광고 라벨과 설명을 오른쪽 사이드 기준으로 수정.
## v1.5.96
- 공개 화면 회원 세션 확인: 비로그인 방문 시 콘솔에 401 오류가 반복 표시되지 않도록 선택적 조회로 수정.
- 게시물 상세 관리자 세션 확인: 편집 버튼 표시용 확인은 선택적 조회를 사용하되 관리자 라우트 보호용 401 동작은 유지.
## v1.5.95
- 게시물 상세 왼쪽 사이드 광고 슬롯: 광고 미노출 시 하단 구분선만 남지 않도록 정리.
- 게시물 상세 오른쪽 TOC: 하단 구분선 클래스가 없는 상태임을 재확인.
## v1.5.94
- 게시물 상세 오른쪽 사이드바: TOC 영역이 고정 최대 높이 대신 프로필·Follow 아래 남는 높이를 사용하도록 수정.
## v1.5.93
- 게시물 글쓰기: 게시물별 태그 최대 개수를 기본 5개로 제한하도록 추가.
- 사이트 설정: POST 설정에서 태그 최대 개수를 1~10개 범위로 조절하는 항목 추가.
- 서버 API: 게시물 생성·수정 시 설정된 태그 최대 개수를 초과하면 저장을 차단하도록 보강.
- 공개 본문: 표준 마크다운 표 렌더링 추가.
- 게시물 글쓰기: `/표`·`/table` 슬래시 명령으로 기본 표 템플릿을 삽입하도록 추가.
- DB: `site_settings.post_tag_limit` 마이그레이션 추가.
## v1.5.92
- 관리자 태그: 새 태그 저장 후 수정 화면이 아니라 태그 목록으로 이동하도록 수정.
- 관리자 태그: 태그 수정 화면의 변경 저장 버튼을 실제 변경사항이 있을 때만 활성화하도록 수정.
- 관리자 태그: 저장·삭제 액션의 우측 상단 토스트 피드백 추가.
- 게시물 글쓰기: 미디어 모달 업로드 완료 후 본문에 자동 삽입하지 않고 목록에서 직접 선택해 삽입하도록 수정.
- 게시물 글쓰기: 미디어 모달 업로드 중 닫기·중복 업로드를 막도록 수정.
## v1.5.91
- 게시물 글쓰기: 본문 미디어 선택 모달에서 게시물 카드 썸네일 파생 파일을 숨기도록 수정.
- 게시물 글쓰기: 미디어 모달 업로드 중 드롭·파일 선택 재진입을 막고 업로드 중 오버레이·스피너·스켈레톤 로딩 표시 추가.
- 게시물 태그: 게시물별 태그 연결 순서 저장용 `post_tags.sort_order` 마이그레이션 추가.
- 공개 게시물 목록: 저장된 첫 번째 태그를 기준으로 태그를 고정 표시하도록 태그 조회 정렬 보강.
- 관리자 게시물 목록: 게시물에 적용된 태그 전체를 배지로 표시하도록 수정.
## v1.5.90
- 게시물 글쓰기: 라이브 모드에서 닫는 코드 펜스를 다음 코드 블록 시작으로 오인해 일반 문단에서도 코드 블록 설정 패널이 남던 문제 수정.
- 게시물 글쓰기: 라이브 모드 코드 블록 아래 새 문단 삽입 시 블록 설정 패널 상태를 즉시 일반 줄 기준으로 초기화하도록 보강.
## v1.5.89
- 게시물 글쓰기: 소스 모드 코드 블록 본문에서 `/`로 시작하는 경로가 슬래시 명령 메뉴로 오인되지 않도록 수정.
- 게시물 글쓰기: 에디터 본문 변경 히스토리를 추가해 `Cmd/Ctrl+Z` 되돌리기와 `Cmd/Ctrl+Shift+Z`/`Ctrl+Y` 다시 실행을 지원.
## v1.5.88
- 게시물 글쓰기: 라이브 모드 인용 마지막 줄에서 아래 방향키로 외부 일반 문단을 만들고 커서를 이동하도록 수정.
- 라이브 편집기: 블록 아래 줄 삽입 이벤트의 포커스 대상 줄을 부모 에디터가 반영하도록 보강.
## v1.5.87
- 게시물 글쓰기: 라이브 모드 코드 블록 밖으로 커서가 이동하면 오른쪽 코드 블록 설정 패널이 닫히도록 수정.
- 라이브 편집기: 멀티라인 편집 영역의 실제 커서 원본 줄을 블록 패널 상태에 반영하도록 보강.
## v1.5.86
- 공개 본문: 기본 인용문 텍스트가 다크 모드에서 사이트 텍스트 색상을 따르도록 수정.
## v1.5.85
- 공개 SEO: 페이지 제목 뒤에 사이트 이름을 자동으로 붙이던 전역 title template 제거.
## v1.5.84
- 회원가입 모바일: 이메일 인증번호 입력창이 세로 flex 레이아웃에서 낮게 눌리지 않도록 수정.
## v1.5.83
- 공개 오른쪽 사이드바: 사이트 로고 컨테이너가 설명 텍스트에 밀려 가로로 줄어들지 않도록 수정.
## v1.5.82
- 공개 SEO: `/sitemap.xml` 동적 sitemap 라우트 추가.
- 공개 SEO: `/robots.txt` 라우트 추가 및 sitemap 위치 안내.
- sitemap: 공개 발행글·고정 페이지·글이 있는 태그 URL을 DB 기준으로 자동 생성하고, `noindex` 글은 제외하도록 정리.
## v1.5.81
- 게시물 글쓰기: 오른쪽 사이드의 `대표 이미지 표시` 토글을 대표 이미지 유무와 상관없이 항상 보이고 동작하도록 수정.
- 게시물 글쓰기: 대표 이미지가 나중에 추가되어도 미리 저장한 표시 설정이 유지되도록 수정.
## v1.5.80
- 게시물 이미지 업로드: 본문 첨부 이미지까지 카드 썸네일을 생성하지 않도록 업로드 시점 자동 생성을 제거.
- 게시물 저장: 대표 이미지가 설정된 경우에만 목록 카드용 WebP 썸네일을 생성하도록 수정.
- 관리자 미디어: 원본 이미지 상세에서 카드 썸네일을 생성·다시 생성할 수 있는 버튼과 API 추가.
- 게시물 글쓰기: 대표 이미지를 게시물 상세 본문 상단에 표시할지 선택하는 `본문 상단 대표 이미지` 옵션 추가. 기본값은 표시 안 함.
- 공개 게시물 상세: `본문 상단 대표 이미지` 옵션이 켜진 게시물에서만 제목 아래 대표 이미지를 표시하도록 수정.
## v1.5.79
- 관리자 미디어: 게시물 카드 썸네일을 일반 미디어 목록에서 분리해 `카드 썸네일` 탭으로 표시하도록 수정.
- 관리자 미디어: 카드 썸네일도 원본 대표 이미지 사용처에 연결해 사용 중으로 판정하도록 수정.
- 관리자 미디어: 원본 대표 이미지에 카드 썸네일이 없으면 목록에서 원본을 불러오는 상태를 `원본` 배지와 상세 상태로 구분하도록 추가.
- 관리자 미디어: 카드 썸네일 폴더 이동·파일명 변경을 차단하고, 사용 중인 카드 썸네일 삭제를 차단하도록 보강.
## v1.5.78
- 게시물 이미지 업로드: JPG·PNG·WebP 업로드 시 목록 카드용 WebP 썸네일 자동 생성 추가.
- 공개 목록 API: 생성된 카드 썸네일이 있으면 `featuredImageThumbnail`로 함께 내려주도록 추가.
- 메인 Featured·Latest, 게시물 목록, 태그 목록: 카드 이미지는 썸네일을 우선 사용하고 없으면 원본 대표 이미지로 대체하도록 수정.
- 기존 업로드 이미지용 `npm run images:backfill-post-thumbnails` 백필 명령 추가.
## v1.5.77
- 메인 화면 Latest 목록: 기존 썸네일 레이아웃은 유지하고, 요약 영역이 메타 정보를 밀어내지 않도록 수정.
- 메인 화면 Latest compact 모바일: 썸네일을 본문 정보 높이에 맞춘 80px 정사각형으로 표시하도록 수정.
- 메인 화면 Latest placeholder 썸네일: 모바일에서 제목을 3줄로 제한하고 긴 단어가 썸네일 밖으로 넘치지 않도록 수정.
- 메인 화면 Latest list 보기: 긴 설명이 과하게 늘어나지 않도록 최대 2줄로 조정.
## v1.5.76
- 관리자 사이트 설정: 좌측 내비 아이콘을 브랜드·사이트 정보·POST 설정·사이트 코드·Ads·SNS 정보·게시물보내기·가져오기 항목에 추가.
## v1.5.75
- 게시물 글쓰기: 오른쪽 설정 패널 하단에 단어 수·공백 제외 문자 수·공백 수·예상 읽기 시간·블록 수·이미지 수 통계 추가.
- 게시물 글쓰기: 본문 통계를 삭제 버튼 위의 작은 정보 영역으로 표시하도록 추가.
## v1.5.74
- 사이트 설정 Ads: 게시물 왼쪽 사이드 광고 슬롯 추가.
- 공개 게시물 화면: 오른쪽 TOC 사이드바에서는 공통 사이드 광고를 숨기고, 데스크톱 왼쪽 사이드바 하단에 게시물 전용 광고를 표시하도록 수정.
- 게시물 본문: 인아티클 광고를 글 길이에 따라 짧은 글 0회, 중간 글 1회, 긴 글 최대 2회까지 삽입하도록 조정.
## v1.5.73
- 사이트 설정 Ads: 게시물 인아티클 광고 슬롯 추가.
- 게시물 본문: 충분히 긴 글에서 전체 블록 40% 근처 일반 문단 뒤에 인아티클 광고를 한 번 삽입하도록 추가.
- 사이트 설정 저장소: 게시물 인아티클 광고 코드 컬럼과 관리자 입력 검증 추가.
## v1.5.72
- 사이트 설정 Ads: 메인 인피드 광고 슬롯 추가.
- 메인 화면: Latest 게시물 목록 사이 한 곳에 인피드 광고를 무작위 삽입하도록 추가.
- 사이트 설정 저장소: 메인 인피드 광고 코드 컬럼과 관리자 입력 검증 추가.
## v1.5.71
- 사이트 설정: 위치별 광고 코드를 관리하는 Ads 카드 추가.
- 공개 화면: 메인 Featured·Latest 사이, 오른쪽 사이드 하단, 게시물 본문 상단·하단 광고 슬롯 추가.
- 사이트 설정 저장소: 광고 슬롯 코드 컬럼과 관리자 입력 검증 추가.
## v1.5.70
- 게시물 글쓰기: 라이브 모드 마지막 줄 `!!!` Enter 콜아웃 단축 생성 시 본문 빈 줄을 두 줄로 만들도록 수정.
- 게시물 글쓰기: 라이브 콜아웃·인용 내부 `Cmd/Ctrl+A` 후 Delete가 선택 범위를 실제 본문 삭제로 반영하도록 Selection Bridge Range 교차 판정 수정.
- 게시물 글쓰기: 라이브 인용·콜아웃 줄바꿈 직후 한글 첫 글자 자모 분리 방지를 위해 plain text 멀티라인 Enter 삽입 경로 정리.
## v1.5.69
- 게시물 글쓰기: 라이브 인용·콜아웃 멀티라인 본문 Enter 줄바꿈이 끝 줄에서 잘리지 않도록 contenteditable 읽기 옵션 보강.
- 게시물 글쓰기: 라이브 인용·콜아웃에서 `Cmd+Shift+K` 줄 삭제·Backspace 병합 직후 오래된 DOM이 다시 커밋되지 않도록 구조 변경 stale blur 차단 추가.
## v1.5.68
- 게시물 글쓰기: 라이브 모드 Shift+위/아래 선택 확장을 커서 위치 기준으로 보강. 단일 줄 블록에서는 커서가 중간에 있어도 인접 블록 같은 열까지 선택 확장.
- 게시물 본문: Obsidian식 `$H_2O$`, `$2^8$`, `$_B^AR$` 위첨자·아래첨자 인라인 렌더링 추가.
## v1.5.67
- 게시물 글쓰기: 라이브 모드 Shift+방향키 블록 경계 선택 확장 보강. 줄 범위 기반 블록 탐색·선택 포커스 경계 판별·Shift+방향키 블록 이동 충돌 제거.
- 게시물 글쓰기: 라이브 모드 교차 블록·전체 선택 후 Backspace/Delete/Cmd+X 삭제를 마크다운 본문에 반영하도록 Selection Bridge 삭제 경로 추가.
## v1.5.66
- 게시물 글쓰기: 라이브 모드 Selection Bridge 추가. Shift+방향키로 서로 다른 문단·블록 범위 선택 확장 지원.
- 게시물 글쓰기: 라이브 모드 `Cmd/Ctrl+A` 1회는 현재 블록 전체, 2회는 본문 전체 선택으로 단계화.
- 게시물 글쓰기: 라이브 미리보기 루트 포커스에서 `Cmd/Ctrl+A`로 본문 전체 선택 지원.
## v1.5.65
- 게시물 글쓰기: 라이브 인용·콜아웃·코드·토글 본문에서 한글 조합 확정 Enter의 `keydown`이 전달되지 않고 `keyup`만 남는 경우에도 줄바꿈이 즉시 실행되도록 수정.
## v1.5.64
- 게시물 글쓰기: 라이브 모드에서 Shift+방향키 범위 선택과 `Cmd/Ctrl+A` 전체 선택이 블록 이동 단축키에 가로막히던 문제 수정.
## v1.5.63
- 게시물 글쓰기: 라이브 모드 공통 편집기의 한글 IME 조합 중 Enter 처리를 문단·빈 줄·제목·목록·토글 제목·인용·콜아웃·코드·토글 본문 전체에 동일하게 적용.
- 게시물 글쓰기: 한글 글자 조합 확정 Enter 직후에도 해당 블록의 줄바꿈·블록 분리·다음 필드 이동 동작이 한 번에 이어지도록 수정.
## v1.5.62
- 게시물 글쓰기: 라이브 모드에서 줄 병합(Backspace) 후 Enter로 다시 나눌 때 이전 블록 DOM이 남아 본문이 중복·통째 줄로 커밋되던 문제 수정.
## v1.5.61
- 게시물 글쓰기: 콜아웃 본문 첫 줄이 빈 줄일 때 소스·라이브 전환 후 `focusEditableAtLine`이 멀티라인 편집 영역 전체를 비워 본문이 사라지던 문제 수정.
## v1.5.60
- 게시물 글쓰기: 라이브 콜아웃·코드·인용 등 멀티라인 편집 영역 Enter를 브라우저 기본 DOM 줄 생성 대신 텍스트 줄바꿈 삽입으로 처리하도록 수정.
- 게시물 글쓰기: 라이브 fenced 블록 편집 반영 시 현재 문서의 닫는 fence 줄을 다시 찾아 오래된 줄 범위로 본문이 유실될 수 있던 문제 수정.
- 게시물 글쓰기: 콜아웃 첫 줄 앞에 빈 줄을 만든 뒤 소스·라이브 모드를 오갈 때 본문 보존을 보강.
## v1.5.59
- 게시물 글쓰기: 라이브 멀티라인 블록 편집 텍스트를 `
` HTML 대신 원문 텍스트와 `pre-wrap`으로 복원하도록 수정.
- 게시물 글쓰기: 콜아웃 첫 줄이 빈 줄인 상태에서 소스·라이브 모드를 오가면 본문이 사라질 수 있던 문제 수정.
## v1.5.58
- 게시물 글쓰기: 라이브 인용 첫 글자 앞 Backspace 시 인용 블록을 일반 문단으로 되돌리도록 수정.
- 게시물 글쓰기: 라이브 코드·인용·콜아웃·토글 블록 맨 위에서 위 방향키로 외부 기본 문단을 만들며 빠져나오도록 추가.
- 게시물 글쓰기: 라이브 멀티라인 블록 편집 중 부모 모델 갱신이 포커스 중인 편집 DOM을 덮어써 내용이 사라질 수 있던 문제 수정.
## v1.5.57
- 게시물 글쓰기: 라이브 모드 인용을 줄 단위 편집 대신 단일 멀티라인 편집 영역으로 변경.
- 게시물 글쓰기: 라이브 문단에서 `>` 입력 시 인용 블록으로 즉시 전환되도록 추가.
- 게시물 글쓰기: 라이브 코드 블록 본문 입력 중 줄 번호와 원본 마크다운이 즉시 동기화되도록 수정.
- 게시물 글쓰기: 라이브 콜아웃 본문 입력 중 원본 마크다운이 즉시 동기화되도록 수정.
- 게시물 글쓰기: 콜아웃 등 멀티라인 블록 내부 두 번째 줄 이후 맨 앞 Backspace가 본문을 중복 병합하던 문제 수정.
## v1.5.56
- 게시물 글쓰기: 소스 모드 코드·콜아웃·토글 선언 줄에서 라이브 모드로 전환해도 실제 본문 줄로 포커스가 복원되도록 수정.
- 게시물 글쓰기: 라이브 모드 마지막 코드·콜아웃·토글 본문에서 아래 방향키로 외부 기본 문단을 만들며 빠져나오도록 수정.
- 게시물 글쓰기: 닫히지 않은 코드 펜스가 아래 콘텐츠를 코드 블록으로 삼키지 않도록 수정.
- 게시물 글쓰기: 라이브 모드 문단에서 ``` 또는 `!!!` 입력 후 Enter로 코드 블록·콜아웃을 빠르게 만들 수 있도록 추가.
- 게시물 글쓰기: 소스·라이브 모드 `Cmd/Ctrl+K` 링크 삽입 단축키 추가.
- 게시물 본문: 인용문을 배경 카드형 대신 왼쪽 세로 막대형 기본 스타일로 변경.
- 게시물 본문: 콜아웃 색상별 보더 표시 추가.
## v1.5.55
- 게시물 글쓰기: 소스 모드 `Cmd+Shift+K` 현재 줄 삭제 단축키 복구.
- 게시물 글쓰기: 라이브 모드 미리보기 루트 포커스 상태에서도 `Cmd+Shift+K`가 현재 원본 줄을 삭제하도록 보강.
- 게시물 글쓰기: 선택 범위가 걸친 소스 모드 여러 줄 삭제 처리 추가.
## v1.5.54
- 게시물 글쓰기: 콜아웃 레이아웃을 아이콘·제목 헤더와 본문 줄바꿈 구조로 변경.
- 게시물 글쓰기: 콜아웃 제목 옵션을 오른쪽 블록 설정 패널에 추가.
- 게시물 글쓰기: 콜아웃 선언부 `title` 옵션 저장·파싱 추가.
- 게시물 글쓰기: 새 콜아웃 기본 아이콘 표시를 사용하지 않도록 변경.
## v1.5.53
- 게시물 글쓰기: 라이브 모드 콜아웃 본문을 단일 멀티라인 편집 영역으로 정리해 `Shift+방향키` 범위 선택이 내부 여러 줄을 가로지르도록 수정.
- 게시물 글쓰기: 콜아웃 아이콘 미사용 시 라이브 편집 화면의 `+` 자리 표시자를 숨기도록 수정.
- 게시물 글쓰기: 라이브·사용자 화면 콜아웃 아이콘을 모두 왼쪽 상단 정렬로 통일.
- 게시물 글쓰기: 라이브 모드 멀티라인 콜아웃에서 아래 방향키가 새 본문 줄을 만들지 않도록 보정.
## v1.5.52
- 게시물 글쓰기: 라이브 모드 fenced 블록의 원본 범위가 닫는 `:::` 다음 줄까지 포함되던 문제 수정.
- 게시물 글쓰기: 연속 콜아웃에서 위 콜아웃 편집 시 아래 콜아웃 선언 줄이 삭제되던 문제 수정.
- 게시물 글쓰기: 한글 조합 종료 직후 Enter 중복 이벤트를 전역 capture 단계에서 1회 차단하도록 보강.
## v1.5.51
- 게시물 글쓰기: 라이브 모드 인용·콜아웃에서 한글 조합 Enter가 줄 추가를 중복 실행하지 않도록 보정.
- 게시물 글쓰기: 라이브 모드 콜아웃 마지막 줄 아래 방향키가 새 본문 줄을 만들지 않도록 수정.
- 게시물 글쓰기: 라이브 모드 인용 마지막 줄 아래 방향키만 외부 문단을 만들도록 분리.
## v1.5.50
- 게시물 글쓰기: 라이브 모드 인용 Enter가 한글 조합 입력 뒤에도 내부 다음 인용 줄을 만들도록 수정.
- 게시물 글쓰기: 라이브 모드 인용 마지막 줄에서 아래 방향키로 외부 문단을 만들며 빠져나오도록 보강.
- 게시물 글쓰기: 라이브 모드 콜아웃 본문을 줄 단위 편집으로 전환하고 한글 조합 Enter 중복 줄 생성 문제를 완화.
## v1.5.49
- 게시물 글쓰기: 라이브 모드 `Cmd+Shift+K`가 코드·콜아웃·토글 블록 내부 현재 줄을 삭제하도록 수정.
- 게시물 글쓰기: 코드·콜아웃·토글 블록 내부 마지막 본문 줄에서 `Cmd+Shift+K`를 누르면 fenced 블록 전체를 삭제하도록 수정.
- 게시물 글쓰기: 콜아웃 라이브 편집에서 내부 줄 삭제와 마지막 줄 아래 방향키 이탈 이벤트가 부모 에디터로 전달되도록 수정.
- 게시물 글쓰기: 라이브 슬래시 명령 Enter 적용 시 키 이벤트 전파를 더 강하게 차단해 한글 IME 입력 잔여 문자가 블록 본문에 남을 가능성을 줄임.
## v1.5.48
- 게시물 글쓰기: 상단 상태 표시에서 외부 이동 아이콘과 게시물 링크 이동 기능 제거.
- 게시물 글쓰기: 상단 상태 영역은 현재 상태 텍스트만 표시하도록 정리.
## v1.5.47
- 공개 RSS 피드: 게시물 대표 이미지 또는 OG 이미지를 `media:thumbnail`·`media:content`로 포함하도록 추가.
- 공개 RSS 피드: 상대 이미지 경로를 사이트 URL 기준 절대 URL로 변환하도록 추가.
- 공개 RSS 피드: Media RSS 네임스페이스 선언 추가.
## v1.5.46
- 게시물 글쓰기: 콜아웃 배경색에서 분홍 옵션 제거.
- 게시물 글쓰기: 콜아웃 배경색을 인용 블록과 같은 색상 팔레트로 통일.
- 게시물 글쓰기: 라이브 모드 방향키 이동 시 콜아웃·인용 블록 선언 줄에 커서가 걸려 사라지던 문제 수정.
- 게시물 글쓰기: 작은 화면에서 게시물 설정 패널이 본문 폭을 압축하지 않도록 고정 오버레이로 표시.
## v1.5.45
- 게시물 글쓰기: 인용 블록 기본 배경색을 회색으로 변경.
- 게시물 글쓰기: 인용 블록 배경색 선택에서 분홍 옵션 제거.
- 게시물 글쓰기: 인용 블록 오른쪽 설정 패널의 색상 배지를 실제 인용 블록 색상과 동일하게 수정.
- 게시물 글쓰기: 라이브 모드에서 콜아웃·인용 블록에 포커스가 들어오면 오른쪽 블록 설정 패널이 열리도록 수정.
- 게시물 글쓰기: 라이브 모드 콜아웃 내부 설정 모달을 제거하고 소스 모드와 같은 오른쪽 패널 방식으로 통일.
## v1.5.44
- 관리자 사이트 설정: 블로그 제목·설명 읽기 화면을 라벨/값 세로 행 레이아웃으로 정리.
- 관리자 사이트 설정: 사이트 정보 읽기 화면에서 로고 등록 상태 텍스트를 제거하고, 미등록 시 점선 박스로 표시하도록 수정.
- 관리자 사이트 설정: 사이트 코드 읽기 화면을 가로 3분할 대신 라벨/값 세로 행 레이아웃으로 정리.
- 관리자 사이트 설정: 읽기 행의 라벨·값을 14px 일반 두께로 통일하고 행 내부 세로 중앙 정렬을 맞춤.
## v1.5.43
- 공개 RSS 피드: `/rss.xml`, `/feed.xml`, `/rss` 경로 추가.
- 공개 RSS 피드: 최근 공개 발행글 최대 50개를 RSS 2.0 XML로 응답하도록 추가.
- 사이트 설정 SNS 프리셋: RSS 기본 주소를 실제 피드 경로 `/rss.xml`로 변경.
## v1.5.42
- 공개 오른쪽 사이드바: 직접 SVG SNS 아이콘도 기존 프리셋 아이콘과 같은 16px 크기와 중앙 정렬로 표시되도록 수정.
## v1.5.41
- 관리자 사이트 설정: SNS 링크가 JSONB 배열이 아닌 JSON 문자열로 저장되어 저장 후 목록이 비어 보이던 문제 수정.
- 관리자 사이트 설정: 기존에 잘못 저장된 SNS 링크 JSON 문자열을 배열로 복구하는 DB 마이그레이션 추가.
- 관리자 사이트 설정: SNS 편집 UI에서 불필요한 이름 입력칸을 제거하고 아이콘·주소 중심 레이아웃으로 정리.
## v1.5.40
- 관리자 사이트 설정: SNS 링크 주소 입력 시 `https://`를 생략해도 자동 보정되도록 수정.
- 관리자 사이트 설정: SNS 아이콘 프리셋에 `직접 SVG` 옵션을 추가해 새 SNS 아이콘을 코드 수정 없이 등록할 수 있도록 수정.
- 관리자 사이트 설정: SNS 링크 편집에서 표시 이름과 사용자 SVG 아이콘 입력을 지원하도록 추가.
- 공개 오른쪽 사이드바: 사용자 지정 SVG SNS 아이콘을 FOLLOW 영역에 표시하도록 수정.
## v1.5.39
- 관리자 사이트 설정: 일반 섹션에 SNS 정보 카드 추가.
- 관리자 사이트 설정: SNS 링크를 아이콘 프리셋과 주소 조합의 목록형으로 입력·저장할 수 있도록 추가.
- 공개 오른쪽 사이드바: 사이트 설정에 등록된 SNS 링크만 FOLLOW 영역에 표시하도록 수정.
- DB: `site_settings.social_links` JSONB 컬럼 추가.
## v1.5.38
- 관리자 사이트 설정: 어나운스 바 배경색을 프리셋뿐 아니라 직접 hex 색상으로 선택·입력할 수 있도록 수정.
- 관리자 사이트 설정: 어나운스 바 텍스트 정렬을 중앙 또는 왼쪽으로 선택할 수 있도록 추가.
- 공개 어나운스 바: 설정된 배경색과 텍스트 정렬을 반영하도록 수정.
- 게시물 글쓰기: 한글 IME 조합 입력 중 코드·콜아웃·토글 블록 설정 패널이 줄바꿈 뒤 닫히지 않도록 보강.
- DB: `site_settings.announcement_alignment` 컬럼 추가.
## v1.5.37
- 게시물 글쓰기: 콜아웃 블록 오른쪽 설정 패널에서 아이콘 표시 여부·아이콘·배경색을 수정할 수 있도록 추가.
- 게시물 글쓰기: 코드 블록 오른쪽 설정 패널에서 언어와 줄번호 표시 여부를 수정할 수 있도록 추가.
- 게시물 글쓰기: 토글 블록 오른쪽 설정 패널에서 기본 펼침·닫힘 상태를 선택할 수 있도록 추가.
- 콘텐츠 파일 카드: 파일명 반복 표시를 줄이고 제목에는 확장자 포함 파일명을, 보조 영역에는 용량 중심 정보를 표시하도록 수정.
## v1.5.36
- 관리자 사이트 설정: 메인 화면 아래 브랜드 컬러 설정 카드 추가.
- 공개 화면: 사이트 설정의 브랜드 컬러를 `--site-accent`에 반영하도록 수정.
- 게시물 글쓰기: 인용문(`>`) 블록에서도 배경색 프리셋을 선택할 수 있도록 추가.
- DB: `site_settings.brand_color` 컬럼 추가.
## v1.5.35
- 관리자 대시보드: 검색·SNS·직접·기타 유입 정보 카드 추가.
- 관리자 대시보드: 디바이스·OS별 방문 집계와 유입 키워드 목록 추가.
- 관리자 대시보드: 인기 게시물에 월간 조회수와 작성일 표시 추가.
- Analytics: 페이지뷰 수집 시 referrer·현재 URL을 받아 유입원과 키워드를 집계하도록 추가.
- DB: `analytics_traffic_daily`와 유입 중복 방문자 집계 컬럼 추가.
## v1.5.34
- 공개 화면: Nuxt 전역 404/오류 페이지 추가.
- 사이트 설정: `ads.txt`, 공통 헤더 코드, 공통 푸터 코드 입력·저장 추가.
- 공개 응답: `/ads.txt` text/plain 응답과 공개 HTML 헤더·푸터 코드 삽입 플러그인 추가.
- 외부 위젯: gethomepage customapi 연동용 `/api/homepage-widget` 요약 API 추가.
- DB: `site_settings.ads_txt`, `custom_head_code`, `custom_footer_code` 컬럼 추가.
## v1.5.33
- 관리자 사이트 설정: 최근 내보내기 작업이 준비 완료 상태일 때 상단 상태 배지를 숨기도록 수정.
## v1.5.32
- 관리자 사이트 설정: 최근 내보내기 작업 카드에서 요청일·목표 용량·분할 설정 표시를 제거하고 만료일만 표시하도록 정리.
- 관리자 사이트 설정: 완료된 내보내기 작업은 진행도 영역을 숨기고 대기·생성 중 작업에서만 진행도를 표시하도록 수정.
- 관리자 사이트 설정: 내보내기 파일 목록을 체크 선택 방식으로 바꾸고 전체 선택·선택 파일 다운로드 기능 추가.
## v1.5.31
- 관리자 사이트 설정: 게시물 내보내기 요청 설정 카드와 최근 내보내기 작업 다운로드 카드를 분리.
- 관리자 사이트 설정: 최근 내보내기 작업은 작업이 있을 때만 별도 카드로 표시하도록 수정.
## v1.5.30
- 관리자 사이트 설정: 메인 화면 커버 읽기 모드 프리뷰가 카드 너비를 벗어나던 레이아웃 수정.
- 관리자 사이트 설정: 게시물 Import/Export 통합 영역을 `게시물 내보내기`와 `게시물 가져오기` 독립 카드로 분리.
- 관리자 사이트 설정: 게시물 가져오기는 ZIP 선택 후 `적용` 버튼을 눌러 실행되도록 수정.
- 관리자 사이트 설정: 내보내기·가져오기 상세 조작은 각 카드 버튼을 눌렀을 때만 펼쳐지도록 정리.
## v1.5.29
- 관리자 사이트 설정: 메인 화면 커버를 라이트모드·다크모드 상하 개별 프리뷰로 표시하도록 수정.
- 관리자 사이트 설정: 커버 이미지가 비어 있는 모드는 점선 드롭존으로 표시하고 파일 선택·드래그 앤 드롭 업로드를 지원하도록 추가.
- 관리자 사이트 설정: 타임존 준비 중 섹션을 제거하고 `기타 설정` 명칭을 `사이트 정보`로 변경.
## v1.5.28
- 게시물 Import: Obsidian에서 흔히 쓰는 YAML 블록 배열(`tags:\n- tag`) 형태를 읽을 수 있도록 frontmatter 파서 보강.
- 게시물 Import: ZIP 내부에서 찾지 못한 자산을 조용히 무시하지 않고 Import 결과 경고로 반환하도록 수정.
- 관리자 사이트 설정: Import 완료 후 누락 자산 등 경고 목록을 표시하도록 수정.
## v1.5.27
- 게시물 Import: Export ZIP을 업로드해 Markdown frontmatter 기반 게시물로 복원하는 관리자 API 추가.
- 게시물 Import: ZIP 내부 `images/`·`files/` 자산을 `/uploads/posts/YYYY/MM/`로 저장하고 본문 경로를 새 URL로 재매핑하도록 추가.
- 게시물 Import: 기존 슬러그와 충돌하면 덮어쓰지 않고 `-2`, `-3` 식 새 슬러그로 가져오도록 정리.
- 관리자 사이트 설정: Import 패널에서 ZIP 선택, Import 진행 상태, 완료 요약을 표시하도록 수정.
## v1.5.26
- 관리자 사이트 설정: 게시물 Import/Export 섹션 기본 화면을 요청 버튼과 최근 작업 중심으로 축소.
- 관리자 사이트 설정: Export 범위·분할 설정은 `Export 요청` 버튼을 눌렀을 때만 펼쳐지도록 수정.
- 관리자 사이트 설정: Import 영역은 `Import 하기` 버튼을 눌렀을 때 접힌 안내 패널로 표시하도록 정리.
- 관리자 사이트 설정: 구역 이동·Export 범위 셀렉트의 화살표 SVG와 오른쪽 간격 통일.
## v1.5.25
- 게시물 Export: 분할 ZIP 계획을 고정 100개 단위가 아니라 목표 ZIP 용량 기준으로 나누도록 수정.
- 게시물 Export: 설정 화면에서 목표 ZIP 용량과 ZIP당 최대 게시물 수를 지정할 수 있도록 추가.
- 게시물 Export: 작업 레코드에 `max_file_size_bytes`, `error_detail` 저장 추가.
- 게시물 Export: 실패 작업 카드에서 상세 오류 원인을 확인할 수 있도록 추가.
## v1.5.24
- 게시물 Export: 준비 완료 분할 파일을 브라우저에서 순차적으로 일괄 다운로드하는 버튼 추가.
- 게시물 Export: 실패한 작업을 준비 완료 파일은 유지한 채 실패 지점부터 재시도할 수 있도록 추가.
- 게시물 Export: 완료 시 Resend 설정이 있으면 요청 관리자 이메일로 준비 완료 알림을 보내도록 추가.
- 게시물 Export: 만료된 완료·실패 작업과 생성 ZIP 파일을 작업 목록 조회·새 요청 시 자동 정리하도록 추가.
## v1.5.23
- 게시물 Export: 전체·특정년·특정월·직접 지정 날짜 범위 백업 요청 추가.
- 게시물 Export: 작업 레코드에 `date_from`, `date_to`, `range_label` 저장 추가.
- 게시물 Export: 날짜 범위 기준 게시물만 분할 ZIP 대상에 포함하도록 수정.
- 관리자 사이트 설정: Export 요청 카드에 범위 선택 UI 추가.
- 관리자 사이트 설정: 완료·실패한 Export 작업과 생성 ZIP 파일을 삭제할 수 있도록 추가.
## v1.5.22
- 게시물 Export: 대기 작업을 백그라운드에서 실제 ZIP 파일로 생성하는 서버 실행부 추가.
- 게시물 Export: 게시물별 폴더와 `제목.md`, 내부 `images/`·`files/` 자산 폴더를 ZIP에 포함하도록 추가.
- 게시물 Export: 내부 `/uploads` 이미지·파일 URL을 ZIP 내부 상대 경로로 재작성하도록 추가.
- 게시물 Export: 준비 완료된 분할 ZIP 파일을 관리자 다운로드 API로 내려받을 수 있도록 추가.
- 관리자 사이트 설정: 대기 중·생성 중 Export 작업이 있으면 Export 요청 버튼을 비활성화하도록 수정.
## v1.5.21
- 게시물 Export: 작업 진행 확인용 `processed_count`, `current_part_index`, `progress_message`, `started_at` 컬럼 추가.
- 관리자 사이트 설정: Export 작업 카드에 진행 숫자, 진행률 바, 진행 설명, 마지막 갱신 시각 표시 추가.
- 관리자 사이트 설정: 대기 중·생성 중 Export 작업이 있으면 작업 목록을 5초 간격으로 자동 새로고침하도록 수정.
- 게시물 Export: 실제 zip 생성 워커가 붙으면 `1201 / 30002` 같은 진행도가 표시되도록 기반 정리.
## v1.5.20
- 게시물 Export: 백그라운드 작업 요청용 `post_export_jobs`와 분할 파일 계획용 `post_export_files` 테이블 추가.
- 게시물 Export: 관리자 API에서 최근 Export 작업 목록 조회와 새 Export 작업 요청을 지원하도록 추가.
- 관리자 사이트 설정: 게시물 Import/Export 섹션에서 Export 요청, 최근 작업, 분할 파일 계획을 확인할 수 있도록 수정.
- 게시물 Export: zip 생성 워커·이메일 알림·다운로드 연결 전 1차 작업 등록 단계로 정리.
## v1.5.19
- 게시물 Export: 대용량 게시물 환경을 고려해 백그라운드 분할 생성, 이메일 완료 알림, 분할/일괄 다운로드, 100일 보존 정책 방향 문서화.
## v1.5.18
- 게시물 Import/Export: 백업 목적에 맞게 게시물별 폴더와 로컬 자산 폴더를 포함하는 Obsidian 호환 번들 구조로 방향 수정.
## v1.5.17
- 관리자 사이트 설정: 읽기 모드의 POST·어나운스 토글을 켜진 상태여도 조작 불가로 보이도록 비활성 톤 강화.
- 게시물 Import/Export: Obsidian 호환 Markdown frontmatter 기반 1차 구현 방향 문서화.
## v1.5.16
- 공개 게시글 TOC: 본문 스크롤 위치에 맞춰 현재 제목 항목을 시각적으로 강조하도록 수정.
- 공개 게시글 TOC: 목차 항목이 많을 때 TOC 영역이 자체 스크롤되며 활성 항목을 자동으로 따라가도록 수정.
- 공개 댓글: 댓글·답글 등록 버튼이 입력값이 있을 때만 활성화되도록 수정.
- 공개 댓글: 정렬 라벨 한글화와 답글 입력 영역 스타일 정리 사용자 편집분 반영.
## v1.5.15
- 공개 헤더: 비로그인 상태의 사용자 메뉴 기본 아바타도 `?` 텍스트 대신 사람 아이콘으로 표시하도록 수정.
## v1.5.14
- 공개 헤더: 로그인 사용자의 아바타 이미지가 없을 때 이니셜 대신 사람 아이콘을 표시하도록 수정.
- 공개 게시글 상세: 모바일처럼 오른쪽 사이드바가 하단으로 내려가는 화면에서는 TOC를 숨기도록 수정.
- 관리자 미디어: 검색창을 글·멤버 검색과 같은 아이콘 포함 입력 스타일로 통일.
- 관리자 미디어: 미디어 라이브러리에서 파일 직접 추가 버튼을 추가하고, 현재 폴더 업로드 시 해당 폴더로 배치되도록 수정.
- 관리자 미디어: 현재 검색·필터 결과 기준 전체 선택과 선택 삭제 기능 추가.
## v1.5.13
- 공개 게시글 TOC: 목차 클릭 시 기본 해시 점프 대신 부드러운 스크롤로 이동하도록 수정.
- 공개 게시글 제목 앵커: 고정 상단 헤더 높이와 여백을 반영한 scroll margin으로 이동 위치를 안정화.
## v1.5.12
- 공개 게시글 상세: 오른쪽 사이드바의 Recommended 영역을 숨기고, 같은 위치에 H1~H3 기반 TOC를 표시하도록 수정.
- 공개 게시글 본문: H1~H3 제목에 TOC 링크용 앵커 ID를 부여하도록 수정.
- DB: 로컬 개발 DB에서 `zenn` 계정을 소유자로 보정하고 기존 비활성 소유자 계정을 일반 멤버로 정리.
## v1.5.11
- 관리자 멤버 상세: 기존 회원 진입 시 읽기 전용 보기 모드로 표시하고 상단 버튼을 `수정하기`로 변경.
- 관리자 멤버 상세: 수정 모드에서만 입력 필드·셀렉트를 편집 컨트롤로 표시하고, 변경 사항이 있을 때만 저장 버튼을 활성화하도록 수정.
- 관리자 멤버 상세: 저장·업로드·비밀번호 변경 오류/성공 피드백을 우측 상단 토스트로 통일.
- 관리자 멤버 목록: 검색창 스타일을 글 목록 검색창과 같은 테두리형 입력으로 통일.
## v1.5.10
- 관리자 멤버 상세: 소유자 본인, 관리자끼리 등 변경 불가한 등급 셀렉트는 UI에서 비활성화하도록 수정.
- 관리자 멤버 상세: 등급 변경 권한이 없는 세션에서는 멤버 등급을 일반 텍스트로 표시하도록 수정.
- 관리자 글 목록: 제목·슬러그·요약·본문·태그 기준 검색 입력 추가.
- 관리자 글 목록: 필터 셀렉트 화살표를 공통 SVG 아이콘과 오른쪽 여백으로 통일.
- 관리자 글 목록: 추천 표시와 제목 사이에 대표 이미지 썸네일 열 추가.
- 관리자 페이지 작성: HTML 문서 모드에서 빈 본문 또는 `!` 입력 후 Tab으로 기본 HTML 골격을 자동 완성하도록 추가.
## v1.5.9
- 관리자 대시보드: 페이지별 조회·방문자·체류·스크롤 통계 수집 및 인기 페이지 목록 추가.
- 공개 HTML 문서 페이지: Nuxt 클라이언트 통계를 거치지 않는 원문 HTML 응답도 서버에서 페이지 조회를 기록하도록 수정.
- 관리자 네비게이션 추천 사이트: 대체 텍스트와 썸네일 URL 입력 추가.
- 공개 오른쪽 사이드바 추천 사이트: 대체 텍스트가 있으면 URL 대신 표시하고, 썸네일이 있으면 파비콘 대신 표시하도록 수정.
- DB: 페이지 통계 테이블과 추천 사이트 메타데이터 컬럼 추가.
## v1.5.8
- 관리자 멤버 권한 변경: 소유자가 본인 권한을 직접 낮출 수 없도록 수정.
- 관리자 멤버 목록: 상태 열에 멤버 등급을 표시하고, 비활성 회원만 보조 상태로 표시하도록 수정.
- DB: 소유자가 없는 상태일 때 기존 관리자 중 가장 오래된 계정을 소유자로 복구하는 마이그레이션 추가.
## v1.5.7
- 관리자 페이지 작성/수정: 일반 텍스트 모드에서도 페이지 형식 선택창이 계속 보이도록 수정.
- 관리자 페이지 작성/수정: HTML 자산 업로드는 HTML 문서 모드에서만 보이도록 수정.
- 회원 활동 IP 기록: 로그인·회원가입·댓글·좋아요·이메일 OTP 요청에서 프록시 헤더(`x-forwarded-for`)를 포함해 요청 IP를 저장하도록 수정.
## v1.5.6
- 관리자 멤버 상세: 멤버 등급 선택이 즉시 저장되지 않고 저장 버튼으로만 반영되도록 수정.
- 회원 권한 변경 API: 소유자·관리자만 권한 변경 가능하도록 규칙 강화.
- 회원 권한 변경 API: 관리자는 다른 관리자·소유자를 조작할 수 없고, 소유자·관리자 등급을 부여할 수 없도록 수정.
- 회원 권한 변경 API: 마지막 소유자 권한이 사라지지 않도록 트랜잭션 잠금 안에서 검증하도록 수정.
## v1.5.5
- 회원 권한에 `VIP` 등급 추가.
- 공개 게시물 API: 멤버십 글은 로그인 여부가 아니라 VIP 이상 등급(`vip`/`admin`/`owner`)일 때만 조회되도록 수정.
- 관리자 멤버 상세: 멤버 등급 선택 UI 추가.
- 관리자 글쓰기: 멤버십 상태 안내 문구를 VIP 이상 공개 기준으로 수정.
- 관리자 미디어: 사용자 편집분을 포함해 썸네일 탭 문구를 프로필 이미지 기준으로 정리.
- DB: `users.user_role` 제약에 `vip`를 허용하는 마이그레이션 추가.
## v1.5.4
- 게시물 상태: `멤버십`, `비공개` 상태 추가.
- 공개 게시물 API: 멤버십 글을 공개 기본 목록에서 분리하도록 수정.
- 공개 게시물 API: 비공개 글은 사용자 화면과 공개 API에서 숨기도록 정리.
- 관리자 글쓰기: 상태 선택·툴바·목록 필터에 멤버십/비공개 상태 반영.
- 고정 페이지 상태: `초안`, `공개`, `비공개` 상태 추가.
- 공개 페이지 API/HTML 문서 응답: 공개 상태 페이지에서만 접근되도록 수정.
- 관리자 페이지 작성/목록: 페이지 상태 선택과 목록 상태 표시 추가.
- DB: 게시물·페이지 공개 상태 제약을 확장하는 마이그레이션 추가.
## v1.5.3
- 관리자 페이지 작성/수정: 새 페이지 기본 형식을 HTML 문서 모드로 변경.
- 관리자 페이지 작성/수정: 페이지 슬러그도 게시글처럼 한글 제목을 영문 슬러그로 자동 변환하도록 수정.
- 관리자 페이지 작성/수정: 페이지 형식의 `기본` 라벨을 `일반 텍스트`로 변경.
- 관리자 페이지 작성/수정: 대표 이미지 UI 제거 및 저장 시 페이지 대표 이미지를 사용하지 않도록 정리.
- 관리자 페이지 작성/수정: HTML 자산 업로드 버튼 추가, 업로드된 파일 URL을 HTML textarea 현재 커서 위치에 삽입하도록 추가.
- DB: `pages.render_mode` 기본값을 `html_document`로 변경하는 마이그레이션 추가.
## v1.5.2
- 관리자 페이지 작성/수정: 게시글 작성 화면과 같은 전체 화면 에디터, 상단 저장 툴바, 접이식 오른쪽 설정 패널 구조로 변경.
- 관리자 페이지 작성/수정: 페이지 형식 선택, Page URL, 대표 이미지, 삭제 액션을 오른쪽 설정 패널로 이동.
- 관리자 페이지 작성/수정: 기본 모드 본문 에디터를 게시글과 같은 Markdown-first 에디터로 통일.
- 관리자 레이아웃: 페이지 작성/수정 경로도 전체 화면 에디터 모드로 처리하도록 수정.
## v1.5.1
- 고정 페이지: 기본 Markdown 모드와 원문 HTML 문서 모드 선택 추가.
- 관리자 페이지 작성: HTML 문서 모드에서 전체 HTML 붙여넣기용 코드형 textarea 추가.
- 공개 페이지: HTML 문서 모드 페이지는 `/pages/:slug`에서 저장된 HTML을 `text/html` 원문으로 응답하도록 추가.
- DB: `pages.render_mode` 컬럼과 `markdown`/`html_document` 제약 추가.
## v1.5.0
- 관리자 글 목록: 태그 컬럼에 첫 번째 태그만 대표 태그로 표시하도록 수정.
- 관리자 글쓰기: 태그 입력 오른쪽 트리거를 기존 태그 제거가 아닌 메인 태그 선택 드롭다운으로 동작하도록 수정.
- 관리자 글쓰기: 기존 태그 부분 검색과 방향키·Enter 선택 추가.
- 관리자 글 목록·글쓰기: 태그 배지에 태그별 고유 색상 반영.
- 관리자 글쓰기: 게시물 설정 사이드바의 상태·태그 드롭다운 화살표와 닫기 버튼 아이콘 정리.
- 관리자 글·페이지 목록: 마지막 행 더보기 메뉴가 테이블 영역에 잘리던 문제 수정.
## v1.4.7
- 관리자 글쓰기 라이브 모드: 문단 이동(방향키) 시 굵게·기울임 등 인라인 마크다운이 사라지던 문제 수정.
- 콘텐츠 렌더러: 인용(`>`) 블록에 `> [!bg=색상]` 옵션 줄을 추가해 콜아웃과 같은 배경 프리셋 지정 지원.
- 관리자 글쓰기: 소스 모드에서 라이브 모드로 전환할 때 현재 커서 줄을 라이브 화면 중앙에 가깝게 스크롤하도록 보정.
## v1.4.6
- 관리자 설정: 로고 업로드가 저장 버튼 없이 즉시 DB에 반영되던 흐름을 파일 업로드 후 저장 버튼으로 반영하도록 수정.
- 관리자 설정: 메인 화면 커버에 다크모드 전용 이미지 필드 추가.
- 공개 홈: `HomeHero`가 라이트·다크 커버 이미지를 테마에 맞춰 교체 표시하도록 수정.
- DB: `site_settings.home_cover_dark_image_url` 컬럼 추가.
## v1.4.5
- 공개 게시글 상세: 게시물 메타 영역의 수정 시각 표시 제거, 글쓴이용 편집 링크는 요청 SVG 아이콘으로 교체.
- 공개 목록: 홈 Latest·게시물 목록·태그 목록에서 요약이 비어 있으면 본문에서 짧은 설명을 생성해 표시.
- 공개 목록: 목록용 설명은 수동 말줄임을 붙이지 않고 전용 `post-summary-clamp` 2줄/3줄 클래스가 실제 표시 줄 끝에서 처리하도록 보정.
- `composables/createPostSummary.js`: 게시물 요약·본문 fallback 공통 유틸 추가, 빈 단락 마커 HTML 주석은 요약에서 제거.
- 게시물 작성자: `posts.author_id` 마이그레이션 추가 및 owner/admin 단일 계정 환경에서만 기존 글 작성자 backfill.
- 관리자 게시물 저장: 새 글 작성 시 현재 관리자 세션 사용자 ID를 작성자로 저장하고, 기존 글 작성자가 비어 있으면 수정자 ID로 보정.
- 공개 게시글 상세: 관리자 여부가 아니라 로그인 회원 ID와 게시물 작성자 ID가 같을 때만 새 탭 편집 링크 표시.
- 공개 게시글 상세: 요약이 비어 있으면 본문에서 짧은 텍스트를 만들어 SEO·공유 설명에 사용.
- 회원 세션 API: 공개 화면 권한 분기를 위해 `isAdmin`, `role` 응답 필드 추가.
## v1.4.3
- `HomeHero`: 오버레이 본문 줄바꿈(`\n`)이 미리보기·홈에서도 보이도록 `whitespace-pre-line` 적용.
- 관리자 설정: 메인 화면 커버 편집 모드에서도 미리보기를 버튼 영역과 분리해 카드 폭 기준으로 크게 표시.
- 관리자 설정: 메인 화면 커버 미리보기를 실제 `HomeHero` 오버레이 구조로 표시해 긴 텍스트 줄바꿈도 공개 화면과 동일하게 확인하도록 수정.
- 관리자 설정: 메인 화면 커버 이미지 미리보기에서 이미지 폭만 360px로 제한되어 오른쪽이 비어 보이던 표시 문제 수정.
- 배포 TODO: 다음달 작업 대상으로 PostgreSQL·업로드 파일 백업/복구 시스템 설계 및 구현 항목 추가.
- 관리자 레이아웃: 공개 다크모드가 글쓰기 에디터 입력에 영향을 주지 않도록 라이트 폼 보정 스코프 축소.
- 관리자 레이아웃: 대시보드 메뉴를 `/admin` 활성 링크로 연결.
- 관리자 로그인: 일반 로그인과 동일한 다크 인증 스타일, 폼을 화면 오른쪽·내부 오른쪽 정렬.
- 관리자 대시보드: 통계 추이 막대 차트 높이·툴팁·기간별 묶음 집계 보정.
- 홈 Latest: 컴팩트 기본 보기, 리스트/컴팩트 표시 조건 수정, Featured·Latest UI 보정.
- 관리자 미디어: 종류 필터(전체·이미지·영상·음악·파일), 미사용 필터, 비디오 프레임 썸네일 추가.
- 배포 문서: NAS 운영 업데이트 절차 추가.
## v1.4.2
- 관리자 글쓰기: 소스 모드 긴 문장 자동 줄바꿈 시 라인 번호 높이를 실제 wrap 높이에 맞춰 보정.
- 관리자 글쓰기: 라이브 모드에서 소스 모드로 전환할 때 현재 포커스·화면 위치에 가까운 원본 줄로 커서와 스크롤 복원.
- 관리자 글쓰기: 소스 모드에서 라이브 모드로 전환할 때 현재 textarea 커서 줄을 라이브 편집 블록에 포커스하도록 보정.
- 콘텐츠 렌더러: 단독 이미지 파일 URL은 임베드가 아니라 이미지 블록으로 렌더링하도록 보정.
- 관리자 글쓰기: 라이브 모드 이미지 블록 hover/focus 시 편집·삭제 버튼 표시, 편집 버튼으로 기존 오른쪽 이미지 설정 패널 연결.
- `ProseImage`: URL 비어 있음·로드 실패 시 최소 높이 placeholder와 오류 안내 표시.
- 관리자 라이브 미리보기: 이미지 블록을 다른 이미지 블록에 드롭하면 `:::gallery`로 병합(`merge-images-to-gallery`).
- 관리자 라이브 미리보기: 갤러리 이미지를 블록 사이 삽입선에 드롭하면 단일 이미지 블록으로 분리(`extract-gallery-image`), 갤러리 1장 남으면 단일 이미지로 정리·0장이면 제거.
- 관리자 라이브 미리보기: 단독 이미지 URL 줄도 이미지 드래그 병합·갤러리 추가 대상으로 인식하도록 보정.
- 관리자 라이브 미리보기: 단일 이미지 블록을 기존 갤러리 셀에 드롭해 갤러리에 추가(`insert-image-to-gallery`).
- 콘텐츠 렌더러: 갤러리를 최대 3개 단위 행으로 나누고 이미지 자연 비율에 따라 셀 너비를 조정.
- 관리자 라이브 미리보기: 갤러리 블록도 포커스·방향키 이동·편집/삭제 버튼 접근이 가능하도록 보정.
- 관리자 라이브 미리보기: 갤러리 전체 편집/삭제 버튼을 개별 이미지 편집/삭제 버튼으로 변경.
- 관리자 글쓰기: 블록 설정 패널 바깥 클릭 시 닫힘, 갤러리 이미지 추가 미디어 모달 중 패널 유지.
- 콘텐츠 렌더러: 다크모드 기본 인용 블록 텍스트를 어두운 색으로 고정해 가독성 보정.
- 콘텐츠 렌더러: 공개 본문 리스트 번호·점 색상을 글쓰기 화면과 같은 파란 계열로 통일.
- 공개 레이아웃: 다크모드에서 좌우 사이드바 배경을 홈페이지 기본 배경(`--site-bg`)과 동일하게 통일.
- 배포 문서: NAS 운영 업데이트 절차(`git pull` → DB 마이그레이션 → `docker compose up -d --build`) 추가.
- 홈 Latest: 기본·Default 보기 방식이 컴팩트 형태로 보이도록 리스트/컴팩트 썸네일 표시 조건 수정.
- 홈 Featured: 대표 이미지 없는 추천 글 썸네일을 게시물 제목 placeholder로 통일.
- 홈 Latest: 게시물이 적을 때 보기 방식 메뉴가 잘리지 않도록 섹션 최소 높이 추가.
- 관리자 로그인: 일반 로그인과 같은 다크 인증 스타일을 적용하고, 관리자 구분용으로 폼을 오른쪽 배치 및 내부 오른쪽 정렬.
- 관리자 대시보드: 통계 추이 막대 차트가 보이지 않던 CSS 높이 비율 문제 수정.
- 관리자 대시보드: 통계 추이 막대 hover/focus 시 날짜와 정확한 값을 표시하는 툴팁 추가.
- 관리자 대시보드: 30일 이상 통계 추이 차트는 기간별 묶음 집계로 표시해 카드 폭 넘침 방지.
- 관리자 레이아웃: 사이드바 대시보드 항목을 비활성 표시에서 `/admin` 활성 링크로 변경.
- 관리자 레이아웃: 공개 사이트 다크모드가 관리자 입력·패널 색상에 영향을 주지 않도록 `admin-layout` 라이트 테마 스코프 추가.
- 관리자 글쓰기: 라이트 폼 컨트롤 보정이 글쓰기 에디터 입력까지 덮지 않도록 스코프 축소.
- 관리자 미디어: 미디어 라이브러리에 전체·이미지·영상·음악·파일 종류 필터 추가.
- 관리자 미디어: 게시물·페이지·사이트 설정·회원 프로필에서 참조되지 않는 미사용 미디어만 보는 필터 추가.
- 관리자 미디어: 비디오 항목은 초반 프레임을 브라우저에서 추출해 목록 썸네일로 표시.
## v1.4.1
- 관리자 미디어 업로드: 이미지·비디오·오디오·문서별 최대 크기 한도 분리(`MAX_VIDEO_FILE_SIZE` 등). 기본 비디오 200MB.
- 관리자 글쓰기: 업로드 크기 초과·API 413 시 토스트 오류 표시, 미디어 모달에 최대 용량 안내 추가.
- `lib/upload-size-limit.js`: 클라이언트 번들에서 `node:path` 제거(500·hydration 경고 수정).
- 임베드 저장 형식: 새 임베드 삽입·라이브 편집·레거시 블록 변환 시 `:::embed` 대신 단독 URL 한 줄로 저장하도록 통일, 단독 URL 줄도 블록 설정 패널 대상으로 인식.
- 관리자 글쓰기: 라이브 모드 임베드를 URL 입력 카드 없이 즉시 프리뷰로 표시, 임베드·비디오·오디오·파일 카드 삭제 버튼과 방향키 이동·삭제·아래 줄 추가 키보드 조작 지원.
- 관리자 글쓰기: 라이브 모드 제목 Enter 시 현재 제목 저장 후 아래 빈 문단 추가, 원문 편집 상태로 전환되던 흐름 수정.
- 관리자 글쓰기: 게시물 상단 제목 Enter 시 소스 모드 강제 전환 제거, 라이브 모드 상단 스크롤·본문 첫 줄 포커스 보정.
## v1.4.0
- 콘텐츠 렌더러: `:::video`, `:::audio`, `:::file` fenced block 파싱과 `ProseVideo`·`ProseAudio`·`ProseFile` 카드 렌더링 연결.
- 관리자 글쓰기: 슬래시 명령에 비디오·오디오·파일 블록 템플릿 추가.
- 임베드: X/Twitter iframe 폭·높이·외곽 여백 보정, Mastodon 공개 게시물 `/embed` 렌더링과 postMessage 기반 자동 높이 조절 추가.
- 관리자 글쓰기: 라이브/스타일 모드의 `:::embed` 블록에 URL 입력 카드와 적용 미리보기 전환 버튼 표시.
- 관리자 글쓰기: `/video`, `/audio`, `/file` 슬래시 명령을 미디어 선택·업로드 모달과 연결해 업로드 후 URL 자동 채우기 지원.
- 콘텐츠 렌더러: 단독 `http(s)` URL 한 줄을 `:::embed` 블록과 동일하게 자동 임베드 렌더링.
- 미디어 라이브러리: 이미지 외 비디오·오디오·문서 파일 업로드와 목록 표시 지원.
## v1.3.9
- NAS 마이그레이션: `psql`이 while 루프 stdin을 소비해 001만 처리되던 `migrate-production-db.sh` 버그 수정.
## v1.3.8
- NAS 마이그레이션: `.env.production`이 없을 때 `.env` 또는 실행 중 DB 컨테이너 환경 변수로 동작하도록 `migrate-production-db.sh` 보정.
## v1.3.7
- NAS 마이그레이션: npm 없는 NAS 호스트에서도 실행 가능한 `scripts/migrate-production-db.sh` 추가.
- 운영 문서: `db:migrate:prod:*` 안내를 `sh scripts/migrate-production-db.sh` 기준으로 수정.
## v1.3.6
- DB 마이그레이션: `schema_migrations` 적용 이력 관리와 `db:migrate:prod`, `db:migrate:prod:status`, `db:migrate:prod:baseline` 명령 추가.
- 운영 보호: 기존 운영 스키마가 있는데 적용 이력이 없으면 001부터 자동 실행하지 않고 baseline 안내 후 중단.
## v1.3.5
- 관리자 로그인: 자동완성 값 동기화·제출 중만 버튼 비활성. 운영 HTTP에서 Secure 쿠키 미저장으로 로그인 루프되던 문제 수정. `server/utils/session-cookie.js`로 path `/`·`x-forwarded-proto` Secure 통일.
- 통계: `lib/analytics-shared.js` 분리로 클라이언트 `node:crypto` 오류 수정. 통계 조회 시작일 JS 계산으로 `date >= integer` 오류 수정.
- 관리자 대시보드: 상단 요약 한 줄·7일~12개월 차트·접속자 목록(게시물 제목·유지시간). `trends` 일자별 0 채움.
- 통계 보관: 일별 집계 누적 보관, 방문자 해시 32일 초과 정리, 실시간 세션 90초 TTL.
## v1.3.4
- 통계 확장: 체류시간·스크롤 구간(25/50/75/100%)·실시간 접속 세션. 마이그레이션 `031_analytics_engagement_and_realtime.sql`.
- `POST /api/analytics/heartbeat`, `GET /admin/api/analytics/realtime`. 로그인 사용자는 닉네임·아바타·현재 경로로 접속자 목록 표시.
- 관리자 대시보드: 현재 접속자·평균 체류·50% 스크롤·실시간 접속자 목록·인기 글 참여 지표 추가.
## v1.3.3
- 자체 최소 통계: 일별 익명 방문자 해시·사이트/게시물 일별 집계. 마이그레이션 `030_analytics_daily_stats.sql`. 원문 IP·User-Agent 미저장.
- `POST /api/analytics/pageview`, `plugins/site-analytics.client.js`(pageview·15초+50% 스크롤 read).
- 관리자 대시보드: 오늘/7일 방문·30일 조회·인기 게시물 Top 5. `GET /admin/api/analytics/summary`, `GET /admin/api/analytics/posts`.
## v1.3.2
- 스플래시: `SITE_BRAND_LOGO_TEXT` localStorage 사용 중단·레거시 키 제거. 스플래시 문구는 사이트 제목, 이미지는 `SITE_BRAND_LOGO_URL`만 캐시.
- 관리자 설정 내비: 타임존·메인 화면·어나운스 바·Import/Export·스팸 필터 아이콘 추가.
- 어나운스 바: 클라이언트에서 숨김 여부 확인 후 아래로 슬라이드 인. 닫기·7일간 보지 않기 시 위로 슬라이드 아웃 후 제거(깜빡임 방지).
- 어나운스 바: X는 이번 방문(세션)만 숨김, `7일간 보지 않기` 텍스트 버튼으로 localStorage 7일 스누즈.
## v1.3.1
- 스팸 필터: 가입 금지 닉네임(`signupBlockedUsernames`) 설정·저장. 기본 admin, master, zenn, sori, sori.studio. 회원가입·프로필 닉네임 변경 시 검사, `zenn은 사용할 수 없는 단어입니다.` 형식 안내. 마이그레이션 `029_site_settings_signup_blocked_usernames.sql`.
## v1.3.0
- 관리자 사이트 설정 좌측 내비: `AdminSettingsNavIcon`·`iconId` 슬롯 추가. 블로그 제목·설명에 type-cursor 아이콘 연결, 나머지는 placeholder 틀.
- 관리자 POST 설정: 읽기 모드에서도 수정일 표시를 비활성화 토글 UI로 표시(켜짐/꺼짐 텍스트 제거).
- 어나운스 바: `site_settings` 필드·마이그레이션 `028_site_settings_announcement.sql`. 공개 상단 배너(`SiteAnnouncementBar`·`SiteTopChrome`), 닫기 시 `localStorage`·설정 변경 시 재노출.
- 관리자 설정「어나운스 바」: 사용 토글·맞춤 설정(문구·선택 링크·배경색 프리셋 검정/흰/브랜드).
## v1.2.9
- 홈 상단: Ghost형 헤딩·구독 폼 제거. 사이트 설정「메인 화면」에서 커버 이미지(720px)·오버레이 제목·본문 설정. `HomeHero.vue`, 마이그레이션 `027_site_settings_home_cover.sql`.
- 메인 화면 설정: 커버 업로드 시 제목·본문이 리셋되지 않도록 업로드는 파일만·저장 버튼에서 이미지·텍스트 일괄 `PUT` 반영.
- 테마 깜빡임: head 인라인 스크립트로 `data-theme` 선적용. 로딩 스플래시(`app.html`·캐시된 사이트 로고).
- 관리자 글 목록: 휴지통 대신 more vert 행 메뉴(추천·추천 제거·삭제).
- 관리자 태그 관리: 메인·일반 태그 모두 more vert 메뉴(수정·전환·제외·삭제).
- 관리자 공통 `AdminRowMoreMenu`·`useAdminRowMenu`: 페이지·미디어 폴더·네비게이션 삭제 UI 통일. 태그 메뉴 항목 좌측 정렬 수정.
- 홈 Latest 피드: List(썸네일+본문)·Compact(텍스트만)·Cards(2열) 보기 구분. 메뉴 List/Compact 선택값과 레이아웃 일치. Default 클릭 시 Compact로 전환. Cards 상단 여백·테두리 클리핑 수정.
- 게시물 카드: 대표 이미지 없을 때 썸네일 영역에 제목 텍스트 플레이스홀더(`PostCardMedia`). 홈 Latest·태그·게시물 목록 공통.
- 슬래시 메뉴: 키보드 ↓ 이동 시 scrollIntoView+mouseenter 충돌로 하단 항목이 반복 선택되던 문제 수정.
- 라이브 토글: 제목 Enter→본문 포커스, ↑↓는 토글 내부만 이동(한글 조합·스크롤 점프 보정).
- 라이브 토글: `ContentMarkdownToggleEditor`로 제목·본문 인라인 편집. `ProseToggle` 펼침·접힘 애니메이션(그리드 전환).
- 라이브 코드 블록: Enter 줄바꿈·줄번호 반영 수정(`
` 읽기). 마지막 줄 ↓로 블록 이탈·다음 문단 삽입.
- 콜아웃 설정: 이모지 7종 프리셋 선택, 직접 입력 제거. 아이콘 토글 UI 정리.
- 코드 블록: `ProseCodeBlock.vue`로 라이브·공개 스타일 통일(`#15171a`, 줄번호 gutter). 라이브 호버 시 Language·줄번호 토글. 공개 화면 언어 라벨 옆 복사 버튼.
- 라이브 콜아웃: 아이콘 호버·클릭 시 설정 모달(이모지·배경색).
- 라이브 모드 코드 블록: `pre` 단일 편집 영역으로 공개 화면과 높이 맞춤, ↑↓는 블록 첫·마지막 줄에서만 밖으로 이동.
- 라이브 모드: `- `·`> ` 마커만 있는 줄도 목록·인용 블록으로 인식. 코드·콜아웃 본문 인라인 편집 추가.
- 슬래시 콜아웃 기본 삽입을 `:::callout emoji=💡 bg=blue` 형식으로 변경.
- 소스(작성) 모드 textarea에 `/` 슬래시 명령 추가(미리보기와 동일). 상단 마크다운 툴바 제거.
- 라이브·소스 슬래시: 기본 제목은 h2·h3·h4만 노출. h1은 `/h1` 검색 시에만 선택 가능(게시물 제목이 유일한 h1).
- 라이브 모드 슬래시: h2 등 명령 적용 후 `## ` 뒤로 포커스·커서 복원. Esc는 메뉴만 닫고 줄·`/…` 입력 유지(해당 줄 메뉴 재오픈 억제). Esc 시 줄 비우기로 글이 사라지던 문제 수정.
- 라이브 모드 슬래시 메뉴 Ghost 스타일: 아이콘+라벨만 표시, 호버·포커스 시 오른쪽 `/slug` 표시. `AdminSlashCommandIcon.vue` 추가.
- 라이브 모드 슬래시: 미디어 모달 Esc 닫기, ↑↓ 시 목록 scrollIntoView, 마우스·키보드 하이라이트 단일화.
- 라이브 모드 슬래시 명령: `/` 입력 시 메뉴, `/image`+Enter 이미지 삽입, ↑↓ 선택·Esc 취소. 메뉴 뷰포트 밖 넘침 시 위·좌우 보정.
- 라이브 모드 Cmd+A 후 Backspace: 전체 선택 삭제가 줄 병합으로 가로채지지 않도록 수정.
- Shift+Enter·문단 내 hard break 제거. Enter/Shift+Enter 모두 문단 분리. 마크다운 한 줄=한 문단. 소스 모드 Shift+Enter hard break 삽입 제거.
- 라이브 모드 ↑↓: 이전·다음 문단(블록) 이동, 같은 열 유지.
- 라이브 모드 ←→: 문단 끝 → 다음 블록 맨 앞, 문단 앞 → 이전 블록 맨 끝. ↑↓는 열 유지. Cmd+←→는 블록 내 맨 앞·맨 끝.
- 라이브 모드 병합(맨 앞 Backspace): 커서를 합쳐진 경계(이전 줄 본문 끝)에 둠.
- 라이브 모드 Enter(문단): 분리 후 blur가 이전 DOM 전체를 다시 저장하던 문제 수정(포커스 중 modelValue 동기화).
- contenteditable 줄바꿈(`
`·`