@transferwise/components 0.0.0-experimental-0b6dfe0 → 0.0.0-experimental-6dd9117
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/build/index.esm.js +54 -109
- package/build/index.esm.js.map +1 -1
- package/build/index.js +54 -109
- package/build/index.js.map +1 -1
- package/build/main.css +1 -1
- package/build/styles/main.css +1 -1
- package/build/styles/promoCard/PromoCard.css +1 -1
- package/build/types/accordion/AccordionItem/AccordionItem.d.ts.map +1 -1
- package/build/types/common/card/Card.d.ts.map +1 -1
- package/build/types/common/card/index.d.ts +0 -1
- package/build/types/common/card/index.d.ts.map +1 -1
- package/build/types/common/index.d.ts +1 -0
- package/build/types/common/randomId.d.ts +13 -0
- package/build/types/common/randomId.d.ts.map +1 -0
- package/build/types/promoCard/PromoCard.d.ts +3 -9
- package/build/types/promoCard/PromoCard.d.ts.map +1 -1
- package/build/types/promoCard/PromoCardIndicator.d.ts +3 -5
- package/build/types/promoCard/PromoCardIndicator.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/accordion/AccordionItem/AccordionItem.spec.js +1 -0
- package/src/accordion/AccordionItem/AccordionItem.tsx +19 -11
- package/src/accordion/AccordionItem/__snapshots__/AccordionItem.spec.js.snap +18 -4
- package/src/common/card/Card.tsx +2 -6
- package/src/common/card/index.ts +0 -1
- package/src/common/index.js +1 -0
- package/src/common/randomId.ts +14 -0
- package/src/main.css +1 -1
- package/src/promoCard/PromoCard.css +1 -1
- package/src/promoCard/PromoCard.less +9 -9
- package/src/promoCard/PromoCard.spec.tsx +0 -1
- package/src/promoCard/PromoCard.story.tsx +30 -90
- package/src/promoCard/PromoCard.tsx +23 -85
- package/src/promoCard/PromoCardIndicator.tsx +8 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
.np-Card{--Card-image-scale:1;--Card-image-translate:0;--Card-indicator-text-background-color:var(--color-background-neutral);--Card-indicator-icon-background-color:var(--color-interactive-accent);--Card-indicator-icon-color:var(--color-interactive-control);--Card-check-background-color:var(--color-interactive-primary);--Card-check-color:var(--color-interactive-control)}.np-Card--promoCard{--Card-max-width:358px}.np-Card--promoCard.is-disabled{filter:grayscale(1);opacity:.45}.np-Card-image{height:auto;left:-24px;left:calc(var(--size-24)*-1);margin:0 auto;position:relative;transform:scale(var(--Card-image-scale)) translateY(var(--Card-image-translate));transition:transform .5s ease-in-out;width:100%;width:calc(100% + 48px);width:calc(100% + var(--size-48))}[dir=rtl] .np-Card-image{left:auto;right:-24px;right:calc(var(--size-24)*-1)}.np-Card-
|
|
1
|
+
.np-Card{--Card-image-scale:1;--Card-image-translate:0;--Card-indicator-text-background-color:var(--color-background-neutral);--Card-indicator-icon-background-color:var(--color-interactive-accent);--Card-indicator-icon-color:var(--color-interactive-control);--Card-check-background-color:var(--color-interactive-primary);--Card-check-color:var(--color-interactive-control)}.np-Card--promoCard{--Card-max-width:358px}.np-Card--promoCard.is-disabled{filter:grayscale(1);opacity:.45}.np-Card-image{height:auto;left:-24px;left:calc(var(--size-24)*-1);margin:0 auto;position:relative;transform:scale(var(--Card-image-scale)) translateY(var(--Card-image-translate));transition:transform .5s ease-in-out;width:100%;width:calc(100% + 48px);width:calc(100% + var(--size-48))}[dir=rtl] .np-Card-image{left:auto;right:-24px;right:calc(var(--size-24)*-1)}.np-Card-indicator{bottom:8px;bottom:var(--size-8);display:flex;gap:4px;gap:var(--size-4);position:absolute;right:8px;right:var(--size-8)}[dir=rtl] .np-Card-indicator{left:8px;left:var(--size-8);right:auto}.np-Card-indicatorText{background:var(--Card-indicator-text-background-color);border-radius:100px;display:inline-block;padding:16px;padding:var(--size-16);text-align:left;vertical-align:middle}.np-Card-indicatorIcon{align-items:center;background:var(--Card-indicator-icon-background-color);border-radius:9999px;border-radius:var(--radius-full);color:var(--Card-indicator-icon-color);display:inline-block;display:flex;height:56px;height:var(--size-56);justify-content:center;width:56px;width:var(--size-56)}[dir=rtl] .np-Card-indicatorIcon{transform:scaleX(-1)}.np-Card--checked,.np-Card--link{box-shadow:none;color:currentColor;cursor:pointer;transform:scale(1);transition:box-shadow .2s ease-in-out,transform .5s ease-in-out}.np-theme-personal:not(.np-theme-personal--dark,.np-theme-personal--bright-green,.np-theme-personal--forest-green) .np-Card--checked,.np-theme-personal:not(.np-theme-personal--dark,.np-theme-personal--bright-green,.np-theme-personal--forest-green) .np-Card--link{--Card-box-shadow:0px 20px var(--size-40) 0px var(--color-background-neutral);--Card-check-color:var(--color-interactive-accent)}.np-Card--checked.is-disabled,.np-Card--link.is-disabled{cursor:not-allowed}@media (prefers-reduced-motion:reduce){.np-Card--checked,.np-Card--link{transition:none}}.np-Card--checked:hover:not(.is-disabled,:disabled,.is-checked,:focus-within),.np-Card--link:hover:not(.is-disabled,:disabled,.is-checked,:focus-within){--Card-image-scale:1.1;box-shadow:var(--Card-box-shadow)}.np-Card--checked:active:not(.is-disabled,:disabled,.is-checked),.np-Card--link:active:not(.is-disabled,:disabled,.is-checked){--Card-background-color:var(--color-background-neutral-active);--Card-image-scale:1.1;--Card-image-translate:var(--size-8);box-shadow:var(--Card-box-shadow);transform:scale(98%)}.np-theme-personal--bright-green .np-Card--checked:active:not(.is-disabled,:disabled,.is-checked),.np-theme-personal--bright-green .np-Card--link:active:not(.is-disabled,:disabled,.is-checked){--Card-background-color:var(--color-background-neutral)}.np-Card--checked:focus-visible:not(.is-disabled,:disabled),.np-Card--checked:has(:focus-visible):not(.np-Card--checked),.np-Card--link:focus-visible:not(.is-disabled,:disabled),.np-Card--link:has(:focus-visible):not(.np-Card--checked){--Card-image-scale:1.1;box-shadow:var(--Card-box-shadow);outline:var(--ring-outline-color) solid 4px;outline:var(--ring-outline-color) solid var(--size-4);outline-offset:4px;outline-offset:var(--size-4)}.np-Card--link .np-Card-titleLink{color:#37517e;color:var(--color-content-primary);text-decoration:none}.np-Card--link .np-Card-titleLink:focus-visible{outline:none}.np-Card--link .np-Card-titleLink:after{content:"";display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:10}.np-Card--checked.is-checked{box-shadow:0 0 0 4px var(--color-interactive-primary);box-shadow:0 0 0 var(--size-4) var(--color-interactive-primary)}.np-Card--checked.is-checked .np-Card-check{align-items:center;background:var(--Card-check-background-color);border-radius:9999px;border-radius:var(--radius-full);color:var(--Card-check-color);display:flex;height:40px;height:var(--size-40);justify-content:center;position:absolute;right:8px;right:var(--size-8);top:8px;top:var(--size-8);width:40px;width:var(--size-40)}[dir=rtl] .np-Card--checked.is-checked .np-Card-check{left:8px;left:var(--size-8);right:auto}.np-Card--checked.is-checked:focus-visible:not(.is-disabled,:disabled){box-shadow:none}.np-CardGroup{display:flex;flex-direction:column;gap:24px;gap:var(--size-24);width:100%}@media (min-width:768px){.np-CardGroup{flex-direction:row}}.np-CardGroup .np-Card.np-Card--promoCard{max-width:100%}
|
|
@@ -32,10 +32,6 @@
|
|
|
32
32
|
right: calc(var(--size-24) * -1);
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
-
|
|
36
|
-
&-description {
|
|
37
|
-
color: var(--color-content-secondary);
|
|
38
|
-
}
|
|
39
35
|
|
|
40
36
|
&-indicator {
|
|
41
37
|
position: absolute;
|
|
@@ -58,8 +54,16 @@
|
|
|
58
54
|
border-radius: 100px;
|
|
59
55
|
}
|
|
60
56
|
|
|
61
|
-
&Icon
|
|
57
|
+
&Icon {
|
|
62
58
|
color: var(--Card-indicator-icon-color);
|
|
59
|
+
width: var(--size-56);
|
|
60
|
+
height: var(--size-56);
|
|
61
|
+
display: inline-block;
|
|
62
|
+
background: var(--Card-indicator-icon-background-color);
|
|
63
|
+
border-radius: var(--radius-full);
|
|
64
|
+
display: flex;
|
|
65
|
+
justify-content: center;
|
|
66
|
+
align-items: center;
|
|
63
67
|
|
|
64
68
|
// Flips icon for right to left content
|
|
65
69
|
[dir="rtl"] & {
|
|
@@ -119,10 +123,6 @@
|
|
|
119
123
|
outline-offset: var(--size-4);
|
|
120
124
|
box-shadow: var(--Card-box-shadow);
|
|
121
125
|
}
|
|
122
|
-
|
|
123
|
-
&:has(.np-Card-closeButton:focus-visible) {
|
|
124
|
-
outline: none;
|
|
125
|
-
}
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
&--link {
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
import { StarFill } from '@transferwise/icons';
|
|
3
2
|
|
|
4
|
-
import PromoCard
|
|
3
|
+
import PromoCard from './PromoCard';
|
|
5
4
|
|
|
6
5
|
const meta: Meta<typeof PromoCard> = {
|
|
7
6
|
component: PromoCard,
|
|
8
7
|
title: 'Layouts/PromoCard',
|
|
9
8
|
tags: ['autodocs'],
|
|
10
|
-
parameters: {
|
|
11
|
-
actions: { argTypesRegex: null },
|
|
12
|
-
},
|
|
13
9
|
};
|
|
14
10
|
|
|
15
11
|
export default meta;
|
|
@@ -26,110 +22,54 @@ export const Default: Story = {
|
|
|
26
22
|
|
|
27
23
|
export const Link: Story = {
|
|
28
24
|
args: {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
args: {
|
|
36
|
-
...Link.args,
|
|
37
|
-
title: 'Add money for when you need it',
|
|
38
|
-
description: 'Get ready to send and spend.',
|
|
39
|
-
indicatorLabel: undefined,
|
|
40
|
-
imageSource: undefined,
|
|
41
|
-
onDismiss: () => {
|
|
42
|
-
alert('Dismissed!');
|
|
43
|
-
},
|
|
44
|
-
onClick: () => {
|
|
45
|
-
alert('Clicked!');
|
|
46
|
-
},
|
|
47
|
-
isSmall: true,
|
|
48
|
-
useDisplayFont: false,
|
|
49
|
-
className: 'taskCard',
|
|
50
|
-
} as PromoCardLinkProps,
|
|
51
|
-
decorators: [
|
|
52
|
-
(Story) => (
|
|
53
|
-
<div>
|
|
54
|
-
<style>
|
|
55
|
-
{`
|
|
56
|
-
.storybook-container {
|
|
57
|
-
background-color: var(--color-background-neutral);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.taskCard {
|
|
61
|
-
background-color: var(--color-background-screen);
|
|
62
|
-
position: relative;
|
|
63
|
-
width: 208px;
|
|
64
|
-
height: 268px;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
.taskCard .np-Card-title {
|
|
68
|
-
margin-top: var(--size-24);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
.taskCard.np-Card--link:hover:not(.is-disabled, :disabled, :focus-within) {
|
|
73
|
-
box-shadow: none;
|
|
74
|
-
background-color: var(--color-background-screen-hover);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
.taskCard.np-Card--link:active:not(.is-disabled, :disabled) {
|
|
78
|
-
box-shadow: none;
|
|
79
|
-
background-color: var(--color-background-screen-hover);
|
|
80
|
-
}
|
|
81
|
-
`}
|
|
82
|
-
</style>
|
|
83
|
-
<Story />
|
|
84
|
-
</div>
|
|
85
|
-
),
|
|
86
|
-
],
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
export const TaskCardWithCustomIcon: Story = {
|
|
90
|
-
args: {
|
|
91
|
-
...TaskCard.args,
|
|
92
|
-
indicatorIcon: <StarFill size={24} aria-hidden="true" />,
|
|
93
|
-
} as PromoCardLinkProps,
|
|
94
|
-
decorators: TaskCard.decorators,
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
export const TaskCardCompleted: Story = {
|
|
98
|
-
args: {
|
|
99
|
-
...TaskCard.args,
|
|
100
|
-
onDismiss: undefined,
|
|
101
|
-
href: undefined,
|
|
102
|
-
indicatorIcon: 'check',
|
|
103
|
-
className: 'taskCard taskCard--completed np-theme--personal np-theme-personal--forest-green',
|
|
104
|
-
} as PromoCardLinkProps,
|
|
105
|
-
decorators: TaskCard.decorators,
|
|
25
|
+
description: 'A card that lives online and works anywhere. Easy, secure, and always on hand.',
|
|
26
|
+
title: 'Digital',
|
|
27
|
+
href: 'https://wise.com',
|
|
28
|
+
indicatorLabel: 'Free',
|
|
29
|
+
imageSource: 'https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp',
|
|
30
|
+
},
|
|
106
31
|
};
|
|
107
32
|
|
|
108
33
|
export const Check: Story = {
|
|
109
34
|
args: {
|
|
110
|
-
|
|
35
|
+
description: 'A card that lives online and works anywhere. Easy, secure, and always on hand.',
|
|
36
|
+
title: 'Digital',
|
|
111
37
|
type: 'checkbox',
|
|
112
|
-
|
|
38
|
+
indicatorLabel: 'Free',
|
|
39
|
+
imageSource: 'https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp',
|
|
40
|
+
},
|
|
113
41
|
};
|
|
114
42
|
|
|
115
43
|
export const DefaultChecked: Story = {
|
|
116
44
|
args: {
|
|
117
|
-
|
|
45
|
+
description: 'A card that lives online and works anywhere. Easy, secure, and always on hand.',
|
|
46
|
+
title: 'Digital',
|
|
47
|
+
type: 'checkbox',
|
|
48
|
+
indicatorLabel: 'Free',
|
|
118
49
|
defaultChecked: true,
|
|
119
|
-
|
|
50
|
+
imageSource: 'https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp',
|
|
51
|
+
},
|
|
120
52
|
};
|
|
121
53
|
|
|
122
54
|
export const Disabled: Story = {
|
|
123
55
|
args: {
|
|
124
|
-
|
|
56
|
+
description: 'A card that lives online and works anywhere. Easy, secure, and always on hand.',
|
|
57
|
+
title: 'Digital',
|
|
58
|
+
type: 'checkbox',
|
|
125
59
|
isDisabled: true,
|
|
60
|
+
indicatorLabel: 'Free',
|
|
61
|
+
imageSource: 'https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp',
|
|
126
62
|
},
|
|
127
63
|
};
|
|
128
64
|
|
|
129
65
|
export const CustomClass: Story = {
|
|
130
66
|
args: {
|
|
131
|
-
|
|
67
|
+
description: 'A card that lives online and works anywhere. Easy, secure, and always on hand.',
|
|
68
|
+
title: 'Digital',
|
|
69
|
+
href: 'https://wise.com',
|
|
132
70
|
className: 'np-CustomPromoCard',
|
|
71
|
+
indicatorLabel: 'Free',
|
|
72
|
+
imageSource: 'https://wise.com/web-art/assets/illustrations/digital-card-medium@2x.webp',
|
|
133
73
|
},
|
|
134
74
|
decorators: [
|
|
135
75
|
(Story) => (
|
|
@@ -138,8 +78,8 @@ export const CustomClass: Story = {
|
|
|
138
78
|
{`
|
|
139
79
|
.np-CustomPromoCard {
|
|
140
80
|
--Card-background-color: var(--color-bright-yellow);
|
|
141
|
-
--Card-indicator-icon-background-color: var(--color-
|
|
142
|
-
--
|
|
81
|
+
--Card-indicator-icon-background-color: var(--color-dark-gold);
|
|
82
|
+
--Card-indicator-icon-color: var(--color-contrast);
|
|
143
83
|
}
|
|
144
84
|
`}
|
|
145
85
|
</style>
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { Check } from '@transferwise/icons';
|
|
2
2
|
import classNames from 'classnames';
|
|
3
|
-
import React, { forwardRef, FunctionComponent,
|
|
3
|
+
import React, { forwardRef, FunctionComponent, useState, useEffect, useMemo } from 'react';
|
|
4
4
|
|
|
5
5
|
import Body from '../body';
|
|
6
|
-
import { Typography } from '../common';
|
|
7
|
-
import Card
|
|
6
|
+
import { Typography, generateRandomId } from '../common';
|
|
7
|
+
import Card from '../common/card';
|
|
8
8
|
import Display from '../display';
|
|
9
9
|
import Image from '../image/Image';
|
|
10
|
-
import Title from '../title';
|
|
11
10
|
|
|
12
11
|
import { usePromoCardContext } from './PromoCardContext';
|
|
13
|
-
import PromoCardIndicator
|
|
12
|
+
import PromoCardIndicator from './PromoCardIndicator';
|
|
14
13
|
|
|
15
14
|
export type ReferenceType = React.Ref<HTMLInputElement>;
|
|
16
15
|
export type LinkTarget = '_blank' | '_parent' | '_self' | '_top';
|
|
@@ -50,9 +49,6 @@ export interface PromoCardCommonProps {
|
|
|
50
49
|
/** Optional prop to specify text for the indicator label of the PromoCard */
|
|
51
50
|
indicatorLabel?: string;
|
|
52
51
|
|
|
53
|
-
/** Optional prop to specify the icon for the indicator icon of the PromoCard */
|
|
54
|
-
indicatorIcon?: PromoCardIndicatorProps['icon'];
|
|
55
|
-
|
|
56
52
|
/** Optional prop to specify an image alt text */
|
|
57
53
|
imageAlt?: string;
|
|
58
54
|
|
|
@@ -60,7 +56,7 @@ export interface PromoCardCommonProps {
|
|
|
60
56
|
imageClass?: string;
|
|
61
57
|
|
|
62
58
|
/** Optional prop to specify an image source url */
|
|
63
|
-
imageSource
|
|
59
|
+
imageSource: string;
|
|
64
60
|
|
|
65
61
|
/** Specify whether the PromoCard is disabled, or not */
|
|
66
62
|
isDisabled?: boolean;
|
|
@@ -73,12 +69,9 @@ export interface PromoCardCommonProps {
|
|
|
73
69
|
|
|
74
70
|
/** Required prop to specify the title text of the PromoCard */
|
|
75
71
|
title: string;
|
|
76
|
-
|
|
77
|
-
/** Set to false to use body font style for the title */
|
|
78
|
-
useDisplayFont?: boolean;
|
|
79
72
|
}
|
|
80
73
|
|
|
81
|
-
export interface PromoCardLinkProps extends PromoCardCommonProps
|
|
74
|
+
export interface PromoCardLinkProps extends PromoCardCommonProps {
|
|
82
75
|
/**
|
|
83
76
|
* Optional prop to prompts a user to save the linked URL instead of
|
|
84
77
|
* navigating to it
|
|
@@ -109,7 +102,7 @@ export interface PromoCardLinkProps extends PromoCardCommonProps, Omit<CardProps
|
|
|
109
102
|
value?: never;
|
|
110
103
|
}
|
|
111
104
|
|
|
112
|
-
export interface PromoCardCheckedProps extends PromoCardCommonProps
|
|
105
|
+
export interface PromoCardCheckedProps extends PromoCardCommonProps {
|
|
113
106
|
/** Specify the initial checked attribute of the PromoCard */
|
|
114
107
|
defaultChecked?: boolean;
|
|
115
108
|
|
|
@@ -142,21 +135,6 @@ export type PolymorphicPromoCard = (
|
|
|
142
135
|
props: PromoCardLinkProps | PromoCardCheckedProps,
|
|
143
136
|
) => JSX.Element;
|
|
144
137
|
|
|
145
|
-
/**
|
|
146
|
-
* generateRandomId() function
|
|
147
|
-
*
|
|
148
|
-
* This function generates a random string of characters that can be used as
|
|
149
|
-
* an ID.
|
|
150
|
-
*
|
|
151
|
-
* @returns {string} A random string of characters.
|
|
152
|
-
* @example
|
|
153
|
-
* const id = generateRandomId();
|
|
154
|
-
* // id will be a random string of characters, such as "id-4711".
|
|
155
|
-
*/
|
|
156
|
-
const generateRandomId = (): string => {
|
|
157
|
-
return `id-${Math.random().toString(36).slice(7)}`;
|
|
158
|
-
};
|
|
159
|
-
|
|
160
138
|
/**
|
|
161
139
|
* PromoCard component.
|
|
162
140
|
*
|
|
@@ -213,7 +191,6 @@ const PromoCard: FunctionComponent<PromoCardProps> = forwardRef(
|
|
|
213
191
|
imageClass,
|
|
214
192
|
imageSource,
|
|
215
193
|
indicatorLabel,
|
|
216
|
-
indicatorIcon,
|
|
217
194
|
isChecked,
|
|
218
195
|
isDisabled,
|
|
219
196
|
onClick,
|
|
@@ -224,8 +201,6 @@ const PromoCard: FunctionComponent<PromoCardProps> = forwardRef(
|
|
|
224
201
|
title,
|
|
225
202
|
type,
|
|
226
203
|
value,
|
|
227
|
-
isSmall,
|
|
228
|
-
useDisplayFont = true,
|
|
229
204
|
...props
|
|
230
205
|
},
|
|
231
206
|
reference,
|
|
@@ -251,25 +226,7 @@ const PromoCard: FunctionComponent<PromoCardProps> = forwardRef(
|
|
|
251
226
|
// Set the icon to `'arrow'` if `href` is truthy and `type` is falsy, or
|
|
252
227
|
// `'download'` if `download` is truthy. If neither condition is true, set
|
|
253
228
|
// `icon` to `undefined`.
|
|
254
|
-
|
|
255
|
-
// Create a function to get icon type
|
|
256
|
-
const getIconType = () => {
|
|
257
|
-
if (indicatorIcon) {
|
|
258
|
-
return indicatorIcon;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
if (download) {
|
|
262
|
-
return 'download';
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
if (href && !type) {
|
|
266
|
-
return 'arrow';
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
return undefined;
|
|
270
|
-
};
|
|
271
|
-
|
|
272
|
-
const CardTitle = useDisplayFont ? Display : Title;
|
|
229
|
+
const icon = href && download ? 'download' : href ? 'arrow' : undefined;
|
|
273
230
|
|
|
274
231
|
// Define all class names string based on the values of the `href`, `type`,
|
|
275
232
|
// `checked`, and `className` props.
|
|
@@ -289,7 +246,6 @@ const PromoCard: FunctionComponent<PromoCardProps> = forwardRef(
|
|
|
289
246
|
onClick,
|
|
290
247
|
ref: reference,
|
|
291
248
|
'data-testid': testId,
|
|
292
|
-
isSmall,
|
|
293
249
|
};
|
|
294
250
|
|
|
295
251
|
// Object with Anchor props that will be passed to the `a` element. These
|
|
@@ -327,33 +283,6 @@ const PromoCard: FunctionComponent<PromoCardProps> = forwardRef(
|
|
|
327
283
|
}
|
|
328
284
|
: {};
|
|
329
285
|
|
|
330
|
-
const getTitle = () => {
|
|
331
|
-
const titleContent =
|
|
332
|
-
href && !type ? (
|
|
333
|
-
<a className="np-Card-titleLink" {...anchorProps}>
|
|
334
|
-
{title}
|
|
335
|
-
</a>
|
|
336
|
-
) : (
|
|
337
|
-
title
|
|
338
|
-
);
|
|
339
|
-
|
|
340
|
-
const titleProps = {
|
|
341
|
-
id: `${componentId}-title`,
|
|
342
|
-
as: headingLevel,
|
|
343
|
-
className: 'np-Card-title',
|
|
344
|
-
};
|
|
345
|
-
|
|
346
|
-
return useDisplayFont ? (
|
|
347
|
-
<Display type={Typography.DISPLAY_SMALL} {...titleProps}>
|
|
348
|
-
{titleContent}
|
|
349
|
-
</Display>
|
|
350
|
-
) : (
|
|
351
|
-
<Title type={Typography.TITLE_SUBSECTION} {...titleProps}>
|
|
352
|
-
{titleContent}
|
|
353
|
-
</Title>
|
|
354
|
-
);
|
|
355
|
-
};
|
|
356
|
-
|
|
357
286
|
useEffect(() => {
|
|
358
287
|
setChecked(defaultChecked ?? isChecked ?? false);
|
|
359
288
|
}, [defaultChecked, isChecked]);
|
|
@@ -365,18 +294,27 @@ const PromoCard: FunctionComponent<PromoCardProps> = forwardRef(
|
|
|
365
294
|
<Check size={24} aria-hidden="true" />
|
|
366
295
|
</span>
|
|
367
296
|
)}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
297
|
+
<Display
|
|
298
|
+
id={`${componentId}-title`}
|
|
299
|
+
as={headingLevel}
|
|
300
|
+
className="np-Card-title"
|
|
301
|
+
type={Typography.DISPLAY_SMALL}
|
|
302
|
+
>
|
|
303
|
+
{href && !type ? (
|
|
304
|
+
<a className="np-Card-titleLink" {...anchorProps}>
|
|
305
|
+
{title}
|
|
306
|
+
</a>
|
|
307
|
+
) : (
|
|
308
|
+
title
|
|
309
|
+
)}
|
|
310
|
+
</Display>
|
|
371
311
|
<Body className="np-Card-description">{description}</Body>
|
|
372
|
-
|
|
373
312
|
{imageSource && (
|
|
374
313
|
<div className={classNames('np-Card-image', { imageClass })}>
|
|
375
314
|
<Image src={imageSource} alt={imageAlt || ''} loading="lazy" />
|
|
376
315
|
</div>
|
|
377
316
|
)}
|
|
378
|
-
|
|
379
|
-
<PromoCardIndicator label={indicatorLabel} icon={getIconType()} isSmall={isSmall} />
|
|
317
|
+
<PromoCardIndicator label={indicatorLabel} icon={icon} />
|
|
380
318
|
</Card>
|
|
381
319
|
);
|
|
382
320
|
},
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { ArrowRight, Check, Download } from '@transferwise/icons';
|
|
2
2
|
import classNames from 'classnames';
|
|
3
|
-
import {
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
4
|
|
|
5
|
-
import Avatar, { AvatarType } from '../avatar';
|
|
6
5
|
import Body from '../body';
|
|
7
6
|
import { Typography } from '../common';
|
|
8
7
|
|
|
@@ -14,10 +13,7 @@ export type PromoCardIndicatorProps = {
|
|
|
14
13
|
label?: string;
|
|
15
14
|
|
|
16
15
|
/** Optional icon to display in the indicator. */
|
|
17
|
-
icon?: 'check' | 'arrow' | 'download'
|
|
18
|
-
|
|
19
|
-
/** Optional prop to specify whether the indicator is sized small or not. */
|
|
20
|
-
isSmall?: boolean;
|
|
16
|
+
icon?: 'check' | 'arrow' | 'download';
|
|
21
17
|
|
|
22
18
|
/** Optional ID to add to the indicator container for testing purposes. */
|
|
23
19
|
testid?: string;
|
|
@@ -35,7 +31,7 @@ export type PromoCardIndicatorProps = {
|
|
|
35
31
|
*
|
|
36
32
|
* @param {string} className - Optional class name(s) to add to the indicator container.
|
|
37
33
|
* @param {string} label - Optional label to display next to the indicator.
|
|
38
|
-
* @param {string
|
|
34
|
+
* @param {string} icon - Optional icon to display in the indicator.
|
|
39
35
|
* @param {string} testid - Optional ID to add to the indicator container for testing purposes.
|
|
40
36
|
* @param {ReactNode} children - Optional children to display inside the indicator.
|
|
41
37
|
* @returns {JSX.Element} - The PromoCardIndicator component.
|
|
@@ -47,14 +43,11 @@ const PromoCardIndicator: React.FC<PromoCardIndicatorProps> = ({
|
|
|
47
43
|
children,
|
|
48
44
|
label,
|
|
49
45
|
icon,
|
|
50
|
-
isSmall = false,
|
|
51
46
|
testid,
|
|
52
47
|
...rest
|
|
53
48
|
}) => {
|
|
54
|
-
const isIconString = icon && typeof icon === 'string';
|
|
55
|
-
|
|
56
49
|
const IconComponent =
|
|
57
|
-
|
|
50
|
+
icon &&
|
|
58
51
|
{
|
|
59
52
|
check: Check,
|
|
60
53
|
arrow: ArrowRight,
|
|
@@ -68,15 +61,10 @@ const PromoCardIndicator: React.FC<PromoCardIndicatorProps> = ({
|
|
|
68
61
|
{label}
|
|
69
62
|
</Body>
|
|
70
63
|
)}
|
|
71
|
-
{
|
|
72
|
-
<
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
backgroundColor="var(--Card-indicator-icon-background-color)"
|
|
76
|
-
className="np-Card-indicatorIcon"
|
|
77
|
-
>
|
|
78
|
-
{IconComponent ? <IconComponent size={24} aria-hidden="true" /> : icon}
|
|
79
|
-
</Avatar>
|
|
64
|
+
{IconComponent && (
|
|
65
|
+
<span className="np-Card-indicatorIcon">
|
|
66
|
+
<IconComponent size={24} aria-hidden="true" />
|
|
67
|
+
</span>
|
|
80
68
|
)}
|
|
81
69
|
{children}
|
|
82
70
|
</div>
|