@nuskin/foundation-ui-components 1.6.1 → 1.7.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 (43) hide show
  1. package/package.json +1 -1
  2. package/src/common/card/NsBrandCard.tsx +94 -0
  3. package/src/common/card/NsCheckoutCard.tsx +92 -0
  4. package/src/common/card/NsHeroCardLevel1.tsx +106 -0
  5. package/src/common/card/NsHeroCardLevel2.tsx +126 -0
  6. package/src/common/card/NsIconText.tsx +153 -0
  7. package/src/common/card/NsLargeCard.tsx +120 -0
  8. package/src/common/card/NsMediumCard.tsx +64 -0
  9. package/src/common/card/NsPost.tsx +60 -0
  10. package/src/common/card/NsSmallFullCard.tsx +90 -0
  11. package/src/common/card/NsXLargeCard.tsx +80 -0
  12. package/src/common/card/cardSizes.ts +12 -0
  13. package/src/common/card/index.ts +10 -2
  14. package/src/common/card/specs/BrandLogo.spec.tsx +1 -1
  15. package/src/common/card/specs/NsBgCard.spec.tsx +2 -2
  16. package/src/common/card/specs/NsBrandCard.spec.tsx +97 -0
  17. package/src/common/card/specs/NsCheckoutCard.spec.tsx +50 -0
  18. package/src/common/card/specs/NsHeroCardLevel1.spec.tsx +48 -0
  19. package/src/common/card/specs/NsHeroCardLevel2.spec.tsx +51 -0
  20. package/src/common/card/specs/NsIconText.spec.tsx +28 -0
  21. package/src/common/card/specs/NsLargeCard.spec.tsx +41 -0
  22. package/src/common/card/specs/NsMediumCard.spec.tsx +35 -0
  23. package/src/common/card/specs/NsPost.spec.tsx +31 -0
  24. package/src/common/card/specs/NsSmallFullCard.spec.tsx +36 -0
  25. package/src/common/card/specs/NsXLargeCard.spec.tsx +35 -0
  26. package/src/common/card/stories/{NsBrandProductCard.stories.tsx → NsBrandCard.stories.tsx} +9 -4
  27. package/src/common/card/stories/NsCheckoutCard.stories.tsx +24 -0
  28. package/src/common/card/stories/NsHeroCardLevel1.stories.tsx +45 -0
  29. package/src/common/card/stories/NsHeroCardLevel2.stories.tsx +50 -0
  30. package/src/common/card/stories/NsIconText.stories.tsx +36 -0
  31. package/src/common/card/stories/NsLargeCard.stories.tsx +32 -0
  32. package/src/common/card/stories/NsMediumCard.stories.tsx +29 -0
  33. package/src/common/card/stories/NsPost.stories.tsx +39 -0
  34. package/src/common/card/stories/NsSmallFullCard.stories.tsx +29 -0
  35. package/src/common/card/stories/NsXLargeCard.stories.tsx +29 -0
  36. package/src/common/carousal/RenderBrand.tsx +3 -2
  37. package/src/common/card/NsBrandProductCard.tsx +0 -47
  38. package/src/common/card/NsFfgCard.tsx +0 -24
  39. package/src/common/card/specs/NsBrandProductCard.spec.tsx +0 -32
  40. package/src/common/card/specs/NsFfgCard.spec.tsx +0 -33
  41. package/src/common/card/stories/NsBgCard.stories.tsx +0 -20
  42. package/src/common/card/stories/NsFfgCard.stories.tsx +0 -73
  43. package/src/common/card/styled/NsFfgStyled.tsx +0 -46
@@ -1,47 +0,0 @@
1
- import Box from '@mui/material/Box';
2
- import { styled } from '@nuskin/foundation-theme';
3
- import { NsTypography } from '../';
4
- import NsBrandWrapper from './NsBrandWrapper';
5
- import NsBrandLogo from './NsBrandLogo';
6
- import NsBgCard from './NsBgCard';
7
-
8
- type NsBrandProductCardProps = {
9
- title?: string;
10
- brandImageUrl: string;
11
- backgroundImageUrl: string;
12
- };
13
- const CardContainer = styled(Box)(() => {
14
- return {
15
- width: '256px',
16
- display: 'flex',
17
- alignItems: 'start',
18
- justifyContent: 'center',
19
- position: 'relative',
20
- flexDirection: 'column',
21
- '.brand-title': {
22
- marginTop: '20px',
23
- fontSize: '20px',
24
- },
25
- ':hover': {
26
- '.brand-title': {
27
- opacity: '0.7',
28
- },
29
- },
30
- };
31
- });
32
- export default function NsBrandProductCard({ title, brandImageUrl, backgroundImageUrl }: NsBrandProductCardProps) {
33
- return (
34
- <CardContainer role="brand-card" component="div" data-testid="brand-product-card">
35
- <NsBgCard backgroundImageUrl={backgroundImageUrl}>
36
- <NsBrandWrapper>
37
- <NsBrandLogo component="img" image={brandImageUrl} />
38
- </NsBrandWrapper>
39
- </NsBgCard>
40
- {title ? (
41
- <NsTypography variant="h3" className="brand-title">
42
- {title}
43
- </NsTypography>
44
- ) : null}
45
- </CardContainer>
46
- );
47
- }
@@ -1,24 +0,0 @@
1
- import { NsLink, NsImage } from '../';
2
- import { NsFfgStyled } from './styled/NsFfgStyled';
3
- import { NsFfgCardProps } from './types.d';
4
-
5
- const NsFfgCard = ({ cardLink, text, topImageUrl, topImageAlt, additionalProps, cslp, onClick }: NsFfgCardProps) => {
6
- return (
7
- <NsFfgStyled
8
- data-testid={additionalProps?.testid}
9
- onClick={onClick}
10
- className={additionalProps?.className ?? ''}
11
- >
12
- <header className="top-image">
13
- <NsImage height={192} width={288} alt={topImageAlt} src={topImageUrl} />
14
- </header>
15
- <article className="body-text" {...cslp?.card_text}>
16
- {text}
17
- </article>
18
- <NsLink className="action-link" href={cardLink.href} additionalProps={cslp?.action_text}>
19
- {cardLink.title || 'LEARN MORE'}
20
- </NsLink>
21
- </NsFfgStyled>
22
- );
23
- };
24
- export default NsFfgCard;
@@ -1,32 +0,0 @@
1
- import { render } from '@testing-library/react';
2
- import NsBrandProductCard from '../NsBrandProductCard';
3
-
4
- describe('NSBgCard component', () => {
5
- const props = {
6
- title: 'Nutricentials',
7
- brandImageUrl: 'https://media.nuskin.com/m/f3a91129cbbae32/webimage-brand-nutricentials.png',
8
- backgroundImageUrl: 'https://media.nuskin.com/m/298104036e885b40/webimage-brand-nutricentials.png',
9
- };
10
- it('render brand image', () => {
11
- const { container } = render(<NsBrandProductCard {...props} />);
12
- const img = container.querySelector('img');
13
- expect(img).toHaveAttribute('src', props.brandImageUrl);
14
- });
15
- it('render background image', () => {
16
- const { container } = render(<NsBrandProductCard {...props} />);
17
- const card = container.querySelector('div.MuiPaper-root');
18
- expect(card).toHaveStyle(`
19
- background-image: url(${props.backgroundImageUrl});
20
- `);
21
- });
22
- it('renders title', () => {
23
- const { getByText } = render(<NsBrandProductCard {...props} />);
24
- const cardElement = getByText(props.title);
25
- expect(cardElement).toBeInTheDocument();
26
- });
27
- it('does not render title, when title is not passed', () => {
28
- const { container } = render(<NsBrandProductCard {...{ ...props, title: undefined }} />);
29
- const cardElement = container.querySelector('.brand-title');
30
- expect(cardElement).toBeNull();
31
- });
32
- });
@@ -1,33 +0,0 @@
1
- import { render, screen, fireEvent } from '@testing-library/react';
2
- import NsFfgCard from '../NsFfgCard';
3
-
4
- describe('NsFfgCard component', () => {
5
- const props = {
6
- topImageUrl: 'https://media.nuskin.com/m/6245528b8f76ad32/webimage-brand-ageLOC.png',
7
- topImageAlt: 'alt-text',
8
- text: 'card text',
9
- cardLink: { href: 'https://www.google.com', title: 'Test' },
10
- onClick: jest.fn(),
11
- };
12
- it('1. renders with background image', () => {
13
- render(<NsFfgCard {...props} additionalProps={{ testid: 'ffg-card' }} />);
14
- const card = screen.getByTestId('ffg-card');
15
- expect(card).toHaveStyle(`
16
- background-color: #fff;
17
- `);
18
- });
19
- it('2. renders with cover size', () => {
20
- render(<NsFfgCard {...props} additionalProps={{ testid: 'ffg-card-1' }} />);
21
- const card = screen.getByText(props.cardLink.title);
22
- expect(card).toBeInTheDocument();
23
- });
24
- it('3. calls onclick', () => {
25
- const handler = jest.fn();
26
- const { getByTestId } = render(
27
- <NsFfgCard {...props} onClick={handler} additionalProps={{ testid: 'ffg-card-1' }} />
28
- );
29
- const card = getByTestId('ffg-card-1');
30
- fireEvent.click(card);
31
- expect(handler).toHaveBeenCalled();
32
- });
33
- });
@@ -1,20 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import { NsBgCard } from '../';
3
- import { withCenterDecorator } from '@/stories/decorators/withCenterDecorator';
4
-
5
- type ComponentType = typeof NsBgCard;
6
- type Story = StoryObj<ComponentType>;
7
- type MetaStory = Meta<ComponentType>;
8
-
9
- export default {
10
- component: NsBgCard,
11
- title: 'Components/Containers/Card/NsBgCard',
12
- argTypes: {},
13
- args: {
14
- title: 'ageLOC LumiSpa',
15
- backgroundImageUrl: 'https://media.nuskin.com/m/3604b5202b0b64c6/webimage-brand-lumispa-optweb.png',
16
- },
17
- decorators: [withCenterDecorator],
18
- } as MetaStory;
19
-
20
- export const BgCard: Story = {};
@@ -1,73 +0,0 @@
1
- import type { StoryObj, Meta } from '@storybook/react';
2
- import { within, userEvent } from '@storybook/testing-library';
3
- import { expect } from '@storybook/jest';
4
- import { withCenterDecorator } from '@/stories/decorators/withCenterDecorator';
5
- import { NsFfgCard } from '../';
6
-
7
- type ComponentType = typeof NsFfgCard;
8
- type Story = StoryObj<ComponentType>;
9
- type MetaStory = Meta<ComponentType>;
10
-
11
- export default {
12
- component: NsFfgCard,
13
- title: 'Components/Containers/Card/NsFfgCard',
14
- argTypes: {
15
- onClick: {
16
- action: 'clicked',
17
- },
18
- },
19
- decorators: [withCenterDecorator],
20
- } as MetaStory;
21
-
22
- const text = `Every child deserves a chance to shine. Through our Nu Skin Force for Good Foundation,
23
- we’re empowering children around the world with hope for a brighter future.`;
24
- const host = 'https://images.contentstack.io/v3/assets';
25
-
26
- export const Default: Story = {
27
- args: {
28
- cardLink: {
29
- href: 'https://www.forceforgood.org/',
30
- title: 'LEARN MORE',
31
- },
32
- text,
33
- topImageUrl: `${host}/blt594f30e2dc643eae/blt34cdb300dc9b93ff/645ccaa7520ba1a1af13a08a/nsffg-foundation.webp`,
34
- topImageAlt: 'Force for Good Foundation',
35
- additionalProps: {
36
- testid: 'ffg-card',
37
- },
38
- onClick: () => {
39
- console.log('onClick called');
40
- },
41
- },
42
- play: async ({ canvasElement }: any) => {
43
- const canvas = within(canvasElement);
44
- userEvent.hover(canvas.getByTestId('ffg-card'));
45
- userEvent.hover(canvas.getByRole('link'));
46
- expect(canvas.getByText(text)).toBeInTheDocument();
47
- },
48
- };
49
- const d = { count: -1 };
50
- export const OnClick: Story = {
51
- args: {
52
- cardLink: {
53
- href: 'https://www.forceforgood.org/',
54
- title: 'LEARN MORE',
55
- },
56
- text,
57
- topImageUrl: `${host}/blt594f30e2dc643eae/blt34cdb300dc9b93ff/645ccaa7520ba1a1af13a08a/nsffg-foundation.webp`,
58
- topImageAlt: 'Force for Good Foundation',
59
- additionalProps: {
60
- testid: 'ffg-card',
61
- },
62
- onClick: () => {
63
- d.count = 1;
64
- console.log('on click called');
65
- },
66
- },
67
- play: async ({ canvasElement }: any) => {
68
- d.count = 0;
69
- const canvas = within(canvasElement);
70
- userEvent.click(canvas.getByTestId('ffg-card'));
71
- expect(d.count).toEqual(1);
72
- },
73
- };
@@ -1,46 +0,0 @@
1
- import { Box } from '@mui/material';
2
- import { styled } from '@nuskin/foundation-theme';
3
-
4
- const Component = () => {
5
- return {
6
- backgroundClip: 'border-box',
7
- backgroundColor: '#fff',
8
- border: '1px solid #eff2f7',
9
- borderRadius: '1rem',
10
- boxShadow: '0 0.75rem 1.5rem rgba(18, 38, 63, .03)',
11
- cursor: 'pointer',
12
- display: 'flex',
13
- flexDirection: 'column' as 'column', // https://github.com/cssinjs/jss/issues/1344
14
- marginBottom: '16px',
15
- transition: 'all .2s ease',
16
- textAlign: 'center' as 'center',
17
- wordWrap: 'break-word' as 'break-word',
18
- ':hover': {
19
- transform: 'translateY(-10px)',
20
- boxShadow: '0 1rem 3rem rgba(31, 45, 61, .125) !important',
21
- '.action-link': {
22
- color: '#2CD5C4',
23
- textDecoration: 'none',
24
- },
25
- },
26
- '.body-text': {
27
- padding: '0 1.5rem 4rem',
28
- fontSize: '16px',
29
- color: '#8492a6',
30
- },
31
- '.top-image': {
32
- padding: '3rem 1.5rem',
33
- img: {
34
- maxWidth: '100%',
35
- },
36
- },
37
- '.action-link': {
38
- color: '#3c4858',
39
- fontSize: '1.25rem',
40
- padding: '0 1.5rem 3rem',
41
- fontWeight: 600,
42
- marginBottom: '0.67rem',
43
- },
44
- };
45
- };
46
- export const NsFfgStyled = styled(Box)(Component);