diff options
| -rw-r--r-- | ui/lib/components/MessageInput.svelte | 18 | ||||
| -rw-r--r-- | ui/styles/textarea.css | 34 |
2 files changed, 39 insertions, 13 deletions
diff --git a/ui/lib/components/MessageInput.svelte b/ui/lib/components/MessageInput.svelte index 69a8298..1f4ba99 100644 --- a/ui/lib/components/MessageInput.svelte +++ b/ui/lib/components/MessageInput.svelte @@ -1,7 +1,10 @@ <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); async function onsubmit(event) { @@ -9,7 +12,7 @@ disabled = true; try { await sendMessage(value); - event.target.reset(); + value = ''; } finally { disabled = false; } @@ -19,12 +22,19 @@ let modifier = event.shiftKey || event.altKey || event.ctrlKey || event.metaKey; if (!modifier && event.key === 'Enter') { event.preventDefault(); - event.target.form.requestSubmit(); + form?.requestSubmit?.(); } } </script> -<form {onsubmit}> - <textarea {onkeydown} bind:value {disabled} placeholder="Say something..."></textarea> +<form {onsubmit} bind:this={form}> + <div + contenteditable="plaintext-only" + class="textarea" + bind:textContent={value} + {onkeydown} + {disabled} + placeholder="Say something..." + ></div> <button type="submit">»</button> </form> diff --git a/ui/styles/textarea.css b/ui/styles/textarea.css index 4b8602c..4dc804a 100644 --- a/ui/styles/textarea.css +++ b/ui/styles/textarea.css @@ -4,28 +4,44 @@ flex-direction: row; justify-content: flex-start; align-items: stretch; +} - @media (width <= 640px) { - margin: 0 0.5rem 1rem 0.5rem; - } +/* The second selector is more generally useful, but it doesn't seem to work, + * so I added in the first selector. */ +.textarea:empty:before, +[contenteditable='true']:empty:before { + content: attr(placeholder); + pointer-events: none; + display: block; /* For Firefox */ } -.create-message textarea { - padding: 0.5rem; - border-radius: 0.5rem 0 0 0.5rem; +.create-message .textarea { + padding: 1rem; border: 1px solid var(--colour-input-border); z-index: 1; /* Just to make the focus-active border go over the following button. */ flex-grow: 1; background-color: var(--colour-input-bg); color: var(--colour-input-text); - font-family: 'FiraCode', monospace; + min-height: 1rem; + max-height: 10rem; + overflow-x: hidden; + overflow-y: auto; + + @media (width <= 640px) { + border-radius: 0; + min-height: 2.5rem; + } } .create-message button { - border-radius: 0 0.5rem 0.5rem 0; border: 1px solid var(--colour-input-border); background-color: var(--colour-input-bg); color: var(--colour-input-text); + padding: 1rem; + + @media (width <= 640px) { + border-radius: 0; + } } main { @@ -38,7 +54,7 @@ main { /* Workaround for iOS zooming in on the textarea when it gets focus. */ @media screen and (-webkit-min-device-pixel-ratio: 0) { select, - textarea, + .textarea, input { font-size: 16px; } |
