@blocklet/launcher-layout 2.1.84 → 2.1.86
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/README.md +1 -1
- package/lib/header.js +61 -41
- package/lib/index.js +15 -7
- package/lib/locale.js +2 -2
- package/lib/nav.js +16 -9
- package/package.json +4 -4
- /package/lib/assets/{defaultBlockletLogo.png → blocklet-default-logo.png} +0 -0
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ const theme = useTheme()
|
|
|
21
21
|
return <ThemeProvider theme={theme}> {/* The component library depends on the theme of mui, you should wrap components with ThemeProvider */}
|
|
22
22
|
<LocaleProvider translations={[]}>
|
|
23
23
|
<StepProvider steps={steps}>
|
|
24
|
-
<Layout blockletMeta={blockletMeta}>This is page content</Layout>
|
|
24
|
+
<Layout blockletMeta={blockletMeta} loading={false} navSubTitle="Restore">This is page content</Layout>
|
|
25
25
|
</StepProvider>
|
|
26
26
|
</LocaleProvider>
|
|
27
27
|
<ThemeProvider>
|
package/lib/header.js
CHANGED
|
@@ -9,9 +9,8 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
|
9
9
|
var _styled = _interopRequireDefault(require("@emotion/styled"));
|
|
10
10
|
var _useMediaQuery = _interopRequireDefault(require("@mui/material/useMediaQuery"));
|
|
11
11
|
var _Skeleton = _interopRequireDefault(require("@mui/material/Skeleton"));
|
|
12
|
-
var _Avatar = _interopRequireDefault(require("@arcblock/did-connect/lib/Avatar"));
|
|
13
12
|
var _Img = _interopRequireDefault(require("@arcblock/ux/lib/Img"));
|
|
14
|
-
var
|
|
13
|
+
var _blockletDefaultLogo = _interopRequireDefault(require("./assets/blocklet-default-logo.png"));
|
|
15
14
|
var _locale = require("./locale");
|
|
16
15
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
17
16
|
var _templateObject;
|
|
@@ -22,44 +21,22 @@ function AppHeader(_ref) {
|
|
|
22
21
|
title,
|
|
23
22
|
subTitle,
|
|
24
23
|
logoUrl,
|
|
25
|
-
did,
|
|
26
24
|
locale,
|
|
27
|
-
navLogo
|
|
25
|
+
navLogo,
|
|
26
|
+
loading
|
|
28
27
|
} = _ref;
|
|
29
28
|
const isMobile = (0, _useMediaQuery.default)(theme => theme.breakpoints.down('md'));
|
|
30
29
|
const blockletSize = isMobile ? 18 : 48;
|
|
31
30
|
const appNameRef = (0, _react.useRef)(null);
|
|
32
31
|
const [appNameSize, setAppNameSize] = (0, _react.useState)('');
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Skeleton.default, {
|
|
42
|
-
variant: "rectangular",
|
|
43
|
-
width: blockletSize,
|
|
44
|
-
height: blockletSize
|
|
32
|
+
const appIcon = loading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(AppIconSkeleton, {
|
|
33
|
+
blockletSize: blockletSize,
|
|
34
|
+
isMobile: isMobile,
|
|
35
|
+
title: title
|
|
36
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(AppIcon, {
|
|
37
|
+
blockletSize: blockletSize,
|
|
38
|
+
logoUrl: logoUrl
|
|
45
39
|
});
|
|
46
|
-
if (logoUrl) {
|
|
47
|
-
blockletIcon = /*#__PURE__*/(0, _jsxRuntime.jsx)(_Img.default, {
|
|
48
|
-
width: blockletSize,
|
|
49
|
-
height: blockletSize,
|
|
50
|
-
src: logoUrl,
|
|
51
|
-
alt: "blocklet icon",
|
|
52
|
-
fallback: _defaultBlockletLogo.default,
|
|
53
|
-
style: {
|
|
54
|
-
verticalAlign: 'text-bottom'
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
} else if (did) {
|
|
58
|
-
blockletIcon = /*#__PURE__*/(0, _jsxRuntime.jsx)(_Avatar.default, {
|
|
59
|
-
did: did,
|
|
60
|
-
size: blockletSize
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
40
|
(0, _react.useEffect)(() => {
|
|
64
41
|
if (appNameRef.current && appNameRef.current.offsetHeight > 34) {
|
|
65
42
|
if (appNameSize === '') {
|
|
@@ -76,21 +53,21 @@ function AppHeader(_ref) {
|
|
|
76
53
|
children: navLogo
|
|
77
54
|
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
78
55
|
className: "app-icon",
|
|
79
|
-
children:
|
|
56
|
+
children: appIcon
|
|
80
57
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
81
58
|
className: "header-title",
|
|
82
|
-
children: [subTitle && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
59
|
+
children: [isMobile && subTitle && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
83
60
|
className: "header-title-sub",
|
|
84
61
|
children: subTitle
|
|
85
62
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
86
63
|
className: "app-name-content",
|
|
87
64
|
children: [!isMobile && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
88
65
|
className: "launching-context",
|
|
89
|
-
children: (0, _locale.getLaunchingText)(locale)
|
|
66
|
+
children: subTitle || (0, _locale.getLaunchingText)(locale)
|
|
90
67
|
}), title && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
91
68
|
className: "header-title-name ".concat(appNameSize === 'middle' || appNameSize === 'small' ? 'middle-size' : ''),
|
|
92
69
|
ref: appNameRef,
|
|
93
|
-
children: [isMobile ?
|
|
70
|
+
children: [isMobile ? appIcon : '', " ", title]
|
|
94
71
|
})]
|
|
95
72
|
})]
|
|
96
73
|
})]
|
|
@@ -100,18 +77,61 @@ AppHeader.propTypes = {
|
|
|
100
77
|
title: _propTypes.default.any,
|
|
101
78
|
subTitle: _propTypes.default.any,
|
|
102
79
|
logoUrl: _propTypes.default.string,
|
|
103
|
-
did: _propTypes.default.string,
|
|
104
80
|
locale: _propTypes.default.string,
|
|
105
|
-
navLogo: _propTypes.default.any
|
|
81
|
+
navLogo: _propTypes.default.any,
|
|
82
|
+
loading: _propTypes.default.bool
|
|
106
83
|
};
|
|
107
84
|
AppHeader.defaultProps = {
|
|
108
85
|
title: '',
|
|
109
86
|
subTitle: '',
|
|
110
87
|
logoUrl: '',
|
|
111
|
-
did: '',
|
|
112
88
|
locale: '',
|
|
113
|
-
navLogo: ''
|
|
89
|
+
navLogo: '',
|
|
90
|
+
loading: false
|
|
114
91
|
};
|
|
92
|
+
|
|
93
|
+
// eslint-disable-next-line react/prop-types
|
|
94
|
+
function AppIconSkeleton(_ref2) {
|
|
95
|
+
let {
|
|
96
|
+
blockletSize,
|
|
97
|
+
isMobile,
|
|
98
|
+
title
|
|
99
|
+
} = _ref2;
|
|
100
|
+
if (isMobile) {
|
|
101
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Skeleton.default, {
|
|
102
|
+
variant: "rectangular",
|
|
103
|
+
width: 100,
|
|
104
|
+
height: 16,
|
|
105
|
+
alt: "".concat(title, " icon"),
|
|
106
|
+
style: {
|
|
107
|
+
marginTop: 4
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Skeleton.default, {
|
|
112
|
+
variant: "rectangular",
|
|
113
|
+
width: blockletSize,
|
|
114
|
+
height: blockletSize
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// eslint-disable-next-line react/prop-types
|
|
119
|
+
function AppIcon(_ref3) {
|
|
120
|
+
let {
|
|
121
|
+
logoUrl,
|
|
122
|
+
blockletSize
|
|
123
|
+
} = _ref3;
|
|
124
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Img.default, {
|
|
125
|
+
width: blockletSize,
|
|
126
|
+
height: blockletSize,
|
|
127
|
+
src: logoUrl,
|
|
128
|
+
alt: "blocklet icon",
|
|
129
|
+
fallback: _blockletDefaultLogo.default,
|
|
130
|
+
style: {
|
|
131
|
+
verticalAlign: 'text-bottom'
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
115
135
|
var _default = AppHeader;
|
|
116
136
|
exports.default = _default;
|
|
117
137
|
const Container = _styled.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: flex;\n justify-content: flex-start;\n align-items: flex-start;\n width: 100%;\n ", " {\n min-height: 70px;\n }\n ", " {\n align-items: center;\n }\n .app-name-content {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n ", " {\n align-items: flex-start;\n flex-direction: column;\n }\n ", " {\n height: 22px;\n }\n }\n .launching-context {\n flex-shrink: 0;\n font-size: 14px;\n font-weight: 600;\n color: ", ";\n ", " {\n margin-bottom: 4px;\n }\n ", " {\n font-size: 14px;\n line-height: 15px;\n &:after {\n display: inline-block;\n margin: 0 4px;\n content: ':';\n }\n }\n }\n\n &.center-mode {\n align-items: flex-start;\n .launching-context {\n ", " {\n margin-bottom: 0;\n }\n }\n }\n\n .app-icon {\n flex-shrink: 0;\n > * {\n display: block;\n vertical-align: middle;\n }\n }\n\n .header-title {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: space-around;\n align-items: flex-start;\n margin-left: 24px;\n ", " {\n margin-left: 16px;\n }\n .header-title-name {\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n flex: 1;\n height: 100%;\n color: ", ";\n font-weight: 700;\n ", " {\n font-size: 18px;\n\n &.middle-size {\n font-size: 16px;\n }\n }\n ", " {\n display: block;\n max-width: calc(100vw - 100px);\n font-size: 16px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n .header-title-sub {\n color: ", ";\n font-size: 12px;\n line-height: 16px;\n\n ", " {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n }\n"])), props => props.theme.breakpoints.up('md'), props => props.theme.breakpoints.down('md'), props => props.theme.breakpoints.up('md'), props => props.theme.breakpoints.down('md'), props => props.theme.palette.grey[500], props => props.theme.breakpoints.up('md'), props => props.theme.breakpoints.down('md'), props => props.theme.breakpoints.up('sm'), props => props.theme.breakpoints.down('md'), props => props.theme.palette.common.black, props => props.theme.breakpoints.up('sm'), props => props.theme.breakpoints.down('md'), props => props.theme.palette.grey[700], props => props.theme.breakpoints.down('md'));
|
package/lib/index.js
CHANGED
|
@@ -19,7 +19,7 @@ var _header = _interopRequireDefault(require("./header"));
|
|
|
19
19
|
var _locale = require("./locale");
|
|
20
20
|
var _nav = _interopRequireDefault(require("./nav"));
|
|
21
21
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
22
|
-
const _excluded = ["blockletMeta", "children", "logoUrl", "locale", "header", "headerEndAddons", "pcWidth", "pcHeight", "navLogo", "useOfSkeleton", "stepTip", "contentMaxWidth"];
|
|
22
|
+
const _excluded = ["blockletMeta", "loading", "children", "logoUrl", "locale", "header", "headerEndAddons", "pcWidth", "pcHeight", "navLogo", "useOfSkeleton", "stepTip", "navSubTitle", "contentMaxWidth"];
|
|
23
23
|
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
|
|
24
24
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
25
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
@@ -36,6 +36,7 @@ const PcContent = _styled.default.div(_templateObject2 || (_templateObject2 = _t
|
|
|
36
36
|
function Layout(_ref) {
|
|
37
37
|
let {
|
|
38
38
|
blockletMeta,
|
|
39
|
+
loading,
|
|
39
40
|
children,
|
|
40
41
|
logoUrl,
|
|
41
42
|
locale,
|
|
@@ -46,6 +47,7 @@ function Layout(_ref) {
|
|
|
46
47
|
navLogo,
|
|
47
48
|
useOfSkeleton,
|
|
48
49
|
stepTip,
|
|
50
|
+
navSubTitle,
|
|
49
51
|
contentMaxWidth
|
|
50
52
|
} = _ref,
|
|
51
53
|
rest = _objectWithoutProperties(_ref, _excluded);
|
|
@@ -81,7 +83,7 @@ function Layout(_ref) {
|
|
|
81
83
|
}),
|
|
82
84
|
navLogo: navLogo,
|
|
83
85
|
subTitle: /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
|
|
84
|
-
children: ["".concat(
|
|
86
|
+
children: ["".concat(navSubTitle || translations.defaultNavSubTitle, " ").concat(activeStep + 1, "/").concat(totalStepsCount), /*#__PURE__*/(0, _jsxRuntime.jsx)(_smallCircleProgress.default, {
|
|
85
87
|
value: (activeStep + 1) / totalStepsCount * 100,
|
|
86
88
|
style: {
|
|
87
89
|
marginLeft: 3
|
|
@@ -89,7 +91,6 @@ function Layout(_ref) {
|
|
|
89
91
|
})]
|
|
90
92
|
}),
|
|
91
93
|
logoUrl: logoUrl,
|
|
92
|
-
did: blockletMeta.did,
|
|
93
94
|
locale: locale
|
|
94
95
|
})
|
|
95
96
|
}), navLogo && !isMobile && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
@@ -110,7 +111,9 @@ function Layout(_ref) {
|
|
|
110
111
|
locale: locale,
|
|
111
112
|
blockletMeta: blockletMeta,
|
|
112
113
|
logoUrl: logoUrl,
|
|
113
|
-
useOfSkeleton: useOfSkeleton
|
|
114
|
+
useOfSkeleton: useOfSkeleton,
|
|
115
|
+
subTitle: navSubTitle,
|
|
116
|
+
loading: loading
|
|
114
117
|
})
|
|
115
118
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_react.Suspense, {
|
|
116
119
|
fallback: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Center.default, {
|
|
@@ -127,7 +130,8 @@ function Layout(_ref) {
|
|
|
127
130
|
}));
|
|
128
131
|
}
|
|
129
132
|
Layout.propTypes = {
|
|
130
|
-
|
|
133
|
+
loading: _propTypes.default.bool,
|
|
134
|
+
blockletMeta: _propTypes.default.object,
|
|
131
135
|
children: _propTypes.default.object.isRequired,
|
|
132
136
|
logoUrl: _propTypes.default.string,
|
|
133
137
|
locale: _propTypes.default.oneOf(['en', 'zh']),
|
|
@@ -138,9 +142,12 @@ Layout.propTypes = {
|
|
|
138
142
|
contentMaxWidth: _propTypes.default.string,
|
|
139
143
|
navLogo: _propTypes.default.oneOfType([_propTypes.default.node, _propTypes.default.object]),
|
|
140
144
|
useOfSkeleton: _propTypes.default.bool,
|
|
141
|
-
stepTip: _propTypes.default.string
|
|
145
|
+
stepTip: _propTypes.default.string,
|
|
146
|
+
navSubTitle: _propTypes.default.string
|
|
142
147
|
};
|
|
143
148
|
Layout.defaultProps = {
|
|
149
|
+
loading: false,
|
|
150
|
+
blockletMeta: {},
|
|
144
151
|
logoUrl: '',
|
|
145
152
|
locale: 'en',
|
|
146
153
|
header: null,
|
|
@@ -150,7 +157,8 @@ Layout.defaultProps = {
|
|
|
150
157
|
contentMaxWidth: '1245px',
|
|
151
158
|
navLogo: '',
|
|
152
159
|
useOfSkeleton: true,
|
|
153
|
-
stepTip: ''
|
|
160
|
+
stepTip: '',
|
|
161
|
+
navSubTitle: ''
|
|
154
162
|
};
|
|
155
163
|
|
|
156
164
|
// 针对 safari 下的 chrome 适配
|
package/lib/locale.js
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
const translations = {
|
|
4
4
|
en: {
|
|
5
5
|
optional: 'Optional',
|
|
6
|
-
|
|
6
|
+
defaultNavSubTitle: 'Launching'
|
|
7
7
|
},
|
|
8
8
|
zh: {
|
|
9
9
|
optional: '可选',
|
|
10
|
-
|
|
10
|
+
defaultNavSubTitle: '启动'
|
|
11
11
|
}
|
|
12
12
|
};
|
|
13
13
|
const getTranslations = locale => translations[locale] ? translations[locale] : translations.en;
|
package/lib/nav.js
CHANGED
|
@@ -21,7 +21,9 @@ function Nav(_ref) {
|
|
|
21
21
|
blockletMeta,
|
|
22
22
|
logoUrl,
|
|
23
23
|
locale,
|
|
24
|
-
useOfSkeleton
|
|
24
|
+
useOfSkeleton,
|
|
25
|
+
subTitle,
|
|
26
|
+
loading
|
|
25
27
|
} = _ref;
|
|
26
28
|
const {
|
|
27
29
|
steps,
|
|
@@ -32,7 +34,7 @@ function Nav(_ref) {
|
|
|
32
34
|
canBackToStep
|
|
33
35
|
} = (0, _step.useStepContext)();
|
|
34
36
|
const name = (0, _util.getBlockletDisplayName)(blockletMeta);
|
|
35
|
-
const showSkeleton = useOfSkeleton ?
|
|
37
|
+
const showSkeleton = useOfSkeleton ? loading : false;
|
|
36
38
|
const getNodeClassName = (step, index) => {
|
|
37
39
|
const classNameList = ['step-block'];
|
|
38
40
|
const status = getStepStatus(step.key);
|
|
@@ -70,18 +72,19 @@ function Nav(_ref) {
|
|
|
70
72
|
};
|
|
71
73
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Div, {
|
|
72
74
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_header.default, {
|
|
73
|
-
|
|
75
|
+
loading: loading,
|
|
76
|
+
title: /*#__PURE__*/(0, _jsxRuntime.jsxs)(AppLink, {
|
|
74
77
|
target: "_blank",
|
|
75
78
|
href: (0, _urlJoin.default)(blockletMeta.registryUrl || '', "/blocklets/".concat(blockletMeta.did)),
|
|
76
79
|
title: name,
|
|
77
|
-
children:
|
|
80
|
+
children: [loading && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Skeleton.default, {
|
|
78
81
|
variant: "text",
|
|
79
82
|
width: 150
|
|
80
|
-
})
|
|
83
|
+
}), !loading && name]
|
|
81
84
|
}),
|
|
82
|
-
did: blockletMeta.did,
|
|
83
85
|
logoUrl: logoUrl,
|
|
84
|
-
locale: locale
|
|
86
|
+
locale: locale,
|
|
87
|
+
subTitle: subTitle
|
|
85
88
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(StepContainer, {
|
|
86
89
|
className: "".concat(showSkeleton ? 'hide-child-step-desc' : ''),
|
|
87
90
|
children: steps.map((step, index) => {
|
|
@@ -152,12 +155,16 @@ Nav.propTypes = {
|
|
|
152
155
|
blockletMeta: _propTypes.default.object.isRequired,
|
|
153
156
|
logoUrl: _propTypes.default.string,
|
|
154
157
|
locale: _propTypes.default.string,
|
|
155
|
-
useOfSkeleton: _propTypes.default.bool
|
|
158
|
+
useOfSkeleton: _propTypes.default.bool,
|
|
159
|
+
subTitle: _propTypes.default.string,
|
|
160
|
+
loading: _propTypes.default.bool
|
|
156
161
|
};
|
|
157
162
|
Nav.defaultProps = {
|
|
158
163
|
logoUrl: '',
|
|
159
164
|
locale: '',
|
|
160
|
-
useOfSkeleton: false
|
|
165
|
+
useOfSkeleton: false,
|
|
166
|
+
subTitle: '',
|
|
167
|
+
loading: false
|
|
161
168
|
};
|
|
162
169
|
var _default = Nav;
|
|
163
170
|
exports.default = _default;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blocklet/launcher-layout",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.86",
|
|
4
4
|
"description": "Common ux components of launcher",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"@arcblock/did-connect": "^2.6.7",
|
|
40
40
|
"@arcblock/icons": "^2.6.7",
|
|
41
41
|
"@arcblock/ux": "^2.6.7",
|
|
42
|
-
"@blocklet/launcher-util": "2.1.
|
|
43
|
-
"@blocklet/launcher-ux": "2.1.
|
|
42
|
+
"@blocklet/launcher-util": "2.1.86",
|
|
43
|
+
"@blocklet/launcher-ux": "2.1.86",
|
|
44
44
|
"@blocklet/meta": "^1.16.13",
|
|
45
45
|
"@emotion/react": "^11.11.1",
|
|
46
46
|
"@emotion/styled": "^11.11.0",
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"@storybook/react": "^6.5.16",
|
|
60
60
|
"babel-plugin-inline-react-svg": "^2.0.2"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "95ee25d34d82744fcd623f3cdf9e98fa14a3022d"
|
|
63
63
|
}
|
|
File without changes
|