@sakura-ui/sakura-ui 0.0.16 → 0.1.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 (133) hide show
  1. package/README.md +43 -11
  2. package/package.json +3 -3
  3. package/packages/{react → core}/package.json +3 -3
  4. package/packages/{react → core}/src/components/Button.tsx +2 -2
  5. package/packages/{react → core}/src/components/Card.tsx +2 -2
  6. package/packages/{react → core}/src/components/Code.tsx +2 -2
  7. package/packages/{react → core}/src/components/Heading.tsx +18 -18
  8. package/packages/{react → core}/src/components/Icon.tsx +2 -2
  9. package/packages/{react → core}/src/components/IconButton.tsx +2 -2
  10. package/packages/{react → core}/src/components/InfoCard.tsx +4 -4
  11. package/packages/{react → core}/src/components/Link.tsx +6 -6
  12. package/packages/{react → core}/src/components/List.tsx +4 -4
  13. package/packages/{react → core}/src/components/Pre.tsx +2 -2
  14. package/packages/{react → core}/src/components/Table.tsx +14 -14
  15. package/packages/core/tsconfig.json +11 -0
  16. package/packages/forms/coverage/clover.xml +209 -0
  17. package/packages/forms/coverage/coverage-final.json +18 -0
  18. package/packages/forms/coverage/lcov-report/base.css +224 -0
  19. package/packages/forms/coverage/lcov-report/block-navigation.js +87 -0
  20. package/packages/forms/coverage/lcov-report/favicon.png +0 -0
  21. package/packages/forms/coverage/lcov-report/index.html +161 -0
  22. package/packages/forms/coverage/lcov-report/prettify.css +1 -0
  23. package/packages/forms/coverage/lcov-report/prettify.js +2 -0
  24. package/packages/forms/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  25. package/packages/forms/coverage/lcov-report/sorter.js +196 -0
  26. package/packages/forms/coverage/lcov-report/src/components/Checkbox.tsx.html +295 -0
  27. package/packages/forms/coverage/lcov-report/src/components/FieldsetControl.tsx.html +295 -0
  28. package/packages/forms/coverage/lcov-report/src/components/LabelControl.tsx.html +289 -0
  29. package/packages/forms/coverage/lcov-report/src/components/Radio.tsx.html +262 -0
  30. package/packages/forms/coverage/lcov-report/src/components/Select.tsx.html +259 -0
  31. package/packages/forms/coverage/lcov-report/src/components/Text.tsx.html +220 -0
  32. package/packages/forms/coverage/lcov-report/src/components/Textarea.tsx.html +229 -0
  33. package/packages/forms/coverage/lcov-report/src/components/context.ts.html +136 -0
  34. package/packages/forms/coverage/lcov-report/src/components/controlled/CheckboxGroup.tsx.html +244 -0
  35. package/packages/forms/coverage/lcov-report/src/components/controlled/RadioGroup.tsx.html +265 -0
  36. package/packages/forms/coverage/lcov-report/src/components/controlled/SelectControl.tsx.html +205 -0
  37. package/packages/forms/coverage/lcov-report/src/components/controlled/TextControl.tsx.html +202 -0
  38. package/packages/forms/coverage/lcov-report/src/components/controlled/TextareaControl.tsx.html +205 -0
  39. package/packages/forms/coverage/lcov-report/src/components/controlled/index.html +191 -0
  40. package/packages/forms/coverage/lcov-report/src/components/controlled/index.ts.html +100 -0
  41. package/packages/forms/coverage/lcov-report/src/components/index.html +236 -0
  42. package/packages/forms/coverage/lcov-report/src/components/index.ts.html +106 -0
  43. package/packages/forms/coverage/lcov-report/src/index.html +116 -0
  44. package/packages/forms/coverage/lcov-report/src/index.ts.html +136 -0
  45. package/packages/forms/coverage/lcov-report/src/utils/index.html +116 -0
  46. package/packages/forms/coverage/lcov-report/src/utils/index.ts.html +88 -0
  47. package/packages/forms/coverage/lcov.info +434 -0
  48. package/packages/forms/dist/index.cjs.js +20 -24
  49. package/packages/forms/dist/index.cjs.js.map +1 -1
  50. package/packages/forms/dist/index.es.js +561 -375
  51. package/packages/forms/dist/index.es.js.map +1 -1
  52. package/packages/forms/jest.config.ts +14 -0
  53. package/packages/forms/node_modules/.bin/autoprefixer +2 -2
  54. package/packages/forms/node_modules/.bin/browserslist +17 -0
  55. package/packages/forms/node_modules/.bin/jest +4 -4
  56. package/packages/forms/node_modules/.bin/npm-run-all +2 -2
  57. package/packages/forms/node_modules/.bin/run-p +2 -2
  58. package/packages/forms/node_modules/.bin/run-s +2 -2
  59. package/packages/forms/node_modules/.bin/tailwind +4 -4
  60. package/packages/forms/node_modules/.bin/tailwindcss +4 -4
  61. package/packages/forms/node_modules/.bin/ts-jest +4 -4
  62. package/packages/forms/node_modules/.bin/ts-node +4 -4
  63. package/packages/forms/node_modules/.bin/ts-node-cwd +4 -4
  64. package/packages/forms/node_modules/.bin/ts-node-esm +4 -4
  65. package/packages/forms/node_modules/.bin/ts-node-script +4 -4
  66. package/packages/forms/node_modules/.bin/ts-node-transpile-only +4 -4
  67. package/packages/forms/node_modules/.bin/ts-script +4 -4
  68. package/packages/forms/node_modules/.bin/tsc +2 -2
  69. package/packages/forms/node_modules/.bin/tsc-alias +2 -2
  70. package/packages/forms/node_modules/.bin/tsserver +2 -2
  71. package/packages/forms/node_modules/.bin/vite +2 -2
  72. package/packages/forms/package.json +6 -1
  73. package/packages/forms/src/components/Checkbox.tsx +19 -8
  74. package/packages/forms/src/components/FieldsetControl.tsx +70 -0
  75. package/packages/forms/src/components/LabelControl.tsx +68 -0
  76. package/packages/forms/src/components/Radio.tsx +24 -9
  77. package/packages/forms/src/components/Select.tsx +22 -7
  78. package/packages/forms/src/components/Text.tsx +14 -4
  79. package/packages/forms/src/components/Textarea.tsx +18 -3
  80. package/packages/forms/src/components/context.ts +17 -0
  81. package/packages/forms/src/components/controlled/CheckboxGroup.tsx +37 -15
  82. package/packages/forms/src/components/controlled/RadioGroup.tsx +44 -20
  83. package/packages/forms/src/components/controlled/SelectControl.tsx +40 -0
  84. package/packages/forms/src/components/controlled/TextControl.tsx +39 -0
  85. package/packages/forms/src/components/controlled/TextareaControl.tsx +40 -0
  86. package/packages/forms/src/components/controlled/index.ts +3 -3
  87. package/packages/forms/src/components/index.ts +2 -0
  88. package/packages/forms/src/index.ts +12 -4
  89. package/packages/forms/tests/FieldsetControl.test.tsx +54 -0
  90. package/packages/forms/tests/LabelControl.test.tsx +116 -0
  91. package/packages/forms/tests/Radio.test.tsx +99 -0
  92. package/packages/forms/tests/Text.test.tsx +96 -0
  93. package/packages/forms/tsconfig.json +1 -17
  94. package/packages/forms/dist/components/Checkbox.d.ts +0 -5
  95. package/packages/forms/dist/components/Checkbox.d.ts.map +0 -1
  96. package/packages/forms/dist/components/Radio.d.ts +0 -5
  97. package/packages/forms/dist/components/Radio.d.ts.map +0 -1
  98. package/packages/forms/dist/components/Select.d.ts +0 -5
  99. package/packages/forms/dist/components/Select.d.ts.map +0 -1
  100. package/packages/forms/dist/components/Text.d.ts +0 -5
  101. package/packages/forms/dist/components/Text.d.ts.map +0 -1
  102. package/packages/forms/dist/components/Textarea.d.ts +0 -5
  103. package/packages/forms/dist/components/Textarea.d.ts.map +0 -1
  104. package/packages/forms/dist/components/controlled/CheckboxGroup.d.ts +0 -9
  105. package/packages/forms/dist/components/controlled/CheckboxGroup.d.ts.map +0 -1
  106. package/packages/forms/dist/components/controlled/InputItem.d.ts +0 -5
  107. package/packages/forms/dist/components/controlled/InputItem.d.ts.map +0 -1
  108. package/packages/forms/dist/components/controlled/RadioGroup.d.ts +0 -9
  109. package/packages/forms/dist/components/controlled/RadioGroup.d.ts.map +0 -1
  110. package/packages/forms/dist/components/controlled/Select.d.ts +0 -6
  111. package/packages/forms/dist/components/controlled/Select.d.ts.map +0 -1
  112. package/packages/forms/dist/components/controlled/Text.d.ts +0 -6
  113. package/packages/forms/dist/components/controlled/Text.d.ts.map +0 -1
  114. package/packages/forms/dist/components/controlled/Textarea.d.ts +0 -6
  115. package/packages/forms/dist/components/controlled/Textarea.d.ts.map +0 -1
  116. package/packages/forms/dist/components/controlled/index.d.ts +0 -6
  117. package/packages/forms/dist/components/controlled/index.d.ts.map +0 -1
  118. package/packages/forms/dist/components/index.d.ts +0 -6
  119. package/packages/forms/dist/components/index.d.ts.map +0 -1
  120. package/packages/forms/dist/index.d.ts +0 -3
  121. package/packages/forms/dist/index.d.ts.map +0 -1
  122. package/packages/forms/dist/utils/index.d.ts +0 -2
  123. package/packages/forms/dist/utils/index.d.ts.map +0 -1
  124. package/packages/forms/src/components/controlled/Select.tsx +0 -22
  125. package/packages/forms/src/components/controlled/Text.tsx +0 -22
  126. package/packages/forms/src/components/controlled/Textarea.tsx +0 -23
  127. package/packages/forms/src/vite-env.d.ts +0 -1
  128. package/packages/react/tsconfig.json +0 -27
  129. /package/packages/{react → core}/src/components/index.ts +0 -0
  130. /package/packages/{react → core}/src/index.ts +0 -0
  131. /package/packages/{react → core}/src/utils/index.ts +0 -0
  132. /package/packages/{react → core}/tsconfig.node.json +0 -0
  133. /package/packages/{react → core}/vite.config.ts +0 -0
@@ -1,19 +1,26 @@
1
1
  import React from 'react'
2
2
  import { cx } from '../utils'
3
+ import { ControllerContext } from './context'
3
4
 
4
5
  export interface TextareaProps
5
6
  extends React.ComponentPropsWithoutRef<'textarea'> {}
6
7
 
7
8
  export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
8
9
  (props, ref) => {
9
- const { className, children, ...newProps } = props
10
+ const { className, children, ...restProps } = props
11
+
12
+ const ctx = React.useContext(ControllerContext)
13
+ if (ctx.isRequired) {
14
+ restProps.required = true
15
+ }
16
+
17
+ const invalidStyle = ctx.isInvalid ? 'border-sun-800' : 'border-sumi-900'
10
18
 
11
19
  const style = `
12
20
  p-4
13
21
  rounded-lg
14
22
  border
15
23
  border-solid
16
- border-sumi-900
17
24
  focus:outline
18
25
  focus:outline-2
19
26
  focus:outline-wood-500
@@ -25,7 +32,15 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
25
32
  `
26
33
 
27
34
  return (
28
- <textarea className={cx(style, className)} {...newProps} ref={ref}>
35
+ <textarea
36
+ id={restProps.id ?? ctx.id}
37
+ className={cx(style, invalidStyle, className)}
38
+ aria-describedby={ctx.helperTextId}
39
+ aria-errormessage={ctx.errorMessageId}
40
+ aria-invalid={ctx.isInvalid ?? false}
41
+ {...restProps}
42
+ ref={ref}
43
+ >
29
44
  {children}
30
45
  </textarea>
31
46
  )
@@ -0,0 +1,17 @@
1
+ import React from 'react'
2
+
3
+ export interface ControllerContextType {
4
+ id?: string
5
+ groupName?: string
6
+ helperTextId: string
7
+ errorMessageId: string
8
+ isInvalid: boolean
9
+ isRequired?: boolean
10
+ }
11
+
12
+ export const ControllerContext = React.createContext<ControllerContextType>({
13
+ helperTextId: '',
14
+ errorMessageId: '',
15
+ isInvalid: false,
16
+ isRequired: false
17
+ })
@@ -1,31 +1,53 @@
1
1
  import React from 'react'
2
2
  import { Checkbox } from '../Checkbox'
3
+ import { FieldsetControl } from '../FieldsetControl'
3
4
  import { InputItem } from './InputItem'
4
- import { cx } from '../../utils'
5
5
 
6
6
  export interface CheckboxGroupProps
7
- extends Omit<React.ComponentProps<'fieldset'>, 'onChange'> {
7
+ extends Omit<React.ComponentPropsWithoutRef<'fieldset'>, 'onChange'> {
8
8
  items: InputItem[]
9
9
  onChange: React.ChangeEventHandler<HTMLInputElement>
10
- label: string
10
+ labelText: string
11
+ helperText?: string
12
+ errorMessage?: string
13
+ isInvalid?: boolean
14
+ isRequired?: boolean
11
15
  }
12
16
 
13
- export const CheckboxGroup = (props: CheckboxGroupProps) => {
14
- const { items, onChange, label, className, ...newProps } = props
15
- const groupName = `checkbox_group_${Math.random()}`
17
+ export const CheckboxGroup = React.forwardRef<
18
+ HTMLFieldSetElement,
19
+ CheckboxGroupProps
20
+ >((props, ref) => {
21
+ const {
22
+ items,
23
+ onChange,
24
+ className,
25
+ labelText,
26
+ helperText,
27
+ errorMessage,
28
+ isInvalid,
29
+ isRequired,
30
+ ...restProps
31
+ } = props
16
32
 
17
33
  return (
18
- <fieldset className={cx('mb-4', className)} {...newProps}>
19
- <legend>{label}</legend>
34
+ <FieldsetControl
35
+ className={className}
36
+ labelText={labelText}
37
+ helperText={helperText}
38
+ errorMessage={errorMessage}
39
+ isInvalid={isInvalid}
40
+ isRequired={isRequired}
41
+ ref={ref}
42
+ {...restProps}
43
+ >
20
44
  {items.map(({ label, value }, index) => {
21
45
  return (
22
- <div key={index}>
23
- <Checkbox name={groupName} value={value} onChange={onChange}>
24
- {label}
25
- </Checkbox>
26
- </div>
46
+ <Checkbox key={index} value={value} onChange={onChange}>
47
+ {label}
48
+ </Checkbox>
27
49
  )
28
50
  })}
29
- </fieldset>
51
+ </FieldsetControl>
30
52
  )
31
- }
53
+ })
@@ -1,36 +1,60 @@
1
1
  import React from 'react'
2
2
  import { Radio } from '../Radio'
3
+ import { FieldsetControl } from '../FieldsetControl'
3
4
  import { InputItem } from './InputItem'
4
- import { cx } from '../../utils'
5
5
 
6
6
  export interface RadioGroupProps
7
- extends Omit<React.ComponentProps<'fieldset'>, 'onChange'> {
7
+ extends Omit<React.ComponentPropsWithoutRef<'fieldset'>, 'onChange'> {
8
8
  items: InputItem[]
9
9
  onChange: React.ChangeEventHandler<HTMLInputElement>
10
- label: string
10
+ labelText: string
11
+ helperText?: string
12
+ errorMessage?: string
13
+ isInvalid?: boolean
14
+ isRequired?: boolean
15
+ defaultValue?: string
11
16
  }
12
17
 
13
- export const RadioGroup = (props: RadioGroupProps) => {
14
- const { items, onChange, label, className, ...newProps } = props
15
- const groupName = `radio_group_${Math.random()}`
18
+ export const RadioGroup = React.forwardRef<
19
+ HTMLFieldSetElement,
20
+ RadioGroupProps
21
+ >((props, ref) => {
22
+ const {
23
+ items,
24
+ onChange,
25
+ className,
26
+ labelText,
27
+ helperText,
28
+ errorMessage,
29
+ isInvalid,
30
+ isRequired,
31
+ defaultValue,
32
+ ...restProps
33
+ } = props
16
34
 
17
35
  return (
18
- <fieldset className={cx('mb-4', className)} {...newProps}>
19
- <legend>{label}</legend>
36
+ <FieldsetControl
37
+ className={className}
38
+ labelText={labelText}
39
+ helperText={helperText}
40
+ errorMessage={errorMessage}
41
+ isInvalid={isInvalid}
42
+ isRequired={isRequired}
43
+ ref={ref}
44
+ {...restProps}
45
+ >
20
46
  {items.map(({ label, value }, index) => {
21
47
  return (
22
- <div key={index}>
23
- <Radio
24
- name={groupName}
25
- value={value}
26
- onChange={onChange}
27
- defaultChecked={index === 0}
28
- >
29
- {label}
30
- </Radio>
31
- </div>
48
+ <Radio
49
+ key={index}
50
+ value={value}
51
+ onChange={onChange}
52
+ defaultChecked={defaultValue === value}
53
+ >
54
+ {label}
55
+ </Radio>
32
56
  )
33
57
  })}
34
- </fieldset>
58
+ </FieldsetControl>
35
59
  )
36
- }
60
+ })
@@ -0,0 +1,40 @@
1
+ import React from 'react'
2
+ import { LabelControl } from '../LabelControl'
3
+ import { Select } from '../Select'
4
+
5
+ export interface SelectControlProps
6
+ extends React.ComponentPropsWithoutRef<'select'> {
7
+ labelText: string
8
+ helperText?: string
9
+ errorMessage?: string
10
+ isInvalid?: boolean
11
+ isRequired?: boolean
12
+ }
13
+
14
+ export const SelectControl = React.forwardRef<
15
+ HTMLSelectElement,
16
+ SelectControlProps
17
+ >((props, ref) => {
18
+ const {
19
+ className,
20
+ labelText,
21
+ helperText,
22
+ errorMessage,
23
+ isInvalid,
24
+ isRequired,
25
+ ...restProps
26
+ } = props
27
+
28
+ return (
29
+ <LabelControl
30
+ className={className}
31
+ labelText={labelText}
32
+ helperText={helperText}
33
+ errorMessage={errorMessage}
34
+ isInvalid={isInvalid}
35
+ isRequired={isRequired}
36
+ >
37
+ <Select ref={ref} {...restProps} />
38
+ </LabelControl>
39
+ )
40
+ })
@@ -0,0 +1,39 @@
1
+ import React from 'react'
2
+ import { LabelControl } from '../LabelControl'
3
+ import { Text } from '../Text'
4
+
5
+ export interface TextControlProps
6
+ extends React.ComponentPropsWithoutRef<'input'> {
7
+ labelText: string
8
+ helperText?: string
9
+ errorMessage?: string
10
+ isInvalid?: boolean
11
+ isRequired?: boolean
12
+ }
13
+
14
+ export const TextControl = React.forwardRef<HTMLInputElement, TextControlProps>(
15
+ (props, ref) => {
16
+ const {
17
+ className,
18
+ labelText,
19
+ helperText,
20
+ errorMessage,
21
+ isInvalid,
22
+ isRequired,
23
+ ...restProps
24
+ } = props
25
+
26
+ return (
27
+ <LabelControl
28
+ className={className}
29
+ labelText={labelText}
30
+ helperText={helperText}
31
+ errorMessage={errorMessage}
32
+ isInvalid={isInvalid}
33
+ isRequired={isRequired}
34
+ >
35
+ <Text ref={ref} {...restProps} />
36
+ </LabelControl>
37
+ )
38
+ }
39
+ )
@@ -0,0 +1,40 @@
1
+ import React from 'react'
2
+ import { LabelControl } from '../LabelControl'
3
+ import { Textarea } from '../Textarea'
4
+
5
+ export interface TextareaControlProps
6
+ extends React.ComponentPropsWithoutRef<'textarea'> {
7
+ labelText: string
8
+ helperText?: string
9
+ errorMessage?: string
10
+ isInvalid?: boolean
11
+ isRequired?: boolean
12
+ }
13
+
14
+ export const TextareaControl = React.forwardRef<
15
+ HTMLTextAreaElement,
16
+ TextareaControlProps
17
+ >((props, ref) => {
18
+ const {
19
+ className,
20
+ labelText,
21
+ helperText,
22
+ errorMessage,
23
+ isInvalid,
24
+ isRequired,
25
+ ...restProps
26
+ } = props
27
+
28
+ return (
29
+ <LabelControl
30
+ className={className}
31
+ labelText={labelText}
32
+ helperText={helperText}
33
+ errorMessage={errorMessage}
34
+ isInvalid={isInvalid}
35
+ isRequired={isRequired}
36
+ >
37
+ <Textarea ref={ref} {...restProps} />
38
+ </LabelControl>
39
+ )
40
+ })
@@ -1,5 +1,5 @@
1
1
  export { CheckboxGroup } from './CheckboxGroup'
2
2
  export { RadioGroup } from './RadioGroup'
3
- export { Select } from './Select'
4
- export { Text } from './Text'
5
- export { Textarea } from './Textarea'
3
+ export { SelectControl } from './SelectControl'
4
+ export { TextControl } from './TextControl'
5
+ export { TextareaControl } from './TextareaControl'
@@ -3,3 +3,5 @@ export { Radio } from './Radio'
3
3
  export { Select } from './Select'
4
4
  export { Text } from './Text'
5
5
  export { Textarea } from './Textarea'
6
+ export { LabelControl } from './LabelControl'
7
+ export { FieldsetControl } from './FieldsetControl'
@@ -1,9 +1,17 @@
1
- export { Checkbox, Radio, Select, Text, Textarea } from './components'
1
+ export {
2
+ Checkbox,
3
+ Radio,
4
+ Select,
5
+ Text,
6
+ Textarea,
7
+ LabelControl,
8
+ FieldsetControl
9
+ } from './components'
2
10
 
3
11
  export {
4
12
  CheckboxGroup,
5
13
  RadioGroup,
6
- Select as SelectControl,
7
- Text as TextControl,
8
- Textarea as TextareaControl
14
+ SelectControl,
15
+ TextControl,
16
+ TextareaControl
9
17
  } from './components/controlled'
@@ -0,0 +1,54 @@
1
+ import * as React from 'react'
2
+ import { render, screen } from '@testing-library/react'
3
+ import '@testing-library/jest-dom'
4
+
5
+ import { FieldsetControl } from '../src'
6
+
7
+ describe('FieldsetControl', () => {
8
+ test('renders FieldsetControl component vol1', async () => {
9
+ render(<FieldsetControl labelText="test" />)
10
+
11
+ const fieldset = screen.getByRole('group')
12
+
13
+ expect(fieldset).toBeInTheDocument()
14
+
15
+ expect(screen.getByText('test')).toBeInTheDocument()
16
+ })
17
+
18
+ test('renders FieldsetControl component vol2', async () => {
19
+ render(
20
+ <FieldsetControl
21
+ labelText="test"
22
+ helperText="helper"
23
+ errorMessage="error"
24
+ />
25
+ )
26
+
27
+ expect(screen.getByText('helper')).toBeInTheDocument()
28
+ expect(screen.queryByText('error')).toBeNull()
29
+ })
30
+
31
+ test('renders FieldsetControl component vol3', async () => {
32
+ render(
33
+ <FieldsetControl
34
+ labelText="test"
35
+ helperText="helper"
36
+ errorMessage="error"
37
+ isInvalid
38
+ />
39
+ )
40
+
41
+ expect(screen.getByText('helper')).toBeInTheDocument()
42
+ expect(screen.getByText('error')).toBeInTheDocument()
43
+ })
44
+
45
+ test('renders FieldsetControl component vol4', async () => {
46
+ render(<FieldsetControl labelText="test" />)
47
+
48
+ expect(screen.queryByText('*')).toBeNull()
49
+
50
+ render(<FieldsetControl labelText="test" isRequired />)
51
+
52
+ expect(screen.getByText('*')).toBeInTheDocument()
53
+ })
54
+ })
@@ -0,0 +1,116 @@
1
+ import * as React from 'react'
2
+ import { render, screen } from '@testing-library/react'
3
+ import '@testing-library/jest-dom'
4
+
5
+ import { LabelControl, Select, Text, Textarea } from '../src'
6
+
7
+ describe('LabelControl', () => {
8
+ test('renders LabelControl component vol1', async () => {
9
+ render(<LabelControl labelText="test" data-testid="label" />)
10
+
11
+ const elem = screen.getByTestId('label')
12
+
13
+ expect(elem).toBeInTheDocument()
14
+
15
+ expect(screen.getByText('test')).toBeInTheDocument()
16
+ })
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 () => {
28
+ render(
29
+ <LabelControl
30
+ labelText="test"
31
+ helperText="helper"
32
+ errorMessage="error"
33
+ isInvalid
34
+ />
35
+ )
36
+
37
+ expect(screen.getByText('helper')).toBeInTheDocument()
38
+ expect(screen.getByText('error')).toBeInTheDocument()
39
+ })
40
+
41
+ test('renders LabelControl component vol4', async () => {
42
+ render(<LabelControl labelText="test" />)
43
+
44
+ expect(screen.queryByText('*')).toBeNull()
45
+
46
+ render(<LabelControl labelText="test" isRequired />)
47
+
48
+ expect(screen.getByText('*')).toBeInTheDocument()
49
+ })
50
+
51
+ test('Test the relationship between the label and input elements.', async () => {
52
+ render(
53
+ <>
54
+ <LabelControl labelText="test1">
55
+ <Select>
56
+ <option value="1" defaultChecked />
57
+ </Select>
58
+ </LabelControl>
59
+ <LabelControl labelText="test2">
60
+ <Text defaultValue="1" />
61
+ </LabelControl>
62
+ <LabelControl labelText="test3">
63
+ <Textarea defaultValue="1" />
64
+ </LabelControl>
65
+ </>
66
+ )
67
+
68
+ const select = screen.getByLabelText(/test1/)
69
+ expect(select).toBeInTheDocument()
70
+ expect(select).toHaveValue('1')
71
+ expect(select).toHaveAttribute('id')
72
+
73
+ const text = screen.getByLabelText(/test2/)
74
+ expect(text).toBeInTheDocument()
75
+ expect(text).toHaveValue('1')
76
+ expect(text).toHaveAttribute('id')
77
+
78
+ const textarea = screen.getByLabelText(/test3/)
79
+ expect(textarea).toBeInTheDocument()
80
+ expect(textarea).toHaveValue('1')
81
+ expect(textarea).toHaveAttribute('id')
82
+ })
83
+
84
+ test('Test the relationship between the label and input elements.', async () => {
85
+ render(
86
+ <>
87
+ <LabelControl labelText="test1" htmlFor="id1">
88
+ <Select>
89
+ <option value="1" defaultChecked />
90
+ </Select>
91
+ </LabelControl>
92
+ <LabelControl labelText="test2" htmlFor="id2">
93
+ <Text defaultValue="1" />
94
+ </LabelControl>
95
+ <LabelControl labelText="test3" htmlFor="id3">
96
+ <Textarea defaultValue="1" />
97
+ </LabelControl>
98
+ </>
99
+ )
100
+
101
+ const select = screen.getByLabelText(/test1/)
102
+ expect(select).toBeInTheDocument()
103
+ expect(select).toHaveValue('1')
104
+ expect(select).toHaveAttribute('id', 'id1')
105
+
106
+ const text = screen.getByLabelText(/test2/)
107
+ expect(text).toBeInTheDocument()
108
+ expect(text).toHaveValue('1')
109
+ expect(text).toHaveAttribute('id', 'id2')
110
+
111
+ const textarea = screen.getByLabelText(/test3/)
112
+ expect(textarea).toBeInTheDocument()
113
+ expect(textarea).toHaveValue('1')
114
+ expect(textarea).toHaveAttribute('id', 'id3')
115
+ })
116
+ })
@@ -0,0 +1,99 @@
1
+ import * as React from 'react'
2
+ import { render, screen } from '@testing-library/react'
3
+ import '@testing-library/jest-dom'
4
+
5
+ import { FieldsetControl, Radio } from '../src'
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
+ })
38
+
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')
47
+
48
+ expect(elem).toBeInTheDocument()
49
+
50
+ expect(elem).toBeValid()
51
+ expect(elem).toHaveAttribute('aria-invalid', 'false')
52
+ })
53
+
54
+ test('renders Text component vol4', async () => {
55
+ render(
56
+ <FieldsetControl labelText="test" isInvalid>
57
+ <Radio />
58
+ </FieldsetControl>
59
+ )
60
+
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
+ )
76
+
77
+ const elem = screen.getByRole('radio')
78
+
79
+ expect(elem).toBeInTheDocument()
80
+
81
+ expect(elem).toBeValid()
82
+ expect(elem).toBeRequired()
83
+ })
84
+
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')
93
+
94
+ expect(elem).toBeInTheDocument()
95
+
96
+ expect(elem).toBeInvalid()
97
+ expect(elem).toBeRequired()
98
+ })
99
+ })