@atlaskit/renderer 130.2.17 → 130.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/dist/cjs/react/marks/link-compiled.compiled.css +6 -0
- package/dist/cjs/react/marks/link-compiled.js +27 -0
- package/dist/cjs/react/marks/link-emotion.js +42 -0
- package/dist/cjs/react/marks/link.js +13 -23
- package/dist/cjs/react/nodes/bodiedExtension.js +6 -3
- package/dist/cjs/react/nodes/extension.js +41 -11
- package/dist/cjs/react/nodes/layoutColumn-compiled.compiled.css +10 -0
- package/dist/cjs/react/nodes/layoutColumn-compiled.js +37 -0
- package/dist/cjs/react/nodes/layoutColumn-emotion.js +59 -0
- package/dist/cjs/react/nodes/layoutColumn.js +11 -41
- package/dist/cjs/react/nodes/panel-compiled.compiled.css +54 -0
- package/dist/cjs/react/nodes/panel-compiled.js +60 -0
- package/dist/cjs/react/nodes/panel-emotion.js +185 -0
- package/dist/cjs/react/nodes/panel.js +14 -181
- package/dist/cjs/ui/Renderer/index.js +1 -1
- package/dist/es2019/react/marks/link-compiled.compiled.css +6 -0
- package/dist/es2019/react/marks/link-compiled.js +17 -0
- package/dist/es2019/react/marks/link-emotion.js +31 -0
- package/dist/es2019/react/marks/link.js +13 -23
- package/dist/es2019/react/nodes/bodiedExtension.js +6 -3
- package/dist/es2019/react/nodes/extension.js +33 -4
- package/dist/es2019/react/nodes/layoutColumn-compiled.compiled.css +10 -0
- package/dist/es2019/react/nodes/layoutColumn-compiled.js +31 -0
- package/dist/es2019/react/nodes/layoutColumn-emotion.js +61 -0
- package/dist/es2019/react/nodes/layoutColumn.js +10 -50
- package/dist/es2019/react/nodes/panel-compiled.compiled.css +57 -0
- package/dist/es2019/react/nodes/panel-compiled.js +44 -0
- package/dist/es2019/react/nodes/panel-emotion.js +178 -0
- package/dist/es2019/react/nodes/panel.js +12 -180
- package/dist/es2019/ui/Renderer/index.js +1 -1
- package/dist/esm/react/marks/link-compiled.compiled.css +6 -0
- package/dist/esm/react/marks/link-compiled.js +19 -0
- package/dist/esm/react/marks/link-emotion.js +34 -0
- package/dist/esm/react/marks/link.js +15 -23
- package/dist/esm/react/nodes/bodiedExtension.js +6 -3
- package/dist/esm/react/nodes/extension.js +39 -11
- package/dist/esm/react/nodes/layoutColumn-compiled.compiled.css +10 -0
- package/dist/esm/react/nodes/layoutColumn-compiled.js +31 -0
- package/dist/esm/react/nodes/layoutColumn-emotion.js +52 -0
- package/dist/esm/react/nodes/layoutColumn.js +12 -41
- package/dist/esm/react/nodes/panel-compiled.compiled.css +54 -0
- package/dist/esm/react/nodes/panel-compiled.js +53 -0
- package/dist/esm/react/nodes/panel-emotion.js +179 -0
- package/dist/esm/react/nodes/panel.js +14 -181
- package/dist/esm/ui/Renderer/index.js +1 -1
- package/dist/types/analytics/events.d.ts +6 -2
- package/dist/types/react/marks/link-compiled.d.ts +13 -0
- package/dist/types/react/marks/link-emotion.d.ts +14 -0
- package/dist/types/react/marks/link.d.ts +5 -2
- package/dist/types/react/nodes/bodiedExtension.d.ts +2 -0
- package/dist/types/react/nodes/extension.d.ts +2 -0
- package/dist/types/react/nodes/layoutColumn-compiled.d.ts +14 -0
- package/dist/types/react/nodes/layoutColumn-emotion.d.ts +14 -0
- package/dist/types/react/nodes/layoutColumn.d.ts +3 -5
- package/dist/types/react/nodes/panel-compiled.d.ts +22 -0
- package/dist/types/react/nodes/panel-emotion.d.ts +23 -0
- package/dist/types/react/nodes/panel.d.ts +1 -6
- package/dist/types-ts4.5/analytics/events.d.ts +6 -2
- package/dist/types-ts4.5/react/marks/link-compiled.d.ts +13 -0
- package/dist/types-ts4.5/react/marks/link-emotion.d.ts +14 -0
- package/dist/types-ts4.5/react/marks/link.d.ts +5 -2
- package/dist/types-ts4.5/react/nodes/bodiedExtension.d.ts +2 -0
- package/dist/types-ts4.5/react/nodes/extension.d.ts +2 -0
- package/dist/types-ts4.5/react/nodes/layoutColumn-compiled.d.ts +14 -0
- package/dist/types-ts4.5/react/nodes/layoutColumn-emotion.d.ts +14 -0
- package/dist/types-ts4.5/react/nodes/layoutColumn.d.ts +3 -5
- package/dist/types-ts4.5/react/nodes/panel-compiled.d.ts +22 -0
- package/dist/types-ts4.5/react/nodes/panel-emotion.d.ts +23 -0
- package/dist/types-ts4.5/react/nodes/panel.d.ts +1 -6
- package/package.json +14 -9
|
@@ -1,183 +1,14 @@
|
|
|
1
|
-
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
-
/**
|
|
3
|
-
* @jsxRuntime classic
|
|
4
|
-
* @jsx jsx
|
|
5
|
-
*/
|
|
6
1
|
import React from 'react';
|
|
7
|
-
/* eslint-disable @typescript-eslint/consistent-type-imports, @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766; jsx required at runtime for @jsxRuntime classic */
|
|
8
|
-
import { jsx, css } from '@emotion/react';
|
|
9
|
-
import TipIcon from '@atlaskit/icon/core/lightbulb';
|
|
10
2
|
import { PanelType } from '@atlaskit/adf-schema';
|
|
3
|
+
import { PanelInfoIcon, PanelSuccessIcon, PanelNoteIcon, PanelWarningIcon, PanelErrorIcon } from '@atlaskit/editor-common/icons';
|
|
11
4
|
import { PanelSharedCssClassName } from '@atlaskit/editor-common/panel';
|
|
12
|
-
import { hexToEditorBackgroundPaletteColor } from '@atlaskit/editor-palette';
|
|
13
5
|
import EmojiIcon from '@atlaskit/icon/core/emoji';
|
|
6
|
+
import TipIcon from '@atlaskit/icon/core/lightbulb';
|
|
7
|
+
import { componentWithCondition } from '@atlaskit/platform-feature-flags-react';
|
|
8
|
+
import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
|
|
14
9
|
import EmojiItem from './emoji';
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import { fg } from '@atlaskit/platform-feature-flags';
|
|
18
|
-
// New custom icons are a little smaller than predefined icons.
|
|
19
|
-
// To fix alignment issues with custom icons, vertical alignment is updated.
|
|
20
|
-
const panelEmojiSpriteVerticalAlignment = -(8 * 3 - akEditorCustomIconSize) / 2;
|
|
21
|
-
const panelEmojiImageVerticalAlignment = panelEmojiSpriteVerticalAlignment - 1;
|
|
22
|
-
const blockNodesVerticalMargin = '0.75rem';
|
|
23
|
-
const akEditorTableCellMinWidth = 48;
|
|
24
|
-
const panelBaseStyles = css({
|
|
25
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
26
|
-
'&.ak-editor-panel': {
|
|
27
|
-
borderRadius: "var(--ds-radius-small, 3px)",
|
|
28
|
-
margin: `${blockNodesVerticalMargin} 0 0`,
|
|
29
|
-
paddingTop: "var(--ds-space-100, 8px)",
|
|
30
|
-
paddingRight: "var(--ds-space-200, 16px)",
|
|
31
|
-
paddingBottom: "var(--ds-space-100, 8px)",
|
|
32
|
-
paddingLeft: "var(--ds-space-100, 8px)",
|
|
33
|
-
minWidth: `${akEditorTableCellMinWidth}px`,
|
|
34
|
-
display: 'flex',
|
|
35
|
-
position: 'relative',
|
|
36
|
-
alignItems: 'normal',
|
|
37
|
-
wordBreak: 'break-word',
|
|
38
|
-
backgroundColor: "var(--ds-background-accent-blue-subtlest, #E9F2FE)",
|
|
39
|
-
color: 'inherit',
|
|
40
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
41
|
-
'.ak-editor-panel__icon': {
|
|
42
|
-
flexShrink: 0,
|
|
43
|
-
height: "var(--ds-space-300, 24px)",
|
|
44
|
-
width: "var(--ds-space-300, 24px)",
|
|
45
|
-
boxSizing: 'content-box',
|
|
46
|
-
paddingRight: "var(--ds-space-100, 8px)",
|
|
47
|
-
textAlign: 'center',
|
|
48
|
-
userSelect: 'none',
|
|
49
|
-
MozUserSelect: 'none',
|
|
50
|
-
WebkitUserSelect: 'none',
|
|
51
|
-
MsUserSelect: 'none',
|
|
52
|
-
// eslint-disable-next-line @atlaskit/design-system/use-tokens-space
|
|
53
|
-
marginTop: '0.1em',
|
|
54
|
-
color: "var(--ds-icon-information, #357DE8)",
|
|
55
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
56
|
-
'> span': {
|
|
57
|
-
verticalAlign: 'middle',
|
|
58
|
-
display: 'inline-flex'
|
|
59
|
-
},
|
|
60
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
61
|
-
'.emoji-common-emoji-sprite': {
|
|
62
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-unsafe-values
|
|
63
|
-
verticalAlign: `${panelEmojiSpriteVerticalAlignment}px`
|
|
64
|
-
},
|
|
65
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
66
|
-
'.emoji-common-emoji-image': {
|
|
67
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-unsafe-values
|
|
68
|
-
verticalAlign: `${panelEmojiImageVerticalAlignment}px`,
|
|
69
|
-
// Vertical align only works for inline-block elements in Firefox
|
|
70
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-unsafe-selectors
|
|
71
|
-
'@-moz-document url-prefix()': {
|
|
72
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
73
|
-
img: {
|
|
74
|
-
display: 'inline-block'
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
},
|
|
79
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
80
|
-
'.ak-editor-panel__content': {
|
|
81
|
-
margin: `${"var(--ds-space-025, 2px)"} 0 ${"var(--ds-space-025, 2px)"}`,
|
|
82
|
-
flex: '1 0 0',
|
|
83
|
-
/*
|
|
84
|
-
https://ishadeed.com/article/min-max-css/#setting-min-width-to-zero-with-flexbox
|
|
85
|
-
The default value for min-width is auto, which is computed to zero. When an element is a flex item, the value of min-width doesn’t compute to zero. The minimum size of a flex item is equal to the size of its contents.
|
|
86
|
-
*/
|
|
87
|
-
minWidth: 0
|
|
88
|
-
},
|
|
89
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
90
|
-
'&[data-panel-type="note"]': {
|
|
91
|
-
backgroundColor: "var(--ds-background-accent-purple-subtlest, #F8EEFE)",
|
|
92
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
93
|
-
'.ak-editor-panel__icon': {
|
|
94
|
-
color: "var(--ds-icon-discovery, #AF59E1)"
|
|
95
|
-
}
|
|
96
|
-
},
|
|
97
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-values, @atlaskit/ui-styling-standard/no-imported-style-values
|
|
98
|
-
'&[data-panel-type="tip"]': {
|
|
99
|
-
backgroundColor: "var(--ds-background-accent-green-subtlest, #DCFFF1)",
|
|
100
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
101
|
-
'.ak-editor-panel__icon': {
|
|
102
|
-
color: "var(--ds-icon-success, #6A9A23)"
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-values, @atlaskit/ui-styling-standard/no-imported-style-values
|
|
106
|
-
'&[data-panel-type="warning"]': {
|
|
107
|
-
backgroundColor: "var(--ds-background-accent-yellow-subtlest, #FEF7C8)",
|
|
108
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
109
|
-
'.ak-editor-panel__icon': {
|
|
110
|
-
color: "var(--ds-icon-warning, #E06C00)"
|
|
111
|
-
}
|
|
112
|
-
},
|
|
113
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-values, @atlaskit/ui-styling-standard/no-imported-style-values
|
|
114
|
-
'&[data-panel-type="error"]': {
|
|
115
|
-
backgroundColor: "var(--ds-background-accent-red-subtlest, #FFECEB)",
|
|
116
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
117
|
-
'.ak-editor-panel__icon': {
|
|
118
|
-
color: "var(--ds-icon-danger, #C9372C)"
|
|
119
|
-
}
|
|
120
|
-
},
|
|
121
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-values, @atlaskit/ui-styling-standard/no-imported-style-values
|
|
122
|
-
'&[data-panel-type="success"]': {
|
|
123
|
-
backgroundColor: "var(--ds-background-accent-green-subtlest, #DCFFF1)",
|
|
124
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
125
|
-
'.ak-editor-panel__icon': {
|
|
126
|
-
color: "var(--ds-icon-success, #6A9A23)"
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
const panelHasNoIconStyles = css({
|
|
132
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-values, @atlaskit/ui-styling-standard/no-imported-style-values
|
|
133
|
-
'&.ak-editor-panel': {
|
|
134
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
135
|
-
'&[data-panel-type="custom"]': {
|
|
136
|
-
paddingLeft: "var(--ds-space-150, 12px)",
|
|
137
|
-
paddingRight: "var(--ds-space-150, 12px)"
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
const panelNestedIconStyles = css({
|
|
142
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
143
|
-
'&.ak-editor-panel__no-icon': {
|
|
144
|
-
paddingLeft: "var(--ds-space-150, 12px)",
|
|
145
|
-
paddingRight: "var(--ds-space-150, 12px)"
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
const nestedPanelStyles = css({
|
|
149
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
150
|
-
'.ak-editor-panel__content .ak-editor-panel': {
|
|
151
|
-
border: `${"var(--ds-border-width, 1px)"} solid ${"var(--ds-border, #0B120E24)"}`
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
const panelCustomBackground = css({
|
|
155
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-values, @atlaskit/ui-styling-standard/no-imported-style-values
|
|
156
|
-
'&.ak-editor-panel': {
|
|
157
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors
|
|
158
|
-
'&[data-panel-type="custom"]': {
|
|
159
|
-
backgroundColor: 'var(--ak-renderer-panel-custom-bg-color)'
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
const PanelStyled = ({
|
|
164
|
-
backgroundColor,
|
|
165
|
-
hasIcon,
|
|
166
|
-
...props
|
|
167
|
-
}) => {
|
|
168
|
-
const customBackgroundColor = backgroundColor ? hexToEditorBackgroundPaletteColor(backgroundColor) || backgroundColor : undefined;
|
|
169
|
-
return jsx("div", _extends({
|
|
170
|
-
style:
|
|
171
|
-
// eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop
|
|
172
|
-
{
|
|
173
|
-
'--ak-renderer-panel-custom-bg-color': customBackgroundColor
|
|
174
|
-
},
|
|
175
|
-
css: [panelBaseStyles, !hasIcon && panelHasNoIconStyles, props['data-panel-type'] === PanelType.CUSTOM && backgroundColor && panelCustomBackground, fg('platform_editor_nested_dnd_styles_changes') && panelNestedIconStyles, nestedPanelStyles]
|
|
176
|
-
// Ignored via go/ees005
|
|
177
|
-
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
178
|
-
}, props), props.children);
|
|
179
|
-
};
|
|
180
|
-
PanelStyled.displayName = 'PanelStyled';
|
|
10
|
+
import { PanelStyledCompiled } from './panel-compiled';
|
|
11
|
+
import { PanelStyledEmotion } from './panel-emotion';
|
|
181
12
|
const panelIcons = {
|
|
182
13
|
info: PanelInfoIcon,
|
|
183
14
|
success: PanelSuccessIcon,
|
|
@@ -187,6 +18,7 @@ const panelIcons = {
|
|
|
187
18
|
error: PanelErrorIcon,
|
|
188
19
|
custom: EmojiIcon
|
|
189
20
|
};
|
|
21
|
+
const PanelStyledMigration = componentWithCondition(() => expValEquals('platform_editor_renderer_static_css', 'isEnabled', true), PanelStyledCompiled, PanelStyledEmotion);
|
|
190
22
|
const Panel = props => {
|
|
191
23
|
const {
|
|
192
24
|
allowCustomPanels,
|
|
@@ -205,7 +37,7 @@ const Panel = props => {
|
|
|
205
37
|
const getIcon = () => {
|
|
206
38
|
if (panelType === PanelType.CUSTOM) {
|
|
207
39
|
if (panelIcon && providers) {
|
|
208
|
-
return
|
|
40
|
+
return /*#__PURE__*/React.createElement(EmojiItem, {
|
|
209
41
|
id: panelIconId,
|
|
210
42
|
text: panelIconText,
|
|
211
43
|
shortName: panelIcon,
|
|
@@ -215,7 +47,7 @@ const Panel = props => {
|
|
|
215
47
|
return null;
|
|
216
48
|
}
|
|
217
49
|
const Icon = panelIcons[panelType];
|
|
218
|
-
return
|
|
50
|
+
return /*#__PURE__*/React.createElement(Icon, {
|
|
219
51
|
label: `${panelType} panel`
|
|
220
52
|
});
|
|
221
53
|
};
|
|
@@ -223,12 +55,12 @@ const Panel = props => {
|
|
|
223
55
|
const renderIcon = () => {
|
|
224
56
|
if (icon) {
|
|
225
57
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
|
|
226
|
-
return
|
|
58
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
227
59
|
className: PanelSharedCssClassName.icon
|
|
228
60
|
}, icon);
|
|
229
61
|
}
|
|
230
62
|
};
|
|
231
|
-
return
|
|
63
|
+
return /*#__PURE__*/React.createElement(PanelStyledMigration
|
|
232
64
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
|
|
233
65
|
, {
|
|
234
66
|
className: PanelSharedCssClassName.prefix,
|
|
@@ -240,7 +72,7 @@ const Panel = props => {
|
|
|
240
72
|
"data-panel-icon-text": panelIconText,
|
|
241
73
|
backgroundColor: panelColor,
|
|
242
74
|
hasIcon: Boolean(icon)
|
|
243
|
-
}, renderIcon(),
|
|
75
|
+
}, renderIcon(), /*#__PURE__*/React.createElement("div", {
|
|
244
76
|
className: PanelSharedCssClassName.content
|
|
245
77
|
}, children));
|
|
246
78
|
};
|
|
@@ -57,7 +57,7 @@ export const DEGRADED_SEVERITY_THRESHOLD = 3000;
|
|
|
57
57
|
const TABLE_INFO_TIMEOUT = 10000;
|
|
58
58
|
const RENDER_EVENT_SAMPLE_RATE = 0.2;
|
|
59
59
|
const packageName = "@atlaskit/renderer";
|
|
60
|
-
const packageVersion = "
|
|
60
|
+
const packageVersion = "130.2.18";
|
|
61
61
|
const setAsQueryContainerStyles = css({
|
|
62
62
|
containerName: 'ak-renderer-wrapper',
|
|
63
63
|
containerType: 'inline-size'
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
|
|
2
|
+
._syaz13af{color:var(--ds-link,#1868db)}._1bnx8stv:hover{text-decoration-line:underline}
|
|
3
|
+
._30l313af:hover{color:var(--ds-link,#1868db)}
|
|
4
|
+
._9oik1r31:hover{text-decoration-color:currentColor}
|
|
5
|
+
._jf4cnqa1:hover{text-decoration-style:solid}
|
|
6
|
+
._9h8h12zz:active{color:var(--ds-link-pressed,#1558bc)}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/* link-compiled.tsx generated by @compiled/babel-plugin v0.39.1 */
|
|
2
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
3
|
+
import "./link-compiled.compiled.css";
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { ax, ix } from "@compiled/react/runtime";
|
|
6
|
+
/**
|
|
7
|
+
* Compiled branch of the `platform_editor_static_css` experiment.
|
|
8
|
+
* Used via `componentWithCondition` in `link.tsx`.
|
|
9
|
+
*
|
|
10
|
+
* Cleanup: delete this file once the experiment has shipped.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import LinkUrl from '@atlaskit/smart-card/link-url';
|
|
14
|
+
var anchorStyles = null;
|
|
15
|
+
export var LinkUrlCompiled = function LinkUrlCompiled(props) {
|
|
16
|
+
return /*#__PURE__*/React.createElement(LinkUrl, _extends({}, props, {
|
|
17
|
+
className: ax(["_syaz13af _9oik1r31 _1bnx8stv _jf4cnqa1 _30l313af _9h8h12zz"])
|
|
18
|
+
}));
|
|
19
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
/**
|
|
3
|
+
* @jsxRuntime classic
|
|
4
|
+
* @jsx jsx
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Emotion branch of the `platform_editor_static_css` experiment.
|
|
8
|
+
* Used via `componentWithCondition` in `link.tsx`.
|
|
9
|
+
*
|
|
10
|
+
* Cleanup: delete this file once the experiment has shipped.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- intentional: emotion fallback for compiled migration
|
|
14
|
+
import { css, jsx } from '@emotion/react';
|
|
15
|
+
import LinkUrl from '@atlaskit/smart-card/link-url';
|
|
16
|
+
var anchorStyles = css({
|
|
17
|
+
color: "var(--ds-link, #1868DB)",
|
|
18
|
+
'&:hover': {
|
|
19
|
+
color: "var(--ds-link, #1868DB)",
|
|
20
|
+
textDecoration: 'underline'
|
|
21
|
+
},
|
|
22
|
+
'&:active': {
|
|
23
|
+
color: "var(--ds-link-pressed, #1558BC)"
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
export var LinkUrlEmotion = function LinkUrlEmotion(props) {
|
|
27
|
+
return (
|
|
28
|
+
// Ignored via go/ees005
|
|
29
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
30
|
+
jsx(LinkUrl, _extends({
|
|
31
|
+
css: anchorStyles
|
|
32
|
+
}, props))
|
|
33
|
+
);
|
|
34
|
+
};
|
|
@@ -1,26 +1,19 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
-
/**
|
|
3
|
-
* @jsxRuntime classic
|
|
4
|
-
* @jsx jsx
|
|
5
|
-
*/
|
|
6
2
|
import React, { Fragment } from 'react';
|
|
7
|
-
|
|
8
|
-
import { jsx, css } from '@emotion/react';
|
|
3
|
+
import { componentWithCondition } from '@atlaskit/platform-feature-flags-react';
|
|
9
4
|
import { getEventHandler } from '../../utils';
|
|
10
5
|
import { PLATFORM, MODE } from '../../analytics/events';
|
|
11
6
|
import { ACTION, ACTION_SUBJECT, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
|
|
12
|
-
import
|
|
7
|
+
import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
|
|
13
8
|
import { AnalyticsContext } from '@atlaskit/analytics-next';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
});
|
|
9
|
+
import { LinkUrlCompiled } from './link-compiled';
|
|
10
|
+
import { LinkUrlEmotion } from './link-emotion';
|
|
11
|
+
var LinkUrlMigration = componentWithCondition(function () {
|
|
12
|
+
return expValEquals('platform_editor_renderer_static_css', 'isEnabled', true);
|
|
13
|
+
}, LinkUrlCompiled, LinkUrlEmotion);
|
|
14
|
+
/**
|
|
15
|
+
* Render an ADF link mark in renderer.
|
|
16
|
+
*/
|
|
24
17
|
export default function Link(props) {
|
|
25
18
|
var href = props.href,
|
|
26
19
|
target = props.target,
|
|
@@ -49,7 +42,7 @@ export default function Link(props) {
|
|
|
49
42
|
}
|
|
50
43
|
var handler = getEventHandler(eventHandlers, 'link');
|
|
51
44
|
if (isMediaLink) {
|
|
52
|
-
return
|
|
45
|
+
return /*#__PURE__*/React.createElement(Fragment, null, props.children);
|
|
53
46
|
}
|
|
54
47
|
var analyticsData = {
|
|
55
48
|
attributes: {
|
|
@@ -58,12 +51,11 @@ export default function Link(props) {
|
|
|
58
51
|
// Below is added for the future implementation of Linking Platform namespaced analytic context
|
|
59
52
|
location: 'renderer'
|
|
60
53
|
};
|
|
61
|
-
return
|
|
54
|
+
return /*#__PURE__*/React.createElement(AnalyticsContext, {
|
|
62
55
|
data: analyticsData
|
|
63
|
-
},
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
,
|
|
56
|
+
}, /*#__PURE__*/React.createElement(LinkUrlMigration
|
|
57
|
+
// eslint-disable-next-line @atlassian/perf-linting/no-unstable-inline-props -- Ignored via go/ees017 (to be fixed)
|
|
58
|
+
, _extends({
|
|
67
59
|
onClick: function onClick(e) {
|
|
68
60
|
if (fireAnalyticsEvent) {
|
|
69
61
|
fireAnalyticsEvent({
|
|
@@ -19,7 +19,8 @@ var BodiedExtension = function BodiedExtension(props) {
|
|
|
19
19
|
parameters = props.parameters,
|
|
20
20
|
extensionViewportSizes = props.extensionViewportSizes,
|
|
21
21
|
localId = props.localId,
|
|
22
|
-
shouldDisplayExtensionAsInline = props.shouldDisplayExtensionAsInline
|
|
22
|
+
shouldDisplayExtensionAsInline = props.shouldDisplayExtensionAsInline,
|
|
23
|
+
fireAnalyticsEvent = props.fireAnalyticsEvent;
|
|
23
24
|
var _useAnalyticsEvents = useAnalyticsEvents(),
|
|
24
25
|
createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
|
|
25
26
|
var removeOverflow = React.Children.toArray(children)
|
|
@@ -57,7 +58,8 @@ var BodiedExtension = function BodiedExtension(props) {
|
|
|
57
58
|
// Return the content directly if it's a valid JSX.Element
|
|
58
59
|
return renderExtension(result, layout, {
|
|
59
60
|
isTopLevel: path.length < 1,
|
|
60
|
-
rendererAppearance: props.rendererAppearance
|
|
61
|
+
rendererAppearance: props.rendererAppearance,
|
|
62
|
+
fireAnalyticsEvent: fireAnalyticsEvent
|
|
61
63
|
}, removeOverflow, parameters === null || parameters === void 0 ? void 0 : parameters.extensionId, extensionViewportSizes, undefined, localId, shouldDisplayExtensionAsInline, node);
|
|
62
64
|
}
|
|
63
65
|
} catch (_unused) {
|
|
@@ -68,7 +70,8 @@ var BodiedExtension = function BodiedExtension(props) {
|
|
|
68
70
|
// Always return default content if anything goes wrong
|
|
69
71
|
return renderExtension(children, layout, {
|
|
70
72
|
isTopLevel: path.length < 1,
|
|
71
|
-
rendererAppearance: props.rendererAppearance
|
|
73
|
+
rendererAppearance: props.rendererAppearance,
|
|
74
|
+
fireAnalyticsEvent: fireAnalyticsEvent
|
|
72
75
|
}, removeOverflow, parameters === null || parameters === void 0 ? void 0 : parameters.extensionId, extensionViewportSizes, undefined, localId, shouldDisplayExtensionAsInline, node);
|
|
73
76
|
}))));
|
|
74
77
|
};
|
|
@@ -6,7 +6,8 @@ import _extends from "@babel/runtime/helpers/extends";
|
|
|
6
6
|
|
|
7
7
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
|
|
8
8
|
import { jsx, css } from '@emotion/react';
|
|
9
|
-
import React from 'react';
|
|
9
|
+
import React, { useEffect, useRef } from 'react';
|
|
10
|
+
import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
|
|
10
11
|
import ExtensionRenderer from '../../ui/ExtensionRenderer';
|
|
11
12
|
import { overflowShadow, WidthConsumer } from '@atlaskit/editor-common/ui';
|
|
12
13
|
import { calcBreakoutWidth } from '@atlaskit/editor-common/utils';
|
|
@@ -38,6 +39,28 @@ var getViewportSize = function getViewportSize(extensionId, extensionViewportSiz
|
|
|
38
39
|
var containerStyle = css({
|
|
39
40
|
containerType: 'inline-size'
|
|
40
41
|
});
|
|
42
|
+
/**
|
|
43
|
+
* Fires an analytics event once on mount when a bodied extension is rendered as an inline element.
|
|
44
|
+
* The node is stored in a ref to avoid re-firing if the node reference changes.
|
|
45
|
+
*/
|
|
46
|
+
var FireExtensionAsInlineAnalytics = function FireExtensionAsInlineAnalytics(_ref) {
|
|
47
|
+
var fireAnalyticsEvent = _ref.fireAnalyticsEvent,
|
|
48
|
+
node = _ref.node;
|
|
49
|
+
var nodeRef = useRef(node);
|
|
50
|
+
useEffect(function () {
|
|
51
|
+
fireAnalyticsEvent({
|
|
52
|
+
action: ACTION.RENDERED,
|
|
53
|
+
actionSubject: ACTION_SUBJECT.EXTENSION_AS_INLINE,
|
|
54
|
+
actionSubjectId: ACTION_SUBJECT_ID.EXTENSION_BODIED,
|
|
55
|
+
attributes: {
|
|
56
|
+
extensionKey: nodeRef.current.extensionKey,
|
|
57
|
+
extensionType: nodeRef.current.extensionType
|
|
58
|
+
},
|
|
59
|
+
eventType: EVENT_TYPE.OPERATIONAL
|
|
60
|
+
});
|
|
61
|
+
}, [fireAnalyticsEvent]);
|
|
62
|
+
return null;
|
|
63
|
+
};
|
|
41
64
|
export var renderExtension = function renderExtension(content, layout) {
|
|
42
65
|
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
43
66
|
var removeOverflow = arguments.length > 3 ? arguments[3] : undefined;
|
|
@@ -51,10 +74,11 @@ export var renderExtension = function renderExtension(content, layout) {
|
|
|
51
74
|
var overflowContainerClass = !removeOverflow ? RendererCssClassName.EXTENSION_OVERFLOW_CONTAINER : '';
|
|
52
75
|
|
|
53
76
|
// by default, we assume the extension is at top level, (direct child of doc node)
|
|
54
|
-
var
|
|
55
|
-
|
|
56
|
-
isTopLevel =
|
|
57
|
-
rendererAppearance =
|
|
77
|
+
var _ref2 = options || {},
|
|
78
|
+
_ref2$isTopLevel = _ref2.isTopLevel,
|
|
79
|
+
isTopLevel = _ref2$isTopLevel === void 0 ? true : _ref2$isTopLevel,
|
|
80
|
+
rendererAppearance = _ref2.rendererAppearance,
|
|
81
|
+
fireAnalyticsEvent = _ref2.fireAnalyticsEvent;
|
|
58
82
|
// we should only use custom layout for full-page appearance
|
|
59
83
|
var canUseCustomLayout = expValEquals('platform_editor_remove_important_in_render_ext', 'isEnabled', true) ? rendererAppearance === 'full-page' : true;
|
|
60
84
|
var isCustomLayout = isTopLevel && ['wide', 'full-width'].includes(layout) && canUseCustomLayout;
|
|
@@ -69,6 +93,10 @@ export var renderExtension = function renderExtension(content, layout) {
|
|
|
69
93
|
var extensionHeight = nodeHeight || viewportSize;
|
|
70
94
|
var isInline = (shouldDisplayExtensionAsInline === null || shouldDisplayExtensionAsInline === void 0 ? void 0 : shouldDisplayExtensionAsInline(node)) && expValEquals('platform_editor_render_bodied_extension_as_inline', 'isEnabled', true);
|
|
71
95
|
var inlineClassName = isInline ? RendererCssClassName.EXTENSION_AS_INLINE : '';
|
|
96
|
+
var asInlineAnalytics = isInline && fireAnalyticsEvent && node && fg('platform_editor_render_inline_extension_analytics') ? jsx(FireExtensionAsInlineAnalytics, {
|
|
97
|
+
fireAnalyticsEvent: fireAnalyticsEvent,
|
|
98
|
+
node: node
|
|
99
|
+
}) : null;
|
|
72
100
|
if (expValEquals('platform_editor_renderer_extension_width_fix', 'isEnabled', true)) {
|
|
73
101
|
var extensionDiv = jsx("div", {
|
|
74
102
|
ref: options.handleRef
|
|
@@ -92,14 +120,14 @@ export var renderExtension = function renderExtension(content, layout) {
|
|
|
92
120
|
,
|
|
93
121
|
className: "".concat(RendererCssClassName.EXTENSION_INNER_WRAPPER, " ").concat(overflowContainerClass),
|
|
94
122
|
css: [!isInsideOfInlineExtension && fg('platform_fix_macro_renders_in_layouts') && containerStyle]
|
|
95
|
-
}, content));
|
|
123
|
+
}, asInlineAnalytics, content));
|
|
96
124
|
return centerAlignClass && expValEquals('platform_editor_flex_based_centering', 'isEnabled', true) ? jsx("div", {
|
|
97
125
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop
|
|
98
126
|
className: RendererCssClassName.STICKY_SAFE_CENTER_WRAPPER + ' ' + RendererCssClassName.FLEX_CENTER_WRAPPER
|
|
99
127
|
}, extensionDiv) : extensionDiv;
|
|
100
128
|
}
|
|
101
|
-
return jsx(WidthConsumer, null, function (
|
|
102
|
-
var width =
|
|
129
|
+
return jsx(WidthConsumer, null, function (_ref3) {
|
|
130
|
+
var width = _ref3.width;
|
|
103
131
|
var extensionDiv = jsx("div", {
|
|
104
132
|
ref: options.handleRef
|
|
105
133
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
|
|
@@ -121,7 +149,7 @@ export var renderExtension = function renderExtension(content, layout) {
|
|
|
121
149
|
,
|
|
122
150
|
className: "".concat(RendererCssClassName.EXTENSION_INNER_WRAPPER, " ").concat(overflowContainerClass),
|
|
123
151
|
css: [!isInsideOfInlineExtension && fg('platform_fix_macro_renders_in_layouts') && containerStyle]
|
|
124
|
-
}, content));
|
|
152
|
+
}, asInlineAnalytics, content));
|
|
125
153
|
return centerAlignClass && expValEquals('platform_editor_flex_based_centering', 'isEnabled', true) ? jsx("div", {
|
|
126
154
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop
|
|
127
155
|
className: RendererCssClassName.STICKY_SAFE_CENTER_WRAPPER + ' ' + RendererCssClassName.FLEX_CENTER_WRAPPER
|
|
@@ -146,8 +174,8 @@ var Extension = function Extension(props) {
|
|
|
146
174
|
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
147
175
|
, _extends({}, props, {
|
|
148
176
|
type: "extension"
|
|
149
|
-
}), function (
|
|
150
|
-
var result =
|
|
177
|
+
}), function (_ref4) {
|
|
178
|
+
var result = _ref4.result;
|
|
151
179
|
try {
|
|
152
180
|
// Return the result directly if it's a valid JSX.Element
|
|
153
181
|
if (result && /*#__PURE__*/React.isValidElement(result)) {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
._12kpidpf [class*=image-wrap-]:has(+[class*=image-wrap-]){margin-top:0}
|
|
2
|
+
._166hgrf3+.fabric-editor-block-mark>h4{margin-top:0!important}
|
|
3
|
+
._19segrf3+.fabric-editor-block-mark>h1{margin-top:0!important}
|
|
4
|
+
._1ki1grf3+.fabric-editor-block-mark>h2{margin-top:0!important}
|
|
5
|
+
._1skbgrf3+*{margin-top:0!important}
|
|
6
|
+
._1tihidpf [class*=image-wrap-]+[class*=image-wrap-]{margin-top:0}
|
|
7
|
+
._7g1ogrf3+.fabric-editor-block-mark>h5{margin-top:0!important}
|
|
8
|
+
._bmdegrf3+.fabric-editor-block-mark>h3{margin-top:0!important}
|
|
9
|
+
._hgeogrf3+.fabric-editor-block-mark>p{margin-top:0!important}
|
|
10
|
+
._sk2jgrf3+.fabric-editor-block-mark>h6{margin-top:0!important}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* layoutColumn-compiled.tsx generated by @compiled/babel-plugin v0.39.1 */
|
|
2
|
+
/**
|
|
3
|
+
* Compiled branch of the `platform_editor_static_css` experiment.
|
|
4
|
+
* Used via `componentWithCondition` in `layoutColumn.tsx`.
|
|
5
|
+
*
|
|
6
|
+
* Cleanup: delete this file once the experiment has shipped.
|
|
7
|
+
*/
|
|
8
|
+
import "./layoutColumn-compiled.compiled.css";
|
|
9
|
+
import { ax, ix } from "@compiled/react/runtime";
|
|
10
|
+
import React from 'react';
|
|
11
|
+
import { WidthProvider } from '@atlaskit/editor-common/ui';
|
|
12
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
13
|
+
|
|
14
|
+
// localized styles, was from clearNextSiblingMarginTopStyle in @atlaskit/editor-common/ui
|
|
15
|
+
var clearNextSiblingMarginTopStyle = null;
|
|
16
|
+
var multipleWrappedImagesStyle = null;
|
|
17
|
+
|
|
18
|
+
// localized styles, was from clearNextSiblingBlockMarkMarginTopStyle in @atlaskit/editor-common/ui
|
|
19
|
+
var clearNextSiblingBlockMarkMarginTopStyle = null;
|
|
20
|
+
export var LayoutSectionCompiled = function LayoutSectionCompiled(props) {
|
|
21
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
22
|
+
"data-layout-column": true,
|
|
23
|
+
"data-column-width": props.width,
|
|
24
|
+
style: {
|
|
25
|
+
flexBasis: "".concat(props.width, "%")
|
|
26
|
+
},
|
|
27
|
+
className: ax([fg('platform_editor_fix_media_in_renderer') && "_1tihidpf _12kpidpf"])
|
|
28
|
+
}, /*#__PURE__*/React.createElement(WidthProvider, null, /*#__PURE__*/React.createElement("div", {
|
|
29
|
+
className: ax(["_1skbgrf3", "_19segrf3 _1ki1grf3 _bmdegrf3 _166hgrf3 _7g1ogrf3 _sk2jgrf3 _hgeogrf3"])
|
|
30
|
+
}), props.children));
|
|
31
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
/**
|
|
3
|
+
* @jsxRuntime classic
|
|
4
|
+
* @jsx jsx
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Emotion branch of the `platform_editor_static_css` experiment.
|
|
8
|
+
* Used via `componentWithCondition` in `layoutColumn.tsx`.
|
|
9
|
+
*
|
|
10
|
+
* Cleanup: delete this file once the experiment has shipped.
|
|
11
|
+
*/
|
|
12
|
+
import React from 'react';
|
|
13
|
+
|
|
14
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- intentional: emotion fallback for compiled migration
|
|
15
|
+
import { jsx, css } from '@emotion/react';
|
|
16
|
+
import { WidthProvider } from '@atlaskit/editor-common/ui';
|
|
17
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
18
|
+
|
|
19
|
+
// localized styles, was from clearNextSiblingMarginTopStyle in @atlaskit/editor-common/ui
|
|
20
|
+
var clearNextSiblingMarginTopStyle = css({
|
|
21
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors -- Ignored via go/DSP-18766
|
|
22
|
+
'& + *': {
|
|
23
|
+
// eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview, @atlaskit/ui-styling-standard/no-important-styles -- Ignored via go/DSP-18766
|
|
24
|
+
marginTop: '0 !important'
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
var multipleWrappedImagesStyle = css({
|
|
28
|
+
// Given the first wrapped mediaSingle has 0 marginTop (see clearNextSiblingMarginTopStyle),
|
|
29
|
+
// update all wrapped mediaSingle inside layout to have 0 margin top unless they don't have sibling wrapped mediaSingle
|
|
30
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors, @atlaskit/ui-styling-standard/no-unsafe-selectors
|
|
31
|
+
'& [class*="image-wrap-"] + [class*="image-wrap-"], & [class*="image-wrap-"]:has( + [class*="image-wrap-"])': {
|
|
32
|
+
marginTop: '0'
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// localized styles, was from clearNextSiblingBlockMarkMarginTopStyle in @atlaskit/editor-common/ui
|
|
37
|
+
var clearNextSiblingBlockMarkMarginTopStyle = css(_defineProperty({}, "+ .fabric-editor-block-mark > p,\n\t + .fabric-editor-block-mark > h1,\n\t + .fabric-editor-block-mark > h2,\n\t + .fabric-editor-block-mark > h3,\n\t + .fabric-editor-block-mark > h4,\n\t + .fabric-editor-block-mark > h5,\n\t + .fabric-editor-block-mark > h6\n\t", {
|
|
38
|
+
// eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview, @atlaskit/ui-styling-standard/no-important-styles -- Ignored via go/DSP-18766
|
|
39
|
+
marginTop: '0 !important'
|
|
40
|
+
}));
|
|
41
|
+
export var LayoutSectionEmotion = function LayoutSectionEmotion(props) {
|
|
42
|
+
return jsx("div", {
|
|
43
|
+
"data-layout-column": true,
|
|
44
|
+
"data-column-width": props.width,
|
|
45
|
+
style: {
|
|
46
|
+
flexBasis: "".concat(props.width, "%")
|
|
47
|
+
},
|
|
48
|
+
css: fg('platform_editor_fix_media_in_renderer') && multipleWrappedImagesStyle
|
|
49
|
+
}, jsx(WidthProvider, null, jsx("div", {
|
|
50
|
+
css: [clearNextSiblingMarginTopStyle, clearNextSiblingBlockMarkMarginTopStyle]
|
|
51
|
+
}), props.children));
|
|
52
|
+
};
|