@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
@@ -0,0 +1,82 @@
1
+ import { Style } from '@sakura-ui/helper'
2
+
3
+ export type InputSize = 'lg' | 'md' | 'sm'
4
+
5
+ export const borderedInputBaseStyles = `
6
+ bg-white
7
+ border
8
+ border-solid
9
+ border-solid-gray-900
10
+ disabled:bg-transparent
11
+ disabled:text-solid-gray-500
12
+ disabled:border-solid-gray-500
13
+ aria-invalid:border-red-800
14
+ ${Style.focusRect}
15
+ `
16
+
17
+ // for text input and select
18
+ export const borderedInputSizeStyles: { [key in InputSize]: string } = {
19
+ // 16(p-4) * 2 + 22(text-label * leading-snug) + boader * 2 = 56px
20
+ lg: `
21
+ p-4
22
+ text-label
23
+ rounded-lg
24
+ leading-snug
25
+ `,
26
+ // 12(py-3) * 2 + 22(text-label * leading-snug) + boader * 2 = 48px
27
+ md: `
28
+ px-4
29
+ py-3
30
+ text-label
31
+ rounded-lg
32
+ leading-snug
33
+ `,
34
+ // 8(py-2) * 2 + 22(text-label * leading-snug) + boader * 2 = 40px
35
+ sm: `
36
+ px-3
37
+ py-2
38
+ text-label
39
+ rounded-md
40
+ leading-snug
41
+ `
42
+ }
43
+
44
+ export const borderlessInputBaseStyles = `
45
+ inline-block
46
+ cursor-pointer
47
+ border
48
+ border-solid
49
+ border-transparent
50
+ `
51
+
52
+ // for radio and checkbox
53
+ export const borderlessInputSizeStyles: { [key in InputSize]: string } = {
54
+ // 16(p-4) * 2 + 22(text-label * leading-snug) + boader(transparent) * 2 = 56px
55
+ lg: `
56
+ pr-8
57
+ py-4
58
+ text-label
59
+ leading-snug
60
+ `,
61
+ // 12(py-3) * 2 + 22(text-label * leading-snug) + boader(transparent) * 2 = 48px
62
+ md: `
63
+ pr-6
64
+ py-3
65
+ text-label
66
+ leading-snug
67
+ `,
68
+ // 8(py-2) * 2 + 22(text-label * leading-snug) + boader(transparent) * 2 = 40px
69
+ sm: `
70
+ pr-4
71
+ py-2
72
+ text-label
73
+ leading-snug
74
+ `
75
+ }
76
+
77
+ // for radio and checkbox
78
+ export const iconStyles: { [key in InputSize]: string } = {
79
+ lg: 'w-[22px] h-[22px] mr-2',
80
+ md: 'w-[18px] h-[18px] mr-1.5',
81
+ sm: 'w-[18px] h-[18px] mr-1'
82
+ }
@@ -9,20 +9,4 @@ export {
9
9
  FieldsetControl
10
10
  } from './components'
11
11
 
12
- export type {
13
- CheckboxProps,
14
- RadioProps,
15
- SelectProps,
16
- FileInputProps,
17
- InputProps,
18
- TextareaProps,
19
- LabelControlProps,
20
- FieldsetControlProps
21
- } from './components'
22
-
23
- export {
24
- CheckboxGroup,
25
- RadioGroup,
26
- SelectControl,
27
- TextareaControl
28
- } from './components/controlled'
12
+ export { CheckboxGroup, RadioGroup } from './components/controlled'
@@ -0,0 +1,44 @@
1
+ import React from 'react'
2
+ import { describe, it, expect, vi } from 'vitest'
3
+ import { render, screen } from '@testing-library/react'
4
+
5
+ import { Checkbox } from '../src'
6
+
7
+ describe('Checkbox', () => {
8
+ it('should render a checkbox with a label text', async () => {
9
+ render(<Checkbox>test</Checkbox>)
10
+
11
+ const checkbox = screen.getByRole('checkbox')
12
+
13
+ expect(checkbox).toBeInTheDocument()
14
+
15
+ expect(screen.getByText('test')).toBeInTheDocument()
16
+ })
17
+
18
+ it('should render two checkbox with verify checked states', async () => {
19
+ render(
20
+ <>
21
+ <Checkbox id="test" value="test1" data-testid="checked" checked />
22
+ <Checkbox id="test" value="test2" data-testid="not_checked" />
23
+ </>
24
+ )
25
+
26
+ const checked = screen.getByTestId('checked')
27
+
28
+ expect(checked).toBeInTheDocument()
29
+ expect(checked).toBeChecked()
30
+
31
+ const notChecked = screen.getByTestId('not_checked')
32
+
33
+ expect(notChecked).toBeInTheDocument()
34
+ expect(notChecked).not.toBeChecked()
35
+ })
36
+
37
+ it('should pass an object to the ref property', async () => {
38
+ const ref = vi.fn()
39
+
40
+ render(<Checkbox ref={ref}>test</Checkbox>)
41
+
42
+ expect(ref).toHaveBeenCalledTimes(1)
43
+ })
44
+ })
@@ -1,11 +1,11 @@
1
- import * as React from 'react'
1
+ import React from 'react'
2
+ import { describe, it, expect } from 'vitest'
2
3
  import { render, screen } from '@testing-library/react'
3
- import '@testing-library/jest-dom'
4
4
 
5
- import { FieldsetControl } from '../src'
5
+ import { FieldsetControl, Input } from '../src'
6
6
 
7
7
  describe('FieldsetControl', () => {
8
- test('renders FieldsetControl component vol1', async () => {
8
+ it('should render a fieldset with a label text', async () => {
9
9
  render(<FieldsetControl labelText="test" />)
10
10
 
11
11
  const fieldset = screen.getByRole('group')
@@ -15,34 +15,55 @@ describe('FieldsetControl', () => {
15
15
  expect(screen.getByText('test')).toBeInTheDocument()
16
16
  })
17
17
 
18
- test('renders FieldsetControl component vol2', async () => {
18
+ it('should render a fieldset with a helper text and error text', async () => {
19
19
  render(
20
20
  <FieldsetControl
21
21
  labelText="test"
22
22
  helperText="helper"
23
23
  errorMessage="error"
24
- />
24
+ isInvalid
25
+ >
26
+ <Input />
27
+ </FieldsetControl>
25
28
  )
26
29
 
27
30
  expect(screen.getByText('helper')).toBeInTheDocument()
28
- expect(screen.queryByText('error')).toBeNull()
31
+ expect(screen.getByText('error')).toBeInTheDocument()
32
+
33
+ const input = screen.getByRole('textbox')
34
+
35
+ expect(input).toBeInTheDocument()
36
+
37
+ expect(input).toHaveAttribute('aria-describedby', 'helper-text-:r1:')
38
+ expect(input).toHaveAttribute('aria-errormessage', 'error-message-:r1:')
39
+
40
+ expect(input).toBeInvalid()
41
+ expect(input).toHaveAttribute('aria-invalid', 'true')
29
42
  })
30
43
 
31
- test('renders FieldsetControl component vol3', async () => {
44
+ it('should render a fieldset with a helper text', async () => {
32
45
  render(
33
46
  <FieldsetControl
34
47
  labelText="test"
35
48
  helperText="helper"
36
49
  errorMessage="error"
37
- isInvalid
38
- />
50
+ >
51
+ <Input />
52
+ </FieldsetControl>
39
53
  )
40
54
 
41
55
  expect(screen.getByText('helper')).toBeInTheDocument()
42
- expect(screen.getByText('error')).toBeInTheDocument()
56
+ expect(screen.queryByText('error')).toBeNull()
57
+
58
+ const input = screen.getByRole('textbox')
59
+
60
+ expect(input).toBeInTheDocument()
61
+
62
+ expect(input).toBeValid()
63
+ expect(input).toHaveAttribute('aria-invalid', 'false')
43
64
  })
44
65
 
45
- test('renders FieldsetControl component vol4', async () => {
66
+ it('should display an asterisk only when isRequired prop is true', async () => {
46
67
  render(<FieldsetControl labelText="test" />)
47
68
 
48
69
  expect(screen.queryByText('*')).toBeNull()
@@ -51,4 +72,34 @@ describe('FieldsetControl', () => {
51
72
 
52
73
  expect(screen.getByText('*')).toBeInTheDocument()
53
74
  })
75
+
76
+ it('should render an input with required attribute and correct label text', async () => {
77
+ render(
78
+ <FieldsetControl labelText="test" isRequired>
79
+ <Input defaultValue="test value" />
80
+ </FieldsetControl>
81
+ )
82
+
83
+ const input = screen.getByRole('textbox')
84
+
85
+ expect(input).toBeInTheDocument()
86
+
87
+ expect(input).toBeValid()
88
+ expect(input).toBeRequired()
89
+ })
90
+
91
+ it('should render an input as invalid when required but has no value', async () => {
92
+ render(
93
+ <FieldsetControl labelText="test" isRequired>
94
+ <Input />
95
+ </FieldsetControl>
96
+ )
97
+
98
+ const input = screen.getByRole('textbox')
99
+
100
+ expect(input).toBeInTheDocument()
101
+
102
+ expect(input).toBeInvalid()
103
+ expect(input).toBeRequired()
104
+ })
54
105
  })
@@ -0,0 +1,25 @@
1
+ import React from 'react'
2
+ import { describe, it, expect, vi } from 'vitest'
3
+ import { render, screen } from '@testing-library/react'
4
+
5
+ import { FileInput } from '../src'
6
+
7
+ describe('FileInput', () => {
8
+ it('should render a file input with a label text', async () => {
9
+ render(<FileInput />)
10
+
11
+ const input = screen.getByRole('button')
12
+
13
+ expect(input).toBeInTheDocument()
14
+
15
+ expect(screen.getByLabelText('File Upload')).toBeInTheDocument()
16
+ })
17
+
18
+ it('should pass an object to the ref property', async () => {
19
+ const ref = vi.fn()
20
+
21
+ render(<FileInput ref={ref} />)
22
+
23
+ expect(ref).toHaveBeenCalledTimes(1)
24
+ })
25
+ })
@@ -1,96 +1,25 @@
1
- import * as React from 'react'
1
+ import React from 'react'
2
+ import { describe, it, expect, vi } from 'vitest'
2
3
  import { render, screen } from '@testing-library/react'
3
- import '@testing-library/jest-dom'
4
4
 
5
- import { LabelControl, Input } from '../src'
5
+ import { Input } from '../src'
6
6
 
7
- describe('should derive values from surrounding LabelControl', () => {
8
- test('renders Text component vol1', async () => {
9
- render(
10
- <LabelControl labelText="test">
11
- <Input />
12
- </LabelControl>
13
- )
7
+ describe('Input', () => {
8
+ it('should render a input with a value text', async () => {
9
+ render(<Input value="test" />)
14
10
 
15
- const text = screen.getByLabelText(/test/)
11
+ const input = screen.getByRole('textbox')
16
12
 
17
- expect(text).toBeInTheDocument()
18
- })
19
-
20
- test('renders Text component vol2', async () => {
21
- render(
22
- <LabelControl labelText="test" helperText="helper" errorMessage="error">
23
- <Input />
24
- </LabelControl>
25
- )
26
-
27
- const text = screen.getByLabelText(/test/)
28
-
29
- expect(text).toBeInTheDocument()
30
-
31
- expect(text).toHaveAttribute('aria-describedby', 'helper-text-:r1:')
32
- expect(text).toHaveAttribute('aria-errormessage', 'error-message-:r1:')
33
- })
34
-
35
- test('renders Text component vol3', async () => {
36
- render(
37
- <LabelControl labelText="test">
38
- <Input />
39
- </LabelControl>
40
- )
41
-
42
- const text = screen.getByLabelText(/test/)
43
-
44
- expect(text).toBeInTheDocument()
45
-
46
- expect(text).toBeValid()
47
- expect(text).toHaveAttribute('aria-invalid', 'false')
48
- })
49
-
50
- test('renders Text component vol4', async () => {
51
- render(
52
- <LabelControl labelText="test" isInvalid>
53
- <Input />
54
- </LabelControl>
55
- )
56
-
57
- const text = screen.getByLabelText(/test/)
58
-
59
- expect(text).toBeInTheDocument()
60
-
61
- expect(text).toBeInvalid()
62
- expect(text).toHaveAttribute('aria-invalid', 'true')
63
- expect(text).not.toBeRequired()
64
- })
65
-
66
- test('renders Text component vol5', async () => {
67
- render(
68
- <LabelControl labelText="test" isRequired>
69
- <Input defaultValue="test value" />
70
- </LabelControl>
71
- )
72
-
73
- screen.getByLabelText
74
- const text = screen.getByLabelText(/test/)
13
+ expect(input).toBeInTheDocument()
75
14
 
76
- expect(text).toBeInTheDocument()
77
-
78
- expect(text).toBeValid()
79
- expect(text).toBeRequired()
15
+ expect(screen.getByDisplayValue('test')).toBeInTheDocument()
80
16
  })
81
17
 
82
- test('renders Text component vol6', async () => {
83
- render(
84
- <LabelControl labelText="test" isRequired>
85
- <Input />
86
- </LabelControl>
87
- )
88
-
89
- const text = screen.getByLabelText(/test/)
18
+ it('should pass an object to the ref property', async () => {
19
+ const ref = vi.fn()
90
20
 
91
- expect(text).toBeInTheDocument()
21
+ render(<Input ref={ref} />)
92
22
 
93
- expect(text).toBeInvalid()
94
- expect(text).toBeRequired()
23
+ expect(ref).toHaveBeenCalledTimes(1)
95
24
  })
96
25
  })
@@ -1,44 +1,62 @@
1
- import * as React from 'react'
1
+ import React from 'react'
2
+ import { describe, test, it, expect } from 'vitest'
2
3
  import { render, screen } from '@testing-library/react'
3
- import '@testing-library/jest-dom'
4
4
 
5
- import { LabelControl, Select, Input, Textarea } from '../src'
5
+ import { LabelControl, Select, Input, Textarea, FileInput } from '../src'
6
6
 
7
7
  describe('LabelControl', () => {
8
- test('renders LabelControl component vol1', async () => {
8
+ it('should render a label with a label text', async () => {
9
9
  render(<LabelControl labelText="test" data-testid="label" />)
10
10
 
11
- const elem = screen.getByTestId('label')
11
+ const label = screen.getByTestId('label')
12
12
 
13
- expect(elem).toBeInTheDocument()
13
+ expect(label).toBeInTheDocument()
14
14
 
15
15
  expect(screen.getByText('test')).toBeInTheDocument()
16
16
  })
17
17
 
18
- test('renders LabelControl component vol2', async () => {
19
- render(
20
- <LabelControl labelText="test" helperText="helper" errorMessage="error" />
21
- )
22
-
23
- expect(screen.getByText('helper')).toBeInTheDocument()
24
- expect(screen.queryByText('error')).toBeNull()
25
- })
26
-
27
- test('renders LabelControl component vol3', async () => {
18
+ it('should render a fieldset with a helper text and error text', async () => {
28
19
  render(
29
20
  <LabelControl
30
21
  labelText="test"
31
22
  helperText="helper"
32
23
  errorMessage="error"
33
24
  isInvalid
34
- />
25
+ >
26
+ <Input />
27
+ </LabelControl>
35
28
  )
36
29
 
37
30
  expect(screen.getByText('helper')).toBeInTheDocument()
38
31
  expect(screen.getByText('error')).toBeInTheDocument()
32
+
33
+ const input = screen.getByLabelText(/test/)
34
+
35
+ expect(input).toBeInTheDocument()
36
+
37
+ expect(input).toHaveAttribute('aria-describedby', 'helper-text-:r1:')
38
+ expect(input).toHaveAttribute('aria-errormessage', 'error-message-:r1:')
39
+
40
+ expect(input).toBeInvalid()
41
+ expect(input).toHaveAttribute('aria-invalid', 'true')
42
+ })
43
+
44
+ it('should render a fieldset with a helper text', async () => {
45
+ render(
46
+ <LabelControl labelText="test">
47
+ <Input />
48
+ </LabelControl>
49
+ )
50
+
51
+ const input = screen.getByLabelText(/test/)
52
+
53
+ expect(input).toBeInTheDocument()
54
+
55
+ expect(input).toBeValid()
56
+ expect(input).toHaveAttribute('aria-invalid', 'false')
39
57
  })
40
58
 
41
- test('renders LabelControl component vol4', async () => {
59
+ it('should display an asterisk only when isRequired prop is true', async () => {
42
60
  render(<LabelControl labelText="test" />)
43
61
 
44
62
  expect(screen.queryByText('*')).toBeNull()
@@ -48,6 +66,36 @@ describe('LabelControl', () => {
48
66
  expect(screen.getByText('*')).toBeInTheDocument()
49
67
  })
50
68
 
69
+ it('should render an input with required attribute and correct label text', async () => {
70
+ render(
71
+ <LabelControl labelText="test" isRequired>
72
+ <Input defaultValue="test value" />
73
+ </LabelControl>
74
+ )
75
+
76
+ const input = screen.getByLabelText(/test/)
77
+
78
+ expect(input).toBeInTheDocument()
79
+
80
+ expect(input).toBeValid()
81
+ expect(input).toBeRequired()
82
+ })
83
+
84
+ it('should render an input as invalid when required but has no value', async () => {
85
+ render(
86
+ <LabelControl labelText="test" isRequired>
87
+ <Input />
88
+ </LabelControl>
89
+ )
90
+
91
+ const input = screen.getByLabelText(/test/)
92
+
93
+ expect(input).toBeInTheDocument()
94
+
95
+ expect(input).toBeInvalid()
96
+ expect(input).toBeRequired()
97
+ })
98
+
51
99
  test('Test the relationship between the label and input elements.', async () => {
52
100
  render(
53
101
  <>
@@ -60,6 +108,9 @@ describe('LabelControl', () => {
60
108
  <Input defaultValue="1" />
61
109
  </LabelControl>
62
110
  <LabelControl labelText="test3">
111
+ <FileInput />
112
+ </LabelControl>
113
+ <LabelControl labelText="test4">
63
114
  <Textarea defaultValue="1" />
64
115
  </LabelControl>
65
116
  </>
@@ -75,7 +126,11 @@ describe('LabelControl', () => {
75
126
  expect(text).toHaveValue('1')
76
127
  expect(text).toHaveAttribute('id')
77
128
 
78
- const textarea = screen.getByLabelText(/test3/)
129
+ const file = screen.getByLabelText(/test3/)
130
+ expect(file).toBeInTheDocument()
131
+ expect(file).toHaveAttribute('id')
132
+
133
+ const textarea = screen.getByLabelText(/test4/)
79
134
  expect(textarea).toBeInTheDocument()
80
135
  expect(textarea).toHaveValue('1')
81
136
  expect(textarea).toHaveAttribute('id')
@@ -93,6 +148,9 @@ describe('LabelControl', () => {
93
148
  <Input defaultValue="1" />
94
149
  </LabelControl>
95
150
  <LabelControl labelText="test3" htmlFor="id3">
151
+ <FileInput />
152
+ </LabelControl>
153
+ <LabelControl labelText="test4" htmlFor="id4">
96
154
  <Textarea defaultValue="1" />
97
155
  </LabelControl>
98
156
  </>
@@ -108,9 +166,13 @@ describe('LabelControl', () => {
108
166
  expect(input).toHaveValue('1')
109
167
  expect(input).toHaveAttribute('id', 'id2')
110
168
 
111
- const textarea = screen.getByLabelText(/test3/)
169
+ const file = screen.getByLabelText(/test3/)
170
+ expect(file).toBeInTheDocument()
171
+ expect(file).toHaveAttribute('id', 'id3')
172
+
173
+ const textarea = screen.getByLabelText(/test4/)
112
174
  expect(textarea).toBeInTheDocument()
113
175
  expect(textarea).toHaveValue('1')
114
- expect(textarea).toHaveAttribute('id', 'id3')
176
+ expect(textarea).toHaveAttribute('id', 'id4')
115
177
  })
116
178
  })
@@ -1,99 +1,44 @@
1
- import * as React from 'react'
1
+ import React from 'react'
2
+ import { describe, it, expect, vi } from 'vitest'
2
3
  import { render, screen } from '@testing-library/react'
3
- import '@testing-library/jest-dom'
4
4
 
5
- import { FieldsetControl, Radio } from '../src'
5
+ import { Radio } from '../src'
6
6
 
7
- describe('should derive values from surrounding FieldsetControl', () => {
8
- test('renders Text component vol1', async () => {
9
- render(
10
- <FieldsetControl labelText="test">
11
- <Radio />
12
- </FieldsetControl>
13
- )
14
-
15
- const elem = screen.getByRole('radio')
16
-
17
- expect(elem).toBeInTheDocument()
18
- })
19
-
20
- test('renders Text component vol2', async () => {
21
- render(
22
- <FieldsetControl
23
- labelText="test"
24
- helperText="helper"
25
- errorMessage="error"
26
- >
27
- <Radio />
28
- </FieldsetControl>
29
- )
30
-
31
- const elem = screen.getByRole('radio')
32
-
33
- expect(elem).toBeInTheDocument()
34
-
35
- expect(elem).toHaveAttribute('aria-describedby', 'helper-text-:r1:')
36
- expect(elem).toHaveAttribute('aria-errormessage', 'error-message-:r1:')
37
- })
7
+ describe('Radio', () => {
8
+ it('should render a radio with a value text', async () => {
9
+ render(<Radio id="test" value="test" />)
38
10
 
39
- test('renders Text component vol3', async () => {
40
- render(
41
- <FieldsetControl labelText="test">
42
- <Radio />
43
- </FieldsetControl>
44
- )
45
-
46
- const elem = screen.getByRole('radio')
11
+ const radio = screen.getByRole('radio')
47
12
 
48
- expect(elem).toBeInTheDocument()
13
+ expect(radio).toBeInTheDocument()
49
14
 
50
- expect(elem).toBeValid()
51
- expect(elem).toHaveAttribute('aria-invalid', 'false')
15
+ expect(screen.getByDisplayValue('test')).toBeInTheDocument()
52
16
  })
53
17
 
54
- test('renders Text component vol4', async () => {
18
+ it('should render two radios with verify checked states', async () => {
55
19
  render(
56
- <FieldsetControl labelText="test" isInvalid>
57
- <Radio />
58
- </FieldsetControl>
20
+ <>
21
+ <Radio id="test" value="test1" data-testid="checked" checked />
22
+ <Radio id="test" value="test2" data-testid="not_checked" />
23
+ </>
59
24
  )
60
25
 
61
- const elem = screen.getByRole('radio')
62
-
63
- expect(elem).toBeInTheDocument()
64
-
65
- expect(elem).toBeInvalid()
66
- expect(elem).toHaveAttribute('aria-invalid', 'true')
67
- expect(elem).not.toBeRequired()
68
- })
69
-
70
- test('renders Text component vol5', async () => {
71
- render(
72
- <FieldsetControl labelText="test" isRequired>
73
- <Radio defaultChecked={true} />
74
- </FieldsetControl>
75
- )
26
+ const checked = screen.getByTestId('checked')
76
27
 
77
- const elem = screen.getByRole('radio')
28
+ expect(checked).toBeInTheDocument()
29
+ expect(checked).toBeChecked()
78
30
 
79
- expect(elem).toBeInTheDocument()
31
+ const notChecked = screen.getByTestId('not_checked')
80
32
 
81
- expect(elem).toBeValid()
82
- expect(elem).toBeRequired()
33
+ expect(notChecked).toBeInTheDocument()
34
+ expect(notChecked).not.toBeChecked()
83
35
  })
84
36
 
85
- test('renders Text component vol6', async () => {
86
- render(
87
- <FieldsetControl labelText="test" isRequired>
88
- <Radio />
89
- </FieldsetControl>
90
- )
91
-
92
- const elem = screen.getByRole('radio')
37
+ it('should pass an object to the ref property', async () => {
38
+ const ref = vi.fn()
93
39
 
94
- expect(elem).toBeInTheDocument()
40
+ render(<Radio ref={ref} />)
95
41
 
96
- expect(elem).toBeInvalid()
97
- expect(elem).toBeRequired()
42
+ expect(ref).toHaveBeenCalledTimes(1)
98
43
  })
99
44
  })