toggle group: improve ref binding

This commit is contained in:
Elijah Duffy
2025-07-10 18:27:03 -07:00
parent db6c2cf4de
commit b675f01c95

View File

@@ -26,12 +26,7 @@
}: Props = $props(); }: Props = $props();
const id = $derived(generateIdentifier('toggle-group', name)); const id = $derived(generateIdentifier('toggle-group', name));
const refs: ToggleSelect[] = $state([]);
const extended: { detail: Option; ref?: ToggleSelect }[] = $derived.by(() => {
return options.map((opt) => ({
detail: opt
}));
});
let inputElement: HTMLInputElement | undefined = $state<HTMLInputElement>(); let inputElement: HTMLInputElement | undefined = $state<HTMLInputElement>();
let valid: boolean = $state(true); let valid: boolean = $state(true);
@@ -68,18 +63,18 @@
/> />
{/if} {/if}
{#each extended as opt, i (getValue(opt.detail))} {#each options as opt, i (getValue(opt))}
<ToggleSelect <ToggleSelect
bind:this={extended[i].ref} bind:this={refs[i]}
ontoggle={makeSelectedHandler(getValue(opt.detail))} ontoggle={makeSelectedHandler(getValue(opt))}
onkeydown={(e) => { onkeydown={(e) => {
if (e.key === 'ArrowRight' || e.key === 'ArrowDown') { if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {
if (i < extended.length - 1) { if (i < options.length - 1) {
extended[i + 1].ref?.focus(); refs[i + 1]?.focus();
} }
} else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {
if (i > 0) { if (i > 0) {
extended[i - 1].ref?.focus(); refs[i - 1]?.focus();
} }
} else { } else {
return; return;
@@ -87,7 +82,7 @@
e.preventDefault(); e.preventDefault();
}} }}
> >
<span class={[typeof opt === 'string' && 'capitalize']}>{getLabel(opt.detail)}</span> <span class={[typeof opt === 'string' && 'capitalize']}>{getLabel(opt)}</span>
</ToggleSelect> </ToggleSelect>
{/each} {/each}
</div> </div>