Security News
Input Validation Vulnerabilities Dominate MITRE's 2024 CWE Top 25 List
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
@solid-aria/checkbox
Advanced tools
Primitives for building accessible checkbox and checkbox group component.
Checkboxes allow users to select multiple items from a list of individual items, or to mark one individual item as selected.
npm install @solid-aria/checkbox
# or
yarn add @solid-aria/checkbox
# or
pnpm add @solid-aria/checkbox
createCheckbox
Provides the behavior and accessibility implementation for a checkbox component.
Checkboxes can be built with the <input>
HTML element, but this can be difficult to style. createCheckbox
helps achieve accessible checkboxes that can be styled as needed.
<input>
element, which can be optionally visually hidden to allow custom stylingimport { AriaCheckboxProps, createCheckbox } from "@solid-aria/checkbox";
function Checkbox(props: AriaCheckboxProps) {
let ref: HTMLInputElement | undefined;
const { inputProps, state } = createCheckbox(props, () => ref);
return (
<label>
<input {...inputProps} ref={ref} />
<span>{props.children}</span>
</label>
);
}
function App() {
return (
<div>
<Checkbox>Checkbox</Checkbox>
<Checkbox isIndeterminate>Checkbox</Checkbox>
</div>
);
}
To build a custom styled checkbox, you can make the native input element visually hidden. This is possible using the createVisuallyHidden
primitive. It is still in the DOM and accessible to assistive technology, but invisible. This example uses SVG to build the visual checkbox, which is hidden from screen readers with aria-hidden.
For keyboard accessibility, a focus ring is important to indicate which element has keyboard focus. This is implemented with the createFocusRing
primitive. When isFocusVisible
is true, an extra SVG element is rendered to indicate focus. The focus ring is only visible when the user is interacting with a keyboard, not with a mouse or touch.
import { AriaCheckboxProps, createCheckbox } from "@solid-aria/checkbox";
import { createFocusRing } from "@solid-aria/focus";
import { createVisuallyHidden } from "@solid-aria/visually-hidden";
import { Show } from "solid-js/web";
function Checkbox(props: AriaCheckboxProps) {
let ref: HTMLInputElement | undefined;
const { inputProps, state } = createCheckbox(props, () => ref);
const { isFocusVisible, focusProps } = createFocusRing();
const { visuallyHiddenProps } = createVisuallyHidden();
return (
<label style={{ display: "flex", "align-items": "center" }}>
<div {...visuallyHiddenProps}>
<input {...inputProps} {...focusProps} ref={ref} />
</div>
<svg width={24} height={24} aria-hidden="true" style={{ "margin-right": "4px" }}>
<rect
x={state.isSelected() ? 4 : 5}
y={state.isSelected() ? 4 : 5}
width={state.isSelected() ? 16 : 14}
height={state.isSelected() ? 16 : 14}
fill={state.isSelected() ? "orange" : "none"}
stroke={state.isSelected() ? "none" : "gray"}
stroke-width={2}
/>
<Show when={state.isSelected()}>
<path
transform="translate(7 7)"
d={`M3.788 9A.999.999 0 0 1 3 8.615l-2.288-3a1 1 0 1 1
1.576-1.23l1.5 1.991 3.924-4.991a1 1 0 1 1 1.576 1.23l-4.712
6A.999.999 0 0 1 3.788 9z`}
/>
</Show>
<Show when={isFocusVisible()}>
<rect x={1} y={1} width={22} height={22} fill="none" stroke="orange" stroke-width={2} />
</Show>
</svg>
{props.children}
</label>
);
}
function App() {
return <Checkbox>Checkbox</Checkbox>;
}
In right-to-left languages, the checkbox should be mirrored. Ensure that your CSS accounts for this.
Checkbox groups allow users to select multiple items from a list of options.
createCheckboxGroup
and createCheckboxGroupItem
Provides the behavior and accessibility implementation for a checkbox group component.
Checkbox groups can be built in HTML with the <fieldset>
and <input>
elements, however these can be difficult to style. createCheckboxGroup
and createCheckboxGroupItem
help achieve accessible checkbox groups that can be styled as needed.
<input>
element, which can be optionally visually hidden to allow custom stylingThis example uses native input elements for the checkboxes, and SolidJS context to share state from the group to each checkbox. An HTML <label>
element wraps the native input and the text to provide an implicit label for the checkbox.
import {
AriaCheckboxGroupItemProps,
AriaCheckboxGroupProps,
createCheckboxGroup,
createCheckboxGroupItem
} from "@solid-aria/checkbox";
function CheckboxGroup(props: AriaCheckboxGroupProps) {
const { CheckboxGroupProvider, groupProps, labelProps, state } = createCheckboxGroup(props);
return (
<div {...groupProps}>
<span {...labelProps}>{props.label}</span>
<CheckboxGroupProvider>{props.children}</CheckboxGroupProvider>
</div>
);
}
function Checkbox(props: AriaCheckboxGroupItemProps) {
let ref: HTMLInputElement | undefined;
const { inputProps, state } = createCheckboxGroupItem(props, () => ref);
const isDisabled = () => state.isDisabled() || props.isDisabled;
const isSelected = () => state.isSelected(props.value);
return (
<label
style={{
display: "block",
color: (isDisabled() && "gray") || (isSelected() && "dodgerblue")
}}
>
<input {...inputProps} ref={ref} />
{props.children}
</label>
);
}
function App() {
return (
<CheckboxGroup label="Favorite sports">
<Checkbox value="soccer" isDisabled>
Soccer
</Checkbox>
<Checkbox value="baseball">Baseball</Checkbox>
<Checkbox value="basketball">Basketball</Checkbox>
</CheckboxGroup>
);
}
All notable changes are described in the CHANGELOG.md file.
FAQs
Primitives for building accessible checkbox and checkbox group component.
The npm package @solid-aria/checkbox receives a total of 846 weekly downloads. As such, @solid-aria/checkbox popularity was classified as not popular.
We found that @solid-aria/checkbox demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.
Research
Security News
A threat actor's playbook for exploiting the npm ecosystem was exposed on the dark web, detailing how to build a blockchain-powered botnet.