@transferwise/components 0.0.0-experimental-14ff413 → 0.0.0-experimental-8bafa84
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 +4 -4
- package/build/field/Field.mjs +4 -4
- 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 +4 -4
- package/build/listItem/Prompt/ListItemPrompt.mjs +4 -4
- package/build/main.css +85 -29
- 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 +46 -0
- package/build/prompt/common/Expander/Expander.js.map +1 -0
- package/build/prompt/common/Expander/Expander.mjs +43 -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/main.css +85 -29
- package/build/styles/prompt/CriticalBanner/CriticalBanner.css +39 -0
- package/build/styles/prompt/common/Expander/Expander.css +8 -0
- package/build/typeahead/Typeahead.js +4 -4
- package/build/typeahead/Typeahead.mjs +4 -4
- package/build/types/index.d.ts +2 -2
- package/build/types/index.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 +43 -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 +22 -0
- package/build/types/prompt/common/Expander/Expander.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/package.json +1 -1
- package/src/index.ts +2 -2
- package/src/main.css +85 -29
- package/src/main.less +3 -1
- 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 +476 -0
- package/src/prompt/CriticalBanner/CriticalBanner.test.story.tsx +67 -0
- package/src/prompt/CriticalBanner/CriticalBanner.tsx +189 -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.test.tsx +176 -0
- package/src/prompt/common/Expander/Expander.tsx +81 -0
- package/src/prompt/helpers/promptMedia.tsx +79 -0
- package/src/prompt/index.ts +4 -0
- package/src/sentimentSurface/SentimentSurface.story.tsx +43 -17
|
@@ -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 IconButton from '../../iconButton';\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 /** @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 /**\n * The sentiment determines the colour scheme\n * @default 'negative'\n */\n sentiment?: Exclude<PrimitivePromptProps['sentiment'], 'proposition'>;\n /**\n * Whether the banner is expanded (showing description and actions)\n */\n expanded: boolean;\n /**\n * Callback when the chevron toggle is clicked\n */\n onToggle: () => void;\n 'aria-label'?: AriaAttributes['aria-label'];\n} & Pick<PrimitivePromptProps, 'id' | 'className' | 'data-testid'>;\n\n/**\n * CriticalBanner is a full-width banner component for critical messages that require attention.\n * It features a collapsible design with a chevron toggle to show/hide description and action buttons.\n * Unlike ActionPrompt, it has no dismiss button and no border radius.\n *\n * The component is fully controlled - parent owns the `expanded` state and provides `onToggle` callback.\n *\n * **Accessibility:** Uses `aria-live=\"assertive\"` to immediately announce critical messages to screen readers.\n * See the Accessibility documentation for detailed information on announcement behavior and testing.\n */\nexport const CriticalBanner = ({\n sentiment = 'negative',\n title,\n description,\n media = {},\n action,\n actionSecondary,\n expanded,\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,
|
|
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 IconButton from '../../iconButton';\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 /** @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 /**\n * The sentiment determines the colour scheme\n * @default 'negative'\n */\n sentiment?: Exclude<PrimitivePromptProps['sentiment'], 'proposition'>;\n /**\n * Whether the banner is expanded (showing description and actions)\n */\n expanded: boolean;\n /**\n * Callback when the chevron toggle is clicked\n */\n onToggle: () => void;\n 'aria-label'?: AriaAttributes['aria-label'];\n} & Pick<PrimitivePromptProps, 'id' | 'className' | 'data-testid'>;\n\n/**\n * CriticalBanner is a full-width banner component for critical messages that require attention.\n * It features a collapsible design with a chevron toggle to show/hide description and action buttons.\n * Unlike ActionPrompt, it has no dismiss button and no border radius.\n *\n * The component is fully controlled - parent owns the `expanded` state and provides `onToggle` callback.\n *\n * **Accessibility:** Uses `aria-live=\"assertive\"` to immediately announce critical messages to screen readers.\n * See the Accessibility documentation for detailed information on announcement behavior and testing.\n */\nexport const CriticalBanner = ({\n sentiment = 'negative',\n title,\n description,\n media = {},\n action,\n actionSecondary,\n expanded,\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;;;;;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper to extract string from ReactNode for announcements.
|
|
3
|
+
* Complex ReactNodes (JSX elements) return empty string.
|
|
4
|
+
*/
|
|
5
|
+
const getStringValue = node => {
|
|
6
|
+
if (typeof node === 'string' || typeof node === 'number') {
|
|
7
|
+
return String(node);
|
|
8
|
+
}
|
|
9
|
+
return '';
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Builds the announcement string from visible content only.
|
|
13
|
+
* Content visibility depends on expanded state and presence of title.
|
|
14
|
+
*/
|
|
15
|
+
const buildAnnouncementString = ({
|
|
16
|
+
title,
|
|
17
|
+
description,
|
|
18
|
+
expanded,
|
|
19
|
+
actionLabel,
|
|
20
|
+
actionSecondaryLabel
|
|
21
|
+
}) => {
|
|
22
|
+
return [title ? getStringValue(title) : undefined, description && (expanded || !title) ? getStringValue(description) : undefined, expanded && actionLabel ? getStringValue(actionLabel) : undefined, expanded && actionSecondaryLabel ? getStringValue(actionSecondaryLabel) : undefined].filter(Boolean).join('|');
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export { buildAnnouncementString, getStringValue };
|
|
26
|
+
//# sourceMappingURL=helpers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.mjs","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;;;;"}
|
|
@@ -10,6 +10,7 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
10
10
|
|
|
11
11
|
const PrimitivePrompt = ({
|
|
12
12
|
sentiment = 'success',
|
|
13
|
+
emphasis = 'base',
|
|
13
14
|
media,
|
|
14
15
|
actions,
|
|
15
16
|
onDismiss,
|
|
@@ -20,6 +21,7 @@ const PrimitivePrompt = ({
|
|
|
20
21
|
const intl = reactIntl.useIntl();
|
|
21
22
|
return /*#__PURE__*/jsxRuntime.jsx(SentimentSurface.default, {
|
|
22
23
|
sentiment: sentiment,
|
|
24
|
+
emphasis: emphasis,
|
|
23
25
|
className: clsx.clsx('wds-prompt', `wds-prompt--${sentiment}`, className),
|
|
24
26
|
...restProps,
|
|
25
27
|
children: /*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrimitivePrompt.js","sources":["../../../src/prompt/PrimitivePrompt/PrimitivePrompt.tsx"],"sourcesContent":["import { Cross } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport SentimentSurface, { Sentiment } from '../../sentimentSurface';\nimport IconButton from '../../iconButton';\nimport { useIntl } from 'react-intl';\nimport closeBtnMessages from '../../common/closeButton/CloseButton.messages';\nimport { HTMLAttributes, ReactNode } from 'react';\n\nexport type PrimitivePromptProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * The sentiment determines the colour scheme
|
|
1
|
+
{"version":3,"file":"PrimitivePrompt.js","sources":["../../../src/prompt/PrimitivePrompt/PrimitivePrompt.tsx"],"sourcesContent":["import { Cross } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport SentimentSurface, { Emphasis, Sentiment } from '../../sentimentSurface';\nimport IconButton from '../../iconButton';\nimport { useIntl } from 'react-intl';\nimport closeBtnMessages from '../../common/closeButton/CloseButton.messages';\nimport { HTMLAttributes, ReactNode } from 'react';\n\nexport type PrimitivePromptProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * The sentiment determines the colour scheme.\n * @default success\n */\n sentiment?: Sentiment;\n /**\n * The emphasis level affecting background and text contrast.\n * @default 'base\n */\n emphasis?: Emphasis;\n /**\n * Media to be displayed on the prompt (icon/image/etc).\n */\n media: ReactNode;\n /**\n * Any actions to be displayed on the prompt.\n */\n actions?: ReactNode;\n /**\n * Handler called when the close button is clicked. If not provided, then the close button is hidden.\n */\n onDismiss?: () => void;\n /**\n * Test ID for testing tools\n */\n 'data-testid'?: string;\n};\n\n/**\n * PrimitivePrompt is a low-level component that provides the structure, sentiment support and styling for various prompts.\n * Uses several css variables to handle styling from within the consuming component, e.g. --Prompt-padding. */\nexport const PrimitivePrompt = ({\n sentiment = 'success',\n emphasis = 'base',\n media,\n actions,\n onDismiss,\n className,\n children,\n ...restProps\n}: PrimitivePromptProps) => {\n const intl = useIntl();\n\n return (\n <SentimentSurface\n sentiment={sentiment}\n emphasis={emphasis}\n className={clsx('wds-prompt', `wds-prompt--${sentiment}`, className)}\n {...restProps}\n >\n <div\n className={clsx('wds-prompt__content-wrapper', {\n 'wds-prompt__content-wrapper--with-dismiss': !!onDismiss,\n })}\n >\n <div className={clsx('wds-prompt__media-wrapper')}>{media}</div>\n {children}\n {onDismiss && (\n <IconButton\n size={24}\n priority=\"secondary\"\n aria-label={intl.formatMessage(closeBtnMessages.ariaLabel)}\n onClick={onDismiss}\n >\n <Cross />\n </IconButton>\n )}\n {actions && <div className=\"wds-prompt__actions-wrapper\">{actions}</div>}\n </div>\n </SentimentSurface>\n );\n};\n"],"names":["PrimitivePrompt","sentiment","emphasis","media","actions","onDismiss","className","children","restProps","intl","useIntl","_jsx","SentimentSurface","clsx","_jsxs","IconButton","size","priority","formatMessage","closeBtnMessages","ariaLabel","onClick","Cross"],"mappings":";;;;;;;;;;AAwCO,MAAMA,eAAe,GAAGA,CAAC;AAC9BC,EAAAA,SAAS,GAAG,SAAS;AACrBC,EAAAA,QAAQ,GAAG,MAAM;EACjBC,KAAK;EACLC,OAAO;EACPC,SAAS;EACTC,SAAS;EACTC,QAAQ;EACR,GAAGC;AAAS,CACS,KAAI;AACzB,EAAA,MAAMC,IAAI,GAAGC,iBAAO,EAAE;EAEtB,oBACEC,cAAA,CAACC,wBAAgB,EAAA;AACfX,IAAAA,SAAS,EAAEA,SAAU;AACrBC,IAAAA,QAAQ,EAAEA,QAAS;IACnBI,SAAS,EAAEO,SAAI,CAAC,YAAY,EAAE,eAAeZ,SAAS,CAAA,CAAE,EAAEK,SAAS,CAAE;AAAA,IAAA,GACjEE,SAAS;AAAAD,IAAAA,QAAA,eAEbO,eAAA,CAAA,KAAA,EAAA;AACER,MAAAA,SAAS,EAAEO,SAAI,CAAC,6BAA6B,EAAE;QAC7C,2CAA2C,EAAE,CAAC,CAACR;AAChD,OAAA,CAAE;AAAAE,MAAAA,QAAA,gBAEHI,cAAA,CAAA,KAAA,EAAA;AAAKL,QAAAA,SAAS,EAAEO,SAAI,CAAC,2BAA2B,CAAE;AAAAN,QAAAA,QAAA,EAAEJ;OAAW,CAC/D,EAACI,QAAQ,EACRF,SAAS,iBACRM,cAAA,CAACI,kBAAU,EAAA;AACTC,QAAAA,IAAI,EAAE,EAAG;AACTC,QAAAA,QAAQ,EAAC,WAAW;AACpB,QAAA,YAAA,EAAYR,IAAI,CAACS,aAAa,CAACC,4BAAgB,CAACC,SAAS,CAAE;AAC3DC,QAAAA,OAAO,EAAEhB,SAAU;AAAAE,QAAAA,QAAA,eAEnBI,cAAA,CAACW,WAAK,EAAA,EAAA;AACR,OAAY,CACb,EACAlB,OAAO,iBAAIO,cAAA,CAAA,KAAA,EAAA;AAAKL,QAAAA,SAAS,EAAC,6BAA6B;AAAAC,QAAAA,QAAA,EAAEH;AAAO,OAAM,CAAC;KACrE;AACP,GAAkB,CAAC;AAEvB;;;;"}
|
|
@@ -8,6 +8,7 @@ import { jsx, jsxs } from 'react/jsx-runtime';
|
|
|
8
8
|
|
|
9
9
|
const PrimitivePrompt = ({
|
|
10
10
|
sentiment = 'success',
|
|
11
|
+
emphasis = 'base',
|
|
11
12
|
media,
|
|
12
13
|
actions,
|
|
13
14
|
onDismiss,
|
|
@@ -18,6 +19,7 @@ const PrimitivePrompt = ({
|
|
|
18
19
|
const intl = useIntl();
|
|
19
20
|
return /*#__PURE__*/jsx(SentimentSurface, {
|
|
20
21
|
sentiment: sentiment,
|
|
22
|
+
emphasis: emphasis,
|
|
21
23
|
className: clsx('wds-prompt', `wds-prompt--${sentiment}`, className),
|
|
22
24
|
...restProps,
|
|
23
25
|
children: /*#__PURE__*/jsxs("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrimitivePrompt.mjs","sources":["../../../src/prompt/PrimitivePrompt/PrimitivePrompt.tsx"],"sourcesContent":["import { Cross } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport SentimentSurface, { Sentiment } from '../../sentimentSurface';\nimport IconButton from '../../iconButton';\nimport { useIntl } from 'react-intl';\nimport closeBtnMessages from '../../common/closeButton/CloseButton.messages';\nimport { HTMLAttributes, ReactNode } from 'react';\n\nexport type PrimitivePromptProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * The sentiment determines the colour scheme
|
|
1
|
+
{"version":3,"file":"PrimitivePrompt.mjs","sources":["../../../src/prompt/PrimitivePrompt/PrimitivePrompt.tsx"],"sourcesContent":["import { Cross } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport SentimentSurface, { Emphasis, Sentiment } from '../../sentimentSurface';\nimport IconButton from '../../iconButton';\nimport { useIntl } from 'react-intl';\nimport closeBtnMessages from '../../common/closeButton/CloseButton.messages';\nimport { HTMLAttributes, ReactNode } from 'react';\n\nexport type PrimitivePromptProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * The sentiment determines the colour scheme.\n * @default success\n */\n sentiment?: Sentiment;\n /**\n * The emphasis level affecting background and text contrast.\n * @default 'base\n */\n emphasis?: Emphasis;\n /**\n * Media to be displayed on the prompt (icon/image/etc).\n */\n media: ReactNode;\n /**\n * Any actions to be displayed on the prompt.\n */\n actions?: ReactNode;\n /**\n * Handler called when the close button is clicked. If not provided, then the close button is hidden.\n */\n onDismiss?: () => void;\n /**\n * Test ID for testing tools\n */\n 'data-testid'?: string;\n};\n\n/**\n * PrimitivePrompt is a low-level component that provides the structure, sentiment support and styling for various prompts.\n * Uses several css variables to handle styling from within the consuming component, e.g. --Prompt-padding. */\nexport const PrimitivePrompt = ({\n sentiment = 'success',\n emphasis = 'base',\n media,\n actions,\n onDismiss,\n className,\n children,\n ...restProps\n}: PrimitivePromptProps) => {\n const intl = useIntl();\n\n return (\n <SentimentSurface\n sentiment={sentiment}\n emphasis={emphasis}\n className={clsx('wds-prompt', `wds-prompt--${sentiment}`, className)}\n {...restProps}\n >\n <div\n className={clsx('wds-prompt__content-wrapper', {\n 'wds-prompt__content-wrapper--with-dismiss': !!onDismiss,\n })}\n >\n <div className={clsx('wds-prompt__media-wrapper')}>{media}</div>\n {children}\n {onDismiss && (\n <IconButton\n size={24}\n priority=\"secondary\"\n aria-label={intl.formatMessage(closeBtnMessages.ariaLabel)}\n onClick={onDismiss}\n >\n <Cross />\n </IconButton>\n )}\n {actions && <div className=\"wds-prompt__actions-wrapper\">{actions}</div>}\n </div>\n </SentimentSurface>\n );\n};\n"],"names":["PrimitivePrompt","sentiment","emphasis","media","actions","onDismiss","className","children","restProps","intl","useIntl","_jsx","SentimentSurface","clsx","_jsxs","IconButton","size","priority","formatMessage","closeBtnMessages","ariaLabel","onClick","Cross"],"mappings":";;;;;;;;AAwCO,MAAMA,eAAe,GAAGA,CAAC;AAC9BC,EAAAA,SAAS,GAAG,SAAS;AACrBC,EAAAA,QAAQ,GAAG,MAAM;EACjBC,KAAK;EACLC,OAAO;EACPC,SAAS;EACTC,SAAS;EACTC,QAAQ;EACR,GAAGC;AAAS,CACS,KAAI;AACzB,EAAA,MAAMC,IAAI,GAAGC,OAAO,EAAE;EAEtB,oBACEC,GAAA,CAACC,gBAAgB,EAAA;AACfX,IAAAA,SAAS,EAAEA,SAAU;AACrBC,IAAAA,QAAQ,EAAEA,QAAS;IACnBI,SAAS,EAAEO,IAAI,CAAC,YAAY,EAAE,eAAeZ,SAAS,CAAA,CAAE,EAAEK,SAAS,CAAE;AAAA,IAAA,GACjEE,SAAS;AAAAD,IAAAA,QAAA,eAEbO,IAAA,CAAA,KAAA,EAAA;AACER,MAAAA,SAAS,EAAEO,IAAI,CAAC,6BAA6B,EAAE;QAC7C,2CAA2C,EAAE,CAAC,CAACR;AAChD,OAAA,CAAE;AAAAE,MAAAA,QAAA,gBAEHI,GAAA,CAAA,KAAA,EAAA;AAAKL,QAAAA,SAAS,EAAEO,IAAI,CAAC,2BAA2B,CAAE;AAAAN,QAAAA,QAAA,EAAEJ;OAAW,CAC/D,EAACI,QAAQ,EACRF,SAAS,iBACRM,GAAA,CAACI,UAAU,EAAA;AACTC,QAAAA,IAAI,EAAE,EAAG;AACTC,QAAAA,QAAQ,EAAC,WAAW;AACpB,QAAA,YAAA,EAAYR,IAAI,CAACS,aAAa,CAACC,gBAAgB,CAACC,SAAS,CAAE;AAC3DC,QAAAA,OAAO,EAAEhB,SAAU;AAAAE,QAAAA,QAAA,eAEnBI,GAAA,CAACW,KAAK,EAAA,EAAA;AACR,OAAY,CACb,EACAlB,OAAO,iBAAIO,GAAA,CAAA,KAAA,EAAA;AAAKL,QAAAA,SAAS,EAAC,6BAA6B;AAAAC,QAAAA,QAAA,EAAEH;AAAO,OAAM,CAAC;KACrE;AACP,GAAkB,CAAC;AAEvB;;;;"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('react');
|
|
4
|
+
var clsx = require('clsx');
|
|
5
|
+
var icons = require('@transferwise/icons');
|
|
6
|
+
var IconButton = require('../../../iconButton/IconButton.js');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
// Helper for conditional rendering based on expanded state
|
|
10
|
+
function shouldShowWhenExpanded({
|
|
11
|
+
expanded,
|
|
12
|
+
hasContent,
|
|
13
|
+
alwaysShow = false
|
|
14
|
+
}) {
|
|
15
|
+
if (alwaysShow) {
|
|
16
|
+
return hasContent;
|
|
17
|
+
}
|
|
18
|
+
return expanded && hasContent;
|
|
19
|
+
}
|
|
20
|
+
// Reusable toggle button component
|
|
21
|
+
const ExpanderToggle = ({
|
|
22
|
+
expanded,
|
|
23
|
+
onToggle,
|
|
24
|
+
size = 24,
|
|
25
|
+
collapseLabel = 'Collapse',
|
|
26
|
+
expandLabel = 'Expand',
|
|
27
|
+
className,
|
|
28
|
+
'data-testid': testId
|
|
29
|
+
}) => {
|
|
30
|
+
return /*#__PURE__*/jsxRuntime.jsx(IconButton.default, {
|
|
31
|
+
size: size,
|
|
32
|
+
priority: "secondary",
|
|
33
|
+
"aria-label": expanded ? collapseLabel : expandLabel,
|
|
34
|
+
"aria-expanded": expanded,
|
|
35
|
+
className: clsx.clsx('wds-expander-toggle', {
|
|
36
|
+
'wds-expander-toggle--collapsed': !expanded
|
|
37
|
+
}, className),
|
|
38
|
+
"data-testid": testId,
|
|
39
|
+
onClick: onToggle,
|
|
40
|
+
children: /*#__PURE__*/jsxRuntime.jsx(icons.ChevronUp, {})
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
exports.ExpanderToggle = ExpanderToggle;
|
|
45
|
+
exports.shouldShowWhenExpanded = shouldShowWhenExpanded;
|
|
46
|
+
//# sourceMappingURL=Expander.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Expander.js","sources":["../../../../src/prompt/common/Expander/Expander.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { clsx } from 'clsx';\nimport { ChevronUp } from '@transferwise/icons';\nimport IconButton from '../../../iconButton';\n\nexport type ExpanderState = {\n expanded: boolean;\n toggle: () => void;\n setExpanded: (expanded: boolean) => void;\n};\n\nexport type ExpanderToggleProps = {\n expanded: boolean;\n onToggle: () => void;\n size?: 16 | 24 | 32 | 40 | 48 | 56 | 72;\n collapseLabel?: string;\n expandLabel?: string;\n className?: string;\n 'data-testid'?: string;\n};\n\n// Hook for managing expander state\nexport function useExpanderState(initialExpanded = true): ExpanderState {\n const [expanded, setExpanded] = useState(initialExpanded);\n\n const toggle = useCallback(() => {\n setExpanded((prev) => !prev);\n }, []);\n\n return {\n expanded,\n toggle,\n setExpanded,\n };\n}\n\n// Helper for conditional rendering based on expanded state\nexport function shouldShowWhenExpanded({\n expanded,\n hasContent,\n alwaysShow = false,\n}: {\n expanded: boolean;\n hasContent: boolean;\n alwaysShow?: boolean;\n}): boolean {\n if (alwaysShow) {\n return hasContent;\n }\n\n return expanded && hasContent;\n}\n\n// Reusable toggle button component\nexport const ExpanderToggle = ({\n expanded,\n onToggle,\n size = 24,\n collapseLabel = 'Collapse',\n expandLabel = 'Expand',\n className,\n 'data-testid': testId,\n}: ExpanderToggleProps) => {\n return (\n <IconButton\n size={size}\n priority=\"secondary\"\n aria-label={expanded ? collapseLabel : expandLabel}\n aria-expanded={expanded}\n className={clsx(\n 'wds-expander-toggle',\n { 'wds-expander-toggle--collapsed': !expanded },\n className,\n )}\n data-testid={testId}\n onClick={onToggle}\n >\n <ChevronUp />\n </IconButton>\n );\n};\n"],"names":["shouldShowWhenExpanded","expanded","hasContent","alwaysShow","ExpanderToggle","onToggle","size","collapseLabel","expandLabel","className","testId","_jsx","IconButton","priority","clsx","onClick","children","ChevronUp"],"mappings":";;;;;;;;AAoCA;AACM,SAAUA,sBAAsBA,CAAC;EACrCC,QAAQ;EACRC,UAAU;AACVC,EAAAA,UAAU,GAAG;AAAK,CAKnB,EAAA;AACC,EAAA,IAAIA,UAAU,EAAE;AACd,IAAA,OAAOD,UAAU;AACnB,EAAA;EAEA,OAAOD,QAAQ,IAAIC,UAAU;AAC/B;AAEA;AACO,MAAME,cAAc,GAAGA,CAAC;EAC7BH,QAAQ;EACRI,QAAQ;AACRC,EAAAA,IAAI,GAAG,EAAE;AACTC,EAAAA,aAAa,GAAG,UAAU;AAC1BC,EAAAA,WAAW,GAAG,QAAQ;EACtBC,SAAS;AACT,EAAA,aAAa,EAAEC;AAAM,CACD,KAAI;EACxB,oBACEC,cAAA,CAACC,kBAAU,EAAA;AACTN,IAAAA,IAAI,EAAEA,IAAK;AACXO,IAAAA,QAAQ,EAAC,WAAW;AACpB,IAAA,YAAA,EAAYZ,QAAQ,GAAGM,aAAa,GAAGC,WAAY;AACnD,IAAA,eAAA,EAAeP,QAAS;AACxBQ,IAAAA,SAAS,EAAEK,SAAI,CACb,qBAAqB,EACrB;AAAE,MAAA,gCAAgC,EAAE,CAACb;KAAU,EAC/CQ,SAAS,CACT;AACF,IAAA,aAAA,EAAaC,MAAO;AACpBK,IAAAA,OAAO,EAAEV,QAAS;AAAAW,IAAAA,QAAA,eAElBL,cAAA,CAACM,eAAS,EAAA,EAAA;AACZ,GAAY,CAAC;AAEjB;;;;;"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import 'react';
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import { ChevronUp } from '@transferwise/icons';
|
|
4
|
+
import IconButton from '../../../iconButton/IconButton.mjs';
|
|
5
|
+
import { jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
// Helper for conditional rendering based on expanded state
|
|
8
|
+
function shouldShowWhenExpanded({
|
|
9
|
+
expanded,
|
|
10
|
+
hasContent,
|
|
11
|
+
alwaysShow = false
|
|
12
|
+
}) {
|
|
13
|
+
if (alwaysShow) {
|
|
14
|
+
return hasContent;
|
|
15
|
+
}
|
|
16
|
+
return expanded && hasContent;
|
|
17
|
+
}
|
|
18
|
+
// Reusable toggle button component
|
|
19
|
+
const ExpanderToggle = ({
|
|
20
|
+
expanded,
|
|
21
|
+
onToggle,
|
|
22
|
+
size = 24,
|
|
23
|
+
collapseLabel = 'Collapse',
|
|
24
|
+
expandLabel = 'Expand',
|
|
25
|
+
className,
|
|
26
|
+
'data-testid': testId
|
|
27
|
+
}) => {
|
|
28
|
+
return /*#__PURE__*/jsx(IconButton, {
|
|
29
|
+
size: size,
|
|
30
|
+
priority: "secondary",
|
|
31
|
+
"aria-label": expanded ? collapseLabel : expandLabel,
|
|
32
|
+
"aria-expanded": expanded,
|
|
33
|
+
className: clsx('wds-expander-toggle', {
|
|
34
|
+
'wds-expander-toggle--collapsed': !expanded
|
|
35
|
+
}, className),
|
|
36
|
+
"data-testid": testId,
|
|
37
|
+
onClick: onToggle,
|
|
38
|
+
children: /*#__PURE__*/jsx(ChevronUp, {})
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export { ExpanderToggle, shouldShowWhenExpanded };
|
|
43
|
+
//# sourceMappingURL=Expander.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Expander.mjs","sources":["../../../../src/prompt/common/Expander/Expander.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { clsx } from 'clsx';\nimport { ChevronUp } from '@transferwise/icons';\nimport IconButton from '../../../iconButton';\n\nexport type ExpanderState = {\n expanded: boolean;\n toggle: () => void;\n setExpanded: (expanded: boolean) => void;\n};\n\nexport type ExpanderToggleProps = {\n expanded: boolean;\n onToggle: () => void;\n size?: 16 | 24 | 32 | 40 | 48 | 56 | 72;\n collapseLabel?: string;\n expandLabel?: string;\n className?: string;\n 'data-testid'?: string;\n};\n\n// Hook for managing expander state\nexport function useExpanderState(initialExpanded = true): ExpanderState {\n const [expanded, setExpanded] = useState(initialExpanded);\n\n const toggle = useCallback(() => {\n setExpanded((prev) => !prev);\n }, []);\n\n return {\n expanded,\n toggle,\n setExpanded,\n };\n}\n\n// Helper for conditional rendering based on expanded state\nexport function shouldShowWhenExpanded({\n expanded,\n hasContent,\n alwaysShow = false,\n}: {\n expanded: boolean;\n hasContent: boolean;\n alwaysShow?: boolean;\n}): boolean {\n if (alwaysShow) {\n return hasContent;\n }\n\n return expanded && hasContent;\n}\n\n// Reusable toggle button component\nexport const ExpanderToggle = ({\n expanded,\n onToggle,\n size = 24,\n collapseLabel = 'Collapse',\n expandLabel = 'Expand',\n className,\n 'data-testid': testId,\n}: ExpanderToggleProps) => {\n return (\n <IconButton\n size={size}\n priority=\"secondary\"\n aria-label={expanded ? collapseLabel : expandLabel}\n aria-expanded={expanded}\n className={clsx(\n 'wds-expander-toggle',\n { 'wds-expander-toggle--collapsed': !expanded },\n className,\n )}\n data-testid={testId}\n onClick={onToggle}\n >\n <ChevronUp />\n </IconButton>\n );\n};\n"],"names":["shouldShowWhenExpanded","expanded","hasContent","alwaysShow","ExpanderToggle","onToggle","size","collapseLabel","expandLabel","className","testId","_jsx","IconButton","priority","clsx","onClick","children","ChevronUp"],"mappings":";;;;;;AAoCA;AACM,SAAUA,sBAAsBA,CAAC;EACrCC,QAAQ;EACRC,UAAU;AACVC,EAAAA,UAAU,GAAG;AAAK,CAKnB,EAAA;AACC,EAAA,IAAIA,UAAU,EAAE;AACd,IAAA,OAAOD,UAAU;AACnB,EAAA;EAEA,OAAOD,QAAQ,IAAIC,UAAU;AAC/B;AAEA;AACO,MAAME,cAAc,GAAGA,CAAC;EAC7BH,QAAQ;EACRI,QAAQ;AACRC,EAAAA,IAAI,GAAG,EAAE;AACTC,EAAAA,aAAa,GAAG,UAAU;AAC1BC,EAAAA,WAAW,GAAG,QAAQ;EACtBC,SAAS;AACT,EAAA,aAAa,EAAEC;AAAM,CACD,KAAI;EACxB,oBACEC,GAAA,CAACC,UAAU,EAAA;AACTN,IAAAA,IAAI,EAAEA,IAAK;AACXO,IAAAA,QAAQ,EAAC,WAAW;AACpB,IAAA,YAAA,EAAYZ,QAAQ,GAAGM,aAAa,GAAGC,WAAY;AACnD,IAAA,eAAA,EAAeP,QAAS;AACxBQ,IAAAA,SAAS,EAAEK,IAAI,CACb,qBAAqB,EACrB;AAAE,MAAA,gCAAgC,EAAE,CAACb;KAAU,EAC/CQ,SAAS,CACT;AACF,IAAA,aAAA,EAAaC,MAAO;AACpBK,IAAAA,OAAO,EAAEV,QAAS;AAAAW,IAAAA,QAAA,eAElBL,GAAA,CAACM,SAAS,EAAA,EAAA;AACZ,GAAY,CAAC;AAEjB;;;;"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var icons = require('@transferwise/icons');
|
|
4
|
+
var AvatarView = require('../../avatarView/AvatarView.js');
|
|
5
|
+
var Image = require('../../image/Image.js');
|
|
6
|
+
var StatusIcon = require('../../statusIcon/StatusIcon.js');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function renderPromptMedia({
|
|
10
|
+
media,
|
|
11
|
+
sentiment,
|
|
12
|
+
mediaId,
|
|
13
|
+
imgClassName
|
|
14
|
+
}) {
|
|
15
|
+
if (media?.imgSrc) {
|
|
16
|
+
return /*#__PURE__*/jsxRuntime.jsx(Image.default, {
|
|
17
|
+
id: mediaId,
|
|
18
|
+
src: media.imgSrc,
|
|
19
|
+
className: imgClassName,
|
|
20
|
+
alt: media['aria-label'] ?? ''
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
if (media?.avatar) {
|
|
24
|
+
const badge = media.avatar.badge ? media.avatar.badge : sentiment === 'proposition' ? {} : {
|
|
25
|
+
status: sentiment
|
|
26
|
+
};
|
|
27
|
+
return /*#__PURE__*/jsxRuntime.jsx(AvatarView.default, {
|
|
28
|
+
...media.avatar,
|
|
29
|
+
badge: badge,
|
|
30
|
+
"aria-label": media['aria-label'],
|
|
31
|
+
"aria-hidden": media['aria-hidden'],
|
|
32
|
+
id: mediaId,
|
|
33
|
+
size: 48,
|
|
34
|
+
children: media.avatar.asset
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return sentiment === 'proposition' ? /*#__PURE__*/jsxRuntime.jsx(AvatarView.default, {
|
|
38
|
+
id: mediaId,
|
|
39
|
+
size: 48,
|
|
40
|
+
"aria-label": media['aria-label'],
|
|
41
|
+
"aria-hidden": media['aria-hidden'],
|
|
42
|
+
children: /*#__PURE__*/jsxRuntime.jsx(icons.GiftBox, {})
|
|
43
|
+
}) : /*#__PURE__*/jsxRuntime.jsx(StatusIcon.default, {
|
|
44
|
+
id: mediaId,
|
|
45
|
+
size: 48,
|
|
46
|
+
sentiment: sentiment,
|
|
47
|
+
iconLabel: media['aria-hidden'] ? null : media['aria-label']
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
exports.renderPromptMedia = renderPromptMedia;
|
|
52
|
+
//# sourceMappingURL=promptMedia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptMedia.js","sources":["../../../src/prompt/helpers/promptMedia.tsx"],"sourcesContent":["import { ReactNode } from 'react';\nimport { GiftBox } from '@transferwise/icons';\n\nimport AvatarView, { AvatarViewProps } from '../../avatarView';\nimport Image from '../../image';\nimport StatusIcon from '../../statusIcon';\nimport { BadgeAssetsProps } from '../../badge';\nimport { PrimitivePromptProps } from '../PrimitivePrompt';\n\nexport type PromptMedia = {\n imgSrc?: string;\n avatar?: Pick<AvatarViewProps, 'imgSrc' | 'profileName' | 'profileType'> & {\n asset?: AvatarViewProps['children'];\n badge?: Pick<BadgeAssetsProps, 'flagCode'>;\n };\n 'aria-label'?: string;\n 'aria-hidden'?: boolean;\n};\n\ntype RenderPromptMediaOptions = {\n media: PromptMedia;\n sentiment: PrimitivePromptProps['sentiment'];\n mediaId: string;\n imgClassName: string;\n};\n\nexport function renderPromptMedia({\n media,\n sentiment,\n mediaId,\n imgClassName,\n}: RenderPromptMediaOptions): ReactNode {\n if (media?.imgSrc) {\n return (\n <Image\n id={mediaId}\n src={media.imgSrc}\n className={imgClassName}\n alt={media['aria-label'] ?? ''}\n />\n );\n }\n if (media?.avatar) {\n const badge = media.avatar.badge\n ? media.avatar.badge\n : sentiment === 'proposition'\n ? {}\n : { status: sentiment };\n return (\n <AvatarView\n {...media.avatar}\n badge={badge}\n aria-label={media['aria-label']}\n aria-hidden={media['aria-hidden']}\n id={mediaId}\n size={48}\n >\n {media.avatar.asset}\n </AvatarView>\n );\n }\n return sentiment === 'proposition' ? (\n <AvatarView\n id={mediaId}\n size={48}\n aria-label={media['aria-label']}\n aria-hidden={media['aria-hidden']}\n >\n <GiftBox />\n </AvatarView>\n ) : (\n <StatusIcon\n id={mediaId}\n size={48}\n sentiment={sentiment}\n iconLabel={media['aria-hidden'] ? null : media['aria-label']}\n />\n );\n}\n"],"names":["renderPromptMedia","media","sentiment","mediaId","imgClassName","imgSrc","_jsx","Image","id","src","className","alt","avatar","badge","status","AvatarView","size","children","asset","GiftBox","StatusIcon","iconLabel"],"mappings":";;;;;;;;AA0BM,SAAUA,iBAAiBA,CAAC;EAChCC,KAAK;EACLC,SAAS;EACTC,OAAO;AACPC,EAAAA;AAAY,CACa,EAAA;EACzB,IAAIH,KAAK,EAAEI,MAAM,EAAE;IACjB,oBACEC,cAAA,CAACC,aAAK,EAAA;AACJC,MAAAA,EAAE,EAAEL,OAAQ;MACZM,GAAG,EAAER,KAAK,CAACI,MAAO;AAClBK,MAAAA,SAAS,EAAEN,YAAa;AACxBO,MAAAA,GAAG,EAAEV,KAAK,CAAC,YAAY,CAAC,IAAI;AAAG,KAAA,CAC/B;AAEN,EAAA;EACA,IAAIA,KAAK,EAAEW,MAAM,EAAE;IACjB,MAAMC,KAAK,GAAGZ,KAAK,CAACW,MAAM,CAACC,KAAK,GAC5BZ,KAAK,CAACW,MAAM,CAACC,KAAK,GAClBX,SAAS,KAAK,aAAa,GACzB,EAAE,GACF;AAAEY,MAAAA,MAAM,EAAEZ;KAAW;IAC3B,oBACEI,cAAA,CAACS,kBAAU,EAAA;MAAA,GACLd,KAAK,CAACW,MAAM;AAChBC,MAAAA,KAAK,EAAEA,KAAM;MACb,YAAA,EAAYZ,KAAK,CAAC,YAAY,CAAE;MAChC,aAAA,EAAaA,KAAK,CAAC,aAAa,CAAE;AAClCO,MAAAA,EAAE,EAAEL,OAAQ;AACZa,MAAAA,IAAI,EAAE,EAAG;AAAAC,MAAAA,QAAA,EAERhB,KAAK,CAACW,MAAM,CAACM;AAAK,KACT,CAAC;AAEjB,EAAA;AACA,EAAA,OAAOhB,SAAS,KAAK,aAAa,gBAChCI,cAAA,CAACS,kBAAU,EAAA;AACTP,IAAAA,EAAE,EAAEL,OAAQ;AACZa,IAAAA,IAAI,EAAE,EAAG;IACT,YAAA,EAAYf,KAAK,CAAC,YAAY,CAAE;IAChC,aAAA,EAAaA,KAAK,CAAC,aAAa,CAAE;AAAAgB,IAAAA,QAAA,eAElCX,cAAA,CAACa,aAAO,EAAA,EAAA;AACV,GAAY,CAAC,gBAEbb,cAAA,CAACc,kBAAU,EAAA;AACTZ,IAAAA,EAAE,EAAEL,OAAQ;AACZa,IAAAA,IAAI,EAAE,EAAG;AACTd,IAAAA,SAAS,EAAEA,SAAU;IACrBmB,SAAS,EAAEpB,KAAK,CAAC,aAAa,CAAC,GAAG,IAAI,GAAGA,KAAK,CAAC,YAAY;AAAE,GAAA,CAEhE;AACH;;;;"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { GiftBox } from '@transferwise/icons';
|
|
2
|
+
import AvatarView from '../../avatarView/AvatarView.mjs';
|
|
3
|
+
import Image from '../../image/Image.mjs';
|
|
4
|
+
import StatusIcon from '../../statusIcon/StatusIcon.mjs';
|
|
5
|
+
import { jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function renderPromptMedia({
|
|
8
|
+
media,
|
|
9
|
+
sentiment,
|
|
10
|
+
mediaId,
|
|
11
|
+
imgClassName
|
|
12
|
+
}) {
|
|
13
|
+
if (media?.imgSrc) {
|
|
14
|
+
return /*#__PURE__*/jsx(Image, {
|
|
15
|
+
id: mediaId,
|
|
16
|
+
src: media.imgSrc,
|
|
17
|
+
className: imgClassName,
|
|
18
|
+
alt: media['aria-label'] ?? ''
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
if (media?.avatar) {
|
|
22
|
+
const badge = media.avatar.badge ? media.avatar.badge : sentiment === 'proposition' ? {} : {
|
|
23
|
+
status: sentiment
|
|
24
|
+
};
|
|
25
|
+
return /*#__PURE__*/jsx(AvatarView, {
|
|
26
|
+
...media.avatar,
|
|
27
|
+
badge: badge,
|
|
28
|
+
"aria-label": media['aria-label'],
|
|
29
|
+
"aria-hidden": media['aria-hidden'],
|
|
30
|
+
id: mediaId,
|
|
31
|
+
size: 48,
|
|
32
|
+
children: media.avatar.asset
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return sentiment === 'proposition' ? /*#__PURE__*/jsx(AvatarView, {
|
|
36
|
+
id: mediaId,
|
|
37
|
+
size: 48,
|
|
38
|
+
"aria-label": media['aria-label'],
|
|
39
|
+
"aria-hidden": media['aria-hidden'],
|
|
40
|
+
children: /*#__PURE__*/jsx(GiftBox, {})
|
|
41
|
+
}) : /*#__PURE__*/jsx(StatusIcon, {
|
|
42
|
+
id: mediaId,
|
|
43
|
+
size: 48,
|
|
44
|
+
sentiment: sentiment,
|
|
45
|
+
iconLabel: media['aria-hidden'] ? null : media['aria-label']
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export { renderPromptMedia };
|
|
50
|
+
//# sourceMappingURL=promptMedia.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptMedia.mjs","sources":["../../../src/prompt/helpers/promptMedia.tsx"],"sourcesContent":["import { ReactNode } from 'react';\nimport { GiftBox } from '@transferwise/icons';\n\nimport AvatarView, { AvatarViewProps } from '../../avatarView';\nimport Image from '../../image';\nimport StatusIcon from '../../statusIcon';\nimport { BadgeAssetsProps } from '../../badge';\nimport { PrimitivePromptProps } from '../PrimitivePrompt';\n\nexport type PromptMedia = {\n imgSrc?: string;\n avatar?: Pick<AvatarViewProps, 'imgSrc' | 'profileName' | 'profileType'> & {\n asset?: AvatarViewProps['children'];\n badge?: Pick<BadgeAssetsProps, 'flagCode'>;\n };\n 'aria-label'?: string;\n 'aria-hidden'?: boolean;\n};\n\ntype RenderPromptMediaOptions = {\n media: PromptMedia;\n sentiment: PrimitivePromptProps['sentiment'];\n mediaId: string;\n imgClassName: string;\n};\n\nexport function renderPromptMedia({\n media,\n sentiment,\n mediaId,\n imgClassName,\n}: RenderPromptMediaOptions): ReactNode {\n if (media?.imgSrc) {\n return (\n <Image\n id={mediaId}\n src={media.imgSrc}\n className={imgClassName}\n alt={media['aria-label'] ?? ''}\n />\n );\n }\n if (media?.avatar) {\n const badge = media.avatar.badge\n ? media.avatar.badge\n : sentiment === 'proposition'\n ? {}\n : { status: sentiment };\n return (\n <AvatarView\n {...media.avatar}\n badge={badge}\n aria-label={media['aria-label']}\n aria-hidden={media['aria-hidden']}\n id={mediaId}\n size={48}\n >\n {media.avatar.asset}\n </AvatarView>\n );\n }\n return sentiment === 'proposition' ? (\n <AvatarView\n id={mediaId}\n size={48}\n aria-label={media['aria-label']}\n aria-hidden={media['aria-hidden']}\n >\n <GiftBox />\n </AvatarView>\n ) : (\n <StatusIcon\n id={mediaId}\n size={48}\n sentiment={sentiment}\n iconLabel={media['aria-hidden'] ? null : media['aria-label']}\n />\n );\n}\n"],"names":["renderPromptMedia","media","sentiment","mediaId","imgClassName","imgSrc","_jsx","Image","id","src","className","alt","avatar","badge","status","AvatarView","size","children","asset","GiftBox","StatusIcon","iconLabel"],"mappings":";;;;;;AA0BM,SAAUA,iBAAiBA,CAAC;EAChCC,KAAK;EACLC,SAAS;EACTC,OAAO;AACPC,EAAAA;AAAY,CACa,EAAA;EACzB,IAAIH,KAAK,EAAEI,MAAM,EAAE;IACjB,oBACEC,GAAA,CAACC,KAAK,EAAA;AACJC,MAAAA,EAAE,EAAEL,OAAQ;MACZM,GAAG,EAAER,KAAK,CAACI,MAAO;AAClBK,MAAAA,SAAS,EAAEN,YAAa;AACxBO,MAAAA,GAAG,EAAEV,KAAK,CAAC,YAAY,CAAC,IAAI;AAAG,KAAA,CAC/B;AAEN,EAAA;EACA,IAAIA,KAAK,EAAEW,MAAM,EAAE;IACjB,MAAMC,KAAK,GAAGZ,KAAK,CAACW,MAAM,CAACC,KAAK,GAC5BZ,KAAK,CAACW,MAAM,CAACC,KAAK,GAClBX,SAAS,KAAK,aAAa,GACzB,EAAE,GACF;AAAEY,MAAAA,MAAM,EAAEZ;KAAW;IAC3B,oBACEI,GAAA,CAACS,UAAU,EAAA;MAAA,GACLd,KAAK,CAACW,MAAM;AAChBC,MAAAA,KAAK,EAAEA,KAAM;MACb,YAAA,EAAYZ,KAAK,CAAC,YAAY,CAAE;MAChC,aAAA,EAAaA,KAAK,CAAC,aAAa,CAAE;AAClCO,MAAAA,EAAE,EAAEL,OAAQ;AACZa,MAAAA,IAAI,EAAE,EAAG;AAAAC,MAAAA,QAAA,EAERhB,KAAK,CAACW,MAAM,CAACM;AAAK,KACT,CAAC;AAEjB,EAAA;AACA,EAAA,OAAOhB,SAAS,KAAK,aAAa,gBAChCI,GAAA,CAACS,UAAU,EAAA;AACTP,IAAAA,EAAE,EAAEL,OAAQ;AACZa,IAAAA,IAAI,EAAE,EAAG;IACT,YAAA,EAAYf,KAAK,CAAC,YAAY,CAAE;IAChC,aAAA,EAAaA,KAAK,CAAC,aAAa,CAAE;AAAAgB,IAAAA,QAAA,eAElCX,GAAA,CAACa,OAAO,EAAA,EAAA;AACV,GAAY,CAAC,gBAEbb,GAAA,CAACc,UAAU,EAAA;AACTZ,IAAAA,EAAE,EAAEL,OAAQ;AACZa,IAAAA,IAAI,EAAE,EAAG;AACTd,IAAAA,SAAS,EAAEA,SAAU;IACrBmB,SAAS,EAAEpB,KAAK,CAAC,aAAa,CAAC,GAAG,IAAI,GAAGA,KAAK,CAAC,YAAY;AAAE,GAAA,CAEhE;AACH;;;;"}
|