dumi 2.0.0-rc.2 → 2.0.0-rc.3

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 (32) hide show
  1. package/dist/features/assets.d.ts +4 -0
  2. package/dist/features/assets.js +7 -2
  3. package/dist/features/compile/babelLoaderCustomize.d.ts +4 -0
  4. package/dist/features/compile/babelLoaderCustomize.js +37 -0
  5. package/dist/features/compile/index.d.ts +3 -0
  6. package/dist/features/{compile.js → compile/index.js} +17 -8
  7. package/dist/features/{compile.d.ts → exportStatic.d.ts} +0 -0
  8. package/dist/features/exportStatic.js +48 -0
  9. package/dist/features/theme/index.js +4 -0
  10. package/dist/loaders/markdown/index.js +1 -1
  11. package/dist/loaders/markdown/transformer/index.d.ts +2 -0
  12. package/dist/loaders/markdown/transformer/index.js +5 -1
  13. package/dist/loaders/markdown/transformer/rehypeLink.d.ts +6 -0
  14. package/dist/loaders/markdown/transformer/rehypeLink.js +68 -0
  15. package/dist/preset.js +2 -1
  16. package/package.json +1 -1
  17. package/theme-default/layouts/DocLayout/index.js +40 -4
  18. package/theme-default/layouts/DocLayout/index.less +58 -0
  19. package/theme-default/locales/en-US.json +2 -1
  20. package/theme-default/locales/zh-CN.json +2 -1
  21. package/theme-default/slots/Content/index.less +14 -1
  22. package/theme-default/slots/Features/index.less +23 -1
  23. package/theme-default/slots/Footer/index.less +5 -0
  24. package/theme-default/slots/Header/index.js +35 -3
  25. package/theme-default/slots/Header/index.less +50 -0
  26. package/theme-default/slots/Hero/index.less +17 -0
  27. package/theme-default/slots/HeroTitle/index.less +4 -0
  28. package/theme-default/slots/Logo/index.less +12 -0
  29. package/theme-default/slots/Navbar/index.less +14 -0
  30. package/theme-default/slots/SearchBar/index.less +9 -0
  31. package/theme-default/slots/Sidebar/index.less +20 -0
  32. package/theme-default/styles/variables.less +4 -0
@@ -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
  {
@@ -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.3",
4
4
  "description": "Framework for developing UI components",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -1,4 +1,17 @@
1
- import { useIntl, useOutlet, useRouteMeta } from 'dumi';
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';
2
15
  import Content from 'dumi/theme/slots/Content';
3
16
  import Features from 'dumi/theme/slots/Features';
4
17
  import Footer from 'dumi/theme/slots/Footer';
@@ -6,19 +19,29 @@ import Header from 'dumi/theme/slots/Header';
6
19
  import Hero from 'dumi/theme/slots/Hero';
7
20
  import Sidebar from 'dumi/theme/slots/Sidebar';
8
21
  import Toc from 'dumi/theme/slots/Toc';
9
- import React from 'react';
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
  }
@@ -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
16
  import LangSwitch from 'dumi/theme/slots/LangSwitch';
3
17
  import Logo from 'dumi/theme/slots/Logo';
4
18
  import Navbar from 'dumi/theme/slots/Navbar';
5
19
  import SearchBar from 'dumi/theme/slots/SearchBar';
6
- import React from 'react';
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
  }
@@ -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
  }
@@ -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
  }
@@ -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 {
@@ -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)';