amis 1.4.2-beta.13 → 1.4.2-beta.18

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 (190) hide show
  1. package/lib/Schema.d.ts +4 -3
  2. package/lib/Schema.js.map +1 -1
  3. package/lib/components/Alert2.d.ts +26 -21
  4. package/lib/components/Alert2.js +11 -4
  5. package/lib/components/Alert2.js.map +2 -2
  6. package/lib/components/AssociatedSelection.js +2 -2
  7. package/lib/components/AssociatedSelection.js.map +2 -2
  8. package/lib/components/Button.js +1 -1
  9. package/lib/components/Button.js.map +2 -2
  10. package/lib/components/Checkbox.d.ts +20 -20
  11. package/lib/components/Collapse.d.ts +51 -23
  12. package/lib/components/Collapse.js +70 -11
  13. package/lib/components/Collapse.js.map +2 -2
  14. package/lib/components/CollapseGroup.d.ts +88 -0
  15. package/lib/components/CollapseGroup.js +81 -0
  16. package/lib/components/CollapseGroup.js.map +13 -0
  17. package/lib/components/ColorPicker.d.ts +5 -1
  18. package/lib/components/ColorPicker.js +17 -4
  19. package/lib/components/ColorPicker.js.map +2 -2
  20. package/lib/components/Editor.d.ts +84 -84
  21. package/lib/components/GridNav.d.ts +52 -0
  22. package/lib/components/GridNav.js +123 -0
  23. package/lib/components/GridNav.js.map +13 -0
  24. package/lib/components/ListGroup.d.ts +21 -21
  25. package/lib/components/Overlay.js +5 -0
  26. package/lib/components/Overlay.js.map +2 -2
  27. package/lib/components/PopOver.d.ts +1 -0
  28. package/lib/components/PopOver.js +12 -1
  29. package/lib/components/PopOver.js.map +2 -2
  30. package/lib/components/Tabs.d.ts +20 -20
  31. package/lib/components/TabsTransfer.d.ts +84 -84
  32. package/lib/components/Toast.d.ts +90 -87
  33. package/lib/components/Toast.js +15 -5
  34. package/lib/components/Toast.js.map +2 -2
  35. package/lib/components/Transfer.d.ts +84 -84
  36. package/lib/components/TransferDropDown.d.ts +84 -84
  37. package/lib/components/Tree.d.ts +115 -84
  38. package/lib/components/Tree.js +183 -30
  39. package/lib/components/Tree.js.map +2 -2
  40. package/lib/components/condition-builder/Field.js +2 -3
  41. package/lib/components/condition-builder/Field.js.map +2 -2
  42. package/lib/components/icons.js +8 -0
  43. package/lib/components/icons.js.map +2 -2
  44. package/lib/envOverwrite.d.ts +1 -1
  45. package/lib/envOverwrite.js +24 -9
  46. package/lib/envOverwrite.js.map +2 -2
  47. package/lib/factory.d.ts +11 -1
  48. package/lib/factory.js +31 -4
  49. package/lib/factory.js.map +2 -2
  50. package/lib/icons/alert-danger.js +7 -0
  51. package/lib/icons/alert-info.js +7 -0
  52. package/lib/icons/alert-success.js +7 -0
  53. package/lib/icons/alert-warning.js +7 -0
  54. package/lib/icons/drag-bar.js +10 -3
  55. package/lib/index.d.ts +2 -0
  56. package/lib/index.js +3 -1
  57. package/lib/index.js.map +2 -2
  58. package/lib/renderers/Alert.d.ts +21 -1
  59. package/lib/renderers/Alert.js.map +2 -2
  60. package/lib/renderers/Card.d.ts +1 -0
  61. package/lib/renderers/Card.js +7 -2
  62. package/lib/renderers/Card.js.map +2 -2
  63. package/lib/renderers/Collapse.d.ts +25 -20
  64. package/lib/renderers/Collapse.js +10 -73
  65. package/lib/renderers/Collapse.js.map +2 -2
  66. package/lib/renderers/CollapseGroup.d.ts +42 -0
  67. package/lib/renderers/CollapseGroup.js +33 -0
  68. package/lib/renderers/CollapseGroup.js.map +13 -0
  69. package/lib/renderers/Form/ConditionBuilder.js +2 -2
  70. package/lib/renderers/Form/ConditionBuilder.js.map +2 -2
  71. package/lib/renderers/Form/InputCity.d.ts +84 -84
  72. package/lib/renderers/Form/InputColor.d.ts +2 -1
  73. package/lib/renderers/Form/InputColor.js +1 -1
  74. package/lib/renderers/Form/InputColor.js.map +2 -2
  75. package/lib/renderers/Form/Item.js +2 -1
  76. package/lib/renderers/Form/Item.js.map +2 -2
  77. package/lib/renderers/GridNav.d.ts +99 -0
  78. package/lib/renderers/GridNav.js +82 -0
  79. package/lib/renderers/GridNav.js.map +13 -0
  80. package/lib/renderers/Page.d.ts +18 -0
  81. package/lib/renderers/Page.js +53 -9
  82. package/lib/renderers/Page.js.map +2 -2
  83. package/lib/store/formItem.js +44 -4
  84. package/lib/store/formItem.js.map +2 -2
  85. package/lib/themes/ang-ie11.css +324 -49
  86. package/lib/themes/ang.css +324 -49
  87. package/lib/themes/ang.css.map +1 -1
  88. package/lib/themes/antd-ie11.css +324 -49
  89. package/lib/themes/antd.css +324 -49
  90. package/lib/themes/antd.css.map +1 -1
  91. package/lib/themes/cxd-ie11.css +331 -58
  92. package/lib/themes/cxd.css +331 -58
  93. package/lib/themes/cxd.css.map +1 -1
  94. package/lib/themes/dark-ie11.css +324 -49
  95. package/lib/themes/dark.css +324 -49
  96. package/lib/themes/dark.css.map +1 -1
  97. package/lib/themes/default.css +331 -58
  98. package/lib/themes/default.css.map +1 -1
  99. package/lib/types.d.ts +1 -1
  100. package/lib/types.js.map +1 -1
  101. package/lib/utils/api.d.ts +1 -0
  102. package/lib/utils/api.js +77 -6
  103. package/lib/utils/api.js.map +2 -2
  104. package/lib/utils/helper.d.ts +8 -0
  105. package/lib/utils/helper.js +33 -2
  106. package/lib/utils/helper.js.map +2 -2
  107. package/lib/utils/tpl-builtin.js +5 -0
  108. package/lib/utils/tpl-builtin.js.map +2 -2
  109. package/package.json +1 -1
  110. package/schema.json +365 -49
  111. package/scss/_properties.scss +2 -1
  112. package/scss/components/_alert.scss +28 -5
  113. package/scss/components/_anchor-nav.scss +1 -0
  114. package/scss/components/_button.scss +5 -0
  115. package/scss/components/_card.scss +1 -1
  116. package/scss/components/_collapse-group.scss +15 -0
  117. package/scss/components/_collapse.scss +33 -23
  118. package/scss/components/_grid-nav.scss +128 -0
  119. package/scss/components/_nav.scss +2 -7
  120. package/scss/components/_page.scss +35 -2
  121. package/scss/components/_spinner.scss +5 -4
  122. package/scss/components/_table.scss +6 -0
  123. package/scss/components/_toast.scss +41 -11
  124. package/scss/components/form/_color.scss +32 -3
  125. package/scss/components/form/_combo.scss +4 -0
  126. package/scss/components/form/_fieldset.scss +1 -0
  127. package/scss/components/form/_transfer.scss +1 -0
  128. package/scss/components/form/_tree.scss +42 -0
  129. package/scss/themes/_common.scss +2 -0
  130. package/scss/themes/_cxd-variables.scss +9 -4
  131. package/scss/themes/cxd.scss +1 -7
  132. package/sdk/ang-ie11.css +375 -53
  133. package/sdk/ang.css +377 -53
  134. package/sdk/antd-ie11.css +375 -53
  135. package/sdk/antd.css +377 -53
  136. package/sdk/charts.js +13 -13
  137. package/sdk/color-picker.js +69 -65
  138. package/sdk/cropperjs.js +2 -2
  139. package/sdk/cxd-ie11.css +379 -60
  140. package/sdk/cxd.css +384 -62
  141. package/sdk/dark-ie11.css +375 -53
  142. package/sdk/dark.css +377 -53
  143. package/sdk/exceljs.js +1 -1
  144. package/sdk/markdown.js +69 -69
  145. package/sdk/papaparse.js +1 -1
  146. package/sdk/renderers/Form/CityDB.js +1 -1
  147. package/sdk/rest.js +16 -20
  148. package/sdk/rich-text.js +62 -62
  149. package/sdk/sdk-ie11.css +379 -60
  150. package/sdk/sdk.css +384 -62
  151. package/sdk/sdk.js +1215 -1173
  152. package/sdk/thirds/hls.js/hls.js +1 -1
  153. package/sdk/thirds/mpegts.js/mpegts.js +1 -1
  154. package/sdk/tinymce.js +57 -57
  155. package/src/Schema.ts +5 -1
  156. package/src/components/Alert2.tsx +32 -4
  157. package/src/components/AssociatedSelection.tsx +3 -1
  158. package/src/components/Button.tsx +1 -0
  159. package/src/components/Collapse.tsx +139 -20
  160. package/src/components/CollapseGroup.tsx +130 -0
  161. package/src/components/ColorPicker.tsx +32 -10
  162. package/src/components/GridNav.tsx +233 -0
  163. package/src/components/Overlay.tsx +6 -0
  164. package/src/components/PopOver.tsx +15 -1
  165. package/src/components/Toast.tsx +48 -21
  166. package/src/components/Tree.tsx +194 -8
  167. package/src/components/condition-builder/Field.tsx +3 -1
  168. package/src/components/icons.tsx +8 -0
  169. package/src/envOverwrite.ts +20 -7
  170. package/src/factory.tsx +52 -6
  171. package/src/icons/alert-danger.svg +1 -0
  172. package/src/icons/alert-info.svg +1 -0
  173. package/src/icons/alert-success.svg +1 -0
  174. package/src/icons/alert-warning.svg +1 -0
  175. package/src/icons/drag-bar.svg +12 -6
  176. package/src/index.tsx +2 -0
  177. package/src/renderers/Alert.tsx +31 -1
  178. package/src/renderers/Card.tsx +13 -2
  179. package/src/renderers/Collapse.tsx +70 -117
  180. package/src/renderers/CollapseGroup.tsx +80 -0
  181. package/src/renderers/Form/ConditionBuilder.tsx +2 -2
  182. package/src/renderers/Form/InputColor.tsx +4 -2
  183. package/src/renderers/GridNav.tsx +204 -0
  184. package/src/renderers/Page.tsx +62 -1
  185. package/src/store/formItem.ts +94 -2
  186. package/src/types.ts +1 -1
  187. package/src/utils/api.ts +93 -6
  188. package/src/utils/helper.ts +33 -0
  189. package/src/utils/tpl-builtin.ts +6 -0
  190. package/tsconfig-for-declaration.json +1 -1
@@ -0,0 +1,233 @@
1
+ /**
2
+ * @file GridNav
3
+ * @description 金刚位宫格导航 参考react-vant
4
+ */
5
+
6
+ import React, {useMemo} from 'react';
7
+ import {ClassNamesFn} from '../theme';
8
+ import {Badge, BadgeProps} from './Badge';
9
+
10
+ export type GridNavDirection = 'horizontal' | 'vertical';
11
+
12
+ export interface GridNavProps {
13
+ /** 是否将格子固定为正方形 */
14
+ square?: boolean;
15
+ /** 是否将格子内容居中显示 */
16
+ center?: boolean;
17
+ /** 是否显示边框 */
18
+ border?: boolean;
19
+ /** 格子之间的间距,默认单位为`px` */
20
+ gutter?: number;
21
+ /** 是否调换图标和文本的位置 */
22
+ reverse?: boolean;
23
+ /** 图标占比,默认单位为`%` */
24
+ iconRatio?: number;
25
+ /** 格子内容排列的方向,可选值为 `horizontal` */
26
+ direction?: GridNavDirection;
27
+ /** 列数 */
28
+ columnNum?: number;
29
+ className?: string;
30
+ itemClassName?: string;
31
+ classnames: ClassNamesFn;
32
+ style?: React.CSSProperties;
33
+ }
34
+
35
+ export interface GridNavItemProps {
36
+ /** 图标右上角徽标 */
37
+ badge?: BadgeProps;
38
+ /** 文字 */
39
+ text?: string | React.ReactNode;
40
+ /** 图标名称或图片链接 */
41
+ icon?: string | React.ReactNode;
42
+ className?: string;
43
+ style?: React.CSSProperties;
44
+ contentClassName?: string;
45
+ contentStyle?: React.CSSProperties;
46
+ children?: React.ReactNode;
47
+ classnames: ClassNamesFn;
48
+ onClick?: (event: React.MouseEvent) => void;
49
+ }
50
+
51
+ type InternalProps = {
52
+ parent?: GridNavProps;
53
+ index?: number;
54
+ };
55
+
56
+ function addUnit(value?: string | number): string | undefined {
57
+ if (value === undefined || value === null) {
58
+ return undefined;
59
+ }
60
+ value = String(value);
61
+ return /^\d+(\.\d+)?$/.test(value) ? `${value}px` : value;
62
+ }
63
+
64
+ export const GridNavItem: React.FC<GridNavItemProps & InternalProps> = ({
65
+ children,
66
+ classnames: cx,
67
+ className,
68
+ style,
69
+ ...props
70
+ }) => {
71
+ const {index = 0, parent} = props;
72
+ if (!parent) {
73
+ if (process.env.NODE_ENV !== 'production') {
74
+ // eslint-disable-next-line no-console
75
+ console.error(
76
+ '[React Vant] <GridNavItem> must be a child component of <GridNav>.'
77
+ );
78
+ }
79
+ return null;
80
+ }
81
+
82
+ const rootStyle = useMemo(() => {
83
+ const {square, gutter, columnNum = 4} = parent;
84
+ const percent = `${100 / +columnNum}%`;
85
+ const internalStyle: React.CSSProperties = {
86
+ ...style,
87
+ flexBasis: percent
88
+ };
89
+
90
+ if (square) {
91
+ internalStyle.paddingTop = percent;
92
+ } else if (gutter) {
93
+ const gutterValue = addUnit(gutter);
94
+ internalStyle.paddingRight = gutterValue;
95
+
96
+ if (index >= columnNum) {
97
+ internalStyle.marginTop = gutterValue;
98
+ }
99
+ }
100
+
101
+ return internalStyle;
102
+ }, [parent.style, parent.gutter, parent.columnNum]);
103
+
104
+ const contentStyle = useMemo(() => {
105
+ const {square, gutter} = parent;
106
+
107
+ if (square && gutter) {
108
+ const gutterValue = addUnit(gutter);
109
+ return {
110
+ ...props.contentStyle,
111
+ right: gutterValue,
112
+ bottom: gutterValue,
113
+ height: 'auto'
114
+ };
115
+ }
116
+ return props.contentStyle;
117
+ }, [parent.gutter, parent.columnNum, props.contentStyle]);
118
+
119
+ const renderIcon = () => {
120
+ const ratio = parent.iconRatio || 60;
121
+ if (typeof props.icon === 'string') {
122
+ if (props.badge) {
123
+ return (
124
+ <Badge {...props.badge}>
125
+ <div className={cx('GridNavItem-image')}>
126
+ <img src={props.icon} style={{width: ratio + '%'}} />
127
+ </div>
128
+ </Badge>
129
+ );
130
+ }
131
+ return (
132
+ <div className={cx('GridNavItem-image')}>
133
+ <img src={props.icon} style={{width: ratio + '%'}} />
134
+ </div>
135
+ );
136
+ }
137
+
138
+ if (React.isValidElement(props.icon)) {
139
+ return <Badge {...(props.badge as BadgeProps)}>{props.icon}</Badge>;
140
+ }
141
+
142
+ return null;
143
+ };
144
+
145
+ const renderText = () => {
146
+ if (React.isValidElement(props.text)) {
147
+ return props.text;
148
+ }
149
+ if (props.text) {
150
+ return <span className={cx('GridNavItem-text')}>{props.text}</span>;
151
+ }
152
+ return null;
153
+ };
154
+
155
+ const renderContent = () => {
156
+ if (children) {
157
+ return children;
158
+ }
159
+ return (
160
+ <>
161
+ {renderIcon()}
162
+ {renderText()}
163
+ </>
164
+ );
165
+ };
166
+
167
+ const {center, border, square, gutter, reverse, direction} = parent;
168
+
169
+ const prefix = 'GridNavItem-content';
170
+ const classes = cx(`${prefix} ${props.contentClassName || ''}`, {
171
+ [`${prefix}--${direction}`]: !!direction,
172
+ [`${prefix}--center`]: center,
173
+ [`${prefix}--square`]: square,
174
+ [`${prefix}--reverse`]: reverse,
175
+ [`${prefix}--clickable`]: !!props.onClick,
176
+ [`${prefix}--surround`]: border && gutter,
177
+ [`${prefix}--border u-hairline`]: border
178
+ });
179
+
180
+ return (
181
+ <div
182
+ className={cx(className, {'GridNavItem--square': square})}
183
+ style={rootStyle}
184
+ >
185
+ <div
186
+ role={props.onClick ? 'button' : undefined}
187
+ className={classes}
188
+ style={contentStyle}
189
+ onClick={props.onClick}
190
+ >
191
+ {renderContent()}
192
+ </div>
193
+ </div>
194
+ );
195
+ };
196
+
197
+ const GridNav: React.FC<GridNavProps> = ({
198
+ children,
199
+ className,
200
+ classnames: cx,
201
+ itemClassName,
202
+ style,
203
+ ...props
204
+ }) => {
205
+ return (
206
+ <div
207
+ style={{paddingLeft: addUnit(props.gutter), ...style}}
208
+ className={cx(`GridNav ${className || ''}`, {
209
+ 'GridNav-top u-hairline': props.border && !props.gutter
210
+ })}
211
+ >
212
+ {React.Children.toArray(children)
213
+ .filter(Boolean)
214
+ .map((child: React.ReactElement, index: number) =>
215
+ React.cloneElement(child, {
216
+ index,
217
+ parent: props,
218
+ className: itemClassName,
219
+ classnames: cx
220
+ })
221
+ )}
222
+ </div>
223
+ );
224
+ };
225
+
226
+ GridNav.defaultProps = {
227
+ direction: 'vertical',
228
+ center: true,
229
+ border: true,
230
+ columnNum: 4
231
+ };
232
+
233
+ export default GridNav;
@@ -295,6 +295,12 @@ export default class Overlay extends React.Component<
295
295
  <Portal container={container}>
296
296
  <RootClose onRootClose={props.onHide}>
297
297
  {(ref: any) => {
298
+ if (React.isValidElement(child)) {
299
+ return React.cloneElement(child, {
300
+ ref: ref
301
+ });
302
+ }
303
+
298
304
  return <div ref={ref}>{child}</div>;
299
305
  }}
300
306
  </RootClose>
@@ -7,7 +7,7 @@
7
7
  import React from 'react';
8
8
  import {findDOMNode} from 'react-dom';
9
9
  import {ClassNamesFn, themeable} from '../theme';
10
- import {camel} from '../utils/helper';
10
+ import {camel, preventDefault} from '../utils/helper';
11
11
 
12
12
  export interface Offset {
13
13
  x: number;
@@ -53,12 +53,21 @@ export class PopOver extends React.PureComponent<PopOverPorps, PopOverState> {
53
53
  };
54
54
 
55
55
  parent: HTMLElement;
56
+ wrapperRef: React.RefObject<HTMLDivElement> = React.createRef();
56
57
 
57
58
  componentDidMount() {
58
59
  this.mayUpdateOffset();
59
60
  const dom = findDOMNode(this) as HTMLElement;
60
61
  this.parent = dom.parentNode as HTMLElement;
61
62
  this.parent.classList.add('has-popover');
63
+
64
+ if (this.wrapperRef && this.wrapperRef.current) {
65
+ // https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener#使用_passive_改善的滚屏性能
66
+ this.wrapperRef.current.addEventListener('touchmove', preventDefault, {
67
+ passive: false,
68
+ capture: false
69
+ });
70
+ }
62
71
  }
63
72
 
64
73
  componentDidUpdate() {
@@ -67,6 +76,10 @@ export class PopOver extends React.PureComponent<PopOverPorps, PopOverState> {
67
76
 
68
77
  componentWillUnmount() {
69
78
  this.parent && this.parent.classList.remove('has-popover');
79
+
80
+ if (this.wrapperRef && this.wrapperRef.current) {
81
+ this.wrapperRef.current.removeEventListener('touchmove', preventDefault);
82
+ }
70
83
  }
71
84
 
72
85
  mayUpdateOffset() {
@@ -122,6 +135,7 @@ export class PopOver extends React.PureComponent<PopOverPorps, PopOverState> {
122
135
 
123
136
  return (
124
137
  <div
138
+ ref={this.wrapperRef}
125
139
  className={cx(
126
140
  `${ns}PopOver`,
127
141
  className,
@@ -51,11 +51,13 @@ interface ToastComponentProps extends ThemeProps, LocaleProps {
51
51
  closeButton: boolean;
52
52
  showIcon?: boolean;
53
53
  timeout: number;
54
+ errorTimeout: number;
54
55
  className?: string;
55
56
  }
56
57
 
57
58
  interface Item extends Config {
58
- body: string;
59
+ title?: string | React.ReactNode;
60
+ body: string | React.ReactNode;
59
61
  level: 'info' | 'success' | 'error' | 'warning';
60
62
  id: string;
61
63
  onDissmiss?: () => void;
@@ -78,11 +80,12 @@ export class ToastComponent extends React.Component<
78
80
  > {
79
81
  static defaultProps: Pick<
80
82
  ToastComponentProps,
81
- 'position' | 'closeButton' | 'timeout'
83
+ 'position' | 'closeButton' | 'timeout' | 'errorTimeout'
82
84
  > = {
83
85
  position: 'top-center',
84
86
  closeButton: false,
85
- timeout: 5000
87
+ timeout: 5000,
88
+ errorTimeout: 10000 // 错误的时候 time 调长
86
89
  };
87
90
  static themeKey = 'toast';
88
91
 
@@ -155,18 +158,17 @@ export class ToastComponent extends React.Component<
155
158
  classnames: cx,
156
159
  className,
157
160
  timeout,
161
+ errorTimeout,
158
162
  position,
159
163
  showIcon,
160
164
  translate,
161
165
  closeButton
162
166
  } = this.props;
163
167
  const items = this.state.items;
164
-
165
168
  const groupedItems = groupBy(items, item => item.position || position);
166
169
 
167
170
  return Object.keys(groupedItems).map(position => {
168
171
  const toasts = groupedItems[position];
169
-
170
172
  return (
171
173
  <div
172
174
  key={position}
@@ -177,19 +179,25 @@ export class ToastComponent extends React.Component<
177
179
  className
178
180
  )}
179
181
  >
180
- {toasts.map(item => (
181
- <ToastMessage
182
- classnames={cx}
183
- key={item.id}
184
- body={item.body}
185
- level={item.level || 'info'}
186
- timeout={item.timeout ?? timeout}
187
- closeButton={item.closeButton ?? closeButton}
188
- onDismiss={this.handleDismissed.bind(this, items.indexOf(item))}
189
- translate={translate}
190
- showIcon={showIcon}
191
- />
192
- ))}
182
+ {toasts.map(item => {
183
+ const level = item.level || 'info';
184
+ const toastTimeout =
185
+ item.timeout ?? (level === 'error' ? errorTimeout : timeout);
186
+ return (
187
+ <ToastMessage
188
+ classnames={cx}
189
+ key={item.id}
190
+ title={item.title}
191
+ body={item.body}
192
+ level={level}
193
+ timeout={toastTimeout}
194
+ closeButton={item.closeButton ?? closeButton}
195
+ onDismiss={this.handleDismissed.bind(this, items.indexOf(item))}
196
+ translate={translate}
197
+ showIcon={showIcon}
198
+ />
199
+ );
200
+ })}
193
201
  </div>
194
202
  );
195
203
  });
@@ -199,7 +207,8 @@ export class ToastComponent extends React.Component<
199
207
  export default themeable(localeable(ToastComponent));
200
208
 
201
209
  interface ToastMessageProps {
202
- body: string;
210
+ title?: string | React.ReactNode;
211
+ body: string | React.ReactNode;
203
212
  level: 'info' | 'success' | 'error' | 'warning';
204
213
  timeout: number;
205
214
  closeButton?: boolean;
@@ -284,6 +293,7 @@ export class ToastMessage extends React.Component<
284
293
  onDismiss,
285
294
  classnames: cx,
286
295
  closeButton,
296
+ title,
287
297
  body,
288
298
  allowHtml,
289
299
  level,
@@ -321,8 +331,25 @@ export class ToastMessage extends React.Component<
321
331
  ) : null}
322
332
  </div>
323
333
  )}
324
- <div className={cx('Toast-body')}>
325
- {allowHtml ? <Html html={body} /> : body}
334
+
335
+ <div className={cx('Toast-content')}>
336
+ {typeof title === 'string' ? (
337
+ <span className={cx(`Toast-title`)}>{title}</span>
338
+ ) : React.isValidElement(title) ? (
339
+ React.cloneElement(title, {
340
+ className: cx(`Toast-title`, title?.props?.className ?? '')
341
+ })
342
+ ) : null}
343
+
344
+ {typeof body === 'string' ? (
345
+ <div className={cx('Toast-body')}>
346
+ {allowHtml ? <Html html={body} /> : body}
347
+ </div>
348
+ ) : React.isValidElement(body) ? (
349
+ React.cloneElement(body, {
350
+ className: cx(`Toast-body`, body?.props?.className ?? '')
351
+ })
352
+ ) : null}
326
353
  </div>
327
354
 
328
355
  {closeButton ? (