@noirmd/previewer 1.0.0 → 1.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.mjs → NReditor.cjs} +348 -317
- package/dist/{NReditor.mjs.map → NReditor.cjs.map} +1 -1
- package/dist/NReditor.js +316 -347
- package/dist/NReditor.js.map +1 -1
- package/dist/{index.mjs → index.cjs} +192 -166
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +165 -191
- package/dist/index.js.map +1 -1
- package/package.json +12 -19
- package/dist/index.mjs.map +0 -1
- /package/dist/{NReditor.d.mts → NReditor.d.cts} +0 -0
- /package/dist/{index.d.mts → index.d.cts} +0 -0
package/dist/NReditor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../NReditor.tsx","../custom-syntax.ts","../useDebounce.ts","../CustomMarkdownRenderer.tsx","../utils.ts","../parser.ts","../ui-components.tsx","../highlightSetup.ts","../renderers.tsx","../directives/AdmonitionDirective.tsx","../directives/CardDirective.tsx","../directives/DetailsDirective.tsx","../directives/ModalDirective.tsx","../directives/ButtonDirective.tsx","../directives/WrapperDirective.tsx","../directives/SlideDirective.tsx","../directives/index.ts","../DirectiveRenderer.tsx","../RawHtmlRenderer.tsx","../useTailwindCDN.ts","../context.tsx"],"sourcesContent":["import React, { useRef, useState } from 'react';\nimport CodeMirror, { ReactCodeMirrorProps } from '@uiw/react-codemirror';\nimport { EditorView, Decoration, ViewPlugin, ViewUpdate, lineNumbers, scrollPastEnd, 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 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}\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/markdown.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}) => {\n const editorRef = useRef<EditorView | null>(null);\n const [isAllFolded, setIsAllFolded] = useState(false);\n const [editorMode, setEditorMode] = useState<EditorMode>('editor');\n const debouncedContent = useDebounce(value, debounceMs);\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 scrollPastEnd(),\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={`relative flex-1 flex flex-col min-h-0 ${className || ''}`}>\n {/* Mode toolbar */}\n <div className=\"flex items-center justify-between px-2 py-1.5 border-b border-border/30 bg-background-secondary-solid/50 rounded-t-2xl shrink-0\">\n <button\n onClick={handleToggleFold}\n className=\"p-1 px-2 text-xs font-bold bg-background-secondary-solid border border-border rounded hover:bg-border text-accent-primary transition-colors\"\n title={isAllFolded ? 'Expand all' : 'Collapse all'}\n >\n {isAllFolded ? '╩' : '╦'}\n </button>\n\n <div className=\"flex items-center gap-0.5 bg-black/10 dark:bg-white/5 rounded-lg p-0.5\">\n {modeButtons.map(btn => (\n <button\n key={btn.key}\n onClick={() => setEditorMode(btn.key)}\n className={`flex items-center gap-1 px-2.5 py-1 text-xs rounded-md transition-colors ${\n editorMode === btn.key\n ? 'bg-accent-primary/20 text-accent-primary font-semibold'\n : 'text-text-secondary hover:text-text-primary hover:bg-white/5'\n }`}\n title={btn.label}\n >\n <span className=\"material-symbols-rounded text-sm\">{btn.icon}</span>\n <span className=\"hidden sm:inline\">{btn.label}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Content area — editor / split / preview */}\n <div className=\"flex-1 min-h-0 flex\">\n {(editorMode === 'editor' || editorMode === 'split') && (\n <div\n className={`${\n editorMode === 'split' ? 'w-1/2 border-r border-border/30' : 'w-full'\n } flex-1 flex flex-col min-h-0 min-w-0`}\n >\n <CodeMirror\n value={value}\n onChange={onChange}\n className=\"flex-1 min-h-0 min-w-0\"\n height=\"100%\"\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={`${\n editorMode === 'split' ? 'w-1/2' : 'w-full'\n } flex-1 min-h-0 overflow-auto min-w-0`}\n >\n <div className=\"nr-prose h-full shadow-xs overflow-auto p-4\">\n <CustomMarkdownRenderer content={debouncedContent} />\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 React, { useState, useEffect, useCallback, useMemo, useId, useRef } from 'react';\r\nimport type { Token, DirectiveToken, HtmlBlockToken, RenderContext } from './types';\r\nimport { parseMarkdown } from './parser';\r\nimport { renderInline, renderTable, renderList, extractHeaders } from './renderers';\r\nimport { CodeBlock } from './ui-components';\r\nimport DirectiveRenderer from './DirectiveRenderer';\r\nimport RawHtmlRenderer from './RawHtmlRenderer';\r\nimport { RenderContextProvider } from './context';\r\nimport { scrollToId, resetScopeCounter, parseCssString, parseHtmlAttrs } from './utils';\r\n\r\ninterface CustomMarkdownRendererProps {\r\n content: string;\r\n}\r\n\r\n/**\r\n * V2 CustomMarkdownRenderer — main orchestrator.\r\n *\r\n * Pipeline:\r\n * content (string)\r\n * → parseMarkdown() → allElements (Token[])\r\n * → processAndRenderElements() → React tree\r\n *\r\n * Note: Tailwind CDN injection is NOT handled here.\r\n * Use NRpreviewer (which wraps this) or call useLazyTailwindCDN yourself.\r\n */\r\nconst CustomMarkdownRenderer: React.FC<CustomMarkdownRendererProps> = ({ content: initialContent }) => {\r\n const [modals, setModals] = useState<Record<string, boolean>>({});\r\n const baseId = useId().replace(/:/g, '');\r\n const articleClass = `scope-${baseId}`;\r\n\r\n // Ref to hold the latest context — avoids stale closures in memoized renderElement\r\n const contextRef = useRef<RenderContext>(null!);\r\n\r\n // Reset the scope counter before parsing so IDs are stable across SSR/CSR\r\n resetScopeCounter();\r\n\r\n // Parse the markdown into AST — memoized to avoid re-parsing on every render\r\n const allElements = useMemo(() => parseMarkdown(initialContent), [initialContent]);\r\n\r\n // Scroll to hash on load and hash changes\r\n useEffect(() => {\r\n const handleHashChange = () => {\r\n const hash = window.location.hash;\r\n if (hash) {\r\n const parts = hash.split('#');\r\n const id = parts[parts.length - 1];\r\n scrollToId(id);\r\n }\r\n };\r\n handleHashChange();\r\n window.addEventListener('hashchange', handleHashChange);\r\n return () => window.removeEventListener('hashchange', handleHashChange);\r\n }, [initialContent]);\r\n\r\n // ── Render a single AST element ──\r\n const renderElement = useCallback(\r\n (element: Token, index: number, _depth: number = 0): React.ReactNode => {\r\n switch (element.type) {\r\n case 'header': {\r\n const HeaderTag = `h${element.level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\r\n let text = element.text;\r\n\r\n // Alignment modifiers on headers\r\n const alignCenter = text.match(/^->\\s*(.+?)\\s*<-\\s*$/);\r\n const alignRight = text.match(/^->\\s*(.+?)\\s*->\\s*$/);\r\n if (alignCenter) {\r\n text = alignCenter[1];\r\n } else if (alignRight) {\r\n text = alignRight[1];\r\n }\r\n\r\n const userClasses = element.classes || '';\r\n let headerClasses = `md-h${element.level}`;\r\n\r\n if (alignCenter) headerClasses += ' text-center';\r\n if (alignRight) headerClasses += ' text-right';\r\n if (userClasses) headerClasses += ` ${userClasses}`;\r\n\r\n return React.createElement(\r\n HeaderTag,\r\n { key: index, id: element.id, className: headerClasses },\r\n renderInline(text)\r\n );\r\n }\r\n\r\n case 'paragraph': {\r\n const lines = element.content.split('\\n');\r\n const processedContent = lines.map((line, lineIndex) => {\r\n const hardBreakMatch = line.match(/^(.*?)(\\s{2,})$/);\r\n if (hardBreakMatch) {\r\n return (\r\n <React.Fragment key={lineIndex}>\r\n {renderInline(hardBreakMatch[1])}\r\n <br />\r\n </React.Fragment>\r\n );\r\n }\r\n const isLastLine = lineIndex === lines.length - 1;\r\n return (\r\n <React.Fragment key={lineIndex}>\r\n {renderInline(line)}\r\n {!isLastLine && ' '}\r\n </React.Fragment>\r\n );\r\n });\r\n\r\n const pUserClasses = element.classes || '';\r\n let pClasses = 'md-p';\r\n if (pUserClasses) pClasses += ` ${pUserClasses}`;\r\n if (element.align) pClasses += ` text-${element.align}`;\r\n\r\n return (\r\n <p key={index} id={element.id} className={pClasses}>\r\n {processedContent}\r\n </p>\r\n );\r\n }\r\n\r\n case 'codeblock':\r\n return (\r\n <CodeBlock\r\n key={index}\r\n code={element.content}\r\n language={element.language}\r\n title={element.title}\r\n />\r\n );\r\n\r\n case 'directive':\r\n return (\r\n <DirectiveRenderer\r\n key={index}\r\n element={element}\r\n context={contextRef.current}\r\n index={index}\r\n allElements={allElements}\r\n />\r\n );\r\n\r\n case 'html': {\r\n let processedContent = element.content;\r\n let globalStyles = '';\r\n\r\n // Extract <style> blocks and inject them globally into <head>\r\n processedContent = processedContent.replace(\r\n /<style(?:\\s+[^>]*)?>([\\s\\S]*?)<\\/style>/gi,\r\n (_match: string, cssContent: string) => {\r\n globalStyles += cssContent + '\\n';\r\n return '';\r\n }\r\n );\r\n\r\n const wrapperClassName = 'w-full my-4';\r\n\r\n return (\r\n <RawHtmlRenderer\r\n key={index}\r\n content={processedContent}\r\n globalStyles={globalStyles || undefined}\r\n wrapperClassName={wrapperClassName}\r\n />\r\n );\r\n }\r\n\r\n case 'html-block': {\r\n const htmlBlock = element as HtmlBlockToken;\r\n const props = parseHtmlAttrs(htmlBlock.attrs);\r\n return React.createElement(\r\n htmlBlock.tag,\r\n { key: index, ...props },\r\n ...processAndRenderElements(htmlBlock.children, _depth + 1)\r\n );\r\n }\r\n\r\n case 'image':\r\n return (\r\n <img\r\n key={index}\r\n alt={element.alt}\r\n src={element.src}\r\n style={element.style}\r\n className=\"max-w-full h-auto\"\r\n />\r\n );\r\n\r\n case 'table':\r\n return <div key={index}>{renderTable(element.content)}</div>;\r\n\r\n case 'list':\r\n return <div key={index}>{renderList(element.content)}</div>;\r\n\r\n case 'blockquote':\r\n return (\r\n <blockquote key={index} className={`border-l-4 border-accent-primary/30 pl-4 italic text-text-secondary my-4 text-sm sm:text-base${element.classes ? ` ${element.classes}` : ''}`}>\r\n {renderInline(element.content)}\r\n </blockquote>\r\n );\r\n\r\n case 'hr':\r\n return <hr key={index} className=\"my-8 border-border\" />;\r\n\r\n case 'toc':\r\n return <div key={index}>{generateToc(allElements)}</div>;\r\n\r\n default:\r\n return null;\r\n }\r\n },\r\n [allElements]\r\n );\r\n\r\n // ── Process elements with card batching ──\r\n const processAndRenderElements = useCallback(\r\n (elements: Token[], depth: number = 0): React.ReactNode[] => {\r\n const result: React.ReactNode[] = [];\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 responsive 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 any).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 (let c = 0; c < cards.length; c++) {\r\n result.push(renderElement(cards[c], result.length, depth));\r\n }\r\n } else {\r\n // Extract justify-* classes from the first card to apply on the wrapper\r\n const firstCardClass = (cards[0] as DirectiveToken).props?.['class'] || '';\r\n const justifyClasses = firstCardClass.match(/\\bjustify-\\S+/g) || [];\r\n const wrapperJustify = justifyClasses.length > 0 ? justifyClasses.join(' ') : '';\r\n\r\n result.push(\r\n <div key={`card-grid-${result.length}`} className={`not-prose flex flex-wrap gap-6 my-6 ${wrapperJustify}`}>\r\n {cards.map((card, ci) => (\r\n <React.Fragment key={ci}>{renderElement(card, ci, depth)}</React.Fragment>\r\n ))}\r\n </div>\r\n );\r\n }\r\n } else {\r\n result.push(renderElement(el, result.length, depth));\r\n i++;\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n [renderElement]\r\n );\r\n\r\n // ── Generate TOC from headers ──\r\n const generateToc = (elements: Token[]): React.ReactNode => {\r\n const headers = extractHeaders(elements);\r\n if (headers.length === 0) return null;\r\n\r\n return (\r\n <nav className=\"not-prose my-6 p-4 rounded-2xl border border-border bg-background-primary/5\">\r\n <div className=\"text-base font-bold mb-3\">Table of Contents</div>\r\n <ul className=\"space-y-1 list-none p-0 m-0\">\r\n {headers.map((h, i) => {\r\n if (h.type !== 'header') return null;\r\n const indentClass = h.level <= 2 ? 'pl-0' : h.level === 3 ? 'pl-4' : h.level === 4 ? 'pl-8' : 'pl-12';\r\n return (\r\n <li key={i} className={`${indentClass} text-sm sm:text-base`}>\r\n <a\r\n href={`#${h.id}`}\r\n className=\"text-accent-primary hover:text-accent-primary/80 no-underline hover:underline transition-colors\"\r\n onClick={e => {\r\n e.preventDefault();\r\n scrollToId(h.id);\r\n }}\r\n >\r\n {renderInline(h.text.replace(/->|<-/g, '').trim())}\r\n </a>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </nav>\r\n );\r\n };\r\n\r\n // Build the context object for directives\r\n const contextForDirectives: RenderContext = {\r\n modals,\r\n setModals,\r\n articleClass,\r\n allElements,\r\n parseMarkdown,\r\n renderElement,\r\n renderInline,\r\n processAndRenderElements,\r\n };\r\n\r\n // Keep the ref in sync so memoized renderElement always reads fresh state\r\n contextRef.current = contextForDirectives;\r\n\r\n return (\r\n <RenderContextProvider value={contextForDirectives}>\r\n {processAndRenderElements(allElements)}\r\n </RenderContextProvider>\r\n );\r\n};\r\n\r\nexport default CustomMarkdownRenderer;\r\n","import React from 'react';\r\n\r\n/**\r\n * Parse an inline CSS string (e.g. \"color: red; padding: 1rem\") into a React.CSSProperties object.\r\n */\r\nexport function parseCssString(cssText: string): React.CSSProperties {\r\n if (!cssText) return {};\r\n return cssText\r\n .split(';')\r\n .filter(Boolean)\r\n .reduce<Record<string, string>>((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 }, {}) as React.CSSProperties;\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 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 React props object, renaming `class` to `className`.\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 let key = match[1];\r\n const value = match[2] ?? match[3] ?? match[4] ?? true;\r\n\r\n if (key === 'class') key = 'className';\r\n else if (key === 'for') key = 'htmlFor';\r\n else if (key === 'tabindex') key = 'tabIndex';\r\n \r\n // React expects style to be an object\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}\n","import type { Token, DirectiveToken, HtmlBlockToken } from './types';\r\nimport { generateId, generateScopeId, parseProps, extractAttributes } from './utils';\r\nimport type React from 'react';\r\n\r\n/**\r\n * V2 Markdown Parser — line-by-line state machine.\r\n */\r\nexport function parseMarkdown(markdown: string): Token[] {\r\n if (!markdown) return [];\r\n const lines = markdown.split('\\n');\r\n const result: Token[] = [];\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 id = customId || generateId(text.replace(/->|<-/g, ''));\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: React.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 // Compress newlines in attributes so the React renderer doesn't break\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 directive nesting depth (::: opening / ::: closing)\r\n if (trimmed.startsWith(':::')) {\r\n const rest = trimmed.slice(3).trim();\r\n if (rest === '') {\r\n // Bare `:::` → closing marker\r\n nestingDepth = Math.max(0, nestingDepth - 1);\r\n } else {\r\n // `:::type ...` → opening marker\r\n nestingDepth++;\r\n }\r\n }\r\n\r\n // Only split on #slotname when at the top level (not inside a nested directive)\r\n const slotMatch = trimmed.match(/^#([\\w-]+)$/);\r\n if (slotMatch && nestingDepth === 0) {\r\n // Flush buffer into current slot\r\n slots[currentSlot] = buffer.join('\\n').trim();\r\n buffer = [];\r\n currentSlot = slotMatch[1];\r\n } else {\r\n buffer.push(line);\r\n }\r\n }\r\n\r\n // Flush remaining buffer\r\n slots[currentSlot] = buffer.join('\\n').trim();\r\n\r\n // Remove empty slots\r\n for (const key of Object.keys(slots)) {\r\n if (!slots[key]) delete slots[key];\r\n }\r\n\r\n return slots;\r\n}\r\n","import React, { useState, useRef } from 'react';\r\nimport hljs from './highlightSetup';\r\nimport { Dialog } from '@base-ui/react/dialog';\r\n\r\n// ─────────────────────────────────────────────\r\n// IconRenderer — Material Icons by name or codepoint\r\n// ─────────────────────────────────────────────\r\n\r\ninterface IconRendererProps {\r\n iconName: string;\r\n extraClasses?: string;\r\n}\r\n\r\nexport const IconRenderer: React.FC<IconRendererProps> = ({ iconName, extraClasses = '' }) => {\r\n if (!iconName) return null;\r\n\r\n const baseClass = `material-symbols-rounded !text-[1em] leading-none align-top ${extraClasses}`;\r\n const isCodepoint = /^[eE][0-9a-fA-F]{3,4}$/.test(iconName);\r\n\r\n if (isCodepoint) {\r\n return (\r\n <span\r\n className={baseClass}\r\n dangerouslySetInnerHTML={{ __html: `&#x${iconName};` }}\r\n aria-hidden=\"true\"\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <span className={baseClass} aria-hidden=\"true\">\r\n {iconName}\r\n </span>\r\n );\r\n};\r\n\r\n// ─────────────────────────────────────────────\r\n// CodeBlock — synchronous syntax highlighting + copy\r\n// ─────────────────────────────────────────────\r\n\r\ninterface CodeBlockProps {\r\n code: string;\r\n language: string;\r\n title?: string;\r\n}\r\n\r\nexport const CodeBlock: React.FC<CodeBlockProps> = ({ code, language, title }) => {\r\n const [copied, setCopied] = useState(false);\r\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n const lang = language?.split(/[\\s{]/)[0]?.trim() || '';\r\n\r\n let html: string;\r\n try {\r\n if (lang && hljs.getLanguage(lang)) {\r\n html = hljs.highlight(code, { language: lang }).value;\r\n } else {\r\n html = hljs.highlightAuto(code).value;\r\n }\r\n } catch {\r\n html = '';\r\n }\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(code);\r\n setCopied(true);\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n timerRef.current = setTimeout(() => setCopied(false), 1800);\r\n };\r\n\r\n return (\r\n <div className=\"not-prose my-4 rounded-2xl border border-border overflow-hidden bg-background-secondary-solid/5\">\r\n {title && (\r\n <div className=\"flex items-center gap-2 px-4 py-2 border-b border-border bg-background-secondary-solid/10 text-xs sm:text-sm font-mono text-text-secondary\">\r\n <span className=\"material-symbols-rounded text-base\">description</span>\r\n {title}\r\n </div>\r\n )}\r\n <div className=\"overflow-auto [&_pre]:m-0 [&_pre]:p-4 [&_pre]:text-xs sm:[&_pre]:text-sm\">\r\n <pre className=\"m-0\"><code className={`language-${lang || 'plaintext'}`} dangerouslySetInnerHTML={{ __html: html }} /></pre>\r\n </div>\r\n <button className=\"absolute top-2 right-2 p-1.5 rounded-lg bg-background-secondary-solid/20 hover:bg-background-secondary-solid/40 transition-colors cursor-pointer border-none text-text-secondary hover:text-text-primary\" onClick={handleCopy} title=\"Copy code\">\r\n <span className=\"material-symbols-rounded\" style={{ fontSize: '1rem' }}>\r\n {copied ? 'check' : 'content_copy'}\r\n </span>\r\n </button>\r\n </div>\r\n );\r\n};\r\n\r\n// ─────────────────────────────────────────────\r\n// Admonition — styled alert box (Tailwind)\r\n// ─────────────────────────────────────────────\r\n\r\ninterface AdmonitionProps {\r\n type: string;\r\n title?: string;\r\n icon?: string;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n children: React.ReactNode;\r\n}\r\n\r\nconst defaultIcons: Record<string, string> = {\r\n note: 'info',\r\n info: 'lightbulb',\r\n warning: 'warning',\r\n danger: 'report',\r\n greentext: 'subdirectory_play_arrow',\r\n};\r\n\r\nconst typeClasses: Record<string, string> = {\r\n note: 'border-info/20 bg-info/5 text-info',\r\n info: 'border-info/30 bg-info/10 text-info',\r\n warning: 'border-amber-500/30 bg-amber-500/10 text-amber-500',\r\n danger: 'border-danger/30 bg-danger/10 text-danger',\r\n greentext: 'border-success/30 bg-success/10 text-success',\r\n};\r\n\r\nexport const Admonition: React.FC<AdmonitionProps> = ({ type, title, icon, className = '', style, children }) => {\r\n const iconToRender = icon || defaultIcons[type] || 'info';\r\n\r\n return (\r\n <div\r\n className={`not-prose rounded-2xl mb-6 border shadow-xs p-4 ${typeClasses[type] || typeClasses.note} ${className}`}\r\n style={style}\r\n >\r\n {title && (\r\n <h5 className=\"font-bold text-base mb-2 m-0 flex items-center gap-2\">\r\n <IconRenderer iconName={iconToRender} extraClasses=\"shrink-0\" />\r\n <span>{title}</span>\r\n </h5>\r\n )}\r\n <div className=\"text-sm leading-relaxed opacity-90\">{children}</div>\r\n </div>\r\n );\r\n};\r\n\r\n// ─────────────────────────────────────────────\r\n// Details — collapsible section (Tailwind)\r\n// ─────────────────────────────────────────────\r\n\r\ninterface DetailsProps {\r\n title: string;\r\n icon?: string;\r\n defaultOpen?: boolean;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const Details: React.FC<DetailsProps> = ({\r\n title,\r\n icon,\r\n defaultOpen = false,\r\n className = '',\r\n style,\r\n children,\r\n}) => {\r\n const [isOpen, setIsOpen] = useState(defaultOpen);\r\n const iconToRender = icon || 'play_arrow';\r\n\r\n return (\r\n <details\r\n className={`not-prose rounded-2xl border border-border mb-4 bg-background-primary/5 ${className}`}\r\n open={isOpen}\r\n style={style}\r\n >\r\n <summary\r\n className=\"cursor-pointer p-4 font-bold flex items-center gap-2 list-none [&::-webkit-details-marker]:hidden hover:text-accent-primary transition-colors\"\r\n onClick={e => {\r\n e.preventDefault();\r\n setIsOpen(prev => !prev);\r\n }}\r\n >\r\n <IconRenderer\r\n iconName={iconToRender}\r\n extraClasses={`transition-transform ${isOpen ? 'rotate-90' : ''}`}\r\n />\r\n <span>{title}</span>\r\n </summary>\r\n {isOpen && (\r\n <div className=\"px-4 pb-4 border-t border-border pt-3 text-sm leading-relaxed opacity-90 overflow-hidden min-w-0\">\r\n {children}\r\n </div>\r\n )}\r\n </details>\r\n );\r\n};\r\n\r\n// ─────────────────────────────────────────────\r\n// Modal — overlay dialog (Base UI Dialog + Tailwind)\r\n// ─────────────────────────────────────────────\r\n\r\ninterface ModalProps {\r\n title: string;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const Modal: React.FC<ModalProps> = ({ title, isOpen, onClose, children }) => {\r\n return (\r\n <Dialog.Root open={isOpen} onOpenChange={(open) => { if (!open) onClose(); }}>\r\n <Dialog.Portal>\r\n <Dialog.Backdrop className=\"fixed inset-0 z-[9999] bg-black/60\" />\r\n <Dialog.Viewport className=\"fixed inset-0 z-[9999] flex items-center justify-center p-4\">\r\n <Dialog.Popup className=\"bg-background-primary border border-border shadow-2xl rounded-3xl w-full max-w-3xl max-h-[85vh] flex flex-col overflow-hidden\">\r\n <div className=\"flex justify-between items-center p-4 border-b border-border bg-background-secondary-solid/20\">\r\n <Dialog.Title className=\"text-lg font-bold !m-0\">{title}</Dialog.Title>\r\n <Dialog.Close className=\"w-8 h-8 rounded-full hover:bg-white/10 flex items-center justify-center transition-colors cursor-pointer border-none bg-transparent\">\r\n <span className=\"material-symbols-rounded text-base\">close</span>\r\n </Dialog.Close>\r\n </div>\r\n <div className=\"p-6 overflow-auto min-h-0 text-text-primary [&_h1:first-child]:mt-0 [&_h2:first-child]:mt-0 [&_h3:first-child]:mt-0 [&_h4:first-child]:mt-0 [&_h5:first-child]:mt-0 [&_h6:first-child]:mt-0\">\r\n {children}\r\n </div>\r\n </Dialog.Popup>\r\n </Dialog.Viewport>\r\n </Dialog.Portal>\r\n </Dialog.Root>\r\n );\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('c', cpp);\nhljs.registerLanguage('go', go);\nhljs.registerLanguage('rust', rust);\nhljs.registerLanguage('rs', rust);\nhljs.registerLanguage('php', php);\nhljs.registerLanguage('ruby', ruby);\nhljs.registerLanguage('rb', ruby);\nhljs.registerLanguage('swift', swift);\nhljs.registerLanguage('kotlin', kotlin);\nhljs.registerLanguage('kt', kotlin);\nhljs.registerLanguage('dart', dart);\nhljs.registerLanguage('yaml', yaml);\nhljs.registerLanguage('yml', yaml);\nhljs.registerLanguage('toml', toml);\nhljs.registerLanguage('ini', toml);\nhljs.registerLanguage('dockerfile', dockerfile);\nhljs.registerLanguage('docker', dockerfile);\nhljs.registerLanguage('diff', diff);\nhljs.registerLanguage('shell', shell);\n\nexport default hljs;\n","import React from 'react';\r\nimport type { Token } from './types';\r\nimport { IconRenderer } from './ui-components';\r\n\r\n/**\r\n * Render inline markdown formatting into React elements.\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): React.ReactNode {\r\n if (!text) return text;\r\n\r\n const parsePart = (part: string, key: string): React.ReactNode => {\r\n let match: RegExpMatchArray | null;\r\n\r\n // Icon: |[[icon-name]]|\r\n if ((match = part.match(/^\\|\\[([^\\]]+)\\]\\|$/))) {\r\n return <IconRenderer key={key} iconName={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 return (\r\n <span\r\n key={key}\r\n style={{\r\n textDecoration: `${type} ${decorationStyle} ${color}`,\r\n textDecorationThickness: 'auto',\r\n }}\r\n >\r\n {renderInline(innerText)}\r\n </span>\r\n );\r\n }\r\n\r\n // Color text: %color%text%%\r\n if ((match = part.match(/%([^%\\s]+?)%([\\s\\S]+?)%%/))) {\r\n return (\r\n <span key={key} style={{ color: match[1] }}>\r\n {renderInline(match[2])}\r\n </span>\r\n );\r\n }\r\n\r\n // Spoiler: !>text<!\r\n if ((match = part.match(/^!>([^<]+?)<!$/))) {\r\n return (\r\n <span key={key} className=\"bg-text-primary text-bg-primary px-1 rounded hover:bg-transparent transition-colors cursor-pointer\">\r\n {renderInline(match[1])}\r\n </span>\r\n );\r\n }\r\n\r\n // Highlight: ==text==\r\n if ((match = part.match(/^==(.+?)==$/))) {\r\n return (\r\n <mark key={key} className=\"bg-yellow-500/20 text-inherit px-0.5 rounded\">\r\n {renderInline(match[1])}\r\n </mark>\r\n );\r\n }\r\n\r\n // Bold-italic: ***text***\r\n if ((match = part.match(/^\\*\\*\\*(.+?)\\*\\*\\*$/))) {\r\n return (\r\n <strong key={key}>\r\n <em>{renderInline(match[1])}</em>\r\n </strong>\r\n );\r\n }\r\n\r\n // Bold: **text**\r\n if ((match = part.match(/^\\*\\*(.+?)\\*\\*$/))) {\r\n return <strong key={key}>{renderInline(match[1])}</strong>;\r\n }\r\n\r\n // Italic: _text_\r\n if ((match = part.match(/^_(.+?)_$/))) {\r\n return <em key={key}>{renderInline(match[1])}</em>;\r\n }\r\n\r\n // Strikethrough: ~~text~~\r\n if ((match = part.match(/^~~(.+?)~~$/))) {\r\n return <del key={key}>{renderInline(match[1])}</del>;\r\n }\r\n\r\n // Inline code: `code`\r\n if ((match = part.match(/^`([^`]+)`$/))) {\r\n return (\r\n <code key={key} className=\"text-[0.875em] font-mono bg-background-secondary/50 px-1.5 py-0.5 rounded text-text-primary\">\r\n {match[1]}\r\n </code>\r\n );\r\n }\r\n\r\n // Link: [text](url)\r\n if ((match = part.match(/^\\[([^\\]]+?)\\]\\(([^)]+?)\\)$/))) {\r\n return (\r\n <a\r\n key={key}\r\n href={match[2]}\r\n className=\"text-accent-primary underline decoration-accent-primary/40 hover:decoration-accent-primary transition-colors\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n {renderInline(match[1])}\r\n </a>\r\n );\r\n }\r\n\r\n // Raw HTML tag: <tag>...</tag>\r\n if (part.startsWith('<') && part.endsWith('>')) {\r\n return <span key={key} dangerouslySetInnerHTML={{ __html: part }} />;\r\n }\r\n\r\n return part;\r\n };\r\n\r\n const regex =\r\n /(\\|\\[[^\\]]+\\]\\||\\*\\*\\*.+?\\*\\*\\*|\\*\\*.+?\\*\\*|_.+?_|~~.+?~~|`[^`]+?`|!~.+?~!|%[^%\\s]+?%[\\s\\S]+?%%|!>.+?<!|==.+?==|\\[[^\\]]+?\\]\\([^)]+?\\)|<[^>]+>)/g;\r\n\r\n const elements: React.ReactNode[] = [];\r\n let lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n let keyCounter = 0;\r\n\r\n while ((match = regex.exec(text)) !== null) {\r\n if (match.index > lastIndex) {\r\n elements.push(text.slice(lastIndex, match.index));\r\n }\r\n elements.push(parsePart(match[0], `inline-${keyCounter++}`));\r\n lastIndex = regex.lastIndex;\r\n }\r\n if (lastIndex < text.length) {\r\n elements.push(text.slice(lastIndex));\r\n }\r\n\r\n return elements;\r\n}\r\n\r\n/**\r\n * Render a pipe-delimited markdown table.\r\n */\r\nexport function renderTable(content: string): React.ReactNode {\r\n const rows = content.split('\\n').filter(r => r.trim());\r\n if (rows.length < 2) return <p>{content}</p>;\r\n\r\n const parseRow = (row: string) =>\r\n row\r\n .split('|')\r\n .map(c => c.trim())\r\n .filter(Boolean);\r\n\r\n const headerCells = parseRow(rows[0]);\r\n const bodyRows = rows.slice(2).map(parseRow); // skip separator row\r\n\r\n return (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full text-sm sm:text-base border-collapse my-4\">\r\n <thead>\r\n <tr>\r\n {headerCells.map((cell, ci) => (\r\n <th key={ci} className=\"border border-border px-3 py-2 bg-background-secondary-solid/10 text-left font-bold\">{renderInline(cell)}</th>\r\n ))}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {bodyRows.map((cells, ri) => (\r\n <tr key={ri}>\r\n {cells.map((cell, ci) => (\r\n <td key={ci} className=\"border border-border px-3 py-2\">{renderInline(cell)}</td>\r\n ))}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Render a markdown list (ordered or unordered) with nesting support.\r\n */\r\nexport function renderList(content: string): React.ReactNode {\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({\r\n indent: match[1].length,\r\n marker: match[2],\r\n text: match[3],\r\n });\r\n }\r\n }\r\n\r\n if (items.length === 0) return <p>{content}</p>;\r\n\r\n const isOrdered = /^\\d+\\.$/.test(items[0].marker);\r\n const Tag = isOrdered ? 'ol' : 'ul';\r\n\r\n return (\r\n <Tag className={`${isOrdered ? 'list-decimal' : 'list-disc'} pl-6 my-3 space-y-1 text-sm sm:text-base`}>\r\n {items.map((item, index) => (\r\n <li key={index} className=\"leading-relaxed\">\r\n {renderInline(item.text)}\r\n </li>\r\n ))}\r\n </Tag>\r\n );\r\n}\r\n\r\n/**\r\n * Extract all header tokens from an AST for TOC generation.\r\n */\r\nexport function extractHeaders(elements: Token[]): Token[] {\r\n return elements.filter((el): el is Token & { type: 'header' } => el.type === 'header');\r\n}\r\n","import React from 'react';\r\nimport type { DirectiveComponentProps } from '../types';\r\nimport { Admonition } from '../ui-components';\r\nimport { parseCssString } from '../utils';\r\n\r\n/**\r\n * Admonition Directive — renders note, info, warning, danger, greentext boxes.\r\n *\r\n * V2 syntax:\r\n * :::note {title=\"My Note\" icon=\"info\"}\r\n * Content here\r\n * :::\r\n *\r\n * :::warning Short title text\r\n * Content here\r\n * :::\r\n */\r\nconst AdmonitionDirective: React.FC<DirectiveComponentProps> = ({\r\n directiveType,\r\n props,\r\n renderSlot,\r\n}) => {\r\n return (\r\n <Admonition\r\n type={directiveType}\r\n title={props.title}\r\n icon={props.icon}\r\n className={props.class}\r\n style={props.style ? parseCssString(props.style) : undefined}\r\n >\r\n {renderSlot('default')}\r\n </Admonition>\r\n );\r\n};\r\n\r\nexport default AdmonitionDirective;\r\n","import React, { useId } from 'react';\r\nimport type { DirectiveComponentProps } from '../types';\r\nimport { IconRenderer, Modal } from '../ui-components';\r\nimport { parseCssString } from '../utils';\r\n\r\n/**\r\n * Card Directive — renders card, card-m (modal), card-b (link) variants.\r\n * Uses Tailwind with override pattern.\r\n *\r\n * V2 syntax:\r\n * :::card {title=\"Card Title\" image=\"url\" icon=\"star\" class=\"custom\"}\r\n * #description\r\n * Short description text\r\n * #content\r\n * Main card content (for card-m: shown in modal)\r\n * :::\r\n */\r\nconst CardDirective: React.FC<DirectiveComponentProps> = ({\r\n directiveType,\r\n props,\r\n slots,\r\n renderSlot,\r\n context,\r\n options = {},\r\n}) => {\r\n const stableId = useId();\r\n const { title, image, icon, class: customClass, url, target } = props;\r\n const hasDescription = !!slots.description;\r\n const { isSingleCard } = options;\r\n\r\n const isModal = directiveType === 'card-m';\r\n const isLink = directiveType === 'card-b';\r\n\r\n const modalId = `modal-card-${props.id || stableId}`;\r\n const wrapperClass = customClass || '';\r\n const inlineStyles = props.style ? parseCssString(props.style) : {};\r\n\r\n const description = hasDescription ? renderSlot('description') : null;\r\n const content = renderSlot('content') || renderSlot('default');\r\n\r\n return (\r\n <React.Fragment>\r\n <div\r\n className={`flex flex-col h-full rounded-3xl transition-all relative overflow-hidden group border min-w-[18rem] w-[18rem] max-w-[20rem] ${isModal || isLink ? 'cursor-pointer !border-accent-primary/10 hover:border-accent-primary/50' : 'border-border'} ${wrapperClass}`}\r\n style={inlineStyles}\r\n onClick={isModal\r\n ? (e) => { e.preventDefault(); e.stopPropagation(); context.setModals((prev: any) => ({ ...prev, [modalId]: true })); }\r\n : isLink && url\r\n ? () => window.open(url, '_blank')\r\n : undefined\r\n }\r\n role={isModal ? 'button' : undefined}\r\n tabIndex={isModal ? 0 : undefined}\r\n onKeyDown={isModal\r\n ? (e) => { if (e.key === 'Enter' || e.key === ' ') context.setModals((prev: any) => ({ ...prev, [modalId]: true })); }\r\n : undefined\r\n }\r\n >\r\n {/* Image banner */}\r\n {image && (\r\n <div className={`w-full ${isSingleCard ? 'h-[240px]' : 'h-[160px]'} overflow-hidden relative transition-all duration-500`}>\r\n <img src={image} alt={title || ''} className=\"w-full h-full object-cover !m-0\" />\r\n <div className=\"absolute inset-0 bg-gradient-to-t from-background-primary/40 to-transparent\" />\r\n </div>\r\n )}\r\n\r\n {/* Content body — overlaps image */}\r\n <div className={`flex flex-col flex-1 bg-background-primary/80 rounded-t-xl p-6 relative ${image ? '-mt-10' : ''} border-t border-white/5 shadow-2xl`}>\r\n {/* Header: Icon + Title */}\r\n <div className=\"flex items-center gap-3 mb-3\">\r\n {icon && (\r\n <div className=\"w-10 h-10 text-[1.6em] rounded-xl bg-accent-primary/20 flex items-center justify-center shrink-0 text-accent-primary\">\r\n <IconRenderer iconName={icon} />\r\n </div>\r\n )}\r\n <h3 className=\"text-base font-black tracking-tight leading-tight !m-0\">\r\n {title}\r\n </h3>\r\n </div>\r\n\r\n {/* Content Body */}\r\n <div className=\"flex-1 flex flex-col gap-2\">\r\n {description && (\r\n <div className=\"text-sm opacity-80 leading-relaxed font-medium\">\r\n {description}\r\n </div>\r\n )}\r\n {directiveType === 'card' && content && (\r\n <div className=\"mt-2\">{content}</div>\r\n )}\r\n </div>\r\n\r\n {/* Bottom: Action Link */}\r\n {(isModal || isLink) && (\r\n <div className=\"mt-6 flex justify-end\">\r\n {isLink && url ? (\r\n <a\r\n href={url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"bg-accent-primary/20 hover:bg-accent-primary/30 px-4 py-2 rounded-xl flex items-center gap-1.5 text-[10px] font-black uppercase tracking-widest opacity-50 group-hover:opacity-100 group-hover:text-accent-primary transition-all no-underline\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <IconRenderer iconName=\"open_in_new\" /> Link\r\n </a>\r\n ) : isModal ? (\r\n <div className=\"bg-accent-primary/20 hover:bg-accent-primary/30 px-4 py-2 cursor-pointer rounded-xl flex items-center gap-1.5 text-[10px] font-black uppercase tracking-widest opacity-50 group-hover:opacity-100 group-hover:text-accent-primary transition-all\">\r\n <IconRenderer iconName=\"arrow_forward\" /> Abrir\r\n </div>\r\n ) : null}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Modal for card-m */}\r\n {isModal && (\r\n <Modal\r\n title={title || 'Detalles'}\r\n isOpen={!!context.modals[modalId]}\r\n onClose={() => context.setModals((prev: any) => ({ ...prev, [modalId]: false }))}\r\n >\r\n <div className=\"prose prose-sm max-w-none\">{content}</div>\r\n </Modal>\r\n )}\r\n </React.Fragment>\r\n );\r\n};\r\n\r\nexport default CardDirective;\r\n","import React from 'react';\r\nimport type { DirectiveComponentProps } from '../types';\r\nimport { Details } from '../ui-components';\r\nimport { parseCssString } from '../utils';\r\n\r\n/**\r\n * Details Directive — collapsible section.\r\n *\r\n * V2 syntax:\r\n * :::details {title=\"Click to expand\" icon=\"expand_more\" defaultOpen=\"true\"}\r\n * Hidden content here\r\n * :::\r\n *\r\n * :::details Short title\r\n * Content\r\n * :::\r\n */\r\nconst DetailsDirective: React.FC<DirectiveComponentProps> = ({\r\n props,\r\n renderSlot,\r\n}) => {\r\n return (\r\n <Details\r\n title={props.title || 'Details'}\r\n icon={props.icon}\r\n defaultOpen={props.defaultOpen === 'true'}\r\n className={props.class}\r\n style={props.style ? parseCssString(props.style) : undefined}\r\n >\r\n {renderSlot('default')}\r\n </Details>\r\n );\r\n};\r\n\r\nexport default DetailsDirective;\r\n","import React, { useId } from 'react';\r\nimport type { DirectiveComponentProps } from '../types';\r\nimport { IconRenderer, Modal } from '../ui-components';\r\n\r\n/**\r\n * Modal Directive — button that opens a modal with content.\r\n * Uses Tailwind with override pattern + Base UI Dialog.\r\n *\r\n * V2 syntax:\r\n * :::modal {title=\"My Modal\" label=\"Open Modal\" icon=\"open_in_new\" class=\"text-lg\"}\r\n * Modal content here\r\n * :::\r\n */\r\nconst ModalDirective: React.FC<DirectiveComponentProps> = ({\r\n props,\r\n renderSlot,\r\n context,\r\n}) => {\r\n const stableId = useId();\r\n const modalId = `modal-${props.id || stableId}`;\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 // Smart size detection — only add default if user didn't provide one\r\n const hasSizeClass = /\\btext-(xs|sm|base|lg|xl|[2-9]xl)\\b/.test(customClass);\r\n const sizeClass = hasSizeClass ? '' : 'text-sm';\r\n\r\n // Smart display detection\r\n const hasDisplayClass = /\\b(flex|inline-flex|block|inline-block|grid|inline-grid|hidden)\\b/.test(customClass);\r\n const displayClass = hasDisplayClass ? '' : 'inline-flex';\r\n\r\n // Smart margin — inline vs block\r\n const isInlineFlex = /\\binline-flex\\b/.test(customClass);\r\n const marginClass = isInlineFlex ? 'my-1 mx-1' : 'my-4';\r\n\r\n // Base button styles (Tailwind puro)\r\n const btnBase = `${displayClass} items-center w-fit ${marginClass} ${sizeClass} px-4 py-2 rounded-xl font-bold no-underline gap-2 transition-all hover:scale-105 active:scale-95 border border-border bg-background-primary/5 hover:bg-background-primary/10 text-text-primary hover:text-text-primary`.replace(/\\s+/g, ' ');\r\n const btnClass = `${btnBase} ${customClass}`.trim();\r\n\r\n // Resolve position shorthand → text classes for wrapper\r\n const positionMap: Record<string, string> = {\r\n '#left': 'text-left',\r\n '#center': 'text-center',\r\n '#right': 'text-right',\r\n };\r\n const wrapperClass = customClass\r\n .split(/\\s+/)\r\n .map(c => positionMap[c] || c)\r\n .join(' ');\r\n\r\n const handleOpen = () => {\r\n context.setModals(prev => ({ ...prev, [modalId]: true }));\r\n };\r\n\r\n const handleClose = () => {\r\n context.setModals(prev => ({ ...prev, [modalId]: false }));\r\n };\r\n\r\n return (\r\n <div className={`not-prose ${wrapperClass}`.trim()}>\r\n <button className={btnClass} onClick={handleOpen}>\r\n {props.icon && <IconRenderer iconName={props.icon} />}\r\n {label}\r\n </button>\r\n\r\n <Modal\r\n title={modalTitle}\r\n isOpen={!!context.modals[modalId]}\r\n onClose={handleClose}\r\n >\r\n {renderSlot('default')}\r\n </Modal>\r\n </div>\r\n );\r\n};\r\n\r\nexport default ModalDirective;\r\n","import React from 'react';\r\nimport type { DirectiveComponentProps } from '../types';\r\nimport { IconRenderer } from '../ui-components';\r\n\r\n/**\r\n * Button Directive — styled link button (Tailwind with override pattern).\r\n *\r\n * V2 syntax:\r\n * :::button {url=\"https://example.com\" label=\"Click Me\" icon=\"arrow_forward\" class=\"text-lg\"}\r\n * :::\r\n *\r\n * Or with content as label:\r\n * :::button {url=\"https://example.com\" icon=\"star\"}\r\n * Click Me\r\n * :::\r\n */\r\nconst ButtonDirective: React.FC<DirectiveComponentProps> = ({\r\n props,\r\n renderSlot,\r\n}) => {\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 // Smart size detection — only add default if user didn't provide one\r\n const hasSizeClass = /\\btext-(xs|sm|base|lg|xl|[2-9]xl)\\b/.test(customClass);\r\n const sizeClass = hasSizeClass ? '' : 'text-sm';\r\n\r\n // Smart display detection\r\n const hasDisplayClass = /\\b(flex|inline-flex|block|inline-block|grid|inline-grid|hidden)\\b/.test(customClass);\r\n const displayClass = hasDisplayClass ? '' : 'inline-flex';\r\n\r\n // Smart margin — inline vs block\r\n const isInline = !customClass || !/\\b(flex|block|grid)\\b/.test(customClass) || /\\binline-flex\\b/.test(customClass);\r\n const marginClass = isInline ? 'my-1 mx-1' : 'my-4';\r\n\r\n // Base button styles (Tailwind puro)\r\n const btnBase = `${displayClass} items-center w-fit ${marginClass} ${sizeClass} px-4 py-2 rounded-xl font-bold no-underline gap-2 transition-all hover:scale-105 active:scale-95 border border-border bg-background-primary/5 hover:bg-background-primary/10 text-text-primary hover:text-text-primary`.replace(/\\s+/g, ' ');\r\n const btnClass = `${btnBase} ${customClass}`.trim();\r\n\r\n // Resolve position shorthand → flex classes for button wrapper\r\n const positionMap: Record<string, string> = {\r\n '#left': 'flex justify-start',\r\n '#center': 'flex justify-center',\r\n '#right': 'flex justify-end',\r\n };\r\n const wrapperClass = customClass\r\n .split(/\\s+/)\r\n .map(c => positionMap[c] || c)\r\n .join(' ');\r\n\r\n // If label is provided, use it directly (no slot rendering needed)\r\n if (label) {\r\n return (\r\n <div className={`not-prose ${wrapperClass}`.trim()}>\r\n <a\r\n href={url}\r\n target={target}\r\n rel=\"noopener noreferrer\"\r\n className={btnClass}\r\n >\r\n <IconRenderer iconName={icon} />\r\n {label}\r\n </a>\r\n </div>\r\n );\r\n }\r\n\r\n // Otherwise, render slot content (which may contain links)\r\n const slotContent = renderSlot('default');\r\n const findLinks = (element: React.ReactNode): React.ReactElement<any>[] => {\r\n if (!element) return [];\r\n if (React.isValidElement(element) && (element.type as any) === 'a') {\r\n return [element as React.ReactElement<any>];\r\n }\r\n if (Array.isArray(element)) {\r\n return element.flatMap(findLinks);\r\n }\r\n if (React.isValidElement(element) && (element.props as any).children) {\r\n return findLinks((element.props as any).children);\r\n }\r\n return [];\r\n };\r\n\r\n const links = findLinks(slotContent);\r\n\r\n if (links.length > 0) {\r\n return (\r\n <div className={`not-prose ${wrapperClass}`.trim()}>\r\n {links.map((link, index) =>\r\n React.cloneElement(\r\n link,\r\n {\r\n key: index,\r\n className: `${(link.props as any).className || ''} ${btnClass}`.trim(),\r\n target: target,\r\n rel: 'noopener noreferrer',\r\n },\r\n <>\r\n <IconRenderer iconName={icon} />\r\n {(link.props as any).children}\r\n </>\r\n )\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // Fallback: wrap content in an anchor\r\n return (\r\n <div className={`not-prose ${wrapperClass}`.trim()}>\r\n <a href={url} target={target} rel=\"noopener noreferrer\" className={btnClass}>\r\n <IconRenderer iconName={icon} />\r\n {slotContent}\r\n </a>\r\n </div>\r\n );\r\n};\r\n\r\nexport default ButtonDirective;\r\n","import React from 'react';\nimport type { DirectiveComponentProps } from '../types';\nimport { parseCssString } from '../utils';\n\n/**\n * Wrapper Directive — generic layout/styling wrapper for backward compatibility.\n * Consolidates 'div', 'raw', 'style', 'custom' directives.\n * Passes through all recognized props to a `<div>`.\n */\nconst WrapperDirective: React.FC<DirectiveComponentProps> = ({\n props,\n renderSlot,\n}) => {\n const className = props.class || '';\n const id = props.id || '';\n\n // Parse inline styles from the `style` prop\n const inlineStyle = props.style ? parseCssString(props.style) : {};\n\n // Build wrapper props\n const wrapperProps: Record<string, any> = {};\n if (className) wrapperProps.className = className;\n if (id) wrapperProps.id = id;\n if (Object.keys(inlineStyle).length > 0) wrapperProps.style = inlineStyle;\n\n // Support arbitrary data-* attributes\n for (const [key, value] of Object.entries(props)) {\n if (key.startsWith('data-')) {\n wrapperProps[key] = value;\n }\n }\n\n return <div {...wrapperProps}>{renderSlot('default')}</div>;\n};\n\nexport default WrapperDirective;\n","import React, { useState, useEffect, useCallback, useRef, useLayoutEffect } from 'react';\r\nimport type { DirectiveComponentProps, Token } from '../types';\r\nimport { parseCssString } from '../utils';\r\n\r\nlet slideCounter = 0;\r\n\r\n/**\r\n * Slide Directive — single-line text carousel with slide-up rotation.\r\n *\r\n * V2 syntax:\r\n * :::slide {class=\"text-2xl font-bold\" interval=\"3000\"}\r\n * First line\r\n * ## Header line\r\n * **Bold** and _italic_ line\r\n * :::\r\n *\r\n * Each line is parsed individually via parseMarkdown, so headers, inline\r\n * formatting, and even nested directives all render correctly.\r\n * Only one line is visible at a time, rotating upward with a smooth transition.\r\n *\r\n * Props:\r\n * class — Tailwind classes (applied to outer container)\r\n * style — Inline CSS\r\n * interval — ms between rotations (default 3000)\r\n * speed — transition duration in ms (default 500)\r\n */\r\nconst SlideDirective: React.FC<DirectiveComponentProps> = ({\r\n props,\r\n context,\r\n slots,\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 // Parse each line independently — handles ## headers, **bold**, etc.\r\n const elements: Token[][] = lines.map(line => context.parseMarkdown(line));\r\n\r\n const [current, setCurrent] = useState(0);\r\n const interval = parseInt(props.interval || '3000', 10);\r\n const speed = parseInt(props.speed || '500', 10);\r\n\r\n // Refs for dynamic height measurement\r\n const elRefs = useRef<(HTMLDivElement | null)[]>([]);\r\n const [maxH, setMaxH] = useState(0);\r\n\r\n // Measure ALL elements, keep the tallest as the fixed container height\r\n useLayoutEffect(() => {\r\n let h = 0;\r\n elRefs.current.forEach(el => {\r\n if (el) h = Math.max(h, el.offsetHeight);\r\n });\r\n if (h > 0) setMaxH(h);\r\n }, [elements]);\r\n\r\n const cycle = useCallback(() => {\r\n if (elements.length <= 1) return;\r\n setCurrent(prev => (prev + 1) % elements.length);\r\n }, [elements.length]);\r\n\r\n useEffect(() => {\r\n if (elements.length <= 1) return;\r\n const id = setInterval(cycle, interval);\r\n return () => clearInterval(id);\r\n }, [cycle, interval, elements.length]);\r\n\r\n if (elements.length === 0) return null;\r\n\r\n const rawClass = props.class || '';\r\n const inlineStyle = props.style ? parseCssString(props.style) : {};\r\n\r\n // Smart: detect text-size and force it on all children via scoped <style>\r\n // because Tailwind JIT can't see dynamically constructed classes like [&_*]:!text-2xl\r\n const textSizeMap: Record<string, string> = {\r\n 'text-xs': '0.75rem', 'text-sm': '0.875rem', 'text-base': '1rem',\r\n 'text-lg': '1.125rem', 'text-xl': '1.25rem', 'text-2xl': '1.5rem',\r\n 'text-3xl': '1.875rem', 'text-4xl': '2.25rem', 'text-5xl': '3rem',\r\n 'text-6xl': '3.75rem', 'text-7xl': '4.5rem', 'text-8xl': '6rem',\r\n 'text-9xl': '8rem',\r\n };\r\n const textSizeMatch = rawClass.match(/\\btext-(xs|sm|base|lg|xl|[2-9]xl)\\b/);\r\n const forcedFontSize = textSizeMatch ? textSizeMap[textSizeMatch[0]] : null;\r\n const scopeClass = `sld-${++slideCounter}`;\r\n // Strip the matched text-* class from the user's classes (it's handled by the style tag)\r\n const className = textSizeMatch\r\n ? rawClass.replace(textSizeMatch[0], '').replace(/\\s+/g, ' ').trim()\r\n : rawClass;\r\n\r\n return (\r\n <div\r\n className=\"not-prose\"\r\n style={{ height: maxH || 'auto', position: 'relative', overflow: 'hidden', ...inlineStyle }}\r\n >\r\n {forcedFontSize && (\r\n <style>{`.${scopeClass} * { font-size: ${forcedFontSize} !important; line-height: normal !important; }`}</style>\r\n )}\r\n <div\r\n style={{\r\n position: 'absolute',\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n transition: `transform ${speed}ms cubic-bezier(0.16, 1, 0.3, 1)`,\r\n transform: `translateY(${-current * maxH}px)`,\r\n }}\r\n >\r\n {elements.map((tokens, i) => (\r\n <div\r\n key={i}\r\n ref={el => { elRefs.current[i] = el; }}\r\n style={maxH ? { height: maxH, display: 'flex', alignItems: 'center', overflow: 'hidden' } : { display: 'flex', alignItems: 'center' }}\r\n >\r\n <div className={`${scopeClass} ${className}`} style={{ width: '100%' }}>\r\n {context.processAndRenderElements(tokens)}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default SlideDirective;\r\n","import type { DirectiveComponent } from '../types';\r\nimport AdmonitionDirective from './AdmonitionDirective';\r\nimport CardDirective from './CardDirective';\r\nimport DetailsDirective from './DetailsDirective';\r\nimport ModalDirective from './ModalDirective';\r\nimport ButtonDirective from './ButtonDirective';\r\nimport WrapperDirective from './WrapperDirective';\r\nimport SlideDirective from './SlideDirective';\r\n\r\n/**\r\n * Directive Registry — maps type strings to directive components.\r\n * All directives implement the unified DirectiveComponentProps interface.\r\n */\r\nconst directiveRegistry: Record<string, DirectiveComponent> = {\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","import React from 'react';\r\nimport type { DirectiveComponentProps, DirectiveToken, RenderContext, Token } from './types';\r\nimport directiveRegistry from './directives';\r\n\r\ninterface DirectiveRendererProps {\r\n element: DirectiveToken;\r\n context: RenderContext;\r\n index: number;\r\n allElements: Token[];\r\n}\r\n\r\n/**\r\n * DirectiveRenderer — looks up a directive type in the registry\r\n * and dispatches to the appropriate component with unified props.\r\n */\r\nconst DirectiveRenderer: React.FC<DirectiveRendererProps> = ({\r\n element,\r\n context,\r\n index,\r\n allElements,\r\n}) => {\r\n const { directiveType, props, slots, scopeId } = element;\r\n\r\n // Look up the directive component in the registry\r\n const Component = directiveRegistry[directiveType];\r\n\r\n // Convenience: render a named slot as parsed markdown\r\n const renderSlot = (name: string): React.ReactNode => {\r\n const slotContent = slots[name];\r\n if (!slotContent) return null;\r\n const parsed = context.parseMarkdown(slotContent);\r\n return context.processAndRenderElements(parsed);\r\n };\r\n\r\n const directiveProps: DirectiveComponentProps = {\r\n directiveType,\r\n props,\r\n slots,\r\n renderSlot,\r\n context,\r\n index,\r\n allElements,\r\n };\r\n\r\n if (Component) {\r\n return <Component key={index} {...directiveProps} />;\r\n }\r\n\r\n // Fallback: unknown directive → render as a div with default slot\r\n return (\r\n <div key={index} className={`my-4 p-4 rounded-2xl border border-border bg-background-primary/5`}>\r\n {renderSlot('default')}\r\n </div>\r\n );\r\n};\r\n\r\nexport default DirectiveRenderer;\r\n","import React, { useRef, useEffect } from 'react';\r\nimport { scanTailwindCDN } from './useTailwindCDN';\r\n\r\ninterface RawHtmlRendererProps {\r\n content: string;\r\n globalStyles?: string;\r\n wrapperClassName: string;\r\n}\r\n\r\n/**\r\n * Renders raw HTML content with global CSS injection.\r\n * - `globalStyles`: unscoped CSS injected into <head> (cleans up on unmount)\r\n * Forces <script> execution by replacing script nodes after mount.\r\n * Triggers a Tailwind CDN re-scan after mount so that any Tailwind classes\r\n * present in the injected HTML are resolved (works with the Play CDN loaded\r\n * by useTailwindCDN in CustomMarkdownRenderer).\r\n */\r\nconst RawHtmlRenderer: React.FC<RawHtmlRendererProps> = ({\r\n content,\r\n globalStyles,\r\n wrapperClassName,\r\n}) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Force-execute injected scripts by replacing them\r\n useEffect(() => {\r\n if (!containerRef.current) return;\r\n const scripts = containerRef.current.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 // ── Tailwind CDN re-scan ──\r\n // After the HTML is injected, trigger the CDN to pick up any new\r\n // Tailwind classes present in the dynamically-rendered content.\r\n scanTailwindCDN();\r\n }, [content]);\r\n\r\n // Inject <style global> into <head> and clean up on unmount\r\n useEffect(() => {\r\n if (!globalStyles) return;\r\n const styleEl = document.createElement('style');\r\n styleEl.setAttribute('data-global', '');\r\n styleEl.textContent = globalStyles;\r\n document.head.appendChild(styleEl);\r\n return () => {\r\n if (styleEl.parentNode) document.head.removeChild(styleEl);\r\n };\r\n }, [globalStyles]);\r\n\r\n return (\r\n <div className={wrapperClassName} ref={containerRef}>\r\n <div dangerouslySetInnerHTML={{ __html: content }} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default RawHtmlRenderer;\r\n\r\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, { createContext, useContext } from 'react';\r\nimport type { RenderContext } from './types';\r\n\r\nconst RenderCtx = createContext<RenderContext | null>(null);\r\n\r\nexport const RenderContextProvider = RenderCtx.Provider;\r\n\r\nexport function useRenderContext(): RenderContext {\r\n const ctx = useContext(RenderCtx);\r\n if (!ctx) {\r\n throw new Error('useRenderContext must be used within a RenderContextProvider');\r\n }\r\n return ctx;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,iBAAwC;AACxC,8BAAiD;AACjD,kBAAmG;;;ACFnG,sBAA+B;AAC/B,uBAA0B;AAqBnB,IAAM,uBAAuB,+BAAe,OAAgB;AAAA,EACjE,YAAY,OAAO;AAAA,IACjB,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,YAAY,CAAC;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EAEA,MAAM,QAAQ,OAAO;AAEnB,QAAI,OAAO,IAAI,GAAG;AAChB,YAAM,oBAAoB;AAC1B,YAAM,aAAa;AACnB,YAAM,YAAY;AAGlB,UAAI,MAAM,eAAe,OAAO,MAAM,SAAS,GAAG;AAChD,cAAM,cAAc;AACpB,eAAO;AAAA,MACT;AAAA,IAGF;AAGA,QAAI,MAAM,aAAa;AACrB,aAAO,SAAS;AAGhB,UAAI,OAAO,MAAM,MAAM,GAAG;AACxB,cAAM,cAAc;AACpB,cAAM,cAAc;AACpB,cAAM,mBAAmB;AACzB,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,MAAM,IAAI,GAAG;AACtB,cAAM,cAAc;AAEpB,YAAI,CAAC,MAAM,qBAAqB,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,UAAU;AAChG,gBAAM,eAAe,MAAM;AAAA,QAC7B;AACA,cAAM,cAAc;AACpB,cAAM,mBAAmB;AACzB,eAAO;AAAA,MACT;AAGA,UAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAEhD,UAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAE/B,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AACrC,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AAErC,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AACrC,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AAErC,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AAErC,UAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,aAAO,KAAK;AACZ,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,iBAAiB,QAAQ;AAEjC,UAAI,OAAO,MAAM,uBAAuB,GAAG;AACzC,cAAM,WAAW,OAAO,QAAQ,EAAE,QAAQ,QAAQ,EAAE,EAAE,YAAY;AAClE,cAAM,eAAe;AACrB,cAAM,cAAc;AACpB,cAAM,cAAc;AACpB,cAAM,mBAAmB;AACzB,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,iBAAiB,UAAU;AAGnC,YAAI,OAAO,MAAM,OAAO,GAAG;AAAE,iBAAO,UAAU;AAAG,iBAAO;AAAA,QAAW;AAEnE,YAAI,OAAO,MAAM,OAAO,GAAG;AACzB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,gBAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AACjC,mBAAO,KAAK;AAAA,UACd;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,OAAO,GAAG;AACzB,gBAAM,IAAI,OAAO,QAAQ;AACzB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,kBAAM,KAAK,OAAO,KAAK;AACvB,gBAAI,OAAO,KAAK,OAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAAA,UAC1D;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,IAAI,GAAG;AACtB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,gBAAI,OAAO,KAAK,MAAM,IAAK;AAAA,UAC7B;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,kOAAkO,EAAG,QAAO;AAE7P,YAAI,OAAO,MAAM,cAAc,EAAG,QAAO;AAEzC,YAAI,OAAO,MAAM,4BAA4B,EAAG,QAAO;AAEvD,YAAI,OAAO,MAAM,mBAAmB,EAAG,QAAO;AAE9C,YAAI,OAAO,MAAM,uBAAuB,EAAG,QAAO;AAClD,eAAO,KAAK;AACZ,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,iBAAiB,SAAS;AAGlC,YAAI,OAAO,MAAM,OAAO,GAAG;AACzB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,gBAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AACjC,mBAAO,KAAK;AAAA,UACd;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,OAAO,GAAG;AACzB,gBAAM,IAAI,OAAO,QAAQ;AACzB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,kBAAM,KAAK,OAAO,KAAK;AACvB,gBAAI,OAAO,KAAK,OAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAAA,UAC1D;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,cAAc,EAAG,QAAO;AAEzC,YAAI,OAAO,MAAM,sBAAsB,EAAG,QAAO;AAEjD,YAAI,OAAO,MAAM,0DAA0D,EAAG,QAAO;AAErF,YAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAEhD,YAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAEhD,YAAI,OAAO,MAAM,sKAAsK,EAAG,QAAO;AAEjM,YAAI,OAAO,MAAM,iBAAiB,EAAG,QAAO;AAE5C,YAAI,OAAO,MAAM,YAAY,EAAG,QAAO;AACvC,eAAO,KAAK;AACZ,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,MAAM,aAAa;AACrB,aAAO,UAAU;AACjB,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,cAAc;AACtB,aAAO,SAAS;AAEhB,UAAI,OAAO,KAAK,MAAM,KAAK;AACzB,eAAO,KAAK;AACZ,cAAM,eAAe;AACrB,cAAM,oBAAoB;AAC1B,cAAM,cAAc;AACpB,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,MAAM,mBAAmB,EAAG,QAAO;AAC9C,UAAI,OAAO,MAAM,kBAAkB,EAAG,QAAO;AAE7C,YAAM,UAAU;AAChB,UAAI,OAAO,MAAM,sBAAsB,GAAG;AACxC,cAAM,cAAc,OAAO,QAAQ;AACnC,eAAO;AAAA,MACT;AACA,UAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,UAAI,OAAO,MAAM,mBAAmB,GAAG;AACrC,eAAO,QAAQ,KAAK,MAAM,WAAW,IAAI,QAAQ;AAAA,MACnD;AAEA,aAAO,KAAK;AACZ,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,IAAI,GAAG;AAChB,UAAI;AACJ,UAAK,QAAQ,OAAO,MAAM,cAAc,GAAI;AAC1C,cAAM,OAAO,OAAO,OAAO,MAAM,OAAO,GAAG,EAAE,KAAK;AAElD,YAAI,SAAS,IAAI;AACf,gBAAM,WAAW,IAAI;AAAA,QACvB,OAAO;AACL,gBAAM,YAAY,KAAK,MAAM,WAAW;AACxC,gBAAM,WAAW,KAAK,YAAY,UAAU,CAAC,EAAE,YAAY,IAAI,SAAS;AAAA,QAC1E;AAEA,cAAM,oBAAoB;AAC1B,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,MAAM,yBAAyB,KAAK,CAAC,OAAO,MAAM,cAAc,GAAG;AAC5E,eAAO;AAAA,MACT;AACA,UAAI,OAAO,MAAM,iBAAiB,EAAG,QAAO;AAC5C,UAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,cAAM,cAAc;AACpB,eAAO,UAAU;AACjB,eAAO;AAAA,MACT;AACA,UAAI,OAAO,MAAM,sBAAsB,EAAG,QAAO;AACjD,UAAI,OAAO,MAAM,+BAA+B,EAAG,QAAO;AAC1D,UAAI,OAAO,MAAM,gBAAgB,EAAG,QAAO;AAAA,IAC7C;AAGA,QAAI,MAAM,mBAAmB;AAC3B,aAAO,SAAS;AAChB,UAAI,OAAO,MAAM,SAAS,EAAG,QAAO;AACpC,UAAI,OAAO,KAAK,MAAM,KAAK;AACzB,eAAO,KAAK;AACZ,cAAM,eAAe;AACrB,cAAM,oBAAoB;AAC1B,eAAO;AAAA,MACT;AACA,YAAM,oBAAoB;AAAA,IAC5B;AAGA,UAAM,mBAAmB,MAAM,WAAW,MAAM,WAAW,SAAS,CAAC;AACrE,QAAI,qBAAqB,SAAS,CAAC,MAAM,mBAAmB;AAC1D,UAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,UAAI,OAAO,MAAM,oBAAoB,EAAG,QAAO;AAC/C,UAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,UAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAClC,UAAI,OAAO,MAAM,mBAAmB,EAAG,QAAO;AAC9C,UAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAChD,UAAI,OAAO,MAAM,eAAe,EAAG,QAAO;AAC1C,UAAI,OAAO,MAAM,oBAAoB,EAAG,QAAO;AAC/C,UAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAChD,UAAI,OAAO,MAAM,kBAAkB,EAAG,QAAO;AAC7C,UAAI,OAAO,MAAM,uDAAuD,EAAG,QAAO;AAClF,aAAO,KAAK;AACZ,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,eAAe,aAAa;AACpC,YAAM,aAAa;AACnB,UAAI,OAAO,IAAI,GAAG,GAAG;AACnB,YAAI,aAAa;AACjB,eAAO,CAAC,OAAO,IAAI,KAAK,aAAa,GAAG;AACtC,gBAAM,OAAO,OAAO,KAAK;AACzB,cAAI,SAAS,IAAK;AAAA,mBACT,SAAS,OAAO,OAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAAA,QACnE;AACA,eAAO;AAAA,MACT,OAAO;AACL,cAAM,aAAa;AAAA,MACrB;AAAA,IACF;AACA,QAAI,MAAM,eAAe,iBAAiB;AACxC,YAAM,aAAa;AACnB,UAAI,OAAO,IAAI,GAAG,GAAG;AACnB,eAAO,SAAS,MAAM;AACtB,eAAO,IAAI,GAAG;AACd,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,MAAM,cAAc,aAAa;AACnC,YAAM,YAAY;AAClB,UAAI,OAAO,IAAI,GAAG,GAAG;AACnB,YAAI,aAAa;AACjB,eAAO,CAAC,OAAO,IAAI,KAAK,aAAa,GAAG;AACtC,gBAAM,OAAO,OAAO,KAAK;AACzB,cAAI,SAAS,IAAK;AAAA,mBACT,SAAS,OAAO,OAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAAA,QACnE;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,OAAO,MAAM,iCAAiC,GAAG;AACnD,YAAM,MAAM,OAAO,QAAQ;AAC3B,YAAM,cAAc,IAAI,QAAQ,SAAS,EAAE,EAAE,YAAY;AACzD,YAAM,mBAAmB,IAAI,WAAW,IAAI;AAC5C,YAAM,cAAc;AACpB,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,MAAM,iBAAiB,EAAG,QAAO;AAC5C,QAAI,OAAO,MAAM,aAAa,EAAG,QAAO;AACxC,QAAI,OAAO,MAAM,cAAc,GAAG;AAChC,UAAI,OAAO,KAAK,MAAM,IAAK,OAAM,aAAa;AAC9C,aAAO;AAAA,IACT;AACA,QAAI,OAAO,MAAM,aAAa,GAAG;AAC/B,UAAI,OAAO,KAAK,MAAM,IAAK,OAAM,YAAY;AAC7C,aAAO;AAAA,IACT;AACA,QAAI,OAAO,MAAM,iBAAiB,EAAG,QAAO;AAC5C,QAAI,OAAO,MAAM,SAAS,EAAG,QAAO;AACpC,QAAI,OAAO,MAAM,SAAS,EAAG,QAAO;AACpC,QAAI,OAAO,MAAM,WAAW,EAAG,QAAO;AACtC,QAAI,OAAO,MAAM,WAAW,EAAG,QAAO;AACtC,QAAI,OAAO,MAAM,WAAW,EAAG,QAAO;AACtC,QAAI,OAAO,MAAM,SAAS,EAAG,QAAO;AACpC,QAAI,OAAO,MAAM,oBAAoB,EAAG,QAAO;AAC/C,QAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AAErC,WAAO,KAAK;AACZ,WAAO;AAAA,EACT;AAAA,EAEA,YAAY;AAAA,IACV,SAAS,iBAAAC,KAAE;AAAA,IACX,SAAS,iBAAAA,KAAE;AAAA,IACX,UAAU,iBAAAA,KAAE;AAAA,IACZ,QAAQ,iBAAAA,KAAE;AAAA,IACV,eAAe,iBAAAA,KAAE;AAAA,IACjB,cAAc,iBAAAA,KAAE;AAAA,IAChB,WAAW,iBAAAA,KAAE;AAAA,IACb,SAAS,iBAAAA,KAAE;AAAA,IACX,cAAc,iBAAAA,KAAE;AAAA,IAChB,MAAM,iBAAAA,KAAE;AAAA,IACR,QAAQ,iBAAAA,KAAE;AAAA,IACV,UAAU,iBAAAA,KAAE;AAAA,IACZ,gBAAgB,CAAC,iBAAAA,KAAE,QAAQ,iBAAAA,KAAE,QAAQ;AAAA,IACrC,eAAe,iBAAAA,KAAE;AAAA,IACjB,WAAW,iBAAAA,KAAE,QAAQ,iBAAAA,KAAE,QAAQ;AAAA,IAC/B,WAAW,iBAAAA,KAAE,QAAQ,iBAAAA,KAAE,OAAO;AAAA,IAC9B,KAAK,iBAAAA,KAAE;AAAA,IACP,MAAM,iBAAAA,KAAE;AAAA,IACR,QAAQ,iBAAAA,KAAE;AAAA,IACV,UAAU,iBAAAA,KAAE,SAAS,iBAAAA,KAAE,YAAY;AAAA,EACrC;AACF,CAAC;;;ADtXD,mBAAgC;AAChC,IAAAC,mBAAgG;AAChG,IAAAC,oBAA0B;;;AEN1B,mBAAoC;AAM7B,SAAS,YAAe,OAAU,OAAkB;AACzD,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,uBAAY,KAAK;AAE7D,8BAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,kBAAkB,KAAK,GAAG,KAAK;AAC9D,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,SAAO;AACT;;;ACfA,IAAAC,iBAAgF;;;ACKzE,SAAS,eAAe,SAAsC;AACnE,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,SAAO,QACJ,MAAM,GAAG,EACT,OAAO,OAAO,EACd,OAA+B,CAAC,UAAU,gBAAgB;AACzD,UAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,QAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,UAAM,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,aAAa,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AAC1E,UAAM,QAAQ,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AAC5C,aAAS,GAAG,IAAI;AAChB,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACT;AAKO,SAAS,WAAW,MAAsB;AAC/C,SAAO,KACJ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,YAAY,EACZ,QAAQ,aAAa,EAAE,EACvB,QAAQ,QAAQ,GAAG;AACxB;AAKO,SAAS,WAAW,IAAkB;AAC3C,QAAM,UAAU,SAAS,eAAe,EAAE;AAC1C,MAAI,SAAS;AACX,YAAQ,eAAe,EAAE,UAAU,UAAU,OAAO,QAAQ,CAAC;AAAA,EAC/D;AACF;AAMO,SAAS,kBAAkB,MAA6D;AAC7F,QAAM,QAAQ,KAAK,MAAM,4BAA4B;AACrD,MAAI,CAAC,MAAO,QAAO,EAAE,MAAM,SAAS,IAAI,IAAI,GAAG;AAE/C,QAAM,WAAW,MAAM,CAAC;AACxB,QAAM,cAAc,MAAM,CAAC;AAE3B,QAAM,YAAsB,CAAC;AAC7B,MAAI,KAAK;AAGT,aAAW,CAAC,EAAE,KAAK,KAAK,KAAK,SAAS,SAAS,qBAAqB,GAAG;AACrE,QAAI,QAAQ,SAAS;AACnB,gBAAU,KAAK,GAAG,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAAA,IACtD,WAAW,QAAQ,MAAM;AACvB,WAAK;AAAA,IACP;AAAA,EACF;AAIA,QAAM,WAAW,SAAS,QAAQ,mBAAmB,EAAE;AACvD,aAAW,SAAS,SAAS,MAAM,KAAK,EAAE,OAAO,OAAO,GAAG;AACzD,QAAI,MAAM,WAAW,GAAG,EAAG,WAAU,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,aAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,GAAI,MAAK,MAAM,MAAM,CAAC;AAAA,EAC3D;AAEA,SAAO,EAAE,MAAM,aAAa,SAAS,UAAU,KAAK,GAAG,GAAG,GAAG;AAC/D;AAEA,IAAI,gBAAgB;AACb,SAAS,oBAA0B;AACxC,kBAAgB;AAClB;AAKO,SAAS,kBAA0B;AACxC,SAAO,SAAS,EAAE,aAAa;AACjC;AAOO,SAAS,WAAW,aAA6C;AACtE,QAAM,QAAgC,CAAC;AACvC,MAAI,CAAC,aAAa,KAAK,EAAG,QAAO;AAGjC,QAAM,YAAY;AAClB,MAAI;AACJ,UAAQ,QAAQ,UAAU,KAAK,WAAW,OAAO,MAAM;AACrD,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,QAAQ,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK;AACtC,UAAM,GAAG,IAAI;AAAA,EACf;AAGA,QAAM,eAAe,YAAY,MAAM,yBAAyB;AAChE,MAAI,cAAc;AAChB,UAAM,WAAW,MAAM,OAAO,KAAK;AACnC,UAAM,aAAa,aAAa,IAAI,OAAK,EAAE,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG;AACjE,UAAM,OAAO,IAAI,WAAW,GAAG,QAAQ,IAAI,UAAU,KAAK;AAAA,EAC5D;AAGA,QAAM,UAAU,YAAY,MAAM,6BAA6B;AAC/D,MAAI,WAAW,CAAC,MAAM,IAAI,GAAG;AAC3B,UAAM,IAAI,IAAI,QAAQ,CAAC;AAAA,EACzB;AAEA,SAAO;AACT;AAMO,SAAS,eAAe,aAA0C;AACvE,QAAM,QAA6B,CAAC;AACpC,MAAI,CAAC,aAAa,KAAK,EAAG,QAAO;AAEjC,QAAM,YAAY;AAClB,MAAI;AACJ,UAAQ,QAAQ,UAAU,KAAK,WAAW,OAAO,MAAM;AACrD,QAAI,MAAM,MAAM,CAAC;AACjB,UAAM,QAAQ,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK;AAElD,QAAI,QAAQ,QAAS,OAAM;AAAA,aAClB,QAAQ,MAAO,OAAM;AAAA,aACrB,QAAQ,WAAY,OAAM;AAGnC,QAAI,QAAQ,WAAW,OAAO,UAAU,UAAU;AAChD,YAAM,GAAG,IAAI,eAAe,KAAK;AAAA,IACnC,OAAO;AACL,YAAM,GAAG,IAAI;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;;;AC/IO,SAAS,cAAcC,WAA2B;AACvD,MAAI,CAACA,UAAU,QAAO,CAAC;AACvB,QAAM,QAAQA,UAAS,MAAM,IAAI;AACjC,QAAM,SAAkB,CAAC;AACzB,MAAI,IAAI;AAER,SAAO,IAAI,MAAM,QAAQ;AACvB,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI;AAGJ,QAAK,QAAQ,QAAQ,MAAM,mBAAmB,GAAI;AAChD,YAAM,QAAQ,MAAM,CAAC,EAAE;AACvB,YAAM,UAAU,MAAM,CAAC;AACvB,YAAM,EAAE,MAAAC,OAAM,SAAAC,UAAS,IAAI,SAAS,IAAI,kBAAkB,OAAO;AACjE,YAAMC,MAAK,YAAY,WAAWF,MAAK,QAAQ,UAAU,EAAE,CAAC;AAC5D,aAAO,KAAK,EAAE,MAAM,UAAU,OAAO,MAAAA,OAAM,IAAAE,KAAI,SAASD,YAAW,OAAU,CAAC;AAC9E;AACA;AAAA,IACF;AAGA,QAAK,QAAQ,QAAQ,MAAM,2BAA2B,GAAI;AACxD,YAAM,UAAU,MAAM,CAAC;AACvB,YAAM,QAAQ,MAAM,CAAC,MAAM,OAAO,WAAW;AAC7C,aAAO,KAAK,EAAE,MAAM,aAAa,SAAS,MAAM,CAAC;AACjD;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,YAAM,cAAc,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC1C,YAAM,aAAa,YAAY,MAAM,wBAAwB;AAC7D,YAAM,OAAO,YAAY,QAAQ,wBAAwB,EAAE,EAAE,KAAK;AAClE,YAAM,QAAQ,aAAa,WAAW,CAAC,IAAI;AAC3C,YAAM,UAAoB,CAAC;AAC3B;AACA,aAAO,IAAI,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,KAAK,GAAG;AAC7D,gBAAQ,KAAK,MAAM,CAAC,CAAC;AACrB;AAAA,MACF;AACA,aAAO,KAAK,EAAE,MAAM,aAAa,UAAU,MAAM,OAAO,SAAS,QAAQ,KAAK,IAAI,EAAE,CAAC;AACrF;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,YAAM,OAAO,QAAQ,MAAM,CAAC,EAAE,KAAK;AAGnC,UAAI,SAAS,IAAI;AACf,eAAO,KAAK,EAAE,MAAM,aAAa,SAAS,KAAK,CAAC;AAChD;AACA;AAAA,MACF;AAEA,YAAM,YAAY,KAAK,MAAM,WAAW;AACxC,YAAM,gBAAgB,YAAY,UAAU,CAAC,IAAI;AAGjD,UAAI,IAAI,IAAI;AACZ,UAAI,cAAc;AAClB,UAAI,aAAa;AAEjB,aAAO,IAAI,MAAM,QAAQ;AACvB,cAAM,iBAAiB,MAAM,CAAC,EAAE,KAAK;AACrC,YAAI,mBAAmB,OAAO;AAC5B,cAAI,gBAAgB,GAAG;AACrB,yBAAa;AACb;AAAA,UACF,OAAO;AACL;AAAA,UACF;AAAA,QACF,WAAW,eAAe,WAAW,KAAK,GAAG;AAE3C;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI,YAAY;AAEd,cAAM,eAAyB,CAAC;AAChC,iBAAS,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC9B,uBAAa,KAAK,MAAM,CAAC,CAAC;AAAA,QAC5B;AACA,cAAM,aAAa,aAAa,KAAK,IAAI;AAGzC,cAAM,aAAa,YAAY,KAAK,MAAM,cAAc,MAAM,EAAE,KAAK,IAAI;AAGzE,YAAI,cAAc;AAClB,YAAI,YAAY;AAChB,cAAM,kBAAkB,WAAW,MAAM,iBAAiB;AAC1D,YAAI,iBAAiB;AACnB,wBAAc,gBAAgB,CAAC;AAAA,QACjC,WAAW,YAAY;AAErB,sBAAY;AAAA,QACd;AAEA,cAAM,QAAQ,WAAW,WAAW;AACpC,YAAI,aAAa,CAAC,MAAM,OAAO,GAAG;AAChC,gBAAM,OAAO,IAAI;AAAA,QACnB;AAGA,cAAM,QAAQ,WAAW,UAAU;AAEnC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,gBAAgB;AAAA,QAC3B,CAAmB;AAEnB,YAAI,IAAI;AACR;AAAA,MACF,OAAO;AAEL,eAAO,KAAK,EAAE,MAAM,aAAa,SAAS,KAAK,CAAC;AAChD;AACA;AAAA,MACF;AAAA,IACF;AAGA,QAAK,QAAQ,QAAQ,MAAM,uDAAuD,GAAI;AACpF,YAAM,CAAC,EAAE,SAAS,KAAK,aAAa,MAAM,QAAQ,IAAI;AAEtD,UAAI,QAAQ,KAAK,GAAG;AAClB,eAAO,KAAK,EAAE,MAAM,aAAa,SAAS,QAAQ,KAAK,EAAE,CAAC;AAAA,MAC5D;AAEA,UAAI,MAAM;AACV,YAAM,QAA6B,CAAC;AACpC,UAAI,IAAI,SAAS,OAAO,GAAG;AACzB,cAAM,IAAI,QAAQ,SAAS,EAAE;AAC7B,cAAM,QAAQ;AACd,cAAM,SAAS;AAAA,MACjB,WAAW,IAAI,SAAS,QAAQ,GAAG;AACjC,cAAM,IAAI,QAAQ,UAAU,EAAE;AAC9B,cAAM,QAAQ;AACd,cAAM,SAAS;AAAA,MACjB,WAAW,IAAI,SAAS,SAAS,GAAG;AAClC,cAAM,IAAI,QAAQ,WAAW,EAAE;AAC/B,cAAM,UAAU;AAChB,cAAM,SAAS;AAAA,MACjB;AACA,UAAI,MAAM;AACR,cAAM,CAAC,OAAO,MAAM,IAAI,KAAK,MAAM,GAAG;AACtC,YAAI,MAAO,OAAM,QAAQ,MAAM,KAAK;AACpC,YAAI,OAAQ,OAAM,SAAS,OAAO,KAAK;AAAA,MACzC;AACA,aAAO,KAAK,EAAE,MAAM,SAAS,KAAK,KAAK,MAAM,CAAC;AAE9C,UAAI,SAAS,KAAK,GAAG;AACnB,eAAO,KAAK,EAAE,MAAM,aAAa,SAAS,SAAS,KAAK,EAAE,CAAC;AAAA,MAC7D;AACA;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,SAAS,GAAG,KAAK,IAAI,IAAI,MAAM,UAAU,MAAM,IAAI,CAAC,EAAE,SAAS,KAAK,GAAG;AACjF,YAAM,aAAa,CAAC,IAAI;AACxB;AACA,iBAAW,KAAK,MAAM,CAAC,CAAC;AACxB;AACA,aAAO,IAAI,MAAM,UAAU,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,GAAG,GAAG;AACxD,mBAAW,KAAK,MAAM,CAAC,CAAC;AACxB;AAAA,MACF;AACA,aAAO,KAAK,EAAE,MAAM,SAAS,SAAS,WAAW,KAAK,IAAI,EAAE,CAAC;AAC7D;AAAA,IACF;AAGA,QAAK,QAAQ,QAAQ,MAAM,6BAA6B,GAAI;AAC1D,YAAM,YAAY,CAAC,IAAI;AACvB;AACA,aAAO,IAAI,MAAM,QAAQ;AACvB,cAAM,WAAW,MAAM,CAAC;AACxB,cAAM,cAAc,SAAS,KAAK;AAClC,YACE,YAAY,MAAM,6BAA6B,KAC/C,gBAAgB,MAChB,SAAS,WAAW,IAAI,GACxB;AACA,oBAAU,KAAK,QAAQ;AACvB;AAAA,QACF,OAAO;AACL;AAAA,QACF;AAAA,MACF;AACA,aAAO,KAAK,EAAE,MAAM,QAAQ,SAAS,UAAU,KAAK,IAAI,EAAE,CAAC;AAC3D;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,YAAM,aAAa,CAAC,IAAI;AACxB;AACA,aAAO,IAAI,MAAM,WAAW,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,KAAK,MAAM,CAAC,EAAE,KAAK,MAAM,KAAK;AACtF,mBAAW,KAAK,MAAM,CAAC,CAAC;AACxB;AAAA,MACF;AACA,YAAM,WAAW,WAAW,KAAK,IAAI,EAAE,QAAQ,WAAW,EAAE;AAC5D,YAAM,EAAE,MAAAD,OAAM,SAAAC,UAAS,IAAAC,IAAG,IAAI,kBAAkB,QAAQ;AACxD,aAAO,KAAK,EAAE,MAAM,cAAc,SAASF,OAAM,SAASC,YAAW,QAAW,IAAAC,IAAG,CAAC;AACpF;AAAA,IACF;AAGA,QAAI,6BAA6B,KAAK,OAAO,GAAG;AAC9C,aAAO,KAAK,EAAE,MAAM,KAAK,CAAC;AAC1B;AACA;AAAA,IACF;AAGA,QAAI,kBAAkB,KAAK,OAAO,GAAG;AACnC,aAAO,KAAK,EAAE,MAAM,MAAM,CAAC;AAC3B;AACA;AAAA,IACF;AAGA,QAAI,YAAY,IAAI;AAClB;AACA;AAAA,IACF;AAGA,QAAI,gBAAgB,QAAQ,MAAM,oBAAoB;AACtD,QAAI,eAAe;AACjB,YAAM,UAAU,cAAc,CAAC,EAAE,YAAY;AAE7C,YAAM,eAAe,oBAAI,IAAI;AAAA,QAC3B;AAAA,QAAQ;AAAA,QAAQ;AAAA,QAAM;AAAA,QAAO;AAAA,QAAS;AAAA,QAAM;AAAA,QAAO;AAAA,QACnD;AAAA,QAAQ;AAAA,QAAQ;AAAA,QAAS;AAAA,QAAU;AAAA,QAAS;AAAA,MAC9C,CAAC;AAED,YAAM,gBAAgB,MAAM,MAAM,CAAC,EAAE,KAAK,IAAI;AAG9C,YAAM,eAAe,IAAI,OAAO,SAAS,OAAO,gBAAgB,GAAG;AACnE,YAAM,eAAe,cAAc,MAAM,YAAY;AAErD,UAAI,cAAc;AAChB,cAAM,cAAc,aAAa,CAAC;AAElC,cAAM,QAAQ,aAAa,CAAC,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAExD,cAAM,gBAAgB,YAAY,SAAS,IAAI,KAAK,aAAa,IAAI,OAAO;AAE5E,YAAI,eAAe;AACjB,gBAAM,YAAY,cAAc,UAAU,GAAG,aAAa,QAAS,YAAY,MAAM;AACrF,gBAAM,gBAAgB,UAAU,MAAM,IAAI,EAAE;AAE5C,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,KAAK;AAAA,YACL;AAAA,YACA,UAAU,CAAC;AAAA;AAAA,UACb,CAAmB;AAEnB,eAAK;AACL;AAAA,QACF,OAAO;AAEL,cAAI,cAAc;AAClB,cAAI,aAAa;AACjB,cAAI,iBAAiB;AAErB,gBAAM,WAAW,IAAI,OAAO,MAAM,OAAO,aAAa,IAAI;AAC1D,mBAAS,YAAY,aAAa,QAAS,YAAY;AAEvD,cAAI;AACJ,kBAAQ,YAAY,SAAS,KAAK,aAAa,OAAO,MAAM;AAC1D,gBAAI,UAAU,CAAC,EAAE,WAAW,IAAI,GAAG;AACjC;AACA,kBAAI,cAAc,GAAG;AACnB,6BAAa,UAAU;AACvB,iCAAiB,UAAU,CAAC,EAAE;AAC9B;AAAA,cACF;AAAA,YACF,OAAO;AACL,kBAAI,CAAC,UAAU,CAAC,EAAE,SAAS,IAAI,GAAG;AAChC;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,cAAI,eAAe,IAAI;AACrB,kBAAM,YAAY,cAAc,UAAU,GAAG,aAAa,cAAc;AACxE,kBAAM,gBAAgB,UAAU,MAAM,IAAI,EAAE;AAG5C,gBAAI,YAAY,WAAW,YAAY,UAAU;AAC/C,qBAAO,KAAK;AAAA,gBACV,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,SAAS,gBAAgB;AAAA,cAC3B,CAAC;AAAA,YACH,OAAO;AACL,oBAAM,eAAe,cAAc,UAAU,aAAa,QAAS,YAAY,QAAQ,UAAU;AACjG,qBAAO,KAAK;AAAA,gBACV,MAAM;AAAA,gBACN,KAAK;AAAA,gBACL;AAAA,gBACA,UAAU,cAAc,YAAY;AAAA,cACtC,CAAmB;AAAA,YACrB;AAEA,iBAAK;AACL;AAAA,UACF,OAAO;AAEL,kBAAM,YAAY,cAAc,UAAU,GAAG,aAAa,QAAS,YAAY,MAAM;AACrF,kBAAM,gBAAgB,UAAU,MAAM,IAAI,EAAE;AAE5C,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,KAAK;AAAA,cACL;AAAA,cACA,UAAU,CAAC;AAAA,YACb,CAAmB;AAEnB,iBAAK;AACL;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,iBAAiB,CAAC,IAAI;AAC5B;AACA,WAAO,IAAI,MAAM,QAAQ;AACvB,YAAM,WAAW,MAAM,CAAC;AACxB,YAAM,cAAc,SAAS,KAAK;AAClC,UACE,gBAAgB,MAChB,YAAY,WAAW,GAAG,KAC1B,YAAY,WAAW,KAAK,KAC5B,YAAY,SAAS,GAAG,KACxB,YAAY,MAAM,wBAAwB,KAC1C,YAAY,WAAW,GAAG,KAC1B,YAAY,WAAW,KAAK,KAC5B,YAAY,WAAW,IAAI,KAC3B,YAAY,MAAM,sBAAsB,GACxC;AACA;AAAA,MACF;AACA,qBAAe,KAAK,QAAQ;AAC5B;AAAA,IACF;AACA,UAAM,eAAe,eAAe,KAAK,IAAI,EAAE,KAAK;AACpD,UAAM,EAAE,MAAM,SAAS,GAAG,IAAI,kBAAkB,YAAY;AAC5D,WAAO,KAAK,EAAE,MAAM,aAAa,SAAS,MAAM,SAAS,WAAW,QAAW,GAAG,CAAC;AAAA,EACrF;AAEA,SAAO;AACT;AAeA,SAAS,WAAW,YAA4C;AAC9D,QAAM,QAAgC,CAAC;AACvC,QAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,MAAI,cAAc;AAClB,MAAI,SAAmB,CAAC;AACxB,MAAI,eAAe;AAEnB,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAG1B,QAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,YAAM,OAAO,QAAQ,MAAM,CAAC,EAAE,KAAK;AACnC,UAAI,SAAS,IAAI;AAEf,uBAAe,KAAK,IAAI,GAAG,eAAe,CAAC;AAAA,MAC7C,OAAO;AAEL;AAAA,MACF;AAAA,IACF;AAGA,UAAM,YAAY,QAAQ,MAAM,aAAa;AAC7C,QAAI,aAAa,iBAAiB,GAAG;AAEnC,YAAM,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,KAAK;AAC5C,eAAS,CAAC;AACV,oBAAc,UAAU,CAAC;AAAA,IAC3B,OAAO;AACL,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AAGA,QAAM,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,KAAK;AAG5C,aAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,QAAI,CAAC,MAAM,GAAG,EAAG,QAAO,MAAM,GAAG;AAAA,EACnC;AAEA,SAAO;AACT;;;AClbA,IAAAC,gBAAwC;;;ACAxC,kBAAiB;AAEjB,wBAAuB;AACvB,wBAAuB;AACvB,oBAAmB;AACnB,iBAAgB;AAChB,iBAAgB;AAChB,kBAAiB;AACjB,kBAAiB;AACjB,iBAAgB;AAChB,sBAAqB;AACrB,kBAAiB;AACjB,oBAAmB;AACnB,iBAAgB;AAChB,gBAAe;AACf,kBAAiB;AACjB,iBAAgB;AAChB,kBAAiB;AACjB,mBAAkB;AAClB,oBAAmB;AACnB,kBAAiB;AACjB,kBAAiB;AACjB,iBAAiB;AACjB,wBAAuB;AACvB,kBAAiB;AACjB,mBAAkB;AAElB,YAAAC,QAAK,iBAAiB,cAAc,kBAAAC,OAAU;AAC9C,YAAAD,QAAK,iBAAiB,MAAM,kBAAAC,OAAU;AACtC,YAAAD,QAAK,iBAAiB,OAAO,kBAAAC,OAAU;AACvC,YAAAD,QAAK,iBAAiB,cAAc,kBAAAE,OAAU;AAC9C,YAAAF,QAAK,iBAAiB,MAAM,kBAAAE,OAAU;AACtC,YAAAF,QAAK,iBAAiB,OAAO,kBAAAE,OAAU;AACvC,YAAAF,QAAK,iBAAiB,UAAU,cAAAG,OAAM;AACtC,YAAAH,QAAK,iBAAiB,MAAM,cAAAG,OAAM;AAClC,YAAAH,QAAK,iBAAiB,OAAO,WAAAI,OAAG;AAChC,YAAAJ,QAAK,iBAAiB,QAAQ,WAAAK,OAAG;AACjC,YAAAL,QAAK,iBAAiB,OAAO,WAAAK,OAAG;AAChC,YAAAL,QAAK,iBAAiB,OAAO,WAAAK,OAAG;AAChC,YAAAL,QAAK,iBAAiB,QAAQ,YAAAM,OAAI;AAClC,YAAAN,QAAK,iBAAiB,QAAQ,YAAAO,OAAI;AAClC,YAAAP,QAAK,iBAAiB,MAAM,YAAAO,OAAI;AAChC,YAAAP,QAAK,iBAAiB,OAAO,YAAAO,OAAI;AACjC,YAAAP,QAAK,iBAAiB,OAAO,WAAAQ,OAAG;AAChC,YAAAR,QAAK,iBAAiB,YAAY,gBAAAS,OAAQ;AAC1C,YAAAT,QAAK,iBAAiB,MAAM,gBAAAS,OAAQ;AACpC,YAAAT,QAAK,iBAAiB,QAAQ,YAAAU,OAAI;AAClC,YAAAV,QAAK,iBAAiB,UAAU,cAAAW,OAAM;AACtC,YAAAX,QAAK,iBAAiB,MAAM,cAAAW,OAAM;AAClC,YAAAX,QAAK,iBAAiB,OAAO,WAAAY,OAAG;AAChC,YAAAZ,QAAK,iBAAiB,KAAK,WAAAY,OAAG;AAC9B,YAAAZ,QAAK,iBAAiB,MAAM,UAAAa,OAAE;AAC9B,YAAAb,QAAK,iBAAiB,QAAQ,YAAAc,OAAI;AAClC,YAAAd,QAAK,iBAAiB,MAAM,YAAAc,OAAI;AAChC,YAAAd,QAAK,iBAAiB,OAAO,WAAAe,OAAG;AAChC,YAAAf,QAAK,iBAAiB,QAAQ,YAAAgB,OAAI;AAClC,YAAAhB,QAAK,iBAAiB,MAAM,YAAAgB,OAAI;AAChC,YAAAhB,QAAK,iBAAiB,SAAS,aAAAiB,OAAK;AACpC,YAAAjB,QAAK,iBAAiB,UAAU,cAAAkB,OAAM;AACtC,YAAAlB,QAAK,iBAAiB,MAAM,cAAAkB,OAAM;AAClC,YAAAlB,QAAK,iBAAiB,QAAQ,YAAAmB,OAAI;AAClC,YAAAnB,QAAK,iBAAiB,QAAQ,YAAAoB,OAAI;AAClC,YAAApB,QAAK,iBAAiB,OAAO,YAAAoB,OAAI;AACjC,YAAApB,QAAK,iBAAiB,QAAQ,WAAAqB,OAAI;AAClC,YAAArB,QAAK,iBAAiB,OAAO,WAAAqB,OAAI;AACjC,YAAArB,QAAK,iBAAiB,cAAc,kBAAAsB,OAAU;AAC9C,YAAAtB,QAAK,iBAAiB,UAAU,kBAAAsB,OAAU;AAC1C,YAAAtB,QAAK,iBAAiB,QAAQ,YAAAuB,OAAI;AAClC,YAAAvB,QAAK,iBAAiB,SAAS,aAAAwB,OAAK;AAEpC,IAAO,yBAAQ,YAAAxB;;;ADpEf,oBAAuB;AAmBjB;AARC,IAAM,eAA4C,CAAC,EAAE,UAAU,eAAe,GAAG,MAAM;AAC5F,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,YAAY,+DAA+D,YAAY;AAC7F,QAAM,cAAc,yBAAyB,KAAK,QAAQ;AAE1D,MAAI,aAAa;AACf,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,yBAAyB,EAAE,QAAQ,MAAM,QAAQ,IAAI;AAAA,QACrD,eAAY;AAAA;AAAA,IACd;AAAA,EAEJ;AAEA,SACE,4CAAC,UAAK,WAAW,WAAW,eAAY,QACrC,oBACH;AAEJ;AAYO,IAAM,YAAsC,CAAC,EAAE,MAAM,UAAU,MAAM,MAAM;AAChF,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,KAAK;AAC1C,QAAM,eAAW,sBAA6C,IAAI;AAElE,QAAM,OAAO,UAAU,MAAM,OAAO,EAAE,CAAC,GAAG,KAAK,KAAK;AAEpD,MAAI;AACJ,MAAI;AACF,QAAI,QAAQ,uBAAK,YAAY,IAAI,GAAG;AAClC,aAAO,uBAAK,UAAU,MAAM,EAAE,UAAU,KAAK,CAAC,EAAE;AAAA,IAClD,OAAO;AACL,aAAO,uBAAK,cAAc,IAAI,EAAE;AAAA,IAClC;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM;AACvB,cAAU,UAAU,UAAU,IAAI;AAClC,cAAU,IAAI;AACd,QAAI,SAAS,QAAS,cAAa,SAAS,OAAO;AACnD,aAAS,UAAU,WAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,EAC5D;AAEA,SACE,6CAAC,SAAI,WAAU,mGACZ;AAAA,aACC,6CAAC,SAAI,WAAU,8IACb;AAAA,kDAAC,UAAK,WAAU,sCAAqC,yBAAW;AAAA,MAC/D;AAAA,OACH;AAAA,IAEF,4CAAC,SAAI,WAAU,4EACb,sDAAC,SAAI,WAAU,OAAM,sDAAC,UAAK,WAAW,YAAY,QAAQ,WAAW,IAAI,yBAAyB,EAAE,QAAQ,KAAK,GAAG,GAAE,GACxH;AAAA,IACA,4CAAC,YAAO,WAAU,4MAA2M,SAAS,YAAY,OAAM,aACtP,sDAAC,UAAK,WAAU,4BAA2B,OAAO,EAAE,UAAU,OAAO,GAClE,mBAAS,UAAU,gBACtB,GACF;AAAA,KACF;AAEJ;AAeA,IAAM,eAAuC;AAAA,EAC3C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AACb;AAEA,IAAM,cAAsC;AAAA,EAC1C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AACb;AAEO,IAAM,aAAwC,CAAC,EAAE,MAAM,OAAO,MAAM,YAAY,IAAI,OAAO,SAAS,MAAM;AAC/G,QAAM,eAAe,QAAQ,aAAa,IAAI,KAAK;AAEnD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,mDAAmD,YAAY,IAAI,KAAK,YAAY,IAAI,IAAI,SAAS;AAAA,MAChH;AAAA,MAEC;AAAA,iBACC,6CAAC,QAAG,WAAU,wDACZ;AAAA,sDAAC,gBAAa,UAAU,cAAc,cAAa,YAAW;AAAA,UAC9D,4CAAC,UAAM,iBAAM;AAAA,WACf;AAAA,QAEF,4CAAC,SAAI,WAAU,sCAAsC,UAAS;AAAA;AAAA;AAAA,EAChE;AAEJ;AAeO,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,YAAY;AAAA,EACZ;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,WAAW;AAChD,QAAM,eAAe,QAAQ;AAE7B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,2EAA2E,SAAS;AAAA,MAC/F,MAAM;AAAA,MACN;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAS,OAAK;AACZ,gBAAE,eAAe;AACjB,wBAAU,UAAQ,CAAC,IAAI;AAAA,YACzB;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,UAAU;AAAA,kBACV,cAAc,wBAAwB,SAAS,cAAc,EAAE;AAAA;AAAA,cACjE;AAAA,cACA,4CAAC,UAAM,iBAAM;AAAA;AAAA;AAAA,QACf;AAAA,QACC,UACC,4CAAC,SAAI,WAAU,oGACZ,UACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAaO,IAAM,QAA8B,CAAC,EAAE,OAAO,QAAQ,SAAS,SAAS,MAAM;AACnF,SACE,4CAAC,qBAAO,MAAP,EAAY,MAAM,QAAQ,cAAc,CAAC,SAAS;AAAE,QAAI,CAAC,KAAM,SAAQ;AAAA,EAAG,GACzE,uDAAC,qBAAO,QAAP,EACC;AAAA,gDAAC,qBAAO,UAAP,EAAgB,WAAU,sCAAqC;AAAA,IAChE,4CAAC,qBAAO,UAAP,EAAgB,WAAU,+DACzB,uDAAC,qBAAO,OAAP,EAAa,WAAU,iIACtB;AAAA,mDAAC,SAAI,WAAU,iGACb;AAAA,oDAAC,qBAAO,OAAP,EAAa,WAAU,0BAA0B,iBAAM;AAAA,QACxD,4CAAC,qBAAO,OAAP,EAAa,WAAU,uIACtB,sDAAC,UAAK,WAAU,sCAAqC,mBAAK,GAC5D;AAAA,SACF;AAAA,MACA,4CAAC,SAAI,WAAU,+LACZ,UACH;AAAA,OACF,GACF;AAAA,KACF,GACF;AAEJ;;;AE7Ma,IAAAyB,sBAAA;AARN,SAAS,aAAa,MAA+B;AAC1D,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,YAAY,CAAC,MAAc,QAAiC;AAChE,QAAIC;AAGJ,QAAKA,SAAQ,KAAK,MAAM,oBAAoB,GAAI;AAC9C,aAAO,6CAAC,gBAAuB,UAAUA,OAAM,CAAC,KAAtB,GAAyB;AAAA,IACrD;AAGA,QAAKA,SAAQ,KAAK,MAAM,aAAa,GAAI;AACvC,YAAM,UAAUA,OAAM,CAAC;AACvB,YAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,UAAI,QAAQ;AACZ,UAAI,kBAAkB;AACtB,UAAI,OAAO;AACX,UAAI,YAAY;AAEhB,UACE,MAAM,SAAS,GAAG,MAAM,oCAAoC,KAC5D,CAAC,OAAO,QAAQ,SAAS,UAAU,UAAU,UAAU,MAAM,EAAE,SAAS,MAAM,SAAS,CAAC,GACxF;AACA,gBAAQ,MAAM,WAAW;AAAA,MAC3B;AACA,UAAI,CAAC,SAAS,UAAU,UAAU,UAAU,MAAM,EAAE,SAAS,MAAM,SAAS,CAAC,GAAG;AAC9E,0BAAkB,MAAM,WAAW;AAAA,MACrC;AACA,UAAI,CAAC,aAAa,gBAAgB,YAAY,MAAM,EAAE,SAAS,MAAM,SAAS,CAAC,GAAG;AAChF,eAAO,MAAM,SAAS,MAAM,SAAS,2BAA2B,MAAM,WAAW;AAAA,MACnF;AACA,YAAM,YAAY,MAAM,MAAM,SAAS,EAAE,KAAK,GAAG;AACjD,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO;AAAA,YACL,gBAAgB,GAAG,IAAI,IAAI,eAAe,IAAI,KAAK;AAAA,YACnD,yBAAyB;AAAA,UAC3B;AAAA,UAEC,uBAAa,SAAS;AAAA;AAAA,QANlB;AAAA,MAOP;AAAA,IAEJ;AAGA,QAAKA,SAAQ,KAAK,MAAM,0BAA0B,GAAI;AACpD,aACE,6CAAC,UAAe,OAAO,EAAE,OAAOA,OAAM,CAAC,EAAE,GACtC,uBAAaA,OAAM,CAAC,CAAC,KADb,GAEX;AAAA,IAEJ;AAGA,QAAKA,SAAQ,KAAK,MAAM,gBAAgB,GAAI;AAC1C,aACE,6CAAC,UAAe,WAAU,sGACvB,uBAAaA,OAAM,CAAC,CAAC,KADb,GAEX;AAAA,IAEJ;AAGA,QAAKA,SAAQ,KAAK,MAAM,aAAa,GAAI;AACvC,aACE,6CAAC,UAAe,WAAU,gDACvB,uBAAaA,OAAM,CAAC,CAAC,KADb,GAEX;AAAA,IAEJ;AAGA,QAAKA,SAAQ,KAAK,MAAM,qBAAqB,GAAI;AAC/C,aACE,6CAAC,YACC,uDAAC,QAAI,uBAAaA,OAAM,CAAC,CAAC,GAAE,KADjB,GAEb;AAAA,IAEJ;AAGA,QAAKA,SAAQ,KAAK,MAAM,iBAAiB,GAAI;AAC3C,aAAO,6CAAC,YAAkB,uBAAaA,OAAM,CAAC,CAAC,KAA3B,GAA6B;AAAA,IACnD;AAGA,QAAKA,SAAQ,KAAK,MAAM,WAAW,GAAI;AACrC,aAAO,6CAAC,QAAc,uBAAaA,OAAM,CAAC,CAAC,KAA3B,GAA6B;AAAA,IAC/C;AAGA,QAAKA,SAAQ,KAAK,MAAM,aAAa,GAAI;AACvC,aAAO,6CAAC,SAAe,uBAAaA,OAAM,CAAC,CAAC,KAA3B,GAA6B;AAAA,IAChD;AAGA,QAAKA,SAAQ,KAAK,MAAM,aAAa,GAAI;AACvC,aACE,6CAAC,UAAe,WAAU,+FACvB,UAAAA,OAAM,CAAC,KADC,GAEX;AAAA,IAEJ;AAGA,QAAKA,SAAQ,KAAK,MAAM,6BAA6B,GAAI;AACvD,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,MAAMA,OAAM,CAAC;AAAA,UACb,WAAU;AAAA,UACV,QAAO;AAAA,UACP,KAAI;AAAA,UAEH,uBAAaA,OAAM,CAAC,CAAC;AAAA;AAAA,QANjB;AAAA,MAOP;AAAA,IAEJ;AAGA,QAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAAG;AAC9C,aAAO,6CAAC,UAAe,yBAAyB,EAAE,QAAQ,KAAK,KAA7C,GAAgD;AAAA,IACpE;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,QACJ;AAEF,QAAM,WAA8B,CAAC;AACrC,MAAI,YAAY;AAChB,MAAI;AACJ,MAAI,aAAa;AAEjB,UAAQ,QAAQ,MAAM,KAAK,IAAI,OAAO,MAAM;AAC1C,QAAI,MAAM,QAAQ,WAAW;AAC3B,eAAS,KAAK,KAAK,MAAM,WAAW,MAAM,KAAK,CAAC;AAAA,IAClD;AACA,aAAS,KAAK,UAAU,MAAM,CAAC,GAAG,UAAU,YAAY,EAAE,CAAC;AAC3D,gBAAY,MAAM;AAAA,EACpB;AACA,MAAI,YAAY,KAAK,QAAQ;AAC3B,aAAS,KAAK,KAAK,MAAM,SAAS,CAAC;AAAA,EACrC;AAEA,SAAO;AACT;AAKO,SAAS,YAAY,SAAkC;AAC5D,QAAM,OAAO,QAAQ,MAAM,IAAI,EAAE,OAAO,OAAK,EAAE,KAAK,CAAC;AACrD,MAAI,KAAK,SAAS,EAAG,QAAO,6CAAC,OAAG,mBAAQ;AAExC,QAAM,WAAW,CAAC,QAChB,IACG,MAAM,GAAG,EACT,IAAI,OAAK,EAAE,KAAK,CAAC,EACjB,OAAO,OAAO;AAEnB,QAAM,cAAc,SAAS,KAAK,CAAC,CAAC;AACpC,QAAM,WAAW,KAAK,MAAM,CAAC,EAAE,IAAI,QAAQ;AAE3C,SACE,6CAAC,SAAI,WAAU,mBACb,wDAAC,WAAM,WAAU,oDACf;AAAA,iDAAC,WACC,uDAAC,QACE,sBAAY,IAAI,CAAC,MAAM,OACtB,6CAAC,QAAY,WAAU,uFAAuF,uBAAa,IAAI,KAAtH,EAAwH,CAClI,GACH,GACF;AAAA,IACA,6CAAC,WACE,mBAAS,IAAI,CAAC,OAAO,OACpB,6CAAC,QACE,gBAAM,IAAI,CAAC,MAAM,OAChB,6CAAC,QAAY,WAAU,kCAAkC,uBAAa,IAAI,KAAjE,EAAmE,CAC7E,KAHM,EAIT,CACD,GACH;AAAA,KACF,GACF;AAEJ;AAKO,SAAS,WAAW,SAAkC;AAC3D,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,QAA4D,CAAC;AAEnE,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,KAAK,EAAG;AAClB,UAAM,QAAQ,KAAK,MAAM,6BAA6B;AACtD,QAAI,OAAO;AACT,YAAM,KAAK;AAAA,QACT,QAAQ,MAAM,CAAC,EAAE;AAAA,QACjB,QAAQ,MAAM,CAAC;AAAA,QACf,MAAM,MAAM,CAAC;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,EAAG,QAAO,6CAAC,OAAG,mBAAQ;AAE3C,QAAM,YAAY,UAAU,KAAK,MAAM,CAAC,EAAE,MAAM;AAChD,QAAM,MAAM,YAAY,OAAO;AAE/B,SACE,6CAAC,OAAI,WAAW,GAAG,YAAY,iBAAiB,WAAW,6CACxD,gBAAM,IAAI,CAAC,MAAM,UAChB,6CAAC,QAAe,WAAU,mBACvB,uBAAa,KAAK,IAAI,KADhB,KAET,CACD,GACH;AAEJ;AAKO,SAAS,eAAe,UAA4B;AACzD,SAAO,SAAS,OAAO,CAAC,OAAyC,GAAG,SAAS,QAAQ;AACvF;;;ACzNI,IAAAC,sBAAA;AANJ,IAAM,sBAAyD,CAAC;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM,QAAQ,eAAe,MAAM,KAAK,IAAI;AAAA,MAElD,qBAAW,SAAS;AAAA;AAAA,EACvB;AAEJ;AAEA,IAAO,8BAAQ;;;ACnCf,IAAAC,gBAA6B;AA4DnB,IAAAC,sBAAA;AA3CV,IAAM,gBAAmD,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AACb,MAAM;AACJ,QAAM,eAAW,qBAAM;AACvB,QAAM,EAAE,OAAO,OAAO,MAAM,OAAO,aAAa,KAAK,OAAO,IAAI;AAChE,QAAM,iBAAiB,CAAC,CAAC,MAAM;AAC/B,QAAM,EAAE,aAAa,IAAI;AAEzB,QAAM,UAAU,kBAAkB;AAClC,QAAM,SAAS,kBAAkB;AAEjC,QAAM,UAAU,cAAc,MAAM,MAAM,QAAQ;AAClD,QAAM,eAAe,eAAe;AACpC,QAAM,eAAe,MAAM,QAAQ,eAAe,MAAM,KAAK,IAAI,CAAC;AAElE,QAAM,cAAc,iBAAiB,WAAW,aAAa,IAAI;AACjE,QAAM,UAAU,WAAW,SAAS,KAAK,WAAW,SAAS;AAE7D,SACE,8CAAC,cAAAC,QAAM,UAAN,EACC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,+HAA+H,WAAW,SAAS,4EAA4E,eAAe,IAAI,YAAY;AAAA,QACzQ,OAAO;AAAA,QACP,SAAS,UACL,CAAC,MAAM;AAAE,YAAE,eAAe;AAAG,YAAE,gBAAgB;AAAG,kBAAQ,UAAU,CAAC,UAAe,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,KAAK,EAAE;AAAA,QAAG,IACpH,UAAU,MACR,MAAM,OAAO,KAAK,KAAK,QAAQ,IAC/B;AAAA,QAEN,MAAM,UAAU,WAAW;AAAA,QAC3B,UAAU,UAAU,IAAI;AAAA,QACxB,WAAW,UACP,CAAC,MAAM;AAAE,cAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,IAAK,SAAQ,UAAU,CAAC,UAAe,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,KAAK,EAAE;AAAA,QAAG,IACnH;AAAA,QAIH;AAAA,mBACC,8CAAC,SAAI,WAAW,UAAU,eAAe,cAAc,WAAW,yDAChE;AAAA,yDAAC,SAAI,KAAK,OAAO,KAAK,SAAS,IAAI,WAAU,mCAAkC;AAAA,YAC/E,6CAAC,SAAI,WAAU,+EAA8E;AAAA,aAC/F;AAAA,UAIF,8CAAC,SAAI,WAAW,2EAA2E,QAAQ,WAAW,EAAE,uCAE9G;AAAA,0DAAC,SAAI,WAAU,gCACZ;AAAA,sBACC,6CAAC,SAAI,WAAU,wHACb,uDAAC,gBAAa,UAAU,MAAM,GAChC;AAAA,cAEF,6CAAC,QAAG,WAAU,0DACX,iBACH;AAAA,eACF;AAAA,YAGA,8CAAC,SAAI,WAAU,8BACZ;AAAA,6BACC,6CAAC,SAAI,WAAU,kDACZ,uBACH;AAAA,cAED,kBAAkB,UAAU,WAC3B,6CAAC,SAAI,WAAU,QAAQ,mBAAQ;AAAA,eAEnC;AAAA,aAGE,WAAW,WACX,6CAAC,SAAI,WAAU,yBACZ,oBAAU,MACT;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM;AAAA,gBACN,QAAO;AAAA,gBACP,KAAI;AAAA,gBACJ,WAAU;AAAA,gBACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,gBAElC;AAAA,+DAAC,gBAAa,UAAS,eAAc;AAAA,kBAAE;AAAA;AAAA;AAAA,YACzC,IACE,UACF,8CAAC,SAAI,WAAU,oPACb;AAAA,2DAAC,gBAAa,UAAS,iBAAgB;AAAA,cAAE;AAAA,eAC3C,IACE,MACN;AAAA,aAEJ;AAAA;AAAA;AAAA,IACF;AAAA,IAGC,WACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,SAAS;AAAA,QAChB,QAAQ,CAAC,CAAC,QAAQ,OAAO,OAAO;AAAA,QAChC,SAAS,MAAM,QAAQ,UAAU,CAAC,UAAe,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,EAAE;AAAA,QAE/E,uDAAC,SAAI,WAAU,6BAA6B,mBAAQ;AAAA;AAAA,IACtD;AAAA,KAEJ;AAEJ;AAEA,IAAO,wBAAQ;;;AC3GX,IAAAC,sBAAA;AALJ,IAAM,mBAAsD,CAAC;AAAA,EAC3D;AAAA,EACA;AACF,MAAM;AACJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,MAAM,SAAS;AAAA,MACtB,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM,gBAAgB;AAAA,MACnC,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM,QAAQ,eAAe,MAAM,KAAK,IAAI;AAAA,MAElD,qBAAW,SAAS;AAAA;AAAA,EACvB;AAEJ;AAEA,IAAO,2BAAQ;;;AClCf,IAAAC,gBAA6B;AA6DvB,IAAAC,sBAAA;AAhDN,IAAM,iBAAoD,CAAC;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,eAAW,qBAAM;AACvB,QAAM,UAAU,SAAS,MAAM,MAAM,QAAQ;AAC7C,QAAM,QAAQ,MAAM,SAAS,MAAM,SAAS;AAC5C,QAAM,aAAa,MAAM,SAAS;AAClC,QAAM,cAAc,MAAM,SAAS;AAGnC,QAAM,eAAe,sCAAsC,KAAK,WAAW;AAC3E,QAAM,YAAY,eAAe,KAAK;AAGtC,QAAM,kBAAkB,oEAAoE,KAAK,WAAW;AAC5G,QAAM,eAAe,kBAAkB,KAAK;AAG5C,QAAM,eAAe,kBAAkB,KAAK,WAAW;AACvD,QAAM,cAAc,eAAe,cAAc;AAGjD,QAAM,UAAU,GAAG,YAAY,uBAAuB,WAAW,IAAI,SAAS,0NAA0N,QAAQ,QAAQ,GAAG;AAC3T,QAAM,WAAW,GAAG,OAAO,IAAI,WAAW,GAAG,KAAK;AAGlD,QAAM,cAAsC;AAAA,IAC1C,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AACA,QAAM,eAAe,YAClB,MAAM,KAAK,EACX,IAAI,OAAK,YAAY,CAAC,KAAK,CAAC,EAC5B,KAAK,GAAG;AAEX,QAAM,aAAa,MAAM;AACvB,YAAQ,UAAU,WAAS,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,KAAK,EAAE;AAAA,EAC1D;AAEA,QAAM,cAAc,MAAM;AACxB,YAAQ,UAAU,WAAS,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,EAAE;AAAA,EAC3D;AAEA,SACE,8CAAC,SAAI,WAAW,aAAa,YAAY,GAAG,KAAK,GAC/C;AAAA,kDAAC,YAAO,WAAW,UAAU,SAAS,YACnC;AAAA,YAAM,QAAQ,6CAAC,gBAAa,UAAU,MAAM,MAAM;AAAA,MAClD;AAAA,OACH;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,QAAQ,CAAC,CAAC,QAAQ,OAAO,OAAO;AAAA,QAChC,SAAS;AAAA,QAER,qBAAW,SAAS;AAAA;AAAA,IACvB;AAAA,KACF;AAEJ;AAEA,IAAO,yBAAQ;;;AC7Ef,IAAAC,gBAAkB;AAyDV,IAAAC,sBAAA;AAzCR,IAAM,kBAAqD,CAAC;AAAA,EAC1D;AAAA,EACA;AACF,MAAM;AACJ,QAAM,MAAM,MAAM,OAAO,MAAM,QAAQ;AACvC,QAAM,QAAQ,MAAM;AACpB,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,cAAc,MAAM,SAAS;AAGnC,QAAM,eAAe,sCAAsC,KAAK,WAAW;AAC3E,QAAM,YAAY,eAAe,KAAK;AAGtC,QAAM,kBAAkB,oEAAoE,KAAK,WAAW;AAC5G,QAAM,eAAe,kBAAkB,KAAK;AAG5C,QAAM,WAAW,CAAC,eAAe,CAAC,wBAAwB,KAAK,WAAW,KAAK,kBAAkB,KAAK,WAAW;AACjH,QAAM,cAAc,WAAW,cAAc;AAG7C,QAAM,UAAU,GAAG,YAAY,uBAAuB,WAAW,IAAI,SAAS,0NAA0N,QAAQ,QAAQ,GAAG;AAC3T,QAAM,WAAW,GAAG,OAAO,IAAI,WAAW,GAAG,KAAK;AAGlD,QAAM,cAAsC;AAAA,IAC1C,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AACA,QAAM,eAAe,YAClB,MAAM,KAAK,EACX,IAAI,OAAK,YAAY,CAAC,KAAK,CAAC,EAC5B,KAAK,GAAG;AAGX,MAAI,OAAO;AACT,WACE,6CAAC,SAAI,WAAW,aAAa,YAAY,GAAG,KAAK,GAC/C;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN;AAAA,QACA,KAAI;AAAA,QACJ,WAAW;AAAA,QAEX;AAAA,uDAAC,gBAAa,UAAU,MAAM;AAAA,UAC7B;AAAA;AAAA;AAAA,IACH,GACF;AAAA,EAEJ;AAGA,QAAM,cAAc,WAAW,SAAS;AACxC,QAAM,YAAY,CAAC,YAAwD;AACzE,QAAI,CAAC,QAAS,QAAO,CAAC;AACtB,QAAI,cAAAC,QAAM,eAAe,OAAO,KAAM,QAAQ,SAAiB,KAAK;AAClE,aAAO,CAAC,OAAkC;AAAA,IAC5C;AACA,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,aAAO,QAAQ,QAAQ,SAAS;AAAA,IAClC;AACA,QAAI,cAAAA,QAAM,eAAe,OAAO,KAAM,QAAQ,MAAc,UAAU;AACpE,aAAO,UAAW,QAAQ,MAAc,QAAQ;AAAA,IAClD;AACA,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ,UAAU,WAAW;AAEnC,MAAI,MAAM,SAAS,GAAG;AACpB,WACE,6CAAC,SAAI,WAAW,aAAa,YAAY,GAAG,KAAK,GAC9C,gBAAM;AAAA,MAAI,CAAC,MAAM,UAChB,cAAAA,QAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,WAAW,GAAI,KAAK,MAAc,aAAa,EAAE,IAAI,QAAQ,GAAG,KAAK;AAAA,UACrE;AAAA,UACA,KAAK;AAAA,QACP;AAAA,QACA,8EACE;AAAA,uDAAC,gBAAa,UAAU,MAAM;AAAA,UAC5B,KAAK,MAAc;AAAA,WACvB;AAAA,MACF;AAAA,IACF,GACF;AAAA,EAEJ;AAGA,SACE,6CAAC,SAAI,WAAW,aAAa,YAAY,GAAG,KAAK,GAC/C,wDAAC,OAAE,MAAM,KAAK,QAAgB,KAAI,uBAAsB,WAAW,UACjE;AAAA,iDAAC,gBAAa,UAAU,MAAM;AAAA,IAC7B;AAAA,KACH,GACF;AAEJ;AAEA,IAAO,0BAAQ;;;ACzFN,IAAAC,sBAAA;AAvBT,IAAM,mBAAsD,CAAC;AAAA,EAC3D;AAAA,EACA;AACF,MAAM;AACJ,QAAM,YAAY,MAAM,SAAS;AACjC,QAAM,KAAK,MAAM,MAAM;AAGvB,QAAM,cAAc,MAAM,QAAQ,eAAe,MAAM,KAAK,IAAI,CAAC;AAGjE,QAAM,eAAoC,CAAC;AAC3C,MAAI,UAAW,cAAa,YAAY;AACxC,MAAI,GAAI,cAAa,KAAK;AAC1B,MAAI,OAAO,KAAK,WAAW,EAAE,SAAS,EAAG,cAAa,QAAQ;AAG9D,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,IAAI,WAAW,OAAO,GAAG;AAC3B,mBAAa,GAAG,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,6CAAC,SAAK,GAAG,cAAe,qBAAW,SAAS,GAAE;AACvD;AAEA,IAAO,2BAAQ;;;ACnCf,IAAAC,gBAAiF;AA2F7E,IAAAC,sBAAA;AAvFJ,IAAI,eAAe;AAsBnB,IAAM,iBAAoD,CAAC;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,aAAa,MAAM,WAAW;AACpC,QAAM,QAAQ,WACX,MAAM,IAAI,EACV,IAAI,OAAK,EAAE,KAAK,CAAC,EACjB,OAAO,OAAO;AAGjB,QAAM,WAAsB,MAAM,IAAI,UAAQ,QAAQ,cAAc,IAAI,CAAC;AAEzE,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,CAAC;AACxC,QAAM,WAAW,SAAS,MAAM,YAAY,QAAQ,EAAE;AACtD,QAAM,QAAQ,SAAS,MAAM,SAAS,OAAO,EAAE;AAG/C,QAAM,aAAS,sBAAkC,CAAC,CAAC;AACnD,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,CAAC;AAGlC,qCAAgB,MAAM;AACpB,QAAI,IAAI;AACR,WAAO,QAAQ,QAAQ,QAAM;AAC3B,UAAI,GAAI,KAAI,KAAK,IAAI,GAAG,GAAG,YAAY;AAAA,IACzC,CAAC;AACD,QAAI,IAAI,EAAG,SAAQ,CAAC;AAAA,EACtB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,YAAQ,2BAAY,MAAM;AAC9B,QAAI,SAAS,UAAU,EAAG;AAC1B,eAAW,WAAS,OAAO,KAAK,SAAS,MAAM;AAAA,EACjD,GAAG,CAAC,SAAS,MAAM,CAAC;AAEpB,+BAAU,MAAM;AACd,QAAI,SAAS,UAAU,EAAG;AAC1B,UAAM,KAAK,YAAY,OAAO,QAAQ;AACtC,WAAO,MAAM,cAAc,EAAE;AAAA,EAC/B,GAAG,CAAC,OAAO,UAAU,SAAS,MAAM,CAAC;AAErC,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,QAAM,WAAW,MAAM,SAAS;AAChC,QAAM,cAAc,MAAM,QAAQ,eAAe,MAAM,KAAK,IAAI,CAAC;AAIjE,QAAM,cAAsC;AAAA,IAC1C,WAAW;AAAA,IAAW,WAAW;AAAA,IAAY,aAAa;AAAA,IAC1D,WAAW;AAAA,IAAY,WAAW;AAAA,IAAW,YAAY;AAAA,IACzD,YAAY;AAAA,IAAY,YAAY;AAAA,IAAW,YAAY;AAAA,IAC3D,YAAY;AAAA,IAAW,YAAY;AAAA,IAAU,YAAY;AAAA,IACzD,YAAY;AAAA,EACd;AACA,QAAM,gBAAgB,SAAS,MAAM,qCAAqC;AAC1E,QAAM,iBAAiB,gBAAgB,YAAY,cAAc,CAAC,CAAC,IAAI;AACvE,QAAM,aAAa,OAAO,EAAE,YAAY;AAExC,QAAM,YAAY,gBACd,SAAS,QAAQ,cAAc,CAAC,GAAG,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK,IACjE;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,QAAQ,QAAQ,QAAQ,UAAU,YAAY,UAAU,UAAU,GAAG,YAAY;AAAA,MAEzF;AAAA,0BACC,6CAAC,WAAO,cAAI,UAAU,mBAAmB,cAAc,kDAAiD;AAAA,QAE1G;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,MAAM;AAAA,cACN,OAAO;AAAA,cACP,KAAK;AAAA,cACL,YAAY,aAAa,KAAK;AAAA,cAC9B,WAAW,cAAc,CAAC,UAAU,IAAI;AAAA,YAC1C;AAAA,YAEC,mBAAS,IAAI,CAAC,QAAQ,MACrB;AAAA,cAAC;AAAA;AAAA,gBAEC,KAAK,QAAM;AAAE,yBAAO,QAAQ,CAAC,IAAI;AAAA,gBAAI;AAAA,gBACrC,OAAO,OAAO,EAAE,QAAQ,MAAM,SAAS,QAAQ,YAAY,UAAU,UAAU,SAAS,IAAI,EAAE,SAAS,QAAQ,YAAY,SAAS;AAAA,gBAEpI,uDAAC,SAAI,WAAW,GAAG,UAAU,IAAI,SAAS,IAAI,OAAO,EAAE,OAAO,OAAO,GAClE,kBAAQ,yBAAyB,MAAM,GAC1C;AAAA;AAAA,cANK;AAAA,YAOP,CACD;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,yBAAQ;;;AC/Gf,IAAM,oBAAwD;AAAA;AAAA,EAE5D,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA;AAAA,EAEX,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA;AAAA,EAEV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA;AAAA,EAER,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA;AAAA,EAEL,OAAO;AACT;AAEA,IAAO,qBAAQ;;;ACQJ,IAAAC,uBAAA;AA9BX,IAAM,oBAAsD,CAAC;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,eAAe,OAAO,OAAO,QAAQ,IAAI;AAGjD,QAAM,YAAY,mBAAkB,aAAa;AAGjD,QAAM,aAAa,CAAC,SAAkC;AACpD,UAAM,cAAc,MAAM,IAAI;AAC9B,QAAI,CAAC,YAAa,QAAO;AACzB,UAAM,SAAS,QAAQ,cAAc,WAAW;AAChD,WAAO,QAAQ,yBAAyB,MAAM;AAAA,EAChD;AAEA,QAAM,iBAA0C;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,WAAW;AACb,WAAO,8CAAC,aAAuB,GAAG,kBAAX,KAA2B;AAAA,EACpD;AAGA,SACE,8CAAC,SAAgB,WAAW,qEACzB,qBAAW,SAAS,KADb,KAEV;AAEJ;AAEA,IAAO,4BAAQ;;;ACxDf,IAAAC,gBAAyC;;;ACAzC,IAAAC,gBAAkC;AA6F3B,SAAS,kBAAkB;AAChC,QAAM,KAAM,OAAe;AAC3B,MAAI,IAAI,KAAM,IAAG,KAAK;AACxB;;;ADvCM,IAAAC,uBAAA;AAxCN,IAAM,kBAAkD,CAAC;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,mBAAe,sBAAuB,IAAI;AAGhD,+BAAU,MAAM;AACd,QAAI,CAAC,aAAa,QAAS;AAC3B,UAAM,UAAU,aAAa,QAAQ,iBAAiB,QAAQ;AAC9D,YAAQ,QAAQ,eAAa;AAC3B,YAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,YAAM,KAAK,UAAU,UAAU,EAAE;AAAA,QAAQ,UACvC,UAAU,aAAa,KAAK,MAAM,KAAK,KAAK;AAAA,MAC9C;AACA,gBAAU,cAAc,UAAU;AAClC,gBAAU,YAAY,aAAa,WAAW,SAAS;AAAA,IACzD,CAAC;AAKD,oBAAgB;AAAA,EAClB,GAAG,CAAC,OAAO,CAAC;AAGZ,+BAAU,MAAM;AACd,QAAI,CAAC,aAAc;AACnB,UAAM,UAAU,SAAS,cAAc,OAAO;AAC9C,YAAQ,aAAa,eAAe,EAAE;AACtC,YAAQ,cAAc;AACtB,aAAS,KAAK,YAAY,OAAO;AACjC,WAAO,MAAM;AACX,UAAI,QAAQ,WAAY,UAAS,KAAK,YAAY,OAAO;AAAA,IAC3D;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,SACE,8CAAC,SAAI,WAAW,kBAAkB,KAAK,cACrC,wDAAC,SAAI,yBAAyB,EAAE,QAAQ,QAAQ,GAAG,GACrD;AAEJ;AAEA,IAAO,0BAAQ;;;AE9Df,IAAAC,gBAAiD;AAGjD,IAAM,gBAAY,6BAAoC,IAAI;AAEnD,IAAM,wBAAwB,UAAU;;;AjBsF/B,IAAAC,uBAAA;AAlEhB,IAAM,yBAAgE,CAAC,EAAE,SAAS,eAAe,MAAM;AACrG,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAkC,CAAC,CAAC;AAChE,QAAM,aAAS,sBAAM,EAAE,QAAQ,MAAM,EAAE;AACvC,QAAM,eAAe,SAAS,MAAM;AAGpC,QAAM,iBAAa,uBAAsB,IAAK;AAG9C,oBAAkB;AAGlB,QAAM,kBAAc,wBAAQ,MAAM,cAAc,cAAc,GAAG,CAAC,cAAc,CAAC;AAGjF,gCAAU,MAAM;AACd,UAAM,mBAAmB,MAAM;AAC7B,YAAM,OAAO,OAAO,SAAS;AAC7B,UAAI,MAAM;AACR,cAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,cAAM,KAAK,MAAM,MAAM,SAAS,CAAC;AACjC,mBAAW,EAAE;AAAA,MACf;AAAA,IACF;AACA,qBAAiB;AACjB,WAAO,iBAAiB,cAAc,gBAAgB;AACtD,WAAO,MAAM,OAAO,oBAAoB,cAAc,gBAAgB;AAAA,EACxE,GAAG,CAAC,cAAc,CAAC;AAGnB,QAAM,oBAAgB;AAAA,IACpB,CAAC,SAAgB,OAAe,SAAiB,MAAuB;AACtE,cAAQ,QAAQ,MAAM;AAAA,QACpB,KAAK,UAAU;AACb,gBAAM,YAAY,IAAI,QAAQ,KAAK;AACnC,cAAI,OAAO,QAAQ;AAGnB,gBAAM,cAAc,KAAK,MAAM,sBAAsB;AACrD,gBAAM,aAAa,KAAK,MAAM,sBAAsB;AACpD,cAAI,aAAa;AACf,mBAAO,YAAY,CAAC;AAAA,UACtB,WAAW,YAAY;AACrB,mBAAO,WAAW,CAAC;AAAA,UACrB;AAEA,gBAAM,cAAc,QAAQ,WAAW;AACvC,cAAI,gBAAgB,OAAO,QAAQ,KAAK;AAExC,cAAI,YAAa,kBAAiB;AAClC,cAAI,WAAY,kBAAiB;AACjC,cAAI,YAAa,kBAAiB,IAAI,WAAW;AAEjD,iBAAO,eAAAC,QAAM;AAAA,YACX;AAAA,YACA,EAAE,KAAK,OAAO,IAAI,QAAQ,IAAI,WAAW,cAAc;AAAA,YACvD,aAAa,IAAI;AAAA,UACnB;AAAA,QACF;AAAA,QAEA,KAAK,aAAa;AAChB,gBAAM,QAAQ,QAAQ,QAAQ,MAAM,IAAI;AACxC,gBAAM,mBAAmB,MAAM,IAAI,CAAC,MAAM,cAAc;AACtD,kBAAM,iBAAiB,KAAK,MAAM,iBAAiB;AACnD,gBAAI,gBAAgB;AAClB,qBACE,+CAAC,eAAAA,QAAM,UAAN,EACE;AAAA,6BAAa,eAAe,CAAC,CAAC;AAAA,gBAC/B,8CAAC,QAAG;AAAA,mBAFe,SAGrB;AAAA,YAEJ;AACA,kBAAM,aAAa,cAAc,MAAM,SAAS;AAChD,mBACE,+CAAC,eAAAA,QAAM,UAAN,EACE;AAAA,2BAAa,IAAI;AAAA,cACjB,CAAC,cAAc;AAAA,iBAFG,SAGrB;AAAA,UAEJ,CAAC;AAED,gBAAM,eAAe,QAAQ,WAAW;AACxC,cAAI,WAAW;AACf,cAAI,aAAc,aAAY,IAAI,YAAY;AAC9C,cAAI,QAAQ,MAAO,aAAY,SAAS,QAAQ,KAAK;AAErD,iBACE,8CAAC,OAAc,IAAI,QAAQ,IAAI,WAAW,UACvC,8BADK,KAER;AAAA,QAEJ;AAAA,QAEA,KAAK;AACH,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,MAAM,QAAQ;AAAA,cACd,UAAU,QAAQ;AAAA,cAClB,OAAO,QAAQ;AAAA;AAAA,YAHV;AAAA,UAIP;AAAA,QAGJ,KAAK;AACH,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA,SAAS,WAAW;AAAA,cACpB;AAAA,cACA;AAAA;AAAA,YAJK;AAAA,UAKP;AAAA,QAGJ,KAAK,QAAQ;AACX,cAAI,mBAAmB,QAAQ;AAC/B,cAAI,eAAe;AAGnB,6BAAmB,iBAAiB;AAAA,YAClC;AAAA,YACA,CAAC,QAAgB,eAAuB;AACtC,8BAAgB,aAAa;AAC7B,qBAAO;AAAA,YACT;AAAA,UACF;AAEA,gBAAM,mBAAmB;AAEzB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,SAAS;AAAA,cACT,cAAc,gBAAgB;AAAA,cAC9B;AAAA;AAAA,YAHK;AAAA,UAIP;AAAA,QAEJ;AAAA,QAEA,KAAK,cAAc;AACjB,gBAAM,YAAY;AAClB,gBAAM,QAAQ,eAAe,UAAU,KAAK;AAC5C,iBAAO,eAAAA,QAAM;AAAA,YACX,UAAU;AAAA,YACV,EAAE,KAAK,OAAO,GAAG,MAAM;AAAA,YACvB,GAAG,yBAAyB,UAAU,UAAU,SAAS,CAAC;AAAA,UAC5D;AAAA,QACF;AAAA,QAEA,KAAK;AACH,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,KAAK,QAAQ;AAAA,cACb,KAAK,QAAQ;AAAA,cACb,OAAO,QAAQ;AAAA,cACf,WAAU;AAAA;AAAA,YAJL;AAAA,UAKP;AAAA,QAGJ,KAAK;AACH,iBAAO,8CAAC,SAAiB,sBAAY,QAAQ,OAAO,KAAnC,KAAqC;AAAA,QAExD,KAAK;AACH,iBAAO,8CAAC,SAAiB,qBAAW,QAAQ,OAAO,KAAlC,KAAoC;AAAA,QAEvD,KAAK;AACH,iBACE,8CAAC,gBAAuB,WAAW,gGAAgG,QAAQ,UAAU,IAAI,QAAQ,OAAO,KAAK,EAAE,IAC5K,uBAAa,QAAQ,OAAO,KADd,KAEjB;AAAA,QAGJ,KAAK;AACH,iBAAO,8CAAC,QAAe,WAAU,wBAAjB,KAAsC;AAAA,QAExD,KAAK;AACH,iBAAO,8CAAC,SAAiB,sBAAY,WAAW,KAA/B,KAAiC;AAAA,QAEpD;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAGA,QAAM,+BAA2B;AAAA,IAC/B,CAAC,UAAmB,QAAgB,MAAyB;AAC3D,YAAM,SAA4B,CAAC;AACnC,UAAI,IAAI;AAER,aAAO,IAAI,SAAS,QAAQ;AAC1B,cAAM,KAAK,SAAS,CAAC;AAGrB,YAAI,GAAG,SAAS,eAAe,CAAC,QAAQ,UAAU,QAAQ,EAAE,SAAS,GAAG,aAAa,GAAG;AACtF,gBAAM,QAAiB,CAAC;AACxB,iBACE,IAAI,SAAS,UACb,SAAS,CAAC,EAAE,SAAS,eACrB,CAAC,QAAQ,UAAU,QAAQ,EAAE,SAAU,SAAS,CAAC,EAAU,aAAa,GACxE;AACA,kBAAM,KAAK,SAAS,CAAC,CAAC;AACtB;AAAA,UACF;AAEA,cAAI,MAAM,WAAW,KAAM,MAAM,CAAC,EAAqB,OAAO,UAAU,OAAO;AAC7E,qBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,qBAAO,KAAK,cAAc,MAAM,CAAC,GAAG,OAAO,QAAQ,KAAK,CAAC;AAAA,YAC3D;AAAA,UACF,OAAO;AAEL,kBAAM,iBAAkB,MAAM,CAAC,EAAqB,QAAQ,OAAO,KAAK;AACxE,kBAAM,iBAAiB,eAAe,MAAM,gBAAgB,KAAK,CAAC;AAClE,kBAAM,iBAAiB,eAAe,SAAS,IAAI,eAAe,KAAK,GAAG,IAAI;AAE9E,mBAAO;AAAA,cACL,8CAAC,SAAuC,WAAW,uCAAuC,cAAc,IACrG,gBAAM,IAAI,CAAC,MAAM,OAChB,8CAAC,eAAAA,QAAM,UAAN,EAAyB,wBAAc,MAAM,IAAI,KAAK,KAAlC,EAAoC,CAC1D,KAHO,aAAa,OAAO,MAAM,EAIpC;AAAA,YACF;AAAA,UACF;AAAA,QACF,OAAO;AACL,iBAAO,KAAK,cAAc,IAAI,OAAO,QAAQ,KAAK,CAAC;AACnD;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAGA,QAAM,cAAc,CAAC,aAAuC;AAC1D,UAAM,UAAU,eAAe,QAAQ;AACvC,QAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,WACE,+CAAC,SAAI,WAAU,+EACb;AAAA,oDAAC,SAAI,WAAU,4BAA2B,+BAAiB;AAAA,MAC3D,8CAAC,QAAG,WAAU,+BACX,kBAAQ,IAAI,CAAC,GAAG,MAAM;AACrB,YAAI,EAAE,SAAS,SAAU,QAAO;AAChC,cAAM,cAAc,EAAE,SAAS,IAAI,SAAS,EAAE,UAAU,IAAI,SAAS,EAAE,UAAU,IAAI,SAAS;AAC9F,eACE,8CAAC,QAAW,WAAW,GAAG,WAAW,yBACnC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,IAAI,EAAE,EAAE;AAAA,YACd,WAAU;AAAA,YACV,SAAS,OAAK;AACZ,gBAAE,eAAe;AACjB,yBAAW,EAAE,EAAE;AAAA,YACjB;AAAA,YAEC,uBAAa,EAAE,KAAK,QAAQ,UAAU,EAAE,EAAE,KAAK,CAAC;AAAA;AAAA,QACnD,KAVO,CAWT;AAAA,MAEJ,CAAC,GACH;AAAA,OACF;AAAA,EAEJ;AAGA,QAAM,uBAAsC;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,aAAW,UAAU;AAErB,SACE,8CAAC,yBAAsB,OAAO,sBAC3B,mCAAyB,WAAW,GACvC;AAEJ;AAEA,IAAO,iCAAQ;;;AHiQP,IAAAC,uBAAA;AAtiBR,IAAM,2BAA2B,gCAAe,OAAO;AAAA,EACrD,EAAE,KAAK,kBAAAC,KAAE,SAAS,YAAY,QAAQ,OAAO,6BAA6B;AAAA,EAC1E,EAAE,KAAK,kBAAAA,KAAE,OAAO,OAAO,4BAA4B,WAAW,SAAS;AAAA,EACvE,EAAE,KAAK,kBAAAA,KAAE,MAAM,OAAO,0BAA0B;AAAA,EAChD,EAAE,KAAK,kBAAAA,KAAE,cAAc,OAAO,8BAA8B;AAAA,EAC5D,EAAE,KAAK,kBAAAA,KAAE,QAAQ,YAAY,OAAO;AAAA,EACpC,EAAE,KAAK,kBAAAA,KAAE,UAAU,WAAW,SAAS;AAAA,EACvC,EAAE,KAAK,kBAAAA,KAAE,eAAe,gBAAgB,eAAe;AAAA,EACvD,EAAE,KAAK,kBAAAA,KAAE,MAAM,OAAO,0BAA0B;AAAA,EAChD,EAAE,KAAK,kBAAAA,KAAE,KAAK,OAAO,0BAA0B;AAAA,EAC/C,EAAE,KAAK,kBAAAA,KAAE,SAAS,OAAO,6BAA6B;AAAA,EACtD,EAAE,KAAK,kBAAAA,KAAE,SAAS,OAAO,8BAA8B,YAAY,OAAO;AAAA,EAC1E,EAAE,KAAK,kBAAAA,KAAE,UAAU,OAAO,0BAA0B;AAAA,EACpD,EAAE,KAAK,kBAAAA,KAAE,QAAQ,OAAO,4BAA4B;AAAA,EACpD,EAAE,KAAK,kBAAAA,KAAE,eAAe,OAAO,+BAA+B;AAAA,EAC9D,EAAE,KAAK,kBAAAA,KAAE,cAAc,OAAO,UAAU;AAAA,EACxC,EAAE,KAAK,kBAAAA,KAAE,WAAW,OAAO,WAAW,WAAW,SAAS;AAAA,EAC1D,EAAE,KAAK,kBAAAA,KAAE,QAAQ,kBAAAA,KAAE,QAAQ,GAAG,gBAAgB,YAAY;AAAA,EAC1D,EAAE,KAAK,kBAAAA,KAAE,QAAQ,kBAAAA,KAAE,OAAO,GAAG,iBAAiB,kDAAkD,SAAS,SAAS,cAAc,MAAM;AACxI,CAAC;AAED,IAAM,oBAAoB,uBAAW,MAAM;AAAA,EACzC,KAAK;AAAA,IACH,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,eAAe;AAAA,IACf,WAAW;AAAA,EACb;AAAA,EACA,gBAAgB,EAAE,SAAS,OAAO;AAAA,EAClC,gBAAgB;AAAA,IACd,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW;AAAA,IACX,yBAAyB;AAAA,EAC3B;AAAA,EACA,eAAe;AAAA,IACb,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,wBAAwB,EAAE,iBAAiB,cAAc;AAAA,EACzD,mBAAmB,EAAE,OAAO,UAAU;AAAA,EACtC,kBAAkB,EAAE,SAAS,OAAO,QAAQ,UAAU;AAAA,EACtD,uBAAuB;AAAA,IACrB,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA,6BAA6B;AAAA,IAC3B,iBAAiB;AAAA,EACnB;AAAA,EACA,kBAAkB,EAAE,iBAAiB,cAAc;AAAA,EACnD,cAAc,EAAE,iBAAiB,qCAAqC;AAAA,EACtE,iEAAiE;AAAA,IAC/D,iBAAiB;AAAA,EACnB;AAAA,EACA,uBAAuB;AAAA,IACrB,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AAAA,EACA,eAAe;AAAA,IACb,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,cAAc;AAAA,IACd,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA,EACA,qBAAqB;AAAA,IACnB,iBAAiB;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EACA,qBAAqB;AAAA,IACnB,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAAA,EACA,yBAAyB,EAAE,iBAAiB,+BAA+B;AAAA,EAC3E,wBAAwB,EAAE,iBAAiB,8BAA8B;AAAA,EACzE,0BAA0B,EAAE,iBAAiB,UAAU;AAAA,EACvD,yBAAyB,EAAE,iBAAiB,UAAU;AAAA,EACtD,iBAAiB;AAAA,IACf,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB;AAAA,EACA,uBAAuB;AAAA,IACrB,iBAAiB;AAAA,EACnB;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,QAAQ;AAAA,EACV;AAAA,EACA,uBAAuB;AAAA,IACrB,UAAU;AAAA,IACV,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK;AAAA,IACL,gBAAgB;AAAA,IAChB,UAAU;AAAA,EACZ;AAAA,EACA,2BAA2B;AAAA,IACzB,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA,iCAAiC,EAAE,SAAS,EAAE;AAAA,EAC9C,iBAAiB;AAAA,IACf,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,cAAc;AAAA,EAChB;AAAA,EACA,uBAAuB;AAAA,IACrB,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,oDAAoD;AAAA,IAClD,iBAAiB;AAAA,EACnB;AAAA,EACA,4CAA4C;AAAA,IAC1C,iBAAiB;AAAA,EACnB;AAAA,EACA,cAAc;AAAA,IACZ,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,EACb;AAAA,EACA,oBAAoB;AAAA,IAClB,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAAA,EACA,qBAAqB,EAAE,WAAW,gBAAgB;AAAA,EAClD,oBAAoB;AAAA,IAClB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AAAA,EACA,mCAAmC;AAAA,IACjC,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACF,CAAC;AAGD,IAAM,oBAAoB,6BAAY,GAAG,CAAC,OAAO,cAAc;AAC7D,QAAM,OAAO,MAAM,IAAI,OAAO,SAAS;AACvC,QAAM,UAAU,KAAK,KAAK,KAAK;AAE/B,QAAM,WAAW,QAAQ,MAAM,UAAU;AACzC,MAAI,UAAU;AACZ,QAAI,QAAQ;AACZ,aAAS,IAAI,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,OAAO,KAAK;AACvD,YAAM,WAAW,MAAM,IAAI,KAAK,CAAC;AACjC,YAAM,WAAW,SAAS,KAAK,KAAK;AACpC,UAAI,SAAS,MAAM,UAAU,GAAG;AAC9B;AAAA,MACF,WAAW,aAAa,OAAO;AAC7B;AACA,YAAI,UAAU,GAAG;AACf,iBAAO,EAAE,MAAM,KAAK,IAAI,IAAI,SAAS,GAAG;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,QAAQ,MAAM,sBAAsB;AACtD,MAAI,WAAW;AACb,UAAM,UAAU,UAAU,CAAC,EAAE,YAAY;AACzC,UAAM,eAAe,oBAAI,IAAI;AAAA,MAC3B;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAM;AAAA,MAAO;AAAA,MAAS;AAAA,MAAM;AAAA,MAAO;AAAA,MACnD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAS;AAAA,MAAU;AAAA,MAAS;AAAA,IAC9C,CAAC;AACD,QAAI,aAAa,IAAI,OAAO,KAAK,QAAQ,SAAS,IAAI,EAAG,QAAO;AAEhE,QAAI,QAAQ;AAEZ,aAAS,IAAI,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,OAAO,KAAK;AACvD,YAAM,WAAW,MAAM,IAAI,KAAK,CAAC;AACjC,YAAM,WAAW,SAAS;AAE1B,UAAI;AACJ,YAAM,WAAW,IAAI,OAAO,MAAM,OAAO,aAAa,IAAI;AAE1D,cAAQ,QAAQ,SAAS,KAAK,QAAQ,OAAO,MAAM;AACjD,YAAI,MAAM,CAAC,EAAE,WAAW,IAAI,GAAG;AAC7B;AACA,cAAI,UAAU,GAAG;AACf,mBAAO,EAAE,MAAM,KAAK,IAAI,IAAI,SAAS,GAAG;AAAA,UAC1C;AAAA,QACF,OAAO;AACL,cAAI,CAAC,MAAM,CAAC,EAAE,SAAS,IAAI,GAAG;AAC5B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT,CAAC;AAGD,IAAM,kBAAkB,uBAAW;AAAA,EACjC,MAAM;AAAA,IAEJ,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,eAAe,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,KAAK,eAAe,OAAO,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,eAAe,MAAkB;AAC/B,YAAM,UAAU,IAAI,6BAA4B;AAChD,YAAM,MAAM,KAAK,MAAM;AACvB,YAAM,gBAAgB,KAAK;AAC3B,UAAI,cAAc,WAAW,EAAG,QAAO,QAAQ,OAAO;AAEtD,YAAM,QAAQ,cAAc,cAAc,SAAS,CAAC,EAAE;AACtD,YAAM,kBAA4B,CAAC;AAEnC,eAAS,IAAI,GAAG,KAAK,IAAI,OAAO,KAAK;AACnC,cAAM,OAAO,IAAI,KAAK,CAAC;AACvB,YAAI,KAAK,OAAO,MAAO;AAEvB,cAAM,cAAc,KAAK,KAAK,KAAK;AACnC,YAAI,gBAAgB;AACpB,YAAI,mBAAmB;AAEvB,cAAM,QAAQ,YAAY,MAAM,UAAU;AAC1C,YAAI,OAAO;AACT,gBAAM,OAAO,MAAM,CAAC,EAAE,KAAK;AAC3B,cAAI,SAAS,IAAI;AACf,gBAAI,gBAAgB,SAAS,GAAG;AAC9B,8BAAgB;AAChB,iCAAmB,gBAAgB,SAAS;AAAA,YAC9C;AAAA,UACF,OAAO;AACL,kBAAM,YAAY,KAAK,MAAM,WAAW;AACxC,kBAAM,OACJ,aAAa,UAAU,CAAC,MAAM,MAC1B,UAAU,CAAC,EAAE,YAAY,IACzB;AACN,4BAAgB,KAAK,IAAI;AAAA,UAC3B;AAAA,QACF;AAEA,cAAM,YAAY,cAAc;AAAA,UAC9B,OAAK,KAAK,MAAM,EAAE,QAAQ,KAAK,QAAQ,EAAE;AAAA,QAC3C;AAEA,YAAI,aAAa,gBAAgB,SAAS,GAAG;AAC3C,gBAAM,YAAY,gBACd,mBACA,gBAAgB,SAAS;AAC7B,gBAAM,cAAc,gBAAgB,SAAS;AAC7C,gBAAM,QAAQ,YAAY;AAC1B,gBAAM,cAAc,CAAC,kBAAkB;AAEvC,cAAI,gBAAgB,OAAO;AACzB,wBAAY,KAAK,cAAc;AAC/B,wBAAY,KAAK,uBAAuB,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE;AAAA,UAC9D,OAAO;AACL,wBAAY,KAAK,iBAAiB,WAAW,EAAE;AAC/C,wBAAY,KAAK,uBAAuB,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE;AAAA,UAC9D;AAEA,kBAAQ;AAAA,YACN,KAAK;AAAA,YACL,KAAK;AAAA,YACL,uBAAW,KAAK,EAAE,OAAO,YAAY,KAAK,GAAG,EAAE,CAAC;AAAA,UAClD;AAAA,QACF;AAEA,YAAI,eAAe;AACjB,0BAAgB,IAAI;AAAA,QACtB;AAAA,MACF;AAEA,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EACA,EAAE,aAAa,OAAK,EAAE,YAAY;AACpC;AAGA,IAAM,mBAAmB,uBAAW;AAAA,EAClC,MAAM;AAAA,IAEJ,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,eAAe,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,KAAK,eAAe,OAAO,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,eAAe,MAAkB;AAC/B,YAAM,UAAU,IAAI,6BAA4B;AAChD,iBAAW,EAAE,MAAM,GAAG,KAAK,KAAK,eAAe;AAC7C,iBAAS,MAAM,MAAM,OAAO,MAAM;AAChC,gBAAM,OAAO,KAAK,MAAM,IAAI,OAAO,GAAG;AACtC,cAAI,KAAK,KAAK,KAAK,EAAE,WAAW,GAAG,GAAG;AACpC,oBAAQ;AAAA,cACN,KAAK;AAAA,cACL,KAAK;AAAA,cACL,uBAAW,KAAK,EAAE,OAAO,qBAAqB,CAAC;AAAA,YACjD;AAAA,UACF;AACA,gBAAM,KAAK,KAAK;AAAA,QAClB;AAAA,MACF;AACA,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EACA,EAAE,aAAa,OAAK,EAAE,YAAY;AACpC;AAGA,IAAM,gBAAgB,uBAAW;AAAA,EAC/B,MAAM;AAAA,IAEJ,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,eAAe,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,KAAK,eAAe,OAAO,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,eAAe,MAAkB;AAC/B,YAAM,UAAU,IAAI,6BAA4B;AAChD,YAAM,eAAe;AACrB,YAAM,SAA0D,CAAC;AAEjE,iBAAW,EAAE,MAAM,GAAG,KAAK,KAAK,eAAe;AAC7C,cAAM,OAAO,KAAK,MAAM,IAAI,YAAY,MAAM,EAAE;AAChD,qBAAa,YAAY;AACzB,YAAI;AACJ,eAAQ,QAAQ,aAAa,KAAK,IAAI,GAAI;AACxC,gBAAM,QAAQ,OAAO,MAAM;AAC3B,gBAAM,MAAM,QAAQ,MAAM,CAAC,EAAE;AAC7B,gBAAM,eAAe,QAAQ;AAC7B,gBAAM,aAAa,MAAM;AACzB,cAAI,gBAAgB,WAAY;AAChC,iBAAO,KAAK,EAAE,MAAM,OAAO,IAAI,cAAc,KAAK,uBAAW,QAAQ,CAAC,CAAC,EAAE,CAAC;AAC1E,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,KAAK,uBAAW,KAAK,EAAE,OAAO,aAAa,CAAC;AAAA,UAC9C,CAAC;AACD,iBAAO,KAAK,EAAE,MAAM,YAAY,IAAI,KAAK,KAAK,uBAAW,QAAQ,CAAC,CAAC,EAAE,CAAC;AAAA,QACxE;AAAA,MACF;AAEA,aAAO,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;AACpD,iBAAW,EAAE,MAAM,IAAI,IAAI,KAAK,OAAQ,SAAQ,IAAI,MAAM,IAAI,GAAG;AACjE,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EACA,EAAE,aAAa,OAAK,EAAE,YAAY;AACpC;AAGA,IAAM,kBAAkB,uBAAW;AAAA,EACjC,MAAM;AAAA,IAEJ,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,eAAe,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,KAAK,eAAe,OAAO,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,eAAe,MAAkB;AAC/B,YAAM,UAAU,IAAI,6BAA4B;AAChD,YAAM,aAAa;AACnB,iBAAW,EAAE,MAAM,GAAG,KAAK,KAAK,eAAe;AAC7C,cAAM,OAAO,KAAK,MAAM,IAAI,YAAY,MAAM,EAAE;AAChD,YAAI;AACJ,eAAQ,QAAQ,WAAW,KAAK,IAAI,GAAI;AACtC,gBAAM,QAAQ,MAAM,CAAC;AACrB,gBAAM,WAAW,OAAO,MAAM;AAC9B,gBAAM,SAAS,WAAW,MAAM,CAAC,EAAE;AACnC,kBAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA,uBAAW,KAAK,EAAE,YAAY,EAAE,OAAO,UAAU,KAAK,GAAG,EAAE,CAAC;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AACA,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EACA,EAAE,aAAa,OAAK,EAAE,YAAY;AACpC;AAeA,IAAM,WAAoC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAChB,MAAM;AACJ,QAAM,gBAAY,uBAA0B,IAAI;AAChD,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,KAAK;AACpD,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAqB,QAAQ;AACjE,QAAM,mBAAmB,YAAY,OAAO,UAAU;AAEtD,QAAM,mBAAmB,MAAM;AAC7B,QAAI,CAAC,UAAU,QAAS;AACxB,QAAI,aAAa;AACf,sCAAU,UAAU,OAAO;AAC3B,qBAAe,KAAK;AAAA,IACtB,OAAO;AACL,oCAAQ,UAAU,OAAO;AACzB,qBAAe,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,aAAa,eAAAC,QAAM;AAAA,IACvB,MAAM;AAAA,MACJ;AAAA,UACA,yBAAY;AAAA,UACZ,6BAAW;AAAA,QACT,WAAW,UAAQ;AACjB,gBAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,eAAK,MAAM,SAAS;AACpB,eAAK,MAAM,UAAU;AACrB,eAAK,MAAM,WAAW;AACtB,eAAK,MAAM,UAAU;AACrB,eAAK,MAAM,aAAa;AACxB,eAAK,cAAc,OAAO,WAAM;AAChC,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,MACD;AAAA,MACA;AAAA,UACA,qCAAmB,wBAAwB;AAAA,MAC3C,uBAAW;AAAA,UACX,2BAAc;AAAA,MACd,mBAAO,GAAG;AAAA,QACR,EAAE,KAAK,gBAAgB,KAAK,yBAAQ;AAAA,QACpC,EAAE,KAAK,gBAAgB,KAAK,2BAAU;AAAA,MACxC,CAAC;AAAA,MACD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,cAAkE;AAAA,IACtE,EAAE,KAAK,UAAU,MAAM,QAAQ,OAAO,SAAS;AAAA,IAC/C,EAAE,KAAK,SAAS,MAAM,kBAAkB,OAAO,QAAQ;AAAA,IACvD,EAAE,KAAK,WAAW,MAAM,cAAc,OAAO,UAAU;AAAA,EACzD;AAEA,SACE,+CAAC,SAAI,WAAW,yCAAyC,aAAa,EAAE,IAEtE;AAAA,mDAAC,SAAI,WAAU,mIACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAU;AAAA,UACV,OAAO,cAAc,eAAe;AAAA,UAEnC,wBAAc,WAAM;AAAA;AAAA,MACvB;AAAA,MAEA,8CAAC,SAAI,WAAU,0EACZ,sBAAY,IAAI,SACf;AAAA,QAAC;AAAA;AAAA,UAEC,SAAS,MAAM,cAAc,IAAI,GAAG;AAAA,UACpC,WAAW,4EACT,eAAe,IAAI,MACf,2DACA,8DACN;AAAA,UACA,OAAO,IAAI;AAAA,UAEX;AAAA,0DAAC,UAAK,WAAU,oCAAoC,cAAI,MAAK;AAAA,YAC7D,8CAAC,UAAK,WAAU,oBAAoB,cAAI,OAAM;AAAA;AAAA;AAAA,QAVzC,IAAI;AAAA,MAWX,CACD,GACH;AAAA,OACF;AAAA,IAGA,+CAAC,SAAI,WAAU,uBACX;AAAA,sBAAe,YAAY,eAAe,YAC1C;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GACT,eAAe,UAAU,oCAAoC,QAC/D;AAAA,UAEA;AAAA,YAAC,wBAAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA,WAAU;AAAA,cACV,QAAO;AAAA,cACP,gBAAgB,UAAQ;AACtB,0BAAU,UAAU;AAAA,cACtB;AAAA,cACA,YAAY;AAAA,gBACV,aAAa;AAAA,gBACb,YAAY;AAAA,cACd;AAAA,cACA;AAAA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,OAGA,eAAe,aAAa,eAAe,YAC3C;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GACT,eAAe,UAAU,UAAU,QACrC;AAAA,UAEA,wDAAC,SAAI,WAAU,+CACb,wDAAC,kCAAuB,SAAS,kBAAkB,GACrD;AAAA;AAAA,MACF;AAAA,OAEJ;AAAA,KACF;AAEJ;AAEA,IAAO,mBAAQ;","names":["import_react","t","import_language","import_highlight","import_react","markdown","text","classes","id","import_react","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","import_jsx_runtime","match","import_jsx_runtime","import_react","import_jsx_runtime","React","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_jsx_runtime","t","React","CodeMirror"]}
|
|
1
|
+
{"version":3,"sources":["../NReditor.tsx","../custom-syntax.ts","../useDebounce.ts","../CustomMarkdownRenderer.tsx","../utils.ts","../parser.ts","../ui-components.tsx","../highlightSetup.ts","../renderers.tsx","../directives/AdmonitionDirective.tsx","../directives/CardDirective.tsx","../directives/DetailsDirective.tsx","../directives/ModalDirective.tsx","../directives/ButtonDirective.tsx","../directives/WrapperDirective.tsx","../directives/SlideDirective.tsx","../directives/index.ts","../DirectiveRenderer.tsx","../RawHtmlRenderer.tsx","../useTailwindCDN.ts","../context.tsx"],"sourcesContent":["import React, { useRef, useState } from 'react';\nimport CodeMirror, { ReactCodeMirrorProps } from '@uiw/react-codemirror';\nimport { EditorView, Decoration, ViewPlugin, ViewUpdate, lineNumbers, scrollPastEnd, 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 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}\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/markdown.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}) => {\n const editorRef = useRef<EditorView | null>(null);\n const [isAllFolded, setIsAllFolded] = useState(false);\n const [editorMode, setEditorMode] = useState<EditorMode>('editor');\n const debouncedContent = useDebounce(value, debounceMs);\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 scrollPastEnd(),\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={`relative flex-1 flex flex-col min-h-0 ${className || ''}`}>\n {/* Mode toolbar */}\n <div className=\"flex items-center justify-between px-2 py-1.5 border-b border-border/30 bg-background-secondary-solid/50 rounded-t-2xl shrink-0\">\n <button\n onClick={handleToggleFold}\n className=\"p-1 px-2 text-xs font-bold bg-background-secondary-solid border border-border rounded hover:bg-border text-accent-primary transition-colors\"\n title={isAllFolded ? 'Expand all' : 'Collapse all'}\n >\n {isAllFolded ? '╩' : '╦'}\n </button>\n\n <div className=\"flex items-center gap-0.5 bg-black/10 dark:bg-white/5 rounded-lg p-0.5\">\n {modeButtons.map(btn => (\n <button\n key={btn.key}\n onClick={() => setEditorMode(btn.key)}\n className={`flex items-center gap-1 px-2.5 py-1 text-xs rounded-md transition-colors ${\n editorMode === btn.key\n ? 'bg-accent-primary/20 text-accent-primary font-semibold'\n : 'text-text-secondary hover:text-text-primary hover:bg-white/5'\n }`}\n title={btn.label}\n >\n <span className=\"material-symbols-rounded text-sm\">{btn.icon}</span>\n <span className=\"hidden sm:inline\">{btn.label}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Content area — editor / split / preview */}\n <div className=\"flex-1 min-h-0 flex\">\n {(editorMode === 'editor' || editorMode === 'split') && (\n <div\n className={`${\n editorMode === 'split' ? 'w-1/2 border-r border-border/30' : 'w-full'\n } flex-1 flex flex-col min-h-0 min-w-0`}\n >\n <CodeMirror\n value={value}\n onChange={onChange}\n className=\"flex-1 min-h-0 min-w-0\"\n height=\"100%\"\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={`${\n editorMode === 'split' ? 'w-1/2' : 'w-full'\n } flex-1 min-h-0 overflow-auto min-w-0`}\n >\n <div className=\"nr-prose h-full shadow-xs overflow-auto p-4\">\n <CustomMarkdownRenderer content={debouncedContent} />\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 React, { useState, useEffect, useCallback, useMemo, useId, useRef } from 'react';\r\nimport type { Token, DirectiveToken, HtmlBlockToken, RenderContext } from './types';\r\nimport { parseMarkdown } from './parser';\r\nimport { renderInline, renderTable, renderList, extractHeaders } from './renderers';\r\nimport { CodeBlock } from './ui-components';\r\nimport DirectiveRenderer from './DirectiveRenderer';\r\nimport RawHtmlRenderer from './RawHtmlRenderer';\r\nimport { RenderContextProvider } from './context';\r\nimport { scrollToId, resetScopeCounter, parseCssString, parseHtmlAttrs } from './utils';\r\n\r\ninterface CustomMarkdownRendererProps {\r\n content: string;\r\n}\r\n\r\n/**\r\n * V2 CustomMarkdownRenderer — main orchestrator.\r\n *\r\n * Pipeline:\r\n * content (string)\r\n * → parseMarkdown() → allElements (Token[])\r\n * → processAndRenderElements() → React tree\r\n *\r\n * Note: Tailwind CDN injection is NOT handled here.\r\n * Use NRpreviewer (which wraps this) or call useLazyTailwindCDN yourself.\r\n */\r\nconst CustomMarkdownRenderer: React.FC<CustomMarkdownRendererProps> = ({ content: initialContent }) => {\r\n const [modals, setModals] = useState<Record<string, boolean>>({});\r\n const baseId = useId().replace(/:/g, '');\r\n const articleClass = `scope-${baseId}`;\r\n\r\n // Ref to hold the latest context — avoids stale closures in memoized renderElement\r\n const contextRef = useRef<RenderContext>(null!);\r\n\r\n // Reset the scope counter before parsing so IDs are stable across SSR/CSR\r\n resetScopeCounter();\r\n\r\n // Parse the markdown into AST — memoized to avoid re-parsing on every render\r\n const allElements = useMemo(() => parseMarkdown(initialContent), [initialContent]);\r\n\r\n // Scroll to hash on load and hash changes\r\n useEffect(() => {\r\n const handleHashChange = () => {\r\n const hash = window.location.hash;\r\n if (hash) {\r\n const parts = hash.split('#');\r\n const id = parts[parts.length - 1];\r\n scrollToId(id);\r\n }\r\n };\r\n handleHashChange();\r\n window.addEventListener('hashchange', handleHashChange);\r\n return () => window.removeEventListener('hashchange', handleHashChange);\r\n }, [initialContent]);\r\n\r\n // ── Render a single AST element ──\r\n const renderElement = useCallback(\r\n (element: Token, index: number, _depth: number = 0): React.ReactNode => {\r\n switch (element.type) {\r\n case 'header': {\r\n const HeaderTag = `h${element.level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\r\n let text = element.text;\r\n\r\n // Alignment modifiers on headers\r\n const alignCenter = text.match(/^->\\s*(.+?)\\s*<-\\s*$/);\r\n const alignRight = text.match(/^->\\s*(.+?)\\s*->\\s*$/);\r\n if (alignCenter) {\r\n text = alignCenter[1];\r\n } else if (alignRight) {\r\n text = alignRight[1];\r\n }\r\n\r\n const userClasses = element.classes || '';\r\n let headerClasses = `md-h${element.level}`;\r\n\r\n if (alignCenter) headerClasses += ' text-center';\r\n if (alignRight) headerClasses += ' text-right';\r\n if (userClasses) headerClasses += ` ${userClasses}`;\r\n\r\n return React.createElement(\r\n HeaderTag,\r\n { key: index, id: element.id, className: headerClasses },\r\n renderInline(text)\r\n );\r\n }\r\n\r\n case 'paragraph': {\r\n const lines = element.content.split('\\n');\r\n const processedContent = lines.map((line, lineIndex) => {\r\n const hardBreakMatch = line.match(/^(.*?)(\\s{2,})$/);\r\n if (hardBreakMatch) {\r\n return (\r\n <React.Fragment key={lineIndex}>\r\n {renderInline(hardBreakMatch[1])}\r\n <br />\r\n </React.Fragment>\r\n );\r\n }\r\n const isLastLine = lineIndex === lines.length - 1;\r\n return (\r\n <React.Fragment key={lineIndex}>\r\n {renderInline(line)}\r\n {!isLastLine && ' '}\r\n </React.Fragment>\r\n );\r\n });\r\n\r\n const pUserClasses = element.classes || '';\r\n let pClasses = 'md-p';\r\n if (pUserClasses) pClasses += ` ${pUserClasses}`;\r\n if (element.align) pClasses += ` text-${element.align}`;\r\n\r\n return (\r\n <p key={index} id={element.id} className={pClasses}>\r\n {processedContent}\r\n </p>\r\n );\r\n }\r\n\r\n case 'codeblock':\r\n return (\r\n <CodeBlock\r\n key={index}\r\n code={element.content}\r\n language={element.language}\r\n title={element.title}\r\n />\r\n );\r\n\r\n case 'directive':\r\n return (\r\n <DirectiveRenderer\r\n key={index}\r\n element={element}\r\n context={contextRef.current}\r\n index={index}\r\n allElements={allElements}\r\n />\r\n );\r\n\r\n case 'html': {\r\n let processedContent = element.content;\r\n let globalStyles = '';\r\n\r\n // Extract <style> blocks and inject them globally into <head>\r\n processedContent = processedContent.replace(\r\n /<style(?:\\s+[^>]*)?>([\\s\\S]*?)<\\/style>/gi,\r\n (_match: string, cssContent: string) => {\r\n globalStyles += cssContent + '\\n';\r\n return '';\r\n }\r\n );\r\n\r\n const wrapperClassName = 'w-full my-4';\r\n\r\n return (\r\n <RawHtmlRenderer\r\n key={index}\r\n content={processedContent}\r\n globalStyles={globalStyles || undefined}\r\n wrapperClassName={wrapperClassName}\r\n />\r\n );\r\n }\r\n\r\n case 'html-block': {\r\n const htmlBlock = element as HtmlBlockToken;\r\n const props = parseHtmlAttrs(htmlBlock.attrs);\r\n return React.createElement(\r\n htmlBlock.tag,\r\n { key: index, ...props },\r\n ...processAndRenderElements(htmlBlock.children, _depth + 1)\r\n );\r\n }\r\n\r\n case 'image':\r\n return (\r\n <img\r\n key={index}\r\n alt={element.alt}\r\n src={element.src}\r\n style={element.style}\r\n className=\"max-w-full h-auto\"\r\n />\r\n );\r\n\r\n case 'table':\r\n return <div key={index}>{renderTable(element.content)}</div>;\r\n\r\n case 'list':\r\n return <div key={index}>{renderList(element.content)}</div>;\r\n\r\n case 'blockquote':\r\n return (\r\n <blockquote key={index} className={`border-l-4 border-accent-primary/30 pl-4 italic text-text-secondary my-4 text-sm sm:text-base${element.classes ? ` ${element.classes}` : ''}`}>\r\n {renderInline(element.content)}\r\n </blockquote>\r\n );\r\n\r\n case 'hr':\r\n return <hr key={index} className=\"my-8 border-border\" />;\r\n\r\n case 'toc':\r\n return <div key={index}>{generateToc(allElements)}</div>;\r\n\r\n default:\r\n return null;\r\n }\r\n },\r\n [allElements]\r\n );\r\n\r\n // ── Process elements with card batching ──\r\n const processAndRenderElements = useCallback(\r\n (elements: Token[], depth: number = 0): React.ReactNode[] => {\r\n const result: React.ReactNode[] = [];\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 responsive 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 any).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 (let c = 0; c < cards.length; c++) {\r\n result.push(renderElement(cards[c], result.length, depth));\r\n }\r\n } else {\r\n // Extract justify-* classes from the first card to apply on the wrapper\r\n const firstCardClass = (cards[0] as DirectiveToken).props?.['class'] || '';\r\n const justifyClasses = firstCardClass.match(/\\bjustify-\\S+/g) || [];\r\n const wrapperJustify = justifyClasses.length > 0 ? justifyClasses.join(' ') : '';\r\n\r\n result.push(\r\n <div key={`card-grid-${result.length}`} className={`not-prose flex flex-wrap gap-6 my-6 ${wrapperJustify}`}>\r\n {cards.map((card, ci) => (\r\n <React.Fragment key={ci}>{renderElement(card, ci, depth)}</React.Fragment>\r\n ))}\r\n </div>\r\n );\r\n }\r\n } else {\r\n result.push(renderElement(el, result.length, depth));\r\n i++;\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n [renderElement]\r\n );\r\n\r\n // ── Generate TOC from headers ──\r\n const generateToc = (elements: Token[]): React.ReactNode => {\r\n const headers = extractHeaders(elements);\r\n if (headers.length === 0) return null;\r\n\r\n return (\r\n <nav className=\"not-prose my-6 p-4 rounded-2xl border border-border bg-background-primary/5\">\r\n <div className=\"text-base font-bold mb-3\">Table of Contents</div>\r\n <ul className=\"space-y-1 list-none p-0 m-0\">\r\n {headers.map((h, i) => {\r\n if (h.type !== 'header') return null;\r\n const indentClass = h.level <= 2 ? 'pl-0' : h.level === 3 ? 'pl-4' : h.level === 4 ? 'pl-8' : 'pl-12';\r\n return (\r\n <li key={i} className={`${indentClass} text-sm sm:text-base`}>\r\n <a\r\n href={`#${h.id}`}\r\n className=\"text-accent-primary hover:text-accent-primary/80 no-underline hover:underline transition-colors\"\r\n onClick={e => {\r\n e.preventDefault();\r\n scrollToId(h.id);\r\n }}\r\n >\r\n {renderInline(h.text.replace(/->|<-/g, '').trim())}\r\n </a>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </nav>\r\n );\r\n };\r\n\r\n // Build the context object for directives\r\n const contextForDirectives: RenderContext = {\r\n modals,\r\n setModals,\r\n articleClass,\r\n allElements,\r\n parseMarkdown,\r\n renderElement,\r\n renderInline,\r\n processAndRenderElements,\r\n };\r\n\r\n // Keep the ref in sync so memoized renderElement always reads fresh state\r\n contextRef.current = contextForDirectives;\r\n\r\n return (\r\n <RenderContextProvider value={contextForDirectives}>\r\n {processAndRenderElements(allElements)}\r\n </RenderContextProvider>\r\n );\r\n};\r\n\r\nexport default CustomMarkdownRenderer;\r\n","import React from 'react';\r\n\r\n/**\r\n * Parse an inline CSS string (e.g. \"color: red; padding: 1rem\") into a React.CSSProperties object.\r\n */\r\nexport function parseCssString(cssText: string): React.CSSProperties {\r\n if (!cssText) return {};\r\n return cssText\r\n .split(';')\r\n .filter(Boolean)\r\n .reduce<Record<string, string>>((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 }, {}) as React.CSSProperties;\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 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 React props object, renaming `class` to `className`.\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 let key = match[1];\r\n const value = match[2] ?? match[3] ?? match[4] ?? true;\r\n\r\n if (key === 'class') key = 'className';\r\n else if (key === 'for') key = 'htmlFor';\r\n else if (key === 'tabindex') key = 'tabIndex';\r\n \r\n // React expects style to be an object\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}\n","import type { Token, DirectiveToken, HtmlBlockToken } from './types';\r\nimport { generateId, generateScopeId, parseProps, extractAttributes } from './utils';\r\nimport type React from 'react';\r\n\r\n/**\r\n * V2 Markdown Parser — line-by-line state machine.\r\n */\r\nexport function parseMarkdown(markdown: string): Token[] {\r\n if (!markdown) return [];\r\n const lines = markdown.split('\\n');\r\n const result: Token[] = [];\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 id = customId || generateId(text.replace(/->|<-/g, ''));\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: React.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 // Compress newlines in attributes so the React renderer doesn't break\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 directive nesting depth (::: opening / ::: closing)\r\n if (trimmed.startsWith(':::')) {\r\n const rest = trimmed.slice(3).trim();\r\n if (rest === '') {\r\n // Bare `:::` → closing marker\r\n nestingDepth = Math.max(0, nestingDepth - 1);\r\n } else {\r\n // `:::type ...` → opening marker\r\n nestingDepth++;\r\n }\r\n }\r\n\r\n // Only split on #slotname when at the top level (not inside a nested directive)\r\n const slotMatch = trimmed.match(/^#([\\w-]+)$/);\r\n if (slotMatch && nestingDepth === 0) {\r\n // Flush buffer into current slot\r\n slots[currentSlot] = buffer.join('\\n').trim();\r\n buffer = [];\r\n currentSlot = slotMatch[1];\r\n } else {\r\n buffer.push(line);\r\n }\r\n }\r\n\r\n // Flush remaining buffer\r\n slots[currentSlot] = buffer.join('\\n').trim();\r\n\r\n // Remove empty slots\r\n for (const key of Object.keys(slots)) {\r\n if (!slots[key]) delete slots[key];\r\n }\r\n\r\n return slots;\r\n}\r\n","import React, { useState, useRef } from 'react';\r\nimport hljs from './highlightSetup';\r\nimport { Dialog } from '@base-ui/react/dialog';\r\n\r\n// ─────────────────────────────────────────────\r\n// IconRenderer — Material Icons by name or codepoint\r\n// ─────────────────────────────────────────────\r\n\r\ninterface IconRendererProps {\r\n iconName: string;\r\n extraClasses?: string;\r\n}\r\n\r\nexport const IconRenderer: React.FC<IconRendererProps> = ({ iconName, extraClasses = '' }) => {\r\n if (!iconName) return null;\r\n\r\n const baseClass = `material-symbols-rounded !text-[1em] leading-none align-top ${extraClasses}`;\r\n const isCodepoint = /^[eE][0-9a-fA-F]{3,4}$/.test(iconName);\r\n\r\n if (isCodepoint) {\r\n return (\r\n <span\r\n className={baseClass}\r\n dangerouslySetInnerHTML={{ __html: `&#x${iconName};` }}\r\n aria-hidden=\"true\"\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <span className={baseClass} aria-hidden=\"true\">\r\n {iconName}\r\n </span>\r\n );\r\n};\r\n\r\n// ─────────────────────────────────────────────\r\n// CodeBlock — synchronous syntax highlighting + copy\r\n// ─────────────────────────────────────────────\r\n\r\ninterface CodeBlockProps {\r\n code: string;\r\n language: string;\r\n title?: string;\r\n}\r\n\r\nexport const CodeBlock: React.FC<CodeBlockProps> = ({ code, language, title }) => {\r\n const [copied, setCopied] = useState(false);\r\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n const lang = language?.split(/[\\s{]/)[0]?.trim() || '';\r\n\r\n let html: string;\r\n try {\r\n if (lang && hljs.getLanguage(lang)) {\r\n html = hljs.highlight(code, { language: lang }).value;\r\n } else {\r\n html = hljs.highlightAuto(code).value;\r\n }\r\n } catch {\r\n html = '';\r\n }\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(code);\r\n setCopied(true);\r\n if (timerRef.current) clearTimeout(timerRef.current);\r\n timerRef.current = setTimeout(() => setCopied(false), 1800);\r\n };\r\n\r\n return (\r\n <div className=\"not-prose my-4 rounded-2xl border border-border overflow-hidden bg-background-secondary-solid/5\">\r\n {title && (\r\n <div className=\"flex items-center gap-2 px-4 py-2 border-b border-border bg-background-secondary-solid/10 text-xs sm:text-sm font-mono text-text-secondary\">\r\n <span className=\"material-symbols-rounded text-base\">description</span>\r\n {title}\r\n </div>\r\n )}\r\n <div className=\"overflow-auto [&_pre]:m-0 [&_pre]:p-4 [&_pre]:text-xs sm:[&_pre]:text-sm\">\r\n <pre className=\"m-0\"><code className={`language-${lang || 'plaintext'}`} dangerouslySetInnerHTML={{ __html: html }} /></pre>\r\n </div>\r\n <button className=\"absolute top-2 right-2 p-1.5 rounded-lg bg-background-secondary-solid/20 hover:bg-background-secondary-solid/40 transition-colors cursor-pointer border-none text-text-secondary hover:text-text-primary\" onClick={handleCopy} title=\"Copy code\">\r\n <span className=\"material-symbols-rounded\" style={{ fontSize: '1rem' }}>\r\n {copied ? 'check' : 'content_copy'}\r\n </span>\r\n </button>\r\n </div>\r\n );\r\n};\r\n\r\n// ─────────────────────────────────────────────\r\n// Admonition — styled alert box (Tailwind)\r\n// ─────────────────────────────────────────────\r\n\r\ninterface AdmonitionProps {\r\n type: string;\r\n title?: string;\r\n icon?: string;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n children: React.ReactNode;\r\n}\r\n\r\nconst defaultIcons: Record<string, string> = {\r\n note: 'info',\r\n info: 'lightbulb',\r\n warning: 'warning',\r\n danger: 'report',\r\n greentext: 'subdirectory_play_arrow',\r\n};\r\n\r\nconst typeClasses: Record<string, string> = {\r\n note: 'border-info/20 bg-info/5 text-info',\r\n info: 'border-info/30 bg-info/10 text-info',\r\n warning: 'border-amber-500/30 bg-amber-500/10 text-amber-500',\r\n danger: 'border-danger/30 bg-danger/10 text-danger',\r\n greentext: 'border-success/30 bg-success/10 text-success',\r\n};\r\n\r\nexport const Admonition: React.FC<AdmonitionProps> = ({ type, title, icon, className = '', style, children }) => {\r\n const iconToRender = icon || defaultIcons[type] || 'info';\r\n\r\n return (\r\n <div\r\n className={`not-prose rounded-2xl mb-6 border shadow-xs p-4 ${typeClasses[type] || typeClasses.note} ${className}`}\r\n style={style}\r\n >\r\n {title && (\r\n <h5 className=\"font-bold text-base mb-2 m-0 flex items-center gap-2\">\r\n <IconRenderer iconName={iconToRender} extraClasses=\"shrink-0\" />\r\n <span>{title}</span>\r\n </h5>\r\n )}\r\n <div className=\"text-sm leading-relaxed opacity-90\">{children}</div>\r\n </div>\r\n );\r\n};\r\n\r\n// ─────────────────────────────────────────────\r\n// Details — collapsible section (Tailwind)\r\n// ─────────────────────────────────────────────\r\n\r\ninterface DetailsProps {\r\n title: string;\r\n icon?: string;\r\n defaultOpen?: boolean;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const Details: React.FC<DetailsProps> = ({\r\n title,\r\n icon,\r\n defaultOpen = false,\r\n className = '',\r\n style,\r\n children,\r\n}) => {\r\n const [isOpen, setIsOpen] = useState(defaultOpen);\r\n const iconToRender = icon || 'play_arrow';\r\n\r\n return (\r\n <details\r\n className={`not-prose rounded-2xl border border-border mb-4 bg-background-primary/5 ${className}`}\r\n open={isOpen}\r\n style={style}\r\n >\r\n <summary\r\n className=\"cursor-pointer p-4 font-bold flex items-center gap-2 list-none [&::-webkit-details-marker]:hidden hover:text-accent-primary transition-colors\"\r\n onClick={e => {\r\n e.preventDefault();\r\n setIsOpen(prev => !prev);\r\n }}\r\n >\r\n <IconRenderer\r\n iconName={iconToRender}\r\n extraClasses={`transition-transform ${isOpen ? 'rotate-90' : ''}`}\r\n />\r\n <span>{title}</span>\r\n </summary>\r\n {isOpen && (\r\n <div className=\"px-4 pb-4 border-t border-border pt-3 text-sm leading-relaxed opacity-90 overflow-hidden min-w-0\">\r\n {children}\r\n </div>\r\n )}\r\n </details>\r\n );\r\n};\r\n\r\n// ─────────────────────────────────────────────\r\n// Modal — overlay dialog (Base UI Dialog + Tailwind)\r\n// ─────────────────────────────────────────────\r\n\r\ninterface ModalProps {\r\n title: string;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const Modal: React.FC<ModalProps> = ({ title, isOpen, onClose, children }) => {\r\n return (\r\n <Dialog.Root open={isOpen} onOpenChange={(open) => { if (!open) onClose(); }}>\r\n <Dialog.Portal>\r\n <Dialog.Backdrop className=\"fixed inset-0 z-[9999] bg-black/60\" />\r\n <Dialog.Viewport className=\"fixed inset-0 z-[9999] flex items-center justify-center p-4\">\r\n <Dialog.Popup className=\"bg-background-primary border border-border shadow-2xl rounded-3xl w-full max-w-3xl max-h-[85vh] flex flex-col overflow-hidden\">\r\n <div className=\"flex justify-between items-center p-4 border-b border-border bg-background-secondary-solid/20\">\r\n <Dialog.Title className=\"text-lg font-bold !m-0\">{title}</Dialog.Title>\r\n <Dialog.Close className=\"w-8 h-8 rounded-full hover:bg-white/10 flex items-center justify-center transition-colors cursor-pointer border-none bg-transparent\">\r\n <span className=\"material-symbols-rounded text-base\">close</span>\r\n </Dialog.Close>\r\n </div>\r\n <div className=\"p-6 overflow-auto min-h-0 text-text-primary [&_h1:first-child]:mt-0 [&_h2:first-child]:mt-0 [&_h3:first-child]:mt-0 [&_h4:first-child]:mt-0 [&_h5:first-child]:mt-0 [&_h6:first-child]:mt-0\">\r\n {children}\r\n </div>\r\n </Dialog.Popup>\r\n </Dialog.Viewport>\r\n </Dialog.Portal>\r\n </Dialog.Root>\r\n );\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('c', cpp);\nhljs.registerLanguage('go', go);\nhljs.registerLanguage('rust', rust);\nhljs.registerLanguage('rs', rust);\nhljs.registerLanguage('php', php);\nhljs.registerLanguage('ruby', ruby);\nhljs.registerLanguage('rb', ruby);\nhljs.registerLanguage('swift', swift);\nhljs.registerLanguage('kotlin', kotlin);\nhljs.registerLanguage('kt', kotlin);\nhljs.registerLanguage('dart', dart);\nhljs.registerLanguage('yaml', yaml);\nhljs.registerLanguage('yml', yaml);\nhljs.registerLanguage('toml', toml);\nhljs.registerLanguage('ini', toml);\nhljs.registerLanguage('dockerfile', dockerfile);\nhljs.registerLanguage('docker', dockerfile);\nhljs.registerLanguage('diff', diff);\nhljs.registerLanguage('shell', shell);\n\nexport default hljs;\n","import React from 'react';\r\nimport type { Token } from './types';\r\nimport { IconRenderer } from './ui-components';\r\n\r\n/**\r\n * Render inline markdown formatting into React elements.\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): React.ReactNode {\r\n if (!text) return text;\r\n\r\n const parsePart = (part: string, key: string): React.ReactNode => {\r\n let match: RegExpMatchArray | null;\r\n\r\n // Icon: |[[icon-name]]|\r\n if ((match = part.match(/^\\|\\[([^\\]]+)\\]\\|$/))) {\r\n return <IconRenderer key={key} iconName={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 return (\r\n <span\r\n key={key}\r\n style={{\r\n textDecoration: `${type} ${decorationStyle} ${color}`,\r\n textDecorationThickness: 'auto',\r\n }}\r\n >\r\n {renderInline(innerText)}\r\n </span>\r\n );\r\n }\r\n\r\n // Color text: %color%text%%\r\n if ((match = part.match(/%([^%\\s]+?)%([\\s\\S]+?)%%/))) {\r\n return (\r\n <span key={key} style={{ color: match[1] }}>\r\n {renderInline(match[2])}\r\n </span>\r\n );\r\n }\r\n\r\n // Spoiler: !>text<!\r\n if ((match = part.match(/^!>([^<]+?)<!$/))) {\r\n return (\r\n <span key={key} className=\"bg-text-primary text-bg-primary px-1 rounded hover:bg-transparent transition-colors cursor-pointer\">\r\n {renderInline(match[1])}\r\n </span>\r\n );\r\n }\r\n\r\n // Highlight: ==text==\r\n if ((match = part.match(/^==(.+?)==$/))) {\r\n return (\r\n <mark key={key} className=\"bg-yellow-500/20 text-inherit px-0.5 rounded\">\r\n {renderInline(match[1])}\r\n </mark>\r\n );\r\n }\r\n\r\n // Bold-italic: ***text***\r\n if ((match = part.match(/^\\*\\*\\*(.+?)\\*\\*\\*$/))) {\r\n return (\r\n <strong key={key}>\r\n <em>{renderInline(match[1])}</em>\r\n </strong>\r\n );\r\n }\r\n\r\n // Bold: **text**\r\n if ((match = part.match(/^\\*\\*(.+?)\\*\\*$/))) {\r\n return <strong key={key}>{renderInline(match[1])}</strong>;\r\n }\r\n\r\n // Italic: _text_\r\n if ((match = part.match(/^_(.+?)_$/))) {\r\n return <em key={key}>{renderInline(match[1])}</em>;\r\n }\r\n\r\n // Strikethrough: ~~text~~\r\n if ((match = part.match(/^~~(.+?)~~$/))) {\r\n return <del key={key}>{renderInline(match[1])}</del>;\r\n }\r\n\r\n // Inline code: `code`\r\n if ((match = part.match(/^`([^`]+)`$/))) {\r\n return (\r\n <code key={key} className=\"text-[0.875em] font-mono bg-background-secondary/50 px-1.5 py-0.5 rounded text-text-primary\">\r\n {match[1]}\r\n </code>\r\n );\r\n }\r\n\r\n // Link: [text](url)\r\n if ((match = part.match(/^\\[([^\\]]+?)\\]\\(([^)]+?)\\)$/))) {\r\n return (\r\n <a\r\n key={key}\r\n href={match[2]}\r\n className=\"text-accent-primary underline decoration-accent-primary/40 hover:decoration-accent-primary transition-colors\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n {renderInline(match[1])}\r\n </a>\r\n );\r\n }\r\n\r\n // Raw HTML tag: <tag>...</tag>\r\n if (part.startsWith('<') && part.endsWith('>')) {\r\n return <span key={key} dangerouslySetInnerHTML={{ __html: part }} />;\r\n }\r\n\r\n return part;\r\n };\r\n\r\n const regex =\r\n /(\\|\\[[^\\]]+\\]\\||\\*\\*\\*.+?\\*\\*\\*|\\*\\*.+?\\*\\*|_.+?_|~~.+?~~|`[^`]+?`|!~.+?~!|%[^%\\s]+?%[\\s\\S]+?%%|!>.+?<!|==.+?==|\\[[^\\]]+?\\]\\([^)]+?\\)|<[^>]+>)/g;\r\n\r\n const elements: React.ReactNode[] = [];\r\n let lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n let keyCounter = 0;\r\n\r\n while ((match = regex.exec(text)) !== null) {\r\n if (match.index > lastIndex) {\r\n elements.push(text.slice(lastIndex, match.index));\r\n }\r\n elements.push(parsePart(match[0], `inline-${keyCounter++}`));\r\n lastIndex = regex.lastIndex;\r\n }\r\n if (lastIndex < text.length) {\r\n elements.push(text.slice(lastIndex));\r\n }\r\n\r\n return elements;\r\n}\r\n\r\n/**\r\n * Render a pipe-delimited markdown table.\r\n */\r\nexport function renderTable(content: string): React.ReactNode {\r\n const rows = content.split('\\n').filter(r => r.trim());\r\n if (rows.length < 2) return <p>{content}</p>;\r\n\r\n const parseRow = (row: string) =>\r\n row\r\n .split('|')\r\n .map(c => c.trim())\r\n .filter(Boolean);\r\n\r\n const headerCells = parseRow(rows[0]);\r\n const bodyRows = rows.slice(2).map(parseRow); // skip separator row\r\n\r\n return (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full text-sm sm:text-base border-collapse my-4\">\r\n <thead>\r\n <tr>\r\n {headerCells.map((cell, ci) => (\r\n <th key={ci} className=\"border border-border px-3 py-2 bg-background-secondary-solid/10 text-left font-bold\">{renderInline(cell)}</th>\r\n ))}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {bodyRows.map((cells, ri) => (\r\n <tr key={ri}>\r\n {cells.map((cell, ci) => (\r\n <td key={ci} className=\"border border-border px-3 py-2\">{renderInline(cell)}</td>\r\n ))}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Render a markdown list (ordered or unordered) with nesting support.\r\n */\r\nexport function renderList(content: string): React.ReactNode {\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({\r\n indent: match[1].length,\r\n marker: match[2],\r\n text: match[3],\r\n });\r\n }\r\n }\r\n\r\n if (items.length === 0) return <p>{content}</p>;\r\n\r\n const isOrdered = /^\\d+\\.$/.test(items[0].marker);\r\n const Tag = isOrdered ? 'ol' : 'ul';\r\n\r\n return (\r\n <Tag className={`${isOrdered ? 'list-decimal' : 'list-disc'} pl-6 my-3 space-y-1 text-sm sm:text-base`}>\r\n {items.map((item, index) => (\r\n <li key={index} className=\"leading-relaxed\">\r\n {renderInline(item.text)}\r\n </li>\r\n ))}\r\n </Tag>\r\n );\r\n}\r\n\r\n/**\r\n * Extract all header tokens from an AST for TOC generation.\r\n */\r\nexport function extractHeaders(elements: Token[]): Token[] {\r\n return elements.filter((el): el is Token & { type: 'header' } => el.type === 'header');\r\n}\r\n","import React from 'react';\r\nimport type { DirectiveComponentProps } from '../types';\r\nimport { Admonition } from '../ui-components';\r\nimport { parseCssString } from '../utils';\r\n\r\n/**\r\n * Admonition Directive — renders note, info, warning, danger, greentext boxes.\r\n *\r\n * V2 syntax:\r\n * :::note {title=\"My Note\" icon=\"info\"}\r\n * Content here\r\n * :::\r\n *\r\n * :::warning Short title text\r\n * Content here\r\n * :::\r\n */\r\nconst AdmonitionDirective: React.FC<DirectiveComponentProps> = ({\r\n directiveType,\r\n props,\r\n renderSlot,\r\n}) => {\r\n return (\r\n <Admonition\r\n type={directiveType}\r\n title={props.title}\r\n icon={props.icon}\r\n className={props.class}\r\n style={props.style ? parseCssString(props.style) : undefined}\r\n >\r\n {renderSlot('default')}\r\n </Admonition>\r\n );\r\n};\r\n\r\nexport default AdmonitionDirective;\r\n","import React, { useId } from 'react';\r\nimport type { DirectiveComponentProps } from '../types';\r\nimport { IconRenderer, Modal } from '../ui-components';\r\nimport { parseCssString } from '../utils';\r\n\r\n/**\r\n * Card Directive — renders card, card-m (modal), card-b (link) variants.\r\n * Uses Tailwind with override pattern.\r\n *\r\n * V2 syntax:\r\n * :::card {title=\"Card Title\" image=\"url\" icon=\"star\" class=\"custom\"}\r\n * #description\r\n * Short description text\r\n * #content\r\n * Main card content (for card-m: shown in modal)\r\n * :::\r\n */\r\nconst CardDirective: React.FC<DirectiveComponentProps> = ({\r\n directiveType,\r\n props,\r\n slots,\r\n renderSlot,\r\n context,\r\n options = {},\r\n}) => {\r\n const stableId = useId();\r\n const { title, image, icon, class: customClass, url, target } = props;\r\n const hasDescription = !!slots.description;\r\n const { isSingleCard } = options;\r\n\r\n const isModal = directiveType === 'card-m';\r\n const isLink = directiveType === 'card-b';\r\n\r\n const modalId = `modal-card-${props.id || stableId}`;\r\n const wrapperClass = customClass || '';\r\n const inlineStyles = props.style ? parseCssString(props.style) : {};\r\n\r\n const description = hasDescription ? renderSlot('description') : null;\r\n const content = renderSlot('content') || renderSlot('default');\r\n\r\n return (\r\n <React.Fragment>\r\n <div\r\n className={`flex flex-col h-full rounded-3xl transition-all relative overflow-hidden group border min-w-[18rem] w-[18rem] max-w-[20rem] ${isModal || isLink ? 'cursor-pointer !border-accent-primary/10 hover:border-accent-primary/50' : 'border-border'} ${wrapperClass}`}\r\n style={inlineStyles}\r\n onClick={isModal\r\n ? (e) => { e.preventDefault(); e.stopPropagation(); context.setModals((prev: any) => ({ ...prev, [modalId]: true })); }\r\n : isLink && url\r\n ? () => window.open(url, '_blank')\r\n : undefined\r\n }\r\n role={isModal ? 'button' : undefined}\r\n tabIndex={isModal ? 0 : undefined}\r\n onKeyDown={isModal\r\n ? (e) => { if (e.key === 'Enter' || e.key === ' ') context.setModals((prev: any) => ({ ...prev, [modalId]: true })); }\r\n : undefined\r\n }\r\n >\r\n {/* Image banner */}\r\n {image && (\r\n <div className={`w-full ${isSingleCard ? 'h-[240px]' : 'h-[160px]'} overflow-hidden relative transition-all duration-500`}>\r\n <img src={image} alt={title || ''} className=\"w-full h-full object-cover !m-0\" />\r\n <div className=\"absolute inset-0 bg-gradient-to-t from-background-primary/40 to-transparent\" />\r\n </div>\r\n )}\r\n\r\n {/* Content body — overlaps image */}\r\n <div className={`flex flex-col flex-1 bg-background-primary/80 rounded-t-xl p-6 relative ${image ? '-mt-10' : ''} border-t border-white/5 shadow-2xl`}>\r\n {/* Header: Icon + Title */}\r\n <div className=\"flex items-center gap-3 mb-3\">\r\n {icon && (\r\n <div className=\"w-10 h-10 text-[1.6em] rounded-xl bg-accent-primary/20 flex items-center justify-center shrink-0 text-accent-primary\">\r\n <IconRenderer iconName={icon} />\r\n </div>\r\n )}\r\n <h3 className=\"text-base font-black tracking-tight leading-tight !m-0\">\r\n {title}\r\n </h3>\r\n </div>\r\n\r\n {/* Content Body */}\r\n <div className=\"flex-1 flex flex-col gap-2\">\r\n {description && (\r\n <div className=\"text-sm opacity-80 leading-relaxed font-medium\">\r\n {description}\r\n </div>\r\n )}\r\n {directiveType === 'card' && content && (\r\n <div className=\"mt-2\">{content}</div>\r\n )}\r\n </div>\r\n\r\n {/* Bottom: Action Link */}\r\n {(isModal || isLink) && (\r\n <div className=\"mt-6 flex justify-end\">\r\n {isLink && url ? (\r\n <a\r\n href={url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"bg-accent-primary/20 hover:bg-accent-primary/30 px-4 py-2 rounded-xl flex items-center gap-1.5 text-[10px] font-black uppercase tracking-widest opacity-50 group-hover:opacity-100 group-hover:text-accent-primary transition-all no-underline\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <IconRenderer iconName=\"open_in_new\" /> Link\r\n </a>\r\n ) : isModal ? (\r\n <div className=\"bg-accent-primary/20 hover:bg-accent-primary/30 px-4 py-2 cursor-pointer rounded-xl flex items-center gap-1.5 text-[10px] font-black uppercase tracking-widest opacity-50 group-hover:opacity-100 group-hover:text-accent-primary transition-all\">\r\n <IconRenderer iconName=\"arrow_forward\" /> Abrir\r\n </div>\r\n ) : null}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Modal for card-m */}\r\n {isModal && (\r\n <Modal\r\n title={title || 'Detalles'}\r\n isOpen={!!context.modals[modalId]}\r\n onClose={() => context.setModals((prev: any) => ({ ...prev, [modalId]: false }))}\r\n >\r\n <div className=\"prose prose-sm max-w-none\">{content}</div>\r\n </Modal>\r\n )}\r\n </React.Fragment>\r\n );\r\n};\r\n\r\nexport default CardDirective;\r\n","import React from 'react';\r\nimport type { DirectiveComponentProps } from '../types';\r\nimport { Details } from '../ui-components';\r\nimport { parseCssString } from '../utils';\r\n\r\n/**\r\n * Details Directive — collapsible section.\r\n *\r\n * V2 syntax:\r\n * :::details {title=\"Click to expand\" icon=\"expand_more\" defaultOpen=\"true\"}\r\n * Hidden content here\r\n * :::\r\n *\r\n * :::details Short title\r\n * Content\r\n * :::\r\n */\r\nconst DetailsDirective: React.FC<DirectiveComponentProps> = ({\r\n props,\r\n renderSlot,\r\n}) => {\r\n return (\r\n <Details\r\n title={props.title || 'Details'}\r\n icon={props.icon}\r\n defaultOpen={props.defaultOpen === 'true'}\r\n className={props.class}\r\n style={props.style ? parseCssString(props.style) : undefined}\r\n >\r\n {renderSlot('default')}\r\n </Details>\r\n );\r\n};\r\n\r\nexport default DetailsDirective;\r\n","import React, { useId } from 'react';\r\nimport type { DirectiveComponentProps } from '../types';\r\nimport { IconRenderer, Modal } from '../ui-components';\r\n\r\n/**\r\n * Modal Directive — button that opens a modal with content.\r\n * Uses Tailwind with override pattern + Base UI Dialog.\r\n *\r\n * V2 syntax:\r\n * :::modal {title=\"My Modal\" label=\"Open Modal\" icon=\"open_in_new\" class=\"text-lg\"}\r\n * Modal content here\r\n * :::\r\n */\r\nconst ModalDirective: React.FC<DirectiveComponentProps> = ({\r\n props,\r\n renderSlot,\r\n context,\r\n}) => {\r\n const stableId = useId();\r\n const modalId = `modal-${props.id || stableId}`;\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 // Smart size detection — only add default if user didn't provide one\r\n const hasSizeClass = /\\btext-(xs|sm|base|lg|xl|[2-9]xl)\\b/.test(customClass);\r\n const sizeClass = hasSizeClass ? '' : 'text-sm';\r\n\r\n // Smart display detection\r\n const hasDisplayClass = /\\b(flex|inline-flex|block|inline-block|grid|inline-grid|hidden)\\b/.test(customClass);\r\n const displayClass = hasDisplayClass ? '' : 'inline-flex';\r\n\r\n // Smart margin — inline vs block\r\n const isInlineFlex = /\\binline-flex\\b/.test(customClass);\r\n const marginClass = isInlineFlex ? 'my-1 mx-1' : 'my-4';\r\n\r\n // Base button styles (Tailwind puro)\r\n const btnBase = `${displayClass} items-center w-fit ${marginClass} ${sizeClass} px-4 py-2 rounded-xl font-bold no-underline gap-2 transition-all hover:scale-105 active:scale-95 border border-border bg-background-primary/5 hover:bg-background-primary/10 text-text-primary hover:text-text-primary`.replace(/\\s+/g, ' ');\r\n const btnClass = `${btnBase} ${customClass}`.trim();\r\n\r\n // Resolve position shorthand → text classes for wrapper\r\n const positionMap: Record<string, string> = {\r\n '#left': 'text-left',\r\n '#center': 'text-center',\r\n '#right': 'text-right',\r\n };\r\n const wrapperClass = customClass\r\n .split(/\\s+/)\r\n .map(c => positionMap[c] || c)\r\n .join(' ');\r\n\r\n const handleOpen = () => {\r\n context.setModals(prev => ({ ...prev, [modalId]: true }));\r\n };\r\n\r\n const handleClose = () => {\r\n context.setModals(prev => ({ ...prev, [modalId]: false }));\r\n };\r\n\r\n return (\r\n <div className={`not-prose ${wrapperClass}`.trim()}>\r\n <button className={btnClass} onClick={handleOpen}>\r\n {props.icon && <IconRenderer iconName={props.icon} />}\r\n {label}\r\n </button>\r\n\r\n <Modal\r\n title={modalTitle}\r\n isOpen={!!context.modals[modalId]}\r\n onClose={handleClose}\r\n >\r\n {renderSlot('default')}\r\n </Modal>\r\n </div>\r\n );\r\n};\r\n\r\nexport default ModalDirective;\r\n","import React from 'react';\r\nimport type { DirectiveComponentProps } from '../types';\r\nimport { IconRenderer } from '../ui-components';\r\n\r\n/**\r\n * Button Directive — styled link button (Tailwind with override pattern).\r\n *\r\n * V2 syntax:\r\n * :::button {url=\"https://example.com\" label=\"Click Me\" icon=\"arrow_forward\" class=\"text-lg\"}\r\n * :::\r\n *\r\n * Or with content as label:\r\n * :::button {url=\"https://example.com\" icon=\"star\"}\r\n * Click Me\r\n * :::\r\n */\r\nconst ButtonDirective: React.FC<DirectiveComponentProps> = ({\r\n props,\r\n renderSlot,\r\n}) => {\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 // Smart size detection — only add default if user didn't provide one\r\n const hasSizeClass = /\\btext-(xs|sm|base|lg|xl|[2-9]xl)\\b/.test(customClass);\r\n const sizeClass = hasSizeClass ? '' : 'text-sm';\r\n\r\n // Smart display detection\r\n const hasDisplayClass = /\\b(flex|inline-flex|block|inline-block|grid|inline-grid|hidden)\\b/.test(customClass);\r\n const displayClass = hasDisplayClass ? '' : 'inline-flex';\r\n\r\n // Smart margin — inline vs block\r\n const isInline = !customClass || !/\\b(flex|block|grid)\\b/.test(customClass) || /\\binline-flex\\b/.test(customClass);\r\n const marginClass = isInline ? 'my-1 mx-1' : 'my-4';\r\n\r\n // Base button styles (Tailwind puro)\r\n const btnBase = `${displayClass} items-center w-fit ${marginClass} ${sizeClass} px-4 py-2 rounded-xl font-bold no-underline gap-2 transition-all hover:scale-105 active:scale-95 border border-border bg-background-primary/5 hover:bg-background-primary/10 text-text-primary hover:text-text-primary`.replace(/\\s+/g, ' ');\r\n const btnClass = `${btnBase} ${customClass}`.trim();\r\n\r\n // Resolve position shorthand → flex classes for button wrapper\r\n const positionMap: Record<string, string> = {\r\n '#left': 'flex justify-start',\r\n '#center': 'flex justify-center',\r\n '#right': 'flex justify-end',\r\n };\r\n const wrapperClass = customClass\r\n .split(/\\s+/)\r\n .map(c => positionMap[c] || c)\r\n .join(' ');\r\n\r\n // If label is provided, use it directly (no slot rendering needed)\r\n if (label) {\r\n return (\r\n <div className={`not-prose ${wrapperClass}`.trim()}>\r\n <a\r\n href={url}\r\n target={target}\r\n rel=\"noopener noreferrer\"\r\n className={btnClass}\r\n >\r\n <IconRenderer iconName={icon} />\r\n {label}\r\n </a>\r\n </div>\r\n );\r\n }\r\n\r\n // Otherwise, render slot content (which may contain links)\r\n const slotContent = renderSlot('default');\r\n const findLinks = (element: React.ReactNode): React.ReactElement<any>[] => {\r\n if (!element) return [];\r\n if (React.isValidElement(element) && (element.type as any) === 'a') {\r\n return [element as React.ReactElement<any>];\r\n }\r\n if (Array.isArray(element)) {\r\n return element.flatMap(findLinks);\r\n }\r\n if (React.isValidElement(element) && (element.props as any).children) {\r\n return findLinks((element.props as any).children);\r\n }\r\n return [];\r\n };\r\n\r\n const links = findLinks(slotContent);\r\n\r\n if (links.length > 0) {\r\n return (\r\n <div className={`not-prose ${wrapperClass}`.trim()}>\r\n {links.map((link, index) =>\r\n React.cloneElement(\r\n link,\r\n {\r\n key: index,\r\n className: `${(link.props as any).className || ''} ${btnClass}`.trim(),\r\n target: target,\r\n rel: 'noopener noreferrer',\r\n },\r\n <>\r\n <IconRenderer iconName={icon} />\r\n {(link.props as any).children}\r\n </>\r\n )\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // Fallback: wrap content in an anchor\r\n return (\r\n <div className={`not-prose ${wrapperClass}`.trim()}>\r\n <a href={url} target={target} rel=\"noopener noreferrer\" className={btnClass}>\r\n <IconRenderer iconName={icon} />\r\n {slotContent}\r\n </a>\r\n </div>\r\n );\r\n};\r\n\r\nexport default ButtonDirective;\r\n","import React from 'react';\nimport type { DirectiveComponentProps } from '../types';\nimport { parseCssString } from '../utils';\n\n/**\n * Wrapper Directive — generic layout/styling wrapper for backward compatibility.\n * Consolidates 'div', 'raw', 'style', 'custom' directives.\n * Passes through all recognized props to a `<div>`.\n */\nconst WrapperDirective: React.FC<DirectiveComponentProps> = ({\n props,\n renderSlot,\n}) => {\n const className = props.class || '';\n const id = props.id || '';\n\n // Parse inline styles from the `style` prop\n const inlineStyle = props.style ? parseCssString(props.style) : {};\n\n // Build wrapper props\n const wrapperProps: Record<string, any> = {};\n if (className) wrapperProps.className = className;\n if (id) wrapperProps.id = id;\n if (Object.keys(inlineStyle).length > 0) wrapperProps.style = inlineStyle;\n\n // Support arbitrary data-* attributes\n for (const [key, value] of Object.entries(props)) {\n if (key.startsWith('data-')) {\n wrapperProps[key] = value;\n }\n }\n\n return <div {...wrapperProps}>{renderSlot('default')}</div>;\n};\n\nexport default WrapperDirective;\n","import React, { useState, useEffect, useCallback, useRef, useLayoutEffect } from 'react';\r\nimport type { DirectiveComponentProps, Token } from '../types';\r\nimport { parseCssString } from '../utils';\r\n\r\nlet slideCounter = 0;\r\n\r\n/**\r\n * Slide Directive — single-line text carousel with slide-up rotation.\r\n *\r\n * V2 syntax:\r\n * :::slide {class=\"text-2xl font-bold\" interval=\"3000\"}\r\n * First line\r\n * ## Header line\r\n * **Bold** and _italic_ line\r\n * :::\r\n *\r\n * Each line is parsed individually via parseMarkdown, so headers, inline\r\n * formatting, and even nested directives all render correctly.\r\n * Only one line is visible at a time, rotating upward with a smooth transition.\r\n *\r\n * Props:\r\n * class — Tailwind classes (applied to outer container)\r\n * style — Inline CSS\r\n * interval — ms between rotations (default 3000)\r\n * speed — transition duration in ms (default 500)\r\n */\r\nconst SlideDirective: React.FC<DirectiveComponentProps> = ({\r\n props,\r\n context,\r\n slots,\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 // Parse each line independently — handles ## headers, **bold**, etc.\r\n const elements: Token[][] = lines.map(line => context.parseMarkdown(line));\r\n\r\n const [current, setCurrent] = useState(0);\r\n const interval = parseInt(props.interval || '3000', 10);\r\n const speed = parseInt(props.speed || '500', 10);\r\n\r\n // Refs for dynamic height measurement\r\n const elRefs = useRef<(HTMLDivElement | null)[]>([]);\r\n const [maxH, setMaxH] = useState(0);\r\n\r\n // Measure ALL elements, keep the tallest as the fixed container height\r\n useLayoutEffect(() => {\r\n let h = 0;\r\n elRefs.current.forEach(el => {\r\n if (el) h = Math.max(h, el.offsetHeight);\r\n });\r\n if (h > 0) setMaxH(h);\r\n }, [elements]);\r\n\r\n const cycle = useCallback(() => {\r\n if (elements.length <= 1) return;\r\n setCurrent(prev => (prev + 1) % elements.length);\r\n }, [elements.length]);\r\n\r\n useEffect(() => {\r\n if (elements.length <= 1) return;\r\n const id = setInterval(cycle, interval);\r\n return () => clearInterval(id);\r\n }, [cycle, interval, elements.length]);\r\n\r\n if (elements.length === 0) return null;\r\n\r\n const rawClass = props.class || '';\r\n const inlineStyle = props.style ? parseCssString(props.style) : {};\r\n\r\n // Smart: detect text-size and force it on all children via scoped <style>\r\n // because Tailwind JIT can't see dynamically constructed classes like [&_*]:!text-2xl\r\n const textSizeMap: Record<string, string> = {\r\n 'text-xs': '0.75rem', 'text-sm': '0.875rem', 'text-base': '1rem',\r\n 'text-lg': '1.125rem', 'text-xl': '1.25rem', 'text-2xl': '1.5rem',\r\n 'text-3xl': '1.875rem', 'text-4xl': '2.25rem', 'text-5xl': '3rem',\r\n 'text-6xl': '3.75rem', 'text-7xl': '4.5rem', 'text-8xl': '6rem',\r\n 'text-9xl': '8rem',\r\n };\r\n const textSizeMatch = rawClass.match(/\\btext-(xs|sm|base|lg|xl|[2-9]xl)\\b/);\r\n const forcedFontSize = textSizeMatch ? textSizeMap[textSizeMatch[0]] : null;\r\n const scopeClass = `sld-${++slideCounter}`;\r\n // Strip the matched text-* class from the user's classes (it's handled by the style tag)\r\n const className = textSizeMatch\r\n ? rawClass.replace(textSizeMatch[0], '').replace(/\\s+/g, ' ').trim()\r\n : rawClass;\r\n\r\n return (\r\n <div\r\n className=\"not-prose\"\r\n style={{ height: maxH || 'auto', position: 'relative', overflow: 'hidden', ...inlineStyle }}\r\n >\r\n {forcedFontSize && (\r\n <style>{`.${scopeClass} * { font-size: ${forcedFontSize} !important; line-height: normal !important; }`}</style>\r\n )}\r\n <div\r\n style={{\r\n position: 'absolute',\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n transition: `transform ${speed}ms cubic-bezier(0.16, 1, 0.3, 1)`,\r\n transform: `translateY(${-current * maxH}px)`,\r\n }}\r\n >\r\n {elements.map((tokens, i) => (\r\n <div\r\n key={i}\r\n ref={el => { elRefs.current[i] = el; }}\r\n style={maxH ? { height: maxH, display: 'flex', alignItems: 'center', overflow: 'hidden' } : { display: 'flex', alignItems: 'center' }}\r\n >\r\n <div className={`${scopeClass} ${className}`} style={{ width: '100%' }}>\r\n {context.processAndRenderElements(tokens)}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default SlideDirective;\r\n","import type { DirectiveComponent } from '../types';\r\nimport AdmonitionDirective from './AdmonitionDirective';\r\nimport CardDirective from './CardDirective';\r\nimport DetailsDirective from './DetailsDirective';\r\nimport ModalDirective from './ModalDirective';\r\nimport ButtonDirective from './ButtonDirective';\r\nimport WrapperDirective from './WrapperDirective';\r\nimport SlideDirective from './SlideDirective';\r\n\r\n/**\r\n * Directive Registry — maps type strings to directive components.\r\n * All directives implement the unified DirectiveComponentProps interface.\r\n */\r\nconst directiveRegistry: Record<string, DirectiveComponent> = {\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","import React from 'react';\r\nimport type { DirectiveComponentProps, DirectiveToken, RenderContext, Token } from './types';\r\nimport directiveRegistry from './directives';\r\n\r\ninterface DirectiveRendererProps {\r\n element: DirectiveToken;\r\n context: RenderContext;\r\n index: number;\r\n allElements: Token[];\r\n}\r\n\r\n/**\r\n * DirectiveRenderer — looks up a directive type in the registry\r\n * and dispatches to the appropriate component with unified props.\r\n */\r\nconst DirectiveRenderer: React.FC<DirectiveRendererProps> = ({\r\n element,\r\n context,\r\n index,\r\n allElements,\r\n}) => {\r\n const { directiveType, props, slots, scopeId } = element;\r\n\r\n // Look up the directive component in the registry\r\n const Component = directiveRegistry[directiveType];\r\n\r\n // Convenience: render a named slot as parsed markdown\r\n const renderSlot = (name: string): React.ReactNode => {\r\n const slotContent = slots[name];\r\n if (!slotContent) return null;\r\n const parsed = context.parseMarkdown(slotContent);\r\n return context.processAndRenderElements(parsed);\r\n };\r\n\r\n const directiveProps: DirectiveComponentProps = {\r\n directiveType,\r\n props,\r\n slots,\r\n renderSlot,\r\n context,\r\n index,\r\n allElements,\r\n };\r\n\r\n if (Component) {\r\n return <Component key={index} {...directiveProps} />;\r\n }\r\n\r\n // Fallback: unknown directive → render as a div with default slot\r\n return (\r\n <div key={index} className={`my-4 p-4 rounded-2xl border border-border bg-background-primary/5`}>\r\n {renderSlot('default')}\r\n </div>\r\n );\r\n};\r\n\r\nexport default DirectiveRenderer;\r\n","import React, { useRef, useEffect } from 'react';\r\nimport { scanTailwindCDN } from './useTailwindCDN';\r\n\r\ninterface RawHtmlRendererProps {\r\n content: string;\r\n globalStyles?: string;\r\n wrapperClassName: string;\r\n}\r\n\r\n/**\r\n * Renders raw HTML content with global CSS injection.\r\n * - `globalStyles`: unscoped CSS injected into <head> (cleans up on unmount)\r\n * Forces <script> execution by replacing script nodes after mount.\r\n * Triggers a Tailwind CDN re-scan after mount so that any Tailwind classes\r\n * present in the injected HTML are resolved (works with the Play CDN loaded\r\n * by useTailwindCDN in CustomMarkdownRenderer).\r\n */\r\nconst RawHtmlRenderer: React.FC<RawHtmlRendererProps> = ({\r\n content,\r\n globalStyles,\r\n wrapperClassName,\r\n}) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Force-execute injected scripts by replacing them\r\n useEffect(() => {\r\n if (!containerRef.current) return;\r\n const scripts = containerRef.current.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 // ── Tailwind CDN re-scan ──\r\n // After the HTML is injected, trigger the CDN to pick up any new\r\n // Tailwind classes present in the dynamically-rendered content.\r\n scanTailwindCDN();\r\n }, [content]);\r\n\r\n // Inject <style global> into <head> and clean up on unmount\r\n useEffect(() => {\r\n if (!globalStyles) return;\r\n const styleEl = document.createElement('style');\r\n styleEl.setAttribute('data-global', '');\r\n styleEl.textContent = globalStyles;\r\n document.head.appendChild(styleEl);\r\n return () => {\r\n if (styleEl.parentNode) document.head.removeChild(styleEl);\r\n };\r\n }, [globalStyles]);\r\n\r\n return (\r\n <div className={wrapperClassName} ref={containerRef}>\r\n <div dangerouslySetInnerHTML={{ __html: content }} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default RawHtmlRenderer;\r\n\r\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, { createContext, useContext } from 'react';\r\nimport type { RenderContext } from './types';\r\n\r\nconst RenderCtx = createContext<RenderContext | null>(null);\r\n\r\nexport const RenderContextProvider = RenderCtx.Provider;\r\n\r\nexport function useRenderContext(): RenderContext {\r\n const ctx = useContext(RenderCtx);\r\n if (!ctx) {\r\n throw new Error('useRenderContext must be used within a RenderContextProvider');\r\n }\r\n return ctx;\r\n}\r\n"],"mappings":"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","names":["React","useRef","useState","t","React","useState","useEffect","useCallback","useId","useRef","markdown","text","classes","id","useState","useState","jsx","jsxs","match","jsx","React","jsx","jsxs","React","jsx","useId","jsx","jsxs","useId","React","jsx","jsxs","React","jsx","useState","useEffect","useRef","jsx","jsxs","useState","useRef","useEffect","jsx","useRef","useEffect","useEffect","useRef","jsx","useRef","useEffect","jsx","jsxs","useState","useId","useRef","useEffect","useCallback","React","jsx","jsxs","t","useRef","useState","React"]}
|