@dxc-technology/halstack-react 8.0.0 → 9.0.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.
- package/HalstackContext.js +94 -45
- package/accordion/Accordion.js +7 -13
- package/accordion/Accordion.stories.tsx +102 -13
- package/alert/Alert.stories.tsx +28 -0
- package/box/Box.js +1 -3
- package/box/Box.stories.tsx +15 -0
- package/button/Button.js +11 -13
- package/button/Button.stories.tsx +150 -8
- package/checkbox/Checkbox.stories.tsx +52 -0
- package/chip/Chip.js +16 -22
- package/chip/Chip.stories.tsx +96 -9
- package/common/variables.js +280 -288
- package/date-input/Calendar.d.ts +1 -1
- package/date-input/Calendar.js +43 -43
- package/date-input/DateInput.js +74 -32
- package/date-input/DateInput.stories.tsx +183 -30
- package/date-input/DateInput.test.js +120 -37
- package/date-input/DatePicker.js +38 -52
- package/date-input/Icons.d.ts +6 -0
- package/date-input/Icons.js +75 -0
- package/date-input/YearPicker.d.ts +1 -1
- package/date-input/YearPicker.js +23 -12
- package/date-input/types.d.ts +6 -8
- package/dialog/Dialog.js +60 -73
- package/dialog/Dialog.stories.tsx +211 -159
- package/dialog/Dialog.test.js +301 -2
- package/dropdown/Dropdown.js +3 -6
- package/dropdown/Dropdown.stories.tsx +210 -84
- package/dropdown/DropdownMenu.js +8 -18
- package/dropdown/DropdownMenuItem.js +4 -15
- package/file-input/FileInput.js +3 -6
- package/file-input/FileInput.stories.tsx +85 -2
- package/file-input/FileInput.test.js +0 -41
- package/file-input/FileItem.js +1 -0
- package/footer/Footer.stories.tsx +91 -0
- package/header/Header.js +18 -20
- package/header/Header.stories.tsx +149 -6
- package/link/Link.stories.tsx +60 -0
- package/main.d.ts +1 -1
- package/main.js +1 -1
- package/{tabs-nav → nav-tabs}/NavTabs.js +1 -1
- package/{tabs-nav → nav-tabs}/NavTabs.stories.tsx +96 -6
- package/{tabs-nav → nav-tabs}/Tab.js +35 -15
- package/package.json +1 -1
- package/paginator/Icons.d.ts +5 -0
- package/paginator/Icons.js +16 -28
- package/paginator/Paginator.js +5 -11
- package/paginator/Paginator.stories.tsx +24 -0
- package/paginator/Paginator.test.js +17 -10
- package/progress-bar/ProgressBar.js +4 -4
- package/progress-bar/ProgressBar.stories.jsx +35 -2
- package/quick-nav/QuickNav.stories.tsx +14 -0
- package/radio-group/RadioGroup.stories.tsx +131 -18
- package/resultsetTable/ResultsetTable.test.js +17 -22
- package/select/Listbox.d.ts +1 -1
- package/select/Listbox.js +5 -34
- package/select/Option.js +11 -24
- package/select/Select.js +43 -24
- package/select/Select.stories.tsx +492 -145
- package/select/Select.test.js +17 -22
- package/select/types.d.ts +2 -2
- package/sidenav/Sidenav.js +8 -10
- package/sidenav/Sidenav.stories.tsx +148 -46
- package/slider/Slider.js +4 -4
- package/slider/Slider.stories.tsx +57 -0
- package/spinner/Spinner.js +2 -2
- package/spinner/Spinner.stories.jsx +27 -1
- package/switch/Switch.js +1 -1
- package/switch/Switch.stories.tsx +33 -0
- package/table/Table.stories.jsx +80 -1
- package/tabs/Tab.js +3 -5
- package/tabs/Tabs.js +3 -3
- package/tabs/Tabs.stories.tsx +45 -5
- package/tag/Tag.stories.tsx +14 -1
- package/text-input/Suggestion.js +32 -5
- package/text-input/TextInput.js +7 -11
- package/text-input/TextInput.stories.tsx +92 -4
- package/text-input/TextInput.test.js +125 -25
- package/textarea/Textarea.stories.jsx +60 -1
- package/toggle-group/ToggleGroup.stories.tsx +42 -0
- package/utils/FocusLock.d.ts +13 -0
- package/utils/FocusLock.js +139 -0
- package/wizard/Wizard.stories.tsx +20 -0
- /package/{tabs-nav → nav-tabs}/NavTabs.d.ts +0 -0
- /package/{tabs-nav → nav-tabs}/NavTabs.test.js +0 -0
- /package/{tabs-nav → nav-tabs}/Tab.d.ts +0 -0
- /package/{tabs-nav → nav-tabs}/types.d.ts +0 -0
- /package/{tabs-nav → nav-tabs}/types.js +0 -0
|
@@ -4,10 +4,11 @@ import DxcDropdown from "./Dropdown";
|
|
|
4
4
|
import Title from "../../.storybook/components/Title";
|
|
5
5
|
import ExampleContainer from "../../.storybook/components/ExampleContainer";
|
|
6
6
|
import DropdownMenu from "./DropdownMenu";
|
|
7
|
-
import DxcCheckbox from "../checkbox/Checkbox";
|
|
8
|
-
import DxcTextInput from "../text-input/TextInput";
|
|
9
7
|
import { Option } from "./types";
|
|
10
|
-
|
|
8
|
+
import useTheme from "../useTheme";
|
|
9
|
+
import DxcFlex from "../flex/Flex";
|
|
10
|
+
import { HalstackProvider } from "../HalstackContext";
|
|
11
|
+
import { ThemeProvider } from "styled-components";
|
|
11
12
|
|
|
12
13
|
export default {
|
|
13
14
|
title: "Dropdown",
|
|
@@ -20,20 +21,14 @@ const hamburguerIcon = (
|
|
|
20
21
|
</svg>
|
|
21
22
|
);
|
|
22
23
|
const iconSVG = (
|
|
23
|
-
<svg viewBox="0 0 24 24" fill="currentColor">
|
|
24
|
+
<svg viewBox="0 0 24 24" height="24" width="24" fill="currentColor">
|
|
24
25
|
<path d="M0 0h24v24H0z" fill="none" />
|
|
25
26
|
<path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" />
|
|
26
27
|
</svg>
|
|
27
28
|
);
|
|
28
29
|
const iconSVGLarge = (
|
|
29
|
-
<svg
|
|
30
|
-
<
|
|
31
|
-
<path d="M0,0h24v24H0V0z" fill="none" />
|
|
32
|
-
<path d="M0,0h24v24H0V0z" fill="none" />
|
|
33
|
-
</g>
|
|
34
|
-
<g>
|
|
35
|
-
<path d="M12,17.27L18.18,21l-1.64-7.03L22,9.24l-7.19-0.61L12,2L9.19,8.63L2,9.24l5.46,4.73L5.82,21L12,17.27z" />
|
|
36
|
-
</g>
|
|
30
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" height="48" width="48">
|
|
31
|
+
<path d="M11 44q-1.2 0-2.1-.9Q8 42.2 8 41V15q0-1.2.9-2.1.9-.9 2.1-.9h5.5v-.5q0-3.15 2.175-5.325Q20.85 4 24 4q3.15 0 5.325 2.175Q31.5 8.35 31.5 11.5v.5H37q1.2 0 2.1.9.9.9.9 2.1v26q0 1.2-.9 2.1-.9.9-2.1.9Zm0-3h26V15h-5.5v4.5q0 .65-.425 1.075Q30.65 21 30 21q-.65 0-1.075-.425-.425-.425-.425-1.075V15h-9v4.5q0 .65-.425 1.075Q18.65 21 18 21q-.65 0-1.075-.425-.425-.425-.425-1.075V15H11v26Zm8.5-29h9v-.5q0-1.9-1.3-3.2Q25.9 7 24 7q-1.9 0-3.2 1.3-1.3 1.3-1.3 3.2ZM11 41V15v26Z" />
|
|
37
32
|
</svg>
|
|
38
33
|
);
|
|
39
34
|
const iconUrl = "https://iconape.com/wp-content/files/yd/367773/svg/logo-linkedin-logo-icon-png-svg.png";
|
|
@@ -60,6 +55,18 @@ const defaultOptions: Option[] = [
|
|
|
60
55
|
value: "5",
|
|
61
56
|
label: "Aliexpress",
|
|
62
57
|
},
|
|
58
|
+
{
|
|
59
|
+
value: "6",
|
|
60
|
+
label: "Etsy",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
value: "7",
|
|
64
|
+
label: "Alibaba",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
value: "8",
|
|
68
|
+
label: "Gearbest shop",
|
|
69
|
+
},
|
|
63
70
|
];
|
|
64
71
|
const options: Option[] = [
|
|
65
72
|
{
|
|
@@ -85,7 +92,15 @@ const optionWithIcon: Option[] = [
|
|
|
85
92
|
|
|
86
93
|
const optionsIcon: any = options.map((op, i) => ({ ...op, icon: icons[i] }));
|
|
87
94
|
|
|
88
|
-
|
|
95
|
+
const opinionatedTheme = {
|
|
96
|
+
dropdown: {
|
|
97
|
+
baseColor: "#ffffff",
|
|
98
|
+
fontColor: "#000000",
|
|
99
|
+
optionFontColor: "#000000",
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const Dropdown = () => (
|
|
89
104
|
<>
|
|
90
105
|
<ExampleContainer>
|
|
91
106
|
<Title title="Default" theme="light" level={4} />
|
|
@@ -134,9 +149,18 @@ export const Chromatic = () => (
|
|
|
134
149
|
<DxcDropdown options={options} onSelectOption={(value) => {}} icon={hamburguerIcon} caretHidden />
|
|
135
150
|
</ExampleContainer>
|
|
136
151
|
<ExampleContainer>
|
|
137
|
-
<Title title="Large icon" theme="light" level={4} />
|
|
152
|
+
<Title title="Large icon (SVG)" theme="light" level={4} />
|
|
138
153
|
<DxcDropdown label="Large icon" options={options} onSelectOption={(value) => {}} icon={iconSVGLarge} />
|
|
139
154
|
</ExampleContainer>
|
|
155
|
+
<ExampleContainer>
|
|
156
|
+
<Title title="Large icon (image)" theme="light" level={4} />
|
|
157
|
+
<DxcDropdown
|
|
158
|
+
label="Large icon"
|
|
159
|
+
options={options}
|
|
160
|
+
onSelectOption={(value) => {}}
|
|
161
|
+
icon="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Hamburger_icon.svg/2048px-Hamburger_icon.svg.png"
|
|
162
|
+
/>
|
|
163
|
+
</ExampleContainer>
|
|
140
164
|
<ExampleContainer>
|
|
141
165
|
<Title title="Disabled with icon" theme="light" level={4} />
|
|
142
166
|
<DxcDropdown
|
|
@@ -219,94 +243,196 @@ export const Chromatic = () => (
|
|
|
219
243
|
size="fillParent"
|
|
220
244
|
/>
|
|
221
245
|
</ExampleContainer>
|
|
246
|
+
<ExampleContainer expanded>
|
|
247
|
+
<Title title="Opened menu" theme="light" level={4} />
|
|
248
|
+
<DxcDropdown label="Label" options={options} onSelectOption={(value) => {}} margin={{ top: "xxlarge" }} />
|
|
249
|
+
</ExampleContainer>
|
|
222
250
|
</>
|
|
223
251
|
);
|
|
224
252
|
|
|
225
|
-
const DropdownListStates = () =>
|
|
253
|
+
const DropdownListStates = () => {
|
|
254
|
+
const colorsTheme: any = useTheme();
|
|
255
|
+
|
|
256
|
+
return (
|
|
257
|
+
<>
|
|
258
|
+
<Title title="Dropdown Menu" theme="light" level={2} />
|
|
259
|
+
<ExampleContainer>
|
|
260
|
+
<Title
|
|
261
|
+
title="List dialog uses a Radix Popover to appear over elements with a certain z-index"
|
|
262
|
+
theme="light"
|
|
263
|
+
level={3}
|
|
264
|
+
/>
|
|
265
|
+
<div
|
|
266
|
+
style={{
|
|
267
|
+
position: "relative",
|
|
268
|
+
display: "flex",
|
|
269
|
+
flexDirection: "column",
|
|
270
|
+
gap: "20px",
|
|
271
|
+
height: "150px",
|
|
272
|
+
width: "min-content",
|
|
273
|
+
marginBottom: "100px",
|
|
274
|
+
padding: "20px",
|
|
275
|
+
border: "1px solid black",
|
|
276
|
+
borderRadius: "4px",
|
|
277
|
+
overflow: "auto",
|
|
278
|
+
zIndex: "1300",
|
|
279
|
+
}}
|
|
280
|
+
>
|
|
281
|
+
<DxcDropdown
|
|
282
|
+
label="Select a platform"
|
|
283
|
+
options={defaultOptions}
|
|
284
|
+
onSelectOption={(option) => {}}
|
|
285
|
+
size="medium"
|
|
286
|
+
/>
|
|
287
|
+
<button style={{ zIndex: "1", width: "100px" }}>Submit</button>
|
|
288
|
+
</div>
|
|
289
|
+
</ExampleContainer>
|
|
290
|
+
<ThemeProvider theme={colorsTheme.dropdown}>
|
|
291
|
+
<Title title="Option states" theme="light" level={3} />
|
|
292
|
+
<ExampleContainer pseudoState="pseudo-hover">
|
|
293
|
+
<Title title="Hovered option" theme="light" level={4} />
|
|
294
|
+
<DropdownMenu
|
|
295
|
+
id="x"
|
|
296
|
+
dropdownTriggerId="dtx"
|
|
297
|
+
iconsPosition="before"
|
|
298
|
+
visualFocusIndex={-1}
|
|
299
|
+
menuItemOnClick={(value) => {}}
|
|
300
|
+
onKeyDown={(e) => {}}
|
|
301
|
+
options={optionWithIcon}
|
|
302
|
+
styles={{ width: 240 }}
|
|
303
|
+
/>
|
|
304
|
+
</ExampleContainer>
|
|
305
|
+
<ExampleContainer pseudoState="pseudo-active">
|
|
306
|
+
<Title title="Active option" theme="light" level={4} />
|
|
307
|
+
<DropdownMenu
|
|
308
|
+
id="x"
|
|
309
|
+
dropdownTriggerId="dtx"
|
|
310
|
+
iconsPosition="before"
|
|
311
|
+
visualFocusIndex={-1}
|
|
312
|
+
menuItemOnClick={(value) => {}}
|
|
313
|
+
onKeyDown={(e) => {}}
|
|
314
|
+
options={optionWithIcon}
|
|
315
|
+
styles={{ width: 240 }}
|
|
316
|
+
/>
|
|
317
|
+
</ExampleContainer>
|
|
318
|
+
<ExampleContainer>
|
|
319
|
+
<Title title="Focused option" theme="light" level={4} />
|
|
320
|
+
<DropdownMenu
|
|
321
|
+
id="x"
|
|
322
|
+
dropdownTriggerId="dtx"
|
|
323
|
+
iconsPosition="before"
|
|
324
|
+
visualFocusIndex={0}
|
|
325
|
+
menuItemOnClick={(value) => {}}
|
|
326
|
+
onKeyDown={(e) => {}}
|
|
327
|
+
options={options}
|
|
328
|
+
styles={{ width: 240 }}
|
|
329
|
+
/>
|
|
330
|
+
</ExampleContainer>
|
|
331
|
+
<Title title="Icons" theme="light" level={3} />
|
|
332
|
+
<ExampleContainer>
|
|
333
|
+
<Title title="Before" theme="light" level={4} />
|
|
334
|
+
<DropdownMenu
|
|
335
|
+
id="x"
|
|
336
|
+
dropdownTriggerId="dtx"
|
|
337
|
+
iconsPosition="before"
|
|
338
|
+
visualFocusIndex={-1}
|
|
339
|
+
menuItemOnClick={(value) => {}}
|
|
340
|
+
onKeyDown={(e) => {}}
|
|
341
|
+
options={optionsIcon}
|
|
342
|
+
styles={{ width: 240 }}
|
|
343
|
+
/>
|
|
344
|
+
<Title title="After" theme="light" level={4} />
|
|
345
|
+
<DropdownMenu
|
|
346
|
+
id="x"
|
|
347
|
+
dropdownTriggerId="dtx"
|
|
348
|
+
iconsPosition="after"
|
|
349
|
+
visualFocusIndex={-1}
|
|
350
|
+
menuItemOnClick={(value) => {}}
|
|
351
|
+
onKeyDown={(e) => {}}
|
|
352
|
+
options={optionsIcon}
|
|
353
|
+
styles={{ width: 240 }}
|
|
354
|
+
/>
|
|
355
|
+
</ExampleContainer>
|
|
356
|
+
</ThemeProvider>
|
|
357
|
+
</>
|
|
358
|
+
);
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
const DropdownRightAlignment = () => (
|
|
362
|
+
<ExampleContainer expanded>
|
|
363
|
+
<Title title="Dropdown collisions on the right boundary (right)" theme="light" level={4} />
|
|
364
|
+
<DxcFlex justifyContent="flex-end">
|
|
365
|
+
<DxcDropdown label="Label" options={options} onSelectOption={(value) => {}} />
|
|
366
|
+
</DxcFlex>
|
|
367
|
+
</ExampleContainer>
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
const DropdownCenterAlignment = () => (
|
|
371
|
+
<ExampleContainer expanded>
|
|
372
|
+
<Title title="Dropdown collisions on the right boundary (centered)" theme="light" level={4} />
|
|
373
|
+
<DxcFlex justifyContent="flex-end">
|
|
374
|
+
<DxcDropdown label="Label" options={defaultOptions} onSelectOption={(value) => {}} margin="small" />
|
|
375
|
+
</DxcFlex>
|
|
376
|
+
</ExampleContainer>
|
|
377
|
+
);
|
|
378
|
+
|
|
379
|
+
export const Chromatic = Dropdown.bind({});
|
|
380
|
+
Chromatic.play = async ({ canvasElement }) => {
|
|
381
|
+
const canvas = within(canvasElement);
|
|
382
|
+
const buttonList = canvas.getAllByRole("button");
|
|
383
|
+
await userEvent.click(buttonList[buttonList.length - 1]);
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
export const OpinionatedTheme = () => (
|
|
226
387
|
<>
|
|
227
|
-
<Title title="
|
|
228
|
-
<Title title="Default with opened menu" theme="light" level={3} />
|
|
388
|
+
<Title title="Opinionated theme" theme="light" level={2} />
|
|
229
389
|
<ExampleContainer>
|
|
230
|
-
<
|
|
231
|
-
|
|
232
|
-
<
|
|
233
|
-
|
|
234
|
-
label="You understand the selection and give your consent"
|
|
235
|
-
onChange={() => {}}
|
|
236
|
-
labelPosition="after"
|
|
237
|
-
/>
|
|
238
|
-
</div>
|
|
390
|
+
<Title title="Default" theme="light" level={4} />
|
|
391
|
+
<HalstackProvider theme={opinionatedTheme}>
|
|
392
|
+
<DxcDropdown label="Default" options={options} onSelectOption={(value) => {}} icon={iconSVG} />
|
|
393
|
+
</HalstackProvider>
|
|
239
394
|
</ExampleContainer>
|
|
240
|
-
<Title title="Option states" theme="light" level={3} />
|
|
241
395
|
<ExampleContainer pseudoState="pseudo-hover">
|
|
242
|
-
<Title title="Hovered
|
|
243
|
-
<
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
iconsPosition="before"
|
|
247
|
-
visualFocusIndex={-1}
|
|
248
|
-
optionOnClick={(option) => {}}
|
|
249
|
-
onKeyDown={(e) => {}}
|
|
250
|
-
options={optionWithIcon}
|
|
251
|
-
styles={{ width: 240 }}
|
|
252
|
-
/>
|
|
396
|
+
<Title title="Hovered" theme="light" level={4} />
|
|
397
|
+
<HalstackProvider theme={opinionatedTheme}>
|
|
398
|
+
<DxcDropdown label="Hovered" options={options} onSelectOption={(value) => {}} icon={iconSVG} />
|
|
399
|
+
</HalstackProvider>
|
|
253
400
|
</ExampleContainer>
|
|
254
401
|
<ExampleContainer pseudoState="pseudo-active">
|
|
255
|
-
<Title title="
|
|
256
|
-
<
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
iconsPosition="before"
|
|
260
|
-
visualFocusIndex={-1}
|
|
261
|
-
optionOnClick={(option) => {}}
|
|
262
|
-
onKeyDown={(e) => {}}
|
|
263
|
-
options={optionWithIcon}
|
|
264
|
-
styles={{ width: 240 }}
|
|
265
|
-
/>
|
|
402
|
+
<Title title="Actived" theme="light" level={4} />
|
|
403
|
+
<HalstackProvider theme={opinionatedTheme}>
|
|
404
|
+
<DxcDropdown label="Actived" options={options} onSelectOption={(value) => {}} icon={iconSVG} />
|
|
405
|
+
</HalstackProvider>
|
|
266
406
|
</ExampleContainer>
|
|
267
|
-
<ExampleContainer>
|
|
268
|
-
<Title title="Focused
|
|
269
|
-
<
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
iconsPosition="before"
|
|
273
|
-
visualFocusIndex={0}
|
|
274
|
-
optionOnClick={(option) => {}}
|
|
275
|
-
onKeyDown={(e) => {}}
|
|
276
|
-
options={options}
|
|
277
|
-
styles={{ width: 240 }}
|
|
278
|
-
/>
|
|
407
|
+
<ExampleContainer pseudoState="pseudo-focus">
|
|
408
|
+
<Title title="Focused" theme="light" level={4} />
|
|
409
|
+
<HalstackProvider theme={opinionatedTheme}>
|
|
410
|
+
<DxcDropdown label="Focused" options={options} onSelectOption={(value) => {}} icon={iconSVG} />
|
|
411
|
+
</HalstackProvider>
|
|
279
412
|
</ExampleContainer>
|
|
280
|
-
<Title title="Icons" theme="light" level={3} />
|
|
281
413
|
<ExampleContainer>
|
|
282
|
-
<Title title="
|
|
283
|
-
<
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
iconsPosition="before"
|
|
287
|
-
visualFocusIndex={-1}
|
|
288
|
-
optionOnClick={(option) => {}}
|
|
289
|
-
onKeyDown={(e) => {}}
|
|
290
|
-
options={optionsIcon}
|
|
291
|
-
styles={{ width: 240 }}
|
|
292
|
-
/>
|
|
293
|
-
<Title title="After" theme="light" level={4} />
|
|
294
|
-
<DropdownMenu
|
|
295
|
-
id="x"
|
|
296
|
-
dropdownId="dX"
|
|
297
|
-
iconsPosition="after"
|
|
298
|
-
visualFocusIndex={-1}
|
|
299
|
-
optionOnClick={(option) => {}}
|
|
300
|
-
onKeyDown={(e) => {}}
|
|
301
|
-
options={optionsIcon}
|
|
302
|
-
styles={{ width: 240 }}
|
|
303
|
-
/>
|
|
414
|
+
<Title title="Disabled" theme="light" level={4} />
|
|
415
|
+
<HalstackProvider theme={opinionatedTheme}>
|
|
416
|
+
<DxcDropdown label="Disabled" options={options} onSelectOption={(value) => {}} icon={iconSVG} disabled />
|
|
417
|
+
</HalstackProvider>
|
|
304
418
|
</ExampleContainer>
|
|
305
419
|
</>
|
|
306
420
|
);
|
|
307
421
|
|
|
308
422
|
export const DropdownMenuStates = DropdownListStates.bind({});
|
|
309
423
|
DropdownMenuStates.play = async ({ canvasElement }) => {
|
|
424
|
+
const canvas = within(canvasElement);
|
|
425
|
+
await userEvent.click(canvas.getAllByRole("button")[0]);
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
export const DropdownMenuAlignedRight = DropdownRightAlignment.bind({});
|
|
429
|
+
DropdownMenuAlignedRight.play = async ({ canvasElement }) => {
|
|
430
|
+
const canvas = within(canvasElement);
|
|
431
|
+
await userEvent.click(canvas.getByRole("button"));
|
|
432
|
+
};
|
|
433
|
+
|
|
434
|
+
export const DropdownMenuAlignedCenter = DropdownCenterAlignment.bind({});
|
|
435
|
+
DropdownMenuAlignedCenter.play = async ({ canvasElement }) => {
|
|
310
436
|
const canvas = within(canvasElement);
|
|
311
437
|
await userEvent.click(canvas.getByRole("button"));
|
|
312
438
|
};
|
package/dropdown/DropdownMenu.js
CHANGED
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
-
|
|
7
5
|
Object.defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
@@ -13,18 +11,12 @@ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/hel
|
|
|
13
11
|
|
|
14
12
|
var _react = _interopRequireDefault(require("react"));
|
|
15
13
|
|
|
16
|
-
var _styledComponents =
|
|
17
|
-
|
|
18
|
-
var _useTheme = _interopRequireDefault(require("../useTheme"));
|
|
14
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
19
15
|
|
|
20
16
|
var _DropdownMenuItem = _interopRequireDefault(require("./DropdownMenuItem"));
|
|
21
17
|
|
|
22
18
|
var _templateObject;
|
|
23
19
|
|
|
24
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
25
|
-
|
|
26
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
27
|
-
|
|
28
20
|
var DropdownMenu = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref) {
|
|
29
21
|
var id = _ref.id,
|
|
30
22
|
dropdownTriggerId = _ref.dropdownTriggerId,
|
|
@@ -34,12 +26,10 @@ var DropdownMenu = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref
|
|
|
34
26
|
onKeyDown = _ref.onKeyDown,
|
|
35
27
|
options = _ref.options,
|
|
36
28
|
styles = _ref.styles;
|
|
37
|
-
|
|
38
|
-
return /*#__PURE__*/_react["default"].createElement(_styledComponents.ThemeProvider, {
|
|
39
|
-
theme: colorsTheme.dropdown
|
|
40
|
-
}, /*#__PURE__*/_react["default"].createElement(DropdownMenuContainer, {
|
|
29
|
+
return /*#__PURE__*/_react["default"].createElement(DropdownMenuContainer, {
|
|
41
30
|
onMouseDown: function onMouseDown(event) {
|
|
42
|
-
// Prevent the onBlur event from closing menu when clicking on the menu since
|
|
31
|
+
// Prevent the onBlur event from closing menu when clicking on the menu since
|
|
32
|
+
// it is implemented with a Portal and the menu is not a direct child of the container
|
|
43
33
|
event.preventDefault();
|
|
44
34
|
},
|
|
45
35
|
onKeyDown: onKeyDown,
|
|
@@ -49,8 +39,8 @@ var DropdownMenu = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref
|
|
|
49
39
|
"aria-orientation": "vertical",
|
|
50
40
|
"aria-activedescendant": "option-".concat(visualFocusIndex),
|
|
51
41
|
tabIndex: -1,
|
|
52
|
-
|
|
53
|
-
|
|
42
|
+
ref: ref,
|
|
43
|
+
style: styles
|
|
54
44
|
}, options.map(function (option, index) {
|
|
55
45
|
return /*#__PURE__*/_react["default"].createElement(_DropdownMenuItem["default"], {
|
|
56
46
|
id: "option-".concat(index),
|
|
@@ -60,10 +50,10 @@ var DropdownMenu = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref
|
|
|
60
50
|
onClick: menuItemOnClick,
|
|
61
51
|
option: option
|
|
62
52
|
});
|
|
63
|
-
}))
|
|
53
|
+
}));
|
|
64
54
|
});
|
|
65
55
|
|
|
66
|
-
var DropdownMenuContainer = _styledComponents["default"].ul(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n box-sizing: border-box;\n max-height: 230px;\n overflow-y: auto;\n padding: 0;\n margin: 0;\n background-color: ", ";\n border-width: ", ";\n border-style: ", ";\n border-color: ", ";\n border-radius: ", ";\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n outline: none;\n"])), function (props) {
|
|
56
|
+
var DropdownMenuContainer = _styledComponents["default"].ul(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n box-sizing: border-box;\n max-height: 230px;\n min-width: min-content;\n overflow-y: auto;\n padding: 0;\n margin: 0;\n background-color: ", ";\n border-width: ", ";\n border-style: ", ";\n border-color: ", ";\n border-radius: ", ";\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n outline: none;\n"])), function (props) {
|
|
67
57
|
return props.theme.optionBackgroundColor;
|
|
68
58
|
}, function (props) {
|
|
69
59
|
return props.theme.borderThickness;
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
-
|
|
7
5
|
Object.defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
@@ -13,26 +11,17 @@ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/hel
|
|
|
13
11
|
|
|
14
12
|
var _react = _interopRequireDefault(require("react"));
|
|
15
13
|
|
|
16
|
-
var _styledComponents =
|
|
17
|
-
|
|
18
|
-
var _useTheme = _interopRequireDefault(require("../useTheme"));
|
|
14
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
19
15
|
|
|
20
16
|
var _templateObject, _templateObject2, _templateObject3;
|
|
21
17
|
|
|
22
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
23
|
-
|
|
24
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
25
|
-
|
|
26
18
|
var DropdownMenuItem = function DropdownMenuItem(_ref) {
|
|
27
19
|
var id = _ref.id,
|
|
28
20
|
visuallyFocused = _ref.visuallyFocused,
|
|
29
21
|
iconPosition = _ref.iconPosition,
|
|
30
22
|
_onClick = _ref.onClick,
|
|
31
23
|
option = _ref.option;
|
|
32
|
-
|
|
33
|
-
return /*#__PURE__*/_react["default"].createElement(_styledComponents.ThemeProvider, {
|
|
34
|
-
theme: colorsTheme.dropdown
|
|
35
|
-
}, /*#__PURE__*/_react["default"].createElement(DropdownMenuItemContainer, {
|
|
24
|
+
return /*#__PURE__*/_react["default"].createElement(DropdownMenuItemContainer, {
|
|
36
25
|
visuallyFocused: visuallyFocused,
|
|
37
26
|
onClick: function onClick() {
|
|
38
27
|
_onClick(option.value);
|
|
@@ -46,7 +35,7 @@ var DropdownMenuItem = function DropdownMenuItem(_ref) {
|
|
|
46
35
|
role: typeof option.icon === "string" ? undefined : "img"
|
|
47
36
|
}, typeof option.icon === "string" ? /*#__PURE__*/_react["default"].createElement("img", {
|
|
48
37
|
src: option.icon
|
|
49
|
-
}) : option.icon), iconPosition === "before" && /*#__PURE__*/_react["default"].createElement(DropdownMenuItemLabel, null, option.label))
|
|
38
|
+
}) : option.icon), iconPosition === "before" && /*#__PURE__*/_react["default"].createElement(DropdownMenuItemLabel, null, option.label));
|
|
50
39
|
};
|
|
51
40
|
|
|
52
41
|
var DropdownMenuItemContainer = _styledComponents["default"].li(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: ", ";\n min-height: 36px;\n padding-top: ", ";\n padding-bottom: ", ";\n padding-left: ", ";\n padding-right: ", ";\n cursor: pointer;\n\n ", "\n &:hover {\n background-color: ", ";\n }\n &:active {\n background-color: ", ";\n }\n"])), function (props) {
|
|
@@ -67,7 +56,7 @@ var DropdownMenuItemContainer = _styledComponents["default"].li(_templateObject
|
|
|
67
56
|
return props.theme.activeOptionBackgroundColor;
|
|
68
57
|
});
|
|
69
58
|
|
|
70
|
-
var DropdownMenuItemLabel = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n font-family: ", ";\n font-size: ", ";\n font-style: ", ";\n font-weight: ", ";\n line-height: 1.5rem;\n color: ", ";\n"])), function (props) {
|
|
59
|
+
var DropdownMenuItemLabel = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n font-family: ", ";\n font-size: ", ";\n font-style: ", ";\n font-weight: ", ";\n line-height: 1.5rem;\n color: ", ";\n white-space: nowrap;\n"])), function (props) {
|
|
71
60
|
return props.theme.optionFontFamily;
|
|
72
61
|
}, function (props) {
|
|
73
62
|
return props.theme.optionFontSize;
|
package/file-input/FileInput.js
CHANGED
|
@@ -250,6 +250,7 @@ var DxcFileInput = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref
|
|
|
250
250
|
return selectedFiles[key];
|
|
251
251
|
});
|
|
252
252
|
addFile(filesArray);
|
|
253
|
+
e.target.value = null;
|
|
253
254
|
};
|
|
254
255
|
|
|
255
256
|
var onDelete = (0, _react.useCallback)(function (fileName) {
|
|
@@ -385,10 +386,8 @@ var DxcFileInput = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref
|
|
|
385
386
|
accept: accept,
|
|
386
387
|
multiple: multiple,
|
|
387
388
|
onChange: selectFiles,
|
|
388
|
-
name: name,
|
|
389
389
|
disabled: disabled,
|
|
390
|
-
readOnly: true
|
|
391
|
-
"aria-hidden": "true"
|
|
390
|
+
readOnly: true
|
|
392
391
|
}), /*#__PURE__*/_react["default"].createElement(_Button["default"], {
|
|
393
392
|
mode: "secondary",
|
|
394
393
|
label: buttonLabel !== null && buttonLabel !== void 0 ? buttonLabel : multiple ? translatedLabels.fileInput.multipleButtonLabelDefault : translatedLabels.fileInput.singleButtonLabelDefault,
|
|
@@ -414,10 +413,8 @@ var DxcFileInput = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref
|
|
|
414
413
|
accept: accept,
|
|
415
414
|
multiple: multiple,
|
|
416
415
|
onChange: selectFiles,
|
|
417
|
-
name: name,
|
|
418
416
|
disabled: disabled,
|
|
419
|
-
readOnly: true
|
|
420
|
-
"aria-hidden": "true"
|
|
417
|
+
readOnly: true
|
|
421
418
|
}), /*#__PURE__*/_react["default"].createElement(DragDropArea, {
|
|
422
419
|
isDragging: isDragging,
|
|
423
420
|
disabled: disabled,
|
|
@@ -3,13 +3,14 @@ import DxcFileInput from "./FileInput";
|
|
|
3
3
|
import Title from "../../.storybook/components/Title";
|
|
4
4
|
import ExampleContainer from "../../.storybook/components/ExampleContainer";
|
|
5
5
|
import FileItem from "./FileItem";
|
|
6
|
+
import { HalstackProvider } from "../HalstackContext";
|
|
6
7
|
|
|
7
8
|
export default {
|
|
8
9
|
title: "File input",
|
|
9
10
|
component: DxcFileInput,
|
|
10
11
|
};
|
|
11
12
|
|
|
12
|
-
const picPreview = "https://cdn.mos.cms.futurecdn.net/CAZ6JXi6huSuN4QGE627NR.jpg"
|
|
13
|
+
const picPreview = "https://cdn.mos.cms.futurecdn.net/CAZ6JXi6huSuN4QGE627NR.jpg";
|
|
13
14
|
|
|
14
15
|
const file1 = new File(["file1"], "file.pdf", { type: "text/plain" });
|
|
15
16
|
const file2 = new File(["file2"], "file2.mp3", {
|
|
@@ -63,6 +64,12 @@ const filesExamples = [
|
|
|
63
64
|
},
|
|
64
65
|
];
|
|
65
66
|
|
|
67
|
+
const opinionatedTheme = {
|
|
68
|
+
fileInput: {
|
|
69
|
+
fontColor: "#000000",
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
|
|
66
73
|
export const Chromatic = () => (
|
|
67
74
|
<>
|
|
68
75
|
<Title title="File item states" theme="light" level={2} />
|
|
@@ -529,7 +536,83 @@ export const Chromatic = () => (
|
|
|
529
536
|
mode="dropzone"
|
|
530
537
|
margin="xxlarge"
|
|
531
538
|
/>
|
|
532
|
-
|
|
539
|
+
</ExampleContainer>
|
|
540
|
+
<Title title="Opinionated theme" theme="light" level={2} />
|
|
541
|
+
<ExampleContainer>
|
|
542
|
+
<HalstackProvider theme={opinionatedTheme}>
|
|
543
|
+
<Title title="Single file" theme="light" level={4} />
|
|
544
|
+
<DxcFileInput
|
|
545
|
+
label="File input"
|
|
546
|
+
helperText="Please select files"
|
|
547
|
+
value={fileExample}
|
|
548
|
+
multiple={false}
|
|
549
|
+
callbackFile={() => {}}
|
|
550
|
+
/>
|
|
551
|
+
</HalstackProvider>
|
|
552
|
+
</ExampleContainer>
|
|
553
|
+
<ExampleContainer>
|
|
554
|
+
<HalstackProvider theme={opinionatedTheme}>
|
|
555
|
+
<Title title="Invalid single file" theme="light" level={4} />
|
|
556
|
+
<DxcFileInput
|
|
557
|
+
label="File input"
|
|
558
|
+
helperText="Please select files"
|
|
559
|
+
value={fileExampleError}
|
|
560
|
+
multiple={false}
|
|
561
|
+
callbackFile={() => {}}
|
|
562
|
+
/>
|
|
563
|
+
</HalstackProvider>
|
|
564
|
+
</ExampleContainer>
|
|
565
|
+
<ExampleContainer>
|
|
566
|
+
<Title title="Single file" theme="light" level={4} />
|
|
567
|
+
<HalstackProvider theme={opinionatedTheme}>
|
|
568
|
+
<DxcFileInput
|
|
569
|
+
mode="filedrop"
|
|
570
|
+
label="File input"
|
|
571
|
+
helperText="Please select files"
|
|
572
|
+
value={fileExample}
|
|
573
|
+
multiple={false}
|
|
574
|
+
callbackFile={() => {}}
|
|
575
|
+
/>
|
|
576
|
+
</HalstackProvider>
|
|
577
|
+
</ExampleContainer>
|
|
578
|
+
<ExampleContainer>
|
|
579
|
+
<Title title="Invalid single file" theme="light" level={4} />
|
|
580
|
+
<HalstackProvider theme={opinionatedTheme}>
|
|
581
|
+
<DxcFileInput
|
|
582
|
+
mode="filedrop"
|
|
583
|
+
label="File input"
|
|
584
|
+
helperText="Please select files"
|
|
585
|
+
value={fileExampleError}
|
|
586
|
+
multiple={false}
|
|
587
|
+
callbackFile={() => {}}
|
|
588
|
+
/>
|
|
589
|
+
</HalstackProvider>
|
|
590
|
+
</ExampleContainer>
|
|
591
|
+
<ExampleContainer>
|
|
592
|
+
<Title title="Single file" theme="light" level={4} />
|
|
593
|
+
<HalstackProvider theme={opinionatedTheme}>
|
|
594
|
+
<DxcFileInput
|
|
595
|
+
label="File input"
|
|
596
|
+
helperText="Please select files"
|
|
597
|
+
mode="dropzone"
|
|
598
|
+
value={fileExample}
|
|
599
|
+
callbackFile={() => {}}
|
|
600
|
+
multiple={false}
|
|
601
|
+
/>
|
|
602
|
+
</HalstackProvider>
|
|
603
|
+
</ExampleContainer>
|
|
604
|
+
<ExampleContainer>
|
|
605
|
+
<Title title="Invalid single file" theme="light" level={4} />{" "}
|
|
606
|
+
<HalstackProvider theme={opinionatedTheme}>
|
|
607
|
+
<DxcFileInput
|
|
608
|
+
label="File input"
|
|
609
|
+
helperText="Please select files"
|
|
610
|
+
mode="dropzone"
|
|
611
|
+
value={fileExampleError}
|
|
612
|
+
callbackFile={() => {}}
|
|
613
|
+
multiple={false}
|
|
614
|
+
/>
|
|
615
|
+
</HalstackProvider>
|
|
533
616
|
</ExampleContainer>
|
|
534
617
|
</>
|
|
535
618
|
);
|