dumi 2.0.0-alpha.3 → 2.0.0-alpha.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 (90) hide show
  1. package/dist/client/pages/404.d.ts +1 -0
  2. package/dist/client/pages/404.js +2 -0
  3. package/dist/client/pages/Demo.d.ts +3 -0
  4. package/dist/client/pages/Demo.js +17 -0
  5. package/dist/client/theme-api/DumiDemo.js +8 -5
  6. package/dist/client/theme-api/DumiDemoGrid.d.ts +1 -1
  7. package/dist/client/theme-api/DumiDemoGrid.js +9 -8
  8. package/dist/client/theme-api/context.d.ts +4 -2
  9. package/dist/client/theme-api/context.js +6 -3
  10. package/dist/client/theme-api/index.d.ts +8 -7
  11. package/dist/client/theme-api/index.js +7 -7
  12. package/dist/client/theme-api/types.d.ts +45 -14
  13. package/dist/client/theme-api/useLocale.d.ts +1 -0
  14. package/dist/client/theme-api/useLocale.js +31 -0
  15. package/dist/client/theme-api/useNavData.d.ts +1 -1
  16. package/dist/client/theme-api/useNavData.js +11 -11
  17. package/dist/client/theme-api/useRouteMeta.js +4 -1
  18. package/dist/client/theme-api/useSidebarData.js +11 -12
  19. package/dist/client/theme-api/utils.d.ts +0 -1
  20. package/dist/client/theme-api/utils.js +7 -25
  21. package/dist/client/tsconfig.json +2 -1
  22. package/dist/constants.d.ts +1 -0
  23. package/dist/constants.js +3 -0
  24. package/dist/features/compile.js +1 -1
  25. package/dist/features/configPlugins/schema.js +1 -4
  26. package/dist/features/exports.d.ts +3 -0
  27. package/dist/features/exports.js +45 -0
  28. package/dist/features/locales.js +2 -2
  29. package/dist/features/meta.js +2 -2
  30. package/dist/features/routes.js +28 -1
  31. package/dist/features/theme/index.js +6 -6
  32. package/dist/index.d.ts +2 -1
  33. package/dist/index.js +1 -0
  34. package/dist/loaders/markdown/index.js +4 -2
  35. package/dist/loaders/markdown/transformer/index.d.ts +5 -2
  36. package/dist/loaders/markdown/transformer/index.js +4 -2
  37. package/dist/loaders/markdown/transformer/rehypeDemo.d.ts +3 -0
  38. package/dist/loaders/markdown/transformer/rehypeDemo.js +14 -6
  39. package/dist/loaders/markdown/transformer/rehypeEmbed.d.ts +9 -1
  40. package/dist/loaders/markdown/transformer/rehypeEmbed.js +16 -4
  41. package/dist/loaders/markdown/transformer/rehypeRaw.js +2 -2
  42. package/dist/loaders/markdown/transformer/rehypeSlug.d.ts +4 -0
  43. package/dist/loaders/markdown/transformer/rehypeSlug.js +105 -0
  44. package/dist/loaders/markdown/transformer/remarkMeta.d.ts +4 -2
  45. package/dist/loaders/markdown/transformer/remarkMeta.js +24 -3
  46. package/dist/preset.js +1 -0
  47. package/dist/types.d.ts +2 -1
  48. package/package.json +14 -1
  49. package/theme-default/builtins/{Previewer.d.ts → Previewer/index.d.ts} +2 -1
  50. package/theme-default/builtins/Previewer/index.js +162 -0
  51. package/theme-default/builtins/Previewer/index.less +297 -0
  52. package/theme-default/builtins/SourceCode/index.d.ts +9 -0
  53. package/theme-default/builtins/SourceCode/index.js +87 -0
  54. package/theme-default/builtins/SourceCode/index.less +50 -0
  55. package/theme-default/layouts/DocLayout/index.d.ts +1 -0
  56. package/theme-default/layouts/DocLayout/index.js +20 -19
  57. package/theme-default/layouts/DocLayout/index.less +17 -0
  58. package/theme-default/locales/en-US.json +9 -1
  59. package/theme-default/locales/zh-CN.json +9 -1
  60. package/theme-default/slots/Content/heti.scss +3 -0
  61. package/theme-default/slots/Content/index.d.ts +2 -0
  62. package/theme-default/slots/Content/index.js +6 -5
  63. package/theme-default/slots/Content/index.less +31 -0
  64. package/theme-default/slots/Header/index.d.ts +1 -0
  65. package/theme-default/slots/Header/index.js +10 -7
  66. package/theme-default/slots/Header/index.less +22 -0
  67. package/theme-default/slots/LangSwitch/index.d.ts +4 -0
  68. package/theme-default/slots/LangSwitch/index.js +81 -0
  69. package/theme-default/slots/LangSwitch/index.less +13 -0
  70. package/theme-default/slots/Logo/index.d.ts +1 -0
  71. package/theme-default/slots/Logo/index.js +13 -1
  72. package/theme-default/slots/Logo/index.less +16 -0
  73. package/theme-default/slots/Navbar/index.d.ts +1 -0
  74. package/theme-default/slots/Navbar/index.js +20 -1
  75. package/theme-default/slots/Navbar/index.less +33 -0
  76. package/theme-default/slots/NotFound/index.d.ts +4 -0
  77. package/theme-default/slots/NotFound/index.js +20 -0
  78. package/theme-default/slots/NotFound/index.less +26 -0
  79. package/theme-default/slots/SearchBar/index.d.ts +1 -0
  80. package/theme-default/slots/SearchBar/index.js +32 -4
  81. package/theme-default/slots/SearchBar/index.less +61 -0
  82. package/theme-default/slots/Sidebar/index.d.ts +1 -0
  83. package/theme-default/slots/Sidebar/index.js +23 -8
  84. package/theme-default/slots/Sidebar/index.less +57 -0
  85. package/theme-default/slots/Toc/index.d.ts +4 -0
  86. package/theme-default/slots/Toc/index.js +30 -0
  87. package/theme-default/slots/Toc/index.less +31 -0
  88. package/theme-default/styles/utils.less +46 -0
  89. package/theme-default/styles/variables.less +13 -0
  90. package/theme-default/builtins/Previewer.js +0 -11
@@ -0,0 +1,162 @@
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
+
3
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
+
5
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
+
7
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
8
+
9
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
10
+
11
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
12
+
13
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
+
15
+ import { ReactComponent as IconCodeSandbox } from '@ant-design/icons-svg/inline-svg/outlined/code-sandbox.svg';
16
+ import { ReactComponent as IconCodePen } from '@ant-design/icons-svg/inline-svg/outlined/codepen.svg';
17
+ import { useIntl, useLocation } from 'dumi';
18
+ import SourceCode from 'dumi/theme/builtins/SourceCode';
19
+ import Tabs from 'rc-tabs';
20
+ import React, { useState } from 'react';
21
+ import "./index.less";
22
+
23
+ var IconCode = function IconCode() {
24
+ return /*#__PURE__*/React.createElement("svg", {
25
+ viewBox: "0 0 200 117"
26
+ }, /*#__PURE__*/React.createElement("path", {
27
+ d: "M59.688 2.578c-3.438-3.437-8.438-3.437-11.563 0L3.75 48.516c-5 5.937-5 14.062 0 19.062l44.063 45.938c1.562 1.562 4.062 2.5 5.937 2.5s4.063-.938 5.938-2.5c3.437-3.438 3.437-8.438 0-11.563l-42.5-43.437 42.5-44.063c3.437-3.437 3.437-8.437 0-11.875Zm135.937 45.938L151.25 2.578c-3.438-3.437-8.438-3.437-11.563 0-3.125 3.438-3.437 8.438 0 11.563l42.5 44.375-42.5 44.062c-3.437 3.438-3.437 8.438 0 11.563 1.563 1.562 3.438 2.5 5.938 2.5 2.5 0 4.063-.938 5.938-2.5l44.062-45.938c5.625-5.625 5.625-13.75 0-19.687Zm-75.938-45c-4.062-1.563-9.062.937-10.937 5l-34.063 95c-1.562 4.062.938 9.062 5 10.937.938 0 1.563.938 2.5.938 3.438 0 6.563-2.5 7.5-5.938l35-95.937c1.563-4.063-.937-9.063-5-10Z"
28
+ }));
29
+ };
30
+
31
+ var IconCodeExpand = function IconCodeExpand() {
32
+ return /*#__PURE__*/React.createElement("svg", {
33
+ viewBox: "0 0 200 117"
34
+ }, /*#__PURE__*/React.createElement("path", {
35
+ d: "M59.688 2.578c-3.438-3.437-8.438-3.437-11.563 0L3.75 48.516c-5 5.937-5 14.062 0 19.062l44.063 45.938c1.562 1.562 4.062 2.5 5.937 2.5s4.063-.938 5.938-2.5c3.437-3.438 3.437-8.438 0-11.563l-42.5-43.437 42.5-44.063c3.437-3.437 3.437-8.437 0-11.875Zm135.937 45.938L151.25 2.578c-3.438-3.437-8.438-3.437-11.563 0-3.125 3.438-3.437 8.438 0 11.563l42.5 44.375-42.5 44.062c-3.437 3.438-3.437 8.438 0 11.563 1.563 1.562 3.438 2.5 5.938 2.5 2.5 0 4.063-.938 5.938-2.5l44.062-45.938c5.625-5.625 5.625-13.75 0-19.687Z"
36
+ }));
37
+ };
38
+
39
+ var IconExternalLink = function IconExternalLink() {
40
+ return /*#__PURE__*/React.createElement("svg", {
41
+ viewBox: "0 0 1024 1024"
42
+ }, /*#__PURE__*/React.createElement("path", {
43
+ d: "M853.333 469.333A42.667 42.667 0 0 0 810.667 512v256A42.667 42.667 0 0 1 768 810.667H256A42.667 42.667 0 0 1 213.333 768V256A42.667 42.667 0 0 1 256 213.333h256A42.667 42.667 0 0 0 512 128H256a128 128 0 0 0-128 128v512a128 128 0 0 0 128 128h512a128 128 0 0 0 128-128V512a42.667 42.667 0 0 0-42.667-42.667z"
44
+ }), /*#__PURE__*/React.createElement("path", {
45
+ d: "M682.667 213.333h67.413L481.707 481.28a42.667 42.667 0 0 0 0 60.587 42.667 42.667 0 0 0 60.586 0L810.667 273.92v67.413A42.667 42.667 0 0 0 853.333 384 42.667 42.667 0 0 0 896 341.333V170.667A42.667 42.667 0 0 0 853.333 128H682.667a42.667 42.667 0 0 0 0 85.333z"
46
+ }));
47
+ };
48
+
49
+ var Previewer = function Previewer(props) {
50
+ var _files$activeKey$0$ma;
51
+
52
+ var intl = useIntl();
53
+
54
+ var _useLocation = useLocation(),
55
+ hash = _useLocation.hash;
56
+
57
+ var files = Object.entries(props.asset.dependencies).filter(function (_ref) {
58
+ var _ref2 = _slicedToArray(_ref, 2),
59
+ type = _ref2[1].type;
60
+
61
+ return type === 'FILE';
62
+ });
63
+
64
+ var _useState = useState(0),
65
+ _useState2 = _slicedToArray(_useState, 2),
66
+ activeKey = _useState2[0],
67
+ setActiveKey = _useState2[1];
68
+
69
+ var _useState3 = useState(false),
70
+ _useState4 = _slicedToArray(_useState3, 2),
71
+ showCode = _useState4[0],
72
+ setShowCode = _useState4[1];
73
+
74
+ var isSingleFile = files.length === 1;
75
+ var lang = ((_files$activeKey$0$ma = files[activeKey][0].match(/\.([^.]+)$/)) === null || _files$activeKey$0$ma === void 0 ? void 0 : _files$activeKey$0$ma[1]) || 'text';
76
+ var link = "#".concat(props.asset.id);
77
+ return /*#__PURE__*/React.createElement("div", {
78
+ className: "dumi-default-previewer",
79
+ "data-debug": props.debug,
80
+ "data-active": hash === link || undefined
81
+ }, /*#__PURE__*/React.createElement("div", {
82
+ className: "dumi-default-previewer-demo",
83
+ style: {
84
+ background: props.background
85
+ },
86
+ "data-compact": props.compact || undefined,
87
+ "data-transform": props.transform || undefined,
88
+ "data-iframe": props.iframe || undefined
89
+ }, props.iframe ? /*#__PURE__*/React.createElement("iframe", {
90
+ style: ['string', 'number'].includes(_typeof(props.iframe)) ? {
91
+ height: Number(props.iframe)
92
+ } : {},
93
+ src: "/~demos/".concat(props.asset.id)
94
+ }) : props.children), /*#__PURE__*/React.createElement("div", {
95
+ className: "dumi-default-previewer-meta"
96
+ }, (props.title || props.debug) && /*#__PURE__*/React.createElement("div", {
97
+ className: "dumi-default-previewer-desc"
98
+ }, /*#__PURE__*/React.createElement("h5", null, /*#__PURE__*/React.createElement("a", {
99
+ href: link
100
+ }, props.debug && /*#__PURE__*/React.createElement("strong", null, "DEV ONLY"), props.title)), props.description && /*#__PURE__*/React.createElement("div", {
101
+ className: "markdown",
102
+ dangerouslySetInnerHTML: {
103
+ __html: props.description
104
+ }
105
+ })), /*#__PURE__*/React.createElement("div", {
106
+ className: "dumi-default-previewer-actions"
107
+ }, /*#__PURE__*/React.createElement("button", {
108
+ className: "dumi-default-previewer-action-btn",
109
+ type: "button",
110
+ "data-dumi-tooltip": intl.formatMessage({
111
+ id: 'previewer.actions.codesandbox'
112
+ })
113
+ }, /*#__PURE__*/React.createElement(IconCodeSandbox, null)), /*#__PURE__*/React.createElement("button", {
114
+ className: "dumi-default-previewer-action-btn",
115
+ type: "button",
116
+ "data-dumi-tooltip": intl.formatMessage({
117
+ id: 'previewer.actions.codepen'
118
+ })
119
+ }, /*#__PURE__*/React.createElement(IconCodePen, null)), /*#__PURE__*/React.createElement("a", {
120
+ target: "_blank",
121
+ rel: "noreferrer",
122
+ href: props.demoUrl,
123
+ className: "dumi-default-previewer-action-btn",
124
+ "data-dumi-tooltip": intl.formatMessage({
125
+ id: 'previewer.actions.separate'
126
+ })
127
+ }, /*#__PURE__*/React.createElement(IconExternalLink, null)), /*#__PURE__*/React.createElement("button", {
128
+ className: "dumi-default-previewer-action-btn",
129
+ type: "button",
130
+ onClick: function onClick() {
131
+ return setShowCode(function (prev) {
132
+ return !prev;
133
+ });
134
+ },
135
+ "data-dumi-tooltip": intl.formatMessage({
136
+ id: "previewer.actions.code.".concat(showCode ? 'shrink' : 'expand')
137
+ })
138
+ }, showCode ? /*#__PURE__*/React.createElement(IconCodeExpand, null) : /*#__PURE__*/React.createElement(IconCode, null))), showCode && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
139
+ className: "dumi-default-previewer-sources"
140
+ }, !isSingleFile && /*#__PURE__*/React.createElement(Tabs, {
141
+ className: "dumi-default-previewer-tabs",
142
+ prefixCls: "dumi-default-tabs",
143
+ moreIcon: "\xB7\xB7\xB7",
144
+ defaultActiveKey: String(activeKey),
145
+ onChange: function onChange(key) {
146
+ return setActiveKey(Number(key));
147
+ },
148
+ items: files.map(function (_ref3, i) {
149
+ var _ref4 = _slicedToArray(_ref3, 1),
150
+ filename = _ref4[0];
151
+
152
+ return {
153
+ key: String(i),
154
+ label: filename
155
+ };
156
+ })
157
+ })), /*#__PURE__*/React.createElement(SourceCode, {
158
+ lang: lang
159
+ }, files[activeKey][1].value))));
160
+ };
161
+
162
+ export default Previewer;
@@ -0,0 +1,297 @@
1
+ @import (reference) '../../styles/variables.less';
2
+ @import '../../styles/utils.less';
3
+
4
+ .@{prefix}-previewer {
5
+ margin: 24px 0 32px;
6
+ border: 1px solid @c-border-light;
7
+ border-radius: 4px;
8
+ background-color: #fff;
9
+
10
+ [data-dumi-demo-grid] & {
11
+ margin: 0 0 16px;
12
+
13
+ &:first-child {
14
+ margin-top: 24px;
15
+ }
16
+
17
+ &:last-child {
18
+ margin-bottom: 32px;
19
+ }
20
+ }
21
+
22
+ &-demo {
23
+ border-top-left-radius: 2px;
24
+ border-top-right-radius: 2px;
25
+ padding: 40px 24px;
26
+
27
+ > iframe {
28
+ display: block;
29
+ width: 100%;
30
+ height: 300px;
31
+ border: 0;
32
+ }
33
+
34
+ // demo render controls
35
+ &[data-iframe] {
36
+ position: relative;
37
+ padding: 0;
38
+ overflow: hidden;
39
+
40
+ &::before {
41
+ content: '';
42
+ display: block;
43
+ height: 24px;
44
+ background-color: @c-border-light;
45
+ }
46
+
47
+ &::after {
48
+ @btn-gap: 8px;
49
+ @btn-width: 12px;
50
+
51
+ content: '';
52
+ position: absolute;
53
+ top: 5px;
54
+ left: @btn-gap;
55
+ display: inline-block;
56
+ width: @btn-width;
57
+ height: @btn-width;
58
+ border-radius: 50%;
59
+ background-color: #fd6458;
60
+ box-shadow: (@btn-width + @btn-gap) 0 0 #ffbf2b,
61
+ (@btn-width + @btn-gap) * 2 0 0 #24cc3d;
62
+ }
63
+ }
64
+
65
+ &[data-transform] {
66
+ transform: translate(0, 0);
67
+ }
68
+
69
+ &[data-compact] {
70
+ padding: 0;
71
+ }
72
+ }
73
+
74
+ &-meta {
75
+ border-top: 1px solid @c-border-light;
76
+ }
77
+
78
+ &-desc {
79
+ position: relative;
80
+
81
+ > .markdown {
82
+ padding: 14px 24px;
83
+ border-bottom: 1px dashed @c-border-light;
84
+ }
85
+
86
+ > h5 {
87
+ position: absolute;
88
+ top: -7px;
89
+ left: 20px;
90
+ margin: 0;
91
+ padding: 0 4px;
92
+ display: inline-block;
93
+ font-size: 14px;
94
+ line-height: 1;
95
+ font-weight: 500;
96
+ background: linear-gradient(
97
+ to top,
98
+ rgb(255 255 255 / 100%),
99
+ rgb(255 255 255 / 100%) 50%,
100
+ rgb(255 255 255 / 0%)
101
+ )
102
+ 100%;
103
+
104
+ > a {
105
+ color: @c-text;
106
+
107
+ &:not(:hover) {
108
+ text-decoration: none;
109
+ }
110
+
111
+ > strong {
112
+ padding-right: 8px;
113
+ color: @c-warning;
114
+ font-size: 12px;
115
+ }
116
+ }
117
+ }
118
+ }
119
+
120
+ &-actions {
121
+ display: flex;
122
+ height: 32px;
123
+ align-items: center;
124
+ justify-content: center;
125
+
126
+ &:not(:last-child) {
127
+ border-bottom: 1px dashed @c-border-light;
128
+ }
129
+ }
130
+
131
+ &-action-btn {
132
+ display: flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ width: 24px;
136
+ height: 24px;
137
+ padding: 0;
138
+ border: 0;
139
+ background: transparent;
140
+ cursor: pointer;
141
+
142
+ > svg {
143
+ width: 16px;
144
+ fill: darken(@c-border, 20%);
145
+ transition: fill 0.2s;
146
+ }
147
+
148
+ &:hover > svg {
149
+ fill: darken(@c-border, 30%);
150
+ }
151
+
152
+ &:not(:last-child) {
153
+ margin-right: 4px;
154
+ }
155
+ }
156
+
157
+ &-tabs {
158
+ position: relative;
159
+ padding: 0 12px;
160
+
161
+ &::after {
162
+ content: '';
163
+ position: absolute;
164
+ left: 0;
165
+ bottom: 0;
166
+ width: 100%;
167
+ height: 0;
168
+ border-bottom: 1px dashed @c-border-light;
169
+ }
170
+ }
171
+
172
+ // active
173
+ &[data-active] {
174
+ box-shadow: 0 0 0 4px fade(@c-primary, 10%);
175
+ border-color: lighten(@c-primary, 20%);
176
+ }
177
+
178
+ // debug mode
179
+ &[data-debug] {
180
+ border-color: lighten(@c-warning, 20%);
181
+
182
+ &[data-active] {
183
+ box-shadow: 0 0 0 4px fade(@c-warning, 10%);
184
+ }
185
+ }
186
+ }
187
+
188
+ .@{prefix}-tabs {
189
+ overflow: hidden;
190
+
191
+ &-top {
192
+ flex-direction: column;
193
+
194
+ .@{prefix}-tabs-ink-bar {
195
+ bottom: 0;
196
+ }
197
+ }
198
+
199
+ &-nav {
200
+ display: flex;
201
+
202
+ &-wrap {
203
+ display: flex;
204
+ white-space: nowrap;
205
+ overflow: hidden;
206
+
207
+ &&-ping-left {
208
+ box-shadow: 5px 0 5px -5px rgb(0 0 0 / 10%) inset;
209
+ }
210
+
211
+ &&-ping-right ~ * > .@{prefix}-tabs-nav-more {
212
+ box-shadow: 0 0 5px rgb(0 0 0 / 10%);
213
+ }
214
+ }
215
+
216
+ &-list {
217
+ position: relative;
218
+ z-index: 1;
219
+ display: flex;
220
+ transition: transform 0.2s;
221
+ }
222
+
223
+ &-more {
224
+ height: 100%;
225
+ cursor: pointer;
226
+ background: none;
227
+ border: 0;
228
+ transition: box-shadow 0.2s;
229
+ }
230
+ }
231
+
232
+ &-tab {
233
+ display: flex;
234
+ margin: 0 12px;
235
+
236
+ &-btn {
237
+ padding: 0;
238
+ color: @c-text-secondary;
239
+ font-size: 14px;
240
+ line-height: 36px;
241
+ border: 0;
242
+ outline: none;
243
+ background: transparent;
244
+ box-sizing: border-box;
245
+ cursor: pointer;
246
+ transition: all 0.2s;
247
+
248
+ &:hover {
249
+ color: @c-text;
250
+ }
251
+ }
252
+
253
+ &-active &-btn {
254
+ color: @c-text;
255
+ }
256
+ }
257
+
258
+ &-ink-bar {
259
+ position: absolute;
260
+ height: 1px;
261
+ background: @c-primary;
262
+ transition: left 0.2s, width 0.2s;
263
+ pointer-events: none;
264
+ }
265
+
266
+ &-dropdown {
267
+ position: absolute;
268
+ background: #fff;
269
+ border: 1px solid @c-border;
270
+ max-height: 200px;
271
+ overflow: auto;
272
+
273
+ > ul {
274
+ list-style: none;
275
+ margin: 0;
276
+ padding: 0;
277
+
278
+ > li {
279
+ padding: 4px 12px;
280
+ font-size: 14px;
281
+ cursor: pointer;
282
+
283
+ &:hover {
284
+ color: @c-primary;
285
+ }
286
+
287
+ &:not(:last-child) {
288
+ border-bottom: 1px dashed @c-border;
289
+ }
290
+ }
291
+ }
292
+
293
+ &-hidden {
294
+ display: none;
295
+ }
296
+ }
297
+ }
@@ -0,0 +1,9 @@
1
+ import { type Language } from 'prism-react-renderer';
2
+ import 'prismjs/themes/prism.css';
3
+ import { type FC } from 'react';
4
+ import './index.less';
5
+ declare const SourceCode: FC<{
6
+ children: string;
7
+ lang: Language;
8
+ }>;
9
+ export default SourceCode;
@@ -0,0 +1,87 @@
1
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
+
3
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
+
5
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
+
7
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
8
+
9
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
10
+
11
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
12
+
13
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
+
15
+ import { ReactComponent as IconCheck } from '@ant-design/icons-svg/inline-svg/outlined/check.svg';
16
+ import { ReactComponent as IconCopy } from '@ant-design/icons-svg/inline-svg/outlined/copy.svg';
17
+ import Highlight, { defaultProps } from 'prism-react-renderer';
18
+ import 'prismjs/themes/prism.css';
19
+ import React, { useRef, useState } from 'react';
20
+ import { CopyToClipboard } from 'react-copy-to-clipboard';
21
+ import "./index.less";
22
+ /**
23
+ * define DSL which can be highlighted as similar language
24
+ */
25
+
26
+ var SIMILAR_DSL = {
27
+ acss: 'css',
28
+ axml: 'markup'
29
+ };
30
+
31
+ var SourceCode = function SourceCode(_ref) {
32
+ var children = _ref.children,
33
+ lang = _ref.lang;
34
+ var timer = useRef();
35
+
36
+ var _useState = useState(false),
37
+ _useState2 = _slicedToArray(_useState, 2),
38
+ isCopied = _useState2[0],
39
+ setIsCopied = _useState2[1];
40
+
41
+ return /*#__PURE__*/React.createElement("div", {
42
+ className: "dumi-default-source-code"
43
+ }, /*#__PURE__*/React.createElement(CopyToClipboard, {
44
+ text: children,
45
+ onCopy: function onCopy() {
46
+ setIsCopied(true);
47
+ clearTimeout(timer.current);
48
+ timer.current = window.setTimeout(function () {
49
+ return setIsCopied(false);
50
+ }, 2000);
51
+ }
52
+ }, /*#__PURE__*/React.createElement("button", {
53
+ type: "button",
54
+ className: "dumi-default-source-code-copy",
55
+ "data-copied": isCopied || undefined
56
+ }, isCopied ? /*#__PURE__*/React.createElement(IconCheck, null) : /*#__PURE__*/React.createElement(IconCopy, null))), /*#__PURE__*/React.createElement(Highlight, _extends({}, defaultProps, {
57
+ code: children.trim(),
58
+ language: SIMILAR_DSL[lang] || lang,
59
+ theme: undefined
60
+ }), function (_ref2) {
61
+ var className = _ref2.className,
62
+ style = _ref2.style,
63
+ tokens = _ref2.tokens,
64
+ getLineProps = _ref2.getLineProps,
65
+ getTokenProps = _ref2.getTokenProps;
66
+ return /*#__PURE__*/React.createElement("pre", {
67
+ className: className,
68
+ style: style
69
+ }, tokens.map(function (line, i) {
70
+ return /*#__PURE__*/React.createElement("div", _extends({
71
+ key: String(i)
72
+ }, getLineProps({
73
+ line: line,
74
+ key: i
75
+ })), line.map(function (token, key) {
76
+ return /*#__PURE__*/React.createElement("span", _extends({
77
+ key: String(i)
78
+ }, getTokenProps({
79
+ token: token,
80
+ key: key
81
+ })));
82
+ }));
83
+ }));
84
+ }));
85
+ };
86
+
87
+ export default SourceCode;
@@ -0,0 +1,50 @@
1
+ @import (reference) '../../styles/variables.less';
2
+
3
+ .@{prefix}-source-code {
4
+ @bg-color: tint(@c-site-bg, 50%);
5
+
6
+ position: relative;
7
+ font-size: 14px;
8
+ background-color: @bg-color;
9
+ border-bottom-left-radius: 4px;
10
+ border-bottom-right-radius: 4px;
11
+
12
+ > pre.prism-code {
13
+ margin: 0;
14
+ padding-left: 24px;
15
+ padding-right: 24px;
16
+ background: transparent;
17
+ }
18
+
19
+ &-copy {
20
+ position: absolute;
21
+ top: 9px;
22
+ right: 12px;
23
+ display: inline-block;
24
+ padding: 8px 12px;
25
+ background-color: fade(@bg-color, 80%);
26
+ border: 0;
27
+ border-radius: 2px;
28
+ cursor: pointer;
29
+ transition: all 0.2s;
30
+
31
+ > svg {
32
+ width: 16px;
33
+ fill: darken(@c-border, 20%);
34
+ transition: fill 0.2s;
35
+ }
36
+
37
+ &:hover > svg {
38
+ fill: darken(@c-border, 30%);
39
+ }
40
+
41
+ &[data-copied] > svg {
42
+ fill: rgb(11 174 11);
43
+ }
44
+ }
45
+
46
+ &:not(:hover) &-copy {
47
+ opacity: 0;
48
+ visibility: hidden;
49
+ }
50
+ }
@@ -1,3 +1,4 @@
1
1
  import { type FC } from 'react';
2
+ import './index.less';
2
3
  declare const DocLayout: FC;
3
4
  export default DocLayout;
@@ -1,37 +1,38 @@
1
- import { useOutlet } from 'dumi';
2
- import { useIntl, useRouteMeta } from 'dumi/theme';
1
+ import { useIntl, useOutlet, useRouteMeta } from 'dumi';
3
2
  import Content from 'dumi/theme/slots/Content';
4
3
  import Header from 'dumi/theme/slots/Header';
5
4
  import Sidebar from 'dumi/theme/slots/Sidebar';
6
5
  import React from 'react';
7
6
  import Helmet from 'react-helmet';
7
+ import "./index.less";
8
8
 
9
9
  var DocLayout = function DocLayout() {
10
10
  var intl = useIntl();
11
11
  var outlet = useOutlet();
12
- var meta = useRouteMeta();
13
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Helmet, null, /*#__PURE__*/React.createElement("html", {
12
+
13
+ var _useRouteMeta = useRouteMeta(),
14
+ fm = _useRouteMeta.frontmatter;
15
+
16
+ return /*#__PURE__*/React.createElement("div", {
17
+ className: "dumi-default-doc-layout"
18
+ }, /*#__PURE__*/React.createElement(Helmet, null, /*#__PURE__*/React.createElement("html", {
14
19
  lang: intl.locale.replace(/-.+$/, '')
15
- }), meta.title && /*#__PURE__*/React.createElement("title", null, meta.title), meta.title && /*#__PURE__*/React.createElement("meta", {
20
+ }), fm.title && /*#__PURE__*/React.createElement("title", null, fm.title), fm.title && /*#__PURE__*/React.createElement("meta", {
16
21
  property: "og:title",
17
- content: meta.title
18
- }), meta.description && /*#__PURE__*/React.createElement("meta", {
22
+ content: fm.title
23
+ }), fm.description && /*#__PURE__*/React.createElement("meta", {
19
24
  name: "description",
20
- content: meta.description
21
- }), meta.description && /*#__PURE__*/React.createElement("meta", {
25
+ content: fm.description
26
+ }), fm.description && /*#__PURE__*/React.createElement("meta", {
22
27
  property: "og:description",
23
- content: meta.description
24
- }), meta.keywords && /*#__PURE__*/React.createElement("meta", {
28
+ content: fm.description
29
+ }), fm.keywords && /*#__PURE__*/React.createElement("meta", {
25
30
  name: "keywords",
26
- content: meta.keywords.join(',')
27
- }), meta.keywords && /*#__PURE__*/React.createElement("meta", {
31
+ content: fm.keywords.join(',')
32
+ }), fm.keywords && /*#__PURE__*/React.createElement("meta", {
28
33
  property: "og:keywords",
29
- content: meta.keywords.join(',')
30
- })), /*#__PURE__*/React.createElement(Header, null), /*#__PURE__*/React.createElement("main", {
31
- style: {
32
- display: 'flex'
33
- }
34
- }, /*#__PURE__*/React.createElement(Sidebar, null), /*#__PURE__*/React.createElement(Content, null, outlet)));
34
+ content: fm.keywords.join(',')
35
+ })), /*#__PURE__*/React.createElement(Header, null), /*#__PURE__*/React.createElement("main", null, /*#__PURE__*/React.createElement(Sidebar, null), /*#__PURE__*/React.createElement(Content, null, outlet)));
35
36
  };
36
37
 
37
38
  export default DocLayout;
@@ -0,0 +1,17 @@
1
+ @import (reference) '../../styles/variables.less';
2
+
3
+ body {
4
+ margin: 0;
5
+ padding: 0;
6
+ background-color: @c-site-bg;
7
+ }
8
+
9
+ .@{prefix}-doc-layout {
10
+ max-width: @s-content-width;
11
+ margin: 0 auto;
12
+ padding: 0 24px;
13
+
14
+ > main {
15
+ display: flex;
16
+ }
17
+ }