name: md-editor-rt-ko-kr description: Configure md-editor-rt markdown editor and preview with Korean ko-KR locale and project-specific colors via src/styles in this React app. Use when working with MemoEditor/MemoViewer or adding new md-editor-rt instances.
md-editor-rt ko_KR & 스타일 가이드
목적
- 이 스킬은
md-editor-rt를 ko_KR 로케일과 함께 사용하고, - 라이브러리 기본 CSS 대신
src/styles기반 색상/테마를 적용하는 패턴을 정리한다. MemoEditor,MemoViewer와 동일한 방식으로 새 에디터/뷰어를 만들 때 사용한다.
기본 설치
기존 프로젝트에는 이미 설치되어 있을 가능성이 높지만, 새 프로젝트라면:
npm install md-editor-rt @vavt/cm-extension
# 또는
yarn add md-editor-rt @vavt/cm-extension
이 프로젝트에서는
md-editor-rt의 기본 CSS(md-editor-rt/lib/style.css,md-editor-rt/lib/preview.css)를 직접 import 하지 않고,src/styles/style.css,src/styles/preview.css로 테마를 완전히 덮어쓴다.
ko_KR 로케일 등록 패턴
1. 공통 설정 (config) 등록
에디터/프리뷰를 사용하는 **각 번들 entry 수준(또는 컴포넌트 모듈 상단)**에서 한 번만 호출한다.
import { MdEditor, MdPreview, config } from 'md-editor-rt';
import KO_KR from '@vavt/cm-extension/dist/locale/ko-KR';
config({
editorConfig: {
languageUserDefined: {
'ko-KR': KO_KR,
},
},
});
2. 컴포넌트에서 ko_KR 사용
MdEditor, MdPreview 둘 다 language="ko-KR"을 넘긴다.
<MdEditor
id={editorId}
modelValue={value}
onChange={onChange}
theme={resolvedTheme} // 'light' | 'dark'
language="ko-KR"
/>
<MdPreview
id={editorId}
modelValue={value}
theme={resolvedTheme}
language="ko-KR"
/>
테마 / 색상 적용 (src/styles)
1. 에디터용 스타일 (src/styles/style.css)
MemoEditor에서는 라이브러리 CSS를 사용하지 않고 다음만 import 한다.
// import 'md-editor-rt/lib/style.css';
import '@/styles/style.css';
style.css의 핵심은 md-editor-rt가 사용하는 CSS 변수들을 AppGemini 색상 변수에 매핑하는 것이다. 예:
.md-editor .md-editor-preview {
--md-theme-color: var(--md-color);
--md-theme-link-color: var(--color-indigo-500);
--md-theme-link-hover-color: var(--color-green-500);
--md-theme-border-color: var(--color-gray-200);
--md-theme-bg-color: var(--color-white);
/* ... */
}
.md-editor-dark .md-editor-preview,
.dark .md-editor .md-editor-preview {
--md-theme-link-color: var(--color-indigo-400);
--md-theme-link-hover-color: var(--color-green-400);
--md-theme-bg-color: var(--color-gray-800);
/* ... */
}
- 에디터의 텍스트/링크/테이블/코드 블록 색상은 대부분
--md-theme-*변수로 제어된다. - 새 색상을 쓰고 싶으면 기존 Tailwind 기반 변수(
--color-indigo-500,--color-green-500,--color-gray-800등)를 조합해서--md-theme-*에 매핑한다.
2. 프리뷰 전용 스타일 (src/styles/preview.css)
MemoViewer에서는 기본 preview CSS 대신 다음만 import 한다.
// import 'md-editor-rt/lib/preview.css';
import '@/styles/preview.css';
preview.css 역시 .md-editor .md-editor-preview와 .md-editor-dark .md-editor-preview 아래에서 같은 방식으로 변수들을 세팅한다.
프리뷰만 사용하는 경우에도 동일한 색상 토큰이 유지되므로 에디터/뷰어 간 일관성이 맞춰진다.
3. 새로운 색상/테마를 추가하는 방법
- 먼저 전역(또는 상위 스타일)에서 새 색상 변수를 정의한다. 예:
:root { --color-brand-primary: #4f46e5; } style.css또는preview.css에서 해당 변수를--md-theme-*에 연결한다. 예:.md-editor .md-editor-preview { --md-theme-link-color: var(--color-brand-primary); }- 필요하다면 다크 모드용 값도
.md-editor-dark .md-editor-preview블록에 따로 넣는다.
테마 결정 패턴 (theme prop)
이 프로젝트에서는 시스템 테마를 감지하는 훅을 사용해 theme를 정한다.
function usePrefersColorScheme() {
const [prefersDark, setPrefersDark] = useState(
() => typeof window !== 'undefined' &&
window.matchMedia('(prefers-color-scheme: dark)').matches,
);
useEffect(() => {
const mq = window.matchMedia('(prefers-color-scheme: dark)');
const handle = (e: MediaQueryListEvent) => setPrefersDark(e.matches);
mq.addEventListener('change', handle);
return () => mq.removeEventListener('change', handle);
}, []);
return prefersDark ? 'dark' : 'light';
}
컴포넌트에서는 다음처럼 사용한다.
const systemTheme = usePrefersColorScheme();
const resolvedTheme = theme ?? systemTheme;
<MdEditor
/* ...기타 props... */
theme={resolvedTheme}
/>
themeprop이 명시되면 그 값을 우선 사용하고, 없으면 시스템 테마를 따라간다.MdPreview도 동일하게theme={resolvedTheme}를 넘겨 일관성 있게 맞춘다.
예제: 메모 에디터 패턴 (축약본)
MemoEditor와 동일한 패턴으로, ko_KR + 커스텀 스타일을 사용하는 최소 예제:
import { useState, useEffect } from 'react';
import { MdEditor, config } from 'md-editor-rt';
import KO_KR from '@vavt/cm-extension/dist/locale/ko-KR';
// import 'md-editor-rt/lib/style.css';
import '@/styles/style.css';
config({
editorConfig: {
languageUserDefined: {
'ko-KR': KO_KR,
},
},
});
function usePrefersColorScheme() {
const [prefersDark, setPrefersDark] = useState(
() => typeof window !== 'undefined' &&
window.matchMedia('(prefers-color-scheme: dark)').matches,
);
useEffect(() => {
const mq = window.matchMedia('(prefers-color-scheme: dark)');
const handle = (e: MediaQueryListEvent) => setPrefersDark(e.matches);
mq.addEventListener('change', handle);
return () => mq.removeEventListener('change', handle);
}, []);
return prefersDark ? 'dark' : 'light';
}
export function MemoEditorExample({ value, onChange, editorId }: {
value: string;
onChange: (v: string) => void;
editorId: string;
}) {
const systemTheme = usePrefersColorScheme();
return (
<MdEditor
id={editorId}
modelValue={value}
onChange={onChange}
theme={systemTheme}
language="ko-KR"
preview={false}
noUploadImg
/>
);
}
예제: 메모 뷰어 패턴 (축약본)
MemoViewer와 동일한 방식으로, 프리뷰 전용 ko_KR + 커스텀 스타일:
import { useState, useEffect } from 'react';
import { MdPreview, config } from 'md-editor-rt';
import KO_KR from '@vavt/cm-extension/dist/locale/ko-KR';
// import 'md-editor-rt/lib/preview.css';
import '@/styles/preview.css';
config({
editorConfig: {
languageUserDefined: {
'ko-KR': KO_KR,
},
},
});
function usePrefersColorScheme() {
const [prefersDark, setPrefersDark] = useState(
() => typeof window !== 'undefined' &&
window.matchMedia('(prefers-color-scheme: dark)').matches,
);
useEffect(() => {
const mq = window.matchMedia('(prefers-color-scheme: dark)');
const handle = (e: MediaQueryListEvent) => setPrefersDark(e.matches);
mq.addEventListener('change', handle);
return () => mq.removeEventListener('change', handle);
}, []);
return prefersDark ? 'dark' : 'light';
}
export function MemoViewerExample({ value, editorId }: {
value: string;
editorId: string;
}) {
const systemTheme = usePrefersColorScheme();
const isEmpty = !value || !value.trim();
if (isEmpty) {
return (
<span className="text-gray-400 dark:text-gray-500 text-sm py-2 block">
메모
</span>
);
}
return (
<MdPreview
id={editorId}
modelValue={value}
theme={systemTheme}
language="ko-KR"
/>
);
}
요약 체크리스트
새 md-editor-rt 사용 컴포넌트를 만들 때:
-
md-editor-rt,@vavt/cm-extension이 설치되어 있는지 확인한다. -
config({ editorConfig.languageUserDefined['ko-KR'] = KO_KR })를 모듈 상단에서 한 번만 호출한다. - 라이브러리 기본 CSS 대신
@/styles/style.css또는@/styles/preview.css를 import 한다. -
MdEditor/MdPreview에language="ko-KR"을 지정한다. -
theme는usePrefersColorScheme()패턴을 따라'light' | 'dark'값으로 넘긴다. - 색상을 바꾸고 싶으면
src/styles안에서--md-theme-*변수를 프로젝트 색상 변수(--color-*)에 매핑해서 조정한다.