@transferwise/components 46.136.1 → 46.137.1

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 (264) hide show
  1. package/build/common/hooks/useContainerSize.js +30 -0
  2. package/build/common/hooks/useContainerSize.js.map +1 -0
  3. package/build/common/hooks/useContainerSize.mjs +28 -0
  4. package/build/common/hooks/useContainerSize.mjs.map +1 -0
  5. package/build/common/hooks/useResizeObserver.js +3 -3
  6. package/build/common/hooks/useResizeObserver.js.map +1 -1
  7. package/build/common/hooks/useResizeObserver.mjs +3 -3
  8. package/build/common/hooks/useResizeObserver.mjs.map +1 -1
  9. package/build/criticalBanner/CriticalCommsBanner.js +3 -0
  10. package/build/criticalBanner/CriticalCommsBanner.js.map +1 -1
  11. package/build/criticalBanner/CriticalCommsBanner.mjs +3 -0
  12. package/build/criticalBanner/CriticalCommsBanner.mjs.map +1 -1
  13. package/build/field/Field.js +3 -2
  14. package/build/field/Field.js.map +1 -1
  15. package/build/field/Field.mjs +3 -2
  16. package/build/field/Field.mjs.map +1 -1
  17. package/build/i18n/cs.json +2 -0
  18. package/build/i18n/cs.json.js +2 -0
  19. package/build/i18n/cs.json.js.map +1 -1
  20. package/build/i18n/cs.json.mjs +2 -0
  21. package/build/i18n/cs.json.mjs.map +1 -1
  22. package/build/i18n/de.json +2 -0
  23. package/build/i18n/de.json.js +2 -0
  24. package/build/i18n/de.json.js.map +1 -1
  25. package/build/i18n/de.json.mjs +2 -0
  26. package/build/i18n/de.json.mjs.map +1 -1
  27. package/build/i18n/en.json +2 -0
  28. package/build/i18n/en.json.js +2 -0
  29. package/build/i18n/en.json.js.map +1 -1
  30. package/build/i18n/en.json.mjs +2 -0
  31. package/build/i18n/en.json.mjs.map +1 -1
  32. package/build/i18n/es.json +2 -0
  33. package/build/i18n/es.json.js +2 -0
  34. package/build/i18n/es.json.js.map +1 -1
  35. package/build/i18n/es.json.mjs +2 -0
  36. package/build/i18n/es.json.mjs.map +1 -1
  37. package/build/i18n/fr.json +2 -0
  38. package/build/i18n/fr.json.js +2 -0
  39. package/build/i18n/fr.json.js.map +1 -1
  40. package/build/i18n/fr.json.mjs +2 -0
  41. package/build/i18n/fr.json.mjs.map +1 -1
  42. package/build/i18n/hu.json +2 -0
  43. package/build/i18n/hu.json.js +2 -0
  44. package/build/i18n/hu.json.js.map +1 -1
  45. package/build/i18n/hu.json.mjs +2 -0
  46. package/build/i18n/hu.json.mjs.map +1 -1
  47. package/build/i18n/id.json +2 -0
  48. package/build/i18n/id.json.js +2 -0
  49. package/build/i18n/id.json.js.map +1 -1
  50. package/build/i18n/id.json.mjs +2 -0
  51. package/build/i18n/id.json.mjs.map +1 -1
  52. package/build/i18n/it.json +2 -0
  53. package/build/i18n/it.json.js +2 -0
  54. package/build/i18n/it.json.js.map +1 -1
  55. package/build/i18n/it.json.mjs +2 -0
  56. package/build/i18n/it.json.mjs.map +1 -1
  57. package/build/i18n/ja.json +2 -0
  58. package/build/i18n/ja.json.js +2 -0
  59. package/build/i18n/ja.json.js.map +1 -1
  60. package/build/i18n/ja.json.mjs +2 -0
  61. package/build/i18n/ja.json.mjs.map +1 -1
  62. package/build/i18n/nl.json +2 -0
  63. package/build/i18n/nl.json.js +2 -0
  64. package/build/i18n/nl.json.js.map +1 -1
  65. package/build/i18n/nl.json.mjs +2 -0
  66. package/build/i18n/nl.json.mjs.map +1 -1
  67. package/build/i18n/pl.json +2 -0
  68. package/build/i18n/pl.json.js +2 -0
  69. package/build/i18n/pl.json.js.map +1 -1
  70. package/build/i18n/pl.json.mjs +2 -0
  71. package/build/i18n/pl.json.mjs.map +1 -1
  72. package/build/i18n/pt.json +2 -0
  73. package/build/i18n/pt.json.js +2 -0
  74. package/build/i18n/pt.json.js.map +1 -1
  75. package/build/i18n/pt.json.mjs +2 -0
  76. package/build/i18n/pt.json.mjs.map +1 -1
  77. package/build/i18n/ro.json +2 -0
  78. package/build/i18n/ro.json.js +2 -0
  79. package/build/i18n/ro.json.js.map +1 -1
  80. package/build/i18n/ro.json.mjs +2 -0
  81. package/build/i18n/ro.json.mjs.map +1 -1
  82. package/build/i18n/ru.json +2 -0
  83. package/build/i18n/ru.json.js +2 -0
  84. package/build/i18n/ru.json.js.map +1 -1
  85. package/build/i18n/ru.json.mjs +2 -0
  86. package/build/i18n/ru.json.mjs.map +1 -1
  87. package/build/i18n/th.json +2 -0
  88. package/build/i18n/th.json.js +2 -0
  89. package/build/i18n/th.json.js.map +1 -1
  90. package/build/i18n/th.json.mjs +2 -0
  91. package/build/i18n/th.json.mjs.map +1 -1
  92. package/build/i18n/tr.json +2 -0
  93. package/build/i18n/tr.json.js +2 -0
  94. package/build/i18n/tr.json.js.map +1 -1
  95. package/build/i18n/tr.json.mjs +2 -0
  96. package/build/i18n/tr.json.mjs.map +1 -1
  97. package/build/i18n/zh-CN.json +2 -0
  98. package/build/i18n/zh-CN.json.js +2 -0
  99. package/build/i18n/zh-CN.json.js.map +1 -1
  100. package/build/i18n/zh-CN.json.mjs +2 -0
  101. package/build/i18n/zh-CN.json.mjs.map +1 -1
  102. package/build/i18n/zh-HK.json +2 -0
  103. package/build/i18n/zh-HK.json.js +2 -0
  104. package/build/i18n/zh-HK.json.js.map +1 -1
  105. package/build/i18n/zh-HK.json.mjs +2 -0
  106. package/build/i18n/zh-HK.json.mjs.map +1 -1
  107. package/build/index.js +2 -0
  108. package/build/index.js.map +1 -1
  109. package/build/index.mjs +1 -0
  110. package/build/index.mjs.map +1 -1
  111. package/build/listItem/Prompt/ListItemPrompt.js +3 -2
  112. package/build/listItem/Prompt/ListItemPrompt.js.map +1 -1
  113. package/build/listItem/Prompt/ListItemPrompt.mjs +3 -2
  114. package/build/listItem/Prompt/ListItemPrompt.mjs.map +1 -1
  115. package/build/logo/Logo.js +77 -25
  116. package/build/logo/Logo.js.map +1 -1
  117. package/build/logo/Logo.mjs +79 -27
  118. package/build/logo/Logo.mjs.map +1 -1
  119. package/build/logo/logo-assets.js +68 -97
  120. package/build/logo/logo-assets.js.map +1 -1
  121. package/build/logo/logo-assets.mjs +62 -90
  122. package/build/logo/logo-assets.mjs.map +1 -1
  123. package/build/main.css +225 -59
  124. package/build/prompt/ActionPrompt/ActionPrompt.js +8 -40
  125. package/build/prompt/ActionPrompt/ActionPrompt.js.map +1 -1
  126. package/build/prompt/ActionPrompt/ActionPrompt.mjs +8 -40
  127. package/build/prompt/ActionPrompt/ActionPrompt.mjs.map +1 -1
  128. package/build/prompt/CriticalBanner/CriticalBanner.js +143 -0
  129. package/build/prompt/CriticalBanner/CriticalBanner.js.map +1 -0
  130. package/build/prompt/CriticalBanner/CriticalBanner.mjs +141 -0
  131. package/build/prompt/CriticalBanner/CriticalBanner.mjs.map +1 -0
  132. package/build/prompt/CriticalBanner/helpers.js +29 -0
  133. package/build/prompt/CriticalBanner/helpers.js.map +1 -0
  134. package/build/prompt/CriticalBanner/helpers.mjs +26 -0
  135. package/build/prompt/CriticalBanner/helpers.mjs.map +1 -0
  136. package/build/prompt/InfoPrompt/InfoPrompt.js +3 -2
  137. package/build/prompt/InfoPrompt/InfoPrompt.js.map +1 -1
  138. package/build/prompt/InfoPrompt/InfoPrompt.mjs +3 -2
  139. package/build/prompt/InfoPrompt/InfoPrompt.mjs.map +1 -1
  140. package/build/prompt/PrimitivePrompt/PrimitivePrompt.js +11 -4
  141. package/build/prompt/PrimitivePrompt/PrimitivePrompt.js.map +1 -1
  142. package/build/prompt/PrimitivePrompt/PrimitivePrompt.mjs +11 -4
  143. package/build/prompt/PrimitivePrompt/PrimitivePrompt.mjs.map +1 -1
  144. package/build/prompt/common/Expander/Expander.js +35 -0
  145. package/build/prompt/common/Expander/Expander.js.map +1 -0
  146. package/build/prompt/common/Expander/Expander.messages.js +17 -0
  147. package/build/prompt/common/Expander/Expander.messages.js.map +1 -0
  148. package/build/prompt/common/Expander/Expander.messages.mjs +13 -0
  149. package/build/prompt/common/Expander/Expander.messages.mjs.map +1 -0
  150. package/build/prompt/common/Expander/Expander.mjs +33 -0
  151. package/build/prompt/common/Expander/Expander.mjs.map +1 -0
  152. package/build/prompt/helpers/promptMedia.js +52 -0
  153. package/build/prompt/helpers/promptMedia.js.map +1 -0
  154. package/build/prompt/helpers/promptMedia.mjs +50 -0
  155. package/build/prompt/helpers/promptMedia.mjs.map +1 -0
  156. package/build/styles/css/neptune.css +0 -1
  157. package/build/styles/logo/Logo.css +3 -23
  158. package/build/styles/main.css +225 -59
  159. package/build/styles/prompt/CriticalBanner/CriticalBanner.css +134 -0
  160. package/build/styles/prompt/CriticalBanner/CriticalBanner.vars.css +0 -0
  161. package/build/styles/prompt/InfoPrompt/InfoPrompt.css +24 -0
  162. package/build/styles/prompt/common/Expander/Expander.css +8 -0
  163. package/build/styles/styles/less/neptune.css +0 -1
  164. package/build/typeahead/Typeahead.js +3 -2
  165. package/build/typeahead/Typeahead.js.map +1 -1
  166. package/build/typeahead/Typeahead.mjs +3 -2
  167. package/build/typeahead/Typeahead.mjs.map +1 -1
  168. package/build/types/common/hooks/useContainerSize.d.ts +14 -0
  169. package/build/types/common/hooks/useContainerSize.d.ts.map +1 -0
  170. package/build/types/common/hooks/useResizeObserver.d.ts +1 -1
  171. package/build/types/common/hooks/useResizeObserver.d.ts.map +1 -1
  172. package/build/types/criticalBanner/CriticalCommsBanner.d.ts +3 -0
  173. package/build/types/criticalBanner/CriticalCommsBanner.d.ts.map +1 -1
  174. package/build/types/index.d.ts +2 -2
  175. package/build/types/index.d.ts.map +1 -1
  176. package/build/types/logo/Logo.d.ts +33 -1
  177. package/build/types/logo/Logo.d.ts.map +1 -1
  178. package/build/types/logo/logo-assets.d.ts +33 -9
  179. package/build/types/logo/logo-assets.d.ts.map +1 -1
  180. package/build/types/prompt/ActionPrompt/ActionPrompt.d.ts +2 -11
  181. package/build/types/prompt/ActionPrompt/ActionPrompt.d.ts.map +1 -1
  182. package/build/types/prompt/CriticalBanner/CriticalBanner.d.ts +39 -0
  183. package/build/types/prompt/CriticalBanner/CriticalBanner.d.ts.map +1 -0
  184. package/build/types/prompt/CriticalBanner/helpers.d.ts +18 -0
  185. package/build/types/prompt/CriticalBanner/helpers.d.ts.map +1 -0
  186. package/build/types/prompt/CriticalBanner/index.d.ts +3 -0
  187. package/build/types/prompt/CriticalBanner/index.d.ts.map +1 -0
  188. package/build/types/prompt/InfoPrompt/InfoPrompt.d.ts.map +1 -1
  189. package/build/types/prompt/PrimitivePrompt/PrimitivePrompt.d.ts +35 -3
  190. package/build/types/prompt/PrimitivePrompt/PrimitivePrompt.d.ts.map +1 -1
  191. package/build/types/prompt/common/Expander/Expander.d.ts +20 -0
  192. package/build/types/prompt/common/Expander/Expander.d.ts.map +1 -0
  193. package/build/types/prompt/common/Expander/Expander.messages.d.ts +14 -0
  194. package/build/types/prompt/common/Expander/Expander.messages.d.ts.map +1 -0
  195. package/build/types/prompt/helpers/promptMedia.d.ts +22 -0
  196. package/build/types/prompt/helpers/promptMedia.d.ts.map +1 -0
  197. package/build/types/prompt/index.d.ts +2 -0
  198. package/build/types/prompt/index.d.ts.map +1 -1
  199. package/build/types/test-utils/index.d.ts +4 -0
  200. package/build/types/test-utils/index.d.ts.map +1 -1
  201. package/package.json +22 -18
  202. package/src/alert/Alert.story.tsx +30 -1
  203. package/src/avatarWrapper/AvatarWrapper.story.tsx +1 -1
  204. package/src/button/_stories/Button.story.tsx +11 -0
  205. package/src/common/hooks/useContainerSize.test.tsx +125 -0
  206. package/src/common/hooks/useContainerSize.ts +32 -0
  207. package/src/common/hooks/useResizeObserver.ts +3 -2
  208. package/src/criticalBanner/CriticalCommsBanner.story.tsx +4 -0
  209. package/src/criticalBanner/CriticalCommsBanner.test.story.tsx +1 -1
  210. package/src/criticalBanner/CriticalCommsBanner.tsx +3 -0
  211. package/src/i18n/cs.json +2 -0
  212. package/src/i18n/de.json +2 -0
  213. package/src/i18n/en.json +2 -0
  214. package/src/i18n/es.json +2 -0
  215. package/src/i18n/fr.json +2 -0
  216. package/src/i18n/hu.json +2 -0
  217. package/src/i18n/id.json +2 -0
  218. package/src/i18n/it.json +2 -0
  219. package/src/i18n/ja.json +2 -0
  220. package/src/i18n/nl.json +2 -0
  221. package/src/i18n/pl.json +2 -0
  222. package/src/i18n/pt.json +2 -0
  223. package/src/i18n/ro.json +2 -0
  224. package/src/i18n/ru.json +2 -0
  225. package/src/i18n/th.json +2 -0
  226. package/src/i18n/tr.json +2 -0
  227. package/src/i18n/zh-CN.json +2 -0
  228. package/src/i18n/zh-HK.json +2 -0
  229. package/src/index.ts +2 -2
  230. package/src/logo/Logo.css +3 -23
  231. package/src/logo/Logo.less +3 -29
  232. package/src/logo/Logo.story.tsx +117 -89
  233. package/src/logo/Logo.test.story.tsx +15 -24
  234. package/src/logo/Logo.tsx +90 -28
  235. package/src/logo/logo-assets.tsx +36 -92
  236. package/src/main.css +225 -59
  237. package/src/main.less +3 -1
  238. package/src/prompt/ActionPrompt/ActionPrompt.tsx +9 -62
  239. package/src/prompt/CriticalBanner/CriticalBanner.accessibility.docs.mdx +113 -0
  240. package/src/prompt/CriticalBanner/CriticalBanner.css +134 -0
  241. package/src/prompt/CriticalBanner/CriticalBanner.less +155 -0
  242. package/src/prompt/CriticalBanner/CriticalBanner.story.tsx +635 -0
  243. package/src/prompt/CriticalBanner/CriticalBanner.test.story.tsx +422 -0
  244. package/src/prompt/CriticalBanner/CriticalBanner.tsx +179 -0
  245. package/src/prompt/CriticalBanner/CriticalBanner.vars.css +0 -0
  246. package/src/prompt/CriticalBanner/CriticalBanner.vars.less +6 -0
  247. package/src/prompt/CriticalBanner/helpers.ts +39 -0
  248. package/src/prompt/CriticalBanner/index.ts +2 -0
  249. package/src/prompt/InfoPrompt/InfoPrompt.css +24 -0
  250. package/src/prompt/InfoPrompt/InfoPrompt.less +23 -0
  251. package/src/prompt/InfoPrompt/InfoPrompt.tsx +5 -1
  252. package/src/prompt/PrimitivePrompt/PrimitivePrompt.tsx +56 -40
  253. package/src/prompt/common/Expander/Expander.css +8 -0
  254. package/src/prompt/common/Expander/Expander.less +9 -0
  255. package/src/prompt/common/Expander/Expander.messages.ts +14 -0
  256. package/src/prompt/common/Expander/Expander.test.tsx +167 -0
  257. package/src/prompt/common/Expander/Expander.tsx +83 -0
  258. package/src/prompt/helpers/promptMedia.tsx +79 -0
  259. package/src/prompt/index.ts +4 -0
  260. package/src/radio/Radio.story.tsx +1 -1
  261. package/src/section/Section.story.tsx +2 -8
  262. package/src/sentimentSurface/SentimentSurface.story.tsx +43 -17
  263. package/src/statusIcon/StatusIcon.test.tsx +0 -2
  264. package/src/styles/less/neptune.css +0 -1
@@ -1,7 +1,8 @@
1
- import { useState } from 'react';
1
+ import React, { useState } from 'react';
2
2
  import { Meta, StoryObj } from '@storybook/react-webpack5';
3
3
  import { action } from 'storybook/actions';
4
4
  import { ClockBorderless } from '@transferwise/icons';
5
+ import { createSandboxStory } from '../../.storybook/components/sandbox/SandboxEditor';
5
6
 
6
7
  import { lorem40 } from '../test-utils';
7
8
  import { Sentiment, Status } from '../common';
@@ -48,6 +49,34 @@ type Story = StoryObj<typeof Alert>;
48
49
 
49
50
  export const Basic: Story = {};
50
51
 
52
+ export const Sandbox = createSandboxStory({
53
+ code: `const App = () => {
54
+ const [dismissed, setDismissed] = React.useState(false);
55
+
56
+ if (dismissed) {
57
+ return (
58
+ <Button v2 size="md" onClick={() => setDismissed(false)}>
59
+ Show alert again
60
+ </Button>
61
+ );
62
+ }
63
+
64
+ return (
65
+ <Alert
66
+ action={{
67
+ 'aria-label': 'Learn more',
68
+ text: 'Learn more',
69
+ href: '#',
70
+ }}
71
+ message="Payments sent to your bank details **today** might not arrive in time for the holidays."
72
+ onDismiss={() => setDismissed(true)}
73
+ type="positive"
74
+ />
75
+ );
76
+ };`,
77
+ scope: { Alert, Button, React },
78
+ });
79
+
51
80
  export const Variants: Story = {
52
81
  render: ({ message }) => {
53
82
  const variants = [
@@ -81,7 +81,7 @@ export const All: Story = {
81
81
  <div>
82
82
  <AvatarWrapper
83
83
  badgeStatusIcon={Sentiment.NEGATIVE}
84
- url="https://wise.com/web-art/assets/flags/hrk.svg"
84
+ url="https://wise.com/web-art/assets/flags/hr.svg"
85
85
  profileType={ProfileType.BUSINESS}
86
86
  avatarProps={avatarProps}
87
87
  />
@@ -1,6 +1,10 @@
1
1
  import { Meta, StoryObj } from '@storybook/react-webpack5';
2
2
  import { fn } from 'storybook/test';
3
3
  import { Freeze, ArrowRight, ChevronRight } from '@transferwise/icons';
4
+ import {
5
+ createSandboxStory,
6
+ globalScope,
7
+ } from '../../../.storybook/components/sandbox/SandboxEditor';
4
8
  import { Flag } from '@wise/art';
5
9
  import { lorem10, lorem20 } from '../../test-utils';
6
10
  import SentimentSurface from '../../sentimentSurface';
@@ -317,6 +321,13 @@ export const Playground: StoryObj<PreviewStoryArgs> = {
317
321
  },
318
322
  };
319
323
 
324
+ export const Sandbox = createSandboxStory({
325
+ code: `<Button v2 size="md" onClick={console.log}>
326
+ Click me
327
+ </Button>`,
328
+ scope: globalScope,
329
+ });
330
+
320
331
  /**
321
332
  * There are two different types of button – default and negative – designed to emphasise the nature of the action. <br />
322
333
  * **NB:** Sentiment only applies to `primary` and `secondary` priorities. <br />
@@ -0,0 +1,125 @@
1
+ import React, { act } from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+
4
+ import { mockResizeObserver } from '../../test-utils/window-mock';
5
+
6
+ import { useContainerSize } from './useContainerSize';
7
+
8
+ mockResizeObserver();
9
+
10
+ describe('useContainerSize', () => {
11
+ let resizeObserverCallback: ResizeObserverCallback | null = null;
12
+ const OriginalResizeObserver = global.ResizeObserver;
13
+
14
+ beforeEach(() => {
15
+ resizeObserverCallback = null;
16
+
17
+ // Capture the ResizeObserver callback for testing
18
+ global.ResizeObserver = jest.fn().mockImplementation((callback: ResizeObserverCallback) => {
19
+ resizeObserverCallback = callback;
20
+ const instance = new OriginalResizeObserver(callback);
21
+ return instance;
22
+ }) as unknown as typeof ResizeObserver;
23
+ });
24
+
25
+ afterEach(() => {
26
+ global.ResizeObserver = OriginalResizeObserver;
27
+ });
28
+
29
+ // Helper to create a test component
30
+ function TestComponent({
31
+ breakpoint,
32
+ onStateChange,
33
+ }: {
34
+ breakpoint: number;
35
+ onStateChange: (state: boolean) => void;
36
+ }) {
37
+ const [ref, isAboveBreakpoint] = useContainerSize(breakpoint);
38
+
39
+ // Call the callback whenever state changes
40
+ React.useEffect(() => {
41
+ onStateChange(isAboveBreakpoint);
42
+ }, [isAboveBreakpoint, onStateChange]);
43
+
44
+ return (
45
+ <div ref={ref} data-testid="container">
46
+ Test
47
+ </div>
48
+ );
49
+ }
50
+
51
+ // Helper to simulate container resize
52
+ function simulateResize(width: number, options?: { noBorderBoxSize?: boolean }) {
53
+ const container = screen.getByTestId('container');
54
+
55
+ act(() => {
56
+ if (resizeObserverCallback) {
57
+ const entry = {
58
+ target: container,
59
+ borderBoxSize: options?.noBorderBoxSize
60
+ ? undefined
61
+ : [{ inlineSize: width, blockSize: 100 }],
62
+ contentRect: {
63
+ width,
64
+ height: 100,
65
+ x: 0,
66
+ y: 0,
67
+ top: 0,
68
+ right: width,
69
+ bottom: 100,
70
+ left: 0,
71
+ toJSON: () => ({}),
72
+ },
73
+ contentBoxSize: [{ inlineSize: width, blockSize: 100 }],
74
+ devicePixelContentBoxSize: [{ inlineSize: width, blockSize: 100 }],
75
+ } as ResizeObserverEntry;
76
+
77
+ resizeObserverCallback([entry], {} as ResizeObserver);
78
+ }
79
+ });
80
+ }
81
+
82
+ it('returns initial state as false', () => {
83
+ const onStateChange = jest.fn();
84
+ render(<TestComponent breakpoint={480} onStateChange={onStateChange} />);
85
+
86
+ // Initial call with false
87
+ expect(onStateChange).toHaveBeenCalledWith(false);
88
+ });
89
+
90
+ it('updates to true when container width is above breakpoint', () => {
91
+ const onStateChange = jest.fn();
92
+ render(<TestComponent breakpoint={480} onStateChange={onStateChange} />);
93
+
94
+ simulateResize(600);
95
+ expect(onStateChange).toHaveBeenCalledWith(true);
96
+ });
97
+
98
+ it('remains false when container width is below breakpoint', () => {
99
+ const onStateChange = jest.fn();
100
+ render(<TestComponent breakpoint={480} onStateChange={onStateChange} />);
101
+
102
+ simulateResize(400);
103
+ expect(onStateChange).toHaveBeenCalledWith(false);
104
+ expect(onStateChange).not.toHaveBeenCalledWith(true);
105
+ });
106
+
107
+ it('returns true when container width equals breakpoint', () => {
108
+ const onStateChange = jest.fn();
109
+ render(<TestComponent breakpoint={480} onStateChange={onStateChange} />);
110
+
111
+ simulateResize(480);
112
+ expect(onStateChange).toHaveBeenCalledWith(true);
113
+ });
114
+
115
+ it('updates state when container crosses breakpoint from below to above', () => {
116
+ const onStateChange = jest.fn();
117
+ render(<TestComponent breakpoint={480} onStateChange={onStateChange} />);
118
+
119
+ simulateResize(400);
120
+ expect(onStateChange).toHaveBeenCalledWith(false);
121
+
122
+ simulateResize(600);
123
+ expect(onStateChange).toHaveBeenCalledWith(true);
124
+ });
125
+ });
@@ -0,0 +1,32 @@
1
+ import { useRef, useState } from 'react';
2
+
3
+ import { useResizeObserver } from './useResizeObserver';
4
+
5
+ /**
6
+ * Hook that returns a ref and a boolean indicating if the container
7
+ * has a width >= the specified breakpoint.
8
+ *
9
+ * Useful for synchronizing React state with CSS container queries.
10
+ *
11
+ * Uses content-box measurements to match CSS container query behavior
12
+ * (excludes padding and border).
13
+ *
14
+ * @param breakpoint - Minimum width in pixels
15
+ * @returns [ref, isAboveBreakpoint] tuple
16
+ */
17
+ export function useContainerSize(breakpoint: number): [React.RefObject<HTMLDivElement>, boolean] {
18
+ const ref = useRef<HTMLDivElement>(null);
19
+ const [isAboveBreakpoint, setIsAboveBreakpoint] = useState(false);
20
+
21
+ useResizeObserver(
22
+ ref,
23
+ (entry) => {
24
+ // Use contentRect.width to match CSS container query box model (content-box)
25
+ const inlineSize = entry.contentRect.width;
26
+ setIsAboveBreakpoint(inlineSize >= breakpoint);
27
+ },
28
+ 'content-box',
29
+ );
30
+
31
+ return [ref, isAboveBreakpoint];
32
+ }
@@ -5,6 +5,7 @@ import { useEffectEvent } from './useEffectEvent';
5
5
  export function useResizeObserver(
6
6
  ref: React.MutableRefObject<Element | null>,
7
7
  callback: (entry: ResizeObserverEntry) => void,
8
+ box: ResizeObserverBoxOptions = 'border-box',
8
9
  ) {
9
10
  const handleCallback = useEffectEvent(callback);
10
11
  useEffect(() => {
@@ -12,11 +13,11 @@ export function useResizeObserver(
12
13
  const resizeObserver = new ResizeObserver(([entry]) => {
13
14
  handleCallback(entry);
14
15
  });
15
- resizeObserver.observe(ref.current, { box: 'border-box' });
16
+ resizeObserver.observe(ref.current, { box });
16
17
  return () => {
17
18
  resizeObserver.disconnect();
18
19
  };
19
20
  }
20
21
  return () => {};
21
- }, [handleCallback, ref]);
22
+ }, [handleCallback, ref, box]);
22
23
  }
@@ -1,9 +1,13 @@
1
1
  import { Meta, StoryObj } from '@storybook/react-webpack5';
2
2
  import CriticalCommsBanner from '.';
3
3
 
4
+ /**
5
+ * @deprecated Use **`CriticalBanner`** component instead.
6
+ */
4
7
  export default {
5
8
  component: CriticalCommsBanner,
6
9
  title: 'Prompts/CriticalCommsBanner',
10
+ tags: ['deprecated'],
7
11
  } satisfies Meta<typeof CriticalCommsBanner>;
8
12
 
9
13
  type Story = StoryObj<typeof CriticalCommsBanner>;
@@ -6,7 +6,7 @@ import { withVariantConfig } from '../../.storybook/helpers';
6
6
  export default {
7
7
  component: CriticalCommsBanner,
8
8
  title: 'Prompts/CriticalCommsBanner/Tests',
9
- tags: ['!autodocs'],
9
+ tags: ['!autodocs', 'deprecated'],
10
10
  } satisfies Meta<typeof CriticalCommsBanner>;
11
11
 
12
12
  type Story = StoryObj<typeof CriticalCommsBanner>;
@@ -51,6 +51,9 @@ const iconBySentiment: Record<CriticalCommsBannerSentiment, React.ReactNode> = {
51
51
  ),
52
52
  };
53
53
 
54
+ /**
55
+ * @deprecated `CriticalCommsBanner` component is deprecated and now replaced by the `CriticalBanner` component.
56
+ */
54
57
  function CriticalCommsBanner({
55
58
  title,
56
59
  subtitle,
package/src/i18n/cs.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "vybráno",
17
17
  "neptune.DateLookup.twentyYears": "20 let",
18
18
  "neptune.DateLookup.year": "rok",
19
+ "neptune.Expander.collapseAriaLabel": "Sbalit",
20
+ "neptune.Expander.expandAriaLabel": "Rozbalit",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Napište měnu/zemi",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Vybrat měnu",
21
23
  "neptune.FlowNavigation.back": "zpět na předchozí krok",
package/src/i18n/de.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "ausgewählt",
17
17
  "neptune.DateLookup.twentyYears": "20 Jahre",
18
18
  "neptune.DateLookup.year": "Jahr",
19
+ "neptune.Expander.collapseAriaLabel": "Minimieren",
20
+ "neptune.Expander.expandAriaLabel": "Maximieren",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Gib eine Währung / ein Land ein",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Wähle eine Währung",
21
23
  "neptune.FlowNavigation.back": "zurück zum vorherigen Schritt",
package/src/i18n/en.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "selected",
17
17
  "neptune.DateLookup.twentyYears": "20 years",
18
18
  "neptune.DateLookup.year": "year",
19
+ "neptune.Expander.collapseAriaLabel": "Collapse",
20
+ "neptune.Expander.expandAriaLabel": "Expand",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Type a currency / country",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Select currency",
21
23
  "neptune.FlowNavigation.back": "back to previous step",
package/src/i18n/es.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "seleccionado",
17
17
  "neptune.DateLookup.twentyYears": "20 años",
18
18
  "neptune.DateLookup.year": "año",
19
+ "neptune.Expander.collapseAriaLabel": "Ocultar",
20
+ "neptune.Expander.expandAriaLabel": "Expandir",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Indica una divisa/país",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Seleccionar divisa",
21
23
  "neptune.FlowNavigation.back": "volver al paso anterior",
package/src/i18n/fr.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "sélectionnée",
17
17
  "neptune.DateLookup.twentyYears": "20 ans",
18
18
  "neptune.DateLookup.year": "année",
19
+ "neptune.Expander.collapseAriaLabel": "Réduire",
20
+ "neptune.Expander.expandAriaLabel": "Développer",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Entrez une devise/un pays",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Sélectionnez une devise",
21
23
  "neptune.FlowNavigation.back": "revenir à l'étape précédente",
package/src/i18n/hu.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "kiválasztva",
17
17
  "neptune.DateLookup.twentyYears": "20 év",
18
18
  "neptune.DateLookup.year": "év",
19
+ "neptune.Expander.collapseAriaLabel": "Rövidebben",
20
+ "neptune.Expander.expandAriaLabel": "Több",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Írj be egy pénznemet/országot",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Pénznem kiválasztása",
21
23
  "neptune.FlowNavigation.back": "vissza az előző lépéshez",
package/src/i18n/id.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "terpilih",
17
17
  "neptune.DateLookup.twentyYears": "20 tahun",
18
18
  "neptune.DateLookup.year": "tahun",
19
+ "neptune.Expander.collapseAriaLabel": "Persempit",
20
+ "neptune.Expander.expandAriaLabel": "Perluas",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Ketik mata uang/negara",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Pilih mata uang",
21
23
  "neptune.FlowNavigation.back": "kembali ke langkah sebelumnya",
package/src/i18n/it.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "selezionata",
17
17
  "neptune.DateLookup.twentyYears": "20 anni",
18
18
  "neptune.DateLookup.year": "anno",
19
+ "neptune.Expander.collapseAriaLabel": "Riduci",
20
+ "neptune.Expander.expandAriaLabel": "Espandi",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Digita una valuta / paese",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Scegli la valuta",
21
23
  "neptune.FlowNavigation.back": "torna al passaggio precedente",
package/src/i18n/ja.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "選択済み",
17
17
  "neptune.DateLookup.twentyYears": "20年",
18
18
  "neptune.DateLookup.year": "年",
19
+ "neptune.Expander.collapseAriaLabel": "閉じる",
20
+ "neptune.Expander.expandAriaLabel": "開く",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "通貨または国をご入力ください",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "通貨の選択",
21
23
  "neptune.FlowNavigation.back": "前のステップに戻る",
package/src/i18n/nl.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "geselecteerd",
17
17
  "neptune.DateLookup.twentyYears": "20 jaar",
18
18
  "neptune.DateLookup.year": "jaar",
19
+ "neptune.Expander.collapseAriaLabel": "Samenvouwen",
20
+ "neptune.Expander.expandAriaLabel": "Uitvouwen",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Voer een valuta / land in",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Selecteer valuta",
21
23
  "neptune.FlowNavigation.back": "terug naar vorige stap",
package/src/i18n/pl.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "wybrano",
17
17
  "neptune.DateLookup.twentyYears": "20 lat",
18
18
  "neptune.DateLookup.year": "rok",
19
+ "neptune.Expander.collapseAriaLabel": "Schowaj",
20
+ "neptune.Expander.expandAriaLabel": "Rozwiń",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Wpisz walutę / kraj",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Wybierz walutę",
21
23
  "neptune.FlowNavigation.back": "wróć do poprzedniego kroku",
package/src/i18n/pt.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "selecionada",
17
17
  "neptune.DateLookup.twentyYears": "20 anos",
18
18
  "neptune.DateLookup.year": "ano",
19
+ "neptune.Expander.collapseAriaLabel": "Ver menos",
20
+ "neptune.Expander.expandAriaLabel": "Ver mais",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Digite uma moeda / país",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Selecione a moeda",
21
23
  "neptune.FlowNavigation.back": "voltar à etapa anterior",
package/src/i18n/ro.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "selectată",
17
17
  "neptune.DateLookup.twentyYears": "20 de ani",
18
18
  "neptune.DateLookup.year": "an",
19
+ "neptune.Expander.collapseAriaLabel": "Restrânge",
20
+ "neptune.Expander.expandAriaLabel": "Extinde",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Tastează o monedă / țară",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Selectează moneda",
21
23
  "neptune.FlowNavigation.back": "înapoi la pasul anterior",
package/src/i18n/ru.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "выбрано",
17
17
  "neptune.DateLookup.twentyYears": "20 лет",
18
18
  "neptune.DateLookup.year": "год",
19
+ "neptune.Expander.collapseAriaLabel": "Свернуть",
20
+ "neptune.Expander.expandAriaLabel": "Развернуть",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Введите валюту/страну",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Выберите валюту",
21
23
  "neptune.FlowNavigation.back": "вернуться к предыдущему шагу",
package/src/i18n/th.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "เลือกแล้ว",
17
17
  "neptune.DateLookup.twentyYears": "20 ปี",
18
18
  "neptune.DateLookup.year": "ปี",
19
+ "neptune.Expander.collapseAriaLabel": "ย่อ",
20
+ "neptune.Expander.expandAriaLabel": "ขยาย",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "ป้อนสกุลเงิน / ประเทศ",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "เลือกสกุลเงิน",
21
23
  "neptune.FlowNavigation.back": "กลับไปที่ขั้นก่อนหน้า",
package/src/i18n/tr.json CHANGED
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "seçili",
17
17
  "neptune.DateLookup.twentyYears": "20 yıl",
18
18
  "neptune.DateLookup.year": "yıl",
19
+ "neptune.Expander.collapseAriaLabel": "Küçült",
20
+ "neptune.Expander.expandAriaLabel": "Genişlet",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "Bir para birimi / ülke girin",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "Para birimi seçin",
21
23
  "neptune.FlowNavigation.back": "önceki adıma dön",
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "已选",
17
17
  "neptune.DateLookup.twentyYears": "20 年",
18
18
  "neptune.DateLookup.year": "年",
19
+ "neptune.Expander.collapseAriaLabel": "收起",
20
+ "neptune.Expander.expandAriaLabel": "展开",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "输入货币/国家/地区",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "选择货币",
21
23
  "neptune.FlowNavigation.back": "返回上一步",
@@ -16,6 +16,8 @@
16
16
  "neptune.DateLookup.selected": "已選",
17
17
  "neptune.DateLookup.twentyYears": "20年",
18
18
  "neptune.DateLookup.year": "年",
19
+ "neptune.Expander.collapseAriaLabel": "收起",
20
+ "neptune.Expander.expandAriaLabel": "展開",
19
21
  "neptune.ExpressiveMoneyInput.currency.search.placeholder": "輸入貨幣或國家/地區",
20
22
  "neptune.ExpressiveMoneyInput.currency.select.currency": "選擇貨幣",
21
23
  "neptune.FlowNavigation.back": "返回上一個步驟",
package/src/index.ts CHANGED
@@ -36,7 +36,7 @@ export type { HeaderProps } from './header';
36
36
  export type { EmphasisProps } from './emphasis';
37
37
  export type { FieldProps } from './field/Field';
38
38
  export type { InfoProps } from './info';
39
- export type { InlinePromptProps, ActionPromptProps } from './prompt';
39
+ export type { InlinePromptProps, ActionPromptProps, CriticalBannerProps } from './prompt';
40
40
  export type { InfoPromptProps, InfoPromptAction, InfoPromptMedia } from './prompt';
41
41
  export type { InputWithDisplayFormatProps } from './inputWithDisplayFormat';
42
42
  export type { InputProps } from './inputs/Input';
@@ -175,7 +175,7 @@ export { default as Header } from './header';
175
175
  export { default as Image } from './image';
176
176
  export { default as Info } from './info';
177
177
  export { default as InlineAlert } from './inlineAlert';
178
- export { InfoPrompt, InlinePrompt, ActionPrompt } from './prompt';
178
+ export { InfoPrompt, InlinePrompt, ActionPrompt, CriticalBanner } from './prompt';
179
179
  export { default as InputWithDisplayFormat } from './inputWithDisplayFormat';
180
180
  export { Input } from './inputs/Input';
181
181
  export { InputGroup } from './inputs/InputGroup';
package/src/logo/Logo.css CHANGED
@@ -1,26 +1,6 @@
1
1
  .np-logo {
2
2
  display: inline-block;
3
- }
4
- .np-theme-personal--forest-green .np-logo-svg path,
5
- .np-theme-personal--bright-green .np-logo-svg path {
6
- fill: var(--color-interactive-primary);
7
- }
8
- .np-theme-personal--dark .np-logo-svg path {
9
- fill: var(--color-white);
10
- }
11
- .np-logo-svg--size-sm {
12
- display: block;
13
- }
14
- @media (min-width: 576px) {
15
- .np-logo-svg--size-sm {
16
- display: none;
17
- }
18
- }
19
- .np-logo-svg--size-md {
20
- display: none;
21
- }
22
- @media (min-width: 576px) {
23
- .np-logo-svg--size-md {
24
- display: block;
25
- }
3
+ color: var(--color-interactive-primary);
4
+ width: var(--wds-logo-width);
5
+ height: var(--wds-logo-height);
26
6
  }
@@ -1,32 +1,6 @@
1
1
  .np-logo {
2
2
  display: inline-block;
3
- }
4
-
5
- .np-logo-svg {
6
- path {
7
- .np-theme-personal--forest-green &,
8
- .np-theme-personal--bright-green & {
9
- fill: var(--color-interactive-primary);
10
- }
11
-
12
- .np-theme-personal--dark & {
13
- fill: var(--color-white);
14
- }
15
- }
16
-
17
- &--size-sm {
18
- display: block;
19
-
20
- @media (--screen-sm) {
21
- display: none;
22
- }
23
- }
24
-
25
- &--size-md {
26
- display: none;
27
-
28
- @media (--screen-sm) {
29
- display: block;
30
- }
31
- }
3
+ color: var(--color-interactive-primary);
4
+ width: var(--wds-logo-width);
5
+ height: var(--wds-logo-height);
32
6
  }