diff --git a/src/lib/Button.svelte b/src/lib/Button.svelte index 28e316b..6b46dd1 100644 --- a/src/lib/Button.svelte +++ b/src/lib/Button.svelte @@ -2,7 +2,6 @@ import type { Snippet } from 'svelte'; import type { ClassValue, HTMLButtonAttributes, MouseEventHandler } from 'svelte/elements'; import Spinner from './Spinner.svelte'; - import type { IconComponentProps } from 'phosphor-svelte'; import { defaultIconProps, type IconDef } from './util'; interface Props extends Omit { diff --git a/src/lib/ToggleGroup.svelte b/src/lib/ToggleGroup.svelte index edf68e7..d06a6ef 100644 --- a/src/lib/ToggleGroup.svelte +++ b/src/lib/ToggleGroup.svelte @@ -27,16 +27,23 @@ const id = $derived(generateIdentifier('toggle-group', name)); + const extended: { detail: Option; ref?: ToggleSelect }[] = $derived.by(() => { + return options.map((opt) => ({ + detail: opt + })); + }); + let inputElement: HTMLInputElement | undefined = $state(); let valid: boolean = $state(true); const makeSelectedHandler = (name: string) => { return (toggled: boolean) => { - if (!inputElement) return; - if (toggled) selected = [...selected, name]; - else selected = selected.filter((item) => item !== name); - inputElement.value = JSON.stringify(selected); - validateInput(inputElement); // trigger validation on hidden input + if (inputElement) { + if (toggled) selected = [...selected, name]; + else selected = selected.filter((item) => item !== name); + inputElement.value = JSON.stringify(selected); + validateInput(inputElement); // trigger validation on hidden input + } }; }; @@ -61,12 +68,26 @@ /> {/if} - {#each options as opt} + {#each extended as opt, i (getValue(opt.detail))} { + if (e.key === 'ArrowRight' || e.key === 'ArrowDown') { + if (i < extended.length - 1) { + extended[i + 1].ref?.focus(); + } + } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { + if (i > 0) { + extended[i - 1].ref?.focus(); + } + } else { + return; + } + e.preventDefault(); + }} > - {getLabel(opt)} + {getLabel(opt.detail)} {/each} diff --git a/src/lib/ToggleSelect.svelte b/src/lib/ToggleSelect.svelte index 36ada83..5db1bb1 100644 --- a/src/lib/ToggleSelect.svelte +++ b/src/lib/ToggleSelect.svelte @@ -1,23 +1,41 @@ {#if name} @@ -25,6 +43,8 @@ {/if}