@sakura-ui/sakura-ui 0.1.11 → 0.1.13
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/package.json +8 -8
- package/packages/config/package.json +2 -2
- package/packages/config/src/index.ts +25 -9
- package/packages/config/tsconfig.json +1 -1
- package/packages/config/vite.config.ts +1 -1
- package/packages/core/coverage/clover.xml +258 -0
- package/packages/core/coverage/coverage-final.json +15 -0
- package/packages/core/coverage/lcov-report/base.css +224 -0
- package/packages/core/coverage/lcov-report/block-navigation.js +87 -0
- package/packages/core/coverage/lcov-report/favicon.png +0 -0
- package/packages/core/coverage/lcov-report/index.html +146 -0
- package/packages/core/coverage/lcov-report/prettify.css +1 -0
- package/packages/core/coverage/lcov-report/prettify.js +2 -0
- package/packages/core/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/packages/core/coverage/lcov-report/sorter.js +196 -0
- package/packages/core/coverage/lcov-report/src/components/Button.tsx.html +301 -0
- package/packages/core/coverage/lcov-report/src/components/Card.tsx.html +397 -0
- package/packages/core/coverage/lcov-report/src/components/Code.tsx.html +142 -0
- package/packages/core/coverage/lcov-report/src/components/Heading.tsx.html +403 -0
- package/packages/core/coverage/lcov-report/src/components/Icon.tsx.html +181 -0
- package/packages/core/coverage/lcov-report/src/components/IconButton.tsx.html +376 -0
- package/packages/core/coverage/lcov-report/src/components/InfoCard.tsx.html +238 -0
- package/packages/core/coverage/lcov-report/src/components/Link.tsx.html +322 -0
- package/packages/core/coverage/lcov-report/src/components/List.tsx.html +202 -0
- package/packages/core/coverage/lcov-report/src/components/Pre.tsx.html +151 -0
- package/packages/core/coverage/lcov-report/src/components/Table.tsx.html +427 -0
- package/packages/core/coverage/lcov-report/src/components/index.html +281 -0
- package/packages/core/coverage/lcov-report/src/components/index.ts.html +124 -0
- package/packages/core/coverage/lcov-report/src/index.html +116 -0
- package/packages/core/coverage/lcov-report/src/index.ts.html +169 -0
- package/packages/core/coverage/lcov-report/src/utils/class.ts.html +88 -0
- package/packages/core/coverage/lcov-report/src/utils/index.html +116 -0
- package/packages/core/coverage/lcov.info +523 -0
- package/packages/core/jest.config.ts +11 -0
- package/packages/core/package.json +6 -2
- package/packages/core/src/components/Button.tsx +60 -53
- package/packages/core/src/components/Card.tsx +89 -8
- package/packages/core/src/components/Code.tsx +2 -2
- package/packages/core/src/components/Heading.tsx +7 -12
- package/packages/core/src/components/Icon.tsx +8 -3
- package/packages/core/src/components/IconButton.tsx +57 -49
- package/packages/core/src/components/InfoCard.tsx +15 -11
- package/packages/core/src/components/Link.tsx +27 -24
- package/packages/core/src/components/List.tsx +4 -4
- package/packages/core/src/components/Pre.tsx +2 -2
- package/packages/core/src/components/Table.tsx +17 -14
- package/packages/core/src/components/index.ts +4 -2
- package/packages/core/src/index.ts +3 -0
- package/packages/core/tests/Card.test.tsx +19 -0
- package/packages/core/tsconfig.node.json +1 -1
- package/packages/core/vite.config.ts +1 -1
- package/packages/forms/coverage/clover.xml +60 -60
- package/packages/forms/coverage/coverage-final.json +17 -17
- package/packages/forms/coverage/lcov-report/index.html +23 -23
- package/packages/forms/coverage/lcov-report/src/components/Checkbox.tsx.html +8 -8
- package/packages/forms/coverage/lcov-report/src/components/FieldsetControl.tsx.html +4 -4
- package/packages/forms/coverage/lcov-report/src/components/LabelControl.tsx.html +60 -60
- package/packages/forms/coverage/lcov-report/src/components/Radio.tsx.html +3 -3
- package/packages/forms/coverage/lcov-report/src/components/Select.tsx.html +37 -31
- package/packages/forms/coverage/lcov-report/src/components/Text.tsx.html +16 -13
- package/packages/forms/coverage/lcov-report/src/components/Textarea.tsx.html +30 -27
- package/packages/forms/coverage/lcov-report/src/components/context.ts.html +5 -2
- package/packages/forms/coverage/lcov-report/src/components/controlled/CheckboxGroup.tsx.html +3 -3
- package/packages/forms/coverage/lcov-report/src/components/controlled/RadioGroup.tsx.html +3 -3
- package/packages/forms/coverage/lcov-report/src/components/controlled/SelectControl.tsx.html +3 -3
- package/packages/forms/coverage/lcov-report/src/components/controlled/TextControl.tsx.html +3 -3
- package/packages/forms/coverage/lcov-report/src/components/controlled/TextareaControl.tsx.html +3 -3
- package/packages/forms/coverage/lcov-report/src/components/controlled/index.html +1 -1
- package/packages/forms/coverage/lcov-report/src/components/controlled/index.ts.html +1 -1
- package/packages/forms/coverage/lcov-report/src/components/index.html +37 -37
- package/packages/forms/coverage/lcov-report/src/components/index.ts.html +9 -9
- package/packages/forms/coverage/lcov-report/src/index.html +5 -5
- package/packages/forms/coverage/lcov-report/src/index.ts.html +9 -9
- package/packages/forms/coverage/lcov-report/src/utils/index.html +1 -1
- package/packages/forms/coverage/lcov-report/src/utils/index.ts.html +2 -2
- package/packages/forms/coverage/lcov.info +91 -83
- package/packages/forms/dist/components/Checkbox.d.ts +2 -2
- package/packages/forms/dist/components/Checkbox.d.ts.map +1 -1
- package/packages/forms/dist/components/Checkbox.js +43 -0
- package/packages/forms/dist/components/Checkbox.js.map +1 -0
- package/packages/forms/dist/components/FieldsetControl.d.ts +2 -2
- package/packages/forms/dist/components/FieldsetControl.d.ts.map +1 -1
- package/packages/forms/dist/components/FieldsetControl.js +20 -0
- package/packages/forms/dist/components/FieldsetControl.js.map +1 -0
- package/packages/forms/dist/components/Input.d.ts +2 -2
- package/packages/forms/dist/components/Input.d.ts.map +1 -1
- package/packages/forms/dist/components/Input.js +27 -0
- package/packages/forms/dist/components/Input.js.map +1 -0
- package/packages/forms/dist/components/LabelControl.d.ts +2 -2
- package/packages/forms/dist/components/LabelControl.d.ts.map +1 -1
- package/packages/forms/dist/components/LabelControl.js +18 -0
- package/packages/forms/dist/components/LabelControl.js.map +1 -0
- package/packages/forms/dist/components/Radio.d.ts +2 -2
- package/packages/forms/dist/components/Radio.d.ts.map +1 -1
- package/packages/forms/dist/components/Radio.js +43 -0
- package/packages/forms/dist/components/Radio.js.map +1 -0
- package/packages/forms/dist/components/Select.d.ts +2 -2
- package/packages/forms/dist/components/Select.d.ts.map +1 -1
- package/packages/forms/dist/components/Select.js +39 -0
- package/packages/forms/dist/components/Select.js.map +1 -0
- package/packages/forms/dist/components/Textarea.d.ts +2 -2
- package/packages/forms/dist/components/Textarea.d.ts.map +1 -1
- package/packages/forms/dist/components/Textarea.js +34 -0
- package/packages/forms/dist/components/Textarea.js.map +1 -0
- package/packages/forms/dist/components/context.js +8 -0
- package/packages/forms/dist/components/context.js.map +1 -0
- package/packages/forms/dist/components/controlled/CheckboxGroup.d.ts +2 -2
- package/packages/forms/dist/components/controlled/CheckboxGroup.d.ts.map +1 -1
- package/packages/forms/dist/components/controlled/CheckboxGroup.js +12 -0
- package/packages/forms/dist/components/controlled/CheckboxGroup.js.map +1 -0
- package/packages/forms/dist/components/controlled/InputItem.js +2 -0
- package/packages/forms/dist/components/controlled/InputItem.js.map +1 -0
- package/packages/forms/dist/components/controlled/RadioGroup.d.ts +2 -2
- package/packages/forms/dist/components/controlled/RadioGroup.d.ts.map +1 -1
- package/packages/forms/dist/components/controlled/RadioGroup.js +12 -0
- package/packages/forms/dist/components/controlled/RadioGroup.js.map +1 -0
- package/packages/forms/dist/components/controlled/SelectControl.d.ts +2 -2
- package/packages/forms/dist/components/controlled/SelectControl.d.ts.map +1 -1
- package/packages/forms/dist/components/controlled/SelectControl.js +10 -0
- package/packages/forms/dist/components/controlled/SelectControl.js.map +1 -0
- package/packages/forms/dist/components/controlled/TextareaControl.d.ts +2 -2
- package/packages/forms/dist/components/controlled/TextareaControl.d.ts.map +1 -1
- package/packages/forms/dist/components/controlled/TextareaControl.js +10 -0
- package/packages/forms/dist/components/controlled/TextareaControl.js.map +1 -0
- package/packages/forms/dist/components/controlled/index.d.ts +0 -1
- package/packages/forms/dist/components/controlled/index.d.ts.map +1 -1
- package/packages/forms/dist/components/controlled/index.js +5 -0
- package/packages/forms/dist/components/controlled/index.js.map +1 -0
- package/packages/forms/dist/components/index.js +8 -0
- package/packages/forms/dist/components/index.js.map +1 -0
- package/packages/forms/dist/index.cjs.js +80 -80
- package/packages/forms/dist/index.cjs.js.map +1 -1
- package/packages/forms/dist/index.d.ts +1 -1
- package/packages/forms/dist/index.d.ts.map +1 -1
- package/packages/forms/dist/index.es.js +501 -504
- package/packages/forms/dist/index.es.js.map +1 -1
- package/packages/forms/dist/index.js +3 -0
- package/packages/forms/dist/index.js.map +1 -0
- package/packages/forms/dist/utils/class.js +2 -0
- package/packages/forms/dist/utils/class.js.map +1 -0
- package/packages/forms/jest.config.ts +0 -3
- package/packages/forms/node_modules/.bin/autoprefixer +4 -4
- package/packages/forms/node_modules/.bin/browserslist +2 -2
- package/packages/forms/node_modules/.bin/jest +4 -4
- package/packages/forms/node_modules/.bin/npm-run-all +4 -4
- package/packages/forms/node_modules/.bin/run-p +4 -4
- package/packages/forms/node_modules/.bin/run-s +4 -4
- package/packages/forms/node_modules/.bin/tailwind +4 -4
- package/packages/forms/node_modules/.bin/tailwindcss +4 -4
- package/packages/forms/node_modules/.bin/ts-jest +4 -4
- package/packages/forms/node_modules/.bin/ts-node +4 -4
- package/packages/forms/node_modules/.bin/ts-node-cwd +4 -4
- package/packages/forms/node_modules/.bin/ts-node-esm +4 -4
- package/packages/forms/node_modules/.bin/ts-node-script +4 -4
- package/packages/forms/node_modules/.bin/ts-node-transpile-only +4 -4
- package/packages/forms/node_modules/.bin/ts-script +4 -4
- package/packages/forms/node_modules/.bin/tsc +4 -4
- package/packages/forms/node_modules/.bin/tsc-alias +4 -4
- package/packages/forms/node_modules/.bin/tsserver +4 -4
- package/packages/forms/node_modules/.bin/vite +4 -4
- package/packages/forms/package.json +2 -2
- package/packages/forms/src/components/Checkbox.tsx +62 -59
- package/packages/forms/src/components/FieldsetControl.tsx +62 -55
- package/packages/forms/src/components/Input.tsx +38 -35
- package/packages/forms/src/components/LabelControl.tsx +56 -52
- package/packages/forms/src/components/Radio.tsx +8 -3
- package/packages/forms/src/components/Select.tsx +57 -56
- package/packages/forms/src/components/Textarea.tsx +58 -54
- package/packages/forms/src/components/controlled/CheckboxGroup.tsx +37 -37
- package/packages/forms/src/components/controlled/RadioGroup.tsx +5 -3
- package/packages/forms/src/components/controlled/SelectControl.tsx +28 -27
- package/packages/forms/src/components/controlled/TextareaControl.tsx +28 -27
- package/packages/forms/src/components/controlled/index.ts +0 -1
- package/packages/forms/src/index.ts +0 -1
- package/packages/forms/tsconfig.node.json +1 -1
- package/packages/forms/vite.config.ts +1 -1
- package/packages/forms/dist/components/controlled/InputControl.d.ts +0 -10
- package/packages/forms/dist/components/controlled/InputControl.d.ts.map +0 -1
- package/packages/forms/src/components/controlled/InputControl.tsx +0 -39
|
@@ -2,7 +2,8 @@ import React from 'react'
|
|
|
2
2
|
import { cx } from '../utils/class'
|
|
3
3
|
import { ControllerContext } from './context'
|
|
4
4
|
|
|
5
|
-
export interface FieldsetControlProps
|
|
5
|
+
export interface FieldsetControlProps
|
|
6
|
+
extends React.ComponentPropsWithRef<'fieldset'> {
|
|
6
7
|
labelText: string
|
|
7
8
|
helperText?: string
|
|
8
9
|
errorMessage?: string
|
|
@@ -11,61 +12,67 @@ export interface FieldsetControlProps extends React.ComponentProps<'fieldset'> {
|
|
|
11
12
|
direction?: 'flex-col' | 'flex-row'
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
export const FieldsetControl
|
|
15
|
-
HTMLFieldSetElement,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
...restProps
|
|
29
|
-
} = props
|
|
15
|
+
export const FieldsetControl: React.ElementType<FieldsetControlProps> =
|
|
16
|
+
React.forwardRef<HTMLFieldSetElement, FieldsetControlProps>((props, ref) => {
|
|
17
|
+
const id = React.useId()
|
|
18
|
+
const {
|
|
19
|
+
labelText,
|
|
20
|
+
className,
|
|
21
|
+
helperText,
|
|
22
|
+
errorMessage,
|
|
23
|
+
isInvalid,
|
|
24
|
+
isRequired,
|
|
25
|
+
direction,
|
|
26
|
+
children,
|
|
27
|
+
...restProps
|
|
28
|
+
} = props
|
|
30
29
|
|
|
31
|
-
|
|
30
|
+
const groupName = restProps.name ?? `group-${id}`
|
|
32
31
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
const context = {
|
|
33
|
+
groupName: groupName,
|
|
34
|
+
helperTextId: `helper-text-${id}`,
|
|
35
|
+
errorMessageId: `error-message-${id}`,
|
|
36
|
+
isInvalid: isInvalid ?? false,
|
|
37
|
+
isRequired: isRequired ?? false
|
|
38
|
+
}
|
|
40
39
|
|
|
41
|
-
|
|
40
|
+
const styleDirection = direction ?? 'flex-col'
|
|
42
41
|
|
|
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
|
-
}
|
|
42
|
+
return (
|
|
43
|
+
<ControllerContext.Provider value={context}>
|
|
44
|
+
<fieldset className={cx('mb-4', className)} ref={ref} {...restProps}>
|
|
45
|
+
<legend>
|
|
46
|
+
<p
|
|
47
|
+
className={cx(
|
|
48
|
+
'block mb-2 text-label',
|
|
49
|
+
isInvalid && 'text-sun-800'
|
|
50
|
+
)}
|
|
51
|
+
>
|
|
52
|
+
{labelText}
|
|
53
|
+
{isRequired && <span className="text-sun-800"> *</span>}
|
|
54
|
+
</p>
|
|
55
|
+
</legend>
|
|
56
|
+
<div className={cx('inline-flex', styleDirection)}>{children}</div>
|
|
57
|
+
{helperText && (
|
|
58
|
+
<p id={context.helperTextId} className="text-xs text-sumi-700 mt-2">
|
|
59
|
+
{helperText}
|
|
60
|
+
</p>
|
|
61
|
+
)}
|
|
62
|
+
{isInvalid && (
|
|
63
|
+
<p
|
|
64
|
+
id={context.errorMessageId}
|
|
65
|
+
className={cx(
|
|
66
|
+
'text-xs text-sun-800',
|
|
67
|
+
helperText ? 'mt-1' : 'mt-2'
|
|
68
|
+
)}
|
|
69
|
+
>
|
|
70
|
+
{errorMessage}
|
|
71
|
+
</p>
|
|
72
|
+
)}
|
|
73
|
+
</fieldset>
|
|
74
|
+
</ControllerContext.Provider>
|
|
75
|
+
)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
FieldsetControl.displayName = 'FieldsetControl'
|
|
@@ -2,42 +2,45 @@ import React from 'react'
|
|
|
2
2
|
import { cx } from '../utils/class'
|
|
3
3
|
import { ControllerContext } from './context'
|
|
4
4
|
|
|
5
|
-
export interface InputProps extends React.
|
|
5
|
+
export interface InputProps extends React.ComponentPropsWithRef<'input'> {}
|
|
6
6
|
|
|
7
|
-
export const Input = React.forwardRef<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
export const Input: React.ElementType<InputProps> = React.forwardRef<
|
|
8
|
+
HTMLInputElement,
|
|
9
|
+
InputProps
|
|
10
|
+
>((props, ref) => {
|
|
11
|
+
const { className, ...restProps } = props
|
|
12
|
+
const ctx = React.useContext(ControllerContext)
|
|
13
|
+
if (ctx.isRequired) {
|
|
14
|
+
restProps.required = true
|
|
15
|
+
}
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
const invalidStyle = ctx.isInvalid ? 'border-sun-800' : 'border-sumi-900'
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
19
|
+
const style = `
|
|
20
|
+
p-4
|
|
21
|
+
rounded-lg
|
|
22
|
+
border
|
|
23
|
+
border-solid
|
|
24
|
+
focus:outline
|
|
25
|
+
focus:outline-2
|
|
26
|
+
focus:outline-wood-500
|
|
27
|
+
disabled:bg-transparent
|
|
28
|
+
disabled:text-sumi-500
|
|
29
|
+
disabled:border-sumi-500
|
|
30
|
+
`
|
|
29
31
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
32
|
+
return (
|
|
33
|
+
<input
|
|
34
|
+
type="text"
|
|
35
|
+
id={restProps.id ?? ctx.id}
|
|
36
|
+
className={cx(style, invalidStyle, className)}
|
|
37
|
+
aria-describedby={ctx.helperTextId}
|
|
38
|
+
aria-errormessage={ctx.errorMessageId}
|
|
39
|
+
aria-invalid={ctx.isInvalid ?? false}
|
|
40
|
+
ref={ref}
|
|
41
|
+
{...restProps}
|
|
42
|
+
/>
|
|
43
|
+
)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
Input.displayName = 'Input'
|
|
@@ -2,7 +2,8 @@ import React from 'react'
|
|
|
2
2
|
import { cx } from '../utils/class'
|
|
3
3
|
import { ControllerContext } from './context'
|
|
4
4
|
|
|
5
|
-
export interface LabelControlProps
|
|
5
|
+
export interface LabelControlProps
|
|
6
|
+
extends React.ComponentPropsWithRef<'label'> {
|
|
6
7
|
labelText: string
|
|
7
8
|
helperText?: string
|
|
8
9
|
errorMessage?: string
|
|
@@ -10,57 +11,60 @@ export interface LabelControlProps extends React.ComponentProps<'label'> {
|
|
|
10
11
|
isRequired?: boolean
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
export const LabelControl
|
|
14
|
-
HTMLLabelElement,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
...restProps
|
|
27
|
-
} = props
|
|
14
|
+
export const LabelControl: React.ElementType<LabelControlProps> =
|
|
15
|
+
React.forwardRef<HTMLLabelElement, LabelControlProps>((props, ref) => {
|
|
16
|
+
const id = React.useId()
|
|
17
|
+
const {
|
|
18
|
+
labelText,
|
|
19
|
+
className,
|
|
20
|
+
helperText,
|
|
21
|
+
errorMessage,
|
|
22
|
+
isInvalid,
|
|
23
|
+
isRequired,
|
|
24
|
+
children,
|
|
25
|
+
...restProps
|
|
26
|
+
} = props
|
|
28
27
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
const context = {
|
|
29
|
+
id: props.htmlFor ?? `input-${id}`,
|
|
30
|
+
helperTextId: `helper-text-${id}`,
|
|
31
|
+
errorMessageId: `error-message-${id}`,
|
|
32
|
+
isInvalid: isInvalid ?? false,
|
|
33
|
+
isRequired: isRequired ?? false
|
|
34
|
+
}
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
>
|
|
46
|
-
{labelText}
|
|
47
|
-
{isRequired && <span className="text-sun-800"> *</span>}
|
|
48
|
-
</label>
|
|
49
|
-
{helperText && (
|
|
50
|
-
<p id={context.helperTextId} className="text-xs text-sumi-700 mb-2">
|
|
51
|
-
{helperText}
|
|
52
|
-
</p>
|
|
53
|
-
)}
|
|
54
|
-
{children}
|
|
55
|
-
{isInvalid && (
|
|
56
|
-
<p
|
|
57
|
-
id={context.errorMessageId}
|
|
58
|
-
className={cx('text-xs text-sun-800', helperText ? 'mt-1' : 'mt-2')}
|
|
36
|
+
return (
|
|
37
|
+
<ControllerContext.Provider value={context}>
|
|
38
|
+
<div className={cx('mb-4', className)}>
|
|
39
|
+
<label
|
|
40
|
+
className={cx('block mb-2 text-label', isInvalid && 'text-sun-800')}
|
|
41
|
+
htmlFor={context.id}
|
|
42
|
+
ref={ref}
|
|
43
|
+
{...restProps}
|
|
59
44
|
>
|
|
60
|
-
{
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
45
|
+
{labelText}
|
|
46
|
+
{isRequired && <span className="text-sun-800"> *</span>}
|
|
47
|
+
</label>
|
|
48
|
+
{helperText && (
|
|
49
|
+
<p id={context.helperTextId} className="text-xs text-sumi-700 mb-2">
|
|
50
|
+
{helperText}
|
|
51
|
+
</p>
|
|
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
|
+
})
|
|
69
|
+
|
|
70
|
+
LabelControl.displayName = 'LabelControl'
|
|
@@ -2,9 +2,12 @@ import React from 'react'
|
|
|
2
2
|
import { cx } from '../utils/class'
|
|
3
3
|
import { ControllerContext } from './context'
|
|
4
4
|
|
|
5
|
-
export interface
|
|
5
|
+
export interface RadioProps extends React.ComponentPropsWithRef<'input'> {}
|
|
6
6
|
|
|
7
|
-
export const Radio = React.forwardRef<
|
|
7
|
+
export const Radio: React.ElementType<RadioProps> = React.forwardRef<
|
|
8
|
+
HTMLInputElement,
|
|
9
|
+
RadioProps
|
|
10
|
+
>((props, ref) => {
|
|
8
11
|
const { className, children, ...newProps } = props
|
|
9
12
|
const ctx = React.useContext(ControllerContext)
|
|
10
13
|
if (ctx.isRequired) {
|
|
@@ -58,4 +61,6 @@ export const Radio = React.forwardRef<HTMLInputElement, Props>((props, ref) => {
|
|
|
58
61
|
</span>
|
|
59
62
|
</label>
|
|
60
63
|
)
|
|
61
|
-
})
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
Radio.displayName = 'Radio'
|
|
@@ -2,64 +2,65 @@ import React from 'react'
|
|
|
2
2
|
import { cx } from '../utils/class'
|
|
3
3
|
import { ControllerContext } from './context'
|
|
4
4
|
|
|
5
|
-
export interface SelectProps extends React.
|
|
5
|
+
export interface SelectProps extends React.ComponentPropsWithRef<'select'> {}
|
|
6
6
|
|
|
7
|
-
export const Select = React.forwardRef<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
export const Select: React.ElementType<SelectProps> = React.forwardRef<
|
|
8
|
+
HTMLSelectElement,
|
|
9
|
+
SelectProps
|
|
10
|
+
>((props, ref) => {
|
|
11
|
+
const { className, children, ...restProps } = props
|
|
12
|
+
const ctx = React.useContext(ControllerContext)
|
|
13
|
+
if (ctx.isRequired) {
|
|
14
|
+
restProps.required = true
|
|
15
|
+
}
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
const invalidStyle = ctx.isInvalid ? 'border-sun-800' : 'border-sumi-900'
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
19
|
+
const style = `
|
|
20
|
+
peer
|
|
21
|
+
cursor-pointer
|
|
22
|
+
appearance-none
|
|
23
|
+
text-base
|
|
24
|
+
w-full
|
|
25
|
+
bg-white-100
|
|
26
|
+
border
|
|
27
|
+
border-solid
|
|
28
|
+
py-4 px-4 pr-8
|
|
29
|
+
rounded-[8px]
|
|
30
|
+
focus:outline
|
|
31
|
+
focus:outline-2
|
|
32
|
+
focus:outline-wood-500
|
|
33
|
+
disabled:bg-transparent
|
|
34
|
+
disabled:text-sumi-500
|
|
35
|
+
disabled:border-sumi-500
|
|
36
|
+
`
|
|
35
37
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
const styleArrow = `
|
|
39
|
+
flex items-center
|
|
40
|
+
absolute inset-y-0 right-0
|
|
41
|
+
px-2
|
|
42
|
+
pointer-events-none
|
|
43
|
+
peer-disabled:fill-sumi-500
|
|
44
|
+
`
|
|
43
45
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
) as React.ElementType
|
|
46
|
+
return (
|
|
47
|
+
<label className="inline-block relative">
|
|
48
|
+
<select
|
|
49
|
+
id={restProps.id ?? ctx.id}
|
|
50
|
+
className={cx(style, invalidStyle, props.className)}
|
|
51
|
+
aria-describedby={ctx.helperTextId}
|
|
52
|
+
aria-errormessage={ctx.errorMessageId}
|
|
53
|
+
aria-invalid={ctx.isInvalid ?? false}
|
|
54
|
+
{...restProps}
|
|
55
|
+
ref={ref}
|
|
56
|
+
>
|
|
57
|
+
{children}
|
|
58
|
+
</select>
|
|
59
|
+
<span className={styleArrow}>
|
|
60
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24">
|
|
61
|
+
<path d="M12 15.05 6.35 9.4 7.4 8.35l4.6 4.6 4.6-4.6 1.05 1.05Z" />
|
|
62
|
+
</svg>
|
|
63
|
+
</span>
|
|
64
|
+
</label>
|
|
65
|
+
)
|
|
66
|
+
})
|
|
@@ -2,65 +2,69 @@ import React from 'react'
|
|
|
2
2
|
import { cx } from '../utils/class'
|
|
3
3
|
import { ControllerContext } from './context'
|
|
4
4
|
|
|
5
|
-
export interface TextareaProps
|
|
5
|
+
export interface TextareaProps
|
|
6
|
+
extends React.ComponentPropsWithRef<'textarea'> {}
|
|
6
7
|
|
|
7
|
-
export const Textarea = React.forwardRef<
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
export const Textarea: React.ElementType<TextareaProps> = React.forwardRef<
|
|
9
|
+
HTMLTextAreaElement,
|
|
10
|
+
TextareaProps
|
|
11
|
+
>((props, ref) => {
|
|
12
|
+
const { className, children, onChange, maxLength, ...restProps } = props
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
const [count, setCount] = React.useState(0)
|
|
12
15
|
|
|
13
|
-
|
|
14
|
-
|
|
16
|
+
const onChangeHandler = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
|
17
|
+
if (onChange) onChange(e)
|
|
15
18
|
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
setCount(e.target.value.length)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const ctx = React.useContext(ControllerContext)
|
|
23
|
+
if (ctx.isRequired) {
|
|
24
|
+
restProps.required = true
|
|
25
|
+
}
|
|
18
26
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
27
|
+
const invalidStyle = ctx.isInvalid ? 'border-sun-800' : 'border-sumi-900'
|
|
28
|
+
const overtextStyle =
|
|
29
|
+
count > (maxLength || 0) ? 'text-sun-800' : 'text-sumi-700'
|
|
23
30
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
31
|
+
const style = `
|
|
32
|
+
p-4
|
|
33
|
+
rounded-lg
|
|
34
|
+
border
|
|
35
|
+
border-solid
|
|
36
|
+
focus:outline
|
|
37
|
+
focus:outline-2
|
|
38
|
+
focus:outline-wood-500
|
|
39
|
+
disabled:bg-transparent
|
|
40
|
+
disabled:text-sumi-500
|
|
41
|
+
disabled:border-sumi-500
|
|
42
|
+
`
|
|
27
43
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
return (
|
|
45
|
+
<>
|
|
46
|
+
<textarea
|
|
47
|
+
id={restProps.id ?? ctx.id}
|
|
48
|
+
className={cx(style, invalidStyle, className)}
|
|
49
|
+
aria-describedby={ctx.helperTextId}
|
|
50
|
+
aria-errormessage={ctx.errorMessageId}
|
|
51
|
+
aria-invalid={ctx.isInvalid ?? false}
|
|
52
|
+
onChange={onChangeHandler}
|
|
53
|
+
{...restProps}
|
|
54
|
+
ref={ref}
|
|
55
|
+
>
|
|
56
|
+
{children}
|
|
57
|
+
</textarea>
|
|
58
|
+
{maxLength ? (
|
|
59
|
+
<p className="text-xs text-sumi-700">
|
|
60
|
+
<span className={overtextStyle}>{count}</span>/
|
|
61
|
+
<span>{maxLength}</span>
|
|
62
|
+
</p>
|
|
63
|
+
) : (
|
|
64
|
+
''
|
|
65
|
+
)}
|
|
66
|
+
</>
|
|
67
|
+
)
|
|
68
|
+
})
|
|
40
69
|
|
|
41
|
-
|
|
42
|
-
<>
|
|
43
|
-
<textarea
|
|
44
|
-
id={restProps.id ?? ctx.id}
|
|
45
|
-
className={cx(style, invalidStyle, className)}
|
|
46
|
-
aria-describedby={ctx.helperTextId}
|
|
47
|
-
aria-errormessage={ctx.errorMessageId}
|
|
48
|
-
aria-invalid={ctx.isInvalid ?? false}
|
|
49
|
-
onChange={onChangeHandler}
|
|
50
|
-
{...restProps}
|
|
51
|
-
ref={ref}
|
|
52
|
-
>
|
|
53
|
-
{children}
|
|
54
|
-
</textarea>
|
|
55
|
-
{maxLength ? (
|
|
56
|
-
<p className="text-xs text-sumi-700">
|
|
57
|
-
<span className={overtextStyle}>{count}</span>/
|
|
58
|
-
<span>{maxLength}</span>
|
|
59
|
-
</p>
|
|
60
|
-
) : (
|
|
61
|
-
''
|
|
62
|
-
)}
|
|
63
|
-
</>
|
|
64
|
-
)
|
|
65
|
-
}
|
|
66
|
-
) as React.ElementType
|
|
70
|
+
Textarea.displayName = 'Textarea'
|