@sakura-ui/sakura-ui 0.1.21 → 0.3.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.
Files changed (264) hide show
  1. package/README.md +16 -6
  2. package/package.json +26 -20
  3. package/packages/core/package.json +30 -18
  4. package/packages/core/src/components/Button.tsx +33 -32
  5. package/packages/core/src/components/Card.tsx +38 -20
  6. package/packages/core/src/components/Code.tsx +6 -4
  7. package/packages/core/src/components/Faq.tsx +13 -7
  8. package/packages/core/src/components/Heading.tsx +42 -32
  9. package/packages/core/src/components/Icon.tsx +43 -13
  10. package/packages/core/src/components/IconButton.tsx +56 -45
  11. package/packages/core/src/components/LangSelector.tsx +135 -0
  12. package/packages/core/src/components/Link.tsx +38 -65
  13. package/packages/core/src/components/LinkCard.tsx +91 -0
  14. package/packages/core/src/components/List.tsx +14 -12
  15. package/packages/core/src/components/MenuButton.tsx +112 -0
  16. package/packages/core/src/components/NavigationItem.tsx +41 -0
  17. package/packages/core/src/components/OverflowContainer.tsx +24 -0
  18. package/packages/core/src/components/PopoverMenu.tsx +81 -0
  19. package/packages/core/src/components/Pre.tsx +6 -4
  20. package/packages/core/src/components/Table.tsx +35 -28
  21. package/packages/core/src/components/buttonStyle.ts +55 -38
  22. package/packages/core/src/components/index.ts +13 -28
  23. package/packages/core/src/icons/Close.tsx +21 -0
  24. package/packages/core/src/icons/CloseMobile.tsx +43 -0
  25. package/packages/core/src/icons/KeyboardArrowDown.tsx +24 -0
  26. package/packages/core/src/icons/Language.tsx +25 -0
  27. package/packages/core/src/icons/LanguageMobile.tsx +40 -0
  28. package/packages/core/src/icons/Menu.tsx +24 -0
  29. package/packages/core/src/icons/MenuMobile.tsx +40 -0
  30. package/packages/core/src/icons/index.ts +8 -0
  31. package/packages/core/src/icons/props.ts +5 -0
  32. package/packages/core/src/index.ts +9 -29
  33. package/packages/core/src/type.d.ts +1 -0
  34. package/packages/core/tests/Button.test.tsx +40 -0
  35. package/packages/core/tests/Card.test.tsx +36 -8
  36. package/packages/core/tests/IconButton.test.tsx +57 -0
  37. package/packages/core/tests/Link.test.tsx +60 -0
  38. package/packages/core/tests/vitest.setup.ts +2 -0
  39. package/packages/core/tsconfig.node.json +3 -2
  40. package/packages/core/vite.config.ts +3 -2
  41. package/packages/forms/.turbo/turbo-build.log +22 -0
  42. package/packages/forms/dist/index.cjs.js +242 -152
  43. package/packages/forms/dist/index.es.js +947 -1010
  44. package/packages/forms/dist/types/components/Checkbox.d.ts +10 -3
  45. package/packages/forms/dist/types/components/Checkbox.d.ts.map +1 -1
  46. package/packages/forms/dist/types/components/FieldsetControl.d.ts +14 -9
  47. package/packages/forms/dist/types/components/FieldsetControl.d.ts.map +1 -1
  48. package/packages/forms/dist/types/components/FileInput.d.ts +10 -3
  49. package/packages/forms/dist/types/components/FileInput.d.ts.map +1 -1
  50. package/packages/forms/dist/types/components/Input.d.ts +10 -3
  51. package/packages/forms/dist/types/components/Input.d.ts.map +1 -1
  52. package/packages/forms/dist/types/components/LabelControl.d.ts +13 -8
  53. package/packages/forms/dist/types/components/LabelControl.d.ts.map +1 -1
  54. package/packages/forms/dist/types/components/Radio.d.ts +10 -3
  55. package/packages/forms/dist/types/components/Radio.d.ts.map +1 -1
  56. package/packages/forms/dist/types/components/Select.d.ts +10 -3
  57. package/packages/forms/dist/types/components/Select.d.ts.map +1 -1
  58. package/packages/forms/dist/types/components/Textarea.d.ts +8 -3
  59. package/packages/forms/dist/types/components/Textarea.d.ts.map +1 -1
  60. package/packages/forms/dist/types/components/controlled/CheckboxGroup.d.ts +18 -11
  61. package/packages/forms/dist/types/components/controlled/CheckboxGroup.d.ts.map +1 -1
  62. package/packages/forms/dist/types/components/controlled/RadioGroup.d.ts +19 -12
  63. package/packages/forms/dist/types/components/controlled/RadioGroup.d.ts.map +1 -1
  64. package/packages/forms/dist/types/components/controlled/index.d.ts +0 -2
  65. package/packages/forms/dist/types/components/controlled/index.d.ts.map +1 -1
  66. package/packages/forms/dist/types/components/index.d.ts +8 -8
  67. package/packages/forms/dist/types/components/index.d.ts.map +1 -1
  68. package/packages/forms/dist/types/components/inputStyle.d.ts +13 -0
  69. package/packages/forms/dist/types/components/inputStyle.d.ts.map +1 -0
  70. package/packages/forms/dist/types/index.d.ts +1 -2
  71. package/packages/forms/dist/types/index.d.ts.map +1 -1
  72. package/packages/forms/node_modules/.bin/autoprefixer +2 -2
  73. package/packages/forms/node_modules/.bin/tailwind +2 -2
  74. package/packages/forms/node_modules/.bin/tailwindcss +2 -2
  75. package/packages/forms/node_modules/.bin/ts-node +4 -4
  76. package/packages/forms/node_modules/.bin/ts-node-cwd +4 -4
  77. package/packages/forms/node_modules/.bin/ts-node-esm +4 -4
  78. package/packages/forms/node_modules/.bin/ts-node-script +4 -4
  79. package/packages/forms/node_modules/.bin/ts-node-transpile-only +4 -4
  80. package/packages/forms/node_modules/.bin/ts-script +4 -4
  81. package/packages/forms/node_modules/.bin/tsc +17 -0
  82. package/packages/forms/node_modules/.bin/tsserver +17 -0
  83. package/packages/forms/node_modules/.vite/vitest/results.json +1 -0
  84. package/packages/forms/package.json +21 -17
  85. package/packages/forms/src/components/Checkbox.tsx +82 -64
  86. package/packages/forms/src/components/FieldsetControl.tsx +21 -28
  87. package/packages/forms/src/components/FileInput.tsx +88 -62
  88. package/packages/forms/src/components/Input.tsx +35 -41
  89. package/packages/forms/src/components/LabelControl.tsx +19 -25
  90. package/packages/forms/src/components/Radio.tsx +73 -61
  91. package/packages/forms/src/components/Select.tsx +71 -61
  92. package/packages/forms/src/components/Textarea.tsx +50 -54
  93. package/packages/forms/src/components/controlled/CheckboxGroup.tsx +25 -19
  94. package/packages/forms/src/components/controlled/RadioGroup.tsx +22 -20
  95. package/packages/forms/src/components/controlled/index.ts +0 -2
  96. package/packages/forms/src/components/index.ts +8 -8
  97. package/packages/forms/src/components/inputStyle.ts +82 -0
  98. package/packages/forms/src/index.ts +1 -17
  99. package/packages/forms/tests/Checkbox.test.tsx +44 -0
  100. package/packages/forms/tests/FieldsetControl.test.tsx +63 -12
  101. package/packages/forms/tests/FileInput.test.tsx +25 -0
  102. package/packages/forms/tests/Input.test.tsx +13 -84
  103. package/packages/forms/tests/LabelControl.test.tsx +83 -21
  104. package/packages/forms/tests/Radio.test.tsx +24 -79
  105. package/packages/forms/tests/Select.test.tsx +30 -0
  106. package/packages/forms/tests/Textarea.test.tsx +25 -0
  107. package/packages/forms/tests/vitest.setup.ts +2 -0
  108. package/packages/forms/tsconfig.node.json +3 -2
  109. package/packages/forms/vite.config.ts +3 -2
  110. package/packages/helper/.turbo/turbo-build.log +23 -0
  111. package/packages/helper/dist/index.cjs.js +78 -0
  112. package/packages/helper/dist/index.es.js +119 -0
  113. package/packages/helper/dist/types/calc.d.ts +2 -0
  114. package/packages/helper/dist/types/calc.d.ts.map +1 -0
  115. package/packages/{forms/dist/types/utils/class.d.ts → helper/dist/types/cx.d.ts} +1 -1
  116. package/packages/helper/dist/types/cx.d.ts.map +1 -0
  117. package/packages/helper/dist/types/index.d.ts +6 -0
  118. package/packages/helper/dist/types/index.d.ts.map +1 -0
  119. package/packages/helper/dist/types/querySelector.d.ts +2 -0
  120. package/packages/helper/dist/types/querySelector.d.ts.map +1 -0
  121. package/packages/helper/dist/types/styles.d.ts +22 -0
  122. package/packages/helper/dist/types/styles.d.ts.map +1 -0
  123. package/packages/helper/dist/types/treefy.d.ts +8 -0
  124. package/packages/helper/dist/types/treefy.d.ts.map +1 -0
  125. package/packages/{config → helper}/package.json +13 -19
  126. package/packages/helper/src/calc.ts +1 -0
  127. package/packages/{core/src/libs → helper/src}/cx.ts +1 -0
  128. package/packages/helper/src/index.ts +5 -0
  129. package/packages/helper/src/querySelector.ts +20 -0
  130. package/packages/helper/src/styles.ts +116 -0
  131. package/packages/helper/src/treefy.ts +22 -0
  132. package/packages/helper/vite.config.ts +26 -0
  133. package/packages/markdown/.turbo/turbo-build.log +22 -0
  134. package/packages/markdown/README.md +129 -0
  135. package/packages/markdown/dist/index.cjs.js +175 -0
  136. package/packages/markdown/dist/index.es.js +17098 -0
  137. package/packages/markdown/dist/types/components/Markdown.d.ts +15 -0
  138. package/packages/markdown/dist/types/components/Markdown.d.ts.map +1 -0
  139. package/packages/markdown/dist/types/components/index.d.ts +2 -0
  140. package/packages/markdown/dist/types/components/index.d.ts.map +1 -0
  141. package/packages/markdown/dist/types/index.d.ts +2 -0
  142. package/packages/markdown/dist/types/index.d.ts.map +1 -0
  143. package/packages/markdown/dist/types/plugins/attr.d.ts +3 -0
  144. package/packages/markdown/dist/types/plugins/attr.d.ts.map +1 -0
  145. package/packages/markdown/dist/types/plugins/card.d.ts +3 -0
  146. package/packages/markdown/dist/types/plugins/card.d.ts.map +1 -0
  147. package/packages/markdown/dist/types/plugins/cell.d.ts +3 -0
  148. package/packages/markdown/dist/types/plugins/cell.d.ts.map +1 -0
  149. package/packages/markdown/dist/types/plugins/faq.d.ts +3 -0
  150. package/packages/markdown/dist/types/plugins/faq.d.ts.map +1 -0
  151. package/packages/markdown/dist/types/plugins/grid.d.ts +3 -0
  152. package/packages/markdown/dist/types/plugins/grid.d.ts.map +1 -0
  153. package/packages/markdown/dist/types/plugins/headings.d.ts +9 -0
  154. package/packages/markdown/dist/types/plugins/headings.d.ts.map +1 -0
  155. package/packages/markdown/dist/types/plugins/helper.d.ts +9 -0
  156. package/packages/markdown/dist/types/plugins/helper.d.ts.map +1 -0
  157. package/packages/markdown/dist/types/plugins/index.d.ts +9 -0
  158. package/packages/markdown/dist/types/plugins/index.d.ts.map +1 -0
  159. package/packages/markdown/dist/types/plugins/linkButton.d.ts +3 -0
  160. package/packages/markdown/dist/types/plugins/linkButton.d.ts.map +1 -0
  161. package/packages/markdown/dist/types/plugins/youtube.d.ts +3 -0
  162. package/packages/markdown/dist/types/plugins/youtube.d.ts.map +1 -0
  163. package/packages/markdown/node_modules/.bin/autoprefixer +17 -0
  164. package/packages/markdown/node_modules/.bin/tailwind +17 -0
  165. package/packages/markdown/node_modules/.bin/tailwindcss +17 -0
  166. package/packages/markdown/node_modules/.bin/ts-node +17 -0
  167. package/packages/markdown/node_modules/.bin/ts-node-cwd +17 -0
  168. package/packages/markdown/node_modules/.bin/ts-node-esm +17 -0
  169. package/packages/markdown/node_modules/.bin/ts-node-script +17 -0
  170. package/packages/markdown/node_modules/.bin/ts-node-transpile-only +17 -0
  171. package/packages/markdown/node_modules/.bin/ts-script +17 -0
  172. package/packages/markdown/node_modules/.bin/tsc +17 -0
  173. package/packages/markdown/node_modules/.bin/tsserver +17 -0
  174. package/packages/markdown/package.json +83 -0
  175. package/packages/markdown/src/components/Markdown.tsx +361 -0
  176. package/packages/markdown/src/components/index.ts +1 -0
  177. package/packages/markdown/src/global.d.ts +9 -0
  178. package/packages/markdown/src/index.ts +1 -0
  179. package/packages/markdown/src/plugins/attr.ts +19 -0
  180. package/packages/markdown/src/plugins/card.ts +57 -0
  181. package/packages/markdown/src/plugins/cell.ts +47 -0
  182. package/packages/markdown/src/plugins/faq.ts +40 -0
  183. package/packages/markdown/src/plugins/grid.ts +51 -0
  184. package/packages/markdown/src/plugins/headings.ts +35 -0
  185. package/packages/markdown/src/plugins/helper.ts +27 -0
  186. package/packages/markdown/src/plugins/index.ts +8 -0
  187. package/packages/markdown/src/plugins/linkButton.ts +25 -0
  188. package/packages/markdown/src/plugins/youtube.ts +48 -0
  189. package/packages/markdown/tsconfig.json +13 -0
  190. package/packages/markdown/tsconfig.node.json +7 -0
  191. package/packages/{config → markdown}/vite.config.ts +6 -2
  192. package/packages/tailwind-theme-plugin/.turbo/turbo-build.log +22 -0
  193. package/packages/tailwind-theme-plugin/dist/index.cjs.js +1 -1
  194. package/packages/tailwind-theme-plugin/dist/index.es.js +5358 -6115
  195. package/packages/tailwind-theme-plugin/dist/types/index.d.ts +1 -1
  196. package/packages/tailwind-theme-plugin/dist/types/index.d.ts.map +1 -1
  197. package/packages/tailwind-theme-plugin/node_modules/.bin/autoprefixer +4 -4
  198. package/packages/tailwind-theme-plugin/node_modules/.bin/tailwind +4 -4
  199. package/packages/tailwind-theme-plugin/node_modules/.bin/tailwindcss +4 -4
  200. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node +4 -4
  201. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-cwd +4 -4
  202. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-esm +4 -4
  203. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-script +4 -4
  204. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-transpile-only +4 -4
  205. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-script +4 -4
  206. package/packages/tailwind-theme-plugin/node_modules/.bin/tsc +17 -0
  207. package/packages/tailwind-theme-plugin/node_modules/.bin/tsserver +17 -0
  208. package/packages/tailwind-theme-plugin/package.json +10 -7
  209. package/packages/tailwind-theme-plugin/src/index.ts +232 -297
  210. package/packages/tailwind-theme-plugin/vite.config.ts +1 -1
  211. package/packages/config/src/index.ts +0 -347
  212. package/packages/config/tests/index.test.ts +0 -13
  213. package/packages/core/.eslintrc.json +0 -25
  214. package/packages/core/src/components/InfoCard.tsx +0 -50
  215. package/packages/core/src/libs/forward-ref.ts +0 -41
  216. package/packages/core/src/types/component.ts +0 -82
  217. package/packages/forms/coverage/clover.xml +0 -209
  218. package/packages/forms/coverage/coverage-final.json +0 -18
  219. package/packages/forms/coverage/lcov-report/base.css +0 -224
  220. package/packages/forms/coverage/lcov-report/block-navigation.js +0 -87
  221. package/packages/forms/coverage/lcov-report/favicon.png +0 -0
  222. package/packages/forms/coverage/lcov-report/index.html +0 -161
  223. package/packages/forms/coverage/lcov-report/prettify.css +0 -1
  224. package/packages/forms/coverage/lcov-report/prettify.js +0 -2
  225. package/packages/forms/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  226. package/packages/forms/coverage/lcov-report/sorter.js +0 -196
  227. package/packages/forms/coverage/lcov-report/src/components/Checkbox.tsx.html +0 -295
  228. package/packages/forms/coverage/lcov-report/src/components/FieldsetControl.tsx.html +0 -295
  229. package/packages/forms/coverage/lcov-report/src/components/LabelControl.tsx.html +0 -289
  230. package/packages/forms/coverage/lcov-report/src/components/Radio.tsx.html +0 -262
  231. package/packages/forms/coverage/lcov-report/src/components/Select.tsx.html +0 -259
  232. package/packages/forms/coverage/lcov-report/src/components/Text.tsx.html +0 -220
  233. package/packages/forms/coverage/lcov-report/src/components/Textarea.tsx.html +0 -229
  234. package/packages/forms/coverage/lcov-report/src/components/context.ts.html +0 -136
  235. package/packages/forms/coverage/lcov-report/src/components/controlled/CheckboxGroup.tsx.html +0 -244
  236. package/packages/forms/coverage/lcov-report/src/components/controlled/RadioGroup.tsx.html +0 -265
  237. package/packages/forms/coverage/lcov-report/src/components/controlled/SelectControl.tsx.html +0 -205
  238. package/packages/forms/coverage/lcov-report/src/components/controlled/TextControl.tsx.html +0 -202
  239. package/packages/forms/coverage/lcov-report/src/components/controlled/TextareaControl.tsx.html +0 -205
  240. package/packages/forms/coverage/lcov-report/src/components/controlled/index.html +0 -191
  241. package/packages/forms/coverage/lcov-report/src/components/controlled/index.ts.html +0 -100
  242. package/packages/forms/coverage/lcov-report/src/components/index.html +0 -236
  243. package/packages/forms/coverage/lcov-report/src/components/index.ts.html +0 -106
  244. package/packages/forms/coverage/lcov-report/src/index.html +0 -116
  245. package/packages/forms/coverage/lcov-report/src/index.ts.html +0 -136
  246. package/packages/forms/coverage/lcov-report/src/utils/index.html +0 -116
  247. package/packages/forms/coverage/lcov-report/src/utils/index.ts.html +0 -88
  248. package/packages/forms/coverage/lcov.info +0 -434
  249. package/packages/forms/dist/types/components/controlled/SelectControl.d.ts +0 -10
  250. package/packages/forms/dist/types/components/controlled/SelectControl.d.ts.map +0 -1
  251. package/packages/forms/dist/types/components/controlled/TextareaControl.d.ts +0 -10
  252. package/packages/forms/dist/types/components/controlled/TextareaControl.d.ts.map +0 -1
  253. package/packages/forms/dist/types/utils/class.d.ts.map +0 -1
  254. package/packages/forms/jest.config.ts +0 -11
  255. package/packages/forms/node_modules/.bin/browserslist +0 -17
  256. package/packages/forms/node_modules/.bin/eslint +0 -17
  257. package/packages/forms/node_modules/.bin/vitest +0 -17
  258. package/packages/forms/node_modules/.vitest/results.json +0 -1
  259. package/packages/forms/src/components/controlled/SelectControl.tsx +0 -42
  260. package/packages/forms/src/components/controlled/TextareaControl.tsx +0 -42
  261. package/packages/forms/src/utils/class.ts +0 -1
  262. package/packages/tailwind-theme-plugin/node_modules/.bin/browserslist +0 -17
  263. /package/packages/{config → helper}/tsconfig.json +0 -0
  264. /package/packages/{config → helper}/tsconfig.node.json +0 -0
@@ -1,20 +1,18 @@
1
- import React from 'react'
2
- import { cx } from '../utils/class'
1
+ import React, { type ComponentPropsWithRef } from 'react'
2
+ import { cx } from '@sakura-ui/helper'
3
3
  import { ControllerContext } from './context'
4
4
 
5
- export interface LabelControlProps
6
- extends React.ComponentPropsWithRef<'label'> {
7
- labelText: string
8
- helperText?: string
9
- errorMessage?: string
10
- isInvalid?: boolean
11
- isRequired?: boolean
5
+ export namespace LabelControl {
6
+ export interface Props extends ComponentPropsWithRef<'label'> {
7
+ labelText: string
8
+ helperText?: string
9
+ errorMessage?: string
10
+ isInvalid?: boolean
11
+ isRequired?: boolean
12
+ }
12
13
  }
13
14
 
14
- export const LabelControl = React.forwardRef<
15
- HTMLLabelElement,
16
- LabelControlProps
17
- >((props, ref) => {
15
+ export const LabelControl = (props: LabelControl.Props) => {
18
16
  const id = React.useId()
19
17
  const {
20
18
  labelText,
@@ -36,44 +34,40 @@ export const LabelControl = React.forwardRef<
36
34
  }
37
35
 
38
36
  const styleHelp = `
39
- text-sup text-sumi-700
37
+ text-label text-solid-gray-700
40
38
  `
41
39
 
42
40
  const styleError = `
43
- text-sup text-sun-800
41
+ text-label text-red-800
44
42
  `
45
43
 
46
44
  return (
47
45
  <ControllerContext.Provider value={context}>
48
- <div className={cx('mb-4', className)}>
46
+ <div className={cx('flex flex-col items-start gap-2', className)}>
49
47
  <label
50
- className={cx('block mb-2 text-label', isInvalid && 'text-sun-800')}
48
+ className={cx('block text-label', isInvalid && 'text-red-800')}
51
49
  htmlFor={context.id}
52
- ref={ref}
53
50
  {...restProps}
54
51
  >
55
52
  {labelText}
56
53
  {isRequired && (
57
- <span className="text-label text-sun-800">&nbsp;*</span>
54
+ <span className="text-label text-red-800">&nbsp;*</span>
58
55
  )}
59
56
  </label>
60
57
  {helperText && (
61
- <p id={context.helperTextId} className={cx(styleHelp, 'mb-2')}>
58
+ <p id={context.helperTextId} className={styleHelp}>
62
59
  {helperText}
63
60
  </p>
64
61
  )}
65
62
  {children}
66
63
  {isInvalid && (
67
- <p
68
- id={context.errorMessageId}
69
- className={cx(styleError, helperText ? 'mt-1' : 'mt-2')}
70
- >
64
+ <p id={context.errorMessageId} className={styleError}>
71
65
  {errorMessage}
72
66
  </p>
73
67
  )}
74
68
  </div>
75
69
  </ControllerContext.Provider>
76
70
  )
77
- })
71
+ }
78
72
 
79
73
  LabelControl.displayName = 'LabelControl'
@@ -1,70 +1,82 @@
1
- import React from 'react'
2
- import { cx } from '../utils/class'
1
+ import React, { type ComponentPropsWithRef } from 'react'
2
+ import { cx, Style } from '@sakura-ui/helper'
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 extends React.ComponentPropsWithRef<'input'> {}
6
-
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
- }
11
+ export namespace Radio {
12
+ export interface Props extends Omit<ComponentPropsWithRef<'input'>, 'size'> {
13
+ size?: InputSize
14
+ }
15
+ }
17
16
 
18
- const style = `
19
- inline-block
20
- text-base
21
- cursor-pointer
22
- py-2
23
- mr-4
24
- `
17
+ export const Radio = (props: Radio.Props) => {
18
+ const { id, className, size = 'lg', children, ...restProps } = props
19
+ const genId = React.useId()
20
+ const radioId = id || genId
21
+ const ctx = React.useContext(ControllerContext)
22
+ if (ctx.isRequired) {
23
+ restProps.required = true
24
+ }
25
+ if (ctx.groupName) {
26
+ restProps.name = ctx.groupName
27
+ }
25
28
 
26
- const styleInput = `
27
- peer
28
- sr-only
29
- `
29
+ const styleInput = `
30
+ peer
31
+ sr-only
32
+ `
30
33
 
31
- const styleRadio = `
32
- bg-clip-content
33
- w-6 h-6
34
- ml-1
35
- mr-2
36
- p-1
37
- rounded-full
38
- border
39
- border-solid
40
- border-sumi-900
41
- peer-checked:bg-sea-600
42
- peer-checked:border-sea-600
43
- peer-disabled:border-sumi-500
44
- peer-focus-visible:ring-2
45
- peer-focus-visible:ring-offset-2
46
- peer-focus-visible:ring-wood-500
47
- `
34
+ const styleRadio = `
35
+ bg-clip-content
36
+ rounded-full
37
+ border
38
+ border-solid
39
+ border-solid-gray-900
40
+ peer-checked:bg-blue-600
41
+ peer-checked:border-blue-600
42
+ peer-disabled:border-solid-gray-500
43
+ ${Style.Peer.focusRect}
44
+ `
48
45
 
49
- return (
50
- <label htmlFor={newProps.id} className={cx(style, className)}>
51
- <span className="flex items-center">
52
- <input
53
- className={styleInput}
54
- type="radio"
55
- aria-describedby={ctx.helperTextId}
56
- aria-errormessage={ctx.errorMessageId}
57
- aria-invalid={ctx.isInvalid ?? false}
58
- aria-required={ctx.isRequired ?? false}
59
- {...newProps}
60
- ref={ref}
61
- />
62
- <span className={styleRadio}></span>
63
- <span className="peer-disabled:text-sumi-500">{children}</span>
64
- </span>
65
- </label>
66
- )
46
+ const radioSizes: { [key in InputSize]: string } = {
47
+ lg: 'p-1',
48
+ md: 'p-[3px]',
49
+ sm: 'p-[3px]'
67
50
  }
68
- )
51
+
52
+ return (
53
+ <label
54
+ htmlFor={radioId}
55
+ className={cx(
56
+ borderlessInputBaseStyles,
57
+ borderlessInputSizeStyles[size],
58
+ className
59
+ )}
60
+ >
61
+ <span className="flex items-center">
62
+ <input
63
+ id={radioId}
64
+ className={styleInput}
65
+ type="radio"
66
+ aria-describedby={ctx.helperTextId}
67
+ aria-errormessage={ctx.errorMessageId}
68
+ aria-invalid={ctx.isInvalid ?? false}
69
+ aria-required={ctx.isRequired ?? false}
70
+ {...restProps}
71
+ />
72
+ <span
73
+ aria-hidden={true}
74
+ className={cx(styleRadio, radioSizes[size], iconStyles[size])}
75
+ />
76
+ <span className="peer-disabled:text-solid-gray-500">{children}</span>
77
+ </span>
78
+ </label>
79
+ )
80
+ }
69
81
 
70
82
  Radio.displayName = 'Radio'
@@ -1,67 +1,77 @@
1
- import React from 'react'
2
- import { cx } from '../utils/class'
1
+ import React, { type ComponentPropsWithRef } from 'react'
2
+ import { cx } from '@sakura-ui/helper'
3
3
  import { ControllerContext } from './context'
4
+ import {
5
+ type InputSize,
6
+ borderedInputBaseStyles,
7
+ borderedInputSizeStyles
8
+ } from './inputStyle'
4
9
 
5
- export interface SelectProps extends React.ComponentPropsWithRef<'select'> {}
10
+ export namespace Select {
11
+ export interface Props extends Omit<ComponentPropsWithRef<'select'>, 'size'> {
12
+ size?: InputSize
13
+ }
14
+ }
15
+
16
+ export const Select = (props: Select.Props) => {
17
+ const { id, className, size = 'lg', children, ...restProps } = props
18
+ const ctx = React.useContext(ControllerContext)
19
+ if (ctx.isRequired) {
20
+ restProps.required = true
21
+ }
6
22
 
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
- }
23
+ const style = `
24
+ !pr-8
25
+ peer
26
+ cursor-pointer
27
+ appearance-none
28
+ `
14
29
 
15
- const style = `
16
- peer
17
- cursor-pointer
18
- 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
- `
30
+ const styleArrow = `
31
+ pointer-events-none
32
+ absolute
33
+ right-4
34
+ top-1/2
35
+ -translate-y-1/2
36
+ text-solid-gray-900
37
+ peer-disabled:text-solid-gray-500
38
+ `
36
39
 
37
- const styleArrow = `
38
- flex items-center
39
- absolute inset-y-0 right-0
40
- px-2
41
- pointer-events-none
42
- peer-disabled:fill-sumi-500
43
- `
40
+ return (
41
+ <div className="inline-block relative">
42
+ <select
43
+ id={id || ctx.id}
44
+ className={cx(
45
+ style,
46
+ borderedInputBaseStyles,
47
+ borderedInputSizeStyles[size],
48
+ className
49
+ )}
50
+ aria-describedby={ctx.helperTextId}
51
+ aria-errormessage={ctx.errorMessageId}
52
+ aria-invalid={ctx.isInvalid ?? false}
53
+ aria-required={ctx.isRequired ?? false}
54
+ {...restProps}
55
+ >
56
+ {children}
57
+ </select>
58
+ <svg
59
+ xmlns="http://www.w3.org/2000/svg"
60
+ aria-hidden={true}
61
+ className={styleArrow}
62
+ fill="none"
63
+ width="16"
64
+ height="16"
65
+ viewBox="0 0 16 16"
66
+ >
67
+ <title>arrow down</title>
68
+ <path
69
+ d="M12 15.05 6.35 9.4 7.4 8.35l4.6 4.6 4.6-4.6 1.05 1.05Z"
70
+ fill="currentColor"
71
+ />
72
+ </svg>
73
+ </div>
74
+ )
75
+ }
44
76
 
45
- return (
46
- <label className="inline-block relative">
47
- <select
48
- id={restProps.id ?? ctx.id}
49
- className={cx(style, props.className)}
50
- aria-describedby={ctx.helperTextId}
51
- aria-errormessage={ctx.errorMessageId}
52
- aria-invalid={ctx.isInvalid ?? false}
53
- aria-required={ctx.isRequired ?? 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
- }
67
- )
77
+ Select.displayName = 'Select'
@@ -1,72 +1,68 @@
1
- import React from 'react'
2
- import { cx } from '../utils/class'
1
+ import React, { type ComponentPropsWithRef } from 'react'
2
+ import { cx, Style } from '@sakura-ui/helper'
3
3
  import { ControllerContext } from './context'
4
4
 
5
- export interface TextareaProps
6
- extends React.ComponentPropsWithRef<'textarea'> {}
5
+ export namespace Textarea {
6
+ export interface Props extends ComponentPropsWithRef<'textarea'> {}
7
+ }
7
8
 
8
- export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
9
- (props, ref) => {
10
- const { className, children, onChange, maxLength, ...restProps } = props
9
+ export const Textarea = (props: Textarea.Props) => {
10
+ const { id, className, children, onChange, maxLength, ...restProps } = props
11
11
 
12
- const [count, setCount] = React.useState(0)
12
+ const [count, setCount] = React.useState(0)
13
13
 
14
- const onChangeHandler = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
15
- if (onChange) onChange(e)
14
+ const onChangeHandler = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
15
+ if (onChange) onChange(e)
16
16
 
17
- setCount(e.target.value.length)
18
- }
17
+ setCount(e.target.value.length)
18
+ }
19
19
 
20
- const ctx = React.useContext(ControllerContext)
21
- if (ctx.isRequired) {
22
- restProps.required = true
23
- }
20
+ const ctx = React.useContext(ControllerContext)
21
+ if (ctx.isRequired) {
22
+ restProps.required = true
23
+ }
24
24
 
25
- const overtextStyle =
26
- count > (maxLength || 0) ? 'text-sun-800' : 'text-sumi-700'
25
+ const overtextStyle =
26
+ count > (maxLength || 0) ? 'text-red-800' : 'text-solid-gray-700'
27
27
 
28
- const style = `
28
+ const style = `
29
29
  p-4
30
+ text-label
30
31
  rounded-lg
31
32
  border
32
33
  border-solid
33
- border-sumi-900
34
- outline-offset-2
35
- focus:outline
36
- focus:outline-2
37
- focus:outline-wood-500
34
+ border-solid-gray-900
38
35
  disabled:bg-transparent
39
- disabled:text-sumi-500
40
- disabled:border-sumi-500
41
- aria-invalid:border-sun-800
36
+ disabled:text-solid-gray-500
37
+ disabled:border-solid-gray-500
38
+ aria-invalid:border-red-800
39
+ ${Style.focusRect}
42
40
  `
43
41
 
44
- return (
45
- <>
46
- <textarea
47
- id={restProps.id ?? ctx.id}
48
- className={cx(style, className)}
49
- aria-describedby={ctx.helperTextId}
50
- aria-errormessage={ctx.errorMessageId}
51
- aria-invalid={ctx.isInvalid ?? false}
52
- aria-required={ctx.isRequired ?? false}
53
- onChange={onChangeHandler}
54
- {...restProps}
55
- ref={ref}
56
- >
57
- {children}
58
- </textarea>
59
- {maxLength ? (
60
- <p className="text-sup text-sumi-700">
61
- <span className={overtextStyle}>{count}</span>/
62
- <span>{maxLength}</span>
63
- </p>
64
- ) : (
65
- ''
66
- )}
67
- </>
68
- )
69
- }
70
- )
42
+ return (
43
+ <>
44
+ <textarea
45
+ id={id || ctx.id}
46
+ className={cx(style, className)}
47
+ aria-describedby={ctx.helperTextId}
48
+ aria-errormessage={ctx.errorMessageId}
49
+ aria-invalid={ctx.isInvalid ?? false}
50
+ aria-required={ctx.isRequired ?? false}
51
+ onChange={onChangeHandler}
52
+ {...restProps}
53
+ >
54
+ {children}
55
+ </textarea>
56
+ {maxLength ? (
57
+ <p className="text-label text-solid-gray-700">
58
+ <span className={overtextStyle}>{count}</span>/
59
+ <span>{maxLength}</span>
60
+ </p>
61
+ ) : (
62
+ ''
63
+ )}
64
+ </>
65
+ )
66
+ }
71
67
 
72
68
  Textarea.displayName = 'Textarea'
@@ -1,23 +1,24 @@
1
- import React from 'react'
1
+ import React, { type ComponentPropsWithRef } 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
- export interface CheckboxGroupProps
7
- extends Omit<React.ComponentPropsWithRef<'fieldset'>, 'onChange'> {
8
- items: InputItem[]
9
- onChange: React.ChangeEventHandler<HTMLInputElement>
10
- labelText: string
11
- helperText?: string
12
- errorMessage?: string
13
- isInvalid?: boolean
14
- isRequired?: boolean
7
+ export namespace CheckboxGroup {
8
+ export interface Props
9
+ extends Omit<ComponentPropsWithRef<'fieldset'>, 'onChange'> {
10
+ items: InputItem[]
11
+ onChange: React.ChangeEventHandler<HTMLInputElement>
12
+ labelText: string
13
+ helperText?: string
14
+ errorMessage?: string
15
+ isInvalid?: boolean
16
+ isRequired?: boolean
17
+ size?: InputSize
18
+ }
15
19
  }
16
20
 
17
- export const CheckboxGroup = React.forwardRef<
18
- HTMLFieldSetElement,
19
- CheckboxGroupProps
20
- >((props, ref) => {
21
+ export const CheckboxGroup = (props: CheckboxGroup.Props) => {
21
22
  const {
22
23
  items,
23
24
  onChange,
@@ -27,6 +28,7 @@ export const CheckboxGroup = React.forwardRef<
27
28
  errorMessage,
28
29
  isInvalid,
29
30
  isRequired,
31
+ size,
30
32
  ...restProps
31
33
  } = props
32
34
 
@@ -38,18 +40,22 @@ export const CheckboxGroup = React.forwardRef<
38
40
  errorMessage={errorMessage}
39
41
  isInvalid={isInvalid}
40
42
  isRequired={isRequired}
41
- ref={ref}
42
43
  {...restProps}
43
44
  >
44
- {items.map(({ label, value }, index) => {
45
+ {items.map(({ label, value }) => {
45
46
  return (
46
- <Checkbox key={index} value={value} onChange={onChange}>
47
+ <Checkbox
48
+ key={`${label}-${value}`}
49
+ size={size}
50
+ value={value}
51
+ onChange={onChange}
52
+ >
47
53
  {label}
48
54
  </Checkbox>
49
55
  )
50
56
  })}
51
57
  </FieldsetControl>
52
58
  )
53
- })
59
+ }
54
60
 
55
61
  CheckboxGroup.displayName = 'CheckboxGroup'
@@ -1,24 +1,25 @@
1
- import React from 'react'
1
+ import React, { type ComponentPropsWithRef } 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
- export interface RadioGroupProps
7
- extends Omit<React.ComponentPropsWithRef<'fieldset'>, 'onChange'> {
8
- items: InputItem[]
9
- onChange: React.ChangeEventHandler<HTMLInputElement>
10
- labelText: string
11
- helperText?: string
12
- errorMessage?: string
13
- isInvalid?: boolean
14
- isRequired?: boolean
15
- defaultValue?: string
7
+ export namespace RadioGroup {
8
+ export interface Props
9
+ extends Omit<ComponentPropsWithRef<'fieldset'>, 'onChange'> {
10
+ items: InputItem[]
11
+ onChange: React.ChangeEventHandler<HTMLInputElement>
12
+ labelText: string
13
+ helperText?: string
14
+ errorMessage?: string
15
+ isInvalid?: boolean
16
+ isRequired?: boolean
17
+ defaultValue?: string
18
+ size?: InputSize
19
+ }
16
20
  }
17
21
 
18
- export const RadioGroup = React.forwardRef<
19
- HTMLFieldSetElement,
20
- RadioGroupProps
21
- >((props, ref) => {
22
+ export const RadioGroup = (props: RadioGroup.Props) => {
22
23
  const {
23
24
  items,
24
25
  onChange,
@@ -29,6 +30,7 @@ export const RadioGroup = React.forwardRef<
29
30
  isInvalid,
30
31
  isRequired,
31
32
  defaultValue,
33
+ size,
32
34
  ...restProps
33
35
  } = props
34
36
 
@@ -40,13 +42,13 @@ export const RadioGroup = React.forwardRef<
40
42
  errorMessage={errorMessage}
41
43
  isInvalid={isInvalid}
42
44
  isRequired={isRequired}
43
- ref={ref}
44
45
  {...restProps}
45
46
  >
46
- {items.map(({ label, value }, index) => {
47
+ {items.map(({ label, value }) => {
47
48
  return (
48
49
  <Radio
49
- key={index}
50
+ key={`${label}-${value}`}
51
+ size={size}
50
52
  value={value}
51
53
  onChange={onChange}
52
54
  defaultChecked={defaultValue === value}
@@ -57,6 +59,6 @@ export const RadioGroup = React.forwardRef<
57
59
  })}
58
60
  </FieldsetControl>
59
61
  )
60
- })
62
+ }
61
63
 
62
64
  RadioGroup.displayName = 'RadioGroup'
@@ -1,4 +1,2 @@
1
1
  export { CheckboxGroup } from './CheckboxGroup'
2
2
  export { RadioGroup } from './RadioGroup'
3
- export { SelectControl } from './SelectControl'
4
- export { TextareaControl } from './TextareaControl'
@@ -1,8 +1,8 @@
1
- export { Checkbox, type CheckboxProps } from './Checkbox'
2
- export { Radio, type RadioProps } from './Radio'
3
- export { Select, type SelectProps } from './Select'
4
- export { FileInput, type FileInputProps } from './FileInput'
5
- export { Input, type InputProps } from './Input'
6
- export { Textarea, type TextareaProps } from './Textarea'
7
- export { LabelControl, type LabelControlProps } from './LabelControl'
8
- export { FieldsetControl, type FieldsetControlProps } from './FieldsetControl'
1
+ export { Checkbox } from './Checkbox'
2
+ export { Radio } from './Radio'
3
+ export { Select } from './Select'
4
+ export { FileInput } from './FileInput'
5
+ export { Input } from './Input'
6
+ export { Textarea } from './Textarea'
7
+ export { LabelControl } from './LabelControl'
8
+ export { FieldsetControl } from './FieldsetControl'