@transferwise/components 0.0.0-experimental-8ef2fe2 → 0.0.0-experimental-1ffdc56

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 (64) hide show
  1. package/build/alert/Alert.js +33 -17
  2. package/build/alert/Alert.js.map +1 -1
  3. package/build/alert/Alert.mjs +30 -14
  4. package/build/alert/Alert.mjs.map +1 -1
  5. package/build/common/action/Action.js +26 -15
  6. package/build/common/action/Action.js.map +1 -1
  7. package/build/common/action/Action.mjs +26 -15
  8. package/build/common/action/Action.mjs.map +1 -1
  9. package/build/common/propsValues/sentiment.js +1 -0
  10. package/build/common/propsValues/sentiment.js.map +1 -1
  11. package/build/common/propsValues/sentiment.mjs +1 -0
  12. package/build/common/propsValues/sentiment.mjs.map +1 -1
  13. package/build/criticalBanner/CriticalCommsBanner.js +10 -73
  14. package/build/criticalBanner/CriticalCommsBanner.js.map +1 -1
  15. package/build/criticalBanner/CriticalCommsBanner.mjs +11 -74
  16. package/build/criticalBanner/CriticalCommsBanner.mjs.map +1 -1
  17. package/build/i18n/en.json +1 -0
  18. package/build/i18n/en.json.js +1 -0
  19. package/build/i18n/en.json.js.map +1 -1
  20. package/build/i18n/en.json.mjs +1 -0
  21. package/build/i18n/en.json.mjs.map +1 -1
  22. package/build/main.css +14 -72
  23. package/build/statusIcon/StatusIcon.js +5 -1
  24. package/build/statusIcon/StatusIcon.js.map +1 -1
  25. package/build/statusIcon/StatusIcon.messages.js +3 -0
  26. package/build/statusIcon/StatusIcon.messages.js.map +1 -1
  27. package/build/statusIcon/StatusIcon.messages.mjs +3 -0
  28. package/build/statusIcon/StatusIcon.messages.mjs.map +1 -1
  29. package/build/statusIcon/StatusIcon.mjs +5 -1
  30. package/build/statusIcon/StatusIcon.mjs.map +1 -1
  31. package/build/styles/button/Button.css +3 -0
  32. package/build/styles/criticalBanner/CriticalCommsBanner.css +7 -72
  33. package/build/styles/main.css +14 -72
  34. package/build/styles/statusIcon/StatusIcon.css +4 -0
  35. package/build/types/alert/Alert.d.ts +2 -1
  36. package/build/types/alert/Alert.d.ts.map +1 -1
  37. package/build/types/common/action/Action.d.ts +4 -1
  38. package/build/types/common/action/Action.d.ts.map +1 -1
  39. package/build/types/common/propsValues/sentiment.d.ts +1 -0
  40. package/build/types/common/propsValues/sentiment.d.ts.map +1 -1
  41. package/build/types/criticalBanner/CriticalCommsBanner.d.ts.map +1 -1
  42. package/build/types/statusIcon/StatusIcon.d.ts.map +1 -1
  43. package/build/types/statusIcon/StatusIcon.messages.d.ts +5 -0
  44. package/build/types/statusIcon/StatusIcon.messages.d.ts.map +1 -1
  45. package/build/types/test-utils/index.d.ts +2 -0
  46. package/build/types/test-utils/index.d.ts.map +1 -1
  47. package/package.json +3 -3
  48. package/src/alert/Alert.story.tsx +36 -0
  49. package/src/alert/Alert.tsx +37 -8
  50. package/src/button/Button.css +3 -0
  51. package/src/button/Button.less +6 -2
  52. package/src/button/Button.vars.less +0 -2
  53. package/src/common/action/Action.tsx +39 -21
  54. package/src/common/propsValues/sentiment.ts +1 -0
  55. package/src/criticalBanner/CriticalCommsBanner.css +7 -72
  56. package/src/criticalBanner/CriticalCommsBanner.less +12 -73
  57. package/src/criticalBanner/CriticalCommsBanner.story.tsx +13 -9
  58. package/src/criticalBanner/CriticalCommsBanner.tsx +8 -50
  59. package/src/i18n/en.json +1 -0
  60. package/src/main.css +14 -72
  61. package/src/statusIcon/StatusIcon.css +4 -0
  62. package/src/statusIcon/StatusIcon.less +4 -0
  63. package/src/statusIcon/StatusIcon.messages.ts +6 -0
  64. package/src/statusIcon/StatusIcon.tsx +8 -1
@@ -1,76 +1,11 @@
1
- div.critical-comms {
2
- --critical-comms-background-color: var(--color-background-negative);
3
- --critical-comms-title-color: var(--color-content-negative);
4
- --critical-comms-subtitle-color: var(--color-content-secondary);
5
- --critical-comms-subtitle-color-padding-left: var(--size-16);
6
- --critical-comms-vertical-spacing: var(--size-8);
7
- background-color: rgba(255,135,135,0.10196);
8
- background-color: var(--critical-comms-background-color);
9
- display: flex;
10
- justify-content: center;
11
- align-items: center;
12
- }
13
- .np-theme-personal div.critical-comms,
14
- .np-theme-personal--dark div.critical-comms {
15
- --critical-comms-background-color: var(--color-sentiment-negative);
16
- --critical-comms-title-color: var(--color-contrast);
17
- --critical-comms-subtitle-color: var(--color-contrast);
18
- --critical-comms-subtitle-color-padding-left: 0;
19
- --critical-comms-vertical-spacing: var(--size-16);
20
- padding: 24px;
21
- padding: var(--padding-medium);
22
- }
23
- .np-theme-personal div.critical-comms .tw-icon-alert-circle-fill,
24
- .np-theme-personal--dark div.critical-comms .tw-icon-alert-circle-fill {
25
- color: var(--color-contrast);
26
- }
27
- .np-theme-personal div.critical-comms .tw-icon-alert-circle-fill svg,
28
- .np-theme-personal--dark div.critical-comms .tw-icon-alert-circle-fill svg {
29
- width: 48px;
30
- height: 48px;
31
- }
32
- .np-theme-personal div.critical-comms .cta-btn,
33
- .np-theme-personal--dark div.critical-comms .cta-btn {
34
- background-color: var(--color-contrast);
35
- }
36
- .np-theme-personal div.critical-comms .cta-btn:not(.disabled):not(:disabled):focus,
37
- .np-theme-personal--dark div.critical-comms .cta-btn:not(.disabled):not(:disabled):focus {
38
- outline-color: var(--color-contrast);
1
+ .np-theme-personal .critical-comms .alert-critical {
2
+ color: var(--color-contrast-overlay);
3
+ background-color: var(--color-sentiment-negative) !important;
39
4
  }
40
- @media (max-width: 767px) {
41
- div.critical-comms {
42
- display: inline;
43
- display: initial;
44
- }
5
+ .np-theme-personal .critical-comms .alert-critical .np-text-title-body {
6
+ color: var(--color-contrast-overlay);
45
7
  }
46
- div.critical-comms .critical-comms--title {
47
- color: var(--critical-comms-title-color);
48
- }
49
- div.critical-comms .critical-comms--subtitle {
50
- color: var(--critical-comms-subtitle-color);
51
- }
52
- div.critical-comms .critical-comms--cta {
53
- padding-left: 0;
54
- }
55
- @media (max-width: 767px) {
56
- div.critical-comms .critical-comms--cta {
57
- padding-left: var(--critical-comms-subtitle-color-padding-left);
58
- padding-top: var(--critical-comms-vertical-spacing);
59
- min-width: 100%;
60
- }
61
- }
62
- div.critical-comms .critical-comms-body {
8
+ .np-theme-personal .critical-comms .action__desktop {
63
9
  display: flex;
64
- width: 100%;
65
- }
66
- @media (max-width: 767px) {
67
- div.critical-comms .critical-comms-body {
68
- flex-direction: column;
69
- }
70
- }
71
- @media (max-width: 767px) {
72
- div.critical-comms .critical-comms-content {
73
- padding-top: var(--critical-comms-vertical-spacing);
74
- flex-wrap: wrap;
75
- }
10
+ align-items: center;
76
11
  }
@@ -1,78 +1,17 @@
1
- div.critical-comms {
2
- --critical-comms-background-color: var(--color-background-negative);
3
- --critical-comms-title-color: var(--color-content-negative);
4
- --critical-comms-subtitle-color: var(--color-content-secondary);
5
- --critical-comms-subtitle-color-padding-left: var(--size-16);
6
- --critical-comms-vertical-spacing: var(--size-8);
7
-
8
- .np-theme-personal &,
9
- .np-theme-personal--dark & {
10
- --critical-comms-background-color: var(--color-sentiment-negative);
11
- --critical-comms-title-color: var(--color-contrast);
12
- --critical-comms-subtitle-color: var(--color-contrast);
13
- --critical-comms-subtitle-color-padding-left: 0;
14
- --critical-comms-vertical-spacing: var(--size-16);
15
-
16
- padding: var(--padding-medium);
17
-
18
- .tw-icon-alert-circle-fill {
19
- color: var(--color-contrast);
20
-
21
- svg {
22
- width: 48px;
23
- height: 48px;
24
- }
25
- }
26
-
27
- .cta-btn {
28
- background-color: var(--color-contrast);
29
-
30
- &:not(.disabled,:disabled):focus {
31
- outline-color: var(--color-contrast);
1
+ .np-theme-personal {
2
+ .critical-comms {
3
+ .alert-critical {
4
+ color: var(--color-contrast-overlay);
5
+ background-color: var(--color-sentiment-negative) !important;
6
+
7
+ .np-text-title-body {
8
+ color: var(--color-contrast-overlay);
32
9
  }
33
10
  }
34
- }
35
-
36
- background-color: var(--critical-comms-background-color);
37
- display: flex;
38
- justify-content: center;
39
- align-items: center;
40
-
41
- @media (--screen-sm-max) {
42
- display: initial;
43
- }
44
-
45
- .critical-comms--title {
46
- color: var(--critical-comms-title-color);
47
- }
48
-
49
- .critical-comms--subtitle {
50
- color: var(--critical-comms-subtitle-color);
51
- }
52
-
53
- .critical-comms--cta {
54
- padding-left: 0;
55
-
56
- @media (--screen-sm-max) {
57
- padding-left: var(--critical-comms-subtitle-color-padding-left);
58
- padding-top: var(--critical-comms-vertical-spacing);
59
- min-width: 100%;
60
- }
61
- }
62
-
63
- .critical-comms-body {
64
- display: flex;
65
- width: 100%;
66
-
67
- @media (--screen-sm-max) {
68
- flex-direction: column;
69
- }
70
- }
71
11
 
72
- .critical-comms-content {
73
- @media (--screen-sm-max) {
74
- padding-top: var(--critical-comms-vertical-spacing);
75
- flex-wrap: wrap;
12
+ .action__desktop {
13
+ display: flex;
14
+ align-items: center;
76
15
  }
77
16
  }
78
- }
17
+ }
@@ -1,6 +1,8 @@
1
- import { Meta, StoryObj } from '@storybook/react';
1
+ import { Meta } from '@storybook/react';
2
2
 
3
3
  import CriticalCommsBanner from '.';
4
+ import { Variant } from '../common';
5
+ import { storyConfig } from '../test-utils';
4
6
 
5
7
  export default {
6
8
  component: CriticalCommsBanner,
@@ -8,12 +10,14 @@ export default {
8
10
  tags: ['autodocs'],
9
11
  } satisfies Meta<typeof CriticalCommsBanner>;
10
12
 
11
- type Story = StoryObj<typeof CriticalCommsBanner>;
12
-
13
- export const Basic: Story = {
14
- args: {
15
- title: 'Your account is overdrawn',
16
- subtitle: 'Add money within the next 30 days',
17
- action: { label: 'Take action', href: 'https://wise.com' },
13
+ export const Basic = storyConfig(
14
+ {
15
+ args: {
16
+ title: 'Your account is overdrawn',
17
+ subtitle: 'Add money within the next 30 days',
18
+ action: { label: 'Take action', href: 'https://wise.com' },
19
+ variant: Variant.DESKTOP,
20
+ },
18
21
  },
19
- };
22
+ { variants: ['default', 'dark', 'rtl'] },
23
+ );
@@ -1,13 +1,6 @@
1
- import { Alert as DangerIcon, AlertCircleFill } from '@transferwise/icons';
2
- import { useTheme } from '@wise/components-theming';
1
+ import Alert from '../alert';
3
2
  import { clsx } from 'clsx';
4
3
 
5
- import Avatar, { AvatarType } from '../avatar';
6
- import Body from '../body';
7
- import Button from '../button';
8
- import { ControlType, Priority, Size, Typography } from '../common';
9
- import Title from '../title';
10
-
11
4
  export type CriticalCommsBannerProps = {
12
5
  title: string;
13
6
  subtitle?: string;
@@ -19,50 +12,15 @@ export type CriticalCommsBannerProps = {
19
12
  };
20
13
 
21
14
  function CriticalCommsBanner({ title, subtitle, action, className }: CriticalCommsBannerProps) {
22
- const { isModern } = useTheme();
23
15
  return (
24
16
  <div className={clsx('critical-comms', className)}>
25
- <div className="critical-comms-body">
26
- <Avatar
27
- size={Size.MEDIUM}
28
- type={AvatarType.ICON}
29
- className={clsx(isModern ? 'm-r-2' : 'm-r-1')}
30
- backgroundColor={
31
- isModern ? 'var(--color-sentiment-negative)' : 'var(--color-background-negative)'
32
- }
33
- >
34
- {isModern ? <AlertCircleFill /> : <DangerIcon size={24} />}
35
- </Avatar>
36
- <div className="critical-comms-content d-flex align-items-center flex-grow-1">
37
- <div className={clsx('flex-grow-1', { 'p-x-2': !isModern })}>
38
- <Title
39
- type={isModern ? Typography.TITLE_BODY : Typography.TITLE_GROUP}
40
- className="critical-comms--title"
41
- >
42
- {title}
43
- </Title>
44
- <Body className="critical-comms--subtitle">{subtitle}</Body>
45
- </div>
46
- {action ? (
47
- <div className="critical-comms--cta">
48
- <Button
49
- block={isModern}
50
- size={Size.SMALL}
51
- type={ControlType.NEGATIVE}
52
- priority={isModern ? Priority.SECONDARY : Priority.PRIMARY}
53
- className="cta-btn"
54
- onClick={() => {
55
- if (action) {
56
- window.location.href = action.href;
57
- }
58
- }}
59
- >
60
- {action.label}
61
- </Button>
62
- </div>
63
- ) : null}
64
- </div>
65
- </div>
17
+ <Alert
18
+ title={title}
19
+ message={subtitle}
20
+ action={{ target: action?.href, text: action?.label }}
21
+ className={className}
22
+ type="critical"
23
+ />
66
24
  </div>
67
25
  );
68
26
  }
package/src/i18n/en.json CHANGED
@@ -27,6 +27,7 @@
27
27
  "neptune.SelectInput.noResultsFound": "No results found",
28
28
  "neptune.SelectOption.action.label": "Choose",
29
29
  "neptune.SelectOption.selected.action.label": "Change chosen option",
30
+ "neptune.StatusIcon.iconLabel.critical": "Critical:",
30
31
  "neptune.StatusIcon.iconLabel.error": "Error:",
31
32
  "neptune.StatusIcon.iconLabel.information": "Information:",
32
33
  "neptune.StatusIcon.iconLabel.pending": "Pending:",
package/src/main.css CHANGED
@@ -1,78 +1,13 @@
1
- div.critical-comms {
2
- --critical-comms-background-color: var(--color-background-negative);
3
- --critical-comms-title-color: var(--color-content-negative);
4
- --critical-comms-subtitle-color: var(--color-content-secondary);
5
- --critical-comms-subtitle-color-padding-left: var(--size-16);
6
- --critical-comms-vertical-spacing: var(--size-8);
7
- background-color: rgba(255,135,135,0.10196);
8
- background-color: var(--critical-comms-background-color);
9
- display: flex;
10
- justify-content: center;
11
- align-items: center;
12
- }
13
- .np-theme-personal div.critical-comms,
14
- .np-theme-personal--dark div.critical-comms {
15
- --critical-comms-background-color: var(--color-sentiment-negative);
16
- --critical-comms-title-color: var(--color-contrast);
17
- --critical-comms-subtitle-color: var(--color-contrast);
18
- --critical-comms-subtitle-color-padding-left: 0;
19
- --critical-comms-vertical-spacing: var(--size-16);
20
- padding: 24px;
21
- padding: var(--padding-medium);
22
- }
23
- .np-theme-personal div.critical-comms .tw-icon-alert-circle-fill,
24
- .np-theme-personal--dark div.critical-comms .tw-icon-alert-circle-fill {
25
- color: var(--color-contrast);
26
- }
27
- .np-theme-personal div.critical-comms .tw-icon-alert-circle-fill svg,
28
- .np-theme-personal--dark div.critical-comms .tw-icon-alert-circle-fill svg {
29
- width: 48px;
30
- height: 48px;
31
- }
32
- .np-theme-personal div.critical-comms .cta-btn,
33
- .np-theme-personal--dark div.critical-comms .cta-btn {
34
- background-color: var(--color-contrast);
35
- }
36
- .np-theme-personal div.critical-comms .cta-btn:not(.disabled):not(:disabled):focus,
37
- .np-theme-personal--dark div.critical-comms .cta-btn:not(.disabled):not(:disabled):focus {
38
- outline-color: var(--color-contrast);
39
- }
40
- @media (max-width: 767px) {
41
- div.critical-comms {
42
- display: inline;
43
- display: initial;
44
- }
45
- }
46
- div.critical-comms .critical-comms--title {
47
- color: var(--critical-comms-title-color);
48
- }
49
- div.critical-comms .critical-comms--subtitle {
50
- color: var(--critical-comms-subtitle-color);
51
- }
52
- div.critical-comms .critical-comms--cta {
53
- padding-left: 0;
1
+ .np-theme-personal .critical-comms .alert-critical {
2
+ color: var(--color-contrast-overlay);
3
+ background-color: var(--color-sentiment-negative) !important;
54
4
  }
55
- @media (max-width: 767px) {
56
- div.critical-comms .critical-comms--cta {
57
- padding-left: var(--critical-comms-subtitle-color-padding-left);
58
- padding-top: var(--critical-comms-vertical-spacing);
59
- min-width: 100%;
60
- }
5
+ .np-theme-personal .critical-comms .alert-critical .np-text-title-body {
6
+ color: var(--color-contrast-overlay);
61
7
  }
62
- div.critical-comms .critical-comms-body {
8
+ .np-theme-personal .critical-comms .action__desktop {
63
9
  display: flex;
64
- width: 100%;
65
- }
66
- @media (max-width: 767px) {
67
- div.critical-comms .critical-comms-body {
68
- flex-direction: column;
69
- }
70
- }
71
- @media (max-width: 767px) {
72
- div.critical-comms .critical-comms-content {
73
- padding-top: var(--critical-comms-vertical-spacing);
74
- flex-wrap: wrap;
75
- }
10
+ align-items: center;
76
11
  }
77
12
  .tw-date-lookup-calendar > tbody > tr > td.weekend button {
78
13
  font-size: 0.875rem;
@@ -939,6 +874,9 @@ div.critical-comms .critical-comms-body {
939
874
  .np-theme-personal--bright-green .wds-Button--minimal .wds-Button-avatars .np-circle {
940
875
  --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
941
876
  }
877
+ .critical-comms .wds-Button {
878
+ --Button-background: var(--color-contrast-overlay);
879
+ }
942
880
  [dir="rtl"] .wds-Button .tw-icon-chevron-right,[dir="rtl"] .wds-Button .tw-icon-arrow-right,[dir="rtl"] .wds-Button .tw-icon-chevron-left,[dir="rtl"] .wds-Button .tw-icon-arrow-left,[dir="rtl"] .wds-Button .tw-icon-arrow-diagonal-down,[dir="rtl"] .wds-Button .tw-icon-arrow-diagonal-up,[dir="rtl"] .wds-Button .tw-icon-list,[dir="rtl"] .wds-Button .tw-icon-activity {
943
881
  scale: -1 1;
944
882
  }
@@ -4477,6 +4415,10 @@ html:not([dir="rtl"]) .np-navigation-option {
4477
4415
  .status-circle.error {
4478
4416
  background-color: var(--color-sentiment-negative);
4479
4417
  }
4418
+ .status-circle.critical {
4419
+ background-color: #ffffff;
4420
+ background-color: var(--color-background-screen);
4421
+ }
4480
4422
  .status-circle.neutral {
4481
4423
  background-color: #5d7079;
4482
4424
  background-color: var(--color-content-secondary);
@@ -17,6 +17,10 @@
17
17
  .status-circle.error {
18
18
  background-color: var(--color-sentiment-negative);
19
19
  }
20
+ .status-circle.critical {
21
+ background-color: #ffffff;
22
+ background-color: var(--color-background-screen);
23
+ }
20
24
  .status-circle.neutral {
21
25
  background-color: #5d7079;
22
26
  background-color: var(--color-content-secondary);
@@ -24,6 +24,10 @@
24
24
  background-color: var(--color-sentiment-negative);
25
25
  }
26
26
 
27
+ .status-circle.critical {
28
+ background-color: var(--color-background-screen);
29
+ }
30
+
27
31
  .status-circle.neutral {
28
32
  background-color: var(--color-content-secondary);
29
33
  }
@@ -19,6 +19,12 @@ export default defineMessages({
19
19
  description:
20
20
  'Visually hidden label read by screen readers, describing the Warning icon – normally a prefix to remaining visible content, e.g. validation result.',
21
21
  },
22
+ criticalLabel: {
23
+ id: 'neptune.StatusIcon.iconLabel.critical',
24
+ defaultMessage: 'Critical:',
25
+ description:
26
+ 'Visually hidden label read by screen readers, describing the Critical icon – normally a prefix to remaining visible content, e.g. validation result.',
27
+ },
22
28
  pendingLabel: {
23
29
  id: 'neptune.StatusIcon.iconLabel.pending',
24
30
  defaultMessage: 'Pending:',
@@ -52,6 +52,10 @@ const StatusIcon = ({ sentiment = 'neutral', size: sizeProp = 40, iconLabel }: S
52
52
  Icon: Alert,
53
53
  defaultIconLabel: intl.formatMessage(messages.warningLabel),
54
54
  },
55
+ [Sentiment.CRITICAL]: {
56
+ Icon: Alert,
57
+ defaultIconLabel: intl.formatMessage(messages.criticalLabel),
58
+ },
55
59
  [Sentiment.PENDING]: {
56
60
  Icon: ClockBorderless,
57
61
  defaultIconLabel: intl.formatMessage(messages.pendingLabel),
@@ -76,7 +80,10 @@ const StatusIcon = ({ sentiment = 'neutral', size: sizeProp = 40, iconLabel }: S
76
80
  };
77
81
  const { Icon, defaultIconLabel } = iconMetaBySentiment[sentiment];
78
82
 
79
- const iconColor = sentiment === 'warning' || sentiment === 'pending' ? 'dark' : 'light';
83
+ const iconColor =
84
+ sentiment === 'warning' || sentiment === 'pending' || sentiment === 'critical'
85
+ ? 'dark'
86
+ : 'light';
80
87
  const isTinyViewport = useMedia(`(max-width: ${Breakpoint.ZOOM_400}px)`);
81
88
  const size = mapLegacySize[sizeProp] ?? sizeProp;
82
89
  return (