@sakura-ui/sakura-ui 0.1.21 → 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.
Files changed (136) hide show
  1. package/package.json +16 -16
  2. package/packages/core/package.json +15 -14
  3. package/packages/core/src/components/Button.tsx +1 -1
  4. package/packages/core/src/components/Card.tsx +10 -4
  5. package/packages/core/src/components/IconButton.tsx +6 -6
  6. package/packages/core/src/components/Link.tsx +2 -1
  7. package/packages/core/src/components/Table.tsx +4 -3
  8. package/packages/core/src/components/buttonStyle.ts +20 -14
  9. package/packages/core/src/components/index.ts +0 -3
  10. package/packages/core/src/index.ts +0 -1
  11. package/packages/core/src/libs/cx.ts +1 -0
  12. package/packages/core/src/libs/forward-ref.ts +7 -4
  13. package/packages/core/src/types/component.ts +7 -6
  14. package/packages/core/tests/Button.test.tsx +30 -0
  15. package/packages/core/tests/Card.test.tsx +30 -7
  16. package/packages/core/tests/vitest.setup.ts +1 -0
  17. package/packages/core/vite.config.ts +3 -2
  18. package/packages/forms/dist/index.cjs.js +92 -81
  19. package/packages/forms/dist/index.es.js +697 -627
  20. package/packages/forms/dist/types/components/Checkbox.d.ts +3 -1
  21. package/packages/forms/dist/types/components/Checkbox.d.ts.map +1 -1
  22. package/packages/forms/dist/types/components/FileInput.d.ts.map +1 -1
  23. package/packages/forms/dist/types/components/Input.d.ts +3 -1
  24. package/packages/forms/dist/types/components/Input.d.ts.map +1 -1
  25. package/packages/forms/dist/types/components/Radio.d.ts +3 -1
  26. package/packages/forms/dist/types/components/Radio.d.ts.map +1 -1
  27. package/packages/forms/dist/types/components/Select.d.ts +3 -1
  28. package/packages/forms/dist/types/components/Select.d.ts.map +1 -1
  29. package/packages/forms/dist/types/components/Textarea.d.ts.map +1 -1
  30. package/packages/forms/dist/types/components/controlled/CheckboxGroup.d.ts +3 -1
  31. package/packages/forms/dist/types/components/controlled/CheckboxGroup.d.ts.map +1 -1
  32. package/packages/forms/dist/types/components/controlled/RadioGroup.d.ts +3 -1
  33. package/packages/forms/dist/types/components/controlled/RadioGroup.d.ts.map +1 -1
  34. package/packages/forms/dist/types/components/controlled/index.d.ts +0 -2
  35. package/packages/forms/dist/types/components/controlled/index.d.ts.map +1 -1
  36. package/packages/forms/dist/types/components/inputStyle.d.ts +13 -0
  37. package/packages/forms/dist/types/components/inputStyle.d.ts.map +1 -0
  38. package/packages/forms/dist/types/index.d.ts +1 -1
  39. package/packages/forms/dist/types/index.d.ts.map +1 -1
  40. package/packages/forms/dist/types/utils/class.d.ts.map +1 -1
  41. package/packages/forms/node_modules/.bin/acorn +17 -0
  42. package/packages/forms/node_modules/.bin/autoprefixer +2 -2
  43. package/packages/forms/node_modules/.bin/browserslist +4 -4
  44. package/packages/forms/node_modules/.bin/eslint +4 -4
  45. package/packages/forms/node_modules/.bin/tailwind +2 -2
  46. package/packages/forms/node_modules/.bin/tailwindcss +2 -2
  47. package/packages/forms/node_modules/.bin/ts-node +4 -4
  48. package/packages/forms/node_modules/.bin/ts-node-cwd +4 -4
  49. package/packages/forms/node_modules/.bin/ts-node-esm +4 -4
  50. package/packages/forms/node_modules/.bin/ts-node-script +4 -4
  51. package/packages/forms/node_modules/.bin/ts-node-transpile-only +4 -4
  52. package/packages/forms/node_modules/.bin/ts-script +4 -4
  53. package/packages/forms/node_modules/.bin/vitest +4 -4
  54. package/packages/forms/package.json +15 -14
  55. package/packages/forms/src/components/Checkbox.tsx +39 -17
  56. package/packages/forms/src/components/FieldsetControl.tsx +1 -1
  57. package/packages/forms/src/components/FileInput.tsx +5 -3
  58. package/packages/forms/src/components/Input.tsx +16 -20
  59. package/packages/forms/src/components/LabelControl.tsx +2 -2
  60. package/packages/forms/src/components/Radio.tsx +34 -19
  61. package/packages/forms/src/components/Select.tsx +41 -31
  62. package/packages/forms/src/components/Textarea.tsx +4 -3
  63. package/packages/forms/src/components/controlled/CheckboxGroup.tsx +11 -3
  64. package/packages/forms/src/components/controlled/RadioGroup.tsx +7 -3
  65. package/packages/forms/src/components/controlled/index.ts +0 -2
  66. package/packages/forms/src/components/inputStyle.ts +83 -0
  67. package/packages/forms/src/index.ts +1 -6
  68. package/packages/forms/src/utils/class.ts +1 -0
  69. package/packages/forms/tests/FieldsetControl.test.tsx +2 -2
  70. package/packages/forms/tests/Input.test.tsx +2 -2
  71. package/packages/forms/tests/LabelControl.test.tsx +2 -2
  72. package/packages/forms/tests/Radio.test.tsx +2 -2
  73. package/packages/forms/tests/vitest.setup.ts +1 -0
  74. package/packages/forms/vite.config.ts +3 -2
  75. package/packages/tailwind-theme-plugin/dist/index.cjs.js +1 -1
  76. package/packages/tailwind-theme-plugin/dist/index.es.js +14 -14
  77. package/packages/tailwind-theme-plugin/node_modules/.bin/autoprefixer +2 -2
  78. package/packages/tailwind-theme-plugin/node_modules/.bin/tailwind +4 -4
  79. package/packages/tailwind-theme-plugin/node_modules/.bin/tailwindcss +4 -4
  80. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node +4 -4
  81. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-cwd +4 -4
  82. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-esm +4 -4
  83. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-script +4 -4
  84. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-transpile-only +4 -4
  85. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-script +4 -4
  86. package/packages/tailwind-theme-plugin/package.json +8 -5
  87. package/packages/tailwind-theme-plugin/src/index.ts +14 -14
  88. package/packages/tailwind-theme-plugin/vite.config.ts +1 -1
  89. package/packages/config/package.json +0 -46
  90. package/packages/config/src/index.ts +0 -347
  91. package/packages/config/tests/index.test.ts +0 -13
  92. package/packages/config/tsconfig.json +0 -13
  93. package/packages/config/tsconfig.node.json +0 -6
  94. package/packages/config/vite.config.ts +0 -26
  95. package/packages/core/.eslintrc.json +0 -25
  96. package/packages/core/src/components/InfoCard.tsx +0 -50
  97. package/packages/forms/coverage/clover.xml +0 -209
  98. package/packages/forms/coverage/coverage-final.json +0 -18
  99. package/packages/forms/coverage/lcov-report/base.css +0 -224
  100. package/packages/forms/coverage/lcov-report/block-navigation.js +0 -87
  101. package/packages/forms/coverage/lcov-report/favicon.png +0 -0
  102. package/packages/forms/coverage/lcov-report/index.html +0 -161
  103. package/packages/forms/coverage/lcov-report/prettify.css +0 -1
  104. package/packages/forms/coverage/lcov-report/prettify.js +0 -2
  105. package/packages/forms/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  106. package/packages/forms/coverage/lcov-report/sorter.js +0 -196
  107. package/packages/forms/coverage/lcov-report/src/components/Checkbox.tsx.html +0 -295
  108. package/packages/forms/coverage/lcov-report/src/components/FieldsetControl.tsx.html +0 -295
  109. package/packages/forms/coverage/lcov-report/src/components/LabelControl.tsx.html +0 -289
  110. package/packages/forms/coverage/lcov-report/src/components/Radio.tsx.html +0 -262
  111. package/packages/forms/coverage/lcov-report/src/components/Select.tsx.html +0 -259
  112. package/packages/forms/coverage/lcov-report/src/components/Text.tsx.html +0 -220
  113. package/packages/forms/coverage/lcov-report/src/components/Textarea.tsx.html +0 -229
  114. package/packages/forms/coverage/lcov-report/src/components/context.ts.html +0 -136
  115. package/packages/forms/coverage/lcov-report/src/components/controlled/CheckboxGroup.tsx.html +0 -244
  116. package/packages/forms/coverage/lcov-report/src/components/controlled/RadioGroup.tsx.html +0 -265
  117. package/packages/forms/coverage/lcov-report/src/components/controlled/SelectControl.tsx.html +0 -205
  118. package/packages/forms/coverage/lcov-report/src/components/controlled/TextControl.tsx.html +0 -202
  119. package/packages/forms/coverage/lcov-report/src/components/controlled/TextareaControl.tsx.html +0 -205
  120. package/packages/forms/coverage/lcov-report/src/components/controlled/index.html +0 -191
  121. package/packages/forms/coverage/lcov-report/src/components/controlled/index.ts.html +0 -100
  122. package/packages/forms/coverage/lcov-report/src/components/index.html +0 -236
  123. package/packages/forms/coverage/lcov-report/src/components/index.ts.html +0 -106
  124. package/packages/forms/coverage/lcov-report/src/index.html +0 -116
  125. package/packages/forms/coverage/lcov-report/src/index.ts.html +0 -136
  126. package/packages/forms/coverage/lcov-report/src/utils/index.html +0 -116
  127. package/packages/forms/coverage/lcov-report/src/utils/index.ts.html +0 -88
  128. package/packages/forms/coverage/lcov.info +0 -434
  129. package/packages/forms/dist/types/components/controlled/SelectControl.d.ts +0 -10
  130. package/packages/forms/dist/types/components/controlled/SelectControl.d.ts.map +0 -1
  131. package/packages/forms/dist/types/components/controlled/TextareaControl.d.ts +0 -10
  132. package/packages/forms/dist/types/components/controlled/TextareaControl.d.ts.map +0 -1
  133. package/packages/forms/jest.config.ts +0 -11
  134. package/packages/forms/node_modules/.vitest/results.json +0 -1
  135. package/packages/forms/src/components/controlled/SelectControl.tsx +0 -42
  136. package/packages/forms/src/components/controlled/TextareaControl.tsx +0 -42
@@ -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 extends React.ComponentPropsWithRef<'input'> {}
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 style = `
19
- inline-block
20
- text-base
21
- cursor-pointer
22
- py-2
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-1000
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 htmlFor={restProps.id} className={cx(style, className)}>
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 xmlns="http://www.w3.org/2000/svg" width="24" height="24">
65
- <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" />
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>
@@ -62,7 +62,7 @@ export const FieldsetControl = React.forwardRef<
62
62
  <p
63
63
  id={context.errorMessageId}
64
64
  className={cx(
65
- 'text-sup text-sun-800',
65
+ 'text-label text-sun-800',
66
66
  helperText ? 'mt-1' : 'mt-2'
67
67
  )}
68
68
  >
@@ -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={restProps.id ?? ctx.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 extends React.ComponentPropsWithRef<'input'> {}
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={restProps.id ?? ctx.id}
35
- className={cx(style, className)}
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}
@@ -36,11 +36,11 @@ export const LabelControl = React.forwardRef<
36
36
  }
37
37
 
38
38
  const styleHelp = `
39
- text-sup text-sumi-700
39
+ text-label text-sumi-700
40
40
  `
41
41
 
42
42
  const styleError = `
43
- text-sup text-sun-800
43
+ text-label text-sun-800
44
44
  `
45
45
 
46
46
  return (
@@ -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 extends React.ComponentPropsWithRef<'input'> {}
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, ...newProps } = props
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
- newProps.required = true
22
+ restProps.required = true
13
23
  }
14
24
  if (ctx.groupName) {
15
- newProps.name = ctx.groupName
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 htmlFor={newProps.id} className={cx(style, className)}>
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
- {...newProps}
71
+ {...restProps}
60
72
  ref={ref}
61
73
  />
62
- <span className={styleRadio}></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 extends React.ComponentPropsWithRef<'select'> {}
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
- peer-disabled:fill-sumi-500
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
- <label className="inline-block relative">
41
+ <div className="inline-block relative">
47
42
  <select
48
- id={restProps.id ?? ctx.id}
49
- className={cx(style, props.className)}
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
- <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>
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={restProps.id ?? ctx.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-sup text-sumi-700">
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 }, index) => {
47
+ {items.map(({ label, value }) => {
45
48
  return (
46
- <Checkbox key={index} value={value} onChange={onChange}>
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 }, index) => {
49
+ {items.map(({ label, value }) => {
47
50
  return (
48
51
  <Radio
49
- key={index}
52
+ key={`${label}-${value}`}
53
+ size={size}
50
54
  value={value}
51
55
  onChange={onChange}
52
56
  defaultChecked={defaultValue === value}
@@ -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'
@@ -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
+ }
@@ -20,9 +20,4 @@ export type {
20
20
  FieldsetControlProps
21
21
  } from './components'
22
22
 
23
- export {
24
- CheckboxGroup,
25
- RadioGroup,
26
- SelectControl,
27
- TextareaControl
28
- } from './components/controlled'
23
+ export { CheckboxGroup, RadioGroup } from './components/controlled'
@@ -1 +1,2 @@
1
+ // biome-ignore lint/suspicious/noExplicitAny:
1
2
  export const cx = (...classNames: any[]) => classNames.filter(Boolean).join(' ')
@@ -1,6 +1,6 @@
1
- import * as React from 'react'
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 { FieldsetControl } from '../src'
6
6
 
@@ -1,6 +1,6 @@
1
- import * as React from 'react'
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, Input } from '../src'
6
6
 
@@ -1,6 +1,6 @@
1
- import * as React from 'react'
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
 
@@ -1,6 +1,6 @@
1
- import * as React from 'react'
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 { FieldsetControl, Radio } from '../src'
6
6
 
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom'