@antv/dumi-theme-antv 0.6.4-alpha.3 → 0.6.4-alpha.4
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/dist/common/CommonHelmet.js +62 -45
- package/dist/hooks/useMenu.js +68 -85
- package/dist/layouts/DocLayout.js +24 -19
- package/dist/pages/Example/index.js +1 -1
- package/dist/slots/Header/Navs.js +66 -6
- package/dist/slots/Header/index.js +29 -20
- package/dist/slots/ManualContent/index.js +9 -1
- package/package.json +1 -1
|
@@ -4,64 +4,81 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
|
|
|
4
4
|
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
5
5
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
6
6
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
7
|
-
import { Helmet, useLocale,
|
|
8
|
-
import
|
|
7
|
+
import { Helmet, useLocale, useSiteData } from 'dumi';
|
|
8
|
+
import { isEqual } from 'lodash-es';
|
|
9
|
+
import React, { useEffect } from 'react';
|
|
9
10
|
var CommonHelmet = function CommonHelmet(_ref) {
|
|
10
11
|
var titleSuffix = _ref.titleSuffix,
|
|
11
12
|
propTitle = _ref.title,
|
|
12
13
|
propDescription = _ref.description,
|
|
13
|
-
|
|
14
|
-
propMeta = _ref$meta === void 0 ? [] : _ref$meta;
|
|
15
|
-
var meta = useRouteMeta();
|
|
14
|
+
propMeta = _ref.meta;
|
|
16
15
|
var locale = useLocale();
|
|
17
16
|
var lang = locale.id;
|
|
18
17
|
var _useSiteData = useSiteData(),
|
|
19
18
|
themeConfig = _useSiteData.themeConfig;
|
|
20
19
|
var defaultTitle = themeConfig.title,
|
|
21
20
|
defaultDescription = themeConfig.defaultDescription;
|
|
22
|
-
var
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
21
|
+
var helmetData = React.useMemo(function () {
|
|
22
|
+
var title = propTitle || '';
|
|
23
|
+
var fullTitle = "".concat(title, " | ").concat(titleSuffix || defaultTitle);
|
|
24
|
+
var description = propDescription || defaultDescription;
|
|
25
|
+
var defaultMeta = [{
|
|
26
|
+
name: "description",
|
|
27
|
+
content: description
|
|
28
|
+
},
|
|
29
|
+
// Open Graph 标签,指定页面在社交媒体上的展示效果
|
|
30
|
+
{
|
|
31
|
+
property: "og:title",
|
|
32
|
+
content: title
|
|
33
|
+
}, {
|
|
34
|
+
property: "og:description",
|
|
35
|
+
content: description
|
|
36
|
+
}, {
|
|
37
|
+
property: "og:image",
|
|
38
|
+
content: 'https://gw.alipayobjects.com/zos/antfincdn/FLrTNDvlna/antv.png'
|
|
39
|
+
}, {
|
|
40
|
+
property: "og:type",
|
|
41
|
+
content: "website"
|
|
42
|
+
},
|
|
43
|
+
// Twitter 卡片
|
|
44
|
+
{
|
|
45
|
+
name: "twitter:card",
|
|
46
|
+
content: "summary"
|
|
47
|
+
}, {
|
|
48
|
+
name: "twitter:title",
|
|
49
|
+
content: title
|
|
50
|
+
}, {
|
|
51
|
+
name: "twitter:description",
|
|
52
|
+
content: description
|
|
53
|
+
}, {
|
|
54
|
+
property: "twitter:image",
|
|
55
|
+
content: 'https://gw.alipayobjects.com/zos/antfincdn/FLrTNDvlna/antv.png'
|
|
56
|
+
}];
|
|
57
|
+
return {
|
|
58
|
+
title: title,
|
|
59
|
+
description: description,
|
|
60
|
+
fullTitle: fullTitle,
|
|
61
|
+
defaultMeta: defaultMeta,
|
|
62
|
+
meta: [].concat(defaultMeta, _toConsumableArray(propMeta || []))
|
|
63
|
+
};
|
|
64
|
+
}, [propTitle, propDescription, defaultDescription, titleSuffix, defaultTitle, propMeta]);
|
|
65
|
+
useEffect(function () {
|
|
66
|
+
// 延迟 document.title 设置标题作为备份机制
|
|
67
|
+
var timer = setTimeout(function () {
|
|
68
|
+
document.title = helmetData.fullTitle;
|
|
69
|
+
}, 100);
|
|
70
|
+
return function () {
|
|
71
|
+
return clearTimeout(timer);
|
|
72
|
+
};
|
|
73
|
+
}, [helmetData.fullTitle]);
|
|
59
74
|
return /*#__PURE__*/React.createElement(Helmet, {
|
|
60
75
|
htmlAttributes: {
|
|
61
76
|
lang: lang
|
|
62
77
|
},
|
|
63
|
-
title: fullTitle,
|
|
64
|
-
meta:
|
|
78
|
+
title: helmetData.fullTitle,
|
|
79
|
+
meta: helmetData.meta
|
|
65
80
|
});
|
|
66
81
|
};
|
|
67
|
-
export default CommonHelmet
|
|
82
|
+
export default /*#__PURE__*/React.memo(CommonHelmet, function (prevProps, nextProps) {
|
|
83
|
+
return prevProps.title === nextProps.title && prevProps.description === nextProps.description && prevProps.titleSuffix === nextProps.titleSuffix && isEqual(prevProps.meta, nextProps.meta);
|
|
84
|
+
});
|
package/dist/hooks/useMenu.js
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
3
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
-
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
5
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
6
2
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
7
3
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
8
4
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
@@ -11,26 +7,20 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
11
7
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
12
8
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
13
9
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
14
|
-
import { useFullSidebarData, useLocale, useLocation,
|
|
10
|
+
import { useFullSidebarData, useLocale, useLocation, useSiteData } from 'dumi';
|
|
15
11
|
import { get } from 'lodash-es';
|
|
16
|
-
import React, {
|
|
12
|
+
import React, { useCallback, useMemo } from 'react';
|
|
17
13
|
import Link from "../common/Link";
|
|
14
|
+
import { icWithLocale } from "../slots/hooks";
|
|
18
15
|
import styles from "../slots/ManualContent/index.module.less";
|
|
19
16
|
import { getBaseRoute } from "../slots/ManualContent/utils";
|
|
20
17
|
import { flattenMenu } from "../utils/menu";
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
docs = _useSiteData$themeCon.docs,
|
|
28
|
-
navs = _useSiteData$themeCon.navs;
|
|
29
|
-
var baseRoute = getBaseRoute(pathname);
|
|
30
|
-
var navigate = useNavigate();
|
|
31
|
-
var locale = useLocale();
|
|
32
|
-
var currentLocale = locale.id;
|
|
33
|
-
var getMenuData = function getMenuData(fullData, rootList, hrefId) {
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 根据 baseRoute 获取特定的菜单数据(纯函数)
|
|
21
|
+
*/
|
|
22
|
+
export var getMenuData = function getMenuData(fullData, rootList, baseRoute, locale) {
|
|
23
|
+
var getMenuDataInternal = function getMenuDataInternal(fullData, rootList, hrefId) {
|
|
34
24
|
var fullSidebarDataToMenuData = function fullSidebarDataToMenuData(rootList, hrefId, list) {
|
|
35
25
|
// 递归
|
|
36
26
|
rootList.forEach(function (item) {
|
|
@@ -40,7 +30,7 @@ export var useMenu = function useMenu() {
|
|
|
40
30
|
if (id === hrefId) {
|
|
41
31
|
list.push(_objectSpread(_objectSpread({}, item), {}, {
|
|
42
32
|
key: href,
|
|
43
|
-
label: item.title
|
|
33
|
+
label: icWithLocale(item.title, locale)
|
|
44
34
|
}));
|
|
45
35
|
}
|
|
46
36
|
}
|
|
@@ -49,32 +39,34 @@ export var useMenu = function useMenu() {
|
|
|
49
39
|
_step;
|
|
50
40
|
try {
|
|
51
41
|
var _loop = function _loop() {
|
|
52
|
-
var _fullData$item$key$0$;
|
|
53
42
|
var item = _step.value;
|
|
54
43
|
item.children = [];
|
|
55
44
|
fullSidebarDataToMenuData(rootList, item.key, item.children);
|
|
56
|
-
|
|
57
|
-
var
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
45
|
+
if (fullData[item.key]) {
|
|
46
|
+
var _fullData$item$key$0$;
|
|
47
|
+
(_fullData$item$key$0$ = fullData[item.key][0].children) === null || _fullData$item$key$0$ === void 0 || _fullData$item$key$0$.forEach(function (itemChild) {
|
|
48
|
+
var label = itemChild.title;
|
|
49
|
+
var key = itemChild.link;
|
|
50
|
+
var tag = get(itemChild, ['frontmatter', 'tag']);
|
|
51
|
+
item.children.push(_objectSpread(_objectSpread({}, itemChild), {}, {
|
|
52
|
+
label: tag ? /*#__PURE__*/React.createElement(Link, {
|
|
53
|
+
to: key
|
|
54
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
55
|
+
className: styles.memuLabel
|
|
56
|
+
}, label, /*#__PURE__*/React.createElement("div", {
|
|
57
|
+
className: styles.tag
|
|
58
|
+
}, tag))) : /*#__PURE__*/React.createElement(Link, {
|
|
59
|
+
to: key
|
|
60
|
+
}, label),
|
|
61
|
+
key: key
|
|
62
|
+
}));
|
|
63
|
+
});
|
|
64
|
+
}
|
|
73
65
|
// children 的 order 排序
|
|
74
66
|
item.children.sort(function (a, b) {
|
|
75
67
|
return a.order - b.order;
|
|
76
68
|
});
|
|
77
|
-
if (item.children.length
|
|
69
|
+
if (item.children.length === 0) delete item.children;
|
|
78
70
|
};
|
|
79
71
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
80
72
|
_loop();
|
|
@@ -85,17 +77,19 @@ export var useMenu = function useMenu() {
|
|
|
85
77
|
_iterator.f();
|
|
86
78
|
}
|
|
87
79
|
if (hrefId === baseRoute) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
80
|
+
if (fullData[baseRoute]) {
|
|
81
|
+
var _fullData$baseRoute$;
|
|
82
|
+
(_fullData$baseRoute$ = fullData[baseRoute][0].children) === null || _fullData$baseRoute$ === void 0 || _fullData$baseRoute$.forEach(function (itemChild) {
|
|
83
|
+
var key = itemChild.link;
|
|
84
|
+
var label = itemChild.title;
|
|
85
|
+
list.push(_objectSpread(_objectSpread({}, itemChild), {}, {
|
|
86
|
+
label: /*#__PURE__*/React.createElement(Link, {
|
|
87
|
+
to: key
|
|
88
|
+
}, label),
|
|
89
|
+
key: key
|
|
90
|
+
}));
|
|
91
|
+
});
|
|
92
|
+
}
|
|
99
93
|
list.sort(function (a, b) {
|
|
100
94
|
return a.order - b.order;
|
|
101
95
|
});
|
|
@@ -104,45 +98,34 @@ export var useMenu = function useMenu() {
|
|
|
104
98
|
};
|
|
105
99
|
return fullSidebarDataToMenuData(rootList, hrefId, []);
|
|
106
100
|
};
|
|
101
|
+
return getMenuDataInternal(fullData, rootList, baseRoute);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* 通过 hooks 包装的 getMenuData
|
|
106
|
+
*/
|
|
107
|
+
export var useMenuData = function useMenuData() {
|
|
108
|
+
var fullData = useFullSidebarData();
|
|
109
|
+
var _useSiteData = useSiteData(),
|
|
110
|
+
docs = _useSiteData.themeConfig.docs;
|
|
111
|
+
var locale = useLocale();
|
|
112
|
+
var getter = useCallback(function (baseRoute) {
|
|
113
|
+
return getMenuData(fullData, docs, baseRoute, locale.id);
|
|
114
|
+
}, [fullData, docs, locale.id]);
|
|
115
|
+
return getter;
|
|
116
|
+
};
|
|
117
|
+
export var useMenu = function useMenu() {
|
|
118
|
+
var _useLocation = useLocation(),
|
|
119
|
+
pathname = _useLocation.pathname;
|
|
120
|
+
var baseRoute = getBaseRoute(pathname);
|
|
121
|
+
var getMenuDataFn = useMenuData();
|
|
107
122
|
var menuData = useMemo(function () {
|
|
108
|
-
return
|
|
109
|
-
}, [
|
|
123
|
+
return getMenuDataFn(baseRoute);
|
|
124
|
+
}, [getMenuDataFn, baseRoute]);
|
|
110
125
|
|
|
111
126
|
// 将菜单数据扁平化
|
|
112
127
|
var flattedMenuData = useMemo(function () {
|
|
113
128
|
return flattenMenu(menuData);
|
|
114
129
|
}, [menuData]);
|
|
115
|
-
|
|
116
|
-
// 添加本地状态来存储选中的key
|
|
117
|
-
var _useState = useState(pathname),
|
|
118
|
-
_useState2 = _slicedToArray(_useState, 2),
|
|
119
|
-
selectedKey = _useState2[0],
|
|
120
|
-
setSelectedKey = _useState2[1];
|
|
121
|
-
useEffect(function () {
|
|
122
|
-
var _navOf;
|
|
123
|
-
// Nav 跳转但不在菜单中,则选中第一个菜单项
|
|
124
|
-
var navOf = function navOf(navs) {
|
|
125
|
-
return navs.some(function (nav) {
|
|
126
|
-
var _nav$slug;
|
|
127
|
-
return (nav === null || nav === void 0 || (_nav$slug = nav.slug) === null || _nav$slug === void 0 ? void 0 : _nav$slug.replace('docs/', '/')) === pathname;
|
|
128
|
-
});
|
|
129
|
-
};
|
|
130
|
-
var isNavLink = !!navOf(navs);
|
|
131
|
-
var isExactLink = (_navOf = navOf(navs)) === null || _navOf === void 0 ? void 0 : _navOf.exact;
|
|
132
|
-
var isLinkInMenu = flattedMenuData === null || flattedMenuData === void 0 ? void 0 : flattedMenuData.some(function (item) {
|
|
133
|
-
return item.link === pathname;
|
|
134
|
-
});
|
|
135
|
-
if (isNavLink && !isExactLink && !isLinkInMenu) {
|
|
136
|
-
var firstValidMenuItem = flattedMenuData === null || flattedMenuData === void 0 ? void 0 : flattedMenuData.find(function (item) {
|
|
137
|
-
return item.link;
|
|
138
|
-
});
|
|
139
|
-
if (firstValidMenuItem) {
|
|
140
|
-
navigate(firstValidMenuItem.link);
|
|
141
|
-
setSelectedKey(firstValidMenuItem.link);
|
|
142
|
-
}
|
|
143
|
-
} else {
|
|
144
|
-
setSelectedKey(pathname);
|
|
145
|
-
}
|
|
146
|
-
}, [pathname, flattedMenuData, navs, navigate]);
|
|
147
|
-
return [menuData, selectedKey, flattedMenuData];
|
|
130
|
+
return [menuData, pathname, flattedMenuData];
|
|
148
131
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useLocation, useOutlet, useSiteData } from 'dumi';
|
|
1
|
+
import { Helmet, useLocation, useOutlet, useSiteData } from 'dumi';
|
|
2
2
|
import React, { useEffect } from 'react';
|
|
3
3
|
import { getPurePathname } from "../utils/location";
|
|
4
4
|
import IndexLayout from "./IndexLayout";
|
|
@@ -36,24 +36,29 @@ export default (function () {
|
|
|
36
36
|
if (elm) document.documentElement.scrollTo(0, elm.offsetTop - 80);
|
|
37
37
|
}
|
|
38
38
|
}, [loading, hash]);
|
|
39
|
+
var content = React.useMemo(function () {
|
|
40
|
+
// 首页
|
|
41
|
+
if (['/', ''].includes(purePathname)) {
|
|
42
|
+
return /*#__PURE__*/React.createElement(IndexLayout, null, outlet);
|
|
43
|
+
}
|
|
39
44
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return nav.slug && nav.slug.startsWith('docs/');
|
|
48
|
-
}).map(function (nav) {
|
|
49
|
-
return nav.slug && nav.slug.split('/').find(function (item) {
|
|
50
|
-
return item !== 'docs';
|
|
45
|
+
// 匹配 navs 中的 docs 路由
|
|
46
|
+
var docsRoutes = navs.filter(function (nav) {
|
|
47
|
+
return nav.slug && nav.slug.startsWith('docs/');
|
|
48
|
+
}).map(function (nav) {
|
|
49
|
+
return nav.slug && nav.slug.split('/').find(function (item) {
|
|
50
|
+
return item !== 'docs';
|
|
51
|
+
});
|
|
51
52
|
});
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
53
|
+
if (docsRoutes.some(function (slug) {
|
|
54
|
+
return purePathname.startsWith("/".concat(slug)) || purePathname.startsWith("/docs/".concat(slug));
|
|
55
|
+
})) {
|
|
56
|
+
return /*#__PURE__*/React.createElement(ManualLayout, null, outlet);
|
|
57
|
+
}
|
|
58
|
+
return outlet;
|
|
59
|
+
}, [purePathname]);
|
|
60
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Helmet, null, /*#__PURE__*/React.createElement("link", {
|
|
61
|
+
rel: "shortcut icon",
|
|
62
|
+
href: "https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*7svFR6wkPMoAAAAAAAAAAAAADmJ7AQ/original"
|
|
63
|
+
})), content);
|
|
59
64
|
});
|
|
@@ -90,7 +90,7 @@ var Example = function Example() {
|
|
|
90
90
|
return /*#__PURE__*/React.createElement("div", {
|
|
91
91
|
className: styles.example
|
|
92
92
|
}, /*#__PURE__*/React.createElement(CommonHelmet, {
|
|
93
|
-
title:
|
|
93
|
+
title: exampleTitle,
|
|
94
94
|
description: demoTitle
|
|
95
95
|
}), /*#__PURE__*/React.createElement(InViewSuspense, null, /*#__PURE__*/React.createElement(Header, {
|
|
96
96
|
isHomePage: false
|
|
@@ -2,14 +2,70 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
|
|
|
2
2
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
3
3
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
4
4
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
5
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
6
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
7
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
5
8
|
import { DownOutlined, LinkOutlined } from '@ant-design/icons';
|
|
6
9
|
import { Dropdown, Menu } from 'antd';
|
|
7
10
|
import cx from 'classnames';
|
|
8
11
|
import { Link, useLocale } from 'dumi';
|
|
9
12
|
import { size } from 'lodash-es';
|
|
10
13
|
import React from 'react';
|
|
14
|
+
import { useMenuData } from "../../hooks/useMenu";
|
|
11
15
|
import styles from "./index.module.less";
|
|
12
16
|
import { getNavCategory } from "./utils";
|
|
17
|
+
function getNavMeta(pathname, navs) {
|
|
18
|
+
return navs.find(function (nav) {
|
|
19
|
+
var _nav$slug;
|
|
20
|
+
return (nav === null || nav === void 0 || (_nav$slug = nav.slug) === null || _nav$slug === void 0 ? void 0 : _nav$slug.replace('docs/', '/')) === pathname;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function isExactNavLink(pathname, navs) {
|
|
24
|
+
var meta = getNavMeta(pathname, navs);
|
|
25
|
+
return !!meta && meta.exact;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 查找与路径匹配的第一个菜单项
|
|
30
|
+
*/
|
|
31
|
+
function findMatchingMenuItem(pathname, menuData) {
|
|
32
|
+
if (!menuData || !Array.isArray(menuData) || menuData.length === 0) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
var _iterator = _createForOfIteratorHelper(menuData),
|
|
36
|
+
_step;
|
|
37
|
+
try {
|
|
38
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
39
|
+
var menuItem = _step.value;
|
|
40
|
+
if (menuItem.link) {
|
|
41
|
+
var normalizedLink = menuItem.link.startsWith('/') ? menuItem.link : "/".concat(menuItem.link);
|
|
42
|
+
if (normalizedLink === pathname || normalizedLink.startsWith(pathname)) {
|
|
43
|
+
return menuItem;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (menuItem.children && menuItem.children.length > 0) {
|
|
47
|
+
var matchedChild = findMatchingMenuItem(pathname, menuItem.children);
|
|
48
|
+
if (matchedChild) return matchedChild;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
} catch (err) {
|
|
52
|
+
_iterator.e(err);
|
|
53
|
+
} finally {
|
|
54
|
+
_iterator.f();
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
function getNavLink(pathname, navs, menuData) {
|
|
59
|
+
if (isExactNavLink(pathname, navs)) {
|
|
60
|
+
return pathname;
|
|
61
|
+
}
|
|
62
|
+
var matchingMenuItem = findMatchingMenuItem(pathname, menuData);
|
|
63
|
+
if (matchingMenuItem) {
|
|
64
|
+
return matchingMenuItem.link;
|
|
65
|
+
}
|
|
66
|
+
return pathname;
|
|
67
|
+
}
|
|
68
|
+
|
|
13
69
|
/**
|
|
14
70
|
* Header 中的导航菜单
|
|
15
71
|
*/
|
|
@@ -17,17 +73,21 @@ export var Navs = function Navs(_ref) {
|
|
|
17
73
|
var navs = _ref.navs,
|
|
18
74
|
path = _ref.path;
|
|
19
75
|
var locale = useLocale();
|
|
76
|
+
var getMenuData = useMenuData();
|
|
20
77
|
return /*#__PURE__*/React.createElement(React.Fragment, null, navs.map(function (nav) {
|
|
21
78
|
var title = nav.title[locale.id];
|
|
22
79
|
var href = '';
|
|
23
80
|
var className = '';
|
|
24
81
|
if (nav.slug) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
82
|
+
if (nav.slug.startsWith('http')) {
|
|
83
|
+
href = nav.slug;
|
|
84
|
+
} else {
|
|
85
|
+
// 去除 docs 防止新页面 404 和 本页重新刷新。
|
|
86
|
+
href = "/".concat(nav.slug).replace(/^\/docs(?=\/)/, '');
|
|
87
|
+
if (locale.id === 'en') {
|
|
88
|
+
href = "/en".concat(href);
|
|
89
|
+
}
|
|
90
|
+
href = getNavLink(href, navs, getMenuData(href));
|
|
31
91
|
}
|
|
32
92
|
className = cx('header-menu-item-active', _defineProperty({}, styles.activeItem, getNavCategory(path) === getNavCategory(href)));
|
|
33
93
|
}
|
|
@@ -16,7 +16,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
16
16
|
import { CaretDownFilled, CheckOutlined, DownOutlined, GithubOutlined, LinkOutlined, MenuOutlined, WechatOutlined } from '@ant-design/icons';
|
|
17
17
|
import { Alert, Button, Dropdown, Menu, Modal, Popover, Select } from 'antd';
|
|
18
18
|
import cx from 'classnames';
|
|
19
|
-
import { FormattedMessage, useLocale, useSiteData } from 'dumi';
|
|
19
|
+
import { FormattedMessage, Link, useLocale, useSiteData } from 'dumi';
|
|
20
20
|
import { get, map, size } from 'lodash-es';
|
|
21
21
|
import React, { useEffect, useMemo, useState } from 'react';
|
|
22
22
|
import { useNavigate } from 'react-router-dom';
|
|
@@ -26,7 +26,7 @@ import { ic } from "../hooks";
|
|
|
26
26
|
import { Navs } from "./Navs";
|
|
27
27
|
import { Products } from "./Products";
|
|
28
28
|
import { Search } from "./Search";
|
|
29
|
-
import { findVersion
|
|
29
|
+
import { findVersion } from "./utils";
|
|
30
30
|
import { Assistant } from '@petercatai/assistant';
|
|
31
31
|
import '@petercatai/assistant/style';
|
|
32
32
|
import { useLocation } from 'react-router-dom';
|
|
@@ -187,6 +187,29 @@ var HeaderComponent = function HeaderComponent(_ref) {
|
|
|
187
187
|
} : {
|
|
188
188
|
onClick: onToggleProductMenuVisible
|
|
189
189
|
};
|
|
190
|
+
var langItems = [{
|
|
191
|
+
label: /*#__PURE__*/React.createElement(Link, {
|
|
192
|
+
to: "/en"
|
|
193
|
+
}, /*#__PURE__*/React.createElement(CheckOutlined, {
|
|
194
|
+
style: {
|
|
195
|
+
visibility: lang === 'en' ? 'visible' : 'hidden',
|
|
196
|
+
color: '#52c41a'
|
|
197
|
+
}
|
|
198
|
+
}), "English"),
|
|
199
|
+
key: 'en'
|
|
200
|
+
},
|
|
201
|
+
// 菜单项务必填写 key
|
|
202
|
+
{
|
|
203
|
+
label: /*#__PURE__*/React.createElement(Link, {
|
|
204
|
+
to: "/"
|
|
205
|
+
}, /*#__PURE__*/React.createElement(CheckOutlined, {
|
|
206
|
+
style: {
|
|
207
|
+
visibility: lang === 'zh' ? 'visible' : 'hidden',
|
|
208
|
+
color: '#52c41a'
|
|
209
|
+
}
|
|
210
|
+
}), "\u7B80\u4F53\u4E2D\u6587"),
|
|
211
|
+
key: 'zh'
|
|
212
|
+
}];
|
|
190
213
|
var menu = /*#__PURE__*/React.createElement("ul", {
|
|
191
214
|
className: cx(styles.menu, _defineProperty(_defineProperty({}, styles.popup, !isWide), styles.popupHidden, !popupMenuVisible))
|
|
192
215
|
}, /** 最左侧的菜单,一般是 教程、API、示例,或者其他自定义,有配置文件中的 `navs` 决定 */
|
|
@@ -351,24 +374,10 @@ var HeaderComponent = function HeaderComponent(_ref) {
|
|
|
351
374
|
onLanguageChange(key.toString());
|
|
352
375
|
return;
|
|
353
376
|
}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
},
|
|
358
|
-
key: "en"
|
|
359
|
-
}, /*#__PURE__*/React.createElement(CheckOutlined, {
|
|
360
|
-
style: {
|
|
361
|
-
visibility: lang === 'en' ? 'visible' : 'hidden',
|
|
362
|
-
color: '#52c41a'
|
|
363
|
-
}
|
|
364
|
-
}), "English"), /*#__PURE__*/React.createElement(Menu.Item, {
|
|
365
|
-
key: "zh"
|
|
366
|
-
}, /*#__PURE__*/React.createElement(CheckOutlined, {
|
|
367
|
-
style: {
|
|
368
|
-
visibility: lang === 'zh' ? 'visible' : 'hidden',
|
|
369
|
-
color: '#52c41a'
|
|
370
|
-
}
|
|
371
|
-
}), "\u7B80\u4F53\u4E2D\u6587")),
|
|
377
|
+
},
|
|
378
|
+
items: langItems,
|
|
379
|
+
forceSubMenuRender: true
|
|
380
|
+
}),
|
|
372
381
|
className: styles.translation
|
|
373
382
|
}, /*#__PURE__*/React.createElement("a", {
|
|
374
383
|
className: "ant-dropdown-link",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Layout } from 'antd';
|
|
2
|
+
import { useRouteMeta } from 'dumi';
|
|
2
3
|
import React from 'react';
|
|
3
4
|
import CommonHelmet from "../../common/CommonHelmet";
|
|
4
5
|
import styles from "./index.module.less";
|
|
@@ -6,8 +7,15 @@ import { Main } from "./Main";
|
|
|
6
7
|
import { Sidebar } from "./Sidebar";
|
|
7
8
|
export var ManualContent = function ManualContent(_ref) {
|
|
8
9
|
var children = _ref.children;
|
|
10
|
+
var meta = useRouteMeta();
|
|
11
|
+
var _meta$frontmatter = meta.frontmatter,
|
|
12
|
+
title = _meta$frontmatter.title,
|
|
13
|
+
description = _meta$frontmatter.description;
|
|
9
14
|
return /*#__PURE__*/React.createElement(Layout, {
|
|
10
15
|
hasSider: true,
|
|
11
16
|
className: styles.layout
|
|
12
|
-
}, /*#__PURE__*/React.createElement(CommonHelmet,
|
|
17
|
+
}, /*#__PURE__*/React.createElement(CommonHelmet, {
|
|
18
|
+
title: title,
|
|
19
|
+
description: description
|
|
20
|
+
}), /*#__PURE__*/React.createElement(Sidebar, null), /*#__PURE__*/React.createElement(Main, null, children));
|
|
13
21
|
};
|