diff options
| author | ojacobson <ojacobson@noreply.codeberg.org> | 2025-05-16 02:15:05 +0000 |
|---|---|---|
| committer | ojacobson <ojacobson@noreply.codeberg.org> | 2025-05-16 02:15:05 +0000 |
| commit | 630cbc2b70309ae5d2ece01861b9fe3983ab5278 (patch) | |
| tree | fe93a375a8e4ffb17d2133dd0adfab55fb456abb /ui/lib/components/MessageInput.svelte | |
| parent | 6eb8487d89ab14f8f11a40b78d7db72e3266840d (diff) | |
| parent | a4ad808eb804e32edf3b848c229542b759db0102 (diff) | |
Merge pull request 'prop/text-input-no-quill-plus' (#2) from prop/text-input-no-quill-plus into prop/text-input-no-quill
Reviewed-on: https://codeberg.org/ojacobson/pilcrow/pulls/2
Reviewed-by: Kit <wlonk@noreply.codeberg.org>
Diffstat (limited to 'ui/lib/components/MessageInput.svelte')
| -rw-r--r-- | ui/lib/components/MessageInput.svelte | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/ui/lib/components/MessageInput.svelte b/ui/lib/components/MessageInput.svelte index 71b7b8f..cdb855e 100644 --- a/ui/lib/components/MessageInput.svelte +++ b/ui/lib/components/MessageInput.svelte @@ -1,40 +1,64 @@ <script> let { sendMessage = async (message) => {} } = $props(); - let form = $state(null); let value = $state(''); - // This doesn't seem to work with a contenteditable two-way bound svelte - // thing: let disabled = $state(false); + // Entering and removing text from the input area leaves a stray line break behind. This effect + // looks for that scenario and removes it, restoring the "empty" state (and bringing the + // placeholder back again in the process). + $effect(() => { + const trimmed = value.trim(); + if (trimmed !== value && trimmed === '') { + value = trimmed; + } + }); + async function onsubmit(event) { event.preventDefault(); disabled = true; try { await sendMessage(value); - value = ''; + event.target.closest('form')?.reset(); } finally { disabled = false; } } function onkeydown(event) { + if (disabled) { + event.preventDefault(); + return; + } + let modifier = event.shiftKey || event.altKey || event.ctrlKey || event.metaKey; if (!modifier && event.key === 'Enter') { event.preventDefault(); - form?.requestSubmit?.(); + event.target.closest('form')?.requestSubmit(); + } + } + + function onpaste(event) { + if (disabled) { + event.preventDefault(); } } </script> -<form {onsubmit} bind:this={form}> +<form {onsubmit}> + <textarea bind:value class="hidden" {disabled}></textarea> <div + role="textbox" + tabindex="0" contenteditable="plaintext-only" - class="textarea" + class={{ + textarea: true, + disabled + }} bind:innerText={value} {onkeydown} - {disabled} - placeholder="Say something..." + {onpaste} + data-placeholder="Say something..." ></div> <button type="submit">»</button> </form> |
