@sakura-ui/sakura-ui 0.1.12 → 0.1.14
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 +3 -3
- package/package.json +1 -1
- package/packages/config/package.json +1 -1
- package/packages/config/src/index.ts +68 -53
- package/packages/core/.eslintrc.json +25 -0
- package/packages/core/coverage/clover.xml +258 -0
- package/packages/core/coverage/coverage-final.json +2700 -0
- package/packages/core/coverage/lcov-report/base.css +362 -0
- package/packages/core/coverage/lcov-report/block-navigation.js +85 -0
- package/packages/core/coverage/lcov-report/favicon.png +0 -0
- package/packages/core/coverage/lcov-report/index.html +216 -0
- package/packages/core/coverage/lcov-report/prettify.css +101 -0
- package/packages/core/coverage/lcov-report/prettify.js +1004 -0
- package/packages/core/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/packages/core/coverage/lcov-report/sorter.js +191 -0
- package/packages/core/coverage/lcov-report/src/components/Button.tsx.html +303 -0
- package/packages/core/coverage/lcov-report/src/components/Card.tsx.html +399 -0
- package/packages/core/coverage/lcov-report/src/components/Code.tsx.html +144 -0
- package/packages/core/coverage/lcov-report/src/components/Heading.tsx.html +405 -0
- package/packages/core/coverage/lcov-report/src/components/Icon.tsx.html +183 -0
- package/packages/core/coverage/lcov-report/src/components/IconButton.tsx.html +378 -0
- package/packages/core/coverage/lcov-report/src/components/InfoCard.tsx.html +240 -0
- package/packages/core/coverage/lcov-report/src/components/Link.tsx.html +324 -0
- package/packages/core/coverage/lcov-report/src/components/List.tsx.html +204 -0
- package/packages/core/coverage/lcov-report/src/components/Pre.tsx.html +153 -0
- package/packages/core/coverage/lcov-report/src/components/Table.tsx.html +429 -0
- package/packages/core/coverage/lcov-report/src/components/index.html +396 -0
- package/packages/core/coverage/lcov-report/src/components/index.ts.html +126 -0
- package/packages/core/coverage/lcov-report/src/index.html +176 -0
- package/packages/core/coverage/lcov-report/src/index.ts.html +171 -0
- package/packages/core/coverage/lcov-report/src/utils/class.ts.html +90 -0
- package/packages/core/coverage/lcov-report/src/utils/index.html +176 -0
- package/packages/core/coverage/lcov.info +523 -0
- package/packages/core/jest.config.ts +11 -0
- package/packages/core/package.json +16 -2
- package/packages/core/src/components/Button.tsx +57 -53
- package/packages/core/src/components/Card.tsx +86 -7
- package/packages/core/src/components/Code.tsx +1 -1
- package/packages/core/src/components/Faq.tsx +82 -0
- package/packages/core/src/components/Heading.tsx +42 -30
- package/packages/core/src/components/Icon.tsx +1 -4
- package/packages/core/src/components/IconButton.tsx +88 -73
- package/packages/core/src/components/InfoCard.tsx +13 -13
- package/packages/core/src/components/Link.tsx +23 -24
- package/packages/core/src/components/List.tsx +3 -3
- package/packages/core/src/components/Pre.tsx +1 -1
- package/packages/core/src/components/Table.tsx +7 -9
- package/packages/core/src/components/index.ts +5 -2
- package/packages/core/src/index.ts +6 -0
- package/packages/core/tests/Card.test.tsx +19 -0
- package/packages/forms/dist/components/Checkbox.d.ts +1 -1
- package/packages/forms/dist/components/Checkbox.d.ts.map +1 -1
- package/packages/forms/dist/components/Checkbox.js.map +1 -1
- package/packages/forms/dist/components/FieldsetControl.d.ts +1 -1
- package/packages/forms/dist/components/FieldsetControl.d.ts.map +1 -1
- package/packages/forms/dist/components/FieldsetControl.js +1 -1
- package/packages/forms/dist/components/FieldsetControl.js.map +1 -1
- package/packages/forms/dist/components/Input.d.ts +1 -1
- package/packages/forms/dist/components/Input.d.ts.map +1 -1
- package/packages/forms/dist/components/Input.js.map +1 -1
- package/packages/forms/dist/components/LabelControl.d.ts +1 -1
- package/packages/forms/dist/components/LabelControl.d.ts.map +1 -1
- package/packages/forms/dist/components/LabelControl.js +1 -1
- package/packages/forms/dist/components/LabelControl.js.map +1 -1
- package/packages/forms/dist/components/Radio.d.ts +1 -1
- package/packages/forms/dist/components/Radio.d.ts.map +1 -1
- package/packages/forms/dist/components/Radio.js.map +1 -1
- package/packages/forms/dist/components/Select.d.ts +1 -1
- package/packages/forms/dist/components/Select.d.ts.map +1 -1
- package/packages/forms/dist/components/Select.js.map +1 -1
- package/packages/forms/dist/components/Textarea.d.ts +1 -1
- package/packages/forms/dist/components/Textarea.d.ts.map +1 -1
- package/packages/forms/dist/components/Textarea.js +1 -1
- package/packages/forms/dist/components/Textarea.js.map +1 -1
- package/packages/forms/dist/components/controlled/CheckboxGroup.d.ts +1 -1
- package/packages/forms/dist/components/controlled/CheckboxGroup.d.ts.map +1 -1
- package/packages/forms/dist/components/controlled/CheckboxGroup.js.map +1 -1
- package/packages/forms/dist/components/controlled/RadioGroup.d.ts +1 -1
- package/packages/forms/dist/components/controlled/RadioGroup.d.ts.map +1 -1
- package/packages/forms/dist/components/controlled/RadioGroup.js.map +1 -1
- package/packages/forms/dist/components/controlled/SelectControl.d.ts +1 -1
- package/packages/forms/dist/components/controlled/SelectControl.d.ts.map +1 -1
- package/packages/forms/dist/components/controlled/SelectControl.js.map +1 -1
- package/packages/forms/dist/components/controlled/TextareaControl.d.ts +1 -1
- package/packages/forms/dist/components/controlled/TextareaControl.d.ts.map +1 -1
- package/packages/forms/dist/components/controlled/TextareaControl.js.map +1 -1
- package/packages/forms/dist/index.cjs.js +1 -1
- package/packages/forms/dist/index.cjs.js.map +1 -1
- package/packages/forms/dist/index.es.js +123 -116
- package/packages/forms/dist/index.es.js.map +1 -1
- package/packages/forms/jest.config.ts +0 -3
- package/packages/forms/node_modules/.bin/browserslist +17 -0
- package/packages/forms/package.json +1 -1
- package/packages/forms/src/components/Checkbox.tsx +35 -36
- package/packages/forms/src/components/FieldsetControl.tsx +57 -58
- package/packages/forms/src/components/Input.tsx +23 -24
- package/packages/forms/src/components/LabelControl.tsx +54 -52
- package/packages/forms/src/components/Radio.tsx +32 -33
- package/packages/forms/src/components/Select.tsx +32 -33
- package/packages/forms/src/components/Textarea.tsx +42 -43
- package/packages/forms/src/components/controlled/CheckboxGroup.tsx +36 -34
- package/packages/forms/src/components/controlled/RadioGroup.tsx +1 -1
- package/packages/forms/src/components/controlled/SelectControl.tsx +26 -24
- package/packages/forms/src/components/controlled/TextareaControl.tsx +26 -24
|
@@ -12,67 +12,66 @@ export interface FieldsetControlProps
|
|
|
12
12
|
direction?: 'flex-col' | 'flex-row'
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
export const FieldsetControl
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
15
|
+
export const FieldsetControl = React.forwardRef<
|
|
16
|
+
HTMLFieldSetElement,
|
|
17
|
+
FieldsetControlProps
|
|
18
|
+
>((props, ref) => {
|
|
19
|
+
const id = React.useId()
|
|
20
|
+
const {
|
|
21
|
+
labelText,
|
|
22
|
+
className,
|
|
23
|
+
helperText,
|
|
24
|
+
errorMessage,
|
|
25
|
+
isInvalid,
|
|
26
|
+
isRequired,
|
|
27
|
+
direction,
|
|
28
|
+
children,
|
|
29
|
+
...restProps
|
|
30
|
+
} = props
|
|
29
31
|
|
|
30
|
-
|
|
32
|
+
const groupName = restProps.name ?? `group-${id}`
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
const context = {
|
|
35
|
+
groupName: groupName,
|
|
36
|
+
helperTextId: `helper-text-${id}`,
|
|
37
|
+
errorMessageId: `error-message-${id}`,
|
|
38
|
+
isInvalid: isInvalid ?? false,
|
|
39
|
+
isRequired: isRequired ?? false
|
|
40
|
+
}
|
|
39
41
|
|
|
40
|
-
|
|
42
|
+
const styleDirection = direction ?? 'flex-col'
|
|
41
43
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
</ControllerContext.Provider>
|
|
75
|
-
)
|
|
76
|
-
})
|
|
44
|
+
return (
|
|
45
|
+
<ControllerContext.Provider value={context}>
|
|
46
|
+
<fieldset className={cx('mb-4', className)} ref={ref} {...restProps}>
|
|
47
|
+
<legend>
|
|
48
|
+
<p
|
|
49
|
+
className={cx('block mb-2 text-label', isInvalid && 'text-sun-800')}
|
|
50
|
+
>
|
|
51
|
+
{labelText}
|
|
52
|
+
{isRequired && <span className="text-sun-800"> *</span>}
|
|
53
|
+
</p>
|
|
54
|
+
</legend>
|
|
55
|
+
<div className={cx('inline-flex', styleDirection)}>{children}</div>
|
|
56
|
+
{helperText && (
|
|
57
|
+
<p id={context.helperTextId} className="text-sup text-sumi-700 mt-2">
|
|
58
|
+
{helperText}
|
|
59
|
+
</p>
|
|
60
|
+
)}
|
|
61
|
+
{isInvalid && (
|
|
62
|
+
<p
|
|
63
|
+
id={context.errorMessageId}
|
|
64
|
+
className={cx(
|
|
65
|
+
'text-sup text-sun-800',
|
|
66
|
+
helperText ? 'mt-1' : 'mt-2'
|
|
67
|
+
)}
|
|
68
|
+
>
|
|
69
|
+
{errorMessage}
|
|
70
|
+
</p>
|
|
71
|
+
)}
|
|
72
|
+
</fieldset>
|
|
73
|
+
</ControllerContext.Provider>
|
|
74
|
+
)
|
|
75
|
+
})
|
|
77
76
|
|
|
78
77
|
FieldsetControl.displayName = 'FieldsetControl'
|
|
@@ -4,19 +4,17 @@ import { ControllerContext } from './context'
|
|
|
4
4
|
|
|
5
5
|
export interface InputProps extends React.ComponentPropsWithRef<'input'> {}
|
|
6
6
|
|
|
7
|
-
export const Input
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
restProps.required = true
|
|
15
|
-
}
|
|
7
|
+
export const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|
8
|
+
(props, ref) => {
|
|
9
|
+
const { className, ...restProps } = props
|
|
10
|
+
const ctx = React.useContext(ControllerContext)
|
|
11
|
+
if (ctx.isRequired) {
|
|
12
|
+
restProps.required = true
|
|
13
|
+
}
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
const invalidStyle = ctx.isInvalid ? 'border-sun-800' : 'border-sumi-900'
|
|
18
16
|
|
|
19
|
-
|
|
17
|
+
const style = `
|
|
20
18
|
p-4
|
|
21
19
|
rounded-lg
|
|
22
20
|
border
|
|
@@ -29,18 +27,19 @@ export const Input: React.ElementType<InputProps> = React.forwardRef<
|
|
|
29
27
|
disabled:border-sumi-500
|
|
30
28
|
`
|
|
31
29
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
30
|
+
return (
|
|
31
|
+
<input
|
|
32
|
+
type="text"
|
|
33
|
+
id={restProps.id ?? ctx.id}
|
|
34
|
+
className={cx(style, invalidStyle, className)}
|
|
35
|
+
aria-describedby={ctx.helperTextId}
|
|
36
|
+
aria-errormessage={ctx.errorMessageId}
|
|
37
|
+
aria-invalid={ctx.isInvalid ?? false}
|
|
38
|
+
ref={ref}
|
|
39
|
+
{...restProps}
|
|
40
|
+
/>
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
)
|
|
45
44
|
|
|
46
45
|
Input.displayName = 'Input'
|
|
@@ -11,60 +11,62 @@ export interface LabelControlProps
|
|
|
11
11
|
isRequired?: boolean
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
export const LabelControl
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
14
|
+
export const LabelControl = React.forwardRef<
|
|
15
|
+
HTMLLabelElement,
|
|
16
|
+
LabelControlProps
|
|
17
|
+
>((props, ref) => {
|
|
18
|
+
const id = React.useId()
|
|
19
|
+
const {
|
|
20
|
+
labelText,
|
|
21
|
+
className,
|
|
22
|
+
helperText,
|
|
23
|
+
errorMessage,
|
|
24
|
+
isInvalid,
|
|
25
|
+
isRequired,
|
|
26
|
+
children,
|
|
27
|
+
...restProps
|
|
28
|
+
} = props
|
|
27
29
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
const context = {
|
|
31
|
+
id: props.htmlFor ?? `input-${id}`,
|
|
32
|
+
helperTextId: `helper-text-${id}`,
|
|
33
|
+
errorMessageId: `error-message-${id}`,
|
|
34
|
+
isInvalid: isInvalid ?? false,
|
|
35
|
+
isRequired: isRequired ?? false
|
|
36
|
+
}
|
|
35
37
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
38
|
+
return (
|
|
39
|
+
<ControllerContext.Provider value={context}>
|
|
40
|
+
<div className={cx('mb-4', className)}>
|
|
41
|
+
<label
|
|
42
|
+
className={cx('block mb-2 text-label', isInvalid && 'text-sun-800')}
|
|
43
|
+
htmlFor={context.id}
|
|
44
|
+
ref={ref}
|
|
45
|
+
{...restProps}
|
|
46
|
+
>
|
|
47
|
+
{labelText}
|
|
48
|
+
{isRequired && <span className="text-sun-800"> *</span>}
|
|
49
|
+
</label>
|
|
50
|
+
{helperText && (
|
|
51
|
+
<p id={context.helperTextId} className="text-sup text-sumi-700 mb-2">
|
|
52
|
+
{helperText}
|
|
53
|
+
</p>
|
|
54
|
+
)}
|
|
55
|
+
{children}
|
|
56
|
+
{isInvalid && (
|
|
57
|
+
<p
|
|
58
|
+
id={context.errorMessageId}
|
|
59
|
+
className={cx(
|
|
60
|
+
'text-sup text-sun-800',
|
|
61
|
+
helperText ? 'mt-1' : 'mt-2'
|
|
62
|
+
)}
|
|
44
63
|
>
|
|
45
|
-
{
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
)}
|
|
53
|
-
{children}
|
|
54
|
-
{isInvalid && (
|
|
55
|
-
<p
|
|
56
|
-
id={context.errorMessageId}
|
|
57
|
-
className={cx(
|
|
58
|
-
'text-xs text-sun-800',
|
|
59
|
-
helperText ? 'mt-1' : 'mt-2'
|
|
60
|
-
)}
|
|
61
|
-
>
|
|
62
|
-
{errorMessage}
|
|
63
|
-
</p>
|
|
64
|
-
)}
|
|
65
|
-
</div>
|
|
66
|
-
</ControllerContext.Provider>
|
|
67
|
-
)
|
|
68
|
-
})
|
|
64
|
+
{errorMessage}
|
|
65
|
+
</p>
|
|
66
|
+
)}
|
|
67
|
+
</div>
|
|
68
|
+
</ControllerContext.Provider>
|
|
69
|
+
)
|
|
70
|
+
})
|
|
69
71
|
|
|
70
72
|
LabelControl.displayName = 'LabelControl'
|
|
@@ -4,20 +4,18 @@ import { ControllerContext } from './context'
|
|
|
4
4
|
|
|
5
5
|
export interface RadioProps extends React.ComponentPropsWithRef<'input'> {}
|
|
6
6
|
|
|
7
|
-
export const Radio
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
newProps.name = ctx.groupName
|
|
18
|
-
}
|
|
7
|
+
export const Radio = React.forwardRef<HTMLInputElement, RadioProps>(
|
|
8
|
+
(props, ref) => {
|
|
9
|
+
const { className, children, ...newProps } = props
|
|
10
|
+
const ctx = React.useContext(ControllerContext)
|
|
11
|
+
if (ctx.isRequired) {
|
|
12
|
+
newProps.required = true
|
|
13
|
+
}
|
|
14
|
+
if (ctx.groupName) {
|
|
15
|
+
newProps.name = ctx.groupName
|
|
16
|
+
}
|
|
19
17
|
|
|
20
|
-
|
|
18
|
+
const style = `
|
|
21
19
|
inline-block
|
|
22
20
|
text-base
|
|
23
21
|
cursor-pointer
|
|
@@ -25,12 +23,12 @@ export const Radio: React.ElementType<RadioProps> = React.forwardRef<
|
|
|
25
23
|
mr-4
|
|
26
24
|
|
|
27
25
|
`
|
|
28
|
-
|
|
26
|
+
const styleInput = `
|
|
29
27
|
peer
|
|
30
28
|
hidden
|
|
31
29
|
`
|
|
32
30
|
|
|
33
|
-
|
|
31
|
+
const styleRadio = `
|
|
34
32
|
bg-clip-content
|
|
35
33
|
w-6 h-6
|
|
36
34
|
ml-1
|
|
@@ -44,23 +42,24 @@ export const Radio: React.ElementType<RadioProps> = React.forwardRef<
|
|
|
44
42
|
peer-checked:border-sea-600
|
|
45
43
|
peer-disabled:border-sumi-500
|
|
46
44
|
`
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
45
|
+
return (
|
|
46
|
+
<label htmlFor={newProps.id} className={cx(style, className)}>
|
|
47
|
+
<span className="flex items-center">
|
|
48
|
+
<input
|
|
49
|
+
className={styleInput}
|
|
50
|
+
type="radio"
|
|
51
|
+
aria-describedby={ctx.helperTextId}
|
|
52
|
+
aria-errormessage={ctx.errorMessageId}
|
|
53
|
+
aria-invalid={ctx.isInvalid ?? false}
|
|
54
|
+
{...newProps}
|
|
55
|
+
ref={ref}
|
|
56
|
+
/>
|
|
57
|
+
<span className={styleRadio}></span>
|
|
58
|
+
<span className="peer-disabled:text-sumi-500">{children}</span>
|
|
59
|
+
</span>
|
|
60
|
+
</label>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
)
|
|
65
64
|
|
|
66
65
|
Radio.displayName = 'Radio'
|
|
@@ -4,19 +4,17 @@ import { ControllerContext } from './context'
|
|
|
4
4
|
|
|
5
5
|
export interface SelectProps extends React.ComponentPropsWithRef<'select'> {}
|
|
6
6
|
|
|
7
|
-
export const Select
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
restProps.required = true
|
|
15
|
-
}
|
|
7
|
+
export const Select = React.forwardRef<HTMLSelectElement, SelectProps>(
|
|
8
|
+
(props, ref) => {
|
|
9
|
+
const { className, children, ...restProps } = props
|
|
10
|
+
const ctx = React.useContext(ControllerContext)
|
|
11
|
+
if (ctx.isRequired) {
|
|
12
|
+
restProps.required = true
|
|
13
|
+
}
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
const invalidStyle = ctx.isInvalid ? 'border-sun-800' : 'border-sumi-900'
|
|
18
16
|
|
|
19
|
-
|
|
17
|
+
const style = `
|
|
20
18
|
peer
|
|
21
19
|
cursor-pointer
|
|
22
20
|
appearance-none
|
|
@@ -35,7 +33,7 @@ export const Select: React.ElementType<SelectProps> = React.forwardRef<
|
|
|
35
33
|
disabled:border-sumi-500
|
|
36
34
|
`
|
|
37
35
|
|
|
38
|
-
|
|
36
|
+
const styleArrow = `
|
|
39
37
|
flex items-center
|
|
40
38
|
absolute inset-y-0 right-0
|
|
41
39
|
px-2
|
|
@@ -43,24 +41,25 @@ export const Select: React.ElementType<SelectProps> = React.forwardRef<
|
|
|
43
41
|
peer-disabled:fill-sumi-500
|
|
44
42
|
`
|
|
45
43
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
44
|
+
return (
|
|
45
|
+
<label className="inline-block relative">
|
|
46
|
+
<select
|
|
47
|
+
id={restProps.id ?? ctx.id}
|
|
48
|
+
className={cx(style, invalidStyle, props.className)}
|
|
49
|
+
aria-describedby={ctx.helperTextId}
|
|
50
|
+
aria-errormessage={ctx.errorMessageId}
|
|
51
|
+
aria-invalid={ctx.isInvalid ?? false}
|
|
52
|
+
{...restProps}
|
|
53
|
+
ref={ref}
|
|
54
|
+
>
|
|
55
|
+
{children}
|
|
56
|
+
</select>
|
|
57
|
+
<span className={styleArrow}>
|
|
58
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24">
|
|
59
|
+
<path d="M12 15.05 6.35 9.4 7.4 8.35l4.6 4.6 4.6-4.6 1.05 1.05Z" />
|
|
60
|
+
</svg>
|
|
61
|
+
</span>
|
|
62
|
+
</label>
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
)
|
|
@@ -5,30 +5,28 @@ import { ControllerContext } from './context'
|
|
|
5
5
|
export interface TextareaProps
|
|
6
6
|
extends React.ComponentPropsWithRef<'textarea'> {}
|
|
7
7
|
|
|
8
|
-
export const Textarea
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
>((props, ref) => {
|
|
12
|
-
const { className, children, onChange, maxLength, ...restProps } = props
|
|
8
|
+
export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|
9
|
+
(props, ref) => {
|
|
10
|
+
const { className, children, onChange, maxLength, ...restProps } = props
|
|
13
11
|
|
|
14
|
-
|
|
12
|
+
const [count, setCount] = React.useState(0)
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
const onChangeHandler = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
|
15
|
+
if (onChange) onChange(e)
|
|
18
16
|
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
setCount(e.target.value.length)
|
|
18
|
+
}
|
|
21
19
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
const ctx = React.useContext(ControllerContext)
|
|
21
|
+
if (ctx.isRequired) {
|
|
22
|
+
restProps.required = true
|
|
23
|
+
}
|
|
26
24
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
const invalidStyle = ctx.isInvalid ? 'border-sun-800' : 'border-sumi-900'
|
|
26
|
+
const overtextStyle =
|
|
27
|
+
count > (maxLength || 0) ? 'text-sun-800' : 'text-sumi-700'
|
|
30
28
|
|
|
31
|
-
|
|
29
|
+
const style = `
|
|
32
30
|
p-4
|
|
33
31
|
rounded-lg
|
|
34
32
|
border
|
|
@@ -41,30 +39,31 @@ export const Textarea: React.ElementType<TextareaProps> = React.forwardRef<
|
|
|
41
39
|
disabled:border-sumi-500
|
|
42
40
|
`
|
|
43
41
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
42
|
+
return (
|
|
43
|
+
<>
|
|
44
|
+
<textarea
|
|
45
|
+
id={restProps.id ?? ctx.id}
|
|
46
|
+
className={cx(style, invalidStyle, className)}
|
|
47
|
+
aria-describedby={ctx.helperTextId}
|
|
48
|
+
aria-errormessage={ctx.errorMessageId}
|
|
49
|
+
aria-invalid={ctx.isInvalid ?? false}
|
|
50
|
+
onChange={onChangeHandler}
|
|
51
|
+
{...restProps}
|
|
52
|
+
ref={ref}
|
|
53
|
+
>
|
|
54
|
+
{children}
|
|
55
|
+
</textarea>
|
|
56
|
+
{maxLength ? (
|
|
57
|
+
<p className="text-sup text-sumi-700">
|
|
58
|
+
<span className={overtextStyle}>{count}</span>/
|
|
59
|
+
<span>{maxLength}</span>
|
|
60
|
+
</p>
|
|
61
|
+
) : (
|
|
62
|
+
''
|
|
63
|
+
)}
|
|
64
|
+
</>
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
)
|
|
69
68
|
|
|
70
69
|
Textarea.displayName = 'Textarea'
|
|
@@ -14,40 +14,42 @@ export interface CheckboxGroupProps
|
|
|
14
14
|
isRequired?: boolean
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export const CheckboxGroup
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
17
|
+
export const CheckboxGroup = React.forwardRef<
|
|
18
|
+
HTMLFieldSetElement,
|
|
19
|
+
CheckboxGroupProps
|
|
20
|
+
>((props, ref) => {
|
|
21
|
+
const {
|
|
22
|
+
items,
|
|
23
|
+
onChange,
|
|
24
|
+
className,
|
|
25
|
+
labelText,
|
|
26
|
+
helperText,
|
|
27
|
+
errorMessage,
|
|
28
|
+
isInvalid,
|
|
29
|
+
isRequired,
|
|
30
|
+
...restProps
|
|
31
|
+
} = props
|
|
30
32
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
33
|
+
return (
|
|
34
|
+
<FieldsetControl
|
|
35
|
+
className={className}
|
|
36
|
+
labelText={labelText}
|
|
37
|
+
helperText={helperText}
|
|
38
|
+
errorMessage={errorMessage}
|
|
39
|
+
isInvalid={isInvalid}
|
|
40
|
+
isRequired={isRequired}
|
|
41
|
+
ref={ref}
|
|
42
|
+
{...restProps}
|
|
43
|
+
>
|
|
44
|
+
{items.map(({ label, value }, index) => {
|
|
45
|
+
return (
|
|
46
|
+
<Checkbox key={index} value={value} onChange={onChange}>
|
|
47
|
+
{label}
|
|
48
|
+
</Checkbox>
|
|
49
|
+
)
|
|
50
|
+
})}
|
|
51
|
+
</FieldsetControl>
|
|
52
|
+
)
|
|
53
|
+
})
|
|
52
54
|
|
|
53
55
|
CheckboxGroup.displayName = 'CheckboxGroup'
|
|
@@ -15,7 +15,7 @@ export interface RadioGroupProps
|
|
|
15
15
|
defaultValue?: string
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export const RadioGroup
|
|
18
|
+
export const RadioGroup = React.forwardRef<
|
|
19
19
|
HTMLFieldSetElement,
|
|
20
20
|
RadioGroupProps
|
|
21
21
|
>((props, ref) => {
|