diff options
| author | Owen Jacobson <owen@grimoire.ca> | 2025-05-16 20:32:40 -0400 |
|---|---|---|
| committer | Owen Jacobson <owen@grimoire.ca> | 2025-05-16 20:32:40 -0400 |
| commit | 96d363fd9290d43d2e6a11e2e5269fb8ccf6d65d (patch) | |
| tree | 8c12e43ea31e3c99960bad009a68b2518bb47649 /ui/lib | |
| parent | 48b4e4ebc4558cf6790c0a9043c46f16b0cbc285 (diff) | |
| parent | 630cbc2b70309ae5d2ece01861b9fe3983ab5278 (diff) | |
Merge remote-tracking branch 'codeberg/prop/text-input-no-quill'
> We can hand-write markdown for now, as per discussions.
>
> If we have buttons and shortcuts, we'd like them to insert actual markdown into the text stream, and then, as a separate concern, we'd like to render the markdown without changing the text stream (à la Discord). But we're doing none of that now, and it's too high a piece of fruit to pluck today.
Diffstat (limited to 'ui/lib')
| -rw-r--r-- | ui/lib/components/MessageInput.svelte | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/ui/lib/components/MessageInput.svelte b/ui/lib/components/MessageInput.svelte index 69a8298..cdb855e 100644 --- a/ui/lib/components/MessageInput.svelte +++ b/ui/lib/components/MessageInput.svelte @@ -4,27 +4,61 @@ let value = $state(''); 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); - event.target.reset(); + 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(); - event.target.form.requestSubmit(); + event.target.closest('form')?.requestSubmit(); + } + } + + function onpaste(event) { + if (disabled) { + event.preventDefault(); } } </script> <form {onsubmit}> - <textarea {onkeydown} bind:value {disabled} placeholder="Say something..."></textarea> + <textarea bind:value class="hidden" {disabled}></textarea> + <div + role="textbox" + tabindex="0" + contenteditable="plaintext-only" + class={{ + textarea: true, + disabled + }} + bind:innerText={value} + {onkeydown} + {onpaste} + data-placeholder="Say something..." + ></div> <button type="submit">»</button> </form> |
