<script lang="ts"> | |
import { createEventDispatcher } from 'svelte'; | |
export let value = ''; | |
export let minRows = 1; | |
export let maxRows: null | number = null; | |
export let placeholder = ''; | |
export let autofocus = false; | |
const dispatch = createEventDispatcher(); | |
$: minHeight = `${1 + minRows * 1.5}em`; | |
$: maxHeight = maxRows ? `${1 + maxRows * 1.5}em` : `auto`; | |
function handleKeydown(event: KeyboardEvent) { | |
// submit on enter | |
if (event.key === 'Enter' && !event.shiftKey) { | |
dispatch('submit'); | |
event.preventDefault(); | |
} | |
} | |
</script> | |
<div class="relative flex-1 min-w-0"> | |
<pre | |
class="invisible py-3" | |
aria-hidden="true" | |
style="min-height: {minHeight}; max-height: {maxHeight}">{value + ' \n'}</pre> | |
<textarea | |
tabindex="0" | |
rows="1" | |
class="absolute m-0 w-full h-full top-0 resize-none border-0 bg-transparent p-3 focus:ring-0 focus-visible:ring-0 dark:bg-transparent outline-none scrollbar-custom overflow-x-hidden overflow-y-scroll" | |
bind:value | |
on:keydown={handleKeydown} | |
{placeholder} | |
{autofocus} | |
/> | |
</div> | |
<style> | |
pre, | |
textarea { | |
font-family: inherit; | |
box-sizing: border-box; | |
line-height: 1.5; | |
} | |
</style> | |