dumi 2.2.0-rc.1 → 2.2.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.
- package/dist/client/theme-api/context.d.ts +4 -0
- package/dist/client/theme-api/context.js +2 -1
- package/dist/client/theme-api/types.d.ts +3 -3
- package/dist/client/theme-api/useNavData.js +13 -12
- package/dist/client/theme-api/useSidebarData.js +30 -17
- package/dist/client/theme-api/utils.d.ts +1 -1
- package/dist/client/theme-api/utils.js +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +5 -2
- package/dist/features/theme/index.js +15 -0
- package/package.json +1 -1
- package/theme-default/slots/Navbar/index.less +5 -3
|
@@ -16,6 +16,10 @@ interface ISiteContext {
|
|
|
16
16
|
themeConfig: IThemeConfig;
|
|
17
17
|
loading: boolean;
|
|
18
18
|
setLoading: (status: boolean) => void;
|
|
19
|
+
/**
|
|
20
|
+
* private field, do not use it in your code
|
|
21
|
+
*/
|
|
22
|
+
_2_level_nav_available: boolean;
|
|
19
23
|
}
|
|
20
24
|
export declare const SiteContext: import("react").Context<ISiteContext>;
|
|
21
25
|
export declare const useSiteData: () => ISiteContext;
|
|
@@ -8,7 +8,8 @@ export var SiteContext = /*#__PURE__*/createContext({
|
|
|
8
8
|
locales: [],
|
|
9
9
|
themeConfig: {},
|
|
10
10
|
loading: false,
|
|
11
|
-
setLoading: function setLoading() {}
|
|
11
|
+
setLoading: function setLoading() {},
|
|
12
|
+
_2_level_nav_available: true
|
|
12
13
|
});
|
|
13
14
|
export var useSiteData = function useSiteData() {
|
|
14
15
|
return useContext(SiteContext);
|
|
@@ -59,7 +59,7 @@ export interface IRouteMeta {
|
|
|
59
59
|
nav?: string | {
|
|
60
60
|
title?: string;
|
|
61
61
|
order?: number;
|
|
62
|
-
|
|
62
|
+
second?: Omit<IRouteMeta['frontmatter']['nav'], 'second'>;
|
|
63
63
|
};
|
|
64
64
|
group?: string | {
|
|
65
65
|
title?: string;
|
|
@@ -103,7 +103,7 @@ export interface IRouteMeta {
|
|
|
103
103
|
depth: number;
|
|
104
104
|
title: string;
|
|
105
105
|
/**
|
|
106
|
-
* private field,
|
|
106
|
+
* private field, do not use it in your code
|
|
107
107
|
*/
|
|
108
108
|
_debug_demo?: boolean;
|
|
109
109
|
}[];
|
|
@@ -136,7 +136,7 @@ export interface IRouteMeta {
|
|
|
136
136
|
};
|
|
137
137
|
}[];
|
|
138
138
|
/**
|
|
139
|
-
* private field,
|
|
139
|
+
* private field, do not use it in your code
|
|
140
140
|
*/
|
|
141
141
|
_atom_route?: boolean;
|
|
142
142
|
}
|
|
@@ -47,7 +47,8 @@ export var useNavData = function useNavData() {
|
|
|
47
47
|
var routes = useLocaleDocRoutes();
|
|
48
48
|
|
|
49
49
|
var _useSiteData = useSiteData(),
|
|
50
|
-
themeConfig = _useSiteData.themeConfig
|
|
50
|
+
themeConfig = _useSiteData.themeConfig,
|
|
51
|
+
is2LevelNav = _useSiteData._2_level_nav_available;
|
|
51
52
|
|
|
52
53
|
var sidebar = useFullSidebarData();
|
|
53
54
|
var sidebarDataComparer = useRouteDataComparer();
|
|
@@ -91,36 +92,36 @@ export var useNavData = function useNavData() {
|
|
|
91
92
|
parentPath = _ref8[1],
|
|
92
93
|
restPath = _ref8[2];
|
|
93
94
|
|
|
94
|
-
var isNestedNav = Boolean(restPath);
|
|
95
|
+
var isNestedNav = Boolean(restPath) && is2LevelNav;
|
|
95
96
|
|
|
96
97
|
var _Object$values$reduce = Object.values(routes).reduce(function (ret, route) {
|
|
97
98
|
// find routes which within the nav path
|
|
98
99
|
if (route.path.startsWith(link.slice(1))) {
|
|
99
100
|
pickRouteSortMeta(ret[0], 'nav', route.meta.frontmatter); // generate parent meta for nested nav
|
|
100
101
|
|
|
101
|
-
if (isNestedNav) pickRouteSortMeta(ret[1], 'nav.
|
|
102
|
+
if (isNestedNav) pickRouteSortMeta(ret[1], 'nav.second', route.meta.frontmatter);
|
|
102
103
|
}
|
|
103
104
|
|
|
104
105
|
return ret;
|
|
105
106
|
}, [{}, {}]),
|
|
106
107
|
_Object$values$reduce2 = _slicedToArray(_Object$values$reduce, 2),
|
|
107
|
-
|
|
108
|
-
|
|
108
|
+
firstMeta = _Object$values$reduce2[0],
|
|
109
|
+
secondMeta = _Object$values$reduce2[1];
|
|
109
110
|
|
|
110
111
|
if (isNestedNav) {
|
|
111
|
-
var
|
|
112
|
+
var _firstMeta$title, _ret$parentPath, _second$children;
|
|
112
113
|
|
|
113
|
-
// fallback to use parent path as title
|
|
114
|
-
(
|
|
114
|
+
// fallback to use parent path as 1-level nav title
|
|
115
|
+
(_firstMeta$title = firstMeta.title) !== null && _firstMeta$title !== void 0 ? _firstMeta$title : firstMeta.title = parentPath.slice(1).replace(/^[a-z]/, function (s) {
|
|
115
116
|
return s.toUpperCase();
|
|
116
117
|
}); // handle nested nav item as parent children
|
|
117
118
|
|
|
118
|
-
var
|
|
119
|
-
(
|
|
120
|
-
ret[parentPath].children.push(genNavItem(
|
|
119
|
+
var second = (_ret$parentPath = ret[parentPath]) !== null && _ret$parentPath !== void 0 ? _ret$parentPath : ret[parentPath] = genNavItem(firstMeta, groups, parentPath);
|
|
120
|
+
(_second$children = second.children) !== null && _second$children !== void 0 ? _second$children : second.children = [];
|
|
121
|
+
ret[parentPath].children.push(genNavItem(secondMeta, groups, link, groups[0].children[0].link));
|
|
121
122
|
} else {
|
|
122
123
|
// handle root nav item
|
|
123
|
-
ret[link] = genNavItem(
|
|
124
|
+
ret[link] = genNavItem(firstMeta, groups, link, groups[0].children[0].link);
|
|
124
125
|
}
|
|
125
126
|
|
|
126
127
|
return ret;
|
|
@@ -39,15 +39,18 @@ var getLocaleClearPath = function getLocaleClearPath(routePath, locale) {
|
|
|
39
39
|
*/
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
function getRouteParentPath(path,
|
|
42
|
+
function getRouteParentPath(path, _ref) {
|
|
43
43
|
var _meta$frontmatter$fil;
|
|
44
44
|
|
|
45
|
-
var
|
|
46
|
-
|
|
45
|
+
var meta = _ref.meta,
|
|
46
|
+
is2LevelNav = _ref.is2LevelNav;
|
|
47
|
+
var isIndexDocRoute = ((_meta$frontmatter$fil = meta.frontmatter.filename) === null || _meta$frontmatter$fil === void 0 ? void 0 : _meta$frontmatter$fil.endsWith('index.md')) && !meta._atom_route && is2LevelNav;
|
|
48
|
+
var paths = path.split('/') // strip end slash
|
|
49
|
+
.filter(Boolean);
|
|
47
50
|
var sliceEnd = Math.min(Math.max( // increase 1 level if route file is index.md
|
|
48
|
-
|
|
49
|
-
1), // up to 2-level
|
|
50
|
-
2);
|
|
51
|
+
isIndexDocRoute ? paths.length : paths.length - 1, // least 1-level
|
|
52
|
+
1), // up to 2-level when use conventional 2-level nav
|
|
53
|
+
is2LevelNav ? 2 : Infinity);
|
|
51
54
|
return paths.slice(0, sliceEnd).join('/');
|
|
52
55
|
}
|
|
53
56
|
/**
|
|
@@ -60,7 +63,8 @@ export var useFullSidebarData = function useFullSidebarData() {
|
|
|
60
63
|
var routes = useLocaleDocRoutes();
|
|
61
64
|
|
|
62
65
|
var _useSiteData = useSiteData(),
|
|
63
|
-
themeConfig = _useSiteData.themeConfig
|
|
66
|
+
themeConfig = _useSiteData.themeConfig,
|
|
67
|
+
is2LevelNav = _useSiteData._2_level_nav_available;
|
|
64
68
|
|
|
65
69
|
var sidebarDataComparer = useRouteDataComparer();
|
|
66
70
|
|
|
@@ -82,7 +86,10 @@ export var useFullSidebarData = function useFullSidebarData() {
|
|
|
82
86
|
// a/b => /a/b (if route file is a/b/index.md)
|
|
83
87
|
// a/b/c => /a/b
|
|
84
88
|
var parentPath = "/".concat(route.path.replace(clearPath, function (s) {
|
|
85
|
-
return getRouteParentPath(s,
|
|
89
|
+
return getRouteParentPath(s, {
|
|
90
|
+
is2LevelNav: is2LevelNav,
|
|
91
|
+
meta: route.meta
|
|
92
|
+
});
|
|
86
93
|
}));
|
|
87
94
|
|
|
88
95
|
var _pickRouteSortMeta = pickRouteSortMeta({
|
|
@@ -109,10 +116,10 @@ export var useFullSidebarData = function useFullSidebarData() {
|
|
|
109
116
|
return ret;
|
|
110
117
|
}, {}); // destruct sidebar data into sidebar config
|
|
111
118
|
|
|
112
|
-
var sidebarConfig = Object.entries(data).reduce(function (ret,
|
|
113
|
-
var
|
|
114
|
-
navPath =
|
|
115
|
-
groups =
|
|
119
|
+
var sidebarConfig = Object.entries(data).reduce(function (ret, _ref2) {
|
|
120
|
+
var _ref3 = _slicedToArray(_ref2, 2),
|
|
121
|
+
navPath = _ref3[0],
|
|
122
|
+
groups = _ref3[1];
|
|
116
123
|
|
|
117
124
|
ret[navPath] = Object.values(groups).sort(sidebarDataComparer); // sort group children by order or title
|
|
118
125
|
|
|
@@ -181,10 +188,10 @@ export var useTreeSidebarData = function useTreeSidebarData() {
|
|
|
181
188
|
var data = Object.entries(original) // match from the deepest level
|
|
182
189
|
.sort(function (a, b) {
|
|
183
190
|
return b[0].split('/').length - a[0].split('/').length;
|
|
184
|
-
}).reduce(function (ret,
|
|
185
|
-
var
|
|
186
|
-
path =
|
|
187
|
-
data =
|
|
191
|
+
}).reduce(function (ret, _ref4) {
|
|
192
|
+
var _ref5 = _slicedToArray(_ref4, 2),
|
|
193
|
+
path = _ref5[0],
|
|
194
|
+
data = _ref5[1];
|
|
188
195
|
|
|
189
196
|
var parent = path.replace(/\/[^/]+$/, '');
|
|
190
197
|
|
|
@@ -237,6 +244,9 @@ export var useSidebarData = function useSidebarData() {
|
|
|
237
244
|
var locale = useLocale();
|
|
238
245
|
var sidebar = useFullSidebarData();
|
|
239
246
|
|
|
247
|
+
var _useSiteData2 = useSiteData(),
|
|
248
|
+
is2LevelNav = _useSiteData2._2_level_nav_available;
|
|
249
|
+
|
|
240
250
|
var _useLocation = useLocation(),
|
|
241
251
|
pathname = _useLocation.pathname;
|
|
242
252
|
|
|
@@ -249,7 +259,10 @@ export var useSidebarData = function useSidebarData() {
|
|
|
249
259
|
// /en-US/a/b/ => /en-US/a (also strip trailing /)
|
|
250
260
|
|
|
251
261
|
var parentPath = clearPath ? pathname.replace(clearPath, function (s) {
|
|
252
|
-
return getRouteParentPath(s,
|
|
262
|
+
return getRouteParentPath(s, {
|
|
263
|
+
is2LevelNav: is2LevelNav,
|
|
264
|
+
meta: meta
|
|
265
|
+
});
|
|
253
266
|
}) : pathname;
|
|
254
267
|
return parentPath ? sidebar[parentPath] : [];
|
|
255
268
|
};
|
|
@@ -20,5 +20,5 @@ export declare const useRouteDataComparer: <T extends {
|
|
|
20
20
|
/**
|
|
21
21
|
* common util for pick meta to sort sidebar/nav items
|
|
22
22
|
*/
|
|
23
|
-
export declare const pickRouteSortMeta: (original: Partial<Pick<INavItem, 'order' | 'title'>>, field: 'nav' | 'nav.
|
|
23
|
+
export declare const pickRouteSortMeta: (original: Partial<Pick<INavItem, 'order' | 'title'>>, field: 'nav' | 'nav.second' | 'group', fm: IRouteMeta['frontmatter']) => Partial<Pick<INavItem, "title" | "order">>;
|
|
24
24
|
export declare function getLocaleNav(nav: IUserNavValue | INav, locale: ILocale): import("./types").IUserNavItems;
|
|
@@ -83,7 +83,7 @@ export var useRouteDataComparer = function useRouteDataComparer() {
|
|
|
83
83
|
export var pickRouteSortMeta = function pickRouteSortMeta(original, field, fm) {
|
|
84
84
|
var _sub$order;
|
|
85
85
|
|
|
86
|
-
var sub = field === 'nav.
|
|
86
|
+
var sub = field === 'nav.second' ? _typeof(fm.nav) === 'object' ? fm.nav.second : {} : fm[field];
|
|
87
87
|
|
|
88
88
|
switch (_typeof(sub)) {
|
|
89
89
|
case 'object':
|
package/dist/constants.d.ts
CHANGED
package/dist/constants.js
CHANGED
|
@@ -27,7 +27,8 @@ __export(constants_exports, {
|
|
|
27
27
|
PREFERS_COLOR_LS_KEY: () => PREFERS_COLOR_LS_KEY,
|
|
28
28
|
SP_ROUTE_PREFIX: () => SP_ROUTE_PREFIX,
|
|
29
29
|
THEME_PREFIX: () => THEME_PREFIX,
|
|
30
|
-
USELESS_TMP_FILES: () => USELESS_TMP_FILES
|
|
30
|
+
USELESS_TMP_FILES: () => USELESS_TMP_FILES,
|
|
31
|
+
VERSION_2_LEVEL_NAV: () => VERSION_2_LEVEL_NAV
|
|
31
32
|
});
|
|
32
33
|
module.exports = __toCommonJS(constants_exports);
|
|
33
34
|
var LOCAL_DUMI_DIR = ".dumi";
|
|
@@ -47,6 +48,7 @@ var PICKED_PKG_FIELDS = {
|
|
|
47
48
|
authors: ""
|
|
48
49
|
};
|
|
49
50
|
var USELESS_TMP_FILES = ["tsconfig.json", "typings.d.ts"];
|
|
51
|
+
var VERSION_2_LEVEL_NAV = "^2.2.0";
|
|
50
52
|
// Annotate the CommonJS export names for ESM import in node:
|
|
51
53
|
0 && (module.exports = {
|
|
52
54
|
LOCAL_DUMI_DIR,
|
|
@@ -57,5 +59,6 @@ var USELESS_TMP_FILES = ["tsconfig.json", "typings.d.ts"];
|
|
|
57
59
|
PREFERS_COLOR_LS_KEY,
|
|
58
60
|
SP_ROUTE_PREFIX,
|
|
59
61
|
THEME_PREFIX,
|
|
60
|
-
USELESS_TMP_FILES
|
|
62
|
+
USELESS_TMP_FILES,
|
|
63
|
+
VERSION_2_LEVEL_NAV
|
|
61
64
|
});
|
|
@@ -51,6 +51,13 @@ function getModuleExports(modulePath) {
|
|
|
51
51
|
content: import_fs.default.readFileSync(modulePath, "utf-8")
|
|
52
52
|
})[1];
|
|
53
53
|
}
|
|
54
|
+
function checkMinor2ByPkg(pkg) {
|
|
55
|
+
var _a, _b, _c;
|
|
56
|
+
if ((_a = pkg.name) == null ? void 0 : _a.startsWith("@examples/"))
|
|
57
|
+
return true;
|
|
58
|
+
const ver = ((_b = pkg.peerDependencies) == null ? void 0 : _b.dumi) || ((_c = pkg.devDependencies) == null ? void 0 : _c.dumi) || "^2.0.0";
|
|
59
|
+
return import_plugin_utils.semver.subset(ver, import_constants.VERSION_2_LEVEL_NAV);
|
|
60
|
+
}
|
|
54
61
|
var theme_default = (api) => {
|
|
55
62
|
const defaultThemeData = (0, import_loader.default)(DEFAULT_THEME_PATH);
|
|
56
63
|
const pkgThemePath = getPkgThemePath(api);
|
|
@@ -105,6 +112,13 @@ var theme_default = (api) => {
|
|
|
105
112
|
return memo;
|
|
106
113
|
}
|
|
107
114
|
});
|
|
115
|
+
api.modifyAppData((memo) => {
|
|
116
|
+
memo._2LevelNavAvailable = checkMinor2ByPkg(api.pkg);
|
|
117
|
+
if (pkgThemePath && !memo._2LevelNavAvailable) {
|
|
118
|
+
memo._2LevelNavAvailable = checkMinor2ByPkg(require(import_path.default.join(pkgThemePath, "package.json")));
|
|
119
|
+
}
|
|
120
|
+
return memo;
|
|
121
|
+
});
|
|
108
122
|
api.modifyConfig((memo) => {
|
|
109
123
|
if (localThemeData) {
|
|
110
124
|
themeMapKeys.forEach((key) => {
|
|
@@ -215,6 +229,7 @@ export default function DumiContextWrapper() {
|
|
|
215
229
|
loading,
|
|
216
230
|
setLoading,
|
|
217
231
|
themeConfig: ${JSON.stringify(Object.assign(import_plugin_utils.lodash.pick(api.config, "logo", "description", "title"), api.config.themeConfig))},
|
|
232
|
+
_2_level_nav_available: ${api.appData._2LevelNavAvailable},
|
|
218
233
|
}}>
|
|
219
234
|
{outlet}
|
|
220
235
|
</SiteContext.Provider>
|
package/package.json
CHANGED
|
@@ -78,8 +78,10 @@
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
@media @mobile {
|
|
82
|
+
&[data-collapsed] > svg {
|
|
83
|
+
transform: rotate(180deg);
|
|
84
|
+
}
|
|
83
85
|
}
|
|
84
86
|
|
|
85
87
|
@media @desktop {
|
|
@@ -122,7 +124,7 @@
|
|
|
122
124
|
padding: 0 18px;
|
|
123
125
|
color: @c-text-secondary;
|
|
124
126
|
font-size: 15px;
|
|
125
|
-
line-height: 1.
|
|
127
|
+
line-height: 1.6;
|
|
126
128
|
text-align: left;
|
|
127
129
|
|
|
128
130
|
@media @mobile {
|