dumi 2.2.0-alpha.2 → 2.2.0-rc.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 (38) hide show
  1. package/README.md +2 -6
  2. package/compiled/_internal/searchWorker.min.js +1 -1
  3. package/compiled/crates/swc_plugin_react_demo.wasm +0 -0
  4. package/dist/assetParsers/atom.d.ts +2 -0
  5. package/dist/assetParsers/atom.js +19 -12
  6. package/dist/client/theme-api/DumiDemoGrid.js +2 -1
  7. package/dist/client/theme-api/DumiPage.js +2 -0
  8. package/dist/client/theme-api/types.d.ts +4 -1
  9. package/dist/client/theme-api/useNavData.js +77 -15
  10. package/dist/client/theme-api/useSidebarData.js +31 -7
  11. package/dist/client/theme-api/useSiteSearch/index.d.ts +1 -0
  12. package/dist/client/theme-api/utils.d.ts +3 -3
  13. package/dist/client/theme-api/utils.js +1 -1
  14. package/dist/features/autoAlias.js +20 -23
  15. package/dist/features/configPlugins/index.js +2 -1
  16. package/dist/features/configPlugins/schema.js +0 -1
  17. package/dist/features/derivative.js +0 -1
  18. package/dist/features/locales.js +2 -1
  19. package/dist/features/routes.js +25 -12
  20. package/dist/features/theme/index.js +77 -4
  21. package/dist/loaders/markdown/transformer/rehypeDemo.js +35 -9
  22. package/dist/loaders/markdown/transformer/rehypeEnhancedTag.js +1 -0
  23. package/dist/types.d.ts +2 -8
  24. package/dist/utils.d.ts +0 -4
  25. package/dist/utils.js +0 -14
  26. package/package.json +8 -3
  27. package/theme-default/builtins/API/index.js +1 -1
  28. package/theme-default/builtins/SourceCode/index.js +27 -13
  29. package/theme-default/builtins/SourceCode/index.less +53 -3
  30. package/theme-default/builtins/Tree/index.d.ts +4 -0
  31. package/theme-default/builtins/Tree/index.js +206 -0
  32. package/theme-default/builtins/Tree/index.less +186 -0
  33. package/theme-default/slots/ColorSwitch/index.less +4 -2
  34. package/theme-default/slots/Navbar/index.js +80 -13
  35. package/theme-default/slots/Navbar/index.less +128 -4
  36. package/theme-default/slots/RtlSwitch/index.less +2 -1
  37. package/theme-default/slots/SocialIcon/index.less +2 -1
  38. package/theme-default/slots/Toc/index.js +8 -2
@@ -0,0 +1,206 @@
1
+ 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; }
2
+
3
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
+
5
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+
7
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
8
+
9
+ 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."); }
10
+
11
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
12
+
13
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
+
15
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
16
+
17
+ 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."); }
18
+
19
+ 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); }
20
+
21
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
22
+
23
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
24
+
25
+ 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; }
26
+
27
+ import { ReactComponent as FileOutlined } from '@ant-design/icons-svg/inline-svg/outlined/file.svg';
28
+ import { ReactComponent as FolderOpenOutlined } from '@ant-design/icons-svg/inline-svg/outlined/folder-open.svg';
29
+ import { ReactComponent as FolderOutlined } from '@ant-design/icons-svg/inline-svg/outlined/folder.svg';
30
+ import { ReactComponent as MinusSquareOutlined } from '@ant-design/icons-svg/inline-svg/outlined/minus-square.svg';
31
+ import { ReactComponent as PlusSquareOutlined } from '@ant-design/icons-svg/inline-svg/outlined/plus-square.svg';
32
+ import Tree from 'rc-tree';
33
+ import React, { createRef, useEffect, useState } from 'react';
34
+ import "./index.less";
35
+
36
+ function getTreeFromList(nodes) {
37
+ var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
38
+ var data = [];
39
+ [].concat(nodes).forEach(function (node, i) {
40
+ var key = "".concat(prefix ? "".concat(prefix, "-") : '').concat(i);
41
+
42
+ switch (node === null || node === void 0 ? void 0 : node.type) {
43
+ case 'ul':
44
+ {
45
+ var _data;
46
+
47
+ var parent = ((_data = data[data.length - 1]) === null || _data === void 0 ? void 0 : _data.children) || data;
48
+ var ulLeafs = getTreeFromList(node.props.children || [], key);
49
+ parent.push.apply(parent, _toConsumableArray(ulLeafs));
50
+ break;
51
+ }
52
+
53
+ case 'li':
54
+ {
55
+ var liLeafs = getTreeFromList(node.props.children, key);
56
+ data.push({
57
+ title: [].concat(node.props.children).filter(function (child) {
58
+ return child.type !== 'ul';
59
+ }),
60
+ key: key,
61
+ children: liLeafs,
62
+ isLeaf: !liLeafs.length
63
+ });
64
+ break;
65
+ }
66
+
67
+ default:
68
+ }
69
+ });
70
+ return data;
71
+ }
72
+
73
+ var useListToTree = function useListToTree(nodes) {
74
+ var _useState = useState(getTreeFromList(nodes)),
75
+ _useState2 = _slicedToArray(_useState, 2),
76
+ tree = _useState2[0],
77
+ setTree = _useState2[1];
78
+
79
+ useEffect(function () {
80
+ setTree(getTreeFromList(nodes));
81
+ }, [nodes]);
82
+ return tree;
83
+ };
84
+
85
+ var getIcon = function getIcon(props) {
86
+ var isLeaf = props.isLeaf,
87
+ expanded = props.expanded;
88
+
89
+ if (isLeaf) {
90
+ return /*#__PURE__*/React.createElement("span", {
91
+ className: "dumi-default-tree-icon"
92
+ }, /*#__PURE__*/React.createElement(FileOutlined, {
93
+ fill: "currentColor"
94
+ }));
95
+ }
96
+
97
+ return expanded ? /*#__PURE__*/React.createElement("span", {
98
+ className: "dumi-default-tree-icon"
99
+ }, /*#__PURE__*/React.createElement(FolderOpenOutlined, {
100
+ fill: "currentColor"
101
+ })) : /*#__PURE__*/React.createElement("span", {
102
+ className: "dumi-default-tree-icon"
103
+ }, /*#__PURE__*/React.createElement(FolderOutlined, {
104
+ fill: "currentColor"
105
+ }));
106
+ };
107
+
108
+ var renderSwitcherIcon = function renderSwitcherIcon(props) {
109
+ var isLeaf = props.isLeaf,
110
+ expanded = props.expanded;
111
+
112
+ if (isLeaf) {
113
+ return /*#__PURE__*/React.createElement("span", {
114
+ className: "tree-switcher-leaf-line"
115
+ });
116
+ }
117
+
118
+ return expanded ? /*#__PURE__*/React.createElement("span", {
119
+ className: "tree-switcher-line-icon"
120
+ }, /*#__PURE__*/React.createElement("span", {
121
+ className: "dumi-default-tree-icon"
122
+ }, /*#__PURE__*/React.createElement(MinusSquareOutlined, {
123
+ fill: "currentColor"
124
+ }))) : /*#__PURE__*/React.createElement("span", {
125
+ className: "tree-switcher-line-icon"
126
+ }, /*#__PURE__*/React.createElement("span", {
127
+ className: "dumi-default-tree-icon"
128
+ }, /*#__PURE__*/React.createElement(PlusSquareOutlined, {
129
+ fill: "currentColor"
130
+ })));
131
+ }; // ================== Collapse Motion ==================
132
+
133
+
134
+ var getCollapsedHeight = function getCollapsedHeight() {
135
+ return {
136
+ height: 0,
137
+ opacity: 0
138
+ };
139
+ };
140
+
141
+ var getRealHeight = function getRealHeight(node) {
142
+ var scrollHeight = node.scrollHeight;
143
+ return {
144
+ height: scrollHeight,
145
+ opacity: 1
146
+ };
147
+ };
148
+
149
+ var getCurrentHeight = function getCurrentHeight(node) {
150
+ return {
151
+ height: node ? node.offsetHeight : 0
152
+ };
153
+ };
154
+
155
+ var skipOpacityTransition = function skipOpacityTransition(_, event) {
156
+ return (event === null || event === void 0 ? void 0 : event.deadline) === true || event.propertyName === 'height';
157
+ };
158
+
159
+ var initCollapseMotion = {
160
+ motionName: 'ant-motion-collapse',
161
+ onAppearStart: getCollapsedHeight,
162
+ onEnterStart: getCollapsedHeight,
163
+ onAppearActive: getRealHeight,
164
+ onEnterActive: getRealHeight,
165
+ onLeaveStart: getCurrentHeight,
166
+ onLeaveActive: getCollapsedHeight,
167
+ onAppearEnd: skipOpacityTransition,
168
+ onEnterEnd: skipOpacityTransition,
169
+ onLeaveEnd: skipOpacityTransition,
170
+ motionDeadline: 500
171
+ };
172
+ export default (function (props) {
173
+ var data = useListToTree(props.children);
174
+ var treeRef = /*#__PURE__*/createRef();
175
+
176
+ var onClick = function onClick(event, node) {
177
+ var isLeaf = node.isLeaf;
178
+
179
+ if (isLeaf || event.shiftKey || event.metaKey || event.ctrlKey) {
180
+ return;
181
+ }
182
+
183
+ treeRef.current.onNodeExpand(event, node);
184
+ };
185
+
186
+ return /*#__PURE__*/React.createElement(Tree, {
187
+ className: "dumi-default-tree",
188
+ icon: getIcon,
189
+ ref: treeRef,
190
+ itemHeight: 20,
191
+ showLine: true,
192
+ selectable: false,
193
+ virtual: false,
194
+ motion: _objectSpread(_objectSpread({}, initCollapseMotion), {}, {
195
+ motionAppear: false
196
+ }),
197
+ onClick: onClick,
198
+ treeData: [{
199
+ key: '0',
200
+ title: props.title || '<root>',
201
+ children: data
202
+ }],
203
+ defaultExpandAll: true,
204
+ switcherIcon: renderSwitcherIcon
205
+ });
206
+ });
@@ -0,0 +1,186 @@
1
+ @import (reference) '../../styles/variables.less';
2
+ @treePrefixCls: ~'rc-tree';
3
+ @treeNodePrefixCls: ~'@{treePrefixCls}-treenode';
4
+
5
+ .@{prefix}-tree {
6
+ @bg-color: tint(@c-site-bg, 50%);
7
+
8
+ padding: 16px;
9
+ margin: 24px 0 32px;
10
+ background: @bg-color;
11
+ border: 1px solid @c-border-light;
12
+ border-radius: 2px;
13
+ color: @c-text;
14
+ overflow-y: auto;
15
+
16
+ @{dark-selector} & {
17
+ @bg-color: shade(@c-site-bg-dark, 50%);
18
+
19
+ color: @c-text-dark;
20
+ background: @bg-color;
21
+ border-color: @c-border-dark;
22
+ }
23
+
24
+ small {
25
+ @small-font-color: @c-text-note-dark;
26
+
27
+ padding-left: 24px;
28
+ color: @c-text-note-dark;
29
+ font-size: 14px;
30
+ white-space: nowrap;
31
+
32
+ @{dark-selector} & {
33
+ color: @c-text-note-dark;
34
+ }
35
+
36
+ &::before {
37
+ content: '# ';
38
+ }
39
+ }
40
+
41
+ &.@{treePrefixCls} {
42
+ transition: all 0.3s;
43
+ line-height: 1.5715;
44
+ list-style: none;
45
+ font-size: 14px;
46
+
47
+ .@{treeNodePrefixCls} {
48
+ position: relative;
49
+ display: flex;
50
+ align-items: flex-start;
51
+
52
+ &::before {
53
+ position: absolute;
54
+ top: 0;
55
+ right: 0;
56
+ bottom: 4px;
57
+ left: 0;
58
+ transition: background 0.3s;
59
+ content: '';
60
+ }
61
+
62
+ &:hover::before {
63
+ background: shade(@bg-color, 5%);
64
+
65
+ @{dark-selector} & {
66
+ @bg-color: shade(@c-site-bg-dark, 50%);
67
+
68
+ background: tint(@bg-color, 10%);
69
+ }
70
+ }
71
+
72
+ > * {
73
+ z-index: 1;
74
+ }
75
+ }
76
+
77
+ @treeNode-size: 28px;
78
+ @border: #d9d9d9;
79
+
80
+ .@{treeNodePrefixCls} span.@{treePrefixCls}-switcher {
81
+ display: flex;
82
+ align-items: center;
83
+ justify-content: center;
84
+ width: 24px;
85
+ height: @treeNode-size;
86
+ margin-right: 2px;
87
+ line-height: @treeNode-size;
88
+ background: transparent;
89
+ cursor: pointer;
90
+ flex-shrink: 0;
91
+ }
92
+
93
+ .@{treeNodePrefixCls} .@{treePrefixCls}-node-content-wrapper {
94
+ flex: auto;
95
+ min-height: @treeNode-size;
96
+ margin: 0;
97
+ padding: 0 4px;
98
+ line-height: @treeNode-size;
99
+ cursor: pointer;
100
+ white-space: nowrap;
101
+ .@{treePrefixCls}-iconEle {
102
+ margin-right: 6px;
103
+ vertical-align: 0;
104
+ }
105
+ }
106
+
107
+ &.@{treePrefixCls}-show-line {
108
+ .@{treePrefixCls}-indent {
109
+ display: inline-block;
110
+ height: 0;
111
+ vertical-align: bottom;
112
+ flex-shrink: 0;
113
+
114
+ &-unit {
115
+ position: relative;
116
+ display: inline-block;
117
+ width: 24px;
118
+ height: @treeNode-size;
119
+
120
+ &::before {
121
+ position: absolute;
122
+ top: 0;
123
+ right: 12px;
124
+ bottom: -4px;
125
+ border-right: 1px solid @border;
126
+ content: '';
127
+ }
128
+
129
+ &-end::before {
130
+ display: none;
131
+ }
132
+ }
133
+ }
134
+
135
+ .tree-switcher-leaf-line {
136
+ position: relative;
137
+ z-index: 1;
138
+ display: inline-block;
139
+ width: 100%;
140
+ height: 100%;
141
+ text-align: center;
142
+
143
+ &::before {
144
+ position: absolute;
145
+ top: 0;
146
+ bottom: -4px;
147
+ margin-left: -1px;
148
+ border-left: 1px solid @border;
149
+ content: ' ';
150
+ }
151
+
152
+ &::after {
153
+ position: absolute;
154
+ top: 0;
155
+ bottom: calc(@treeNode-size / 2);
156
+ width: 12px;
157
+ margin-left: -1px;
158
+ border-bottom: 1px solid @border;
159
+ content: ' ';
160
+ }
161
+ }
162
+
163
+ .@{treeNodePrefixCls}-leaf-last {
164
+ .tree-switcher-leaf-line::before {
165
+ height: calc(@treeNode-size / 2);
166
+ }
167
+ }
168
+ }
169
+ }
170
+
171
+ &-icon {
172
+ width: 16px;
173
+ color: @c-text;
174
+ vertical-align: -0.225em;
175
+ display: inline-block;
176
+
177
+ @{dark-selector} & {
178
+ color: @c-text-dark;
179
+ }
180
+ }
181
+ }
182
+
183
+ .ant-motion-collapse {
184
+ overflow: hidden;
185
+ transition: height 0.2s ease-in-out, opacity 0.2s ease-in-out !important;
186
+ }
@@ -12,13 +12,15 @@
12
12
  inset-inline-end: -15px;
13
13
  transform: none;
14
14
 
15
- [class*='-switch'] + & {
15
+ [class*='-switch'] + &,
16
+ [class*='-select'] + & {
16
17
  inset-inline-end: 0;
17
18
  }
18
19
  }
19
20
  }
20
21
 
21
- [class*='-switch'] + & {
22
+ [class*='-switch'] + &,
23
+ [class*='-select'] + & {
22
24
  margin-inline-start: 15px;
23
25
  margin-inline-end: -15px;
24
26
  padding-inline: 15px;
@@ -1,30 +1,97 @@
1
1
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
2
 
3
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
+
5
+ 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."); }
6
+
7
+ 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
+
9
+ 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; }
10
+
11
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
12
+
13
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
+
15
+ /* eslint-disable @typescript-eslint/no-use-before-define */
16
+ import { ReactComponent as IconDown } from '@ant-design/icons-svg/inline-svg/outlined/down.svg';
3
17
  import { Link, useLocation, useNavData } from 'dumi';
4
18
  import NavbarExtra from 'dumi/theme/slots/NavbarExtra';
5
- import React from 'react';
19
+ import React, { useState } from 'react';
6
20
  import "./index.less";
7
21
 
8
- var Navbar = function Navbar() {
9
- var nav = useNavData();
22
+ var NavbarItem = function NavbarItem(_ref) {
23
+ var data = _ref.data;
10
24
 
11
25
  var _useLocation = useLocation(),
12
26
  pathname = _useLocation.pathname;
13
27
 
14
- return /*#__PURE__*/React.createElement("ul", {
15
- className: "dumi-default-navbar"
16
- }, nav.map(function (item) {
28
+ var _useState = useState(function () {
29
+ var _data$children;
30
+
31
+ return (_data$children = data.children) === null || _data$children === void 0 ? void 0 : _data$children.some(function (item) {
32
+ var activePath = item.activePath || item.link;
33
+ return activePath && pathname.startsWith(activePath);
34
+ });
35
+ }),
36
+ _useState2 = _slicedToArray(_useState, 2),
37
+ isCollapsed = _useState2[0],
38
+ setIsCollapsed = _useState2[1];
39
+
40
+ var CollapsedBtn = data.children && /*#__PURE__*/React.createElement("button", {
41
+ className: "dumi-default-navbar-collapse-btn",
42
+ type: "button",
43
+ onClick: function onClick(e) {
44
+ e.stopPropagation();
45
+ setIsCollapsed(function (v) {
46
+ return !v;
47
+ });
48
+ },
49
+ "data-collapsed": isCollapsed || undefined
50
+ }, /*#__PURE__*/React.createElement(IconDown, null));
51
+ var NestedNav = data.children && /*#__PURE__*/React.createElement("ul", {
52
+ className: "dumi-default-navbar-dropdown",
53
+ "data-collapsed": isCollapsed || undefined
54
+ }, /*#__PURE__*/React.createElement(NavbarContent, {
55
+ data: data.children
56
+ })); // user custom nav has no activePath, so fallback to link
57
+
58
+ var activePath = data.activePath || data.link;
59
+ var extraProps = activePath && pathname.startsWith(activePath) ? {
60
+ className: 'active'
61
+ } : {};
62
+ return data.link ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Link, _extends({
63
+ to: data.link
64
+ }, extraProps), data.title), CollapsedBtn, NestedNav) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", _extends({
65
+ onClick: function onClick(e) {
66
+ e.stopPropagation();
67
+ setIsCollapsed(function (v) {
68
+ return !v;
69
+ });
70
+ }
71
+ }, extraProps), data.title), CollapsedBtn, NestedNav);
72
+ };
73
+
74
+ var NavbarContent = function NavbarContent(_ref2) {
75
+ var data = _ref2.data;
76
+ return /*#__PURE__*/React.createElement(React.Fragment, null, data.map(function (item) {
17
77
  return /*#__PURE__*/React.createElement("li", {
18
- key: item.link
19
- }, /^(\w+:)\/\/|^(mailto|tel):/.test(item.link) ? /*#__PURE__*/React.createElement("a", {
78
+ key: item.activePath
79
+ }, item.link && /^(\w+:)\/\/|^(mailto|tel):/.test(item.link) ? /*#__PURE__*/React.createElement("a", {
20
80
  href: item.link,
21
81
  target: "_blank",
22
82
  rel: "noreferrer"
23
- }, item.title) : /*#__PURE__*/React.createElement(Link, _extends({
24
- to: item.link
25
- }, pathname.startsWith(item.activePath || item.link) ? {
26
- className: 'active'
27
- } : {}), item.title));
83
+ }, item.title) : /*#__PURE__*/React.createElement(NavbarItem, {
84
+ data: item
85
+ }));
86
+ }));
87
+ };
88
+
89
+ var Navbar = function Navbar() {
90
+ var nav = useNavData();
91
+ return /*#__PURE__*/React.createElement("ul", {
92
+ className: "dumi-default-navbar"
93
+ }, /*#__PURE__*/React.createElement(NavbarContent, {
94
+ data: nav
28
95
  }), /*#__PURE__*/React.createElement(NavbarExtra, null));
29
96
  };
30
97
 
@@ -13,14 +13,21 @@
13
13
  }
14
14
 
15
15
  > li {
16
+ color: @c-text-secondary;
16
17
  font-size: 18px;
17
18
  line-height: 1;
18
19
  text-align: center;
20
+ position: relative;
21
+
22
+ @{dark-selector} & {
23
+ color: @c-text-secondary-dark;
24
+ }
19
25
 
20
26
  @media @mobile {
21
27
  padding: 12px 0;
22
28
  }
23
29
 
30
+ > .@{prefix}-navbar-dropdown > li > a,
24
31
  > a {
25
32
  color: @c-text-secondary;
26
33
  text-decoration: none;
@@ -37,17 +44,134 @@
37
44
  color: @c-primary-dark;
38
45
  }
39
46
  }
47
+ }
48
+
49
+ > a.active,
50
+ > span.active,
51
+ > .@{prefix}-navbar-dropdown > li > a.active {
52
+ color: @c-text;
53
+ font-weight: bold;
54
+
55
+ @{dark-selector} & {
56
+ color: @c-text-dark;
57
+ }
58
+ }
59
+
60
+ > .@{prefix}-navbar-collapse-btn {
61
+ appearance: none;
62
+ margin-left: 6px;
63
+ margin-right: -24px;
64
+ width: 18px;
65
+ height: 18px;
66
+ padding: 0;
67
+ border: 0;
68
+ background: transparent;
69
+ vertical-align: middle;
70
+
71
+ > svg {
72
+ fill: @c-text-note;
73
+ width: 14px;
74
+ transition: transform 0.3s;
75
+
76
+ @{dark-selector} & {
77
+ fill: @c-text-note-dark;
78
+ }
79
+ }
80
+
81
+ &[data-collapsed] > svg {
82
+ transform: rotate(180deg);
83
+ }
84
+
85
+ @media @desktop {
86
+ margin-left: 4px;
87
+ margin-right: 0;
88
+ pointer-events: none;
89
+
90
+ > svg {
91
+ width: 12px;
92
+ transition-delay: 0.1s;
93
+ }
94
+ }
95
+ }
96
+
97
+ &:hover > .@{prefix}-navbar-collapse-btn > svg {
98
+ transform: rotate(180deg);
99
+ transition-delay: 0;
100
+ }
101
+
102
+ > .@{prefix}-navbar-dropdown {
103
+ position: absolute;
104
+ top: 100%;
105
+ left: -18px;
106
+ min-width: calc(100% + 16px);
107
+ list-style: none;
108
+ padding: 0;
109
+ margin: 6px 0 0;
110
+ background-color: #fff;
111
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 10%);
112
+ border-radius: 6px;
113
+ transition: all 0.2s ease-in-out;
114
+
115
+ @{dark-selector} & {
116
+ background-color: lighten(@c-site-bg-dark, 6%);
117
+ }
118
+
119
+ > li {
120
+ > a {
121
+ display: block;
122
+ padding: 0 18px;
123
+ color: @c-text-secondary;
124
+ font-size: 15px;
125
+ line-height: 1.5;
126
+ text-align: left;
127
+
128
+ @media @mobile {
129
+ display: inline;
130
+ }
131
+
132
+ &:hover {
133
+ color: @c-primary;
134
+ }
135
+ }
136
+
137
+ &:first-child > a {
138
+ padding-top: 8px;
139
+ }
140
+
141
+ &:last-child > a {
142
+ padding-bottom: 8px;
143
+ }
144
+ }
40
145
 
41
- &.active {
42
- color: @c-text;
43
- font-weight: bold;
146
+ @media @mobile {
147
+ position: static;
148
+ background: transparent;
149
+ box-shadow: none;
150
+ min-width: 0;
44
151
 
45
152
  @{dark-selector} & {
46
- color: @c-text-dark;
153
+ background: transparent;
154
+ }
155
+
156
+ &:not([data-collapsed]) {
157
+ display: none;
47
158
  }
48
159
  }
49
160
  }
50
161
 
162
+ &:not(:hover) > .@{prefix}-navbar-dropdown {
163
+ visibility: hidden;
164
+ opacity: 0;
165
+ transform: translateY(-6px) scale(0.98);
166
+ transition-delay: 0.1s;
167
+
168
+ @media @mobile {
169
+ visibility: visible;
170
+ opacity: 1;
171
+ transform: none;
172
+ }
173
+ }
174
+
51
175
  &:not(:last-child) {
52
176
  margin-inline-end: 48px;
53
177
 
@@ -7,7 +7,8 @@
7
7
  background-color: transparent;
8
8
  cursor: pointer;
9
9
 
10
- [class*='-switch'] + & {
10
+ [class*='-switch'] + &,
11
+ [class*='-select'] + & {
11
12
  margin-inline-start: 15px;
12
13
  margin-inline-end: -15px;
13
14
  padding-inline: 15px;
@@ -4,7 +4,8 @@
4
4
  font-size: 0;
5
5
  line-height: 0;
6
6
 
7
- [class*='-switch'] + & {
7
+ [class*='-switch'] + &,
8
+ [class*='-select'] + & {
8
9
  margin-inline-start: 15px;
9
10
  margin-inline-end: -15px;
10
11
  padding-inline: 15px;