| name | editor-interactive-pattern |
| description | Drag, selection, keyboard, and inline editing patterns for the compose editor. |
Trigger
- "์๋ํฐ ์ธํฐ๋์
", "๋๋๊ทธ ํจํด", "ํค๋ณด๋ ๋จ์ถํค", "editor interaction"
Read First
src/components/compose/block-canvas.tsx โ dnd-kit ์ค์ , ๋ธ๋ก ์ ๋ ฌ
src/components/compose/compose-shell.tsx โ ํค๋ณด๋ ๋จ์ถํค, Undo/Redo
src/components/compose/shared/editable-text.tsx โ contentEditable ํจํด
src/components/compose/compose-context.tsx โ ComposeProvider ์ํ
Do
1. ๋ธ๋ก ์ ํ ํจํด
- ๋ธ๋ก ํด๋ฆญ ์
onSelect() ํธ์ถ โ selectedBlockId ์ํ ๊ฐฑ์
- ์ ํ๋ ๋ธ๋ก:
border-2 border-indigo-500
- ๋ฏธ์ ํ ๋ธ๋ก:
border-2 border-transparent hover:border-gray-200
- ์บ๋ฒ์ค ๋น ์์ญ ํด๋ฆญ ์ ์ ํ ํด์
2. dnd-kit ๋๋๊ทธ ์ ๋ ฌ
import { DndContext, closestCenter } from "@dnd-kit/core";
import { SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable";
import { useSortable } from "@dnd-kit/sortable";
block-canvas.tsx์์ DndContext + SortableContext ์ค์
- ๊ฐ ๋ธ๋ก์
useSortable๋ก ๋ํ
onDragEnd์์ arrayMove๋ก ๋ธ๋ก ์์ ๋ณ๊ฒฝ
- ๋๋๊ทธ ํธ๋ค: ๋ธ๋ก ์ข์ธก grip ์์ด์ฝ
3. ํค๋ณด๋ ๋จ์ถํค
| ๋จ์ถํค | ๋์ | ๊ตฌํ ์์น |
|---|
Ctrl+S | ์ ์ฅ | compose-shell.tsx |
Ctrl+Z | ์คํ ์ทจ์ (Undo) | compose-shell.tsx |
Ctrl+Shift+Z | ๋ค์ ์คํ (Redo) | compose-shell.tsx |
Delete / Backspace | ์ ํ๋ ๋ธ๋ก ์ญ์ | compose-shell.tsx |
useEffect๋ก keydown ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ฑ๋ก
e.preventDefault() ๋ก ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ๋์ ๋ฐฉ์ง
4. ์ธ๋ผ์ธ ํ
์คํธ ํธ์ง (EditableText)
contentEditable ๊ธฐ๋ฐ, data-placeholder ์์ฑ์ผ๋ก ํ๋ ์ด์คํ๋ ํ์
onBlur ์ onUpdate() ํธ์ถํ์ฌ ๋ฐ์ดํฐ ์ ์ฅ
readOnly ๋ชจ๋์์๋ contentEditable={false}
5. stopPropagation ๊ท์น
6. readOnly ๋ชจ๋
- ์ ์ฒด ์๋ํฐ๊ฐ readOnly์ผ ๋:
- ๋๋๊ทธ ๋นํ์ฑํ (
DndContext ๋ฏธ๋ ๋)
- ๋ธ๋ก ์ ํ ๋นํ์ฑํ
- ํค๋ณด๋ ๋จ์ถํค ๋นํ์ฑํ
- ์ธ๋ผ์ธ ํธ์ง ๋นํ์ฑํ (
contentEditable={false})
- ์
๋ก๋/์ญ์ UI ์จ๊น
Validation