@transferwise/components 0.0.0-experimental-af6dee0 → 0.0.0-experimental-199a021

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 (145) hide show
  1. package/build/avatarWrapper/AvatarWrapper.js +3 -4
  2. package/build/avatarWrapper/AvatarWrapper.js.map +1 -1
  3. package/build/avatarWrapper/AvatarWrapper.mjs +4 -5
  4. package/build/avatarWrapper/AvatarWrapper.mjs.map +1 -1
  5. package/build/button/LegacyButton.js.map +1 -1
  6. package/build/button/LegacyButton.mjs.map +1 -1
  7. package/build/common/hooks/useHasIntersected/useHasIntersected.js +6 -4
  8. package/build/common/hooks/useHasIntersected/useHasIntersected.js.map +1 -1
  9. package/build/common/hooks/useHasIntersected/useHasIntersected.mjs +6 -4
  10. package/build/common/hooks/useHasIntersected/useHasIntersected.mjs.map +1 -1
  11. package/build/common/liveRegion/LiveRegion.js +4 -1
  12. package/build/common/liveRegion/LiveRegion.js.map +1 -1
  13. package/build/common/liveRegion/LiveRegion.mjs +4 -1
  14. package/build/common/liveRegion/LiveRegion.mjs.map +1 -1
  15. package/build/dateInput/DateInput.js +10 -10
  16. package/build/dateInput/DateInput.js.map +1 -1
  17. package/build/dateInput/DateInput.mjs +10 -10
  18. package/build/dateInput/DateInput.mjs.map +1 -1
  19. package/build/dateLookup/monthCalendar/table/MonthCalendarTable.js +1 -1
  20. package/build/dateLookup/monthCalendar/table/MonthCalendarTable.js.map +1 -1
  21. package/build/dateLookup/monthCalendar/table/MonthCalendarTable.mjs +1 -1
  22. package/build/dateLookup/monthCalendar/table/MonthCalendarTable.mjs.map +1 -1
  23. package/build/dateLookup/yearCalendar/table/YearCalendarTable.js +1 -1
  24. package/build/dateLookup/yearCalendar/table/YearCalendarTable.js.map +1 -1
  25. package/build/dateLookup/yearCalendar/table/YearCalendarTable.mjs +1 -1
  26. package/build/dateLookup/yearCalendar/table/YearCalendarTable.mjs.map +1 -1
  27. package/build/expressiveMoneyInput/ExpressiveMoneyInput.js.map +1 -1
  28. package/build/expressiveMoneyInput/ExpressiveMoneyInput.mjs.map +1 -1
  29. package/build/expressiveMoneyInput/amountInput/AmountInput.js +17 -11
  30. package/build/expressiveMoneyInput/amountInput/AmountInput.js.map +1 -1
  31. package/build/expressiveMoneyInput/amountInput/AmountInput.mjs +18 -12
  32. package/build/expressiveMoneyInput/amountInput/AmountInput.mjs.map +1 -1
  33. package/build/expressiveMoneyInput/hooks/useInputStyle.js +8 -6
  34. package/build/expressiveMoneyInput/hooks/useInputStyle.js.map +1 -1
  35. package/build/expressiveMoneyInput/hooks/useInputStyle.mjs +9 -7
  36. package/build/expressiveMoneyInput/hooks/useInputStyle.mjs.map +1 -1
  37. package/build/header/Header.js +1 -1
  38. package/build/header/Header.js.map +1 -1
  39. package/build/header/Header.mjs +1 -1
  40. package/build/header/Header.mjs.map +1 -1
  41. package/build/inputs/SelectInput/BottomSheet/SelectInputBottomSheet.js.map +1 -1
  42. package/build/inputs/SelectInput/BottomSheet/SelectInputBottomSheet.mjs.map +1 -1
  43. package/build/inputs/SelectInput/Options/SelectInputOptions.js +31 -22
  44. package/build/inputs/SelectInput/Options/SelectInputOptions.js.map +1 -1
  45. package/build/inputs/SelectInput/Options/SelectInputOptions.mjs +32 -23
  46. package/build/inputs/SelectInput/Options/SelectInputOptions.mjs.map +1 -1
  47. package/build/inputs/SelectInput/Popover/SelectInputPopover.js.map +1 -1
  48. package/build/inputs/SelectInput/Popover/SelectInputPopover.mjs.map +1 -1
  49. package/build/inputs/SelectInput/SelectInput.js +8 -6
  50. package/build/inputs/SelectInput/SelectInput.js.map +1 -1
  51. package/build/inputs/SelectInput/SelectInput.mjs +9 -7
  52. package/build/inputs/SelectInput/SelectInput.mjs.map +1 -1
  53. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.js.map +1 -1
  54. package/build/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.mjs.map +1 -1
  55. package/build/loader/Loader.js +6 -16
  56. package/build/loader/Loader.js.map +1 -1
  57. package/build/loader/Loader.mjs +7 -17
  58. package/build/loader/Loader.mjs.map +1 -1
  59. package/build/main.css +4 -15
  60. package/build/nudge/Nudge.js +26 -15
  61. package/build/nudge/Nudge.js.map +1 -1
  62. package/build/nudge/Nudge.mjs +26 -15
  63. package/build/nudge/Nudge.mjs.map +1 -1
  64. package/build/phoneNumberInput/PhoneNumberInput.js +9 -12
  65. package/build/phoneNumberInput/PhoneNumberInput.js.map +1 -1
  66. package/build/phoneNumberInput/PhoneNumberInput.mjs +9 -12
  67. package/build/phoneNumberInput/PhoneNumberInput.mjs.map +1 -1
  68. package/build/promoCard/PromoCardGroup.js +34 -16
  69. package/build/promoCard/PromoCardGroup.js.map +1 -1
  70. package/build/promoCard/PromoCardGroup.mjs +35 -17
  71. package/build/promoCard/PromoCardGroup.mjs.map +1 -1
  72. package/build/segmentedControl/SegmentedControl.js +6 -1
  73. package/build/segmentedControl/SegmentedControl.js.map +1 -1
  74. package/build/segmentedControl/SegmentedControl.mjs +7 -2
  75. package/build/segmentedControl/SegmentedControl.mjs.map +1 -1
  76. package/build/styles/loader/Loader.css +4 -14
  77. package/build/styles/main.css +4 -15
  78. package/build/tabs/Tabs.js +1 -1
  79. package/build/tabs/Tabs.js.map +1 -1
  80. package/build/tabs/Tabs.mjs +1 -1
  81. package/build/tabs/Tabs.mjs.map +1 -1
  82. package/build/tooltip/Tooltip.js +6 -3
  83. package/build/tooltip/Tooltip.js.map +1 -1
  84. package/build/tooltip/Tooltip.mjs +6 -3
  85. package/build/tooltip/Tooltip.mjs.map +1 -1
  86. package/build/types/avatarWrapper/AvatarWrapper.d.ts.map +1 -1
  87. package/build/types/common/hooks/useHasIntersected/useHasIntersected.d.ts.map +1 -1
  88. package/build/types/common/liveRegion/LiveRegion.d.ts.map +1 -1
  89. package/build/types/dateLookup/monthCalendar/table/MonthCalendarTable.d.ts.map +1 -1
  90. package/build/types/expressiveMoneyInput/ExpressiveMoneyInput.d.ts.map +1 -1
  91. package/build/types/expressiveMoneyInput/amountInput/AmountInput.d.ts.map +1 -1
  92. package/build/types/expressiveMoneyInput/hooks/useInputStyle.d.ts +2 -2
  93. package/build/types/expressiveMoneyInput/hooks/useInputStyle.d.ts.map +1 -1
  94. package/build/types/expressiveMoneyInput/hooks/useSelectionRange.d.ts.map +1 -1
  95. package/build/types/inputs/SelectInput/BottomSheet/SelectInputBottomSheet.d.ts.map +1 -1
  96. package/build/types/inputs/SelectInput/Options/SelectInputOptions.d.ts.map +1 -1
  97. package/build/types/inputs/SelectInput/Popover/SelectInputPopover.d.ts.map +1 -1
  98. package/build/types/inputs/SelectInput/SelectInput.d.ts.map +1 -1
  99. package/build/types/loader/Loader.d.ts +1 -4
  100. package/build/types/loader/Loader.d.ts.map +1 -1
  101. package/build/types/nudge/Nudge.d.ts.map +1 -1
  102. package/build/types/phoneNumberInput/PhoneNumberInput.d.ts.map +1 -1
  103. package/build/types/promoCard/PromoCardGroup.d.ts.map +1 -1
  104. package/build/types/segmentedControl/SegmentedControl.d.ts.map +1 -1
  105. package/build/types/tooltip/Tooltip.d.ts.map +1 -1
  106. package/build/types/uploadInput/UploadInput.d.ts.map +1 -1
  107. package/build/uploadInput/UploadInput.js +29 -28
  108. package/build/uploadInput/UploadInput.js.map +1 -1
  109. package/build/uploadInput/UploadInput.mjs +29 -28
  110. package/build/uploadInput/UploadInput.mjs.map +1 -1
  111. package/package.json +3 -3
  112. package/src/avatarWrapper/AvatarWrapper.tsx +5 -6
  113. package/src/button/LegacyButton.tsx +1 -1
  114. package/src/button/_stories/Button.test.story.tsx +3 -3
  115. package/src/common/hooks/useContainerSize.test.tsx +1 -1
  116. package/src/common/hooks/useHasIntersected/useHasIntersected.ts +12 -4
  117. package/src/common/liveRegion/LiveRegion.tsx +5 -2
  118. package/src/dateInput/DateInput.tsx +10 -10
  119. package/src/dateLookup/monthCalendar/table/MonthCalendarTable.tsx +1 -5
  120. package/src/dateLookup/yearCalendar/table/YearCalendarTable.tsx +1 -1
  121. package/src/expressiveMoneyInput/ExpressiveMoneyInput.tsx +1 -1
  122. package/src/expressiveMoneyInput/amountInput/AmountInput.tsx +22 -15
  123. package/src/expressiveMoneyInput/hooks/useInputStyle.ts +20 -8
  124. package/src/expressiveMoneyInput/hooks/useSelectionRange.ts +2 -0
  125. package/src/header/Header.tsx +2 -2
  126. package/src/inputs/SelectInput/BottomSheet/SelectInputBottomSheet.tsx +4 -0
  127. package/src/inputs/SelectInput/Options/SelectInputOptions.tsx +39 -26
  128. package/src/inputs/SelectInput/Popover/SelectInputPopover.tsx +4 -0
  129. package/src/inputs/SelectInput/SelectInput.tsx +21 -15
  130. package/src/inputs/SelectInput/TriggerButton/SelectInputTriggerButton.tsx +1 -1
  131. package/src/loader/Loader.css +4 -14
  132. package/src/loader/Loader.less +88 -54
  133. package/src/loader/Loader.story.tsx +0 -4
  134. package/src/loader/Loader.test.tsx +5 -20
  135. package/src/loader/Loader.tsx +7 -18
  136. package/src/main.css +4 -15
  137. package/src/nudge/Nudge.tsx +22 -19
  138. package/src/phoneNumberInput/PhoneNumberInput.tsx +11 -13
  139. package/src/promoCard/PromoCard.story.tsx +3 -3
  140. package/src/promoCard/PromoCardGroup.tsx +39 -21
  141. package/src/segmentedControl/SegmentedControl.tsx +7 -1
  142. package/src/select/Select.story.tsx +1 -1
  143. package/src/tabs/Tabs.tsx +1 -1
  144. package/src/tooltip/Tooltip.tsx +3 -0
  145. package/src/uploadInput/UploadInput.tsx +28 -27
@@ -77,7 +77,7 @@ export function SelectInputOptions<T = string>({
77
77
  const intl = useIntl();
78
78
  const virtualiserHandlerRef = useRef<VirtualizerHandle>(null);
79
79
  const controllerRef = filterable ? searchInputRef : listboxRef;
80
- const [initialRender, setInitialRender] = useState(true);
80
+ const initialRenderRef = useRef(true);
81
81
 
82
82
  const needle = useMemo(() => {
83
83
  if (filterable) {
@@ -166,28 +166,39 @@ export function SelectInputOptions<T = string>({
166
166
  // Items shown once shall be kept mounted until the needle changes, otherwise
167
167
  // the scroll position may jump around inadvertently. Pattern adopted from:
168
168
  // https://inokawa.github.io/virtua/?path=/story/advanced-keep-offscreen-items--append-only
169
- const [mountedIndexes, setMountedIndexes] = useState<number[]>([]);
170
- const prevNeedleRef = useRef(needle);
169
+ const [virtualState, setVirtualState] = useState<{
170
+ needle: typeof needle;
171
+ length: number;
172
+ mountedIndexes: number[];
173
+ }>({
174
+ needle,
175
+ length: filteredItems.length,
176
+ mountedIndexes: [],
177
+ });
171
178
 
172
179
  useEffect(() => {
173
- const needleChanged = prevNeedleRef.current !== needle;
174
- prevNeedleRef.current = needle;
175
-
176
- if (needleChanged) {
177
- // Reset mounted indexes when search changes to avoid stale scroll positions
178
- setMountedIndexes([]);
179
- return;
180
- }
181
-
182
- // Ensure the 'End' key works as intended by keeping the last item mounted.
183
- // Skipped on needle change to prevent auto-scrolling on search.
184
- if (filteredItems.length > 0) {
185
- setMountedIndexes((prevMountedIndexes) => {
186
- // Create a new array with existing indexes plus the last item index
187
- return [...new Set([...prevMountedIndexes, filteredItems.length - 1])]; // Sorting is redundant by nature here
180
+ if (virtualState.needle !== needle || virtualState.length !== filteredItems.length) {
181
+ const needleChanged = virtualState.needle !== needle;
182
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- Syncing virtual scroll state with filtered items
183
+ setVirtualState({
184
+ needle,
185
+ length: filteredItems.length,
186
+ mountedIndexes: needleChanged
187
+ ? [] // Reset on needle change
188
+ : filteredItems.length > 0
189
+ ? [...new Set([...virtualState.mountedIndexes, filteredItems.length - 1])] // Add last index
190
+ : virtualState.mountedIndexes,
188
191
  });
189
192
  }
190
- }, [needle, filteredItems.length]);
193
+ }, [
194
+ needle,
195
+ filteredItems.length,
196
+ virtualState.needle,
197
+ virtualState.length,
198
+ virtualState.mountedIndexes,
199
+ ]);
200
+
201
+ const { mountedIndexes } = virtualState;
191
202
 
192
203
  const listboxContainerRef = useRef<HTMLDivElement>(null);
193
204
  useEffect(() => {
@@ -200,7 +211,7 @@ export function SelectInputOptions<T = string>({
200
211
  }, []);
201
212
 
202
213
  useEffect(() => {
203
- setInitialRender(false);
214
+ initialRenderRef.current = false;
204
215
  }, []);
205
216
 
206
217
  const showStatus = resultsEmpty;
@@ -251,7 +262,7 @@ export function SelectInputOptions<T = string>({
251
262
  className="np-select-input-options-container"
252
263
  onAriaActiveDescendantChange={(value: React.AriaAttributes['aria-activedescendant']) => {
253
264
  if (controllerRef.current != null) {
254
- if (!initialRender && value != null) {
265
+ if (!initialRenderRef.current && value != null) {
255
266
  controllerRef.current.setAttribute('aria-activedescendant', value);
256
267
  } else {
257
268
  controllerRef.current.removeAttribute('aria-activedescendant');
@@ -288,7 +299,7 @@ export function SelectInputOptions<T = string>({
288
299
  const inputValue = event.currentTarget.value;
289
300
 
290
301
  // Free up resources and ensure not to go out of bounds
291
- setMountedIndexes([]);
302
+ setVirtualState((prev) => ({ ...prev, mountedIndexes: [] }));
292
303
  onFilterChange(inputValue);
293
304
  }}
294
305
  onInput={(event) => {
@@ -358,7 +369,7 @@ export function SelectInputOptions<T = string>({
358
369
  virtualiserHandlerRef.current.viewportSize,
359
370
  );
360
371
 
361
- setMountedIndexes((prevMountedIndexes) => {
372
+ setVirtualState((prev) => {
362
373
  // Create an array of all indexes that should be visible
363
374
 
364
375
  const visibleIndexes = [];
@@ -368,9 +379,11 @@ export function SelectInputOptions<T = string>({
368
379
  }
369
380
 
370
381
  // Combine with previous indexes and sort
371
- return [...new Set([...prevMountedIndexes, ...visibleIndexes])].sort(
372
- (a, b) => a - b,
373
- );
382
+ const newMountedIndexes = [
383
+ ...new Set([...prev.mountedIndexes, ...visibleIndexes]),
384
+ ].sort((a, b) => a - b);
385
+
386
+ return { ...prev, mountedIndexes: newMountedIndexes };
374
387
  });
375
388
  }}
376
389
  >
@@ -85,10 +85,12 @@ export function SelectInputPopover({
85
85
  return (
86
86
  <>
87
87
  {open ? <PreventScroll /> : null}
88
+ {/* eslint-disable react-hooks/refs -- setReference is a callback ref from floating-ui, safe to pass during render */}
88
89
  {renderTrigger({
89
90
  ref: refs.setReference,
90
91
  getInteractionProps: getReferenceProps,
91
92
  })}
93
+ {/* eslint-enable react-hooks/refs */}
92
94
 
93
95
  <FloatingPortal>
94
96
  <ThemeProvider theme="personal" screenMode={theme === 'personal' ? screenMode : 'light'}>
@@ -104,6 +106,7 @@ export function SelectInputPopover({
104
106
  >
105
107
  <FocusScope>
106
108
  <FloatingFocusManager context={context}>
109
+ {/* eslint-disable react-hooks/refs -- setFloating is a callback ref from floating-ui, safe to pass during render */}
107
110
  <div
108
111
  key={floatingKey} // Force inner state invalidation on open
109
112
  ref={refs.setFloating}
@@ -114,6 +117,7 @@ export function SelectInputPopover({
114
117
  style={floatingStyles}
115
118
  {...getFloatingProps()}
116
119
  >
120
+ {/* eslint-enable react-hooks/refs */}
117
121
  <div
118
122
  className={clsx('np-popover-v2', title && 'np-popover-v2--has-title', {
119
123
  'np-popover-v2--padding-md': padding === 'md',
@@ -1,5 +1,5 @@
1
1
  import mergeProps from 'merge-props';
2
- import { useEffect, useRef, useState, useDeferredValue } from 'react';
2
+ import { useCallback, useEffect, useRef, useState, useDeferredValue } from 'react';
3
3
  import { Listbox as ListboxBase } from '@headlessui/react';
4
4
  import { useScreenSize } from '../../common/hooks/useScreenSize';
5
5
  import { Breakpoint } from '../../common/propsValues/breakpoint';
@@ -60,6 +60,7 @@ export function SelectInput<T = string, M extends boolean = false>({
60
60
  const initialized = useRef(false);
61
61
  const handleClose = useEffectEvent(onClose ?? (() => {}));
62
62
  const handleOpen = useEffectEvent(onOpen ?? (() => {}));
63
+
63
64
  useEffect(() => {
64
65
  if (initialized.current) {
65
66
  if (open) {
@@ -70,29 +71,34 @@ export function SelectInput<T = string, M extends boolean = false>({
70
71
  } else {
71
72
  initialized.current = true;
72
73
  }
73
- }, [handleClose, handleOpen, open]);
74
+ }, [open]);
74
75
 
75
76
  const [filterQuery, _setFilterQuery] = useState('');
76
77
  const deferredFilterQuery = useDeferredValue(filterQuery);
77
- const setFilterQuery = useEffectEvent((query: string) => {
78
- _setFilterQuery(query);
79
- if (query !== filterQuery) {
80
- onFilterChange({
81
- query,
82
- queryNormalized: query ? searchableString(query) : null,
83
- });
84
- }
85
- });
86
-
87
- const internalTriggerRef = useRef<HTMLButtonElement | null>(null);
78
+ const previousFilterQueryRef = useRef(filterQuery);
88
79
 
89
- const screenSm = useScreenSize(Breakpoint.SMALL);
90
- const OptionsOverlay = screenSm ? SelectInputPopover : SelectInputBottomSheet;
80
+ const setFilterQuery = useCallback(
81
+ (query: string) => {
82
+ _setFilterQuery(query);
83
+ if (query !== previousFilterQueryRef.current) {
84
+ onFilterChange({
85
+ query,
86
+ queryNormalized: query ? searchableString(query) : null,
87
+ });
88
+ previousFilterQueryRef.current = query;
89
+ }
90
+ },
91
+ [onFilterChange],
92
+ );
91
93
 
94
+ const internalTriggerRef = useRef<HTMLButtonElement | null>(null);
92
95
  const searchInputRef = useRef<HTMLInputElement>(null);
93
96
  const listboxRef = useRef<HTMLDivElement>(null);
94
97
  const controllerRef = filterable ? searchInputRef : listboxRef;
95
98
 
99
+ const screenSm = useScreenSize(Breakpoint.SMALL);
100
+ const OptionsOverlay = screenSm ? SelectInputPopover : SelectInputBottomSheet;
101
+
96
102
  /**
97
103
  * Attempts to resolve the `listbox` label
98
104
  * @see https://storybook.wise.design/?path=/docs/forms-selectinput-accessibility--docs#labelling
@@ -29,7 +29,7 @@ export function SelectInputTriggerButton<T extends SelectInputTriggerButtonEleme
29
29
  ref={ref}
30
30
  as={PolymorphicWithOverrides}
31
31
  role="combobox"
32
- __overrides={{ as, size, ...interactionProps } as Record<string, unknown>}
32
+ __overrides={{ as, size, ...interactionProps }}
33
33
  {...mergeProps({ onClick, onKeyDown }, restProps)}
34
34
  />
35
35
  );
@@ -8,16 +8,6 @@
8
8
  --coins-image: url("data:image/png;base64,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");
9
9
  }
10
10
  .tw-loader {
11
- display: flex;
12
- flex-direction: column;
13
- align-items: center;
14
- gap: 16px;
15
- gap: var(--size-16);
16
- width: 190px;
17
- text-align: center;
18
- word-break: break-word;
19
- }
20
- .tw-loader-asset {
21
11
  overflow: hidden;
22
12
  border-radius: 50%;
23
13
  backface-visibility: hidden;
@@ -33,10 +23,10 @@
33
23
  opacity: 0;
34
24
  transition: opacity 300ms cubic-bezier(0.24, 0, 0.3, 1);
35
25
  }
36
- .tw-loader-asset--visible {
26
+ .tw-loader--visible {
37
27
  opacity: 1;
38
28
  }
39
- .tw-loader-asset::before {
29
+ .tw-loader::before {
40
30
  content: "";
41
31
  display: block;
42
32
  width: 4.5rem;
@@ -55,14 +45,14 @@
55
45
  animation-delay: 0s;
56
46
  animation-iteration-count: infinite;
57
47
  }
58
- .tw-loader-asset--sm {
48
+ .tw-loader--sm {
59
49
  --coin-size: 3rem;
60
50
  --coin-edge-width-offset: translateX(0.275rem);
61
51
  --coin-edge-width-negative-offset: translateX(-0.275rem);
62
52
  --box-shadow-forwards: 0.025rem 0 0 var(--coin-colour), 0.05rem 0 0 var(--coin-colour), 0.075rem 0 0 var(--coin-colour), 0.1rem 0 0 var(--coin-colour), 0.125rem 0 0 var(--coin-colour), 0.15rem 0 0 var(--coin-colour), 0.175rem 0 0 var(--coin-colour), 0.2rem 0 0 var(--coin-colour), 0.225rem 0 0 var(--coin-colour), 0.25rem 0 0 var(--coin-colour), 0.275rem 0 0 var(--coin-colour), 0.3rem 0 0 var(--coin-colour), 0.325rem 0 0 var(--coin-colour), 0.35rem 0 0 var(--coin-colour), 0.375rem 0 0 var(--coin-colour), 0.4rem 0 0 var(--coin-colour), 0.425rem 0 0 var(--coin-colour), 0.45rem 0 0 var(--coin-colour), 0.475rem 0 0 var(--coin-colour);
63
53
  --box-shadow-backwards: -0.025rem 0 0 var(--coin-colour), -0.05rem 0 0 var(--coin-colour), -0.075rem 0 0 var(--coin-colour), -0.1rem 0 0 var(--coin-colour), -0.125rem 0 0 var(--coin-colour), -0.15rem 0 0 var(--coin-colour), -0.175rem 0 0 var(--coin-colour), -0.2rem 0 0 var(--coin-colour), -0.225rem 0 0 var(--coin-colour), -0.25rem 0 0 var(--coin-colour), -0.275rem 0 0 var(--coin-colour), -0.3rem 0 0 var(--coin-colour), -0.325rem 0 0 var(--coin-colour), -0.35rem 0 0 var(--coin-colour), -0.375rem 0 0 var(--coin-colour), -0.4rem 0 0 var(--coin-colour), -0.425rem 0 0 var(--coin-colour), -0.45rem 0 0 var(--coin-colour), -0.475rem 0 0 var(--coin-colour);
64
54
  }
65
- .tw-loader-asset--md {
55
+ .tw-loader--md {
66
56
  --coin-size: 4.5rem;
67
57
  --coin-edge-width-offset: translateX(0.375rem);
68
58
  --coin-edge-width-negative-offset: translateX(-0.375rem);
@@ -10,16 +10,6 @@
10
10
  }
11
11
 
12
12
  .tw-loader {
13
- display: flex;
14
- flex-direction: column;
15
- align-items: center;
16
- gap: var(--size-16);
17
- width: 190px;
18
- text-align: center;
19
- word-break: break-word;
20
- }
21
-
22
- .tw-loader-asset {
23
13
  overflow: hidden;
24
14
  border-radius: 50%;
25
15
  backface-visibility: hidden;
@@ -59,26 +49,44 @@
59
49
  --coin-edge-width-offset: translateX(0.275rem);
60
50
  --coin-edge-width-negative-offset: translateX(-0.275rem);
61
51
  --box-shadow-forwards:
62
- 0.025rem 0 0 var(--coin-colour), 0.05rem 0 0 var(--coin-colour),
63
- 0.075rem 0 0 var(--coin-colour), 0.1rem 0 0 var(--coin-colour),
64
- 0.125rem 0 0 var(--coin-colour), 0.15rem 0 0 var(--coin-colour),
65
- 0.175rem 0 0 var(--coin-colour), 0.2rem 0 0 var(--coin-colour),
66
- 0.225rem 0 0 var(--coin-colour), 0.25rem 0 0 var(--coin-colour),
67
- 0.275rem 0 0 var(--coin-colour), 0.3rem 0 0 var(--coin-colour),
68
- 0.325rem 0 0 var(--coin-colour), 0.35rem 0 0 var(--coin-colour),
69
- 0.375rem 0 0 var(--coin-colour), 0.4rem 0 0 var(--coin-colour),
70
- 0.425rem 0 0 var(--coin-colour), 0.45rem 0 0 var(--coin-colour),
52
+ 0.025rem 0 0 var(--coin-colour),
53
+ 0.05rem 0 0 var(--coin-colour),
54
+ 0.075rem 0 0 var(--coin-colour),
55
+ 0.1rem 0 0 var(--coin-colour),
56
+ 0.125rem 0 0 var(--coin-colour),
57
+ 0.15rem 0 0 var(--coin-colour),
58
+ 0.175rem 0 0 var(--coin-colour),
59
+ 0.2rem 0 0 var(--coin-colour),
60
+ 0.225rem 0 0 var(--coin-colour),
61
+ 0.25rem 0 0 var(--coin-colour),
62
+ 0.275rem 0 0 var(--coin-colour),
63
+ 0.3rem 0 0 var(--coin-colour),
64
+ 0.325rem 0 0 var(--coin-colour),
65
+ 0.35rem 0 0 var(--coin-colour),
66
+ 0.375rem 0 0 var(--coin-colour),
67
+ 0.4rem 0 0 var(--coin-colour),
68
+ 0.425rem 0 0 var(--coin-colour),
69
+ 0.45rem 0 0 var(--coin-colour),
71
70
  0.475rem 0 0 var(--coin-colour);
72
71
  --box-shadow-backwards:
73
- -0.025rem 0 0 var(--coin-colour), -0.05rem 0 0 var(--coin-colour),
74
- -0.075rem 0 0 var(--coin-colour), -0.1rem 0 0 var(--coin-colour),
75
- -0.125rem 0 0 var(--coin-colour), -0.15rem 0 0 var(--coin-colour),
76
- -0.175rem 0 0 var(--coin-colour), -0.2rem 0 0 var(--coin-colour),
77
- -0.225rem 0 0 var(--coin-colour), -0.25rem 0 0 var(--coin-colour),
78
- -0.275rem 0 0 var(--coin-colour), -0.3rem 0 0 var(--coin-colour),
79
- -0.325rem 0 0 var(--coin-colour), -0.35rem 0 0 var(--coin-colour),
80
- -0.375rem 0 0 var(--coin-colour), -0.4rem 0 0 var(--coin-colour),
81
- -0.425rem 0 0 var(--coin-colour), -0.45rem 0 0 var(--coin-colour),
72
+ -0.025rem 0 0 var(--coin-colour),
73
+ -0.05rem 0 0 var(--coin-colour),
74
+ -0.075rem 0 0 var(--coin-colour),
75
+ -0.1rem 0 0 var(--coin-colour),
76
+ -0.125rem 0 0 var(--coin-colour),
77
+ -0.15rem 0 0 var(--coin-colour),
78
+ -0.175rem 0 0 var(--coin-colour),
79
+ -0.2rem 0 0 var(--coin-colour),
80
+ -0.225rem 0 0 var(--coin-colour),
81
+ -0.25rem 0 0 var(--coin-colour),
82
+ -0.275rem 0 0 var(--coin-colour),
83
+ -0.3rem 0 0 var(--coin-colour),
84
+ -0.325rem 0 0 var(--coin-colour),
85
+ -0.35rem 0 0 var(--coin-colour),
86
+ -0.375rem 0 0 var(--coin-colour),
87
+ -0.4rem 0 0 var(--coin-colour),
88
+ -0.425rem 0 0 var(--coin-colour),
89
+ -0.45rem 0 0 var(--coin-colour),
82
90
  -0.475rem 0 0 var(--coin-colour);
83
91
  }
84
92
 
@@ -87,33 +95,59 @@
87
95
  --coin-edge-width-offset: translateX(0.375rem);
88
96
  --coin-edge-width-negative-offset: translateX(-0.375rem);
89
97
  --box-shadow-forwards:
90
- 0.025rem 0 0 var(--coin-colour), 0.05rem 0 0 var(--coin-colour),
91
- 0.075rem 0 0 var(--coin-colour), 0.1rem 0 0 var(--coin-colour),
92
- 0.125rem 0 0 var(--coin-colour), 0.15rem 0 0 var(--coin-colour),
93
- 0.175rem 0 0 var(--coin-colour), 0.2rem 0 0 var(--coin-colour),
94
- 0.225rem 0 0 var(--coin-colour), 0.25rem 0 0 var(--coin-colour),
95
- 0.275rem 0 0 var(--coin-colour), 0.3rem 0 0 var(--coin-colour),
96
- 0.325rem 0 0 var(--coin-colour), 0.35rem 0 0 var(--coin-colour),
97
- 0.375rem 0 0 var(--coin-colour), 0.4rem 0 0 var(--coin-colour),
98
- 0.425rem 0 0 var(--coin-colour), 0.45rem 0 0 var(--coin-colour),
99
- 0.475rem 0 0 var(--coin-colour), 0.5rem 0 0 var(--coin-colour),
100
- 0.525rem 0 0 var(--coin-colour), 0.55rem 0 0 var(--coin-colour),
101
- 0.575rem 0 0 var(--coin-colour), 0.6rem 0 0 var(--coin-colour),
102
- 0.625rem 0 0 var(--coin-colour), 0.65rem 0 0 var(--coin-colour);
98
+ 0.025rem 0 0 var(--coin-colour),
99
+ 0.05rem 0 0 var(--coin-colour),
100
+ 0.075rem 0 0 var(--coin-colour),
101
+ 0.1rem 0 0 var(--coin-colour),
102
+ 0.125rem 0 0 var(--coin-colour),
103
+ 0.15rem 0 0 var(--coin-colour),
104
+ 0.175rem 0 0 var(--coin-colour),
105
+ 0.2rem 0 0 var(--coin-colour),
106
+ 0.225rem 0 0 var(--coin-colour),
107
+ 0.25rem 0 0 var(--coin-colour),
108
+ 0.275rem 0 0 var(--coin-colour),
109
+ 0.3rem 0 0 var(--coin-colour),
110
+ 0.325rem 0 0 var(--coin-colour),
111
+ 0.35rem 0 0 var(--coin-colour),
112
+ 0.375rem 0 0 var(--coin-colour),
113
+ 0.4rem 0 0 var(--coin-colour),
114
+ 0.425rem 0 0 var(--coin-colour),
115
+ 0.45rem 0 0 var(--coin-colour),
116
+ 0.475rem 0 0 var(--coin-colour),
117
+ 0.5rem 0 0 var(--coin-colour),
118
+ 0.525rem 0 0 var(--coin-colour),
119
+ 0.55rem 0 0 var(--coin-colour),
120
+ 0.575rem 0 0 var(--coin-colour),
121
+ 0.6rem 0 0 var(--coin-colour),
122
+ 0.625rem 0 0 var(--coin-colour),
123
+ 0.65rem 0 0 var(--coin-colour);
103
124
  --box-shadow-backwards:
104
- -0.025rem 0 0 var(--coin-colour), -0.05rem 0 0 var(--coin-colour),
105
- -0.075rem 0 0 var(--coin-colour), -0.1rem 0 0 var(--coin-colour),
106
- -0.125rem 0 0 var(--coin-colour), -0.15rem 0 0 var(--coin-colour),
107
- -0.175rem 0 0 var(--coin-colour), -0.2rem 0 0 var(--coin-colour),
108
- -0.225rem 0 0 var(--coin-colour), -0.25rem 0 0 var(--coin-colour),
109
- -0.275rem 0 0 var(--coin-colour), -0.3rem 0 0 var(--coin-colour),
110
- -0.325rem 0 0 var(--coin-colour), -0.35rem 0 0 var(--coin-colour),
111
- -0.375rem 0 0 var(--coin-colour), -0.4rem 0 0 var(--coin-colour),
112
- -0.425rem 0 0 var(--coin-colour), -0.45rem 0 0 var(--coin-colour),
113
- -0.475rem 0 0 var(--coin-colour), -0.5rem 0 0 var(--coin-colour),
114
- -0.525rem 0 0 var(--coin-colour), -0.55rem 0 0 var(--coin-colour),
115
- -0.575rem 0 0 var(--coin-colour), -0.6rem 0 0 var(--coin-colour),
116
- -0.625rem 0 0 var(--coin-colour), -0.65rem 0 0 var(--coin-colour);
125
+ -0.025rem 0 0 var(--coin-colour),
126
+ -0.05rem 0 0 var(--coin-colour),
127
+ -0.075rem 0 0 var(--coin-colour),
128
+ -0.1rem 0 0 var(--coin-colour),
129
+ -0.125rem 0 0 var(--coin-colour),
130
+ -0.15rem 0 0 var(--coin-colour),
131
+ -0.175rem 0 0 var(--coin-colour),
132
+ -0.2rem 0 0 var(--coin-colour),
133
+ -0.225rem 0 0 var(--coin-colour),
134
+ -0.25rem 0 0 var(--coin-colour),
135
+ -0.275rem 0 0 var(--coin-colour),
136
+ -0.3rem 0 0 var(--coin-colour),
137
+ -0.325rem 0 0 var(--coin-colour),
138
+ -0.35rem 0 0 var(--coin-colour),
139
+ -0.375rem 0 0 var(--coin-colour),
140
+ -0.4rem 0 0 var(--coin-colour),
141
+ -0.425rem 0 0 var(--coin-colour),
142
+ -0.45rem 0 0 var(--coin-colour),
143
+ -0.475rem 0 0 var(--coin-colour),
144
+ -0.5rem 0 0 var(--coin-colour),
145
+ -0.525rem 0 0 var(--coin-colour),
146
+ -0.55rem 0 0 var(--coin-colour),
147
+ -0.575rem 0 0 var(--coin-colour),
148
+ -0.6rem 0 0 var(--coin-colour),
149
+ -0.625rem 0 0 var(--coin-colour),
150
+ -0.65rem 0 0 var(--coin-colour);
117
151
  }
118
152
  }
119
153
 
@@ -7,7 +7,6 @@ export default {
7
7
  title: 'Loading/Loader',
8
8
  args: {
9
9
  size: 'md',
10
- label: 'Sending your money',
11
10
  },
12
11
  argTypes: {
13
12
  size: {
@@ -16,9 +15,6 @@ export default {
16
15
  value: ['sm', 'md'],
17
16
  },
18
17
  },
19
- label: {
20
- control: 'text',
21
- },
22
18
  },
23
19
  } satisfies Meta<typeof Loader>;
24
20
 
@@ -9,7 +9,7 @@ describe('Loader', () => {
9
9
 
10
10
  it('tests default state', () => {
11
11
  const { container } = render(<Loader />);
12
- expect(container.querySelectorAll('div.tw-loader-asset--md')).toHaveLength(1);
12
+ expect(container.querySelectorAll('div.tw-loader--md')).toHaveLength(1);
13
13
  expect(container.querySelector('div[data-testid]')).toBeNull();
14
14
  });
15
15
 
@@ -19,48 +19,33 @@ describe('Loader', () => {
19
19
  expect(screen.getByTestId(dataTestId)).toBeInTheDocument();
20
20
  });
21
21
 
22
- it('renders label when displayInstantly is true', () => {
23
- render(<Loader label="Sending your money" displayInstantly />);
24
- expect(screen.getByText('Sending your money')).toBeInTheDocument();
25
- });
26
-
27
- it('does not render label before debounce completes', () => {
28
- render(<Loader label="Sending your money" />);
29
- expect(screen.queryByText('Sending your money')).not.toBeInTheDocument();
30
- });
31
-
32
- it('does not render label when label is not provided', () => {
33
- render(<Loader displayInstantly />);
34
- expect(screen.queryByText('Sending your money')).not.toBeInTheDocument();
35
- });
36
-
37
22
  it('shows renders the next best size of loader when using a deprecated size on the new theme', () => {
38
23
  const { container, rerender } = render(
39
24
  <ThemeProvider theme="personal">
40
25
  <Loader {...{ small: true }} />
41
26
  </ThemeProvider>,
42
27
  );
43
- expect(container.querySelectorAll('div.tw-loader-asset--sm')).toHaveLength(1);
28
+ expect(container.querySelectorAll('div.tw-loader--sm')).toHaveLength(1);
44
29
 
45
30
  rerender(
46
31
  <ThemeProvider theme="personal">
47
32
  <Loader size="xs" />
48
33
  </ThemeProvider>,
49
34
  );
50
- expect(container.querySelectorAll('div.tw-loader-asset--sm')).toHaveLength(1);
35
+ expect(container.querySelectorAll('div.tw-loader--sm')).toHaveLength(1);
51
36
 
52
37
  rerender(
53
38
  <ThemeProvider theme="personal">
54
39
  <Loader size="lg" />
55
40
  </ThemeProvider>,
56
41
  );
57
- expect(container.querySelectorAll('div.tw-loader-asset--md')).toHaveLength(1);
42
+ expect(container.querySelectorAll('div.tw-loader--md')).toHaveLength(1);
58
43
 
59
44
  rerender(
60
45
  <ThemeProvider theme="personal">
61
46
  <Loader size="xl" />
62
47
  </ThemeProvider>,
63
48
  );
64
- expect(container.querySelectorAll('div.tw-loader-asset--md')).toHaveLength(1);
49
+ expect(container.querySelectorAll('div.tw-loader--md')).toHaveLength(1);
65
50
  });
66
51
  });
@@ -1,10 +1,8 @@
1
1
  import { useTheme } from '@wise/components-theming';
2
2
  import { clsx } from 'clsx';
3
- import { ReactNode, useEffect, useState } from 'react';
3
+ import { useEffect, useState } from 'react';
4
4
 
5
- import Body from '../body';
6
5
  import { Size, SizeExtraSmall, SizeSmall, SizeMedium, SizeLarge, SizeExtraLarge } from '../common';
7
- import { Typography } from '../common/propsValues/typography';
8
6
 
9
7
  // TODO: We gracefully deprecated xs, lg and xl -- remove these as part of a future breaking change to this component
10
8
  type DeprecatedSize = SizeExtraSmall | SizeLarge | SizeExtraLarge;
@@ -21,8 +19,6 @@ export type LoaderProps = {
21
19
  size?: SizeType | DeprecatedSize;
22
20
  /** @default false */
23
21
  displayInstantly?: boolean;
24
- /** Optional label displayed below the loader */
25
- label?: ReactNode;
26
22
  // TODO: refactor in favor of prop from `CommonProps` type
27
23
  /** @default {} */
28
24
  classNames?: Record<string, string>;
@@ -43,7 +39,6 @@ const Loader = ({
43
39
  small = false,
44
40
  size = Size.MEDIUM,
45
41
  displayInstantly = false,
46
- label,
47
42
  classNames = {},
48
43
  ...restProps
49
44
  }: LoaderProps) => {
@@ -82,18 +77,12 @@ const Loader = ({
82
77
  }
83
78
 
84
79
  return (
85
- <div className={style('tw-loader')} data-testid={restProps['data-testid']}>
86
- <div
87
- className={clsx(style('tw-loader-asset'), style(`tw-loader-asset--${supportedSize}`), {
88
- 'tw-loader-asset--visible': hasDebounced,
89
- })}
90
- />
91
- {label && hasDebounced && (
92
- <Body type={Typography.BODY_LARGE_BOLD} as="span" className={style('text-secondary')}>
93
- {label}
94
- </Body>
95
- )}
96
- </div>
80
+ <div
81
+ className={clsx(style('tw-loader'), style(`tw-loader--${supportedSize}`), {
82
+ 'tw-loader--visible': hasDebounced,
83
+ })}
84
+ data-testid={restProps['data-testid']}
85
+ />
97
86
  );
98
87
  };
99
88