@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,87 @@
1
+ .charcoal-text-field-root {
2
+ display: grid;
3
+ grid-template-columns: 1fr;
4
+ grid-gap: 4px;
5
+ }
6
+
7
+ .charcoal-text-field-root[aria-disabled='true'] {
8
+ opacity: 0.32;
9
+ }
10
+
11
+ .charcoal-text-field-container {
12
+ display: flex;
13
+ height: 40px;
14
+ transition: 0.2s background-color, 0.2s box-shadow;
15
+ color: var(--charcoal-text2);
16
+ background-color: var(--charcoal-surface3);
17
+ border-radius: 4px;
18
+ padding: 0 8px;
19
+ line-height: 22px;
20
+ font-size: 14px;
21
+ }
22
+
23
+ .charcoal-text-field-container[data-invalid='true'] {
24
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
25
+ }
26
+
27
+ .charcoal-text-field-container:not([aria-disabled='true']):hover {
28
+ background-color: var(--charcoal-surface3-hover);
29
+ }
30
+
31
+ .charcoal-text-field-container:not([aria-disabled='true']):focus-within {
32
+ outline: none;
33
+ box-shadow: 0 0 0 4px rgba(0, 150, 250, 0.32);
34
+ }
35
+
36
+ .charcoal-text-field-container:not(
37
+ [aria-disabled='true']
38
+ )[data-invalid='true']:focus-within {
39
+ box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
40
+ }
41
+
42
+ .charcoal-text-field-prefix {
43
+ display: flex;
44
+ align-items: center;
45
+ margin-right: 4px;
46
+ }
47
+
48
+ .charcoal-text-field-suffix {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 8px;
52
+ margin-left: 4px;
53
+ }
54
+
55
+ .charcoal-text-field-input {
56
+ border: none;
57
+ box-sizing: border-box;
58
+ outline: none;
59
+ font-family: inherit;
60
+
61
+ /* Prevent zooming for iOS Safari */
62
+ transform-origin: top left;
63
+ transform: scale(0.875);
64
+ width: calc(100% / 0.875);
65
+ height: calc(100% / 0.875);
66
+ font-size: calc(14px / 0.875);
67
+ line-height: calc(22px / 0.875);
68
+ padding-left: 0;
69
+ padding-right: 0;
70
+ border-radius: calc(4px / 0.875);
71
+
72
+ /* Display box-shadow for iOS Safari */
73
+ appearance: none;
74
+ background: transparent;
75
+
76
+ color: var(--charcoal-text2);
77
+ }
78
+
79
+ .charcoal-text-field-input::placeholder {
80
+ color: var(--charcoal-text3);
81
+ }
82
+
83
+ .charcoal-text-field-line-counter {
84
+ line-height: 22px;
85
+ font-size: 14px;
86
+ color: var(--charcoal-text3);
87
+ }
@@ -1,267 +1,148 @@
1
- import { useTextField } from '@react-aria/textfield'
1
+ import './index.css'
2
+
2
3
  import { useVisuallyHidden } from '@react-aria/visually-hidden'
3
4
  import { ReactNode, useCallback, useEffect, useRef, useState } from 'react'
4
5
  import * as React from 'react'
5
- import styled, { css } from 'styled-components'
6
- import FieldLabel, { FieldLabelProps } from '../FieldLabel'
7
- import { countCodePointsInString, mergeRefs } from '../../_lib'
8
- import { ReactAreaUseTextFieldCompat } from '../../_lib/compat'
6
+ import FieldLabel from '../FieldLabel'
7
+ import { countCodePointsInString } from '../../_lib'
9
8
  import { useFocusWithClick } from './useFocusWithClick'
10
- import { mergeProps } from '@react-aria/utils'
11
-
12
- type DOMProps = Omit<
13
- React.InputHTMLAttributes<HTMLInputElement>,
14
- // react-ariaのhookは、onChangeが`(v: string) => void`想定
15
- | 'onChange'
16
-
17
- // RDFa Attributeとかぶる
18
- // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/58d57ca87ac7be0d306c0844dc254e90c150bd0d/types/react/index.d.ts#L1951
19
- | 'prefix'
9
+ import { mergeRefs, useId } from '@react-aria/utils'
10
+ import { AssistiveText } from './AssistiveText'
11
+ import { useClassNames } from '../../_lib/useClassNames'
20
12
 
21
- // ReactAreaUseTextFieldCompatに書いてあるような事情で、ここにあるイベントハンドラの型をゆるめる
22
- | keyof ReactAreaUseTextFieldCompat
23
- >
13
+ export type TextFieldProps = {
14
+ prefix?: ReactNode
15
+ suffix?: ReactNode
24
16
 
25
- export interface TextFieldProps
26
- extends Pick<FieldLabelProps, 'label' | 'requiredText' | 'subLabel'>,
27
- DOMProps,
28
- ReactAreaUseTextFieldCompat {
29
- readonly prefix?: ReactNode
30
- readonly suffix?: ReactNode
17
+ value?: string
18
+ onChange?: (value: string) => void
31
19
 
32
- // <input> 要素は number とか string[] もありうるが、今はこれしか想定してない
33
- readonly defaultValue?: string
34
- readonly value?: string
35
- readonly onChange?: (value: string) => void
20
+ showCount?: boolean
21
+ showLabel?: boolean
22
+ assistiveText?: string
23
+ invalid?: boolean
36
24
 
37
- // react-ariaの型定義のせいでHTMLInputElementにできない
38
- readonly onKeyDown?: (event: React.KeyboardEvent<Element>) => void
39
- readonly onFocus?: (event: React.FocusEvent<Element>) => void
40
- readonly onBlur?: (event: React.FocusEvent<Element>) => void
25
+ label?: string
26
+ requiredText?: string
27
+ disabled?: boolean
28
+ subLabel?: React.ReactNode
29
+ rdfaPrefix?: string
41
30
 
42
- readonly showCount?: boolean
43
- readonly showLabel?: boolean
44
- readonly assistiveText?: string
45
- readonly invalid?: boolean
46
- }
31
+ getCount?: (value: string) => number
32
+ } & Omit<React.ComponentPropsWithoutRef<'input'>, 'prefix' | 'onChange'>
47
33
 
48
34
  const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(
49
- function SingleLineTextFieldInner({ onChange, ...props }, forwardRef) {
50
- const {
35
+ function SingleLineTextFieldInner(
36
+ {
37
+ assistiveText,
51
38
  className,
52
- showLabel = false,
53
- showCount = false,
54
- label,
55
- requiredText,
56
- subLabel,
57
39
  disabled = false,
58
- required,
59
- invalid = false,
60
- assistiveText,
40
+ label = '',
61
41
  maxLength,
42
+ onChange,
62
43
  prefix = null,
44
+ required,
45
+ requiredText,
46
+ showCount = false,
47
+ showLabel = false,
48
+ subLabel,
63
49
  suffix = null,
64
- ...restProps
65
- } = props
50
+ type = 'text',
51
+ invalid,
52
+ value,
53
+ getCount = countCodePointsInString,
54
+ ...props
55
+ },
56
+ forwardRef
57
+ ) {
58
+ const inputRef = useRef<HTMLInputElement>(null)
66
59
 
67
60
  const { visuallyHiddenProps } = useVisuallyHidden()
68
- const ariaRef = useRef<HTMLInputElement>(null)
69
- const [count, setCount] = useState(
70
- countCodePointsInString(props.value ?? '')
71
- )
72
61
 
73
- const nonControlled = props.value === undefined
62
+ const [count, setCount] = useState(getCount(value ?? ''))
63
+
74
64
  const handleChange = useCallback(
75
- (value: string) => {
76
- const count = countCodePointsInString(value)
65
+ (e: React.ChangeEvent<HTMLInputElement>) => {
66
+ const value = e.target.value
67
+ const count = getCount(value)
77
68
  if (maxLength !== undefined && count > maxLength) {
78
69
  return
79
70
  }
80
- if (nonControlled) {
81
- setCount(count)
82
- }
71
+ setCount(count)
83
72
  onChange?.(value)
84
73
  },
85
- [maxLength, nonControlled, onChange]
74
+ [getCount, maxLength, onChange]
86
75
  )
87
76
 
88
77
  useEffect(() => {
89
- setCount(countCodePointsInString(props.value ?? ''))
90
- }, [props.value])
91
-
92
- const {
93
- inputProps: ariaInputProps,
94
- labelProps,
95
- descriptionProps,
96
- errorMessageProps,
97
- } = useTextField(
98
- {
99
- inputElementType: 'input',
100
- isDisabled: disabled,
101
- isRequired: required,
102
- validationState: invalid ? 'invalid' : 'valid',
103
- description: !invalid && assistiveText,
104
- errorMessage: invalid && assistiveText,
105
- onChange: handleChange,
106
- ...props,
107
- },
108
- ariaRef
109
- )
78
+ setCount(getCount(value ?? ''))
79
+ }, [getCount, value])
110
80
 
111
81
  const containerRef = useRef(null)
112
82
 
113
- useFocusWithClick(containerRef, ariaRef)
83
+ useFocusWithClick(containerRef, inputRef)
84
+
85
+ const inputId = useId(props.id)
86
+ const describedbyId = useId()
87
+ const labelledbyId = useId()
88
+
89
+ const showAssistiveText =
90
+ assistiveText != null && assistiveText.length !== 0
114
91
 
115
- const inputProps = mergeProps(restProps, ariaInputProps)
92
+ const classNames = useClassNames('charcoal-text-field-root')
116
93
 
117
94
  return (
118
- <TextFieldRoot className={className} isDisabled={disabled}>
119
- <TextFieldLabel
95
+ <div className={classNames} aria-disabled={disabled}>
96
+ <FieldLabel
97
+ htmlFor={inputId}
98
+ id={labelledbyId}
120
99
  label={label}
121
- requiredText={requiredText}
122
100
  required={required}
101
+ requiredText={requiredText}
123
102
  subLabel={subLabel}
124
- {...labelProps}
125
103
  {...(!showLabel ? visuallyHiddenProps : {})}
126
104
  />
127
- <StyledInputContainer
128
- ref={containerRef}
129
- invalid={invalid}
105
+ <div
106
+ className="charcoal-text-field-container"
130
107
  aria-disabled={disabled === true ? true : undefined}
131
- hasPrefix={prefix != null}
132
- hasSuffix={suffix != null || showCount}
108
+ data-invalid={invalid === true}
109
+ ref={containerRef}
133
110
  >
134
- {prefix && <PrefixContainer>{prefix}</PrefixContainer>}
135
- <StyledInput
136
- ref={mergeRefs(forwardRef, ariaRef)}
137
- invalid={invalid}
138
- {...inputProps}
111
+ {prefix && <div className="charcoal-text-field-prefix">{prefix}</div>}
112
+ <input
113
+ className="charcoal-text-field-input"
114
+ aria-describedby={showAssistiveText ? describedbyId : undefined}
115
+ aria-invalid={invalid}
116
+ aria-labelledby={labelledbyId}
117
+ id={inputId}
118
+ data-invalid={invalid === true}
119
+ maxLength={maxLength}
120
+ onChange={handleChange}
121
+ disabled={disabled}
122
+ ref={mergeRefs(forwardRef, inputRef)}
123
+ type={type}
124
+ value={value}
125
+ {...props}
139
126
  />
140
127
  {(suffix || showCount) && (
141
- <SuffixContainer>
128
+ <div className="charcoal-text-field-suffix">
142
129
  {suffix}
143
130
  {showCount && (
144
- <SingleLineCounter>
131
+ <span className="charcoal-text-field-line-counter">
145
132
  {maxLength !== undefined ? `${count}/${maxLength}` : count}
146
- </SingleLineCounter>
133
+ </span>
147
134
  )}
148
- </SuffixContainer>
135
+ </div>
149
136
  )}
150
- </StyledInputContainer>
151
- {assistiveText != null && assistiveText.length !== 0 && (
152
- <AssistiveText
153
- invalid={invalid}
154
- {...(invalid ? errorMessageProps : descriptionProps)}
155
- >
137
+ </div>
138
+ {showAssistiveText && (
139
+ <AssistiveText data-invalid={invalid === true} id={describedbyId}>
156
140
  {assistiveText}
157
141
  </AssistiveText>
158
142
  )}
159
- </TextFieldRoot>
143
+ </div>
160
144
  )
161
145
  }
162
146
  )
163
147
 
164
148
  export default TextField
165
-
166
- const TextFieldRoot = styled.div<{ isDisabled: boolean }>`
167
- display: flex;
168
- flex-direction: column;
169
-
170
- ${(p) => p.isDisabled && { opacity: p.theme.elementEffect.disabled.opacity }}
171
- `
172
-
173
- export const TextFieldLabel = styled(FieldLabel)`
174
- margin-bottom: 8px;
175
- `
176
-
177
- const StyledInputContainer = styled.div<{
178
- invalid: boolean
179
- hasPrefix: boolean
180
- hasSuffix: boolean
181
- }>`
182
- display: grid;
183
- grid-template-columns: ${(p) =>
184
- [p.hasPrefix && 'auto', '1fr', p.hasSuffix && 'auto']
185
- .filter(Boolean)
186
- .join(' ')};
187
- height: 40px;
188
- transition: 0.2s background-color, 0.2s box-shadow;
189
- color: var(--charcoal-text2);
190
- background-color: var(--charcoal-surface3);
191
- border-radius: 4px;
192
- gap: 4px;
193
- padding: 0 8px;
194
- line-height: 22px;
195
- font-size: 14px;
196
-
197
- :not(:disabled):not([aria-disabled]):hover,
198
- [aria-disabled='false']:hover {
199
- background-color: var(--charcoal-surface3-hover);
200
- }
201
-
202
- :focus-within {
203
- outline: none;
204
- box-shadow: 0 0 0 4px
205
- ${(p) => (p.invalid ? `rgba(255,43,0,0.32)` : `rgba(0, 150, 250, 0.32);`)};
206
- }
207
-
208
- ${(p) =>
209
- p.invalid &&
210
- css`
211
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
212
- `}
213
- `
214
-
215
- const PrefixContainer = styled.div`
216
- display: flex;
217
- align-items: center;
218
- `
219
-
220
- const SuffixContainer = styled.span`
221
- display: flex;
222
- align-items: center;
223
- gap: 8px;
224
- `
225
-
226
- const StyledInput = styled.input<{
227
- invalid: boolean
228
- }>`
229
- border: none;
230
- box-sizing: border-box;
231
- outline: none;
232
- font-family: inherit;
233
-
234
- /* Prevent zooming for iOS Safari */
235
- transform-origin: top left;
236
- transform: scale(0.875);
237
- width: calc(100% / 0.875);
238
- height: calc(100% / 0.875);
239
- font-size: calc(14px / 0.875);
240
- line-height: calc(22px / 0.875);
241
- padding-left: 0;
242
- padding-right: 0;
243
- border-radius: calc(4px / 0.875);
244
-
245
- /* Display box-shadow for iOS Safari */
246
- appearance: none;
247
- background: transparent;
248
-
249
- color: var(--charcoal-text2);
250
- &::placeholder {
251
- color: var(--charcoal-text3);
252
- }
253
- `
254
-
255
- const SingleLineCounter = styled.span`
256
- line-height: 22px;
257
- font-size: 14px;
258
- color: var(--charcoal-text3);
259
- `
260
-
261
- export const AssistiveText = styled.p<{ invalid: boolean }>`
262
- font-size: 14px;
263
- line-height: 22px;
264
- margin-top: 4px;
265
- margin-bottom: -4px;
266
- color: ${(p) => `var(--charcoal-${p.invalid ? `assertive` : `text2`})`};
267
- `
@@ -1,39 +1,15 @@
1
1
  import * as React from 'react'
2
- import { ThemeProvider } from 'styled-components'
3
- import ComponentAbstraction, { Components } from './ComponentAbstraction'
4
- import { TokenInjector } from '@charcoal-ui/styled'
5
- import { ThemeMap } from '@charcoal-ui/styled/src/TokenInjector'
6
- import { CharcoalTheme, ThemeColor } from '@charcoal-ui/theme'
7
-
8
2
  import { OverlayProvider } from './OverlayProvider'
9
3
  import { SSRProvider } from './SSRProvider'
10
4
 
11
- export type CharcoalProviderProps = React.PropsWithChildren<{
12
- themeMap: ThemeMap<CharcoalTheme>
13
- defaultTheme?: CharcoalTheme
14
- injectTokens?: boolean
15
- components?: Partial<Components>
16
- background?: keyof ThemeColor
17
- }>
5
+ export type CharcoalProviderProps = {
6
+ children: React.ReactNode
7
+ }
18
8
 
19
- export function CharcoalProvider({
20
- themeMap,
21
- defaultTheme = themeMap[':root'],
22
- components = {},
23
- injectTokens = true,
24
- children,
25
- background,
26
- }: CharcoalProviderProps) {
9
+ export function CharcoalProvider({ children }: CharcoalProviderProps) {
27
10
  return (
28
11
  <SSRProvider>
29
- <ThemeProvider theme={defaultTheme}>
30
- {injectTokens && (
31
- <TokenInjector theme={themeMap} background={background} />
32
- )}
33
- <ComponentAbstraction components={components}>
34
- <OverlayProvider>{children}</OverlayProvider>
35
- </ComponentAbstraction>
36
- </ThemeProvider>
12
+ <OverlayProvider>{children}</OverlayProvider>
37
13
  </SSRProvider>
38
14
  )
39
15
  }
@@ -1 +1,12 @@
1
- export { SSRProvider } from '@react-aria/ssr'
1
+ import { SSRProvider as OriginSSRProvider } from '@react-aria/ssr'
2
+ import { version, Fragment } from 'react'
3
+
4
+ export function isReactVersionOver(minVersion: number): boolean {
5
+ // version history on the react side: https://github.com/facebook/react/commits/main/packages/shared/ReactVersion.js
6
+ const reactMajorVersion = parseInt(version.split('.')[0], 10)
7
+ return Number.isFinite(reactMajorVersion)
8
+ ? reactMajorVersion >= minVersion
9
+ : false
10
+ }
11
+
12
+ export const SSRProvider = isReactVersionOver(18) ? Fragment : OriginSSRProvider
package/src/index.ts CHANGED
@@ -1,8 +1,3 @@
1
- export {
2
- default as ComponentAbstraction,
3
- useComponentAbstraction,
4
- type LinkProps,
5
- } from './core/ComponentAbstraction'
6
1
  export { SSRProvider } from './core/SSRProvider'
7
2
  export { OverlayProvider } from './core/OverlayProvider'
8
3
  export {
@@ -13,24 +8,13 @@ export { default as Button, type ButtonProps } from './components/Button'
13
8
  export {
14
9
  default as Clickable,
15
10
  type ClickableProps,
16
- type ClickableElement,
17
11
  } from './components/Clickable'
18
12
  export {
19
13
  default as IconButton,
20
14
  type IconButtonProps,
21
15
  } from './components/IconButton'
22
- export {
23
- default as Radio,
24
- type RadioProps,
25
- RadioGroup,
26
- type RadioGroupProps,
27
- } from './components/Radio'
28
- export {
29
- default as MultiSelect,
30
- type MultiSelectProps,
31
- MultiSelectGroup,
32
- type MultiSelectGroupProps,
33
- } from './components/MultiSelect'
16
+ export { default as Radio, type RadioProps } from './components/Radio'
17
+ export { RadioGroup, type RadioGroupProps } from './components/Radio/RadioGroup'
34
18
  export { default as Switch, type SwitchProps } from './components/Switch'
35
19
  export {
36
20
  default as TextField,
@@ -38,7 +22,11 @@ export {
38
22
  } from './components/TextField'
39
23
  export { default as TextArea, type TextAreaProps } from './components/TextArea'
40
24
  export { default as Icon, type IconProps } from './components/Icon'
41
- export { default as Modal, type ModalProps } from './components/Modal'
25
+ export {
26
+ default as Modal,
27
+ type ModalProps,
28
+ ModalCloseButton,
29
+ } from './components/Modal'
42
30
  export {
43
31
  ModalHeader,
44
32
  ModalAlign,
package/src/type.d.ts CHANGED
@@ -1,12 +1,7 @@
1
- import { CSSProp, DefaultTheme } from 'styled-components'
2
- import { CharcoalTheme as Theme } from '@charcoal-ui/theme'
3
-
4
- declare module 'styled-components' {
5
- export interface DefaultTheme extends Theme {}
6
- }
1
+ import 'react'
7
2
 
8
3
  declare module 'react' {
9
- interface Attributes {
10
- css?: CSSProp<DefaultTheme>
4
+ interface CSSProperties {
5
+ [key: `--${string}`]: string | number
11
6
  }
12
7
  }
@@ -1,24 +0,0 @@
1
- import Button from '.';
2
- import { StoryObj } from '@storybook/react';
3
- declare const _default: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, {
4
- children?: import("react").ReactNode;
5
- variant?: ("Primary" | "Default" | "Overlay" | "Danger" | "Navigation") | undefined;
6
- size?: ("S" | "M") | undefined;
7
- fullWidth?: boolean | undefined;
8
- isActive?: boolean | undefined;
9
- as?: import("react").ElementType<any> | undefined;
10
- } & Omit<any, "children">>;
11
- export default _default;
12
- export declare const Default: StoryObj<typeof Button>;
13
- export declare const Primary: StoryObj<typeof Button>;
14
- export declare const Navigation: StoryObj<typeof Button>;
15
- export declare const Overlay: StoryObj<typeof Button>;
16
- export declare const Danger: StoryObj<typeof Button>;
17
- export declare const Small: StoryObj<typeof Button>;
18
- export declare const Fixed: StoryObj<typeof Button>;
19
- export declare const Disabled: StoryObj<typeof Button>;
20
- export declare const Active: StoryObj<typeof Button>;
21
- export declare const Link: StoryObj<typeof Button>;
22
- export declare const Nihongo: StoryObj<typeof Button>;
23
- export declare const Focus: StoryObj<typeof Button>;
24
- //# sourceMappingURL=index.story.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../src/components/Button/index.story.tsx"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,GAAG,CAAA;AACtB,OAAO,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAA;;;;;;;;;AAEjD,wBAkBwB;AAExB,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,OAAO,MAAM,CAAM,CAAA;AAElD,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,OAAO,MAAM,CAI3C,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,OAAO,MAAM,CAI9C,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,OAAO,MAAM,CAI3C,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,OAAO,MAAM,CAI1C,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,MAAM,CAIzC,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,MAAM,CAIzC,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,OAAO,MAAM,CAI5C,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,OAAO,MAAM,CAI1C,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,OAAO,MAAM,CAIxC,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,OAAO,MAAM,CAE3C,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,MAAM,CAUzC,CAAA"}
@@ -1,8 +0,0 @@
1
- import Checkbox from '.';
2
- import { StoryObj } from '@storybook/react';
3
- declare const _default: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, import(".").CheckboxProps & import("react").RefAttributes<HTMLInputElement>>;
4
- export default _default;
5
- export declare const Labelled: StoryObj<typeof Checkbox>;
6
- export declare const Invalid: StoryObj<typeof Checkbox>;
7
- export declare const Unlabelled: StoryObj<typeof Checkbox>;
8
- //# sourceMappingURL=index.story.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../src/components/Checkbox/index.story.tsx"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,GAAG,CAAA;AACxB,OAAO,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAA;;AAEjD,wBAG0B;AAE1B,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,OAAO,QAAQ,CA2C9C,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,OAAO,QAAQ,CAuB7C,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,OAAO,QAAQ,CAuBhD,CAAA"}
@@ -1,6 +0,0 @@
1
- import { StoryObj } from '@storybook/react';
2
- declare const _default: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, import(".").ClickableProps & import("react").RefAttributes<import(".").ClickableElement>>;
3
- export default _default;
4
- export declare const Button: StoryObj;
5
- export declare const Link: StoryObj;
6
- //# sourceMappingURL=index.story.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../src/components/Clickable/index.story.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAA;;AAEjD,wBAG2B;AAE3B,eAAO,MAAM,MAAM,EAAE,QAEpB,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,QAMlB,CAAA"}
@@ -1,7 +0,0 @@
1
- /**
2
- * 水平方向の直線
3
- */
4
- export declare const Divider: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {
5
- role: "separator";
6
- }, "role">;
7
- //# sourceMappingURL=Divider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Divider.d.ts","sourceRoot":"","sources":["../../../src/components/DropdownSelector/Divider.tsx"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,OAAO;;UAUnB,CAAA"}
@@ -1,7 +0,0 @@
1
- import { MenuItemProps } from './MenuItem';
2
- export type DropdownMenuItemProps = Omit<MenuItemProps<'div'>, 'as'>;
3
- /**
4
- * DropdownSelectorの選択肢として使うMenuItem
5
- */
6
- export default function DropdownMenuItem(props: DropdownMenuItemProps): JSX.Element;
7
- //# sourceMappingURL=DropdownMenuItem.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DropdownMenuItem.d.ts","sourceRoot":"","sources":["../../../src/components/DropdownSelector/DropdownMenuItem.tsx"],"names":[],"mappings":"AACA,OAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAKpD,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;AAEpE;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,eAWpE"}
@@ -1,9 +0,0 @@
1
- import ListItem from '.';
2
- import { StoryObj } from '@storybook/react';
3
- declare const _default: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, {
4
- children?: import("react").ReactNode;
5
- as?: import(".").CustomJSXElement | undefined;
6
- } & Omit<any, "children">>;
7
- export default _default;
8
- export declare const Basic: StoryObj<typeof ListItem>;
9
- //# sourceMappingURL=index.story.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.story.d.ts","sourceRoot":"","sources":["../../../../src/components/DropdownSelector/ListItem/index.story.tsx"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,GAAG,CAAA;AAExB,OAAO,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAA;;;;;AAEjD,wBAG0B;AA0C1B,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,QAAQ,CAE3C,CAAA"}