@nuskin/foundation-ui-components 1.0.0-develop.5 → 1.0.0-develop.7
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/package.json +17 -12
- package/src/common/accordion/NsAccordion.tsx +29 -39
- package/src/common/accordion/NsAccordionHeader.tsx +32 -17
- package/src/common/accordion/NsAccordionItem.tsx +16 -4
- package/src/common/accordion/NsCollapse.tsx +73 -35
- package/src/common/accordion/NsToggleSection.tsx +14 -3
- package/src/common/accordion/ToggleSection.styled.tsx +8 -7
- package/src/common/accordion/colorMap.ts +117 -0
- package/src/common/accordion/enums.ts +15 -0
- package/src/common/accordion/index.ts +1 -0
- package/src/common/accordion/specs/NsAccordion.spec.tsx +100 -31
- package/src/common/accordion/specs/NsAccordionHeader.spec.tsx +77 -10
- package/src/common/accordion/specs/NsAccordionItem.spec.tsx +23 -10
- package/src/common/accordion/specs/NsCollapse.spec.tsx +106 -17
- package/src/common/accordion/specs/NsToggleSection.spec.tsx +46 -14
- package/src/common/accordion/stories/NsAccordion.stories.tsx +27 -14
- package/src/common/accordion/stories/NsAccordionHeader.stories.tsx +4 -1
- package/src/common/accordion/stories/NsAccordionItem.stories.tsx +3 -3
- package/src/common/accordion/stories/NsCollapse.stories.tsx +3 -3
- package/src/common/accordion/stories/NsToggleSection.stories.tsx +2 -3
- package/src/common/accordion/stories/data.tsx +157 -19
- package/src/common/accordion/types.d.ts +56 -49
- package/src/common/alert/Header.tsx +29 -0
- package/src/common/alert/NsAlert.spec.tsx +46 -13
- package/src/common/alert/NsAlert.stories.tsx +3 -3
- package/src/common/alert/{NsAlert.styled.ts → NsAlert.styled.tsx} +22 -22
- package/src/common/alert/NsAlert.tsx +22 -87
- package/src/common/alert/types.d.ts +7 -7
- package/src/common/auth-dropdown/NsAuthDropdown.spec.tsx +23 -5
- package/src/common/auth-dropdown/NsAuthDropdown.stories.tsx +1 -1
- package/src/common/auth-dropdown/NsAuthDropdown.styled.ts +11 -7
- package/src/common/auth-dropdown/NsAuthDropdown.tsx +4 -4
- package/src/common/autocomplete/NsAutocomplete.spec.tsx +39 -6
- package/src/common/autocomplete/NsAutocomplete.stories.tsx +45 -7
- package/src/common/autocomplete/NsAutocomplete.tsx +31 -18
- package/src/common/autocomplete/mock/MockUI.tsx +1 -0
- package/src/common/autocomplete/types.d.ts +8 -6
- package/src/common/banner/NsBanner.spec.tsx +12 -3
- package/src/common/banner/NsBanner.stories.tsx +1 -1
- package/src/common/brand-components/NsBrand.stories.tsx +1 -1
- package/src/common/brand-components/NsBrandComponent.tsx +2 -2
- package/src/common/breadcrumb/NsBreadcrumb.spec.tsx +8 -3
- package/src/common/breadcrumb/NsBreadcrumb.stories.tsx +1 -1
- package/src/common/breadcrumb/NsBreadcrumb.tsx +2 -2
- package/src/common/breadcrumb/data.ts +8 -5
- package/src/common/button/NsButton.spec.tsx +65 -49
- package/src/common/button/NsButton.stories.tsx +59 -2
- package/src/common/button/NsButton.styled.tsx +49 -66
- package/src/common/button/NsButton.tsx +1 -2
- package/src/common/button/helper.ts +82 -0
- package/src/common/button/types.d.ts +2 -0
- package/src/common/card/stories/NsBgCard.stories.tsx +1 -1
- package/src/common/card/stories/NsBrandProductCard.stories.tsx +1 -1
- package/src/common/card/stories/NsFfgCard.stories.tsx +5 -2
- package/src/common/card/styled/NsFfgStyled.tsx +1 -1
- package/src/common/carousal/stories/NSCarousal.stories.tsx +1 -1
- package/src/common/carousal/stories/NsScrollingCarousal.stories.tsx +1 -1
- package/src/common/cart-icon/NsCartIcon.stories.tsx +1 -1
- package/src/common/checkbox/NsCheckbox.stories.tsx +1 -1
- package/src/common/checkbox/NsCheckbox.styled.tsx +15 -16
- package/src/common/checkbox/NsCheckbox.tsx +1 -1
- package/src/common/column-control/stories/DivArray.stories.tsx +1 -1
- package/src/common/column-control/stories/NsColumnControl.stories.tsx +1 -1
- package/src/common/column-control/stories/NsFlexColumns.stories.tsx +1 -1
- package/src/common/column-control/stories/NsGridColumns.stories.tsx +1 -1
- package/src/common/column-control/styled/common.ts +1 -1
- package/src/common/column-control/utils.ts +4 -4
- package/src/common/common.types.d.ts +11 -1
- package/src/common/dropdown/NsDropdown.styled.tsx +23 -18
- package/src/common/dropdown/stories/NsDropdown.stories.tsx +1 -1
- package/src/common/dropdown/stories/NsDropdownCountry.stories.tsx +1 -1
- package/src/common/flag/NsFlag.stories.tsx +1 -1
- package/src/common/hooks/index.ts +2 -0
- package/src/common/hooks/specs/useWindowSize.spec.tsx +19 -0
- package/src/common/hooks/useAccordionMap.tsx +39 -0
- package/src/common/hooks/useWindowSize.tsx +30 -0
- package/src/common/icon/NsIcon.stories.tsx +1 -1
- package/src/common/icon/NsIconVariants.ts +1 -0
- package/src/common/image/NsImage.spec.tsx +56 -6
- package/src/common/image/NsImage.stories.tsx +1 -1
- package/src/common/image/NsImage.tsx +23 -11
- package/src/common/image/NsNextImage.stories.tsx +1 -1
- package/src/common/index.ts +2 -0
- package/src/common/input/InputWrapper.tsx +12 -7
- package/src/common/input/NsInputField.tsx +1 -1
- package/src/common/label/NsLabel.stories.tsx +1 -1
- package/src/common/link/NsLink.stories.tsx +1 -1
- package/src/common/nav-product-card/NsNavProductCard.stories.tsx +1 -1
- package/src/common/nav-tab/NsNavTab.stories.tsx +1 -1
- package/src/common/radiogroup/NsRadioGroup.spec.tsx +24 -25
- package/src/common/radiogroup/NsRadioGroup.stories.tsx +14 -32
- package/src/common/radiogroup/NsRadioGroup.styled.tsx +17 -15
- package/src/common/radiogroup/NsRadioGroup.tsx +6 -5
- package/src/common/search-bar/NsSearchBar.tsx +1 -3
- package/src/common/select/NsSelect.spec.tsx +10 -17
- package/src/common/select/NsSelect.styled.tsx +53 -34
- package/src/common/select/stories/NsSelect.stories.tsx +11 -11
- package/src/common/select/types.d.ts +3 -3
- package/src/common/spinner/NsSpinner.spec.tsx +21 -0
- package/src/common/spinner/NsSpinner.stories.tsx +26 -0
- package/src/common/spinner/NsSpinner.styled.tsx +344 -0
- package/src/common/spinner/NsSpinner.tsx +14 -0
- package/src/common/spinner/icons/Spinner.tsx +161 -0
- package/src/common/spinner/index.ts +2 -0
- package/src/common/spinner/types.ts +5 -0
- package/src/common/table/NsTable.stories.tsx +1 -1
- package/src/common/table/NsTable.tsx +32 -49
- package/src/common/table/NsTableHeader.tsx +30 -51
- package/src/common/text-strip/NsTextStrip.stories.tsx +1 -1
- package/src/common/typography/NsTypography.stories.tsx +1 -1
- package/src/common/util.ts +1 -0
- package/src/common/videos/NsVideo.stories.tsx +1 -1
- package/src/common/videos/types.d.ts +1 -1
- /package/src/common/brand-components/{NsBrandContanier.styled.tsx → NsBrandContainer.styled.tsx} +0 -0
|
@@ -1,10 +1,60 @@
|
|
|
1
1
|
import { render, screen } from '@/test-utils/index';
|
|
2
|
-
import NsImage from '
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
import { NsImage } from '../';
|
|
3
|
+
|
|
4
|
+
describe('NsImage component', () => {
|
|
5
|
+
it('1. renders', () => {
|
|
6
|
+
const alt = 'test image';
|
|
7
|
+
render(<NsImage src="image.jpg" width={300} height={300} alt={alt} />);
|
|
8
|
+
const imgElement = screen.getByAltText(alt);
|
|
8
9
|
expect(imgElement).toBeInTheDocument();
|
|
9
10
|
});
|
|
11
|
+
|
|
12
|
+
it('2. renders with correct src and alt attributes', () => {
|
|
13
|
+
const src = 'image.jpg';
|
|
14
|
+
const alt = 'test image';
|
|
15
|
+
const { getByAltText } = render(<NsImage src={src} alt={alt} />);
|
|
16
|
+
const image = getByAltText(alt);
|
|
17
|
+
expect(image).toHaveAttribute('src', src);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('3. renders with width and height if variant is not provided', () => {
|
|
21
|
+
const { getByAltText } = render(<NsImage src="image.jpg" alt="test image" width={300} height={300} />);
|
|
22
|
+
const image = getByAltText('test image');
|
|
23
|
+
expect(image).toHaveAttribute('width', '300');
|
|
24
|
+
expect(image).toHaveAttribute('height', '300');
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('4. renders with correct width and height based on variant', () => {
|
|
28
|
+
const { getByAltText } = render(<NsImage src="image.jpg" alt="test image" variant="icon" />);
|
|
29
|
+
const image = getByAltText('test image');
|
|
30
|
+
expect(image).toHaveAttribute('width', '60');
|
|
31
|
+
expect(image).toHaveAttribute('height', '60');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('5. renders with correct width and height if variant is "fill"', () => {
|
|
35
|
+
const { getByAltText } = render(<NsImage src="image.jpg" alt="test image" variant="fill" />);
|
|
36
|
+
const image = getByAltText('test image');
|
|
37
|
+
expect(image).toHaveAttribute('width', '100%');
|
|
38
|
+
expect(image).toHaveAttribute('height', 'auto');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('6. renders with correct width and height if variant is "award"', () => {
|
|
42
|
+
const { getByAltText } = render(<NsImage src="image.jpg" alt="test image" variant="award" />);
|
|
43
|
+
const image = getByAltText('test image');
|
|
44
|
+
expect(image).toHaveAttribute('width', '130');
|
|
45
|
+
expect(image).toHaveAttribute('height', '130');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('7. renders with correct width and height if variant is "product"', () => {
|
|
49
|
+
const { getByAltText } = render(<NsImage src="image.jpg" alt="test image" variant="product" />);
|
|
50
|
+
const image = getByAltText('test image');
|
|
51
|
+
expect(image).toHaveAttribute('width', '300');
|
|
52
|
+
expect(image).toHaveAttribute('height', '300');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('8. renders with additional props', () => {
|
|
56
|
+
const { getByAltText } = render(<NsImage src="image.jpg" alt="test image" className="custom-image" />);
|
|
57
|
+
const image = getByAltText('test image');
|
|
58
|
+
expect(image).toHaveClass('custom-image');
|
|
59
|
+
});
|
|
10
60
|
});
|
|
@@ -2,18 +2,30 @@ import { NsImageProps } from './types.d';
|
|
|
2
2
|
|
|
3
3
|
// eslint-disable-next-line no-unused-vars
|
|
4
4
|
const NsImage = ({ src, width, height, alt, variant, ...rest }: NsImageProps) => {
|
|
5
|
-
let cHeight
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
5
|
+
let cHeight, cWidth;
|
|
6
|
+
switch (variant) {
|
|
7
|
+
case 'product':
|
|
8
|
+
cHeight = 300;
|
|
9
|
+
cWidth = 300;
|
|
10
|
+
break;
|
|
11
|
+
case 'icon':
|
|
12
|
+
cHeight = 60;
|
|
13
|
+
cWidth = 60;
|
|
14
|
+
break;
|
|
15
|
+
case 'award':
|
|
16
|
+
cHeight = 130;
|
|
17
|
+
cWidth = 130;
|
|
18
|
+
break;
|
|
19
|
+
case 'fill':
|
|
20
|
+
cHeight = 'auto';
|
|
21
|
+
cWidth = '100%';
|
|
22
|
+
break;
|
|
23
|
+
default:
|
|
24
|
+
cHeight = height;
|
|
25
|
+
cWidth = width;
|
|
26
|
+
break;
|
|
15
27
|
}
|
|
16
28
|
// eslint-disable-next-line @next/next/no-img-element
|
|
17
|
-
return <img src={src} alt={alt} height={cHeight} width={cWidth} />;
|
|
29
|
+
return <img src={src} alt={alt} height={cHeight} width={cWidth} {...rest} />;
|
|
18
30
|
};
|
|
19
31
|
export default NsImage;
|
|
@@ -7,7 +7,7 @@ type Story = StoryObj<ComponentType>;
|
|
|
7
7
|
type MetaStory = Meta<ComponentType>;
|
|
8
8
|
|
|
9
9
|
export default {
|
|
10
|
-
title: 'Components/NsNextImage',
|
|
10
|
+
title: 'Components/Data Display/NsNextImage',
|
|
11
11
|
component: NsNextImage,
|
|
12
12
|
decorators: [withCenterDecorator],
|
|
13
13
|
} as MetaStory;
|
package/src/common/index.ts
CHANGED
|
@@ -14,6 +14,7 @@ export * from './checkbox';
|
|
|
14
14
|
export * from './common.types.d';
|
|
15
15
|
export * from './dropdown';
|
|
16
16
|
export * from './flag';
|
|
17
|
+
export * from './hooks';
|
|
17
18
|
export * from './icon';
|
|
18
19
|
export * from './image';
|
|
19
20
|
export * from './input';
|
|
@@ -26,3 +27,4 @@ export * from './table';
|
|
|
26
27
|
export * from './typography';
|
|
27
28
|
export * from './email-simple';
|
|
28
29
|
export * from './radiogroup';
|
|
30
|
+
export * from './spinner';
|
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
import { Box } from '@mui/material';
|
|
2
|
-
import { styled, nuskinTheme } from '@nuskin/foundation-theme';
|
|
3
|
-
import {
|
|
2
|
+
import { styled, nuskinTheme, ColorUtils, FoundationTheme } from '@nuskin/foundation-theme';
|
|
3
|
+
import {fieldStateType} from './types.d';
|
|
4
4
|
|
|
5
|
+
const { isDarkMode } = ColorUtils;
|
|
5
6
|
const { colors } = nuskinTheme;
|
|
6
7
|
|
|
7
8
|
const options = {
|
|
8
9
|
shouldForwardProp: (propKey: string) => propKey !== 'fieldState',
|
|
9
10
|
};
|
|
10
11
|
|
|
11
|
-
const getInputBorderColor = (
|
|
12
|
+
const getInputBorderColor = (
|
|
13
|
+
palette: FoundationTheme.Theme['palette'],
|
|
14
|
+
fieldState: fieldStateType,
|
|
15
|
+
isLight = true
|
|
16
|
+
): string => {
|
|
12
17
|
if (fieldState === 'success') {
|
|
13
|
-
return
|
|
18
|
+
return colors.success[40];
|
|
14
19
|
} else if (fieldState === 'error') {
|
|
15
20
|
return isLight ? colors.red[40] : colors.red[20];
|
|
16
21
|
} else {
|
|
17
|
-
return palette
|
|
22
|
+
return palette?.primary.main ?? '';
|
|
18
23
|
}
|
|
19
24
|
};
|
|
20
25
|
|
|
@@ -28,7 +33,7 @@ const InputWrapper = styled(
|
|
|
28
33
|
)<InputWrapperType>(({ theme, fieldState }) => {
|
|
29
34
|
/* default value added so that unit tests do not fail */
|
|
30
35
|
const { palette = { primary: { main: '', contrastText: '' } } } = theme;
|
|
31
|
-
const isLight =
|
|
36
|
+
const isLight = isDarkMode({ theme });
|
|
32
37
|
const inputFocusedBorder = isLight ? colors.accentColorB[20] : colors.accentColorB[30];
|
|
33
38
|
const inputDisabledBg = isLight ? colors.neutral[30] : colors.neutral[70];
|
|
34
39
|
const inputDisabledBorder = isLight ? colors.neutral[60] : colors.neutral[80];
|
|
@@ -56,7 +61,7 @@ const InputWrapper = styled(
|
|
|
56
61
|
},
|
|
57
62
|
},
|
|
58
63
|
fieldset: {
|
|
59
|
-
border: `1px solid ${getInputBorderColor(palette
|
|
64
|
+
border: `1px solid ${getInputBorderColor(palette, fieldState, isLight)}`,
|
|
60
65
|
},
|
|
61
66
|
input: {
|
|
62
67
|
color: palette.primary.main,
|
|
@@ -55,7 +55,7 @@ const NsInputField = (props: NsInputFieldProps) => {
|
|
|
55
55
|
} = props;
|
|
56
56
|
/** EndIcon is created so that we can automatically add success and error icon based of fieldState,
|
|
57
57
|
* it will override iconEnd. Also to note, InputProps is given to override both iconStart, iconEnd and EndIcon */
|
|
58
|
-
|
|
58
|
+
const EndIcon: AdornmentPropsType = getAdornmentProps({ disabled, fieldState, iconEnd, iconStart });
|
|
59
59
|
|
|
60
60
|
return (
|
|
61
61
|
<InputFieldWrapper>
|
|
@@ -7,7 +7,7 @@ type Story = StoryObj<ComponentType>;
|
|
|
7
7
|
type MetaStory = Meta<ComponentType>;
|
|
8
8
|
|
|
9
9
|
export default {
|
|
10
|
-
title: 'Components/NsNavProductCard',
|
|
10
|
+
title: 'Components/Navigation/NsNavProductCard',
|
|
11
11
|
component: NsNavProductCard,
|
|
12
12
|
decorators: [withCenterDecorator],
|
|
13
13
|
args: {
|
|
@@ -3,14 +3,12 @@ import { render, fireEvent, screen } from '@testing-library/react';
|
|
|
3
3
|
import { NsRadioGroup } from './';
|
|
4
4
|
import { FoundationTheme } from '@nuskin/foundation-theme';
|
|
5
5
|
|
|
6
|
-
|
|
7
6
|
describe('NsRadioGroup', () => {
|
|
8
|
-
|
|
9
7
|
const options = [
|
|
10
8
|
{ id: 'Option1', label: 'Option 1', value: 'Option1' },
|
|
11
9
|
{ id: 'Option2', label: 'Option 2', value: 'Option2' },
|
|
12
10
|
{ id: 'Option3', label: 'Option 3', value: 'Option3' },
|
|
13
|
-
]
|
|
11
|
+
];
|
|
14
12
|
|
|
15
13
|
const props = {
|
|
16
14
|
disable: false,
|
|
@@ -27,38 +25,39 @@ describe('NsRadioGroup', () => {
|
|
|
27
25
|
};
|
|
28
26
|
const onChange = jest.fn();
|
|
29
27
|
|
|
30
|
-
it('renders options correctly', () => {
|
|
31
|
-
render(
|
|
32
|
-
<NsRadioGroup {...props} onChange={onChange}
|
|
33
|
-
/>,
|
|
34
|
-
);
|
|
28
|
+
it('1. renders options correctly', () => {
|
|
29
|
+
render(<NsRadioGroup {...props} onChange={onChange} />);
|
|
35
30
|
|
|
36
31
|
options.forEach((option) => {
|
|
37
32
|
const radioOption = screen.getByLabelText(option.label) as HTMLInputElement;
|
|
38
33
|
expect(radioOption).toBeInTheDocument();
|
|
39
|
-
expect(radioOption.value).toBe(option.value)
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
|
|
34
|
+
expect(radioOption.value).toBe(option.value);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
it('2. renders options correctly without additional slot', () => {
|
|
38
|
+
render(<NsRadioGroup {...props} onChange={onChange} additionalSlot={''} />);
|
|
43
39
|
|
|
44
|
-
|
|
40
|
+
options.forEach((option) => {
|
|
41
|
+
const radioOption = screen.getByLabelText(option.label) as HTMLInputElement;
|
|
42
|
+
expect(radioOption).toBeInTheDocument();
|
|
43
|
+
expect(radioOption.value).toBe(option.value);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
45
46
|
|
|
46
|
-
|
|
47
|
+
it('3. calls OnChange when selecting option', () => {
|
|
48
|
+
render(<NsRadioGroup {...props} onChange={onChange} />);
|
|
47
49
|
|
|
48
|
-
const radioOption = screen.getByLabelText('Option 2') as HTMLInputElement
|
|
50
|
+
const radioOption = screen.getByLabelText('Option 2') as HTMLInputElement;
|
|
49
51
|
fireEvent.click(radioOption);
|
|
50
52
|
expect(onChange).toHaveBeenCalledTimes(1);
|
|
53
|
+
});
|
|
51
54
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
it('does not call Onchange when the same option is clicked', () => {
|
|
55
|
+
it('4. does not call Onchange when the same option is clicked', () => {
|
|
55
56
|
const onChange = jest.fn();
|
|
56
|
-
render(<NsRadioGroup {...props} onChange={onChange} />)
|
|
57
|
+
render(<NsRadioGroup {...props} onChange={onChange} />);
|
|
57
58
|
|
|
58
|
-
const radioOption = screen.getByLabelText('Option 1') as HTMLInputElement
|
|
59
|
-
fireEvent.click(radioOption)
|
|
59
|
+
const radioOption = screen.getByLabelText('Option 1') as HTMLInputElement;
|
|
60
|
+
fireEvent.click(radioOption);
|
|
60
61
|
expect(onChange).not.toHaveBeenCalled();
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
})
|
|
62
|
+
});
|
|
63
|
+
});
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
2
1
|
import type { StoryObj, Meta } from '@storybook/react';
|
|
3
2
|
import { within, userEvent } from '@storybook/testing-library';
|
|
4
3
|
import { expect } from '@storybook/jest';
|
|
5
|
-
import { NsRadioGroup } from './'
|
|
4
|
+
import { NsRadioGroup } from './';
|
|
6
5
|
import { FoundationTheme } from '@nuskin/foundation-theme';
|
|
7
6
|
|
|
8
7
|
type ComponentType = typeof NsRadioGroup;
|
|
@@ -11,46 +10,32 @@ type MetaStory = Meta<ComponentType>;
|
|
|
11
10
|
|
|
12
11
|
export default {
|
|
13
12
|
component: NsRadioGroup,
|
|
14
|
-
title: 'Components/NsRadioGroup',
|
|
13
|
+
title: 'Components/Inputs/NsRadioGroup',
|
|
15
14
|
argTypes: {
|
|
16
15
|
disable: {
|
|
17
|
-
description:
|
|
18
|
-
'Indicates whether the radio button is enabled/disabled',
|
|
19
|
-
|
|
16
|
+
description: 'Indicates whether the radio button is enabled/disabled',
|
|
20
17
|
},
|
|
21
18
|
items: {
|
|
22
|
-
description:
|
|
23
|
-
'Value of the component to be emitted when selected.',
|
|
19
|
+
description: 'Value of the component to be emitted when selected.',
|
|
24
20
|
},
|
|
25
21
|
name: {
|
|
26
|
-
description:
|
|
27
|
-
'Name of the component',
|
|
28
|
-
|
|
22
|
+
description: 'Name of the component',
|
|
29
23
|
},
|
|
30
24
|
label: {
|
|
31
|
-
description:
|
|
32
|
-
'Label of the radio group',
|
|
33
|
-
|
|
25
|
+
description: 'Label of the radio group',
|
|
34
26
|
},
|
|
35
27
|
color: {
|
|
36
|
-
description:
|
|
37
|
-
'Color of the radio button',
|
|
38
|
-
|
|
28
|
+
description: 'Color of the radio button',
|
|
39
29
|
},
|
|
40
30
|
size: {
|
|
41
|
-
description:
|
|
42
|
-
'Margin Left for Additional Slot text',
|
|
43
|
-
|
|
31
|
+
description: 'Margin Left for Additional Slot text',
|
|
44
32
|
},
|
|
45
33
|
labelFontSize: {
|
|
46
|
-
description:
|
|
47
|
-
'Used to change font-size of the label'
|
|
34
|
+
description: 'Used to change font-size of the label',
|
|
48
35
|
},
|
|
49
36
|
additionalSlot: {
|
|
50
|
-
description:
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
37
|
+
description: 'An additional slot allows for more text',
|
|
38
|
+
},
|
|
54
39
|
},
|
|
55
40
|
} as MetaStory;
|
|
56
41
|
|
|
@@ -61,7 +46,7 @@ export const RadioGroup: Story = {
|
|
|
61
46
|
{
|
|
62
47
|
id: 'individual',
|
|
63
48
|
label: `Vendeur à domicile indépendant mandataire (The VDI mandataire
|
|
64
|
-
enters into sales or service agreements
|
|
49
|
+
enters into sales or service agreements
|
|
65
50
|
with customers in the name and on behalf of the company.
|
|
66
51
|
His remuneration will be based on commissions made
|
|
67
52
|
on the sales of products to customers.)`,
|
|
@@ -70,7 +55,7 @@ export const RadioGroup: Story = {
|
|
|
70
55
|
{
|
|
71
56
|
id: ' retailer',
|
|
72
57
|
label: `Vendeur à domicile indépendant acheteur-revendeur
|
|
73
|
-
(The VDI acheteur-revendeur sells the company's products in his own name and behalf.
|
|
58
|
+
(The VDI acheteur-revendeur sells the company's products in his own name and behalf.
|
|
74
59
|
His remuneration will be based on commissions and on the margins made on the sales of
|
|
75
60
|
products to customers.)`,
|
|
76
61
|
value: 'retailer',
|
|
@@ -91,12 +76,9 @@ export const RadioGroup: Story = {
|
|
|
91
76
|
await userEvent.hover(canvas.getByTestId('radio-group'));
|
|
92
77
|
await expect(
|
|
93
78
|
canvas.getByText(
|
|
79
|
+
// eslint-disable-next-line max-len
|
|
94
80
|
'Vendeur à domicile indépendant mandataire (The VDI mandataire enters into sales or service agreements with customers in the name and on behalf of the company. His remuneration will be based on commissions made on the sales of products to customers.)'
|
|
95
81
|
)
|
|
96
82
|
).toBeInTheDocument();
|
|
97
83
|
},
|
|
98
84
|
};
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Radio, FormControlLabel, FormLabel, RadioGroup } from '@mui/material';
|
|
2
2
|
import { ColorUtils, FoundationTheme, styled } from '@nuskin/foundation-theme';
|
|
3
|
+
import { skipDarkModeEnabled } from '../util';
|
|
3
4
|
|
|
4
5
|
const { paletteColor, isDarkMode, color } = ColorUtils;
|
|
5
6
|
|
|
@@ -23,7 +24,7 @@ export const StyledLabel = styled(FormLabel)`
|
|
|
23
24
|
`;
|
|
24
25
|
|
|
25
26
|
export const StyledRadio = styled(Radio)`
|
|
26
|
-
color: ${(props) =>
|
|
27
|
+
color: ${(props) => color('primary', !isDarkMode(props) ? 'black' : 'white')(props)};
|
|
27
28
|
`;
|
|
28
29
|
|
|
29
30
|
export const StyledFormControlLabel = styled(FormControlLabel)<{ darkModeEnabled?: boolean }>((props) => {
|
|
@@ -31,20 +32,21 @@ export const StyledFormControlLabel = styled(FormControlLabel)<{ darkModeEnabled
|
|
|
31
32
|
color: paletteColor('primary')(props),
|
|
32
33
|
marginBottom: '10px',
|
|
33
34
|
'.MuiFormControlLabel-label.Mui-disabled': {
|
|
34
|
-
color: `${
|
|
35
|
+
color: `${color('neutral', !isDarkMode(props) ? 60 : 20)(props)}`,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
const options = {
|
|
40
|
+
shouldForwardProp: skipDarkModeEnabled,
|
|
41
|
+
};
|
|
42
|
+
export const StyledRadioGroup = styled(
|
|
43
|
+
RadioGroup,
|
|
44
|
+
options
|
|
45
|
+
)<{ color: FoundationTheme.PaletteColors; darkModeEnabled?: boolean }>(({ theme, color, darkModeEnabled }) => {
|
|
46
|
+
return {
|
|
47
|
+
marginTop: '10px',
|
|
48
|
+
'.MuiRadio-root.custom-radio.Mui-checked': {
|
|
49
|
+
color: paletteColor(color)({ theme, darkModeEnabled }),
|
|
35
50
|
},
|
|
36
51
|
};
|
|
37
52
|
});
|
|
38
|
-
|
|
39
|
-
export const StyledRadioGroup = styled(RadioGroup)<
|
|
40
|
-
{ color: FoundationTheme.PaletteColors; darkModeEnabled?: boolean }
|
|
41
|
-
>(
|
|
42
|
-
({ theme, color, darkModeEnabled }) => {
|
|
43
|
-
return {
|
|
44
|
-
marginTop: '10px',
|
|
45
|
-
'.MuiRadio-root.custom-radio.Mui-checked': {
|
|
46
|
-
color: paletteColor(color)({ theme, darkModeEnabled })
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
);
|
|
@@ -22,7 +22,7 @@ const NsRadioGroup = (props: NsRadioGroupProps) => {
|
|
|
22
22
|
size,
|
|
23
23
|
additionalProps,
|
|
24
24
|
labelFontSize,
|
|
25
|
-
darkModeEnabled = true
|
|
25
|
+
darkModeEnabled = true,
|
|
26
26
|
} = props;
|
|
27
27
|
|
|
28
28
|
return (
|
|
@@ -50,10 +50,11 @@ const NsRadioGroup = (props: NsRadioGroupProps) => {
|
|
|
50
50
|
))}
|
|
51
51
|
</StyledRadioGroup>
|
|
52
52
|
</FormControl>
|
|
53
|
-
{additionalSlot ?
|
|
54
|
-
<
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
{additionalSlot ? (
|
|
54
|
+
<StyledHelperText className={`ml-${size}`}>
|
|
55
|
+
<StyledSpan className="text-sm">{additionalSlot}</StyledSpan>
|
|
56
|
+
</StyledHelperText>
|
|
57
|
+
) : null}
|
|
57
58
|
</>
|
|
58
59
|
);
|
|
59
60
|
};
|
|
@@ -2,8 +2,6 @@ import React from 'react';
|
|
|
2
2
|
import InputBase from '@mui/material/InputBase';
|
|
3
3
|
import { styled } from '@nuskin/foundation-theme';
|
|
4
4
|
|
|
5
|
-
interface NsSearchBarProps {}
|
|
6
|
-
|
|
7
5
|
const Search = styled('div')`
|
|
8
6
|
position: relative;
|
|
9
7
|
borderRadius: 0;
|
|
@@ -31,7 +29,7 @@ const StyledInputBase = styled(InputBase)(() => ({
|
|
|
31
29
|
},
|
|
32
30
|
}));
|
|
33
31
|
|
|
34
|
-
const NsSearchBar: React.FC
|
|
32
|
+
const NsSearchBar: React.FC = () => {
|
|
35
33
|
return (
|
|
36
34
|
<div>
|
|
37
35
|
<Search>
|
|
@@ -11,9 +11,7 @@ describe('NsSelectOption', () => {
|
|
|
11
11
|
test('renders NsSelectOption component without errors', () => {
|
|
12
12
|
const value = 'option1';
|
|
13
13
|
const label = 'Option 1';
|
|
14
|
-
const { getByTestId, getByText } = render(
|
|
15
|
-
<NsSelectOption value={value} label={label} />
|
|
16
|
-
);
|
|
14
|
+
const { getByTestId, getByText } = render(<NsSelectOption value={value} label={label} />);
|
|
17
15
|
|
|
18
16
|
// Check if the option container element exists
|
|
19
17
|
const optionContainer = getByTestId(`option-${value}`);
|
|
@@ -27,14 +25,11 @@ describe('NsSelectOption', () => {
|
|
|
27
25
|
const value = 'option1';
|
|
28
26
|
const label = 'Option 1';
|
|
29
27
|
const onSelect = jest.fn();
|
|
30
|
-
const { getByTestId } = render(
|
|
31
|
-
<NsSelectOption value={value} label={label} onSelect={onSelect} />
|
|
32
|
-
);
|
|
28
|
+
const { getByTestId } = render(<NsSelectOption value={value} label={label} onSelect={onSelect} />);
|
|
33
29
|
const optionElement = getByTestId(`option-${value}`);
|
|
34
30
|
fireEvent.click(optionElement);
|
|
35
31
|
expect(onSelect).toHaveBeenCalledWith(value);
|
|
36
32
|
});
|
|
37
|
-
|
|
38
33
|
});
|
|
39
34
|
|
|
40
35
|
describe('NsSelect', () => {
|
|
@@ -69,8 +64,7 @@ describe('NsSelect', () => {
|
|
|
69
64
|
const onSelect = jest.fn();
|
|
70
65
|
const selectedLabel = 'Option 1';
|
|
71
66
|
const { getByTestId, queryByTestId } = render(
|
|
72
|
-
<NsSelect selectedValue="Option1" selectedLabel={selectedLabel} onSelect={onSelect}
|
|
73
|
-
</NsSelect>
|
|
67
|
+
<NsSelect selectedValue="Option1" selectedLabel={selectedLabel} onSelect={onSelect} />
|
|
74
68
|
);
|
|
75
69
|
const selectButton = getByTestId('select-head');
|
|
76
70
|
fireEvent.mouseDown(selectButton);
|
|
@@ -132,12 +126,7 @@ describe('NsSelect', () => {
|
|
|
132
126
|
|
|
133
127
|
it('select closes on mouse leave when closeOnMouseLeave is set to true', async () => {
|
|
134
128
|
render(
|
|
135
|
-
<NsSelect
|
|
136
|
-
closeOnMouseLeave
|
|
137
|
-
selectedValue={selectedValue}
|
|
138
|
-
selectedLabel={selectedLabel}
|
|
139
|
-
onSelect={onSelect}
|
|
140
|
-
>
|
|
129
|
+
<NsSelect closeOnMouseLeave selectedValue={selectedValue} selectedLabel={selectedLabel} onSelect={onSelect}>
|
|
141
130
|
{createSelectOptions(options)}
|
|
142
131
|
</NsSelect>
|
|
143
132
|
);
|
|
@@ -186,7 +175,12 @@ describe('NsSelect', () => {
|
|
|
186
175
|
test('renders SelectContainer with error styles when errorMessage is present', () => {
|
|
187
176
|
const errorMessage = 'Invalid value';
|
|
188
177
|
render(
|
|
189
|
-
<NsSelect
|
|
178
|
+
<NsSelect
|
|
179
|
+
selectedValue={selectedValue}
|
|
180
|
+
selectedLabel={selectedLabel}
|
|
181
|
+
onSelect={onSelect}
|
|
182
|
+
errorMessage={errorMessage}
|
|
183
|
+
>
|
|
190
184
|
{createSelectOptions(options)}
|
|
191
185
|
</NsSelect>
|
|
192
186
|
);
|
|
@@ -196,5 +190,4 @@ describe('NsSelect', () => {
|
|
|
196
190
|
expect(selectContainer).toHaveStyle('borderColor: red');
|
|
197
191
|
expect(selectContainer).toHaveStyle('color: red');
|
|
198
192
|
});
|
|
199
|
-
|
|
200
193
|
});
|