@particle-academy/react-fancy 5.60.0 → 5.60.2
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/CHANGELOG.md +56 -0
- package/dist/chunk-L24LUSEE.js +882 -0
- package/dist/chunk-L24LUSEE.js.map +1 -0
- package/dist/chunk-MCQJFMDP.cjs +893 -0
- package/dist/chunk-MCQJFMDP.cjs.map +1 -0
- package/dist/{chunk-ZASX5GO4.js → chunk-VD3C7IA4.js} +14 -13
- package/dist/chunk-VD3C7IA4.js.map +1 -0
- package/dist/{chunk-ICI33QMY.cjs → chunk-XAQQX7J2.cjs} +18 -17
- package/dist/chunk-XAQQX7J2.cjs.map +1 -0
- package/dist/content-renderer.cjs +4 -4
- package/dist/content-renderer.js +1 -1
- package/dist/editor.cjs +4 -4
- package/dist/editor.js +2 -2
- package/dist/index.cjs +8 -8
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-5IWKZ2WK.cjs +0 -360
- package/dist/chunk-5IWKZ2WK.cjs.map +0 -1
- package/dist/chunk-ICI33QMY.cjs.map +0 -1
- package/dist/chunk-JXXUTPDH.js +0 -350
- package/dist/chunk-JXXUTPDH.js.map +0 -1
- package/dist/chunk-ZASX5GO4.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ContentRenderer/extensions.ts","../src/utils/markdown.ts","../src/components/Editor/editor.utils.ts","../src/components/ContentRenderer/RenderedContent.tsx","../src/components/ContentRenderer/ContentRenderer.tsx"],"names":["marked","sanitizeHtml","useMemo","jsx","Fragment","cn"],"mappings":"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","file":"chunk-MCQJFMDP.cjs","sourcesContent":["import type { ComponentType } from \"react\";\n\n/** Props passed to every render-extension component. */\nexport interface RenderExtensionProps {\n /** The inner content of the custom tag (raw string). */\n content: string;\n /** Parsed HTML attributes from the opening tag. */\n attributes: Record<string, string>;\n}\n\n/** Registers a custom tag with a React component for rendering. */\nexport interface RenderExtension {\n /** Tag name to match, e.g. \"questions\", \"thinking\". Case-insensitive. */\n tag: string;\n /** React component that renders the matched tag. */\n component: ComponentType<RenderExtensionProps>;\n /**\n * Whether this is a block-level element.\n * Block extensions are wrapped in a `<div>`, inline in a `<span>`.\n * @default true\n */\n block?: boolean;\n}\n\n/** A parsed segment — either raw HTML or a matched extension tag. */\nexport type ContentSegment =\n | { type: \"html\"; content: string }\n | { type: \"extension\"; tag: string; content: string; attributes: Record<string, string> };\n\n// ---------------------------------------------------------------------------\n// Global extension registry\n// ---------------------------------------------------------------------------\n\nconst globalRegistry: RenderExtension[] = [];\n\n/** Register a single render extension globally (available to all ContentRenderer and Editor instances). */\nexport function registerExtension(extension: RenderExtension): void {\n const idx = globalRegistry.findIndex(\n (e) => e.tag.toLowerCase() === extension.tag.toLowerCase(),\n );\n if (idx >= 0) {\n globalRegistry[idx] = extension;\n } else {\n globalRegistry.push(extension);\n }\n}\n\n/** Register multiple render extensions globally. */\nexport function registerExtensions(extensions: RenderExtension[]): void {\n for (const ext of extensions) {\n registerExtension(ext);\n }\n}\n\n/** Get a snapshot of the current global registry. */\nexport function getGlobalExtensions(): RenderExtension[] {\n return [...globalRegistry];\n}\n\n// ---------------------------------------------------------------------------\n// Parsing\n// ---------------------------------------------------------------------------\n\n/** Parse attributes from an opening tag string like `tag foo=\"bar\" baz=\"qux\"`. */\nfunction parseAttributes(attrString: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const re = /(\\w[\\w-]*)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\S+)))?/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(attrString)) !== null) {\n attrs[m[1]] = m[2] ?? m[3] ?? m[4] ?? \"\";\n }\n return attrs;\n}\n\n/**\n * Split an HTML string into segments of plain HTML and matched extension tags.\n *\n * Handles:\n * - `<tag>content</tag>`\n * - `<tag attr=\"val\">content</tag>`\n * - Nested different-tags inside the content (preserved as raw HTML)\n * - Self-nesting of the same tag (greedy — matches outermost)\n */\nexport function parseSegments(\n html: string,\n extensions: RenderExtension[],\n): ContentSegment[] {\n if (extensions.length === 0) {\n return html ? [{ type: \"html\", content: html }] : [];\n }\n\n const tagNames = extensions.map((e) => e.tag).join(\"|\");\n // Match opening tag with optional attributes, then content, then closing tag.\n // Uses a non-greedy match for content — if same-tag nesting is needed the\n // consumer should use distinct tag names.\n const pattern = new RegExp(\n `<(${tagNames})((?:\\\\s+[^>]*)?)>([\\\\s\\\\S]*?)<\\\\/\\\\1>`,\n \"gi\",\n );\n\n const segments: ContentSegment[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = pattern.exec(html)) !== null) {\n // Push any HTML before this match\n if (match.index > lastIndex) {\n segments.push({ type: \"html\", content: html.slice(lastIndex, match.index) });\n }\n\n const tag = match[1].toLowerCase();\n const rawAttrs = match[2] ? match[2].trim() : \"\";\n const innerContent = match[3];\n\n segments.push({\n type: \"extension\",\n tag,\n content: innerContent,\n attributes: rawAttrs ? parseAttributes(rawAttrs) : {},\n });\n\n lastIndex = match.index + match[0].length;\n }\n\n // Push any trailing HTML\n if (lastIndex < html.length) {\n segments.push({ type: \"html\", content: html.slice(lastIndex) });\n }\n\n return segments;\n}\n\n/**\n * Merge per-instance extensions with the global registry.\n * Instance extensions override globals with the same tag name.\n */\nexport function mergeExtensions(\n instanceExtensions?: RenderExtension[],\n): RenderExtension[] {\n const globals = getGlobalExtensions();\n if (!instanceExtensions || instanceExtensions.length === 0) return globals;\n if (globals.length === 0) return instanceExtensions;\n\n const merged = [...globals];\n for (const ext of instanceExtensions) {\n const idx = merged.findIndex(\n (e) => e.tag.toLowerCase() === ext.tag.toLowerCase(),\n );\n if (idx >= 0) {\n merged[idx] = ext;\n } else {\n merged.push(ext);\n }\n }\n return merged;\n}\n","import { marked } from \"marked\";\nimport { sanitizeHtml, type SanitizeHtmlOptions } from \"./sanitize\";\n\n/**\n * Parse markdown to HTML WITHOUT sanitising. Internal: ContentRenderer's\n * `unsafe` path needs the raw output; everything public goes through\n * {@link renderMarkdown}.\n */\nexport function markdownToRawHtml(markdown: string | null | undefined): string {\n // marked.parse throws on nullish input; treat missing content as empty.\n return marked.parse(markdown ?? \"\", { async: false }) as string;\n}\n\n/**\n * Render markdown (GitHub-flavoured) to sanitised HTML — the same parser and\n * output `ContentRenderer` uses, so a host never has to import the parser\n * itself.\n *\n * With no `sanitize` options the default blocklist of {@link sanitizeHtml} is\n * applied; pass allowlist options to keep only what you list:\n *\n * ```ts\n * renderMarkdown(md, { allowedTags: [\"p\", \"strong\", \"a\"], allowedAttributes: [\"href\"] })\n * ```\n */\nexport function renderMarkdown(\n markdown: string,\n sanitize?: SanitizeHtmlOptions,\n): string {\n return sanitizeHtml(markdownToRawHtml(markdown), sanitize);\n}\n","import { marked, type Token, type Tokens } from \"marked\";\nimport type { RenderExtension } from \"../ContentRenderer/extensions\";\n\n/**\n * Shared prose typography classes for Editor.Content and ContentRenderer.\n * Hand-rolled since we don't depend on @tailwindcss/typography.\n */\nexport const proseClasses = [\n \"[&_h1]:text-2xl [&_h1]:font-bold [&_h1]:mt-4 [&_h1]:mb-2\",\n \"[&_h2]:text-xl [&_h2]:font-semibold [&_h2]:mt-3 [&_h2]:mb-2\",\n \"[&_h3]:text-lg [&_h3]:font-semibold [&_h3]:mt-2 [&_h3]:mb-1\",\n \"[&_p]:mb-2\",\n \"[&_a]:text-blue-500 [&_a]:underline\",\n \"[&_ul]:list-disc [&_ul]:pl-5 [&_ol]:list-decimal [&_ol]:pl-5\",\n \"[&_li]:mb-1\",\n \"[&_blockquote]:border-l-4 [&_blockquote]:border-zinc-300 [&_blockquote]:pl-4 [&_blockquote]:italic [&_blockquote]:text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] dark:[&_blockquote]:border-zinc-600 dark:[&_blockquote]:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))]\",\n \"[&_code]:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] [&_code]:px-1 [&_code]:rounded [&_code]:text-sm dark:[&_code]:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n \"[&_pre]:bg-zinc-950 [&_pre]:text-zinc-100 [&_pre]:p-4 [&_pre]:rounded-lg [&_pre]:overflow-x-auto\",\n \"[&_pre_code]:bg-transparent [&_pre_code]:px-0\",\n \"[&_strong]:font-bold [&_em]:italic\",\n].join(\" \");\n\nconst HTML_TAG_PATTERN = /<(p|div|br|h[1-6]|ul|ol|strong|em|a |img |table|pre|code|blockquote)[>\\s/]/i;\n\n/** Detect whether a string is likely HTML or Markdown. */\nexport function detectFormat(value: string): \"html\" | \"markdown\" {\n return HTML_TAG_PATTERN.test(value) ? \"html\" : \"markdown\";\n}\n\n/**\n * Build a set of known HTML tag names. Extension tags are excluded\n * so that the \"strip remaining tags\" step preserves them.\n */\nconst STANDARD_HTML_TAGS = new Set([\n \"a\", \"abbr\", \"address\", \"area\", \"article\", \"aside\", \"audio\",\n \"b\", \"base\", \"bdi\", \"bdo\", \"blockquote\", \"body\", \"br\", \"button\",\n \"canvas\", \"caption\", \"cite\", \"code\", \"col\", \"colgroup\",\n \"data\", \"datalist\", \"dd\", \"del\", \"details\", \"dfn\", \"dialog\", \"div\", \"dl\", \"dt\",\n \"em\", \"embed\",\n \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\",\n \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\",\n \"i\", \"iframe\", \"img\", \"input\", \"ins\",\n \"kbd\",\n \"label\", \"legend\", \"li\", \"link\",\n \"main\", \"map\", \"mark\", \"menu\", \"meta\", \"meter\",\n \"nav\", \"noscript\",\n \"object\", \"ol\", \"optgroup\", \"option\", \"output\",\n \"p\", \"param\", \"picture\", \"pre\", \"progress\",\n \"q\",\n \"rp\", \"rt\", \"ruby\",\n \"s\", \"samp\", \"script\", \"section\", \"select\", \"slot\", \"small\", \"source\", \"span\",\n \"strike\", \"strong\", \"style\", \"sub\", \"summary\", \"sup\",\n \"table\", \"tbody\", \"td\", \"template\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"time\", \"title\", \"tr\", \"track\",\n \"u\", \"ul\",\n \"var\", \"video\",\n \"wbr\",\n]);\n\n/**\n * HTML-to-Markdown converter for editor output.\n *\n * Walks the parsed DOM rather than rewriting the HTML string, because markup\n * structure is what decides markdown spacing and a string rewrite cannot see\n * it. The regex version this replaces turned every whitespace text node\n * between tags into a literal newline: marked emits `</li>\\n<li>`, so every\n * tight list came back with a blank line between items — and a fresh item\n * from Enter (which Chromium inserts with NO whitespace node) came back\n * without one, so an edit to the last item made the list loose after the\n * FIRST item only.\n *\n * Rules: whitespace-only text between blocks is formatting, not content.\n * Blocks are separated by a blank line; a list is tight unless one of its\n * items holds a `<p>` (marked's marker for a loose list), so loose lists stay\n * loose and tight lists stay tight. Custom extension tags are preserved as-is.\n *\n * Given the `source` map {@link markdownToEditorHtml} produced when the\n * document was loaded, output is source-preserving instead: every block the\n * person did not change is emitted from its original markdown, byte for byte.\n *\n * Without a DOM (SSR) it falls back to the older string rewrite.\n */\nexport function htmlToMarkdown(html: string, source?: MarkdownSource | null): string {\n if (typeof document === \"undefined\") return legacyHtmlToMarkdown(html);\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n if (source) return serializeWithSource(template.content, source);\n return serializeBlocks(template.content).replace(/^\\n+/, \"\").replace(/\\s+$/, \"\");\n}\n\n/* ------------------------------------------------------------------------ *\n * Source-preserving markdown\n *\n * When markdown is loaded, each top-level block (paragraph, heading, list,\n * table, code block, quote, rule, HTML block) is rendered on its own and its\n * elements are tagged `data-md-block=\"<n>\"`, with the block's ORIGINAL source\n * text and a snapshot of its rendered HTML kept beside it. List items get\n * `data-md-item`, table rows `data-md-row`, mapped the same way.\n *\n * On output, a block whose elements still serialise to the snapshot is\n * emitted from its source slice, exactly. Only changed or new blocks are\n * serialised from the DOM, and the source between two blocks that are still\n * neighbours (blank lines, link reference definitions, HTML comments) is\n * emitted verbatim, as is the text after the last block.\n *\n * Chromium clones the element it splits on Enter, attributes included, so a\n * tag can appear twice; the FIRST copy that still matches its snapshot owns\n * the source, and any other copy is treated as new content.\n * ------------------------------------------------------------------------ */\n\nconst BLOCK_ATTR = \"data-md-block\";\nconst ITEM_ATTR = \"data-md-item\";\nconst ROW_ATTR = \"data-md-row\";\n\ninterface SourceList {\n bullet: string;\n delimiter: string;\n loose: boolean;\n /** Each item's source, trailing newlines excluded. */\n items: string[];\n /** itemGaps[k]: the source between item k and item k + 1. */\n itemGaps: string[];\n itemSnapshots: string[];\n}\n\ninterface SourceTable {\n /** The table's source lines: header, alignment row, then one per body row. */\n lines: string[];\n columns: number;\n /** Snapshot per source line index (0 = header, 2.. = body rows). */\n rowSnapshots: Map<number, string>;\n}\n\ninterface SourceBlock {\n /** The block's source, trailing newlines excluded. */\n raw: string;\n /** Concatenated outerHTML of the block's rendered elements, as seeded. */\n snapshot: string;\n elementCount: number;\n list?: SourceList;\n table?: SourceTable;\n}\n\n/** The original source of a markdown document, mapped to the blocks rendered from it. */\nexport interface MarkdownSource {\n /** Source before the first block. */\n leading: string;\n blocks: SourceBlock[];\n /** gaps[i]: the source between block i and block i + 1, or the end of the document. */\n gaps: string[];\n}\n\nfunction stripTrailingNewlines(text: string): string {\n return text.replace(/\\n+$/, \"\");\n}\n\nfunction indexAttr(el: Element, attr: string, size: number): number | undefined {\n const value = el.getAttribute(attr);\n if (value == null || !/^\\d+$/.test(value)) return undefined;\n const n = Number(value);\n return n < size ? n : undefined;\n}\n\n/**\n * Render markdown for the Editor, tagging each block with its source.\n * Returns `source: null` (plain rendering) when the source cannot be mapped\n * exactly: no DOM, or `\\r` line endings, which the lexer normalises away.\n */\nexport function markdownToEditorHtml(\n md: string,\n sanitize: (html: string) => string = (html) => html,\n): { html: string; source: MarkdownSource | null } {\n const plain = () => ({\n html: sanitize((marked.parse(md, { async: false }) as string).trim()),\n source: null,\n });\n if (typeof document === \"undefined\" || md.includes(\"\\r\")) return plain();\n\n const tokens = marked.lexer(md);\n const parts: string[] = [];\n const spans: { start: number; end: number; token: Token }[] = [];\n let cursor = 0;\n for (const token of tokens) {\n if (token.type === \"space\") continue;\n const at = md.indexOf(token.raw, cursor);\n if (at < 0) return plain();\n cursor = at + token.raw.length;\n\n const template = document.createElement(\"template\");\n template.innerHTML = marked.parser([token]);\n let nodes = Array.from(template.content.childNodes);\n const strayText = nodes.some((n) => n.nodeType === 3 && (n.textContent ?? \"\").trim() !== \"\");\n if (!nodes.some(isElement) && !strayText) {\n // Renders nothing visible (an HTML comment): its source stays in the gap.\n parts.push(template.innerHTML.trim());\n continue;\n }\n if (strayText) {\n const wrapper = document.createElement(\"div\");\n wrapper.append(...nodes);\n template.content.append(wrapper);\n nodes = [wrapper];\n }\n const id = spans.length;\n const elements = nodes.filter(isElement);\n for (const el of elements) el.setAttribute(BLOCK_ATTR, String(id));\n if (token.type === \"list\" && elements.length === 1) {\n const items = Array.from(elements[0]!.children).filter((c) => tagOf(c) === \"li\");\n if (items.length === (token as Tokens.List).items.length) {\n items.forEach((li, k) => li.setAttribute(ITEM_ATTR, String(k)));\n }\n }\n if (token.type === \"table\" && elements.length === 1) {\n const rows = tableRows(elements[0]!);\n if (rows.length === (token as Tokens.Table).rows.length + 1) {\n rows.forEach((tr, i) => tr.setAttribute(ROW_ATTR, String(i === 0 ? 0 : i + 1)));\n }\n }\n parts.push(template.innerHTML.trim());\n spans.push({ start: at, end: at + stripTrailingNewlines(token.raw).length, token });\n }\n\n const html = sanitize(parts.join(\"\\n\"));\n if (spans.length === 0) return { html, source: null };\n\n // Snapshot what the DOM will actually hold — after sanitising.\n const seeded = document.createElement(\"template\");\n seeded.innerHTML = html;\n const byId = new Map<number, Element[]>();\n for (const node of Array.from(seeded.content.childNodes)) {\n if (!isElement(node)) continue;\n const id = indexAttr(node, BLOCK_ATTR, spans.length);\n if (id === undefined) continue;\n byId.set(id, [...(byId.get(id) ?? []), node]);\n }\n\n const blocks: SourceBlock[] = spans.map((span, id) => {\n const elements = byId.get(id) ?? [];\n const block: SourceBlock = {\n raw: md.slice(span.start, span.end),\n snapshot: elements.map((el) => el.outerHTML).join(\"\"),\n elementCount: elements.length,\n };\n if (span.token.type === \"list\" && elements.length === 1) {\n block.list = sourceList(md, span.start, span.token as Tokens.List, elements[0]!);\n }\n if (span.token.type === \"table\" && elements.length === 1) {\n block.table = sourceTable(block.raw, span.token as Tokens.Table, elements[0]!);\n }\n return block;\n });\n const gaps = spans.map((span, i) => md.slice(span.end, spans[i + 1]?.start ?? md.length));\n return { html, source: { leading: md.slice(0, spans[0]!.start), blocks, gaps } };\n}\n\nfunction sourceList(md: string, start: number, token: Tokens.List, list: Element): SourceList | undefined {\n const lis = Array.from(list.children).filter((c) => tagOf(c) === \"li\");\n if (lis.length !== token.items.length || lis.length === 0) return undefined;\n const items: string[] = [];\n const bounds: [number, number][] = [];\n let cursor = start;\n for (const item of token.items) {\n const at = md.indexOf(item.raw, cursor);\n if (at < 0) return undefined;\n const body = stripTrailingNewlines(item.raw);\n items.push(body);\n bounds.push([at, at + body.length]);\n cursor = at + item.raw.length;\n }\n const itemGaps = bounds.slice(0, -1).map(([, end], k) => md.slice(end, bounds[k + 1]![0]));\n const first = items[0]!;\n return {\n bullet: /^\\s*([*+-])/.exec(first)?.[1] ?? \"-\",\n delimiter: /^\\s*\\d+([.)])/.exec(first)?.[1] ?? \".\",\n loose: token.loose,\n items,\n itemGaps,\n itemSnapshots: lis.map((li) => li.outerHTML),\n };\n}\n\nfunction sourceTable(raw: string, token: Tokens.Table, table: Element): SourceTable | undefined {\n const lines = raw.split(\"\\n\");\n const rows = tableRows(table);\n if (lines.length !== rows.length + 1) return undefined;\n const rowSnapshots = new Map<number, string>();\n for (const tr of rows) {\n const r = indexAttr(tr, ROW_ATTR, lines.length);\n if (r !== undefined) rowSnapshots.set(r, tr.outerHTML);\n }\n return { lines, columns: token.header.length, rowSnapshots };\n}\n\ntype Piece = { text: string; id?: number; kind: Block[\"kind\"] };\n\nfunction outerHtmlOf(nodes: readonly Node[]): string {\n return nodes.filter(isElement).map((el) => el.outerHTML).join(\"\");\n}\n\nfunction serializeWithSource(root: Node, src: MarkdownSource): string {\n // 1. Group the top-level nodes: runs sharing one block tag, and runs of untagged content.\n type Segment = { id?: number; nodes: Node[] };\n const segments: Segment[] = [];\n for (const node of Array.from(root.childNodes)) {\n const last = segments[segments.length - 1];\n if (node.nodeType === 3 && (node.textContent ?? \"\").trim() === \"\") {\n if (last && last.id === undefined) last.nodes.push(node);\n continue;\n }\n const id = isElement(node) ? indexAttr(node, BLOCK_ATTR, src.blocks.length) : undefined;\n if (last && last.id === id) last.nodes.push(node);\n else segments.push({ id, nodes: [node] });\n }\n\n // 2. The first segment per block that still matches its snapshot owns the source.\n const verbatim = new Map<number, number>();\n segments.forEach((seg, i) => {\n if (seg.id === undefined || verbatim.has(seg.id)) return;\n if (outerHtmlOf(seg.nodes) === src.blocks[seg.id]!.snapshot) verbatim.set(seg.id, i);\n });\n\n // 3. One piece per output block.\n const pieces: Piece[] = [];\n const owned = new Set<number>(verbatim.keys());\n const fresh = (nodes: readonly Node[]) => {\n for (const b of collectBlocks(nodes)) pieces.push({ text: b.text, kind: b.kind });\n };\n segments.forEach((seg, i) => {\n if (seg.id === undefined) return fresh(seg.nodes);\n const id = seg.id;\n const block = src.blocks[id]!;\n if (verbatim.get(id) === i) return void pieces.push({ text: block.raw, id, kind: \"block\" });\n if (owned.has(id)) return fresh(seg.nodes);\n owned.add(id);\n if (block.elementCount === 1) {\n // Enter at the edge of a block: the original survives whole beside its clone.\n const j = seg.nodes.findIndex((n) => isElement(n) && n.outerHTML === block.snapshot);\n if (j >= 0) {\n fresh(seg.nodes.slice(0, j));\n pieces.push({ text: block.raw, id, kind: \"block\" });\n fresh(seg.nodes.slice(j + 1));\n return;\n }\n }\n pieces.push({ text: serializeChangedBlock(seg.nodes, block), id, kind: \"block\" });\n });\n if (pieces.length === 0) return \"\";\n\n // 4. Join, reusing the original source between blocks that are still neighbours.\n const used = new Set<number>();\n const hasContent = (gap: string) => gap.trim() !== \"\";\n const separator = (a: Piece, b: Piece): string => {\n if (a.id !== undefined && b.id === a.id + 1) {\n used.add(a.id);\n return src.gaps[a.id]!;\n }\n const fallback = a.kind === \"div\" || b.kind === \"div\" ? \"\\n\" : \"\\n\\n\";\n if (a.id === undefined || used.has(a.id)) return fallback;\n // Blocks between a and b were deleted: keep any definitions or comments they sat beside.\n const upto = b.id !== undefined && b.id > a.id ? b.id : a.id + 1;\n const range: number[] = [];\n for (let g = a.id; g < upto; g++) if (!used.has(g)) range.push(g);\n for (const g of range) used.add(g);\n const kept = range.map((g) => src.gaps[g]!).filter(hasContent).map((g) => g.trim());\n if (kept.length > 0) return `\\n\\n${kept.join(\"\\n\\n\")}\\n\\n`;\n const own = src.gaps[a.id]!;\n return (own.match(/\\n/g)?.length ?? 0) >= 2 ? own : fallback;\n };\n\n let out = src.leading;\n pieces.forEach((piece, i) => {\n if (i > 0) out += separator(pieces[i - 1]!, piece);\n out += piece.text;\n });\n\n const lastId = src.blocks.length - 1;\n const trailing = src.gaps[lastId]!;\n if (pieces[pieces.length - 1]!.id === lastId && !used.has(lastId)) {\n used.add(lastId);\n out += trailing;\n } else {\n const orphans = src.gaps\n .filter((gap, g) => !used.has(g) && hasContent(gap))\n .map((gap) => gap.trim());\n if (orphans.length > 0) out += `\\n\\n${orphans.join(\"\\n\\n\")}`;\n out += /\\s*$/.exec(trailing)![0];\n }\n return out;\n}\n\nfunction serializeChangedBlock(nodes: readonly Node[], block: SourceBlock): string {\n const elements = nodes.filter(isElement);\n if (elements.length === 1) {\n const el = elements[0]!;\n const tag = tagOf(el);\n if (block.list && (tag === \"ul\" || tag === \"ol\")) return serializeListWithSource(el, block.list);\n if (block.table && tag === \"table\") return serializeTableWithSource(el, block.table);\n }\n return joinBlocks(collectBlocks(nodes));\n}\n\n/**\n * A changed list: untouched items keep their source; changed and new items\n * are serialised with the list's original marker. Between two items that are\n * still neighbours the original separator is kept; elsewhere the separator\n * last used in the list is repeated.\n */\nfunction serializeListWithSource(list: Element, info: SourceList): string {\n const ordered = tagOf(list) === \"ol\";\n const children = Array.from(list.children);\n const verbatim = new Map<number, Element>();\n for (const li of children) {\n if (tagOf(li) !== \"li\") continue;\n const k = indexAttr(li, ITEM_ATTR, info.items.length);\n if (k !== undefined && !verbatim.has(k) && li.outerHTML === info.itemSnapshots[k]) verbatim.set(k, li);\n }\n const owned = new Set<number>(verbatim.keys());\n const out: { text: string; k?: number }[] = [];\n let num = ordered ? (Number.parseInt(list.getAttribute(\"start\") ?? \"1\", 10) || 1) - 1 : 0;\n const numberOf = (k: number) => Number(/^\\s*(\\d+)/.exec(info.items[k]!)?.[1] ?? Number.NaN);\n for (const child of children) {\n const tag = tagOf(child);\n if (tag === \"ul\" || tag === \"ol\") {\n const nested = indent(serializeList(child), ordered ? 3 : 2);\n if (out.length > 0) out[out.length - 1]!.text += `\\n${nested}`;\n else out.push({ text: nested });\n continue;\n }\n if (tag !== \"li\") continue;\n const k = indexAttr(child, ITEM_ATTR, info.items.length);\n if (k !== undefined && verbatim.get(k) === child) {\n if (ordered && !Number.isNaN(numberOf(k))) num = numberOf(k);\n out.push({ text: info.items[k]!, k });\n continue;\n }\n const mine = k !== undefined && !owned.has(k) ? k : undefined;\n if (mine !== undefined) owned.add(mine);\n num = ordered && mine !== undefined && !Number.isNaN(numberOf(mine)) ? numberOf(mine) : num + 1;\n const marker = ordered ? `${num}${info.delimiter} ` : `${info.bullet} `;\n out.push({\n text: `${marker}${indent(serializeListItem(child), marker.length, true)}`.replace(/[ \\t]+$/, \"\"),\n k: mine,\n });\n }\n let last: string | undefined;\n let text = \"\";\n out.forEach((item, i) => {\n if (i > 0) {\n const prev = out[i - 1]!;\n const sep =\n prev.k !== undefined && item.k === prev.k + 1\n ? info.itemGaps[prev.k]!\n : (last ?? info.itemGaps[0] ?? (info.loose ? \"\\n\\n\" : \"\\n\"));\n last = sep;\n text += sep;\n }\n text += item.text;\n });\n return text;\n}\n\n/**\n * A changed table: untouched rows keep their source line, the alignment row\n * is kept while the column count is unchanged, edited and new rows are\n * serialised as GFM rows.\n */\nfunction serializeTableWithSource(table: Element, info: SourceTable): string {\n const rows = tableRows(table);\n if (rows.length === 0) return \"\";\n const claimed = new Set<number>();\n const lines: string[] = [];\n rows.forEach((tr, i) => {\n const r = indexAttr(tr, ROW_ATTR, info.lines.length);\n if (r !== undefined && r !== 1 && !claimed.has(r) && tr.outerHTML === info.rowSnapshots.get(r)) {\n claimed.add(r);\n lines.push(info.lines[r]!);\n } else {\n lines.push(serializeTableRow(tr));\n }\n if (i === 0) {\n lines.push(tableCells(tr).length === info.columns ? info.lines[1]! : tableDelimiterRow(tr));\n }\n });\n return lines.join(\"\\n\");\n}\n\ntype Block = { kind: \"block\" | \"div\" | \"inline\"; text: string; tag?: string };\n\nconst BLOCK_TAGS = new Set([\n \"address\", \"article\", \"aside\", \"blockquote\", \"details\", \"dialog\", \"div\", \"dl\",\n \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\", \"h1\", \"h2\", \"h3\", \"h4\",\n \"h5\", \"h6\", \"header\", \"hgroup\", \"hr\", \"li\", \"main\", \"nav\", \"ol\", \"p\", \"pre\",\n \"section\", \"table\", \"ul\",\n]);\n\nfunction isElement(node: Node): node is Element {\n return node.nodeType === 1;\n}\n\nfunction tagOf(node: Node): string {\n return isElement(node) ? node.tagName.toLowerCase() : \"\";\n}\n\nfunction isCustomTag(tag: string): boolean {\n return tag !== \"\" && !STANDARD_HTML_TAGS.has(tag);\n}\n\nfunction isBlockNode(node: Node): boolean {\n return isElement(node) && BLOCK_TAGS.has(tagOf(node));\n}\n\n/** Split a node's children (or a list of sibling nodes) into blocks, serialising each. */\nfunction collectBlocks(parent: Node | readonly Node[]): Block[] {\n const blocks: Block[] = [];\n let run: Node[] = [];\n const flush = () => {\n if (run.length === 0) return;\n const text = serializeInlineRun(run);\n run = [];\n if (text.trim() !== \"\") blocks.push({ kind: \"inline\", text });\n };\n const nodes = Array.isArray(parent) ? parent : Array.from((parent as Node).childNodes);\n for (const child of nodes) {\n if (isBlockNode(child)) {\n flush();\n const el = child as Element;\n const tag = tagOf(el);\n blocks.push({ kind: tag === \"div\" ? \"div\" : \"block\", text: serializeBlock(el), tag });\n } else {\n run.push(child);\n }\n }\n flush();\n return blocks;\n}\n\n/**\n * Join blocks: a blank line between real blocks; a single newline next to a\n * `<div>`, which is the line contentEditable makes when Enter is pressed\n * outside any paragraph.\n */\nfunction joinBlocks(blocks: Block[]): string {\n let out = \"\";\n blocks.forEach((b, i) => {\n if (i > 0) {\n const prev = blocks[i - 1]!;\n out += prev.kind === \"div\" || b.kind === \"div\" ? \"\\n\" : \"\\n\\n\";\n }\n out += b.text;\n });\n return out;\n}\n\nfunction serializeBlocks(parent: Node): string {\n return joinBlocks(collectBlocks(parent));\n}\n\nfunction serializeBlock(el: Element): string {\n const tag = tagOf(el);\n switch (tag) {\n case \"h1\":\n case \"h2\":\n case \"h3\":\n case \"h4\":\n case \"h5\":\n case \"h6\":\n return `${\"#\".repeat(Number(tag[1]))} ${serializeInline(el).trim()}`;\n case \"p\":\n case \"div\":\n return trimEdgeNewlines(serializeInline(el, true));\n case \"ul\":\n case \"ol\":\n return serializeList(el);\n case \"pre\":\n return serializePre(el);\n case \"blockquote\":\n return serializeBlocks(el)\n .split(\"\\n\")\n .map((line) => (line === \"\" ? \">\" : `> ${line}`))\n .join(\"\\n\");\n case \"hr\":\n return \"---\";\n case \"table\":\n return serializeTable(el);\n default:\n return serializeBlocks(el);\n }\n}\n\n/** The rows of a table, in document order, excluding rows of nested tables. */\nfunction tableRows(table: Element): Element[] {\n return Array.from(table.querySelectorAll(\"tr\")).filter((tr) => tr.closest(\"table\") === table);\n}\n\nfunction tableCells(tr: Element): Element[] {\n return Array.from(tr.children).filter((c) => tagOf(c) === \"td\" || tagOf(c) === \"th\");\n}\n\n/**\n * A cell's inline content on one line. GFM cells cannot hold a line break, so\n * a typed one becomes a literal `<br>`; every `|` is escaped, including inside\n * code spans, which is how GFM spells a pipe in a cell.\n */\nfunction serializeTableCell(cell: Element): string {\n const children = Array.from(cell.childNodes);\n while (children.length > 0 && tagOf(children[children.length - 1]!) === \"br\") children.pop();\n return children\n .map((n) => (tagOf(n) === \"br\" ? \"<br>\" : serializeInlineNode(n)))\n .join(\"\")\n .replace(/\\n/g, \" \")\n .replace(/\\|/g, \"\\\\|\")\n .trim();\n}\n\nfunction serializeTableRow(tr: Element): string {\n return `| ${tableCells(tr).map(serializeTableCell).join(\" | \")} |`;\n}\n\nfunction tableDelimiterRow(header: Element): string {\n const marks = tableCells(header).map((cell) => {\n const align = cell.getAttribute(\"align\") || (cell as HTMLElement).style?.textAlign || \"\";\n if (align === \"left\") return \":---\";\n if (align === \"center\") return \":---:\";\n if (align === \"right\") return \"---:\";\n return \"---\";\n });\n return `| ${marks.join(\" | \")} |`;\n}\n\n/** A GFM table: header row, alignment row, body rows. */\nfunction serializeTable(table: Element): string {\n const rows = tableRows(table);\n if (rows.length === 0) return \"\";\n const lines = rows.map(serializeTableRow);\n lines.splice(1, 0, tableDelimiterRow(rows[0]!));\n return lines.join(\"\\n\");\n}\n\nfunction serializePre(el: Element): string {\n const code = el.querySelector(\"code\");\n const lang = /(?:^|\\s)language-(\\S+)/.exec(code?.getAttribute(\"class\") ?? \"\")?.[1] ?? \"\";\n const text = (code ?? el).textContent ?? \"\";\n return `\\`\\`\\`${lang}\\n${text.replace(/\\n$/, \"\")}\\n\\`\\`\\``;\n}\n\nfunction serializeList(list: Element): string {\n const ordered = tagOf(list) === \"ol\";\n let n = ordered ? Number.parseInt(list.getAttribute(\"start\") ?? \"1\", 10) || 1 : 0;\n const items = Array.from(list.children);\n // marked wraps item text in <p> only when the list is loose.\n const loose = items.some(\n (li) => tagOf(li) === \"li\" && Array.from(li.children).some((c) => tagOf(c) === \"p\"),\n );\n const out: string[] = [];\n for (const item of items) {\n const tag = tagOf(item);\n if (tag === \"ul\" || tag === \"ol\") {\n // A list nested directly in a list (contentEditable's indent) belongs\n // to the item before it.\n const nested = indent(serializeList(item), ordered ? 3 : 2);\n if (out.length > 0) out[out.length - 1] += `\\n${nested}`;\n else out.push(nested);\n continue;\n }\n if (tag !== \"li\") continue;\n const marker = ordered ? `${n++}. ` : \"- \";\n out.push(`${marker}${indent(serializeListItem(item), marker.length, true)}`.replace(/[ \\t]+$/, \"\"));\n }\n return out.join(loose ? \"\\n\\n\" : \"\\n\");\n}\n\n/** An item's content: a nested list sits on the next line, other blocks after a blank line. */\nfunction serializeListItem(li: Element): string {\n const blocks = collectBlocks(li);\n let out = \"\";\n blocks.forEach((b, i) => {\n if (i > 0) out += b.tag === \"ul\" || b.tag === \"ol\" ? \"\\n\" : \"\\n\\n\";\n out += b.text;\n });\n return out;\n}\n\n/** Indent every non-empty line (optionally skipping the first) by `width` spaces. */\nfunction indent(text: string, width: number, skipFirst = false): string {\n const pad = \" \".repeat(width);\n return text\n .split(\"\\n\")\n .map((line, i) => (line === \"\" || (skipFirst && i === 0) ? line : pad + line))\n .join(\"\\n\");\n}\n\nfunction trimEdgeNewlines(text: string): string {\n return text.replace(/^\\n+/, \"\").replace(/\\n+$/, \"\");\n}\n\nfunction serializeInlineRun(nodes: Node[]): string {\n return trimEdgeNewlines(nodes.map((n) => serializeInlineNode(n)).join(\"\"));\n}\n\n/**\n * Serialise an element's children as inline content. In a block, a trailing\n * `<br>` is the placeholder contentEditable keeps in an empty line, not a\n * line break the person typed.\n */\nfunction serializeInline(el: Element, dropTrailingBr = false): string {\n const children = Array.from(el.childNodes);\n if (dropTrailingBr) {\n while (children.length > 0) {\n const last = children[children.length - 1]!;\n if (tagOf(last) === \"br\") children.pop();\n else break;\n }\n }\n return children.map((n) => serializeInlineNode(n)).join(\"\");\n}\n\nfunction serializeInlineNode(node: Node): string {\n if (node.nodeType === 3) return (node.textContent ?? \"\").replace(/ /g, \" \");\n if (!isElement(node)) return \"\";\n const tag = tagOf(node);\n if (isCustomTag(tag)) return node.outerHTML;\n if (BLOCK_TAGS.has(tag)) return serializeBlock(node);\n const inner = () => serializeInline(node);\n switch (tag) {\n case \"br\":\n return \"\\n\";\n case \"strong\":\n case \"b\":\n return `**${inner()}**`;\n case \"em\":\n case \"i\":\n return `*${inner()}*`;\n case \"s\":\n case \"strike\":\n case \"del\":\n return `~~${inner()}~~`;\n case \"code\":\n return `\\`${node.textContent ?? \"\"}\\``;\n case \"a\": {\n const href = node.getAttribute(\"href\");\n if (href == null) return inner();\n const title = node.getAttribute(\"title\");\n return `[${inner()}](${href}${title ? ` \"${title}\"` : \"\"})`;\n }\n case \"img\": {\n const title = node.getAttribute(\"title\");\n return ` ?? \"\"}${title ? ` \"${title}\"` : \"\"})`;\n }\n default:\n return inner();\n }\n}\n\n/** String-rewrite converter, kept only for environments with no DOM. */\nfunction legacyHtmlToMarkdown(html: string): string {\n let md = html;\n\n // Block elements first\n md = md.replace(/<h1[^>]*>(.*?)<\\/h1>/gi, \"# $1\\n\");\n md = md.replace(/<h2[^>]*>(.*?)<\\/h2>/gi, \"## $1\\n\");\n md = md.replace(/<h3[^>]*>(.*?)<\\/h3>/gi, \"### $1\\n\");\n md = md.replace(/<h4[^>]*>(.*?)<\\/h4>/gi, \"#### $1\\n\");\n md = md.replace(/<h5[^>]*>(.*?)<\\/h5>/gi, \"##### $1\\n\");\n md = md.replace(/<h6[^>]*>(.*?)<\\/h6>/gi, \"###### $1\\n\");\n\n // Lists\n md = md.replace(/<li[^>]*>(.*?)<\\/li>/gi, \"- $1\\n\");\n md = md.replace(/<\\/?[uo]l[^>]*>/gi, \"\\n\");\n\n // Inline formatting\n md = md.replace(/<strong[^>]*>(.*?)<\\/strong>/gi, \"**$1**\");\n md = md.replace(/<b[^>]*>(.*?)<\\/b>/gi, \"**$1**\");\n md = md.replace(/<em[^>]*>(.*?)<\\/em>/gi, \"*$1*\");\n md = md.replace(/<i[^>]*>(.*?)<\\/i>/gi, \"*$1*\");\n md = md.replace(/<u[^>]*>(.*?)<\\/u>/gi, \"$1\");\n md = md.replace(/<s[^>]*>(.*?)<\\/s>/gi, \"~~$1~~\");\n md = md.replace(/<strike[^>]*>(.*?)<\\/strike>/gi, \"~~$1~~\");\n md = md.replace(/<del[^>]*>(.*?)<\\/del>/gi, \"~~$1~~\");\n md = md.replace(/<code[^>]*>(.*?)<\\/code>/gi, \"`$1`\");\n\n // Links\n md = md.replace(/<a[^>]*href=\"([^\"]*)\"[^>]*>(.*?)<\\/a>/gi, \"[$2]($1)\");\n\n // Blockquotes\n md = md.replace(/<blockquote[^>]*>(.*?)<\\/blockquote>/gi, \"> $1\\n\");\n\n // Line breaks and paragraphs\n md = md.replace(/<br\\s*\\/?>/gi, \"\\n\");\n md = md.replace(/<p[^>]*>(.*?)<\\/p>/gi, \"$1\\n\\n\");\n md = md.replace(/<div[^>]*>(.*?)<\\/div>/gi, \"$1\\n\");\n\n // Strip only standard HTML tags — preserve unknown/custom tags\n md = md.replace(/<\\/?([a-z][a-z0-9]*)\\b[^>]*>/gi, (match, tagName: string) => {\n return STANDARD_HTML_TAGS.has(tagName.toLowerCase()) ? \"\" : match;\n });\n\n // Decode common HTML entities. Decode & LAST so we never double-unescape:\n // e.g. \"&lt;\" must decode to the literal \"<\", not to \"<\".\n md = md.replace(/</g, \"<\");\n md = md.replace(/>/g, \">\");\n md = md.replace(/"/g, '\"');\n md = md.replace(/'/g, \"'\");\n md = md.replace(/ /g, \" \");\n md = md.replace(/&/g, \"&\");\n\n // Clean up extra whitespace\n md = md.replace(/\\n{3,}/g, \"\\n\\n\");\n md = md.trim();\n\n return md;\n}\n\n/**\n * Generate CSS classes to visually distinguish custom extension tags\n * inside the contentEditable area. Returns Tailwind-style descendant selectors.\n */\nexport function extensionEditorClasses(extensions: RenderExtension[]): string {\n if (extensions.length === 0) return \"\";\n\n return extensions\n .map((ext) => {\n const tag = ext.tag.toLowerCase();\n return [\n `[&_${tag}]:block`,\n `[&_${tag}]:my-2`,\n `[&_${tag}]:rounded-lg`,\n `[&_${tag}]:border`,\n `[&_${tag}]:border-dashed`,\n `[&_${tag}]:border-zinc-300`,\n `[&_${tag}]:bg-zinc-50`,\n `[&_${tag}]:p-3`,\n `[&_${tag}]:text-xs`,\n `dark:[&_${tag}]:border-zinc-600`,\n `dark:[&_${tag}]:bg-zinc-800/50`,\n ].join(\" \");\n })\n .join(\" \");\n}\n","import { useMemo } from \"react\";\nimport { sanitizeHtml } from \"../../utils/sanitize\";\nimport type { RenderExtension } from \"./extensions\";\nimport { parseSegments, mergeExtensions } from \"./extensions\";\n\ninterface RenderedContentProps {\n html: string;\n extensions?: RenderExtension[];\n /**\n * If true, html is rendered as-is without per-segment sanitization. Caller\n * (ContentRenderer) is expected to have already sanitized — or explicitly\n * opted out — at the top level.\n */\n unsafe?: boolean;\n}\n\n/**\n * Internal component that renders an HTML string with extension support.\n * Plain HTML segments use dangerouslySetInnerHTML; custom-tag segments\n * are rendered via their registered React component.\n */\nexport function RenderedContent({\n html,\n extensions: instanceExtensions,\n unsafe = false,\n}: RenderedContentProps) {\n const extensions = useMemo(\n () => mergeExtensions(instanceExtensions),\n [instanceExtensions],\n );\n\n const segments = useMemo(\n () => parseSegments(html, extensions),\n [html, extensions],\n );\n\n const renderHtml = (content: string): string =>\n unsafe ? content : sanitizeHtml(content);\n\n // Fast path: no extensions matched — single dangerouslySetInnerHTML\n if (segments.length === 1 && segments[0].type === \"html\") {\n return <div dangerouslySetInnerHTML={{ __html: renderHtml(segments[0].content) }} />;\n }\n\n // No content at all\n if (segments.length === 0) {\n return null;\n }\n\n return (\n <>\n {segments.map((segment, i) => {\n if (segment.type === \"html\") {\n return segment.content ? (\n <div key={i} dangerouslySetInnerHTML={{ __html: renderHtml(segment.content) }} />\n ) : null;\n }\n\n const ext = extensions.find(\n (e) => e.tag.toLowerCase() === segment.tag,\n );\n if (!ext) return null;\n\n const Component = ext.component;\n const isBlock = ext.block !== false;\n const Wrapper = isBlock ? \"div\" : \"span\";\n\n return (\n <Wrapper key={i} data-render-extension={segment.tag}>\n <Component content={segment.content} attributes={segment.attributes} />\n </Wrapper>\n );\n })}\n </>\n );\n}\n\nRenderedContent.displayName = \"RenderedContent\";\n","import { useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { markdownToRawHtml } from \"../../utils/markdown\";\nimport { sanitizeHtml } from \"../../utils/sanitize\";\nimport { proseClasses, detectFormat } from \"../Editor/editor.utils\";\nimport { mergeExtensions } from \"./extensions\";\nimport { RenderedContent } from \"./RenderedContent\";\nimport type { ContentRendererProps } from \"./ContentRenderer.types\";\n\nexport function ContentRenderer({\n value,\n format = \"auto\",\n lineSpacing = 1.6,\n className,\n extensions: instanceExtensions,\n unsafe = false,\n}: ContentRendererProps) {\n const extensions = useMemo(\n () => mergeExtensions(instanceExtensions),\n [instanceExtensions],\n );\n\n const html = useMemo(() => {\n // Guard nullish input: marked.parse throws \"input parameter is undefined\n // or null\", which (inside this useMemo during render) would crash the whole\n // React tree. Treat missing content as empty.\n const safe = value ?? \"\";\n const resolvedFormat = format === \"auto\" ? detectFormat(safe) : format;\n const raw = resolvedFormat === \"markdown\" ? markdownToRawHtml(safe) : safe;\n return unsafe ? raw : sanitizeHtml(raw);\n }, [value, format, unsafe]);\n\n const hasExtensions = extensions.length > 0;\n\n return (\n <div\n data-react-fancy-content-renderer=\"\"\n style={{ lineHeight: lineSpacing }}\n className={cn(\"text-sm\", proseClasses, className)}\n >\n {hasExtensions ? (\n <RenderedContent html={html} extensions={extensions} unsafe={unsafe} />\n ) : (\n <div dangerouslySetInnerHTML={{ __html: html }} />\n )}\n </div>\n );\n}\n\nContentRenderer.displayName = \"ContentRenderer\";\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mergeExtensions, htmlToMarkdown, ContentRenderer, extensionEditorClasses, proseClasses, detectFormat } from './chunk-
|
|
1
|
+
import { mergeExtensions, htmlToMarkdown, ContentRenderer, extensionEditorClasses, proseClasses, detectFormat, markdownToEditorHtml } from './chunk-L24LUSEE.js';
|
|
2
2
|
import { CodeView } from './chunk-FBWUXSKH.js';
|
|
3
3
|
import { useFieldMode } from './chunk-NRXK42LO.js';
|
|
4
4
|
import { sanitizeHtml } from './chunk-6TBRBN7H.js';
|
|
@@ -170,13 +170,12 @@ function EditorContent({ className, maxHeight, sourceClassName }) {
|
|
|
170
170
|
}
|
|
171
171
|
EditorContent.displayName = "EditorContent";
|
|
172
172
|
function toHtml(value, outputFormat, unsafe, valueFormat = "auto") {
|
|
173
|
-
if (!value) return "";
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
})();
|
|
179
|
-
return unsafe ? raw : sanitizeHtml(raw);
|
|
173
|
+
if (!value) return { html: "", source: null };
|
|
174
|
+
const sanitize = (html) => unsafe ? html : sanitizeHtml(html);
|
|
175
|
+
const format = valueFormat !== "auto" ? valueFormat : outputFormat === "html" ? "html" : detectFormat(value);
|
|
176
|
+
if (format === "html") return { html: sanitize(value), source: null };
|
|
177
|
+
if (outputFormat === "markdown") return markdownToEditorHtml(value, sanitize);
|
|
178
|
+
return { html: sanitize(marked.parse(value, { async: false }).trim()), source: null };
|
|
180
179
|
}
|
|
181
180
|
function EditorRoot({
|
|
182
181
|
children,
|
|
@@ -209,7 +208,7 @@ function EditorRoot({
|
|
|
209
208
|
useEffect(() => {
|
|
210
209
|
if (value !== lastEmitted.current) setExternalSeed((n) => n + 1);
|
|
211
210
|
}, [value]);
|
|
212
|
-
const
|
|
211
|
+
const seed = useMemo(
|
|
213
212
|
() => toHtml(value, outputFormat, unsafe, valueFormat),
|
|
214
213
|
// Seed the contentEditable from the LIVE value when (re)entering edit mode —
|
|
215
214
|
// and when returning from the raw-source view, which may have rewritten the
|
|
@@ -219,15 +218,17 @@ function EditorRoot({
|
|
|
219
218
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
220
219
|
[isView, outputFormat, unsafe, valueFormat, showSource, externalSeed]
|
|
221
220
|
);
|
|
221
|
+
const initialHtml = seed.html;
|
|
222
|
+
const seedSource = seed.source;
|
|
222
223
|
const extensions = useMemo(
|
|
223
224
|
() => mergeExtensions(instanceExtensions),
|
|
224
225
|
[instanceExtensions]
|
|
225
226
|
);
|
|
226
227
|
const getOutputValue = useCallback(
|
|
227
228
|
(html) => {
|
|
228
|
-
return outputFormat === "markdown" ? htmlToMarkdown(html) : html;
|
|
229
|
+
return outputFormat === "markdown" ? htmlToMarkdown(html, seedSource) : html;
|
|
229
230
|
},
|
|
230
|
-
[outputFormat]
|
|
231
|
+
[outputFormat, seedSource]
|
|
231
232
|
);
|
|
232
233
|
const handleInput = useCallback(() => {
|
|
233
234
|
const el = contentRef.current;
|
|
@@ -340,5 +341,5 @@ var Editor = Object.assign(EditorRoot, {
|
|
|
340
341
|
});
|
|
341
342
|
|
|
342
343
|
export { Editor, useEditor };
|
|
343
|
-
//# sourceMappingURL=chunk-
|
|
344
|
-
//# sourceMappingURL=chunk-
|
|
344
|
+
//# sourceMappingURL=chunk-VD3C7IA4.js.map
|
|
345
|
+
//# sourceMappingURL=chunk-VD3C7IA4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Editor/Editor.context.ts","../src/components/Editor/EditorSourceToggle.tsx","../src/components/Editor/EditorToolbar.tsx","../src/components/Editor/EditorToolbarSeparator.tsx","../src/components/Editor/EditorContent.tsx","../src/components/Editor/Editor.tsx"],"names":["jsx","useRef","useEffect","useMemo"],"mappings":";;;;;;;;;;AA4BO,IAAM,aAAA,GAAgB,cAAyC,IAAI,CAAA;AAEnE,SAAS,SAAA,GAAgC;AAC9C,EAAA,MAAM,GAAA,GAAM,WAAW,aAAa,CAAA;AACpC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,GAAA;AACT;AC3BO,SAAS,kBAAA,CAAmB;AAAA,EACjC,SAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,KAAA,GAAQ,QAAA;AAAA,EACR,WAAA,GAAc;AAChB,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,UAAA,EAAY,aAAA,EAAc,GAAI,SAAA,EAAU;AAEhD,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,MAAM,aAAA,CAAc,CAAC,UAAU,CAAA;AAAA,MACxC,KAAA,EAAO,aAAa,WAAA,GAAc,KAAA;AAAA,MAClC,cAAA,EAAc,UAAA;AAAA,MACd,uCAAA,EAAsC,EAAA;AAAA,MACtC,SAAA,EAAW,EAAA;AAAA,QACT,iGAAA;AAAA,QACA,aACI,qHAAA,GACA,+IAAA;AAAA,QACJ;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAEA,kBAAA,CAAmB,WAAA,GAAc,oBAAA;AChCjC,IAAM,eAAA,GAAkB;AAAA,EACtB,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,SAAS,MAAA,EAAO;AAAA,EAC5C,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,SAAS,QAAA,EAAS;AAAA,EAChD,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,WAAA,EAAa,SAAS,WAAA,EAAY;AAAA,EACtD,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,eAAA,EAAiB,SAAS,eAAA;AAChD,CAAA;AAEO,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA,GAAU,eAAA;AAAA,EACV,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA,GAAmB;AACrB,CAAA,EAAuB;AACrB,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAI,SAAA,EAAU;AAEvC,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,iCAAA,EAAgC,EAAA;AAAA,MAChC,SAAA,EAAW,EAAA;AAAA,QACT,qLAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,sCACC,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YAEL,QAAA,EAAU,UAAA;AAAA,YACV,SAAS,MAAM;AACb,cAAA,IAAI,QAAA,EAAU;AACZ,gBAAA,QAAA,CAAS,OAAO,OAAO,CAAA;AAAA,cACzB,CAAA,MAAO;AACL,gBAAA,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,UAAU,CAAA;AAAA,cACxC;AAAA,YACF,CAAA;AAAA,YACA,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,SAAA,EAAW,EAAA;AAAA,cACT,sFAAA;AAAA,cACA,MAAA,CAAO,SACH,qHAAA,GACA,+IAAA;AAAA,cACJ,UAAA,IAAc;AAAA,aAChB;AAAA,YAEC,QAAA,EAAA,MAAA,CAAO;AAAA,WAAA;AAAA,UApBH,GAAG,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,cAAc,EAAE,CAAA;AAAA,SAsBpD,CAAA;AAAA,QACA,gBAAA,oBAAoBA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,WAAU,SAAA,EAAU;AAAA,OAAA,EAC/D;AAAA;AAAA,GAEJ;AAEJ;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;AC/DrB,SAAS,sBAAA,GAAyB;AACvC,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,2CAAA,EAA0C,EAAA;AAAA,MAC1C,SAAA,EAAU;AAAA;AAAA,GACZ;AAEJ;AAEA,sBAAA,CAAuB,WAAA,GAAc,wBAAA;ACF9B,SAAS,aAAA,CAAc,EAAE,SAAA,EAAW,SAAA,EAAW,iBAAgB,EAAuB;AAC3F,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,MACE,SAAA,EAAU;AAKd,EAAA,MAAM,UAAA,GAAa,OAAsB,IAAI,CAAA;AAE7C,EAAA,SAAA,CAAU,MAAM;AAId,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAK,UAAA,CAAW,OAAA;AACtB,IAAA,IAAI,EAAA,IAAM,UAAA,CAAW,OAAA,KAAY,YAAA,EAAc;AAC7C,MAAA,EAAA,CAAG,SAAA,GAAY,YAAA;AACf,MAAA,UAAA,CAAW,OAAA,GAAU,YAAA;AAAA,IACvB;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,YAAA,EAAc,UAAU,CAAC,CAAA;AAEzC,EAAA,MAAM,UAAA,GAAa,OAAA;AAAA,IACjB,MAAM,uBAAuB,UAAU,CAAA;AAAA,IACvC,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,IAAI,UAAA,EAAY;AAOd,IAAA,uBACEA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,cAAA;AAAA,QACV,QAAA,EAAU,YAAA,KAAiB,MAAA,GAAS,MAAA,GAAS,WAAA;AAAA,QAC7C,WAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,mBAAA,EAAqB,eAAe;AAAA;AAAA,KACpD;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,eAAA,EAAe,IAAA;AAAA,MACf,8BAAA,EAA8B,IAAA;AAAA,MAC9B,iCAAA,EAAgC,EAAA;AAAA,MAChC,kBAAA,EAAkB,WAAA;AAAA,MAClB,OAAA,EAAS,QAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,WAAA;AAAA,QACZ,SAAA,EAAW,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,EAAA,CAAA,GAAO;AAAA,OAC5C;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,wEAAA;AAAA,QACA,oBAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA;AAAA,QACA,2GAAA;AAAA,QACA;AAAA;AACF;AAAA,GACF;AAEJ;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;ACnE5B,SAAS,MAAA,CACP,KAAA,EACA,YAAA,EACA,MAAA,EACA,cAA4C,MAAA,EACtC;AACN,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,QAAQ,IAAA,EAAK;AAC5C,EAAA,MAAM,WAAW,CAAC,IAAA,KAAkB,MAAA,GAAS,IAAA,GAAO,aAAa,IAAI,CAAA;AAIrE,EAAA,MAAM,MAAA,GACJ,gBAAgB,MAAA,GACZ,WAAA,GACA,iBAAiB,MAAA,GACf,MAAA,GACA,aAAa,KAAK,CAAA;AAC1B,EAAA,IAAI,MAAA,KAAW,QAAQ,OAAO,EAAE,MAAM,QAAA,CAAS,KAAK,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAK;AAGpE,EAAA,IAAI,YAAA,KAAiB,UAAA,EAAY,OAAO,oBAAA,CAAqB,OAAO,QAAQ,CAAA;AAC5E,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAU,MAAA,CAAO,MAAM,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA,CAAa,IAAA,EAAM,CAAA,EAAG,QAAQ,IAAA,EAAK;AAClG;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA,EAAO,eAAA;AAAA,EACP,YAAA,GAAe,EAAA;AAAA,EACf,QAAA;AAAA,EACA,YAAA,GAAe,MAAA;AAAA,EACf,WAAA,GAAc,MAAA;AAAA,EACd,WAAA,GAAc,GAAA;AAAA,EACd,WAAA;AAAA,EACA,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY,kBAAA;AAAA,EACZ,MAAA,GAAS,KAAA;AAAA,EACT,UAAA,EAAY,cAAA;AAAA,EACZ,iBAAA,GAAoB,KAAA;AAAA,EACpB;AACF,CAAA,EAAgB;AACd,EAAA,MAAM,UAAA,GAAaC,OAA8B,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAI,oBAAA,CAAqB,eAAA,EAAiB,cAAc,QAAQ,CAAA;AACtF,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,oBAAA;AAAA,IAClC,cAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,IAAA,GAAO,aAAa,QAAQ,CAAA;AAClC,EAAA,MAAM,SAAS,IAAA,KAAS,MAAA;AAKxB,EAAA,MAAM,WAAA,GAAcA,OAAsB,IAAI,CAAA;AAO9C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,CAAC,CAAA;AAClD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,UAAU,WAAA,CAAY,OAAA,kBAAyB,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,EACjE,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,IAAA,GAAOC,OAAAA;AAAA,IACX,MAAM,MAAA,CAAO,KAAA,EAAO,YAAA,EAAc,QAAQ,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOrD,CAAC,MAAA,EAAQ,YAAA,EAAc,MAAA,EAAQ,WAAA,EAAa,YAAY,YAAY;AAAA,GACtE;AACA,EAAA,MAAM,cAAc,IAAA,CAAK,IAAA;AACzB,EAAA,MAAM,aAAa,IAAA,CAAK,MAAA;AAExB,EAAA,MAAM,UAAA,GAAaA,OAAAA;AAAA,IACjB,MAAM,gBAAgB,kBAAkB,CAAA;AAAA,IACxC,CAAC,kBAAkB;AAAA,GACrB;AAEA,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,CAAC,IAAA,KAAyB;AACxB,MAAA,OAAO,YAAA,KAAiB,UAAA,GAAa,cAAA,CAAe,IAAA,EAAM,UAAU,CAAA,GAAI,IAAA;AAAA,IAC1E,CAAA;AAAA,IACA,CAAC,cAAc,UAAU;AAAA,GAC3B;AAEA,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,MAAM,KAAK,UAAA,CAAW,OAAA;AACtB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,IAAA,GAAO,cAAA,CAAe,EAAA,CAAG,SAAS,CAAA;AAGxC,IAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,CAAC,QAAA,EAAU,cAAc,CAAC,CAAA;AAE7B,EAAA,MAAM,IAAA,GAAO,WAAA;AAAA,IACX,CAAC,SAAiB,GAAA,KAAiB;AACjC,MAAA,MAAM,KAAK,UAAA,CAAW,OAAA;AACtB,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,QAAA,CAAS,WAAA,CAAY,OAAA,EAAS,KAAA,EAAO,GAAG,CAAA;AACxC,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,CAAC,IAAA,KAAiB;AAChB,MAAA,MAAM,KAAK,UAAA,CAAW,OAAA;AACtB,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,QAAA,CAAS,WAAA,CAAY,YAAA,EAAc,KAAA,EAAO,IAAI,CAAA;AAC9C,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAIA,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,CAAC,IAAA,KAAiB;AAGhB,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,QAAgB,KAAA,KAAkB;AACjC,MAAA,MAAM,GAAA,GAAM,OAAO,YAAA,EAAa;AAChC,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,UAAA,KAAe,CAAA,EAAG;AAClC,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC9B,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,EAAS;AACpC,MAAA,MAAM,KAAK,UAAA,CAAW,OAAA;AACtB,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,QAAA,CAAS,WAAA,CAAY,cAAc,KAAA,EAAO,CAAA,EAAG,MAAM,CAAA,EAAG,YAAY,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAC5E,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,UAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA,EAAc,WAAA;AAAA,IACd,QAAA,EAAU,WAAA;AAAA,IACV,YAAA,EAAc,KAAA;AAAA,IACd,cAAA,EAAgB;AAAA,GAClB;AAKA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBACEH,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,yBAAA,EAAwB,EAAA;AAAA,QACxB,WAAA,EAAU,MAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,kRAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEA,QAAA,kBAAAA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,MAAA,EAAQ,WAAA,KAAgB,MAAA,GAAS,WAAA,GAAc,YAAA;AAAA,YAC/C,WAAA;AAAA,YACA,UAAA,EAAY,kBAAA;AAAA,YACZ,MAAA;AAAA,YACA,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA,CAAC,aAAA,CAAc,UAAd,EAAuB,KAAA,EAAO,cAC7B,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,yBAAA,EAAwB,EAAA;AAAA,MACxB,WAAA,EAAU,MAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,gSAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAEA,IAAM,oBAAA,GAAuB,MAAA,CAAO,MAAA,CAAO,aAAA,EAAe;AAAA,EACxD,SAAA,EAAW;AACb,CAAC,CAAA;AAEM,IAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY;AAAA,EAC9C,OAAA,EAAS,oBAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,YAAA,EAAc;AAChB,CAAC","file":"chunk-VD3C7IA4.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { RefObject } from \"react\";\nimport type { RenderExtension } from \"../ContentRenderer/extensions\";\n\nexport interface EditorContextValue {\n contentRef: RefObject<HTMLDivElement | null>;\n exec: (command: string, arg?: string) => void;\n insertText: (text: string) => void;\n wrapSelection: (before: string, after: string) => void;\n outputFormat: \"html\" | \"markdown\";\n lineSpacing: number;\n placeholder?: string;\n /** Merged render extensions (global + instance). */\n extensions: RenderExtension[];\n /** Whether the raw-source view (textarea) is showing instead of the rich-text surface. */\n showSource: boolean;\n /** Toggle/set the raw-source view. */\n setShowSource: (showSource: boolean) => void;\n /** Initial HTML content to load into the editor on mount */\n _initialHtml: string;\n /** @internal Called by EditorContent on input events */\n _onInput: () => void;\n /** @internal Raw source value (`value` in `outputFormat`), for the source textarea. */\n _sourceValue: string;\n /** @internal Commit an edit made directly in the source textarea. */\n _onSourceInput: (value: string) => void;\n}\n\nexport const EditorContext = createContext<EditorContextValue | null>(null);\n\nexport function useEditor(): EditorContextValue {\n const ctx = useContext(EditorContext);\n if (!ctx) {\n throw new Error(\"useEditor must be used within an <Editor> component\");\n }\n return ctx;\n}\n","import { cn } from \"../../utils/cn\";\nimport { useEditor } from \"./Editor.context\";\nimport type { EditorSourceToggleProps } from \"./Editor.types\";\n\n/**\n * Toolbar button that reveals the raw HTML/Markdown behind the editor. Reads\n * `showSource` / `setShowSource` from context, so it works in the default\n * toolbar and in any custom toolbar composed with `useEditor()`.\n */\nexport function EditorSourceToggle({\n className,\n icon = \"</>\",\n title = \"Source\",\n activeTitle = \"Rich text\",\n}: EditorSourceToggleProps) {\n const { showSource, setShowSource } = useEditor();\n\n return (\n <button\n type=\"button\"\n onClick={() => setShowSource(!showSource)}\n title={showSource ? activeTitle : title}\n aria-pressed={showSource}\n data-react-fancy-editor-source-toggle=\"\"\n className={cn(\n \"inline-flex h-8 items-center justify-center rounded-md px-2 font-mono text-xs transition-colors\",\n showSource\n ? \"bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n : \"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n className,\n )}\n >\n {icon}\n </button>\n );\n}\n\nEditorSourceToggle.displayName = \"EditorSourceToggle\";\n","import { cn } from \"../../utils/cn\";\nimport { useEditor } from \"./Editor.context\";\nimport { EditorSourceToggle } from \"./EditorSourceToggle\";\nimport type { EditorToolbarProps } from \"./Editor.types\";\n\nconst DEFAULT_ACTIONS = [\n { icon: \"B\", label: \"Bold\", command: \"bold\" },\n { icon: \"I\", label: \"Italic\", command: \"italic\" },\n { icon: \"U\", label: \"Underline\", command: \"underline\" },\n { icon: \"S\", label: \"Strikethrough\", command: \"strikeThrough\" },\n];\n\nexport function EditorToolbar({\n actions = DEFAULT_ACTIONS,\n onAction,\n children,\n className,\n showSourceToggle = true,\n}: EditorToolbarProps) {\n const { exec, showSource } = useEditor();\n\n return (\n <div\n data-react-fancy-editor-toolbar=\"\"\n className={cn(\n \"flex shrink-0 items-center gap-0.5 border-b border-[color:var(--fancy-border,var(--color-zinc-200))] px-2 py-1.5 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n {children ?? (\n <>\n {actions.map((action) => (\n <button\n key={`${action.command}-${action.commandArg ?? \"\"}`}\n type=\"button\"\n // Rich-text commands don't apply to the raw-source textarea.\n disabled={showSource}\n onClick={() => {\n if (onAction) {\n onAction(action.command);\n } else {\n exec(action.command, action.commandArg);\n }\n }}\n title={action.label}\n className={cn(\n \"inline-flex h-8 w-8 items-center justify-center rounded-md text-sm transition-colors\",\n action.active\n ? \"bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n : \"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n showSource && \"cursor-not-allowed opacity-40 hover:bg-transparent\",\n )}\n >\n {action.icon}\n </button>\n ))}\n {showSourceToggle && <EditorSourceToggle className=\"ml-auto\" />}\n </>\n )}\n </div>\n );\n}\n\nEditorToolbar.displayName = \"EditorToolbar\";\n","export function EditorToolbarSeparator() {\n return (\n <span\n data-react-fancy-editor-toolbar-separator=\"\"\n className=\"mx-1 h-5 w-px bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n />\n );\n}\n\nEditorToolbarSeparator.displayName = \"EditorToolbarSeparator\";\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { CodeView } from \"../CodeView\";\nimport { useEditor } from \"./Editor.context\";\nimport { proseClasses, extensionEditorClasses } from \"./editor.utils\";\nimport type { EditorContentProps } from \"./Editor.types\";\n\nexport function EditorContent({ className, maxHeight, sourceClassName }: EditorContentProps) {\n const {\n contentRef,\n lineSpacing,\n placeholder,\n extensions,\n outputFormat,\n showSource,\n _initialHtml,\n _onInput,\n _sourceValue,\n _onSourceInput,\n } = useEditor();\n // Tracks which seed HTML is currently in the contentEditable. Seeding on the\n // seed VALUE (not a one-shot boolean) re-seeds when the source view rewrites\n // `value`, while still never re-seeding on plain keystrokes — typing leaves\n // `_initialHtml` untouched, so `seededHtml.current === _initialHtml` holds.\n const seededHtml = useRef<string | null>(null);\n\n useEffect(() => {\n // Source view replaces the contentEditable in the tree, so it unmounts.\n // Forget what we seeded — the div that returns is a fresh, empty one and\n // must always be re-seeded, even if `value` was left untouched.\n if (showSource) {\n seededHtml.current = null;\n return;\n }\n const el = contentRef.current;\n if (el && seededHtml.current !== _initialHtml) {\n el.innerHTML = _initialHtml;\n seededHtml.current = _initialHtml;\n }\n }, [contentRef, _initialHtml, showSource]);\n\n const extClasses = useMemo(\n () => extensionEditorClasses(extensions),\n [extensions],\n );\n\n if (showSource) {\n // Raw-source view — a syntax-highlighted code surface (HTML highlighted;\n // markdown/plain un-highlighted), built on the shared fancy-file-commons\n // primitives. It's a DIRECT child of the flex-column editor root (no\n // wrapper — a nested flex box collapses the fill), so `flex-auto` makes it\n // fill the editor body when height-constrained and grow with content\n // (≥ minHeight) when not. `maxHeight` caps + scrolls.\n return (\n <CodeView\n value={_sourceValue}\n onChange={_onSourceInput}\n language={outputFormat === \"html\" ? \"html\" : \"plaintext\"}\n placeholder={placeholder}\n maxHeight={maxHeight}\n className={cn(\"min-h-0 flex-auto\", sourceClassName)}\n />\n );\n }\n\n return (\n <div\n ref={contentRef}\n contentEditable\n suppressContentEditableWarning\n data-react-fancy-editor-content=\"\"\n data-placeholder={placeholder}\n onInput={_onInput}\n style={{\n lineHeight: lineSpacing,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n }}\n className={cn(\n \"min-h-[120px] flex-auto overflow-y-auto px-4 py-3 text-sm outline-none\",\n \"focus:outline-none\",\n proseClasses,\n extClasses,\n \"empty:before:content-[attr(data-placeholder)] empty:before:text-zinc-400 empty:before:pointer-events-none\",\n className,\n )}\n />\n );\n}\n\nEditorContent.displayName = \"EditorContent\";\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { marked } from \"marked\";\nimport { cn } from \"../../utils/cn\";\nimport { sanitizeHtml } from \"../../utils/sanitize\";\nimport { useControllableState } from \"../../hooks\";\nimport { EditorContext } from \"./Editor.context\";\nimport { EditorToolbar } from \"./EditorToolbar\";\nimport { EditorToolbarSeparator } from \"./EditorToolbarSeparator\";\nimport { EditorSourceToggle } from \"./EditorSourceToggle\";\nimport { EditorContent } from \"./EditorContent\";\nimport { htmlToMarkdown, detectFormat, markdownToEditorHtml, type MarkdownSource } from \"./editor.utils\";\nimport { mergeExtensions } from \"../ContentRenderer/extensions\";\nimport { ContentRenderer } from \"../ContentRenderer/ContentRenderer\";\nimport { useFieldMode } from \"../inputs/mode/FieldMode.context\";\nimport type { EditorProps } from \"./Editor.types\";\n\ninterface Seed {\n html: string;\n /** Source map for source-preserving markdown output; null when there is none. */\n source: MarkdownSource | null;\n}\n\nfunction toHtml(\n value: string,\n outputFormat: \"html\" | \"markdown\",\n unsafe: boolean,\n valueFormat: \"markdown\" | \"html\" | \"auto\" = \"auto\",\n): Seed {\n if (!value) return { html: \"\", source: null };\n const sanitize = (html: string) => (unsafe ? html : sanitizeHtml(html));\n // An explicit valueFormat is authoritative — the sniff misclassifies\n // markdown that merely MENTIONS HTML-ish snippets (`<code>`, `<table`),\n // collapsing it into an innerHTML wall of text (#10).\n const format =\n valueFormat !== \"auto\"\n ? valueFormat\n : outputFormat === \"html\"\n ? \"html\"\n : detectFormat(value);\n if (format === \"html\") return { html: sanitize(value), source: null };\n // Markdown in, markdown out: tag each block with its source so untouched\n // blocks are emitted byte-identical.\n if (outputFormat === \"markdown\") return markdownToEditorHtml(value, sanitize);\n return { html: sanitize((marked.parse(value, { async: false }) as string).trim()), source: null };\n}\n\nfunction EditorRoot({\n children,\n className,\n value: controlledValue,\n defaultValue = \"\",\n onChange,\n outputFormat = \"html\",\n valueFormat = \"auto\",\n lineSpacing = 1.6,\n placeholder,\n mode: modeProp,\n extensions: instanceExtensions,\n unsafe = false,\n showSource: showSourceProp,\n defaultShowSource = false,\n onShowSourceChange,\n}: EditorProps) {\n const contentRef = useRef<HTMLDivElement | null>(null);\n const [value, setValue] = useControllableState(controlledValue, defaultValue, onChange);\n const [showSource, setShowSource] = useControllableState(\n showSourceProp,\n defaultShowSource,\n onShowSourceChange,\n );\n // View/edit mode — same resolution as the inputs: prop → <Form> context → \"edit\".\n const mode = useFieldMode(modeProp);\n const isView = mode === \"view\";\n\n // The value this editor last emitted through `onChange`. An incoming `value`\n // equal to it is our own keystroke echoing back; anything else came from\n // OUTSIDE — an async load, a host reset, a form repopulating.\n const lastEmitted = useRef<string | null>(null);\n\n // Bumped only on an external `value` change, so the seed memo below recomputes\n // for those and stays put while the user types. Without this, `value` was\n // excluded from the deps to avoid re-seeding on keystrokes, which also meant a\n // value arriving after mount was silently dropped and the editor stayed blank\n // forever (#15).\n const [externalSeed, setExternalSeed] = useState(0);\n useEffect(() => {\n if (value !== lastEmitted.current) setExternalSeed((n) => n + 1);\n }, [value]);\n\n const seed = useMemo(\n () => toHtml(value, outputFormat, unsafe, valueFormat),\n // Seed the contentEditable from the LIVE value when (re)entering edit mode —\n // and when returning from the raw-source view, which may have rewritten the\n // value out from under the rich-text surface. `value` itself stays out of\n // the deps so typing never re-seeds (which would fight the caret);\n // `externalSeed` covers the externally-driven case instead.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isView, outputFormat, unsafe, valueFormat, showSource, externalSeed],\n );\n const initialHtml = seed.html;\n const seedSource = seed.source;\n\n const extensions = useMemo(\n () => mergeExtensions(instanceExtensions),\n [instanceExtensions],\n );\n\n const getOutputValue = useCallback(\n (html: string): string => {\n return outputFormat === \"markdown\" ? htmlToMarkdown(html, seedSource) : html;\n },\n [outputFormat, seedSource],\n );\n\n const handleInput = useCallback(() => {\n const el = contentRef.current;\n if (!el) return;\n const next = getOutputValue(el.innerHTML);\n // Record what we emitted BEFORE publishing it, so the value coming back in\n // is recognised as our own and does not trigger a re-seed mid-keystroke.\n lastEmitted.current = next;\n setValue(next);\n }, [setValue, getOutputValue]);\n\n const exec = useCallback(\n (command: string, arg?: string) => {\n const el = contentRef.current;\n if (!el) return;\n el.focus();\n document.execCommand(command, false, arg);\n handleInput();\n },\n [handleInput],\n );\n\n const insertText = useCallback(\n (text: string) => {\n const el = contentRef.current;\n if (!el) return;\n el.focus();\n document.execCommand(\"insertText\", false, text);\n handleInput();\n },\n [handleInput],\n );\n\n // The source textarea edits `value` directly — it is already the canonical\n // source in `outputFormat` (html or markdown), so no conversion round-trip.\n const handleSourceInput = useCallback(\n (next: string) => {\n // Also an internal emission — record it so typing in the source view is\n // not mistaken for an external change on every keystroke.\n lastEmitted.current = next;\n setValue(next);\n },\n [setValue],\n );\n\n const wrapSelection = useCallback(\n (before: string, after: string) => {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const selectedText = range.toString();\n const el = contentRef.current;\n if (!el) return;\n el.focus();\n document.execCommand(\"insertText\", false, `${before}${selectedText}${after}`);\n handleInput();\n },\n [handleInput],\n );\n\n const contextValue = {\n contentRef,\n exec,\n insertText,\n wrapSelection,\n outputFormat,\n lineSpacing,\n placeholder,\n extensions,\n showSource,\n setShowSource,\n _initialHtml: initialHtml,\n _onInput: handleInput,\n _sourceValue: value,\n _onSourceInput: handleSourceInput,\n };\n\n // View mode — render the value read-only through ContentRenderer, matching the\n // editor's own format (markdown/html), instead of the editable toolbar+content\n // tree. Driven by `mode` / a `<Form mode=\"view\">`, exactly like the inputs.\n if (isView) {\n return (\n <div\n data-react-fancy-editor=\"\"\n data-mode=\"view\"\n className={cn(\n \"overflow-hidden rounded-xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n className,\n )}\n >\n <ContentRenderer\n value={value}\n format={valueFormat !== \"auto\" ? valueFormat : outputFormat}\n lineSpacing={lineSpacing}\n extensions={instanceExtensions}\n unsafe={unsafe}\n className=\"px-4 py-3\"\n />\n </div>\n );\n }\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n data-react-fancy-editor=\"\"\n data-mode=\"edit\"\n className={cn(\n \"flex flex-col overflow-hidden rounded-xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n className,\n )}\n >\n {children}\n </div>\n </EditorContext.Provider>\n );\n}\n\nconst ToolbarWithSeparator = Object.assign(EditorToolbar, {\n Separator: EditorToolbarSeparator,\n});\n\nexport const Editor = Object.assign(EditorRoot, {\n Toolbar: ToolbarWithSeparator,\n Content: EditorContent,\n SourceToggle: EditorSourceToggle,\n});\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkMCQJFMDP_cjs = require('./chunk-MCQJFMDP.cjs');
|
|
4
4
|
var chunkG7227RTY_cjs = require('./chunk-G7227RTY.cjs');
|
|
5
5
|
var chunkL3V3BYVS_cjs = require('./chunk-L3V3BYVS.cjs');
|
|
6
6
|
var chunkX2FC7ODX_cjs = require('./chunk-X2FC7ODX.cjs');
|
|
@@ -130,7 +130,7 @@ function EditorContent({ className, maxHeight, sourceClassName }) {
|
|
|
130
130
|
}
|
|
131
131
|
}, [contentRef, _initialHtml, showSource]);
|
|
132
132
|
const extClasses = react.useMemo(
|
|
133
|
-
() =>
|
|
133
|
+
() => chunkMCQJFMDP_cjs.extensionEditorClasses(extensions),
|
|
134
134
|
[extensions]
|
|
135
135
|
);
|
|
136
136
|
if (showSource) {
|
|
@@ -162,7 +162,7 @@ function EditorContent({ className, maxHeight, sourceClassName }) {
|
|
|
162
162
|
className: chunkZU5Q77OT_cjs.cn(
|
|
163
163
|
"min-h-[120px] flex-auto overflow-y-auto px-4 py-3 text-sm outline-none",
|
|
164
164
|
"focus:outline-none",
|
|
165
|
-
|
|
165
|
+
chunkMCQJFMDP_cjs.proseClasses,
|
|
166
166
|
extClasses,
|
|
167
167
|
"empty:before:content-[attr(data-placeholder)] empty:before:text-zinc-400 empty:before:pointer-events-none",
|
|
168
168
|
className
|
|
@@ -172,13 +172,12 @@ function EditorContent({ className, maxHeight, sourceClassName }) {
|
|
|
172
172
|
}
|
|
173
173
|
EditorContent.displayName = "EditorContent";
|
|
174
174
|
function toHtml(value, outputFormat, unsafe, valueFormat = "auto") {
|
|
175
|
-
if (!value) return "";
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
})();
|
|
181
|
-
return unsafe ? raw : chunkX2FC7ODX_cjs.sanitizeHtml(raw);
|
|
175
|
+
if (!value) return { html: "", source: null };
|
|
176
|
+
const sanitize = (html) => unsafe ? html : chunkX2FC7ODX_cjs.sanitizeHtml(html);
|
|
177
|
+
const format = valueFormat !== "auto" ? valueFormat : outputFormat === "html" ? "html" : chunkMCQJFMDP_cjs.detectFormat(value);
|
|
178
|
+
if (format === "html") return { html: sanitize(value), source: null };
|
|
179
|
+
if (outputFormat === "markdown") return chunkMCQJFMDP_cjs.markdownToEditorHtml(value, sanitize);
|
|
180
|
+
return { html: sanitize(marked.marked.parse(value, { async: false }).trim()), source: null };
|
|
182
181
|
}
|
|
183
182
|
function EditorRoot({
|
|
184
183
|
children,
|
|
@@ -211,7 +210,7 @@ function EditorRoot({
|
|
|
211
210
|
react.useEffect(() => {
|
|
212
211
|
if (value !== lastEmitted.current) setExternalSeed((n) => n + 1);
|
|
213
212
|
}, [value]);
|
|
214
|
-
const
|
|
213
|
+
const seed = react.useMemo(
|
|
215
214
|
() => toHtml(value, outputFormat, unsafe, valueFormat),
|
|
216
215
|
// Seed the contentEditable from the LIVE value when (re)entering edit mode —
|
|
217
216
|
// and when returning from the raw-source view, which may have rewritten the
|
|
@@ -221,15 +220,17 @@ function EditorRoot({
|
|
|
221
220
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
222
221
|
[isView, outputFormat, unsafe, valueFormat, showSource, externalSeed]
|
|
223
222
|
);
|
|
223
|
+
const initialHtml = seed.html;
|
|
224
|
+
const seedSource = seed.source;
|
|
224
225
|
const extensions = react.useMemo(
|
|
225
|
-
() =>
|
|
226
|
+
() => chunkMCQJFMDP_cjs.mergeExtensions(instanceExtensions),
|
|
226
227
|
[instanceExtensions]
|
|
227
228
|
);
|
|
228
229
|
const getOutputValue = react.useCallback(
|
|
229
230
|
(html) => {
|
|
230
|
-
return outputFormat === "markdown" ?
|
|
231
|
+
return outputFormat === "markdown" ? chunkMCQJFMDP_cjs.htmlToMarkdown(html, seedSource) : html;
|
|
231
232
|
},
|
|
232
|
-
[outputFormat]
|
|
233
|
+
[outputFormat, seedSource]
|
|
233
234
|
);
|
|
234
235
|
const handleInput = react.useCallback(() => {
|
|
235
236
|
const el = contentRef.current;
|
|
@@ -306,7 +307,7 @@ function EditorRoot({
|
|
|
306
307
|
className
|
|
307
308
|
),
|
|
308
309
|
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
309
|
-
|
|
310
|
+
chunkMCQJFMDP_cjs.ContentRenderer,
|
|
310
311
|
{
|
|
311
312
|
value,
|
|
312
313
|
format: valueFormat !== "auto" ? valueFormat : outputFormat,
|
|
@@ -343,5 +344,5 @@ var Editor = Object.assign(EditorRoot, {
|
|
|
343
344
|
|
|
344
345
|
exports.Editor = Editor;
|
|
345
346
|
exports.useEditor = useEditor;
|
|
346
|
-
//# sourceMappingURL=chunk-
|
|
347
|
-
//# sourceMappingURL=chunk-
|
|
347
|
+
//# sourceMappingURL=chunk-XAQQX7J2.cjs.map
|
|
348
|
+
//# sourceMappingURL=chunk-XAQQX7J2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Editor/Editor.context.ts","../src/components/Editor/EditorSourceToggle.tsx","../src/components/Editor/EditorToolbar.tsx","../src/components/Editor/EditorToolbarSeparator.tsx","../src/components/Editor/EditorContent.tsx","../src/components/Editor/Editor.tsx"],"names":["createContext","useContext","jsx","cn","jsxs","Fragment","useRef","useEffect","useMemo","extensionEditorClasses","CodeView","proseClasses","sanitizeHtml","detectFormat","markdownToEditorHtml","marked","useControllableState","useFieldMode","useState","mergeExtensions","useCallback","htmlToMarkdown","ContentRenderer"],"mappings":"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","file":"chunk-XAQQX7J2.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { RefObject } from \"react\";\nimport type { RenderExtension } from \"../ContentRenderer/extensions\";\n\nexport interface EditorContextValue {\n contentRef: RefObject<HTMLDivElement | null>;\n exec: (command: string, arg?: string) => void;\n insertText: (text: string) => void;\n wrapSelection: (before: string, after: string) => void;\n outputFormat: \"html\" | \"markdown\";\n lineSpacing: number;\n placeholder?: string;\n /** Merged render extensions (global + instance). */\n extensions: RenderExtension[];\n /** Whether the raw-source view (textarea) is showing instead of the rich-text surface. */\n showSource: boolean;\n /** Toggle/set the raw-source view. */\n setShowSource: (showSource: boolean) => void;\n /** Initial HTML content to load into the editor on mount */\n _initialHtml: string;\n /** @internal Called by EditorContent on input events */\n _onInput: () => void;\n /** @internal Raw source value (`value` in `outputFormat`), for the source textarea. */\n _sourceValue: string;\n /** @internal Commit an edit made directly in the source textarea. */\n _onSourceInput: (value: string) => void;\n}\n\nexport const EditorContext = createContext<EditorContextValue | null>(null);\n\nexport function useEditor(): EditorContextValue {\n const ctx = useContext(EditorContext);\n if (!ctx) {\n throw new Error(\"useEditor must be used within an <Editor> component\");\n }\n return ctx;\n}\n","import { cn } from \"../../utils/cn\";\nimport { useEditor } from \"./Editor.context\";\nimport type { EditorSourceToggleProps } from \"./Editor.types\";\n\n/**\n * Toolbar button that reveals the raw HTML/Markdown behind the editor. Reads\n * `showSource` / `setShowSource` from context, so it works in the default\n * toolbar and in any custom toolbar composed with `useEditor()`.\n */\nexport function EditorSourceToggle({\n className,\n icon = \"</>\",\n title = \"Source\",\n activeTitle = \"Rich text\",\n}: EditorSourceToggleProps) {\n const { showSource, setShowSource } = useEditor();\n\n return (\n <button\n type=\"button\"\n onClick={() => setShowSource(!showSource)}\n title={showSource ? activeTitle : title}\n aria-pressed={showSource}\n data-react-fancy-editor-source-toggle=\"\"\n className={cn(\n \"inline-flex h-8 items-center justify-center rounded-md px-2 font-mono text-xs transition-colors\",\n showSource\n ? \"bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n : \"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n className,\n )}\n >\n {icon}\n </button>\n );\n}\n\nEditorSourceToggle.displayName = \"EditorSourceToggle\";\n","import { cn } from \"../../utils/cn\";\nimport { useEditor } from \"./Editor.context\";\nimport { EditorSourceToggle } from \"./EditorSourceToggle\";\nimport type { EditorToolbarProps } from \"./Editor.types\";\n\nconst DEFAULT_ACTIONS = [\n { icon: \"B\", label: \"Bold\", command: \"bold\" },\n { icon: \"I\", label: \"Italic\", command: \"italic\" },\n { icon: \"U\", label: \"Underline\", command: \"underline\" },\n { icon: \"S\", label: \"Strikethrough\", command: \"strikeThrough\" },\n];\n\nexport function EditorToolbar({\n actions = DEFAULT_ACTIONS,\n onAction,\n children,\n className,\n showSourceToggle = true,\n}: EditorToolbarProps) {\n const { exec, showSource } = useEditor();\n\n return (\n <div\n data-react-fancy-editor-toolbar=\"\"\n className={cn(\n \"flex shrink-0 items-center gap-0.5 border-b border-[color:var(--fancy-border,var(--color-zinc-200))] px-2 py-1.5 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n {children ?? (\n <>\n {actions.map((action) => (\n <button\n key={`${action.command}-${action.commandArg ?? \"\"}`}\n type=\"button\"\n // Rich-text commands don't apply to the raw-source textarea.\n disabled={showSource}\n onClick={() => {\n if (onAction) {\n onAction(action.command);\n } else {\n exec(action.command, action.commandArg);\n }\n }}\n title={action.label}\n className={cn(\n \"inline-flex h-8 w-8 items-center justify-center rounded-md text-sm transition-colors\",\n action.active\n ? \"bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n : \"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n showSource && \"cursor-not-allowed opacity-40 hover:bg-transparent\",\n )}\n >\n {action.icon}\n </button>\n ))}\n {showSourceToggle && <EditorSourceToggle className=\"ml-auto\" />}\n </>\n )}\n </div>\n );\n}\n\nEditorToolbar.displayName = \"EditorToolbar\";\n","export function EditorToolbarSeparator() {\n return (\n <span\n data-react-fancy-editor-toolbar-separator=\"\"\n className=\"mx-1 h-5 w-px bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\"\n />\n );\n}\n\nEditorToolbarSeparator.displayName = \"EditorToolbarSeparator\";\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { CodeView } from \"../CodeView\";\nimport { useEditor } from \"./Editor.context\";\nimport { proseClasses, extensionEditorClasses } from \"./editor.utils\";\nimport type { EditorContentProps } from \"./Editor.types\";\n\nexport function EditorContent({ className, maxHeight, sourceClassName }: EditorContentProps) {\n const {\n contentRef,\n lineSpacing,\n placeholder,\n extensions,\n outputFormat,\n showSource,\n _initialHtml,\n _onInput,\n _sourceValue,\n _onSourceInput,\n } = useEditor();\n // Tracks which seed HTML is currently in the contentEditable. Seeding on the\n // seed VALUE (not a one-shot boolean) re-seeds when the source view rewrites\n // `value`, while still never re-seeding on plain keystrokes — typing leaves\n // `_initialHtml` untouched, so `seededHtml.current === _initialHtml` holds.\n const seededHtml = useRef<string | null>(null);\n\n useEffect(() => {\n // Source view replaces the contentEditable in the tree, so it unmounts.\n // Forget what we seeded — the div that returns is a fresh, empty one and\n // must always be re-seeded, even if `value` was left untouched.\n if (showSource) {\n seededHtml.current = null;\n return;\n }\n const el = contentRef.current;\n if (el && seededHtml.current !== _initialHtml) {\n el.innerHTML = _initialHtml;\n seededHtml.current = _initialHtml;\n }\n }, [contentRef, _initialHtml, showSource]);\n\n const extClasses = useMemo(\n () => extensionEditorClasses(extensions),\n [extensions],\n );\n\n if (showSource) {\n // Raw-source view — a syntax-highlighted code surface (HTML highlighted;\n // markdown/plain un-highlighted), built on the shared fancy-file-commons\n // primitives. It's a DIRECT child of the flex-column editor root (no\n // wrapper — a nested flex box collapses the fill), so `flex-auto` makes it\n // fill the editor body when height-constrained and grow with content\n // (≥ minHeight) when not. `maxHeight` caps + scrolls.\n return (\n <CodeView\n value={_sourceValue}\n onChange={_onSourceInput}\n language={outputFormat === \"html\" ? \"html\" : \"plaintext\"}\n placeholder={placeholder}\n maxHeight={maxHeight}\n className={cn(\"min-h-0 flex-auto\", sourceClassName)}\n />\n );\n }\n\n return (\n <div\n ref={contentRef}\n contentEditable\n suppressContentEditableWarning\n data-react-fancy-editor-content=\"\"\n data-placeholder={placeholder}\n onInput={_onInput}\n style={{\n lineHeight: lineSpacing,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n }}\n className={cn(\n \"min-h-[120px] flex-auto overflow-y-auto px-4 py-3 text-sm outline-none\",\n \"focus:outline-none\",\n proseClasses,\n extClasses,\n \"empty:before:content-[attr(data-placeholder)] empty:before:text-zinc-400 empty:before:pointer-events-none\",\n className,\n )}\n />\n );\n}\n\nEditorContent.displayName = \"EditorContent\";\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { marked } from \"marked\";\nimport { cn } from \"../../utils/cn\";\nimport { sanitizeHtml } from \"../../utils/sanitize\";\nimport { useControllableState } from \"../../hooks\";\nimport { EditorContext } from \"./Editor.context\";\nimport { EditorToolbar } from \"./EditorToolbar\";\nimport { EditorToolbarSeparator } from \"./EditorToolbarSeparator\";\nimport { EditorSourceToggle } from \"./EditorSourceToggle\";\nimport { EditorContent } from \"./EditorContent\";\nimport { htmlToMarkdown, detectFormat, markdownToEditorHtml, type MarkdownSource } from \"./editor.utils\";\nimport { mergeExtensions } from \"../ContentRenderer/extensions\";\nimport { ContentRenderer } from \"../ContentRenderer/ContentRenderer\";\nimport { useFieldMode } from \"../inputs/mode/FieldMode.context\";\nimport type { EditorProps } from \"./Editor.types\";\n\ninterface Seed {\n html: string;\n /** Source map for source-preserving markdown output; null when there is none. */\n source: MarkdownSource | null;\n}\n\nfunction toHtml(\n value: string,\n outputFormat: \"html\" | \"markdown\",\n unsafe: boolean,\n valueFormat: \"markdown\" | \"html\" | \"auto\" = \"auto\",\n): Seed {\n if (!value) return { html: \"\", source: null };\n const sanitize = (html: string) => (unsafe ? html : sanitizeHtml(html));\n // An explicit valueFormat is authoritative — the sniff misclassifies\n // markdown that merely MENTIONS HTML-ish snippets (`<code>`, `<table`),\n // collapsing it into an innerHTML wall of text (#10).\n const format =\n valueFormat !== \"auto\"\n ? valueFormat\n : outputFormat === \"html\"\n ? \"html\"\n : detectFormat(value);\n if (format === \"html\") return { html: sanitize(value), source: null };\n // Markdown in, markdown out: tag each block with its source so untouched\n // blocks are emitted byte-identical.\n if (outputFormat === \"markdown\") return markdownToEditorHtml(value, sanitize);\n return { html: sanitize((marked.parse(value, { async: false }) as string).trim()), source: null };\n}\n\nfunction EditorRoot({\n children,\n className,\n value: controlledValue,\n defaultValue = \"\",\n onChange,\n outputFormat = \"html\",\n valueFormat = \"auto\",\n lineSpacing = 1.6,\n placeholder,\n mode: modeProp,\n extensions: instanceExtensions,\n unsafe = false,\n showSource: showSourceProp,\n defaultShowSource = false,\n onShowSourceChange,\n}: EditorProps) {\n const contentRef = useRef<HTMLDivElement | null>(null);\n const [value, setValue] = useControllableState(controlledValue, defaultValue, onChange);\n const [showSource, setShowSource] = useControllableState(\n showSourceProp,\n defaultShowSource,\n onShowSourceChange,\n );\n // View/edit mode — same resolution as the inputs: prop → <Form> context → \"edit\".\n const mode = useFieldMode(modeProp);\n const isView = mode === \"view\";\n\n // The value this editor last emitted through `onChange`. An incoming `value`\n // equal to it is our own keystroke echoing back; anything else came from\n // OUTSIDE — an async load, a host reset, a form repopulating.\n const lastEmitted = useRef<string | null>(null);\n\n // Bumped only on an external `value` change, so the seed memo below recomputes\n // for those and stays put while the user types. Without this, `value` was\n // excluded from the deps to avoid re-seeding on keystrokes, which also meant a\n // value arriving after mount was silently dropped and the editor stayed blank\n // forever (#15).\n const [externalSeed, setExternalSeed] = useState(0);\n useEffect(() => {\n if (value !== lastEmitted.current) setExternalSeed((n) => n + 1);\n }, [value]);\n\n const seed = useMemo(\n () => toHtml(value, outputFormat, unsafe, valueFormat),\n // Seed the contentEditable from the LIVE value when (re)entering edit mode —\n // and when returning from the raw-source view, which may have rewritten the\n // value out from under the rich-text surface. `value` itself stays out of\n // the deps so typing never re-seeds (which would fight the caret);\n // `externalSeed` covers the externally-driven case instead.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isView, outputFormat, unsafe, valueFormat, showSource, externalSeed],\n );\n const initialHtml = seed.html;\n const seedSource = seed.source;\n\n const extensions = useMemo(\n () => mergeExtensions(instanceExtensions),\n [instanceExtensions],\n );\n\n const getOutputValue = useCallback(\n (html: string): string => {\n return outputFormat === \"markdown\" ? htmlToMarkdown(html, seedSource) : html;\n },\n [outputFormat, seedSource],\n );\n\n const handleInput = useCallback(() => {\n const el = contentRef.current;\n if (!el) return;\n const next = getOutputValue(el.innerHTML);\n // Record what we emitted BEFORE publishing it, so the value coming back in\n // is recognised as our own and does not trigger a re-seed mid-keystroke.\n lastEmitted.current = next;\n setValue(next);\n }, [setValue, getOutputValue]);\n\n const exec = useCallback(\n (command: string, arg?: string) => {\n const el = contentRef.current;\n if (!el) return;\n el.focus();\n document.execCommand(command, false, arg);\n handleInput();\n },\n [handleInput],\n );\n\n const insertText = useCallback(\n (text: string) => {\n const el = contentRef.current;\n if (!el) return;\n el.focus();\n document.execCommand(\"insertText\", false, text);\n handleInput();\n },\n [handleInput],\n );\n\n // The source textarea edits `value` directly — it is already the canonical\n // source in `outputFormat` (html or markdown), so no conversion round-trip.\n const handleSourceInput = useCallback(\n (next: string) => {\n // Also an internal emission — record it so typing in the source view is\n // not mistaken for an external change on every keystroke.\n lastEmitted.current = next;\n setValue(next);\n },\n [setValue],\n );\n\n const wrapSelection = useCallback(\n (before: string, after: string) => {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n const selectedText = range.toString();\n const el = contentRef.current;\n if (!el) return;\n el.focus();\n document.execCommand(\"insertText\", false, `${before}${selectedText}${after}`);\n handleInput();\n },\n [handleInput],\n );\n\n const contextValue = {\n contentRef,\n exec,\n insertText,\n wrapSelection,\n outputFormat,\n lineSpacing,\n placeholder,\n extensions,\n showSource,\n setShowSource,\n _initialHtml: initialHtml,\n _onInput: handleInput,\n _sourceValue: value,\n _onSourceInput: handleSourceInput,\n };\n\n // View mode — render the value read-only through ContentRenderer, matching the\n // editor's own format (markdown/html), instead of the editable toolbar+content\n // tree. Driven by `mode` / a `<Form mode=\"view\">`, exactly like the inputs.\n if (isView) {\n return (\n <div\n data-react-fancy-editor=\"\"\n data-mode=\"view\"\n className={cn(\n \"overflow-hidden rounded-xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n className,\n )}\n >\n <ContentRenderer\n value={value}\n format={valueFormat !== \"auto\" ? valueFormat : outputFormat}\n lineSpacing={lineSpacing}\n extensions={instanceExtensions}\n unsafe={unsafe}\n className=\"px-4 py-3\"\n />\n </div>\n );\n }\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n data-react-fancy-editor=\"\"\n data-mode=\"edit\"\n className={cn(\n \"flex flex-col overflow-hidden rounded-xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n className,\n )}\n >\n {children}\n </div>\n </EditorContext.Provider>\n );\n}\n\nconst ToolbarWithSeparator = Object.assign(EditorToolbar, {\n Separator: EditorToolbarSeparator,\n});\n\nexport const Editor = Object.assign(EditorRoot, {\n Toolbar: ToolbarWithSeparator,\n Content: EditorContent,\n SourceToggle: EditorSourceToggle,\n});\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
require('./chunk-S3TRSECD.cjs');
|
|
4
|
-
var
|
|
4
|
+
var chunkMCQJFMDP_cjs = require('./chunk-MCQJFMDP.cjs');
|
|
5
5
|
require('./chunk-X2FC7ODX.cjs');
|
|
6
6
|
require('./chunk-ZU5Q77OT.cjs');
|
|
7
7
|
|
|
@@ -9,15 +9,15 @@ require('./chunk-ZU5Q77OT.cjs');
|
|
|
9
9
|
|
|
10
10
|
Object.defineProperty(exports, "ContentRenderer", {
|
|
11
11
|
enumerable: true,
|
|
12
|
-
get: function () { return
|
|
12
|
+
get: function () { return chunkMCQJFMDP_cjs.ContentRenderer; }
|
|
13
13
|
});
|
|
14
14
|
Object.defineProperty(exports, "registerExtension", {
|
|
15
15
|
enumerable: true,
|
|
16
|
-
get: function () { return
|
|
16
|
+
get: function () { return chunkMCQJFMDP_cjs.registerExtension; }
|
|
17
17
|
});
|
|
18
18
|
Object.defineProperty(exports, "registerExtensions", {
|
|
19
19
|
enumerable: true,
|
|
20
|
-
get: function () { return
|
|
20
|
+
get: function () { return chunkMCQJFMDP_cjs.registerExtensions; }
|
|
21
21
|
});
|
|
22
22
|
//# sourceMappingURL=content-renderer.cjs.map
|
|
23
23
|
//# sourceMappingURL=content-renderer.cjs.map
|
package/dist/content-renderer.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import './chunk-AUTW5O4W.js';
|
|
2
|
-
export { ContentRenderer, registerExtension, registerExtensions } from './chunk-
|
|
2
|
+
export { ContentRenderer, registerExtension, registerExtensions } from './chunk-L24LUSEE.js';
|
|
3
3
|
import './chunk-6TBRBN7H.js';
|
|
4
4
|
import './chunk-MMW2JGKZ.js';
|
|
5
5
|
//# sourceMappingURL=content-renderer.js.map
|
package/dist/editor.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkXAQQX7J2_cjs = require('./chunk-XAQQX7J2.cjs');
|
|
4
4
|
require('./chunk-A2JUTNE6.cjs');
|
|
5
5
|
require('./chunk-T6YELZPJ.cjs');
|
|
6
|
-
require('./chunk-
|
|
6
|
+
require('./chunk-MCQJFMDP.cjs');
|
|
7
7
|
require('./chunk-G7227RTY.cjs');
|
|
8
8
|
require('./chunk-TXTRTTG7.cjs');
|
|
9
9
|
require('./chunk-FQZE5N2N.cjs');
|
|
@@ -19,11 +19,11 @@ require('./chunk-ZU5Q77OT.cjs');
|
|
|
19
19
|
|
|
20
20
|
Object.defineProperty(exports, "Editor", {
|
|
21
21
|
enumerable: true,
|
|
22
|
-
get: function () { return
|
|
22
|
+
get: function () { return chunkXAQQX7J2_cjs.Editor; }
|
|
23
23
|
});
|
|
24
24
|
Object.defineProperty(exports, "useEditor", {
|
|
25
25
|
enumerable: true,
|
|
26
|
-
get: function () { return
|
|
26
|
+
get: function () { return chunkXAQQX7J2_cjs.useEditor; }
|
|
27
27
|
});
|
|
28
28
|
//# sourceMappingURL=editor.cjs.map
|
|
29
29
|
//# sourceMappingURL=editor.cjs.map
|
package/dist/editor.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { Editor, useEditor } from './chunk-
|
|
1
|
+
export { Editor, useEditor } from './chunk-VD3C7IA4.js';
|
|
2
2
|
import './chunk-2BXMMVQS.js';
|
|
3
3
|
import './chunk-CPY7NHXM.js';
|
|
4
|
-
import './chunk-
|
|
4
|
+
import './chunk-L24LUSEE.js';
|
|
5
5
|
import './chunk-FBWUXSKH.js';
|
|
6
6
|
import './chunk-5U2DZ7AV.js';
|
|
7
7
|
import './chunk-3K2CEAI7.js';
|