diff --git a/src/client/src/components/PromptEditor.ts b/src/client/src/components/PromptEditor.ts index cc1f24e..2bbbc2b 100644 --- a/src/client/src/components/PromptEditor.ts +++ b/src/client/src/components/PromptEditor.ts @@ -1,3 +1,8 @@ +import { defaultKeymap, history, historyKeymap, indentWithTab, insertNewlineAndIndent } from "@codemirror/commands"; +import { markdown, deleteMarkupBackward, insertNewlineContinueMarkup } from "@codemirror/lang-markdown"; +import { EditorSelection, EditorState, Compartment } from "@codemirror/state"; +import { EditorView, keymap, placeholder } from "@codemirror/view"; +import { defaultHighlightStyle, indentOnInput, indentUnit, syntaxHighlighting } from "@codemirror/language"; import { LitElement, html, type PropertyValues } from "lit"; import { customElement, property, query, state } from "lit/decorators.js"; import { api, type FileSuggestion, type SessionStatus, type SlashCommand } from "../api"; @@ -18,11 +23,14 @@ export class PromptEditor extends LitElement { @property({ attribute: false }) onStop?: () => void; @property({ attribute: false }) onSelectModel?: () => void; @property({ attribute: false }) onSelectThinking?: () => void; - @query("textarea") private textarea?: HTMLTextAreaElement; + @query(".markdown-editor") private editorHost?: HTMLDivElement; @state() private draft = ""; @state() private completions: CompletionItem[] = []; @state() private selectedIndex = 0; private requestVersion = 0; + private editor: EditorView | undefined; + private readonly editableCompartment = new Compartment(); + private readonly readOnlyCompartment = new Compartment(); protected override willUpdate(changed: PropertyValues) { if (!changed.has("sessionId")) return; @@ -33,8 +41,19 @@ export class PromptEditor extends LitElement { this.selectedIndex = 0; } + override firstUpdated(): void { + this.createEditor(); + } + protected override updated(changed: PropertyValues) { - if (changed.has("draft") || changed.has("sessionId")) this.resizeTextarea(); + if (changed.has("disabled")) this.updateEditorDisabledState(); + if (changed.has("draft") || changed.has("sessionId")) this.syncEditorDoc(); + } + + override disconnectedCallback(): void { + this.editor?.destroy(); + this.editor = undefined; + super.disconnectedCallback(); } override render() { @@ -44,15 +63,7 @@ export class PromptEditor extends LitElement { return html`