@sakura-ui/sakura-ui 0.1.20 → 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/package.json +16 -16
- package/packages/core/package.json +15 -14
- package/packages/core/src/components/Button.tsx +10 -4
- package/packages/core/src/components/Card.tsx +11 -8
- package/packages/core/src/components/IconButton.tsx +6 -6
- package/packages/core/src/components/Link.tsx +2 -1
- package/packages/core/src/components/Table.tsx +4 -3
- package/packages/core/src/components/buttonStyle.ts +34 -14
- package/packages/core/src/components/index.ts +0 -3
- package/packages/core/src/index.ts +0 -1
- package/packages/core/src/libs/cx.ts +1 -0
- package/packages/core/src/libs/forward-ref.ts +7 -4
- package/packages/core/src/types/component.ts +7 -6
- package/packages/core/tests/Button.test.tsx +30 -0
- package/packages/core/tests/Card.test.tsx +30 -7
- package/packages/core/tests/vitest.setup.ts +1 -0
- package/packages/core/vite.config.ts +3 -2
- package/packages/forms/dist/index.cjs.js +92 -81
- package/packages/forms/dist/index.es.js +697 -627
- package/packages/forms/dist/types/components/Checkbox.d.ts +3 -1
- package/packages/forms/dist/types/components/Checkbox.d.ts.map +1 -1
- package/packages/forms/dist/types/components/FileInput.d.ts.map +1 -1
- package/packages/forms/dist/types/components/Input.d.ts +3 -1
- package/packages/forms/dist/types/components/Input.d.ts.map +1 -1
- package/packages/forms/dist/types/components/Radio.d.ts +3 -1
- package/packages/forms/dist/types/components/Radio.d.ts.map +1 -1
- package/packages/forms/dist/types/components/Select.d.ts +3 -1
- package/packages/forms/dist/types/components/Select.d.ts.map +1 -1
- package/packages/forms/dist/types/components/Textarea.d.ts.map +1 -1
- package/packages/forms/dist/types/components/controlled/CheckboxGroup.d.ts +3 -1
- package/packages/forms/dist/types/components/controlled/CheckboxGroup.d.ts.map +1 -1
- package/packages/forms/dist/types/components/controlled/RadioGroup.d.ts +3 -1
- package/packages/forms/dist/types/components/controlled/RadioGroup.d.ts.map +1 -1
- package/packages/forms/dist/types/components/controlled/index.d.ts +0 -2
- package/packages/forms/dist/types/components/controlled/index.d.ts.map +1 -1
- package/packages/forms/dist/types/components/inputStyle.d.ts +13 -0
- package/packages/forms/dist/types/components/inputStyle.d.ts.map +1 -0
- package/packages/forms/dist/types/index.d.ts +1 -1
- package/packages/forms/dist/types/index.d.ts.map +1 -1
- package/packages/forms/dist/types/utils/class.d.ts.map +1 -1
- package/packages/forms/node_modules/.bin/acorn +17 -0
- package/packages/forms/node_modules/.bin/autoprefixer +2 -2
- package/packages/forms/node_modules/.bin/browserslist +4 -4
- package/packages/forms/node_modules/.bin/eslint +4 -4
- package/packages/forms/node_modules/.bin/tailwind +2 -2
- package/packages/forms/node_modules/.bin/tailwindcss +2 -2
- 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/vitest +4 -4
- package/packages/forms/package.json +15 -14
- package/packages/forms/src/components/Checkbox.tsx +39 -17
- package/packages/forms/src/components/FieldsetControl.tsx +1 -1
- package/packages/forms/src/components/FileInput.tsx +5 -3
- package/packages/forms/src/components/Input.tsx +16 -20
- package/packages/forms/src/components/LabelControl.tsx +2 -2
- package/packages/forms/src/components/Radio.tsx +34 -19
- package/packages/forms/src/components/Select.tsx +41 -31
- package/packages/forms/src/components/Textarea.tsx +4 -3
- package/packages/forms/src/components/controlled/CheckboxGroup.tsx +11 -3
- package/packages/forms/src/components/controlled/RadioGroup.tsx +7 -3
- package/packages/forms/src/components/controlled/index.ts +0 -2
- package/packages/forms/src/components/inputStyle.ts +83 -0
- package/packages/forms/src/index.ts +1 -6
- package/packages/forms/src/utils/class.ts +1 -0
- package/packages/forms/tests/FieldsetControl.test.tsx +2 -2
- package/packages/forms/tests/Input.test.tsx +2 -2
- package/packages/forms/tests/LabelControl.test.tsx +2 -2
- package/packages/forms/tests/Radio.test.tsx +2 -2
- package/packages/forms/tests/vitest.setup.ts +1 -0
- package/packages/forms/vite.config.ts +3 -2
- package/packages/tailwind-theme-plugin/dist/index.cjs.js +1 -0
- package/packages/tailwind-theme-plugin/dist/index.es.js +6476 -0
- package/packages/tailwind-theme-plugin/dist/types/index.d.ts +6 -0
- package/packages/tailwind-theme-plugin/dist/types/index.d.ts.map +1 -0
- package/packages/tailwind-theme-plugin/node_modules/.bin/autoprefixer +17 -0
- package/packages/tailwind-theme-plugin/node_modules/.bin/browserslist +17 -0
- package/packages/tailwind-theme-plugin/node_modules/.bin/tailwind +17 -0
- package/packages/tailwind-theme-plugin/node_modules/.bin/tailwindcss +17 -0
- package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node +17 -0
- package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-cwd +17 -0
- package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-esm +17 -0
- package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-script +17 -0
- package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-transpile-only +17 -0
- package/packages/tailwind-theme-plugin/node_modules/.bin/ts-script +17 -0
- package/packages/{config → tailwind-theme-plugin}/package.json +10 -6
- package/packages/tailwind-theme-plugin/src/index.ts +519 -0
- package/packages/{config → tailwind-theme-plugin}/vite.config.ts +1 -1
- package/packages/config/src/index.ts +0 -347
- package/packages/core/.eslintrc.json +0 -25
- package/packages/core/src/components/InfoCard.tsx +0 -50
- package/packages/forms/coverage/clover.xml +0 -209
- package/packages/forms/coverage/coverage-final.json +0 -18
- package/packages/forms/coverage/lcov-report/base.css +0 -224
- package/packages/forms/coverage/lcov-report/block-navigation.js +0 -87
- package/packages/forms/coverage/lcov-report/favicon.png +0 -0
- package/packages/forms/coverage/lcov-report/index.html +0 -161
- package/packages/forms/coverage/lcov-report/prettify.css +0 -1
- package/packages/forms/coverage/lcov-report/prettify.js +0 -2
- package/packages/forms/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/packages/forms/coverage/lcov-report/sorter.js +0 -196
- package/packages/forms/coverage/lcov-report/src/components/Checkbox.tsx.html +0 -295
- package/packages/forms/coverage/lcov-report/src/components/FieldsetControl.tsx.html +0 -295
- package/packages/forms/coverage/lcov-report/src/components/LabelControl.tsx.html +0 -289
- package/packages/forms/coverage/lcov-report/src/components/Radio.tsx.html +0 -262
- package/packages/forms/coverage/lcov-report/src/components/Select.tsx.html +0 -259
- package/packages/forms/coverage/lcov-report/src/components/Text.tsx.html +0 -220
- package/packages/forms/coverage/lcov-report/src/components/Textarea.tsx.html +0 -229
- package/packages/forms/coverage/lcov-report/src/components/context.ts.html +0 -136
- package/packages/forms/coverage/lcov-report/src/components/controlled/CheckboxGroup.tsx.html +0 -244
- package/packages/forms/coverage/lcov-report/src/components/controlled/RadioGroup.tsx.html +0 -265
- package/packages/forms/coverage/lcov-report/src/components/controlled/SelectControl.tsx.html +0 -205
- package/packages/forms/coverage/lcov-report/src/components/controlled/TextControl.tsx.html +0 -202
- package/packages/forms/coverage/lcov-report/src/components/controlled/TextareaControl.tsx.html +0 -205
- package/packages/forms/coverage/lcov-report/src/components/controlled/index.html +0 -191
- package/packages/forms/coverage/lcov-report/src/components/controlled/index.ts.html +0 -100
- package/packages/forms/coverage/lcov-report/src/components/index.html +0 -236
- package/packages/forms/coverage/lcov-report/src/components/index.ts.html +0 -106
- package/packages/forms/coverage/lcov-report/src/index.html +0 -116
- package/packages/forms/coverage/lcov-report/src/index.ts.html +0 -136
- package/packages/forms/coverage/lcov-report/src/utils/index.html +0 -116
- package/packages/forms/coverage/lcov-report/src/utils/index.ts.html +0 -88
- package/packages/forms/coverage/lcov.info +0 -434
- package/packages/forms/dist/components/Checkbox.js +0 -46
- package/packages/forms/dist/components/Checkbox.js.map +0 -1
- package/packages/forms/dist/components/FieldsetControl.js +0 -20
- package/packages/forms/dist/components/FieldsetControl.js.map +0 -1
- package/packages/forms/dist/components/FileInput.js +0 -55
- package/packages/forms/dist/components/FileInput.js.map +0 -1
- package/packages/forms/dist/components/Input.js +0 -29
- package/packages/forms/dist/components/Input.js.map +0 -1
- package/packages/forms/dist/components/LabelControl.js +0 -24
- package/packages/forms/dist/components/LabelControl.js.map +0 -1
- package/packages/forms/dist/components/Radio.js +0 -45
- package/packages/forms/dist/components/Radio.js.map +0 -1
- package/packages/forms/dist/components/Select.js +0 -41
- package/packages/forms/dist/components/Select.js.map +0 -1
- package/packages/forms/dist/components/Textarea.js +0 -36
- package/packages/forms/dist/components/Textarea.js.map +0 -1
- package/packages/forms/dist/components/context.js +0 -8
- package/packages/forms/dist/components/context.js.map +0 -1
- package/packages/forms/dist/components/controlled/CheckboxGroup.js +0 -12
- package/packages/forms/dist/components/controlled/CheckboxGroup.js.map +0 -1
- package/packages/forms/dist/components/controlled/InputItem.js +0 -2
- package/packages/forms/dist/components/controlled/InputItem.js.map +0 -1
- package/packages/forms/dist/components/controlled/RadioGroup.js +0 -12
- package/packages/forms/dist/components/controlled/RadioGroup.js.map +0 -1
- package/packages/forms/dist/components/controlled/SelectControl.js +0 -10
- package/packages/forms/dist/components/controlled/SelectControl.js.map +0 -1
- package/packages/forms/dist/components/controlled/TextareaControl.js +0 -10
- package/packages/forms/dist/components/controlled/TextareaControl.js.map +0 -1
- package/packages/forms/dist/components/controlled/index.js +0 -5
- package/packages/forms/dist/components/controlled/index.js.map +0 -1
- package/packages/forms/dist/components/index.js +0 -9
- package/packages/forms/dist/components/index.js.map +0 -1
- package/packages/forms/dist/index.js +0 -3
- package/packages/forms/dist/index.js.map +0 -1
- package/packages/forms/dist/types/components/controlled/SelectControl.d.ts +0 -10
- package/packages/forms/dist/types/components/controlled/SelectControl.d.ts.map +0 -1
- package/packages/forms/dist/types/components/controlled/TextareaControl.d.ts +0 -10
- package/packages/forms/dist/types/components/controlled/TextareaControl.d.ts.map +0 -1
- package/packages/forms/dist/utils/class.js +0 -2
- package/packages/forms/dist/utils/class.js.map +0 -1
- package/packages/forms/jest.config.ts +0 -11
- package/packages/forms/node_modules/.vitest/results.json +0 -1
- package/packages/forms/src/components/controlled/SelectControl.tsx +0 -42
- package/packages/forms/src/components/controlled/TextareaControl.tsx +0 -42
- /package/packages/{config → tailwind-theme-plugin}/tests/index.test.ts +0 -0
- /package/packages/{config → tailwind-theme-plugin}/tsconfig.json +0 -0
- /package/packages/{config → tailwind-theme-plugin}/tsconfig.node.json +0 -0
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { cx } from '../utils/class'
|
|
3
3
|
import { ControllerContext } from './context'
|
|
4
|
+
import {
|
|
5
|
+
type InputSize,
|
|
6
|
+
borderlessInputBaseStyles,
|
|
7
|
+
borderlessInputSizeStyles,
|
|
8
|
+
iconStyles
|
|
9
|
+
} from './inputStyle'
|
|
4
10
|
|
|
5
|
-
export interface CheckboxProps
|
|
11
|
+
export interface CheckboxProps
|
|
12
|
+
extends Omit<React.ComponentPropsWithRef<'input'>, 'size'> {
|
|
13
|
+
size?: InputSize
|
|
14
|
+
}
|
|
6
15
|
|
|
7
16
|
export const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(
|
|
8
17
|
(props, ref) => {
|
|
9
|
-
const { className, children, ...restProps } = props
|
|
18
|
+
const { id, className, size = 'lg', children, ...restProps } = props
|
|
19
|
+
const checkboxId = id || React.useId()
|
|
10
20
|
const ctx = React.useContext(ControllerContext)
|
|
11
21
|
if (ctx.isRequired) {
|
|
12
22
|
restProps.required = true
|
|
@@ -15,13 +25,11 @@ export const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(
|
|
|
15
25
|
restProps.name = ctx.groupName
|
|
16
26
|
}
|
|
17
27
|
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
mr-4
|
|
24
|
-
`
|
|
28
|
+
const scales: { [key in InputSize]: number } = {
|
|
29
|
+
lg: 22 / 24,
|
|
30
|
+
md: 18 / 24,
|
|
31
|
+
sm: 18 / 24
|
|
32
|
+
}
|
|
25
33
|
|
|
26
34
|
const styleInput = `
|
|
27
35
|
peer
|
|
@@ -30,15 +38,12 @@ export const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(
|
|
|
30
38
|
|
|
31
39
|
const styleCheck = `
|
|
32
40
|
bg-clip-content
|
|
33
|
-
w-6 h-6
|
|
34
|
-
ml-1
|
|
35
|
-
mr-2
|
|
36
41
|
rounded
|
|
37
42
|
border
|
|
38
43
|
border-solid
|
|
39
44
|
border-sumi-900
|
|
40
45
|
fill-transparent
|
|
41
|
-
peer-checked:fill-white
|
|
46
|
+
peer-checked:fill-white
|
|
42
47
|
peer-checked:bg-sea-600
|
|
43
48
|
peer-checked:border-none
|
|
44
49
|
peer-disabled:border-sumi-500
|
|
@@ -48,9 +53,17 @@ export const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(
|
|
|
48
53
|
`
|
|
49
54
|
|
|
50
55
|
return (
|
|
51
|
-
<label
|
|
56
|
+
<label
|
|
57
|
+
htmlFor={checkboxId}
|
|
58
|
+
className={cx(
|
|
59
|
+
borderlessInputBaseStyles,
|
|
60
|
+
borderlessInputSizeStyles[size],
|
|
61
|
+
className
|
|
62
|
+
)}
|
|
63
|
+
>
|
|
52
64
|
<span className="flex items-center">
|
|
53
65
|
<input
|
|
66
|
+
id={checkboxId}
|
|
54
67
|
className={styleInput}
|
|
55
68
|
type="checkbox"
|
|
56
69
|
aria-describedby={ctx.helperTextId}
|
|
@@ -60,9 +73,18 @@ export const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(
|
|
|
60
73
|
{...restProps}
|
|
61
74
|
ref={ref}
|
|
62
75
|
/>
|
|
63
|
-
<span className={styleCheck}>
|
|
64
|
-
<svg
|
|
65
|
-
|
|
76
|
+
<span className={cx(styleCheck, iconStyles[size])}>
|
|
77
|
+
<svg
|
|
78
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
79
|
+
aria-hidden={true}
|
|
80
|
+
width="24"
|
|
81
|
+
height="24"
|
|
82
|
+
viewBox="0 0 24 24"
|
|
83
|
+
>
|
|
84
|
+
<title>check</title>
|
|
85
|
+
<g transform={`scale(${scales[size]} ${scales[size]})`}>
|
|
86
|
+
<path d="m9.55 17.65-5.325-5.325 1.05-1.075 4.275 4.275 9.175-9.175 1.05 1.075Z" />
|
|
87
|
+
</g>
|
|
66
88
|
</svg>
|
|
67
89
|
</span>
|
|
68
90
|
<span className="peer-disabled:text-sumi-500">{children}</span>
|
|
@@ -6,7 +6,7 @@ export interface FileInputProps extends React.ComponentPropsWithRef<'input'> {}
|
|
|
6
6
|
|
|
7
7
|
export const FileInput = React.forwardRef<HTMLInputElement, FileInputProps>(
|
|
8
8
|
(props, ref) => {
|
|
9
|
-
const { className, ...restProps } = props
|
|
9
|
+
const { id, className, ...restProps } = props
|
|
10
10
|
const ctx = React.useContext(ControllerContext)
|
|
11
11
|
if (ctx.isRequired) {
|
|
12
12
|
restProps.required = true
|
|
@@ -44,11 +44,13 @@ export const FileInput = React.forwardRef<HTMLInputElement, FileInputProps>(
|
|
|
44
44
|
file:p-4
|
|
45
45
|
file:text-button
|
|
46
46
|
file:rounded-lg
|
|
47
|
+
file:leading-snug
|
|
47
48
|
`
|
|
48
49
|
const styleInput = `
|
|
50
|
+
text-label
|
|
51
|
+
text-sumi-900
|
|
49
52
|
rounded-lg
|
|
50
53
|
outline-offset-2
|
|
51
|
-
text-sumi-900
|
|
52
54
|
focus:outline
|
|
53
55
|
focus:outline-2
|
|
54
56
|
focus:outline-wood-600
|
|
@@ -58,7 +60,7 @@ export const FileInput = React.forwardRef<HTMLInputElement, FileInputProps>(
|
|
|
58
60
|
return (
|
|
59
61
|
<input
|
|
60
62
|
type="file"
|
|
61
|
-
id={
|
|
63
|
+
id={id || ctx.id}
|
|
62
64
|
className={cx(base, secondary, styleLg, styleInput, className)}
|
|
63
65
|
aria-describedby={ctx.helperTextId}
|
|
64
66
|
aria-errormessage={ctx.errorMessageId}
|
|
@@ -1,38 +1,34 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { cx } from '../utils/class'
|
|
3
3
|
import { ControllerContext } from './context'
|
|
4
|
+
import {
|
|
5
|
+
type InputSize,
|
|
6
|
+
borderedInputBaseStyles,
|
|
7
|
+
borderedInputSizeStyles
|
|
8
|
+
} from './inputStyle'
|
|
4
9
|
|
|
5
|
-
export interface InputProps
|
|
10
|
+
export interface InputProps
|
|
11
|
+
extends Omit<React.ComponentPropsWithRef<'input'>, 'size'> {
|
|
12
|
+
size?: InputSize
|
|
13
|
+
}
|
|
6
14
|
|
|
7
15
|
export const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|
8
16
|
(props, ref) => {
|
|
9
|
-
const { className, ...restProps } = props
|
|
17
|
+
const { id, className, size = 'lg', ...restProps } = props
|
|
10
18
|
const ctx = React.useContext(ControllerContext)
|
|
11
19
|
if (ctx.isRequired) {
|
|
12
20
|
restProps.required = true
|
|
13
21
|
}
|
|
14
22
|
|
|
15
|
-
const style = `
|
|
16
|
-
p-4
|
|
17
|
-
rounded-lg
|
|
18
|
-
border
|
|
19
|
-
border-solid
|
|
20
|
-
border-sumi-900
|
|
21
|
-
outline-offset-2
|
|
22
|
-
focus:outline
|
|
23
|
-
focus:outline-2
|
|
24
|
-
focus:outline-wood-500
|
|
25
|
-
disabled:bg-transparent
|
|
26
|
-
disabled:text-sumi-500
|
|
27
|
-
disabled:border-sumi-500
|
|
28
|
-
aria-invalid:border-sun-800
|
|
29
|
-
`
|
|
30
|
-
|
|
31
23
|
return (
|
|
32
24
|
<input
|
|
33
25
|
type="text"
|
|
34
|
-
id={
|
|
35
|
-
className={cx(
|
|
26
|
+
id={id || ctx.id}
|
|
27
|
+
className={cx(
|
|
28
|
+
borderedInputBaseStyles,
|
|
29
|
+
borderedInputSizeStyles[size],
|
|
30
|
+
className
|
|
31
|
+
)}
|
|
36
32
|
aria-describedby={ctx.helperTextId}
|
|
37
33
|
aria-errormessage={ctx.errorMessageId}
|
|
38
34
|
aria-invalid={ctx.isInvalid ?? false}
|
|
@@ -1,28 +1,30 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { cx } from '../utils/class'
|
|
3
3
|
import { ControllerContext } from './context'
|
|
4
|
+
import {
|
|
5
|
+
type InputSize,
|
|
6
|
+
borderlessInputBaseStyles,
|
|
7
|
+
borderlessInputSizeStyles,
|
|
8
|
+
iconStyles
|
|
9
|
+
} from './inputStyle'
|
|
4
10
|
|
|
5
|
-
export interface RadioProps
|
|
11
|
+
export interface RadioProps
|
|
12
|
+
extends Omit<React.ComponentPropsWithRef<'input'>, 'size'> {
|
|
13
|
+
size?: InputSize
|
|
14
|
+
}
|
|
6
15
|
|
|
7
16
|
export const Radio = React.forwardRef<HTMLInputElement, RadioProps>(
|
|
8
17
|
(props, ref) => {
|
|
9
|
-
const { className, children, ...
|
|
18
|
+
const { id, className, size = 'lg', children, ...restProps } = props
|
|
19
|
+
const radioId = id || React.useId()
|
|
10
20
|
const ctx = React.useContext(ControllerContext)
|
|
11
21
|
if (ctx.isRequired) {
|
|
12
|
-
|
|
22
|
+
restProps.required = true
|
|
13
23
|
}
|
|
14
24
|
if (ctx.groupName) {
|
|
15
|
-
|
|
25
|
+
restProps.name = ctx.groupName
|
|
16
26
|
}
|
|
17
27
|
|
|
18
|
-
const style = `
|
|
19
|
-
inline-block
|
|
20
|
-
text-base
|
|
21
|
-
cursor-pointer
|
|
22
|
-
py-2
|
|
23
|
-
mr-4
|
|
24
|
-
`
|
|
25
|
-
|
|
26
28
|
const styleInput = `
|
|
27
29
|
peer
|
|
28
30
|
sr-only
|
|
@@ -30,10 +32,6 @@ export const Radio = React.forwardRef<HTMLInputElement, RadioProps>(
|
|
|
30
32
|
|
|
31
33
|
const styleRadio = `
|
|
32
34
|
bg-clip-content
|
|
33
|
-
w-6 h-6
|
|
34
|
-
ml-1
|
|
35
|
-
mr-2
|
|
36
|
-
p-1
|
|
37
35
|
rounded-full
|
|
38
36
|
border
|
|
39
37
|
border-solid
|
|
@@ -46,20 +44,37 @@ export const Radio = React.forwardRef<HTMLInputElement, RadioProps>(
|
|
|
46
44
|
peer-focus-visible:ring-wood-500
|
|
47
45
|
`
|
|
48
46
|
|
|
47
|
+
const radioSizes: { [key in InputSize]: string } = {
|
|
48
|
+
lg: 'p-1',
|
|
49
|
+
md: 'p-[3px]',
|
|
50
|
+
sm: 'p-[3px]'
|
|
51
|
+
}
|
|
52
|
+
|
|
49
53
|
return (
|
|
50
|
-
<label
|
|
54
|
+
<label
|
|
55
|
+
htmlFor={radioId}
|
|
56
|
+
className={cx(
|
|
57
|
+
borderlessInputBaseStyles,
|
|
58
|
+
borderlessInputSizeStyles[size],
|
|
59
|
+
className
|
|
60
|
+
)}
|
|
61
|
+
>
|
|
51
62
|
<span className="flex items-center">
|
|
52
63
|
<input
|
|
64
|
+
id={radioId}
|
|
53
65
|
className={styleInput}
|
|
54
66
|
type="radio"
|
|
55
67
|
aria-describedby={ctx.helperTextId}
|
|
56
68
|
aria-errormessage={ctx.errorMessageId}
|
|
57
69
|
aria-invalid={ctx.isInvalid ?? false}
|
|
58
70
|
aria-required={ctx.isRequired ?? false}
|
|
59
|
-
{...
|
|
71
|
+
{...restProps}
|
|
60
72
|
ref={ref}
|
|
61
73
|
/>
|
|
62
|
-
<span
|
|
74
|
+
<span
|
|
75
|
+
aria-hidden={true}
|
|
76
|
+
className={cx(styleRadio, radioSizes[size], iconStyles[size])}
|
|
77
|
+
/>
|
|
63
78
|
<span className="peer-disabled:text-sumi-500">{children}</span>
|
|
64
79
|
</span>
|
|
65
80
|
</label>
|
|
@@ -1,52 +1,52 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { cx } from '../utils/class'
|
|
3
3
|
import { ControllerContext } from './context'
|
|
4
|
+
import {
|
|
5
|
+
type InputSize,
|
|
6
|
+
borderedInputBaseStyles,
|
|
7
|
+
borderedInputSizeStyles
|
|
8
|
+
} from './inputStyle'
|
|
4
9
|
|
|
5
|
-
export interface SelectProps
|
|
10
|
+
export interface SelectProps
|
|
11
|
+
extends Omit<React.ComponentPropsWithRef<'select'>, 'size'> {
|
|
12
|
+
size?: InputSize
|
|
13
|
+
}
|
|
6
14
|
|
|
7
15
|
export const Select = React.forwardRef<HTMLSelectElement, SelectProps>(
|
|
8
16
|
(props, ref) => {
|
|
9
|
-
const { className, children, ...restProps } = props
|
|
17
|
+
const { id, className, size = 'lg', children, ...restProps } = props
|
|
10
18
|
const ctx = React.useContext(ControllerContext)
|
|
11
19
|
if (ctx.isRequired) {
|
|
12
20
|
restProps.required = true
|
|
13
21
|
}
|
|
14
22
|
|
|
15
23
|
const style = `
|
|
24
|
+
!pr-8
|
|
16
25
|
peer
|
|
17
26
|
cursor-pointer
|
|
18
27
|
appearance-none
|
|
19
|
-
text-base
|
|
20
|
-
w-full
|
|
21
|
-
bg-white-100
|
|
22
|
-
border
|
|
23
|
-
border-solid
|
|
24
|
-
border-sumi-900
|
|
25
|
-
py-4 px-4 pr-8
|
|
26
|
-
rounded-[8px]
|
|
27
|
-
outline-offset-2
|
|
28
|
-
focus:outline
|
|
29
|
-
focus:outline-2
|
|
30
|
-
focus:outline-wood-500
|
|
31
|
-
disabled:bg-transparent
|
|
32
|
-
disabled:text-sumi-500
|
|
33
|
-
disabled:border-sumi-500
|
|
34
|
-
aria-invalid:border-sun-800
|
|
35
28
|
`
|
|
36
29
|
|
|
37
30
|
const styleArrow = `
|
|
38
|
-
flex items-center
|
|
39
|
-
absolute inset-y-0 right-0
|
|
40
|
-
px-2
|
|
41
31
|
pointer-events-none
|
|
42
|
-
|
|
32
|
+
absolute
|
|
33
|
+
right-4
|
|
34
|
+
top-1/2
|
|
35
|
+
-translate-y-1/2
|
|
36
|
+
text-sumi-900
|
|
37
|
+
peer-disabled:text-sumi-500
|
|
43
38
|
`
|
|
44
39
|
|
|
45
40
|
return (
|
|
46
|
-
<
|
|
41
|
+
<div className="inline-block relative">
|
|
47
42
|
<select
|
|
48
|
-
id={
|
|
49
|
-
className={cx(
|
|
43
|
+
id={id || ctx.id}
|
|
44
|
+
className={cx(
|
|
45
|
+
style,
|
|
46
|
+
borderedInputBaseStyles,
|
|
47
|
+
borderedInputSizeStyles[size],
|
|
48
|
+
props.className
|
|
49
|
+
)}
|
|
50
50
|
aria-describedby={ctx.helperTextId}
|
|
51
51
|
aria-errormessage={ctx.errorMessageId}
|
|
52
52
|
aria-invalid={ctx.isInvalid ?? false}
|
|
@@ -56,12 +56,22 @@ export const Select = React.forwardRef<HTMLSelectElement, SelectProps>(
|
|
|
56
56
|
>
|
|
57
57
|
{children}
|
|
58
58
|
</select>
|
|
59
|
-
<
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
59
|
+
<svg
|
|
60
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
61
|
+
aria-hidden={true}
|
|
62
|
+
className={styleArrow}
|
|
63
|
+
fill="none"
|
|
64
|
+
width="16"
|
|
65
|
+
height="16"
|
|
66
|
+
viewBox="0 0 16 16"
|
|
67
|
+
>
|
|
68
|
+
<title>arrow down</title>
|
|
69
|
+
<path
|
|
70
|
+
d="M12 15.05 6.35 9.4 7.4 8.35l4.6 4.6 4.6-4.6 1.05 1.05Z"
|
|
71
|
+
fill="currentColor"
|
|
72
|
+
/>
|
|
73
|
+
</svg>
|
|
74
|
+
</div>
|
|
65
75
|
)
|
|
66
76
|
}
|
|
67
77
|
)
|
|
@@ -7,7 +7,7 @@ export interface TextareaProps
|
|
|
7
7
|
|
|
8
8
|
export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|
9
9
|
(props, ref) => {
|
|
10
|
-
const { className, children, onChange, maxLength, ...restProps } = props
|
|
10
|
+
const { id, className, children, onChange, maxLength, ...restProps } = props
|
|
11
11
|
|
|
12
12
|
const [count, setCount] = React.useState(0)
|
|
13
13
|
|
|
@@ -27,6 +27,7 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|
|
27
27
|
|
|
28
28
|
const style = `
|
|
29
29
|
p-4
|
|
30
|
+
text-label
|
|
30
31
|
rounded-lg
|
|
31
32
|
border
|
|
32
33
|
border-solid
|
|
@@ -44,7 +45,7 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|
|
44
45
|
return (
|
|
45
46
|
<>
|
|
46
47
|
<textarea
|
|
47
|
-
id={
|
|
48
|
+
id={id || ctx.id}
|
|
48
49
|
className={cx(style, className)}
|
|
49
50
|
aria-describedby={ctx.helperTextId}
|
|
50
51
|
aria-errormessage={ctx.errorMessageId}
|
|
@@ -57,7 +58,7 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|
|
57
58
|
{children}
|
|
58
59
|
</textarea>
|
|
59
60
|
{maxLength ? (
|
|
60
|
-
<p className="text-
|
|
61
|
+
<p className="text-label text-sumi-700">
|
|
61
62
|
<span className={overtextStyle}>{count}</span>/
|
|
62
63
|
<span>{maxLength}</span>
|
|
63
64
|
</p>
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { Checkbox } from '../Checkbox'
|
|
3
3
|
import { FieldsetControl } from '../FieldsetControl'
|
|
4
|
-
import { InputItem } from './InputItem'
|
|
4
|
+
import type { InputItem } from './InputItem'
|
|
5
|
+
import type { InputSize } from '../inputStyle'
|
|
5
6
|
|
|
6
7
|
export interface CheckboxGroupProps
|
|
7
8
|
extends Omit<React.ComponentPropsWithRef<'fieldset'>, 'onChange'> {
|
|
@@ -12,6 +13,7 @@ export interface CheckboxGroupProps
|
|
|
12
13
|
errorMessage?: string
|
|
13
14
|
isInvalid?: boolean
|
|
14
15
|
isRequired?: boolean
|
|
16
|
+
size?: InputSize
|
|
15
17
|
}
|
|
16
18
|
|
|
17
19
|
export const CheckboxGroup = React.forwardRef<
|
|
@@ -27,6 +29,7 @@ export const CheckboxGroup = React.forwardRef<
|
|
|
27
29
|
errorMessage,
|
|
28
30
|
isInvalid,
|
|
29
31
|
isRequired,
|
|
32
|
+
size,
|
|
30
33
|
...restProps
|
|
31
34
|
} = props
|
|
32
35
|
|
|
@@ -41,9 +44,14 @@ export const CheckboxGroup = React.forwardRef<
|
|
|
41
44
|
ref={ref}
|
|
42
45
|
{...restProps}
|
|
43
46
|
>
|
|
44
|
-
{items.map(({ label, value }
|
|
47
|
+
{items.map(({ label, value }) => {
|
|
45
48
|
return (
|
|
46
|
-
<Checkbox
|
|
49
|
+
<Checkbox
|
|
50
|
+
key={`${label}-${value}`}
|
|
51
|
+
size={size}
|
|
52
|
+
value={value}
|
|
53
|
+
onChange={onChange}
|
|
54
|
+
>
|
|
47
55
|
{label}
|
|
48
56
|
</Checkbox>
|
|
49
57
|
)
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { Radio } from '../Radio'
|
|
3
3
|
import { FieldsetControl } from '../FieldsetControl'
|
|
4
|
-
import { InputItem } from './InputItem'
|
|
4
|
+
import type { InputItem } from './InputItem'
|
|
5
|
+
import type { InputSize } from '../inputStyle'
|
|
5
6
|
|
|
6
7
|
export interface RadioGroupProps
|
|
7
8
|
extends Omit<React.ComponentPropsWithRef<'fieldset'>, 'onChange'> {
|
|
@@ -13,6 +14,7 @@ export interface RadioGroupProps
|
|
|
13
14
|
isInvalid?: boolean
|
|
14
15
|
isRequired?: boolean
|
|
15
16
|
defaultValue?: string
|
|
17
|
+
size?: InputSize
|
|
16
18
|
}
|
|
17
19
|
|
|
18
20
|
export const RadioGroup = React.forwardRef<
|
|
@@ -29,6 +31,7 @@ export const RadioGroup = React.forwardRef<
|
|
|
29
31
|
isInvalid,
|
|
30
32
|
isRequired,
|
|
31
33
|
defaultValue,
|
|
34
|
+
size,
|
|
32
35
|
...restProps
|
|
33
36
|
} = props
|
|
34
37
|
|
|
@@ -43,10 +46,11 @@ export const RadioGroup = React.forwardRef<
|
|
|
43
46
|
ref={ref}
|
|
44
47
|
{...restProps}
|
|
45
48
|
>
|
|
46
|
-
{items.map(({ label, value }
|
|
49
|
+
{items.map(({ label, value }) => {
|
|
47
50
|
return (
|
|
48
51
|
<Radio
|
|
49
|
-
key={
|
|
52
|
+
key={`${label}-${value}`}
|
|
53
|
+
size={size}
|
|
50
54
|
value={value}
|
|
51
55
|
onChange={onChange}
|
|
52
56
|
defaultChecked={defaultValue === value}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export type InputSize = 'lg' | 'md' | 'sm'
|
|
2
|
+
|
|
3
|
+
export const borderedInputBaseStyles = `
|
|
4
|
+
bg-white
|
|
5
|
+
border
|
|
6
|
+
border-solid
|
|
7
|
+
border-sumi-900
|
|
8
|
+
outline-offset-2
|
|
9
|
+
focus:outline
|
|
10
|
+
focus:outline-2
|
|
11
|
+
focus:outline-wood-500
|
|
12
|
+
disabled:bg-transparent
|
|
13
|
+
disabled:text-sumi-500
|
|
14
|
+
disabled:border-sumi-500
|
|
15
|
+
aria-invalid:border-sun-800
|
|
16
|
+
`
|
|
17
|
+
|
|
18
|
+
// for text input and select
|
|
19
|
+
export const borderedInputSizeStyles: { [key in InputSize]: string } = {
|
|
20
|
+
// 16(p-4) * 2 + 22(text-label * leading-snug) + boader * 2 = 56px
|
|
21
|
+
lg: `
|
|
22
|
+
p-4
|
|
23
|
+
text-label
|
|
24
|
+
rounded-lg
|
|
25
|
+
leading-snug
|
|
26
|
+
`,
|
|
27
|
+
// 12(py-3) * 2 + 22(text-label * leading-snug) + boader * 2 = 48px
|
|
28
|
+
md: `
|
|
29
|
+
px-4
|
|
30
|
+
py-3
|
|
31
|
+
text-label
|
|
32
|
+
rounded-lg
|
|
33
|
+
leading-snug
|
|
34
|
+
`,
|
|
35
|
+
// 8(py-2) * 2 + 22(text-label * leading-snug) + boader * 2 = 40px
|
|
36
|
+
sm: `
|
|
37
|
+
px-3
|
|
38
|
+
py-2
|
|
39
|
+
text-label
|
|
40
|
+
rounded-md
|
|
41
|
+
leading-snug
|
|
42
|
+
`
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export const borderlessInputBaseStyles = `
|
|
46
|
+
inline-block
|
|
47
|
+
cursor-pointer
|
|
48
|
+
border
|
|
49
|
+
border-solid
|
|
50
|
+
border-transparent
|
|
51
|
+
`
|
|
52
|
+
|
|
53
|
+
// for radio and checkbox
|
|
54
|
+
export const borderlessInputSizeStyles: { [key in InputSize]: string } = {
|
|
55
|
+
// 16(p-4) * 2 + 22(text-label * leading-snug) + boader(transparent) * 2 = 56px
|
|
56
|
+
lg: `
|
|
57
|
+
pr-8
|
|
58
|
+
py-4
|
|
59
|
+
text-label
|
|
60
|
+
leading-snug
|
|
61
|
+
`,
|
|
62
|
+
// 12(py-3) * 2 + 22(text-label * leading-snug) + boader(transparent) * 2 = 48px
|
|
63
|
+
md: `
|
|
64
|
+
pr-6
|
|
65
|
+
py-3
|
|
66
|
+
text-label
|
|
67
|
+
leading-snug
|
|
68
|
+
`,
|
|
69
|
+
// 8(py-2) * 2 + 22(text-label * leading-snug) + boader(transparent) * 2 = 40px
|
|
70
|
+
sm: `
|
|
71
|
+
pr-4
|
|
72
|
+
py-2
|
|
73
|
+
text-label
|
|
74
|
+
leading-snug
|
|
75
|
+
`
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// for radio and checkbox
|
|
79
|
+
export const iconStyles: { [key in InputSize]: string } = {
|
|
80
|
+
lg: 'w-[22px] h-[22px] mr-2',
|
|
81
|
+
md: 'w-[18px] h-[18px] mr-1.5',
|
|
82
|
+
sm: 'w-[18px] h-[18px] mr-1'
|
|
83
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { describe, test, expect } from 'vitest'
|
|
2
3
|
import { render, screen } from '@testing-library/react'
|
|
3
|
-
import '@testing-library/jest-dom'
|
|
4
4
|
|
|
5
5
|
import { LabelControl, Select, Input, Textarea } from '../src'
|
|
6
6
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@testing-library/jest-dom'
|