@x12i/editor 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +349 -16
- package/dist/chunk-FYXMOAJT.js +1890 -0
- package/dist/chunk-FYXMOAJT.js.map +1 -0
- package/dist/index.d.ts +207 -171
- package/dist/index.js +1321 -7
- package/dist/index.js.map +1 -1
- package/dist/outline-Drc3E0C1.d.ts +339 -0
- package/dist/react.d.ts +546 -0
- package/dist/react.js +4439 -0
- package/dist/react.js.map +1 -0
- package/dist/styles.css +1219 -0
- package/package.json +57 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/editor.tsx","../src/react/ai-assist-menu.tsx","../src/react/internal/glyphs.tsx","../src/react/messages.ts","../src/react/block-menu.tsx","../src/react/commands.ts","../src/react/internal/menu.tsx","../src/react/internal/position.ts","../src/react/bubble-menu.tsx","../src/react/internal/platform.ts","../src/react/internal/roving.ts","../src/react/internal/tool-button.tsx","../src/react/context.ts","../src/react/extensions/index.ts","../src/react/extensions/block-id.ts","../src/react/extensions/block-keys.ts","../src/react/extensions/attrs.ts","../src/react/extensions/marks.ts","../src/react/extensions/nodes.ts","../src/react/blocks/embed.tsx","../src/react/blocks/frame.tsx","../src/react/blocks/preview.tsx","../src/react/blocks/unknown-preview.tsx","../src/react/blocks/media.tsx","../src/react/internal/inline.tsx","../src/react/blocks/text.tsx","../src/react/extensions/toggle-registry.ts","../src/react/internal/languages.ts","../src/react/extensions/slash.ts","../src/react/slash-items.ts","../src/react/extensions/runtime.ts","../src/react/image-dialog.tsx","../src/react/internal/dialog.tsx","../src/react/internal/field.tsx","../src/react/internal/equal.ts","../src/react/internal/live-region.tsx","../src/react/link-dialog.tsx","../src/react/slash-menu.tsx","../src/react/toolbar.tsx","../src/react/use-ai-assist.ts","../src/react/view.tsx"],"sourcesContent":["import { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from \"react\";\nimport type { Editor as TiptapEditor } from \"@tiptap/core\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\nimport { exitSuggestion, type SuggestionProps } from \"@tiptap/suggestion\";\nimport { documentToTiptap, tiptapToDocument, type ConversionWarning } from \"../convert\";\nimport { documentToMarkdown } from \"../markdown\";\nimport { getOutline } from \"../outline\";\nimport { createEmptyDocument, type EditorDocument } from \"../schema\";\nimport { AiAssistMenu } from \"./ai-assist-menu\";\nimport { BlockMenu } from \"./block-menu\";\nimport { BubbleMenu } from \"./bubble-menu\";\nimport { execEditorCommand, getSelectionInfo, insertBlockKind, normalizeBlockKind } from \"./commands\";\nimport { defaultEditorUi, EditorUiContext, EngineContext, type EditorUi } from \"./context\";\nimport { createExtensions } from \"./extensions\";\nimport { createRuntime, type EditorRuntime, type SlashBridge, type SlashItem } from \"./extensions/runtime\";\nimport { slashPluginKey } from \"./extensions/slash\";\nimport { ImageDialog } from \"./image-dialog\";\nimport { deepEqual } from \"./internal/equal\";\nimport { LiveRegion, useLiveRegion } from \"./internal/live-region\";\nimport { LinkDialog } from \"./link-dialog\";\nimport { createTranslator, defaultMessages, MessagesContext, mergeMessages } from \"./messages\";\nimport { SlashMenu, type SlashView } from \"./slash-menu\";\nimport { EditorToolbar } from \"./toolbar\";\nimport type { EditorApi, EditorProps, EmbedType } from \"./types\";\nimport { useAiAssist } from \"./use-ai-assist\";\nimport { EditorView } from \"./view\";\nimport { embedKindToType } from \"./commands\";\n\ntype DialogState =\n | { kind: \"link\"; href: string }\n | { kind: \"image\"; pos: number | undefined }\n | { kind: \"block-menu\" }\n | { kind: \"ai\" }\n | null;\n\nfunction snapshot(props: SuggestionProps<SlashItem, SlashItem>): SlashView {\n return { items: props.items, query: props.query, clientRect: props.clientRect ?? null };\n}\n\n/**\n * The block editor. Pass a document (`value` or `defaultValue`) in the kit's\n * own JSON format and read the edited document back through `onChange` or\n * the `ref`. The editing engine (Tiptap) stays behind this boundary.\n *\n * Until the engine mounts (on the server and during hydration) the component\n * renders the document read-only, so the content is in the first HTML.\n */\nexport function Editor(props: EditorProps) {\n const {\n value,\n defaultValue,\n editable = true,\n autoFocus,\n blockRenderers,\n extensions,\n messages,\n locale,\n toolbar = true,\n selectionMenu = true,\n aiProvider,\n className,\n toolbarEnd,\n onEditBlock,\n onRequestBlock,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n } = props;\n\n const translator = useMemo(() => createTranslator(mergeMessages(defaultMessages, messages), locale), [messages, locale]);\n const { message: statusMessage, announce } = useLiveRegion();\n\n // The first document, converted once.\n const initialRef = useRef<{ doc: EditorDocument; json: ReturnType<typeof documentToTiptap>; warnings: ConversionWarning[] } | null>(null);\n if (initialRef.current === null) {\n const doc = value ?? defaultValue ?? createEmptyDocument();\n const warnings: ConversionWarning[] = [];\n initialRef.current = { doc, json: documentToTiptap(doc, { warnings }), warnings };\n }\n const initial = initialRef.current;\n\n const latest = useRef(props);\n latest.current = props;\n const editorRef = useRef<TiptapEditor | null>(null);\n const lastDocRef = useRef<EditorDocument>(initial.doc);\n const titleRef = useRef<string | undefined>(initial.doc.title);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const pendingRef = useRef(false);\n\n const [dialog, setDialog] = useState<DialogState>(null);\n const [slash, setSlash] = useState<SlashView | null>(null);\n const [slashIndex, setSlashIndex] = useState(0);\n const [slashIds, setSlashIds] = useState<{ listbox: string | null; active: string | null }>({ listbox: null, active: null });\n const slashState = useRef<{ props: SuggestionProps<SlashItem, SlashItem> | null; index: number }>({ props: null, index: 0 });\n\n // --- Reading and writing the document ----------------------------------\n\n const readDocument = useCallback((): EditorDocument => {\n const editor = editorRef.current;\n if (!editor) return lastDocRef.current;\n const doc = tiptapToDocument(editor.getJSON());\n return titleRef.current === undefined ? doc : { ...doc, title: titleRef.current };\n }, []);\n\n const writeDocument = useCallback((doc: EditorDocument) => {\n const editor = editorRef.current;\n titleRef.current = doc.title;\n lastDocRef.current = doc;\n if (!editor) return;\n const warnings: ConversionWarning[] = [];\n editor.commands.setContent(documentToTiptap(doc, { warnings }), { emitUpdate: false });\n if (warnings.length > 0) latest.current.onWarnings?.(warnings);\n }, []);\n\n const emit = useCallback(() => {\n pendingRef.current = false;\n clearTimeout(timerRef.current);\n let doc: EditorDocument;\n try {\n doc = readDocument();\n } catch {\n return;\n }\n lastDocRef.current = doc;\n latest.current.onChange?.(doc);\n }, [readDocument]);\n\n const schedule = useCallback(() => {\n const wait = latest.current.debounce ?? 0;\n if (wait <= 0) {\n emit();\n return;\n }\n pendingRef.current = true;\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(emit, wait);\n }, [emit]);\n\n // Edits that are still waiting for the debounce are delivered when the editor goes away.\n useEffect(\n () => () => {\n clearTimeout(timerRef.current);\n if (pendingRef.current) emit();\n },\n [emit],\n );\n\n // --- Runtime for extensions ---------------------------------------------\n\n const runtimeRef = useRef<EditorRuntime | null>(null);\n if (runtimeRef.current === null) runtimeRef.current = createRuntime();\n const runtime = runtimeRef.current;\n\n const openLinkDialog = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return;\n const href = (editor.getAttributes(\"link\") as { href?: unknown }).href;\n setDialog({ kind: \"link\", href: typeof href === \"string\" ? href : \"\" });\n }, []);\n const openImageDialog = useCallback((pos?: number) => setDialog({ kind: \"image\", pos }), []);\n const openBlockMenu = useCallback(() => setDialog({ kind: \"block-menu\" }), []);\n const closeDialog = useCallback(() => setDialog(null), []);\n\n const ui = useMemo<EditorUi>(\n () => ({\n ...defaultEditorUi,\n editable,\n blockRenderers: blockRenderers ?? {},\n announce,\n onEditBlock,\n onRequestBlock,\n openImageDialog,\n openLinkDialog,\n openBlockMenu,\n }),\n [editable, blockRenderers, announce, onEditBlock, onRequestBlock, openImageDialog, openLinkDialog, openBlockMenu],\n );\n\n runtime.ui = () => ui;\n runtime.translator = () => translator;\n runtime.placeholder = () => latest.current.placeholder ?? translator.messages.placeholder;\n runtime.slashEnabled = () => latest.current.slashMenu !== false;\n\n const bridge = useMemo<SlashBridge>(\n () => ({\n onStart: (suggestion) => {\n slashState.current = { props: suggestion, index: 0 };\n setSlash(snapshot(suggestion));\n setSlashIndex(0);\n },\n onUpdate: (suggestion) => {\n const previous = slashState.current;\n const count = suggestion.items.length;\n const index = previous.props && previous.props.query === suggestion.query ? Math.min(previous.index, Math.max(0, count - 1)) : 0;\n slashState.current = { props: suggestion, index };\n setSlash(snapshot(suggestion));\n setSlashIndex(index);\n },\n onKeyDown: ({ event }) => {\n const current = slashState.current;\n if (!current.props) return false;\n const count = current.props.items.length;\n const go = (index: number) => {\n slashState.current = { ...current, index };\n setSlashIndex(index);\n };\n switch (event.key) {\n case \"ArrowDown\":\n if (count === 0) return true;\n go((current.index + 1) % count);\n return true;\n case \"ArrowUp\":\n if (count === 0) return true;\n go((current.index - 1 + count) % count);\n return true;\n case \"Enter\":\n case \"Tab\": {\n const item = current.props.items[current.index];\n if (!item) return false;\n current.props.command(item);\n return true;\n }\n case \"Escape\": {\n const editor = editorRef.current;\n if (editor) exitSuggestion(editor.view, slashPluginKey);\n return true;\n }\n default:\n return false;\n }\n },\n onExit: () => {\n slashState.current = { props: null, index: 0 };\n setSlash(null);\n },\n }),\n [],\n );\n runtime.slash = bridge;\n\n // --- The engine -----------------------------------------------------------\n\n const builtExtensions = useMemo(\n () => createExtensions({ runtime, ...(extensions ? { extra: extensions } : {}) }),\n // Extensions are created once; props they depend on are read through the runtime.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const attributes: Record<string, string> = {\n \"data-kit\": \"editor-content\",\n role: editable ? \"textbox\" : \"document\",\n ...(editable ? { \"aria-multiline\": \"true\" } : {}),\n ...(ariaLabelledby ? { \"aria-labelledby\": ariaLabelledby } : { \"aria-label\": ariaLabel ?? translator.messages.editorLabel }),\n ...(locale ? { lang: locale } : {}),\n ...(slashIds.listbox ? { \"aria-controls\": slashIds.listbox } : {}),\n ...(slashIds.active ? { \"aria-activedescendant\": slashIds.active } : {}),\n };\n\n const api = useMemo<EditorApi>(\n () => ({\n getDocument: () => readDocument(),\n setDocument: (doc) => writeDocument(doc),\n focus: (position) => {\n editorRef.current?.commands.focus(position ?? null);\n },\n insertBlock: async (type, attrs = {}) => {\n const editor = editorRef.current;\n if (!editor) return null;\n const kind = normalizeBlockKind(type, attrs);\n if (kind === null) return null;\n let payload: Record<string, unknown> = attrs;\n const embed: EmbedType | null = embedKindToType(kind);\n const request = latest.current.onRequestBlock;\n if (embed && request && Object.keys(attrs).length === 0) {\n const result = await request(embed);\n if (result === null || result === undefined) return null;\n payload = embed === \"chart\" ? { spec: result } : (result as unknown as Record<string, unknown>);\n }\n editor.commands.focus();\n return insertBlockKind(editor, kind, payload);\n },\n exec: (command) => {\n const editor = editorRef.current;\n return editor ? execEditorCommand(editor, command, () => setDialog({ kind: \"block-menu\" })) : false;\n },\n getMarkdown: () => documentToMarkdown(readDocument()),\n getOutline: () => getOutline(readDocument()),\n getEngine: () => editorRef.current,\n announce: (text) => announce(text),\n }),\n [readDocument, writeDocument, announce],\n );\n\n useImperativeHandle(props.ref, () => api, [api]);\n\n const editor = useEditor({\n extensions: builtExtensions,\n content: initial.json,\n editable,\n autofocus: autoFocus === true ? \"end\" : autoFocus === \"start\" || autoFocus === \"end\" ? autoFocus : false,\n immediatelyRender: false,\n shouldRerenderOnTransaction: false,\n injectCSS: false,\n editorProps: { attributes },\n onCreate: ({ editor: created }) => {\n editorRef.current = created;\n if (initial.warnings.length > 0) latest.current.onWarnings?.(initial.warnings);\n latest.current.onReady?.(api);\n },\n onUpdate: () => schedule(),\n onSelectionUpdate: ({ editor: current }) => latest.current.onSelectionChange?.(getSelectionInfo(current)),\n });\n editorRef.current = editor;\n\n // Controlled value: apply a document that did not come from this editor.\n useEffect(() => {\n if (!editor || value === undefined) return;\n if (value === lastDocRef.current) return;\n if (deepEqual(readDocument(), value)) {\n lastDocRef.current = value;\n return;\n }\n writeDocument(value);\n }, [editor, value, readDocument, writeDocument]);\n\n useEffect(() => {\n if (editor && editor.isEditable !== editable) editor.setEditable(editable, false);\n }, [editor, editable]);\n\n const assist = useAiAssist({ provider: aiProvider, editor, announce });\n const openAi = assist.available ? () => setDialog({ kind: \"ai\" }) : undefined;\n\n const onSlashIds = useCallback((ids: { listbox: string | null; active: string | null }) => {\n setSlashIds((previous) => (previous.listbox === ids.listbox && previous.active === ids.active ? previous : ids));\n }, []);\n\n const onSlashSelect = useCallback((item: SlashItem) => {\n slashState.current.props?.command(item);\n }, []);\n\n const onSlashHover = useCallback((index: number) => {\n slashState.current = { ...slashState.current, index };\n setSlashIndex(index);\n }, []);\n\n return (\n <MessagesContext.Provider value={translator}>\n <EditorUiContext.Provider value={ui}>\n <EngineContext.Provider value={editor}>\n <div data-kit=\"editor\" data-editable={editable ? \"\" : undefined} className={className}>\n {toolbar && editable ? (\n <EditorToolbar\n editor={editor}\n onOpenLink={openLinkDialog}\n onOpenImage={() => openImageDialog()}\n onOpenBlockMenu={openBlockMenu}\n onOpenAi={openAi}\n announce={announce}\n >\n {toolbarEnd}\n </EditorToolbar>\n ) : null}\n <div data-kit=\"editor-surface\" ref={surfaceRef}>\n {editor ? (\n <EditorContent editor={editor} data-kit=\"editor-body\" />\n ) : (\n <EditorView\n value={initial.doc}\n {...(blockRenderers ? { blockRenderers } : {})}\n {...(messages ? { messages } : {})}\n {...(locale ? { locale } : {})}\n {...(ariaLabel ? { \"aria-label\": ariaLabel } : {})}\n {...(ariaLabelledby ? { \"aria-labelledby\": ariaLabelledby } : {})}\n />\n )}\n {editor && editable && selectionMenu ? (\n <BubbleMenu editor={editor} surfaceRef={surfaceRef} onOpenLink={openLinkDialog} {...(openAi ? { onOpenAi: openAi } : {})} announce={announce} />\n ) : null}\n {editor && editable && slash ? (\n <SlashMenu\n view={slash}\n activeIndex={slashIndex}\n surfaceRef={surfaceRef}\n onHover={onSlashHover}\n onSelect={onSlashSelect}\n onIds={onSlashIds}\n />\n ) : null}\n {editor && dialog?.kind === \"block-menu\" ? (\n <BlockMenu editor={editor} surfaceRef={surfaceRef} onClose={closeDialog} announce={announce} />\n ) : null}\n {editor && dialog?.kind === \"ai\" ? (\n <AiAssistMenu assist={assist} editor={editor} onClose={closeDialog} />\n ) : null}\n </div>\n <LiveRegion message={statusMessage} />\n {editor && dialog?.kind === \"link\" ? (\n <LinkDialog editor={editor} initialHref={dialog.href} onClose={closeDialog} announce={announce} />\n ) : null}\n {editor && dialog?.kind === \"image\" ? (\n <ImageDialog editor={editor} {...(dialog.pos === undefined ? {} : { pos: dialog.pos })} onClose={closeDialog} announce={announce} />\n ) : null}\n </div>\n </EngineContext.Provider>\n </EditorUiContext.Provider>\n </MessagesContext.Provider>\n );\n}\n","import { useEffect, useRef, useState, type FormEvent } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport { Button, Spinner } from \"@x12i/ui\";\nimport { Glyph } from \"./internal/glyphs\";\nimport { useTranslator } from \"./messages\";\nimport type { UseAiAssist } from \"./use-ai-assist\";\n\nexport interface AiAssistMenuProps {\n assist: UseAiAssist;\n editor: Editor;\n onClose: () => void;\n}\n\n/**\n * A small panel for the AI assistant: pick an action, watch the suggestion\n * stream in, then accept or reject it. Nothing is written to the document\n * until Accept. It is not modal; Escape closes it and returns to the text.\n */\nexport function AiAssistMenu({ assist, editor, onClose }: AiAssistMenuProps) {\n const t = useTranslator();\n const m = t.messages.ai;\n const firstRef = useRef<HTMLButtonElement>(null);\n const acceptRef = useRef<HTMLButtonElement>(null);\n const [instruction, setInstruction] = useState(\"\");\n const { status } = assist;\n\n useEffect(() => {\n firstRef.current?.focus();\n }, []);\n\n // Move focus to Accept when a suggestion is ready, so Enter applies it.\n useEffect(() => {\n if (status === \"preview\") acceptRef.current?.focus();\n }, [status]);\n\n const close = () => {\n assist.reject();\n onClose();\n editor.commands.focus();\n };\n\n const custom = (event: FormEvent) => {\n event.preventDefault();\n const text = instruction.trim();\n if (text !== \"\") void assist.run(\"rewrite\", { tone: text });\n };\n\n const busy = status === \"running\";\n\n return (\n <div\n role=\"group\"\n aria-label={m.menuLabel}\n data-kit=\"editor-ai\"\n data-status={status}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n close();\n }\n }}\n >\n {status === \"idle\" || status === \"error\" ? (\n <>\n <div data-kit=\"editor-ai-actions\">\n <Button ref={firstRef} type=\"button\" size=\"sm\" variant=\"soft\" tone=\"neutral\" onMouseDown={(event) => event.preventDefault()} onClick={() => void assist.run(\"rewrite\", { tone: m.prompts.improve })}>\n {m.improve}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"soft\" tone=\"neutral\" onMouseDown={(event) => event.preventDefault()} onClick={() => void assist.run(\"summarize\", { tone: m.prompts.shorten })}>\n {m.shorten}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"soft\" tone=\"neutral\" onMouseDown={(event) => event.preventDefault()} onClick={() => void assist.run(\"continue\", { tone: m.prompts.continue })}>\n {m.continue}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"soft\" tone=\"neutral\" onMouseDown={(event) => event.preventDefault()} onClick={() => void assist.run(\"fix-grammar\")}>\n {m.fixGrammar}\n </Button>\n </div>\n <form data-kit=\"editor-ai-custom\" onSubmit={custom}>\n <label data-kit=\"editor-field\">\n <span data-kit=\"editor-field-label\">{m.customLabel}</span>\n <input data-kit=\"editor-input\" type=\"text\" dir=\"auto\" value={instruction} onChange={(event) => setInstruction(event.target.value)} />\n </label>\n <Button type=\"submit\" size=\"sm\" variant=\"solid\" tone=\"accent\" disabled={instruction.trim() === \"\"}>\n {m.run}\n </Button>\n </form>\n {status === \"error\" && assist.error ? (\n <p role=\"alert\" data-kit=\"editor-error\">\n {assist.error}\n </p>\n ) : null}\n </>\n ) : (\n <>\n <div data-kit=\"editor-ai-preview\" aria-busy={busy}>\n <p data-kit=\"editor-ai-preview-label\">\n {busy ? <Spinner size=\"xs\" label={m.generating} /> : <Glyph name=\"sparkle\" />}\n <span>{busy ? m.generating : m.preview}</span>\n </p>\n <div data-kit=\"editor-ai-preview-text\" dir=\"auto\" tabIndex={0} role=\"region\" aria-label={m.preview}>\n {assist.preview}\n </div>\n </div>\n <div data-kit=\"editor-ai-actions\">\n <Button ref={acceptRef} type=\"button\" size=\"sm\" variant=\"solid\" tone=\"accent\" disabled={busy} onClick={() => { assist.accept(); onClose(); }}>\n {m.accept}\n </Button>\n {busy ? (\n <Button type=\"button\" size=\"sm\" variant=\"outline\" tone=\"neutral\" onClick={assist.cancel}>\n {m.cancel}\n </Button>\n ) : null}\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" tone=\"neutral\" onClick={close}>\n {m.reject}\n </Button>\n </div>\n </>\n )}\n </div>\n );\n}\n","import type { SVGProps } from \"react\";\n\n/** Small line glyphs for the editor chrome. The kit icon set has no rich-text icons, so these live here. */\nconst PATHS = {\n undo: \"M6 3 3 6l3 3 M3 6h6a4 4 0 0 1 0 8H6\",\n redo: \"m10 3 3 3-3 3 M13 6H7a4 4 0 0 0 0 8h3\",\n bold: \"M4 2.5h4.5a2.5 2.5 0 0 1 0 5H4z M4 7.5h5a2.75 2.75 0 0 1 0 5.5H4z\",\n italic: \"M7 3h5 M4 13h5 M10 3 6 13\",\n underline: \"M4 2.5V8a4 4 0 0 0 8 0V2.5 M3 14h10\",\n strike: \"M3 8h10 M10.8 5.2C10.5 3.9 9.4 3 8 3 6.3 3 5.2 4 5.2 5.2c0 1 .6 1.7 1.8 2 M5.2 10.8C5.5 12.1 6.6 13 8 13c1.7 0 2.8-1 2.8-2.2 0-.4-.1-.7-.3-1\",\n code: \"m6 4-4 4 4 4 M10 4l4 4-4 4\",\n highlight: \"m9 2.5 4.5 4.5-5 5H5.5V8.5z M3 14h10\",\n color: \"M4.5 11 8 3l3.5 8 M5.7 8.5h4.6 M3 14.5h10\",\n link: \"M6.8 9.2a3 3 0 0 0 4.2 0l2-2a3 3 0 0 0-4.2-4.2l-1 1 M9.2 6.8a3 3 0 0 0-4.2 0l-2 2A3 3 0 0 0 7.200 13l1-1\",\n bullets: \"M6 4h8 M6 8h8 M6 12h8 M2.5 4h.1 M2.5 8h.1 M2.5 12h.1\",\n numbers: \"M6.5 4h7.500 M6.5 8h7.500 M6.5 12h7.500 M2 3.200l1-.7V6 M2 9.700c0-1.100 2-1.100 2 0 0 1-2 1.500-2 2.300h2\",\n tasks: \"m2 3.500 1.200 1.200L5.200 2.800 M2 9l1.200 1.200L5.200 8.300 M7.500 4h6.500 M7.500 9.500h6.500\",\n indent: \"M2 3h12 M8 7h6 M8 11h6 M2 14h12 M2 6l3 2.500L2 11\",\n outdent: \"M2 3h12 M8 7h6 M8 11h6 M2 14h12 M5 6 2 8.500 5 11\",\n quote: \"M3 3.500v9 M7 5h7 M7 8h7 M7 11h4.500\",\n divider: \"M2 8h12 M5 4.500h.1 M8 4.500h.1 M11 4.500h.1 M5 11.500h.1 M8 11.500h.1 M11 11.500h.1\",\n table: \"M2 3h12v10H2z M2 6.500h12 M2 9.800h12 M6 3v10 M10 3v10\",\n image: \"M2 3h12v10H2z m0 8 4-4 3 3 2-2 3 3 M10.500 5.800h.1\",\n up: \"M8 13V3 M4 7l4-4 4 4\",\n down: \"M8 3v10 M4 9l4 4 4-4\",\n duplicate: \"M5.500 5.500h8v8h-8z M10.500 5.500v-3h-8v8h3\",\n more: \"M3.500 8h.1 M8 8h.1 M12.500 8h.1\",\n heading: \"M3.500 3v10 M12.500 3v10 M3.500 8h9\",\n grip: \"M6 3.500h.1 M10 3.500h.1 M6 8h.1 M10 8h.1 M6 12.500h.1 M10 12.500h.1\",\n chevron: \"m4 6 4 4 4-4\",\n check: \"m3.500 8.500 3 3 6-7\",\n close: \"m4 4 8 8 M12 4l-8 8\",\n copy: \"M5.500 5.500h8v8h-8z M10.500 5.500v-3h-8v8h3\",\n trash: \"M3 4.500h10 M6 4.500v-2h4v2 M4.500 4.500l.6 9h5.800l.6-9 M7 7v4 M9 7v4\",\n edit: \"m3 13 .8-3L11 2.800a1.400 1.400 0 0 1 2 2L5.800 12z M9.800 4l2 2\",\n plus: \"M8 3v10 M3 8h10\",\n sparkle: \"M8 2l1.200 3.800L13 7l-3.800 1.200L8 12l-1.200-3.800L3 7l3.800-1.200z\",\n info: \"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z M8 7.500V11 M8 5h.1\",\n success: \"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z m-2.500-6 2 2 3-3.500\",\n warning: \"M8 2.500 14 13H2z M8 7v3 M8 11.500h.1\",\n danger: \"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z m-2-8 4 4 m0-4-4 4\",\n neutral: \"M3 3h10v10H3z M5.500 6h5 M5.500 8h5 M5.500 10h3\",\n file: \"M4 2h5l3 3v9H4z M9 2v3h3\",\n bookmark: \"M3 8h3 M10 8h3 M6 5h4a3 3 0 0 1 0 6H6a3 3 0 0 1 0-6z\",\n chevronEnd: \"m6 4 4 4-4 4\",\n unlink: \"M6.800 9.200a3 3 0 0 0 4.200 0l2-2a3 3 0 0 0-4.200-4.200l-1 1 M9.200 6.800a3 3 0 0 0-4.200 0l-2 2A3 3 0 0 0 7.200 13l1-1 M2 2l12 12\",\n} as const;\n\nexport type GlyphName = keyof typeof PATHS;\n\nexport interface GlyphProps extends Omit<SVGProps<SVGSVGElement>, \"name\"> {\n name: GlyphName;\n}\n\n/** A 16 by 16 line glyph that follows the text color. Decorative: the button carries the name. */\nexport function Glyph({ name, ...props }: GlyphProps) {\n return (\n <svg\n data-kit=\"editor-glyph\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n {...props}\n >\n <path d={PATHS[name]} />\n </svg>\n );\n}\n","/**\n * Every string the editor shows. Components contain no English: they read\n * from this table, so a product can translate the editor by passing a\n * `messages` prop. Templates use `{name}` placeholders and a small plural\n * form, `{count, plural, one {# item} other {# items}}`.\n */\nimport { createContext, useContext } from \"react\";\n\n/** The block kinds a person can insert or turn a block into. */\nexport type BlockKind =\n | \"paragraph\"\n | \"heading1\"\n | \"heading2\"\n | \"heading3\"\n | \"heading4\"\n | \"quote\"\n | \"callout\"\n | \"toggle\"\n | \"bulletList\"\n | \"numberedList\"\n | \"taskList\"\n | \"code\"\n | \"equation\"\n | \"divider\"\n | \"table\"\n | \"image\"\n | \"video\"\n | \"audio\"\n | \"file\"\n | \"bookmark\"\n | \"columns\"\n | \"pageBreak\"\n | \"toc\"\n | \"chart\"\n | \"diagram\"\n | \"dataView\"\n | \"ai\";\n\nexport const BLOCK_KINDS: readonly BlockKind[] = [\n \"paragraph\",\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"heading4\",\n \"quote\",\n \"callout\",\n \"toggle\",\n \"bulletList\",\n \"numberedList\",\n \"taskList\",\n \"code\",\n \"equation\",\n \"divider\",\n \"table\",\n \"image\",\n \"video\",\n \"audio\",\n \"file\",\n \"bookmark\",\n \"columns\",\n \"pageBreak\",\n \"toc\",\n \"chart\",\n \"diagram\",\n \"dataView\",\n \"ai\",\n];\n\nexport type BlockMessage = {\n name: string;\n description: string;\n /** Extra words that find the block in the slash menu. Space separated. */\n keywords: string;\n};\n\nexport type SlashGroup = \"basic\" | \"lists\" | \"media\" | \"advanced\" | \"embeds\";\n\nexport interface Messages {\n editorLabel: string;\n placeholder: string;\n viewLabel: string;\n\n toolbar: {\n label: string;\n undo: string;\n redo: string;\n blockType: string;\n bold: string;\n italic: string;\n underline: string;\n strike: string;\n code: string;\n highlight: string;\n textColor: string;\n clearColor: string;\n link: string;\n bulletList: string;\n numberedList: string;\n taskList: string;\n indent: string;\n outdent: string;\n quote: string;\n divider: string;\n table: string;\n image: string;\n selectionMenu: string;\n };\n\n /** Names for the color and highlight palettes, by token path. */\n tokens: Record<string, string>;\n\n blocks: Record<BlockKind, BlockMessage>;\n groups: Record<SlashGroup, string>;\n\n callouts: Record<\"info\" | \"success\" | \"warning\" | \"danger\" | \"neutral\", string>;\n\n slash: {\n label: string;\n noResults: string;\n resultCount: string;\n instructions: string;\n };\n\n blockMenu: {\n label: string;\n trigger: string;\n duplicate: string;\n delete: string;\n turnInto: string;\n moveUp: string;\n moveDown: string;\n insertBelow: string;\n };\n\n table: {\n addRowBefore: string;\n addRowAfter: string;\n addColumnBefore: string;\n addColumnAfter: string;\n deleteRow: string;\n deleteColumn: string;\n toggleHeaderRow: string;\n toggleHeaderColumn: string;\n deleteTable: string;\n controls: string;\n };\n\n linkDialog: {\n title: string;\n urlLabel: string;\n urlHint: string;\n invalid: string;\n required: string;\n apply: string;\n remove: string;\n cancel: string;\n };\n\n imageDialog: {\n title: string;\n editTitle: string;\n urlLabel: string;\n altLabel: string;\n altHint: string;\n altRequired: string;\n decorative: string;\n captionLabel: string;\n urlRequired: string;\n urlInvalid: string;\n insert: string;\n update: string;\n cancel: string;\n };\n\n code: {\n language: string;\n plainText: string;\n copy: string;\n copied: string;\n };\n\n task: {\n done: string;\n todo: string;\n emptyLabel: string;\n };\n\n toggle: {\n expand: string;\n collapse: string;\n summaryPlaceholder: string;\n };\n\n equation: {\n label: string;\n placeholder: string;\n };\n\n embed: {\n groupLabel: string;\n untitled: string;\n edit: string;\n remove: string;\n moveUp: string;\n moveDown: string;\n toolbar: string;\n request: string;\n previewHint: string;\n showData: string;\n dataset: string;\n prompt: string;\n result: string;\n engine: string;\n unknown: string;\n };\n\n media: {\n file: string;\n download: string;\n bookmark: string;\n open: string;\n unsafe: string;\n image: string;\n imageDecorative: string;\n imageEdit: string;\n video: string;\n audio: string;\n urlLabel: string;\n nameLabel: string;\n set: string;\n };\n\n ai: {\n menuLabel: string;\n improve: string;\n shorten: string;\n continue: string;\n fixGrammar: string;\n custom: string;\n customLabel: string;\n run: string;\n accept: string;\n reject: string;\n cancel: string;\n generating: string;\n preview: string;\n error: string;\n noSelection: string;\n done: string;\n /** Instructions handed to the provider as the `tone` of a rewrite. */\n prompts: { improve: string; shorten: string; continue: string };\n };\n\n status: {\n saved: string;\n markOn: string;\n markOff: string;\n blockMoved: string;\n blockMovedUp: string;\n blockMovedDown: string;\n blockDuplicated: string;\n blockDeleted: string;\n blockTurnedInto: string;\n linkApplied: string;\n linkRemoved: string;\n imageInserted: string;\n copied: string;\n undone: string;\n redone: string;\n aiApplied: string;\n cannotMove: string;\n };\n\n directions: { up: string; down: string };\n}\n\nexport const defaultMessages: Messages = {\n editorLabel: \"Document editor\",\n placeholder: \"Write something, or press / for blocks\",\n viewLabel: \"Document\",\n\n toolbar: {\n label: \"Formatting\",\n undo: \"Undo\",\n redo: \"Redo\",\n blockType: \"Block type\",\n bold: \"Bold\",\n italic: \"Italic\",\n underline: \"Underline\",\n strike: \"Strikethrough\",\n code: \"Inline code\",\n highlight: \"Highlight\",\n textColor: \"Text color\",\n clearColor: \"Default color\",\n link: \"Link\",\n bulletList: \"Bulleted list\",\n numberedList: \"Numbered list\",\n taskList: \"Task list\",\n indent: \"Increase indent\",\n outdent: \"Decrease indent\",\n quote: \"Quote\",\n divider: \"Divider\",\n table: \"Insert table\",\n image: \"Insert image\",\n selectionMenu: \"Text formatting\",\n },\n\n tokens: {\n \"color.text.secondary\": \"Gray\",\n \"color.text.link\": \"Link blue\",\n \"color.accent.default\": \"Accent\",\n \"color.status.success.foreground\": \"Green\",\n \"color.status.warning.foreground\": \"Orange\",\n \"color.status.danger.foreground\": \"Red\",\n \"color.status.info.foreground\": \"Blue\",\n \"color.chart.categorical.4\": \"Magenta\",\n \"color.highlight\": \"Yellow\",\n \"color.accent.subtle\": \"Accent\",\n \"color.status.success.background\": \"Green\",\n \"color.status.warning.background\": \"Orange\",\n \"color.status.danger.background\": \"Red\",\n \"color.status.info.background\": \"Blue\",\n },\n\n blocks: {\n paragraph: { name: \"Text\", description: \"Plain paragraph text\", keywords: \"paragraph plain body\" },\n heading1: { name: \"Heading 1\", description: \"Large section heading\", keywords: \"h1 title header\" },\n heading2: { name: \"Heading 2\", description: \"Medium section heading\", keywords: \"h2 subtitle header\" },\n heading3: { name: \"Heading 3\", description: \"Small section heading\", keywords: \"h3 header\" },\n heading4: { name: \"Heading 4\", description: \"Smallest section heading\", keywords: \"h4 header\" },\n quote: { name: \"Quote\", description: \"Quote another voice\", keywords: \"blockquote citation\" },\n callout: { name: \"Callout\", description: \"Highlight a note or warning\", keywords: \"note alert info warning tip admonition\" },\n toggle: { name: \"Toggle\", description: \"Content that expands and collapses\", keywords: \"collapse details accordion expand\" },\n bulletList: { name: \"Bulleted list\", description: \"A simple list of points\", keywords: \"ul unordered bullets\" },\n numberedList: { name: \"Numbered list\", description: \"A list with numbers\", keywords: \"ol ordered steps\" },\n taskList: { name: \"Task list\", description: \"Track to-dos with checkboxes\", keywords: \"todo checklist checkbox\" },\n code: { name: \"Code\", description: \"A block of code with a language\", keywords: \"snippet pre programming\" },\n equation: { name: \"Equation\", description: \"A formula written in LaTeX\", keywords: \"math latex formula\" },\n divider: { name: \"Divider\", description: \"A horizontal rule between sections\", keywords: \"hr rule line separator\" },\n table: { name: \"Table\", description: \"Rows and columns of data\", keywords: \"grid rows columns\" },\n image: { name: \"Image\", description: \"An image with alternative text\", keywords: \"picture photo figure\" },\n video: { name: \"Video\", description: \"Embed a video by URL\", keywords: \"movie clip\" },\n audio: { name: \"Audio\", description: \"Embed audio by URL\", keywords: \"sound podcast\" },\n file: { name: \"File\", description: \"Link to a downloadable file\", keywords: \"attachment download pdf\" },\n bookmark: { name: \"Bookmark\", description: \"A link shown as a card\", keywords: \"link url website card\" },\n columns: { name: \"Columns\", description: \"Side by side blocks\", keywords: \"layout two three\" },\n pageBreak: { name: \"Page break\", description: \"Start a new page when printing\", keywords: \"print pdf\" },\n toc: { name: \"Table of contents\", description: \"Links to every heading\", keywords: \"outline toc navigation\" },\n chart: { name: \"Chart\", description: \"A chart built from data\", keywords: \"graph plot bar line pie\" },\n diagram: { name: \"Diagram\", description: \"A flow or system diagram\", keywords: \"flowchart mermaid graph\" },\n dataView: { name: \"Data view\", description: \"A saved view of a dataset\", keywords: \"table grid records query\" },\n ai: { name: \"AI block\", description: \"Ask AI to write or summarize\", keywords: \"assistant generate gpt llm\" },\n },\n\n groups: {\n basic: \"Basic blocks\",\n lists: \"Lists\",\n media: \"Media\",\n advanced: \"Advanced\",\n embeds: \"Embeds\",\n },\n\n callouts: {\n info: \"Info\",\n success: \"Success\",\n warning: \"Warning\",\n danger: \"Danger\",\n neutral: \"Note\",\n },\n\n slash: {\n label: \"Insert a block\",\n noResults: \"No matching blocks\",\n resultCount: \"{count, plural, one {# block available} other {# blocks available}}\",\n instructions: \"Type to filter, use the arrow keys to choose, Enter to insert, Escape to close\",\n },\n\n blockMenu: {\n label: \"Block actions\",\n trigger: \"Block actions (Ctrl+/)\",\n duplicate: \"Duplicate\",\n delete: \"Delete\",\n turnInto: \"Turn into\",\n moveUp: \"Move up\",\n moveDown: \"Move down\",\n insertBelow: \"Add paragraph below\",\n },\n\n table: {\n addRowBefore: \"Add row above\",\n addRowAfter: \"Add row below\",\n addColumnBefore: \"Add column before\",\n addColumnAfter: \"Add column after\",\n deleteRow: \"Delete row\",\n deleteColumn: \"Delete column\",\n toggleHeaderRow: \"Header row\",\n toggleHeaderColumn: \"Header column\",\n deleteTable: \"Delete table\",\n controls: \"Table controls\",\n },\n\n linkDialog: {\n title: \"Link\",\n urlLabel: \"Link address\",\n urlHint: \"Use http, https, mailto, tel, or a relative path\",\n invalid: \"This address is not allowed. Use http, https, mailto, tel or a relative path.\",\n required: \"Enter a link address.\",\n apply: \"Apply\",\n remove: \"Remove link\",\n cancel: \"Cancel\",\n },\n\n imageDialog: {\n title: \"Insert image\",\n editTitle: \"Edit image\",\n urlLabel: \"Image address\",\n altLabel: \"Alternative text\",\n altHint: \"Describe the image for people who cannot see it\",\n altRequired: \"Describe the image, or mark it as decorative.\",\n decorative: \"This image is decorative and needs no description\",\n captionLabel: \"Caption (optional)\",\n urlRequired: \"Enter an image address.\",\n urlInvalid: \"This address is not allowed. Use http, https, a relative path, or a data:image URL.\",\n insert: \"Insert\",\n update: \"Update\",\n cancel: \"Cancel\",\n },\n\n code: {\n language: \"Code language\",\n plainText: \"Plain text\",\n copy: \"Copy code\",\n copied: \"Copied\",\n },\n\n task: {\n done: \"Mark as not done: {text}\",\n todo: \"Mark as done: {text}\",\n emptyLabel: \"empty task\",\n },\n\n toggle: {\n expand: \"Expand\",\n collapse: \"Collapse\",\n summaryPlaceholder: \"Toggle title\",\n },\n\n equation: {\n label: \"LaTeX equation\",\n placeholder: \"Type LaTeX, for example E = mc^2\",\n },\n\n embed: {\n groupLabel: \"{type}: {title}\",\n untitled: \"Untitled\",\n edit: \"Edit\",\n remove: \"Remove\",\n moveUp: \"Move up\",\n moveDown: \"Move down\",\n toolbar: \"Block tools\",\n request: \"Choose content for this block\",\n previewHint: \"Preview of the block data. Connect a renderer to draw it.\",\n showData: \"Show data\",\n dataset: \"Dataset\",\n prompt: \"Prompt\",\n result: \"Result\",\n engine: \"Engine\",\n unknown: \"This block type is not supported here. Its data is kept.\",\n },\n\n media: {\n file: \"File\",\n download: \"Download {name}\",\n bookmark: \"Bookmark\",\n open: \"Open {title}\",\n unsafe: \"This address is not allowed\",\n image: \"Image\",\n imageDecorative: \"Decorative image\",\n imageEdit: \"Edit image\",\n video: \"Video\",\n audio: \"Audio\",\n urlLabel: \"Address\",\n nameLabel: \"Name\",\n set: \"Set\",\n },\n\n ai: {\n menuLabel: \"AI assistant\",\n improve: \"Improve writing\",\n shorten: \"Make shorter\",\n continue: \"Continue writing\",\n fixGrammar: \"Fix spelling and grammar\",\n custom: \"Ask AI\",\n customLabel: \"Instruction\",\n run: \"Run\",\n accept: \"Accept\",\n reject: \"Reject\",\n cancel: \"Stop\",\n generating: \"Writing a suggestion\",\n preview: \"Suggestion\",\n error: \"The assistant could not finish: {message}\",\n noSelection: \"Select some text first\",\n done: \"Suggestion ready\",\n prompts: {\n improve: \"Improve the clarity and flow of the text while keeping its meaning\",\n shorten: \"Make the text shorter while keeping its meaning\",\n continue: \"Continue writing from where the text ends\",\n },\n },\n\n status: {\n saved: \"Saved\",\n markOn: \"{name} on\",\n markOff: \"{name} off\",\n blockMoved: \"Block moved to position {position} of {total}\",\n blockMovedUp: \"Block moved up\",\n blockMovedDown: \"Block moved down\",\n blockDuplicated: \"Block duplicated\",\n blockDeleted: \"Block deleted\",\n blockTurnedInto: \"Turned into {name}\",\n linkApplied: \"Link applied\",\n linkRemoved: \"Link removed\",\n imageInserted: \"Image inserted\",\n copied: \"Copied to clipboard\",\n undone: \"Undone\",\n redone: \"Redone\",\n aiApplied: \"Suggestion applied\",\n cannotMove: \"This block cannot move further\",\n },\n\n directions: { up: \"up\", down: \"down\" },\n};\n\nexport type DeepPartial<T> = { [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K] };\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Overlays a partial table on a base table. Missing keys keep the base text. */\nexport function mergeMessages(base: Messages, overrides?: DeepPartial<Messages>): Messages {\n if (!overrides) return base;\n const merge = (target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> => {\n const result: Record<string, unknown> = { ...target };\n for (const [key, value] of Object.entries(source)) {\n if (value === undefined) continue;\n const current = result[key];\n result[key] = isPlainObject(value) && isPlainObject(current) ? merge(current, value) : value;\n }\n return result;\n };\n return merge(base as unknown as Record<string, unknown>, overrides as Record<string, unknown>) as unknown as Messages;\n}\n\n// ---------------------------------------------------------------------------\n// Formatting\n// ---------------------------------------------------------------------------\n\n/** Finds the matching closing brace for the `{` at `start`, or -1. */\nfunction matchBrace(text: string, start: number): number {\n let depth = 0;\n for (let index = start; index < text.length; index += 1) {\n if (text[index] === \"{\") depth += 1;\n else if (text[index] === \"}\") {\n depth -= 1;\n if (depth === 0) return index;\n }\n }\n return -1;\n}\n\n/**\n * Fills `{name}` placeholders and `{name, plural, one {...} other {...}}`\n * blocks (`#` stands for the number). Unknown names stay as written.\n */\nexport function formatMessage(template: string, values: Record<string, string | number> = {}, locale?: string): string {\n let out = \"\";\n let index = 0;\n while (index < template.length) {\n const char = template[index] as string;\n if (char !== \"{\") {\n out += char;\n index += 1;\n continue;\n }\n const end = matchBrace(template, index);\n if (end === -1) {\n out += template.slice(index);\n break;\n }\n const inner = template.slice(index + 1, end);\n const plural = /^\\s*([\\w-]+)\\s*,\\s*plural\\s*,([\\s\\S]*)$/.exec(inner);\n if (plural) {\n const name = plural[1] as string;\n const count = Number(values[name] ?? 0);\n const branches = new Map<string, string>();\n const body = plural[2] as string;\n let cursor = 0;\n while (cursor < body.length) {\n const selector = /^\\s*(=\\d+|[a-z]+)\\s*\\{/.exec(body.slice(cursor));\n if (!selector) break;\n const open = cursor + selector[0].length - 1;\n const close = matchBrace(body, open);\n if (close === -1) break;\n branches.set(selector[1] as string, body.slice(open + 1, close));\n cursor = close + 1;\n }\n let category: string;\n try {\n category = new Intl.PluralRules(locale).select(count);\n } catch {\n category = count === 1 ? \"one\" : \"other\";\n }\n const chosen = branches.get(`=${count}`) ?? branches.get(category) ?? branches.get(\"other\") ?? \"\";\n out += formatMessage(chosen.replace(/#/g, String(count)), values, locale);\n } else {\n const name = inner.trim();\n out += name in values ? String(values[name]) : `{${inner}}`;\n }\n index = end + 1;\n }\n return out;\n}\n\n/** A translator bound to one message table. */\nexport interface Translator {\n messages: Messages;\n locale: string | undefined;\n /** Formats a template from the table. */\n format: (template: string, values?: Record<string, string | number>) => string;\n}\n\nexport function createTranslator(messages: Messages, locale?: string): Translator {\n return {\n messages,\n locale,\n format: (template, values) => formatMessage(template, values, locale),\n };\n}\n\nexport const MessagesContext = createContext<Translator>(createTranslator(defaultMessages));\n\n/** Reads the translator of the nearest editor. */\nexport function useTranslator(): Translator {\n return useContext(MessagesContext);\n}\n\n/** Reads the message table of the nearest editor. */\nexport function useMessages(): Messages {\n return useContext(MessagesContext).messages;\n}\n","import { useState, type CSSProperties, type RefObject } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport { currentBlockKind, deleteBlock, duplicateBlock, findBlock, moveBlock, TURN_INTO_KINDS, turnInto } from \"./commands\";\nimport { MenuList, type MenuItemSpec } from \"./internal/menu\";\nimport { positionNear, type PopupPosition } from \"./internal/position\";\nimport { useTranslator } from \"./messages\";\n\nexport interface BlockMenuProps {\n editor: Editor;\n surfaceRef: RefObject<HTMLElement | null>;\n onClose: () => void;\n announce: (message: string) => void;\n}\n\n/** Block actions at the selection: turn into, move, duplicate, delete, add below. Opened with Ctrl or Cmd + /. */\nexport function BlockMenu({ editor, surfaceRef, onClose, announce }: BlockMenuProps) {\n const t = useTranslator();\n const m = t.messages;\n const [position] = useState<PopupPosition>(() => {\n const surface = surfaceRef.current;\n if (!surface) return { x: 0, y: 0 };\n try {\n return positionNear(surface, editor.view.coordsAtPos(editor.state.selection.from), \"bottom\");\n } catch {\n return { x: 0, y: 0 };\n }\n });\n const current = currentBlockKind(editor);\n const turnable = current !== null && TURN_INTO_KINDS.includes(current);\n\n const items: MenuItemSpec[] = [\n ...(turnable\n ? TURN_INTO_KINDS.map(\n (kind, index): MenuItemSpec => ({\n id: `turn-${kind}`,\n label: m.blocks[kind].name,\n role: \"menuitemradio\",\n checked: current === kind,\n heading: index === 0 ? m.blockMenu.turnInto : undefined,\n onSelect: () => {\n if (turnInto(editor, kind)) announce(t.format(m.status.blockTurnedInto, { name: m.blocks[kind].name }));\n },\n }),\n )\n : []),\n {\n id: \"move-up\",\n label: m.blockMenu.moveUp,\n onSelect: () => {\n const result = moveBlock(editor, -1);\n announce(result.moved ? t.format(m.status.blockMoved, { position: result.position, total: result.total }) : m.status.cannotMove);\n },\n },\n {\n id: \"move-down\",\n label: m.blockMenu.moveDown,\n onSelect: () => {\n const result = moveBlock(editor, 1);\n announce(result.moved ? t.format(m.status.blockMoved, { position: result.position, total: result.total }) : m.status.cannotMove);\n },\n },\n {\n id: \"duplicate\",\n label: m.blockMenu.duplicate,\n onSelect: () => {\n if (duplicateBlock(editor)) announce(m.status.blockDuplicated);\n },\n },\n {\n id: \"insert-below\",\n label: m.blockMenu.insertBelow,\n onSelect: () => {\n const location = findBlock(editor.state, { items: false });\n if (!location) return;\n const at = location.pos + location.node.nodeSize;\n editor\n .chain()\n .insertContentAt(at, { type: \"paragraph\" })\n .setTextSelection(at + 1)\n .run();\n },\n },\n {\n id: \"delete\",\n label: m.blockMenu.delete,\n onSelect: () => {\n if (deleteBlock(editor)) announce(m.status.blockDeleted);\n },\n },\n ];\n\n return (\n <div\n data-kit=\"editor-popup\"\n data-placement=\"below\"\n style={{ \"--kit-editor-x\": `${position.x}px`, \"--kit-editor-y\": `${position.y}px` } as CSSProperties}\n >\n <MenuList\n label={m.blockMenu.label}\n items={items}\n onClose={() => {\n onClose();\n // The text selection is still in the editor state; put the caret back.\n editor.commands.focus();\n }}\n />\n </div>\n );\n}\n","/**\n * Editor commands that work on whole blocks: move, duplicate, delete, turn\n * into, insert. They operate on a Tiptap `Editor` and announce nothing; the\n * caller decides what to say through the status region.\n */\nimport type { Editor, JSONContent } from \"@tiptap/core\";\nimport type { Node as PMNode } from \"@tiptap/pm/model\";\nimport { NodeSelection, Selection, TextSelection, type EditorState } from \"@tiptap/pm/state\";\nimport { BLOCK_ID_NODES } from \"../tiptap-json\";\nimport { BLOCK_KINDS, type BlockKind } from \"./messages\";\nimport type { EditorCommand, EmbedPayloads, EmbedType, SelectionInfo } from \"./types\";\n\nconst CONTAINERS = new Set([\"doc\", \"toggle\", \"column\"]);\nconst ITEMS = new Set([\"listItem\", \"taskItem\"]);\nconst LISTS = new Set([\"bulletList\", \"orderedList\", \"taskList\"]);\n\nexport interface BlockLocation {\n /** Position before the node. */\n pos: number;\n node: PMNode;\n parent: PMNode;\n index: number;\n}\n\nfunction isMovable(node: PMNode, parent: PMNode): boolean {\n const name = node.type.name;\n if (ITEMS.has(name)) return LISTS.has(parent.type.name);\n return BLOCK_ID_NODES.includes(name) && CONTAINERS.has(parent.type.name);\n}\n\n/** Resolves the block that starts at `pos` (a position before a node). */\nexport function blockAt(state: EditorState, pos: number): BlockLocation | null {\n if (pos < 0 || pos > state.doc.content.size) return null;\n const $pos = state.doc.resolve(pos);\n const node = $pos.nodeAfter;\n if (!node) return null;\n return { pos, node, parent: $pos.parent, index: $pos.index() };\n}\n\n/**\n * The block the selection is in. With `items` set, a list item counts as a\n * block (for move, duplicate and delete); without it only blocks of the\n * document model do (for insertion).\n */\nexport function findBlock(state: EditorState, options: { items?: boolean; at?: number } = {}): BlockLocation | null {\n const items = options.items ?? true;\n if (options.at !== undefined) return blockAt(state, options.at);\n const { selection } = state;\n if (selection instanceof NodeSelection) {\n const parent = selection.$from.parent;\n if (isMovable(selection.node, parent) && (items || !ITEMS.has(selection.node.type.name))) {\n return { pos: selection.from, node: selection.node, parent, index: selection.$from.index() };\n }\n }\n const { $from } = selection;\n for (let depth = $from.depth; depth >= 1; depth -= 1) {\n const node = $from.node(depth);\n const parent = $from.node(depth - 1);\n if (!isMovable(node, parent)) continue;\n if (!items && ITEMS.has(node.type.name)) continue;\n return { pos: $from.before(depth), node, parent, index: $from.index(depth - 1) };\n }\n return null;\n}\n\nexport interface MoveResult {\n moved: boolean;\n /** 1-based position among the siblings after the move. */\n position: number;\n total: number;\n}\n\n/** Swaps a block with its neighbour. Returns what happened so the caller can announce it. */\nexport function moveBlock(editor: Editor, direction: -1 | 1, at?: number): MoveResult {\n const { state, view } = editor;\n const location = findBlock(state, at === undefined ? {} : { at });\n const none: MoveResult = { moved: false, position: location ? location.index + 1 : 0, total: location ? location.parent.childCount : 0 };\n if (!location) return none;\n const { pos, node, parent, index } = location;\n const siblingIndex = index + direction;\n if (siblingIndex < 0 || siblingIndex >= parent.childCount) return none;\n const sibling = parent.child(siblingIndex);\n if (sibling.type.name === \"toggleSummary\" || node.type.name === \"toggleSummary\") return none;\n\n const { selection } = state;\n const wasNode = selection instanceof NodeSelection && selection.from === pos;\n const offset = Math.max(0, selection.from - pos);\n const tr = state.tr;\n let newPos: number;\n if (direction < 0) {\n newPos = pos - sibling.nodeSize;\n tr.delete(pos, pos + node.nodeSize).insert(newPos, node);\n } else {\n newPos = pos + sibling.nodeSize;\n tr.insert(pos + node.nodeSize + sibling.nodeSize, node).delete(pos, pos + node.nodeSize);\n }\n if (wasNode) tr.setSelection(NodeSelection.create(tr.doc, newPos));\n else tr.setSelection(TextSelection.near(tr.doc.resolve(Math.min(newPos + offset, tr.doc.content.size)), 1));\n view.dispatch(tr.scrollIntoView());\n return { moved: true, position: siblingIndex + 1, total: parent.childCount };\n}\n\n/** Copies the block after itself. The copy gets a fresh id from the BlockId extension. */\nexport function duplicateBlock(editor: Editor, at?: number): boolean {\n const { state, view } = editor;\n const location = findBlock(state, at === undefined ? {} : { at });\n if (!location) return false;\n const { pos, node } = location;\n const tr = state.tr;\n const insertAt = pos + node.nodeSize;\n tr.insert(insertAt, node);\n const wasNode = state.selection instanceof NodeSelection && state.selection.from === pos;\n if (wasNode) tr.setSelection(NodeSelection.create(tr.doc, insertAt));\n else tr.setSelection(TextSelection.near(tr.doc.resolve(Math.min(insertAt + 1, tr.doc.content.size)), 1));\n view.dispatch(tr.scrollIntoView());\n return true;\n}\n\n/** Removes the block. The last block of the document becomes an empty paragraph instead. */\nexport function deleteBlock(editor: Editor, at?: number): boolean {\n const { state, view } = editor;\n let location = findBlock(state, at === undefined ? {} : { at });\n if (!location) return false;\n // The only item of a list takes the whole list with it.\n if (ITEMS.has(location.node.type.name) && location.parent.childCount === 1) {\n const $pos = state.doc.resolve(location.pos);\n const list = blockAt(state, $pos.before($pos.depth));\n if (list) location = list;\n }\n const { pos, node, parent } = location;\n const tr = state.tr;\n const isLastBlock = parent.type.name === \"doc\" && parent.childCount === 1;\n const paragraph = state.schema.nodes.paragraph;\n if (isLastBlock && paragraph) {\n tr.replaceWith(pos, pos + node.nodeSize, paragraph.create());\n tr.setSelection(TextSelection.near(tr.doc.resolve(1), 1));\n } else {\n tr.delete(pos, pos + node.nodeSize);\n const target = Math.min(pos, tr.doc.content.size);\n tr.setSelection(Selection.near(tr.doc.resolve(target), -1));\n }\n view.dispatch(tr.scrollIntoView());\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Kinds\n// ---------------------------------------------------------------------------\n\n/** The kind of block the selection is in. */\nexport function currentBlockKind(editor: Editor): BlockKind | null {\n if (editor.isActive(\"heading\")) {\n const level = (editor.getAttributes(\"heading\") as { level?: number }).level;\n if (level === 1 || level === 2 || level === 3 || level === 4) return `heading${level}` as BlockKind;\n }\n const order: Array<[string, BlockKind]> = [\n [\"taskList\", \"taskList\"],\n [\"bulletList\", \"bulletList\"],\n [\"orderedList\", \"numberedList\"],\n [\"codeBlock\", \"code\"],\n [\"equation\", \"equation\"],\n [\"callout\", \"callout\"],\n [\"blockquote\", \"quote\"],\n [\"toggle\", \"toggle\"],\n [\"table\", \"table\"],\n ];\n for (const [name, kind] of order) if (editor.isActive(name)) return kind;\n const { selection } = editor.state;\n if (selection instanceof NodeSelection) {\n const byNode: Record<string, BlockKind> = {\n image: \"image\",\n media: \"video\",\n file: \"file\",\n bookmark: \"bookmark\",\n columns: \"columns\",\n pageBreak: \"pageBreak\",\n tableOfContents: \"toc\",\n chart: \"chart\",\n diagram: \"diagram\",\n dataView: \"dataView\",\n aiBlock: \"ai\",\n horizontalRule: \"divider\",\n };\n const kind = byNode[selection.node.type.name];\n if (kind) return kind;\n }\n return \"paragraph\";\n}\n\nexport function getSelectionInfo(editor: Editor): SelectionInfo {\n const { state } = editor;\n const { selection } = state;\n // `isActive` covers a caret (including marks about to be typed) and a range (marks present across all of it).\n const marks = Object.keys(editor.schema.marks).filter((name) => editor.isActive(name));\n const location = findBlock(state);\n const id = location && typeof location.node.attrs.id === \"string\" ? (location.node.attrs.id as string) : null;\n return {\n empty: selection.empty,\n text: selection.empty ? \"\" : state.doc.textBetween(selection.from, selection.to, \"\\n\"),\n blockId: id,\n marks,\n blockKind: currentBlockKind(editor),\n };\n}\n\nconst TEXT_KINDS: ReadonlySet<BlockKind> = new Set([\n \"paragraph\",\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"heading4\",\n \"quote\",\n \"callout\",\n \"bulletList\",\n \"numberedList\",\n \"taskList\",\n \"code\",\n]);\n\nconst DOCUMENT_TYPE_KINDS: Record<string, BlockKind> = {\n quote: \"quote\",\n callout: \"callout\",\n toggle: \"toggle\",\n divider: \"divider\",\n \"bulleted-list\": \"bulletList\",\n \"numbered-list\": \"numberedList\",\n \"task-list\": \"taskList\",\n code: \"code\",\n equation: \"equation\",\n table: \"table\",\n image: \"image\",\n video: \"video\",\n audio: \"audio\",\n file: \"file\",\n bookmark: \"bookmark\",\n columns: \"columns\",\n \"page-break\": \"pageBreak\",\n \"table-of-contents\": \"toc\",\n chart: \"chart\",\n diagram: \"diagram\",\n \"data-view\": \"dataView\",\n ai: \"ai\",\n paragraph: \"paragraph\",\n};\n\n/** Accepts an editor kind (`heading2`) or a document block type (`heading` with a level, `bulleted-list`). */\nexport function normalizeBlockKind(type: string, attrs: Record<string, unknown> = {}): BlockKind | null {\n if (type === \"heading\") {\n const level = typeof attrs.level === \"number\" ? Math.min(4, Math.max(1, Math.round(attrs.level))) : 1;\n return `heading${level}` as BlockKind;\n }\n if (Object.prototype.hasOwnProperty.call(DOCUMENT_TYPE_KINDS, type)) return DOCUMENT_TYPE_KINDS[type] ?? null;\n return (BLOCK_KINDS as readonly string[]).includes(type) ? (type as BlockKind) : null;\n}\n\n/** The kinds offered by \"turn into\", in menu order. */\nexport const TURN_INTO_KINDS: readonly BlockKind[] = [\n \"paragraph\",\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"heading4\",\n \"quote\",\n \"callout\",\n \"bulletList\",\n \"numberedList\",\n \"taskList\",\n \"code\",\n];\n\n/** True for kinds that change the block the caret is in instead of adding a new one. */\nexport function isTurnIntoKind(kind: BlockKind): boolean {\n return TEXT_KINDS.has(kind);\n}\n\n/** Changes the current text block into another kind. */\nexport function turnInto(editor: Editor, kind: BlockKind, attrs: Record<string, unknown> = {}): boolean {\n const chain = () => editor.chain().focus();\n switch (kind) {\n case \"paragraph\":\n return chain().clearNodes().run();\n case \"heading1\":\n case \"heading2\":\n case \"heading3\":\n case \"heading4\": {\n const level = Number(kind.slice(-1)) as 1 | 2 | 3 | 4;\n return chain().clearNodes().setHeading({ level }).run();\n }\n case \"quote\":\n return editor.isActive(\"blockquote\") ? true : chain().clearNodes().setBlockquote().run();\n case \"callout\":\n return chain()\n .clearNodes()\n .setNode(\"callout\", { variant: typeof attrs.variant === \"string\" ? attrs.variant : \"info\" })\n .run();\n case \"code\":\n return chain().clearNodes().setNode(\"codeBlock\").run();\n case \"bulletList\":\n return editor.isActive(\"bulletList\") ? true : chain().toggleBulletList().run();\n case \"numberedList\":\n return editor.isActive(\"orderedList\") ? true : chain().toggleOrderedList().run();\n case \"taskList\":\n return editor.isActive(\"taskList\") ? true : chain().toggleTaskList().run();\n default:\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Insertion\n// ---------------------------------------------------------------------------\n\nconst EMBED_NODE: Record<EmbedType, string> = {\n chart: \"chart\",\n diagram: \"diagram\",\n \"data-view\": \"dataView\",\n ai: \"aiBlock\",\n};\n\nexport function embedKindToType(kind: BlockKind): EmbedType | null {\n switch (kind) {\n case \"chart\":\n return \"chart\";\n case \"diagram\":\n return \"diagram\";\n case \"dataView\":\n return \"data-view\";\n case \"ai\":\n return \"ai\";\n default:\n return null;\n }\n}\n\n/** A placeholder payload for an embedded block that was inserted without choosing content. */\nexport function defaultEmbedPayload<T extends EmbedType>(type: T): EmbedPayloads[T] {\n switch (type) {\n case \"chart\":\n return {\n title: \"\",\n mark: \"bar\",\n data: { values: [] },\n x: { field: \"x\", type: \"category\" },\n y: { field: \"y\", type: \"number\" },\n a11y: { description: \"\" },\n } as unknown as EmbedPayloads[T];\n case \"diagram\":\n return { engine: \"mermaid\", source: \"graph TD\\n A[Start] --> B[Finish]\" } as EmbedPayloads[T];\n case \"data-view\":\n return { dataset: \"\", view: { version: 1, name: \"\", columns: [], sort: [], filter: [] } } as unknown as EmbedPayloads[T];\n default:\n return { prompt: \"\" } as EmbedPayloads[T];\n }\n}\n\n/** Builds the Tiptap JSON of a block of the given kind. Returns null for kinds that are not insertable nodes. */\nexport function blockTemplate(kind: BlockKind, attrs: Record<string, unknown> = {}): JSONContent | null {\n const text = (value: unknown): JSONContent[] => (typeof value === \"string\" && value !== \"\" ? [{ type: \"text\", text: value }] : []);\n switch (kind) {\n case \"paragraph\":\n return { type: \"paragraph\" };\n case \"heading1\":\n case \"heading2\":\n case \"heading3\":\n case \"heading4\":\n return { type: \"heading\", attrs: { level: Number(kind.slice(-1)) } };\n case \"quote\":\n return { type: \"blockquote\", content: [{ type: \"paragraph\" }] };\n case \"callout\":\n return { type: \"callout\", attrs: { variant: typeof attrs.variant === \"string\" ? attrs.variant : \"info\" } };\n case \"toggle\":\n return { type: \"toggle\", content: [{ type: \"toggleSummary\" }, { type: \"paragraph\" }] };\n case \"bulletList\":\n return { type: \"bulletList\", content: [{ type: \"listItem\", content: [{ type: \"paragraph\" }] }] };\n case \"numberedList\":\n return { type: \"orderedList\", content: [{ type: \"listItem\", content: [{ type: \"paragraph\" }] }] };\n case \"taskList\":\n return { type: \"taskList\", content: [{ type: \"taskItem\", attrs: { checked: false }, content: [{ type: \"paragraph\" }] }] };\n case \"code\":\n return { type: \"codeBlock\", attrs: { language: typeof attrs.language === \"string\" ? attrs.language : null } };\n case \"equation\":\n return { type: \"equation\", content: text(attrs.latex) };\n case \"divider\":\n return { type: \"horizontalRule\" };\n case \"table\": {\n const rows = typeof attrs.rows === \"number\" ? attrs.rows : 3;\n const columns = typeof attrs.columns === \"number\" ? attrs.columns : 3;\n return {\n type: \"table\",\n attrs: { headerRow: true },\n content: Array.from({ length: rows }, (_, row) => ({\n type: \"tableRow\",\n content: Array.from({ length: columns }, () => ({\n type: row === 0 ? \"tableHeader\" : \"tableCell\",\n content: [{ type: \"paragraph\" }],\n })),\n })),\n };\n }\n case \"image\":\n return {\n type: \"image\",\n attrs: { src: attrs.src ?? \"\", alt: attrs.alt ?? \"\", caption: attrs.caption ?? null, align: attrs.align ?? null, width: attrs.width ?? null },\n };\n case \"video\":\n case \"audio\":\n return { type: \"media\", attrs: { kind: kind, src: attrs.src ?? \"\", caption: attrs.caption ?? null } };\n case \"file\":\n return { type: \"file\", attrs: { src: attrs.src ?? \"\", name: attrs.name ?? \"\", size: attrs.size ?? null } };\n case \"bookmark\":\n return { type: \"bookmark\", attrs: { url: attrs.url ?? \"\", title: attrs.title ?? null, description: attrs.description ?? null } };\n case \"columns\":\n return {\n type: \"columns\",\n content: Array.from({ length: typeof attrs.count === \"number\" ? Math.max(2, attrs.count) : 2 }, () => ({\n type: \"column\",\n content: [{ type: \"paragraph\" }],\n })),\n };\n case \"pageBreak\":\n return { type: \"pageBreak\" };\n case \"toc\":\n return { type: \"tableOfContents\" };\n case \"chart\":\n return { type: \"chart\", attrs: { spec: attrs.spec ?? defaultEmbedPayload(\"chart\") } };\n case \"diagram\": {\n const payload = { ...defaultEmbedPayload(\"diagram\"), ...(attrs as Partial<EmbedPayloads[\"diagram\"]>) };\n return { type: \"diagram\", attrs: { engine: payload.engine, diagram: payload.diagram ?? null, source: payload.source ?? null } };\n }\n case \"dataView\": {\n const payload = { ...defaultEmbedPayload(\"data-view\"), ...(attrs as Partial<EmbedPayloads[\"data-view\"]>) };\n return { type: \"dataView\", attrs: { dataset: payload.dataset, view: payload.view } };\n }\n case \"ai\":\n return { type: \"aiBlock\", attrs: { prompt: typeof attrs.prompt === \"string\" ? attrs.prompt : \"\", result: attrs.result ?? null } };\n default:\n return null;\n }\n}\n\n/** Merges attributes into the block with the given id. Resolves by id, so it is safe after async work. */\nexport function updateBlockAttrs(editor: Editor, id: string, attrs: Record<string, unknown>): boolean {\n let target: { pos: number; node: PMNode } | null = null;\n editor.state.doc.descendants((node, pos) => {\n if (target === null && node.attrs.id === id) target = { pos, node };\n return target === null;\n });\n const found = target as { pos: number; node: PMNode } | null;\n if (!found) return false;\n const { state, view } = editor;\n view.dispatch(state.tr.setNodeMarkup(found.pos, undefined, { ...found.node.attrs, ...attrs }));\n return true;\n}\n\nfunction isEmptyParagraph(node: PMNode): boolean {\n return node.type.name === \"paragraph\" && node.content.size === 0;\n}\n\n/** Inserts a node after the selected block, or in place of an empty paragraph. Returns the new block id. */\nexport function insertNode(editor: Editor, json: JSONContent): string | null {\n const { state, view } = editor;\n let node: PMNode;\n try {\n node = state.schema.nodeFromJSON(json);\n } catch {\n return null;\n }\n const location = findBlock(state, { items: false });\n const tr = state.tr;\n let start: number;\n if (location && isEmptyParagraph(location.node)) {\n start = location.pos;\n tr.replaceWith(location.pos, location.pos + location.node.nodeSize, node);\n } else if (location) {\n start = location.pos + location.node.nodeSize;\n tr.insert(start, node);\n } else {\n start = tr.doc.content.size;\n tr.insert(start, node);\n }\n const inserted = tr.doc.nodeAt(start);\n // A document that ends in an atom or rule would leave no place to continue typing.\n const parentIsDoc = location ? location.parent.type.name === \"doc\" : true;\n const emptyParagraph = state.schema.nodes.paragraph;\n if (inserted && emptyParagraph && parentIsDoc && !inserted.isTextblock && start + inserted.nodeSize === tr.doc.content.size) {\n tr.insert(start + inserted.nodeSize, emptyParagraph.create());\n }\n const selectable = inserted !== null && inserted.isAtom && !inserted.isText;\n if (selectable) tr.setSelection(NodeSelection.create(tr.doc, start));\n else tr.setSelection(TextSelection.near(tr.doc.resolve(Math.min(start + 1, tr.doc.content.size)), 1));\n view.dispatch(tr.scrollIntoView());\n const placed = editor.state.doc.nodeAt(start);\n return placed && typeof placed.attrs.id === \"string\" ? (placed.attrs.id as string) : null;\n}\n\n/** Inserts or converts to a block kind, chosen by whether the kind is a text block. */\nexport function applyBlockKind(editor: Editor, kind: BlockKind, attrs: Record<string, unknown> = {}): string | null {\n if (isTurnIntoKind(kind)) {\n const ok = turnInto(editor, kind, attrs);\n if (!ok) return null;\n const location = findBlock(editor.state, { items: false });\n return location && typeof location.node.attrs.id === \"string\" ? (location.node.attrs.id as string) : null;\n }\n const template = blockTemplate(kind, attrs);\n return template ? insertNode(editor, template) : null;\n}\n\n/**\n * Adds a block of the given kind after the block at the selection, or in place\n * of an empty paragraph. Unlike `applyBlockKind` (used by the slash menu, where\n * the caret is in the line being replaced), it never converts existing text.\n */\nexport function insertBlockKind(editor: Editor, kind: BlockKind, attrs: Record<string, unknown> = {}): string | null {\n if (isTurnIntoKind(kind)) {\n const location = findBlock(editor.state, { items: false });\n if (location && !isEmptyParagraph(location.node)) {\n const at = location.pos + location.node.nodeSize;\n editor\n .chain()\n .insertContentAt(at, { type: \"paragraph\" })\n .setTextSelection(at + 1)\n .run();\n }\n }\n return applyBlockKind(editor, kind, attrs);\n}\n\nexport function embedNodeName(type: EmbedType): string {\n return EMBED_NODE[type];\n}\n\n// ---------------------------------------------------------------------------\n// Exec\n// ---------------------------------------------------------------------------\n\n/** Runs one of the named commands. Returns whether it did something. */\nexport function execEditorCommand(editor: Editor, command: EditorCommand, openBlockMenu?: () => void): boolean {\n const chain = () => editor.chain().focus();\n switch (command) {\n case \"undo\":\n return chain().undo().run();\n case \"redo\":\n return chain().redo().run();\n case \"bold\":\n return chain().toggleBold().run();\n case \"italic\":\n return chain().toggleItalic().run();\n case \"underline\":\n return chain().toggleUnderline().run();\n case \"strike\":\n return chain().toggleStrike().run();\n case \"code\":\n return chain().toggleCode().run();\n case \"clearMarks\":\n return chain().unsetAllMarks().run();\n case \"bulletList\":\n return chain().toggleBulletList().run();\n case \"numberedList\":\n return chain().toggleOrderedList().run();\n case \"taskList\":\n return chain().toggleTaskList().run();\n case \"indent\":\n return indent(editor, 1);\n case \"outdent\":\n return indent(editor, -1);\n case \"quote\":\n return chain().toggleBlockquote().run();\n case \"divider\":\n return chain().setHorizontalRule().run();\n case \"paragraph\":\n case \"heading1\":\n case \"heading2\":\n case \"heading3\":\n case \"heading4\":\n return turnInto(editor, command);\n case \"codeBlock\":\n return turnInto(editor, \"code\");\n case \"moveBlockUp\":\n return moveBlock(editor, -1).moved;\n case \"moveBlockDown\":\n return moveBlock(editor, 1).moved;\n case \"duplicateBlock\":\n return duplicateBlock(editor);\n case \"deleteBlock\":\n return deleteBlock(editor);\n case \"selectAll\":\n return chain().selectAll().run();\n case \"openBlockMenu\":\n if (openBlockMenu) {\n openBlockMenu();\n return true;\n }\n return false;\n default:\n return false;\n }\n}\n\n/** Sinks or lifts the list item at the selection. */\nexport function indent(editor: Editor, direction: 1 | -1): boolean {\n for (const name of [\"taskItem\", \"listItem\"]) {\n if (editor.isActive(name)) {\n const chain = editor.chain().focus();\n return direction > 0 ? chain.sinkListItem(name).run() : chain.liftListItem(name).run();\n }\n }\n return false;\n}\n","import {\n useEffect,\n useId,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport { IconButton } from \"@x12i/ui\";\nimport { Glyph } from \"./glyphs\";\n\nexport interface MenuItemSpec {\n id: string;\n label: string;\n role?: \"menuitem\" | \"menuitemradio\" | \"menuitemcheckbox\";\n checked?: boolean;\n disabled?: boolean;\n icon?: ReactNode;\n /** A token path drawn as a color chip before the label. */\n swatch?: string;\n /** Starts a labelled group. */\n heading?: string;\n onSelect: () => void;\n}\n\nexport type MenuCloseReason = \"escape\" | \"tab\" | \"select\" | \"outside\";\n\nexport interface MenuListProps {\n label: string;\n items: readonly MenuItemSpec[];\n onClose: (reason: MenuCloseReason) => void;\n /** Focus the checked (or first) item on mount. Defaults to true. */\n autoFocus?: boolean;\n /** Item that should receive focus first. */\n initialId?: string;\n className?: string;\n ref?: Ref<HTMLDivElement>;\n}\n\n/** A WAI-ARIA menu: arrow keys, Home/End, type-ahead, Escape, Tab to leave. */\nexport function MenuList({ label, items, onClose, autoFocus = true, initialId, ref }: MenuListProps) {\n const listRef = useRef<HTMLDivElement | null>(null);\n const typeahead = useRef({ text: \"\", timer: undefined as ReturnType<typeof setTimeout> | undefined });\n\n const enabled = () => Array.from(listRef.current?.querySelectorAll<HTMLElement>(\"[role^='menuitem']:not([aria-disabled='true'])\") ?? []);\n\n useEffect(() => {\n if (!autoFocus) return;\n const list = enabled();\n const preferred = list.find((element) => element.dataset.id === initialId) ?? list.find((element) => element.getAttribute(\"aria-checked\") === \"true\") ?? list[0];\n preferred?.focus();\n // Focus is placed once, when the menu opens.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const state = typeahead.current;\n return () => clearTimeout(state.timer);\n }, []);\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const list = enabled();\n const index = list.indexOf(document.activeElement as HTMLElement);\n const focusAt = (next: number) => {\n event.preventDefault();\n list[(next + list.length) % list.length]?.focus();\n };\n switch (event.key) {\n case \"ArrowDown\":\n focusAt(index + 1);\n return;\n case \"ArrowUp\":\n focusAt(index === -1 ? list.length - 1 : index - 1);\n return;\n case \"Home\":\n focusAt(0);\n return;\n case \"End\":\n focusAt(list.length - 1);\n return;\n case \"Escape\":\n event.preventDefault();\n event.stopPropagation();\n onClose(\"escape\");\n return;\n case \"Tab\":\n onClose(\"tab\");\n return;\n default:\n break;\n }\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey && event.key !== \" \") {\n const state = typeahead.current;\n clearTimeout(state.timer);\n state.text += event.key.toLowerCase();\n state.timer = setTimeout(() => {\n state.text = \"\";\n }, 600);\n const ordered = [...list.slice(index + 1), ...list.slice(0, index + 1)];\n const match = ordered.find((element) => (element.textContent ?? \"\").trim().toLowerCase().startsWith(state.text));\n match?.focus();\n }\n };\n\n return (\n <div\n ref={(node) => {\n listRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n role=\"menu\"\n aria-label={label}\n data-kit=\"editor-menu\"\n tabIndex={-1}\n onKeyDown={onKeyDown}\n >\n {items.map((item) => {\n const role = item.role ?? \"menuitem\";\n return (\n <div key={item.id} role=\"none\" data-kit=\"editor-menu-entry\">\n {item.heading ? (\n <div role=\"presentation\" data-kit=\"editor-menu-heading\">\n {item.heading}\n </div>\n ) : null}\n <button\n type=\"button\"\n role={role}\n data-kit=\"editor-menu-item\"\n data-id={item.id}\n tabIndex={-1}\n aria-checked={role === \"menuitem\" ? undefined : item.checked === true}\n aria-disabled={item.disabled ? true : undefined}\n // Keep the editor selection while the menu is used with the mouse.\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n if (item.disabled) return;\n item.onSelect();\n onClose(\"select\");\n }}\n >\n {item.icon ? <span data-kit=\"editor-menu-icon\">{item.icon}</span> : null}\n {item.swatch ? <span data-kit=\"editor-swatch\" data-token={item.swatch} aria-hidden=\"true\" /> : null}\n <span data-kit=\"editor-menu-label\">{item.label}</span>\n {role !== \"menuitem\" && item.checked ? <Glyph name=\"check\" data-kit=\"editor-menu-check\" /> : null}\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport interface MenuButtonProps {\n /** Accessible name of the button. */\n label: string;\n /** Shown as the tooltip. Defaults to the label. */\n title?: string;\n menuLabel: string;\n items: readonly MenuItemSpec[];\n children: ReactNode;\n /** Visible text next to the glyph (for the block type control). */\n text?: string;\n disabled?: boolean;\n pressed?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/** A toolbar button that opens a menu below it. */\nexport function MenuButton({ label, title, menuLabel, items, children, text, disabled, pressed, onOpenChange }: MenuButtonProps) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLSpanElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuId = useId();\n\n const change = (next: boolean) => {\n setOpen(next);\n onOpenChange?.(next);\n };\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n if (wrapRef.current && event.target instanceof Node && !wrapRef.current.contains(event.target)) {\n setOpen(false);\n onOpenChange?.(false);\n }\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown);\n }, [open, onOpenChange]);\n\n return (\n <span ref={wrapRef} data-kit=\"editor-menu-wrap\">\n <IconButton\n ref={buttonRef}\n label={label}\n title={title ?? label}\n variant={pressed ? \"soft\" : \"ghost\"}\n tone=\"neutral\"\n size=\"sm\"\n disabled={disabled}\n data-toolbar-item=\"\"\n data-has-text={text ? \"\" : undefined}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => change(!open)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\" && !open) {\n event.preventDefault();\n change(true);\n }\n }}\n >\n {children}\n {text ? <span data-kit=\"editor-toolbar-text\">{text}</span> : null}\n </IconButton>\n {open ? (\n <div id={menuId} data-kit=\"editor-popup\" data-placement=\"below\">\n <MenuList\n label={menuLabel}\n items={items}\n onClose={(reason) => {\n change(false);\n if (reason === \"escape\" || reason === \"tab\") buttonRef.current?.focus();\n }}\n />\n </div>\n ) : null}\n </span>\n );\n}\n","export interface PopupPosition {\n /** Distance from the inline-start edge of the surface (left in LTR, right in RTL). */\n x: number;\n /** Distance from the top of the surface. */\n y: number;\n}\n\nexport interface ViewportRect {\n left: number;\n right: number;\n top: number;\n bottom: number;\n}\n\nfunction isRtl(element: HTMLElement): boolean {\n const owner = element.closest(\"[dir]\")?.getAttribute(\"dir\");\n if (owner === \"rtl\") return true;\n if (owner === \"ltr\") return false;\n return typeof getComputedStyle === \"function\" && getComputedStyle(element).direction === \"rtl\";\n}\n\n/**\n * Converts a viewport rectangle (a caret or selection) into coordinates inside\n * `surface`, measured from its inline-start edge so logical CSS properties\n * place the popup correctly in both writing directions.\n */\nexport function positionNear(surface: HTMLElement, rect: ViewportRect, edge: \"top\" | \"bottom\"): PopupPosition {\n const box = surface.getBoundingClientRect();\n const x = isRtl(surface) ? box.right - rect.right : rect.left - box.left;\n const y = (edge === \"top\" ? rect.top : rect.bottom) - box.top;\n return { x: Number.isFinite(x) ? Math.max(0, x) : 0, y: Number.isFinite(y) ? Math.max(0, y) : 0 };\n}\n","import { useEffect, useRef, useState, type RefObject } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport { TextSelection } from \"@tiptap/pm/state\";\nimport { useEditorState } from \"@tiptap/react\";\nimport { execEditorCommand } from \"./commands\";\nimport { Glyph } from \"./internal/glyphs\";\nimport { shortcut } from \"./internal/platform\";\nimport { positionNear, type PopupPosition } from \"./internal/position\";\nimport { useRovingToolbar } from \"./internal/roving\";\nimport { ToolButton } from \"./internal/tool-button\";\nimport { useTranslator } from \"./messages\";\nimport type { EditorCommand } from \"./types\";\n\nexport interface BubbleMenuProps {\n editor: Editor;\n surfaceRef: RefObject<HTMLElement | null>;\n onOpenLink: () => void;\n onOpenAi?: () => void;\n announce: (message: string) => void;\n}\n\ninterface MarkState {\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strike: boolean;\n code: boolean;\n link: boolean;\n}\n\nfunction sameMarks(a: MarkState | null, b: MarkState | null): boolean {\n return a === b || (!!a && !!b && (Object.keys(a) as Array<keyof MarkState>).every((key) => a[key] === b[key]));\n}\n\n/**\n * A small toolbar over selected text. It is in the document order right after\n * the editor, so the Tab key reaches it; Escape returns to the text.\n */\nexport function BubbleMenu({ editor, surfaceRef, onOpenLink, onOpenAi, announce }: BubbleMenuProps) {\n const t = useTranslator();\n const m = t.messages;\n const barRef = useRef<HTMLDivElement>(null);\n const roving = useRovingToolbar(barRef);\n const [position, setPosition] = useState<PopupPosition | null>(null);\n\n const marks = useEditorState({\n editor,\n selector: ({ editor: current }): MarkState | null =>\n current\n ? {\n bold: current.isActive(\"bold\"),\n italic: current.isActive(\"italic\"),\n underline: current.isActive(\"underline\"),\n strike: current.isActive(\"strike\"),\n code: current.isActive(\"code\"),\n link: current.isActive(\"link\"),\n }\n : null,\n equalityFn: sameMarks,\n });\n\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const update = () => {\n const surface = surfaceRef.current;\n const { selection } = editor.state;\n const focusInside = editor.view.hasFocus() || (barRef.current?.contains(document.activeElement) ?? false);\n const show =\n surface !== null &&\n editor.isEditable &&\n focusInside &&\n selection instanceof TextSelection &&\n !selection.empty &&\n !selection.$from.parent.type.spec.code;\n if (!show) {\n setPosition(null);\n return;\n }\n try {\n const rect = editor.view.coordsAtPos(selection.from);\n setPosition(positionNear(surface, rect, \"top\"));\n } catch {\n setPosition({ x: 0, y: 0 });\n }\n };\n const delayed = () => {\n clearTimeout(timer);\n timer = setTimeout(update, 0);\n };\n editor.on(\"selectionUpdate\", update);\n editor.on(\"focus\", update);\n editor.on(\"blur\", delayed);\n return () => {\n clearTimeout(timer);\n editor.off(\"selectionUpdate\", update);\n editor.off(\"focus\", update);\n editor.off(\"blur\", delayed);\n };\n }, [editor, surfaceRef]);\n\n if (!position || !marks) return null;\n\n const toggle = (command: EditorCommand, name: string, active: boolean) => () => {\n execEditorCommand(editor, command);\n announce(t.format(active ? m.status.markOff : m.status.markOn, { name }));\n };\n\n return (\n <div\n ref={barRef}\n role=\"toolbar\"\n aria-label={m.toolbar.selectionMenu}\n data-kit=\"editor-bubble\"\n style={{ \"--kit-editor-x\": `${position.x}px`, \"--kit-editor-y\": `${position.y}px` } as React.CSSProperties}\n onFocusCapture={roving.onFocusCapture}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n editor.commands.focus();\n return;\n }\n roving.onKeyDown(event);\n }}\n >\n <ToolButton label={m.toolbar.bold} keys={shortcut(\"B\")} pressed={marks.bold} onClick={toggle(\"bold\", m.toolbar.bold, marks.bold)}>\n <Glyph name=\"bold\" />\n </ToolButton>\n <ToolButton label={m.toolbar.italic} keys={shortcut(\"I\")} pressed={marks.italic} onClick={toggle(\"italic\", m.toolbar.italic, marks.italic)}>\n <Glyph name=\"italic\" />\n </ToolButton>\n <ToolButton label={m.toolbar.underline} keys={shortcut(\"U\")} pressed={marks.underline} onClick={toggle(\"underline\", m.toolbar.underline, marks.underline)}>\n <Glyph name=\"underline\" />\n </ToolButton>\n <ToolButton label={m.toolbar.strike} keys={shortcut(\"Shift\", \"S\")} pressed={marks.strike} onClick={toggle(\"strike\", m.toolbar.strike, marks.strike)}>\n <Glyph name=\"strike\" />\n </ToolButton>\n <ToolButton label={m.toolbar.code} keys={shortcut(\"E\")} pressed={marks.code} onClick={toggle(\"code\", m.toolbar.code, marks.code)}>\n <Glyph name=\"code\" />\n </ToolButton>\n <ToolButton label={m.toolbar.link} keys={shortcut(\"K\")} pressed={marks.link} onClick={onOpenLink}>\n <Glyph name=\"link\" />\n </ToolButton>\n {onOpenAi ? (\n <ToolButton label={m.ai.menuLabel} onClick={onOpenAi}>\n <Glyph name=\"sparkle\" />\n </ToolButton>\n ) : null}\n </div>\n );\n}\n","/** True on Apple platforms, where shortcuts use Cmd instead of Ctrl. */\nexport function isApplePlatform(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return /Mac|iPhone|iPad|iPod/i.test(navigator.platform || navigator.userAgent || \"\");\n}\n\n/** The primary modifier key as shown in a tooltip. */\nexport function modKey(): string {\n return isApplePlatform() ? \"\\u2318\" : \"Ctrl\";\n}\n\n/** Formats a shortcut for a tooltip, for example `shortcut(\"B\")` gives `Ctrl+B`. */\nexport function shortcut(...keys: string[]): string {\n return [modKey(), ...keys].join(\"+\");\n}\n","import { useEffect, useRef, type KeyboardEvent, type RefObject } from \"react\";\n\nconst ITEM_SELECTOR = \"[data-toolbar-item]:not([disabled]):not([aria-disabled='true'])\";\n\nfunction itemsOf(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(ITEM_SELECTOR));\n}\n\nfunction isRtl(container: HTMLElement): boolean {\n const owner = container.closest(\"[dir]\");\n const value = owner?.getAttribute(\"dir\");\n if (value === \"rtl\") return true;\n if (value === \"ltr\") return false;\n return typeof getComputedStyle === \"function\" && getComputedStyle(container).direction === \"rtl\";\n}\n\n/**\n * Roving tab index for a toolbar (WAI-ARIA toolbar pattern): one control is in\n * the tab order, arrow keys move between controls, Home and End jump to the\n * ends. Controls opt in with `data-toolbar-item`; the DOM drives it so\n * controls can live in any child component.\n */\nexport function useRovingToolbar(containerRef: RefObject<HTMLElement | null>) {\n const activeRef = useRef(0);\n\n const apply = () => {\n const container = containerRef.current;\n if (!container) return;\n const items = itemsOf(container);\n if (items.length === 0) return;\n const index = Math.min(activeRef.current, items.length - 1);\n activeRef.current = index;\n items.forEach((item, position) => {\n item.tabIndex = position === index ? 0 : -1;\n });\n };\n\n // Runs after every render: controls come and go as the selection changes.\n useEffect(apply);\n\n const onFocusCapture = (event: React.FocusEvent<HTMLElement>) => {\n const container = containerRef.current;\n if (!container) return;\n const items = itemsOf(container);\n const index = items.indexOf(event.target as HTMLElement);\n if (index !== -1 && index !== activeRef.current) {\n activeRef.current = index;\n apply();\n }\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n const container = containerRef.current;\n if (!container || event.defaultPrevented) return;\n if (event.altKey || event.ctrlKey || event.metaKey) return;\n const target = event.target as HTMLElement;\n // Text fields and open menus keep their own arrow keys.\n if (target.closest(\"[role='menu'], [role='dialog'], input, textarea\")) return;\n const items = itemsOf(container);\n const current = items.indexOf(target.closest<HTMLElement>(\"[data-toolbar-item]\") ?? target);\n if (current === -1) return;\n const rtl = isRtl(container);\n let wanted: number;\n switch (event.key) {\n case \"ArrowRight\":\n wanted = rtl ? current - 1 : current + 1;\n break;\n case \"ArrowLeft\":\n wanted = rtl ? current + 1 : current - 1;\n break;\n case \"Home\":\n wanted = 0;\n break;\n case \"End\":\n wanted = items.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n const next = (wanted + items.length) % items.length;\n activeRef.current = next;\n apply();\n items[next]?.focus();\n };\n\n return { onKeyDown, onFocusCapture };\n}\n","import type { ReactNode } from \"react\";\nimport { IconButton } from \"@x12i/ui\";\n\nexport interface ToolButtonProps {\n /** Accessible name. */\n label: string;\n /** Shortcut hint added to the tooltip. */\n keys?: string;\n /** Sets `aria-pressed`. Leave undefined for buttons that are not toggles. */\n pressed?: boolean;\n disabled?: boolean;\n onClick: () => void;\n children: ReactNode;\n}\n\n/**\n * An icon button for editor toolbars. Mouse down is cancelled so the editor\n * keeps its selection and focus while the button is used; the tooltip is the\n * `title`, the name is the `aria-label`.\n */\nexport function ToolButton({ label, keys, pressed, disabled, onClick, children }: ToolButtonProps) {\n return (\n <IconButton\n label={label}\n title={keys ? `${label} (${keys})` : label}\n variant={pressed ? \"soft\" : \"ghost\"}\n tone={pressed ? \"accent\" : \"neutral\"}\n size=\"sm\"\n disabled={disabled}\n aria-pressed={pressed}\n data-toolbar-item=\"\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={onClick}\n >\n {children}\n </IconButton>\n );\n}\n","import type { Editor } from \"@tiptap/core\";\nimport { createContext, useContext } from \"react\";\nimport type { BlockRenderers, EditBlockHandler, RequestBlockHandler } from \"./types\";\n\n/** What node views and menus need from the `Editor` that hosts them. */\nexport interface EditorUi {\n editable: boolean;\n blockRenderers: BlockRenderers;\n /** Speaks a message through the status live region. */\n announce: (message: string) => void;\n onEditBlock: EditBlockHandler | undefined;\n onRequestBlock: RequestBlockHandler | undefined;\n /** Opens the image dialog for the image at `pos`, or for a new image. */\n openImageDialog: (pos?: number) => void;\n /** Opens the link dialog for the selection. */\n openLinkDialog: () => void;\n /** Opens the block menu for the block at the selection. */\n openBlockMenu: () => void;\n}\n\nconst noop = () => undefined;\n\nexport const defaultEditorUi: EditorUi = {\n editable: false,\n blockRenderers: {},\n announce: noop,\n onEditBlock: undefined,\n onRequestBlock: undefined,\n openImageDialog: noop,\n openLinkDialog: noop,\n openBlockMenu: noop,\n};\n\nexport const EditorUiContext = createContext<EditorUi>(defaultEditorUi);\n\nexport function useEditorUi(): EditorUi {\n return useContext(EditorUiContext);\n}\n\n/** Lets menus and dialogs reach the engine without prop drilling. */\nexport const EngineContext = createContext<Editor | null>(null);\n\nexport function useEngine(): Editor | null {\n return useContext(EngineContext);\n}\n","import { Extension, type Extensions } from \"@tiptap/core\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport { TaskItem } from \"@tiptap/extension-task-item\";\nimport { TaskList } from \"@tiptap/extension-task-list\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport { sanitizeUrl } from \"../../url\";\nimport { BlockId } from \"./block-id\";\nimport { BlockKeys } from \"./block-keys\";\nimport { KitHighlight, TextColor } from \"./marks\";\nimport {\n AiBlock,\n Bookmark,\n Callout,\n Chart,\n CodeBlock,\n Column,\n Columns,\n DataView,\n Diagram,\n Emoji,\n Equation,\n FileBlock,\n KitDocument,\n KitImage,\n KitTable,\n Media,\n Mention,\n PageBreak,\n TableCell,\n TableHeader,\n TableOfContents,\n TableRow,\n Toggle,\n ToggleSummary,\n UnknownBlock,\n} from \"./nodes\";\nimport type { EditorRuntime } from \"./runtime\";\nimport { SlashCommand } from \"./slash\";\nimport { formatMessage } from \"../messages\";\n\n/** Block elements that follow their own text direction (`dir=\"auto\"`), so right to left text mirrors lists, quotes and tables. */\nconst AUTO_DIRECTION_NODES = [\"paragraph\", \"heading\", \"blockquote\", \"bulletList\", \"orderedList\", \"taskList\", \"tableCell\", \"tableHeader\", \"toggleSummary\"];\n\nconst AutoDirection = Extension.create({\n name: \"autoDirection\",\n\n addGlobalAttributes() {\n return [\n {\n types: AUTO_DIRECTION_NODES,\n attributes: {\n dir: {\n default: null,\n keepOnSplit: false,\n parseHTML: () => null,\n renderHTML: () => ({ dir: \"auto\" }),\n },\n },\n },\n ];\n },\n});\n\nexport interface CreateExtensionsOptions {\n runtime: EditorRuntime;\n /** Extensions from the `extensions` prop. */\n extra?: Extensions;\n}\n\n/**\n * The editor schema. Node and mark names match `TIPTAP_NODES` and\n * `TIPTAP_MARKS`, which the converters in the root entry read and write.\n */\nexport function createExtensions({ runtime, extra = [] }: CreateExtensionsOptions): Extensions {\n return [\n KitDocument,\n StarterKit.configure({\n document: false,\n codeBlock: false,\n trailingNode: false,\n heading: { levels: [1, 2, 3, 4] },\n link: {\n openOnClick: false,\n autolink: true,\n linkOnPaste: true,\n isAllowedUri: (url: string) => sanitizeUrl(url) !== null,\n HTMLAttributes: { rel: \"noopener noreferrer\", target: null },\n },\n }),\n TextColor,\n KitHighlight,\n TaskList.configure({ HTMLAttributes: { \"data-kit\": \"editor-task-list\" } }),\n TaskItem.configure({\n nested: true,\n HTMLAttributes: { \"data-kit\": \"editor-task-item\" },\n a11y: {\n checkboxLabel: (node, checked) => {\n const t = runtime.translator();\n const text = node.textContent.trim() || t.messages.task.emptyLabel;\n return formatMessage(checked ? t.messages.task.done : t.messages.task.todo, { text }, t.locale);\n },\n },\n }),\n Callout,\n Toggle,\n ToggleSummary,\n Columns,\n Column,\n Equation,\n CodeBlock,\n KitTable,\n TableRow,\n TableHeader,\n TableCell,\n KitImage.configure({ allowBase64: true }),\n Media,\n FileBlock,\n Bookmark,\n PageBreak,\n TableOfContents,\n Chart,\n Diagram,\n DataView,\n AiBlock,\n UnknownBlock,\n Mention,\n Emoji,\n BlockId,\n AutoDirection,\n Placeholder.configure({\n includeChildren: true,\n // The engine calls this while it applies a transaction, when `editor.state` can still be the previous\n // state, so it must not look positions up in it. Paragraphs always get the text; the stylesheet only\n // shows it for paragraphs that are not inside lists, tables, quotes or callouts.\n placeholder: ({ node }) => {\n const messages = runtime.translator().messages;\n switch (node.type.name) {\n case \"heading\": {\n const level = Number(node.attrs.level);\n return level >= 1 && level <= 4 ? messages.blocks[`heading${level}` as \"heading1\"].name : \"\";\n }\n case \"toggleSummary\":\n return messages.toggle.summaryPlaceholder;\n case \"equation\":\n return messages.equation.placeholder;\n case \"paragraph\":\n return runtime.placeholder();\n default:\n return \"\";\n }\n },\n }),\n BlockKeys.configure({ runtime }),\n SlashCommand.configure({ runtime }),\n ...extra,\n ];\n}\n","import { Extension } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { generateBlockId } from \"../../ids\";\nimport { BLOCK_ID_NODES } from \"../../tiptap-json\";\n\nconst blockIdKey = new PluginKey(\"kitBlockId\");\n\n/** Containers whose children are blocks of the document and carry their own ids. */\nconst BLOCK_CONTAINERS = new Set([\"doc\", \"toggle\", \"column\"]);\nconst ITEM_NODES = new Set([\"listItem\", \"taskItem\"]);\nconst LIST_NODES = new Set([\"bulletList\", \"orderedList\", \"taskList\"]);\n\n/**\n * Gives every block an `id` attribute and keeps ids unique. Pasted or\n * duplicated blocks arrive with the id of the original; the later copy gets a\n * fresh one. Only blocks of the document model carry ids: a paragraph inside a\n * list item, quote or table cell does not.\n */\nexport const BlockId = Extension.create({\n name: \"blockId\",\n\n addGlobalAttributes() {\n return [\n {\n types: [...BLOCK_ID_NODES],\n attributes: {\n id: {\n default: null,\n keepOnSplit: false,\n parseHTML: (element: HTMLElement) => element.getAttribute(\"data-block-id\"),\n renderHTML: (attributes: Record<string, unknown>) =>\n typeof attributes.id === \"string\" && attributes.id !== \"\" ? { \"data-block-id\": attributes.id } : {},\n },\n },\n },\n ];\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: blockIdKey,\n appendTransaction: (transactions, _oldState, newState) => {\n if (!transactions.some((transaction) => transaction.docChanged)) return null;\n const seen = new Set<string>();\n const fixes: Array<{ pos: number; attrs: Record<string, unknown> }> = [];\n\n newState.doc.descendants((node, pos, parent) => {\n const name = node.type.name;\n if (!BLOCK_ID_NODES.includes(name) || parent === null) return;\n const parentName = parent.type.name;\n const carriesId = ITEM_NODES.has(name)\n ? LIST_NODES.has(parentName)\n : BLOCK_CONTAINERS.has(parentName) && !(LIST_NODES.has(name) && ITEM_NODES.has(parentName));\n if (!carriesId) return;\n const current = node.attrs.id as unknown;\n if (typeof current === \"string\" && current !== \"\" && !seen.has(current)) {\n seen.add(current);\n return;\n }\n let id = generateBlockId();\n while (seen.has(id)) id = generateBlockId();\n seen.add(id);\n fixes.push({ pos, attrs: { ...node.attrs, id } });\n });\n\n if (fixes.length === 0) return null;\n const tr = newState.tr;\n for (const fix of fixes) tr.setNodeMarkup(fix.pos, undefined, fix.attrs);\n tr.setMeta(\"addToHistory\", false);\n return tr;\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport { NodeSelection } from \"@tiptap/pm/state\";\nimport { moveBlock, updateBlockAttrs } from \"../commands\";\nimport { attrsToPayload, embedTypeOfNode, payloadToAttrs } from \"./attrs\";\nimport type { EditorRuntime } from \"./runtime\";\n\n/**\n * Keyboard access to block level actions:\n * - Alt+Shift+Up / Down: move the block\n * - Ctrl or Cmd + /: open the block menu\n * - Ctrl or Cmd + K: open the link dialog\n * - Enter on a selected embedded block: edit it\n */\nexport const BlockKeys = Extension.create<{ runtime: EditorRuntime | null }>({\n name: \"blockKeys\",\n\n addOptions() {\n return { runtime: null };\n },\n\n addKeyboardShortcuts(): Record<string, () => boolean> {\n const runtime = this.options.runtime;\n if (!runtime) return {};\n\n const move = (direction: -1 | 1) => () => {\n const ui = runtime.ui();\n if (!ui.editable) return false;\n const result = moveBlock(this.editor, direction);\n const t = runtime.translator();\n if (result.total > 0) {\n ui.announce(\n result.moved\n ? t.format(t.messages.status.blockMoved, { position: result.position, total: result.total })\n : t.messages.status.cannotMove,\n );\n }\n return true;\n };\n\n return {\n \"Alt-Shift-ArrowUp\": move(-1),\n \"Alt-Shift-ArrowDown\": move(1),\n \"Mod-/\": () => {\n const ui = runtime.ui();\n if (!ui.editable) return false;\n ui.openBlockMenu();\n return true;\n },\n \"Mod-k\": () => {\n const ui = runtime.ui();\n if (!ui.editable) return false;\n ui.openLinkDialog();\n return true;\n },\n Enter: () => {\n const ui = runtime.ui();\n const { selection } = this.editor.state;\n if (!ui.editable || !(selection instanceof NodeSelection)) return false;\n const type = embedTypeOfNode(selection.node.type.name);\n const handler = ui.onEditBlock;\n const id = selection.node.attrs.id as unknown;\n if (!type || !handler || typeof id !== \"string\") return false;\n const payload = attrsToPayload(type, selection.node.attrs);\n void Promise.resolve(handler(type, payload)).then((next) => {\n if (next === null || next === undefined) return;\n updateBlockAttrs(this.editor, id, payloadToAttrs(type, next));\n this.editor.commands.focus();\n });\n return true;\n },\n };\n },\n});\n","import type { EmbedPayloads, EmbedType } from \"../types\";\n\n/** A node attribute that holds JSON and survives copy and paste as a `data-*` attribute. */\nexport function jsonAttribute(name: string, fallback: unknown = null) {\n const dataName = `data-${name}`;\n return {\n default: fallback,\n parseHTML: (element: HTMLElement) => {\n const raw = element.getAttribute(dataName);\n if (raw === null || raw === \"\") return fallback;\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return fallback;\n }\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const value = attributes[name];\n return value === null || value === undefined ? {} : { [dataName]: JSON.stringify(value) };\n },\n };\n}\n\n/** A plain string attribute stored as a `data-*` attribute. */\nexport function dataAttribute(name: string, fallback: string | number | null = null, parse?: (raw: string) => unknown) {\n const dataName = `data-${name}`;\n return {\n default: fallback,\n parseHTML: (element: HTMLElement) => {\n const raw = element.getAttribute(dataName);\n if (raw === null) return fallback;\n return parse ? parse(raw) : raw;\n },\n renderHTML: (attributes: Record<string, unknown>) => {\n const value = attributes[name];\n return value === null || value === undefined || value === \"\" ? {} : { [dataName]: String(value) };\n },\n };\n}\n\n/** Node names of the embedded blocks, by type. */\nexport const EMBED_NODE_NAMES: Record<EmbedType, string> = {\n chart: \"chart\",\n diagram: \"diagram\",\n \"data-view\": \"dataView\",\n ai: \"aiBlock\",\n};\n\nexport function embedTypeOfNode(name: string): EmbedType | null {\n for (const [type, nodeName] of Object.entries(EMBED_NODE_NAMES)) if (nodeName === name) return type as EmbedType;\n return null;\n}\n\n/** Reads the payload of an embedded block from the attributes of its node. */\nexport function attrsToPayload<T extends EmbedType>(type: T, attrs: Record<string, unknown>): EmbedPayloads[T] {\n switch (type) {\n case \"chart\":\n return (attrs.spec ?? {}) as EmbedPayloads[T];\n case \"diagram\": {\n const payload: Record<string, unknown> = { engine: attrs.engine ?? \"mermaid\" };\n if (attrs.diagram !== null && attrs.diagram !== undefined) payload.diagram = attrs.diagram;\n if (typeof attrs.source === \"string\") payload.source = attrs.source;\n return payload as EmbedPayloads[T];\n }\n case \"data-view\":\n return { dataset: typeof attrs.dataset === \"string\" ? attrs.dataset : \"\", view: attrs.view ?? {} } as EmbedPayloads[T];\n default: {\n const payload: Record<string, unknown> = { prompt: typeof attrs.prompt === \"string\" ? attrs.prompt : \"\" };\n if (attrs.result !== null && attrs.result !== undefined) payload.result = attrs.result;\n return payload as EmbedPayloads[T];\n }\n }\n}\n\n/** Turns a payload into the attributes of an embedded block's node. */\nexport function payloadToAttrs<T extends EmbedType>(type: T, payload: EmbedPayloads[T]): Record<string, unknown> {\n const value = payload as unknown as Record<string, unknown>;\n switch (type) {\n case \"chart\":\n return { spec: payload };\n case \"diagram\":\n return { engine: value.engine ?? \"mermaid\", diagram: value.diagram ?? null, source: value.source ?? null };\n case \"data-view\":\n return { dataset: value.dataset ?? \"\", view: value.view ?? null };\n default:\n return { prompt: value.prompt ?? \"\", result: value.result ?? null };\n }\n}\n\n/** A short title for an embedded block, or an empty string. */\nexport function payloadTitle(type: EmbedType, payload: unknown): string {\n const value = (payload ?? {}) as Record<string, unknown>;\n const text = (candidate: unknown) => (typeof candidate === \"string\" ? candidate.trim() : \"\");\n switch (type) {\n case \"chart\":\n return text(value.title);\n case \"diagram\": {\n const diagram = value.diagram as Record<string, unknown> | undefined;\n return text(diagram?.title) || text(diagram?.name);\n }\n case \"data-view\": {\n const view = value.view as Record<string, unknown> | undefined;\n return text(view?.name) || text(value.dataset);\n }\n default:\n return text(value.prompt).slice(0, 80);\n }\n}\n","import { mergeAttributes, Mark } from \"@tiptap/core\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport { isHighlightToken, isTextColorToken } from \"../../tokens\";\n\nfunction tokenAttribute(isAllowed: (token: unknown) => boolean, fallback: string | null) {\n return {\n token: {\n default: fallback,\n parseHTML: (element: HTMLElement) => {\n const token = element.getAttribute(\"data-token\");\n return isAllowed(token) ? token : fallback;\n },\n renderHTML: (attributes: Record<string, unknown>) =>\n isAllowed(attributes.token) ? { \"data-token\": attributes.token as string } : {},\n },\n };\n}\n\n/** Text color. Stores a token path; the stylesheet maps it to `var(--kit-...)`. */\nexport const TextColor = Mark.create({\n name: \"color\",\n\n addAttributes() {\n return tokenAttribute(isTextColorToken, null);\n },\n\n parseHTML() {\n return [{ tag: 'span[data-kit=\"editor-text-color\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"span\", mergeAttributes({ \"data-kit\": \"editor-text-color\" }, HTMLAttributes), 0];\n },\n});\n\n/**\n * Highlight. Same token approach as the text color; no raw colors are stored.\n * The `==text==` input rule applies the default highlight token.\n */\nexport const KitHighlight = Highlight.extend({\n addAttributes() {\n return tokenAttribute(isHighlightToken, \"color.highlight\");\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"mark\", mergeAttributes({ \"data-kit\": \"editor-highlight\" }, HTMLAttributes), 0];\n },\n});\n","import { InputRule, mergeAttributes, Node, textblockTypeInputRule } from \"@tiptap/core\";\nimport Image from \"@tiptap/extension-image\";\nimport { Table, TableCell, TableHeader, TableRow } from \"@tiptap/extension-table\";\nimport { TextSelection } from \"@tiptap/pm/state\";\nimport { ReactNodeViewRenderer, type ReactNodeViewProps } from \"@tiptap/react\";\nimport type { ReactNode } from \"react\";\nimport { emojiForShortcode } from \"../../emoji\";\nimport { CALLOUT_VARIANTS } from \"../../schema\";\nimport { AiBlockView, ChartView, DataViewView, DiagramView, UnknownBlockView } from \"../blocks/embed\";\nimport { BookmarkView, FileView, ImageView, MediaView } from \"../blocks/media\";\nimport { CalloutView, CodeBlockView, TableOfContentsView, ToggleView } from \"../blocks/text\";\nimport { dataAttribute, jsonAttribute } from \"./attrs\";\nimport { toggleControl } from \"./toggle-registry\";\n\n/** The root node. The document title is kept outside the content, so the node has no attributes. */\nexport const KitDocument = Node.create({\n name: \"doc\",\n topNode: true,\n content: \"block+\",\n});\n\n/** A highlighted note. Inline content; the kind is the `variant` attribute. */\nexport const Callout = Node.create({\n name: \"callout\",\n group: \"block\",\n content: \"inline*\",\n defining: true,\n\n addAttributes() {\n return {\n variant: {\n default: \"info\",\n parseHTML: (element: HTMLElement) =>\n CALLOUT_VARIANTS.find((variant) => variant === element.getAttribute(\"data-variant\")) ?? \"info\",\n renderHTML: (attributes: Record<string, unknown>) => ({ \"data-variant\": String(attributes.variant ?? \"info\") }),\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-kit=\"editor-callout\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes({ \"data-kit\": \"editor-callout\", role: \"note\" }, HTMLAttributes), 0];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(CalloutView);\n },\n\n addKeyboardShortcuts() {\n const leave = () => {\n const { selection } = this.editor.state;\n const { $anchor, empty } = selection;\n if (!empty || $anchor.parent.type.name !== this.name || $anchor.parent.content.size !== 0) return false;\n return this.editor.commands.setNode(\"paragraph\");\n };\n return { Enter: leave, Backspace: leave };\n },\n});\n\n/** The first line of a toggle. */\nexport const ToggleSummary = Node.create({\n name: \"toggleSummary\",\n content: \"inline*\",\n defining: true,\n\n parseHTML() {\n return [{ tag: 'div[data-kit=\"editor-toggle-summary\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes({ \"data-kit\": \"editor-toggle-summary\" }, HTMLAttributes), 0];\n },\n\n addKeyboardShortcuts() {\n return {\n // Enter in the summary opens the toggle and continues in its first block.\n Enter: () => {\n const { $from, empty } = this.editor.state.selection;\n if (!empty || $from.parent.type.name !== this.name) return false;\n const toggle = $from.node($from.depth - 1);\n const id = toggle.attrs.id as unknown;\n if (typeof id === \"string\") toggleControl(this.editor, id)?.open();\n const after = $from.after();\n return this.editor.commands.command(({ tr }) => {\n tr.setSelection(TextSelection.near(tr.doc.resolve(after), 1));\n return true;\n });\n },\n };\n },\n});\n\n/** A summary plus blocks that can be collapsed. */\nexport const Toggle = Node.create({\n name: \"toggle\",\n group: \"block\",\n content: \"toggleSummary block+\",\n defining: true,\n\n parseHTML() {\n return [{ tag: 'div[data-kit=\"editor-toggle\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes({ \"data-kit\": \"editor-toggle\", \"data-open\": \"true\" }, HTMLAttributes), 0];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ToggleView);\n },\n\n addKeyboardShortcuts() {\n return {\n \"Alt-Enter\": () => {\n const { $from } = this.editor.state.selection;\n for (let depth = $from.depth; depth >= 0; depth -= 1) {\n const node = $from.node(depth);\n if (node.type.name !== this.name) continue;\n const id = node.attrs.id as unknown;\n if (typeof id !== \"string\") return false;\n const control = toggleControl(this.editor, id);\n control?.toggle();\n return control !== undefined;\n }\n return false;\n },\n };\n },\n});\n\n/** Side by side columns. */\nexport const Columns = Node.create({\n name: \"columns\",\n group: \"block\",\n content: \"column+\",\n defining: true,\n isolating: true,\n\n parseHTML() {\n return [{ tag: 'div[data-kit=\"editor-columns\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes({ \"data-kit\": \"editor-columns\" }, HTMLAttributes), 0];\n },\n});\n\nexport const Column = Node.create({\n name: \"column\",\n content: \"block+\",\n defining: true,\n isolating: true,\n\n parseHTML() {\n return [{ tag: 'div[data-kit=\"editor-column\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes({ \"data-kit\": \"editor-column\" }, HTMLAttributes), 0];\n },\n});\n\n/** A LaTeX source block. The source is shown as text; no math renderer is bundled. */\nexport const Equation = Node.create({\n name: \"equation\",\n group: \"block\",\n content: \"text*\",\n marks: \"\",\n code: true,\n defining: true,\n\n parseHTML() {\n return [{ tag: 'div[data-kit=\"editor-equation\"]', preserveWhitespace: \"full\" }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes({ \"data-kit\": \"editor-equation\", dir: \"ltr\" }, HTMLAttributes), [\"code\", 0]];\n },\n});\n\nconst FENCE_LANGUAGE = \"([a-zA-Z0-9+#_-]*)\";\n\n/** A code block with a language attribute. Written here because the engine's own code block is not a direct dependency. */\nexport const CodeBlock = Node.create({\n name: \"codeBlock\",\n group: \"block\",\n content: \"text*\",\n marks: \"\",\n code: true,\n defining: true,\n\n addAttributes() {\n return {\n language: {\n default: null,\n parseHTML: (element: HTMLElement) => {\n const direct = element.getAttribute(\"data-language\");\n if (direct) return direct;\n const match = /language-([\\w+#-]+)/.exec(element.querySelector(\"code\")?.getAttribute(\"class\") ?? \"\");\n return match?.[1] ?? null;\n },\n renderHTML: (attributes: Record<string, unknown>) =>\n typeof attributes.language === \"string\" && attributes.language !== \"\" ? { \"data-language\": attributes.language } : {},\n },\n };\n },\n\n parseHTML() {\n return [{ tag: \"pre\", preserveWhitespace: \"full\" }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"pre\", mergeAttributes({ dir: \"ltr\" }, HTMLAttributes), [\"code\", 0]];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(CodeBlockView);\n },\n\n addKeyboardShortcuts() {\n return {\n \"Mod-Alt-c\": () => this.editor.commands.toggleNode(this.name, \"paragraph\"),\n // Backspace at the very start turns the block back into a paragraph.\n Backspace: () => {\n const { empty, $anchor } = this.editor.state.selection;\n if (!empty || $anchor.parent.type.name !== this.name || $anchor.parentOffset !== 0) return false;\n return this.editor.commands.clearNodes();\n },\n // Mod+Enter leaves the block (Tab stays free to move focus out of the editor).\n \"Mod-Enter\": () => {\n const { $from } = this.editor.state.selection;\n if ($from.parent.type.name !== this.name) return false;\n return this.editor.commands.exitCode();\n },\n };\n },\n\n addInputRules() {\n return [\n textblockTypeInputRule({\n find: new RegExp(`^\\`\\`\\`${FENCE_LANGUAGE}[\\\\s\\\\n]$`),\n type: this.type,\n getAttributes: (match) => ({ language: match[1] || null }),\n }),\n textblockTypeInputRule({\n find: new RegExp(`^~~~${FENCE_LANGUAGE}[\\\\s\\\\n]$`),\n type: this.type,\n getAttributes: (match) => ({ language: match[1] || null }),\n }),\n ];\n },\n});\n\n/** A manual page break for print and PDF. */\nexport const PageBreak = Node.create({\n name: \"pageBreak\",\n group: \"block\",\n atom: true,\n selectable: true,\n\n parseHTML() {\n return [{ tag: 'hr[data-kit=\"editor-page-break\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"hr\", mergeAttributes({ \"data-kit\": \"editor-page-break\" }, HTMLAttributes)];\n },\n});\n\n/** Links to the headings of the document. The list is computed, not stored. */\nexport const TableOfContents = Node.create({\n name: \"tableOfContents\",\n group: \"block\",\n atom: true,\n selectable: true,\n\n parseHTML() {\n return [{ tag: 'div[data-kit=\"editor-toc\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes({ \"data-kit\": \"editor-toc\" }, HTMLAttributes)];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(TableOfContentsView);\n },\n});\n\n/** An image with required alternative text (an empty `alt` marks it as decorative) and an optional caption. */\nexport const KitImage = Image.extend({\n name: \"image\",\n draggable: false,\n\n addAttributes() {\n return {\n src: { default: null },\n alt: { default: \"\" },\n caption: jsonAttribute(\"caption\"),\n align: dataAttribute(\"align\"),\n width: dataAttribute(\"width\", null, (raw) => {\n const value = Number(raw);\n return Number.isFinite(value) && value > 0 ? value : null;\n }),\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ImageView);\n },\n});\n\n/** Video or audio by URL. */\nexport const Media = Node.create({\n name: \"media\",\n group: \"block\",\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n kind: dataAttribute(\"kind\", \"video\"),\n src: dataAttribute(\"src\", \"\"),\n caption: jsonAttribute(\"caption\"),\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-kit=\"editor-media-block\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes({ \"data-kit\": \"editor-media-block\" }, HTMLAttributes)];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(MediaView);\n },\n});\n\nexport const FileBlock = Node.create({\n name: \"file\",\n group: \"block\",\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n src: dataAttribute(\"src\", \"\"),\n name: dataAttribute(\"name\", \"\"),\n size: dataAttribute(\"size\", null, (raw) => {\n const value = Number(raw);\n return Number.isFinite(value) && value >= 0 ? value : null;\n }),\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-kit=\"editor-file-block\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes({ \"data-kit\": \"editor-file-block\" }, HTMLAttributes)];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(FileView);\n },\n});\n\nexport const Bookmark = Node.create({\n name: \"bookmark\",\n group: \"block\",\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n url: dataAttribute(\"url\", \"\"),\n title: dataAttribute(\"title\"),\n description: dataAttribute(\"description\"),\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-kit=\"editor-bookmark-block\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes({ \"data-kit\": \"editor-bookmark-block\" }, HTMLAttributes)];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(BookmarkView);\n },\n});\n\nfunction createEmbed(name: string, type: string, attributes: Record<string, unknown>, view: (props: ReactNodeViewProps) => ReactNode) {\n return Node.create({\n name,\n group: \"block\",\n atom: true,\n selectable: true,\n isolating: true,\n\n addAttributes() {\n return attributes;\n },\n\n parseHTML() {\n return [{ tag: `div[data-kit=\"editor-embed-block\"][data-embed=\"${type}\"]` }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes({ \"data-kit\": \"editor-embed-block\", \"data-embed\": type }, HTMLAttributes)];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(view);\n },\n });\n}\n\nexport const Chart = createEmbed(\"chart\", \"chart\", { spec: jsonAttribute(\"spec\", {}) }, ChartView);\n\nexport const Diagram = createEmbed(\n \"diagram\",\n \"diagram\",\n {\n engine: dataAttribute(\"engine\", \"mermaid\"),\n diagram: jsonAttribute(\"diagram\"),\n source: dataAttribute(\"source\"),\n },\n DiagramView,\n);\n\nexport const DataView = createEmbed(\n \"dataView\",\n \"data-view\",\n { dataset: dataAttribute(\"dataset\", \"\"), view: jsonAttribute(\"view\", {}) },\n DataViewView,\n);\n\nexport const AiBlock = createEmbed(\n \"aiBlock\",\n \"ai\",\n { prompt: dataAttribute(\"prompt\", \"\"), result: jsonAttribute(\"result\") },\n AiBlockView,\n);\n\n/** A block this version does not know. Its data is kept untouched so it survives a round trip. */\nexport const UnknownBlock = Node.create({\n name: \"unknownBlock\",\n group: \"block\",\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n blockType: dataAttribute(\"block-type\", \"unknown\"),\n payload: jsonAttribute(\"payload\", {}),\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-kit=\"editor-unknown-block\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes({ \"data-kit\": \"editor-unknown-block\" }, HTMLAttributes)];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(UnknownBlockView);\n },\n});\n\n/** An inline reference to a person, page or date. Insertion UI is the host app's job. */\nexport const Mention = Node.create({\n name: \"mention\",\n group: \"inline\",\n inline: true,\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n kind: dataAttribute(\"kind\", \"person\"),\n id: dataAttribute(\"id\", \"\"),\n label: dataAttribute(\"label\", \"\"),\n };\n },\n\n parseHTML() {\n return [{ tag: 'span[data-kit=\"editor-mention\"]' }];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const prefix = node.attrs.kind === \"person\" ? \"@\" : \"\";\n return [\"span\", mergeAttributes({ \"data-kit\": \"editor-mention\" }, HTMLAttributes), `${prefix}${String(node.attrs.label ?? \"\")}`];\n },\n\n renderText({ node }) {\n return `${node.attrs.kind === \"person\" ? \"@\" : \"\"}${String(node.attrs.label ?? \"\")}`;\n },\n});\n\n/** An emoji stored as a shortcode, so documents stay portable. Typing `:smile:` inserts one. */\nexport const Emoji = Node.create({\n name: \"emoji\",\n group: \"inline\",\n inline: true,\n atom: true,\n selectable: true,\n\n addAttributes() {\n return { shortcode: dataAttribute(\"shortcode\", \"\") };\n },\n\n parseHTML() {\n return [{ tag: 'span[data-kit=\"editor-emoji\"]' }];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const shortcode = String(node.attrs.shortcode ?? \"\");\n return [\n \"span\",\n mergeAttributes({ \"data-kit\": \"editor-emoji\", role: \"img\", \"aria-label\": shortcode.replace(/[_-]+/g, \" \") }, HTMLAttributes),\n emojiForShortcode(shortcode) ?? `:${shortcode}:`,\n ];\n },\n\n renderText({ node }) {\n const shortcode = String(node.attrs.shortcode ?? \"\");\n return emojiForShortcode(shortcode) ?? `:${shortcode}:`;\n },\n\n addInputRules() {\n return [\n new InputRule({\n find: /:([a-z0-9_+-]+):$/,\n handler: ({ state, range, match }) => {\n const shortcode = match[1];\n if (!shortcode || emojiForShortcode(shortcode) === null) return null;\n state.tr.replaceWith(range.from, range.to, this.type.create({ shortcode }));\n return undefined;\n },\n }),\n ];\n },\n});\n\n/** Table with block ids and the header hints the document model stores. */\nexport const KitTable = Table.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n headerRow: { default: null, rendered: false },\n headerColumn: { default: null, rendered: false },\n };\n },\n}).configure({ resizable: false, HTMLAttributes: { \"data-kit\": \"editor-table\" } });\n\nexport { TableCell, TableHeader, TableRow };\n","import { createElement, type FunctionComponent } from \"react\";\nimport type { ReactNodeViewProps } from \"@tiptap/react\";\nimport { useEditorUi } from \"../context\";\nimport { payloadToAttrs } from \"../extensions/attrs\";\nimport { useTranslator } from \"../messages\";\nimport type { EmbedPayloads, EmbedType } from \"../types\";\nimport { AtomFrame } from \"./frame\";\nimport { EMBED_KIND, EmbedBody, embedFromAttrs } from \"./preview\";\nimport { UnknownPreview } from \"./unknown-preview\";\n\nfunction EmbedView<T extends EmbedType>({ view, type }: { view: ReactNodeViewProps; type: T }) {\n const ui = useEditorUi();\n const t = useTranslator();\n const attrs = view.node.attrs as Record<string, unknown>;\n const { payload, title } = embedFromAttrs(type, attrs);\n const id = typeof attrs.id === \"string\" ? attrs.id : \"\";\n const kindName = t.messages.blocks[EMBED_KIND[type]].name;\n const label = t.format(t.messages.embed.groupLabel, { type: kindName, title: title || t.messages.embed.untitled });\n\n const onEdit =\n ui.editable && ui.onEditBlock\n ? () => {\n const handler = ui.onEditBlock;\n if (!handler) return;\n void Promise.resolve(handler(type, payload as EmbedPayloads[T])).then((next) => {\n if (next === null || next === undefined) return;\n view.updateAttributes(payloadToAttrs(type, next));\n view.editor.commands.focus();\n });\n }\n : undefined;\n\n return (\n <AtomFrame view={view} kind={type} label={label} onEdit={onEdit}>\n <EmbedBody type={type} id={id} payload={payload} selected={view.selected} />\n </AtomFrame>\n );\n}\n\nfunction make<T extends EmbedType>(type: T) {\n return function EmbedNodeView(view: ReactNodeViewProps) {\n return createElement(EmbedView<T>, { view, type });\n };\n}\n\nexport const ChartView = make(\"chart\");\nexport const DiagramView = make(\"diagram\");\nexport const DataViewView = make(\"data-view\");\nexport const AiBlockView = make(\"ai\");\n\n/** A block of a type this version does not know. The renderer `blockRenderers.unknown` can draw it. */\nexport function UnknownBlockView(view: ReactNodeViewProps) {\n const ui = useEditorUi();\n const t = useTranslator();\n const attrs = view.node.attrs as Record<string, unknown>;\n const blockType = typeof attrs.blockType === \"string\" ? attrs.blockType : \"unknown\";\n const payload = (typeof attrs.payload === \"object\" && attrs.payload !== null ? attrs.payload : {}) as Record<string, unknown>;\n const id = typeof attrs.id === \"string\" ? attrs.id : \"\";\n const custom = ui.blockRenderers.unknown;\n return (\n <AtomFrame view={view} kind=\"unknown\" label={`${t.messages.embed.unknown} ${blockType}`}>\n {custom ? (\n createElement(custom as FunctionComponent<{ id: string; blockType: string; payload: Record<string, unknown>; editable: boolean }>, {\n id,\n blockType,\n payload,\n editable: ui.editable,\n })\n ) : (\n <UnknownPreview blockType={blockType} payload={payload} />\n )}\n </AtomFrame>\n );\n}\n","import { useRef, type ReactNode } from \"react\";\nimport { NodeViewWrapper, type ReactNodeViewProps } from \"@tiptap/react\";\nimport { IconButton } from \"@x12i/ui\";\nimport { deleteBlock, moveBlock } from \"../commands\";\nimport { useEditorUi } from \"../context\";\nimport { Glyph } from \"../internal/glyphs\";\nimport { useRovingToolbar } from \"../internal/roving\";\nimport { useTranslator } from \"../messages\";\n\nexport interface AtomFrameProps {\n view: ReactNodeViewProps;\n /** Accessible name of the block. */\n label: string;\n /** `data-block` value, for styling. */\n kind: string;\n children: ReactNode;\n /** Adds an Edit button to the overlay toolbar. */\n onEdit?: () => void;\n editLabel?: string;\n}\n\n/**\n * The shell around blocks that are not typed into (charts, images, files):\n * a labelled group that is selectable as a unit, with an overlay toolbar\n * (edit, move, remove) while it is selected.\n */\nexport function AtomFrame({ view, label, kind, children, onEdit, editLabel }: AtomFrameProps) {\n const { editor, getPos, selected } = view;\n const ui = useEditorUi();\n const t = useTranslator();\n const m = t.messages;\n const toolbarRef = useRef<HTMLDivElement>(null);\n const roving = useRovingToolbar(toolbarRef);\n\n const position = () => {\n const pos = getPos();\n return typeof pos === \"number\" ? pos : undefined;\n };\n\n const move = (direction: -1 | 1) => {\n const pos = position();\n if (pos === undefined) return;\n const result = moveBlock(editor, direction, pos);\n ui.announce(\n result.moved\n ? t.format(m.status.blockMoved, { position: result.position, total: result.total })\n : m.status.cannotMove,\n );\n editor.commands.focus();\n };\n\n const remove = () => {\n const pos = position();\n if (pos === undefined) return;\n if (deleteBlock(editor, pos)) ui.announce(m.status.blockDeleted);\n editor.commands.focus();\n };\n\n const showTools = ui.editable && selected;\n\n return (\n <NodeViewWrapper\n data-kit=\"editor-frame\"\n data-block={kind}\n data-selected={selected ? \"\" : undefined}\n role=\"group\"\n aria-label={label}\n >\n <div data-kit=\"editor-frame-body\">{children}</div>\n {showTools ? (\n <div\n ref={toolbarRef}\n role=\"toolbar\"\n aria-label={m.embed.toolbar}\n data-kit=\"editor-frame-toolbar\"\n contentEditable={false}\n {...roving}\n >\n {onEdit ? (\n <IconButton label={editLabel ?? m.embed.edit} title={editLabel ?? m.embed.edit} variant=\"ghost\" tone=\"neutral\" size=\"sm\" data-toolbar-item=\"\" onClick={onEdit}>\n <Glyph name=\"edit\" />\n </IconButton>\n ) : null}\n <IconButton label={m.embed.moveUp} title={m.embed.moveUp} variant=\"ghost\" tone=\"neutral\" size=\"sm\" data-toolbar-item=\"\" onClick={() => move(-1)}>\n <Glyph name=\"up\" />\n </IconButton>\n <IconButton label={m.embed.moveDown} title={m.embed.moveDown} variant=\"ghost\" tone=\"neutral\" size=\"sm\" data-toolbar-item=\"\" onClick={() => move(1)}>\n <Glyph name=\"down\" />\n </IconButton>\n <IconButton label={m.embed.remove} title={m.embed.remove} variant=\"ghost\" tone=\"neutral\" size=\"sm\" data-toolbar-item=\"\" onClick={remove}>\n <Glyph name=\"trash\" />\n </IconButton>\n </div>\n ) : null}\n </NodeViewWrapper>\n );\n}\n","import { Component, createElement, useMemo, type FunctionComponent, type ReactNode } from \"react\";\nimport { Badge } from \"@x12i/ui\";\nimport { useEditorUi } from \"../context\";\nimport { attrsToPayload, payloadTitle } from \"../extensions/attrs\";\nimport { useMessages, type BlockKind } from \"../messages\";\nimport type { BlockRendererProps, EmbedPayloads, EmbedType } from \"../types\";\n\nexport const EMBED_KIND: Record<EmbedType, BlockKind> = {\n chart: \"chart\",\n diagram: \"diagram\",\n \"data-view\": \"dataView\",\n ai: \"ai\",\n};\n\n/** Longest JSON text shown in a preview card. */\nconst MAX_JSON_LENGTH = 4000;\n\nfunction stringify(value: unknown): string {\n try {\n const text = JSON.stringify(value, null, 2) ?? \"\";\n return text.length > MAX_JSON_LENGTH ? `${text.slice(0, MAX_JSON_LENGTH)}\\n…` : text;\n } catch {\n return \"\";\n }\n}\n\n/** The top-level scalar fields of a payload, as label and value pairs (at most six). */\nfunction facts(payload: unknown): Array<[string, string]> {\n if (typeof payload !== \"object\" || payload === null) return [];\n const out: Array<[string, string]> = [];\n for (const [key, value] of Object.entries(payload as Record<string, unknown>)) {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n const text = String(value);\n if (text !== \"\" && key !== \"source\") out.push([key, text.length > 120 ? `${text.slice(0, 120)}…` : text]);\n } else if (Array.isArray(value)) {\n out.push([key, String(value.length)]);\n }\n if (out.length >= 6) break;\n }\n return out;\n}\n\nfunction describe(type: EmbedType, payload: unknown): string {\n const value = (payload ?? {}) as Record<string, unknown>;\n if (type === \"chart\") {\n const a11y = value.a11y as Record<string, unknown> | undefined;\n return typeof a11y?.description === \"string\" ? a11y.description : \"\";\n }\n if (type === \"diagram\") return typeof value.source === \"string\" ? value.source.split(\"\\n\").slice(0, 4).join(\"\\n\") : \"\";\n if (type === \"ai\") return typeof value.prompt === \"string\" ? value.prompt : \"\";\n return \"\";\n}\n\nexport interface EmbedPreviewProps {\n type: EmbedType;\n payload: unknown;\n title: string;\n}\n\n/** The default look of a chart, diagram, data view or AI block: a summary card with the raw data. */\nexport function EmbedPreview({ type, payload, title }: EmbedPreviewProps) {\n const m = useMessages();\n const json = useMemo(() => stringify(payload), [payload]);\n const summary = useMemo(() => facts(payload), [payload]);\n const description = describe(type, payload);\n return (\n <div data-kit=\"editor-embed-card\" data-embed={type}>\n <div data-kit=\"editor-embed-head\">\n <Badge tone=\"accent\" size=\"sm\">\n {m.blocks[EMBED_KIND[type]].name}\n </Badge>\n <strong data-kit=\"editor-embed-title\">{title || m.embed.untitled}</strong>\n </div>\n {description ? <p data-kit=\"editor-embed-description\">{description}</p> : null}\n {summary.length > 0 ? (\n <dl data-kit=\"editor-embed-facts\">\n {summary.map(([key, value]) => (\n <div key={key} data-kit=\"editor-embed-fact\">\n <dt>{key}</dt>\n <dd>{value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n <details data-kit=\"editor-embed-data\">\n <summary>{m.embed.showData}</summary>\n <pre tabIndex={0}>\n <code>{json}</code>\n </pre>\n </details>\n <p data-kit=\"editor-embed-hint\">{m.embed.previewHint}</p>\n </div>\n );\n}\n\nclass RendererBoundary extends Component<{ fallback: ReactNode; children: ReactNode }, { failed: boolean }> {\n override state = { failed: false };\n\n static getDerivedStateFromError() {\n return { failed: true };\n }\n\n override render() {\n return this.state.failed ? this.props.fallback : this.props.children;\n }\n}\n\nexport interface EmbedBodyProps<T extends EmbedType> {\n type: T;\n id: string;\n payload: EmbedPayloads[T];\n selected?: boolean;\n}\n\n/**\n * Draws an embedded block with the injected renderer, or the default preview\n * card when there is none (or when the renderer throws).\n */\nexport function EmbedBody<T extends EmbedType>({ type, id, payload, selected = false }: EmbedBodyProps<T>) {\n const ui = useEditorUi();\n const title = payloadTitle(type, payload);\n const fallback = <EmbedPreview type={type} payload={payload} title={title} />;\n const renderer = ui.blockRenderers[type] as FunctionComponent<BlockRendererProps<T>> | undefined;\n if (!renderer) return fallback;\n // A component, not a plain call: renderers may use hooks, and a throw is caught by the boundary.\n return (\n <RendererBoundary fallback={fallback}>\n {createElement(renderer, { type, id, payload, title, editable: ui.editable, selected })}\n </RendererBoundary>\n );\n}\n\n/** Reads the payload from node attributes, for node views. */\nexport function embedFromAttrs<T extends EmbedType>(type: T, attrs: Record<string, unknown>) {\n const payload = attrsToPayload(type, attrs);\n return { payload, title: payloadTitle(type, payload) };\n}\n","import { Badge } from \"@x12i/ui\";\nimport { useMessages } from \"../messages\";\n\nexport interface UnknownPreviewProps {\n blockType: string;\n payload: Record<string, unknown>;\n}\n\n/** Shows a block this version cannot render. Its data stays in the document untouched. */\nexport function UnknownPreview({ blockType, payload }: UnknownPreviewProps) {\n const m = useMessages();\n let json: string;\n try {\n json = JSON.stringify(payload, null, 2) ?? \"\";\n } catch {\n json = \"\";\n }\n return (\n <div data-kit=\"editor-embed-card\" data-embed=\"unknown\">\n <div data-kit=\"editor-embed-head\">\n <Badge tone=\"warning\" size=\"sm\">\n {blockType}\n </Badge>\n </div>\n <p data-kit=\"editor-embed-hint\">{m.embed.unknown}</p>\n <details data-kit=\"editor-embed-data\">\n <summary>{m.embed.showData}</summary>\n <pre tabIndex={0}>\n <code>{json.length > 4000 ? `${json.slice(0, 4000)}\\n…` : json}</code>\n </pre>\n </details>\n </div>\n );\n}\n","import { useId, useState, type FormEvent } from \"react\";\nimport type { ReactNodeViewProps } from \"@tiptap/react\";\nimport { Button } from \"@x12i/ui\";\nimport type { Inline } from \"../../schema\";\nimport { normalizeUrlInput, sanitizeMediaUrl, sanitizeUrl } from \"../../url\";\nimport { useEditorUi } from \"../context\";\nimport { Glyph } from \"../internal/glyphs\";\nimport { InlineContent } from \"../internal/inline\";\nimport { useTranslator } from \"../messages\";\nimport { AtomFrame } from \"./frame\";\n\nfunction asInline(value: unknown): Inline | null {\n return Array.isArray(value) && value.length > 0 ? (value as Inline) : null;\n}\n\nfunction position(view: ReactNodeViewProps): number | undefined {\n const pos = view.getPos();\n return typeof pos === \"number\" ? pos : undefined;\n}\n\ninterface UrlFormField {\n name: string;\n label: string;\n required?: boolean;\n}\n\n/** Inline form that fills in an address for a block that was inserted empty. */\nfunction UrlForm({\n fields,\n onSubmit,\n}: {\n fields: UrlFormField[];\n onSubmit: (values: Record<string, string>) => string | null;\n}) {\n const t = useTranslator();\n const idBase = useId();\n const [values, setValues] = useState<Record<string, string>>({});\n const [error, setError] = useState<string | null>(null);\n\n const submit = (event: FormEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setError(onSubmit(values));\n };\n\n return (\n <form data-kit=\"editor-url-form\" onSubmit={submit} noValidate>\n {fields.map((field, index) => (\n <label key={field.name} data-kit=\"editor-field\">\n <span data-kit=\"editor-field-label\">{field.label}</span>\n <input\n id={`${idBase}-${field.name}`}\n data-kit=\"editor-input\"\n type=\"text\"\n inputMode={index === 0 ? \"url\" : \"text\"}\n value={values[field.name] ?? \"\"}\n required={field.required}\n aria-invalid={error !== null && index === 0 ? true : undefined}\n aria-describedby={error !== null && index === 0 ? `${idBase}-error` : undefined}\n onChange={(event) => setValues((previous) => ({ ...previous, [field.name]: event.target.value }))}\n />\n </label>\n ))}\n <Button type=\"submit\" size=\"sm\" variant=\"soft\" tone=\"accent\">\n {t.messages.media.set}\n </Button>\n {error ? (\n <p id={`${idBase}-error`} role=\"alert\" data-kit=\"editor-error\">\n {error}\n </p>\n ) : null}\n </form>\n );\n}\n\nexport function ImageView(view: ReactNodeViewProps) {\n const ui = useEditorUi();\n const m = useTranslator().messages;\n const attrs = view.node.attrs as Record<string, unknown>;\n const src = sanitizeMediaUrl(attrs.src);\n const alt = typeof attrs.alt === \"string\" ? attrs.alt : \"\";\n const caption = asInline(attrs.caption);\n const align = attrs.align === \"start\" || attrs.align === \"center\" || attrs.align === \"end\" ? attrs.align : undefined;\n const width = typeof attrs.width === \"number\" && attrs.width > 0 ? attrs.width : undefined;\n const pos = position(view);\n\n return (\n <AtomFrame\n view={view}\n kind=\"image\"\n label={alt || m.media.imageDecorative}\n onEdit={ui.editable ? () => ui.openImageDialog(pos) : undefined}\n editLabel={m.media.imageEdit}\n >\n <figure data-kit=\"editor-image\" data-align={align}>\n {src ? (\n <img src={src} alt={alt} style={width ? { inlineSize: width } : undefined} />\n ) : (\n <p data-kit=\"editor-error\">{m.media.unsafe}</p>\n )}\n {caption ? (\n <figcaption dir=\"auto\">\n <InlineContent inline={caption} />\n </figcaption>\n ) : null}\n </figure>\n </AtomFrame>\n );\n}\n\nexport function MediaView(view: ReactNodeViewProps) {\n const ui = useEditorUi();\n const m = useTranslator().messages;\n const attrs = view.node.attrs as Record<string, unknown>;\n const kind = attrs.kind === \"audio\" ? \"audio\" : \"video\";\n const rawSrc = typeof attrs.src === \"string\" ? attrs.src : \"\";\n const src = rawSrc === \"\" ? null : sanitizeMediaUrl(rawSrc);\n const caption = asInline(attrs.caption);\n const name = kind === \"audio\" ? m.media.audio : m.media.video;\n\n return (\n <AtomFrame view={view} kind={kind} label={name}>\n <figure data-kit=\"editor-media\" data-kind={kind}>\n {src ? (\n kind === \"audio\" ? (\n <audio controls src={src} aria-label={name} />\n ) : (\n <video controls src={src} aria-label={name} />\n )\n ) : ui.editable && rawSrc === \"\" ? (\n <UrlForm\n fields={[{ name: \"src\", label: m.media.urlLabel, required: true }]}\n onSubmit={(values) => {\n const next = sanitizeMediaUrl(normalizeUrlInput(values.src ?? \"\"));\n if (next === null) return m.media.unsafe;\n view.updateAttributes({ src: next });\n return null;\n }}\n />\n ) : (\n <p data-kit=\"editor-error\">{m.media.unsafe}</p>\n )}\n {caption ? (\n <figcaption dir=\"auto\">\n <InlineContent inline={caption} />\n </figcaption>\n ) : null}\n </figure>\n </AtomFrame>\n );\n}\n\nfunction formatSize(bytes: number, locale: string | undefined): string {\n const units: Array<[number, string]> = [\n [1024 ** 3, \"gigabyte\"],\n [1024 ** 2, \"megabyte\"],\n [1024, \"kilobyte\"],\n ];\n const [factor, unit] = units.find(([size]) => bytes >= size) ?? [1, \"byte\"];\n try {\n return new Intl.NumberFormat(locale, { style: \"unit\", unit, unitDisplay: \"narrow\", maximumFractionDigits: 1 }).format(bytes / (factor as number));\n } catch {\n return String(bytes);\n }\n}\n\nexport function FileView(view: ReactNodeViewProps) {\n const ui = useEditorUi();\n const t = useTranslator();\n const m = t.messages;\n const attrs = view.node.attrs as Record<string, unknown>;\n const rawSrc = typeof attrs.src === \"string\" ? attrs.src : \"\";\n const href = rawSrc === \"\" ? null : sanitizeUrl(rawSrc);\n const name = typeof attrs.name === \"string\" && attrs.name !== \"\" ? attrs.name : m.media.file;\n const size = typeof attrs.size === \"number\" && attrs.size >= 0 ? attrs.size : null;\n\n return (\n <AtomFrame view={view} kind=\"file\" label={name}>\n {href ? (\n <a data-kit=\"editor-file\" href={href} download={name} rel=\"noopener noreferrer\" aria-label={t.format(m.media.download, { name })}>\n <Glyph name=\"file\" />\n <span data-kit=\"editor-file-name\" dir=\"auto\">\n {name}\n </span>\n {size !== null ? <span data-kit=\"editor-file-size\">{formatSize(size, t.locale)}</span> : null}\n </a>\n ) : ui.editable && rawSrc === \"\" ? (\n <UrlForm\n fields={[\n { name: \"src\", label: m.media.urlLabel, required: true },\n { name: \"name\", label: m.media.nameLabel },\n ]}\n onSubmit={(values) => {\n const next = sanitizeUrl(normalizeUrlInput(values.src ?? \"\"));\n if (next === null) return m.media.unsafe;\n view.updateAttributes({ src: next, name: (values.name ?? \"\").trim() || next });\n return null;\n }}\n />\n ) : (\n <p data-kit=\"editor-error\">{m.media.unsafe}</p>\n )}\n </AtomFrame>\n );\n}\n\nexport function BookmarkView(view: ReactNodeViewProps) {\n const ui = useEditorUi();\n const t = useTranslator();\n const m = t.messages;\n const attrs = view.node.attrs as Record<string, unknown>;\n const rawUrl = typeof attrs.url === \"string\" ? attrs.url : \"\";\n const href = rawUrl === \"\" ? null : sanitizeUrl(rawUrl);\n const title = typeof attrs.title === \"string\" && attrs.title !== \"\" ? attrs.title : rawUrl;\n const description = typeof attrs.description === \"string\" ? attrs.description : \"\";\n let host = \"\";\n if (href) {\n try {\n host = new URL(href).host;\n } catch {\n host = \"\";\n }\n }\n\n return (\n <AtomFrame view={view} kind=\"bookmark\" label={title || m.media.bookmark}>\n {href ? (\n <a data-kit=\"editor-bookmark\" href={href} rel=\"noopener noreferrer\" aria-label={t.format(m.media.open, { title })}>\n <Glyph name=\"bookmark\" />\n <span data-kit=\"editor-bookmark-text\">\n <strong dir=\"auto\">{title}</strong>\n {description ? <span dir=\"auto\">{description}</span> : null}\n {host ? <small>{host}</small> : null}\n </span>\n </a>\n ) : ui.editable && rawUrl === \"\" ? (\n <UrlForm\n fields={[\n { name: \"url\", label: m.media.urlLabel, required: true },\n { name: \"title\", label: m.media.nameLabel },\n ]}\n onSubmit={(values) => {\n const next = sanitizeUrl(normalizeUrlInput(values.url ?? \"\"));\n if (next === null) return m.media.unsafe;\n const label = (values.title ?? \"\").trim();\n view.updateAttributes({ url: next, title: label === \"\" ? null : label });\n return null;\n }}\n />\n ) : (\n <p data-kit=\"editor-error\">{m.media.unsafe}</p>\n )}\n </AtomFrame>\n );\n}\n","import { Fragment, type ReactNode } from \"react\";\nimport { emojiForShortcode } from \"../../emoji\";\nimport type { Inline, InlineNode, Mark } from \"../../schema\";\nimport { isHighlightToken, isTextColorToken } from \"../../tokens\";\nimport { sanitizeUrl } from \"../../url\";\n\n// Innermost first, so the nesting is link > color > highlight > bold > italic > underline > strike > code.\nconst APPLY_ORDER: Array<Mark[\"type\"]> = [\"code\", \"strike\", \"underline\", \"italic\", \"bold\", \"highlight\", \"color\", \"link\"];\n\nfunction wrap(children: ReactNode, mark: Mark, key: string): ReactNode {\n switch (mark.type) {\n case \"bold\":\n return <strong key={key}>{children}</strong>;\n case \"italic\":\n return <em key={key}>{children}</em>;\n case \"underline\":\n return <u key={key}>{children}</u>;\n case \"strike\":\n return <s key={key}>{children}</s>;\n case \"code\":\n return <code key={key}>{children}</code>;\n case \"link\": {\n const href = sanitizeUrl(mark.href);\n return href === null ? (\n <Fragment key={key}>{children}</Fragment>\n ) : (\n <a key={key} href={href} rel=\"noopener noreferrer\">\n {children}\n </a>\n );\n }\n case \"color\":\n return isTextColorToken(mark.token) ? (\n <span key={key} data-kit=\"editor-text-color\" data-token={mark.token}>\n {children}\n </span>\n ) : (\n <Fragment key={key}>{children}</Fragment>\n );\n case \"highlight\":\n return isHighlightToken(mark.token) ? (\n <mark key={key} data-kit=\"editor-highlight\" data-token={mark.token}>\n {children}\n </mark>\n ) : (\n <Fragment key={key}>{children}</Fragment>\n );\n default:\n return children;\n }\n}\n\nfunction renderNode(node: InlineNode, key: string): ReactNode {\n switch (node.type) {\n case \"text\": {\n const lines = node.text.split(\"\\n\");\n let content: ReactNode = lines.map((line, index) => (\n <Fragment key={index}>\n {index > 0 ? <br /> : null}\n {line}\n </Fragment>\n ));\n const marks = node.marks ?? [];\n for (const type of APPLY_ORDER) {\n for (const mark of marks) if (mark.type === type) content = wrap(content, mark, `${key}-${type}`);\n }\n return <Fragment key={key}>{content}</Fragment>;\n }\n case \"mention\":\n return (\n <span key={key} data-kit=\"editor-mention\" data-kind={node.kind}>\n {node.kind === \"person\" ? \"@\" : \"\"}\n {node.label}\n </span>\n );\n case \"emoji\": {\n const char = emojiForShortcode(node.shortcode);\n return char === null ? (\n <Fragment key={key}>{`:${node.shortcode}:`}</Fragment>\n ) : (\n <span key={key} data-kit=\"editor-emoji\" role=\"img\" aria-label={node.shortcode.replace(/[_-]+/g, \" \")}>\n {char}\n </span>\n );\n }\n default:\n return null;\n }\n}\n\n/** Renders inline content (text with marks, mentions, emoji) without the editor engine. */\nexport function InlineContent({ inline }: { inline: Inline | undefined }) {\n return <>{(inline ?? []).map((node, index) => renderNode(node, String(index)))}</>;\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { NodeViewContent, NodeViewWrapper, type ReactNodeViewProps } from \"@tiptap/react\";\nimport { CALLOUT_VARIANTS, type CalloutVariant } from \"../../schema\";\nimport { buildOutlineTree, slugifyHeading, type OutlineNode } from \"../../outline\";\nimport { useEditorUi } from \"../context\";\nimport { registerToggle } from \"../extensions/toggle-registry\";\nimport { Glyph } from \"../internal/glyphs\";\nimport { CODE_LANGUAGES, languageName } from \"../internal/languages\";\nimport { useTranslator } from \"../messages\";\n\nfunction variantOf(value: unknown): CalloutVariant {\n return CALLOUT_VARIANTS.find((variant) => variant === value) ?? \"info\";\n}\n\n/** A highlighted note with a kind (info, success, warning, danger, neutral). */\nexport function CalloutView({ node, updateAttributes }: ReactNodeViewProps) {\n const ui = useEditorUi();\n const m = useTranslator().messages;\n const variant = variantOf(node.attrs.variant);\n return (\n <NodeViewWrapper data-kit=\"editor-callout\" data-variant={variant} role=\"note\" aria-label={m.callouts[variant]}>\n <span data-kit=\"editor-callout-icon\" contentEditable={false}>\n <Glyph name={variant} />\n </span>\n <NodeViewContent data-kit=\"editor-callout-content\" dir=\"auto\" />\n {ui.editable ? (\n <select\n data-kit=\"editor-callout-kind\"\n contentEditable={false}\n aria-label={m.blocks.callout.name}\n value={variant}\n onChange={(event) => updateAttributes({ variant: variantOf(event.target.value) })}\n >\n {CALLOUT_VARIANTS.map((option) => (\n <option key={option} value={option}>\n {m.callouts[option]}\n </option>\n ))}\n </select>\n ) : null}\n </NodeViewWrapper>\n );\n}\n\n/** A summary line with content that expands and collapses. Loads expanded. */\nexport function ToggleView({ editor, node }: ReactNodeViewProps) {\n const m = useTranslator().messages;\n const [open, setOpen] = useState(true);\n const id = typeof node.attrs.id === \"string\" ? node.attrs.id : \"\";\n\n useEffect(() => {\n if (id === \"\") return;\n return registerToggle(editor, id, { toggle: () => setOpen((value) => !value), open: () => setOpen(true) });\n }, [editor, id]);\n\n return (\n <NodeViewWrapper data-kit=\"editor-toggle\" data-open={open ? \"true\" : \"false\"}>\n <button\n type=\"button\"\n data-kit=\"editor-toggle-button\"\n contentEditable={false}\n aria-expanded={open}\n aria-label={open ? m.toggle.collapse : m.toggle.expand}\n title={open ? m.toggle.collapse : m.toggle.expand}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setOpen((value) => !value)}\n >\n <Glyph name=\"chevron\" data-open={open ? \"true\" : \"false\"} />\n </button>\n <NodeViewContent data-kit=\"editor-toggle-content\" />\n </NodeViewWrapper>\n );\n}\n\n/** A code block with a language menu and a copy button. */\nexport function CodeBlockView({ editor, node, updateAttributes }: ReactNodeViewProps) {\n const ui = useEditorUi();\n const m = useTranslator().messages;\n const language = typeof node.attrs.language === \"string\" ? node.attrs.language : \"\";\n const known = language === \"\" || CODE_LANGUAGES.includes(language);\n const [copied, setCopied] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n useEffect(() => () => clearTimeout(timer.current), []);\n\n const copy = () => {\n const text = node.textContent;\n const done = () => {\n setCopied(true);\n ui.announce(m.status.copied);\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), 2000);\n };\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n void navigator.clipboard.writeText(text).then(done, () => undefined);\n }\n editor.commands.focus();\n };\n\n return (\n <NodeViewWrapper data-kit=\"editor-code\" data-language={language || undefined}>\n <div data-kit=\"editor-code-bar\" contentEditable={false}>\n {ui.editable ? (\n <select\n data-kit=\"editor-code-language\"\n aria-label={m.code.language}\n value={language}\n onChange={(event) => updateAttributes({ language: event.target.value === \"\" ? null : event.target.value })}\n >\n <option value=\"\">{m.code.plainText}</option>\n {known ? null : <option value={language}>{language}</option>}\n {CODE_LANGUAGES.map((option) => (\n <option key={option} value={option}>\n {languageName(option)}\n </option>\n ))}\n </select>\n ) : (\n <span data-kit=\"editor-code-language-label\">{language ? languageName(language) : m.code.plainText}</span>\n )}\n <button type=\"button\" data-kit=\"editor-code-copy\" onMouseDown={(event) => event.preventDefault()} onClick={copy}>\n <Glyph name={copied ? \"check\" : \"copy\"} />\n <span>{copied ? m.code.copied : m.code.copy}</span>\n </button>\n </div>\n <pre dir=\"ltr\">\n {/* The typings only list `div`; any intrinsic element name works at runtime. */}\n <NodeViewContent as={\"code\" as \"div\"} />\n </pre>\n </NodeViewWrapper>\n );\n}\n\ninterface HeadingEntry {\n id: string;\n level: 1 | 2 | 3 | 4;\n text: string;\n}\n\nfunction collectHeadings(editor: ReactNodeViewProps[\"editor\"]): HeadingEntry[] {\n const out: HeadingEntry[] = [];\n editor.state.doc.descendants((node) => {\n if (node.type.name !== \"heading\") return;\n const text = node.textContent.trim();\n const level = Number(node.attrs.level) as 1 | 2 | 3 | 4;\n if (text !== \"\" && typeof node.attrs.id === \"string\") out.push({ id: node.attrs.id, level, text });\n });\n return out;\n}\n\nfunction sameHeadings(a: HeadingEntry[], b: HeadingEntry[]): boolean {\n return a.length === b.length && a.every((item, index) => item.id === b[index]?.id && item.text === b[index]?.text && item.level === b[index]?.level);\n}\n\nfunction Entries({ nodes, onJump }: { nodes: OutlineNode[]; onJump: (id: string) => void }) {\n return (\n <ol>\n {nodes.map((item) => (\n <li key={item.id}>\n <a\n href={`#${slugifyHeading(item.text)}`}\n dir=\"auto\"\n onClick={(event) => {\n event.preventDefault();\n onJump(item.id);\n }}\n >\n {item.text}\n </a>\n {item.children.length > 0 ? <Entries nodes={item.children} onJump={onJump} /> : null}\n </li>\n ))}\n </ol>\n );\n}\n\n/** A live list of links to the headings of the document. */\nexport function TableOfContentsView({ editor }: ReactNodeViewProps) {\n const m = useTranslator().messages;\n const [headings, setHeadings] = useState<HeadingEntry[]>(() => collectHeadings(editor));\n\n useEffect(() => {\n const update = () => setHeadings((previous) => {\n const next = collectHeadings(editor);\n return sameHeadings(previous, next) ? previous : next;\n });\n update();\n editor.on(\"update\", update);\n return () => {\n editor.off(\"update\", update);\n };\n }, [editor]);\n\n const jump = (id: string) => {\n let target = -1;\n editor.state.doc.descendants((node, pos) => {\n if (target === -1 && node.type.name === \"heading\" && node.attrs.id === id) target = pos;\n return target === -1;\n });\n if (target === -1) return;\n editor.chain().focus().setTextSelection(target + 1).scrollIntoView().run();\n };\n\n const tree = buildOutlineTree(headings);\n return (\n <NodeViewWrapper data-kit=\"editor-toc\" role=\"navigation\" aria-label={m.blocks.toc.name} contentEditable={false}>\n {tree.length > 0 ? <Entries nodes={tree} onJump={jump} /> : <p data-kit=\"editor-toc-empty\">{m.blocks.toc.description}</p>}\n </NodeViewWrapper>\n );\n}\n","import type { Editor } from \"@tiptap/core\";\n\ntype ToggleControl = { toggle: () => void; open: () => void };\n\nconst registry = new WeakMap<Editor, Map<string, ToggleControl>>();\n\n/** Lets keyboard shortcuts open and close the toggles that live in React node views. */\nexport function registerToggle(editor: Editor, id: string, control: ToggleControl): () => void {\n let controls = registry.get(editor);\n if (!controls) {\n controls = new Map();\n registry.set(editor, controls);\n }\n controls.set(id, control);\n return () => {\n const current = registry.get(editor);\n if (current?.get(id) === control) current.delete(id);\n };\n}\n\nexport function toggleControl(editor: Editor, id: string): ToggleControl | undefined {\n return registry.get(editor)?.get(id);\n}\n","/** Languages offered in the code block menu. These are proper names, so they are not translated. */\nexport const CODE_LANGUAGES: readonly string[] = [\n \"bash\",\n \"c\",\n \"cpp\",\n \"csharp\",\n \"css\",\n \"diff\",\n \"go\",\n \"html\",\n \"java\",\n \"javascript\",\n \"json\",\n \"kotlin\",\n \"markdown\",\n \"php\",\n \"python\",\n \"ruby\",\n \"rust\",\n \"sql\",\n \"swift\",\n \"typescript\",\n \"yaml\",\n];\n\n/** Display names that differ from the stored identifier. */\nexport const LANGUAGE_NAMES: Readonly<Record<string, string>> = {\n cpp: \"C++\",\n csharp: \"C#\",\n c: \"C\",\n css: \"CSS\",\n html: \"HTML\",\n javascript: \"JavaScript\",\n json: \"JSON\",\n php: \"PHP\",\n sql: \"SQL\",\n typescript: \"TypeScript\",\n yaml: \"YAML\",\n bash: \"Bash\",\n go: \"Go\",\n java: \"Java\",\n kotlin: \"Kotlin\",\n markdown: \"Markdown\",\n python: \"Python\",\n ruby: \"Ruby\",\n rust: \"Rust\",\n swift: \"Swift\",\n diff: \"Diff\",\n};\n\nexport function languageName(language: string): string {\n return LANGUAGE_NAMES[language] ?? language;\n}\n","import { Extension, type Editor, type Range } from \"@tiptap/core\";\nimport { PluginKey } from \"@tiptap/pm/state\";\nimport Suggestion from \"@tiptap/suggestion\";\nimport { applyBlockKind, embedKindToType } from \"../commands\";\nimport { allSlashItems, filterSlashItems } from \"../slash-items\";\nimport type { EditorRuntime, SlashItem } from \"./runtime\";\n\nexport const slashPluginKey = new PluginKey(\"kitSlashMenu\");\n\n/** Runs a chosen slash item: removes the typed `/query`, then inserts or converts. */\nexport async function runSlashItem(editor: Editor, range: Range, item: SlashItem, runtime: EditorRuntime): Promise<void> {\n const ui = runtime.ui();\n const t = runtime.translator();\n editor.chain().focus().deleteRange(range).run();\n\n if (item.kind === \"image\") {\n ui.openImageDialog();\n return;\n }\n\n let attrs: Record<string, unknown> = {};\n const type = embedKindToType(item.kind);\n if (type && ui.onRequestBlock) {\n const payload = await ui.onRequestBlock(type);\n if (payload === null || payload === undefined) return;\n attrs = type === \"chart\" ? { spec: payload } : (payload as unknown as Record<string, unknown>);\n editor.commands.focus();\n }\n\n if (applyBlockKind(editor, item.kind, attrs) !== null) {\n ui.announce(t.format(t.messages.status.blockTurnedInto, { name: item.name }));\n }\n}\n\n/** The \"/\" menu. The popup itself is React; this plugin finds the trigger and reports to the bridge. */\nexport const SlashCommand = Extension.create<{ runtime: EditorRuntime | null }>({\n name: \"slashCommand\",\n\n addOptions() {\n return { runtime: null };\n },\n\n addProseMirrorPlugins() {\n const runtime = this.options.runtime;\n if (!runtime) return [];\n return [\n Suggestion<SlashItem, SlashItem>({\n editor: this.editor,\n pluginKey: slashPluginKey,\n char: \"/\",\n allowSpaces: false,\n allowedPrefixes: [\" \"],\n allow: ({ state, range }) => {\n if (!runtime.slashEnabled() || !runtime.ui().editable) return false;\n return !state.doc.resolve(range.from).parent.type.spec.code;\n },\n items: ({ query }) => {\n const messages = runtime.translator().messages;\n return filterSlashItems(query, messages, allSlashItems(messages));\n },\n command: ({ editor, range, props }) => {\n void runSlashItem(editor, range, props, runtime);\n },\n render: () => ({\n onStart: (props) => runtime.slash?.onStart(props),\n onUpdate: (props) => runtime.slash?.onUpdate(props),\n onKeyDown: (props) => runtime.slash?.onKeyDown(props) ?? false,\n onExit: () => runtime.slash?.onExit(),\n }),\n }),\n ];\n },\n});\n","import { BLOCK_KINDS, type BlockKind, type Messages, type SlashGroup } from \"./messages\";\nimport type { SlashItem } from \"./extensions/runtime\";\n\nexport const SLASH_GROUP_ORDER: readonly SlashGroup[] = [\"basic\", \"lists\", \"media\", \"advanced\", \"embeds\"];\n\nconst GROUP_OF: Record<BlockKind, SlashGroup> = {\n paragraph: \"basic\",\n heading1: \"basic\",\n heading2: \"basic\",\n heading3: \"basic\",\n heading4: \"basic\",\n quote: \"basic\",\n callout: \"basic\",\n toggle: \"basic\",\n code: \"basic\",\n equation: \"basic\",\n divider: \"basic\",\n bulletList: \"lists\",\n numberedList: \"lists\",\n taskList: \"lists\",\n image: \"media\",\n video: \"media\",\n audio: \"media\",\n file: \"media\",\n bookmark: \"media\",\n table: \"advanced\",\n columns: \"advanced\",\n pageBreak: \"advanced\",\n toc: \"advanced\",\n chart: \"embeds\",\n diagram: \"embeds\",\n dataView: \"embeds\",\n ai: \"embeds\",\n};\n\nexport function slashGroupOf(kind: BlockKind): SlashGroup {\n return GROUP_OF[kind];\n}\n\n/** All insertable blocks with localized names, ordered by group. */\nexport function allSlashItems(messages: Messages): SlashItem[] {\n const items = BLOCK_KINDS.map((kind) => ({\n kind,\n group: GROUP_OF[kind],\n name: messages.blocks[kind].name,\n description: messages.blocks[kind].description,\n }));\n return SLASH_GROUP_ORDER.flatMap((group) => items.filter((item) => item.group === group));\n}\n\nfunction normalize(text: string): string {\n return text.normalize(\"NFKD\").replace(/\\p{M}+/gu, \"\").toLowerCase();\n}\n\n/**\n * Filters and ranks slash menu items as the person types: names that start\n * with the query first, then words that start with it, then substrings.\n * Names, descriptions and keywords are all searched, in the active language.\n */\nexport function filterSlashItems(query: string, messages: Messages, items: readonly SlashItem[] = allSlashItems(messages)): SlashItem[] {\n const needle = normalize(query.trim());\n if (needle === \"\") return [...items];\n const scored: Array<{ item: SlashItem; score: number; index: number }> = [];\n items.forEach((item, index) => {\n const name = normalize(item.name);\n const keywords = normalize(messages.blocks[item.kind].keywords);\n const description = normalize(item.description);\n const words = `${name} ${keywords}`.split(/\\s+/);\n let score = -1;\n if (name.startsWith(needle)) score = 0;\n else if (words.some((word) => word.startsWith(needle))) score = 1;\n else if (name.includes(needle) || keywords.includes(needle)) score = 2;\n else if (description.includes(needle)) score = 3;\n if (score !== -1) scored.push({ item, score, index });\n });\n return scored.sort((a, b) => a.score - b.score || a.index - b.index).map((entry) => entry.item);\n}\n","import type { SuggestionKeyDownProps, SuggestionProps } from \"@tiptap/suggestion\";\nimport type { EditorUi } from \"../context\";\nimport type { Translator, BlockKind, SlashGroup } from \"../messages\";\n\nexport interface SlashItem {\n kind: BlockKind;\n group: SlashGroup;\n name: string;\n description: string;\n}\n\n/** The React side of the slash menu. The suggestion plugin calls into it. */\nexport interface SlashBridge {\n onStart: (props: SuggestionProps<SlashItem, SlashItem>) => void;\n onUpdate: (props: SuggestionProps<SlashItem, SlashItem>) => void;\n onKeyDown: (props: SuggestionKeyDownProps) => boolean;\n onExit: () => void;\n}\n\n/**\n * What extensions read from the React tree at the moment they need it.\n * Extensions are created once; the React component refreshes these getters on\n * every render, so callbacks and messages are never stale.\n */\nexport interface EditorRuntime {\n ui: () => EditorUi;\n translator: () => Translator;\n placeholder: () => string;\n slashEnabled: () => boolean;\n slash: SlashBridge | null;\n}\n\nexport function createRuntime(): EditorRuntime {\n return {\n ui: () => {\n throw new Error(\"The editor runtime is not connected.\");\n },\n translator: () => {\n throw new Error(\"The editor runtime is not connected.\");\n },\n placeholder: () => \"\",\n slashEnabled: () => false,\n slash: null,\n };\n}\n","import { useRef, useState, type FormEvent } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport { Button } from \"@x12i/ui\";\nimport { inlineToPlainText } from \"../text\";\nimport type { Inline } from \"../schema\";\nimport { normalizeUrlInput, sanitizeMediaUrl } from \"../url\";\nimport { blockTemplate, insertNode } from \"./commands\";\nimport { Dialog } from \"./internal/dialog\";\nimport { Field } from \"./internal/field\";\nimport { useTranslator } from \"./messages\";\n\nexport interface ImageDialogProps {\n editor: Editor;\n /** Position of the image being edited. Omit to insert a new image. */\n pos?: number;\n onClose: () => void;\n announce: (message: string) => void;\n}\n\n/**\n * Inserts or edits an image. Alternative text is required: a person must\n * either describe the image or mark it as decorative, which stores an empty\n * `alt`. There is no way to confirm the dialog with neither.\n */\nexport function ImageDialog({ editor, pos, onClose, announce }: ImageDialogProps) {\n const t = useTranslator();\n const m = t.messages.imageDialog;\n const existing = pos === undefined ? null : editor.state.doc.nodeAt(pos);\n const current = existing && existing.type.name === \"image\" ? existing : null;\n const currentCaption = Array.isArray(current?.attrs.caption) ? (current?.attrs.caption as Inline) : null;\n\n const [src, setSrc] = useState(typeof current?.attrs.src === \"string\" ? current.attrs.src : \"\");\n const [alt, setAlt] = useState(typeof current?.attrs.alt === \"string\" ? current.attrs.alt : \"\");\n const [decorative, setDecorative] = useState(current !== null && current.attrs.alt === \"\" && src !== \"\");\n const [caption, setCaption] = useState(currentCaption ? inlineToPlainText(currentCaption) : \"\");\n const [errors, setErrors] = useState<{ src?: string; alt?: string }>({});\n const srcRef = useRef<HTMLInputElement>(null);\n const altRef = useRef<HTMLInputElement>(null);\n\n const submit = (event: FormEvent) => {\n event.preventDefault();\n const next: { src?: string; alt?: string } = {};\n const value = src.trim();\n const safe = value === \"\" ? null : sanitizeMediaUrl(normalizeUrlInput(value));\n if (value === \"\") next.src = m.urlRequired;\n else if (safe === null) next.src = m.urlInvalid;\n if (!decorative && alt.trim() === \"\") next.alt = m.altRequired;\n if (next.src || next.alt) {\n setErrors(next);\n (next.src ? srcRef : altRef).current?.focus();\n return;\n }\n\n const text = caption.trim();\n // Keep a rich caption as it was when the text was not touched.\n const keepCaption = currentCaption !== null && text === inlineToPlainText(currentCaption).trim();\n const captionValue: Inline | null = keepCaption ? currentCaption : text === \"\" ? null : [{ type: \"text\", text }];\n const altValue = decorative ? \"\" : alt.trim();\n\n if (current && pos !== undefined) {\n editor.view.dispatch(editor.state.tr.setNodeMarkup(pos, undefined, { ...current.attrs, src: safe, alt: altValue, caption: captionValue }));\n } else {\n const template = blockTemplate(\"image\", { src: safe, alt: altValue, caption: captionValue });\n if (template) insertNode(editor, template);\n }\n announce(t.messages.status.imageInserted);\n onClose();\n };\n\n return (\n <Dialog open title={current ? m.editTitle : m.title} onClose={onClose} initialFocus={srcRef} restoreFocus={() => editor.commands.focus()}>\n <form onSubmit={submit} noValidate data-kit=\"editor-dialog-form\">\n <Field label={m.urlLabel} error={errors.src ?? null} required>\n {(control) => (\n <input\n {...control}\n ref={srcRef}\n data-kit=\"editor-input\"\n type=\"text\"\n inputMode=\"url\"\n autoComplete=\"off\"\n spellCheck={false}\n dir=\"ltr\"\n value={src}\n onChange={(event) => {\n setSrc(event.target.value);\n setErrors((previous) => ({ ...previous, src: undefined }));\n }}\n />\n )}\n </Field>\n <Field label={m.altLabel} hint={m.altHint} error={errors.alt ?? null} required={!decorative}>\n {(control) => (\n <input\n {...control}\n ref={altRef}\n data-kit=\"editor-input\"\n type=\"text\"\n dir=\"auto\"\n disabled={decorative}\n value={decorative ? \"\" : alt}\n onChange={(event) => {\n setAlt(event.target.value);\n setErrors((previous) => ({ ...previous, alt: undefined }));\n }}\n />\n )}\n </Field>\n <label data-kit=\"editor-checkbox\">\n <input\n type=\"checkbox\"\n checked={decorative}\n onChange={(event) => {\n setDecorative(event.target.checked);\n setErrors((previous) => ({ ...previous, alt: undefined }));\n }}\n />\n <span>{m.decorative}</span>\n </label>\n <Field label={m.captionLabel}>\n {(control) => (\n <input {...control} data-kit=\"editor-input\" type=\"text\" dir=\"auto\" value={caption} onChange={(event) => setCaption(event.target.value)} />\n )}\n </Field>\n <div data-kit=\"editor-dialog-actions\">\n <Button type=\"submit\" variant=\"solid\" tone=\"accent\" size=\"sm\">\n {current ? m.update : m.insert}\n </Button>\n <Button type=\"button\" variant=\"ghost\" tone=\"neutral\" size=\"sm\" onClick={onClose}>\n {m.cancel}\n </Button>\n </div>\n </form>\n </Dialog>\n );\n}\n","import { useEffect, useId, useRef, type KeyboardEvent, type ReactNode, type RefObject } from \"react\";\n\nconst FOCUSABLE = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled]):not([type='hidden'])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\nexport interface DialogProps {\n open: boolean;\n title: string;\n onClose: () => void;\n children: ReactNode;\n /** Receives focus when the dialog opens. Defaults to the first control. */\n initialFocus?: RefObject<HTMLElement | null>;\n /** Called instead of refocusing the previously focused element, to return focus to the editor. */\n restoreFocus?: () => void;\n describedBy?: string;\n}\n\n/**\n * A modal dialog without portals: it renders in place, so the theme and the\n * text direction of the editor apply. Focus moves in on open, Tab cycles\n * inside, Escape closes, and focus returns to where it was.\n */\nexport function Dialog({ open, title, onClose, children, initialFocus, restoreFocus, describedBy }: DialogProps) {\n const titleId = useId();\n const panelRef = useRef<HTMLDivElement>(null);\n const restoreRef = useRef(restoreFocus);\n restoreRef.current = restoreFocus;\n\n useEffect(() => {\n if (!open) return;\n const previous = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n const panel = panelRef.current;\n const target = initialFocus?.current ?? panel?.querySelector<HTMLElement>(FOCUSABLE) ?? panel;\n target?.focus();\n\n const onFocusIn = (event: FocusEvent) => {\n const current = panelRef.current;\n if (current && event.target instanceof Node && !current.contains(event.target)) {\n (current.querySelector<HTMLElement>(FOCUSABLE) ?? current).focus();\n }\n };\n document.addEventListener(\"focusin\", onFocusIn);\n\n return () => {\n document.removeEventListener(\"focusin\", onFocusIn);\n if (restoreRef.current) restoreRef.current();\n else if (previous?.isConnected) previous.focus();\n };\n // The focus target is read once, when the dialog opens.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n if (!open) return null;\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n event.preventDefault();\n onClose();\n return;\n }\n if (event.key !== \"Tab\") return;\n const panel = panelRef.current;\n if (!panel) return;\n const focusable = Array.from(panel.querySelectorAll<HTMLElement>(FOCUSABLE));\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n const first = focusable[0] as HTMLElement;\n const last = focusable[focusable.length - 1] as HTMLElement;\n const active = document.activeElement;\n if (event.shiftKey && (active === first || !panel.contains(active))) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && (active === last || !panel.contains(active))) {\n event.preventDefault();\n first.focus();\n }\n };\n\n return (\n <div\n data-kit=\"editor-dialog-backdrop\"\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) onClose();\n }}\n >\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={describedBy}\n data-kit=\"editor-dialog\"\n tabIndex={-1}\n onKeyDown={onKeyDown}\n >\n <h2 id={titleId} data-kit=\"editor-dialog-title\">\n {title}\n </h2>\n {children}\n </div>\n </div>\n );\n}\n","import { useId, type ReactNode } from \"react\";\n\nexport interface FieldControlProps {\n id: string;\n \"aria-describedby\": string | undefined;\n \"aria-invalid\": true | undefined;\n \"aria-required\": true | undefined;\n}\n\nexport interface FieldProps {\n label: string;\n hint?: string;\n error?: string | null;\n required?: boolean;\n children: (control: FieldControlProps) => ReactNode;\n}\n\n/** A labelled form control with an optional hint and an error announced when it appears. */\nexport function Field({ label, hint, error, required, children }: FieldProps) {\n const base = useId();\n const hintId = `${base}-hint`;\n const errorId = `${base}-error`;\n const describedBy = [error ? errorId : null, hint ? hintId : null].filter(Boolean).join(\" \") || undefined;\n return (\n <div data-kit=\"editor-field\">\n <label htmlFor={base} data-kit=\"editor-field-label\">\n {label}\n </label>\n {children({\n id: base,\n \"aria-describedby\": describedBy,\n \"aria-invalid\": error ? true : undefined,\n \"aria-required\": required ? true : undefined,\n })}\n {hint ? (\n <p id={hintId} data-kit=\"editor-field-hint\">\n {hint}\n </p>\n ) : null}\n {error ? (\n <p id={errorId} role=\"alert\" data-kit=\"editor-error\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","/** Structural equality for JSON values (objects ignore key order). */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((item, index) => deepEqual(item, b[index]));\n }\n const left = a as Record<string, unknown>;\n const right = b as Record<string, unknown>;\n const keys = Object.keys(left).filter((key) => left[key] !== undefined);\n const otherKeys = Object.keys(right).filter((key) => right[key] !== undefined);\n return keys.length === otherKeys.length && keys.every((key) => deepEqual(left[key], right[key]));\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\n/**\n * A polite status region for short announcements (\"Bold on\", \"Block moved\").\n * `announce` repeats a message the user may have missed by appending a\n * non-breaking space when the text is unchanged.\n */\nexport function useLiveRegion(clearAfterMs = 4000) {\n const [message, setMessage] = useState(\"\");\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n useEffect(() => () => clearTimeout(timer.current), []);\n\n const announce = useCallback(\n (next: string) => {\n setMessage((previous) => (previous === next ? `${next}\\u00a0` : next));\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setMessage(\"\"), clearAfterMs);\n },\n [clearAfterMs],\n );\n\n return { message, announce };\n}\n\nexport interface LiveRegionProps {\n message: string;\n}\n\nexport function LiveRegion({ message }: LiveRegionProps) {\n return (\n <div data-kit=\"editor-status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {message}\n </div>\n );\n}\n","import { useRef, useState, type FormEvent } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport { Button } from \"@x12i/ui\";\nimport { normalizeUrlInput, sanitizeUrl } from \"../url\";\nimport { Dialog } from \"./internal/dialog\";\nimport { Field } from \"./internal/field\";\nimport { useTranslator } from \"./messages\";\n\nexport interface LinkDialogProps {\n editor: Editor;\n /** The address of the link at the selection, or an empty string. */\n initialHref: string;\n onClose: () => void;\n announce: (message: string) => void;\n}\n\n/**\n * Sets or removes a link. The address is validated against the same allow-list\n * the converters and exporters use, so a `javascript:` link cannot be created.\n */\nexport function LinkDialog({ editor, initialHref, onClose, announce }: LinkDialogProps) {\n const t = useTranslator();\n const m = t.messages.linkDialog;\n const [href, setHref] = useState(initialHref);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const hasLink = initialHref !== \"\";\n\n const apply = (event: FormEvent) => {\n event.preventDefault();\n const value = href.trim();\n if (value === \"\") {\n setError(m.required);\n inputRef.current?.focus();\n return;\n }\n const next = sanitizeUrl(normalizeUrlInput(value));\n if (next === null) {\n setError(m.invalid);\n inputRef.current?.focus();\n return;\n }\n const chain = editor.chain().focus();\n if (editor.isActive(\"link\")) chain.extendMarkRange(\"link\").setLink({ href: next }).run();\n else if (editor.state.selection.empty) {\n chain.insertContent({ type: \"text\", text: next, marks: [{ type: \"link\", attrs: { href: next } }] }).run();\n } else chain.setLink({ href: next }).run();\n announce(t.messages.status.linkApplied);\n onClose();\n };\n\n const remove = () => {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n announce(t.messages.status.linkRemoved);\n onClose();\n };\n\n return (\n <Dialog open title={m.title} onClose={onClose} initialFocus={inputRef} restoreFocus={() => editor.commands.focus()}>\n <form onSubmit={apply} noValidate data-kit=\"editor-dialog-form\">\n <Field label={m.urlLabel} hint={m.urlHint} error={error} required>\n {(control) => (\n <input\n {...control}\n ref={inputRef}\n data-kit=\"editor-input\"\n type=\"text\"\n inputMode=\"url\"\n autoComplete=\"off\"\n spellCheck={false}\n dir=\"ltr\"\n value={href}\n onChange={(event) => {\n setHref(event.target.value);\n setError(null);\n }}\n />\n )}\n </Field>\n <div data-kit=\"editor-dialog-actions\">\n <Button type=\"submit\" variant=\"solid\" tone=\"accent\" size=\"sm\">\n {m.apply}\n </Button>\n {hasLink ? (\n <Button type=\"button\" variant=\"outline\" tone=\"neutral\" size=\"sm\" onClick={remove}>\n {m.remove}\n </Button>\n ) : null}\n <Button type=\"button\" variant=\"ghost\" tone=\"neutral\" size=\"sm\" onClick={onClose}>\n {m.cancel}\n </Button>\n </div>\n </form>\n </Dialog>\n );\n}\n","import { useEffect, useId, useLayoutEffect, useState, type RefObject } from \"react\";\nimport { useEditorUi } from \"./context\";\nimport type { SlashItem } from \"./extensions/runtime\";\nimport { positionNear, type PopupPosition } from \"./internal/position\";\nimport { useTranslator, type SlashGroup } from \"./messages\";\nimport { SLASH_GROUP_ORDER } from \"./slash-items\";\n\nexport interface SlashView {\n items: SlashItem[];\n query: string;\n clientRect: (() => DOMRect | null) | null;\n}\n\nexport interface SlashMenuProps {\n view: SlashView;\n activeIndex: number;\n surfaceRef: RefObject<HTMLElement | null>;\n onHover: (index: number) => void;\n onSelect: (item: SlashItem) => void;\n /** Reports the listbox and active option ids so the editor can point at them with `aria-activedescendant`. */\n onIds: (ids: { listbox: string | null; active: string | null }) => void;\n}\n\n/**\n * The \"/\" menu: a listbox of blocks. Focus stays in the editor; the editor\n * points at the active option with `aria-activedescendant`.\n */\nexport function SlashMenu({ view, activeIndex, surfaceRef, onHover, onSelect, onIds }: SlashMenuProps) {\n const t = useTranslator();\n const m = t.messages;\n const ui = useEditorUi();\n const base = useId();\n const [position, setPosition] = useState<PopupPosition>({ x: 0, y: 0 });\n const count = view.items.length;\n const listboxId = `${base}-listbox`;\n const optionId = (index: number) => `${base}-option-${index}`;\n const active = count > 0 ? Math.min(activeIndex, count - 1) : -1;\n\n useLayoutEffect(() => {\n const surface = surfaceRef.current;\n const rect = view.clientRect?.();\n if (!surface || !rect) return;\n setPosition(positionNear(surface, rect, \"bottom\"));\n }, [view, surfaceRef]);\n\n useEffect(() => {\n onIds({ listbox: count > 0 ? listboxId : null, active: active >= 0 ? optionId(active) : null });\n // `optionId` is derived from `base`, which is stable.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [count, active, listboxId, onIds]);\n\n useEffect(() => () => onIds({ listbox: null, active: null }), [onIds]);\n\n useEffect(() => {\n ui.announce(count > 0 ? t.format(m.slash.resultCount, { count }) : m.slash.noResults);\n // Announce when the number of results changes, not on every keystroke.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [count]);\n\n useEffect(() => {\n if (active < 0) return;\n document.getElementById(optionId(active))?.scrollIntoView?.({ block: \"nearest\" });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active]);\n\n const groups = SLASH_GROUP_ORDER.map((group) => ({\n group,\n items: view.items.map((item, index) => ({ item, index })).filter((entry) => entry.item.group === group),\n })).filter((entry) => entry.items.length > 0);\n\n return (\n <div data-kit=\"editor-popup\" data-placement=\"below\" style={{ \"--kit-editor-x\": `${position.x}px`, \"--kit-editor-y\": `${position.y}px` } as React.CSSProperties}>\n {count === 0 ? (\n <div data-kit=\"editor-slash-empty\">{m.slash.noResults}</div>\n ) : (\n <div id={listboxId} role=\"listbox\" aria-label={m.slash.label} data-kit=\"editor-slash\">\n {groups.map(({ group, items }) => (\n <div key={group} role=\"group\" aria-label={m.groups[group as SlashGroup]} data-kit=\"editor-slash-group\">\n <div role=\"presentation\" data-kit=\"editor-slash-heading\" aria-hidden=\"true\">\n {m.groups[group as SlashGroup]}\n </div>\n {items.map(({ item, index }) => (\n <div\n key={item.kind}\n id={optionId(index)}\n role=\"option\"\n aria-selected={index === active}\n data-kit=\"editor-slash-option\"\n data-active={index === active ? \"\" : undefined}\n onMouseDown={(event) => event.preventDefault()}\n onMouseMove={() => onHover(index)}\n onClick={() => onSelect(item)}\n >\n <span data-kit=\"editor-slash-name\">{item.name}</span>\n <span data-kit=\"editor-slash-description\">{item.description}</span>\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useRef, type ReactNode } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport { useEditorState } from \"@tiptap/react\";\nimport { Divider } from \"@x12i/ui\";\nimport { HIGHLIGHT_TOKENS, TEXT_COLOR_TOKENS } from \"../tokens\";\nimport { blockTemplate, currentBlockKind, execEditorCommand, insertNode, TURN_INTO_KINDS, turnInto } from \"./commands\";\nimport { Glyph } from \"./internal/glyphs\";\nimport { MenuButton, type MenuItemSpec } from \"./internal/menu\";\nimport { shortcut } from \"./internal/platform\";\nimport { useRovingToolbar } from \"./internal/roving\";\nimport { ToolButton } from \"./internal/tool-button\";\nimport { useTranslator, type BlockKind } from \"./messages\";\nimport type { EditorCommand } from \"./types\";\n\nexport interface EditorToolbarProps {\n editor: Editor | null;\n /** Opens the link dialog. Without it the link button is hidden. */\n onOpenLink?: () => void;\n /** Opens the image dialog. Without it the image button is hidden. */\n onOpenImage?: () => void;\n /** Opens the block actions menu. Without it the button is hidden. */\n onOpenBlockMenu?: () => void;\n /** Opens the AI menu. Without it the button is hidden. */\n onOpenAi?: () => void;\n /** Speaks a message through a status region. */\n announce?: (message: string) => void;\n /** Extra controls after the built-in ones. */\n children?: ReactNode;\n className?: string;\n}\n\ninterface ToolbarState {\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strike: boolean;\n code: boolean;\n link: boolean;\n bulletList: boolean;\n numberedList: boolean;\n taskList: boolean;\n quote: boolean;\n canUndo: boolean;\n canRedo: boolean;\n canIndent: boolean;\n canOutdent: boolean;\n inTable: boolean;\n headerRow: boolean;\n headerColumn: boolean;\n kind: BlockKind | null;\n highlight: string | null;\n color: string | null;\n}\n\n/** Whether the first row and the first column of the table at the selection are made of header cells. */\nfunction tableHeaders(editor: Editor): { headerRow: boolean; headerColumn: boolean } {\n const { $from } = editor.state.selection;\n for (let depth = $from.depth; depth > 0; depth -= 1) {\n const table = $from.node(depth);\n if (table.type.name !== \"table\") continue;\n let headerRow = table.childCount > 0;\n let headerColumn = table.childCount > 0;\n table.forEach((row, _offset, rowIndex) => {\n row.forEach((cell, _cellOffset, columnIndex) => {\n const header = cell.type.name === \"tableHeader\";\n if (rowIndex === 0 && !header) headerRow = false;\n if (columnIndex === 0 && !header) headerColumn = false;\n });\n });\n return { headerRow, headerColumn };\n }\n return { headerRow: false, headerColumn: false };\n}\n\nfunction readState(editor: Editor | null): ToolbarState | null {\n if (!editor) return null;\n const table = tableHeaders(editor);\n const highlight = (editor.getAttributes(\"highlight\") as { token?: unknown }).token;\n const color = (editor.getAttributes(\"color\") as { token?: unknown }).token;\n const can = editor.can();\n return {\n bold: editor.isActive(\"bold\"),\n italic: editor.isActive(\"italic\"),\n underline: editor.isActive(\"underline\"),\n strike: editor.isActive(\"strike\"),\n code: editor.isActive(\"code\"),\n link: editor.isActive(\"link\"),\n bulletList: editor.isActive(\"bulletList\"),\n numberedList: editor.isActive(\"orderedList\"),\n taskList: editor.isActive(\"taskList\"),\n quote: editor.isActive(\"blockquote\"),\n canUndo: can.undo(),\n canRedo: can.redo(),\n canIndent: can.sinkListItem(\"listItem\") || can.sinkListItem(\"taskItem\"),\n canOutdent: can.liftListItem(\"listItem\") || can.liftListItem(\"taskItem\"),\n inTable: editor.isActive(\"table\"),\n headerRow: table.headerRow,\n headerColumn: table.headerColumn,\n kind: currentBlockKind(editor),\n highlight: typeof highlight === \"string\" ? highlight : null,\n color: typeof color === \"string\" ? color : null,\n };\n}\n\nfunction sameState(a: ToolbarState | null, b: ToolbarState | null): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n return (Object.keys(a) as Array<keyof ToolbarState>).every((key) => a[key] === b[key]);\n}\n\n/**\n * The formatting toolbar: a WAI-ARIA toolbar with one tab stop, arrow keys\n * between controls, `aria-pressed` on toggles and a tooltip on every control.\n */\nexport function EditorToolbar({ editor, onOpenLink, onOpenImage, onOpenBlockMenu, onOpenAi, announce, children, className }: EditorToolbarProps) {\n const t = useTranslator();\n const m = t.messages;\n const ref = useRef<HTMLDivElement>(null);\n const roving = useRovingToolbar(ref);\n // The selector reads the `editor` prop, not the snapshot's editor: the snapshot keeps the\n // editor it was created with (null while the engine mounts) until the first transaction.\n const state = useEditorState({ editor, selector: () => readState(editor), equalityFn: sameState });\n\n const run = (command: EditorCommand) => {\n if (editor) execEditorCommand(editor, command, onOpenBlockMenu);\n };\n\n const toggleMark = (command: EditorCommand, name: string, active: boolean) => () => {\n run(command);\n announce?.(t.format(active ? m.status.markOff : m.status.markOn, { name }));\n };\n\n const disabled = editor === null || state === null || !editor.isEditable;\n const s: ToolbarState = state ?? {\n bold: false, italic: false, underline: false, strike: false, code: false, link: false, bulletList: false, numberedList: false,\n taskList: false, quote: false, canUndo: false, canRedo: false, canIndent: false, canOutdent: false, inTable: false,\n headerRow: false, headerColumn: false, kind: null, highlight: null, color: null,\n };\n\n const blockItems: MenuItemSpec[] = TURN_INTO_KINDS.map((kind) => ({\n id: kind,\n label: m.blocks[kind].name,\n role: \"menuitemradio\",\n checked: s.kind === kind,\n onSelect: () => {\n if (editor && turnInto(editor, kind)) announce?.(t.format(m.status.blockTurnedInto, { name: m.blocks[kind].name }));\n },\n }));\n\n const paletteItems = (tokens: readonly string[], current: string | null, mark: \"color\" | \"highlight\"): MenuItemSpec[] => [\n {\n id: \"none\",\n label: m.toolbar.clearColor,\n role: \"menuitemradio\",\n checked: current === null,\n onSelect: () => {\n if (editor) editor.chain().focus().unsetMark(mark).run();\n },\n },\n ...tokens.map((token) => ({\n id: token,\n label: m.tokens[token] ?? token,\n role: \"menuitemradio\" as const,\n checked: current === token,\n swatch: token,\n onSelect: () => {\n if (editor) editor.chain().focus().setMark(mark, { token }).run();\n },\n })),\n ];\n\n const tableItems: MenuItemSpec[] = [\n { id: \"row-before\", label: m.table.addRowBefore, onSelect: () => editor?.chain().focus().addRowBefore().run() },\n { id: \"row-after\", label: m.table.addRowAfter, onSelect: () => editor?.chain().focus().addRowAfter().run() },\n { id: \"col-before\", label: m.table.addColumnBefore, onSelect: () => editor?.chain().focus().addColumnBefore().run() },\n { id: \"col-after\", label: m.table.addColumnAfter, onSelect: () => editor?.chain().focus().addColumnAfter().run() },\n { id: \"row-delete\", label: m.table.deleteRow, onSelect: () => editor?.chain().focus().deleteRow().run() },\n { id: \"col-delete\", label: m.table.deleteColumn, onSelect: () => editor?.chain().focus().deleteColumn().run() },\n {\n id: \"header-row\",\n label: m.table.toggleHeaderRow,\n role: \"menuitemcheckbox\",\n checked: s.headerRow,\n // The converter reads the header state from the cells, so the stored hint needs no update.\n onSelect: () => editor?.chain().focus().toggleHeaderRow().run(),\n },\n {\n id: \"header-column\",\n label: m.table.toggleHeaderColumn,\n role: \"menuitemcheckbox\",\n checked: s.headerColumn,\n onSelect: () => editor?.chain().focus().toggleHeaderColumn().run(),\n },\n { id: \"table-delete\", label: m.table.deleteTable, onSelect: () => editor?.chain().focus().deleteTable().run() },\n ];\n\n const insertTable = () => {\n const template = blockTemplate(\"table\");\n if (editor && template) insertNode(editor, template);\n };\n\n const turnIntoAvailable = s.kind !== null && TURN_INTO_KINDS.includes(s.kind);\n\n return (\n <div\n ref={ref}\n role=\"toolbar\"\n aria-label={m.toolbar.label}\n data-kit=\"editor-toolbar\"\n className={className}\n {...roving}\n >\n <div data-kit=\"editor-toolbar-group\">\n <ToolButton label={m.toolbar.undo} keys={shortcut(\"Z\")} disabled={disabled || !s.canUndo} onClick={() => run(\"undo\")}>\n <Glyph name=\"undo\" />\n </ToolButton>\n <ToolButton label={m.toolbar.redo} keys={shortcut(\"Shift\", \"Z\")} disabled={disabled || !s.canRedo} onClick={() => run(\"redo\")}>\n <Glyph name=\"redo\" />\n </ToolButton>\n </div>\n <Divider orientation=\"vertical\" decorative />\n <div data-kit=\"editor-toolbar-group\">\n <MenuButton\n label={`${m.toolbar.blockType}: ${s.kind ? m.blocks[s.kind].name : m.blocks.paragraph.name}`}\n title={m.toolbar.blockType}\n menuLabel={m.toolbar.blockType}\n items={blockItems}\n text={s.kind ? m.blocks[s.kind].name : m.blocks.paragraph.name}\n disabled={disabled || !turnIntoAvailable}\n >\n <Glyph name=\"heading\" />\n </MenuButton>\n </div>\n <Divider orientation=\"vertical\" decorative />\n <div data-kit=\"editor-toolbar-group\">\n <ToolButton label={m.toolbar.bold} keys={shortcut(\"B\")} pressed={s.bold} disabled={disabled} onClick={toggleMark(\"bold\", m.toolbar.bold, s.bold)}>\n <Glyph name=\"bold\" />\n </ToolButton>\n <ToolButton label={m.toolbar.italic} keys={shortcut(\"I\")} pressed={s.italic} disabled={disabled} onClick={toggleMark(\"italic\", m.toolbar.italic, s.italic)}>\n <Glyph name=\"italic\" />\n </ToolButton>\n <ToolButton label={m.toolbar.underline} keys={shortcut(\"U\")} pressed={s.underline} disabled={disabled} onClick={toggleMark(\"underline\", m.toolbar.underline, s.underline)}>\n <Glyph name=\"underline\" />\n </ToolButton>\n <ToolButton label={m.toolbar.strike} keys={shortcut(\"Shift\", \"S\")} pressed={s.strike} disabled={disabled} onClick={toggleMark(\"strike\", m.toolbar.strike, s.strike)}>\n <Glyph name=\"strike\" />\n </ToolButton>\n <ToolButton label={m.toolbar.code} keys={shortcut(\"E\")} pressed={s.code} disabled={disabled} onClick={toggleMark(\"code\", m.toolbar.code, s.code)}>\n <Glyph name=\"code\" />\n </ToolButton>\n <MenuButton label={m.toolbar.highlight} menuLabel={m.toolbar.highlight} items={paletteItems(HIGHLIGHT_TOKENS, s.highlight, \"highlight\")} pressed={s.highlight !== null} disabled={disabled}>\n <Glyph name=\"highlight\" />\n </MenuButton>\n <MenuButton label={m.toolbar.textColor} menuLabel={m.toolbar.textColor} items={paletteItems(TEXT_COLOR_TOKENS, s.color, \"color\")} pressed={s.color !== null} disabled={disabled}>\n <Glyph name=\"color\" />\n </MenuButton>\n {onOpenLink ? (\n <ToolButton label={m.toolbar.link} keys={shortcut(\"K\")} pressed={s.link} disabled={disabled} onClick={onOpenLink}>\n <Glyph name=\"link\" />\n </ToolButton>\n ) : null}\n </div>\n <Divider orientation=\"vertical\" decorative />\n <div data-kit=\"editor-toolbar-group\">\n <ToolButton label={m.toolbar.bulletList} keys={shortcut(\"Shift\", \"8\")} pressed={s.bulletList} disabled={disabled} onClick={() => run(\"bulletList\")}>\n <Glyph name=\"bullets\" />\n </ToolButton>\n <ToolButton label={m.toolbar.numberedList} keys={shortcut(\"Shift\", \"7\")} pressed={s.numberedList} disabled={disabled} onClick={() => run(\"numberedList\")}>\n <Glyph name=\"numbers\" />\n </ToolButton>\n <ToolButton label={m.toolbar.taskList} keys={shortcut(\"Shift\", \"9\")} pressed={s.taskList} disabled={disabled} onClick={() => run(\"taskList\")}>\n <Glyph name=\"tasks\" />\n </ToolButton>\n <ToolButton label={m.toolbar.outdent} keys=\"Shift+Tab\" disabled={disabled || !s.canOutdent} onClick={() => run(\"outdent\")}>\n <Glyph name=\"outdent\" />\n </ToolButton>\n <ToolButton label={m.toolbar.indent} keys=\"Tab\" disabled={disabled || !s.canIndent} onClick={() => run(\"indent\")}>\n <Glyph name=\"indent\" />\n </ToolButton>\n </div>\n <Divider orientation=\"vertical\" decorative />\n <div data-kit=\"editor-toolbar-group\">\n <ToolButton label={m.toolbar.quote} keys={shortcut(\"Shift\", \"B\")} pressed={s.quote} disabled={disabled} onClick={() => run(\"quote\")}>\n <Glyph name=\"quote\" />\n </ToolButton>\n <ToolButton label={m.toolbar.divider} disabled={disabled} onClick={() => run(\"divider\")}>\n <Glyph name=\"divider\" />\n </ToolButton>\n <ToolButton label={m.toolbar.table} disabled={disabled} onClick={insertTable}>\n <Glyph name=\"table\" />\n </ToolButton>\n {s.inTable ? (\n <MenuButton label={m.table.controls} menuLabel={m.table.controls} items={tableItems} disabled={disabled}>\n <Glyph name=\"more\" />\n </MenuButton>\n ) : null}\n {onOpenImage ? (\n <ToolButton label={m.toolbar.image} disabled={disabled} onClick={onOpenImage}>\n <Glyph name=\"image\" />\n </ToolButton>\n ) : null}\n </div>\n {onOpenAi || onOpenBlockMenu || children ? <Divider orientation=\"vertical\" decorative /> : null}\n <div data-kit=\"editor-toolbar-group\">\n {onOpenAi ? (\n <ToolButton label={m.ai.menuLabel} disabled={disabled} onClick={onOpenAi}>\n <Glyph name=\"sparkle\" />\n </ToolButton>\n ) : null}\n {onOpenBlockMenu ? (\n <ToolButton label={m.blockMenu.label} keys={shortcut(\"/\")} disabled={disabled} onClick={onOpenBlockMenu}>\n <Glyph name=\"more\" />\n </ToolButton>\n ) : null}\n {children}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Editor, JSONContent } from \"@tiptap/core\";\nimport type { AiCommand, AiProvider } from \"../schema\";\nimport { formatMessage, useTranslator } from \"./messages\";\n\nexport type AiStatus = \"idle\" | \"running\" | \"preview\" | \"error\";\n\nexport interface UseAiAssistOptions {\n provider: AiProvider | undefined;\n editor: Editor | null;\n /** Called with a short message at each step, for a live region. */\n announce?: (message: string) => void;\n}\n\nexport interface RunOptions {\n /** Passed to the provider as `tone`; for `rewrite` it is the instruction. */\n tone?: string;\n}\n\nexport interface UseAiAssist {\n /** False without a provider; the AI menu stays hidden then. */\n available: boolean;\n status: AiStatus;\n command: AiCommand | null;\n /** The suggestion so far. Grows while `status` is `running`. */\n preview: string;\n error: string | null;\n /** Streams a suggestion for the selection (or the text before the caret for `continue`). */\n run: (command: AiCommand, options?: RunOptions) => Promise<void>;\n /** Writes the suggestion into the document. */\n accept: () => void;\n /** Discards the suggestion. */\n reject: () => void;\n /** Stops a running request, keeping what arrived as the preview. */\n cancel: () => void;\n}\n\n/** The context handed to the provider for `continue` when nothing is selected. */\nconst CONTEXT_CHARACTERS = 2000;\n\n/** Plain text to Tiptap content: blank lines split paragraphs, single newlines become hard breaks. */\nexport function textToContent(text: string): JSONContent[] {\n const inline = (paragraph: string): JSONContent[] =>\n paragraph.split(\"\\n\").flatMap((line, index): JSONContent[] => {\n const nodes: JSONContent[] = [];\n if (index > 0) nodes.push({ type: \"hardBreak\" });\n if (line !== \"\") nodes.push({ type: \"text\", text: line });\n return nodes;\n });\n const paragraphs = text.trim().split(/\\n{2,}/);\n if (paragraphs.length === 1) return inline(paragraphs[0] ?? \"\");\n return paragraphs.map((paragraph) => ({ type: \"paragraph\", content: inline(paragraph) }));\n}\n\n/**\n * Connects the editor to an `AiProvider`. The kit calls no model itself: the\n * provider streams text, the hook shows it as a preview, and nothing touches\n * the document until `accept` is called.\n */\nexport function useAiAssist({ provider, editor, announce }: UseAiAssistOptions): UseAiAssist {\n const t = useTranslator();\n const [status, setStatus] = useState<AiStatus>(\"idle\");\n const [command, setCommand] = useState<AiCommand | null>(null);\n const [preview, setPreview] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const rangeRef = useRef<{ from: number; to: number } | null>(null);\n const textRef = useRef(\"\");\n\n useEffect(() => () => abortRef.current?.abort(), []);\n\n const say = useCallback((message: string) => announce?.(message), [announce]);\n\n const run = useCallback(\n async (next: AiCommand, options: RunOptions = {}) => {\n if (!provider || !editor) return;\n const { selection, doc } = editor.state;\n let input = selection.empty ? \"\" : doc.textBetween(selection.from, selection.to, \"\\n\");\n if (input === \"\" && next === \"continue\") {\n const before = doc.textBetween(0, selection.from, \"\\n\");\n input = before.slice(-CONTEXT_CHARACTERS);\n }\n if (input.trim() === \"\") {\n setCommand(next);\n setStatus(\"error\");\n setError(t.messages.ai.noSelection);\n return;\n }\n\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n rangeRef.current = { from: selection.from, to: selection.to };\n textRef.current = \"\";\n setCommand(next);\n setPreview(\"\");\n setError(null);\n setStatus(\"running\");\n say(t.messages.ai.generating);\n\n try {\n const stream = provider.run({\n command: next,\n selection: input,\n ...(options.tone === undefined ? {} : { tone: options.tone }),\n signal: controller.signal,\n });\n for await (const chunk of stream) {\n if (controller.signal.aborted) break;\n textRef.current += chunk;\n setPreview(textRef.current);\n }\n if (abortRef.current !== controller) return;\n setStatus(textRef.current === \"\" ? \"idle\" : \"preview\");\n if (textRef.current !== \"\") say(t.messages.ai.done);\n } catch (cause) {\n if (controller.signal.aborted) {\n if (abortRef.current === controller) setStatus(textRef.current === \"\" ? \"idle\" : \"preview\");\n return;\n }\n const message = cause instanceof Error ? cause.message : String(cause);\n setError(formatMessage(t.messages.ai.error, { message }, t.locale));\n setStatus(\"error\");\n }\n },\n [provider, editor, say, t],\n );\n\n const cancel = useCallback(() => {\n abortRef.current?.abort();\n }, []);\n\n const reject = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n textRef.current = \"\";\n rangeRef.current = null;\n setPreview(\"\");\n setError(null);\n setCommand(null);\n setStatus(\"idle\");\n }, []);\n\n const accept = useCallback(() => {\n const range = rangeRef.current;\n const text = textRef.current;\n if (!editor || !range || text === \"\") return;\n const content = textToContent(text);\n const chain = editor.chain().focus();\n if (command === \"continue\") {\n // Continue adds after the selection (or the caret) and keeps the existing text.\n const before = editor.state.doc.textBetween(Math.max(0, range.to - 1), range.to);\n const separator: JSONContent[] = before !== \"\" && !/\\s/.test(before) ? [{ type: \"text\", text: \" \" }] : [];\n const inline = content[0]?.type === \"text\" || content[0]?.type === \"hardBreak\";\n chain.insertContentAt(range.to, inline ? [...separator, ...content] : content).run();\n } else {\n chain.insertContentAt({ from: range.from, to: range.to }, content).run();\n }\n say(t.messages.status.aiApplied);\n reject();\n }, [editor, command, say, reject, t]);\n\n return { available: provider !== undefined, status, command, preview, error, run, accept, reject, cancel };\n}\n","import { createElement, Fragment, useMemo, type FunctionComponent, type ReactNode } from \"react\";\nimport { buildOutlineTree, getOutline, type OutlineNode } from \"../outline\";\nimport type { Block, ListItem, TaskItem } from \"../schema\";\nimport { CALLOUT_VARIANTS } from \"../schema\";\nimport { sanitizeMediaUrl, sanitizeUrl } from \"../url\";\nimport { EMBED_KIND, EmbedBody } from \"./blocks/preview\";\nimport { defaultEditorUi, EditorUiContext, type EditorUi } from \"./context\";\nimport { payloadTitle } from \"./extensions/attrs\";\nimport { Glyph } from \"./internal/glyphs\";\nimport { InlineContent } from \"./internal/inline\";\nimport {\n createTranslator,\n defaultMessages,\n MessagesContext,\n mergeMessages,\n useTranslator,\n type Translator,\n} from \"./messages\";\nimport type { EditorViewProps, EmbedPayloads, EmbedType } from \"./types\";\n\ninterface ViewContext {\n idPrefix: string;\n outline: OutlineNode[];\n t: Translator;\n unknown: EditorUi[\"blockRenderers\"][\"unknown\"];\n}\n\nfunction formatBytes(size: number, locale: string | undefined): string {\n const units: Array<[number, string]> = [\n [1024 ** 3, \"gigabyte\"],\n [1024 ** 2, \"megabyte\"],\n [1024, \"kilobyte\"],\n ];\n const [factor, unit] = units.find(([bytes]) => size >= bytes) ?? [1, \"byte\"];\n try {\n return new Intl.NumberFormat(locale, { style: \"unit\", unit, unitDisplay: \"narrow\", maximumFractionDigits: 1 }).format(size / (factor as number));\n } catch {\n return String(size);\n }\n}\n\nfunction OutlineList({ nodes, ctx }: { nodes: readonly OutlineNode[]; ctx: ViewContext }) {\n if (nodes.length === 0) return null;\n return (\n <ol>\n {nodes.map((node) => (\n <li key={node.id}>\n <a href={`#${ctx.idPrefix}${node.id}`} dir=\"auto\">\n {node.text}\n </a>\n <OutlineList nodes={node.children} ctx={ctx} />\n </li>\n ))}\n </ol>\n );\n}\n\nfunction Items({ items, kind, ctx }: { items: ReadonlyArray<ListItem | TaskItem>; kind: \"ul\" | \"ol\" | \"task\"; ctx: ViewContext }) {\n const Tag = kind === \"ol\" ? \"ol\" : \"ul\";\n return (\n <Tag data-kit={kind === \"task\" ? \"editor-task-list\" : undefined} dir=\"auto\">\n {items.map((item) => {\n const nested = item.children && item.children.length > 0 ? <Items items={item.children} kind={kind} ctx={ctx} /> : null;\n if (kind === \"task\") {\n const checked = (item as TaskItem).checked === true;\n const labelId = `${ctx.idPrefix}${item.id}-label`;\n return (\n <li key={item.id} data-kit=\"editor-task-item\" data-checked={checked ? \"true\" : \"false\"}>\n <input type=\"checkbox\" checked={checked} disabled readOnly aria-labelledby={labelId} />\n <span id={labelId} dir=\"auto\">\n <InlineContent inline={item.content} />\n </span>\n {nested}\n </li>\n );\n }\n return (\n <li key={item.id} dir=\"auto\">\n <InlineContent inline={item.content} />\n {nested}\n </li>\n );\n })}\n </Tag>\n );\n}\n\nfunction Caption({ caption }: { caption: Extract<Block, { type: \"image\" }>[\"caption\"] }) {\n return caption && caption.length > 0 ? (\n <figcaption dir=\"auto\">\n <InlineContent inline={caption} />\n </figcaption>\n ) : null;\n}\n\nfunction TableBlock({ block }: { block: Extract<Block, { type: \"table\" }> }) {\n const rows = block.rows ?? [];\n const renderRow = (row: (typeof rows)[number], rowIndex: number) => (\n <tr key={rowIndex}>\n {row.map((cell, columnIndex) => {\n const header =\n cell.header === true ||\n (block.headerRow === true && rowIndex === 0) ||\n (block.headerColumn === true && columnIndex === 0);\n let scope: \"col\" | \"row\" | undefined;\n if (header && block.headerRow === true && rowIndex === 0) scope = \"col\";\n else if (header && block.headerColumn === true && columnIndex === 0) scope = \"row\";\n const props = {\n key: columnIndex,\n scope,\n colSpan: cell.colSpan && cell.colSpan > 1 ? cell.colSpan : undefined,\n rowSpan: cell.rowSpan && cell.rowSpan > 1 ? cell.rowSpan : undefined,\n dir: \"auto\",\n };\n return createElement(header ? \"th\" : \"td\", props, <InlineContent inline={cell.content} />);\n })}\n </tr>\n );\n const headRow = block.headerRow === true ? rows[0] : undefined;\n const bodyRows = headRow ? rows.slice(1) : rows;\n return (\n <div data-kit=\"editor-table-wrapper\" data-block-id={block.id}>\n <table data-kit=\"editor-table\">\n {headRow ? <thead>{renderRow(headRow, 0)}</thead> : null}\n <tbody>{bodyRows.map((row, index) => renderRow(row, headRow ? index + 1 : index))}</tbody>\n </table>\n </div>\n );\n}\n\nfunction Embed({ block, type, payload }: { block: Block; type: EmbedType; payload: EmbedPayloads[EmbedType] }) {\n const t = useTranslator();\n const title = payloadTitle(type, payload);\n const label = t.format(t.messages.embed.groupLabel, {\n type: t.messages.blocks[EMBED_KIND[type]].name,\n title: title || t.messages.embed.untitled,\n });\n return (\n <figure data-block-id={block.id} data-kit=\"editor-embed\" data-embed={type} role=\"group\" aria-label={label}>\n <EmbedBody type={type} id={block.id} payload={payload} />\n </figure>\n );\n}\n\nfunction BlockView({ block, ctx }: { block: Block; ctx: ViewContext }): ReactNode {\n const { t } = ctx;\n const m = t.messages;\n const id = block.id;\n switch (block.type) {\n case \"paragraph\":\n return (\n <p data-block-id={id} dir=\"auto\">\n <InlineContent inline={block.content} />\n </p>\n );\n case \"heading\": {\n const level = Math.min(4, Math.max(1, Math.round(block.level)));\n return createElement(\n `h${level}`,\n { id: `${ctx.idPrefix}${id}`, \"data-block-id\": id, dir: \"auto\" },\n <InlineContent inline={block.content} />,\n );\n }\n case \"quote\":\n return (\n <blockquote data-block-id={id} dir=\"auto\">\n <p dir=\"auto\">\n <InlineContent inline={block.content} />\n </p>\n </blockquote>\n );\n case \"callout\": {\n const variant = CALLOUT_VARIANTS.find((candidate) => candidate === block.variant) ?? \"info\";\n return (\n <div data-block-id={id} data-kit=\"editor-callout\" data-variant={variant} role=\"note\" aria-label={m.callouts[variant]}>\n <span data-kit=\"editor-callout-icon\">\n <Glyph name={variant} />\n </span>\n <div data-kit=\"editor-callout-content\" dir=\"auto\">\n <InlineContent inline={block.content} />\n </div>\n </div>\n );\n }\n case \"toggle\":\n return (\n <details data-block-id={id} data-kit=\"editor-toggle\" open>\n <summary dir=\"auto\">\n <InlineContent inline={block.summary} />\n </summary>\n <Blocks blocks={block.children ?? []} ctx={ctx} />\n </details>\n );\n case \"divider\":\n return <hr data-block-id={id} />;\n case \"bulleted-list\":\n return <Items items={block.items ?? []} kind=\"ul\" ctx={ctx} />;\n case \"numbered-list\":\n return <Items items={block.items ?? []} kind=\"ol\" ctx={ctx} />;\n case \"task-list\":\n return <Items items={block.items ?? []} kind=\"task\" ctx={ctx} />;\n case \"code\": {\n const language = block.language && /^[\\w+#-]+$/.test(block.language) ? block.language : undefined;\n return (\n <pre data-block-id={id} data-kit=\"editor-code-block\" data-language={language} dir=\"ltr\">\n <code className={language ? `language-${language}` : undefined}>{block.code}</code>\n </pre>\n );\n }\n case \"equation\":\n return (\n <pre data-block-id={id} data-kit=\"editor-equation\" dir=\"ltr\">\n <code>{block.latex}</code>\n </pre>\n );\n case \"table\":\n return <TableBlock block={block} />;\n case \"image\": {\n const src = sanitizeMediaUrl(block.src);\n return (\n <figure data-block-id={id} data-kit=\"editor-image\" data-align={block.align}>\n {src ? <img src={src} alt={block.alt ?? \"\"} loading=\"lazy\" decoding=\"async\" width={block.width} /> : null}\n <Caption caption={block.caption} />\n </figure>\n );\n }\n case \"video\":\n case \"audio\": {\n const src = sanitizeMediaUrl(block.src);\n const label = block.type === \"audio\" ? m.media.audio : m.media.video;\n return (\n <figure data-block-id={id} data-kit=\"editor-media\" data-kind={block.type}>\n {src\n ? block.type === \"audio\"\n ? <audio src={src} controls preload=\"none\" aria-label={label} />\n : <video src={src} controls preload=\"none\" aria-label={label} />\n : null}\n <Caption caption={block.caption} />\n </figure>\n );\n }\n case \"file\": {\n const href = sanitizeUrl(block.src);\n return (\n <p data-block-id={id} data-kit=\"editor-file\" dir=\"auto\">\n {href ? (\n <a href={href} download rel=\"noopener noreferrer\">\n {block.name}\n </a>\n ) : (\n block.name\n )}\n {typeof block.size === \"number\" ? <span data-kit=\"editor-file-size\"> ({formatBytes(block.size, t.locale)})</span> : null}\n </p>\n );\n }\n case \"bookmark\": {\n const href = sanitizeUrl(block.url);\n const inner = (\n <>\n {block.title ? <strong dir=\"auto\">{block.title}</strong> : block.url}\n {block.description ? <span dir=\"auto\">{block.description}</span> : null}\n </>\n );\n return href ? (\n <a data-block-id={id} data-kit=\"editor-bookmark\" href={href} rel=\"noopener noreferrer\">\n {inner}\n </a>\n ) : (\n <div data-block-id={id} data-kit=\"editor-bookmark\">\n {inner}\n </div>\n );\n }\n case \"columns\":\n return (\n <div data-block-id={id} data-kit=\"editor-columns\" data-count={(block.columns ?? []).length}>\n {(block.columns ?? []).map((column, index) => (\n <div key={index} data-kit=\"editor-column\">\n <Blocks blocks={column} ctx={ctx} />\n </div>\n ))}\n </div>\n );\n case \"page-break\":\n return <hr data-block-id={id} data-kit=\"editor-page-break\" />;\n case \"table-of-contents\":\n return (\n <nav data-block-id={id} data-kit=\"editor-toc\" aria-label={m.blocks.toc.name}>\n <OutlineList nodes={ctx.outline} ctx={ctx} />\n </nav>\n );\n case \"chart\":\n return <Embed block={block} type=\"chart\" payload={block.spec} />;\n case \"diagram\":\n return <Embed block={block} type=\"diagram\" payload={{ engine: block.engine, diagram: block.diagram, source: block.source }} />;\n case \"data-view\":\n return <Embed block={block} type=\"data-view\" payload={{ dataset: block.dataset, view: block.view }} />;\n case \"ai\":\n return <Embed block={block} type=\"ai\" payload={{ prompt: block.prompt, result: block.result }} />;\n default: {\n const unknown = block as unknown as Record<string, unknown>;\n if (!ctx.unknown) return null;\n return createElement(\n ctx.unknown as FunctionComponent<{ id: string; blockType: string; payload: Record<string, unknown>; editable: boolean }>,\n { id: typeof unknown.id === \"string\" ? unknown.id : \"\", blockType: String(unknown.type), payload: unknown, editable: false },\n );\n }\n }\n}\n\nfunction Blocks({ blocks, ctx }: { blocks: readonly Block[]; ctx: ViewContext }) {\n return (\n <>\n {blocks.map((block, index) => (\n <Fragment key={`${block.id}-${index}`}>\n <BlockView block={block} ctx={ctx} />\n </Fragment>\n ))}\n </>\n );\n}\n\n/**\n * Renders a document read-only without the editor engine, so it works on the\n * server and in lists of many documents. Embedded blocks render through\n * `blockRenderers`, like in the editor.\n */\nexport function EditorView({\n value,\n blockRenderers,\n messages,\n locale,\n className,\n idPrefix = \"kit-\",\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n}: EditorViewProps) {\n const translator = useMemo(() => createTranslator(mergeMessages(defaultMessages, messages), locale), [messages, locale]);\n const ui = useMemo<EditorUi>(() => ({ ...defaultEditorUi, editable: false, blockRenderers: blockRenderers ?? {} }), [blockRenderers]);\n const outline = useMemo(() => buildOutlineTree(getOutline(value)), [value]);\n const ctx = useMemo<ViewContext>(\n () => ({ idPrefix, outline, t: translator, unknown: ui.blockRenderers.unknown }),\n [idPrefix, outline, translator, ui],\n );\n const label = ariaLabelledby ? undefined : (ariaLabel ?? translator.messages.viewLabel);\n return (\n <MessagesContext.Provider value={translator}>\n <EditorUiContext.Provider value={ui}>\n <div\n data-kit=\"editor-view\"\n role=\"document\"\n aria-label={label}\n aria-labelledby={ariaLabelledby}\n lang={locale}\n className={className}\n >\n <Blocks blocks={value.blocks ?? []} ctx={ctx} />\n </div>\n </EditorUiContext.Provider>\n </MessagesContext.Provider>\n );\n}\n"],"mappings":"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","names":["useCallback","useEffect","useMemo","useRef","useState","jsx","useState","useEffect","useRef","useState","jsx","jsxs","useRef","useEffect","useState","jsx","position","useState","useEffect","useRef","useState","TextSelection","useEffect","useRef","isRtl","position","IconButton","jsx","jsx","jsxs","useRef","position","useState","useEffect","TextSelection","createContext","useContext","Extension","Extension","NodeSelection","Extension","NodeSelection","mergeAttributes","Node","TextSelection","createElement","useRef","IconButton","jsx","jsxs","useRef","position","IconButton","jsx","jsxs","Badge","jsx","jsxs","Badge","jsx","createElement","useId","useState","Button","Fragment","Fragment","jsx","jsxs","jsx","jsxs","useId","useState","Button","useEffect","useRef","useState","NodeViewWrapper","jsx","jsxs","NodeViewWrapper","useState","useEffect","useRef","Node","mergeAttributes","TextSelection","Extension","PluginKey","PluginKey","Extension","Extension","useRef","useState","Button","useEffect","useId","useRef","jsx","jsxs","useId","jsx","jsxs","jsx","jsxs","useState","useRef","Button","useEffect","useRef","useState","jsx","useRef","useState","Button","jsx","jsxs","useState","useRef","Button","useEffect","useId","useState","jsx","jsxs","useId","position","useState","useEffect","useRef","useEditorState","jsx","jsxs","useRef","useEditorState","useCallback","useEffect","useRef","useState","useState","useRef","useEffect","useCallback","createElement","Fragment","useMemo","Fragment","jsx","jsxs","createElement","useMemo","jsx","jsxs","useMemo","useRef","useState","useCallback","editor","useEffect","position"]}
|