toggle group: improve ref binding
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user