mdwysiwyg 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/MarkdownEditor/MarkdownEditor.tsx","../src/components/MarkdownEditor/markdown/tiptapMarkdownBridge.ts","../node_modules/highlight.js/es/languages/json.js","../node_modules/highlight.js/es/languages/sql.js","../node_modules/highlight.js/es/languages/typescript.js","../node_modules/highlight.js/es/languages/javascript.js","../node_modules/highlight.js/es/languages/java.js","../src/components/MarkdownEditor/markdown/pipeline.ts","../src/components/MarkdownEditor/markdown/mermaid.ts","../src/components/MarkdownEditor/markdown/cursorMapping.ts","../src/components/MarkdownEditor/markdown/tableCommands.ts","../src/components/MarkdownEditor/views/RenderedView.tsx","../src/components/MarkdownEditor/views/MarkdownSourceView.tsx","../src/components/MarkdownEditor/MarkdownEditor.module.css","../src/components/MarkdownEditor/Toolbar/Toolbar.tsx","../src/components/MarkdownEditor/Toolbar/buttons/ToolbarButton.tsx","../src/components/MarkdownEditor/Toolbar/buttons/InsertDialogs.tsx","../src/components/MarkdownEditor/markdown/links.ts","../src/components/MarkdownEditor/Toolbar/buttons/TableSizePicker.tsx","../src/components/MarkdownEditor/Toolbar/buttons/CodeLanguagePicker.tsx","../src/components/MarkdownEditor/Toolbar/buttons/FloatingPanel.tsx","../src/components/MarkdownEditor/Toolbar/buttons/ExportMenu.tsx","../src/components/MarkdownEditor/Toolbar/buttons/icons.tsx","../src/components/MarkdownEditor/Toolbar/buttons/Separator.tsx","../src/components/MarkdownEditor/Toolbar/buttons/LinkPopover.tsx","../src/components/MarkdownEditor/Toolbar/buttons/TableContextMenu.tsx"],"sourcesContent":["export { MarkdownEditor } from \"./components/MarkdownEditor\";\nexport type {\n MarkdownEditorProps,\n MarkdownEditorHandle,\n} from \"./components/MarkdownEditor\";\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useEditor } from \"@tiptap/react\";\nimport { getMarkRange, type Range } from \"@tiptap/core\";\nimport { TextSelection } from \"@tiptap/pm/state\";\nimport {\n createEditorExtensions,\n editorToMarkdown,\n markdownToEditorContent,\n} from \"./markdown/tiptapMarkdownBridge\";\nimport {\n markdownOffsetToProseMirrorPos,\n proseMirrorPosToMarkdownOffset,\n} from \"./markdown/cursorMapping\";\nimport { moveCurrentColumn, moveCurrentRow } from \"./markdown/tableCommands\";\nimport { RenderedView } from \"./views/RenderedView\";\nimport { MarkdownSourceView } from \"./views/MarkdownSourceView\";\nimport { Toolbar } from \"./Toolbar/Toolbar\";\nimport { LinkPopover } from \"./Toolbar/buttons/LinkPopover\";\nimport { TableContextMenu } from \"./Toolbar/buttons/TableContextMenu\";\nimport { FloatingPanel } from \"./Toolbar/buttons/FloatingPanel\";\nimport type {\n MarkdownEditorHandle,\n MarkdownEditorProps,\n ViewMode,\n} from \"./types\";\nimport styles from \"./MarkdownEditor.module.css\";\n\ninterface LinkPopoverState {\n url: string;\n range: Range;\n anchor: HTMLElement;\n}\n\ninterface TableMenuState {\n kind: \"column\" | \"row\";\n anchor: HTMLElement;\n}\n\nfunction toCssSize(value: number | string): string {\n return typeof value === \"number\" ? `${value}px` : value;\n}\n\nexport const MarkdownEditor = forwardRef<\n MarkdownEditorHandle,\n MarkdownEditorProps\n>(function MarkdownEditor(\n {\n initialContent = \"\",\n onChange,\n width = 700,\n height = 500,\n sanitizeEmbeddedHtml = true,\n className,\n onlyView = false,\n resizable = true,\n onlyViewNotice,\n },\n ref,\n) {\n const [source, setSource] = useState(initialContent);\n const [viewMode, setViewMode] = useState<ViewMode>(\"wysiwyg\");\n const effectiveViewMode: ViewMode = onlyView ? \"wysiwyg\" : viewMode;\n const [linkPopover, setLinkPopover] = useState<LinkPopoverState | null>(\n null,\n );\n const [tableMenu, setTableMenu] = useState<TableMenuState | null>(null);\n // Celda de tabla que tenía el cursor antes del clic actual: un segundo clic\n // sobre la misma celda abre el menú en vez de solo reposicionar (FR-002).\n const lastFocusedCellPosRef = useRef<number | null>(null);\n // Valor con el que se montó el componente: referencia para reset()/\n // isModified() (FR-015, FR-016).\n const originalContentRef = useRef(initialContent);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Refs keep the editor's onUpdate closure valid across renders without\n // recreating the editor when onChange or source change.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const sourceRef = useRef(source);\n sourceRef.current = source;\n\n const extensions = useMemo(\n () => createEditorExtensions({ sanitizeEmbeddedHtml }),\n [sanitizeEmbeddedHtml],\n );\n\n const editor = useEditor(\n {\n extensions,\n content: markdownToEditorContent(sourceRef.current),\n editable: !onlyView,\n editorProps: {\n attributes: {\n role: \"textbox\",\n \"aria-multiline\": \"true\",\n \"aria-label\": \"Editor de texto enriquecido\",\n },\n handleDOMEvents: {\n click(view, event) {\n const target = event.target;\n if (!(target instanceof Element)) return false;\n\n // --- Tabla: segundo clic sobre la celda ya enfocada abre el menú\n const cellEl = target.closest(\"th, td\");\n if (cellEl !== null && view.dom.contains(cellEl)) {\n // Un arrastre para seleccionar texto también dispara \"click\":\n // con una selección no vacía, el usuario está seleccionando\n // contenido, no pidiendo el menú contextual.\n if (!view.state.selection.empty) {\n lastFocusedCellPosRef.current = null;\n return false;\n }\n const cellPos = view.posAtDOM(cellEl, 0);\n if (lastFocusedCellPosRef.current === cellPos) {\n event.preventDefault();\n // Anclar la selección dentro de la celda: los comandos de\n // tabla (addColumnAfter, selectedRect, …) operan sobre la\n // posición del cursor, y `preventDefault` impide que\n // ProseMirror la fije por su cuenta.\n const tr = view.state.tr.setSelection(\n TextSelection.near(view.state.doc.resolve(cellPos + 1)),\n );\n view.dispatch(tr);\n setTableMenu({\n kind: cellEl.tagName === \"TH\" ? \"column\" : \"row\",\n anchor: cellEl as HTMLElement,\n });\n return true;\n }\n lastFocusedCellPosRef.current = cellPos;\n return false;\n }\n // Clic fuera de cualquier celda: el próximo clic en una celda\n // cuenta como \"primer clic\" (edge case de la spec).\n lastFocusedCellPosRef.current = null;\n\n const anchorEl = target.closest(\"a\");\n if (anchorEl === null || !view.dom.contains(anchorEl)) {\n return false;\n }\n const linkType = view.state.schema.marks[\"link\"];\n if (!linkType) return false;\n const pos = view.posAtDOM(anchorEl, 0);\n const $pos = view.state.doc.resolve(\n Math.min(pos + 1, view.state.doc.content.size),\n );\n const range = getMarkRange($pos, linkType);\n if (!range) return false;\n const mark = $pos\n .marks()\n .find((candidate) => candidate.type === linkType);\n const href = mark?.attrs[\"href\"] as string | undefined;\n if (href === undefined) return false;\n event.preventDefault();\n setLinkPopover({ url: href, range, anchor: anchorEl });\n return true;\n },\n },\n },\n onUpdate({ editor: currentEditor }) {\n const markdown = editorToMarkdown(currentEditor);\n sourceRef.current = markdown;\n setSource(markdown);\n onChangeRef.current?.(markdown);\n },\n },\n [sanitizeEmbeddedHtml, onlyView],\n );\n\n const toggleView = () => {\n if (viewMode === \"wysiwyg\") {\n // Posición del cursor en el documento → offset equivalente en el texto\n // fuente, aplicado tras el cambio de vista (FR-006).\n const offset =\n editor === null\n ? 0\n : proseMirrorPosToMarkdownOffset(\n editor,\n editor.state.selection.from,\n sourceRef.current,\n );\n setViewMode(\"markdown\");\n requestAnimationFrame(() => {\n const textarea = textareaRef.current;\n if (textarea === null) return;\n textarea.focus();\n textarea.setSelectionRange(offset, offset);\n });\n } else {\n const offset = textareaRef.current?.selectionStart ?? 0;\n // emitUpdate=false: cambiar de vista nunca dispara onChange (FR-004)\n editor?.commands.setContent(\n markdownToEditorContent(sourceRef.current),\n false,\n );\n setViewMode(\"wysiwyg\");\n if (editor !== null) {\n const pos = markdownOffsetToProseMirrorPos(\n sourceRef.current,\n offset,\n editor.state.doc,\n );\n editor.commands.setTextSelection(pos);\n editor.commands.focus();\n }\n }\n };\n\n const handleSourceChange = (value: string) => {\n sourceRef.current = value;\n setSource(value);\n onChangeRef.current?.(value);\n };\n\n useImperativeHandle(\n ref,\n () => ({\n reset() {\n const original = originalContentRef.current;\n sourceRef.current = original;\n setSource(original);\n editor?.commands.setContent(markdownToEditorContent(original), false);\n },\n isModified() {\n return sourceRef.current !== originalContentRef.current;\n },\n }),\n [editor],\n );\n\n const closeLinkPopover = () => setLinkPopover(null);\n\n const closeTableMenu = () => setTableMenu(null);\n\n /** Ejecuta una acción del menú de tabla y cierra el menú. */\n const runTableAction = (action: () => void) => {\n action();\n closeTableMenu();\n };\n\n const saveLinkPopover = (newUrl: string) => {\n if (!editor || !linkPopover) return;\n editor\n .chain()\n .focus()\n .setTextSelection(linkPopover.range)\n .extendMarkRange(\"link\")\n .setLink({ href: newUrl })\n .run();\n closeLinkPopover();\n };\n\n const removeLinkPopover = () => {\n if (!editor || !linkPopover) return;\n editor\n .chain()\n .focus()\n .setTextSelection(linkPopover.range)\n .extendMarkRange(\"link\")\n .unsetLink()\n .run();\n closeLinkPopover();\n };\n\n const rootClassName = [\n styles[\"root\"],\n resizable ? styles[\"resizable\"] : undefined,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n className={rootClassName}\n style={{ width: toCssSize(width), height: toCssSize(height) }}\n >\n <Toolbar\n editor={editor}\n viewMode={effectiveViewMode}\n onToggleView={toggleView}\n source={source}\n sanitizeEmbeddedHtml={sanitizeEmbeddedHtml}\n onlyView={onlyView}\n {...(onlyViewNotice !== undefined ? { onlyViewNotice } : {})}\n />\n <div className={styles[\"content\"]}>\n {effectiveViewMode === \"wysiwyg\" ? (\n <RenderedView editor={editor} />\n ) : (\n <MarkdownSourceView\n ref={textareaRef}\n value={source}\n onChange={handleSourceChange}\n readOnly={onlyView}\n />\n )}\n </div>\n {linkPopover !== null && (\n <FloatingPanel anchor={linkPopover.anchor} autoFocus>\n <LinkPopover\n url={linkPopover.url}\n onlyView={onlyView}\n onNavigate={() => {\n window.open(linkPopover.url, \"_blank\", \"noopener,noreferrer\");\n closeLinkPopover();\n }}\n onCopy={() => {\n void navigator.clipboard.writeText(linkPopover.url);\n closeLinkPopover();\n }}\n onSave={saveLinkPopover}\n onRemove={removeLinkPopover}\n onClose={closeLinkPopover}\n />\n </FloatingPanel>\n )}\n {tableMenu !== null && editor !== null && (\n <FloatingPanel anchor={tableMenu.anchor} autoFocus>\n {tableMenu.kind === \"column\" ? (\n <TableContextMenu\n ariaLabel=\"Acciones de columna\"\n onClose={closeTableMenu}\n actions={[\n {\n label: \"Añadir columna a la derecha\",\n onSelect: () =>\n runTableAction(() =>\n editor.chain().focus().addColumnAfter().run(),\n ),\n },\n {\n label: \"Añadir columna a la izquierda\",\n onSelect: () =>\n runTableAction(() =>\n editor.chain().focus().addColumnBefore().run(),\n ),\n },\n {\n label: \"Mover columna a la derecha\",\n separatorBefore: true,\n onSelect: () =>\n runTableAction(() => moveCurrentColumn(editor, \"after\")),\n },\n {\n label: \"Mover columna a la izquierda\",\n onSelect: () =>\n runTableAction(() => moveCurrentColumn(editor, \"before\")),\n },\n {\n label: \"Eliminar esta columna\",\n separatorBefore: true,\n onSelect: () =>\n runTableAction(() =>\n editor.chain().focus().deleteColumn().run(),\n ),\n },\n ]}\n />\n ) : (\n <TableContextMenu\n ariaLabel=\"Acciones de fila\"\n onClose={closeTableMenu}\n actions={[\n {\n label: \"Añadir fila arriba\",\n onSelect: () =>\n runTableAction(() =>\n editor.chain().focus().addRowBefore().run(),\n ),\n },\n {\n label: \"Añadir fila abajo\",\n onSelect: () =>\n runTableAction(() =>\n editor.chain().focus().addRowAfter().run(),\n ),\n },\n {\n label: \"Subir esta fila\",\n separatorBefore: true,\n onSelect: () =>\n runTableAction(() => moveCurrentRow(editor, \"before\")),\n },\n {\n label: \"Bajar esta fila\",\n onSelect: () =>\n runTableAction(() => moveCurrentRow(editor, \"after\")),\n },\n {\n label: \"Eliminar esta fila\",\n separatorBefore: true,\n onSelect: () =>\n runTableAction(() =>\n editor.chain().focus().deleteRow().run(),\n ),\n },\n ]}\n />\n )}\n </FloatingPanel>\n )}\n </div>\n );\n});\n","import { Node, type Extensions, type Editor } from \"@tiptap/core\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Table from \"@tiptap/extension-table\";\nimport TableRow from \"@tiptap/extension-table-row\";\nimport TableCell from \"@tiptap/extension-table-cell\";\nimport TableHeader from \"@tiptap/extension-table-header\";\nimport TaskList from \"@tiptap/extension-task-list\";\nimport TaskItem from \"@tiptap/extension-task-item\";\nimport Link from \"@tiptap/extension-link\";\nimport Image from \"@tiptap/extension-image\";\nimport CodeBlockLowlight from \"@tiptap/extension-code-block-lowlight\";\nimport { createLowlight } from \"lowlight\";\nimport json from \"highlight.js/lib/languages/json\";\nimport sql from \"highlight.js/lib/languages/sql\";\nimport typescript from \"highlight.js/lib/languages/typescript\";\nimport javascript from \"highlight.js/lib/languages/javascript\";\nimport java from \"highlight.js/lib/languages/java\";\nimport {\n editorHtmlToMarkdown,\n markdownToEditorHtml,\n sanitizeHtmlFragment,\n} from \"./pipeline\";\nimport { renderMermaid } from \"./mermaid\";\n\n/**\n * Registro selectivo: solo los 5 lenguajes ya ofrecidos por el selector de\n * lenguaje de bloque de código, en vez de `createLowlight(all)` (~190\n * gramáticas), para mantener el bundle acotado (Principio VIII).\n */\nexport const lowlight = createLowlight();\nlowlight.register({ json, sql, typescript, javascript, java });\n\nexport interface HtmlBlockOptions {\n sanitize: boolean;\n}\n\n/**\n * Atom node that carries an embedded raw-HTML block byte-exact through the\n * editor (FR-020): the source lives in an encoded attribute so WYSIWYG edits\n * elsewhere never rewrite it, and the node view renders it sanitized unless\n * the consumer opted out (FR-022, FR-023).\n */\nexport const HtmlBlock = Node.create<HtmlBlockOptions>({\n name: \"htmlBlock\",\n group: \"block\",\n atom: true,\n\n addOptions() {\n return { sanitize: true };\n },\n\n addAttributes() {\n return { content: { default: \"\" } };\n },\n\n parseHTML() {\n return [\n {\n tag: \"div[data-raw-html]\",\n getAttrs: (element) => {\n const raw = (element as HTMLElement).getAttribute(\"data-raw-html\");\n return raw === null ? false : { content: decodeURIComponent(raw) };\n },\n },\n ];\n },\n\n renderHTML({ node }) {\n const content = node.attrs[\"content\"] as string;\n return [\"div\", { \"data-raw-html\": encodeURIComponent(content) }];\n },\n\n addNodeView() {\n return ({ node }) => {\n const dom = document.createElement(\"div\");\n dom.setAttribute(\"data-html-block\", \"\");\n const raw = node.attrs[\"content\"] as string;\n dom.innerHTML = this.options.sanitize ? sanitizeHtmlFragment(raw) : raw;\n return { dom };\n };\n },\n});\n\n/**\n * Bloque de código con renderizado de diagramas Mermaid: cuando el lenguaje\n * del bloque es \"mermaid\", el node view monta un contenedor y sustituye su\n * contenido por el SVG renderizado de forma asíncrona. Con sintaxis inválida\n * cae al texto fuente legible (FR-007, FR-008). Es puramente presentacional:\n * el nodo del documento (y por tanto el Markdown) nunca se modifica (FR-010).\n */\nconst CodeBlockWithMermaid = CodeBlockLowlight.extend({\n addNodeView() {\n const parentNodeView = this.parent?.();\n\n return (props) => {\n if (props.node.attrs[\"language\"] !== \"mermaid\") {\n if (parentNodeView) return parentNodeView(props);\n // Sin node view heredado: `pre > code` editable estándar, para que el\n // resaltado por plugin de lowlight siga funcionando igual que antes.\n const pre = document.createElement(\"pre\");\n const code = document.createElement(\"code\");\n const language = props.node.attrs[\"language\"];\n if (typeof language === \"string\" && language !== \"\") {\n code.classList.add(`language-${language}`);\n }\n pre.appendChild(code);\n return { dom: pre, contentDOM: code };\n }\n\n const dom = document.createElement(\"div\");\n dom.setAttribute(\"data-mermaid-block\", \"\");\n\n let lastRenderedSource: string | null = null;\n\n const paintFallback = (source: string) => {\n dom.replaceChildren();\n const pre = document.createElement(\"pre\");\n const code = document.createElement(\"code\");\n code.textContent = source;\n pre.appendChild(code);\n dom.appendChild(pre);\n };\n\n const paint = (source: string) => {\n if (source === lastRenderedSource) return;\n lastRenderedSource = source;\n void renderMermaid(source).then((svg) => {\n // Descartar resultados obsoletos si el contenido cambió mientras\n // el render estaba en vuelo.\n if (lastRenderedSource !== source) return;\n if (svg === null) {\n paintFallback(source);\n return;\n }\n dom.innerHTML = svg;\n const svgEl = dom.querySelector(\"svg\");\n svgEl?.setAttribute(\"role\", \"img\");\n svgEl?.setAttribute(\"aria-label\", \"Diagrama Mermaid\");\n });\n };\n\n paintFallback(props.node.textContent);\n paint(props.node.textContent);\n\n return {\n dom,\n // Nodo atómico a efectos de renderizado: el contenido se edita desde\n // la vista Markdown; aquí solo se muestra el diagrama.\n ignoreMutation: () => true,\n update(updatedNode) {\n if (updatedNode.type.name !== props.node.type.name) return false;\n if (updatedNode.attrs[\"language\"] !== \"mermaid\") return false;\n paint(updatedNode.textContent);\n return true;\n },\n };\n };\n },\n});\n\nexport interface EditorExtensionOptions {\n sanitizeEmbeddedHtml: boolean;\n}\n\nexport function createEditorExtensions(\n options: EditorExtensionOptions,\n): Extensions {\n return [\n StarterKit.configure({ codeBlock: false }),\n CodeBlockWithMermaid.configure({ lowlight }),\n Table.configure({ resizable: false }),\n TableRow,\n TableHeader,\n TableCell,\n TaskList,\n TaskItem.configure({ nested: true }),\n Link.configure({ openOnClick: false }),\n Image,\n HtmlBlock.configure({ sanitize: options.sanitizeEmbeddedHtml }),\n ];\n}\n\n/** Markdown (GFM) → contenido HTML para `editor.commands.setContent`. */\nexport function markdownToEditorContent(markdown: string): string {\n return markdownToEditorHtml(markdown);\n}\n\n/** Documento actual del editor → Markdown (GFM). */\nexport function editorToMarkdown(editor: Editor): string {\n return editorHtmlToMarkdown(editor.getHTML());\n}\n","const EXTENDED_NUMBER_RE = '([-+]?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)|NaN|[-+]?Infinity'; // 0x..., 0..., decimal, float\n\nconst EXTENDED_NUMBER_MODE = {\n scope: 'number',\n match: EXTENDED_NUMBER_RE,\n relevance: 0\n};\n\n/*\nLanguage: JSON\nDescription: JSON (JavaScript Object Notation) is a lightweight data-interchange format.\nWebsites: http://www.json.org, https://www.json5.org\nCategory: common, protocols, web\n*/\n\n\nfunction json(hljs) {\n const ATTRIBUTE = {\n className: 'attr',\n begin: /((\"(\\\\.|[^\\\\\"\\r\\n])*\")|('(\\\\.|[^\\\\'\\r\\n])*'))(?=\\s*:)/,\n relevance: 1.01\n };\n const PUNCTUATION = {\n match: /[{}[\\],:]/,\n className: \"punctuation\",\n relevance: 0\n };\n const LITERALS = [\n \"true\",\n \"false\",\n \"null\"\n ];\n // NOTE: normally we would rely on `keywords` for this but using a mode here allows us\n // - to use the very tight `illegal: \\S` rule later to flag any other character\n // - as illegal indicating that despite looking like JSON we do not truly have\n // - JSON and thus improve false-positively greatly since JSON will try and claim\n // - all sorts of JSON looking stuff\n const LITERALS_MODE = {\n scope: \"literal\",\n beginKeywords: LITERALS.join(\" \"),\n };\n\n return {\n name: 'JSON',\n aliases: ['jsonc', 'json5'],\n keywords:{\n literal: LITERALS,\n },\n contains: [\n ATTRIBUTE,\n PUNCTUATION,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n LITERALS_MODE,\n EXTENDED_NUMBER_MODE,\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ],\n illegal: '\\\\S'\n };\n}\n\nexport { json as default };\n","/*\n Language: SQL\n Website: https://en.wikipedia.org/wiki/SQL\n Category: common, database\n */\n\n/*\n\nGoals:\n\nSQL is intended to highlight basic/common SQL keywords and expressions\n\n- If pretty much every single SQL server includes supports, then it's a canidate.\n- It is NOT intended to include tons of vendor specific keywords (Oracle, MySQL,\n PostgreSQL) although the list of data types is purposely a bit more expansive.\n- For more specific SQL grammars please see:\n - PostgreSQL and PL/pgSQL - core\n - T-SQL - https://github.com/highlightjs/highlightjs-tsql\n - sql_more (core)\n\n */\n\nfunction sql(hljs) {\n const regex = hljs.regex;\n const COMMENT_MODE = hljs.COMMENT('--', '$');\n const STRING = {\n scope: 'string',\n variants: [\n {\n begin: /'/,\n end: /'/,\n contains: [ { match: /''/ } ]\n }\n ]\n };\n const QUOTED_IDENTIFIER = {\n begin: /\"/,\n end: /\"/,\n contains: [ { match: /\"\"/ } ]\n };\n\n const LITERALS = [\n \"true\",\n \"false\",\n // Not sure it's correct to call NULL literal, and clauses like IS [NOT] NULL look strange that way.\n // \"null\",\n \"unknown\"\n ];\n\n const MULTI_WORD_TYPES = [\n \"double precision\",\n \"large object\",\n \"with timezone\",\n \"without timezone\"\n ];\n\n const TYPES = [\n 'bigint',\n 'binary',\n 'blob',\n 'boolean',\n 'char',\n 'character',\n 'clob',\n 'date',\n 'dec',\n 'decfloat',\n 'decimal',\n 'float',\n 'int',\n 'integer',\n 'interval',\n 'nchar',\n 'nclob',\n 'national',\n 'numeric',\n 'real',\n 'row',\n 'smallint',\n 'time',\n 'timestamp',\n 'varchar',\n 'varying', // modifier (character varying)\n 'varbinary'\n ];\n\n const NON_RESERVED_WORDS = [\n \"add\",\n \"asc\",\n \"collation\",\n \"desc\",\n \"final\",\n \"first\",\n \"last\",\n \"view\"\n ];\n\n // https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#reserved-word\n const RESERVED_WORDS = [\n \"abs\",\n \"acos\",\n \"all\",\n \"allocate\",\n \"alter\",\n \"and\",\n \"any\",\n \"are\",\n \"array\",\n \"array_agg\",\n \"array_max_cardinality\",\n \"as\",\n \"asensitive\",\n \"asin\",\n \"asymmetric\",\n \"at\",\n \"atan\",\n \"atomic\",\n \"authorization\",\n \"avg\",\n \"begin\",\n \"begin_frame\",\n \"begin_partition\",\n \"between\",\n \"bigint\",\n \"binary\",\n \"blob\",\n \"boolean\",\n \"both\",\n \"by\",\n \"call\",\n \"called\",\n \"cardinality\",\n \"cascaded\",\n \"case\",\n \"cast\",\n \"ceil\",\n \"ceiling\",\n \"char\",\n \"char_length\",\n \"character\",\n \"character_length\",\n \"check\",\n \"classifier\",\n \"clob\",\n \"close\",\n \"coalesce\",\n \"collate\",\n \"collect\",\n \"column\",\n \"commit\",\n \"condition\",\n \"connect\",\n \"constraint\",\n \"contains\",\n \"convert\",\n \"copy\",\n \"corr\",\n \"corresponding\",\n \"cos\",\n \"cosh\",\n \"count\",\n \"covar_pop\",\n \"covar_samp\",\n \"create\",\n \"cross\",\n \"cube\",\n \"cume_dist\",\n \"current\",\n \"current_catalog\",\n \"current_date\",\n \"current_default_transform_group\",\n \"current_path\",\n \"current_role\",\n \"current_row\",\n \"current_schema\",\n \"current_time\",\n \"current_timestamp\",\n \"current_path\",\n \"current_role\",\n \"current_transform_group_for_type\",\n \"current_user\",\n \"cursor\",\n \"cycle\",\n \"date\",\n \"day\",\n \"deallocate\",\n \"dec\",\n \"decimal\",\n \"decfloat\",\n \"declare\",\n \"default\",\n \"define\",\n \"delete\",\n \"dense_rank\",\n \"deref\",\n \"describe\",\n \"deterministic\",\n \"disconnect\",\n \"distinct\",\n \"double\",\n \"drop\",\n \"dynamic\",\n \"each\",\n \"element\",\n \"else\",\n \"empty\",\n \"end\",\n \"end_frame\",\n \"end_partition\",\n \"end-exec\",\n \"equals\",\n \"escape\",\n \"every\",\n \"except\",\n \"exec\",\n \"execute\",\n \"exists\",\n \"exp\",\n \"external\",\n \"extract\",\n \"false\",\n \"fetch\",\n \"filter\",\n \"first_value\",\n \"float\",\n \"floor\",\n \"for\",\n \"foreign\",\n \"frame_row\",\n \"free\",\n \"from\",\n \"full\",\n \"function\",\n \"fusion\",\n \"get\",\n \"global\",\n \"grant\",\n \"group\",\n \"grouping\",\n \"groups\",\n \"having\",\n \"hold\",\n \"hour\",\n \"identity\",\n \"in\",\n \"indicator\",\n \"initial\",\n \"inner\",\n \"inout\",\n \"insensitive\",\n \"insert\",\n \"int\",\n \"integer\",\n \"intersect\",\n \"intersection\",\n \"interval\",\n \"into\",\n \"is\",\n \"join\",\n \"json_array\",\n \"json_arrayagg\",\n \"json_exists\",\n \"json_object\",\n \"json_objectagg\",\n \"json_query\",\n \"json_table\",\n \"json_table_primitive\",\n \"json_value\",\n \"lag\",\n \"language\",\n \"large\",\n \"last_value\",\n \"lateral\",\n \"lead\",\n \"leading\",\n \"left\",\n \"like\",\n \"like_regex\",\n \"listagg\",\n \"ln\",\n \"local\",\n \"localtime\",\n \"localtimestamp\",\n \"log\",\n \"log10\",\n \"lower\",\n \"match\",\n \"match_number\",\n \"match_recognize\",\n \"matches\",\n \"max\",\n \"member\",\n \"merge\",\n \"method\",\n \"min\",\n \"minute\",\n \"mod\",\n \"modifies\",\n \"module\",\n \"month\",\n \"multiset\",\n \"national\",\n \"natural\",\n \"nchar\",\n \"nclob\",\n \"new\",\n \"no\",\n \"none\",\n \"normalize\",\n \"not\",\n \"nth_value\",\n \"ntile\",\n \"null\",\n \"nullif\",\n \"numeric\",\n \"octet_length\",\n \"occurrences_regex\",\n \"of\",\n \"offset\",\n \"old\",\n \"omit\",\n \"on\",\n \"one\",\n \"only\",\n \"open\",\n \"or\",\n \"order\",\n \"out\",\n \"outer\",\n \"over\",\n \"overlaps\",\n \"overlay\",\n \"parameter\",\n \"partition\",\n \"pattern\",\n \"per\",\n \"percent\",\n \"percent_rank\",\n \"percentile_cont\",\n \"percentile_disc\",\n \"period\",\n \"portion\",\n \"position\",\n \"position_regex\",\n \"power\",\n \"precedes\",\n \"precision\",\n \"prepare\",\n \"primary\",\n \"procedure\",\n \"ptf\",\n \"range\",\n \"rank\",\n \"reads\",\n \"real\",\n \"recursive\",\n \"ref\",\n \"references\",\n \"referencing\",\n \"regr_avgx\",\n \"regr_avgy\",\n \"regr_count\",\n \"regr_intercept\",\n \"regr_r2\",\n \"regr_slope\",\n \"regr_sxx\",\n \"regr_sxy\",\n \"regr_syy\",\n \"release\",\n \"result\",\n \"return\",\n \"returns\",\n \"revoke\",\n \"right\",\n \"rollback\",\n \"rollup\",\n \"row\",\n \"row_number\",\n \"rows\",\n \"running\",\n \"savepoint\",\n \"scope\",\n \"scroll\",\n \"search\",\n \"second\",\n \"seek\",\n \"select\",\n \"sensitive\",\n \"session_user\",\n \"set\",\n \"show\",\n \"similar\",\n \"sin\",\n \"sinh\",\n \"skip\",\n \"smallint\",\n \"some\",\n \"specific\",\n \"specifictype\",\n \"sql\",\n \"sqlexception\",\n \"sqlstate\",\n \"sqlwarning\",\n \"sqrt\",\n \"start\",\n \"static\",\n \"stddev_pop\",\n \"stddev_samp\",\n \"submultiset\",\n \"subset\",\n \"substring\",\n \"substring_regex\",\n \"succeeds\",\n \"sum\",\n \"symmetric\",\n \"system\",\n \"system_time\",\n \"system_user\",\n \"table\",\n \"tablesample\",\n \"tan\",\n \"tanh\",\n \"then\",\n \"time\",\n \"timestamp\",\n \"timezone_hour\",\n \"timezone_minute\",\n \"to\",\n \"trailing\",\n \"translate\",\n \"translate_regex\",\n \"translation\",\n \"treat\",\n \"trigger\",\n \"trim\",\n \"trim_array\",\n \"true\",\n \"truncate\",\n \"uescape\",\n \"union\",\n \"unique\",\n \"unknown\",\n \"unnest\",\n \"update\",\n \"upper\",\n \"user\",\n \"using\",\n \"value\",\n \"values\",\n \"value_of\",\n \"var_pop\",\n \"var_samp\",\n \"varbinary\",\n \"varchar\",\n \"varying\",\n \"versioning\",\n \"when\",\n \"whenever\",\n \"where\",\n \"width_bucket\",\n \"window\",\n \"with\",\n \"within\",\n \"without\",\n \"year\",\n ];\n\n // these are reserved words we have identified to be functions\n // and should only be highlighted in a dispatch-like context\n // ie, array_agg(...), etc.\n const RESERVED_FUNCTIONS = [\n \"abs\",\n \"acos\",\n \"array_agg\",\n \"asin\",\n \"atan\",\n \"avg\",\n \"cast\",\n \"ceil\",\n \"ceiling\",\n \"coalesce\",\n \"corr\",\n \"cos\",\n \"cosh\",\n \"count\",\n \"covar_pop\",\n \"covar_samp\",\n \"cume_dist\",\n \"dense_rank\",\n \"deref\",\n \"element\",\n \"exp\",\n \"extract\",\n \"first_value\",\n \"floor\",\n \"json_array\",\n \"json_arrayagg\",\n \"json_exists\",\n \"json_object\",\n \"json_objectagg\",\n \"json_query\",\n \"json_table\",\n \"json_table_primitive\",\n \"json_value\",\n \"lag\",\n \"last_value\",\n \"lead\",\n \"listagg\",\n \"ln\",\n \"log\",\n \"log10\",\n \"lower\",\n \"max\",\n \"min\",\n \"mod\",\n \"nth_value\",\n \"ntile\",\n \"nullif\",\n \"percent_rank\",\n \"percentile_cont\",\n \"percentile_disc\",\n \"position\",\n \"position_regex\",\n \"power\",\n \"rank\",\n \"regr_avgx\",\n \"regr_avgy\",\n \"regr_count\",\n \"regr_intercept\",\n \"regr_r2\",\n \"regr_slope\",\n \"regr_sxx\",\n \"regr_sxy\",\n \"regr_syy\",\n \"row_number\",\n \"sin\",\n \"sinh\",\n \"sqrt\",\n \"stddev_pop\",\n \"stddev_samp\",\n \"substring\",\n \"substring_regex\",\n \"sum\",\n \"tan\",\n \"tanh\",\n \"translate\",\n \"translate_regex\",\n \"treat\",\n \"trim\",\n \"trim_array\",\n \"unnest\",\n \"upper\",\n \"value_of\",\n \"var_pop\",\n \"var_samp\",\n \"width_bucket\",\n ];\n\n // these functions can\n const POSSIBLE_WITHOUT_PARENS = [\n \"current_catalog\",\n \"current_date\",\n \"current_default_transform_group\",\n \"current_path\",\n \"current_role\",\n \"current_schema\",\n \"current_transform_group_for_type\",\n \"current_user\",\n \"session_user\",\n \"system_time\",\n \"system_user\",\n \"current_time\",\n \"localtime\",\n \"current_timestamp\",\n \"localtimestamp\"\n ];\n\n // those exist to boost relevance making these very\n // \"SQL like\" keyword combos worth +1 extra relevance\n const COMBOS = [\n \"create table\",\n \"insert into\",\n \"primary key\",\n \"foreign key\",\n \"not null\",\n \"alter table\",\n \"add constraint\",\n \"grouping sets\",\n \"on overflow\",\n \"character set\",\n \"respect nulls\",\n \"ignore nulls\",\n \"nulls first\",\n \"nulls last\",\n \"depth first\",\n \"breadth first\"\n ];\n\n const FUNCTIONS = RESERVED_FUNCTIONS;\n\n const KEYWORDS = [\n ...RESERVED_WORDS,\n ...NON_RESERVED_WORDS\n ].filter((keyword) => {\n return !RESERVED_FUNCTIONS.includes(keyword);\n });\n\n const VARIABLE = {\n scope: \"variable\",\n match: /@[a-z0-9][a-z0-9_]*/,\n };\n\n const OPERATOR = {\n scope: \"operator\",\n match: /[-+*/=%^~]|&&?|\\|\\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,\n relevance: 0,\n };\n\n const FUNCTION_CALL = {\n match: regex.concat(/\\b/, regex.either(...FUNCTIONS), /\\s*\\(/),\n relevance: 0,\n keywords: { built_in: FUNCTIONS }\n };\n\n // turns a multi-word keyword combo into a regex that doesn't\n // care about extra whitespace etc.\n // input: \"START QUERY\"\n // output: /\\bSTART\\s+QUERY\\b/\n function kws_to_regex(list) {\n return regex.concat(\n /\\b/,\n regex.either(...list.map((kw) => {\n return kw.replace(/\\s+/, \"\\\\s+\")\n })),\n /\\b/\n )\n }\n\n const MULTI_WORD_KEYWORDS = {\n scope: \"keyword\",\n match: kws_to_regex(COMBOS),\n relevance: 0,\n };\n\n // keywords with less than 3 letters are reduced in relevancy\n function reduceRelevancy(list, {\n exceptions, when\n } = {}) {\n const qualifyFn = when;\n exceptions = exceptions || [];\n return list.map((item) => {\n if (item.match(/\\|\\d+$/) || exceptions.includes(item)) {\n return item;\n } else if (qualifyFn(item)) {\n return `${item}|0`;\n } else {\n return item;\n }\n });\n }\n\n return {\n name: 'SQL',\n case_insensitive: true,\n // does not include {} or HTML tags `</`\n illegal: /[{}]|<\\//,\n keywords: {\n $pattern: /\\b[\\w\\.]+/,\n keyword:\n reduceRelevancy(KEYWORDS, { when: (x) => x.length < 3 }),\n literal: LITERALS,\n type: TYPES,\n built_in: POSSIBLE_WITHOUT_PARENS\n },\n contains: [\n {\n scope: \"type\",\n match: kws_to_regex(MULTI_WORD_TYPES)\n },\n MULTI_WORD_KEYWORDS,\n FUNCTION_CALL,\n VARIABLE,\n STRING,\n QUOTED_IDENTIFIER,\n hljs.C_NUMBER_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n COMMENT_MODE,\n OPERATOR\n ]\n };\n}\n\nexport { sql as default };\n","const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\n\nconst KEYWORDS = [\n \"as\", // for exports\n \"in\",\n \"of\",\n \"if\",\n \"for\",\n \"while\",\n \"finally\",\n \"var\",\n \"new\",\n \"function\",\n \"do\",\n \"return\",\n \"void\",\n \"else\",\n \"break\",\n \"catch\",\n \"instanceof\",\n \"with\",\n \"throw\",\n \"case\",\n \"default\",\n \"try\",\n \"switch\",\n \"continue\",\n \"typeof\",\n \"delete\",\n \"let\",\n \"yield\",\n \"const\",\n \"class\",\n // JS handles these with a special rule\n // \"get\",\n // \"set\",\n \"debugger\",\n \"async\",\n \"await\",\n \"static\",\n \"import\",\n \"from\",\n \"export\",\n \"extends\",\n // It's reached stage 3, which is \"recommended for implementation\":\n \"using\"\n];\nconst LITERALS = [\n \"true\",\n \"false\",\n \"null\",\n \"undefined\",\n \"NaN\",\n \"Infinity\"\n];\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\nconst TYPES = [\n // Fundamental objects\n \"Object\",\n \"Function\",\n \"Boolean\",\n \"Symbol\",\n // numbers and dates\n \"Math\",\n \"Date\",\n \"Number\",\n \"BigInt\",\n // text\n \"String\",\n \"RegExp\",\n // Indexed collections\n \"Array\",\n \"Float32Array\",\n \"Float64Array\",\n \"Int8Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"Int16Array\",\n \"Int32Array\",\n \"Uint16Array\",\n \"Uint32Array\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n // Keyed collections\n \"Set\",\n \"Map\",\n \"WeakSet\",\n \"WeakMap\",\n // Structured data\n \"ArrayBuffer\",\n \"SharedArrayBuffer\",\n \"Atomics\",\n \"DataView\",\n \"JSON\",\n // Control abstraction objects\n \"Promise\",\n \"Generator\",\n \"GeneratorFunction\",\n \"AsyncFunction\",\n // Reflection\n \"Reflect\",\n \"Proxy\",\n // Internationalization\n \"Intl\",\n // WebAssembly\n \"WebAssembly\"\n];\n\nconst ERROR_TYPES = [\n \"Error\",\n \"EvalError\",\n \"InternalError\",\n \"RangeError\",\n \"ReferenceError\",\n \"SyntaxError\",\n \"TypeError\",\n \"URIError\"\n];\n\nconst BUILT_IN_GLOBALS = [\n \"setInterval\",\n \"setTimeout\",\n \"clearInterval\",\n \"clearTimeout\",\n\n \"require\",\n \"exports\",\n\n \"eval\",\n \"isFinite\",\n \"isNaN\",\n \"parseFloat\",\n \"parseInt\",\n \"decodeURI\",\n \"decodeURIComponent\",\n \"encodeURI\",\n \"encodeURIComponent\",\n \"escape\",\n \"unescape\"\n];\n\nconst BUILT_IN_VARIABLES = [\n \"arguments\",\n \"this\",\n \"super\",\n \"console\",\n \"window\",\n \"document\",\n \"localStorage\",\n \"sessionStorage\",\n \"module\",\n \"self\",\n \"global\" // Node.js\n];\n\nconst BUILT_INS = [].concat(\n BUILT_IN_GLOBALS,\n TYPES,\n ERROR_TYPES\n);\n\n/*\nLanguage: JavaScript\nDescription: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.\nCategory: common, scripting, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/JavaScript\n*/\n\n\n/** @type LanguageFn */\nfunction javascript(hljs) {\n const regex = hljs.regex;\n /**\n * Takes a string like \"<Booger\" and checks to see\n * if we can find a matching \"</Booger\" later in the\n * content.\n * @param {RegExpMatchArray} match\n * @param {{after:number}} param1\n */\n const hasClosingTag = (match, { after }) => {\n const tag = \"</\" + match[0].slice(1);\n const pos = match.input.indexOf(tag, after);\n return pos !== -1;\n };\n\n const IDENT_RE$1 = IDENT_RE;\n const FRAGMENT = {\n begin: '<>',\n end: '</>'\n };\n // to avoid some special cases inside isTrulyOpeningTag\n const XML_SELF_CLOSING = /<[A-Za-z0-9\\\\._:-]+\\s*\\/>/;\n const XML_TAG = {\n begin: /<[A-Za-z0-9\\\\._:-]+/,\n end: /\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,\n /**\n * @param {RegExpMatchArray} match\n * @param {CallbackResponse} response\n */\n isTrulyOpeningTag: (match, response) => {\n const afterMatchIndex = match[0].length + match.index;\n const nextChar = match.input[afterMatchIndex];\n if (\n // HTML should not include another raw `<` inside a tag\n // nested type?\n // `<Array<Array<number>>`, etc.\n nextChar === \"<\" ||\n // the , gives away that this is not HTML\n // `<T, A extends keyof T, V>`\n nextChar === \",\"\n ) {\n response.ignoreMatch();\n return;\n }\n\n // `<something>`\n // Quite possibly a tag, lets look for a matching closing tag...\n if (nextChar === \">\") {\n // if we cannot find a matching closing tag, then we\n // will ignore it\n if (!hasClosingTag(match, { after: afterMatchIndex })) {\n response.ignoreMatch();\n }\n }\n\n // `<blah />` (self-closing)\n // handled by simpleSelfClosing rule\n\n let m;\n const afterMatch = match.input.substring(afterMatchIndex);\n\n // some more template typing stuff\n // <T = any>(key?: string) => Modify<\n if ((m = afterMatch.match(/^\\s*=/))) {\n response.ignoreMatch();\n return;\n }\n\n // `<From extends string>`\n // technically this could be HTML, but it smells like a type\n // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276\n if ((m = afterMatch.match(/^\\s+extends\\s+/))) {\n if (m.index === 0) {\n response.ignoreMatch();\n // eslint-disable-next-line no-useless-return\n return;\n }\n }\n }\n };\n const KEYWORDS$1 = {\n $pattern: IDENT_RE,\n keyword: KEYWORDS,\n literal: LITERALS,\n built_in: BUILT_INS,\n \"variable.language\": BUILT_IN_VARIABLES\n };\n\n // https://tc39.es/ecma262/#sec-literals-numeric-literals\n const decimalDigits = '[0-9](_?[0-9])*';\n const frac = `\\\\.(${decimalDigits})`;\n // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;\n const NUMBER = {\n className: 'number',\n variants: [\n // DecimalLiteral\n { begin: `(\\\\b(${decimalInteger})((${frac})|\\\\.)?|(${frac}))` +\n `[eE][+-]?(${decimalDigits})\\\\b` },\n { begin: `\\\\b(${decimalInteger})\\\\b((${frac})\\\\b|\\\\.)?|(${frac})\\\\b` },\n\n // DecimalBigIntegerLiteral\n { begin: `\\\\b(0|[1-9](_?[0-9])*)n\\\\b` },\n\n // NonDecimalIntegerLiteral\n { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\" },\n { begin: \"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\" },\n { begin: \"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\" },\n\n // LegacyOctalIntegerLiteral (does not include underscore separators)\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n { begin: \"\\\\b0[0-7]+n?\\\\b\" },\n ],\n relevance: 0\n };\n\n const SUBST = {\n className: 'subst',\n begin: '\\\\$\\\\{',\n end: '\\\\}',\n keywords: KEYWORDS$1,\n contains: [] // defined later\n };\n const HTML_TEMPLATE = {\n begin: '\\.?html`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'xml'\n }\n };\n const CSS_TEMPLATE = {\n begin: '\\.?css`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'css'\n }\n };\n const GRAPHQL_TEMPLATE = {\n begin: '\\.?gql`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'graphql'\n }\n };\n const TEMPLATE_STRING = {\n className: 'string',\n begin: '`',\n end: '`',\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ]\n };\n const JSDOC_COMMENT = hljs.COMMENT(\n /\\/\\*\\*(?!\\/)/,\n '\\\\*/',\n {\n relevance: 0,\n contains: [\n {\n begin: '(?=@[A-Za-z]+)',\n relevance: 0,\n contains: [\n {\n className: 'doctag',\n begin: '@[A-Za-z]+'\n },\n {\n className: 'type',\n begin: '\\\\{',\n end: '\\\\}',\n excludeEnd: true,\n excludeBegin: true,\n relevance: 0\n },\n {\n className: 'variable',\n begin: IDENT_RE$1 + '(?=\\\\s*(-)|$)',\n endsParent: true,\n relevance: 0\n },\n // eat spaces (not newlines) so we can find\n // types or variables\n {\n begin: /(?=[^\\n])\\s/,\n relevance: 0\n }\n ]\n }\n ]\n }\n );\n const COMMENT = {\n className: \"comment\",\n variants: [\n JSDOC_COMMENT,\n hljs.C_BLOCK_COMMENT_MODE,\n hljs.C_LINE_COMMENT_MODE\n ]\n };\n const SUBST_INTERNALS = [\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n // This is intentional:\n // See https://github.com/highlightjs/highlight.js/issues/3288\n // hljs.REGEXP_MODE\n ];\n SUBST.contains = SUBST_INTERNALS\n .concat({\n // we need to pair up {} inside our subst to prevent\n // it from ending too early by matching another }\n begin: /\\{/,\n end: /\\}/,\n keywords: KEYWORDS$1,\n contains: [\n \"self\"\n ].concat(SUBST_INTERNALS)\n });\n const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);\n const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([\n // eat recursive parens in sub expressions\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n keywords: KEYWORDS$1,\n contains: [\"self\"].concat(SUBST_AND_COMMENTS)\n }\n ]);\n const PARAMS = {\n className: 'params',\n // convert this to negative lookbehind in v12\n begin: /(\\s*)\\(/, // to match the parms with\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n };\n\n // ES6 classes\n const CLASS_OR_EXTENDS = {\n variants: [\n // class Car extends vehicle\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1,\n /\\s+/,\n /extends/,\n /\\s+/,\n regex.concat(IDENT_RE$1, \"(\", regex.concat(/\\./, IDENT_RE$1), \")*\")\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\",\n 5: \"keyword\",\n 7: \"title.class.inherited\"\n }\n },\n // class Car\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n },\n\n ]\n };\n\n const CLASS_REFERENCE = {\n relevance: 0,\n match:\n regex.either(\n // Hard coded exceptions\n /\\bJSON/,\n // Float32Array, OutT\n /\\b[A-Z][a-z]+([A-Z][a-z]*|\\d)*/,\n // CSSFactory, CSSFactoryT\n /\\b[A-Z]{2,}([A-Z][a-z]+|\\d)+([A-Z][a-z]*)*/,\n // FPs, FPsT\n /\\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\\d)*([A-Z][a-z]*)*/,\n // P\n // single letters are not highlighted\n // BLAH\n // this will be flagged as a UPPER_CASE_CONSTANT instead\n ),\n className: \"title.class\",\n keywords: {\n _: [\n // se we still get relevance credit for JS library classes\n ...TYPES,\n ...ERROR_TYPES\n ]\n }\n };\n\n const USE_STRICT = {\n label: \"use_strict\",\n className: 'meta',\n relevance: 10,\n begin: /^\\s*['\"]use (strict|asm)['\"]/\n };\n\n const FUNCTION_DEFINITION = {\n variants: [\n {\n match: [\n /function/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\s*\\()/\n ]\n },\n // anonymous function\n {\n match: [\n /function/,\n /\\s*(?=\\()/\n ]\n }\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n label: \"func.def\",\n contains: [ PARAMS ],\n illegal: /%/\n };\n\n const UPPER_CASE_CONSTANT = {\n relevance: 0,\n match: /\\b[A-Z][A-Z_0-9]+\\b/,\n className: \"variable.constant\"\n };\n\n function noneOf(list) {\n return regex.concat(\"(?!\", list.join(\"|\"), \")\");\n }\n\n const FUNCTION_CALL = {\n match: regex.concat(\n /\\b/,\n noneOf([\n ...BUILT_IN_GLOBALS,\n \"super\",\n \"import\",\n \"await\",\n ].map(x => `${x}\\\\s*\\\\(`)),\n IDENT_RE$1, regex.lookahead(/\\s*\\(/)),\n className: \"title.function\",\n relevance: 0\n };\n\n const PROPERTY_ACCESS = {\n begin: regex.concat(/\\./, regex.lookahead(\n regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)\n )),\n end: IDENT_RE$1,\n excludeBegin: true,\n keywords: \"prototype\",\n className: \"property\",\n relevance: 0\n };\n\n const GETTER_OR_SETTER = {\n match: [\n /get|set/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\()/\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n { // eat to avoid empty params\n begin: /\\(\\)/\n },\n PARAMS\n ]\n };\n\n const FUNC_LEAD_IN_RE = '(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\\\s*=>';\n\n const FUNCTION_VARIABLE = {\n match: [\n /const|var|let/, /\\s+/,\n IDENT_RE$1, /\\s*/,\n /=\\s*/,\n /(async\\s*)?/, // async is optional\n regex.lookahead(FUNC_LEAD_IN_RE)\n ],\n keywords: \"async\",\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n PARAMS\n ]\n };\n\n return {\n name: 'JavaScript',\n aliases: ['js', 'jsx', 'mjs', 'cjs'],\n keywords: KEYWORDS$1,\n // this will be extended by TypeScript\n exports: { PARAMS_CONTAINS, CLASS_REFERENCE },\n illegal: /#(?![$_A-Za-z])/,\n contains: [\n hljs.SHEBANG({\n label: \"shebang\",\n binary: \"node\",\n relevance: 5\n }),\n USE_STRICT,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n COMMENT,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n CLASS_REFERENCE,\n {\n scope: 'attr',\n match: IDENT_RE$1 + regex.lookahead(':'),\n relevance: 0\n },\n FUNCTION_VARIABLE,\n { // \"value\" container\n begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n keywords: 'return throw case',\n relevance: 0,\n contains: [\n COMMENT,\n hljs.REGEXP_MODE,\n {\n className: 'function',\n // we have to count the parens to make sure we actually have the\n // correct bounding ( ) before the =>. There could be any number of\n // sub-expressions inside also surrounded by parens.\n begin: FUNC_LEAD_IN_RE,\n returnBegin: true,\n end: '\\\\s*=>',\n contains: [\n {\n className: 'params',\n variants: [\n {\n begin: hljs.UNDERSCORE_IDENT_RE,\n relevance: 0\n },\n {\n className: null,\n begin: /\\(\\s*\\)/,\n skip: true\n },\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n }\n ]\n }\n ]\n },\n { // could be a comma delimited list of params to a function call\n begin: /,/,\n relevance: 0\n },\n {\n match: /\\s+/,\n relevance: 0\n },\n { // JSX\n variants: [\n { begin: FRAGMENT.begin, end: FRAGMENT.end },\n { match: XML_SELF_CLOSING },\n {\n begin: XML_TAG.begin,\n // we carefully check the opening tag to see if it truly\n // is a tag and not a false positive\n 'on:begin': XML_TAG.isTrulyOpeningTag,\n end: XML_TAG.end\n }\n ],\n subLanguage: 'xml',\n contains: [\n {\n begin: XML_TAG.begin,\n end: XML_TAG.end,\n skip: true,\n contains: ['self']\n }\n ]\n }\n ],\n },\n FUNCTION_DEFINITION,\n {\n // prevent this from getting swallowed up by function\n // since they appear \"function like\"\n beginKeywords: \"while if switch catch for\"\n },\n {\n // we have to count the parens to make sure we actually have the correct\n // bounding ( ). There could be any number of sub-expressions inside\n // also surrounded by parens.\n begin: '\\\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +\n '\\\\(' + // first parens\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)\\\\s*\\\\{', // end parens\n returnBegin:true,\n label: \"func.def\",\n contains: [\n PARAMS,\n hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: \"title.function\" })\n ]\n },\n // catch ... so it won't trigger the property rule below\n {\n match: /\\.\\.\\./,\n relevance: 0\n },\n PROPERTY_ACCESS,\n // hack: prevents detection of keywords in some circumstances\n // .keyword()\n // $keyword = x\n {\n match: '\\\\$' + IDENT_RE$1,\n relevance: 0\n },\n {\n match: [ /\\bconstructor(?=\\s*\\()/ ],\n className: { 1: \"title.function\" },\n contains: [ PARAMS ]\n },\n FUNCTION_CALL,\n UPPER_CASE_CONSTANT,\n CLASS_OR_EXTENDS,\n GETTER_OR_SETTER,\n {\n match: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n }\n ]\n };\n}\n\n/*\nLanguage: TypeScript\nAuthor: Panu Horsmalahti <panu.horsmalahti@iki.fi>\nContributors: Ike Ku <dempfi@yahoo.com>\nDescription: TypeScript is a strict superset of JavaScript\nWebsite: https://www.typescriptlang.org\nCategory: common, scripting\n*/\n\n\n/** @type LanguageFn */\nfunction typescript(hljs) {\n const regex = hljs.regex;\n const tsLanguage = javascript(hljs);\n\n const IDENT_RE$1 = IDENT_RE;\n const TYPES = [\n \"any\",\n \"void\",\n \"number\",\n \"boolean\",\n \"string\",\n \"object\",\n \"never\",\n \"symbol\",\n \"bigint\",\n \"unknown\"\n ];\n const NAMESPACE = {\n begin: [\n /namespace/,\n /\\s+/,\n hljs.IDENT_RE\n ],\n beginScope: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n };\n const INTERFACE = {\n beginKeywords: 'interface',\n end: /\\{/,\n excludeEnd: true,\n keywords: {\n keyword: 'interface extends',\n built_in: TYPES\n },\n contains: [ tsLanguage.exports.CLASS_REFERENCE ]\n };\n const USE_STRICT = {\n className: 'meta',\n relevance: 10,\n begin: /^\\s*['\"]use strict['\"]/\n };\n const TS_SPECIFIC_KEYWORDS = [\n \"type\",\n // \"namespace\",\n \"interface\",\n \"public\",\n \"private\",\n \"protected\",\n \"implements\",\n \"declare\",\n \"abstract\",\n \"readonly\",\n \"enum\",\n \"override\",\n \"satisfies\"\n ];\n /*\n namespace is a TS keyword but it's fine to use it as a variable name too.\n const message = 'foo';\n const namespace = 'bar';\n */\n const KEYWORDS$1 = {\n $pattern: IDENT_RE,\n keyword: KEYWORDS.concat(TS_SPECIFIC_KEYWORDS),\n literal: LITERALS,\n built_in: BUILT_INS.concat(TYPES),\n \"variable.language\": BUILT_IN_VARIABLES\n };\n\n const DECORATOR = {\n className: 'meta',\n begin: '@' + IDENT_RE$1,\n };\n\n const swapMode = (mode, label, replacement) => {\n const indx = mode.contains.findIndex(m => m.label === label);\n if (indx === -1) { throw new Error(\"can not find mode to replace\"); }\n\n mode.contains.splice(indx, 1, replacement);\n };\n\n\n // this should update anywhere keywords is used since\n // it will be the same actual JS object\n Object.assign(tsLanguage.keywords, KEYWORDS$1);\n\n tsLanguage.exports.PARAMS_CONTAINS.push(DECORATOR);\n\n // highlight the function params\n const ATTRIBUTE_HIGHLIGHT = tsLanguage.contains.find(c => c.scope === \"attr\");\n\n // take default attr rule and extend it to support optionals\n const OPTIONAL_KEY_OR_ARGUMENT = Object.assign({},\n ATTRIBUTE_HIGHLIGHT,\n { match: regex.concat(IDENT_RE$1, regex.lookahead(/\\s*\\?:/)) }\n );\n tsLanguage.exports.PARAMS_CONTAINS.push([\n tsLanguage.exports.CLASS_REFERENCE, // class reference for highlighting the params types\n ATTRIBUTE_HIGHLIGHT, // highlight the params key\n OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting\n ]);\n\n // Add the optional property assignment highlighting for objects or classes\n tsLanguage.contains = tsLanguage.contains.concat([\n DECORATOR,\n NAMESPACE,\n INTERFACE,\n OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting\n ]);\n\n // TS gets a simpler shebang rule than JS\n swapMode(tsLanguage, \"shebang\", hljs.SHEBANG());\n // JS use strict rule purposely excludes `asm` which makes no sense\n swapMode(tsLanguage, \"use_strict\", USE_STRICT);\n\n const functionDeclaration = tsLanguage.contains.find(m => m.label === \"func.def\");\n functionDeclaration.relevance = 0; // () => {} is more typical in TypeScript\n\n Object.assign(tsLanguage, {\n name: 'TypeScript',\n aliases: [\n 'ts',\n 'tsx',\n 'mts',\n 'cts'\n ]\n });\n\n return tsLanguage;\n}\n\nexport { typescript as default };\n","const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\n\nconst KEYWORDS = [\n \"as\", // for exports\n \"in\",\n \"of\",\n \"if\",\n \"for\",\n \"while\",\n \"finally\",\n \"var\",\n \"new\",\n \"function\",\n \"do\",\n \"return\",\n \"void\",\n \"else\",\n \"break\",\n \"catch\",\n \"instanceof\",\n \"with\",\n \"throw\",\n \"case\",\n \"default\",\n \"try\",\n \"switch\",\n \"continue\",\n \"typeof\",\n \"delete\",\n \"let\",\n \"yield\",\n \"const\",\n \"class\",\n // JS handles these with a special rule\n // \"get\",\n // \"set\",\n \"debugger\",\n \"async\",\n \"await\",\n \"static\",\n \"import\",\n \"from\",\n \"export\",\n \"extends\",\n // It's reached stage 3, which is \"recommended for implementation\":\n \"using\"\n];\nconst LITERALS = [\n \"true\",\n \"false\",\n \"null\",\n \"undefined\",\n \"NaN\",\n \"Infinity\"\n];\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\nconst TYPES = [\n // Fundamental objects\n \"Object\",\n \"Function\",\n \"Boolean\",\n \"Symbol\",\n // numbers and dates\n \"Math\",\n \"Date\",\n \"Number\",\n \"BigInt\",\n // text\n \"String\",\n \"RegExp\",\n // Indexed collections\n \"Array\",\n \"Float32Array\",\n \"Float64Array\",\n \"Int8Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"Int16Array\",\n \"Int32Array\",\n \"Uint16Array\",\n \"Uint32Array\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n // Keyed collections\n \"Set\",\n \"Map\",\n \"WeakSet\",\n \"WeakMap\",\n // Structured data\n \"ArrayBuffer\",\n \"SharedArrayBuffer\",\n \"Atomics\",\n \"DataView\",\n \"JSON\",\n // Control abstraction objects\n \"Promise\",\n \"Generator\",\n \"GeneratorFunction\",\n \"AsyncFunction\",\n // Reflection\n \"Reflect\",\n \"Proxy\",\n // Internationalization\n \"Intl\",\n // WebAssembly\n \"WebAssembly\"\n];\n\nconst ERROR_TYPES = [\n \"Error\",\n \"EvalError\",\n \"InternalError\",\n \"RangeError\",\n \"ReferenceError\",\n \"SyntaxError\",\n \"TypeError\",\n \"URIError\"\n];\n\nconst BUILT_IN_GLOBALS = [\n \"setInterval\",\n \"setTimeout\",\n \"clearInterval\",\n \"clearTimeout\",\n\n \"require\",\n \"exports\",\n\n \"eval\",\n \"isFinite\",\n \"isNaN\",\n \"parseFloat\",\n \"parseInt\",\n \"decodeURI\",\n \"decodeURIComponent\",\n \"encodeURI\",\n \"encodeURIComponent\",\n \"escape\",\n \"unescape\"\n];\n\nconst BUILT_IN_VARIABLES = [\n \"arguments\",\n \"this\",\n \"super\",\n \"console\",\n \"window\",\n \"document\",\n \"localStorage\",\n \"sessionStorage\",\n \"module\",\n \"self\",\n \"global\" // Node.js\n];\n\nconst BUILT_INS = [].concat(\n BUILT_IN_GLOBALS,\n TYPES,\n ERROR_TYPES\n);\n\n/*\nLanguage: JavaScript\nDescription: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.\nCategory: common, scripting, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/JavaScript\n*/\n\n\n/** @type LanguageFn */\nfunction javascript(hljs) {\n const regex = hljs.regex;\n /**\n * Takes a string like \"<Booger\" and checks to see\n * if we can find a matching \"</Booger\" later in the\n * content.\n * @param {RegExpMatchArray} match\n * @param {{after:number}} param1\n */\n const hasClosingTag = (match, { after }) => {\n const tag = \"</\" + match[0].slice(1);\n const pos = match.input.indexOf(tag, after);\n return pos !== -1;\n };\n\n const IDENT_RE$1 = IDENT_RE;\n const FRAGMENT = {\n begin: '<>',\n end: '</>'\n };\n // to avoid some special cases inside isTrulyOpeningTag\n const XML_SELF_CLOSING = /<[A-Za-z0-9\\\\._:-]+\\s*\\/>/;\n const XML_TAG = {\n begin: /<[A-Za-z0-9\\\\._:-]+/,\n end: /\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,\n /**\n * @param {RegExpMatchArray} match\n * @param {CallbackResponse} response\n */\n isTrulyOpeningTag: (match, response) => {\n const afterMatchIndex = match[0].length + match.index;\n const nextChar = match.input[afterMatchIndex];\n if (\n // HTML should not include another raw `<` inside a tag\n // nested type?\n // `<Array<Array<number>>`, etc.\n nextChar === \"<\" ||\n // the , gives away that this is not HTML\n // `<T, A extends keyof T, V>`\n nextChar === \",\"\n ) {\n response.ignoreMatch();\n return;\n }\n\n // `<something>`\n // Quite possibly a tag, lets look for a matching closing tag...\n if (nextChar === \">\") {\n // if we cannot find a matching closing tag, then we\n // will ignore it\n if (!hasClosingTag(match, { after: afterMatchIndex })) {\n response.ignoreMatch();\n }\n }\n\n // `<blah />` (self-closing)\n // handled by simpleSelfClosing rule\n\n let m;\n const afterMatch = match.input.substring(afterMatchIndex);\n\n // some more template typing stuff\n // <T = any>(key?: string) => Modify<\n if ((m = afterMatch.match(/^\\s*=/))) {\n response.ignoreMatch();\n return;\n }\n\n // `<From extends string>`\n // technically this could be HTML, but it smells like a type\n // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276\n if ((m = afterMatch.match(/^\\s+extends\\s+/))) {\n if (m.index === 0) {\n response.ignoreMatch();\n // eslint-disable-next-line no-useless-return\n return;\n }\n }\n }\n };\n const KEYWORDS$1 = {\n $pattern: IDENT_RE,\n keyword: KEYWORDS,\n literal: LITERALS,\n built_in: BUILT_INS,\n \"variable.language\": BUILT_IN_VARIABLES\n };\n\n // https://tc39.es/ecma262/#sec-literals-numeric-literals\n const decimalDigits = '[0-9](_?[0-9])*';\n const frac = `\\\\.(${decimalDigits})`;\n // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;\n const NUMBER = {\n className: 'number',\n variants: [\n // DecimalLiteral\n { begin: `(\\\\b(${decimalInteger})((${frac})|\\\\.)?|(${frac}))` +\n `[eE][+-]?(${decimalDigits})\\\\b` },\n { begin: `\\\\b(${decimalInteger})\\\\b((${frac})\\\\b|\\\\.)?|(${frac})\\\\b` },\n\n // DecimalBigIntegerLiteral\n { begin: `\\\\b(0|[1-9](_?[0-9])*)n\\\\b` },\n\n // NonDecimalIntegerLiteral\n { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\" },\n { begin: \"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\" },\n { begin: \"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\" },\n\n // LegacyOctalIntegerLiteral (does not include underscore separators)\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n { begin: \"\\\\b0[0-7]+n?\\\\b\" },\n ],\n relevance: 0\n };\n\n const SUBST = {\n className: 'subst',\n begin: '\\\\$\\\\{',\n end: '\\\\}',\n keywords: KEYWORDS$1,\n contains: [] // defined later\n };\n const HTML_TEMPLATE = {\n begin: '\\.?html`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'xml'\n }\n };\n const CSS_TEMPLATE = {\n begin: '\\.?css`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'css'\n }\n };\n const GRAPHQL_TEMPLATE = {\n begin: '\\.?gql`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'graphql'\n }\n };\n const TEMPLATE_STRING = {\n className: 'string',\n begin: '`',\n end: '`',\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ]\n };\n const JSDOC_COMMENT = hljs.COMMENT(\n /\\/\\*\\*(?!\\/)/,\n '\\\\*/',\n {\n relevance: 0,\n contains: [\n {\n begin: '(?=@[A-Za-z]+)',\n relevance: 0,\n contains: [\n {\n className: 'doctag',\n begin: '@[A-Za-z]+'\n },\n {\n className: 'type',\n begin: '\\\\{',\n end: '\\\\}',\n excludeEnd: true,\n excludeBegin: true,\n relevance: 0\n },\n {\n className: 'variable',\n begin: IDENT_RE$1 + '(?=\\\\s*(-)|$)',\n endsParent: true,\n relevance: 0\n },\n // eat spaces (not newlines) so we can find\n // types or variables\n {\n begin: /(?=[^\\n])\\s/,\n relevance: 0\n }\n ]\n }\n ]\n }\n );\n const COMMENT = {\n className: \"comment\",\n variants: [\n JSDOC_COMMENT,\n hljs.C_BLOCK_COMMENT_MODE,\n hljs.C_LINE_COMMENT_MODE\n ]\n };\n const SUBST_INTERNALS = [\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n // This is intentional:\n // See https://github.com/highlightjs/highlight.js/issues/3288\n // hljs.REGEXP_MODE\n ];\n SUBST.contains = SUBST_INTERNALS\n .concat({\n // we need to pair up {} inside our subst to prevent\n // it from ending too early by matching another }\n begin: /\\{/,\n end: /\\}/,\n keywords: KEYWORDS$1,\n contains: [\n \"self\"\n ].concat(SUBST_INTERNALS)\n });\n const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);\n const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([\n // eat recursive parens in sub expressions\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n keywords: KEYWORDS$1,\n contains: [\"self\"].concat(SUBST_AND_COMMENTS)\n }\n ]);\n const PARAMS = {\n className: 'params',\n // convert this to negative lookbehind in v12\n begin: /(\\s*)\\(/, // to match the parms with\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n };\n\n // ES6 classes\n const CLASS_OR_EXTENDS = {\n variants: [\n // class Car extends vehicle\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1,\n /\\s+/,\n /extends/,\n /\\s+/,\n regex.concat(IDENT_RE$1, \"(\", regex.concat(/\\./, IDENT_RE$1), \")*\")\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\",\n 5: \"keyword\",\n 7: \"title.class.inherited\"\n }\n },\n // class Car\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n },\n\n ]\n };\n\n const CLASS_REFERENCE = {\n relevance: 0,\n match:\n regex.either(\n // Hard coded exceptions\n /\\bJSON/,\n // Float32Array, OutT\n /\\b[A-Z][a-z]+([A-Z][a-z]*|\\d)*/,\n // CSSFactory, CSSFactoryT\n /\\b[A-Z]{2,}([A-Z][a-z]+|\\d)+([A-Z][a-z]*)*/,\n // FPs, FPsT\n /\\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\\d)*([A-Z][a-z]*)*/,\n // P\n // single letters are not highlighted\n // BLAH\n // this will be flagged as a UPPER_CASE_CONSTANT instead\n ),\n className: \"title.class\",\n keywords: {\n _: [\n // se we still get relevance credit for JS library classes\n ...TYPES,\n ...ERROR_TYPES\n ]\n }\n };\n\n const USE_STRICT = {\n label: \"use_strict\",\n className: 'meta',\n relevance: 10,\n begin: /^\\s*['\"]use (strict|asm)['\"]/\n };\n\n const FUNCTION_DEFINITION = {\n variants: [\n {\n match: [\n /function/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\s*\\()/\n ]\n },\n // anonymous function\n {\n match: [\n /function/,\n /\\s*(?=\\()/\n ]\n }\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n label: \"func.def\",\n contains: [ PARAMS ],\n illegal: /%/\n };\n\n const UPPER_CASE_CONSTANT = {\n relevance: 0,\n match: /\\b[A-Z][A-Z_0-9]+\\b/,\n className: \"variable.constant\"\n };\n\n function noneOf(list) {\n return regex.concat(\"(?!\", list.join(\"|\"), \")\");\n }\n\n const FUNCTION_CALL = {\n match: regex.concat(\n /\\b/,\n noneOf([\n ...BUILT_IN_GLOBALS,\n \"super\",\n \"import\",\n \"await\",\n ].map(x => `${x}\\\\s*\\\\(`)),\n IDENT_RE$1, regex.lookahead(/\\s*\\(/)),\n className: \"title.function\",\n relevance: 0\n };\n\n const PROPERTY_ACCESS = {\n begin: regex.concat(/\\./, regex.lookahead(\n regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)\n )),\n end: IDENT_RE$1,\n excludeBegin: true,\n keywords: \"prototype\",\n className: \"property\",\n relevance: 0\n };\n\n const GETTER_OR_SETTER = {\n match: [\n /get|set/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\()/\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n { // eat to avoid empty params\n begin: /\\(\\)/\n },\n PARAMS\n ]\n };\n\n const FUNC_LEAD_IN_RE = '(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\\\s*=>';\n\n const FUNCTION_VARIABLE = {\n match: [\n /const|var|let/, /\\s+/,\n IDENT_RE$1, /\\s*/,\n /=\\s*/,\n /(async\\s*)?/, // async is optional\n regex.lookahead(FUNC_LEAD_IN_RE)\n ],\n keywords: \"async\",\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n PARAMS\n ]\n };\n\n return {\n name: 'JavaScript',\n aliases: ['js', 'jsx', 'mjs', 'cjs'],\n keywords: KEYWORDS$1,\n // this will be extended by TypeScript\n exports: { PARAMS_CONTAINS, CLASS_REFERENCE },\n illegal: /#(?![$_A-Za-z])/,\n contains: [\n hljs.SHEBANG({\n label: \"shebang\",\n binary: \"node\",\n relevance: 5\n }),\n USE_STRICT,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n COMMENT,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n CLASS_REFERENCE,\n {\n scope: 'attr',\n match: IDENT_RE$1 + regex.lookahead(':'),\n relevance: 0\n },\n FUNCTION_VARIABLE,\n { // \"value\" container\n begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n keywords: 'return throw case',\n relevance: 0,\n contains: [\n COMMENT,\n hljs.REGEXP_MODE,\n {\n className: 'function',\n // we have to count the parens to make sure we actually have the\n // correct bounding ( ) before the =>. There could be any number of\n // sub-expressions inside also surrounded by parens.\n begin: FUNC_LEAD_IN_RE,\n returnBegin: true,\n end: '\\\\s*=>',\n contains: [\n {\n className: 'params',\n variants: [\n {\n begin: hljs.UNDERSCORE_IDENT_RE,\n relevance: 0\n },\n {\n className: null,\n begin: /\\(\\s*\\)/,\n skip: true\n },\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n }\n ]\n }\n ]\n },\n { // could be a comma delimited list of params to a function call\n begin: /,/,\n relevance: 0\n },\n {\n match: /\\s+/,\n relevance: 0\n },\n { // JSX\n variants: [\n { begin: FRAGMENT.begin, end: FRAGMENT.end },\n { match: XML_SELF_CLOSING },\n {\n begin: XML_TAG.begin,\n // we carefully check the opening tag to see if it truly\n // is a tag and not a false positive\n 'on:begin': XML_TAG.isTrulyOpeningTag,\n end: XML_TAG.end\n }\n ],\n subLanguage: 'xml',\n contains: [\n {\n begin: XML_TAG.begin,\n end: XML_TAG.end,\n skip: true,\n contains: ['self']\n }\n ]\n }\n ],\n },\n FUNCTION_DEFINITION,\n {\n // prevent this from getting swallowed up by function\n // since they appear \"function like\"\n beginKeywords: \"while if switch catch for\"\n },\n {\n // we have to count the parens to make sure we actually have the correct\n // bounding ( ). There could be any number of sub-expressions inside\n // also surrounded by parens.\n begin: '\\\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +\n '\\\\(' + // first parens\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)\\\\s*\\\\{', // end parens\n returnBegin:true,\n label: \"func.def\",\n contains: [\n PARAMS,\n hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: \"title.function\" })\n ]\n },\n // catch ... so it won't trigger the property rule below\n {\n match: /\\.\\.\\./,\n relevance: 0\n },\n PROPERTY_ACCESS,\n // hack: prevents detection of keywords in some circumstances\n // .keyword()\n // $keyword = x\n {\n match: '\\\\$' + IDENT_RE$1,\n relevance: 0\n },\n {\n match: [ /\\bconstructor(?=\\s*\\()/ ],\n className: { 1: \"title.function\" },\n contains: [ PARAMS ]\n },\n FUNCTION_CALL,\n UPPER_CASE_CONSTANT,\n CLASS_OR_EXTENDS,\n GETTER_OR_SETTER,\n {\n match: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n }\n ]\n };\n}\n\nexport { javascript as default };\n","// https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10\nvar decimalDigits = '[0-9](_*[0-9])*';\nvar frac = `\\\\.(${decimalDigits})`;\nvar hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*';\nvar NUMERIC = {\n className: 'number',\n variants: [\n // DecimalFloatingPointLiteral\n // including ExponentPart\n { begin: `(\\\\b(${decimalDigits})((${frac})|\\\\.)?|(${frac}))` +\n `[eE][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n // excluding ExponentPart\n { begin: `\\\\b(${decimalDigits})((${frac})[fFdD]?\\\\b|\\\\.([fFdD]\\\\b)?)` },\n { begin: `(${frac})[fFdD]?\\\\b` },\n { begin: `\\\\b(${decimalDigits})[fFdD]\\\\b` },\n\n // HexadecimalFloatingPointLiteral\n { begin: `\\\\b0[xX]((${hexDigits})\\\\.?|(${hexDigits})?\\\\.(${hexDigits}))` +\n `[pP][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n\n // DecimalIntegerLiteral\n { begin: '\\\\b(0|[1-9](_*[0-9])*)[lL]?\\\\b' },\n\n // HexIntegerLiteral\n { begin: `\\\\b0[xX](${hexDigits})[lL]?\\\\b` },\n\n // OctalIntegerLiteral\n { begin: '\\\\b0(_*[0-7])*[lL]?\\\\b' },\n\n // BinaryIntegerLiteral\n { begin: '\\\\b0[bB][01](_*[01])*[lL]?\\\\b' },\n ],\n relevance: 0\n};\n\n/*\nLanguage: Java\nAuthor: Vsevolod Solovyov <vsevolod.solovyov@gmail.com>\nCategory: common, enterprise\nWebsite: https://www.java.com/\n*/\n\n\n/**\n * Allows recursive regex expressions to a given depth\n *\n * ie: recurRegex(\"(abc~~~)\", /~~~/g, 2) becomes:\n * (abc(abc(abc)))\n *\n * @param {string} re\n * @param {RegExp} substitution (should be a g mode regex)\n * @param {number} depth\n * @returns {string}``\n */\nfunction recurRegex(re, substitution, depth) {\n if (depth === -1) return \"\";\n\n return re.replace(substitution, _ => {\n return recurRegex(re, substitution, depth - 1);\n });\n}\n\n/** @type LanguageFn */\nfunction java(hljs) {\n const regex = hljs.regex;\n\n // A Java identifier consisting of letters, digits, underscore or dollar sign, not beginning with a digit\n const JAVA_IDENT_RE = '[\\u00C0-\\u02B8a-zA-Z_$][\\u00C0-\\u02B8a-zA-Z_$0-9]*';\n\n // Optional 1..n pairs of square brackets identifying an array type\n const ARRAY_BRACKETS_OPTIONAL_RE = '(?:(?:\\\\s*\\\\[\\\\s*])+)?';\n\n // A simple Java type: a type name, optionally followed by type arguments and/or array brackets\n // '<@@@>' is replaced with the pattern for optional type arguments by recurRegex below.\n const SIMPLE_TYPE_RE = JAVA_IDENT_RE + '<@@@>' + ARRAY_BRACKETS_OPTIONAL_RE;\n\n // A bounded (? extends Number) or unbounded (?) wildcard type\n const WILDCARD_TYPE_RE = '\\\\?(?:\\\\s+(?:extends|super)\\\\s+' + SIMPLE_TYPE_RE + ')?';\n\n // A Java type argument, consisting of a wildcard or simple type\n const TYPE_ARG_RE = '(?:' + WILDCARD_TYPE_RE + '|' + SIMPLE_TYPE_RE + ')';\n\n // Pattern for optional generic type arguments in angle brackets with up to 2 levels of nested type arguments\n const TYPE_ARGS_OPTIONAL_RE = recurRegex('(?:\\\\s*<\\\\s*' + TYPE_ARG_RE + '(?:\\\\s*,\\\\s*' + TYPE_ARG_RE + ')*\\\\s*>)?',\n /<@@@>/g, 2);\n\n const MAIN_KEYWORDS = [\n 'synchronized',\n 'abstract',\n 'private',\n 'var',\n 'static',\n 'if',\n 'const ',\n 'for',\n 'while',\n 'strictfp',\n 'finally',\n 'protected',\n 'import',\n 'native',\n 'final',\n 'void',\n 'enum',\n 'else',\n 'break',\n 'transient',\n 'catch',\n 'instanceof',\n 'volatile',\n 'case',\n 'assert',\n 'package',\n 'default',\n 'public',\n 'try',\n 'switch',\n 'continue',\n 'throws',\n 'protected',\n 'public',\n 'private',\n 'module',\n 'requires',\n 'exports',\n 'do',\n 'sealed',\n 'yield',\n 'permits',\n 'goto',\n 'when'\n ];\n\n const BUILT_INS = [\n 'super',\n 'this'\n ];\n\n const LITERALS = [\n 'false',\n 'true',\n 'null'\n ];\n\n const TYPES = [\n 'char',\n 'boolean',\n 'long',\n 'float',\n 'int',\n 'byte',\n 'short',\n 'double'\n ];\n\n const KEYWORDS = {\n keyword: MAIN_KEYWORDS,\n literal: LITERALS,\n type: TYPES,\n built_in: BUILT_INS\n };\n\n const ANNOTATION = {\n className: 'meta',\n begin: '@' + JAVA_IDENT_RE,\n contains: [\n {\n begin: /\\(/,\n end: /\\)/,\n contains: [ \"self\" ] // allow nested () inside our annotation\n }\n ]\n };\n const PARAMS = {\n className: 'params',\n begin: /\\(/,\n end: /\\)/,\n keywords: KEYWORDS,\n relevance: 0,\n contains: [ hljs.C_BLOCK_COMMENT_MODE ],\n endsParent: true\n };\n\n return {\n name: 'Java',\n aliases: [ 'jsp' ],\n keywords: KEYWORDS,\n illegal: /<\\/|#/,\n contains: [\n hljs.COMMENT(\n '/\\\\*\\\\*',\n '\\\\*/',\n {\n relevance: 0,\n contains: [\n {\n // eat up @'s in emails to prevent them to be recognized as doctags\n begin: /\\w+@/,\n relevance: 0\n },\n {\n className: 'doctag',\n begin: '@[A-Za-z]+'\n }\n ]\n }\n ),\n // relevance boost\n {\n begin: /import java\\.[a-z]+\\./,\n keywords: \"import\",\n relevance: 2\n },\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n {\n begin: /\"\"\"/,\n end: /\"\"\"/,\n className: \"string\",\n contains: [ hljs.BACKSLASH_ESCAPE ]\n },\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n {\n match: [\n /\\b(?:class|interface|enum|extends|implements|new)/,\n /\\s+/,\n JAVA_IDENT_RE\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n },\n {\n // Exceptions for hyphenated keywords\n match: /non-sealed/,\n scope: \"keyword\"\n },\n {\n // Expression keywords prevent keyword-led expressions from being\n // recognized as variable or method declarations.\n beginKeywords: 'new throw return else yield assert',\n relevance: 0\n },\n {\n begin: [\n JAVA_IDENT_RE,\n regex.concat(TYPE_ARGS_OPTIONAL_RE, ARRAY_BRACKETS_OPTIONAL_RE, /\\s+/),\n JAVA_IDENT_RE,\n ARRAY_BRACKETS_OPTIONAL_RE,\n /\\s*/,\n /=(?!=)/\n ],\n className: {\n 1: \"type\",\n 3: \"variable\",\n 6: \"operator\"\n }\n },\n {\n begin: [\n /record/,\n /\\s+/,\n JAVA_IDENT_RE\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.class\"\n },\n contains: [\n PARAMS,\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n {\n begin: [\n JAVA_IDENT_RE,\n regex.concat(TYPE_ARGS_OPTIONAL_RE, ARRAY_BRACKETS_OPTIONAL_RE, /\\s+/),\n JAVA_IDENT_RE,\n /\\s*(?=\\()/\n ],\n className: {\n 1: \"type\",\n 3: \"title.function\"\n },\n keywords: KEYWORDS,\n contains: [\n {\n className: 'params',\n begin: /\\(/,\n end: /\\)/,\n keywords: KEYWORDS,\n relevance: 0,\n contains: [\n ANNOTATION,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n NUMERIC,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n NUMERIC,\n ANNOTATION\n ]\n };\n}\n\nexport { java as default };\n","import { unified } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkRehype from \"remark-rehype\";\nimport remarkStringify from \"remark-stringify\";\nimport rehypeStringify from \"rehype-stringify\";\nimport rehypeParse from \"rehype-parse\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeRemark from \"rehype-remark\";\nimport rehypeSanitize, { defaultSchema } from \"rehype-sanitize\";\nimport rehypeHighlight from \"rehype-highlight\";\nimport { visit } from \"unist-util-visit\";\nimport type { Root as MdastRoot, RootContent } from \"mdast\";\nimport type { Root as HastRoot, Element, ElementContent } from \"hast\";\nimport type { State } from \"hast-util-to-mdast\";\nimport json from \"highlight.js/lib/languages/json\";\nimport sql from \"highlight.js/lib/languages/sql\";\nimport typescript from \"highlight.js/lib/languages/typescript\";\nimport javascript from \"highlight.js/lib/languages/javascript\";\nimport java from \"highlight.js/lib/languages/java\";\n\nconst HIGHLIGHT_LANGUAGES = { json, sql, typescript, javascript, java };\n\n/**\n * `rehype-sanitize`'s default (GFM) schema strips `class` from `code`/`span`,\n * which would silently discard the `hljs-*` classes rehype-highlight just\n * added. Extend it explicitly so exported HTML keeps the highlighting.\n */\nconst sanitizeSchemaWithHighlight = {\n ...defaultSchema,\n attributes: {\n ...defaultSchema.attributes,\n code: [...(defaultSchema.attributes?.code ?? []), \"className\"],\n span: [...(defaultSchema.attributes?.span ?? []), \"className\"],\n },\n};\n\nexport interface PipelineOptions {\n sanitize: boolean;\n}\n\nconst STRINGIFY_OPTIONS = {\n bullet: \"-\",\n listItemIndent: \"one\",\n fences: true,\n rule: \"-\",\n} as const;\n\nfunction isElement(node: ElementContent | HastRoot): node is Element {\n return node.type === \"element\";\n}\n\n/**\n * Replaces mdast raw-html nodes before remark-rehype so the WYSIWYG editor\n * can round-trip them byte-exact: block HTML becomes a placeholder element\n * carrying the encoded source; inline HTML degrades to visible plain text\n * (best effort, never executed).\n */\nfunction embedRawHtml() {\n return (tree: MdastRoot): void => {\n visit(tree, \"html\", (node, index, parent) => {\n if (parent === undefined || index === undefined) return;\n if (parent.type === \"paragraph\") {\n parent.children[index] = { type: \"text\", value: node.value };\n } else {\n const placeholder = {\n type: \"htmlEmbed\",\n data: {\n hName: \"div\",\n hProperties: { dataRawHtml: encodeURIComponent(node.value) },\n },\n };\n parent.children[index] = placeholder as unknown as RootContent;\n }\n });\n };\n}\n\n/**\n * remark-gfm emits `<li class=\"task-list-item\"><input …>` but Tiptap's\n * TaskList/TaskItem extensions only parse `data-type` attributes, so GFM\n * checklists would silently downgrade to plain lists without this rewrite.\n */\nfunction taskListsToTiptap() {\n return (tree: HastRoot): void => {\n visit(tree, \"element\", (node) => {\n if (node.tagName !== \"li\") return;\n const classes = Array.isArray(node.properties.className)\n ? node.properties.className\n : [];\n if (!classes.includes(\"task-list-item\")) return;\n\n let checked = false;\n node.children = node.children.filter((child) => {\n if (isElement(child) && child.tagName === \"input\") {\n checked = child.properties.checked === true;\n return false;\n }\n return true;\n });\n node.properties.dataType = \"taskItem\";\n node.properties.dataChecked = String(checked);\n node.properties.className = undefined;\n });\n visit(tree, \"element\", (node) => {\n if (node.tagName !== \"ul\") return;\n const hasTaskItem = node.children.some(\n (child) => isElement(child) && child.properties.dataType === \"taskItem\",\n );\n if (hasTaskItem) {\n node.properties.dataType = \"taskList\";\n node.properties.className = undefined;\n }\n });\n };\n}\n\n/**\n * Inverse of taskListsToTiptap: Tiptap wraps task item content in\n * `<label><input …></label><div>…</div>`, which hast-util-to-mdast does not\n * recognize as a GFM task item. Rewrites to `<li><input …> content`.\n */\nfunction tiptapTaskListsToGfm() {\n return (tree: HastRoot): void => {\n visit(tree, \"element\", (node) => {\n if (node.tagName !== \"li\" || node.properties.dataType !== \"taskItem\") {\n return;\n }\n const checked = node.properties.dataChecked === \"true\";\n const content: ElementContent[] = [];\n for (const child of node.children) {\n if (isElement(child) && child.tagName === \"label\") continue;\n if (isElement(child) && child.tagName === \"div\") {\n content.push(...child.children);\n } else {\n content.push(child);\n }\n }\n const checkbox: Element = {\n type: \"element\",\n tagName: \"input\",\n properties: { type: \"checkbox\", checked, disabled: true },\n children: [],\n };\n node.children = [checkbox, ...content];\n });\n };\n}\n\n/**\n * Tiptap wraps every list item's content in `<p>`, which hast-util-to-mdast\n * interprets as a loose list (blank lines between items). Unwrapping the\n * single paragraph keeps serialized lists tight/canonical.\n */\nfunction tightenListItems() {\n return (tree: HastRoot): void => {\n visit(tree, \"element\", (node) => {\n if (node.tagName !== \"li\") return;\n const paragraphs = node.children.filter(\n (child) => isElement(child) && child.tagName === \"p\",\n );\n if (paragraphs.length !== 1) return;\n node.children = node.children.flatMap((child) =>\n isElement(child) && child.tagName === \"p\" ? child.children : [child],\n );\n });\n };\n}\n\n/** Markdown (GFM) → HTML listo para `editor.commands.setContent`. */\nexport function markdownToEditorHtml(markdown: string): string {\n const file = unified()\n .use(remarkParse)\n .use(remarkGfm)\n .use(embedRawHtml)\n .use(remarkRehype)\n .use(taskListsToTiptap)\n .use(rehypeStringify)\n .processSync(markdown);\n return String(file);\n}\n\n/** HTML emitido por Tiptap (`editor.getHTML()`) → Markdown (GFM). */\nexport function editorHtmlToMarkdown(html: string): string {\n const file = unified()\n .use(rehypeParse, { fragment: true })\n .use(tiptapTaskListsToGfm)\n .use(tightenListItems)\n .use(rehypeRemark, {\n handlers: {\n div(state: State, node: Element) {\n const raw = node.properties.dataRawHtml;\n if (typeof raw === \"string\") {\n return { type: \"html\" as const, value: decodeURIComponent(raw) };\n }\n return state.all(node);\n },\n },\n })\n .use(remarkGfm)\n .use(remarkStringify, STRINGIFY_OPTIONS)\n .processSync(html);\n return String(file);\n}\n\n/** Markdown (GFM) → HTML completo para exportación (FR-013, FR-017). */\nexport function markdownToHtml(\n markdown: string,\n options: PipelineOptions,\n): string {\n const processor = unified()\n .use(remarkParse)\n .use(remarkGfm)\n .use(remarkRehype, { allowDangerousHtml: true })\n .use(rehypeRaw)\n .use(rehypeHighlight, {\n languages: HIGHLIGHT_LANGUAGES,\n ignoreMissing: true,\n });\n const withSanitize = options.sanitize\n ? processor.use(rehypeSanitize, sanitizeSchemaWithHighlight)\n : processor;\n const file = withSanitize.use(rehypeStringify).processSync(markdown);\n return String(file);\n}\n\n/** Sanitiza un fragmento HTML aislado (bloques de HTML embebido, FR-022). */\nexport function sanitizeHtmlFragment(html: string): string {\n const file = unified()\n .use(rehypeParse, { fragment: true })\n .use(rehypeSanitize)\n .use(rehypeStringify)\n .processSync(html);\n return String(file);\n}\n","/**\n * Carga perezosa de `mermaid`: la librería es pesada y solo hace falta cuando\n * un documento contiene diagramas, así que nunca se importa estáticamente\n * (Principios VIII y XII, research.md §4).\n */\n\ntype MermaidModule = typeof import(\"mermaid\").default;\n\nlet mermaidPromise: Promise<MermaidModule> | null = null;\n\n/** Carga (una sola vez) e inicializa mermaid con configuración segura. */\nexport async function loadMermaid(): Promise<MermaidModule> {\n if (mermaidPromise === null) {\n mermaidPromise = import(\"mermaid\").then((module) => {\n const mermaid = module.default;\n // `strict` escapa el HTML de las etiquetas y deshabilita los callbacks\n // de clic: el contenido puede venir de HTML pegado por el usuario, así\n // que se trata como no confiable (research.md §3).\n mermaid.initialize({ startOnLoad: false, securityLevel: \"strict\" });\n return mermaid;\n });\n }\n return mermaidPromise;\n}\n\n/**\n * Filtro barato previo: evita cargar la librería completa de Mermaid en el\n * caso común (pegar HTML que claramente no es un diagrama). No decide por sí\n * solo — lo que confirma es siempre `mermaid.parse` (research.md §4).\n */\nconst MERMAID_KEYWORDS =\n /^\\s*(graph|flowchart|sequenceDiagram|classDiagram|stateDiagram(-v2)?|erDiagram|journey|gantt|pie|gitGraph|mindmap|timeline|quadrantChart|requirementDiagram|C4Context|sankey(-beta)?|xychart(-beta)?|block(-beta)?|packet(-beta)?|architecture(-beta)?|kanban|radar|treemap)\\b/;\n\n/** `true` si el texto es un diagrama Mermaid sintácticamente válido. */\nexport async function isMermaidSyntax(text: string): Promise<boolean> {\n const trimmed = text.trim();\n if (trimmed === \"\") return false;\n if (!MERMAID_KEYWORDS.test(trimmed)) return false;\n try {\n const mermaid = await loadMermaid();\n const result = await mermaid.parse(trimmed, { suppressErrors: true });\n return result !== false;\n } catch {\n return false;\n }\n}\n\nlet renderCounter = 0;\n\n/**\n * Renderiza `source` a SVG. Devuelve `null` si la sintaxis es inválida, para\n * que el llamador degrade a texto legible sin romper el documento (FR-008).\n */\nexport async function renderMermaid(source: string): Promise<string | null> {\n const trimmed = source.trim();\n if (trimmed === \"\") return null;\n if (!MERMAID_KEYWORDS.test(trimmed)) return null;\n try {\n const mermaid = await loadMermaid();\n const valid = await mermaid.parse(trimmed, { suppressErrors: true });\n if (valid === false) return null;\n renderCounter += 1;\n const { svg } = await mermaid.render(`mdw-mermaid-${renderCounter}`, trimmed);\n return svg;\n } catch {\n return null;\n }\n}\n","import type { Editor } from \"@tiptap/core\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\n\n/**\n * Mapeo aproximado de posición de cursor entre la vista Markdown (offset de\n * carácter en el texto fuente) y la vista WYSIWYG (posición de documento\n * ProseMirror).\n *\n * El mapeo se basa en el texto plano acumulado: se cuenta cuánto texto\n * \"visible\" precede a la posición en cada representación y se busca el punto\n * equivalente en la otra. No es byte-exacto cuando el Markdown usa sintaxis\n * que no aparece en el texto renderizado (marcadores como `**`, `#`, `|`),\n * por eso la spec lo define como mejor esfuerzo (FR-006).\n */\n\n/** Caracteres de sintaxis Markdown que no forman parte del texto renderizado. */\nconst MARKDOWN_SYNTAX = /[*_`~#>\\-+|[\\]()!]/;\n\n/**\n * Cuenta caracteres de texto \"visible\" (excluyendo sintaxis Markdown obvia y\n * espacios de indentación) en `markdown` hasta `offset`.\n */\nfunction visibleTextLengthUpTo(markdown: string, offset: number): number {\n let count = 0;\n const limit = Math.min(offset, markdown.length);\n for (let i = 0; i < limit; i += 1) {\n const char = markdown[i];\n if (char === undefined) continue;\n if (char === \"\\n\") {\n count += 1;\n continue;\n }\n if (MARKDOWN_SYNTAX.test(char)) continue;\n count += 1;\n }\n return count;\n}\n\n/** Texto visible acumulado del documento ProseMirror hasta `pos`. */\nfunction visibleTextLengthUpToPos(doc: ProseMirrorNode, pos: number): number {\n const clamped = Math.max(0, Math.min(pos, doc.content.size));\n // textBetween con separador de bloque \"\\n\" aproxima el texto tal como se ve.\n return doc.textBetween(0, clamped, \"\\n\", \"\\n\").length;\n}\n\n/**\n * Markdown offset → posición ProseMirror equivalente (aproximada).\n * Devuelve una posición siempre dentro del rango válido del documento.\n */\nexport function markdownOffsetToProseMirrorPos(\n markdown: string,\n offset: number,\n doc: ProseMirrorNode,\n): number {\n const target = visibleTextLengthUpTo(markdown, offset);\n if (target <= 0) return 0;\n\n const docSize = doc.content.size;\n let best = 0;\n let bestDelta = Number.POSITIVE_INFINITY;\n\n // Búsqueda lineal sobre posiciones del documento: el documento es de tamaño\n // moderado por diseño (spec 003, SC-006), así que es suficiente y evita\n // mantener un índice paralelo.\n for (let pos = 0; pos <= docSize; pos += 1) {\n const delta = Math.abs(visibleTextLengthUpToPos(doc, pos) - target);\n if (delta < bestDelta) {\n bestDelta = delta;\n best = pos;\n if (delta === 0) break;\n }\n }\n return best;\n}\n\n/**\n * Posición ProseMirror → offset equivalente en el Markdown fuente\n * (aproximado). Devuelve un offset siempre dentro del rango del string.\n */\nexport function proseMirrorPosToMarkdownOffset(\n editor: Editor,\n pos: number,\n markdown: string,\n): number {\n const target = visibleTextLengthUpToPos(editor.state.doc, pos);\n if (target <= 0) return 0;\n\n let best = 0;\n let bestDelta = Number.POSITIVE_INFINITY;\n for (let offset = 0; offset <= markdown.length; offset += 1) {\n const delta = Math.abs(visibleTextLengthUpTo(markdown, offset) - target);\n if (delta < bestDelta) {\n bestDelta = delta;\n best = offset;\n if (delta === 0) break;\n }\n }\n return best;\n}\n","import type { Editor } from \"@tiptap/core\";\nimport {\n isInTable,\n moveTableColumn,\n moveTableRow,\n selectedRect,\n} from \"@tiptap/pm/tables\";\n\nexport type MoveDirection = \"before\" | \"after\";\n\n/**\n * Mueve la columna actual una posición hacia `direction`. Sin efecto si ya\n * está en el borde correspondiente de la tabla (FR-005, edge case de límites).\n */\nexport function moveCurrentColumn(\n editor: Editor,\n direction: MoveDirection,\n): void {\n const { state } = editor.view;\n if (!isInTable(state)) return;\n\n const rect = selectedRect(state);\n const from = rect.left;\n const to = direction === \"before\" ? from - 1 : from + 1;\n if (to < 0 || to >= rect.map.width) return;\n\n moveTableColumn({ from, to })(state, editor.view.dispatch, editor.view);\n}\n\n/**\n * Mueve la fila actual una posición hacia `direction`. Sin efecto si ya está\n * en el borde correspondiente de la tabla (FR-005, edge case de límites).\n */\nexport function moveCurrentRow(\n editor: Editor,\n direction: MoveDirection,\n): void {\n const { state } = editor.view;\n if (!isInTable(state)) return;\n\n const rect = selectedRect(state);\n const from = rect.top;\n const to = direction === \"before\" ? from - 1 : from + 1;\n // La fila 0 es el encabezado: las filas de datos no deben moverse a ella ni\n // el encabezado desplazarse hacia abajo.\n if (to < 1 || to >= rect.map.height) return;\n\n moveTableRow({ from, to })(state, editor.view.dispatch, editor.view);\n}\n","import { EditorContent, type Editor } from \"@tiptap/react\";\n\nexport interface RenderedViewProps {\n editor: Editor | null;\n}\n\nexport function RenderedView({ editor }: RenderedViewProps) {\n return <EditorContent editor={editor} />;\n}\n","import { forwardRef } from \"react\";\nimport styles from \"../MarkdownEditor.module.css\";\n\nexport interface MarkdownSourceViewProps {\n value: string;\n onChange: (value: string) => void;\n readOnly?: boolean;\n}\n\nexport const MarkdownSourceView = forwardRef<\n HTMLTextAreaElement,\n MarkdownSourceViewProps\n>(function MarkdownSourceView({ value, onChange, readOnly = false }, ref) {\n return (\n <textarea\n ref={ref}\n className={styles[\"source\"]}\n aria-label=\"Código fuente Markdown\"\n spellCheck={false}\n value={value}\n readOnly={readOnly}\n onChange={(event) => onChange(event.target.value)}\n />\n );\n});\n",".root {\n --mdw-border: #d0d4da;\n --mdw-bg: #ffffff;\n --mdw-fg: #1f2328;\n --mdw-muted: #f6f7f9;\n --mdw-accent: #3d6fd8;\n --mdw-toolbar-gradient-from: #eeeeee;\n --mdw-toolbar-gradient-via: #dcdcdc;\n --mdw-toolbar-gradient-to: #cfcfcf;\n --mdw-toolbar-fg: #222222;\n --mdw-toolbar-font-family: Arial, sans-serif;\n --mdw-toolbar-select-bg: #e9e9e9;\n --mdw-button-active-bg: #c8c8c8;\n --mdw-button-hover-gradient-from: #ffffff;\n --mdw-button-hover-gradient-to: #d8d8d8;\n --mdw-content-bg: var(--mdw-bg);\n --mdw-content-markdown-fg: var(--mdw-fg);\n --mdw-content-markdown-font-family: ui-monospace, Consolas, monospace;\n --mdw-content-wysiwyg-fg: var(--mdw-fg);\n --mdw-content-wysiwyg-font-family: inherit;\n --mdw-scrollbar-thumb: #c1c1c1;\n --mdw-scrollbar-track: transparent;\n --mdw-table-header-bg: var(--mdw-muted);\n --mdw-code-block-bg: var(--mdw-muted);\n --mdw-mermaid-bg: var(--mdw-muted);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--mdw-border);\n border-radius: 6px;\n background: var(--mdw-bg);\n color: var(--mdw-fg);\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n font-size: 14px;\n overflow: hidden;\n}\n\n.resizable {\n resize: both;\n overflow: auto;\n min-width: 320px;\n min-height: 200px;\n}\n\n.root *,\n.root *::before,\n.root *::after {\n box-sizing: inherit;\n}\n\n.content {\n flex: 1;\n min-height: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n background: var(--mdw-content-bg);\n scrollbar-color: var(--mdw-scrollbar-thumb) var(--mdw-scrollbar-track);\n}\n\n.content::-webkit-scrollbar-thumb,\n.source::-webkit-scrollbar-thumb,\n.toolbar::-webkit-scrollbar-thumb {\n background: var(--mdw-scrollbar-thumb);\n border-radius: 4px;\n}\n\n.content::-webkit-scrollbar-track,\n.source::-webkit-scrollbar-track,\n.toolbar::-webkit-scrollbar-track {\n background: var(--mdw-scrollbar-track);\n}\n\n.content > div {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.content :global(.ProseMirror) {\n flex: 1;\n padding: 12px 16px;\n outline: none;\n white-space: pre-wrap;\n word-wrap: break-word;\n color: var(--mdw-content-wysiwyg-fg);\n font-family: var(--mdw-content-wysiwyg-font-family);\n}\n\n.content :global(.ProseMirror p) {\n margin: 0 0 0.6em;\n}\n\n.content :global(.ProseMirror pre) {\n background: var(--mdw-code-block-bg);\n border: 1px solid var(--mdw-border);\n border-radius: 4px;\n padding: 8px 12px;\n font-family: ui-monospace, Consolas, monospace;\n font-size: 13px;\n overflow-x: auto;\n}\n\n.content :global(.hljs-keyword),\n.content :global(.hljs-selector-tag),\n.content :global(.hljs-literal) {\n color: #a626a4;\n}\n\n.content :global(.hljs-string),\n.content :global(.hljs-attr) {\n color: #50a14f;\n}\n\n.content :global(.hljs-comment),\n.content :global(.hljs-quote) {\n color: #a0a1a7;\n font-style: italic;\n}\n\n.content :global(.hljs-number),\n.content :global(.hljs-built_in) {\n color: #986801;\n}\n\n.content :global(.hljs-title),\n.content :global(.hljs-title.function_),\n.content :global(.hljs-title.class_) {\n color: #4078f2;\n}\n\n.content :global(.ProseMirror table) {\n border-collapse: collapse;\n margin: 0.6em 0;\n}\n\n.content :global(.ProseMirror th),\n.content :global(.ProseMirror td) {\n border: 1px solid var(--mdw-border);\n padding: 4px 8px;\n min-width: 3em;\n}\n\n.content :global(.ProseMirror th) {\n background: var(--mdw-table-header-bg);\n}\n\n.content :global(.ProseMirror hr) {\n border: none;\n border-top: 2px solid var(--mdw-border);\n margin: 1em 0;\n}\n\n.content :global(.ProseMirror img) {\n max-width: 100%;\n}\n\n.content :global(.ProseMirror blockquote) {\n border-left: 3px solid var(--mdw-border);\n margin: 0.6em 0;\n padding-left: 12px;\n color: #57606a;\n}\n\n.content :global(.ProseMirror ul[data-type=\"taskList\"]) {\n list-style: none;\n padding-left: 0.25em;\n}\n\n.content :global(.ProseMirror ul[data-type=\"taskList\"] li) {\n display: flex;\n gap: 0.5em;\n}\n\n.content :global(.ProseMirror ul[data-type=\"taskList\"] li > div) {\n flex: 1;\n}\n\n.content :global(.ProseMirror div[data-html-block]) {\n border: 1px dashed var(--mdw-border);\n border-radius: 4px;\n padding: 6px 10px;\n margin: 0.6em 0;\n}\n\n.content :global(.ProseMirror div[data-mermaid-block]) {\n background: var(--mdw-mermaid-bg);\n border-radius: 4px;\n padding: 8px 12px;\n}\n\n.source {\n flex: 1;\n width: 100%;\n border: none;\n resize: none;\n outline: none;\n padding: 12px 16px;\n font-family: var(--mdw-content-markdown-font-family);\n font-size: 13px;\n line-height: 1.5;\n color: var(--mdw-content-markdown-fg);\n background: transparent;\n scrollbar-color: var(--mdw-scrollbar-thumb) var(--mdw-scrollbar-track);\n}\n\n.toolbar {\n position: relative;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n min-height: 36px;\n padding: 2px 3px;\n gap: 2px;\n background: linear-gradient(\n to bottom,\n var(--mdw-toolbar-gradient-from) 0%,\n var(--mdw-toolbar-gradient-via) 45%,\n var(--mdw-toolbar-gradient-to) 100%\n );\n color: var(--mdw-toolbar-fg);\n font-family: var(--mdw-toolbar-font-family);\n border-bottom: 1px solid #999;\n box-shadow:\n inset 0 1px 0 #fff,\n 0 1px 2px rgba(0, 0, 0, 0.15);\n overflow-x: auto;\n overflow-y: visible;\n scrollbar-color: var(--mdw-scrollbar-thumb) var(--mdw-scrollbar-track);\n}\n\n.readOnlyNotice {\n padding: 0 8px;\n font-size: 13px;\n font-style: italic;\n color: var(--mdw-toolbar-fg);\n font-family: var(--mdw-toolbar-font-family);\n}\n\n.toolbar > .button,\n.toolbar > .separator {\n flex-shrink: 0;\n}\n\n.separator {\n width: 1px;\n height: 25px;\n margin: 0 3px;\n background: #aaa;\n box-shadow: 1px 0 0 #fff;\n}\n\n.spacer {\n flex-shrink: 0;\n margin-left: auto;\n}\n\n.button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 29px;\n height: 29px;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 2px;\n background: transparent;\n color: var(--mdw-toolbar-fg);\n font-family: var(--mdw-toolbar-font-family);\n font-size: 15px;\n cursor: pointer;\n}\n\n.button svg {\n width: 17px;\n height: 17px;\n stroke: currentColor;\n fill: none;\n stroke-width: 1.8;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.button:hover:not(:disabled) {\n background: linear-gradient(\n to bottom,\n var(--mdw-button-hover-gradient-from),\n var(--mdw-button-hover-gradient-to)\n );\n border-color: #999;\n box-shadow:\n inset 0 1px 0 #fff,\n 0 1px 1px rgba(0, 0, 0, 0.15);\n}\n\n.button:active:not(:disabled),\n.button[aria-pressed=\"true\"] {\n background: var(--mdw-button-active-bg);\n border-color: #999;\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.25);\n}\n\n.button:focus-visible {\n outline: 2px solid var(--mdw-accent);\n outline-offset: 1px;\n}\n\n.button:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.textButton {\n width: auto;\n padding: 0 10px;\n font-size: 13px;\n}\n\n.boldGlyph {\n font-weight: bold;\n font-size: 17px;\n}\n\n.italicGlyph {\n font-family: Georgia, serif;\n font-style: italic;\n font-weight: bold;\n font-size: 17px;\n}\n\n.strikeGlyph {\n font-size: 16px;\n text-decoration: line-through;\n}\n\n.htmlIcon {\n font-family: ui-monospace, monospace;\n font-weight: bold;\n font-size: 11px;\n}\n\n.headingSelect {\n flex-shrink: 1;\n flex-basis: 118px;\n min-width: 30px;\n width: 118px;\n height: 29px;\n padding: 0 25px 0 9px;\n border: 1px solid #999;\n border-radius: 2px;\n background-color: var(--mdw-toolbar-select-bg);\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23222' stroke-width='1.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 8px center;\n color: var(--mdw-toolbar-fg);\n font-family: var(--mdw-toolbar-font-family);\n font-size: 13px;\n cursor: pointer;\n box-shadow: inset 0 1px 0 #fff;\n appearance: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.headingSelect:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.dialog {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 260px;\n max-width: calc(100vw - 24px);\n padding: 10px 12px;\n border: 1px solid var(--mdw-border);\n border-radius: 6px;\n background: var(--mdw-bg);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n box-sizing: border-box;\n}\n\n.dialogField {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: 12px;\n}\n\n.dialogField input,\n.dialogField textarea,\n.dialogField select {\n width: 100%;\n border: 1px solid var(--mdw-border);\n border-radius: 4px;\n padding: 4px 6px;\n font: inherit;\n font-size: 13px;\n}\n\n.dialogField textarea {\n resize: vertical;\n font-family: ui-monospace, Consolas, monospace;\n}\n\n.dialogActions {\n display: flex;\n gap: 6px;\n justify-content: flex-end;\n flex-wrap: nowrap;\n}\n\n.dialogActions button {\n flex: 0 0 auto;\n white-space: nowrap;\n}\n\n.tablePicker {\n align-items: center;\n min-width: 0;\n}\n\n.tablePickerLabel {\n font-size: 12px;\n text-align: center;\n min-height: 1.2em;\n}\n\n.tablePickerGrid {\n display: grid;\n gap: 2px;\n padding: 2px;\n}\n\n.tablePickerGrid:focus-visible {\n outline: 2px solid var(--mdw-accent);\n outline-offset: 2px;\n}\n\n.tablePickerCell {\n width: 16px;\n height: 16px;\n border: 1px solid #999;\n border-radius: 2px;\n background: var(--mdw-bg);\n cursor: pointer;\n}\n\n.tablePickerCell[data-selected=\"true\"] {\n background: #dbe4f8;\n border-color: var(--mdw-accent);\n}\n\n.menu {\n display: flex;\n flex-direction: column;\n min-width: 190px;\n padding: 4px;\n border: 1px solid var(--mdw-border);\n border-radius: 6px;\n background: var(--mdw-bg);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n}\n\n.menuItem {\n text-align: left;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: inherit;\n font: inherit;\n font-size: 13px;\n padding: 6px 8px;\n cursor: pointer;\n}\n\n.menuItem:hover,\n.menuItem:focus-visible {\n background: #e4e7eb;\n outline: none;\n}\n\n.menuSeparator {\n height: 1px;\n margin: 4px 2px;\n background: var(--mdw-border);\n border: none;\n}\n\n.dangerLink {\n align-self: flex-start;\n border: none;\n background: transparent;\n color: #b42318;\n font: inherit;\n font-size: 12px;\n text-decoration: underline;\n cursor: pointer;\n padding: 0;\n}\n\n.dangerLink:hover,\n.dangerLink:focus-visible {\n color: #8c1c11;\n outline: none;\n}\n","import { useEffect, useReducer, useState, type MouseEvent } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport type { ViewMode } from \"../types\";\nimport { ToolbarButton } from \"./buttons/ToolbarButton\";\nimport { InsertDialog, type DialogKind } from \"./buttons/InsertDialogs\";\nimport { TableSizePicker } from \"./buttons/TableSizePicker\";\nimport { CodeLanguagePicker } from \"./buttons/CodeLanguagePicker\";\nimport { FloatingPanel } from \"./buttons/FloatingPanel\";\nimport { ExportMenu } from \"./buttons/ExportMenu\";\nimport { Separator } from \"./buttons/Separator\";\nimport {\n IconCode,\n IconCodeBlock,\n IconBullets,\n IconNumbered,\n IconChecklist,\n IconIndent,\n IconOutdent,\n IconQuote,\n IconTable,\n IconLink,\n IconImage,\n IconHr,\n} from \"./buttons/icons\";\nimport styles from \"../MarkdownEditor.module.css\";\n\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\nconst HEADING_LEVELS: readonly HeadingLevel[] = [1, 2, 3, 4, 5, 6];\n\nexport interface ToolbarProps {\n editor: Editor | null;\n viewMode: ViewMode;\n onToggleView: () => void;\n source: string;\n sanitizeEmbeddedHtml: boolean;\n onlyView?: boolean;\n onlyViewNotice?: string;\n}\n\nexport function Toolbar({\n editor,\n viewMode,\n onToggleView,\n source,\n sanitizeEmbeddedHtml,\n onlyView = false,\n onlyViewNotice = \"Edición desactivada\",\n}: ToolbarProps) {\n const [, forceUpdate] = useReducer((count: number) => count + 1, 0);\n const [openDialog, setOpenDialog] = useState<\n DialogKind | \"table\" | \"codeLanguage\" | null\n >(null);\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n\n const openDialogAt = (\n kind: DialogKind | \"table\" | \"codeLanguage\",\n event: MouseEvent<HTMLElement>,\n ) => {\n setAnchor(event.currentTarget);\n setOpenDialog(kind);\n };\n\n useEffect(() => {\n if (!editor) return;\n editor.on(\"transaction\", forceUpdate);\n return () => {\n editor.off(\"transaction\", forceUpdate);\n };\n }, [editor]);\n\n if (onlyView) {\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Barra de herramientas\"\n className={styles[\"toolbar\"]}\n >\n <span className={styles[\"readOnlyNotice\"]}>{onlyViewNotice}</span>\n <div className={styles[\"spacer\"]}>\n <ExportMenu source={source} sanitize={sanitizeEmbeddedHtml} />\n </div>\n </div>\n );\n }\n\n const canFormat = viewMode === \"wysiwyg\" && editor !== null;\n\n const activeHeading = canFormat\n ? (HEADING_LEVELS.find((level) =>\n editor.isActive(\"heading\", { level }),\n ) ?? null)\n : null;\n\n const listItemType =\n canFormat && editor.isActive(\"taskItem\") ? \"taskItem\" : \"listItem\";\n\n const closeDialog = () => setOpenDialog(null);\n\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Barra de herramientas\"\n className={styles[\"toolbar\"]}\n >\n <ToolbarButton\n label=\"Ver código Markdown\"\n pressed={viewMode === \"markdown\"}\n onClick={onToggleView}\n >\n <IconCode />\n </ToolbarButton>\n\n <select\n className={styles[\"headingSelect\"]}\n aria-label=\"Nivel de encabezado\"\n disabled={!canFormat}\n value={activeHeading === null ? \"p\" : `h${activeHeading}`}\n onChange={(event) => {\n if (!editor) return;\n const value = event.target.value;\n if (value === \"p\") {\n editor.chain().focus().setParagraph().run();\n } else {\n const level = Number(value.slice(1)) as HeadingLevel;\n editor.chain().focus().setHeading({ level }).run();\n }\n }}\n >\n <option value=\"p\">Párrafo</option>\n {HEADING_LEVELS.map((level) => (\n <option key={level} value={`h${level}`}>\n Encabezado {level}\n </option>\n ))}\n </select>\n\n <ToolbarButton\n label=\"Negrita\"\n className={styles[\"boldGlyph\"]}\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"bold\")}\n onClick={() => editor?.chain().focus().toggleBold().run()}\n >\n B\n </ToolbarButton>\n <ToolbarButton\n label=\"Cursiva\"\n className={styles[\"italicGlyph\"]}\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"italic\")}\n onClick={() => editor?.chain().focus().toggleItalic().run()}\n >\n i\n </ToolbarButton>\n <ToolbarButton\n label=\"Tachado\"\n className={styles[\"strikeGlyph\"]}\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"strike\")}\n onClick={() => editor?.chain().focus().toggleStrike().run()}\n >\n S\n </ToolbarButton>\n\n <Separator />\n\n <ToolbarButton\n label=\"Lista con viñetas\"\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"bulletList\")}\n onClick={() => editor?.chain().focus().toggleBulletList().run()}\n >\n <IconBullets />\n </ToolbarButton>\n <ToolbarButton\n label=\"Lista ordenada\"\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"orderedList\")}\n onClick={() => editor?.chain().focus().toggleOrderedList().run()}\n >\n <IconNumbered />\n </ToolbarButton>\n <ToolbarButton\n label=\"Lista de tareas\"\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"taskList\")}\n onClick={() => editor?.chain().focus().toggleTaskList().run()}\n >\n <IconChecklist />\n </ToolbarButton>\n {canFormat && editor.can().sinkListItem(listItemType) && (\n <ToolbarButton\n label=\"Aumentar sangría\"\n onClick={() =>\n editor?.chain().focus().sinkListItem(listItemType).run()\n }\n >\n <IconIndent />\n </ToolbarButton>\n )}\n {canFormat && editor.can().liftListItem(listItemType) && (\n <ToolbarButton\n label=\"Disminuir sangría\"\n onClick={() =>\n editor?.chain().focus().liftListItem(listItemType).run()\n }\n >\n <IconOutdent />\n </ToolbarButton>\n )}\n\n <Separator />\n\n <ToolbarButton\n label=\"Bloque de código\"\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"codeBlock\")}\n onClick={(event) => openDialogAt(\"codeLanguage\", event)}\n >\n <IconCodeBlock />\n </ToolbarButton>\n <ToolbarButton\n label=\"Cita\"\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"blockquote\")}\n onClick={() => editor?.chain().focus().toggleBlockquote().run()}\n >\n <IconQuote />\n </ToolbarButton>\n <ToolbarButton\n label=\"Insertar tabla\"\n disabled={!canFormat}\n onClick={(event) => openDialogAt(\"table\", event)}\n >\n <IconTable />\n </ToolbarButton>\n <ToolbarButton\n label=\"Línea horizontal\"\n disabled={!canFormat}\n onClick={() => editor?.chain().focus().setHorizontalRule().run()}\n >\n <IconHr />\n </ToolbarButton>\n\n <Separator />\n\n <ToolbarButton\n label=\"Insertar enlace\"\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"link\")}\n onClick={(event) => openDialogAt(\"link\", event)}\n >\n <IconLink />\n </ToolbarButton>\n <ToolbarButton\n label=\"Insertar imagen\"\n disabled={!canFormat}\n onClick={(event) => openDialogAt(\"image\", event)}\n >\n <IconImage />\n </ToolbarButton>\n <ToolbarButton\n label=\"Insertar HTML\"\n disabled={!canFormat}\n onClick={(event) => openDialogAt(\"html\", event)}\n >\n <span className={styles[\"htmlIcon\"]}>HTML</span>\n </ToolbarButton>\n\n <div className={styles[\"spacer\"]}>\n <ExportMenu source={source} sanitize={sanitizeEmbeddedHtml} />\n </div>\n\n {openDialog === \"table\" && editor !== null && (\n <FloatingPanel anchor={anchor}>\n <TableSizePicker\n onSelect={({ cols, rows }) => {\n editor\n .chain()\n .focus()\n .insertTable({ rows, cols, withHeaderRow: true })\n .run();\n closeDialog();\n }}\n onClose={closeDialog}\n />\n </FloatingPanel>\n )}\n {openDialog === \"codeLanguage\" && editor !== null && (\n <FloatingPanel anchor={anchor}>\n <CodeLanguagePicker\n currentLanguage={\n (editor.getAttributes(\"codeBlock\")[\"language\"] as\n | string\n | undefined) ?? null\n }\n onSelect={(language) => {\n if (editor.isActive(\"codeBlock\")) {\n editor\n .chain()\n .focus()\n .updateAttributes(\"codeBlock\", { language })\n .run();\n } else {\n editor.chain().focus().toggleCodeBlock({ language }).run();\n }\n closeDialog();\n }}\n onClose={closeDialog}\n />\n </FloatingPanel>\n )}\n {openDialog !== null &&\n openDialog !== \"table\" &&\n openDialog !== \"codeLanguage\" &&\n editor !== null && (\n <FloatingPanel anchor={anchor}>\n <InsertDialog\n kind={openDialog}\n editor={editor}\n onClose={closeDialog}\n />\n </FloatingPanel>\n )}\n </div>\n );\n}\n","import type { ButtonHTMLAttributes } from \"react\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport interface ToolbarButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n label: string;\n pressed?: boolean;\n}\n\nexport function ToolbarButton({\n label,\n pressed,\n className,\n children,\n ...rest\n}: ToolbarButtonProps) {\n const buttonClass =\n className === undefined\n ? styles[\"button\"]\n : `${styles[\"button\"]} ${className}`;\n return (\n <button\n type=\"button\"\n className={buttonClass}\n aria-label={label}\n title={label}\n {...(pressed !== undefined ? { \"aria-pressed\": pressed } : {})}\n {...rest}\n >\n {children}\n </button>\n );\n}\n","import {\n useEffect,\n useId,\n useRef,\n useState,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport { ensureProtocol } from \"../../markdown/links\";\nimport { isMermaidSyntax } from \"../../markdown/mermaid\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport type DialogKind = \"image\" | \"link\" | \"html\";\n\ninterface DialogShellProps {\n title: string;\n onSubmit: () => void;\n onClose: () => void;\n children: ReactNode;\n}\n\nfunction DialogShell({ title, onSubmit, onClose, children }: DialogShellProps) {\n const ref = useRef<HTMLFormElement>(null);\n\n useEffect(() => {\n const first = ref.current?.querySelector<HTMLElement>(\"input, textarea\");\n first?.focus();\n }, []);\n\n const handleSubmit = (event: FormEvent) => {\n event.preventDefault();\n onSubmit();\n };\n\n return (\n <form\n ref={ref}\n className={styles[\"dialog\"]}\n role=\"dialog\"\n aria-label={title}\n onSubmit={handleSubmit}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n }}\n >\n {children}\n <div className={styles[\"dialogActions\"]}>\n <button\n type=\"button\"\n className={`${styles[\"button\"]} ${styles[\"textButton\"]}`}\n onClick={onClose}\n >\n Cancelar\n </button>\n <button\n type=\"submit\"\n className={`${styles[\"button\"]} ${styles[\"textButton\"]}`}\n >\n Insertar\n </button>\n </div>\n </form>\n );\n}\n\ninterface FieldProps {\n label: string;\n children: (id: string) => ReactNode;\n}\n\nfunction Field({ label, children }: FieldProps) {\n const id = useId();\n return (\n <div className={styles[\"dialogField\"]}>\n <label htmlFor={id}>{label}</label>\n {children(id)}\n </div>\n );\n}\n\nexport interface InsertDialogProps {\n kind: DialogKind;\n editor: Editor;\n onClose: () => void;\n}\n\nexport function InsertDialog({ kind, editor, onClose }: InsertDialogProps) {\n const [url, setUrl] = useState(\"\");\n const [text, setText] = useState(\"\");\n const [html, setHtml] = useState(\"\");\n // Leído una sola vez al montar: si hay selección activa, el enlace se\n // aplica sobre ese texto y no se pide un campo de texto adicional (FR-001,\n // FR-003). No reactivo a propósito — el diálogo no debe cambiar de forma\n // mientras está abierto si la selección cambiara por otra causa.\n const [hasSelectionForLink] = useState(\n () => kind === \"link\" && !editor.state.selection.empty,\n );\n\n const submit = () => {\n const chain = editor.chain().focus();\n if (kind === \"image\" && url) {\n chain.setImage({ src: url, alt: text }).run();\n } else if (kind === \"link\" && url) {\n const href = ensureProtocol(url);\n if (hasSelectionForLink) {\n chain.extendMarkRange(\"link\").setLink({ href }).run();\n } else if (text) {\n chain\n .insertContent({\n type: \"text\",\n text,\n marks: [{ type: \"link\", attrs: { href } }],\n })\n .run();\n }\n } else if (kind === \"html\" && html) {\n // La detección de Mermaid es asíncrona (carga perezosa de la librería):\n // se resuelve antes de decidir entre bloque de código Mermaid y HTML\n // embebido (FR-009).\n void isMermaidSyntax(html).then((isMermaid) => {\n if (isMermaid) {\n editor\n .chain()\n .focus()\n .insertContent({\n type: \"codeBlock\",\n attrs: { language: \"mermaid\" },\n content: [{ type: \"text\", text: html }],\n })\n .run();\n } else {\n editor\n .chain()\n .focus()\n .insertContent({ type: \"htmlBlock\", attrs: { content: html } })\n .run();\n }\n });\n onClose();\n return;\n }\n onClose();\n };\n\n if (kind === \"html\") {\n return (\n <DialogShell\n title=\"Insertar HTML embebido\"\n onSubmit={submit}\n onClose={onClose}\n >\n <Field label=\"Código HTML\">\n {(id) => (\n <textarea\n id={id}\n rows={4}\n value={html}\n onChange={(e) => setHtml(e.target.value)}\n />\n )}\n </Field>\n </DialogShell>\n );\n }\n\n const isImage = kind === \"image\";\n return (\n <DialogShell\n title={isImage ? \"Insertar imagen\" : \"Insertar enlace\"}\n onSubmit={submit}\n onClose={onClose}\n >\n <Field label={isImage ? \"URL de la imagen\" : \"URL del enlace\"}>\n {(id) => (\n <input\n id={id}\n type={isImage ? \"url\" : \"text\"}\n required\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n />\n )}\n </Field>\n {!(kind === \"link\" && hasSelectionForLink) && (\n <Field label={isImage ? \"Texto alternativo\" : \"Texto del enlace\"}>\n {(id) => (\n <input\n id={id}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n />\n )}\n </Field>\n )}\n </DialogShell>\n );\n}\n","/**\n * Anteponer \"http://\" cuando la URL no especifica protocolo. Uniforme: no\n * depende de que el valor empiece con \"www\" ni de ningún patrón textual\n * particular, solo de la ausencia de \"://\" (FR-004, FR-005, FR-006).\n */\nexport function ensureProtocol(url: string): string {\n return url.includes(\"://\") ? url : `http://${url}`;\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\n/** Convención: columnas × filas. \"3 × 4\" significa 3 columnas y 4 filas. */\nexport interface TableSize {\n cols: number;\n rows: number;\n}\n\nexport interface TableSizePickerProps {\n /** Columnas máximas de la cuadrícula. Default: 10. */\n maxCols?: number;\n /** Filas máximas de la cuadrícula. Default: 10. */\n maxRows?: number;\n /** Invocado al confirmar (clic o Enter) con la dimensión elegida. */\n onSelect: (size: TableSize) => void;\n /** Invocado al cancelar (Escape). */\n onClose: () => void;\n}\n\nexport function TableSizePicker({\n maxCols = 10,\n maxRows = 10,\n onSelect,\n onClose,\n}: TableSizePickerProps) {\n // null = ninguna celda seleccionada inicialmente\n const [size, setSize] = useState<TableSize | null>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n gridRef.current?.focus();\n }, []);\n\n const clamp = (value: number, max: number) =>\n Math.min(Math.max(value, 1), max);\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (size !== null) onSelect(size);\n return;\n }\n const deltas: Record<string, [number, number]> = {\n ArrowRight: [1, 0],\n ArrowLeft: [-1, 0],\n ArrowDown: [0, 1],\n ArrowUp: [0, -1],\n };\n const delta = deltas[event.key];\n if (delta === undefined) return;\n event.preventDefault();\n const current = size ?? { cols: 0, rows: 0 };\n setSize({\n cols: clamp(current.cols + delta[0], maxCols),\n rows: clamp(current.rows + delta[1], maxRows),\n });\n };\n\n const label =\n size === null ? \"Selecciona el tamaño\" : `${size.cols} × ${size.rows}`;\n\n return (\n <div\n className={`${styles[\"dialog\"]} ${styles[\"tablePicker\"]}`}\n role=\"dialog\"\n aria-label=\"Insertar tabla\"\n >\n <div className={styles[\"tablePickerLabel\"]} aria-live=\"polite\">\n {label}\n </div>\n <div\n ref={gridRef}\n className={styles[\"tablePickerGrid\"]}\n style={{ gridTemplateColumns: `repeat(${maxCols}, 16px)` }}\n tabIndex={0}\n role=\"group\"\n aria-label=\"Tamaño de la tabla (columnas × filas)\"\n onKeyDown={handleKeyDown}\n >\n {Array.from({ length: maxRows }, (_, rowIndex) =>\n Array.from({ length: maxCols }, (_, colIndex) => {\n const cell: TableSize = {\n cols: colIndex + 1,\n rows: rowIndex + 1,\n };\n const selected =\n size !== null &&\n cell.cols <= size.cols &&\n cell.rows <= size.rows;\n return (\n <div\n key={`${cell.cols}x${cell.rows}`}\n className={styles[\"tablePickerCell\"]}\n data-cell={`${cell.cols}x${cell.rows}`}\n data-selected={selected ? \"true\" : \"false\"}\n aria-hidden=\"true\"\n onMouseEnter={() => setSize(cell)}\n onClick={() => onSelect(cell)}\n />\n );\n }),\n )}\n </div>\n </div>\n );\n}\n","import { useEffect, useId, useRef, useState } from \"react\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport const CODE_LANGUAGES = [\n { value: \"json\", label: \"JSON\" },\n { value: \"sql\", label: \"SQL\" },\n { value: \"typescript\", label: \"TypeScript\" },\n { value: \"javascript\", label: \"JavaScript\" },\n { value: \"java\", label: \"Java\" },\n] as const;\n\nexport type CodeLanguageValue =\n | (typeof CODE_LANGUAGES)[number][\"value\"]\n | \"other\";\n\nexport interface CodeLanguagePickerProps {\n /** Lenguaje actualmente aplicado al bloque de código (o null si no hay uno activo). */\n currentLanguage: string | null;\n onSelect: (language: string) => void;\n onClose: () => void;\n}\n\nexport function CodeLanguagePicker({\n currentLanguage,\n onSelect,\n onClose,\n}: CodeLanguagePickerProps) {\n const isKnown = CODE_LANGUAGES.some(\n (lang) => lang.value === currentLanguage,\n );\n const [choice, setChoice] = useState<CodeLanguageValue>(\n isKnown ? (currentLanguage as CodeLanguageValue) : \"other\",\n );\n const [otherValue, setOtherValue] = useState(\n !isKnown && currentLanguage ? currentLanguage : \"\",\n );\n const formRef = useRef<HTMLFormElement>(null);\n const otherFieldId = useId();\n\n useEffect(() => {\n formRef.current?.querySelector<HTMLElement>(\"select\")?.focus();\n }, []);\n\n const submit = () => {\n const language = choice === \"other\" ? otherValue.trim() : choice;\n if (language) onSelect(language);\n };\n\n return (\n <form\n ref={formRef}\n className={styles[\"dialog\"]}\n role=\"dialog\"\n aria-label=\"Lenguaje del bloque de código\"\n onSubmit={(event) => {\n event.preventDefault();\n submit();\n }}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n }}\n >\n <div className={styles[\"dialogField\"]}>\n <label htmlFor=\"mdw-code-language\">Lenguaje</label>\n <select\n id=\"mdw-code-language\"\n value={choice}\n onChange={(event) =>\n setChoice(event.target.value as CodeLanguageValue)\n }\n >\n {CODE_LANGUAGES.map((lang) => (\n <option key={lang.value} value={lang.value}>\n {lang.label}\n </option>\n ))}\n <option value=\"other\">Otro…</option>\n </select>\n </div>\n {choice === \"other\" && (\n <div className={styles[\"dialogField\"]}>\n <label htmlFor={otherFieldId}>Especificar lenguaje</label>\n <input\n id={otherFieldId}\n type=\"text\"\n value={otherValue}\n onChange={(event) => setOtherValue(event.target.value)}\n />\n </div>\n )}\n <div className={styles[\"dialogActions\"]}>\n <button\n type=\"button\"\n className={`${styles[\"button\"]} ${styles[\"textButton\"]}`}\n onClick={onClose}\n >\n Cancelar\n </button>\n <button\n type=\"submit\"\n className={`${styles[\"button\"]} ${styles[\"textButton\"]}`}\n >\n Aplicar\n </button>\n </div>\n </form>\n );\n}\n","import { useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport interface FloatingPanelProps {\n /** Elemento ancla (normalmente el botón que abrió el panel). */\n anchor: HTMLElement | null;\n /** Alineación horizontal del panel respecto al ancla. */\n align?: \"start\" | \"end\";\n /** Enfoca el primer elemento interactivo del contenido al montarse. */\n autoFocus?: boolean;\n children: ReactNode;\n}\n\n/**\n * Renderiza su contenido en un portal a `document.body`, posicionado con\n * `position: fixed` a partir del rect del ancla. Evita que el panel quede\n * recortado por el `overflow` de la toolbar (necesario para el scroll\n * horizontal de la barra) o del contenedor raíz del componente.\n */\nexport function FloatingPanel({\n anchor,\n align = \"start\",\n autoFocus = false,\n children,\n}: FloatingPanelProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<{\n top: number;\n left?: number;\n right?: number;\n } | null>(null);\n\n useLayoutEffect(() => {\n if (!anchor) return;\n const rect = anchor.getBoundingClientRect();\n if (align === \"end\") {\n setStyle({\n top: rect.bottom,\n right: Math.max(0, window.innerWidth - rect.right),\n });\n } else {\n setStyle({ top: rect.bottom, left: rect.left });\n }\n }, [anchor, align]);\n\n useLayoutEffect(() => {\n if (style === null || !autoFocus) return;\n panelRef.current\n ?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )\n ?.focus();\n // Solo al aparecer: no queremos robar el foco en cada reposicionamiento.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [style !== null]);\n\n if (style === null) return null;\n\n return createPortal(\n <div\n ref={panelRef}\n className={styles[\"root\"]}\n style={{\n position: \"fixed\",\n top: style.top,\n left: style.left,\n right: style.right,\n zIndex: 1000,\n // El wrapper solo restablece las custom properties/tipografía del\n // componente para el contenido portado; no debe verse como una caja.\n border: \"none\",\n overflow: \"visible\",\n background: \"transparent\",\n width: \"auto\",\n height: \"auto\",\n }}\n >\n {children}\n </div>,\n document.body,\n );\n}\n","import { useRef, useState } from \"react\";\nimport { markdownToHtml } from \"../../markdown/pipeline\";\nimport { IconDownload } from \"./icons\";\nimport { FloatingPanel } from \"./FloatingPanel\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport interface ExportMenuProps {\n source: string;\n sanitize: boolean;\n}\n\nexport function ExportMenu({ source, sanitize }: ExportMenuProps) {\n const [open, setOpen] = useState(false);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n const close = () => {\n setOpen(false);\n buttonRef.current?.focus();\n };\n\n const copy = (content: string) => {\n void navigator.clipboard.writeText(content);\n close();\n };\n\n return (\n <>\n <button\n ref={buttonRef}\n type=\"button\"\n className={styles[\"button\"]}\n aria-label=\"Export\"\n title=\"Export\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n >\n <IconDownload />\n </button>\n {open && (\n <FloatingPanel anchor={buttonRef.current} align=\"end\" autoFocus>\n <div\n role=\"menu\"\n aria-label=\"Exportar contenido\"\n className={styles[\"menu\"]}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n close();\n }\n }}\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles[\"menuItem\"]}\n onClick={() => copy(source)}\n >\n Copiar como Markdown\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles[\"menuItem\"]}\n onClick={() => copy(markdownToHtml(source, { sanitize }))}\n >\n Copiar como HTML\n </button>\n </div>\n </FloatingPanel>\n )}\n </>\n );\n}\n","import type { SVGProps } from \"react\";\n\ntype IconProps = SVGProps<SVGSVGElement>;\n\nconst base = { viewBox: \"0 0 24 24\", \"aria-hidden\": true } as const;\n\nexport function IconCode(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M9 7L4 12L9 17\" />\n <path d=\"M15 7L20 12L15 17\" />\n <path d=\"M14 4L10 20\" />\n </svg>\n );\n}\n\nexport function IconCodeBlock(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M8 6L3 12L8 18\" />\n <path d=\"M16 6L21 12L16 18\" />\n </svg>\n );\n}\n\nexport function IconBullets(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <circle cx=\"4\" cy=\"6\" r=\"1\" />\n <circle cx=\"4\" cy=\"12\" r=\"1\" />\n <circle cx=\"4\" cy=\"18\" r=\"1\" />\n <path d=\"M9 6H21\" />\n <path d=\"M9 12H21\" />\n <path d=\"M9 18H21\" />\n </svg>\n );\n}\n\nexport function IconNumbered(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M4 5H5V9\" />\n <path d=\"M3 9H6\" />\n <path d=\"M3 13H6\" />\n <path d=\"M3 17C3 15 6 15 6 17C6 19 3 19 3 19H6\" />\n <path d=\"M10 6H21\" />\n <path d=\"M10 12H21\" />\n <path d=\"M10 18H21\" />\n </svg>\n );\n}\n\nexport function IconChecklist(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <rect x=\"3\" y=\"3\" width=\"6\" height=\"6\" />\n <path d=\"M4 6L6 8L9 4\" />\n <path d=\"M12 6H21\" />\n <rect x=\"3\" y=\"14\" width=\"6\" height=\"6\" />\n <path d=\"M12 17H21\" />\n </svg>\n );\n}\n\nexport function IconIndent(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M3 6H21\" />\n <path d=\"M11 12H21\" />\n <path d=\"M3 18H21\" />\n <path d=\"M3 9.5L6 12L3 14.5\" />\n </svg>\n );\n}\n\nexport function IconOutdent(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M3 6H21\" />\n <path d=\"M11 12H21\" />\n <path d=\"M3 18H21\" />\n <path d=\"M6 9.5L3 12L6 14.5\" />\n </svg>\n );\n}\n\nexport function IconQuote(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M7 8H4V12H8V8C8 5 6 4 4 4\" />\n <path d=\"M17 8H14V12H18V8C18 5 16 4 14 4\" />\n </svg>\n );\n}\n\nexport function IconTable(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" />\n <path d=\"M3 10H21\" />\n <path d=\"M3 15H21\" />\n <path d=\"M9 4V20\" />\n <path d=\"M15 4V20\" />\n </svg>\n );\n}\n\nexport function IconLink(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M10 13C11.5 14.5 14 14.5 15.5 13L18 10.5C20 8.5 20 5.5 18 3.5C16 1.5 13 1.5 11 3.5L9.5 5\" />\n <path d=\"M14 11C12.5 9.5 10 9.5 8.5 11L6 13.5C4 15.5 4 18.5 6 20.5C8 22.5 11 22.5 13 20.5L14.5 19\" />\n </svg>\n );\n}\n\nexport function IconImage(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" />\n <circle cx=\"8\" cy=\"9\" r=\"2\" />\n <path d=\"M3 17L8 12L12 16L15 13L21 19\" />\n </svg>\n );\n}\n\nexport function IconHr(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M3 12H21\" />\n <path d=\"M6 6H18\" opacity=\"0.35\" />\n <path d=\"M6 18H18\" opacity=\"0.35\" />\n </svg>\n );\n}\n\nexport function IconDownload(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M12 3V15\" />\n <path d=\"M7 10L12 15L17 10\" />\n <path d=\"M4 19H20\" />\n </svg>\n );\n}\n","import styles from \"../../MarkdownEditor.module.css\";\n\nexport function Separator() {\n return <span className={styles[\"separator\"]} aria-hidden=\"true\" />;\n}\n","import { useEffect, useId, useRef, useState } from \"react\";\nimport { ensureProtocol } from \"../../markdown/links\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport interface LinkPopoverProps {\n url: string;\n onlyView: boolean;\n onNavigate: () => void;\n onCopy: () => void;\n onSave: (newUrl: string) => void;\n onRemove: () => void;\n onClose: () => void;\n}\n\nexport function LinkPopover({\n url,\n onlyView,\n onNavigate,\n onCopy,\n onSave,\n onRemove,\n onClose,\n}: LinkPopoverProps) {\n const [mode, setMode] = useState<\"menu\" | \"edit\">(\"menu\");\n const [inputValue, setInputValue] = useState(url);\n const rootRef = useRef<HTMLDivElement>(null);\n const inputId = useId();\n\n useEffect(() => {\n if (mode === \"edit\") {\n rootRef.current?.querySelector<HTMLInputElement>(\"input\")?.focus();\n }\n }, [mode]);\n\n useEffect(() => {\n const handlePointerDown = (event: PointerEvent) => {\n if (\n rootRef.current !== null &&\n !rootRef.current.contains(event.target as Node)\n ) {\n onClose();\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [onClose]);\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n };\n\n const save = () => {\n if (!inputValue) return;\n onSave(ensureProtocol(inputValue));\n };\n\n if (mode === \"edit\") {\n return (\n <div\n ref={rootRef}\n className={styles[\"dialog\"]}\n role=\"dialog\"\n aria-label=\"Editar enlace\"\n onKeyDown={handleKeyDown}\n >\n <div className={styles[\"dialogField\"]}>\n <label htmlFor={inputId}>URL del enlace</label>\n <input\n id={inputId}\n type=\"text\"\n value={inputValue}\n onChange={(event) => setInputValue(event.target.value)}\n />\n </div>\n <button\n type=\"button\"\n className={styles[\"dangerLink\"]}\n onClick={onRemove}\n >\n Eliminar link\n </button>\n <div className={styles[\"dialogActions\"]}>\n <button\n type=\"button\"\n className={`${styles[\"button\"]} ${styles[\"textButton\"]}`}\n onClick={save}\n >\n Guardar\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={rootRef}\n role=\"menu\"\n aria-label=\"Acciones del enlace\"\n className={styles[\"menu\"]}\n onKeyDown={handleKeyDown}\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles[\"menuItem\"]}\n onClick={onNavigate}\n >\n Ir a la url\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles[\"menuItem\"]}\n onClick={onCopy}\n >\n Copiar url\n </button>\n {!onlyView && (\n <>\n <hr className={styles[\"menuSeparator\"]} />\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles[\"menuItem\"]}\n onClick={() => setMode(\"edit\")}\n >\n Editar url\n </button>\n </>\n )}\n </div>\n );\n}\n","import { Fragment, useEffect, useRef } from \"react\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport interface TableMenuAction {\n label: string;\n onSelect: () => void;\n /** Inserta un separador visual antes de esta acción. */\n separatorBefore?: boolean;\n}\n\nexport interface TableContextMenuProps {\n ariaLabel: string;\n actions: TableMenuAction[];\n onClose: () => void;\n}\n\n/**\n * Menú flotante genérico de acciones sobre una tabla (columna o fila). Sigue\n * el mismo patrón de `LinkPopover` en modo \"menu\": cierre con Escape o clic\n * fuera, sin aplicar ninguna acción (Principio IV, VI).\n */\nexport function TableContextMenu({\n ariaLabel,\n actions,\n onClose,\n}: TableContextMenuProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handlePointerDown = (event: PointerEvent) => {\n if (\n rootRef.current !== null &&\n !rootRef.current.contains(event.target as Node)\n ) {\n onClose();\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [onClose]);\n\n return (\n <div\n ref={rootRef}\n role=\"menu\"\n aria-label={ariaLabel}\n className={styles[\"menu\"]}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n }}\n >\n {actions.map((action) => (\n <Fragment key={action.label}>\n {action.separatorBefore === true && (\n <hr className={styles[\"menuSeparator\"]} />\n )}\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles[\"menuItem\"]}\n onClick={action.onSelect}\n >\n {action.label}\n </button>\n </Fragment>\n ))}\n </div>\n );\n}\n"],"mappings":"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CA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAKA,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA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","names":["import_react","import_core","LITERALS","LITERALS","TYPES","KEYWORDS","decimalDigits","frac","TYPES","IDENT_RE","KEYWORDS","LITERALS","TYPES","ERROR_TYPES","BUILT_IN_GLOBALS","BUILT_IN_VARIABLES","BUILT_INS","javascript","decimalDigits","frac","BUILT_INS","LITERALS","TYPES","KEYWORDS","javascript","remarkParse","remarkGfm","remarkRehype","rehypeStringify","rehypeParse","rehypeRemark","remarkStringify","rehypeRaw","rehypeHighlight","rehypeSanitize","module","javascript","CodeBlockLowlight","StarterKit","Table","TableRow","TableHeader","TableCell","TaskList","TaskItem","Link","Image","import_react","import_jsx_runtime","MarkdownSourceView","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","_","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","MarkdownEditor"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/MarkdownEditor/MarkdownEditor.tsx","../src/components/MarkdownEditor/markdown/tiptapMarkdownBridge.ts","../node_modules/highlight.js/es/languages/json.js","../node_modules/highlight.js/es/languages/sql.js","../node_modules/highlight.js/es/languages/typescript.js","../node_modules/highlight.js/es/languages/javascript.js","../node_modules/highlight.js/es/languages/java.js","../src/components/MarkdownEditor/markdown/pipeline.ts","../src/components/MarkdownEditor/markdown/mermaid.ts","../src/components/MarkdownEditor/markdown/cursorMapping.ts","../src/components/MarkdownEditor/markdown/tableCommands.ts","../src/components/MarkdownEditor/markdown/trailingLine.ts","../src/components/MarkdownEditor/views/RenderedView.tsx","../src/components/MarkdownEditor/views/MarkdownSourceView.tsx","../src/components/MarkdownEditor/MarkdownEditor.module.css","../src/components/MarkdownEditor/Toolbar/Toolbar.tsx","../src/components/MarkdownEditor/Toolbar/buttons/ToolbarButton.tsx","../src/components/MarkdownEditor/Toolbar/buttons/InsertDialogs.tsx","../src/components/MarkdownEditor/markdown/links.ts","../src/components/MarkdownEditor/Toolbar/buttons/TableSizePicker.tsx","../src/components/MarkdownEditor/Toolbar/buttons/CodeLanguagePicker.tsx","../src/components/MarkdownEditor/Toolbar/buttons/FloatingPanel.tsx","../src/components/MarkdownEditor/Toolbar/buttons/ExportMenu.tsx","../src/components/MarkdownEditor/Toolbar/buttons/icons.tsx","../src/components/MarkdownEditor/Toolbar/buttons/Separator.tsx","../src/components/MarkdownEditor/Toolbar/buttons/LinkPopover.tsx","../src/components/MarkdownEditor/Toolbar/buttons/TableContextMenu.tsx"],"sourcesContent":["export { MarkdownEditor } from \"./components/MarkdownEditor\";\nexport type {\n MarkdownEditorProps,\n MarkdownEditorHandle,\n} from \"./components/MarkdownEditor\";\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useEditor } from \"@tiptap/react\";\nimport { getMarkRange, type Range } from \"@tiptap/core\";\nimport { TextSelection } from \"@tiptap/pm/state\";\nimport {\n createEditorExtensions,\n editorToMarkdown,\n markdownToEditorContent,\n} from \"./markdown/tiptapMarkdownBridge\";\nimport {\n markdownOffsetToProseMirrorPos,\n proseMirrorPosToMarkdownOffset,\n} from \"./markdown/cursorMapping\";\nimport { moveCurrentColumn, moveCurrentRow } from \"./markdown/tableCommands\";\nimport {\n ensureTrailingParagraph,\n handleBlankAreaMouseDown,\n} from \"./markdown/trailingLine\";\nimport { RenderedView } from \"./views/RenderedView\";\nimport { MarkdownSourceView } from \"./views/MarkdownSourceView\";\nimport { Toolbar } from \"./Toolbar/Toolbar\";\nimport { LinkPopover } from \"./Toolbar/buttons/LinkPopover\";\nimport { TableContextMenu } from \"./Toolbar/buttons/TableContextMenu\";\nimport { FloatingPanel } from \"./Toolbar/buttons/FloatingPanel\";\nimport type {\n MarkdownEditorHandle,\n MarkdownEditorProps,\n ViewMode,\n} from \"./types\";\nimport styles from \"./MarkdownEditor.module.css\";\n\ninterface LinkPopoverState {\n url: string;\n range: Range;\n anchor: HTMLElement;\n}\n\ninterface TableMenuState {\n kind: \"column\" | \"row\";\n anchor: HTMLElement;\n}\n\nfunction toCssSize(value: number | string): string {\n return typeof value === \"number\" ? `${value}px` : value;\n}\n\nexport const MarkdownEditor = forwardRef<\n MarkdownEditorHandle,\n MarkdownEditorProps\n>(function MarkdownEditor(\n {\n initialContent = \"\",\n onChange,\n width = 700,\n height = 500,\n sanitizeEmbeddedHtml = true,\n className,\n onlyView = false,\n resizable = true,\n onlyViewNotice,\n resolveImageSrc,\n },\n ref,\n) {\n const [source, setSource] = useState(initialContent);\n const [viewMode, setViewMode] = useState<ViewMode>(\"wysiwyg\");\n const effectiveViewMode: ViewMode = onlyView ? \"wysiwyg\" : viewMode;\n const [linkPopover, setLinkPopover] = useState<LinkPopoverState | null>(\n null,\n );\n const [tableMenu, setTableMenu] = useState<TableMenuState | null>(null);\n // Celda de tabla que tenía el cursor antes del clic actual: un segundo clic\n // sobre la misma celda abre el menú en vez de solo reposicionar (FR-002).\n const lastFocusedCellPosRef = useRef<number | null>(null);\n // Valor con el que se montó el componente: referencia para reset()/\n // isModified() (FR-015, FR-016).\n const originalContentRef = useRef(initialContent);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Refs keep the editor's onUpdate closure valid across renders without\n // recreating the editor when onChange or source change.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const sourceRef = useRef(source);\n sourceRef.current = source;\n const resolveImageSrcRef = useRef(resolveImageSrc);\n resolveImageSrcRef.current = resolveImageSrc;\n const hasImageResolver = resolveImageSrc !== undefined;\n\n const extensions = useMemo(\n () =>\n createEditorExtensions({\n sanitizeEmbeddedHtml,\n resolveImageSrc: hasImageResolver ? () => resolveImageSrcRef.current : undefined,\n }),\n [sanitizeEmbeddedHtml, hasImageResolver],\n );\n\n const editor = useEditor(\n {\n extensions,\n content: markdownToEditorContent(sourceRef.current),\n editable: !onlyView,\n editorProps: {\n attributes: {\n role: \"textbox\",\n \"aria-multiline\": \"true\",\n \"aria-label\": \"Editor de texto enriquecido\",\n },\n handleDOMEvents: {\n // Clic en el área libre tras el último bloque → línea posterior.\n mousedown: handleBlankAreaMouseDown,\n click(view, event) {\n const target = event.target;\n if (!(target instanceof Element)) return false;\n\n // --- Tabla: segundo clic sobre la celda ya enfocada abre el menú\n const cellEl = target.closest(\"th, td\");\n if (cellEl !== null && view.dom.contains(cellEl)) {\n // Un arrastre para seleccionar texto también dispara \"click\":\n // con una selección no vacía, el usuario está seleccionando\n // contenido, no pidiendo el menú contextual.\n if (!view.state.selection.empty) {\n lastFocusedCellPosRef.current = null;\n return false;\n }\n const cellPos = view.posAtDOM(cellEl, 0);\n if (lastFocusedCellPosRef.current === cellPos) {\n event.preventDefault();\n // Anclar la selección dentro de la celda: los comandos de\n // tabla (addColumnAfter, selectedRect, …) operan sobre la\n // posición del cursor, y `preventDefault` impide que\n // ProseMirror la fije por su cuenta.\n const tr = view.state.tr.setSelection(\n TextSelection.near(view.state.doc.resolve(cellPos + 1)),\n );\n view.dispatch(tr);\n setTableMenu({\n kind: cellEl.tagName === \"TH\" ? \"column\" : \"row\",\n anchor: cellEl as HTMLElement,\n });\n return true;\n }\n lastFocusedCellPosRef.current = cellPos;\n return false;\n }\n // Clic fuera de cualquier celda: el próximo clic en una celda\n // cuenta como \"primer clic\" (edge case de la spec).\n lastFocusedCellPosRef.current = null;\n\n const anchorEl = target.closest(\"a\");\n if (anchorEl === null || !view.dom.contains(anchorEl)) {\n return false;\n }\n const linkType = view.state.schema.marks[\"link\"];\n if (!linkType) return false;\n const pos = view.posAtDOM(anchorEl, 0);\n const $pos = view.state.doc.resolve(\n Math.min(pos + 1, view.state.doc.content.size),\n );\n const range = getMarkRange($pos, linkType);\n if (!range) return false;\n const mark = $pos\n .marks()\n .find((candidate) => candidate.type === linkType);\n const href = mark?.attrs[\"href\"] as string | undefined;\n if (href === undefined) return false;\n event.preventDefault();\n setLinkPopover({ url: href, range, anchor: anchorEl });\n return true;\n },\n },\n },\n onCreate({ editor: createdEditor }) {\n ensureTrailingParagraph(createdEditor);\n },\n onUpdate({ editor: currentEditor }) {\n const markdown = editorToMarkdown(currentEditor);\n sourceRef.current = markdown;\n setSource(markdown);\n onChangeRef.current?.(markdown);\n },\n },\n [sanitizeEmbeddedHtml, onlyView],\n );\n\n const toggleView = () => {\n if (viewMode === \"wysiwyg\") {\n // Posición del cursor en el documento → offset equivalente en el texto\n // fuente, aplicado tras el cambio de vista (FR-006).\n const offset =\n editor === null\n ? 0\n : proseMirrorPosToMarkdownOffset(\n editor,\n editor.state.selection.from,\n sourceRef.current,\n );\n setViewMode(\"markdown\");\n requestAnimationFrame(() => {\n const textarea = textareaRef.current;\n if (textarea === null) return;\n textarea.focus();\n textarea.setSelectionRange(offset, offset);\n });\n } else {\n const offset = textareaRef.current?.selectionStart ?? 0;\n // emitUpdate=false: cambiar de vista nunca dispara onChange (FR-004)\n editor?.commands.setContent(markdownToEditorContent(sourceRef.current), {\n emitUpdate: false,\n });\n setViewMode(\"wysiwyg\");\n if (editor !== null) {\n const pos = markdownOffsetToProseMirrorPos(\n sourceRef.current,\n offset,\n editor.state.doc,\n );\n editor.commands.setTextSelection(pos);\n editor.commands.focus();\n }\n }\n };\n\n const handleSourceChange = (value: string) => {\n sourceRef.current = value;\n setSource(value);\n onChangeRef.current?.(value);\n };\n\n useImperativeHandle(\n ref,\n () => ({\n reset() {\n const original = originalContentRef.current;\n sourceRef.current = original;\n setSource(original);\n editor?.commands.setContent(markdownToEditorContent(original), {\n emitUpdate: false,\n });\n },\n isModified() {\n return sourceRef.current !== originalContentRef.current;\n },\n insertMarkdown(markdown: string) {\n const textarea = textareaRef.current;\n if (effectiveViewMode === \"markdown\" && textarea) {\n const start = textarea.selectionStart;\n const end = textarea.selectionEnd;\n const current = sourceRef.current;\n handleSourceChange(current.slice(0, start) + markdown + current.slice(end));\n return;\n }\n editor\n ?.chain()\n .focus()\n .insertContent(markdownToEditorContent(markdown))\n .run();\n },\n setMarkdown(markdown: string) {\n sourceRef.current = markdown;\n setSource(markdown);\n editor?.commands.setContent(markdownToEditorContent(markdown), {\n emitUpdate: false,\n });\n onChangeRef.current?.(markdown);\n },\n }),\n [editor, effectiveViewMode],\n );\n\n const closeLinkPopover = () => setLinkPopover(null);\n\n const closeTableMenu = () => setTableMenu(null);\n\n /** Ejecuta una acción del menú de tabla y cierra el menú. */\n const runTableAction = (action: () => void) => {\n action();\n closeTableMenu();\n };\n\n const saveLinkPopover = (newUrl: string) => {\n if (!editor || !linkPopover) return;\n editor\n .chain()\n .focus()\n .setTextSelection(linkPopover.range)\n .extendMarkRange(\"link\")\n .setLink({ href: newUrl })\n .run();\n closeLinkPopover();\n };\n\n const removeLinkPopover = () => {\n if (!editor || !linkPopover) return;\n editor\n .chain()\n .focus()\n .setTextSelection(linkPopover.range)\n .extendMarkRange(\"link\")\n .unsetLink()\n .run();\n closeLinkPopover();\n };\n\n const rootClassName = [\n styles[\"root\"],\n resizable ? styles[\"resizable\"] : undefined,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n className={rootClassName}\n style={{ width: toCssSize(width), height: toCssSize(height) }}\n >\n <Toolbar\n editor={editor}\n viewMode={effectiveViewMode}\n onToggleView={toggleView}\n source={source}\n sanitizeEmbeddedHtml={sanitizeEmbeddedHtml}\n onlyView={onlyView}\n {...(onlyViewNotice !== undefined ? { onlyViewNotice } : {})}\n />\n <div className={styles[\"content\"]}>\n {effectiveViewMode === \"wysiwyg\" ? (\n <RenderedView editor={editor} />\n ) : (\n <MarkdownSourceView\n ref={textareaRef}\n value={source}\n onChange={handleSourceChange}\n readOnly={onlyView}\n />\n )}\n </div>\n {linkPopover !== null && (\n <FloatingPanel anchor={linkPopover.anchor} autoFocus>\n <LinkPopover\n url={linkPopover.url}\n onlyView={onlyView}\n onNavigate={() => {\n window.open(linkPopover.url, \"_blank\", \"noopener,noreferrer\");\n closeLinkPopover();\n }}\n onCopy={() => {\n void navigator.clipboard.writeText(linkPopover.url);\n closeLinkPopover();\n }}\n onSave={saveLinkPopover}\n onRemove={removeLinkPopover}\n onClose={closeLinkPopover}\n />\n </FloatingPanel>\n )}\n {tableMenu !== null && editor !== null && (\n <FloatingPanel anchor={tableMenu.anchor} autoFocus>\n {tableMenu.kind === \"column\" ? (\n <TableContextMenu\n ariaLabel=\"Acciones de columna\"\n onClose={closeTableMenu}\n actions={[\n {\n label: \"Añadir columna a la derecha\",\n onSelect: () =>\n runTableAction(() =>\n editor.chain().focus().addColumnAfter().run(),\n ),\n },\n {\n label: \"Añadir columna a la izquierda\",\n onSelect: () =>\n runTableAction(() =>\n editor.chain().focus().addColumnBefore().run(),\n ),\n },\n {\n label: \"Mover columna a la derecha\",\n separatorBefore: true,\n onSelect: () =>\n runTableAction(() => moveCurrentColumn(editor, \"after\")),\n },\n {\n label: \"Mover columna a la izquierda\",\n onSelect: () =>\n runTableAction(() => moveCurrentColumn(editor, \"before\")),\n },\n {\n label: \"Eliminar esta columna\",\n separatorBefore: true,\n onSelect: () =>\n runTableAction(() =>\n editor.chain().focus().deleteColumn().run(),\n ),\n },\n ]}\n />\n ) : (\n <TableContextMenu\n ariaLabel=\"Acciones de fila\"\n onClose={closeTableMenu}\n actions={[\n {\n label: \"Añadir fila arriba\",\n onSelect: () =>\n runTableAction(() =>\n editor.chain().focus().addRowBefore().run(),\n ),\n },\n {\n label: \"Añadir fila abajo\",\n onSelect: () =>\n runTableAction(() =>\n editor.chain().focus().addRowAfter().run(),\n ),\n },\n {\n label: \"Subir esta fila\",\n separatorBefore: true,\n onSelect: () =>\n runTableAction(() => moveCurrentRow(editor, \"before\")),\n },\n {\n label: \"Bajar esta fila\",\n onSelect: () =>\n runTableAction(() => moveCurrentRow(editor, \"after\")),\n },\n {\n label: \"Eliminar esta fila\",\n separatorBefore: true,\n onSelect: () =>\n runTableAction(() =>\n editor.chain().focus().deleteRow().run(),\n ),\n },\n ]}\n />\n )}\n </FloatingPanel>\n )}\n </div>\n );\n});\n","import { Node, type Extensions, type Editor } from \"@tiptap/core\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport { Table } from \"@tiptap/extension-table\";\nimport TableRow from \"@tiptap/extension-table-row\";\nimport TableCell from \"@tiptap/extension-table-cell\";\nimport TableHeader from \"@tiptap/extension-table-header\";\nimport TaskList from \"@tiptap/extension-task-list\";\nimport TaskItem from \"@tiptap/extension-task-item\";\nimport Link from \"@tiptap/extension-link\";\nimport Image from \"@tiptap/extension-image\";\nimport CodeBlockLowlight from \"@tiptap/extension-code-block-lowlight\";\nimport { createLowlight } from \"lowlight\";\nimport json from \"highlight.js/lib/languages/json\";\nimport sql from \"highlight.js/lib/languages/sql\";\nimport typescript from \"highlight.js/lib/languages/typescript\";\nimport javascript from \"highlight.js/lib/languages/javascript\";\nimport java from \"highlight.js/lib/languages/java\";\nimport {\n editorHtmlToMarkdown,\n markdownToEditorHtml,\n sanitizeHtmlFragment,\n} from \"./pipeline\";\nimport { renderMermaid } from \"./mermaid\";\n\n/**\n * Registro selectivo: solo los 5 lenguajes ya ofrecidos por el selector de\n * lenguaje de bloque de código, en vez de `createLowlight(all)` (~190\n * gramáticas), para mantener el bundle acotado (Principio VIII).\n */\nexport const lowlight = createLowlight();\nlowlight.register({ json, sql, typescript, javascript, java });\n\nexport interface HtmlBlockOptions {\n sanitize: boolean;\n}\n\n/**\n * Atom node that carries an embedded raw-HTML block byte-exact through the\n * editor (FR-020): the source lives in an encoded attribute so WYSIWYG edits\n * elsewhere never rewrite it, and the node view renders it sanitized unless\n * the consumer opted out (FR-022, FR-023).\n */\nexport const HtmlBlock = Node.create<HtmlBlockOptions>({\n name: \"htmlBlock\",\n group: \"block\",\n atom: true,\n\n addOptions() {\n return { sanitize: true };\n },\n\n addAttributes() {\n return { content: { default: \"\" } };\n },\n\n parseHTML() {\n return [\n {\n tag: \"div[data-raw-html]\",\n getAttrs: (element) => {\n const raw = (element as HTMLElement).getAttribute(\"data-raw-html\");\n return raw === null ? false : { content: decodeURIComponent(raw) };\n },\n },\n ];\n },\n\n renderHTML({ node }) {\n const content = node.attrs[\"content\"] as string;\n return [\"div\", { \"data-raw-html\": encodeURIComponent(content) }];\n },\n\n addNodeView() {\n return ({ node }) => {\n const dom = document.createElement(\"div\");\n dom.setAttribute(\"data-html-block\", \"\");\n const raw = node.attrs[\"content\"] as string;\n dom.innerHTML = this.options.sanitize ? sanitizeHtmlFragment(raw) : raw;\n return { dom };\n };\n },\n});\n\n/**\n * Bloque de código con renderizado de diagramas Mermaid: cuando el lenguaje\n * del bloque es \"mermaid\", el node view monta un contenedor y sustituye su\n * contenido por el SVG renderizado de forma asíncrona. Con sintaxis inválida\n * cae al texto fuente legible (FR-007, FR-008). Es puramente presentacional:\n * el nodo del documento (y por tanto el Markdown) nunca se modifica (FR-010).\n */\nconst CodeBlockWithMermaid = CodeBlockLowlight.extend({\n addNodeView() {\n const parentNodeView = this.parent?.();\n\n return (props) => {\n if (props.node.attrs[\"language\"] !== \"mermaid\") {\n if (parentNodeView) return parentNodeView(props);\n // Sin node view heredado: `pre > code` editable estándar, para que el\n // resaltado por plugin de lowlight siga funcionando igual que antes.\n const pre = document.createElement(\"pre\");\n const code = document.createElement(\"code\");\n const language = props.node.attrs[\"language\"];\n if (typeof language === \"string\" && language !== \"\") {\n code.classList.add(`language-${language}`);\n }\n pre.appendChild(code);\n return { dom: pre, contentDOM: code };\n }\n\n const dom = document.createElement(\"div\");\n dom.setAttribute(\"data-mermaid-block\", \"\");\n\n let lastRenderedSource: string | null = null;\n\n const paintFallback = (source: string) => {\n dom.replaceChildren();\n const pre = document.createElement(\"pre\");\n const code = document.createElement(\"code\");\n code.textContent = source;\n pre.appendChild(code);\n dom.appendChild(pre);\n };\n\n const paint = (source: string) => {\n if (source === lastRenderedSource) return;\n lastRenderedSource = source;\n void renderMermaid(source).then((svg) => {\n // Descartar resultados obsoletos si el contenido cambió mientras\n // el render estaba en vuelo.\n if (lastRenderedSource !== source) return;\n if (svg === null) {\n paintFallback(source);\n return;\n }\n dom.innerHTML = svg;\n const svgEl = dom.querySelector(\"svg\");\n svgEl?.setAttribute(\"role\", \"img\");\n svgEl?.setAttribute(\"aria-label\", \"Diagrama Mermaid\");\n });\n };\n\n paintFallback(props.node.textContent);\n paint(props.node.textContent);\n\n return {\n dom,\n // Nodo atómico a efectos de renderizado: el contenido se edita desde\n // la vista Markdown; aquí solo se muestra el diagrama.\n ignoreMutation: () => true,\n update(updatedNode) {\n if (updatedNode.type.name !== props.node.type.name) return false;\n if (updatedNode.attrs[\"language\"] !== \"mermaid\") return false;\n paint(updatedNode.textContent);\n return true;\n },\n };\n };\n },\n});\n\nexport interface EditorExtensionOptions {\n sanitizeEmbeddedHtml: boolean;\n /**\n * When set, images are displayed through this resolver (e.g. relative path -> asset URL).\n * It is read lazily on every paint. Display only: the document keeps the original `src`,\n * so the serialized Markdown never contains the resolved URL.\n */\n resolveImageSrc?: () => ((src: string) => string) | undefined;\n}\n\nfunction createResolvedImage(getResolver: NonNullable<EditorExtensionOptions[\"resolveImageSrc\"]>) {\n return Image.extend({\n addNodeView() {\n return ({ node }) => {\n const img = document.createElement(\"img\");\n const paint = (attrs: Record<string, unknown>) => {\n const src = String(attrs[\"src\"] ?? \"\");\n img.src = getResolver()?.(src) ?? src;\n img.alt = String(attrs[\"alt\"] ?? \"\");\n if (attrs[\"title\"]) img.title = String(attrs[\"title\"]);\n else img.removeAttribute(\"title\");\n };\n paint(node.attrs);\n return {\n dom: img,\n update(updated) {\n if (updated.type.name !== node.type.name) return false;\n paint(updated.attrs);\n return true;\n },\n };\n };\n },\n });\n}\n\nexport function createEditorExtensions(\n options: EditorExtensionOptions,\n): Extensions {\n return [\n StarterKit.configure({ codeBlock: false }),\n CodeBlockWithMermaid.configure({ lowlight }),\n Table.configure({ resizable: false }),\n TableRow,\n TableHeader,\n TableCell,\n TaskList,\n TaskItem.configure({ nested: true }),\n Link.configure({ openOnClick: false }),\n options.resolveImageSrc ? createResolvedImage(options.resolveImageSrc) : Image,\n HtmlBlock.configure({ sanitize: options.sanitizeEmbeddedHtml }),\n ];\n}\n\n/** Markdown (GFM) → contenido HTML para `editor.commands.setContent`. */\nexport function markdownToEditorContent(markdown: string): string {\n return markdownToEditorHtml(markdown);\n}\n\n/** Documento actual del editor → Markdown (GFM). */\nexport function editorToMarkdown(editor: Editor): string {\n return editorHtmlToMarkdown(editor.getHTML());\n}\n","const EXTENDED_NUMBER_RE = '([-+]?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)|NaN|[-+]?Infinity'; // 0x..., 0..., decimal, float\n\nconst EXTENDED_NUMBER_MODE = {\n scope: 'number',\n match: EXTENDED_NUMBER_RE,\n relevance: 0\n};\n\n/*\nLanguage: JSON\nDescription: JSON (JavaScript Object Notation) is a lightweight data-interchange format.\nWebsites: http://www.json.org, https://www.json5.org\nCategory: common, protocols, web\n*/\n\n\nfunction json(hljs) {\n const ATTRIBUTE = {\n className: 'attr',\n begin: /((\"(\\\\.|[^\\\\\"\\r\\n])*\")|('(\\\\.|[^\\\\'\\r\\n])*'))(?=\\s*:)/,\n relevance: 1.01\n };\n const PUNCTUATION = {\n match: /[{}[\\],:]/,\n className: \"punctuation\",\n relevance: 0\n };\n const LITERALS = [\n \"true\",\n \"false\",\n \"null\"\n ];\n // NOTE: normally we would rely on `keywords` for this but using a mode here allows us\n // - to use the very tight `illegal: \\S` rule later to flag any other character\n // - as illegal indicating that despite looking like JSON we do not truly have\n // - JSON and thus improve false-positively greatly since JSON will try and claim\n // - all sorts of JSON looking stuff\n const LITERALS_MODE = {\n scope: \"literal\",\n beginKeywords: LITERALS.join(\" \"),\n };\n\n return {\n name: 'JSON',\n aliases: ['jsonc', 'json5'],\n keywords:{\n literal: LITERALS,\n },\n contains: [\n ATTRIBUTE,\n PUNCTUATION,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n LITERALS_MODE,\n EXTENDED_NUMBER_MODE,\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ],\n illegal: '\\\\S'\n };\n}\n\nexport { json as default };\n","/*\n Language: SQL\n Website: https://en.wikipedia.org/wiki/SQL\n Category: common, database\n */\n\n/*\n\nGoals:\n\nSQL is intended to highlight basic/common SQL keywords and expressions\n\n- If pretty much every single SQL server includes supports, then it's a canidate.\n- It is NOT intended to include tons of vendor specific keywords (Oracle, MySQL,\n PostgreSQL) although the list of data types is purposely a bit more expansive.\n- For more specific SQL grammars please see:\n - PostgreSQL and PL/pgSQL - core\n - T-SQL - https://github.com/highlightjs/highlightjs-tsql\n - sql_more (core)\n\n */\n\nfunction sql(hljs) {\n const regex = hljs.regex;\n const COMMENT_MODE = hljs.COMMENT('--', '$');\n const STRING = {\n scope: 'string',\n variants: [\n {\n begin: /'/,\n end: /'/,\n contains: [ { match: /''/ } ]\n }\n ]\n };\n const QUOTED_IDENTIFIER = {\n begin: /\"/,\n end: /\"/,\n contains: [ { match: /\"\"/ } ]\n };\n\n const LITERALS = [\n \"true\",\n \"false\",\n // Not sure it's correct to call NULL literal, and clauses like IS [NOT] NULL look strange that way.\n // \"null\",\n \"unknown\"\n ];\n\n const MULTI_WORD_TYPES = [\n \"double precision\",\n \"large object\",\n \"with timezone\",\n \"without timezone\"\n ];\n\n const TYPES = [\n 'bigint',\n 'binary',\n 'blob',\n 'boolean',\n 'char',\n 'character',\n 'clob',\n 'date',\n 'dec',\n 'decfloat',\n 'decimal',\n 'float',\n 'int',\n 'integer',\n 'interval',\n 'nchar',\n 'nclob',\n 'national',\n 'numeric',\n 'real',\n 'row',\n 'smallint',\n 'time',\n 'timestamp',\n 'varchar',\n 'varying', // modifier (character varying)\n 'varbinary'\n ];\n\n const NON_RESERVED_WORDS = [\n \"add\",\n \"asc\",\n \"collation\",\n \"desc\",\n \"final\",\n \"first\",\n \"last\",\n \"view\"\n ];\n\n // https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#reserved-word\n const RESERVED_WORDS = [\n \"abs\",\n \"acos\",\n \"all\",\n \"allocate\",\n \"alter\",\n \"and\",\n \"any\",\n \"are\",\n \"array\",\n \"array_agg\",\n \"array_max_cardinality\",\n \"as\",\n \"asensitive\",\n \"asin\",\n \"asymmetric\",\n \"at\",\n \"atan\",\n \"atomic\",\n \"authorization\",\n \"avg\",\n \"begin\",\n \"begin_frame\",\n \"begin_partition\",\n \"between\",\n \"bigint\",\n \"binary\",\n \"blob\",\n \"boolean\",\n \"both\",\n \"by\",\n \"call\",\n \"called\",\n \"cardinality\",\n \"cascaded\",\n \"case\",\n \"cast\",\n \"ceil\",\n \"ceiling\",\n \"char\",\n \"char_length\",\n \"character\",\n \"character_length\",\n \"check\",\n \"classifier\",\n \"clob\",\n \"close\",\n \"coalesce\",\n \"collate\",\n \"collect\",\n \"column\",\n \"commit\",\n \"condition\",\n \"connect\",\n \"constraint\",\n \"contains\",\n \"convert\",\n \"copy\",\n \"corr\",\n \"corresponding\",\n \"cos\",\n \"cosh\",\n \"count\",\n \"covar_pop\",\n \"covar_samp\",\n \"create\",\n \"cross\",\n \"cube\",\n \"cume_dist\",\n \"current\",\n \"current_catalog\",\n \"current_date\",\n \"current_default_transform_group\",\n \"current_path\",\n \"current_role\",\n \"current_row\",\n \"current_schema\",\n \"current_time\",\n \"current_timestamp\",\n \"current_path\",\n \"current_role\",\n \"current_transform_group_for_type\",\n \"current_user\",\n \"cursor\",\n \"cycle\",\n \"date\",\n \"day\",\n \"deallocate\",\n \"dec\",\n \"decimal\",\n \"decfloat\",\n \"declare\",\n \"default\",\n \"define\",\n \"delete\",\n \"dense_rank\",\n \"deref\",\n \"describe\",\n \"deterministic\",\n \"disconnect\",\n \"distinct\",\n \"double\",\n \"drop\",\n \"dynamic\",\n \"each\",\n \"element\",\n \"else\",\n \"empty\",\n \"end\",\n \"end_frame\",\n \"end_partition\",\n \"end-exec\",\n \"equals\",\n \"escape\",\n \"every\",\n \"except\",\n \"exec\",\n \"execute\",\n \"exists\",\n \"exp\",\n \"external\",\n \"extract\",\n \"false\",\n \"fetch\",\n \"filter\",\n \"first_value\",\n \"float\",\n \"floor\",\n \"for\",\n \"foreign\",\n \"frame_row\",\n \"free\",\n \"from\",\n \"full\",\n \"function\",\n \"fusion\",\n \"get\",\n \"global\",\n \"grant\",\n \"group\",\n \"grouping\",\n \"groups\",\n \"having\",\n \"hold\",\n \"hour\",\n \"identity\",\n \"in\",\n \"indicator\",\n \"initial\",\n \"inner\",\n \"inout\",\n \"insensitive\",\n \"insert\",\n \"int\",\n \"integer\",\n \"intersect\",\n \"intersection\",\n \"interval\",\n \"into\",\n \"is\",\n \"join\",\n \"json_array\",\n \"json_arrayagg\",\n \"json_exists\",\n \"json_object\",\n \"json_objectagg\",\n \"json_query\",\n \"json_table\",\n \"json_table_primitive\",\n \"json_value\",\n \"lag\",\n \"language\",\n \"large\",\n \"last_value\",\n \"lateral\",\n \"lead\",\n \"leading\",\n \"left\",\n \"like\",\n \"like_regex\",\n \"listagg\",\n \"ln\",\n \"local\",\n \"localtime\",\n \"localtimestamp\",\n \"log\",\n \"log10\",\n \"lower\",\n \"match\",\n \"match_number\",\n \"match_recognize\",\n \"matches\",\n \"max\",\n \"member\",\n \"merge\",\n \"method\",\n \"min\",\n \"minute\",\n \"mod\",\n \"modifies\",\n \"module\",\n \"month\",\n \"multiset\",\n \"national\",\n \"natural\",\n \"nchar\",\n \"nclob\",\n \"new\",\n \"no\",\n \"none\",\n \"normalize\",\n \"not\",\n \"nth_value\",\n \"ntile\",\n \"null\",\n \"nullif\",\n \"numeric\",\n \"octet_length\",\n \"occurrences_regex\",\n \"of\",\n \"offset\",\n \"old\",\n \"omit\",\n \"on\",\n \"one\",\n \"only\",\n \"open\",\n \"or\",\n \"order\",\n \"out\",\n \"outer\",\n \"over\",\n \"overlaps\",\n \"overlay\",\n \"parameter\",\n \"partition\",\n \"pattern\",\n \"per\",\n \"percent\",\n \"percent_rank\",\n \"percentile_cont\",\n \"percentile_disc\",\n \"period\",\n \"portion\",\n \"position\",\n \"position_regex\",\n \"power\",\n \"precedes\",\n \"precision\",\n \"prepare\",\n \"primary\",\n \"procedure\",\n \"ptf\",\n \"range\",\n \"rank\",\n \"reads\",\n \"real\",\n \"recursive\",\n \"ref\",\n \"references\",\n \"referencing\",\n \"regr_avgx\",\n \"regr_avgy\",\n \"regr_count\",\n \"regr_intercept\",\n \"regr_r2\",\n \"regr_slope\",\n \"regr_sxx\",\n \"regr_sxy\",\n \"regr_syy\",\n \"release\",\n \"result\",\n \"return\",\n \"returns\",\n \"revoke\",\n \"right\",\n \"rollback\",\n \"rollup\",\n \"row\",\n \"row_number\",\n \"rows\",\n \"running\",\n \"savepoint\",\n \"scope\",\n \"scroll\",\n \"search\",\n \"second\",\n \"seek\",\n \"select\",\n \"sensitive\",\n \"session_user\",\n \"set\",\n \"show\",\n \"similar\",\n \"sin\",\n \"sinh\",\n \"skip\",\n \"smallint\",\n \"some\",\n \"specific\",\n \"specifictype\",\n \"sql\",\n \"sqlexception\",\n \"sqlstate\",\n \"sqlwarning\",\n \"sqrt\",\n \"start\",\n \"static\",\n \"stddev_pop\",\n \"stddev_samp\",\n \"submultiset\",\n \"subset\",\n \"substring\",\n \"substring_regex\",\n \"succeeds\",\n \"sum\",\n \"symmetric\",\n \"system\",\n \"system_time\",\n \"system_user\",\n \"table\",\n \"tablesample\",\n \"tan\",\n \"tanh\",\n \"then\",\n \"time\",\n \"timestamp\",\n \"timezone_hour\",\n \"timezone_minute\",\n \"to\",\n \"trailing\",\n \"translate\",\n \"translate_regex\",\n \"translation\",\n \"treat\",\n \"trigger\",\n \"trim\",\n \"trim_array\",\n \"true\",\n \"truncate\",\n \"uescape\",\n \"union\",\n \"unique\",\n \"unknown\",\n \"unnest\",\n \"update\",\n \"upper\",\n \"user\",\n \"using\",\n \"value\",\n \"values\",\n \"value_of\",\n \"var_pop\",\n \"var_samp\",\n \"varbinary\",\n \"varchar\",\n \"varying\",\n \"versioning\",\n \"when\",\n \"whenever\",\n \"where\",\n \"width_bucket\",\n \"window\",\n \"with\",\n \"within\",\n \"without\",\n \"year\",\n ];\n\n // these are reserved words we have identified to be functions\n // and should only be highlighted in a dispatch-like context\n // ie, array_agg(...), etc.\n const RESERVED_FUNCTIONS = [\n \"abs\",\n \"acos\",\n \"array_agg\",\n \"asin\",\n \"atan\",\n \"avg\",\n \"cast\",\n \"ceil\",\n \"ceiling\",\n \"coalesce\",\n \"corr\",\n \"cos\",\n \"cosh\",\n \"count\",\n \"covar_pop\",\n \"covar_samp\",\n \"cume_dist\",\n \"dense_rank\",\n \"deref\",\n \"element\",\n \"exp\",\n \"extract\",\n \"first_value\",\n \"floor\",\n \"json_array\",\n \"json_arrayagg\",\n \"json_exists\",\n \"json_object\",\n \"json_objectagg\",\n \"json_query\",\n \"json_table\",\n \"json_table_primitive\",\n \"json_value\",\n \"lag\",\n \"last_value\",\n \"lead\",\n \"listagg\",\n \"ln\",\n \"log\",\n \"log10\",\n \"lower\",\n \"max\",\n \"min\",\n \"mod\",\n \"nth_value\",\n \"ntile\",\n \"nullif\",\n \"percent_rank\",\n \"percentile_cont\",\n \"percentile_disc\",\n \"position\",\n \"position_regex\",\n \"power\",\n \"rank\",\n \"regr_avgx\",\n \"regr_avgy\",\n \"regr_count\",\n \"regr_intercept\",\n \"regr_r2\",\n \"regr_slope\",\n \"regr_sxx\",\n \"regr_sxy\",\n \"regr_syy\",\n \"row_number\",\n \"sin\",\n \"sinh\",\n \"sqrt\",\n \"stddev_pop\",\n \"stddev_samp\",\n \"substring\",\n \"substring_regex\",\n \"sum\",\n \"tan\",\n \"tanh\",\n \"translate\",\n \"translate_regex\",\n \"treat\",\n \"trim\",\n \"trim_array\",\n \"unnest\",\n \"upper\",\n \"value_of\",\n \"var_pop\",\n \"var_samp\",\n \"width_bucket\",\n ];\n\n // these functions can\n const POSSIBLE_WITHOUT_PARENS = [\n \"current_catalog\",\n \"current_date\",\n \"current_default_transform_group\",\n \"current_path\",\n \"current_role\",\n \"current_schema\",\n \"current_transform_group_for_type\",\n \"current_user\",\n \"session_user\",\n \"system_time\",\n \"system_user\",\n \"current_time\",\n \"localtime\",\n \"current_timestamp\",\n \"localtimestamp\"\n ];\n\n // those exist to boost relevance making these very\n // \"SQL like\" keyword combos worth +1 extra relevance\n const COMBOS = [\n \"create table\",\n \"insert into\",\n \"primary key\",\n \"foreign key\",\n \"not null\",\n \"alter table\",\n \"add constraint\",\n \"grouping sets\",\n \"on overflow\",\n \"character set\",\n \"respect nulls\",\n \"ignore nulls\",\n \"nulls first\",\n \"nulls last\",\n \"depth first\",\n \"breadth first\"\n ];\n\n const FUNCTIONS = RESERVED_FUNCTIONS;\n\n const KEYWORDS = [\n ...RESERVED_WORDS,\n ...NON_RESERVED_WORDS\n ].filter((keyword) => {\n return !RESERVED_FUNCTIONS.includes(keyword);\n });\n\n const VARIABLE = {\n scope: \"variable\",\n match: /@[a-z0-9][a-z0-9_]*/,\n };\n\n const OPERATOR = {\n scope: \"operator\",\n match: /[-+*/=%^~]|&&?|\\|\\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,\n relevance: 0,\n };\n\n const FUNCTION_CALL = {\n match: regex.concat(/\\b/, regex.either(...FUNCTIONS), /\\s*\\(/),\n relevance: 0,\n keywords: { built_in: FUNCTIONS }\n };\n\n // turns a multi-word keyword combo into a regex that doesn't\n // care about extra whitespace etc.\n // input: \"START QUERY\"\n // output: /\\bSTART\\s+QUERY\\b/\n function kws_to_regex(list) {\n return regex.concat(\n /\\b/,\n regex.either(...list.map((kw) => {\n return kw.replace(/\\s+/, \"\\\\s+\")\n })),\n /\\b/\n )\n }\n\n const MULTI_WORD_KEYWORDS = {\n scope: \"keyword\",\n match: kws_to_regex(COMBOS),\n relevance: 0,\n };\n\n // keywords with less than 3 letters are reduced in relevancy\n function reduceRelevancy(list, {\n exceptions, when\n } = {}) {\n const qualifyFn = when;\n exceptions = exceptions || [];\n return list.map((item) => {\n if (item.match(/\\|\\d+$/) || exceptions.includes(item)) {\n return item;\n } else if (qualifyFn(item)) {\n return `${item}|0`;\n } else {\n return item;\n }\n });\n }\n\n return {\n name: 'SQL',\n case_insensitive: true,\n // does not include {} or HTML tags `</`\n illegal: /[{}]|<\\//,\n keywords: {\n $pattern: /\\b[\\w\\.]+/,\n keyword:\n reduceRelevancy(KEYWORDS, { when: (x) => x.length < 3 }),\n literal: LITERALS,\n type: TYPES,\n built_in: POSSIBLE_WITHOUT_PARENS\n },\n contains: [\n {\n scope: \"type\",\n match: kws_to_regex(MULTI_WORD_TYPES)\n },\n MULTI_WORD_KEYWORDS,\n FUNCTION_CALL,\n VARIABLE,\n STRING,\n QUOTED_IDENTIFIER,\n hljs.C_NUMBER_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n COMMENT_MODE,\n OPERATOR\n ]\n };\n}\n\nexport { sql as default };\n","const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\n\nconst KEYWORDS = [\n \"as\", // for exports\n \"in\",\n \"of\",\n \"if\",\n \"for\",\n \"while\",\n \"finally\",\n \"var\",\n \"new\",\n \"function\",\n \"do\",\n \"return\",\n \"void\",\n \"else\",\n \"break\",\n \"catch\",\n \"instanceof\",\n \"with\",\n \"throw\",\n \"case\",\n \"default\",\n \"try\",\n \"switch\",\n \"continue\",\n \"typeof\",\n \"delete\",\n \"let\",\n \"yield\",\n \"const\",\n \"class\",\n // JS handles these with a special rule\n // \"get\",\n // \"set\",\n \"debugger\",\n \"async\",\n \"await\",\n \"static\",\n \"import\",\n \"from\",\n \"export\",\n \"extends\",\n // It's reached stage 3, which is \"recommended for implementation\":\n \"using\"\n];\nconst LITERALS = [\n \"true\",\n \"false\",\n \"null\",\n \"undefined\",\n \"NaN\",\n \"Infinity\"\n];\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\nconst TYPES = [\n // Fundamental objects\n \"Object\",\n \"Function\",\n \"Boolean\",\n \"Symbol\",\n // numbers and dates\n \"Math\",\n \"Date\",\n \"Number\",\n \"BigInt\",\n // text\n \"String\",\n \"RegExp\",\n // Indexed collections\n \"Array\",\n \"Float32Array\",\n \"Float64Array\",\n \"Int8Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"Int16Array\",\n \"Int32Array\",\n \"Uint16Array\",\n \"Uint32Array\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n // Keyed collections\n \"Set\",\n \"Map\",\n \"WeakSet\",\n \"WeakMap\",\n // Structured data\n \"ArrayBuffer\",\n \"SharedArrayBuffer\",\n \"Atomics\",\n \"DataView\",\n \"JSON\",\n // Control abstraction objects\n \"Promise\",\n \"Generator\",\n \"GeneratorFunction\",\n \"AsyncFunction\",\n // Reflection\n \"Reflect\",\n \"Proxy\",\n // Internationalization\n \"Intl\",\n // WebAssembly\n \"WebAssembly\"\n];\n\nconst ERROR_TYPES = [\n \"Error\",\n \"EvalError\",\n \"InternalError\",\n \"RangeError\",\n \"ReferenceError\",\n \"SyntaxError\",\n \"TypeError\",\n \"URIError\"\n];\n\nconst BUILT_IN_GLOBALS = [\n \"setInterval\",\n \"setTimeout\",\n \"clearInterval\",\n \"clearTimeout\",\n\n \"require\",\n \"exports\",\n\n \"eval\",\n \"isFinite\",\n \"isNaN\",\n \"parseFloat\",\n \"parseInt\",\n \"decodeURI\",\n \"decodeURIComponent\",\n \"encodeURI\",\n \"encodeURIComponent\",\n \"escape\",\n \"unescape\"\n];\n\nconst BUILT_IN_VARIABLES = [\n \"arguments\",\n \"this\",\n \"super\",\n \"console\",\n \"window\",\n \"document\",\n \"localStorage\",\n \"sessionStorage\",\n \"module\",\n \"self\",\n \"global\" // Node.js\n];\n\nconst BUILT_INS = [].concat(\n BUILT_IN_GLOBALS,\n TYPES,\n ERROR_TYPES\n);\n\n/*\nLanguage: JavaScript\nDescription: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.\nCategory: common, scripting, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/JavaScript\n*/\n\n\n/** @type LanguageFn */\nfunction javascript(hljs) {\n const regex = hljs.regex;\n /**\n * Takes a string like \"<Booger\" and checks to see\n * if we can find a matching \"</Booger\" later in the\n * content.\n * @param {RegExpMatchArray} match\n * @param {{after:number}} param1\n */\n const hasClosingTag = (match, { after }) => {\n const tag = \"</\" + match[0].slice(1);\n const pos = match.input.indexOf(tag, after);\n return pos !== -1;\n };\n\n const IDENT_RE$1 = IDENT_RE;\n const FRAGMENT = {\n begin: '<>',\n end: '</>'\n };\n // to avoid some special cases inside isTrulyOpeningTag\n const XML_SELF_CLOSING = /<[A-Za-z0-9\\\\._:-]+\\s*\\/>/;\n const XML_TAG = {\n begin: /<[A-Za-z0-9\\\\._:-]+/,\n end: /\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,\n /**\n * @param {RegExpMatchArray} match\n * @param {CallbackResponse} response\n */\n isTrulyOpeningTag: (match, response) => {\n const afterMatchIndex = match[0].length + match.index;\n const nextChar = match.input[afterMatchIndex];\n if (\n // HTML should not include another raw `<` inside a tag\n // nested type?\n // `<Array<Array<number>>`, etc.\n nextChar === \"<\" ||\n // the , gives away that this is not HTML\n // `<T, A extends keyof T, V>`\n nextChar === \",\"\n ) {\n response.ignoreMatch();\n return;\n }\n\n // `<something>`\n // Quite possibly a tag, lets look for a matching closing tag...\n if (nextChar === \">\") {\n // if we cannot find a matching closing tag, then we\n // will ignore it\n if (!hasClosingTag(match, { after: afterMatchIndex })) {\n response.ignoreMatch();\n }\n }\n\n // `<blah />` (self-closing)\n // handled by simpleSelfClosing rule\n\n let m;\n const afterMatch = match.input.substring(afterMatchIndex);\n\n // some more template typing stuff\n // <T = any>(key?: string) => Modify<\n if ((m = afterMatch.match(/^\\s*=/))) {\n response.ignoreMatch();\n return;\n }\n\n // `<From extends string>`\n // technically this could be HTML, but it smells like a type\n // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276\n if ((m = afterMatch.match(/^\\s+extends\\s+/))) {\n if (m.index === 0) {\n response.ignoreMatch();\n // eslint-disable-next-line no-useless-return\n return;\n }\n }\n }\n };\n const KEYWORDS$1 = {\n $pattern: IDENT_RE,\n keyword: KEYWORDS,\n literal: LITERALS,\n built_in: BUILT_INS,\n \"variable.language\": BUILT_IN_VARIABLES\n };\n\n // https://tc39.es/ecma262/#sec-literals-numeric-literals\n const decimalDigits = '[0-9](_?[0-9])*';\n const frac = `\\\\.(${decimalDigits})`;\n // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;\n const NUMBER = {\n className: 'number',\n variants: [\n // DecimalLiteral\n { begin: `(\\\\b(${decimalInteger})((${frac})|\\\\.)?|(${frac}))` +\n `[eE][+-]?(${decimalDigits})\\\\b` },\n { begin: `\\\\b(${decimalInteger})\\\\b((${frac})\\\\b|\\\\.)?|(${frac})\\\\b` },\n\n // DecimalBigIntegerLiteral\n { begin: `\\\\b(0|[1-9](_?[0-9])*)n\\\\b` },\n\n // NonDecimalIntegerLiteral\n { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\" },\n { begin: \"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\" },\n { begin: \"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\" },\n\n // LegacyOctalIntegerLiteral (does not include underscore separators)\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n { begin: \"\\\\b0[0-7]+n?\\\\b\" },\n ],\n relevance: 0\n };\n\n const SUBST = {\n className: 'subst',\n begin: '\\\\$\\\\{',\n end: '\\\\}',\n keywords: KEYWORDS$1,\n contains: [] // defined later\n };\n const HTML_TEMPLATE = {\n begin: '\\.?html`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'xml'\n }\n };\n const CSS_TEMPLATE = {\n begin: '\\.?css`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'css'\n }\n };\n const GRAPHQL_TEMPLATE = {\n begin: '\\.?gql`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'graphql'\n }\n };\n const TEMPLATE_STRING = {\n className: 'string',\n begin: '`',\n end: '`',\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ]\n };\n const JSDOC_COMMENT = hljs.COMMENT(\n /\\/\\*\\*(?!\\/)/,\n '\\\\*/',\n {\n relevance: 0,\n contains: [\n {\n begin: '(?=@[A-Za-z]+)',\n relevance: 0,\n contains: [\n {\n className: 'doctag',\n begin: '@[A-Za-z]+'\n },\n {\n className: 'type',\n begin: '\\\\{',\n end: '\\\\}',\n excludeEnd: true,\n excludeBegin: true,\n relevance: 0\n },\n {\n className: 'variable',\n begin: IDENT_RE$1 + '(?=\\\\s*(-)|$)',\n endsParent: true,\n relevance: 0\n },\n // eat spaces (not newlines) so we can find\n // types or variables\n {\n begin: /(?=[^\\n])\\s/,\n relevance: 0\n }\n ]\n }\n ]\n }\n );\n const COMMENT = {\n className: \"comment\",\n variants: [\n JSDOC_COMMENT,\n hljs.C_BLOCK_COMMENT_MODE,\n hljs.C_LINE_COMMENT_MODE\n ]\n };\n const SUBST_INTERNALS = [\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n // This is intentional:\n // See https://github.com/highlightjs/highlight.js/issues/3288\n // hljs.REGEXP_MODE\n ];\n SUBST.contains = SUBST_INTERNALS\n .concat({\n // we need to pair up {} inside our subst to prevent\n // it from ending too early by matching another }\n begin: /\\{/,\n end: /\\}/,\n keywords: KEYWORDS$1,\n contains: [\n \"self\"\n ].concat(SUBST_INTERNALS)\n });\n const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);\n const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([\n // eat recursive parens in sub expressions\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n keywords: KEYWORDS$1,\n contains: [\"self\"].concat(SUBST_AND_COMMENTS)\n }\n ]);\n const PARAMS = {\n className: 'params',\n // convert this to negative lookbehind in v12\n begin: /(\\s*)\\(/, // to match the parms with\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n };\n\n // ES6 classes\n const CLASS_OR_EXTENDS = {\n variants: [\n // class Car extends vehicle\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1,\n /\\s+/,\n /extends/,\n /\\s+/,\n regex.concat(IDENT_RE$1, \"(\", regex.concat(/\\./, IDENT_RE$1), \")*\")\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\",\n 5: \"keyword\",\n 7: \"title.class.inherited\"\n }\n },\n // class Car\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n },\n\n ]\n };\n\n const CLASS_REFERENCE = {\n relevance: 0,\n match:\n regex.either(\n // Hard coded exceptions\n /\\bJSON/,\n // Float32Array, OutT\n /\\b[A-Z][a-z]+([A-Z][a-z]*|\\d)*/,\n // CSSFactory, CSSFactoryT\n /\\b[A-Z]{2,}([A-Z][a-z]+|\\d)+([A-Z][a-z]*)*/,\n // FPs, FPsT\n /\\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\\d)*([A-Z][a-z]*)*/,\n // P\n // single letters are not highlighted\n // BLAH\n // this will be flagged as a UPPER_CASE_CONSTANT instead\n ),\n className: \"title.class\",\n keywords: {\n _: [\n // se we still get relevance credit for JS library classes\n ...TYPES,\n ...ERROR_TYPES\n ]\n }\n };\n\n const USE_STRICT = {\n label: \"use_strict\",\n className: 'meta',\n relevance: 10,\n begin: /^\\s*['\"]use (strict|asm)['\"]/\n };\n\n const FUNCTION_DEFINITION = {\n variants: [\n {\n match: [\n /function/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\s*\\()/\n ]\n },\n // anonymous function\n {\n match: [\n /function/,\n /\\s*(?=\\()/\n ]\n }\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n label: \"func.def\",\n contains: [ PARAMS ],\n illegal: /%/\n };\n\n const UPPER_CASE_CONSTANT = {\n relevance: 0,\n match: /\\b[A-Z][A-Z_0-9]+\\b/,\n className: \"variable.constant\"\n };\n\n function noneOf(list) {\n return regex.concat(\"(?!\", list.join(\"|\"), \")\");\n }\n\n const FUNCTION_CALL = {\n match: regex.concat(\n /\\b/,\n noneOf([\n ...BUILT_IN_GLOBALS,\n \"super\",\n \"import\",\n \"await\",\n ].map(x => `${x}\\\\s*\\\\(`)),\n IDENT_RE$1, regex.lookahead(/\\s*\\(/)),\n className: \"title.function\",\n relevance: 0\n };\n\n const PROPERTY_ACCESS = {\n begin: regex.concat(/\\./, regex.lookahead(\n regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)\n )),\n end: IDENT_RE$1,\n excludeBegin: true,\n keywords: \"prototype\",\n className: \"property\",\n relevance: 0\n };\n\n const GETTER_OR_SETTER = {\n match: [\n /get|set/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\()/\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n { // eat to avoid empty params\n begin: /\\(\\)/\n },\n PARAMS\n ]\n };\n\n const FUNC_LEAD_IN_RE = '(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\\\s*=>';\n\n const FUNCTION_VARIABLE = {\n match: [\n /const|var|let/, /\\s+/,\n IDENT_RE$1, /\\s*/,\n /=\\s*/,\n /(async\\s*)?/, // async is optional\n regex.lookahead(FUNC_LEAD_IN_RE)\n ],\n keywords: \"async\",\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n PARAMS\n ]\n };\n\n return {\n name: 'JavaScript',\n aliases: ['js', 'jsx', 'mjs', 'cjs'],\n keywords: KEYWORDS$1,\n // this will be extended by TypeScript\n exports: { PARAMS_CONTAINS, CLASS_REFERENCE },\n illegal: /#(?![$_A-Za-z])/,\n contains: [\n hljs.SHEBANG({\n label: \"shebang\",\n binary: \"node\",\n relevance: 5\n }),\n USE_STRICT,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n COMMENT,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n CLASS_REFERENCE,\n {\n scope: 'attr',\n match: IDENT_RE$1 + regex.lookahead(':'),\n relevance: 0\n },\n FUNCTION_VARIABLE,\n { // \"value\" container\n begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n keywords: 'return throw case',\n relevance: 0,\n contains: [\n COMMENT,\n hljs.REGEXP_MODE,\n {\n className: 'function',\n // we have to count the parens to make sure we actually have the\n // correct bounding ( ) before the =>. There could be any number of\n // sub-expressions inside also surrounded by parens.\n begin: FUNC_LEAD_IN_RE,\n returnBegin: true,\n end: '\\\\s*=>',\n contains: [\n {\n className: 'params',\n variants: [\n {\n begin: hljs.UNDERSCORE_IDENT_RE,\n relevance: 0\n },\n {\n className: null,\n begin: /\\(\\s*\\)/,\n skip: true\n },\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n }\n ]\n }\n ]\n },\n { // could be a comma delimited list of params to a function call\n begin: /,/,\n relevance: 0\n },\n {\n match: /\\s+/,\n relevance: 0\n },\n { // JSX\n variants: [\n { begin: FRAGMENT.begin, end: FRAGMENT.end },\n { match: XML_SELF_CLOSING },\n {\n begin: XML_TAG.begin,\n // we carefully check the opening tag to see if it truly\n // is a tag and not a false positive\n 'on:begin': XML_TAG.isTrulyOpeningTag,\n end: XML_TAG.end\n }\n ],\n subLanguage: 'xml',\n contains: [\n {\n begin: XML_TAG.begin,\n end: XML_TAG.end,\n skip: true,\n contains: ['self']\n }\n ]\n }\n ],\n },\n FUNCTION_DEFINITION,\n {\n // prevent this from getting swallowed up by function\n // since they appear \"function like\"\n beginKeywords: \"while if switch catch for\"\n },\n {\n // we have to count the parens to make sure we actually have the correct\n // bounding ( ). There could be any number of sub-expressions inside\n // also surrounded by parens.\n begin: '\\\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +\n '\\\\(' + // first parens\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)\\\\s*\\\\{', // end parens\n returnBegin:true,\n label: \"func.def\",\n contains: [\n PARAMS,\n hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: \"title.function\" })\n ]\n },\n // catch ... so it won't trigger the property rule below\n {\n match: /\\.\\.\\./,\n relevance: 0\n },\n PROPERTY_ACCESS,\n // hack: prevents detection of keywords in some circumstances\n // .keyword()\n // $keyword = x\n {\n match: '\\\\$' + IDENT_RE$1,\n relevance: 0\n },\n {\n match: [ /\\bconstructor(?=\\s*\\()/ ],\n className: { 1: \"title.function\" },\n contains: [ PARAMS ]\n },\n FUNCTION_CALL,\n UPPER_CASE_CONSTANT,\n CLASS_OR_EXTENDS,\n GETTER_OR_SETTER,\n {\n match: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n }\n ]\n };\n}\n\n/*\nLanguage: TypeScript\nAuthor: Panu Horsmalahti <panu.horsmalahti@iki.fi>\nContributors: Ike Ku <dempfi@yahoo.com>\nDescription: TypeScript is a strict superset of JavaScript\nWebsite: https://www.typescriptlang.org\nCategory: common, scripting\n*/\n\n\n/** @type LanguageFn */\nfunction typescript(hljs) {\n const regex = hljs.regex;\n const tsLanguage = javascript(hljs);\n\n const IDENT_RE$1 = IDENT_RE;\n const TYPES = [\n \"any\",\n \"void\",\n \"number\",\n \"boolean\",\n \"string\",\n \"object\",\n \"never\",\n \"symbol\",\n \"bigint\",\n \"unknown\"\n ];\n const NAMESPACE = {\n begin: [\n /namespace/,\n /\\s+/,\n hljs.IDENT_RE\n ],\n beginScope: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n };\n const INTERFACE = {\n beginKeywords: 'interface',\n end: /\\{/,\n excludeEnd: true,\n keywords: {\n keyword: 'interface extends',\n built_in: TYPES\n },\n contains: [ tsLanguage.exports.CLASS_REFERENCE ]\n };\n const USE_STRICT = {\n className: 'meta',\n relevance: 10,\n begin: /^\\s*['\"]use strict['\"]/\n };\n const TS_SPECIFIC_KEYWORDS = [\n \"type\",\n // \"namespace\",\n \"interface\",\n \"public\",\n \"private\",\n \"protected\",\n \"implements\",\n \"declare\",\n \"abstract\",\n \"readonly\",\n \"enum\",\n \"override\",\n \"satisfies\"\n ];\n /*\n namespace is a TS keyword but it's fine to use it as a variable name too.\n const message = 'foo';\n const namespace = 'bar';\n */\n const KEYWORDS$1 = {\n $pattern: IDENT_RE,\n keyword: KEYWORDS.concat(TS_SPECIFIC_KEYWORDS),\n literal: LITERALS,\n built_in: BUILT_INS.concat(TYPES),\n \"variable.language\": BUILT_IN_VARIABLES\n };\n\n const DECORATOR = {\n className: 'meta',\n begin: '@' + IDENT_RE$1,\n };\n\n const swapMode = (mode, label, replacement) => {\n const indx = mode.contains.findIndex(m => m.label === label);\n if (indx === -1) { throw new Error(\"can not find mode to replace\"); }\n\n mode.contains.splice(indx, 1, replacement);\n };\n\n\n // this should update anywhere keywords is used since\n // it will be the same actual JS object\n Object.assign(tsLanguage.keywords, KEYWORDS$1);\n\n tsLanguage.exports.PARAMS_CONTAINS.push(DECORATOR);\n\n // highlight the function params\n const ATTRIBUTE_HIGHLIGHT = tsLanguage.contains.find(c => c.scope === \"attr\");\n\n // take default attr rule and extend it to support optionals\n const OPTIONAL_KEY_OR_ARGUMENT = Object.assign({},\n ATTRIBUTE_HIGHLIGHT,\n { match: regex.concat(IDENT_RE$1, regex.lookahead(/\\s*\\?:/)) }\n );\n tsLanguage.exports.PARAMS_CONTAINS.push([\n tsLanguage.exports.CLASS_REFERENCE, // class reference for highlighting the params types\n ATTRIBUTE_HIGHLIGHT, // highlight the params key\n OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting\n ]);\n\n // Add the optional property assignment highlighting for objects or classes\n tsLanguage.contains = tsLanguage.contains.concat([\n DECORATOR,\n NAMESPACE,\n INTERFACE,\n OPTIONAL_KEY_OR_ARGUMENT, // Added for optional property assignment highlighting\n ]);\n\n // TS gets a simpler shebang rule than JS\n swapMode(tsLanguage, \"shebang\", hljs.SHEBANG());\n // JS use strict rule purposely excludes `asm` which makes no sense\n swapMode(tsLanguage, \"use_strict\", USE_STRICT);\n\n const functionDeclaration = tsLanguage.contains.find(m => m.label === \"func.def\");\n functionDeclaration.relevance = 0; // () => {} is more typical in TypeScript\n\n Object.assign(tsLanguage, {\n name: 'TypeScript',\n aliases: [\n 'ts',\n 'tsx',\n 'mts',\n 'cts'\n ]\n });\n\n return tsLanguage;\n}\n\nexport { typescript as default };\n","const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\n\nconst KEYWORDS = [\n \"as\", // for exports\n \"in\",\n \"of\",\n \"if\",\n \"for\",\n \"while\",\n \"finally\",\n \"var\",\n \"new\",\n \"function\",\n \"do\",\n \"return\",\n \"void\",\n \"else\",\n \"break\",\n \"catch\",\n \"instanceof\",\n \"with\",\n \"throw\",\n \"case\",\n \"default\",\n \"try\",\n \"switch\",\n \"continue\",\n \"typeof\",\n \"delete\",\n \"let\",\n \"yield\",\n \"const\",\n \"class\",\n // JS handles these with a special rule\n // \"get\",\n // \"set\",\n \"debugger\",\n \"async\",\n \"await\",\n \"static\",\n \"import\",\n \"from\",\n \"export\",\n \"extends\",\n // It's reached stage 3, which is \"recommended for implementation\":\n \"using\"\n];\nconst LITERALS = [\n \"true\",\n \"false\",\n \"null\",\n \"undefined\",\n \"NaN\",\n \"Infinity\"\n];\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\nconst TYPES = [\n // Fundamental objects\n \"Object\",\n \"Function\",\n \"Boolean\",\n \"Symbol\",\n // numbers and dates\n \"Math\",\n \"Date\",\n \"Number\",\n \"BigInt\",\n // text\n \"String\",\n \"RegExp\",\n // Indexed collections\n \"Array\",\n \"Float32Array\",\n \"Float64Array\",\n \"Int8Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"Int16Array\",\n \"Int32Array\",\n \"Uint16Array\",\n \"Uint32Array\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n // Keyed collections\n \"Set\",\n \"Map\",\n \"WeakSet\",\n \"WeakMap\",\n // Structured data\n \"ArrayBuffer\",\n \"SharedArrayBuffer\",\n \"Atomics\",\n \"DataView\",\n \"JSON\",\n // Control abstraction objects\n \"Promise\",\n \"Generator\",\n \"GeneratorFunction\",\n \"AsyncFunction\",\n // Reflection\n \"Reflect\",\n \"Proxy\",\n // Internationalization\n \"Intl\",\n // WebAssembly\n \"WebAssembly\"\n];\n\nconst ERROR_TYPES = [\n \"Error\",\n \"EvalError\",\n \"InternalError\",\n \"RangeError\",\n \"ReferenceError\",\n \"SyntaxError\",\n \"TypeError\",\n \"URIError\"\n];\n\nconst BUILT_IN_GLOBALS = [\n \"setInterval\",\n \"setTimeout\",\n \"clearInterval\",\n \"clearTimeout\",\n\n \"require\",\n \"exports\",\n\n \"eval\",\n \"isFinite\",\n \"isNaN\",\n \"parseFloat\",\n \"parseInt\",\n \"decodeURI\",\n \"decodeURIComponent\",\n \"encodeURI\",\n \"encodeURIComponent\",\n \"escape\",\n \"unescape\"\n];\n\nconst BUILT_IN_VARIABLES = [\n \"arguments\",\n \"this\",\n \"super\",\n \"console\",\n \"window\",\n \"document\",\n \"localStorage\",\n \"sessionStorage\",\n \"module\",\n \"self\",\n \"global\" // Node.js\n];\n\nconst BUILT_INS = [].concat(\n BUILT_IN_GLOBALS,\n TYPES,\n ERROR_TYPES\n);\n\n/*\nLanguage: JavaScript\nDescription: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.\nCategory: common, scripting, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/JavaScript\n*/\n\n\n/** @type LanguageFn */\nfunction javascript(hljs) {\n const regex = hljs.regex;\n /**\n * Takes a string like \"<Booger\" and checks to see\n * if we can find a matching \"</Booger\" later in the\n * content.\n * @param {RegExpMatchArray} match\n * @param {{after:number}} param1\n */\n const hasClosingTag = (match, { after }) => {\n const tag = \"</\" + match[0].slice(1);\n const pos = match.input.indexOf(tag, after);\n return pos !== -1;\n };\n\n const IDENT_RE$1 = IDENT_RE;\n const FRAGMENT = {\n begin: '<>',\n end: '</>'\n };\n // to avoid some special cases inside isTrulyOpeningTag\n const XML_SELF_CLOSING = /<[A-Za-z0-9\\\\._:-]+\\s*\\/>/;\n const XML_TAG = {\n begin: /<[A-Za-z0-9\\\\._:-]+/,\n end: /\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,\n /**\n * @param {RegExpMatchArray} match\n * @param {CallbackResponse} response\n */\n isTrulyOpeningTag: (match, response) => {\n const afterMatchIndex = match[0].length + match.index;\n const nextChar = match.input[afterMatchIndex];\n if (\n // HTML should not include another raw `<` inside a tag\n // nested type?\n // `<Array<Array<number>>`, etc.\n nextChar === \"<\" ||\n // the , gives away that this is not HTML\n // `<T, A extends keyof T, V>`\n nextChar === \",\"\n ) {\n response.ignoreMatch();\n return;\n }\n\n // `<something>`\n // Quite possibly a tag, lets look for a matching closing tag...\n if (nextChar === \">\") {\n // if we cannot find a matching closing tag, then we\n // will ignore it\n if (!hasClosingTag(match, { after: afterMatchIndex })) {\n response.ignoreMatch();\n }\n }\n\n // `<blah />` (self-closing)\n // handled by simpleSelfClosing rule\n\n let m;\n const afterMatch = match.input.substring(afterMatchIndex);\n\n // some more template typing stuff\n // <T = any>(key?: string) => Modify<\n if ((m = afterMatch.match(/^\\s*=/))) {\n response.ignoreMatch();\n return;\n }\n\n // `<From extends string>`\n // technically this could be HTML, but it smells like a type\n // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276\n if ((m = afterMatch.match(/^\\s+extends\\s+/))) {\n if (m.index === 0) {\n response.ignoreMatch();\n // eslint-disable-next-line no-useless-return\n return;\n }\n }\n }\n };\n const KEYWORDS$1 = {\n $pattern: IDENT_RE,\n keyword: KEYWORDS,\n literal: LITERALS,\n built_in: BUILT_INS,\n \"variable.language\": BUILT_IN_VARIABLES\n };\n\n // https://tc39.es/ecma262/#sec-literals-numeric-literals\n const decimalDigits = '[0-9](_?[0-9])*';\n const frac = `\\\\.(${decimalDigits})`;\n // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;\n const NUMBER = {\n className: 'number',\n variants: [\n // DecimalLiteral\n { begin: `(\\\\b(${decimalInteger})((${frac})|\\\\.)?|(${frac}))` +\n `[eE][+-]?(${decimalDigits})\\\\b` },\n { begin: `\\\\b(${decimalInteger})\\\\b((${frac})\\\\b|\\\\.)?|(${frac})\\\\b` },\n\n // DecimalBigIntegerLiteral\n { begin: `\\\\b(0|[1-9](_?[0-9])*)n\\\\b` },\n\n // NonDecimalIntegerLiteral\n { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\" },\n { begin: \"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\" },\n { begin: \"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\" },\n\n // LegacyOctalIntegerLiteral (does not include underscore separators)\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n { begin: \"\\\\b0[0-7]+n?\\\\b\" },\n ],\n relevance: 0\n };\n\n const SUBST = {\n className: 'subst',\n begin: '\\\\$\\\\{',\n end: '\\\\}',\n keywords: KEYWORDS$1,\n contains: [] // defined later\n };\n const HTML_TEMPLATE = {\n begin: '\\.?html`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'xml'\n }\n };\n const CSS_TEMPLATE = {\n begin: '\\.?css`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'css'\n }\n };\n const GRAPHQL_TEMPLATE = {\n begin: '\\.?gql`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'graphql'\n }\n };\n const TEMPLATE_STRING = {\n className: 'string',\n begin: '`',\n end: '`',\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ]\n };\n const JSDOC_COMMENT = hljs.COMMENT(\n /\\/\\*\\*(?!\\/)/,\n '\\\\*/',\n {\n relevance: 0,\n contains: [\n {\n begin: '(?=@[A-Za-z]+)',\n relevance: 0,\n contains: [\n {\n className: 'doctag',\n begin: '@[A-Za-z]+'\n },\n {\n className: 'type',\n begin: '\\\\{',\n end: '\\\\}',\n excludeEnd: true,\n excludeBegin: true,\n relevance: 0\n },\n {\n className: 'variable',\n begin: IDENT_RE$1 + '(?=\\\\s*(-)|$)',\n endsParent: true,\n relevance: 0\n },\n // eat spaces (not newlines) so we can find\n // types or variables\n {\n begin: /(?=[^\\n])\\s/,\n relevance: 0\n }\n ]\n }\n ]\n }\n );\n const COMMENT = {\n className: \"comment\",\n variants: [\n JSDOC_COMMENT,\n hljs.C_BLOCK_COMMENT_MODE,\n hljs.C_LINE_COMMENT_MODE\n ]\n };\n const SUBST_INTERNALS = [\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n // This is intentional:\n // See https://github.com/highlightjs/highlight.js/issues/3288\n // hljs.REGEXP_MODE\n ];\n SUBST.contains = SUBST_INTERNALS\n .concat({\n // we need to pair up {} inside our subst to prevent\n // it from ending too early by matching another }\n begin: /\\{/,\n end: /\\}/,\n keywords: KEYWORDS$1,\n contains: [\n \"self\"\n ].concat(SUBST_INTERNALS)\n });\n const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);\n const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([\n // eat recursive parens in sub expressions\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n keywords: KEYWORDS$1,\n contains: [\"self\"].concat(SUBST_AND_COMMENTS)\n }\n ]);\n const PARAMS = {\n className: 'params',\n // convert this to negative lookbehind in v12\n begin: /(\\s*)\\(/, // to match the parms with\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n };\n\n // ES6 classes\n const CLASS_OR_EXTENDS = {\n variants: [\n // class Car extends vehicle\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1,\n /\\s+/,\n /extends/,\n /\\s+/,\n regex.concat(IDENT_RE$1, \"(\", regex.concat(/\\./, IDENT_RE$1), \")*\")\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\",\n 5: \"keyword\",\n 7: \"title.class.inherited\"\n }\n },\n // class Car\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n },\n\n ]\n };\n\n const CLASS_REFERENCE = {\n relevance: 0,\n match:\n regex.either(\n // Hard coded exceptions\n /\\bJSON/,\n // Float32Array, OutT\n /\\b[A-Z][a-z]+([A-Z][a-z]*|\\d)*/,\n // CSSFactory, CSSFactoryT\n /\\b[A-Z]{2,}([A-Z][a-z]+|\\d)+([A-Z][a-z]*)*/,\n // FPs, FPsT\n /\\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\\d)*([A-Z][a-z]*)*/,\n // P\n // single letters are not highlighted\n // BLAH\n // this will be flagged as a UPPER_CASE_CONSTANT instead\n ),\n className: \"title.class\",\n keywords: {\n _: [\n // se we still get relevance credit for JS library classes\n ...TYPES,\n ...ERROR_TYPES\n ]\n }\n };\n\n const USE_STRICT = {\n label: \"use_strict\",\n className: 'meta',\n relevance: 10,\n begin: /^\\s*['\"]use (strict|asm)['\"]/\n };\n\n const FUNCTION_DEFINITION = {\n variants: [\n {\n match: [\n /function/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\s*\\()/\n ]\n },\n // anonymous function\n {\n match: [\n /function/,\n /\\s*(?=\\()/\n ]\n }\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n label: \"func.def\",\n contains: [ PARAMS ],\n illegal: /%/\n };\n\n const UPPER_CASE_CONSTANT = {\n relevance: 0,\n match: /\\b[A-Z][A-Z_0-9]+\\b/,\n className: \"variable.constant\"\n };\n\n function noneOf(list) {\n return regex.concat(\"(?!\", list.join(\"|\"), \")\");\n }\n\n const FUNCTION_CALL = {\n match: regex.concat(\n /\\b/,\n noneOf([\n ...BUILT_IN_GLOBALS,\n \"super\",\n \"import\",\n \"await\",\n ].map(x => `${x}\\\\s*\\\\(`)),\n IDENT_RE$1, regex.lookahead(/\\s*\\(/)),\n className: \"title.function\",\n relevance: 0\n };\n\n const PROPERTY_ACCESS = {\n begin: regex.concat(/\\./, regex.lookahead(\n regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)\n )),\n end: IDENT_RE$1,\n excludeBegin: true,\n keywords: \"prototype\",\n className: \"property\",\n relevance: 0\n };\n\n const GETTER_OR_SETTER = {\n match: [\n /get|set/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\()/\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n { // eat to avoid empty params\n begin: /\\(\\)/\n },\n PARAMS\n ]\n };\n\n const FUNC_LEAD_IN_RE = '(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\\\s*=>';\n\n const FUNCTION_VARIABLE = {\n match: [\n /const|var|let/, /\\s+/,\n IDENT_RE$1, /\\s*/,\n /=\\s*/,\n /(async\\s*)?/, // async is optional\n regex.lookahead(FUNC_LEAD_IN_RE)\n ],\n keywords: \"async\",\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n PARAMS\n ]\n };\n\n return {\n name: 'JavaScript',\n aliases: ['js', 'jsx', 'mjs', 'cjs'],\n keywords: KEYWORDS$1,\n // this will be extended by TypeScript\n exports: { PARAMS_CONTAINS, CLASS_REFERENCE },\n illegal: /#(?![$_A-Za-z])/,\n contains: [\n hljs.SHEBANG({\n label: \"shebang\",\n binary: \"node\",\n relevance: 5\n }),\n USE_STRICT,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n COMMENT,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n CLASS_REFERENCE,\n {\n scope: 'attr',\n match: IDENT_RE$1 + regex.lookahead(':'),\n relevance: 0\n },\n FUNCTION_VARIABLE,\n { // \"value\" container\n begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n keywords: 'return throw case',\n relevance: 0,\n contains: [\n COMMENT,\n hljs.REGEXP_MODE,\n {\n className: 'function',\n // we have to count the parens to make sure we actually have the\n // correct bounding ( ) before the =>. There could be any number of\n // sub-expressions inside also surrounded by parens.\n begin: FUNC_LEAD_IN_RE,\n returnBegin: true,\n end: '\\\\s*=>',\n contains: [\n {\n className: 'params',\n variants: [\n {\n begin: hljs.UNDERSCORE_IDENT_RE,\n relevance: 0\n },\n {\n className: null,\n begin: /\\(\\s*\\)/,\n skip: true\n },\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n }\n ]\n }\n ]\n },\n { // could be a comma delimited list of params to a function call\n begin: /,/,\n relevance: 0\n },\n {\n match: /\\s+/,\n relevance: 0\n },\n { // JSX\n variants: [\n { begin: FRAGMENT.begin, end: FRAGMENT.end },\n { match: XML_SELF_CLOSING },\n {\n begin: XML_TAG.begin,\n // we carefully check the opening tag to see if it truly\n // is a tag and not a false positive\n 'on:begin': XML_TAG.isTrulyOpeningTag,\n end: XML_TAG.end\n }\n ],\n subLanguage: 'xml',\n contains: [\n {\n begin: XML_TAG.begin,\n end: XML_TAG.end,\n skip: true,\n contains: ['self']\n }\n ]\n }\n ],\n },\n FUNCTION_DEFINITION,\n {\n // prevent this from getting swallowed up by function\n // since they appear \"function like\"\n beginKeywords: \"while if switch catch for\"\n },\n {\n // we have to count the parens to make sure we actually have the correct\n // bounding ( ). There could be any number of sub-expressions inside\n // also surrounded by parens.\n begin: '\\\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +\n '\\\\(' + // first parens\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)\\\\s*\\\\{', // end parens\n returnBegin:true,\n label: \"func.def\",\n contains: [\n PARAMS,\n hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: \"title.function\" })\n ]\n },\n // catch ... so it won't trigger the property rule below\n {\n match: /\\.\\.\\./,\n relevance: 0\n },\n PROPERTY_ACCESS,\n // hack: prevents detection of keywords in some circumstances\n // .keyword()\n // $keyword = x\n {\n match: '\\\\$' + IDENT_RE$1,\n relevance: 0\n },\n {\n match: [ /\\bconstructor(?=\\s*\\()/ ],\n className: { 1: \"title.function\" },\n contains: [ PARAMS ]\n },\n FUNCTION_CALL,\n UPPER_CASE_CONSTANT,\n CLASS_OR_EXTENDS,\n GETTER_OR_SETTER,\n {\n match: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n }\n ]\n };\n}\n\nexport { javascript as default };\n","// https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10\nvar decimalDigits = '[0-9](_*[0-9])*';\nvar frac = `\\\\.(${decimalDigits})`;\nvar hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*';\nvar NUMERIC = {\n className: 'number',\n variants: [\n // DecimalFloatingPointLiteral\n // including ExponentPart\n { begin: `(\\\\b(${decimalDigits})((${frac})|\\\\.)?|(${frac}))` +\n `[eE][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n // excluding ExponentPart\n { begin: `\\\\b(${decimalDigits})((${frac})[fFdD]?\\\\b|\\\\.([fFdD]\\\\b)?)` },\n { begin: `(${frac})[fFdD]?\\\\b` },\n { begin: `\\\\b(${decimalDigits})[fFdD]\\\\b` },\n\n // HexadecimalFloatingPointLiteral\n { begin: `\\\\b0[xX]((${hexDigits})\\\\.?|(${hexDigits})?\\\\.(${hexDigits}))` +\n `[pP][+-]?(${decimalDigits})[fFdD]?\\\\b` },\n\n // DecimalIntegerLiteral\n { begin: '\\\\b(0|[1-9](_*[0-9])*)[lL]?\\\\b' },\n\n // HexIntegerLiteral\n { begin: `\\\\b0[xX](${hexDigits})[lL]?\\\\b` },\n\n // OctalIntegerLiteral\n { begin: '\\\\b0(_*[0-7])*[lL]?\\\\b' },\n\n // BinaryIntegerLiteral\n { begin: '\\\\b0[bB][01](_*[01])*[lL]?\\\\b' },\n ],\n relevance: 0\n};\n\n/*\nLanguage: Java\nAuthor: Vsevolod Solovyov <vsevolod.solovyov@gmail.com>\nCategory: common, enterprise\nWebsite: https://www.java.com/\n*/\n\n\n/**\n * Allows recursive regex expressions to a given depth\n *\n * ie: recurRegex(\"(abc~~~)\", /~~~/g, 2) becomes:\n * (abc(abc(abc)))\n *\n * @param {string} re\n * @param {RegExp} substitution (should be a g mode regex)\n * @param {number} depth\n * @returns {string}``\n */\nfunction recurRegex(re, substitution, depth) {\n if (depth === -1) return \"\";\n\n return re.replace(substitution, _ => {\n return recurRegex(re, substitution, depth - 1);\n });\n}\n\n/** @type LanguageFn */\nfunction java(hljs) {\n const regex = hljs.regex;\n\n // A Java identifier consisting of letters, digits, underscore or dollar sign, not beginning with a digit\n const JAVA_IDENT_RE = '[\\u00C0-\\u02B8a-zA-Z_$][\\u00C0-\\u02B8a-zA-Z_$0-9]*';\n\n // Optional 1..n pairs of square brackets identifying an array type\n const ARRAY_BRACKETS_OPTIONAL_RE = '(?:(?:\\\\s*\\\\[\\\\s*])+)?';\n\n // A simple Java type: a type name, optionally followed by type arguments and/or array brackets\n // '<@@@>' is replaced with the pattern for optional type arguments by recurRegex below.\n const SIMPLE_TYPE_RE = JAVA_IDENT_RE + '<@@@>' + ARRAY_BRACKETS_OPTIONAL_RE;\n\n // A bounded (? extends Number) or unbounded (?) wildcard type\n const WILDCARD_TYPE_RE = '\\\\?(?:\\\\s+(?:extends|super)\\\\s+' + SIMPLE_TYPE_RE + ')?';\n\n // A Java type argument, consisting of a wildcard or simple type\n const TYPE_ARG_RE = '(?:' + WILDCARD_TYPE_RE + '|' + SIMPLE_TYPE_RE + ')';\n\n // Pattern for optional generic type arguments in angle brackets with up to 2 levels of nested type arguments\n const TYPE_ARGS_OPTIONAL_RE = recurRegex('(?:\\\\s*<\\\\s*' + TYPE_ARG_RE + '(?:\\\\s*,\\\\s*' + TYPE_ARG_RE + ')*\\\\s*>)?',\n /<@@@>/g, 2);\n\n const MAIN_KEYWORDS = [\n 'synchronized',\n 'abstract',\n 'private',\n 'var',\n 'static',\n 'if',\n 'const ',\n 'for',\n 'while',\n 'strictfp',\n 'finally',\n 'protected',\n 'import',\n 'native',\n 'final',\n 'void',\n 'enum',\n 'else',\n 'break',\n 'transient',\n 'catch',\n 'instanceof',\n 'volatile',\n 'case',\n 'assert',\n 'package',\n 'default',\n 'public',\n 'try',\n 'switch',\n 'continue',\n 'throws',\n 'protected',\n 'public',\n 'private',\n 'module',\n 'requires',\n 'exports',\n 'do',\n 'sealed',\n 'yield',\n 'permits',\n 'goto',\n 'when'\n ];\n\n const BUILT_INS = [\n 'super',\n 'this'\n ];\n\n const LITERALS = [\n 'false',\n 'true',\n 'null'\n ];\n\n const TYPES = [\n 'char',\n 'boolean',\n 'long',\n 'float',\n 'int',\n 'byte',\n 'short',\n 'double'\n ];\n\n const KEYWORDS = {\n keyword: MAIN_KEYWORDS,\n literal: LITERALS,\n type: TYPES,\n built_in: BUILT_INS\n };\n\n const ANNOTATION = {\n className: 'meta',\n begin: '@' + JAVA_IDENT_RE,\n contains: [\n {\n begin: /\\(/,\n end: /\\)/,\n contains: [ \"self\" ] // allow nested () inside our annotation\n }\n ]\n };\n const PARAMS = {\n className: 'params',\n begin: /\\(/,\n end: /\\)/,\n keywords: KEYWORDS,\n relevance: 0,\n contains: [ hljs.C_BLOCK_COMMENT_MODE ],\n endsParent: true\n };\n\n return {\n name: 'Java',\n aliases: [ 'jsp' ],\n keywords: KEYWORDS,\n illegal: /<\\/|#/,\n contains: [\n hljs.COMMENT(\n '/\\\\*\\\\*',\n '\\\\*/',\n {\n relevance: 0,\n contains: [\n {\n // eat up @'s in emails to prevent them to be recognized as doctags\n begin: /\\w+@/,\n relevance: 0\n },\n {\n className: 'doctag',\n begin: '@[A-Za-z]+'\n }\n ]\n }\n ),\n // relevance boost\n {\n begin: /import java\\.[a-z]+\\./,\n keywords: \"import\",\n relevance: 2\n },\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n {\n begin: /\"\"\"/,\n end: /\"\"\"/,\n className: \"string\",\n contains: [ hljs.BACKSLASH_ESCAPE ]\n },\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n {\n match: [\n /\\b(?:class|interface|enum|extends|implements|new)/,\n /\\s+/,\n JAVA_IDENT_RE\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n },\n {\n // Exceptions for hyphenated keywords\n match: /non-sealed/,\n scope: \"keyword\"\n },\n {\n // Expression keywords prevent keyword-led expressions from being\n // recognized as variable or method declarations.\n beginKeywords: 'new throw return else yield assert',\n relevance: 0\n },\n {\n begin: [\n JAVA_IDENT_RE,\n regex.concat(TYPE_ARGS_OPTIONAL_RE, ARRAY_BRACKETS_OPTIONAL_RE, /\\s+/),\n JAVA_IDENT_RE,\n ARRAY_BRACKETS_OPTIONAL_RE,\n /\\s*/,\n /=(?!=)/\n ],\n className: {\n 1: \"type\",\n 3: \"variable\",\n 6: \"operator\"\n }\n },\n {\n begin: [\n /record/,\n /\\s+/,\n JAVA_IDENT_RE\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.class\"\n },\n contains: [\n PARAMS,\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n {\n begin: [\n JAVA_IDENT_RE,\n regex.concat(TYPE_ARGS_OPTIONAL_RE, ARRAY_BRACKETS_OPTIONAL_RE, /\\s+/),\n JAVA_IDENT_RE,\n /\\s*(?=\\()/\n ],\n className: {\n 1: \"type\",\n 3: \"title.function\"\n },\n keywords: KEYWORDS,\n contains: [\n {\n className: 'params',\n begin: /\\(/,\n end: /\\)/,\n keywords: KEYWORDS,\n relevance: 0,\n contains: [\n ANNOTATION,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n NUMERIC,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n NUMERIC,\n ANNOTATION\n ]\n };\n}\n\nexport { java as default };\n","import { unified } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkRehype from \"remark-rehype\";\nimport remarkStringify from \"remark-stringify\";\nimport rehypeStringify from \"rehype-stringify\";\nimport rehypeParse from \"rehype-parse\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeRemark from \"rehype-remark\";\nimport rehypeSanitize, { defaultSchema } from \"rehype-sanitize\";\nimport rehypeHighlight from \"rehype-highlight\";\nimport { visit } from \"unist-util-visit\";\nimport type { Root as MdastRoot, RootContent } from \"mdast\";\nimport type { Root as HastRoot, Element, ElementContent } from \"hast\";\nimport type { State } from \"hast-util-to-mdast\";\nimport json from \"highlight.js/lib/languages/json\";\nimport sql from \"highlight.js/lib/languages/sql\";\nimport typescript from \"highlight.js/lib/languages/typescript\";\nimport javascript from \"highlight.js/lib/languages/javascript\";\nimport java from \"highlight.js/lib/languages/java\";\n\nconst HIGHLIGHT_LANGUAGES = { json, sql, typescript, javascript, java };\n\n/**\n * `rehype-sanitize`'s default (GFM) schema strips `class` from `code`/`span`,\n * which would silently discard the `hljs-*` classes rehype-highlight just\n * added. Extend it explicitly so exported HTML keeps the highlighting.\n */\nconst sanitizeSchemaWithHighlight = {\n ...defaultSchema,\n attributes: {\n ...defaultSchema.attributes,\n code: [...(defaultSchema.attributes?.code ?? []), \"className\"],\n span: [...(defaultSchema.attributes?.span ?? []), \"className\"],\n },\n};\n\nexport interface PipelineOptions {\n sanitize: boolean;\n}\n\nconst STRINGIFY_OPTIONS = {\n bullet: \"-\",\n listItemIndent: \"one\",\n fences: true,\n rule: \"-\",\n} as const;\n\nfunction isElement(node: ElementContent | HastRoot): node is Element {\n return node.type === \"element\";\n}\n\n/**\n * Replaces mdast raw-html nodes before remark-rehype so the WYSIWYG editor\n * can round-trip them byte-exact: block HTML becomes a placeholder element\n * carrying the encoded source; inline HTML degrades to visible plain text\n * (best effort, never executed).\n */\nfunction embedRawHtml() {\n return (tree: MdastRoot): void => {\n visit(tree, \"html\", (node, index, parent) => {\n if (parent === undefined || index === undefined) return;\n if (parent.type === \"paragraph\") {\n parent.children[index] = { type: \"text\", value: node.value };\n } else {\n const placeholder = {\n type: \"htmlEmbed\",\n data: {\n hName: \"div\",\n hProperties: { dataRawHtml: encodeURIComponent(node.value) },\n },\n };\n parent.children[index] = placeholder as unknown as RootContent;\n }\n });\n };\n}\n\n/**\n * remark-gfm emits `<li class=\"task-list-item\"><input …>` but Tiptap's\n * TaskList/TaskItem extensions only parse `data-type` attributes, so GFM\n * checklists would silently downgrade to plain lists without this rewrite.\n */\nfunction taskListsToTiptap() {\n return (tree: HastRoot): void => {\n visit(tree, \"element\", (node) => {\n if (node.tagName !== \"li\") return;\n const classes = Array.isArray(node.properties.className)\n ? node.properties.className\n : [];\n if (!classes.includes(\"task-list-item\")) return;\n\n let checked = false;\n node.children = node.children.filter((child) => {\n if (isElement(child) && child.tagName === \"input\") {\n checked = child.properties.checked === true;\n return false;\n }\n return true;\n });\n node.properties.dataType = \"taskItem\";\n node.properties.dataChecked = String(checked);\n node.properties.className = undefined;\n });\n visit(tree, \"element\", (node) => {\n if (node.tagName !== \"ul\") return;\n const hasTaskItem = node.children.some(\n (child) => isElement(child) && child.properties.dataType === \"taskItem\",\n );\n if (hasTaskItem) {\n node.properties.dataType = \"taskList\";\n node.properties.className = undefined;\n }\n });\n };\n}\n\n/**\n * Inverse of taskListsToTiptap: Tiptap wraps task item content in\n * `<label><input …></label><div>…</div>`, which hast-util-to-mdast does not\n * recognize as a GFM task item. Rewrites to `<li><input …> content`.\n */\nfunction tiptapTaskListsToGfm() {\n return (tree: HastRoot): void => {\n visit(tree, \"element\", (node) => {\n if (node.tagName !== \"li\" || node.properties.dataType !== \"taskItem\") {\n return;\n }\n const checked = node.properties.dataChecked === \"true\";\n const content: ElementContent[] = [];\n for (const child of node.children) {\n if (isElement(child) && child.tagName === \"label\") continue;\n if (isElement(child) && child.tagName === \"div\") {\n content.push(...child.children);\n } else {\n content.push(child);\n }\n }\n const checkbox: Element = {\n type: \"element\",\n tagName: \"input\",\n properties: { type: \"checkbox\", checked, disabled: true },\n children: [],\n };\n node.children = [checkbox, ...content];\n });\n };\n}\n\n/**\n * Tiptap wraps every list item's content in `<p>`, which hast-util-to-mdast\n * interprets as a loose list (blank lines between items). Unwrapping the\n * single paragraph keeps serialized lists tight/canonical.\n */\nfunction tightenListItems() {\n return (tree: HastRoot): void => {\n visit(tree, \"element\", (node) => {\n if (node.tagName !== \"li\") return;\n const paragraphs = node.children.filter(\n (child) => isElement(child) && child.tagName === \"p\",\n );\n if (paragraphs.length !== 1) return;\n node.children = node.children.flatMap((child) =>\n isElement(child) && child.tagName === \"p\" ? child.children : [child],\n );\n });\n };\n}\n\n/** Markdown (GFM) → HTML listo para `editor.commands.setContent`. */\nexport function markdownToEditorHtml(markdown: string): string {\n const file = unified()\n .use(remarkParse)\n .use(remarkGfm)\n .use(embedRawHtml)\n .use(remarkRehype)\n .use(taskListsToTiptap)\n .use(rehypeStringify)\n .processSync(markdown);\n return String(file);\n}\n\n/** HTML emitido por Tiptap (`editor.getHTML()`) → Markdown (GFM). */\nexport function editorHtmlToMarkdown(html: string): string {\n const file = unified()\n .use(rehypeParse, { fragment: true })\n .use(tiptapTaskListsToGfm)\n .use(tightenListItems)\n .use(rehypeRemark, {\n handlers: {\n div(state: State, node: Element) {\n const raw = node.properties.dataRawHtml;\n if (typeof raw === \"string\") {\n return { type: \"html\" as const, value: decodeURIComponent(raw) };\n }\n return state.all(node);\n },\n },\n })\n .use(remarkGfm)\n .use(remarkStringify, STRINGIFY_OPTIONS)\n .processSync(html);\n return String(file);\n}\n\n/** Markdown (GFM) → HTML completo para exportación (FR-013, FR-017). */\nexport function markdownToHtml(\n markdown: string,\n options: PipelineOptions,\n): string {\n const processor = unified()\n .use(remarkParse)\n .use(remarkGfm)\n .use(remarkRehype, { allowDangerousHtml: true })\n .use(rehypeRaw)\n .use(rehypeHighlight, {\n languages: HIGHLIGHT_LANGUAGES,\n ignoreMissing: true,\n });\n const withSanitize = options.sanitize\n ? processor.use(rehypeSanitize, sanitizeSchemaWithHighlight)\n : processor;\n const file = withSanitize.use(rehypeStringify).processSync(markdown);\n return String(file);\n}\n\n/** Sanitiza un fragmento HTML aislado (bloques de HTML embebido, FR-022). */\nexport function sanitizeHtmlFragment(html: string): string {\n const file = unified()\n .use(rehypeParse, { fragment: true })\n .use(rehypeSanitize)\n .use(rehypeStringify)\n .processSync(html);\n return String(file);\n}\n","/**\n * Carga perezosa de `mermaid`: la librería es pesada y solo hace falta cuando\n * un documento contiene diagramas, así que nunca se importa estáticamente\n * (Principios VIII y XII, research.md §4).\n */\n\ntype MermaidModule = typeof import(\"mermaid\").default;\n\nlet mermaidPromise: Promise<MermaidModule> | null = null;\n\n/** Carga (una sola vez) e inicializa mermaid con configuración segura. */\nexport async function loadMermaid(): Promise<MermaidModule> {\n if (mermaidPromise === null) {\n mermaidPromise = import(\"mermaid\").then((module) => {\n const mermaid = module.default;\n // `strict` escapa el HTML de las etiquetas y deshabilita los callbacks\n // de clic: el contenido puede venir de HTML pegado por el usuario, así\n // que se trata como no confiable (research.md §3).\n mermaid.initialize({ startOnLoad: false, securityLevel: \"strict\" });\n return mermaid;\n });\n }\n return mermaidPromise;\n}\n\n/**\n * Filtro barato previo: evita cargar la librería completa de Mermaid en el\n * caso común (pegar HTML que claramente no es un diagrama). No decide por sí\n * solo — lo que confirma es siempre `mermaid.parse` (research.md §4).\n */\nconst MERMAID_KEYWORDS =\n /^\\s*(graph|flowchart|sequenceDiagram|classDiagram|stateDiagram(-v2)?|erDiagram|journey|gantt|pie|gitGraph|mindmap|timeline|quadrantChart|requirementDiagram|C4Context|sankey(-beta)?|xychart(-beta)?|block(-beta)?|packet(-beta)?|architecture(-beta)?|kanban|radar|treemap)\\b/;\n\n/** `true` si el texto es un diagrama Mermaid sintácticamente válido. */\nexport async function isMermaidSyntax(text: string): Promise<boolean> {\n const trimmed = text.trim();\n if (trimmed === \"\") return false;\n if (!MERMAID_KEYWORDS.test(trimmed)) return false;\n try {\n const mermaid = await loadMermaid();\n const result = await mermaid.parse(trimmed, { suppressErrors: true });\n return result !== false;\n } catch {\n return false;\n }\n}\n\nlet renderCounter = 0;\n\n/**\n * Renderiza `source` a SVG. Devuelve `null` si la sintaxis es inválida, para\n * que el llamador degrade a texto legible sin romper el documento (FR-008).\n */\nexport async function renderMermaid(source: string): Promise<string | null> {\n const trimmed = source.trim();\n if (trimmed === \"\") return null;\n if (!MERMAID_KEYWORDS.test(trimmed)) return null;\n try {\n const mermaid = await loadMermaid();\n const valid = await mermaid.parse(trimmed, { suppressErrors: true });\n if (valid === false) return null;\n renderCounter += 1;\n const { svg } = await mermaid.render(`mdw-mermaid-${renderCounter}`, trimmed);\n return svg;\n } catch {\n return null;\n }\n}\n","import type { Editor } from \"@tiptap/core\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\n\n/**\n * Mapeo aproximado de posición de cursor entre la vista Markdown (offset de\n * carácter en el texto fuente) y la vista WYSIWYG (posición de documento\n * ProseMirror).\n *\n * El mapeo se basa en el texto plano acumulado: se cuenta cuánto texto\n * \"visible\" precede a la posición en cada representación y se busca el punto\n * equivalente en la otra. No es byte-exacto cuando el Markdown usa sintaxis\n * que no aparece en el texto renderizado (marcadores como `**`, `#`, `|`),\n * por eso la spec lo define como mejor esfuerzo (FR-006).\n */\n\n/** Caracteres de sintaxis Markdown que no forman parte del texto renderizado. */\nconst MARKDOWN_SYNTAX = /[*_`~#>\\-+|[\\]()!]/;\n\n/**\n * Cuenta caracteres de texto \"visible\" (excluyendo sintaxis Markdown obvia y\n * espacios de indentación) en `markdown` hasta `offset`.\n */\nfunction visibleTextLengthUpTo(markdown: string, offset: number): number {\n let count = 0;\n const limit = Math.min(offset, markdown.length);\n for (let i = 0; i < limit; i += 1) {\n const char = markdown[i];\n if (char === undefined) continue;\n if (char === \"\\n\") {\n count += 1;\n continue;\n }\n if (MARKDOWN_SYNTAX.test(char)) continue;\n count += 1;\n }\n return count;\n}\n\n/** Texto visible acumulado del documento ProseMirror hasta `pos`. */\nfunction visibleTextLengthUpToPos(doc: ProseMirrorNode, pos: number): number {\n const clamped = Math.max(0, Math.min(pos, doc.content.size));\n // textBetween con separador de bloque \"\\n\" aproxima el texto tal como se ve.\n return doc.textBetween(0, clamped, \"\\n\", \"\\n\").length;\n}\n\n/**\n * Markdown offset → posición ProseMirror equivalente (aproximada).\n * Devuelve una posición siempre dentro del rango válido del documento.\n */\nexport function markdownOffsetToProseMirrorPos(\n markdown: string,\n offset: number,\n doc: ProseMirrorNode,\n): number {\n const target = visibleTextLengthUpTo(markdown, offset);\n if (target <= 0) return 0;\n\n const docSize = doc.content.size;\n let best = 0;\n let bestDelta = Number.POSITIVE_INFINITY;\n\n // Búsqueda lineal sobre posiciones del documento: el documento es de tamaño\n // moderado por diseño (spec 003, SC-006), así que es suficiente y evita\n // mantener un índice paralelo.\n for (let pos = 0; pos <= docSize; pos += 1) {\n const delta = Math.abs(visibleTextLengthUpToPos(doc, pos) - target);\n if (delta < bestDelta) {\n bestDelta = delta;\n best = pos;\n if (delta === 0) break;\n }\n }\n return best;\n}\n\n/**\n * Posición ProseMirror → offset equivalente en el Markdown fuente\n * (aproximado). Devuelve un offset siempre dentro del rango del string.\n */\nexport function proseMirrorPosToMarkdownOffset(\n editor: Editor,\n pos: number,\n markdown: string,\n): number {\n const target = visibleTextLengthUpToPos(editor.state.doc, pos);\n if (target <= 0) return 0;\n\n let best = 0;\n let bestDelta = Number.POSITIVE_INFINITY;\n for (let offset = 0; offset <= markdown.length; offset += 1) {\n const delta = Math.abs(visibleTextLengthUpTo(markdown, offset) - target);\n if (delta < bestDelta) {\n bestDelta = delta;\n best = offset;\n if (delta === 0) break;\n }\n }\n return best;\n}\n","import type { Editor } from \"@tiptap/core\";\nimport {\n isInTable,\n moveTableColumn,\n moveTableRow,\n selectedRect,\n} from \"@tiptap/pm/tables\";\n\nexport type MoveDirection = \"before\" | \"after\";\n\n/**\n * Mueve la columna actual una posición hacia `direction`. Sin efecto si ya\n * está en el borde correspondiente de la tabla (FR-005, edge case de límites).\n */\nexport function moveCurrentColumn(\n editor: Editor,\n direction: MoveDirection,\n): void {\n const { state } = editor.view;\n if (!isInTable(state)) return;\n\n const rect = selectedRect(state);\n const from = rect.left;\n const to = direction === \"before\" ? from - 1 : from + 1;\n if (to < 0 || to >= rect.map.width) return;\n\n moveTableColumn({ from, to })(state, editor.view.dispatch, editor.view);\n}\n\n/**\n * Mueve la fila actual una posición hacia `direction`. Sin efecto si ya está\n * en el borde correspondiente de la tabla (FR-005, edge case de límites).\n */\nexport function moveCurrentRow(\n editor: Editor,\n direction: MoveDirection,\n): void {\n const { state } = editor.view;\n if (!isInTable(state)) return;\n\n const rect = selectedRect(state);\n const from = rect.top;\n const to = direction === \"before\" ? from - 1 : from + 1;\n // La fila 0 es el encabezado: las filas de datos no deben moverse a ella ni\n // el encabezado desplazarse hacia abajo.\n if (to < 1 || to >= rect.map.height) return;\n\n moveTableRow({ from, to })(state, editor.view.dispatch, editor.view);\n}\n","import type { Editor } from \"@tiptap/core\";\nimport { GapCursor } from \"@tiptap/pm/gapcursor\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { Selection, TextSelection } from \"@tiptap/pm/state\";\nimport type { EditorView } from \"@tiptap/pm/view\";\n\n/**\n * Garantiza un párrafo vacío editable tras un bloque final (tabla, código,\n * Mermaid, cita, lista…). La extensión `trailingNode` de StarterKit solo\n * actúa tras una transacción, así que el contenido inicial que termina en\n * bloque quedaba sin línea posterior (FR-001). La inserción no emite\n * `onUpdate`, no entra en el historial y no cambia el Markdown, porque el\n * pipeline descarta los párrafos vacíos finales (FR-008, FR-010).\n */\nexport function ensureTrailingParagraph(editor: Editor): void {\n if (!editor.isEditable) return;\n const { state, view } = editor;\n const paragraph = state.schema.nodes[\"paragraph\"];\n if (!paragraph) return;\n if (state.doc.lastChild?.type === paragraph) return;\n view.dispatch(\n state.tr\n .insert(state.doc.content.size, paragraph.create())\n .setMeta(\"preventUpdate\", true)\n .setMeta(\"addToHistory\", false),\n );\n}\n\ninterface TopLevelBlock {\n node: ProseMirrorNode;\n pos: number;\n el: HTMLElement | null;\n}\n\nfunction topLevelBlocks(view: EditorView): TopLevelBlock[] {\n const blocks: TopLevelBlock[] = [];\n view.state.doc.forEach((node, pos) => {\n const dom = view.nodeDOM(pos);\n blocks.push({ node, pos, el: dom instanceof HTMLElement ? dom : null });\n });\n return blocks;\n}\n\nfunction isEmptyParagraph(node: ProseMirrorNode | undefined): boolean {\n return (\n node !== undefined &&\n node.type.name === \"paragraph\" &&\n node.content.size === 0\n );\n}\n\n/** Un clic sobre la barra de scroll del wrapper no debe tratarse como área libre. */\nfunction isOnScrollbar(element: Element, event: MouseEvent): boolean {\n const rect = element.getBoundingClientRect();\n return (\n (element.clientWidth > 0 &&\n event.clientX - rect.left >= element.clientWidth) ||\n (element.clientHeight > 0 &&\n event.clientY - rect.top >= element.clientHeight)\n );\n}\n\n/**\n * Índice de la frontera entre bloques de nivel superior (0 = antes del\n * primero, `childCount` = tras el último) que corresponde a un `mousedown`\n * sobre un área libre, o `null` si el clic no es de área libre.\n */\nfunction findBoundary(\n view: EditorView,\n target: Element,\n event: MouseEvent,\n): number | null {\n const blocks = topLevelBlocks(view);\n const last = blocks[blocks.length - 1];\n if (last === undefined || last.el === null) return null;\n\n // Tabla: el clic a su derecha o en su margen cae sobre el wrapper (más\n // ancho que la tabla); según esté sobre o bajo la tabla, la frontera es la\n // anterior o la posterior.\n const tableIndex = blocks.findIndex(\n (block) => block.el === target && block.node.type.name === \"table\",\n );\n if (tableIndex !== -1) {\n if (isOnScrollbar(target, event)) return null;\n const tableTop = target.querySelector(\"table\")?.getBoundingClientRect().top;\n return tableTop !== undefined && event.clientY < tableTop\n ? tableIndex\n : tableIndex + 1;\n }\n\n // A partir de aquí solo clics sobre el propio contenedor del editor\n // (padding, huecos entre bloques, espacio bajo el contenido).\n if (target !== view.dom) return null;\n\n // Bajo el contenido, o junto al último bloque cuando le sigue la línea\n // vacía auxiliar: frontera final.\n const beforeLast = blocks[blocks.length - 2];\n const lastIsEmpty = isEmptyParagraph(last.node);\n const thresholdEl =\n lastIsEmpty && beforeLast?.node.type.name !== \"paragraph\"\n ? (beforeLast?.el ?? last.el)\n : last.el;\n const threshold = thresholdEl.getBoundingClientRect();\n if (event.clientY >= (lastIsEmpty ? threshold.top : threshold.bottom)) {\n return last.node.type.name === \"paragraph\" ? blocks.length : null;\n }\n\n // Padding lateral junto a una tabla: misma frontera posterior.\n const inside = blocks.findIndex((block) => {\n const rect = block.el?.getBoundingClientRect();\n return (\n rect !== undefined &&\n event.clientY >= rect.top &&\n event.clientY <= rect.bottom\n );\n });\n if (inside !== -1) {\n return blocks[inside]?.node.type.name === \"table\" ? inside + 1 : null;\n }\n\n // Hueco entre dos bloques: solo si alguno no admite cursor de texto\n // (tabla, código, diagrama…); entre párrafos ProseMirror ya lo resuelve.\n const next = blocks.findIndex(\n (block) =>\n block.el !== null && block.el.getBoundingClientRect().top > event.clientY,\n );\n if (next < 1) return null;\n const prevNode = blocks[next - 1]?.node;\n const nextNode = blocks[next]?.node;\n return prevNode?.isTextblock && nextNode?.isTextblock ? null : next;\n}\n\n/**\n * Selección para una frontera entre bloques: dentro de una línea vacía\n * adyacente o al borde de un párrafo si la hay; si no, un cursor de hueco\n * (Enter inserta ahí una línea nueva).\n */\nfunction selectionAtBoundary(\n doc: ProseMirrorNode,\n index: number,\n): Selection {\n let pos = 0;\n for (let i = 0; i < index; i++) pos += doc.child(i).nodeSize;\n const prev = index > 0 ? doc.child(index - 1) : undefined;\n const next = index < doc.childCount ? doc.child(index) : undefined;\n\n if (isEmptyParagraph(next)) return TextSelection.create(doc, pos + 1);\n if (isEmptyParagraph(prev)) return TextSelection.create(doc, pos - 1);\n if (next === undefined && prev?.isTextblock) {\n return TextSelection.create(doc, pos - 1);\n }\n return new GapCursor(doc.resolve(pos));\n}\n\n/**\n * `mousedown` sobre un área libre fuera de los bloques: a la derecha o en el\n * margen de una tabla, en el hueco entre dos bloques, o a la derecha/debajo\n * del último bloque. Coloca el cursor en la frontera correspondiente en vez\n * de dejar que ProseMirror lo resuelva hacia la última celda o el interior\n * del bloque (FR-002, FR-012). Con una línea vacía adyacente el cursor entra\n * en ella; si no, queda un cursor de hueco y Enter inserta la línea. Devuelve\n * `true` si gestionó el evento. Los clics dentro de celdas, código o diagramas\n * no coinciden con estas condiciones y conservan su comportamiento (FR-006);\n * en solo lectura no hace nada (FR-009).\n */\nexport function handleBlankAreaMouseDown(\n view: EditorView,\n event: MouseEvent,\n): boolean {\n if (!view.editable || event.button !== 0 || event.shiftKey) return false;\n const target = event.target;\n if (!(target instanceof Element)) return false;\n\n const boundary = findBoundary(view, target, event);\n if (boundary === null) return false;\n\n event.preventDefault();\n view.dispatch(\n view.state.tr\n .setSelection(selectionAtBoundary(view.state.doc, boundary))\n .scrollIntoView(),\n );\n view.focus();\n return true;\n}\n","import { EditorContent, type Editor } from \"@tiptap/react\";\n\nexport interface RenderedViewProps {\n editor: Editor | null;\n}\n\nexport function RenderedView({ editor }: RenderedViewProps) {\n return <EditorContent editor={editor} />;\n}\n","import { forwardRef } from \"react\";\nimport styles from \"../MarkdownEditor.module.css\";\n\nexport interface MarkdownSourceViewProps {\n value: string;\n onChange: (value: string) => void;\n readOnly?: boolean;\n}\n\nexport const MarkdownSourceView = forwardRef<\n HTMLTextAreaElement,\n MarkdownSourceViewProps\n>(function MarkdownSourceView({ value, onChange, readOnly = false }, ref) {\n return (\n <textarea\n ref={ref}\n className={styles[\"source\"]}\n aria-label=\"Código fuente Markdown\"\n spellCheck={false}\n value={value}\n readOnly={readOnly}\n onChange={(event) => onChange(event.target.value)}\n />\n );\n});\n",".root {\n --mdw-border: #d0d4da;\n --mdw-bg: #ffffff;\n --mdw-fg: #1f2328;\n --mdw-muted: #f6f7f9;\n --mdw-accent: #3d6fd8;\n --mdw-toolbar-gradient-from: #eeeeee;\n --mdw-toolbar-gradient-via: #dcdcdc;\n --mdw-toolbar-gradient-to: #cfcfcf;\n --mdw-toolbar-fg: #222222;\n --mdw-toolbar-font-family: Arial, sans-serif;\n --mdw-toolbar-select-bg: #e9e9e9;\n --mdw-button-active-bg: #c8c8c8;\n --mdw-button-hover-gradient-from: #ffffff;\n --mdw-button-hover-gradient-to: #d8d8d8;\n --mdw-content-bg: var(--mdw-bg);\n --mdw-content-markdown-fg: var(--mdw-fg);\n --mdw-content-markdown-font-family: ui-monospace, Consolas, monospace;\n --mdw-content-wysiwyg-fg: var(--mdw-fg);\n --mdw-content-wysiwyg-font-family: inherit;\n --mdw-scrollbar-thumb: #c1c1c1;\n --mdw-scrollbar-track: transparent;\n --mdw-table-header-bg: var(--mdw-muted);\n --mdw-code-block-bg: var(--mdw-muted);\n --mdw-mermaid-bg: var(--mdw-muted);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--mdw-border);\n border-radius: 6px;\n background: var(--mdw-bg);\n color: var(--mdw-fg);\n font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif;\n font-size: 14px;\n overflow: hidden;\n}\n\n.resizable {\n resize: both;\n overflow: auto;\n min-width: 320px;\n min-height: 200px;\n}\n\n.root *,\n.root *::before,\n.root *::after {\n box-sizing: inherit;\n}\n\n.content {\n flex: 1;\n min-height: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n background: var(--mdw-content-bg);\n scrollbar-color: var(--mdw-scrollbar-thumb) var(--mdw-scrollbar-track);\n}\n\n.content::-webkit-scrollbar-thumb,\n.source::-webkit-scrollbar-thumb,\n.toolbar::-webkit-scrollbar-thumb {\n background: var(--mdw-scrollbar-thumb);\n border-radius: 4px;\n}\n\n.content::-webkit-scrollbar-track,\n.source::-webkit-scrollbar-track,\n.toolbar::-webkit-scrollbar-track {\n background: var(--mdw-scrollbar-track);\n}\n\n.content > div {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.content :global(.ProseMirror) {\n flex: 1;\n padding: 12px 16px;\n outline: none;\n white-space: pre-wrap;\n word-wrap: break-word;\n color: var(--mdw-content-wysiwyg-fg);\n font-family: var(--mdw-content-wysiwyg-font-family);\n}\n\n.content :global(.ProseMirror p) {\n margin: 0 0 0.6em;\n}\n\n.content :global(.ProseMirror pre) {\n background: var(--mdw-code-block-bg);\n border: 1px solid var(--mdw-border);\n border-radius: 4px;\n padding: 8px 12px;\n font-family: ui-monospace, Consolas, monospace;\n font-size: 13px;\n overflow-x: auto;\n}\n\n.content :global(.hljs-keyword),\n.content :global(.hljs-selector-tag),\n.content :global(.hljs-literal) {\n color: #a626a4;\n}\n\n.content :global(.hljs-string),\n.content :global(.hljs-attr) {\n color: #50a14f;\n}\n\n.content :global(.hljs-comment),\n.content :global(.hljs-quote) {\n color: #a0a1a7;\n font-style: italic;\n}\n\n.content :global(.hljs-number),\n.content :global(.hljs-built_in) {\n color: #986801;\n}\n\n.content :global(.hljs-title),\n.content :global(.hljs-title.function_),\n.content :global(.hljs-title.class_) {\n color: #4078f2;\n}\n\n.content :global(.ProseMirror table) {\n border-collapse: collapse;\n margin: 0.6em 0;\n}\n\n.content :global(.ProseMirror th),\n.content :global(.ProseMirror td) {\n border: 1px solid var(--mdw-border);\n padding: 4px 8px;\n min-width: 3em;\n}\n\n.content :global(.ProseMirror th) {\n background: var(--mdw-table-header-bg);\n}\n\n/* Cursor de hueco entre bloques: hereda el color del texto del tema. */\n.content :global(.ProseMirror-gapcursor:after) {\n border-top-color: var(--mdw-content-wysiwyg-fg);\n}\n\n.content :global(.ProseMirror hr) {\n border: none;\n border-top: 2px solid var(--mdw-border);\n margin: 1em 0;\n}\n\n.content :global(.ProseMirror img) {\n max-width: 100%;\n}\n\n.content :global(.ProseMirror blockquote) {\n border-left: 3px solid var(--mdw-border);\n margin: 0.6em 0;\n padding-left: 12px;\n color: #57606a;\n}\n\n.content :global(.ProseMirror ul[data-type=\"taskList\"]) {\n list-style: none;\n padding-left: 0.25em;\n}\n\n.content :global(.ProseMirror ul[data-type=\"taskList\"] li) {\n display: flex;\n gap: 0.5em;\n}\n\n.content :global(.ProseMirror ul[data-type=\"taskList\"] li > div) {\n flex: 1;\n}\n\n.content :global(.ProseMirror div[data-html-block]) {\n border: 1px dashed var(--mdw-border);\n border-radius: 4px;\n padding: 6px 10px;\n margin: 0.6em 0;\n}\n\n.content :global(.ProseMirror div[data-mermaid-block]) {\n background: var(--mdw-mermaid-bg);\n border-radius: 4px;\n padding: 8px 12px;\n}\n\n.source {\n flex: 1;\n width: 100%;\n border: none;\n resize: none;\n outline: none;\n padding: 12px 16px;\n font-family: var(--mdw-content-markdown-font-family);\n font-size: 13px;\n line-height: 1.5;\n color: var(--mdw-content-markdown-fg);\n background: transparent;\n scrollbar-color: var(--mdw-scrollbar-thumb) var(--mdw-scrollbar-track);\n}\n\n.toolbar {\n position: relative;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n min-height: 36px;\n padding: 2px 3px;\n gap: 2px;\n background: linear-gradient(\n to bottom,\n var(--mdw-toolbar-gradient-from) 0%,\n var(--mdw-toolbar-gradient-via) 45%,\n var(--mdw-toolbar-gradient-to) 100%\n );\n color: var(--mdw-toolbar-fg);\n font-family: var(--mdw-toolbar-font-family);\n border-bottom: 1px solid #999;\n box-shadow:\n inset 0 1px 0 #fff,\n 0 1px 2px rgba(0, 0, 0, 0.15);\n overflow-x: auto;\n overflow-y: visible;\n scrollbar-color: var(--mdw-scrollbar-thumb) var(--mdw-scrollbar-track);\n}\n\n.readOnlyNotice {\n padding: 0 8px;\n font-size: 13px;\n font-style: italic;\n color: var(--mdw-toolbar-fg);\n font-family: var(--mdw-toolbar-font-family);\n}\n\n.toolbar > .button,\n.toolbar > .separator {\n flex-shrink: 0;\n}\n\n.separator {\n width: 1px;\n height: 25px;\n margin: 0 3px;\n background: #aaa;\n box-shadow: 1px 0 0 #fff;\n}\n\n.spacer {\n flex-shrink: 0;\n margin-left: auto;\n}\n\n.button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 29px;\n height: 29px;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 2px;\n background: transparent;\n color: var(--mdw-toolbar-fg);\n font-family: var(--mdw-toolbar-font-family);\n font-size: 15px;\n cursor: pointer;\n}\n\n.button svg {\n width: 17px;\n height: 17px;\n stroke: currentColor;\n fill: none;\n stroke-width: 1.8;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.button:hover:not(:disabled) {\n background: linear-gradient(\n to bottom,\n var(--mdw-button-hover-gradient-from),\n var(--mdw-button-hover-gradient-to)\n );\n border-color: #999;\n box-shadow:\n inset 0 1px 0 #fff,\n 0 1px 1px rgba(0, 0, 0, 0.15);\n}\n\n.button:active:not(:disabled),\n.button[aria-pressed=\"true\"] {\n background: var(--mdw-button-active-bg);\n border-color: #999;\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.25);\n}\n\n.button:focus-visible {\n outline: 2px solid var(--mdw-accent);\n outline-offset: 1px;\n}\n\n.button:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.textButton {\n width: auto;\n padding: 0 10px;\n font-size: 13px;\n}\n\n.boldGlyph {\n font-weight: bold;\n font-size: 17px;\n}\n\n.italicGlyph {\n font-family: Georgia, serif;\n font-style: italic;\n font-weight: bold;\n font-size: 17px;\n}\n\n.strikeGlyph {\n font-size: 16px;\n text-decoration: line-through;\n}\n\n.htmlIcon {\n font-family: ui-monospace, monospace;\n font-weight: bold;\n font-size: 11px;\n}\n\n.headingSelect {\n flex-shrink: 1;\n flex-basis: 118px;\n min-width: 30px;\n width: 118px;\n height: 29px;\n padding: 0 25px 0 9px;\n border: 1px solid #999;\n border-radius: 2px;\n background-color: var(--mdw-toolbar-select-bg);\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23222' stroke-width='1.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 8px center;\n color: var(--mdw-toolbar-fg);\n font-family: var(--mdw-toolbar-font-family);\n font-size: 13px;\n cursor: pointer;\n box-shadow: inset 0 1px 0 #fff;\n appearance: none;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.headingSelect:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.dialog {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 260px;\n max-width: calc(100vw - 24px);\n padding: 10px 12px;\n border: 1px solid var(--mdw-border);\n border-radius: 6px;\n background: var(--mdw-bg);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n box-sizing: border-box;\n}\n\n.dialogField {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: 12px;\n}\n\n.dialogField input,\n.dialogField textarea,\n.dialogField select {\n width: 100%;\n border: 1px solid var(--mdw-border);\n border-radius: 4px;\n padding: 4px 6px;\n font: inherit;\n font-size: 13px;\n}\n\n.dialogField textarea {\n resize: vertical;\n font-family: ui-monospace, Consolas, monospace;\n}\n\n.dialogActions {\n display: flex;\n gap: 6px;\n justify-content: flex-end;\n flex-wrap: nowrap;\n}\n\n.dialogActions button {\n flex: 0 0 auto;\n white-space: nowrap;\n}\n\n.tablePicker {\n align-items: center;\n min-width: 0;\n}\n\n.tablePickerLabel {\n font-size: 12px;\n text-align: center;\n min-height: 1.2em;\n}\n\n.tablePickerGrid {\n display: grid;\n gap: 2px;\n padding: 2px;\n}\n\n.tablePickerGrid:focus-visible {\n outline: 2px solid var(--mdw-accent);\n outline-offset: 2px;\n}\n\n.tablePickerCell {\n width: 16px;\n height: 16px;\n border: 1px solid #999;\n border-radius: 2px;\n background: var(--mdw-bg);\n cursor: pointer;\n}\n\n.tablePickerCell[data-selected=\"true\"] {\n background: #dbe4f8;\n border-color: var(--mdw-accent);\n}\n\n.menu {\n display: flex;\n flex-direction: column;\n min-width: 190px;\n padding: 4px;\n border: 1px solid var(--mdw-border);\n border-radius: 6px;\n background: var(--mdw-bg);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n}\n\n.menuItem {\n text-align: left;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: inherit;\n font: inherit;\n font-size: 13px;\n padding: 6px 8px;\n cursor: pointer;\n}\n\n.menuItem:hover,\n.menuItem:focus-visible {\n background: #e4e7eb;\n outline: none;\n}\n\n.menuSeparator {\n height: 1px;\n margin: 4px 2px;\n background: var(--mdw-border);\n border: none;\n}\n\n.dangerLink {\n align-self: flex-start;\n border: none;\n background: transparent;\n color: #b42318;\n font: inherit;\n font-size: 12px;\n text-decoration: underline;\n cursor: pointer;\n padding: 0;\n}\n\n.dangerLink:hover,\n.dangerLink:focus-visible {\n color: #8c1c11;\n outline: none;\n}\n","import { useEffect, useReducer, useState, type MouseEvent } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport type { ViewMode } from \"../types\";\nimport { ToolbarButton } from \"./buttons/ToolbarButton\";\nimport { InsertDialog, type DialogKind } from \"./buttons/InsertDialogs\";\nimport { TableSizePicker } from \"./buttons/TableSizePicker\";\nimport { CodeLanguagePicker } from \"./buttons/CodeLanguagePicker\";\nimport { FloatingPanel } from \"./buttons/FloatingPanel\";\nimport { ExportMenu } from \"./buttons/ExportMenu\";\nimport { Separator } from \"./buttons/Separator\";\nimport {\n IconCode,\n IconCodeBlock,\n IconBullets,\n IconNumbered,\n IconChecklist,\n IconIndent,\n IconOutdent,\n IconQuote,\n IconTable,\n IconLink,\n IconImage,\n IconHr,\n} from \"./buttons/icons\";\nimport styles from \"../MarkdownEditor.module.css\";\n\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\nconst HEADING_LEVELS: readonly HeadingLevel[] = [1, 2, 3, 4, 5, 6];\n\nexport interface ToolbarProps {\n editor: Editor | null;\n viewMode: ViewMode;\n onToggleView: () => void;\n source: string;\n sanitizeEmbeddedHtml: boolean;\n onlyView?: boolean;\n onlyViewNotice?: string;\n}\n\nexport function Toolbar({\n editor,\n viewMode,\n onToggleView,\n source,\n sanitizeEmbeddedHtml,\n onlyView = false,\n onlyViewNotice = \"Edición desactivada\",\n}: ToolbarProps) {\n const [, forceUpdate] = useReducer((count: number) => count + 1, 0);\n const [openDialog, setOpenDialog] = useState<\n DialogKind | \"table\" | \"codeLanguage\" | null\n >(null);\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n\n const openDialogAt = (\n kind: DialogKind | \"table\" | \"codeLanguage\",\n event: MouseEvent<HTMLElement>,\n ) => {\n setAnchor(event.currentTarget);\n setOpenDialog(kind);\n };\n\n useEffect(() => {\n if (!editor) return;\n editor.on(\"transaction\", forceUpdate);\n return () => {\n editor.off(\"transaction\", forceUpdate);\n };\n }, [editor]);\n\n if (onlyView) {\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Barra de herramientas\"\n className={styles[\"toolbar\"]}\n >\n <span className={styles[\"readOnlyNotice\"]}>{onlyViewNotice}</span>\n <div className={styles[\"spacer\"]}>\n <ExportMenu source={source} sanitize={sanitizeEmbeddedHtml} />\n </div>\n </div>\n );\n }\n\n const canFormat = viewMode === \"wysiwyg\" && editor !== null;\n\n const activeHeading = canFormat\n ? (HEADING_LEVELS.find((level) =>\n editor.isActive(\"heading\", { level }),\n ) ?? null)\n : null;\n\n const listItemType =\n canFormat && editor.isActive(\"taskItem\") ? \"taskItem\" : \"listItem\";\n\n const closeDialog = () => setOpenDialog(null);\n\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Barra de herramientas\"\n className={styles[\"toolbar\"]}\n >\n <ToolbarButton\n label=\"Ver código Markdown\"\n pressed={viewMode === \"markdown\"}\n onClick={onToggleView}\n >\n <IconCode />\n </ToolbarButton>\n\n <select\n className={styles[\"headingSelect\"]}\n aria-label=\"Nivel de encabezado\"\n disabled={!canFormat}\n value={activeHeading === null ? \"p\" : `h${activeHeading}`}\n onChange={(event) => {\n if (!editor) return;\n const value = event.target.value;\n if (value === \"p\") {\n editor.chain().focus().setParagraph().run();\n } else {\n const level = Number(value.slice(1)) as HeadingLevel;\n editor.chain().focus().setHeading({ level }).run();\n }\n }}\n >\n <option value=\"p\">Párrafo</option>\n {HEADING_LEVELS.map((level) => (\n <option key={level} value={`h${level}`}>\n Encabezado {level}\n </option>\n ))}\n </select>\n\n <ToolbarButton\n label=\"Negrita\"\n className={styles[\"boldGlyph\"]}\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"bold\")}\n onClick={() => editor?.chain().focus().toggleBold().run()}\n >\n B\n </ToolbarButton>\n <ToolbarButton\n label=\"Cursiva\"\n className={styles[\"italicGlyph\"]}\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"italic\")}\n onClick={() => editor?.chain().focus().toggleItalic().run()}\n >\n i\n </ToolbarButton>\n <ToolbarButton\n label=\"Tachado\"\n className={styles[\"strikeGlyph\"]}\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"strike\")}\n onClick={() => editor?.chain().focus().toggleStrike().run()}\n >\n S\n </ToolbarButton>\n\n <Separator />\n\n <ToolbarButton\n label=\"Lista con viñetas\"\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"bulletList\")}\n onClick={() => editor?.chain().focus().toggleBulletList().run()}\n >\n <IconBullets />\n </ToolbarButton>\n <ToolbarButton\n label=\"Lista ordenada\"\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"orderedList\")}\n onClick={() => editor?.chain().focus().toggleOrderedList().run()}\n >\n <IconNumbered />\n </ToolbarButton>\n <ToolbarButton\n label=\"Lista de tareas\"\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"taskList\")}\n onClick={() => editor?.chain().focus().toggleTaskList().run()}\n >\n <IconChecklist />\n </ToolbarButton>\n {canFormat && editor.can().sinkListItem(listItemType) && (\n <ToolbarButton\n label=\"Aumentar sangría\"\n onClick={() =>\n editor?.chain().focus().sinkListItem(listItemType).run()\n }\n >\n <IconIndent />\n </ToolbarButton>\n )}\n {canFormat && editor.can().liftListItem(listItemType) && (\n <ToolbarButton\n label=\"Disminuir sangría\"\n onClick={() =>\n editor?.chain().focus().liftListItem(listItemType).run()\n }\n >\n <IconOutdent />\n </ToolbarButton>\n )}\n\n <Separator />\n\n <ToolbarButton\n label=\"Bloque de código\"\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"codeBlock\")}\n onClick={(event) => openDialogAt(\"codeLanguage\", event)}\n >\n <IconCodeBlock />\n </ToolbarButton>\n <ToolbarButton\n label=\"Cita\"\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"blockquote\")}\n onClick={() => editor?.chain().focus().toggleBlockquote().run()}\n >\n <IconQuote />\n </ToolbarButton>\n <ToolbarButton\n label=\"Insertar tabla\"\n disabled={!canFormat}\n onClick={(event) => openDialogAt(\"table\", event)}\n >\n <IconTable />\n </ToolbarButton>\n <ToolbarButton\n label=\"Línea horizontal\"\n disabled={!canFormat}\n onClick={() => editor?.chain().focus().setHorizontalRule().run()}\n >\n <IconHr />\n </ToolbarButton>\n\n <Separator />\n\n <ToolbarButton\n label=\"Insertar enlace\"\n disabled={!canFormat}\n pressed={canFormat && editor.isActive(\"link\")}\n onClick={(event) => openDialogAt(\"link\", event)}\n >\n <IconLink />\n </ToolbarButton>\n <ToolbarButton\n label=\"Insertar imagen\"\n disabled={!canFormat}\n onClick={(event) => openDialogAt(\"image\", event)}\n >\n <IconImage />\n </ToolbarButton>\n <ToolbarButton\n label=\"Insertar HTML\"\n disabled={!canFormat}\n onClick={(event) => openDialogAt(\"html\", event)}\n >\n <span className={styles[\"htmlIcon\"]}>HTML</span>\n </ToolbarButton>\n\n <div className={styles[\"spacer\"]}>\n <ExportMenu source={source} sanitize={sanitizeEmbeddedHtml} />\n </div>\n\n {openDialog === \"table\" && editor !== null && (\n <FloatingPanel anchor={anchor}>\n <TableSizePicker\n onSelect={({ cols, rows }) => {\n editor\n .chain()\n .focus()\n .insertTable({ rows, cols, withHeaderRow: true })\n .run();\n closeDialog();\n }}\n onClose={closeDialog}\n />\n </FloatingPanel>\n )}\n {openDialog === \"codeLanguage\" && editor !== null && (\n <FloatingPanel anchor={anchor}>\n <CodeLanguagePicker\n currentLanguage={\n (editor.getAttributes(\"codeBlock\")[\"language\"] as\n | string\n | undefined) ?? null\n }\n onSelect={(language) => {\n if (editor.isActive(\"codeBlock\")) {\n editor\n .chain()\n .focus()\n .updateAttributes(\"codeBlock\", { language })\n .run();\n } else {\n editor.chain().focus().toggleCodeBlock({ language }).run();\n }\n closeDialog();\n }}\n onClose={closeDialog}\n />\n </FloatingPanel>\n )}\n {openDialog !== null &&\n openDialog !== \"table\" &&\n openDialog !== \"codeLanguage\" &&\n editor !== null && (\n <FloatingPanel anchor={anchor}>\n <InsertDialog\n kind={openDialog}\n editor={editor}\n onClose={closeDialog}\n />\n </FloatingPanel>\n )}\n </div>\n );\n}\n","import type { ButtonHTMLAttributes } from \"react\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport interface ToolbarButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n label: string;\n pressed?: boolean;\n}\n\nexport function ToolbarButton({\n label,\n pressed,\n className,\n children,\n ...rest\n}: ToolbarButtonProps) {\n const buttonClass =\n className === undefined\n ? styles[\"button\"]\n : `${styles[\"button\"]} ${className}`;\n return (\n <button\n type=\"button\"\n className={buttonClass}\n aria-label={label}\n title={label}\n {...(pressed !== undefined ? { \"aria-pressed\": pressed } : {})}\n {...rest}\n >\n {children}\n </button>\n );\n}\n","import {\n useEffect,\n useId,\n useRef,\n useState,\n type FormEvent,\n type ReactNode,\n} from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport { ensureProtocol } from \"../../markdown/links\";\nimport { isMermaidSyntax } from \"../../markdown/mermaid\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport type DialogKind = \"image\" | \"link\" | \"html\";\n\ninterface DialogShellProps {\n title: string;\n onSubmit: () => void;\n onClose: () => void;\n children: ReactNode;\n}\n\nfunction DialogShell({ title, onSubmit, onClose, children }: DialogShellProps) {\n const ref = useRef<HTMLFormElement>(null);\n\n useEffect(() => {\n const first = ref.current?.querySelector<HTMLElement>(\"input, textarea\");\n first?.focus();\n }, []);\n\n const handleSubmit = (event: FormEvent) => {\n event.preventDefault();\n onSubmit();\n };\n\n return (\n <form\n ref={ref}\n className={styles[\"dialog\"]}\n role=\"dialog\"\n aria-label={title}\n onSubmit={handleSubmit}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n }}\n >\n {children}\n <div className={styles[\"dialogActions\"]}>\n <button\n type=\"button\"\n className={`${styles[\"button\"]} ${styles[\"textButton\"]}`}\n onClick={onClose}\n >\n Cancelar\n </button>\n <button\n type=\"submit\"\n className={`${styles[\"button\"]} ${styles[\"textButton\"]}`}\n >\n Insertar\n </button>\n </div>\n </form>\n );\n}\n\ninterface FieldProps {\n label: string;\n children: (id: string) => ReactNode;\n}\n\nfunction Field({ label, children }: FieldProps) {\n const id = useId();\n return (\n <div className={styles[\"dialogField\"]}>\n <label htmlFor={id}>{label}</label>\n {children(id)}\n </div>\n );\n}\n\nexport interface InsertDialogProps {\n kind: DialogKind;\n editor: Editor;\n onClose: () => void;\n}\n\nexport function InsertDialog({ kind, editor, onClose }: InsertDialogProps) {\n const [url, setUrl] = useState(\"\");\n const [text, setText] = useState(\"\");\n const [html, setHtml] = useState(\"\");\n // Leído una sola vez al montar: si hay selección activa, el enlace se\n // aplica sobre ese texto y no se pide un campo de texto adicional (FR-001,\n // FR-003). No reactivo a propósito — el diálogo no debe cambiar de forma\n // mientras está abierto si la selección cambiara por otra causa.\n const [hasSelectionForLink] = useState(\n () => kind === \"link\" && !editor.state.selection.empty,\n );\n\n const submit = () => {\n const chain = editor.chain().focus();\n if (kind === \"image\" && url) {\n chain.setImage({ src: url, alt: text }).run();\n } else if (kind === \"link\" && url) {\n const href = ensureProtocol(url);\n if (hasSelectionForLink) {\n chain.extendMarkRange(\"link\").setLink({ href }).run();\n } else if (text) {\n chain\n .insertContent({\n type: \"text\",\n text,\n marks: [{ type: \"link\", attrs: { href } }],\n })\n .run();\n }\n } else if (kind === \"html\" && html) {\n // La detección de Mermaid es asíncrona (carga perezosa de la librería):\n // se resuelve antes de decidir entre bloque de código Mermaid y HTML\n // embebido (FR-009).\n void isMermaidSyntax(html).then((isMermaid) => {\n if (isMermaid) {\n editor\n .chain()\n .focus()\n .insertContent({\n type: \"codeBlock\",\n attrs: { language: \"mermaid\" },\n content: [{ type: \"text\", text: html }],\n })\n .run();\n } else {\n editor\n .chain()\n .focus()\n .insertContent({ type: \"htmlBlock\", attrs: { content: html } })\n .run();\n }\n });\n onClose();\n return;\n }\n onClose();\n };\n\n if (kind === \"html\") {\n return (\n <DialogShell\n title=\"Insertar HTML embebido\"\n onSubmit={submit}\n onClose={onClose}\n >\n <Field label=\"Código HTML\">\n {(id) => (\n <textarea\n id={id}\n rows={4}\n value={html}\n onChange={(e) => setHtml(e.target.value)}\n />\n )}\n </Field>\n </DialogShell>\n );\n }\n\n const isImage = kind === \"image\";\n return (\n <DialogShell\n title={isImage ? \"Insertar imagen\" : \"Insertar enlace\"}\n onSubmit={submit}\n onClose={onClose}\n >\n <Field label={isImage ? \"URL de la imagen\" : \"URL del enlace\"}>\n {(id) => (\n <input\n id={id}\n type={isImage ? \"url\" : \"text\"}\n required\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n />\n )}\n </Field>\n {!(kind === \"link\" && hasSelectionForLink) && (\n <Field label={isImage ? \"Texto alternativo\" : \"Texto del enlace\"}>\n {(id) => (\n <input\n id={id}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n />\n )}\n </Field>\n )}\n </DialogShell>\n );\n}\n","/**\n * Anteponer \"http://\" cuando la URL no especifica protocolo. Uniforme: no\n * depende de que el valor empiece con \"www\" ni de ningún patrón textual\n * particular, solo de la ausencia de \"://\" (FR-004, FR-005, FR-006).\n */\nexport function ensureProtocol(url: string): string {\n return url.includes(\"://\") ? url : `http://${url}`;\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\n/** Convención: columnas × filas. \"3 × 4\" significa 3 columnas y 4 filas. */\nexport interface TableSize {\n cols: number;\n rows: number;\n}\n\nexport interface TableSizePickerProps {\n /** Columnas máximas de la cuadrícula. Default: 10. */\n maxCols?: number;\n /** Filas máximas de la cuadrícula. Default: 10. */\n maxRows?: number;\n /** Invocado al confirmar (clic o Enter) con la dimensión elegida. */\n onSelect: (size: TableSize) => void;\n /** Invocado al cancelar (Escape). */\n onClose: () => void;\n}\n\nexport function TableSizePicker({\n maxCols = 10,\n maxRows = 10,\n onSelect,\n onClose,\n}: TableSizePickerProps) {\n // null = ninguna celda seleccionada inicialmente\n const [size, setSize] = useState<TableSize | null>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n gridRef.current?.focus();\n }, []);\n\n const clamp = (value: number, max: number) =>\n Math.min(Math.max(value, 1), max);\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (size !== null) onSelect(size);\n return;\n }\n const deltas: Record<string, [number, number]> = {\n ArrowRight: [1, 0],\n ArrowLeft: [-1, 0],\n ArrowDown: [0, 1],\n ArrowUp: [0, -1],\n };\n const delta = deltas[event.key];\n if (delta === undefined) return;\n event.preventDefault();\n const current = size ?? { cols: 0, rows: 0 };\n setSize({\n cols: clamp(current.cols + delta[0], maxCols),\n rows: clamp(current.rows + delta[1], maxRows),\n });\n };\n\n const label =\n size === null ? \"Selecciona el tamaño\" : `${size.cols} × ${size.rows}`;\n\n return (\n <div\n className={`${styles[\"dialog\"]} ${styles[\"tablePicker\"]}`}\n role=\"dialog\"\n aria-label=\"Insertar tabla\"\n >\n <div className={styles[\"tablePickerLabel\"]} aria-live=\"polite\">\n {label}\n </div>\n <div\n ref={gridRef}\n className={styles[\"tablePickerGrid\"]}\n style={{ gridTemplateColumns: `repeat(${maxCols}, 16px)` }}\n tabIndex={0}\n role=\"group\"\n aria-label=\"Tamaño de la tabla (columnas × filas)\"\n onKeyDown={handleKeyDown}\n >\n {Array.from({ length: maxRows }, (_, rowIndex) =>\n Array.from({ length: maxCols }, (_, colIndex) => {\n const cell: TableSize = {\n cols: colIndex + 1,\n rows: rowIndex + 1,\n };\n const selected =\n size !== null &&\n cell.cols <= size.cols &&\n cell.rows <= size.rows;\n return (\n <div\n key={`${cell.cols}x${cell.rows}`}\n className={styles[\"tablePickerCell\"]}\n data-cell={`${cell.cols}x${cell.rows}`}\n data-selected={selected ? \"true\" : \"false\"}\n aria-hidden=\"true\"\n onMouseEnter={() => setSize(cell)}\n onClick={() => onSelect(cell)}\n />\n );\n }),\n )}\n </div>\n </div>\n );\n}\n","import { useEffect, useId, useRef, useState } from \"react\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport const CODE_LANGUAGES = [\n { value: \"json\", label: \"JSON\" },\n { value: \"sql\", label: \"SQL\" },\n { value: \"typescript\", label: \"TypeScript\" },\n { value: \"javascript\", label: \"JavaScript\" },\n { value: \"java\", label: \"Java\" },\n] as const;\n\nexport type CodeLanguageValue =\n | (typeof CODE_LANGUAGES)[number][\"value\"]\n | \"other\";\n\nexport interface CodeLanguagePickerProps {\n /** Lenguaje actualmente aplicado al bloque de código (o null si no hay uno activo). */\n currentLanguage: string | null;\n onSelect: (language: string) => void;\n onClose: () => void;\n}\n\nexport function CodeLanguagePicker({\n currentLanguage,\n onSelect,\n onClose,\n}: CodeLanguagePickerProps) {\n const isKnown = CODE_LANGUAGES.some(\n (lang) => lang.value === currentLanguage,\n );\n const [choice, setChoice] = useState<CodeLanguageValue>(\n isKnown ? (currentLanguage as CodeLanguageValue) : \"other\",\n );\n const [otherValue, setOtherValue] = useState(\n !isKnown && currentLanguage ? currentLanguage : \"\",\n );\n const formRef = useRef<HTMLFormElement>(null);\n const otherFieldId = useId();\n\n useEffect(() => {\n formRef.current?.querySelector<HTMLElement>(\"select\")?.focus();\n }, []);\n\n const submit = () => {\n const language = choice === \"other\" ? otherValue.trim() : choice;\n if (language) onSelect(language);\n };\n\n return (\n <form\n ref={formRef}\n className={styles[\"dialog\"]}\n role=\"dialog\"\n aria-label=\"Lenguaje del bloque de código\"\n onSubmit={(event) => {\n event.preventDefault();\n submit();\n }}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n }}\n >\n <div className={styles[\"dialogField\"]}>\n <label htmlFor=\"mdw-code-language\">Lenguaje</label>\n <select\n id=\"mdw-code-language\"\n value={choice}\n onChange={(event) =>\n setChoice(event.target.value as CodeLanguageValue)\n }\n >\n {CODE_LANGUAGES.map((lang) => (\n <option key={lang.value} value={lang.value}>\n {lang.label}\n </option>\n ))}\n <option value=\"other\">Otro…</option>\n </select>\n </div>\n {choice === \"other\" && (\n <div className={styles[\"dialogField\"]}>\n <label htmlFor={otherFieldId}>Especificar lenguaje</label>\n <input\n id={otherFieldId}\n type=\"text\"\n value={otherValue}\n onChange={(event) => setOtherValue(event.target.value)}\n />\n </div>\n )}\n <div className={styles[\"dialogActions\"]}>\n <button\n type=\"button\"\n className={`${styles[\"button\"]} ${styles[\"textButton\"]}`}\n onClick={onClose}\n >\n Cancelar\n </button>\n <button\n type=\"submit\"\n className={`${styles[\"button\"]} ${styles[\"textButton\"]}`}\n >\n Aplicar\n </button>\n </div>\n </form>\n );\n}\n","import { useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport interface FloatingPanelProps {\n /** Elemento ancla (normalmente el botón que abrió el panel). */\n anchor: HTMLElement | null;\n /** Alineación horizontal del panel respecto al ancla. */\n align?: \"start\" | \"end\";\n /** Enfoca el primer elemento interactivo del contenido al montarse. */\n autoFocus?: boolean;\n children: ReactNode;\n}\n\n/**\n * Renderiza su contenido en un portal a `document.body`, posicionado con\n * `position: fixed` a partir del rect del ancla. Evita que el panel quede\n * recortado por el `overflow` de la toolbar (necesario para el scroll\n * horizontal de la barra) o del contenedor raíz del componente.\n */\nexport function FloatingPanel({\n anchor,\n align = \"start\",\n autoFocus = false,\n children,\n}: FloatingPanelProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<{\n top: number;\n left?: number;\n right?: number;\n } | null>(null);\n\n useLayoutEffect(() => {\n if (!anchor) return;\n const rect = anchor.getBoundingClientRect();\n if (align === \"end\") {\n setStyle({\n top: rect.bottom,\n right: Math.max(0, window.innerWidth - rect.right),\n });\n } else {\n setStyle({ top: rect.bottom, left: rect.left });\n }\n }, [anchor, align]);\n\n useLayoutEffect(() => {\n if (style === null || !autoFocus) return;\n panelRef.current\n ?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )\n ?.focus();\n // Solo al aparecer: no queremos robar el foco en cada reposicionamiento.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [style !== null]);\n\n if (style === null) return null;\n\n return createPortal(\n <div\n ref={panelRef}\n className={styles[\"root\"]}\n style={{\n position: \"fixed\",\n top: style.top,\n left: style.left,\n right: style.right,\n zIndex: 1000,\n // El wrapper solo restablece las custom properties/tipografía del\n // componente para el contenido portado; no debe verse como una caja.\n border: \"none\",\n overflow: \"visible\",\n background: \"transparent\",\n width: \"auto\",\n height: \"auto\",\n }}\n >\n {children}\n </div>,\n document.body,\n );\n}\n","import { useRef, useState } from \"react\";\nimport { markdownToHtml } from \"../../markdown/pipeline\";\nimport { IconDownload } from \"./icons\";\nimport { FloatingPanel } from \"./FloatingPanel\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport interface ExportMenuProps {\n source: string;\n sanitize: boolean;\n}\n\nexport function ExportMenu({ source, sanitize }: ExportMenuProps) {\n const [open, setOpen] = useState(false);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n const close = () => {\n setOpen(false);\n buttonRef.current?.focus();\n };\n\n const copy = (content: string) => {\n void navigator.clipboard.writeText(content);\n close();\n };\n\n return (\n <>\n <button\n ref={buttonRef}\n type=\"button\"\n className={styles[\"button\"]}\n aria-label=\"Export\"\n title=\"Export\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n >\n <IconDownload />\n </button>\n {open && (\n <FloatingPanel anchor={buttonRef.current} align=\"end\" autoFocus>\n <div\n role=\"menu\"\n aria-label=\"Exportar contenido\"\n className={styles[\"menu\"]}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n close();\n }\n }}\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles[\"menuItem\"]}\n onClick={() => copy(source)}\n >\n Copiar como Markdown\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles[\"menuItem\"]}\n onClick={() => copy(markdownToHtml(source, { sanitize }))}\n >\n Copiar como HTML\n </button>\n </div>\n </FloatingPanel>\n )}\n </>\n );\n}\n","import type { SVGProps } from \"react\";\n\ntype IconProps = SVGProps<SVGSVGElement>;\n\nconst base = { viewBox: \"0 0 24 24\", \"aria-hidden\": true } as const;\n\nexport function IconCode(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M9 7L4 12L9 17\" />\n <path d=\"M15 7L20 12L15 17\" />\n <path d=\"M14 4L10 20\" />\n </svg>\n );\n}\n\nexport function IconCodeBlock(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M8 6L3 12L8 18\" />\n <path d=\"M16 6L21 12L16 18\" />\n </svg>\n );\n}\n\nexport function IconBullets(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <circle cx=\"4\" cy=\"6\" r=\"1\" />\n <circle cx=\"4\" cy=\"12\" r=\"1\" />\n <circle cx=\"4\" cy=\"18\" r=\"1\" />\n <path d=\"M9 6H21\" />\n <path d=\"M9 12H21\" />\n <path d=\"M9 18H21\" />\n </svg>\n );\n}\n\nexport function IconNumbered(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M4 5H5V9\" />\n <path d=\"M3 9H6\" />\n <path d=\"M3 13H6\" />\n <path d=\"M3 17C3 15 6 15 6 17C6 19 3 19 3 19H6\" />\n <path d=\"M10 6H21\" />\n <path d=\"M10 12H21\" />\n <path d=\"M10 18H21\" />\n </svg>\n );\n}\n\nexport function IconChecklist(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <rect x=\"3\" y=\"3\" width=\"6\" height=\"6\" />\n <path d=\"M4 6L6 8L9 4\" />\n <path d=\"M12 6H21\" />\n <rect x=\"3\" y=\"14\" width=\"6\" height=\"6\" />\n <path d=\"M12 17H21\" />\n </svg>\n );\n}\n\nexport function IconIndent(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M3 6H21\" />\n <path d=\"M11 12H21\" />\n <path d=\"M3 18H21\" />\n <path d=\"M3 9.5L6 12L3 14.5\" />\n </svg>\n );\n}\n\nexport function IconOutdent(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M3 6H21\" />\n <path d=\"M11 12H21\" />\n <path d=\"M3 18H21\" />\n <path d=\"M6 9.5L3 12L6 14.5\" />\n </svg>\n );\n}\n\nexport function IconQuote(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M7 8H4V12H8V8C8 5 6 4 4 4\" />\n <path d=\"M17 8H14V12H18V8C18 5 16 4 14 4\" />\n </svg>\n );\n}\n\nexport function IconTable(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" />\n <path d=\"M3 10H21\" />\n <path d=\"M3 15H21\" />\n <path d=\"M9 4V20\" />\n <path d=\"M15 4V20\" />\n </svg>\n );\n}\n\nexport function IconLink(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M10 13C11.5 14.5 14 14.5 15.5 13L18 10.5C20 8.5 20 5.5 18 3.5C16 1.5 13 1.5 11 3.5L9.5 5\" />\n <path d=\"M14 11C12.5 9.5 10 9.5 8.5 11L6 13.5C4 15.5 4 18.5 6 20.5C8 22.5 11 22.5 13 20.5L14.5 19\" />\n </svg>\n );\n}\n\nexport function IconImage(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" />\n <circle cx=\"8\" cy=\"9\" r=\"2\" />\n <path d=\"M3 17L8 12L12 16L15 13L21 19\" />\n </svg>\n );\n}\n\nexport function IconHr(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M3 12H21\" />\n <path d=\"M6 6H18\" opacity=\"0.35\" />\n <path d=\"M6 18H18\" opacity=\"0.35\" />\n </svg>\n );\n}\n\nexport function IconDownload(props: IconProps) {\n return (\n <svg {...base} {...props}>\n <path d=\"M12 3V15\" />\n <path d=\"M7 10L12 15L17 10\" />\n <path d=\"M4 19H20\" />\n </svg>\n );\n}\n","import styles from \"../../MarkdownEditor.module.css\";\n\nexport function Separator() {\n return <span className={styles[\"separator\"]} aria-hidden=\"true\" />;\n}\n","import { useEffect, useId, useRef, useState } from \"react\";\nimport { ensureProtocol } from \"../../markdown/links\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport interface LinkPopoverProps {\n url: string;\n onlyView: boolean;\n onNavigate: () => void;\n onCopy: () => void;\n onSave: (newUrl: string) => void;\n onRemove: () => void;\n onClose: () => void;\n}\n\nexport function LinkPopover({\n url,\n onlyView,\n onNavigate,\n onCopy,\n onSave,\n onRemove,\n onClose,\n}: LinkPopoverProps) {\n const [mode, setMode] = useState<\"menu\" | \"edit\">(\"menu\");\n const [inputValue, setInputValue] = useState(url);\n const rootRef = useRef<HTMLDivElement>(null);\n const inputId = useId();\n\n useEffect(() => {\n if (mode === \"edit\") {\n rootRef.current?.querySelector<HTMLInputElement>(\"input\")?.focus();\n }\n }, [mode]);\n\n useEffect(() => {\n const handlePointerDown = (event: PointerEvent) => {\n if (\n rootRef.current !== null &&\n !rootRef.current.contains(event.target as Node)\n ) {\n onClose();\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [onClose]);\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n };\n\n const save = () => {\n if (!inputValue) return;\n onSave(ensureProtocol(inputValue));\n };\n\n if (mode === \"edit\") {\n return (\n <div\n ref={rootRef}\n className={styles[\"dialog\"]}\n role=\"dialog\"\n aria-label=\"Editar enlace\"\n onKeyDown={handleKeyDown}\n >\n <div className={styles[\"dialogField\"]}>\n <label htmlFor={inputId}>URL del enlace</label>\n <input\n id={inputId}\n type=\"text\"\n value={inputValue}\n onChange={(event) => setInputValue(event.target.value)}\n />\n </div>\n <button\n type=\"button\"\n className={styles[\"dangerLink\"]}\n onClick={onRemove}\n >\n Eliminar link\n </button>\n <div className={styles[\"dialogActions\"]}>\n <button\n type=\"button\"\n className={`${styles[\"button\"]} ${styles[\"textButton\"]}`}\n onClick={save}\n >\n Guardar\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={rootRef}\n role=\"menu\"\n aria-label=\"Acciones del enlace\"\n className={styles[\"menu\"]}\n onKeyDown={handleKeyDown}\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles[\"menuItem\"]}\n onClick={onNavigate}\n >\n Ir a la url\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles[\"menuItem\"]}\n onClick={onCopy}\n >\n Copiar url\n </button>\n {!onlyView && (\n <>\n <hr className={styles[\"menuSeparator\"]} />\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles[\"menuItem\"]}\n onClick={() => setMode(\"edit\")}\n >\n Editar url\n </button>\n </>\n )}\n </div>\n );\n}\n","import { Fragment, useEffect, useRef } from \"react\";\nimport styles from \"../../MarkdownEditor.module.css\";\n\nexport interface TableMenuAction {\n label: string;\n onSelect: () => void;\n /** Inserta un separador visual antes de esta acción. */\n separatorBefore?: boolean;\n}\n\nexport interface TableContextMenuProps {\n ariaLabel: string;\n actions: TableMenuAction[];\n onClose: () => void;\n}\n\n/**\n * Menú flotante genérico de acciones sobre una tabla (columna o fila). Sigue\n * el mismo patrón de `LinkPopover` en modo \"menu\": cierre con Escape o clic\n * fuera, sin aplicar ninguna acción (Principio IV, VI).\n */\nexport function TableContextMenu({\n ariaLabel,\n actions,\n onClose,\n}: TableContextMenuProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handlePointerDown = (event: PointerEvent) => {\n if (\n rootRef.current !== null &&\n !rootRef.current.contains(event.target as Node)\n ) {\n onClose();\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n };\n }, [onClose]);\n\n return (\n <div\n ref={rootRef}\n role=\"menu\"\n aria-label={ariaLabel}\n className={styles[\"menu\"]}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n }}\n >\n {actions.map((action) => (\n <Fragment key={action.label}>\n {action.separatorBefore === true && (\n <hr className={styles[\"menuSeparator\"]} />\n )}\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles[\"menuItem\"]}\n onClick={action.onSelect}\n >\n {action.label}\n </button>\n </Fragment>\n ))}\n </div>\n );\n}\n"],"mappings":"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AAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAKA,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAA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","names":["import_react","import_core","import_state","LITERALS","LITERALS","TYPES","KEYWORDS","decimalDigits","frac","TYPES","IDENT_RE","KEYWORDS","LITERALS","TYPES","ERROR_TYPES","BUILT_IN_GLOBALS","BUILT_IN_VARIABLES","BUILT_INS","javascript","decimalDigits","frac","BUILT_INS","LITERALS","TYPES","KEYWORDS","javascript","remarkParse","remarkGfm","remarkRehype","rehypeStringify","rehypeParse","rehypeRemark","remarkStringify","rehypeRaw","rehypeHighlight","rehypeSanitize","module","javascript","CodeBlockLowlight","Image","StarterKit","TableRow","TableHeader","TableCell","TaskList","TaskItem","Link","import_react","import_jsx_runtime","MarkdownSourceView","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","_","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","MarkdownEditor"]}