@particle-academy/fancy-code 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @particle-academy/fancy-code
2
2
 
3
- Lightweight embedded code editor built on CodeMirror 6. Compound component API with custom toolbar buttons, syntax highlighting color schemes, and extensible language/theme registries.
3
+ Lightweight embedded code editor with syntax highlighting, custom toolbar buttons, and extensible language/theme registries. Part of the `@particle-academy` component ecosystem.
4
4
 
5
5
  ## Installation
6
6
 
@@ -17,8 +17,6 @@ yarn add @particle-academy/fancy-code
17
17
 
18
18
  **Peer dependencies:** `react >= 18`, `react-dom >= 18`, `@particle-academy/react-fancy >= 1.5`
19
19
 
20
- **Bundled dependencies:** CodeMirror 6 (state, view, commands, language, search, autocomplete), language packages (JavaScript, TypeScript, HTML, PHP), `@lezer/highlight`
21
-
22
20
  ## Usage
23
21
 
24
22
  Add the `@source` directive to your main CSS file so Tailwind v4 scans the component library:
@@ -66,7 +64,7 @@ pnpm --filter @particle-academy/fancy-code clean # Remove dist/
66
64
  | `CodeEditor` | Root wrapper — context provider, state management |
67
65
  | `CodeEditor.Toolbar` | Action bar with default buttons or custom children |
68
66
  | `CodeEditor.Toolbar.Separator` | Vertical divider between toolbar groups |
69
- | `CodeEditor.Panel` | CodeMirror editing surface |
67
+ | `CodeEditor.Panel` | Code editing surface |
70
68
  | `CodeEditor.StatusBar` | Cursor position, language, tab size display |
71
69
 
72
70
  ### CodeEditor Props
@@ -88,7 +86,7 @@ interface CodeEditorProps {
88
86
  placeholder?: string;
89
87
  minHeight?: number; // Minimum height in px
90
88
  maxHeight?: number; // Max height before scrolling
91
- extensions?: Extension[]; // Additional CodeMirror extensions
89
+ extensions?: Extension[]; // Additional editor extensions
92
90
  }
93
91
  ```
94
92
 
@@ -102,7 +100,7 @@ import { Action } from "@particle-academy/react-fancy";
102
100
 
103
101
  function RunButton() {
104
102
  const { getValue } = useCodeEditor();
105
- return <Action size="xs" onClick={() => eval(getValue())}>Run</Action>;
103
+ return <Action size="xs" onClick={() => run(getValue())}>Run</Action>;
106
104
  }
107
105
 
108
106
  <CodeEditor value={code} onChange={setCode} language="javascript">
@@ -118,7 +116,6 @@ function RunButton() {
118
116
 
119
117
  | Method / Property | Description |
120
118
  |-------------------|-------------|
121
- | `view` | The CodeMirror `EditorView` instance (null before mount) |
122
119
  | `getValue()` | Get current document text |
123
120
  | `getSelection()` | Get currently selected text |
124
121
  | `setValue(text)` | Replace entire document |
@@ -205,13 +202,15 @@ Add languages beyond the four built-ins using `registerLanguage`:
205
202
 
206
203
  ```tsx
207
204
  import { registerLanguage } from "@particle-academy/fancy-code";
208
- import { python } from "@codemirror/lang-python";
209
205
 
210
- // Synchronous (package already installed)
211
206
  registerLanguage({
212
207
  name: "Python",
213
208
  aliases: ["py", "python"],
214
- support: () => python(),
209
+ support: () => {
210
+ // Return a LanguageSupport instance
211
+ const { python } = require("@codemirror/lang-python");
212
+ return python();
213
+ },
215
214
  });
216
215
 
217
216
  // Lazy-loaded
@@ -245,27 +244,12 @@ Create custom syntax highlighting color schemes using `registerTheme`:
245
244
 
246
245
  ```tsx
247
246
  import { registerTheme } from "@particle-academy/fancy-code";
248
- import { EditorView } from "@codemirror/view";
249
- import { HighlightStyle } from "@codemirror/language";
250
- import { tags } from "@lezer/highlight";
251
247
 
252
248
  registerTheme({
253
249
  name: "monokai",
254
250
  variant: "dark",
255
- editorTheme: EditorView.theme({
256
- "&": { backgroundColor: "#272822", color: "#f8f8f2" },
257
- ".cm-gutters": { backgroundColor: "#272822", color: "#75715e" },
258
- ".cm-activeLine": { backgroundColor: "#3e3d32" },
259
- // ... other editor chrome styles
260
- }, { dark: true }),
261
- highlightStyle: HighlightStyle.define([
262
- { tag: tags.keyword, color: "#f92672" },
263
- { tag: tags.string, color: "#e6db74" },
264
- { tag: tags.function(tags.variableName), color: "#a6e22e" },
265
- { tag: tags.number, color: "#ae81ff" },
266
- { tag: tags.comment, color: "#75715e", fontStyle: "italic" },
267
- // ... other token styles
268
- ]),
251
+ editorTheme: /* editor chrome styles (background, gutter, cursor, selection) */,
252
+ highlightStyle: /* token color definitions (keywords, strings, comments, etc.) */,
269
253
  });
270
254
  ```
271
255
 
@@ -280,16 +264,14 @@ Then use it:
280
264
  ```ts
281
265
  interface ThemeDefinition {
282
266
  name: string; // Unique theme name
283
- variant: "light" | "dark"; // For EditorView.darkTheme
284
- editorTheme: Extension; // EditorView.theme({...}) gutter, cursor, selection
285
- highlightStyle: HighlightStyle; // HighlightStyle.define([...]) token colors
267
+ variant: "light" | "dark"; // Light or dark base
268
+ editorTheme: Extension; // Editor chrome styles (gutter, cursor, selection)
269
+ highlightStyle: HighlightStyle; // Syntax token color definitions
286
270
  }
287
271
  ```
288
272
 
289
273
  ## Built-in Features
290
274
 
291
- The editor includes these CodeMirror extensions out of the box:
292
-
293
275
  - Syntax highlighting with language-aware tokenization
294
276
  - Line numbers with active line gutter highlight
295
277
  - Active line highlighting
@@ -302,7 +284,19 @@ The editor includes these CodeMirror extensions out of the box:
302
284
  - Selection highlighting
303
285
  - Tab key indentation
304
286
 
305
- All features are reconfigurable at runtime via compartments — switching languages, themes, line numbers, word wrap, tab size, and read-only mode happens without recreating the editor.
287
+ All features are reconfigurable at runtime — switching languages, themes, line numbers, word wrap, tab size, and read-only mode happens without recreating the editor.
288
+
289
+ ## Customization
290
+
291
+ All components render `data-fancy-code-*` attributes on their root elements for external CSS targeting:
292
+
293
+ | Attribute | Element |
294
+ |-----------|---------|
295
+ | `data-fancy-code-editor` | Root wrapper |
296
+ | `data-fancy-code-toolbar` | Toolbar bar |
297
+ | `data-fancy-code-toolbar-separator` | Toolbar separator |
298
+ | `data-fancy-code-panel` | Editing surface |
299
+ | `data-fancy-code-statusbar` | Status bar |
306
300
 
307
301
  ## Architecture
308
302
 
@@ -312,42 +306,32 @@ All features are reconfigurable at runtime via compartments — switching langua
312
306
  src/
313
307
  ├── components/
314
308
  │ └── CodeEditor/
315
- │ ├── CodeEditor.tsx # Root compound component + context
316
- │ ├── CodeEditor.types.ts # All prop/context types
317
- │ ├── CodeEditor.context.ts # React context + useCodeEditor hook
318
- │ ├── CodeEditorPanel.tsx # CodeMirror mount point
319
- │ ├── CodeEditorToolbar.tsx # Default toolbar + custom children
309
+ │ ├── CodeEditor.tsx # Root compound component + context
310
+ │ ├── CodeEditor.types.ts # All prop/context types
311
+ │ ├── CodeEditor.context.ts # React context + useCodeEditor hook
312
+ │ ├── CodeEditorPanel.tsx # Editing surface
313
+ │ ├── CodeEditorToolbar.tsx # Default toolbar + custom children
320
314
  │ ├── CodeEditorToolbarSeparator.tsx
321
- │ ├── CodeEditorStatusBar.tsx # Cursor/language/tab display
315
+ │ ├── CodeEditorStatusBar.tsx # Cursor/language/tab display
322
316
  │ └── index.ts
323
317
  ├── hooks/
324
- │ ├── use-codemirror.ts # Core CM lifecycle + compartments
325
- │ └── use-dark-mode.ts # Reactive prefers-color-scheme
318
+ │ ├── use-codemirror.ts # Core editor lifecycle
319
+ │ └── use-dark-mode.ts # Reactive prefers-color-scheme
326
320
  ├── languages/
327
- │ ├── registry.ts # Global language registry
328
- │ ├── builtin.ts # JS, TS, HTML, PHP registrations
329
- │ ├── types.ts # LanguageDefinition type
321
+ │ ├── registry.ts # Global language registry
322
+ │ ├── builtin.ts # JS, TS, HTML, PHP registrations
323
+ │ ├── types.ts # LanguageDefinition type
330
324
  │ └── index.ts
331
325
  ├── themes/
332
- │ ├── registry.ts # Global theme registry
333
- │ ├── light.ts # Built-in light color scheme
334
- │ ├── dark.ts # Built-in dark color scheme
335
- │ ├── types.ts # ThemeDefinition type
326
+ │ ├── registry.ts # Global theme registry
327
+ │ ├── light.ts # Built-in light color scheme
328
+ │ ├── dark.ts # Built-in dark color scheme
329
+ │ ├── types.ts # ThemeDefinition type
336
330
  │ └── index.ts
337
- ├── styles.css # Base CodeMirror structural styles
338
- └── index.ts # Public API
331
+ ├── styles.css # Base structural styles
332
+ └── index.ts # Public API
339
333
  ```
340
334
 
341
- ### Data Attributes
342
-
343
- | Attribute | Element |
344
- |-----------|---------|
345
- | `data-fancy-code-editor` | Root wrapper |
346
- | `data-fancy-code-toolbar` | Toolbar bar |
347
- | `data-fancy-code-toolbar-separator` | Toolbar separator |
348
- | `data-fancy-code-panel` | CodeMirror mount point |
349
- | `data-fancy-code-statusbar` | Status bar |
350
-
351
335
  ### Public Exports
352
336
 
353
337
  ```ts
@@ -388,12 +372,12 @@ Guidelines for AI agents (Claude Code, Copilot, etc.) working on this package.
388
372
  - Context is provided via `CodeEditorContext` and consumed with `useCodeEditor()`.
389
373
  - All root elements have `data-fancy-code-*` attributes for external CSS targeting.
390
374
 
391
- ### CodeMirror Integration
375
+ ### Editor Engine
392
376
 
393
- - The `useCodemirror` hook manages the full `EditorView` lifecycle.
394
- - Uses `Compartment` from `@codemirror/state` for hot-swapping language, theme, line numbers, word wrap, tab size, read-only, placeholder, and height constraints.
377
+ - The `useCodemirror` hook manages the editor lifecycle using CodeMirror 6.
378
+ - Uses `Compartment` for hot-swapping language, theme, line numbers, word wrap, tab size, read-only, placeholder, and height constraints.
395
379
  - External value changes are synced via `isExternalUpdate` ref to prevent onChange loops.
396
- - SSR-safe: EditorView is only created inside `useEffect`.
380
+ - SSR-safe: the editor is only created inside `useEffect`.
397
381
 
398
382
  ### Extension System
399
383
 
@@ -405,5 +389,5 @@ Guidelines for AI agents (Claude Code, Copilot, etc.) working on this package.
405
389
 
406
390
  - tsup handles the build — ESM, CJS, and `.d.ts` generation.
407
391
  - `react`, `react-dom`, and `@particle-academy/react-fancy` are external dependencies.
408
- - All CodeMirror packages are **bundled** (not external) so consumers don't need to install them.
392
+ - All editor engine packages are **bundled** (not external) so consumers don't need to install them.
409
393
  - After any change, verify with `npm run build` from the monorepo root.
@@ -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/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"]}
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\";\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 { cn } from \"@particle-academy/react-fancy\";\r\nimport { useCodeEditor } from \"./CodeEditor.context\";\r\nimport type { CodeEditorPanelProps } from \"./CodeEditor.types\";\r\n\r\nexport function CodeEditorPanel({ className }: CodeEditorPanelProps) {\r\n const { _containerRef } = useCodeEditor();\r\n\r\n return (\r\n <div\r\n data-fancy-code-panel=\"\"\r\n ref={_containerRef}\r\n className={cn(\"text-sm\", className)}\r\n />\r\n );\r\n}\r\n\r\nCodeEditorPanel.displayName = \"CodeEditorPanel\";\r\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 { javascript } from \"@codemirror/lang-javascript\";\r\nimport { html } from \"@codemirror/lang-html\";\r\nimport { php } from \"@codemirror/lang-php\";\r\nimport { registerLanguage } from \"./registry\";\r\n\r\nregisterLanguage({\r\n name: \"JavaScript\",\r\n aliases: [\"js\", \"javascript\", \"jsx\"],\r\n support: () => javascript({ jsx: true }),\r\n});\r\n\r\nregisterLanguage({\r\n name: \"TypeScript\",\r\n aliases: [\"ts\", \"typescript\", \"tsx\"],\r\n support: () => javascript({ typescript: true, jsx: true }),\r\n});\r\n\r\nregisterLanguage({\r\n name: \"HTML\",\r\n aliases: [\"html\", \"htm\"],\r\n support: () => html(),\r\n});\r\n\r\nregisterLanguage({\r\n name: \"PHP\",\r\n aliases: [\"php\"],\r\n support: () => php(),\r\n});\r\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 { EditorView } from \"@codemirror/view\";\r\nimport { HighlightStyle } from \"@codemirror/language\";\r\nimport { tags } from \"@lezer/highlight\";\r\nimport { registerTheme } from \"./registry\";\r\n\r\nconst editorTheme = EditorView.theme(\r\n {\r\n \"&\": {\r\n backgroundColor: \"#ffffff\",\r\n color: \"#1e1e2e\",\r\n },\r\n \".cm-content\": {\r\n caretColor: \"#3b82f6\",\r\n },\r\n \".cm-cursor, .cm-dropCursor\": {\r\n borderLeftColor: \"#3b82f6\",\r\n },\r\n \"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection\": {\r\n backgroundColor: \"#dbeafe\",\r\n },\r\n \".cm-activeLine\": {\r\n backgroundColor: \"#f8fafc\",\r\n },\r\n \".cm-gutters\": {\r\n backgroundColor: \"#f8fafc\",\r\n color: \"#94a3b8\",\r\n borderRight: \"1px solid #e2e8f0\",\r\n },\r\n \".cm-activeLineGutter\": {\r\n backgroundColor: \"#f1f5f9\",\r\n color: \"#475569\",\r\n },\r\n \".cm-foldPlaceholder\": {\r\n backgroundColor: \"#e2e8f0\",\r\n color: \"#64748b\",\r\n border: \"none\",\r\n },\r\n \".cm-tooltip\": {\r\n backgroundColor: \"#ffffff\",\r\n border: \"1px solid #e2e8f0\",\r\n },\r\n \".cm-tooltip .cm-tooltip-arrow:before\": {\r\n borderTopColor: \"#e2e8f0\",\r\n borderBottomColor: \"#e2e8f0\",\r\n },\r\n \".cm-tooltip .cm-tooltip-arrow:after\": {\r\n borderTopColor: \"#ffffff\",\r\n borderBottomColor: \"#ffffff\",\r\n },\r\n \".cm-tooltip-autocomplete\": {\r\n \"& > ul > li[aria-selected]\": {\r\n backgroundColor: \"#dbeafe\",\r\n color: \"#1e40af\",\r\n },\r\n },\r\n \".cm-searchMatch\": {\r\n backgroundColor: \"#fef08a\",\r\n outline: \"1px solid #facc15\",\r\n },\r\n \".cm-searchMatch.cm-searchMatch-selected\": {\r\n backgroundColor: \"#bbf7d0\",\r\n outline: \"1px solid #22c55e\",\r\n },\r\n \".cm-selectionMatch\": {\r\n backgroundColor: \"#e0f2fe\",\r\n },\r\n \".cm-matchingBracket, .cm-nonmatchingBracket\": {\r\n outline: \"1px solid #94a3b8\",\r\n },\r\n \".cm-matchingBracket\": {\r\n backgroundColor: \"#e0f2fe\",\r\n },\r\n },\r\n { dark: false },\r\n);\r\n\r\nconst highlightStyle = HighlightStyle.define([\r\n { tag: tags.keyword, color: \"#8b5cf6\" },\r\n { tag: [tags.name, tags.deleted, tags.character, tags.macroName], color: \"#1e1e2e\" },\r\n { tag: [tags.function(tags.variableName), tags.labelName], color: \"#2563eb\" },\r\n { tag: [tags.color, tags.constant(tags.name), tags.standard(tags.name)], color: \"#d97706\" },\r\n { tag: [tags.definition(tags.name), tags.separator], color: \"#1e1e2e\" },\r\n { tag: [tags.typeName, tags.className, tags.number, tags.changed, tags.annotation, tags.modifier, tags.self, tags.namespace], color: \"#d97706\" },\r\n { tag: [tags.operator, tags.operatorKeyword, tags.url, tags.escape, tags.regexp, tags.link, tags.special(tags.string)], color: \"#0891b2\" },\r\n { tag: [tags.meta, tags.comment], color: \"#94a3b8\", fontStyle: \"italic\" },\r\n { tag: tags.strong, fontWeight: \"bold\" },\r\n { tag: tags.emphasis, fontStyle: \"italic\" },\r\n { tag: tags.strikethrough, textDecoration: \"line-through\" },\r\n { tag: tags.link, color: \"#2563eb\", textDecoration: \"underline\" },\r\n { tag: tags.heading, fontWeight: \"bold\", color: \"#8b5cf6\" },\r\n { tag: [tags.atom, tags.bool, tags.special(tags.variableName)], color: \"#d97706\" },\r\n { tag: [tags.processingInstruction, tags.string, tags.inserted], color: \"#059669\" },\r\n { tag: tags.invalid, color: \"#ef4444\" },\r\n { tag: tags.tagName, color: \"#dc2626\" },\r\n { tag: tags.attributeName, color: \"#d97706\" },\r\n { tag: tags.attributeValue, color: \"#059669\" },\r\n]);\r\n\r\nregisterTheme({\r\n name: \"light\",\r\n variant: \"light\",\r\n editorTheme,\r\n highlightStyle,\r\n});\r\n","import { EditorView } from \"@codemirror/view\";\r\nimport { HighlightStyle } from \"@codemirror/language\";\r\nimport { tags } from \"@lezer/highlight\";\r\nimport { registerTheme } from \"./registry\";\r\n\r\nconst editorTheme = EditorView.theme(\r\n {\r\n \"&\": {\r\n backgroundColor: \"#18181b\",\r\n color: \"#e4e4e7\",\r\n },\r\n \".cm-content\": {\r\n caretColor: \"#60a5fa\",\r\n },\r\n \".cm-cursor, .cm-dropCursor\": {\r\n borderLeftColor: \"#60a5fa\",\r\n },\r\n \"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection\": {\r\n backgroundColor: \"#1e3a5f\",\r\n },\r\n \".cm-activeLine\": {\r\n backgroundColor: \"#27272a\",\r\n },\r\n \".cm-gutters\": {\r\n backgroundColor: \"#18181b\",\r\n color: \"#52525b\",\r\n borderRight: \"1px solid #27272a\",\r\n },\r\n \".cm-activeLineGutter\": {\r\n backgroundColor: \"#27272a\",\r\n color: \"#a1a1aa\",\r\n },\r\n \".cm-foldPlaceholder\": {\r\n backgroundColor: \"#3f3f46\",\r\n color: \"#a1a1aa\",\r\n border: \"none\",\r\n },\r\n \".cm-tooltip\": {\r\n backgroundColor: \"#27272a\",\r\n border: \"1px solid #3f3f46\",\r\n color: \"#e4e4e7\",\r\n },\r\n \".cm-tooltip .cm-tooltip-arrow:before\": {\r\n borderTopColor: \"#3f3f46\",\r\n borderBottomColor: \"#3f3f46\",\r\n },\r\n \".cm-tooltip .cm-tooltip-arrow:after\": {\r\n borderTopColor: \"#27272a\",\r\n borderBottomColor: \"#27272a\",\r\n },\r\n \".cm-tooltip-autocomplete\": {\r\n \"& > ul > li[aria-selected]\": {\r\n backgroundColor: \"#1e3a5f\",\r\n color: \"#93c5fd\",\r\n },\r\n },\r\n \".cm-searchMatch\": {\r\n backgroundColor: \"#854d0e\",\r\n outline: \"1px solid #a16207\",\r\n },\r\n \".cm-searchMatch.cm-searchMatch-selected\": {\r\n backgroundColor: \"#166534\",\r\n outline: \"1px solid #15803d\",\r\n },\r\n \".cm-selectionMatch\": {\r\n backgroundColor: \"#1e3a5f\",\r\n },\r\n \".cm-matchingBracket, .cm-nonmatchingBracket\": {\r\n outline: \"1px solid #71717a\",\r\n },\r\n \".cm-matchingBracket\": {\r\n backgroundColor: \"#3f3f46\",\r\n },\r\n },\r\n { dark: true },\r\n);\r\n\r\nconst highlightStyle = HighlightStyle.define([\r\n { tag: tags.keyword, color: \"#c084fc\" },\r\n { tag: [tags.name, tags.deleted, tags.character, tags.macroName], color: \"#e4e4e7\" },\r\n { tag: [tags.function(tags.variableName), tags.labelName], color: \"#60a5fa\" },\r\n { tag: [tags.color, tags.constant(tags.name), tags.standard(tags.name)], color: \"#fbbf24\" },\r\n { tag: [tags.definition(tags.name), tags.separator], color: \"#e4e4e7\" },\r\n { tag: [tags.typeName, tags.className, tags.number, tags.changed, tags.annotation, tags.modifier, tags.self, tags.namespace], color: \"#fbbf24\" },\r\n { tag: [tags.operator, tags.operatorKeyword, tags.url, tags.escape, tags.regexp, tags.link, tags.special(tags.string)], color: \"#22d3ee\" },\r\n { tag: [tags.meta, tags.comment], color: \"#71717a\", fontStyle: \"italic\" },\r\n { tag: tags.strong, fontWeight: \"bold\" },\r\n { tag: tags.emphasis, fontStyle: \"italic\" },\r\n { tag: tags.strikethrough, textDecoration: \"line-through\" },\r\n { tag: tags.link, color: \"#60a5fa\", textDecoration: \"underline\" },\r\n { tag: tags.heading, fontWeight: \"bold\", color: \"#c084fc\" },\r\n { tag: [tags.atom, tags.bool, tags.special(tags.variableName)], color: \"#fbbf24\" },\r\n { tag: [tags.processingInstruction, tags.string, tags.inserted], color: \"#34d399\" },\r\n { tag: tags.invalid, color: \"#f87171\" },\r\n { tag: tags.tagName, color: \"#f87171\" },\r\n { tag: tags.attributeName, color: \"#fbbf24\" },\r\n { tag: tags.attributeValue, color: \"#34d399\" },\r\n]);\r\n\r\nregisterTheme({\r\n name: \"dark\",\r\n variant: \"dark\",\r\n editorTheme,\r\n highlightStyle,\r\n});\r\n","import { useEffect, useRef, type RefObject } from \"react\";\r\nimport { EditorState, Compartment, type Extension } from \"@codemirror/state\";\r\nimport { EditorView, keymap, lineNumbers as lineNumbersExt, highlightActiveLine, highlightActiveLineGutter, drawSelection, dropCursor, placeholder as placeholderExt } from \"@codemirror/view\";\r\nimport { defaultKeymap, history, historyKeymap, indentWithTab } from \"@codemirror/commands\";\r\nimport { syntaxHighlighting, indentOnInput, bracketMatching, foldGutter, foldKeymap } from \"@codemirror/language\";\r\nimport { searchKeymap, highlightSelectionMatches } from \"@codemirror/search\";\r\nimport { autocompletion, completionKeymap, closeBrackets, closeBracketsKeymap } from \"@codemirror/autocomplete\";\r\nimport { getLanguage } from \"../languages\";\r\nimport { getTheme } from \"../themes\";\r\n\r\nexport interface UseCodemirrorOptions {\r\n containerRef: RefObject<HTMLDivElement | null>;\r\n value: string;\r\n onChange?: (value: string) => void;\r\n language: string;\r\n theme: string;\r\n readOnly: boolean;\r\n lineNumbers: boolean;\r\n wordWrap: boolean;\r\n tabSize: number;\r\n placeholder?: string;\r\n minHeight?: number;\r\n maxHeight?: number;\r\n searchEnabled: boolean;\r\n additionalExtensions?: Extension[];\r\n onCursorChange?: (pos: { line: number; col: number; selectionLength: number }) => void;\r\n}\r\n\r\nexport interface UseCodemirrorReturn {\r\n view: EditorView | null;\r\n}\r\n\r\nfunction resolveLanguageExtension(name: string): Extension {\r\n const def = getLanguage(name);\r\n if (!def) return [];\r\n const result = def.support();\r\n if (result instanceof Promise) {\r\n // Async languages are not supported in the initial render; return empty\r\n return [];\r\n }\r\n return result;\r\n}\r\n\r\nfunction resolveThemeExtensions(name: string): Extension[] {\r\n const def = getTheme(name);\r\n if (!def) {\r\n const fallback = getTheme(\"dark\");\r\n if (!fallback) return [];\r\n return [fallback.editorTheme, syntaxHighlighting(fallback.highlightStyle)];\r\n }\r\n return [def.editorTheme, syntaxHighlighting(def.highlightStyle)];\r\n}\r\n\r\nexport function useCodemirror({\r\n containerRef,\r\n value,\r\n onChange,\r\n language,\r\n theme,\r\n readOnly,\r\n lineNumbers,\r\n wordWrap,\r\n tabSize,\r\n placeholder,\r\n minHeight,\r\n maxHeight,\r\n searchEnabled,\r\n additionalExtensions,\r\n onCursorChange,\r\n}: UseCodemirrorOptions): UseCodemirrorReturn {\r\n const viewRef = useRef<EditorView | null>(null);\r\n const isExternalUpdate = useRef(false);\r\n const onChangeRef = useRef(onChange);\r\n const onCursorChangeRef = useRef(onCursorChange);\r\n onChangeRef.current = onChange;\r\n onCursorChangeRef.current = onCursorChange;\r\n\r\n // Compartments for reconfigurable extensions\r\n const languageComp = useRef(new Compartment());\r\n const themeComp = useRef(new Compartment());\r\n const lineNumbersComp = useRef(new Compartment());\r\n const wrapComp = useRef(new Compartment());\r\n const tabSizeComp = useRef(new Compartment());\r\n const readOnlyComp = useRef(new Compartment());\r\n const placeholderComp = useRef(new Compartment());\r\n const heightComp = useRef(new Compartment());\r\n\r\n // Build height theme extension\r\n function buildHeightExtension(min?: number, max?: number): Extension {\r\n const styles: Record<string, string> = {};\r\n if (min) styles.minHeight = `${min}px`;\r\n if (max) styles.maxHeight = `${max}px`;\r\n if (Object.keys(styles).length === 0) return [];\r\n return EditorView.theme({\r\n \"&\": { ...(max ? { maxHeight: `${max}px` } : {}) },\r\n \".cm-scroller\": { overflow: \"auto\", ...styles },\r\n });\r\n }\r\n\r\n // Create the editor on mount\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const updateListener = EditorView.updateListener.of((update) => {\r\n if (update.docChanged && !isExternalUpdate.current) {\r\n onChangeRef.current?.(update.state.doc.toString());\r\n }\r\n if (update.selectionSet || update.docChanged) {\r\n const pos = update.state.selection.main;\r\n const line = update.state.doc.lineAt(pos.head);\r\n onCursorChangeRef.current?.({\r\n line: line.number,\r\n col: pos.head - line.from + 1,\r\n selectionLength: Math.abs(pos.to - pos.from),\r\n });\r\n }\r\n });\r\n\r\n const state = EditorState.create({\r\n doc: value,\r\n extensions: [\r\n // Compartmentalized extensions\r\n languageComp.current.of(resolveLanguageExtension(language)),\r\n themeComp.current.of(resolveThemeExtensions(theme)),\r\n lineNumbersComp.current.of(lineNumbers ? [lineNumbersExt(), highlightActiveLineGutter()] : []),\r\n wrapComp.current.of(wordWrap ? EditorView.lineWrapping : []),\r\n tabSizeComp.current.of(EditorState.tabSize.of(tabSize)),\r\n readOnlyComp.current.of(EditorState.readOnly.of(readOnly)),\r\n placeholderComp.current.of(placeholder ? placeholderExt(placeholder) : []),\r\n heightComp.current.of(buildHeightExtension(minHeight, maxHeight)),\r\n // Static extensions\r\n history(),\r\n foldGutter(),\r\n drawSelection(),\r\n dropCursor(),\r\n indentOnInput(),\r\n bracketMatching(),\r\n closeBrackets(),\r\n autocompletion(),\r\n highlightActiveLine(),\r\n highlightSelectionMatches(),\r\n keymap.of([\r\n ...closeBracketsKeymap,\r\n ...defaultKeymap,\r\n ...searchKeymap,\r\n ...historyKeymap,\r\n ...foldKeymap,\r\n ...completionKeymap,\r\n indentWithTab,\r\n ]),\r\n updateListener,\r\n ...(additionalExtensions ?? []),\r\n ],\r\n });\r\n\r\n const view = new EditorView({ state, parent: container });\r\n viewRef.current = view;\r\n\r\n return () => {\r\n view.destroy();\r\n viewRef.current = null;\r\n };\r\n // Only run on mount/unmount — compartments handle reconfig\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [containerRef]);\r\n\r\n // Sync external value changes\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n const currentDoc = view.state.doc.toString();\r\n if (value !== currentDoc) {\r\n isExternalUpdate.current = true;\r\n view.dispatch({\r\n changes: { from: 0, to: currentDoc.length, insert: value },\r\n });\r\n isExternalUpdate.current = false;\r\n }\r\n }, [value]);\r\n\r\n // Reconfigure language\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n\r\n const def = getLanguage(language);\r\n if (!def) {\r\n view.dispatch({ effects: languageComp.current.reconfigure([]) });\r\n return;\r\n }\r\n\r\n const result = def.support();\r\n if (result instanceof Promise) {\r\n result.then((ext) => {\r\n if (viewRef.current) {\r\n viewRef.current.dispatch({ effects: languageComp.current.reconfigure(ext) });\r\n }\r\n });\r\n } else {\r\n view.dispatch({ effects: languageComp.current.reconfigure(result) });\r\n }\r\n }, [language]);\r\n\r\n // Reconfigure theme\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n view.dispatch({ effects: themeComp.current.reconfigure(resolveThemeExtensions(theme)) });\r\n }, [theme]);\r\n\r\n // Reconfigure line numbers\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n view.dispatch({\r\n effects: lineNumbersComp.current.reconfigure(\r\n lineNumbers ? [lineNumbersExt(), highlightActiveLineGutter()] : [],\r\n ),\r\n });\r\n }, [lineNumbers]);\r\n\r\n // Reconfigure word wrap\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n view.dispatch({\r\n effects: wrapComp.current.reconfigure(wordWrap ? EditorView.lineWrapping : []),\r\n });\r\n }, [wordWrap]);\r\n\r\n // Reconfigure tab size\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n view.dispatch({\r\n effects: tabSizeComp.current.reconfigure(EditorState.tabSize.of(tabSize)),\r\n });\r\n }, [tabSize]);\r\n\r\n // Reconfigure read-only\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n view.dispatch({\r\n effects: readOnlyComp.current.reconfigure(EditorState.readOnly.of(readOnly)),\r\n });\r\n }, [readOnly]);\r\n\r\n // Reconfigure placeholder\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n view.dispatch({\r\n effects: placeholderComp.current.reconfigure(placeholder ? placeholderExt(placeholder) : []),\r\n });\r\n }, [placeholder]);\r\n\r\n return { view: viewRef.current };\r\n}\r\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\";\r\nimport { cn, useControllableState } from \"@particle-academy/react-fancy\";\r\nimport { CodeEditorContext } from \"./CodeEditor.context\";\r\nimport { CodeEditorPanel } from \"./CodeEditorPanel\";\r\nimport { CodeEditorToolbar } from \"./CodeEditorToolbar\";\r\nimport { CodeEditorToolbarSeparator } from \"./CodeEditorToolbarSeparator\";\r\nimport { CodeEditorStatusBar } from \"./CodeEditorStatusBar\";\r\nimport { useCodemirror } from \"../../hooks/use-codemirror\";\r\nimport { useDarkMode } from \"../../hooks/use-dark-mode\";\r\nimport { getLanguage } from \"../../languages\";\r\nimport type { CodeEditorProps, CodeEditorContextValue } from \"./CodeEditor.types\";\r\n\r\nfunction CodeEditorRoot({\r\n children,\r\n className,\r\n value: valueProp,\r\n defaultValue = \"\",\r\n onChange,\r\n language: languageProp = \"javascript\",\r\n onLanguageChange,\r\n theme = \"auto\",\r\n readOnly = false,\r\n lineNumbers: lineNumbersProp = true,\r\n wordWrap: wordWrapProp = false,\r\n tabSize: tabSizeProp = 2,\r\n placeholder,\r\n minHeight,\r\n maxHeight,\r\n extensions: additionalExtensions,\r\n}: CodeEditorProps) {\r\n const [currentValue, setCurrentValue] = useControllableState(valueProp, defaultValue, onChange);\r\n\r\n // Reactive dark mode for \"auto\" theme\r\n const isDark = useDarkMode();\r\n const resolvedTheme = theme === \"auto\" ? (isDark ? \"dark\" : \"light\") : theme;\r\n\r\n // Language state (changeable via toolbar selector)\r\n const [currentLanguage, setCurrentLanguageState] = useState(() => {\r\n // Resolve to display name\r\n const def = getLanguage(languageProp);\r\n return def?.name ?? languageProp;\r\n });\r\n\r\n const setLanguage = useCallback(\r\n (lang: string) => {\r\n const def = getLanguage(lang);\r\n const resolved = def?.name ?? lang;\r\n setCurrentLanguageState(resolved);\r\n onLanguageChange?.(resolved);\r\n },\r\n [onLanguageChange],\r\n );\r\n\r\n // Toggle states\r\n const [showLineNumbers, setShowLineNumbers] = useState(lineNumbersProp);\r\n const [isWordWrap, setIsWordWrap] = useState(wordWrapProp);\r\n\r\n // Cursor position\r\n const [cursorPosition, setCursorPosition] = useState({ line: 1, col: 1 });\r\n const [selectionLength, setSelectionLength] = useState(0);\r\n\r\n // Container ref for CodeMirror mount\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Core CodeMirror hook\r\n const { view } = useCodemirror({\r\n containerRef,\r\n value: currentValue,\r\n onChange: setCurrentValue,\r\n language: currentLanguage,\r\n theme: resolvedTheme,\r\n readOnly,\r\n lineNumbers: showLineNumbers,\r\n wordWrap: isWordWrap,\r\n tabSize: tabSizeProp,\r\n placeholder,\r\n minHeight,\r\n maxHeight,\r\n searchEnabled: true,\r\n additionalExtensions,\r\n onCursorChange: ({ line, col, selectionLength: sel }) => {\r\n setCursorPosition({ line, col });\r\n setSelectionLength(sel);\r\n },\r\n });\r\n\r\n const contextValue = useMemo<CodeEditorContextValue>(\r\n () => ({\r\n view,\r\n getValue: () => view?.state.doc.toString() ?? currentValue,\r\n getSelection: () => {\r\n if (!view) return \"\";\r\n const sel = view.state.selection.main;\r\n return view.state.sliceDoc(sel.from, sel.to);\r\n },\r\n setValue: (v: string) => setCurrentValue(v),\r\n replaceSelection: (text: string) => {\r\n if (!view) return;\r\n view.dispatch(view.state.replaceSelection(text));\r\n },\r\n focus: () => view?.focus(),\r\n language: currentLanguage,\r\n setLanguage,\r\n theme: resolvedTheme,\r\n readOnly,\r\n lineNumbers: showLineNumbers,\r\n wordWrap: isWordWrap,\r\n tabSize: tabSizeProp,\r\n toggleWordWrap: () => setIsWordWrap((w) => !w),\r\n toggleLineNumbers: () => setShowLineNumbers((l) => !l),\r\n copyToClipboard: async () => {\r\n const text = view?.state.doc.toString() ?? currentValue;\r\n await navigator.clipboard.writeText(text);\r\n },\r\n cursorPosition,\r\n selectionLength,\r\n _containerRef: containerRef,\r\n _minHeight: minHeight,\r\n _maxHeight: maxHeight,\r\n }),\r\n [view, currentValue, currentLanguage, setLanguage, resolvedTheme, readOnly, showLineNumbers, isWordWrap, tabSizeProp, cursorPosition, selectionLength, setCurrentValue, minHeight, maxHeight],\r\n );\r\n\r\n return (\r\n <CodeEditorContext.Provider value={contextValue}>\r\n <div\r\n data-fancy-code-editor=\"\"\r\n className={cn(\r\n \"overflow-hidden rounded-xl border border-zinc-200 bg-white dark:border-zinc-700 dark:bg-zinc-900\",\r\n className,\r\n )}\r\n >\r\n {children}\r\n </div>\r\n </CodeEditorContext.Provider>\r\n );\r\n}\r\n\r\nCodeEditorRoot.displayName = \"CodeEditor\";\r\n\r\nconst ToolbarWithSeparator = Object.assign(CodeEditorToolbar, {\r\n Separator: CodeEditorToolbarSeparator,\r\n});\r\n\r\nexport const CodeEditor = Object.assign(CodeEditorRoot, {\r\n Toolbar: ToolbarWithSeparator,\r\n Panel: CodeEditorPanel,\r\n StatusBar: CodeEditorStatusBar,\r\n});\r\n"]}
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/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":["jsx","cn","jsxs","Fragment","editorTheme","EditorView","highlightStyle","HighlightStyle","tags","lineNumbers","placeholder","lineNumbersExt","placeholderExt","useState","useRef"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { CodeEditorContextValue } from \"./CodeEditor.types\";\n\nexport const CodeEditorContext = createContext<CodeEditorContextValue | null>(null);\n\nexport function useCodeEditor(): CodeEditorContextValue {\n const ctx = useContext(CodeEditorContext);\n if (!ctx) {\n throw new Error(\"useCodeEditor must be used within a <CodeEditor> component\");\n }\n return ctx;\n}\n","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"]}
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":["jsx","cn","jsxs","Fragment","editorTheme","EditorView","highlightStyle","HighlightStyle","tags","lineNumbers","placeholder","lineNumbersExt","placeholderExt","useState","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 { cn } from \"@particle-academy/react-fancy\";\r\nimport { useCodeEditor } from \"./CodeEditor.context\";\r\nimport type { CodeEditorPanelProps } from \"./CodeEditor.types\";\r\n\r\nexport function CodeEditorPanel({ className }: CodeEditorPanelProps) {\r\n const { _containerRef } = useCodeEditor();\r\n\r\n return (\r\n <div\r\n data-fancy-code-panel=\"\"\r\n ref={_containerRef}\r\n className={cn(\"text-sm\", className)}\r\n />\r\n );\r\n}\r\n\r\nCodeEditorPanel.displayName = \"CodeEditorPanel\";\r\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 { javascript } from \"@codemirror/lang-javascript\";\r\nimport { html } from \"@codemirror/lang-html\";\r\nimport { php } from \"@codemirror/lang-php\";\r\nimport { registerLanguage } from \"./registry\";\r\n\r\nregisterLanguage({\r\n name: \"JavaScript\",\r\n aliases: [\"js\", \"javascript\", \"jsx\"],\r\n support: () => javascript({ jsx: true }),\r\n});\r\n\r\nregisterLanguage({\r\n name: \"TypeScript\",\r\n aliases: [\"ts\", \"typescript\", \"tsx\"],\r\n support: () => javascript({ typescript: true, jsx: true }),\r\n});\r\n\r\nregisterLanguage({\r\n name: \"HTML\",\r\n aliases: [\"html\", \"htm\"],\r\n support: () => html(),\r\n});\r\n\r\nregisterLanguage({\r\n name: \"PHP\",\r\n aliases: [\"php\"],\r\n support: () => php(),\r\n});\r\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 { EditorView } from \"@codemirror/view\";\r\nimport { HighlightStyle } from \"@codemirror/language\";\r\nimport { tags } from \"@lezer/highlight\";\r\nimport { registerTheme } from \"./registry\";\r\n\r\nconst editorTheme = EditorView.theme(\r\n {\r\n \"&\": {\r\n backgroundColor: \"#ffffff\",\r\n color: \"#1e1e2e\",\r\n },\r\n \".cm-content\": {\r\n caretColor: \"#3b82f6\",\r\n },\r\n \".cm-cursor, .cm-dropCursor\": {\r\n borderLeftColor: \"#3b82f6\",\r\n },\r\n \"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection\": {\r\n backgroundColor: \"#dbeafe\",\r\n },\r\n \".cm-activeLine\": {\r\n backgroundColor: \"#f8fafc\",\r\n },\r\n \".cm-gutters\": {\r\n backgroundColor: \"#f8fafc\",\r\n color: \"#94a3b8\",\r\n borderRight: \"1px solid #e2e8f0\",\r\n },\r\n \".cm-activeLineGutter\": {\r\n backgroundColor: \"#f1f5f9\",\r\n color: \"#475569\",\r\n },\r\n \".cm-foldPlaceholder\": {\r\n backgroundColor: \"#e2e8f0\",\r\n color: \"#64748b\",\r\n border: \"none\",\r\n },\r\n \".cm-tooltip\": {\r\n backgroundColor: \"#ffffff\",\r\n border: \"1px solid #e2e8f0\",\r\n },\r\n \".cm-tooltip .cm-tooltip-arrow:before\": {\r\n borderTopColor: \"#e2e8f0\",\r\n borderBottomColor: \"#e2e8f0\",\r\n },\r\n \".cm-tooltip .cm-tooltip-arrow:after\": {\r\n borderTopColor: \"#ffffff\",\r\n borderBottomColor: \"#ffffff\",\r\n },\r\n \".cm-tooltip-autocomplete\": {\r\n \"& > ul > li[aria-selected]\": {\r\n backgroundColor: \"#dbeafe\",\r\n color: \"#1e40af\",\r\n },\r\n },\r\n \".cm-searchMatch\": {\r\n backgroundColor: \"#fef08a\",\r\n outline: \"1px solid #facc15\",\r\n },\r\n \".cm-searchMatch.cm-searchMatch-selected\": {\r\n backgroundColor: \"#bbf7d0\",\r\n outline: \"1px solid #22c55e\",\r\n },\r\n \".cm-selectionMatch\": {\r\n backgroundColor: \"#e0f2fe\",\r\n },\r\n \".cm-matchingBracket, .cm-nonmatchingBracket\": {\r\n outline: \"1px solid #94a3b8\",\r\n },\r\n \".cm-matchingBracket\": {\r\n backgroundColor: \"#e0f2fe\",\r\n },\r\n },\r\n { dark: false },\r\n);\r\n\r\nconst highlightStyle = HighlightStyle.define([\r\n { tag: tags.keyword, color: \"#8b5cf6\" },\r\n { tag: [tags.name, tags.deleted, tags.character, tags.macroName], color: \"#1e1e2e\" },\r\n { tag: [tags.function(tags.variableName), tags.labelName], color: \"#2563eb\" },\r\n { tag: [tags.color, tags.constant(tags.name), tags.standard(tags.name)], color: \"#d97706\" },\r\n { tag: [tags.definition(tags.name), tags.separator], color: \"#1e1e2e\" },\r\n { tag: [tags.typeName, tags.className, tags.number, tags.changed, tags.annotation, tags.modifier, tags.self, tags.namespace], color: \"#d97706\" },\r\n { tag: [tags.operator, tags.operatorKeyword, tags.url, tags.escape, tags.regexp, tags.link, tags.special(tags.string)], color: \"#0891b2\" },\r\n { tag: [tags.meta, tags.comment], color: \"#94a3b8\", fontStyle: \"italic\" },\r\n { tag: tags.strong, fontWeight: \"bold\" },\r\n { tag: tags.emphasis, fontStyle: \"italic\" },\r\n { tag: tags.strikethrough, textDecoration: \"line-through\" },\r\n { tag: tags.link, color: \"#2563eb\", textDecoration: \"underline\" },\r\n { tag: tags.heading, fontWeight: \"bold\", color: \"#8b5cf6\" },\r\n { tag: [tags.atom, tags.bool, tags.special(tags.variableName)], color: \"#d97706\" },\r\n { tag: [tags.processingInstruction, tags.string, tags.inserted], color: \"#059669\" },\r\n { tag: tags.invalid, color: \"#ef4444\" },\r\n { tag: tags.tagName, color: \"#dc2626\" },\r\n { tag: tags.attributeName, color: \"#d97706\" },\r\n { tag: tags.attributeValue, color: \"#059669\" },\r\n]);\r\n\r\nregisterTheme({\r\n name: \"light\",\r\n variant: \"light\",\r\n editorTheme,\r\n highlightStyle,\r\n});\r\n","import { EditorView } from \"@codemirror/view\";\r\nimport { HighlightStyle } from \"@codemirror/language\";\r\nimport { tags } from \"@lezer/highlight\";\r\nimport { registerTheme } from \"./registry\";\r\n\r\nconst editorTheme = EditorView.theme(\r\n {\r\n \"&\": {\r\n backgroundColor: \"#18181b\",\r\n color: \"#e4e4e7\",\r\n },\r\n \".cm-content\": {\r\n caretColor: \"#60a5fa\",\r\n },\r\n \".cm-cursor, .cm-dropCursor\": {\r\n borderLeftColor: \"#60a5fa\",\r\n },\r\n \"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection\": {\r\n backgroundColor: \"#1e3a5f\",\r\n },\r\n \".cm-activeLine\": {\r\n backgroundColor: \"#27272a\",\r\n },\r\n \".cm-gutters\": {\r\n backgroundColor: \"#18181b\",\r\n color: \"#52525b\",\r\n borderRight: \"1px solid #27272a\",\r\n },\r\n \".cm-activeLineGutter\": {\r\n backgroundColor: \"#27272a\",\r\n color: \"#a1a1aa\",\r\n },\r\n \".cm-foldPlaceholder\": {\r\n backgroundColor: \"#3f3f46\",\r\n color: \"#a1a1aa\",\r\n border: \"none\",\r\n },\r\n \".cm-tooltip\": {\r\n backgroundColor: \"#27272a\",\r\n border: \"1px solid #3f3f46\",\r\n color: \"#e4e4e7\",\r\n },\r\n \".cm-tooltip .cm-tooltip-arrow:before\": {\r\n borderTopColor: \"#3f3f46\",\r\n borderBottomColor: \"#3f3f46\",\r\n },\r\n \".cm-tooltip .cm-tooltip-arrow:after\": {\r\n borderTopColor: \"#27272a\",\r\n borderBottomColor: \"#27272a\",\r\n },\r\n \".cm-tooltip-autocomplete\": {\r\n \"& > ul > li[aria-selected]\": {\r\n backgroundColor: \"#1e3a5f\",\r\n color: \"#93c5fd\",\r\n },\r\n },\r\n \".cm-searchMatch\": {\r\n backgroundColor: \"#854d0e\",\r\n outline: \"1px solid #a16207\",\r\n },\r\n \".cm-searchMatch.cm-searchMatch-selected\": {\r\n backgroundColor: \"#166534\",\r\n outline: \"1px solid #15803d\",\r\n },\r\n \".cm-selectionMatch\": {\r\n backgroundColor: \"#1e3a5f\",\r\n },\r\n \".cm-matchingBracket, .cm-nonmatchingBracket\": {\r\n outline: \"1px solid #71717a\",\r\n },\r\n \".cm-matchingBracket\": {\r\n backgroundColor: \"#3f3f46\",\r\n },\r\n },\r\n { dark: true },\r\n);\r\n\r\nconst highlightStyle = HighlightStyle.define([\r\n { tag: tags.keyword, color: \"#c084fc\" },\r\n { tag: [tags.name, tags.deleted, tags.character, tags.macroName], color: \"#e4e4e7\" },\r\n { tag: [tags.function(tags.variableName), tags.labelName], color: \"#60a5fa\" },\r\n { tag: [tags.color, tags.constant(tags.name), tags.standard(tags.name)], color: \"#fbbf24\" },\r\n { tag: [tags.definition(tags.name), tags.separator], color: \"#e4e4e7\" },\r\n { tag: [tags.typeName, tags.className, tags.number, tags.changed, tags.annotation, tags.modifier, tags.self, tags.namespace], color: \"#fbbf24\" },\r\n { tag: [tags.operator, tags.operatorKeyword, tags.url, tags.escape, tags.regexp, tags.link, tags.special(tags.string)], color: \"#22d3ee\" },\r\n { tag: [tags.meta, tags.comment], color: \"#71717a\", fontStyle: \"italic\" },\r\n { tag: tags.strong, fontWeight: \"bold\" },\r\n { tag: tags.emphasis, fontStyle: \"italic\" },\r\n { tag: tags.strikethrough, textDecoration: \"line-through\" },\r\n { tag: tags.link, color: \"#60a5fa\", textDecoration: \"underline\" },\r\n { tag: tags.heading, fontWeight: \"bold\", color: \"#c084fc\" },\r\n { tag: [tags.atom, tags.bool, tags.special(tags.variableName)], color: \"#fbbf24\" },\r\n { tag: [tags.processingInstruction, tags.string, tags.inserted], color: \"#34d399\" },\r\n { tag: tags.invalid, color: \"#f87171\" },\r\n { tag: tags.tagName, color: \"#f87171\" },\r\n { tag: tags.attributeName, color: \"#fbbf24\" },\r\n { tag: tags.attributeValue, color: \"#34d399\" },\r\n]);\r\n\r\nregisterTheme({\r\n name: \"dark\",\r\n variant: \"dark\",\r\n editorTheme,\r\n highlightStyle,\r\n});\r\n","import { useEffect, useRef, type RefObject } from \"react\";\r\nimport { EditorState, Compartment, type Extension } from \"@codemirror/state\";\r\nimport { EditorView, keymap, lineNumbers as lineNumbersExt, highlightActiveLine, highlightActiveLineGutter, drawSelection, dropCursor, placeholder as placeholderExt } from \"@codemirror/view\";\r\nimport { defaultKeymap, history, historyKeymap, indentWithTab } from \"@codemirror/commands\";\r\nimport { syntaxHighlighting, indentOnInput, bracketMatching, foldGutter, foldKeymap } from \"@codemirror/language\";\r\nimport { searchKeymap, highlightSelectionMatches } from \"@codemirror/search\";\r\nimport { autocompletion, completionKeymap, closeBrackets, closeBracketsKeymap } from \"@codemirror/autocomplete\";\r\nimport { getLanguage } from \"../languages\";\r\nimport { getTheme } from \"../themes\";\r\n\r\nexport interface UseCodemirrorOptions {\r\n containerRef: RefObject<HTMLDivElement | null>;\r\n value: string;\r\n onChange?: (value: string) => void;\r\n language: string;\r\n theme: string;\r\n readOnly: boolean;\r\n lineNumbers: boolean;\r\n wordWrap: boolean;\r\n tabSize: number;\r\n placeholder?: string;\r\n minHeight?: number;\r\n maxHeight?: number;\r\n searchEnabled: boolean;\r\n additionalExtensions?: Extension[];\r\n onCursorChange?: (pos: { line: number; col: number; selectionLength: number }) => void;\r\n}\r\n\r\nexport interface UseCodemirrorReturn {\r\n view: EditorView | null;\r\n}\r\n\r\nfunction resolveLanguageExtension(name: string): Extension {\r\n const def = getLanguage(name);\r\n if (!def) return [];\r\n const result = def.support();\r\n if (result instanceof Promise) {\r\n // Async languages are not supported in the initial render; return empty\r\n return [];\r\n }\r\n return result;\r\n}\r\n\r\nfunction resolveThemeExtensions(name: string): Extension[] {\r\n const def = getTheme(name);\r\n if (!def) {\r\n const fallback = getTheme(\"dark\");\r\n if (!fallback) return [];\r\n return [fallback.editorTheme, syntaxHighlighting(fallback.highlightStyle)];\r\n }\r\n return [def.editorTheme, syntaxHighlighting(def.highlightStyle)];\r\n}\r\n\r\nexport function useCodemirror({\r\n containerRef,\r\n value,\r\n onChange,\r\n language,\r\n theme,\r\n readOnly,\r\n lineNumbers,\r\n wordWrap,\r\n tabSize,\r\n placeholder,\r\n minHeight,\r\n maxHeight,\r\n searchEnabled,\r\n additionalExtensions,\r\n onCursorChange,\r\n}: UseCodemirrorOptions): UseCodemirrorReturn {\r\n const viewRef = useRef<EditorView | null>(null);\r\n const isExternalUpdate = useRef(false);\r\n const onChangeRef = useRef(onChange);\r\n const onCursorChangeRef = useRef(onCursorChange);\r\n onChangeRef.current = onChange;\r\n onCursorChangeRef.current = onCursorChange;\r\n\r\n // Compartments for reconfigurable extensions\r\n const languageComp = useRef(new Compartment());\r\n const themeComp = useRef(new Compartment());\r\n const lineNumbersComp = useRef(new Compartment());\r\n const wrapComp = useRef(new Compartment());\r\n const tabSizeComp = useRef(new Compartment());\r\n const readOnlyComp = useRef(new Compartment());\r\n const placeholderComp = useRef(new Compartment());\r\n const heightComp = useRef(new Compartment());\r\n\r\n // Build height theme extension\r\n function buildHeightExtension(min?: number, max?: number): Extension {\r\n const styles: Record<string, string> = {};\r\n if (min) styles.minHeight = `${min}px`;\r\n if (max) styles.maxHeight = `${max}px`;\r\n if (Object.keys(styles).length === 0) return [];\r\n return EditorView.theme({\r\n \"&\": { ...(max ? { maxHeight: `${max}px` } : {}) },\r\n \".cm-scroller\": { overflow: \"auto\", ...styles },\r\n });\r\n }\r\n\r\n // Create the editor on mount\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const updateListener = EditorView.updateListener.of((update) => {\r\n if (update.docChanged && !isExternalUpdate.current) {\r\n onChangeRef.current?.(update.state.doc.toString());\r\n }\r\n if (update.selectionSet || update.docChanged) {\r\n const pos = update.state.selection.main;\r\n const line = update.state.doc.lineAt(pos.head);\r\n onCursorChangeRef.current?.({\r\n line: line.number,\r\n col: pos.head - line.from + 1,\r\n selectionLength: Math.abs(pos.to - pos.from),\r\n });\r\n }\r\n });\r\n\r\n const state = EditorState.create({\r\n doc: value,\r\n extensions: [\r\n // Compartmentalized extensions\r\n languageComp.current.of(resolveLanguageExtension(language)),\r\n themeComp.current.of(resolveThemeExtensions(theme)),\r\n lineNumbersComp.current.of(lineNumbers ? [lineNumbersExt(), highlightActiveLineGutter()] : []),\r\n wrapComp.current.of(wordWrap ? EditorView.lineWrapping : []),\r\n tabSizeComp.current.of(EditorState.tabSize.of(tabSize)),\r\n readOnlyComp.current.of(EditorState.readOnly.of(readOnly)),\r\n placeholderComp.current.of(placeholder ? placeholderExt(placeholder) : []),\r\n heightComp.current.of(buildHeightExtension(minHeight, maxHeight)),\r\n // Static extensions\r\n history(),\r\n foldGutter(),\r\n drawSelection(),\r\n dropCursor(),\r\n indentOnInput(),\r\n bracketMatching(),\r\n closeBrackets(),\r\n autocompletion(),\r\n highlightActiveLine(),\r\n highlightSelectionMatches(),\r\n keymap.of([\r\n ...closeBracketsKeymap,\r\n ...defaultKeymap,\r\n ...searchKeymap,\r\n ...historyKeymap,\r\n ...foldKeymap,\r\n ...completionKeymap,\r\n indentWithTab,\r\n ]),\r\n updateListener,\r\n ...(additionalExtensions ?? []),\r\n ],\r\n });\r\n\r\n const view = new EditorView({ state, parent: container });\r\n viewRef.current = view;\r\n\r\n return () => {\r\n view.destroy();\r\n viewRef.current = null;\r\n };\r\n // Only run on mount/unmount — compartments handle reconfig\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [containerRef]);\r\n\r\n // Sync external value changes\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n const currentDoc = view.state.doc.toString();\r\n if (value !== currentDoc) {\r\n isExternalUpdate.current = true;\r\n view.dispatch({\r\n changes: { from: 0, to: currentDoc.length, insert: value },\r\n });\r\n isExternalUpdate.current = false;\r\n }\r\n }, [value]);\r\n\r\n // Reconfigure language\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n\r\n const def = getLanguage(language);\r\n if (!def) {\r\n view.dispatch({ effects: languageComp.current.reconfigure([]) });\r\n return;\r\n }\r\n\r\n const result = def.support();\r\n if (result instanceof Promise) {\r\n result.then((ext) => {\r\n if (viewRef.current) {\r\n viewRef.current.dispatch({ effects: languageComp.current.reconfigure(ext) });\r\n }\r\n });\r\n } else {\r\n view.dispatch({ effects: languageComp.current.reconfigure(result) });\r\n }\r\n }, [language]);\r\n\r\n // Reconfigure theme\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n view.dispatch({ effects: themeComp.current.reconfigure(resolveThemeExtensions(theme)) });\r\n }, [theme]);\r\n\r\n // Reconfigure line numbers\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n view.dispatch({\r\n effects: lineNumbersComp.current.reconfigure(\r\n lineNumbers ? [lineNumbersExt(), highlightActiveLineGutter()] : [],\r\n ),\r\n });\r\n }, [lineNumbers]);\r\n\r\n // Reconfigure word wrap\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n view.dispatch({\r\n effects: wrapComp.current.reconfigure(wordWrap ? EditorView.lineWrapping : []),\r\n });\r\n }, [wordWrap]);\r\n\r\n // Reconfigure tab size\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n view.dispatch({\r\n effects: tabSizeComp.current.reconfigure(EditorState.tabSize.of(tabSize)),\r\n });\r\n }, [tabSize]);\r\n\r\n // Reconfigure read-only\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n view.dispatch({\r\n effects: readOnlyComp.current.reconfigure(EditorState.readOnly.of(readOnly)),\r\n });\r\n }, [readOnly]);\r\n\r\n // Reconfigure placeholder\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n view.dispatch({\r\n effects: placeholderComp.current.reconfigure(placeholder ? placeholderExt(placeholder) : []),\r\n });\r\n }, [placeholder]);\r\n\r\n return { view: viewRef.current };\r\n}\r\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\";\r\nimport { cn, useControllableState } from \"@particle-academy/react-fancy\";\r\nimport { CodeEditorContext } from \"./CodeEditor.context\";\r\nimport { CodeEditorPanel } from \"./CodeEditorPanel\";\r\nimport { CodeEditorToolbar } from \"./CodeEditorToolbar\";\r\nimport { CodeEditorToolbarSeparator } from \"./CodeEditorToolbarSeparator\";\r\nimport { CodeEditorStatusBar } from \"./CodeEditorStatusBar\";\r\nimport { useCodemirror } from \"../../hooks/use-codemirror\";\r\nimport { useDarkMode } from \"../../hooks/use-dark-mode\";\r\nimport { getLanguage } from \"../../languages\";\r\nimport type { CodeEditorProps, CodeEditorContextValue } from \"./CodeEditor.types\";\r\n\r\nfunction CodeEditorRoot({\r\n children,\r\n className,\r\n value: valueProp,\r\n defaultValue = \"\",\r\n onChange,\r\n language: languageProp = \"javascript\",\r\n onLanguageChange,\r\n theme = \"auto\",\r\n readOnly = false,\r\n lineNumbers: lineNumbersProp = true,\r\n wordWrap: wordWrapProp = false,\r\n tabSize: tabSizeProp = 2,\r\n placeholder,\r\n minHeight,\r\n maxHeight,\r\n extensions: additionalExtensions,\r\n}: CodeEditorProps) {\r\n const [currentValue, setCurrentValue] = useControllableState(valueProp, defaultValue, onChange);\r\n\r\n // Reactive dark mode for \"auto\" theme\r\n const isDark = useDarkMode();\r\n const resolvedTheme = theme === \"auto\" ? (isDark ? \"dark\" : \"light\") : theme;\r\n\r\n // Language state (changeable via toolbar selector)\r\n const [currentLanguage, setCurrentLanguageState] = useState(() => {\r\n // Resolve to display name\r\n const def = getLanguage(languageProp);\r\n return def?.name ?? languageProp;\r\n });\r\n\r\n const setLanguage = useCallback(\r\n (lang: string) => {\r\n const def = getLanguage(lang);\r\n const resolved = def?.name ?? lang;\r\n setCurrentLanguageState(resolved);\r\n onLanguageChange?.(resolved);\r\n },\r\n [onLanguageChange],\r\n );\r\n\r\n // Toggle states\r\n const [showLineNumbers, setShowLineNumbers] = useState(lineNumbersProp);\r\n const [isWordWrap, setIsWordWrap] = useState(wordWrapProp);\r\n\r\n // Cursor position\r\n const [cursorPosition, setCursorPosition] = useState({ line: 1, col: 1 });\r\n const [selectionLength, setSelectionLength] = useState(0);\r\n\r\n // Container ref for CodeMirror mount\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Core CodeMirror hook\r\n const { view } = useCodemirror({\r\n containerRef,\r\n value: currentValue,\r\n onChange: setCurrentValue,\r\n language: currentLanguage,\r\n theme: resolvedTheme,\r\n readOnly,\r\n lineNumbers: showLineNumbers,\r\n wordWrap: isWordWrap,\r\n tabSize: tabSizeProp,\r\n placeholder,\r\n minHeight,\r\n maxHeight,\r\n searchEnabled: true,\r\n additionalExtensions,\r\n onCursorChange: ({ line, col, selectionLength: sel }) => {\r\n setCursorPosition({ line, col });\r\n setSelectionLength(sel);\r\n },\r\n });\r\n\r\n const contextValue = useMemo<CodeEditorContextValue>(\r\n () => ({\r\n view,\r\n getValue: () => view?.state.doc.toString() ?? currentValue,\r\n getSelection: () => {\r\n if (!view) return \"\";\r\n const sel = view.state.selection.main;\r\n return view.state.sliceDoc(sel.from, sel.to);\r\n },\r\n setValue: (v: string) => setCurrentValue(v),\r\n replaceSelection: (text: string) => {\r\n if (!view) return;\r\n view.dispatch(view.state.replaceSelection(text));\r\n },\r\n focus: () => view?.focus(),\r\n language: currentLanguage,\r\n setLanguage,\r\n theme: resolvedTheme,\r\n readOnly,\r\n lineNumbers: showLineNumbers,\r\n wordWrap: isWordWrap,\r\n tabSize: tabSizeProp,\r\n toggleWordWrap: () => setIsWordWrap((w) => !w),\r\n toggleLineNumbers: () => setShowLineNumbers((l) => !l),\r\n copyToClipboard: async () => {\r\n const text = view?.state.doc.toString() ?? currentValue;\r\n await navigator.clipboard.writeText(text);\r\n },\r\n cursorPosition,\r\n selectionLength,\r\n _containerRef: containerRef,\r\n _minHeight: minHeight,\r\n _maxHeight: maxHeight,\r\n }),\r\n [view, currentValue, currentLanguage, setLanguage, resolvedTheme, readOnly, showLineNumbers, isWordWrap, tabSizeProp, cursorPosition, selectionLength, setCurrentValue, minHeight, maxHeight],\r\n );\r\n\r\n return (\r\n <CodeEditorContext.Provider value={contextValue}>\r\n <div\r\n data-fancy-code-editor=\"\"\r\n className={cn(\r\n \"overflow-hidden rounded-xl border border-zinc-200 bg-white dark:border-zinc-700 dark:bg-zinc-900\",\r\n className,\r\n )}\r\n >\r\n {children}\r\n </div>\r\n </CodeEditorContext.Provider>\r\n );\r\n}\r\n\r\nCodeEditorRoot.displayName = \"CodeEditor\";\r\n\r\nconst ToolbarWithSeparator = Object.assign(CodeEditorToolbar, {\r\n Separator: CodeEditorToolbarSeparator,\r\n});\r\n\r\nexport const CodeEditor = Object.assign(CodeEditorRoot, {\r\n Toolbar: ToolbarWithSeparator,\r\n Panel: CodeEditorPanel,\r\n StatusBar: CodeEditorStatusBar,\r\n});\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/styles.css"],"sourcesContent":["/* @particle-academy/fancy-code — base editor styles */\n\n/* Ensure CodeMirror fills its container */\n[data-fancy-code-panel] .cm-editor {\n height: 100%;\n}\n\n[data-fancy-code-panel] .cm-editor.cm-focused {\n outline: none;\n}\n\n/* Monospace font for code content */\n[data-fancy-code-panel] .cm-scroller {\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace;\n}\n\n/* Smooth transitions for theme switching */\n[data-fancy-code-panel] .cm-gutters {\n transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;\n}\n\n[data-fancy-code-panel] .cm-editor {\n transition: background-color 0.15s ease;\n}\n\n/* Scrollbar styling */\n[data-fancy-code-panel] .cm-scroller::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n[data-fancy-code-panel] .cm-scroller::-webkit-scrollbar-track {\n background: transparent;\n}\n\n[data-fancy-code-panel] .cm-scroller::-webkit-scrollbar-thumb {\n background: #a1a1aa;\n border-radius: 4px;\n}\n\n.dark [data-fancy-code-panel] .cm-scroller::-webkit-scrollbar-thumb {\n background: #52525b;\n}\n"],"mappings":";AAGA,CAAC,uBAAuB,CAAC;AACvB,UAAQ;AACV;AAEA,CAAC,uBAAuB,CAJC,SAIS,CAAC;AACjC,WAAS;AACX;AAGA,CAAC,uBAAuB,CAAC;AACvB;AAAA,IAAa,YAAY;AAAA,IAAE,cAAc;AAAA,IAAE,SAAS;AAAA,IAAE,KAAK;AAAA,IAAE,QAAQ;AAAA,IAAE,iBAAiB;AAAA,IAAE;AAC5F;AAGA,CAAC,uBAAuB,CAAC;AACvB;AAAA,IAAY,iBAAiB,MAAM,IAAI;AAAA,IAAE,MAAM,MAAM,IAAI;AAAA,IAAE,aAAa,MAAM;AAChF;AAEA,CAAC,uBAAuB,CAlBC;AAmBvB,cAAY,iBAAiB,MAAM;AACrC;AAGA,CAAC,uBAAuB,CAdC,WAcW;AAClC,SAAO;AACP,UAAQ;AACV;AAEA,CAAC,uBAAuB,CAnBC,WAmBW;AAClC,cAAY;AACd;AAEA,CAAC,uBAAuB,CAvBC,WAuBW;AAClC,cAAY;AACZ,iBAAe;AACjB;AAEA,CAAC,KAAK,CAAC,uBAAuB,CA5BL,WA4BiB;AACxC,cAAY;AACd;","names":[]}
1
+ {"version":3,"sources":["../src/styles.css"],"sourcesContent":["/* @particle-academy/fancy-code — base editor styles */\r\n\r\n/* Ensure CodeMirror fills its container */\r\n[data-fancy-code-panel] .cm-editor {\r\n height: 100%;\r\n}\r\n\r\n[data-fancy-code-panel] .cm-editor.cm-focused {\r\n outline: none;\r\n}\r\n\r\n/* Monospace font for code content */\r\n[data-fancy-code-panel] .cm-scroller {\r\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace;\r\n}\r\n\r\n/* Smooth transitions for theme switching */\r\n[data-fancy-code-panel] .cm-gutters {\r\n transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;\r\n}\r\n\r\n[data-fancy-code-panel] .cm-editor {\r\n transition: background-color 0.15s ease;\r\n}\r\n\r\n/* Scrollbar styling */\r\n[data-fancy-code-panel] .cm-scroller::-webkit-scrollbar {\r\n width: 8px;\r\n height: 8px;\r\n}\r\n\r\n[data-fancy-code-panel] .cm-scroller::-webkit-scrollbar-track {\r\n background: transparent;\r\n}\r\n\r\n[data-fancy-code-panel] .cm-scroller::-webkit-scrollbar-thumb {\r\n background: #a1a1aa;\r\n border-radius: 4px;\r\n}\r\n\r\n.dark [data-fancy-code-panel] .cm-scroller::-webkit-scrollbar-thumb {\r\n background: #52525b;\r\n}\r\n"],"mappings":";AAGA,CAAC,uBAAuB,CAAC;AACvB,UAAQ;AACV;AAEA,CAAC,uBAAuB,CAJC,SAIS,CAAC;AACjC,WAAS;AACX;AAGA,CAAC,uBAAuB,CAAC;AACvB;AAAA,IAAa,YAAY;AAAA,IAAE,cAAc;AAAA,IAAE,SAAS;AAAA,IAAE,KAAK;AAAA,IAAE,QAAQ;AAAA,IAAE,iBAAiB;AAAA,IAAE;AAC5F;AAGA,CAAC,uBAAuB,CAAC;AACvB;AAAA,IAAY,iBAAiB,MAAM,IAAI;AAAA,IAAE,MAAM,MAAM,IAAI;AAAA,IAAE,aAAa,MAAM;AAChF;AAEA,CAAC,uBAAuB,CAlBC;AAmBvB,cAAY,iBAAiB,MAAM;AACrC;AAGA,CAAC,uBAAuB,CAdC,WAcW;AAClC,SAAO;AACP,UAAQ;AACV;AAEA,CAAC,uBAAuB,CAnBC,WAmBW;AAClC,cAAY;AACd;AAEA,CAAC,uBAAuB,CAvBC,WAuBW;AAClC,cAAY;AACZ,iBAAe;AACjB;AAEA,CAAC,KAAK,CAAC,uBAAuB,CA5BL,WA4BiB;AACxC,cAAY;AACd;","names":[]}
package/package.json CHANGED
@@ -1,71 +1,71 @@
1
- {
2
- "name": "@particle-academy/fancy-code",
3
- "version": "0.1.1",
4
- "description": "Lightweight embedded code editor component built on CodeMirror 6",
5
- "type": "module",
6
- "main": "./dist/index.cjs",
7
- "module": "./dist/index.js",
8
- "types": "./dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "import": {
12
- "types": "./dist/index.d.ts",
13
- "default": "./dist/index.js"
14
- },
15
- "require": {
16
- "types": "./dist/index.d.cts",
17
- "default": "./dist/index.cjs"
18
- }
19
- },
20
- "./styles.css": "./dist/styles.css"
21
- },
22
- "files": [
23
- "dist",
24
- "README.md"
25
- ],
26
- "scripts": {
27
- "build": "tsup",
28
- "dev": "tsup --watch",
29
- "lint": "tsc --noEmit",
30
- "clean": "rm -rf dist",
31
- "prepublishOnly": "tsup"
32
- },
33
- "peerDependencies": {
34
- "react": "^18.0.0 || ^19.0.0",
35
- "react-dom": "^18.0.0 || ^19.0.0",
36
- "@particle-academy/react-fancy": "^1.5.0"
37
- },
38
- "dependencies": {
39
- "@codemirror/autocomplete": "^6.0.0",
40
- "@codemirror/commands": "^6.0.0",
41
- "@codemirror/lang-html": "^6.0.0",
42
- "@codemirror/lang-javascript": "^6.0.0",
43
- "@codemirror/lang-php": "^6.0.0",
44
- "@codemirror/language": "^6.0.0",
45
- "@codemirror/search": "^6.0.0",
46
- "@codemirror/state": "^6.0.0",
47
- "@codemirror/view": "^6.0.0",
48
- "@lezer/highlight": "^1.0.0"
49
- },
50
- "devDependencies": {
51
- "@particle-academy/react-fancy": "workspace:*",
52
- "@types/react": "^19.0.0",
53
- "@types/react-dom": "^19.0.0",
54
- "react": "^19.0.0",
55
- "react-dom": "^19.0.0",
56
- "tsup": "^8.5.0",
57
- "typescript": "^5.8.0"
58
- },
59
- "publishConfig": {
60
- "access": "public"
61
- },
62
- "license": "MIT",
63
- "sideEffects": [
64
- "**/*.css",
65
- "src/languages/builtin.ts",
66
- "src/languages/index.ts",
67
- "src/themes/light.ts",
68
- "src/themes/dark.ts",
69
- "src/themes/index.ts"
70
- ]
71
- }
1
+ {
2
+ "name": "@particle-academy/fancy-code",
3
+ "version": "0.1.2",
4
+ "description": "Lightweight embedded code editor with syntax highlighting and extensible language/theme registries",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ },
20
+ "./styles.css": "./dist/styles.css"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "README.md"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsup",
28
+ "dev": "tsup --watch",
29
+ "lint": "tsc --noEmit",
30
+ "clean": "rm -rf dist",
31
+ "prepublishOnly": "tsup"
32
+ },
33
+ "peerDependencies": {
34
+ "react": "^18.0.0 || ^19.0.0",
35
+ "react-dom": "^18.0.0 || ^19.0.0",
36
+ "@particle-academy/react-fancy": "^1.5.0"
37
+ },
38
+ "dependencies": {
39
+ "@codemirror/autocomplete": "^6.0.0",
40
+ "@codemirror/commands": "^6.0.0",
41
+ "@codemirror/lang-html": "^6.0.0",
42
+ "@codemirror/lang-javascript": "^6.0.0",
43
+ "@codemirror/lang-php": "^6.0.0",
44
+ "@codemirror/language": "^6.0.0",
45
+ "@codemirror/search": "^6.0.0",
46
+ "@codemirror/state": "^6.0.0",
47
+ "@codemirror/view": "^6.0.0",
48
+ "@lezer/highlight": "^1.0.0"
49
+ },
50
+ "devDependencies": {
51
+ "@particle-academy/react-fancy": "workspace:*",
52
+ "@types/react": "^19.0.0",
53
+ "@types/react-dom": "^19.0.0",
54
+ "react": "^19.0.0",
55
+ "react-dom": "^19.0.0",
56
+ "tsup": "^8.5.0",
57
+ "typescript": "^5.8.0"
58
+ },
59
+ "publishConfig": {
60
+ "access": "public"
61
+ },
62
+ "license": "MIT",
63
+ "sideEffects": [
64
+ "**/*.css",
65
+ "src/languages/builtin.ts",
66
+ "src/languages/index.ts",
67
+ "src/themes/light.ts",
68
+ "src/themes/dark.ts",
69
+ "src/themes/index.ts"
70
+ ]
71
+ }