1.7.0 โข Published 5 months ago
react-checkbox-pro v1.7.0
React Checkbox Pro
A fully accessible, customizable React checkbox component with indeterminate state support, keyboard shortcuts, and modern styling.
๐ Demo & Documentation
Features
Core Features
- โจ Modern, lightweight checkbox component
- ๐ Controlled & Uncontrolled modes support
- ๐ฅ Checkbox group for managing multiple selections
- ๐ฏ Indeterminate state support
- โจ๏ธ Full keyboard navigation and shortcuts
- ๐จ CSS-in-JS with Tailwind variants
Styling & Customization
- ๐ญ Custom icons support
- ๐ผ๏ธ Built-in check and indeterminate icons
- ๐จ Multiple built-in color variants
- Default, Primary, Secondary, Success, Warning, Danger
- ๐ Four size variants (xs, sm, md, lg)
- ๐ฒ Configurable border radius
- ๐ Flexible label placement (left, right, top, bottom)
- ๐ Works with both Tailwind CSS and custom CSS
- ๐ฏ Custom styles without breaking accessibility
- ๐ช Compound variants support
Accessibility & UX
- โฟ๏ธ WAI-ARIA 1.2 compliant
- ๐ Screen reader friendly
- ๐ฏ Focus management and indicators
- ๐ฌ Support for helper text and error messages
- ๐ฑ Responsive and touch-friendly
- ๐ฑ๏ธ Click area optimization
- ๐ Smooth transitions
Developer Experience
- ๐ Written in TypeScript with full type definitions
- ๐โโ๏ธ Tree-shakeable and optimized bundle
- ๐ Comprehensive documentation and examples
- ๐งช Reliable with proper error handling
- ๐ง Easy to integrate and customize
- ๐ Zero external runtime dependencies
- ๐ฆ Small bundle size
- ๐ Source maps included
Advanced Features
- ๐ Keyboard shortcuts customization
- ๐๏ธ Form integration support
- ๐ Async state management
- ๐จ Theme customization support
- ๐ Disabled and readonly states
- ๐ Group selection management
- ๐ฏ Compound variants for complex styling
- ๐จ CSS variables support
- ๐ State persistence options
- ๐จ Custom styles without breaking accessibility
Installation
npm install react-checkbox-pro
# or
yarn add react-checkbox-pro
# or
pnpm add react-checkbox-pro
Usage
Add the plugin to your tailwind.config.js
:
module.exports = {
content: [
"./src/**/*.{js,ts,jsx,tsx}",
"./node_modules/@shakibdshy/tailwind-theme/dist/**/*.{js,ts,jsx,tsx,mdx}",
],
plugins: [
require('@shakibdshy/tailwind-theme')
],
}
Quick Start
import { Checkbox } from 'react-checkbox-pro';
function App() {
return (
<Checkbox defaultChecked>
Click me
</Checkbox>
);
}
Color Variants
<Checkbox color="default">Default</Checkbox>
<Checkbox color="primary">Primary</Checkbox>
<Checkbox color="secondary">Secondary</Checkbox>
<Checkbox color="success">Success</Checkbox>
<Checkbox color="warning">Warning</Checkbox>
<Checkbox color="danger">Danger</Checkbox>
Size Variants
<Checkbox size="xs">Extra Small</Checkbox>
<Checkbox size="sm">Small</Checkbox>
<Checkbox size="md">Medium</Checkbox>
<Checkbox size="lg">Large</Checkbox>
Label Placement
<Checkbox labelPlacement="left">Left Label</Checkbox>
<Checkbox labelPlacement="right">Right Label</Checkbox>
<Checkbox labelPlacement="top">Top Label</Checkbox>
<Checkbox labelPlacement="bottom">Bottom Label</Checkbox>
With Error State
<Checkbox
error={true}
errorMessage="This field is required"
required
>
Accept terms and conditions
</Checkbox>
Controlled and Uncontrolled
// Controlled
const [checked, setChecked] = useState(false);
<Checkbox
checked={checked}
onChange={setChecked}
helperText="Optional helper text"
>
Accept terms and conditions
</Checkbox>
// Uncontrolled
<Checkbox
defaultChecked
onChange={(checked) => console.log(checked)}
>
Remember me
</Checkbox>
With Keyboard Shortcuts
<Checkbox
shortcut="ctrl+1"
onShortcut={() => console.log('Shortcut triggered')}
>
Toggle with Ctrl+1
</Checkbox>
Checkbox Group
function App() {
const [selected, setSelected] = useState(['apple']);
return (
<CheckboxGroup
value={selected}
onChange={setSelected}
orientation="vertical"
>
<Checkbox value="apple">Apple</Checkbox>
<Checkbox value="banana">Banana</Checkbox>
<Checkbox value="orange">Orange</Checkbox>
</CheckboxGroup>
);
}
Indeterminate State Example
function TodoList() {
const [todos, setTodos] = useState([
{ id: 1, title: "Task 1", completed: false },
{ id: 2, title: "Task 2", completed: false },
]);
const allSelected = todos.every((todo) => todo.completed);
const someSelected = todos.some((todo) => todo.completed);
const isIndeterminate = someSelected && !allSelected;
const handleParentChange = (checked) => {
setTodos((prev) => prev.map((todo) => ({
...todo,
completed: checked,
})));
};
return (
<div>
<Checkbox
checked={allSelected}
indeterminate={isIndeterminate}
onChange={handleParentChange}
>
Select All
</Checkbox>
{todos.map((todo) => (
<Checkbox
key={todo.id}
checked={todo.completed}
onChange={(checked) => handleTodoChange(todo.id, checked)}
>
{todo.title}
</Checkbox>
))}
</div>
);
}
Custom Icons
import { CircleIcon, CheckIcon } from './icons';
<Checkbox
icon={<CircleIcon />}
checkedIcon={<CheckIcon />}
>
Custom Icons
</Checkbox>
Props
Checkbox Props
Prop | Type | Default | Description |
---|---|---|---|
checked | boolean | undefined | Controlled checked state |
defaultChecked | boolean | false | Default checked state for uncontrolled component |
onChange | (checked: boolean) => void | (event: ChangeEvent) => void | undefined | Change handler |
disabled | boolean | false | Whether the checkbox is disabled |
required | boolean | false | Whether the checkbox is required |
error | boolean | false | Whether to show error state |
errorMessage | string | undefined | Error message to display |
helperText | string | undefined | Helper text to display |
indeterminate | boolean | false | Whether to show indeterminate state |
size | 'xs' \| 'sm' \| 'md' \| 'lg' | 'md' | Size of the checkbox |
color | 'default' \| 'primary' \| 'secondary' \| 'success' \| 'warning' \| 'danger' | 'primary' | Color variant |
radius | 'none' \| 'sm' \| 'md' \| 'lg' \| 'full' | 'md' | Border radius variant |
labelPlacement | 'left' \| 'right' \| 'top' \| 'bottom' | 'right' | Label placement |
icon | ReactNode | undefined | Custom unchecked icon |
checkedIcon | ReactNode | undefined | Custom checked icon |
shortcut | string | undefined | Keyboard shortcut (e.g., 'ctrl+1') |
onShortcut | () => void | undefined | Shortcut callback |
CheckboxGroup Props
Prop | Type | Default | Description |
---|---|---|---|
value | string[] | undefined | Controlled selected values |
defaultValue | string[] | [] | Default selected values |
onChange | (values: string[]) => void | undefined | Change handler |
disabled | boolean | false | Disable all checkboxes in group |
orientation | 'horizontal' \| 'vertical' | 'vertical' | Layout orientation |
spacing | 'sm' \| 'md' \| 'lg' | 'md' | Space between checkboxes |
labelPlacement | 'left' \| 'right' \| 'top' \| 'bottom' | 'right' | Label placement for all checkboxes |
Accessibility
The component is built with accessibility in mind and follows WAI-ARIA guidelines:
- Proper ARIA attributes (
aria-checked
,aria-invalid
, etc.) - Keyboard navigation support
- Screen reader friendly
- Clear focus indicators
- Proper labeling and descriptions
Contributing
We welcome contributions! Please see our Contributing Guide for details.
License
MIT ยฉ Md Habibur Rahman