@antv/dumi-theme-antv 0.6.4-beta.2 → 0.6.4-beta.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/builtins/Playground/index.js +1 -1
- package/dist/common/ClientOnly.js +21 -0
- package/dist/common/CommonHelmet.js +85 -0
- package/dist/common/InViewSuspense.js +29 -0
- package/dist/hooks/useLocale.js +11 -0
- package/dist/hooks/useMenu.js +68 -73
- package/dist/layouts/DocLayout.js +32 -23
- package/dist/layouts/IndexLayout/index.js +16 -0
- package/dist/layouts/{entry/Manual.js → ManualLayout/index.js} +6 -6
- package/dist/pages/404.js +5 -4
- package/dist/pages/Example/index.js +76 -53
- package/dist/pages/Examples/components/ExampleTopicMenu/index.js +3 -2
- package/dist/pages/Examples/index.js +28 -32
- package/dist/{slots → pages/Index/components}/Cases/index.js +1 -1
- package/dist/{slots → pages/Index/components}/Detail/News.js +1 -1
- package/dist/{slots → pages/Index/components}/Detail/index.js +1 -1
- package/dist/{slots → pages/Index/components}/Features/FeatureCard.js +1 -1
- package/dist/{slots → pages/Index/components}/Features/index.js +1 -1
- package/dist/pages/Index/components/_.less +119 -0
- package/dist/{layouts/entry/Index.js → pages/Index/index.js} +18 -22
- package/dist/plugin/index.js +52 -43
- package/dist/slots/CodeEditor/index.js +4 -3
- package/dist/slots/CodePreview/CodeHeader.js +3 -2
- package/dist/slots/CodePreview/index.js +3 -2
- package/dist/slots/CodeRunner/index.js +34 -29
- package/dist/slots/ExampleSider/index.js +3 -2
- package/dist/slots/Feedback/Contributors.js +3 -2
- package/dist/slots/Feedback/EditButton.js +3 -2
- package/dist/slots/Feedback/PageFeedback.js +4 -3
- package/dist/slots/Feedback/SectionFeedback.js +3 -2
- package/dist/slots/Feedback/index.js +12 -10
- package/dist/slots/Footer/index.js +3 -2
- package/dist/slots/Header/Navs.js +66 -6
- package/dist/slots/Header/Search/index.js +1 -1
- package/dist/slots/Header/index.js +64 -106
- package/dist/slots/ManualContent/Main.js +16 -17
- package/dist/slots/ManualContent/NavigatorBanner.js +4 -2
- package/dist/slots/ManualContent/ObPreview.js +17 -0
- package/dist/slots/ManualContent/index.js +11 -4
- package/dist/slots/ManualContent/usePreview.js +6 -1
- package/dist/slots/ManualContent/utils.js +3 -13
- package/dist/slots/global.js +4 -4
- package/dist/slots/hooks.js +0 -25
- package/dist/slots/utils.js +0 -7
- package/dist/utils/env.js +10 -0
- package/dist/utils/location.js +6 -0
- package/dist/utils/user.js +12 -24
- package/package.json +3 -3
- package/dist/common/SEO.js +0 -61
- package/dist/layouts/entry/API.js +0 -12
- package/dist/pages/Example/utils.js +0 -9
- package/dist/slots/Article/index.js +0 -9
- package/dist/slots/Article/index.module.less +0 -8
- package/dist/slots/CodePreview/CodeHeader.module.less +0 -0
- package/dist/slots/Header/Products/NavigatorBanner.js +0 -29
- package/dist/slots/Header/Products/NavigatorBanner.module.less +0 -39
- /package/dist/{slots → pages/Index/components}/Cases/index.module.less +0 -0
- /package/dist/{slots → pages/Index/components}/Companies/index.js +0 -0
- /package/dist/{slots → pages/Index/components}/Companies/index.module.less +0 -0
- /package/dist/{slots → pages/Index/components}/Detail/News.module.less +0 -0
- /package/dist/{slots → pages/Index/components}/Detail/index.module.less +0 -0
- /package/dist/{slots → pages/Index/components}/Features/FeatureCard.module.less +0 -0
- /package/dist/{slots → pages/Index/components}/Features/index.module.less +0 -0
|
@@ -9,7 +9,7 @@ import { get } from 'lodash-es';
|
|
|
9
9
|
import React, { useContext } from 'react';
|
|
10
10
|
import { ErrorBoundary } from 'react-error-boundary';
|
|
11
11
|
import { ThemeAntVContext } from "../../context";
|
|
12
|
-
import
|
|
12
|
+
import CodeRunner from "dumi/theme/slots/CodeRunner";
|
|
13
13
|
import styles from "./index.module.less";
|
|
14
14
|
/**
|
|
15
15
|
* Markdown 标签插件 Playground
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
2
|
+
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."); }
|
|
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); }
|
|
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; }
|
|
5
|
+
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; } }
|
|
6
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
7
|
+
import { useLayoutEffect, useState } from 'react';
|
|
8
|
+
var ClientOnly = function ClientOnly(_ref) {
|
|
9
|
+
var children = _ref.children,
|
|
10
|
+
_ref$fallback = _ref.fallback,
|
|
11
|
+
fallback = _ref$fallback === void 0 ? null : _ref$fallback;
|
|
12
|
+
var _useState = useState(false),
|
|
13
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
14
|
+
clientReady = _useState2[0],
|
|
15
|
+
setClientReady = _useState2[1];
|
|
16
|
+
useLayoutEffect(function () {
|
|
17
|
+
setClientReady(true);
|
|
18
|
+
}, []);
|
|
19
|
+
return clientReady ? children : fallback;
|
|
20
|
+
};
|
|
21
|
+
export default ClientOnly;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
2
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
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); }
|
|
4
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
5
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
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, useSiteData } from 'dumi';
|
|
8
|
+
import { isEqual } from 'lodash-es';
|
|
9
|
+
import React, { useEffect } from 'react';
|
|
10
|
+
import { icWithLocale } from "../slots/hooks";
|
|
11
|
+
var CommonHelmet = function CommonHelmet(_ref) {
|
|
12
|
+
var titleSuffix = _ref.titleSuffix,
|
|
13
|
+
propTitle = _ref.title,
|
|
14
|
+
propDescription = _ref.description,
|
|
15
|
+
propMeta = _ref.meta;
|
|
16
|
+
var locale = useLocale();
|
|
17
|
+
var lang = locale.id;
|
|
18
|
+
var _useSiteData = useSiteData(),
|
|
19
|
+
metas = _useSiteData.themeConfig.metas;
|
|
20
|
+
var defaultTitle = icWithLocale(metas.title, lang);
|
|
21
|
+
var defaultDescription = icWithLocale(metas.description, lang);
|
|
22
|
+
var helmetData = React.useMemo(function () {
|
|
23
|
+
var title = propTitle || '';
|
|
24
|
+
var fullTitle = "".concat(title, " | ").concat(titleSuffix || defaultTitle);
|
|
25
|
+
var description = propDescription || defaultDescription;
|
|
26
|
+
var defaultMeta = [{
|
|
27
|
+
name: "description",
|
|
28
|
+
content: description
|
|
29
|
+
},
|
|
30
|
+
// Open Graph 标签,指定页面在社交媒体上的展示效果
|
|
31
|
+
{
|
|
32
|
+
property: "og:title",
|
|
33
|
+
content: title
|
|
34
|
+
}, {
|
|
35
|
+
property: "og:description",
|
|
36
|
+
content: description
|
|
37
|
+
}, {
|
|
38
|
+
property: "og:image",
|
|
39
|
+
content: 'https://gw.alipayobjects.com/zos/antfincdn/FLrTNDvlna/antv.png'
|
|
40
|
+
}, {
|
|
41
|
+
property: "og:type",
|
|
42
|
+
content: "website"
|
|
43
|
+
},
|
|
44
|
+
// Twitter 卡片
|
|
45
|
+
{
|
|
46
|
+
name: "twitter:card",
|
|
47
|
+
content: "summary"
|
|
48
|
+
}, {
|
|
49
|
+
name: "twitter:title",
|
|
50
|
+
content: title
|
|
51
|
+
}, {
|
|
52
|
+
name: "twitter:description",
|
|
53
|
+
content: description
|
|
54
|
+
}, {
|
|
55
|
+
property: "twitter:image",
|
|
56
|
+
content: 'https://gw.alipayobjects.com/zos/antfincdn/FLrTNDvlna/antv.png'
|
|
57
|
+
}];
|
|
58
|
+
return {
|
|
59
|
+
title: title,
|
|
60
|
+
description: description,
|
|
61
|
+
fullTitle: fullTitle,
|
|
62
|
+
defaultMeta: defaultMeta,
|
|
63
|
+
meta: [].concat(defaultMeta, _toConsumableArray(propMeta || []))
|
|
64
|
+
};
|
|
65
|
+
}, [propTitle, propDescription, titleSuffix, propMeta]);
|
|
66
|
+
useEffect(function () {
|
|
67
|
+
// 延迟 document.title 设置标题作为备份机制
|
|
68
|
+
var timer = setTimeout(function () {
|
|
69
|
+
document.title = helmetData.fullTitle;
|
|
70
|
+
}, 100);
|
|
71
|
+
return function () {
|
|
72
|
+
return clearTimeout(timer);
|
|
73
|
+
};
|
|
74
|
+
}, [helmetData.fullTitle]);
|
|
75
|
+
return /*#__PURE__*/React.createElement(Helmet, {
|
|
76
|
+
htmlAttributes: {
|
|
77
|
+
lang: lang
|
|
78
|
+
},
|
|
79
|
+
title: helmetData.fullTitle,
|
|
80
|
+
meta: helmetData.meta
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
export default /*#__PURE__*/React.memo(CommonHelmet, function (prevProps, nextProps) {
|
|
84
|
+
return prevProps.title === nextProps.title && prevProps.description === nextProps.description && prevProps.titleSuffix === nextProps.titleSuffix && isEqual(prevProps.meta, nextProps.meta);
|
|
85
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 只在组件进入视口(可见区域)时才会加载和渲染被包裹的懒加载组件
|
|
3
|
+
*/
|
|
4
|
+
import { Skeleton } from 'antd';
|
|
5
|
+
import React, { Suspense } from 'react';
|
|
6
|
+
import { InView } from 'react-intersection-observer';
|
|
7
|
+
var InViewSuspense = function InViewSuspense(_ref) {
|
|
8
|
+
var children = _ref.children,
|
|
9
|
+
_ref$fallback = _ref.fallback,
|
|
10
|
+
fallback = _ref$fallback === void 0 ? /*#__PURE__*/React.createElement(Skeleton.Input, {
|
|
11
|
+
active: true,
|
|
12
|
+
size: "small"
|
|
13
|
+
}) : _ref$fallback,
|
|
14
|
+
_ref$delay = _ref.delay,
|
|
15
|
+
delay = _ref$delay === void 0 ? 200 : _ref$delay;
|
|
16
|
+
return /*#__PURE__*/React.createElement(InView, {
|
|
17
|
+
triggerOnce: true,
|
|
18
|
+
delay: delay
|
|
19
|
+
}, function (_ref2) {
|
|
20
|
+
var inView = _ref2.inView,
|
|
21
|
+
ref = _ref2.ref;
|
|
22
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
23
|
+
ref: ref
|
|
24
|
+
}, /*#__PURE__*/React.createElement(Suspense, {
|
|
25
|
+
fallback: fallback
|
|
26
|
+
}, inView ? children : /*#__PURE__*/React.createElement("span", null)));
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
export default InViewSuspense;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useLocale as useDumiLocale } from 'dumi';
|
|
2
|
+
/**
|
|
3
|
+
* 获取国际化
|
|
4
|
+
*/
|
|
5
|
+
var useLocale = function useLocale(localeMap) {
|
|
6
|
+
var _useDumiLocale = useDumiLocale(),
|
|
7
|
+
id = _useDumiLocale.id;
|
|
8
|
+
var localeType = id === 'zh' ? 'zh' : 'en';
|
|
9
|
+
return [localeMap === null || localeMap === void 0 ? void 0 : localeMap[localeType], localeType];
|
|
10
|
+
};
|
|
11
|
+
export default useLocale;
|
package/dist/hooks/useMenu.js
CHANGED
|
@@ -7,27 +7,20 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
7
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; }
|
|
8
8
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
9
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); }
|
|
10
|
-
import { useFullSidebarData, useLocale, useLocation,
|
|
10
|
+
import { useFullSidebarData, useLocale, useLocation, useSiteData } from 'dumi';
|
|
11
11
|
import { get } from 'lodash-es';
|
|
12
|
-
import React, { useMemo } from 'react';
|
|
12
|
+
import React, { useCallback, useMemo } from 'react';
|
|
13
13
|
import Link from "../common/Link";
|
|
14
|
+
import { icWithLocale } from "../slots/hooks";
|
|
14
15
|
import styles from "../slots/ManualContent/index.module.less";
|
|
15
16
|
import { getBaseRoute } from "../slots/ManualContent/utils";
|
|
16
17
|
import { flattenMenu } from "../utils/menu";
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
var
|
|
23
|
-
_useSiteData$themeCon = _useSiteData.themeConfig,
|
|
24
|
-
docs = _useSiteData$themeCon.docs,
|
|
25
|
-
navs = _useSiteData$themeCon.navs;
|
|
26
|
-
var baseRoute = getBaseRoute();
|
|
27
|
-
var navigate = useNavigate();
|
|
28
|
-
var locale = useLocale();
|
|
29
|
-
var currentLocale = locale.id;
|
|
30
|
-
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) {
|
|
31
24
|
var fullSidebarDataToMenuData = function fullSidebarDataToMenuData(rootList, hrefId, list) {
|
|
32
25
|
// 递归
|
|
33
26
|
rootList.forEach(function (item) {
|
|
@@ -37,7 +30,7 @@ export var useMenu = function useMenu() {
|
|
|
37
30
|
if (id === hrefId) {
|
|
38
31
|
list.push(_objectSpread(_objectSpread({}, item), {}, {
|
|
39
32
|
key: href,
|
|
40
|
-
label: item.title
|
|
33
|
+
label: icWithLocale(item.title, locale)
|
|
41
34
|
}));
|
|
42
35
|
}
|
|
43
36
|
}
|
|
@@ -46,32 +39,34 @@ export var useMenu = function useMenu() {
|
|
|
46
39
|
_step;
|
|
47
40
|
try {
|
|
48
41
|
var _loop = function _loop() {
|
|
49
|
-
var _fullData$item$key$0$;
|
|
50
42
|
var item = _step.value;
|
|
51
43
|
item.children = [];
|
|
52
44
|
fullSidebarDataToMenuData(rootList, item.key, item.children);
|
|
53
|
-
|
|
54
|
-
var
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
+
}
|
|
70
65
|
// children 的 order 排序
|
|
71
66
|
item.children.sort(function (a, b) {
|
|
72
67
|
return a.order - b.order;
|
|
73
68
|
});
|
|
74
|
-
if (item.children.length
|
|
69
|
+
if (item.children.length === 0) delete item.children;
|
|
75
70
|
};
|
|
76
71
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
77
72
|
_loop();
|
|
@@ -82,17 +77,19 @@ export var useMenu = function useMenu() {
|
|
|
82
77
|
_iterator.f();
|
|
83
78
|
}
|
|
84
79
|
if (hrefId === baseRoute) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
+
}
|
|
96
93
|
list.sort(function (a, b) {
|
|
97
94
|
return a.order - b.order;
|
|
98
95
|
});
|
|
@@ -101,36 +98,34 @@ export var useMenu = function useMenu() {
|
|
|
101
98
|
};
|
|
102
99
|
return fullSidebarDataToMenuData(rootList, hrefId, []);
|
|
103
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();
|
|
104
122
|
var menuData = useMemo(function () {
|
|
105
|
-
return
|
|
106
|
-
}, [
|
|
123
|
+
return getMenuDataFn(baseRoute);
|
|
124
|
+
}, [getMenuDataFn, baseRoute]);
|
|
107
125
|
|
|
108
126
|
// 将菜单数据扁平化
|
|
109
127
|
var flattedMenuData = useMemo(function () {
|
|
110
128
|
return flattenMenu(menuData);
|
|
111
129
|
}, [menuData]);
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
// Nav 跳转但不在菜单中,则选中第一个菜单项
|
|
115
|
-
var navOf = function navOf(navs) {
|
|
116
|
-
return navs.some(function (nav) {
|
|
117
|
-
var _nav$slug;
|
|
118
|
-
return (nav === null || nav === void 0 || (_nav$slug = nav.slug) === null || _nav$slug === void 0 ? void 0 : _nav$slug.replace('docs/', '/')) === pathname;
|
|
119
|
-
});
|
|
120
|
-
};
|
|
121
|
-
var isNavLink = !!navOf(navs);
|
|
122
|
-
var isExactLink = (_navOf = navOf(navs)) === null || _navOf === void 0 ? void 0 : _navOf.exact;
|
|
123
|
-
var isLinkInMenu = flattedMenuData.some(function (item) {
|
|
124
|
-
return item.link === pathname;
|
|
125
|
-
});
|
|
126
|
-
if (isNavLink && !isExactLink && !isLinkInMenu) {
|
|
127
|
-
var firstValidMenuItem = flattedMenuData.find(function (item) {
|
|
128
|
-
return item.link;
|
|
129
|
-
});
|
|
130
|
-
if (firstValidMenuItem) {
|
|
131
|
-
navigate(firstValidMenuItem.link);
|
|
132
|
-
selectedKey = firstValidMenuItem.link;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return [menuData, selectedKey, flattedMenuData];
|
|
130
|
+
return [menuData, pathname, flattedMenuData];
|
|
136
131
|
};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { useLocation, useOutlet, useSiteData } from 'dumi';
|
|
1
|
+
import { Helmet, useLocation, useOutlet, useSiteData } from 'dumi';
|
|
2
2
|
import React, { useEffect } from 'react';
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
3
|
+
import { getPurePathname } from "../utils/location";
|
|
4
|
+
import IndexLayout from "./IndexLayout";
|
|
5
|
+
import ManualLayout from "./ManualLayout";
|
|
6
6
|
|
|
7
7
|
// 用户手动添加自己的
|
|
8
8
|
import "../slots/_.less";
|
|
9
9
|
import "../slots/global";
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* DocLayout 是 dumi2 的内置 layout 入口,在这里使用页面路径进行区分成自己不同的 Layout。
|
|
13
13
|
*/
|
|
14
14
|
export default (function () {
|
|
15
15
|
var _useSiteData = useSiteData(),
|
|
@@ -22,8 +22,10 @@ export default (function () {
|
|
|
22
22
|
console.log('%cAntV 让数据栩栩如生', 'color:#5B7102; font-size: 20px;'), console.log('%c新一代数据可视化解决方案', 'color:#5B7102;'), console.log('--------------------------'), console.log('%c关注我们的微信公众号 %c“数据可视化 AntV”%c,获取我们团队最新的进展、动态、分享,也欢迎加入我们!', 'color: red', 'color: pink', 'color: red');
|
|
23
23
|
}, []);
|
|
24
24
|
var outlet = useOutlet();
|
|
25
|
-
var
|
|
26
|
-
|
|
25
|
+
var location = useLocation();
|
|
26
|
+
var pathname = location.pathname,
|
|
27
|
+
hash = location.hash;
|
|
28
|
+
var purePathname = getPurePathname(pathname);
|
|
27
29
|
|
|
28
30
|
// 监听 hash 变更,跳转到锚点位置
|
|
29
31
|
// 同时监听页面 loading 状态,因为路由按需加载时需要等待页面渲染完毕才能找到锚点位置
|
|
@@ -34,22 +36,29 @@ export default (function () {
|
|
|
34
36
|
if (elm) document.documentElement.scrollTo(0, elm.offsetTop - 80);
|
|
35
37
|
}
|
|
36
38
|
}, [loading, hash]);
|
|
37
|
-
var
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
var content = React.useMemo(function () {
|
|
40
|
+
// 首页
|
|
41
|
+
if (['/', ''].includes(purePathname)) {
|
|
42
|
+
return /*#__PURE__*/React.createElement(IndexLayout, null, outlet);
|
|
43
|
+
}
|
|
40
44
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
+
});
|
|
47
52
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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);
|
|
55
64
|
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import Footer from "dumi/theme/slots/Footer";
|
|
3
|
+
import Header from "dumi/theme/slots/Header";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 首页布局
|
|
7
|
+
*/
|
|
8
|
+
var IndexLayout = function IndexLayout(props) {
|
|
9
|
+
var children = props.children;
|
|
10
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Header, null), /*#__PURE__*/React.createElement("div", {
|
|
11
|
+
style: {
|
|
12
|
+
minHeight: '100vh'
|
|
13
|
+
}
|
|
14
|
+
}, children), /*#__PURE__*/React.createElement(Footer, null));
|
|
15
|
+
};
|
|
16
|
+
export default IndexLayout;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import { Header } from "dumi/theme/slots/Header";
|
|
2
|
+
import Footer from "dumi/theme/slots/Footer";
|
|
3
|
+
import Header from "dumi/theme/slots/Header";
|
|
5
4
|
import { ManualContent } from "dumi/theme/slots/ManualContent";
|
|
6
5
|
|
|
7
6
|
/**
|
|
8
7
|
* Manual 路由下的入口
|
|
9
8
|
*/
|
|
10
|
-
|
|
9
|
+
var ManualLayout = function ManualLayout(_ref) {
|
|
11
10
|
var children = _ref.children;
|
|
12
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(
|
|
11
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Header, {
|
|
13
12
|
isHomePage: false
|
|
14
13
|
}), /*#__PURE__*/React.createElement(ManualContent, null, children), /*#__PURE__*/React.createElement(Footer, {
|
|
15
14
|
isDynamicFooter: true
|
|
16
15
|
}));
|
|
17
|
-
};
|
|
16
|
+
};
|
|
17
|
+
export default ManualLayout;
|
package/dist/pages/404.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import
|
|
2
|
+
import CommonHelmet from "../common/CommonHelmet";
|
|
3
3
|
import { NotFound as NotFoundPage } from "dumi/theme/slots/404";
|
|
4
|
-
import
|
|
5
|
-
import
|
|
4
|
+
import Footer from "dumi/theme/slots/Footer";
|
|
5
|
+
import Header from "dumi/theme/slots/Header";
|
|
6
|
+
|
|
6
7
|
/**
|
|
7
8
|
* 404 页面
|
|
8
9
|
*/
|
|
9
10
|
var NotFound = function NotFound() {
|
|
10
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(
|
|
11
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(CommonHelmet, {
|
|
11
12
|
title: "404: Not found"
|
|
12
13
|
}), /*#__PURE__*/React.createElement(Header, {
|
|
13
14
|
isHomePage: false
|