@bento/checkbox 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +297 -0
- package/README.mdx +41 -40
- package/dist/index.cjs +32 -55
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -22
- package/dist/index.d.ts +7 -22
- package/dist/index.js +32 -55
- package/dist/index.js.map +1 -1
- package/package.json +8 -6
- package/src/checkbox-group.tsx +29 -53
- package/src/checkbox.tsx +25 -43
package/README.md
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Meta,
|
|
3
|
+
ArgTypes,
|
|
4
|
+
Story,
|
|
5
|
+
Controls,
|
|
6
|
+
Source,
|
|
7
|
+
} from '@storybook/addon-docs/blocks';
|
|
8
|
+
|
|
9
|
+
# Checkbox
|
|
10
|
+
|
|
11
|
+
The `@bento/checkbox` package provides accessible and customizable checkbox inputs. It exports the **CheckboxGroup** and **Checkbox** primitives, enabling you to build individual or groups of checkboxes with consistent keyboard navigation, focus management, and ARIA support. React Aria is used to ensure that the checkboxes are accessible to all users.
|
|
12
|
+
|
|
13
|
+
The `CheckboxGroup` allows a user to select multiple items from a list of `Checkbox` components.
|
|
14
|
+
|
|
15
|
+
The `Checkbox` is a single checkbox option that can be selected by the user.
|
|
16
|
+
|
|
17
|
+
# Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install --save @bento/checkbox
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Props
|
|
24
|
+
|
|
25
|
+
The following properties are available to be used on the `CheckboxGroup` and `Checkbox` primitives:
|
|
26
|
+
|
|
27
|
+
### Checkbox
|
|
28
|
+
|
|
29
|
+
| Prop | Type | Required | Description |
|
|
30
|
+
|------|------|----------|------------|
|
|
31
|
+
| `value` | `string` | No | The value of the checkbox, used when submitting an HTML form. |
|
|
32
|
+
| `name` | `string` | No | The name of the checkbox. |
|
|
33
|
+
| `inputRef` | `Ref<HTMLInputElement>` | No | A ref for the HTML input element. |
|
|
34
|
+
| `children` | `ReactNode` | No | The label for the checkbox. Accepts any renderable node. |
|
|
35
|
+
| `isRequired` | `boolean` | No | Whether the checkbox is required or not. |
|
|
36
|
+
| `isReadOnly` | `boolean` | No | Whether the input can be selected but not changed by the user. |
|
|
37
|
+
| `isDisabled` | `boolean` | No | Whether the checkbox is disabled or not. Shows that a selection exists,
|
|
38
|
+
but is not available in that circumstance. |
|
|
39
|
+
| `autoFocus` | `boolean` | No | Whether the element should receive focus on render. |
|
|
40
|
+
| `isIndeterminate` | `boolean` | No | Whether the checkbox is in an indeterminate state. |
|
|
41
|
+
| `isSelected` | `boolean` | No | Whether the checkbox is in a selected state. |
|
|
42
|
+
| `slot` | `string` | No | A named part of a component that can be customized. This is implemented by the consuming component.
|
|
43
|
+
The exposed slot names of a component are available in the components documentation. |
|
|
44
|
+
| `slots` | `Record<string, object \| Function>` | No | An object that contains the customizations for the slots.
|
|
45
|
+
The main way you interact with the slot system as a consumer. |
|
|
46
|
+
| `ref` | `Ref<HTMLDivElement> \| LegacyRef<Component<CheckboxProps & Slots, any, any>>` | No | Allows getting a ref to the component instance.
|
|
47
|
+
Once the component unmounts, React will set `ref.current` to `null`
|
|
48
|
+
(or call the ref with `null` if you passed a callback ref).
|
|
49
|
+
@see {@link https://react.dev/learn/referencing-values-with-refs#refs-and-the-dom React Docs} |
|
|
50
|
+
| `as` | `"div"` | No | |
|
|
51
|
+
|
|
52
|
+
### CheckboxGroup
|
|
53
|
+
|
|
54
|
+
| Prop | Type | Required | Description |
|
|
55
|
+
|------|------|----------|------------|
|
|
56
|
+
| `value` | `string[]` | No | The current value of the checkbox group (controlled). |
|
|
57
|
+
| `defaultValue` | `string[]` | No | The default value of the checkbox group (uncontrolled). |
|
|
58
|
+
| `isDisabled` | `boolean` | No | Whether the input is disabled. |
|
|
59
|
+
| `isReadOnly` | `boolean` | No | Whether the input can be selected but not changed by the user. |
|
|
60
|
+
| `isRequired` | `boolean` | No | Whether user input is required on the input before form submission. |
|
|
61
|
+
| `isInvalid` | `boolean` | No | Whether the input value is invalid. |
|
|
62
|
+
| `name` | `string` | No | The name of the input element, used when submitting an HTML form. |
|
|
63
|
+
| `form` | `string` | No | The `<form>` element to associate the input with.
|
|
64
|
+
The value of this attribute must be the id of a `<form>` in the same document. |
|
|
65
|
+
| `children` | `ReactNode` | No | Checkbox children. |
|
|
66
|
+
| `slot` | `string` | No | A named part of a component that can be customized. This is implemented by the consuming component.
|
|
67
|
+
The exposed slot names of a component are available in the components documentation. |
|
|
68
|
+
| `slots` | `Record<string, object \| Function>` | No | An object that contains the customizations for the slots.
|
|
69
|
+
The main way you interact with the slot system as a consumer. |
|
|
70
|
+
| `ref` | `Ref<HTMLDivElement> \| LegacyRef<Component<CheckboxGroupProps & Slots, any, any>>` | No | Allows getting a ref to the component instance.
|
|
71
|
+
Once the component unmounts, React will set `ref.current` to `null`
|
|
72
|
+
(or call the ref with `null` if you passed a callback ref).
|
|
73
|
+
@see {@link https://react.dev/learn/referencing-values-with-refs#refs-and-the-dom React Docs} |
|
|
74
|
+
| `as` | `"div"` | No | |
|
|
75
|
+
|
|
76
|
+
## Data Attributes, Slot Map and Props
|
|
77
|
+
|
|
78
|
+
### Data Attributes
|
|
79
|
+
|
|
80
|
+
The following data attributes can be used to style and customize the `CheckboxGroup` and `Checkbox` primitives.
|
|
81
|
+
|
|
82
|
+
#### `CheckboxGroup` Data Attributes
|
|
83
|
+
|
|
84
|
+
| Attribute | Description | Example Values |
|
|
85
|
+
| ---------------- | ---------------------------------------- | -------------- |
|
|
86
|
+
| `data-disabled` | Indicates the checkbox group is disabled | "true" |
|
|
87
|
+
| `data-readonly` | Indicates the checkbox group is readonly | "true" |
|
|
88
|
+
| `data-required` | Indicates the checkbox group is required | "true" |
|
|
89
|
+
| `data-invalid` | Indicates the checkbox group is invalid | "true" |
|
|
90
|
+
|
|
91
|
+
#### `Checkbox` Data Attributes
|
|
92
|
+
|
|
93
|
+
| Attribute | Description | Example Values |
|
|
94
|
+
| -------------------- | --------------------------------------------------- | -------------- |
|
|
95
|
+
| `data-disabled` | Indicates the checkbox is disabled | "true" |
|
|
96
|
+
| `data-readonly` | Indicates the checkbox is readonly | "true" |
|
|
97
|
+
| `data-required` | Indicates the checkbox is required | "true" |
|
|
98
|
+
| `data-invalid` | Indicates the checkbox is invalid | "true" |
|
|
99
|
+
| `data-indeterminate` | Indicates the checkbox is in an indeterminate state | "true" |
|
|
100
|
+
| `data-pressed` | Indicates the checkbox is being pressed | "true" |
|
|
101
|
+
| `data-hovered` | Indicates the checkbox is hovered | "true" |
|
|
102
|
+
| `data-focused` | Indicates the checkbox has focus | "true" |
|
|
103
|
+
| `data-focus-visible` | Indicates focus should be visible | "true" |
|
|
104
|
+
| `data-selected` | Indicates the checkbox is selected | "true" |
|
|
105
|
+
|
|
106
|
+
### `CheckboxGroup` Slot Map
|
|
107
|
+
|
|
108
|
+
| Slot Name | Description |
|
|
109
|
+
| ------------- | ------------------------------ |
|
|
110
|
+
| `label` | Label for checkbox group |
|
|
111
|
+
| `description` | Description for checkbox group |
|
|
112
|
+
| `error` | Error for checkbox group |
|
|
113
|
+
|
|
114
|
+
### `Checkbox` Slot Map
|
|
115
|
+
|
|
116
|
+
| Slot Name | Description |
|
|
117
|
+
| -------------------- | ------------------------------- |
|
|
118
|
+
| `icon-checked` | Icon for checked checkbox |
|
|
119
|
+
| `icon-unchecked` | Icon for unchecked checkbox |
|
|
120
|
+
| `icon-indeterminate` | Icon for indeterminate checkbox |
|
|
121
|
+
|
|
122
|
+
## Examples
|
|
123
|
+
|
|
124
|
+
### Default Checkbox - Uncontrolled
|
|
125
|
+
|
|
126
|
+
The `Checkbox` primitive is uncontrolled by default, meaning it manages its own state internally. You can also use it in a controlled manner by providing the `checked` and `onChange` props.
|
|
127
|
+
|
|
128
|
+
```tsx
|
|
129
|
+
/* v8 ignore next */
|
|
130
|
+
import React from 'react';
|
|
131
|
+
import { Checkbox } from '@bento/checkbox';
|
|
132
|
+
|
|
133
|
+
export function CheckboxExample(args: React.ComponentProps<typeof Checkbox>) {
|
|
134
|
+
return (
|
|
135
|
+
<Checkbox name="checkbox-example" value="checkbox-value" {...args}>
|
|
136
|
+
Checkbox Label
|
|
137
|
+
</Checkbox>
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Controlled Checkbox
|
|
143
|
+
|
|
144
|
+
The `Checkbox` can also be used in a controlled manner, where you manage its state externally with the `checked` and `onChange` props.
|
|
145
|
+
|
|
146
|
+
```tsx
|
|
147
|
+
/* v8 ignore next */
|
|
148
|
+
import React, { useState } from 'react';
|
|
149
|
+
import { Checkbox } from '@bento/checkbox';
|
|
150
|
+
|
|
151
|
+
export function CheckboxControlledExample() {
|
|
152
|
+
const [checked, setChecked] = useState(false);
|
|
153
|
+
|
|
154
|
+
return (
|
|
155
|
+
<Checkbox
|
|
156
|
+
name="checkbox-controlled-example"
|
|
157
|
+
value="checkbox-controlled-value"
|
|
158
|
+
isSelected={checked}
|
|
159
|
+
onChange={setChecked}
|
|
160
|
+
>
|
|
161
|
+
Controlled Checkbox
|
|
162
|
+
</Checkbox>
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Checkbox Group
|
|
168
|
+
|
|
169
|
+
The `CheckboxGroup` allows a user to select multiple items from a list of `Checkbox` components.
|
|
170
|
+
|
|
171
|
+
```tsx
|
|
172
|
+
/* v8 ignore next */
|
|
173
|
+
import React from 'react';
|
|
174
|
+
import { Checkbox, CheckboxGroup } from '@bento/checkbox';
|
|
175
|
+
import { Text } from '@bento/text';
|
|
176
|
+
import { FieldError } from '@bento/field-error';
|
|
177
|
+
|
|
178
|
+
export function CheckboxGroupExample(args: React.ComponentProps<typeof CheckboxGroup>) {
|
|
179
|
+
return (
|
|
180
|
+
<CheckboxGroup name="checkbox-group-example" {...args}>
|
|
181
|
+
<Text slot="label">Checkbox Group</Text>
|
|
182
|
+
<Checkbox value="checkbox-1">Checkbox 1</Checkbox>
|
|
183
|
+
<Checkbox value="checkbox-2">Checkbox 2</Checkbox>
|
|
184
|
+
<Text slot="description">Select your options</Text>
|
|
185
|
+
<FieldError slot="error">This is an error message</FieldError>
|
|
186
|
+
</CheckboxGroup>
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Controlled Checkbox Group
|
|
192
|
+
|
|
193
|
+
The `CheckboxGroup` can also be used in a controlled manner, where you manage the state of the checkboxes externally with the `value` and `onChange` props.
|
|
194
|
+
|
|
195
|
+
```tsx
|
|
196
|
+
/* v8 ignore next */
|
|
197
|
+
import React, { useState } from 'react';
|
|
198
|
+
import { Checkbox, CheckboxGroup } from '@bento/checkbox';
|
|
199
|
+
import { Text } from '@bento/text';
|
|
200
|
+
|
|
201
|
+
export function CheckboxGroupControlledExample() {
|
|
202
|
+
const [selectedValues, setSelectedValues] = useState<string[]>([]);
|
|
203
|
+
|
|
204
|
+
return (
|
|
205
|
+
<CheckboxGroup value={selectedValues} onChange={setSelectedValues}>
|
|
206
|
+
<Text slot="label">Checkbox Group</Text>
|
|
207
|
+
<Checkbox value="option1">Option 1</Checkbox>
|
|
208
|
+
<Checkbox value="option2">Option 2</Checkbox>
|
|
209
|
+
<Checkbox value="option3">Option 3</Checkbox>
|
|
210
|
+
</CheckboxGroup>
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Checkbox Group with Indeterminate State
|
|
216
|
+
|
|
217
|
+
The `CheckboxGroup` can also support an indeterminate state, which is useful when some but not all checkboxes are selected. The complex state management shown here is an example of how to handle indeterminate states in a checkbox group in a common way.
|
|
218
|
+
|
|
219
|
+
```tsx
|
|
220
|
+
/* v8 ignore next */
|
|
221
|
+
import React, { useState } from 'react';
|
|
222
|
+
import { Checkbox, CheckboxGroup } from '@bento/checkbox';
|
|
223
|
+
import { Text } from '@bento/text';
|
|
224
|
+
|
|
225
|
+
export function CheckboxGroupIndeterminateExample() {
|
|
226
|
+
const [checkedItems, setCheckedItems] = useState<Set<string>>(new Set());
|
|
227
|
+
|
|
228
|
+
const items = [
|
|
229
|
+
{ id: 'option1', label: 'Option 1' },
|
|
230
|
+
{ id: 'option2', label: 'Option 2' },
|
|
231
|
+
{ id: 'option3', label: 'Option 3' }
|
|
232
|
+
];
|
|
233
|
+
|
|
234
|
+
const allItemIds = items.map(function getItemId(item) {
|
|
235
|
+
return item.id;
|
|
236
|
+
});
|
|
237
|
+
const isAllSelected = checkedItems.size === items.length;
|
|
238
|
+
const isIndeterminate = checkedItems.size > 0 && checkedItems.size < items.length;
|
|
239
|
+
|
|
240
|
+
function handleSelectAll(checked: boolean) {
|
|
241
|
+
if (checked) {
|
|
242
|
+
setCheckedItems(new Set([...allItemIds, 'select-all']));
|
|
243
|
+
} else {
|
|
244
|
+
setCheckedItems(new Set());
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function handleItemChange(itemId: string, checked: boolean) {
|
|
249
|
+
setCheckedItems(function updateCheckedItems(prev) {
|
|
250
|
+
const newSet = new Set(prev);
|
|
251
|
+
if (checked) {
|
|
252
|
+
newSet.add(itemId);
|
|
253
|
+
if (
|
|
254
|
+
allItemIds.every(function checkItemInSet(id) {
|
|
255
|
+
return newSet.has(id);
|
|
256
|
+
})
|
|
257
|
+
) {
|
|
258
|
+
newSet.add('select-all');
|
|
259
|
+
}
|
|
260
|
+
} else {
|
|
261
|
+
newSet.delete(itemId);
|
|
262
|
+
newSet.delete('select-all');
|
|
263
|
+
}
|
|
264
|
+
return newSet;
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return (
|
|
269
|
+
<CheckboxGroup value={Array.from(checkedItems)} data-value={Array.from(checkedItems)}>
|
|
270
|
+
<Text slot="label">Select Items</Text>
|
|
271
|
+
<Checkbox
|
|
272
|
+
name="select-all"
|
|
273
|
+
value="select-all"
|
|
274
|
+
isSelected={isAllSelected}
|
|
275
|
+
isIndeterminate={isIndeterminate}
|
|
276
|
+
onChange={handleSelectAll}
|
|
277
|
+
>
|
|
278
|
+
Select All
|
|
279
|
+
</Checkbox>
|
|
280
|
+
|
|
281
|
+
{items.map((item) => (
|
|
282
|
+
<Checkbox
|
|
283
|
+
key={item.id}
|
|
284
|
+
name={item.id}
|
|
285
|
+
value={item.id}
|
|
286
|
+
isSelected={checkedItems.has(item.id)}
|
|
287
|
+
onChange={function handleItemChangeForItem(checked) {
|
|
288
|
+
return handleItemChange(item.id, checked);
|
|
289
|
+
}}
|
|
290
|
+
>
|
|
291
|
+
{item.label}
|
|
292
|
+
</Checkbox>
|
|
293
|
+
))}
|
|
294
|
+
</CheckboxGroup>
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
```
|
package/README.mdx
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
Meta,
|
|
3
|
+
ArgTypes,
|
|
4
|
+
Story,
|
|
5
|
+
Controls,
|
|
6
|
+
Source,
|
|
7
|
+
} from '@storybook/addon-docs/blocks';
|
|
2
8
|
import * as Stories from './checkbox.stories.tsx';
|
|
3
9
|
import CheckboxControlledExample from './examples/checkbox-controlled.tsx?raw';
|
|
4
10
|
import CheckboxExample from './examples/checkbox.tsx?raw';
|
|
@@ -42,48 +48,43 @@ The following data attributes can be used to style and customize the `CheckboxGr
|
|
|
42
48
|
|
|
43
49
|
#### `CheckboxGroup` Data Attributes
|
|
44
50
|
|
|
45
|
-
| Attribute
|
|
46
|
-
|
|
|
47
|
-
| `data-disabled`
|
|
48
|
-
| `data-
|
|
49
|
-
| `data-required`
|
|
50
|
-
| `data-invalid`
|
|
51
|
+
| Attribute | Description | Example Values |
|
|
52
|
+
| ---------------- | ---------------------------------------- | -------------- |
|
|
53
|
+
| `data-disabled` | Indicates the checkbox group is disabled | "true" |
|
|
54
|
+
| `data-readonly` | Indicates the checkbox group is readonly | "true" |
|
|
55
|
+
| `data-required` | Indicates the checkbox group is required | "true" |
|
|
56
|
+
| `data-invalid` | Indicates the checkbox group is invalid | "true" |
|
|
51
57
|
|
|
52
58
|
#### `Checkbox` Data Attributes
|
|
53
59
|
|
|
54
|
-
| Attribute
|
|
55
|
-
|
|
|
56
|
-
| `data-disabled`
|
|
57
|
-
| `data-
|
|
58
|
-
| `data-required`
|
|
59
|
-
| `data-invalid`
|
|
60
|
-
| `data-indeterminate` | Indicates the checkbox is in an indeterminate state |
|
|
61
|
-
| `data-pressed` | Indicates the checkbox is being pressed |
|
|
62
|
-
| `data-hovered` | Indicates the checkbox is hovered
|
|
63
|
-
| `data-focused` | Indicates the checkbox has focus
|
|
64
|
-
| `data-focus-visible` | Indicates focus should be visible
|
|
65
|
-
| `data-selected` | Indicates the checkbox is selected
|
|
66
|
-
|
|
67
|
-
### Slot Map
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
|
82
|
-
| --------------- | -------------- |
|
|
83
|
-
| `control.icon-checked` | Icon for checked checkbox |
|
|
84
|
-
| `control.icon-unchecked` | Icon for unchecked checkbox |
|
|
85
|
-
| `control.icon-indeterminate` | Icon for indeterminate checkbox |
|
|
86
|
-
| `control.label` | Text for checkbox |
|
|
60
|
+
| Attribute | Description | Example Values |
|
|
61
|
+
| -------------------- | --------------------------------------------------- | -------------- |
|
|
62
|
+
| `data-disabled` | Indicates the checkbox is disabled | "true" |
|
|
63
|
+
| `data-readonly` | Indicates the checkbox is readonly | "true" |
|
|
64
|
+
| `data-required` | Indicates the checkbox is required | "true" |
|
|
65
|
+
| `data-invalid` | Indicates the checkbox is invalid | "true" |
|
|
66
|
+
| `data-indeterminate` | Indicates the checkbox is in an indeterminate state | "true" |
|
|
67
|
+
| `data-pressed` | Indicates the checkbox is being pressed | "true" |
|
|
68
|
+
| `data-hovered` | Indicates the checkbox is hovered | "true" |
|
|
69
|
+
| `data-focused` | Indicates the checkbox has focus | "true" |
|
|
70
|
+
| `data-focus-visible` | Indicates focus should be visible | "true" |
|
|
71
|
+
| `data-selected` | Indicates the checkbox is selected | "true" |
|
|
72
|
+
|
|
73
|
+
### `CheckboxGroup` Slot Map
|
|
74
|
+
|
|
75
|
+
| Slot Name | Description |
|
|
76
|
+
| ------------- | ------------------------------ |
|
|
77
|
+
| `label` | Label for checkbox group |
|
|
78
|
+
| `description` | Description for checkbox group |
|
|
79
|
+
| `error` | Error for checkbox group |
|
|
80
|
+
|
|
81
|
+
### `Checkbox` Slot Map
|
|
82
|
+
|
|
83
|
+
| Slot Name | Description |
|
|
84
|
+
| -------------------- | ------------------------------- |
|
|
85
|
+
| `icon-checked` | Icon for checked checkbox |
|
|
86
|
+
| `icon-unchecked` | Icon for unchecked checkbox |
|
|
87
|
+
| `icon-indeterminate` | Icon for indeterminate checkbox |
|
|
87
88
|
|
|
88
89
|
## Examples
|
|
89
90
|
|
package/dist/index.cjs
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var React2 = require('react');
|
|
4
|
-
var
|
|
4
|
+
var container = require('@bento/container');
|
|
5
|
+
var useDataAttributes = require('@bento/use-data-attributes');
|
|
5
6
|
var icon = require('@bento/icon');
|
|
6
7
|
var slots = require('@bento/slots');
|
|
7
8
|
var useProps = require('@bento/use-props');
|
|
8
|
-
var
|
|
9
|
+
var visuallyHidden = require('@bento/visually-hidden');
|
|
9
10
|
var utils = require('@react-aria/utils');
|
|
11
|
+
var reactAria = require('react-aria');
|
|
10
12
|
var reactStately = require('react-stately');
|
|
11
|
-
var useDataAttributes = require('@bento/use-data-attributes');
|
|
12
13
|
|
|
13
14
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
15
|
|
|
@@ -20,17 +21,11 @@ var CheckboxGroupStateContext = React2__default.default.createContext(null);
|
|
|
20
21
|
// src/checkbox.tsx
|
|
21
22
|
var Checkbox = slots.withSlots("BentoCheckbox", function Checkbox2(args) {
|
|
22
23
|
const { props, apply } = useProps.useProps(args);
|
|
23
|
-
const {
|
|
24
|
-
isRequired = false,
|
|
25
|
-
isIndeterminate = false,
|
|
26
|
-
isDisabled: isDisabledProp = false,
|
|
27
|
-
isSelected: isSelectedProp = false,
|
|
28
|
-
isReadOnly: isReadOnlyProp = false
|
|
29
|
-
} = props;
|
|
30
24
|
const groupState = React2.useContext(CheckboxGroupStateContext);
|
|
31
25
|
const ref = React2.useRef(null);
|
|
32
26
|
const inputRef = utils.useObjectRef(React2.useMemo(() => utils.mergeRefs(ref, props.inputRef), [ref, props.inputRef]));
|
|
33
|
-
|
|
27
|
+
const { isFocused, isFocusVisible, focusProps } = reactAria.useFocusRing();
|
|
28
|
+
const { labelProps, inputProps, isSelected, isPressed, isDisabled, isReadOnly, isInvalid } = groupState ? reactAria.useCheckboxGroupItem(
|
|
34
29
|
{
|
|
35
30
|
...props,
|
|
36
31
|
// Value is optional for standalone checkboxes, but required for CheckboxGroup items;
|
|
@@ -39,80 +34,62 @@ var Checkbox = slots.withSlots("BentoCheckbox", function Checkbox2(args) {
|
|
|
39
34
|
},
|
|
40
35
|
groupState,
|
|
41
36
|
inputRef
|
|
42
|
-
) : reactAria.useCheckbox(
|
|
43
|
-
|
|
44
|
-
...props
|
|
45
|
-
},
|
|
46
|
-
reactStately.useToggleState(props),
|
|
47
|
-
inputRef
|
|
48
|
-
);
|
|
49
|
-
const interactionDisabled = isDisabledProp || isDisabled || isReadOnly || isReadOnlyProp;
|
|
37
|
+
) : reactAria.useCheckbox(props, reactStately.useToggleState(props), inputRef);
|
|
38
|
+
const interactionDisabled = props.isDisabled || isDisabled || isReadOnly;
|
|
50
39
|
const { hoverProps, isHovered } = reactAria.useHover({
|
|
51
40
|
...props,
|
|
52
41
|
isDisabled: interactionDisabled
|
|
53
42
|
});
|
|
54
|
-
const { isFocused, isFocusVisible, focusProps } = reactAria.useFocusRing();
|
|
55
43
|
return /* @__PURE__ */ React2__default.default.createElement(
|
|
56
|
-
|
|
44
|
+
container.Container,
|
|
57
45
|
{
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
label: props.children,
|
|
62
|
-
inputRef,
|
|
63
|
-
"aria-checked": isIndeterminate ? "mixed" : void 0,
|
|
64
|
-
...apply(props, ["isReadOnly", "isSelected", "isIndeterminate", "isDisabled", "value", "autoFocus"]),
|
|
46
|
+
as: "label",
|
|
47
|
+
"aria-checked": props.isIndeterminate ? "mixed" : void 0,
|
|
48
|
+
...apply(utils.mergeProps(labelProps, hoverProps)),
|
|
65
49
|
...useDataAttributes.useDataAttributes({
|
|
66
|
-
selected: isSelected
|
|
50
|
+
selected: isSelected,
|
|
67
51
|
pressed: isPressed,
|
|
68
52
|
hovered: isHovered,
|
|
69
53
|
focused: isFocused,
|
|
70
54
|
focusVisible: isFocusVisible,
|
|
71
55
|
disabled: interactionDisabled,
|
|
72
|
-
|
|
56
|
+
readonly: isReadOnly,
|
|
73
57
|
invalid: isInvalid,
|
|
74
|
-
required: isRequired,
|
|
75
|
-
indeterminate: isIndeterminate
|
|
58
|
+
required: props.isRequired,
|
|
59
|
+
indeterminate: props.isIndeterminate
|
|
76
60
|
})
|
|
77
61
|
},
|
|
78
|
-
|
|
62
|
+
/* @__PURE__ */ React2__default.default.createElement(visuallyHidden.VisuallyHidden, null, /* @__PURE__ */ React2__default.default.createElement("input", { ...utils.mergeProps(inputProps, focusProps), ref: inputRef })),
|
|
63
|
+
props.isIndeterminate ? /* @__PURE__ */ React2__default.default.createElement(icon.Icon, { slot: "icon-indeterminate", icon: "checkboxIndeterminate" }, /* @__PURE__ */ React2__default.default.createElement("svg", { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React2__default.default.createElement("rect", { x: "6", y: "11", width: "12", height: "2", fill: "currentColor" }))) : isSelected ? /* @__PURE__ */ React2__default.default.createElement(icon.Icon, { slot: "icon-checked", icon: "checkboxChecked" }, /* @__PURE__ */ React2__default.default.createElement("svg", { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React2__default.default.createElement("path", { d: "M9,16.2L4.8,12l-1.4,1.4L9,19L21,7l-1.4-1.4L9,16.2z", fill: "currentColor" }))) : /* @__PURE__ */ React2__default.default.createElement(icon.Icon, { slot: "icon-unchecked", icon: "checkboxUnchecked" }, /* @__PURE__ */ React2__default.default.createElement("svg", { width: 24, height: 24 }, /* @__PURE__ */ React2__default.default.createElement("rect", { x: 4, y: 4, width: 16, height: 16, rx: 3, fill: "none", stroke: "gray", strokeWidth: 2 }))),
|
|
64
|
+
props.children
|
|
79
65
|
);
|
|
80
66
|
});
|
|
81
67
|
var CheckboxGroup = slots.withSlots("BentoCheckboxGroup", function CheckboxGroup2(args) {
|
|
82
|
-
const {
|
|
83
|
-
const { props, apply } = useProps.useProps(restArgs);
|
|
68
|
+
const { props, apply } = useProps.useProps(args);
|
|
84
69
|
const state = reactStately.useCheckboxGroupState(props);
|
|
85
|
-
const { children } = props;
|
|
86
70
|
const { groupProps, labelProps, descriptionProps, errorMessageProps, ...validationResult } = reactAria.useCheckboxGroup(
|
|
87
|
-
props,
|
|
71
|
+
{ ...props, label: props.label ?? "Checkbox Group", description: props.description ?? "Description" },
|
|
88
72
|
state
|
|
89
73
|
);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return typeof errorMessage === "function" ? errorMessage(validationResult) : errorMessage || validationResult.validationErrors.join(", ");
|
|
93
|
-
},
|
|
94
|
-
[errorMessage, validationResult]
|
|
95
|
-
);
|
|
96
|
-
return /* @__PURE__ */ React2__default.default.createElement(
|
|
97
|
-
control.ControlGroup,
|
|
74
|
+
return /* @__PURE__ */ React2__default.default.createElement(CheckboxGroupStateContext.Provider, { value: state }, /* @__PURE__ */ React2__default.default.createElement(
|
|
75
|
+
container.Container,
|
|
98
76
|
{
|
|
99
|
-
|
|
100
|
-
labelProps,
|
|
101
|
-
descriptionProps,
|
|
102
|
-
errorMessage: displayedErrorMessage,
|
|
103
|
-
errorMessageProps,
|
|
104
|
-
...groupProps,
|
|
105
|
-
...apply(props, ["isInvalid", "isDisabled", "isReadOnly", "isRequired", "validationBehavior"]),
|
|
77
|
+
...apply(groupProps),
|
|
106
78
|
...useDataAttributes.useDataAttributes({
|
|
107
79
|
orientation: props.orientation || "vertical",
|
|
108
80
|
invalid: state.isInvalid,
|
|
109
81
|
disabled: state.isDisabled,
|
|
110
82
|
readonly: state.isReadOnly,
|
|
111
83
|
required: state.isRequired
|
|
112
|
-
})
|
|
84
|
+
}),
|
|
85
|
+
slots: {
|
|
86
|
+
label: labelProps,
|
|
87
|
+
description: descriptionProps,
|
|
88
|
+
error: reactAria.mergeProps(errorMessageProps, validationResult)
|
|
89
|
+
}
|
|
113
90
|
},
|
|
114
|
-
|
|
115
|
-
);
|
|
91
|
+
props.children
|
|
92
|
+
));
|
|
116
93
|
});
|
|
117
94
|
|
|
118
95
|
exports.Checkbox = Checkbox;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/checkbox-group-state.tsx","../src/checkbox.tsx","../src/checkbox-group.tsx"],"names":["React","withSlots","Checkbox","useProps","useContext","useRef","useObjectRef","useMemo","mergeRefs","useCheckboxGroupItem","useCheckbox","useToggleState","useHover","useFocusRing","Control","mergeProps","useDataAttributes","Icon","CheckboxGroup","useCheckboxGroupState","useCheckboxGroup","ControlGroup"],"mappings":"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","file":"index.cjs","sourcesContent":["import React from 'react';\nimport { CheckboxGroupState } from 'react-stately';\n\nexport const CheckboxGroupStateContext = React.createContext<CheckboxGroupState | null>(null);\n","import React, { useContext, useRef, useMemo } from 'react';\nimport { Control, ControlProps } from '@bento/control';\nimport { Icon } from '@bento/icon';\nimport { withSlots } from '@bento/slots';\nimport { useProps } from '@bento/use-props';\nimport { useFocusRing, useHover, type AriaCheckboxProps, useCheckboxGroupItem, useCheckbox } from 'react-aria';\nimport { mergeProps, mergeRefs, useObjectRef } from '@react-aria/utils';\nimport { useToggleState } from 'react-stately';\nimport { useDataAttributes } from '@bento/use-data-attributes';\nimport { CheckboxGroupStateContext } from './checkbox-group-state';\n\nexport interface CheckboxProps extends AriaCheckboxProps, Partial<Omit<ControlProps, keyof AriaCheckboxProps>> {\n /** The value of the checkbox, used when submitting an HTML form. */\n value?: string;\n\n /** The name of the checkbox. */\n name?: string;\n\n /** A ref for the HTML input element. */\n inputRef?: React.Ref<HTMLInputElement>;\n\n /** The label for the checkbox. Accepts any renderable node. */\n children?: React.ReactNode;\n\n /** Whether the checkbox is required or not. */\n isRequired?: boolean;\n\n /** Whether the input can be selected but not changed by the user. */\n isReadOnly?: boolean;\n\n /**\n * Whether the checkbox is disabled or not. Shows that a selection exists,\n * but is not available in that circumstance.\n */\n isDisabled?: boolean;\n\n /** Whether the element should receive focus on render. */\n autoFocus?: boolean;\n\n /** Whether the checkbox is in an indeterminate state. */\n isIndeterminate?: boolean;\n\n /** Whether the checkbox is in a selected state. */\n isSelected?: boolean;\n}\n\n/**\n * The `Checkbox` is a single checkbox option that can be selected by the user.\n *\n * @component\n * @param args - The props {@link CheckboxProps} passed to the Checkbox component.\n *\n * @public\n */\nexport const Checkbox = withSlots('BentoCheckbox', function Checkbox(args: CheckboxProps) {\n const { props, apply } = useProps(args);\n const {\n isRequired = false,\n isIndeterminate = false,\n isDisabled: isDisabledProp = false,\n isSelected: isSelectedProp = false,\n isReadOnly: isReadOnlyProp = false\n } = props;\n\n const groupState = useContext(CheckboxGroupStateContext);\n\n const ref = useRef<HTMLInputElement>(null);\n const inputRef = useObjectRef(useMemo(() => mergeRefs(ref, props.inputRef), [ref, props.inputRef]));\n\n let { labelProps, inputProps, isSelected, isReadOnly, isDisabled, isPressed, isInvalid } = groupState\n ? useCheckboxGroupItem(\n {\n ...props,\n // Value is optional for standalone checkboxes, but required for CheckboxGroup items;\n // it's passed explicitly here to avoid typescript error (requires ignore)(recommendation from React Aria).\n value: (props as Required<Pick<typeof props, 'value'>>).value\n },\n groupState,\n inputRef\n )\n : useCheckbox(\n {\n ...props\n },\n useToggleState(props),\n inputRef\n );\n\n const interactionDisabled = isDisabledProp || isDisabled || isReadOnly || isReadOnlyProp;\n const { hoverProps, isHovered } = useHover({\n ...props,\n isDisabled: interactionDisabled\n });\n const { isFocused, isFocusVisible, focusProps } = useFocusRing();\n\n return (\n <Control\n slot=\"control\"\n labelProps={mergeProps(labelProps, hoverProps)}\n inputProps={mergeProps(inputProps, focusProps)}\n label={props.children}\n inputRef={inputRef}\n aria-checked={isIndeterminate ? 'mixed' : undefined}\n {...apply(props, ['isReadOnly', 'isSelected', 'isIndeterminate', 'isDisabled', 'value', 'autoFocus'])}\n {...useDataAttributes({\n selected: isSelected || isSelectedProp,\n pressed: isPressed,\n hovered: isHovered,\n focused: isFocused,\n focusVisible: isFocusVisible,\n disabled: interactionDisabled,\n readOnly: isReadOnly || isReadOnlyProp,\n invalid: isInvalid,\n required: isRequired,\n indeterminate: isIndeterminate\n })}\n >\n {isIndeterminate ? (\n <Icon slot=\"icon-indeterminate\" icon=\"checkboxIndeterminate\">\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"6\" y=\"11\" width=\"12\" height=\"2\" fill=\"currentColor\" />\n </svg>\n </Icon>\n ) : isSelected ? (\n <Icon slot=\"icon-checked\" icon=\"checkboxChecked\">\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9,16.2L4.8,12l-1.4,1.4L9,19L21,7l-1.4-1.4L9,16.2z\" fill=\"currentColor\" />\n </svg>\n </Icon>\n ) : (\n <Icon slot=\"icon-unchecked\" icon=\"checkboxUnchecked\">\n <svg width={24} height={24} aria-hidden=\"true\">\n <rect x={4} y={4} width={16} height={16} rx={3} fill=\"none\" stroke=\"gray\" strokeWidth={2} />\n </svg>\n </Icon>\n )}\n </Control>\n );\n});\n","import React, { useMemo } from 'react';\nimport { useProps } from '@bento/use-props';\nimport { ControlGroup, ControlGroupProps } from '@bento/control';\nimport { useDataAttributes } from '@bento/use-data-attributes';\nimport { type ValidationResult } from '@react-types/shared';\nimport { AriaCheckboxGroupProps, useCheckboxGroup } from 'react-aria';\nimport { useCheckboxGroupState } from 'react-stately';\nimport { withSlots } from '@bento/slots';\nimport { CheckboxGroupStateContext } from './checkbox-group-state';\n\nexport interface CheckboxGroupProps\n extends AriaCheckboxGroupProps,\n Partial<Omit<ControlGroupProps, keyof AriaCheckboxGroupProps>> {\n /** The current value of the checkbox group (controlled). */\n value?: string[];\n\n /** The default value of the checkbox group (uncontrolled). */\n defaultValue?: string[];\n\n /** Whether the input is disabled. */\n isDisabled?: boolean;\n\n /** Whether the input can be selected but not changed by the user. */\n isReadOnly?: boolean;\n\n /** Whether user input is required on the input before form submission. */\n isRequired?: boolean;\n\n /** Whether the input value is invalid. */\n isInvalid?: boolean;\n\n /** The name of the input element, used when submitting an HTML form. */\n name?: string;\n\n /**\n * The <form> element to associate the input with.\n * The value of this attribute must be the id of a <form> in the same document.\n */\n form?: string;\n\n /** Description for the checkbox group. */\n description?: string;\n\n /** Checkbox children. */\n children?: React.ReactNode;\n\n /** Error message for the checkbox group. */\n errorMessage?: React.ReactNode | ((val: ValidationResult) => React.ReactNode);\n}\n\n/**\n * The `CheckboxGroup` allows a user to select items from a list of `Checkbox` components.\n *\n * @component\n * @param {CheckboxGroupProps} args - The props passed to the CheckboxGroup component.\n *\n * @public\n */\nexport const CheckboxGroup = withSlots('BentoCheckboxGroup', function CheckboxGroup(args: CheckboxGroupProps) {\n const { errorMessage, ...restArgs } = args;\n const { props, apply } = useProps(restArgs);\n const state = useCheckboxGroupState(props);\n const { children } = props;\n const { groupProps, labelProps, descriptionProps, errorMessageProps, ...validationResult } = useCheckboxGroup(\n props,\n state\n );\n\n const displayedErrorMessage = useMemo(\n function getErrorMessage() {\n return typeof errorMessage === 'function'\n ? errorMessage(validationResult)\n : errorMessage || validationResult.validationErrors.join(', ');\n },\n [errorMessage, validationResult]\n );\n\n return (\n <ControlGroup\n slot=\"group\"\n labelProps={labelProps}\n descriptionProps={descriptionProps}\n errorMessage={displayedErrorMessage}\n errorMessageProps={errorMessageProps}\n {...groupProps}\n {...apply(props, ['isInvalid', 'isDisabled', 'isReadOnly', 'isRequired', 'validationBehavior'])}\n {...useDataAttributes({\n orientation: props.orientation || 'vertical',\n invalid: state.isInvalid,\n disabled: state.isDisabled,\n readonly: state.isReadOnly,\n required: state.isRequired\n })}\n >\n <CheckboxGroupStateContext.Provider value={state}>{children}</CheckboxGroupStateContext.Provider>\n </ControlGroup>\n );\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/checkbox-group-state.tsx","../src/checkbox.tsx","../src/checkbox-group.tsx"],"names":["React","withSlots","Checkbox","useProps","useContext","useRef","useObjectRef","useMemo","mergeRefs","useFocusRing","useCheckboxGroupItem","useCheckbox","useToggleState","useHover","Container","mergeProps","useDataAttributes","VisuallyHidden","Icon","CheckboxGroup","useCheckboxGroupState","useCheckboxGroup"],"mappings":"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","file":"index.cjs","sourcesContent":["import React from 'react';\nimport { CheckboxGroupState } from 'react-stately';\n\nexport const CheckboxGroupStateContext = React.createContext<CheckboxGroupState | null>(null);\n","import React, { useContext, useRef, useMemo } from 'react';\nimport { Container, type ContainerProps } from '@bento/container';\nimport { useDataAttributes } from '@bento/use-data-attributes';\nimport { Icon } from '@bento/icon';\nimport { withSlots } from '@bento/slots';\nimport { useProps } from '@bento/use-props';\nimport { VisuallyHidden } from '@bento/visually-hidden';\nimport { mergeProps, mergeRefs, useObjectRef } from '@react-aria/utils';\nimport { useFocusRing, useHover, useCheckbox, useCheckboxGroupItem, type AriaCheckboxProps } from 'react-aria';\nimport { useToggleState } from 'react-stately';\nimport { CheckboxGroupStateContext } from './checkbox-group-state';\n\nexport interface CheckboxProps extends AriaCheckboxProps, Omit<ContainerProps, keyof AriaCheckboxProps> {\n /** The value of the checkbox, used when submitting an HTML form. */\n value?: string;\n\n /** The name of the checkbox. */\n name?: string;\n\n /** A ref for the HTML input element. */\n inputRef?: React.Ref<HTMLInputElement>;\n\n /** The label for the checkbox. Accepts any renderable node. */\n children?: React.ReactNode;\n\n /** Whether the checkbox is required or not. */\n isRequired?: boolean;\n\n /** Whether the input can be selected but not changed by the user. */\n isReadOnly?: boolean;\n\n /**\n * Whether the checkbox is disabled or not. Shows that a selection exists,\n * but is not available in that circumstance.\n */\n isDisabled?: boolean;\n\n /** Whether the element should receive focus on render. */\n autoFocus?: boolean;\n\n /** Whether the checkbox is in an indeterminate state. */\n isIndeterminate?: boolean;\n\n /** Whether the checkbox is in a selected state. */\n isSelected?: boolean;\n}\n\n/**\n * The `Checkbox` is a single checkbox option that can be selected by the user.\n */\nexport const Checkbox = withSlots('BentoCheckbox', function Checkbox(args: CheckboxProps) {\n const { props, apply } = useProps(args);\n const groupState = useContext(CheckboxGroupStateContext);\n const ref = useRef<HTMLInputElement>(null);\n const inputRef = useObjectRef(useMemo(() => mergeRefs(ref, props.inputRef), [ref, props.inputRef]));\n const { isFocused, isFocusVisible, focusProps } = useFocusRing();\n\n const { labelProps, inputProps, isSelected, isPressed, isDisabled, isReadOnly, isInvalid } = groupState\n ? useCheckboxGroupItem(\n {\n ...props,\n // Value is optional for standalone checkboxes, but required for CheckboxGroup items;\n // it's passed explicitly here to avoid typescript error (requires ignore)(recommendation from React Aria).\n value: (props as Required<Pick<typeof props, 'value'>>).value\n },\n groupState,\n inputRef\n )\n : useCheckbox(props, useToggleState(props), inputRef);\n\n const interactionDisabled = props.isDisabled || isDisabled || isReadOnly;\n const { hoverProps, isHovered } = useHover({\n ...props,\n isDisabled: interactionDisabled\n });\n\n return (\n <Container\n as=\"label\"\n aria-checked={props.isIndeterminate ? 'mixed' : undefined}\n {...apply(mergeProps(labelProps, hoverProps))}\n {...useDataAttributes({\n selected: isSelected,\n pressed: isPressed,\n hovered: isHovered,\n focused: isFocused,\n focusVisible: isFocusVisible,\n disabled: interactionDisabled,\n readonly: isReadOnly,\n invalid: isInvalid,\n required: props.isRequired,\n indeterminate: props.isIndeterminate\n })}\n >\n <VisuallyHidden>\n <input {...mergeProps(inputProps, focusProps)} ref={inputRef} />\n </VisuallyHidden>\n\n {props.isIndeterminate ? (\n <Icon slot=\"icon-indeterminate\" icon=\"checkboxIndeterminate\">\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"6\" y=\"11\" width=\"12\" height=\"2\" fill=\"currentColor\" />\n </svg>\n </Icon>\n ) : isSelected ? (\n <Icon slot=\"icon-checked\" icon=\"checkboxChecked\">\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9,16.2L4.8,12l-1.4,1.4L9,19L21,7l-1.4-1.4L9,16.2z\" fill=\"currentColor\" />\n </svg>\n </Icon>\n ) : (\n <Icon slot=\"icon-unchecked\" icon=\"checkboxUnchecked\">\n <svg width={24} height={24}>\n <rect x={4} y={4} width={16} height={16} rx={3} fill=\"none\" stroke=\"gray\" strokeWidth={2} />\n </svg>\n </Icon>\n )}\n {props.children}\n </Container>\n );\n});\n","import React from 'react';\nimport { withSlots } from '@bento/slots';\nimport { Container, type ContainerProps } from '@bento/container';\nimport { useProps } from '@bento/use-props';\nimport { useCheckboxGroup, mergeProps, type AriaCheckboxGroupProps } from 'react-aria';\nimport { useCheckboxGroupState } from 'react-stately';\nimport { CheckboxGroupStateContext } from './checkbox-group-state';\nimport { useDataAttributes } from '@bento/use-data-attributes';\n\nexport interface CheckboxGroupProps extends AriaCheckboxGroupProps, Omit<ContainerProps, keyof AriaCheckboxGroupProps> {\n /** The current value of the checkbox group (controlled). */\n value?: string[];\n\n /** The default value of the checkbox group (uncontrolled). */\n defaultValue?: string[];\n\n /** Whether the input is disabled. */\n isDisabled?: boolean;\n\n /** Whether the input can be selected but not changed by the user. */\n isReadOnly?: boolean;\n\n /** Whether user input is required on the input before form submission. */\n isRequired?: boolean;\n\n /** Whether the input value is invalid. */\n isInvalid?: boolean;\n\n /** The name of the input element, used when submitting an HTML form. */\n name?: string;\n\n /**\n * The `<form>` element to associate the input with.\n * The value of this attribute must be the id of a `<form>` in the same document.\n */\n form?: string;\n\n /** Checkbox children. */\n children?: React.ReactNode;\n}\n\n/**\n * The `CheckboxGroup` allows a user to select items from a list of `Checkbox` components.\n */\nexport const CheckboxGroup = withSlots('BentoCheckboxGroup', function CheckboxGroup(args: CheckboxGroupProps) {\n const { props, apply } = useProps(args);\n const state = useCheckboxGroupState(props);\n const { groupProps, labelProps, descriptionProps, errorMessageProps, ...validationResult } = useCheckboxGroup(\n { ...props, label: props.label ?? 'Checkbox Group', description: props.description ?? 'Description' },\n state\n );\n\n return (\n <CheckboxGroupStateContext.Provider value={state}>\n <Container\n {...apply(groupProps)}\n {...useDataAttributes({\n orientation: props.orientation || 'vertical',\n invalid: state.isInvalid,\n disabled: state.isDisabled,\n readonly: state.isReadOnly,\n required: state.isRequired\n })}\n slots={{\n label: labelProps,\n description: descriptionProps,\n error: mergeProps(errorMessageProps, validationResult)\n }}\n >\n {props.children}\n </Container>\n </CheckboxGroupStateContext.Provider>\n );\n});\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import * as _bento_slots from '@bento/slots';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { ContainerProps } from '@bento/container';
|
|
4
4
|
import { AriaCheckboxProps, AriaCheckboxGroupProps } from 'react-aria';
|
|
5
|
-
import { ValidationResult } from '@react-types/shared';
|
|
6
5
|
|
|
7
|
-
interface CheckboxProps extends AriaCheckboxProps,
|
|
6
|
+
interface CheckboxProps extends AriaCheckboxProps, Omit<ContainerProps, keyof AriaCheckboxProps> {
|
|
8
7
|
/** The value of the checkbox, used when submitting an HTML form. */
|
|
9
8
|
value?: string;
|
|
10
9
|
/** The name of the checkbox. */
|
|
@@ -31,15 +30,10 @@ interface CheckboxProps extends AriaCheckboxProps, Partial<Omit<ControlProps, ke
|
|
|
31
30
|
}
|
|
32
31
|
/**
|
|
33
32
|
* The `Checkbox` is a single checkbox option that can be selected by the user.
|
|
34
|
-
*
|
|
35
|
-
* @component
|
|
36
|
-
* @param args - The props {@link CheckboxProps} passed to the Checkbox component.
|
|
37
|
-
*
|
|
38
|
-
* @public
|
|
39
33
|
*/
|
|
40
|
-
declare const Checkbox: React.
|
|
34
|
+
declare const Checkbox: React.MemoExoticComponent<React.ComponentType<CheckboxProps & _bento_slots.Slots>>;
|
|
41
35
|
|
|
42
|
-
interface CheckboxGroupProps extends AriaCheckboxGroupProps,
|
|
36
|
+
interface CheckboxGroupProps extends AriaCheckboxGroupProps, Omit<ContainerProps, keyof AriaCheckboxGroupProps> {
|
|
43
37
|
/** The current value of the checkbox group (controlled). */
|
|
44
38
|
value?: string[];
|
|
45
39
|
/** The default value of the checkbox group (uncontrolled). */
|
|
@@ -55,25 +49,16 @@ interface CheckboxGroupProps extends AriaCheckboxGroupProps, Partial<Omit<Contro
|
|
|
55
49
|
/** The name of the input element, used when submitting an HTML form. */
|
|
56
50
|
name?: string;
|
|
57
51
|
/**
|
|
58
|
-
* The
|
|
59
|
-
* The value of this attribute must be the id of a
|
|
52
|
+
* The `<form>` element to associate the input with.
|
|
53
|
+
* The value of this attribute must be the id of a `<form>` in the same document.
|
|
60
54
|
*/
|
|
61
55
|
form?: string;
|
|
62
|
-
/** Description for the checkbox group. */
|
|
63
|
-
description?: string;
|
|
64
56
|
/** Checkbox children. */
|
|
65
57
|
children?: React.ReactNode;
|
|
66
|
-
/** Error message for the checkbox group. */
|
|
67
|
-
errorMessage?: React.ReactNode | ((val: ValidationResult) => React.ReactNode);
|
|
68
58
|
}
|
|
69
59
|
/**
|
|
70
60
|
* The `CheckboxGroup` allows a user to select items from a list of `Checkbox` components.
|
|
71
|
-
*
|
|
72
|
-
* @component
|
|
73
|
-
* @param {CheckboxGroupProps} args - The props passed to the CheckboxGroup component.
|
|
74
|
-
*
|
|
75
|
-
* @public
|
|
76
61
|
*/
|
|
77
|
-
declare const CheckboxGroup: React.
|
|
62
|
+
declare const CheckboxGroup: React.MemoExoticComponent<React.ComponentType<CheckboxGroupProps & _bento_slots.Slots>>;
|
|
78
63
|
|
|
79
64
|
export { Checkbox, CheckboxGroup, type CheckboxGroupProps, type CheckboxProps };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import * as _bento_slots from '@bento/slots';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { ContainerProps } from '@bento/container';
|
|
4
4
|
import { AriaCheckboxProps, AriaCheckboxGroupProps } from 'react-aria';
|
|
5
|
-
import { ValidationResult } from '@react-types/shared';
|
|
6
5
|
|
|
7
|
-
interface CheckboxProps extends AriaCheckboxProps,
|
|
6
|
+
interface CheckboxProps extends AriaCheckboxProps, Omit<ContainerProps, keyof AriaCheckboxProps> {
|
|
8
7
|
/** The value of the checkbox, used when submitting an HTML form. */
|
|
9
8
|
value?: string;
|
|
10
9
|
/** The name of the checkbox. */
|
|
@@ -31,15 +30,10 @@ interface CheckboxProps extends AriaCheckboxProps, Partial<Omit<ControlProps, ke
|
|
|
31
30
|
}
|
|
32
31
|
/**
|
|
33
32
|
* The `Checkbox` is a single checkbox option that can be selected by the user.
|
|
34
|
-
*
|
|
35
|
-
* @component
|
|
36
|
-
* @param args - The props {@link CheckboxProps} passed to the Checkbox component.
|
|
37
|
-
*
|
|
38
|
-
* @public
|
|
39
33
|
*/
|
|
40
|
-
declare const Checkbox: React.
|
|
34
|
+
declare const Checkbox: React.MemoExoticComponent<React.ComponentType<CheckboxProps & _bento_slots.Slots>>;
|
|
41
35
|
|
|
42
|
-
interface CheckboxGroupProps extends AriaCheckboxGroupProps,
|
|
36
|
+
interface CheckboxGroupProps extends AriaCheckboxGroupProps, Omit<ContainerProps, keyof AriaCheckboxGroupProps> {
|
|
43
37
|
/** The current value of the checkbox group (controlled). */
|
|
44
38
|
value?: string[];
|
|
45
39
|
/** The default value of the checkbox group (uncontrolled). */
|
|
@@ -55,25 +49,16 @@ interface CheckboxGroupProps extends AriaCheckboxGroupProps, Partial<Omit<Contro
|
|
|
55
49
|
/** The name of the input element, used when submitting an HTML form. */
|
|
56
50
|
name?: string;
|
|
57
51
|
/**
|
|
58
|
-
* The
|
|
59
|
-
* The value of this attribute must be the id of a
|
|
52
|
+
* The `<form>` element to associate the input with.
|
|
53
|
+
* The value of this attribute must be the id of a `<form>` in the same document.
|
|
60
54
|
*/
|
|
61
55
|
form?: string;
|
|
62
|
-
/** Description for the checkbox group. */
|
|
63
|
-
description?: string;
|
|
64
56
|
/** Checkbox children. */
|
|
65
57
|
children?: React.ReactNode;
|
|
66
|
-
/** Error message for the checkbox group. */
|
|
67
|
-
errorMessage?: React.ReactNode | ((val: ValidationResult) => React.ReactNode);
|
|
68
58
|
}
|
|
69
59
|
/**
|
|
70
60
|
* The `CheckboxGroup` allows a user to select items from a list of `Checkbox` components.
|
|
71
|
-
*
|
|
72
|
-
* @component
|
|
73
|
-
* @param {CheckboxGroupProps} args - The props passed to the CheckboxGroup component.
|
|
74
|
-
*
|
|
75
|
-
* @public
|
|
76
61
|
*/
|
|
77
|
-
declare const CheckboxGroup: React.
|
|
62
|
+
declare const CheckboxGroup: React.MemoExoticComponent<React.ComponentType<CheckboxGroupProps & _bento_slots.Slots>>;
|
|
78
63
|
|
|
79
64
|
export { Checkbox, CheckboxGroup, type CheckboxGroupProps, type CheckboxProps };
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import React2, { useContext, useRef, useMemo } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { Container } from '@bento/container';
|
|
3
|
+
import { useDataAttributes } from '@bento/use-data-attributes';
|
|
3
4
|
import { Icon } from '@bento/icon';
|
|
4
5
|
import { withSlots } from '@bento/slots';
|
|
5
6
|
import { useProps } from '@bento/use-props';
|
|
6
|
-
import {
|
|
7
|
+
import { VisuallyHidden } from '@bento/visually-hidden';
|
|
7
8
|
import { useObjectRef, mergeRefs, mergeProps } from '@react-aria/utils';
|
|
9
|
+
import { useFocusRing, useCheckboxGroupItem, useCheckbox, useHover, useCheckboxGroup, mergeProps as mergeProps$1 } from 'react-aria';
|
|
8
10
|
import { useToggleState, useCheckboxGroupState } from 'react-stately';
|
|
9
|
-
import { useDataAttributes } from '@bento/use-data-attributes';
|
|
10
11
|
|
|
11
12
|
// src/checkbox.tsx
|
|
12
13
|
var CheckboxGroupStateContext = React2.createContext(null);
|
|
@@ -14,17 +15,11 @@ var CheckboxGroupStateContext = React2.createContext(null);
|
|
|
14
15
|
// src/checkbox.tsx
|
|
15
16
|
var Checkbox = withSlots("BentoCheckbox", function Checkbox2(args) {
|
|
16
17
|
const { props, apply } = useProps(args);
|
|
17
|
-
const {
|
|
18
|
-
isRequired = false,
|
|
19
|
-
isIndeterminate = false,
|
|
20
|
-
isDisabled: isDisabledProp = false,
|
|
21
|
-
isSelected: isSelectedProp = false,
|
|
22
|
-
isReadOnly: isReadOnlyProp = false
|
|
23
|
-
} = props;
|
|
24
18
|
const groupState = useContext(CheckboxGroupStateContext);
|
|
25
19
|
const ref = useRef(null);
|
|
26
20
|
const inputRef = useObjectRef(useMemo(() => mergeRefs(ref, props.inputRef), [ref, props.inputRef]));
|
|
27
|
-
|
|
21
|
+
const { isFocused, isFocusVisible, focusProps } = useFocusRing();
|
|
22
|
+
const { labelProps, inputProps, isSelected, isPressed, isDisabled, isReadOnly, isInvalid } = groupState ? useCheckboxGroupItem(
|
|
28
23
|
{
|
|
29
24
|
...props,
|
|
30
25
|
// Value is optional for standalone checkboxes, but required for CheckboxGroup items;
|
|
@@ -33,80 +28,62 @@ var Checkbox = withSlots("BentoCheckbox", function Checkbox2(args) {
|
|
|
33
28
|
},
|
|
34
29
|
groupState,
|
|
35
30
|
inputRef
|
|
36
|
-
) : useCheckbox(
|
|
37
|
-
|
|
38
|
-
...props
|
|
39
|
-
},
|
|
40
|
-
useToggleState(props),
|
|
41
|
-
inputRef
|
|
42
|
-
);
|
|
43
|
-
const interactionDisabled = isDisabledProp || isDisabled || isReadOnly || isReadOnlyProp;
|
|
31
|
+
) : useCheckbox(props, useToggleState(props), inputRef);
|
|
32
|
+
const interactionDisabled = props.isDisabled || isDisabled || isReadOnly;
|
|
44
33
|
const { hoverProps, isHovered } = useHover({
|
|
45
34
|
...props,
|
|
46
35
|
isDisabled: interactionDisabled
|
|
47
36
|
});
|
|
48
|
-
const { isFocused, isFocusVisible, focusProps } = useFocusRing();
|
|
49
37
|
return /* @__PURE__ */ React2.createElement(
|
|
50
|
-
|
|
38
|
+
Container,
|
|
51
39
|
{
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
label: props.children,
|
|
56
|
-
inputRef,
|
|
57
|
-
"aria-checked": isIndeterminate ? "mixed" : void 0,
|
|
58
|
-
...apply(props, ["isReadOnly", "isSelected", "isIndeterminate", "isDisabled", "value", "autoFocus"]),
|
|
40
|
+
as: "label",
|
|
41
|
+
"aria-checked": props.isIndeterminate ? "mixed" : void 0,
|
|
42
|
+
...apply(mergeProps(labelProps, hoverProps)),
|
|
59
43
|
...useDataAttributes({
|
|
60
|
-
selected: isSelected
|
|
44
|
+
selected: isSelected,
|
|
61
45
|
pressed: isPressed,
|
|
62
46
|
hovered: isHovered,
|
|
63
47
|
focused: isFocused,
|
|
64
48
|
focusVisible: isFocusVisible,
|
|
65
49
|
disabled: interactionDisabled,
|
|
66
|
-
|
|
50
|
+
readonly: isReadOnly,
|
|
67
51
|
invalid: isInvalid,
|
|
68
|
-
required: isRequired,
|
|
69
|
-
indeterminate: isIndeterminate
|
|
52
|
+
required: props.isRequired,
|
|
53
|
+
indeterminate: props.isIndeterminate
|
|
70
54
|
})
|
|
71
55
|
},
|
|
72
|
-
|
|
56
|
+
/* @__PURE__ */ React2.createElement(VisuallyHidden, null, /* @__PURE__ */ React2.createElement("input", { ...mergeProps(inputProps, focusProps), ref: inputRef })),
|
|
57
|
+
props.isIndeterminate ? /* @__PURE__ */ React2.createElement(Icon, { slot: "icon-indeterminate", icon: "checkboxIndeterminate" }, /* @__PURE__ */ React2.createElement("svg", { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React2.createElement("rect", { x: "6", y: "11", width: "12", height: "2", fill: "currentColor" }))) : isSelected ? /* @__PURE__ */ React2.createElement(Icon, { slot: "icon-checked", icon: "checkboxChecked" }, /* @__PURE__ */ React2.createElement("svg", { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React2.createElement("path", { d: "M9,16.2L4.8,12l-1.4,1.4L9,19L21,7l-1.4-1.4L9,16.2z", fill: "currentColor" }))) : /* @__PURE__ */ React2.createElement(Icon, { slot: "icon-unchecked", icon: "checkboxUnchecked" }, /* @__PURE__ */ React2.createElement("svg", { width: 24, height: 24 }, /* @__PURE__ */ React2.createElement("rect", { x: 4, y: 4, width: 16, height: 16, rx: 3, fill: "none", stroke: "gray", strokeWidth: 2 }))),
|
|
58
|
+
props.children
|
|
73
59
|
);
|
|
74
60
|
});
|
|
75
61
|
var CheckboxGroup = withSlots("BentoCheckboxGroup", function CheckboxGroup2(args) {
|
|
76
|
-
const {
|
|
77
|
-
const { props, apply } = useProps(restArgs);
|
|
62
|
+
const { props, apply } = useProps(args);
|
|
78
63
|
const state = useCheckboxGroupState(props);
|
|
79
|
-
const { children } = props;
|
|
80
64
|
const { groupProps, labelProps, descriptionProps, errorMessageProps, ...validationResult } = useCheckboxGroup(
|
|
81
|
-
props,
|
|
65
|
+
{ ...props, label: props.label ?? "Checkbox Group", description: props.description ?? "Description" },
|
|
82
66
|
state
|
|
83
67
|
);
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
return typeof errorMessage === "function" ? errorMessage(validationResult) : errorMessage || validationResult.validationErrors.join(", ");
|
|
87
|
-
},
|
|
88
|
-
[errorMessage, validationResult]
|
|
89
|
-
);
|
|
90
|
-
return /* @__PURE__ */ React2.createElement(
|
|
91
|
-
ControlGroup,
|
|
68
|
+
return /* @__PURE__ */ React2.createElement(CheckboxGroupStateContext.Provider, { value: state }, /* @__PURE__ */ React2.createElement(
|
|
69
|
+
Container,
|
|
92
70
|
{
|
|
93
|
-
|
|
94
|
-
labelProps,
|
|
95
|
-
descriptionProps,
|
|
96
|
-
errorMessage: displayedErrorMessage,
|
|
97
|
-
errorMessageProps,
|
|
98
|
-
...groupProps,
|
|
99
|
-
...apply(props, ["isInvalid", "isDisabled", "isReadOnly", "isRequired", "validationBehavior"]),
|
|
71
|
+
...apply(groupProps),
|
|
100
72
|
...useDataAttributes({
|
|
101
73
|
orientation: props.orientation || "vertical",
|
|
102
74
|
invalid: state.isInvalid,
|
|
103
75
|
disabled: state.isDisabled,
|
|
104
76
|
readonly: state.isReadOnly,
|
|
105
77
|
required: state.isRequired
|
|
106
|
-
})
|
|
78
|
+
}),
|
|
79
|
+
slots: {
|
|
80
|
+
label: labelProps,
|
|
81
|
+
description: descriptionProps,
|
|
82
|
+
error: mergeProps$1(errorMessageProps, validationResult)
|
|
83
|
+
}
|
|
107
84
|
},
|
|
108
|
-
|
|
109
|
-
);
|
|
85
|
+
props.children
|
|
86
|
+
));
|
|
110
87
|
});
|
|
111
88
|
|
|
112
89
|
export { Checkbox, CheckboxGroup };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/checkbox-group-state.tsx","../src/checkbox.tsx","../src/checkbox-group.tsx"],"names":["React","Checkbox","withSlots","CheckboxGroup","useProps","useMemo","useDataAttributes"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react';\nimport { CheckboxGroupState } from 'react-stately';\n\nexport const CheckboxGroupStateContext = React.createContext<CheckboxGroupState | null>(null);\n","import React, { useContext, useRef, useMemo } from 'react';\nimport { Control, ControlProps } from '@bento/control';\nimport { Icon } from '@bento/icon';\nimport { withSlots } from '@bento/slots';\nimport { useProps } from '@bento/use-props';\nimport { useFocusRing, useHover, type AriaCheckboxProps, useCheckboxGroupItem, useCheckbox } from 'react-aria';\nimport { mergeProps, mergeRefs, useObjectRef } from '@react-aria/utils';\nimport { useToggleState } from 'react-stately';\nimport { useDataAttributes } from '@bento/use-data-attributes';\nimport { CheckboxGroupStateContext } from './checkbox-group-state';\n\nexport interface CheckboxProps extends AriaCheckboxProps, Partial<Omit<ControlProps, keyof AriaCheckboxProps>> {\n /** The value of the checkbox, used when submitting an HTML form. */\n value?: string;\n\n /** The name of the checkbox. */\n name?: string;\n\n /** A ref for the HTML input element. */\n inputRef?: React.Ref<HTMLInputElement>;\n\n /** The label for the checkbox. Accepts any renderable node. */\n children?: React.ReactNode;\n\n /** Whether the checkbox is required or not. */\n isRequired?: boolean;\n\n /** Whether the input can be selected but not changed by the user. */\n isReadOnly?: boolean;\n\n /**\n * Whether the checkbox is disabled or not. Shows that a selection exists,\n * but is not available in that circumstance.\n */\n isDisabled?: boolean;\n\n /** Whether the element should receive focus on render. */\n autoFocus?: boolean;\n\n /** Whether the checkbox is in an indeterminate state. */\n isIndeterminate?: boolean;\n\n /** Whether the checkbox is in a selected state. */\n isSelected?: boolean;\n}\n\n/**\n * The `Checkbox` is a single checkbox option that can be selected by the user.\n *\n * @component\n * @param args - The props {@link CheckboxProps} passed to the Checkbox component.\n *\n * @public\n */\nexport const Checkbox = withSlots('BentoCheckbox', function Checkbox(args: CheckboxProps) {\n const { props, apply } = useProps(args);\n const {\n isRequired = false,\n isIndeterminate = false,\n isDisabled: isDisabledProp = false,\n isSelected: isSelectedProp = false,\n isReadOnly: isReadOnlyProp = false\n } = props;\n\n const groupState = useContext(CheckboxGroupStateContext);\n\n const ref = useRef<HTMLInputElement>(null);\n const inputRef = useObjectRef(useMemo(() => mergeRefs(ref, props.inputRef), [ref, props.inputRef]));\n\n let { labelProps, inputProps, isSelected, isReadOnly, isDisabled, isPressed, isInvalid } = groupState\n ? useCheckboxGroupItem(\n {\n ...props,\n // Value is optional for standalone checkboxes, but required for CheckboxGroup items;\n // it's passed explicitly here to avoid typescript error (requires ignore)(recommendation from React Aria).\n value: (props as Required<Pick<typeof props, 'value'>>).value\n },\n groupState,\n inputRef\n )\n : useCheckbox(\n {\n ...props\n },\n useToggleState(props),\n inputRef\n );\n\n const interactionDisabled = isDisabledProp || isDisabled || isReadOnly || isReadOnlyProp;\n const { hoverProps, isHovered } = useHover({\n ...props,\n isDisabled: interactionDisabled\n });\n const { isFocused, isFocusVisible, focusProps } = useFocusRing();\n\n return (\n <Control\n slot=\"control\"\n labelProps={mergeProps(labelProps, hoverProps)}\n inputProps={mergeProps(inputProps, focusProps)}\n label={props.children}\n inputRef={inputRef}\n aria-checked={isIndeterminate ? 'mixed' : undefined}\n {...apply(props, ['isReadOnly', 'isSelected', 'isIndeterminate', 'isDisabled', 'value', 'autoFocus'])}\n {...useDataAttributes({\n selected: isSelected || isSelectedProp,\n pressed: isPressed,\n hovered: isHovered,\n focused: isFocused,\n focusVisible: isFocusVisible,\n disabled: interactionDisabled,\n readOnly: isReadOnly || isReadOnlyProp,\n invalid: isInvalid,\n required: isRequired,\n indeterminate: isIndeterminate\n })}\n >\n {isIndeterminate ? (\n <Icon slot=\"icon-indeterminate\" icon=\"checkboxIndeterminate\">\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"6\" y=\"11\" width=\"12\" height=\"2\" fill=\"currentColor\" />\n </svg>\n </Icon>\n ) : isSelected ? (\n <Icon slot=\"icon-checked\" icon=\"checkboxChecked\">\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9,16.2L4.8,12l-1.4,1.4L9,19L21,7l-1.4-1.4L9,16.2z\" fill=\"currentColor\" />\n </svg>\n </Icon>\n ) : (\n <Icon slot=\"icon-unchecked\" icon=\"checkboxUnchecked\">\n <svg width={24} height={24} aria-hidden=\"true\">\n <rect x={4} y={4} width={16} height={16} rx={3} fill=\"none\" stroke=\"gray\" strokeWidth={2} />\n </svg>\n </Icon>\n )}\n </Control>\n );\n});\n","import React, { useMemo } from 'react';\nimport { useProps } from '@bento/use-props';\nimport { ControlGroup, ControlGroupProps } from '@bento/control';\nimport { useDataAttributes } from '@bento/use-data-attributes';\nimport { type ValidationResult } from '@react-types/shared';\nimport { AriaCheckboxGroupProps, useCheckboxGroup } from 'react-aria';\nimport { useCheckboxGroupState } from 'react-stately';\nimport { withSlots } from '@bento/slots';\nimport { CheckboxGroupStateContext } from './checkbox-group-state';\n\nexport interface CheckboxGroupProps\n extends AriaCheckboxGroupProps,\n Partial<Omit<ControlGroupProps, keyof AriaCheckboxGroupProps>> {\n /** The current value of the checkbox group (controlled). */\n value?: string[];\n\n /** The default value of the checkbox group (uncontrolled). */\n defaultValue?: string[];\n\n /** Whether the input is disabled. */\n isDisabled?: boolean;\n\n /** Whether the input can be selected but not changed by the user. */\n isReadOnly?: boolean;\n\n /** Whether user input is required on the input before form submission. */\n isRequired?: boolean;\n\n /** Whether the input value is invalid. */\n isInvalid?: boolean;\n\n /** The name of the input element, used when submitting an HTML form. */\n name?: string;\n\n /**\n * The <form> element to associate the input with.\n * The value of this attribute must be the id of a <form> in the same document.\n */\n form?: string;\n\n /** Description for the checkbox group. */\n description?: string;\n\n /** Checkbox children. */\n children?: React.ReactNode;\n\n /** Error message for the checkbox group. */\n errorMessage?: React.ReactNode | ((val: ValidationResult) => React.ReactNode);\n}\n\n/**\n * The `CheckboxGroup` allows a user to select items from a list of `Checkbox` components.\n *\n * @component\n * @param {CheckboxGroupProps} args - The props passed to the CheckboxGroup component.\n *\n * @public\n */\nexport const CheckboxGroup = withSlots('BentoCheckboxGroup', function CheckboxGroup(args: CheckboxGroupProps) {\n const { errorMessage, ...restArgs } = args;\n const { props, apply } = useProps(restArgs);\n const state = useCheckboxGroupState(props);\n const { children } = props;\n const { groupProps, labelProps, descriptionProps, errorMessageProps, ...validationResult } = useCheckboxGroup(\n props,\n state\n );\n\n const displayedErrorMessage = useMemo(\n function getErrorMessage() {\n return typeof errorMessage === 'function'\n ? errorMessage(validationResult)\n : errorMessage || validationResult.validationErrors.join(', ');\n },\n [errorMessage, validationResult]\n );\n\n return (\n <ControlGroup\n slot=\"group\"\n labelProps={labelProps}\n descriptionProps={descriptionProps}\n errorMessage={displayedErrorMessage}\n errorMessageProps={errorMessageProps}\n {...groupProps}\n {...apply(props, ['isInvalid', 'isDisabled', 'isReadOnly', 'isRequired', 'validationBehavior'])}\n {...useDataAttributes({\n orientation: props.orientation || 'vertical',\n invalid: state.isInvalid,\n disabled: state.isDisabled,\n readonly: state.isReadOnly,\n required: state.isRequired\n })}\n >\n <CheckboxGroupStateContext.Provider value={state}>{children}</CheckboxGroupStateContext.Provider>\n </ControlGroup>\n );\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/checkbox-group-state.tsx","../src/checkbox.tsx","../src/checkbox-group.tsx"],"names":["React","Checkbox","withSlots","CheckboxGroup","useProps","Container","useDataAttributes","mergeProps"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react';\nimport { CheckboxGroupState } from 'react-stately';\n\nexport const CheckboxGroupStateContext = React.createContext<CheckboxGroupState | null>(null);\n","import React, { useContext, useRef, useMemo } from 'react';\nimport { Container, type ContainerProps } from '@bento/container';\nimport { useDataAttributes } from '@bento/use-data-attributes';\nimport { Icon } from '@bento/icon';\nimport { withSlots } from '@bento/slots';\nimport { useProps } from '@bento/use-props';\nimport { VisuallyHidden } from '@bento/visually-hidden';\nimport { mergeProps, mergeRefs, useObjectRef } from '@react-aria/utils';\nimport { useFocusRing, useHover, useCheckbox, useCheckboxGroupItem, type AriaCheckboxProps } from 'react-aria';\nimport { useToggleState } from 'react-stately';\nimport { CheckboxGroupStateContext } from './checkbox-group-state';\n\nexport interface CheckboxProps extends AriaCheckboxProps, Omit<ContainerProps, keyof AriaCheckboxProps> {\n /** The value of the checkbox, used when submitting an HTML form. */\n value?: string;\n\n /** The name of the checkbox. */\n name?: string;\n\n /** A ref for the HTML input element. */\n inputRef?: React.Ref<HTMLInputElement>;\n\n /** The label for the checkbox. Accepts any renderable node. */\n children?: React.ReactNode;\n\n /** Whether the checkbox is required or not. */\n isRequired?: boolean;\n\n /** Whether the input can be selected but not changed by the user. */\n isReadOnly?: boolean;\n\n /**\n * Whether the checkbox is disabled or not. Shows that a selection exists,\n * but is not available in that circumstance.\n */\n isDisabled?: boolean;\n\n /** Whether the element should receive focus on render. */\n autoFocus?: boolean;\n\n /** Whether the checkbox is in an indeterminate state. */\n isIndeterminate?: boolean;\n\n /** Whether the checkbox is in a selected state. */\n isSelected?: boolean;\n}\n\n/**\n * The `Checkbox` is a single checkbox option that can be selected by the user.\n */\nexport const Checkbox = withSlots('BentoCheckbox', function Checkbox(args: CheckboxProps) {\n const { props, apply } = useProps(args);\n const groupState = useContext(CheckboxGroupStateContext);\n const ref = useRef<HTMLInputElement>(null);\n const inputRef = useObjectRef(useMemo(() => mergeRefs(ref, props.inputRef), [ref, props.inputRef]));\n const { isFocused, isFocusVisible, focusProps } = useFocusRing();\n\n const { labelProps, inputProps, isSelected, isPressed, isDisabled, isReadOnly, isInvalid } = groupState\n ? useCheckboxGroupItem(\n {\n ...props,\n // Value is optional for standalone checkboxes, but required for CheckboxGroup items;\n // it's passed explicitly here to avoid typescript error (requires ignore)(recommendation from React Aria).\n value: (props as Required<Pick<typeof props, 'value'>>).value\n },\n groupState,\n inputRef\n )\n : useCheckbox(props, useToggleState(props), inputRef);\n\n const interactionDisabled = props.isDisabled || isDisabled || isReadOnly;\n const { hoverProps, isHovered } = useHover({\n ...props,\n isDisabled: interactionDisabled\n });\n\n return (\n <Container\n as=\"label\"\n aria-checked={props.isIndeterminate ? 'mixed' : undefined}\n {...apply(mergeProps(labelProps, hoverProps))}\n {...useDataAttributes({\n selected: isSelected,\n pressed: isPressed,\n hovered: isHovered,\n focused: isFocused,\n focusVisible: isFocusVisible,\n disabled: interactionDisabled,\n readonly: isReadOnly,\n invalid: isInvalid,\n required: props.isRequired,\n indeterminate: props.isIndeterminate\n })}\n >\n <VisuallyHidden>\n <input {...mergeProps(inputProps, focusProps)} ref={inputRef} />\n </VisuallyHidden>\n\n {props.isIndeterminate ? (\n <Icon slot=\"icon-indeterminate\" icon=\"checkboxIndeterminate\">\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"6\" y=\"11\" width=\"12\" height=\"2\" fill=\"currentColor\" />\n </svg>\n </Icon>\n ) : isSelected ? (\n <Icon slot=\"icon-checked\" icon=\"checkboxChecked\">\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9,16.2L4.8,12l-1.4,1.4L9,19L21,7l-1.4-1.4L9,16.2z\" fill=\"currentColor\" />\n </svg>\n </Icon>\n ) : (\n <Icon slot=\"icon-unchecked\" icon=\"checkboxUnchecked\">\n <svg width={24} height={24}>\n <rect x={4} y={4} width={16} height={16} rx={3} fill=\"none\" stroke=\"gray\" strokeWidth={2} />\n </svg>\n </Icon>\n )}\n {props.children}\n </Container>\n );\n});\n","import React from 'react';\nimport { withSlots } from '@bento/slots';\nimport { Container, type ContainerProps } from '@bento/container';\nimport { useProps } from '@bento/use-props';\nimport { useCheckboxGroup, mergeProps, type AriaCheckboxGroupProps } from 'react-aria';\nimport { useCheckboxGroupState } from 'react-stately';\nimport { CheckboxGroupStateContext } from './checkbox-group-state';\nimport { useDataAttributes } from '@bento/use-data-attributes';\n\nexport interface CheckboxGroupProps extends AriaCheckboxGroupProps, Omit<ContainerProps, keyof AriaCheckboxGroupProps> {\n /** The current value of the checkbox group (controlled). */\n value?: string[];\n\n /** The default value of the checkbox group (uncontrolled). */\n defaultValue?: string[];\n\n /** Whether the input is disabled. */\n isDisabled?: boolean;\n\n /** Whether the input can be selected but not changed by the user. */\n isReadOnly?: boolean;\n\n /** Whether user input is required on the input before form submission. */\n isRequired?: boolean;\n\n /** Whether the input value is invalid. */\n isInvalid?: boolean;\n\n /** The name of the input element, used when submitting an HTML form. */\n name?: string;\n\n /**\n * The `<form>` element to associate the input with.\n * The value of this attribute must be the id of a `<form>` in the same document.\n */\n form?: string;\n\n /** Checkbox children. */\n children?: React.ReactNode;\n}\n\n/**\n * The `CheckboxGroup` allows a user to select items from a list of `Checkbox` components.\n */\nexport const CheckboxGroup = withSlots('BentoCheckboxGroup', function CheckboxGroup(args: CheckboxGroupProps) {\n const { props, apply } = useProps(args);\n const state = useCheckboxGroupState(props);\n const { groupProps, labelProps, descriptionProps, errorMessageProps, ...validationResult } = useCheckboxGroup(\n { ...props, label: props.label ?? 'Checkbox Group', description: props.description ?? 'Description' },\n state\n );\n\n return (\n <CheckboxGroupStateContext.Provider value={state}>\n <Container\n {...apply(groupProps)}\n {...useDataAttributes({\n orientation: props.orientation || 'vertical',\n invalid: state.isInvalid,\n disabled: state.isDisabled,\n readonly: state.isReadOnly,\n required: state.isRequired\n })}\n slots={{\n label: labelProps,\n description: descriptionProps,\n error: mergeProps(errorMessageProps, validationResult)\n }}\n >\n {props.children}\n </Container>\n </CheckboxGroupStateContext.Provider>\n );\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bento/checkbox",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Checkbox component",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"build": "tsup-node",
|
|
10
10
|
"lint": "biome lint && tsc",
|
|
11
11
|
"posttest": "npm run lint",
|
|
12
|
+
"prepublishOnly": "node ../../scripts/compile-readme.ts",
|
|
12
13
|
"pretest": "npm run build",
|
|
13
14
|
"test": "vitest --run",
|
|
14
15
|
"test:watch": "vitest"
|
|
@@ -39,11 +40,12 @@
|
|
|
39
40
|
"package.json"
|
|
40
41
|
],
|
|
41
42
|
"dependencies": {
|
|
42
|
-
"@bento/
|
|
43
|
-
"@bento/icon": "^0.1.
|
|
44
|
-
"@bento/slots": "^0.
|
|
45
|
-
"@bento/use-data-attributes": "^0.1.
|
|
46
|
-
"@bento/use-props": "^0.
|
|
43
|
+
"@bento/container": "^0.2.0",
|
|
44
|
+
"@bento/icon": "^0.1.3",
|
|
45
|
+
"@bento/slots": "^0.2.0",
|
|
46
|
+
"@bento/use-data-attributes": "^0.1.1",
|
|
47
|
+
"@bento/use-props": "^0.2.0",
|
|
48
|
+
"@bento/visually-hidden": "^0.1.0",
|
|
47
49
|
"@react-aria/utils": "^3.30.0",
|
|
48
50
|
"react-aria": "^3.44.0",
|
|
49
51
|
"react-stately": "^3.42.0"
|
package/src/checkbox-group.tsx
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import React
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { withSlots } from '@bento/slots';
|
|
3
|
+
import { Container, type ContainerProps } from '@bento/container';
|
|
2
4
|
import { useProps } from '@bento/use-props';
|
|
3
|
-
import {
|
|
4
|
-
import { useDataAttributes } from '@bento/use-data-attributes';
|
|
5
|
-
import { type ValidationResult } from '@react-types/shared';
|
|
6
|
-
import { AriaCheckboxGroupProps, useCheckboxGroup } from 'react-aria';
|
|
5
|
+
import { useCheckboxGroup, mergeProps, type AriaCheckboxGroupProps } from 'react-aria';
|
|
7
6
|
import { useCheckboxGroupState } from 'react-stately';
|
|
8
|
-
import { withSlots } from '@bento/slots';
|
|
9
7
|
import { CheckboxGroupStateContext } from './checkbox-group-state';
|
|
8
|
+
import { useDataAttributes } from '@bento/use-data-attributes';
|
|
10
9
|
|
|
11
|
-
export interface CheckboxGroupProps
|
|
12
|
-
extends AriaCheckboxGroupProps,
|
|
13
|
-
Partial<Omit<ControlGroupProps, keyof AriaCheckboxGroupProps>> {
|
|
10
|
+
export interface CheckboxGroupProps extends AriaCheckboxGroupProps, Omit<ContainerProps, keyof AriaCheckboxGroupProps> {
|
|
14
11
|
/** The current value of the checkbox group (controlled). */
|
|
15
12
|
value?: string[];
|
|
16
13
|
|
|
@@ -33,66 +30,45 @@ export interface CheckboxGroupProps
|
|
|
33
30
|
name?: string;
|
|
34
31
|
|
|
35
32
|
/**
|
|
36
|
-
* The
|
|
37
|
-
* The value of this attribute must be the id of a
|
|
33
|
+
* The `<form>` element to associate the input with.
|
|
34
|
+
* The value of this attribute must be the id of a `<form>` in the same document.
|
|
38
35
|
*/
|
|
39
36
|
form?: string;
|
|
40
37
|
|
|
41
|
-
/** Description for the checkbox group. */
|
|
42
|
-
description?: string;
|
|
43
|
-
|
|
44
38
|
/** Checkbox children. */
|
|
45
39
|
children?: React.ReactNode;
|
|
46
|
-
|
|
47
|
-
/** Error message for the checkbox group. */
|
|
48
|
-
errorMessage?: React.ReactNode | ((val: ValidationResult) => React.ReactNode);
|
|
49
40
|
}
|
|
50
41
|
|
|
51
42
|
/**
|
|
52
43
|
* The `CheckboxGroup` allows a user to select items from a list of `Checkbox` components.
|
|
53
|
-
*
|
|
54
|
-
* @component
|
|
55
|
-
* @param {CheckboxGroupProps} args - The props passed to the CheckboxGroup component.
|
|
56
|
-
*
|
|
57
|
-
* @public
|
|
58
44
|
*/
|
|
59
45
|
export const CheckboxGroup = withSlots('BentoCheckboxGroup', function CheckboxGroup(args: CheckboxGroupProps) {
|
|
60
|
-
const {
|
|
61
|
-
const { props, apply } = useProps(restArgs);
|
|
46
|
+
const { props, apply } = useProps(args);
|
|
62
47
|
const state = useCheckboxGroupState(props);
|
|
63
|
-
const { children } = props;
|
|
64
48
|
const { groupProps, labelProps, descriptionProps, errorMessageProps, ...validationResult } = useCheckboxGroup(
|
|
65
|
-
props,
|
|
49
|
+
{ ...props, label: props.label ?? 'Checkbox Group', description: props.description ?? 'Description' },
|
|
66
50
|
state
|
|
67
51
|
);
|
|
68
52
|
|
|
69
|
-
const displayedErrorMessage = useMemo(
|
|
70
|
-
function getErrorMessage() {
|
|
71
|
-
return typeof errorMessage === 'function'
|
|
72
|
-
? errorMessage(validationResult)
|
|
73
|
-
: errorMessage || validationResult.validationErrors.join(', ');
|
|
74
|
-
},
|
|
75
|
-
[errorMessage, validationResult]
|
|
76
|
-
);
|
|
77
|
-
|
|
78
53
|
return (
|
|
79
|
-
<
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
54
|
+
<CheckboxGroupStateContext.Provider value={state}>
|
|
55
|
+
<Container
|
|
56
|
+
{...apply(groupProps)}
|
|
57
|
+
{...useDataAttributes({
|
|
58
|
+
orientation: props.orientation || 'vertical',
|
|
59
|
+
invalid: state.isInvalid,
|
|
60
|
+
disabled: state.isDisabled,
|
|
61
|
+
readonly: state.isReadOnly,
|
|
62
|
+
required: state.isRequired
|
|
63
|
+
})}
|
|
64
|
+
slots={{
|
|
65
|
+
label: labelProps,
|
|
66
|
+
description: descriptionProps,
|
|
67
|
+
error: mergeProps(errorMessageProps, validationResult)
|
|
68
|
+
}}
|
|
69
|
+
>
|
|
70
|
+
{props.children}
|
|
71
|
+
</Container>
|
|
72
|
+
</CheckboxGroupStateContext.Provider>
|
|
97
73
|
);
|
|
98
74
|
});
|
package/src/checkbox.tsx
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import React, { useContext, useRef, useMemo } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { Container, type ContainerProps } from '@bento/container';
|
|
3
|
+
import { useDataAttributes } from '@bento/use-data-attributes';
|
|
3
4
|
import { Icon } from '@bento/icon';
|
|
4
5
|
import { withSlots } from '@bento/slots';
|
|
5
6
|
import { useProps } from '@bento/use-props';
|
|
6
|
-
import {
|
|
7
|
+
import { VisuallyHidden } from '@bento/visually-hidden';
|
|
7
8
|
import { mergeProps, mergeRefs, useObjectRef } from '@react-aria/utils';
|
|
9
|
+
import { useFocusRing, useHover, useCheckbox, useCheckboxGroupItem, type AriaCheckboxProps } from 'react-aria';
|
|
8
10
|
import { useToggleState } from 'react-stately';
|
|
9
|
-
import { useDataAttributes } from '@bento/use-data-attributes';
|
|
10
11
|
import { CheckboxGroupStateContext } from './checkbox-group-state';
|
|
11
12
|
|
|
12
|
-
export interface CheckboxProps extends AriaCheckboxProps,
|
|
13
|
+
export interface CheckboxProps extends AriaCheckboxProps, Omit<ContainerProps, keyof AriaCheckboxProps> {
|
|
13
14
|
/** The value of the checkbox, used when submitting an HTML form. */
|
|
14
15
|
value?: string;
|
|
15
16
|
|
|
@@ -46,28 +47,15 @@ export interface CheckboxProps extends AriaCheckboxProps, Partial<Omit<ControlPr
|
|
|
46
47
|
|
|
47
48
|
/**
|
|
48
49
|
* The `Checkbox` is a single checkbox option that can be selected by the user.
|
|
49
|
-
*
|
|
50
|
-
* @component
|
|
51
|
-
* @param args - The props {@link CheckboxProps} passed to the Checkbox component.
|
|
52
|
-
*
|
|
53
|
-
* @public
|
|
54
50
|
*/
|
|
55
51
|
export const Checkbox = withSlots('BentoCheckbox', function Checkbox(args: CheckboxProps) {
|
|
56
52
|
const { props, apply } = useProps(args);
|
|
57
|
-
const {
|
|
58
|
-
isRequired = false,
|
|
59
|
-
isIndeterminate = false,
|
|
60
|
-
isDisabled: isDisabledProp = false,
|
|
61
|
-
isSelected: isSelectedProp = false,
|
|
62
|
-
isReadOnly: isReadOnlyProp = false
|
|
63
|
-
} = props;
|
|
64
|
-
|
|
65
53
|
const groupState = useContext(CheckboxGroupStateContext);
|
|
66
|
-
|
|
67
54
|
const ref = useRef<HTMLInputElement>(null);
|
|
68
55
|
const inputRef = useObjectRef(useMemo(() => mergeRefs(ref, props.inputRef), [ref, props.inputRef]));
|
|
56
|
+
const { isFocused, isFocusVisible, focusProps } = useFocusRing();
|
|
69
57
|
|
|
70
|
-
|
|
58
|
+
const { labelProps, inputProps, isSelected, isPressed, isDisabled, isReadOnly, isInvalid } = groupState
|
|
71
59
|
? useCheckboxGroupItem(
|
|
72
60
|
{
|
|
73
61
|
...props,
|
|
@@ -78,44 +66,37 @@ export const Checkbox = withSlots('BentoCheckbox', function Checkbox(args: Check
|
|
|
78
66
|
groupState,
|
|
79
67
|
inputRef
|
|
80
68
|
)
|
|
81
|
-
: useCheckbox(
|
|
82
|
-
{
|
|
83
|
-
...props
|
|
84
|
-
},
|
|
85
|
-
useToggleState(props),
|
|
86
|
-
inputRef
|
|
87
|
-
);
|
|
69
|
+
: useCheckbox(props, useToggleState(props), inputRef);
|
|
88
70
|
|
|
89
|
-
const interactionDisabled =
|
|
71
|
+
const interactionDisabled = props.isDisabled || isDisabled || isReadOnly;
|
|
90
72
|
const { hoverProps, isHovered } = useHover({
|
|
91
73
|
...props,
|
|
92
74
|
isDisabled: interactionDisabled
|
|
93
75
|
});
|
|
94
|
-
const { isFocused, isFocusVisible, focusProps } = useFocusRing();
|
|
95
76
|
|
|
96
77
|
return (
|
|
97
|
-
<
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
label={props.children}
|
|
102
|
-
inputRef={inputRef}
|
|
103
|
-
aria-checked={isIndeterminate ? 'mixed' : undefined}
|
|
104
|
-
{...apply(props, ['isReadOnly', 'isSelected', 'isIndeterminate', 'isDisabled', 'value', 'autoFocus'])}
|
|
78
|
+
<Container
|
|
79
|
+
as="label"
|
|
80
|
+
aria-checked={props.isIndeterminate ? 'mixed' : undefined}
|
|
81
|
+
{...apply(mergeProps(labelProps, hoverProps))}
|
|
105
82
|
{...useDataAttributes({
|
|
106
|
-
selected: isSelected
|
|
83
|
+
selected: isSelected,
|
|
107
84
|
pressed: isPressed,
|
|
108
85
|
hovered: isHovered,
|
|
109
86
|
focused: isFocused,
|
|
110
87
|
focusVisible: isFocusVisible,
|
|
111
88
|
disabled: interactionDisabled,
|
|
112
|
-
|
|
89
|
+
readonly: isReadOnly,
|
|
113
90
|
invalid: isInvalid,
|
|
114
|
-
required: isRequired,
|
|
115
|
-
indeterminate: isIndeterminate
|
|
91
|
+
required: props.isRequired,
|
|
92
|
+
indeterminate: props.isIndeterminate
|
|
116
93
|
})}
|
|
117
94
|
>
|
|
118
|
-
|
|
95
|
+
<VisuallyHidden>
|
|
96
|
+
<input {...mergeProps(inputProps, focusProps)} ref={inputRef} />
|
|
97
|
+
</VisuallyHidden>
|
|
98
|
+
|
|
99
|
+
{props.isIndeterminate ? (
|
|
119
100
|
<Icon slot="icon-indeterminate" icon="checkboxIndeterminate">
|
|
120
101
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
121
102
|
<rect x="6" y="11" width="12" height="2" fill="currentColor" />
|
|
@@ -129,11 +110,12 @@ export const Checkbox = withSlots('BentoCheckbox', function Checkbox(args: Check
|
|
|
129
110
|
</Icon>
|
|
130
111
|
) : (
|
|
131
112
|
<Icon slot="icon-unchecked" icon="checkboxUnchecked">
|
|
132
|
-
<svg width={24} height={24}
|
|
113
|
+
<svg width={24} height={24}>
|
|
133
114
|
<rect x={4} y={4} width={16} height={16} rx={3} fill="none" stroke="gray" strokeWidth={2} />
|
|
134
115
|
</svg>
|
|
135
116
|
</Icon>
|
|
136
117
|
)}
|
|
137
|
-
|
|
118
|
+
{props.children}
|
|
119
|
+
</Container>
|
|
138
120
|
);
|
|
139
121
|
});
|