@particle-academy/fancy-code 0.12.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/CodeEditor/CodeEditor.context.ts","../src/components/CodeEditor/diff-gutter.ts","../src/components/CodeEditor/CodeEditorPanel.tsx","../src/components/CodeEditor/CodeEditorToolbarSeparator.tsx","../src/languages/registry.ts","../src/engine/tokenizers/javascript.ts","../src/engine/tokenizers/php.ts","../src/engine/tokenizers/python.ts","../src/engine/tokenizers/go.ts","../src/engine/tokenizers/markdown.ts","../src/languages/builtin.ts","../src/components/CodeEditor/CodeEditorToolbar.tsx","../src/components/CodeEditor/CodeEditorStatusBar.tsx","../src/themes/registry.ts","../src/themes/light.ts","../src/themes/dark.ts","../src/engine/position.ts","../src/hooks/use-editor-engine.ts","../src/hooks/use-dark-mode.ts","../src/components/CodeEditor/CodeEditor.tsx","../src/components/MarkdownEditor/MarkdownEditor.tsx","../src/file-type.ts","../src/components/FileViewer/FileViewer.tsx","../src/engine/markdown-render.ts","../src/input-tag.tsx"],"names":["themeColors","lineCount","activeLine","jsx","KEYWORDS","TYPES","jsxs","cn","Fragment","useState","useMemo","useCallback","useRef","useEffect","useControllableState"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { CodeEditorContextValue } from \"./CodeEditor.types\";\n\nexport const CodeEditorContext = createContext<CodeEditorContextValue | null>(null);\n\nexport function useCodeEditor(): CodeEditorContextValue {\n const ctx = useContext(CodeEditorContext);\n if (!ctx) {\n throw new Error(\"useCodeEditor must be used within a <CodeEditor> component\");\n }\n return ctx;\n}\n","/**\n * Diff-gutter model — the pure mapping between fancy-file-commons line\n * annotations and what the CodeEditor gutter renders per line-number row.\n * Kept DOM-free (like engine/position.ts) so it's unit-testable; the panel\n * only paints what this resolves.\n */\nimport type { DiffAnnotations, LineChangeType } from \"@particle-academy/fancy-file-commons\";\nimport type { ThemeColors } from \"../../themes/types\";\n\n/** What one line-number row shows: its own change bar and/or a deletion wedge above. */\nexport interface GutterDiffMark {\n /** The line's own change (colored bar), if any. */\n type?: LineChangeType;\n /** True when one or more lines were deleted immediately above this line (wedge). */\n deletedAbove: boolean;\n}\n\n/** Resolve the mark for a 1-based line, or null when the line is untouched. */\nexport function gutterDiffMark(\n annotations: DiffAnnotations | null,\n line: number,\n): GutterDiffMark | null {\n if (!annotations) return null;\n const a = annotations.byLine[line];\n if (!a) return null;\n return { type: a.type, deletedAbove: (a.deletedAbove ?? 0) > 0 };\n}\n\n/** Whether the deleted-at-EOF wedge should render under the last line. */\nexport function hasDeletedAtEnd(annotations: DiffAnnotations | null): boolean {\n return (annotations?.deletedAtEnd ?? 0) > 0;\n}\n\n/** VS Code-convention fallbacks for themes that don't define diff colors. */\nconst FALLBACK = { added: \"#3fb950\", modified: \"#4184e4\", removed: \"#f85149\" } as const;\n\n/** The bar color for a change type, honoring theme overrides. */\nexport function diffMarkColor(type: LineChangeType, colors: ThemeColors): string {\n return type === \"added\"\n ? (colors.diffAdded ?? FALLBACK.added)\n : (colors.diffModified ?? FALLBACK.modified);\n}\n\n/** The deletion-wedge color, honoring theme overrides. */\nexport function diffRemovedColor(colors: ThemeColors): string {\n return colors.diffRemoved ?? FALLBACK.removed;\n}\n","import { useMemo } from \"react\";\nimport { cn } from \"@particle-academy/react-fancy\";\nimport { useCodeEditor } from \"./CodeEditor.context\";\nimport {\n diffMarkColor,\n diffRemovedColor,\n gutterDiffMark,\n hasDeletedAtEnd,\n} from \"./diff-gutter\";\nimport type { CodeEditorPanelProps } from \"./CodeEditor.types\";\n\nexport function CodeEditorPanel({ className }: CodeEditorPanelProps) {\n const {\n _engineReturn: engine,\n lineNumbers,\n wordWrap,\n readOnly,\n placeholder,\n _diffAnnotations: diffAnnotations,\n _maxHeight,\n _minHeight,\n _highlightLines: highlightLines,\n } = useCodeEditor();\n\n // This `useMemo` MUST run before the `!engine` guard below it.\n //\n // The guard used to come first, so a render without an engine ran ZERO hooks\n // and the next one ran one. React compares hook counts between renders, so\n // that transition desyncs the hook order and throws from deep inside React,\n // naming none of this code. `_engineReturn` is typed `| null` and starts null,\n // so the transition is real rather than theoretical.\n //\n // Reading the engine's fields inside the callback (rather than destructuring\n // above) is what lets the hook run unconditionally.\n const lineNumberElements = useMemo(() => {\n if (!engine || !lineNumbers) return null;\n const { themeColors, lineCount, activeLine } = engine;\n const removed = diffRemovedColor(themeColors);\n const highlighted = new Set(highlightLines ?? []);\n const lines = [];\n for (let i = 1; i <= lineCount; i++) {\n const mark = gutterDiffMark(diffAnnotations, i);\n lines.push(\n <div\n key={i}\n data-diff={mark?.type}\n data-diff-deleted-above={mark?.deletedAbove ? \"\" : undefined}\n style={{\n position: \"relative\",\n color: i === activeLine || highlighted.has(i) ? themeColors.foreground : themeColors.gutterForeground,\n backgroundColor: i === activeLine ? themeColors.activeLineBackground : undefined,\n fontWeight: highlighted.has(i) ? 600 : undefined,\n }}\n className=\"pr-3 text-right text-[13px] leading-[1.5] select-none\"\n >\n {/* Change bar — VS Code convention: green added, blue modified. */}\n {mark?.type && (\n <span\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n width: 3,\n borderRadius: 2,\n backgroundColor: diffMarkColor(mark.type, themeColors),\n }}\n />\n )}\n {/* Deletion wedge — lines were removed immediately above this one. */}\n {mark?.deletedAbove && (\n <span\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n left: 0,\n top: -4,\n width: 0,\n height: 0,\n borderLeft: `8px solid ${removed}`,\n borderTop: \"4px solid transparent\",\n borderBottom: \"4px solid transparent\",\n }}\n />\n )}\n {i}\n {/* Deletion at EOF — removed lines hang below the last line. */}\n {i === lineCount && hasDeletedAtEnd(diffAnnotations) && (\n <span\n aria-hidden=\"true\"\n data-diff-deleted-at-end=\"\"\n style={{\n position: \"absolute\",\n left: 0,\n bottom: -4,\n width: 0,\n height: 0,\n borderLeft: `8px solid ${removed}`,\n borderTop: \"4px solid transparent\",\n borderBottom: \"4px solid transparent\",\n }}\n />\n )}\n </div>,\n );\n }\n return lines;\n }, [engine, lineNumbers, diffAnnotations, highlightLines]);\n\n // Every hook is above this line.\n if (!engine) return null;\n\n const {\n textareaRef,\n highlightedHtml,\n lineCount,\n activeLine,\n themeColors,\n handleKeyDown,\n handleInput,\n handleScroll,\n handleSelect,\n scrollTop,\n scrollLeft,\n } = engine;\n\n const gutterWidth = lineNumbers ? `${Math.max(String(lineCount).length, 2) * 0.75 + 1.5}em` : \"0\";\n\n const containerStyle: React.CSSProperties = {\n backgroundColor: themeColors.background,\n color: themeColors.foreground,\n minHeight: _minHeight,\n maxHeight: _maxHeight,\n };\n\n const isEmpty = textareaRef.current ? textareaRef.current.value.length === 0 : highlightedHtml.length === 0;\n\n return (\n <div\n data-fancy-code-panel=\"\"\n className={cn(\"relative overflow-auto\", className)}\n style={containerStyle}\n >\n <div className=\"flex min-h-full\">\n {/* Line numbers gutter */}\n {lineNumbers && (\n <div\n className=\"sticky left-0 z-10 shrink-0 pt-2.5 pb-2.5 pl-2\"\n style={{\n backgroundColor: themeColors.gutterBackground,\n borderRight: `1px solid ${themeColors.gutterBorder}`,\n width: gutterWidth,\n }}\n >\n {lineNumberElements}\n </div>\n )}\n\n {/* Editor area */}\n <div className={cn(\"relative flex-1\", wordWrap && \"min-w-0\")}>\n {/*\n Line bands — \"here is the line you were sent to\". Behind the code, and\n placed in em so they track the 13px / 1.5 line grid the gutter uses;\n 0.625rem is the editor's top padding (p-2.5).\n */}\n {(highlightLines ?? [])\n .filter((n) => Number.isInteger(n) && n >= 1 && n <= lineCount)\n .map((n) => (\n <div\n key={`highlight-${n}`}\n data-fancy-code-highlight-line={n}\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-x-0 text-[13px] leading-[1.5]\"\n style={{\n top: `calc(0.625rem + ${(n - 1) * 1.5}em)`,\n height: \"1.5em\",\n backgroundColor: themeColors.selectionBackground,\n opacity: 0.55,\n }}\n />\n ))}\n\n {/* Highlighted code overlay */}\n <pre\n className=\"pointer-events-none absolute inset-0 m-0 overflow-hidden border-none p-2.5 text-[13px] leading-[1.5]\"\n aria-hidden=\"true\"\n style={{\n whiteSpace: wordWrap ? \"pre-wrap\" : \"pre\",\n overflowWrap: wordWrap ? \"break-word\" : \"normal\",\n }}\n >\n <code dangerouslySetInnerHTML={{ __html: highlightedHtml + \"\\n\" }} />\n </pre>\n\n {/* Placeholder */}\n {placeholder && isEmpty && (\n <div\n className=\"pointer-events-none absolute left-0 top-0 p-2.5 text-[13px] leading-[1.5] opacity-40\"\n style={{ color: themeColors.foreground }}\n >\n {placeholder}\n </div>\n )}\n\n {/* Actual textarea for input */}\n <textarea\n ref={textareaRef}\n className={cn(\n \"relative m-0 block resize-none border-none bg-transparent p-2.5 text-[13px] leading-[1.5] text-transparent outline-none\",\n wordWrap ? \"w-full\" : \"min-w-full\",\n )}\n style={{\n caretColor: themeColors.cursorColor,\n minHeight: _minHeight ? _minHeight - 40 : 80,\n overflow: \"hidden\",\n whiteSpace: wordWrap ? \"pre-wrap\" : \"pre\",\n overflowWrap: wordWrap ? \"break-word\" : \"normal\",\n }}\n spellCheck={false}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n readOnly={readOnly}\n onKeyDown={handleKeyDown}\n onInput={handleInput}\n onScroll={handleScroll}\n onSelect={handleSelect}\n onClick={handleSelect}\n />\n </div>\n </div>\n </div>\n );\n}\n\nCodeEditorPanel.displayName = \"CodeEditorPanel\";\n","export function CodeEditorToolbarSeparator() {\n return (\n <div\n data-fancy-code-toolbar-separator=\"\"\n className=\"mx-1 h-4 w-px bg-zinc-200 dark:bg-zinc-700\"\n />\n );\n}\n\nCodeEditorToolbarSeparator.displayName = \"CodeEditorToolbarSeparator\";\n","import type { LanguageDefinition } from \"./types\";\n\nconst languageRegistry = new Map<string, LanguageDefinition>();\n\nexport function registerLanguage(def: LanguageDefinition): void {\n languageRegistry.set(def.name.toLowerCase(), def);\n if (def.aliases) {\n for (const alias of def.aliases) {\n languageRegistry.set(alias.toLowerCase(), def);\n }\n }\n}\n\nexport function getLanguage(name: string): LanguageDefinition | undefined {\n return languageRegistry.get(name.toLowerCase());\n}\n\nexport function getRegisteredLanguages(): string[] {\n const seen = new Set<LanguageDefinition>();\n const names: string[] = [];\n for (const [, def] of languageRegistry) {\n if (!seen.has(def)) {\n seen.add(def);\n names.push(def.name);\n }\n }\n return names;\n}\n","import type { Token, Tokenizer } from \"../tokenizer\";\n\nconst KEYWORDS = new Set([\n \"abstract\", \"arguments\", \"as\", \"async\", \"await\", \"boolean\", \"break\", \"byte\",\n \"case\", \"catch\", \"char\", \"class\", \"const\", \"continue\", \"debugger\", \"default\",\n \"delete\", \"do\", \"double\", \"else\", \"enum\", \"export\", \"extends\", \"false\",\n \"final\", \"finally\", \"float\", \"for\", \"from\", \"function\", \"get\", \"goto\", \"if\",\n \"implements\", \"import\", \"in\", \"instanceof\", \"int\", \"interface\", \"keyof\", \"let\",\n \"long\", \"native\", \"new\", \"null\", \"of\", \"package\", \"private\", \"protected\",\n \"public\", \"readonly\", \"return\", \"set\", \"short\", \"static\", \"super\", \"switch\",\n \"synchronized\", \"this\", \"throw\", \"throws\", \"transient\", \"true\", \"try\",\n \"type\", \"typeof\", \"undefined\", \"var\", \"void\", \"volatile\", \"while\", \"with\",\n \"yield\",\n]);\n\nconst TYPE_KEYWORDS = new Set([\n \"string\", \"number\", \"boolean\", \"any\", \"void\", \"never\", \"unknown\", \"object\",\n \"symbol\", \"bigint\", \"undefined\", \"null\",\n]);\n\nexport const tokenizeJavaScript: Tokenizer = (source: string): Token[] => {\n const tokens: Token[] = [];\n const len = source.length;\n let i = 0;\n\n while (i < len) {\n const ch = source[i];\n\n // Whitespace — skip\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\") {\n i++;\n continue;\n }\n\n // Single-line comment\n if (ch === \"/\" && source[i + 1] === \"/\") {\n const pos = i;\n i += 2;\n while (i < len && source[i] !== \"\\n\") i++;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Multi-line comment\n if (ch === \"/\" && source[i + 1] === \"*\") {\n const pos = i;\n i += 2;\n while (i < len && !(source[i] === \"*\" && source[i + 1] === \"/\")) i++;\n i += 2;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Template literal\n if (ch === \"`\") {\n const pos = i;\n i++;\n while (i < len && source[i] !== \"`\") {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n i++; // closing backtick\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // String (single or double quote)\n if (ch === '\"' || ch === \"'\") {\n const pos = i;\n const quote = ch;\n i++;\n while (i < len && source[i] !== quote) {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n i++; // closing quote\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Number\n if ((ch >= \"0\" && ch <= \"9\") || (ch === \".\" && source[i + 1] >= \"0\" && source[i + 1] <= \"9\")) {\n const pos = i;\n if (ch === \"0\" && (source[i + 1] === \"x\" || source[i + 1] === \"X\")) {\n i += 2;\n while (i < len && /[0-9a-fA-F_]/.test(source[i])) i++;\n } else if (ch === \"0\" && (source[i + 1] === \"b\" || source[i + 1] === \"B\")) {\n i += 2;\n while (i < len && /[01_]/.test(source[i])) i++;\n } else {\n while (i < len && /[0-9_.]/.test(source[i])) i++;\n if (i < len && (source[i] === \"e\" || source[i] === \"E\")) {\n i++;\n if (i < len && (source[i] === \"+\" || source[i] === \"-\")) i++;\n while (i < len && source[i] >= \"0\" && source[i] <= \"9\") i++;\n }\n }\n if (i < len && source[i] === \"n\") i++; // BigInt\n tokens.push({ type: \"number\", start: pos, end: i });\n continue;\n }\n\n // Identifier or keyword\n if (/[a-zA-Z_$]/.test(ch)) {\n const pos = i;\n i++;\n while (i < len && /[a-zA-Z0-9_$]/.test(source[i])) i++;\n const word = source.slice(pos, i);\n\n // Check if it's a function call (followed by parenthesis)\n let j = i;\n while (j < len && (source[j] === \" \" || source[j] === \"\\t\")) j++;\n\n if (TYPE_KEYWORDS.has(word)) {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else if (KEYWORDS.has(word)) {\n tokens.push({ type: \"keyword\", start: pos, end: i });\n } else if (source[j] === \"(\") {\n tokens.push({ type: \"function\", start: pos, end: i });\n } else if (word[0] >= \"A\" && word[0] <= \"Z\") {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else {\n tokens.push({ type: \"variable\", start: pos, end: i });\n }\n continue;\n }\n\n // Operators\n if (\"+-*/%=<>!&|^~?:\".includes(ch)) {\n const pos = i;\n i++;\n // Consume multi-char operators (===, !==, =>, &&, ||, ??, etc.)\n while (i < len && \"+-*/%=<>!&|^~?:\".includes(source[i])) i++;\n tokens.push({ type: \"operator\", start: pos, end: i });\n continue;\n }\n\n // Punctuation\n if (\"(){}[];,.@#\".includes(ch)) {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n continue;\n }\n\n // Anything else\n tokens.push({ type: \"plain\", start: i, end: i + 1 });\n i++;\n }\n\n return tokens;\n};\n","import type { Token, Tokenizer } from \"../tokenizer\";\nimport { tokenizeHtml } from \"./html\";\n\nconst PHP_KEYWORDS = new Set([\n \"abstract\", \"and\", \"array\", \"as\", \"break\", \"callable\", \"case\", \"catch\",\n \"class\", \"clone\", \"const\", \"continue\", \"declare\", \"default\", \"do\", \"echo\",\n \"else\", \"elseif\", \"empty\", \"enddeclare\", \"endfor\", \"endforeach\", \"endif\",\n \"endswitch\", \"endwhile\", \"enum\", \"eval\", \"exit\", \"extends\", \"false\", \"final\",\n \"finally\", \"fn\", \"for\", \"foreach\", \"function\", \"global\", \"goto\", \"if\",\n \"implements\", \"include\", \"include_once\", \"instanceof\", \"insteadof\",\n \"interface\", \"isset\", \"list\", \"match\", \"namespace\", \"new\", \"null\", \"or\",\n \"print\", \"private\", \"protected\", \"public\", \"readonly\", \"require\",\n \"require_once\", \"return\", \"self\", \"static\", \"switch\", \"throw\", \"trait\",\n \"true\", \"try\", \"unset\", \"use\", \"var\", \"while\", \"xor\", \"yield\",\n]);\n\nfunction tokenizePhpBlock(source: string, offset: number): { tokens: Token[]; end: number } {\n const tokens: Token[] = [];\n const len = source.length;\n let i = offset;\n\n while (i < len) {\n const ch = source[i];\n\n // End of PHP block\n if (ch === \"?\" && source[i + 1] === \">\") {\n return { tokens, end: i };\n }\n\n // Whitespace\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\") {\n i++;\n continue;\n }\n\n // Single-line comment (// or #)\n if ((ch === \"/\" && source[i + 1] === \"/\") || ch === \"#\") {\n const pos = i;\n while (i < len && source[i] !== \"\\n\") i++;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Multi-line comment\n if (ch === \"/\" && source[i + 1] === \"*\") {\n const pos = i;\n i += 2;\n while (i < len && !(source[i] === \"*\" && source[i + 1] === \"/\")) i++;\n i += 2;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Variable ($name)\n if (ch === \"$\") {\n const pos = i;\n i++;\n while (i < len && /[a-zA-Z0-9_]/.test(source[i])) i++;\n tokens.push({ type: \"variable\", start: pos, end: i });\n continue;\n }\n\n // String (single or double quote)\n if (ch === '\"' || ch === \"'\") {\n const pos = i;\n const quote = ch;\n i++;\n while (i < len && source[i] !== quote) {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n i++;\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Number\n if (ch >= \"0\" && ch <= \"9\") {\n const pos = i;\n while (i < len && /[0-9_.]/.test(source[i])) i++;\n if (i < len && (source[i] === \"e\" || source[i] === \"E\")) {\n i++;\n if (i < len && (source[i] === \"+\" || source[i] === \"-\")) i++;\n while (i < len && source[i] >= \"0\" && source[i] <= \"9\") i++;\n }\n tokens.push({ type: \"number\", start: pos, end: i });\n continue;\n }\n\n // Identifier or keyword\n if (/[a-zA-Z_]/.test(ch)) {\n const pos = i;\n i++;\n while (i < len && /[a-zA-Z0-9_]/.test(source[i])) i++;\n const word = source.slice(pos, i);\n\n let j = i;\n while (j < len && (source[j] === \" \" || source[j] === \"\\t\")) j++;\n\n if (PHP_KEYWORDS.has(word.toLowerCase())) {\n tokens.push({ type: \"keyword\", start: pos, end: i });\n } else if (source[j] === \"(\") {\n tokens.push({ type: \"function\", start: pos, end: i });\n } else if (word[0] >= \"A\" && word[0] <= \"Z\") {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else {\n tokens.push({ type: \"variable\", start: pos, end: i });\n }\n continue;\n }\n\n // Operators\n if (\"+-*/%=<>!&|^~?:.\".includes(ch)) {\n const pos = i;\n i++;\n while (i < len && \"+-*/%=<>!&|^~?:.\".includes(source[i])) i++;\n tokens.push({ type: \"operator\", start: pos, end: i });\n continue;\n }\n\n // Punctuation\n if (\"(){}[];,@\\\\\".includes(ch)) {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n continue;\n }\n\n tokens.push({ type: \"plain\", start: i, end: i + 1 });\n i++;\n }\n\n return { tokens, end: i };\n}\n\nexport const tokenizePhp: Tokenizer = (source: string): Token[] => {\n const tokens: Token[] = [];\n const len = source.length;\n let i = 0;\n let htmlChunkStart = 0;\n\n while (i < len) {\n // Detect PHP open tag\n if (source[i] === \"<\" && source[i + 1] === \"?\") {\n // Tokenize any HTML before this PHP block\n if (i > htmlChunkStart) {\n const htmlChunk = source.slice(htmlChunkStart, i);\n const htmlTokens = tokenizeHtml(htmlChunk);\n for (const t of htmlTokens) {\n tokens.push({ type: t.type, start: t.start + htmlChunkStart, end: t.end + htmlChunkStart });\n }\n }\n\n // PHP open tag\n const tagStart = i;\n i += 2;\n // Skip \"php\" or \"=\"\n if (i < len && source.slice(i, i + 3).toLowerCase() === \"php\") {\n i += 3;\n } else if (i < len && source[i] === \"=\") {\n i++;\n }\n tokens.push({ type: \"keyword\", start: tagStart, end: i });\n\n // Tokenize PHP content\n const result = tokenizePhpBlock(source, i);\n tokens.push(...result.tokens);\n i = result.end;\n\n // PHP close tag\n if (i < len && source[i] === \"?\" && source[i + 1] === \">\") {\n tokens.push({ type: \"keyword\", start: i, end: i + 2 });\n i += 2;\n }\n\n htmlChunkStart = i;\n continue;\n }\n\n i++;\n }\n\n // Remaining HTML after last PHP block\n if (htmlChunkStart < len) {\n const htmlChunk = source.slice(htmlChunkStart);\n const htmlTokens = tokenizeHtml(htmlChunk);\n for (const t of htmlTokens) {\n tokens.push({ type: t.type, start: t.start + htmlChunkStart, end: t.end + htmlChunkStart });\n }\n }\n\n return tokens;\n};\n","import type { Token, Tokenizer } from \"../tokenizer\";\n\nconst KEYWORDS = new Set([\n \"and\", \"as\", \"assert\", \"async\", \"await\", \"break\", \"class\", \"continue\",\n \"def\", \"del\", \"elif\", \"else\", \"except\", \"finally\", \"for\", \"from\",\n \"global\", \"if\", \"import\", \"in\", \"is\", \"lambda\", \"nonlocal\", \"not\",\n \"or\", \"pass\", \"raise\", \"return\", \"try\", \"while\", \"with\", \"yield\",\n \"True\", \"False\", \"None\",\n]);\n\nconst TYPES = new Set([\n \"int\", \"str\", \"float\", \"bool\", \"list\", \"dict\", \"tuple\", \"set\",\n \"bytes\", \"bytearray\", \"memoryview\", \"range\", \"frozenset\",\n \"complex\", \"type\", \"object\", \"property\", \"classmethod\", \"staticmethod\",\n \"Any\", \"Optional\", \"Union\", \"Callable\", \"List\", \"Dict\", \"Tuple\", \"Set\",\n \"Sequence\", \"Mapping\", \"Iterator\", \"Generator\", \"Coroutine\",\n]);\n\nexport const tokenizePython: Tokenizer = (source: string): Token[] => {\n const tokens: Token[] = [];\n const len = source.length;\n let i = 0;\n\n while (i < len) {\n const ch = source[i];\n\n // Whitespace\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\") {\n i++;\n continue;\n }\n\n // Comment\n if (ch === \"#\") {\n const pos = i;\n i++;\n while (i < len && source[i] !== \"\\n\") i++;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Decorator\n if (ch === \"@\" && i + 1 < len && /[a-zA-Z_]/.test(source[i + 1])) {\n const pos = i;\n i++;\n while (i < len && /[a-zA-Z0-9_.]/.test(source[i])) i++;\n tokens.push({ type: \"keyword\", start: pos, end: i });\n continue;\n }\n\n // String (check for prefix + triple or single quote)\n if (\n ch === '\"' || ch === \"'\" ||\n ((ch === \"f\" || ch === \"r\" || ch === \"b\" || ch === \"F\" || ch === \"R\" || ch === \"B\") &&\n (source[i + 1] === '\"' || source[i + 1] === \"'\"))\n ) {\n const pos = i;\n // Skip prefix\n if (ch !== '\"' && ch !== \"'\") i++;\n\n const quote = source[i];\n\n // Triple-quoted string\n if (source[i + 1] === quote && source[i + 2] === quote) {\n const triple = quote + quote + quote;\n i += 3;\n while (i < len && source.slice(i, i + 3) !== triple) {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n i += 3;\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Single-line string\n i++;\n while (i < len && source[i] !== quote && source[i] !== \"\\n\") {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n if (i < len && source[i] === quote) i++;\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Number\n if ((ch >= \"0\" && ch <= \"9\") || (ch === \".\" && i + 1 < len && source[i + 1] >= \"0\" && source[i + 1] <= \"9\")) {\n const pos = i;\n if (ch === \"0\" && (source[i + 1] === \"x\" || source[i + 1] === \"X\")) {\n i += 2;\n while (i < len && /[0-9a-fA-F_]/.test(source[i])) i++;\n } else if (ch === \"0\" && (source[i + 1] === \"b\" || source[i + 1] === \"B\")) {\n i += 2;\n while (i < len && /[01_]/.test(source[i])) i++;\n } else if (ch === \"0\" && (source[i + 1] === \"o\" || source[i + 1] === \"O\")) {\n i += 2;\n while (i < len && /[0-7_]/.test(source[i])) i++;\n } else {\n while (i < len && /[0-9_.]/.test(source[i])) i++;\n if (i < len && (source[i] === \"e\" || source[i] === \"E\")) {\n i++;\n if (i < len && (source[i] === \"+\" || source[i] === \"-\")) i++;\n while (i < len && source[i] >= \"0\" && source[i] <= \"9\") i++;\n }\n }\n if (i < len && source[i] === \"j\") i++; // complex\n tokens.push({ type: \"number\", start: pos, end: i });\n continue;\n }\n\n // Identifier or keyword\n if (/[a-zA-Z_]/.test(ch)) {\n const pos = i;\n i++;\n while (i < len && /[a-zA-Z0-9_]/.test(source[i])) i++;\n const word = source.slice(pos, i);\n\n let j = i;\n while (j < len && (source[j] === \" \" || source[j] === \"\\t\")) j++;\n\n if (KEYWORDS.has(word)) {\n tokens.push({ type: \"keyword\", start: pos, end: i });\n } else if (TYPES.has(word)) {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else if (source[j] === \"(\") {\n tokens.push({ type: \"function\", start: pos, end: i });\n } else if (word[0] >= \"A\" && word[0] <= \"Z\") {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else {\n tokens.push({ type: \"variable\", start: pos, end: i });\n }\n continue;\n }\n\n // Operators\n if (\"+-*/%=<>!&|^~:@\".includes(ch)) {\n const pos = i;\n i++;\n while (i < len && \"+-*/%=<>!&|^~:\".includes(source[i])) i++;\n tokens.push({ type: \"operator\", start: pos, end: i });\n continue;\n }\n\n // Punctuation\n if (\"()[]{},.;\\\\\".includes(ch)) {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n continue;\n }\n\n tokens.push({ type: \"plain\", start: i, end: i + 1 });\n i++;\n }\n\n return tokens;\n};\n","import type { Token, Tokenizer } from \"../tokenizer\";\n\nconst KEYWORDS = new Set([\n \"break\", \"case\", \"chan\", \"const\", \"continue\", \"default\", \"defer\",\n \"else\", \"fallthrough\", \"for\", \"func\", \"go\", \"goto\", \"if\", \"import\",\n \"interface\", \"map\", \"package\", \"range\", \"return\", \"select\", \"struct\",\n \"switch\", \"type\", \"var\", \"nil\", \"true\", \"false\", \"iota\",\n]);\n\nconst TYPES = new Set([\n \"bool\", \"byte\", \"complex64\", \"complex128\", \"error\", \"float32\", \"float64\",\n \"int\", \"int8\", \"int16\", \"int32\", \"int64\", \"rune\", \"string\",\n \"uint\", \"uint8\", \"uint16\", \"uint32\", \"uint64\", \"uintptr\", \"any\",\n]);\n\nconst BUILTINS = new Set([\n \"make\", \"len\", \"cap\", \"new\", \"append\", \"copy\", \"close\", \"delete\",\n \"complex\", \"real\", \"imag\", \"panic\", \"recover\", \"print\", \"println\",\n]);\n\nexport const tokenizeGo: Tokenizer = (source: string): Token[] => {\n const tokens: Token[] = [];\n const len = source.length;\n let i = 0;\n\n while (i < len) {\n const ch = source[i];\n\n // Whitespace\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\") {\n i++;\n continue;\n }\n\n // Single-line comment\n if (ch === \"/\" && source[i + 1] === \"/\") {\n const pos = i;\n i += 2;\n while (i < len && source[i] !== \"\\n\") i++;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Block comment\n if (ch === \"/\" && source[i + 1] === \"*\") {\n const pos = i;\n i += 2;\n while (i < len && !(source[i] === \"*\" && source[i + 1] === \"/\")) i++;\n i += 2;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Raw string literal (backtick)\n if (ch === \"`\") {\n const pos = i;\n i++;\n while (i < len && source[i] !== \"`\") i++;\n i++;\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Interpreted string\n if (ch === '\"') {\n const pos = i;\n i++;\n while (i < len && source[i] !== '\"' && source[i] !== \"\\n\") {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n if (i < len && source[i] === '\"') i++;\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Rune literal\n if (ch === \"'\") {\n const pos = i;\n i++;\n while (i < len && source[i] !== \"'\" && source[i] !== \"\\n\") {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n if (i < len && source[i] === \"'\") i++;\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Number\n if ((ch >= \"0\" && ch <= \"9\") || (ch === \".\" && i + 1 < len && source[i + 1] >= \"0\" && source[i + 1] <= \"9\")) {\n const pos = i;\n if (ch === \"0\" && (source[i + 1] === \"x\" || source[i + 1] === \"X\")) {\n i += 2;\n while (i < len && /[0-9a-fA-F_]/.test(source[i])) i++;\n } else if (ch === \"0\" && (source[i + 1] === \"b\" || source[i + 1] === \"B\")) {\n i += 2;\n while (i < len && /[01_]/.test(source[i])) i++;\n } else if (ch === \"0\" && (source[i + 1] === \"o\" || source[i + 1] === \"O\")) {\n i += 2;\n while (i < len && /[0-7_]/.test(source[i])) i++;\n } else {\n while (i < len && /[0-9_.]/.test(source[i])) i++;\n if (i < len && (source[i] === \"e\" || source[i] === \"E\")) {\n i++;\n if (i < len && (source[i] === \"+\" || source[i] === \"-\")) i++;\n while (i < len && source[i] >= \"0\" && source[i] <= \"9\") i++;\n }\n }\n if (i < len && source[i] === \"i\") i++; // imaginary\n tokens.push({ type: \"number\", start: pos, end: i });\n continue;\n }\n\n // Identifier or keyword\n if (/[a-zA-Z_]/.test(ch)) {\n const pos = i;\n i++;\n while (i < len && /[a-zA-Z0-9_]/.test(source[i])) i++;\n const word = source.slice(pos, i);\n\n let j = i;\n while (j < len && (source[j] === \" \" || source[j] === \"\\t\")) j++;\n\n if (KEYWORDS.has(word)) {\n tokens.push({ type: \"keyword\", start: pos, end: i });\n } else if (TYPES.has(word)) {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else if (BUILTINS.has(word) && source[j] === \"(\") {\n tokens.push({ type: \"function\", start: pos, end: i });\n } else if (source[j] === \"(\") {\n tokens.push({ type: \"function\", start: pos, end: i });\n } else if (word[0] >= \"A\" && word[0] <= \"Z\") {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else {\n tokens.push({ type: \"variable\", start: pos, end: i });\n }\n continue;\n }\n\n // Operators\n if (\"+-*/%=<>!&|^~:\".includes(ch)) {\n const pos = i;\n i++;\n while (i < len && \"+-*/%=<>!&|^~:\".includes(source[i])) i++;\n tokens.push({ type: \"operator\", start: pos, end: i });\n continue;\n }\n\n // Punctuation\n if (\"(){}[];,.\".includes(ch)) {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n continue;\n }\n\n tokens.push({ type: \"plain\", start: i, end: i + 1 });\n i++;\n }\n\n return tokens;\n};\n","import { tok, type Token, type TokenType } from \"../tokenizer\";\n\n/**\n * Minimal, dependency-free Markdown tokenizer for editor highlighting. Line-based\n * for block constructs (fences, headings, blockquotes, list markers) plus a few\n * safe, non-overlapping inline spans (code, bold/italic, links). Good enough to\n * read structure at a glance — not a full CommonMark parse.\n */\nexport function tokenizeMarkdown(source: string): Token[] {\n const tokens: Token[] = [];\n const lines = source.split(\"\\n\");\n let offset = 0;\n let inFence = false;\n\n for (const line of lines) {\n const base = offset;\n const len = line.length;\n offset += len + 1; // +1 for the consumed \"\\n\"\n\n // Fenced code blocks — the fence line + everything inside is one string span.\n if (/^\\s*(```|~~~)/.test(line)) {\n tokens.push(tok(\"string\", base, base + len));\n inFence = !inFence;\n continue;\n }\n if (inFence) {\n tokens.push(tok(\"string\", base, base + len));\n continue;\n }\n\n // ATX heading — whole line.\n if (/^#{1,6}\\s/.test(line)) {\n tokens.push(tok(\"keyword\", base, base + len));\n continue;\n }\n\n // Blockquote — whole line.\n if (/^\\s*>/.test(line)) {\n tokens.push(tok(\"comment\", base, base + len));\n continue;\n }\n\n // List / task marker.\n const list = line.match(/^(\\s*)([-*+]|\\d+\\.)\\s/);\n if (list) {\n const start = base + list[1].length;\n tokens.push(tok(\"operator\", start, start + list[2].length));\n }\n\n pushInline(line, base, tokens);\n }\n\n return tokens;\n}\n\n/** Collect non-overlapping inline spans (code, emphasis, links) in one line. */\nfunction pushInline(line: string, base: number, out: Token[]): void {\n // Cosmetic highlighting only. The inline patterns below necessarily\n // backtrack, so skip pathologically long lines — this bounds total work to\n // O(n) across the document and prevents superlinear (ReDoS) blow-up on\n // adversarial input. Normal markdown lines are far below this threshold.\n if (line.length > 5000) return;\n\n const spans: Token[] = [];\n const add = (type: TokenType, start: number, end: number) => {\n spans.push(tok(type, base + start, base + end));\n };\n\n let m: RegExpExecArray | null;\n\n // Inline code `...`\n const code = /`[^`]+`/g;\n while ((m = code.exec(line))) add(\"string\", m.index, m.index + m[0].length);\n\n // Bold/italic **...** *...* __...__ _..._\n const emph = /(\\*\\*|__)(?=\\S)([\\s\\S]*?\\S)\\1|(\\*|_)(?=\\S)([\\s\\S]*?\\S)\\3/g;\n while ((m = emph.exec(line))) add(\"type\", m.index, m.index + m[0].length);\n\n // Links / images [text](url)\n const link = /!?\\[[^\\]]*\\]\\(([^)]+)\\)/g;\n while ((m = link.exec(line))) {\n add(\"tag\", m.index, m.index + m[0].length - m[1].length - 1);\n const urlStart = m.index + m[0].length - m[1].length - 1;\n add(\"attributeValue\", urlStart, urlStart + m[1].length);\n }\n\n // Order + drop overlaps (longest/earliest wins) so the renderer gets a clean list.\n spans.sort((a, b) => a.start - b.start || b.end - a.end);\n let lastEnd = -1;\n for (const s of spans) {\n if (s.start >= lastEnd) {\n out.push(s);\n lastEnd = s.end;\n }\n }\n}\n","import { registerLanguage } from \"./registry\";\nimport { tokenizeJavaScript } from \"../engine/tokenizers/javascript\";\nimport { tokenizeHtml } from \"../engine/tokenizers/html\";\nimport { tokenizePhp } from \"../engine/tokenizers/php\";\nimport { tokenizePython } from \"../engine/tokenizers/python\";\nimport { tokenizeGo } from \"../engine/tokenizers/go\";\nimport { tokenizeMarkdown } from \"../engine/tokenizers/markdown\";\n\nregisterLanguage({\n name: \"Markdown\",\n aliases: [\"md\", \"markdown\", \"mkd\"],\n tokenize: tokenizeMarkdown,\n});\n\nregisterLanguage({\n name: \"JavaScript\",\n aliases: [\"js\", \"javascript\", \"jsx\"],\n tokenize: tokenizeJavaScript,\n});\n\nregisterLanguage({\n name: \"TypeScript\",\n aliases: [\"ts\", \"typescript\", \"tsx\"],\n tokenize: tokenizeJavaScript, // Same tokenizer — JS/TS syntax is identical for highlighting\n});\n\nregisterLanguage({\n name: \"HTML\",\n aliases: [\"html\", \"htm\"],\n tokenize: tokenizeHtml,\n});\n\nregisterLanguage({\n name: \"PHP\",\n aliases: [\"php\"],\n tokenize: tokenizePhp,\n});\n\nregisterLanguage({\n name: \"Python\",\n aliases: [\"py\", \"python\"],\n tokenize: tokenizePython,\n});\n\nregisterLanguage({\n name: \"Go\",\n aliases: [\"go\", \"golang\"],\n tokenize: tokenizeGo,\n});\n","import { useState } from \"react\";\nimport { cn } from \"@particle-academy/react-fancy\";\nimport { useCodeEditor } from \"./CodeEditor.context\";\nimport { CodeEditorToolbarSeparator } from \"./CodeEditorToolbarSeparator\";\nimport { getRegisteredLanguages } from \"../../languages\";\nimport type { CodeEditorToolbarProps } from \"./CodeEditor.types\";\n\nconst iconBtnClass =\n \"inline-flex items-center justify-center rounded-md p-1 text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-700 dark:text-zinc-400 dark:hover:bg-zinc-800 dark:hover:text-zinc-200\";\n\nfunction LanguageSelector() {\n const { language, setLanguage } = useCodeEditor();\n const languages = getRegisteredLanguages();\n\n return (\n <select\n value={language}\n onChange={(e) => setLanguage(e.target.value)}\n className=\"h-6 rounded border border-zinc-200 bg-transparent px-1.5 text-[11px] text-zinc-600 outline-none transition-colors hover:border-zinc-300 dark:border-zinc-700 dark:text-zinc-400 dark:hover:border-zinc-600\"\n >\n {languages.map((lang) => (\n <option key={lang} value={lang}>\n {lang}\n </option>\n ))}\n </select>\n );\n}\n\nfunction DefaultToolbarActions() {\n const { copyToClipboard, toggleWordWrap, wordWrap } = useCodeEditor();\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n await copyToClipboard();\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <>\n <LanguageSelector />\n <CodeEditorToolbarSeparator />\n <button\n type=\"button\"\n onClick={toggleWordWrap}\n title={wordWrap ? \"Disable Word Wrap\" : \"Enable Word Wrap\"}\n className={cn(iconBtnClass, wordWrap && \"text-blue-500 dark:text-blue-400\")}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <path d=\"M3 12h15a3 3 0 110 6h-4\" />\n <polyline points=\"16 16 14 18 16 20\" />\n <line x1=\"3\" y1=\"18\" x2=\"10\" y2=\"18\" />\n </svg>\n </button>\n <button type=\"button\" onClick={handleCopy} title=\"Copy to Clipboard\" className={iconBtnClass}>\n {copied ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n )}\n </button>\n </>\n );\n}\n\nexport function CodeEditorToolbar({ children, className }: CodeEditorToolbarProps) {\n const hasChildren = children != null;\n\n return (\n <div\n data-fancy-code-toolbar=\"\"\n className={cn(\n \"flex items-center gap-0.5 border-b border-zinc-200 px-2 py-1 dark:border-zinc-700\",\n className,\n )}\n >\n {hasChildren ? children : <DefaultToolbarActions />}\n </div>\n );\n}\n\nCodeEditorToolbar.displayName = \"CodeEditorToolbar\";\n","import { cn } from \"@particle-academy/react-fancy\";\nimport { useCodeEditor } from \"./CodeEditor.context\";\nimport type { CodeEditorStatusBarProps } from \"./CodeEditor.types\";\n\nexport function CodeEditorStatusBar({ children, className }: CodeEditorStatusBarProps) {\n const { cursorPosition, selectionLength, language, tabSize } = useCodeEditor();\n\n return (\n <div\n data-fancy-code-statusbar=\"\"\n className={cn(\n \"flex items-center gap-3 border-t border-zinc-200 px-3 py-1 text-[11px] text-zinc-500 dark:border-zinc-700 dark:text-zinc-400\",\n className,\n )}\n >\n {children ?? (\n <>\n <span>Ln {cursorPosition.line}, Col {cursorPosition.col}</span>\n {selectionLength > 0 && <span>{selectionLength} selected</span>}\n <span className=\"ml-auto\">{language}</span>\n <span>{tabSize} spaces</span>\n </>\n )}\n </div>\n );\n}\n\nCodeEditorStatusBar.displayName = \"CodeEditorStatusBar\";\n","import type { ThemeDefinition } from \"./types\";\n\nconst themeRegistry = new Map<string, ThemeDefinition>();\n\nexport function registerTheme(theme: ThemeDefinition): void {\n themeRegistry.set(theme.name.toLowerCase(), theme);\n}\n\nexport function getTheme(name: string): ThemeDefinition | undefined {\n return themeRegistry.get(name.toLowerCase());\n}\n\nexport function getRegisteredThemes(): string[] {\n return Array.from(themeRegistry.keys());\n}\n","import { LIGHT_COLORS } from \"@particle-academy/fancy-file-commons\";\nimport { registerTheme } from \"./registry\";\n\n// The palette lives in commons; fancy-code wraps it into a named, registrable\n// theme for its IDE's theme picker + `theme=\"auto\"` resolution.\nregisterTheme({\n name: \"light\",\n variant: \"light\",\n colors: LIGHT_COLORS,\n});\n","import { DARK_COLORS } from \"@particle-academy/fancy-file-commons\";\nimport { registerTheme } from \"./registry\";\n\n// The palette lives in commons; fancy-code wraps it into a named, registrable\n// theme for its IDE's theme picker + `theme=\"auto\"` resolution.\nregisterTheme({\n name: \"dark\",\n variant: \"dark\",\n colors: DARK_COLORS,\n});\n","/**\n * Convert a 1-based `line` / `column` into a 0-based character offset within\n * `text`. Out-of-range values clamp to the document and line bounds, so the\n * result is always a valid offset in `[0, text.length]`.\n *\n * - `line` below 1 clamps to line 1; above the last line clamps to the last line.\n * - `column` below 1 clamps to column 1; past the end of the line clamps to just\n * after the last character (so you can place the caret at the line end).\n */\nexport function lineColumnToOffset(text: string, line: number, column = 1): number {\n const lines = text.split(\"\\n\");\n const targetLine = Math.max(1, Math.min(Math.trunc(line) || 1, lines.length));\n\n let offset = 0;\n for (let i = 0; i < targetLine - 1; i++) {\n offset += lines[i].length + 1; // +1 for the consumed \"\\n\"\n }\n\n const lineText = lines[targetLine - 1] ?? \"\";\n const col = Math.max(1, Math.min(Math.trunc(column) || 1, lineText.length + 1));\n return offset + (col - 1);\n}\n","import { useEffect, useRef, useCallback, useState, useMemo, type RefObject } from \"react\";\nimport { getLanguage } from \"../languages\";\nimport { getTheme } from \"../themes\";\nimport { highlightCode } from \"../engine/highlight\";\nimport { lineColumnToOffset } from \"../engine/position\";\nimport type { ThemeColors } from \"../themes/types\";\nimport type { Tokenizer } from \"../engine/tokenizer\";\n\nexport interface UseEditorEngineOptions {\n containerRef: RefObject<HTMLDivElement | null>;\n value: string;\n onChange?: (value: string) => void;\n language: string;\n theme: string;\n readOnly: boolean;\n lineNumbers: boolean;\n wordWrap: boolean;\n tabSize: number;\n placeholder?: string;\n minHeight?: number;\n maxHeight?: number;\n onCursorChange?: (pos: { line: number; col: number; selectionLength: number }) => void;\n}\n\nexport interface UseEditorEngineReturn {\n textareaRef: RefObject<HTMLTextAreaElement | null>;\n highlightedHtml: string;\n lineCount: number;\n activeLine: number;\n themeColors: ThemeColors;\n handleKeyDown: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n handleInput: () => void;\n handleScroll: () => void;\n handleSelect: () => void;\n /**\n * Place the caret on a 1-based `line` / `column` and scroll the editor so the\n * line is centered in view. Out-of-range positions clamp to document bounds.\n */\n revealLine: (line: number, column?: number, opts?: { focus?: boolean }) => void;\n scrollTop: number;\n scrollLeft: number;\n}\n\nconst DEFAULT_COLORS: ThemeColors = {\n background: \"#18181b\",\n foreground: \"#e4e4e7\",\n gutterBackground: \"#18181b\",\n gutterForeground: \"#52525b\",\n gutterBorder: \"#27272a\",\n activeLineBackground: \"#27272a\",\n selectionBackground: \"#1e3a5f\",\n cursorColor: \"#60a5fa\",\n keyword: \"#c084fc\",\n string: \"#34d399\",\n comment: \"#71717a\",\n number: \"#fbbf24\",\n operator: \"#22d3ee\",\n function: \"#60a5fa\",\n type: \"#fbbf24\",\n tag: \"#f87171\",\n attribute: \"#fbbf24\",\n attributeValue: \"#34d399\",\n punctuation: \"#a1a1aa\",\n variable: \"#e4e4e7\",\n};\n\nexport function useEditorEngine({\n value,\n onChange,\n language,\n theme,\n readOnly,\n wordWrap,\n tabSize,\n onCursorChange,\n}: UseEditorEngineOptions): UseEditorEngineReturn {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const onChangeRef = useRef(onChange);\n const onCursorChangeRef = useRef(onCursorChange);\n onChangeRef.current = onChange;\n onCursorChangeRef.current = onCursorChange;\n\n const [scrollTop, setScrollTop] = useState(0);\n const [scrollLeft, setScrollLeft] = useState(0);\n const [activeLine, setActiveLine] = useState(1);\n\n // Resolve theme colors\n const themeColors = useMemo<ThemeColors>(() => {\n const def = getTheme(theme);\n return def?.colors ?? DEFAULT_COLORS;\n }, [theme]);\n\n // Resolve tokenizer\n const tokenizer = useMemo<Tokenizer | null>(() => {\n const def = getLanguage(language);\n return def?.tokenize ?? null;\n }, [language]);\n\n // Generate highlighted HTML\n const highlightedHtml = useMemo(() => {\n if (!tokenizer) {\n // No tokenizer — just escape HTML\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n }\n const tokens = tokenizer(value);\n return highlightCode(value, tokens, themeColors);\n }, [value, tokenizer, themeColors]);\n\n const lineCount = useMemo(() => {\n let count = 1;\n for (let i = 0; i < value.length; i++) {\n if (value[i] === \"\\n\") count++;\n }\n return count;\n }, [value]);\n\n // Auto-resize textarea to match content so caret is always visible\n const autoResize = useCallback(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n ta.style.height = \"auto\";\n ta.style.height = ta.scrollHeight + \"px\";\n\n if (!wordWrap) {\n // Shrink to 0 to measure true content width, then expand\n ta.style.width = \"0\";\n ta.style.width = ta.scrollWidth + \"px\";\n } else {\n ta.style.width = \"\";\n }\n }, [wordWrap]);\n\n // Sync textarea value and auto-resize when value changes\n useEffect(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n if (ta.value !== value) {\n const { selectionStart, selectionEnd } = ta;\n ta.value = value;\n ta.selectionStart = selectionStart;\n ta.selectionEnd = selectionEnd;\n }\n // Always resize — handles initial mount and external value changes\n autoResize();\n }, [value, autoResize]);\n\n const updateCursorInfo = useCallback(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n const pos = ta.selectionStart;\n const textBefore = ta.value.slice(0, pos);\n const line = (textBefore.match(/\\n/g) || []).length + 1;\n const lastNewline = textBefore.lastIndexOf(\"\\n\");\n const col = pos - lastNewline;\n const selLen = Math.abs(ta.selectionEnd - ta.selectionStart);\n setActiveLine(line);\n onCursorChangeRef.current?.({ line, col, selectionLength: selLen });\n }, []);\n\n const handleInput = useCallback(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n onChangeRef.current?.(ta.value);\n autoResize();\n updateCursorInfo();\n }, [autoResize, updateCursorInfo]);\n\n const handleSelect = useCallback(() => {\n updateCursorInfo();\n }, [updateCursorInfo]);\n\n const handleScroll = useCallback(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n setScrollTop(ta.scrollTop);\n setScrollLeft(ta.scrollLeft);\n }, []);\n\n const revealLine = useCallback(\n (line: number, column = 1, opts?: { focus?: boolean }) => {\n const ta = textareaRef.current;\n if (!ta) return;\n\n const offset = lineColumnToOffset(ta.value, line, column);\n if (opts?.focus) ta.focus();\n ta.selectionStart = ta.selectionEnd = offset;\n updateCursorInfo();\n\n // Scroll the editor's scroll container (the panel) so the target line is\n // centered. The textarea is auto-sized to fit its content, so the panel —\n // not the textarea — is what scrolls.\n const panel = ta.closest<HTMLElement>(\"[data-fancy-code-panel]\");\n if (!panel) return;\n const cs = getComputedStyle(ta);\n const lineHeight = parseFloat(cs.lineHeight) || 19.5;\n const paddingTop = parseFloat(cs.paddingTop) || 0;\n const lineIndex = (ta.value.slice(0, offset).match(/\\n/g) || []).length; // clamped (targetLine - 1)\n const textareaTopInPanel =\n ta.getBoundingClientRect().top - panel.getBoundingClientRect().top + panel.scrollTop;\n const lineTop = textareaTopInPanel + paddingTop + lineIndex * lineHeight;\n const target = lineTop - panel.clientHeight / 2 + lineHeight / 2;\n const maxScroll = panel.scrollHeight - panel.clientHeight;\n panel.scrollTop = Math.max(0, Math.min(target, maxScroll));\n },\n [updateCursorInfo],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (readOnly) {\n // Allow copy shortcuts in read-only mode\n if (e.key === \"c\" && (e.metaKey || e.ctrlKey)) return;\n if (e.key === \"a\" && (e.metaKey || e.ctrlKey)) return;\n e.preventDefault();\n return;\n }\n\n // Tab key — insert spaces\n if (e.key === \"Tab\") {\n e.preventDefault();\n const ta = e.currentTarget;\n const start = ta.selectionStart;\n const end = ta.selectionEnd;\n const spaces = \" \".repeat(tabSize);\n\n if (e.shiftKey) {\n // Dedent: remove leading spaces from selected lines\n const lines = ta.value.split(\"\\n\");\n const startLine = ta.value.slice(0, start).split(\"\\n\").length - 1;\n const endLine = ta.value.slice(0, end).split(\"\\n\").length - 1;\n let removed = 0;\n for (let i = startLine; i <= endLine; i++) {\n const match = lines[i].match(new RegExp(`^ {1,${tabSize}}`));\n if (match) {\n removed += match[0].length;\n lines[i] = lines[i].slice(match[0].length);\n }\n }\n const newValue = lines.join(\"\\n\");\n ta.value = newValue;\n ta.selectionStart = Math.max(0, start - (startLine === endLine ? removed : tabSize));\n ta.selectionEnd = Math.max(0, end - removed);\n onChangeRef.current?.(newValue);\n } else if (start !== end) {\n // Indent selected lines\n const lines = ta.value.split(\"\\n\");\n const startLine = ta.value.slice(0, start).split(\"\\n\").length - 1;\n const endLine = ta.value.slice(0, end).split(\"\\n\").length - 1;\n for (let i = startLine; i <= endLine; i++) {\n lines[i] = spaces + lines[i];\n }\n const newValue = lines.join(\"\\n\");\n ta.value = newValue;\n ta.selectionStart = start + tabSize;\n ta.selectionEnd = end + (endLine - startLine + 1) * tabSize;\n onChangeRef.current?.(newValue);\n } else {\n // Insert tab at cursor\n const before = ta.value.slice(0, start);\n const after = ta.value.slice(end);\n ta.value = before + spaces + after;\n ta.selectionStart = ta.selectionEnd = start + tabSize;\n onChangeRef.current?.(ta.value);\n }\n autoResize();\n updateCursorInfo();\n return;\n }\n\n // Enter — auto-indent\n if (e.key === \"Enter\") {\n e.preventDefault();\n const ta = e.currentTarget;\n const start = ta.selectionStart;\n const end = ta.selectionEnd;\n const before = ta.value.slice(0, start);\n const after = ta.value.slice(end);\n const currentLine = before.split(\"\\n\").pop() || \"\";\n const indent = currentLine.match(/^(\\s*)/)?.[1] || \"\";\n\n // Extra indent after { or (\n const lastChar = before.trimEnd().slice(-1);\n const extraIndent = (lastChar === \"{\" || lastChar === \"(\") ? \" \".repeat(tabSize) : \"\";\n\n const insertion = \"\\n\" + indent + extraIndent;\n ta.value = before + insertion + after;\n ta.selectionStart = ta.selectionEnd = start + insertion.length;\n onChangeRef.current?.(ta.value);\n autoResize();\n updateCursorInfo();\n return;\n }\n },\n [readOnly, tabSize, autoResize, updateCursorInfo],\n );\n\n return {\n textareaRef,\n highlightedHtml,\n lineCount,\n activeLine,\n themeColors,\n handleKeyDown,\n handleInput,\n handleScroll,\n handleSelect,\n revealLine,\n scrollTop,\n scrollLeft,\n };\n}\n","import { useSyncExternalStore } from \"react\";\n\nfunction subscribe(callback: () => void): () => void {\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener(\"change\", callback);\n return () => mq.removeEventListener(\"change\", callback);\n}\n\nfunction getSnapshot(): boolean {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n}\n\nfunction getServerSnapshot(): boolean {\n return false;\n}\n\nexport function useDarkMode(): boolean {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n","import { useEffect, useMemo, useRef, useState, useCallback } from \"react\";\nimport { cn, useControllableState } from \"@particle-academy/react-fancy\";\nimport { annotateLines } from \"@particle-academy/fancy-file-commons\";\nimport { CodeEditorContext } from \"./CodeEditor.context\";\nimport { CodeEditorPanel } from \"./CodeEditorPanel\";\nimport { CodeEditorToolbar } from \"./CodeEditorToolbar\";\nimport { CodeEditorToolbarSeparator } from \"./CodeEditorToolbarSeparator\";\nimport { CodeEditorStatusBar } from \"./CodeEditorStatusBar\";\nimport { useEditorEngine } from \"../../hooks/use-editor-engine\";\nimport { useDarkMode } from \"../../hooks/use-dark-mode\";\nimport { getLanguage } from \"../../languages\";\nimport type { CodeEditorProps, CodeEditorContextValue } from \"./CodeEditor.types\";\n\nfunction CodeEditorRoot({\n children,\n className,\n value: valueProp,\n defaultValue = \"\",\n onChange,\n language: languageProp = \"javascript\",\n onLanguageChange,\n theme = \"auto\",\n readOnly = false,\n lineNumbers: lineNumbersProp = true,\n wordWrap: wordWrapProp = false,\n tabSize: tabSizeProp = 2,\n placeholder,\n minHeight,\n maxHeight,\n cursorLine,\n cursorColumn,\n diffBase,\n highlightLines,\n}: CodeEditorProps) {\n const [currentValue, setCurrentValue] = useControllableState(valueProp, defaultValue, onChange);\n\n // Diff gutter: per-line change marks of the current value vs the baseline.\n // Line-level only (no intra-line segmentation), recomputed as the user types.\n const diffAnnotations = useMemo(\n () => (diffBase == null ? null : annotateLines(diffBase, currentValue)),\n [diffBase, currentValue],\n );\n\n // Reactive dark mode for \"auto\" theme\n const isDark = useDarkMode();\n const resolvedTheme = theme === \"auto\" ? (isDark ? \"dark\" : \"light\") : theme;\n\n // Language state (changeable via toolbar selector)\n const [currentLanguage, setCurrentLanguageState] = useState(() => {\n const def = getLanguage(languageProp);\n return def?.name ?? languageProp;\n });\n\n const setLanguage = useCallback(\n (lang: string) => {\n const def = getLanguage(lang);\n const resolved = def?.name ?? lang;\n setCurrentLanguageState(resolved);\n onLanguageChange?.(resolved);\n },\n [onLanguageChange],\n );\n\n // Toggle states\n const [showLineNumbers, setShowLineNumbers] = useState(lineNumbersProp);\n const [isWordWrap, setIsWordWrap] = useState(wordWrapProp);\n\n // Cursor position\n const [cursorPosition, setCursorPosition] = useState({ line: 1, col: 1 });\n const [selectionLength, setSelectionLength] = useState(0);\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Our custom editor engine\n const engineReturn = useEditorEngine({\n containerRef,\n value: currentValue,\n onChange: setCurrentValue,\n language: currentLanguage,\n theme: resolvedTheme,\n readOnly,\n lineNumbers: showLineNumbers,\n wordWrap: isWordWrap,\n tabSize: tabSizeProp,\n placeholder,\n minHeight,\n maxHeight,\n onCursorChange: ({ line, col, selectionLength: sel }) => {\n setCursorPosition({ line, col });\n setSelectionLength(sel);\n },\n });\n\n // Reveal + place the caret when cursorLine/cursorColumn change (and on mount).\n // revealLine is stable, so this fires only on target change; it runs after the\n // engine's value-sync effect, so the textarea is populated and sized first.\n const { revealLine: revealLineImpl } = engineReturn;\n useEffect(() => {\n if (cursorLine == null) return;\n revealLineImpl(cursorLine, cursorColumn ?? 1, { focus: false });\n }, [cursorLine, cursorColumn, revealLineImpl]);\n\n const contextValue = useMemo<CodeEditorContextValue>(\n () => ({\n getValue: () => engineReturn.textareaRef.current?.value ?? currentValue,\n getSelection: () => {\n const ta = engineReturn.textareaRef.current;\n if (!ta) return \"\";\n return ta.value.slice(ta.selectionStart, ta.selectionEnd);\n },\n setValue: (v: string) => setCurrentValue(v),\n replaceSelection: (text: string) => {\n const ta = engineReturn.textareaRef.current;\n if (!ta) return;\n const start = ta.selectionStart;\n const end = ta.selectionEnd;\n const before = ta.value.slice(0, start);\n const after = ta.value.slice(end);\n ta.value = before + text + after;\n ta.selectionStart = ta.selectionEnd = start + text.length;\n setCurrentValue(ta.value);\n },\n focus: () => engineReturn.textareaRef.current?.focus(),\n revealLine: (line: number, column?: number) =>\n engineReturn.revealLine(line, column ?? 1, { focus: true }),\n setCursor: ({ line, column }: { line: number; column?: number }) =>\n engineReturn.revealLine(line, column ?? 1, { focus: true }),\n language: currentLanguage,\n setLanguage,\n theme: resolvedTheme,\n readOnly,\n lineNumbers: showLineNumbers,\n wordWrap: isWordWrap,\n tabSize: tabSizeProp,\n toggleWordWrap: () => setIsWordWrap((w) => !w),\n toggleLineNumbers: () => setShowLineNumbers((l) => !l),\n copyToClipboard: async () => {\n const text = engineReturn.textareaRef.current?.value ?? currentValue;\n await navigator.clipboard.writeText(text);\n },\n cursorPosition,\n selectionLength,\n textareaRef: engineReturn.textareaRef,\n placeholder,\n diffStats: diffAnnotations\n ? {\n added: diffAnnotations.added,\n modified: diffAnnotations.modified,\n removed: diffAnnotations.removed,\n }\n : null,\n _diffAnnotations: diffAnnotations,\n _engineReturn: engineReturn,\n _minHeight: minHeight,\n _maxHeight: maxHeight,\n _highlightLines: highlightLines,\n }),\n [engineReturn, currentValue, currentLanguage, setLanguage, resolvedTheme, readOnly, showLineNumbers, isWordWrap, tabSizeProp, cursorPosition, selectionLength, setCurrentValue, placeholder, diffAnnotations, minHeight, maxHeight, highlightLines],\n );\n\n return (\n <CodeEditorContext.Provider value={contextValue}>\n <div\n data-fancy-code-editor=\"\"\n className={cn(\n \"overflow-hidden\",\n className,\n )}\n >\n {children}\n </div>\n </CodeEditorContext.Provider>\n );\n}\n\nCodeEditorRoot.displayName = \"CodeEditor\";\n\nconst ToolbarWithSeparator = Object.assign(CodeEditorToolbar, {\n Separator: CodeEditorToolbarSeparator,\n});\n\nexport const CodeEditor = Object.assign(CodeEditorRoot, {\n Toolbar: ToolbarWithSeparator,\n Panel: CodeEditorPanel,\n StatusBar: CodeEditorStatusBar,\n});\n","import { cn, ContentRenderer, useControllableState } from \"@particle-academy/react-fancy\";\nimport { CodeEditor } from \"../CodeEditor\";\n\nexport type MarkdownEditorMode = \"split\" | \"edit\" | \"preview\";\n\nexport interface MarkdownEditorProps {\n /** Controlled markdown value. */\n value?: string;\n /** Initial value (uncontrolled). */\n defaultValue?: string;\n /** Called with the new markdown whenever the document changes. */\n onValueChange?: (markdown: string) => void;\n /**\n * Layout: `split` (editor + live preview side by side), `edit` (editor only),\n * or `preview` (rendered only). Default `split`.\n */\n mode?: MarkdownEditorMode;\n /** Editor theme — `\"light\" | \"dark\" | \"auto\"` or a registered name. Default `auto`. */\n theme?: string;\n /** Prevent editing. */\n readOnly?: boolean;\n /** Show line numbers in the editor (default false — prose reads better without). */\n lineNumbers?: boolean;\n /** Wrap long lines in the editor (default true for prose). */\n wordWrap?: boolean;\n /** Placeholder shown when empty. */\n placeholder?: string;\n /**\n * Height bounds (px). `maxHeight` constrains the PREVIEW pane as well as the\n * editor — it previously reached only the editor, so a long document rendered\n * at full height instead of scrolling.\n */\n minHeight?: number;\n maxHeight?: number;\n className?: string;\n /**\n * Swap the markdown → HTML renderer used by the preview pane.\n *\n * Rarely needed now: the preview renders through react-fancy's\n * `<ContentRenderer format=\"markdown\">`, which is a full CommonMark + GFM\n * parse. Supply this only to impose your own pipeline — the returned HTML is\n * injected as-is, so it must already be sanitised.\n */\n renderPreview?: (markdown: string) => string;\n}\n\n/**\n * A markdown-aware editor: a syntax-highlighted `CodeEditor` (the registered\n * `markdown` language) with an optional live preview pane. Controlled via\n * `value` + `onValueChange`. The preview renders through react-fancy's\n * `<ContentRenderer format=\"markdown\">` — a full CommonMark + GFM parse,\n * sanitised by default. Pass `renderPreview` to impose your own pipeline.\n *\n * ```tsx\n * <MarkdownEditor value={md} onValueChange={setMd} mode=\"split\" minHeight={240} />\n * ```\n */\nexport function MarkdownEditor({\n value,\n defaultValue = \"\",\n onValueChange,\n mode = \"split\",\n theme = \"auto\",\n readOnly = false,\n lineNumbers = false,\n wordWrap = true,\n placeholder,\n minHeight,\n maxHeight,\n className,\n renderPreview,\n}: MarkdownEditorProps) {\n const [content, setContent] = useControllableState(value, defaultValue, onValueChange);\n\n const showEditor = mode !== \"preview\";\n const showPreview = mode !== \"edit\";\n\n return (\n <div\n data-fancy-markdown-editor=\"\"\n data-mode={mode}\n className={cn(\"fancy-md-editor\", className)}\n >\n {showEditor && (\n <div className=\"fancy-md-editor-pane\">\n <CodeEditor\n value={content}\n onChange={setContent}\n language=\"markdown\"\n theme={theme}\n readOnly={readOnly}\n lineNumbers={lineNumbers}\n wordWrap={wordWrap}\n placeholder={placeholder}\n minHeight={minHeight}\n maxHeight={maxHeight}\n >\n <CodeEditor.Panel />\n </CodeEditor>\n </div>\n )}\n {showPreview && (\n <div\n data-fancy-markdown-preview=\"\"\n className=\"fancy-md-preview\"\n style={maxHeight ? { maxHeight, overflowY: \"auto\" } : undefined}\n >\n {renderPreview ? (\n // The host imposed its own pipeline; its HTML is injected as-is and\n // is its own responsibility to sanitise.\n <div dangerouslySetInnerHTML={{ __html: renderPreview(content) }} />\n ) : (\n // The kit's own renderer — a full CommonMark + GFM parse that\n // sanitises by default. `marked` already sits in this tree as a\n // react-fancy runtime dependency, so the built-in renderer this\n // replaced was a second, weaker markdown implementation next to a\n // complete one.\n <ContentRenderer value={content} format=\"markdown\" />\n )}\n </div>\n )}\n </div>\n );\n}\n\nMarkdownEditor.displayName = \"MarkdownEditor\";\n","import { resolveMediaType, type MediaKind } from \"@particle-academy/react-fancy\";\nimport { languageFromFilename } from \"@particle-academy/fancy-file-commons\";\n\n/**\n * The decision a file viewer makes about a file: render it as editable text, or\n * hand it to a media viewer. `media` carries the resolved {@link MediaKind};\n * `text` carries the editor language id.\n */\nexport type FileKind =\n | { kind: \"text\"; language: string }\n | { kind: \"media\"; mediaKind: MediaKind };\n\nexport interface ResolveFileKindInput {\n /** File name or path — sniffed for an extension (and used for the media check). */\n filename?: string;\n /** MIME type — preferred over the filename when known. */\n mime?: string;\n}\n\n// Filename → language now lives in @particle-academy/fancy-file-commons (the\n// shared core for the file packages — one EXT_LANGUAGE map suite-wide).\n// Re-exported so existing `fancy-code` imports keep working.\nexport { languageFromFilename };\n\n/**\n * Decide whether a file is previewable media (image / video / audio / PDF) or\n * text, from its MIME type (preferred) and/or filename. Media wins when the\n * type resolves to one; otherwise it's text and the editor language is derived\n * from the extension.\n *\n * Exposed so consumers can branch their own chrome (tabs, save buttons) the\n * same way `<FileViewer>` does internally.\n *\n * ```ts\n * resolveFileKind({ filename: \"logo.png\" }); // { kind: \"media\", mediaKind: \"image\" }\n * resolveFileKind({ filename: \"app.tsx\" }); // { kind: \"text\", language: \"typescript\" }\n * resolveFileKind({ mime: \"application/pdf\" }); // { kind: \"media\", mediaKind: \"pdf\" }\n * ```\n */\nexport function resolveFileKind({ filename, mime }: ResolveFileKindInput): FileKind {\n const media = resolveMediaType({ mime, src: filename });\n if (media !== \"unknown\") return { kind: \"media\", mediaKind: media };\n return { kind: \"text\", language: languageFromFilename(filename) };\n}\n","import { cn, MediaViewer } from \"@particle-academy/react-fancy\";\nimport { CodeEditor } from \"../CodeEditor\";\nimport { resolveFileKind } from \"../../file-type\";\nimport type { FileViewerProps } from \"./FileViewer.types\";\n\n/**\n * A unified file viewer: renders text files in a read-only `CodeEditor` (with\n * syntax highlighting picked from the filename) and media files — image, video,\n * audio, PDF — via react-fancy's `<MediaViewer>`. The text-vs-media decision is\n * made by {@link resolveFileKind}; pass `fileKind` to override it, or call\n * `resolveFileKind` yourself to branch your own chrome (tabs, save buttons).\n *\n * Give the container a height for media files (PDF/image/video fill their box).\n *\n * ```tsx\n * // text\n * <FileViewer filename=\"app.tsx\" value={source} />\n * // media\n * <FileViewer filename=\"logo.png\" src={url} style={{ height: 360 }} />\n * ```\n */\nexport function FileViewer({\n filename,\n mime,\n src,\n value = \"\",\n onChange,\n readOnly = true,\n theme = \"auto\",\n fileKind,\n lineNumbers = true,\n wordWrap = false,\n line,\n column,\n highlightLines,\n minHeight,\n maxHeight,\n mediaProps,\n className,\n style,\n}: FileViewerProps) {\n const resolved = fileKind ?? resolveFileKind({ filename, mime });\n\n if (resolved.kind === \"media\") {\n // Image / video / PDF fill the sized wrapper so a height set on FileViewer\n // reaches the viewer; audio is a fixed-height card and shouldn't stretch.\n const { className: mediaClassName, ...restMediaProps } = mediaProps ?? {};\n const fill = resolved.mediaKind !== \"audio\";\n return (\n <div\n data-fancy-file-viewer=\"\"\n data-kind=\"media\"\n data-media-kind={resolved.mediaKind}\n className={cn(\"overflow-hidden\", className)}\n style={style}\n >\n <MediaViewer\n src={src ?? \"\"}\n mime={mime}\n alt={filename}\n kind={resolved.mediaKind}\n className={cn(fill && \"h-full w-full\", mediaClassName)}\n {...restMediaProps}\n />\n </div>\n );\n }\n\n return (\n <div\n data-fancy-file-viewer=\"\"\n data-kind=\"text\"\n className={className}\n style={style}\n >\n <CodeEditor\n value={value}\n onChange={readOnly ? undefined : onChange}\n language={resolved.language}\n theme={theme}\n readOnly={readOnly}\n lineNumbers={lineNumbers}\n wordWrap={wordWrap}\n minHeight={minHeight}\n maxHeight={maxHeight}\n // CodeEditor already reveals `cursorLine` on mount and on change; this\n // component never passed one through, so a viewer could not land anywhere.\n cursorLine={line}\n cursorColumn={column}\n highlightLines={highlightLines ?? (line != null ? [line] : undefined)}\n >\n <CodeEditor.Panel />\n </CodeEditor>\n </div>\n );\n}\n\nFileViewer.displayName = \"FileViewer\";\n","/**\n * Tiny, dependency-free Markdown → HTML renderer for the MarkdownEditor preview\n * pane. Covers the common subset — headings, bold/italic, inline + fenced code,\n * links, images, blockquotes, ordered/unordered lists, hr, and paragraphs. Input\n * is HTML-escaped first, so raw HTML in the source is shown as text (safe by\n * default). Not a full CommonMark implementation; swap in a real renderer\n * downstream if you need one.\n */\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\n/**\n * Escape a value for use inside a double-quoted HTML attribute. Adds quote\n * escaping on top of `escapeHtml`'s `&<>` so the value can't break out of the\n * attribute. Apply to text that has already been `escapeHtml`-ed.\n */\nfunction escapeAttr(s: string): string {\n return s.replace(/\"/g, \"&quot;\").replace(/'/g, \"&#39;\");\n}\n\n/** Schemes a link may use. Anything else with a scheme renders as plain text. */\nconst LINK_SCHEMES = new Set([\"http\", \"https\", \"mailto\", \"tel\"]);\n\n/**\n * The scheme a browser would see in this URL, or null for a relative URL.\n *\n * Normalised the way the URL parser does it: leading C0 controls and spaces are\n * stripped and tab / CR / LF are removed anywhere, so `\" javascript:\"` and a\n * scheme split by a tab are both caught. Case-insensitive.\n */\nfunction schemeOf(url: string): string | null {\n let s = \"\";\n for (const ch of url) {\n const code = ch.codePointAt(0) ?? 0;\n if (code === 9 || code === 10 || code === 13) continue;\n if (s === \"\" && code <= 32) continue;\n s += ch;\n }\n const m = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(s);\n return m ? m[1].toLowerCase() : null;\n}\n\n/**\n * Is this URL safe in a preview inserted with innerHTML?\n *\n * The preview bypasses React, so React's `javascript:` guard never sees it. A\n * relative URL is always fine; an absolute one must use an allowed scheme, and\n * an image may additionally be a raster `data:image/...`. The input has already\n * been HTML-escaped, which neutralises entity-encoded schemes on its own.\n */\nfunction safeUrl(url: string, kind: \"link\" | \"image\"): boolean {\n const scheme = schemeOf(url);\n if (scheme === null) return true;\n if (scheme === \"http\" || scheme === \"https\") return true;\n if (kind === \"link\") return LINK_SCHEMES.has(scheme);\n return scheme === \"data\" && /^data:image\\/(png|jpe?g|gif|webp|avif|bmp);/i.test(url.trim());\n}\n\n/** Inline spans — run on already-escaped text. */\nfunction inline(text: string): string {\n return text\n // images ![alt](src) -- an unsafe src keeps only its alt text\n .replace(/!\\[([^\\]]*)\\]\\(([^)\\s]+)(?:\\s+\"([^\"]*)\")?\\)/g, (_m, alt, src, title) =>\n safeUrl(src, \"image\")\n ? `<img src=\"${escapeAttr(src)}\" alt=\"${escapeAttr(alt)}\"${title ? ` title=\"${escapeAttr(title)}\"` : \"\"}>`\n : alt)\n // links [text](href) -- an unsafe href keeps only its text\n .replace(/\\[([^\\]]+)\\]\\(([^)\\s]+)(?:\\s+\"([^\"]*)\")?\\)/g, (_m, t, href, title) =>\n safeUrl(href, \"link\")\n ? `<a href=\"${escapeAttr(href)}\"${title ? ` title=\"${escapeAttr(title)}\"` : \"\"} rel=\"noopener\">${t}</a>`\n : t)\n // inline code `code`\n .replace(/`([^`]+)`/g, (_m, c) => `<code>${c}</code>`)\n // bold **x** / __x__\n .replace(/(\\*\\*|__)(?=\\S)([\\s\\S]*?\\S)\\1/g, \"<strong>$2</strong>\")\n // italic *x* / _x_\n .replace(/(\\*|_)(?=\\S)([\\s\\S]*?\\S)\\1/g, \"<em>$2</em>\");\n}\n\nexport function renderMarkdown(markdown: string): string {\n const lines = markdown.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const out: string[] = [];\n\n let i = 0;\n let para: string[] = [];\n let listType: \"ul\" | \"ol\" | null = null;\n\n const flushPara = () => {\n if (para.length) {\n out.push(`<p>${inline(para.join(\" \"))}</p>`);\n para = [];\n }\n };\n const closeList = () => {\n if (listType) {\n out.push(`</${listType}>`);\n listType = null;\n }\n };\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Fenced code block\n const fence = line.match(/^\\s*(```|~~~)(.*)$/);\n if (fence) {\n flushPara();\n closeList();\n const lang = fence[2].trim();\n const body: string[] = [];\n i++;\n while (i < lines.length && !/^\\s*(```|~~~)/.test(lines[i])) {\n body.push(lines[i]);\n i++;\n }\n i++; // consume closing fence\n out.push(`<pre><code${lang ? ` class=\"language-${escapeAttr(escapeHtml(lang))}\"` : \"\"}>${escapeHtml(body.join(\"\\n\"))}</code></pre>`);\n continue;\n }\n\n const esc = escapeHtml(line);\n\n // Blank line — paragraph/list break\n if (/^\\s*$/.test(line)) {\n flushPara();\n closeList();\n i++;\n continue;\n }\n\n // Heading\n const heading = esc.match(/^(#{1,6})\\s+(.*)$/);\n if (heading) {\n flushPara();\n closeList();\n const level = heading[1].length;\n out.push(`<h${level}>${inline(heading[2])}</h${level}>`);\n i++;\n continue;\n }\n\n // Horizontal rule\n if (/^\\s*([-*_])(\\s*\\1){2,}\\s*$/.test(line)) {\n flushPara();\n closeList();\n out.push(\"<hr>\");\n i++;\n continue;\n }\n\n // Blockquote (single-level)\n const quote = esc.match(/^\\s*&gt;\\s?(.*)$/);\n if (quote) {\n flushPara();\n closeList();\n out.push(`<blockquote>${inline(quote[1])}</blockquote>`);\n i++;\n continue;\n }\n\n // List item\n const ol = esc.match(/^\\s*\\d+\\.\\s+(.*)$/);\n const ul = esc.match(/^\\s*[-*+]\\s+(.*)$/);\n if (ol || ul) {\n flushPara();\n const type: \"ul\" | \"ol\" = ol ? \"ol\" : \"ul\";\n if (listType !== type) {\n closeList();\n out.push(`<${type}>`);\n listType = type;\n }\n out.push(`<li>${inline((ol ?? ul)![1])}</li>`);\n i++;\n continue;\n }\n\n // Plain paragraph text (accumulate)\n closeList();\n para.push(esc);\n i++;\n }\n\n flushPara();\n closeList();\n return out.join(\"\\n\");\n}\n","import { useMemo } from \"react\";\nimport {\n InputTag,\n textareaAdapter,\n type InputTagAdapter,\n type InputTagProps,\n type InputTagTriggers,\n} from \"@particle-academy/react-fancy\";\nimport { useCodeEditor } from \"./components/CodeEditor/CodeEditor.context\";\n\n/**\n * Glue between `@particle-academy/react-fancy`'s `<InputTag>` and the\n * `<CodeEditor>` from this package. `<CodeEditor>` renders a real DOM\n * `<textarea>` under its overlay, so the existing `textareaAdapter`\n * just works — this module hands it the right ref via the editor\n * context.\n *\n * <CodeEditor value={code} onChange={setCode} language=\"markdown\">\n * <CodeEditor.Toolbar />\n * <CodeEditor.Panel />\n * <CodeEditorInputTag\n * triggers={{\n * \"/\": { items: commands, insert: (c) => `${c.name} ` },\n * \"@\": { items: mentions, insert: (m) => `@${m.name} ` },\n * }}\n * />\n * </CodeEditor>\n *\n * Must be rendered as a descendant of `<CodeEditor>` (it reads the\n * editor's context). For ad-hoc wiring outside the component tree,\n * pull the textarea ref off the context and call `textareaAdapter`\n * yourself.\n */\n\n/**\n * Hook form — returns an `InputTagAdapter` bound to the surrounding\n * `<CodeEditor>`. Useful when you want to compose your own picker UI\n * around the same adapter.\n */\nexport function useCodeEditorInputTagAdapter(): InputTagAdapter {\n const ctx = useCodeEditor();\n return useMemo(() => textareaAdapter(ctx.textareaRef), [ctx.textareaRef]);\n}\n\nexport interface CodeEditorInputTagProps extends Omit<InputTagProps, \"adapter\"> {\n triggers: InputTagTriggers;\n}\n\n/**\n * Convenience wrapper — renders `<InputTag>` already wired to the\n * surrounding `<CodeEditor>`'s textarea. Equivalent to:\n *\n * const adapter = useCodeEditorInputTagAdapter();\n * return <InputTag adapter={adapter} {...rest} />;\n */\nexport function CodeEditorInputTag(props: CodeEditorInputTagProps) {\n const adapter = useCodeEditorInputTagAdapter();\n return <InputTag adapter={adapter} {...props} />;\n}\n"]}
1
+ {"version":3,"sources":["../src/components/CodeEditor/CodeEditor.context.ts","../src/components/CodeEditor/diff-gutter.ts","../src/components/CodeEditor/CodeEditorPanel.tsx","../src/components/CodeEditor/CodeEditorToolbarSeparator.tsx","../src/languages/registry.ts","../src/engine/tokenizers/javascript.ts","../src/engine/tokenizers/php.ts","../src/engine/tokenizers/python.ts","../src/engine/tokenizers/go.ts","../src/engine/tokenizers/markdown.ts","../src/languages/builtin.ts","../src/components/CodeEditor/CodeEditorToolbar.tsx","../src/components/CodeEditor/CodeEditorStatusBar.tsx","../src/themes/registry.ts","../src/themes/light.ts","../src/themes/dark.ts","../src/engine/position.ts","../src/hooks/use-editor-engine.ts","../src/hooks/use-dark-mode.ts","../src/components/CodeEditor/CodeEditor.tsx","../src/components/MarkdownEditor/MarkdownEditor.tsx","../src/file-type.ts","../src/components/FileViewer/FileViewer.tsx","../src/engine/markdown-render.ts","../src/input-tag.tsx"],"names":["themeColors","lineCount","activeLine","jsx","KEYWORDS","TYPES","jsxs","cn","Fragment","useState","useMemo","useCallback","useRef","useEffect","useControllableState","ContentRenderer"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { CodeEditorContextValue } from \"./CodeEditor.types\";\n\nexport const CodeEditorContext = createContext<CodeEditorContextValue | null>(null);\n\nexport function useCodeEditor(): CodeEditorContextValue {\n const ctx = useContext(CodeEditorContext);\n if (!ctx) {\n throw new Error(\"useCodeEditor must be used within a <CodeEditor> component\");\n }\n return ctx;\n}\n","/**\n * Diff-gutter model — the pure mapping between fancy-file-commons line\n * annotations and what the CodeEditor gutter renders per line-number row.\n * Kept DOM-free (like engine/position.ts) so it's unit-testable; the panel\n * only paints what this resolves.\n */\nimport type { DiffAnnotations, LineChangeType } from \"@particle-academy/fancy-file-commons\";\nimport type { ThemeColors } from \"../../themes/types\";\n\n/** What one line-number row shows: its own change bar and/or a deletion wedge above. */\nexport interface GutterDiffMark {\n /** The line's own change (colored bar), if any. */\n type?: LineChangeType;\n /** True when one or more lines were deleted immediately above this line (wedge). */\n deletedAbove: boolean;\n}\n\n/** Resolve the mark for a 1-based line, or null when the line is untouched. */\nexport function gutterDiffMark(\n annotations: DiffAnnotations | null,\n line: number,\n): GutterDiffMark | null {\n if (!annotations) return null;\n const a = annotations.byLine[line];\n if (!a) return null;\n return { type: a.type, deletedAbove: (a.deletedAbove ?? 0) > 0 };\n}\n\n/** Whether the deleted-at-EOF wedge should render under the last line. */\nexport function hasDeletedAtEnd(annotations: DiffAnnotations | null): boolean {\n return (annotations?.deletedAtEnd ?? 0) > 0;\n}\n\n/** VS Code-convention fallbacks for themes that don't define diff colors. */\nconst FALLBACK = { added: \"#3fb950\", modified: \"#4184e4\", removed: \"#f85149\" } as const;\n\n/** The bar color for a change type, honoring theme overrides. */\nexport function diffMarkColor(type: LineChangeType, colors: ThemeColors): string {\n return type === \"added\"\n ? (colors.diffAdded ?? FALLBACK.added)\n : (colors.diffModified ?? FALLBACK.modified);\n}\n\n/** The deletion-wedge color, honoring theme overrides. */\nexport function diffRemovedColor(colors: ThemeColors): string {\n return colors.diffRemoved ?? FALLBACK.removed;\n}\n","import { useMemo } from \"react\";\nimport { cn } from \"@particle-academy/react-fancy\";\nimport { useCodeEditor } from \"./CodeEditor.context\";\nimport {\n diffMarkColor,\n diffRemovedColor,\n gutterDiffMark,\n hasDeletedAtEnd,\n} from \"./diff-gutter\";\nimport type { CodeEditorPanelProps } from \"./CodeEditor.types\";\n\nexport function CodeEditorPanel({ className }: CodeEditorPanelProps) {\n const {\n _engineReturn: engine,\n lineNumbers,\n wordWrap,\n readOnly,\n placeholder,\n _diffAnnotations: diffAnnotations,\n _maxHeight,\n _minHeight,\n _highlightLines: highlightLines,\n } = useCodeEditor();\n\n // This `useMemo` MUST run before the `!engine` guard below it.\n //\n // The guard used to come first, so a render without an engine ran ZERO hooks\n // and the next one ran one. React compares hook counts between renders, so\n // that transition desyncs the hook order and throws from deep inside React,\n // naming none of this code. `_engineReturn` is typed `| null` and starts null,\n // so the transition is real rather than theoretical.\n //\n // Reading the engine's fields inside the callback (rather than destructuring\n // above) is what lets the hook run unconditionally.\n const lineNumberElements = useMemo(() => {\n if (!engine || !lineNumbers) return null;\n const { themeColors, lineCount, activeLine } = engine;\n const removed = diffRemovedColor(themeColors);\n const highlighted = new Set(highlightLines ?? []);\n const lines = [];\n for (let i = 1; i <= lineCount; i++) {\n const mark = gutterDiffMark(diffAnnotations, i);\n lines.push(\n <div\n key={i}\n data-diff={mark?.type}\n data-diff-deleted-above={mark?.deletedAbove ? \"\" : undefined}\n style={{\n position: \"relative\",\n color: i === activeLine || highlighted.has(i) ? themeColors.foreground : themeColors.gutterForeground,\n backgroundColor: i === activeLine ? themeColors.activeLineBackground : undefined,\n fontWeight: highlighted.has(i) ? 600 : undefined,\n }}\n className=\"pr-3 text-right text-[13px] leading-[1.5] select-none\"\n >\n {/* Change bar — VS Code convention: green added, blue modified. */}\n {mark?.type && (\n <span\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n width: 3,\n borderRadius: 2,\n backgroundColor: diffMarkColor(mark.type, themeColors),\n }}\n />\n )}\n {/* Deletion wedge — lines were removed immediately above this one. */}\n {mark?.deletedAbove && (\n <span\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n left: 0,\n top: -4,\n width: 0,\n height: 0,\n borderLeft: `8px solid ${removed}`,\n borderTop: \"4px solid transparent\",\n borderBottom: \"4px solid transparent\",\n }}\n />\n )}\n {i}\n {/* Deletion at EOF — removed lines hang below the last line. */}\n {i === lineCount && hasDeletedAtEnd(diffAnnotations) && (\n <span\n aria-hidden=\"true\"\n data-diff-deleted-at-end=\"\"\n style={{\n position: \"absolute\",\n left: 0,\n bottom: -4,\n width: 0,\n height: 0,\n borderLeft: `8px solid ${removed}`,\n borderTop: \"4px solid transparent\",\n borderBottom: \"4px solid transparent\",\n }}\n />\n )}\n </div>,\n );\n }\n return lines;\n }, [engine, lineNumbers, diffAnnotations, highlightLines]);\n\n // Every hook is above this line.\n if (!engine) return null;\n\n const {\n textareaRef,\n highlightedHtml,\n lineCount,\n activeLine,\n themeColors,\n handleKeyDown,\n handleInput,\n handleScroll,\n handleSelect,\n scrollTop,\n scrollLeft,\n } = engine;\n\n const gutterWidth = lineNumbers ? `${Math.max(String(lineCount).length, 2) * 0.75 + 1.5}em` : \"0\";\n\n const containerStyle: React.CSSProperties = {\n backgroundColor: themeColors.background,\n color: themeColors.foreground,\n minHeight: _minHeight,\n maxHeight: _maxHeight,\n };\n\n const isEmpty = textareaRef.current ? textareaRef.current.value.length === 0 : highlightedHtml.length === 0;\n\n return (\n <div\n data-fancy-code-panel=\"\"\n className={cn(\"relative overflow-auto\", className)}\n style={containerStyle}\n >\n <div className=\"flex min-h-full\">\n {/* Line numbers gutter */}\n {lineNumbers && (\n <div\n className=\"sticky left-0 z-10 shrink-0 pt-2.5 pb-2.5 pl-2\"\n style={{\n backgroundColor: themeColors.gutterBackground,\n borderRight: `1px solid ${themeColors.gutterBorder}`,\n width: gutterWidth,\n }}\n >\n {lineNumberElements}\n </div>\n )}\n\n {/* Editor area */}\n <div className={cn(\"relative flex-1\", wordWrap && \"min-w-0\")}>\n {/*\n Line bands — \"here is the line you were sent to\". Behind the code, and\n placed in em so they track the 13px / 1.5 line grid the gutter uses;\n 0.625rem is the editor's top padding (p-2.5).\n */}\n {(highlightLines ?? [])\n .filter((n) => Number.isInteger(n) && n >= 1 && n <= lineCount)\n .map((n) => (\n <div\n key={`highlight-${n}`}\n data-fancy-code-highlight-line={n}\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-x-0 text-[13px] leading-[1.5]\"\n style={{\n top: `calc(0.625rem + ${(n - 1) * 1.5}em)`,\n height: \"1.5em\",\n backgroundColor: themeColors.selectionBackground,\n opacity: 0.55,\n }}\n />\n ))}\n\n {/* Highlighted code overlay */}\n <pre\n className=\"pointer-events-none absolute inset-0 m-0 overflow-hidden border-none p-2.5 text-[13px] leading-[1.5]\"\n aria-hidden=\"true\"\n style={{\n whiteSpace: wordWrap ? \"pre-wrap\" : \"pre\",\n overflowWrap: wordWrap ? \"break-word\" : \"normal\",\n }}\n >\n <code dangerouslySetInnerHTML={{ __html: highlightedHtml + \"\\n\" }} />\n </pre>\n\n {/* Placeholder */}\n {placeholder && isEmpty && (\n <div\n className=\"pointer-events-none absolute left-0 top-0 p-2.5 text-[13px] leading-[1.5] opacity-40\"\n style={{ color: themeColors.foreground }}\n >\n {placeholder}\n </div>\n )}\n\n {/* Actual textarea for input */}\n <textarea\n ref={textareaRef}\n className={cn(\n \"relative m-0 block resize-none border-none bg-transparent p-2.5 text-[13px] leading-[1.5] text-transparent outline-none\",\n wordWrap ? \"w-full\" : \"min-w-full\",\n )}\n style={{\n caretColor: themeColors.cursorColor,\n minHeight: _minHeight ? _minHeight - 40 : 80,\n overflow: \"hidden\",\n whiteSpace: wordWrap ? \"pre-wrap\" : \"pre\",\n overflowWrap: wordWrap ? \"break-word\" : \"normal\",\n }}\n spellCheck={false}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n readOnly={readOnly}\n onKeyDown={handleKeyDown}\n onInput={handleInput}\n onScroll={handleScroll}\n onSelect={handleSelect}\n onClick={handleSelect}\n />\n </div>\n </div>\n </div>\n );\n}\n\nCodeEditorPanel.displayName = \"CodeEditorPanel\";\n","export function CodeEditorToolbarSeparator() {\n return (\n <div\n data-fancy-code-toolbar-separator=\"\"\n className=\"mx-1 h-4 w-px bg-zinc-200 dark:bg-zinc-700\"\n />\n );\n}\n\nCodeEditorToolbarSeparator.displayName = \"CodeEditorToolbarSeparator\";\n","import type { LanguageDefinition } from \"./types\";\n\nconst languageRegistry = new Map<string, LanguageDefinition>();\n\nexport function registerLanguage(def: LanguageDefinition): void {\n languageRegistry.set(def.name.toLowerCase(), def);\n if (def.aliases) {\n for (const alias of def.aliases) {\n languageRegistry.set(alias.toLowerCase(), def);\n }\n }\n}\n\nexport function getLanguage(name: string): LanguageDefinition | undefined {\n return languageRegistry.get(name.toLowerCase());\n}\n\nexport function getRegisteredLanguages(): string[] {\n const seen = new Set<LanguageDefinition>();\n const names: string[] = [];\n for (const [, def] of languageRegistry) {\n if (!seen.has(def)) {\n seen.add(def);\n names.push(def.name);\n }\n }\n return names;\n}\n","import type { Token, Tokenizer } from \"../tokenizer\";\n\nconst KEYWORDS = new Set([\n \"abstract\", \"arguments\", \"as\", \"async\", \"await\", \"boolean\", \"break\", \"byte\",\n \"case\", \"catch\", \"char\", \"class\", \"const\", \"continue\", \"debugger\", \"default\",\n \"delete\", \"do\", \"double\", \"else\", \"enum\", \"export\", \"extends\", \"false\",\n \"final\", \"finally\", \"float\", \"for\", \"from\", \"function\", \"get\", \"goto\", \"if\",\n \"implements\", \"import\", \"in\", \"instanceof\", \"int\", \"interface\", \"keyof\", \"let\",\n \"long\", \"native\", \"new\", \"null\", \"of\", \"package\", \"private\", \"protected\",\n \"public\", \"readonly\", \"return\", \"set\", \"short\", \"static\", \"super\", \"switch\",\n \"synchronized\", \"this\", \"throw\", \"throws\", \"transient\", \"true\", \"try\",\n \"type\", \"typeof\", \"undefined\", \"var\", \"void\", \"volatile\", \"while\", \"with\",\n \"yield\",\n]);\n\nconst TYPE_KEYWORDS = new Set([\n \"string\", \"number\", \"boolean\", \"any\", \"void\", \"never\", \"unknown\", \"object\",\n \"symbol\", \"bigint\", \"undefined\", \"null\",\n]);\n\nexport const tokenizeJavaScript: Tokenizer = (source: string): Token[] => {\n const tokens: Token[] = [];\n const len = source.length;\n let i = 0;\n\n while (i < len) {\n const ch = source[i];\n\n // Whitespace — skip\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\") {\n i++;\n continue;\n }\n\n // Single-line comment\n if (ch === \"/\" && source[i + 1] === \"/\") {\n const pos = i;\n i += 2;\n while (i < len && source[i] !== \"\\n\") i++;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Multi-line comment\n if (ch === \"/\" && source[i + 1] === \"*\") {\n const pos = i;\n i += 2;\n while (i < len && !(source[i] === \"*\" && source[i + 1] === \"/\")) i++;\n i += 2;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Template literal\n if (ch === \"`\") {\n const pos = i;\n i++;\n while (i < len && source[i] !== \"`\") {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n i++; // closing backtick\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // String (single or double quote)\n if (ch === '\"' || ch === \"'\") {\n const pos = i;\n const quote = ch;\n i++;\n while (i < len && source[i] !== quote) {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n i++; // closing quote\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Number\n if ((ch >= \"0\" && ch <= \"9\") || (ch === \".\" && source[i + 1] >= \"0\" && source[i + 1] <= \"9\")) {\n const pos = i;\n if (ch === \"0\" && (source[i + 1] === \"x\" || source[i + 1] === \"X\")) {\n i += 2;\n while (i < len && /[0-9a-fA-F_]/.test(source[i])) i++;\n } else if (ch === \"0\" && (source[i + 1] === \"b\" || source[i + 1] === \"B\")) {\n i += 2;\n while (i < len && /[01_]/.test(source[i])) i++;\n } else {\n while (i < len && /[0-9_.]/.test(source[i])) i++;\n if (i < len && (source[i] === \"e\" || source[i] === \"E\")) {\n i++;\n if (i < len && (source[i] === \"+\" || source[i] === \"-\")) i++;\n while (i < len && source[i] >= \"0\" && source[i] <= \"9\") i++;\n }\n }\n if (i < len && source[i] === \"n\") i++; // BigInt\n tokens.push({ type: \"number\", start: pos, end: i });\n continue;\n }\n\n // Identifier or keyword\n if (/[a-zA-Z_$]/.test(ch)) {\n const pos = i;\n i++;\n while (i < len && /[a-zA-Z0-9_$]/.test(source[i])) i++;\n const word = source.slice(pos, i);\n\n // Check if it's a function call (followed by parenthesis)\n let j = i;\n while (j < len && (source[j] === \" \" || source[j] === \"\\t\")) j++;\n\n if (TYPE_KEYWORDS.has(word)) {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else if (KEYWORDS.has(word)) {\n tokens.push({ type: \"keyword\", start: pos, end: i });\n } else if (source[j] === \"(\") {\n tokens.push({ type: \"function\", start: pos, end: i });\n } else if (word[0] >= \"A\" && word[0] <= \"Z\") {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else {\n tokens.push({ type: \"variable\", start: pos, end: i });\n }\n continue;\n }\n\n // Operators\n if (\"+-*/%=<>!&|^~?:\".includes(ch)) {\n const pos = i;\n i++;\n // Consume multi-char operators (===, !==, =>, &&, ||, ??, etc.)\n while (i < len && \"+-*/%=<>!&|^~?:\".includes(source[i])) i++;\n tokens.push({ type: \"operator\", start: pos, end: i });\n continue;\n }\n\n // Punctuation\n if (\"(){}[];,.@#\".includes(ch)) {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n continue;\n }\n\n // Anything else\n tokens.push({ type: \"plain\", start: i, end: i + 1 });\n i++;\n }\n\n return tokens;\n};\n","import type { Token, Tokenizer } from \"../tokenizer\";\nimport { tokenizeHtml } from \"./html\";\n\nconst PHP_KEYWORDS = new Set([\n \"abstract\", \"and\", \"array\", \"as\", \"break\", \"callable\", \"case\", \"catch\",\n \"class\", \"clone\", \"const\", \"continue\", \"declare\", \"default\", \"do\", \"echo\",\n \"else\", \"elseif\", \"empty\", \"enddeclare\", \"endfor\", \"endforeach\", \"endif\",\n \"endswitch\", \"endwhile\", \"enum\", \"eval\", \"exit\", \"extends\", \"false\", \"final\",\n \"finally\", \"fn\", \"for\", \"foreach\", \"function\", \"global\", \"goto\", \"if\",\n \"implements\", \"include\", \"include_once\", \"instanceof\", \"insteadof\",\n \"interface\", \"isset\", \"list\", \"match\", \"namespace\", \"new\", \"null\", \"or\",\n \"print\", \"private\", \"protected\", \"public\", \"readonly\", \"require\",\n \"require_once\", \"return\", \"self\", \"static\", \"switch\", \"throw\", \"trait\",\n \"true\", \"try\", \"unset\", \"use\", \"var\", \"while\", \"xor\", \"yield\",\n]);\n\nfunction tokenizePhpBlock(source: string, offset: number): { tokens: Token[]; end: number } {\n const tokens: Token[] = [];\n const len = source.length;\n let i = offset;\n\n while (i < len) {\n const ch = source[i];\n\n // End of PHP block\n if (ch === \"?\" && source[i + 1] === \">\") {\n return { tokens, end: i };\n }\n\n // Whitespace\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\") {\n i++;\n continue;\n }\n\n // Single-line comment (// or #)\n if ((ch === \"/\" && source[i + 1] === \"/\") || ch === \"#\") {\n const pos = i;\n while (i < len && source[i] !== \"\\n\") i++;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Multi-line comment\n if (ch === \"/\" && source[i + 1] === \"*\") {\n const pos = i;\n i += 2;\n while (i < len && !(source[i] === \"*\" && source[i + 1] === \"/\")) i++;\n i += 2;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Variable ($name)\n if (ch === \"$\") {\n const pos = i;\n i++;\n while (i < len && /[a-zA-Z0-9_]/.test(source[i])) i++;\n tokens.push({ type: \"variable\", start: pos, end: i });\n continue;\n }\n\n // String (single or double quote)\n if (ch === '\"' || ch === \"'\") {\n const pos = i;\n const quote = ch;\n i++;\n while (i < len && source[i] !== quote) {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n i++;\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Number\n if (ch >= \"0\" && ch <= \"9\") {\n const pos = i;\n while (i < len && /[0-9_.]/.test(source[i])) i++;\n if (i < len && (source[i] === \"e\" || source[i] === \"E\")) {\n i++;\n if (i < len && (source[i] === \"+\" || source[i] === \"-\")) i++;\n while (i < len && source[i] >= \"0\" && source[i] <= \"9\") i++;\n }\n tokens.push({ type: \"number\", start: pos, end: i });\n continue;\n }\n\n // Identifier or keyword\n if (/[a-zA-Z_]/.test(ch)) {\n const pos = i;\n i++;\n while (i < len && /[a-zA-Z0-9_]/.test(source[i])) i++;\n const word = source.slice(pos, i);\n\n let j = i;\n while (j < len && (source[j] === \" \" || source[j] === \"\\t\")) j++;\n\n if (PHP_KEYWORDS.has(word.toLowerCase())) {\n tokens.push({ type: \"keyword\", start: pos, end: i });\n } else if (source[j] === \"(\") {\n tokens.push({ type: \"function\", start: pos, end: i });\n } else if (word[0] >= \"A\" && word[0] <= \"Z\") {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else {\n tokens.push({ type: \"variable\", start: pos, end: i });\n }\n continue;\n }\n\n // Operators\n if (\"+-*/%=<>!&|^~?:.\".includes(ch)) {\n const pos = i;\n i++;\n while (i < len && \"+-*/%=<>!&|^~?:.\".includes(source[i])) i++;\n tokens.push({ type: \"operator\", start: pos, end: i });\n continue;\n }\n\n // Punctuation\n if (\"(){}[];,@\\\\\".includes(ch)) {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n continue;\n }\n\n tokens.push({ type: \"plain\", start: i, end: i + 1 });\n i++;\n }\n\n return { tokens, end: i };\n}\n\nexport const tokenizePhp: Tokenizer = (source: string): Token[] => {\n const tokens: Token[] = [];\n const len = source.length;\n let i = 0;\n let htmlChunkStart = 0;\n\n while (i < len) {\n // Detect PHP open tag\n if (source[i] === \"<\" && source[i + 1] === \"?\") {\n // Tokenize any HTML before this PHP block\n if (i > htmlChunkStart) {\n const htmlChunk = source.slice(htmlChunkStart, i);\n const htmlTokens = tokenizeHtml(htmlChunk);\n for (const t of htmlTokens) {\n tokens.push({ type: t.type, start: t.start + htmlChunkStart, end: t.end + htmlChunkStart });\n }\n }\n\n // PHP open tag\n const tagStart = i;\n i += 2;\n // Skip \"php\" or \"=\"\n if (i < len && source.slice(i, i + 3).toLowerCase() === \"php\") {\n i += 3;\n } else if (i < len && source[i] === \"=\") {\n i++;\n }\n tokens.push({ type: \"keyword\", start: tagStart, end: i });\n\n // Tokenize PHP content\n const result = tokenizePhpBlock(source, i);\n tokens.push(...result.tokens);\n i = result.end;\n\n // PHP close tag\n if (i < len && source[i] === \"?\" && source[i + 1] === \">\") {\n tokens.push({ type: \"keyword\", start: i, end: i + 2 });\n i += 2;\n }\n\n htmlChunkStart = i;\n continue;\n }\n\n i++;\n }\n\n // Remaining HTML after last PHP block\n if (htmlChunkStart < len) {\n const htmlChunk = source.slice(htmlChunkStart);\n const htmlTokens = tokenizeHtml(htmlChunk);\n for (const t of htmlTokens) {\n tokens.push({ type: t.type, start: t.start + htmlChunkStart, end: t.end + htmlChunkStart });\n }\n }\n\n return tokens;\n};\n","import type { Token, Tokenizer } from \"../tokenizer\";\n\nconst KEYWORDS = new Set([\n \"and\", \"as\", \"assert\", \"async\", \"await\", \"break\", \"class\", \"continue\",\n \"def\", \"del\", \"elif\", \"else\", \"except\", \"finally\", \"for\", \"from\",\n \"global\", \"if\", \"import\", \"in\", \"is\", \"lambda\", \"nonlocal\", \"not\",\n \"or\", \"pass\", \"raise\", \"return\", \"try\", \"while\", \"with\", \"yield\",\n \"True\", \"False\", \"None\",\n]);\n\nconst TYPES = new Set([\n \"int\", \"str\", \"float\", \"bool\", \"list\", \"dict\", \"tuple\", \"set\",\n \"bytes\", \"bytearray\", \"memoryview\", \"range\", \"frozenset\",\n \"complex\", \"type\", \"object\", \"property\", \"classmethod\", \"staticmethod\",\n \"Any\", \"Optional\", \"Union\", \"Callable\", \"List\", \"Dict\", \"Tuple\", \"Set\",\n \"Sequence\", \"Mapping\", \"Iterator\", \"Generator\", \"Coroutine\",\n]);\n\nexport const tokenizePython: Tokenizer = (source: string): Token[] => {\n const tokens: Token[] = [];\n const len = source.length;\n let i = 0;\n\n while (i < len) {\n const ch = source[i];\n\n // Whitespace\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\") {\n i++;\n continue;\n }\n\n // Comment\n if (ch === \"#\") {\n const pos = i;\n i++;\n while (i < len && source[i] !== \"\\n\") i++;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Decorator\n if (ch === \"@\" && i + 1 < len && /[a-zA-Z_]/.test(source[i + 1])) {\n const pos = i;\n i++;\n while (i < len && /[a-zA-Z0-9_.]/.test(source[i])) i++;\n tokens.push({ type: \"keyword\", start: pos, end: i });\n continue;\n }\n\n // String (check for prefix + triple or single quote)\n if (\n ch === '\"' || ch === \"'\" ||\n ((ch === \"f\" || ch === \"r\" || ch === \"b\" || ch === \"F\" || ch === \"R\" || ch === \"B\") &&\n (source[i + 1] === '\"' || source[i + 1] === \"'\"))\n ) {\n const pos = i;\n // Skip prefix\n if (ch !== '\"' && ch !== \"'\") i++;\n\n const quote = source[i];\n\n // Triple-quoted string\n if (source[i + 1] === quote && source[i + 2] === quote) {\n const triple = quote + quote + quote;\n i += 3;\n while (i < len && source.slice(i, i + 3) !== triple) {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n i += 3;\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Single-line string\n i++;\n while (i < len && source[i] !== quote && source[i] !== \"\\n\") {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n if (i < len && source[i] === quote) i++;\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Number\n if ((ch >= \"0\" && ch <= \"9\") || (ch === \".\" && i + 1 < len && source[i + 1] >= \"0\" && source[i + 1] <= \"9\")) {\n const pos = i;\n if (ch === \"0\" && (source[i + 1] === \"x\" || source[i + 1] === \"X\")) {\n i += 2;\n while (i < len && /[0-9a-fA-F_]/.test(source[i])) i++;\n } else if (ch === \"0\" && (source[i + 1] === \"b\" || source[i + 1] === \"B\")) {\n i += 2;\n while (i < len && /[01_]/.test(source[i])) i++;\n } else if (ch === \"0\" && (source[i + 1] === \"o\" || source[i + 1] === \"O\")) {\n i += 2;\n while (i < len && /[0-7_]/.test(source[i])) i++;\n } else {\n while (i < len && /[0-9_.]/.test(source[i])) i++;\n if (i < len && (source[i] === \"e\" || source[i] === \"E\")) {\n i++;\n if (i < len && (source[i] === \"+\" || source[i] === \"-\")) i++;\n while (i < len && source[i] >= \"0\" && source[i] <= \"9\") i++;\n }\n }\n if (i < len && source[i] === \"j\") i++; // complex\n tokens.push({ type: \"number\", start: pos, end: i });\n continue;\n }\n\n // Identifier or keyword\n if (/[a-zA-Z_]/.test(ch)) {\n const pos = i;\n i++;\n while (i < len && /[a-zA-Z0-9_]/.test(source[i])) i++;\n const word = source.slice(pos, i);\n\n let j = i;\n while (j < len && (source[j] === \" \" || source[j] === \"\\t\")) j++;\n\n if (KEYWORDS.has(word)) {\n tokens.push({ type: \"keyword\", start: pos, end: i });\n } else if (TYPES.has(word)) {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else if (source[j] === \"(\") {\n tokens.push({ type: \"function\", start: pos, end: i });\n } else if (word[0] >= \"A\" && word[0] <= \"Z\") {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else {\n tokens.push({ type: \"variable\", start: pos, end: i });\n }\n continue;\n }\n\n // Operators\n if (\"+-*/%=<>!&|^~:@\".includes(ch)) {\n const pos = i;\n i++;\n while (i < len && \"+-*/%=<>!&|^~:\".includes(source[i])) i++;\n tokens.push({ type: \"operator\", start: pos, end: i });\n continue;\n }\n\n // Punctuation\n if (\"()[]{},.;\\\\\".includes(ch)) {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n continue;\n }\n\n tokens.push({ type: \"plain\", start: i, end: i + 1 });\n i++;\n }\n\n return tokens;\n};\n","import type { Token, Tokenizer } from \"../tokenizer\";\n\nconst KEYWORDS = new Set([\n \"break\", \"case\", \"chan\", \"const\", \"continue\", \"default\", \"defer\",\n \"else\", \"fallthrough\", \"for\", \"func\", \"go\", \"goto\", \"if\", \"import\",\n \"interface\", \"map\", \"package\", \"range\", \"return\", \"select\", \"struct\",\n \"switch\", \"type\", \"var\", \"nil\", \"true\", \"false\", \"iota\",\n]);\n\nconst TYPES = new Set([\n \"bool\", \"byte\", \"complex64\", \"complex128\", \"error\", \"float32\", \"float64\",\n \"int\", \"int8\", \"int16\", \"int32\", \"int64\", \"rune\", \"string\",\n \"uint\", \"uint8\", \"uint16\", \"uint32\", \"uint64\", \"uintptr\", \"any\",\n]);\n\nconst BUILTINS = new Set([\n \"make\", \"len\", \"cap\", \"new\", \"append\", \"copy\", \"close\", \"delete\",\n \"complex\", \"real\", \"imag\", \"panic\", \"recover\", \"print\", \"println\",\n]);\n\nexport const tokenizeGo: Tokenizer = (source: string): Token[] => {\n const tokens: Token[] = [];\n const len = source.length;\n let i = 0;\n\n while (i < len) {\n const ch = source[i];\n\n // Whitespace\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\") {\n i++;\n continue;\n }\n\n // Single-line comment\n if (ch === \"/\" && source[i + 1] === \"/\") {\n const pos = i;\n i += 2;\n while (i < len && source[i] !== \"\\n\") i++;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Block comment\n if (ch === \"/\" && source[i + 1] === \"*\") {\n const pos = i;\n i += 2;\n while (i < len && !(source[i] === \"*\" && source[i + 1] === \"/\")) i++;\n i += 2;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Raw string literal (backtick)\n if (ch === \"`\") {\n const pos = i;\n i++;\n while (i < len && source[i] !== \"`\") i++;\n i++;\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Interpreted string\n if (ch === '\"') {\n const pos = i;\n i++;\n while (i < len && source[i] !== '\"' && source[i] !== \"\\n\") {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n if (i < len && source[i] === '\"') i++;\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Rune literal\n if (ch === \"'\") {\n const pos = i;\n i++;\n while (i < len && source[i] !== \"'\" && source[i] !== \"\\n\") {\n if (source[i] === \"\\\\\") i++;\n i++;\n }\n if (i < len && source[i] === \"'\") i++;\n tokens.push({ type: \"string\", start: pos, end: i });\n continue;\n }\n\n // Number\n if ((ch >= \"0\" && ch <= \"9\") || (ch === \".\" && i + 1 < len && source[i + 1] >= \"0\" && source[i + 1] <= \"9\")) {\n const pos = i;\n if (ch === \"0\" && (source[i + 1] === \"x\" || source[i + 1] === \"X\")) {\n i += 2;\n while (i < len && /[0-9a-fA-F_]/.test(source[i])) i++;\n } else if (ch === \"0\" && (source[i + 1] === \"b\" || source[i + 1] === \"B\")) {\n i += 2;\n while (i < len && /[01_]/.test(source[i])) i++;\n } else if (ch === \"0\" && (source[i + 1] === \"o\" || source[i + 1] === \"O\")) {\n i += 2;\n while (i < len && /[0-7_]/.test(source[i])) i++;\n } else {\n while (i < len && /[0-9_.]/.test(source[i])) i++;\n if (i < len && (source[i] === \"e\" || source[i] === \"E\")) {\n i++;\n if (i < len && (source[i] === \"+\" || source[i] === \"-\")) i++;\n while (i < len && source[i] >= \"0\" && source[i] <= \"9\") i++;\n }\n }\n if (i < len && source[i] === \"i\") i++; // imaginary\n tokens.push({ type: \"number\", start: pos, end: i });\n continue;\n }\n\n // Identifier or keyword\n if (/[a-zA-Z_]/.test(ch)) {\n const pos = i;\n i++;\n while (i < len && /[a-zA-Z0-9_]/.test(source[i])) i++;\n const word = source.slice(pos, i);\n\n let j = i;\n while (j < len && (source[j] === \" \" || source[j] === \"\\t\")) j++;\n\n if (KEYWORDS.has(word)) {\n tokens.push({ type: \"keyword\", start: pos, end: i });\n } else if (TYPES.has(word)) {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else if (BUILTINS.has(word) && source[j] === \"(\") {\n tokens.push({ type: \"function\", start: pos, end: i });\n } else if (source[j] === \"(\") {\n tokens.push({ type: \"function\", start: pos, end: i });\n } else if (word[0] >= \"A\" && word[0] <= \"Z\") {\n tokens.push({ type: \"type\", start: pos, end: i });\n } else {\n tokens.push({ type: \"variable\", start: pos, end: i });\n }\n continue;\n }\n\n // Operators\n if (\"+-*/%=<>!&|^~:\".includes(ch)) {\n const pos = i;\n i++;\n while (i < len && \"+-*/%=<>!&|^~:\".includes(source[i])) i++;\n tokens.push({ type: \"operator\", start: pos, end: i });\n continue;\n }\n\n // Punctuation\n if (\"(){}[];,.\".includes(ch)) {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n continue;\n }\n\n tokens.push({ type: \"plain\", start: i, end: i + 1 });\n i++;\n }\n\n return tokens;\n};\n","import { tok, type Token, type TokenType } from \"../tokenizer\";\n\n/**\n * Minimal, dependency-free Markdown tokenizer for editor highlighting. Line-based\n * for block constructs (fences, headings, blockquotes, list markers) plus a few\n * safe, non-overlapping inline spans (code, bold/italic, links). Good enough to\n * read structure at a glance — not a full CommonMark parse.\n */\nexport function tokenizeMarkdown(source: string): Token[] {\n const tokens: Token[] = [];\n const lines = source.split(\"\\n\");\n let offset = 0;\n let inFence = false;\n\n for (const line of lines) {\n const base = offset;\n const len = line.length;\n offset += len + 1; // +1 for the consumed \"\\n\"\n\n // Fenced code blocks — the fence line + everything inside is one string span.\n if (/^\\s*(```|~~~)/.test(line)) {\n tokens.push(tok(\"string\", base, base + len));\n inFence = !inFence;\n continue;\n }\n if (inFence) {\n tokens.push(tok(\"string\", base, base + len));\n continue;\n }\n\n // ATX heading — whole line.\n if (/^#{1,6}\\s/.test(line)) {\n tokens.push(tok(\"keyword\", base, base + len));\n continue;\n }\n\n // Blockquote — whole line.\n if (/^\\s*>/.test(line)) {\n tokens.push(tok(\"comment\", base, base + len));\n continue;\n }\n\n // List / task marker.\n const list = line.match(/^(\\s*)([-*+]|\\d+\\.)\\s/);\n if (list) {\n const start = base + list[1].length;\n tokens.push(tok(\"operator\", start, start + list[2].length));\n }\n\n pushInline(line, base, tokens);\n }\n\n return tokens;\n}\n\n/** Collect non-overlapping inline spans (code, emphasis, links) in one line. */\nfunction pushInline(line: string, base: number, out: Token[]): void {\n // Cosmetic highlighting only. The inline patterns below necessarily\n // backtrack, so skip pathologically long lines — this bounds total work to\n // O(n) across the document and prevents superlinear (ReDoS) blow-up on\n // adversarial input. Normal markdown lines are far below this threshold.\n if (line.length > 5000) return;\n\n const spans: Token[] = [];\n const add = (type: TokenType, start: number, end: number) => {\n spans.push(tok(type, base + start, base + end));\n };\n\n let m: RegExpExecArray | null;\n\n // Inline code `...`\n const code = /`[^`]+`/g;\n while ((m = code.exec(line))) add(\"string\", m.index, m.index + m[0].length);\n\n // Bold/italic **...** *...* __...__ _..._\n const emph = /(\\*\\*|__)(?=\\S)([\\s\\S]*?\\S)\\1|(\\*|_)(?=\\S)([\\s\\S]*?\\S)\\3/g;\n while ((m = emph.exec(line))) add(\"type\", m.index, m.index + m[0].length);\n\n // Links / images [text](url)\n const link = /!?\\[[^\\]]*\\]\\(([^)]+)\\)/g;\n while ((m = link.exec(line))) {\n add(\"tag\", m.index, m.index + m[0].length - m[1].length - 1);\n const urlStart = m.index + m[0].length - m[1].length - 1;\n add(\"attributeValue\", urlStart, urlStart + m[1].length);\n }\n\n // Order + drop overlaps (longest/earliest wins) so the renderer gets a clean list.\n spans.sort((a, b) => a.start - b.start || b.end - a.end);\n let lastEnd = -1;\n for (const s of spans) {\n if (s.start >= lastEnd) {\n out.push(s);\n lastEnd = s.end;\n }\n }\n}\n","import { registerLanguage } from \"./registry\";\nimport { tokenizeJavaScript } from \"../engine/tokenizers/javascript\";\nimport { tokenizeHtml } from \"../engine/tokenizers/html\";\nimport { tokenizePhp } from \"../engine/tokenizers/php\";\nimport { tokenizePython } from \"../engine/tokenizers/python\";\nimport { tokenizeGo } from \"../engine/tokenizers/go\";\nimport { tokenizeMarkdown } from \"../engine/tokenizers/markdown\";\n\nregisterLanguage({\n name: \"Markdown\",\n aliases: [\"md\", \"markdown\", \"mkd\"],\n tokenize: tokenizeMarkdown,\n});\n\nregisterLanguage({\n name: \"JavaScript\",\n aliases: [\"js\", \"javascript\", \"jsx\"],\n tokenize: tokenizeJavaScript,\n});\n\nregisterLanguage({\n name: \"TypeScript\",\n aliases: [\"ts\", \"typescript\", \"tsx\"],\n tokenize: tokenizeJavaScript, // Same tokenizer — JS/TS syntax is identical for highlighting\n});\n\nregisterLanguage({\n name: \"HTML\",\n aliases: [\"html\", \"htm\"],\n tokenize: tokenizeHtml,\n});\n\nregisterLanguage({\n name: \"PHP\",\n aliases: [\"php\"],\n tokenize: tokenizePhp,\n});\n\nregisterLanguage({\n name: \"Python\",\n aliases: [\"py\", \"python\"],\n tokenize: tokenizePython,\n});\n\nregisterLanguage({\n name: \"Go\",\n aliases: [\"go\", \"golang\"],\n tokenize: tokenizeGo,\n});\n","import { useState } from \"react\";\nimport { cn } from \"@particle-academy/react-fancy\";\nimport { useCodeEditor } from \"./CodeEditor.context\";\nimport { CodeEditorToolbarSeparator } from \"./CodeEditorToolbarSeparator\";\nimport { getRegisteredLanguages } from \"../../languages\";\nimport type { CodeEditorToolbarProps } from \"./CodeEditor.types\";\n\nconst iconBtnClass =\n \"inline-flex items-center justify-center rounded-md p-1 text-zinc-500 transition-colors hover:bg-zinc-100 hover:text-zinc-700 dark:text-zinc-400 dark:hover:bg-zinc-800 dark:hover:text-zinc-200\";\n\nfunction LanguageSelector() {\n const { language, setLanguage } = useCodeEditor();\n const languages = getRegisteredLanguages();\n\n return (\n <select\n value={language}\n onChange={(e) => setLanguage(e.target.value)}\n className=\"h-6 rounded border border-zinc-200 bg-transparent px-1.5 text-[11px] text-zinc-600 outline-none transition-colors hover:border-zinc-300 dark:border-zinc-700 dark:text-zinc-400 dark:hover:border-zinc-600\"\n >\n {languages.map((lang) => (\n <option key={lang} value={lang}>\n {lang}\n </option>\n ))}\n </select>\n );\n}\n\nfunction DefaultToolbarActions() {\n const { copyToClipboard, toggleWordWrap, wordWrap } = useCodeEditor();\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n await copyToClipboard();\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <>\n <LanguageSelector />\n <CodeEditorToolbarSeparator />\n <button\n type=\"button\"\n onClick={toggleWordWrap}\n title={wordWrap ? \"Disable Word Wrap\" : \"Enable Word Wrap\"}\n className={cn(iconBtnClass, wordWrap && \"text-blue-500 dark:text-blue-400\")}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <path d=\"M3 12h15a3 3 0 110 6h-4\" />\n <polyline points=\"16 16 14 18 16 20\" />\n <line x1=\"3\" y1=\"18\" x2=\"10\" y2=\"18\" />\n </svg>\n </button>\n <button type=\"button\" onClick={handleCopy} title=\"Copy to Clipboard\" className={iconBtnClass}>\n {copied ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n )}\n </button>\n </>\n );\n}\n\nexport function CodeEditorToolbar({ children, className }: CodeEditorToolbarProps) {\n const hasChildren = children != null;\n\n return (\n <div\n data-fancy-code-toolbar=\"\"\n className={cn(\n \"flex items-center gap-0.5 border-b border-zinc-200 px-2 py-1 dark:border-zinc-700\",\n className,\n )}\n >\n {hasChildren ? children : <DefaultToolbarActions />}\n </div>\n );\n}\n\nCodeEditorToolbar.displayName = \"CodeEditorToolbar\";\n","import { cn } from \"@particle-academy/react-fancy\";\nimport { useCodeEditor } from \"./CodeEditor.context\";\nimport type { CodeEditorStatusBarProps } from \"./CodeEditor.types\";\n\nexport function CodeEditorStatusBar({ children, className }: CodeEditorStatusBarProps) {\n const { cursorPosition, selectionLength, language, tabSize } = useCodeEditor();\n\n return (\n <div\n data-fancy-code-statusbar=\"\"\n className={cn(\n \"flex items-center gap-3 border-t border-zinc-200 px-3 py-1 text-[11px] text-zinc-500 dark:border-zinc-700 dark:text-zinc-400\",\n className,\n )}\n >\n {children ?? (\n <>\n <span>Ln {cursorPosition.line}, Col {cursorPosition.col}</span>\n {selectionLength > 0 && <span>{selectionLength} selected</span>}\n <span className=\"ml-auto\">{language}</span>\n <span>{tabSize} spaces</span>\n </>\n )}\n </div>\n );\n}\n\nCodeEditorStatusBar.displayName = \"CodeEditorStatusBar\";\n","import type { ThemeDefinition } from \"./types\";\n\nconst themeRegistry = new Map<string, ThemeDefinition>();\n\nexport function registerTheme(theme: ThemeDefinition): void {\n themeRegistry.set(theme.name.toLowerCase(), theme);\n}\n\nexport function getTheme(name: string): ThemeDefinition | undefined {\n return themeRegistry.get(name.toLowerCase());\n}\n\nexport function getRegisteredThemes(): string[] {\n return Array.from(themeRegistry.keys());\n}\n","import { LIGHT_COLORS } from \"@particle-academy/fancy-file-commons\";\nimport { registerTheme } from \"./registry\";\n\n// The palette lives in commons; fancy-code wraps it into a named, registrable\n// theme for its IDE's theme picker + `theme=\"auto\"` resolution.\nregisterTheme({\n name: \"light\",\n variant: \"light\",\n colors: LIGHT_COLORS,\n});\n","import { DARK_COLORS } from \"@particle-academy/fancy-file-commons\";\nimport { registerTheme } from \"./registry\";\n\n// The palette lives in commons; fancy-code wraps it into a named, registrable\n// theme for its IDE's theme picker + `theme=\"auto\"` resolution.\nregisterTheme({\n name: \"dark\",\n variant: \"dark\",\n colors: DARK_COLORS,\n});\n","/**\n * Convert a 1-based `line` / `column` into a 0-based character offset within\n * `text`. Out-of-range values clamp to the document and line bounds, so the\n * result is always a valid offset in `[0, text.length]`.\n *\n * - `line` below 1 clamps to line 1; above the last line clamps to the last line.\n * - `column` below 1 clamps to column 1; past the end of the line clamps to just\n * after the last character (so you can place the caret at the line end).\n */\nexport function lineColumnToOffset(text: string, line: number, column = 1): number {\n const lines = text.split(\"\\n\");\n const targetLine = Math.max(1, Math.min(Math.trunc(line) || 1, lines.length));\n\n let offset = 0;\n for (let i = 0; i < targetLine - 1; i++) {\n offset += lines[i].length + 1; // +1 for the consumed \"\\n\"\n }\n\n const lineText = lines[targetLine - 1] ?? \"\";\n const col = Math.max(1, Math.min(Math.trunc(column) || 1, lineText.length + 1));\n return offset + (col - 1);\n}\n","import { useEffect, useRef, useCallback, useState, useMemo, type RefObject } from \"react\";\nimport { getLanguage } from \"../languages\";\nimport { getTheme } from \"../themes\";\nimport { highlightCode } from \"../engine/highlight\";\nimport { lineColumnToOffset } from \"../engine/position\";\nimport type { ThemeColors } from \"../themes/types\";\nimport type { Tokenizer } from \"../engine/tokenizer\";\n\nexport interface UseEditorEngineOptions {\n containerRef: RefObject<HTMLDivElement | null>;\n value: string;\n onChange?: (value: string) => void;\n language: string;\n theme: string;\n readOnly: boolean;\n lineNumbers: boolean;\n wordWrap: boolean;\n tabSize: number;\n placeholder?: string;\n minHeight?: number;\n maxHeight?: number;\n onCursorChange?: (pos: { line: number; col: number; selectionLength: number }) => void;\n}\n\nexport interface UseEditorEngineReturn {\n textareaRef: RefObject<HTMLTextAreaElement | null>;\n highlightedHtml: string;\n lineCount: number;\n activeLine: number;\n themeColors: ThemeColors;\n handleKeyDown: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n handleInput: () => void;\n handleScroll: () => void;\n handleSelect: () => void;\n /**\n * Place the caret on a 1-based `line` / `column` and scroll the editor so the\n * line is centered in view. Out-of-range positions clamp to document bounds.\n */\n revealLine: (line: number, column?: number, opts?: { focus?: boolean }) => void;\n scrollTop: number;\n scrollLeft: number;\n}\n\nconst DEFAULT_COLORS: ThemeColors = {\n background: \"#18181b\",\n foreground: \"#e4e4e7\",\n gutterBackground: \"#18181b\",\n gutterForeground: \"#52525b\",\n gutterBorder: \"#27272a\",\n activeLineBackground: \"#27272a\",\n selectionBackground: \"#1e3a5f\",\n cursorColor: \"#60a5fa\",\n keyword: \"#c084fc\",\n string: \"#34d399\",\n comment: \"#71717a\",\n number: \"#fbbf24\",\n operator: \"#22d3ee\",\n function: \"#60a5fa\",\n type: \"#fbbf24\",\n tag: \"#f87171\",\n attribute: \"#fbbf24\",\n attributeValue: \"#34d399\",\n punctuation: \"#a1a1aa\",\n variable: \"#e4e4e7\",\n};\n\nexport function useEditorEngine({\n value,\n onChange,\n language,\n theme,\n readOnly,\n wordWrap,\n tabSize,\n onCursorChange,\n}: UseEditorEngineOptions): UseEditorEngineReturn {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const onChangeRef = useRef(onChange);\n const onCursorChangeRef = useRef(onCursorChange);\n onChangeRef.current = onChange;\n onCursorChangeRef.current = onCursorChange;\n\n const [scrollTop, setScrollTop] = useState(0);\n const [scrollLeft, setScrollLeft] = useState(0);\n const [activeLine, setActiveLine] = useState(1);\n\n // Resolve theme colors\n const themeColors = useMemo<ThemeColors>(() => {\n const def = getTheme(theme);\n return def?.colors ?? DEFAULT_COLORS;\n }, [theme]);\n\n // Resolve tokenizer\n const tokenizer = useMemo<Tokenizer | null>(() => {\n const def = getLanguage(language);\n return def?.tokenize ?? null;\n }, [language]);\n\n // Generate highlighted HTML\n const highlightedHtml = useMemo(() => {\n if (!tokenizer) {\n // No tokenizer — just escape HTML\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n }\n const tokens = tokenizer(value);\n return highlightCode(value, tokens, themeColors);\n }, [value, tokenizer, themeColors]);\n\n const lineCount = useMemo(() => {\n let count = 1;\n for (let i = 0; i < value.length; i++) {\n if (value[i] === \"\\n\") count++;\n }\n return count;\n }, [value]);\n\n // Auto-resize textarea to match content so caret is always visible\n const autoResize = useCallback(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n ta.style.height = \"auto\";\n ta.style.height = ta.scrollHeight + \"px\";\n\n if (!wordWrap) {\n // Shrink to 0 to measure true content width, then expand\n ta.style.width = \"0\";\n ta.style.width = ta.scrollWidth + \"px\";\n } else {\n ta.style.width = \"\";\n }\n }, [wordWrap]);\n\n // Sync textarea value and auto-resize when value changes\n useEffect(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n if (ta.value !== value) {\n const { selectionStart, selectionEnd } = ta;\n ta.value = value;\n ta.selectionStart = selectionStart;\n ta.selectionEnd = selectionEnd;\n }\n // Always resize — handles initial mount and external value changes\n autoResize();\n }, [value, autoResize]);\n\n const updateCursorInfo = useCallback(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n const pos = ta.selectionStart;\n const textBefore = ta.value.slice(0, pos);\n const line = (textBefore.match(/\\n/g) || []).length + 1;\n const lastNewline = textBefore.lastIndexOf(\"\\n\");\n const col = pos - lastNewline;\n const selLen = Math.abs(ta.selectionEnd - ta.selectionStart);\n setActiveLine(line);\n onCursorChangeRef.current?.({ line, col, selectionLength: selLen });\n }, []);\n\n const handleInput = useCallback(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n onChangeRef.current?.(ta.value);\n autoResize();\n updateCursorInfo();\n }, [autoResize, updateCursorInfo]);\n\n const handleSelect = useCallback(() => {\n updateCursorInfo();\n }, [updateCursorInfo]);\n\n const handleScroll = useCallback(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n setScrollTop(ta.scrollTop);\n setScrollLeft(ta.scrollLeft);\n }, []);\n\n const revealLine = useCallback(\n (line: number, column = 1, opts?: { focus?: boolean }) => {\n const ta = textareaRef.current;\n if (!ta) return;\n\n const offset = lineColumnToOffset(ta.value, line, column);\n if (opts?.focus) ta.focus();\n ta.selectionStart = ta.selectionEnd = offset;\n updateCursorInfo();\n\n // Scroll the editor's scroll container (the panel) so the target line is\n // centered. The textarea is auto-sized to fit its content, so the panel —\n // not the textarea — is what scrolls.\n const panel = ta.closest<HTMLElement>(\"[data-fancy-code-panel]\");\n if (!panel) return;\n const cs = getComputedStyle(ta);\n const lineHeight = parseFloat(cs.lineHeight) || 19.5;\n const paddingTop = parseFloat(cs.paddingTop) || 0;\n const lineIndex = (ta.value.slice(0, offset).match(/\\n/g) || []).length; // clamped (targetLine - 1)\n const textareaTopInPanel =\n ta.getBoundingClientRect().top - panel.getBoundingClientRect().top + panel.scrollTop;\n const lineTop = textareaTopInPanel + paddingTop + lineIndex * lineHeight;\n const target = lineTop - panel.clientHeight / 2 + lineHeight / 2;\n const maxScroll = panel.scrollHeight - panel.clientHeight;\n panel.scrollTop = Math.max(0, Math.min(target, maxScroll));\n },\n [updateCursorInfo],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (readOnly) {\n // Allow copy shortcuts in read-only mode\n if (e.key === \"c\" && (e.metaKey || e.ctrlKey)) return;\n if (e.key === \"a\" && (e.metaKey || e.ctrlKey)) return;\n e.preventDefault();\n return;\n }\n\n // Tab key — insert spaces\n if (e.key === \"Tab\") {\n e.preventDefault();\n const ta = e.currentTarget;\n const start = ta.selectionStart;\n const end = ta.selectionEnd;\n const spaces = \" \".repeat(tabSize);\n\n if (e.shiftKey) {\n // Dedent: remove leading spaces from selected lines\n const lines = ta.value.split(\"\\n\");\n const startLine = ta.value.slice(0, start).split(\"\\n\").length - 1;\n const endLine = ta.value.slice(0, end).split(\"\\n\").length - 1;\n let removed = 0;\n for (let i = startLine; i <= endLine; i++) {\n const match = lines[i].match(new RegExp(`^ {1,${tabSize}}`));\n if (match) {\n removed += match[0].length;\n lines[i] = lines[i].slice(match[0].length);\n }\n }\n const newValue = lines.join(\"\\n\");\n ta.value = newValue;\n ta.selectionStart = Math.max(0, start - (startLine === endLine ? removed : tabSize));\n ta.selectionEnd = Math.max(0, end - removed);\n onChangeRef.current?.(newValue);\n } else if (start !== end) {\n // Indent selected lines\n const lines = ta.value.split(\"\\n\");\n const startLine = ta.value.slice(0, start).split(\"\\n\").length - 1;\n const endLine = ta.value.slice(0, end).split(\"\\n\").length - 1;\n for (let i = startLine; i <= endLine; i++) {\n lines[i] = spaces + lines[i];\n }\n const newValue = lines.join(\"\\n\");\n ta.value = newValue;\n ta.selectionStart = start + tabSize;\n ta.selectionEnd = end + (endLine - startLine + 1) * tabSize;\n onChangeRef.current?.(newValue);\n } else {\n // Insert tab at cursor\n const before = ta.value.slice(0, start);\n const after = ta.value.slice(end);\n ta.value = before + spaces + after;\n ta.selectionStart = ta.selectionEnd = start + tabSize;\n onChangeRef.current?.(ta.value);\n }\n autoResize();\n updateCursorInfo();\n return;\n }\n\n // Enter — auto-indent\n if (e.key === \"Enter\") {\n e.preventDefault();\n const ta = e.currentTarget;\n const start = ta.selectionStart;\n const end = ta.selectionEnd;\n const before = ta.value.slice(0, start);\n const after = ta.value.slice(end);\n const currentLine = before.split(\"\\n\").pop() || \"\";\n const indent = currentLine.match(/^(\\s*)/)?.[1] || \"\";\n\n // Extra indent after { or (\n const lastChar = before.trimEnd().slice(-1);\n const extraIndent = (lastChar === \"{\" || lastChar === \"(\") ? \" \".repeat(tabSize) : \"\";\n\n const insertion = \"\\n\" + indent + extraIndent;\n ta.value = before + insertion + after;\n ta.selectionStart = ta.selectionEnd = start + insertion.length;\n onChangeRef.current?.(ta.value);\n autoResize();\n updateCursorInfo();\n return;\n }\n },\n [readOnly, tabSize, autoResize, updateCursorInfo],\n );\n\n return {\n textareaRef,\n highlightedHtml,\n lineCount,\n activeLine,\n themeColors,\n handleKeyDown,\n handleInput,\n handleScroll,\n handleSelect,\n revealLine,\n scrollTop,\n scrollLeft,\n };\n}\n","import { useSyncExternalStore } from \"react\";\n\nfunction subscribe(callback: () => void): () => void {\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener(\"change\", callback);\n return () => mq.removeEventListener(\"change\", callback);\n}\n\nfunction getSnapshot(): boolean {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n}\n\nfunction getServerSnapshot(): boolean {\n return false;\n}\n\nexport function useDarkMode(): boolean {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n","import { useEffect, useMemo, useRef, useState, useCallback } from \"react\";\nimport { cn, useControllableState } from \"@particle-academy/react-fancy\";\nimport { annotateLines } from \"@particle-academy/fancy-file-commons\";\nimport { CodeEditorContext } from \"./CodeEditor.context\";\nimport { CodeEditorPanel } from \"./CodeEditorPanel\";\nimport { CodeEditorToolbar } from \"./CodeEditorToolbar\";\nimport { CodeEditorToolbarSeparator } from \"./CodeEditorToolbarSeparator\";\nimport { CodeEditorStatusBar } from \"./CodeEditorStatusBar\";\nimport { useEditorEngine } from \"../../hooks/use-editor-engine\";\nimport { useDarkMode } from \"../../hooks/use-dark-mode\";\nimport { getLanguage } from \"../../languages\";\nimport type { CodeEditorProps, CodeEditorContextValue } from \"./CodeEditor.types\";\n\nfunction CodeEditorRoot({\n children,\n className,\n value: valueProp,\n defaultValue = \"\",\n onChange,\n language: languageProp = \"javascript\",\n onLanguageChange,\n theme = \"auto\",\n readOnly = false,\n lineNumbers: lineNumbersProp = true,\n wordWrap: wordWrapProp = false,\n tabSize: tabSizeProp = 2,\n placeholder,\n minHeight,\n maxHeight,\n cursorLine,\n cursorColumn,\n diffBase,\n highlightLines,\n}: CodeEditorProps) {\n const [currentValue, setCurrentValue] = useControllableState(valueProp, defaultValue, onChange);\n\n // Diff gutter: per-line change marks of the current value vs the baseline.\n // Line-level only (no intra-line segmentation), recomputed as the user types.\n const diffAnnotations = useMemo(\n () => (diffBase == null ? null : annotateLines(diffBase, currentValue)),\n [diffBase, currentValue],\n );\n\n // Reactive dark mode for \"auto\" theme\n const isDark = useDarkMode();\n const resolvedTheme = theme === \"auto\" ? (isDark ? \"dark\" : \"light\") : theme;\n\n // Language state (changeable via toolbar selector)\n const [currentLanguage, setCurrentLanguageState] = useState(() => {\n const def = getLanguage(languageProp);\n return def?.name ?? languageProp;\n });\n\n const setLanguage = useCallback(\n (lang: string) => {\n const def = getLanguage(lang);\n const resolved = def?.name ?? lang;\n setCurrentLanguageState(resolved);\n onLanguageChange?.(resolved);\n },\n [onLanguageChange],\n );\n\n // Toggle states\n const [showLineNumbers, setShowLineNumbers] = useState(lineNumbersProp);\n const [isWordWrap, setIsWordWrap] = useState(wordWrapProp);\n\n // Cursor position\n const [cursorPosition, setCursorPosition] = useState({ line: 1, col: 1 });\n const [selectionLength, setSelectionLength] = useState(0);\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Our custom editor engine\n const engineReturn = useEditorEngine({\n containerRef,\n value: currentValue,\n onChange: setCurrentValue,\n language: currentLanguage,\n theme: resolvedTheme,\n readOnly,\n lineNumbers: showLineNumbers,\n wordWrap: isWordWrap,\n tabSize: tabSizeProp,\n placeholder,\n minHeight,\n maxHeight,\n onCursorChange: ({ line, col, selectionLength: sel }) => {\n setCursorPosition({ line, col });\n setSelectionLength(sel);\n },\n });\n\n // Reveal + place the caret when cursorLine/cursorColumn change (and on mount).\n // revealLine is stable, so this fires only on target change; it runs after the\n // engine's value-sync effect, so the textarea is populated and sized first.\n const { revealLine: revealLineImpl } = engineReturn;\n useEffect(() => {\n if (cursorLine == null) return;\n revealLineImpl(cursorLine, cursorColumn ?? 1, { focus: false });\n }, [cursorLine, cursorColumn, revealLineImpl]);\n\n const contextValue = useMemo<CodeEditorContextValue>(\n () => ({\n getValue: () => engineReturn.textareaRef.current?.value ?? currentValue,\n getSelection: () => {\n const ta = engineReturn.textareaRef.current;\n if (!ta) return \"\";\n return ta.value.slice(ta.selectionStart, ta.selectionEnd);\n },\n setValue: (v: string) => setCurrentValue(v),\n replaceSelection: (text: string) => {\n const ta = engineReturn.textareaRef.current;\n if (!ta) return;\n const start = ta.selectionStart;\n const end = ta.selectionEnd;\n const before = ta.value.slice(0, start);\n const after = ta.value.slice(end);\n ta.value = before + text + after;\n ta.selectionStart = ta.selectionEnd = start + text.length;\n setCurrentValue(ta.value);\n },\n focus: () => engineReturn.textareaRef.current?.focus(),\n revealLine: (line: number, column?: number) =>\n engineReturn.revealLine(line, column ?? 1, { focus: true }),\n setCursor: ({ line, column }: { line: number; column?: number }) =>\n engineReturn.revealLine(line, column ?? 1, { focus: true }),\n language: currentLanguage,\n setLanguage,\n theme: resolvedTheme,\n readOnly,\n lineNumbers: showLineNumbers,\n wordWrap: isWordWrap,\n tabSize: tabSizeProp,\n toggleWordWrap: () => setIsWordWrap((w) => !w),\n toggleLineNumbers: () => setShowLineNumbers((l) => !l),\n copyToClipboard: async () => {\n const text = engineReturn.textareaRef.current?.value ?? currentValue;\n await navigator.clipboard.writeText(text);\n },\n cursorPosition,\n selectionLength,\n textareaRef: engineReturn.textareaRef,\n placeholder,\n diffStats: diffAnnotations\n ? {\n added: diffAnnotations.added,\n modified: diffAnnotations.modified,\n removed: diffAnnotations.removed,\n }\n : null,\n _diffAnnotations: diffAnnotations,\n _engineReturn: engineReturn,\n _minHeight: minHeight,\n _maxHeight: maxHeight,\n _highlightLines: highlightLines,\n }),\n [engineReturn, currentValue, currentLanguage, setLanguage, resolvedTheme, readOnly, showLineNumbers, isWordWrap, tabSizeProp, cursorPosition, selectionLength, setCurrentValue, placeholder, diffAnnotations, minHeight, maxHeight, highlightLines],\n );\n\n return (\n <CodeEditorContext.Provider value={contextValue}>\n <div\n data-fancy-code-editor=\"\"\n className={cn(\n \"overflow-hidden\",\n className,\n )}\n >\n {children}\n </div>\n </CodeEditorContext.Provider>\n );\n}\n\nCodeEditorRoot.displayName = \"CodeEditor\";\n\nconst ToolbarWithSeparator = Object.assign(CodeEditorToolbar, {\n Separator: CodeEditorToolbarSeparator,\n});\n\nexport const CodeEditor = Object.assign(CodeEditorRoot, {\n Toolbar: ToolbarWithSeparator,\n Panel: CodeEditorPanel,\n StatusBar: CodeEditorStatusBar,\n});\n","import { cn, ContentRenderer, useControllableState } from \"@particle-academy/react-fancy\";\nimport { CodeEditor } from \"../CodeEditor\";\n\nexport type MarkdownEditorMode = \"split\" | \"edit\" | \"preview\";\n\nexport interface MarkdownEditorProps {\n /** Controlled markdown value. */\n value?: string;\n /** Initial value (uncontrolled). */\n defaultValue?: string;\n /** Called with the new markdown whenever the document changes. */\n onValueChange?: (markdown: string) => void;\n /**\n * Layout: `split` (editor + live preview side by side), `edit` (editor only),\n * or `preview` (rendered only). Default `split`.\n */\n mode?: MarkdownEditorMode;\n /** Editor theme — `\"light\" | \"dark\" | \"auto\"` or a registered name. Default `auto`. */\n theme?: string;\n /** Prevent editing. */\n readOnly?: boolean;\n /** Show line numbers in the editor (default false — prose reads better without). */\n lineNumbers?: boolean;\n /** Wrap long lines in the editor (default true for prose). */\n wordWrap?: boolean;\n /** Placeholder shown when empty. */\n placeholder?: string;\n /**\n * Height bounds (px). `maxHeight` constrains the PREVIEW pane as well as the\n * editor — it previously reached only the editor, so a long document rendered\n * at full height instead of scrolling.\n */\n minHeight?: number;\n maxHeight?: number;\n className?: string;\n /**\n * Swap the markdown → HTML renderer used by the preview pane.\n *\n * Rarely needed now: the preview renders through react-fancy's\n * `<ContentRenderer format=\"markdown\">`, which is a full CommonMark + GFM\n * parse. Supply this only to impose your own pipeline — the returned HTML is\n * injected as-is, so it must already be sanitised.\n */\n renderPreview?: (markdown: string) => string;\n}\n\n/**\n * A markdown-aware editor: a syntax-highlighted `CodeEditor` (the registered\n * `markdown` language) with an optional live preview pane. Controlled via\n * `value` + `onValueChange`. The preview renders through react-fancy's\n * `<ContentRenderer format=\"markdown\">` — a full CommonMark + GFM parse,\n * sanitised by default. Pass `renderPreview` to impose your own pipeline.\n *\n * ```tsx\n * <MarkdownEditor value={md} onValueChange={setMd} mode=\"split\" minHeight={240} />\n * ```\n */\nexport function MarkdownEditor({\n value,\n defaultValue = \"\",\n onValueChange,\n mode = \"split\",\n theme = \"auto\",\n readOnly = false,\n lineNumbers = false,\n wordWrap = true,\n placeholder,\n minHeight,\n maxHeight,\n className,\n renderPreview,\n}: MarkdownEditorProps) {\n const [content, setContent] = useControllableState(value, defaultValue, onValueChange);\n\n const showEditor = mode !== \"preview\";\n const showPreview = mode !== \"edit\";\n\n return (\n <div\n data-fancy-markdown-editor=\"\"\n data-mode={mode}\n className={cn(\"fancy-md-editor\", className)}\n >\n {showEditor && (\n <div className=\"fancy-md-editor-pane\">\n <CodeEditor\n value={content}\n onChange={setContent}\n language=\"markdown\"\n theme={theme}\n readOnly={readOnly}\n lineNumbers={lineNumbers}\n wordWrap={wordWrap}\n placeholder={placeholder}\n minHeight={minHeight}\n maxHeight={maxHeight}\n >\n <CodeEditor.Panel />\n </CodeEditor>\n </div>\n )}\n {showPreview && (\n <div\n data-fancy-markdown-preview=\"\"\n className=\"fancy-md-preview\"\n style={maxHeight ? { maxHeight, overflowY: \"auto\" } : undefined}\n >\n {renderPreview ? (\n // The host imposed its own pipeline; its HTML is injected as-is and\n // is its own responsibility to sanitise.\n <div dangerouslySetInnerHTML={{ __html: renderPreview(content) }} />\n ) : (\n // The kit's own renderer — a full CommonMark + GFM parse that\n // sanitises by default. `marked` already sits in this tree as a\n // react-fancy runtime dependency, so the built-in renderer this\n // replaced was a second, weaker markdown implementation next to a\n // complete one.\n <ContentRenderer value={content} format=\"markdown\" />\n )}\n </div>\n )}\n </div>\n );\n}\n\nMarkdownEditor.displayName = \"MarkdownEditor\";\n","import { resolveMediaType, type MediaKind } from \"@particle-academy/react-fancy\";\nimport { languageFromFilename } from \"@particle-academy/fancy-file-commons\";\n\n/**\n * The decision a file viewer makes about a file: render it as editable text, or\n * hand it to a media viewer. `media` carries the resolved {@link MediaKind};\n * `text` carries the editor language id.\n */\nexport type FileKind =\n | { kind: \"text\"; language: string }\n | { kind: \"media\"; mediaKind: MediaKind }\n /** Read as a reader sees it (rendered), not as source. `language` is for the source view. */\n | { kind: \"document\"; format: DocumentFormat; language: string }\n /** An Office file: binary, so never text. */\n | { kind: \"office\"; officeKind: OfficeKind };\n\nexport type DocumentFormat = \"markdown\" | \"html\" | \"text\";\nexport type OfficeKind = \"docx\" | \"xlsx\" | \"pptx\";\n\nconst OFFICE_EXT: Record<string, OfficeKind> = { docx: \"docx\", xlsx: \"xlsx\", xlsm: \"xlsx\", pptx: \"pptx\" };\nconst OFFICE_MIME: Record<string, OfficeKind> = {\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \"docx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": \"pptx\",\n};\n// By extension, not by editor language: `.xml` and `.vue` share the html\n// language for highlighting, and neither is a page to render.\nconst DOCUMENT_EXT: Record<string, DocumentFormat> = {\n md: \"markdown\",\n markdown: \"markdown\",\n html: \"html\",\n htm: \"html\",\n txt: \"text\",\n text: \"text\",\n};\nconst DOCUMENT_MIME: Record<string, DocumentFormat> = {\n \"text/markdown\": \"markdown\",\n \"text/x-markdown\": \"markdown\",\n \"text/html\": \"html\",\n \"text/plain\": \"text\",\n};\n\nfunction extensionOf(filename?: string): string {\n const name = (filename ?? \"\").split(/[?#]/)[0].split(\"/\").pop() ?? \"\";\n const dot = name.lastIndexOf(\".\");\n return dot > 0 ? name.slice(dot + 1).toLowerCase() : \"\";\n}\n\nexport interface ResolveFileKindInput {\n /** File name or path — sniffed for an extension (and used for the media check). */\n filename?: string;\n /** MIME type — preferred over the filename when known. */\n mime?: string;\n}\n\n// Filename → language now lives in @particle-academy/fancy-file-commons (the\n// shared core for the file packages — one EXT_LANGUAGE map suite-wide).\n// Re-exported so existing `fancy-code` imports keep working.\nexport { languageFromFilename };\n\n/**\n * Decide whether a file is previewable media (image / video / audio / PDF) or\n * text, from its MIME type (preferred) and/or filename. Media wins when the\n * type resolves to one; otherwise it's text and the editor language is derived\n * from the extension.\n *\n * Exposed so consumers can branch their own chrome (tabs, save buttons) the\n * same way `<FileViewer>` does internally.\n *\n * ```ts\n * resolveFileKind({ filename: \"logo.png\" }); // { kind: \"media\", mediaKind: \"image\" }\n * resolveFileKind({ filename: \"app.tsx\" }); // { kind: \"text\", language: \"typescript\" }\n * resolveFileKind({ mime: \"application/pdf\" }); // { kind: \"media\", mediaKind: \"pdf\" }\n * ```\n */\nexport function resolveFileKind({ filename, mime }: ResolveFileKindInput): FileKind {\n const media = resolveMediaType({ mime, src: filename });\n if (media !== \"unknown\") return { kind: \"media\", mediaKind: media };\n\n const type = (mime ?? \"\").split(\";\")[0].trim().toLowerCase();\n const ext = extensionOf(filename);\n\n const office = OFFICE_MIME[type] ?? OFFICE_EXT[ext];\n if (office) return { kind: \"office\", officeKind: office };\n\n const language = languageFromFilename(filename);\n // The extension wins when it names one: hosts label source `text/plain`.\n // A bare MIME decides only when the name says nothing (no filename, or a\n // plain-text one).\n const format = DOCUMENT_EXT[ext] ?? (language === \"plaintext\" ? DOCUMENT_MIME[type] : undefined);\n if (format) {\n // A text/* MIME with no filename still needs a source-view language.\n const lang = language !== \"plaintext\" ? language : format === \"markdown\" ? \"markdown\" : format === \"html\" ? \"html\" : \"plaintext\";\n return { kind: \"document\", format, language: lang };\n }\n\n return { kind: \"text\", language };\n}\n","import { cn, ContentRenderer, FauxClient, MediaViewer } from \"@particle-academy/react-fancy\";\nimport { CodeEditor } from \"../CodeEditor\";\nimport { resolveFileKind } from \"../../file-type\";\nimport type { FileViewerProps } from \"./FileViewer.types\";\n\n/**\n * A unified file viewer: renders text files in a read-only `CodeEditor` (with\n * syntax highlighting picked from the filename) and media files — image, video,\n * audio, PDF — via react-fancy's `<MediaViewer>`. The text-vs-media decision is\n * made by {@link resolveFileKind}; pass `fileKind` to override it, or call\n * `resolveFileKind` yourself to branch your own chrome (tabs, save buttons).\n *\n * Give the container a height for media files (PDF/image/video fill their box).\n *\n * ```tsx\n * // text\n * <FileViewer filename=\"app.tsx\" value={source} />\n * // media\n * <FileViewer filename=\"logo.png\" src={url} style={{ height: 360 }} />\n * ```\n */\nexport function FileViewer({\n filename,\n mime,\n src,\n value = \"\",\n onChange,\n readOnly = true,\n theme = \"auto\",\n fileKind,\n lineNumbers = true,\n wordWrap = false,\n line,\n column,\n highlightLines,\n minHeight,\n maxHeight,\n mediaProps,\n view = \"rendered\",\n frameProps,\n className,\n style,\n}: FileViewerProps) {\n const resolved = fileKind ?? resolveFileKind({ filename, mime });\n\n // A document reads as a reader sees it. Its source is shown instead when the\n // caller is editing, asked for it, or wants to land on a line (a line is a\n // place in the source, not in the rendered page).\n if (resolved.kind === \"document\" && view === \"rendered\" && readOnly && line == null) {\n return (\n <div\n data-fancy-file-viewer=\"\"\n data-kind=\"document\"\n data-format={resolved.format}\n className={className}\n style={style}\n >\n <FauxClient variant=\"device\" controls fill bodyClassName=\"overflow-auto\" {...frameProps}>\n <div className=\"px-6 py-5\">\n <ContentRenderer\n value={resolved.format === \"text\" ? textToHtml(value) : value}\n format={resolved.format === \"markdown\" ? \"markdown\" : \"html\"}\n />\n </div>\n </FauxClient>\n </div>\n );\n }\n\n // Office files are binary: never text. Until a viewer for the format is wired\n // in, they get MediaViewer's \"no preview\" card with a download.\n if (resolved.kind === \"office\") {\n return (\n <div\n data-fancy-file-viewer=\"\"\n data-kind=\"office\"\n data-office-kind={resolved.officeKind}\n className={cn(\"overflow-hidden\", className)}\n style={style}\n >\n <MediaViewer src={src ?? \"\"} mime={mime} alt={filename} className=\"h-full w-full\" />\n </div>\n );\n }\n\n if (resolved.kind === \"media\") {\n // Image / video / PDF fill the sized wrapper so a height set on FileViewer\n // reaches the viewer; audio is a fixed-height card and shouldn't stretch.\n const { className: mediaClassName, ...restMediaProps } = mediaProps ?? {};\n // Images and PDFs carry the FauxClient frame every file viewer does; a\n // caller can still pass `frame: false` through `mediaProps`.\n restMediaProps.imageProps = { frame: true, frameProps, ...restMediaProps.imageProps };\n restMediaProps.pdfProps = { frame: true, frameProps, ...restMediaProps.pdfProps };\n const fill = resolved.mediaKind !== \"audio\";\n return (\n <div\n data-fancy-file-viewer=\"\"\n data-kind=\"media\"\n data-media-kind={resolved.mediaKind}\n className={cn(\"overflow-hidden\", className)}\n style={style}\n >\n <MediaViewer\n src={src ?? \"\"}\n mime={mime}\n alt={filename}\n kind={resolved.mediaKind}\n className={cn(fill && \"h-full w-full\", mediaClassName)}\n {...restMediaProps}\n />\n </div>\n );\n }\n\n return (\n <div\n data-fancy-file-viewer=\"\"\n data-kind=\"text\"\n className={className}\n style={style}\n >\n <CodeEditor\n value={value}\n onChange={readOnly ? undefined : onChange}\n language={resolved.language}\n theme={theme}\n readOnly={readOnly}\n lineNumbers={lineNumbers}\n wordWrap={wordWrap}\n minHeight={minHeight}\n maxHeight={maxHeight}\n // CodeEditor already reveals `cursorLine` on mount and on change; this\n // component never passed one through, so a viewer could not land anywhere.\n cursorLine={line}\n cursorColumn={column}\n highlightLines={highlightLines ?? (line != null ? [line] : undefined)}\n >\n <CodeEditor.Panel />\n </CodeEditor>\n </div>\n );\n}\n\nFileViewer.displayName = \"FileViewer\";\n\nconst ESCAPES: Record<string, string> = { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" };\n\n/**\n * Plain text as HTML a reader would expect: a blank line is a new paragraph, a\n * single newline a line break, and every character escaped -- `*x*` in a text\n * file is asterisks, not emphasis, so it is not given to the Markdown renderer.\n */\nfunction textToHtml(text: string): string {\n return text\n .replace(/\\r\\n?/g, \"\\n\")\n .split(/\\n{2,}/)\n .filter((block) => block.trim() !== \"\")\n .map((block) => `<p>${block.replace(/[&<>\"']/g, (c) => ESCAPES[c]).replace(/\\n/g, \"<br>\")}</p>`)\n .join(\"\");\n}\n","/**\n * Tiny, dependency-free Markdown → HTML renderer for the MarkdownEditor preview\n * pane. Covers the common subset — headings, bold/italic, inline + fenced code,\n * links, images, blockquotes, ordered/unordered lists, hr, and paragraphs. Input\n * is HTML-escaped first, so raw HTML in the source is shown as text (safe by\n * default). Not a full CommonMark implementation; swap in a real renderer\n * downstream if you need one.\n */\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\n/**\n * Escape a value for use inside a double-quoted HTML attribute. Adds quote\n * escaping on top of `escapeHtml`'s `&<>` so the value can't break out of the\n * attribute. Apply to text that has already been `escapeHtml`-ed.\n */\nfunction escapeAttr(s: string): string {\n return s.replace(/\"/g, \"&quot;\").replace(/'/g, \"&#39;\");\n}\n\n/** Schemes a link may use. Anything else with a scheme renders as plain text. */\nconst LINK_SCHEMES = new Set([\"http\", \"https\", \"mailto\", \"tel\"]);\n\n/**\n * The scheme a browser would see in this URL, or null for a relative URL.\n *\n * Normalised the way the URL parser does it: leading C0 controls and spaces are\n * stripped and tab / CR / LF are removed anywhere, so `\" javascript:\"` and a\n * scheme split by a tab are both caught. Case-insensitive.\n */\nfunction schemeOf(url: string): string | null {\n let s = \"\";\n for (const ch of url) {\n const code = ch.codePointAt(0) ?? 0;\n if (code === 9 || code === 10 || code === 13) continue;\n if (s === \"\" && code <= 32) continue;\n s += ch;\n }\n const m = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(s);\n return m ? m[1].toLowerCase() : null;\n}\n\n/**\n * Is this URL safe in a preview inserted with innerHTML?\n *\n * The preview bypasses React, so React's `javascript:` guard never sees it. A\n * relative URL is always fine; an absolute one must use an allowed scheme, and\n * an image may additionally be a raster `data:image/...`. The input has already\n * been HTML-escaped, which neutralises entity-encoded schemes on its own.\n */\nfunction safeUrl(url: string, kind: \"link\" | \"image\"): boolean {\n const scheme = schemeOf(url);\n if (scheme === null) return true;\n if (scheme === \"http\" || scheme === \"https\") return true;\n if (kind === \"link\") return LINK_SCHEMES.has(scheme);\n return scheme === \"data\" && /^data:image\\/(png|jpe?g|gif|webp|avif|bmp);/i.test(url.trim());\n}\n\n/** Inline spans — run on already-escaped text. */\nfunction inline(text: string): string {\n return text\n // images ![alt](src) -- an unsafe src keeps only its alt text\n .replace(/!\\[([^\\]]*)\\]\\(([^)\\s]+)(?:\\s+\"([^\"]*)\")?\\)/g, (_m, alt, src, title) =>\n safeUrl(src, \"image\")\n ? `<img src=\"${escapeAttr(src)}\" alt=\"${escapeAttr(alt)}\"${title ? ` title=\"${escapeAttr(title)}\"` : \"\"}>`\n : alt)\n // links [text](href) -- an unsafe href keeps only its text\n .replace(/\\[([^\\]]+)\\]\\(([^)\\s]+)(?:\\s+\"([^\"]*)\")?\\)/g, (_m, t, href, title) =>\n safeUrl(href, \"link\")\n ? `<a href=\"${escapeAttr(href)}\"${title ? ` title=\"${escapeAttr(title)}\"` : \"\"} rel=\"noopener\">${t}</a>`\n : t)\n // inline code `code`\n .replace(/`([^`]+)`/g, (_m, c) => `<code>${c}</code>`)\n // bold **x** / __x__\n .replace(/(\\*\\*|__)(?=\\S)([\\s\\S]*?\\S)\\1/g, \"<strong>$2</strong>\")\n // italic *x* / _x_\n .replace(/(\\*|_)(?=\\S)([\\s\\S]*?\\S)\\1/g, \"<em>$2</em>\");\n}\n\nexport function renderMarkdown(markdown: string): string {\n const lines = markdown.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const out: string[] = [];\n\n let i = 0;\n let para: string[] = [];\n let listType: \"ul\" | \"ol\" | null = null;\n\n const flushPara = () => {\n if (para.length) {\n out.push(`<p>${inline(para.join(\" \"))}</p>`);\n para = [];\n }\n };\n const closeList = () => {\n if (listType) {\n out.push(`</${listType}>`);\n listType = null;\n }\n };\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Fenced code block\n const fence = line.match(/^\\s*(```|~~~)(.*)$/);\n if (fence) {\n flushPara();\n closeList();\n const lang = fence[2].trim();\n const body: string[] = [];\n i++;\n while (i < lines.length && !/^\\s*(```|~~~)/.test(lines[i])) {\n body.push(lines[i]);\n i++;\n }\n i++; // consume closing fence\n out.push(`<pre><code${lang ? ` class=\"language-${escapeAttr(escapeHtml(lang))}\"` : \"\"}>${escapeHtml(body.join(\"\\n\"))}</code></pre>`);\n continue;\n }\n\n const esc = escapeHtml(line);\n\n // Blank line — paragraph/list break\n if (/^\\s*$/.test(line)) {\n flushPara();\n closeList();\n i++;\n continue;\n }\n\n // Heading\n const heading = esc.match(/^(#{1,6})\\s+(.*)$/);\n if (heading) {\n flushPara();\n closeList();\n const level = heading[1].length;\n out.push(`<h${level}>${inline(heading[2])}</h${level}>`);\n i++;\n continue;\n }\n\n // Horizontal rule\n if (/^\\s*([-*_])(\\s*\\1){2,}\\s*$/.test(line)) {\n flushPara();\n closeList();\n out.push(\"<hr>\");\n i++;\n continue;\n }\n\n // Blockquote (single-level)\n const quote = esc.match(/^\\s*&gt;\\s?(.*)$/);\n if (quote) {\n flushPara();\n closeList();\n out.push(`<blockquote>${inline(quote[1])}</blockquote>`);\n i++;\n continue;\n }\n\n // List item\n const ol = esc.match(/^\\s*\\d+\\.\\s+(.*)$/);\n const ul = esc.match(/^\\s*[-*+]\\s+(.*)$/);\n if (ol || ul) {\n flushPara();\n const type: \"ul\" | \"ol\" = ol ? \"ol\" : \"ul\";\n if (listType !== type) {\n closeList();\n out.push(`<${type}>`);\n listType = type;\n }\n out.push(`<li>${inline((ol ?? ul)![1])}</li>`);\n i++;\n continue;\n }\n\n // Plain paragraph text (accumulate)\n closeList();\n para.push(esc);\n i++;\n }\n\n flushPara();\n closeList();\n return out.join(\"\\n\");\n}\n","import { useMemo } from \"react\";\nimport {\n InputTag,\n textareaAdapter,\n type InputTagAdapter,\n type InputTagProps,\n type InputTagTriggers,\n} from \"@particle-academy/react-fancy\";\nimport { useCodeEditor } from \"./components/CodeEditor/CodeEditor.context\";\n\n/**\n * Glue between `@particle-academy/react-fancy`'s `<InputTag>` and the\n * `<CodeEditor>` from this package. `<CodeEditor>` renders a real DOM\n * `<textarea>` under its overlay, so the existing `textareaAdapter`\n * just works — this module hands it the right ref via the editor\n * context.\n *\n * <CodeEditor value={code} onChange={setCode} language=\"markdown\">\n * <CodeEditor.Toolbar />\n * <CodeEditor.Panel />\n * <CodeEditorInputTag\n * triggers={{\n * \"/\": { items: commands, insert: (c) => `${c.name} ` },\n * \"@\": { items: mentions, insert: (m) => `@${m.name} ` },\n * }}\n * />\n * </CodeEditor>\n *\n * Must be rendered as a descendant of `<CodeEditor>` (it reads the\n * editor's context). For ad-hoc wiring outside the component tree,\n * pull the textarea ref off the context and call `textareaAdapter`\n * yourself.\n */\n\n/**\n * Hook form — returns an `InputTagAdapter` bound to the surrounding\n * `<CodeEditor>`. Useful when you want to compose your own picker UI\n * around the same adapter.\n */\nexport function useCodeEditorInputTagAdapter(): InputTagAdapter {\n const ctx = useCodeEditor();\n return useMemo(() => textareaAdapter(ctx.textareaRef), [ctx.textareaRef]);\n}\n\nexport interface CodeEditorInputTagProps extends Omit<InputTagProps, \"adapter\"> {\n triggers: InputTagTriggers;\n}\n\n/**\n * Convenience wrapper — renders `<InputTag>` already wired to the\n * surrounding `<CodeEditor>`'s textarea. Equivalent to:\n *\n * const adapter = useCodeEditorInputTagAdapter();\n * return <InputTag adapter={adapter} {...rest} />;\n */\nexport function CodeEditorInputTag(props: CodeEditorInputTagProps) {\n const adapter = useCodeEditorInputTagAdapter();\n return <InputTag adapter={adapter} {...props} />;\n}\n"]}