CodeMirror = (doc = "", config = {}) => {
const extensions = config.extensions ?? [];
const updateViewOf = codemirror.EditorView.updateListener.of((update) => {
if (doc !== view.state.doc.toString()) {
doc = view.state.doc.toString();
container.dispatchEvent(new Event("input", { bubbles: true }));
}
});
const view = new codemirror.EditorView({
doc,
extensions: [updateViewOf, ...extensions]
});
const el = view.dom;
const container = htl.html`<div><span onInput=${(evt) =>
evt.stopPropagation()}>${el}`;
Object.defineProperty(container, "value", {
enumerable: true,
get: () => doc,
set: (newContent = "") => {
const change = calcChange(doc, newContent, view.state.selection);
doc = newContent;
view.dispatch(change);
}
});
return container;
}