@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.
Files changed (179) hide show
  1. package/package.json +8 -8
  2. package/packages/config/package.json +2 -2
  3. package/packages/config/src/index.ts +25 -9
  4. package/packages/config/tsconfig.json +1 -1
  5. package/packages/config/vite.config.ts +1 -1
  6. package/packages/core/coverage/clover.xml +258 -0
  7. package/packages/core/coverage/coverage-final.json +15 -0
  8. package/packages/core/coverage/lcov-report/base.css +224 -0
  9. package/packages/core/coverage/lcov-report/block-navigation.js +87 -0
  10. package/packages/core/coverage/lcov-report/favicon.png +0 -0
  11. package/packages/core/coverage/lcov-report/index.html +146 -0
  12. package/packages/core/coverage/lcov-report/prettify.css +1 -0
  13. package/packages/core/coverage/lcov-report/prettify.js +2 -0
  14. package/packages/core/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  15. package/packages/core/coverage/lcov-report/sorter.js +196 -0
  16. package/packages/core/coverage/lcov-report/src/components/Button.tsx.html +301 -0
  17. package/packages/core/coverage/lcov-report/src/components/Card.tsx.html +397 -0
  18. package/packages/core/coverage/lcov-report/src/components/Code.tsx.html +142 -0
  19. package/packages/core/coverage/lcov-report/src/components/Heading.tsx.html +403 -0
  20. package/packages/core/coverage/lcov-report/src/components/Icon.tsx.html +181 -0
  21. package/packages/core/coverage/lcov-report/src/components/IconButton.tsx.html +376 -0
  22. package/packages/core/coverage/lcov-report/src/components/InfoCard.tsx.html +238 -0
  23. package/packages/core/coverage/lcov-report/src/components/Link.tsx.html +322 -0
  24. package/packages/core/coverage/lcov-report/src/components/List.tsx.html +202 -0
  25. package/packages/core/coverage/lcov-report/src/components/Pre.tsx.html +151 -0
  26. package/packages/core/coverage/lcov-report/src/components/Table.tsx.html +427 -0
  27. package/packages/core/coverage/lcov-report/src/components/index.html +281 -0
  28. package/packages/core/coverage/lcov-report/src/components/index.ts.html +124 -0
  29. package/packages/core/coverage/lcov-report/src/index.html +116 -0
  30. package/packages/core/coverage/lcov-report/src/index.ts.html +169 -0
  31. package/packages/core/coverage/lcov-report/src/utils/class.ts.html +88 -0
  32. package/packages/core/coverage/lcov-report/src/utils/index.html +116 -0
  33. package/packages/core/coverage/lcov.info +523 -0
  34. package/packages/core/jest.config.ts +11 -0
  35. package/packages/core/package.json +6 -2
  36. package/packages/core/src/components/Button.tsx +60 -53
  37. package/packages/core/src/components/Card.tsx +89 -8
  38. package/packages/core/src/components/Code.tsx +2 -2
  39. package/packages/core/src/components/Heading.tsx +7 -12
  40. package/packages/core/src/components/Icon.tsx +8 -3
  41. package/packages/core/src/components/IconButton.tsx +57 -49
  42. package/packages/core/src/components/InfoCard.tsx +15 -11
  43. package/packages/core/src/components/Link.tsx +27 -24
  44. package/packages/core/src/components/List.tsx +4 -4
  45. package/packages/core/src/components/Pre.tsx +2 -2
  46. package/packages/core/src/components/Table.tsx +17 -14
  47. package/packages/core/src/components/index.ts +4 -2
  48. package/packages/core/src/index.ts +3 -0
  49. package/packages/core/tests/Card.test.tsx +19 -0
  50. package/packages/core/tsconfig.node.json +1 -1
  51. package/packages/core/vite.config.ts +1 -1
  52. package/packages/forms/coverage/clover.xml +60 -60
  53. package/packages/forms/coverage/coverage-final.json +17 -17
  54. package/packages/forms/coverage/lcov-report/index.html +23 -23
  55. package/packages/forms/coverage/lcov-report/src/components/Checkbox.tsx.html +8 -8
  56. package/packages/forms/coverage/lcov-report/src/components/FieldsetControl.tsx.html +4 -4
  57. package/packages/forms/coverage/lcov-report/src/components/LabelControl.tsx.html +60 -60
  58. package/packages/forms/coverage/lcov-report/src/components/Radio.tsx.html +3 -3
  59. package/packages/forms/coverage/lcov-report/src/components/Select.tsx.html +37 -31
  60. package/packages/forms/coverage/lcov-report/src/components/Text.tsx.html +16 -13
  61. package/packages/forms/coverage/lcov-report/src/components/Textarea.tsx.html +30 -27
  62. package/packages/forms/coverage/lcov-report/src/components/context.ts.html +5 -2
  63. package/packages/forms/coverage/lcov-report/src/components/controlled/CheckboxGroup.tsx.html +3 -3
  64. package/packages/forms/coverage/lcov-report/src/components/controlled/RadioGroup.tsx.html +3 -3
  65. package/packages/forms/coverage/lcov-report/src/components/controlled/SelectControl.tsx.html +3 -3
  66. package/packages/forms/coverage/lcov-report/src/components/controlled/TextControl.tsx.html +3 -3
  67. package/packages/forms/coverage/lcov-report/src/components/controlled/TextareaControl.tsx.html +3 -3
  68. package/packages/forms/coverage/lcov-report/src/components/controlled/index.html +1 -1
  69. package/packages/forms/coverage/lcov-report/src/components/controlled/index.ts.html +1 -1
  70. package/packages/forms/coverage/lcov-report/src/components/index.html +37 -37
  71. package/packages/forms/coverage/lcov-report/src/components/index.ts.html +9 -9
  72. package/packages/forms/coverage/lcov-report/src/index.html +5 -5
  73. package/packages/forms/coverage/lcov-report/src/index.ts.html +9 -9
  74. package/packages/forms/coverage/lcov-report/src/utils/index.html +1 -1
  75. package/packages/forms/coverage/lcov-report/src/utils/index.ts.html +2 -2
  76. package/packages/forms/coverage/lcov.info +91 -83
  77. package/packages/forms/dist/components/Checkbox.d.ts +2 -2
  78. package/packages/forms/dist/components/Checkbox.d.ts.map +1 -1
  79. package/packages/forms/dist/components/Checkbox.js +43 -0
  80. package/packages/forms/dist/components/Checkbox.js.map +1 -0
  81. package/packages/forms/dist/components/FieldsetControl.d.ts +2 -2
  82. package/packages/forms/dist/components/FieldsetControl.d.ts.map +1 -1
  83. package/packages/forms/dist/components/FieldsetControl.js +20 -0
  84. package/packages/forms/dist/components/FieldsetControl.js.map +1 -0
  85. package/packages/forms/dist/components/Input.d.ts +2 -2
  86. package/packages/forms/dist/components/Input.d.ts.map +1 -1
  87. package/packages/forms/dist/components/Input.js +27 -0
  88. package/packages/forms/dist/components/Input.js.map +1 -0
  89. package/packages/forms/dist/components/LabelControl.d.ts +2 -2
  90. package/packages/forms/dist/components/LabelControl.d.ts.map +1 -1
  91. package/packages/forms/dist/components/LabelControl.js +18 -0
  92. package/packages/forms/dist/components/LabelControl.js.map +1 -0
  93. package/packages/forms/dist/components/Radio.d.ts +2 -2
  94. package/packages/forms/dist/components/Radio.d.ts.map +1 -1
  95. package/packages/forms/dist/components/Radio.js +43 -0
  96. package/packages/forms/dist/components/Radio.js.map +1 -0
  97. package/packages/forms/dist/components/Select.d.ts +2 -2
  98. package/packages/forms/dist/components/Select.d.ts.map +1 -1
  99. package/packages/forms/dist/components/Select.js +39 -0
  100. package/packages/forms/dist/components/Select.js.map +1 -0
  101. package/packages/forms/dist/components/Textarea.d.ts +2 -2
  102. package/packages/forms/dist/components/Textarea.d.ts.map +1 -1
  103. package/packages/forms/dist/components/Textarea.js +34 -0
  104. package/packages/forms/dist/components/Textarea.js.map +1 -0
  105. package/packages/forms/dist/components/context.js +8 -0
  106. package/packages/forms/dist/components/context.js.map +1 -0
  107. package/packages/forms/dist/components/controlled/CheckboxGroup.d.ts +2 -2
  108. package/packages/forms/dist/components/controlled/CheckboxGroup.d.ts.map +1 -1
  109. package/packages/forms/dist/components/controlled/CheckboxGroup.js +12 -0
  110. package/packages/forms/dist/components/controlled/CheckboxGroup.js.map +1 -0
  111. package/packages/forms/dist/components/controlled/InputItem.js +2 -0
  112. package/packages/forms/dist/components/controlled/InputItem.js.map +1 -0
  113. package/packages/forms/dist/components/controlled/RadioGroup.d.ts +2 -2
  114. package/packages/forms/dist/components/controlled/RadioGroup.d.ts.map +1 -1
  115. package/packages/forms/dist/components/controlled/RadioGroup.js +12 -0
  116. package/packages/forms/dist/components/controlled/RadioGroup.js.map +1 -0
  117. package/packages/forms/dist/components/controlled/SelectControl.d.ts +2 -2
  118. package/packages/forms/dist/components/controlled/SelectControl.d.ts.map +1 -1
  119. package/packages/forms/dist/components/controlled/SelectControl.js +10 -0
  120. package/packages/forms/dist/components/controlled/SelectControl.js.map +1 -0
  121. package/packages/forms/dist/components/controlled/TextareaControl.d.ts +2 -2
  122. package/packages/forms/dist/components/controlled/TextareaControl.d.ts.map +1 -1
  123. package/packages/forms/dist/components/controlled/TextareaControl.js +10 -0
  124. package/packages/forms/dist/components/controlled/TextareaControl.js.map +1 -0
  125. package/packages/forms/dist/components/controlled/index.d.ts +0 -1
  126. package/packages/forms/dist/components/controlled/index.d.ts.map +1 -1
  127. package/packages/forms/dist/components/controlled/index.js +5 -0
  128. package/packages/forms/dist/components/controlled/index.js.map +1 -0
  129. package/packages/forms/dist/components/index.js +8 -0
  130. package/packages/forms/dist/components/index.js.map +1 -0
  131. package/packages/forms/dist/index.cjs.js +80 -80
  132. package/packages/forms/dist/index.cjs.js.map +1 -1
  133. package/packages/forms/dist/index.d.ts +1 -1
  134. package/packages/forms/dist/index.d.ts.map +1 -1
  135. package/packages/forms/dist/index.es.js +501 -504
  136. package/packages/forms/dist/index.es.js.map +1 -1
  137. package/packages/forms/dist/index.js +3 -0
  138. package/packages/forms/dist/index.js.map +1 -0
  139. package/packages/forms/dist/utils/class.js +2 -0
  140. package/packages/forms/dist/utils/class.js.map +1 -0
  141. package/packages/forms/jest.config.ts +0 -3
  142. package/packages/forms/node_modules/.bin/autoprefixer +4 -4
  143. package/packages/forms/node_modules/.bin/browserslist +2 -2
  144. package/packages/forms/node_modules/.bin/jest +4 -4
  145. package/packages/forms/node_modules/.bin/npm-run-all +4 -4
  146. package/packages/forms/node_modules/.bin/run-p +4 -4
  147. package/packages/forms/node_modules/.bin/run-s +4 -4
  148. package/packages/forms/node_modules/.bin/tailwind +4 -4
  149. package/packages/forms/node_modules/.bin/tailwindcss +4 -4
  150. package/packages/forms/node_modules/.bin/ts-jest +4 -4
  151. package/packages/forms/node_modules/.bin/ts-node +4 -4
  152. package/packages/forms/node_modules/.bin/ts-node-cwd +4 -4
  153. package/packages/forms/node_modules/.bin/ts-node-esm +4 -4
  154. package/packages/forms/node_modules/.bin/ts-node-script +4 -4
  155. package/packages/forms/node_modules/.bin/ts-node-transpile-only +4 -4
  156. package/packages/forms/node_modules/.bin/ts-script +4 -4
  157. package/packages/forms/node_modules/.bin/tsc +4 -4
  158. package/packages/forms/node_modules/.bin/tsc-alias +4 -4
  159. package/packages/forms/node_modules/.bin/tsserver +4 -4
  160. package/packages/forms/node_modules/.bin/vite +4 -4
  161. package/packages/forms/package.json +2 -2
  162. package/packages/forms/src/components/Checkbox.tsx +62 -59
  163. package/packages/forms/src/components/FieldsetControl.tsx +62 -55
  164. package/packages/forms/src/components/Input.tsx +38 -35
  165. package/packages/forms/src/components/LabelControl.tsx +56 -52
  166. package/packages/forms/src/components/Radio.tsx +8 -3
  167. package/packages/forms/src/components/Select.tsx +57 -56
  168. package/packages/forms/src/components/Textarea.tsx +58 -54
  169. package/packages/forms/src/components/controlled/CheckboxGroup.tsx +37 -37
  170. package/packages/forms/src/components/controlled/RadioGroup.tsx +5 -3
  171. package/packages/forms/src/components/controlled/SelectControl.tsx +28 -27
  172. package/packages/forms/src/components/controlled/TextareaControl.tsx +28 -27
  173. package/packages/forms/src/components/controlled/index.ts +0 -1
  174. package/packages/forms/src/index.ts +0 -1
  175. package/packages/forms/tsconfig.node.json +1 -1
  176. package/packages/forms/vite.config.ts +1 -1
  177. package/packages/forms/dist/components/controlled/InputControl.d.ts +0 -10
  178. package/packages/forms/dist/components/controlled/InputControl.d.ts.map +0 -1
  179. 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 extends React.ComponentProps<'fieldset'> {
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 = React.forwardRef<
15
- HTMLFieldSetElement,
16
- FieldsetControlProps
17
- >((props, ref) => {
18
- const id = React.useId()
19
- const {
20
- labelText,
21
- className,
22
- helperText,
23
- errorMessage,
24
- isInvalid,
25
- isRequired,
26
- direction,
27
- children,
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
- const groupName = restProps.name ?? `group-${id}`
30
+ const groupName = restProps.name ?? `group-${id}`
32
31
 
33
- const context = {
34
- groupName: groupName,
35
- helperTextId: `helper-text-${id}`,
36
- errorMessageId: `error-message-${id}`,
37
- isInvalid: isInvalid ?? false,
38
- isRequired: isRequired ?? false
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
- const styleDirection = direction ?? 'flex-col'
40
+ const styleDirection = direction ?? 'flex-col'
42
41
 
43
- return (
44
- <ControllerContext.Provider value={context}>
45
- <fieldset className={cx('mb-4', className)} ref={ref} {...restProps}>
46
- <legend>
47
- <p
48
- className={cx('block mb-2 text-label', isInvalid && 'text-sun-800')}
49
- >
50
- {labelText}
51
- {isRequired && <span className="text-sun-800">&nbsp;*</span>}
52
- </p>
53
- </legend>
54
- <div className={cx('inline-flex', styleDirection)}>{children}</div>
55
- {helperText && (
56
- <p id={context.helperTextId} className="text-xs text-sumi-700 mt-2">
57
- {helperText}
58
- </p>
59
- )}
60
- {isInvalid && (
61
- <p
62
- id={context.errorMessageId}
63
- className={cx('text-xs text-sun-800', helperText ? 'mt-1' : 'mt-2')}
64
- >
65
- {errorMessage}
66
- </p>
67
- )}
68
- </fieldset>
69
- </ControllerContext.Provider>
70
- )
71
- }) as React.ElementType
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">&nbsp;*</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.ComponentProps<'input'> {}
5
+ export interface InputProps extends React.ComponentPropsWithRef<'input'> {}
6
6
 
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
- }
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
- const invalidStyle = ctx.isInvalid ? 'border-sun-800' : 'border-sumi-900'
17
+ const invalidStyle = ctx.isInvalid ? 'border-sun-800' : 'border-sumi-900'
16
18
 
17
- const style = `
18
- p-4
19
- rounded-lg
20
- border
21
- border-solid
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
- `
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
- 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
- {...restProps}
39
- ref={ref}
40
- />
41
- )
42
- }
43
- ) as React.ElementType
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 extends React.ComponentProps<'label'> {
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 = React.forwardRef<
14
- HTMLLabelElement,
15
- LabelControlProps
16
- >((props, ref) => {
17
- const id = React.useId()
18
- const {
19
- labelText,
20
- className,
21
- helperText,
22
- errorMessage,
23
- isInvalid,
24
- isRequired,
25
- children,
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
- const context = {
30
- id: props.htmlFor ?? `input-${id}`,
31
- helperTextId: `helper-text-${id}`,
32
- errorMessageId: `error-message-${id}`,
33
- isInvalid: isInvalid ?? false,
34
- isRequired: isRequired ?? false
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
- return (
38
- <ControllerContext.Provider value={context}>
39
- <div className={cx('mb-4', className)}>
40
- <label
41
- className={cx('block mb-2 text-label', isInvalid && 'text-sun-800')}
42
- htmlFor={context.id}
43
- ref={ref}
44
- {...restProps}
45
- >
46
- {labelText}
47
- {isRequired && <span className="text-sun-800">&nbsp;*</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
- {errorMessage}
61
- </p>
62
- )}
63
- </div>
64
- </ControllerContext.Provider>
65
- )
66
- }) as React.ElementType
45
+ {labelText}
46
+ {isRequired && <span className="text-sun-800">&nbsp;*</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 Props extends React.ComponentProps<'input'> {}
5
+ export interface RadioProps extends React.ComponentPropsWithRef<'input'> {}
6
6
 
7
- export const Radio = React.forwardRef<HTMLInputElement, Props>((props, ref) => {
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
- }) as React.ElementType
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.ComponentProps<'select'> {}
5
+ export interface SelectProps extends React.ComponentPropsWithRef<'select'> {}
6
6
 
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
- }
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
- const invalidStyle = ctx.isInvalid ? 'border-sun-800' : 'border-sumi-900'
17
+ const invalidStyle = ctx.isInvalid ? 'border-sun-800' : 'border-sumi-900'
16
18
 
17
- const style = `
18
- peer
19
- cursor-pointer
20
- appearance-none
21
- text-base
22
- w-full
23
- bg-white-100
24
- border
25
- border-solid
26
- py-4 px-4 pr-8
27
- rounded-[8px]
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
- `
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
- const styleArrow = `
37
- flex items-center
38
- absolute inset-y-0 right-0
39
- px-2
40
- pointer-events-none
41
- peer-disabled:fill-sumi-500
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
- 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
- ) 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 extends React.ComponentProps<'textarea'> {}
5
+ export interface TextareaProps
6
+ extends React.ComponentPropsWithRef<'textarea'> {}
6
7
 
7
- export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
8
- (props, ref) => {
9
- const { className, children, onChange, maxLength, ...restProps } = props
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
- const [count, setCount] = React.useState(0)
14
+ const [count, setCount] = React.useState(0)
12
15
 
13
- const onChangeHandler = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
14
- if (onChange) onChange(e)
16
+ const onChangeHandler = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
17
+ if (onChange) onChange(e)
15
18
 
16
- setCount(e.target.value.length)
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
- const ctx = React.useContext(ControllerContext)
20
- if (ctx.isRequired) {
21
- restProps.required = true
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
- const invalidStyle = ctx.isInvalid ? 'border-sun-800' : 'border-sumi-900'
25
- const overtextStyle =
26
- count > (maxLength || 0) ? 'text-sun-800' : 'text-sumi-700'
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
- const style = `
29
- p-4
30
- rounded-lg
31
- border
32
- border-solid
33
- focus:outline
34
- focus:outline-2
35
- focus:outline-wood-500
36
- disabled:bg-transparent
37
- disabled:text-sumi-500
38
- disabled:border-sumi-500
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
- return (
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'