Check List
A checklist is a semantic list container for checklist items, allowing users to track and manage tasks, options, or steps by marking items as completed or pending. Typically displayed as a list of actionable items, each with a checkbox that users can tick off as they progress, checklists are commonly used in to-do lists, forms, or onboarding processes.
The component renders a <ul> with role="list" and delegates item rendering to consumers, who provide <li> elements with checkboxes or other interactive controls. This headless approach lets consumers define all visual feedback such as checkmarks, color changes, or progress indicators through their own CSS.
Example
Show demo markup
<ol class="check-list"><li class="check-list-item"><label><input type="checkbox" /> Task 1</label></li><li class="check-list-item"><label><input type="checkbox" checked /> Task 2</label></li></ol>
Usage example
<script lang="ts">
import CheckList from "./CheckList.svelte";
import CheckListItem from "../CheckListItem/CheckListItem.svelte";
</script>
<CheckList label="Onboarding tasks">
<CheckListItem checked>Create account</CheckListItem>
<CheckListItem>Set up profile</CheckListItem>
<CheckListItem>Invite team members</CheckListItem>
</CheckList>
Show Svelte source
// In your Svelte component:
import CheckList from "lily-design-system-svelte-headless/components/CheckList/CheckList.svelte";
<CheckList>
<!-- list children -->
</CheckList>
Usage
Onboarding checklist with CheckListItem children:
<CheckList label="Onboarding tasks">
<CheckListItem checked={accountCreated}>Create account</CheckListItem>
<CheckListItem checked={profileSetUp}>Set up profile</CheckListItem>
<CheckListItem>Invite team members</CheckListItem>
</CheckList>
Packing list with completed and pending items:
<CheckList label="Packing list">
<CheckListItem checked={true}>Passport</CheckListItem>
<CheckListItem checked={true}>Boarding pass</CheckListItem>
<CheckListItem>Charger</CheckListItem>
<CheckListItem>Headphones</CheckListItem>
</CheckList>
Props
label: string (default: undefined) -- accessible name for the checklist via aria-label
children: slot (required) -- list items to render inside the <ul>
Keyboard Interactions
None -- this component is a passive container. Keyboard interactions are determined by the consumer-provided child elements (e.g., checkboxes respond to Space).
ARIA
role="list" -- explicit list role on the <ul> ensures assistive technologies treat it as a list
aria-label -- optional accessible name describing the purpose of the checklist
When to Use
- Use for a list of items with checkboxes for tracking completion.
- Use for simple checklists without linked task pages, such as to-do lists or onboarding flows.
- Use when users need to see progress through a series of actionable items.
- Use for packing lists, grocery lists, or pre-flight safety checks.
When Not to Use
- Do not use for complex multi-session task tracking -- use TaskList instead.
- Do not use for boolean form selections that require submission -- use CheckboxGroup instead.
- Do not use for non-actionable informational lists -- use a standard
<ul> or ContentsList instead.
Headless
This headless CheckList component provides a semantic <ul> with explicit role="list" and optional aria-label for accessible identification. The consumer provides all visual styling including checkmark indicators, strikethrough effects, progress visualization, spacing, and color changes for completed items.
Styles
The consumer provides all CSS styling. The component renders with a .check-list class for targeting. No default styles are included — this is a fully headless component.
Testing
- Verify the component renders a
<ol> element with class check-list
- Verify role="list"
-- explicit list role on the <ul>` ensures assistive technologies treat it as a list
- Verify aria-label` -- optional accessible name describing the purpose of the checklist
- Verify pass-through attributes are applied
Advice
- Designers: Provide clear visual distinction between completed and pending items, such as strikethrough text or a filled checkmark. Show overall progress when appropriate.
- Developers: Use CheckListItem components as children. Manage checkbox state externally and pass it to each item for consistent state tracking.
Implementation Notes
- Renders a semantic
<ul> element with explicit role="list" to ensure list semantics are preserved across screen readers
- Supports an optional
aria-label for an accessible name describing the checklist purpose
- Consumers provide
<li> children with checkboxes or other controls
- Spreads
restProps for consumer customization
Composition
CheckList follows the List/ListItem composition pattern. Use CheckList as the container with CheckListItem components as children. Each CheckListItem renders as an <li> and should contain a checkbox input and label. The CheckList manages the accessible list semantics while each CheckListItem manages its own item semantics.
Related components
check-list-item — one check list item component with a checkbox
References
- WAI-ARIA Listbox Pattern: https://www.w3.org/WAI/ARIA/apg/patterns/listbox/
Canonical contract
Generated from this component's canonical metadata — the machine-checked source the implementations are held to.
Metadata
- Component: check-list
- PascalCase: CheckList
- Description: an ordered list of check list item components
- Status: stable — exercised in composed page flows under e2e and axe, beyond the per-component checks
- HTML tag: <ol>
- CSS class: .check-list
- Interactive: no
ARIA
role="list" -- explicit list role on the <ul> ensures assistive technologies treat it as a list aria-label -- optional accessible name describing the purpose of the checklist
Keyboard
- No keyboard interactions — this is a passive element
Props
label: string (default: undefined) -- accessible name for the checklist via aria-label children: slot (required) -- list items to render inside the <ul>