@particle-academy/fancy-code 0.1.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.
@@ -0,0 +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/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/hooks/use-codemirror.ts","../src/hooks/use-dark-mode.ts","../src/components/CodeEditor/CodeEditor.tsx"],"names":["createContext","useContext","jsx","cn","javascript","html","php","useState","jsxs","Fragment","EditorView","HighlightStyle","tags","editorTheme","highlightStyle","syntaxHighlighting","language","useRef","Compartment","useEffect","state","EditorState","lineNumbersExt","highlightActiveLineGutter","placeholderExt","history","foldGutter","drawSelection","dropCursor","indentOnInput","bracketMatching","closeBrackets","autocompletion","highlightActiveLine","highlightSelectionMatches","keymap","closeBracketsKeymap","defaultKeymap","searchKeymap","historyKeymap","foldKeymap","completionKeymap","indentWithTab","view","useSyncExternalStore","useControllableState","useCallback","useMemo"],"mappings":"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","file":"index.cjs","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","import { 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 { _containerRef } = useCodeEditor();\n\n return (\n <div\n data-fancy-code-panel=\"\"\n ref={_containerRef}\n className={cn(\"text-sm\", className)}\n />\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 { javascript } from \"@codemirror/lang-javascript\";\nimport { html } from \"@codemirror/lang-html\";\nimport { php } from \"@codemirror/lang-php\";\nimport { registerLanguage } from \"./registry\";\n\nregisterLanguage({\n name: \"JavaScript\",\n aliases: [\"js\", \"javascript\", \"jsx\"],\n support: () => javascript({ jsx: true }),\n});\n\nregisterLanguage({\n name: \"TypeScript\",\n aliases: [\"ts\", \"typescript\", \"tsx\"],\n support: () => javascript({ typescript: true, jsx: true }),\n});\n\nregisterLanguage({\n name: \"HTML\",\n aliases: [\"html\", \"htm\"],\n support: () => html(),\n});\n\nregisterLanguage({\n name: \"PHP\",\n aliases: [\"php\"],\n support: () => php(),\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 { EditorView } from \"@codemirror/view\";\nimport { HighlightStyle } from \"@codemirror/language\";\nimport { tags } from \"@lezer/highlight\";\nimport { registerTheme } from \"./registry\";\n\nconst editorTheme = EditorView.theme(\n {\n \"&\": {\n backgroundColor: \"#ffffff\",\n color: \"#1e1e2e\",\n },\n \".cm-content\": {\n caretColor: \"#3b82f6\",\n },\n \".cm-cursor, .cm-dropCursor\": {\n borderLeftColor: \"#3b82f6\",\n },\n \"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection\": {\n backgroundColor: \"#dbeafe\",\n },\n \".cm-activeLine\": {\n backgroundColor: \"#f8fafc\",\n },\n \".cm-gutters\": {\n backgroundColor: \"#f8fafc\",\n color: \"#94a3b8\",\n borderRight: \"1px solid #e2e8f0\",\n },\n \".cm-activeLineGutter\": {\n backgroundColor: \"#f1f5f9\",\n color: \"#475569\",\n },\n \".cm-foldPlaceholder\": {\n backgroundColor: \"#e2e8f0\",\n color: \"#64748b\",\n border: \"none\",\n },\n \".cm-tooltip\": {\n backgroundColor: \"#ffffff\",\n border: \"1px solid #e2e8f0\",\n },\n \".cm-tooltip .cm-tooltip-arrow:before\": {\n borderTopColor: \"#e2e8f0\",\n borderBottomColor: \"#e2e8f0\",\n },\n \".cm-tooltip .cm-tooltip-arrow:after\": {\n borderTopColor: \"#ffffff\",\n borderBottomColor: \"#ffffff\",\n },\n \".cm-tooltip-autocomplete\": {\n \"& > ul > li[aria-selected]\": {\n backgroundColor: \"#dbeafe\",\n color: \"#1e40af\",\n },\n },\n \".cm-searchMatch\": {\n backgroundColor: \"#fef08a\",\n outline: \"1px solid #facc15\",\n },\n \".cm-searchMatch.cm-searchMatch-selected\": {\n backgroundColor: \"#bbf7d0\",\n outline: \"1px solid #22c55e\",\n },\n \".cm-selectionMatch\": {\n backgroundColor: \"#e0f2fe\",\n },\n \".cm-matchingBracket, .cm-nonmatchingBracket\": {\n outline: \"1px solid #94a3b8\",\n },\n \".cm-matchingBracket\": {\n backgroundColor: \"#e0f2fe\",\n },\n },\n { dark: false },\n);\n\nconst highlightStyle = HighlightStyle.define([\n { tag: tags.keyword, color: \"#8b5cf6\" },\n { tag: [tags.name, tags.deleted, tags.character, tags.macroName], color: \"#1e1e2e\" },\n { tag: [tags.function(tags.variableName), tags.labelName], color: \"#2563eb\" },\n { tag: [tags.color, tags.constant(tags.name), tags.standard(tags.name)], color: \"#d97706\" },\n { tag: [tags.definition(tags.name), tags.separator], color: \"#1e1e2e\" },\n { tag: [tags.typeName, tags.className, tags.number, tags.changed, tags.annotation, tags.modifier, tags.self, tags.namespace], color: \"#d97706\" },\n { tag: [tags.operator, tags.operatorKeyword, tags.url, tags.escape, tags.regexp, tags.link, tags.special(tags.string)], color: \"#0891b2\" },\n { tag: [tags.meta, tags.comment], color: \"#94a3b8\", fontStyle: \"italic\" },\n { tag: tags.strong, fontWeight: \"bold\" },\n { tag: tags.emphasis, fontStyle: \"italic\" },\n { tag: tags.strikethrough, textDecoration: \"line-through\" },\n { tag: tags.link, color: \"#2563eb\", textDecoration: \"underline\" },\n { tag: tags.heading, fontWeight: \"bold\", color: \"#8b5cf6\" },\n { tag: [tags.atom, tags.bool, tags.special(tags.variableName)], color: \"#d97706\" },\n { tag: [tags.processingInstruction, tags.string, tags.inserted], color: \"#059669\" },\n { tag: tags.invalid, color: \"#ef4444\" },\n { tag: tags.tagName, color: \"#dc2626\" },\n { tag: tags.attributeName, color: \"#d97706\" },\n { tag: tags.attributeValue, color: \"#059669\" },\n]);\n\nregisterTheme({\n name: \"light\",\n variant: \"light\",\n editorTheme,\n highlightStyle,\n});\n","import { EditorView } from \"@codemirror/view\";\nimport { HighlightStyle } from \"@codemirror/language\";\nimport { tags } from \"@lezer/highlight\";\nimport { registerTheme } from \"./registry\";\n\nconst editorTheme = EditorView.theme(\n {\n \"&\": {\n backgroundColor: \"#18181b\",\n color: \"#e4e4e7\",\n },\n \".cm-content\": {\n caretColor: \"#60a5fa\",\n },\n \".cm-cursor, .cm-dropCursor\": {\n borderLeftColor: \"#60a5fa\",\n },\n \"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection\": {\n backgroundColor: \"#1e3a5f\",\n },\n \".cm-activeLine\": {\n backgroundColor: \"#27272a\",\n },\n \".cm-gutters\": {\n backgroundColor: \"#18181b\",\n color: \"#52525b\",\n borderRight: \"1px solid #27272a\",\n },\n \".cm-activeLineGutter\": {\n backgroundColor: \"#27272a\",\n color: \"#a1a1aa\",\n },\n \".cm-foldPlaceholder\": {\n backgroundColor: \"#3f3f46\",\n color: \"#a1a1aa\",\n border: \"none\",\n },\n \".cm-tooltip\": {\n backgroundColor: \"#27272a\",\n border: \"1px solid #3f3f46\",\n color: \"#e4e4e7\",\n },\n \".cm-tooltip .cm-tooltip-arrow:before\": {\n borderTopColor: \"#3f3f46\",\n borderBottomColor: \"#3f3f46\",\n },\n \".cm-tooltip .cm-tooltip-arrow:after\": {\n borderTopColor: \"#27272a\",\n borderBottomColor: \"#27272a\",\n },\n \".cm-tooltip-autocomplete\": {\n \"& > ul > li[aria-selected]\": {\n backgroundColor: \"#1e3a5f\",\n color: \"#93c5fd\",\n },\n },\n \".cm-searchMatch\": {\n backgroundColor: \"#854d0e\",\n outline: \"1px solid #a16207\",\n },\n \".cm-searchMatch.cm-searchMatch-selected\": {\n backgroundColor: \"#166534\",\n outline: \"1px solid #15803d\",\n },\n \".cm-selectionMatch\": {\n backgroundColor: \"#1e3a5f\",\n },\n \".cm-matchingBracket, .cm-nonmatchingBracket\": {\n outline: \"1px solid #71717a\",\n },\n \".cm-matchingBracket\": {\n backgroundColor: \"#3f3f46\",\n },\n },\n { dark: true },\n);\n\nconst highlightStyle = HighlightStyle.define([\n { tag: tags.keyword, color: \"#c084fc\" },\n { tag: [tags.name, tags.deleted, tags.character, tags.macroName], color: \"#e4e4e7\" },\n { tag: [tags.function(tags.variableName), tags.labelName], color: \"#60a5fa\" },\n { tag: [tags.color, tags.constant(tags.name), tags.standard(tags.name)], color: \"#fbbf24\" },\n { tag: [tags.definition(tags.name), tags.separator], color: \"#e4e4e7\" },\n { tag: [tags.typeName, tags.className, tags.number, tags.changed, tags.annotation, tags.modifier, tags.self, tags.namespace], color: \"#fbbf24\" },\n { tag: [tags.operator, tags.operatorKeyword, tags.url, tags.escape, tags.regexp, tags.link, tags.special(tags.string)], color: \"#22d3ee\" },\n { tag: [tags.meta, tags.comment], color: \"#71717a\", fontStyle: \"italic\" },\n { tag: tags.strong, fontWeight: \"bold\" },\n { tag: tags.emphasis, fontStyle: \"italic\" },\n { tag: tags.strikethrough, textDecoration: \"line-through\" },\n { tag: tags.link, color: \"#60a5fa\", textDecoration: \"underline\" },\n { tag: tags.heading, fontWeight: \"bold\", color: \"#c084fc\" },\n { tag: [tags.atom, tags.bool, tags.special(tags.variableName)], color: \"#fbbf24\" },\n { tag: [tags.processingInstruction, tags.string, tags.inserted], color: \"#34d399\" },\n { tag: tags.invalid, color: \"#f87171\" },\n { tag: tags.tagName, color: \"#f87171\" },\n { tag: tags.attributeName, color: \"#fbbf24\" },\n { tag: tags.attributeValue, color: \"#34d399\" },\n]);\n\nregisterTheme({\n name: \"dark\",\n variant: \"dark\",\n editorTheme,\n highlightStyle,\n});\n","import { useEffect, useRef, type RefObject } from \"react\";\nimport { EditorState, Compartment, type Extension } from \"@codemirror/state\";\nimport { EditorView, keymap, lineNumbers as lineNumbersExt, highlightActiveLine, highlightActiveLineGutter, drawSelection, dropCursor, placeholder as placeholderExt } from \"@codemirror/view\";\nimport { defaultKeymap, history, historyKeymap, indentWithTab } from \"@codemirror/commands\";\nimport { syntaxHighlighting, indentOnInput, bracketMatching, foldGutter, foldKeymap } from \"@codemirror/language\";\nimport { searchKeymap, highlightSelectionMatches } from \"@codemirror/search\";\nimport { autocompletion, completionKeymap, closeBrackets, closeBracketsKeymap } from \"@codemirror/autocomplete\";\nimport { getLanguage } from \"../languages\";\nimport { getTheme } from \"../themes\";\n\nexport interface UseCodemirrorOptions {\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 searchEnabled: boolean;\n additionalExtensions?: Extension[];\n onCursorChange?: (pos: { line: number; col: number; selectionLength: number }) => void;\n}\n\nexport interface UseCodemirrorReturn {\n view: EditorView | null;\n}\n\nfunction resolveLanguageExtension(name: string): Extension {\n const def = getLanguage(name);\n if (!def) return [];\n const result = def.support();\n if (result instanceof Promise) {\n // Async languages are not supported in the initial render; return empty\n return [];\n }\n return result;\n}\n\nfunction resolveThemeExtensions(name: string): Extension[] {\n const def = getTheme(name);\n if (!def) {\n const fallback = getTheme(\"dark\");\n if (!fallback) return [];\n return [fallback.editorTheme, syntaxHighlighting(fallback.highlightStyle)];\n }\n return [def.editorTheme, syntaxHighlighting(def.highlightStyle)];\n}\n\nexport function useCodemirror({\n containerRef,\n value,\n onChange,\n language,\n theme,\n readOnly,\n lineNumbers,\n wordWrap,\n tabSize,\n placeholder,\n minHeight,\n maxHeight,\n searchEnabled,\n additionalExtensions,\n onCursorChange,\n}: UseCodemirrorOptions): UseCodemirrorReturn {\n const viewRef = useRef<EditorView | null>(null);\n const isExternalUpdate = useRef(false);\n const onChangeRef = useRef(onChange);\n const onCursorChangeRef = useRef(onCursorChange);\n onChangeRef.current = onChange;\n onCursorChangeRef.current = onCursorChange;\n\n // Compartments for reconfigurable extensions\n const languageComp = useRef(new Compartment());\n const themeComp = useRef(new Compartment());\n const lineNumbersComp = useRef(new Compartment());\n const wrapComp = useRef(new Compartment());\n const tabSizeComp = useRef(new Compartment());\n const readOnlyComp = useRef(new Compartment());\n const placeholderComp = useRef(new Compartment());\n const heightComp = useRef(new Compartment());\n\n // Build height theme extension\n function buildHeightExtension(min?: number, max?: number): Extension {\n const styles: Record<string, string> = {};\n if (min) styles.minHeight = `${min}px`;\n if (max) styles.maxHeight = `${max}px`;\n if (Object.keys(styles).length === 0) return [];\n return EditorView.theme({\n \"&\": { ...(max ? { maxHeight: `${max}px` } : {}) },\n \".cm-scroller\": { overflow: \"auto\", ...styles },\n });\n }\n\n // Create the editor on mount\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const updateListener = EditorView.updateListener.of((update) => {\n if (update.docChanged && !isExternalUpdate.current) {\n onChangeRef.current?.(update.state.doc.toString());\n }\n if (update.selectionSet || update.docChanged) {\n const pos = update.state.selection.main;\n const line = update.state.doc.lineAt(pos.head);\n onCursorChangeRef.current?.({\n line: line.number,\n col: pos.head - line.from + 1,\n selectionLength: Math.abs(pos.to - pos.from),\n });\n }\n });\n\n const state = EditorState.create({\n doc: value,\n extensions: [\n // Compartmentalized extensions\n languageComp.current.of(resolveLanguageExtension(language)),\n themeComp.current.of(resolveThemeExtensions(theme)),\n lineNumbersComp.current.of(lineNumbers ? [lineNumbersExt(), highlightActiveLineGutter()] : []),\n wrapComp.current.of(wordWrap ? EditorView.lineWrapping : []),\n tabSizeComp.current.of(EditorState.tabSize.of(tabSize)),\n readOnlyComp.current.of(EditorState.readOnly.of(readOnly)),\n placeholderComp.current.of(placeholder ? placeholderExt(placeholder) : []),\n heightComp.current.of(buildHeightExtension(minHeight, maxHeight)),\n // Static extensions\n history(),\n foldGutter(),\n drawSelection(),\n dropCursor(),\n indentOnInput(),\n bracketMatching(),\n closeBrackets(),\n autocompletion(),\n highlightActiveLine(),\n highlightSelectionMatches(),\n keymap.of([\n ...closeBracketsKeymap,\n ...defaultKeymap,\n ...searchKeymap,\n ...historyKeymap,\n ...foldKeymap,\n ...completionKeymap,\n indentWithTab,\n ]),\n updateListener,\n ...(additionalExtensions ?? []),\n ],\n });\n\n const view = new EditorView({ state, parent: container });\n viewRef.current = view;\n\n return () => {\n view.destroy();\n viewRef.current = null;\n };\n // Only run on mount/unmount — compartments handle reconfig\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerRef]);\n\n // Sync external value changes\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n const currentDoc = view.state.doc.toString();\n if (value !== currentDoc) {\n isExternalUpdate.current = true;\n view.dispatch({\n changes: { from: 0, to: currentDoc.length, insert: value },\n });\n isExternalUpdate.current = false;\n }\n }, [value]);\n\n // Reconfigure language\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n\n const def = getLanguage(language);\n if (!def) {\n view.dispatch({ effects: languageComp.current.reconfigure([]) });\n return;\n }\n\n const result = def.support();\n if (result instanceof Promise) {\n result.then((ext) => {\n if (viewRef.current) {\n viewRef.current.dispatch({ effects: languageComp.current.reconfigure(ext) });\n }\n });\n } else {\n view.dispatch({ effects: languageComp.current.reconfigure(result) });\n }\n }, [language]);\n\n // Reconfigure theme\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n view.dispatch({ effects: themeComp.current.reconfigure(resolveThemeExtensions(theme)) });\n }, [theme]);\n\n // Reconfigure line numbers\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n view.dispatch({\n effects: lineNumbersComp.current.reconfigure(\n lineNumbers ? [lineNumbersExt(), highlightActiveLineGutter()] : [],\n ),\n });\n }, [lineNumbers]);\n\n // Reconfigure word wrap\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n view.dispatch({\n effects: wrapComp.current.reconfigure(wordWrap ? EditorView.lineWrapping : []),\n });\n }, [wordWrap]);\n\n // Reconfigure tab size\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n view.dispatch({\n effects: tabSizeComp.current.reconfigure(EditorState.tabSize.of(tabSize)),\n });\n }, [tabSize]);\n\n // Reconfigure read-only\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n view.dispatch({\n effects: readOnlyComp.current.reconfigure(EditorState.readOnly.of(readOnly)),\n });\n }, [readOnly]);\n\n // Reconfigure placeholder\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n view.dispatch({\n effects: placeholderComp.current.reconfigure(placeholder ? placeholderExt(placeholder) : []),\n });\n }, [placeholder]);\n\n return { view: viewRef.current };\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 { 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 { useCodemirror } from \"../../hooks/use-codemirror\";\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 extensions: additionalExtensions,\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 // Resolve to display name\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 // Container ref for CodeMirror mount\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Core CodeMirror hook\n const { view } = useCodemirror({\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 searchEnabled: true,\n additionalExtensions,\n onCursorChange: ({ line, col, selectionLength: sel }) => {\n setCursorPosition({ line, col });\n setSelectionLength(sel);\n },\n });\n\n const contextValue = useMemo<CodeEditorContextValue>(\n () => ({\n view,\n getValue: () => view?.state.doc.toString() ?? currentValue,\n getSelection: () => {\n if (!view) return \"\";\n const sel = view.state.selection.main;\n return view.state.sliceDoc(sel.from, sel.to);\n },\n setValue: (v: string) => setCurrentValue(v),\n replaceSelection: (text: string) => {\n if (!view) return;\n view.dispatch(view.state.replaceSelection(text));\n },\n focus: () => view?.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 = view?.state.doc.toString() ?? currentValue;\n await navigator.clipboard.writeText(text);\n },\n cursorPosition,\n selectionLength,\n _containerRef: containerRef,\n _minHeight: minHeight,\n _maxHeight: maxHeight,\n }),\n [view, currentValue, currentLanguage, setLanguage, resolvedTheme, readOnly, showLineNumbers, isWordWrap, tabSizeProp, cursorPosition, selectionLength, setCurrentValue, minHeight, maxHeight],\n );\n\n return (\n <CodeEditorContext.Provider value={contextValue}>\n <div\n data-fancy-code-editor=\"\"\n className={cn(\n \"overflow-hidden rounded-xl border border-zinc-200 bg-white dark:border-zinc-700 dark:bg-zinc-900\",\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"]}
@@ -0,0 +1,160 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode, RefObject } from 'react';
3
+ import { Extension } from '@codemirror/state';
4
+ import { EditorView } from '@codemirror/view';
5
+ import { LanguageSupport, HighlightStyle } from '@codemirror/language';
6
+
7
+ interface CodeEditorProps {
8
+ children: ReactNode;
9
+ className?: string;
10
+ /** Controlled value */
11
+ value?: string;
12
+ /** Initial value (uncontrolled) */
13
+ defaultValue?: string;
14
+ /** Called when the document changes */
15
+ onChange?: (value: string) => void;
16
+ /** Language name or alias (default: "javascript") */
17
+ language?: string;
18
+ /** Called when the language changes via the toolbar selector */
19
+ onLanguageChange?: (lang: string) => void;
20
+ /** Theme name: "light", "dark", "auto", or a custom registered name (default: "auto") */
21
+ theme?: string;
22
+ /** Prevent editing (default: false) */
23
+ readOnly?: boolean;
24
+ /** Show line numbers (default: true) */
25
+ lineNumbers?: boolean;
26
+ /** Enable word wrap (default: false) */
27
+ wordWrap?: boolean;
28
+ /** Tab size in spaces (default: 2) */
29
+ tabSize?: number;
30
+ /** Placeholder shown when empty */
31
+ placeholder?: string;
32
+ /** Minimum height in px */
33
+ minHeight?: number;
34
+ /** Maximum height in px (scrolls beyond this) */
35
+ maxHeight?: number;
36
+ /** Additional CodeMirror extensions */
37
+ extensions?: Extension[];
38
+ }
39
+ interface CodeEditorContextValue {
40
+ /** The CodeMirror EditorView (null during SSR or before mount) */
41
+ view: EditorView | null;
42
+ /** Get the current document text */
43
+ getValue: () => string;
44
+ /** Get the currently selected text */
45
+ getSelection: () => string;
46
+ /** Replace the entire document */
47
+ setValue: (value: string) => void;
48
+ /** Replace the current selection */
49
+ replaceSelection: (text: string) => void;
50
+ /** Focus the editor */
51
+ focus: () => void;
52
+ /** Current language name */
53
+ language: string;
54
+ /** Change the active language */
55
+ setLanguage: (lang: string) => void;
56
+ /** Current theme name */
57
+ theme: string;
58
+ /** Whether the editor is read-only */
59
+ readOnly: boolean;
60
+ /** Whether line numbers are shown */
61
+ lineNumbers: boolean;
62
+ /** Whether word wrap is enabled */
63
+ wordWrap: boolean;
64
+ /** Current tab size */
65
+ tabSize: number;
66
+ /** Toggle word wrap on/off */
67
+ toggleWordWrap: () => void;
68
+ /** Toggle line numbers on/off */
69
+ toggleLineNumbers: () => void;
70
+ /** Copy entire document to clipboard */
71
+ copyToClipboard: () => Promise<void>;
72
+ /** Current cursor position */
73
+ cursorPosition: {
74
+ line: number;
75
+ col: number;
76
+ };
77
+ /** Length of the current selection (0 if none) */
78
+ selectionLength: number;
79
+ /** @internal Ref for the CodeMirror mount point */
80
+ _containerRef: RefObject<HTMLDivElement | null>;
81
+ /** @internal */
82
+ _minHeight?: number;
83
+ /** @internal */
84
+ _maxHeight?: number;
85
+ }
86
+ interface CodeEditorToolbarProps {
87
+ children?: ReactNode;
88
+ className?: string;
89
+ }
90
+ interface CodeEditorPanelProps {
91
+ className?: string;
92
+ }
93
+ interface CodeEditorStatusBarProps {
94
+ children?: ReactNode;
95
+ className?: string;
96
+ }
97
+
98
+ declare function CodeEditorPanel({ className }: CodeEditorPanelProps): react_jsx_runtime.JSX.Element;
99
+ declare namespace CodeEditorPanel {
100
+ var displayName: string;
101
+ }
102
+
103
+ declare function CodeEditorToolbar({ children, className }: CodeEditorToolbarProps): react_jsx_runtime.JSX.Element;
104
+ declare namespace CodeEditorToolbar {
105
+ var displayName: string;
106
+ }
107
+
108
+ declare function CodeEditorToolbarSeparator(): react_jsx_runtime.JSX.Element;
109
+ declare namespace CodeEditorToolbarSeparator {
110
+ var displayName: string;
111
+ }
112
+
113
+ declare function CodeEditorStatusBar({ children, className }: CodeEditorStatusBarProps): react_jsx_runtime.JSX.Element;
114
+ declare namespace CodeEditorStatusBar {
115
+ var displayName: string;
116
+ }
117
+
118
+ declare function CodeEditorRoot({ children, className, value: valueProp, defaultValue, onChange, language: languageProp, onLanguageChange, theme, readOnly, lineNumbers: lineNumbersProp, wordWrap: wordWrapProp, tabSize: tabSizeProp, placeholder, minHeight, maxHeight, extensions: additionalExtensions, }: CodeEditorProps): react_jsx_runtime.JSX.Element;
119
+ declare namespace CodeEditorRoot {
120
+ var displayName: string;
121
+ }
122
+ declare const CodeEditor: typeof CodeEditorRoot & {
123
+ Toolbar: typeof CodeEditorToolbar & {
124
+ Separator: typeof CodeEditorToolbarSeparator;
125
+ };
126
+ Panel: typeof CodeEditorPanel;
127
+ StatusBar: typeof CodeEditorStatusBar;
128
+ };
129
+
130
+ declare function useCodeEditor(): CodeEditorContextValue;
131
+
132
+ interface LanguageDefinition {
133
+ /** Display name shown in UI (e.g., "JavaScript") */
134
+ name: string;
135
+ /** Alternative keys (e.g., ["js", "javascript"]) */
136
+ aliases?: string[];
137
+ /** Factory returning the CodeMirror LanguageSupport extension */
138
+ support: () => LanguageSupport | Promise<LanguageSupport>;
139
+ }
140
+
141
+ declare function registerLanguage(def: LanguageDefinition): void;
142
+ declare function getLanguage(name: string): LanguageDefinition | undefined;
143
+ declare function getRegisteredLanguages(): string[];
144
+
145
+ interface ThemeDefinition {
146
+ /** Unique theme name */
147
+ name: string;
148
+ /** Whether this is a dark or light theme */
149
+ variant: "light" | "dark";
150
+ /** CodeMirror editor theme (gutter, cursor, selection, etc.) */
151
+ editorTheme: Extension;
152
+ /** Syntax highlighting color scheme */
153
+ highlightStyle: HighlightStyle;
154
+ }
155
+
156
+ declare function registerTheme(theme: ThemeDefinition): void;
157
+ declare function getTheme(name: string): ThemeDefinition | undefined;
158
+ declare function getRegisteredThemes(): string[];
159
+
160
+ export { CodeEditor, type CodeEditorContextValue, type CodeEditorPanelProps, type CodeEditorProps, type CodeEditorStatusBarProps, type CodeEditorToolbarProps, type LanguageDefinition, type ThemeDefinition, getLanguage, getRegisteredLanguages, getRegisteredThemes, getTheme, registerLanguage, registerTheme, useCodeEditor };
@@ -0,0 +1,160 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode, RefObject } from 'react';
3
+ import { Extension } from '@codemirror/state';
4
+ import { EditorView } from '@codemirror/view';
5
+ import { LanguageSupport, HighlightStyle } from '@codemirror/language';
6
+
7
+ interface CodeEditorProps {
8
+ children: ReactNode;
9
+ className?: string;
10
+ /** Controlled value */
11
+ value?: string;
12
+ /** Initial value (uncontrolled) */
13
+ defaultValue?: string;
14
+ /** Called when the document changes */
15
+ onChange?: (value: string) => void;
16
+ /** Language name or alias (default: "javascript") */
17
+ language?: string;
18
+ /** Called when the language changes via the toolbar selector */
19
+ onLanguageChange?: (lang: string) => void;
20
+ /** Theme name: "light", "dark", "auto", or a custom registered name (default: "auto") */
21
+ theme?: string;
22
+ /** Prevent editing (default: false) */
23
+ readOnly?: boolean;
24
+ /** Show line numbers (default: true) */
25
+ lineNumbers?: boolean;
26
+ /** Enable word wrap (default: false) */
27
+ wordWrap?: boolean;
28
+ /** Tab size in spaces (default: 2) */
29
+ tabSize?: number;
30
+ /** Placeholder shown when empty */
31
+ placeholder?: string;
32
+ /** Minimum height in px */
33
+ minHeight?: number;
34
+ /** Maximum height in px (scrolls beyond this) */
35
+ maxHeight?: number;
36
+ /** Additional CodeMirror extensions */
37
+ extensions?: Extension[];
38
+ }
39
+ interface CodeEditorContextValue {
40
+ /** The CodeMirror EditorView (null during SSR or before mount) */
41
+ view: EditorView | null;
42
+ /** Get the current document text */
43
+ getValue: () => string;
44
+ /** Get the currently selected text */
45
+ getSelection: () => string;
46
+ /** Replace the entire document */
47
+ setValue: (value: string) => void;
48
+ /** Replace the current selection */
49
+ replaceSelection: (text: string) => void;
50
+ /** Focus the editor */
51
+ focus: () => void;
52
+ /** Current language name */
53
+ language: string;
54
+ /** Change the active language */
55
+ setLanguage: (lang: string) => void;
56
+ /** Current theme name */
57
+ theme: string;
58
+ /** Whether the editor is read-only */
59
+ readOnly: boolean;
60
+ /** Whether line numbers are shown */
61
+ lineNumbers: boolean;
62
+ /** Whether word wrap is enabled */
63
+ wordWrap: boolean;
64
+ /** Current tab size */
65
+ tabSize: number;
66
+ /** Toggle word wrap on/off */
67
+ toggleWordWrap: () => void;
68
+ /** Toggle line numbers on/off */
69
+ toggleLineNumbers: () => void;
70
+ /** Copy entire document to clipboard */
71
+ copyToClipboard: () => Promise<void>;
72
+ /** Current cursor position */
73
+ cursorPosition: {
74
+ line: number;
75
+ col: number;
76
+ };
77
+ /** Length of the current selection (0 if none) */
78
+ selectionLength: number;
79
+ /** @internal Ref for the CodeMirror mount point */
80
+ _containerRef: RefObject<HTMLDivElement | null>;
81
+ /** @internal */
82
+ _minHeight?: number;
83
+ /** @internal */
84
+ _maxHeight?: number;
85
+ }
86
+ interface CodeEditorToolbarProps {
87
+ children?: ReactNode;
88
+ className?: string;
89
+ }
90
+ interface CodeEditorPanelProps {
91
+ className?: string;
92
+ }
93
+ interface CodeEditorStatusBarProps {
94
+ children?: ReactNode;
95
+ className?: string;
96
+ }
97
+
98
+ declare function CodeEditorPanel({ className }: CodeEditorPanelProps): react_jsx_runtime.JSX.Element;
99
+ declare namespace CodeEditorPanel {
100
+ var displayName: string;
101
+ }
102
+
103
+ declare function CodeEditorToolbar({ children, className }: CodeEditorToolbarProps): react_jsx_runtime.JSX.Element;
104
+ declare namespace CodeEditorToolbar {
105
+ var displayName: string;
106
+ }
107
+
108
+ declare function CodeEditorToolbarSeparator(): react_jsx_runtime.JSX.Element;
109
+ declare namespace CodeEditorToolbarSeparator {
110
+ var displayName: string;
111
+ }
112
+
113
+ declare function CodeEditorStatusBar({ children, className }: CodeEditorStatusBarProps): react_jsx_runtime.JSX.Element;
114
+ declare namespace CodeEditorStatusBar {
115
+ var displayName: string;
116
+ }
117
+
118
+ declare function CodeEditorRoot({ children, className, value: valueProp, defaultValue, onChange, language: languageProp, onLanguageChange, theme, readOnly, lineNumbers: lineNumbersProp, wordWrap: wordWrapProp, tabSize: tabSizeProp, placeholder, minHeight, maxHeight, extensions: additionalExtensions, }: CodeEditorProps): react_jsx_runtime.JSX.Element;
119
+ declare namespace CodeEditorRoot {
120
+ var displayName: string;
121
+ }
122
+ declare const CodeEditor: typeof CodeEditorRoot & {
123
+ Toolbar: typeof CodeEditorToolbar & {
124
+ Separator: typeof CodeEditorToolbarSeparator;
125
+ };
126
+ Panel: typeof CodeEditorPanel;
127
+ StatusBar: typeof CodeEditorStatusBar;
128
+ };
129
+
130
+ declare function useCodeEditor(): CodeEditorContextValue;
131
+
132
+ interface LanguageDefinition {
133
+ /** Display name shown in UI (e.g., "JavaScript") */
134
+ name: string;
135
+ /** Alternative keys (e.g., ["js", "javascript"]) */
136
+ aliases?: string[];
137
+ /** Factory returning the CodeMirror LanguageSupport extension */
138
+ support: () => LanguageSupport | Promise<LanguageSupport>;
139
+ }
140
+
141
+ declare function registerLanguage(def: LanguageDefinition): void;
142
+ declare function getLanguage(name: string): LanguageDefinition | undefined;
143
+ declare function getRegisteredLanguages(): string[];
144
+
145
+ interface ThemeDefinition {
146
+ /** Unique theme name */
147
+ name: string;
148
+ /** Whether this is a dark or light theme */
149
+ variant: "light" | "dark";
150
+ /** CodeMirror editor theme (gutter, cursor, selection, etc.) */
151
+ editorTheme: Extension;
152
+ /** Syntax highlighting color scheme */
153
+ highlightStyle: HighlightStyle;
154
+ }
155
+
156
+ declare function registerTheme(theme: ThemeDefinition): void;
157
+ declare function getTheme(name: string): ThemeDefinition | undefined;
158
+ declare function getRegisteredThemes(): string[];
159
+
160
+ export { CodeEditor, type CodeEditorContextValue, type CodeEditorPanelProps, type CodeEditorProps, type CodeEditorStatusBarProps, type CodeEditorToolbarProps, type LanguageDefinition, type ThemeDefinition, getLanguage, getRegisteredLanguages, getRegisteredThemes, getTheme, registerLanguage, registerTheme, useCodeEditor };