diff --git a/src/components/textarea/textarea.tsx b/src/components/textarea/textarea.tsx index ac0afe6..5cde80e 100644 --- a/src/components/textarea/textarea.tsx +++ b/src/components/textarea/textarea.tsx @@ -1,8 +1,8 @@ -import { createEffect, createSignal, on } from 'solid-js'; -import { getTextNodes } from '@solid-primitives/selection'; -import { createEditContext } from '~/features/editor'; +import { createEffect, createSignal, on, onMount } from 'solid-js'; +import { createSelection, getTextNodes } from '@solid-primitives/selection'; import { createSource } from '~/features/source'; import css from './textarea.module.css'; +import { debounce } from '@solid-primitives/scheduled'; interface TextareaProps { class?: string; @@ -16,13 +16,31 @@ interface TextareaProps { } export function Textarea(props: TextareaProps) { + const [selection, setSelection] = createSelection(); const [editorRef, setEditorRef] = createSignal(); const source = createSource(() => props.value); - const [text] = createEditContext(editorRef, () => source.out); - createEffect(() => { - source.out = text(); + const mutate = debounce(() => { + const [, start, end] = selection(); + const ref = editorRef(); + + if (ref) { + source.out = ref.innerHTML; + + ref.style.height = `1px`; + ref.style.height = `${2 + ref.scrollHeight}px`; + + setSelection([ref, start, end]); + } + }, 300); + + onMount(() => { + new MutationObserver(mutate).observe(editorRef()!, { + subtree: true, + childList: true, + characterData: true, + }); }); createEffect(() => { @@ -42,12 +60,13 @@ export function Textarea(props: TextareaProps) { })); return
e.stopPropagation()} on:pointerdown={e => e.stopPropagation()} diff --git a/src/features/source/source.ts b/src/features/source/source.ts index 3965c18..94c906a 100644 --- a/src/features/source/source.ts +++ b/src/features/source/source.ts @@ -103,7 +103,7 @@ export function createSource(value: Accessor): Source { }); createEffect(() => { - setStore('metadata', 'queryResults', findMatches(store.plain, store.query).toArray()); + setStore('metadata', 'queryResults', findMatches(store.plain, store.query)); }); return src; diff --git a/src/routes/(editor)/experimental/formatter.tsx b/src/routes/(editor)/experimental/formatter.tsx index 4a531de..4c9546a 100644 --- a/src/routes/(editor)/experimental/formatter.tsx +++ b/src/routes/(editor)/experimental/formatter.tsx @@ -37,11 +37,11 @@ export default function Formatter(props: {}) { return
- + {/* - + */} - {/*