@charcoal-ui/react 4.0.0-beta.0 → 4.0.0-beta.11

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 (265) hide show
  1. package/README.md +1 -1
  2. package/dist/_lib/compat.d.ts +0 -12
  3. package/dist/_lib/compat.d.ts.map +1 -1
  4. package/dist/_lib/createDivComponent.d.ts +4 -0
  5. package/dist/_lib/createDivComponent.d.ts.map +1 -0
  6. package/dist/_lib/useClassNames.d.ts +2 -2
  7. package/dist/_lib/useClassNames.d.ts.map +1 -1
  8. package/dist/components/Button/index.d.ts +5 -1
  9. package/dist/components/Button/index.d.ts.map +1 -1
  10. package/dist/components/Checkbox/CheckboxInput/index.d.ts +11 -0
  11. package/dist/components/Checkbox/CheckboxInput/index.d.ts.map +1 -0
  12. package/dist/components/Checkbox/CheckboxWithLabel.d.ts +9 -0
  13. package/dist/components/Checkbox/CheckboxWithLabel.d.ts.map +1 -0
  14. package/dist/components/Checkbox/index.d.ts +12 -21
  15. package/dist/components/Checkbox/index.d.ts.map +1 -1
  16. package/dist/components/Clickable/index.d.ts +9 -15
  17. package/dist/components/Clickable/index.d.ts.map +1 -1
  18. package/dist/components/DropdownSelector/Divider/index.d.ts +3 -0
  19. package/dist/components/DropdownSelector/Divider/index.d.ts.map +1 -0
  20. package/dist/components/DropdownSelector/DropdownMenuItem/index.d.ts +8 -0
  21. package/dist/components/DropdownSelector/DropdownMenuItem/index.d.ts.map +1 -0
  22. package/dist/components/DropdownSelector/DropdownPopover.d.ts.map +1 -1
  23. package/dist/components/DropdownSelector/ListItem/index.d.ts +5 -13
  24. package/dist/components/DropdownSelector/ListItem/index.d.ts.map +1 -1
  25. package/dist/components/DropdownSelector/MenuItem/index.d.ts +10 -3
  26. package/dist/components/DropdownSelector/MenuItem/index.d.ts.map +1 -1
  27. package/dist/components/DropdownSelector/MenuItem/internals/useMenuItemHandleKeyDown.d.ts +1 -1
  28. package/dist/components/DropdownSelector/MenuItem/internals/useMenuItemHandleKeyDown.d.ts.map +1 -1
  29. package/dist/components/DropdownSelector/MenuItemGroup/index.d.ts +1 -3
  30. package/dist/components/DropdownSelector/MenuItemGroup/index.d.ts.map +1 -1
  31. package/dist/components/DropdownSelector/MenuList/index.d.ts +1 -4
  32. package/dist/components/DropdownSelector/MenuList/index.d.ts.map +1 -1
  33. package/dist/components/DropdownSelector/Popover/index.d.ts +2 -2
  34. package/dist/components/DropdownSelector/Popover/index.d.ts.map +1 -1
  35. package/dist/components/DropdownSelector/index.d.ts +3 -1
  36. package/dist/components/DropdownSelector/index.d.ts.map +1 -1
  37. package/dist/components/FieldLabel/index.d.ts +1 -0
  38. package/dist/components/FieldLabel/index.d.ts.map +1 -1
  39. package/dist/components/IconButton/index.d.ts +7 -5
  40. package/dist/components/IconButton/index.d.ts.map +1 -1
  41. package/dist/components/LoadingSpinner/index.d.ts +1 -0
  42. package/dist/components/LoadingSpinner/index.d.ts.map +1 -1
  43. package/dist/components/Modal/Dialog/index.d.ts +6 -24
  44. package/dist/components/Modal/Dialog/index.d.ts.map +1 -1
  45. package/dist/components/Modal/ModalPlumbing.d.ts +10 -3
  46. package/dist/components/Modal/ModalPlumbing.d.ts.map +1 -1
  47. package/dist/components/Modal/index.d.ts +6 -2
  48. package/dist/components/Modal/index.d.ts.map +1 -1
  49. package/dist/components/Modal/useCustomModalOverlay.d.ts +1 -0
  50. package/dist/components/Modal/useCustomModalOverlay.d.ts.map +1 -1
  51. package/dist/components/Radio/RadioGroup/index.d.ts +20 -0
  52. package/dist/components/Radio/RadioGroup/index.d.ts.map +1 -0
  53. package/dist/components/Radio/RadioGroupContext.d.ts +11 -0
  54. package/dist/components/Radio/RadioGroupContext.d.ts.map +1 -0
  55. package/dist/components/Radio/RadioInput/index.d.ts +10 -0
  56. package/dist/components/Radio/RadioInput/index.d.ts.map +1 -0
  57. package/dist/components/Radio/index.d.ts +1 -14
  58. package/dist/components/Radio/index.d.ts.map +1 -1
  59. package/dist/components/SegmentedControl/index.d.ts +1 -0
  60. package/dist/components/SegmentedControl/index.d.ts.map +1 -1
  61. package/dist/components/Switch/SwitchInput/index.d.ts +9 -0
  62. package/dist/components/Switch/SwitchInput/index.d.ts.map +1 -0
  63. package/dist/components/Switch/SwitchWithLabel.d.ts +9 -0
  64. package/dist/components/Switch/SwitchWithLabel.d.ts.map +1 -0
  65. package/dist/components/Switch/index.d.ts +4 -15
  66. package/dist/components/Switch/index.d.ts.map +1 -1
  67. package/dist/components/TagItem/index.d.ts +10 -15
  68. package/dist/components/TagItem/index.d.ts.map +1 -1
  69. package/dist/components/TextArea/index.d.ts +29 -18
  70. package/dist/components/TextArea/index.d.ts.map +1 -1
  71. package/dist/components/TextField/AssistiveText/index.d.ts +5 -0
  72. package/dist/components/TextField/AssistiveText/index.d.ts.map +1 -0
  73. package/dist/components/TextField/index.d.ts +33 -22
  74. package/dist/components/TextField/index.d.ts.map +1 -1
  75. package/dist/core/CharcoalProvider.d.ts +4 -11
  76. package/dist/core/CharcoalProvider.d.ts.map +1 -1
  77. package/dist/core/SSRProvider.d.ts +3 -1
  78. package/dist/core/SSRProvider.d.ts.map +1 -1
  79. package/dist/index.cjs.js +576 -1255
  80. package/dist/index.cjs.js.map +1 -1
  81. package/dist/index.css +1097 -3
  82. package/dist/index.css.map +1 -1
  83. package/dist/index.d.ts +4 -5
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.esm.js +555 -1231
  86. package/dist/index.esm.js.map +1 -1
  87. package/package.json +25 -23
  88. package/src/README.mdx +68 -0
  89. package/src/SSR.mdx +67 -0
  90. package/src/_lib/compat.ts +0 -11
  91. package/src/_lib/createDivComponent.tsx +11 -0
  92. package/src/_lib/useClassNames.ts +3 -9
  93. package/src/components/Button/__snapshots__/index.story.storyshot +18 -56
  94. package/src/components/Button/index.css +2 -3
  95. package/src/components/Button/index.story.tsx +14 -67
  96. package/src/components/Button/index.tsx +7 -3
  97. package/src/components/Checkbox/CheckboxInput/__snapshots__/index.story.storyshot +77 -0
  98. package/src/components/Checkbox/CheckboxInput/index.css +110 -0
  99. package/src/components/Checkbox/CheckboxInput/index.story.tsx +51 -0
  100. package/src/components/Checkbox/CheckboxInput/index.tsx +47 -0
  101. package/src/components/Checkbox/CheckboxWithLabel.tsx +24 -0
  102. package/src/components/Checkbox/__snapshots__/index.story.storyshot +103 -538
  103. package/src/components/Checkbox/index.css +21 -0
  104. package/src/components/Checkbox/index.story.tsx +49 -79
  105. package/src/components/Checkbox/index.tsx +32 -162
  106. package/src/components/Clickable/__snapshots__/index.story.storyshot +4 -80
  107. package/src/components/Clickable/index.css +41 -0
  108. package/src/components/Clickable/index.story.tsx +2 -2
  109. package/src/components/Clickable/index.tsx +19 -84
  110. package/src/components/DropdownSelector/Divider/index.css +11 -0
  111. package/src/components/DropdownSelector/Divider/index.tsx +5 -0
  112. package/src/components/DropdownSelector/DropdownMenuItem/index.css +20 -0
  113. package/src/components/DropdownSelector/DropdownMenuItem/index.tsx +34 -0
  114. package/src/components/DropdownSelector/DropdownPopover.tsx +16 -9
  115. package/src/components/DropdownSelector/ListItem/__snapshots__/index.story.storyshot +41 -224
  116. package/src/components/DropdownSelector/ListItem/index.css +24 -0
  117. package/src/components/DropdownSelector/ListItem/index.story.tsx +12 -6
  118. package/src/components/DropdownSelector/ListItem/index.tsx +14 -53
  119. package/src/components/DropdownSelector/MenuItem/index.tsx +17 -12
  120. package/src/components/DropdownSelector/MenuItem/internals/useMenuItemHandleKeyDown.tsx +2 -2
  121. package/src/components/DropdownSelector/MenuItemGroup/index.css +19 -0
  122. package/src/components/DropdownSelector/MenuItemGroup/index.tsx +6 -28
  123. package/src/components/DropdownSelector/MenuList/__snapshots__/index.story.storyshot +162 -416
  124. package/src/components/DropdownSelector/MenuList/index.css +4 -0
  125. package/src/components/DropdownSelector/MenuList/index.story.tsx +1 -1
  126. package/src/components/DropdownSelector/MenuList/index.tsx +4 -12
  127. package/src/components/DropdownSelector/Popover/__snapshots__/index.story.storyshot +5 -5
  128. package/src/components/DropdownSelector/Popover/index.css +11 -0
  129. package/src/components/DropdownSelector/Popover/index.story.tsx +1 -1
  130. package/src/components/DropdownSelector/Popover/index.tsx +7 -17
  131. package/src/components/DropdownSelector/__snapshots__/index.story.storyshot +468 -2494
  132. package/src/components/DropdownSelector/index.css +84 -0
  133. package/src/components/DropdownSelector/index.story.tsx +2 -6
  134. package/src/components/DropdownSelector/index.tsx +61 -137
  135. package/src/components/FieldLabel/index.css +35 -0
  136. package/src/components/FieldLabel/index.tsx +15 -105
  137. package/src/components/Icon/__snapshots__/index.story.storyshot +1 -1
  138. package/src/components/Icon/index.story.tsx +1 -1
  139. package/src/components/IconButton/__snapshots__/index.story.storyshot +19 -297
  140. package/src/components/IconButton/index.css +118 -0
  141. package/src/components/IconButton/index.story.tsx +17 -40
  142. package/src/components/IconButton/index.tsx +41 -118
  143. package/src/components/LoadingSpinner/__snapshots__/LoadingSpinnerIcon.story.storyshot +2 -17
  144. package/src/components/LoadingSpinner/__snapshots__/index.story.storyshot +80 -30
  145. package/src/components/LoadingSpinner/index.css +42 -0
  146. package/src/components/LoadingSpinner/index.story.tsx +19 -8
  147. package/src/components/LoadingSpinner/index.tsx +26 -52
  148. package/src/components/Modal/Dialog/index.css +44 -0
  149. package/src/components/Modal/Dialog/index.tsx +14 -57
  150. package/src/components/Modal/ModalPlumbing.css +40 -0
  151. package/src/components/Modal/ModalPlumbing.tsx +13 -61
  152. package/src/components/Modal/__snapshots__/index.story.storyshot +281 -2221
  153. package/src/components/Modal/index.css +36 -0
  154. package/src/components/Modal/index.story.tsx +26 -13
  155. package/src/components/Modal/index.tsx +42 -78
  156. package/src/components/Modal/useCustomModalOverlay.tsx +19 -4
  157. package/src/components/Radio/RadioGroup/index.css +5 -0
  158. package/src/components/Radio/RadioGroup/index.tsx +80 -0
  159. package/src/components/Radio/RadioGroupContext.ts +23 -0
  160. package/src/components/Radio/RadioInput/index.css +82 -0
  161. package/src/components/Radio/RadioInput/index.tsx +41 -0
  162. package/src/components/Radio/__snapshots__/index.story.storyshot +111 -855
  163. package/src/components/Radio/index.css +18 -0
  164. package/src/components/Radio/index.story.tsx +47 -40
  165. package/src/components/Radio/index.test.tsx +18 -26
  166. package/src/components/Radio/index.tsx +16 -208
  167. package/src/components/SegmentedControl/__snapshots__/index.story.storyshot +32 -262
  168. package/src/components/SegmentedControl/index.css +50 -0
  169. package/src/components/SegmentedControl/index.story.tsx +1 -1
  170. package/src/components/SegmentedControl/index.tsx +20 -89
  171. package/src/components/Switch/SwitchInput/index.css +82 -0
  172. package/src/components/Switch/SwitchInput/index.tsx +40 -0
  173. package/src/components/Switch/SwitchWithLabel.tsx +24 -0
  174. package/src/components/Switch/__snapshots__/index.story.storyshot +35 -539
  175. package/src/components/Switch/index.css +23 -0
  176. package/src/components/Switch/index.story.tsx +16 -19
  177. package/src/components/Switch/index.tsx +43 -140
  178. package/src/components/TagItem/__snapshots__/index.story.storyshot +212 -1063
  179. package/src/components/TagItem/index.css +140 -0
  180. package/src/components/TagItem/index.story.tsx +45 -162
  181. package/src/components/TagItem/index.tsx +72 -220
  182. package/src/components/TextArea/TextArea.story.tsx +63 -25
  183. package/src/components/TextArea/__snapshots__/TextArea.story.storyshot +615 -1055
  184. package/src/components/TextArea/index.css +78 -0
  185. package/src/components/TextArea/index.tsx +83 -174
  186. package/src/components/TextField/AssistiveText/index.css +10 -0
  187. package/src/components/TextField/AssistiveText/index.tsx +6 -0
  188. package/src/components/TextField/TextField.story.tsx +85 -76
  189. package/src/components/TextField/__snapshots__/TextField.story.storyshot +632 -1710
  190. package/src/components/TextField/index.css +87 -0
  191. package/src/components/TextField/index.tsx +92 -211
  192. package/src/core/CharcoalProvider.tsx +5 -29
  193. package/src/core/SSRProvider.tsx +12 -1
  194. package/src/index.ts +7 -19
  195. package/src/type.d.ts +3 -8
  196. package/dist/components/Button/index.story.d.ts +0 -24
  197. package/dist/components/Button/index.story.d.ts.map +0 -1
  198. package/dist/components/Checkbox/index.story.d.ts +0 -8
  199. package/dist/components/Checkbox/index.story.d.ts.map +0 -1
  200. package/dist/components/Clickable/index.story.d.ts +0 -6
  201. package/dist/components/Clickable/index.story.d.ts.map +0 -1
  202. package/dist/components/DropdownSelector/Divider.d.ts +0 -7
  203. package/dist/components/DropdownSelector/Divider.d.ts.map +0 -1
  204. package/dist/components/DropdownSelector/DropdownMenuItem.d.ts +0 -7
  205. package/dist/components/DropdownSelector/DropdownMenuItem.d.ts.map +0 -1
  206. package/dist/components/DropdownSelector/ListItem/index.story.d.ts +0 -9
  207. package/dist/components/DropdownSelector/ListItem/index.story.d.ts.map +0 -1
  208. package/dist/components/DropdownSelector/MenuList/index.story.d.ts +0 -8
  209. package/dist/components/DropdownSelector/MenuList/index.story.d.ts.map +0 -1
  210. package/dist/components/DropdownSelector/Popover/index.story.d.ts +0 -5
  211. package/dist/components/DropdownSelector/Popover/index.story.d.ts.map +0 -1
  212. package/dist/components/DropdownSelector/index.story.d.ts +0 -19
  213. package/dist/components/DropdownSelector/index.story.d.ts.map +0 -1
  214. package/dist/components/Icon/index.story.d.ts +0 -6
  215. package/dist/components/Icon/index.story.d.ts.map +0 -1
  216. package/dist/components/IconButton/index.story.d.ts +0 -9
  217. package/dist/components/IconButton/index.story.d.ts.map +0 -1
  218. package/dist/components/LoadingSpinner/LoadingSpinnerIcon.story.d.ts +0 -8
  219. package/dist/components/LoadingSpinner/LoadingSpinnerIcon.story.d.ts.map +0 -1
  220. package/dist/components/LoadingSpinner/index.story.d.ts +0 -6
  221. package/dist/components/LoadingSpinner/index.story.d.ts.map +0 -1
  222. package/dist/components/Modal/__stories__/InternalScrollStory.d.ts +0 -4
  223. package/dist/components/Modal/__stories__/InternalScrollStory.d.ts.map +0 -1
  224. package/dist/components/Modal/index.story.d.ts +0 -21
  225. package/dist/components/Modal/index.story.d.ts.map +0 -1
  226. package/dist/components/MultiSelect/context.d.ts +0 -14
  227. package/dist/components/MultiSelect/context.d.ts.map +0 -1
  228. package/dist/components/MultiSelect/index.d.ts +0 -36
  229. package/dist/components/MultiSelect/index.d.ts.map +0 -1
  230. package/dist/components/MultiSelect/index.story.d.ts +0 -82
  231. package/dist/components/MultiSelect/index.story.d.ts.map +0 -1
  232. package/dist/components/MultiSelect/index.test.d.ts +0 -2
  233. package/dist/components/MultiSelect/index.test.d.ts.map +0 -1
  234. package/dist/components/Radio/index.story.d.ts +0 -26
  235. package/dist/components/Radio/index.story.d.ts.map +0 -1
  236. package/dist/components/Radio/index.test.d.ts +0 -2
  237. package/dist/components/Radio/index.test.d.ts.map +0 -1
  238. package/dist/components/SegmentedControl/index.story.d.ts +0 -7
  239. package/dist/components/SegmentedControl/index.story.d.ts.map +0 -1
  240. package/dist/components/Switch/index.story.d.ts +0 -9
  241. package/dist/components/Switch/index.story.d.ts.map +0 -1
  242. package/dist/components/TagItem/index.story.d.ts +0 -16
  243. package/dist/components/TagItem/index.story.d.ts.map +0 -1
  244. package/dist/components/TextArea/TextArea.story.d.ts +0 -9
  245. package/dist/components/TextArea/TextArea.story.d.ts.map +0 -1
  246. package/dist/components/TextField/TextField.story.d.ts +0 -22
  247. package/dist/components/TextField/TextField.story.d.ts.map +0 -1
  248. package/dist/components/a11y.test.d.ts +0 -2
  249. package/dist/components/a11y.test.d.ts.map +0 -1
  250. package/dist/core/ComponentAbstraction.d.ts +0 -24
  251. package/dist/core/ComponentAbstraction.d.ts.map +0 -1
  252. package/dist/styled.d.ts +0 -95
  253. package/dist/styled.d.ts.map +0 -1
  254. package/src/components/DropdownSelector/Divider.tsx +0 -16
  255. package/src/components/DropdownSelector/DropdownMenuItem.tsx +0 -43
  256. package/src/components/LoadingSpinner/LoadingSpinnerIcon.story.tsx +0 -13
  257. package/src/components/Modal/__stories__/InternalScrollStory.tsx +0 -75
  258. package/src/components/MultiSelect/__snapshots__/index.story.storyshot +0 -1066
  259. package/src/components/MultiSelect/context.ts +0 -23
  260. package/src/components/MultiSelect/index.story.tsx +0 -216
  261. package/src/components/MultiSelect/index.test.tsx +0 -263
  262. package/src/components/MultiSelect/index.tsx +0 -281
  263. package/src/components/a11y.test.tsx +0 -99
  264. package/src/core/ComponentAbstraction.tsx +0 -48
  265. package/src/styled.ts +0 -3
@@ -0,0 +1,18 @@
1
+ .charcoal-radio__label {
2
+ display: grid;
3
+ grid-template-columns: auto 1fr;
4
+ grid-gap: 4px;
5
+ align-items: center;
6
+ cursor: pointer;
7
+ }
8
+
9
+ .charcoal-radio__label[aria-disabled]:not([aria-disabled='false']) {
10
+ opacity: 0.32;
11
+ cursor: default;
12
+ }
13
+
14
+ .charcoal-radio__label_div {
15
+ font-size: 14px;
16
+ line-height: 22px;
17
+ color: var(--charcoal-text2);
18
+ }
@@ -1,36 +1,43 @@
1
- import styled from 'styled-components'
2
- import Radio, { RadioGroup } from '.'
3
- import { px } from '@charcoal-ui/utils'
1
+ import Radio from '.'
2
+ import { RadioGroup } from './RadioGroup'
4
3
  import { StoryObj } from '@storybook/react'
5
4
  import { useState } from 'react'
6
5
 
7
6
  export default {
8
- title: 'Radio',
7
+ title: 'react/Radio',
9
8
  component: Radio,
10
- args: {
11
- name: 'name',
12
- label: 'label',
13
- },
14
9
  parameters: {
15
10
  layout: 'centered',
16
11
  },
17
12
  }
18
13
 
19
- const LayoutDiv = styled.div`
20
- display: flex;
21
- flex-direction: column;
22
- gap: ${({ theme }) => px(theme.spacing[24])};
23
- `
14
+ const options = ['1', '2', '3'] as const
15
+ type Option = (typeof options)[number]
16
+
17
+ const LayoutDiv = (props: { children: React.ReactNode }) => {
18
+ return (
19
+ <div
20
+ style={{
21
+ display: 'flex',
22
+ flexDirection: 'column',
23
+ gap: 24,
24
+ }}
25
+ >
26
+ {props.children}
27
+ </div>
28
+ )
29
+ }
30
+
31
+ export const Default: StoryObj<typeof Radio> = {
32
+ render: function Render(args) {
33
+ const [value, setValue] = useState<Option>(options[0])
24
34
 
25
- export const Basic: StoryObj<typeof Radio> = {
26
- render: function Render() {
27
- const options = ['1', '2', '3']
28
- const [value, setValue] = useState(options[0])
29
35
  return (
30
36
  <LayoutDiv>
31
- <RadioGroup
32
- label={'label'}
33
- name={'name'}
37
+ <RadioGroup<Option>
38
+ name="default_story"
39
+ label="default story"
40
+ {...args}
34
41
  value={value}
35
42
  onChange={setValue}
36
43
  >
@@ -47,13 +54,13 @@ export const Basic: StoryObj<typeof Radio> = {
47
54
 
48
55
  export const Disabled: StoryObj<typeof Radio> = {
49
56
  render: function Render() {
50
- const options = ['1', '2', '3']
51
- const [value, setValue] = useState(options[0])
57
+ const [value, setValue] = useState<Option>(options[0])
58
+
52
59
  return (
53
60
  <LayoutDiv>
54
- <RadioGroup
55
- label={'label'}
56
- name={'name'}
61
+ <RadioGroup<Option>
62
+ label="disabled_stroy"
63
+ name="disabled story"
57
64
  value={value}
58
65
  onChange={setValue}
59
66
  disabled
@@ -71,13 +78,13 @@ export const Disabled: StoryObj<typeof Radio> = {
71
78
 
72
79
  export const PartialDisabled: StoryObj<typeof Radio> = {
73
80
  render: function Render() {
74
- const options = ['1', '2', '3']
75
- const [value, setValue] = useState(options[0])
81
+ const [value, setValue] = useState<Option>(options[0])
82
+
76
83
  return (
77
84
  <LayoutDiv>
78
- <RadioGroup
79
- label={'label'}
80
- name={'name'}
85
+ <RadioGroup<Option>
86
+ name={'partial_disabled_story'}
87
+ label={'partial disabled story'}
81
88
  value={value}
82
89
  onChange={setValue}
83
90
  >
@@ -94,13 +101,13 @@ export const PartialDisabled: StoryObj<typeof Radio> = {
94
101
 
95
102
  export const Readonly: StoryObj<typeof Radio> = {
96
103
  render: function Render() {
97
- const options = ['1', '2', '3']
98
- const [value, setValue] = useState(options[0])
104
+ const [value, setValue] = useState<Option>(options[0])
105
+
99
106
  return (
100
107
  <LayoutDiv>
101
- <RadioGroup
102
- label={'label'}
103
- name={'name'}
108
+ <RadioGroup<Option>
109
+ name="readonly_story"
110
+ label="readonly story"
104
111
  value={value}
105
112
  onChange={setValue}
106
113
  readonly
@@ -118,13 +125,13 @@ export const Readonly: StoryObj<typeof Radio> = {
118
125
 
119
126
  export const Invalid: StoryObj<typeof Radio> = {
120
127
  render: function Render() {
121
- const options = ['1', '2', '3']
122
- const [value, setValue] = useState(options[0])
128
+ const [value, setValue] = useState<Option>(options[0])
129
+
123
130
  return (
124
131
  <LayoutDiv>
125
- <RadioGroup
126
- label={'label'}
127
- name={'name'}
132
+ <RadioGroup<Option>
133
+ name="invalid_story"
134
+ label="invalid story"
128
135
  value={value}
129
136
  onChange={setValue}
130
137
  invalid
@@ -1,7 +1,6 @@
1
1
  import { fireEvent, render, screen } from '@testing-library/react'
2
- import { ThemeProvider } from 'styled-components'
3
- import Radio, { RadioGroup } from '.'
4
- import { light } from '@charcoal-ui/theme'
2
+ import Radio from '.'
3
+ import { RadioGroup } from './RadioGroup'
5
4
 
6
5
  describe('Radio', () => {
7
6
  describe('development mode', () => {
@@ -14,11 +13,7 @@ describe('Radio', () => {
14
13
  // eslint-disable-next-line no-console
15
14
  console.error = jest.fn()
16
15
 
17
- render(
18
- <ThemeProvider theme={light}>
19
- <Radio value="option1" />
20
- </ThemeProvider>
21
- )
16
+ render(<Radio value="option1" />)
22
17
  })
23
18
 
24
19
  it('console.error()', () => {
@@ -124,23 +119,20 @@ function TestComponent({
124
119
  option2Disabled?: boolean
125
120
  }) {
126
121
  return (
127
- <ThemeProvider theme={light}>
128
- <RadioGroup
129
- label="テスト項目"
130
- name="test"
131
- value={value}
132
- onChange={onChange}
133
- disabled={radioGroupDisabled}
134
- readonly={readonly}
135
- invalid={invalid}
136
- >
137
- <Radio value="option1" disabled={option1Disabled}>
138
- option1を選ぶ
139
- </Radio>
140
- <Radio value="option2" disabled={option2Disabled}>
141
- option2を選ぶ
142
- </Radio>
143
- </RadioGroup>
144
- </ThemeProvider>
122
+ <RadioGroup
123
+ name="test"
124
+ value={value}
125
+ onChange={onChange}
126
+ disabled={radioGroupDisabled}
127
+ readonly={readonly}
128
+ invalid={invalid}
129
+ >
130
+ <Radio value="option1" disabled={option1Disabled}>
131
+ option1を選ぶ
132
+ </Radio>
133
+ <Radio value="option2" disabled={option2Disabled}>
134
+ option2を選ぶ
135
+ </Radio>
136
+ </RadioGroup>
145
137
  )
146
138
  }
@@ -1,8 +1,12 @@
1
- import { memo, forwardRef, useCallback, useContext } from 'react'
1
+ import './index.css'
2
+
3
+ import { memo, forwardRef, useContext } from 'react'
2
4
  import * as React from 'react'
3
- import styled from 'styled-components'
4
5
  import warning from 'warning'
5
- import { focusVisibleFocusRingCss } from '@charcoal-ui/styled'
6
+ import { useClassNames } from '../../_lib/useClassNames'
7
+
8
+ import { RadioGroupContext } from './RadioGroupContext'
9
+ import RadioInput from './RadioInput'
6
10
 
7
11
  export type RadioProps = React.PropsWithChildren<{
8
12
  value: string
@@ -11,7 +15,7 @@ export type RadioProps = React.PropsWithChildren<{
11
15
  }>
12
16
 
13
17
  const Radio = forwardRef<HTMLInputElement, RadioProps>(function RadioInner(
14
- { value, disabled = false, children, className },
18
+ { value, disabled = false, children, ...props },
15
19
  ref
16
20
  ) {
17
21
  const {
@@ -23,6 +27,8 @@ const Radio = forwardRef<HTMLInputElement, RadioProps>(function RadioInner(
23
27
  onChange,
24
28
  } = useContext(RadioGroupContext)
25
29
 
30
+ const classNames = useClassNames('charcoal-radio__label', props.className)
31
+
26
32
  warning(
27
33
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
28
34
  name !== undefined,
@@ -33,220 +39,22 @@ const Radio = forwardRef<HTMLInputElement, RadioProps>(function RadioInner(
33
39
  const isDisabled = disabled || isParentDisabled
34
40
  const isReadonly = readonly && !isSelected
35
41
 
36
- const handleChange = useCallback(
37
- (e: React.ChangeEvent<HTMLInputElement>) => {
38
- onChange(e.currentTarget.value)
39
- },
40
- [onChange]
41
- )
42
-
43
42
  return (
44
- <RadioRoot aria-disabled={isDisabled || isReadonly} className={className}>
43
+ <label aria-disabled={isDisabled || isReadonly} className={classNames}>
45
44
  <RadioInput
46
45
  name={name}
47
46
  value={value}
48
47
  checked={isSelected}
49
48
  aria-invalid={invalid}
50
- onChange={handleChange}
49
+ onChange={onChange}
51
50
  disabled={isDisabled || isReadonly}
52
51
  ref={ref}
53
52
  />
54
- {children != null && <RadioLabel>{children}</RadioLabel>}
55
- </RadioRoot>
53
+ {children != null && (
54
+ <div className="charcoal-radio__label_div">{children}</div>
55
+ )}
56
+ </label>
56
57
  )
57
58
  })
58
59
 
59
60
  export default memo(Radio)
60
-
61
- const RadioRoot = styled.label`
62
- display: grid;
63
- grid-template-columns: auto 1fr;
64
- grid-gap: 4px;
65
- align-items: center;
66
- cursor: pointer;
67
-
68
- &[aria-disabled]:not([aria-disabled='false']) {
69
- opacity: 0.32;
70
- cursor: default;
71
- }
72
- `
73
-
74
- export const RadioInput = styled.input.attrs({ type: 'radio' })`
75
- /** Make prior to browser default style */
76
- &[type='radio'] {
77
- appearance: none;
78
- display: block;
79
- box-sizing: border-box;
80
-
81
- margin: 0;
82
- padding: 6px;
83
-
84
- width: 20px;
85
- height: 20px;
86
- cursor: pointer;
87
- border-radius: 999999px;
88
- background-color: var(--charcoal-surface1);
89
- transition: 0.2s background-color, 0.2s box-shadow;
90
-
91
- :disabled {
92
- cursor: default;
93
- }
94
-
95
- &:not(:disabled):not([aria-disabled]),
96
- &[aria-disabled='false'] {
97
- &:hover {
98
- background-color: var(--charcoal-surface1-hover);
99
- }
100
- &:active {
101
- background-color: var(--charcoal-surface1-press);
102
- }
103
- ${focusVisibleFocusRingCss}
104
- &[aria-invalid='true'] {
105
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
106
- &:focus {
107
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
108
- }
109
- }
110
- }
111
-
112
- &:not(:checked) {
113
- border-width: 2px;
114
- border-style: solid;
115
- border-color: var(--charcoal-text3);
116
- }
117
-
118
- &:checked {
119
- background-color: var(--charcoal-brand);
120
- &::after {
121
- content: '';
122
- display: block;
123
- width: 8px;
124
- height: 8px;
125
- pointer-events: none;
126
- background-color: var(--charcoal-text5);
127
- border-radius: 999999px;
128
- transition: 0.2s background-color, 0.2s box-shadow;
129
- }
130
-
131
- &:not(:disabled):not([aria-disabled]),
132
- &[aria-disabled='false'] {
133
- &:hover {
134
- background-color: var(--charcoal-brand-hover);
135
- &::after {
136
- background-color: var(--charcoal-text5-hover);
137
- }
138
- }
139
- &:active {
140
- background-color: var(--charcoal-brand-press);
141
- &::after {
142
- background-color: var(--charcoal-text5-press);
143
- }
144
- }
145
- }
146
- }
147
- }
148
- `
149
-
150
- const RadioLabel = styled.div`
151
- font-size: 14px;
152
- line-height: 22px;
153
- display: flow-root;
154
- color: var(--charcoal-text2);
155
-
156
- &::before {
157
- display: block;
158
- width: 0;
159
- height: 0;
160
- content: '';
161
- margin-top: -4px;
162
- }
163
- &::after {
164
- display: block;
165
- width: 0;
166
- height: 0;
167
- content: '';
168
- margin-bottom: -4px;
169
- }
170
- `
171
-
172
- export type RadioGroupProps = React.PropsWithChildren<{
173
- className?: string
174
- value?: string
175
- label: string
176
- name: string
177
- onChange(next: string): void
178
- disabled?: boolean
179
- readonly?: boolean
180
- invalid?: boolean
181
- }>
182
-
183
- // TODO: use (or polyfill) flex gap
184
- const StyledRadioGroup = styled.div`
185
- display: grid;
186
- grid-template-columns: 1fr;
187
- grid-gap: 8px;
188
- `
189
-
190
- interface RadioGroupContext {
191
- name: string
192
- selected?: string
193
- disabled: boolean
194
- readonly: boolean
195
- invalid: boolean
196
- onChange: (next: string) => void
197
- }
198
-
199
- const RadioGroupContext = React.createContext<RadioGroupContext>({
200
- name: undefined as never,
201
- selected: undefined,
202
- disabled: false,
203
- readonly: false,
204
- invalid: false,
205
- onChange() {
206
- throw new Error(
207
- 'Cannot find onChange() handler. Perhaps you forgot to wrap with <RadioGroup> ?'
208
- )
209
- },
210
- })
211
-
212
- export function RadioGroup({
213
- className,
214
- value,
215
- label,
216
- name,
217
- onChange,
218
- disabled,
219
- readonly,
220
- invalid,
221
- children,
222
- }: RadioGroupProps) {
223
- const handleChange = useCallback(
224
- (next: string) => {
225
- onChange(next)
226
- },
227
- [onChange]
228
- )
229
-
230
- return (
231
- <RadioGroupContext.Provider
232
- value={{
233
- name,
234
- selected: value,
235
- disabled: disabled ?? false,
236
- readonly: readonly ?? false,
237
- invalid: invalid ?? false,
238
- onChange: handleChange,
239
- }}
240
- >
241
- <StyledRadioGroup
242
- role="radiogroup"
243
- aria-orientation="vertical"
244
- aria-label={label}
245
- aria-invalid={invalid}
246
- className={className}
247
- >
248
- {children}
249
- </StyledRadioGroup>
250
- </RadioGroupContext.Provider>
251
- )
252
- }