@nuskin/foundation-ui-components 1.19.4 → 1.20.1

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuskin/foundation-ui-components",
3
- "version": "1.19.4",
3
+ "version": "1.20.1",
4
4
  "description": "It is a foundation library written in react, that provides common components to all UI pages",
5
5
  "main": "src/common/index.ts",
6
6
  "repository": {
@@ -1,5 +1,6 @@
1
- import { NsTypography, NsIcon, NsAccordionHeaderProps, AccordionVariant, NsIconProps, AccordionVariantType } from '..';
2
1
  import { styled } from '@nuskin/foundation-theme';
2
+
3
+ import { AccordionVariant, AccordionVariantType, NsAccordionHeaderProps, NsIcon, NsIconProps, NsTypography } from '..';
3
4
  import { isValidIconName } from '../icon/NsIconVariants';
4
5
  import { getAccordionColor } from './colorMap';
5
6
 
@@ -1,101 +1,38 @@
1
- import {Themed} from '../common.types';
2
- import {AccordionVariantType} from './enums';
3
- import {ColorUtils, FoundationTheme} from '@nuskin/foundation-theme';
4
- const {isDarkMode, color} = ColorUtils;
1
+ import { Themed } from '../common.types';
2
+ import { ColorUtils } from '@nuskin/foundation-theme';
3
+ import { AllColorKeyType } from '@nuskin/foundation-theme/src/common/themes/genome-colors/AllColors';
4
+
5
+ import { AccordionVariant, AccordionVariantType } from './enums';
6
+
7
+ const { getGenomeColor } = ColorUtils;
5
8
  const compKeys = ['contentBg', 'contentText', 'headBg', 'headText'];
6
9
  type CompKeys = (typeof compKeys)[number];
7
- type VariantColors = Record<
8
- CompKeys,
9
- {
10
- light: [FoundationTheme.AppColors, string];
11
- dark: [FoundationTheme.AppColors, string];
12
- }
13
- >;
10
+ type VariantColors = Record<CompKeys, AllColorKeyType>;
14
11
 
15
- const colorObject: Record<string, [FoundationTheme.AppColors, string]> = {
16
- n10: ['primary', 'dark'], // #121212
17
- n20: ['primary', 'black'], // #252525
18
- n40: ['neutral', '80'], // #444444
19
- n45: ['neutral', '70'], // #5f5f5f
20
- n50: ['neutral', '60'], // #8c8c8c
21
- n80: ['neutral', '50'], // #b2b2b2
22
- n85: ['neutral', '40'], // #e0e0e0
23
- n90: ['neutral', '30'], // #ededed
24
- n95: ['primary', 'gray'], // #f5f5f5
25
- n100: ['primary', 'white'], // #fff
26
- };
27
12
  export const colorMap: Record<AccordionVariantType, VariantColors> = {
28
13
  basic: {
29
- contentBg: {
30
- light: colorObject.n95,
31
- dark: colorObject.n20,
32
- },
33
- contentText: {
34
- light: colorObject.n10,
35
- dark: colorObject.n95,
36
- },
37
- headBg: {
38
- light: colorObject.n100,
39
- dark: colorObject.n20,
40
- },
41
- headText: {
42
- light: colorObject.n10,
43
- dark: colorObject.n95,
44
- },
14
+ contentBg: 'N20',
15
+ contentText: 'N90',
16
+ headBg: 'N10',
17
+ headText: 'N90',
45
18
  },
46
19
  compact: {
47
- contentBg: {
48
- light: colorObject.n100,
49
- dark: colorObject.n10,
50
- },
51
- contentText: {
52
- light: colorObject.n10,
53
- dark: colorObject.n90,
54
- },
55
- headBg: {
56
- light: colorObject.n100,
57
- dark: colorObject.n10,
58
- },
59
- headText: {
60
- light: colorObject.n10,
61
- dark: colorObject.n90,
62
- },
20
+ contentBg: 'N10',
21
+ contentText: 'N90',
22
+ headBg: 'N10',
23
+ headText: 'N90',
63
24
  },
64
25
  gray: {
65
- contentBg: {
66
- light: colorObject.n85,
67
- dark: colorObject.n40,
68
- },
69
- contentText: {
70
- light: colorObject.n40,
71
- dark: colorObject.n85,
72
- },
73
- headBg: {
74
- light: colorObject.n90,
75
- dark: colorObject.n45,
76
- },
77
- headText: {
78
- light: colorObject.n45,
79
- dark: colorObject.n90,
80
- },
26
+ contentBg: 'N40',
27
+ contentText: 'N80',
28
+ headBg: 'N30',
29
+ headText: 'N70',
81
30
  },
82
31
  stripe: {
83
- contentBg: {
84
- light: colorObject.n90,
85
- dark: colorObject.n45,
86
- },
87
- contentText: {
88
- light: colorObject.n45,
89
- dark: colorObject.n90,
90
- },
91
- headBg: {
92
- light: colorObject.n100,
93
- dark: colorObject.n40,
94
- },
95
- headText: {
96
- light: colorObject.n40,
97
- dark: colorObject.n100,
98
- },
32
+ contentBg: 'N30',
33
+ contentText: 'N70',
34
+ headBg: 'N10',
35
+ headText: 'N80',
99
36
  },
100
37
  };
101
38
 
@@ -104,13 +41,14 @@ type GetAccordionColor = {
104
41
  invert: boolean;
105
42
  keys: CompKeys[];
106
43
  } & Themed;
107
- export const getAccordionColor = ({theme, variant, invert, keys}: GetAccordionColor): Record<CompKeys, string> => {
108
- const isDark = invert ? !isDarkMode({theme}) : isDarkMode({theme});
109
- const darkLabel = isDark ? 'dark' : 'light';
44
+ export const getAccordionColor = ({ theme, variant, invert, keys }: GetAccordionColor): Record<CompKeys, string> => {
110
45
  const result: Record<string, string> = {};
46
+ if (!Object.values(AccordionVariant).includes(variant)) {
47
+ throw new Error(`Invalid variant ${variant}`);
48
+ }
111
49
  for (const colorKey of keys) {
112
- const [appColorBg, appSubColorBg] = colorMap[variant][colorKey][darkLabel];
113
- const colorValue = color(appColorBg, appSubColorBg)({theme});
50
+ const appColorKey = colorMap[variant][colorKey];
51
+ const colorValue = getGenomeColor(theme, appColorKey, invert ? 'dark' : 'light');
114
52
  result[colorKey] = colorValue;
115
53
  }
116
54
  return result;
@@ -51,6 +51,7 @@ export const StyledButton = styled(MUIButton)<NsButtonProps>(
51
51
  },
52
52
  ...buttonStyles,
53
53
  ...sizeStyle,
54
+ textTransform: 'none',
54
55
  };
55
56
  }
56
57
  );
@@ -1,5 +1,18 @@
1
+ import { Button } from '@mui/material';
1
2
  import { NsButton, NsIcon } from '../';
2
3
  import { NsCardButton } from './types';
4
+ import { styled } from '@nuskin/foundation-theme';
5
+
6
+ const ButtonTextVariant = styled(Button)(() => {
7
+ return {
8
+ padding: 0,
9
+ borderBottom: '1px solid black',
10
+ borderRadius: 0,
11
+ textTransform: 'none',
12
+ fontSize: '14px',
13
+ fontWeight: 600,
14
+ };
15
+ });
3
16
 
4
17
  const CardButton = ({
5
18
  url,
@@ -14,21 +27,27 @@ const CardButton = ({
14
27
  if (showButton && url) {
15
28
  return (
16
29
  <div className="cta">
17
- <NsButton
18
- href={url}
19
- color={buttonColor}
20
- variant={buttonVariant}
21
- fullWidth={fullWidth}
22
- endIcon={
23
- showArrowWithText && buttonVariant === 'text' ? (
30
+ {buttonVariant === 'text' ? (
31
+ <ButtonTextVariant href={url}>
32
+ {buttonText}
33
+ {showArrowWithText ? (
24
34
  <NsIcon name="arrowRight" size="small" color="primary" />
25
35
  ) : endIcon ? (
26
- <NsIcon name={endIcon} color={buttonColor} />
27
- ) : null
28
- }
29
- >
30
- {buttonText}
31
- </NsButton>
36
+ <NsIcon name={endIcon} size="small" color="primary" />
37
+ ) : null}
38
+ </ButtonTextVariant>
39
+ ) : (
40
+ <NsButton
41
+ href={url}
42
+ color={buttonColor}
43
+ variant={buttonVariant}
44
+ fullWidth={fullWidth}
45
+ endIcon={endIcon ? <NsIcon name={endIcon} color={buttonColor} /> : null}
46
+ className="cta-text"
47
+ >
48
+ {buttonText}
49
+ </NsButton>
50
+ )}
32
51
  </div>
33
52
  );
34
53
  }
@@ -19,18 +19,18 @@ type NsBrandCardProps = {
19
19
 
20
20
  const CardContainer = styled((props: any) => <Box {...props} />)(({ size }) => {
21
21
  const { small, large } = cardSizes;
22
- let width, height;
22
+ let maxWidth, maxHeight;
23
23
 
24
24
  if (size === 'small') {
25
- width = small.width;
26
- height = small.height;
25
+ maxWidth = small.maxWidth;
26
+ maxHeight = small.maxHeight;
27
27
  } else {
28
- width = large.width;
29
- height = large.height;
28
+ maxWidth = large.maxWidth;
29
+ maxHeight = large.maxHeight;
30
30
  }
31
31
 
32
32
  return {
33
- width,
33
+ maxWidth,
34
34
  display: 'flex',
35
35
  alignItems: 'start',
36
36
  justifyContent: 'center',
@@ -38,6 +38,9 @@ const CardContainer = styled((props: any) => <Box {...props} />)(({ size }) => {
38
38
  flexDirection: 'column',
39
39
  '.brand-title': {
40
40
  marginTop: '15px',
41
+ fontSize: '18px',
42
+ fontWeight: 600,
43
+ lineHeight: '26px',
41
44
  display: 'inline-block',
42
45
  wordBreak: 'break-word',
43
46
  },
@@ -46,13 +49,9 @@ const CardContainer = styled((props: any) => <Box {...props} />)(({ size }) => {
46
49
  opacity: '0.7',
47
50
  },
48
51
  },
49
- '.cta': {
50
- marginTop: '15px',
51
- width: '100%',
52
- },
53
52
  '.image': {
54
- width,
55
- height,
53
+ maxWidth,
54
+ maxHeight,
56
55
  backgroundSize: 'cover',
57
56
  backgroundPosition: 'center',
58
57
  },
@@ -74,7 +73,7 @@ export default function NsBrandCard({
74
73
  </NsBrandWrapper>
75
74
  </NsBgCard>
76
75
  {title ? (
77
- <NsTypography weight='normal' variant="h5" className="brand-title">
76
+ <NsTypography variant="h3" className="brand-title">
78
77
  {title}
79
78
  </NsTypography>
80
79
  ) : null}
@@ -1,5 +1,5 @@
1
1
  import Box from '@mui/material/Box';
2
- import { NsImage, NsTypography } from '../';
2
+ import { NsImage } from '../';
3
3
  import { styled } from '@nuskin/foundation-theme';
4
4
 
5
5
  type NsPostProps = {
@@ -18,36 +18,40 @@ const CardContainer = styled(Box)(() => {
18
18
  wordWrap: 'break-word' as 'break-word',
19
19
  position: 'relative',
20
20
  overflow: 'hidden',
21
- height: 'auto',
22
21
  maxWidth: '165px',
22
+ height: '272px',
23
23
  backgroundColor: '#fff',
24
+ '.image': {
25
+ height: '180px',
26
+ overflow: 'hidden',
27
+ objectFit: 'contain',
28
+ },
24
29
  '.content': {
25
- paddingTop: '10px',
30
+ padding: '20px',
26
31
  display: 'flex',
27
32
  flexDirection: 'column',
28
- minHeight: '80px',
29
- justifyContent: 'space-between',
30
- padding: '20px',
33
+ minHeight: '92px',
34
+ maxHeight: '92px',
35
+ justifyContent: 'space-around',
31
36
  },
32
37
  '.body-title': {
33
- marginBottom: '5px',
38
+ fontSize: '18px',
39
+ fontWeight: 600,
34
40
  display: '-webkit-box',
35
41
  '-webkit-box-orient': 'vertical',
36
- '-webkit-line-clamp': '3',
42
+ '-webkit-line-clamp': '1',
37
43
  overflow: 'hidden',
38
44
  textOverflow: 'ellipsis',
39
- fontSize: '18px',
40
- fontWeight: 600,
41
- lineHeight: '22px',
42
- fontFamily: 'Inter',
43
45
  },
44
46
  '.body-text': {
47
+ fontSize: '12px',
48
+ fontWeight: 700,
49
+ display: '-webkit-box',
50
+ '-webkit-box-orient': 'vertical',
51
+ '-webkit-line-clamp': '1',
52
+ overflow: 'hidden',
53
+ textOverflow: 'ellipsis',
45
54
  color: '#8C8C8C',
46
- margin: '0px',
47
- fontSize: '16px',
48
- fontWeight: 600,
49
- lineHeight: '16px',
50
- fontFamily: 'Inter',
51
55
  },
52
56
  };
53
57
  });
@@ -56,15 +60,11 @@ const NsPost = ({ text, body, backgroundImageUrl, backgroundImageAlt, className
56
60
  return (
57
61
  <CardContainer className={className} data-testid="post-card">
58
62
  <div className="image">
59
- <NsImage height="auto" width="100%" alt={backgroundImageAlt} src={backgroundImageUrl} />
63
+ <NsImage height={'100%'} width={'auto'} alt={backgroundImageAlt} src={backgroundImageUrl} />
60
64
  </div>
61
65
  <div className="content">
62
- <NsTypography weight="normal" className="body-title" variant="h5">
63
- {text}
64
- </NsTypography>
65
- <NsTypography className="body-text" variant="body-l">
66
- {body}
67
- </NsTypography>
66
+ <article className="body-title">{text}</article>
67
+ <article className="body-text">{body}</article>
68
68
  </div>
69
69
  </CardContainer>
70
70
  );
@@ -17,8 +17,9 @@ const CardContainer = styled(Box)(() => {
17
17
  return {
18
18
  backgroundColor: '#fff',
19
19
  display: 'flex',
20
- height: '275px',
21
- width: '250px',
20
+ maxHeight: '320px',
21
+ maxWidth: '375px',
22
+ overflow: 'hidden',
22
23
  position: 'relative',
23
24
  '.image': {
24
25
  width: '100%',
@@ -49,12 +50,15 @@ const CardContainer = styled(Box)(() => {
49
50
  },
50
51
  '.title': {
51
52
  color: '#fff',
52
- fontSize: '22px',
53
+ fontSize: '26px',
53
54
  fontWeight: '400',
54
55
  marginTop: '20px',
55
56
  },
56
57
  '.cta': {
57
58
  marginTop: '20px',
59
+ maxWidth: '208px',
60
+ borderRadius: '4px',
61
+ overflow: 'hidden',
58
62
  },
59
63
  };
60
64
  });
@@ -1,11 +1,11 @@
1
1
  const cardSizes = {
2
2
  small: {
3
- width: '180px',
4
- height: '200px',
3
+ maxWidth: '160px',
4
+ maxHeight: '179px',
5
5
  },
6
6
  large: {
7
- width: '220px',
8
- height: '250px',
7
+ maxWidth: '190px',
8
+ maxHeight: '211px',
9
9
  },
10
10
  };
11
11
 
@@ -58,11 +58,11 @@ describe('NsBrandCard component', () => {
58
58
  const cardContainer = container.firstChild;
59
59
  const nsBgCardElement = cardContainer?.firstChild;
60
60
  expect(cardContainer).toHaveStyle(`
61
- width: 180px;
61
+ maxWidth: 160px;
62
62
  `);
63
63
  expect(nsBgCardElement).toHaveStyle(`
64
- width: 180px;
65
- height: 200px;
64
+ maxWidth: 160px;
65
+ maxHeight: 179px;
66
66
  `);
67
67
  });
68
68
 
@@ -71,7 +71,7 @@ describe('NsBrandCard component', () => {
71
71
  const cardContainer = screen.getByTestId('brand-card') as HTMLElement;
72
72
  const computedStyles = window.getComputedStyle(cardContainer);
73
73
 
74
- expect(computedStyles.width).toBe('220px');
74
+ expect(computedStyles.maxWidth).toBe('190px');
75
75
  });
76
76
 
77
77
  it('7. renders with default styles when size is not provided', () => {
@@ -79,6 +79,6 @@ describe('NsBrandCard component', () => {
79
79
  const cardContainer = screen.getByTestId('brand-card') as HTMLElement;
80
80
  const computedStyles = window.getComputedStyle(cardContainer);
81
81
 
82
- expect(computedStyles.width).toBe('220px');
82
+ expect(computedStyles.maxWidth).toBe('190px');
83
83
  });
84
84
  });
@@ -27,6 +27,7 @@ export const Default: Story = {
27
27
  buttonVariant: 'contained',
28
28
  buttonColor: 'primary',
29
29
  url: '#',
30
+ fullWidth: true,
30
31
  },
31
32
  },
32
33
  };
@@ -1,7 +1,8 @@
1
+ import { styled } from '@nuskin/foundation-theme';
1
2
  import React, { useMemo } from 'react';
2
3
  import Slider from 'react-slick';
4
+
3
5
  import { NsScrollingCarousalProps } from '../';
4
- import { styled } from '@nuskin/foundation-theme';
5
6
 
6
7
  type StyledType = {
7
8
  dotsBottomPixel?: number;
@@ -35,7 +36,7 @@ const NsScrollingCarousal = ({
35
36
  adaptiveHeight: true,
36
37
  arrows: true,
37
38
  draggable: true,
38
- dots: true,
39
+ dots: false,
39
40
  infinite: true,
40
41
  speed: scrollSeconds * 1000 || 500, // speed = animation speed in milliseconds
41
42
  slidesToShow: 1,
@@ -36,7 +36,7 @@ export const DropdownButton = styled.div`
36
36
 
37
37
  export const DropdownList = styled.div<{ borderColor: FoundationTheme.PaletteColors }>`
38
38
  position: absolute;
39
- z-index: 100;
39
+ z-index: 999;
40
40
  border: 1px solid ${({ borderColor, theme }) => paletteColor(borderColor)({ theme })};
41
41
  margin-top: 10px;
42
42
  width: 100%;