2024-07-23 14:01:10 +02:00
|
|
|
<script lang="ts">
|
|
|
|
|
import { clamp } from 'lodash-es';
|
2024-08-17 17:03:34 +02:00
|
|
|
import type { ClipboardEventHandler } from 'svelte/elements';
|
2024-07-23 14:01:10 +02:00
|
|
|
|
2024-11-14 08:43:25 -06:00
|
|
|
interface Props {
|
|
|
|
|
id: string;
|
|
|
|
|
min: number;
|
|
|
|
|
max: number;
|
|
|
|
|
step?: number | string;
|
|
|
|
|
required?: boolean;
|
|
|
|
|
value?: number;
|
|
|
|
|
onInput: (value: number | null) => void;
|
|
|
|
|
onPaste?: ClipboardEventHandler<HTMLInputElement>;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let {
|
|
|
|
|
id,
|
|
|
|
|
min,
|
|
|
|
|
max,
|
|
|
|
|
step = 'any',
|
|
|
|
|
required = true,
|
|
|
|
|
value = $bindable(),
|
|
|
|
|
onInput,
|
|
|
|
|
onPaste = undefined,
|
|
|
|
|
}: Props = $props();
|
|
|
|
|
|
|
|
|
|
const oninput = () => {
|
|
|
|
|
if (!value) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (value !== null && (value < min || value > max)) {
|
|
|
|
|
value = clamp(value, min, max);
|
|
|
|
|
}
|
|
|
|
|
onInput(value);
|
|
|
|
|
};
|
2024-07-23 14:01:10 +02:00
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<input
|
|
|
|
|
type="number"
|
|
|
|
|
class="immich-form-input w-full"
|
|
|
|
|
{id}
|
|
|
|
|
{min}
|
|
|
|
|
{max}
|
|
|
|
|
{step}
|
|
|
|
|
{required}
|
|
|
|
|
bind:value
|
2024-11-14 08:43:25 -06:00
|
|
|
{oninput}
|
|
|
|
|
onpaste={onPaste}
|
2024-07-23 14:01:10 +02:00
|
|
|
/>
|