@lumx/react 3.1.5 → 3.2.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/_internal/types.d.ts +16 -5
  2. package/index.d.ts +45 -4
  3. package/index.js +632 -423
  4. package/index.js.map +1 -1
  5. package/package.json +3 -3
  6. package/src/components/alert-dialog/AlertDialog.stories.tsx +96 -165
  7. package/src/components/alert-dialog/AlertDialog.test.tsx +15 -23
  8. package/src/components/avatar/Avatar.stories.tsx +91 -62
  9. package/src/components/avatar/Avatar.test.tsx +9 -24
  10. package/src/components/badge/Badge.stories.tsx +63 -38
  11. package/src/components/button/Button.stories.tsx +147 -139
  12. package/src/components/button/IconButton.stories.tsx +45 -0
  13. package/src/components/checkbox/Checkbox.stories.tsx +37 -30
  14. package/src/components/chip/Chip.stories.tsx +77 -15
  15. package/src/components/comment-block/CommentBlock.stories.tsx +90 -25
  16. package/src/components/comment-block/CommentBlock.test.tsx +12 -17
  17. package/src/components/date-picker/DatePickerField.stories.tsx +52 -83
  18. package/src/components/dialog/Dialog.stories.tsx +131 -293
  19. package/src/components/dialog/Dialog.test.tsx +0 -32
  20. package/src/components/dropdown/Dropdown.stories.tsx +1 -186
  21. package/src/components/flag/Flag.stories.tsx +33 -18
  22. package/src/components/flag/Flag.test.tsx +1 -8
  23. package/src/components/flex-box/FlexBox.stories.tsx +151 -238
  24. package/src/components/flex-box/FlexBox.test.tsx +9 -49
  25. package/src/components/generic-block/GenericBlock.stories.jsx +1 -1
  26. package/src/components/grid-column/GridColumn.stories.tsx +46 -0
  27. package/src/components/heading/Heading.stories.tsx +57 -95
  28. package/src/components/icon/Icon.stories.tsx +67 -70
  29. package/src/components/image-block/ImageBlock.stories.tsx +103 -47
  30. package/src/components/image-block/ImageBlock.test.tsx +12 -17
  31. package/src/components/inline-list/InlineList.stories.tsx +45 -29
  32. package/src/components/input-helper/InputHelper.stories.tsx +31 -25
  33. package/src/components/input-label/InputLabel.stories.tsx +33 -10
  34. package/src/components/lightbox/Lightbox.stories.tsx +39 -77
  35. package/src/components/lightbox/Lightbox.test.tsx +12 -17
  36. package/src/components/link/Link.stories.tsx +98 -128
  37. package/src/components/link-preview/LinkPreview.stories.tsx +48 -75
  38. package/src/components/list/List.stories.tsx +59 -84
  39. package/src/components/list/List.test.tsx +8 -17
  40. package/src/components/list/ListDivider.stories.tsx +9 -4
  41. package/src/components/list/ListDivider.test.tsx +12 -17
  42. package/src/components/list/ListItem.stories.tsx +97 -59
  43. package/src/components/list/ListItem.test.tsx +12 -17
  44. package/src/components/list/ListSubheader.stories.tsx +8 -5
  45. package/src/components/list/ListSubheader.test.tsx +12 -18
  46. package/src/components/message/Message.stories.tsx +51 -22
  47. package/src/components/mosaic/Mosaic.stories.tsx +78 -74
  48. package/src/components/mosaic/Mosaic.test.tsx +0 -31
  49. package/src/components/navigation/Navigation.stories.tsx +67 -0
  50. package/src/components/navigation/Navigation.test.tsx +58 -0
  51. package/src/components/navigation/Navigation.tsx +62 -0
  52. package/src/components/navigation/NavigationItem.test.tsx +37 -0
  53. package/src/components/navigation/NavigationItem.tsx +89 -0
  54. package/src/components/navigation/NavigationSection.test.tsx +126 -0
  55. package/src/components/navigation/NavigationSection.tsx +109 -0
  56. package/src/components/navigation/context.tsx +6 -0
  57. package/src/components/navigation/index.ts +1 -0
  58. package/src/components/notification/Notifications.stories.tsx +52 -47
  59. package/src/components/popover/Popover.stories.tsx +68 -201
  60. package/src/components/popover/Popover.tsx +7 -9
  61. package/src/components/popover-dialog/PopoverDialog.stories.tsx +26 -65
  62. package/src/components/post-block/PostBlock.test.tsx +12 -17
  63. package/src/components/progress/ProgressCircular.stories.tsx +24 -12
  64. package/src/components/progress/ProgressLinear.stories.tsx +6 -2
  65. package/src/components/radio-button/RadioButton.stories.tsx +35 -24
  66. package/src/components/select/Select.stories.tsx +19 -23
  67. package/src/components/select/SelectMultiple.stories.tsx +105 -2
  68. package/src/components/select/WithSelectContext.tsx +10 -4
  69. package/src/components/skeleton/SkeletonCircle.stories.tsx +37 -21
  70. package/src/components/skeleton/SkeletonCircle.test.tsx +12 -17
  71. package/src/components/skeleton/SkeletonRectangle.stories.tsx +74 -99
  72. package/src/components/skeleton/SkeletonRectangle.test.tsx +12 -17
  73. package/src/components/skeleton/SkeletonTypography.test.tsx +12 -17
  74. package/src/components/slider/Slider.stories.tsx +41 -25
  75. package/src/components/slider/Slider.test.tsx +12 -18
  76. package/src/components/slideshow/Slideshow.stories.tsx +31 -61
  77. package/src/components/slideshow/Slideshow.test.tsx +15 -23
  78. package/src/components/slideshow/SlideshowControls.stories.tsx +4 -6
  79. package/src/components/switch/Switch.stories.tsx +35 -32
  80. package/src/components/table/Table.test.tsx +12 -17
  81. package/src/components/tabs/Tabs.stories.tsx +4 -3
  82. package/src/components/text/Text.stories.tsx +130 -0
  83. package/src/components/text-field/TextField.stories.tsx +114 -148
  84. package/src/components/thumbnail/Thumbnail.stories.tsx +106 -255
  85. package/src/components/thumbnail/Thumbnail.test.tsx +12 -35
  86. package/src/components/tooltip/Tooltip.stories.tsx +51 -136
  87. package/src/components/user-block/UserBlock.stories.tsx +67 -56
  88. package/src/components/user-block/UserBlock.test.tsx +1 -5
  89. package/src/hooks/useFocusTrap.ts +2 -2
  90. package/src/index.ts +1 -0
  91. package/src/stories/controls/color.ts +6 -0
  92. package/src/stories/controls/element.ts +6 -0
  93. package/src/stories/controls/focusPoint.ts +1 -0
  94. package/src/stories/controls/icons.ts +6 -0
  95. package/src/stories/{knobs → controls}/image.ts +6 -16
  96. package/src/stories/controls/selectArgType.ts +4 -0
  97. package/src/stories/controls/theme.ts +3 -0
  98. package/src/stories/controls/typography.ts +5 -0
  99. package/src/stories/controls/withUndefined.ts +1 -0
  100. package/src/stories/decorators/withChromaticForceScreenSize.tsx +8 -0
  101. package/src/stories/decorators/withCombinations.tsx +99 -0
  102. package/src/stories/decorators/withNestedProps.tsx +23 -0
  103. package/src/stories/{withResizableBox.tsx → decorators/withResizableBox.tsx} +6 -10
  104. package/src/stories/decorators/withValueOnChange.tsx +18 -0
  105. package/src/stories/decorators/withWrapper.tsx +19 -0
  106. package/src/stories/utils/CustomLink.tsx +8 -2
  107. package/src/stories/{knobs → utils}/lorem.ts +9 -9
  108. package/src/testing/utils/commonTestsSuiteRTL.ts +2 -3
  109. package/src/testing/utils/index.ts +0 -2
  110. package/src/untypped-modules.d.ts +0 -2
  111. package/src/utils/MaterialThemeSwitcher/MaterialThemeSwitcher.tsx +1 -1
  112. package/src/utils/ThemeContext.ts +4 -0
  113. package/src/utils/forwardRefPolymorphic.ts +9 -0
  114. package/src/utils/type.ts +28 -4
  115. package/src/components/alert-dialog/__snapshots__/AlertDialog.test.tsx.snap +0 -558
  116. package/src/components/avatar/__snapshots__/Avatar.test.tsx.snap +0 -681
  117. package/src/components/comment-block/__snapshots__/CommentBlock.test.tsx.snap +0 -92
  118. package/src/components/dialog/__snapshots__/Dialog.test.tsx.snap +0 -1133
  119. package/src/components/expansion-panel/ExpansionPanel.stories.tsx +0 -65
  120. package/src/components/flag/__snapshots__/Flag.test.tsx.snap +0 -133
  121. package/src/components/flex-box/__snapshots__/FlexBox.test.tsx.snap +0 -492
  122. package/src/components/grid-column/GridColumn.stories.jsx +0 -56
  123. package/src/components/image-block/__snapshots__/ImageBlock.test.tsx.snap +0 -64
  124. package/src/components/lightbox/__snapshots__/Lightbox.test.tsx.snap +0 -194
  125. package/src/components/list/__snapshots__/List.test.tsx.snap +0 -360
  126. package/src/components/list/__snapshots__/ListDivider.test.tsx.snap +0 -7
  127. package/src/components/list/__snapshots__/ListItem.test.tsx.snap +0 -160
  128. package/src/components/list/__snapshots__/ListSubheader.test.tsx.snap +0 -9
  129. package/src/components/mosaic/__snapshots__/Mosaic.test.tsx.snap +0 -357
  130. package/src/components/post-block/__snapshots__/PostBlock.test.tsx.snap +0 -139
  131. package/src/components/skeleton/__snapshots__/SkeletonCircle.test.tsx.snap +0 -54
  132. package/src/components/skeleton/__snapshots__/SkeletonRectangle.test.tsx.snap +0 -177
  133. package/src/components/skeleton/__snapshots__/SkeletonTypography.test.tsx.snap +0 -174
  134. package/src/components/slider/__snapshots__/Slider.test.tsx.snap +0 -122
  135. package/src/components/slideshow/__snapshots__/Slideshow.test.tsx.snap +0 -157
  136. package/src/components/table/__snapshots__/Table.test.tsx.snap +0 -263
  137. package/src/components/text/Text.stories.jsx +0 -75
  138. package/src/components/thumbnail/__snapshots__/Thumbnail.test.tsx.snap +0 -130
  139. package/src/components/user-block/__snapshots__/UserBlock.test.tsx.snap +0 -362
  140. package/src/stories/chromaticForceScreenSize.tsx +0 -7
  141. package/src/stories/knobs/buttonKnob.ts +0 -9
  142. package/src/stories/knobs/emphasisKnob.ts +0 -8
  143. package/src/stories/knobs/enumKnob.ts +0 -14
  144. package/src/stories/knobs/focusKnob.ts +0 -3
  145. package/src/stories/knobs/sizeKnob.ts +0 -5
  146. package/src/stories/knobs/thumbnailsKnob.ts +0 -9
  147. package/src/testing/utils/itShouldRenderStories.tsx +0 -103
@@ -1,107 +1,82 @@
1
- import React, { useEffect, useState } from 'react';
1
+ import { AspectRatio, Size, SkeletonRectangle, SkeletonRectangleVariant, SkeletonRectangleProps } from '@lumx/react';
2
+ import { getSelectArgType } from '@lumx/react/stories/controls/selectArgType';
3
+ import { ALL_COLORS, colorArgType } from '@lumx/react/stories/controls/color';
4
+ import { withCombinations } from '@lumx/react/stories/decorators/withCombinations';
2
5
 
3
- import {
4
- Alignment,
5
- AspectRatio,
6
- Button,
7
- FlexBox,
8
- Orientation,
9
- Size,
10
- SkeletonRectangle,
11
- SkeletonRectangleVariant,
12
- Thumbnail,
13
- ColorPalette,
14
- } from '@lumx/react';
15
- import { imageKnob } from '@lumx/react/stories/knobs/image';
16
-
17
- export default { title: 'LumX components/skeleton/Skeleton Rectangle' };
18
-
19
- const variants = [
6
+ const variants: SkeletonRectangleProps['variant'][] = [
20
7
  SkeletonRectangleVariant.squared,
21
8
  SkeletonRectangleVariant.rounded,
22
9
  SkeletonRectangleVariant.pill,
23
- ] as const;
24
- const sizes = [Size.xxs, Size.xs, Size.s, Size.m, Size.l, Size.xl, Size.xxl] as const;
25
- const aspectRatios = [AspectRatio.vertical, AspectRatio.square, AspectRatio.horizontal, AspectRatio.wide] as const;
26
- const colors = Object.values(ColorPalette);
10
+ ];
11
+ const sizes: SkeletonRectangleProps['size'][] = [Size.xxs, Size.xs, Size.s, Size.m, Size.l, Size.xl, Size.xxl];
12
+ const aspectRatios: SkeletonRectangleProps['aspectRatio'][] = [
13
+ AspectRatio.wide,
14
+ AspectRatio.horizontal,
15
+ AspectRatio.square,
16
+ AspectRatio.vertical,
17
+ ];
18
+
19
+ export default {
20
+ title: 'LumX components/skeleton/Skeleton Rectangle',
21
+ component: SkeletonRectangle,
22
+ args: SkeletonRectangle.defaultProps,
23
+ argTypes: {
24
+ width: getSelectArgType(sizes),
25
+ height: getSelectArgType(sizes),
26
+ aspectRatio: getSelectArgType(aspectRatios),
27
+ color: colorArgType,
28
+ variant: getSelectArgType(variants),
29
+ },
30
+ };
27
31
 
28
- export const Rectangle = ({ theme }: any) => (
29
- <>
30
- Sizes:
31
- <FlexBox orientation={Orientation.horizontal}>
32
- {sizes.map((size) => (
33
- <SkeletonRectangle
34
- key={size}
35
- className="lumx-spacing-margin"
36
- theme={theme}
37
- height={size}
38
- width={size}
39
- />
40
- ))}
41
- </FlexBox>
42
- Variants:
43
- <FlexBox orientation={Orientation.horizontal}>
44
- {variants.map((variant) => (
45
- <SkeletonRectangle
46
- key={variant}
47
- className="lumx-spacing-margin"
48
- theme={theme}
49
- width={Size.xl}
50
- height={Size.m}
51
- variant={variant}
52
- />
53
- ))}
54
- </FlexBox>
55
- Ratios:
56
- <FlexBox orientation={Orientation.horizontal} hAlign={Alignment.top}>
57
- {aspectRatios.map((aspectRatio) => (
58
- <SkeletonRectangle
59
- key={aspectRatio}
60
- className="lumx-spacing-margin"
61
- theme={theme}
62
- width={Size.xl}
63
- aspectRatio={aspectRatio}
64
- />
65
- ))}
66
- </FlexBox>
67
- Colors:
68
- <FlexBox orientation={Orientation.horizontal} hAlign={Alignment.top}>
69
- {colors.map((color) => (
70
- <SkeletonRectangle
71
- key={color}
72
- className="lumx-spacing-margin"
73
- theme={theme}
74
- width={Size.xl}
75
- height={Size.m}
76
- color={color}
77
- />
78
- ))}
79
- </FlexBox>
80
- </>
81
- );
32
+ /**
33
+ * All sizes
34
+ */
35
+ export const AllSize = {
36
+ argTypes: { width: { control: false }, height: { control: false } },
37
+ decorators: [
38
+ withCombinations({
39
+ // Using same width than height
40
+ combinations: { cols: Object.fromEntries(sizes.map((s) => [s, { height: s, width: s }])) },
41
+ }),
42
+ ],
43
+ };
44
+
45
+ /**
46
+ * All ratios (for a fixed width)
47
+ */
48
+ export const AllRatios = {
49
+ args: { width: Size.xl },
50
+ argTypes: { aspectRatio: { control: false } },
51
+ decorators: [
52
+ withCombinations({
53
+ combinations: { cols: { key: 'aspectRatio', options: aspectRatios } },
54
+ }),
55
+ ],
56
+ };
82
57
 
83
- export const LoadingThumbnail = ({ theme }: any) => {
84
- const [loading, setLoading] = useState(true);
85
- const fakeLoad = () => {
86
- setLoading(true);
87
- setTimeout(() => {
88
- setLoading(false);
89
- }, 2000);
90
- };
91
- useEffect(fakeLoad, []);
92
- const size = Size.xl;
58
+ /**
59
+ * All variants
60
+ */
61
+ export const AllVariants = {
62
+ args: { width: Size.l, height: Size.m },
63
+ argTypes: { variant: { control: false } },
64
+ decorators: [
65
+ withCombinations({
66
+ combinations: { cols: { key: 'variant', options: variants } },
67
+ }),
68
+ ],
69
+ };
93
70
 
94
- return (
95
- <>
96
- <Button onClick={fakeLoad}>Reload</Button> (fake 2sec loading)
97
- <Thumbnail
98
- image={imageKnob()}
99
- alt="Image"
100
- style={{ display: loading ? 'none' : undefined }}
101
- aspectRatio={AspectRatio.square}
102
- size={size}
103
- />
104
- {loading && <SkeletonRectangle theme={theme} width={size} aspectRatio={AspectRatio.square} />}
105
- </>
106
- );
71
+ /**
72
+ * All colors
73
+ */
74
+ export const AllColors = {
75
+ args: { width: Size.l, height: Size.m },
76
+ argTypes: { color: { control: false } },
77
+ decorators: [
78
+ withCombinations({
79
+ combinations: { cols: { key: 'color', options: ALL_COLORS } },
80
+ }),
81
+ ],
107
82
  };
@@ -1,28 +1,23 @@
1
1
  import React from 'react';
2
- import { mount, shallow } from 'enzyme';
3
- import 'jest-enzyme';
4
- import { commonTestsSuite, itShouldRenderStories } from '@lumx/react/testing/utils';
5
2
 
3
+ import { commonTestsSuiteRTL } from '@lumx/react/testing/utils';
4
+ import { render } from '@testing-library/react';
5
+ import { queryByClassName } from '@lumx/react/testing/utils/queries';
6
6
  import { SkeletonRectangle, SkeletonRectangleProps } from './SkeletonRectangle';
7
- import * as stories from './SkeletonRectangle.stories';
8
7
 
9
8
  const CLASSNAME = SkeletonRectangle.className as string;
10
9
 
11
- /**
12
- * Mounts the component and returns common DOM elements / data needed in multiple tests further down.
13
- */
14
- const setup = (props: Partial<SkeletonRectangleProps> = {}, shallowRendering = true) => {
15
- const renderer: any = shallowRendering ? shallow : mount;
16
- const wrapper: any = renderer(<SkeletonRectangle {...(props as any)} />);
17
- return { props, wrapper };
10
+ const setup = (props: Partial<SkeletonRectangleProps> = {}) => {
11
+ render(<SkeletonRectangle {...(props as any)} />);
12
+ const skeletonRectangle = queryByClassName(document.body, CLASSNAME);
13
+ return { props, skeletonRectangle };
18
14
  };
19
15
 
20
16
  describe(`<${SkeletonRectangle.displayName}>`, () => {
21
- // 1. Test render via snapshot.
22
- describe('Snapshots and structure', () => {
23
- itShouldRenderStories(stories, SkeletonRectangle);
24
- });
25
-
26
17
  // Common tests suite.
27
- commonTestsSuite(setup, { className: 'wrapper', prop: 'wrapper' }, { className: CLASSNAME });
18
+ commonTestsSuiteRTL(setup, {
19
+ baseClassName: CLASSNAME,
20
+ forwardClassName: 'skeletonRectangle',
21
+ forwardAttributes: 'skeletonRectangle',
22
+ });
28
23
  });
@@ -1,28 +1,23 @@
1
1
  import React from 'react';
2
- import { mount, shallow } from 'enzyme';
3
- import 'jest-enzyme';
4
- import { commonTestsSuite, itShouldRenderStories } from '@lumx/react/testing/utils';
5
2
 
3
+ import { commonTestsSuiteRTL } from '@lumx/react/testing/utils';
4
+ import { render } from '@testing-library/react';
5
+ import { queryByClassName } from '@lumx/react/testing/utils/queries';
6
6
  import { SkeletonTypography, SkeletonTypographyProps } from './SkeletonTypography';
7
- import * as stories from './SkeletonTypography.stories';
8
7
 
9
8
  const CLASSNAME = SkeletonTypography.className as string;
10
9
 
11
- /**
12
- * Mounts the component and returns common DOM elements / data needed in multiple tests further down.
13
- */
14
- const setup = (props: Partial<SkeletonTypographyProps> = {}, shallowRendering = true) => {
15
- const renderer: any = shallowRendering ? shallow : mount;
16
- const wrapper: any = renderer(<SkeletonTypography {...(props as any)} />);
17
- return { props, wrapper };
10
+ const setup = (props: Partial<SkeletonTypographyProps> = {}) => {
11
+ render(<SkeletonTypography {...(props as any)} />);
12
+ const skeletonTypography = queryByClassName(document.body, CLASSNAME);
13
+ return { props, skeletonTypography };
18
14
  };
19
15
 
20
16
  describe(`<${SkeletonTypography.displayName}>`, () => {
21
- // 1. Test render via snapshot.
22
- describe('Snapshots and structure', () => {
23
- itShouldRenderStories(stories, SkeletonTypography);
24
- });
25
-
26
17
  // Common tests suite.
27
- commonTestsSuite(setup, { className: 'wrapper', prop: 'wrapper' }, { className: CLASSNAME });
18
+ commonTestsSuiteRTL(setup, {
19
+ baseClassName: CLASSNAME,
20
+ forwardClassName: 'skeletonTypography',
21
+ forwardAttributes: 'skeletonTypography',
22
+ });
28
23
  });
@@ -1,29 +1,45 @@
1
1
  import { Slider } from '@lumx/react';
2
- import { number, text } from '@storybook/addon-knobs';
3
- import noop from 'lodash/noop';
4
- import React from 'react';
2
+ import { loremIpsum } from '@lumx/react/stories/utils/lorem';
3
+ import { withValueOnChange } from '@lumx/react/stories/decorators/withValueOnChange';
5
4
 
6
- export default { title: 'LumX components/slider/Slider' };
5
+ export default {
6
+ title: 'LumX components/slider/Slider',
7
+ component: Slider,
8
+ args: {
9
+ ...Slider.defaultProps,
10
+ min: 0,
11
+ max: 30,
12
+ value: 15,
13
+ name: 'slider-html-name',
14
+ },
15
+ argTypes: {
16
+ onChange: { action: true },
17
+ },
18
+ decorators: [withValueOnChange({})],
19
+ };
7
20
 
8
- export const DefaultSlider = ({ theme }: any) => (
9
- <Slider
10
- label={text('label', 'Default')}
11
- max={number('max', 10)}
12
- min={number('min', 0)}
13
- theme={theme}
14
- value={5}
15
- onChange={noop}
16
- />
17
- );
21
+ /**
22
+ * Default slider with required props
23
+ */
24
+ export const Default = {};
18
25
 
19
- export const WithHelperSlider = ({ theme }: any) => (
20
- <Slider
21
- label={text('label', 'Default')}
22
- helper={text('helper', 'This is an helper text')}
23
- max={number('max', 10)}
24
- min={number('min', 0)}
25
- theme={theme}
26
- value={5}
27
- onChange={noop}
28
- />
29
- );
26
+ /**
27
+ * With label and helper
28
+ */
29
+ export const WithLabelAndHelper = {
30
+ args: { label: 'Slider label', helper: loremIpsum('tiny') },
31
+ };
32
+
33
+ /**
34
+ * With steps
35
+ */
36
+ export const WithSteps = {
37
+ args: { steps: 5 },
38
+ };
39
+
40
+ /**
41
+ * With precision (three digits after the decimal point)
42
+ */
43
+ export const WithPrecision = {
44
+ args: { steps: 0, precision: 3 },
45
+ };
@@ -1,31 +1,25 @@
1
1
  import React from 'react';
2
2
 
3
- import { mount, shallow } from 'enzyme';
4
- import 'jest-enzyme';
5
- import { commonTestsSuite, itShouldRenderStories } from '@lumx/react/testing/utils';
6
-
3
+ import { commonTestsSuiteRTL } from '@lumx/react/testing/utils';
4
+ import { render } from '@testing-library/react';
5
+ import { queryByClassName } from '@lumx/react/testing/utils/queries';
7
6
  import { Slider, SliderProps } from './Slider';
8
- import * as stories from './Slider.stories';
9
7
 
10
8
  const CLASSNAME = Slider.className as string;
11
9
 
12
10
  jest.mock('uid', () => ({ uid: () => 'uid' }));
13
11
 
14
- /**
15
- * Mounts the component and returns common DOM elements / data needed in multiple tests further down.
16
- */
17
- const setup = (props: Partial<SliderProps> = {}, shallowRendering = true) => {
18
- const renderer: any = shallowRendering ? shallow : mount;
19
- const wrapper: any = renderer(<Slider {...(props as any)} />);
20
- return { props, wrapper };
12
+ const setup = (props: Partial<SliderProps> = {}) => {
13
+ render(<Slider {...(props as any)} />);
14
+ const slider = queryByClassName(document.body, CLASSNAME);
15
+ return { props, slider };
21
16
  };
22
17
 
23
18
  describe(`<${Slider.displayName}>`, () => {
24
- // 1. Test render via snapshot.
25
- describe('Snapshots and structure', () => {
26
- itShouldRenderStories(stories, Slider);
27
- });
28
-
29
19
  // Common tests suite.
30
- commonTestsSuite(setup, { className: 'wrapper', prop: 'wrapper' }, { className: CLASSNAME });
20
+ commonTestsSuiteRTL(setup, {
21
+ baseClassName: CLASSNAME,
22
+ forwardClassName: 'slider',
23
+ forwardAttributes: 'slider',
24
+ });
31
25
  });
@@ -1,39 +1,39 @@
1
1
  import React from 'react';
2
2
  import range from 'lodash/range';
3
3
  import { AspectRatio, Button, FlexBox, ImageBlock, Slideshow, SlideshowItem, Orientation } from '@lumx/react';
4
- import { boolean, number } from '@storybook/addon-knobs';
5
- import { thumbnailsKnob } from '@lumx/react/stories/knobs/thumbnailsKnob';
4
+ import { IMAGES, LANDSCAPE_IMAGES } from '@lumx/react/stories/controls/image';
6
5
 
7
- export default { title: 'LumX components/slideshow/Slideshow' };
8
-
9
- export const Simple = ({ theme }: any) => {
10
- const images = thumbnailsKnob(6);
11
- const activeIndex = number('Active index', 0);
12
- const groupBy = number('Group by', 1);
13
- const autoPlay = boolean('Autoplay', false);
14
- const interval = number('Autoplay interval (in milliseconds)', 1000);
6
+ export default {
7
+ title: 'LumX components/slideshow/Slideshow',
8
+ component: Slideshow,
9
+ args: Slideshow.defaultProps,
10
+ argTypes: {
11
+ activeIndex: { control: 'number' },
12
+ groupBy: { control: 'number' },
13
+ autoPlay: { control: 'boolean' },
14
+ interval: { control: 'number' },
15
+ },
16
+ };
15
17
 
18
+ export const Simple = ({ theme, images = Object.values(LANDSCAPE_IMAGES), ...props }: any) => {
16
19
  return (
17
20
  <Slideshow
18
21
  aria-label="Simple carousel example"
19
- activeIndex={activeIndex}
20
- autoPlay={autoPlay}
21
- interval={interval}
22
22
  slideshowControlsProps={{
23
23
  nextButtonProps: { label: 'Next' },
24
24
  previousButtonProps: { label: 'Previous' },
25
25
  }}
26
26
  theme={theme}
27
- groupBy={groupBy}
27
+ {...props}
28
28
  style={{ width: '50%' }}
29
29
  slideGroupLabel={(currentGroup, totalGroup) => `${currentGroup} of ${totalGroup}`}
30
30
  >
31
- {images.map(({ image, alt }, index) => (
31
+ {images.map((image: string, index: number) => (
32
32
  <SlideshowItem key={`${image}-${index}`}>
33
33
  <ImageBlock
34
34
  thumbnailProps={{ aspectRatio: AspectRatio.horizontal, loading: 'eager' }}
35
35
  image={image}
36
- alt={alt}
36
+ alt=""
37
37
  theme={theme}
38
38
  />
39
39
  </SlideshowItem>
@@ -42,41 +42,8 @@ export const Simple = ({ theme }: any) => {
42
42
  );
43
43
  };
44
44
 
45
- export const SimpleWithAutoPlay = ({ theme }: any) => {
46
- const images = thumbnailsKnob(6);
47
- const activeIndex = number('Active index', 0);
48
- const groupBy = number('Group by', 1);
49
- const interval = number('Autoplay interval (in milliseconds)', 1000);
50
-
51
- return (
52
- <Slideshow
53
- aria-label="Simple with autoplay example"
54
- activeIndex={activeIndex}
55
- autoPlay
56
- interval={interval}
57
- slideshowControlsProps={{
58
- nextButtonProps: { label: 'Next' },
59
- previousButtonProps: { label: 'Previous' },
60
- playButtonProps: { label: 'Play/Pause' },
61
- }}
62
- theme={theme}
63
- groupBy={groupBy}
64
- style={{ width: '50%' }}
65
- slideGroupLabel={(currentGroup, totalGroup) => `${currentGroup} of ${totalGroup}`}
66
- >
67
- {images.map(({ image, alt }, index) => (
68
- <SlideshowItem key={`${image}-${index}`}>
69
- <ImageBlock
70
- thumbnailProps={{ aspectRatio: AspectRatio.horizontal, loading: 'eager' }}
71
- image={image}
72
- alt={alt}
73
- theme={theme}
74
- />
75
- </SlideshowItem>
76
- ))}
77
- </Slideshow>
78
- );
79
- };
45
+ export const SimpleWithAutoPlay: any = Simple.bind({});
46
+ SimpleWithAutoPlay.args = { autoPlay: true };
80
47
 
81
48
  export const ResponsiveSlideShowSwipe = () => {
82
49
  const slides = range(5);
@@ -124,7 +91,7 @@ export const ResponsiveSlideShowSwipe = () => {
124
91
  const slides = [
125
92
  {
126
93
  id: 0,
127
- src: 'https://www.w3.org/WAI/ARIA/apg/example-index/carousel/images/foyleswarslide__800x600.jpg',
94
+ src: IMAGES.landscape1,
128
95
  alt: 'A man in a suit and fedora and a woman with coiffed hair look sternly into the camera.',
129
96
  title: 'Foyle’s War Revisited',
130
97
  subtitle: '8 pm Sunday, March 8, on TV: Sneak peek at the final season',
@@ -132,14 +99,14 @@ const slides = [
132
99
  },
133
100
  {
134
101
  id: 1,
135
- src: 'https://www.w3.org/WAI/ARIA/apg/example-index/carousel/images/britcomdavidslide__800x600.jpg',
102
+ src: IMAGES.landscape2,
136
103
  alt: 'British flag with WILL-TV host David Thiel.',
137
104
  title: 'Great Britain Vote: 7 pm Sat.',
138
105
  link: '#',
139
106
  },
140
107
  {
141
108
  id: 2,
142
- src: 'https://www.w3.org/WAI/ARIA/apg/example-index/carousel/images/mag800-2__800x600.jpg',
109
+ src: IMAGES.landscape3,
143
110
  alt: 'Mid-American Gardener panelists on the set.',
144
111
  title: 'Mid-American Gardener: Thursdays at 7 pm',
145
112
  subtitle: 'Watch the latest episode',
@@ -147,7 +114,7 @@ const slides = [
147
114
  },
148
115
  {
149
116
  id: 3,
150
- src: 'https://www.w3.org/WAI/ARIA/apg/example-index/carousel/images/foyleswarslide__800x600.jpg',
117
+ src: IMAGES.portrait1,
151
118
  alt: 'A man in a suit and fedora and a woman with coiffed hair look sternly into the camera.',
152
119
  title: 'Foyle’s War Revisited',
153
120
  subtitle: '8 pm Sunday, March 8, on TV: Sneak peek at the final season',
@@ -155,25 +122,23 @@ const slides = [
155
122
  },
156
123
  {
157
124
  id: 4,
158
- src: 'https://www.w3.org/WAI/ARIA/apg/example-index/carousel/images/britcomdavidslide__800x600.jpg',
125
+ src: IMAGES.portrait2,
159
126
  alt: 'British flag with WILL-TV host David Thiel.',
160
127
  title: 'Great Britain Vote: 7 pm Sat.',
161
128
  link: '#',
162
129
  },
163
130
  {
164
131
  id: 5,
165
- src: 'https://www.w3.org/WAI/ARIA/apg/example-index/carousel/images/mag800-2__800x600.jpg',
132
+ src: IMAGES.portrait3,
166
133
  alt: 'Mid-American Gardener panelists on the set.',
167
134
  title: 'Mid-American Gardener: Thursdays at 7 pm',
168
135
  subtitle: 'Watch the latest episode',
169
136
  link: '#',
170
137
  },
171
138
  ];
172
- export const WithComplexContent = () => (
139
+ export const WithComplexContent = ({ slideCount, ...props }: any) => (
173
140
  <Slideshow
174
141
  aria-label="Carousel with complex content"
175
- activeIndex={0}
176
- groupBy={2}
177
142
  slideshowControlsProps={{
178
143
  nextButtonProps: { label: 'Next' },
179
144
  previousButtonProps: { label: 'Previous' },
@@ -181,8 +146,9 @@ export const WithComplexContent = () => (
181
146
  paginationItemProps: (index) => ({ label: `Slide ${index + 1}` }),
182
147
  }}
183
148
  slideGroupLabel={(currentGroup, totalGroup) => `${currentGroup} of ${totalGroup}`}
149
+ {...props}
184
150
  >
185
- {range(number('Slides', 6)).map((nb) => {
151
+ {range(slideCount).map((nb) => {
186
152
  const slide = slides[nb % slides.length];
187
153
 
188
154
  return (
@@ -210,3 +176,7 @@ export const WithComplexContent = () => (
210
176
  })}
211
177
  </Slideshow>
212
178
  );
179
+ WithComplexContent.args = {
180
+ groupBy: 2,
181
+ slideCount: 6,
182
+ };
@@ -1,17 +1,14 @@
1
- import React, { ReactElement } from 'react';
2
- import pick from 'lodash/pick';
1
+ import React from 'react';
3
2
 
4
- import { mount, shallow } from 'enzyme';
5
- import 'jest-enzyme';
6
-
7
- import { commonTestsSuite, itShouldRenderStories, Wrapper } from '@lumx/react/testing/utils';
3
+ import { commonTestsSuiteRTL } from '@lumx/react/testing/utils';
4
+ import { render } from '@testing-library/react';
5
+ import { queryByClassName } from '@lumx/react/testing/utils/queries';
8
6
  import { Slideshow, SlideshowProps } from './Slideshow';
9
- import { SlideshowControls } from './SlideshowControls';
10
- import * as stories from './Slideshow.stories';
7
+ import { Slides } from './Slides';
11
8
 
12
- const CLASSNAME = Slideshow.className as string;
9
+ const CLASSNAME = Slides.className as string;
13
10
 
14
- const setup = ({ ...propsOverride }: Partial<SlideshowProps> = {}, shallowRendering = true) => {
11
+ const setup = (propsOverride: Partial<SlideshowProps> = {}) => {
15
12
  const props: SlideshowProps = {
16
13
  slideshowControlsProps: {
17
14
  nextButtonProps: { label: 'Next' },
@@ -19,21 +16,16 @@ const setup = ({ ...propsOverride }: Partial<SlideshowProps> = {}, shallowRender
19
16
  },
20
17
  ...propsOverride,
21
18
  };
22
-
23
- const renderer: (el: ReactElement) => Wrapper = shallowRendering ? shallow : mount;
24
- const wrapper: Wrapper = renderer(<Slideshow {...props} />);
25
-
26
- return { props, wrapper };
19
+ render(<Slideshow {...props} />);
20
+ const slideShow = queryByClassName(document.body, CLASSNAME);
21
+ return { props, slideShow };
27
22
  };
28
23
 
29
24
  describe(`<${Slideshow.displayName}>`, () => {
30
- // 1. Test render via snapshot.
31
- describe('Snapshots and structure', () => {
32
- itShouldRenderStories(pick(stories, ['default', 'Simple']), {
33
- or: [Slideshow, { path: [Slideshow, SlideshowControls] }],
34
- });
35
- });
36
-
37
25
  // Common tests suite.
38
- commonTestsSuite(setup, { prop: 'wrapper' }, { className: CLASSNAME });
26
+ commonTestsSuiteRTL(setup, {
27
+ baseClassName: CLASSNAME,
28
+ forwardClassName: 'slideShow',
29
+ forwardAttributes: 'slideShow',
30
+ });
39
31
  });
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
2
 
3
3
  import { AspectRatio, ImageBlock, Slides, SlideshowControls, SlideshowItem } from '@lumx/react';
4
- import { thumbnailsKnob } from '@lumx/react/stories/knobs/thumbnailsKnob';
5
4
  import { useFocusWithin } from '@lumx/react/hooks/useFocusWithin';
5
+ import { LANDSCAPE_IMAGES } from '@lumx/react/stories/controls/image';
6
6
 
7
7
  export default { title: 'LumX components/slideshow/Slideshow controls' };
8
8
 
@@ -31,9 +31,7 @@ export const Simple = () => {
31
31
  );
32
32
  };
33
33
 
34
- export const ControllingSlideshow = ({ theme }: any) => {
35
- const images = thumbnailsKnob(6);
36
-
34
+ export const ControllingSlideshow = ({ images = Object.values(LANDSCAPE_IMAGES), theme }: any) => {
37
35
  const {
38
36
  activeIndex: currentIndex,
39
37
  slideshowId,
@@ -97,12 +95,12 @@ export const ControllingSlideshow = ({ theme }: any) => {
97
95
  </div>
98
96
  }
99
97
  >
100
- {images.map(({ image, alt }, index) => (
98
+ {images.map((image: string, index: number) => (
101
99
  <SlideshowItem key={`${image}-${index}`}>
102
100
  <ImageBlock
103
101
  thumbnailProps={{ aspectRatio: AspectRatio.horizontal, loading: 'eager' }}
104
102
  image={image}
105
- alt={alt}
103
+ alt=""
106
104
  theme={theme}
107
105
  />
108
106
  </SlideshowItem>