dumi 2.0.0-rc.2 → 2.0.0-rc.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.
Files changed (43) hide show
  1. package/dist/assetParsers/block.js +5 -1
  2. package/dist/client/pages/404.js +1 -1
  3. package/dist/client/theme-api/DumiDemo.js +1 -1
  4. package/dist/client/theme-api/DumiPage.js +1 -1
  5. package/dist/features/assets.d.ts +4 -0
  6. package/dist/features/assets.js +7 -2
  7. package/dist/features/compile/babelLoaderCustomize.d.ts +4 -0
  8. package/dist/features/compile/babelLoaderCustomize.js +37 -0
  9. package/dist/features/compile/index.d.ts +3 -0
  10. package/dist/features/{compile.js → compile/index.js} +17 -8
  11. package/dist/features/derivative.js +27 -12
  12. package/dist/features/{compile.d.ts → exportStatic.d.ts} +0 -0
  13. package/dist/features/exportStatic.js +48 -0
  14. package/dist/features/theme/index.js +4 -0
  15. package/dist/loaders/markdown/index.js +1 -1
  16. package/dist/loaders/markdown/transformer/index.d.ts +2 -0
  17. package/dist/loaders/markdown/transformer/index.js +5 -1
  18. package/dist/loaders/markdown/transformer/rehypeLink.d.ts +6 -0
  19. package/dist/loaders/markdown/transformer/rehypeLink.js +68 -0
  20. package/dist/preset.js +2 -1
  21. package/package.json +7 -7
  22. package/theme-default/builtins/Previewer/index.js +1 -1
  23. package/theme-default/layouts/DocLayout/index.js +47 -11
  24. package/theme-default/layouts/DocLayout/index.less +58 -0
  25. package/theme-default/locales/en-US.json +2 -1
  26. package/theme-default/locales/zh-CN.json +2 -1
  27. package/theme-default/slots/Content/index.less +14 -1
  28. package/theme-default/slots/ContentTabs/index.less +14 -0
  29. package/theme-default/slots/Features/index.less +23 -1
  30. package/theme-default/slots/Footer/index.less +5 -0
  31. package/theme-default/slots/Header/index.js +39 -7
  32. package/theme-default/slots/Header/index.less +50 -0
  33. package/theme-default/slots/Hero/index.js +1 -1
  34. package/theme-default/slots/Hero/index.less +17 -0
  35. package/theme-default/slots/HeroTitle/index.less +4 -0
  36. package/theme-default/slots/Logo/index.less +12 -0
  37. package/theme-default/slots/Navbar/index.js +5 -1
  38. package/theme-default/slots/Navbar/index.less +14 -0
  39. package/theme-default/slots/PreviewerActions/index.js +2 -2
  40. package/theme-default/slots/SearchBar/index.less +9 -0
  41. package/theme-default/slots/Sidebar/index.js +1 -1
  42. package/theme-default/slots/Sidebar/index.less +20 -0
  43. package/theme-default/styles/variables.less +4 -0
@@ -43,7 +43,7 @@ async function parseBlockAsset(opts) {
43
43
  sources: {},
44
44
  frontmatter: null
45
45
  };
46
- await (0, import_esbuild.build)({
46
+ const deferrer = (0, import_esbuild.build)({
47
47
  write: false,
48
48
  bundle: true,
49
49
  logLevel: "silent",
@@ -116,6 +116,10 @@ async function parseBlockAsset(opts) {
116
116
  }
117
117
  ]
118
118
  });
119
+ try {
120
+ await deferrer;
121
+ } catch {
122
+ }
119
123
  return result;
120
124
  }
121
125
  var block_default = parseBlockAsset;
@@ -1,2 +1,2 @@
1
1
  // allow customize 404 via theme slots
2
- export { default } from 'dumi/theme/slots/NotFound';
2
+ export { default } from "dumi/theme/slots/NotFound";
@@ -2,7 +2,7 @@ function _extends() { _extends = Object.assign ? Object.assign.bind() : function
2
2
 
3
3
  import { SP_ROUTE_PREFIX } from "../../constants";
4
4
  import { useSiteData } from 'dumi';
5
- import Previewer from 'dumi/theme/builtins/Previewer';
5
+ import Previewer from "dumi/theme/builtins/Previewer";
6
6
  import React, { createElement } from 'react';
7
7
  export var DumiDemo = function DumiDemo(props) {
8
8
  var _useSiteData = useSiteData(),
@@ -11,7 +11,7 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
11
11
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
12
12
 
13
13
  import { useLocation, useRouteMeta, useSiteData } from 'dumi';
14
- import ContentTabs from 'dumi/theme/slots/ContentTabs';
14
+ import ContentTabs from "dumi/theme/slots/ContentTabs";
15
15
  import React, { useEffect, useState } from 'react';
16
16
  import { useTabQueryState } from "./useTabMeta";
17
17
  export var DumiPage = function DumiPage(props) {
@@ -5,6 +5,10 @@ declare const examples: ExampleAsset[];
5
5
  * internal function to add example assets
6
6
  */
7
7
  export declare function addExampleAssets(data: typeof examples): void;
8
+ /**
9
+ * internal function to get atom assets
10
+ */
11
+ export declare function getExampleAssets(): ExampleAsset[];
8
12
  /**
9
13
  * internal function to add meta for atom
10
14
  */
@@ -24,7 +24,8 @@ var assets_exports = {};
24
24
  __export(assets_exports, {
25
25
  addAtomMeta: () => addAtomMeta,
26
26
  addExampleAssets: () => addExampleAssets,
27
- default: () => assets_default
27
+ default: () => assets_default,
28
+ getExampleAssets: () => getExampleAssets
28
29
  });
29
30
  module.exports = __toCommonJS(assets_exports);
30
31
  var import_fs = __toESM(require("fs"));
@@ -35,6 +36,9 @@ var atomsMeta = {};
35
36
  function addExampleAssets(data) {
36
37
  examples.push(...data);
37
38
  }
39
+ function getExampleAssets() {
40
+ return examples;
41
+ }
38
42
  function addAtomMeta(atomId, data) {
39
43
  atomsMeta[atomId] = import_plugin_utils.lodash.pick(data, ["title", "keywords", "deprecated"]);
40
44
  }
@@ -69,5 +73,6 @@ var assets_default = (api) => {
69
73
  // Annotate the CommonJS export names for ESM import in node:
70
74
  0 && (module.exports = {
71
75
  addAtomMeta,
72
- addExampleAssets
76
+ addExampleAssets,
77
+ getExampleAssets
73
78
  });
@@ -0,0 +1,4 @@
1
+ import type { PartialConfig } from '@umijs/bundler-utils/compiled/@babel/core';
2
+ export default function babelLoaderCustomize(): {
3
+ config(config: PartialConfig): import("@umijs/bundler-utils/compiled/@babel/core").TransformOptions;
4
+ };
@@ -0,0 +1,37 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/features/compile/babelLoaderCustomize.ts
20
+ var babelLoaderCustomize_exports = {};
21
+ __export(babelLoaderCustomize_exports, {
22
+ default: () => babelLoaderCustomize
23
+ });
24
+ module.exports = __toCommonJS(babelLoaderCustomize_exports);
25
+ function babelLoaderCustomize() {
26
+ return {
27
+ config(config) {
28
+ const context = this;
29
+ if (config.options.filename && context.resourceQuery.includes("type=meta")) {
30
+ config.options.filename += context.resourceQuery;
31
+ }
32
+ return config.options;
33
+ }
34
+ };
35
+ }
36
+ // Annotate the CommonJS export names for ESM import in node:
37
+ 0 && (module.exports = {});
@@ -0,0 +1,3 @@
1
+ import type { IApi } from "../../types";
2
+ declare const _default: (api: IApi) => void;
3
+ export default _default;
@@ -19,34 +19,43 @@ var __copyProps = (to, from, except, desc) => {
19
19
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
20
20
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
21
 
22
- // src/features/compile.ts
22
+ // src/features/compile/index.ts
23
23
  var compile_exports = {};
24
24
  __export(compile_exports, {
25
25
  default: () => compile_default
26
26
  });
27
27
  module.exports = __toCommonJS(compile_exports);
28
- var import_react = __toESM(require("../techStacks/react"));
29
- var import_assets = require("./assets");
28
+ var import_react = __toESM(require("../../techStacks/react"));
29
+ var import_assets = require("../assets");
30
30
  var compile_default = (api) => {
31
+ api.describe({ key: "dumi:compile" });
31
32
  api.register({
32
33
  key: "registerTechStack",
33
34
  stage: Infinity,
34
35
  fn: () => new import_react.default()
35
36
  });
37
+ api.modifyConfig((memo) => {
38
+ if (memo.babelLoaderCustomize) {
39
+ api.logger.warn("Config `babelLoaderCustomize` will be override by dumi, please report issue if you need it.");
40
+ }
41
+ memo.babelLoaderCustomize = require.resolve("./babelLoaderCustomize");
42
+ return memo;
43
+ });
36
44
  api.chainWebpack(async (memo) => {
37
45
  const babelInUmi = memo.module.rule("src").use("babel-loader").entries();
38
46
  const techStacks = await api.applyPlugins({
39
47
  key: "registerTechStack",
40
48
  type: api.ApplyPluginsType.add
41
49
  });
42
- const loaderPath = require.resolve("../loaders/markdown");
50
+ const loaderPath = require.resolve("../../loaders/markdown");
43
51
  const loaderBaseOpts = {
44
52
  techStacks,
45
53
  cwd: api.cwd,
46
54
  alias: api.config.alias,
47
55
  resolve: api.config.resolve,
48
56
  extraRemarkPlugins: api.config.extraRemarkPlugins,
49
- extraRehypePlugins: api.config.extraRehypePlugins
57
+ extraRehypePlugins: api.config.extraRehypePlugins,
58
+ routers: api.appData.routes
50
59
  };
51
60
  memo.module.rule("dumi-md").type("javascript/auto").test(/\.md$/).oneOf("md-meta").resourceQuery(/meta$/).use("babel-loader").loader(babelInUmi.loader).options(babelInUmi.options).end().use("md-meta-loader").loader(loaderPath).options({
52
61
  ...loaderBaseOpts,
@@ -64,9 +73,9 @@ var compile_default = (api) => {
64
73
  ...loaderBaseOpts,
65
74
  builtins: api.service.themeData.builtins
66
75
  });
67
- memo.module.rule("dumi-page").type("javascript/auto").test(/\.(j|t)sx?$/).resourceQuery(/meta$/).use("page-meta-loader").loader(require.resolve("../loaders/page"));
68
- memo.module.rule("dumi-demo").type("javascript/auto").test(/\..+$/).enforce("pre").resourceQuery(/techStack/).use("demo-loader").loader(require.resolve("../loaders/demo")).options({ techStacks, cwd: api.cwd });
69
- memo.module.rule("dumi-raw").resourceQuery(/raw/).use("raw-loader").loader(require.resolve("raw-loader"));
76
+ memo.module.rule("dumi-page").type("javascript/auto").test(/\.(j|t)sx?$/).resourceQuery(/meta$/).use("page-meta-loader").loader(require.resolve("../../loaders/page"));
77
+ memo.module.rule("dumi-demo").type("javascript/auto").test(/\..+$/).enforce("pre").resourceQuery(/techStack/).use("demo-loader").loader(require.resolve("../../loaders/demo")).options({ techStacks, cwd: api.cwd });
78
+ memo.module.rule("dumi-raw").post().resourceQuery(/dumi-raw/).use("raw-loader").loader(require.resolve("raw-loader"));
70
79
  if (api.env === "development" && memo.plugins.has("fastRefresh")) {
71
80
  memo.plugin("fastRefresh").tap(([params]) => [
72
81
  {
@@ -27,6 +27,7 @@ __export(derivative_exports, {
27
27
  });
28
28
  module.exports = __toCommonJS(derivative_exports);
29
29
  var import_constants = require("../constants");
30
+ var import_bundler_utils = require("@umijs/bundler-utils");
30
31
  var import_assert = __toESM(require("assert"));
31
32
  var import_fs = __toESM(require("fs"));
32
33
  var import_path = __toESM(require("path"));
@@ -50,7 +51,20 @@ function getFilesByGlob(globExp, dir) {
50
51
  var derivative_default = (api) => {
51
52
  const dumiAbsDir = import_path.default.join(api.cwd, import_constants.LOCAL_DUMI_DIR);
52
53
  const strategies = {
53
- appJS: getFilesByGlob.bind(null, "app.{js,jsx,ts,tsx}", dumiAbsDir),
54
+ async appJS() {
55
+ const [appJS] = getFilesByGlob("app.{js,jsx,ts,tsx}", dumiAbsDir);
56
+ if (appJS) {
57
+ const [, exports] = await (0, import_bundler_utils.parseModule)({
58
+ path: appJS,
59
+ content: import_fs.default.readFileSync(appJS, "utf-8")
60
+ });
61
+ return {
62
+ path: appJS,
63
+ exports
64
+ };
65
+ }
66
+ return null;
67
+ },
54
68
  globalCSS: getFilesByGlob.bind(null, "global.{css,less,scss,sass}", dumiAbsDir),
55
69
  globalJS: getFilesByGlob.bind(null, "global.{js,jsx,ts,tsx}", dumiAbsDir),
56
70
  overridesCSS: getFilesByGlob.bind(null, "overrides.{css,less,scss,sass}", dumiAbsDir)
@@ -89,19 +103,20 @@ var derivative_default = (api) => {
89
103
  memo.exportStatic || (memo.exportStatic = {});
90
104
  return memo;
91
105
  });
92
- api.modifyAppData((memo) => {
93
- Object.entries(strategies).forEach(([key, fn]) => {
94
- memo[key] = fn();
95
- });
106
+ api.modifyAppData(async (memo) => {
107
+ for (const [key, strategy] of Object.entries(strategies)) {
108
+ memo[key] = await strategy();
109
+ }
96
110
  return memo;
97
111
  });
98
- api.onGenerateFiles(() => {
99
- Object.entries(strategies).forEach(([key, fn]) => {
100
- api.appData[key] = fn();
101
- });
102
- });
103
- api.addRuntimePlugin(() => {
104
- return strategies.appJS().slice(0, 1);
112
+ api.register({
113
+ key: "onGenerateFiles",
114
+ stage: -Infinity,
115
+ async fn() {
116
+ for (const [key, strategy] of Object.entries(strategies)) {
117
+ api.appData[key] = await strategy();
118
+ }
119
+ }
105
120
  });
106
121
  api.registerPlugins([require.resolve("@umijs/plugins/dist/analytics")]);
107
122
  };
@@ -0,0 +1,48 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/features/exportStatic.ts
20
+ var exportStatic_exports = {};
21
+ __export(exportStatic_exports, {
22
+ default: () => exportStatic_default
23
+ });
24
+ module.exports = __toCommonJS(exportStatic_exports);
25
+ var import_constants = require("../constants");
26
+ var import_assets = require("./assets");
27
+ var exportStatic_default = (api) => {
28
+ api.describe({ key: "dumi:exportStatic" });
29
+ api.register({
30
+ key: "modifyConfig",
31
+ stage: Infinity,
32
+ fn(memo) {
33
+ var _a;
34
+ if (api.userConfig.exportStatic !== false) {
35
+ const prev = ((_a = memo.exportStatic) == null ? void 0 : _a.extraRoutePaths) || [];
36
+ memo.exportStatic ?? (memo.exportStatic = {});
37
+ memo.exportStatic.extraRoutePaths = async () => {
38
+ const examples = (0, import_assets.getExampleAssets)();
39
+ const userExtraPaths = typeof prev === "function" ? await prev() : prev;
40
+ return userExtraPaths.concat(examples.map(({ id }) => `/${import_constants.SP_ROUTE_PREFIX}demos/${id}`));
41
+ };
42
+ }
43
+ return memo;
44
+ }
45
+ });
46
+ };
47
+ // Annotate the CommonJS export names for ESM import in node:
48
+ 0 && (module.exports = {});
@@ -82,6 +82,10 @@ var theme_default = (api) => {
82
82
  DumiDemoGrid: {
83
83
  specifier: "{ DumiDemoGrid }",
84
84
  source: "dumi"
85
+ },
86
+ Link: {
87
+ specifier: "{ Link }",
88
+ source: "dumi"
85
89
  }
86
90
  });
87
91
  return memo;
@@ -75,7 +75,7 @@ export const texts = {{{texts}}};
75
75
  const { sources } = this;
76
76
  Object.keys(this.sources).forEach((file) => {
77
77
  asset = import_plugin_utils.lodash.cloneDeep(asset);
78
- asset.dependencies[file].value = `{{{require('!!raw-loader!${sources[file]}?raw').default}}}`;
78
+ asset.dependencies[file].value = `{{{require('-!${sources[file]}?dumi-raw').default}}}`;
79
79
  });
80
80
  return JSON.stringify(asset, null, 2).replace(/"{{{|}}}"/g, "");
81
81
  }
@@ -1,6 +1,7 @@
1
1
  import type { IParsedBlockAsset } from "../../../assetParsers/block";
2
2
  import type { IRouteMeta } from "../../../client/theme-api/types";
3
3
  import type { IDumiConfig, IDumiTechStack } from "../../../types";
4
+ import type { IRoute } from 'umi';
4
5
  import type { Data } from 'vfile';
5
6
  declare module 'hast' {
6
7
  interface Element {
@@ -40,6 +41,7 @@ export interface IMdTransformerOptions {
40
41
  resolve: IDumiConfig['resolve'];
41
42
  extraRemarkPlugins?: IDumiConfig['extraRemarkPlugins'];
42
43
  extraRehypePlugins?: IDumiConfig['extraRehypePlugins'];
44
+ routers: Record<string, IRoute>;
43
45
  }
44
46
  export interface IMdTransformerResult {
45
47
  content: string;
@@ -32,6 +32,7 @@ var import_rehypeEnhancedTag = __toESM(require("./rehypeEnhancedTag"));
32
32
  var import_rehypeImg = __toESM(require("./rehypeImg"));
33
33
  var import_rehypeIsolation = __toESM(require("./rehypeIsolation"));
34
34
  var import_rehypeJsxify = __toESM(require("./rehypeJsxify"));
35
+ var import_rehypeLink = __toESM(require("./rehypeLink"));
35
36
  var import_rehypeRaw = __toESM(require("./rehypeRaw"));
36
37
  var import_rehypeSlug = __toESM(require("./rehypeSlug"));
37
38
  var import_rehypeStrip = __toESM(require("./rehypeStrip"));
@@ -74,7 +75,10 @@ var transformer_default = async (raw, opts) => {
74
75
  fileAbsPath: opts.fileAbsPath,
75
76
  resolve: opts.resolve,
76
77
  resolver
77
- }).use(import_rehypeSlug.default).use(rehypeAutolinkHeadings).use(import_rehypeIsolation.default).use(import_rehypeEnhancedTag.default).use(import_rehypeDesc.default).use(import_rehypeText.default);
78
+ }).use(import_rehypeSlug.default).use(import_rehypeLink.default, {
79
+ fileAbsPath: opts.fileAbsPath,
80
+ routers: opts.routers
81
+ }).use(rehypeAutolinkHeadings).use(import_rehypeIsolation.default).use(import_rehypeEnhancedTag.default).use(import_rehypeDesc.default).use(import_rehypeText.default);
78
82
  (_b = opts.extraRehypePlugins) == null ? void 0 : _b.forEach((plugin) => applyUnifiedPlugin({
79
83
  plugin,
80
84
  processor,
@@ -0,0 +1,6 @@
1
+ import type { Root } from 'hast';
2
+ import type { Transformer } from 'unified';
3
+ import type { IMdTransformerOptions } from '.';
4
+ declare type IRehypeLinkOptions = Pick<IMdTransformerOptions, 'fileAbsPath' | 'routers'>;
5
+ export default function rehypeLink(opts: IRehypeLinkOptions): Transformer<Root>;
6
+ export {};
@@ -0,0 +1,68 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/loaders/markdown/transformer/rehypeLink.ts
23
+ var rehypeLink_exports = {};
24
+ __export(rehypeLink_exports, {
25
+ default: () => rehypeLink
26
+ });
27
+ module.exports = __toCommonJS(rehypeLink_exports);
28
+ var import_path = __toESM(require("path"));
29
+ var import_plugin_utils = require("umi/plugin-utils");
30
+ var import_url = __toESM(require("url"));
31
+ var visit;
32
+ var SKIP;
33
+ (async () => {
34
+ ({ visit, SKIP } = await import("unist-util-visit"));
35
+ })();
36
+ function rehypeLink(opts) {
37
+ return (tree) => {
38
+ visit(tree, "element", (node, i, parent) => {
39
+ var _a;
40
+ if (node.tagName === "a" && typeof ((_a = node.properties) == null ? void 0 : _a.href) === "string") {
41
+ const href = node.properties.href;
42
+ const parsedUrl = import_url.default.parse(href);
43
+ if (parsedUrl.hostname)
44
+ return SKIP;
45
+ if (/\.md$/i.test(parsedUrl.pathname)) {
46
+ const { routers } = opts;
47
+ const absPath = (0, import_plugin_utils.winPath)(import_path.default.resolve(opts.fileAbsPath, "..", parsedUrl.pathname));
48
+ Object.keys(routers).forEach((key) => {
49
+ if (routers[key].file === absPath) {
50
+ parsedUrl.pathname = routers[key].absPath;
51
+ }
52
+ });
53
+ }
54
+ parent.children.splice(i, 1, {
55
+ type: "element",
56
+ tagName: "Link",
57
+ children: node.children,
58
+ properties: {
59
+ ...import_plugin_utils.lodash.omit(node.properties, ["href"]),
60
+ to: import_url.default.format(parsedUrl)
61
+ }
62
+ });
63
+ }
64
+ });
65
+ };
66
+ }
67
+ // Annotate the CommonJS export names for ESM import in node:
68
+ 0 && (module.exports = {});
package/dist/preset.js CHANGED
@@ -55,7 +55,8 @@ var preset_default = (api) => {
55
55
  require.resolve("./features/theme"),
56
56
  require.resolve("./features/locales"),
57
57
  require.resolve("./features/parser"),
58
- require.resolve("./features/assets")
58
+ require.resolve("./features/assets"),
59
+ require.resolve("./features/exportStatic")
59
60
  ]
60
61
  };
61
62
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dumi",
3
- "version": "2.0.0-rc.2",
3
+ "version": "2.0.0-rc.4",
4
4
  "description": "Framework for developing UI components",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -25,7 +25,7 @@
25
25
  "lint": "npm run lint:es && npm run lint:css",
26
26
  "lint:css": "stylelint \"{src,test}/**/*.{css,less}\"",
27
27
  "lint:es": "eslint \"{src,test}/**/*.{js,jsx,ts,tsx}\"",
28
- "prepare": "npm run build && node ./bin/dumi.js setup && npm run docs:sync",
28
+ "prepare": "husky install && npm run build && node ./bin/dumi.js setup && npm run docs:sync",
29
29
  "prepublishOnly": "npm run build",
30
30
  "test": "vitest"
31
31
  },
@@ -57,9 +57,9 @@
57
57
  "@swc/core": "^1.2.224",
58
58
  "@types/hast": "^2.3.4",
59
59
  "@types/mdast": "^3.0.10",
60
- "@umijs/bundler-utils": "^4.0.29",
61
- "@umijs/core": "^4.0.29",
62
- "@umijs/plugins": "^4.0.29",
60
+ "@umijs/bundler-utils": "^4.0.30",
61
+ "@umijs/core": "^4.0.30",
62
+ "@umijs/plugins": "^4.0.30",
63
63
  "codesandbox": "^2.2.3",
64
64
  "deepmerge": "^4.2.2",
65
65
  "dumi-afx-deps": "^1.0.0-alpha.1",
@@ -96,7 +96,7 @@
96
96
  "remark-parse": "^10.0.1",
97
97
  "remark-rehype": "^10.1.0",
98
98
  "sass": "^1.55.0",
99
- "umi": "^4.0.29",
99
+ "umi": "^4.0.30",
100
100
  "unified": "^10.1.2",
101
101
  "unist-util-visit": "^4.1.0",
102
102
  "unist-util-visit-parents": "^5.1.1",
@@ -116,7 +116,7 @@
116
116
  "@types/react": "^18.0.16",
117
117
  "@types/react-copy-to-clipboard": "^5.0.4",
118
118
  "@types/react-helmet": "^6.1.5",
119
- "@umijs/lint": "^4.0.29",
119
+ "@umijs/lint": "^4.0.30",
120
120
  "eslint": "^8.20.0",
121
121
  "father": "^4.1.0",
122
122
  "husky": "^8.0.1",
@@ -1,7 +1,7 @@
1
1
  function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
2
 
3
3
  import { useLocation } from 'dumi';
4
- import PreviewerActions from 'dumi/theme/slots/PreviewerActions';
4
+ import PreviewerActions from "dumi/theme/slots/PreviewerActions";
5
5
  import React from 'react';
6
6
  import "./index.less";
7
7
 
@@ -1,24 +1,47 @@
1
- import { useIntl, useOutlet, useRouteMeta } from 'dumi';
2
- import Content from 'dumi/theme/slots/Content';
3
- import Features from 'dumi/theme/slots/Features';
4
- import Footer from 'dumi/theme/slots/Footer';
5
- import Header from 'dumi/theme/slots/Header';
6
- import Hero from 'dumi/theme/slots/Hero';
7
- import Sidebar from 'dumi/theme/slots/Sidebar';
8
- import Toc from 'dumi/theme/slots/Toc';
9
- import React from 'react';
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+
3
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+
5
+ 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); }
6
+
7
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
8
+
9
+ 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; }
10
+
11
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
12
+
13
+ import { ReactComponent as IconSidebar } from '@ant-design/icons-svg/inline-svg/outlined/align-left.svg';
14
+ import { useIntl, useOutlet, useRouteMeta, useSidebarData } from 'dumi';
15
+ import Content from "dumi/theme/slots/Content";
16
+ import Features from "dumi/theme/slots/Features";
17
+ import Footer from "dumi/theme/slots/Footer";
18
+ import Header from "dumi/theme/slots/Header";
19
+ import Hero from "dumi/theme/slots/Hero";
20
+ import Sidebar from "dumi/theme/slots/Sidebar";
21
+ import Toc from "dumi/theme/slots/Toc";
22
+ import React, { useState } from 'react';
10
23
  import Helmet from 'react-helmet';
11
24
  import "./index.less";
12
25
 
13
26
  var DocLayout = function DocLayout() {
14
27
  var intl = useIntl();
15
28
  var outlet = useOutlet();
29
+ var sidebar = useSidebarData();
30
+
31
+ var _useState = useState(false),
32
+ _useState2 = _slicedToArray(_useState, 2),
33
+ showSidebar = _useState2[0],
34
+ setShowSidebar = _useState2[1];
16
35
 
17
36
  var _useRouteMeta = useRouteMeta(),
18
37
  fm = _useRouteMeta.frontmatter;
19
38
 
20
39
  return /*#__PURE__*/React.createElement("div", {
21
- className: "dumi-default-doc-layout"
40
+ className: "dumi-default-doc-layout",
41
+ "data-mobile-sidebar-active": showSidebar || undefined,
42
+ onClick: function onClick() {
43
+ return setShowSidebar(false);
44
+ }
22
45
  }, /*#__PURE__*/React.createElement(Helmet, null, /*#__PURE__*/React.createElement("html", {
23
46
  lang: intl.locale.replace(/-.+$/, '')
24
47
  }), fm.title && /*#__PURE__*/React.createElement("title", null, fm.title), fm.title && /*#__PURE__*/React.createElement("meta", {
@@ -36,7 +59,20 @@ var DocLayout = function DocLayout() {
36
59
  }), fm.keywords && /*#__PURE__*/React.createElement("meta", {
37
60
  property: "og:keywords",
38
61
  content: fm.keywords.join(',')
39
- })), /*#__PURE__*/React.createElement(Header, null), /*#__PURE__*/React.createElement(Hero, null), /*#__PURE__*/React.createElement(Features, null), /*#__PURE__*/React.createElement("main", null, /*#__PURE__*/React.createElement(Sidebar, null), /*#__PURE__*/React.createElement(Content, null, outlet, /*#__PURE__*/React.createElement(Footer, null)), fm.toc === 'content' && /*#__PURE__*/React.createElement("div", {
62
+ })), /*#__PURE__*/React.createElement(Header, null), /*#__PURE__*/React.createElement(Hero, null), /*#__PURE__*/React.createElement(Features, null), sidebar && /*#__PURE__*/React.createElement("div", {
63
+ className: "dumi-default-doc-layout-mobile-bar"
64
+ }, /*#__PURE__*/React.createElement("button", {
65
+ type: "button",
66
+ className: "dumi-default-sidebar-btn",
67
+ onClick: function onClick(ev) {
68
+ ev.stopPropagation();
69
+ setShowSidebar(function (v) {
70
+ return !v;
71
+ });
72
+ }
73
+ }, /*#__PURE__*/React.createElement(IconSidebar, null), intl.formatMessage({
74
+ id: 'layout.sidebar.btn'
75
+ }))), /*#__PURE__*/React.createElement("main", null, /*#__PURE__*/React.createElement(Sidebar, null), /*#__PURE__*/React.createElement(Content, null, outlet, /*#__PURE__*/React.createElement(Footer, null)), fm.toc === 'content' && /*#__PURE__*/React.createElement("div", {
40
76
  className: "dumi-default-doc-layout-toc-wrapper"
41
77
  }, /*#__PURE__*/React.createElement("h4", null, "TABLE OF CONTENTS"), /*#__PURE__*/React.createElement(Toc, null))));
42
78
  };
@@ -7,6 +7,60 @@ body {
7
7
  }
8
8
 
9
9
  .@{prefix}-doc-layout {
10
+ @media @mobile {
11
+ &::before {
12
+ content: '';
13
+ position: fixed;
14
+ z-index: 11; // 1 more than header
15
+ top: 0;
16
+ right: 0;
17
+ left: 0;
18
+ bottom: 0;
19
+ background-color: rgb(0 0 0 / 50%);
20
+ transition: all 0.1s;
21
+ }
22
+
23
+ &:not([data-mobile-sidebar-active])::before {
24
+ opacity: 0;
25
+ visibility: hidden;
26
+ }
27
+ }
28
+
29
+ &-mobile-bar {
30
+ @height: 36px;
31
+
32
+ position: sticky;
33
+ z-index: 9; // 1 less than header
34
+ top: @s-header-height-m;
35
+ left: 0;
36
+ right: 0;
37
+ display: none;
38
+ align-items: center;
39
+ padding: 0 24px;
40
+ height: @height;
41
+ border-top: 1px solid @c-border-light;
42
+ background-color: fadeout(@c-site-bg, 10%);
43
+ backdrop-filter: blur(6px);
44
+
45
+ @media @mobile {
46
+ display: flex;
47
+ }
48
+
49
+ .@{prefix}-sidebar-btn {
50
+ padding: 0;
51
+ color: @c-text-secondary;
52
+ border: 0;
53
+ background-color: transparent;
54
+
55
+ > svg {
56
+ width: 16px;
57
+ margin-right: 6px;
58
+ fill: @c-text-secondary;
59
+ vertical-align: middle;
60
+ }
61
+ }
62
+ }
63
+
10
64
  > main {
11
65
  display: flex;
12
66
  align-items: flex-start;
@@ -30,6 +84,10 @@ body {
30
84
  overscroll-behavior: contain;
31
85
  -webkit-overflow-scrolling: touch;
32
86
 
87
+ @media @mobile {
88
+ display: none;
89
+ }
90
+
33
91
  > h4 {
34
92
  margin: 0 0 8px;
35
93
  color: @c-text-note;
@@ -16,5 +16,6 @@
16
16
  "api.component.loading": "Properties definition is resolving, wait a moment...",
17
17
  "api.component.not.found": "Properties definition not found for {id} component",
18
18
  "content.tabs.default": "Doc",
19
- "search.not.found": "No content was found"
19
+ "search.not.found": "No content was found",
20
+ "layout.sidebar.btn": "Sidebar"
20
21
  }
@@ -16,5 +16,6 @@
16
16
  "api.component.loading": "属性定义正在解析中,稍等片刻...",
17
17
  "api.component.not.found": "未找到 {id} 组件的属性定义",
18
18
  "content.tabs.default": "文档",
19
- "search.not.found": "未找到相关内容"
19
+ "search.not.found": "未找到相关内容",
20
+ "layout.sidebar.btn": "侧边菜单"
20
21
  }
@@ -55,9 +55,22 @@
55
55
  border-top-left-radius: 10px;
56
56
  border-top-right-radius: 10px;
57
57
  box-shadow: 0 8px 24px 0 rgb(0 0 0 / 5%);
58
+
59
+ @media @mobile {
60
+ max-width: initial;
61
+ margin: 0 -24px;
62
+ padding: 24px 24px 0;
63
+ border-radius: 0;
64
+ box-shadow: none;
65
+ }
58
66
  }
59
67
 
60
- .@{prefix}-header + main > & {
68
+ .@{prefix}-header + main > &,
69
+ .@{prefix}-doc-layout-mobile-bar + main > & {
61
70
  min-height: calc(100vh - @s-header-height);
71
+
72
+ @media @mobile {
73
+ min-height: calc(100vh - @s-header-height-m);
74
+ }
62
75
  }
63
76
  }
@@ -9,9 +9,19 @@
9
9
  padding: 0 @s-content-padding;
10
10
  border-bottom: 1px solid @c-border-light;
11
11
 
12
+ @media @mobile {
13
+ margin: -24px -24px 24px;
14
+ padding: 0 24px;
15
+ height: 42px;
16
+ }
17
+
12
18
  [data-no-sidebar] & {
13
19
  margin: 0 0 @s-content-padding;
14
20
  padding: 0;
21
+
22
+ @media @mobile {
23
+ margin-bottom: 24px;
24
+ }
15
25
  }
16
26
 
17
27
  > li {
@@ -34,6 +44,10 @@
34
44
 
35
45
  &:not(last-child) {
36
46
  margin-right: 42px;
47
+
48
+ @media @mobile {
49
+ margin-right: 20px;
50
+ }
37
51
  }
38
52
 
39
53
  &[data-active] {
@@ -2,7 +2,7 @@
2
2
 
3
3
  .@{prefix}-features {
4
4
  margin: 0 auto 48px;
5
- width: @s-content-width;
5
+ max-width: @s-content-width;
6
6
  padding: 0 24px;
7
7
  overflow: hidden;
8
8
  box-sizing: border-box;
@@ -13,6 +13,11 @@
13
13
  &:nth-child(odd) {
14
14
  margin-right: 8%;
15
15
  }
16
+
17
+ @media @mobile {
18
+ width: 100%;
19
+ margin-right: 0;
20
+ }
16
21
  }
17
22
 
18
23
  &[data-cols='3'] > &-item {
@@ -21,6 +26,11 @@
21
26
  &:not(:nth-child(3n)) {
22
27
  margin-right: 2.9%;
23
28
  }
29
+
30
+ @media @mobile {
31
+ width: 100%;
32
+ margin-right: 0;
33
+ }
24
34
  }
25
35
 
26
36
  &-item {
@@ -30,6 +40,10 @@
30
40
  > i {
31
41
  font-size: 64px;
32
42
  font-style: normal;
43
+
44
+ @media @mobile {
45
+ font-size: 48px;
46
+ }
33
47
  }
34
48
 
35
49
  > h3 {
@@ -37,6 +51,10 @@
37
51
  color: #2c4262;
38
52
  font-weight: normal;
39
53
  font-size: 20px;
54
+
55
+ @media @mobile {
56
+ font-size: 18px;
57
+ }
40
58
  }
41
59
 
42
60
  > p {
@@ -45,6 +63,10 @@
45
63
  font-size: 16px;
46
64
  line-height: 1.475;
47
65
 
66
+ @media @mobile {
67
+ font-size: 14px;
68
+ }
69
+
48
70
  a {
49
71
  color: @c-primary;
50
72
 
@@ -9,6 +9,11 @@
9
9
  text-align: center;
10
10
  padding: @s-content-padding * 0.6 0;
11
11
 
12
+ @media @mobile {
13
+ padding: @s-content-padding * 0.3 0;
14
+ font-size: 13px;
15
+ }
16
+
12
17
  a {
13
18
  color: @c-primary;
14
19
 
@@ -1,18 +1,41 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+
3
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+
5
+ 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); }
6
+
7
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
8
+
9
+ 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; }
10
+
11
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
12
+
13
+ import { ReactComponent as IconClose } from '@ant-design/icons-svg/inline-svg/outlined/close.svg';
14
+ import { ReactComponent as IconMenu } from '@ant-design/icons-svg/inline-svg/outlined/menu.svg';
1
15
  import { useRouteMeta } from 'dumi';
2
- import LangSwitch from 'dumi/theme/slots/LangSwitch';
3
- import Logo from 'dumi/theme/slots/Logo';
4
- import Navbar from 'dumi/theme/slots/Navbar';
5
- import SearchBar from 'dumi/theme/slots/SearchBar';
6
- import React from 'react';
16
+ import LangSwitch from "dumi/theme/slots/LangSwitch";
17
+ import Logo from "dumi/theme/slots/Logo";
18
+ import Navbar from "dumi/theme/slots/Navbar";
19
+ import SearchBar from "dumi/theme/slots/SearchBar";
20
+ import React, { useState } from 'react';
7
21
  import "./index.less";
8
22
 
9
23
  var Header = function Header() {
10
24
  var _useRouteMeta = useRouteMeta(),
11
25
  frontmatter = _useRouteMeta.frontmatter;
12
26
 
27
+ var _useState = useState(false),
28
+ _useState2 = _slicedToArray(_useState, 2),
29
+ showMenu = _useState2[0],
30
+ setShowMenu = _useState2[1];
31
+
13
32
  return /*#__PURE__*/React.createElement("div", {
14
33
  className: "dumi-default-header",
15
- "data-static": Boolean(frontmatter.hero) || undefined
34
+ "data-static": Boolean(frontmatter.hero) || undefined,
35
+ "data-mobile-active": showMenu || undefined,
36
+ onClick: function onClick() {
37
+ return setShowMenu(false);
38
+ }
16
39
  }, /*#__PURE__*/React.createElement("div", {
17
40
  className: "dumi-default-header-content"
18
41
  }, /*#__PURE__*/React.createElement("section", {
@@ -21,7 +44,16 @@ var Header = function Header() {
21
44
  className: "dumi-default-header-right"
22
45
  }, /*#__PURE__*/React.createElement(Navbar, null), /*#__PURE__*/React.createElement("div", {
23
46
  className: "dumi-default-header-right-aside"
24
- }, /*#__PURE__*/React.createElement(SearchBar, null), /*#__PURE__*/React.createElement(LangSwitch, null)))));
47
+ }, /*#__PURE__*/React.createElement(SearchBar, null), /*#__PURE__*/React.createElement(LangSwitch, null))), /*#__PURE__*/React.createElement("button", {
48
+ type: "button",
49
+ className: "dumi-default-header-menu-btn",
50
+ onClick: function onClick(ev) {
51
+ ev.stopPropagation();
52
+ setShowMenu(function (v) {
53
+ return !v;
54
+ });
55
+ }
56
+ }, showMenu ? /*#__PURE__*/React.createElement(IconClose, null) : /*#__PURE__*/React.createElement(IconMenu, null))));
25
57
  };
26
58
 
27
59
  export default Header;
@@ -9,6 +9,12 @@
9
9
  position: sticky;
10
10
  background-color: fadeout(@c-site-bg, 10%);
11
11
  backdrop-filter: blur(6px);
12
+
13
+ // to avoid backdrop filter conflict with navbar overlay
14
+ &[data-mobile-active] {
15
+ background-color: @c-site-bg;
16
+ backdrop-filter: none;
17
+ }
12
18
  }
13
19
 
14
20
  &-content {
@@ -19,6 +25,10 @@
19
25
  max-width: @s-content-width;
20
26
  height: @s-header-height;
21
27
  box-sizing: border-box;
28
+
29
+ @media @mobile {
30
+ height: @s-header-height-m;
31
+ }
22
32
  }
23
33
 
24
34
  &-left {
@@ -34,5 +44,45 @@
34
44
  display: flex;
35
45
  align-items: center;
36
46
  }
47
+
48
+ @media @mobile {
49
+ position: fixed;
50
+ top: @s-header-height-m;
51
+ left: 0;
52
+ right: 0;
53
+ height: calc(100vh - @s-header-height-m);
54
+ display: block;
55
+ background-color: fadeout(@c-site-bg, 40%);
56
+ border-top: 1px solid @c-border-light;
57
+ backdrop-filter: blur(30px);
58
+ box-sizing: border-box;
59
+ transition: all 0.2s;
60
+
61
+ .@{prefix}-header:not([data-mobile-active]) & {
62
+ opacity: 0;
63
+ visibility: hidden;
64
+ padding-top: 20px;
65
+ }
66
+ }
67
+ }
68
+
69
+ &-menu-btn {
70
+ position: absolute;
71
+ top: 50%;
72
+ right: 24px;
73
+ padding: 0;
74
+ border: 0;
75
+ background: transparent;
76
+ transform: translateY(-50%);
77
+ display: none;
78
+
79
+ @media @mobile {
80
+ display: block;
81
+ }
82
+
83
+ > svg {
84
+ width: 20px;
85
+ fill: @c-text-secondary;
86
+ }
37
87
  }
38
88
  }
@@ -1,5 +1,5 @@
1
1
  import { Link, useRouteMeta } from 'dumi';
2
- import HeroTitle from 'dumi/theme/slots/HeroTitle';
2
+ import HeroTitle from "dumi/theme/slots/HeroTitle";
3
3
  import React from 'react';
4
4
  import "./index.less";
5
5
 
@@ -9,6 +9,12 @@
9
9
  text-align: center;
10
10
  box-sizing: border-box;
11
11
 
12
+ @media @mobile {
13
+ margin-top: -@s-header-height-m - 20;
14
+ padding-top: 160px;
15
+ height: 660px;
16
+ }
17
+
12
18
  + * {
13
19
  position: relative;
14
20
  }
@@ -32,6 +38,10 @@
32
38
  color: #4e6789;
33
39
  font-size: 20px;
34
40
  line-height: 1.6;
41
+
42
+ @media @mobile {
43
+ font-size: 16px;
44
+ }
35
45
  }
36
46
 
37
47
  &-actions {
@@ -50,6 +60,13 @@
50
60
  box-sizing: border-box;
51
61
  transition: opacity 0.2s;
52
62
 
63
+ @media @mobile {
64
+ font-size: 16px;
65
+ height: 42px;
66
+ line-height: 40px;
67
+ min-width: 128px;
68
+ }
69
+
53
70
  &:hover {
54
71
  opacity: 0.8;
55
72
  }
@@ -20,4 +20,8 @@
20
20
  background: linear-gradient(30deg, #91d6ff 30%, #66a6ff);
21
21
  background-clip: text;
22
22
  }
23
+
24
+ @media @mobile {
25
+ font-size: 60px;
26
+ }
23
27
  }
@@ -9,8 +9,20 @@
9
9
  font-weight: 500;
10
10
  text-decoration: none;
11
11
 
12
+ @media @mobile {
13
+ font-size: 18px;
14
+
15
+ img {
16
+ height: 32px;
17
+ }
18
+ }
19
+
12
20
  img {
13
21
  margin-right: 10px;
14
22
  height: 40px;
23
+
24
+ @media @mobile {
25
+ height: 32px;
26
+ }
15
27
  }
16
28
  }
@@ -15,7 +15,11 @@ var Navbar = function Navbar() {
15
15
  }, nav.map(function (item) {
16
16
  return /*#__PURE__*/React.createElement("li", {
17
17
  key: item.link
18
- }, /*#__PURE__*/React.createElement(Link, _extends({
18
+ }, /^(\w+:)\/\/|^(mailto|tel):/.test(item.link) ? /*#__PURE__*/React.createElement("a", {
19
+ href: item.link,
20
+ target: "_blank",
21
+ rel: "noreferrer"
22
+ }, item.title) : /*#__PURE__*/React.createElement(Link, _extends({
19
23
  to: item.link
20
24
  }, pathname.startsWith(item.activePath || item.link) ? {
21
25
  className: 'active'
@@ -7,9 +7,19 @@
7
7
  display: flex;
8
8
  align-items: center;
9
9
 
10
+ @media @mobile {
11
+ display: block;
12
+ padding-top: 24px;
13
+ }
14
+
10
15
  > li {
11
16
  font-size: 18px;
12
17
  line-height: 1;
18
+ text-align: center;
19
+
20
+ @media @mobile {
21
+ padding: 12px 0;
22
+ }
13
23
 
14
24
  > a {
15
25
  color: @c-text-secondary;
@@ -28,6 +38,10 @@
28
38
 
29
39
  &:not(:last-child) {
30
40
  margin-right: 48px;
41
+
42
+ @media @mobile {
43
+ margin-right: 0;
44
+ }
31
45
  }
32
46
  }
33
47
  }
@@ -13,8 +13,8 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
13
13
  import { ReactComponent as IconCodeSandbox } from '@ant-design/icons-svg/inline-svg/outlined/code-sandbox.svg'; // import { ReactComponent as IconCodePen } from '@ant-design/icons-svg/inline-svg/outlined/codepen.svg';
14
14
 
15
15
  import { openCodeSandbox, useIntl } from 'dumi';
16
- import SourceCode from 'dumi/theme/builtins/SourceCode';
17
- import PreviewerActionsExtra from 'dumi/theme/slots/PreviewerActionsExtra';
16
+ import SourceCode from "dumi/theme/builtins/SourceCode";
17
+ import PreviewerActionsExtra from "dumi/theme/slots/PreviewerActionsExtra";
18
18
  import Tabs from 'rc-tabs';
19
19
  import React, { useState } from 'react';
20
20
  import "./index.less";
@@ -3,6 +3,11 @@
3
3
  .@{prefix}-search-bar {
4
4
  position: relative;
5
5
 
6
+ @media @mobile {
7
+ // TODO: support search for mobile devices
8
+ display: none;
9
+ }
10
+
6
11
  &:not(:last-child) {
7
12
  margin-right: 28px;
8
13
  }
@@ -57,6 +62,10 @@
57
62
  transform: translateY(-50%);
58
63
  transition: all 0.3s;
59
64
  pointer-events: none;
65
+
66
+ @media @mobile {
67
+ display: none;
68
+ }
60
69
  }
61
70
 
62
71
  .@{prefix}-search-popover {
@@ -1,5 +1,5 @@
1
1
  import { NavLink, useLocation, useRouteMeta, useSidebarData } from 'dumi';
2
- import Toc from 'dumi/theme/slots/Toc';
2
+ import Toc from "dumi/theme/slots/Toc";
3
3
  import React from 'react';
4
4
  import "./index.less";
5
5
 
@@ -9,6 +9,26 @@
9
9
  box-sizing: border-box;
10
10
  overflow: auto;
11
11
 
12
+ @media @mobile {
13
+ position: fixed;
14
+ z-index: 20;
15
+ top: 0;
16
+ left: 0;
17
+ bottom: 0;
18
+ max-height: initial;
19
+ padding-left: 32px;
20
+ background-color: @c-site-bg;
21
+ border-top: 1px solid @c-border-light;
22
+ box-shadow: 0 0 20px rgb(0 0 0 / 10%);
23
+ transition: 0.2s all;
24
+
25
+ .@{prefix}-doc-layout:not([data-mobile-sidebar-active]) & {
26
+ opacity: 0;
27
+ visibility: hidden;
28
+ transform: translateX(-100%);
29
+ }
30
+ }
31
+
12
32
  > dl {
13
33
  margin: 0;
14
34
  padding: 0;
@@ -4,6 +4,7 @@
4
4
  @s-content-padding: 48px;
5
5
  @s-sidebar-width: 184px;
6
6
  @s-header-height: 76px;
7
+ @s-header-height-m: 52px;
7
8
 
8
9
  @c-primary: #1677ff;
9
10
  @c-text: #333;
@@ -13,3 +14,6 @@
13
14
  @c-border-light: #e4e9ec;
14
15
  @c-site-bg: #f7f9fb;
15
16
  @c-warning: #dd9600;
17
+
18
+ @mobile: ~'only screen and (max-width: 767px)';
19
+ @tablet: ~'only screen and (min-width: 768px) and (max-width: 1024px)';