์์ํ๊ธฐ
์ด ๊ฐ์ด๋๋ Inkio๋ฅผ ํ๋ก์ ํธ์ ํตํฉํ๋ ์ต์ ๋จ๊ณ๋ง ์ค๋ช ํฉ๋๋ค.
์ค์น
npm install @inkio/editor @inkio/extension react react-dom์คํ์ผ ์ ํ
import '@inkio/editor/minimal.css';
import '@inkio/extension/style.css';๊ธฐ๋ณธ ์ฌ์ฉ
import { useMemo, useState } from 'react';
import { Editor, getDefaultCoreExtensions } from '@inkio/editor';
import { Callout } from '@inkio/extension/callout';
import { HashTag } from '@inkio/extension/hashtag';
import { SlashCommand } from '@inkio/extension/slash-command';
import { WikiLink } from '@inkio/extension/wikilink';
import '@inkio/editor/minimal.css';
import '@inkio/extension/style.css';
const tags = ['inkio', 'editor', 'react', 'nextjs'];
export function MyEditorPage() {
const [content, setContent] = useState({
type: 'doc',
content: [{ type: 'paragraph' }],
});
const extensions = useMemo(
() => [
...getDefaultCoreExtensions({
placeholder: 'Start typing...',
}),
Callout,
HashTag.configure({
items: ({ query }) =>
tags
.filter((tag) => tag.includes(query.toLowerCase()))
.map((tag) => ({ id: tag, label: `#${tag}` })),
}),
SlashCommand,
WikiLink,
],
[],
);
return (
<Editor
content={content}
extensions={extensions}
showBubbleMenu
showFloatingMenu
onUpdate={setContent}
/>
);
}getDefaultInkioExtensions()๋ ํธ์์ฉ full preset์
๋๋ค. ๋น ๋ฅด๊ฒ ์ ๊ธฐ๋ฅ์ ๋ถ์ผ ๋๋ ์ ์ฉํ์ง๋ง, ์์์ ์ผ๋ก๋ getDefaultCoreExtensions()์ ํ์ํ extension๋ง ์ง์ ์กฐํฉํ๋ ๋ฐฉ์์ ๊ถ์ฅํฉ๋๋ค.
HashTag๋ #์ heading markdown shortcut ์ถฉ๋ ๋๋ฌธ์ opt-in์
๋๋ค.
ImageBlock์ core ๊ธฐ๋ณธ ๊ตฌ์ฑ์ ํฌํจ๋๋ฉฐ, ํ์ํ๋ฉด @inkio/editor์์ ์ง์ importํด์ ์ต์
์ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
i18n ์ ๋ต
Inkio ๊ธฐ๋ณธ ๋ด์ฅ ๋ฉ์์ง๋ ์์ด(en)๋ง ์ ๊ณตํฉ๋๋ค.
locale์unknown์ ๋ ฅ์ ๋ฐ์ต๋๋ค.locale์ ๋ฌธ์์ด, Accept-Language ๋ฌธ์์ด, ๋ฐฐ์ด,Intl.Locale, locale-like ๊ฐ์ฒด๋ฅผ ํด์ํฉ๋๋ค.- ๋ค๊ตญ์ด ๋ฉ์์ง๋ ์๋น์๊ฐ
messagesprop์ผ๋ก ์ฃผ์ ํฉ๋๋ค. - ํด์ ์คํจ/๋ฉ์์ง ๋๋ฝ ์ ์์ด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ํด๋ฐฑํฉ๋๋ค.
์์ธํ ๊ท์น์ i18n-locale ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Controlled / Uncontrolled
import { Editor } from '@inkio/editor';
// controlled
<Editor content={content} onUpdate={setContent} />
// uncontrolled
<Editor initialContent={initialContent} onUpdate={setContent} />content์ initialContent๋ ๋์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํธ๋ฌ๋ธ์ํ
์คํ์ผ์ด ์ ๋ณด์ผ ๋
์คํ์ผ ์ํธ๋ฆฌ๋ฅผ ๋ฐ๋์ importํ๋์ง ํ์ธํ์ธ์.
ํ์ฅ UI๊ฐ ๊นจ์ง ๋
@inkio/extension/style.css๊ฐ import๋์ด ์๋์ง ํ์ธํ์ธ์. SlashCommand, HashTag, BlockHandle, Comment, ImageEditorModal์ ํ์ํฉ๋๋ค.
์ด๋ฏธ์ง ํธ์ง UI๊ฐ ๊นจ์ง ๋
@inkio/extension/style.css๊ฐ import๋์ด ์๋์ง ํ์ธํ์ธ์.
SSR ์ค๋ฅ(window is not defined)
์๋ํฐ๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค. Next.js App Router๋ผ๋ฉด ํ์ผ ์๋จ์ 'use client';๋ฅผ ์ ์ธํ์ธ์.