@transferwise/components 0.0.0-experimental-b6b6dc1 → 0.0.0-experimental-a308934

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.js +2 -3
  2. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.js.map +1 -1
  3. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.mjs +2 -3
  4. package/build/expressiveMoneyInput/currencySelector/CurrencySelector.mjs.map +1 -1
  5. package/build/field/Field.js +5 -4
  6. package/build/field/Field.js.map +1 -1
  7. package/build/field/Field.mjs +5 -4
  8. package/build/field/Field.mjs.map +1 -1
  9. package/build/i18n/en.json +2 -0
  10. package/build/i18n/en.json.js +2 -0
  11. package/build/i18n/en.json.js.map +1 -1
  12. package/build/i18n/en.json.mjs +2 -0
  13. package/build/i18n/en.json.mjs.map +1 -1
  14. package/build/index.js +2 -0
  15. package/build/index.js.map +1 -1
  16. package/build/index.mjs +1 -0
  17. package/build/index.mjs.map +1 -1
  18. package/build/listItem/Prompt/ListItemPrompt.js +5 -4
  19. package/build/listItem/Prompt/ListItemPrompt.js.map +1 -1
  20. package/build/listItem/Prompt/ListItemPrompt.mjs +5 -4
  21. package/build/listItem/Prompt/ListItemPrompt.mjs.map +1 -1
  22. package/build/main.css +85 -29
  23. package/build/prompt/ActionPrompt/ActionPrompt.js +8 -40
  24. package/build/prompt/ActionPrompt/ActionPrompt.js.map +1 -1
  25. package/build/prompt/ActionPrompt/ActionPrompt.mjs +8 -40
  26. package/build/prompt/ActionPrompt/ActionPrompt.mjs.map +1 -1
  27. package/build/prompt/CriticalBanner/CriticalBanner.js +145 -0
  28. package/build/prompt/CriticalBanner/CriticalBanner.js.map +1 -0
  29. package/build/prompt/CriticalBanner/CriticalBanner.mjs +143 -0
  30. package/build/prompt/CriticalBanner/CriticalBanner.mjs.map +1 -0
  31. package/build/prompt/CriticalBanner/helpers.js +29 -0
  32. package/build/prompt/CriticalBanner/helpers.js.map +1 -0
  33. package/build/prompt/CriticalBanner/helpers.mjs +26 -0
  34. package/build/prompt/CriticalBanner/helpers.mjs.map +1 -0
  35. package/build/prompt/PrimitivePrompt/PrimitivePrompt.js +2 -0
  36. package/build/prompt/PrimitivePrompt/PrimitivePrompt.js.map +1 -1
  37. package/build/prompt/PrimitivePrompt/PrimitivePrompt.mjs +2 -0
  38. package/build/prompt/PrimitivePrompt/PrimitivePrompt.mjs.map +1 -1
  39. package/build/prompt/common/Expander/Expander.js +47 -0
  40. package/build/prompt/common/Expander/Expander.js.map +1 -0
  41. package/build/prompt/common/Expander/Expander.messages.js +17 -0
  42. package/build/prompt/common/Expander/Expander.messages.js.map +1 -0
  43. package/build/prompt/common/Expander/Expander.messages.mjs +13 -0
  44. package/build/prompt/common/Expander/Expander.messages.mjs.map +1 -0
  45. package/build/prompt/common/Expander/Expander.mjs +44 -0
  46. package/build/prompt/common/Expander/Expander.mjs.map +1 -0
  47. package/build/prompt/helpers/promptMedia.js +52 -0
  48. package/build/prompt/helpers/promptMedia.js.map +1 -0
  49. package/build/prompt/helpers/promptMedia.mjs +50 -0
  50. package/build/prompt/helpers/promptMedia.mjs.map +1 -0
  51. package/build/styles/main.css +85 -29
  52. package/build/styles/prompt/CriticalBanner/CriticalBanner.css +39 -0
  53. package/build/styles/prompt/common/Expander/Expander.css +8 -0
  54. package/build/typeahead/Typeahead.js +5 -4
  55. package/build/typeahead/Typeahead.js.map +1 -1
  56. package/build/typeahead/Typeahead.mjs +5 -4
  57. package/build/typeahead/Typeahead.mjs.map +1 -1
  58. package/build/types/expressiveMoneyInput/currencySelector/CurrencySelector.d.ts.map +1 -1
  59. package/build/types/index.d.ts +2 -2
  60. package/build/types/index.d.ts.map +1 -1
  61. package/build/types/prompt/ActionPrompt/ActionPrompt.d.ts +2 -11
  62. package/build/types/prompt/ActionPrompt/ActionPrompt.d.ts.map +1 -1
  63. package/build/types/prompt/CriticalBanner/CriticalBanner.d.ts +43 -0
  64. package/build/types/prompt/CriticalBanner/CriticalBanner.d.ts.map +1 -0
  65. package/build/types/prompt/CriticalBanner/helpers.d.ts +18 -0
  66. package/build/types/prompt/CriticalBanner/helpers.d.ts.map +1 -0
  67. package/build/types/prompt/CriticalBanner/index.d.ts +3 -0
  68. package/build/types/prompt/CriticalBanner/index.d.ts.map +1 -0
  69. package/build/types/prompt/PrimitivePrompt/PrimitivePrompt.d.ts +8 -3
  70. package/build/types/prompt/PrimitivePrompt/PrimitivePrompt.d.ts.map +1 -1
  71. package/build/types/prompt/common/Expander/Expander.d.ts +20 -0
  72. package/build/types/prompt/common/Expander/Expander.d.ts.map +1 -0
  73. package/build/types/prompt/common/Expander/Expander.messages.d.ts +14 -0
  74. package/build/types/prompt/common/Expander/Expander.messages.d.ts.map +1 -0
  75. package/build/types/prompt/helpers/promptMedia.d.ts +22 -0
  76. package/build/types/prompt/helpers/promptMedia.d.ts.map +1 -0
  77. package/build/types/prompt/index.d.ts +2 -0
  78. package/build/types/prompt/index.d.ts.map +1 -1
  79. package/build/types/test-utils/index.d.ts +4 -0
  80. package/build/types/test-utils/index.d.ts.map +1 -1
  81. package/package.json +4 -4
  82. package/src/expressiveMoneyInput/currencySelector/CurrencySelector.tsx +2 -3
  83. package/src/i18n/en.json +2 -0
  84. package/src/index.ts +2 -2
  85. package/src/main.css +85 -29
  86. package/src/main.less +3 -1
  87. package/src/prompt/ActionPrompt/ActionPrompt.tsx +9 -62
  88. package/src/prompt/CriticalBanner/CriticalBanner.accessibility.docs.mdx +131 -0
  89. package/src/prompt/CriticalBanner/CriticalBanner.css +39 -0
  90. package/src/prompt/CriticalBanner/CriticalBanner.less +45 -0
  91. package/src/prompt/CriticalBanner/CriticalBanner.story.tsx +476 -0
  92. package/src/prompt/CriticalBanner/CriticalBanner.test.story.tsx +67 -0
  93. package/src/prompt/CriticalBanner/CriticalBanner.tsx +188 -0
  94. package/src/prompt/CriticalBanner/helpers.ts +39 -0
  95. package/src/prompt/CriticalBanner/index.ts +2 -0
  96. package/src/prompt/PrimitivePrompt/PrimitivePrompt.tsx +9 -2
  97. package/src/prompt/common/Expander/Expander.css +8 -0
  98. package/src/prompt/common/Expander/Expander.less +9 -0
  99. package/src/prompt/common/Expander/Expander.messages.ts +14 -0
  100. package/src/prompt/common/Expander/Expander.test.tsx +167 -0
  101. package/src/prompt/common/Expander/Expander.tsx +83 -0
  102. package/src/prompt/helpers/promptMedia.tsx +79 -0
  103. package/src/prompt/index.ts +4 -0
  104. package/src/sentimentSurface/SentimentSurface.story.tsx +43 -17
@@ -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
- var icons = require('@transferwise/icons');
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
- if (media?.imgSrc) {
56
- return /*#__PURE__*/jsxRuntime.jsx(Image.default, {
57
- id: mediaId,
58
- src: media.imgSrc,
59
- className: "wds-action-prompt--media-image",
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 StatusIcon from '../../statusIcon';\nimport Body from '../../body';\nimport Button from '../../button';\nimport { Breakpoint, Typography } from '../../common';\nimport AvatarView, { AvatarViewProps } from '../../avatarView';\nimport Image from '../../image';\nimport { ButtonProps } from '../../button/Button.types';\nimport { PrimitivePrompt, PrimitivePromptProps } from '../PrimitivePrompt';\nimport { BadgeAssetsProps } from '../../badge';\nimport { GiftBox } from '@transferwise/icons';\nimport { useScreenSize } from '../../common/hooks/useScreenSize';\n\nexport type ActionPromptProps = {\n title: ReactNode;\n description?: ReactNode;\n /** @default {} */\n media?: {\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 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 if (media?.imgSrc) {\n return (\n <Image\n id={mediaId}\n src={media.imgSrc}\n className=\"wds-action-prompt--media-image\"\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\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","imgSrc","_jsx","Image","src","alt","avatar","badge","status","AvatarView","size","children","asset","GiftBox","StatusIcon","iconLabel","PrimitivePrompt","clsx","actions","_jsxs","_Fragment","Button","v2","priority","href","block","onClick","label","role","Body","type","Typography","BODY_LARGE_BOLD"],"mappings":"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"}
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 { GiftBox } from '@transferwise/icons';
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
- if (media?.imgSrc) {
54
- return /*#__PURE__*/jsx(Image, {
55
- id: mediaId,
56
- src: media.imgSrc,
57
- className: "wds-action-prompt--media-image",
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 StatusIcon from '../../statusIcon';\nimport Body from '../../body';\nimport Button from '../../button';\nimport { Breakpoint, Typography } from '../../common';\nimport AvatarView, { AvatarViewProps } from '../../avatarView';\nimport Image from '../../image';\nimport { ButtonProps } from '../../button/Button.types';\nimport { PrimitivePrompt, PrimitivePromptProps } from '../PrimitivePrompt';\nimport { BadgeAssetsProps } from '../../badge';\nimport { GiftBox } from '@transferwise/icons';\nimport { useScreenSize } from '../../common/hooks/useScreenSize';\n\nexport type ActionPromptProps = {\n title: ReactNode;\n description?: ReactNode;\n /** @default {} */\n media?: {\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 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 if (media?.imgSrc) {\n return (\n <Image\n id={mediaId}\n src={media.imgSrc}\n className=\"wds-action-prompt--media-image\"\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\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","imgSrc","_jsx","Image","src","alt","avatar","badge","status","AvatarView","size","children","asset","GiftBox","StatusIcon","iconLabel","PrimitivePrompt","clsx","actions","_jsxs","_Fragment","Button","v2","priority","href","block","onClick","label","role","Body","type","Typography","BODY_LARGE_BOLD"],"mappings":"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"}
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,
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 /** @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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDO,MAAMA,cAAc,GAAGA,CAAC;AAC7BC,EAAAA,SAAS,GAAG,UAAU;EACtBC,KAAK;EACLC,WAAW;EACXC,KAAK,GAAG,EAAE;EACVC,MAAM;EACNC,eAAe;EACfC,QAAQ;EACRC,QAAQ;EACRC,EAAE;EACFC,SAAS;AACT,EAAA,aAAa,EAAEC,MAAM;AACrB,EAAA,YAAY,EAAEC;AAAS,CACH,KAAI;EACxB,MAAMC,QAAQ,GAAG,CAACC,2BAAa,CAACC,qBAAU,CAACC,MAAM,CAAC;AAClD,EAAA,MAAMC,OAAO,GAAGC,WAAK,EAAE;AACvB,EAAA,MAAMC,OAAO,GAAGD,WAAK,EAAE;AACvB,EAAA,MAAME,MAAM,GAAGF,WAAK,EAAE;AAEtB,EAAA,MAAMG,iBAAiB,GAAG,CACxBjB,KAAK,CAAC,aAAa,CAAC,GAAGkB,SAAS,GAAGL,OAAO,EAC1CL,SAAS,IAAI,CAACV,KAAK,GAAGoB,SAAS,GAAGH,OAAO,CAC1C,CACEI,MAAM,CAACC,OAAO,CAAC,CACfC,IAAI,CAAC,GAAG,CAAC;AACZ,EAAA,MAAMC,UAAU,GAAGrB,MAAM,IAAIC,eAAe;EAE5C,oBACEqB,cAAA,CAACC,qBAAU,EAAA;AACT,IAAA,WAAA,EAAU,WAAW;IACrBC,gBAAgB,EAAEC,+BAAuB,CAAC;MACxC5B,KAAK;MACLC,WAAW;MACXI,QAAQ;MACRwB,WAAW,EAAE1B,MAAM,EAAE2B,KAAK;MAC1BC,oBAAoB,EAAE3B,eAAe,EAAE0B;AACxC,KAAA,CAAE;IAAAE,QAAA,eAEHC,eAAA,CAACC,+BAAe,EAAA;AACd3B,MAAAA,EAAE,EAAEA,EAAG;AACPR,MAAAA,SAAS,EAAEA,SAAU;AACrBoC,MAAAA,QAAQ,EAAEpC,SAAS,KAAK,SAAS,GAAG,MAAM,GAAG,UAAW;AACxD,MAAA,aAAA,EAAaU,MAAO;AACpBD,MAAAA,SAAS,EAAE4B,SAAI,CACb,qBAAqB,EACrB;QACE,gCAAgC,EAAE,CAAC/B,QAAQ;QAC3C,uCAAuC,EAAE,CAAC,CAACD;OAC5C,EACDI,SAAS,CACT;MACFN,KAAK,EAAEmC,6BAAiB,CAAC;QACvBnC,KAAK;QACLH,SAAS;QACTgB,OAAO;AACPuB,QAAAA,YAAY,EAAE;OACf,CAAE;MACHC,OAAO,EACLC,+BAAsB,CAAC;QAAEnC,QAAQ;QAAEoC,UAAU,EAAE,CAAC,CAACjB;AAAU,OAAE,CAAC,gBAC5DS,eAAA,CAAAS,mBAAA,EAAA;AAAAV,QAAAA,QAAA,GACG5B,eAAe;AAAA;AACd;AACAqB,QAAAA,cAAA,CAACkB,uBAAM,EAAA;UACLC,EAAE,EAAA,IAAA;AACFC,UAAAA,IAAI,EAAC,IAAI;AACTC,UAAAA,QAAQ,EAAC,WAAW;UACpBC,IAAI,EAAE3C,eAAe,CAAC2C,IAAK;AAC3BC,UAAAA,KAAK,EAAErC,QAAS;UAChBsC,OAAO,EAAE7C,eAAe,EAAE6C,OAAQ;UAAAjB,QAAA,EAEjC5B,eAAe,CAAC0B;SACX,CACT,EACA3B,MAAM;AAAA;AACL;AACAsB,QAAAA,cAAA,CAACkB,uBAAM,EAAA;UACLC,EAAE,EAAA,IAAA;AACFC,UAAAA,IAAI,EAAC,IAAI;AACTC,UAAAA,QAAQ,EAAC,SAAS;UAClBC,IAAI,EAAE5C,MAAM,CAAC4C,IAAK;AAClBC,UAAAA,KAAK,EAAErC,QAAS;UAChBsC,OAAO,EAAE9C,MAAM,CAAC8C,OAAQ;UAAAjB,QAAA,EAEvB7B,MAAM,CAAC2B;AAAK,SACP,CACT;OACH,CAAG,GACDV,SACL;AACD8B,MAAAA,IAAI,EAAC,QAAQ;AAAA,MAAA,IACRxC,SAAS,GACV;AAAE,QAAA,YAAY,EAAEA;AAAS,OAAE,GAC3B;AACE,QAAA,iBAAiB,EAAES,iBAAiB;AACpC,QAAA,kBAAkB,EAAED;OACrB,CAAA;AAAAc,MAAAA,QAAA,gBAELC,eAAA,CAAA,KAAA,EAAA;QACEzB,SAAS,EAAE4B,SAAI,CACb,QAAQ,EACR,aAAa,EACb,wBAAwB,EACxB,mCAAmC,CACnC;AAAAJ,QAAAA,QAAA,EAAA,CAEDhC,KAAK,iBACJyB,cAAA,CAAC0B,YAAI,EAAA;AACH5C,UAAAA,EAAE,EAAEU,OAAQ;UACZmC,IAAI,EAAEC,qBAAU,CAACC,eAAgB;AACjC9C,UAAAA,SAAS,EAAC,8BAA8B;AAAAwB,UAAAA,QAAA,EAEvChC;SACG,CACP,EACAwC,+BAAsB,CAAC;UAAEnC,QAAQ;UAAEoC,UAAU,EAAE,CAAC,CAACxC,WAAW;AAAEsD,UAAAA,UAAU,EAAE,CAACvD;AAAK,SAAE,CAAC,iBAClFyB,cAAA,CAAC0B,YAAI,EAAA;AACH5C,UAAAA,EAAE,EAAEW,MAAO;AACXV,UAAAA,SAAS,EAAE4B,SAAI,CAAC,8BAA8B,EAAE;AAC9C,YAAA,6CAA6C,EAAE,CAAC/B,QAAQ,IAAI,CAACL;AAC9D,WAAA,CAAE;AAAAgC,UAAAA,QAAA,EAEF/B;AAAW,SACR,CACP;AAAA,OACE,CACL,eAAAwB,cAAA,CAAC+B,uBAAc,EAAA;AACbnD,QAAAA,QAAQ,EAAEA,QAAS;AACnBwC,QAAAA,IAAI,EAAE,EAAG;AACTrC,QAAAA,SAAS,EAAC,6BAA6B;AACvCF,QAAAA,QAAQ,EAAEA;AAAS,OAAA,CAEvB;KAAiB;AACnB,GAAY,CAAC;AAEjB;;;;"}
@@ -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 { 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;;;;;"}