summaryrefslogtreecommitdiffhomepage
path: root/src/features/surface-host/ui/Number.svelte
blob: 5a6708756f4b65f33470a20930df08c3df913c24 (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>