@nuskin/foundation-ui-components 1.28.0 → 1.29.0-cx130-1216.2

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 (41) hide show
  1. package/package.json +2 -9
  2. package/src/common/autocomplete/NsAutocomplete.spec.tsx +3 -3
  3. package/src/common/banner/NsBanner.spec.tsx +5 -5
  4. package/src/common/banner/NsBanner.tsx +3 -18
  5. package/src/common/banner/types.d.ts +2 -2
  6. package/src/common/card/NsAwardCard.tsx +8 -7
  7. package/src/common/card/NsHeroCardLevel1.tsx +5 -6
  8. package/src/common/card/NsHeroCardLevel2.tsx +5 -6
  9. package/src/common/card/NsLargeCard.tsx +5 -6
  10. package/src/common/card/NsMediumCard.tsx +7 -7
  11. package/src/common/card/NsPost.tsx +5 -7
  12. package/src/common/card/NsSmallFullCard.tsx +5 -6
  13. package/src/common/card/NsXLargeCard.tsx +5 -12
  14. package/src/common/card/fixtures/ImageData1.ts +38 -0
  15. package/src/common/card/fixtures/ImageData2.ts +38 -0
  16. package/src/common/card/specs/NsAwardCard.spec.tsx +2 -2
  17. package/src/common/card/specs/NsHeroCardLevel1.spec.tsx +2 -3
  18. package/src/common/card/specs/NsHeroCardLevel2.spec.tsx +2 -2
  19. package/src/common/card/specs/NsLargeCard.spec.tsx +2 -3
  20. package/src/common/card/specs/NsMediumCard.spec.tsx +3 -3
  21. package/src/common/card/specs/NsPost.spec.tsx +3 -3
  22. package/src/common/card/specs/NsSmallFullCard.spec.tsx +3 -3
  23. package/src/common/card/specs/NsXLargeCard.spec.tsx +3 -3
  24. package/src/common/card/stories/NsAwardCard.stories.tsx +2 -4
  25. package/src/common/card/stories/NsHeroCardLevel1.stories.tsx +2 -4
  26. package/src/common/card/stories/NsHeroCardLevel2.stories.tsx +2 -4
  27. package/src/common/card/stories/NsLargeCard.stories.tsx +2 -4
  28. package/src/common/card/stories/NsMediumCard.stories.tsx +2 -4
  29. package/src/common/card/stories/NsPost.stories.tsx +2 -4
  30. package/src/common/card/stories/NsSmallFullCard.stories.tsx +2 -4
  31. package/src/common/card/stories/NsXLargeCard.stories.tsx +4 -5
  32. package/src/common/image/BynderMedia.spec.tsx +42 -0
  33. package/src/common/image/BynderMedia.tsx +46 -0
  34. package/src/common/image/NsImage.tsx +1 -1
  35. package/src/common/image/NsNextImage.tsx +1 -1
  36. package/src/common/image/bynder-util.spec.ts +187 -0
  37. package/src/common/image/bynder-util.ts +98 -0
  38. package/src/common/image/index.ts +1 -1
  39. package/src/common/image/types.ts +78 -0
  40. package/src/common/toast/specs/Toast.spec.tsx +56 -64
  41. package/src/common/image/types.d.ts +0 -30
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuskin/foundation-ui-components",
3
- "version": "1.28.0",
3
+ "version": "1.29.0-cx130-1216.2",
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": {
@@ -46,13 +46,12 @@
46
46
  "@mui/icons-material": "^5.14.16",
47
47
  "@mui/material": "5.14.16",
48
48
  "@mui/utils": "5.14.16",
49
- "@nuskin/foundation-theme": "^1.5.1",
49
+ "@nuskin/foundation-theme": "^1.5.0",
50
50
  "@types/react": "^18.2.0",
51
51
  "@types/react-dom": "^18.2.0",
52
52
  "cliui": "^8.0.1",
53
53
  "framer-motion": "^10.16.4",
54
54
  "next": "13.5.6",
55
- "notistack": "^3.0.1",
56
55
  "react": "^18.2.0",
57
56
  "react-dom": "^18.2.0",
58
57
  "react-material-ui-carousel": "^3.4.2",
@@ -100,12 +99,6 @@
100
99
  "jest-environment-jsdom": "^29.7.0",
101
100
  "storybook": "^7.5.1"
102
101
  },
103
- "peerDependencies": {
104
- "react": "^18.2.0",
105
- "react-dom": "^18.2.0",
106
- "@nuskin/foundation-theme": "^1.5.1",
107
- "@mui/material": "5.14.16"
108
- },
109
102
  "files": [
110
103
  "src/common"
111
104
  ],
@@ -56,7 +56,7 @@ describe('CustomAutocomplete', () => {
56
56
  await userEvent.click(optionLi);
57
57
  });
58
58
  expect(onChangeMock).toHaveBeenCalled();
59
- }, 160000);
59
+ }, 90000000);
60
60
 
61
61
  it('5. should load more options when clicking load more button', async () => {
62
62
  const seeMore = {
@@ -72,7 +72,7 @@ describe('CustomAutocomplete', () => {
72
72
  await userEvent.click(loadMoreButton);
73
73
  });
74
74
  expect(seeMore.onSeeMore).toHaveBeenCalled();
75
- }, 160000);
75
+ }, 9000000);
76
76
 
77
77
  it('6. should clear options when clicking clear button', async () => {
78
78
  const clear = {
@@ -87,5 +87,5 @@ describe('CustomAutocomplete', () => {
87
87
  const clearButton = screen.getByText(clear.text);
88
88
  await userEvent.click(clearButton);
89
89
  });
90
- }, 160000);
90
+ }, 90000000);
91
91
  });
@@ -1,28 +1,28 @@
1
1
  import React from 'react';
2
2
  import { render } from '@testing-library/react';
3
3
  import { NsBanner } from '@/common/';
4
+ import { ImageData1 } from '../card/fixtures/ImageData1';
4
5
 
5
6
  describe('Hero component', () => {
6
7
  const childText = 'Welcome to My Website';
7
- const imageURL = 'https://example.com/banner.jpg';
8
8
  it('1. renders banner image and title', () => {
9
9
  const { getByAltText, getByText } = render(
10
- <NsBanner imageUrl={imageURL} altText="Banner image">
10
+ <NsBanner image={ImageData1}>
11
11
  <h1>{childText}</h1>
12
12
  </NsBanner>
13
13
  );
14
14
  const childElement = getByText(childText);
15
- const imageElement = getByAltText('Banner image');
15
+ const imageElement = getByAltText(ImageData1.selected?.altText || '');
16
16
  expect(childElement).toBeInTheDocument();
17
17
  expect(imageElement).toBeInTheDocument();
18
18
  });
19
19
  it('2. renders banner image and title without altText', () => {
20
20
  const { getByAltText } = render(
21
- <NsBanner imageUrl={imageURL}>
21
+ <NsBanner image={ImageData1}>
22
22
  <h1>{childText}</h1>
23
23
  </NsBanner>
24
24
  );
25
- const imageElement = getByAltText('NsBanner');
25
+ const imageElement = getByAltText(ImageData1.selected?.altText || '');
26
26
  expect(imageElement).toBeInTheDocument();
27
27
  });
28
28
  });
@@ -8,30 +8,15 @@ import React, { PropsWithChildren } from 'react';
8
8
 
9
9
  import { NsBannerProps } from './types.d';
10
10
  import { StyledBanner, StyledHeroText } from './NsBanner.styled';
11
- import { NsImage } from '../';
11
+ import { BynderMedia } from '../image/BynderMedia';
12
12
 
13
13
  /* TODO: once we have storybook 7, we can try converting this NsImage to NsNextImage */
14
14
  const NsBanner = (props: PropsWithChildren<NsBannerProps>) => {
15
- const {
16
- children,
17
- imageUrl,
18
- altText,
19
- alignment = 'center',
20
- justify = 'start',
21
- className = '',
22
- additionalProps = {},
23
- } = props;
15
+ const { children, image, alignment = 'center', justify = 'start', className = '', additionalProps = {} } = props;
24
16
 
25
17
  return (
26
18
  <StyledBanner className={className}>
27
- <NsImage
28
- src={imageUrl}
29
- alt={altText || 'NsBanner'}
30
- id="bgImage"
31
- width={0}
32
- height={0}
33
- {...additionalProps}
34
- />
19
+ <BynderMedia className="image" imageDetail={image} {...additionalProps} />
35
20
  <StyledHeroText $alignment={alignment} $justify={justify}>
36
21
  <div className="mx-14">{children}</div>
37
22
  </StyledHeroText>
@@ -1,13 +1,13 @@
1
1
  import React from 'react';
2
2
 
3
3
  import { AdditionalProps } from '../common.types';
4
+ import { BynderImageDataType } from '../image/types';
4
5
 
5
6
  export type AlignmentType = 'start' | 'center' | 'end';
6
7
 
7
8
  export type NsBannerProps = {
8
9
  children: React.ReactNode;
9
- imageUrl: string;
10
- altText?: string;
10
+ image: BynderImageDataType;
11
11
  alignment?: AlignmentType;
12
12
  justify?: AlignmentType;
13
13
  className?: string;
@@ -1,13 +1,15 @@
1
1
  import Box from '@mui/material/Box';
2
2
  import { styled } from '@nuskin/foundation-theme';
3
- import { NsImage, NsTypography } from '../';
3
+
4
+ import { NsTypography } from '../';
5
+ import { BynderMedia } from '../image/BynderMedia';
6
+ import { BynderImageDataType } from '../image/types';
4
7
 
5
8
  type NsAwardCardProps = {
6
9
  title: string;
7
10
  awardName: string;
8
11
  mediaOutlet: string;
9
- backgroundImageUrl: string;
10
- backgroundImageAlt: string;
12
+ backgroundImageDetail: BynderImageDataType;
11
13
  className?: string;
12
14
  };
13
15
 
@@ -45,15 +47,14 @@ export default function NsAwardCard({
45
47
  title,
46
48
  awardName,
47
49
  mediaOutlet,
48
- backgroundImageUrl,
49
- backgroundImageAlt,
50
+ backgroundImageDetail,
50
51
  className,
51
52
  }: NsAwardCardProps) {
52
53
  return (
53
54
  <CardContainer className={className} role="award-card" component="div" data-testid="award-card">
54
- <NsImage alt={backgroundImageAlt} src={backgroundImageUrl} className="image" />
55
+ <BynderMedia className="image" imageDetail={backgroundImageDetail} />
55
56
  <div className="content">
56
- <NsTypography weight='normal' className="title" variant="h5">
57
+ <NsTypography weight="normal" className="title" variant="h5">
57
58
  {title}
58
59
  </NsTypography>
59
60
  <NsTypography className="content-text" variant="body-l">
@@ -1,14 +1,14 @@
1
- import { NsImage } from '../';
2
1
  import Box from '@mui/material/Box';
3
2
  import { styled } from '@nuskin/foundation-theme';
4
3
  import CardButton from './CardButton';
5
4
  import { NsCardButton } from './types';
5
+ import { BynderMedia } from '../image/BynderMedia';
6
+ import { BynderImageDataType } from '../image/types';
6
7
 
7
8
  type NsHeroCardLevel1Props = {
8
9
  cardTitle: string;
9
10
  cardDescription: string;
10
- backgroundImageUrl: string;
11
- backgroundImageAlt: string;
11
+ backgroundImageDetail: BynderImageDataType;
12
12
  button?: NsCardButton;
13
13
  className?: string;
14
14
  imagePosition?: 'top' | 'bottom';
@@ -76,15 +76,14 @@ const CardContainer = styled((props: any) => <Box {...props} />)(({ imagePositio
76
76
  export default function NsHeroCardLevel1({
77
77
  cardTitle,
78
78
  cardDescription,
79
- backgroundImageUrl,
80
- backgroundImageAlt,
79
+ backgroundImageDetail,
81
80
  button,
82
81
  className,
83
82
  imagePosition = 'top',
84
83
  }: NsHeroCardLevel1Props) {
85
84
  return (
86
85
  <CardContainer className={className} data-testid="hero-card-level-1" imagePosition={imagePosition}>
87
- <NsImage variant="fill" alt={backgroundImageAlt} src={backgroundImageUrl} className="bg-image" />
86
+ <BynderMedia className="bg-image" imageDetail={backgroundImageDetail} />
88
87
  <div className="content">
89
88
  <article className="body-title">{cardTitle}</article>
90
89
  <article className="body-text">{cardDescription}</article>
@@ -1,15 +1,15 @@
1
- import { NsImage } from '../';
2
1
  import Box from '@mui/material/Box';
3
2
  import { styled } from '@nuskin/foundation-theme';
4
3
  import CardButton from './CardButton';
5
4
  import { NsCardButton } from './types';
5
+ import { BynderMedia } from '../image/BynderMedia';
6
+ import { BynderImageDataType } from '../image/types';
6
7
 
7
8
  type NsHeroCardLevel2Props = {
8
9
  brandName: string;
9
10
  cardTitle: string;
10
11
  cardDescription: string;
11
- backgroundImageUrl: string;
12
- backgroundImageAlt: string;
12
+ backgroundImageDetail: BynderImageDataType;
13
13
  button?: NsCardButton;
14
14
  className?: string;
15
15
  };
@@ -65,14 +65,13 @@ const NsHeroCardLevel2 = ({
65
65
  brandName,
66
66
  cardTitle,
67
67
  cardDescription,
68
- backgroundImageUrl,
69
- backgroundImageAlt,
68
+ backgroundImageDetail,
70
69
  button,
71
70
  className,
72
71
  }: NsHeroCardLevel2Props) => {
73
72
  return (
74
73
  <CardContainer className={className} data-testid="hero-card-level-2">
75
- <NsImage variant="fill" alt={backgroundImageAlt} src={backgroundImageUrl} className="bg-image" />
74
+ <BynderMedia className="bg-image" imageDetail={backgroundImageDetail} />
76
75
  <div className="content">
77
76
  <div className="brand-container">
78
77
  <article>{brandName}</article>
@@ -1,15 +1,15 @@
1
1
  import Box from '@mui/material/Box';
2
2
  import { styled } from '@nuskin/foundation-theme';
3
- import { NsImage } from '../';
4
3
  import CardButton from './CardButton';
5
4
  import { NsCardButton } from './types';
5
+ import { BynderMedia } from '../image/BynderMedia';
6
+ import { BynderImageDataType } from '../image/types';
6
7
 
7
8
  type NsLargeCardProps = {
8
9
  title: string;
9
10
  subtitle?: string;
10
11
  intro: string;
11
- backgroundImageUrl: string;
12
- backgroundImageAlt: string;
12
+ backgroundImageDetail: BynderImageDataType;
13
13
  isHorizontal?: boolean;
14
14
  button?: NsCardButton;
15
15
  className?: string;
@@ -71,8 +71,7 @@ const CardContainer = styled((props: any) => <Box {...props} />)(({ isHorizontal
71
71
  export default function NsLargeCard({
72
72
  title,
73
73
  subtitle,
74
- backgroundImageUrl,
75
- backgroundImageAlt,
74
+ backgroundImageDetail,
76
75
  intro,
77
76
  isHorizontal,
78
77
  button,
@@ -86,7 +85,7 @@ export default function NsLargeCard({
86
85
  data-testid="large-card"
87
86
  isHorizontal={isHorizontal}
88
87
  >
89
- <NsImage alt={backgroundImageAlt} src={backgroundImageUrl} className="bg-image" />
88
+ <BynderMedia className="bg-image" imageDetail={backgroundImageDetail} />
90
89
  <div className="content">
91
90
  <article className="subtitle">{subtitle}</article>
92
91
  <article className="title">{title}</article>
@@ -1,16 +1,17 @@
1
- import { NsCardButton } from './types';
2
1
  import Box from '@mui/material/Box';
3
2
  import { styled } from '@nuskin/foundation-theme';
4
3
 
5
- import { NsImage, NsTypography } from '../';
4
+ import { NsTypography } from '../';
5
+ import { BynderMedia } from '../image/BynderMedia';
6
6
  import CardButton from './CardButton';
7
+ import { NsCardButton } from './types';
8
+ import { BynderImageDataType } from '../image/types';
7
9
 
8
10
  type NsMediumCardProps = {
9
11
  title: string;
10
12
  titleFontWeight?: 'bold' | 'normal' | 'light';
11
13
  subtitle: string;
12
- backgroundImageUrl: string;
13
- backgroundImageAlt: string;
14
+ backgroundImageDetail: BynderImageDataType;
14
15
  button?: NsCardButton;
15
16
  className?: string;
16
17
  fluid?: boolean;
@@ -71,8 +72,7 @@ export default function NsMediumCard({
71
72
  title,
72
73
  titleFontWeight,
73
74
  subtitle,
74
- backgroundImageUrl,
75
- backgroundImageAlt,
75
+ backgroundImageDetail,
76
76
  button,
77
77
  className,
78
78
  fluid,
@@ -87,7 +87,7 @@ export default function NsMediumCard({
87
87
  fluid={fluid || false}
88
88
  variant={button?.buttonVariant ?? ''}
89
89
  >
90
- <NsImage alt={backgroundImageAlt} src={backgroundImageUrl} className="image" />
90
+ <BynderMedia className="image" imageDetail={backgroundImageDetail} />
91
91
  <div className="content">
92
92
  <NsTypography variant="h5" color="primary" className="title" weight={titleFontWeight}>
93
93
  {title}
@@ -1,12 +1,12 @@
1
1
  import Box from '@mui/material/Box';
2
- import { NsImage } from '../';
3
2
  import { styled } from '@nuskin/foundation-theme';
3
+ import { BynderMedia } from '../image/BynderMedia';
4
+ import { BynderImageDataType } from '../image/types';
4
5
 
5
6
  type NsPostProps = {
6
7
  text: string;
7
8
  body: string;
8
- backgroundImageUrl: string;
9
- backgroundImageAlt: string;
9
+ backgroundImageDetail: BynderImageDataType;
10
10
  className?: string;
11
11
  };
12
12
 
@@ -56,12 +56,10 @@ const CardContainer = styled(Box)(() => {
56
56
  };
57
57
  });
58
58
 
59
- const NsPost = ({ text, body, backgroundImageUrl, backgroundImageAlt, className }: NsPostProps) => {
59
+ const NsPost = ({ text, body, backgroundImageDetail, className }: NsPostProps) => {
60
60
  return (
61
61
  <CardContainer className={className} data-testid="post-card">
62
- <div className="image">
63
- <NsImage height={'100%'} width={'auto'} alt={backgroundImageAlt} src={backgroundImageUrl} />
64
- </div>
62
+ <BynderMedia className="image" imageDetail={backgroundImageDetail} />
65
63
  <div className="content">
66
64
  <article className="body-title">{text}</article>
67
65
  <article className="body-text">{body}</article>
@@ -1,14 +1,14 @@
1
1
  import Box from '@mui/material/Box';
2
2
  import { styled } from '@nuskin/foundation-theme';
3
- import { NsImage } from '../';
4
3
  import { NsCardButton } from './types';
5
4
  import CardButton from './CardButton';
5
+ import { BynderMedia } from '../image/BynderMedia';
6
+ import { BynderImageDataType } from '../image/types';
6
7
 
7
8
  type NsSmallFullCardProps = {
8
9
  title: string;
9
10
  subtitle: string;
10
- backgroundImageUrl: string;
11
- backgroundImageAlt: string;
11
+ backgroundImageDetail: BynderImageDataType;
12
12
  button?: NsCardButton;
13
13
  className?: string;
14
14
  };
@@ -66,14 +66,13 @@ const CardContainer = styled(Box)(() => {
66
66
  export default function NsSmallFullCard({
67
67
  title,
68
68
  subtitle,
69
- backgroundImageUrl,
70
- backgroundImageAlt,
69
+ backgroundImageDetail,
71
70
  button,
72
71
  className,
73
72
  }: NsSmallFullCardProps) {
74
73
  return (
75
74
  <CardContainer className={className} role="small-full-card" component="div" data-testid="small-full-card">
76
- <NsImage alt={backgroundImageAlt} src={backgroundImageUrl} className="image" />
75
+ <BynderMedia className="image" imageDetail={backgroundImageDetail} />
77
76
  <div className="gradientOverlay"></div>
78
77
  <div className="content">
79
78
  <article className="subtitle">{subtitle}</article>
@@ -1,14 +1,14 @@
1
1
  import Box from '@mui/material/Box';
2
2
  import { styled } from '@nuskin/foundation-theme';
3
- import { NsImage } from '../';
4
3
  import CardButton from './CardButton';
5
4
  import { NsCardButton } from './types';
5
+ import { BynderMedia } from '../image/BynderMedia';
6
+ import { BynderImageDataType } from '../image/types';
6
7
 
7
8
  type NsXLargeCardProps = {
8
9
  title: string;
9
10
  subtitle: string;
10
- backgroundImageUrl: string;
11
- backgroundImageAlt: string;
11
+ backgroundImageDetail: BynderImageDataType;
12
12
  button?: NsCardButton;
13
13
  className?: string;
14
14
  };
@@ -59,17 +59,10 @@ const CardContainer = styled(Box)(() => {
59
59
  };
60
60
  });
61
61
 
62
- export default function NsXLargeCard({
63
- title,
64
- subtitle,
65
- backgroundImageUrl,
66
- backgroundImageAlt,
67
- button,
68
- className,
69
- }: NsXLargeCardProps) {
62
+ export default function NsXLargeCard({ title, subtitle, backgroundImageDetail, button, className }: NsXLargeCardProps) {
70
63
  return (
71
64
  <CardContainer className={className} role="x-large-card" component="div" data-testid="x-large-card">
72
- <NsImage alt={backgroundImageAlt} src={backgroundImageUrl} className="image" />
65
+ <BynderMedia className="image" imageDetail={backgroundImageDetail} />
73
66
  <div className="gradientOverlay"></div>
74
67
  <div className="content">
75
68
  <article className="subtitle">{subtitle}</article>
@@ -0,0 +1,38 @@
1
+ import { BynderImageDataType } from '../../image/types';
2
+
3
+ export const ImageData1: BynderImageDataType = {
4
+ previewUrls: [],
5
+ selected: {
6
+ url: 'https://media.nuskin.com/transform/88d32408-ba18-4b7d-a688-4b91839bae4a/nu-skin-ageloc-lumispa-io-face-cleansing-beauty-device-usage-woman-blue-background-image',
7
+ width: null,
8
+ height: null,
9
+ fileSize: null,
10
+ imageType: 'transformBaseUrl',
11
+ altText: 'image-alt-text',
12
+ type: 'IMAGE',
13
+ fit: 'cover',
14
+ position: 'center center',
15
+ bgColor: '#ffffff',
16
+ },
17
+ isPublic: false,
18
+ type: 'IMAGE',
19
+ id: 'KEFzc2V0X2lkIDg4RDMyNDA4LUJBMTgtNEI3RC1BNjg4NEI5MTgzOUJBRTRBKQ==',
20
+ files: {
21
+ transformBaseUrl: {
22
+ url: 'https://media.nuskin.com/transform/88d32408-ba18-4b7d-a688-4b91839bae4a/nu-skin-ageloc-lumispa-io-face-cleansing-beauty-device-usage-woman-blue-background-image',
23
+ width: null,
24
+ height: null,
25
+ fileSize: null,
26
+ },
27
+ thumbnail: {
28
+ url: 'https://media.nuskin.com/m/3f1f52fbf00a552c/thul-nu-skin-ageloc-lumispa-io-face-cleansing-beauty-device-usage-woman-blue-background-image.png',
29
+ width: 250,
30
+ height: 250,
31
+ fileSize: null,
32
+ },
33
+ },
34
+ databaseId: '88D32408-BA18-4B7D-A6884B91839BAE4A',
35
+ name: 'nu-skin-ageloc-lumispa-io-face-cleansing-beauty-device-usage-woman-blue-background-image',
36
+ description: null,
37
+ };
38
+ export const ImageData1Text = JSON.stringify(ImageData1);
@@ -0,0 +1,38 @@
1
+ import { BynderImageDataType } from '../../image/types';
2
+
3
+ export const ImageData2: BynderImageDataType = {
4
+ previewUrls: [],
5
+ selected: {
6
+ url: 'https://media.nuskin.com/transform/88d32408-ba18-4b7d-a688-4b91839bae4a/nu-skin-ageloc-lumispa-io-face-cleansing-beauty-device-usage-woman-blue-background-image',
7
+ width: null,
8
+ height: null,
9
+ fileSize: null,
10
+ imageType: 'transformBaseUrl',
11
+ altText: 'image-alt-text',
12
+ type: 'IMAGE',
13
+ fit: 'cover',
14
+ position: 'center center',
15
+ bgColor: '#ffffff',
16
+ },
17
+ isPublic: false,
18
+ type: 'IMAGE',
19
+ id: 'KEFzc2V0X2lkIDg4RDMyNDA4LUJBMTgtNEI3RC1BNjg4NEI5MTgzOUJBRTRBKQ==',
20
+ files: {
21
+ transformBaseUrl: {
22
+ url: 'https://media.nuskin.com/transform/88d32408-ba18-4b7d-a688-4b91839bae4a/nu-skin-ageloc-lumispa-io-face-cleansing-beauty-device-usage-woman-blue-background-image',
23
+ width: null,
24
+ height: null,
25
+ fileSize: null,
26
+ },
27
+ thumbnail: {
28
+ url: 'https://media.nuskin.com/m/3f1f52fbf00a552c/thul-nu-skin-ageloc-lumispa-io-face-cleansing-beauty-device-usage-woman-blue-background-image.png',
29
+ width: 250,
30
+ height: 250,
31
+ fileSize: null,
32
+ },
33
+ },
34
+ databaseId: '88D32408-BA18-4B7D-A6884B91839BAE4A',
35
+ name: 'nu-skin-ageloc-lumispa-io-face-cleansing-beauty-device-usage-woman-blue-background-image',
36
+ description: null,
37
+ };
38
+ export const ImageData2Text = JSON.stringify(ImageData2);
@@ -1,14 +1,14 @@
1
1
  import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
3
  import NsAwardCard from '../NsAwardCard';
4
+ import { ImageData1 } from '../fixtures/ImageData1';
4
5
 
5
6
  describe('NsHeroCardLevel1 component', () => {
6
7
  const props = {
7
8
  title: 'AgeLoc LumiSpa iO',
8
9
  awardName: '2023 Bronze Winner',
9
10
  mediaOutlet: 'Edison Awards',
10
- backgroundImageUrl: 'https://media.nuskin.com/m/2ec571a87dc9680c/Small-Edison-Bronze-Logo-Homepage.jpg',
11
- backgroundImageAlt: 'Edison Bronze Logo',
11
+ backgroundImageDetail: ImageData1,
12
12
  };
13
13
 
14
14
  it('1. renders with correct content and styles', () => {
@@ -1,15 +1,14 @@
1
1
  import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
3
  import NsHeroCardLevel1 from '../NsHeroCardLevel1';
4
+ import { ImageData1 } from '../fixtures/ImageData1';
4
5
 
5
6
  describe('NsHeroCardLevel1 component', () => {
6
7
  const props = {
7
8
  cardTitle: 'A skin ready for winter',
8
9
  cardDescription:
9
10
  'We have brought these discoveries to life through our powerful skin care products and supplements.',
10
- backgroundImageUrl:
11
- 'https://media.nuskin.com/m/9734240cc191163/webimage-lash-brow-serum-carousel-image-launch.png',
12
- backgroundImageAlt: 'lash brow serum carousel',
11
+ backgroundImageDetail: ImageData1,
13
12
  button: {
14
13
  showButton: true,
15
14
  buttonText: 'SHOP NOW',
@@ -1,14 +1,14 @@
1
1
  import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
3
  import { NsHeroCardLevel2 } from '../';
4
+ import { ImageData1 } from '../fixtures/ImageData1';
4
5
 
5
6
  describe('NsHeroCardLevel2 component', () => {
6
7
  const props = {
7
8
  cardTitle: 'Current shop deals',
8
9
  cardDescription: 'Lumispa, sunscreen and more',
9
10
  brandName: 'Beauty focus™',
10
- backgroundImageUrl: 'https://media.nuskin.com/m/5f1c423bb57589f0/webimage-autumn-sale-carousel.png',
11
- backgroundImageAlt: 'lash brow serum carousel',
11
+ backgroundImageDetail: ImageData1,
12
12
  button: {
13
13
  showButton: true,
14
14
  buttonText: 'Discover more',
@@ -1,5 +1,6 @@
1
1
  import { render, screen } from '@testing-library/react';
2
2
  import { NsLargeCard } from '../';
3
+ import { ImageData1 } from '../fixtures/ImageData1';
3
4
 
4
5
  describe('NsLargeCard component', () => {
5
6
  const props = {
@@ -14,9 +15,7 @@ describe('NsLargeCard component', () => {
14
15
  buttonColor: 'secondary' as 'secondary',
15
16
  url: 'https://www.forceforgood.org/',
16
17
  },
17
- backgroundImageUrl:
18
- 'https://media.nuskin.com/m/95f9cf4143e3882/Small-About_Us-Personal-Care-Products-Image.jpg',
19
- backgroundImageAlt: 'Facial Moisturizers',
18
+ backgroundImageDetail: ImageData1,
20
19
  };
21
20
 
22
21
  it('1. renders with correct content and styles', () => {
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
3
  import NsMediumCard from '../NsMediumCard';
4
+ import { ImageData1 } from '../fixtures/ImageData1';
4
5
 
5
6
  describe('NsMediumCard component', () => {
6
7
  const props = {
@@ -15,8 +16,7 @@ describe('NsMediumCard component', () => {
15
16
  buttonColor: 'secondary' as 'secondary',
16
17
  url: '#',
17
18
  },
18
- backgroundImageUrl: 'https://media.nuskin.com/m/3353b9c05cb83860/Small-category-facial_moisturizers.jpg',
19
- backgroundImageAlt: 'Lumi Spa',
19
+ backgroundImageDetail: ImageData1,
20
20
  };
21
21
 
22
22
  it('1. renders with correct content and styles', () => {
@@ -33,7 +33,7 @@ describe('NsMediumCard component', () => {
33
33
  );
34
34
  expect(subtitleElement).toBeInTheDocument();
35
35
 
36
- const imageElement = screen.getByAltText('Lumi Spa');
36
+ const imageElement = screen.getByAltText(ImageData1.selected?.altText || '');
37
37
  expect(imageElement).toBeInTheDocument();
38
38
 
39
39
  const button = screen.queryByText('SEE WHAT WE’RE DOING');
@@ -1,13 +1,13 @@
1
1
  import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
3
  import NsPost from '../NsPost';
4
+ import { ImageData1 } from '../fixtures/ImageData1';
4
5
 
5
6
  describe('NsPost component', () => {
6
7
  const props = {
7
8
  text: '38 New Beauty Products Our Editors Are Loving',
8
9
  body: 'SPA & BEAUTY TODAY',
9
- backgroundImageUrl: 'https://media.nuskin.com/m/780f8d84bcb9d5ed/Small-Essence_News.jpg',
10
- backgroundImageAlt: 'small essence news',
10
+ backgroundImageDetail: ImageData1,
11
11
  };
12
12
 
13
13
  it('1. renders with correct content and styles', () => {
@@ -22,7 +22,7 @@ describe('NsPost component', () => {
22
22
  const bodyElement = screen.getByText('SPA & BEAUTY TODAY');
23
23
  expect(bodyElement).toBeInTheDocument();
24
24
 
25
- const imageElement = screen.getByAltText('small essence news');
25
+ const imageElement = screen.getByAltText(ImageData1?.selected?.altText || '');
26
26
  expect(imageElement).toBeInTheDocument();
27
27
  });
28
28
  });