@zeix/ui-element
Version:
UIElement - a HTML-first library for reactive Web Components
59 lines (54 loc) • 1.16 kB
text/typescript
import {
type Component,
component,
fromDOM,
fromEvents,
getProperty,
setAttribute,
setProperty,
toggleClass,
} from '../../..'
import { manageFocusOnKeydown } from '../../functions/event-listener/manage-focus-on-keydown'
export type FormRadiogroupProps = {
readonly value: string
}
export default component(
'form-radiogroup',
{
value: fromEvents(
'input',
{
change: ({ target }) => target.value,
keyup: ({ event, target }) => {
if (event.key === 'Enter') target.click()
},
},
fromDOM({ 'input:checked': getProperty('value') }, ''),
),
},
(el, { all, useElements }) => {
const radios = useElements('input')
return [
setAttribute('value'),
all('input', [
setProperty('tabIndex', target =>
target.value === el.value ? 0 : -1,
),
...manageFocusOnKeydown(radios, inputs =>
inputs.findIndex(input => input.checked),
),
]),
all('label', [
toggleClass(
'selected',
target => el.value === target.querySelector('input')?.value,
),
]),
]
},
)
declare global {
interface HTMLElementTagNameMap {
'form-radiogroup': Component<FormRadiogroupProps>
}
}