asterui 0.12.79 → 0.12.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ export { CodeEditor, type CodeEditorProps, type CodeEditorLanguage } from './components/CodeEditor';
@@ -0,0 +1,5 @@
1
+ import { CodeEditor as d } from "./components/CodeEditor.js";
2
+ export {
3
+ d as CodeEditor
4
+ };
5
+ //# sourceMappingURL=codeeditor.js.map
@@ -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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"}
@@ -0,0 +1,40 @@
1
+ import { default as React } from 'react';
2
+ import { Terminal as XTermType, ITerminalOptions, ITerminalInitOnlyOptions } from '@xterm/xterm';
3
+ export interface TerminalRef {
4
+ /** The underlying xterm.js Terminal instance */
5
+ terminal: XTermType | null;
6
+ /** Write data to the terminal */
7
+ write: (data: string) => void;
8
+ /** Write a line to the terminal (with newline) */
9
+ writeln: (data: string) => void;
10
+ /** Clear the terminal */
11
+ clear: () => void;
12
+ /** Focus the terminal */
13
+ focus: () => void;
14
+ /** Fit the terminal to its container */
15
+ fit: () => void;
16
+ /** Command history (only available with readline mode) */
17
+ history: string[];
18
+ /** Clear command history (only available with readline mode) */
19
+ clearHistory: () => void;
20
+ }
21
+ export interface TerminalProps {
22
+ /** Callback when user types in the terminal (raw input) */
23
+ onData?: (data: string) => void;
24
+ /** Callback when terminal is ready */
25
+ onReady?: (terminal: XTermType) => void;
26
+ /** Enable readline mode with line editing and history */
27
+ readline?: boolean;
28
+ /** Prompt string for readline mode (supports ANSI colors) */
29
+ prompt?: string;
30
+ /** Callback when user submits a line in readline mode */
31
+ onLine?: (line: string) => void;
32
+ /** xterm.js options (theme is auto-applied unless you override it) */
33
+ options?: ITerminalOptions & ITerminalInitOnlyOptions;
34
+ /** Additional CSS classes for the container */
35
+ className?: string;
36
+ /** Container style */
37
+ style?: React.CSSProperties;
38
+ 'data-testid'?: string;
39
+ }
40
+ export declare const Terminal: React.ForwardRefExoticComponent<TerminalProps & React.RefAttributes<TerminalRef>>;
@@ -0,0 +1,150 @@
1
+ import { jsx as D } from "react/jsx-runtime";
2
+ import { forwardRef as S, useRef as x, useImperativeHandle as M, useEffect as v } from "react";
3
+ import * as b from "@xterm/xterm";
4
+ import * as p from "@xterm/addon-fit";
5
+ import { useTheme as H } from "../hooks/useTheme.js";
6
+ const O = b.Terminal ?? b.default?.Terminal ?? b, $ = p.FitAddon ?? p.default?.FitAddon ?? p;
7
+ let B = !1;
8
+ function j() {
9
+ if (B || typeof document > "u") return;
10
+ B = !0;
11
+ const s = document.createElement("style");
12
+ s.setAttribute("data-xterm", ""), s.textContent = ".xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:.5}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}", document.head.appendChild(s);
13
+ }
14
+ const X = S(({
15
+ onData: s,
16
+ onReady: k,
17
+ readline: g = !1,
18
+ prompt: c = "$ ",
19
+ onLine: z,
20
+ options: I = {},
21
+ className: A = "",
22
+ style: F,
23
+ "data-testid": C
24
+ }, R) => {
25
+ const a = x(null), o = x(null), m = x(null), { isDark: l, colors: n } = H(), f = x({
26
+ buffer: "",
27
+ cursor: 0,
28
+ history: [],
29
+ historyIndex: -1,
30
+ savedBuffer: ""
31
+ }), y = () => ({
32
+ background: n.background,
33
+ foreground: n.foreground,
34
+ cursor: n.primary,
35
+ cursorAccent: n.background,
36
+ selectionBackground: n.primary + "40",
37
+ selectionForeground: n.foreground,
38
+ black: l ? "#000000" : "#2e3436",
39
+ red: n.error,
40
+ green: n.success,
41
+ yellow: n.warning,
42
+ blue: n.info,
43
+ magenta: n.secondary,
44
+ cyan: n.accent,
45
+ white: l ? "#d3d7cf" : "#eeeeec",
46
+ brightBlack: "#555753",
47
+ brightRed: n.error,
48
+ brightGreen: n.success,
49
+ brightYellow: n.warning,
50
+ brightBlue: n.info,
51
+ brightMagenta: n.secondary,
52
+ brightCyan: n.accent,
53
+ brightWhite: l ? "#eeeeec" : "#ffffff"
54
+ });
55
+ M(R, () => ({
56
+ terminal: o.current,
57
+ write: (r) => o.current?.write(r),
58
+ writeln: (r) => o.current?.writeln(r),
59
+ clear: () => o.current?.clear(),
60
+ focus: () => o.current?.focus(),
61
+ fit: () => m.current?.fit(),
62
+ history: f.current.history,
63
+ clearHistory: () => {
64
+ f.current.history = [];
65
+ }
66
+ }), []);
67
+ const u = () => {
68
+ const r = o.current;
69
+ if (!r) return;
70
+ const t = f.current;
71
+ r.write("\r\x1B[K" + c + t.buffer);
72
+ const e = t.buffer.length - t.cursor;
73
+ e > 0 && r.write(`\x1B[${e}D`);
74
+ }, T = (r) => {
75
+ const t = o.current;
76
+ if (!t) return;
77
+ const e = f.current;
78
+ if (r === "\x1B[A") {
79
+ e.history.length > 0 && e.historyIndex < e.history.length - 1 && (e.historyIndex === -1 && (e.savedBuffer = e.buffer), e.historyIndex++, e.buffer = e.history[e.history.length - 1 - e.historyIndex], e.cursor = e.buffer.length, u());
80
+ return;
81
+ }
82
+ if (r === "\x1B[B") {
83
+ e.historyIndex > -1 && (e.historyIndex--, e.buffer = e.historyIndex === -1 ? e.savedBuffer : e.history[e.history.length - 1 - e.historyIndex], e.cursor = e.buffer.length, u());
84
+ return;
85
+ }
86
+ if (r === "\x1B[C") {
87
+ e.cursor < e.buffer.length && (e.cursor++, t.write("\x1B[C"));
88
+ return;
89
+ }
90
+ if (r === "\x1B[D") {
91
+ e.cursor > 0 && (e.cursor--, t.write("\x1B[D"));
92
+ return;
93
+ }
94
+ if (r === "\x1B[H" || r === "\x1BOH" || r === "\x1B[1~") {
95
+ e.cursor > 0 && (t.write(`\x1B[${e.cursor}D`), e.cursor = 0);
96
+ return;
97
+ }
98
+ if (r === "\x1B[F" || r === "\x1BOF" || r === "\x1B[4~") {
99
+ e.cursor < e.buffer.length && (t.write(`\x1B[${e.buffer.length - e.cursor}C`), e.cursor = e.buffer.length);
100
+ return;
101
+ }
102
+ if (r === "\x1B[3~") {
103
+ e.cursor < e.buffer.length && (e.buffer = e.buffer.slice(0, e.cursor) + e.buffer.slice(e.cursor + 1), u());
104
+ return;
105
+ }
106
+ if (!r.startsWith("\x1B"))
107
+ if (r === "\r") {
108
+ t.writeln("");
109
+ const i = e.buffer;
110
+ i.trim() && e.history.push(i), e.buffer = "", e.cursor = 0, e.historyIndex = -1, e.savedBuffer = "", z?.(i), t.write(c);
111
+ } else r === "" || r === "\b" ? e.cursor > 0 && (e.buffer = e.buffer.slice(0, e.cursor - 1) + e.buffer.slice(e.cursor), e.cursor--, u()) : r === "" ? (t.writeln("^C"), e.buffer = "", e.cursor = 0, e.historyIndex = -1, t.write(c)) : (r >= " " || r === " ") && (e.buffer = e.buffer.slice(0, e.cursor) + r + e.buffer.slice(e.cursor), e.cursor += r.length, u());
112
+ };
113
+ return v(() => {
114
+ if (!a.current) return;
115
+ j();
116
+ const r = a.current;
117
+ let t = null, e = null, i = null, h = !1;
118
+ const w = () => {
119
+ if (h || !r) return;
120
+ const d = r.getBoundingClientRect();
121
+ d.width === 0 || d.height === 0 || (h = !0, t = new O({
122
+ theme: y(),
123
+ cursorBlink: !0,
124
+ fontFamily: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace',
125
+ fontSize: 14,
126
+ ...I
127
+ }), e = new $(), t.loadAddon(e), t.open(r), e.fit(), o.current = t, m.current = e, g ? t.onData(T) : s && t.onData(s), k?.(t), g && t.write(c));
128
+ };
129
+ return i = new ResizeObserver((d) => {
130
+ d[0] && (h ? e && e.fit() : w());
131
+ }), i.observe(r), requestAnimationFrame(w), () => {
132
+ i?.disconnect(), t?.dispose(), o.current = null, m.current = null;
133
+ };
134
+ }, []), v(() => {
135
+ o.current && (o.current.options.theme = y());
136
+ }, [l, n]), /* @__PURE__ */ D(
137
+ "div",
138
+ {
139
+ ref: a,
140
+ className: A,
141
+ style: { width: "100%", height: "100%", ...F },
142
+ "data-testid": C
143
+ }
144
+ );
145
+ });
146
+ X.displayName = "Terminal";
147
+ export {
148
+ X as Terminal
149
+ };
150
+ //# sourceMappingURL=Terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Terminal.js","sources":["../../src/components/Terminal.tsx"],"sourcesContent":["import React, { useEffect, useRef, useImperativeHandle, forwardRef } from 'react'\nimport * as XTermPkg from '@xterm/xterm'\nimport * as FitAddonPkg from '@xterm/addon-fit'\nimport type { Terminal as XTermType, ITerminalOptions, ITerminalInitOnlyOptions } from '@xterm/xterm'\nimport type { FitAddon as FitAddonType } from '@xterm/addon-fit'\nimport { useTheme } from '../hooks/useTheme'\n\n// Handle both ESM and CJS module formats\nconst XTerm = (XTermPkg as { Terminal?: typeof XTermType }).Terminal\n ?? (XTermPkg as { default?: { Terminal: typeof XTermType } }).default?.Terminal\n ?? (XTermPkg as unknown as typeof XTermType)\nconst FitAddon = (FitAddonPkg as { FitAddon?: typeof FitAddonType }).FitAddon\n ?? (FitAddonPkg as { default?: { FitAddon: typeof FitAddonType } }).default?.FitAddon\n ?? (FitAddonPkg as unknown as typeof FitAddonType)\n\n// Inject xterm.css once (inlined for reliability across bundlers)\nlet cssInjected = false\nfunction injectXtermCSS() {\n if (cssInjected || typeof document === 'undefined') return\n cssInjected = true\n\n const style = document.createElement('style')\n style.setAttribute('data-xterm', '')\n style.textContent = `.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:.5}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}`\n document.head.appendChild(style)\n}\n\nexport interface TerminalRef {\n /** The underlying xterm.js Terminal instance */\n terminal: XTermType | null\n /** Write data to the terminal */\n write: (data: string) => void\n /** Write a line to the terminal (with newline) */\n writeln: (data: string) => void\n /** Clear the terminal */\n clear: () => void\n /** Focus the terminal */\n focus: () => void\n /** Fit the terminal to its container */\n fit: () => void\n /** Command history (only available with readline mode) */\n history: string[]\n /** Clear command history (only available with readline mode) */\n clearHistory: () => void\n}\n\nexport interface TerminalProps {\n /** Callback when user types in the terminal (raw input) */\n onData?: (data: string) => void\n /** Callback when terminal is ready */\n onReady?: (terminal: XTermType) => void\n /** Enable readline mode with line editing and history */\n readline?: boolean\n /** Prompt string for readline mode (supports ANSI colors) */\n prompt?: string\n /** Callback when user submits a line in readline mode */\n onLine?: (line: string) => void\n /** xterm.js options (theme is auto-applied unless you override it) */\n options?: ITerminalOptions & ITerminalInitOnlyOptions\n /** Additional CSS classes for the container */\n className?: string\n /** Container style */\n style?: React.CSSProperties\n 'data-testid'?: string\n}\n\nexport const Terminal = forwardRef<TerminalRef, TerminalProps>(({\n onData,\n onReady,\n readline = false,\n prompt = '$ ',\n onLine,\n options = {},\n className = '',\n style,\n 'data-testid': testId,\n}, ref) => {\n const containerRef = useRef<HTMLDivElement>(null)\n const terminalRef = useRef<XTermType | null>(null)\n const fitAddonRef = useRef<FitAddonType | null>(null)\n const { isDark, colors } = useTheme()\n\n // Readline state\n const readlineState = useRef({\n buffer: '',\n cursor: 0,\n history: [] as string[],\n historyIndex: -1,\n savedBuffer: '',\n })\n\n // Build theme from DaisyUI colors\n const getTheme = () => ({\n background: colors.background,\n foreground: colors.foreground,\n cursor: colors.primary,\n cursorAccent: colors.background,\n selectionBackground: colors.primary + '40',\n selectionForeground: colors.foreground,\n black: isDark ? '#000000' : '#2e3436',\n red: colors.error,\n green: colors.success,\n yellow: colors.warning,\n blue: colors.info,\n magenta: colors.secondary,\n cyan: colors.accent,\n white: isDark ? '#d3d7cf' : '#eeeeec',\n brightBlack: '#555753',\n brightRed: colors.error,\n brightGreen: colors.success,\n brightYellow: colors.warning,\n brightBlue: colors.info,\n brightMagenta: colors.secondary,\n brightCyan: colors.accent,\n brightWhite: isDark ? '#eeeeec' : '#ffffff',\n })\n\n useImperativeHandle(ref, () => ({\n terminal: terminalRef.current,\n write: (data: string) => terminalRef.current?.write(data),\n writeln: (data: string) => terminalRef.current?.writeln(data),\n clear: () => terminalRef.current?.clear(),\n focus: () => terminalRef.current?.focus(),\n fit: () => fitAddonRef.current?.fit(),\n history: readlineState.current.history,\n clearHistory: () => { readlineState.current.history = [] },\n }), [])\n\n // Redraw the current line in readline mode\n const redrawLine = () => {\n const term = terminalRef.current\n if (!term) return\n const s = readlineState.current\n // Move to start of line, clear line, write prompt + buffer, position cursor\n term.write('\\r\\x1b[K' + prompt + s.buffer)\n // Move cursor to correct position\n const moveBack = s.buffer.length - s.cursor\n if (moveBack > 0) {\n term.write(`\\x1b[${moveBack}D`)\n }\n }\n\n // Handle readline input\n const handleReadlineData = (data: string) => {\n const term = terminalRef.current\n if (!term) return\n const s = readlineState.current\n\n // Handle escape sequences (arrow keys)\n if (data === '\\x1b[A') {\n // Up arrow - history previous\n if (s.history.length > 0 && s.historyIndex < s.history.length - 1) {\n if (s.historyIndex === -1) s.savedBuffer = s.buffer\n s.historyIndex++\n s.buffer = s.history[s.history.length - 1 - s.historyIndex]\n s.cursor = s.buffer.length\n redrawLine()\n }\n return\n }\n if (data === '\\x1b[B') {\n // Down arrow - history next\n if (s.historyIndex > -1) {\n s.historyIndex--\n s.buffer = s.historyIndex === -1 ? s.savedBuffer : s.history[s.history.length - 1 - s.historyIndex]\n s.cursor = s.buffer.length\n redrawLine()\n }\n return\n }\n if (data === '\\x1b[C') {\n // Right arrow\n if (s.cursor < s.buffer.length) {\n s.cursor++\n term.write('\\x1b[C')\n }\n return\n }\n if (data === '\\x1b[D') {\n // Left arrow\n if (s.cursor > 0) {\n s.cursor--\n term.write('\\x1b[D')\n }\n return\n }\n if (data === '\\x1b[H' || data === '\\x1bOH' || data === '\\x1b[1~') {\n // Home - move to start of line\n if (s.cursor > 0) {\n term.write(`\\x1b[${s.cursor}D`)\n s.cursor = 0\n }\n return\n }\n if (data === '\\x1b[F' || data === '\\x1bOF' || data === '\\x1b[4~') {\n // End - move to end of line\n if (s.cursor < s.buffer.length) {\n term.write(`\\x1b[${s.buffer.length - s.cursor}C`)\n s.cursor = s.buffer.length\n }\n return\n }\n if (data === '\\x1b[3~') {\n // Delete key - delete character at cursor\n if (s.cursor < s.buffer.length) {\n s.buffer = s.buffer.slice(0, s.cursor) + s.buffer.slice(s.cursor + 1)\n redrawLine()\n }\n return\n }\n\n // Ignore other escape sequences\n if (data.startsWith('\\x1b')) return\n\n if (data === '\\r') {\n // Enter\n term.writeln('')\n const line = s.buffer\n if (line.trim()) {\n s.history.push(line)\n }\n s.buffer = ''\n s.cursor = 0\n s.historyIndex = -1\n s.savedBuffer = ''\n onLine?.(line)\n term.write(prompt)\n } else if (data === '\\x7f' || data === '\\b') {\n // Backspace\n if (s.cursor > 0) {\n s.buffer = s.buffer.slice(0, s.cursor - 1) + s.buffer.slice(s.cursor)\n s.cursor--\n redrawLine()\n }\n } else if (data === '\\x03') {\n // Ctrl+C\n term.writeln('^C')\n s.buffer = ''\n s.cursor = 0\n s.historyIndex = -1\n term.write(prompt)\n } else if (data >= ' ' || data === '\\t') {\n // Printable characters\n s.buffer = s.buffer.slice(0, s.cursor) + data + s.buffer.slice(s.cursor)\n s.cursor += data.length\n redrawLine()\n }\n }\n\n // Initialize terminal\n useEffect(() => {\n if (!containerRef.current) return\n\n injectXtermCSS()\n\n const container = containerRef.current\n let terminal: XTermType | null = null\n let fitAddon: FitAddonType | null = null\n let resizeObserver: ResizeObserver | null = null\n let initialized = false\n\n const initTerminal = () => {\n if (initialized || !container) return\n\n // Check container has dimensions before opening\n const rect = container.getBoundingClientRect()\n if (rect.width === 0 || rect.height === 0) return\n\n initialized = true\n\n terminal = new XTerm({\n theme: getTheme(),\n cursorBlink: true,\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n fontSize: 14,\n ...options,\n })\n fitAddon = new FitAddon()\n\n terminal.loadAddon(fitAddon)\n terminal.open(container)\n fitAddon.fit()\n\n terminalRef.current = terminal\n fitAddonRef.current = fitAddon\n\n if (readline) {\n terminal.onData(handleReadlineData)\n } else if (onData) {\n terminal.onData(onData)\n }\n\n onReady?.(terminal)\n\n // Write initial prompt after onReady so welcome messages appear first\n if (readline) {\n terminal.write(prompt)\n }\n }\n\n // Use ResizeObserver to wait for container to have dimensions\n resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (!entry) return\n\n if (!initialized) {\n initTerminal()\n } else if (fitAddon) {\n fitAddon.fit()\n }\n })\n resizeObserver.observe(container)\n\n // Also try immediately in case container already has dimensions\n requestAnimationFrame(initTerminal)\n\n return () => {\n resizeObserver?.disconnect()\n terminal?.dispose()\n terminalRef.current = null\n fitAddonRef.current = null\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n // Update theme when colors change\n useEffect(() => {\n if (!terminalRef.current) return\n terminalRef.current.options.theme = getTheme()\n }, [isDark, colors]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={{ width: '100%', height: '100%', ...style }}\n data-testid={testId}\n />\n )\n})\n\nTerminal.displayName = 'Terminal'\n"],"names":["XTerm","XTermPkg","FitAddon","FitAddonPkg","cssInjected","injectXtermCSS","style","Terminal","forwardRef","onData","onReady","readline","prompt","onLine","options","className","testId","ref","containerRef","useRef","terminalRef","fitAddonRef","isDark","colors","useTheme","readlineState","getTheme","useImperativeHandle","data","redrawLine","term","s","moveBack","handleReadlineData","line","useEffect","container","terminal","fitAddon","resizeObserver","initialized","initTerminal","rect","entries","jsx"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -172,6 +172,8 @@ export { Tabs } from './components/Tabs';
172
172
  export type { TabsProps, TabPanelProps, TabItem, TabsVariant, TabsSize, TabsPosition } from './components/Tabs';
173
173
  export { Textarea } from './components/Textarea';
174
174
  export type { TextareaProps } from './components/Textarea';
175
+ export { Terminal } from './components/Terminal';
176
+ export type { TerminalProps, TerminalRef } from './components/Terminal';
175
177
  export { TextRotate } from './components/TextRotate';
176
178
  export type { TextRotateProps, TextRotateDuration } from './components/TextRotate';
177
179
  export { Tag, CheckableTag, TagLiveRegion } from './components/Tag';
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import { Affix as e } from "./components/Affix.js";
2
2
  import { AspectRatio as p } from "./components/AspectRatio.js";
3
- import { Anchor as m } from "./components/Anchor.js";
3
+ import { Anchor as f } from "./components/Anchor.js";
4
4
  import { Alert as a } from "./components/Alert.js";
5
5
  import { Autocomplete as n } from "./components/Autocomplete.js";
6
6
  import { Avatar as u, AvatarGroup as l } from "./components/Avatar.js";
7
7
  import { Badge as C } from "./components/Badge.js";
8
- import { Breadcrumb as g } from "./components/Breadcrumb.js";
8
+ import { Breadcrumb as T } from "./components/Breadcrumb.js";
9
9
  import { Button as S } from "./components/Button.js";
10
10
  import { SizeContext as h, SizeProvider as k, useSize as v } from "./contexts/SizeContext.js";
11
11
  import { CopyButton as D } from "./components/CopyButton.js";
@@ -23,12 +23,12 @@ import { ContextMenu as Z } from "./components/ContextMenu.js";
23
23
  import { Countdown as $ } from "./components/Countdown.js";
24
24
  import { DatePicker as ro } from "./components/DatePicker.js";
25
25
  import { DateOfBirth as to, dateOfBirthRequired as po } from "./components/DateOfBirth.js";
26
- import { MonthCalendar as mo } from "./components/MonthCalendar.js";
26
+ import { MonthCalendar as fo } from "./components/MonthCalendar.js";
27
27
  import { WeekCalendar as ao } from "./components/WeekCalendar.js";
28
28
  import { Descriptions as no } from "./components/Descriptions.js";
29
29
  import { Diff as uo } from "./components/Diff.js";
30
30
  import { Dock as Co } from "./components/Dock.js";
31
- import { Divider as go } from "./components/Divider.js";
31
+ import { Divider as To } from "./components/Divider.js";
32
32
  import { Drawer as So } from "./components/Drawer.js";
33
33
  import { ResponsiveDrawer as ho } from "./components/ResponsiveDrawer.js";
34
34
  import { Fieldset as vo } from "./components/Fieldset.js";
@@ -47,13 +47,13 @@ import { Empty as Zo } from "./components/Empty.js";
47
47
  import { Input as $o } from "./components/Input.js";
48
48
  import { InputNumber as rr } from "./components/InputNumber.js";
49
49
  import { Join as tr } from "./components/Join.js";
50
- import { Kbd as fr } from "./components/Kbd.js";
50
+ import { Kbd as mr } from "./components/Kbd.js";
51
51
  import { Layout as xr, useSiderContext as ar } from "./components/Layout.js";
52
52
  import { List as nr } from "./components/List.js";
53
53
  import { Loading as ur } from "./components/Loading.js";
54
54
  import { Mask as dr } from "./components/Mask.js";
55
55
  import { Masonry as cr } from "./components/Masonry.js";
56
- import { Mention as Tr } from "./components/Mention.js";
56
+ import { Mention as gr } from "./components/Mention.js";
57
57
  import { Menu as Pr } from "./components/Menu.js";
58
58
  import { Browser as kr } from "./components/Browser.js";
59
59
  import { Code as Rr } from "./components/Code.js";
@@ -73,72 +73,73 @@ import { RadialProgress as Zr } from "./components/RadialProgress.js";
73
73
  import { Range as $r } from "./components/Range.js";
74
74
  import { Rating as re } from "./components/Rating.js";
75
75
  import { Result as te } from "./components/Result.js";
76
- import { Select as fe } from "./components/Select.js";
76
+ import { Select as me } from "./components/Select.js";
77
77
  import { Segmented as xe } from "./components/Segmented.js";
78
78
  import { Skeleton as se } from "./components/Skeleton.js";
79
79
  import { Space as ie } from "./components/Space.js";
80
80
  import { Splitter as le } from "./components/Splitter.js";
81
81
  import { Stats as Ce } from "./components/Stat.js";
82
- import { Status as ge } from "./components/Status.js";
82
+ import { Status as Te } from "./components/Status.js";
83
83
  import { Steps as Se } from "./components/Steps.js";
84
84
  import { Table as he } from "./components/Table.js";
85
85
  import { Tabs as ve } from "./components/Tabs.js";
86
86
  import { Textarea as De } from "./components/Textarea.js";
87
- import { TextRotate as Be } from "./components/TextRotate.js";
88
- import { CheckableTag as we, Tag as ye, TagLiveRegion as Me } from "./components/Tag.js";
89
- import { ThemeController as Le } from "./components/ThemeController.js";
90
- import { ThemeProvider as ze, useHasThemeProvider as He, useThemeContext as We } from "./providers/ThemeProvider.js";
91
- import { TimePicker as Ke } from "./components/TimePicker.js";
92
- import { Timeline as Ee } from "./components/Timeline.js";
93
- import { Toggle as Je } from "./components/Toggle.js";
94
- import { Tour as je } from "./components/Tour.js";
95
- import { Tooltip as Qe } from "./components/Tooltip.js";
96
- import { Transfer as Xe } from "./components/Transfer.js";
97
- import { Tree as Ze } from "./components/Tree.js";
98
- import { TreeSelect as $e, TreeSelectComponent as ot } from "./components/TreeSelect.js";
99
- import { Typography as et } from "./components/Typography.js";
100
- import { Upload as pt } from "./components/Upload.js";
101
- import { Watermark as mt } from "./components/Watermark.js";
102
- import { Hide as at, Show as st } from "./components/Responsive.js";
103
- import { useBreakpoint as it } from "./hooks/useBreakpoint.js";
104
- import { useDisclosure as lt } from "./hooks/useDisclosure.js";
105
- import { useClipboard as Ct } from "./hooks/useClipboard.js";
106
- import { useLocalStorage as gt } from "./hooks/useLocalStorage.js";
107
- import { useDebounce as St } from "./hooks/useDebounce.js";
108
- import { useClickOutside as ht } from "./hooks/useClickOutside.js";
109
- import { usePrevious as vt } from "./hooks/usePrevious.js";
110
- import { useHover as Dt } from "./hooks/useHover.js";
111
- import { useKeyPress as Bt, useKeyPressCallback as Ft } from "./hooks/useKeyPress.js";
112
- import { useWindowSize as yt } from "./hooks/useWindowSize.js";
113
- import { useTheme as At } from "./hooks/useTheme.js";
114
- import { default as It } from "./locale/en-US.js";
115
- import { default as Ht } from "./locale/en-GB.js";
116
- import { default as Gt } from "./locale/en-CA.js";
117
- import { default as Ot } from "./locale/zh-CN.js";
118
- import { default as Nt } from "./locale/es-ES.js";
119
- import { default as Ut } from "./locale/ja-JP.js";
120
- import { default as qt } from "./locale/pt-BR.js";
121
- import { default as Vt } from "./locale/de-DE.js";
122
- import { default as Yt } from "./locale/fr-FR.js";
123
- import { default as _t } from "./locale/ko-KR.js";
124
- import { useWatch as op } from "react-hook-form";
87
+ import { Terminal as Be } from "./components/Terminal.js";
88
+ import { TextRotate as we } from "./components/TextRotate.js";
89
+ import { CheckableTag as Me, Tag as Ae, TagLiveRegion as Le } from "./components/Tag.js";
90
+ import { ThemeController as ze } from "./components/ThemeController.js";
91
+ import { ThemeProvider as We, useHasThemeProvider as Ge, useThemeContext as Ke } from "./providers/ThemeProvider.js";
92
+ import { TimePicker as Ee } from "./components/TimePicker.js";
93
+ import { Timeline as Je } from "./components/Timeline.js";
94
+ import { Toggle as je } from "./components/Toggle.js";
95
+ import { Tour as Qe } from "./components/Tour.js";
96
+ import { Tooltip as Xe } from "./components/Tooltip.js";
97
+ import { Transfer as Ze } from "./components/Transfer.js";
98
+ import { Tree as $e } from "./components/Tree.js";
99
+ import { TreeSelect as rt, TreeSelectComponent as et } from "./components/TreeSelect.js";
100
+ import { Typography as pt } from "./components/Typography.js";
101
+ import { Upload as ft } from "./components/Upload.js";
102
+ import { Watermark as at } from "./components/Watermark.js";
103
+ import { Hide as nt, Show as it } from "./components/Responsive.js";
104
+ import { useBreakpoint as lt } from "./hooks/useBreakpoint.js";
105
+ import { useDisclosure as Ct } from "./hooks/useDisclosure.js";
106
+ import { useClipboard as Tt } from "./hooks/useClipboard.js";
107
+ import { useLocalStorage as St } from "./hooks/useLocalStorage.js";
108
+ import { useDebounce as ht } from "./hooks/useDebounce.js";
109
+ import { useClickOutside as vt } from "./hooks/useClickOutside.js";
110
+ import { usePrevious as Dt } from "./hooks/usePrevious.js";
111
+ import { useHover as Bt } from "./hooks/useHover.js";
112
+ import { useKeyPress as wt, useKeyPressCallback as yt } from "./hooks/useKeyPress.js";
113
+ import { useWindowSize as At } from "./hooks/useWindowSize.js";
114
+ import { useTheme as It } from "./hooks/useTheme.js";
115
+ import { default as Ht } from "./locale/en-US.js";
116
+ import { default as Gt } from "./locale/en-GB.js";
117
+ import { default as Ot } from "./locale/en-CA.js";
118
+ import { default as Nt } from "./locale/zh-CN.js";
119
+ import { default as Ut } from "./locale/es-ES.js";
120
+ import { default as qt } from "./locale/ja-JP.js";
121
+ import { default as Vt } from "./locale/pt-BR.js";
122
+ import { default as Yt } from "./locale/de-DE.js";
123
+ import { default as _t } from "./locale/fr-FR.js";
124
+ import { default as op } from "./locale/ko-KR.js";
125
+ import { useWatch as ep } from "react-hook-form";
125
126
  export {
126
127
  e as Affix,
127
128
  a as Alert,
128
- m as Anchor,
129
+ f as Anchor,
129
130
  p as AspectRatio,
130
131
  n as Autocomplete,
131
132
  u as Avatar,
132
133
  l as AvatarGroup,
133
134
  C as Badge,
134
- g as Breadcrumb,
135
+ T as Breadcrumb,
135
136
  kr as Browser,
136
137
  S as Button,
137
138
  L as Card,
138
139
  z as Carousel,
139
140
  W as Cascader,
140
141
  w as Chat,
141
- we as CheckableTag,
142
+ Me as CheckableTag,
142
143
  B as Checkbox,
143
144
  Rr as Code,
144
145
  Ko as Col,
@@ -155,7 +156,7 @@ export {
155
156
  ro as DatePicker,
156
157
  no as Descriptions,
157
158
  uo as Diff,
158
- go as Divider,
159
+ To as Divider,
159
160
  Co as Dock,
160
161
  So as Drawer,
161
162
  Xo as Dropdown,
@@ -169,23 +170,23 @@ export {
169
170
  zo as Form,
170
171
  Oo as Grid,
171
172
  Jo as Hero,
172
- at as Hide,
173
+ nt as Hide,
173
174
  jo as HoverGallery,
174
175
  Qo as Image,
175
176
  $o as Input,
176
177
  rr as InputNumber,
177
178
  tr as Join,
178
- fr as Kbd,
179
+ mr as Kbd,
179
180
  xr as Layout,
180
181
  nr as List,
181
182
  ur as Loading,
182
183
  dr as Mask,
183
184
  cr as Masonry,
184
- Tr as Mention,
185
+ gr as Mention,
185
186
  Pr as Menu,
186
187
  Hr as MessageManager,
187
188
  yr as Modal,
188
- mo as MonthCalendar,
189
+ fo as MonthCalendar,
189
190
  Ar as Navbar,
190
191
  Kr as OTPInput,
191
192
  Er as Pagination,
@@ -201,72 +202,73 @@ export {
201
202
  te as Result,
202
203
  Eo as Row,
203
204
  xe as Segmented,
204
- fe as Select,
205
- st as Show,
205
+ me as Select,
206
+ it as Show,
206
207
  h as SizeContext,
207
208
  k as SizeProvider,
208
209
  se as Skeleton,
209
210
  ie as Space,
210
211
  le as Splitter,
211
212
  Ce as Stats,
212
- ge as Status,
213
+ Te as Status,
213
214
  Se as Steps,
214
215
  he as Table,
215
216
  ve as Tabs,
216
- ye as Tag,
217
- Me as TagLiveRegion,
218
- Be as TextRotate,
217
+ Ae as Tag,
218
+ Le as TagLiveRegion,
219
+ Be as Terminal,
220
+ we as TextRotate,
219
221
  De as Textarea,
220
- Le as ThemeController,
221
- ze as ThemeProvider,
222
- Ke as TimePicker,
223
- Ee as Timeline,
224
- Je as Toggle,
225
- Qe as Tooltip,
226
- je as Tour,
227
- Xe as Transfer,
228
- Ze as Tree,
229
- $e as TreeSelect,
230
- ot as TreeSelectComponent,
231
- et as Typography,
232
- pt as Upload,
233
- mt as Watermark,
222
+ ze as ThemeController,
223
+ We as ThemeProvider,
224
+ Ee as TimePicker,
225
+ Je as Timeline,
226
+ je as Toggle,
227
+ Xe as Tooltip,
228
+ Qe as Tour,
229
+ Ze as Transfer,
230
+ $e as Tree,
231
+ rt as TreeSelect,
232
+ et as TreeSelectComponent,
233
+ pt as Typography,
234
+ ft as Upload,
235
+ at as Watermark,
234
236
  ao as WeekCalendar,
235
237
  Fr as Window,
236
238
  po as dateOfBirthRequired,
237
- Vt as deDE,
238
- Gt as enCA,
239
- Ht as enGB,
240
- It as enUS,
241
- Nt as esES,
242
- Yt as frFR,
243
- Ut as jaJP,
244
- _t as koKR,
239
+ Yt as deDE,
240
+ Ot as enCA,
241
+ Gt as enGB,
242
+ Ht as enUS,
243
+ Ut as esES,
244
+ _t as frFR,
245
+ qt as jaJP,
246
+ op as koKR,
245
247
  Wr as message,
246
248
  Ir as notification,
247
- qt as ptBR,
248
- it as useBreakpoint,
249
- ht as useClickOutside,
250
- Ct as useClipboard,
249
+ Vt as ptBR,
250
+ lt as useBreakpoint,
251
+ vt as useClickOutside,
252
+ Tt as useClipboard,
251
253
  E as useComponentLocale,
252
254
  N as useConfig,
253
- St as useDebounce,
254
- lt as useDisclosure,
255
+ ht as useDebounce,
256
+ Ct as useDisclosure,
255
257
  Ho as useForm,
256
258
  Wo as useFormInstance,
257
- He as useHasThemeProvider,
258
- Dt as useHover,
259
- Bt as useKeyPress,
260
- Ft as useKeyPressCallback,
261
- gt as useLocalStorage,
259
+ Ge as useHasThemeProvider,
260
+ Bt as useHover,
261
+ wt as useKeyPress,
262
+ yt as useKeyPressCallback,
263
+ St as useLocalStorage,
262
264
  J as useLocale,
263
- vt as usePrevious,
265
+ Dt as usePrevious,
264
266
  ar as useSiderContext,
265
267
  v as useSize,
266
- At as useTheme,
267
- We as useThemeContext,
268
- op as useWatch,
269
- yt as useWindowSize,
270
- Ot as zhCN
268
+ It as useTheme,
269
+ Ke as useThemeContext,
270
+ ep as useWatch,
271
+ At as useWindowSize,
272
+ Nt as zhCN
271
273
  };
272
274
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1 @@
1
+ export { Terminal, type TerminalProps, type TerminalRef } from './components/Terminal';
@@ -0,0 +1,5 @@
1
+ import { Terminal as m } from "./components/Terminal.js";
2
+ export {
3
+ m as Terminal
4
+ };
5
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "asterui",
3
- "version": "0.12.79",
3
+ "version": "0.12.81",
4
4
  "description": "React UI component library with DaisyUI",
5
5
  "homepage": "https://asterui.com",
6
6
  "repository": {
@@ -34,6 +34,14 @@
34
34
  "./editor": {
35
35
  "import": "./dist/editor.js",
36
36
  "types": "./dist/editor.d.ts"
37
+ },
38
+ "./terminal": {
39
+ "import": "./dist/terminal.js",
40
+ "types": "./dist/terminal.d.ts"
41
+ },
42
+ "./codeeditor": {
43
+ "import": "./dist/codeeditor.js",
44
+ "types": "./dist/codeeditor.d.ts"
37
45
  }
38
46
  },
39
47
  "files": [
@@ -44,6 +52,8 @@
44
52
  "react-hook-form": "^7.0.0"
45
53
  },
46
54
  "peerDependencies": {
55
+ "@xterm/xterm": "^5.0.0",
56
+ "@xterm/addon-fit": "^0.10.0",
47
57
  "@tanstack/react-virtual": "^3.0.0",
48
58
  "@tiptap/extension-link": "^2.0.0",
49
59
  "@tiptap/extension-placeholder": "^2.0.0",
@@ -53,9 +63,30 @@
53
63
  "apexcharts": "^5.3.6",
54
64
  "qrcode": "^1.5.4",
55
65
  "react": "^18.0.0 || ^19.0.0",
56
- "react-dom": "^18.0.0 || ^19.0.0"
66
+ "react-dom": "^18.0.0 || ^19.0.0",
67
+ "@codemirror/autocomplete": "^6.0.0",
68
+ "@codemirror/commands": "^6.0.0",
69
+ "@codemirror/lang-css": "^6.0.0",
70
+ "@codemirror/lang-html": "^6.0.0",
71
+ "@codemirror/lang-javascript": "^6.0.0",
72
+ "@codemirror/lang-json": "^6.0.0",
73
+ "@codemirror/lang-markdown": "^6.0.0",
74
+ "@codemirror/lang-python": "^6.0.0",
75
+ "@codemirror/lang-sql": "^6.0.0",
76
+ "@codemirror/lang-xml": "^6.0.0",
77
+ "@codemirror/language": "^6.0.0",
78
+ "@codemirror/lint": "^6.0.0",
79
+ "@codemirror/search": "^6.0.0",
80
+ "@codemirror/state": "^6.0.0",
81
+ "@codemirror/view": "^6.0.0"
57
82
  },
58
83
  "peerDependenciesMeta": {
84
+ "@xterm/xterm": {
85
+ "optional": true
86
+ },
87
+ "@xterm/addon-fit": {
88
+ "optional": true
89
+ },
59
90
  "@tanstack/react-virtual": {
60
91
  "optional": true
61
92
  },
@@ -79,11 +110,73 @@
79
110
  },
80
111
  "qrcode": {
81
112
  "optional": true
113
+ },
114
+ "@codemirror/autocomplete": {
115
+ "optional": true
116
+ },
117
+ "@codemirror/commands": {
118
+ "optional": true
119
+ },
120
+ "@codemirror/lang-css": {
121
+ "optional": true
122
+ },
123
+ "@codemirror/lang-html": {
124
+ "optional": true
125
+ },
126
+ "@codemirror/lang-javascript": {
127
+ "optional": true
128
+ },
129
+ "@codemirror/lang-json": {
130
+ "optional": true
131
+ },
132
+ "@codemirror/lang-markdown": {
133
+ "optional": true
134
+ },
135
+ "@codemirror/lang-python": {
136
+ "optional": true
137
+ },
138
+ "@codemirror/lang-sql": {
139
+ "optional": true
140
+ },
141
+ "@codemirror/lang-xml": {
142
+ "optional": true
143
+ },
144
+ "@codemirror/language": {
145
+ "optional": true
146
+ },
147
+ "@codemirror/lint": {
148
+ "optional": true
149
+ },
150
+ "@codemirror/search": {
151
+ "optional": true
152
+ },
153
+ "@codemirror/state": {
154
+ "optional": true
155
+ },
156
+ "@codemirror/view": {
157
+ "optional": true
82
158
  }
83
159
  },
84
160
  "devDependencies": {
161
+ "@codemirror/autocomplete": "^6.18.6",
162
+ "@codemirror/commands": "^6.8.1",
163
+ "@codemirror/lang-css": "^6.3.1",
164
+ "@codemirror/lang-html": "^6.4.9",
165
+ "@codemirror/lang-javascript": "^6.2.3",
166
+ "@codemirror/lang-json": "^6.0.1",
167
+ "@codemirror/lang-markdown": "^6.3.2",
168
+ "@codemirror/lang-python": "^6.1.7",
169
+ "@codemirror/lang-sql": "^6.8.0",
170
+ "@codemirror/lang-xml": "^6.1.0",
171
+ "@codemirror/language": "^6.11.0",
172
+ "@codemirror/lint": "^6.8.5",
173
+ "@codemirror/search": "^6.5.10",
174
+ "@codemirror/state": "^6.5.2",
175
+ "@codemirror/view": "^6.36.5",
85
176
  "@tailwindcss/vite": "^4.1.18",
86
177
  "@tanstack/react-virtual": "^3.13.13",
178
+ "@xterm/xterm": "^5.5.0",
179
+ "@xterm/addon-fit": "^0.10.0",
87
180
  "@tiptap/extension-link": "^2.11.5",
88
181
  "@tiptap/extension-placeholder": "^2.11.5",
89
182
  "@tiptap/extension-underline": "^2.11.5",