Spaces:
Build error
Build error
Adrien Denat
commited on
Commit
·
6e856a0
1
Parent(s):
743240e
add support for textArea autoheight + line break + tweak styling of input
Browse files- src/lib/components/TextArea.svelte +45 -0
- src/routes/+page.svelte +30 -24
src/lib/components/TextArea.svelte
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<script lang="ts">
|
| 2 |
+
export let value = '';
|
| 3 |
+
export let minRows = 1;
|
| 4 |
+
export let maxRows: null | number = null;
|
| 5 |
+
export let placeholder = '';
|
| 6 |
+
export let autofocus = false;
|
| 7 |
+
|
| 8 |
+
$: minHeight = `${1 + minRows * 1.5}em`;
|
| 9 |
+
$: maxHeight = maxRows ? `${1 + maxRows * 1.5}em` : `auto`;
|
| 10 |
+
|
| 11 |
+
function handleKeydown(event: KeyboardEvent) {
|
| 12 |
+
// submit on enter
|
| 13 |
+
if (event.key === 'Enter' && !event.shiftKey) {
|
| 14 |
+
event.preventDefault();
|
| 15 |
+
// @ts-ignore - requestSubmit is not in the DOM typings
|
| 16 |
+
event.target?.form?.requestSubmit();
|
| 17 |
+
}
|
| 18 |
+
}
|
| 19 |
+
</script>
|
| 20 |
+
|
| 21 |
+
<div class="relative w-full">
|
| 22 |
+
<pre
|
| 23 |
+
class="invisible py-3"
|
| 24 |
+
aria-hidden="true"
|
| 25 |
+
style="min-height: {minHeight}; max-height: {maxHeight}">{value + '\n'}</pre>
|
| 26 |
+
|
| 27 |
+
<textarea
|
| 28 |
+
tabindex="0"
|
| 29 |
+
rows="1"
|
| 30 |
+
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"
|
| 31 |
+
bind:value
|
| 32 |
+
on:keydown={handleKeydown}
|
| 33 |
+
{placeholder}
|
| 34 |
+
{autofocus}
|
| 35 |
+
/>
|
| 36 |
+
</div>
|
| 37 |
+
|
| 38 |
+
<style>
|
| 39 |
+
pre,
|
| 40 |
+
textarea {
|
| 41 |
+
font-family: inherit;
|
| 42 |
+
box-sizing: border-box;
|
| 43 |
+
line-height: 1.5;
|
| 44 |
+
}
|
| 45 |
+
</style>
|
src/routes/+page.svelte
CHANGED
|
@@ -135,35 +135,41 @@
|
|
| 135 |
</div>
|
| 136 |
</div>
|
| 137 |
<div
|
| 138 |
-
class="flex items-center bg-gradient-to-t from-white dark:from-gray-900 to-transparent justify-center absolute inset-x-0 max-w-3xl xl:max-w-4xl mx-auto px-5 bottom-0
|
| 139 |
>
|
| 140 |
<form
|
| 141 |
on:submit={onWrite}
|
| 142 |
class="shadow-alternate relative flex items-center rounded-xl flex-1 max-w-4xl border bg-gray-100 dark:bg-gray-700 dark:border-gray-600"
|
| 143 |
>
|
| 144 |
-
<
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 167 |
</form>
|
| 168 |
</div>
|
| 169 |
</div>
|
|
|
|
| 135 |
</div>
|
| 136 |
</div>
|
| 137 |
<div
|
| 138 |
+
class="flex items-center bg-gradient-to-t from-white dark:from-gray-900 to-transparent justify-center absolute inset-x-0 max-w-3xl xl:max-w-4xl mx-auto px-5 bottom-0 py-8 w-full"
|
| 139 |
>
|
| 140 |
<form
|
| 141 |
on:submit={onWrite}
|
| 142 |
class="shadow-alternate relative flex items-center rounded-xl flex-1 max-w-4xl border bg-gray-100 dark:bg-gray-700 dark:border-gray-600"
|
| 143 |
>
|
| 144 |
+
<div class="flex flex-1 border-none bg-transparent">
|
| 145 |
+
<TextArea
|
| 146 |
+
placeholder="Ask anything"
|
| 147 |
+
bind:value={message}
|
| 148 |
+
on:submit={onWrite}
|
| 149 |
+
autofocus
|
| 150 |
+
maxRows={10}
|
| 151 |
+
/>
|
| 152 |
+
<button
|
| 153 |
+
class="p-1 px-[0.7rem] self-end my-1 h-[2.4rem] rounded-lg text-gray-500 hover:bg-gray-100 enabled:dark:hover:text-gray-400 dark:hover:bg-gray-900 disabled:hover:bg-transparent dark:disabled:hover:bg-transparent disabled:opacity-40 mr-1"
|
| 154 |
+
>
|
| 155 |
+
<svg
|
| 156 |
+
class="text-gray-300 pointer-events-none"
|
| 157 |
+
xmlns="http://www.w3.org/2000/svg"
|
| 158 |
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
| 159 |
+
aria-hidden="true"
|
| 160 |
+
focusable="false"
|
| 161 |
+
role="img"
|
| 162 |
+
width="1em"
|
| 163 |
+
height="1em"
|
| 164 |
+
preserveAspectRatio="xMidYMid meet"
|
| 165 |
+
viewBox="0 0 32 32"
|
| 166 |
+
><path
|
| 167 |
+
d="M30 28.59L22.45 21A11 11 0 1 0 21 22.45L28.59 30zM5 14a9 9 0 1 1 9 9a9 9 0 0 1-9-9z"
|
| 168 |
+
fill="currentColor"
|
| 169 |
+
/></svg
|
| 170 |
+
></button
|
| 171 |
+
>
|
| 172 |
+
</div>
|
| 173 |
</form>
|
| 174 |
</div>
|
| 175 |
</div>
|