@transferwise/components 0.0.0-experimental-70cb6d1 → 0.0.0-experimental-8bfed24
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.
- package/build/field/Field.js +5 -4
- package/build/field/Field.js.map +1 -1
- package/build/field/Field.mjs +5 -4
- package/build/field/Field.mjs.map +1 -1
- package/build/i18n/en.json +2 -0
- package/build/i18n/en.json.js +2 -0
- package/build/i18n/en.json.js.map +1 -1
- package/build/i18n/en.json.mjs +2 -0
- package/build/i18n/en.json.mjs.map +1 -1
- package/build/index.js +2 -0
- package/build/index.js.map +1 -1
- package/build/index.mjs +1 -0
- package/build/index.mjs.map +1 -1
- package/build/listItem/Prompt/ListItemPrompt.js +5 -4
- package/build/listItem/Prompt/ListItemPrompt.js.map +1 -1
- package/build/listItem/Prompt/ListItemPrompt.mjs +5 -4
- package/build/listItem/Prompt/ListItemPrompt.mjs.map +1 -1
- package/build/main.css +107 -51
- package/build/moneyInput/MoneyInput.js +12 -28
- package/build/moneyInput/MoneyInput.js.map +1 -1
- package/build/moneyInput/MoneyInput.mjs +14 -30
- package/build/moneyInput/MoneyInput.mjs.map +1 -1
- package/build/moneyInput/currencyFormatting.js +2 -8
- package/build/moneyInput/currencyFormatting.js.map +1 -1
- package/build/moneyInput/currencyFormatting.mjs +4 -5
- package/build/moneyInput/currencyFormatting.mjs.map +1 -1
- package/build/prompt/ActionPrompt/ActionPrompt.js +8 -40
- package/build/prompt/ActionPrompt/ActionPrompt.js.map +1 -1
- package/build/prompt/ActionPrompt/ActionPrompt.mjs +8 -40
- package/build/prompt/ActionPrompt/ActionPrompt.mjs.map +1 -1
- package/build/prompt/CriticalBanner/CriticalBanner.js +145 -0
- package/build/prompt/CriticalBanner/CriticalBanner.js.map +1 -0
- package/build/prompt/CriticalBanner/CriticalBanner.mjs +143 -0
- package/build/prompt/CriticalBanner/CriticalBanner.mjs.map +1 -0
- package/build/prompt/CriticalBanner/helpers.js +29 -0
- package/build/prompt/CriticalBanner/helpers.js.map +1 -0
- package/build/prompt/CriticalBanner/helpers.mjs +26 -0
- package/build/prompt/CriticalBanner/helpers.mjs.map +1 -0
- package/build/prompt/PrimitivePrompt/PrimitivePrompt.js +2 -0
- package/build/prompt/PrimitivePrompt/PrimitivePrompt.js.map +1 -1
- package/build/prompt/PrimitivePrompt/PrimitivePrompt.mjs +2 -0
- package/build/prompt/PrimitivePrompt/PrimitivePrompt.mjs.map +1 -1
- package/build/prompt/common/Expander/Expander.js +47 -0
- package/build/prompt/common/Expander/Expander.js.map +1 -0
- package/build/prompt/common/Expander/Expander.messages.js +17 -0
- package/build/prompt/common/Expander/Expander.messages.js.map +1 -0
- package/build/prompt/common/Expander/Expander.messages.mjs +13 -0
- package/build/prompt/common/Expander/Expander.messages.mjs.map +1 -0
- package/build/prompt/common/Expander/Expander.mjs +44 -0
- package/build/prompt/common/Expander/Expander.mjs.map +1 -0
- package/build/prompt/helpers/promptMedia.js +52 -0
- package/build/prompt/helpers/promptMedia.js.map +1 -0
- package/build/prompt/helpers/promptMedia.mjs +50 -0
- package/build/prompt/helpers/promptMedia.mjs.map +1 -0
- package/build/styles/css/neptune.css +22 -22
- package/build/styles/less/neptune-tokens.less +4 -4
- package/build/styles/main.css +107 -51
- package/build/styles/prompt/CriticalBanner/CriticalBanner.css +39 -0
- package/build/styles/prompt/common/Expander/Expander.css +8 -0
- package/build/styles/props/neptune-tokens.css +2 -2
- package/build/styles/styles/less/neptune.css +22 -22
- package/build/typeahead/Typeahead.js +5 -4
- package/build/typeahead/Typeahead.js.map +1 -1
- package/build/typeahead/Typeahead.mjs +5 -4
- package/build/typeahead/Typeahead.mjs.map +1 -1
- package/build/types/index.d.ts +2 -2
- package/build/types/index.d.ts.map +1 -1
- package/build/types/moneyInput/MoneyInput.d.ts +0 -6
- package/build/types/moneyInput/MoneyInput.d.ts.map +1 -1
- package/build/types/moneyInput/currencyFormatting.d.ts +3 -4
- package/build/types/moneyInput/currencyFormatting.d.ts.map +1 -1
- package/build/types/prompt/ActionPrompt/ActionPrompt.d.ts +2 -11
- package/build/types/prompt/ActionPrompt/ActionPrompt.d.ts.map +1 -1
- package/build/types/prompt/CriticalBanner/CriticalBanner.d.ts +40 -0
- package/build/types/prompt/CriticalBanner/CriticalBanner.d.ts.map +1 -0
- package/build/types/prompt/CriticalBanner/helpers.d.ts +18 -0
- package/build/types/prompt/CriticalBanner/helpers.d.ts.map +1 -0
- package/build/types/prompt/CriticalBanner/index.d.ts +3 -0
- package/build/types/prompt/CriticalBanner/index.d.ts.map +1 -0
- package/build/types/prompt/PrimitivePrompt/PrimitivePrompt.d.ts +8 -3
- package/build/types/prompt/PrimitivePrompt/PrimitivePrompt.d.ts.map +1 -1
- package/build/types/prompt/common/Expander/Expander.d.ts +20 -0
- package/build/types/prompt/common/Expander/Expander.d.ts.map +1 -0
- package/build/types/prompt/common/Expander/Expander.messages.d.ts +14 -0
- package/build/types/prompt/common/Expander/Expander.messages.d.ts.map +1 -0
- package/build/types/prompt/helpers/promptMedia.d.ts +22 -0
- package/build/types/prompt/helpers/promptMedia.d.ts.map +1 -0
- package/build/types/prompt/index.d.ts +2 -0
- package/build/types/prompt/index.d.ts.map +1 -1
- package/build/types/test-utils/index.d.ts +4 -0
- package/build/types/test-utils/index.d.ts.map +1 -1
- package/package.json +16 -16
- package/src/i18n/en.json +2 -0
- package/src/index.ts +2 -2
- package/src/main.css +107 -51
- package/src/main.less +3 -1
- package/src/moneyInput/MoneyInput.story.tsx +1 -10
- package/src/moneyInput/MoneyInput.test.story.tsx +1 -141
- package/src/moneyInput/MoneyInput.test.tsx +0 -45
- package/src/moneyInput/MoneyInput.tsx +3 -27
- package/src/moneyInput/currencyFormatting.ts +5 -11
- package/src/prompt/ActionPrompt/ActionPrompt.tsx +9 -62
- package/src/prompt/CriticalBanner/CriticalBanner.accessibility.docs.mdx +131 -0
- package/src/prompt/CriticalBanner/CriticalBanner.css +39 -0
- package/src/prompt/CriticalBanner/CriticalBanner.less +45 -0
- package/src/prompt/CriticalBanner/CriticalBanner.story.tsx +645 -0
- package/src/prompt/CriticalBanner/CriticalBanner.test.story.tsx +304 -0
- package/src/prompt/CriticalBanner/CriticalBanner.tsx +185 -0
- package/src/prompt/CriticalBanner/helpers.ts +39 -0
- package/src/prompt/CriticalBanner/index.ts +2 -0
- package/src/prompt/PrimitivePrompt/PrimitivePrompt.tsx +9 -2
- package/src/prompt/common/Expander/Expander.css +8 -0
- package/src/prompt/common/Expander/Expander.less +9 -0
- package/src/prompt/common/Expander/Expander.messages.ts +14 -0
- package/src/prompt/common/Expander/Expander.test.tsx +167 -0
- package/src/prompt/common/Expander/Expander.tsx +83 -0
- package/src/prompt/helpers/promptMedia.tsx +79 -0
- package/src/prompt/index.ts +4 -0
- package/src/sentimentSurface/SentimentSurface.story.tsx +43 -17
- package/src/styles/less/neptune.css +22 -22
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var React = require('react');
|
|
4
4
|
var clsx = require('clsx');
|
|
5
|
-
var StatusIcon = require('../../statusIcon/StatusIcon.js');
|
|
6
5
|
var Body = require('../../body/Body.js');
|
|
7
6
|
var Button_resolver = require('../../button/Button.resolver.js');
|
|
8
7
|
require('../../common/theme.js');
|
|
@@ -24,14 +23,13 @@ require('../../common/propsValues/variant.js');
|
|
|
24
23
|
require('../../common/propsValues/scroll.js');
|
|
25
24
|
require('../../common/propsValues/markdownNodeType.js');
|
|
26
25
|
require('../../common/fileType.js');
|
|
27
|
-
|
|
26
|
+
require('@transferwise/icons');
|
|
28
27
|
require('react-intl');
|
|
29
28
|
require('../../common/closeButton/CloseButton.messages.js');
|
|
30
29
|
var jsxRuntime = require('react/jsx-runtime');
|
|
31
|
-
var AvatarView = require('../../avatarView/AvatarView.js');
|
|
32
|
-
var Image = require('../../image/Image.js');
|
|
33
30
|
var PrimitivePrompt = require('../PrimitivePrompt/PrimitivePrompt.js');
|
|
34
31
|
var useScreenSize = require('../../common/hooks/useScreenSize.js');
|
|
32
|
+
var promptMedia = require('../helpers/promptMedia.js');
|
|
35
33
|
|
|
36
34
|
const ActionPrompt = ({
|
|
37
35
|
sentiment = 'neutral',
|
|
@@ -51,42 +49,12 @@ const ActionPrompt = ({
|
|
|
51
49
|
const titleId = React.useId();
|
|
52
50
|
const descId = React.useId();
|
|
53
51
|
const ariaLabelledByIds = [media['aria-hidden'] ? undefined : mediaId, ariaLabel ? undefined : titleId].filter(Boolean).join(' ');
|
|
54
|
-
const renderMedia = () => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
alt: media['aria-label'] ?? ''
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
if (media?.avatar) {
|
|
64
|
-
const badge = media.avatar.badge ? media.avatar.badge : sentiment === 'proposition' ? {} : {
|
|
65
|
-
status: sentiment
|
|
66
|
-
};
|
|
67
|
-
return /*#__PURE__*/jsxRuntime.jsx(AvatarView.default, {
|
|
68
|
-
...media.avatar,
|
|
69
|
-
badge: badge,
|
|
70
|
-
"aria-label": media['aria-label'],
|
|
71
|
-
"aria-hidden": media['aria-hidden'],
|
|
72
|
-
id: mediaId,
|
|
73
|
-
size: 48,
|
|
74
|
-
children: media.avatar.asset
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
return sentiment === 'proposition' ? /*#__PURE__*/jsxRuntime.jsx(AvatarView.default, {
|
|
78
|
-
id: mediaId,
|
|
79
|
-
size: 48,
|
|
80
|
-
"aria-label": media['aria-label'],
|
|
81
|
-
"aria-hidden": media['aria-hidden'],
|
|
82
|
-
children: /*#__PURE__*/jsxRuntime.jsx(icons.GiftBox, {})
|
|
83
|
-
}) : /*#__PURE__*/jsxRuntime.jsx(StatusIcon.default, {
|
|
84
|
-
id: mediaId,
|
|
85
|
-
size: 48,
|
|
86
|
-
sentiment: sentiment,
|
|
87
|
-
iconLabel: media['aria-hidden'] ? null : media['aria-label']
|
|
88
|
-
});
|
|
89
|
-
};
|
|
52
|
+
const renderMedia = () => promptMedia.renderPromptMedia({
|
|
53
|
+
media,
|
|
54
|
+
sentiment,
|
|
55
|
+
mediaId,
|
|
56
|
+
imgClassName: 'wds-action-prompt--media-image'
|
|
57
|
+
});
|
|
90
58
|
return /*#__PURE__*/jsxRuntime.jsx(PrimitivePrompt.PrimitivePrompt, {
|
|
91
59
|
id: id,
|
|
92
60
|
sentiment: sentiment,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionPrompt.js","sources":["../../../src/prompt/ActionPrompt/ActionPrompt.tsx"],"sourcesContent":["import { AriaAttributes, ReactNode, useId } from 'react';\nimport { clsx } from 'clsx';\n\nimport
|
|
1
|
+
{"version":3,"file":"ActionPrompt.js","sources":["../../../src/prompt/ActionPrompt/ActionPrompt.tsx"],"sourcesContent":["import { AriaAttributes, ReactNode, useId } from 'react';\nimport { clsx } from 'clsx';\n\nimport Body from '../../body';\nimport Button from '../../button';\nimport { Breakpoint, Typography } from '../../common';\nimport { ButtonProps } from '../../button/Button.types';\nimport { PrimitivePrompt, PrimitivePromptProps } from '../PrimitivePrompt';\nimport { useScreenSize } from '../../common/hooks/useScreenSize';\nimport { renderPromptMedia, PromptMedia } from '../helpers/promptMedia';\n\nexport type ActionPromptProps = {\n title: ReactNode;\n description?: ReactNode;\n /** @default {} */\n media?: PromptMedia;\n action: Pick<ButtonProps, 'onClick' | 'href' | 'target'> & {\n label: ButtonProps['children'];\n };\n actionSecondary?: Pick<ButtonProps, 'onClick' | 'href' | 'target'> & {\n label: ButtonProps['children'];\n };\n 'aria-label'?: AriaAttributes['aria-label'];\n} & Pick<PrimitivePromptProps, 'id' | 'className' | 'data-testid' | 'onDismiss'> & {\n /**\n * The sentiment determines the colour scheme\n * @default 'neutral'\n */\n sentiment?: PrimitivePromptProps['sentiment'];\n };\n\n/**\n * Use an action prompt for optional feedback that doesn't require immediate action, such as feature upsells, warnings, or suggestions. These prompts are typically used outside of core product flows (e.g., Launchpad, Recipient, or Transaction screens) and can be addressed at the user's convenience.\n *\n * If your message is about immediate user feedback (e.g., form submission errors, download failures, missing data warnings), use an [info prompt](https://storybook.wise.design/?path=/docs/prompts-infoprompt--docs) instead.\n *\n * Guidance can be found in the [design system](https://wise.design/components/action-prompt).\n */\nexport const ActionPrompt = ({\n sentiment = 'neutral',\n title,\n description,\n onDismiss,\n media = {},\n action,\n actionSecondary,\n id,\n className,\n 'data-testid': testId,\n 'aria-label': ariaLabel,\n}: ActionPromptProps) => {\n const isMobile = !useScreenSize(Breakpoint.MEDIUM);\n\n const mediaId = useId();\n const titleId = useId();\n const descId = useId();\n\n const ariaLabelledByIds = [\n media['aria-hidden'] ? undefined : mediaId,\n ariaLabel ? undefined : titleId,\n ]\n .filter(Boolean)\n .join(' ');\n\n const renderMedia = () =>\n renderPromptMedia({\n media,\n sentiment,\n mediaId,\n imgClassName: 'wds-action-prompt--media-image',\n });\n\n return (\n <PrimitivePrompt\n id={id}\n sentiment={sentiment}\n data-testid={testId}\n className={clsx(\n 'wds-action-prompt',\n { 'wds-action-prompt--with-two-actions': !!actionSecondary },\n className,\n )}\n media={renderMedia()}\n actions={\n <>\n {actionSecondary && (\n // @ts-expect-error onClick type mismatch\n <Button\n v2\n size=\"md\"\n priority=\"secondary\"\n href={actionSecondary.href}\n block={isMobile}\n onClick={actionSecondary?.onClick}\n >\n {actionSecondary.label}\n </Button>\n )}\n {/* @ts-expect-error onClick type mismatch */}\n <Button\n v2\n size=\"md\"\n priority=\"primary\"\n href={action.href}\n block={isMobile}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n </>\n }\n role=\"region\"\n onDismiss={onDismiss}\n {...(ariaLabel\n ? { 'aria-label': ariaLabel }\n : {\n 'aria-labelledby': ariaLabelledByIds,\n 'aria-describedby': descId,\n })}\n >\n <div className={clsx('d-flex', 'flex-column', 'justify-content-center')}>\n <Body id={titleId} type={Typography.BODY_LARGE_BOLD} className=\"wds-action-prompt__content\">\n {title}\n </Body>\n {description && (\n <Body id={descId} className=\"wds-action-prompt__content\">\n {description}\n </Body>\n )}\n </div>\n </PrimitivePrompt>\n );\n};\n\nexport default ActionPrompt;\n"],"names":["ActionPrompt","sentiment","title","description","onDismiss","media","action","actionSecondary","id","className","testId","ariaLabel","isMobile","useScreenSize","Breakpoint","MEDIUM","mediaId","useId","titleId","descId","ariaLabelledByIds","undefined","filter","Boolean","join","renderMedia","renderPromptMedia","imgClassName","_jsx","PrimitivePrompt","clsx","actions","_jsxs","_Fragment","children","Button","v2","size","priority","href","block","onClick","label","role","Body","type","Typography","BODY_LARGE_BOLD"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { useId } from 'react';
|
|
2
2
|
import { clsx } from 'clsx';
|
|
3
|
-
import StatusIcon from '../../statusIcon/StatusIcon.mjs';
|
|
4
3
|
import Body from '../../body/Body.mjs';
|
|
5
4
|
import Button from '../../button/Button.resolver.mjs';
|
|
6
5
|
import '../../common/theme.mjs';
|
|
@@ -22,14 +21,13 @@ import '../../common/propsValues/variant.mjs';
|
|
|
22
21
|
import '../../common/propsValues/scroll.mjs';
|
|
23
22
|
import '../../common/propsValues/markdownNodeType.mjs';
|
|
24
23
|
import '../../common/fileType.mjs';
|
|
25
|
-
import
|
|
24
|
+
import '@transferwise/icons';
|
|
26
25
|
import 'react-intl';
|
|
27
26
|
import '../../common/closeButton/CloseButton.messages.mjs';
|
|
28
27
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
29
|
-
import AvatarView from '../../avatarView/AvatarView.mjs';
|
|
30
|
-
import Image from '../../image/Image.mjs';
|
|
31
28
|
import { PrimitivePrompt } from '../PrimitivePrompt/PrimitivePrompt.mjs';
|
|
32
29
|
import { useScreenSize } from '../../common/hooks/useScreenSize.mjs';
|
|
30
|
+
import { renderPromptMedia } from '../helpers/promptMedia.mjs';
|
|
33
31
|
|
|
34
32
|
const ActionPrompt = ({
|
|
35
33
|
sentiment = 'neutral',
|
|
@@ -49,42 +47,12 @@ const ActionPrompt = ({
|
|
|
49
47
|
const titleId = useId();
|
|
50
48
|
const descId = useId();
|
|
51
49
|
const ariaLabelledByIds = [media['aria-hidden'] ? undefined : mediaId, ariaLabel ? undefined : titleId].filter(Boolean).join(' ');
|
|
52
|
-
const renderMedia = () => {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
alt: media['aria-label'] ?? ''
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
if (media?.avatar) {
|
|
62
|
-
const badge = media.avatar.badge ? media.avatar.badge : sentiment === 'proposition' ? {} : {
|
|
63
|
-
status: sentiment
|
|
64
|
-
};
|
|
65
|
-
return /*#__PURE__*/jsx(AvatarView, {
|
|
66
|
-
...media.avatar,
|
|
67
|
-
badge: badge,
|
|
68
|
-
"aria-label": media['aria-label'],
|
|
69
|
-
"aria-hidden": media['aria-hidden'],
|
|
70
|
-
id: mediaId,
|
|
71
|
-
size: 48,
|
|
72
|
-
children: media.avatar.asset
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
return sentiment === 'proposition' ? /*#__PURE__*/jsx(AvatarView, {
|
|
76
|
-
id: mediaId,
|
|
77
|
-
size: 48,
|
|
78
|
-
"aria-label": media['aria-label'],
|
|
79
|
-
"aria-hidden": media['aria-hidden'],
|
|
80
|
-
children: /*#__PURE__*/jsx(GiftBox, {})
|
|
81
|
-
}) : /*#__PURE__*/jsx(StatusIcon, {
|
|
82
|
-
id: mediaId,
|
|
83
|
-
size: 48,
|
|
84
|
-
sentiment: sentiment,
|
|
85
|
-
iconLabel: media['aria-hidden'] ? null : media['aria-label']
|
|
86
|
-
});
|
|
87
|
-
};
|
|
50
|
+
const renderMedia = () => renderPromptMedia({
|
|
51
|
+
media,
|
|
52
|
+
sentiment,
|
|
53
|
+
mediaId,
|
|
54
|
+
imgClassName: 'wds-action-prompt--media-image'
|
|
55
|
+
});
|
|
88
56
|
return /*#__PURE__*/jsx(PrimitivePrompt, {
|
|
89
57
|
id: id,
|
|
90
58
|
sentiment: sentiment,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionPrompt.mjs","sources":["../../../src/prompt/ActionPrompt/ActionPrompt.tsx"],"sourcesContent":["import { AriaAttributes, ReactNode, useId } from 'react';\nimport { clsx } from 'clsx';\n\nimport
|
|
1
|
+
{"version":3,"file":"ActionPrompt.mjs","sources":["../../../src/prompt/ActionPrompt/ActionPrompt.tsx"],"sourcesContent":["import { AriaAttributes, ReactNode, useId } from 'react';\nimport { clsx } from 'clsx';\n\nimport Body from '../../body';\nimport Button from '../../button';\nimport { Breakpoint, Typography } from '../../common';\nimport { ButtonProps } from '../../button/Button.types';\nimport { PrimitivePrompt, PrimitivePromptProps } from '../PrimitivePrompt';\nimport { useScreenSize } from '../../common/hooks/useScreenSize';\nimport { renderPromptMedia, PromptMedia } from '../helpers/promptMedia';\n\nexport type ActionPromptProps = {\n title: ReactNode;\n description?: ReactNode;\n /** @default {} */\n media?: PromptMedia;\n action: Pick<ButtonProps, 'onClick' | 'href' | 'target'> & {\n label: ButtonProps['children'];\n };\n actionSecondary?: Pick<ButtonProps, 'onClick' | 'href' | 'target'> & {\n label: ButtonProps['children'];\n };\n 'aria-label'?: AriaAttributes['aria-label'];\n} & Pick<PrimitivePromptProps, 'id' | 'className' | 'data-testid' | 'onDismiss'> & {\n /**\n * The sentiment determines the colour scheme\n * @default 'neutral'\n */\n sentiment?: PrimitivePromptProps['sentiment'];\n };\n\n/**\n * Use an action prompt for optional feedback that doesn't require immediate action, such as feature upsells, warnings, or suggestions. These prompts are typically used outside of core product flows (e.g., Launchpad, Recipient, or Transaction screens) and can be addressed at the user's convenience.\n *\n * If your message is about immediate user feedback (e.g., form submission errors, download failures, missing data warnings), use an [info prompt](https://storybook.wise.design/?path=/docs/prompts-infoprompt--docs) instead.\n *\n * Guidance can be found in the [design system](https://wise.design/components/action-prompt).\n */\nexport const ActionPrompt = ({\n sentiment = 'neutral',\n title,\n description,\n onDismiss,\n media = {},\n action,\n actionSecondary,\n id,\n className,\n 'data-testid': testId,\n 'aria-label': ariaLabel,\n}: ActionPromptProps) => {\n const isMobile = !useScreenSize(Breakpoint.MEDIUM);\n\n const mediaId = useId();\n const titleId = useId();\n const descId = useId();\n\n const ariaLabelledByIds = [\n media['aria-hidden'] ? undefined : mediaId,\n ariaLabel ? undefined : titleId,\n ]\n .filter(Boolean)\n .join(' ');\n\n const renderMedia = () =>\n renderPromptMedia({\n media,\n sentiment,\n mediaId,\n imgClassName: 'wds-action-prompt--media-image',\n });\n\n return (\n <PrimitivePrompt\n id={id}\n sentiment={sentiment}\n data-testid={testId}\n className={clsx(\n 'wds-action-prompt',\n { 'wds-action-prompt--with-two-actions': !!actionSecondary },\n className,\n )}\n media={renderMedia()}\n actions={\n <>\n {actionSecondary && (\n // @ts-expect-error onClick type mismatch\n <Button\n v2\n size=\"md\"\n priority=\"secondary\"\n href={actionSecondary.href}\n block={isMobile}\n onClick={actionSecondary?.onClick}\n >\n {actionSecondary.label}\n </Button>\n )}\n {/* @ts-expect-error onClick type mismatch */}\n <Button\n v2\n size=\"md\"\n priority=\"primary\"\n href={action.href}\n block={isMobile}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n </>\n }\n role=\"region\"\n onDismiss={onDismiss}\n {...(ariaLabel\n ? { 'aria-label': ariaLabel }\n : {\n 'aria-labelledby': ariaLabelledByIds,\n 'aria-describedby': descId,\n })}\n >\n <div className={clsx('d-flex', 'flex-column', 'justify-content-center')}>\n <Body id={titleId} type={Typography.BODY_LARGE_BOLD} className=\"wds-action-prompt__content\">\n {title}\n </Body>\n {description && (\n <Body id={descId} className=\"wds-action-prompt__content\">\n {description}\n </Body>\n )}\n </div>\n </PrimitivePrompt>\n );\n};\n\nexport default ActionPrompt;\n"],"names":["ActionPrompt","sentiment","title","description","onDismiss","media","action","actionSecondary","id","className","testId","ariaLabel","isMobile","useScreenSize","Breakpoint","MEDIUM","mediaId","useId","titleId","descId","ariaLabelledByIds","undefined","filter","Boolean","join","renderMedia","renderPromptMedia","imgClassName","_jsx","PrimitivePrompt","clsx","actions","_jsxs","_Fragment","children","Button","v2","size","priority","href","block","onClick","label","role","Body","type","Typography","BODY_LARGE_BOLD"],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var clsx = require('clsx');
|
|
5
|
+
var Body = require('../../body/Body.js');
|
|
6
|
+
var Button_resolver = require('../../button/Button.resolver.js');
|
|
7
|
+
require('../../common/theme.js');
|
|
8
|
+
require('../../common/direction.js');
|
|
9
|
+
require('../../common/propsValues/control.js');
|
|
10
|
+
var breakpoint = require('../../common/propsValues/breakpoint.js');
|
|
11
|
+
require('../../common/propsValues/size.js');
|
|
12
|
+
var typography = require('../../common/propsValues/typography.js');
|
|
13
|
+
require('../../common/propsValues/width.js');
|
|
14
|
+
require('../../common/propsValues/type.js');
|
|
15
|
+
require('../../common/propsValues/dateMode.js');
|
|
16
|
+
require('../../common/propsValues/monthFormat.js');
|
|
17
|
+
require('../../common/propsValues/position.js');
|
|
18
|
+
require('../../common/propsValues/layouts.js');
|
|
19
|
+
require('../../common/propsValues/status.js');
|
|
20
|
+
require('../../common/propsValues/sentiment.js');
|
|
21
|
+
require('../../common/propsValues/profileType.js');
|
|
22
|
+
require('../../common/propsValues/variant.js');
|
|
23
|
+
require('../../common/propsValues/scroll.js');
|
|
24
|
+
require('../../common/propsValues/markdownNodeType.js');
|
|
25
|
+
require('../../common/fileType.js');
|
|
26
|
+
require('@transferwise/icons');
|
|
27
|
+
require('react-intl');
|
|
28
|
+
require('../../common/closeButton/CloseButton.messages.js');
|
|
29
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
30
|
+
var LiveRegion = require('../../common/liveRegion/LiveRegion.js');
|
|
31
|
+
var PrimitivePrompt = require('../PrimitivePrompt/PrimitivePrompt.js');
|
|
32
|
+
var useScreenSize = require('../../common/hooks/useScreenSize.js');
|
|
33
|
+
var promptMedia = require('../helpers/promptMedia.js');
|
|
34
|
+
var Expander = require('../common/Expander/Expander.js');
|
|
35
|
+
var helpers = require('./helpers.js');
|
|
36
|
+
|
|
37
|
+
const CriticalBanner = ({
|
|
38
|
+
sentiment = 'negative',
|
|
39
|
+
title,
|
|
40
|
+
description,
|
|
41
|
+
media = {},
|
|
42
|
+
action,
|
|
43
|
+
actionSecondary,
|
|
44
|
+
expanded = true,
|
|
45
|
+
onToggle,
|
|
46
|
+
id,
|
|
47
|
+
className,
|
|
48
|
+
'data-testid': testId,
|
|
49
|
+
'aria-label': ariaLabel
|
|
50
|
+
}) => {
|
|
51
|
+
const isMobile = !useScreenSize.useScreenSize(breakpoint.Breakpoint.MEDIUM);
|
|
52
|
+
const mediaId = React.useId();
|
|
53
|
+
const titleId = React.useId();
|
|
54
|
+
const descId = React.useId();
|
|
55
|
+
const ariaLabelledByIds = [media['aria-hidden'] ? undefined : mediaId, ariaLabel || !title ? undefined : titleId].filter(Boolean).join(' ');
|
|
56
|
+
const hasActions = action || actionSecondary;
|
|
57
|
+
return /*#__PURE__*/jsxRuntime.jsx(LiveRegion.LiveRegion, {
|
|
58
|
+
"aria-live": "assertive",
|
|
59
|
+
announceOnChange: helpers.buildAnnouncementString({
|
|
60
|
+
title,
|
|
61
|
+
description,
|
|
62
|
+
expanded,
|
|
63
|
+
actionLabel: action?.label,
|
|
64
|
+
actionSecondaryLabel: actionSecondary?.label
|
|
65
|
+
}),
|
|
66
|
+
children: /*#__PURE__*/jsxRuntime.jsxs(PrimitivePrompt.PrimitivePrompt, {
|
|
67
|
+
id: id,
|
|
68
|
+
sentiment: sentiment,
|
|
69
|
+
emphasis: sentiment === 'neutral' ? 'base' : 'elevated',
|
|
70
|
+
"data-testid": testId,
|
|
71
|
+
className: clsx.clsx('wds-critical-banner', {
|
|
72
|
+
'wds-critical-banner--collapsed': !expanded,
|
|
73
|
+
'wds-critical-banner--with-two-actions': !!actionSecondary
|
|
74
|
+
}, className),
|
|
75
|
+
media: promptMedia.renderPromptMedia({
|
|
76
|
+
media,
|
|
77
|
+
sentiment,
|
|
78
|
+
mediaId,
|
|
79
|
+
imgClassName: 'wds-critical-banner--media-image'
|
|
80
|
+
}),
|
|
81
|
+
actions: Expander.shouldShowWhenExpanded({
|
|
82
|
+
expanded,
|
|
83
|
+
hasContent: !!hasActions
|
|
84
|
+
}) ? /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
85
|
+
children: [actionSecondary &&
|
|
86
|
+
/*#__PURE__*/
|
|
87
|
+
// @ts-expect-error onClick type mismatch
|
|
88
|
+
jsxRuntime.jsx(Button_resolver.default, {
|
|
89
|
+
v2: true,
|
|
90
|
+
size: "md",
|
|
91
|
+
priority: "secondary",
|
|
92
|
+
href: actionSecondary.href,
|
|
93
|
+
block: isMobile,
|
|
94
|
+
onClick: actionSecondary?.onClick,
|
|
95
|
+
children: actionSecondary.label
|
|
96
|
+
}), action &&
|
|
97
|
+
/*#__PURE__*/
|
|
98
|
+
// @ts-expect-error onClick type mismatch
|
|
99
|
+
jsxRuntime.jsx(Button_resolver.default, {
|
|
100
|
+
v2: true,
|
|
101
|
+
size: "md",
|
|
102
|
+
priority: "primary",
|
|
103
|
+
href: action.href,
|
|
104
|
+
block: isMobile,
|
|
105
|
+
onClick: action.onClick,
|
|
106
|
+
children: action.label
|
|
107
|
+
})]
|
|
108
|
+
}) : undefined,
|
|
109
|
+
role: "region",
|
|
110
|
+
...(ariaLabel ? {
|
|
111
|
+
'aria-label': ariaLabel
|
|
112
|
+
} : {
|
|
113
|
+
'aria-labelledby': ariaLabelledByIds,
|
|
114
|
+
'aria-describedby': descId
|
|
115
|
+
}),
|
|
116
|
+
children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
117
|
+
className: clsx.clsx('d-flex', 'flex-column', 'justify-content-center', 'wds-critical-banner__text-wrapper'),
|
|
118
|
+
children: [title && /*#__PURE__*/jsxRuntime.jsx(Body.default, {
|
|
119
|
+
id: titleId,
|
|
120
|
+
type: typography.Typography.BODY_LARGE_BOLD,
|
|
121
|
+
className: "wds-critical-banner__content",
|
|
122
|
+
children: title
|
|
123
|
+
}), Expander.shouldShowWhenExpanded({
|
|
124
|
+
expanded,
|
|
125
|
+
hasContent: !!description,
|
|
126
|
+
alwaysShow: !title
|
|
127
|
+
}) && /*#__PURE__*/jsxRuntime.jsx(Body.default, {
|
|
128
|
+
id: descId,
|
|
129
|
+
className: clsx.clsx('wds-critical-banner__content', {
|
|
130
|
+
'wds-critical-banner__description--collapsed': !expanded && !title
|
|
131
|
+
}),
|
|
132
|
+
children: description
|
|
133
|
+
})]
|
|
134
|
+
}), /*#__PURE__*/jsxRuntime.jsx(Expander.ExpanderToggle, {
|
|
135
|
+
expanded: expanded,
|
|
136
|
+
size: 24,
|
|
137
|
+
className: "wds-critical-banner__toggle",
|
|
138
|
+
onToggle: onToggle
|
|
139
|
+
})]
|
|
140
|
+
})
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
exports.CriticalBanner = CriticalBanner;
|
|
145
|
+
//# sourceMappingURL=CriticalBanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CriticalBanner.js","sources":["../../../src/prompt/CriticalBanner/CriticalBanner.tsx"],"sourcesContent":["import { AriaAttributes, ReactNode, useId } from 'react';\nimport { clsx } from 'clsx';\n\nimport Body from '../../body';\nimport Button from '../../button';\nimport { Breakpoint, LiveRegion, Typography } from '../../common';\nimport { ButtonProps } from '../../button/Button.types';\nimport { PrimitivePrompt, PrimitivePromptProps } from '../PrimitivePrompt';\nimport { useScreenSize } from '../../common/hooks/useScreenSize';\n\nimport { renderPromptMedia, PromptMedia } from '../helpers/promptMedia';\nimport { shouldShowWhenExpanded, ExpanderToggle } from '../common/Expander/Expander';\nimport { buildAnnouncementString } from './helpers';\n\nexport type CriticalBannerProps = {\n title?: ReactNode;\n description?: ReactNode;\n media?: PromptMedia;\n action?: Pick<ButtonProps, 'onClick' | 'href' | 'target'> & {\n label: ButtonProps['children'];\n };\n actionSecondary?: Pick<ButtonProps, 'onClick' | 'href' | 'target'> & {\n label: ButtonProps['children'];\n };\n sentiment?: Exclude<PrimitivePromptProps['sentiment'], 'proposition'>;\n /**\n * Controls whether the description and actions are visible.\n * When collapsed with a title, only the title is shown.\n * When collapsed without a title, the description is trimmed to 2 lines.\n */\n expanded?: boolean;\n /** Called when the user clicks the chevron toggle. */\n onToggle?: () => void;\n /**\n * Overrides the default labelling derived from `title` and `description`.\n *\n * **NB:** When provided, the default `aria-labelledby` / `aria-describedby`\n * attributes are removed — include all necessary context in the label.\n */\n 'aria-label'?: AriaAttributes['aria-label'];\n} & Pick<PrimitivePromptProps, 'id' | 'className' | 'data-testid'>;\n\n/**\n * A full-width, non-dismissible banner for critical messages such as account blocks or\n * time-sensitive actions that require immediate user attention.\n\n * @see {@link https://wise.design/components/critical-banner Design Spec}\n */\nexport const CriticalBanner = ({\n sentiment = 'negative',\n title,\n description,\n media = {},\n action,\n actionSecondary,\n expanded = true,\n onToggle,\n id,\n className,\n 'data-testid': testId,\n 'aria-label': ariaLabel,\n}: CriticalBannerProps) => {\n const isMobile = !useScreenSize(Breakpoint.MEDIUM);\n const mediaId = useId();\n const titleId = useId();\n const descId = useId();\n\n const ariaLabelledByIds = [\n media['aria-hidden'] ? undefined : mediaId,\n ariaLabel || !title ? undefined : titleId,\n ]\n .filter(Boolean)\n .join(' ');\n const hasActions = action || actionSecondary;\n\n return (\n <LiveRegion\n aria-live=\"assertive\"\n announceOnChange={buildAnnouncementString({\n title,\n description,\n expanded,\n actionLabel: action?.label,\n actionSecondaryLabel: actionSecondary?.label,\n })}\n >\n <PrimitivePrompt\n id={id}\n sentiment={sentiment}\n emphasis={sentiment === 'neutral' ? 'base' : 'elevated'}\n data-testid={testId}\n className={clsx(\n 'wds-critical-banner',\n {\n 'wds-critical-banner--collapsed': !expanded,\n 'wds-critical-banner--with-two-actions': !!actionSecondary,\n },\n className,\n )}\n media={renderPromptMedia({\n media,\n sentiment,\n mediaId,\n imgClassName: 'wds-critical-banner--media-image',\n })}\n actions={\n shouldShowWhenExpanded({ expanded, hasContent: !!hasActions }) ? (\n <>\n {actionSecondary && (\n // @ts-expect-error onClick type mismatch\n <Button\n v2\n size=\"md\"\n priority=\"secondary\"\n href={actionSecondary.href}\n block={isMobile}\n onClick={actionSecondary?.onClick}\n >\n {actionSecondary.label}\n </Button>\n )}\n {action && (\n // @ts-expect-error onClick type mismatch\n <Button\n v2\n size=\"md\"\n priority=\"primary\"\n href={action.href}\n block={isMobile}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n )}\n </>\n ) : undefined\n }\n role=\"region\"\n {...(ariaLabel\n ? { 'aria-label': ariaLabel }\n : {\n 'aria-labelledby': ariaLabelledByIds,\n 'aria-describedby': descId,\n })}\n >\n <div\n className={clsx(\n 'd-flex',\n 'flex-column',\n 'justify-content-center',\n 'wds-critical-banner__text-wrapper',\n )}\n >\n {title && (\n <Body\n id={titleId}\n type={Typography.BODY_LARGE_BOLD}\n className=\"wds-critical-banner__content\"\n >\n {title}\n </Body>\n )}\n {shouldShowWhenExpanded({ expanded, hasContent: !!description, alwaysShow: !title }) && (\n <Body\n id={descId}\n className={clsx('wds-critical-banner__content', {\n 'wds-critical-banner__description--collapsed': !expanded && !title,\n })}\n >\n {description}\n </Body>\n )}\n </div>\n <ExpanderToggle\n expanded={expanded}\n size={24}\n className=\"wds-critical-banner__toggle\"\n onToggle={onToggle}\n />\n </PrimitivePrompt>\n </LiveRegion>\n );\n};\n\nexport default CriticalBanner;\n"],"names":["CriticalBanner","sentiment","title","description","media","action","actionSecondary","expanded","onToggle","id","className","testId","ariaLabel","isMobile","useScreenSize","Breakpoint","MEDIUM","mediaId","useId","titleId","descId","ariaLabelledByIds","undefined","filter","Boolean","join","hasActions","_jsx","LiveRegion","announceOnChange","buildAnnouncementString","actionLabel","label","actionSecondaryLabel","children","_jsxs","PrimitivePrompt","emphasis","clsx","renderPromptMedia","imgClassName","actions","shouldShowWhenExpanded","hasContent","_Fragment","Button","v2","size","priority","href","block","onClick","role","Body","type","Typography","BODY_LARGE_BOLD","alwaysShow","ExpanderToggle"],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { useId } from 'react';
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import Body from '../../body/Body.mjs';
|
|
4
|
+
import Button from '../../button/Button.resolver.mjs';
|
|
5
|
+
import '../../common/theme.mjs';
|
|
6
|
+
import '../../common/direction.mjs';
|
|
7
|
+
import '../../common/propsValues/control.mjs';
|
|
8
|
+
import { Breakpoint } from '../../common/propsValues/breakpoint.mjs';
|
|
9
|
+
import '../../common/propsValues/size.mjs';
|
|
10
|
+
import { Typography } from '../../common/propsValues/typography.mjs';
|
|
11
|
+
import '../../common/propsValues/width.mjs';
|
|
12
|
+
import '../../common/propsValues/type.mjs';
|
|
13
|
+
import '../../common/propsValues/dateMode.mjs';
|
|
14
|
+
import '../../common/propsValues/monthFormat.mjs';
|
|
15
|
+
import '../../common/propsValues/position.mjs';
|
|
16
|
+
import '../../common/propsValues/layouts.mjs';
|
|
17
|
+
import '../../common/propsValues/status.mjs';
|
|
18
|
+
import '../../common/propsValues/sentiment.mjs';
|
|
19
|
+
import '../../common/propsValues/profileType.mjs';
|
|
20
|
+
import '../../common/propsValues/variant.mjs';
|
|
21
|
+
import '../../common/propsValues/scroll.mjs';
|
|
22
|
+
import '../../common/propsValues/markdownNodeType.mjs';
|
|
23
|
+
import '../../common/fileType.mjs';
|
|
24
|
+
import '@transferwise/icons';
|
|
25
|
+
import 'react-intl';
|
|
26
|
+
import '../../common/closeButton/CloseButton.messages.mjs';
|
|
27
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
28
|
+
import { LiveRegion } from '../../common/liveRegion/LiveRegion.mjs';
|
|
29
|
+
import { PrimitivePrompt } from '../PrimitivePrompt/PrimitivePrompt.mjs';
|
|
30
|
+
import { useScreenSize } from '../../common/hooks/useScreenSize.mjs';
|
|
31
|
+
import { renderPromptMedia } from '../helpers/promptMedia.mjs';
|
|
32
|
+
import { shouldShowWhenExpanded, ExpanderToggle } from '../common/Expander/Expander.mjs';
|
|
33
|
+
import { buildAnnouncementString } from './helpers.mjs';
|
|
34
|
+
|
|
35
|
+
const CriticalBanner = ({
|
|
36
|
+
sentiment = 'negative',
|
|
37
|
+
title,
|
|
38
|
+
description,
|
|
39
|
+
media = {},
|
|
40
|
+
action,
|
|
41
|
+
actionSecondary,
|
|
42
|
+
expanded = true,
|
|
43
|
+
onToggle,
|
|
44
|
+
id,
|
|
45
|
+
className,
|
|
46
|
+
'data-testid': testId,
|
|
47
|
+
'aria-label': ariaLabel
|
|
48
|
+
}) => {
|
|
49
|
+
const isMobile = !useScreenSize(Breakpoint.MEDIUM);
|
|
50
|
+
const mediaId = useId();
|
|
51
|
+
const titleId = useId();
|
|
52
|
+
const descId = useId();
|
|
53
|
+
const ariaLabelledByIds = [media['aria-hidden'] ? undefined : mediaId, ariaLabel || !title ? undefined : titleId].filter(Boolean).join(' ');
|
|
54
|
+
const hasActions = action || actionSecondary;
|
|
55
|
+
return /*#__PURE__*/jsx(LiveRegion, {
|
|
56
|
+
"aria-live": "assertive",
|
|
57
|
+
announceOnChange: buildAnnouncementString({
|
|
58
|
+
title,
|
|
59
|
+
description,
|
|
60
|
+
expanded,
|
|
61
|
+
actionLabel: action?.label,
|
|
62
|
+
actionSecondaryLabel: actionSecondary?.label
|
|
63
|
+
}),
|
|
64
|
+
children: /*#__PURE__*/jsxs(PrimitivePrompt, {
|
|
65
|
+
id: id,
|
|
66
|
+
sentiment: sentiment,
|
|
67
|
+
emphasis: sentiment === 'neutral' ? 'base' : 'elevated',
|
|
68
|
+
"data-testid": testId,
|
|
69
|
+
className: clsx('wds-critical-banner', {
|
|
70
|
+
'wds-critical-banner--collapsed': !expanded,
|
|
71
|
+
'wds-critical-banner--with-two-actions': !!actionSecondary
|
|
72
|
+
}, className),
|
|
73
|
+
media: renderPromptMedia({
|
|
74
|
+
media,
|
|
75
|
+
sentiment,
|
|
76
|
+
mediaId,
|
|
77
|
+
imgClassName: 'wds-critical-banner--media-image'
|
|
78
|
+
}),
|
|
79
|
+
actions: shouldShowWhenExpanded({
|
|
80
|
+
expanded,
|
|
81
|
+
hasContent: !!hasActions
|
|
82
|
+
}) ? /*#__PURE__*/jsxs(Fragment, {
|
|
83
|
+
children: [actionSecondary &&
|
|
84
|
+
/*#__PURE__*/
|
|
85
|
+
// @ts-expect-error onClick type mismatch
|
|
86
|
+
jsx(Button, {
|
|
87
|
+
v2: true,
|
|
88
|
+
size: "md",
|
|
89
|
+
priority: "secondary",
|
|
90
|
+
href: actionSecondary.href,
|
|
91
|
+
block: isMobile,
|
|
92
|
+
onClick: actionSecondary?.onClick,
|
|
93
|
+
children: actionSecondary.label
|
|
94
|
+
}), action &&
|
|
95
|
+
/*#__PURE__*/
|
|
96
|
+
// @ts-expect-error onClick type mismatch
|
|
97
|
+
jsx(Button, {
|
|
98
|
+
v2: true,
|
|
99
|
+
size: "md",
|
|
100
|
+
priority: "primary",
|
|
101
|
+
href: action.href,
|
|
102
|
+
block: isMobile,
|
|
103
|
+
onClick: action.onClick,
|
|
104
|
+
children: action.label
|
|
105
|
+
})]
|
|
106
|
+
}) : undefined,
|
|
107
|
+
role: "region",
|
|
108
|
+
...(ariaLabel ? {
|
|
109
|
+
'aria-label': ariaLabel
|
|
110
|
+
} : {
|
|
111
|
+
'aria-labelledby': ariaLabelledByIds,
|
|
112
|
+
'aria-describedby': descId
|
|
113
|
+
}),
|
|
114
|
+
children: [/*#__PURE__*/jsxs("div", {
|
|
115
|
+
className: clsx('d-flex', 'flex-column', 'justify-content-center', 'wds-critical-banner__text-wrapper'),
|
|
116
|
+
children: [title && /*#__PURE__*/jsx(Body, {
|
|
117
|
+
id: titleId,
|
|
118
|
+
type: Typography.BODY_LARGE_BOLD,
|
|
119
|
+
className: "wds-critical-banner__content",
|
|
120
|
+
children: title
|
|
121
|
+
}), shouldShowWhenExpanded({
|
|
122
|
+
expanded,
|
|
123
|
+
hasContent: !!description,
|
|
124
|
+
alwaysShow: !title
|
|
125
|
+
}) && /*#__PURE__*/jsx(Body, {
|
|
126
|
+
id: descId,
|
|
127
|
+
className: clsx('wds-critical-banner__content', {
|
|
128
|
+
'wds-critical-banner__description--collapsed': !expanded && !title
|
|
129
|
+
}),
|
|
130
|
+
children: description
|
|
131
|
+
})]
|
|
132
|
+
}), /*#__PURE__*/jsx(ExpanderToggle, {
|
|
133
|
+
expanded: expanded,
|
|
134
|
+
size: 24,
|
|
135
|
+
className: "wds-critical-banner__toggle",
|
|
136
|
+
onToggle: onToggle
|
|
137
|
+
})]
|
|
138
|
+
})
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
export { CriticalBanner };
|
|
143
|
+
//# sourceMappingURL=CriticalBanner.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CriticalBanner.mjs","sources":["../../../src/prompt/CriticalBanner/CriticalBanner.tsx"],"sourcesContent":["import { AriaAttributes, ReactNode, useId } from 'react';\nimport { clsx } from 'clsx';\n\nimport Body from '../../body';\nimport Button from '../../button';\nimport { Breakpoint, LiveRegion, Typography } from '../../common';\nimport { ButtonProps } from '../../button/Button.types';\nimport { PrimitivePrompt, PrimitivePromptProps } from '../PrimitivePrompt';\nimport { useScreenSize } from '../../common/hooks/useScreenSize';\n\nimport { renderPromptMedia, PromptMedia } from '../helpers/promptMedia';\nimport { shouldShowWhenExpanded, ExpanderToggle } from '../common/Expander/Expander';\nimport { buildAnnouncementString } from './helpers';\n\nexport type CriticalBannerProps = {\n title?: ReactNode;\n description?: ReactNode;\n media?: PromptMedia;\n action?: Pick<ButtonProps, 'onClick' | 'href' | 'target'> & {\n label: ButtonProps['children'];\n };\n actionSecondary?: Pick<ButtonProps, 'onClick' | 'href' | 'target'> & {\n label: ButtonProps['children'];\n };\n sentiment?: Exclude<PrimitivePromptProps['sentiment'], 'proposition'>;\n /**\n * Controls whether the description and actions are visible.\n * When collapsed with a title, only the title is shown.\n * When collapsed without a title, the description is trimmed to 2 lines.\n */\n expanded?: boolean;\n /** Called when the user clicks the chevron toggle. */\n onToggle?: () => void;\n /**\n * Overrides the default labelling derived from `title` and `description`.\n *\n * **NB:** When provided, the default `aria-labelledby` / `aria-describedby`\n * attributes are removed — include all necessary context in the label.\n */\n 'aria-label'?: AriaAttributes['aria-label'];\n} & Pick<PrimitivePromptProps, 'id' | 'className' | 'data-testid'>;\n\n/**\n * A full-width, non-dismissible banner for critical messages such as account blocks or\n * time-sensitive actions that require immediate user attention.\n\n * @see {@link https://wise.design/components/critical-banner Design Spec}\n */\nexport const CriticalBanner = ({\n sentiment = 'negative',\n title,\n description,\n media = {},\n action,\n actionSecondary,\n expanded = true,\n onToggle,\n id,\n className,\n 'data-testid': testId,\n 'aria-label': ariaLabel,\n}: CriticalBannerProps) => {\n const isMobile = !useScreenSize(Breakpoint.MEDIUM);\n const mediaId = useId();\n const titleId = useId();\n const descId = useId();\n\n const ariaLabelledByIds = [\n media['aria-hidden'] ? undefined : mediaId,\n ariaLabel || !title ? undefined : titleId,\n ]\n .filter(Boolean)\n .join(' ');\n const hasActions = action || actionSecondary;\n\n return (\n <LiveRegion\n aria-live=\"assertive\"\n announceOnChange={buildAnnouncementString({\n title,\n description,\n expanded,\n actionLabel: action?.label,\n actionSecondaryLabel: actionSecondary?.label,\n })}\n >\n <PrimitivePrompt\n id={id}\n sentiment={sentiment}\n emphasis={sentiment === 'neutral' ? 'base' : 'elevated'}\n data-testid={testId}\n className={clsx(\n 'wds-critical-banner',\n {\n 'wds-critical-banner--collapsed': !expanded,\n 'wds-critical-banner--with-two-actions': !!actionSecondary,\n },\n className,\n )}\n media={renderPromptMedia({\n media,\n sentiment,\n mediaId,\n imgClassName: 'wds-critical-banner--media-image',\n })}\n actions={\n shouldShowWhenExpanded({ expanded, hasContent: !!hasActions }) ? (\n <>\n {actionSecondary && (\n // @ts-expect-error onClick type mismatch\n <Button\n v2\n size=\"md\"\n priority=\"secondary\"\n href={actionSecondary.href}\n block={isMobile}\n onClick={actionSecondary?.onClick}\n >\n {actionSecondary.label}\n </Button>\n )}\n {action && (\n // @ts-expect-error onClick type mismatch\n <Button\n v2\n size=\"md\"\n priority=\"primary\"\n href={action.href}\n block={isMobile}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n )}\n </>\n ) : undefined\n }\n role=\"region\"\n {...(ariaLabel\n ? { 'aria-label': ariaLabel }\n : {\n 'aria-labelledby': ariaLabelledByIds,\n 'aria-describedby': descId,\n })}\n >\n <div\n className={clsx(\n 'd-flex',\n 'flex-column',\n 'justify-content-center',\n 'wds-critical-banner__text-wrapper',\n )}\n >\n {title && (\n <Body\n id={titleId}\n type={Typography.BODY_LARGE_BOLD}\n className=\"wds-critical-banner__content\"\n >\n {title}\n </Body>\n )}\n {shouldShowWhenExpanded({ expanded, hasContent: !!description, alwaysShow: !title }) && (\n <Body\n id={descId}\n className={clsx('wds-critical-banner__content', {\n 'wds-critical-banner__description--collapsed': !expanded && !title,\n })}\n >\n {description}\n </Body>\n )}\n </div>\n <ExpanderToggle\n expanded={expanded}\n size={24}\n className=\"wds-critical-banner__toggle\"\n onToggle={onToggle}\n />\n </PrimitivePrompt>\n </LiveRegion>\n );\n};\n\nexport default CriticalBanner;\n"],"names":["CriticalBanner","sentiment","title","description","media","action","actionSecondary","expanded","onToggle","id","className","testId","ariaLabel","isMobile","useScreenSize","Breakpoint","MEDIUM","mediaId","useId","titleId","descId","ariaLabelledByIds","undefined","filter","Boolean","join","hasActions","_jsx","LiveRegion","announceOnChange","buildAnnouncementString","actionLabel","label","actionSecondaryLabel","children","_jsxs","PrimitivePrompt","emphasis","clsx","renderPromptMedia","imgClassName","actions","shouldShowWhenExpanded","hasContent","_Fragment","Button","v2","size","priority","href","block","onClick","role","Body","type","Typography","BODY_LARGE_BOLD","alwaysShow","ExpanderToggle"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Helper to extract string from ReactNode for announcements.
|
|
5
|
+
* Complex ReactNodes (JSX elements) return empty string.
|
|
6
|
+
*/
|
|
7
|
+
const getStringValue = node => {
|
|
8
|
+
if (typeof node === 'string' || typeof node === 'number') {
|
|
9
|
+
return String(node);
|
|
10
|
+
}
|
|
11
|
+
return '';
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Builds the announcement string from visible content only.
|
|
15
|
+
* Content visibility depends on expanded state and presence of title.
|
|
16
|
+
*/
|
|
17
|
+
const buildAnnouncementString = ({
|
|
18
|
+
title,
|
|
19
|
+
description,
|
|
20
|
+
expanded,
|
|
21
|
+
actionLabel,
|
|
22
|
+
actionSecondaryLabel
|
|
23
|
+
}) => {
|
|
24
|
+
return [title ? getStringValue(title) : undefined, description && (expanded || !title) ? getStringValue(description) : undefined, expanded && actionLabel ? getStringValue(actionLabel) : undefined, expanded && actionSecondaryLabel ? getStringValue(actionSecondaryLabel) : undefined].filter(Boolean).join('|');
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
exports.buildAnnouncementString = buildAnnouncementString;
|
|
28
|
+
exports.getStringValue = getStringValue;
|
|
29
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../src/prompt/CriticalBanner/helpers.ts"],"sourcesContent":["import { ReactNode } from 'react';\n\n/**\n * Helper to extract string from ReactNode for announcements.\n * Complex ReactNodes (JSX elements) return empty string.\n */\nexport const getStringValue = (node: ReactNode): string => {\n if (typeof node === 'string' || typeof node === 'number') {\n return String(node);\n }\n return '';\n};\n\n/**\n * Builds the announcement string from visible content only.\n * Content visibility depends on expanded state and presence of title.\n */\nexport const buildAnnouncementString = ({\n title,\n description,\n expanded,\n actionLabel,\n actionSecondaryLabel,\n}: {\n title?: ReactNode;\n description?: ReactNode;\n expanded: boolean;\n actionLabel?: ReactNode;\n actionSecondaryLabel?: ReactNode;\n}): string => {\n return [\n title ? getStringValue(title) : undefined,\n description && (expanded || !title) ? getStringValue(description) : undefined,\n expanded && actionLabel ? getStringValue(actionLabel) : undefined,\n expanded && actionSecondaryLabel ? getStringValue(actionSecondaryLabel) : undefined,\n ]\n .filter(Boolean)\n .join('|');\n};\n"],"names":["getStringValue","node","String","buildAnnouncementString","title","description","expanded","actionLabel","actionSecondaryLabel","undefined","filter","Boolean","join"],"mappings":";;AAEA;;;AAGG;AACI,MAAMA,cAAc,GAAIC,IAAe,IAAY;EACxD,IAAI,OAAOA,IAAI,KAAK,QAAQ,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;IACxD,OAAOC,MAAM,CAACD,IAAI,CAAC;AACrB,EAAA;AACA,EAAA,OAAO,EAAE;AACX;AAEA;;;AAGG;AACI,MAAME,uBAAuB,GAAGA,CAAC;EACtCC,KAAK;EACLC,WAAW;EACXC,QAAQ;EACRC,WAAW;AACXC,EAAAA;AAAoB,CAOrB,KAAY;EACX,OAAO,CACLJ,KAAK,GAAGJ,cAAc,CAACI,KAAK,CAAC,GAAGK,SAAS,EACzCJ,WAAW,KAAKC,QAAQ,IAAI,CAACF,KAAK,CAAC,GAAGJ,cAAc,CAACK,WAAW,CAAC,GAAGI,SAAS,EAC7EH,QAAQ,IAAIC,WAAW,GAAGP,cAAc,CAACO,WAAW,CAAC,GAAGE,SAAS,EACjEH,QAAQ,IAAIE,oBAAoB,GAAGR,cAAc,CAACQ,oBAAoB,CAAC,GAAGC,SAAS,CACpF,CACEC,MAAM,CAACC,OAAO,CAAC,CACfC,IAAI,CAAC,GAAG,CAAC;AACd;;;;;"}
|