@nuskin/foundation-ui-components 1.9.2 → 1.9.4
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 +6 -6
- package/src/common/autocomplete/NsAutocomplete.spec.tsx +22 -28
- package/src/common/autocomplete/NsAutocomplete.styled.tsx +6 -8
- package/src/common/autocomplete/NsAutocomplete.tsx +14 -8
- package/src/common/autocomplete/helper/LineLoader.tsx +37 -0
- package/src/common/autocomplete/helper/RecentClearAll.tsx +36 -0
- package/src/common/autocomplete/helper/SeeMoreButton.tsx +31 -4
- package/src/common/autocomplete/helper/index.ts +4 -0
- package/src/common/autocomplete/helper/renderGroupName.tsx +0 -1
- package/src/common/autocomplete/mock/MockData.ts +13 -14
- package/src/common/autocomplete/mock/MockUI.tsx +4 -5
- package/src/common/autocomplete/types.d.ts +1 -0
- package/src/common/card/CardButton.tsx +31 -0
- package/src/common/card/NsAwardCard.tsx +8 -5
- package/src/common/card/NsBrandCard.tsx +8 -17
- package/src/common/card/NsCheckoutCard.tsx +8 -7
- package/src/common/card/NsHeroCardLevel1.tsx +39 -50
- package/src/common/card/NsHeroCardLevel2.tsx +28 -67
- package/src/common/card/NsIconText.tsx +4 -4
- package/src/common/card/NsLargeCard.tsx +28 -55
- package/src/common/card/NsMediumCard.tsx +10 -21
- package/src/common/card/NsPost.tsx +13 -8
- package/src/common/card/NsSmallFullCard.tsx +13 -22
- package/src/common/card/NsXLargeCard.tsx +12 -11
- package/src/common/card/cardSizes.ts +4 -4
- package/src/common/card/specs/NsAwardCard.spec.tsx +29 -0
- package/src/common/card/specs/NsBrandCard.spec.tsx +18 -31
- package/src/common/card/specs/NsCheckoutCard.spec.tsx +4 -15
- package/src/common/card/specs/NsHeroCardLevel1.spec.tsx +16 -24
- package/src/common/card/specs/NsHeroCardLevel2.spec.tsx +18 -20
- package/src/common/card/specs/NsIconText.spec.tsx +0 -3
- package/src/common/card/specs/NsLargeCard.spec.tsx +26 -19
- package/src/common/card/specs/NsMediumCard.spec.tsx +28 -12
- package/src/common/card/specs/NsPost.spec.tsx +8 -11
- package/src/common/card/specs/NsSmallFullCard.spec.tsx +23 -12
- package/src/common/card/specs/NsXLargeCard.spec.tsx +23 -11
- package/src/common/card/stories/NsAwardCard.stories.tsx +0 -3
- package/src/common/card/stories/NsBrandCard.stories.tsx +8 -3
- package/src/common/card/stories/NsCheckoutCard.stories.tsx +3 -4
- package/src/common/card/stories/NsHeroCardLevel1.stories.tsx +11 -24
- package/src/common/card/stories/NsHeroCardLevel2.stories.tsx +10 -29
- package/src/common/card/stories/NsIconText.stories.tsx +2 -20
- package/src/common/card/stories/NsLargeCard.stories.tsx +8 -7
- package/src/common/card/stories/NsMediumCard.stories.tsx +7 -6
- package/src/common/card/stories/NsPost.stories.tsx +2 -19
- package/src/common/card/stories/NsSmallFullCard.stories.tsx +7 -4
- package/src/common/card/stories/NsXLargeCard.stories.tsx +8 -4
- package/src/common/card/types.d.ts +12 -0
- package/src/common/carousal/RenderBrand.tsx +0 -1
- package/src/common/autocomplete/helper/AutoCompleteButton.tsx +0 -24
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { StoryObj, Meta } from '@storybook/react';
|
|
2
|
-
import { withCenterDecorator } from '@/stories/decorators/withCenterDecorator';
|
|
3
2
|
import { NsAwardCard } from '../';
|
|
4
3
|
|
|
5
4
|
type ComponentType = typeof NsAwardCard;
|
|
@@ -9,8 +8,6 @@ type MetaStory = Meta<ComponentType>;
|
|
|
9
8
|
export default {
|
|
10
9
|
component: NsAwardCard,
|
|
11
10
|
title: 'Components/Containers/Card/NsAwardCard',
|
|
12
|
-
argTypes: {},
|
|
13
|
-
decorators: [withCenterDecorator],
|
|
14
11
|
} as MetaStory;
|
|
15
12
|
|
|
16
13
|
const host = 'https://media.nuskin.com';
|
|
@@ -19,9 +19,14 @@ export const Default: Story = {
|
|
|
19
19
|
backgroundImageUrl: 'https://media.nuskin.com/m/3604b5202b0b64c6/webimage-brand-lumispa-optweb.png',
|
|
20
20
|
brandImageUrl: 'https://media.nuskin.com/m/2571a0407433a6e8/webimage-brand-lumispa.png',
|
|
21
21
|
size: 'large',
|
|
22
|
-
button:
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
button: {
|
|
23
|
+
showButton: true,
|
|
24
|
+
buttonText: 'Add to cart',
|
|
25
|
+
buttonVariant: 'outlined',
|
|
26
|
+
buttonColor: 'primary',
|
|
27
|
+
endIcon: 'cart',
|
|
28
|
+
url: '#',
|
|
29
|
+
fullWidth: true,
|
|
25
30
|
},
|
|
26
31
|
},
|
|
27
32
|
};
|
|
@@ -9,16 +9,15 @@ type MetaStory = Meta<ComponentType>;
|
|
|
9
9
|
export default {
|
|
10
10
|
component: NsCheckoutCard,
|
|
11
11
|
title: 'Components/Containers/Card/NsCheckoutCard',
|
|
12
|
-
argTypes: {
|
|
13
|
-
onClick: { action: 'clicked' },
|
|
14
|
-
},
|
|
12
|
+
argTypes: {},
|
|
15
13
|
decorators: [withCenterDecorator],
|
|
16
14
|
} as MetaStory;
|
|
17
15
|
|
|
18
16
|
export const Default: Story = {
|
|
19
17
|
args: {
|
|
20
18
|
title: 'Section Title',
|
|
21
|
-
address: 'Address',
|
|
22
19
|
icon: 'home',
|
|
20
|
+
linkText: 'CHANGE',
|
|
21
|
+
url: '#',
|
|
23
22
|
},
|
|
24
23
|
};
|
|
@@ -1,7 +1,4 @@
|
|
|
1
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
2
|
import { NsHeroCardLevel1 } from '../';
|
|
6
3
|
|
|
7
4
|
type ComponentType = typeof NsHeroCardLevel1;
|
|
@@ -11,35 +8,25 @@ type MetaStory = Meta<ComponentType>;
|
|
|
11
8
|
export default {
|
|
12
9
|
component: NsHeroCardLevel1,
|
|
13
10
|
title: 'Components/Containers/Card/NsHeroCardLevel1',
|
|
14
|
-
argTypes: {
|
|
15
|
-
onClick: { action: 'clicked' },
|
|
16
|
-
},
|
|
17
|
-
decorators: [withCenterDecorator],
|
|
18
11
|
} as MetaStory;
|
|
19
12
|
|
|
20
|
-
const text = 'A skin ready for winter';
|
|
21
|
-
const body = 'We have brought these discoveries to life through our powerful skin care products and supplements.';
|
|
22
13
|
const host = 'https://media.nuskin.com/';
|
|
23
14
|
|
|
24
15
|
export const Default: Story = {
|
|
25
16
|
args: {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
},
|
|
30
|
-
text,
|
|
31
|
-
body,
|
|
17
|
+
cardTitle: 'A skin ready for winter',
|
|
18
|
+
cardDescription:
|
|
19
|
+
'We have brought these discoveries to life through our powerful skin care products and supplements.',
|
|
32
20
|
backgroundImageUrl: `${host}m/9734240cc191163/webimage-lash-brow-serum-carousel-image-launch.png`,
|
|
33
21
|
backgroundImageAlt: 'lash brow serum carousel',
|
|
34
|
-
|
|
35
|
-
|
|
22
|
+
button: {
|
|
23
|
+
showButton: true,
|
|
24
|
+
fullWidth: true,
|
|
25
|
+
buttonText: 'SHOP NOW',
|
|
26
|
+
buttonVariant: 'contained',
|
|
27
|
+
buttonColor: 'primary',
|
|
28
|
+
url: '#',
|
|
36
29
|
},
|
|
37
|
-
|
|
38
|
-
play: async ({ canvasElement }: any) => {
|
|
39
|
-
const canvas = within(canvasElement);
|
|
40
|
-
userEvent.hover(canvas.getByTestId('hero-card-level-1'));
|
|
41
|
-
userEvent.hover(canvas.getByRole('link'));
|
|
42
|
-
expect(canvas.getByText(text)).toBeInTheDocument();
|
|
43
|
-
expect(canvas.getByText(body)).toBeInTheDocument();
|
|
30
|
+
imagePosition: 'bottom',
|
|
44
31
|
},
|
|
45
32
|
};
|
|
@@ -1,7 +1,4 @@
|
|
|
1
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
2
|
import { NsHeroCardLevel2 } from '../';
|
|
6
3
|
|
|
7
4
|
type ComponentType = typeof NsHeroCardLevel2;
|
|
@@ -11,40 +8,24 @@ type MetaStory = Meta<ComponentType>;
|
|
|
11
8
|
export default {
|
|
12
9
|
component: NsHeroCardLevel2,
|
|
13
10
|
title: 'Components/Containers/Card/NsHeroCardLevel2',
|
|
14
|
-
argTypes: {
|
|
15
|
-
onClick: { action: 'clicked' },
|
|
16
|
-
},
|
|
17
|
-
decorators: [withCenterDecorator],
|
|
18
11
|
} as MetaStory;
|
|
19
12
|
|
|
20
|
-
const text = 'Current shop deals';
|
|
21
|
-
const body = 'Lumispa, sunscreen and more';
|
|
22
|
-
const icon = 'home';
|
|
23
|
-
const brand = 'Beauty focus™';
|
|
24
13
|
const host = 'https://media.nuskin.com/';
|
|
25
14
|
|
|
26
15
|
export const Default: Story = {
|
|
27
16
|
args: {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
},
|
|
32
|
-
text,
|
|
33
|
-
body,
|
|
34
|
-
icon,
|
|
35
|
-
brand,
|
|
17
|
+
cardTitle: 'Current shop deals',
|
|
18
|
+
cardDescription: 'Lumispa, sunscreen and more',
|
|
19
|
+
brandName: 'Beauty focus™',
|
|
36
20
|
backgroundImageUrl: `${host}m/5f1c423bb57589f0/webimage-autumn-sale-carousel.png`,
|
|
37
21
|
backgroundImageAlt: 'lash brow serum carousel',
|
|
38
|
-
|
|
39
|
-
|
|
22
|
+
button: {
|
|
23
|
+
showButton: true,
|
|
24
|
+
endIcon: 'arrowRight',
|
|
25
|
+
buttonText: 'Discover more',
|
|
26
|
+
buttonVariant: 'text',
|
|
27
|
+
buttonColor: 'primary',
|
|
28
|
+
url: 'https://www.forceforgood.org/',
|
|
40
29
|
},
|
|
41
30
|
},
|
|
42
|
-
play: async ({ canvasElement }: any) => {
|
|
43
|
-
const canvas = within(canvasElement);
|
|
44
|
-
userEvent.hover(canvas.getByTestId('hero-card-level-2'));
|
|
45
|
-
userEvent.hover(canvas.getByRole('link'));
|
|
46
|
-
expect(canvas.getByText(text)).toBeInTheDocument();
|
|
47
|
-
expect(canvas.getByText(body)).toBeInTheDocument();
|
|
48
|
-
expect(canvas.getByText(brand)).toBeInTheDocument();
|
|
49
|
-
},
|
|
50
31
|
};
|
|
@@ -1,7 +1,4 @@
|
|
|
1
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
2
|
import { NsIconText } from '../';
|
|
6
3
|
|
|
7
4
|
type ComponentType = typeof NsIconText;
|
|
@@ -11,26 +8,11 @@ type MetaStory = Meta<ComponentType>;
|
|
|
11
8
|
export default {
|
|
12
9
|
component: NsIconText,
|
|
13
10
|
title: 'Components/Containers/Card/NsIconText',
|
|
14
|
-
argTypes: {},
|
|
15
|
-
decorators: [withCenterDecorator],
|
|
16
11
|
} as MetaStory;
|
|
17
12
|
|
|
18
|
-
const text = 'Lorem ipsum';
|
|
19
|
-
const body = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Natoque lacus, in amet nunc. ';
|
|
20
|
-
|
|
21
13
|
export const Default: Story = {
|
|
22
14
|
args: {
|
|
23
|
-
text,
|
|
24
|
-
body,
|
|
25
|
-
additionalProps: {
|
|
26
|
-
testid: 'icon-text-card',
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
play: async ({ canvasElement }: any) => {
|
|
30
|
-
const canvas = within(canvasElement);
|
|
31
|
-
userEvent.hover(canvas.getByTestId('icon-text-card'));
|
|
32
|
-
userEvent.hover(canvas.getByRole('link'));
|
|
33
|
-
expect(canvas.getByText(text)).toBeInTheDocument();
|
|
34
|
-
expect(canvas.getByText(body)).toBeInTheDocument();
|
|
15
|
+
text: 'Lorem ipsum',
|
|
16
|
+
body: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Natoque lacus, in amet nunc. ',
|
|
35
17
|
},
|
|
36
18
|
};
|
|
@@ -9,7 +9,6 @@ type MetaStory = Meta<ComponentType>;
|
|
|
9
9
|
export default {
|
|
10
10
|
component: NsLargeCard,
|
|
11
11
|
title: 'Components/Containers/Card/NsLargeCard',
|
|
12
|
-
argTypes: {},
|
|
13
12
|
decorators: [withCenterDecorator],
|
|
14
13
|
} as MetaStory;
|
|
15
14
|
|
|
@@ -21,13 +20,15 @@ export const Default: Story = {
|
|
|
21
20
|
title: 'Personal Care',
|
|
22
21
|
subtitle: 'Subtitle',
|
|
23
22
|
intro: 'Nu Skin® product lines combine nature and science for skincare benefits you can see and feel.',
|
|
24
|
-
icon: 'cart',
|
|
25
|
-
cardLink: {
|
|
26
|
-
href: 'https://www.forceforgood.org/',
|
|
27
|
-
title: 'REVEAL YOUR BEST SKIN',
|
|
28
|
-
},
|
|
29
|
-
buttonVariant: 'outlined',
|
|
30
23
|
backgroundImageUrl: `${host}/m/95f9cf4143e3882/Small-About_Us-Personal-Care-Products-Image.jpg`,
|
|
31
24
|
backgroundImageAlt: 'Facial Moisturizers',
|
|
25
|
+
button: {
|
|
26
|
+
showButton: true,
|
|
27
|
+
buttonText: 'REVEAL YOUR BEST SKIN',
|
|
28
|
+
buttonVariant: 'outlined',
|
|
29
|
+
buttonColor: 'primary',
|
|
30
|
+
url: 'https://www.forceforgood.org/',
|
|
31
|
+
endIcon: 'cart',
|
|
32
|
+
},
|
|
32
33
|
},
|
|
33
34
|
};
|
|
@@ -21,13 +21,14 @@ export const Default: Story = {
|
|
|
21
21
|
titleFontWeight: 'bold',
|
|
22
22
|
subtitle:
|
|
23
23
|
'We’re committed to keeping our global communities clean, safe, and protected for the future. We’re proud to embrace sustainable practices today for a resource-rich tomorrow.',
|
|
24
|
-
cardLink: {
|
|
25
|
-
href: 'https://www.forceforgood.org/',
|
|
26
|
-
title: 'SEE WHAT WE’RE DOING',
|
|
27
|
-
},
|
|
28
|
-
icon: 'arrowRight',
|
|
29
|
-
buttonVariant: 'outlined',
|
|
30
24
|
backgroundImageUrl: `${host}/m/3353b9c05cb83860/Small-category-facial_moisturizers.jpg`,
|
|
31
25
|
backgroundImageAlt: 'Lumi Spa',
|
|
26
|
+
button: {
|
|
27
|
+
showButton: true,
|
|
28
|
+
buttonText: 'SEE WHAT WE’RE DOING',
|
|
29
|
+
buttonVariant: 'outlined',
|
|
30
|
+
buttonColor: 'primary',
|
|
31
|
+
url: 'https://www.forceforgood.org/',
|
|
32
|
+
},
|
|
32
33
|
},
|
|
33
34
|
};
|
|
@@ -1,7 +1,4 @@
|
|
|
1
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
2
|
import { NsPost } from '../';
|
|
6
3
|
|
|
7
4
|
type ComponentType = typeof NsPost;
|
|
@@ -11,29 +8,15 @@ type MetaStory = Meta<ComponentType>;
|
|
|
11
8
|
export default {
|
|
12
9
|
component: NsPost,
|
|
13
10
|
title: 'Components/Containers/Card/NsPost',
|
|
14
|
-
argTypes: {},
|
|
15
|
-
decorators: [withCenterDecorator],
|
|
16
11
|
} as MetaStory;
|
|
17
12
|
|
|
18
|
-
const text = '38 New Beauty Products Our Editors Are Loving';
|
|
19
|
-
const body = 'SPA & BEAUTY TODAY';
|
|
20
13
|
const host = 'https://media.nuskin.com/';
|
|
21
14
|
|
|
22
15
|
export const Default: Story = {
|
|
23
16
|
args: {
|
|
24
|
-
text,
|
|
25
|
-
body,
|
|
17
|
+
text: '38 New Beauty Products Our Editors Are Loving',
|
|
18
|
+
body: 'SPA & BEAUTY TODAY',
|
|
26
19
|
backgroundImageUrl: `${host}m/780f8d84bcb9d5ed/Small-Essence_News.jpg`,
|
|
27
20
|
backgroundImageAlt: 'small essence news',
|
|
28
|
-
additionalProps: {
|
|
29
|
-
testid: 'post-card',
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
play: async ({ canvasElement }: any) => {
|
|
33
|
-
const canvas = within(canvasElement);
|
|
34
|
-
userEvent.hover(canvas.getByTestId('post-card'));
|
|
35
|
-
userEvent.hover(canvas.getByRole('link'));
|
|
36
|
-
expect(canvas.getByText(text)).toBeInTheDocument();
|
|
37
|
-
expect(canvas.getByText(body)).toBeInTheDocument();
|
|
38
21
|
},
|
|
39
22
|
};
|
|
@@ -19,11 +19,14 @@ export const Default: Story = {
|
|
|
19
19
|
args: {
|
|
20
20
|
title: 'Title',
|
|
21
21
|
subtitle: 'Subtitle',
|
|
22
|
-
cardLink: {
|
|
23
|
-
href: 'https://www.forceforgood.org/',
|
|
24
|
-
title: 'Placeholder',
|
|
25
|
-
},
|
|
26
22
|
backgroundImageUrl: `${host}/m/4f5b0aee8fe3ff90/Small-category-makeup.jpg`,
|
|
27
23
|
backgroundImageAlt: 'Facial Moisturizers',
|
|
24
|
+
button: {
|
|
25
|
+
showButton: true,
|
|
26
|
+
buttonText: 'Placeholder',
|
|
27
|
+
buttonVariant: 'contained',
|
|
28
|
+
buttonColor: 'primary',
|
|
29
|
+
url: '#',
|
|
30
|
+
},
|
|
28
31
|
},
|
|
29
32
|
};
|
|
@@ -19,11 +19,15 @@ export const Default: Story = {
|
|
|
19
19
|
args: {
|
|
20
20
|
title: 'Title',
|
|
21
21
|
subtitle: 'Subtitle',
|
|
22
|
-
cardLink: {
|
|
23
|
-
href: 'https://www.forceforgood.org/',
|
|
24
|
-
title: 'Call to action',
|
|
25
|
-
},
|
|
26
22
|
backgroundImageUrl: `${host}/m/4f5b0aee8fe3ff90/Small-category-makeup.jpg`,
|
|
27
23
|
backgroundImageAlt: 'Facial Moisturizers',
|
|
24
|
+
button: {
|
|
25
|
+
showButton: true,
|
|
26
|
+
buttonText: 'Discover more',
|
|
27
|
+
buttonVariant: 'outlined',
|
|
28
|
+
buttonColor: 'secondary',
|
|
29
|
+
url: '#',
|
|
30
|
+
endIcon: 'home',
|
|
31
|
+
},
|
|
28
32
|
},
|
|
29
33
|
};
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { AdditionalProps, CslpTag } from '../common.types';
|
|
2
|
+
import { NsIconNameType } from '../icon';
|
|
3
|
+
|
|
2
4
|
export type NsFfgCardProps = AdditionalProps & {
|
|
3
5
|
topImageUrl: string;
|
|
4
6
|
topImageAlt: string;
|
|
@@ -10,3 +12,13 @@ export type NsFfgCardProps = AdditionalProps & {
|
|
|
10
12
|
action_text: CslpTag;
|
|
11
13
|
};
|
|
12
14
|
};
|
|
15
|
+
|
|
16
|
+
export type NsCardButton = {
|
|
17
|
+
showButton?: boolean;
|
|
18
|
+
fullWidth?: boolean;
|
|
19
|
+
url?: string;
|
|
20
|
+
endIcon?: NsIconNameType;
|
|
21
|
+
buttonText: string;
|
|
22
|
+
buttonVariant?: 'text' | 'outlined' | 'contained';
|
|
23
|
+
buttonColor?: 'secondary' | 'primary';
|
|
24
|
+
};
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { NsButton, NsTypography } from '../..';
|
|
2
|
-
|
|
3
|
-
type AutoCompleteButtonProps = {
|
|
4
|
-
text: string;
|
|
5
|
-
show: boolean;
|
|
6
|
-
onClick(): void;
|
|
7
|
-
testId?: string;
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export const AutoCompleteButton = (props: AutoCompleteButtonProps) => {
|
|
11
|
-
const { show, onClick, text, testId } = props;
|
|
12
|
-
if (!show) {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
return (
|
|
16
|
-
<li className="text-right p-3">
|
|
17
|
-
<NsButton onClick={onClick} data-testid={testId}>
|
|
18
|
-
<NsTypography variant="body-xs" weight="bold">
|
|
19
|
-
{text}
|
|
20
|
-
</NsTypography>
|
|
21
|
-
</NsButton>
|
|
22
|
-
</li>
|
|
23
|
-
);
|
|
24
|
-
};
|