Skip to Content
ํ™•์žฅ

ํ™•์žฅ

Inkio ํ™•์žฅ์€ ๋‘ ์ธต์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

  • @inkio/core
    • callout
    • details/toggle
    • table
    • keyboard shortcuts
  • @inkio/advanced
    • slash command
    • block handle
    • mention
    • hashtag
    • wiki link
    • bookmark
    • comment

๊ถŒ์žฅ ์‹œ์ž‘์ 

  • classic editor๊ฐ€ ํ•„์š”ํ•˜๋ฉด @inkio/simple
  • notion-like editor๊ฐ€ ํ•„์š”ํ•˜๋ฉด @inkio/editor
  • low-level ์กฐํ•ฉ์ด ํ•„์š”ํ•˜๋ฉด @inkio/core ๋˜๋Š” @inkio/advanced

์กฐํ•ฉ ์˜ˆ์‹œ

import { Editor } from '@inkio/core'; import { getDefaultExtensions } from '@inkio/advanced'; import '@inkio/core/minimal.css'; import '@inkio/advanced/style.css'; const extensions = getDefaultExtensions({ hashtagItems: ({ query }) => [{ id: query || 'inkio', label: `#${query || 'inkio'}` }], }); export function Page() { return <Editor extensions={extensions} initialContent="<p>Hello Inkio</p>" />; }

Image editor

import { Editor } from '@inkio/editor'; import { ImageEditorModal } from '@inkio/image-editor'; import '@inkio/image-editor/style.css'; export function Page() { return ( <Editor onImageUpload={async (file) => URL.createObjectURL(file)} imageBlock={{ imageEditor: ImageEditorModal }} /> ); }

TocBlock (์ธ๋ผ์ธ ๋ชฉ์ฐจ)

@inkio/core์— ๊ธฐ๋ณธ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ ์•ˆ์— Notion ์Šคํƒ€์ผ์˜ ์ธ๋ผ์ธ ๋ชฉ์ฐจ ๋ธ”๋ก์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์—๋””ํ„ฐ ์™ธ๋ถ€์— ์˜ค๋ฒ„๋ ˆ์ด ๋ฏธ๋‹ˆ๋งต ํ˜•ํƒœ๋กœ ํ‘œ์‹œํ•˜๋ ค๋ฉด <ToC> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ปดํฌ๋„ŒํŠธ ๋ฌธ์„œ ์ฐธ๊ณ 

  • /toc ์Šฌ๋ž˜์‹œ ์ปค๋งจ๋“œ๋กœ ์‚ฝ์ž… (@inkio/advanced SlashCommand ํ•„์š”)
  • ํ—ค๋”ฉ์ด ์ถ”๊ฐ€/์ˆ˜์ •/์‚ญ์ œ๋˜๋ฉด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค
  • ํ•ญ๋ชฉ ํด๋ฆญ ์‹œ ํ•ด๋‹น ํ—ค๋”ฉ์œผ๋กœ ์Šคํฌ๋กค๋ฉ๋‹ˆ๋‹ค
  • ๋ฐฐ๊ฒฝ/ํ…Œ๋‘๋ฆฌ ์—†๋Š” Notion ์Šคํƒ€์ผ ๋ฏธ๋‹ˆ๋ฉ€ ๋””์ž์ธ (ํ…์ŠคํŠธ ๋งํฌ๋งŒ)
  • ํ—ค๋”ฉ์ด ์—†์œผ๋ฉด muted ํ”Œ๋ ˆ์ด์Šคํ™€๋” ํ‘œ์‹œ: โ€œAdd headings to see the table of contents.โ€

๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด getExtensions์— tocBlock: false๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค:

import { getExtensions } from '@inkio/core'; const extensions = getExtensions({ tocBlock: false });

CodeBlock (์ฝ”๋“œ ๋ธ”๋ก)

@inkio/core์— ๊ธฐ๋ณธ ํฌํ•จ๋˜๋ฉฐ, lowlight ๊ธฐ๋ฐ˜ ๊ตฌ๋ฌธ ๊ฐ•์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 37๊ฐœ์˜ ์ผ๋ฐ˜์ ์ธ ์–ธ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • ์—๋””ํ„ฐ ๋ชจ๋“œ: ํ”Œ๋กœํŒ… ์–ธ์–ด ์„ ํƒ๊ธฐ(๋“œ๋กญ๋‹ค์šด)๋กœ ์–ธ์–ด ๋ณ€๊ฒฝ
  • ๋ทฐ์–ด ๋ชจ๋“œ: ๋ณต์‚ฌ ๋ฒ„ํŠผ + ์–ธ์–ด ๋ฐฐ์ง€ ํ‘œ์‹œ
  • tsx / jsx๋Š” ๊ฐ๊ฐ typescript / javascript์˜ ๋ณ„์นญ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค

์ฝ”๋“œ ๋ธ”๋ก์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด codeBlock={false}๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค(@inkio/editor ์ „์šฉ ๊ธฐ๋Šฅ ํ† ๊ธ€ ์ฐธ๊ณ ).

์ปค์Šคํ…€ ํ™•์žฅ

extensions prop์œผ๋กœ Tiptap ํ™•์žฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒ€์ž…

type ExtensionsInput = | Extension[] | { items: Extension[]; replace?: boolean };
  • ๋ฐฐ์—ด ์ „๋‹ฌ: ๊ธฐ๋ณธ ํ™•์žฅ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ด๋ฆ„์˜ ํ™•์žฅ์ด ์žˆ์œผ๋ฉด ๊ต์ฒด๋ฉ๋‹ˆ๋‹ค.
  • { items, replace: true } ์ „๋‹ฌ: ๊ธฐ๋ณธ ํ™•์žฅ์„ ์ „๋ถ€ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ: ํ™•์žฅ ์ถ”๊ฐ€

import { Editor } from '@inkio/editor'; import CharacterCount from '@tiptap/extension-character-count'; <Editor extensions={[CharacterCount.configure({ limit: 1000 })]} />

์˜ˆ์‹œ: ๊ธฐ๋ณธ ํ™•์žฅ ์ „์ฒด ๊ต์ฒด

import { Editor } from '@inkio/editor'; import { Document, Paragraph, Text } from '@tiptap/starter-kit'; <Editor extensions={{ items: [Document, Paragraph, Text], replace: true }} />

๊ธฐ๋Šฅ ํ† ๊ธ€ (@inkio/editor ์ „์šฉ)

@inkio/editor์˜ Editor ์ปดํฌ๋„ŒํŠธ๋Š” ์ฃผ์š” ํ™•์žฅ์„ prop์œผ๋กœ ์ผœ๊ณ  ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Prop๊ธฐ๋ณธ๊ฐ’์„ค๋ช…
blockHandletrue๋ธ”๋ก ๋“œ๋ž˜๊ทธ ํ•ธ๋“ค
wikiLinktrue[[์œ„ํ‚ค๋งํฌ]] ๋ฌธ๋ฒ•
tabletrueํ‘œ
callouttrue์ฝœ์•„์›ƒ ๋ธ”๋ก
toggleListtrueํ† ๊ธ€(์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ) ๋ฆฌ์ŠคํŠธ
<Editor blockHandle={false} wikiLink={false} />

CSS

  • @inkio/simple/minimal.css
  • @inkio/editor/minimal.css
  • @inkio/advanced/style.css โ€” @inkio/core + @inkio/advanced ์ง์ ‘ ์กฐํ•ฉ ์‹œ
  • @inkio/image-editor/style.css
Last updated on