@transferwise/components 46.128.3 → 46.129.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/build/alert/Alert.js +1 -1
  2. package/build/alert/Alert.mjs +1 -1
  3. package/build/common/liveRegion/LiveRegion.js +42 -0
  4. package/build/common/liveRegion/LiveRegion.js.map +1 -0
  5. package/build/common/liveRegion/LiveRegion.mjs +40 -0
  6. package/build/common/liveRegion/LiveRegion.mjs.map +1 -0
  7. package/build/flowNavigation/FlowNavigation.js +1 -1
  8. package/build/flowNavigation/FlowNavigation.mjs +1 -1
  9. package/build/inputs/SelectInput.js +1 -1
  10. package/build/inputs/SelectInput.js.map +1 -1
  11. package/build/inputs/SelectInput.mjs +1 -1
  12. package/build/inputs/SelectInput.mjs.map +1 -1
  13. package/build/inputs/_ButtonInput.js +2 -2
  14. package/build/inputs/_ButtonInput.js.map +1 -1
  15. package/build/inputs/_ButtonInput.mjs +2 -2
  16. package/build/inputs/_ButtonInput.mjs.map +1 -1
  17. package/build/main.css +108 -100
  18. package/build/overlayHeader/OverlayHeader.js +1 -1
  19. package/build/overlayHeader/OverlayHeader.mjs +1 -1
  20. package/build/prompt/InfoPrompt/InfoPrompt.js +35 -29
  21. package/build/prompt/InfoPrompt/InfoPrompt.js.map +1 -1
  22. package/build/prompt/InfoPrompt/InfoPrompt.mjs +35 -29
  23. package/build/prompt/InfoPrompt/InfoPrompt.mjs.map +1 -1
  24. package/build/sentimentSurface/SentimentSurface.js +5 -1
  25. package/build/sentimentSurface/SentimentSurface.js.map +1 -1
  26. package/build/sentimentSurface/SentimentSurface.mjs +5 -1
  27. package/build/sentimentSurface/SentimentSurface.mjs.map +1 -1
  28. package/build/styles/inputs/SelectInput.css +8 -0
  29. package/build/styles/main.css +108 -100
  30. package/build/styles/sentimentSurface/SentimentSurface.css +100 -100
  31. package/build/types/common/index.d.ts +2 -0
  32. package/build/types/common/index.d.ts.map +1 -1
  33. package/build/types/common/liveRegion/LiveRegion.d.ts +23 -0
  34. package/build/types/common/liveRegion/LiveRegion.d.ts.map +1 -0
  35. package/build/types/common/liveRegion/index.d.ts +3 -0
  36. package/build/types/common/liveRegion/index.d.ts.map +1 -0
  37. package/build/types/inputs/SelectInput.d.ts.map +1 -1
  38. package/build/types/prompt/InfoPrompt/InfoPrompt.d.ts +11 -2
  39. package/build/types/prompt/InfoPrompt/InfoPrompt.d.ts.map +1 -1
  40. package/build/types/sentimentSurface/SentimentSurface.d.ts.map +1 -1
  41. package/package.json +1 -1
  42. package/src/common/index.ts +2 -0
  43. package/src/common/liveRegion/LiveRegion.test.tsx +56 -0
  44. package/src/common/liveRegion/LiveRegion.tsx +49 -0
  45. package/src/common/liveRegion/index.ts +2 -0
  46. package/src/inputs/SelectInput.css +8 -0
  47. package/src/inputs/SelectInput.story.tsx +2 -2
  48. package/src/inputs/SelectInput.test.story.tsx +57 -1
  49. package/src/inputs/SelectInput.test.tsx +33 -1
  50. package/src/inputs/SelectInput.tsx +2 -1
  51. package/src/inputs/_ButtonInput.less +8 -0
  52. package/src/inputs/_ButtonInput.tsx +1 -1
  53. package/src/main.css +108 -100
  54. package/src/prompt/InfoPrompt/InfoPrompt.test.story.tsx +119 -0
  55. package/src/prompt/InfoPrompt/InfoPrompt.tsx +47 -34
  56. package/src/sentimentSurface/SentimentSurface.css +100 -100
  57. package/src/sentimentSurface/SentimentSurface.less +50 -50
  58. package/src/sentimentSurface/SentimentSurface.test.story.tsx +19 -0
  59. package/src/sentimentSurface/SentimentSurface.tsx +3 -0
@@ -1,11 +1,17 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-webpack5';
2
2
  import { fireEvent, fn, type Mock, screen, userEvent, within } from 'storybook/test';
3
+ import { useState } from 'react';
3
4
 
4
5
  import { allModes } from '../../.storybook/modes';
5
6
  import Body from '../body';
6
7
  import { Field } from '../field/Field';
7
8
  import { lorem5, lorem500 } from '../test-utils';
8
- import { SelectInput, type SelectInputProps, sortByRelevance } from './SelectInput';
9
+ import {
10
+ SelectInput,
11
+ SelectInputOptionContent,
12
+ type SelectInputProps,
13
+ sortByRelevance,
14
+ } from './SelectInput';
9
15
 
10
16
  const meta = {
11
17
  title: 'Forms/SelectInput/Tests',
@@ -1364,3 +1370,53 @@ export const SmoothScrollReset: Story<string> = {
1364
1370
  },
1365
1371
  },
1366
1372
  };
1373
+
1374
+ interface OptionWithDescription {
1375
+ id: string;
1376
+ title: string;
1377
+ description?: string;
1378
+ }
1379
+
1380
+ const optionsWithDescription: OptionWithDescription[] = [
1381
+ { id: '1', title: 'Option One', description: 'This is the first option' },
1382
+ { id: '2', title: 'Option Two (no description)' },
1383
+ { id: '3', title: 'Option Three', description: 'This is the third option' },
1384
+ ];
1385
+
1386
+ /**
1387
+ * Test story to verify that SelectInput correctly displays an item with a description
1388
+ * when shown in the trigger button. The description should be visible in the trigger
1389
+ * after selection.
1390
+ */
1391
+ export const TriggerWithDescription: Story<OptionWithDescription> = {
1392
+ args: {
1393
+ items: optionsWithDescription.map((option) => ({
1394
+ type: 'option',
1395
+ value: option,
1396
+ })),
1397
+ defaultValue: optionsWithDescription[0],
1398
+ placeholder: 'Select an option',
1399
+ renderValue: (option, withinTrigger) => (
1400
+ <SelectInputOptionContent
1401
+ title={option.title}
1402
+ description={withinTrigger ? option.description : undefined}
1403
+ />
1404
+ ),
1405
+ },
1406
+ render: function Render({ onChange, ...args }) {
1407
+ const [selectedOption, setSelectedOption] = useState<OptionWithDescription>(
1408
+ optionsWithDescription[0],
1409
+ );
1410
+
1411
+ return (
1412
+ <SelectInput
1413
+ {...args}
1414
+ value={selectedOption}
1415
+ onChange={(option) => {
1416
+ setSelectedOption(option);
1417
+ onChange?.(option);
1418
+ }}
1419
+ />
1420
+ );
1421
+ },
1422
+ };
@@ -4,7 +4,12 @@ import { mockAnimationsApi } from 'jsdom-testing-mocks';
4
4
 
5
5
  import { render, mockMatchMedia, mockResizeObserver } from '../test-utils';
6
6
 
7
- import { SelectInput, type SelectInputOptionItem, type SelectInputProps } from './SelectInput';
7
+ import {
8
+ SelectInput,
9
+ SelectInputOptionContent,
10
+ type SelectInputOptionItem,
11
+ type SelectInputProps,
12
+ } from './SelectInput';
8
13
  import { Field } from '../field/Field';
9
14
 
10
15
  mockMatchMedia();
@@ -511,6 +516,33 @@ describe('SelectInput', () => {
511
516
  expect(options[2]).toHaveTextContent('Zambia');
512
517
  });
513
518
 
519
+ it('adds class to description wrapper when description is present', () => {
520
+ interface Currency {
521
+ code: string;
522
+ name: string;
523
+ description: string;
524
+ }
525
+
526
+ const usd: Currency = { code: 'USD', name: 'US Dollar', description: 'United States Dollar' };
527
+ const eur: Currency = { code: 'EUR', name: 'Euro', description: 'European Currency' };
528
+
529
+ render(
530
+ <SelectInput<Currency>
531
+ items={[
532
+ { type: 'option', value: usd },
533
+ { type: 'option', value: eur },
534
+ ]}
535
+ renderValue={(currency) => (
536
+ <SelectInputOptionContent title={currency.name} description={currency.description} />
537
+ )}
538
+ value={usd}
539
+ />,
540
+ );
541
+
542
+ const descriptionElement = screen.getByText('United States Dollar');
543
+ expect(descriptionElement).toHaveClass('np-select-input-option-description-in-trigger');
544
+ });
545
+
514
546
  describe('listbox label', () => {
515
547
  const fieldLabel = 'Fruits';
516
548
  const triggerLabel = 'Select fruit';
@@ -1256,7 +1256,8 @@ export function SelectInputOptionContent({
1256
1256
  <div
1257
1257
  className={clsx(
1258
1258
  'np-select-input-option-content-text-secondary np-text-body-default',
1259
- withinTrigger && 'np-select-input-option-content-text-within-trigger',
1259
+ withinTrigger &&
1260
+ 'np-select-input-option-content-text-within-trigger np-select-input-option-description-in-trigger',
1260
1261
  )}
1261
1262
  >
1262
1263
  {description}
@@ -4,4 +4,12 @@
4
4
  align-content: center;
5
5
  border-radius: var(--size-10);
6
6
  text-align: start;
7
+
8
+ // Using !important to overwrite styles from .form-control and inputClassNameBase util, which also use !important
9
+ &:has(.np-select-input-option-description-in-trigger) {
10
+ height: auto !important;
11
+ align-content: start;
12
+ padding-top: var(--size-12) !important;
13
+ padding-bottom: var(--size-12) !important;
14
+ }
7
15
  }
@@ -18,7 +18,7 @@ export const ButtonInput = forwardRef(function ButtonInput(
18
18
  <button
19
19
  ref={ref}
20
20
  type="button"
21
- className={clsx(className, inputClassNameBase({ size }), 'np-button-input')}
21
+ className={clsx(inputClassNameBase({ size }), 'np-button-input', className)}
22
22
  style={{ ...inputPaddings, ...style }}
23
23
  {...restProps}
24
24
  />
package/src/main.css CHANGED
@@ -5,11 +5,11 @@
5
5
  background-color: var(--color-sentiment-background-surface);
6
6
  color: var(--color-sentiment-content-primary);
7
7
  }
8
- .np-theme-personal .wds-sentiment-surface-negative-base,
9
- .np-theme-business .wds-sentiment-surface-negative-base,
10
- .np-theme-platform .wds-sentiment-surface-negative-base,
11
- .np-theme-personal--bright-green .wds-sentiment-surface-negative-base,
12
- .np-theme-business--bright-green .wds-sentiment-surface-negative-base {
8
+ .np-theme-personal.wds-sentiment-surface-negative-base,
9
+ .np-theme-business.wds-sentiment-surface-negative-base,
10
+ .np-theme-platform.wds-sentiment-surface-negative-base,
11
+ .np-theme-personal--bright-green.wds-sentiment-surface-negative-base,
12
+ .np-theme-business--bright-green.wds-sentiment-surface-negative-base {
13
13
  --color-sentiment-content-primary: #CB272F;
14
14
  --color-sentiment-content-primary-hover: #B8232B;
15
15
  --color-sentiment-content-primary-active: #A72027;
@@ -29,11 +29,11 @@
29
29
  --color-sentiment-background-surface-hover: #F9E1E1;
30
30
  --color-sentiment-background-surface-active: #F8D8D8;
31
31
  }
32
- .np-theme-personal .wds-sentiment-surface-negative-elevated,
33
- .np-theme-business .wds-sentiment-surface-negative-elevated,
34
- .np-theme-platform .wds-sentiment-surface-negative-elevated,
35
- .np-theme-personal--bright-green .wds-sentiment-surface-negative-elevated,
36
- .np-theme-business--bright-green .wds-sentiment-surface-negative-elevated {
32
+ .np-theme-personal.wds-sentiment-surface-negative-elevated,
33
+ .np-theme-business.wds-sentiment-surface-negative-elevated,
34
+ .np-theme-platform.wds-sentiment-surface-negative-elevated,
35
+ .np-theme-personal--bright-green.wds-sentiment-surface-negative-elevated,
36
+ .np-theme-business--bright-green.wds-sentiment-surface-negative-elevated {
37
37
  --color-sentiment-content-primary: #FFFFFF;
38
38
  --color-sentiment-content-primary-hover: #F5CCCC;
39
39
  --color-sentiment-content-primary-active: #F1B7B7;
@@ -53,11 +53,11 @@
53
53
  --color-sentiment-background-surface-hover: #B8232B;
54
54
  --color-sentiment-background-surface-active: #A72027;
55
55
  }
56
- .np-theme-personal--dark .wds-sentiment-surface-negative-base,
57
- .np-theme-business--dark .wds-sentiment-surface-negative-base,
58
- .np-theme-personal--forest-green .wds-sentiment-surface-negative-base,
59
- .np-theme-business--forest-green .wds-sentiment-surface-negative-base,
60
- .np-theme-platform--forest-green .wds-sentiment-surface-negative-base {
56
+ .np-theme-personal--dark.wds-sentiment-surface-negative-base,
57
+ .np-theme-business--dark.wds-sentiment-surface-negative-base,
58
+ .np-theme-personal--forest-green.wds-sentiment-surface-negative-base,
59
+ .np-theme-business--forest-green.wds-sentiment-surface-negative-base,
60
+ .np-theme-platform--forest-green.wds-sentiment-surface-negative-base {
61
61
  --color-sentiment-content-primary: #FFA8AD;
62
62
  --color-sentiment-content-primary-hover: #FFBDC0;
63
63
  --color-sentiment-content-primary-active: #FFD1D3;
@@ -77,11 +77,11 @@
77
77
  --color-sentiment-background-surface-hover: #641115;
78
78
  --color-sentiment-background-surface-active: #761418;
79
79
  }
80
- .np-theme-personal--dark .wds-sentiment-surface-negative-elevated,
81
- .np-theme-business--dark .wds-sentiment-surface-negative-elevated,
82
- .np-theme-personal--forest-green .wds-sentiment-surface-negative-elevated,
83
- .np-theme-business--forest-green .wds-sentiment-surface-negative-elevated,
84
- .np-theme-platform--forest-green .wds-sentiment-surface-negative-elevated {
80
+ .np-theme-personal--dark.wds-sentiment-surface-negative-elevated,
81
+ .np-theme-business--dark.wds-sentiment-surface-negative-elevated,
82
+ .np-theme-personal--forest-green.wds-sentiment-surface-negative-elevated,
83
+ .np-theme-business--forest-green.wds-sentiment-surface-negative-elevated,
84
+ .np-theme-platform--forest-green.wds-sentiment-surface-negative-elevated {
85
85
  --color-sentiment-content-primary: #410B0D;
86
86
  --color-sentiment-content-primary-hover: #641115;
87
87
  --color-sentiment-content-primary-active: #761418;
@@ -101,11 +101,11 @@
101
101
  --color-sentiment-background-surface-hover: #FFBDC0;
102
102
  --color-sentiment-background-surface-active: #FFD1D3;
103
103
  }
104
- .np-theme-personal .wds-sentiment-surface-warning-base,
105
- .np-theme-business .wds-sentiment-surface-warning-base,
106
- .np-theme-platform .wds-sentiment-surface-warning-base,
107
- .np-theme-personal--bright-green .wds-sentiment-surface-warning-base,
108
- .np-theme-business--bright-green .wds-sentiment-surface-warning-base {
104
+ .np-theme-personal.wds-sentiment-surface-warning-base,
105
+ .np-theme-business.wds-sentiment-surface-warning-base,
106
+ .np-theme-platform.wds-sentiment-surface-warning-base,
107
+ .np-theme-personal--bright-green.wds-sentiment-surface-warning-base,
108
+ .np-theme-business--bright-green.wds-sentiment-surface-warning-base {
109
109
  --color-sentiment-content-primary: #4A3B1C;
110
110
  --color-sentiment-content-primary-hover: #302612;
111
111
  --color-sentiment-content-primary-active: #2C2311;
@@ -125,11 +125,11 @@
125
125
  --color-sentiment-background-surface-hover: #FFF0B2;
126
126
  --color-sentiment-background-surface-active: #FFE98F;
127
127
  }
128
- .np-theme-personal .wds-sentiment-surface-warning-elevated,
129
- .np-theme-business .wds-sentiment-surface-warning-elevated,
130
- .np-theme-platform .wds-sentiment-surface-warning-elevated,
131
- .np-theme-personal--bright-green .wds-sentiment-surface-warning-elevated,
132
- .np-theme-business--bright-green .wds-sentiment-surface-warning-elevated {
128
+ .np-theme-personal.wds-sentiment-surface-warning-elevated,
129
+ .np-theme-business.wds-sentiment-surface-warning-elevated,
130
+ .np-theme-platform.wds-sentiment-surface-warning-elevated,
131
+ .np-theme-personal--bright-green.wds-sentiment-surface-warning-elevated,
132
+ .np-theme-business--bright-green.wds-sentiment-surface-warning-elevated {
133
133
  --color-sentiment-content-primary: #4A3B1C;
134
134
  --color-sentiment-content-primary-hover: #302612;
135
135
  --color-sentiment-content-primary-active: #2C2311;
@@ -149,11 +149,11 @@
149
149
  --color-sentiment-background-surface-hover: #FFBF0F;
150
150
  --color-sentiment-background-surface-active: #FFBB00;
151
151
  }
152
- .np-theme-personal--dark .wds-sentiment-surface-warning-base,
153
- .np-theme-business--dark .wds-sentiment-surface-warning-base,
154
- .np-theme-personal--forest-green .wds-sentiment-surface-warning-base,
155
- .np-theme-business--forest-green .wds-sentiment-surface-warning-base,
156
- .np-theme-platform--forest-green .wds-sentiment-surface-warning-base {
152
+ .np-theme-personal--dark.wds-sentiment-surface-warning-base,
153
+ .np-theme-business--dark.wds-sentiment-surface-warning-base,
154
+ .np-theme-personal--forest-green.wds-sentiment-surface-warning-base,
155
+ .np-theme-business--forest-green.wds-sentiment-surface-warning-base,
156
+ .np-theme-platform--forest-green.wds-sentiment-surface-warning-base {
157
157
  --color-sentiment-content-primary: #FADC65;
158
158
  --color-sentiment-content-primary-hover: #F9D648;
159
159
  --color-sentiment-content-primary-active: #F8CD20;
@@ -173,11 +173,11 @@
173
173
  --color-sentiment-background-surface-hover: #504930;
174
174
  --color-sentiment-background-surface-active: #665D3D;
175
175
  }
176
- .np-theme-personal--dark .wds-sentiment-surface-warning-elevated,
177
- .np-theme-business--dark .wds-sentiment-surface-warning-elevated,
178
- .np-theme-personal--forest-green .wds-sentiment-surface-warning-elevated,
179
- .np-theme-business--forest-green .wds-sentiment-surface-warning-elevated,
180
- .np-theme-platform--forest-green .wds-sentiment-surface-warning-elevated {
176
+ .np-theme-personal--dark.wds-sentiment-surface-warning-elevated,
177
+ .np-theme-business--dark.wds-sentiment-surface-warning-elevated,
178
+ .np-theme-personal--forest-green.wds-sentiment-surface-warning-elevated,
179
+ .np-theme-business--forest-green.wds-sentiment-surface-warning-elevated,
180
+ .np-theme-platform--forest-green.wds-sentiment-surface-warning-elevated {
181
181
  --color-sentiment-content-primary: #3A3523;
182
182
  --color-sentiment-content-primary-hover: #504930;
183
183
  --color-sentiment-content-primary-active: #665D3D;
@@ -197,11 +197,11 @@
197
197
  --color-sentiment-background-surface-hover: #F9D648;
198
198
  --color-sentiment-background-surface-active: #F8CD20;
199
199
  }
200
- .np-theme-personal .wds-sentiment-surface-success-base,
201
- .np-theme-business .wds-sentiment-surface-success-base,
202
- .np-theme-platform .wds-sentiment-surface-success-base,
203
- .np-theme-personal--bright-green .wds-sentiment-surface-success-base,
204
- .np-theme-business--bright-green .wds-sentiment-surface-success-base {
200
+ .np-theme-personal.wds-sentiment-surface-success-base,
201
+ .np-theme-business.wds-sentiment-surface-success-base,
202
+ .np-theme-platform.wds-sentiment-surface-success-base,
203
+ .np-theme-personal--bright-green.wds-sentiment-surface-success-base,
204
+ .np-theme-business--bright-green.wds-sentiment-surface-success-base {
205
205
  --color-sentiment-content-primary: #054D28;
206
206
  --color-sentiment-content-primary-hover: #043A1E;
207
207
  --color-sentiment-content-primary-active: #022614;
@@ -221,11 +221,11 @@
221
221
  --color-sentiment-background-surface-hover: #D3F2C0;
222
222
  --color-sentiment-background-surface-active: #C5EDAB;
223
223
  }
224
- .np-theme-personal .wds-sentiment-surface-success-elevated,
225
- .np-theme-business .wds-sentiment-surface-success-elevated,
226
- .np-theme-platform .wds-sentiment-surface-success-elevated,
227
- .np-theme-personal--bright-green .wds-sentiment-surface-success-elevated,
228
- .np-theme-business--bright-green .wds-sentiment-surface-success-elevated {
224
+ .np-theme-personal.wds-sentiment-surface-success-elevated,
225
+ .np-theme-business.wds-sentiment-surface-success-elevated,
226
+ .np-theme-platform.wds-sentiment-surface-success-elevated,
227
+ .np-theme-personal--bright-green.wds-sentiment-surface-success-elevated,
228
+ .np-theme-business--bright-green.wds-sentiment-surface-success-elevated {
229
229
  --color-sentiment-content-primary: #E2F6D5;
230
230
  --color-sentiment-content-primary-hover: #D3F2C0;
231
231
  --color-sentiment-content-primary-active: #C5EDAB;
@@ -245,11 +245,11 @@
245
245
  --color-sentiment-background-surface-hover: #043A1E;
246
246
  --color-sentiment-background-surface-active: #022614;
247
247
  }
248
- .np-theme-personal--dark .wds-sentiment-surface-success-base,
249
- .np-theme-business--dark .wds-sentiment-surface-success-base,
250
- .np-theme-personal--forest-green .wds-sentiment-surface-success-base,
251
- .np-theme-business--forest-green .wds-sentiment-surface-success-base,
252
- .np-theme-platform--forest-green .wds-sentiment-surface-success-base {
248
+ .np-theme-personal--dark.wds-sentiment-surface-success-base,
249
+ .np-theme-business--dark.wds-sentiment-surface-success-base,
250
+ .np-theme-personal--forest-green.wds-sentiment-surface-success-base,
251
+ .np-theme-business--forest-green.wds-sentiment-surface-success-base,
252
+ .np-theme-platform--forest-green.wds-sentiment-surface-success-base {
253
253
  --color-sentiment-content-primary: #BAE5A0;
254
254
  --color-sentiment-content-primary-hover: #C8EAB3;
255
255
  --color-sentiment-content-primary-active: #D6F0C7;
@@ -269,11 +269,11 @@
269
269
  --color-sentiment-background-surface-hover: #323B2B;
270
270
  --color-sentiment-background-surface-active: #3E4A36;
271
271
  }
272
- .np-theme-personal--dark .wds-sentiment-surface-success-elevated,
273
- .np-theme-business--dark .wds-sentiment-surface-success-elevated,
274
- .np-theme-personal--forest-green .wds-sentiment-surface-success-elevated,
275
- .np-theme-business--forest-green .wds-sentiment-surface-success-elevated,
276
- .np-theme-platform--forest-green .wds-sentiment-surface-success-elevated {
272
+ .np-theme-personal--dark.wds-sentiment-surface-success-elevated,
273
+ .np-theme-business--dark.wds-sentiment-surface-success-elevated,
274
+ .np-theme-personal--forest-green.wds-sentiment-surface-success-elevated,
275
+ .np-theme-business--forest-green.wds-sentiment-surface-success-elevated,
276
+ .np-theme-platform--forest-green.wds-sentiment-surface-success-elevated {
277
277
  --color-sentiment-content-primary: #252C20;
278
278
  --color-sentiment-content-primary-hover: #323B2B;
279
279
  --color-sentiment-content-primary-active: #3E4A36;
@@ -293,11 +293,11 @@
293
293
  --color-sentiment-background-surface-hover: #C8EAB3;
294
294
  --color-sentiment-background-surface-active: #D6F0C7;
295
295
  }
296
- .np-theme-personal .wds-sentiment-surface-neutral-base,
297
- .np-theme-business .wds-sentiment-surface-neutral-base,
298
- .np-theme-platform .wds-sentiment-surface-neutral-base,
299
- .np-theme-personal--bright-green .wds-sentiment-surface-neutral-base,
300
- .np-theme-business--bright-green .wds-sentiment-surface-neutral-base {
296
+ .np-theme-personal.wds-sentiment-surface-neutral-base,
297
+ .np-theme-business.wds-sentiment-surface-neutral-base,
298
+ .np-theme-platform.wds-sentiment-surface-neutral-base,
299
+ .np-theme-personal--bright-green.wds-sentiment-surface-neutral-base,
300
+ .np-theme-business--bright-green.wds-sentiment-surface-neutral-base {
301
301
  --color-sentiment-content-primary: #454745;
302
302
  --color-sentiment-content-primary-hover: #353635;
303
303
  --color-sentiment-content-primary-active: #232423;
@@ -317,11 +317,11 @@
317
317
  --color-sentiment-background-surface-hover: rgba(62, 59, 7, 0.12);
318
318
  --color-sentiment-background-surface-active: rgba(62, 59, 7, 0.17);
319
319
  }
320
- .np-theme-personal .wds-sentiment-surface-neutral-elevated,
321
- .np-theme-business .wds-sentiment-surface-neutral-elevated,
322
- .np-theme-platform .wds-sentiment-surface-neutral-elevated,
323
- .np-theme-personal--bright-green .wds-sentiment-surface-neutral-elevated,
324
- .np-theme-business--bright-green .wds-sentiment-surface-neutral-elevated {
320
+ .np-theme-personal.wds-sentiment-surface-neutral-elevated,
321
+ .np-theme-business.wds-sentiment-surface-neutral-elevated,
322
+ .np-theme-platform.wds-sentiment-surface-neutral-elevated,
323
+ .np-theme-personal--bright-green.wds-sentiment-surface-neutral-elevated,
324
+ .np-theme-business--bright-green.wds-sentiment-surface-neutral-elevated {
325
325
  --color-sentiment-content-primary: #F1F1ED;
326
326
  --color-sentiment-content-primary-hover: #E7E7E1;
327
327
  --color-sentiment-content-primary-active: #DFDED5;
@@ -341,11 +341,11 @@
341
341
  --color-sentiment-background-surface-hover: #353635;
342
342
  --color-sentiment-background-surface-active: #232423;
343
343
  }
344
- .np-theme-personal--dark .wds-sentiment-surface-neutral-base,
345
- .np-theme-business--dark .wds-sentiment-surface-neutral-base,
346
- .np-theme-personal--forest-green .wds-sentiment-surface-neutral-base,
347
- .np-theme-business--forest-green .wds-sentiment-surface-neutral-base,
348
- .np-theme-platform--forest-green .wds-sentiment-surface-neutral-base {
344
+ .np-theme-personal--dark.wds-sentiment-surface-neutral-base,
345
+ .np-theme-business--dark.wds-sentiment-surface-neutral-base,
346
+ .np-theme-personal--forest-green.wds-sentiment-surface-neutral-base,
347
+ .np-theme-business--forest-green.wds-sentiment-surface-neutral-base,
348
+ .np-theme-platform--forest-green.wds-sentiment-surface-neutral-base {
349
349
  --color-sentiment-content-primary: #F1F1ED;
350
350
  --color-sentiment-content-primary-hover: #E7E7E1;
351
351
  --color-sentiment-content-primary-active: #DFDED5;
@@ -365,11 +365,11 @@
365
365
  --color-sentiment-background-surface-hover: rgba(255, 255, 255, 0.2);
366
366
  --color-sentiment-background-surface-active: rgba(255, 255, 255, 0.3);
367
367
  }
368
- .np-theme-personal--dark .wds-sentiment-surface-neutral-elevated,
369
- .np-theme-business--dark .wds-sentiment-surface-neutral-elevated,
370
- .np-theme-personal--forest-green .wds-sentiment-surface-neutral-elevated,
371
- .np-theme-business--forest-green .wds-sentiment-surface-neutral-elevated,
372
- .np-theme-platform--forest-green .wds-sentiment-surface-neutral-elevated {
368
+ .np-theme-personal--dark.wds-sentiment-surface-neutral-elevated,
369
+ .np-theme-business--dark.wds-sentiment-surface-neutral-elevated,
370
+ .np-theme-personal--forest-green.wds-sentiment-surface-neutral-elevated,
371
+ .np-theme-business--forest-green.wds-sentiment-surface-neutral-elevated,
372
+ .np-theme-platform--forest-green.wds-sentiment-surface-neutral-elevated {
373
373
  --color-sentiment-content-primary: #2A2C29;
374
374
  --color-sentiment-content-primary-hover: #414441;
375
375
  --color-sentiment-content-primary-active: #595B58;
@@ -389,11 +389,11 @@
389
389
  --color-sentiment-background-surface-hover: #E7E7E1;
390
390
  --color-sentiment-background-surface-active: #DFDED5;
391
391
  }
392
- .np-theme-personal .wds-sentiment-surface-proposition-base,
393
- .np-theme-business .wds-sentiment-surface-proposition-base,
394
- .np-theme-platform .wds-sentiment-surface-proposition-base,
395
- .np-theme-personal--bright-green .wds-sentiment-surface-proposition-base,
396
- .np-theme-business--bright-green .wds-sentiment-surface-proposition-base {
392
+ .np-theme-personal.wds-sentiment-surface-proposition-base,
393
+ .np-theme-business.wds-sentiment-surface-proposition-base,
394
+ .np-theme-platform.wds-sentiment-surface-proposition-base,
395
+ .np-theme-personal--bright-green.wds-sentiment-surface-proposition-base,
396
+ .np-theme-business--bright-green.wds-sentiment-surface-proposition-base {
397
397
  --color-sentiment-content-primary: #0E0F0C;
398
398
  --color-sentiment-content-primary-hover: #0A2826;
399
399
  --color-sentiment-content-primary-active: #074140;
@@ -413,11 +413,11 @@
413
413
  --color-sentiment-background-surface-hover: #CAF1F1;
414
414
  --color-sentiment-background-surface-active: #B6ECEC;
415
415
  }
416
- .np-theme-personal .wds-sentiment-surface-proposition-elevated,
417
- .np-theme-business .wds-sentiment-surface-proposition-elevated,
418
- .np-theme-platform .wds-sentiment-surface-proposition-elevated,
419
- .np-theme-personal--bright-green .wds-sentiment-surface-proposition-elevated,
420
- .np-theme-business--bright-green .wds-sentiment-surface-proposition-elevated {
416
+ .np-theme-personal.wds-sentiment-surface-proposition-elevated,
417
+ .np-theme-business.wds-sentiment-surface-proposition-elevated,
418
+ .np-theme-platform.wds-sentiment-surface-proposition-elevated,
419
+ .np-theme-personal--bright-green.wds-sentiment-surface-proposition-elevated,
420
+ .np-theme-business--bright-green.wds-sentiment-surface-proposition-elevated {
421
421
  --color-sentiment-content-primary: #FFFFFF;
422
422
  --color-sentiment-content-primary-hover: #EAF9F9;
423
423
  --color-sentiment-content-primary-active: #D5F4F4;
@@ -437,11 +437,11 @@
437
437
  --color-sentiment-background-surface-hover: #043A3A;
438
438
  --color-sentiment-background-surface-active: #022626;
439
439
  }
440
- .np-theme-personal--dark .wds-sentiment-surface-proposition-base,
441
- .np-theme-business--dark .wds-sentiment-surface-proposition-base,
442
- .np-theme-personal--forest-green .wds-sentiment-surface-proposition-base,
443
- .np-theme-business--forest-green .wds-sentiment-surface-proposition-base,
444
- .np-theme-platform--forest-green .wds-sentiment-surface-proposition-base {
440
+ .np-theme-personal--dark.wds-sentiment-surface-proposition-base,
441
+ .np-theme-business--dark.wds-sentiment-surface-proposition-base,
442
+ .np-theme-personal--forest-green.wds-sentiment-surface-proposition-base,
443
+ .np-theme-business--forest-green.wds-sentiment-surface-proposition-base,
444
+ .np-theme-platform--forest-green.wds-sentiment-surface-proposition-base {
445
445
  --color-sentiment-content-primary: #FFFFFF;
446
446
  --color-sentiment-content-primary-hover: #EAF9F9;
447
447
  --color-sentiment-content-primary-active: #D5F4F4;
@@ -461,11 +461,11 @@
461
461
  --color-sentiment-background-surface-hover: #124F4C;
462
462
  --color-sentiment-background-surface-active: #176460;
463
463
  }
464
- .np-theme-personal--dark .wds-sentiment-surface-proposition-elevated,
465
- .np-theme-business--dark .wds-sentiment-surface-proposition-elevated,
466
- .np-theme-personal--forest-green .wds-sentiment-surface-proposition-elevated,
467
- .np-theme-business--forest-green .wds-sentiment-surface-proposition-elevated,
468
- .np-theme-platform--forest-green .wds-sentiment-surface-proposition-elevated {
464
+ .np-theme-personal--dark.wds-sentiment-surface-proposition-elevated,
465
+ .np-theme-business--dark.wds-sentiment-surface-proposition-elevated,
466
+ .np-theme-personal--forest-green.wds-sentiment-surface-proposition-elevated,
467
+ .np-theme-business--forest-green.wds-sentiment-surface-proposition-elevated,
468
+ .np-theme-platform--forest-green.wds-sentiment-surface-proposition-elevated {
469
469
  --color-sentiment-content-primary: #0E0F0C;
470
470
  --color-sentiment-content-primary-hover: #0A2826;
471
471
  --color-sentiment-content-primary-active: #074140;
@@ -3930,6 +3930,14 @@ html:not([dir="rtl"]) .np-flow-navigation--sm .np-flow-navigation__stepper {
3930
3930
  border-radius: var(--size-10);
3931
3931
  text-align: start;
3932
3932
  }
3933
+ .np-button-input:has(.np-select-input-option-description-in-trigger) {
3934
+ height: auto !important;
3935
+ align-content: start;
3936
+ padding-top: 12px !important;
3937
+ padding-top: var(--size-12) !important;
3938
+ padding-bottom: 12px !important;
3939
+ padding-bottom: var(--size-12) !important;
3940
+ }
3933
3941
  .np-popover-v2-container {
3934
3942
  z-index: 1060;
3935
3943
  display: flex;
@@ -297,3 +297,122 @@ export const TinyScreen: Story = {
297
297
  ),
298
298
  ...withVariantConfig(['400%']),
299
299
  };
300
+
301
+ /**
302
+ * Test that the default LiveRegion renders with role="status" and aria-live="polite".
303
+ */
304
+ export const LiveRegionPoliteDefault: Story = {
305
+ play: async ({ canvasElement, step }) => {
306
+ const canvas = within(canvasElement);
307
+
308
+ await step('Verify live region with role="status" exists', async () => {
309
+ await waitFor(async () => {
310
+ const liveRegion = canvas.getByRole('status');
311
+ await expect(liveRegion).toBeInTheDocument();
312
+ await waitFor(async () => expect(liveRegion).toHaveAttribute('aria-live', 'polite'));
313
+ await expect(liveRegion).toHaveAttribute('aria-atomic', 'true');
314
+ });
315
+ });
316
+
317
+ await step('Verify prompt content is inside the live region', async () => {
318
+ const liveRegion = canvas.getByRole('status');
319
+ await expect(within(liveRegion).getByText('Polite announcement')).toBeInTheDocument();
320
+ });
321
+ },
322
+ args: {
323
+ description: 'Polite announcement',
324
+ },
325
+ };
326
+
327
+ /**
328
+ * Test that aria-live="assertive" renders with role="alert".
329
+ */
330
+ export const LiveRegionAssertive: Story = {
331
+ play: async ({ canvasElement, step }) => {
332
+ const canvas = within(canvasElement);
333
+
334
+ await step('Verify live region with role="alert" exists', async () => {
335
+ await waitFor(async () => {
336
+ const liveRegion = canvas.getByRole('alert');
337
+ await expect(liveRegion).toBeInTheDocument();
338
+ await waitFor(async () => expect(liveRegion).toHaveAttribute('aria-live', 'assertive'));
339
+ await expect(liveRegion).toHaveAttribute('aria-atomic', 'true');
340
+ });
341
+ });
342
+
343
+ await step('Verify prompt content is inside the live region', async () => {
344
+ const liveRegion = canvas.getByRole('alert');
345
+ await expect(within(liveRegion).getByText('Payment failed')).toBeInTheDocument();
346
+ });
347
+ },
348
+ args: {
349
+ sentiment: 'negative',
350
+ description: 'Payment failed',
351
+ 'aria-live': 'assertive',
352
+ },
353
+ };
354
+
355
+ /**
356
+ * Test that aria-live="off" renders without a live region wrapper.
357
+ */
358
+ export const LiveRegionOff: Story = {
359
+ play: async ({ canvasElement, step }) => {
360
+ const canvas = within(canvasElement);
361
+
362
+ await step('Verify no live region wrapper exists', async () => {
363
+ await waitFor(async () => {
364
+ await expect(canvas.queryByRole('status')).not.toBeInTheDocument();
365
+ await expect(canvas.queryByRole('alert')).not.toBeInTheDocument();
366
+ });
367
+ });
368
+
369
+ await step('Verify prompt content still renders', async () => {
370
+ await expect(canvas.getByText('Static info')).toBeInTheDocument();
371
+ });
372
+ },
373
+ args: {
374
+ description: 'Static info',
375
+ 'aria-live': 'off',
376
+ },
377
+ };
378
+
379
+ /**
380
+ * Test that a dismissed prompt also removes the live region.
381
+ */
382
+ export const LiveRegionDismiss: Story = {
383
+ play: async ({ canvasElement, step }) => {
384
+ const canvas = within(canvasElement);
385
+
386
+ await step('Verify live region exists before dismiss', async () => {
387
+ await waitFor(async () => {
388
+ await expect(canvas.getByRole('status')).toBeInTheDocument();
389
+ });
390
+ });
391
+
392
+ await step('Dismiss the prompt', async () => {
393
+ const dismissButton = canvas.getByRole('button', { name: /close/i });
394
+ await userEvent.click(dismissButton);
395
+ });
396
+
397
+ await step('Verify live region is removed', async () => {
398
+ await waitFor(async () => {
399
+ await expect(canvas.queryByRole('status')).not.toBeInTheDocument();
400
+ });
401
+ });
402
+ },
403
+ render: function Render(args: InfoPromptProps) {
404
+ const [isVisible, setIsVisible] = useState(true);
405
+
406
+ if (!isVisible) {
407
+ return <div data-testid="dismissed">Prompt dismissed</div>;
408
+ }
409
+
410
+ return (
411
+ <InfoPrompt
412
+ {...args}
413
+ description="Dismissable live region"
414
+ onDismiss={() => setIsVisible(false)}
415
+ />
416
+ );
417
+ },
418
+ };