@charcoal-ui/react 4.0.0-beta.7 → 4.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/dist/_lib/compat.d.ts +0 -12
  2. package/dist/_lib/compat.d.ts.map +1 -1
  3. package/dist/_lib/createDivComponent.d.ts +2 -2
  4. package/dist/_lib/createDivComponent.d.ts.map +1 -1
  5. package/dist/components/Button/index.d.ts +2 -6
  6. package/dist/components/Button/index.d.ts.map +1 -1
  7. package/dist/components/Clickable/index.d.ts +4 -7
  8. package/dist/components/Clickable/index.d.ts.map +1 -1
  9. package/dist/components/DropdownSelector/Divider/index.d.ts +3 -0
  10. package/dist/components/DropdownSelector/Divider/index.d.ts.map +1 -0
  11. package/dist/components/DropdownSelector/DropdownMenuItem/index.d.ts +8 -0
  12. package/dist/components/DropdownSelector/DropdownMenuItem/index.d.ts.map +1 -0
  13. package/dist/components/DropdownSelector/DropdownPopover.d.ts.map +1 -1
  14. package/dist/components/DropdownSelector/ListItem/index.d.ts +5 -13
  15. package/dist/components/DropdownSelector/ListItem/index.d.ts.map +1 -1
  16. package/dist/components/DropdownSelector/MenuItem/index.d.ts +10 -3
  17. package/dist/components/DropdownSelector/MenuItem/index.d.ts.map +1 -1
  18. package/dist/components/DropdownSelector/MenuItem/internals/useMenuItemHandleKeyDown.d.ts +1 -1
  19. package/dist/components/DropdownSelector/MenuItem/internals/useMenuItemHandleKeyDown.d.ts.map +1 -1
  20. package/dist/components/DropdownSelector/MenuItemGroup/index.d.ts +1 -3
  21. package/dist/components/DropdownSelector/MenuItemGroup/index.d.ts.map +1 -1
  22. package/dist/components/DropdownSelector/MenuList/index.d.ts +1 -4
  23. package/dist/components/DropdownSelector/MenuList/index.d.ts.map +1 -1
  24. package/dist/components/DropdownSelector/Popover/index.d.ts +1 -0
  25. package/dist/components/DropdownSelector/Popover/index.d.ts.map +1 -1
  26. package/dist/components/DropdownSelector/index.d.ts +3 -1
  27. package/dist/components/DropdownSelector/index.d.ts.map +1 -1
  28. package/dist/components/IconButton/index.d.ts +1 -2
  29. package/dist/components/IconButton/index.d.ts.map +1 -1
  30. package/dist/components/Modal/Dialog/index.d.ts +1 -1
  31. package/dist/components/Modal/Dialog/index.d.ts.map +1 -1
  32. package/dist/components/Modal/ModalPlumbing.d.ts +6 -6
  33. package/dist/components/Modal/ModalPlumbing.d.ts.map +1 -1
  34. package/dist/components/Modal/index.d.ts.map +1 -1
  35. package/dist/components/Modal/useCustomModalOverlay.d.ts +1 -0
  36. package/dist/components/Modal/useCustomModalOverlay.d.ts.map +1 -1
  37. package/dist/components/Radio/RadioGroup/index.d.ts +20 -0
  38. package/dist/components/Radio/RadioGroup/index.d.ts.map +1 -0
  39. package/dist/components/Radio/RadioGroupContext.d.ts +11 -0
  40. package/dist/components/Radio/RadioGroupContext.d.ts.map +1 -0
  41. package/dist/components/Radio/RadioInput/index.d.ts +10 -0
  42. package/dist/components/Radio/RadioInput/index.d.ts.map +1 -0
  43. package/dist/components/Radio/index.d.ts +1 -12
  44. package/dist/components/Radio/index.d.ts.map +1 -1
  45. package/dist/components/TagItem/index.d.ts +2 -6
  46. package/dist/components/TagItem/index.d.ts.map +1 -1
  47. package/dist/components/TextArea/index.d.ts +1 -1
  48. package/dist/components/TextArea/index.d.ts.map +1 -1
  49. package/dist/components/TextField/AssistiveText/index.d.ts +2 -2
  50. package/dist/components/TextField/AssistiveText/index.d.ts.map +1 -1
  51. package/dist/components/TextField/index.d.ts +3 -3
  52. package/dist/components/TextField/index.d.ts.map +1 -1
  53. package/dist/core/CharcoalProvider.d.ts +4 -11
  54. package/dist/core/CharcoalProvider.d.ts.map +1 -1
  55. package/dist/index.cjs.js +356 -399
  56. package/dist/index.cjs.js.map +1 -1
  57. package/dist/index.css +176 -27
  58. package/dist/index.css.map +1 -1
  59. package/dist/index.d.ts +2 -2
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.esm.js +322 -363
  62. package/dist/index.esm.js.map +1 -1
  63. package/dist/layered.css +1214 -0
  64. package/dist/layered.css.map +1 -0
  65. package/package.json +17 -13
  66. package/src/README.mdx +68 -0
  67. package/src/SSR.mdx +67 -0
  68. package/src/_lib/compat.ts +0 -11
  69. package/src/_lib/index.ts +1 -1
  70. package/src/components/Button/__snapshots__/index.story.storyshot +9 -9
  71. package/src/components/Button/index.tsx +4 -10
  72. package/src/components/Checkbox/CheckboxInput/__snapshots__/index.story.storyshot +5 -5
  73. package/src/components/Checkbox/CheckboxInput/index.css +4 -5
  74. package/src/components/Checkbox/__snapshots__/index.story.storyshot +6 -6
  75. package/src/components/Clickable/__snapshots__/index.story.storyshot +2 -2
  76. package/src/components/Clickable/index.story.tsx +1 -1
  77. package/src/components/Clickable/index.tsx +7 -12
  78. package/src/components/DropdownSelector/Divider/index.css +11 -0
  79. package/src/components/DropdownSelector/Divider/index.tsx +5 -0
  80. package/src/components/DropdownSelector/DropdownMenuItem/index.css +20 -0
  81. package/src/components/DropdownSelector/DropdownMenuItem/index.tsx +34 -0
  82. package/src/components/DropdownSelector/DropdownPopover.tsx +16 -9
  83. package/src/components/DropdownSelector/ListItem/__snapshots__/index.story.storyshot +41 -99
  84. package/src/components/DropdownSelector/ListItem/index.css +24 -0
  85. package/src/components/DropdownSelector/ListItem/index.story.tsx +11 -5
  86. package/src/components/DropdownSelector/ListItem/index.tsx +14 -53
  87. package/src/components/DropdownSelector/MenuItem/index.tsx +17 -12
  88. package/src/components/DropdownSelector/MenuItem/internals/useMenuItemHandleKeyDown.tsx +2 -2
  89. package/src/components/DropdownSelector/MenuItemGroup/index.css +19 -0
  90. package/src/components/DropdownSelector/MenuItemGroup/index.tsx +6 -28
  91. package/src/components/DropdownSelector/MenuList/__snapshots__/index.story.storyshot +162 -416
  92. package/src/components/DropdownSelector/MenuList/index.css +4 -0
  93. package/src/components/DropdownSelector/MenuList/index.tsx +4 -12
  94. package/src/components/DropdownSelector/Popover/__snapshots__/index.story.storyshot +1 -1
  95. package/src/components/DropdownSelector/Popover/index.css +11 -0
  96. package/src/components/DropdownSelector/Popover/index.tsx +6 -15
  97. package/src/components/DropdownSelector/__snapshots__/index.story.storyshot +403 -1181
  98. package/src/components/DropdownSelector/index.css +84 -0
  99. package/src/components/DropdownSelector/index.story.tsx +0 -4
  100. package/src/components/DropdownSelector/index.tsx +40 -102
  101. package/src/components/Icon/__snapshots__/index.story.storyshot +1 -1
  102. package/src/components/IconButton/__snapshots__/index.story.storyshot +3 -3
  103. package/src/components/IconButton/index.tsx +3 -6
  104. package/src/components/LoadingSpinner/__snapshots__/index.story.storyshot +4 -4
  105. package/src/components/Modal/Dialog/index.tsx +2 -1
  106. package/src/components/Modal/__snapshots__/index.story.storyshot +118 -437
  107. package/src/components/Modal/index.story.tsx +26 -11
  108. package/src/components/Modal/index.tsx +5 -6
  109. package/src/components/Modal/useCustomModalOverlay.tsx +20 -0
  110. package/src/components/Radio/RadioGroup/index.css +5 -0
  111. package/src/components/Radio/RadioGroup/index.tsx +80 -0
  112. package/src/components/Radio/RadioGroupContext.ts +23 -0
  113. package/src/components/Radio/RadioInput/index.css +82 -0
  114. package/src/components/Radio/RadioInput/index.tsx +41 -0
  115. package/src/components/Radio/__snapshots__/index.story.storyshot +76 -95
  116. package/src/components/Radio/index.css +2 -81
  117. package/src/components/Radio/index.story.tsx +30 -13
  118. package/src/components/Radio/index.test.tsx +22 -28
  119. package/src/components/Radio/index.tsx +7 -89
  120. package/src/components/SegmentedControl/__snapshots__/index.story.storyshot +2 -2
  121. package/src/components/Switch/__snapshots__/index.story.storyshot +4 -4
  122. package/src/components/TagItem/__snapshots__/index.story.storyshot +8 -8
  123. package/src/components/TagItem/index.tsx +4 -8
  124. package/src/components/TextArea/__snapshots__/TextArea.story.storyshot +11 -11
  125. package/src/components/TextField/TextField.story.tsx +8 -9
  126. package/src/components/TextField/__snapshots__/TextField.story.storyshot +20 -26
  127. package/src/components/TextField/index.tsx +2 -2
  128. package/src/core/CharcoalProvider.tsx +5 -29
  129. package/src/index.ts +2 -11
  130. package/src/type.d.ts +2 -13
  131. package/dist/components/DropdownSelector/Divider.d.ts +0 -7
  132. package/dist/components/DropdownSelector/Divider.d.ts.map +0 -1
  133. package/dist/components/DropdownSelector/DropdownMenuItem.d.ts +0 -7
  134. package/dist/components/DropdownSelector/DropdownMenuItem.d.ts.map +0 -1
  135. package/dist/components/Modal/__stories__/InternalScrollStory.d.ts +0 -4
  136. package/dist/components/Modal/__stories__/InternalScrollStory.d.ts.map +0 -1
  137. package/dist/core/ComponentAbstraction.d.ts +0 -24
  138. package/dist/core/ComponentAbstraction.d.ts.map +0 -1
  139. package/dist/styled.d.ts +0 -95
  140. package/dist/styled.d.ts.map +0 -1
  141. package/src/components/Button/__snapshots__/index.test.tsx.snap +0 -11
  142. package/src/components/Button/index.test.tsx +0 -32
  143. package/src/components/DropdownSelector/Divider.tsx +0 -16
  144. package/src/components/DropdownSelector/DropdownMenuItem.tsx +0 -43
  145. package/src/components/Modal/__stories__/InternalScrollStory.tsx +0 -75
  146. package/src/components/a11y.test.tsx +0 -99
  147. package/src/core/ComponentAbstraction.tsx +0 -48
  148. package/src/styled.ts +0 -3
@@ -0,0 +1,5 @@
1
+ import './index.css'
2
+
3
+ export function Divider() {
4
+ return <div role="separator" className="charcoal-menu-group-divider" />
5
+ }
@@ -0,0 +1,20 @@
1
+ .charcoal-dropdown-selector-menu-item {
2
+ font-size: 14px;
3
+ line-height: 22px;
4
+ color: var(--charcoal-text2);
5
+ padding: 9px 0;
6
+
7
+ display: flex;
8
+ align-items: center;
9
+ width: 100%;
10
+ margin-left: 20px;
11
+ }
12
+
13
+ .charcoal-dropdown-selector-menu-item[data-selected='true'] {
14
+ margin-left: 0px;
15
+ }
16
+
17
+ .charcoal-dropdown-selector-menu-item-icon {
18
+ color: var(--charcoal-text2);
19
+ padding-right: 4px;
20
+ }
@@ -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,119 +1,61 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`Storybook Tests react/internals/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
- .c2 {
39
- color: red;
40
- }
41
-
3
+ exports[`Storybook Tests > react/internals/ListItem > Basic 1`] = `
42
4
  <div
43
5
  data-dark={false}
44
6
  >
45
7
  <li
46
- className="c0"
47
- role="option"
8
+ className="charcoal-list-item"
48
9
  >
49
- <div
50
- className="c1"
51
- >
52
- Item
53
- </div>
10
+ Item
54
11
  </li>
55
12
  <li
56
- className="c0"
57
- role="option"
13
+ className="charcoal-list-item"
58
14
  >
59
- <div
60
- className="c1"
61
- >
62
- <pixiv-icon
63
- name="16/Add"
64
- />
65
- Add
66
- </div>
15
+ <pixiv-icon
16
+ name="16/Add"
17
+ />
18
+ Add
67
19
  </li>
68
- <li
69
- className="c0"
70
- role="option"
20
+ <a
21
+ className="charcoal-list-item"
22
+ href="#"
71
23
  >
72
- <a
73
- className="c1"
74
- href="#"
75
- >
76
- Normal Link
77
- </a>
78
- </li>
79
- <li
80
- className="c0"
81
- 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
+ }
82
34
  >
83
- <a
84
- className="c2 c1"
85
- href="#"
86
- >
87
- Custom Link
88
- </a>
89
- </li>
35
+ Custom Link
36
+ </a>
90
37
  <li
91
- className="c0"
92
- role="option"
38
+ className="charcoal-list-item"
39
+ onClick={[Function]}
93
40
  >
41
+ Switch
94
42
  <div
95
- className="c1"
96
- onClick={[Function]}
97
- >
98
- Switch
99
- <div
100
- style={
101
- Object {
102
- "marginLeft": "auto",
103
- }
43
+ style={
44
+ Object {
45
+ "marginLeft": "auto",
104
46
  }
105
- >
106
- <input
107
- checked={false}
108
- className="charcoal-switch-input"
109
- id="test-id"
110
- label="hello"
111
- name="hello"
112
- onChange={[Function]}
113
- role="switch"
114
- type="checkbox"
115
- />
116
- </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
+ />
117
59
  </div>
118
60
  </li>
119
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,8 +1,7 @@
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 {
@@ -10,9 +9,16 @@ export default {
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
- `