summaryrefslogtreecommitdiffhomepage
path: root/src/features/surface-host/ui/Number.svelte
blob: 0f3323dbe2b51e245679faa8813fdff3567b3b36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<script lang="ts">
	import type { InvokeMessage } from "@dispatch/ui-contract";
	import type { NumberFieldView } from "../logic/types";

	let {
		field,
		surfaceId,
		onInvoke,
	}: { field: NumberFieldView; surfaceId: string; onInvoke: (msg: InvokeMessage) => void } =
		$props();

	// Commit on change/Enter rather than every keystroke. Ignore empty/non-numeric
	// input (the backend also floors/validates); send the new number as payload.
	function commit(event: Event) {
		const target = event.target as HTMLInputElement;
		const next = target.valueAsNumber;
		if (Number.isNaN(next)) return;
		onInvoke({
			type: "invoke",
			surfaceId,
			actionId: field.action.actionId,
			payload: next,
		});
	}
</script>

<label class="flex items-center justify-between gap-2 text-sm">
	<span>{field.label}</span>
	<span class="flex items-center gap-1">
		<input
			type="number"
			class="input input-bordered input-sm w-24"
			value={field.value}
			min={field.min}
			max={field.max}
			step={field.step}
			onchange={commit}
		/>
		{#if field.unit}
			<span class="opacity-60">{field.unit}</span>
		{/if}
	</span>
</label>