@sakura-ui/sakura-ui 0.2.0 → 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 (215) hide show
  1. package/README.md +16 -6
  2. package/package.json +21 -15
  3. package/packages/core/package.json +26 -15
  4. package/packages/core/src/components/Button.tsx +33 -32
  5. package/packages/core/src/components/Card.tsx +29 -17
  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 +54 -43
  11. package/packages/core/src/components/LangSelector.tsx +135 -0
  12. package/packages/core/src/components/Link.tsx +38 -66
  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 +31 -25
  21. package/packages/core/src/components/buttonStyle.ts +42 -31
  22. package/packages/core/src/components/index.ts +13 -25
  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 -28
  33. package/packages/core/src/type.d.ts +1 -0
  34. package/packages/core/tests/Button.test.tsx +20 -10
  35. package/packages/core/tests/Card.test.tsx +16 -11
  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 +1 -0
  39. package/packages/core/tsconfig.node.json +3 -2
  40. package/packages/forms/.turbo/turbo-build.log +22 -0
  41. package/packages/forms/dist/index.cjs.js +199 -120
  42. package/packages/forms/dist/index.es.js +890 -1023
  43. package/packages/forms/dist/types/components/Checkbox.d.ts +9 -4
  44. package/packages/forms/dist/types/components/Checkbox.d.ts.map +1 -1
  45. package/packages/forms/dist/types/components/FieldsetControl.d.ts +14 -9
  46. package/packages/forms/dist/types/components/FieldsetControl.d.ts.map +1 -1
  47. package/packages/forms/dist/types/components/FileInput.d.ts +10 -3
  48. package/packages/forms/dist/types/components/FileInput.d.ts.map +1 -1
  49. package/packages/forms/dist/types/components/Input.d.ts +9 -4
  50. package/packages/forms/dist/types/components/Input.d.ts.map +1 -1
  51. package/packages/forms/dist/types/components/LabelControl.d.ts +13 -8
  52. package/packages/forms/dist/types/components/LabelControl.d.ts.map +1 -1
  53. package/packages/forms/dist/types/components/Radio.d.ts +9 -4
  54. package/packages/forms/dist/types/components/Radio.d.ts.map +1 -1
  55. package/packages/forms/dist/types/components/Select.d.ts +9 -4
  56. package/packages/forms/dist/types/components/Select.d.ts.map +1 -1
  57. package/packages/forms/dist/types/components/Textarea.d.ts +8 -3
  58. package/packages/forms/dist/types/components/Textarea.d.ts.map +1 -1
  59. package/packages/forms/dist/types/components/controlled/CheckboxGroup.d.ts +16 -11
  60. package/packages/forms/dist/types/components/controlled/CheckboxGroup.d.ts.map +1 -1
  61. package/packages/forms/dist/types/components/controlled/RadioGroup.d.ts +17 -12
  62. package/packages/forms/dist/types/components/controlled/RadioGroup.d.ts.map +1 -1
  63. package/packages/forms/dist/types/components/index.d.ts +8 -8
  64. package/packages/forms/dist/types/components/index.d.ts.map +1 -1
  65. package/packages/forms/dist/types/components/inputStyle.d.ts +1 -1
  66. package/packages/forms/dist/types/components/inputStyle.d.ts.map +1 -1
  67. package/packages/forms/dist/types/index.d.ts +0 -1
  68. package/packages/forms/dist/types/index.d.ts.map +1 -1
  69. package/packages/forms/node_modules/.bin/autoprefixer +2 -2
  70. package/packages/forms/node_modules/.bin/tailwind +2 -2
  71. package/packages/forms/node_modules/.bin/tailwindcss +2 -2
  72. package/packages/forms/node_modules/.bin/ts-node +4 -4
  73. package/packages/forms/node_modules/.bin/ts-node-cwd +4 -4
  74. package/packages/forms/node_modules/.bin/ts-node-esm +4 -4
  75. package/packages/forms/node_modules/.bin/ts-node-script +4 -4
  76. package/packages/forms/node_modules/.bin/ts-node-transpile-only +4 -4
  77. package/packages/forms/node_modules/.bin/ts-script +4 -4
  78. package/packages/forms/node_modules/.bin/tsc +17 -0
  79. package/packages/forms/node_modules/.bin/tsserver +17 -0
  80. package/packages/forms/node_modules/.vite/vitest/results.json +1 -0
  81. package/packages/forms/package.json +17 -14
  82. package/packages/forms/src/components/Checkbox.tsx +76 -80
  83. package/packages/forms/src/components/FieldsetControl.tsx +21 -28
  84. package/packages/forms/src/components/FileInput.tsx +87 -63
  85. package/packages/forms/src/components/Input.tsx +29 -31
  86. package/packages/forms/src/components/LabelControl.tsx +19 -25
  87. package/packages/forms/src/components/Radio.tsx +66 -69
  88. package/packages/forms/src/components/Select.tsx +65 -65
  89. package/packages/forms/src/components/Textarea.tsx +49 -54
  90. package/packages/forms/src/components/controlled/CheckboxGroup.tsx +15 -17
  91. package/packages/forms/src/components/controlled/RadioGroup.tsx +16 -18
  92. package/packages/forms/src/components/index.ts +8 -8
  93. package/packages/forms/src/components/inputStyle.ts +7 -8
  94. package/packages/forms/src/index.ts +0 -11
  95. package/packages/forms/tests/Checkbox.test.tsx +44 -0
  96. package/packages/forms/tests/FieldsetControl.test.tsx +62 -11
  97. package/packages/forms/tests/FileInput.test.tsx +25 -0
  98. package/packages/forms/tests/Input.test.tsx +12 -83
  99. package/packages/forms/tests/LabelControl.test.tsx +82 -20
  100. package/packages/forms/tests/Radio.test.tsx +23 -78
  101. package/packages/forms/tests/Select.test.tsx +30 -0
  102. package/packages/forms/tests/Textarea.test.tsx +25 -0
  103. package/packages/forms/tests/vitest.setup.ts +1 -0
  104. package/packages/forms/tsconfig.node.json +3 -2
  105. package/packages/helper/.turbo/turbo-build.log +23 -0
  106. package/packages/helper/dist/index.cjs.js +78 -0
  107. package/packages/helper/dist/index.es.js +119 -0
  108. package/packages/helper/dist/types/calc.d.ts +2 -0
  109. package/packages/helper/dist/types/calc.d.ts.map +1 -0
  110. package/packages/{forms/dist/types/utils/class.d.ts → helper/dist/types/cx.d.ts} +1 -1
  111. package/packages/helper/dist/types/cx.d.ts.map +1 -0
  112. package/packages/helper/dist/types/index.d.ts +6 -0
  113. package/packages/helper/dist/types/index.d.ts.map +1 -0
  114. package/packages/helper/dist/types/querySelector.d.ts +2 -0
  115. package/packages/helper/dist/types/querySelector.d.ts.map +1 -0
  116. package/packages/helper/dist/types/styles.d.ts +22 -0
  117. package/packages/helper/dist/types/styles.d.ts.map +1 -0
  118. package/packages/helper/dist/types/treefy.d.ts +8 -0
  119. package/packages/helper/dist/types/treefy.d.ts.map +1 -0
  120. package/packages/helper/package.json +40 -0
  121. package/packages/helper/src/calc.ts +1 -0
  122. package/packages/helper/src/index.ts +5 -0
  123. package/packages/helper/src/querySelector.ts +20 -0
  124. package/packages/helper/src/styles.ts +116 -0
  125. package/packages/helper/src/treefy.ts +22 -0
  126. package/packages/helper/tsconfig.json +13 -0
  127. package/packages/helper/tsconfig.node.json +6 -0
  128. package/packages/helper/vite.config.ts +26 -0
  129. package/packages/markdown/.turbo/turbo-build.log +22 -0
  130. package/packages/markdown/README.md +129 -0
  131. package/packages/markdown/dist/index.cjs.js +175 -0
  132. package/packages/markdown/dist/index.es.js +17098 -0
  133. package/packages/markdown/dist/types/components/Markdown.d.ts +15 -0
  134. package/packages/markdown/dist/types/components/Markdown.d.ts.map +1 -0
  135. package/packages/markdown/dist/types/components/index.d.ts +2 -0
  136. package/packages/markdown/dist/types/components/index.d.ts.map +1 -0
  137. package/packages/markdown/dist/types/index.d.ts +2 -0
  138. package/packages/markdown/dist/types/index.d.ts.map +1 -0
  139. package/packages/markdown/dist/types/plugins/attr.d.ts +3 -0
  140. package/packages/markdown/dist/types/plugins/attr.d.ts.map +1 -0
  141. package/packages/markdown/dist/types/plugins/card.d.ts +3 -0
  142. package/packages/markdown/dist/types/plugins/card.d.ts.map +1 -0
  143. package/packages/markdown/dist/types/plugins/cell.d.ts +3 -0
  144. package/packages/markdown/dist/types/plugins/cell.d.ts.map +1 -0
  145. package/packages/markdown/dist/types/plugins/faq.d.ts +3 -0
  146. package/packages/markdown/dist/types/plugins/faq.d.ts.map +1 -0
  147. package/packages/markdown/dist/types/plugins/grid.d.ts +3 -0
  148. package/packages/markdown/dist/types/plugins/grid.d.ts.map +1 -0
  149. package/packages/markdown/dist/types/plugins/headings.d.ts +9 -0
  150. package/packages/markdown/dist/types/plugins/headings.d.ts.map +1 -0
  151. package/packages/markdown/dist/types/plugins/helper.d.ts +9 -0
  152. package/packages/markdown/dist/types/plugins/helper.d.ts.map +1 -0
  153. package/packages/markdown/dist/types/plugins/index.d.ts +9 -0
  154. package/packages/markdown/dist/types/plugins/index.d.ts.map +1 -0
  155. package/packages/markdown/dist/types/plugins/linkButton.d.ts +3 -0
  156. package/packages/markdown/dist/types/plugins/linkButton.d.ts.map +1 -0
  157. package/packages/markdown/dist/types/plugins/youtube.d.ts +3 -0
  158. package/packages/markdown/dist/types/plugins/youtube.d.ts.map +1 -0
  159. package/packages/markdown/node_modules/.bin/autoprefixer +17 -0
  160. package/packages/markdown/node_modules/.bin/tailwind +17 -0
  161. package/packages/markdown/node_modules/.bin/tailwindcss +17 -0
  162. package/packages/markdown/node_modules/.bin/ts-node +17 -0
  163. package/packages/markdown/node_modules/.bin/ts-node-cwd +17 -0
  164. package/packages/markdown/node_modules/.bin/ts-node-esm +17 -0
  165. package/packages/markdown/node_modules/.bin/ts-node-script +17 -0
  166. package/packages/markdown/node_modules/.bin/ts-node-transpile-only +17 -0
  167. package/packages/markdown/node_modules/.bin/ts-script +17 -0
  168. package/packages/markdown/node_modules/.bin/tsc +17 -0
  169. package/packages/markdown/node_modules/.bin/tsserver +17 -0
  170. package/packages/markdown/package.json +83 -0
  171. package/packages/markdown/src/components/Markdown.tsx +361 -0
  172. package/packages/markdown/src/components/index.ts +1 -0
  173. package/packages/markdown/src/global.d.ts +9 -0
  174. package/packages/markdown/src/index.ts +1 -0
  175. package/packages/markdown/src/plugins/attr.ts +19 -0
  176. package/packages/markdown/src/plugins/card.ts +57 -0
  177. package/packages/markdown/src/plugins/cell.ts +47 -0
  178. package/packages/markdown/src/plugins/faq.ts +40 -0
  179. package/packages/markdown/src/plugins/grid.ts +51 -0
  180. package/packages/markdown/src/plugins/headings.ts +35 -0
  181. package/packages/markdown/src/plugins/helper.ts +27 -0
  182. package/packages/markdown/src/plugins/index.ts +8 -0
  183. package/packages/markdown/src/plugins/linkButton.ts +25 -0
  184. package/packages/markdown/src/plugins/youtube.ts +48 -0
  185. package/packages/markdown/tsconfig.json +13 -0
  186. package/packages/markdown/tsconfig.node.json +7 -0
  187. package/packages/markdown/vite.config.ts +30 -0
  188. package/packages/tailwind-theme-plugin/.turbo/turbo-build.log +22 -0
  189. package/packages/tailwind-theme-plugin/dist/index.cjs.js +1 -1
  190. package/packages/tailwind-theme-plugin/dist/index.es.js +5354 -6111
  191. package/packages/tailwind-theme-plugin/dist/types/index.d.ts +1 -1
  192. package/packages/tailwind-theme-plugin/dist/types/index.d.ts.map +1 -1
  193. package/packages/tailwind-theme-plugin/node_modules/.bin/autoprefixer +2 -2
  194. package/packages/tailwind-theme-plugin/node_modules/.bin/tailwind +2 -2
  195. package/packages/tailwind-theme-plugin/node_modules/.bin/tailwindcss +2 -2
  196. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node +4 -4
  197. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-cwd +4 -4
  198. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-esm +4 -4
  199. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-script +4 -4
  200. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-transpile-only +4 -4
  201. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-script +4 -4
  202. package/packages/tailwind-theme-plugin/node_modules/.bin/tsc +17 -0
  203. package/packages/tailwind-theme-plugin/node_modules/.bin/tsserver +17 -0
  204. package/packages/tailwind-theme-plugin/package.json +6 -6
  205. package/packages/tailwind-theme-plugin/src/index.ts +226 -291
  206. package/packages/core/src/libs/forward-ref.ts +0 -44
  207. package/packages/core/src/types/component.ts +0 -83
  208. package/packages/forms/dist/types/utils/class.d.ts.map +0 -1
  209. package/packages/forms/node_modules/.bin/acorn +0 -17
  210. package/packages/forms/node_modules/.bin/browserslist +0 -17
  211. package/packages/forms/node_modules/.bin/eslint +0 -17
  212. package/packages/forms/node_modules/.bin/vitest +0 -17
  213. package/packages/forms/src/utils/class.ts +0 -2
  214. package/packages/tailwind-theme-plugin/node_modules/.bin/browserslist +0 -17
  215. /package/packages/{core/src/libs → helper/src}/cx.ts +0 -0
@@ -1,11 +1,11 @@
1
1
  import React from 'react'
2
- import { describe, test, expect } from 'vitest'
2
+ import { describe, it, expect } from 'vitest'
3
3
  import { render, screen } from '@testing-library/react'
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
1
  import React from 'react'
2
- import { describe, test, expect } from 'vitest'
2
+ import { describe, it, expect, vi } from 'vitest'
3
3
  import { render, screen } from '@testing-library/react'
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
1
  import React from 'react'
2
- import { describe, test, expect } from 'vitest'
2
+ import { describe, test, it, expect } from 'vitest'
3
3
  import { render, screen } from '@testing-library/react'
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
1
  import React from 'react'
2
- import { describe, test, expect } from 'vitest'
2
+ import { describe, it, expect, vi } from 'vitest'
3
3
  import { render, screen } from '@testing-library/react'
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
  })
@@ -0,0 +1,30 @@
1
+ import React from 'react'
2
+ import { describe, it, expect, vi } from 'vitest'
3
+ import { render, screen } from '@testing-library/react'
4
+
5
+ import { Select } from '../src'
6
+
7
+ describe('Select', () => {
8
+ it('should render a select with a value text', async () => {
9
+ render(
10
+ <Select value="dog">
11
+ <option value="cat">Cat</option>
12
+ <option value="dog">Dog</option>
13
+ </Select>
14
+ )
15
+
16
+ const select = screen.getByRole('combobox')
17
+
18
+ expect(select).toBeInTheDocument()
19
+
20
+ expect(screen.getByDisplayValue('Dog')).toBeInTheDocument()
21
+ })
22
+
23
+ it('should pass an object to the ref property', async () => {
24
+ const ref = vi.fn()
25
+
26
+ render(<Select ref={ref} />)
27
+
28
+ expect(ref).toHaveBeenCalledTimes(1)
29
+ })
30
+ })
@@ -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 { Textarea } from '../src'
6
+
7
+ describe('Textarea', () => {
8
+ it('should render a textarea with a value text', async () => {
9
+ render(<Textarea value="test" />)
10
+
11
+ const input = screen.getByRole('textbox')
12
+
13
+ expect(input).toBeInTheDocument()
14
+
15
+ expect(screen.getByDisplayValue('test')).toBeInTheDocument()
16
+ })
17
+
18
+ it('should pass an object to the ref property', async () => {
19
+ const ref = vi.fn()
20
+
21
+ render(<Textarea ref={ref} />)
22
+
23
+ expect(ref).toHaveBeenCalledTimes(1)
24
+ })
25
+ })
@@ -1 +1,2 @@
1
+ /// <reference types="vitest" />
1
2
  import '@testing-library/jest-dom'
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "composite": true
3
+ "composite": true,
4
+ "resolveJsonModule": true
4
5
  },
5
- "include": ["vite.config.ts"]
6
+ "include": ["vite.config.ts", "package.json"]
6
7
  }
@@ -0,0 +1,23 @@
1
+
2
+ 
3
+ > @sakura-ui/helper@0.0.5 prebuild /Users/t.fujita/Documents/Repos/sakura-ui/packages/helper
4
+ > rimraf dist
5
+
6
+
7
+ > @sakura-ui/helper@0.0.5 build /Users/t.fujita/Documents/Repos/sakura-ui/packages/helper
8
+ > run-p build:*
9
+
10
+
11
+ > @sakura-ui/helper@0.0.5 build:scripts /Users/t.fujita/Documents/Repos/sakura-ui/packages/helper
12
+ > vite build
13
+
14
+
15
+ > @sakura-ui/helper@0.0.5 build:types /Users/t.fujita/Documents/Repos/sakura-ui/packages/helper
16
+ > tsc && tsc-alias
17
+
18
+ The CJS build of Vite's Node API is deprecated. See https://vite.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated for more details.
19
+ vite v6.0.3 building for production...
20
+ transforming (1) src/index.ts✓ 6 modules transformed.
21
+ rendering chunks (1)...computing gzip size (0)...computing gzip size (1)...dist/index.es.js 2.92 kB │ gzip: 1.00 kB
22
+ rendering chunks (1)...computing gzip size (1)...dist/index.cjs.js 2.75 kB │ gzip: 1.00 kB
23
+ ✓ built in 68ms