@charcoal-ui/react 4.0.0-beta.1 → 4.0.0-beta.12

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 (266) 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 +6 -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 +575 -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 +554 -1231
  86. package/dist/index.esm.js.map +1 -1
  87. package/package.json +22 -24
  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/index.ts +1 -1
  93. package/src/_lib/useClassNames.ts +3 -9
  94. package/src/components/Button/__snapshots__/index.story.storyshot +18 -56
  95. package/src/components/Button/index.css +2 -3
  96. package/src/components/Button/index.story.tsx +14 -67
  97. package/src/components/Button/index.tsx +7 -3
  98. package/src/components/Checkbox/CheckboxInput/__snapshots__/index.story.storyshot +77 -0
  99. package/src/components/Checkbox/CheckboxInput/index.css +110 -0
  100. package/src/components/Checkbox/CheckboxInput/index.story.tsx +51 -0
  101. package/src/components/Checkbox/CheckboxInput/index.tsx +47 -0
  102. package/src/components/Checkbox/CheckboxWithLabel.tsx +24 -0
  103. package/src/components/Checkbox/__snapshots__/index.story.storyshot +103 -538
  104. package/src/components/Checkbox/index.css +21 -0
  105. package/src/components/Checkbox/index.story.tsx +49 -79
  106. package/src/components/Checkbox/index.tsx +32 -162
  107. package/src/components/Clickable/__snapshots__/index.story.storyshot +4 -80
  108. package/src/components/Clickable/index.css +41 -0
  109. package/src/components/Clickable/index.story.tsx +2 -2
  110. package/src/components/Clickable/index.tsx +19 -84
  111. package/src/components/DropdownSelector/Divider/index.css +11 -0
  112. package/src/components/DropdownSelector/Divider/index.tsx +5 -0
  113. package/src/components/DropdownSelector/DropdownMenuItem/index.css +20 -0
  114. package/src/components/DropdownSelector/DropdownMenuItem/index.tsx +34 -0
  115. package/src/components/DropdownSelector/DropdownPopover.tsx +16 -9
  116. package/src/components/DropdownSelector/ListItem/__snapshots__/index.story.storyshot +41 -224
  117. package/src/components/DropdownSelector/ListItem/index.css +24 -0
  118. package/src/components/DropdownSelector/ListItem/index.story.tsx +12 -6
  119. package/src/components/DropdownSelector/ListItem/index.tsx +14 -53
  120. package/src/components/DropdownSelector/MenuItem/index.tsx +17 -12
  121. package/src/components/DropdownSelector/MenuItem/internals/useMenuItemHandleKeyDown.tsx +2 -2
  122. package/src/components/DropdownSelector/MenuItemGroup/index.css +19 -0
  123. package/src/components/DropdownSelector/MenuItemGroup/index.tsx +6 -28
  124. package/src/components/DropdownSelector/MenuList/__snapshots__/index.story.storyshot +162 -416
  125. package/src/components/DropdownSelector/MenuList/index.css +4 -0
  126. package/src/components/DropdownSelector/MenuList/index.story.tsx +1 -1
  127. package/src/components/DropdownSelector/MenuList/index.tsx +4 -12
  128. package/src/components/DropdownSelector/Popover/__snapshots__/index.story.storyshot +1 -1
  129. package/src/components/DropdownSelector/Popover/index.css +11 -0
  130. package/src/components/DropdownSelector/Popover/index.story.tsx +1 -1
  131. package/src/components/DropdownSelector/Popover/index.tsx +7 -17
  132. package/src/components/DropdownSelector/__snapshots__/index.story.storyshot +432 -2458
  133. package/src/components/DropdownSelector/index.css +84 -0
  134. package/src/components/DropdownSelector/index.story.tsx +2 -6
  135. package/src/components/DropdownSelector/index.tsx +61 -137
  136. package/src/components/FieldLabel/index.css +35 -0
  137. package/src/components/FieldLabel/index.tsx +15 -105
  138. package/src/components/Icon/__snapshots__/index.story.storyshot +1 -1
  139. package/src/components/Icon/index.story.tsx +1 -1
  140. package/src/components/IconButton/__snapshots__/index.story.storyshot +19 -297
  141. package/src/components/IconButton/index.css +118 -0
  142. package/src/components/IconButton/index.story.tsx +17 -40
  143. package/src/components/IconButton/index.tsx +38 -118
  144. package/src/components/LoadingSpinner/__snapshots__/LoadingSpinnerIcon.story.storyshot +2 -17
  145. package/src/components/LoadingSpinner/__snapshots__/index.story.storyshot +80 -30
  146. package/src/components/LoadingSpinner/index.css +42 -0
  147. package/src/components/LoadingSpinner/index.story.tsx +19 -8
  148. package/src/components/LoadingSpinner/index.tsx +26 -52
  149. package/src/components/Modal/Dialog/index.css +44 -0
  150. package/src/components/Modal/Dialog/index.tsx +14 -57
  151. package/src/components/Modal/ModalPlumbing.css +40 -0
  152. package/src/components/Modal/ModalPlumbing.tsx +13 -61
  153. package/src/components/Modal/__snapshots__/index.story.storyshot +289 -2212
  154. package/src/components/Modal/index.css +36 -0
  155. package/src/components/Modal/index.story.tsx +28 -13
  156. package/src/components/Modal/index.tsx +42 -78
  157. package/src/components/Modal/useCustomModalOverlay.tsx +19 -4
  158. package/src/components/Radio/RadioGroup/index.css +5 -0
  159. package/src/components/Radio/RadioGroup/index.tsx +80 -0
  160. package/src/components/Radio/RadioGroupContext.ts +23 -0
  161. package/src/components/Radio/RadioInput/index.css +82 -0
  162. package/src/components/Radio/RadioInput/index.tsx +41 -0
  163. package/src/components/Radio/__snapshots__/index.story.storyshot +111 -855
  164. package/src/components/Radio/index.css +18 -0
  165. package/src/components/Radio/index.story.tsx +47 -40
  166. package/src/components/Radio/index.test.tsx +22 -29
  167. package/src/components/Radio/index.tsx +16 -208
  168. package/src/components/SegmentedControl/__snapshots__/index.story.storyshot +32 -262
  169. package/src/components/SegmentedControl/index.css +50 -0
  170. package/src/components/SegmentedControl/index.story.tsx +1 -1
  171. package/src/components/SegmentedControl/index.tsx +20 -89
  172. package/src/components/Switch/SwitchInput/index.css +82 -0
  173. package/src/components/Switch/SwitchInput/index.tsx +40 -0
  174. package/src/components/Switch/SwitchWithLabel.tsx +24 -0
  175. package/src/components/Switch/__snapshots__/index.story.storyshot +35 -539
  176. package/src/components/Switch/index.css +23 -0
  177. package/src/components/Switch/index.story.tsx +16 -19
  178. package/src/components/Switch/index.tsx +43 -140
  179. package/src/components/TagItem/__snapshots__/index.story.storyshot +212 -1063
  180. package/src/components/TagItem/index.css +140 -0
  181. package/src/components/TagItem/index.story.tsx +45 -162
  182. package/src/components/TagItem/index.tsx +72 -220
  183. package/src/components/TextArea/TextArea.story.tsx +63 -25
  184. package/src/components/TextArea/__snapshots__/TextArea.story.storyshot +615 -1055
  185. package/src/components/TextArea/index.css +78 -0
  186. package/src/components/TextArea/index.tsx +83 -174
  187. package/src/components/TextField/AssistiveText/index.css +10 -0
  188. package/src/components/TextField/AssistiveText/index.tsx +6 -0
  189. package/src/components/TextField/TextField.story.tsx +85 -76
  190. package/src/components/TextField/__snapshots__/TextField.story.storyshot +631 -1709
  191. package/src/components/TextField/index.css +87 -0
  192. package/src/components/TextField/index.tsx +92 -211
  193. package/src/core/CharcoalProvider.tsx +5 -29
  194. package/src/core/SSRProvider.tsx +12 -1
  195. package/src/index.ts +7 -19
  196. package/src/type.d.ts +3 -8
  197. package/dist/components/Button/index.story.d.ts +0 -24
  198. package/dist/components/Button/index.story.d.ts.map +0 -1
  199. package/dist/components/Checkbox/index.story.d.ts +0 -8
  200. package/dist/components/Checkbox/index.story.d.ts.map +0 -1
  201. package/dist/components/Clickable/index.story.d.ts +0 -6
  202. package/dist/components/Clickable/index.story.d.ts.map +0 -1
  203. package/dist/components/DropdownSelector/Divider.d.ts +0 -7
  204. package/dist/components/DropdownSelector/Divider.d.ts.map +0 -1
  205. package/dist/components/DropdownSelector/DropdownMenuItem.d.ts +0 -7
  206. package/dist/components/DropdownSelector/DropdownMenuItem.d.ts.map +0 -1
  207. package/dist/components/DropdownSelector/ListItem/index.story.d.ts +0 -9
  208. package/dist/components/DropdownSelector/ListItem/index.story.d.ts.map +0 -1
  209. package/dist/components/DropdownSelector/MenuList/index.story.d.ts +0 -8
  210. package/dist/components/DropdownSelector/MenuList/index.story.d.ts.map +0 -1
  211. package/dist/components/DropdownSelector/Popover/index.story.d.ts +0 -5
  212. package/dist/components/DropdownSelector/Popover/index.story.d.ts.map +0 -1
  213. package/dist/components/DropdownSelector/index.story.d.ts +0 -19
  214. package/dist/components/DropdownSelector/index.story.d.ts.map +0 -1
  215. package/dist/components/Icon/index.story.d.ts +0 -6
  216. package/dist/components/Icon/index.story.d.ts.map +0 -1
  217. package/dist/components/IconButton/index.story.d.ts +0 -9
  218. package/dist/components/IconButton/index.story.d.ts.map +0 -1
  219. package/dist/components/LoadingSpinner/LoadingSpinnerIcon.story.d.ts +0 -8
  220. package/dist/components/LoadingSpinner/LoadingSpinnerIcon.story.d.ts.map +0 -1
  221. package/dist/components/LoadingSpinner/index.story.d.ts +0 -6
  222. package/dist/components/LoadingSpinner/index.story.d.ts.map +0 -1
  223. package/dist/components/Modal/__stories__/InternalScrollStory.d.ts +0 -4
  224. package/dist/components/Modal/__stories__/InternalScrollStory.d.ts.map +0 -1
  225. package/dist/components/Modal/index.story.d.ts +0 -21
  226. package/dist/components/Modal/index.story.d.ts.map +0 -1
  227. package/dist/components/MultiSelect/context.d.ts +0 -14
  228. package/dist/components/MultiSelect/context.d.ts.map +0 -1
  229. package/dist/components/MultiSelect/index.d.ts +0 -36
  230. package/dist/components/MultiSelect/index.d.ts.map +0 -1
  231. package/dist/components/MultiSelect/index.story.d.ts +0 -82
  232. package/dist/components/MultiSelect/index.story.d.ts.map +0 -1
  233. package/dist/components/MultiSelect/index.test.d.ts +0 -2
  234. package/dist/components/MultiSelect/index.test.d.ts.map +0 -1
  235. package/dist/components/Radio/index.story.d.ts +0 -26
  236. package/dist/components/Radio/index.story.d.ts.map +0 -1
  237. package/dist/components/Radio/index.test.d.ts +0 -2
  238. package/dist/components/Radio/index.test.d.ts.map +0 -1
  239. package/dist/components/SegmentedControl/index.story.d.ts +0 -7
  240. package/dist/components/SegmentedControl/index.story.d.ts.map +0 -1
  241. package/dist/components/Switch/index.story.d.ts +0 -9
  242. package/dist/components/Switch/index.story.d.ts.map +0 -1
  243. package/dist/components/TagItem/index.story.d.ts +0 -16
  244. package/dist/components/TagItem/index.story.d.ts.map +0 -1
  245. package/dist/components/TextArea/TextArea.story.d.ts +0 -9
  246. package/dist/components/TextArea/TextArea.story.d.ts.map +0 -1
  247. package/dist/components/TextField/TextField.story.d.ts +0 -22
  248. package/dist/components/TextField/TextField.story.d.ts.map +0 -1
  249. package/dist/components/a11y.test.d.ts +0 -2
  250. package/dist/components/a11y.test.d.ts.map +0 -1
  251. package/dist/core/ComponentAbstraction.d.ts +0 -24
  252. package/dist/core/ComponentAbstraction.d.ts.map +0 -1
  253. package/dist/styled.d.ts +0 -95
  254. package/dist/styled.d.ts.map +0 -1
  255. package/src/components/DropdownSelector/Divider.tsx +0 -16
  256. package/src/components/DropdownSelector/DropdownMenuItem.tsx +0 -43
  257. package/src/components/LoadingSpinner/LoadingSpinnerIcon.story.tsx +0 -13
  258. package/src/components/Modal/__stories__/InternalScrollStory.tsx +0 -75
  259. package/src/components/MultiSelect/__snapshots__/index.story.storyshot +0 -1066
  260. package/src/components/MultiSelect/context.ts +0 -23
  261. package/src/components/MultiSelect/index.story.tsx +0 -216
  262. package/src/components/MultiSelect/index.test.tsx +0 -263
  263. package/src/components/MultiSelect/index.tsx +0 -281
  264. package/src/components/a11y.test.tsx +0 -99
  265. package/src/core/ComponentAbstraction.tsx +0 -48
  266. package/src/styled.ts +0 -3
@@ -0,0 +1,34 @@
1
+ import './index.css'
2
+
3
+ import MenuItem, { MenuItemProps } from '../MenuItem'
4
+ import { MenuListContext } from '../MenuList/MenuListContext'
5
+ import { useContext } from 'react'
6
+ import Icon from '../../Icon'
7
+
8
+ export type DropdownMenuItemProps = Omit<MenuItemProps, 'as'>
9
+
10
+ /**
11
+ * DropdownSelectorの選択肢として使うMenuItem
12
+ */
13
+ export default function DropdownMenuItem(props: DropdownMenuItemProps) {
14
+ const { value: ctxValue } = useContext(MenuListContext)
15
+ const isSelected = props.value === ctxValue
16
+ const { children, ...rest } = props
17
+
18
+ return (
19
+ <MenuItem {...rest} aria-selected={isSelected}>
20
+ {isSelected && (
21
+ <Icon
22
+ className="charcoal-dropdown-selector-menu-item-icon"
23
+ name="16/Check"
24
+ />
25
+ )}
26
+ <span
27
+ className="charcoal-dropdown-selector-menu-item"
28
+ data-selected={isSelected}
29
+ >
30
+ {props.children}
31
+ </span>
32
+ </MenuItem>
33
+ )
34
+ }
@@ -19,15 +19,22 @@ export function DropdownPopover({ children, ...props }: DropdownPopoverProps) {
19
19
  }, [props.triggerRef, props.isOpen])
20
20
 
21
21
  useEffect(() => {
22
- if (props.isOpen && props.value !== undefined) {
23
- // windowのスクロールを維持したまま選択肢をPopoverの中心に表示する
24
- const windowScrollY = window.scrollY
25
- const windowScrollX = window.scrollX
26
- const selectedElement = document.querySelector(
27
- `[data-key="${props.value.toString()}"]`
28
- ) as HTMLElement | undefined
29
- selectedElement?.focus()
30
- window.scrollTo(windowScrollX, windowScrollY)
22
+ if (props.isOpen) {
23
+ if (props.value !== undefined && props.value !== '') {
24
+ // windowのスクロールを維持したまま選択肢をPopoverの中心に表示する
25
+ const windowScrollY = window.scrollY
26
+ const windowScrollX = window.scrollX
27
+ const selectedElement = document.querySelector(
28
+ `[data-key="${props.value.toString()}"]`
29
+ ) as HTMLElement | undefined
30
+ selectedElement?.focus()
31
+ window.scrollTo(windowScrollX, windowScrollY)
32
+ } else {
33
+ const el = ref.current?.querySelector("[role='option']")
34
+ if (el instanceof HTMLElement) {
35
+ el.focus()
36
+ }
37
+ }
31
38
  }
32
39
  }, [props.value, props.isOpen])
33
40
 
@@ -1,244 +1,61 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`Storybook Tests DropdownSelector/ListItem Basic 1`] = `
4
- .c0 {
5
- list-style: none;
6
- }
7
-
8
- .c1 {
9
- display: -webkit-box;
10
- display: -webkit-flex;
11
- display: -ms-flexbox;
12
- display: flex;
13
- -webkit-align-items: center;
14
- -webkit-box-align: center;
15
- -ms-flex-align: center;
16
- align-items: center;
17
- min-height: 40px;
18
- cursor: pointer;
19
- outline: none;
20
- padding-right: 16px;
21
- padding-left: 16px;
22
- -webkit-transition: background-color 0.2s;
23
- transition: background-color 0.2s;
24
- }
25
-
26
- .c1:disabled,
27
- .c1[aria-disabled]:not([aria-disabled='false']) {
28
- opacity: 0.32;
29
- cursor: default;
30
- }
31
-
32
- .c1:hover:not(disabled):not([aria-disabled='true']),
33
- .c1:focus:not(disabled):not([aria-disabled='true']),
34
- .c1:focus-within:not(disabled):not([aria-disabled='true']) {
35
- background-color: var(--charcoal-surface3);
36
- }
37
-
38
- .c3 {
39
- display: inline-grid;
40
- grid-template-columns: auto 1fr;
41
- -webkit-align-items: center;
42
- -webkit-box-align: center;
43
- -ms-flex-align: center;
44
- align-items: center;
45
- cursor: pointer;
46
- outline: 0;
47
- }
48
-
49
- .c3:disabled,
50
- .c3[aria-disabled]:not([aria-disabled='false']) {
51
- opacity: 0.32;
52
- cursor: default;
53
- }
54
-
55
- .c4 {
56
- -webkit-appearance: none;
57
- -moz-appearance: none;
58
- appearance: none;
59
- display: -webkit-inline-box;
60
- display: -webkit-inline-flex;
61
- display: -ms-inline-flexbox;
62
- display: inline-flex;
63
- position: relative;
64
- box-sizing: border-box;
65
- width: 28px;
66
- border: 2px solid transparent;
67
- -webkit-transition-property: background-color,box-shadow;
68
- transition-property: background-color,box-shadow;
69
- -webkit-transition-duration: 0.2s;
70
- transition-duration: 0.2s;
71
- cursor: inherit;
72
- outline: none;
73
- border-radius: 16px;
74
- height: 16px;
75
- margin: 0;
76
- background-color: var(--charcoal-text4);
77
- }
78
-
79
- .c4:hover {
80
- background-color: var(--charcoal-text4-hover);
81
- }
82
-
83
- .c4:active {
84
- background-color: var(--charcoal-text4-press);
85
- }
86
-
87
- .c4:focus {
88
- outline: none;
89
- box-shadow: 0 0 0 4px rgba(0,150,250,0.32);
90
- }
91
-
92
- .c4:focus:not(:focus-visible) {
93
- box-shadow: none;
94
- }
95
-
96
- .c4:focus-visible {
97
- box-shadow: 0 0 0 4px rgba(0,150,250,0.32);
98
- }
99
-
100
- .c4::after {
101
- content: '';
102
- position: absolute;
103
- display: block;
104
- top: 0;
105
- left: 0;
106
- width: 12px;
107
- height: 12px;
108
- -webkit-transform: translateX(0);
109
- -ms-transform: translateX(0);
110
- transform: translateX(0);
111
- -webkit-transition: -webkit-transform 0.2s;
112
- -webkit-transition: transform 0.2s;
113
- transition: transform 0.2s;
114
- border-radius: 1024px;
115
- background-color: var(--charcoal-text5);
116
- }
117
-
118
- .c4::after:hover {
119
- background-color: var(--charcoal-text5-hover);
120
- }
121
-
122
- .c4::after:active {
123
- background-color: var(--charcoal-text5-press);
124
- }
125
-
126
- .c4:checked {
127
- background-color: var(--charcoal-brand);
128
- }
129
-
130
- .c4:checked:hover {
131
- background-color: var(--charcoal-brand-hover);
132
- }
133
-
134
- .c4:checked:active {
135
- background-color: var(--charcoal-brand-press);
136
- }
137
-
138
- .c4:checked::after {
139
- -webkit-transform: translateX(12px);
140
- -ms-transform: translateX(12px);
141
- transform: translateX(12px);
142
- -webkit-transition: -webkit-transform 0.2s;
143
- -webkit-transition: transform 0.2s;
144
- transition: transform 0.2s;
145
- }
146
-
147
- .c2 {
148
- color: red;
149
- }
150
-
3
+ exports[`Storybook Tests > react/internals/ListItem > Basic 1`] = `
151
4
  <div
152
5
  data-dark={false}
153
6
  >
154
7
  <li
155
- className="c0"
156
- role="option"
8
+ className="charcoal-list-item"
157
9
  >
158
- <div
159
- className="c1"
160
- >
161
- Item
162
- </div>
10
+ Item
163
11
  </li>
164
12
  <li
165
- className="c0"
166
- role="option"
13
+ className="charcoal-list-item"
167
14
  >
168
- <div
169
- className="c1"
170
- >
171
- <pixiv-icon
172
- name="16/Add"
173
- />
174
- Add
175
- </div>
15
+ <pixiv-icon
16
+ name="16/Add"
17
+ />
18
+ Add
176
19
  </li>
177
- <li
178
- className="c0"
179
- role="option"
20
+ <a
21
+ className="charcoal-list-item"
22
+ href="#"
180
23
  >
181
- <a
182
- className="c1"
183
- href="#"
184
- >
185
- Normal Link
186
- </a>
187
- </li>
188
- <li
189
- className="c0"
190
- role="option"
24
+ Normal Link
25
+ </a>
26
+ <a
27
+ className="charcoal-list-item"
28
+ href="#"
29
+ style={
30
+ Object {
31
+ "color": "red",
32
+ }
33
+ }
191
34
  >
192
- <a
193
- className="c2 c1"
194
- href="#"
195
- >
196
- Custom Link
197
- </a>
198
- </li>
35
+ Custom Link
36
+ </a>
199
37
  <li
200
- className="c0"
201
- role="option"
38
+ className="charcoal-list-item"
39
+ onClick={[Function]}
202
40
  >
41
+ Switch
203
42
  <div
204
- className="c1"
205
- onClick={[Function]}
206
- >
207
- Switch
208
- <div
209
- style={
210
- Object {
211
- "marginLeft": "auto",
212
- }
43
+ style={
44
+ Object {
45
+ "marginLeft": "auto",
213
46
  }
214
- >
215
- <label
216
- className="c3"
217
- >
218
- <input
219
- aria-label="hello"
220
- checked={false}
221
- className="c4"
222
- disabled={false}
223
- name="hello"
224
- onChange={[Function]}
225
- onClick={[Function]}
226
- onDragStart={[Function]}
227
- onKeyDown={[Function]}
228
- onKeyUp={[Function]}
229
- onMouseDown={[Function]}
230
- onMouseEnter={[Function]}
231
- onMouseLeave={[Function]}
232
- onMouseUp={[Function]}
233
- onTouchCancel={[Function]}
234
- onTouchEnd={[Function]}
235
- onTouchMove={[Function]}
236
- onTouchStart={[Function]}
237
- role="switch"
238
- type="checkbox"
239
- />
240
- </label>
241
- </div>
47
+ }
48
+ >
49
+ <input
50
+ checked={false}
51
+ className="charcoal-switch-input"
52
+ id="test-id"
53
+ label="hello"
54
+ name="hello"
55
+ onChange={[Function]}
56
+ role="switch"
57
+ type="checkbox"
58
+ />
242
59
  </div>
243
60
  </li>
244
61
  </div>
@@ -0,0 +1,24 @@
1
+ .charcoal-list-item {
2
+ list-style: none;
3
+ display: flex;
4
+ align-items: center;
5
+ min-height: 40px;
6
+ cursor: pointer;
7
+ outline: none;
8
+
9
+ padding-right: 16px;
10
+ padding-left: 16px;
11
+
12
+ transition: background-color 0.2s;
13
+ }
14
+
15
+ .charcoal-list-item:not([aria-disabled='true']):hover,
16
+ .charcoal-list-item:not([aria-disabled='true']):focus,
17
+ .charcoal-list-item:not([aria-disabled='true']):focus-within {
18
+ background-color: var(--charcoal-surface3);
19
+ }
20
+
21
+ .charcoal-list-item[aria-disabled='true'] {
22
+ opacity: 0.32;
23
+ cursor: default;
24
+ }
@@ -1,18 +1,24 @@
1
- import { useState } from 'react'
1
+ import React, { useState } from 'react'
2
2
  import Icon from '../../Icon'
3
3
  import Switch from '../../Switch'
4
4
  import ListItem from '.'
5
- import styled from 'styled-components'
6
5
  import { Meta, StoryObj } from '@storybook/react'
7
6
 
8
7
  export default {
9
- title: 'DropdownSelector/ListItem',
8
+ title: 'react/internals/ListItem',
10
9
  component: ListItem,
11
10
  } as Meta<typeof ListItem>
12
11
 
13
- const CustomLink = styled.a`
14
- color: red;
15
- `
12
+ const CustomLink = (props: Omit<React.ComponentProps<'a'>, 'style'>) => {
13
+ return (
14
+ <a
15
+ style={{
16
+ color: 'red',
17
+ }}
18
+ {...props}
19
+ />
20
+ )
21
+ }
16
22
 
17
23
  const BasicRender = () => {
18
24
  const [checked, setChecked] = useState(false)
@@ -1,64 +1,25 @@
1
- import { ReactNode } from 'react'
2
- import styled from 'styled-components'
1
+ import './index.css'
2
+
3
+ import { ForwardedRef, forwardRef, ReactNode, useMemo } from 'react'
4
+ import { useClassNames } from '../../../_lib/useClassNames'
3
5
 
4
6
  export type CustomJSXElement =
5
7
  | keyof JSX.IntrinsicElements
6
8
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
9
  | React.JSXElementConstructor<any>
8
10
 
9
- export type ListItemProps<T extends CustomJSXElement = 'div'> = {
11
+ export type ListItemProps<T extends React.ElementType = 'li'> = {
10
12
  children?: ReactNode
11
13
  as?: T
12
- } & Omit<React.ComponentProps<T>, 'children'>
14
+ } & Omit<React.ComponentPropsWithRef<T>, 'children' | 'as'>
13
15
 
14
- /**
15
- * リストのある要素を示すコンポーネント
16
- *
17
- * asを用いて拡張することができる
18
- * @example
19
- * ```
20
- * <ListItem as="a" href="#">Link</ListItem>
21
- * <ListItem as={NextLink} href="#">NextLink</ListItem>
22
- * ```
23
- */
24
- export default function ListItem<T extends CustomJSXElement = 'div'>(
25
- props: ListItemProps<T>
16
+ const ListItem = forwardRef(function ListItem<T extends React.ElementType>(
17
+ { as, className, ...props }: ListItemProps<T>,
18
+ ref: ForwardedRef<HTMLLIElement>
26
19
  ) {
27
- const { children, ...rest } = props
28
- return (
29
- <StyledLi role="option">
30
- <ItemDiv {...rest}>{props.children}</ItemDiv>
31
- </StyledLi>
32
- )
33
- }
34
-
35
- const StyledLi = styled.li`
36
- list-style: none;
37
- `
38
-
39
- const ItemDiv = styled.div`
40
- display: flex;
41
- align-items: center;
42
- min-height: 40px;
43
- cursor: pointer;
44
- outline: none;
45
-
46
- padding-right: 16px;
47
- padding-left: 16px;
48
-
49
- transition: background-color 0.2s;
50
-
51
- &:disabled,
52
- &[aria-disabled]:not([aria-disabled='false']) {
53
- opacity: 0.32;
54
- cursor: default;
55
- }
20
+ const Component = useMemo(() => as ?? 'li', [as])
21
+ const classNames = useClassNames('charcoal-list-item', className)
22
+ return <Component className={classNames} ref={ref} {...props}></Component>
23
+ }) as <T extends React.ElementType = 'li'>(p: ListItemProps<T>) => JSX.Element
56
24
 
57
- :hover,
58
- :focus,
59
- :focus-within {
60
- &:not(disabled):not([aria-disabled='true']) {
61
- background-color: var(--charcoal-surface3);
62
- }
63
- }
64
- `
25
+ export default ListItem
@@ -1,7 +1,8 @@
1
- import ListItem, { CustomJSXElement, ListItemProps } from '../ListItem'
1
+ import { ForwardedRef, forwardRef } from 'react'
2
+ import ListItem, { ListItemProps } from '../ListItem'
2
3
  import { useMenuItemHandleKeyDown } from './internals/useMenuItemHandleKeyDown'
3
4
 
4
- export type MenuItemProps<T extends CustomJSXElement = never> = {
5
+ export type MenuItemProps<T extends React.ElementType = 'li'> = {
5
6
  value?: string
6
7
  disabled?: boolean
7
8
  } & ListItemProps<T>
@@ -10,22 +11,26 @@ export type MenuItemProps<T extends CustomJSXElement = never> = {
10
11
  * 上下キーでフォーカス移動でき、エンターキーで選択できるリストの項目
11
12
  * 基本的に`<MenuList>`, `<MenuGroup>`と合わせて使用する
12
13
  */
13
- export default function MenuItem<T extends CustomJSXElement>(
14
- props: MenuItemProps<T>
14
+ const MenuItem = forwardRef(function MenuItem<
15
+ T extends React.ElementType = 'li'
16
+ >(
17
+ { className, value, disabled, ...props }: MenuItemProps<T>,
18
+ ref: ForwardedRef<HTMLLIElement>
15
19
  ) {
16
- const { children, as, ...rest } = props
17
- const [handleKeyDown, setContextValue] = useMenuItemHandleKeyDown(props.value)
20
+ const [handleKeyDown, setContextValue] = useMenuItemHandleKeyDown(value)
18
21
  return (
19
22
  <ListItem
20
- {...rest}
21
- as={as as CustomJSXElement}
22
- data-key={props.value}
23
+ {...props}
24
+ ref={ref}
25
+ data-key={value}
23
26
  onKeyDown={handleKeyDown}
24
- onClick={props.disabled === true ? undefined : setContextValue}
27
+ onClick={disabled === true ? undefined : setContextValue}
25
28
  tabIndex={-1}
26
- aria-disabled={props.disabled}
29
+ aria-disabled={disabled}
30
+ role="option"
27
31
  >
28
32
  {props.children}
29
33
  </ListItem>
30
34
  )
31
- }
35
+ })
36
+ export default MenuItem
@@ -11,14 +11,14 @@ import { MenuListContext } from '../../MenuList/MenuListContext'
11
11
  */
12
12
  export function useMenuItemHandleKeyDown(
13
13
  value?: string
14
- ): [(e: React.KeyboardEvent<HTMLDivElement>) => void, () => void] {
14
+ ): [(e: React.KeyboardEvent<HTMLElement>) => void, () => void] {
15
15
  const { setValue, root, propsArray } = useContext(MenuListContext)
16
16
  const setContextValue = useCallback(() => {
17
17
  if (value !== undefined) setValue(value)
18
18
  }, [value, setValue])
19
19
 
20
20
  const handleKeyDown = useCallback(
21
- (e: React.KeyboardEvent<HTMLDivElement>) => {
21
+ (e: React.KeyboardEvent<HTMLElement>) => {
22
22
  if (e.key === 'Enter') {
23
23
  setContextValue()
24
24
  } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {
@@ -0,0 +1,19 @@
1
+ .charcoal-menu-item-group {
2
+ display: block;
3
+ }
4
+
5
+ .charcoal-menu-item-group > span {
6
+ display: block;
7
+ color: var(--charcoal-text3);
8
+ font-size: 12px;
9
+ font-weight: bold;
10
+ padding: 12px 0 8px 16px;
11
+ }
12
+
13
+ .charcoal-menu-item-group > ul {
14
+ padding-left: 0;
15
+ margin: 0;
16
+ box-sizing: border-box;
17
+ list-style: none;
18
+ overflow: hidden;
19
+ }
@@ -1,4 +1,5 @@
1
- import styled from 'styled-components'
1
+ import './index.css'
2
+
2
3
  import MenuItem from '../MenuItem'
3
4
  import { Divider } from '../Divider'
4
5
 
@@ -9,34 +10,11 @@ export type MenuItemGroupProps = {
9
10
  children: MenuItemGroupChild | MenuItemGroupChild[]
10
11
  }
11
12
 
12
- /**
13
- * 項目のリストを分類する見出しをつけるコンテナ要素
14
- */
15
13
  export default function MenuItemGroup(props: MenuItemGroupProps) {
16
14
  return (
17
- <StyledLi role="presentation">
18
- <TextSpan>{props.text}</TextSpan>
19
- <StyledUl role="group">{props.children}</StyledUl>
20
- </StyledLi>
15
+ <li className="charcoal-menu-item-group" role="presentation">
16
+ <span>{props.text}</span>
17
+ <ul role="group">{props.children}</ul>
18
+ </li>
21
19
  )
22
20
  }
23
-
24
- const TextSpan = styled.span`
25
- display: block;
26
- color: var(--charcoal-text3);
27
- font-size: 12px;
28
- font-weight: bold;
29
- padding: 12px 0 8px 16px;
30
- `
31
-
32
- const StyledUl = styled.ul`
33
- padding-left: 0;
34
- margin: 0;
35
- box-sizing: border-box;
36
- list-style: none;
37
- overflow: hidden;
38
- `
39
-
40
- const StyledLi = styled.li`
41
- display: block;
42
- `