@particle-academy/fancy-code 0.3.0 → 0.4.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/README.md +27 -1
- package/dist/index.cjs +381 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +381 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/CodeEditor/CodeEditor.context.ts","../src/components/CodeEditor/CodeEditorPanel.tsx","../src/components/CodeEditor/CodeEditorToolbarSeparator.tsx","../src/languages/registry.ts","../src/engine/tokenizers/javascript.ts","../src/engine/tokenizers/html.ts","../src/engine/tokenizers/php.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/highlight.ts","../src/hooks/use-editor-engine.ts","../src/hooks/use-dark-mode.ts","../src/components/CodeEditor/CodeEditor.tsx"],"names":["jsx","pos","jsxs","cn","Fragment","useState","useMemo","useCallback","useRef"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\r\nimport type { CodeEditorContextValue } from \"./CodeEditor.types\";\r\n\r\nexport const CodeEditorContext = createContext<CodeEditorContextValue | null>(null);\r\n\r\nexport function useCodeEditor(): CodeEditorContextValue {\r\n const ctx = useContext(CodeEditorContext);\r\n if (!ctx) {\r\n throw new Error(\"useCodeEditor must be used within a <CodeEditor> component\");\r\n }\r\n return ctx;\r\n}\r\n","import { useMemo } from \"react\";\nimport { cn } from \"@particle-academy/react-fancy\";\nimport { useCodeEditor } from \"./CodeEditor.context\";\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 _maxHeight,\n _minHeight,\n } = useCodeEditor();\n\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 lineNumberElements = useMemo(() => {\n if (!lineNumbers) return null;\n const lines = [];\n for (let i = 1; i <= lineCount; i++) {\n lines.push(\n <div\n key={i}\n style={{\n color: i === activeLine ? themeColors.foreground : themeColors.gutterForeground,\n backgroundColor: i === activeLine ? themeColors.activeLineBackground : undefined,\n }}\n className=\"pr-3 text-right text-[13px] leading-[1.5] select-none\"\n >\n {i}\n </div>,\n );\n }\n return lines;\n }, [lineNumbers, lineCount, activeLine, themeColors]);\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=\"relative min-w-0 flex-1\">\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=\"relative m-0 block w-full resize-none overflow-hidden border-none bg-transparent p-2.5 text-[13px] leading-[1.5] text-transparent outline-none\"\n style={{\n caretColor: themeColors.cursorColor,\n minHeight: _minHeight ? _minHeight - 40 : 80,\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() {\r\n return (\r\n <div\r\n data-fancy-code-toolbar-separator=\"\"\r\n className=\"mx-1 h-4 w-px bg-zinc-200 dark:bg-zinc-700\"\r\n />\r\n );\r\n}\r\n\r\nCodeEditorToolbarSeparator.displayName = \"CodeEditorToolbarSeparator\";\r\n","import type { LanguageDefinition } from \"./types\";\r\n\r\nconst languageRegistry = new Map<string, LanguageDefinition>();\r\n\r\nexport function registerLanguage(def: LanguageDefinition): void {\r\n languageRegistry.set(def.name.toLowerCase(), def);\r\n if (def.aliases) {\r\n for (const alias of def.aliases) {\r\n languageRegistry.set(alias.toLowerCase(), def);\r\n }\r\n }\r\n}\r\n\r\nexport function getLanguage(name: string): LanguageDefinition | undefined {\r\n return languageRegistry.get(name.toLowerCase());\r\n}\r\n\r\nexport function getRegisteredLanguages(): string[] {\r\n const seen = new Set<LanguageDefinition>();\r\n const names: string[] = [];\r\n for (const [, def] of languageRegistry) {\r\n if (!seen.has(def)) {\r\n seen.add(def);\r\n names.push(def.name);\r\n }\r\n }\r\n return names;\r\n}\r\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\";\n\nexport const tokenizeHtml: Tokenizer = (source: string): Token[] => {\n const tokens: Token[] = [];\n const len = source.length;\n let i = 0;\n\n while (i < len) {\n // HTML comment\n if (source[i] === \"<\" && source.slice(i, i + 4) === \"<!--\") {\n const pos = i;\n i += 4;\n while (i < len && source.slice(i, i + 3) !== \"-->\") i++;\n i += 3;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Doctype\n if (source[i] === \"<\" && source.slice(i, i + 9).toUpperCase() === \"<!DOCTYPE\") {\n const pos = i;\n while (i < len && source[i] !== \">\") i++;\n i++;\n tokens.push({ type: \"keyword\", start: pos, end: i });\n continue;\n }\n\n // Tag (opening or closing)\n if (source[i] === \"<\") {\n // Opening bracket\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n\n // Closing slash\n if (i < len && source[i] === \"/\") {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n }\n\n // Tag name\n if (i < len && /[a-zA-Z]/.test(source[i])) {\n const pos = i;\n while (i < len && /[a-zA-Z0-9-]/.test(source[i])) i++;\n tokens.push({ type: \"tag\", start: pos, end: i });\n }\n\n // Attributes\n while (i < len && source[i] !== \">\" && !(source[i] === \"/\" && source[i + 1] === \">\")) {\n // Whitespace\n if (source[i] === \" \" || source[i] === \"\\t\" || source[i] === \"\\n\" || source[i] === \"\\r\") {\n i++;\n continue;\n }\n\n // Attribute name\n if (/[a-zA-Z_@:]/.test(source[i])) {\n const pos = i;\n while (i < len && /[a-zA-Z0-9_\\-:.]/.test(source[i])) i++;\n tokens.push({ type: \"attribute\", start: pos, end: i });\n\n // Skip whitespace around =\n while (i < len && (source[i] === \" \" || source[i] === \"\\t\")) i++;\n\n // Equals sign\n if (i < len && source[i] === \"=\") {\n tokens.push({ type: \"operator\", start: i, end: i + 1 });\n i++;\n\n // Skip whitespace\n while (i < len && (source[i] === \" \" || source[i] === \"\\t\")) i++;\n\n // Attribute value\n if (i < len && (source[i] === '\"' || source[i] === \"'\")) {\n const quote = source[i];\n const pos = i;\n i++;\n while (i < len && source[i] !== quote) i++;\n i++;\n tokens.push({ type: \"attributeValue\", start: pos, end: i });\n } else if (i < len && /[^\\s>]/.test(source[i])) {\n const pos = i;\n while (i < len && /[^\\s>]/.test(source[i])) i++;\n tokens.push({ type: \"attributeValue\", start: pos, end: i });\n }\n }\n continue;\n }\n\n // Skip unknown chars inside tag\n i++;\n }\n\n // Self-closing slash\n if (i < len && source[i] === \"/\") {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n }\n\n // Closing bracket\n if (i < len && source[i] === \">\") {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n }\n\n continue;\n }\n\n // Text content — skip to next tag or special\n const pos = i;\n while (i < len && source[i] !== \"<\") i++;\n if (i > pos) {\n tokens.push({ type: \"plain\", start: pos, end: i });\n }\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 { registerLanguage } from \"./registry\";\nimport { tokenizeJavaScript } from \"../engine/tokenizers/javascript\";\nimport { tokenizeHtml } from \"../engine/tokenizers/html\";\nimport { tokenizePhp } from \"../engine/tokenizers/php\";\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","import { useState } from \"react\";\r\nimport { cn } from \"@particle-academy/react-fancy\";\r\nimport { useCodeEditor } from \"./CodeEditor.context\";\r\nimport { CodeEditorToolbarSeparator } from \"./CodeEditorToolbarSeparator\";\r\nimport { getRegisteredLanguages } from \"../../languages\";\r\nimport type { CodeEditorToolbarProps } from \"./CodeEditor.types\";\r\n\r\nconst iconBtnClass =\r\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\";\r\n\r\nfunction LanguageSelector() {\r\n const { language, setLanguage } = useCodeEditor();\r\n const languages = getRegisteredLanguages();\r\n\r\n return (\r\n <select\r\n value={language}\r\n onChange={(e) => setLanguage(e.target.value)}\r\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\"\r\n >\r\n {languages.map((lang) => (\r\n <option key={lang} value={lang}>\r\n {lang}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n}\r\n\r\nfunction DefaultToolbarActions() {\r\n const { copyToClipboard, toggleWordWrap, wordWrap } = useCodeEditor();\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleCopy = async () => {\r\n await copyToClipboard();\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 1500);\r\n };\r\n\r\n return (\r\n <>\r\n <LanguageSelector />\r\n <CodeEditorToolbarSeparator />\r\n <button\r\n type=\"button\"\r\n onClick={toggleWordWrap}\r\n title={wordWrap ? \"Disable Word Wrap\" : \"Enable Word Wrap\"}\r\n className={cn(iconBtnClass, wordWrap && \"text-blue-500 dark:text-blue-400\")}\r\n >\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <path d=\"M3 12h15a3 3 0 110 6h-4\" />\r\n <polyline points=\"16 16 14 18 16 20\" />\r\n <line x1=\"3\" y1=\"18\" x2=\"10\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n <button type=\"button\" onClick={handleCopy} title=\"Copy to Clipboard\" className={iconBtnClass}>\r\n {copied ? (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n ) : (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\r\n </svg>\r\n )}\r\n </button>\r\n </>\r\n );\r\n}\r\n\r\nexport function CodeEditorToolbar({ children, className }: CodeEditorToolbarProps) {\r\n const hasChildren = children != null;\r\n\r\n return (\r\n <div\r\n data-fancy-code-toolbar=\"\"\r\n className={cn(\r\n \"flex items-center gap-0.5 border-b border-zinc-200 px-2 py-1 dark:border-zinc-700\",\r\n className,\r\n )}\r\n >\r\n {hasChildren ? children : <DefaultToolbarActions />}\r\n </div>\r\n );\r\n}\r\n\r\nCodeEditorToolbar.displayName = \"CodeEditorToolbar\";\r\n","import { cn } from \"@particle-academy/react-fancy\";\r\nimport { useCodeEditor } from \"./CodeEditor.context\";\r\nimport type { CodeEditorStatusBarProps } from \"./CodeEditor.types\";\r\n\r\nexport function CodeEditorStatusBar({ children, className }: CodeEditorStatusBarProps) {\r\n const { cursorPosition, selectionLength, language, tabSize } = useCodeEditor();\r\n\r\n return (\r\n <div\r\n data-fancy-code-statusbar=\"\"\r\n className={cn(\r\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\",\r\n className,\r\n )}\r\n >\r\n {children ?? (\r\n <>\r\n <span>Ln {cursorPosition.line}, Col {cursorPosition.col}</span>\r\n {selectionLength > 0 && <span>{selectionLength} selected</span>}\r\n <span className=\"ml-auto\">{language}</span>\r\n <span>{tabSize} spaces</span>\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nCodeEditorStatusBar.displayName = \"CodeEditorStatusBar\";\r\n","import type { ThemeDefinition } from \"./types\";\r\n\r\nconst themeRegistry = new Map<string, ThemeDefinition>();\r\n\r\nexport function registerTheme(theme: ThemeDefinition): void {\r\n themeRegistry.set(theme.name.toLowerCase(), theme);\r\n}\r\n\r\nexport function getTheme(name: string): ThemeDefinition | undefined {\r\n return themeRegistry.get(name.toLowerCase());\r\n}\r\n\r\nexport function getRegisteredThemes(): string[] {\r\n return Array.from(themeRegistry.keys());\r\n}\r\n","import { registerTheme } from \"./registry\";\n\nregisterTheme({\n name: \"light\",\n variant: \"light\",\n colors: {\n background: \"#ffffff\",\n foreground: \"#1e1e2e\",\n gutterBackground: \"#f8fafc\",\n gutterForeground: \"#94a3b8\",\n gutterBorder: \"#e2e8f0\",\n activeLineBackground: \"#f8fafc\",\n selectionBackground: \"#dbeafe\",\n cursorColor: \"#3b82f6\",\n keyword: \"#8b5cf6\",\n string: \"#059669\",\n comment: \"#94a3b8\",\n number: \"#d97706\",\n operator: \"#0891b2\",\n function: \"#2563eb\",\n type: \"#d97706\",\n tag: \"#dc2626\",\n attribute: \"#d97706\",\n attributeValue: \"#059669\",\n punctuation: \"#64748b\",\n variable: \"#1e1e2e\",\n },\n});\n","import { registerTheme } from \"./registry\";\n\nregisterTheme({\n name: \"dark\",\n variant: \"dark\",\n colors: {\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});\n","import type { Token, TokenType } from \"./tokenizer\";\nimport type { ThemeColors } from \"../themes/types\";\n\n/**\n * Escape HTML special characters.\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\n/**\n * Convert source code + tokens + theme colors into highlighted HTML.\n * Returns an HTML string with <span> elements for each token.\n */\nexport function highlightCode(source: string, tokens: Token[], colors: ThemeColors): string {\n if (tokens.length === 0) return escapeHtml(source);\n\n const colorMap: Record<TokenType, string> = {\n keyword: colors.keyword,\n string: colors.string,\n comment: colors.comment,\n number: colors.number,\n operator: colors.operator,\n function: colors.function,\n type: colors.type,\n tag: colors.tag,\n attribute: colors.attribute,\n attributeValue: colors.attributeValue,\n punctuation: colors.punctuation,\n variable: colors.variable,\n plain: colors.foreground,\n };\n\n const parts: string[] = [];\n let pos = 0;\n\n for (const token of tokens) {\n // Plain text before this token\n if (token.start > pos) {\n parts.push(escapeHtml(source.slice(pos, token.start)));\n }\n\n const text = escapeHtml(source.slice(token.start, token.end));\n const color = colorMap[token.type];\n const style = token.type === \"comment\"\n ? `color:${color};font-style:italic`\n : `color:${color}`;\n\n parts.push(`<span style=\"${style}\">${text}</span>`);\n pos = token.end;\n }\n\n // Remaining text after last token\n if (pos < source.length) {\n parts.push(escapeHtml(source.slice(pos)));\n }\n\n return parts.join(\"\");\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 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 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 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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\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 // Sync textarea value when controlled value changes externally\n useEffect(() => {\n const ta = textareaRef.current;\n if (!ta || ta.value === value) return;\n const { selectionStart, selectionEnd } = ta;\n ta.value = value;\n ta.selectionStart = selectionStart;\n ta.selectionEnd = selectionEnd;\n }, [value]);\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 updateCursorInfo();\n }, [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 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 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 updateCursorInfo();\n return;\n }\n },\n [readOnly, tabSize, updateCursorInfo],\n );\n\n return {\n textareaRef,\n highlightedHtml,\n lineCount,\n activeLine,\n themeColors,\n handleKeyDown,\n handleInput,\n handleScroll,\n handleSelect,\n scrollTop,\n scrollLeft,\n };\n}\n","import { useSyncExternalStore } from \"react\";\r\n\r\nfunction subscribe(callback: () => void): () => void {\r\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\r\n mq.addEventListener(\"change\", callback);\r\n return () => mq.removeEventListener(\"change\", callback);\r\n}\r\n\r\nfunction getSnapshot(): boolean {\r\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\r\n}\r\n\r\nfunction getServerSnapshot(): boolean {\r\n return false;\r\n}\r\n\r\nexport function useDarkMode(): boolean {\r\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\r\n}\r\n","import { useMemo, useRef, useState, useCallback } from \"react\";\nimport { cn, useControllableState } from \"@particle-academy/react-fancy\";\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}: CodeEditorProps) {\n const [currentValue, setCurrentValue] = useControllableState(valueProp, defaultValue, onChange);\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 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 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 placeholder,\n _engineReturn: engineReturn,\n _minHeight: minHeight,\n _maxHeight: maxHeight,\n }),\n [engineReturn, currentValue, currentLanguage, setLanguage, resolvedTheme, readOnly, showLineNumbers, isWordWrap, tabSizeProp, cursorPosition, selectionLength, setCurrentValue, placeholder, minHeight, maxHeight],\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/CodeEditor/CodeEditor.context.ts","../src/components/CodeEditor/CodeEditorPanel.tsx","../src/components/CodeEditor/CodeEditorToolbarSeparator.tsx","../src/languages/registry.ts","../src/engine/tokenizers/javascript.ts","../src/engine/tokenizers/html.ts","../src/engine/tokenizers/php.ts","../src/engine/tokenizers/python.ts","../src/engine/tokenizers/go.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/highlight.ts","../src/hooks/use-editor-engine.ts","../src/hooks/use-dark-mode.ts","../src/components/CodeEditor/CodeEditor.tsx"],"names":["jsx","pos","KEYWORDS","TYPES","jsxs","cn","Fragment","useState","useMemo","useCallback","useRef"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\r\nimport type { CodeEditorContextValue } from \"./CodeEditor.types\";\r\n\r\nexport const CodeEditorContext = createContext<CodeEditorContextValue | null>(null);\r\n\r\nexport function useCodeEditor(): CodeEditorContextValue {\r\n const ctx = useContext(CodeEditorContext);\r\n if (!ctx) {\r\n throw new Error(\"useCodeEditor must be used within a <CodeEditor> component\");\r\n }\r\n return ctx;\r\n}\r\n","import { useMemo } from \"react\";\nimport { cn } from \"@particle-academy/react-fancy\";\nimport { useCodeEditor } from \"./CodeEditor.context\";\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 _maxHeight,\n _minHeight,\n } = useCodeEditor();\n\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 lineNumberElements = useMemo(() => {\n if (!lineNumbers) return null;\n const lines = [];\n for (let i = 1; i <= lineCount; i++) {\n lines.push(\n <div\n key={i}\n style={{\n color: i === activeLine ? themeColors.foreground : themeColors.gutterForeground,\n backgroundColor: i === activeLine ? themeColors.activeLineBackground : undefined,\n }}\n className=\"pr-3 text-right text-[13px] leading-[1.5] select-none\"\n >\n {i}\n </div>,\n );\n }\n return lines;\n }, [lineNumbers, lineCount, activeLine, themeColors]);\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=\"relative min-w-0 flex-1\">\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=\"relative m-0 block w-full resize-none overflow-hidden border-none bg-transparent p-2.5 text-[13px] leading-[1.5] text-transparent outline-none\"\n style={{\n caretColor: themeColors.cursorColor,\n minHeight: _minHeight ? _minHeight - 40 : 80,\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() {\r\n return (\r\n <div\r\n data-fancy-code-toolbar-separator=\"\"\r\n className=\"mx-1 h-4 w-px bg-zinc-200 dark:bg-zinc-700\"\r\n />\r\n );\r\n}\r\n\r\nCodeEditorToolbarSeparator.displayName = \"CodeEditorToolbarSeparator\";\r\n","import type { LanguageDefinition } from \"./types\";\r\n\r\nconst languageRegistry = new Map<string, LanguageDefinition>();\r\n\r\nexport function registerLanguage(def: LanguageDefinition): void {\r\n languageRegistry.set(def.name.toLowerCase(), def);\r\n if (def.aliases) {\r\n for (const alias of def.aliases) {\r\n languageRegistry.set(alias.toLowerCase(), def);\r\n }\r\n }\r\n}\r\n\r\nexport function getLanguage(name: string): LanguageDefinition | undefined {\r\n return languageRegistry.get(name.toLowerCase());\r\n}\r\n\r\nexport function getRegisteredLanguages(): string[] {\r\n const seen = new Set<LanguageDefinition>();\r\n const names: string[] = [];\r\n for (const [, def] of languageRegistry) {\r\n if (!seen.has(def)) {\r\n seen.add(def);\r\n names.push(def.name);\r\n }\r\n }\r\n return names;\r\n}\r\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\";\n\nexport const tokenizeHtml: Tokenizer = (source: string): Token[] => {\n const tokens: Token[] = [];\n const len = source.length;\n let i = 0;\n\n while (i < len) {\n // HTML comment\n if (source[i] === \"<\" && source.slice(i, i + 4) === \"<!--\") {\n const pos = i;\n i += 4;\n while (i < len && source.slice(i, i + 3) !== \"-->\") i++;\n i += 3;\n tokens.push({ type: \"comment\", start: pos, end: i });\n continue;\n }\n\n // Doctype\n if (source[i] === \"<\" && source.slice(i, i + 9).toUpperCase() === \"<!DOCTYPE\") {\n const pos = i;\n while (i < len && source[i] !== \">\") i++;\n i++;\n tokens.push({ type: \"keyword\", start: pos, end: i });\n continue;\n }\n\n // Tag (opening or closing)\n if (source[i] === \"<\") {\n // Opening bracket\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n\n // Closing slash\n if (i < len && source[i] === \"/\") {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n }\n\n // Tag name\n if (i < len && /[a-zA-Z]/.test(source[i])) {\n const pos = i;\n while (i < len && /[a-zA-Z0-9-]/.test(source[i])) i++;\n tokens.push({ type: \"tag\", start: pos, end: i });\n }\n\n // Attributes\n while (i < len && source[i] !== \">\" && !(source[i] === \"/\" && source[i + 1] === \">\")) {\n // Whitespace\n if (source[i] === \" \" || source[i] === \"\\t\" || source[i] === \"\\n\" || source[i] === \"\\r\") {\n i++;\n continue;\n }\n\n // Attribute name\n if (/[a-zA-Z_@:]/.test(source[i])) {\n const pos = i;\n while (i < len && /[a-zA-Z0-9_\\-:.]/.test(source[i])) i++;\n tokens.push({ type: \"attribute\", start: pos, end: i });\n\n // Skip whitespace around =\n while (i < len && (source[i] === \" \" || source[i] === \"\\t\")) i++;\n\n // Equals sign\n if (i < len && source[i] === \"=\") {\n tokens.push({ type: \"operator\", start: i, end: i + 1 });\n i++;\n\n // Skip whitespace\n while (i < len && (source[i] === \" \" || source[i] === \"\\t\")) i++;\n\n // Attribute value\n if (i < len && (source[i] === '\"' || source[i] === \"'\")) {\n const quote = source[i];\n const pos = i;\n i++;\n while (i < len && source[i] !== quote) i++;\n i++;\n tokens.push({ type: \"attributeValue\", start: pos, end: i });\n } else if (i < len && /[^\\s>]/.test(source[i])) {\n const pos = i;\n while (i < len && /[^\\s>]/.test(source[i])) i++;\n tokens.push({ type: \"attributeValue\", start: pos, end: i });\n }\n }\n continue;\n }\n\n // Skip unknown chars inside tag\n i++;\n }\n\n // Self-closing slash\n if (i < len && source[i] === \"/\") {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n }\n\n // Closing bracket\n if (i < len && source[i] === \">\") {\n tokens.push({ type: \"punctuation\", start: i, end: i + 1 });\n i++;\n }\n\n continue;\n }\n\n // Text content — skip to next tag or special\n const pos = i;\n while (i < len && source[i] !== \"<\") i++;\n if (i > pos) {\n tokens.push({ type: \"plain\", start: pos, end: i });\n }\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 { 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\";\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\";\r\nimport { cn } from \"@particle-academy/react-fancy\";\r\nimport { useCodeEditor } from \"./CodeEditor.context\";\r\nimport { CodeEditorToolbarSeparator } from \"./CodeEditorToolbarSeparator\";\r\nimport { getRegisteredLanguages } from \"../../languages\";\r\nimport type { CodeEditorToolbarProps } from \"./CodeEditor.types\";\r\n\r\nconst iconBtnClass =\r\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\";\r\n\r\nfunction LanguageSelector() {\r\n const { language, setLanguage } = useCodeEditor();\r\n const languages = getRegisteredLanguages();\r\n\r\n return (\r\n <select\r\n value={language}\r\n onChange={(e) => setLanguage(e.target.value)}\r\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\"\r\n >\r\n {languages.map((lang) => (\r\n <option key={lang} value={lang}>\r\n {lang}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n}\r\n\r\nfunction DefaultToolbarActions() {\r\n const { copyToClipboard, toggleWordWrap, wordWrap } = useCodeEditor();\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleCopy = async () => {\r\n await copyToClipboard();\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 1500);\r\n };\r\n\r\n return (\r\n <>\r\n <LanguageSelector />\r\n <CodeEditorToolbarSeparator />\r\n <button\r\n type=\"button\"\r\n onClick={toggleWordWrap}\r\n title={wordWrap ? \"Disable Word Wrap\" : \"Enable Word Wrap\"}\r\n className={cn(iconBtnClass, wordWrap && \"text-blue-500 dark:text-blue-400\")}\r\n >\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <path d=\"M3 12h15a3 3 0 110 6h-4\" />\r\n <polyline points=\"16 16 14 18 16 20\" />\r\n <line x1=\"3\" y1=\"18\" x2=\"10\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n <button type=\"button\" onClick={handleCopy} title=\"Copy to Clipboard\" className={iconBtnClass}>\r\n {copied ? (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n ) : (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\r\n </svg>\r\n )}\r\n </button>\r\n </>\r\n );\r\n}\r\n\r\nexport function CodeEditorToolbar({ children, className }: CodeEditorToolbarProps) {\r\n const hasChildren = children != null;\r\n\r\n return (\r\n <div\r\n data-fancy-code-toolbar=\"\"\r\n className={cn(\r\n \"flex items-center gap-0.5 border-b border-zinc-200 px-2 py-1 dark:border-zinc-700\",\r\n className,\r\n )}\r\n >\r\n {hasChildren ? children : <DefaultToolbarActions />}\r\n </div>\r\n );\r\n}\r\n\r\nCodeEditorToolbar.displayName = \"CodeEditorToolbar\";\r\n","import { cn } from \"@particle-academy/react-fancy\";\r\nimport { useCodeEditor } from \"./CodeEditor.context\";\r\nimport type { CodeEditorStatusBarProps } from \"./CodeEditor.types\";\r\n\r\nexport function CodeEditorStatusBar({ children, className }: CodeEditorStatusBarProps) {\r\n const { cursorPosition, selectionLength, language, tabSize } = useCodeEditor();\r\n\r\n return (\r\n <div\r\n data-fancy-code-statusbar=\"\"\r\n className={cn(\r\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\",\r\n className,\r\n )}\r\n >\r\n {children ?? (\r\n <>\r\n <span>Ln {cursorPosition.line}, Col {cursorPosition.col}</span>\r\n {selectionLength > 0 && <span>{selectionLength} selected</span>}\r\n <span className=\"ml-auto\">{language}</span>\r\n <span>{tabSize} spaces</span>\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nCodeEditorStatusBar.displayName = \"CodeEditorStatusBar\";\r\n","import type { ThemeDefinition } from \"./types\";\r\n\r\nconst themeRegistry = new Map<string, ThemeDefinition>();\r\n\r\nexport function registerTheme(theme: ThemeDefinition): void {\r\n themeRegistry.set(theme.name.toLowerCase(), theme);\r\n}\r\n\r\nexport function getTheme(name: string): ThemeDefinition | undefined {\r\n return themeRegistry.get(name.toLowerCase());\r\n}\r\n\r\nexport function getRegisteredThemes(): string[] {\r\n return Array.from(themeRegistry.keys());\r\n}\r\n","import { registerTheme } from \"./registry\";\n\nregisterTheme({\n name: \"light\",\n variant: \"light\",\n colors: {\n background: \"#ffffff\",\n foreground: \"#1e1e2e\",\n gutterBackground: \"#f8fafc\",\n gutterForeground: \"#94a3b8\",\n gutterBorder: \"#e2e8f0\",\n activeLineBackground: \"#f8fafc\",\n selectionBackground: \"#dbeafe\",\n cursorColor: \"#3b82f6\",\n keyword: \"#8b5cf6\",\n string: \"#059669\",\n comment: \"#94a3b8\",\n number: \"#d97706\",\n operator: \"#0891b2\",\n function: \"#2563eb\",\n type: \"#d97706\",\n tag: \"#dc2626\",\n attribute: \"#d97706\",\n attributeValue: \"#059669\",\n punctuation: \"#64748b\",\n variable: \"#1e1e2e\",\n },\n});\n","import { registerTheme } from \"./registry\";\n\nregisterTheme({\n name: \"dark\",\n variant: \"dark\",\n colors: {\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});\n","import type { Token, TokenType } from \"./tokenizer\";\nimport type { ThemeColors } from \"../themes/types\";\n\n/**\n * Escape HTML special characters.\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\n/**\n * Convert source code + tokens + theme colors into highlighted HTML.\n * Returns an HTML string with <span> elements for each token.\n */\nexport function highlightCode(source: string, tokens: Token[], colors: ThemeColors): string {\n if (tokens.length === 0) return escapeHtml(source);\n\n const colorMap: Record<TokenType, string> = {\n keyword: colors.keyword,\n string: colors.string,\n comment: colors.comment,\n number: colors.number,\n operator: colors.operator,\n function: colors.function,\n type: colors.type,\n tag: colors.tag,\n attribute: colors.attribute,\n attributeValue: colors.attributeValue,\n punctuation: colors.punctuation,\n variable: colors.variable,\n plain: colors.foreground,\n };\n\n const parts: string[] = [];\n let pos = 0;\n\n for (const token of tokens) {\n // Plain text before this token\n if (token.start > pos) {\n parts.push(escapeHtml(source.slice(pos, token.start)));\n }\n\n const text = escapeHtml(source.slice(token.start, token.end));\n const color = colorMap[token.type];\n const style = token.type === \"comment\"\n ? `color:${color};font-style:italic`\n : `color:${color}`;\n\n parts.push(`<span style=\"${style}\">${text}</span>`);\n pos = token.end;\n }\n\n // Remaining text after last token\n if (pos < source.length) {\n parts.push(escapeHtml(source.slice(pos)));\n }\n\n return parts.join(\"\");\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 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 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 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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\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 // Sync textarea value when controlled value changes externally\n useEffect(() => {\n const ta = textareaRef.current;\n if (!ta || ta.value === value) return;\n const { selectionStart, selectionEnd } = ta;\n ta.value = value;\n ta.selectionStart = selectionStart;\n ta.selectionEnd = selectionEnd;\n }, [value]);\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 updateCursorInfo();\n }, [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 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 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 updateCursorInfo();\n return;\n }\n },\n [readOnly, tabSize, updateCursorInfo],\n );\n\n return {\n textareaRef,\n highlightedHtml,\n lineCount,\n activeLine,\n themeColors,\n handleKeyDown,\n handleInput,\n handleScroll,\n handleSelect,\n scrollTop,\n scrollLeft,\n };\n}\n","import { useSyncExternalStore } from \"react\";\r\n\r\nfunction subscribe(callback: () => void): () => void {\r\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\r\n mq.addEventListener(\"change\", callback);\r\n return () => mq.removeEventListener(\"change\", callback);\r\n}\r\n\r\nfunction getSnapshot(): boolean {\r\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\r\n}\r\n\r\nfunction getServerSnapshot(): boolean {\r\n return false;\r\n}\r\n\r\nexport function useDarkMode(): boolean {\r\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\r\n}\r\n","import { useMemo, useRef, useState, useCallback } from \"react\";\nimport { cn, useControllableState } from \"@particle-academy/react-fancy\";\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}: CodeEditorProps) {\n const [currentValue, setCurrentValue] = useControllableState(valueProp, defaultValue, onChange);\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 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 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 placeholder,\n _engineReturn: engineReturn,\n _minHeight: minHeight,\n _maxHeight: maxHeight,\n }),\n [engineReturn, currentValue, currentLanguage, setLanguage, resolvedTheme, readOnly, showLineNumbers, isWordWrap, tabSizeProp, cursorPosition, selectionLength, setCurrentValue, placeholder, minHeight, maxHeight],\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"]}
|
package/package.json
CHANGED