-
+
![]()
+
diff --git a/docs/history.md b/docs/history.md
index 45f5fee..4d7ba58 100644
--- a/docs/history.md
+++ b/docs/history.md
@@ -1,5 +1,13 @@
# 의사결정 이력
+## 2026-05-02 v0.0.19
+
+### 블록 에디터 조합 입력과 이미지 캡션 표시 보정
+
+관리자 블록 에디터는 한글처럼 조합 과정이 있는 입력 중에는 마크다운 단축 변환과 슬래시 메뉴 상태 확정을 미룬다. 조합 중인 DOM 텍스트를 Vue 상태로 다시 덮어쓰면 마지막 글자가 중복되거나 입력 순서가 어긋날 수 있기 때문이다.
+
+이미지 삽입 시 파일명이나 미디어 제목을 자동으로 alt/caption에 채우지 않는다. 파일명은 작성자가 공개 본문에서 보려는 설명이 아니므로 기본 화면에서는 숨기고, 필요한 경우 이미지 hover 또는 focus 상태에서만 alt 입력을 열어 직접 작성하도록 한다.
+
## 2026-05-02 v0.0.18
### 공개 URL 복수형/단수형 기준 결정
diff --git a/docs/map.md b/docs/map.md
index 3316719..8bc25e2 100644
--- a/docs/map.md
+++ b/docs/map.md
@@ -19,7 +19,7 @@
| components/site/LeftSidebar.vue | 메인 화면 왼쪽 |
| components/site/RightSidebar.vue | 메인 화면 오른쪽 |
| components/site/MainColumn.vue | 메인 화면 중앙 |
-| components/site/PostCard.vue | 목록의 게시물 카드 |
+| components/site/PostCard.vue | 목록의 게시물 카드, 대표 이미지 썸네일 |
| components/site/TagHeader.vue | 태그 페이지 헤더 |
## 관리자 컴포넌트
@@ -27,7 +27,7 @@
| 파일 | 화면 위치 |
|------|-----------|
| components/admin/AdminPostForm.vue | 관리자 글 작성/수정 폼, 대표 이미지 선택 |
-| components/admin/AdminBlockEditor.vue | 관리자 글 블록형 에디터, 이미지/갤러리 블록 |
+| components/admin/AdminBlockEditor.vue | 관리자 글 블록형 에디터, 이미지/갤러리 블록, 한글 조합 입력 처리 |
| components/admin/AdminTagForm.vue | 관리자 태그 생성/수정 폼 |
## 콘텐츠 컴포넌트
diff --git a/docs/spec.md b/docs/spec.md
index 717e1d2..28cc398 100644
--- a/docs/spec.md
+++ b/docs/spec.md
@@ -221,6 +221,7 @@ components/content/
- `/` 명령 메뉴가 열린 상태에서 위/아래 방향키로 강조 항목을 이동한다.
- 블록 메뉴는 문단, 제목 2, 제목 3, 이미지, 갤러리, 인용, 목록, 코드, 구분선을 제공한다.
- `#`, `##`, `###`, `>`, `-` 입력 후 공백을 누르면 현재 블록 타입을 즉시 변환한다.
+- 한글 등 조합형 입력 중에는 단축 문법과 슬래시 메뉴 상태를 확정하지 않고 조합 종료 뒤 반영한다.
- 빈 문단에서 Enter를 누르면 다음 빈 문단 블록을 생성한다.
- 빈 블록 placeholder는 현재 활성 블록 또는 첫 빈 블록에만 표시한다.
- 제목은 별도 라벨 영역이 아니라 에디터 상단의 큰 제목 입력으로 표시한다.
@@ -231,6 +232,8 @@ components/content/
- 대표 이미지는 URL 직접 입력이 아니라 미디어 선택 또는 새 이미지 업로드로 설정한다.
- 대표 이미지가 설정되면 관리자 글 폼에 썸네일과 삭제/변경 액션을 표시한다.
- 이미지 블록은 관리자 업로드 API로 이미지를 업로드하고 `{width=wide}` 형식으로 저장한다.
+- 이미지/갤러리 삽입 시 파일명은 alt 값으로 자동 입력하지 않는다.
+- 이미지 블록 alt 입력은 이미지 hover 또는 focus 상태에서만 표시한다.
- 이미지 블록 표시 옵션은 `regular`, `wide`, `full` 값을 사용하며 `regular`는 width 옵션을 생략한다.
- 갤러리 블록은 `:::gallery` fenced block 안에 이미지 마크다운 행을 여러 개 저장한다.
- 공개 갤러리는 한 줄에 2~3개 이미지 그리드로 표시하고 클릭 시 라이트박스로 크게 확인한다.
diff --git a/docs/todo.md b/docs/todo.md
index 3c41146..bf930df 100644
--- a/docs/todo.md
+++ b/docs/todo.md
@@ -40,6 +40,7 @@
- [ ] ProseList 실제 스타일 세부 조정
- [ ] ProseBlockquote 실제 스타일 세부 조정
- [ ] ProseImage Regular/Wide/Full-width 동작 검증
+- [ ] ProseImage Wide/Full-width 화면 이탈과 스킨별 최대 폭 기준 재정리
- [ ] ProseButton Left/Center 정렬 검증
- [ ] ProseCallout 실제 스타일 세부 조정
- [ ] ProseToggle 실제 스타일 세부 조정
diff --git a/docs/update.md b/docs/update.md
index 99150a5..9d10a8a 100644
--- a/docs/update.md
+++ b/docs/update.md
@@ -1,5 +1,14 @@
# 업데이트 이력
+## v0.0.19
+
+- 관리자 블록 에디터의 한글 조합 입력 중복 방지 처리 추가.
+- 이미지/갤러리 삽입 시 파일명을 alt/caption으로 자동 표시하지 않도록 수정.
+- 이미지 블록 alt 입력을 이미지 hover 또는 focus 상태에서만 표시하도록 수정.
+- 공개 게시물 카드에 대표 이미지 썸네일 표시 추가.
+- ProseImage Wide/Full-width 화면 이탈 보정 작업을 할 일에 기록.
+- 패키지 버전을 0.0.19로 갱신.
+
## v0.0.18
- 새 글 작성 화면에서 빈 본문 블록이 생성되지 않던 문제 수정.
diff --git a/package-lock.json b/package-lock.json
index c0ed914..efd6a21 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "sori.studio",
- "version": "0.0.18",
+ "version": "0.0.19",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "sori.studio",
- "version": "0.0.18",
+ "version": "0.0.19",
"hasInstallScript": true,
"dependencies": {
"@nuxtjs/tailwindcss": "^6.14.0",
diff --git a/package.json b/package.json
index c1320a5..cf5d255 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "sori.studio",
- "version": "0.0.18",
+ "version": "0.0.19",
"private": true,
"type": "module",
"scripts": {
diff --git a/pages/index.vue b/pages/index.vue
index 5c25749..cada3cb 100644
--- a/pages/index.vue
+++ b/pages/index.vue
@@ -29,6 +29,7 @@ const formatPostDate = (value) => {
const mapPostCard = (post) => ({
title: post.title,
excerpt: post.excerpt,
+ featuredImage: post.featuredImage,
tag: post.tags?.[0]?.toUpperCase() || 'POST',
publishedAt: formatPostDate(post.publishedAt),
to: `/post/${post.slug}`
diff --git a/pages/posts/index.vue b/pages/posts/index.vue
index cc9033f..c87e7ed 100644
--- a/pages/posts/index.vue
+++ b/pages/posts/index.vue
@@ -24,6 +24,7 @@ const formatPostDate = (value) => {
const postCards = computed(() => posts.value.map((post) => ({
title: post.title,
excerpt: post.excerpt,
+ featuredImage: post.featuredImage,
tag: post.tags?.[0]?.toUpperCase() || 'POST',
publishedAt: formatPostDate(post.publishedAt),
to: `/post/${post.slug}`
diff --git a/pages/tag/[slug].vue b/pages/tag/[slug].vue
index 01d4e99..df04f9c 100644
--- a/pages/tag/[slug].vue
+++ b/pages/tag/[slug].vue
@@ -35,6 +35,7 @@ const tagPosts = computed(() => posts.value
.map((post) => ({
title: post.title,
excerpt: post.excerpt,
+ featuredImage: post.featuredImage,
tag: tag.value?.name || slug.value.toUpperCase(),
publishedAt: formatPostDate(post.publishedAt),
to: `/post/${post.slug}`