@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.
Files changed (108) hide show
  1. package/build/common/Option/Option.js +8 -2
  2. package/build/common/Option/Option.js.map +1 -1
  3. package/build/common/Option/Option.mjs +8 -2
  4. package/build/common/Option/Option.mjs.map +1 -1
  5. package/build/common/closeButton/CloseButton.js.map +1 -1
  6. package/build/common/closeButton/CloseButton.mjs.map +1 -1
  7. package/build/flowNavigation/FlowNavigation.js +8 -3
  8. package/build/flowNavigation/FlowNavigation.js.map +1 -1
  9. package/build/flowNavigation/FlowNavigation.mjs +8 -3
  10. package/build/flowNavigation/FlowNavigation.mjs.map +1 -1
  11. package/build/i18n/de.json +5 -0
  12. package/build/i18n/de.json.js +5 -0
  13. package/build/i18n/de.json.js.map +1 -1
  14. package/build/i18n/de.json.mjs +5 -0
  15. package/build/i18n/de.json.mjs.map +1 -1
  16. package/build/i18n/fr.json +6 -1
  17. package/build/i18n/fr.json.js +6 -1
  18. package/build/i18n/fr.json.js.map +1 -1
  19. package/build/i18n/fr.json.mjs +6 -1
  20. package/build/i18n/fr.json.mjs.map +1 -1
  21. package/build/i18n/it.json +5 -0
  22. package/build/i18n/it.json.js +5 -0
  23. package/build/i18n/it.json.js.map +1 -1
  24. package/build/i18n/it.json.mjs +5 -0
  25. package/build/i18n/it.json.mjs.map +1 -1
  26. package/build/i18n/pt.json +5 -0
  27. package/build/i18n/pt.json.js +5 -0
  28. package/build/i18n/pt.json.js.map +1 -1
  29. package/build/i18n/pt.json.mjs +5 -0
  30. package/build/i18n/pt.json.mjs.map +1 -1
  31. package/build/i18n/ru.json +5 -0
  32. package/build/i18n/ru.json.js +5 -0
  33. package/build/i18n/ru.json.js.map +1 -1
  34. package/build/i18n/ru.json.mjs +5 -0
  35. package/build/i18n/ru.json.mjs.map +1 -1
  36. package/build/iconButton/IconButton.js +41 -0
  37. package/build/iconButton/IconButton.js.map +1 -0
  38. package/build/iconButton/IconButton.mjs +39 -0
  39. package/build/iconButton/IconButton.mjs.map +1 -0
  40. package/build/index.js +2 -0
  41. package/build/index.js.map +1 -1
  42. package/build/index.mjs +1 -0
  43. package/build/index.mjs.map +1 -1
  44. package/build/main.css +86 -32
  45. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js +83 -0
  46. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js.map +1 -0
  47. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs +81 -0
  48. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs.map +1 -0
  49. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js +90 -0
  50. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js.map +1 -0
  51. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs +88 -0
  52. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs.map +1 -0
  53. package/build/styles/iconButton/IconButton.css +82 -0
  54. package/build/styles/main.css +86 -32
  55. package/build/styles/summary/Summary.css +4 -0
  56. package/build/summary/Summary.js +3 -3
  57. package/build/summary/Summary.js.map +1 -1
  58. package/build/summary/Summary.mjs +3 -3
  59. package/build/summary/Summary.mjs.map +1 -1
  60. package/build/types/common/Option/Option.d.ts.map +1 -1
  61. package/build/types/common/closeButton/CloseButton.d.ts +3 -0
  62. package/build/types/common/closeButton/CloseButton.d.ts.map +1 -1
  63. package/build/types/flowNavigation/FlowNavigation.d.ts.map +1 -1
  64. package/build/types/iconButton/IconButton.d.ts +15 -0
  65. package/build/types/iconButton/IconButton.d.ts.map +1 -0
  66. package/build/types/iconButton/index.d.ts +3 -0
  67. package/build/types/iconButton/index.d.ts.map +1 -0
  68. package/build/types/index.d.ts +2 -0
  69. package/build/types/index.d.ts.map +1 -1
  70. package/build/types/summary/Summary.d.ts.map +1 -1
  71. package/package.json +3 -3
  72. package/src/accordion/AccordionItem/__snapshots__/AccordionItem.spec.js.snap +8 -4
  73. package/src/card/Card.spec.tsx +3 -1
  74. package/src/common/Option/Option.tsx +11 -1
  75. package/src/common/closeButton/CloseButton.tsx +3 -0
  76. package/src/flowNavigation/FlowNavigation.spec.js +7 -8
  77. package/src/flowNavigation/FlowNavigation.tsx +11 -2
  78. package/src/flowNavigation/__snapshots__/FlowNavigation.spec.js.snap +27 -3
  79. package/src/i18n/de.json +5 -0
  80. package/src/i18n/fr.json +6 -1
  81. package/src/i18n/it.json +5 -0
  82. package/src/i18n/pt.json +5 -0
  83. package/src/i18n/ru.json +5 -0
  84. package/src/iconButton/IconButton.css +82 -0
  85. package/src/iconButton/IconButton.less +55 -0
  86. package/src/iconButton/IconButton.story.tsx +107 -0
  87. package/src/iconButton/IconButton.tsx +51 -0
  88. package/src/iconButton/index.ts +2 -0
  89. package/src/index.ts +2 -0
  90. package/src/main.css +86 -32
  91. package/src/main.less +1 -1
  92. package/src/summary/Summary.css +4 -0
  93. package/src/summary/Summary.less +3 -0
  94. package/src/summary/Summary.story.tsx +13 -3
  95. package/src/summary/Summary.tsx +13 -11
  96. package/build/flowNavigation/backButton/BackButton.js +0 -30
  97. package/build/flowNavigation/backButton/BackButton.js.map +0 -1
  98. package/build/flowNavigation/backButton/BackButton.mjs +0 -28
  99. package/build/flowNavigation/backButton/BackButton.mjs.map +0 -1
  100. package/build/styles/flowNavigation/backButton/BackButton.css +0 -32
  101. package/build/types/flowNavigation/backButton/BackButton.d.ts +0 -7
  102. package/build/types/flowNavigation/backButton/BackButton.d.ts.map +0 -1
  103. package/build/types/flowNavigation/backButton/index.d.ts +0 -3
  104. package/build/types/flowNavigation/backButton/index.d.ts.map +0 -1
  105. package/src/flowNavigation/backButton/BackButton.css +0 -32
  106. package/src/flowNavigation/backButton/BackButton.less +0 -36
  107. package/src/flowNavigation/backButton/BackButton.tsx +0 -29
  108. 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(screen.queryByText('BackButton')).not.toBeInTheDocument();
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(screen.queryByText('BackButton')).not.toBeInTheDocument();
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.getByText('BackButton')).toBeInTheDocument();
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 BackButton from './backButton';
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
- <BackButton aria-label={intl.formatMessage(messages.back)} onClick={onGoBack} />
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
- <div>
12
- BackButton
13
- </div>
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": "(Facultatif)",
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;
@@ -0,0 +1,2 @@
1
+ export type { Props as IconButtonProps } from './IconButton';
2
+ export { default } from './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";
@@ -67,6 +67,10 @@
67
67
  padding-left: calc(var(--size-24) + var(--size-8));
68
68
  padding-right: 0;
69
69
  }
70
+ .np-summary__description-icon {
71
+ margin-top: 4px;
72
+ margin-top: var(--size-4);
73
+ }
70
74
  .np-summary__action {
71
75
  margin-top: 4px;
72
76
  margin-top: var(--size-4);
@@ -72,6 +72,9 @@
72
72
  padding-right: 0;
73
73
  }
74
74
  }
75
+ &__description-icon {
76
+ margin-top: var(--size-4);
77
+ }
75
78
 
76
79
  &__action {
77
80
  margin-top: var(--size-4);