@antv/dumi-theme-antv 0.6.3-beta.0 → 0.6.4-alpha.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.
Files changed (61) hide show
  1. package/dist/builtins/Playground/index.js +1 -1
  2. package/dist/common/ClientOnly.js +21 -0
  3. package/dist/common/InViewSuspense.js +26 -0
  4. package/dist/common/SEO.js +3 -1
  5. package/dist/hooks/useLocale.js +8 -0
  6. package/dist/hooks/useMenu.js +1 -1
  7. package/dist/layouts/DocLayout.js +15 -11
  8. package/dist/layouts/IndexLayout/index.js +16 -0
  9. package/dist/layouts/{entry/Manual.js → ManualLayout/index.js} +5 -4
  10. package/dist/pages/404.js +3 -2
  11. package/dist/pages/Example/components/ExampleSider/index.js +190 -0
  12. package/dist/pages/Example/index.js +70 -51
  13. package/dist/pages/Examples/components/ExampleTopicMenu/index.js +3 -2
  14. package/dist/pages/Examples/index.js +26 -30
  15. package/dist/{slots → pages/Index/components}/Cases/index.js +1 -1
  16. package/dist/{slots → pages/Index/components}/Detail/News.js +1 -1
  17. package/dist/{slots → pages/Index/components}/Detail/index.js +1 -1
  18. package/dist/{slots → pages/Index/components}/Features/FeatureCard.js +1 -1
  19. package/dist/{slots → pages/Index/components}/Features/index.js +1 -1
  20. package/dist/pages/Index/components/_.less +119 -0
  21. package/dist/{layouts/entry/Index.js → pages/Index/index.js} +15 -19
  22. package/dist/plugin/index.js +52 -43
  23. package/dist/slots/CodeEditor/index.js +4 -3
  24. package/dist/slots/CodePreview/CodeHeader.js +3 -2
  25. package/dist/slots/CodePreview/index.js +3 -2
  26. package/dist/slots/CodeRunner/index.js +34 -29
  27. package/dist/slots/ExampleSider/index.js +3 -2
  28. package/dist/slots/Feedback/Contributors.js +3 -2
  29. package/dist/slots/Feedback/EditButton.js +3 -2
  30. package/dist/slots/Feedback/PageFeedback.js +4 -3
  31. package/dist/slots/Feedback/SectionFeedback.js +3 -2
  32. package/dist/slots/Feedback/index.js +12 -10
  33. package/dist/slots/Footer/index.js +3 -2
  34. package/dist/slots/Header/Search/index.js +1 -1
  35. package/dist/slots/Header/index.js +17 -12
  36. package/dist/slots/ManualContent/Main.js +17 -17
  37. package/dist/slots/ManualContent/NavigatorBanner.js +4 -2
  38. package/dist/slots/ManualContent/ObPreview.js +17 -0
  39. package/dist/slots/ManualContent/index.js +2 -4
  40. package/dist/slots/ManualContent/usePreview.js +7 -1
  41. package/dist/slots/ManualContent/utils.js +3 -13
  42. package/dist/slots/global.js +4 -4
  43. package/dist/slots/hooks.js +0 -25
  44. package/dist/slots/utils.js +0 -7
  45. package/dist/utils/env.js +10 -0
  46. package/dist/utils/location.js +3 -0
  47. package/package.json +5 -5
  48. package/dist/layouts/entry/API.js +0 -12
  49. package/dist/pages/Example/utils.js +0 -9
  50. package/dist/slots/Article/index.js +0 -9
  51. package/dist/slots/Article/index.module.less +0 -8
  52. package/dist/slots/CodePreview/CodeHeader.module.less +0 -0
  53. package/dist/slots/Header/Products/NavigatorBanner.js +0 -29
  54. package/dist/slots/Header/Products/NavigatorBanner.module.less +0 -39
  55. /package/dist/{slots → pages/Index/components}/Cases/index.module.less +0 -0
  56. /package/dist/{slots → pages/Index/components}/Companies/index.js +0 -0
  57. /package/dist/{slots → pages/Index/components}/Companies/index.module.less +0 -0
  58. /package/dist/{slots → pages/Index/components}/Detail/News.module.less +0 -0
  59. /package/dist/{slots → pages/Index/components}/Detail/index.module.less +0 -0
  60. /package/dist/{slots → pages/Index/components}/Features/FeatureCard.module.less +0 -0
  61. /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 { CodeRunner } from "dumi/theme/slots/CodeRunner";
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,26 @@
1
+ import { Skeleton } from 'antd';
2
+ import React, { Suspense } from 'react';
3
+ import { InView } from 'react-intersection-observer';
4
+ var InViewSuspense = function InViewSuspense(_ref) {
5
+ var children = _ref.children,
6
+ _ref$fallback = _ref.fallback,
7
+ fallback = _ref$fallback === void 0 ? /*#__PURE__*/React.createElement(Skeleton.Input, {
8
+ active: true,
9
+ size: "small"
10
+ }) : _ref$fallback,
11
+ _ref$delay = _ref.delay,
12
+ delay = _ref$delay === void 0 ? 200 : _ref$delay;
13
+ return /*#__PURE__*/React.createElement(InView, {
14
+ triggerOnce: true,
15
+ delay: delay
16
+ }, function (_ref2) {
17
+ var inView = _ref2.inView,
18
+ ref = _ref2.ref;
19
+ return /*#__PURE__*/React.createElement("div", {
20
+ ref: ref
21
+ }, /*#__PURE__*/React.createElement(Suspense, {
22
+ fallback: fallback
23
+ }, inView ? children : /*#__PURE__*/React.createElement("span", null)));
24
+ });
25
+ };
26
+ export default InViewSuspense;
@@ -24,7 +24,9 @@ var SEO = function SEO(_ref) {
24
24
  var defaultMeta = [{
25
25
  name: "description",
26
26
  content: description
27
- }, {
27
+ },
28
+ // "og" 全称为 Open Graph,用于指定页面在社交媒体上的展示效果
29
+ {
28
30
  property: "og:title",
29
31
  content: title
30
32
  }, {
@@ -0,0 +1,8 @@
1
+ import { useLocale as useDumiLocale } from 'dumi';
2
+ var useLocale = function useLocale(localeMap) {
3
+ var _useDumiLocale = useDumiLocale(),
4
+ id = _useDumiLocale.id;
5
+ var localeType = id === 'zh' ? 'zh' : 'en';
6
+ return [localeMap === null || localeMap === void 0 ? void 0 : localeMap[localeType], localeType];
7
+ };
8
+ export default useLocale;
@@ -23,7 +23,7 @@ export var useMenu = function useMenu() {
23
23
  _useSiteData$themeCon = _useSiteData.themeConfig,
24
24
  docs = _useSiteData$themeCon.docs,
25
25
  navs = _useSiteData$themeCon.navs;
26
- var baseRoute = getBaseRoute();
26
+ var baseRoute = getBaseRoute(pathname);
27
27
  var navigate = useNavigate();
28
28
  var locale = useLocale();
29
29
  var currentLocale = locale.id;
@@ -1,15 +1,15 @@
1
1
  import { useLocation, useOutlet, useSiteData } from 'dumi';
2
2
  import React, { useEffect } from 'react';
3
- import { getCurrentPathname } from "../slots/utils";
4
- import { Index } from "./entry/Index";
5
- import { Manual } from "./entry/Manual";
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
- * DocuLayout 是 dumi2 的内置 layout 入口,在这里使用页面路径进行区分成自己不同的 Layout。
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 _useLocation = useLocation(),
26
- hash = _useLocation.hash;
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,9 +36,11 @@ export default (function () {
34
36
  if (elm) document.documentElement.scrollTo(0, elm.offsetTop - 80);
35
37
  }
36
38
  }, [loading, hash]);
37
- var p = getCurrentPathname();
39
+
38
40
  // 首页
39
- if (p === '/' || p === '/zh' || p === '/en' || p === '/en/') return /*#__PURE__*/React.createElement(Index, null);
41
+ if (['/', ''].includes(purePathname)) {
42
+ return /*#__PURE__*/React.createElement(IndexLayout, null, outlet);
43
+ }
40
44
 
41
45
  // 匹配 navs 中的 docs 路由
42
46
  var docsRoutes = navs.filter(function (nav) {
@@ -46,10 +50,10 @@ export default (function () {
46
50
  return item !== 'docs';
47
51
  });
48
52
  });
49
- if (docsRoutes.some(function (route) {
50
- return p.startsWith("/".concat(route)) || p.startsWith("/docs/".concat(route));
53
+ if (docsRoutes.some(function (slug) {
54
+ return purePathname.startsWith("/".concat(slug)) || purePathname.startsWith("/docs/".concat(slug));
51
55
  })) {
52
- return /*#__PURE__*/React.createElement(Manual, null, outlet);
56
+ return /*#__PURE__*/React.createElement(ManualLayout, null, outlet);
53
57
  }
54
58
  return outlet;
55
59
  });
@@ -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,18 @@
1
1
  import React from 'react';
2
2
  import SEO from "../../common/SEO";
3
- import { Footer } from "dumi/theme/slots/Footer";
4
- import { Header } from "dumi/theme/slots/Header";
3
+ import Footer from "dumi/theme/slots/Footer";
4
+ import Header from "dumi/theme/slots/Header";
5
5
  import { ManualContent } from "dumi/theme/slots/ManualContent";
6
6
 
7
7
  /**
8
8
  * Manual 路由下的入口
9
9
  */
10
- export var Manual = function Manual(_ref) {
10
+ var ManualLayout = function ManualLayout(_ref) {
11
11
  var children = _ref.children;
12
12
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(SEO, null), /*#__PURE__*/React.createElement(Header, {
13
13
  isHomePage: false
14
14
  }), /*#__PURE__*/React.createElement(ManualContent, null, children), /*#__PURE__*/React.createElement(Footer, {
15
15
  isDynamicFooter: true
16
16
  }));
17
- };
17
+ };
18
+ export default ManualLayout;
package/dist/pages/404.js CHANGED
@@ -1,8 +1,9 @@
1
1
  import React from 'react';
2
2
  import SEO from "../common/SEO";
3
3
  import { NotFound as NotFoundPage } from "dumi/theme/slots/404";
4
- import { Footer } from "dumi/theme/slots/Footer";
5
- import { Header } from "dumi/theme/slots/Header";
4
+ import Footer from "dumi/theme/slots/Footer";
5
+ import Header from "dumi/theme/slots/Header";
6
+
6
7
  /**
7
8
  * 404 页面
8
9
  */
@@ -0,0 +1,190 @@
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 ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ 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; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
6
+ 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); }
7
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
8
+ 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."); }
9
+ 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); }
10
+ 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
+ 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; } }
12
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
13
+ import { createFromIconfontCN, SearchOutlined, VerticalAlignTopOutlined } from '@ant-design/icons';
14
+ import { Input, Menu, Tooltip } from 'antd';
15
+ import classNames from 'classnames';
16
+ import { FormattedMessage, useIntl, useLocale } from 'dumi';
17
+ import { cloneDeep } from 'lodash-es';
18
+ import React, { useEffect, useRef, useState } from 'react';
19
+ import styles from "./index.module.less";
20
+
21
+ // menu icon
22
+ var MenuIcon = createFromIconfontCN({
23
+ scriptUrl: '//at.alicdn.com/t/font_470089_1lnym745udm.js' // generated by iconfont.cn
24
+ });
25
+ /**
26
+ * DEMO 预览页面的菜单
27
+ */
28
+ var ExampleSider = function ExampleSider(props) {
29
+ var currentDemo = props.currentDemo,
30
+ onDemoClicked = props.onDemoClicked,
31
+ exampleTopics = props.exampleTopics;
32
+ // 菜单栏展开keys
33
+ var _useState = useState([]),
34
+ _useState2 = _slicedToArray(_useState, 2),
35
+ openKeys = _useState2[0],
36
+ setOpenKeys = _useState2[1];
37
+ var menuRef = useRef(null);
38
+
39
+ // 初始化点击进来的示例按钮a的dom
40
+ var _useState3 = useState(),
41
+ _useState4 = _slicedToArray(_useState3, 2),
42
+ aRef = _useState4[0],
43
+ setARef = _useState4[1];
44
+
45
+ // input 搜索框的value
46
+ var _useState5 = useState(''),
47
+ _useState6 = _slicedToArray(_useState5, 2),
48
+ searchValue = _useState6[0],
49
+ setSearchValue = _useState6[1];
50
+ var locale = useLocale();
51
+ var intl = useIntl();
52
+ var getCurrentTopics = function getCurrentTopics() {
53
+ var res = filterTreeNode({
54
+ id: 'FAKE_ID',
55
+ childrenKey: 'exampleTopics',
56
+ title: {
57
+ zh: 'FAKE_TITLE',
58
+ en: 'FAKE_TITLE'
59
+ },
60
+ exampleTopics: cloneDeep(exampleTopics)
61
+ }, searchValue, locale.id);
62
+ return (res === null || res === void 0 ? void 0 : res.exampleTopics) || [];
63
+ };
64
+
65
+ // 初始化菜单栏展开keys
66
+ useEffect(function () {
67
+ var targetExample = currentDemo.targetExample,
68
+ targetTopic = currentDemo.targetTopic;
69
+ var keys = ["TOPIC-".concat(targetTopic === null || targetTopic === void 0 ? void 0 : targetTopic.id), "EXAMPLE-".concat(targetTopic.id, "-").concat(targetExample === null || targetExample === void 0 ? void 0 : targetExample.id)];
70
+ setOpenKeys(keys);
71
+ }, [currentDemo]);
72
+
73
+ // 初始化滚动到中间
74
+ useEffect(function () {
75
+ if (aRef) {
76
+ aRef.scrollIntoView({
77
+ block: 'center',
78
+ behavior: 'smooth'
79
+ });
80
+ }
81
+ }, [aRef]);
82
+
83
+ // 获取搜索后的文本结构 左文本 + 搜索文本 + 右文本
84
+ var getSearchValueTitle = function getSearchValueTitle(title) {
85
+ return searchValue && title.match(searchValue) ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", null, title.replace(new RegExp("".concat(searchValue, ".*")), '')), /*#__PURE__*/React.createElement("span", {
86
+ className: styles.searchValue
87
+ }, searchValue), /*#__PURE__*/React.createElement("span", null, title.replace(new RegExp(".*?".concat(searchValue)), ''))) : title;
88
+ };
89
+
90
+ // 图例按钮 + img + tooltip文本
91
+ var renderExampleDemoCard = function renderExampleDemoCard(demo) {
92
+ return /*#__PURE__*/React.createElement(Tooltip, {
93
+ placement: "right",
94
+ title: getSearchValueTitle(demo.title[locale.id] || ''),
95
+ key: demo.id
96
+ }, /*#__PURE__*/React.createElement("a", {
97
+ ref: function ref(dom) {
98
+ // TODO: DEAL WITH ME
99
+ // if (dom && !aRef && item.value === getPath(currentExample)) {
100
+ // setARef(dom);
101
+ // }
102
+ },
103
+ className: classNames(styles.card, _defineProperty({}, styles.current, currentDemo.id === demo.id))
104
+ }, /*#__PURE__*/React.createElement("div", {
105
+ className: classNames(styles.screenshot),
106
+ style: {
107
+ backgroundImage: "url(".concat(demo.screenshot || 'https://gw.alipayobjects.com/os/s/prod/antv/assets/image/screenshot-placeholder-b8e70.png', ")")
108
+ },
109
+ title: demo.title[locale.id]
110
+ })));
111
+ };
112
+ var renderSubMenu = function renderSubMenu() {
113
+ return getCurrentTopics().map(function (topic) {
114
+ return /*#__PURE__*/React.createElement(Menu.SubMenu, {
115
+ key: "TOPIC-".concat(topic.id),
116
+ title: /*#__PURE__*/React.createElement("div", null, topic.icon && /*#__PURE__*/React.createElement(MenuIcon, {
117
+ className: styles.menuIcon,
118
+ type: "icon-".concat(topic.icon)
119
+ }), /*#__PURE__*/React.createElement("span", {
120
+ className: classNames(styles.menuTitleContent, styles.subMenuTitleContent)
121
+ }, topic.title && getSearchValueTitle(topic.title[locale.id])))
122
+ }, topic.examples.map(function (example) {
123
+ return /*#__PURE__*/React.createElement(Menu.SubMenu, {
124
+ key: "EXAMPLE-".concat(topic.id, "-").concat(example.id),
125
+ title: example.title[locale.id]
126
+ }, example.demos.map(function (demo) {
127
+ return /*#__PURE__*/React.createElement(Menu.Item, {
128
+ key: "DEMO-".concat(topic.id, "-").concat(example.id, "-").concat(demo.id),
129
+ style: {
130
+ height: 70,
131
+ padding: 0,
132
+ cursor: 'pointer'
133
+ },
134
+ onClick: function onClick() {
135
+ onDemoClicked(_objectSpread(_objectSpread({}, demo), {}, {
136
+ targetExample: example,
137
+ targetTopic: topic
138
+ }));
139
+ }
140
+ }, /*#__PURE__*/React.createElement("span", {
141
+ className: styles.menuTitleContent
142
+ }, renderExampleDemoCard(demo)));
143
+ }));
144
+ }));
145
+ });
146
+ };
147
+
148
+ // 搜索栏
149
+ var renderSearchBar = function renderSearchBar() {
150
+ return /*#__PURE__*/React.createElement("div", {
151
+ className: styles.searchSider
152
+ }, /*#__PURE__*/React.createElement(Input, {
153
+ size: "small",
154
+ placeholder: intl.formatMessage({
155
+ id: '搜索…'
156
+ }),
157
+ prefix: /*#__PURE__*/React.createElement(SearchOutlined, null),
158
+ value: searchValue,
159
+ onChange: function onChange(e) {
160
+ return setSearchValue(e.target.value);
161
+ }
162
+ }), /*#__PURE__*/React.createElement(Tooltip, {
163
+ placement: "right",
164
+ title: /*#__PURE__*/React.createElement(FormattedMessage, {
165
+ id: "\u6536\u8D77\u6240\u6709"
166
+ })
167
+ }, /*#__PURE__*/React.createElement(VerticalAlignTopOutlined, {
168
+ className: styles.searchSiderIcon,
169
+ onClick: function onClick() {
170
+ return setOpenKeys([]);
171
+ }
172
+ })));
173
+ };
174
+ return /*#__PURE__*/React.createElement("div", {
175
+ className: classNames(styles.shadowWrapper)
176
+ }, renderSearchBar(), /*#__PURE__*/React.createElement(Menu, {
177
+ ref: menuRef,
178
+ mode: "inline",
179
+ style: {
180
+ width: '100%'
181
+ },
182
+ className: styles.sideBarMenu,
183
+ openKeys: openKeys,
184
+ selectedKeys: ["DEMO-".concat(currentDemo.id)],
185
+ onOpenChange: function onOpenChange(keys) {
186
+ setOpenKeys(keys);
187
+ }
188
+ }, renderSubMenu()));
189
+ };
190
+ export default ExampleSider;
@@ -1,77 +1,96 @@
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
1
  import { Layout } from 'antd';
8
2
  import { useLocale, useSiteData } from 'dumi';
9
3
  import { every, find, get } from 'lodash-es';
10
- import React, { useContext, useEffect, useMemo, useState } from 'react';
4
+ import React, { useContext } from 'react';
11
5
  import { useLocation, useNavigate, useParams } from 'react-router-dom';
12
6
  import { useSnapshot } from 'valtio';
7
+ import InViewSuspense from "../../common/InViewSuspense";
13
8
  import SEO from "../../common/SEO";
14
9
  import { ThemeAntVContext } from "../../context";
15
10
  import { store } from "../../model";
16
11
  import { API } from "dumi/theme/slots/API";
17
- import { CodeRunner } from "dumi/theme/slots/CodeRunner";
12
+ import CodeRunner from "dumi/theme/slots/CodeRunner";
18
13
  import { getDemoInfo } from "../../slots/CodeRunner/utils";
19
- import { ExampleSider } from "dumi/theme/slots/ExampleSider";
20
- import { Header } from "dumi/theme/slots/Header";
21
14
  import { CollapsedIcon } from "./components/CollapsedIcon";
22
15
  import styles from "./index.module.less";
23
- import { getCurrentTitle } from "./utils";
24
16
  var Sider = Layout.Sider,
25
17
  Content = Layout.Content;
18
+ var Header = /*#__PURE__*/React.lazy(function () {
19
+ return import("dumi/theme/slots/Header");
20
+ });
21
+ var ExampleSider = /*#__PURE__*/React.lazy(function () {
22
+ return import("dumi/theme/slots/ExampleSider");
23
+ });
26
24
  /**
27
- * 具体单个案例的页面
25
+ * 解析 Example 页面的元数据
28
26
  */
29
- var Example = function Example() {
30
- var _useLocation = useLocation(),
31
- hash = _useLocation.hash;
32
- var nav = useNavigate();
27
+ var useExampleMeta = function useExampleMeta() {
28
+ /** 示例页面的元数据信息 */
29
+ var metaData = useContext(ThemeAntVContext);
30
+ var exampleTopics = metaData.meta.exampleTopics;
33
31
  var _useParams = useParams(),
34
32
  topic = _useParams.topic,
35
33
  example = _useParams.example;
36
- /** 示例页面的元数据信息 */
37
- var metaData = useContext(ThemeAntVContext);
34
+ var _useLocation = useLocation(),
35
+ hash = _useLocation.hash;
36
+ var examples = get(exampleTopics, ['0', 'examples']);
37
+ var exampleDemo = find(examples, function (_ref) {
38
+ var id = _ref.id;
39
+ return id === example;
40
+ });
41
+ // examples/case/id hash 为空,可以默认第一个 example 对应的 demo
42
+ var demo = hash.slice(1) || get(exampleDemo, ['demos', '0', 'id']);
43
+ var locale = useLocale();
44
+ var exampleTitle = get(exampleDemo, ['title', locale.id]);
45
+ var currentDemo = getDemoInfo(exampleTopics, topic, example, demo);
46
+ var demoTitle = get(currentDemo, ['title', locale.id]);
47
+ return {
48
+ // all example topics
49
+ exampleTopics: exampleTopics,
50
+ // topic id
51
+ topic: topic,
52
+ // example id
53
+ example: example,
54
+ // example title
55
+ exampleTitle: exampleTitle,
56
+ // demo id
57
+ demo: demo,
58
+ // current demo info
59
+ currentDemo: currentDemo,
60
+ // demo title
61
+ demoTitle: demoTitle
62
+ };
63
+ };
64
+
65
+ /**
66
+ * 具体单个案例的页面
67
+ */
68
+ var Example = function Example() {
69
+ var state = useSnapshot(store);
70
+ var navigate = useNavigate();
38
71
  var locale = useLocale();
72
+ var _useExampleMeta = useExampleMeta(),
73
+ exampleTopics = _useExampleMeta.exampleTopics,
74
+ exampleTitle = _useExampleMeta.exampleTitle,
75
+ currentDemo = _useExampleMeta.currentDemo,
76
+ topic = _useExampleMeta.topic,
77
+ example = _useExampleMeta.example,
78
+ demo = _useExampleMeta.demo,
79
+ demoTitle = _useExampleMeta.demoTitle;
39
80
  var _useSiteData = useSiteData(),
40
81
  themeConfig = _useSiteData.themeConfig;
41
- var exampleTopics = metaData.meta.exampleTopics;
42
- var demo = useMemo(function () {
43
- var examples = get(exampleTopics, ['0', 'examples']);
44
- var exampleDemo = find(examples, function (_ref) {
45
- var id = _ref.id;
46
- return id === example;
47
- });
48
- // examples/case/id hash 为空,可以默认第一个 example 对应的 demo
49
- return hash.slice(1) || get(exampleDemo, ['demos', '0', 'id']);
50
- }, [hash, exampleTopics, example]);
51
- var _useState = useState(),
52
- _useState2 = _slicedToArray(_useState, 2),
53
- currentDemo = _useState2[0],
54
- setCurrentDemo = _useState2[1];
55
- var state = useSnapshot(store);
56
- var _useState3 = useState({}),
57
- _useState4 = _slicedToArray(_useState3, 2),
58
- title = _useState4[0],
59
- setTitle = _useState4[1];
60
- useEffect(function () {
61
- if (topic && example && demo) {
62
- var targetDemoInfo = getDemoInfo(exampleTopics, topic, example, demo);
63
- setCurrentDemo(targetDemoInfo);
64
- setTitle(getCurrentTitle(exampleTopics, topic, example));
65
- }
66
- }, [topic, example, hash]);
67
82
  var showAPI = every([get(themeConfig, 'showAPIDoc'), topic, example], Boolean);
83
+ if (!currentDemo) {
84
+ return null;
85
+ }
68
86
  return /*#__PURE__*/React.createElement("div", {
69
87
  className: styles.example
70
88
  }, /*#__PURE__*/React.createElement(SEO, {
71
- title: title[locale.id]
72
- }), /*#__PURE__*/React.createElement(Header, {
89
+ title: exampleTitle,
90
+ description: demoTitle
91
+ }), /*#__PURE__*/React.createElement(InViewSuspense, null, /*#__PURE__*/React.createElement(Header, {
73
92
  isHomePage: false
74
- }), /*#__PURE__*/React.createElement(Layout, {
93
+ })), /*#__PURE__*/React.createElement(Layout, {
75
94
  className: styles.container
76
95
  }, /*#__PURE__*/React.createElement(Sider, {
77
96
  collapsedWidth: 0,
@@ -81,7 +100,7 @@ var Example = function Example() {
81
100
  collapsed: state.hideMenu,
82
101
  className: styles.menuSider,
83
102
  theme: "light"
84
- }, currentDemo && /*#__PURE__*/React.createElement(ExampleSider, {
103
+ }, /*#__PURE__*/React.createElement(InViewSuspense, null, /*#__PURE__*/React.createElement(ExampleSider, {
85
104
  showExampleDemoTitle: true,
86
105
  currentDemo: currentDemo,
87
106
  onDemoClicked: function onDemoClicked(example) {
@@ -90,10 +109,10 @@ var Example = function Example() {
90
109
  targetTopic = example.targetTopic;
91
110
  // eg: /zh/examples/case/area/#area1
92
111
  var newURL = "/".concat(locale.id, "/examples/").concat(targetTopic === null || targetTopic === void 0 ? void 0 : targetTopic.id, "/").concat(targetExample === null || targetExample === void 0 ? void 0 : targetExample.id, "/#").concat(demoId);
93
- nav(newURL);
112
+ navigate(newURL);
94
113
  },
95
114
  exampleTopics: exampleTopics
96
- }), /*#__PURE__*/React.createElement(CollapsedIcon, {
115
+ })), /*#__PURE__*/React.createElement(CollapsedIcon, {
97
116
  isCollapsed: state.hideMenu,
98
117
  onClick: function onClick(show) {
99
118
  store.hideMenu = show;
@@ -104,7 +123,7 @@ var Example = function Example() {
104
123
  }
105
124
  })), /*#__PURE__*/React.createElement(Content, {
106
125
  className: styles.content
107
- }, topic && example && /*#__PURE__*/React.createElement(CodeRunner, {
126
+ }, /*#__PURE__*/React.createElement(CodeRunner, {
108
127
  exampleTopics: exampleTopics,
109
128
  topic: topic,
110
129
  example: example,
@@ -18,7 +18,7 @@ import { LeftMenu } from "./components/LeftMenu";
18
18
  * @param {LeftMenuProps} props 相关参数,详见类型定义
19
19
  * @returns {React.FC} React.FC
20
20
  */
21
- export var ExampleTopicMenu = function ExampleTopicMenu(props) {
21
+ var ExampleTopicMenu = function ExampleTopicMenu(props) {
22
22
  var exampleTopics = props.exampleTopics;
23
23
  var isWide = useMedia('(min-width: 767.99px)', true);
24
24
  var _useState = useState(false),
@@ -51,4 +51,5 @@ export var ExampleTopicMenu = function ExampleTopicMenu(props) {
51
51
  }, /*#__PURE__*/React.createElement(LeftMenu, {
52
52
  exampleTopics: exampleTopics
53
53
  })));
54
- };
54
+ };
55
+ export default ExampleTopicMenu;