@sakura-ui/sakura-ui 0.2.0 → 0.4.1

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 (212) hide show
  1. package/README.md +77 -6
  2. package/package.json +28 -21
  3. package/packages/core/package.json +30 -17
  4. package/packages/core/src/components/Button.tsx +33 -32
  5. package/packages/core/src/components/Card.tsx +37 -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 +54 -43
  11. package/packages/core/src/components/LangSelector.tsx +135 -0
  12. package/packages/core/src/components/Link.tsx +37 -66
  13. package/packages/core/src/components/LinkCard.tsx +126 -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/NotificationBanner.tsx +20 -0
  18. package/packages/core/src/components/OverflowContainer.tsx +24 -0
  19. package/packages/core/src/components/PopoverMenu.tsx +82 -0
  20. package/packages/core/src/components/Pre.tsx +6 -4
  21. package/packages/core/src/components/Table.tsx +31 -25
  22. package/packages/core/src/components/buttonStyle.ts +43 -32
  23. package/packages/core/src/components/index.ts +13 -25
  24. package/packages/core/src/icons/Close.tsx +21 -0
  25. package/packages/core/src/icons/CloseMobile.tsx +43 -0
  26. package/packages/core/src/icons/KeyboardArrowDown.tsx +24 -0
  27. package/packages/core/src/icons/Language.tsx +25 -0
  28. package/packages/core/src/icons/LanguageMobile.tsx +40 -0
  29. package/packages/core/src/icons/Menu.tsx +24 -0
  30. package/packages/core/src/icons/MenuMobile.tsx +40 -0
  31. package/packages/core/src/icons/index.ts +8 -0
  32. package/packages/core/src/icons/props.ts +5 -0
  33. package/packages/core/src/index.ts +10 -28
  34. package/packages/core/src/type.d.ts +1 -0
  35. package/packages/core/tests/Button.test.tsx +20 -10
  36. package/packages/core/tests/Card.test.tsx +16 -11
  37. package/packages/core/tests/IconButton.test.tsx +57 -0
  38. package/packages/core/tests/Link.test.tsx +60 -0
  39. package/packages/core/tests/vitest.setup.ts +1 -0
  40. package/packages/core/tsconfig.node.json +3 -2
  41. package/packages/core/vite.config.ts +2 -1
  42. package/packages/forms/.turbo/turbo-build.log +12 -0
  43. package/packages/forms/dist/index.cjs.js +183 -131
  44. package/packages/forms/dist/index.es.js +750 -1062
  45. package/packages/forms/dist/types/components/Checkbox.d.ts +9 -4
  46. package/packages/forms/dist/types/components/Checkbox.d.ts.map +1 -1
  47. package/packages/forms/dist/types/components/FieldsetControl.d.ts +14 -9
  48. package/packages/forms/dist/types/components/FieldsetControl.d.ts.map +1 -1
  49. package/packages/forms/dist/types/components/FileInput.d.ts +10 -3
  50. package/packages/forms/dist/types/components/FileInput.d.ts.map +1 -1
  51. package/packages/forms/dist/types/components/Input.d.ts +9 -4
  52. package/packages/forms/dist/types/components/Input.d.ts.map +1 -1
  53. package/packages/forms/dist/types/components/LabelControl.d.ts +13 -8
  54. package/packages/forms/dist/types/components/LabelControl.d.ts.map +1 -1
  55. package/packages/forms/dist/types/components/Radio.d.ts +9 -4
  56. package/packages/forms/dist/types/components/Radio.d.ts.map +1 -1
  57. package/packages/forms/dist/types/components/Select.d.ts +9 -4
  58. package/packages/forms/dist/types/components/Select.d.ts.map +1 -1
  59. package/packages/forms/dist/types/components/Textarea.d.ts +8 -3
  60. package/packages/forms/dist/types/components/Textarea.d.ts.map +1 -1
  61. package/packages/forms/dist/types/components/controlled/CheckboxGroup.d.ts +16 -11
  62. package/packages/forms/dist/types/components/controlled/CheckboxGroup.d.ts.map +1 -1
  63. package/packages/forms/dist/types/components/controlled/RadioGroup.d.ts +17 -12
  64. package/packages/forms/dist/types/components/controlled/RadioGroup.d.ts.map +1 -1
  65. package/packages/forms/dist/types/components/index.d.ts +8 -8
  66. package/packages/forms/dist/types/components/index.d.ts.map +1 -1
  67. package/packages/forms/dist/types/components/inputStyle.d.ts +1 -1
  68. package/packages/forms/dist/types/components/inputStyle.d.ts.map +1 -1
  69. package/packages/forms/dist/types/index.d.ts +0 -1
  70. package/packages/forms/dist/types/index.d.ts.map +1 -1
  71. package/packages/forms/node_modules/.bin/autoprefixer +44 -6
  72. package/packages/forms/package.json +21 -16
  73. package/packages/forms/src/components/Checkbox.tsx +76 -80
  74. package/packages/forms/src/components/FieldsetControl.tsx +21 -28
  75. package/packages/forms/src/components/FileInput.tsx +92 -63
  76. package/packages/forms/src/components/Input.tsx +29 -31
  77. package/packages/forms/src/components/LabelControl.tsx +19 -25
  78. package/packages/forms/src/components/Radio.tsx +68 -69
  79. package/packages/forms/src/components/Select.tsx +65 -65
  80. package/packages/forms/src/components/Textarea.tsx +49 -54
  81. package/packages/forms/src/components/controlled/CheckboxGroup.tsx +15 -17
  82. package/packages/forms/src/components/controlled/RadioGroup.tsx +16 -18
  83. package/packages/forms/src/components/index.ts +8 -8
  84. package/packages/forms/src/components/inputStyle.ts +7 -8
  85. package/packages/forms/src/index.ts +0 -11
  86. package/packages/forms/tests/Checkbox.test.tsx +44 -0
  87. package/packages/forms/tests/FieldsetControl.test.tsx +68 -11
  88. package/packages/forms/tests/FileInput.test.tsx +25 -0
  89. package/packages/forms/tests/Input.test.tsx +12 -83
  90. package/packages/forms/tests/LabelControl.test.tsx +88 -20
  91. package/packages/forms/tests/Radio.test.tsx +23 -78
  92. package/packages/forms/tests/Select.test.tsx +30 -0
  93. package/packages/forms/tests/Textarea.test.tsx +25 -0
  94. package/packages/forms/tests/vitest.setup.ts +1 -0
  95. package/packages/forms/tsconfig.node.json +3 -2
  96. package/packages/forms/vite.config.ts +2 -1
  97. package/packages/helper/.turbo/turbo-build.log +12 -0
  98. package/packages/helper/dist/index.cjs.js +76 -0
  99. package/packages/helper/dist/index.es.js +119 -0
  100. package/packages/helper/dist/types/calc.d.ts +2 -0
  101. package/packages/helper/dist/types/calc.d.ts.map +1 -0
  102. package/packages/{forms/dist/types/utils/class.d.ts → helper/dist/types/cx.d.ts} +1 -1
  103. package/packages/helper/dist/types/cx.d.ts.map +1 -0
  104. package/packages/helper/dist/types/index.d.ts +6 -0
  105. package/packages/helper/dist/types/index.d.ts.map +1 -0
  106. package/packages/helper/dist/types/querySelector.d.ts +2 -0
  107. package/packages/helper/dist/types/querySelector.d.ts.map +1 -0
  108. package/packages/helper/dist/types/styles.d.ts +22 -0
  109. package/packages/helper/dist/types/styles.d.ts.map +1 -0
  110. package/packages/helper/dist/types/treefy.d.ts +8 -0
  111. package/packages/helper/dist/types/treefy.d.ts.map +1 -0
  112. package/packages/helper/node_modules/.bin/vitest +55 -0
  113. package/packages/helper/package.json +50 -0
  114. package/packages/helper/src/calc.ts +1 -0
  115. package/packages/helper/src/cx.ts +2 -0
  116. package/packages/helper/src/index.ts +5 -0
  117. package/packages/helper/src/querySelector.ts +20 -0
  118. package/packages/helper/src/styles.ts +114 -0
  119. package/packages/helper/src/treefy.ts +24 -0
  120. package/packages/helper/tests/calc.test.ts +22 -0
  121. package/packages/helper/tests/cx.test.ts +30 -0
  122. package/packages/helper/tests/querySelector.test.ts +24 -0
  123. package/packages/helper/tests/treefy.test.ts +111 -0
  124. package/packages/helper/tests/vitest.setup.ts +2 -0
  125. package/packages/helper/tsconfig.json +13 -0
  126. package/packages/helper/tsconfig.node.json +6 -0
  127. package/packages/helper/vite.config.ts +26 -0
  128. package/packages/markdown/.turbo/turbo-build.log +12 -0
  129. package/packages/markdown/README.md +129 -0
  130. package/packages/markdown/dist/index.cjs.js +149 -0
  131. package/packages/markdown/dist/index.es.js +16960 -0
  132. package/packages/markdown/dist/types/components/Markdown.d.ts +15 -0
  133. package/packages/markdown/dist/types/components/Markdown.d.ts.map +1 -0
  134. package/packages/markdown/dist/types/components/index.d.ts +2 -0
  135. package/packages/markdown/dist/types/components/index.d.ts.map +1 -0
  136. package/packages/markdown/dist/types/index.d.ts +2 -0
  137. package/packages/markdown/dist/types/index.d.ts.map +1 -0
  138. package/packages/markdown/dist/types/plugins/attr.d.ts +3 -0
  139. package/packages/markdown/dist/types/plugins/attr.d.ts.map +1 -0
  140. package/packages/markdown/dist/types/plugins/card.d.ts +3 -0
  141. package/packages/markdown/dist/types/plugins/card.d.ts.map +1 -0
  142. package/packages/markdown/dist/types/plugins/cell.d.ts +3 -0
  143. package/packages/markdown/dist/types/plugins/cell.d.ts.map +1 -0
  144. package/packages/markdown/dist/types/plugins/faq.d.ts +3 -0
  145. package/packages/markdown/dist/types/plugins/faq.d.ts.map +1 -0
  146. package/packages/markdown/dist/types/plugins/grid.d.ts +3 -0
  147. package/packages/markdown/dist/types/plugins/grid.d.ts.map +1 -0
  148. package/packages/markdown/dist/types/plugins/headings.d.ts +11 -0
  149. package/packages/markdown/dist/types/plugins/headings.d.ts.map +1 -0
  150. package/packages/markdown/dist/types/plugins/helper.d.ts +9 -0
  151. package/packages/markdown/dist/types/plugins/helper.d.ts.map +1 -0
  152. package/packages/markdown/dist/types/plugins/index.d.ts +9 -0
  153. package/packages/markdown/dist/types/plugins/index.d.ts.map +1 -0
  154. package/packages/markdown/dist/types/plugins/linkButton.d.ts +3 -0
  155. package/packages/markdown/dist/types/plugins/linkButton.d.ts.map +1 -0
  156. package/packages/markdown/dist/types/plugins/youtube.d.ts +3 -0
  157. package/packages/markdown/dist/types/plugins/youtube.d.ts.map +1 -0
  158. package/packages/markdown/node_modules/.bin/autoprefixer +55 -0
  159. package/packages/markdown/package.json +84 -0
  160. package/packages/markdown/src/components/Markdown.tsx +365 -0
  161. package/packages/markdown/src/components/index.ts +1 -0
  162. package/packages/markdown/src/global.d.ts +9 -0
  163. package/packages/markdown/src/index.ts +1 -0
  164. package/packages/markdown/src/plugins/attr.ts +19 -0
  165. package/packages/markdown/src/plugins/card.ts +57 -0
  166. package/packages/markdown/src/plugins/cell.ts +47 -0
  167. package/packages/markdown/src/plugins/faq.ts +40 -0
  168. package/packages/markdown/src/plugins/grid.ts +54 -0
  169. package/packages/markdown/src/plugins/headings.ts +38 -0
  170. package/packages/markdown/src/plugins/helper.ts +27 -0
  171. package/packages/markdown/src/plugins/index.ts +8 -0
  172. package/packages/markdown/src/plugins/linkButton.ts +26 -0
  173. package/packages/markdown/src/plugins/youtube.ts +49 -0
  174. package/packages/markdown/tsconfig.json +13 -0
  175. package/packages/markdown/tsconfig.node.json +7 -0
  176. package/packages/markdown/vite.config.ts +30 -0
  177. package/packages/tailwind-theme-plugin/#package.json# +51 -0
  178. package/packages/tailwind-theme-plugin/.turbo/turbo-build.log +12 -0
  179. package/packages/tailwind-theme-plugin/dist/index.cjs.js +1 -1
  180. package/packages/tailwind-theme-plugin/dist/index.es.js +4970 -6093
  181. package/packages/tailwind-theme-plugin/dist/types/index.d.ts +1 -4
  182. package/packages/tailwind-theme-plugin/dist/types/index.d.ts.map +1 -1
  183. package/packages/tailwind-theme-plugin/node_modules/.bin/autoprefixer +44 -6
  184. package/packages/tailwind-theme-plugin/package.json +11 -9
  185. package/packages/tailwind-theme-plugin/src/index.ts +241 -349
  186. package/packages/tailwind-theme-plugin/vite.config.ts +2 -0
  187. package/packages/core/src/libs/cx.ts +0 -2
  188. package/packages/core/src/libs/forward-ref.ts +0 -44
  189. package/packages/core/src/types/component.ts +0 -83
  190. package/packages/forms/dist/types/utils/class.d.ts.map +0 -1
  191. package/packages/forms/node_modules/.bin/acorn +0 -17
  192. package/packages/forms/node_modules/.bin/browserslist +0 -17
  193. package/packages/forms/node_modules/.bin/eslint +0 -17
  194. package/packages/forms/node_modules/.bin/tailwind +0 -17
  195. package/packages/forms/node_modules/.bin/tailwindcss +0 -17
  196. package/packages/forms/node_modules/.bin/ts-node +0 -17
  197. package/packages/forms/node_modules/.bin/ts-node-cwd +0 -17
  198. package/packages/forms/node_modules/.bin/ts-node-esm +0 -17
  199. package/packages/forms/node_modules/.bin/ts-node-script +0 -17
  200. package/packages/forms/node_modules/.bin/ts-node-transpile-only +0 -17
  201. package/packages/forms/node_modules/.bin/ts-script +0 -17
  202. package/packages/forms/node_modules/.bin/vitest +0 -17
  203. package/packages/forms/src/utils/class.ts +0 -2
  204. package/packages/tailwind-theme-plugin/node_modules/.bin/browserslist +0 -17
  205. package/packages/tailwind-theme-plugin/node_modules/.bin/tailwind +0 -17
  206. package/packages/tailwind-theme-plugin/node_modules/.bin/tailwindcss +0 -17
  207. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node +0 -17
  208. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-cwd +0 -17
  209. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-esm +0 -17
  210. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-script +0 -17
  211. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-node-transpile-only +0 -17
  212. package/packages/tailwind-theme-plugin/node_modules/.bin/ts-script +0 -17
@@ -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,61 @@ 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(
38
+ 'aria-describedby',
39
+ screen.getByText('helper').id
40
+ )
41
+ expect(input).toHaveAttribute(
42
+ 'aria-errormessage',
43
+ screen.getByText('error').id
44
+ )
45
+
46
+ expect(input).toBeInvalid()
47
+ expect(input).toHaveAttribute('aria-invalid', 'true')
29
48
  })
30
49
 
31
- test('renders FieldsetControl component vol3', async () => {
50
+ it('should render a fieldset with a helper text', async () => {
32
51
  render(
33
52
  <FieldsetControl
34
53
  labelText="test"
35
54
  helperText="helper"
36
55
  errorMessage="error"
37
- isInvalid
38
- />
56
+ >
57
+ <Input />
58
+ </FieldsetControl>
39
59
  )
40
60
 
41
61
  expect(screen.getByText('helper')).toBeInTheDocument()
42
- expect(screen.getByText('error')).toBeInTheDocument()
62
+ expect(screen.queryByText('error')).toBeNull()
63
+
64
+ const input = screen.getByRole('textbox')
65
+
66
+ expect(input).toBeInTheDocument()
67
+
68
+ expect(input).toBeValid()
69
+ expect(input).toHaveAttribute('aria-invalid', 'false')
43
70
  })
44
71
 
45
- test('renders FieldsetControl component vol4', async () => {
72
+ it('should display an asterisk only when isRequired prop is true', async () => {
46
73
  render(<FieldsetControl labelText="test" />)
47
74
 
48
75
  expect(screen.queryByText('*')).toBeNull()
@@ -51,4 +78,34 @@ describe('FieldsetControl', () => {
51
78
 
52
79
  expect(screen.getByText('*')).toBeInTheDocument()
53
80
  })
81
+
82
+ it('should render an input with required attribute and correct label text', async () => {
83
+ render(
84
+ <FieldsetControl labelText="test" isRequired>
85
+ <Input defaultValue="test value" />
86
+ </FieldsetControl>
87
+ )
88
+
89
+ const input = screen.getByRole('textbox')
90
+
91
+ expect(input).toBeInTheDocument()
92
+
93
+ expect(input).toBeValid()
94
+ expect(input).toBeRequired()
95
+ })
96
+
97
+ it('should render an input as invalid when required but has no value', async () => {
98
+ render(
99
+ <FieldsetControl labelText="test" isRequired>
100
+ <Input />
101
+ </FieldsetControl>
102
+ )
103
+
104
+ const input = screen.getByRole('textbox')
105
+
106
+ expect(input).toBeInTheDocument()
107
+
108
+ expect(input).toBeInvalid()
109
+ expect(input).toBeRequired()
110
+ })
54
111
  })
@@ -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,68 @@
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(
38
+ 'aria-describedby',
39
+ screen.getByText('helper').id
40
+ )
41
+ expect(input).toHaveAttribute(
42
+ 'aria-errormessage',
43
+ screen.getByText('error').id
44
+ )
45
+
46
+ expect(input).toBeInvalid()
47
+ expect(input).toHaveAttribute('aria-invalid', 'true')
48
+ })
49
+
50
+ it('should render a fieldset with a helper text', async () => {
51
+ render(
52
+ <LabelControl labelText="test">
53
+ <Input />
54
+ </LabelControl>
55
+ )
56
+
57
+ const input = screen.getByLabelText(/test/)
58
+
59
+ expect(input).toBeInTheDocument()
60
+
61
+ expect(input).toBeValid()
62
+ expect(input).toHaveAttribute('aria-invalid', 'false')
39
63
  })
40
64
 
41
- test('renders LabelControl component vol4', async () => {
65
+ it('should display an asterisk only when isRequired prop is true', async () => {
42
66
  render(<LabelControl labelText="test" />)
43
67
 
44
68
  expect(screen.queryByText('*')).toBeNull()
@@ -48,6 +72,36 @@ describe('LabelControl', () => {
48
72
  expect(screen.getByText('*')).toBeInTheDocument()
49
73
  })
50
74
 
75
+ it('should render an input with required attribute and correct label text', async () => {
76
+ render(
77
+ <LabelControl labelText="test" isRequired>
78
+ <Input defaultValue="test value" />
79
+ </LabelControl>
80
+ )
81
+
82
+ const input = screen.getByLabelText(/test/)
83
+
84
+ expect(input).toBeInTheDocument()
85
+
86
+ expect(input).toBeValid()
87
+ expect(input).toBeRequired()
88
+ })
89
+
90
+ it('should render an input as invalid when required but has no value', async () => {
91
+ render(
92
+ <LabelControl labelText="test" isRequired>
93
+ <Input />
94
+ </LabelControl>
95
+ )
96
+
97
+ const input = screen.getByLabelText(/test/)
98
+
99
+ expect(input).toBeInTheDocument()
100
+
101
+ expect(input).toBeInvalid()
102
+ expect(input).toBeRequired()
103
+ })
104
+
51
105
  test('Test the relationship between the label and input elements.', async () => {
52
106
  render(
53
107
  <>
@@ -60,6 +114,9 @@ describe('LabelControl', () => {
60
114
  <Input defaultValue="1" />
61
115
  </LabelControl>
62
116
  <LabelControl labelText="test3">
117
+ <FileInput />
118
+ </LabelControl>
119
+ <LabelControl labelText="test4">
63
120
  <Textarea defaultValue="1" />
64
121
  </LabelControl>
65
122
  </>
@@ -75,7 +132,11 @@ describe('LabelControl', () => {
75
132
  expect(text).toHaveValue('1')
76
133
  expect(text).toHaveAttribute('id')
77
134
 
78
- const textarea = screen.getByLabelText(/test3/)
135
+ const file = screen.getByLabelText(/test3/)
136
+ expect(file).toBeInTheDocument()
137
+ expect(file).toHaveAttribute('id')
138
+
139
+ const textarea = screen.getByLabelText(/test4/)
79
140
  expect(textarea).toBeInTheDocument()
80
141
  expect(textarea).toHaveValue('1')
81
142
  expect(textarea).toHaveAttribute('id')
@@ -93,6 +154,9 @@ describe('LabelControl', () => {
93
154
  <Input defaultValue="1" />
94
155
  </LabelControl>
95
156
  <LabelControl labelText="test3" htmlFor="id3">
157
+ <FileInput />
158
+ </LabelControl>
159
+ <LabelControl labelText="test4" htmlFor="id4">
96
160
  <Textarea defaultValue="1" />
97
161
  </LabelControl>
98
162
  </>
@@ -108,9 +172,13 @@ describe('LabelControl', () => {
108
172
  expect(input).toHaveValue('1')
109
173
  expect(input).toHaveAttribute('id', 'id2')
110
174
 
111
- const textarea = screen.getByLabelText(/test3/)
175
+ const file = screen.getByLabelText(/test3/)
176
+ expect(file).toBeInTheDocument()
177
+ expect(file).toHaveAttribute('id', 'id3')
178
+
179
+ const textarea = screen.getByLabelText(/test4/)
112
180
  expect(textarea).toBeInTheDocument()
113
181
  expect(textarea).toHaveValue('1')
114
- expect(textarea).toHaveAttribute('id', 'id3')
182
+ expect(textarea).toHaveAttribute('id', 'id4')
115
183
  })
116
184
  })
@@ -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
  }
@@ -3,10 +3,11 @@ import { resolve } from 'node:path'
3
3
  import { defineConfig } from 'vite'
4
4
  import react from '@vitejs/plugin-react-swc'
5
5
  import { peerDependencies } from './package.json'
6
+ import tailwindcss from '@tailwindcss/vite'
6
7
 
7
8
  // https://vitejs.dev/config/
8
9
  export default defineConfig({
9
- plugins: [react()],
10
+ plugins: [react(), tailwindcss()],
10
11
  resolve: {
11
12
  alias: {
12
13
  '@': resolve(__dirname, 'src')
@@ -0,0 +1,12 @@
1
+ $ rimraf dist
2
+ $ run-p build:*
3
+ $ vite build
4
+ $ tsc && tsc-alias
5
+ vite v7.3.6 building client environment for production...
6
+ transforming...
7
+ ✓ 6 modules transformed.
8
+ rendering chunks...
9
+ computing gzip size...
10
+ dist/index.es.js 2.90 kB │ gzip: 1.00 kB
11
+ dist/index.cjs.js 2.72 kB │ gzip: 0.99 kB
12
+ ✓ built in 303ms