@charcoal-ui/react 4.0.0-beta.3 → 4.0.0-beta.5

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 (176) hide show
  1. package/dist/_lib/useClassNames.d.ts +2 -2
  2. package/dist/_lib/useClassNames.d.ts.map +1 -1
  3. package/dist/components/Checkbox/CheckboxInput/index.d.ts +11 -0
  4. package/dist/components/Checkbox/CheckboxInput/index.d.ts.map +1 -0
  5. package/dist/components/Checkbox/CheckboxWithLabel.d.ts +9 -0
  6. package/dist/components/Checkbox/CheckboxWithLabel.d.ts.map +1 -0
  7. package/dist/components/Checkbox/index.d.ts +12 -21
  8. package/dist/components/Checkbox/index.d.ts.map +1 -1
  9. package/dist/components/Clickable/index.d.ts +10 -13
  10. package/dist/components/Clickable/index.d.ts.map +1 -1
  11. package/dist/components/DropdownSelector/Popover/index.d.ts +1 -2
  12. package/dist/components/DropdownSelector/Popover/index.d.ts.map +1 -1
  13. package/dist/components/DropdownSelector/index.d.ts.map +1 -1
  14. package/dist/components/FieldLabel/index.d.ts +1 -0
  15. package/dist/components/FieldLabel/index.d.ts.map +1 -1
  16. package/dist/components/IconButton/index.d.ts +7 -5
  17. package/dist/components/IconButton/index.d.ts.map +1 -1
  18. package/dist/components/LoadingSpinner/index.d.ts +1 -0
  19. package/dist/components/LoadingSpinner/index.d.ts.map +1 -1
  20. package/dist/components/Modal/Dialog/index.d.ts +6 -24
  21. package/dist/components/Modal/Dialog/index.d.ts.map +1 -1
  22. package/dist/components/Modal/ModalPlumbing.d.ts +10 -3
  23. package/dist/components/Modal/ModalPlumbing.d.ts.map +1 -1
  24. package/dist/components/Modal/index.d.ts +2 -2
  25. package/dist/components/Modal/index.d.ts.map +1 -1
  26. package/dist/components/Modal/useCustomModalOverlay.d.ts.map +1 -1
  27. package/dist/components/Radio/index.d.ts +6 -8
  28. package/dist/components/Radio/index.d.ts.map +1 -1
  29. package/dist/components/SegmentedControl/index.d.ts +1 -0
  30. package/dist/components/SegmentedControl/index.d.ts.map +1 -1
  31. package/dist/components/Switch/SwitchInput/index.d.ts +9 -0
  32. package/dist/components/Switch/SwitchInput/index.d.ts.map +1 -0
  33. package/dist/components/Switch/SwitchWithLabel.d.ts +9 -0
  34. package/dist/components/Switch/SwitchWithLabel.d.ts.map +1 -0
  35. package/dist/components/Switch/index.d.ts +4 -15
  36. package/dist/components/Switch/index.d.ts.map +1 -1
  37. package/dist/components/TagItem/index.d.ts +14 -15
  38. package/dist/components/TagItem/index.d.ts.map +1 -1
  39. package/dist/components/TextArea/index.d.ts +28 -18
  40. package/dist/components/TextArea/index.d.ts.map +1 -1
  41. package/dist/components/TextField/index.d.ts +32 -19
  42. package/dist/components/TextField/index.d.ts.map +1 -1
  43. package/dist/core/CharcoalProvider.d.ts +1 -1
  44. package/dist/core/CharcoalProvider.d.ts.map +1 -1
  45. package/dist/index.cjs.js +456 -1079
  46. package/dist/index.cjs.js.map +1 -1
  47. package/dist/index.css +790 -0
  48. package/dist/index.css.map +1 -1
  49. package/dist/index.d.ts +1 -2
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.esm.js +454 -1075
  52. package/dist/index.esm.js.map +1 -1
  53. package/dist/styled.d.ts +4 -4
  54. package/package.json +17 -19
  55. package/src/_lib/useClassNames.ts +3 -9
  56. package/src/components/Checkbox/CheckboxInput/__snapshots__/index.story.storyshot +77 -0
  57. package/src/components/Checkbox/CheckboxInput/index.css +111 -0
  58. package/src/components/Checkbox/CheckboxInput/index.story.tsx +51 -0
  59. package/src/components/Checkbox/CheckboxInput/index.tsx +47 -0
  60. package/src/components/Checkbox/CheckboxWithLabel.tsx +24 -0
  61. package/src/components/Checkbox/__snapshots__/index.story.storyshot +103 -538
  62. package/src/components/Checkbox/index.css +21 -0
  63. package/src/components/Checkbox/index.story.tsx +48 -78
  64. package/src/components/Checkbox/index.tsx +32 -162
  65. package/src/components/Clickable/__snapshots__/index.story.storyshot +2 -78
  66. package/src/components/Clickable/index.css +41 -0
  67. package/src/components/Clickable/index.story.tsx +1 -1
  68. package/src/components/Clickable/index.tsx +25 -85
  69. package/src/components/DropdownSelector/ListItem/__snapshots__/index.story.storyshot +10 -135
  70. package/src/components/DropdownSelector/Popover/index.tsx +1 -2
  71. package/src/components/DropdownSelector/__snapshots__/index.story.storyshot +308 -1014
  72. package/src/components/DropdownSelector/index.tsx +9 -38
  73. package/src/components/FieldLabel/index.css +35 -0
  74. package/src/components/FieldLabel/index.tsx +15 -105
  75. package/src/components/IconButton/__snapshots__/index.story.storyshot +18 -296
  76. package/src/components/IconButton/index.css +118 -0
  77. package/src/components/IconButton/index.story.tsx +16 -39
  78. package/src/components/IconButton/index.tsx +41 -118
  79. package/src/components/LoadingSpinner/__snapshots__/LoadingSpinnerIcon.story.storyshot +2 -17
  80. package/src/components/LoadingSpinner/__snapshots__/index.story.storyshot +79 -29
  81. package/src/components/LoadingSpinner/index.css +42 -0
  82. package/src/components/LoadingSpinner/index.story.tsx +18 -7
  83. package/src/components/LoadingSpinner/index.tsx +26 -52
  84. package/src/components/Modal/Dialog/index.css +44 -0
  85. package/src/components/Modal/Dialog/index.tsx +13 -57
  86. package/src/components/Modal/ModalPlumbing.css +40 -0
  87. package/src/components/Modal/ModalPlumbing.tsx +22 -61
  88. package/src/components/Modal/__snapshots__/index.story.storyshot +459 -1881
  89. package/src/components/Modal/index.css +36 -0
  90. package/src/components/Modal/index.tsx +27 -74
  91. package/src/components/Modal/useCustomModalOverlay.tsx +5 -4
  92. package/src/components/Radio/__snapshots__/index.story.storyshot +51 -776
  93. package/src/components/Radio/index.css +97 -0
  94. package/src/components/Radio/index.story.tsx +20 -30
  95. package/src/components/Radio/index.test.tsx +0 -1
  96. package/src/components/Radio/index.tsx +60 -170
  97. package/src/components/SegmentedControl/__snapshots__/index.story.storyshot +30 -260
  98. package/src/components/SegmentedControl/index.css +50 -0
  99. package/src/components/SegmentedControl/index.tsx +20 -89
  100. package/src/components/Switch/SwitchInput/index.css +82 -0
  101. package/src/components/Switch/SwitchInput/index.tsx +40 -0
  102. package/src/components/Switch/SwitchWithLabel.tsx +24 -0
  103. package/src/components/Switch/__snapshots__/index.story.storyshot +34 -538
  104. package/src/components/Switch/index.css +23 -0
  105. package/src/components/Switch/index.story.tsx +15 -18
  106. package/src/components/Switch/index.tsx +43 -140
  107. package/src/components/TagItem/__snapshots__/index.story.storyshot +212 -1063
  108. package/src/components/TagItem/index.css +140 -0
  109. package/src/components/TagItem/index.story.tsx +44 -161
  110. package/src/components/TagItem/index.tsx +76 -220
  111. package/src/components/TextArea/TextArea.story.tsx +62 -24
  112. package/src/components/TextArea/__snapshots__/TextArea.story.storyshot +1024 -792
  113. package/src/components/TextArea/index.tsx +68 -89
  114. package/src/components/TextField/TextField.story.tsx +77 -67
  115. package/src/components/TextField/__snapshots__/TextField.story.storyshot +1152 -1274
  116. package/src/components/TextField/index.tsx +77 -103
  117. package/src/components/a11y.test.tsx +1 -1
  118. package/src/core/CharcoalProvider.tsx +1 -1
  119. package/src/index.ts +0 -7
  120. package/src/type.d.ts +6 -0
  121. package/dist/components/Button/index.story.d.ts +0 -22
  122. package/dist/components/Button/index.story.d.ts.map +0 -1
  123. package/dist/components/Button/index.test.d.ts +0 -2
  124. package/dist/components/Button/index.test.d.ts.map +0 -1
  125. package/dist/components/Checkbox/index.story.d.ts +0 -8
  126. package/dist/components/Checkbox/index.story.d.ts.map +0 -1
  127. package/dist/components/Clickable/index.story.d.ts +0 -6
  128. package/dist/components/Clickable/index.story.d.ts.map +0 -1
  129. package/dist/components/DropdownSelector/ListItem/index.story.d.ts +0 -9
  130. package/dist/components/DropdownSelector/ListItem/index.story.d.ts.map +0 -1
  131. package/dist/components/DropdownSelector/MenuList/index.story.d.ts +0 -8
  132. package/dist/components/DropdownSelector/MenuList/index.story.d.ts.map +0 -1
  133. package/dist/components/DropdownSelector/Popover/index.story.d.ts +0 -5
  134. package/dist/components/DropdownSelector/Popover/index.story.d.ts.map +0 -1
  135. package/dist/components/DropdownSelector/index.story.d.ts +0 -19
  136. package/dist/components/DropdownSelector/index.story.d.ts.map +0 -1
  137. package/dist/components/Icon/index.story.d.ts +0 -6
  138. package/dist/components/Icon/index.story.d.ts.map +0 -1
  139. package/dist/components/IconButton/index.story.d.ts +0 -9
  140. package/dist/components/IconButton/index.story.d.ts.map +0 -1
  141. package/dist/components/LoadingSpinner/LoadingSpinnerIcon.story.d.ts +0 -8
  142. package/dist/components/LoadingSpinner/LoadingSpinnerIcon.story.d.ts.map +0 -1
  143. package/dist/components/LoadingSpinner/index.story.d.ts +0 -6
  144. package/dist/components/LoadingSpinner/index.story.d.ts.map +0 -1
  145. package/dist/components/Modal/index.story.d.ts +0 -21
  146. package/dist/components/Modal/index.story.d.ts.map +0 -1
  147. package/dist/components/MultiSelect/context.d.ts +0 -14
  148. package/dist/components/MultiSelect/context.d.ts.map +0 -1
  149. package/dist/components/MultiSelect/index.d.ts +0 -36
  150. package/dist/components/MultiSelect/index.d.ts.map +0 -1
  151. package/dist/components/MultiSelect/index.story.d.ts +0 -82
  152. package/dist/components/MultiSelect/index.story.d.ts.map +0 -1
  153. package/dist/components/MultiSelect/index.test.d.ts +0 -2
  154. package/dist/components/MultiSelect/index.test.d.ts.map +0 -1
  155. package/dist/components/Radio/index.story.d.ts +0 -26
  156. package/dist/components/Radio/index.story.d.ts.map +0 -1
  157. package/dist/components/Radio/index.test.d.ts +0 -2
  158. package/dist/components/Radio/index.test.d.ts.map +0 -1
  159. package/dist/components/SegmentedControl/index.story.d.ts +0 -7
  160. package/dist/components/SegmentedControl/index.story.d.ts.map +0 -1
  161. package/dist/components/Switch/index.story.d.ts +0 -9
  162. package/dist/components/Switch/index.story.d.ts.map +0 -1
  163. package/dist/components/TagItem/index.story.d.ts +0 -16
  164. package/dist/components/TagItem/index.story.d.ts.map +0 -1
  165. package/dist/components/TextArea/TextArea.story.d.ts +0 -9
  166. package/dist/components/TextArea/TextArea.story.d.ts.map +0 -1
  167. package/dist/components/TextField/TextField.story.d.ts +0 -22
  168. package/dist/components/TextField/TextField.story.d.ts.map +0 -1
  169. package/dist/components/a11y.test.d.ts +0 -2
  170. package/dist/components/a11y.test.d.ts.map +0 -1
  171. package/src/components/LoadingSpinner/LoadingSpinnerIcon.story.tsx +0 -13
  172. package/src/components/MultiSelect/__snapshots__/index.story.storyshot +0 -1066
  173. package/src/components/MultiSelect/context.ts +0 -23
  174. package/src/components/MultiSelect/index.story.tsx +0 -216
  175. package/src/components/MultiSelect/index.test.tsx +0 -263
  176. package/src/components/MultiSelect/index.tsx +0 -281
@@ -1,281 +0,0 @@
1
- import { ChangeEvent, useCallback, useContext, forwardRef, memo } from 'react'
2
- import * as React from 'react'
3
- import styled, { css } from 'styled-components'
4
- import warning from 'warning'
5
- import { px } from '@charcoal-ui/utils'
6
-
7
- import { MultiSelectGroupContext } from './context'
8
- import { focusVisibleFocusRingCss } from '@charcoal-ui/styled'
9
-
10
- export type MultiSelectProps = React.PropsWithChildren<{
11
- value: string
12
- disabled?: boolean
13
- variant?: 'default' | 'overlay'
14
- className?: string
15
- onChange?: (payload: { value: string; selected: boolean }) => void
16
- }>
17
-
18
- const MultiSelect = forwardRef<HTMLInputElement, MultiSelectProps>(
19
- function MultiSelectInner(
20
- {
21
- value,
22
- disabled = false,
23
- onChange,
24
- variant = 'default',
25
- className,
26
- children,
27
- },
28
- ref
29
- ) {
30
- const {
31
- name,
32
- selected,
33
- disabled: parentDisabled,
34
- readonly,
35
- invalid,
36
- onChange: parentOnChange,
37
- } = useContext(MultiSelectGroupContext)
38
-
39
- warning(
40
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
41
- name !== undefined,
42
- `"name" is not Provided for <MultiSelect>. Perhaps you forgot to wrap with <MultiSelectGroup> ?`
43
- )
44
-
45
- const isSelected = selected.includes(value)
46
- const isDisabled = disabled || parentDisabled || readonly
47
-
48
- const handleChange = useCallback(
49
- (event: ChangeEvent<HTMLInputElement>) => {
50
- if (!(event.currentTarget instanceof HTMLInputElement)) {
51
- return
52
- }
53
- if (onChange) onChange({ value, selected: event.currentTarget.checked })
54
- parentOnChange({ value, selected: event.currentTarget.checked })
55
- },
56
- [onChange, parentOnChange, value]
57
- )
58
-
59
- return (
60
- <MultiSelectRoot aria-disabled={isDisabled} className={className}>
61
- <MultiSelectInput
62
- {...{
63
- name,
64
- value,
65
- invalid,
66
- }}
67
- checked={isSelected}
68
- disabled={isDisabled}
69
- onChange={handleChange}
70
- overlay={variant === 'overlay'}
71
- aria-invalid={invalid}
72
- ref={ref}
73
- />
74
- <MultiSelectInputOverlay
75
- overlay={variant === 'overlay'}
76
- invalid={invalid}
77
- aria-hidden={true}
78
- >
79
- <pixiv-icon name="24/Check" unsafe-non-guideline-scale={16 / 24} />
80
- </MultiSelectInputOverlay>
81
- {Boolean(children) && <MultiSelectLabel>{children}</MultiSelectLabel>}
82
- </MultiSelectRoot>
83
- )
84
- }
85
- )
86
-
87
- export default memo(MultiSelect)
88
-
89
- const MultiSelectRoot = styled.label`
90
- display: grid;
91
- grid-template-columns: auto 1fr;
92
- align-items: center;
93
- position: relative;
94
- cursor: pointer;
95
- gap: ${({ theme }) => px(theme.spacing[4])};
96
- &:disabled,
97
- &[aria-disabled]:not([aria-disabled='false']) {
98
- opacity: 0.32;
99
- cursor: default;
100
- }
101
- `
102
-
103
- const MultiSelectLabel = styled.div`
104
- display: flex;
105
- align-items: center;
106
- font-size: 14px;
107
- line-height: 22px;
108
- display: flow-root;
109
- color: var(--charcoal-text2);
110
-
111
- &::before {
112
- display: block;
113
- width: 0;
114
- height: 0;
115
- content: '';
116
- margin-top: -4px;
117
- }
118
- &::after {
119
- display: block;
120
- width: 0;
121
- height: 0;
122
- content: '';
123
- margin-bottom: -4px;
124
- }
125
- `
126
-
127
- const MultiSelectInput = styled.input.attrs({ type: 'checkbox' })<{
128
- invalid: boolean
129
- overlay: boolean
130
- }>`
131
- &[type='checkbox'] {
132
- appearance: none;
133
- display: block;
134
- width: 20px;
135
- height: 20px;
136
- margin: 0;
137
- background-color: var(--charcoal-text3);
138
- border-radius: 999999px;
139
- transition: 0.2s background-color, 0.2s box-shadow;
140
-
141
- &:checked {
142
- background-color: var(--charcoal-brand);
143
- &:hover {
144
- &:not(:disabled):not([aria-disabled]),
145
- &[aria-disabled='false'] {
146
- background-color: var(--charcoal-brand-hover);
147
- }
148
- }
149
-
150
- &:active {
151
- &:not(:disabled):not([aria-disabled]),
152
- &[aria-disabled='false'] {
153
- background-color: var(--charcoal-brand-press);
154
- }
155
- }
156
- }
157
-
158
- &:hover {
159
- &:not(:disabled):not([aria-disabled]),
160
- &[aria-disabled='false'] {
161
- background-color: var(--charcoal-text3-hover);
162
- }
163
- }
164
-
165
- &:active {
166
- &:not(:disabled):not([aria-disabled]),
167
- &[aria-disabled='false'] {
168
- background-color: var(--charcoal-text3-press);
169
- }
170
- }
171
-
172
- ${focusVisibleFocusRingCss}
173
-
174
- ${({ invalid, overlay }) =>
175
- invalid &&
176
- !overlay &&
177
- css`
178
- &:not(:disabled):not([aria-disabled]),
179
- &[aria-disabled='false'] {
180
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
181
- }
182
- `}
183
- ${({ overlay }) =>
184
- overlay &&
185
- css`
186
- background-color: var(--charcoal-surface4);
187
- `}
188
- }
189
- `
190
-
191
- const MultiSelectInputOverlay = styled.div<{
192
- overlay: boolean
193
- invalid: boolean
194
- }>`
195
- position: absolute;
196
- top: -2px;
197
- left: -2px;
198
- box-sizing: border-box;
199
- display: flex;
200
- align-items: center;
201
- justify-content: center;
202
- width: 24px;
203
- height: 24px;
204
- border-radius: 999999px;
205
- color: var(--charcoal-text5);
206
- transition: 0.2s box-shadow;
207
- ${({ invalid, overlay }) =>
208
- invalid &&
209
- overlay &&
210
- css`
211
- &:not(:disabled):not([aria-disabled]),
212
- &[aria-disabled='false'] {
213
- box-shadow: 0 0 0 4px rgba(255, 43, 0, 0.32);
214
- }
215
- `}
216
-
217
- ${({ overlay }) =>
218
- overlay &&
219
- css`
220
- border-color: var(--charcoal-text5);
221
- border-width: 2px;
222
- border-style: solid;
223
- `}
224
- `
225
-
226
- export type MultiSelectGroupProps = React.PropsWithChildren<{
227
- className?: string
228
- name: string
229
- label: string
230
- selected: string[]
231
- onChange: (selected: string[]) => void
232
- disabled?: boolean
233
- readonly?: boolean
234
- invalid?: boolean
235
- }>
236
-
237
- export function MultiSelectGroup({
238
- className,
239
- name,
240
- label,
241
- selected,
242
- onChange,
243
- disabled = false,
244
- readonly = false,
245
- invalid = false,
246
- children,
247
- }: MultiSelectGroupProps) {
248
- const handleChange = useCallback(
249
- (payload: { value: string; selected: boolean }) => {
250
- const index = selected.indexOf(payload.value)
251
-
252
- if (payload.selected) {
253
- if (index < 0) {
254
- onChange([...selected, payload.value])
255
- }
256
- } else {
257
- if (index >= 0) {
258
- onChange([...selected.slice(0, index), ...selected.slice(index + 1)])
259
- }
260
- }
261
- },
262
- [onChange, selected]
263
- )
264
-
265
- return (
266
- <MultiSelectGroupContext.Provider
267
- value={{
268
- name,
269
- selected: Array.from(new Set(selected)),
270
- disabled,
271
- readonly,
272
- invalid,
273
- onChange: handleChange,
274
- }}
275
- >
276
- <div className={className} aria-label={label} data-testid="SelectGroup">
277
- {children}
278
- </div>
279
- </MultiSelectGroupContext.Provider>
280
- )
281
- }