@transferwise/components 46.83.2 → 46.84.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.
- package/build/common/Option/Option.js +8 -2
- package/build/common/Option/Option.js.map +1 -1
- package/build/common/Option/Option.mjs +8 -2
- package/build/common/Option/Option.mjs.map +1 -1
- package/build/common/closeButton/CloseButton.js.map +1 -1
- package/build/common/closeButton/CloseButton.mjs.map +1 -1
- package/build/flowNavigation/FlowNavigation.js +8 -3
- package/build/flowNavigation/FlowNavigation.js.map +1 -1
- package/build/flowNavigation/FlowNavigation.mjs +8 -3
- package/build/flowNavigation/FlowNavigation.mjs.map +1 -1
- package/build/i18n/de.json +5 -0
- package/build/i18n/de.json.js +5 -0
- package/build/i18n/de.json.js.map +1 -1
- package/build/i18n/de.json.mjs +5 -0
- package/build/i18n/de.json.mjs.map +1 -1
- package/build/i18n/fr.json +6 -1
- package/build/i18n/fr.json.js +6 -1
- package/build/i18n/fr.json.js.map +1 -1
- package/build/i18n/fr.json.mjs +6 -1
- package/build/i18n/fr.json.mjs.map +1 -1
- package/build/i18n/it.json +5 -0
- package/build/i18n/it.json.js +5 -0
- package/build/i18n/it.json.js.map +1 -1
- package/build/i18n/it.json.mjs +5 -0
- package/build/i18n/it.json.mjs.map +1 -1
- package/build/i18n/pt.json +5 -0
- package/build/i18n/pt.json.js +5 -0
- package/build/i18n/pt.json.js.map +1 -1
- package/build/i18n/pt.json.mjs +5 -0
- package/build/i18n/pt.json.mjs.map +1 -1
- package/build/i18n/ru.json +5 -0
- package/build/i18n/ru.json.js +5 -0
- package/build/i18n/ru.json.js.map +1 -1
- package/build/i18n/ru.json.mjs +5 -0
- package/build/i18n/ru.json.mjs.map +1 -1
- package/build/iconButton/IconButton.js +41 -0
- package/build/iconButton/IconButton.js.map +1 -0
- package/build/iconButton/IconButton.mjs +39 -0
- package/build/iconButton/IconButton.mjs.map +1 -0
- package/build/index.js +2 -0
- package/build/index.js.map +1 -1
- package/build/index.mjs +1 -0
- package/build/index.mjs.map +1 -1
- package/build/main.css +86 -32
- package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js +83 -0
- package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js.map +1 -0
- package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs +81 -0
- package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs.map +1 -0
- package/build/primitives/PrimitiveButton/src/PrimitiveButton.js +90 -0
- package/build/primitives/PrimitiveButton/src/PrimitiveButton.js.map +1 -0
- package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs +88 -0
- package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs.map +1 -0
- package/build/styles/iconButton/IconButton.css +82 -0
- package/build/styles/main.css +86 -32
- package/build/styles/summary/Summary.css +4 -0
- package/build/summary/Summary.js +3 -3
- package/build/summary/Summary.js.map +1 -1
- package/build/summary/Summary.mjs +3 -3
- package/build/summary/Summary.mjs.map +1 -1
- package/build/types/common/Option/Option.d.ts.map +1 -1
- package/build/types/common/closeButton/CloseButton.d.ts +3 -0
- package/build/types/common/closeButton/CloseButton.d.ts.map +1 -1
- package/build/types/flowNavigation/FlowNavigation.d.ts.map +1 -1
- package/build/types/iconButton/IconButton.d.ts +15 -0
- package/build/types/iconButton/IconButton.d.ts.map +1 -0
- package/build/types/iconButton/index.d.ts +3 -0
- package/build/types/iconButton/index.d.ts.map +1 -0
- package/build/types/index.d.ts +2 -0
- package/build/types/index.d.ts.map +1 -1
- package/build/types/summary/Summary.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/accordion/AccordionItem/__snapshots__/AccordionItem.spec.js.snap +8 -4
- package/src/card/Card.spec.tsx +3 -1
- package/src/common/Option/Option.tsx +11 -1
- package/src/common/closeButton/CloseButton.tsx +3 -0
- package/src/flowNavigation/FlowNavigation.spec.js +7 -8
- package/src/flowNavigation/FlowNavigation.tsx +11 -2
- package/src/flowNavigation/__snapshots__/FlowNavigation.spec.js.snap +27 -3
- package/src/i18n/de.json +5 -0
- package/src/i18n/fr.json +6 -1
- package/src/i18n/it.json +5 -0
- package/src/i18n/pt.json +5 -0
- package/src/i18n/ru.json +5 -0
- package/src/iconButton/IconButton.css +82 -0
- package/src/iconButton/IconButton.less +55 -0
- package/src/iconButton/IconButton.story.tsx +107 -0
- package/src/iconButton/IconButton.tsx +51 -0
- package/src/iconButton/index.ts +2 -0
- package/src/index.ts +2 -0
- package/src/main.css +86 -32
- package/src/main.less +1 -1
- package/src/summary/Summary.css +4 -0
- package/src/summary/Summary.less +3 -0
- package/src/summary/Summary.story.tsx +13 -3
- package/src/summary/Summary.tsx +13 -11
- package/build/flowNavigation/backButton/BackButton.js +0 -30
- package/build/flowNavigation/backButton/BackButton.js.map +0 -1
- package/build/flowNavigation/backButton/BackButton.mjs +0 -28
- package/build/flowNavigation/backButton/BackButton.mjs.map +0 -1
- package/build/styles/flowNavigation/backButton/BackButton.css +0 -32
- package/build/types/flowNavigation/backButton/BackButton.d.ts +0 -7
- package/build/types/flowNavigation/backButton/BackButton.d.ts.map +0 -1
- package/build/types/flowNavigation/backButton/index.d.ts +0 -3
- package/build/types/flowNavigation/backButton/index.d.ts.map +0 -1
- package/src/flowNavigation/backButton/BackButton.css +0 -32
- package/src/flowNavigation/backButton/BackButton.less +0 -36
- package/src/flowNavigation/backButton/BackButton.tsx +0 -29
- package/src/flowNavigation/backButton/index.ts +0 -2
|
@@ -15,11 +15,6 @@ jest.mock('./animatedLabel', () => {
|
|
|
15
15
|
);
|
|
16
16
|
};
|
|
17
17
|
});
|
|
18
|
-
jest.mock('./backButton', () => {
|
|
19
|
-
return function ({ className, label }) {
|
|
20
|
-
return <div className={className}>BackButton{label}</div>;
|
|
21
|
-
};
|
|
22
|
-
});
|
|
23
18
|
|
|
24
19
|
describe('FlowNavigation', () => {
|
|
25
20
|
beforeEach(() => {
|
|
@@ -171,14 +166,18 @@ describe('FlowNavigation', () => {
|
|
|
171
166
|
it('renders BackButton with AnimatedLabel if onGoBack is provided and activeStep > 0', () => {
|
|
172
167
|
const { rerender } = render(<FlowNavigation {...props} onGoBack={jest.fn()} />);
|
|
173
168
|
|
|
174
|
-
expect(
|
|
169
|
+
expect(
|
|
170
|
+
screen.queryByRole('button', { name: /back to previous step/i }),
|
|
171
|
+
).not.toBeInTheDocument();
|
|
175
172
|
|
|
176
173
|
rerender(<FlowNavigation {...props} activeStep={1} />);
|
|
177
|
-
expect(
|
|
174
|
+
expect(
|
|
175
|
+
screen.queryByRole('button', { name: /back to previous step/i }),
|
|
176
|
+
).not.toBeInTheDocument();
|
|
178
177
|
|
|
179
178
|
rerender(<FlowNavigation {...props} activeStep={1} onGoBack={jest.fn()} />);
|
|
180
179
|
|
|
181
|
-
expect(screen.
|
|
180
|
+
expect(screen.getByRole('button', { name: /back to previous step/i })).toBeInTheDocument();
|
|
182
181
|
expect(screen.getByText('AnimatedLabel')).toBeInTheDocument();
|
|
183
182
|
});
|
|
184
183
|
|
|
@@ -10,7 +10,8 @@ import Stepper, { type Step } from '../stepper/Stepper';
|
|
|
10
10
|
import { useScreenSize } from '../common/hooks/useScreenSize';
|
|
11
11
|
import messages from './FlowNavigation.messages';
|
|
12
12
|
import AnimatedLabel from './animatedLabel';
|
|
13
|
-
import
|
|
13
|
+
import IconButton from '../iconButton';
|
|
14
|
+
import { ArrowLeft } from '@transferwise/icons';
|
|
14
15
|
|
|
15
16
|
export interface FlowNavigationProps {
|
|
16
17
|
activeStep?: number;
|
|
@@ -66,7 +67,15 @@ const FlowNavigation = ({
|
|
|
66
67
|
leftContent={
|
|
67
68
|
<>
|
|
68
69
|
{!screenSm && displayGoBack ? (
|
|
69
|
-
<
|
|
70
|
+
<IconButton
|
|
71
|
+
size={40}
|
|
72
|
+
priority="tertiary"
|
|
73
|
+
type="default"
|
|
74
|
+
aria-label={intl.formatMessage(messages.back)}
|
|
75
|
+
onClick={onGoBack}
|
|
76
|
+
>
|
|
77
|
+
<ArrowLeft />
|
|
78
|
+
</IconButton>
|
|
70
79
|
) : (
|
|
71
80
|
<div className="np-flow-header__left">{logo}</div>
|
|
72
81
|
)}
|
|
@@ -8,9 +8,33 @@ exports[`FlowNavigation on mobile renders as expected 1`] = `
|
|
|
8
8
|
<div
|
|
9
9
|
class="np-flow-header d-flex flex-wrap align-items-center justify-content-between flex__item--12 np-flow-navigation__content p-x-3 np-flow-navigation--xs-max"
|
|
10
10
|
>
|
|
11
|
-
<
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
<button
|
|
12
|
+
aria-disabled="false"
|
|
13
|
+
aria-label="back to previous step"
|
|
14
|
+
aria-live="off"
|
|
15
|
+
class="wds-Button np-circle d-flex align-items-center justify-content-center np-icon-button np-icon-button-tertiary-default"
|
|
16
|
+
style="--circle-size: 40px; --circle-icon-size: 20px; --circle-font-size: 18px;"
|
|
17
|
+
type="button"
|
|
18
|
+
>
|
|
19
|
+
<span
|
|
20
|
+
class="tw-icon tw-icon-arrow-left "
|
|
21
|
+
data-testid="arrow-left-icon"
|
|
22
|
+
>
|
|
23
|
+
<svg
|
|
24
|
+
aria-hidden="true"
|
|
25
|
+
fill="currentColor"
|
|
26
|
+
focusable="false"
|
|
27
|
+
height="16"
|
|
28
|
+
role="none"
|
|
29
|
+
viewBox="0 0 24 24"
|
|
30
|
+
width="16"
|
|
31
|
+
>
|
|
32
|
+
<path
|
|
33
|
+
d="M22.286 11.316H4.629l7.114-7.114-1.2-1.2-8.572 8.571a.829.829 0 0 0 0 1.2l8.572 8.572 1.2-1.2-7.114-7.114h17.657v-1.715Z"
|
|
34
|
+
/>
|
|
35
|
+
</svg>
|
|
36
|
+
</span>
|
|
37
|
+
</button>
|
|
14
38
|
<div
|
|
15
39
|
class="m-x-1"
|
|
16
40
|
data-testid="activeLabel-1"
|
package/src/i18n/de.json
CHANGED
|
@@ -35,6 +35,11 @@
|
|
|
35
35
|
"neptune.Summary.statusDone": "Schritt erledigt",
|
|
36
36
|
"neptune.Summary.statusNotDone": "Schritt noch zu erledigen",
|
|
37
37
|
"neptune.Summary.statusPending": "Schritt ausstehend",
|
|
38
|
+
"neptune.Table.actionHeader": "Aktion",
|
|
39
|
+
"neptune.Table.emptyData": "Keine Ergebnisse gefunden",
|
|
40
|
+
"neptune.Table.loaded": "Tabellendaten wurden geladen",
|
|
41
|
+
"neptune.Table.loading": "Tabellendaten werden geladen",
|
|
42
|
+
"neptune.Table.refreshPage": "Seite aktualisieren",
|
|
38
43
|
"neptune.Upload.csButtonText": "Eine andere Datei hochladen?",
|
|
39
44
|
"neptune.Upload.csFailureText": "Hochladen fehlgeschlagen. Bitte versuche es erneut",
|
|
40
45
|
"neptune.Upload.csSuccessText": "Fertig hochgeladen!",
|
package/src/i18n/fr.json
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"neptune.DateLookup.year": "année",
|
|
19
19
|
"neptune.FlowNavigation.back": "revenir à l'étape précédente",
|
|
20
20
|
"neptune.Info.ariaLabel": "Plus d'informations",
|
|
21
|
-
"neptune.Label.optional": "(
|
|
21
|
+
"neptune.Label.optional": "(facultatif)",
|
|
22
22
|
"neptune.Link.opensInNewTab": "(ouvre dans un nouvel onglet)",
|
|
23
23
|
"neptune.MoneyInput.Select.placeholder": "Sélectionner une option...",
|
|
24
24
|
"neptune.MoneyInput.Select.selectCurrencyLabel": "Sélectionnez une devise",
|
|
@@ -35,6 +35,11 @@
|
|
|
35
35
|
"neptune.Summary.statusDone": "Validé",
|
|
36
36
|
"neptune.Summary.statusNotDone": "À compléter",
|
|
37
37
|
"neptune.Summary.statusPending": "En attente",
|
|
38
|
+
"neptune.Table.actionHeader": "Action",
|
|
39
|
+
"neptune.Table.emptyData": "Aucun résultat trouvé",
|
|
40
|
+
"neptune.Table.loaded": "Les données du tableau ont été chargées",
|
|
41
|
+
"neptune.Table.loading": "Chargement des données du tableau",
|
|
42
|
+
"neptune.Table.refreshPage": "Rafraichir la page",
|
|
38
43
|
"neptune.Upload.csButtonText": "Envoyer un autre fichier ?",
|
|
39
44
|
"neptune.Upload.csFailureText": "Échec du téléchargement. Veuillez réessayer",
|
|
40
45
|
"neptune.Upload.csSuccessText": "Téléchargement terminé !",
|
package/src/i18n/it.json
CHANGED
|
@@ -35,6 +35,11 @@
|
|
|
35
35
|
"neptune.Summary.statusDone": "Completato",
|
|
36
36
|
"neptune.Summary.statusNotDone": "Da completare",
|
|
37
37
|
"neptune.Summary.statusPending": "In corso",
|
|
38
|
+
"neptune.Table.actionHeader": "Azione",
|
|
39
|
+
"neptune.Table.emptyData": "Nessun risultato trovato",
|
|
40
|
+
"neptune.Table.loaded": "I dati della tabella sono stati caricati",
|
|
41
|
+
"neptune.Table.loading": "I dati della tabella sono in fase di caricamento",
|
|
42
|
+
"neptune.Table.refreshPage": "Aggiorna la pagina",
|
|
38
43
|
"neptune.Upload.csButtonText": "Carica un altro documento?",
|
|
39
44
|
"neptune.Upload.csFailureText": "Caricamento fallito. Per favore riprova",
|
|
40
45
|
"neptune.Upload.csSuccessText": "Caricamento completato!",
|
package/src/i18n/pt.json
CHANGED
|
@@ -35,6 +35,11 @@
|
|
|
35
35
|
"neptune.Summary.statusDone": "Pronto",
|
|
36
36
|
"neptune.Summary.statusNotDone": "Não iniciado",
|
|
37
37
|
"neptune.Summary.statusPending": "Pendente",
|
|
38
|
+
"neptune.Table.actionHeader": "Ação",
|
|
39
|
+
"neptune.Table.emptyData": "Nenhum resultado encontrado",
|
|
40
|
+
"neptune.Table.loaded": "Os dados da tabela foram carregados",
|
|
41
|
+
"neptune.Table.loading": "Os dados da tabela estão sendo carregados",
|
|
42
|
+
"neptune.Table.refreshPage": "Atualizar página",
|
|
38
43
|
"neptune.Upload.csButtonText": "Enviar outro documento?",
|
|
39
44
|
"neptune.Upload.csFailureText": "Falha no envio. Por favor, tente novamente",
|
|
40
45
|
"neptune.Upload.csSuccessText": "Envio concluído!",
|
package/src/i18n/ru.json
CHANGED
|
@@ -35,6 +35,11 @@
|
|
|
35
35
|
"neptune.Summary.statusDone": "Этап завершен",
|
|
36
36
|
"neptune.Summary.statusNotDone": "Этап к выполнению",
|
|
37
37
|
"neptune.Summary.statusPending": "Этап в процессе",
|
|
38
|
+
"neptune.Table.actionHeader": "Действие",
|
|
39
|
+
"neptune.Table.emptyData": "Ничего не найдено",
|
|
40
|
+
"neptune.Table.loaded": "Данные таблицы загружены",
|
|
41
|
+
"neptune.Table.loading": "Данные таблицы загружаются",
|
|
42
|
+
"neptune.Table.refreshPage": "Обновить страницу",
|
|
38
43
|
"neptune.Upload.csButtonText": "Загрузить другой файл?",
|
|
39
44
|
"neptune.Upload.csFailureText": "Загрузка не удалась. Пожалуйста, попробуйте снова",
|
|
40
45
|
"neptune.Upload.csSuccessText": "Загрузка завершена!",
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
.np-icon-button {
|
|
2
|
+
border: none;
|
|
3
|
+
}
|
|
4
|
+
.np-icon-button-tertiary-default {
|
|
5
|
+
color: var(--color-interactive-primary);
|
|
6
|
+
background-color: rgba(134,167,189,0.10196);
|
|
7
|
+
background-color: var(--color-background-neutral);
|
|
8
|
+
}
|
|
9
|
+
.np-icon-button-tertiary-default:not(.disabled):not(:disabled):hover {
|
|
10
|
+
background-color: var(--color-background-neutral-hover);
|
|
11
|
+
}
|
|
12
|
+
.np-icon-button-tertiary-default:not(.disabled):not(:disabled):active {
|
|
13
|
+
background-color: var(--color-background-neutral-active);
|
|
14
|
+
}
|
|
15
|
+
.np-icon-button-primary-default {
|
|
16
|
+
color: var(--color-interactive-control);
|
|
17
|
+
background-color: #00a2dd;
|
|
18
|
+
background-color: var(--color-interactive-accent);
|
|
19
|
+
}
|
|
20
|
+
.np-icon-button-primary-default:not(.disabled):not(:disabled):hover {
|
|
21
|
+
background-color: #008fc9;
|
|
22
|
+
background-color: var(--color-interactive-accent-hover);
|
|
23
|
+
}
|
|
24
|
+
.np-icon-button-primary-default:not(.disabled):not(:disabled):active {
|
|
25
|
+
background-color: #0081ba;
|
|
26
|
+
background-color: var(--color-interactive-accent-active);
|
|
27
|
+
}
|
|
28
|
+
.np-icon-button-primary-negative {
|
|
29
|
+
color: var(--color-contrast-overlay);
|
|
30
|
+
background-color: var(--color-sentiment-negative-primary);
|
|
31
|
+
}
|
|
32
|
+
.np-icon-button-primary-negative:not(.disabled):not(:disabled):hover {
|
|
33
|
+
background-color: var(--color-sentiment-negative-primary-hover);
|
|
34
|
+
}
|
|
35
|
+
.np-icon-button-primary-negative:not(.disabled):not(:disabled):active {
|
|
36
|
+
background-color: var(--color-sentiment-negative-primary-active);
|
|
37
|
+
}
|
|
38
|
+
.np-theme-personal--bright-green .np-icon-button-primary-negative {
|
|
39
|
+
color: var(--color-white);
|
|
40
|
+
}
|
|
41
|
+
.np-icon-button-minimal-default {
|
|
42
|
+
color: var(--color-interactive-primary);
|
|
43
|
+
background-color: #ffffff;
|
|
44
|
+
background-color: var(--color-background-screen);
|
|
45
|
+
background-color: transparent;
|
|
46
|
+
}
|
|
47
|
+
.np-icon-button-minimal-default:not(.disabled):not(:disabled):hover {
|
|
48
|
+
background-color: var(--color-background-screen-hover);
|
|
49
|
+
}
|
|
50
|
+
.np-icon-button-minimal-default:not(.disabled):not(:disabled):active {
|
|
51
|
+
background-color: var(--color-background-screen-active);
|
|
52
|
+
}
|
|
53
|
+
.np-icon-button-secondary-default {
|
|
54
|
+
color: var(--color-interactive-primary);
|
|
55
|
+
background-color: var(--color-interactive-neutral);
|
|
56
|
+
}
|
|
57
|
+
.np-icon-button-secondary-default:not(.disabled):not(:disabled):hover {
|
|
58
|
+
background-color: var(--color-interactive-neutral-hover);
|
|
59
|
+
}
|
|
60
|
+
.np-icon-button-secondary-default:not(.disabled):not(:disabled):active {
|
|
61
|
+
background-color: var(--color-interactive-neutral-active);
|
|
62
|
+
}
|
|
63
|
+
.np-theme-personal--bright-green .np-icon-button-secondary-default,
|
|
64
|
+
.np-theme-personal--forest-green .np-icon-button-secondary-default {
|
|
65
|
+
color: var(--color-interactive-control);
|
|
66
|
+
}
|
|
67
|
+
.np-icon-button-secondary-negative {
|
|
68
|
+
color: var(--color-sentiment-negative-primary);
|
|
69
|
+
background-color: var(--color-sentiment-negative-secondary);
|
|
70
|
+
}
|
|
71
|
+
.np-icon-button-secondary-negative:not(.disabled):not(:disabled):hover {
|
|
72
|
+
background-color: var(--color-sentiment-negative-secondary-hover);
|
|
73
|
+
}
|
|
74
|
+
.np-icon-button-secondary-negative:not(.disabled):not(:disabled):active {
|
|
75
|
+
background-color: var(--color-sentiment-negative-secondary-active);
|
|
76
|
+
}
|
|
77
|
+
.np-theme-personal--bright-green .np-icon-button-secondary-negative {
|
|
78
|
+
color: var(--color-white);
|
|
79
|
+
}
|
|
80
|
+
.np-theme-personal--forest-green .np-icon-button-secondary-negative {
|
|
81
|
+
color: var(--color-contrast-overlay);
|
|
82
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
.np-icon-button {
|
|
2
|
+
border: none;
|
|
3
|
+
&-tertiary-default {
|
|
4
|
+
.colors(--color-interactive-primary, --color-background-neutral);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
&-primary-default {
|
|
8
|
+
.colors(--color-interactive-control, --color-interactive-accent);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
&-primary-negative {
|
|
12
|
+
.colors(--color-contrast-overlay, --color-sentiment-negative-primary);
|
|
13
|
+
|
|
14
|
+
.np-theme-personal--bright-green & {
|
|
15
|
+
color: var(--color-white);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
&-minimal-default {
|
|
20
|
+
.colors(--color-interactive-primary, --color-background-screen);
|
|
21
|
+
background-color: transparent;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
&-secondary-default {
|
|
25
|
+
.colors(--color-interactive-primary, --color-interactive-neutral);
|
|
26
|
+
|
|
27
|
+
.np-theme-personal--bright-green &,
|
|
28
|
+
.np-theme-personal--forest-green & {
|
|
29
|
+
color: var(--color-interactive-control);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
&-secondary-negative {
|
|
34
|
+
.colors(--color-sentiment-negative-primary, --color-sentiment-negative-secondary);
|
|
35
|
+
|
|
36
|
+
.np-theme-personal--bright-green & {
|
|
37
|
+
color: var(--color-white);
|
|
38
|
+
}
|
|
39
|
+
.np-theme-personal--forest-green & {
|
|
40
|
+
color: var(--color-contrast-overlay);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.colors(@icon-color, @bg-color) {
|
|
45
|
+
color: var(@icon-color);
|
|
46
|
+
background-color: var(@bg-color);
|
|
47
|
+
|
|
48
|
+
&:not(.disabled, :disabled):hover {
|
|
49
|
+
background-color:~"var(@{bg-color}-hover)";
|
|
50
|
+
}
|
|
51
|
+
&:not(.disabled, :disabled):active {
|
|
52
|
+
background-color:~"var(@{bg-color}-active)";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/* eslint-disable react/jsx-key */
|
|
2
|
+
import { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { ArrowLeft } from '@transferwise/icons';
|
|
4
|
+
import IconButton, { Props } from './IconButton';
|
|
5
|
+
import { action } from '@storybook/addon-actions';
|
|
6
|
+
import Body from '../body';
|
|
7
|
+
|
|
8
|
+
export default {
|
|
9
|
+
title: 'Actions/IconButton',
|
|
10
|
+
} satisfies Meta<typeof IconButton>;
|
|
11
|
+
|
|
12
|
+
type Story = StoryObj<typeof IconButton>;
|
|
13
|
+
|
|
14
|
+
const sizes: Props['size'][] = [16, 24, 32, 40, 48, 56, 72];
|
|
15
|
+
|
|
16
|
+
const Template = ({ size, disabled }: Props) => {
|
|
17
|
+
return (
|
|
18
|
+
<>
|
|
19
|
+
<IconButton
|
|
20
|
+
size={size}
|
|
21
|
+
disabled={disabled}
|
|
22
|
+
aria-label="One step back"
|
|
23
|
+
priority="primary"
|
|
24
|
+
type="default"
|
|
25
|
+
onClick={action('button click')}
|
|
26
|
+
>
|
|
27
|
+
<ArrowLeft />
|
|
28
|
+
</IconButton>
|
|
29
|
+
<IconButton
|
|
30
|
+
size={size}
|
|
31
|
+
disabled={disabled}
|
|
32
|
+
aria-label="One step back"
|
|
33
|
+
priority="secondary"
|
|
34
|
+
type="default"
|
|
35
|
+
onClick={action('button click')}
|
|
36
|
+
>
|
|
37
|
+
<ArrowLeft />
|
|
38
|
+
</IconButton>
|
|
39
|
+
<IconButton
|
|
40
|
+
size={size}
|
|
41
|
+
disabled={disabled}
|
|
42
|
+
aria-label="One step back"
|
|
43
|
+
priority="tertiary"
|
|
44
|
+
type="default"
|
|
45
|
+
onClick={action('button click')}
|
|
46
|
+
>
|
|
47
|
+
<ArrowLeft />
|
|
48
|
+
</IconButton>
|
|
49
|
+
<IconButton
|
|
50
|
+
size={size}
|
|
51
|
+
disabled={disabled}
|
|
52
|
+
aria-label="One step back"
|
|
53
|
+
priority="minimal"
|
|
54
|
+
type="default"
|
|
55
|
+
onClick={action('button click')}
|
|
56
|
+
>
|
|
57
|
+
<ArrowLeft />
|
|
58
|
+
</IconButton>
|
|
59
|
+
<IconButton
|
|
60
|
+
size={size}
|
|
61
|
+
disabled={disabled}
|
|
62
|
+
aria-label="One step back"
|
|
63
|
+
priority="primary"
|
|
64
|
+
type="negative"
|
|
65
|
+
onClick={action('button click')}
|
|
66
|
+
>
|
|
67
|
+
<ArrowLeft />
|
|
68
|
+
</IconButton>
|
|
69
|
+
<IconButton
|
|
70
|
+
size={size}
|
|
71
|
+
disabled={disabled}
|
|
72
|
+
aria-label="One step back"
|
|
73
|
+
priority="secondary"
|
|
74
|
+
type="negative"
|
|
75
|
+
onClick={action('button click')}
|
|
76
|
+
>
|
|
77
|
+
<ArrowLeft />
|
|
78
|
+
</IconButton>
|
|
79
|
+
</>
|
|
80
|
+
);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const Basic: Story = {
|
|
84
|
+
tags: ['autodocs'],
|
|
85
|
+
render: () => {
|
|
86
|
+
return (
|
|
87
|
+
<div
|
|
88
|
+
style={{
|
|
89
|
+
gap: '1em',
|
|
90
|
+
display: 'grid',
|
|
91
|
+
justifyContent: 'space-between',
|
|
92
|
+
gridTemplate: `auto auto / repeat(6, min-content)`,
|
|
93
|
+
}}
|
|
94
|
+
>
|
|
95
|
+
{['Primary', 'Secondary', 'Tertiary', 'Text', 'Neg primary', 'Neg secondary'].map(
|
|
96
|
+
(variant) => (
|
|
97
|
+
<Body type="body-default-bold">{variant}</Body>
|
|
98
|
+
),
|
|
99
|
+
)}
|
|
100
|
+
{sizes.map((size) => (
|
|
101
|
+
<Template size={size} />
|
|
102
|
+
))}
|
|
103
|
+
<Template size={72} disabled />
|
|
104
|
+
</div>
|
|
105
|
+
);
|
|
106
|
+
},
|
|
107
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { AnchorHTMLAttributes, ButtonHTMLAttributes, forwardRef, HTMLAttributes } from 'react';
|
|
2
|
+
import { PrimitiveAnchor, PrimitiveButton } from '../primitives';
|
|
3
|
+
import Circle from '../common/circle';
|
|
4
|
+
import { clsx } from 'clsx';
|
|
5
|
+
|
|
6
|
+
export type Props = {
|
|
7
|
+
size?: 16 | 24 | 32 | 40 | 48 | 56 | 72;
|
|
8
|
+
priority?: 'primary' | 'secondary' | 'tertiary' | 'minimal';
|
|
9
|
+
type?: 'default' | 'negative';
|
|
10
|
+
'data-testid'?: string;
|
|
11
|
+
} & Pick<AnchorHTMLAttributes<HTMLAnchorElement>, 'href' | 'target' | 'onClick'> &
|
|
12
|
+
Pick<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick' | 'disabled'> &
|
|
13
|
+
Pick<HTMLAttributes<HTMLDivElement>, 'className' | 'role' | 'children' | 'aria-label'>;
|
|
14
|
+
|
|
15
|
+
const IconButton = forwardRef(function IconButton(
|
|
16
|
+
{
|
|
17
|
+
size = 48,
|
|
18
|
+
href = '#',
|
|
19
|
+
children,
|
|
20
|
+
className,
|
|
21
|
+
priority = 'primary',
|
|
22
|
+
type = 'default',
|
|
23
|
+
...props
|
|
24
|
+
}: Props,
|
|
25
|
+
ref,
|
|
26
|
+
) {
|
|
27
|
+
const isLink = href !== '#';
|
|
28
|
+
return (
|
|
29
|
+
// @ts-expect-error it's either link or `button` element so it has `onClick` / `href`
|
|
30
|
+
<Circle
|
|
31
|
+
ref={ref}
|
|
32
|
+
as={isLink ? PrimitiveAnchor : PrimitiveButton}
|
|
33
|
+
size={size}
|
|
34
|
+
fixedSize
|
|
35
|
+
className={clsx(
|
|
36
|
+
'np-icon-button',
|
|
37
|
+
`np-icon-button-${priority}-${type}`,
|
|
38
|
+
{
|
|
39
|
+
disabled: props.disabled,
|
|
40
|
+
},
|
|
41
|
+
className,
|
|
42
|
+
)}
|
|
43
|
+
{...(isLink ? { href } : {})}
|
|
44
|
+
{...props}
|
|
45
|
+
>
|
|
46
|
+
{children}
|
|
47
|
+
</Circle>
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
export default IconButton;
|
package/src/index.ts
CHANGED
|
@@ -95,6 +95,7 @@ export type { TypeaheadOption, TypeaheadProps } from './typeahead';
|
|
|
95
95
|
export type { UploadProps } from './upload';
|
|
96
96
|
export type { UploadError, UploadResponse, UploadedFile } from './uploadInput/types';
|
|
97
97
|
export type { WithIdProps } from './withId';
|
|
98
|
+
export type { IconButtonProps } from './iconButton';
|
|
98
99
|
|
|
99
100
|
/**
|
|
100
101
|
* Components
|
|
@@ -111,6 +112,7 @@ export { default as AvatarWrapper } from './avatarWrapper';
|
|
|
111
112
|
export { default as Badge } from './badge';
|
|
112
113
|
export { default as Body } from './body';
|
|
113
114
|
export { default as Button } from './button';
|
|
115
|
+
export { default as IconButton } from './iconButton';
|
|
114
116
|
export { default as Carousel } from './carousel';
|
|
115
117
|
export { default as Card } from './card';
|
|
116
118
|
export { default as Checkbox } from './checkbox';
|
package/src/main.css
CHANGED
|
@@ -535,6 +535,88 @@ div.critical-comms .critical-comms-body {
|
|
|
535
535
|
.np-avatar-layout-horizontal-child {
|
|
536
536
|
margin-left: calc(var(--np-avatar-offset) * -1);
|
|
537
537
|
}
|
|
538
|
+
.np-icon-button {
|
|
539
|
+
border: none;
|
|
540
|
+
}
|
|
541
|
+
.np-icon-button-tertiary-default {
|
|
542
|
+
color: var(--color-interactive-primary);
|
|
543
|
+
background-color: rgba(134,167,189,0.10196);
|
|
544
|
+
background-color: var(--color-background-neutral);
|
|
545
|
+
}
|
|
546
|
+
.np-icon-button-tertiary-default:not(.disabled):not(:disabled):hover {
|
|
547
|
+
background-color: var(--color-background-neutral-hover);
|
|
548
|
+
}
|
|
549
|
+
.np-icon-button-tertiary-default:not(.disabled):not(:disabled):active {
|
|
550
|
+
background-color: var(--color-background-neutral-active);
|
|
551
|
+
}
|
|
552
|
+
.np-icon-button-primary-default {
|
|
553
|
+
color: var(--color-interactive-control);
|
|
554
|
+
background-color: #00a2dd;
|
|
555
|
+
background-color: var(--color-interactive-accent);
|
|
556
|
+
}
|
|
557
|
+
.np-icon-button-primary-default:not(.disabled):not(:disabled):hover {
|
|
558
|
+
background-color: #008fc9;
|
|
559
|
+
background-color: var(--color-interactive-accent-hover);
|
|
560
|
+
}
|
|
561
|
+
.np-icon-button-primary-default:not(.disabled):not(:disabled):active {
|
|
562
|
+
background-color: #0081ba;
|
|
563
|
+
background-color: var(--color-interactive-accent-active);
|
|
564
|
+
}
|
|
565
|
+
.np-icon-button-primary-negative {
|
|
566
|
+
color: var(--color-contrast-overlay);
|
|
567
|
+
background-color: var(--color-sentiment-negative-primary);
|
|
568
|
+
}
|
|
569
|
+
.np-icon-button-primary-negative:not(.disabled):not(:disabled):hover {
|
|
570
|
+
background-color: var(--color-sentiment-negative-primary-hover);
|
|
571
|
+
}
|
|
572
|
+
.np-icon-button-primary-negative:not(.disabled):not(:disabled):active {
|
|
573
|
+
background-color: var(--color-sentiment-negative-primary-active);
|
|
574
|
+
}
|
|
575
|
+
.np-theme-personal--bright-green .np-icon-button-primary-negative {
|
|
576
|
+
color: var(--color-white);
|
|
577
|
+
}
|
|
578
|
+
.np-icon-button-minimal-default {
|
|
579
|
+
color: var(--color-interactive-primary);
|
|
580
|
+
background-color: #ffffff;
|
|
581
|
+
background-color: var(--color-background-screen);
|
|
582
|
+
background-color: transparent;
|
|
583
|
+
}
|
|
584
|
+
.np-icon-button-minimal-default:not(.disabled):not(:disabled):hover {
|
|
585
|
+
background-color: var(--color-background-screen-hover);
|
|
586
|
+
}
|
|
587
|
+
.np-icon-button-minimal-default:not(.disabled):not(:disabled):active {
|
|
588
|
+
background-color: var(--color-background-screen-active);
|
|
589
|
+
}
|
|
590
|
+
.np-icon-button-secondary-default {
|
|
591
|
+
color: var(--color-interactive-primary);
|
|
592
|
+
background-color: var(--color-interactive-neutral);
|
|
593
|
+
}
|
|
594
|
+
.np-icon-button-secondary-default:not(.disabled):not(:disabled):hover {
|
|
595
|
+
background-color: var(--color-interactive-neutral-hover);
|
|
596
|
+
}
|
|
597
|
+
.np-icon-button-secondary-default:not(.disabled):not(:disabled):active {
|
|
598
|
+
background-color: var(--color-interactive-neutral-active);
|
|
599
|
+
}
|
|
600
|
+
.np-theme-personal--bright-green .np-icon-button-secondary-default,
|
|
601
|
+
.np-theme-personal--forest-green .np-icon-button-secondary-default {
|
|
602
|
+
color: var(--color-interactive-control);
|
|
603
|
+
}
|
|
604
|
+
.np-icon-button-secondary-negative {
|
|
605
|
+
color: var(--color-sentiment-negative-primary);
|
|
606
|
+
background-color: var(--color-sentiment-negative-secondary);
|
|
607
|
+
}
|
|
608
|
+
.np-icon-button-secondary-negative:not(.disabled):not(:disabled):hover {
|
|
609
|
+
background-color: var(--color-sentiment-negative-secondary-hover);
|
|
610
|
+
}
|
|
611
|
+
.np-icon-button-secondary-negative:not(.disabled):not(:disabled):active {
|
|
612
|
+
background-color: var(--color-sentiment-negative-secondary-active);
|
|
613
|
+
}
|
|
614
|
+
.np-theme-personal--bright-green .np-icon-button-secondary-negative {
|
|
615
|
+
color: var(--color-white);
|
|
616
|
+
}
|
|
617
|
+
.np-theme-personal--forest-green .np-icon-button-secondary-negative {
|
|
618
|
+
color: var(--color-contrast-overlay);
|
|
619
|
+
}
|
|
538
620
|
.tw-badge {
|
|
539
621
|
position: relative;
|
|
540
622
|
display: inline-block;
|
|
@@ -2201,38 +2283,6 @@ button.np-option {
|
|
|
2201
2283
|
outline: var(--ring-outline-color) solid var(--ring-outline-width);
|
|
2202
2284
|
outline-offset: var(--ring-outline-offset);
|
|
2203
2285
|
}
|
|
2204
|
-
.np-back-button {
|
|
2205
|
-
color: #00a2dd;
|
|
2206
|
-
color: var(--color-interactive-accent);
|
|
2207
|
-
display: flex !important;
|
|
2208
|
-
}
|
|
2209
|
-
.np-back-button:hover {
|
|
2210
|
-
color: #008fc9;
|
|
2211
|
-
color: var(--color-interactive-accent-hover);
|
|
2212
|
-
}
|
|
2213
|
-
.np-back-button:active {
|
|
2214
|
-
color: #0081ba;
|
|
2215
|
-
color: var(--color-interactive-accent-active);
|
|
2216
|
-
}
|
|
2217
|
-
.np-theme-personal .np-back-button {
|
|
2218
|
-
color: #37517e;
|
|
2219
|
-
color: var(--color-content-primary);
|
|
2220
|
-
}
|
|
2221
|
-
.np-theme-personal .np-back-button:hover {
|
|
2222
|
-
color: var(--color-content-primary-hover);
|
|
2223
|
-
}
|
|
2224
|
-
.np-theme-personal .np-back-button:active {
|
|
2225
|
-
color: var(--color-content-primary-active);
|
|
2226
|
-
}
|
|
2227
|
-
.np-theme-personal .np-back-button .tw-icon {
|
|
2228
|
-
color: var(--color-interactive-primary);
|
|
2229
|
-
}
|
|
2230
|
-
.np-theme-personal .np-back-button .tw-icon:hover {
|
|
2231
|
-
color: var(--color-interactive-primary-hover);
|
|
2232
|
-
}
|
|
2233
|
-
.np-theme-personal .np-back-button .tw-icon:active {
|
|
2234
|
-
color: var(--color-interactive-primary-active);
|
|
2235
|
-
}
|
|
2236
2286
|
.np-flow-navigation {
|
|
2237
2287
|
width: 100%;
|
|
2238
2288
|
min-height: 97px;
|
|
@@ -4950,6 +5000,10 @@ html:not([dir="rtl"]) .np-navigation-option {
|
|
|
4950
5000
|
padding-left: calc(var(--size-24) + var(--size-8));
|
|
4951
5001
|
padding-right: 0;
|
|
4952
5002
|
}
|
|
5003
|
+
.np-summary__description-icon {
|
|
5004
|
+
margin-top: 4px;
|
|
5005
|
+
margin-top: var(--size-4);
|
|
5006
|
+
}
|
|
4953
5007
|
.np-summary__action {
|
|
4954
5008
|
margin-top: 4px;
|
|
4955
5009
|
margin-top: var(--size-4);
|
package/src/main.less
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
@import "./avatar/Avatar.less";
|
|
6
6
|
@import "./avatarView/AvatarView.less";
|
|
7
7
|
@import "./avatarLayout/AvatarLayout.less";
|
|
8
|
+
@import "./iconButton/IconButton.less";
|
|
8
9
|
@import "./badge/Badge.less";
|
|
9
10
|
@import "./button/Button.less";
|
|
10
11
|
@import "./card/Card.less";
|
|
@@ -30,7 +31,6 @@
|
|
|
30
31
|
@import "./dropFade/DropFade.less";
|
|
31
32
|
@import "./emphasis/Emphasis.less";
|
|
32
33
|
@import "./flowNavigation/animatedLabel/AnimatedLabel.less";
|
|
33
|
-
@import "./flowNavigation/backButton/BackButton.less";
|
|
34
34
|
@import "./flowNavigation/FlowNavigation.less";
|
|
35
35
|
@import "./header/Header.less";
|
|
36
36
|
@import "./image/Image.less";
|
package/src/summary/Summary.css
CHANGED