diff --git a/src/components/Dropdown/Dropdown.module.scss b/src/components/Dropdown/Dropdown.module.scss index 9a67f90..25475fd 100644 --- a/src/components/Dropdown/Dropdown.module.scss +++ b/src/components/Dropdown/Dropdown.module.scss @@ -68,6 +68,7 @@ border-radius: 8px; margin-top: 8px; box-shadow: 0px 2px 12px 0px #00000014; + z-index: 100; } &__list-item { diff --git a/src/components/Editor/Editor.jsx b/src/components/Editor/Editor.jsx index 3f4afce..45582ab 100644 --- a/src/components/Editor/Editor.jsx +++ b/src/components/Editor/Editor.jsx @@ -42,12 +42,14 @@ function OnEditorChange({ onUpdate }) { * @param {boolean} [readOnly=false] - 읽기 전용 모드 여부 */ export default function Editor({ + inputId = '', content = '', onUpdate = () => {}, style = {}, readOnly = false, font = 'Pretendard', className = '', + onBlur, }) { // 1) theme: 텍스트 포맷 → CSS 클래스 매핑 const theme = { @@ -102,6 +104,8 @@ export default function Editor({ } placeholder={ diff --git a/src/components/Editor/Editor.module.scss b/src/components/Editor/Editor.module.scss index 74914c6..29ad5ff 100644 --- a/src/components/Editor/Editor.module.scss +++ b/src/components/Editor/Editor.module.scss @@ -2,12 +2,15 @@ .editor__content { /* 에디터 입력 영역(콘텐츠Editable) 스타일 */ + position: relative; min-height: 260px; padding: 12px; outline: none; font-family: inherit !important; /* 부모에서 상속받은 폰트 사용 */ font-size: var(--font-size-16); color: var(--color-gray-900); + max-height: 400px; + overflow-y: auto; /* 롤링페이퍼 폰트는 부모에서 전달받음 */ /* 혹시 모를 리셋(reset.css) 덮어쓰기 방지 */ @@ -21,6 +24,9 @@ } .editor__placeholder { + position: absolute; + top: 50px; + left: 5px; /* 내용이 비어 있을 때 보여줄 플레이스홀더 문구 스타일 */ color: var(--color-gray-400); padding: 12px; diff --git a/src/components/PostHeader/EmojiGroup/EmojiAdd.jsx b/src/components/PostHeader/EmojiGroup/EmojiAdd.jsx index bc994b7..d04bb5a 100644 --- a/src/components/PostHeader/EmojiGroup/EmojiAdd.jsx +++ b/src/components/PostHeader/EmojiGroup/EmojiAdd.jsx @@ -67,7 +67,7 @@ export default function EmojiAdd({ id, onSuccess, isMobile = false }) { * @todo IconButton 컴포넌트로 변경 예정 */ const toggleButton = isMobile ? ( - + diff --git a/src/pages/MessagePage/MessagePage.module.scss b/src/pages/MessagePage/MessagePage.module.scss index 4599e24..075e190 100644 --- a/src/pages/MessagePage/MessagePage.module.scss +++ b/src/pages/MessagePage/MessagePage.module.scss @@ -33,17 +33,6 @@ margin-top: 0.25rem; } - /* 에디터 래퍼 */ - &__editor-wrapper { - border: 1px solid var(--color-gray-300); - border-radius: 8px; - max-height: 500px; - } - &__editor { - width: 100%; - height: 100%; - } - /* 전송 버튼 영역 */ &__actions { display: flex; diff --git a/src/pages/MessagePage/components/EditorWrapper.jsx b/src/pages/MessagePage/components/EditorWrapper.jsx new file mode 100644 index 0000000..0b9b222 --- /dev/null +++ b/src/pages/MessagePage/components/EditorWrapper.jsx @@ -0,0 +1,64 @@ +// src/pages/MessagePage/components/EditorWrapper.jsx +import styles from './EditorWrapper.module.scss'; +import Editor from '@/components/Editor/Editor'; + +const EditorWrapper = ({ + inputId = '', + value, + onChange, + onBlur, + isValid = null, // null | true | false + message, + font, + className = '', +}) => { + /* 상태별 클래스 계산 */ + const wrapperClass = { + null: '', + false: 'editor-wrapper--error', + true: 'editor-wrapper--success', + }; + + const messageStateClass = { + null: '', + false: 'editor-wrapper__message--error', + true: 'editor-wrapper__message--success', + }; + + const handleUpdate = (html) => onChange(html); + + const showMessage = message && isValid === false; + + return ( +
+
+ +
+ + {showMessage && ( +
+ {message} +
+ )} +
+ ); +}; + +export default EditorWrapper; diff --git a/src/pages/MessagePage/components/EditorWrapper.module.scss b/src/pages/MessagePage/components/EditorWrapper.module.scss new file mode 100644 index 0000000..e3b8b89 --- /dev/null +++ b/src/pages/MessagePage/components/EditorWrapper.module.scss @@ -0,0 +1,45 @@ +/* src/pages/MessagePage/components/EditorWrapper.module.scss */ +.editor-wrapper__container { + position: relative; + width: 100%; +} + +.editor-wrapper { + max-height: 500px; + display: flex; + flex-direction: column; + width: 100%; + + border: 1px solid var(--color-gray-300); + border-radius: 8px; + transition: border-color 0.15s ease; + + &:focus-within { + border-color: var(--color-purple-600); + } + /* 오류 & 성공 상태 */ + &--error { + border-color: var(--color-error); + } + &--success { + border-color: var(--color-green-500); + } + &__content { + flex: 1; + max-height: inherit; + } + + &__message { + position: absolute; + bottom: -18px; + font-size: var(--font-size-12); + margin: 4px 0 0 10px; + + &--error { + color: var(--color-error); + } + &--success { + color: var(--color-green-500); + } + } +}