@lumx/react 3.1.4 → 3.2.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 (144) hide show
  1. package/_internal/types.d.ts +16 -5
  2. package/index.d.ts +51 -4
  3. package/index.js +621 -417
  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 +132 -240
  19. package/src/components/dialog/Dialog.test.tsx +6 -30
  20. package/src/components/dialog/Dialog.tsx +17 -3
  21. package/src/components/dropdown/Dropdown.stories.tsx +1 -186
  22. package/src/components/flag/Flag.stories.tsx +33 -18
  23. package/src/components/flag/Flag.test.tsx +1 -8
  24. package/src/components/flex-box/FlexBox.stories.tsx +151 -238
  25. package/src/components/flex-box/FlexBox.test.tsx +9 -49
  26. package/src/components/generic-block/GenericBlock.stories.jsx +1 -1
  27. package/src/components/grid-column/GridColumn.stories.tsx +46 -0
  28. package/src/components/heading/Heading.stories.tsx +57 -95
  29. package/src/components/icon/Icon.stories.tsx +67 -70
  30. package/src/components/image-block/ImageBlock.stories.tsx +103 -47
  31. package/src/components/image-block/ImageBlock.test.tsx +12 -17
  32. package/src/components/inline-list/InlineList.stories.tsx +45 -29
  33. package/src/components/input-helper/InputHelper.stories.tsx +31 -25
  34. package/src/components/input-label/InputLabel.stories.tsx +33 -10
  35. package/src/components/lightbox/Lightbox.stories.tsx +39 -77
  36. package/src/components/lightbox/Lightbox.test.tsx +12 -17
  37. package/src/components/link/Link.stories.tsx +98 -128
  38. package/src/components/link-preview/LinkPreview.stories.tsx +48 -75
  39. package/src/components/list/List.stories.tsx +59 -84
  40. package/src/components/list/List.test.tsx +8 -17
  41. package/src/components/list/ListDivider.stories.tsx +9 -4
  42. package/src/components/list/ListDivider.test.tsx +12 -17
  43. package/src/components/list/ListItem.stories.tsx +97 -59
  44. package/src/components/list/ListItem.test.tsx +12 -17
  45. package/src/components/list/ListSubheader.stories.tsx +8 -5
  46. package/src/components/list/ListSubheader.test.tsx +12 -18
  47. package/src/components/message/Message.stories.tsx +51 -22
  48. package/src/components/mosaic/Mosaic.stories.tsx +78 -74
  49. package/src/components/mosaic/Mosaic.test.tsx +0 -31
  50. package/src/components/navigation/Navigation.stories.tsx +67 -0
  51. package/src/components/navigation/Navigation.test.tsx +58 -0
  52. package/src/components/navigation/Navigation.tsx +62 -0
  53. package/src/components/navigation/NavigationItem.test.tsx +37 -0
  54. package/src/components/navigation/NavigationItem.tsx +89 -0
  55. package/src/components/navigation/NavigationSection.test.tsx +126 -0
  56. package/src/components/navigation/NavigationSection.tsx +109 -0
  57. package/src/components/navigation/context.tsx +6 -0
  58. package/src/components/navigation/index.ts +1 -0
  59. package/src/components/notification/Notifications.stories.tsx +52 -47
  60. package/src/components/popover/Popover.stories.tsx +68 -201
  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/skeleton/SkeletonCircle.stories.tsx +37 -21
  68. package/src/components/skeleton/SkeletonCircle.test.tsx +12 -17
  69. package/src/components/skeleton/SkeletonRectangle.stories.tsx +74 -99
  70. package/src/components/skeleton/SkeletonRectangle.test.tsx +12 -17
  71. package/src/components/skeleton/SkeletonTypography.test.tsx +12 -17
  72. package/src/components/slider/Slider.stories.tsx +41 -25
  73. package/src/components/slider/Slider.test.tsx +12 -18
  74. package/src/components/slideshow/Slideshow.stories.tsx +31 -61
  75. package/src/components/slideshow/Slideshow.test.tsx +15 -23
  76. package/src/components/slideshow/SlideshowControls.stories.tsx +4 -6
  77. package/src/components/switch/Switch.stories.tsx +35 -32
  78. package/src/components/table/Table.test.tsx +12 -17
  79. package/src/components/tabs/Tabs.stories.tsx +4 -3
  80. package/src/components/text/Text.stories.tsx +130 -0
  81. package/src/components/text-field/TextField.stories.tsx +114 -148
  82. package/src/components/thumbnail/Thumbnail.stories.tsx +106 -255
  83. package/src/components/thumbnail/Thumbnail.test.tsx +12 -35
  84. package/src/components/tooltip/Tooltip.stories.tsx +51 -136
  85. package/src/components/user-block/UserBlock.stories.tsx +67 -56
  86. package/src/components/user-block/UserBlock.test.tsx +1 -5
  87. package/src/index.ts +1 -0
  88. package/src/stories/controls/color.ts +6 -0
  89. package/src/stories/controls/element.ts +6 -0
  90. package/src/stories/controls/focusPoint.ts +1 -0
  91. package/src/stories/controls/icons.ts +6 -0
  92. package/src/stories/{knobs → controls}/image.ts +6 -16
  93. package/src/stories/controls/selectArgType.ts +4 -0
  94. package/src/stories/controls/theme.ts +3 -0
  95. package/src/stories/controls/typography.ts +5 -0
  96. package/src/stories/controls/withUndefined.ts +1 -0
  97. package/src/stories/decorators/withChromaticForceScreenSize.tsx +8 -0
  98. package/src/stories/decorators/withCombinations.tsx +99 -0
  99. package/src/stories/decorators/withNestedProps.tsx +23 -0
  100. package/src/stories/{withResizableBox.tsx → decorators/withResizableBox.tsx} +6 -10
  101. package/src/stories/decorators/withValueOnChange.tsx +18 -0
  102. package/src/stories/decorators/withWrapper.tsx +19 -0
  103. package/src/stories/utils/CustomLink.tsx +8 -2
  104. package/src/stories/{knobs → utils}/lorem.ts +9 -9
  105. package/src/testing/utils/commonTestsSuiteRTL.ts +2 -3
  106. package/src/testing/utils/index.ts +0 -2
  107. package/src/untypped-modules.d.ts +0 -2
  108. package/src/utils/MaterialThemeSwitcher/MaterialThemeSwitcher.tsx +1 -1
  109. package/src/utils/ThemeContext.ts +4 -0
  110. package/src/utils/forwardRefPolymorphic.ts +9 -0
  111. package/src/utils/type.ts +28 -4
  112. package/src/components/alert-dialog/__snapshots__/AlertDialog.test.tsx.snap +0 -551
  113. package/src/components/avatar/__snapshots__/Avatar.test.tsx.snap +0 -681
  114. package/src/components/comment-block/__snapshots__/CommentBlock.test.tsx.snap +0 -92
  115. package/src/components/dialog/__snapshots__/Dialog.test.tsx.snap +0 -960
  116. package/src/components/expansion-panel/ExpansionPanel.stories.tsx +0 -65
  117. package/src/components/flag/__snapshots__/Flag.test.tsx.snap +0 -133
  118. package/src/components/flex-box/__snapshots__/FlexBox.test.tsx.snap +0 -492
  119. package/src/components/grid-column/GridColumn.stories.jsx +0 -56
  120. package/src/components/image-block/__snapshots__/ImageBlock.test.tsx.snap +0 -64
  121. package/src/components/lightbox/__snapshots__/Lightbox.test.tsx.snap +0 -194
  122. package/src/components/list/__snapshots__/List.test.tsx.snap +0 -360
  123. package/src/components/list/__snapshots__/ListDivider.test.tsx.snap +0 -7
  124. package/src/components/list/__snapshots__/ListItem.test.tsx.snap +0 -160
  125. package/src/components/list/__snapshots__/ListSubheader.test.tsx.snap +0 -9
  126. package/src/components/mosaic/__snapshots__/Mosaic.test.tsx.snap +0 -357
  127. package/src/components/post-block/__snapshots__/PostBlock.test.tsx.snap +0 -139
  128. package/src/components/skeleton/__snapshots__/SkeletonCircle.test.tsx.snap +0 -54
  129. package/src/components/skeleton/__snapshots__/SkeletonRectangle.test.tsx.snap +0 -177
  130. package/src/components/skeleton/__snapshots__/SkeletonTypography.test.tsx.snap +0 -174
  131. package/src/components/slider/__snapshots__/Slider.test.tsx.snap +0 -122
  132. package/src/components/slideshow/__snapshots__/Slideshow.test.tsx.snap +0 -157
  133. package/src/components/table/__snapshots__/Table.test.tsx.snap +0 -263
  134. package/src/components/text/Text.stories.jsx +0 -75
  135. package/src/components/thumbnail/__snapshots__/Thumbnail.test.tsx.snap +0 -130
  136. package/src/components/user-block/__snapshots__/UserBlock.test.tsx.snap +0 -362
  137. package/src/stories/chromaticForceScreenSize.tsx +0 -7
  138. package/src/stories/knobs/buttonKnob.ts +0 -9
  139. package/src/stories/knobs/emphasisKnob.ts +0 -8
  140. package/src/stories/knobs/enumKnob.ts +0 -14
  141. package/src/stories/knobs/focusKnob.ts +0 -3
  142. package/src/stories/knobs/sizeKnob.ts +0 -5
  143. package/src/stories/knobs/thumbnailsKnob.ts +0 -9
  144. package/src/testing/utils/itShouldRenderStories.tsx +0 -103
@@ -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 { PostBlock, PostBlockProps } from './PostBlock';
7
- import * as stories from '../../stories/generated/PostBlock/Demos.stories';
8
7
 
9
8
  const CLASSNAME = PostBlock.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<PostBlockProps> = {}, shallowRendering = true) => {
15
- const renderer: any = shallowRendering ? shallow : mount;
16
- const wrapper: any = renderer(<PostBlock {...(props as any)} />);
17
- return { props, wrapper };
10
+ const setup = (props: Partial<PostBlockProps> = {}) => {
11
+ render(<PostBlock {...(props as any)} />);
12
+ const postBlock = queryByClassName(document.body, CLASSNAME);
13
+ return { props, postBlock };
18
14
  };
19
15
 
20
16
  describe(`<${PostBlock.displayName}>`, () => {
21
- // 1. Test render via snapshot.
22
- describe('Snapshots and structure', () => {
23
- itShouldRenderStories(stories, PostBlock);
24
- });
25
-
26
17
  // Common tests suite.
27
- commonTestsSuite(setup, { className: 'wrapper', prop: 'wrapper' }, { className: CLASSNAME });
18
+ commonTestsSuiteRTL(setup, {
19
+ baseClassName: CLASSNAME,
20
+ forwardClassName: 'postBlock',
21
+ forwardAttributes: 'postBlock',
22
+ });
28
23
  });
@@ -1,18 +1,30 @@
1
- import { ProgressCircular } from '@lumx/react';
2
- import React, { Fragment } from 'react';
1
+ import { ProgressCircular, ProgressCircularSize, Size } from '@lumx/react';
2
+ import { getSelectArgType } from '@lumx/react/stories/controls/selectArgType';
3
+ import { withCombinations } from '@lumx/react/stories/decorators/withCombinations';
4
+
5
+ const sizes: Array<ProgressCircularSize> = [Size.xxs, Size.xs, Size.s, Size.m];
3
6
 
4
7
  export default {
5
8
  title: 'LumX components/progress/ProgressCircular',
9
+ component: ProgressCircular,
10
+ args: ProgressCircular.defaultProps,
11
+ argTypes: {
12
+ size: getSelectArgType<ProgressCircularSize>(sizes),
13
+ },
6
14
  };
7
15
 
8
- const SIZES = ['xxs', 'xs', 's', 'm', undefined] as const;
9
-
10
- export const Default = ({ theme }: any) => <ProgressCircular theme={theme} />;
16
+ /**
17
+ * Default progress circular
18
+ */
19
+ export const Default = {};
11
20
 
12
- export const Sizes = ({ theme }: any) =>
13
- SIZES.map((size) => (
14
- <Fragment key={String(size)}>
15
- <span>{String(size)}</span>
16
- <ProgressCircular theme={theme} size={size} />
17
- </Fragment>
18
- ));
21
+ /**
22
+ * All sizes
23
+ */
24
+ export const AllSizes = {
25
+ decorators: [
26
+ withCombinations({
27
+ combinations: { cols: { key: 'size', options: sizes } },
28
+ }),
29
+ ],
30
+ };
@@ -1,8 +1,12 @@
1
1
  import { ProgressLinear } from '@lumx/react';
2
- import React from 'react';
3
2
 
4
3
  export default {
5
4
  title: 'LumX components/progress/ProgressLinear',
5
+ component: ProgressLinear,
6
+ args: ProgressLinear.defaultProps,
6
7
  };
7
8
 
8
- export const Default = ({ theme }: any) => <ProgressLinear theme={theme} />;
9
+ /**
10
+ * Default progress linear
11
+ */
12
+ export const Default = {};
@@ -1,28 +1,39 @@
1
1
  import { RadioButton } from '@lumx/react';
2
- import { text } from '@storybook/addon-knobs';
3
- import noop from 'lodash/noop';
4
- import React from 'react';
2
+ import { withValueOnChange } from '@lumx/react/stories/decorators/withValueOnChange';
3
+ import { loremIpsum } from '@lumx/react/stories/utils/lorem';
5
4
 
6
- export default { title: 'LumX components/radio-button/Radio button' };
5
+ export default {
6
+ title: 'LumX components/radio-button/Radio button',
7
+ component: RadioButton,
8
+ args: {
9
+ ...RadioButton.defaultProps,
10
+ name: 'radiobutton-html-name',
11
+ value: 'radiobutton-html-value',
12
+ },
13
+ argTypes: {
14
+ onChange: { action: true },
15
+ name: { control: false },
16
+ value: { control: false },
17
+ },
18
+ decorators: [
19
+ withValueOnChange({
20
+ valueProp: 'isChecked',
21
+ valueTransform: (value) => value === 'radiobutton-html-value',
22
+ }),
23
+ ],
24
+ };
7
25
 
8
- export const SimpleRadioButton = ({ theme }: any) => (
9
- <RadioButton
10
- isChecked={false}
11
- label={text('Label', 'Radio button')}
12
- name="test1"
13
- theme={theme}
14
- value="lorem"
15
- onChange={noop}
16
- />
17
- );
26
+ /**
27
+ * Default radio button
28
+ */
29
+ export const Default = {};
18
30
 
19
- export const SimpleCheckedRadioButton = ({ theme }: any) => (
20
- <RadioButton
21
- isChecked
22
- label={text('Label', 'Radio button')}
23
- name="test1"
24
- theme={theme}
25
- value="lorem"
26
- onChange={noop}
27
- />
28
- );
31
+ /**
32
+ * With label and helper
33
+ */
34
+ export const LabelAndHelper = {
35
+ args: {
36
+ label: 'Radio button label',
37
+ helper: loremIpsum('tiny'),
38
+ },
39
+ };
@@ -1,13 +1,15 @@
1
1
  import { mdiBullhornOutline } from '@lumx/icons/';
2
2
  import { List, ListItem, Select, Size, TextField } from '@lumx/react';
3
3
  import { useBooleanState } from '@lumx/react/hooks/useBooleanState';
4
- import { text } from '@storybook/addon-knobs';
5
4
  import noop from 'lodash/noop';
6
5
  import range from 'lodash/range';
7
6
  import React, { SyntheticEvent, useState } from 'react';
8
7
  import { SelectVariant } from './constants';
9
8
 
10
- export default { title: 'LumX components/select/Select' };
9
+ export default {
10
+ title: 'LumX components/select/Select',
11
+ component: Select,
12
+ };
11
13
 
12
14
  const CHOICES = ['First item', 'Second item', 'Third item'];
13
15
 
@@ -112,8 +114,8 @@ export const DisabledSelect = ({ theme }: any) => {
112
114
  <Select
113
115
  isOpen={false}
114
116
  value=""
115
- label={text('label', 'My select')}
116
- placeholder={text('placeholder', 'Placeholder')}
117
+ label="My select"
118
+ placeholder="Placeholder"
117
119
  theme={theme}
118
120
  onInputClick={noop}
119
121
  onDropdownClose={noop}
@@ -204,13 +206,7 @@ export const SelectWithAnotherField = ({ theme }: any) => {
204
206
 
205
207
  return (
206
208
  <>
207
- <TextField
208
- value={text('Value', 'myvalue')}
209
- label={text('Label', 'I am the label')}
210
- placeholder={text('Placeholder', 'ex: A value')}
211
- theme={theme}
212
- onChange={noop}
213
- />
209
+ <TextField value="myvalue" label="I am the label" placeholder="ex: A value" theme={theme} onChange={noop} />
214
210
  <Select
215
211
  style={{ width: '100%' }}
216
212
  isOpen={isOpen}
@@ -255,8 +251,8 @@ export const SelectWithNoData = ({ theme }: any) => {
255
251
  <Select
256
252
  isOpen={isOpen}
257
253
  value=""
258
- label={text('label', 'My select')}
259
- placeholder={text('placeholder', 'Placeholder')}
254
+ label="My select"
255
+ placeholder="Placeholder"
260
256
  theme={theme}
261
257
  onInputClick={toggleSelect}
262
258
  onDropdownClose={closeSelect}
@@ -277,10 +273,10 @@ export const SelectWithHelper = ({ theme }: any) => {
277
273
  <Select
278
274
  isOpen={isOpen}
279
275
  value=""
280
- label={text('label', 'Country')}
281
- placeholder={text('placeholder', 'Your country')}
276
+ label="Country"
277
+ placeholder="Your country"
282
278
  theme={theme}
283
- helper={text('helper', 'This is used in analytics')}
279
+ helper="This is used in analytics"
284
280
  onInputClick={toggleSelect}
285
281
  onDropdownClose={closeSelect}
286
282
  >
@@ -302,14 +298,14 @@ export const SelectWithError = ({ theme }: any) => {
302
298
  <Select
303
299
  isOpen={isOpen}
304
300
  value=""
305
- label={text('label', 'Country')}
306
- placeholder={text('placeholder', 'Your country')}
301
+ label="Country"
302
+ placeholder="Your country"
307
303
  theme={theme}
308
- helper={text('helper', 'This is used in analytics')}
304
+ helper="This is used in analytics"
309
305
  onInputClick={toggleSelect}
310
306
  onDropdownClose={closeSelect}
311
307
  hasError
312
- error={text('Error', 'Please select something :)')}
308
+ error="Please select something :)"
313
309
  >
314
310
  <List theme={theme} isClickable>
315
311
  {CHOICES.map((choice) => (
@@ -329,10 +325,10 @@ export const SelectSuccess = ({ theme }: any) => {
329
325
  <Select
330
326
  isOpen={isOpen}
331
327
  value=""
332
- label={text('label', 'Country')}
333
- placeholder={text('placeholder', 'Your country')}
328
+ label="Country"
329
+ placeholder="Your country"
334
330
  theme={theme}
335
- helper={text('helper', 'This is used in analytics')}
331
+ helper="This is used in analytics"
336
332
  onInputClick={toggleSelect}
337
333
  onDropdownClose={closeSelect}
338
334
  isValid
@@ -1,25 +1,41 @@
1
- import React from 'react';
1
+ import { Size, SkeletonCircle, SkeletonCircleProps } 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 { FlexBox, Orientation, Size, SkeletonCircle, ColorPalette } from '@lumx/react';
6
+ const sizes: SkeletonCircleProps['size'][] = [Size.xxs, Size.xs, Size.s, Size.m, Size.l, Size.xl, Size.xxl];
4
7
 
5
- export default { title: 'LumX components/skeleton/Skeleton Circle' };
8
+ export default {
9
+ title: 'LumX components/skeleton/Skeleton Circle',
10
+ component: SkeletonCircle,
11
+ args: SkeletonCircle.defaultProps,
12
+ argTypes: {
13
+ size: getSelectArgType(sizes),
14
+ color: colorArgType,
15
+ },
16
+ };
6
17
 
7
- const sizes = [Size.xxs, Size.xs, Size.s, Size.m, Size.l, Size.xl, Size.xxl] as const;
8
- const colors = Object.values(ColorPalette);
18
+ /**
19
+ * All sizes
20
+ */
21
+ export const AllSize = {
22
+ argTypes: { size: { control: false } },
23
+ decorators: [
24
+ withCombinations({
25
+ combinations: { cols: { key: 'size', options: sizes } },
26
+ }),
27
+ ],
28
+ };
9
29
 
10
- export const Circle = ({ theme }: any) => (
11
- <>
12
- Sizes:
13
- <FlexBox orientation={Orientation.horizontal}>
14
- {sizes.map((size) => (
15
- <SkeletonCircle theme={theme} key={size} size={size} className="lumx-spacing-margin" />
16
- ))}
17
- </FlexBox>
18
- Colors:
19
- <FlexBox orientation={Orientation.horizontal}>
20
- {colors.map((color) => (
21
- <SkeletonCircle theme={theme} size={Size.m} key={color} color={color} className="lumx-spacing-margin" />
22
- ))}
23
- </FlexBox>
24
- </>
25
- );
30
+ /**
31
+ * All colors
32
+ */
33
+ export const AllColor = {
34
+ args: { size: Size.m },
35
+ argTypes: { color: { control: false } },
36
+ decorators: [
37
+ withCombinations({
38
+ combinations: { cols: { key: 'color', options: ALL_COLORS } },
39
+ }),
40
+ ],
41
+ };
@@ -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 { SkeletonCircle, SkeletonCircleProps } from './SkeletonCircle';
7
- import * as stories from './SkeletonCircle.stories';
8
7
 
9
8
  const CLASSNAME = SkeletonCircle.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<SkeletonCircleProps> = {}, shallowRendering = true) => {
15
- const renderer: any = shallowRendering ? shallow : mount;
16
- const wrapper: any = renderer(<SkeletonCircle {...(props as any)} />);
17
- return { props, wrapper };
10
+ const setup = (props: Partial<SkeletonCircleProps> = {}) => {
11
+ render(<SkeletonCircle {...(props as any)} />);
12
+ const skeletonCircle = queryByClassName(document.body, CLASSNAME);
13
+ return { props, skeletonCircle };
18
14
  };
19
15
 
20
16
  describe(`<${SkeletonCircle.displayName}>`, () => {
21
- // 1. Test render via snapshot.
22
- describe('Snapshots and structure', () => {
23
- itShouldRenderStories(stories, SkeletonCircle);
24
- });
25
-
26
17
  // Common tests suite.
27
- commonTestsSuite(setup, { className: 'wrapper', prop: 'wrapper' }, { className: CLASSNAME });
18
+ commonTestsSuiteRTL(setup, {
19
+ baseClassName: CLASSNAME,
20
+ forwardClassName: 'skeletonCircle',
21
+ forwardAttributes: 'skeletonCircle',
22
+ });
28
23
  });
@@ -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
  });