<script lang="ts"> | |
import { onMount, tick } from 'svelte'; | |
export let value = ''; | |
export let placeholder = ''; | |
export let rows = 1; | |
export let required = false; | |
export let className = | |
'w-full rounded-lg px-3 py-2 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none resize-none h-full'; | |
let textareaElement; | |
onMount(async () => { | |
await tick(); | |
if (textareaElement) { | |
await tick(); | |
setTimeout(adjustHeight, 0); | |
} | |
}); | |
$: if (value) { | |
setTimeout(adjustHeight, 0); | |
} | |
const adjustHeight = () => { | |
if (textareaElement) { | |
textareaElement.style.height = ''; | |
textareaElement.style.height = `${textareaElement.scrollHeight}px`; | |
} | |
}; | |
</script> | |
<textarea | |
bind:this={textareaElement} | |
bind:value | |
{placeholder} | |
on:input={adjustHeight} | |
on:focus={adjustHeight} | |
class={className} | |
{rows} | |
{required} | |
/> | |