asterui 0.12.78 → 0.12.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/codeeditor.d.ts +1 -0
- package/dist/codeeditor.js +5 -0
- package/dist/codeeditor.js.map +1 -0
- package/dist/components/CodeEditor.d.ts +47 -0
- package/dist/components/CodeEditor.js +244 -0
- package/dist/components/CodeEditor.js.map +1 -0
- package/dist/components/DateOfBirth.js +122 -133
- package/dist/components/DateOfBirth.js.map +1 -1
- package/dist/components/Terminal.d.ts +40 -0
- package/dist/components/Terminal.js +146 -0
- package/dist/components/Terminal.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +101 -99
- package/dist/index.js.map +1 -1
- package/dist/terminal.d.ts +1 -0
- package/dist/terminal.js +5 -0
- package/dist/terminal.js.map +1 -0
- package/package.json +95 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CodeEditor, type CodeEditorProps, type CodeEditorLanguage } from './components/CodeEditor';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codeeditor.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { Extension } from '@codemirror/state';
|
|
3
|
+
import { EditorView } from '@codemirror/view';
|
|
4
|
+
export type CodeEditorLanguage = 'javascript' | 'typescript' | 'jsx' | 'tsx' | 'python' | 'html' | 'css' | 'json' | 'markdown' | 'sql' | 'xml' | 'plaintext';
|
|
5
|
+
export interface CodeEditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
|
|
6
|
+
/** Code content */
|
|
7
|
+
value?: string;
|
|
8
|
+
/** Callback when content changes */
|
|
9
|
+
onChange?: (value: string) => void;
|
|
10
|
+
/** Programming language for syntax highlighting */
|
|
11
|
+
language?: CodeEditorLanguage;
|
|
12
|
+
/** Placeholder text when empty */
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
/** Make editor read-only */
|
|
15
|
+
readOnly?: boolean;
|
|
16
|
+
/** Auto focus on mount */
|
|
17
|
+
autoFocus?: boolean;
|
|
18
|
+
/** Show line numbers */
|
|
19
|
+
lineNumbers?: boolean;
|
|
20
|
+
/** Enable code folding */
|
|
21
|
+
foldGutter?: boolean;
|
|
22
|
+
/** Highlight active line */
|
|
23
|
+
highlightActiveLine?: boolean;
|
|
24
|
+
/** Enable bracket matching */
|
|
25
|
+
bracketMatching?: boolean;
|
|
26
|
+
/** Enable auto-closing brackets */
|
|
27
|
+
closeBrackets?: boolean;
|
|
28
|
+
/** Enable autocompletion */
|
|
29
|
+
autocompletion?: boolean;
|
|
30
|
+
/** Allow tab key for indentation */
|
|
31
|
+
indentWithTab?: boolean;
|
|
32
|
+
/** Minimum height of the editor */
|
|
33
|
+
minHeight?: string | number;
|
|
34
|
+
/** Maximum height of the editor (enables scrolling) */
|
|
35
|
+
maxHeight?: string | number;
|
|
36
|
+
/** Editor size variant */
|
|
37
|
+
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
38
|
+
/** Show border around editor */
|
|
39
|
+
bordered?: boolean;
|
|
40
|
+
/** Additional CodeMirror extensions */
|
|
41
|
+
extensions?: Extension[];
|
|
42
|
+
/** Callback with editor view instance */
|
|
43
|
+
onEditorReady?: (view: EditorView) => void;
|
|
44
|
+
'data-testid'?: string;
|
|
45
|
+
}
|
|
46
|
+
export declare const CodeEditor: React.ForwardRefExoticComponent<CodeEditorProps & React.RefAttributes<HTMLDivElement>>;
|
|
47
|
+
export default CodeEditor;
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { jsx as N } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as W, useRef as d, useEffect as g } from "react";
|
|
3
|
+
import { EditorState as b } from "@codemirror/state";
|
|
4
|
+
import { EditorView as e, highlightSpecialChars as _, drawSelection as D, dropCursor as I, rectangularSelection as J, crosshairCursor as P, keymap as R, lineNumbers as Q, highlightActiveLine as U, highlightActiveLineGutter as X } from "@codemirror/view";
|
|
5
|
+
import { indentOnInput as Y, syntaxHighlighting as Z, defaultHighlightStyle as tt, foldKeymap as et, foldGutter as ot, bracketMatching as rt } from "@codemirror/language";
|
|
6
|
+
import { history as it, defaultKeymap as nt, historyKeymap as ct, indentWithTab as st } from "@codemirror/commands";
|
|
7
|
+
import { highlightSelectionMatches as lt, searchKeymap as at } from "@codemirror/search";
|
|
8
|
+
import { closeBracketsKeymap as ut, completionKeymap as mt, closeBrackets as ft, autocompletion as pt } from "@codemirror/autocomplete";
|
|
9
|
+
import { lintKeymap as ht } from "@codemirror/lint";
|
|
10
|
+
import { javascript as s } from "@codemirror/lang-javascript";
|
|
11
|
+
import { python as dt } from "@codemirror/lang-python";
|
|
12
|
+
import { html as gt } from "@codemirror/lang-html";
|
|
13
|
+
import { css as bt } from "@codemirror/lang-css";
|
|
14
|
+
import { json as yt } from "@codemirror/lang-json";
|
|
15
|
+
import { markdown as vt } from "@codemirror/lang-markdown";
|
|
16
|
+
import { sql as St } from "@codemirror/lang-sql";
|
|
17
|
+
import { xml as kt } from "@codemirror/lang-xml";
|
|
18
|
+
import { useConfig as xt } from "../providers/ConfigProvider.js";
|
|
19
|
+
const Ct = {
|
|
20
|
+
xs: { fontSize: "11px", lineHeight: "1.4" },
|
|
21
|
+
sm: { fontSize: "12px", lineHeight: "1.5" },
|
|
22
|
+
md: { fontSize: "14px", lineHeight: "1.6" },
|
|
23
|
+
lg: { fontSize: "16px", lineHeight: "1.6" },
|
|
24
|
+
xl: { fontSize: "18px", lineHeight: "1.7" }
|
|
25
|
+
};
|
|
26
|
+
function zt(o) {
|
|
27
|
+
switch (o) {
|
|
28
|
+
case "javascript":
|
|
29
|
+
return s();
|
|
30
|
+
case "typescript":
|
|
31
|
+
return s({ typescript: !0 });
|
|
32
|
+
case "jsx":
|
|
33
|
+
return s({ jsx: !0 });
|
|
34
|
+
case "tsx":
|
|
35
|
+
return s({ jsx: !0, typescript: !0 });
|
|
36
|
+
case "python":
|
|
37
|
+
return dt();
|
|
38
|
+
case "html":
|
|
39
|
+
return gt();
|
|
40
|
+
case "css":
|
|
41
|
+
return bt();
|
|
42
|
+
case "json":
|
|
43
|
+
return yt();
|
|
44
|
+
case "markdown":
|
|
45
|
+
return vt();
|
|
46
|
+
case "sql":
|
|
47
|
+
return St();
|
|
48
|
+
case "xml":
|
|
49
|
+
return kt();
|
|
50
|
+
default:
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const wt = e.theme({
|
|
55
|
+
"&": {
|
|
56
|
+
backgroundColor: "oklch(var(--b1))",
|
|
57
|
+
color: "oklch(var(--bc))"
|
|
58
|
+
},
|
|
59
|
+
".cm-content": {
|
|
60
|
+
caretColor: "oklch(var(--bc))",
|
|
61
|
+
fontFamily: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace'
|
|
62
|
+
},
|
|
63
|
+
".cm-cursor, .cm-dropCursor": {
|
|
64
|
+
borderLeftColor: "oklch(var(--bc))"
|
|
65
|
+
},
|
|
66
|
+
"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection": {
|
|
67
|
+
backgroundColor: "oklch(var(--p) / 0.2)"
|
|
68
|
+
},
|
|
69
|
+
".cm-activeLine": {
|
|
70
|
+
backgroundColor: "oklch(var(--bc) / 0.05)"
|
|
71
|
+
},
|
|
72
|
+
".cm-activeLineGutter": {
|
|
73
|
+
backgroundColor: "oklch(var(--bc) / 0.05)"
|
|
74
|
+
},
|
|
75
|
+
".cm-gutters": {
|
|
76
|
+
backgroundColor: "oklch(var(--b2))",
|
|
77
|
+
color: "oklch(var(--bc) / 0.5)",
|
|
78
|
+
borderRight: "1px solid oklch(var(--b3))"
|
|
79
|
+
},
|
|
80
|
+
".cm-lineNumbers .cm-gutterElement": {
|
|
81
|
+
padding: "0 8px 0 16px"
|
|
82
|
+
},
|
|
83
|
+
".cm-foldGutter .cm-gutterElement": {
|
|
84
|
+
padding: "0 4px"
|
|
85
|
+
},
|
|
86
|
+
".cm-scroller": {
|
|
87
|
+
overflow: "auto"
|
|
88
|
+
},
|
|
89
|
+
".cm-placeholder": {
|
|
90
|
+
color: "oklch(var(--bc) / 0.4)",
|
|
91
|
+
fontStyle: "italic"
|
|
92
|
+
}
|
|
93
|
+
}), jt = W(
|
|
94
|
+
({
|
|
95
|
+
value: o = "",
|
|
96
|
+
onChange: l,
|
|
97
|
+
language: y = "plaintext",
|
|
98
|
+
placeholder: i,
|
|
99
|
+
readOnly: v = !1,
|
|
100
|
+
autoFocus: S = !1,
|
|
101
|
+
lineNumbers: k = !0,
|
|
102
|
+
foldGutter: x = !0,
|
|
103
|
+
highlightActiveLine: C = !0,
|
|
104
|
+
bracketMatching: z = !0,
|
|
105
|
+
closeBrackets: w = !0,
|
|
106
|
+
autocompletion: j = !0,
|
|
107
|
+
indentWithTab: E = !0,
|
|
108
|
+
minHeight: a = 200,
|
|
109
|
+
maxHeight: n,
|
|
110
|
+
size: $,
|
|
111
|
+
bordered: G = !0,
|
|
112
|
+
extensions: H = [],
|
|
113
|
+
onEditorReady: u,
|
|
114
|
+
className: B = "",
|
|
115
|
+
"data-testid": q = "code-editor",
|
|
116
|
+
...A
|
|
117
|
+
}, T) => {
|
|
118
|
+
const { componentSize: V } = xt(), K = $ ?? V ?? "md", m = d(null), f = d(null), p = d(l);
|
|
119
|
+
g(() => {
|
|
120
|
+
p.current = l;
|
|
121
|
+
}, [l]), g(() => {
|
|
122
|
+
if (!m.current) return;
|
|
123
|
+
const t = [
|
|
124
|
+
wt,
|
|
125
|
+
_(),
|
|
126
|
+
it(),
|
|
127
|
+
D(),
|
|
128
|
+
I(),
|
|
129
|
+
b.allowMultipleSelections.of(!0),
|
|
130
|
+
Y(),
|
|
131
|
+
Z(tt, { fallback: !0 }),
|
|
132
|
+
J(),
|
|
133
|
+
P(),
|
|
134
|
+
lt(),
|
|
135
|
+
R.of([
|
|
136
|
+
...ut,
|
|
137
|
+
...nt,
|
|
138
|
+
...at,
|
|
139
|
+
...ct,
|
|
140
|
+
...et,
|
|
141
|
+
...mt,
|
|
142
|
+
...ht
|
|
143
|
+
])
|
|
144
|
+
];
|
|
145
|
+
k && t.push(Q()), x && t.push(ot()), C && (t.push(U()), t.push(X())), z && t.push(rt()), w && t.push(ft()), j && t.push(pt()), E && t.push(R.of([st]));
|
|
146
|
+
const r = zt(y);
|
|
147
|
+
r && t.push(r), i && (t.push(e.contentAttributes.of({ "aria-placeholder": i })), t.push(
|
|
148
|
+
e.theme({
|
|
149
|
+
".cm-content:has(.cm-line:only-child:empty)::before": {
|
|
150
|
+
content: `"${i}"`,
|
|
151
|
+
position: "absolute",
|
|
152
|
+
color: "oklch(var(--bc) / 0.4)",
|
|
153
|
+
fontStyle: "italic",
|
|
154
|
+
pointerEvents: "none"
|
|
155
|
+
}
|
|
156
|
+
})
|
|
157
|
+
)), v && (t.push(b.readOnly.of(!0)), t.push(e.editable.of(!1))), t.push(
|
|
158
|
+
e.updateListener.of((M) => {
|
|
159
|
+
M.docChanged && p.current && p.current(M.state.doc.toString());
|
|
160
|
+
})
|
|
161
|
+
);
|
|
162
|
+
const h = Ct[K];
|
|
163
|
+
t.push(
|
|
164
|
+
e.theme({
|
|
165
|
+
".cm-content": {
|
|
166
|
+
fontSize: h.fontSize,
|
|
167
|
+
lineHeight: h.lineHeight
|
|
168
|
+
},
|
|
169
|
+
".cm-gutters": {
|
|
170
|
+
fontSize: h.fontSize
|
|
171
|
+
}
|
|
172
|
+
})
|
|
173
|
+
), t.push(...H);
|
|
174
|
+
const O = b.create({
|
|
175
|
+
doc: o,
|
|
176
|
+
extensions: t
|
|
177
|
+
}), c = new e({
|
|
178
|
+
state: O,
|
|
179
|
+
parent: m.current
|
|
180
|
+
});
|
|
181
|
+
return f.current = c, S && c.focus(), u && u(c), () => {
|
|
182
|
+
c.destroy(), f.current = null;
|
|
183
|
+
};
|
|
184
|
+
}, [
|
|
185
|
+
y,
|
|
186
|
+
i,
|
|
187
|
+
v,
|
|
188
|
+
k,
|
|
189
|
+
x,
|
|
190
|
+
C,
|
|
191
|
+
z,
|
|
192
|
+
w,
|
|
193
|
+
j,
|
|
194
|
+
E,
|
|
195
|
+
K,
|
|
196
|
+
S,
|
|
197
|
+
H,
|
|
198
|
+
u
|
|
199
|
+
]), g(() => {
|
|
200
|
+
const t = f.current;
|
|
201
|
+
if (!t) return;
|
|
202
|
+
const r = t.state.doc.toString();
|
|
203
|
+
o !== r && t.dispatch({
|
|
204
|
+
changes: {
|
|
205
|
+
from: 0,
|
|
206
|
+
to: r.length,
|
|
207
|
+
insert: o
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}, [o]);
|
|
211
|
+
const F = typeof a == "number" ? `${a}px` : a, L = n ? typeof n == "number" ? `${n}px` : n : void 0;
|
|
212
|
+
return /* @__PURE__ */ N(
|
|
213
|
+
"div",
|
|
214
|
+
{
|
|
215
|
+
ref: T,
|
|
216
|
+
className: `
|
|
217
|
+
bg-base-100 rounded-lg overflow-hidden
|
|
218
|
+
${G ? "border border-base-300" : ""}
|
|
219
|
+
${B}
|
|
220
|
+
`,
|
|
221
|
+
"data-testid": q,
|
|
222
|
+
...A,
|
|
223
|
+
children: /* @__PURE__ */ N(
|
|
224
|
+
"div",
|
|
225
|
+
{
|
|
226
|
+
ref: m,
|
|
227
|
+
className: "[&_.cm-editor]:outline-none",
|
|
228
|
+
style: {
|
|
229
|
+
minHeight: F,
|
|
230
|
+
maxHeight: L,
|
|
231
|
+
overflow: L ? "auto" : void 0
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
)
|
|
235
|
+
}
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
);
|
|
239
|
+
jt.displayName = "CodeEditor";
|
|
240
|
+
export {
|
|
241
|
+
jt as CodeEditor,
|
|
242
|
+
jt as default
|
|
243
|
+
};
|
|
244
|
+
//# sourceMappingURL=CodeEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeEditor.js","sources":["../../src/components/CodeEditor.tsx"],"sourcesContent":["import React, { forwardRef, useEffect, useRef } from 'react'\nimport { EditorState, type Extension } from '@codemirror/state'\nimport { EditorView, keymap, lineNumbers, highlightActiveLine, highlightActiveLineGutter, drawSelection, dropCursor, rectangularSelection, crosshairCursor, highlightSpecialChars } from '@codemirror/view'\nimport { defaultHighlightStyle, syntaxHighlighting, indentOnInput, bracketMatching, foldGutter, foldKeymap } from '@codemirror/language'\nimport { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands'\nimport { searchKeymap, highlightSelectionMatches } from '@codemirror/search'\nimport { autocompletion, completionKeymap, closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete'\nimport { lintKeymap } from '@codemirror/lint'\nimport { javascript } from '@codemirror/lang-javascript'\nimport { python } from '@codemirror/lang-python'\nimport { html } from '@codemirror/lang-html'\nimport { css } from '@codemirror/lang-css'\nimport { json } from '@codemirror/lang-json'\nimport { markdown } from '@codemirror/lang-markdown'\nimport { sql } from '@codemirror/lang-sql'\nimport { xml } from '@codemirror/lang-xml'\nimport { useConfig } from '../providers/ConfigProvider'\n\nexport type CodeEditorLanguage =\n | 'javascript'\n | 'typescript'\n | 'jsx'\n | 'tsx'\n | 'python'\n | 'html'\n | 'css'\n | 'json'\n | 'markdown'\n | 'sql'\n | 'xml'\n | 'plaintext'\n\nexport interface CodeEditorProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Code content */\n value?: string\n /** Callback when content changes */\n onChange?: (value: string) => void\n /** Programming language for syntax highlighting */\n language?: CodeEditorLanguage\n /** Placeholder text when empty */\n placeholder?: string\n /** Make editor read-only */\n readOnly?: boolean\n /** Auto focus on mount */\n autoFocus?: boolean\n /** Show line numbers */\n lineNumbers?: boolean\n /** Enable code folding */\n foldGutter?: boolean\n /** Highlight active line */\n highlightActiveLine?: boolean\n /** Enable bracket matching */\n bracketMatching?: boolean\n /** Enable auto-closing brackets */\n closeBrackets?: boolean\n /** Enable autocompletion */\n autocompletion?: boolean\n /** Allow tab key for indentation */\n indentWithTab?: boolean\n /** Minimum height of the editor */\n minHeight?: string | number\n /** Maximum height of the editor (enables scrolling) */\n maxHeight?: string | number\n /** Editor size variant */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Show border around editor */\n bordered?: boolean\n /** Additional CodeMirror extensions */\n extensions?: Extension[]\n /** Callback with editor view instance */\n onEditorReady?: (view: EditorView) => void\n 'data-testid'?: string\n}\n\nconst sizeClasses = {\n xs: { fontSize: '11px', lineHeight: '1.4' },\n sm: { fontSize: '12px', lineHeight: '1.5' },\n md: { fontSize: '14px', lineHeight: '1.6' },\n lg: { fontSize: '16px', lineHeight: '1.6' },\n xl: { fontSize: '18px', lineHeight: '1.7' },\n}\n\nfunction getLanguageExtension(language: CodeEditorLanguage): Extension | null {\n switch (language) {\n case 'javascript':\n return javascript()\n case 'typescript':\n return javascript({ typescript: true })\n case 'jsx':\n return javascript({ jsx: true })\n case 'tsx':\n return javascript({ jsx: true, typescript: true })\n case 'python':\n return python()\n case 'html':\n return html()\n case 'css':\n return css()\n case 'json':\n return json()\n case 'markdown':\n return markdown()\n case 'sql':\n return sql()\n case 'xml':\n return xml()\n case 'plaintext':\n default:\n return null\n }\n}\n\nconst baseTheme = EditorView.theme({\n '&': {\n backgroundColor: 'oklch(var(--b1))',\n color: 'oklch(var(--bc))',\n },\n '.cm-content': {\n caretColor: 'oklch(var(--bc))',\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'oklch(var(--bc))',\n },\n '&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection': {\n backgroundColor: 'oklch(var(--p) / 0.2)',\n },\n '.cm-activeLine': {\n backgroundColor: 'oklch(var(--bc) / 0.05)',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'oklch(var(--bc) / 0.05)',\n },\n '.cm-gutters': {\n backgroundColor: 'oklch(var(--b2))',\n color: 'oklch(var(--bc) / 0.5)',\n borderRight: '1px solid oklch(var(--b3))',\n },\n '.cm-lineNumbers .cm-gutterElement': {\n padding: '0 8px 0 16px',\n },\n '.cm-foldGutter .cm-gutterElement': {\n padding: '0 4px',\n },\n '.cm-scroller': {\n overflow: 'auto',\n },\n '.cm-placeholder': {\n color: 'oklch(var(--bc) / 0.4)',\n fontStyle: 'italic',\n },\n})\n\nexport const CodeEditor = forwardRef<HTMLDivElement, CodeEditorProps>(\n (\n {\n value = '',\n onChange,\n language = 'plaintext',\n placeholder,\n readOnly = false,\n autoFocus = false,\n lineNumbers: showLineNumbers = true,\n foldGutter: showFoldGutter = true,\n highlightActiveLine: showHighlightActiveLine = true,\n bracketMatching: enableBracketMatching = true,\n closeBrackets: enableCloseBrackets = true,\n autocompletion: enableAutocompletion = true,\n indentWithTab: enableIndentWithTab = true,\n minHeight = 200,\n maxHeight,\n size,\n bordered = true,\n extensions: additionalExtensions = [],\n onEditorReady,\n className = '',\n 'data-testid': testId = 'code-editor',\n ...rest\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n const containerRef = useRef<HTMLDivElement>(null)\n const viewRef = useRef<EditorView | null>(null)\n const onChangeRef = useRef(onChange)\n\n // Keep onChange ref updated\n useEffect(() => {\n onChangeRef.current = onChange\n }, [onChange])\n\n // Create and manage editor\n useEffect(() => {\n if (!containerRef.current) return\n\n const extensions: Extension[] = [\n baseTheme,\n highlightSpecialChars(),\n history(),\n drawSelection(),\n dropCursor(),\n EditorState.allowMultipleSelections.of(true),\n indentOnInput(),\n syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n rectangularSelection(),\n crosshairCursor(),\n highlightSelectionMatches(),\n keymap.of([\n ...closeBracketsKeymap,\n ...defaultKeymap,\n ...searchKeymap,\n ...historyKeymap,\n ...foldKeymap,\n ...completionKeymap,\n ...lintKeymap,\n ]),\n ]\n\n if (showLineNumbers) {\n extensions.push(lineNumbers())\n }\n\n if (showFoldGutter) {\n extensions.push(foldGutter())\n }\n\n if (showHighlightActiveLine) {\n extensions.push(highlightActiveLine())\n extensions.push(highlightActiveLineGutter())\n }\n\n if (enableBracketMatching) {\n extensions.push(bracketMatching())\n }\n\n if (enableCloseBrackets) {\n extensions.push(closeBrackets())\n }\n\n if (enableAutocompletion) {\n extensions.push(autocompletion())\n }\n\n if (enableIndentWithTab) {\n extensions.push(keymap.of([indentWithTab]))\n }\n\n const langExtension = getLanguageExtension(language)\n if (langExtension) {\n extensions.push(langExtension)\n }\n\n if (placeholder) {\n extensions.push(EditorView.contentAttributes.of({ 'aria-placeholder': placeholder }))\n extensions.push(\n EditorView.theme({\n '.cm-content:has(.cm-line:only-child:empty)::before': {\n content: `\"${placeholder}\"`,\n position: 'absolute',\n color: 'oklch(var(--bc) / 0.4)',\n fontStyle: 'italic',\n pointerEvents: 'none',\n },\n })\n )\n }\n\n if (readOnly) {\n extensions.push(EditorState.readOnly.of(true))\n extensions.push(EditorView.editable.of(false))\n }\n\n // Update listener\n extensions.push(\n EditorView.updateListener.of((update) => {\n if (update.docChanged && onChangeRef.current) {\n onChangeRef.current(update.state.doc.toString())\n }\n })\n )\n\n // Size styling\n const sizeStyle = sizeClasses[effectiveSize]\n extensions.push(\n EditorView.theme({\n '.cm-content': {\n fontSize: sizeStyle.fontSize,\n lineHeight: sizeStyle.lineHeight,\n },\n '.cm-gutters': {\n fontSize: sizeStyle.fontSize,\n },\n })\n )\n\n // Add user extensions\n extensions.push(...additionalExtensions)\n\n const state = EditorState.create({\n doc: value,\n extensions,\n })\n\n const view = new EditorView({\n state,\n parent: containerRef.current,\n })\n\n viewRef.current = view\n\n if (autoFocus) {\n view.focus()\n }\n\n if (onEditorReady) {\n onEditorReady(view)\n }\n\n return () => {\n view.destroy()\n viewRef.current = null\n }\n }, [\n language,\n placeholder,\n readOnly,\n showLineNumbers,\n showFoldGutter,\n showHighlightActiveLine,\n enableBracketMatching,\n enableCloseBrackets,\n enableAutocompletion,\n enableIndentWithTab,\n effectiveSize,\n autoFocus,\n additionalExtensions,\n onEditorReady,\n ])\n\n // Sync value prop changes\n useEffect(() => {\n const view = viewRef.current\n if (!view) return\n\n const currentValue = view.state.doc.toString()\n if (value !== currentValue) {\n view.dispatch({\n changes: {\n from: 0,\n to: currentValue.length,\n insert: value,\n },\n })\n }\n }, [value])\n\n const minHeightStyle = typeof minHeight === 'number' ? `${minHeight}px` : minHeight\n const maxHeightStyle = maxHeight\n ? typeof maxHeight === 'number'\n ? `${maxHeight}px`\n : maxHeight\n : undefined\n\n return (\n <div\n ref={ref}\n className={`\n bg-base-100 rounded-lg overflow-hidden\n ${bordered ? 'border border-base-300' : ''}\n ${className}\n `}\n data-testid={testId}\n {...rest}\n >\n <div\n ref={containerRef}\n className=\"[&_.cm-editor]:outline-none\"\n style={{\n minHeight: minHeightStyle,\n maxHeight: maxHeightStyle,\n overflow: maxHeightStyle ? 'auto' : undefined,\n }}\n />\n </div>\n )\n }\n)\n\nCodeEditor.displayName = 'CodeEditor'\n\nexport default CodeEditor\n"],"names":["sizeClasses","getLanguageExtension","language","javascript","python","html","css","json","markdown","sql","xml","baseTheme","EditorView","CodeEditor","forwardRef","value","onChange","placeholder","readOnly","autoFocus","showLineNumbers","showFoldGutter","showHighlightActiveLine","enableBracketMatching","enableCloseBrackets","enableAutocompletion","enableIndentWithTab","minHeight","maxHeight","size","bordered","additionalExtensions","onEditorReady","className","testId","rest","ref","componentSize","useConfig","effectiveSize","containerRef","useRef","viewRef","onChangeRef","useEffect","extensions","highlightSpecialChars","history","drawSelection","dropCursor","EditorState","indentOnInput","syntaxHighlighting","defaultHighlightStyle","rectangularSelection","crosshairCursor","highlightSelectionMatches","keymap","closeBracketsKeymap","defaultKeymap","searchKeymap","historyKeymap","foldKeymap","completionKeymap","lintKeymap","lineNumbers","foldGutter","highlightActiveLine","highlightActiveLineGutter","bracketMatching","closeBrackets","autocompletion","indentWithTab","langExtension","update","sizeStyle","state","view","currentValue","minHeightStyle","maxHeightStyle","jsx"],"mappings":"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"}
|