@noirmd/previewer 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/NReditor.cjs +80 -3
- package/dist/NReditor.cjs.map +1 -1
- package/dist/NReditor.js +80 -3
- package/dist/NReditor.js.map +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +81 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +81 -3
- package/dist/index.js.map +1 -1
- package/dist/modal.css +3 -0
- package/dist/react.cjs +81 -3
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +81 -3
- package/dist/react.js.map +1 -1
- package/dist/vanilla.cjs +81 -3
- package/dist/vanilla.cjs.map +1 -1
- package/dist/vanilla.d.cts +17 -1
- package/dist/vanilla.d.ts +17 -1
- package/dist/vanilla.js +78 -3
- package/dist/vanilla.js.map +1 -1
- package/dist/variables.css +48 -11
- package/dist/vue.cjs +80 -3
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.js +80 -3
- package/dist/vue.js.map +1 -1
- package/package.json +1 -1
package/dist/NReditor.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../react/NReditor.tsx","../react/custom-syntax.ts","../react/useDebounce.ts","../react/useTailwindCDN.ts","../react/CustomMarkdownRenderer.tsx","../core/utils.ts","../core/parser.ts","../vanilla/highlightSetup.ts","../vanilla/components.ts","../vanilla/inline.ts","../vanilla/directives/admonition.ts","../vanilla/directives/details.ts","../vanilla/directives/modal.ts","../vanilla/directives/button.ts","../vanilla/directives/card.ts","../vanilla/directives/wrapper.ts","../vanilla/directives/slide.ts","../vanilla/directives/index.ts","../vanilla/renderer.ts"],"sourcesContent":["import React, { useRef, useState } from 'react';\nimport CodeMirror, { ReactCodeMirrorProps } from '@uiw/react-codemirror';\nimport { EditorView, Decoration, ViewPlugin, ViewUpdate, lineNumbers, keymap } from '@codemirror/view';\nimport { customStreamParserV2 } from './custom-syntax';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport { syntaxHighlighting, HighlightStyle, foldService, foldGutter, foldAll, unfoldAll } from '@codemirror/language';\nimport { tags as t } from '@lezer/highlight';\nimport { useDebounce } from './useDebounce';\nimport { useLazyTailwindCDN } from './useTailwindCDN';\nimport CustomMarkdownRenderer from './CustomMarkdownRenderer';\n\nexport type EditorMode = 'editor' | 'split' | 'preview';\n\ninterface NReditorProps extends ReactCodeMirrorProps {\n value: string;\n onChange: (value: string) => void;\n className?: string;\n /** Debounce delay in ms for preview rendering. Default: 300 */\n debounceMs?: number;\n /** Inject Tailwind v4 browser CDN for preview. Default: false */\n tailwindCDN?: boolean;\n /** Called when user clicks Guía */\n onGuide?: () => void;\n /** Called when user clicks Configurar */\n onConfig?: () => void;\n}\n\nconst customSyntaxHighlighting = HighlightStyle.define([\n { tag: t.heading, fontWeight: 'bold', color: 'var(--tc-heading, #e2e8f0)' },\n { tag: t.quote, color: 'var(--tc-quote, #94a3b8)', fontStyle: 'italic' },\n { tag: t.meta, color: 'var(--tc-meta, #64748b)' },\n { tag: t.variableName, color: 'var(--tc-variable, #38bdf8)' },\n { tag: t.strong, fontWeight: 'bold' },\n { tag: t.emphasis, fontStyle: 'italic' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: t.link, color: 'var(--tc-link, #38bdf8)' },\n { tag: t.url, color: 'var(--tc-link, #38bdf8)' },\n { tag: t.comment, color: 'var(--tc-comment, #64748b)' },\n { tag: t.keyword, color: 'var(--tc-heading, #e2e8f0)', fontWeight: 'bold' },\n { tag: t.typeName, color: 'var(--tc-type, #a78bfa)' },\n { tag: t.string, color: 'var(--tc-string, #4ade80)' },\n { tag: t.attributeName, color: 'var(--tc-attribute, #fb923c)' },\n { tag: t.propertyName, color: '#0ea5e9' },\n { tag: t.className, color: '#f59e0b', fontStyle: 'italic' },\n { tag: t.special(t.emphasis), textDecoration: 'underline' },\n { tag: t.special(t.comment), backgroundColor: 'var(--tc-highlight-bg, rgba(255,255,255,0.05))', padding: '0 2px', borderRadius: '2px' },\n]);\n\nconst customEditorTheme = EditorView.theme({\n '&': {\n color: 'var(--color-text-primary, #e2e8f0)',\n backgroundColor: 'transparent !important',\n height: '100%',\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n minHeight: '0',\n },\n '&.cm-focused': { outline: 'none' },\n '.cm-scroller': {\n overflow: 'auto !important',\n flex: '1',\n minHeight: '0',\n WebkitOverflowScrolling: 'touch',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent !important',\n borderRight: '1px solid var(--color-border, #334155)',\n color: 'var(--color-text-secondary, #94a3b8)',\n opacity: 0.6,\n border: 'none',\n },\n '.cm-activeLineGutter': { backgroundColor: 'transparent' },\n '.cm-lineNumbers': { color: 'inherit' },\n '.cm-foldGutter': { padding: '0px', cursor: 'pointer' },\n '.cm-foldPlaceholder': {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid var(--color-border, #334155)',\n color: 'var(--tc-heading, #e2e8f0)',\n padding: '0 6px',\n borderRadius: '4px',\n margin: '0 4px',\n fontSize: '0.9em',\n fontWeight: 'bold',\n },\n '.dark .cm-foldPlaceholder': {\n backgroundColor: 'rgba(255, 255, 255, 0.1)',\n },\n '.cm-activeLine': { backgroundColor: 'transparent' },\n '.cm-cursor': { borderLeftColor: 'var(--color-text-primary, #e2e8f0)' },\n '&.cm-focused .cm-selectionBackground, .cm-selectionBackground': {\n backgroundColor: 'var(--tc-selection-bg, rgba(56, 189, 248, 0.2)) !important',\n },\n '.cm-blockquote-line': {\n color: 'var(--tc-blockquote-color, #94a3b8)',\n fontStyle: 'italic',\n borderLeft: '2px solid var(--tc-blockquote-border, #334155)',\n paddingLeft: '10px',\n },\n '.cm-spoiler': {\n backgroundColor: 'var(--color-text-secondary, #94a3b8)',\n color: 'var(--color-text-secondary, #94a3b8)',\n borderRadius: '3px',\n padding: '0 2px',\n cursor: 'pointer',\n transition: 'background-color 0.2s, color 0.2s',\n },\n '.cm-spoiler:hover': {\n backgroundColor: 'transparent',\n color: 'var(--color-text-primary, #e2e8f0)',\n },\n '.cm-admonition-bg': {\n borderLeft: 'none !important',\n marginLeft: '0px',\n },\n '.cm-admonition-button': { borderLeftColor: 'var(--tc-attribute, #fb923c)' },\n '.cm-admonition-modal': { borderLeftColor: 'var(--tc-variable, #38bdf8)' },\n '.cm-admonition-warning': { borderLeftColor: '#f59e0b' },\n '.cm-admonition-danger': { borderLeftColor: '#ef4444' },\n '.cm-raw-block': {\n fontFamily: 'monospace',\n backgroundColor: 'rgba(0, 0, 0, 0.1)',\n },\n '.dark .cm-raw-block': {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n },\n '.cm-admonition-depth-1': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%)',\n backgroundColor: 'hsla(20, 70%, 50%, 0.05)',\n paddingLeft: '12px !important',\n },\n '.cm-admonition-depth-2': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%)',\n backgroundColor: 'hsla(140, 70%, 50%, 0.05)',\n paddingLeft: '16px !important',\n },\n '.cm-admonition-depth-3': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%), inset 12px 0 0 hsl(200, 70%, 50%)',\n backgroundColor: 'hsla(200, 70%, 50%, 0.05)',\n paddingLeft: '20px !important',\n },\n '.cm-admonition-depth-4': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%), inset 12px 0 0 hsl(200, 70%, 50%), inset 16px 0 0 hsl(280, 70%, 50%)',\n backgroundColor: 'hsla(280, 70%, 50%, 0.05)',\n paddingLeft: '24px !important',\n },\n '.cm-admonition-depth-5': {\n boxShadow: 'inset 4px 0 0 hsl(340, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%), inset 12px 0 0 hsl(200, 70%, 50%), inset 16px 0 0 hsl(280, 70%, 50%), inset 20px 0 0 hsl(340, 70%, 50%)',\n backgroundColor: 'hsla(340, 70%, 50%, 0.05)',\n paddingLeft: '28px !important',\n },\n '.cm-panels': {\n position: 'static !important',\n backgroundColor: 'transparent !important',\n border: 'none !important',\n },\n '.cm-panel.cm-search': {\n position: 'fixed !important',\n top: '20px !important',\n right: '20px !important',\n zIndex: 100,\n backgroundColor: 'var(--color-background-primary, #0f172a)',\n border: '1px solid var(--color-border, #334155)',\n borderRadius: '12px',\n padding: '12px',\n boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3)',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n backdropFilter: 'blur(8px)',\n minWidth: '280px',\n },\n '.cm-search [name=close]': {\n position: 'absolute',\n right: '8px',\n top: '8px',\n cursor: 'pointer',\n opacity: 0.6,\n border: 'none',\n background: 'transparent',\n color: 'var(--color-text-primary, #e2e8f0)',\n fontSize: '18px',\n },\n '.cm-search [name=close]:hover': { opacity: 1 },\n '.cm-textfield': {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid var(--color-border, #334155)',\n borderRadius: '6px',\n color: 'var(--color-text-primary, #e2e8f0)',\n padding: '4px 8px',\n outline: 'none',\n width: '100%',\n marginBottom: '4px',\n },\n '.cm-textfield:focus': {\n borderColor: 'var(--color-accent-primary, #38bdf8)',\n backgroundColor: 'rgba(255, 255, 255, 0.08)',\n },\n '.cm-panel.cm-search input[type=checkbox]:checked': {\n backgroundColor: 'var(--color-accent-primary, #38bdf8)',\n },\n '.cm-panel.cm-search input[type=checkbox]': {\n backgroundColor: 'rgba(255, 255, 255, 0.08)',\n },\n '.cm-button': {\n backgroundImage: 'linear-gradient(135deg, var(--color-accent-primary, #38bdf8), var(--color-accent-hover, #7dd3fc))',\n color: 'var(--color-accent-text, #0f172a)',\n border: 'none',\n borderRadius: '6px',\n padding: '4px 10px',\n cursor: 'pointer',\n fontSize: '0.85em',\n fontWeight: '600',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n transition: 'transform 0.1s, opacity 0.2s',\n marginRight: '4px',\n boxShadow: '0 4px 12px -2px rgba(0, 0, 0, 0.2)',\n },\n '.cm-button:hover': {\n opacity: 0.95,\n transform: 'translateY(-1px)',\n boxShadow: '0 6px 14px -2px rgba(0, 0, 0, 0.25)',\n },\n '.cm-button:active': { transform: 'translateY(0)' },\n '.cm-search label': {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '0.8em',\n color: 'var(--color-text-secondary, #94a3b8)',\n marginRight: '8px',\n cursor: 'pointer',\n },\n '.cm-search input[type=checkbox]': {\n cursor: 'pointer',\n accentColor: 'var(--color-accent-primary, #38bdf8)',\n },\n});\n\n// Fold service for ::: directive blocks and HTML tags\nconst customFoldService = foldService.of((state, lineStart) => {\n const line = state.doc.lineAt(lineStart);\n const trimmed = line.text.trim();\n \n const dirMatch = trimmed.match(/^:::(.+)/);\n if (dirMatch) {\n let stack = 1;\n for (let i = line.number + 1; i <= state.doc.lines; i++) {\n const nextLine = state.doc.line(i);\n const nextText = nextLine.text.trim();\n if (nextText.match(/^:::(.+)/)) {\n stack++;\n } else if (nextText === ':::') {\n stack--;\n if (stack === 0) {\n return { from: line.to, to: nextLine.to };\n }\n }\n }\n return null;\n }\n\n const htmlMatch = trimmed.match(/^<([a-zA-Z][\\w-]*)\\b/);\n if (htmlMatch) {\n const tagName = htmlMatch[1].toLowerCase();\n const voidElements = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', \n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n ]);\n if (voidElements.has(tagName) || trimmed.endsWith('/>')) return null;\n\n let stack = 1;\n\n for (let i = line.number + 1; i <= state.doc.lines; i++) {\n const nextLine = state.doc.line(i);\n const nextText = nextLine.text;\n \n let match;\n const tagRegex = new RegExp(`</?${tagName}\\\\b[^>]*>`, 'gi');\n \n while ((match = tagRegex.exec(nextText)) !== null) {\n if (match[0].startsWith('</')) {\n stack--;\n if (stack === 0) {\n return { from: line.to, to: nextLine.to };\n }\n } else {\n if (!match[0].endsWith('/>')) {\n stack++;\n }\n }\n }\n }\n return null;\n }\n\n return null;\n});\n\n// Directive colorization plugin — colored left borders for nested :::\nconst directivePlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const doc = view.state.doc;\n const visibleRanges = view.visibleRanges;\n if (visibleRanges.length === 0) return builder.finish();\n\n const maxTo = visibleRanges[visibleRanges.length - 1].to;\n const admonitionStack: string[] = [];\n\n for (let i = 1; i <= doc.lines; i++) {\n const line = doc.line(i);\n if (line.from > maxTo) break;\n\n const trimmedLine = line.text.trim();\n let isClosingLine = false;\n let closingTargetIdx = -1;\n\n const match = trimmedLine.match(/^:::(.*)/);\n if (match) {\n const rest = match[1].trim();\n if (rest === '') {\n if (admonitionStack.length > 0) {\n isClosingLine = true;\n closingTargetIdx = admonitionStack.length - 1;\n }\n } else {\n const typeMatch = rest.match(/^(\\w+|\\{)/);\n const type =\n typeMatch && typeMatch[1] !== '{'\n ? typeMatch[1].toLowerCase()\n : 'generic';\n admonitionStack.push(type);\n }\n }\n\n const isVisible = visibleRanges.some(\n r => line.to >= r.from && line.from <= r.to\n );\n\n if (isVisible && admonitionStack.length > 0) {\n const targetIdx = isClosingLine\n ? closingTargetIdx\n : admonitionStack.length - 1;\n const currentType = admonitionStack[targetIdx];\n const depth = targetIdx + 1;\n const lineClasses = ['cm-admonition-bg'];\n\n if (currentType === 'raw') {\n lineClasses.push('cm-raw-block');\n lineClasses.push(`cm-admonition-depth-${Math.min(depth, 5)}`);\n } else {\n lineClasses.push(`cm-admonition-${currentType}`);\n lineClasses.push(`cm-admonition-depth-${Math.min(depth, 5)}`);\n }\n\n builder.add(\n line.from,\n line.from,\n Decoration.line({ class: lineClasses.join(' ') })\n );\n }\n\n if (isClosingLine) {\n admonitionStack.pop();\n }\n }\n\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n// Blockquote line decoration\nconst blockquotePlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n for (const { from, to } of view.visibleRanges) {\n for (let pos = from; pos <= to; ) {\n const line = view.state.doc.lineAt(pos);\n if (line.text.trim().startsWith('>')) {\n builder.add(\n line.from,\n line.from,\n Decoration.line({ class: 'cm-blockquote-line' })\n );\n }\n pos = line.to + 1;\n }\n }\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n// Spoiler inline decoration: !>text<! → blurred until hover\nconst spoilerPlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const spoilerRegex = /!>([\\s\\S]+?)<!(?=\\s|$)/g;\n const ranges: { from: number; to: number; dec: Decoration }[] = [];\n\n for (const { from, to } of view.visibleRanges) {\n const text = view.state.doc.sliceString(from, to);\n spoilerRegex.lastIndex = 0;\n let match;\n while ((match = spoilerRegex.exec(text))) {\n const start = from + match.index;\n const end = start + match[0].length;\n const contentStart = start + 2;\n const contentEnd = end - 2;\n if (contentStart >= contentEnd) continue;\n ranges.push({ from: start, to: contentStart, dec: Decoration.replace({}) });\n ranges.push({\n from: contentStart,\n to: contentEnd,\n dec: Decoration.mark({ class: 'cm-spoiler' }),\n });\n ranges.push({ from: contentEnd, to: end, dec: Decoration.replace({}) });\n }\n }\n\n ranges.sort((a, b) => a.from - b.from || a.to - b.to);\n for (const { from, to, dec } of ranges) builder.add(from, to, dec);\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n// Color text inline decoration: %color%text%%\nconst colorTextPlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const colorRegex = /%([^%\\s]+?)%((?:(?!%%).)*)%%/g;\n for (const { from, to } of view.visibleRanges) {\n const text = view.state.doc.sliceString(from, to);\n let match;\n while ((match = colorRegex.exec(text))) {\n const color = match[1];\n const startPos = from + match.index;\n const endPos = startPos + match[0].length;\n builder.add(\n startPos,\n endPos,\n Decoration.mark({ attributes: { style: `color: ${color}` } })\n );\n }\n }\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n/**\n * NReditor — CodeMirror 6 editor with live markdown preview.\n * Drop-in component that works inside any container.\n *\n * @example\n * ```tsx\n * import NReditor from '@noirmd/previewer/editor';\n * import '@noirmd/previewer/editor.css';\n * import '@noirmd/previewer/vanilla/vanilla.css';\n *\n * <NReditor value={md} onChange={setMd} />\n * <NReditor value={md} onChange={setMd} tailwindCDN />\n * ```\n */\nconst NReditor: React.FC<NReditorProps> = ({\n value,\n onChange,\n className,\n debounceMs = 300,\n tailwindCDN = false,\n onGuide,\n onConfig,\n}) => {\n const editorRef = useRef<EditorView | null>(null);\n const [isAllFolded, setIsAllFolded] = useState(false);\n const [editorMode, setEditorMode] = useState<EditorMode>('split');\n const debouncedContent = useDebounce(value, debounceMs);\n\n useLazyTailwindCDN(tailwindCDN);\n\n const handleToggleFold = () => {\n if (!editorRef.current) return;\n if (isAllFolded) {\n unfoldAll(editorRef.current);\n setIsAllFolded(false);\n } else {\n foldAll(editorRef.current);\n setIsAllFolded(true);\n }\n };\n\n const extensions = React.useMemo(\n () => [\n customStreamParserV2,\n lineNumbers(),\n foldGutter({\n markerDOM: open => {\n const span = document.createElement('span');\n span.style.cursor = 'pointer';\n span.style.padding = '0 4px';\n span.style.fontSize = '12px';\n span.style.display = 'inline-block';\n span.style.transition = 'transform 0.2s';\n span.textContent = open ? '▼' : '▶';\n return span;\n },\n }),\n customFoldService,\n customEditorTheme,\n syntaxHighlighting(customSyntaxHighlighting),\n EditorView.lineWrapping,\n keymap.of([\n { key: 'Ctrl-Shift-[', run: foldAll },\n { key: 'Ctrl-Shift-]', run: unfoldAll },\n ]),\n directivePlugin,\n blockquotePlugin,\n spoilerPlugin,\n colorTextPlugin,\n ],\n []\n );\n\n const modeButtons: { key: EditorMode; icon: string; label: string }[] = [\n { key: 'editor', icon: 'code', label: 'Editor' },\n { key: 'split', icon: 'vertical_split', label: 'Split' },\n { key: 'preview', icon: 'visibility', label: 'Preview' },\n ];\n\n return (\n <div className={`nr-editor ${className || ''}`}>\n {/* Toolbar */}\n <div className=\"nr-editor-toolbar\">\n {/* Left: Fold + mode switcher */}\n <div className=\"nr-editor-toolbar-left\">\n <button\n onClick={handleToggleFold}\n className=\"nr-toolbar-btn nr-toolbar-btn-fold\"\n title={isAllFolded ? 'Expandir todo' : 'Colapsar todo'}\n aria-label={isAllFolded ? 'Expandir todo' : 'Colapsar todo'}\n >\n <span className=\"material-icons-round\">\n {isAllFolded ? 'unfold_more' : 'unfold_less'}\n </span>\n </button>\n\n <div className=\"nr-toolbar-divider\" />\n\n <div className=\"nr-toolbar-mode-group\">\n {modeButtons.map(btn => (\n <button\n key={btn.key}\n onClick={() => setEditorMode(btn.key)}\n className={`nr-toolbar-btn nr-toolbar-btn-mode ${\n editorMode === btn.key ? 'nr-toolbar-btn-mode--active' : ''\n } ${btn.key === 'split' ? 'nr-toolbar-btn-split' : ''}`}\n title={btn.label}\n >\n <span className=\"material-icons-round\">{btn.icon}</span>\n <span className=\"nr-toolbar-label\">{btn.label}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Right: Guía · Configurar (optional) */}\n <div className=\"nr-editor-toolbar-right\">\n {onGuide && (\n <button\n onClick={onGuide}\n className=\"nr-toolbar-btn nr-toolbar-btn-sm nr-toolbar-btn-guide\"\n title=\"Guía de sintaxis\"\n >\n <span className=\"material-icons-round\">menu_book</span>\n <span className=\"nr-toolbar-label\">Guía</span>\n </button>\n )}\n {onGuide && onConfig && <div className=\"nr-toolbar-divider\" />}\n {onConfig && (\n <button\n onClick={onConfig}\n className=\"nr-toolbar-btn nr-toolbar-btn-sm nr-toolbar-btn-config\"\n title=\"Configurar tema y metadata\"\n >\n <span className=\"material-icons-round\">tune</span>\n <span className=\"nr-toolbar-label\">Configurar</span>\n </button>\n )}\n </div>\n </div>\n\n {/* Content area — editor / split / preview */}\n <div className=\"nr-editor-body\">\n {(editorMode === 'editor' || editorMode === 'split') && (\n <div\n className={`nr-editor-pane ${\n editorMode === 'split' ? 'nr-editor-pane--half' : ''\n }`}\n >\n <CodeMirror\n value={value}\n onChange={onChange}\n height=\"auto\"\n onCreateEditor={view => {\n editorRef.current = view as any;\n }}\n basicSetup={{\n lineNumbers: false,\n foldGutter: false,\n }}\n extensions={extensions}\n />\n </div>\n )}\n\n {(editorMode === 'preview' || editorMode === 'split') && (\n <div\n className={`nr-editor-preview ${\n editorMode === 'split' ? 'nr-editor-preview--half' : ''\n }`}\n >\n <div className=\"nr-editor-prose\">\n <div className=\"nr-prose\">\n <CustomMarkdownRenderer content={debouncedContent} />\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default NReditor;\n","import { StreamLanguage } from '@codemirror/language';\r\nimport { tags as t } from '@lezer/highlight';\r\n\r\n/**\r\n * V2 Custom Syntax Highlighter for CodeMirror 6.\r\n */\r\n\r\ninterface V2State {\r\n inCodeBlock: boolean;\r\n inDirectiveHeader: boolean;\r\n inPropsBlock: boolean;\r\n braceDepth: number;\r\n blockStack: string[];\r\n imageState: 'none' | 'expectUrl' | 'expectOptions';\r\n linkState: 'none' | 'expectUrl';\r\n lastPropKey: string;\r\n inHtmlBlock: boolean;\r\n htmlTagName: string;\r\n isClosingHtmlTag: boolean;\r\n embeddedLang: 'none' | 'script' | 'style';\r\n}\r\n\r\nexport const customStreamParserV2 = StreamLanguage.define<V2State>({\r\n startState: () => ({\r\n inCodeBlock: false,\r\n inDirectiveHeader: false,\r\n inPropsBlock: false,\r\n braceDepth: 0,\r\n blockStack: [],\r\n imageState: 'none',\r\n linkState: 'none',\r\n lastPropKey: '',\r\n inHtmlBlock: false,\r\n htmlTagName: '',\r\n isClosingHtmlTag: false,\r\n embeddedLang: 'none',\r\n }),\r\n\r\n token(stream, state) {\r\n // ── Line start resets ──\r\n if (stream.sol()) {\r\n state.inDirectiveHeader = false;\r\n state.imageState = 'none';\r\n state.linkState = 'none';\r\n\r\n // Close code block\r\n if (state.inCodeBlock && stream.match(/^\\s*```/)) {\r\n state.inCodeBlock = false;\r\n return 'comment';\r\n }\r\n \r\n // ELIMINADO: El reinicio de state.inHtmlBlock aquí para permitir atributos multilínea\r\n }\r\n\r\n // Inside HTML block opening tag (soporta atributos multilínea)\r\n if (state.inHtmlBlock) {\r\n stream.eatSpace();\r\n \r\n // Self-closing: />\r\n if (stream.match(/^\\/>/)) {\r\n state.inHtmlBlock = false;\r\n state.htmlTagName = '';\r\n state.isClosingHtmlTag = false;\r\n return 'typeName';\r\n }\r\n // Closing >\r\n if (stream.match(/^>/)) {\r\n state.inHtmlBlock = false;\r\n // Enter embedded mode for <script> / <style> blocks\r\n if (!state.isClosingHtmlTag && (state.htmlTagName === 'script' || state.htmlTagName === 'style')) {\r\n state.embeddedLang = state.htmlTagName;\r\n }\r\n state.htmlTagName = '';\r\n state.isClosingHtmlTag = false;\r\n return 'typeName';\r\n }\r\n \r\n // Nombre de atributo\r\n if (stream.match(/^[a-zA-Z_:][\\w-.:]*/)) return 'attributeName';\r\n // Signo igual\r\n if (stream.match(/^=/)) return 'keyword';\r\n // Valor entre comillas dobles (cerradas o abiertas en esta línea)\r\n if (stream.match(/^\"[^\"]*\"/)) return 'string';\r\n if (stream.match(/^\"[^\"]*$/)) return 'string';\r\n // Valor entre comillas simples (cerradas o abiertas)\r\n if (stream.match(/^'[^']*'/)) return 'string';\r\n if (stream.match(/^'[^']*$/)) return 'string';\r\n // Valor sin comillas\r\n if (stream.match(/^[^\\s>]+/)) return 'string';\r\n \r\n if (stream.eatSpace()) return null;\r\n stream.next();\r\n return null;\r\n }\r\n\r\n // ── Inside embedded <script> / <style> ──\r\n if (state.embeddedLang !== 'none') {\r\n // Detect closing tag to exit embedded mode\r\n if (stream.match(/^<\\/(script|style)\\b/i)) {\r\n const closeTag = stream.current().replace(/^<\\//, '').toLowerCase();\r\n state.embeddedLang = 'none';\r\n state.inHtmlBlock = true;\r\n state.htmlTagName = closeTag;\r\n state.isClosingHtmlTag = true;\r\n return 'typeName';\r\n }\r\n\r\n if (state.embeddedLang === 'script') {\r\n // ── JavaScript tokenizer ──\r\n // Line comments\r\n if (stream.match(/^\\/\\//)) { stream.skipToEnd(); return 'comment'; }\r\n // Block comments\r\n if (stream.match(/^\\/\\*/)) {\r\n while (!stream.eol()) {\r\n if (stream.match(/\\*\\//)) return 'comment';\r\n stream.next();\r\n }\r\n return 'comment';\r\n }\r\n // Strings (single / double quotes)\r\n if (stream.match(/^[\"']/)) {\r\n const q = stream.current();\r\n while (!stream.eol()) {\r\n const ch = stream.next();\r\n if (ch === q && stream.string[stream.pos - 2] !== '\\\\') break;\r\n }\r\n return 'string';\r\n }\r\n // Template literals\r\n if (stream.match(/^`/)) {\r\n while (!stream.eol()) {\r\n if (stream.next() === '`') break;\r\n }\r\n return 'string';\r\n }\r\n // Keywords\r\n if (stream.match(/\\b(const|let|var|function|return|if|else|for|while|do|switch|case|break|continue|new|this|class|extends|import|export|default|from|try|catch|finally|throw|async|await|typeof|instanceof|in|of|void|null|undefined|true|false)\\b/)) return 'keyword';\r\n // Numbers\r\n if (stream.match(/^\\d+(\\.\\d+)?/)) return 'number';\r\n // Function call\r\n if (stream.match(/^[a-zA-Z_$][\\w$]*(?=\\s*\\()/)) return 'function';\r\n // Identifier\r\n if (stream.match(/^[a-zA-Z_$][\\w$]*/)) return 'variableName';\r\n // Operators\r\n if (stream.match(/^[+\\-*\\/%=!<>&|^~?:]+/)) return 'keyword';\r\n stream.next();\r\n return null;\r\n }\r\n\r\n if (state.embeddedLang === 'style') {\r\n // ── CSS tokenizer ──\r\n // Comments\r\n if (stream.match(/^\\/\\*/)) {\r\n while (!stream.eol()) {\r\n if (stream.match(/\\*\\//)) return 'comment';\r\n stream.next();\r\n }\r\n return 'comment';\r\n }\r\n // Strings\r\n if (stream.match(/^[\"']/)) {\r\n const q = stream.current();\r\n while (!stream.eol()) {\r\n const ch = stream.next();\r\n if (ch === q && stream.string[stream.pos - 2] !== '\\\\') break;\r\n }\r\n return 'string';\r\n }\r\n // At-rules\r\n if (stream.match(/^@[a-zA-Z-]+/)) return 'keyword';\r\n // Hex colors\r\n if (stream.match(/^#[0-9a-fA-F]{3,8}\\b/)) return 'string';\r\n // Numbers with optional units\r\n if (stream.match(/^\\d+(\\.\\d+)?(px|em|rem|%|vh|vw|vmin|vmax|s|ms|deg|fr)?\\b/)) return 'number';\r\n // Property name (word before colon)\r\n if (stream.match(/^[a-zA-Z-]+(?=\\s*:)/)) return 'propertyName';\r\n // Selectors: .class / #id\r\n if (stream.match(/^[.#][a-zA-Z][\\w-]*/)) return 'className';\r\n // CSS keywords\r\n if (stream.match(/\\b(none|auto|inherit|initial|unset|normal|bold|italic|center|left|right|flex|grid|block|inline|relative|absolute|fixed|sticky|hidden|visible|scroll|cover|contain)\\b/)) return 'keyword';\r\n // Tag selectors\r\n if (stream.match(/^[a-zA-Z][\\w-]*/)) return 'typeName';\r\n // Punctuation\r\n if (stream.match(/^[{}();:,]/)) return 'keyword';\r\n stream.next();\r\n return null;\r\n }\r\n }\r\n\r\n // Inside code block → everything is comment\r\n if (state.inCodeBlock) {\r\n stream.skipToEnd();\r\n return 'comment';\r\n }\r\n\r\n // Inside {props} block\r\n if (state.inPropsBlock) {\r\n stream.eatSpace();\r\n\r\n if (stream.peek() === '}') {\r\n stream.next();\r\n state.inPropsBlock = false;\r\n state.inDirectiveHeader = false;\r\n state.lastPropKey = '';\r\n return 'keyword';\r\n }\r\n\r\n if (stream.match(/^\\.[a-zA-Z0-9_-]+/)) return 'className';\r\n if (stream.match(/^#[a-zA-Z0-9_-]+/)) return 'propertyName';\r\n\r\n const urlKeys = /^(url|href|image|src|icon)$/i;\r\n if (stream.match(/^[a-zA-Z][\\w-]*(?==)/)) {\r\n state.lastPropKey = stream.current();\r\n return 'propertyName';\r\n }\r\n if (stream.match(/^=/)) return 'keyword';\r\n if (stream.match(/^\"[^\"]*\"|^'[^']*'/)) {\r\n return urlKeys.test(state.lastPropKey) ? 'url' : 'string';\r\n }\r\n\r\n stream.next();\r\n return null;\r\n }\r\n\r\n // ── Line-start rules ──\r\n if (stream.sol()) {\r\n let match;\r\n if ((match = stream.match(/^\\s*(:::)\\s*/))) {\r\n const rest = stream.string.slice(stream.pos).trim();\r\n\r\n if (rest === '') {\r\n state.blockStack.pop();\r\n } else {\r\n const typeMatch = rest.match(/^([\\w-]+)/);\r\n state.blockStack.push(typeMatch ? typeMatch[1].toLowerCase() : 'generic');\r\n }\r\n\r\n state.inDirectiveHeader = true;\r\n return 'keyword';\r\n }\r\n\r\n if (stream.match(/^\\s*#[a-zA-Z][\\w-]*\\s*$/) && !stream.match(/^\\s*#{1,6}\\s/)) {\r\n return 'propertyName';\r\n }\r\n if (stream.match(/^\\s*(#{1,6})\\s+/)) return 'heading';\r\n if (stream.match(/^\\s*```/)) {\r\n state.inCodeBlock = true;\r\n stream.skipToEnd();\r\n return 'comment';\r\n }\r\n if (stream.match(/^\\s*([-*+]|\\d+\\.)\\s+/)) return 'variableName';\r\n if (stream.match(/^\\s*(---|___|(\\*\\s*){3,})\\s*$/)) return 'meta';\r\n if (stream.match(/^\\s*\\[TOC\\d?\\]/)) return 'keyword';\r\n }\r\n\r\n // ── Directive header ──\r\n if (state.inDirectiveHeader) {\r\n stream.eatSpace();\r\n if (stream.match(/^[\\w-]+/)) return 'typeName';\r\n if (stream.peek() === '{') {\r\n stream.next();\r\n state.inPropsBlock = true;\r\n state.inDirectiveHeader = true;\r\n return 'keyword';\r\n }\r\n state.inDirectiveHeader = false;\r\n }\r\n\r\n // ── Raw block content (HTML/CSS/JS) ──\r\n const currentBlockType = state.blockStack[state.blockStack.length - 1];\r\n if (currentBlockType === 'raw' && !state.inDirectiveHeader) {\r\n if (stream.eatSpace()) return null;\r\n if (stream.match(/^<\\/?[a-zA-Z0-9-]+/)) return 'typeName';\r\n if (stream.match(/^>/)) return 'typeName';\r\n if (stream.match(/^[{}]/)) return 'keyword';\r\n if (stream.match(/^--[a-zA-Z0-9_-]+/)) return 'variableName';\r\n if (stream.match(/^[a-zA-Z-]+(?=\\s*:)/)) return 'propertyName';\r\n if (stream.match(/^var\\([^)]+\\)/)) return 'variableName';\r\n if (stream.match(/^['\"`][^'\"`]*['\"`]/)) return 'string';\r\n if (stream.match(/^[#.][a-zA-Z0-9_-]+/)) return 'className';\r\n if (stream.match(/^:[a-zA-Z0-9_-]+/)) return 'keyword';\r\n if (stream.match(/\\b(const|let|var|function|return|if|else|for|while)\\b/)) return 'keyword';\r\n stream.next();\r\n return null;\r\n }\r\n\r\n // ── Image & Links ──\r\n if (state.imageState === 'expectUrl') {\r\n state.imageState = 'expectOptions';\r\n if (stream.eat('(')) {\r\n let parenLevel = 1;\r\n while (!stream.eol() && parenLevel > 0) {\r\n const next = stream.next();\r\n if (next === '(') parenLevel++;\r\n else if (next === ')' && stream.string[stream.pos - 2] !== '\\\\') parenLevel--;\r\n }\r\n return 'url';\r\n } else {\r\n state.imageState = 'none';\r\n }\r\n }\r\n if (state.imageState === 'expectOptions') {\r\n state.imageState = 'none';\r\n if (stream.eat('{')) {\r\n stream.eatWhile(/[^}]/);\r\n stream.eat('}');\r\n return 'attributeName';\r\n }\r\n }\r\n if (state.linkState === 'expectUrl') {\r\n state.linkState = 'none';\r\n if (stream.eat('(')) {\r\n let parenLevel = 1;\r\n while (!stream.eol() && parenLevel > 0) {\r\n const next = stream.next();\r\n if (next === '(') parenLevel++;\r\n else if (next === ')' && stream.string[stream.pos - 2] !== '\\\\') parenLevel--;\r\n }\r\n return 'url';\r\n }\r\n }\r\n\r\n // ── HTML tags (inline & block) - Mejorado con |$ para EOL ──\r\n if (stream.match(/^<\\/?[a-zA-Z][\\w-]*(?=[>\\s/]|$)/)) {\r\n const raw = stream.current();\r\n state.htmlTagName = raw.replace(/^<\\/?/, '').toLowerCase();\r\n state.isClosingHtmlTag = raw.startsWith('</');\r\n state.inHtmlBlock = true;\r\n return 'typeName';\r\n }\r\n\r\n // ── Inline formatting ──\r\n if (stream.match(/\\*\\*\\*.+?\\*\\*\\*/)) return 'strongEmphasis';\r\n if (stream.match(/\\*\\*.+?\\*\\*/)) return 'strong';\r\n if (stream.match(/!\\[[^\\]]*?\\]/)) {\r\n if (stream.peek() === '(') state.imageState = 'expectUrl';\r\n return 'string';\r\n }\r\n if (stream.match(/\\[[^\\]]+?\\]/)) {\r\n if (stream.peek() === '(') state.linkState = 'expectUrl';\r\n return 'string';\r\n }\r\n if (stream.match(/\\|\\[[^\\]]+?\\]\\|/)) return 'keyword';\r\n if (stream.match(/`[^`]+`/)) return 'comment';\r\n if (stream.match(/_(.+?)_/)) return 'emphasis';\r\n if (stream.match(/~~(.+?)~~/)) return 'strikethrough';\r\n if (stream.match(/!~(.+?)~!/)) return 'underline';\r\n if (stream.match(/==(.+?)==/)) return 'highlight';\r\n if (stream.match(/!>.+?<!/)) return 'comment';\r\n if (stream.match(/%[^%\\s]+?%[^%]+?%%/)) return 'string';\r\n if (stream.match(/->|<-|\\|/)) return 'meta';\r\n\r\n stream.next();\r\n return null;\r\n },\r\n\r\n tokenTable: {\r\n heading: t.heading,\r\n keyword: t.keyword,\r\n typeName: t.typeName,\r\n string: t.string,\r\n attributeName: t.attributeName,\r\n propertyName: t.propertyName,\r\n className: t.className,\r\n comment: t.comment,\r\n variableName: t.variableName,\r\n meta: t.meta,\r\n strong: t.strong,\r\n emphasis: t.emphasis,\r\n strongEmphasis: [t.strong, t.emphasis],\r\n strikethrough: t.strikethrough,\r\n underline: t.special(t.emphasis),\r\n highlight: t.special(t.comment),\r\n url: t.url,\r\n link: t.string,\r\n number: t.number,\r\n function: t.function(t.variableName),\r\n },\r\n});","import { useState, useEffect } from 'react';\n\n/**\n * useDebounce — delays updating a value until after a specified delay.\n * Useful for reducing expensive operations (like preview rendering) during rapid input.\n */\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n","import { useEffect, useRef } from 'react';\n\n/**\n * useLazyTailwindCDN — Lazily injects the Tailwind CSS v4 Browser CDN\n * so that arbitrary Tailwind classes written in runtime markdown content\n * (:::raw, directives, ##{ } attrs, etc.) are resolved.\n *\n * - Only injects the <script> when `enabled` is true (e.g. preview mode).\n * - Removes the script when `enabled` becomes false (editor-only mode).\n * - This means zero CDN cost in editor-only mode.\n * - The v4 Browser CDN uses `@tailwindcss/browser` which JIT-compiles\n * classes from the DOM at runtime.\n * - preflight is DISABLED via inline config to avoid overriding app base styles.\n */\n\nconst CDN_URL = 'https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4';\nconst SCRIPT_ID = 'tailwind-cdn-v4-runtime';\nconst CONFIG_ID = 'tailwind-cdn-v4-config';\n\n// Tailwind v4 Browser CDN reads the theme from CSS @theme blocks already on the page.\n// No need to duplicate fonts/colors here — they're defined in src/index.css.\n// Only disable preflight to avoid injecting normalize.css over our base styles.\nconst TAILWIND_CDN_CONFIG = `\nwindow.tailwind = window.tailwind || {};\nwindow.tailwind.config = {\n corePlugins: {\n preflight: false,\n },\n};\n`;\n\ndeclare global {\n interface Window {\n __twCDNRefs?: number;\n tailwind?: { config: object; scan?: () => void };\n }\n}\n\n/**\n * Lazy CDN hook — only loads the Tailwind Browser CDN when `enabled` is true.\n * Call this from the component that hosts the preview panel.\n */\nexport function useLazyTailwindCDN(enabled: boolean) {\n const loadedRef = useRef(false);\n\n useEffect(() => {\n if (!enabled) {\n // When disabled: remove CDN scripts if no other consumers need them\n window.__twCDNRefs = (window.__twCDNRefs ?? 1) - 1;\n if ((window.__twCDNRefs ?? 0) <= 0) {\n document.getElementById(SCRIPT_ID)?.remove();\n document.getElementById(CONFIG_ID)?.remove();\n window.__twCDNRefs = 0;\n loadedRef.current = false;\n }\n return;\n }\n\n // When enabled: inject CDN scripts\n window.__twCDNRefs = (window.__twCDNRefs ?? 0) + 1;\n\n // Inject config script BEFORE the CDN\n if (!document.getElementById(CONFIG_ID)) {\n const configScript = document.createElement('script');\n configScript.id = CONFIG_ID;\n configScript.textContent = TAILWIND_CDN_CONFIG;\n document.head.appendChild(configScript);\n }\n\n // Inject the Tailwind v4 Browser CDN script\n if (!document.getElementById(SCRIPT_ID)) {\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = CDN_URL;\n document.head.appendChild(script);\n loadedRef.current = true;\n }\n\n return () => {\n window.__twCDNRefs = (window.__twCDNRefs ?? 1) - 1;\n if ((window.__twCDNRefs ?? 0) <= 0) {\n document.getElementById(SCRIPT_ID)?.remove();\n document.getElementById(CONFIG_ID)?.remove();\n window.__twCDNRefs = 0;\n loadedRef.current = false;\n }\n };\n }, [enabled]);\n}\n\n/**\n * Trigger a Tailwind CDN re-scan (use after DOM mutations with new classes).\n */\nexport function scanTailwindCDN() {\n const tw = (window as any).tailwind;\n if (tw?.scan) tw.scan();\n}\n\n/**\n * Preload the Tailwind Browser CDN right after page load.\n * Uses requestIdleCallback so it doesn't block the main thread.\n * By the time the user opens preview, the CDN is already loaded.\n */\nexport function preloadTailwindCDN() {\n // Already loaded — skip\n if (document.getElementById(SCRIPT_ID)) return;\n\n const inject = () => {\n if (document.getElementById(SCRIPT_ID)) return; // double-check\n\n // Inject config script\n if (!document.getElementById(CONFIG_ID)) {\n const configScript = document.createElement('script');\n configScript.id = CONFIG_ID;\n configScript.textContent = TAILWIND_CDN_CONFIG;\n document.head.appendChild(configScript);\n }\n\n // Inject CDN script\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = CDN_URL;\n document.head.appendChild(script);\n\n window.__twCDNRefs = (window.__twCDNRefs ?? 0) + 1;\n };\n\n // Wait for idle — don't block initial render\n if ('requestIdleCallback' in window) {\n (window as any).requestIdleCallback(inject, { timeout: 2000 });\n } else {\n // Fallback: load after a short delay\n setTimeout(inject, 200);\n }\n}\n\nexport function useTailwindCDN() {\n useLazyTailwindCDN(true);\n}\n","import React, { useEffect, useRef } from 'react';\nimport { renderMarkdownString } from '../vanilla/renderer';\nimport { scrollToId } from '../core/utils';\nimport { scanTailwindCDN } from './useTailwindCDN';\n\ninterface CustomMarkdownRendererProps {\n content: string;\n}\n\n/**\n * CustomMarkdownRenderer — thin React wrapper around the vanilla renderer.\n *\n * Pipeline:\n * content (string) → renderMarkdownString() → HTMLElement → mounted\n *\n * The vanilla engine handles all rendering, directives and events;\n * React only owns the mount point. Note: rendering happens on the\n * client (useEffect); the server render is an empty placeholder.\n */\nconst CustomMarkdownRenderer: React.FC<CustomMarkdownRendererProps> = ({ content }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n // Clear previous content and mount the vanilla-rendered element\n container.replaceChildren();\n container.appendChild(renderMarkdownString(content));\n\n // Resolve any Tailwind classes in user-authored content (no-op if CDN not loaded)\n scanTailwindCDN();\n\n // Scroll to hash on load and hash changes\n const handleHashChange = () => {\n const hash = window.location.hash;\n if (hash) {\n const parts = hash.split('#');\n scrollToId(parts[parts.length - 1]);\n }\n };\n handleHashChange();\n window.addEventListener('hashchange', handleHashChange);\n return () => window.removeEventListener('hashchange', handleHashChange);\n }, [content]);\n\n return <div ref={containerRef} />;\n};\n\nexport default CustomMarkdownRenderer;","import type { CSSProperties } from './types';\r\n\r\n/**\r\n * Parse an inline CSS string (e.g. \"color: red; padding: 1rem\") into a CSSProperties object.\r\n */\r\nexport function parseCssString(cssText: string): CSSProperties {\r\n if (!cssText) return {};\r\n return cssText\r\n .split(';')\r\n .filter(Boolean)\r\n .reduce<CSSProperties>((styleObj, styleString) => {\r\n const parts = styleString.split(':');\r\n if (parts.length < 2) return styleObj;\r\n const key = parts[0].trim().replace(/-([a-z])/g, (_, g) => g.toUpperCase());\r\n const value = parts.slice(1).join(':').trim();\r\n styleObj[key] = value;\r\n return styleObj;\r\n }, {});\r\n}\r\n\r\n/**\r\n * Generate a URL-safe slug from text (NFD decomposition, strip accents, lowercase, hyphenate).\r\n */\r\nexport function generateId(text: string): string {\r\n return text\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '')\r\n .toLowerCase()\r\n .replace(/[^\\w\\s-]/g, '')\r\n .replace(/\\s+/g, '-');\r\n}\r\n\r\n/**\r\n * Smooth-scroll to an element by its ID.\r\n */\r\nexport function scrollToId(id: string): void {\r\n if (typeof document === 'undefined') return;\r\n const element = document.getElementById(id);\r\n if (element) {\r\n element.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n}\r\n\r\n/**\r\n * Parse attribute suffix like `##{.my-class #my-id}` from a text line.\r\n * Returns the cleaned text, extracted classes, and id.\r\n */\r\nexport function extractAttributes(text: string): { text: string; classes: string; id: string } {\r\n const match = text.match(/^(.*?)\\s*##\\{([^}]*)\\}\\s*$/);\r\n if (!match) return { text, classes: '', id: '' };\r\n\r\n const rawAttrs = match[2];\r\n const cleanedText = match[1];\r\n\r\n const classList: string[] = [];\r\n let id = '';\r\n\r\n // 1. Parse key=\"value\" attributes (e.g., class=\"mt-0 px-4\", id=\"section\")\r\n for (const [, key, value] of rawAttrs.matchAll(/([\\w-]+)=\"([^\"]*)\"/g)) {\r\n if (key === 'class') {\r\n classList.push(...value.split(/\\s+/).filter(Boolean));\r\n } else if (key === 'id') {\r\n id = value;\r\n }\r\n }\r\n\r\n // 2. Parse shorthand tokens: .className and #id (from remaining content)\r\n // Supports classes with / (opacity), ! (important), . (arbitrary values)\r\n const stripped = rawAttrs.replace(/[\\w-]+=\"[^\"]*\"/g, '');\r\n for (const token of stripped.split(/\\s+/).filter(Boolean)) {\r\n if (token.startsWith('.')) classList.push(token.slice(1));\r\n else if (token.startsWith('#') && !id) id = token.slice(1);\r\n }\r\n\r\n return { text: cleanedText, classes: classList.join(' '), id };\r\n}\r\n\r\nlet _scopeCounter = 0;\r\nexport function resetScopeCounter(): void {\r\n _scopeCounter = 0;\r\n}\r\n\r\n/**\r\n * Generate a unique scope ID for CSS isolation.\r\n */\r\nexport function generateScopeId(): string {\r\n return `scope-${++_scopeCounter}`;\r\n}\r\n\r\n/**\r\n * Parse props from a `{key=\"value\" key2=\"value2\"}` string.\r\n * Also supports `.className` shorthand → adds to `class` prop.\r\n * Also supports `#id` shorthand → adds to `id` prop.\r\n */\r\nexport function parseProps(propsString: string): Record<string, string> {\r\n const props: Record<string, string> = {};\r\n if (!propsString?.trim()) return props;\r\n\r\n // Match key=\"value\" or key='value' pairs\r\n const pairRegex = /(\\w[\\w-]*)=(?:\"([^\"]*)\"|'([^']*)')/g;\r\n let match;\r\n while ((match = pairRegex.exec(propsString)) !== null) {\r\n const key = match[1];\r\n const value = match[2] ?? match[3] ?? '';\r\n props[key] = value;\r\n }\r\n\r\n // Extract .className shorthand (supports / for opacity, ! for important, . for arbitrary values)\r\n const classMatches = propsString.match(/\\.([a-zA-Z0-9_!/.\\-]+)/g);\r\n if (classMatches) {\r\n const existing = props['class'] || '';\r\n const newClasses = classMatches.map(c => c.substring(1)).join(' ');\r\n props['class'] = existing ? `${existing} ${newClasses}` : newClasses;\r\n }\r\n\r\n // Extract #id shorthand (only if not inside a key=\"value\" pair)\r\n const idMatch = propsString.match(/#([a-zA-Z0-9_-]+)(?=\\s|}|$)/);\r\n if (idMatch && !props['id']) {\r\n props['id'] = idMatch[1];\r\n }\r\n\r\n return props;\r\n}\r\n\r\n/**\r\n * Parse raw HTML attributes string (e.g. `class=\"...\" style=\"...\" data-foo=\"...\"`)\r\n * into a plain props object.\r\n *\r\n * NOTE: This does NOT rename `class` → `className`. Framework adapters\r\n * (React, Vue, etc.) should handle their own attribute name mapping.\r\n */\r\nexport function parseHtmlAttrs(attrsString: string): Record<string, any> {\r\n const props: Record<string, any> = {};\r\n if (!attrsString?.trim()) return props;\r\n\r\n const pairRegex = /([a-zA-Z0-9_-]+)(?:=(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]+)))?/g;\r\n let match;\r\n while ((match = pairRegex.exec(attrsString)) !== null) {\r\n const key = match[1];\r\n const value = match[2] ?? match[3] ?? match[4] ?? true;\r\n\r\n // Parse style strings into objects\r\n if (key === 'style' && typeof value === 'string') {\r\n props[key] = parseCssString(value);\r\n } else {\r\n props[key] = value;\r\n }\r\n }\r\n\r\n return props;\r\n}\r\n","import type { Token, DirectiveToken, HtmlBlockToken, CSSProperties } from './types';\r\nimport { generateId, generateScopeId, parseProps, extractAttributes } from './utils';\r\n\r\n/**\r\n * V2 Markdown Parser — line-by-line state machine (framework-agnostic).\r\n */\r\nexport function parseMarkdown(markdown: string): Token[] {\r\n if (!markdown) return [];\r\n const lines = markdown.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '').split('\\n');\r\n const result: Token[] = [];\r\n const usedIds = new Set<string>();\r\n let i = 0;\r\n\r\n while (i < lines.length) {\r\n const line = lines[i];\r\n const trimmed = line.trim();\r\n let match: RegExpMatchArray | null;\r\n\r\n // ── Headers: ## Title ──\r\n if ((match = trimmed.match(/^(#{1,6})\\s+(.+)$/))) {\r\n const level = match[1].length;\r\n const rawText = match[2];\r\n const { text, classes, id: customId } = extractAttributes(rawText);\r\n const baseId = customId || generateId(text.replace(/->|<-/g, ''));\r\n let id = baseId;\r\n let n = 1;\r\n while (usedIds.has(id)) {\r\n n++;\r\n id = `${baseId}-${n}`;\r\n }\r\n usedIds.add(id);\r\n result.push({ type: 'header', level, text, id, classes: classes || undefined });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Aligned paragraph: -> text <- or -> text -> ──\r\n if ((match = trimmed.match(/^->\\s*(.+?)\\s*(<-|->)\\s*$/))) {\r\n const content = match[1];\r\n const align = match[2] === '<-' ? 'center' : 'right';\r\n result.push({ type: 'paragraph', content, align });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Code block: ```lang title=\"name\" ──\r\n if (trimmed.startsWith('```')) {\r\n const fenceHeader = trimmed.slice(3).trim();\r\n const titleMatch = fenceHeader.match(/title=[\"']([^\"']*)[\"']/);\r\n const lang = fenceHeader.replace(/title=[\"'][^\"']*[\"']/, '').trim();\r\n const title = titleMatch ? titleMatch[1] : undefined;\r\n const content: string[] = [];\r\n i++;\r\n while (i < lines.length && !lines[i].trim().startsWith('```')) {\r\n content.push(lines[i]);\r\n i++;\r\n }\r\n result.push({ type: 'codeblock', language: lang, title, content: content.join('\\n') });\r\n i++; // skip closing ```\r\n continue;\r\n }\r\n\r\n // ── Directive: :::type {props} ... ::: ──\r\n if (trimmed.startsWith(':::')) {\r\n const rest = trimmed.slice(3).trim();\r\n\r\n // Bare closing marker\r\n if (rest === '') {\r\n result.push({ type: 'paragraph', content: line });\r\n i++;\r\n continue;\r\n }\r\n\r\n const typeMatch = rest.match(/^([\\w-]+)/);\r\n const directiveType = typeMatch ? typeMatch[1] : 'custom';\r\n\r\n // Lookahead: find the matching closing :::\r\n let j = i + 1;\r\n let nestedLevel = 0;\r\n let foundClose = false;\r\n\r\n while (j < lines.length) {\r\n const currentTrimmed = lines[j].trim();\r\n if (currentTrimmed === ':::') {\r\n if (nestedLevel === 0) {\r\n foundClose = true;\r\n break;\r\n } else {\r\n nestedLevel--;\r\n }\r\n } else if (currentTrimmed.startsWith(':::')) {\r\n // Opening a nested directive\r\n nestedLevel++;\r\n }\r\n j++;\r\n }\r\n\r\n if (foundClose) {\r\n // Collect raw content lines (between opening and closing)\r\n const contentLines: string[] = [];\r\n for (let k = i + 1; k < j; k++) {\r\n contentLines.push(lines[k]);\r\n }\r\n const rawContent = contentLines.join('\\n');\r\n\r\n // Parse the directive header (everything after the type name)\r\n const headerRest = typeMatch ? rest.slice(directiveType.length).trim() : rest;\r\n\r\n // Extract {props} block\r\n let propsString = '';\r\n let shortForm = '';\r\n const propsBlockMatch = headerRest.match(/^\\{([^]*)\\}\\s*$/);\r\n if (propsBlockMatch) {\r\n propsString = propsBlockMatch[1];\r\n } else if (headerRest) {\r\n // Short-form: bare text after type → becomes title prop\r\n shortForm = headerRest;\r\n }\r\n\r\n const props = parseProps(propsString);\r\n if (shortForm && !props['title']) {\r\n props['title'] = shortForm;\r\n }\r\n\r\n // Split content into slots\r\n const slots = splitSlots(rawContent);\r\n\r\n result.push({\r\n type: 'directive',\r\n directiveType,\r\n props,\r\n slots,\r\n scopeId: generateScopeId(),\r\n } as DirectiveToken);\r\n\r\n i = j + 1;\r\n continue;\r\n } else {\r\n // Unclosed directive — render as plain text\r\n result.push({ type: 'paragraph', content: line });\r\n i++;\r\n continue;\r\n }\r\n }\r\n\r\n // ── Image: {w:h} ──\r\n if ((match = trimmed.match(/^(.*?)!\\[([^\\]]*)\\]\\(([^)]+?)\\)(?:\\{([^}]+?)\\})?(.*)$/))) {\r\n const [, preText, alt, srcAndFloat, size, postText] = match;\r\n\r\n if (preText.trim()) {\r\n result.push({ type: 'paragraph', content: preText.trim() });\r\n }\r\n\r\n let src = srcAndFloat;\r\n const style: CSSProperties = {};\r\n if (src.includes('#left')) {\r\n src = src.replace('#left', '');\r\n style.float = 'left';\r\n style.margin = '0 1em 1em 0';\r\n } else if (src.includes('#right')) {\r\n src = src.replace('#right', '');\r\n style.float = 'right';\r\n style.margin = '0 0 1em 1em';\r\n } else if (src.includes('#center')) {\r\n src = src.replace('#center', '');\r\n style.display = 'block';\r\n style.margin = '0 auto 1em auto';\r\n }\r\n if (size) {\r\n const [width, height] = size.split(':');\r\n if (width) style.width = width.trim();\r\n if (height) style.height = height.trim();\r\n }\r\n result.push({ type: 'image', alt, src, style });\r\n\r\n if (postText.trim()) {\r\n result.push({ type: 'paragraph', content: postText.trim() });\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Table: | cell | cell | ──\r\n if (trimmed.includes('|') && i + 1 < lines.length && lines[i + 1].includes('---')) {\r\n const tableLines = [line];\r\n i++;\r\n tableLines.push(lines[i]);\r\n i++;\r\n while (i < lines.length && lines[i].trim().includes('|')) {\r\n tableLines.push(lines[i]);\r\n i++;\r\n }\r\n result.push({ type: 'table', content: tableLines.join('\\n') });\r\n continue;\r\n }\r\n\r\n // ── List: - item or 1. item ──\r\n if ((match = trimmed.match(/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/))) {\r\n const listItems = [line];\r\n i++;\r\n while (i < lines.length) {\r\n const nextLine = lines[i];\r\n const nextTrimmed = nextLine.trim();\r\n if (\r\n nextTrimmed.match(/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/) ||\r\n nextTrimmed === '' ||\r\n nextLine.startsWith(' ')\r\n ) {\r\n listItems.push(nextLine);\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n result.push({ type: 'list', content: listItems.join('\\n') });\r\n continue;\r\n }\r\n\r\n // ── Blockquote: > text ──\r\n if (trimmed.startsWith('>')) {\r\n const quoteLines = [line];\r\n i++;\r\n while (i < lines.length && (lines[i].trim().startsWith('>') || lines[i].trim() === '')) {\r\n quoteLines.push(lines[i]);\r\n i++;\r\n }\r\n const rawQuote = quoteLines.join('\\n').replace(/^>\\s?/gm, '');\r\n const { text, classes, id } = extractAttributes(rawQuote);\r\n result.push({ type: 'blockquote', content: text, classes: classes || undefined, id });\r\n continue;\r\n }\r\n\r\n // ── Horizontal rule: --- or ___ or *** ──\r\n if (/^(---|___|(\\*\\s*){3,})\\s*$/.test(trimmed)) {\r\n result.push({ type: 'hr' });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── TOC: [TOC] or [TOC2] ──\r\n if (/^\\[TOC\\d?\\]\\s*$/.test(trimmed)) {\r\n result.push({ type: 'toc' });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Empty line ──\r\n if (trimmed === '') {\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── HTML Block: <tag ...> ──\r\n let tagStartMatch = trimmed.match(/^<([a-zA-Z][\\w-]*)/);\r\n if (tagStartMatch) {\r\n const tagName = tagStartMatch[1].toLowerCase();\r\n\r\n const voidElements = new Set([\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ]);\r\n\r\n const remainingText = lines.slice(i).join('\\n');\r\n\r\n // Find the full opening tag even with multi-line attributes\r\n const openTagRegex = new RegExp(`^\\\\s*<${tagName}\\\\b([^>]*?)>`, 'i');\r\n const openTagMatch = remainingText.match(openTagRegex);\r\n\r\n if (openTagMatch) {\r\n const fullOpenTag = openTagMatch[0];\r\n const attrs = openTagMatch[1].replace(/\\s+/g, ' ').trim();\r\n\r\n const isSelfClosing = fullOpenTag.endsWith('/>') || voidElements.has(tagName);\r\n\r\n if (isSelfClosing) {\r\n const blockText = remainingText.substring(0, openTagMatch.index! + fullOpenTag.length);\r\n const consumedLines = blockText.split('\\n').length;\r\n\r\n result.push({\r\n type: 'html-block',\r\n tag: tagName,\r\n attrs: attrs,\r\n children: [] // No children\r\n } as HtmlBlockToken);\r\n\r\n i += consumedLines;\r\n continue;\r\n } else {\r\n // Tag with content — search for its closing tag\r\n let nestedLevel = 0;\r\n let closeIndex = -1;\r\n let closeTagLength = 0;\r\n\r\n const tagRegex = new RegExp(`</?${tagName}\\\\b[^>]*>`, 'gi');\r\n tagRegex.lastIndex = openTagMatch.index! + fullOpenTag.length;\r\n\r\n let execMatch;\r\n while ((execMatch = tagRegex.exec(remainingText)) !== null) {\r\n if (execMatch[0].startsWith('</')) {\r\n nestedLevel--;\r\n if (nestedLevel < 0) {\r\n closeIndex = execMatch.index;\r\n closeTagLength = execMatch[0].length;\r\n break;\r\n }\r\n } else {\r\n if (!execMatch[0].endsWith('/>')) {\r\n nestedLevel++;\r\n }\r\n }\r\n }\r\n\r\n if (closeIndex !== -1) {\r\n const fullBlock = remainingText.substring(0, closeIndex + closeTagLength);\r\n const consumedLines = fullBlock.split('\\n').length;\r\n\r\n // style/script blocks should not be parsed as Markdown\r\n if (tagName === 'style' || tagName === 'script') {\r\n result.push({\r\n type: 'html',\r\n content: fullBlock,\r\n scopeId: generateScopeId(),\r\n });\r\n } else {\r\n const innerContent = remainingText.substring(openTagMatch.index! + fullOpenTag.length, closeIndex);\r\n result.push({\r\n type: 'html-block',\r\n tag: tagName,\r\n attrs: attrs,\r\n children: parseMarkdown(innerContent)\r\n } as HtmlBlockToken);\r\n }\r\n\r\n i += consumedLines;\r\n continue;\r\n } else {\r\n // Fallback: unclosed tag → treat as self-closing to avoid consuming the whole document\r\n const blockText = remainingText.substring(0, openTagMatch.index! + fullOpenTag.length);\r\n const consumedLines = blockText.split('\\n').length;\r\n\r\n result.push({\r\n type: 'html-block',\r\n tag: tagName,\r\n attrs: attrs,\r\n children: []\r\n } as HtmlBlockToken);\r\n\r\n i += consumedLines;\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ── Paragraph (default) ──\r\n const paragraphLines = [line];\r\n i++;\r\n while (i < lines.length) {\r\n const nextLine = lines[i];\r\n const nextTrimmed = nextLine.trim();\r\n if (\r\n nextTrimmed === '' ||\r\n nextTrimmed.startsWith('#') ||\r\n nextTrimmed.startsWith(':::') ||\r\n nextTrimmed.includes('|') ||\r\n nextTrimmed.match(/^(\\s*)([-*+]|\\d+\\.)\\s+/) ||\r\n nextTrimmed.startsWith('>') ||\r\n nextTrimmed.startsWith('```') ||\r\n nextTrimmed.startsWith('->') ||\r\n nextTrimmed.match(/^<([a-zA-Z][\\w-]*)\\b/)\r\n ) {\r\n break;\r\n }\r\n paragraphLines.push(nextLine);\r\n i++;\r\n }\r\n const rawParagraph = paragraphLines.join('\\n').trim();\r\n const { text, classes, id } = extractAttributes(rawParagraph);\r\n result.push({ type: 'paragraph', content: text, classes: classes || undefined, id });\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ─────────────────────────────────────────────\r\n// Slot splitting\r\n// ─────────────────────────────────────────────\r\n\r\n/**\r\n * Split directive content into named slots.\r\n * A line that is exactly `#slotname` starts a new slot.\r\n * Content before any `#slotname` goes into the \"default\" slot.\r\n *\r\n * IMPORTANT: This is nesting-aware — `#slotname` markers inside nested\r\n * directives (:::child ... :::) are NOT treated as slot boundaries of\r\n * the outer directive. Only `#slotname` at depth 0 are considered.\r\n */\r\nfunction splitSlots(rawContent: string): Record<string, string> {\r\n const slots: Record<string, string> = {};\r\n const lines = rawContent.split('\\n');\r\n let currentSlot = 'default';\r\n let buffer: string[] = [];\r\n let nestingDepth = 0;\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n\r\n // Track nesting of directives\r\n if (trimmed.startsWith(':::')) {\r\n const rest = trimmed.slice(3).trim();\r\n if (rest === '') {\r\n // Closing marker (bare :::)\r\n nestingDepth = Math.max(0, nestingDepth - 1);\r\n } else {\r\n nestingDepth++;\r\n }\r\n }\r\n\r\n // Only consider slot boundaries at depth 0\r\n if (nestingDepth === 0 && trimmed.match(/^#([\\w-]+)$/)) {\r\n // Save previous slot\r\n if (buffer.length > 0 || currentSlot !== 'default') {\r\n slots[currentSlot] = buffer.join('\\n').trim();\r\n }\r\n currentSlot = trimmed.slice(1);\r\n buffer = [];\r\n } else {\r\n buffer.push(line);\r\n }\r\n }\r\n\r\n // Save last slot\r\n slots[currentSlot] = buffer.join('\\n').trim();\r\n\r\n return slots;\r\n}\r\n","import hljs from 'highlight.js/lib/core';\r\n\r\nimport javascript from 'highlight.js/lib/languages/javascript';\r\nimport typescript from 'highlight.js/lib/languages/typescript';\r\nimport python from 'highlight.js/lib/languages/python';\r\nimport css from 'highlight.js/lib/languages/css';\r\nimport xml from 'highlight.js/lib/languages/xml';\r\nimport json from 'highlight.js/lib/languages/json';\r\nimport bash from 'highlight.js/lib/languages/bash';\r\nimport sql from 'highlight.js/lib/languages/sql';\r\nimport markdown from 'highlight.js/lib/languages/markdown';\r\nimport java from 'highlight.js/lib/languages/java';\r\nimport csharp from 'highlight.js/lib/languages/csharp';\r\nimport cpp from 'highlight.js/lib/languages/cpp';\r\nimport go from 'highlight.js/lib/languages/go';\r\nimport rust from 'highlight.js/lib/languages/rust';\r\nimport php from 'highlight.js/lib/languages/php';\r\nimport ruby from 'highlight.js/lib/languages/ruby';\r\nimport swift from 'highlight.js/lib/languages/swift';\r\nimport kotlin from 'highlight.js/lib/languages/kotlin';\r\nimport dart from 'highlight.js/lib/languages/dart';\r\nimport yaml from 'highlight.js/lib/languages/yaml';\r\nimport toml from 'highlight.js/lib/languages/ini';\r\nimport dockerfile from 'highlight.js/lib/languages/dockerfile';\r\nimport diff from 'highlight.js/lib/languages/diff';\r\nimport shell from 'highlight.js/lib/languages/shell';\r\n\r\nhljs.registerLanguage('javascript', javascript);\r\nhljs.registerLanguage('js', javascript);\r\nhljs.registerLanguage('jsx', javascript);\r\nhljs.registerLanguage('typescript', typescript);\r\nhljs.registerLanguage('ts', typescript);\r\nhljs.registerLanguage('tsx', typescript);\r\nhljs.registerLanguage('python', python);\r\nhljs.registerLanguage('py', python);\r\nhljs.registerLanguage('css', css);\r\nhljs.registerLanguage('html', xml);\r\nhljs.registerLanguage('xml', xml);\r\nhljs.registerLanguage('svg', xml);\r\nhljs.registerLanguage('json', json);\r\nhljs.registerLanguage('bash', bash);\r\nhljs.registerLanguage('sh', bash);\r\nhljs.registerLanguage('zsh', bash);\r\nhljs.registerLanguage('sql', sql);\r\nhljs.registerLanguage('markdown', markdown);\r\nhljs.registerLanguage('md', markdown);\r\nhljs.registerLanguage('java', java);\r\nhljs.registerLanguage('csharp', csharp);\r\nhljs.registerLanguage('cs', csharp);\r\nhljs.registerLanguage('cpp', cpp);\r\nhljs.registerLanguage('go', go);\r\nhljs.registerLanguage('rust', rust);\r\nhljs.registerLanguage('php', php);\r\nhljs.registerLanguage('ruby', ruby);\r\nhljs.registerLanguage('swift', swift);\r\nhljs.registerLanguage('kotlin', kotlin);\r\nhljs.registerLanguage('dart', dart);\r\nhljs.registerLanguage('yaml', yaml);\r\nhljs.registerLanguage('toml', toml);\r\nhljs.registerLanguage('dockerfile', dockerfile);\r\nhljs.registerLanguage('diff', diff);\r\nhljs.registerLanguage('shell', shell);\r\n\r\nexport default hljs;\r\n","// ============================================================\r\n// Vanilla UI Component Factories\r\n//\r\n// Each function returns a native HTMLElement. No React, no Tailwind.\r\n// Styling comes from vanilla.css via class names.\r\n// ============================================================\r\n\r\nimport hljs from './highlightSetup';\r\n\r\n// ── Icon ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Create a Material Icons Round icon element.\r\n */\r\nexport function createIcon(iconName: string, extraClasses?: string): HTMLElement {\r\n const span = document.createElement('span');\r\n const cls = `nr-icon material-icons-round${extraClasses ? ` ${extraClasses}` : ''}`;\r\n span.className = cls;\r\n span.setAttribute('aria-hidden', 'true');\r\n\r\n const isCodepoint = /^[eE][0-9a-fA-F]{3,4}$/.test(iconName);\r\n if (isCodepoint) {\r\n span.innerHTML = `&#x${iconName};`;\r\n } else {\r\n span.textContent = iconName;\r\n }\r\n return span;\r\n}\r\n\r\n// ── CodeBlock ─────────────────────────────────────────────\r\n\r\n/**\r\n * Create a syntax-highlighted code block with copy button.\r\n */\r\nexport function createCodeBlock(code: string, language: string, title?: string): HTMLElement {\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-codeblock';\r\n\r\n const lang = language?.split(/[\\s{]/)[0]?.trim() || '';\r\n\r\n // Title bar\r\n if (title) {\r\n const header = document.createElement('div');\r\n header.className = 'nr-codeblock__header';\r\n header.appendChild(createIcon('description'));\r\n const titleSpan = document.createElement('span');\r\n titleSpan.textContent = title;\r\n header.appendChild(titleSpan);\r\n wrapper.appendChild(header);\r\n }\r\n\r\n // Code area\r\n const pre = document.createElement('pre');\r\n pre.className = 'nr-codeblock__pre';\r\n const codeEl = document.createElement('code');\r\n codeEl.className = `language-${lang || 'plaintext'}`;\r\n\r\n try {\r\n if (lang && hljs.getLanguage(lang)) {\r\n codeEl.innerHTML = hljs.highlight(code, { language: lang }).value;\r\n } else {\r\n codeEl.innerHTML = hljs.highlightAuto(code).value;\r\n }\r\n } catch {\r\n codeEl.textContent = code;\r\n }\r\n\r\n pre.appendChild(codeEl);\r\n wrapper.appendChild(pre);\r\n\r\n // Copy button\r\n const copyBtn = document.createElement('button');\r\n copyBtn.className = 'nr-codeblock__copy';\r\n copyBtn.title = 'Copy code';\r\n const copyIcon = createIcon('content_copy');\r\n copyIcon.style.fontSize = '1rem';\r\n copyBtn.appendChild(copyIcon);\r\n\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n copyBtn.addEventListener('click', () => {\r\n navigator.clipboard.writeText(code);\r\n copyIcon.textContent = 'check';\r\n if (timer) clearTimeout(timer);\r\n timer = setTimeout(() => { copyIcon.textContent = 'content_copy'; }, 1800);\r\n });\r\n\r\n wrapper.appendChild(copyBtn);\r\n return wrapper;\r\n}\r\n\r\n// ── Admonition ────────────────────────────────────────────\r\n\r\nconst DEFAULT_ADMONITION_ICONS: Record<string, string> = {\r\n note: 'info',\r\n info: 'lightbulb',\r\n warning: 'warning',\r\n danger: 'report',\r\n greentext: 'subdirectory_arrow_right',\r\n};\r\n\r\n/**\r\n * Create an admonition (alert) box.\r\n * Content should be appended by the caller.\r\n */\r\nexport function createAdmonition(\r\n type: string,\r\n title?: string,\r\n icon?: string,\r\n): HTMLElement {\r\n const el = document.createElement('div');\r\n el.className = `nr-admonition nr-admonition--${type || 'note'}`;\r\n\r\n if (title) {\r\n const header = document.createElement('h5');\r\n header.className = 'nr-admonition__title';\r\n const iconToRender = icon || DEFAULT_ADMONITION_ICONS[type] || 'info';\r\n header.appendChild(createIcon(iconToRender, 'nr-admonition__icon'));\r\n const titleSpan = document.createElement('span');\r\n titleSpan.textContent = title;\r\n header.appendChild(titleSpan);\r\n el.appendChild(header);\r\n }\r\n\r\n const body = document.createElement('div');\r\n body.className = 'nr-admonition__body';\r\n el.appendChild(body);\r\n\r\n return el;\r\n}\r\n\r\n// ── Details (Collapsible) ─────────────────────────────────\r\n\r\n/**\r\n * Create a native <details> collapsible section.\r\n * Content should be appended to the body div.\r\n */\r\nexport function createDetails(\r\n title: string,\r\n icon?: string,\r\n defaultOpen?: boolean,\r\n): HTMLElement {\r\n const details = document.createElement('details');\r\n details.className = 'nr-details';\r\n if (defaultOpen) details.open = true;\r\n\r\n const summary = document.createElement('summary');\r\n summary.className = 'nr-details__summary';\r\n\r\n const iconToRender = icon || 'play_arrow';\r\n const iconEl = createIcon(iconToRender, 'nr-details__icon');\r\n summary.appendChild(iconEl);\r\n\r\n const titleSpan = document.createElement('span');\r\n titleSpan.textContent = title || 'Details';\r\n summary.appendChild(titleSpan);\r\n\r\n // Rotate icon on toggle\r\n details.addEventListener('toggle', () => {\r\n iconEl.classList.toggle('nr-details__icon--open', details.open);\r\n });\r\n\r\n details.appendChild(summary);\r\n\r\n const body = document.createElement('div');\r\n body.className = 'nr-details__body';\r\n details.appendChild(body);\r\n\r\n return details;\r\n}\r\n\r\n// ── Modal (Native <dialog>) ───────────────────────────────\r\n\r\n/**\r\n * Create a native <dialog> modal.\r\n * Content should be appended to the body div.\r\n */\r\nexport function createModal(title: string): HTMLDialogElement {\r\n const dialog = document.createElement('dialog');\r\n dialog.className = 'nr-modal';\r\n\r\n // Backdrop click to close\r\n dialog.addEventListener('click', (e) => {\r\n if (e.target === dialog) {\r\n dialog.close();\r\n }\r\n });\r\n\r\n const popup = document.createElement('div');\r\n popup.className = 'nr-modal__popup';\r\n\r\n // Header\r\n const header = document.createElement('div');\r\n header.className = 'nr-modal__header';\r\n\r\n const titleEl = document.createElement('h2');\r\n titleEl.className = 'nr-modal__title';\r\n titleEl.textContent = title;\r\n header.appendChild(titleEl);\r\n\r\n const closeBtn = document.createElement('button');\r\n closeBtn.className = 'nr-modal__close';\r\n closeBtn.appendChild(createIcon('close'));\r\n closeBtn.addEventListener('click', () => dialog.close());\r\n header.appendChild(closeBtn);\r\n\r\n popup.appendChild(header);\r\n\r\n // Body\r\n const body = document.createElement('div');\r\n body.className = 'nr-modal__body';\r\n popup.appendChild(body);\r\n\r\n dialog.appendChild(popup);\r\n return dialog;\r\n}\r\n\r\n// ── Table ─────────────────────────────────────────────────\r\n\r\n/**\r\n * Render a pipe-delimited markdown table into an HTML table element.\r\n * Returns the outer wrapper div.\r\n */\r\nexport function createTable(\r\n content: string,\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const rows = content.split('\\n').filter(r => r.trim());\r\n if (rows.length < 2) {\r\n const p = document.createElement('p');\r\n p.textContent = content;\r\n return p;\r\n }\r\n\r\n const parseRow = (row: string) =>\r\n row.split('|').map(c => c.trim()).filter(Boolean);\r\n\r\n const headerCells = parseRow(rows[0]);\r\n const bodyRows = rows.slice(2).map(parseRow);\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-table-wrap';\r\n\r\n const table = document.createElement('table');\r\n table.className = 'nr-table';\r\n\r\n // Thead\r\n const thead = document.createElement('thead');\r\n const tr = document.createElement('tr');\r\n for (const cell of headerCells) {\r\n const th = document.createElement('th');\r\n th.className = 'nr-table__th';\r\n th.appendChild(renderInline(cell));\r\n tr.appendChild(th);\r\n }\r\n thead.appendChild(tr);\r\n table.appendChild(thead);\r\n\r\n // Tbody\r\n const tbody = document.createElement('tbody');\r\n for (const cells of bodyRows) {\r\n const tr = document.createElement('tr');\r\n for (const cell of cells) {\r\n const td = document.createElement('td');\r\n td.className = 'nr-table__td';\r\n td.appendChild(renderInline(cell));\r\n tr.appendChild(td);\r\n }\r\n tbody.appendChild(tr);\r\n }\r\n table.appendChild(tbody);\r\n wrapper.appendChild(table);\r\n\r\n return wrapper;\r\n}\r\n\r\n// ── List ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Render a markdown list (ordered or unordered) into HTML.\r\n */\r\nexport function createList(\r\n content: string,\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const lines = content.split('\\n');\r\n const items: { indent: number; marker: string; text: string }[] = [];\r\n\r\n for (const line of lines) {\r\n if (!line.trim()) continue;\r\n const match = line.match(/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/);\r\n if (match) {\r\n items.push({ indent: match[1].length, marker: match[2], text: match[3] });\r\n }\r\n }\r\n\r\n if (items.length === 0) {\r\n const p = document.createElement('p');\r\n p.textContent = content;\r\n return p;\r\n }\r\n\r\n const isOrdered = /^\\d+\\.$/.test(items[0].marker);\r\n const list = document.createElement(isOrdered ? 'ol' : 'ul');\r\n list.className = 'nr-list';\r\n\r\n for (const item of items) {\r\n const li = document.createElement('li');\r\n li.className = 'nr-list__item';\r\n li.appendChild(renderInline(item.text));\r\n list.appendChild(li);\r\n }\r\n\r\n return list;\r\n}\r\n\r\n// ── TOC (Table of Contents) ───────────────────────────────\r\n\r\ninterface TocHeader {\r\n level: number;\r\n text: string;\r\n id: string;\r\n}\r\n\r\n/**\r\n * Create a table of contents from an array of headers.\r\n */\r\nexport function createTOC(\r\n headers: TocHeader[],\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const nav = document.createElement('nav');\r\n nav.className = 'nr-toc';\r\n\r\n const title = document.createElement('div');\r\n title.className = 'nr-toc__title';\r\n title.textContent = 'Table of Contents';\r\n nav.appendChild(title);\r\n\r\n const ul = document.createElement('ul');\r\n ul.className = 'nr-toc__list';\r\n\r\n for (const h of headers) {\r\n const li = document.createElement('li');\r\n li.className = `nr-toc__item nr-toc__item--h${h.level}`;\r\n\r\n const a = document.createElement('a');\r\n a.className = 'nr-toc__link';\r\n a.href = `#${h.id}`;\r\n a.appendChild(renderInline(h.text.replace(/->|<-/g, '').trim()));\r\n a.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n const target = document.getElementById(h.id);\r\n if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n });\r\n\r\n li.appendChild(a);\r\n ul.appendChild(li);\r\n }\r\n\r\n nav.appendChild(ul);\r\n return nav;\r\n}\r\n\r\n// ── Blockquote ────────────────────────────────────────────\r\n\r\n/**\r\n * Create a blockquote element.\r\n */\r\nexport function createBlockquote(\r\n content: string,\r\n classes: string | undefined,\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const el = document.createElement('blockquote');\r\n el.className = `nr-blockquote${classes ? ` ${classes}` : ''}`;\r\n el.appendChild(renderInline(content));\r\n return el;\r\n}\r\n","// ============================================================\r\n// Vanilla Inline Renderer\r\n//\r\n// Parses inline markdown formatting into DOM nodes.\r\n// Returns a DocumentFragment.\r\n// ============================================================\r\n\r\nimport { createIcon } from './components';\r\n\r\n/**\r\n * Render inline markdown text into a DocumentFragment.\r\n *\r\n * Supports: bold, italic, bold-italic, strikethrough, code, highlight,\r\n * spoiler, color text, underline, icons, links, raw HTML tags.\r\n */\r\nexport function renderInline(text: string): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n if (!text) return fragment;\r\n\r\n const regex =\r\n /(\\|\\[[^\\]]+\\]\\||\\*\\*\\*.+?\\*\\*\\*|\\*\\*.+?\\*\\*|_.+?_|~~.+?~~|`[^`]+?`|!~.+?~!|%[^%\\s]+?%[\\s\\S]+?%%|!>.+?<!|==.+?==|\\[[^\\]]+?\\]\\([^)]+?\\)|<[^>]+>)/g;\r\n\r\n let lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n\r\n while ((match = regex.exec(text)) !== null) {\r\n // Append text before this match\r\n if (match.index > lastIndex) {\r\n fragment.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));\r\n }\r\n\r\n fragment.appendChild(parseInlinePart(match[0]));\r\n lastIndex = regex.lastIndex;\r\n }\r\n\r\n // Append remaining text\r\n if (lastIndex < text.length) {\r\n fragment.appendChild(document.createTextNode(text.slice(lastIndex)));\r\n }\r\n\r\n return fragment;\r\n}\r\n\r\n/**\r\n * Parse a single inline markdown token into a DOM node.\r\n */\r\nfunction parseInlinePart(part: string): Node {\r\n let match: RegExpMatchArray | null;\r\n\r\n // Icon: |[[icon-name]]|\r\n if ((match = part.match(/^\\|\\[([^\\]]+)\\]\\|$/))) {\r\n return createIcon(match[1]);\r\n }\r\n\r\n // Underline: !~content~! (supports params: !~color;style;type;text~!)\r\n if ((match = part.match(/^!~(.+?)~!$/))) {\r\n const content = match[1];\r\n const parts = content.split(';');\r\n let color = 'currentColor';\r\n let decorationStyle = 'solid';\r\n let type = 'underline';\r\n let textIndex = 0;\r\n\r\n if (\r\n parts[textIndex]?.match(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/) ||\r\n ['red', 'blue', 'green', 'purple', 'orange', 'yellow', 'pink'].includes(parts[textIndex])\r\n ) {\r\n color = parts[textIndex++];\r\n }\r\n if (['solid', 'double', 'dotted', 'dashed', 'wavy'].includes(parts[textIndex])) {\r\n decorationStyle = parts[textIndex++];\r\n }\r\n if (['underline', 'line-through', 'overline', 'both'].includes(parts[textIndex])) {\r\n type = parts[textIndex] === 'both' ? 'underline line-through' : parts[textIndex++];\r\n }\r\n const innerText = parts.slice(textIndex).join(';');\r\n\r\n const span = document.createElement('span');\r\n span.className = 'nr-underline';\r\n span.style.textDecoration = `${type} ${decorationStyle} ${color}`;\r\n span.style.textDecorationThickness = 'auto';\r\n span.appendChild(renderInline(innerText));\r\n return span;\r\n }\r\n\r\n // Color text: %color%text%%\r\n if ((match = part.match(/%([^%\\s]+?)%([\\s\\S]+?)%%/))) {\r\n const span = document.createElement('span');\r\n span.style.color = match[1];\r\n span.appendChild(renderInline(match[2]));\r\n return span;\r\n }\r\n\r\n // Spoiler: !>text<!\r\n if ((match = part.match(/^!>([^<]+?)<!$/))) {\r\n const span = document.createElement('span');\r\n span.className = 'nr-spoiler';\r\n span.appendChild(renderInline(match[1]));\r\n return span;\r\n }\r\n\r\n // Highlight: ==text==\r\n if ((match = part.match(/^==(.+?)==$/))) {\r\n const mark = document.createElement('mark');\r\n mark.className = 'nr-highlight';\r\n mark.appendChild(renderInline(match[1]));\r\n return mark;\r\n }\r\n\r\n // Bold-italic: ***text***\r\n if ((match = part.match(/^\\*\\*\\*(.+?)\\*\\*\\*$/))) {\r\n const strong = document.createElement('strong');\r\n const em = document.createElement('em');\r\n em.appendChild(renderInline(match[1]));\r\n strong.appendChild(em);\r\n return strong;\r\n }\r\n\r\n // Bold: **text**\r\n if ((match = part.match(/^\\*\\*(.+?)\\*\\*$/))) {\r\n const strong = document.createElement('strong');\r\n strong.appendChild(renderInline(match[1]));\r\n return strong;\r\n }\r\n\r\n // Italic: _text_\r\n if ((match = part.match(/^_(.+?)_$/))) {\r\n const em = document.createElement('em');\r\n em.appendChild(renderInline(match[1]));\r\n return em;\r\n }\r\n\r\n // Strikethrough: ~~text~~\r\n if ((match = part.match(/^~~(.+?)~~$/))) {\r\n const del = document.createElement('del');\r\n del.appendChild(renderInline(match[1]));\r\n return del;\r\n }\r\n\r\n // Inline code: `code`\r\n if ((match = part.match(/^`([^`]+)`$/))) {\r\n const code = document.createElement('code');\r\n code.className = 'nr-inline-code';\r\n code.textContent = match[1];\r\n return code;\r\n }\r\n\r\n // Link: [text](url)\r\n if ((match = part.match(/^\\[([^\\]]+?)\\]\\(([^)]+?)\\)$/))) {\r\n const a = document.createElement('a');\r\n a.className = 'nr-link';\r\n a.href = match[2];\r\n a.target = '_blank';\r\n a.rel = 'noopener noreferrer';\r\n a.appendChild(renderInline(match[1]));\r\n return a;\r\n }\r\n\r\n // Raw HTML tag: <tag>...</tag>\r\n if (part.startsWith('<') && part.endsWith('>')) {\r\n const span = document.createElement('span');\r\n span.innerHTML = part;\r\n return span;\r\n }\r\n\r\n // Fallback: plain text\r\n return document.createTextNode(part);\r\n}\r\n","// ============================================================\r\n// Admonition Directive (vanilla)\r\n// ============================================================\r\n\r\nimport type { DirectiveRendererFn } from './index';\r\nimport { createAdmonition } from '../components';\r\n\r\nconst admonitionDirective: DirectiveRendererFn = ({ directiveType, props, renderSlot }) => {\r\n const el = createAdmonition(directiveType, props.title, props.icon);\r\n\r\n if (props.class) el.classList.add(...props.class.split(/\\s+/).filter(Boolean));\r\n if (props.style) el.setAttribute('style', props.style);\r\n\r\n // Append default slot content into the body\r\n const body = el.querySelector('.nr-admonition__body');\r\n if (body) {\r\n body.appendChild(renderSlot('default'));\r\n }\r\n\r\n return el;\r\n};\r\n\r\nexport default admonitionDirective;\r\n","// ============================================================\r\n// Details Directive (vanilla)\r\n// ============================================================\r\n\r\nimport type { DirectiveRendererFn } from './index';\r\nimport { createDetails } from '../components';\r\n\r\nconst detailsDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\r\n const el = createDetails(\r\n props.title || 'Details',\r\n props.icon,\r\n props.defaultOpen === 'true',\r\n );\r\n\r\n if (props.class) el.classList.add(...props.class.split(/\\s+/).filter(Boolean));\r\n if (props.style) el.setAttribute('style', props.style);\r\n\r\n // Append default slot into the body\r\n const body = el.querySelector('.nr-details__body');\r\n if (body) {\r\n body.appendChild(renderSlot('default'));\r\n }\r\n\r\n return el;\r\n};\r\n\r\nexport default detailsDirective;\r\n","// ============================================================\r\n// Modal Directive (vanilla)\r\n// ============================================================\r\n\r\nimport type { DirectiveRendererFn } from './index';\r\nimport { createIcon, createModal } from '../components';\r\n\r\nconst modalDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\r\n const label = props.label || props.title || 'Open';\r\n const modalTitle = props.title || 'Modal';\r\n const customClass = props.class || '';\r\n\r\n // Wrapper\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-modal-trigger';\r\n\r\n // Button to open modal\r\n const btn = document.createElement('button');\r\n btn.className = `nr-button nr-button--default`;\r\n if (customClass) btn.classList.add(...customClass.split(/\\s+/).filter(Boolean));\r\n\r\n const icon = props.icon || 'open_in_new';\r\n if (icon) btn.appendChild(createIcon(icon));\r\n btn.appendChild(document.createTextNode(label));\r\n\r\n // Create the native dialog\r\n const dialog = createModal(modalTitle);\r\n const body = dialog.querySelector('.nr-modal__body');\r\n if (body) {\r\n body.appendChild(renderSlot('default'));\r\n }\r\n\r\n btn.addEventListener('click', () => {\r\n if (!dialog.open) {\r\n document.body.appendChild(dialog); // append to body for proper layering\r\n dialog.showModal();\r\n dialog.addEventListener('close', () => {\r\n dialog.remove();\r\n }, { once: true });\r\n }\r\n });\r\n\r\n wrapper.appendChild(btn);\r\n wrapper.appendChild(dialog);\r\n\r\n return wrapper;\r\n};\r\n\r\nexport default modalDirective;\r\n","// ============================================================\r\n// Button Directive (vanilla)\r\n// ============================================================\r\n\r\nimport type { DirectiveRendererFn } from './index';\r\nimport { createIcon } from '../components';\r\n\r\nconst buttonDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\r\n const url = props.url || props.href || '#';\r\n const label = props.label;\r\n const icon = props.icon || 'near_me';\r\n const target = props.target || '_blank';\r\n const customClass = props.class || '';\r\n\r\n // Wrapper\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-button-wrap';\r\n\r\n // If label is provided, use it directly\r\n if (label) {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.target = target;\r\n a.rel = 'noopener noreferrer';\r\n a.className = 'nr-button nr-button--default';\r\n if (customClass) a.classList.add(...customClass.split(/\\s+/).filter(Boolean));\r\n a.appendChild(createIcon(icon));\r\n a.appendChild(document.createTextNode(label));\r\n wrapper.appendChild(a);\r\n return wrapper;\r\n }\r\n\r\n // Otherwise render slot content\r\n const slotContent = renderSlot('default');\r\n\r\n // Check if slot contains <a> links — wrap each in a button style\r\n const links = slotContent.querySelectorAll('a');\r\n if (links.length > 0) {\r\n links.forEach(link => {\r\n link.classList.add('nr-button', 'nr-button--default');\r\n if (customClass) link.classList.add(...customClass.split(/\\s+/).filter(Boolean));\r\n });\r\n wrapper.appendChild(slotContent);\r\n } else {\r\n // Fallback: wrap in an <a> tag\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.target = target;\r\n a.rel = 'noopener noreferrer';\r\n a.className = 'nr-button nr-button--default';\r\n if (customClass) a.classList.add(...customClass.split(/\\s+/).filter(Boolean));\r\n a.appendChild(createIcon(icon));\r\n a.appendChild(slotContent);\r\n wrapper.appendChild(a);\r\n }\r\n\r\n return wrapper;\r\n};\r\n\r\nexport default buttonDirective;\r\n","// ============================================================\r\n// Card Directive (vanilla)\r\n// ============================================================\r\n\r\nimport type { DirectiveRendererFn } from './index';\r\nimport { createIcon, createModal } from '../components';\r\nimport { parseCssString } from '../../core/utils';\r\n\r\nconst cardDirective: DirectiveRendererFn = ({\r\n directiveType,\r\n props,\r\n slots,\r\n renderSlot,\r\n options,\r\n}) => {\r\n const { title, image, icon, url, target } = props;\r\n const customClass = props.class || '';\r\n const hasDescription = !!slots.description;\r\n const { isSingleCard } = (options || {}) as { isSingleCard?: boolean };\r\n\r\n const isModal = directiveType === 'card-m';\r\n const isLink = directiveType === 'card-b';\r\n\r\n const inlineStyles = props.style ? parseCssString(props.style) : {};\r\n\r\n const card = document.createElement('div');\r\n card.className = `nr-card${isModal || isLink ? ' nr-card--interactive' : ''} ${customClass}`.trim();\r\n\r\n // Apply inline styles\r\n for (const [key, value] of Object.entries(inlineStyles)) {\r\n card.style.setProperty(key, String(value));\r\n }\r\n\r\n // Image banner\r\n if (image) {\r\n const imgWrap = document.createElement('div');\r\n imgWrap.className = `nr-card__image${isSingleCard ? ' nr-card__image--tall' : ''}`;\r\n const img = document.createElement('img');\r\n img.src = image;\r\n img.alt = title || '';\r\n img.className = 'nr-card__img';\r\n imgWrap.appendChild(img);\r\n const gradient = document.createElement('div');\r\n gradient.className = 'nr-card__gradient';\r\n imgWrap.appendChild(gradient);\r\n card.appendChild(imgWrap);\r\n }\r\n\r\n // Content body\r\n const body = document.createElement('div');\r\n body.className = `nr-card__body${image ? ' nr-card__body--overlap' : ''}`;\r\n\r\n // Header: Icon + Title\r\n if (icon || title) {\r\n const header = document.createElement('div');\r\n header.className = 'nr-card__header';\r\n if (icon) {\r\n const iconWrap = document.createElement('div');\r\n iconWrap.className = 'nr-card__icon-wrap';\r\n iconWrap.appendChild(createIcon(icon));\r\n header.appendChild(iconWrap);\r\n }\r\n if (title) {\r\n const h3 = document.createElement('h3');\r\n h3.className = 'nr-card__title';\r\n h3.textContent = title;\r\n header.appendChild(h3);\r\n }\r\n body.appendChild(header);\r\n }\r\n\r\n // Description\r\n if (hasDescription) {\r\n const desc = document.createElement('div');\r\n desc.className = 'nr-card__description';\r\n desc.appendChild(renderSlot('description'));\r\n body.appendChild(desc);\r\n }\r\n\r\n // Content (for card type)\r\n if (directiveType === 'card') {\r\n const contentSlot = renderSlot('content') || renderSlot('default');\r\n if (contentSlot.childNodes.length > 0) {\r\n const contentDiv = document.createElement('div');\r\n contentDiv.className = 'nr-card__content';\r\n contentDiv.appendChild(contentSlot);\r\n body.appendChild(contentDiv);\r\n }\r\n }\r\n\r\n // Action link for card-m / card-b\r\n if (isModal || isLink) {\r\n const action = document.createElement('div');\r\n action.className = 'nr-card__action';\r\n\r\n if (isLink && url) {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.target = target || '_blank';\r\n a.rel = 'noopener noreferrer';\r\n a.className = 'nr-card__action-link';\r\n a.appendChild(createIcon('open_in_new'));\r\n a.appendChild(document.createTextNode(' Link'));\r\n action.appendChild(a);\r\n } else if (isModal) {\r\n const modalBtn = document.createElement('div');\r\n modalBtn.className = 'nr-card__action-link';\r\n modalBtn.appendChild(createIcon('arrow_forward'));\r\n modalBtn.appendChild(document.createTextNode(' Abrir'));\r\n action.appendChild(modalBtn);\r\n }\r\n\r\n body.appendChild(action);\r\n }\r\n\r\n card.appendChild(body);\r\n\r\n // For card-m: attach modal\r\n if (isModal) {\r\n const dialog = createModal(title || 'Detalles');\r\n const modalBody = dialog.querySelector('.nr-modal__body');\r\n if (modalBody) {\r\n const contentSlot = renderSlot('content') || renderSlot('default');\r\n modalBody.appendChild(contentSlot);\r\n }\r\n\r\n card.addEventListener('click', () => {\r\n if (!dialog.open) {\r\n document.body.appendChild(dialog);\r\n dialog.showModal();\r\n dialog.addEventListener('close', () => dialog.remove(), { once: true });\r\n }\r\n });\r\n\r\n // Return fragment with card + dialog\r\n const frag = document.createDocumentFragment();\r\n frag.appendChild(card);\r\n frag.appendChild(dialog);\r\n return frag;\r\n }\r\n\r\n // For card-b: click opens URL\r\n if (isLink && url) {\r\n card.addEventListener('click', () => window.open(url, target || '_blank'));\r\n }\r\n\r\n return card;\r\n};\r\n\r\nexport default cardDirective;\r\n","// ============================================================\r\n// Wrapper Directive (vanilla)\r\n//\r\n// Generic layout wrapper for: div, style, custom, raw\r\n// ============================================================\r\n\r\nimport type { DirectiveRendererFn } from './index';\r\nimport { parseCssString } from '../../core/utils';\r\n\r\nconst wrapperDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\r\n const el = document.createElement('div');\r\n el.className = 'nr-wrapper';\r\n\r\n if (props.class) el.classList.add(...props.class.split(/\\s+/).filter(Boolean));\r\n if (props.id) el.id = props.id;\r\n\r\n // Inline styles\r\n if (props.style) {\r\n const styles = parseCssString(props.style);\r\n for (const [key, value] of Object.entries(styles)) {\r\n el.style.setProperty(key, String(value));\r\n }\r\n }\r\n\r\n // data-* attributes\r\n for (const [key, value] of Object.entries(props)) {\r\n if (key.startsWith('data-')) {\r\n el.setAttribute(key, value);\r\n }\r\n }\r\n\r\n el.appendChild(renderSlot('default'));\r\n return el;\r\n};\r\n\r\nexport default wrapperDirective;\r\n","// ============================================================\r\n// Slide Directive (vanilla)\r\n//\r\n// Single-line text carousel with CSS-driven slide-up rotation.\r\n// ============================================================\r\n\r\nimport type { DirectiveRendererFn } from './index';\r\nimport { parseCssString } from '../../core/utils';\r\n\r\nlet slideCounter = 0;\r\n\r\nconst slideDirective: DirectiveRendererFn = ({\r\n props,\r\n slots,\r\n renderInline,\r\n renderMarkdown,\r\n}) => {\r\n const rawContent = slots.default || '';\r\n const lines = rawContent\r\n .split('\\n')\r\n .map(l => l.trim())\r\n .filter(Boolean);\r\n\r\n if (lines.length === 0) {\r\n return document.createDocumentFragment();\r\n }\r\n\r\n const interval = parseInt(props.interval || '3000', 10);\r\n const speed = parseInt(props.speed || '500', 10);\r\n const rawClass = props.class || '';\r\n const inlineStyle = props.style ? parseCssString(props.style) : {};\r\n\r\n const scopeClass = `sld-${++slideCounter}`;\r\n\r\n // Container\r\n const container = document.createElement('div');\r\n container.className = 'nr-slide';\r\n Object.assign(container.style, {\r\n position: 'relative',\r\n overflow: 'hidden',\r\n ...inlineStyle,\r\n });\r\n\r\n // Inner track (holds all slides, animated via translateY)\r\n const track = document.createElement('div');\r\n track.className = 'nr-slide__track';\r\n track.style.transition = `transform ${speed}ms cubic-bezier(0.16, 1, 0.3, 1)`;\r\n\r\n // Create slide elements\r\n const slideEls: HTMLElement[] = [];\r\n for (const line of lines) {\r\n const slideEl = document.createElement('div');\r\n slideEl.className = `nr-slide__item ${scopeClass} ${rawClass}`.trim();\r\n slideEl.style.display = 'flex';\r\n slideEl.style.alignItems = 'center';\r\n\r\n // Parse each line as markdown\r\n if (renderMarkdown) {\r\n const tokens = renderMarkdown(line);\r\n slideEl.appendChild(tokens);\r\n } else if (renderInline) {\r\n slideEl.appendChild(renderInline(line));\r\n }\r\n\r\n track.appendChild(slideEl);\r\n slideEls.push(slideEl);\r\n }\r\n\r\n container.appendChild(track);\r\n\r\n // Measure and animate\r\n let current = 0;\r\n let maxH = 0;\r\n\r\n const measureAndSetHeight = () => {\r\n maxH = 0;\r\n for (const el of slideEls) {\r\n maxH = Math.max(maxH, el.offsetHeight);\r\n }\r\n if (maxH > 0) {\r\n container.style.height = `${maxH}px`;\r\n for (const el of slideEls) {\r\n el.style.height = `${maxH}px`;\r\n }\r\n }\r\n };\r\n\r\n // Initial measurement after DOM attach\r\n requestAnimationFrame(() => {\r\n measureAndSetHeight();\r\n // Re-measure after fonts load\r\n if (document.fonts?.ready) {\r\n document.fonts.ready.then(measureAndSetHeight);\r\n }\r\n });\r\n\r\n // Rotation\r\n if (lines.length > 1) {\r\n setInterval(() => {\r\n current = (current + 1) % lines.length;\r\n track.style.transform = `translateY(${-current * maxH}px)`;\r\n }, interval);\r\n }\r\n\r\n return container;\r\n};\r\n\r\nexport default slideDirective;\r\n","// ============================================================\r\n// Vanilla Directive Registry\r\n//\r\n// Maps directive type strings to vanilla renderer functions.\r\n// ============================================================\r\n\r\nimport type { Token } from '../../core/types';\r\n\r\n// ── Context passed to directive renderers ──\r\n\r\nexport interface VanillaRenderContext {\r\n /** Parse markdown string into tokens */\r\n parseMarkdown: (md: string) => Token[];\r\n /** Render tokens into an HTMLElement */\r\n renderElements: (tokens: Token[]) => HTMLElement;\r\n /** Render inline text into a DocumentFragment */\r\n renderInline: (text: string) => DocumentFragment;\r\n /** Parse markdown string and render into an HTMLElement */\r\n renderMarkdown: (md: string) => HTMLElement;\r\n}\r\n\r\nexport interface DirectiveProps {\r\n /** The directive type string */\r\n directiveType: string;\r\n /** Parsed key=\"value\" attributes */\r\n props: Record<string, string>;\r\n /** Named slots → raw content strings */\r\n slots: Record<string, string>;\r\n /** Render a named slot as parsed markdown */\r\n renderSlot: (name: string) => DocumentFragment;\r\n /** Render context */\r\n context: VanillaRenderContext;\r\n /** Position index */\r\n index: number;\r\n /** Full parsed AST */\r\n allElements: Token[];\r\n /** Extra flags */\r\n options?: Record<string, any>;\r\n /** Inline renderer shortcut */\r\n renderInline: (text: string) => DocumentFragment;\r\n /** Full markdown renderer shortcut (for complex directives like slide) */\r\n renderMarkdown?: (md: string) => HTMLElement;\r\n}\r\n\r\nexport type DirectiveRendererFn = (props: DirectiveProps) => HTMLElement | DocumentFragment;\r\n\r\n// ── Import directive implementations ──\r\n\r\nimport admonitionDirective from './admonition';\r\nimport detailsDirective from './details';\r\nimport modalDirective from './modal';\r\nimport buttonDirective from './button';\r\nimport cardDirective from './card';\r\nimport wrapperDirective from './wrapper';\r\nimport slideDirective from './slide';\r\n\r\n// ── Registry ──\r\n\r\nconst directiveRegistry: Record<string, DirectiveRendererFn> = {\r\n // Admonitions\r\n note: admonitionDirective,\r\n info: admonitionDirective,\r\n warning: admonitionDirective,\r\n danger: admonitionDirective,\r\n greentext: admonitionDirective,\r\n // Cards\r\n card: cardDirective,\r\n 'card-m': cardDirective,\r\n 'card-b': cardDirective,\r\n // Interactive\r\n details: detailsDirective,\r\n modal: modalDirective,\r\n button: buttonDirective,\r\n // Layout / generic wrappers\r\n div: wrapperDirective,\r\n style: wrapperDirective,\r\n custom: wrapperDirective,\r\n raw: wrapperDirective,\r\n // Animation\r\n slide: slideDirective,\r\n};\r\n\r\nexport default directiveRegistry;\r\n","// ============================================================\r\n// Vanilla Markdown Renderer\r\n//\r\n// Pipeline: Token[] → processElements() → HTMLElement\r\n// No React, no Tailwind. Pure DOM + CSS classes.\r\n// ============================================================\r\n\r\nimport type { Token, DirectiveToken, HtmlBlockToken, HtmlToken } from '../core/types';\r\nimport { parseMarkdown } from '../core/parser';\r\nimport { scrollToId, parseHtmlAttrs } from '../core/utils';\r\nimport { renderInline } from './inline';\r\nimport {\r\n createCodeBlock,\r\n createTable,\r\n createList,\r\n createTOC,\r\n createBlockquote,\r\n} from './components';\r\nimport directiveRegistry, { type VanillaRenderContext, type DirectiveProps } from './directives';\r\n\r\n/**\r\n * Render parsed markdown tokens into an HTMLElement.\r\n *\r\n * @param tokens - Array of tokens from `parseMarkdown()`\r\n * @returns The root `<article class=\"nr-prose\">` element\r\n */\r\nexport function renderTokens(tokens: Token[]): HTMLElement {\r\n const article = document.createElement('article');\r\n article.className = 'nr-prose';\r\n\r\n const ctx: VanillaRenderContext = {\r\n parseMarkdown,\r\n renderElements: (tks) => renderTokensInner(tks, ctx),\r\n renderInline,\r\n renderMarkdown: (md: string) => renderTokensInner(parseMarkdown(md), ctx),\r\n };\r\n\r\n article.appendChild(processElements(tokens, ctx, tokens));\r\n return article;\r\n}\r\n\r\n/**\r\n * Convenience: parse markdown string and render directly.\r\n */\r\nexport function renderMarkdownString(markdown: string): HTMLElement {\r\n const tokens = parseMarkdown(markdown);\r\n return renderTokens(tokens);\r\n}\r\n\r\n/**\r\n * Render a raw HTML string into a wrapper element.\r\n * Extracts <style> blocks (injected globally into <head>) and\r\n * force-executes any <script> tags.\r\n */\r\nexport function renderHtmlString(html: string): HTMLElement {\r\n let processedContent = html;\r\n\r\n // Extract <style> blocks and inject globally\r\n processedContent = processedContent.replace(\r\n /<style(?:\\s+[^>]*)?>([\\s\\S]*?)<\\/style>/gi,\r\n (_match: string, cssContent: string) => {\r\n const styleEl = document.createElement('style');\r\n styleEl.setAttribute('data-nr-global', '');\r\n styleEl.textContent = cssContent;\r\n document.head.appendChild(styleEl);\r\n return '';\r\n }\r\n );\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-raw-html';\r\n wrapper.innerHTML = processedContent;\r\n\r\n // Force-execute injected scripts\r\n const scripts = wrapper.querySelectorAll('script');\r\n scripts.forEach(oldScript => {\r\n const newScript = document.createElement('script');\r\n Array.from(oldScript.attributes).forEach(attr =>\r\n newScript.setAttribute(attr.name, attr.value)\r\n );\r\n newScript.textContent = oldScript.textContent;\r\n oldScript.parentNode?.replaceChild(newScript, oldScript);\r\n });\r\n\r\n return wrapper;\r\n}\r\n\r\n/**\r\n * Render tokens into an HTMLElement (internal, creates a container).\r\n */\r\nfunction renderTokensInner(tokens: Token[], ctx: VanillaRenderContext): HTMLElement {\r\n const container = document.createElement('div');\r\n container.appendChild(processElements(tokens, ctx, tokens));\r\n return container;\r\n}\r\n\r\n/**\r\n * Process an array of tokens into a DocumentFragment.\r\n */\r\nfunction processElements(\r\n elements: Token[],\r\n ctx: VanillaRenderContext,\r\n allElements: Token[],\r\n): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n let i = 0;\r\n\r\n while (i < elements.length) {\r\n const el = elements[i];\r\n\r\n // Batch consecutive cards into a grid\r\n if (el.type === 'directive' && ['card', 'card-m', 'card-b'].includes(el.directiveType)) {\r\n const cards: Token[] = [];\r\n while (\r\n i < elements.length &&\r\n elements[i].type === 'directive' &&\r\n ['card', 'card-m', 'card-b'].includes((elements[i] as DirectiveToken).directiveType)\r\n ) {\r\n cards.push(elements[i]);\r\n i++;\r\n }\r\n\r\n if (cards.length === 1 || (cards[0] as DirectiveToken).props?.batch === 'off') {\r\n for (const card of cards) {\r\n const rendered = renderElement(card, ctx, allElements);\r\n if (rendered) fragment.appendChild(rendered);\r\n }\r\n } else {\r\n const grid = document.createElement('div');\r\n grid.className = 'nr-card-grid';\r\n for (const card of cards) {\r\n const rendered = renderElement(card, ctx, allElements);\r\n if (rendered) grid.appendChild(rendered);\r\n }\r\n fragment.appendChild(grid);\r\n }\r\n } else {\r\n const rendered = renderElement(el, ctx, allElements);\r\n if (rendered) fragment.appendChild(rendered);\r\n i++;\r\n }\r\n }\r\n\r\n return fragment;\r\n}\r\n\r\n/**\r\n * Render a single token into a Node.\r\n */\r\nfunction renderElement(\r\n element: Token,\r\n ctx: VanillaRenderContext,\r\n allElements: Token[],\r\n): Node | null {\r\n switch (element.type) {\r\n case 'header': {\r\n const tag = `h${element.level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\r\n let text = element.text;\r\n\r\n // Alignment modifiers\r\n const alignCenter = text.match(/^->\\s*(.+?)\\s*<-\\s*$/);\r\n const alignRight = text.match(/^->\\s*(.+?)\\s*->\\s*$/);\r\n if (alignCenter) text = alignCenter[1];\r\n else if (alignRight) text = alignRight[1];\r\n\r\n const h = document.createElement(tag);\r\n h.id = element.id;\r\n let cls = `md-h${element.level}`;\r\n if (alignCenter) cls += ' text-center';\r\n if (alignRight) cls += ' text-right';\r\n if (element.classes) cls += ` ${element.classes}`;\r\n h.className = cls;\r\n h.appendChild(renderInline(text));\r\n return h;\r\n }\r\n\r\n case 'paragraph': {\r\n const p = document.createElement('p');\r\n let cls = 'md-p';\r\n if (element.classes) cls += ` ${element.classes}`;\r\n if (element.align) cls += ` text-${element.align}`;\r\n p.className = cls;\r\n if (element.id) p.id = element.id;\r\n\r\n const lines = element.content.split('\\n');\r\n for (let li = 0; li < lines.length; li++) {\r\n const line = lines[li];\r\n const hardBreakMatch = line.match(/^(.*?)(\\s{2,})$/);\r\n if (hardBreakMatch) {\r\n p.appendChild(renderInline(hardBreakMatch[1]));\r\n p.appendChild(document.createElement('br'));\r\n } else {\r\n p.appendChild(renderInline(line));\r\n if (li < lines.length - 1) {\r\n p.appendChild(document.createTextNode(' '));\r\n }\r\n }\r\n }\r\n return p;\r\n }\r\n\r\n case 'codeblock':\r\n return createCodeBlock(element.content, element.language, element.title);\r\n\r\n case 'directive':\r\n return renderDirective(element, ctx, allElements);\r\n\r\n case 'html': {\r\n const el = element as HtmlToken;\r\n return renderHtmlString(el.content);\r\n }\r\n\r\n case 'html-block': {\r\n const htmlBlock = element as HtmlBlockToken;\r\n const rawProps = parseHtmlAttrs(htmlBlock.attrs);\r\n\r\n const el = document.createElement(htmlBlock.tag);\r\n // Apply attributes (keep as-is, no React renaming needed)\r\n for (const [key, value] of Object.entries(rawProps)) {\r\n if (key === 'style' && typeof value === 'object') {\r\n for (const [prop, val] of Object.entries(value)) {\r\n el.style.setProperty(prop, String(val));\r\n }\r\n } else if (value === true) {\r\n el.setAttribute(key, '');\r\n } else {\r\n el.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // Recurse children\r\n const childFrag = processElements(htmlBlock.children, ctx, allElements);\r\n el.appendChild(childFrag);\r\n return el;\r\n }\r\n\r\n case 'image': {\r\n const img = document.createElement('img');\r\n img.src = element.src;\r\n img.alt = element.alt;\r\n img.className = 'nr-image';\r\n if (element.style) {\r\n for (const [key, value] of Object.entries(element.style)) {\r\n img.style.setProperty(key, String(value));\r\n }\r\n }\r\n return img;\r\n }\r\n\r\n case 'table':\r\n return createTable(element.content, renderInline);\r\n\r\n case 'list':\r\n return createList(element.content, renderInline);\r\n\r\n case 'blockquote':\r\n return createBlockquote(element.content, element.classes, renderInline);\r\n\r\n case 'hr': {\r\n const hr = document.createElement('hr');\r\n hr.className = 'nr-hr';\r\n return hr;\r\n }\r\n\r\n case 'toc': {\r\n const headers = allElements.filter((e): e is Token & { type: 'header' } => e.type === 'header');\r\n return createTOC(headers.map(h => ({ level: h.level, text: h.text, id: h.id })), renderInline);\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Render a directive token.\r\n */\r\nfunction renderDirective(\r\n element: DirectiveToken,\r\n ctx: VanillaRenderContext,\r\n allElements: Token[],\r\n): Node | null {\r\n const { directiveType, props, slots, scopeId } = element;\r\n\r\n const renderer = directiveRegistry[directiveType];\r\n\r\n // renderSlot helper: parse slot content as markdown and render\r\n const renderSlot = (name: string): DocumentFragment => {\r\n const frag = document.createDocumentFragment();\r\n const slotContent = slots[name];\r\n if (!slotContent) return frag;\r\n const tokens = ctx.parseMarkdown(slotContent);\r\n frag.appendChild(ctx.renderElements(tokens));\r\n return frag;\r\n };\r\n\r\n const directiveProps: DirectiveProps = {\r\n directiveType,\r\n props,\r\n slots,\r\n renderSlot,\r\n context: ctx,\r\n index: 0,\r\n allElements,\r\n renderInline,\r\n renderMarkdown: ctx.renderMarkdown,\r\n };\r\n\r\n if (renderer) {\r\n return renderer(directiveProps);\r\n }\r\n\r\n // Fallback: unknown directive → render as a div with default slot\r\n const fallback = document.createElement('div');\r\n fallback.className = 'nr-unknown-directive';\r\n fallback.appendChild(renderSlot('default'));\r\n return fallback;\r\n}\r\n"],"mappings":"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","names":["import_react","t","import_language","import_highlight","import_react","import_react","markdown","text","classes","id","hljs","javascript","typescript","python","css","xml","json","bash","sql","markdown","java","csharp","cpp","go","rust","php","ruby","swift","kotlin","dart","yaml","toml","dockerfile","diff","shell","renderInline","tr","renderInline","markdown","import_jsx_runtime","t","React","CodeMirror"]}
|
|
1
|
+
{"version":3,"sources":["../react/NReditor.tsx","../react/custom-syntax.ts","../react/useDebounce.ts","../react/useTailwindCDN.ts","../vanilla/tailwindTheme.ts","../react/CustomMarkdownRenderer.tsx","../core/utils.ts","../core/parser.ts","../vanilla/highlightSetup.ts","../vanilla/components.ts","../vanilla/inline.ts","../vanilla/directives/admonition.ts","../vanilla/directives/details.ts","../vanilla/directives/modal.ts","../vanilla/directives/button.ts","../vanilla/directives/card.ts","../vanilla/directives/wrapper.ts","../vanilla/directives/slide.ts","../vanilla/directives/index.ts","../vanilla/renderer.ts"],"sourcesContent":["import React, { useRef, useState } from 'react';\nimport CodeMirror, { ReactCodeMirrorProps } from '@uiw/react-codemirror';\nimport { EditorView, Decoration, ViewPlugin, ViewUpdate, lineNumbers, keymap } from '@codemirror/view';\nimport { customStreamParserV2 } from './custom-syntax';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport { syntaxHighlighting, HighlightStyle, foldService, foldGutter, foldAll, unfoldAll } from '@codemirror/language';\nimport { tags as t } from '@lezer/highlight';\nimport { useDebounce } from './useDebounce';\nimport { useLazyTailwindCDN } from './useTailwindCDN';\nimport CustomMarkdownRenderer from './CustomMarkdownRenderer';\n\nexport type EditorMode = 'editor' | 'split' | 'preview';\n\ninterface NReditorProps extends ReactCodeMirrorProps {\n value: string;\n onChange: (value: string) => void;\n className?: string;\n /** Debounce delay in ms for preview rendering. Default: 300 */\n debounceMs?: number;\n /** Inject Tailwind v4 browser CDN for preview. Default: false */\n tailwindCDN?: boolean;\n /** Called when user clicks Guía */\n onGuide?: () => void;\n /** Called when user clicks Configurar */\n onConfig?: () => void;\n}\n\nconst customSyntaxHighlighting = HighlightStyle.define([\n { tag: t.heading, fontWeight: 'bold', color: 'var(--tc-heading, #e2e8f0)' },\n { tag: t.quote, color: 'var(--tc-quote, #94a3b8)', fontStyle: 'italic' },\n { tag: t.meta, color: 'var(--tc-meta, #64748b)' },\n { tag: t.variableName, color: 'var(--tc-variable, #38bdf8)' },\n { tag: t.strong, fontWeight: 'bold' },\n { tag: t.emphasis, fontStyle: 'italic' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: t.link, color: 'var(--tc-link, #38bdf8)' },\n { tag: t.url, color: 'var(--tc-link, #38bdf8)' },\n { tag: t.comment, color: 'var(--tc-comment, #64748b)' },\n { tag: t.keyword, color: 'var(--tc-heading, #e2e8f0)', fontWeight: 'bold' },\n { tag: t.typeName, color: 'var(--tc-type, #a78bfa)' },\n { tag: t.string, color: 'var(--tc-string, #4ade80)' },\n { tag: t.attributeName, color: 'var(--tc-attribute, #fb923c)' },\n { tag: t.propertyName, color: '#0ea5e9' },\n { tag: t.className, color: '#f59e0b', fontStyle: 'italic' },\n { tag: t.special(t.emphasis), textDecoration: 'underline' },\n { tag: t.special(t.comment), backgroundColor: 'var(--tc-highlight-bg, rgba(255,255,255,0.05))', padding: '0 2px', borderRadius: '2px' },\n]);\n\nconst customEditorTheme = EditorView.theme({\n '&': {\n color: 'var(--color-text-primary, #e2e8f0)',\n backgroundColor: 'transparent !important',\n height: '100%',\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n minHeight: '0',\n },\n '&.cm-focused': { outline: 'none' },\n '.cm-scroller': {\n overflow: 'auto !important',\n flex: '1',\n minHeight: '0',\n WebkitOverflowScrolling: 'touch',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent !important',\n borderRight: '1px solid var(--color-border, #334155)',\n color: 'var(--color-text-secondary, #94a3b8)',\n opacity: 0.6,\n border: 'none',\n },\n '.cm-activeLineGutter': { backgroundColor: 'transparent' },\n '.cm-lineNumbers': { color: 'inherit' },\n '.cm-foldGutter': { padding: '0px', cursor: 'pointer' },\n '.cm-foldPlaceholder': {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid var(--color-border, #334155)',\n color: 'var(--tc-heading, #e2e8f0)',\n padding: '0 6px',\n borderRadius: '4px',\n margin: '0 4px',\n fontSize: '0.9em',\n fontWeight: 'bold',\n },\n '.dark .cm-foldPlaceholder': {\n backgroundColor: 'rgba(255, 255, 255, 0.1)',\n },\n '.cm-activeLine': { backgroundColor: 'transparent' },\n '.cm-cursor': { borderLeftColor: 'var(--color-text-primary, #e2e8f0)' },\n '&.cm-focused .cm-selectionBackground, .cm-selectionBackground': {\n backgroundColor: 'var(--tc-selection-bg, rgba(56, 189, 248, 0.2)) !important',\n },\n '.cm-blockquote-line': {\n color: 'var(--tc-blockquote-color, #94a3b8)',\n fontStyle: 'italic',\n borderLeft: '2px solid var(--tc-blockquote-border, #334155)',\n paddingLeft: '10px',\n },\n '.cm-spoiler': {\n backgroundColor: 'var(--color-text-secondary, #94a3b8)',\n color: 'var(--color-text-secondary, #94a3b8)',\n borderRadius: '3px',\n padding: '0 2px',\n cursor: 'pointer',\n transition: 'background-color 0.2s, color 0.2s',\n },\n '.cm-spoiler:hover': {\n backgroundColor: 'transparent',\n color: 'var(--color-text-primary, #e2e8f0)',\n },\n '.cm-admonition-bg': {\n borderLeft: 'none !important',\n marginLeft: '0px',\n },\n '.cm-admonition-button': { borderLeftColor: 'var(--tc-attribute, #fb923c)' },\n '.cm-admonition-modal': { borderLeftColor: 'var(--tc-variable, #38bdf8)' },\n '.cm-admonition-warning': { borderLeftColor: '#f59e0b' },\n '.cm-admonition-danger': { borderLeftColor: '#ef4444' },\n '.cm-raw-block': {\n fontFamily: 'monospace',\n backgroundColor: 'rgba(0, 0, 0, 0.1)',\n },\n '.dark .cm-raw-block': {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n },\n '.cm-admonition-depth-1': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%)',\n backgroundColor: 'hsla(20, 70%, 50%, 0.05)',\n paddingLeft: '12px !important',\n },\n '.cm-admonition-depth-2': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%)',\n backgroundColor: 'hsla(140, 70%, 50%, 0.05)',\n paddingLeft: '16px !important',\n },\n '.cm-admonition-depth-3': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%), inset 12px 0 0 hsl(200, 70%, 50%)',\n backgroundColor: 'hsla(200, 70%, 50%, 0.05)',\n paddingLeft: '20px !important',\n },\n '.cm-admonition-depth-4': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%), inset 12px 0 0 hsl(200, 70%, 50%), inset 16px 0 0 hsl(280, 70%, 50%)',\n backgroundColor: 'hsla(280, 70%, 50%, 0.05)',\n paddingLeft: '24px !important',\n },\n '.cm-admonition-depth-5': {\n boxShadow: 'inset 4px 0 0 hsl(340, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%), inset 12px 0 0 hsl(200, 70%, 50%), inset 16px 0 0 hsl(280, 70%, 50%), inset 20px 0 0 hsl(340, 70%, 50%)',\n backgroundColor: 'hsla(340, 70%, 50%, 0.05)',\n paddingLeft: '28px !important',\n },\n '.cm-panels': {\n position: 'static !important',\n backgroundColor: 'transparent !important',\n border: 'none !important',\n },\n '.cm-panel.cm-search': {\n position: 'fixed !important',\n top: '20px !important',\n right: '20px !important',\n zIndex: 100,\n backgroundColor: 'var(--color-background-primary, #0f172a)',\n border: '1px solid var(--color-border, #334155)',\n borderRadius: '12px',\n padding: '12px',\n boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3)',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n backdropFilter: 'blur(8px)',\n minWidth: '280px',\n },\n '.cm-search [name=close]': {\n position: 'absolute',\n right: '8px',\n top: '8px',\n cursor: 'pointer',\n opacity: 0.6,\n border: 'none',\n background: 'transparent',\n color: 'var(--color-text-primary, #e2e8f0)',\n fontSize: '18px',\n },\n '.cm-search [name=close]:hover': { opacity: 1 },\n '.cm-textfield': {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid var(--color-border, #334155)',\n borderRadius: '6px',\n color: 'var(--color-text-primary, #e2e8f0)',\n padding: '4px 8px',\n outline: 'none',\n width: '100%',\n marginBottom: '4px',\n },\n '.cm-textfield:focus': {\n borderColor: 'var(--color-accent-primary, #38bdf8)',\n backgroundColor: 'rgba(255, 255, 255, 0.08)',\n },\n '.cm-panel.cm-search input[type=checkbox]:checked': {\n backgroundColor: 'var(--color-accent-primary, #38bdf8)',\n },\n '.cm-panel.cm-search input[type=checkbox]': {\n backgroundColor: 'rgba(255, 255, 255, 0.08)',\n },\n '.cm-button': {\n backgroundImage: 'linear-gradient(135deg, var(--color-accent-primary, #38bdf8), var(--color-accent-hover, #7dd3fc))',\n color: 'var(--color-accent-text, #0f172a)',\n border: 'none',\n borderRadius: '6px',\n padding: '4px 10px',\n cursor: 'pointer',\n fontSize: '0.85em',\n fontWeight: '600',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n transition: 'transform 0.1s, opacity 0.2s',\n marginRight: '4px',\n boxShadow: '0 4px 12px -2px rgba(0, 0, 0, 0.2)',\n },\n '.cm-button:hover': {\n opacity: 0.95,\n transform: 'translateY(-1px)',\n boxShadow: '0 6px 14px -2px rgba(0, 0, 0, 0.25)',\n },\n '.cm-button:active': { transform: 'translateY(0)' },\n '.cm-search label': {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '0.8em',\n color: 'var(--color-text-secondary, #94a3b8)',\n marginRight: '8px',\n cursor: 'pointer',\n },\n '.cm-search input[type=checkbox]': {\n cursor: 'pointer',\n accentColor: 'var(--color-accent-primary, #38bdf8)',\n },\n});\n\n// Fold service for ::: directive blocks and HTML tags\nconst customFoldService = foldService.of((state, lineStart) => {\n const line = state.doc.lineAt(lineStart);\n const trimmed = line.text.trim();\n \n const dirMatch = trimmed.match(/^:::(.+)/);\n if (dirMatch) {\n let stack = 1;\n for (let i = line.number + 1; i <= state.doc.lines; i++) {\n const nextLine = state.doc.line(i);\n const nextText = nextLine.text.trim();\n if (nextText.match(/^:::(.+)/)) {\n stack++;\n } else if (nextText === ':::') {\n stack--;\n if (stack === 0) {\n return { from: line.to, to: nextLine.to };\n }\n }\n }\n return null;\n }\n\n const htmlMatch = trimmed.match(/^<([a-zA-Z][\\w-]*)\\b/);\n if (htmlMatch) {\n const tagName = htmlMatch[1].toLowerCase();\n const voidElements = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', \n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n ]);\n if (voidElements.has(tagName) || trimmed.endsWith('/>')) return null;\n\n let stack = 1;\n\n for (let i = line.number + 1; i <= state.doc.lines; i++) {\n const nextLine = state.doc.line(i);\n const nextText = nextLine.text;\n \n let match;\n const tagRegex = new RegExp(`</?${tagName}\\\\b[^>]*>`, 'gi');\n \n while ((match = tagRegex.exec(nextText)) !== null) {\n if (match[0].startsWith('</')) {\n stack--;\n if (stack === 0) {\n return { from: line.to, to: nextLine.to };\n }\n } else {\n if (!match[0].endsWith('/>')) {\n stack++;\n }\n }\n }\n }\n return null;\n }\n\n return null;\n});\n\n// Directive colorization plugin — colored left borders for nested :::\nconst directivePlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const doc = view.state.doc;\n const visibleRanges = view.visibleRanges;\n if (visibleRanges.length === 0) return builder.finish();\n\n const maxTo = visibleRanges[visibleRanges.length - 1].to;\n const admonitionStack: string[] = [];\n\n for (let i = 1; i <= doc.lines; i++) {\n const line = doc.line(i);\n if (line.from > maxTo) break;\n\n const trimmedLine = line.text.trim();\n let isClosingLine = false;\n let closingTargetIdx = -1;\n\n const match = trimmedLine.match(/^:::(.*)/);\n if (match) {\n const rest = match[1].trim();\n if (rest === '') {\n if (admonitionStack.length > 0) {\n isClosingLine = true;\n closingTargetIdx = admonitionStack.length - 1;\n }\n } else {\n const typeMatch = rest.match(/^(\\w+|\\{)/);\n const type =\n typeMatch && typeMatch[1] !== '{'\n ? typeMatch[1].toLowerCase()\n : 'generic';\n admonitionStack.push(type);\n }\n }\n\n const isVisible = visibleRanges.some(\n r => line.to >= r.from && line.from <= r.to\n );\n\n if (isVisible && admonitionStack.length > 0) {\n const targetIdx = isClosingLine\n ? closingTargetIdx\n : admonitionStack.length - 1;\n const currentType = admonitionStack[targetIdx];\n const depth = targetIdx + 1;\n const lineClasses = ['cm-admonition-bg'];\n\n if (currentType === 'raw') {\n lineClasses.push('cm-raw-block');\n lineClasses.push(`cm-admonition-depth-${Math.min(depth, 5)}`);\n } else {\n lineClasses.push(`cm-admonition-${currentType}`);\n lineClasses.push(`cm-admonition-depth-${Math.min(depth, 5)}`);\n }\n\n builder.add(\n line.from,\n line.from,\n Decoration.line({ class: lineClasses.join(' ') })\n );\n }\n\n if (isClosingLine) {\n admonitionStack.pop();\n }\n }\n\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n// Blockquote line decoration\nconst blockquotePlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n for (const { from, to } of view.visibleRanges) {\n for (let pos = from; pos <= to; ) {\n const line = view.state.doc.lineAt(pos);\n if (line.text.trim().startsWith('>')) {\n builder.add(\n line.from,\n line.from,\n Decoration.line({ class: 'cm-blockquote-line' })\n );\n }\n pos = line.to + 1;\n }\n }\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n// Spoiler inline decoration: !>text<! → blurred until hover\nconst spoilerPlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const spoilerRegex = /!>([\\s\\S]+?)<!(?=\\s|$)/g;\n const ranges: { from: number; to: number; dec: Decoration }[] = [];\n\n for (const { from, to } of view.visibleRanges) {\n const text = view.state.doc.sliceString(from, to);\n spoilerRegex.lastIndex = 0;\n let match;\n while ((match = spoilerRegex.exec(text))) {\n const start = from + match.index;\n const end = start + match[0].length;\n const contentStart = start + 2;\n const contentEnd = end - 2;\n if (contentStart >= contentEnd) continue;\n ranges.push({ from: start, to: contentStart, dec: Decoration.replace({}) });\n ranges.push({\n from: contentStart,\n to: contentEnd,\n dec: Decoration.mark({ class: 'cm-spoiler' }),\n });\n ranges.push({ from: contentEnd, to: end, dec: Decoration.replace({}) });\n }\n }\n\n ranges.sort((a, b) => a.from - b.from || a.to - b.to);\n for (const { from, to, dec } of ranges) builder.add(from, to, dec);\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n// Color text inline decoration: %color%text%%\nconst colorTextPlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const colorRegex = /%([^%\\s]+?)%((?:(?!%%).)*)%%/g;\n for (const { from, to } of view.visibleRanges) {\n const text = view.state.doc.sliceString(from, to);\n let match;\n while ((match = colorRegex.exec(text))) {\n const color = match[1];\n const startPos = from + match.index;\n const endPos = startPos + match[0].length;\n builder.add(\n startPos,\n endPos,\n Decoration.mark({ attributes: { style: `color: ${color}` } })\n );\n }\n }\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n/**\n * NReditor — CodeMirror 6 editor with live markdown preview.\n * Drop-in component that works inside any container.\n *\n * @example\n * ```tsx\n * import NReditor from '@noirmd/previewer/editor';\n * import '@noirmd/previewer/editor.css';\n * import '@noirmd/previewer/vanilla/vanilla.css';\n *\n * <NReditor value={md} onChange={setMd} />\n * <NReditor value={md} onChange={setMd} tailwindCDN />\n * ```\n */\nconst NReditor: React.FC<NReditorProps> = ({\n value,\n onChange,\n className,\n debounceMs = 300,\n tailwindCDN = false,\n onGuide,\n onConfig,\n}) => {\n const editorRef = useRef<EditorView | null>(null);\n const [isAllFolded, setIsAllFolded] = useState(false);\n const [editorMode, setEditorMode] = useState<EditorMode>('split');\n const debouncedContent = useDebounce(value, debounceMs);\n\n useLazyTailwindCDN(tailwindCDN);\n\n const handleToggleFold = () => {\n if (!editorRef.current) return;\n if (isAllFolded) {\n unfoldAll(editorRef.current);\n setIsAllFolded(false);\n } else {\n foldAll(editorRef.current);\n setIsAllFolded(true);\n }\n };\n\n const extensions = React.useMemo(\n () => [\n customStreamParserV2,\n lineNumbers(),\n foldGutter({\n markerDOM: open => {\n const span = document.createElement('span');\n span.style.cursor = 'pointer';\n span.style.padding = '0 4px';\n span.style.fontSize = '12px';\n span.style.display = 'inline-block';\n span.style.transition = 'transform 0.2s';\n span.textContent = open ? '▼' : '▶';\n return span;\n },\n }),\n customFoldService,\n customEditorTheme,\n syntaxHighlighting(customSyntaxHighlighting),\n EditorView.lineWrapping,\n keymap.of([\n { key: 'Ctrl-Shift-[', run: foldAll },\n { key: 'Ctrl-Shift-]', run: unfoldAll },\n ]),\n directivePlugin,\n blockquotePlugin,\n spoilerPlugin,\n colorTextPlugin,\n ],\n []\n );\n\n const modeButtons: { key: EditorMode; icon: string; label: string }[] = [\n { key: 'editor', icon: 'code', label: 'Editor' },\n { key: 'split', icon: 'vertical_split', label: 'Split' },\n { key: 'preview', icon: 'visibility', label: 'Preview' },\n ];\n\n return (\n <div className={`nr-editor ${className || ''}`}>\n {/* Toolbar */}\n <div className=\"nr-editor-toolbar\">\n {/* Left: Fold + mode switcher */}\n <div className=\"nr-editor-toolbar-left\">\n <button\n onClick={handleToggleFold}\n className=\"nr-toolbar-btn nr-toolbar-btn-fold\"\n title={isAllFolded ? 'Expandir todo' : 'Colapsar todo'}\n aria-label={isAllFolded ? 'Expandir todo' : 'Colapsar todo'}\n >\n <span className=\"material-icons-round\">\n {isAllFolded ? 'unfold_more' : 'unfold_less'}\n </span>\n </button>\n\n <div className=\"nr-toolbar-divider\" />\n\n <div className=\"nr-toolbar-mode-group\">\n {modeButtons.map(btn => (\n <button\n key={btn.key}\n onClick={() => setEditorMode(btn.key)}\n className={`nr-toolbar-btn nr-toolbar-btn-mode ${\n editorMode === btn.key ? 'nr-toolbar-btn-mode--active' : ''\n } ${btn.key === 'split' ? 'nr-toolbar-btn-split' : ''}`}\n title={btn.label}\n >\n <span className=\"material-icons-round\">{btn.icon}</span>\n <span className=\"nr-toolbar-label\">{btn.label}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Right: Guía · Configurar (optional) */}\n <div className=\"nr-editor-toolbar-right\">\n {onGuide && (\n <button\n onClick={onGuide}\n className=\"nr-toolbar-btn nr-toolbar-btn-sm nr-toolbar-btn-guide\"\n title=\"Guía de sintaxis\"\n >\n <span className=\"material-icons-round\">menu_book</span>\n <span className=\"nr-toolbar-label\">Guía</span>\n </button>\n )}\n {onGuide && onConfig && <div className=\"nr-toolbar-divider\" />}\n {onConfig && (\n <button\n onClick={onConfig}\n className=\"nr-toolbar-btn nr-toolbar-btn-sm nr-toolbar-btn-config\"\n title=\"Configurar tema y metadata\"\n >\n <span className=\"material-icons-round\">tune</span>\n <span className=\"nr-toolbar-label\">Configurar</span>\n </button>\n )}\n </div>\n </div>\n\n {/* Content area — editor / split / preview */}\n <div className=\"nr-editor-body\">\n {(editorMode === 'editor' || editorMode === 'split') && (\n <div\n className={`nr-editor-pane ${\n editorMode === 'split' ? 'nr-editor-pane--half' : ''\n }`}\n >\n <CodeMirror\n value={value}\n onChange={onChange}\n height=\"auto\"\n onCreateEditor={view => {\n editorRef.current = view as any;\n }}\n basicSetup={{\n lineNumbers: false,\n foldGutter: false,\n }}\n extensions={extensions}\n />\n </div>\n )}\n\n {(editorMode === 'preview' || editorMode === 'split') && (\n <div\n className={`nr-editor-preview ${\n editorMode === 'split' ? 'nr-editor-preview--half' : ''\n }`}\n >\n <div className=\"nr-editor-prose\">\n <div className=\"nr-prose\">\n <CustomMarkdownRenderer content={debouncedContent} />\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default NReditor;\n","import { StreamLanguage } from '@codemirror/language';\nimport { tags as t } from '@lezer/highlight';\n\n/**\n * V2 Custom Syntax Highlighter for CodeMirror 6.\n */\n\ninterface V2State {\n inCodeBlock: boolean;\n inDirectiveHeader: boolean;\n inPropsBlock: boolean;\n braceDepth: number;\n blockStack: string[];\n imageState: 'none' | 'expectUrl' | 'expectOptions';\n linkState: 'none' | 'expectUrl';\n lastPropKey: string;\n inHtmlBlock: boolean;\n htmlTagName: string;\n isClosingHtmlTag: boolean;\n embeddedLang: 'none' | 'script' | 'style';\n}\n\nexport const customStreamParserV2 = StreamLanguage.define<V2State>({\n startState: () => ({\n inCodeBlock: false,\n inDirectiveHeader: false,\n inPropsBlock: false,\n braceDepth: 0,\n blockStack: [],\n imageState: 'none',\n linkState: 'none',\n lastPropKey: '',\n inHtmlBlock: false,\n htmlTagName: '',\n isClosingHtmlTag: false,\n embeddedLang: 'none',\n }),\n\n token(stream, state) {\n // ── Line start resets ──\n if (stream.sol()) {\n state.inDirectiveHeader = false;\n state.imageState = 'none';\n state.linkState = 'none';\n\n // Close code block\n if (state.inCodeBlock && stream.match(/^\\s*```/)) {\n state.inCodeBlock = false;\n return 'comment';\n }\n \n // ELIMINADO: El reinicio de state.inHtmlBlock aquí para permitir atributos multilínea\n }\n\n // Inside HTML block opening tag (soporta atributos multilínea)\n if (state.inHtmlBlock) {\n stream.eatSpace();\n \n // Self-closing: />\n if (stream.match(/^\\/>/)) {\n state.inHtmlBlock = false;\n state.htmlTagName = '';\n state.isClosingHtmlTag = false;\n return 'typeName';\n }\n // Closing >\n if (stream.match(/^>/)) {\n state.inHtmlBlock = false;\n // Enter embedded mode for <script> / <style> blocks\n if (!state.isClosingHtmlTag && (state.htmlTagName === 'script' || state.htmlTagName === 'style')) {\n state.embeddedLang = state.htmlTagName;\n }\n state.htmlTagName = '';\n state.isClosingHtmlTag = false;\n return 'typeName';\n }\n \n // Nombre de atributo\n if (stream.match(/^[a-zA-Z_:][\\w-.:]*/)) return 'attributeName';\n // Signo igual\n if (stream.match(/^=/)) return 'keyword';\n // Valor entre comillas dobles (cerradas o abiertas en esta línea)\n if (stream.match(/^\"[^\"]*\"/)) return 'string';\n if (stream.match(/^\"[^\"]*$/)) return 'string';\n // Valor entre comillas simples (cerradas o abiertas)\n if (stream.match(/^'[^']*'/)) return 'string';\n if (stream.match(/^'[^']*$/)) return 'string';\n // Valor sin comillas\n if (stream.match(/^[^\\s>]+/)) return 'string';\n \n if (stream.eatSpace()) return null;\n stream.next();\n return null;\n }\n\n // ── Inside embedded <script> / <style> ──\n if (state.embeddedLang !== 'none') {\n // Detect closing tag to exit embedded mode\n if (stream.match(/^<\\/(script|style)\\b/i)) {\n const closeTag = stream.current().replace(/^<\\//, '').toLowerCase();\n state.embeddedLang = 'none';\n state.inHtmlBlock = true;\n state.htmlTagName = closeTag;\n state.isClosingHtmlTag = true;\n return 'typeName';\n }\n\n if (state.embeddedLang === 'script') {\n // ── JavaScript tokenizer ──\n // Line comments\n if (stream.match(/^\\/\\//)) { stream.skipToEnd(); return 'comment'; }\n // Block comments\n if (stream.match(/^\\/\\*/)) {\n while (!stream.eol()) {\n if (stream.match(/\\*\\//)) return 'comment';\n stream.next();\n }\n return 'comment';\n }\n // Strings (single / double quotes)\n if (stream.match(/^[\"']/)) {\n const q = stream.current();\n while (!stream.eol()) {\n const ch = stream.next();\n if (ch === q && stream.string[stream.pos - 2] !== '\\\\') break;\n }\n return 'string';\n }\n // Template literals\n if (stream.match(/^`/)) {\n while (!stream.eol()) {\n if (stream.next() === '`') break;\n }\n return 'string';\n }\n // Keywords\n if (stream.match(/\\b(const|let|var|function|return|if|else|for|while|do|switch|case|break|continue|new|this|class|extends|import|export|default|from|try|catch|finally|throw|async|await|typeof|instanceof|in|of|void|null|undefined|true|false)\\b/)) return 'keyword';\n // Numbers\n if (stream.match(/^\\d+(\\.\\d+)?/)) return 'number';\n // Function call\n if (stream.match(/^[a-zA-Z_$][\\w$]*(?=\\s*\\()/)) return 'function';\n // Identifier\n if (stream.match(/^[a-zA-Z_$][\\w$]*/)) return 'variableName';\n // Operators\n if (stream.match(/^[+\\-*\\/%=!<>&|^~?:]+/)) return 'keyword';\n stream.next();\n return null;\n }\n\n if (state.embeddedLang === 'style') {\n // ── CSS tokenizer ──\n // Comments\n if (stream.match(/^\\/\\*/)) {\n while (!stream.eol()) {\n if (stream.match(/\\*\\//)) return 'comment';\n stream.next();\n }\n return 'comment';\n }\n // Strings\n if (stream.match(/^[\"']/)) {\n const q = stream.current();\n while (!stream.eol()) {\n const ch = stream.next();\n if (ch === q && stream.string[stream.pos - 2] !== '\\\\') break;\n }\n return 'string';\n }\n // At-rules\n if (stream.match(/^@[a-zA-Z-]+/)) return 'keyword';\n // Hex colors\n if (stream.match(/^#[0-9a-fA-F]{3,8}\\b/)) return 'string';\n // Numbers with optional units\n if (stream.match(/^\\d+(\\.\\d+)?(px|em|rem|%|vh|vw|vmin|vmax|s|ms|deg|fr)?\\b/)) return 'number';\n // Property name (word before colon)\n if (stream.match(/^[a-zA-Z-]+(?=\\s*:)/)) return 'propertyName';\n // Selectors: .class / #id\n if (stream.match(/^[.#][a-zA-Z][\\w-]*/)) return 'className';\n // CSS keywords\n if (stream.match(/\\b(none|auto|inherit|initial|unset|normal|bold|italic|center|left|right|flex|grid|block|inline|relative|absolute|fixed|sticky|hidden|visible|scroll|cover|contain)\\b/)) return 'keyword';\n // Tag selectors\n if (stream.match(/^[a-zA-Z][\\w-]*/)) return 'typeName';\n // Punctuation\n if (stream.match(/^[{}();:,]/)) return 'keyword';\n stream.next();\n return null;\n }\n }\n\n // Inside code block → everything is comment\n if (state.inCodeBlock) {\n stream.skipToEnd();\n return 'comment';\n }\n\n // Inside {props} block\n if (state.inPropsBlock) {\n stream.eatSpace();\n\n if (stream.peek() === '}') {\n stream.next();\n state.inPropsBlock = false;\n state.inDirectiveHeader = false;\n state.lastPropKey = '';\n return 'keyword';\n }\n\n if (stream.match(/^\\.[a-zA-Z0-9_-]+/)) return 'className';\n if (stream.match(/^#[a-zA-Z0-9_-]+/)) return 'propertyName';\n\n const urlKeys = /^(url|href|image|src|icon)$/i;\n if (stream.match(/^[a-zA-Z][\\w-]*(?==)/)) {\n state.lastPropKey = stream.current();\n return 'propertyName';\n }\n if (stream.match(/^=/)) return 'keyword';\n if (stream.match(/^\"[^\"]*\"|^'[^']*'/)) {\n return urlKeys.test(state.lastPropKey) ? 'url' : 'string';\n }\n\n stream.next();\n return null;\n }\n\n // ── Line-start rules ──\n if (stream.sol()) {\n let match;\n if ((match = stream.match(/^\\s*(:::)\\s*/))) {\n const rest = stream.string.slice(stream.pos).trim();\n\n if (rest === '') {\n state.blockStack.pop();\n } else {\n const typeMatch = rest.match(/^([\\w-]+)/);\n state.blockStack.push(typeMatch ? typeMatch[1].toLowerCase() : 'generic');\n }\n\n state.inDirectiveHeader = true;\n return 'keyword';\n }\n\n if (stream.match(/^\\s*#[a-zA-Z][\\w-]*\\s*$/) && !stream.match(/^\\s*#{1,6}\\s/)) {\n return 'propertyName';\n }\n if (stream.match(/^\\s*(#{1,6})\\s+/)) return 'heading';\n if (stream.match(/^\\s*```/)) {\n state.inCodeBlock = true;\n stream.skipToEnd();\n return 'comment';\n }\n if (stream.match(/^\\s*([-*+]|\\d+\\.)\\s+/)) return 'variableName';\n if (stream.match(/^\\s*(---|___|(\\*\\s*){3,})\\s*$/)) return 'meta';\n if (stream.match(/^\\s*\\[TOC\\d?\\]/)) return 'keyword';\n }\n\n // ── Directive header ──\n if (state.inDirectiveHeader) {\n stream.eatSpace();\n if (stream.match(/^[\\w-]+/)) return 'typeName';\n if (stream.peek() === '{') {\n stream.next();\n state.inPropsBlock = true;\n state.inDirectiveHeader = true;\n return 'keyword';\n }\n state.inDirectiveHeader = false;\n }\n\n // ── Raw block content (HTML/CSS/JS) ──\n const currentBlockType = state.blockStack[state.blockStack.length - 1];\n if (currentBlockType === 'raw' && !state.inDirectiveHeader) {\n if (stream.eatSpace()) return null;\n if (stream.match(/^<\\/?[a-zA-Z0-9-]+/)) return 'typeName';\n if (stream.match(/^>/)) return 'typeName';\n if (stream.match(/^[{}]/)) return 'keyword';\n if (stream.match(/^--[a-zA-Z0-9_-]+/)) return 'variableName';\n if (stream.match(/^[a-zA-Z-]+(?=\\s*:)/)) return 'propertyName';\n if (stream.match(/^var\\([^)]+\\)/)) return 'variableName';\n if (stream.match(/^['\"`][^'\"`]*['\"`]/)) return 'string';\n if (stream.match(/^[#.][a-zA-Z0-9_-]+/)) return 'className';\n if (stream.match(/^:[a-zA-Z0-9_-]+/)) return 'keyword';\n if (stream.match(/\\b(const|let|var|function|return|if|else|for|while)\\b/)) return 'keyword';\n stream.next();\n return null;\n }\n\n // ── Image & Links ──\n if (state.imageState === 'expectUrl') {\n state.imageState = 'expectOptions';\n if (stream.eat('(')) {\n let parenLevel = 1;\n while (!stream.eol() && parenLevel > 0) {\n const next = stream.next();\n if (next === '(') parenLevel++;\n else if (next === ')' && stream.string[stream.pos - 2] !== '\\\\') parenLevel--;\n }\n return 'url';\n } else {\n state.imageState = 'none';\n }\n }\n if (state.imageState === 'expectOptions') {\n state.imageState = 'none';\n if (stream.eat('{')) {\n stream.eatWhile(/[^}]/);\n stream.eat('}');\n return 'attributeName';\n }\n }\n if (state.linkState === 'expectUrl') {\n state.linkState = 'none';\n if (stream.eat('(')) {\n let parenLevel = 1;\n while (!stream.eol() && parenLevel > 0) {\n const next = stream.next();\n if (next === '(') parenLevel++;\n else if (next === ')' && stream.string[stream.pos - 2] !== '\\\\') parenLevel--;\n }\n return 'url';\n }\n }\n\n // ── HTML tags (inline & block) - Mejorado con |$ para EOL ──\n if (stream.match(/^<\\/?[a-zA-Z][\\w-]*(?=[>\\s/]|$)/)) {\n const raw = stream.current();\n state.htmlTagName = raw.replace(/^<\\/?/, '').toLowerCase();\n state.isClosingHtmlTag = raw.startsWith('</');\n state.inHtmlBlock = true;\n return 'typeName';\n }\n\n // ── Inline formatting ──\n if (stream.match(/\\*\\*\\*.+?\\*\\*\\*/)) return 'strongEmphasis';\n if (stream.match(/\\*\\*.+?\\*\\*/)) return 'strong';\n if (stream.match(/!\\[[^\\]]*?\\]/)) {\n if (stream.peek() === '(') state.imageState = 'expectUrl';\n return 'string';\n }\n if (stream.match(/\\[[^\\]]+?\\]/)) {\n if (stream.peek() === '(') state.linkState = 'expectUrl';\n return 'string';\n }\n if (stream.match(/\\|\\[[^\\]]+?\\]\\|/)) return 'keyword';\n if (stream.match(/`[^`]+`/)) return 'comment';\n if (stream.match(/_(.+?)_/)) return 'emphasis';\n if (stream.match(/~~(.+?)~~/)) return 'strikethrough';\n if (stream.match(/!~(.+?)~!/)) return 'underline';\n if (stream.match(/==(.+?)==/)) return 'highlight';\n if (stream.match(/!>.+?<!/)) return 'comment';\n if (stream.match(/%[^%\\s]+?%[^%]+?%%/)) return 'string';\n if (stream.match(/->|<-|\\|/)) return 'meta';\n\n stream.next();\n return null;\n },\n\n tokenTable: {\n heading: t.heading,\n keyword: t.keyword,\n typeName: t.typeName,\n string: t.string,\n attributeName: t.attributeName,\n propertyName: t.propertyName,\n className: t.className,\n comment: t.comment,\n variableName: t.variableName,\n meta: t.meta,\n strong: t.strong,\n emphasis: t.emphasis,\n strongEmphasis: [t.strong, t.emphasis],\n strikethrough: t.strikethrough,\n underline: t.special(t.emphasis),\n highlight: t.special(t.comment),\n url: t.url,\n link: t.string,\n number: t.number,\n function: t.function(t.variableName),\n },\n});","import { useState, useEffect } from 'react';\n\n/**\n * useDebounce — delays updating a value until after a specified delay.\n * Useful for reducing expensive operations (like preview rendering) during rapid input.\n */\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n","import { useEffect, useRef } from 'react';\nimport { injectNRTailwindTheme, removeNRTailwindTheme } from '../vanilla/tailwindTheme';\n\n/**\n * useLazyTailwindCDN — Lazily injects the Tailwind CSS v4 Browser CDN\n * so that arbitrary Tailwind classes written in runtime markdown content\n * (:::raw, directives, ##{ } attrs, etc.) are resolved.\n *\n * - Only injects the <script> when `enabled` is true (e.g. preview mode).\n * - Removes the script when `enabled` becomes false (editor-only mode).\n * - This means zero CDN cost in editor-only mode.\n * - The v4 Browser CDN uses `@tailwindcss/browser` which JIT-compiles\n * classes from the DOM at runtime.\n * - preflight is DISABLED via inline config to avoid overriding app base styles.\n */\n\nconst CDN_URL = 'https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4';\nconst SCRIPT_ID = 'tailwind-cdn-v4-runtime';\nconst CONFIG_ID = 'tailwind-cdn-v4-config';\n\n// Tailwind v4 Browser CDN reads the theme from CSS @theme blocks already on the page.\n// No need to duplicate fonts/colors here — they're defined in src/index.css.\n// Only disable preflight to avoid injecting normalize.css over our base styles.\nconst TAILWIND_CDN_CONFIG = `\nwindow.tailwind = window.tailwind || {};\nwindow.tailwind.config = {\n corePlugins: {\n preflight: false,\n },\n};\n`;\n\ndeclare global {\n interface Window {\n __twCDNRefs?: number;\n tailwind?: { config: object; scan?: () => void };\n }\n}\n\n/**\n * Lazy CDN hook — only loads the Tailwind Browser CDN when `enabled` is true.\n * Call this from the component that hosts the preview panel.\n */\nexport function useLazyTailwindCDN(enabled: boolean) {\n const loadedRef = useRef(false);\n\n useEffect(() => {\n if (!enabled) {\n // When disabled: remove CDN scripts if no other consumers need them\n window.__twCDNRefs = (window.__twCDNRefs ?? 1) - 1;\n if ((window.__twCDNRefs ?? 0) <= 0) {\n document.getElementById(SCRIPT_ID)?.remove();\n document.getElementById(CONFIG_ID)?.remove();\n removeNRTailwindTheme();\n window.__twCDNRefs = 0;\n loadedRef.current = false;\n }\n return;\n }\n\n // When enabled: inject CDN scripts\n window.__twCDNRefs = (window.__twCDNRefs ?? 0) + 1;\n\n // Inject config script BEFORE the CDN\n if (!document.getElementById(CONFIG_ID)) {\n const configScript = document.createElement('script');\n configScript.id = CONFIG_ID;\n configScript.textContent = TAILWIND_CDN_CONFIG;\n document.head.appendChild(configScript);\n }\n\n // Inject the NoirMD @theme (primary, base-100, ...) so color\n // classes resolve — must precede the CDN script.\n injectNRTailwindTheme();\n\n // Inject the Tailwind v4 Browser CDN script\n if (!document.getElementById(SCRIPT_ID)) {\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = CDN_URL;\n document.head.appendChild(script);\n loadedRef.current = true;\n }\n\n return () => {\n window.__twCDNRefs = (window.__twCDNRefs ?? 1) - 1;\n if ((window.__twCDNRefs ?? 0) <= 0) {\n document.getElementById(SCRIPT_ID)?.remove();\n document.getElementById(CONFIG_ID)?.remove();\n removeNRTailwindTheme();\n window.__twCDNRefs = 0;\n loadedRef.current = false;\n }\n };\n }, [enabled]);\n}\n\n/**\n * Trigger a Tailwind CDN re-scan (use after DOM mutations with new classes).\n */\nexport function scanTailwindCDN() {\n const tw = (window as any).tailwind;\n if (tw?.scan) tw.scan();\n}\n\n/**\n * Preload the Tailwind Browser CDN right after page load.\n * Uses requestIdleCallback so it doesn't block the main thread.\n * By the time the user opens preview, the CDN is already loaded.\n */\nexport function preloadTailwindCDN() {\n // Already loaded — skip\n if (document.getElementById(SCRIPT_ID)) return;\n\n const inject = () => {\n if (document.getElementById(SCRIPT_ID)) return; // double-check\n\n // Inject config script\n if (!document.getElementById(CONFIG_ID)) {\n const configScript = document.createElement('script');\n configScript.id = CONFIG_ID;\n configScript.textContent = TAILWIND_CDN_CONFIG;\n document.head.appendChild(configScript);\n }\n\n // Inject the NoirMD @theme before the CDN script\n injectNRTailwindTheme();\n\n // Inject CDN script\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = CDN_URL;\n document.head.appendChild(script);\n\n window.__twCDNRefs = (window.__twCDNRefs ?? 0) + 1;\n };\n\n // Wait for idle — don't block initial render\n if ('requestIdleCallback' in window) {\n (window as any).requestIdleCallback(inject, { timeout: 2000 });\n } else {\n // Fallback: load after a short delay\n setTimeout(inject, 200);\n }\n}\n\nexport function useTailwindCDN() {\n useLazyTailwindCDN(true);\n}\n","// ============================================================\n// NoirMD Vanilla — Tailwind v4 theme injection\n//\n// When the host enables the Tailwind Browser CDN (tailwindCDN\n// prop), Tailwind classes authored inside markdown (:::div,\n// :::raw, attrs, ...) are JIT-compiled at runtime. For color\n// utilities like `bg-primary` / `text-secondary` to resolve,\n// Tailwind v4 needs an `@theme` block registering --color-*\n// keys.\n//\n// This module injects a <style type=\"text/tailwindcss\"> block\n// with a daisyUI-compatible @theme (primary, secondary, accent,\n// neutral, base-100/200/300, base-content, info, success,\n// warning, error) wired to the host's --color-* variables, with\n// NoirMD defaults as fallback.\n//\n// Safety: if the host already provides a theme (daisyUI, a\n// Tailwind @theme block, or --color-* theme variables),\n// injection is skipped so the module never overrides the host\n// palette.\n// ============================================================\n\nconst THEME_STYLE_ID = 'nr-tailwind-theme';\n\n// daisyUI 5 / Tailwind v4 convention: the palette lives in\n// --color-* theme variables. Values resolve host vars first\n// (app --color-*, then daisyUI v4 --p/--b1/... components), and\n// fall back to NoirMD defaults. Never references --nr-* (would\n// create a circular dependency with the --nr-accent chain).\nconst NR_THEME_CSS = `\n@theme {\n --color-primary: var(--color-accent-primary, oklch(var(--p, 55% 0.3 240) / 1));\n --color-primary-content: #ffffff;\n --color-secondary: oklch(var(--s, 55% 0.25 200) / 1);\n --color-secondary-content: #ffffff;\n --color-accent: var(--color-accent-primary, oklch(var(--a, 65% 0.25 160) / 1));\n --color-accent-content: #ffffff;\n --color-neutral: oklch(var(--n, 50% 0.05 240) / 1);\n --color-neutral-content: var(--color-text-primary, oklch(var(--nc, 92% 0.02 240) / 1));\n --color-base-100: var(--color-background-primary, oklch(var(--b1, 15% 0.01 260) / 1));\n --color-base-200: var(--color-background-secondary-solid, oklch(var(--b2, 20% 0.02 260) / 1));\n --color-base-300: var(--color-border, oklch(var(--b3, 25% 0.03 260) / 1));\n --color-base-content: var(--color-text-primary, oklch(var(--bc, 92% 0.02 260) / 1));\n --color-info: oklch(var(--in, 70% 0.2 220) / 1);\n --color-info-content: #ffffff;\n --color-success: oklch(var(--su, 65% 0.25 140) / 1);\n --color-success-content: #ffffff;\n --color-warning: oklch(var(--wa, 80% 0.25 80) / 1);\n --color-warning-content: #1f2937;\n --color-error: oklch(var(--er, 65% 0.3 30) / 1);\n --color-error-content: #ffffff;\n}\n`;\n\nfunction getVar(root: HTMLElement, name: string): string {\n return getComputedStyle(root).getPropertyValue(name).trim();\n}\n\nfunction stylesheetHasTheme(): boolean {\n for (const sheet of Array.from(document.styleSheets)) {\n let rules: CSSRuleList | null = null;\n try {\n rules = sheet.cssRules;\n } catch {\n continue; // cross-origin stylesheet — rules are inaccessible\n }\n if (!rules) continue;\n for (const rule of Array.from(rules)) {\n const css = rule.cssText || '';\n if (css.includes('@theme') || css.includes('@plugin \"daisyui\"')) return true;\n }\n }\n return false;\n}\n\n/**\n * Detect whether the host page already provides a color theme\n * (daisyUI, a Tailwind @theme block, or --color-* variables).\n */\nexport function hasHostTheme(): boolean {\n if (typeof window === 'undefined' || typeof document === 'undefined') return true;\n if (getVar(document.documentElement, '--color-primary')) return true;\n if (getVar(document.documentElement, '--color-base-100')) return true;\n if (document.body && (getVar(document.body, '--color-primary') || getVar(document.body, '--color-base-100'))) return true;\n return stylesheetHasTheme();\n}\n\n/**\n * Inject the NoirMD @theme block so Tailwind CDN color classes\n * (bg-primary, text-secondary, ...) resolve inside markdown.\n * Skipped when the host already defines a theme. Idempotent.\n */\nexport function injectNRTailwindTheme(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(THEME_STYLE_ID)) return;\n if (hasHostTheme()) return;\n\n const style = document.createElement('style');\n style.id = THEME_STYLE_ID;\n style.setAttribute('type', 'text/tailwindcss');\n style.textContent = NR_THEME_CSS;\n document.head.appendChild(style);\n}\n\n/**\n * Remove the injected NoirMD @theme block (idempotent).\n */\nexport function removeNRTailwindTheme(): void {\n if (typeof document === 'undefined') return;\n document.getElementById(THEME_STYLE_ID)?.remove();\n}","import React, { useEffect, useRef } from 'react';\nimport { renderMarkdownString } from '../vanilla/renderer';\nimport { scrollToId } from '../core/utils';\nimport { scanTailwindCDN } from './useTailwindCDN';\n\ninterface CustomMarkdownRendererProps {\n content: string;\n}\n\n/**\n * CustomMarkdownRenderer — thin React wrapper around the vanilla renderer.\n *\n * Pipeline:\n * content (string) → renderMarkdownString() → HTMLElement → mounted\n *\n * The vanilla engine handles all rendering, directives and events;\n * React only owns the mount point. Note: rendering happens on the\n * client (useEffect); the server render is an empty placeholder.\n */\nconst CustomMarkdownRenderer: React.FC<CustomMarkdownRendererProps> = ({ content }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n // Clear previous content and mount the vanilla-rendered element\n container.replaceChildren();\n container.appendChild(renderMarkdownString(content));\n\n // Resolve any Tailwind classes in user-authored content (no-op if CDN not loaded)\n scanTailwindCDN();\n\n // Scroll to hash on load and hash changes\n const handleHashChange = () => {\n const hash = window.location.hash;\n if (hash) {\n const parts = hash.split('#');\n scrollToId(parts[parts.length - 1]);\n }\n };\n handleHashChange();\n window.addEventListener('hashchange', handleHashChange);\n return () => window.removeEventListener('hashchange', handleHashChange);\n }, [content]);\n\n return <div ref={containerRef} />;\n};\n\nexport default CustomMarkdownRenderer;","import type { CSSProperties } from './types';\n\n/**\n * Parse an inline CSS string (e.g. \"color: red; padding: 1rem\") into a CSSProperties object.\n */\nexport function parseCssString(cssText: string): CSSProperties {\n if (!cssText) return {};\n return cssText\n .split(';')\n .filter(Boolean)\n .reduce<CSSProperties>((styleObj, styleString) => {\n const parts = styleString.split(':');\n if (parts.length < 2) return styleObj;\n const key = parts[0].trim().replace(/-([a-z])/g, (_, g) => g.toUpperCase());\n const value = parts.slice(1).join(':').trim();\n styleObj[key] = value;\n return styleObj;\n }, {});\n}\n\n/**\n * Generate a URL-safe slug from text (NFD decomposition, strip accents, lowercase, hyphenate).\n */\nexport function generateId(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-');\n}\n\n/**\n * Smooth-scroll to an element by its ID.\n */\nexport function scrollToId(id: string): void {\n if (typeof document === 'undefined') return;\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n}\n\n/**\n * Parse attribute suffix like `##{.my-class #my-id}` from a text line.\n * Returns the cleaned text, extracted classes, and id.\n */\nexport function extractAttributes(text: string): { text: string; classes: string; id: string } {\n const match = text.match(/^(.*?)\\s*##\\{([^}]*)\\}\\s*$/);\n if (!match) return { text, classes: '', id: '' };\n\n const rawAttrs = match[2];\n const cleanedText = match[1];\n\n const classList: string[] = [];\n let id = '';\n\n // 1. Parse key=\"value\" attributes (e.g., class=\"mt-0 px-4\", id=\"section\")\n for (const [, key, value] of rawAttrs.matchAll(/([\\w-]+)=\"([^\"]*)\"/g)) {\n if (key === 'class') {\n classList.push(...value.split(/\\s+/).filter(Boolean));\n } else if (key === 'id') {\n id = value;\n }\n }\n\n // 2. Parse shorthand tokens: .className and #id (from remaining content)\n // Supports classes with / (opacity), ! (important), . (arbitrary values)\n const stripped = rawAttrs.replace(/[\\w-]+=\"[^\"]*\"/g, '');\n for (const token of stripped.split(/\\s+/).filter(Boolean)) {\n if (token.startsWith('.')) classList.push(token.slice(1));\n else if (token.startsWith('#') && !id) id = token.slice(1);\n }\n\n return { text: cleanedText, classes: classList.join(' '), id };\n}\n\nlet _scopeCounter = 0;\nexport function resetScopeCounter(): void {\n _scopeCounter = 0;\n}\n\n/**\n * Generate a unique scope ID for CSS isolation.\n */\nexport function generateScopeId(): string {\n return `scope-${++_scopeCounter}`;\n}\n\n/**\n * Parse props from a `{key=\"value\" key2=\"value2\"}` string.\n * Also supports `.className` shorthand → adds to `class` prop.\n * Also supports `#id` shorthand → adds to `id` prop.\n */\nexport function parseProps(propsString: string): Record<string, string> {\n const props: Record<string, string> = {};\n if (!propsString?.trim()) return props;\n\n // Match key=\"value\" or key='value' pairs\n const pairRegex = /(\\w[\\w-]*)=(?:\"([^\"]*)\"|'([^']*)')/g;\n let match;\n while ((match = pairRegex.exec(propsString)) !== null) {\n const key = match[1];\n const value = match[2] ?? match[3] ?? '';\n props[key] = value;\n }\n\n // Extract .className shorthand (supports / for opacity, ! for important, . for arbitrary values)\n const classMatches = propsString.match(/\\.([a-zA-Z0-9_!/.\\-]+)/g);\n if (classMatches) {\n const existing = props['class'] || '';\n const newClasses = classMatches.map(c => c.substring(1)).join(' ');\n props['class'] = existing ? `${existing} ${newClasses}` : newClasses;\n }\n\n // Extract #id shorthand (only if not inside a key=\"value\" pair)\n const idMatch = propsString.match(/#([a-zA-Z0-9_-]+)(?=\\s|}|$)/);\n if (idMatch && !props['id']) {\n props['id'] = idMatch[1];\n }\n\n return props;\n}\n\n/**\n * Parse raw HTML attributes string (e.g. `class=\"...\" style=\"...\" data-foo=\"...\"`)\n * into a plain props object.\n *\n * NOTE: This does NOT rename `class` → `className`. Framework adapters\n * (React, Vue, etc.) should handle their own attribute name mapping.\n */\nexport function parseHtmlAttrs(attrsString: string): Record<string, any> {\n const props: Record<string, any> = {};\n if (!attrsString?.trim()) return props;\n\n const pairRegex = /([a-zA-Z0-9_-]+)(?:=(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]+)))?/g;\n let match;\n while ((match = pairRegex.exec(attrsString)) !== null) {\n const key = match[1];\n const value = match[2] ?? match[3] ?? match[4] ?? true;\n\n // Parse style strings into objects\n if (key === 'style' && typeof value === 'string') {\n props[key] = parseCssString(value);\n } else {\n props[key] = value;\n }\n }\n\n return props;\n}\n","import type { Token, DirectiveToken, HtmlBlockToken, CSSProperties } from './types';\r\nimport { generateId, generateScopeId, parseProps, extractAttributes } from './utils';\r\n\r\n/**\r\n * V2 Markdown Parser — line-by-line state machine (framework-agnostic).\r\n */\r\nexport function parseMarkdown(markdown: string): Token[] {\r\n if (!markdown) return [];\r\n const lines = markdown.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '').split('\\n');\r\n const result: Token[] = [];\r\n const usedIds = new Set<string>();\r\n let i = 0;\r\n\r\n while (i < lines.length) {\r\n const line = lines[i];\r\n const trimmed = line.trim();\r\n let match: RegExpMatchArray | null;\r\n\r\n // ── Headers: ## Title ──\r\n if ((match = trimmed.match(/^(#{1,6})\\s+(.+)$/))) {\r\n const level = match[1].length;\r\n const rawText = match[2];\r\n const { text, classes, id: customId } = extractAttributes(rawText);\r\n const baseId = customId || generateId(text.replace(/->|<-/g, ''));\r\n let id = baseId;\r\n let n = 1;\r\n while (usedIds.has(id)) {\r\n n++;\r\n id = `${baseId}-${n}`;\r\n }\r\n usedIds.add(id);\r\n result.push({ type: 'header', level, text, id, classes: classes || undefined });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Aligned paragraph: -> text <- or -> text -> ──\r\n if ((match = trimmed.match(/^->\\s*(.+?)\\s*(<-|->)\\s*$/))) {\r\n const content = match[1];\r\n const align = match[2] === '<-' ? 'center' : 'right';\r\n result.push({ type: 'paragraph', content, align });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Code block: ```lang title=\"name\" ──\r\n if (trimmed.startsWith('```')) {\r\n const fenceHeader = trimmed.slice(3).trim();\r\n const titleMatch = fenceHeader.match(/title=[\"']([^\"']*)[\"']/);\r\n const lang = fenceHeader.replace(/title=[\"'][^\"']*[\"']/, '').trim();\r\n const title = titleMatch ? titleMatch[1] : undefined;\r\n const content: string[] = [];\r\n i++;\r\n while (i < lines.length && !lines[i].trim().startsWith('```')) {\r\n content.push(lines[i]);\r\n i++;\r\n }\r\n result.push({ type: 'codeblock', language: lang, title, content: content.join('\\n') });\r\n i++; // skip closing ```\r\n continue;\r\n }\r\n\r\n // ── Directive: :::type {props} ... ::: ──\r\n if (trimmed.startsWith(':::')) {\r\n const rest = trimmed.slice(3).trim();\r\n\r\n // Bare closing marker\r\n if (rest === '') {\r\n result.push({ type: 'paragraph', content: line });\r\n i++;\r\n continue;\r\n }\r\n\r\n const typeMatch = rest.match(/^([\\w-]+)/);\r\n const directiveType = typeMatch ? typeMatch[1] : 'custom';\r\n\r\n // Lookahead: find the matching closing :::\r\n let j = i + 1;\r\n let nestedLevel = 0;\r\n let foundClose = false;\r\n\r\n while (j < lines.length) {\r\n const currentTrimmed = lines[j].trim();\r\n if (currentTrimmed === ':::') {\r\n if (nestedLevel === 0) {\r\n foundClose = true;\r\n break;\r\n } else {\r\n nestedLevel--;\r\n }\r\n } else if (currentTrimmed.startsWith(':::')) {\r\n // Opening a nested directive\r\n nestedLevel++;\r\n }\r\n j++;\r\n }\r\n\r\n if (foundClose) {\r\n // Collect raw content lines (between opening and closing)\r\n const contentLines: string[] = [];\r\n for (let k = i + 1; k < j; k++) {\r\n contentLines.push(lines[k]);\r\n }\r\n const rawContent = contentLines.join('\\n');\r\n\r\n // Parse the directive header (everything after the type name)\r\n const headerRest = typeMatch ? rest.slice(directiveType.length).trim() : rest;\r\n\r\n // Extract {props} block\r\n let propsString = '';\r\n let shortForm = '';\r\n const propsBlockMatch = headerRest.match(/^\\{([^]*)\\}\\s*$/);\r\n if (propsBlockMatch) {\r\n propsString = propsBlockMatch[1];\r\n } else if (headerRest) {\r\n // Short-form: bare text after type → becomes title prop\r\n shortForm = headerRest;\r\n }\r\n\r\n const props = parseProps(propsString);\r\n if (shortForm && !props['title']) {\r\n props['title'] = shortForm;\r\n }\r\n\r\n // Split content into slots\r\n const slots = splitSlots(rawContent);\r\n\r\n result.push({\r\n type: 'directive',\r\n directiveType,\r\n props,\r\n slots,\r\n scopeId: generateScopeId(),\r\n } as DirectiveToken);\r\n\r\n i = j + 1;\r\n continue;\r\n } else {\r\n // Unclosed directive — render as plain text\r\n result.push({ type: 'paragraph', content: line });\r\n i++;\r\n continue;\r\n }\r\n }\r\n\r\n // ── Image: {w:h} ──\r\n if ((match = trimmed.match(/^(.*?)!\\[([^\\]]*)\\]\\(([^)]+?)\\)(?:\\{([^}]+?)\\})?(.*)$/))) {\r\n const [, preText, alt, srcAndFloat, size, postText] = match;\r\n\r\n if (preText.trim()) {\r\n result.push({ type: 'paragraph', content: preText.trim() });\r\n }\r\n\r\n let src = srcAndFloat;\r\n const style: CSSProperties = {};\r\n if (src.includes('#left')) {\r\n src = src.replace('#left', '');\r\n style.float = 'left';\r\n style.margin = '0 1em 1em 0';\r\n } else if (src.includes('#right')) {\r\n src = src.replace('#right', '');\r\n style.float = 'right';\r\n style.margin = '0 0 1em 1em';\r\n } else if (src.includes('#center')) {\r\n src = src.replace('#center', '');\r\n style.display = 'block';\r\n style.margin = '0 auto 1em auto';\r\n }\r\n if (size) {\r\n const [width, height] = size.split(':');\r\n if (width) style.width = width.trim();\r\n if (height) style.height = height.trim();\r\n }\r\n result.push({ type: 'image', alt, src, style });\r\n\r\n if (postText.trim()) {\r\n result.push({ type: 'paragraph', content: postText.trim() });\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Table: | cell | cell | ──\r\n if (trimmed.includes('|') && i + 1 < lines.length && lines[i + 1].includes('---')) {\r\n const tableLines = [line];\r\n i++;\r\n tableLines.push(lines[i]);\r\n i++;\r\n while (i < lines.length && lines[i].trim().includes('|')) {\r\n tableLines.push(lines[i]);\r\n i++;\r\n }\r\n result.push({ type: 'table', content: tableLines.join('\\n') });\r\n continue;\r\n }\r\n\r\n // ── List: - item or 1. item ──\r\n if ((match = trimmed.match(/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/))) {\r\n const listItems = [line];\r\n i++;\r\n while (i < lines.length) {\r\n const nextLine = lines[i];\r\n const nextTrimmed = nextLine.trim();\r\n if (\r\n nextTrimmed.match(/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/) ||\r\n nextTrimmed === '' ||\r\n nextLine.startsWith(' ')\r\n ) {\r\n listItems.push(nextLine);\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n result.push({ type: 'list', content: listItems.join('\\n') });\r\n continue;\r\n }\r\n\r\n // ── Blockquote: > text ──\r\n if (trimmed.startsWith('>')) {\r\n const quoteLines = [line];\r\n i++;\r\n while (i < lines.length && (lines[i].trim().startsWith('>') || lines[i].trim() === '')) {\r\n quoteLines.push(lines[i]);\r\n i++;\r\n }\r\n const rawQuote = quoteLines.join('\\n').replace(/^>\\s?/gm, '');\r\n const { text, classes, id } = extractAttributes(rawQuote);\r\n result.push({ type: 'blockquote', content: text, classes: classes || undefined, id });\r\n continue;\r\n }\r\n\r\n // ── Horizontal rule: --- or ___ or *** ──\r\n if (/^(---|___|(\\*\\s*){3,})\\s*$/.test(trimmed)) {\r\n result.push({ type: 'hr' });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── TOC: [TOC] or [TOC2] ──\r\n if (/^\\[TOC\\d?\\]\\s*$/.test(trimmed)) {\r\n result.push({ type: 'toc' });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Empty line ──\r\n if (trimmed === '') {\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── HTML Block: <tag ...> ──\r\n let tagStartMatch = trimmed.match(/^<([a-zA-Z][\\w-]*)/);\r\n if (tagStartMatch) {\r\n const tagName = tagStartMatch[1].toLowerCase();\r\n\r\n const voidElements = new Set([\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ]);\r\n\r\n const remainingText = lines.slice(i).join('\\n');\r\n\r\n // Find the full opening tag even with multi-line attributes\r\n const openTagRegex = new RegExp(`^\\\\s*<${tagName}\\\\b([^>]*?)>`, 'i');\r\n const openTagMatch = remainingText.match(openTagRegex);\r\n\r\n if (openTagMatch) {\r\n const fullOpenTag = openTagMatch[0];\r\n const attrs = openTagMatch[1].replace(/\\s+/g, ' ').trim();\r\n\r\n const isSelfClosing = fullOpenTag.endsWith('/>') || voidElements.has(tagName);\r\n\r\n if (isSelfClosing) {\r\n const blockText = remainingText.substring(0, openTagMatch.index! + fullOpenTag.length);\r\n const consumedLines = blockText.split('\\n').length;\r\n\r\n result.push({\r\n type: 'html-block',\r\n tag: tagName,\r\n attrs: attrs,\r\n children: [] // No children\r\n } as HtmlBlockToken);\r\n\r\n i += consumedLines;\r\n continue;\r\n } else {\r\n // Tag with content — search for its closing tag\r\n let nestedLevel = 0;\r\n let closeIndex = -1;\r\n let closeTagLength = 0;\r\n\r\n const tagRegex = new RegExp(`</?${tagName}\\\\b[^>]*>`, 'gi');\r\n tagRegex.lastIndex = openTagMatch.index! + fullOpenTag.length;\r\n\r\n let execMatch;\r\n while ((execMatch = tagRegex.exec(remainingText)) !== null) {\r\n if (execMatch[0].startsWith('</')) {\r\n nestedLevel--;\r\n if (nestedLevel < 0) {\r\n closeIndex = execMatch.index;\r\n closeTagLength = execMatch[0].length;\r\n break;\r\n }\r\n } else {\r\n if (!execMatch[0].endsWith('/>')) {\r\n nestedLevel++;\r\n }\r\n }\r\n }\r\n\r\n if (closeIndex !== -1) {\r\n const fullBlock = remainingText.substring(0, closeIndex + closeTagLength);\r\n const consumedLines = fullBlock.split('\\n').length;\r\n\r\n // style/script blocks should not be parsed as Markdown\r\n if (tagName === 'style' || tagName === 'script') {\r\n result.push({\r\n type: 'html',\r\n content: fullBlock,\r\n scopeId: generateScopeId(),\r\n });\r\n } else {\r\n const innerContent = remainingText.substring(openTagMatch.index! + fullOpenTag.length, closeIndex);\r\n result.push({\r\n type: 'html-block',\r\n tag: tagName,\r\n attrs: attrs,\r\n children: parseMarkdown(innerContent)\r\n } as HtmlBlockToken);\r\n }\r\n\r\n i += consumedLines;\r\n continue;\r\n } else {\r\n // Fallback: unclosed tag → treat as self-closing to avoid consuming the whole document\r\n const blockText = remainingText.substring(0, openTagMatch.index! + fullOpenTag.length);\r\n const consumedLines = blockText.split('\\n').length;\r\n\r\n result.push({\r\n type: 'html-block',\r\n tag: tagName,\r\n attrs: attrs,\r\n children: []\r\n } as HtmlBlockToken);\r\n\r\n i += consumedLines;\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ── Paragraph (default) ──\r\n const paragraphLines = [line];\r\n i++;\r\n while (i < lines.length) {\r\n const nextLine = lines[i];\r\n const nextTrimmed = nextLine.trim();\r\n if (\r\n nextTrimmed === '' ||\r\n nextTrimmed.startsWith('#') ||\r\n nextTrimmed.startsWith(':::') ||\r\n nextTrimmed.includes('|') ||\r\n nextTrimmed.match(/^(\\s*)([-*+]|\\d+\\.)\\s+/) ||\r\n nextTrimmed.startsWith('>') ||\r\n nextTrimmed.startsWith('```') ||\r\n nextTrimmed.startsWith('->') ||\r\n nextTrimmed.match(/^<([a-zA-Z][\\w-]*)\\b/)\r\n ) {\r\n break;\r\n }\r\n paragraphLines.push(nextLine);\r\n i++;\r\n }\r\n const rawParagraph = paragraphLines.join('\\n').trim();\r\n const { text, classes, id } = extractAttributes(rawParagraph);\r\n result.push({ type: 'paragraph', content: text, classes: classes || undefined, id });\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ─────────────────────────────────────────────\r\n// Slot splitting\r\n// ─────────────────────────────────────────────\r\n\r\n/**\r\n * Split directive content into named slots.\r\n * A line that is exactly `#slotname` starts a new slot.\r\n * Content before any `#slotname` goes into the \"default\" slot.\r\n *\r\n * IMPORTANT: This is nesting-aware — `#slotname` markers inside nested\r\n * directives (:::child ... :::) are NOT treated as slot boundaries of\r\n * the outer directive. Only `#slotname` at depth 0 are considered.\r\n */\r\nfunction splitSlots(rawContent: string): Record<string, string> {\r\n const slots: Record<string, string> = {};\r\n const lines = rawContent.split('\\n');\r\n let currentSlot = 'default';\r\n let buffer: string[] = [];\r\n let nestingDepth = 0;\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n\r\n // Track nesting of directives\r\n if (trimmed.startsWith(':::')) {\r\n const rest = trimmed.slice(3).trim();\r\n if (rest === '') {\r\n // Closing marker (bare :::)\r\n nestingDepth = Math.max(0, nestingDepth - 1);\r\n } else {\r\n nestingDepth++;\r\n }\r\n }\r\n\r\n // Only consider slot boundaries at depth 0\r\n if (nestingDepth === 0 && trimmed.match(/^#([\\w-]+)$/)) {\r\n // Save previous slot\r\n if (buffer.length > 0 || currentSlot !== 'default') {\r\n slots[currentSlot] = buffer.join('\\n').trim();\r\n }\r\n currentSlot = trimmed.slice(1);\r\n buffer = [];\r\n } else {\r\n buffer.push(line);\r\n }\r\n }\r\n\r\n // Save last slot\r\n slots[currentSlot] = buffer.join('\\n').trim();\r\n\r\n return slots;\r\n}\r\n","import hljs from 'highlight.js/lib/core';\n\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport typescript from 'highlight.js/lib/languages/typescript';\nimport python from 'highlight.js/lib/languages/python';\nimport css from 'highlight.js/lib/languages/css';\nimport xml from 'highlight.js/lib/languages/xml';\nimport json from 'highlight.js/lib/languages/json';\nimport bash from 'highlight.js/lib/languages/bash';\nimport sql from 'highlight.js/lib/languages/sql';\nimport markdown from 'highlight.js/lib/languages/markdown';\nimport java from 'highlight.js/lib/languages/java';\nimport csharp from 'highlight.js/lib/languages/csharp';\nimport cpp from 'highlight.js/lib/languages/cpp';\nimport go from 'highlight.js/lib/languages/go';\nimport rust from 'highlight.js/lib/languages/rust';\nimport php from 'highlight.js/lib/languages/php';\nimport ruby from 'highlight.js/lib/languages/ruby';\nimport swift from 'highlight.js/lib/languages/swift';\nimport kotlin from 'highlight.js/lib/languages/kotlin';\nimport dart from 'highlight.js/lib/languages/dart';\nimport yaml from 'highlight.js/lib/languages/yaml';\nimport toml from 'highlight.js/lib/languages/ini';\nimport dockerfile from 'highlight.js/lib/languages/dockerfile';\nimport diff from 'highlight.js/lib/languages/diff';\nimport shell from 'highlight.js/lib/languages/shell';\n\nhljs.registerLanguage('javascript', javascript);\nhljs.registerLanguage('js', javascript);\nhljs.registerLanguage('jsx', javascript);\nhljs.registerLanguage('typescript', typescript);\nhljs.registerLanguage('ts', typescript);\nhljs.registerLanguage('tsx', typescript);\nhljs.registerLanguage('python', python);\nhljs.registerLanguage('py', python);\nhljs.registerLanguage('css', css);\nhljs.registerLanguage('html', xml);\nhljs.registerLanguage('xml', xml);\nhljs.registerLanguage('svg', xml);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('bash', bash);\nhljs.registerLanguage('sh', bash);\nhljs.registerLanguage('zsh', bash);\nhljs.registerLanguage('sql', sql);\nhljs.registerLanguage('markdown', markdown);\nhljs.registerLanguage('md', markdown);\nhljs.registerLanguage('java', java);\nhljs.registerLanguage('csharp', csharp);\nhljs.registerLanguage('cs', csharp);\nhljs.registerLanguage('cpp', cpp);\nhljs.registerLanguage('go', go);\nhljs.registerLanguage('rust', rust);\nhljs.registerLanguage('php', php);\nhljs.registerLanguage('ruby', ruby);\nhljs.registerLanguage('swift', swift);\nhljs.registerLanguage('kotlin', kotlin);\nhljs.registerLanguage('dart', dart);\nhljs.registerLanguage('yaml', yaml);\nhljs.registerLanguage('toml', toml);\nhljs.registerLanguage('dockerfile', dockerfile);\nhljs.registerLanguage('diff', diff);\nhljs.registerLanguage('shell', shell);\n\nexport default hljs;\n","// ============================================================\r\n// Vanilla UI Component Factories\r\n//\r\n// Each function returns a native HTMLElement. No React, no Tailwind.\r\n// Styling comes from vanilla.css via class names.\r\n// ============================================================\r\n\r\nimport hljs from './highlightSetup';\r\n\r\n// ── Icon ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Create a Material Icons Round icon element.\r\n */\r\nexport function createIcon(iconName: string, extraClasses?: string): HTMLElement {\r\n const span = document.createElement('span');\r\n const cls = `nr-icon material-icons-round${extraClasses ? ` ${extraClasses}` : ''}`;\r\n span.className = cls;\r\n span.setAttribute('aria-hidden', 'true');\r\n\r\n const isCodepoint = /^[eE][0-9a-fA-F]{3,4}$/.test(iconName);\r\n if (isCodepoint) {\r\n span.innerHTML = `&#x${iconName};`;\r\n } else {\r\n span.textContent = iconName;\r\n }\r\n return span;\r\n}\r\n\r\n// ── CodeBlock ─────────────────────────────────────────────\r\n\r\n/**\r\n * Create a syntax-highlighted code block with copy button.\r\n */\r\nexport function createCodeBlock(code: string, language: string, title?: string): HTMLElement {\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-codeblock';\r\n\r\n const lang = language?.split(/[\\s{]/)[0]?.trim() || '';\r\n\r\n // Title bar\r\n if (title) {\r\n const header = document.createElement('div');\r\n header.className = 'nr-codeblock__header';\r\n header.appendChild(createIcon('description'));\r\n const titleSpan = document.createElement('span');\r\n titleSpan.textContent = title;\r\n header.appendChild(titleSpan);\r\n wrapper.appendChild(header);\r\n }\r\n\r\n // Code area\r\n const pre = document.createElement('pre');\r\n pre.className = 'nr-codeblock__pre';\r\n const codeEl = document.createElement('code');\r\n codeEl.className = `language-${lang || 'plaintext'}`;\r\n\r\n try {\r\n if (lang && hljs.getLanguage(lang)) {\r\n codeEl.innerHTML = hljs.highlight(code, { language: lang }).value;\r\n } else {\r\n codeEl.innerHTML = hljs.highlightAuto(code).value;\r\n }\r\n } catch {\r\n codeEl.textContent = code;\r\n }\r\n\r\n pre.appendChild(codeEl);\r\n wrapper.appendChild(pre);\r\n\r\n // Copy button\r\n const copyBtn = document.createElement('button');\r\n copyBtn.className = 'nr-codeblock__copy';\r\n copyBtn.title = 'Copy code';\r\n const copyIcon = createIcon('content_copy');\r\n copyIcon.style.fontSize = '1rem';\r\n copyBtn.appendChild(copyIcon);\r\n\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n copyBtn.addEventListener('click', () => {\r\n navigator.clipboard.writeText(code);\r\n copyIcon.textContent = 'check';\r\n if (timer) clearTimeout(timer);\r\n timer = setTimeout(() => { copyIcon.textContent = 'content_copy'; }, 1800);\r\n });\r\n\r\n wrapper.appendChild(copyBtn);\r\n return wrapper;\r\n}\r\n\r\n// ── Admonition ────────────────────────────────────────────\r\n\r\nconst DEFAULT_ADMONITION_ICONS: Record<string, string> = {\r\n note: 'info',\r\n info: 'lightbulb',\r\n warning: 'warning',\r\n danger: 'report',\r\n greentext: 'subdirectory_arrow_right',\r\n};\r\n\r\n/**\r\n * Create an admonition (alert) box.\r\n * Content should be appended by the caller.\r\n */\r\nexport function createAdmonition(\r\n type: string,\r\n title?: string,\r\n icon?: string,\r\n): HTMLElement {\r\n const el = document.createElement('div');\r\n el.className = `nr-admonition nr-admonition--${type || 'note'}`;\r\n\r\n if (title) {\r\n const header = document.createElement('h5');\r\n header.className = 'nr-admonition__title';\r\n const iconToRender = icon || DEFAULT_ADMONITION_ICONS[type] || 'info';\r\n header.appendChild(createIcon(iconToRender, 'nr-admonition__icon'));\r\n const titleSpan = document.createElement('span');\r\n titleSpan.textContent = title;\r\n header.appendChild(titleSpan);\r\n el.appendChild(header);\r\n }\r\n\r\n const body = document.createElement('div');\r\n body.className = 'nr-admonition__body';\r\n el.appendChild(body);\r\n\r\n return el;\r\n}\r\n\r\n// ── Details (Collapsible) ─────────────────────────────────\r\n\r\n/**\r\n * Create a native <details> collapsible section.\r\n * Content should be appended to the body div.\r\n */\r\nexport function createDetails(\r\n title: string,\r\n icon?: string,\r\n defaultOpen?: boolean,\r\n): HTMLElement {\r\n const details = document.createElement('details');\r\n details.className = 'nr-details';\r\n if (defaultOpen) details.open = true;\r\n\r\n const summary = document.createElement('summary');\r\n summary.className = 'nr-details__summary';\r\n\r\n const iconToRender = icon || 'play_arrow';\r\n const iconEl = createIcon(iconToRender, 'nr-details__icon');\r\n summary.appendChild(iconEl);\r\n\r\n const titleSpan = document.createElement('span');\r\n titleSpan.textContent = title || 'Details';\r\n summary.appendChild(titleSpan);\r\n\r\n // Rotate icon on toggle\r\n details.addEventListener('toggle', () => {\r\n iconEl.classList.toggle('nr-details__icon--open', details.open);\r\n });\r\n\r\n details.appendChild(summary);\r\n\r\n const body = document.createElement('div');\r\n body.className = 'nr-details__body';\r\n details.appendChild(body);\r\n\r\n return details;\r\n}\r\n\r\n// ── Modal (Native <dialog>) ───────────────────────────────\r\n\r\n/**\r\n * Create a native <dialog> modal.\r\n * Content should be appended to the body div.\r\n */\r\nexport function createModal(title: string): HTMLDialogElement {\r\n const dialog = document.createElement('dialog');\r\n dialog.className = 'nr-modal';\r\n\r\n // Backdrop click to close\r\n dialog.addEventListener('click', (e) => {\r\n if (e.target === dialog) {\r\n dialog.close();\r\n }\r\n });\r\n\r\n const popup = document.createElement('div');\r\n popup.className = 'nr-modal__popup';\r\n\r\n // Header\r\n const header = document.createElement('div');\r\n header.className = 'nr-modal__header';\r\n\r\n const titleEl = document.createElement('h2');\r\n titleEl.className = 'nr-modal__title';\r\n titleEl.textContent = title;\r\n header.appendChild(titleEl);\r\n\r\n const closeBtn = document.createElement('button');\r\n closeBtn.className = 'nr-modal__close';\r\n closeBtn.appendChild(createIcon('close'));\r\n closeBtn.addEventListener('click', () => dialog.close());\r\n header.appendChild(closeBtn);\r\n\r\n popup.appendChild(header);\r\n\r\n // Body\r\n const body = document.createElement('div');\r\n body.className = 'nr-modal__body';\r\n popup.appendChild(body);\r\n\r\n dialog.appendChild(popup);\r\n return dialog;\r\n}\r\n\r\n// ── Table ─────────────────────────────────────────────────\r\n\r\n/**\r\n * Render a pipe-delimited markdown table into an HTML table element.\r\n * Returns the outer wrapper div.\r\n */\r\nexport function createTable(\r\n content: string,\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const rows = content.split('\\n').filter(r => r.trim());\r\n if (rows.length < 2) {\r\n const p = document.createElement('p');\r\n p.textContent = content;\r\n return p;\r\n }\r\n\r\n const parseRow = (row: string) =>\r\n row.split('|').map(c => c.trim()).filter(Boolean);\r\n\r\n const headerCells = parseRow(rows[0]);\r\n const bodyRows = rows.slice(2).map(parseRow);\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-table-wrap';\r\n\r\n const table = document.createElement('table');\r\n table.className = 'nr-table';\r\n\r\n // Thead\r\n const thead = document.createElement('thead');\r\n const tr = document.createElement('tr');\r\n for (const cell of headerCells) {\r\n const th = document.createElement('th');\r\n th.className = 'nr-table__th';\r\n th.appendChild(renderInline(cell));\r\n tr.appendChild(th);\r\n }\r\n thead.appendChild(tr);\r\n table.appendChild(thead);\r\n\r\n // Tbody\r\n const tbody = document.createElement('tbody');\r\n for (const cells of bodyRows) {\r\n const tr = document.createElement('tr');\r\n for (const cell of cells) {\r\n const td = document.createElement('td');\r\n td.className = 'nr-table__td';\r\n td.appendChild(renderInline(cell));\r\n tr.appendChild(td);\r\n }\r\n tbody.appendChild(tr);\r\n }\r\n table.appendChild(tbody);\r\n wrapper.appendChild(table);\r\n\r\n return wrapper;\r\n}\r\n\r\n// ── List ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Render a markdown list (ordered or unordered) into HTML.\r\n */\r\nexport function createList(\r\n content: string,\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const lines = content.split('\\n');\r\n const items: { indent: number; marker: string; text: string }[] = [];\r\n\r\n for (const line of lines) {\r\n if (!line.trim()) continue;\r\n const match = line.match(/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/);\r\n if (match) {\r\n items.push({ indent: match[1].length, marker: match[2], text: match[3] });\r\n }\r\n }\r\n\r\n if (items.length === 0) {\r\n const p = document.createElement('p');\r\n p.textContent = content;\r\n return p;\r\n }\r\n\r\n const isOrdered = /^\\d+\\.$/.test(items[0].marker);\r\n const list = document.createElement(isOrdered ? 'ol' : 'ul');\r\n list.className = 'nr-list';\r\n\r\n for (const item of items) {\r\n const li = document.createElement('li');\r\n li.className = 'nr-list__item';\r\n li.appendChild(renderInline(item.text));\r\n list.appendChild(li);\r\n }\r\n\r\n return list;\r\n}\r\n\r\n// ── TOC (Table of Contents) ───────────────────────────────\r\n\r\ninterface TocHeader {\r\n level: number;\r\n text: string;\r\n id: string;\r\n}\r\n\r\n/**\r\n * Create a table of contents from an array of headers.\r\n */\r\nexport function createTOC(\r\n headers: TocHeader[],\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const nav = document.createElement('nav');\r\n nav.className = 'nr-toc';\r\n\r\n const title = document.createElement('div');\r\n title.className = 'nr-toc__title';\r\n title.textContent = 'Table of Contents';\r\n nav.appendChild(title);\r\n\r\n const ul = document.createElement('ul');\r\n ul.className = 'nr-toc__list';\r\n\r\n for (const h of headers) {\r\n const li = document.createElement('li');\r\n li.className = `nr-toc__item nr-toc__item--h${h.level}`;\r\n\r\n const a = document.createElement('a');\r\n a.className = 'nr-toc__link';\r\n a.href = `#${h.id}`;\r\n a.appendChild(renderInline(h.text.replace(/->|<-/g, '').trim()));\r\n a.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n const target = document.getElementById(h.id);\r\n if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n });\r\n\r\n li.appendChild(a);\r\n ul.appendChild(li);\r\n }\r\n\r\n nav.appendChild(ul);\r\n return nav;\r\n}\r\n\r\n// ── Blockquote ────────────────────────────────────────────\r\n\r\n/**\r\n * Create a blockquote element.\r\n */\r\nexport function createBlockquote(\r\n content: string,\r\n classes: string | undefined,\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const el = document.createElement('blockquote');\r\n el.className = `nr-blockquote${classes ? ` ${classes}` : ''}`;\r\n el.appendChild(renderInline(content));\r\n return el;\r\n}\r\n","// ============================================================\r\n// Vanilla Inline Renderer\r\n//\r\n// Parses inline markdown formatting into DOM nodes.\r\n// Returns a DocumentFragment.\r\n// ============================================================\r\n\r\nimport { createIcon } from './components';\r\n\r\n/**\r\n * Render inline markdown text into a DocumentFragment.\r\n *\r\n * Supports: bold, italic, bold-italic, strikethrough, code, highlight,\r\n * spoiler, color text, underline, icons, links, raw HTML tags.\r\n */\r\nexport function renderInline(text: string): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n if (!text) return fragment;\r\n\r\n const regex =\r\n /(\\|\\[[^\\]]+\\]\\||\\*\\*\\*.+?\\*\\*\\*|\\*\\*.+?\\*\\*|_.+?_|~~.+?~~|`[^`]+?`|!~.+?~!|%[^%\\s]+?%[\\s\\S]+?%%|!>.+?<!|==.+?==|\\[[^\\]]+?\\]\\([^)]+?\\)|<[^>]+>)/g;\r\n\r\n let lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n\r\n while ((match = regex.exec(text)) !== null) {\r\n // Append text before this match\r\n if (match.index > lastIndex) {\r\n fragment.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));\r\n }\r\n\r\n fragment.appendChild(parseInlinePart(match[0]));\r\n lastIndex = regex.lastIndex;\r\n }\r\n\r\n // Append remaining text\r\n if (lastIndex < text.length) {\r\n fragment.appendChild(document.createTextNode(text.slice(lastIndex)));\r\n }\r\n\r\n return fragment;\r\n}\r\n\r\n/**\r\n * Parse a single inline markdown token into a DOM node.\r\n */\r\nfunction parseInlinePart(part: string): Node {\r\n let match: RegExpMatchArray | null;\r\n\r\n // Icon: |[[icon-name]]|\r\n if ((match = part.match(/^\\|\\[([^\\]]+)\\]\\|$/))) {\r\n return createIcon(match[1]);\r\n }\r\n\r\n // Underline: !~content~! (supports params: !~color;style;type;text~!)\r\n if ((match = part.match(/^!~(.+?)~!$/))) {\r\n const content = match[1];\r\n const parts = content.split(';');\r\n let color = 'currentColor';\r\n let decorationStyle = 'solid';\r\n let type = 'underline';\r\n let textIndex = 0;\r\n\r\n if (\r\n parts[textIndex]?.match(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/) ||\r\n ['red', 'blue', 'green', 'purple', 'orange', 'yellow', 'pink'].includes(parts[textIndex])\r\n ) {\r\n color = parts[textIndex++];\r\n }\r\n if (['solid', 'double', 'dotted', 'dashed', 'wavy'].includes(parts[textIndex])) {\r\n decorationStyle = parts[textIndex++];\r\n }\r\n if (['underline', 'line-through', 'overline', 'both'].includes(parts[textIndex])) {\r\n type = parts[textIndex] === 'both' ? 'underline line-through' : parts[textIndex++];\r\n }\r\n const innerText = parts.slice(textIndex).join(';');\r\n\r\n const span = document.createElement('span');\r\n span.className = 'nr-underline';\r\n span.style.textDecoration = `${type} ${decorationStyle} ${color}`;\r\n span.style.textDecorationThickness = 'auto';\r\n span.appendChild(renderInline(innerText));\r\n return span;\r\n }\r\n\r\n // Color text: %color%text%%\r\n if ((match = part.match(/%([^%\\s]+?)%([\\s\\S]+?)%%/))) {\r\n const span = document.createElement('span');\r\n span.style.color = match[1];\r\n span.appendChild(renderInline(match[2]));\r\n return span;\r\n }\r\n\r\n // Spoiler: !>text<!\r\n if ((match = part.match(/^!>([^<]+?)<!$/))) {\r\n const span = document.createElement('span');\r\n span.className = 'nr-spoiler';\r\n span.appendChild(renderInline(match[1]));\r\n return span;\r\n }\r\n\r\n // Highlight: ==text==\r\n if ((match = part.match(/^==(.+?)==$/))) {\r\n const mark = document.createElement('mark');\r\n mark.className = 'nr-highlight';\r\n mark.appendChild(renderInline(match[1]));\r\n return mark;\r\n }\r\n\r\n // Bold-italic: ***text***\r\n if ((match = part.match(/^\\*\\*\\*(.+?)\\*\\*\\*$/))) {\r\n const strong = document.createElement('strong');\r\n const em = document.createElement('em');\r\n em.appendChild(renderInline(match[1]));\r\n strong.appendChild(em);\r\n return strong;\r\n }\r\n\r\n // Bold: **text**\r\n if ((match = part.match(/^\\*\\*(.+?)\\*\\*$/))) {\r\n const strong = document.createElement('strong');\r\n strong.appendChild(renderInline(match[1]));\r\n return strong;\r\n }\r\n\r\n // Italic: _text_\r\n if ((match = part.match(/^_(.+?)_$/))) {\r\n const em = document.createElement('em');\r\n em.appendChild(renderInline(match[1]));\r\n return em;\r\n }\r\n\r\n // Strikethrough: ~~text~~\r\n if ((match = part.match(/^~~(.+?)~~$/))) {\r\n const del = document.createElement('del');\r\n del.appendChild(renderInline(match[1]));\r\n return del;\r\n }\r\n\r\n // Inline code: `code`\r\n if ((match = part.match(/^`([^`]+)`$/))) {\r\n const code = document.createElement('code');\r\n code.className = 'nr-inline-code';\r\n code.textContent = match[1];\r\n return code;\r\n }\r\n\r\n // Link: [text](url)\r\n if ((match = part.match(/^\\[([^\\]]+?)\\]\\(([^)]+?)\\)$/))) {\r\n const a = document.createElement('a');\r\n a.className = 'nr-link';\r\n a.href = match[2];\r\n a.target = '_blank';\r\n a.rel = 'noopener noreferrer';\r\n a.appendChild(renderInline(match[1]));\r\n return a;\r\n }\r\n\r\n // Raw HTML tag: <tag>...</tag>\r\n if (part.startsWith('<') && part.endsWith('>')) {\r\n const span = document.createElement('span');\r\n span.innerHTML = part;\r\n return span;\r\n }\r\n\r\n // Fallback: plain text\r\n return document.createTextNode(part);\r\n}\r\n","// ============================================================\n// Admonition Directive (vanilla)\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createAdmonition } from '../components';\n\nconst admonitionDirective: DirectiveRendererFn = ({ directiveType, props, renderSlot }) => {\n const el = createAdmonition(directiveType, props.title, props.icon);\n\n if (props.class) el.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) el.setAttribute('style', props.style);\n\n // Append default slot content into the body\n const body = el.querySelector('.nr-admonition__body');\n if (body) {\n body.appendChild(renderSlot('default'));\n }\n\n return el;\n};\n\nexport default admonitionDirective;\n","// ============================================================\n// Details Directive (vanilla)\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createDetails } from '../components';\n\nconst detailsDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const el = createDetails(\n props.title || 'Details',\n props.icon,\n props.defaultOpen === 'true',\n );\n\n if (props.class) el.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) el.setAttribute('style', props.style);\n\n // Append default slot into the body\n const body = el.querySelector('.nr-details__body');\n if (body) {\n body.appendChild(renderSlot('default'));\n }\n\n return el;\n};\n\nexport default detailsDirective;\n","// ============================================================\r\n// Modal Directive (vanilla)\r\n// ============================================================\r\n\r\nimport type { DirectiveRendererFn } from './index';\r\nimport { createIcon, createModal } from '../components';\r\n\r\nconst modalDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\r\n const label = props.label || props.title || 'Open';\r\n const modalTitle = props.title || 'Modal';\r\n const customClass = props.class || '';\r\n\r\n // Wrapper\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-modal-trigger';\r\n\r\n // Button to open modal\r\n const btn = document.createElement('button');\r\n btn.className = `nr-button nr-button--default`;\r\n if (customClass) btn.classList.add(...customClass.split(/\\s+/).filter(Boolean));\r\n\r\n const icon = props.icon || 'open_in_new';\r\n if (icon) btn.appendChild(createIcon(icon));\r\n btn.appendChild(document.createTextNode(label));\r\n\r\n // Create the native dialog\r\n const dialog = createModal(modalTitle);\r\n const body = dialog.querySelector('.nr-modal__body');\r\n if (body) {\r\n // Wrap in .nr-prose so the teleported content keeps module\r\n // typography and tokens once the dialog moves to <body>.\r\n const prose = document.createElement('div');\r\n prose.className = 'nr-prose';\r\n prose.appendChild(renderSlot('default'));\r\n body.appendChild(prose);\r\n }\r\n\r\n btn.addEventListener('click', () => {\r\n if (!dialog.open) {\r\n document.body.appendChild(dialog); // append to body for proper layering\r\n dialog.showModal();\r\n dialog.addEventListener('close', () => {\r\n dialog.remove();\r\n }, { once: true });\r\n }\r\n });\r\n\r\n wrapper.appendChild(btn);\r\n wrapper.appendChild(dialog);\r\n\r\n return wrapper;\r\n};\r\n\r\nexport default modalDirective;\r\n","// ============================================================\n// Button Directive (vanilla)\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createIcon } from '../components';\n\nconst buttonDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const url = props.url || props.href || '#';\n const label = props.label;\n const icon = props.icon || 'near_me';\n const target = props.target || '_blank';\n const customClass = props.class || '';\n\n // Wrapper\n const wrapper = document.createElement('div');\n wrapper.className = 'nr-button-wrap';\n\n // If label is provided, use it directly\n if (label) {\n const a = document.createElement('a');\n a.href = url;\n a.target = target;\n a.rel = 'noopener noreferrer';\n a.className = 'nr-button nr-button--default';\n if (customClass) a.classList.add(...customClass.split(/\\s+/).filter(Boolean));\n a.appendChild(createIcon(icon));\n a.appendChild(document.createTextNode(label));\n wrapper.appendChild(a);\n return wrapper;\n }\n\n // Otherwise render slot content\n const slotContent = renderSlot('default');\n\n // Check if slot contains <a> links — wrap each in a button style\n const links = slotContent.querySelectorAll('a');\n if (links.length > 0) {\n links.forEach(link => {\n link.classList.add('nr-button', 'nr-button--default');\n if (customClass) link.classList.add(...customClass.split(/\\s+/).filter(Boolean));\n });\n wrapper.appendChild(slotContent);\n } else {\n // Fallback: wrap in an <a> tag\n const a = document.createElement('a');\n a.href = url;\n a.target = target;\n a.rel = 'noopener noreferrer';\n a.className = 'nr-button nr-button--default';\n if (customClass) a.classList.add(...customClass.split(/\\s+/).filter(Boolean));\n a.appendChild(createIcon(icon));\n a.appendChild(slotContent);\n wrapper.appendChild(a);\n }\n\n return wrapper;\n};\n\nexport default buttonDirective;\n","// ============================================================\n// Card Directive (vanilla)\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createIcon, createModal } from '../components';\nimport { parseCssString } from '../../core/utils';\n\nconst cardDirective: DirectiveRendererFn = ({\n directiveType,\n props,\n slots,\n renderSlot,\n options,\n}) => {\n const { title, image, icon, url, target } = props;\n const customClass = props.class || '';\n const hasDescription = !!slots.description;\n const { isSingleCard } = (options || {}) as { isSingleCard?: boolean };\n\n const isModal = directiveType === 'card-m';\n const isLink = directiveType === 'card-b';\n\n const inlineStyles = props.style ? parseCssString(props.style) : {};\n\n const card = document.createElement('div');\n card.className = `nr-card${isModal || isLink ? ' nr-card--interactive' : ''} ${customClass}`.trim();\n\n // Apply inline styles\n for (const [key, value] of Object.entries(inlineStyles)) {\n card.style.setProperty(key, String(value));\n }\n\n // Image banner\n if (image) {\n const imgWrap = document.createElement('div');\n imgWrap.className = `nr-card__image${isSingleCard ? ' nr-card__image--tall' : ''}`;\n const img = document.createElement('img');\n img.src = image;\n img.alt = title || '';\n img.className = 'nr-card__img';\n imgWrap.appendChild(img);\n const gradient = document.createElement('div');\n gradient.className = 'nr-card__gradient';\n imgWrap.appendChild(gradient);\n card.appendChild(imgWrap);\n }\n\n // Content body\n const body = document.createElement('div');\n body.className = `nr-card__body${image ? ' nr-card__body--overlap' : ''}`;\n\n // Header: Icon + Title\n if (icon || title) {\n const header = document.createElement('div');\n header.className = 'nr-card__header';\n if (icon) {\n const iconWrap = document.createElement('div');\n iconWrap.className = 'nr-card__icon-wrap';\n iconWrap.appendChild(createIcon(icon));\n header.appendChild(iconWrap);\n }\n if (title) {\n const h3 = document.createElement('h3');\n h3.className = 'nr-card__title';\n h3.textContent = title;\n header.appendChild(h3);\n }\n body.appendChild(header);\n }\n\n // Description\n if (hasDescription) {\n const desc = document.createElement('div');\n desc.className = 'nr-card__description';\n desc.appendChild(renderSlot('description'));\n body.appendChild(desc);\n }\n\n // Content (for card type)\n if (directiveType === 'card') {\n const contentSlot = renderSlot('content') || renderSlot('default');\n if (contentSlot.childNodes.length > 0) {\n const contentDiv = document.createElement('div');\n contentDiv.className = 'nr-card__content';\n contentDiv.appendChild(contentSlot);\n body.appendChild(contentDiv);\n }\n }\n\n // Action link for card-m / card-b\n if (isModal || isLink) {\n const action = document.createElement('div');\n action.className = 'nr-card__action';\n\n if (isLink && url) {\n const a = document.createElement('a');\n a.href = url;\n a.target = target || '_blank';\n a.rel = 'noopener noreferrer';\n a.className = 'nr-card__action-link';\n a.appendChild(createIcon('open_in_new'));\n a.appendChild(document.createTextNode(' Link'));\n action.appendChild(a);\n } else if (isModal) {\n const modalBtn = document.createElement('div');\n modalBtn.className = 'nr-card__action-link';\n modalBtn.appendChild(createIcon('arrow_forward'));\n modalBtn.appendChild(document.createTextNode(' Abrir'));\n action.appendChild(modalBtn);\n }\n\n body.appendChild(action);\n }\n\n card.appendChild(body);\n\n // For card-m: attach modal\n if (isModal) {\n const dialog = createModal(title || 'Detalles');\n const modalBody = dialog.querySelector('.nr-modal__body');\n if (modalBody) {\n // Wrap in .nr-prose so the teleported content keeps module\n // typography and tokens once the dialog moves to <body>.\n const prose = document.createElement('div');\n prose.className = 'nr-prose';\n prose.appendChild(renderSlot('content') || renderSlot('default'));\n modalBody.appendChild(prose);\n }\n\n card.addEventListener('click', () => {\n if (!dialog.open) {\n document.body.appendChild(dialog);\n dialog.showModal();\n dialog.addEventListener('close', () => dialog.remove(), { once: true });\n }\n });\n\n // Return fragment with card + dialog\n const frag = document.createDocumentFragment();\n frag.appendChild(card);\n frag.appendChild(dialog);\n return frag;\n }\n\n // For card-b: click opens URL\n if (isLink && url) {\n card.addEventListener('click', () => window.open(url, target || '_blank'));\n }\n\n return card;\n};\n\nexport default cardDirective;\n","// ============================================================\n// Wrapper Directive (vanilla)\n//\n// Generic layout wrapper for: div, style, custom, raw\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { parseCssString } from '../../core/utils';\n\nconst wrapperDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const el = document.createElement('div');\n el.className = 'nr-wrapper';\n\n if (props.class) el.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.id) el.id = props.id;\n\n // Inline styles\n if (props.style) {\n const styles = parseCssString(props.style);\n for (const [key, value] of Object.entries(styles)) {\n el.style.setProperty(key, String(value));\n }\n }\n\n // data-* attributes\n for (const [key, value] of Object.entries(props)) {\n if (key.startsWith('data-')) {\n el.setAttribute(key, value);\n }\n }\n\n el.appendChild(renderSlot('default'));\n return el;\n};\n\nexport default wrapperDirective;\n","// ============================================================\n// Slide Directive (vanilla)\n//\n// Single-line text carousel with CSS-driven slide-up rotation.\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { parseCssString } from '../../core/utils';\n\nlet slideCounter = 0;\n\nconst slideDirective: DirectiveRendererFn = ({\n props,\n slots,\n renderInline,\n renderMarkdown,\n}) => {\n const rawContent = slots.default || '';\n const lines = rawContent\n .split('\\n')\n .map(l => l.trim())\n .filter(Boolean);\n\n if (lines.length === 0) {\n return document.createDocumentFragment();\n }\n\n const interval = parseInt(props.interval || '3000', 10);\n const speed = parseInt(props.speed || '500', 10);\n const rawClass = props.class || '';\n const inlineStyle = props.style ? parseCssString(props.style) : {};\n\n const scopeClass = `sld-${++slideCounter}`;\n\n // Container\n const container = document.createElement('div');\n container.className = 'nr-slide';\n Object.assign(container.style, {\n position: 'relative',\n overflow: 'hidden',\n ...inlineStyle,\n });\n\n // Inner track (holds all slides, animated via translateY)\n const track = document.createElement('div');\n track.className = 'nr-slide__track';\n track.style.transition = `transform ${speed}ms cubic-bezier(0.16, 1, 0.3, 1)`;\n\n // Create slide elements\n const slideEls: HTMLElement[] = [];\n for (const line of lines) {\n const slideEl = document.createElement('div');\n slideEl.className = `nr-slide__item ${scopeClass} ${rawClass}`.trim();\n slideEl.style.display = 'flex';\n slideEl.style.alignItems = 'center';\n\n // Parse each line as markdown\n if (renderMarkdown) {\n const tokens = renderMarkdown(line);\n slideEl.appendChild(tokens);\n } else if (renderInline) {\n slideEl.appendChild(renderInline(line));\n }\n\n track.appendChild(slideEl);\n slideEls.push(slideEl);\n }\n\n container.appendChild(track);\n\n // Measure and animate\n let current = 0;\n let maxH = 0;\n\n const measureAndSetHeight = () => {\n maxH = 0;\n for (const el of slideEls) {\n maxH = Math.max(maxH, el.offsetHeight);\n }\n if (maxH > 0) {\n container.style.height = `${maxH}px`;\n for (const el of slideEls) {\n el.style.height = `${maxH}px`;\n }\n }\n };\n\n // Initial measurement after DOM attach\n requestAnimationFrame(() => {\n measureAndSetHeight();\n // Re-measure after fonts load\n if (document.fonts?.ready) {\n document.fonts.ready.then(measureAndSetHeight);\n }\n });\n\n // Rotation\n if (lines.length > 1) {\n setInterval(() => {\n current = (current + 1) % lines.length;\n track.style.transform = `translateY(${-current * maxH}px)`;\n }, interval);\n }\n\n return container;\n};\n\nexport default slideDirective;\n","// ============================================================\n// Vanilla Directive Registry\n//\n// Maps directive type strings to vanilla renderer functions.\n// ============================================================\n\nimport type { Token } from '../../core/types';\n\n// ── Context passed to directive renderers ──\n\nexport interface VanillaRenderContext {\n /** Parse markdown string into tokens */\n parseMarkdown: (md: string) => Token[];\n /** Render tokens into an HTMLElement */\n renderElements: (tokens: Token[]) => HTMLElement;\n /** Render inline text into a DocumentFragment */\n renderInline: (text: string) => DocumentFragment;\n /** Parse markdown string and render into an HTMLElement */\n renderMarkdown: (md: string) => HTMLElement;\n}\n\nexport interface DirectiveProps {\n /** The directive type string */\n directiveType: string;\n /** Parsed key=\"value\" attributes */\n props: Record<string, string>;\n /** Named slots → raw content strings */\n slots: Record<string, string>;\n /** Render a named slot as parsed markdown */\n renderSlot: (name: string) => DocumentFragment;\n /** Render context */\n context: VanillaRenderContext;\n /** Position index */\n index: number;\n /** Full parsed AST */\n allElements: Token[];\n /** Extra flags */\n options?: Record<string, any>;\n /** Inline renderer shortcut */\n renderInline: (text: string) => DocumentFragment;\n /** Full markdown renderer shortcut (for complex directives like slide) */\n renderMarkdown?: (md: string) => HTMLElement;\n}\n\nexport type DirectiveRendererFn = (props: DirectiveProps) => HTMLElement | DocumentFragment;\n\n// ── Import directive implementations ──\n\nimport admonitionDirective from './admonition';\nimport detailsDirective from './details';\nimport modalDirective from './modal';\nimport buttonDirective from './button';\nimport cardDirective from './card';\nimport wrapperDirective from './wrapper';\nimport slideDirective from './slide';\n\n// ── Registry ──\n\nconst directiveRegistry: Record<string, DirectiveRendererFn> = {\n // Admonitions\n note: admonitionDirective,\n info: admonitionDirective,\n warning: admonitionDirective,\n danger: admonitionDirective,\n greentext: admonitionDirective,\n // Cards\n card: cardDirective,\n 'card-m': cardDirective,\n 'card-b': cardDirective,\n // Interactive\n details: detailsDirective,\n modal: modalDirective,\n button: buttonDirective,\n // Layout / generic wrappers\n div: wrapperDirective,\n style: wrapperDirective,\n custom: wrapperDirective,\n raw: wrapperDirective,\n // Animation\n slide: slideDirective,\n};\n\nexport default directiveRegistry;\n","// ============================================================\r\n// Vanilla Markdown Renderer\r\n//\r\n// Pipeline: Token[] → processElements() → HTMLElement\r\n// No React, no Tailwind. Pure DOM + CSS classes.\r\n// ============================================================\r\n\r\nimport type { Token, DirectiveToken, HtmlBlockToken, HtmlToken } from '../core/types';\r\nimport { parseMarkdown } from '../core/parser';\r\nimport { scrollToId, parseHtmlAttrs } from '../core/utils';\r\nimport { renderInline } from './inline';\r\nimport {\r\n createCodeBlock,\r\n createTable,\r\n createList,\r\n createTOC,\r\n createBlockquote,\r\n} from './components';\r\nimport directiveRegistry, { type VanillaRenderContext, type DirectiveProps } from './directives';\r\n\r\n/**\r\n * Render parsed markdown tokens into an HTMLElement.\r\n *\r\n * @param tokens - Array of tokens from `parseMarkdown()`\r\n * @returns The root `<article class=\"nr-prose\">` element\r\n */\r\nexport function renderTokens(tokens: Token[]): HTMLElement {\r\n const article = document.createElement('article');\r\n article.className = 'nr-prose';\r\n\r\n const ctx: VanillaRenderContext = {\r\n parseMarkdown,\r\n renderElements: (tks) => renderTokensInner(tks, ctx),\r\n renderInline,\r\n renderMarkdown: (md: string) => renderTokensInner(parseMarkdown(md), ctx),\r\n };\r\n\r\n article.appendChild(processElements(tokens, ctx, tokens));\r\n return article;\r\n}\r\n\r\n/**\r\n * Convenience: parse markdown string and render directly.\r\n */\r\nexport function renderMarkdownString(markdown: string): HTMLElement {\r\n const tokens = parseMarkdown(markdown);\r\n return renderTokens(tokens);\r\n}\r\n\r\n/**\r\n * Render a raw HTML string into a wrapper element.\r\n * Extracts <style> blocks (injected globally into <head>) and\r\n * force-executes any <script> tags.\r\n */\r\nexport function renderHtmlString(html: string): HTMLElement {\r\n let processedContent = html;\r\n\r\n // Extract <style> blocks and inject globally\r\n processedContent = processedContent.replace(\r\n /<style(?:\\s+[^>]*)?>([\\s\\S]*?)<\\/style>/gi,\r\n (_match: string, cssContent: string) => {\r\n const styleEl = document.createElement('style');\r\n styleEl.setAttribute('data-nr-global', '');\r\n styleEl.textContent = cssContent;\r\n document.head.appendChild(styleEl);\r\n return '';\r\n }\r\n );\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-raw-html';\r\n wrapper.innerHTML = processedContent;\r\n\r\n // Force-execute injected scripts\r\n const scripts = wrapper.querySelectorAll('script');\r\n scripts.forEach(oldScript => {\r\n const newScript = document.createElement('script');\r\n Array.from(oldScript.attributes).forEach(attr =>\r\n newScript.setAttribute(attr.name, attr.value)\r\n );\r\n newScript.textContent = oldScript.textContent;\r\n oldScript.parentNode?.replaceChild(newScript, oldScript);\r\n });\r\n\r\n return wrapper;\r\n}\r\n\r\n/**\r\n * Render tokens into an HTMLElement (internal, creates a container).\r\n */\r\nfunction renderTokensInner(tokens: Token[], ctx: VanillaRenderContext): HTMLElement {\r\n const container = document.createElement('div');\r\n container.appendChild(processElements(tokens, ctx, tokens));\r\n return container;\r\n}\r\n\r\n/**\r\n * Process an array of tokens into a DocumentFragment.\r\n */\r\nfunction processElements(\r\n elements: Token[],\r\n ctx: VanillaRenderContext,\r\n allElements: Token[],\r\n): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n let i = 0;\r\n\r\n while (i < elements.length) {\r\n const el = elements[i];\r\n\r\n // Batch consecutive cards into a grid\r\n if (el.type === 'directive' && ['card', 'card-m', 'card-b'].includes(el.directiveType)) {\r\n const cards: Token[] = [];\r\n while (\r\n i < elements.length &&\r\n elements[i].type === 'directive' &&\r\n ['card', 'card-m', 'card-b'].includes((elements[i] as DirectiveToken).directiveType)\r\n ) {\r\n cards.push(elements[i]);\r\n i++;\r\n }\r\n\r\n if (cards.length === 1 || (cards[0] as DirectiveToken).props?.batch === 'off') {\r\n for (const card of cards) {\r\n const rendered = renderElement(card, ctx, allElements);\r\n if (rendered) fragment.appendChild(rendered);\r\n }\r\n } else {\r\n const grid = document.createElement('div');\r\n grid.className = 'nr-card-grid';\r\n for (const card of cards) {\r\n const rendered = renderElement(card, ctx, allElements);\r\n if (rendered) grid.appendChild(rendered);\r\n }\r\n fragment.appendChild(grid);\r\n }\r\n } else {\r\n const rendered = renderElement(el, ctx, allElements);\r\n if (rendered) fragment.appendChild(rendered);\r\n i++;\r\n }\r\n }\r\n\r\n return fragment;\r\n}\r\n\r\n/**\r\n * Render a single token into a Node.\r\n */\r\nfunction renderElement(\r\n element: Token,\r\n ctx: VanillaRenderContext,\r\n allElements: Token[],\r\n): Node | null {\r\n switch (element.type) {\r\n case 'header': {\r\n const tag = `h${element.level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\r\n let text = element.text;\r\n\r\n // Alignment modifiers\r\n const alignCenter = text.match(/^->\\s*(.+?)\\s*<-\\s*$/);\r\n const alignRight = text.match(/^->\\s*(.+?)\\s*->\\s*$/);\r\n if (alignCenter) text = alignCenter[1];\r\n else if (alignRight) text = alignRight[1];\r\n\r\n const h = document.createElement(tag);\r\n h.id = element.id;\r\n let cls = `md-h${element.level}`;\r\n if (alignCenter) cls += ' text-center';\r\n if (alignRight) cls += ' text-right';\r\n if (element.classes) cls += ` ${element.classes}`;\r\n h.className = cls;\r\n h.appendChild(renderInline(text));\r\n return h;\r\n }\r\n\r\n case 'paragraph': {\r\n const p = document.createElement('p');\r\n let cls = 'md-p';\r\n if (element.classes) cls += ` ${element.classes}`;\r\n if (element.align) cls += ` text-${element.align}`;\r\n p.className = cls;\r\n if (element.id) p.id = element.id;\r\n\r\n const lines = element.content.split('\\n');\r\n for (let li = 0; li < lines.length; li++) {\r\n const line = lines[li];\r\n const hardBreakMatch = line.match(/^(.*?)(\\s{2,})$/);\r\n if (hardBreakMatch) {\r\n p.appendChild(renderInline(hardBreakMatch[1]));\r\n p.appendChild(document.createElement('br'));\r\n } else {\r\n p.appendChild(renderInline(line));\r\n if (li < lines.length - 1) {\r\n p.appendChild(document.createTextNode(' '));\r\n }\r\n }\r\n }\r\n return p;\r\n }\r\n\r\n case 'codeblock':\r\n return createCodeBlock(element.content, element.language, element.title);\r\n\r\n case 'directive':\r\n return renderDirective(element, ctx, allElements);\r\n\r\n case 'html': {\r\n const el = element as HtmlToken;\r\n return renderHtmlString(el.content);\r\n }\r\n\r\n case 'html-block': {\r\n const htmlBlock = element as HtmlBlockToken;\r\n const rawProps = parseHtmlAttrs(htmlBlock.attrs);\r\n\r\n const el = document.createElement(htmlBlock.tag);\r\n // Apply attributes (keep as-is, no React renaming needed)\r\n for (const [key, value] of Object.entries(rawProps)) {\r\n if (key === 'style' && typeof value === 'object') {\r\n for (const [prop, val] of Object.entries(value)) {\r\n el.style.setProperty(prop, String(val));\r\n }\r\n } else if (value === true) {\r\n el.setAttribute(key, '');\r\n } else {\r\n el.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // Recurse children\r\n const childFrag = processElements(htmlBlock.children, ctx, allElements);\r\n el.appendChild(childFrag);\r\n return el;\r\n }\r\n\r\n case 'image': {\r\n const img = document.createElement('img');\r\n img.src = element.src;\r\n img.alt = element.alt;\r\n img.className = 'nr-image';\r\n if (element.style) {\r\n for (const [key, value] of Object.entries(element.style)) {\r\n img.style.setProperty(key, String(value));\r\n }\r\n }\r\n return img;\r\n }\r\n\r\n case 'table':\r\n return createTable(element.content, renderInline);\r\n\r\n case 'list':\r\n return createList(element.content, renderInline);\r\n\r\n case 'blockquote':\r\n return createBlockquote(element.content, element.classes, renderInline);\r\n\r\n case 'hr': {\r\n const hr = document.createElement('hr');\r\n hr.className = 'nr-hr';\r\n return hr;\r\n }\r\n\r\n case 'toc': {\r\n const headers = allElements.filter((e): e is Token & { type: 'header' } => e.type === 'header');\r\n return createTOC(headers.map(h => ({ level: h.level, text: h.text, id: h.id })), renderInline);\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Render a directive token.\r\n */\r\nfunction renderDirective(\r\n element: DirectiveToken,\r\n ctx: VanillaRenderContext,\r\n allElements: Token[],\r\n): Node | null {\r\n const { directiveType, props, slots, scopeId } = element;\r\n\r\n const renderer = directiveRegistry[directiveType];\r\n\r\n // renderSlot helper: parse slot content as markdown and render\r\n const renderSlot = (name: string): DocumentFragment => {\r\n const frag = document.createDocumentFragment();\r\n const slotContent = slots[name];\r\n if (!slotContent) return frag;\r\n const tokens = ctx.parseMarkdown(slotContent);\r\n frag.appendChild(ctx.renderElements(tokens));\r\n return frag;\r\n };\r\n\r\n const directiveProps: DirectiveProps = {\r\n directiveType,\r\n props,\r\n slots,\r\n renderSlot,\r\n context: ctx,\r\n index: 0,\r\n allElements,\r\n renderInline,\r\n renderMarkdown: ctx.renderMarkdown,\r\n };\r\n\r\n if (renderer) {\r\n return renderer(directiveProps);\r\n }\r\n\r\n // Fallback: unknown directive → render as a div with default slot\r\n const fallback = document.createElement('div');\r\n fallback.className = 'nr-unknown-directive';\r\n fallback.appendChild(renderSlot('default'));\r\n return fallback;\r\n}\r\n"],"mappings":"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","names":["import_react","t","import_language","import_highlight","import_react","css","import_react","markdown","text","classes","id","hljs","javascript","typescript","python","css","xml","json","bash","sql","markdown","java","csharp","cpp","go","rust","php","ruby","swift","kotlin","dart","yaml","toml","dockerfile","diff","shell","renderInline","tr","renderInline","markdown","import_jsx_runtime","t","React","CodeMirror"]}
|