2021-12-30 19:28:43 +01:00
|
|
|
<script lang="ts">
|
2021-12-31 00:46:19 +01:00
|
|
|
import { createEventDispatcher } from "svelte";
|
2022-03-22 21:54:46 +01:00
|
|
|
let input: HTMLInputElement;
|
2021-12-31 00:46:19 +01:00
|
|
|
|
|
|
|
const dispatch = createEventDispatcher();
|
|
|
|
|
2021-12-30 19:28:43 +01:00
|
|
|
export let placeholder = "";
|
|
|
|
export let value = "";
|
2022-03-10 20:35:29 +01:00
|
|
|
export let disabled = false;
|
2021-12-30 19:28:43 +01:00
|
|
|
|
|
|
|
let focused = false;
|
2021-12-31 00:46:19 +01:00
|
|
|
$: dispatch("focusChange", focused);
|
2022-01-09 21:24:49 +01:00
|
|
|
|
|
|
|
function onInput() {
|
|
|
|
dispatch("input", value);
|
|
|
|
}
|
2022-03-22 21:54:46 +01:00
|
|
|
|
|
|
|
export function focus() {
|
|
|
|
input.focus();
|
|
|
|
}
|
2021-12-30 19:28:43 +01:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<div class="input" class:focused>
|
|
|
|
<slot name="prefix" />
|
|
|
|
<input
|
2022-03-22 21:54:46 +01:00
|
|
|
bind:this={input}
|
2021-12-30 19:28:43 +01:00
|
|
|
{placeholder}
|
2021-12-31 00:46:19 +01:00
|
|
|
bind:value
|
2022-01-09 21:24:49 +01:00
|
|
|
on:input={onInput}
|
2021-12-30 19:28:43 +01:00
|
|
|
on:focus={() => (focused = true)}
|
|
|
|
on:blur={() => (focused = false)}
|
2022-03-10 20:35:29 +01:00
|
|
|
{disabled}
|
2021-12-30 19:28:43 +01:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<style lang="scss">
|
|
|
|
.input {
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
gap: 0.25em;
|
|
|
|
padding: 0.25em;
|
|
|
|
|
|
|
|
border: 1px solid var(--foreground-lighter);
|
|
|
|
border-radius: 4px;
|
2021-12-31 00:46:19 +01:00
|
|
|
background: var(--background);
|
2021-12-30 19:28:43 +01:00
|
|
|
|
2021-12-31 00:46:19 +01:00
|
|
|
transition: box-shadow 0.25s;
|
2021-12-30 19:28:43 +01:00
|
|
|
&.focused {
|
2021-12-30 23:24:38 +01:00
|
|
|
box-shadow: 0 0 2px 3px var(--primary);
|
2021-12-30 19:28:43 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
input {
|
|
|
|
flex-grow: 1;
|
2022-01-06 23:12:02 +01:00
|
|
|
min-width: 0;
|
2021-12-30 19:28:43 +01:00
|
|
|
|
|
|
|
color: var(--foreground);
|
|
|
|
background: transparent;
|
|
|
|
border: none;
|
|
|
|
|
|
|
|
&:focus {
|
|
|
|
outline: none;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|