@transferwise/components 0.0.0-experimental-fa9fbe9 → 0.0.0-experimental-162ecb1

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 (152) hide show
  1. package/build/common/hooks/useResizeObserver.js +3 -3
  2. package/build/common/hooks/useResizeObserver.js.map +1 -1
  3. package/build/common/hooks/useResizeObserver.mjs +3 -3
  4. package/build/common/hooks/useResizeObserver.mjs.map +1 -1
  5. package/build/criticalBanner/CriticalCommsBanner.js +0 -3
  6. package/build/criticalBanner/CriticalCommsBanner.js.map +1 -1
  7. package/build/criticalBanner/CriticalCommsBanner.mjs +0 -3
  8. package/build/criticalBanner/CriticalCommsBanner.mjs.map +1 -1
  9. package/build/field/Field.js +2 -3
  10. package/build/field/Field.js.map +1 -1
  11. package/build/field/Field.mjs +2 -3
  12. package/build/field/Field.mjs.map +1 -1
  13. package/build/i18n/en.json +0 -2
  14. package/build/i18n/en.json.js +0 -2
  15. package/build/i18n/en.json.js.map +1 -1
  16. package/build/i18n/en.json.mjs +0 -2
  17. package/build/i18n/en.json.mjs.map +1 -1
  18. package/build/index.js +0 -2
  19. package/build/index.js.map +1 -1
  20. package/build/index.mjs +0 -1
  21. package/build/index.mjs.map +1 -1
  22. package/build/listItem/Prompt/ListItemPrompt.js +2 -3
  23. package/build/listItem/Prompt/ListItemPrompt.js.map +1 -1
  24. package/build/listItem/Prompt/ListItemPrompt.mjs +2 -3
  25. package/build/listItem/Prompt/ListItemPrompt.mjs.map +1 -1
  26. package/build/logo/Logo.js +70 -25
  27. package/build/logo/Logo.js.map +1 -1
  28. package/build/logo/Logo.mjs +72 -27
  29. package/build/logo/Logo.mjs.map +1 -1
  30. package/build/logo/logo-assets.js +68 -97
  31. package/build/logo/logo-assets.js.map +1 -1
  32. package/build/logo/logo-assets.mjs +62 -90
  33. package/build/logo/logo-assets.mjs.map +1 -1
  34. package/build/main.css +32 -224
  35. package/build/prompt/ActionPrompt/ActionPrompt.js +40 -8
  36. package/build/prompt/ActionPrompt/ActionPrompt.js.map +1 -1
  37. package/build/prompt/ActionPrompt/ActionPrompt.mjs +40 -8
  38. package/build/prompt/ActionPrompt/ActionPrompt.mjs.map +1 -1
  39. package/build/prompt/PrimitivePrompt/PrimitivePrompt.js +4 -11
  40. package/build/prompt/PrimitivePrompt/PrimitivePrompt.js.map +1 -1
  41. package/build/prompt/PrimitivePrompt/PrimitivePrompt.mjs +4 -11
  42. package/build/prompt/PrimitivePrompt/PrimitivePrompt.mjs.map +1 -1
  43. package/build/styles/logo/Logo.css +3 -24
  44. package/build/styles/main.css +32 -224
  45. package/build/table/Table.js +6 -5
  46. package/build/table/Table.js.map +1 -1
  47. package/build/table/Table.mjs +6 -5
  48. package/build/table/Table.mjs.map +1 -1
  49. package/build/typeahead/Typeahead.js +2 -3
  50. package/build/typeahead/Typeahead.js.map +1 -1
  51. package/build/typeahead/Typeahead.mjs +2 -3
  52. package/build/typeahead/Typeahead.mjs.map +1 -1
  53. package/build/types/common/hooks/useResizeObserver.d.ts +1 -1
  54. package/build/types/common/hooks/useResizeObserver.d.ts.map +1 -1
  55. package/build/types/criticalBanner/CriticalCommsBanner.d.ts +0 -3
  56. package/build/types/criticalBanner/CriticalCommsBanner.d.ts.map +1 -1
  57. package/build/types/index.d.ts +2 -2
  58. package/build/types/index.d.ts.map +1 -1
  59. package/build/types/logo/Logo.d.ts +32 -1
  60. package/build/types/logo/Logo.d.ts.map +1 -1
  61. package/build/types/logo/logo-assets.d.ts +33 -9
  62. package/build/types/logo/logo-assets.d.ts.map +1 -1
  63. package/build/types/prompt/ActionPrompt/ActionPrompt.d.ts +11 -2
  64. package/build/types/prompt/ActionPrompt/ActionPrompt.d.ts.map +1 -1
  65. package/build/types/prompt/PrimitivePrompt/PrimitivePrompt.d.ts +3 -35
  66. package/build/types/prompt/PrimitivePrompt/PrimitivePrompt.d.ts.map +1 -1
  67. package/build/types/prompt/index.d.ts +0 -2
  68. package/build/types/prompt/index.d.ts.map +1 -1
  69. package/build/types/table/Table.d.ts.map +1 -1
  70. package/build/types/test-utils/index.d.ts +0 -4
  71. package/build/types/test-utils/index.d.ts.map +1 -1
  72. package/package.json +3 -3
  73. package/src/common/bottomSheet/BottomSheet.test.story.tsx +6 -5
  74. package/src/common/hooks/useResizeObserver.ts +2 -3
  75. package/src/criticalBanner/CriticalCommsBanner.story.tsx +0 -4
  76. package/src/criticalBanner/CriticalCommsBanner.test.story.tsx +1 -1
  77. package/src/criticalBanner/CriticalCommsBanner.tsx +0 -3
  78. package/src/i18n/en.json +0 -2
  79. package/src/index.ts +2 -2
  80. package/src/logo/Logo.css +3 -24
  81. package/src/logo/Logo.less +3 -30
  82. package/src/logo/Logo.story.tsx +123 -89
  83. package/src/logo/Logo.test.story.tsx +12 -23
  84. package/src/logo/Logo.tsx +87 -28
  85. package/src/logo/logo-assets.tsx +36 -92
  86. package/src/main.css +32 -224
  87. package/src/main.less +1 -3
  88. package/src/prompt/ActionPrompt/ActionPrompt.tsx +62 -9
  89. package/src/prompt/PrimitivePrompt/PrimitivePrompt.tsx +40 -56
  90. package/src/prompt/index.ts +0 -4
  91. package/src/sentimentSurface/SentimentSurface.story.tsx +17 -43
  92. package/src/table/Table.story.tsx +1 -1
  93. package/src/table/Table.tsx +6 -5
  94. package/build/common/hooks/useContainerSize.js +0 -30
  95. package/build/common/hooks/useContainerSize.js.map +0 -1
  96. package/build/common/hooks/useContainerSize.mjs +0 -28
  97. package/build/common/hooks/useContainerSize.mjs.map +0 -1
  98. package/build/prompt/CriticalBanner/CriticalBanner.js +0 -142
  99. package/build/prompt/CriticalBanner/CriticalBanner.js.map +0 -1
  100. package/build/prompt/CriticalBanner/CriticalBanner.mjs +0 -140
  101. package/build/prompt/CriticalBanner/CriticalBanner.mjs.map +0 -1
  102. package/build/prompt/CriticalBanner/helpers.js +0 -29
  103. package/build/prompt/CriticalBanner/helpers.js.map +0 -1
  104. package/build/prompt/CriticalBanner/helpers.mjs +0 -26
  105. package/build/prompt/CriticalBanner/helpers.mjs.map +0 -1
  106. package/build/prompt/common/Expander/Expander.js +0 -35
  107. package/build/prompt/common/Expander/Expander.js.map +0 -1
  108. package/build/prompt/common/Expander/Expander.messages.js +0 -17
  109. package/build/prompt/common/Expander/Expander.messages.js.map +0 -1
  110. package/build/prompt/common/Expander/Expander.messages.mjs +0 -13
  111. package/build/prompt/common/Expander/Expander.messages.mjs.map +0 -1
  112. package/build/prompt/common/Expander/Expander.mjs +0 -33
  113. package/build/prompt/common/Expander/Expander.mjs.map +0 -1
  114. package/build/prompt/helpers/promptMedia.js +0 -52
  115. package/build/prompt/helpers/promptMedia.js.map +0 -1
  116. package/build/prompt/helpers/promptMedia.mjs +0 -50
  117. package/build/prompt/helpers/promptMedia.mjs.map +0 -1
  118. package/build/styles/prompt/CriticalBanner/CriticalBanner.css +0 -134
  119. package/build/styles/prompt/CriticalBanner/CriticalBanner.vars.css +0 -0
  120. package/build/styles/prompt/common/Expander/Expander.css +0 -8
  121. package/build/types/common/hooks/useContainerSize.d.ts +0 -14
  122. package/build/types/common/hooks/useContainerSize.d.ts.map +0 -1
  123. package/build/types/prompt/CriticalBanner/CriticalBanner.d.ts +0 -39
  124. package/build/types/prompt/CriticalBanner/CriticalBanner.d.ts.map +0 -1
  125. package/build/types/prompt/CriticalBanner/helpers.d.ts +0 -18
  126. package/build/types/prompt/CriticalBanner/helpers.d.ts.map +0 -1
  127. package/build/types/prompt/CriticalBanner/index.d.ts +0 -3
  128. package/build/types/prompt/CriticalBanner/index.d.ts.map +0 -1
  129. package/build/types/prompt/common/Expander/Expander.d.ts +0 -20
  130. package/build/types/prompt/common/Expander/Expander.d.ts.map +0 -1
  131. package/build/types/prompt/common/Expander/Expander.messages.d.ts +0 -14
  132. package/build/types/prompt/common/Expander/Expander.messages.d.ts.map +0 -1
  133. package/build/types/prompt/helpers/promptMedia.d.ts +0 -22
  134. package/build/types/prompt/helpers/promptMedia.d.ts.map +0 -1
  135. package/src/common/hooks/useContainerSize.test.tsx +0 -121
  136. package/src/common/hooks/useContainerSize.ts +0 -32
  137. package/src/prompt/CriticalBanner/CriticalBanner.accessibility.docs.mdx +0 -113
  138. package/src/prompt/CriticalBanner/CriticalBanner.css +0 -134
  139. package/src/prompt/CriticalBanner/CriticalBanner.less +0 -155
  140. package/src/prompt/CriticalBanner/CriticalBanner.story.tsx +0 -635
  141. package/src/prompt/CriticalBanner/CriticalBanner.test.story.tsx +0 -422
  142. package/src/prompt/CriticalBanner/CriticalBanner.tsx +0 -178
  143. package/src/prompt/CriticalBanner/CriticalBanner.vars.css +0 -0
  144. package/src/prompt/CriticalBanner/CriticalBanner.vars.less +0 -6
  145. package/src/prompt/CriticalBanner/helpers.ts +0 -39
  146. package/src/prompt/CriticalBanner/index.ts +0 -2
  147. package/src/prompt/common/Expander/Expander.css +0 -8
  148. package/src/prompt/common/Expander/Expander.less +0 -9
  149. package/src/prompt/common/Expander/Expander.messages.ts +0 -14
  150. package/src/prompt/common/Expander/Expander.test.tsx +0 -167
  151. package/src/prompt/common/Expander/Expander.tsx +0 -83
  152. package/src/prompt/helpers/promptMedia.tsx +0 -79
@@ -1,167 +0,0 @@
1
- import { renderHook, act, screen } from '@testing-library/react';
2
- import userEvent from '@testing-library/user-event';
3
-
4
- import { useExpanderState, shouldShowWhenExpanded, ExpanderToggle } from './Expander';
5
- import { mockMatchMedia, render } from '../../../test-utils';
6
-
7
- mockMatchMedia();
8
-
9
- describe('useExpanderState', () => {
10
- it('initializes with default expanded state (true)', () => {
11
- const { result } = renderHook(() => useExpanderState());
12
-
13
- expect(result.current.expanded).toBe(true);
14
- });
15
-
16
- it('initializes with custom expanded state', () => {
17
- const { result } = renderHook(() => useExpanderState(false));
18
-
19
- expect(result.current.expanded).toBe(false);
20
- });
21
-
22
- it('toggles expanded state', () => {
23
- const { result } = renderHook(() => useExpanderState(true));
24
-
25
- expect(result.current.expanded).toBe(true);
26
-
27
- act(() => {
28
- result.current.toggle();
29
- });
30
-
31
- expect(result.current.expanded).toBe(false);
32
-
33
- act(() => {
34
- result.current.toggle();
35
- });
36
-
37
- expect(result.current.expanded).toBe(true);
38
- });
39
-
40
- it('sets expanded state programmatically', () => {
41
- const { result } = renderHook(() => useExpanderState(true));
42
-
43
- act(() => {
44
- result.current.setExpanded(false);
45
- });
46
-
47
- expect(result.current.expanded).toBe(false);
48
-
49
- act(() => {
50
- result.current.setExpanded(true);
51
- });
52
-
53
- expect(result.current.expanded).toBe(true);
54
- });
55
-
56
- it('memoizes toggle callback', () => {
57
- const { result, rerender } = renderHook(() => useExpanderState(true));
58
-
59
- const firstToggle = result.current.toggle;
60
-
61
- rerender();
62
-
63
- expect(result.current.toggle).toBe(firstToggle);
64
- });
65
- });
66
-
67
- describe('shouldShowWhenExpanded', () => {
68
- it('returns false when hasContent is false', () => {
69
- expect(shouldShowWhenExpanded({ expanded: true, hasContent: false })).toBe(false);
70
- expect(shouldShowWhenExpanded({ expanded: false, hasContent: false })).toBe(false);
71
- });
72
-
73
- it('returns true when expanded and hasContent are true', () => {
74
- expect(shouldShowWhenExpanded({ expanded: true, hasContent: true })).toBe(true);
75
- });
76
-
77
- it('returns false when collapsed but hasContent is true', () => {
78
- expect(shouldShowWhenExpanded({ expanded: false, hasContent: true })).toBe(false);
79
- });
80
-
81
- it('returns true when alwaysShow is true and hasContent is true, regardless of expanded', () => {
82
- expect(shouldShowWhenExpanded({ expanded: true, hasContent: true, alwaysShow: true })).toBe(
83
- true,
84
- );
85
- expect(shouldShowWhenExpanded({ expanded: false, hasContent: true, alwaysShow: true })).toBe(
86
- true,
87
- );
88
- });
89
-
90
- it('returns false when alwaysShow is true but hasContent is false', () => {
91
- expect(shouldShowWhenExpanded({ expanded: true, hasContent: false, alwaysShow: true })).toBe(
92
- false,
93
- );
94
- expect(shouldShowWhenExpanded({ expanded: false, hasContent: false, alwaysShow: true })).toBe(
95
- false,
96
- );
97
- });
98
- });
99
-
100
- describe('ExpanderToggle', () => {
101
- it('renders with correct aria-label when expanded', () => {
102
- render(<ExpanderToggle expanded onToggle={jest.fn()} />);
103
-
104
- expect(screen.getByRole('button')).toHaveAttribute('aria-label', 'Collapse');
105
- });
106
-
107
- it('renders with correct aria-label when collapsed', () => {
108
- render(<ExpanderToggle expanded={false} onToggle={jest.fn()} />);
109
-
110
- expect(screen.getByRole('button')).toHaveAttribute('aria-label', 'Expand');
111
- });
112
-
113
- it('renders with custom labels', () => {
114
- const { rerender } = render(<ExpanderToggle expanded onToggle={jest.fn()} />);
115
-
116
- expect(screen.getByRole('button')).toHaveAttribute('aria-label', 'Collapse');
117
-
118
- rerender(<ExpanderToggle expanded={false} onToggle={jest.fn()} />);
119
-
120
- expect(screen.getByRole('button')).toHaveAttribute('aria-label', 'Expand');
121
- });
122
-
123
- it('sets aria-expanded attribute correctly', () => {
124
- const { rerender } = render(<ExpanderToggle expanded onToggle={jest.fn()} />);
125
-
126
- expect(screen.getByRole('button')).toHaveAttribute('aria-expanded', 'true');
127
-
128
- rerender(<ExpanderToggle expanded={false} onToggle={jest.fn()} />);
129
-
130
- expect(screen.getByRole('button')).toHaveAttribute('aria-expanded', 'false');
131
- });
132
-
133
- it('calls onToggle when clicked', async () => {
134
- const user = userEvent.setup();
135
- const onToggle = jest.fn();
136
-
137
- render(<ExpanderToggle expanded onToggle={onToggle} />);
138
-
139
- await user.click(screen.getByRole('button'));
140
-
141
- expect(onToggle).toHaveBeenCalledTimes(1);
142
- });
143
-
144
- it('applies custom className', () => {
145
- render(<ExpanderToggle expanded className="custom-class" onToggle={jest.fn()} />);
146
-
147
- expect(screen.getByRole('button')).toHaveClass('custom-class');
148
- });
149
-
150
- it('applies base class and collapsed class correctly', () => {
151
- const { rerender } = render(<ExpanderToggle expanded onToggle={jest.fn()} />);
152
-
153
- expect(screen.getByRole('button')).toHaveClass('wds-expander-toggle');
154
- expect(screen.getByRole('button')).not.toHaveClass('wds-expander-toggle--collapsed');
155
-
156
- rerender(<ExpanderToggle expanded={false} onToggle={jest.fn()} />);
157
-
158
- expect(screen.getByRole('button')).toHaveClass('wds-expander-toggle');
159
- expect(screen.getByRole('button')).toHaveClass('wds-expander-toggle--collapsed');
160
- });
161
-
162
- it('applies data-testid attribute', () => {
163
- render(<ExpanderToggle expanded data-testid="expander-toggle" onToggle={jest.fn()} />);
164
-
165
- expect(screen.getByTestId('expander-toggle')).toBeInTheDocument();
166
- });
167
- });
@@ -1,83 +0,0 @@
1
- import { useState, useCallback } from 'react';
2
- import { clsx } from 'clsx';
3
- import { ChevronUp } from '@transferwise/icons';
4
- import IconButton from '../../../iconButton';
5
- import { useIntl } from 'react-intl';
6
- import messages from './Expander.messages';
7
-
8
- export type ExpanderState = {
9
- expanded: boolean;
10
- toggle: () => void;
11
- setExpanded: (expanded: boolean) => void;
12
- };
13
-
14
- // Hook for managing expander state
15
- export function useExpanderState(initialExpanded = true): ExpanderState {
16
- const [expanded, setExpanded] = useState(initialExpanded);
17
-
18
- const toggle = useCallback(() => {
19
- setExpanded((prev) => !prev);
20
- }, []);
21
-
22
- return {
23
- expanded,
24
- toggle,
25
- setExpanded,
26
- };
27
- }
28
-
29
- // Helper for conditional rendering based on expanded state
30
- export function shouldShowWhenExpanded({
31
- expanded,
32
- hasContent,
33
- alwaysShow = false,
34
- }: {
35
- expanded: boolean;
36
- hasContent: boolean;
37
- alwaysShow?: boolean;
38
- }): boolean {
39
- if (alwaysShow) {
40
- return hasContent;
41
- }
42
-
43
- return expanded && hasContent;
44
- }
45
-
46
- export type ExpanderToggleProps = {
47
- expanded: boolean;
48
- onToggle?: () => void;
49
- size?: 16 | 24 | 32 | 40 | 48 | 56 | 72;
50
- className?: string;
51
- 'data-testid'?: string;
52
- };
53
-
54
- // Reusable toggle button component
55
- export const ExpanderToggle = ({
56
- expanded,
57
- onToggle,
58
- size = 24,
59
- className,
60
- 'data-testid': testId,
61
- }: ExpanderToggleProps) => {
62
- const intl = useIntl();
63
-
64
- return (
65
- <IconButton
66
- size={size}
67
- priority="secondary"
68
- aria-label={intl.formatMessage(
69
- expanded ? messages.collapseAriaLabel : messages.expandAriaLabel,
70
- )}
71
- aria-expanded={expanded}
72
- className={clsx(
73
- 'wds-expander-toggle',
74
- { 'wds-expander-toggle--collapsed': !expanded },
75
- className,
76
- )}
77
- data-testid={testId}
78
- onClick={onToggle}
79
- >
80
- <ChevronUp />
81
- </IconButton>
82
- );
83
- };
@@ -1,79 +0,0 @@
1
- import { ReactNode } from 'react';
2
- import { GiftBox } from '@transferwise/icons';
3
-
4
- import AvatarView, { AvatarViewProps } from '../../avatarView';
5
- import Image from '../../image';
6
- import StatusIcon from '../../statusIcon';
7
- import { BadgeAssetsProps } from '../../badge';
8
- import { PrimitivePromptProps } from '../PrimitivePrompt';
9
-
10
- export type PromptMedia = {
11
- imgSrc?: string;
12
- avatar?: Pick<AvatarViewProps, 'imgSrc' | 'profileName' | 'profileType'> & {
13
- asset?: AvatarViewProps['children'];
14
- badge?: Pick<BadgeAssetsProps, 'flagCode'>;
15
- };
16
- 'aria-label'?: string;
17
- 'aria-hidden'?: boolean;
18
- };
19
-
20
- type RenderPromptMediaOptions = {
21
- media: PromptMedia;
22
- sentiment: PrimitivePromptProps['sentiment'];
23
- mediaId: string;
24
- imgClassName: string;
25
- };
26
-
27
- export function renderPromptMedia({
28
- media,
29
- sentiment,
30
- mediaId,
31
- imgClassName,
32
- }: RenderPromptMediaOptions): ReactNode {
33
- if (media?.imgSrc) {
34
- return (
35
- <Image
36
- id={mediaId}
37
- src={media.imgSrc}
38
- className={imgClassName}
39
- alt={media['aria-label'] ?? ''}
40
- />
41
- );
42
- }
43
- if (media?.avatar) {
44
- const badge = media.avatar.badge
45
- ? media.avatar.badge
46
- : sentiment === 'proposition'
47
- ? {}
48
- : { status: sentiment };
49
- return (
50
- <AvatarView
51
- {...media.avatar}
52
- badge={badge}
53
- aria-label={media['aria-label']}
54
- aria-hidden={media['aria-hidden']}
55
- id={mediaId}
56
- size={48}
57
- >
58
- {media.avatar.asset}
59
- </AvatarView>
60
- );
61
- }
62
- return sentiment === 'proposition' ? (
63
- <AvatarView
64
- id={mediaId}
65
- size={48}
66
- aria-label={media['aria-label']}
67
- aria-hidden={media['aria-hidden']}
68
- >
69
- <GiftBox />
70
- </AvatarView>
71
- ) : (
72
- <StatusIcon
73
- id={mediaId}
74
- size={48}
75
- sentiment={sentiment}
76
- iconLabel={media['aria-hidden'] ? null : media['aria-label']}
77
- />
78
- );
79
- }