diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 830a3b6ae5..286cf7a98e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -37,6 +37,7 @@ The most important directories:
- [/packages/core](/packages/core) - Core code which handles workflow
execution, active webhooks and
workflows
+ - [/packages/design-system](/packages/design-system) - Vue frontend components
- [/packages/editor-ui](/packages/editor-ui) - Vue frontend workflow editor
- [/packages/node-dev](/packages/node-dev) - CLI to create new n8n-nodes
- [/packages/nodes-base](/packages/nodes-base) - Base n8n nodes
diff --git a/docker/images/n8n-custom/Dockerfile b/docker/images/n8n-custom/Dockerfile
index 9136e15b17..8b39df673f 100644
--- a/docker/images/n8n-custom/Dockerfile
+++ b/docker/images/n8n-custom/Dockerfile
@@ -14,6 +14,7 @@ COPY lerna.json .
COPY package.json .
COPY packages/cli/ ./packages/cli/
COPY packages/core/ ./packages/core/
+COPY packages/design-system/ ./packages/design-system/
COPY packages/editor-ui/ ./packages/editor-ui/
COPY packages/nodes-base/ ./packages/nodes-base/
COPY packages/workflow/ ./packages/workflow/
diff --git a/packages/design-system/.browserslistrc b/packages/design-system/.browserslistrc
new file mode 100644
index 0000000000..9dee646463
--- /dev/null
+++ b/packages/design-system/.browserslistrc
@@ -0,0 +1,3 @@
+> 1%
+last 2 versions
+not ie <= 8
diff --git a/packages/design-system/.editorconfig b/packages/design-system/.editorconfig
new file mode 100644
index 0000000000..9e24325d41
--- /dev/null
+++ b/packages/design-system/.editorconfig
@@ -0,0 +1,15 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = tab
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[package.json]
+indent_style = space
+indent_size = 2
+
+[*.ts]
+quote_type = single
diff --git a/packages/design-system/.eslintrc.js b/packages/design-system/.eslintrc.js
new file mode 100644
index 0000000000..3d4832a690
--- /dev/null
+++ b/packages/design-system/.eslintrc.js
@@ -0,0 +1,19 @@
+module.exports = {
+ root: true,
+ env: {
+ node: true,
+ },
+ extends: ['plugin:vue/essential', '@vue/typescript'],
+ rules: {
+ 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
+ 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
+ semi: [2, 'always'],
+ indent: ['error', 'tab'],
+ 'comma-dangle': ['error', 'always-multiline'],
+ 'no-tabs': 0,
+ 'no-labels': 0,
+ },
+ parserOptions: {
+ parser: '@typescript-eslint/parser',
+ },
+};
diff --git a/packages/design-system/.npmignore b/packages/design-system/.npmignore
new file mode 100644
index 0000000000..15ceddfd7f
--- /dev/null
+++ b/packages/design-system/.npmignore
@@ -0,0 +1,26 @@
+.DS_Store
+storybook-static
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+*.md
+*.stories.js
+*.mdx
diff --git a/packages/design-system/.storybook/font-awesome-icons.js b/packages/design-system/.storybook/font-awesome-icons.js
new file mode 100644
index 0000000000..ca24a7f7a8
--- /dev/null
+++ b/packages/design-system/.storybook/font-awesome-icons.js
@@ -0,0 +1,169 @@
+/**
+ * These icons are only defined for storybook build
+ * Editor icons are defined seperately
+ */
+import { library } from '@fortawesome/fontawesome-svg-core';
+import {
+ faAngleDoubleLeft,
+ faAngleDown,
+ faAngleRight,
+ faAngleUp,
+ faArrowLeft,
+ faArrowRight,
+ faAt,
+ faBook,
+ faBug,
+ faCalendar,
+ faCheck,
+ faChevronDown,
+ faChevronUp,
+ faCode,
+ faCodeBranch,
+ faCog,
+ faCogs,
+ faClone,
+ faCloud,
+ faCloudDownloadAlt,
+ faCopy,
+ faCut,
+ faDotCircle,
+ faEdit,
+ faEnvelope,
+ faEye,
+ faExclamationTriangle,
+ faExpand,
+ faExternalLinkAlt,
+ faExchangeAlt,
+ faFile,
+ faFileArchive,
+ faFileCode,
+ faFileDownload,
+ faFileExport,
+ faFileImport,
+ faFilePdf,
+ faFolderOpen,
+ faGift,
+ faHdd,
+ faHome,
+ faHourglass,
+ faImage,
+ faInbox,
+ faInfo,
+ faInfoCircle,
+ faKey,
+ faMapSigns,
+ faNetworkWired,
+ faPause,
+ faPen,
+ faPlay,
+ faPlayCircle,
+ faPlus,
+ faPlusCircle,
+ faQuestion,
+ faQuestionCircle,
+ faRedo,
+ faRss,
+ faSave,
+ faSearch,
+ faSearchMinus,
+ faSearchPlus,
+ faServer,
+ faSignInAlt,
+ faSlidersH,
+ faSpinner,
+ faStop,
+ faSun,
+ faSync,
+ faSyncAlt,
+ faTable,
+ faTasks,
+ faTerminal,
+ faThLarge,
+ faTimes,
+ faTrash,
+ faUndo,
+ faUsers,
+ faClock,
+} from '@fortawesome/free-solid-svg-icons';
+import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
+
+library.add(faAngleDoubleLeft);
+library.add(faAngleDown);
+library.add(faAngleRight);
+library.add(faAngleUp);
+library.add(faArrowLeft);
+library.add(faArrowRight);
+library.add(faAt);
+library.add(faBook);
+library.add(faBug);
+library.add(faCalendar);
+library.add(faCheck);
+library.add(faChevronDown);
+library.add(faChevronUp);
+library.add(faCode);
+library.add(faCodeBranch);
+library.add(faCog);
+library.add(faCogs);
+library.add(faClone);
+library.add(faCloud);
+library.add(faCloudDownloadAlt);
+library.add(faCopy);
+library.add(faCut);
+library.add(faDotCircle);
+library.add(faEdit);
+library.add(faEnvelope);
+library.add(faEye);
+library.add(faExclamationTriangle);
+library.add(faExpand);
+library.add(faExternalLinkAlt);
+library.add(faExchangeAlt);
+library.add(faFile);
+library.add(faFileArchive);
+library.add(faFileCode);
+library.add(faFileDownload);
+library.add(faFileExport);
+library.add(faFileImport);
+library.add(faFilePdf);
+library.add(faFolderOpen);
+library.add(faGift);
+library.add(faHdd);
+library.add(faHome);
+library.add(faHourglass);
+library.add(faImage);
+library.add(faInbox);
+library.add(faInfo);
+library.add(faInfoCircle);
+library.add(faKey);
+library.add(faMapSigns);
+library.add(faNetworkWired);
+library.add(faPause);
+library.add(faPen);
+library.add(faPlay);
+library.add(faPlayCircle);
+library.add(faPlus);
+library.add(faPlusCircle);
+library.add(faQuestion);
+library.add(faQuestionCircle);
+library.add(faRedo);
+library.add(faRss);
+library.add(faSave);
+library.add(faSearch);
+library.add(faSearchMinus);
+library.add(faSearchPlus);
+library.add(faServer);
+library.add(faSignInAlt);
+library.add(faSlidersH);
+library.add(faSpinner);
+library.add(faStop);
+library.add(faSun);
+library.add(faSync);
+library.add(faSyncAlt);
+library.add(faTable);
+library.add(faTasks);
+library.add(faTerminal);
+library.add(faThLarge);
+library.add(faTimes);
+library.add(faTrash);
+library.add(faUndo);
+library.add(faUsers);
+library.add(faClock);
diff --git a/packages/design-system/.storybook/fonts.scss b/packages/design-system/.storybook/fonts.scss
new file mode 100644
index 0000000000..e6e5ab65d6
--- /dev/null
+++ b/packages/design-system/.storybook/fonts.scss
@@ -0,0 +1 @@
+@import url('https://fonts.googleapis.com/css?family=Open+Sans&display=swap');
diff --git a/packages/design-system/.storybook/main.js b/packages/design-system/.storybook/main.js
new file mode 100644
index 0000000000..9cd8b91c03
--- /dev/null
+++ b/packages/design-system/.storybook/main.js
@@ -0,0 +1,38 @@
+const path = require('path');
+
+module.exports = {
+ stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
+ addons: [
+ '@storybook/addon-links',
+ '@storybook/addon-essentials',
+ 'storybook-addon-designs',
+ 'storybook-addon-themes',
+ ],
+ webpackFinal: async (config, { configType }) => {
+ config.module.rules.push({
+ test: /\.scss$/,
+ oneOf: [
+ {
+ resourceQuery: /module/,
+ use: [
+ 'vue-style-loader',
+ {
+ loader: 'css-loader',
+ options: {
+ modules: true,
+ },
+ },
+ 'sass-loader',
+ ],
+ include: path.resolve(__dirname, '../'),
+ },
+ {
+ use: ['vue-style-loader', 'css-loader', 'sass-loader'],
+ include: path.resolve(__dirname, '../'),
+ },
+ ],
+ });
+
+ return config;
+ },
+};
diff --git a/packages/design-system/.storybook/preview.js b/packages/design-system/.storybook/preview.js
new file mode 100644
index 0000000000..e914e03921
--- /dev/null
+++ b/packages/design-system/.storybook/preview.js
@@ -0,0 +1,65 @@
+import './font-awesome-icons';
+import './storybook.scss';
+
+import lang from 'element-ui/lib/locale/lang/en';
+import locale from 'element-ui/lib/locale';
+
+import Vue from 'vue';
+
+locale.use(lang);
+
+// https://github.com/storybookjs/storybook/issues/6153
+Vue.prototype.toJSON = function () {
+ return this;
+};
+
+export const parameters = {
+ actions: {
+ argTypesRegex: '^on[A-Z].*',
+ },
+ controls: {
+ matchers: {
+ color: /(background|color)$/i,
+ date: /Date$/,
+ },
+ },
+ backgrounds: {
+ default: '--color-background-xlight',
+ values: [
+ {
+ name: '--color-background-dark',
+ value: 'var(--color-background-dark)',
+ },
+ {
+ name: '--color-background-base',
+ value: 'var(--color-background-base)',
+ },
+ {
+ name: '--color-background-light',
+ value: 'var(--color-background-light)',
+ },
+ {
+ name: '--color-background-lighter',
+ value: 'var(--color-background-lighter)',
+ },
+ {
+ name: '--color-background-xlight',
+ value: 'var(--color-background-xlight)',
+ },
+ ],
+ },
+ themes: {
+ list: [
+ {
+ name: 'dark',
+ class: 'theme-dark',
+ color: '#000',
+ },
+ ],
+ },
+ options: {
+ storySort: {
+ order: ['Docs', 'Styleguide', 'Atoms'],
+ },
+ },
+};
diff --git a/packages/design-system/.storybook/storybook.scss b/packages/design-system/.storybook/storybook.scss
new file mode 100644
index 0000000000..604fe53985
--- /dev/null
+++ b/packages/design-system/.storybook/storybook.scss
@@ -0,0 +1,12 @@
+@use "./fonts.scss";
+
+@use "~/theme/src/base.scss" with (
+ $font-path: '~element-ui/lib/theme-chalk/fonts',
+);
+
+@use "~/theme/src/reset.scss";
+@use "~/theme/src/index.scss";
+
+.multi-container > * {
+ margin-bottom: 10px;
+}
diff --git a/packages/design-system/LICENSE.md b/packages/design-system/LICENSE.md
new file mode 100644
index 0000000000..3c24ea75af
--- /dev/null
+++ b/packages/design-system/LICENSE.md
@@ -0,0 +1,228 @@
+“Commons Clause” License Condition v1.0
+
+The Software is provided to you by the Licensor under the
+License, as defined below, subject to the following condition.
+
+Without limiting other conditions in the License, the grant
+of rights under the License will not include, and the License
+does not grant to you, the right to Sell the Software.
+
+For purposes of the foregoing, “Sell” means practicing any or
+all of the rights granted to you under the License to provide
+to third parties, for a fee or other consideration (including
+without limitation fees for hosting or consulting/ support
+services related to the Software), a product or service whose
+value derives, entirely or substantially, from the functionality
+of the Software. Any license notice or attribution required by
+the License must also include this Commons Clause License
+Condition notice.
+
+Software: n8n
+
+License: Apache 2.0 with Commons Clause
+
+Licensor: n8n GmbH
+
+---
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright 2021 n8n GmbH
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/packages/design-system/README.md b/packages/design-system/README.md
new file mode 100644
index 0000000000..044b67facd
--- /dev/null
+++ b/packages/design-system/README.md
@@ -0,0 +1,45 @@
+# n8n-design-system
+
+A component system for [n8n](https://n8n.io) using Storybook to preview.
+
+## Project setup
+
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+
+```
+npm run storybook
+```
+
+### Build static pages
+
+```
+npm run build:storybook
+```
+
+### Run your unit tests
+
+```
+npm run test:unit
+```
+
+### Lints and fixes files
+
+```
+npm run lint
+```
+
+### Build css files
+
+```
+npm run build:theme
+```
+
+### Monitor theme files and build any changes
+
+```
+npm run watch:theme
+```
diff --git a/packages/design-system/babel.config.js b/packages/design-system/babel.config.js
new file mode 100644
index 0000000000..7a1252c310
--- /dev/null
+++ b/packages/design-system/babel.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ presets: ['@vue/cli-plugin-babel/preset'],
+ plugins: [
+ ['@babel/plugin-proposal-private-property-in-object', { loose: true }],
+ ],
+};
diff --git a/packages/design-system/gulpfile.js b/packages/design-system/gulpfile.js
new file mode 100644
index 0000000000..b3da277cd9
--- /dev/null
+++ b/packages/design-system/gulpfile.js
@@ -0,0 +1,36 @@
+'use strict';
+
+const gulp = require('gulp');
+const sass = require('gulp-dart-sass');
+const autoprefixer = require('gulp-autoprefixer');
+const cleanCSS = require('gulp-clean-css');
+
+gulp.task('build:theme', gulp.series([compileTheme, copyThemeFonts]));
+
+gulp.task(
+ 'watch:theme',
+ gulp.series([
+ 'build:theme',
+ () => {
+ gulp.watch('./theme/src/**/*.scss', gulp.series(['build:theme']));
+ },
+ ]),
+);
+
+function compileTheme() {
+ return gulp
+ .src('./theme/src/index.scss')
+ .pipe(sass.sync())
+ .pipe(
+ autoprefixer({
+ browsers: ['ie > 9', 'last 2 versions'],
+ cascade: false,
+ }),
+ )
+ .pipe(cleanCSS())
+ .pipe(gulp.dest('./theme/dist'));
+}
+
+function copyThemeFonts() {
+ return gulp.src('./theme/src/fonts/**').pipe(gulp.dest('./theme/dist/fonts'));
+}
diff --git a/packages/design-system/jest.config.js b/packages/design-system/jest.config.js
new file mode 100644
index 0000000000..ce8dfc33cd
--- /dev/null
+++ b/packages/design-system/jest.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel',
+};
diff --git a/packages/design-system/package.json b/packages/design-system/package.json
new file mode 100644
index 0000000000..399ab82047
--- /dev/null
+++ b/packages/design-system/package.json
@@ -0,0 +1,81 @@
+{
+ "name": "n8n-design-system",
+ "version": "0.1.0",
+ "license": "SEE LICENSE IN LICENSE.md",
+ "homepage": "https://n8n.io",
+ "author": {
+ "name": "Mutasem Aldmour",
+ "email": "mutasem@n8n.io"
+ },
+ "main": "src/main.js",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/n8n-io/n8n.git"
+ },
+ "scripts": {
+ "build": "npm run build:theme",
+ "build:vue": "vue-cli-service build --target lib ./src/main.js --report",
+ "dev": "npm run watch:theme",
+ "test": "npm run test:unit",
+ "build:storybook": "build-storybook",
+ "storybook": "start-storybook -p 6006",
+ "test:unit": "vue-cli-service test:unit --passWithNoTests",
+ "lint": "vue-cli-service lint",
+ "build:theme": "gulp build:theme",
+ "watch:theme": "gulp watch:theme",
+ "tslint": "tslint -p tsconfig.json -c tslint.json",
+ "tslintfix": "tslint --fix -p tsconfig.json -c tslint.json"
+ },
+ "peerDependencies": {
+ "@fortawesome/fontawesome-svg-core": "1.x",
+ "@fortawesome/free-solid-svg-icons": "5.x",
+ "@fortawesome/vue-fontawesome": "2.x",
+ "core-js": "3.x",
+ "element-ui": "2.13.x"
+ },
+ "devDependencies": {
+ "@fortawesome/fontawesome-svg-core": "^1.2.35",
+ "@fortawesome/free-solid-svg-icons": "^5.15.3",
+ "@fortawesome/vue-fontawesome": "^2.0.2",
+ "core-js": "^3.6.5",
+ "element-ui": "~2.13.0",
+ "storybook-addon-themes": "^6.1.0",
+ "vue": "^2.6.11",
+ "vue-class-component": "^7.2.3",
+ "vue-property-decorator": "^9.1.2",
+ "@babel/core": "^7.14.6",
+ "@storybook/addon-actions": "^6.3.6",
+ "@storybook/addon-essentials": "^6.3.6",
+ "@storybook/addon-links": "^6.3.6",
+ "@storybook/vue": "^6.3.6",
+ "@types/jest": "^26.0.13",
+ "@typescript-eslint/eslint-plugin": "^4.18.0",
+ "@typescript-eslint/parser": "^4.18.0",
+ "@vue/cli-plugin-babel": "~4.5.0",
+ "@vue/cli-plugin-eslint": "~4.5.0",
+ "@vue/cli-plugin-typescript": "~4.5.0",
+ "@vue/cli-plugin-unit-jest": "~4.5.0",
+ "@vue/cli-service": "~4.5.0",
+ "@vue/eslint-config-prettier": "^6.0.0",
+ "@vue/eslint-config-typescript": "^7.0.0",
+ "@vue/test-utils": "^1.0.3",
+ "babel-loader": "^8.2.2",
+ "eslint": "^6.8.0",
+ "eslint-plugin-prettier": "^3.3.1",
+ "eslint-plugin-vue": "^6.2.2",
+ "fibers": "^5.0.0",
+ "gulp": "^4.0.0",
+ "prettier": "^2.2.1",
+ "sass": "^1.26.5",
+ "sass-loader": "^8.0.2",
+ "storybook-addon-designs": "^6.0.1",
+ "typescript": "~3.9.7",
+ "vue-loader": "^15.9.7",
+ "vue-template-compiler": "^2.6.11",
+ "gulp-autoprefixer": "^4.0.0",
+ "gulp-clean-css": "^4.3.0",
+ "gulp-dart-sass": "^1.0.2",
+ "node-notifier": ">=8.0.1",
+ "trim": ">=0.0.3"
+ }
+}
diff --git a/packages/design-system/src/components/N8nButton/Button.stories.js b/packages/design-system/src/components/N8nButton/Button.stories.js
new file mode 100644
index 0000000000..504ea1af38
--- /dev/null
+++ b/packages/design-system/src/components/N8nButton/Button.stories.js
@@ -0,0 +1,122 @@
+import N8nButton from './Button.vue';
+import { action } from '@storybook/addon-actions';
+
+export default {
+ title: 'Atoms/Button',
+ component: N8nButton,
+ argTypes: {
+ label: {
+ control: 'text',
+ },
+ title: {
+ control: 'text',
+ },
+ type: {
+ control: 'select',
+ options: ['primary', 'outline', 'light', 'text'],
+ },
+ size: {
+ control: {
+ type: 'select',
+ options: ['small', 'medium', 'large'],
+ },
+ },
+ loading: {
+ control: {
+ type: 'boolean',
+ },
+ },
+ icon: {
+ control: {
+ type: 'text',
+ },
+ },
+ iconSize: {
+ control: {
+ type: 'select',
+ options: ['small', 'medium', 'large'],
+ },
+ },
+ circle: {
+ control: {
+ type: 'boolean',
+ },
+ },
+ fullWidth: {
+ type: 'boolean',
+ },
+ theme: {
+ type: 'select',
+ options: ['success', 'danger', 'warning'],
+ },
+ float: {
+ type: 'select',
+ options: ['left', 'right'],
+ },
+ },
+ parameters: {
+ design: {
+ type: 'figma',
+ url: 'https://www.figma.com/file/DxLbnIyMK8X0uLkUguFV4n/n8n-design-system_v1?node-id=5%3A1147',
+ },
+ },
+};
+
+const methods = {
+ onClick: action('click'),
+};
+
+const Template = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nButton,
+ },
+ template: ' ',
+ methods,
+});
+
+export const Button = Template.bind({});
+Button.args = {
+ label: 'Button',
+};
+
+const ManyTemplate = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nButton,
+ },
+ template:
+ '
',
+ methods,
+});
+
+export const Primary = ManyTemplate.bind({});
+Primary.args = {
+ type: 'primary',
+ label: 'Button',
+};
+
+export const Outline = ManyTemplate.bind({});
+Outline.args = {
+ type: 'outline',
+ label: 'Button',
+};
+
+export const Light = ManyTemplate.bind({});
+Light.args = {
+ type: 'light',
+ label: 'Button',
+};
+
+export const WithIcon = ManyTemplate.bind({});
+WithIcon.args = {
+ label: 'Button',
+ icon: 'plus-circle',
+};
+
+export const Text = ManyTemplate.bind({});
+Text.args = {
+ type: 'text',
+ label: 'Button',
+ icon: 'plus-circle',
+};
diff --git a/packages/design-system/src/components/N8nButton/Button.vue b/packages/design-system/src/components/N8nButton/Button.vue
new file mode 100644
index 0000000000..fc10624442
--- /dev/null
+++ b/packages/design-system/src/components/N8nButton/Button.vue
@@ -0,0 +1,299 @@
+
+ listeners.click && listeners.click(e)"
+ >
+
+
+
+
+ {{ props.label }}
+
+
+
+
+
+
diff --git a/packages/design-system/src/components/N8nButton/index.d.ts b/packages/design-system/src/components/N8nButton/index.d.ts
new file mode 100644
index 0000000000..b70b0b8418
--- /dev/null
+++ b/packages/design-system/src/components/N8nButton/index.d.ts
@@ -0,0 +1,46 @@
+import { N8nComponent, N8nComponentSize } from '../component';
+
+/** Button type */
+export type ButtonType = 'primary' | 'outline' | 'light' | 'text';
+
+/** Button themes */
+export type ButtonTheme = 'success' | 'warning' | 'danger';
+
+/** Button Component */
+export declare class N8nButton extends N8nComponent {
+ /** Button text */
+ label: string;
+
+ /** Button title on hover */
+ title: string;
+
+ /** Color scheme */
+ theme: ButtonTheme;
+
+ /** Button size */
+ size: N8nComponentSize;
+
+ /** Button type */
+ type: ButtonType;
+
+ /** Determine whether it's a circular button */
+ circle: boolean;
+
+ /** Determine whether it's loading */
+ loading: boolean;
+
+ /** Disable the button */
+ disabled: boolean;
+
+ /** Button icon, accepts an icon name of font awesome icon component */
+ icon: string;
+
+ /** Size of icon */
+ iconSize: N8nComponentSize;
+
+ /** Full width */
+ fullWidth: boolean;
+
+ /** Float left or right */
+ float: boolean;
+}
diff --git a/packages/design-system/src/components/N8nButton/index.js b/packages/design-system/src/components/N8nButton/index.js
new file mode 100644
index 0000000000..f477689bf3
--- /dev/null
+++ b/packages/design-system/src/components/N8nButton/index.js
@@ -0,0 +1,3 @@
+import N8nButton from './Button.vue';
+
+export default N8nButton;
diff --git a/packages/design-system/src/components/N8nIcon/Icon.stories.js b/packages/design-system/src/components/N8nIcon/Icon.stories.js
new file mode 100644
index 0000000000..0b626a5768
--- /dev/null
+++ b/packages/design-system/src/components/N8nIcon/Icon.stories.js
@@ -0,0 +1,45 @@
+import N8nIcon from './Icon.vue';
+
+export default {
+ title: 'Atoms/Icon',
+ component: N8nIcon,
+ argTypes: {
+ icon: {
+ control: 'text',
+ },
+ size: {
+ control: {
+ type: 'select',
+ options: ['small', 'medium', 'large'],
+ },
+ },
+ spin: {
+ control: {
+ type: 'boolean',
+ },
+ },
+ },
+};
+
+const Template = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nIcon,
+ },
+ template: ' ',
+});
+
+export const Clock = Template.bind({});
+Clock.args = {
+ icon: 'clock',
+};
+
+export const Plus = Template.bind({});
+Plus.args = {
+ icon: 'plus',
+};
+
+export const Stop = Template.bind({});
+Stop.args = {
+ icon: 'stop',
+};
diff --git a/packages/design-system/src/components/N8nIcon/Icon.vue b/packages/design-system/src/components/N8nIcon/Icon.vue
new file mode 100644
index 0000000000..52457db0ac
--- /dev/null
+++ b/packages/design-system/src/components/N8nIcon/Icon.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
diff --git a/packages/design-system/src/components/N8nIcon/index.d.ts b/packages/design-system/src/components/N8nIcon/index.d.ts
new file mode 100644
index 0000000000..62181a33b6
--- /dev/null
+++ b/packages/design-system/src/components/N8nIcon/index.d.ts
@@ -0,0 +1,13 @@
+import { N8nComponent, N8nComponentSize } from '../component';
+
+/** Button Component */
+export declare class N8nIcon extends N8nComponent {
+ /** icon name, accepts an icon name of font awesome icon component */
+ icon: string;
+
+ /** Size of icon */
+ size: N8nComponentSize;
+
+ /** Whether icon should be spinning */
+ spin: boolean;
+}
diff --git a/packages/design-system/src/components/N8nIcon/index.js b/packages/design-system/src/components/N8nIcon/index.js
new file mode 100644
index 0000000000..aeb12bb638
--- /dev/null
+++ b/packages/design-system/src/components/N8nIcon/index.js
@@ -0,0 +1,3 @@
+import Icon from './Icon.vue';
+
+export default Icon;
diff --git a/packages/design-system/src/components/N8nIconButton/IconButton.stories.js b/packages/design-system/src/components/N8nIconButton/IconButton.stories.js
new file mode 100644
index 0000000000..fe99328783
--- /dev/null
+++ b/packages/design-system/src/components/N8nIconButton/IconButton.stories.js
@@ -0,0 +1,98 @@
+import N8nIconButton from './IconButton.vue';
+import { action } from '@storybook/addon-actions';
+
+export default {
+ title: 'Atoms/Icon Button',
+ component: N8nIconButton,
+ argTypes: {
+ type: {
+ control: 'select',
+ options: ['primary', 'outline', 'light', 'text'],
+ },
+ title: {
+ control: 'text',
+ },
+ size: {
+ control: {
+ type: 'select',
+ options: ['small', 'medium', 'large', 'xlarge'],
+ },
+ },
+ loading: {
+ control: {
+ type: 'boolean',
+ },
+ },
+ icon: {
+ control: {
+ type: 'text',
+ },
+ },
+ theme: {
+ control: {
+ type: 'select',
+ options: ['success', 'warning', 'danger'],
+ },
+ },
+ },
+ parameters: {
+ backgrounds: { default: '--color-background-light' },
+ },
+};
+
+const methods = {
+ onClick: action('click'),
+};
+
+const Template = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nIconButton,
+ },
+ template: ' ',
+ methods,
+});
+
+export const Button = Template.bind({});
+Button.args = {
+ icon: 'plus',
+ title: 'my title',
+};
+
+const ManyTemplate = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nIconButton,
+ },
+ template:
+ '
',
+ methods,
+});
+
+export const Primary = ManyTemplate.bind({});
+Primary.args = {
+ icon: 'plus',
+ title: 'my title',
+ type: 'primary',
+};
+
+export const Outline = ManyTemplate.bind({});
+Outline.args = {
+ icon: 'plus',
+ title: 'my title',
+ type: 'outline',
+};
+
+export const Light = ManyTemplate.bind({});
+Light.args = {
+ icon: 'plus',
+ title: 'my title',
+ type: 'light',
+};
+
+export const Text = ManyTemplate.bind({});
+Text.args = {
+ icon: 'plus',
+ title: 'my title',
+ type: 'text',
+};
diff --git a/packages/design-system/src/components/N8nIconButton/IconButton.vue b/packages/design-system/src/components/N8nIconButton/IconButton.vue
new file mode 100644
index 0000000000..0ace9defb8
--- /dev/null
+++ b/packages/design-system/src/components/N8nIconButton/IconButton.vue
@@ -0,0 +1,60 @@
+
+ listeners.click && listeners.click(e)"
+ circle
+ />
+
+
+
diff --git a/packages/design-system/src/components/N8nIconButton/index.d.ts b/packages/design-system/src/components/N8nIconButton/index.d.ts
new file mode 100644
index 0000000000..d939a7e040
--- /dev/null
+++ b/packages/design-system/src/components/N8nIconButton/index.d.ts
@@ -0,0 +1,29 @@
+import { N8nComponent, N8nComponentSize } from '../component';
+import { ButtonTheme, ButtonType } from '../N8nButton';
+
+/** Icon Button Component */
+export declare class N8nIconButton extends N8nComponent {
+ /** Button type */
+ type: ButtonType;
+
+ /** Button title on hover */
+ title: string;
+
+ /** Button size */
+ size: N8nComponentSize | 'xlarge';
+
+ /** icon size */
+ iconSize: N8nComponentSize;
+
+ /** Determine whether it's loading */
+ loading: boolean;
+
+ /** Disable the button */
+ disabled: boolean;
+
+ /** Button icon, accepts an icon name of font awesome icon component */
+ icon: string;
+
+ /** Button theme */
+ theme: ButtonTheme;
+}
diff --git a/packages/design-system/src/components/N8nIconButton/index.js b/packages/design-system/src/components/N8nIconButton/index.js
new file mode 100644
index 0000000000..bcad6cbea7
--- /dev/null
+++ b/packages/design-system/src/components/N8nIconButton/index.js
@@ -0,0 +1,3 @@
+import IconButton from './IconButton.vue';
+
+export default IconButton;
diff --git a/packages/design-system/src/components/N8nInput/Input.stories.js b/packages/design-system/src/components/N8nInput/Input.stories.js
new file mode 100644
index 0000000000..ee8c637f9a
--- /dev/null
+++ b/packages/design-system/src/components/N8nInput/Input.stories.js
@@ -0,0 +1,122 @@
+import N8nInput from './Input.vue';
+import N8nIcon from '../N8nIcon';
+import { action } from '@storybook/addon-actions';
+
+export default {
+ title: 'Atoms/Input',
+ component: N8nInput,
+ argTypes: {
+ type: {
+ control: 'select',
+ options: ['text', 'textarea'],
+ },
+ placeholder: {
+ control: 'text',
+ },
+ disabled: {
+ control: {
+ type: 'boolean',
+ },
+ },
+ size: {
+ control: 'select',
+ options: ['xlarge', 'large', 'medium', 'small', 'mini'],
+ },
+ },
+ parameters: {
+ backgrounds: { default: '--color-background-light' },
+ },
+};
+
+const methods = {
+ onInput: action('input'),
+ onFocus: action('input'),
+ onChange: action('input'),
+};
+
+const Template = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nInput,
+ },
+ template: ' ',
+ data() {
+ return {
+ val: '',
+ };
+ },
+ methods,
+});
+
+export const Input = Template.bind({});
+Input.args = {
+ placeholder: 'placeholder...',
+};
+
+const ManyTemplate = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nInput,
+ },
+ template:
+ '
',
+ methods,
+ data() {
+ return {
+ val: '',
+ };
+ },
+});
+
+export const Text = ManyTemplate.bind({});
+Text.args = {
+ type: 'text',
+ placeholder: 'placeholder...',
+};
+
+export const TextArea = ManyTemplate.bind({});
+TextArea.args = {
+ type: 'textarea',
+ placeholder: 'placeholder...',
+};
+
+
+const WithPrefix = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nIcon,
+ N8nInput,
+ },
+ template: ' ',
+ data() {
+ return {
+ val: '',
+ };
+ },
+ methods,
+});
+
+export const WithPrefixIcon = WithPrefix.bind({});
+WithPrefixIcon.args = {
+ placeholder: 'placeholder...',
+};
+
+const WithSuffix = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nIcon,
+ N8nInput,
+ },
+ template: ' ',
+ data() {
+ return {
+ val: '',
+ };
+ },
+ methods,
+});
+
+export const WithSuffixIcon = WithSuffix.bind({});
+WithSuffixIcon.args = {
+ placeholder: 'placeholder...',
+};
diff --git a/packages/design-system/src/components/N8nInput/Input.vue b/packages/design-system/src/components/N8nInput/Input.vue
new file mode 100644
index 0000000000..50734fcdee
--- /dev/null
+++ b/packages/design-system/src/components/N8nInput/Input.vue
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/design-system/src/components/N8nInput/index.js b/packages/design-system/src/components/N8nInput/index.js
new file mode 100644
index 0000000000..bbd9777415
--- /dev/null
+++ b/packages/design-system/src/components/N8nInput/index.js
@@ -0,0 +1,3 @@
+import N8nInput from './Input.vue';
+
+export default N8nInput;
diff --git a/packages/design-system/src/components/N8nInputLabel/InputLabel.stories.js b/packages/design-system/src/components/N8nInputLabel/InputLabel.stories.js
new file mode 100644
index 0000000000..828d22b113
--- /dev/null
+++ b/packages/design-system/src/components/N8nInputLabel/InputLabel.stories.js
@@ -0,0 +1,27 @@
+import N8nInputLabel from './InputLabel.vue';
+import N8nInput from '../N8nInput';
+
+export default {
+ title: 'Atoms/Input Label',
+ component: N8nInputLabel,
+ argTypes: {},
+ parameters: {
+ backgrounds: { default: '--color-background-light' },
+ },
+};
+
+const Template = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nInputLabel,
+ N8nInput,
+ },
+ template:
+ '
',
+});
+
+export const InputLabel = Template.bind({});
+InputLabel.args = {
+ label: 'input label',
+ tooltipText: 'more info...',
+};
diff --git a/packages/design-system/src/components/N8nInputLabel/InputLabel.vue b/packages/design-system/src/components/N8nInputLabel/InputLabel.vue
new file mode 100644
index 0000000000..c800f73de8
--- /dev/null
+++ b/packages/design-system/src/components/N8nInputLabel/InputLabel.vue
@@ -0,0 +1,57 @@
+
+
+
+
+ {{ props.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/design-system/src/components/N8nInputLabel/index.js b/packages/design-system/src/components/N8nInputLabel/index.js
new file mode 100644
index 0000000000..0b6438a472
--- /dev/null
+++ b/packages/design-system/src/components/N8nInputLabel/index.js
@@ -0,0 +1,3 @@
+import N8nInputLabel from './InputLabel.vue';
+
+export default N8nInputLabel;
diff --git a/packages/design-system/src/components/N8nInputNumber/InputNumber.stories.js b/packages/design-system/src/components/N8nInputNumber/InputNumber.stories.js
new file mode 100644
index 0000000000..aec44f1838
--- /dev/null
+++ b/packages/design-system/src/components/N8nInputNumber/InputNumber.stories.js
@@ -0,0 +1,94 @@
+import N8nInputNumber from './InputNumber.vue';
+import { action } from '@storybook/addon-actions';
+
+export default {
+ title: 'Atoms/Input Number',
+ component: N8nInputNumber,
+ argTypes: {
+ placeholder: {
+ control: 'text',
+ },
+ disabled: {
+ control: {
+ type: 'boolean',
+ },
+ },
+ controls: {
+ control: {
+ type: 'boolean',
+ },
+ },
+ precision: {
+ control: {
+ type: 'number',
+ },
+ },
+ min: {
+ control: {
+ type: 'number',
+ },
+ },
+ max: {
+ control: {
+ type: 'number',
+ },
+ },
+ step: {
+ control: {
+ type: 'number',
+ },
+ },
+ title: {
+ control: 'text',
+ },
+ },
+ parameters: {
+ backgrounds: { default: '--color-background-light' },
+ },
+};
+
+const methods = {
+ onInput: action('input'),
+};
+
+const Template = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nInputNumber,
+ },
+ template: ' ',
+ data() {
+ return {
+ val: null,
+ };
+ },
+ methods,
+});
+
+export const Input = Template.bind({});
+Input.args = {
+ placeholder: 'placeholder...',
+ controls: false,
+};
+
+const ManyTemplate = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nInputNumber,
+ },
+ template:
+ '
',
+ methods,
+ data() {
+ return {
+ val: '',
+ };
+ },
+});
+
+export const Sizes = ManyTemplate.bind({});
+Sizes.args = {
+ placeholder: 'placeholder...',
+ controls: false,
+};
+
diff --git a/packages/design-system/src/components/N8nInputNumber/InputNumber.vue b/packages/design-system/src/components/N8nInputNumber/InputNumber.vue
new file mode 100644
index 0000000000..b2ac52b2c8
--- /dev/null
+++ b/packages/design-system/src/components/N8nInputNumber/InputNumber.vue
@@ -0,0 +1,7 @@
+
diff --git a/packages/design-system/src/components/N8nInputNumber/index.js b/packages/design-system/src/components/N8nInputNumber/index.js
new file mode 100644
index 0000000000..187d727e0e
--- /dev/null
+++ b/packages/design-system/src/components/N8nInputNumber/index.js
@@ -0,0 +1,3 @@
+import N8nInputNumber from './InputNumber.vue';
+
+export default N8nInputNumber;
diff --git a/packages/design-system/src/components/N8nOption/Option.vue b/packages/design-system/src/components/N8nOption/Option.vue
new file mode 100644
index 0000000000..f7e0ef8a49
--- /dev/null
+++ b/packages/design-system/src/components/N8nOption/Option.vue
@@ -0,0 +1,7 @@
+
diff --git a/packages/design-system/src/components/N8nOption/index.js b/packages/design-system/src/components/N8nOption/index.js
new file mode 100644
index 0000000000..c4c5c93ec8
--- /dev/null
+++ b/packages/design-system/src/components/N8nOption/index.js
@@ -0,0 +1,3 @@
+import N8nOption from './Option.vue';
+
+export default N8nOption;
diff --git a/packages/design-system/src/components/N8nSelect/Select.stories.js b/packages/design-system/src/components/N8nSelect/Select.stories.js
new file mode 100644
index 0000000000..824c858ace
--- /dev/null
+++ b/packages/design-system/src/components/N8nSelect/Select.stories.js
@@ -0,0 +1,138 @@
+import N8nSelect from './Select.vue';
+import N8nOption from '../N8nOption';
+import { action } from '@storybook/addon-actions';
+
+export default {
+ title: 'Atoms/Select',
+ component: N8nSelect,
+ argTypes: {
+ disabled: {
+ control: {
+ type: 'boolean',
+ },
+ },
+ size: {
+ control: {
+ type: 'select',
+ options: ['large', 'medium', 'small', 'mini'],
+ },
+ },
+ loading: {
+ control: {
+ type: 'boolean',
+ },
+ },
+ filterable: {
+ control: {
+ type: 'boolean',
+ },
+ },
+ defaultFirstOption: {
+ control: {
+ type: 'boolean',
+ },
+ },
+ },
+ parameters: {
+ backgrounds: { default: '--color-background-light' },
+ },
+};
+
+const methods = {
+ onInput: action('input'),
+ onChange: action('change'),
+};
+
+const Template = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nSelect,
+ N8nOption,
+ },
+ template: 'op1 op2 ',
+ data() {
+ return {
+ val: '',
+ };
+ },
+ methods,
+});
+
+export const Input = Template.bind({});
+
+export const Filterable = Template.bind({});
+Filterable.args = {
+ filterable: true,
+ defaultFirstOption: true,
+};
+
+const selects = ['large', 'medium', 'small', 'mini'].map((size) => `op1 op2 `).join('');
+
+const ManyTemplate = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nSelect,
+ N8nOption,
+ },
+ template: `${selects}
`,
+ methods,
+ data() {
+ return {
+ val: '',
+ };
+ },
+});
+
+export const Sizes = ManyTemplate.bind({});
+Sizes.args = {
+ type: 'text',
+ label: 'text input:',
+ placeholder: 'placeholder...',
+};
+
+const selectsWithIcon = ['xlarge', 'large', 'medium', 'small', 'mini'].map((size) => `op1 op2 `).join('');
+
+const ManyTemplateWithIcon = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nSelect,
+ N8nOption,
+ },
+ template: `${selectsWithIcon}
`,
+ methods,
+ data() {
+ return {
+ val: '',
+ };
+ },
+});
+
+export const WithIcon = ManyTemplateWithIcon.bind({});
+WithIcon.args = {
+ type: 'text',
+ label: 'text input:',
+ placeholder: 'placeholder...',
+};
+
+
+const LimitedWidthTemplate = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nSelect,
+ N8nOption,
+ },
+ template: 'op1 op2 test very long ipsum lipsum test jskdfjsld kjfdslk jfdslkfj lksdjf
',
+ data() {
+ return {
+ val: '',
+ };
+ },
+ methods,
+});
+
+export const LimitedWidth = LimitedWidthTemplate.bind({});
+LimitedWidth.args = {
+ type: 'text',
+ label: 'text input:',
+ placeholder: 'placeholder...',
+};
diff --git a/packages/design-system/src/components/N8nSelect/Select.vue b/packages/design-system/src/components/N8nSelect/Select.vue
new file mode 100644
index 0000000000..4646cbc8ea
--- /dev/null
+++ b/packages/design-system/src/components/N8nSelect/Select.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/design-system/src/components/N8nSelect/index.js b/packages/design-system/src/components/N8nSelect/index.js
new file mode 100644
index 0000000000..a9f34a52ee
--- /dev/null
+++ b/packages/design-system/src/components/N8nSelect/index.js
@@ -0,0 +1,3 @@
+import N8nSelect from './Select.vue';
+
+export default N8nSelect;
diff --git a/packages/design-system/src/components/N8nSpinner/Spinner.stories.js b/packages/design-system/src/components/N8nSpinner/Spinner.stories.js
new file mode 100644
index 0000000000..82b6436412
--- /dev/null
+++ b/packages/design-system/src/components/N8nSpinner/Spinner.stories.js
@@ -0,0 +1,24 @@
+import N8nSpinner from './Spinner.vue';
+
+export default {
+ title: 'Atoms/Spinner',
+ component: N8nSpinner,
+ argTypes: {
+ size: {
+ control: {
+ type: 'select',
+ options: ['small', 'medium', 'large'],
+ },
+ },
+ },
+};
+
+const Template = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nSpinner,
+ },
+ template: ' ',
+});
+
+export const Spinner = Template.bind({});
diff --git a/packages/design-system/src/components/N8nSpinner/Spinner.vue b/packages/design-system/src/components/N8nSpinner/Spinner.vue
new file mode 100644
index 0000000000..a39a3c5679
--- /dev/null
+++ b/packages/design-system/src/components/N8nSpinner/Spinner.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/packages/design-system/src/components/N8nSpinner/index.d.ts b/packages/design-system/src/components/N8nSpinner/index.d.ts
new file mode 100644
index 0000000000..d2a0ce12f5
--- /dev/null
+++ b/packages/design-system/src/components/N8nSpinner/index.d.ts
@@ -0,0 +1,7 @@
+import { N8nComponent, N8nComponentSize } from '../component';
+
+/** Spinner Component */
+export declare class N8nSpinner extends N8nComponent {
+ /** Icon size */
+ size: N8nComponentSize;
+}
diff --git a/packages/design-system/src/components/N8nSpinner/index.js b/packages/design-system/src/components/N8nSpinner/index.js
new file mode 100644
index 0000000000..b6dadd9b52
--- /dev/null
+++ b/packages/design-system/src/components/N8nSpinner/index.js
@@ -0,0 +1,3 @@
+import Spinner from './Spinner.vue';
+
+export default Spinner;
diff --git a/packages/design-system/src/components/N8nTooltip/Tooltip.stories.js b/packages/design-system/src/components/N8nTooltip/Tooltip.stories.js
new file mode 100644
index 0000000000..60c2a410e4
--- /dev/null
+++ b/packages/design-system/src/components/N8nTooltip/Tooltip.stories.js
@@ -0,0 +1,49 @@
+import N8nTooltip from './Tooltip.vue';
+
+export default {
+ title: 'Atoms/Tooltip',
+ component: N8nTooltip,
+ argTypes: {
+ effect: {
+ control: 'select',
+ options: ['dark', 'light'],
+ },
+ placement: {
+ control: 'select',
+ options: [
+ 'top',
+ 'top-start',
+ 'top-end',
+ 'bottom',
+ 'bottom-start',
+ 'bottom-end',
+ 'left',
+ 'left-start',
+ 'left-end',
+ 'right',
+ 'right-start',
+ 'right-end',
+ ],
+ },
+ disabled: {
+ control: { type: 'boolean' },
+ },
+ },
+ parameters: {
+ backgrounds: { default: '--color-background-light' },
+ },
+};
+
+const Template = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nTooltip,
+ },
+ template:
+ 'yo
',
+});
+
+export const Tooltip = Template.bind({});
+Tooltip.args = {
+ content: '...',
+};
diff --git a/packages/design-system/src/components/N8nTooltip/Tooltip.vue b/packages/design-system/src/components/N8nTooltip/Tooltip.vue
new file mode 100644
index 0000000000..123be53762
--- /dev/null
+++ b/packages/design-system/src/components/N8nTooltip/Tooltip.vue
@@ -0,0 +1,7 @@
+
diff --git a/packages/design-system/src/components/N8nTooltip/index.js b/packages/design-system/src/components/N8nTooltip/index.js
new file mode 100644
index 0000000000..1b31abd702
--- /dev/null
+++ b/packages/design-system/src/components/N8nTooltip/index.js
@@ -0,0 +1,3 @@
+import N8nTooltip from './Tooltip.vue';
+
+export default N8nTooltip;
diff --git a/packages/design-system/src/components/component.d.ts b/packages/design-system/src/components/component.d.ts
new file mode 100644
index 0000000000..006d5a85ec
--- /dev/null
+++ b/packages/design-system/src/components/component.d.ts
@@ -0,0 +1,10 @@
+import Vue from 'vue';
+
+/** N8n component common definition */
+export declare class N8nComponent extends Vue {
+ /** Install component into Vue */
+ static install(vue: typeof Vue): void;
+}
+
+/** Component size definition for button, input, etc */
+export type N8nComponentSize = 'large' | 'medium' | 'small';
diff --git a/packages/design-system/src/components/index.d.ts b/packages/design-system/src/components/index.d.ts
new file mode 100644
index 0000000000..19b518d8ae
--- /dev/null
+++ b/packages/design-system/src/components/index.d.ts
@@ -0,0 +1 @@
+declare module './N8nButton';
diff --git a/packages/design-system/src/components/index.js b/packages/design-system/src/components/index.js
new file mode 100644
index 0000000000..fea7b995ac
--- /dev/null
+++ b/packages/design-system/src/components/index.js
@@ -0,0 +1,23 @@
+import N8nButton from './N8nButton';
+import N8nIcon from './N8nIcon';
+import N8nIconButton from './N8nIconButton';
+import N8nInput from './N8nInput';
+import N8nInputLabel from './N8nInputLabel';
+import N8nInputNumber from './N8nInputNumber';
+import N8nOption from './N8nOption';
+import N8nSelect from './N8nSelect';
+import N8nSpinner from './N8nSpinner';
+import N8nTooltip from './N8nTooltip';
+
+export {
+ N8nButton,
+ N8nIcon,
+ N8nIconButton,
+ N8nInput,
+ N8nInputLabel,
+ N8nInputNumber,
+ N8nOption,
+ N8nSelect,
+ N8nSpinner,
+ N8nTooltip,
+};
diff --git a/packages/design-system/src/docs/Introduction.stories.mdx b/packages/design-system/src/docs/Introduction.stories.mdx
new file mode 100644
index 0000000000..961486cf9e
--- /dev/null
+++ b/packages/design-system/src/docs/Introduction.stories.mdx
@@ -0,0 +1,5 @@
+
+
+# Welcome to n8n Storybook
+
+This project includes components that make up n8n editor.
diff --git a/packages/design-system/src/main.d.ts b/packages/design-system/src/main.d.ts
new file mode 100644
index 0000000000..ed730c2988
--- /dev/null
+++ b/packages/design-system/src/main.d.ts
@@ -0,0 +1 @@
+declare module 'n8n-design-system';
diff --git a/packages/design-system/src/main.js b/packages/design-system/src/main.js
new file mode 100644
index 0000000000..a214d84b97
--- /dev/null
+++ b/packages/design-system/src/main.js
@@ -0,0 +1,10 @@
+import * as components from './components';
+
+for (const key in components) {
+ const component = components[key];
+ component.install = function (Vue) {
+ Vue.component(component.name, component);
+ };
+}
+
+export * from './components';
diff --git a/packages/design-system/src/shims-element-ui.d.ts b/packages/design-system/src/shims-element-ui.d.ts
new file mode 100644
index 0000000000..6af21baf4b
--- /dev/null
+++ b/packages/design-system/src/shims-element-ui.d.ts
@@ -0,0 +1,7 @@
+declare module 'element-ui/lib/button';
+declare module 'element-ui/lib/input';
+declare module 'element-ui/lib/tooltip';
+declare module 'element-ui/lib/input-number';
+declare module 'element-ui/lib/select';
+declare module 'element-ui/lib/option';
+
diff --git a/packages/design-system/src/shims-tsx.d.ts b/packages/design-system/src/shims-tsx.d.ts
new file mode 100644
index 0000000000..f92b1fd7e3
--- /dev/null
+++ b/packages/design-system/src/shims-tsx.d.ts
@@ -0,0 +1,13 @@
+import Vue, { VNode } from 'vue';
+
+declare global {
+ namespace JSX {
+ // tslint:disable no-empty-interface
+ interface Element extends VNode {}
+ // tslint:disable no-empty-interface
+ interface ElementClass extends Vue {}
+ interface IntrinsicElements {
+ [elem: string]: any;
+ }
+ }
+}
diff --git a/packages/design-system/src/shims-vue.d.ts b/packages/design-system/src/shims-vue.d.ts
new file mode 100644
index 0000000000..b3a21c6cdb
--- /dev/null
+++ b/packages/design-system/src/shims-vue.d.ts
@@ -0,0 +1,4 @@
+declare module '*.vue' {
+ import Vue from 'vue';
+ export default Vue;
+}
diff --git a/packages/design-system/src/styleguide/ColorCircles.vue b/packages/design-system/src/styleguide/ColorCircles.vue
new file mode 100644
index 0000000000..3fc46b3b71
--- /dev/null
+++ b/packages/design-system/src/styleguide/ColorCircles.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
{{ color }}
+
{{ hsl[color] }}
+
{{ getHexValue(color) }}
+
+
+
+
+
+
+
diff --git a/packages/design-system/src/styleguide/Sizes.vue b/packages/design-system/src/styleguide/Sizes.vue
new file mode 100644
index 0000000000..373d6f7a26
--- /dev/null
+++ b/packages/design-system/src/styleguide/Sizes.vue
@@ -0,0 +1,83 @@
+
+
+
+ Name
+ rem
+ px
+
+
+ {{ variable }}
+ {{ sizes[variable].rem }}
+ {{ sizes[variable].px }}
+
+
+
+
+
+
+
diff --git a/packages/design-system/src/styleguide/TextClasses.vue b/packages/design-system/src/styleguide/TextClasses.vue
new file mode 100644
index 0000000000..0948ebfab9
--- /dev/null
+++ b/packages/design-system/src/styleguide/TextClasses.vue
@@ -0,0 +1,49 @@
+
+
+
+ .{{ c }}{{ postfix ? postfix : '' }}
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse in
+ luctus sapien, a suscipit neque.
+
+
+
+
+
+
+
+
diff --git a/packages/design-system/src/styleguide/VariableTable.vue b/packages/design-system/src/styleguide/VariableTable.vue
new file mode 100644
index 0000000000..6f7c48dd4f
--- /dev/null
+++ b/packages/design-system/src/styleguide/VariableTable.vue
@@ -0,0 +1,80 @@
+
+
+
+ Name
+ Value
+
+
+ {{ variable }}
+ {{ values[variable] }}
+
+
+
+
+
+
+
diff --git a/packages/design-system/src/styleguide/border.stories.mdx b/packages/design-system/src/styleguide/border.stories.mdx
new file mode 100644
index 0000000000..d5a83e064d
--- /dev/null
+++ b/packages/design-system/src/styleguide/border.stories.mdx
@@ -0,0 +1,49 @@
+import { Meta, Story, Canvas } from '@storybook/addon-docs';
+import VariableTable from './VariableTable.vue';
+
+
+
+# Border Radius
+
+
+
+ {{
+ template: ` `,
+ components: {
+ VariableTable,
+ },
+ }}
+
+
+
+# Border Width
+
+
+
+ {{
+ template: ` `,
+ components: {
+ VariableTable,
+ },
+ }}
+
+
+
+
+
+ {{
+ template: ` `,
+ components: {
+ VariableTable,
+ },
+ }}
+
+
diff --git a/packages/design-system/src/styleguide/colors.stories.mdx b/packages/design-system/src/styleguide/colors.stories.mdx
new file mode 100644
index 0000000000..16e372bcd3
--- /dev/null
+++ b/packages/design-system/src/styleguide/colors.stories.mdx
@@ -0,0 +1,131 @@
+import { Meta, Story, Canvas } from '@storybook/addon-docs';
+import ColorCircles from './ColorCircles.vue';
+
+
+
+# Colors
+
+## Primary
+
+
+
+ {{
+ template: ` `,
+ components: {
+ ColorCircles,
+ },
+ }}
+
+
+
+## Outline
+
+
+
+ {{
+ template: ` `,
+ components: {
+ ColorCircles,
+ },
+ }}
+
+
+
+## Success
+
+
+
+ {{
+ template: ` `,
+ components: {
+ ColorCircles,
+ },
+ }}
+
+
+
+## Warning
+
+
+
+ {{
+ template: ` `,
+ components: {
+ ColorCircles,
+ },
+ }}
+
+
+
+## Danger
+
+
+
+ {{
+ template: ` `,
+ components: {
+ ColorCircles,
+ },
+ }}
+
+
+
+## Info
+
+
+
+ {{
+ template: ` `,
+ components: {
+ ColorCircles,
+ },
+ }}
+
+
+
+## Text
+
+
+
+ {{
+ template: ` `,
+ components: {
+ ColorCircles,
+ },
+ }}
+
+
+
+## Foreground
+
+
+
+ {{
+ template: ` `,
+ components: {
+ ColorCircles,
+ },
+ }}
+
+
+
+## Background
+
+
+
+ {{
+ template: ` `,
+ components: {
+ ColorCircles,
+ },
+ }}
+
+
diff --git a/packages/design-system/src/styleguide/fonts.stories.mdx b/packages/design-system/src/styleguide/fonts.stories.mdx
new file mode 100644
index 0000000000..ebf468b385
--- /dev/null
+++ b/packages/design-system/src/styleguide/fonts.stories.mdx
@@ -0,0 +1,59 @@
+import { Meta, Story, Canvas } from '@storybook/addon-docs';
+import Sizes from './Sizes.vue';
+import VariableTable from './VariableTable.vue';
+
+
+
+# Font
+
+## Font Sizes
+
+
+
+ {{
+ template: ` `,
+ components: {
+ Sizes,
+ },
+ }}
+
+
+
+## Line Heights
+
+
+
+ {{
+ template: ` `,
+ components: {
+ VariableTable,
+ },
+ }}
+
+
+
+## Font Weights
+
+
+
+ {{
+ template: ` `,
+ components: {
+ VariableTable,
+ },
+ }}
+
+
+
+## Font Family
+
+
+
+ {{
+ template: ` `,
+ components: {
+ VariableTable,
+ },
+ }}
+
+
diff --git a/packages/design-system/src/styleguide/spacing.stories.mdx b/packages/design-system/src/styleguide/spacing.stories.mdx
new file mode 100644
index 0000000000..bd604fe1d8
--- /dev/null
+++ b/packages/design-system/src/styleguide/spacing.stories.mdx
@@ -0,0 +1,26 @@
+import { Meta, Story, Canvas } from '@storybook/addon-docs';
+import Sizes from './Sizes.vue';
+import TextClasses from './TextClasses.vue';
+
+
+
+# Spacing
+
+
+
+ {{
+ template: ` `,
+ components: {
+ Sizes,
+ },
+ }}
+
+
diff --git a/packages/design-system/src/styleguide/text.stories.mdx b/packages/design-system/src/styleguide/text.stories.mdx
new file mode 100644
index 0000000000..f48680afc4
--- /dev/null
+++ b/packages/design-system/src/styleguide/text.stories.mdx
@@ -0,0 +1,38 @@
+import { Meta, Story, Canvas } from '@storybook/addon-docs';
+import TextClasses from './TextClasses.vue';
+
+
+
+# Regular
+
+
+
+ {{
+ template: ` `,
+ components: {
+ TextClasses,
+ },
+ }}
+
+
+
+# Bold
+
+
+
+ {{
+ template: ` `,
+ components: {
+ TextClasses,
+ },
+ }}
+
+
diff --git a/packages/design-system/theme/preview/docs.min.css b/packages/design-system/theme/preview/docs.min.css
new file mode 100644
index 0000000000..2c8df6b64d
--- /dev/null
+++ b/packages/design-system/theme/preview/docs.min.css
@@ -0,0 +1,2373 @@
+.color-wrap {
+ padding: 20px;
+}
+.box-card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+.demo-line {
+ margin: 15px 0;
+}
+.component-preview h4 {
+ font-size: 20px;
+ margin: 40px 0 20px;
+ color: #909399;
+}
+.demo-block {
+ border: 1px solid #ebebeb;
+ border-radius: 3px;
+ transition: 0.2s;
+}
+.demo-block.hover {
+ box-shadow: 0 0 8px 0 rgba(232, 237, 250, 0.6),
+ 0 2px 4px 0 rgba(232, 237, 250, 0.5);
+}
+.demo-block code {
+ font-family: Menlo, Monaco, Consolas, Courier, monospace;
+}
+.demo-block .demo-button {
+ float: right;
+}
+.demo-block .source {
+ padding: 24px;
+}
+.demo-block .meta {
+ background-color: #fafafa;
+ border-top: 1px solid #eaeefb;
+ overflow: hidden;
+ height: 0;
+ transition: height 0.2s;
+}
+.demo-block .description {
+ padding: 20px;
+ box-sizing: border-box;
+ border: 1px solid #ebebeb;
+ border-radius: 3px;
+ font-size: 14px;
+ line-height: 22px;
+ color: #666;
+ word-break: break-word;
+ margin: 10px;
+ background-color: #fff;
+}
+.demo-block .description p {
+ margin: 0;
+ line-height: 26px;
+}
+.demo-block .description code {
+ color: #5e6d82;
+ background-color: #e6effb;
+ margin: 0 4px;
+ display: inline-block;
+ padding: 1px 5px;
+ font-size: 12px;
+ border-radius: 3px;
+ height: 18px;
+ line-height: 18px;
+}
+.demo-block .highlight pre {
+ margin: 0;
+}
+.demo-block .highlight code.hljs {
+ margin: 0;
+ border: none;
+ max-height: none;
+ border-radius: 0;
+}
+.demo-block .highlight code.hljs:before {
+ content: none;
+}
+.demo-block .demo-block-control {
+ border-top: 1px solid #eaeefb;
+ height: 44px;
+ box-sizing: border-box;
+ background-color: #fff;
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ text-align: center;
+ margin-top: -1px;
+ color: #d3dce6;
+ cursor: pointer;
+ position: relative;
+}
+.demo-block .demo-block-control.is-fixed {
+ position: fixed;
+ bottom: 0;
+ width: 868px;
+}
+.demo-block .demo-block-control i {
+ font-size: 16px;
+ line-height: 44px;
+ transition: 0.3s;
+}
+.demo-block .demo-block-control i.hovering {
+ transform: translateX(-40px);
+}
+.demo-block .demo-block-control > span {
+ position: absolute;
+ transform: translateX(-30px);
+ font-size: 14px;
+ line-height: 44px;
+ transition: 0.3s;
+ display: inline-block;
+}
+.demo-block .demo-block-control:hover {
+ color: #409eff;
+ background-color: #f9fafc;
+}
+.demo-block .demo-block-control .text-slide-enter,
+.demo-block .demo-block-control .text-slide-leave-active {
+ opacity: 0;
+ transform: translateX(10px);
+}
+.demo-block .demo-block-control .control-button {
+ line-height: 26px;
+ position: absolute;
+ top: 0;
+ right: 0;
+ font-size: 14px;
+ padding-left: 5px;
+ padding-right: 25px;
+}
+.footer {
+ background-color: #f7fbfd;
+ width: 100%;
+ padding: 40px 150px;
+ margin-top: -340px;
+ box-sizing: border-box;
+ height: 340px;
+}
+.footer .container {
+ box-sizing: border-box;
+ width: auto;
+}
+.footer .footer-main {
+ font-size: 0;
+ display: inline-block;
+ vertical-align: top;
+ margin-right: 110px;
+}
+.footer .footer-main h4 {
+ font-size: 18px;
+ color: #333;
+ line-height: 1;
+ margin: 0 0 15px;
+}
+.footer .footer-main .footer-main-link {
+ display: block;
+ margin: 0;
+ line-height: 2;
+ font-size: 14px;
+ color: #666;
+}
+.footer .footer-main .footer-main-link:hover {
+ color: #333;
+}
+.footer .footer-social {
+ float: right;
+ text-align: right;
+}
+.footer .footer-social .footer-social-title {
+ color: #666;
+ font-size: 18px;
+ line-height: 1;
+ margin: 0 0 20px;
+ padding: 0;
+ font-weight: 700;
+}
+.footer .footer-social .elementdoc {
+ transition: 0.3s;
+ display: inline-block;
+ line-height: 32px;
+ text-align: center;
+ color: #c8d6e8;
+ background-color: transparent;
+ size: 32px;
+ font-size: 32px;
+ vertical-align: middle;
+ margin-right: 20px;
+}
+.footer .footer-social .elementdoc:hover {
+ transform: scale(1.2);
+ color: #8d99ab;
+}
+.footer .footer-social .doc-icon-gitter {
+ margin-right: 0;
+}
+.el-popover.footer-popover {
+ padding: 0;
+ min-width: 120px;
+ line-height: normal;
+ box-shadow: 0 0 11px 0 rgba(174, 187, 211, 0.24);
+}
+.el-popover.footer-popover .footer-popover-title {
+ border-bottom: 1px solid #eaeefb;
+ height: 30px;
+ line-height: 30px;
+ text-align: center;
+ color: #99a9bf;
+ background-color: #f8f9fe;
+}
+.el-popover.footer-popover img {
+ size: 100px;
+ margin: 10px;
+}
+@media (max-width: 1140px) {
+ .footer {
+ height: auto;
+ }
+}
+@media (max-width: 1000px) {
+ .footer-social {
+ display: none;
+ }
+}
+@media (max-width: 768px) {
+ .footer .footer-main {
+ margin-bottom: 30px;
+ }
+}
+.theme-picker {
+ height: 80px;
+ display: inline-block;
+}
+.theme-picker .el-color-picker__trigger {
+ vertical-align: middle;
+}
+.theme-picker-dropdown .el-color-dropdown__link-btn {
+ display: none;
+}
+.algolia-search {
+ width: 450px !important;
+}
+.algolia-search.is-empty .el-autocomplete-suggestion__list {
+ padding-bottom: 0;
+}
+.algolia-search .el-autocomplete-suggestion__list {
+ position: static !important;
+ padding-bottom: 28px;
+}
+.algolia-search li {
+ border-bottom: 1px solid #ebebeb;
+}
+.algolia-search li:last-child {
+ border-bottom: none;
+}
+.algolia-search .algolia-highlight {
+ color: #409eff;
+ font-weight: 700;
+}
+.algolia-search .algolia-search-title {
+ font-size: 14px;
+ margin: 6px 0;
+ line-height: 1.8;
+}
+.algolia-search .algolia-search-separator {
+ padding: 0 6px;
+}
+.algolia-search .algolia-search-content {
+ font-size: 12px;
+ margin: 6px 0;
+ line-height: 2.4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.algolia-search .algolia-search-link {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ padding-right: 20px;
+ background-color: #e4e7ed;
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ box-sizing: border-box;
+ text-align: right;
+}
+.algolia-search .algolia-search-link:hover {
+ background-color: #e4e7ed;
+}
+.algolia-search .algolia-search-link img {
+ display: inline-block;
+ height: 17px;
+ margin-top: 10px;
+}
+.algolia-search .algolia-search-empty {
+ margin: 5px 0;
+ text-align: center;
+ color: #999;
+}
+.progress[data-v-3285c94c] {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 2px;
+ width: 0;
+ transition: width 0.2s, opacity 0.4s;
+ opacity: 1;
+ z-index: 999999;
+}
+.loadingClass {
+ z-index: 0 !important;
+}
+.loadingClass .el-loading-spinner {
+ top: 0;
+ margin-top: 30%;
+}
+.headerWrapper[data-v-70469f40] {
+ height: 80px;
+}
+#v3-banner[data-v-70469f40] {
+ background-color: #409eff;
+ min-height: 30px;
+ padding: 5px 60px;
+ z-index: 19;
+ box-sizing: border-box;
+ text-align: center;
+ color: #eee;
+}
+#v3-banner a[data-v-70469f40] {
+ color: #fff;
+ font-weight: 700;
+}
+.header[data-v-70469f40] {
+ height: 80px;
+ background-color: #fff;
+ color: #fff;
+ top: 0;
+ left: 0;
+ width: 100%;
+ line-height: 80px;
+ z-index: 100;
+ position: relative;
+}
+.header .container[data-v-70469f40] {
+ height: 100%;
+ box-sizing: border-box;
+ border-bottom: 1px solid #dcdfe6;
+}
+.header .nav-lang-spe[data-v-70469f40] {
+ color: #888;
+}
+.header h1[data-v-70469f40] {
+ margin: 0;
+ float: left;
+ font-size: 32px;
+ font-weight: 400;
+}
+.header h1 a[data-v-70469f40] {
+ color: #333;
+ text-decoration: none;
+ display: block;
+}
+.header h1 span[data-v-70469f40] {
+ font-size: 12px;
+ display: inline-block;
+ width: 34px;
+ height: 18px;
+ border: 1px solid hsla(0, 0%, 100%, 0.5);
+ text-align: center;
+ line-height: 18px;
+ vertical-align: middle;
+ margin-left: 10px;
+ border-radius: 3px;
+}
+.header .nav[data-v-70469f40] {
+ float: right;
+ height: 100%;
+ line-height: 80px;
+ background: transparent;
+ padding: 0;
+ margin: 0;
+}
+.header .nav[data-v-70469f40]:after,
+.header .nav[data-v-70469f40]:before {
+ display: table;
+ content: '';
+}
+.header .nav[data-v-70469f40]:after {
+ clear: both;
+}
+.header .nav-gap[data-v-70469f40] {
+ position: relative;
+ width: 1px;
+ height: 80px;
+ padding: 0 20px;
+}
+.header .nav-gap[data-v-70469f40]:before {
+ content: '';
+ position: absolute;
+ top: calc(50% - 8px);
+ width: 1px;
+ height: 16px;
+ background: #ebebeb;
+}
+.header .nav-logo-small[data-v-70469f40],
+.header .nav-logo[data-v-70469f40] {
+ vertical-align: sub;
+}
+.header .nav-logo-small[data-v-70469f40] {
+ display: none;
+}
+.header .nav-item[data-v-70469f40] {
+ margin: 0;
+ float: left;
+ list-style: none;
+ position: relative;
+ cursor: pointer;
+}
+.header .nav-item.nav-algolia-search[data-v-70469f40] {
+ cursor: default;
+}
+.header .nav-item.lang-item[data-v-70469f40],
+.header .nav-item[data-v-70469f40]:last-child {
+ cursor: default;
+ margin-left: 34px;
+}
+.header .nav-item.lang-item span[data-v-70469f40],
+.header .nav-item:last-child span[data-v-70469f40] {
+ opacity: 0.8;
+}
+.header .nav-item.lang-item .nav-lang[data-v-70469f40],
+.header .nav-item:last-child .nav-lang[data-v-70469f40] {
+ cursor: pointer;
+ display: inline-block;
+ height: 100%;
+ color: #888;
+}
+.header .nav-item.lang-item .nav-lang[data-v-70469f40]:hover,
+.header .nav-item:last-child .nav-lang[data-v-70469f40]:hover {
+ color: #409eff;
+}
+.header .nav-item.lang-item .nav-lang.active[data-v-70469f40],
+.header .nav-item:last-child .nav-lang.active[data-v-70469f40] {
+ font-weight: 700;
+ color: #409eff;
+}
+.header .nav-item a[data-v-70469f40] {
+ text-decoration: none;
+ color: #1989fa;
+ opacity: 0.5;
+ display: block;
+ padding: 0 22px;
+}
+.header .nav-item a.active[data-v-70469f40],
+.header .nav-item a[data-v-70469f40]:hover {
+ opacity: 1;
+}
+.header .nav-item a.active[data-v-70469f40]:after {
+ content: '';
+ display: inline-block;
+ position: absolute;
+ bottom: 0;
+ left: calc(50% - 15px);
+ width: 30px;
+ height: 2px;
+ background: #409eff;
+}
+.nav-dropdown[data-v-70469f40] {
+ margin-bottom: 6px;
+ padding-left: 18px;
+ width: 100%;
+}
+.nav-dropdown span[data-v-70469f40] {
+ display: block;
+ width: 100%;
+ font-size: 16px;
+ color: #888;
+ line-height: 40px;
+ transition: 0.2s;
+ padding-bottom: 6px;
+ user-select: none;
+}
+.nav-dropdown span[data-v-70469f40]:hover {
+ cursor: pointer;
+}
+.nav-dropdown i[data-v-70469f40] {
+ transition: 0.2s;
+ font-size: 12px;
+ color: #979797;
+ transform: translateY(-2px);
+}
+.nav-dropdown .is-active i[data-v-70469f40],
+.nav-dropdown .is-active span[data-v-70469f40] {
+ color: #409eff;
+}
+.nav-dropdown .is-active i[data-v-70469f40] {
+ transform: rotate(180deg) translateY(3px);
+}
+.nav-dropdown:hover i[data-v-70469f40],
+.nav-dropdown:hover span[data-v-70469f40] {
+ color: #409eff;
+}
+.nav-dropdown-list[data-v-70469f40] {
+ width: auto;
+}
+@media (max-width: 850px) {
+ .header .nav-logo[data-v-70469f40] {
+ display: none;
+ }
+ .header .nav-logo-small[data-v-70469f40] {
+ display: inline-block;
+ }
+ .header .nav-item[data-v-70469f40] {
+ margin-left: 6px;
+ }
+ .header .nav-item.lang-item[data-v-70469f40],
+ .header .nav-item[data-v-70469f40]:last-child {
+ margin-left: 10px;
+ }
+ .header .nav-item a[data-v-70469f40] {
+ padding: 0 5px;
+ }
+ .header .nav-algolia-search[data-v-70469f40],
+ .header .nav-theme-switch[data-v-70469f40] {
+ display: none;
+ }
+}
+@media (max-width: 700px) {
+ .header .container[data-v-70469f40] {
+ padding: 0 12px;
+ }
+ .header .nav-item a[data-v-70469f40] {
+ font-size: 12px;
+ vertical-align: top;
+ }
+ .header .nav-item.lang-item[data-v-70469f40] {
+ height: 100%;
+ }
+ .header .nav-item.lang-item .nav-lang[data-v-70469f40] {
+ display: flex;
+ align-items: center;
+ }
+ .header .nav-item.lang-item .nav-lang span[data-v-70469f40] {
+ padding-bottom: 0;
+ }
+ .header .nav-dropdown[data-v-70469f40] {
+ padding: 0;
+ }
+ .header .nav-dropdown span[data-v-70469f40] {
+ font-size: 12px;
+ }
+ .header .nav-gap[data-v-70469f40] {
+ padding: 0 8px;
+ }
+ .header .nav-versions[data-v-70469f40] {
+ display: none;
+ }
+}
+.side-nav {
+ width: 100%;
+ box-sizing: border-box;
+ padding-right: 30px;
+ transition: opacity 0.3s;
+}
+.side-nav.is-fade {
+ transition: opacity 3s;
+}
+.side-nav li {
+ list-style: none;
+}
+.side-nav ul {
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+}
+.side-nav > ul > .nav-item > a {
+ margin-top: 15px;
+}
+.side-nav > ul > .nav-item:nth-child(-n + 4) > a {
+ margin-top: 0;
+}
+.side-nav .nav-item a {
+ font-size: 16px;
+ color: #333;
+ line-height: 40px;
+ height: 40px;
+ margin: 0;
+ padding: 0;
+ text-decoration: none;
+ display: block;
+ position: relative;
+ transition: 0.15s ease-out;
+ font-weight: 700;
+}
+.side-nav .nav-item a.active {
+ color: #409eff;
+}
+.side-nav .nav-item .nav-item a {
+ display: block;
+ height: 40px;
+ color: #444;
+ line-height: 40px;
+ font-size: 14px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ font-weight: 400;
+}
+.side-nav .nav-item .nav-item a.active,
+.side-nav .nav-item .nav-item a:hover {
+ color: #409eff;
+}
+.side-nav .nav-item.sponsors > .sub-nav {
+ margin-top: -10px;
+}
+.side-nav .nav-item.sponsors > a {
+ color: #777;
+ font-weight: 300;
+ font-size: 14px;
+}
+.side-nav .nav-item.sponsors .nav-item {
+ display: inline-block;
+}
+.side-nav .nav-item.sponsors .nav-item a {
+ height: auto;
+ display: inline-block;
+ vertical-align: middle;
+ margin: 8px 12px 12px 0;
+}
+.side-nav .nav-item.sponsors .nav-item a img {
+ width: 42px;
+}
+.side-nav .nav-item.sponsors .nav-item:first-child a img {
+ width: 36px;
+}
+.side-nav .nav-group__title {
+ font-size: 12px;
+ color: #999;
+ line-height: 26px;
+ margin-top: 15px;
+}
+.side-nav #code-sponsor-widget {
+ margin: 0 0 0 -20px;
+}
+.nav-dropdown-list {
+ width: 120px;
+ margin-top: -8px;
+}
+.footer-nav,
+.nav-dropdown-list li {
+ font-size: 14px;
+}
+.footer-nav {
+ padding: 40px 0;
+ color: #333;
+}
+.footer-nav:after {
+ content: '';
+ display: block;
+ clear: both;
+}
+.footer-nav i {
+ transition: 0.3s;
+ color: #999;
+ vertical-align: baseline;
+}
+.footer-nav-link {
+ cursor: pointer;
+ transition: 0.3s;
+}
+.footer-nav-link:hover,
+.footer-nav-link:hover i {
+ color: #409eff;
+}
+.footer-nav-left {
+ float: left;
+ margin-left: -4px;
+}
+.footer-nav-right {
+ float: right;
+ margin-right: -4px;
+}
+.demo-block.demo-alert .el-alert {
+ margin: 20px 0 0;
+}
+.demo-block.demo-alert .el-alert:first-child {
+ margin: 0;
+}
+.demo-badge.demo-block .el-dropdown {
+ vertical-align: middle;
+}
+.demo-badge.demo-block .share-button {
+ width: 36px;
+ padding: 10px;
+}
+.demo-badge.demo-block .mark {
+ margin-top: 8px;
+ line-height: 1;
+ float: right;
+}
+.demo-badge.demo-block .item {
+ margin-right: 40px;
+}
+.demo-border .text {
+ width: 15%;
+}
+.demo-border .line {
+ width: 70%;
+}
+.demo-border .line div {
+ width: 100%;
+ height: 0;
+ border-top: 1px solid #eee;
+}
+.demo-border .line .dashed {
+ border-top: 2px dashed #eee;
+}
+.demo-shadow {
+ height: 100px;
+ width: 50%;
+ border: 1px solid #eee;
+}
+.demo-shadow-text {
+ line-height: 50px;
+ color: #666;
+ font-size: 14px;
+}
+.demo-radius .title {
+ color: #666;
+ font-size: 18px;
+ margin: 10px 0;
+}
+.demo-radius .value {
+ color: #333;
+ font-size: 16px;
+ margin: 10px 0;
+}
+.demo-radius .radius {
+ height: 60px;
+ width: 70%;
+ border: 1px solid #d7dae2;
+ border-radius: 0;
+ margin-top: 20px;
+}
+.demo-radius .radius-30 {
+ border-radius: 30px;
+}
+.demo-block.demo-button .el-row {
+ margin-bottom: 20px;
+}
+.demo-block.demo-button .el-row:last-child {
+ margin-bottom: 0;
+}
+.demo-block.demo-button .el-button + .el-button {
+ margin-left: 10px;
+}
+.demo-block.demo-button .el-button-group .el-button + .el-button {
+ margin-left: 0;
+}
+.demo-block.demo-button .el-button-group + .el-button-group {
+ margin-left: 10px;
+}
+.demo-calendar.demo-block .is-selected {
+ color: #1989fa;
+}
+.demo-block.demo-card .text {
+ font-size: 14px;
+}
+.demo-block.demo-card .time {
+ font-size: 13px;
+ color: #999;
+}
+.demo-block.demo-card .bottom {
+ margin-top: 13px;
+ line-height: 12px;
+}
+.demo-block.demo-card .item {
+ margin-bottom: 18px;
+}
+.demo-block.demo-card .button {
+ padding: 0;
+ float: right;
+}
+.demo-block.demo-card .image {
+ width: 100%;
+ display: block;
+}
+.demo-block.demo-card .box-card {
+ width: 480px;
+}
+.demo-carousel .block {
+ padding: 30px;
+ text-align: center;
+ border-right: 1px solid #eff2f6;
+ display: inline-block;
+ width: 49%;
+ box-sizing: border-box;
+}
+.demo-carousel .block:last-child {
+ border-right: none;
+}
+.demo-carousel .demonstration {
+ display: block;
+ color: #8492a6;
+ font-size: 14px;
+ margin-bottom: 20px;
+}
+.demo-carousel .el-carousel__container {
+ text-align: center;
+}
+.demo-carousel .el-carousel__item h3 {
+ color: #fff;
+ font-size: 18px;
+ line-height: 300px;
+ margin: 0;
+}
+.demo-carousel .el-carousel__item h3.small {
+ font-size: 14px;
+ line-height: 150px;
+}
+.demo-carousel .el-carousel__item h3.medium {
+ font-size: 14px;
+ line-height: 200px;
+}
+.demo-carousel .el-carousel__item:nth-child(2n) {
+ background-color: #99a9bf;
+}
+.demo-carousel .el-carousel__item:nth-child(odd) {
+ background-color: #d3dce6;
+}
+.demo-cascader .el-cascader {
+ width: 222px;
+}
+.demo-cascader-size .el-cascader {
+ vertical-align: top;
+ margin-right: 15px;
+}
+.demo-cascader .source > div {
+ display: flex;
+}
+.demo-cascader .block {
+ padding: 30px 0;
+ text-align: center;
+ border-right: 1px solid #eff2f6;
+ width: 50%;
+ box-sizing: border-box;
+}
+.demo-cascader .block:last-child {
+ border-right: none;
+}
+.demo-cascader .demonstration {
+ display: block;
+ color: #8492a6;
+ font-size: 14px;
+ margin-bottom: 20px;
+}
+.demo-collapse .el-collapse-item__header .header-icon {
+ margin-left: 5px;
+}
+.demo-color-picker .block {
+ padding: 30px 0;
+ text-align: center;
+ border-right: 1px solid #eff2f6;
+ display: inline-block;
+ width: 50%;
+ box-sizing: border-box;
+}
+.demo-color-picker .block:last-child {
+ border-right: none;
+}
+.demo-color-picker .demonstration {
+ display: block;
+ color: #8492a6;
+ font-size: 14px;
+ margin-bottom: 20px;
+}
+.demo-color-picker .el-color-picker + .el-color-picker {
+ margin-left: 20px;
+}
+.demo-color-box {
+ position: relative;
+ border-radius: 4px;
+ padding: 20px;
+ margin: 5px 0;
+ height: 114px;
+ box-sizing: border-box;
+ color: #fff;
+ font-size: 14px;
+}
+.demo-color-box .value {
+ font-size: 12px;
+ opacity: 0.69;
+ line-height: 24px;
+}
+.demo-color-box-other {
+ height: 74px;
+ margin: 10px 0 !important;
+ border-radius: 4px 4px 4px 4px !important;
+ padding: 15px 20px;
+}
+.demo-color-box-group .demo-color-box {
+ border-radius: 0;
+ margin: 0;
+}
+.demo-color-box-group .demo-color-box:first-child {
+ border-radius: 4px 4px 0 0;
+}
+.bg-color-sub,
+.demo-color-box-group .demo-color-box:last-child {
+ border-radius: 0 0 4px 4px;
+}
+.bg-color-sub {
+ width: 100%;
+ height: 40px;
+ left: 0;
+ bottom: 0;
+ position: absolute;
+}
+.bg-blue-sub-item {
+ width: 11.1111111%;
+ height: 100%;
+ display: inline-block;
+}
+.bg-blue-sub-item:first-child {
+ border-radius: 0 0 0 4px;
+}
+.bg-success-sub-item {
+ width: 50%;
+ height: 100%;
+ display: inline-block;
+}
+.bg-success-sub-item:first-child {
+ border-radius: 0 0 0 4px;
+}
+.bg-success-sub-item:last-child {
+ border-radius: 0 0 4px 0;
+}
+.bg-transparent {
+ border: 1px solid #fcc3c3;
+ color: #303133;
+ background: url("data:image/svg+xml;utf8, ");
+ background-repeat: no-repeat;
+ background-position: 50%;
+ background-size: 100% 100%, auto;
+}
+.demo-color-box-lite {
+ color: #303133;
+}
+.el-footer,
+.el-header {
+ background-color: #b3c0d1;
+ color: #333;
+ line-height: 60px;
+}
+.el-aside {
+ color: #333;
+}
+#chang-jian-ye-mian-bu-ju + .demo-container .el-footer,
+#chang-jian-ye-mian-bu-ju + .demo-container .el-header {
+ text-align: center;
+}
+#chang-jian-ye-mian-bu-ju + .demo-container .el-aside {
+ background-color: #d3dce6;
+ text-align: center;
+ line-height: 200px;
+}
+#chang-jian-ye-mian-bu-ju + .demo-container .el-main {
+ background-color: #e9eef3;
+ color: #333;
+ text-align: center;
+ line-height: 160px;
+}
+#chang-jian-ye-mian-bu-ju + .demo-container > .source > .el-container {
+ margin-bottom: 40px;
+}
+#chang-jian-ye-mian-bu-ju
+ + .demo-container
+ > .source
+ > .el-container:nth-child(5)
+ .el-aside,
+#chang-jian-ye-mian-bu-ju
+ + .demo-container
+ > .source
+ > .el-container:nth-child(6)
+ .el-aside {
+ line-height: 260px;
+}
+#chang-jian-ye-mian-bu-ju
+ + .demo-container
+ > .source
+ > .el-container:nth-child(7)
+ .el-aside {
+ line-height: 320px;
+}
+.demo-block.demo-date-picker .source > div {
+ padding: 0;
+ display: flex;
+ flex-wrap: wrap;
+}
+.demo-date-picker .block {
+ padding: 30px 0;
+ text-align: center;
+ border-right: 1px solid #eff2f6;
+ flex: 1;
+}
+.demo-date-picker .block:last-child {
+ border-right: none;
+}
+.demo-date-picker .container {
+ flex: 1;
+ border-right: 1px solid #eff2f6;
+}
+.demo-date-picker .container .block {
+ border-right: none;
+}
+.demo-date-picker .container .block:last-child {
+ border-top: 1px solid #eff2f6;
+}
+.demo-date-picker .container:last-child {
+ border-right: none;
+}
+.demo-date-picker .demonstration {
+ display: block;
+ color: #8492a6;
+ font-size: 14px;
+ margin-bottom: 20px;
+}
+.demo-block.demo-datetime-picker .source > div {
+ padding: 0;
+ display: flex;
+}
+.demo-datetime-picker .block {
+ padding: 30px 0;
+ text-align: center;
+ border-right: 1px solid #eff2f6;
+ flex: 1;
+}
+.demo-datetime-picker .block:last-child {
+ border-right: none;
+}
+.demo-datetime-picker .demonstration {
+ display: block;
+ color: #8492a6;
+ font-size: 14px;
+ margin-bottom: 20px;
+}
+.demo-block.demo-dialog .dialog-footer button:first-child {
+ margin-right: 10px;
+}
+.demo-block.demo-dialog .full-image {
+ width: 100%;
+}
+.demo-block.demo-dialog .el-dialog__wrapper {
+ margin: 0;
+}
+.demo-block.demo-dialog .el-input,
+.demo-block.demo-dialog .el-select {
+ width: 300px;
+}
+.demo-block.demo-dialog .el-button--text {
+ margin-right: 15px;
+}
+.demo-block .el-dropdown {
+ vertical-align: top;
+}
+.demo-block .el-dropdown + .el-dropdown {
+ margin-left: 15px;
+}
+.demo-block .el-dropdown-link {
+ cursor: pointer;
+ color: #409eff;
+}
+.demo-block .el-icon-arrow-down {
+ font-size: 12px;
+}
+.block-col-2 {
+ margin: -24px;
+}
+.block-col-2 .el-col {
+ padding: 30px 0;
+ text-align: center;
+ border-right: 1px solid #eff2f6;
+}
+.block-col-2 .el-col:last-child {
+ border-right: 0;
+}
+.demo-dropdown .demonstration {
+ display: block;
+ color: #8492a6;
+ font-size: 14px;
+ margin-bottom: 20px;
+}
+.demo-form .el-select .el-input {
+ width: 380px;
+}
+.demo-form .el-form {
+ width: 460px;
+}
+.demo-form .line {
+ text-align: center;
+}
+.demo-form .el-checkbox-group {
+ width: 320px;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+.demo-form .el-checkbox-group:after,
+.demo-form .el-checkbox-group:before {
+ content: ' ';
+ display: table;
+}
+.demo-form .el-checkbox-group:after {
+ clear: both;
+ visibility: hidden;
+ font-size: 0;
+ height: 0;
+}
+.demo-form .el-checkbox-group .el-checkbox {
+ float: left;
+ width: 160px;
+ margin: 0;
+ padding: 0;
+}
+.demo-form .el-checkbox-group .el-checkbox + .el-checkbox {
+ margin-left: 0;
+}
+.demo-form .demo-form-normal {
+ width: 460px;
+}
+.demo-form .demo-form-inline {
+ width: auto;
+}
+.demo-form .demo-form-inline .el-input {
+ width: 150px;
+}
+.demo-form .demo-form-inline > * {
+ margin-right: 10px;
+}
+.demo-form .demo-ruleForm {
+ width: 460px;
+}
+.demo-form .demo-ruleForm .el-select .el-input {
+ width: 360px;
+}
+.demo-form .demo-dynamic .el-input {
+ margin-right: 10px;
+ width: 270px;
+ vertical-align: top;
+}
+.demo-form .fr {
+ float: right;
+}
+ul.language-list {
+ color: #5e6d82;
+ font-size: 14px;
+ padding-left: 20px;
+}
+ul.language-list li {
+ line-height: 1.8;
+}
+.demo-icon .source > div > i {
+ color: #606266;
+ margin: 0 20px;
+ font-size: 1.5em;
+ vertical-align: middle;
+}
+.demo-icon .source button {
+ margin: 0 20px;
+}
+.page-component .content > ul.icon-list {
+ overflow: hidden;
+ list-style: none;
+ padding: 0 !important;
+ border: 1px solid #eaeefb;
+ border-radius: 4px;
+}
+.icon-list li {
+ float: left;
+ width: 16.66%;
+ text-align: center;
+ height: 120px;
+ line-height: 120px;
+ color: #666;
+ font-size: 13px;
+ border-right: 1px solid #eee;
+ border-bottom: 1px solid #eee;
+ margin-right: -1px;
+ margin-bottom: -1px;
+}
+.icon-list li:after {
+ content: '';
+ height: 100%;
+}
+.icon-list li:after,
+.icon-list li span {
+ display: inline-block;
+ vertical-align: middle;
+}
+.icon-list li span {
+ line-height: normal;
+ font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB,
+ Microsoft YaHei, SimSun, sans-serif;
+ color: #99a9bf;
+ transition: color 0.15s linear;
+}
+.icon-list li i {
+ display: block;
+ font-size: 32px;
+ margin-bottom: 15px;
+ color: #606266;
+ transition: color 0.15s linear;
+}
+.icon-list li .icon-name {
+ display: inline-block;
+ padding: 0 3px;
+ height: 1em;
+}
+.icon-list li:hover i,
+.icon-list li:hover span {
+ color: #5cb6ff;
+}
+.demo-block.demo-input-number .el-input-number + .el-input-number {
+ margin-left: 10px;
+}
+.demo-input .el-select .el-input {
+ width: 130px;
+}
+.demo-input .el-input {
+ width: 180px;
+}
+.demo-input .el-textarea {
+ width: 414px;
+}
+.demo-input .el-input-group {
+ width: 100%;
+}
+.demo-input .demo-input-size .el-input {
+ vertical-align: top;
+ margin: 0 10px 10px 0;
+}
+.demo-input .input-with-select .el-input-group__prepend {
+ background-color: #fff;
+}
+.demo-input .demo-autocomplete {
+ text-align: center;
+}
+.demo-input .demo-autocomplete .sub-title {
+ margin-bottom: 10px;
+ font-size: 14px;
+ color: #8492a6;
+}
+.demo-input .demo-autocomplete .el-col:not(:last-child) {
+ border-right: 1px solid rgba(224, 230, 237, 0.5);
+}
+.demo-input .demo-autocomplete .el-autocomplete {
+ text-align: left;
+}
+.el-autocomplete-suggestion.my-autocomplete li {
+ line-height: normal;
+ padding-top: 7px;
+ padding-bottom: 7px;
+}
+.el-autocomplete-suggestion.my-autocomplete li .name {
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+.el-autocomplete-suggestion.my-autocomplete li .addr {
+ font-size: 12px;
+ color: #b4b4b4;
+}
+.el-autocomplete-suggestion.my-autocomplete li .highlighted .addr {
+ color: #ddd;
+}
+.demo-input-suffix {
+ margin-bottom: 15px;
+}
+.demo-input-suffix .el-input {
+ margin-right: 15px;
+}
+.demo-layout .el-row {
+ margin-bottom: 20px;
+}
+.demo-layout .el-row:last-child {
+ margin-bottom: 0;
+}
+.demo-layout .el-col {
+ border-radius: 4px;
+}
+.demo-layout .bg-purple-dark {
+ background: #99a9bf;
+}
+.demo-layout .bg-purple {
+ background: #d3dce6;
+}
+.demo-layout .bg-purple-light {
+ background: #e5e9f2;
+}
+.demo-layout .grid-content {
+ border-radius: 4px;
+ min-height: 36px;
+}
+.demo-layout .row-bg {
+ padding: 10px 0;
+ background-color: #f9fafc;
+}
+.demo-loading .el-table {
+ border: none;
+}
+.demo-block.demo-menu .el-menu-demo {
+ padding-left: 55px;
+}
+.demo-block.demo-menu .el-menu-vertical-demo:not(.el-menu--collapse) {
+ width: 240px;
+ min-height: 400px;
+}
+.demo-block.demo-menu .line {
+ height: 1px;
+ background-color: #e0e6ed;
+ margin: 35px -24px;
+}
+.demo-block.demo-menu h5 {
+ font-size: 14px;
+ color: #8492a6;
+ margin-top: 10px;
+}
+.demo-block.demo-menu .tac {
+ text-align: center;
+}
+.demo-block.demo-menu .tac .el-menu-vertical-demo {
+ display: inline-block;
+ text-align: left;
+}
+.demo-pagination .source.first {
+ padding: 0;
+}
+.demo-pagination .first .block {
+ padding: 30px 0;
+ text-align: center;
+ border-right: 1px solid #eff2f6;
+ display: inline-block;
+ width: 50%;
+ box-sizing: border-box;
+}
+.demo-pagination .first .block:last-child {
+ border-right: none;
+}
+.demo-pagination .first .demonstration {
+ display: block;
+ color: #8492a6;
+ font-size: 14px;
+ margin-bottom: 20px;
+}
+.demo-pagination .source.last {
+ padding: 0;
+}
+.demo-pagination .last .block {
+ padding: 30px 24px;
+ border-bottom: 1px solid #eff2f6;
+}
+.demo-pagination .last .block:last-child {
+ border-bottom: none;
+}
+.demo-pagination .last .demonstration {
+ font-size: 14px;
+ color: #8492a6;
+ line-height: 44px;
+}
+.demo-pagination .last .demonstration + .el-pagination {
+ width: 70%;
+ margin: 5px 20px 0 0;
+}
+.demo-block.demo-popover .el-popover + .el-popover {
+ margin-left: 10px;
+}
+.demo-block.demo-popover .el-input {
+ width: 360px;
+}
+.demo-block.demo-popover .el-button {
+ margin-left: 10px;
+}
+.demo-block.demo-progress .el-progress--line {
+ margin-bottom: 15px;
+ width: 350px;
+}
+.demo-block.demo-progress .el-progress--circle {
+ margin-right: 15px;
+}
+.demo-rate .block {
+ padding: 30px 0;
+ text-align: center;
+ border-right: 1px solid #eff2f6;
+ display: inline-block;
+ width: 49%;
+ box-sizing: border-box;
+}
+.demo-rate .block:last-child {
+ border-right: none;
+}
+.demo-rate .demonstration {
+ display: block;
+ color: #8492a6;
+ font-size: 14px;
+ margin-bottom: 20px;
+}
+.demo-select .el-select {
+ width: 240px;
+}
+.demo-block.demo-slider .source {
+ padding: 0;
+}
+.demo-block.demo-slider .block {
+ padding: 30px 24px;
+ overflow: hidden;
+ border-bottom: 1px solid #eff2f6;
+}
+.demo-block.demo-slider .block:last-child {
+ border-bottom: none;
+}
+.demo-block.demo-slider .demonstration {
+ font-size: 14px;
+ color: #8492a6;
+ line-height: 44px;
+}
+.demo-block.demo-slider .demonstration + .el-slider {
+ float: right;
+ width: 70%;
+ margin-right: 20px;
+}
+.demo-block.demo-switch .el-switch {
+ margin: 20px 20px 20px 0;
+}
+.el-table .warning-row {
+ background: #fdf5e6;
+}
+.el-table .success-row {
+ background: #f0f9eb;
+}
+.demo-table .name-wrapper {
+ display: inline-block;
+}
+.demo-table .demo-table-expand label {
+ width: 90px;
+ color: #99a9bf;
+}
+.demo-table .demo-table-expand .el-form-item {
+ margin-right: 0;
+ margin-bottom: 0;
+ width: 50%;
+}
+.demo-block.demo-tag .el-tag + .el-tag {
+ margin-left: 10px;
+}
+.demo-block.demo-tag .button-new-tag {
+ margin-left: 10px;
+ height: 32px;
+ line-height: 30px;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+.demo-block.demo-tag .input-new-tag {
+ width: 90px;
+ margin-left: 10px;
+ vertical-align: bottom;
+}
+.demo-block.demo-tag .tag-group {
+ display: flex;
+ align-items: center;
+}
+.demo-block.demo-tag .tag-group__title {
+ width: 45px;
+ font-size: 14px;
+ color: #606266;
+}
+.demo-block.demo-tag .tag-group + .tag-group {
+ margin-top: 10px;
+}
+.demo-block .el-date-editor + .el-date-editor {
+ margin-left: 10px;
+}
+.demo-timeline .source .radio {
+ margin-bottom: 20px;
+}
+.demo-timeline .source .radio .el-radio-group {
+ margin-left: 20px;
+}
+.demo-tooltip .el-tooltip + .el-tooltip {
+ margin-left: 15px;
+}
+.demo-tooltip .box {
+ width: 400px;
+}
+.demo-tooltip .box .top {
+ text-align: center;
+}
+.demo-tooltip .box .left {
+ float: left;
+ width: 60px;
+}
+.demo-tooltip .box .right {
+ float: right;
+ width: 60px;
+}
+.demo-tooltip .box .bottom {
+ clear: both;
+ text-align: center;
+}
+.demo-tooltip .box .item {
+ margin: 4px;
+}
+.demo-tooltip .box .left .el-tooltip__popper,
+.demo-tooltip .box .right .el-tooltip__popper {
+ padding: 8px 10px;
+}
+.demo-tooltip .box .el-tooltip {
+ margin-left: 0;
+}
+.demo-transition .transition-box {
+ margin-bottom: 10px;
+ width: 200px;
+ height: 100px;
+ border-radius: 4px;
+ background-color: #409eff;
+ text-align: center;
+ color: #fff;
+ padding: 40px 20px;
+ margin-right: 20px;
+ box-sizing: border-box;
+}
+.demo-transfer .transfer-footer {
+ margin-left: 15px;
+ padding: 6px 5px;
+}
+.demo-tree .leaf {
+ width: 20px;
+ background: #ddd;
+}
+.demo-tree .folder {
+ width: 20px;
+ background: #888;
+}
+.demo-tree .buttons,
+.demo-tree .filter-tree {
+ margin-top: 20px;
+}
+.demo-tree .custom-tree-container {
+ display: flex;
+ margin: -24px;
+}
+.demo-tree .block {
+ flex: 1;
+ padding: 8px 24px 24px;
+}
+.demo-tree .block:first-child {
+ border-right: 1px solid #eff2f6;
+}
+.demo-tree .block > p {
+ text-align: center;
+ margin: 0;
+ line-height: 4;
+}
+.demo-tree .custom-tree-node {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 14px;
+ padding-right: 8px;
+}
+.demo-typo-size .color-dark-light {
+ color: #99a9bf;
+}
+.demo-term-box img {
+ width: 24%;
+ margin: 0 4% 20px 0;
+}
+.lineH-left {
+ display: inline-block;
+ height: 80px;
+}
+.lineH-right {
+ display: inline-block;
+ list-style: none;
+ padding: 0 0 0 90px;
+ margin: 0;
+ vertical-align: top;
+}
+.lineH-right li {
+ font-size: 13px;
+ color: #666;
+ height: 20px;
+ line-height: 20px;
+}
+.lineH-right li span {
+ padding-left: 40px;
+}
+.upload-tip {
+ color: #8492a6;
+ font-size: 12px;
+ margin-top: 7px;
+}
+.demo-block {
+ margin-bottom: 24px;
+}
+.demo-block .upload-demo {
+ width: 360px;
+}
+.demo-block .avatar-uploader .el-upload {
+ border: 1px dashed #d9d9d9;
+ border-radius: 6px;
+ cursor: pointer;
+ position: relative;
+ overflow: hidden;
+}
+.demo-block .avatar-uploader .el-upload:focus,
+.demo-block .avatar-uploader .el-upload:hover {
+ border-color: #409eff;
+}
+.demo-block .avatar-uploader .avatar-uploader-icon {
+ font-size: 28px;
+ color: #8c939d;
+ width: 178px;
+ height: 178px;
+ line-height: 178px;
+ text-align: center;
+}
+.demo-block .avatar-uploader .avatar {
+ width: 178px;
+ height: 178px;
+ display: block;
+}
+.demo-divider-container-1 {
+ display: inline-block;
+ width: 33%;
+}
+.demo-divider-container-2 {
+ display: inline-block;
+ width: 50%;
+}
+@keyframes dot {
+ 0% {
+ width: 0;
+ margin-right: 1em;
+ }
+ to {
+ width: 1em;
+ margin-right: 0;
+ }
+}
+.demo-image .block,
+.demo-image__error .block,
+.demo-image__placeholder .block {
+ padding: 30px 0;
+ text-align: center;
+ border-right: 1px solid #eff2f6;
+ display: inline-block;
+ width: 20%;
+ box-sizing: border-box;
+ vertical-align: top;
+}
+.demo-image .block:last-child,
+.demo-image__error .block:last-child,
+.demo-image__placeholder .block:last-child {
+ border-right: none;
+}
+.demo-image .demonstration,
+.demo-image__error .demonstration,
+.demo-image__placeholder .demonstration {
+ display: block;
+ color: #8492a6;
+ font-size: 14px;
+ margin-bottom: 20px;
+}
+.demo-image__error .block,
+.demo-image__placeholder .block {
+ width: 49%;
+}
+.demo-image__error .el-image,
+.demo-image__placeholder .el-image {
+ width: 300px;
+ height: 200px;
+}
+.demo-image__error .image-slot,
+.demo-image__placeholder .image-slot {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+ background: #f5f7fa;
+ color: #909399;
+ font-size: 14px;
+}
+.demo-image__placeholder .dot {
+ animation: dot 2s steps(3, start) infinite;
+ overflow: hidden;
+}
+.demo-image__error .image-slot {
+ font-size: 30px;
+}
+.demo-image__lazy {
+ height: 400px;
+ overflow-y: auto;
+}
+.demo-image__lazy .el-image {
+ display: block;
+ min-height: 200px;
+ margin-bottom: 10px;
+}
+.demo-image__lazy .el-image:last-child {
+ margin-bottom: 0;
+}
+.infinite-list {
+ height: 300px;
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+.infinite-list .infinite-list-item {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 50px;
+ background: #e8f3fe;
+ margin: 10px;
+ color: #7dbcfc;
+}
+.infinite-list .infinite-list-item + .list-item {
+ margin-top: 10px;
+}
+.infinite-list-wrapper {
+ height: 300px;
+ text-align: center;
+}
+.infinite-list-wrapper .list {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+.infinite-list-wrapper .list-item {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 50px;
+ background: #fff6f6;
+ color: #ff8484;
+}
+.infinite-list-wrapper .list-item + .list-item {
+ margin-top: 10px;
+}
+.demo-avatar.demo-basic {
+ text-align: center;
+}
+.demo-avatar.demo-basic .demo-basic--circle,
+.demo-avatar.demo-basic .demo-basic--square {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+.demo-avatar.demo-basic .demo-basic--circle .block,
+.demo-avatar.demo-basic .demo-basic--square .block {
+ flex: 1;
+}
+.demo-avatar.demo-basic .demo-basic--circle .block:not(:last-child),
+.demo-avatar.demo-basic .demo-basic--square .block:not(:last-child) {
+ border-right: 1px solid rgba(224, 230, 237, 0.5);
+}
+.demo-avatar .sub-title {
+ margin-bottom: 10px;
+ font-size: 14px;
+ color: #8492a6;
+}
+.demo-avatar .el-col:not(:last-child) {
+ border-right: 1px solid rgba(224, 230, 237, 0.5);
+}
+.demo-avatar .demo-type {
+ display: flex;
+}
+.demo-avatar .demo-type > div {
+ flex: 1;
+ text-align: center;
+}
+.demo-avatar .demo-type > div:not(:last-child) {
+ border-right: 1px solid rgba(224, 230, 237, 0.5);
+}
+.demo-avatar .demo-fit {
+ display: flex;
+ text-align: center;
+ justify-content: space-between;
+}
+.demo-avatar .demo-fit .block {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 0;
+}
+.demo-avatar .demo-fit .title {
+ margin-bottom: 10px;
+ font-size: 14px;
+ color: #8492a6;
+}
+.demo-drawer__content {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+}
+.demo-drawer__content form {
+ flex: 1;
+}
+.demo-drawer__footer {
+ display: flex;
+}
+.demo-drawer__footer button {
+ flex: 1;
+}
+.el-drawer__body {
+ padding: 20px;
+}
+body,
+html {
+ margin: 0;
+ padding: 0;
+ height: 100%;
+ font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB,
+ Microsoft YaHei, SimSun, sans-serif;
+ font-weight: 400;
+ -webkit-font-smoothing: antialiased;
+ -webkit-tap-highlight-color: transparent;
+}
+body.is-component,
+html.is-component {
+ overflow: hidden;
+}
+#app {
+ height: 100%;
+}
+#app.is-component {
+ overflow-y: hidden;
+}
+#app.is-component .main-cnt {
+ padding: 0;
+ margin-top: 0;
+ height: 100%;
+ min-height: auto;
+}
+#app.is-component .headerWrapper {
+ position: fixed;
+ width: 100%;
+ left: 0;
+ top: 0;
+ z-index: 1500;
+}
+#app.is-component .headerWrapper .container {
+ padding: 0;
+}
+a {
+ color: #409eff;
+ text-decoration: none;
+}
+code {
+ background-color: #f9fafc;
+ padding: 0 4px;
+ border: 1px solid #eaeefb;
+ border-radius: 4px;
+}
+button,
+input,
+select,
+textarea {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+ color: inherit;
+}
+.hljs {
+ line-height: 1.8;
+ font-family: Menlo, Monaco, Consolas, Courier, monospace;
+ font-size: 12px;
+ padding: 18px 24px;
+ background-color: #fafafa;
+ border: 1px solid #eaeefb;
+ margin-bottom: 25px;
+ border-radius: 4px;
+ -webkit-font-smoothing: auto;
+}
+.main-cnt {
+ margin-top: -80px;
+ padding: 80px 0 340px;
+ box-sizing: border-box;
+ min-height: 100%;
+}
+.container,
+.page-container {
+ width: 1140px;
+ padding: 0;
+ margin: 0 auto;
+}
+.page-container {
+ padding-top: 55px;
+}
+.page-container h2 {
+ font-size: 28px;
+ color: #1f2d3d;
+ margin: 0;
+}
+.page-container h3 {
+ font-size: 22px;
+}
+.page-container h2,
+.page-container h3,
+.page-container h4,
+.page-container h5 {
+ font-weight: 400;
+ color: #1f2f3d;
+}
+.page-container h2:hover a,
+.page-container h3:hover a,
+.page-container h4:hover a,
+.page-container h5:hover a {
+ opacity: 0.4;
+}
+.page-container h2 a,
+.page-container h3 a,
+.page-container h4 a,
+.page-container h5 a {
+ float: left;
+ margin-left: -20px;
+ opacity: 0;
+ cursor: pointer;
+}
+.page-container h2 a:hover,
+.page-container h3 a:hover,
+.page-container h4 a:hover,
+.page-container h5 a:hover {
+ opacity: 0.4;
+}
+.page-container p {
+ font-size: 14px;
+ color: #5e6d82;
+ line-height: 1.5em;
+}
+.page-container .tip {
+ padding: 8px 16px;
+ background-color: #ecf8ff;
+ border-radius: 4px;
+ border-left: 5px solid #50bfff;
+ margin: 20px 0;
+}
+.page-container .tip code {
+ background-color: hsla(0, 0%, 100%, 0.7);
+ color: #445368;
+}
+.page-container .warning {
+ padding: 8px 16px;
+ background-color: #fff6f7;
+ border-radius: 4px;
+ border-left: 5px solid #fe6c6f;
+ margin: 20px 0;
+}
+.page-container .warning code {
+ background-color: hsla(0, 0%, 100%, 0.7);
+ color: #445368;
+}
+.demo {
+ margin: 20px 0;
+}
+@media (max-width: 1140px) {
+ .container,
+ .page-container {
+ width: 100%;
+ }
+}
+@media (max-width: 768px) {
+ .container,
+ .page-container {
+ padding: 0 20px;
+ }
+ #app.is-component .headerWrapper .container {
+ padding: 0 12px;
+ }
+}
+@font-face {
+ font-family: icomoon;
+ src: url(data:application/vnd.ms-fontobject;base64,SAgAAKQHAAABAAIAAAAAAAAAAAAAAAAAAAABAJABAAAAAExQAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAa7522AAAAAAAAAAAAAAAAAAAAAAAAA4AaQBjAG8AbQBvAG8AbgAAAA4AUgBlAGcAdQBsAGEAcgAAABYAVgBlAHIAcwBpAG8AbgAgADEALgAwAAAADgBpAGMAbwBtAG8AbwBuAAAAAAAAAQAAAAsAgAADADBPUy8yDxIFxwAAALwAAABgY21hcBdW0ooAAAEcAAAAVGdhc3AAAAAQAAABcAAAAAhnbHlmx3GYOgAAAXgAAAPUaGVhZArUIjUAAAVMAAAANmhoZWEHwgPJAAAFhAAAACRobXR4FgAAAAAABagAAAAgbG9jYQMUAf4AAAXIAAAAEm1heHAADgBvAAAF3AAAACBuYW1lmUoJ+wAABfwAAAGGcG9zdAADAAAAAAeEAAAAIAADA5oBkAAFAAACmQLMAAAAjwKZAswAAAHrADMBCQAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAEAAAOkDA8D/wABAA8AAQAAAAAEAAAAAAAAAAAAAACAAAAAAAAMAAAADAAAAHAABAAMAAAAcAAMAAQAAABwABAA4AAAACgAIAAIAAgABACDpA//9//8AAAAAACDpAP/9//8AAf/jFwQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAUAAP/ABAADwAATACcANQBDAFEAABM0PgIzMh4CFRQOAiMiLgIlNC4CIyIOAhUUHgIzMj4CJTQ2MzIWHQEUBiMiJjUlNDYzMhYdARQGIyImNQEiBhUUFjMhMjY1NCYjAFCLu2pqu4tQUIu7amq7i1ADs0R2n1pan3ZERHafWlqfdkT9cx4WFR4eFRYeAU0eFRYeHhYVHv72ERgYEQEuERgYEQHAaruLUFCLu2pqu4tQUIu7alqfdkREdp9aWp92RER2n+cVHh4VMxYeHhYzFR4eFTMWHh4W/wAZEREZGRERGQAAAAQAAP/ABAADwAATACEALwBPAAABIg4CFRQeAjMyPgI1NC4CATQ2MzIWHQEUBiMiJjUlNDYzMhYdARQGIyImNRMnLgEjIgYPAQ4BIyImNTQ2Nyc3PgEzMhYXHgEVFAYnAgBqu4tQUIu7amq7i1BQi7v+vB4WFR4eFRYeAU0eFRYeHhYVHkQEKlovMFsqBAEFAhAVBgYBCjJrNTZpMwkKHBMDwFCLu2pqu4tQUIu7amq7i1D+jRUeHhUzFh4eFjMVHh4VMxYeHhb+mwEVFRUVAQEBGBEIDwYDBRgaGRoFEwwTGgYAAAQAAP/ABAADwAATACEALwA9AAAFIi4CNTQ+AjMyHgIVFA4CARUUFjMyNj0BNCYjIgYFFRQWMzI2PQE0JiMiBgEiBhUUFjMhMjY1NCYjAgBqu4tQUIu7amq7i1BQi7v+vB4WFR4eFRYeAU0eFRYeHhYVHv72ERgYEQEuERgYEUBQi7tqaruLUFCLu2pqu4tQAo0zFh4eFjMVHh4VMxYeHhYzFR4e/rgZEREZGRERGQAABAAA/8AEAAPAABMAUABeAGwAAAEiDgIVFB4CMzI+AjU0LgITFAYVDgEVDgMjOAExOAExIi4CJzQmJzQmNS4BNTQ2Nz4BMzIWFzEeATMyNjcxPgEzMhYXHgEVFAYHAzQ2MzIWHQEUBiMiJjUlNDYzMhYdARQGIyImNQIAaruLUFCLu2pqu4tQUIu7xwEBARU/TVsyMltNPxUBAQEBAQICBRUMDBUFIHhLS3ggBRUMDBUFAgIBAb4eFRYeHhYVHv6zHhYVHh4VFh4DwFCLu2pqu4tQUIu7amq7i1D9cgICAQECASlCMBsbMEIpAQIBAQICAgYDBQkECwwMCz1MTD0LDAwLBAkFAwYCARsVHh4VMxYeHhYzFR4eFTMWHh4WAAAAAQAAAAAAANh2vmtfDzz1AAsEAAAAAADT2u7cAAAAANPa7twAAP/ABAADwAAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAAEAAABAAAAAAAAAAAAAAAAAAAACAQAAAAAAAAAAAAAAAIAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAKABQAHgCQAQIBWgHqAAAAAQAAAAgAbQAFAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGljb21vb24AaQBjAG8AbQBvAG8AblZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGljb21vb24AaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AblJlZ3VsYXIAUgBlAGcAdQBsAGEAcmljb21vb24AaQBjAG8AbQBvAG8AbkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=);
+ src: url(data:application/vnd.ms-fontobject;base64,SAgAAKQHAAABAAIAAAAAAAAAAAAAAAAAAAABAJABAAAAAExQAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAa7522AAAAAAAAAAAAAAAAAAAAAAAAA4AaQBjAG8AbQBvAG8AbgAAAA4AUgBlAGcAdQBsAGEAcgAAABYAVgBlAHIAcwBpAG8AbgAgADEALgAwAAAADgBpAGMAbwBtAG8AbwBuAAAAAAAAAQAAAAsAgAADADBPUy8yDxIFxwAAALwAAABgY21hcBdW0ooAAAEcAAAAVGdhc3AAAAAQAAABcAAAAAhnbHlmx3GYOgAAAXgAAAPUaGVhZArUIjUAAAVMAAAANmhoZWEHwgPJAAAFhAAAACRobXR4FgAAAAAABagAAAAgbG9jYQMUAf4AAAXIAAAAEm1heHAADgBvAAAF3AAAACBuYW1lmUoJ+wAABfwAAAGGcG9zdAADAAAAAAeEAAAAIAADA5oBkAAFAAACmQLMAAAAjwKZAswAAAHrADMBCQAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAEAAAOkDA8D/wABAA8AAQAAAAAEAAAAAAAAAAAAAACAAAAAAAAMAAAADAAAAHAABAAMAAAAcAAMAAQAAABwABAA4AAAACgAIAAIAAgABACDpA//9//8AAAAAACDpAP/9//8AAf/jFwQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAUAAP/ABAADwAATACcANQBDAFEAABM0PgIzMh4CFRQOAiMiLgIlNC4CIyIOAhUUHgIzMj4CJTQ2MzIWHQEUBiMiJjUlNDYzMhYdARQGIyImNQEiBhUUFjMhMjY1NCYjAFCLu2pqu4tQUIu7amq7i1ADs0R2n1pan3ZERHafWlqfdkT9cx4WFR4eFRYeAU0eFRYeHhYVHv72ERgYEQEuERgYEQHAaruLUFCLu2pqu4tQUIu7alqfdkREdp9aWp92RER2n+cVHh4VMxYeHhYzFR4eFTMWHh4W/wAZEREZGRERGQAAAAQAAP/ABAADwAATACEALwBPAAABIg4CFRQeAjMyPgI1NC4CATQ2MzIWHQEUBiMiJjUlNDYzMhYdARQGIyImNRMnLgEjIgYPAQ4BIyImNTQ2Nyc3PgEzMhYXHgEVFAYnAgBqu4tQUIu7amq7i1BQi7v+vB4WFR4eFRYeAU0eFRYeHhYVHkQEKlovMFsqBAEFAhAVBgYBCjJrNTZpMwkKHBMDwFCLu2pqu4tQUIu7amq7i1D+jRUeHhUzFh4eFjMVHh4VMxYeHhb+mwEVFRUVAQEBGBEIDwYDBRgaGRoFEwwTGgYAAAQAAP/ABAADwAATACEALwA9AAAFIi4CNTQ+AjMyHgIVFA4CARUUFjMyNj0BNCYjIgYFFRQWMzI2PQE0JiMiBgEiBhUUFjMhMjY1NCYjAgBqu4tQUIu7amq7i1BQi7v+vB4WFR4eFRYeAU0eFRYeHhYVHv72ERgYEQEuERgYEUBQi7tqaruLUFCLu2pqu4tQAo0zFh4eFjMVHh4VMxYeHhYzFR4e/rgZEREZGRERGQAABAAA/8AEAAPAABMAUABeAGwAAAEiDgIVFB4CMzI+AjU0LgITFAYVDgEVDgMjOAExOAExIi4CJzQmJzQmNS4BNTQ2Nz4BMzIWFzEeATMyNjcxPgEzMhYXHgEVFAYHAzQ2MzIWHQEUBiMiJjUlNDYzMhYdARQGIyImNQIAaruLUFCLu2pqu4tQUIu7xwEBARU/TVsyMltNPxUBAQEBAQICBRUMDBUFIHhLS3ggBRUMDBUFAgIBAb4eFRYeHhYVHv6zHhYVHh4VFh4DwFCLu2pqu4tQUIu7amq7i1D9cgICAQECASlCMBsbMEIpAQIBAQICAgYDBQkECwwMCz1MTD0LDAwLBAkFAwYCARsVHh4VMxYeHhYzFR4eFTMWHh4WAAAAAQAAAAAAANh2vmtfDzz1AAsEAAAAAADT2u7cAAAAANPa7twAAP/ABAADwAAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAAEAAABAAAAAAAAAAAAAAAAAAAACAQAAAAAAAAAAAAAAAIAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAKABQAHgCQAQIBWgHqAAAAAQAAAAgAbQAFAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGljb21vb24AaQBjAG8AbQBvAG8AblZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGljb21vb24AaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AblJlZ3VsYXIAUgBlAGcAdQBsAGEAcmljb21vb24AaQBjAG8AbQBvAG8AbkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=#iefix)
+ format('embedded-opentype'),
+ url(data:font/ttf;base64,AAEAAAALAIAAAwAwT1MvMg8SBccAAAC8AAAAYGNtYXAXVtKKAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZsdxmDoAAAF4AAAD1GhlYWQK1CI1AAAFTAAAADZoaGVhB8IDyQAABYQAAAAkaG10eBYAAAAAAAWoAAAAIGxvY2EDFAH+AAAFyAAAABJtYXhwAA4AbwAABdwAAAAgbmFtZZlKCfsAAAX8AAABhnBvc3QAAwAAAAAHhAAAACAAAwOaAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpAwPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6QP//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAAFAAD/wAQAA8AAEwAnADUAQwBRAAATND4CMzIeAhUUDgIjIi4CJTQuAiMiDgIVFB4CMzI+AiU0NjMyFh0BFAYjIiY1JTQ2MzIWHQEUBiMiJjUBIgYVFBYzITI2NTQmIwBQi7tqaruLUFCLu2pqu4tQA7NEdp9aWp92RER2n1pan3ZE/XMeFhUeHhUWHgFNHhUWHh4WFR7+9hEYGBEBLhEYGBEBwGq7i1BQi7tqaruLUFCLu2pan3ZERHafWlqfdkREdp/nFR4eFTMWHh4WMxUeHhUzFh4eFv8AGRERGRkRERkAAAAEAAD/wAQAA8AAEwAhAC8ATwAAASIOAhUUHgIzMj4CNTQuAgE0NjMyFh0BFAYjIiY1JTQ2MzIWHQEUBiMiJjUTJy4BIyIGDwEOASMiJjU0NjcnNz4BMzIWFx4BFRQGJwIAaruLUFCLu2pqu4tQUIu7/rweFhUeHhUWHgFNHhUWHh4WFR5EBCpaLzBbKgQBBQIQFQYGAQoyazU2aTMJChwTA8BQi7tqaruLUFCLu2pqu4tQ/o0VHh4VMxYeHhYzFR4eFTMWHh4W/psBFRUVFQEBARgRCA8GAwUYGhkaBRMMExoGAAAEAAD/wAQAA8AAEwAhAC8APQAABSIuAjU0PgIzMh4CFRQOAgEVFBYzMjY9ATQmIyIGBRUUFjMyNj0BNCYjIgYBIgYVFBYzITI2NTQmIwIAaruLUFCLu2pqu4tQUIu7/rweFhUeHhUWHgFNHhUWHh4WFR7+9hEYGBEBLhEYGBFAUIu7amq7i1BQi7tqaruLUAKNMxYeHhYzFR4eFTMWHh4WMxUeHv64GRERGRkRERkAAAQAAP/ABAADwAATAFAAXgBsAAABIg4CFRQeAjMyPgI1NC4CExQGFQ4BFQ4DIzgBMTgBMSIuAic0Jic0JjUuATU0Njc+ATMyFhcxHgEzMjY3MT4BMzIWFx4BFRQGBwM0NjMyFh0BFAYjIiY1JTQ2MzIWHQEUBiMiJjUCAGq7i1BQi7tqaruLUFCLu8cBAQEVP01bMjJbTT8VAQEBAQECAgUVDAwVBSB4S0t4IAUVDAwVBQICAQG+HhUWHh4WFR7+sx4WFR4eFRYeA8BQi7tqaruLUFCLu2pqu4tQ/XICAgEBAgEpQjAbGzBCKQECAQECAgIGAwUJBAsMDAs9TEw9CwwMCwQJBQMGAgEbFR4eFTMWHh4WMxUeHhUzFh4eFgAAAAEAAAAAAADYdr5rXw889QALBAAAAAAA09ru3AAAAADT2u7cAAD/wAQAA8AAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAABAAAAQAAAAAAAAAAAAAAAAAAAAgEAAAAAAAAAAAAAAACAAAABAAAAAQAAAAEAAAABAAAAAAAAAAACgAUAB4AkAECAVoB6gAAAAEAAAAIAG0ABQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAHAAAAAQAAAAAAAgAHAGAAAQAAAAAAAwAHADYAAQAAAAAABAAHAHUAAQAAAAAABQALABUAAQAAAAAABgAHAEsAAQAAAAAACgAaAIoAAwABBAkAAQAOAAcAAwABBAkAAgAOAGcAAwABBAkAAwAOAD0AAwABBAkABAAOAHwAAwABBAkABQAWACAAAwABBAkABgAOAFIAAwABBAkACgA0AKRpY29tb29uAGkAYwBvAG0AbwBvAG5WZXJzaW9uIDEuMABWAGUAcgBzAGkAbwBuACAAMQAuADBpY29tb29uAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG5SZWd1bGFyAFIAZQBnAHUAbABhAHJpY29tb29uAGkAYwBvAG0AbwBvAG5Gb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
+ format('truetype'),
+ url(data:font/woff;base64,d09GRgABAAAAAAfwAAsAAAAAB6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIFx2NtYXAAAAFoAAAAVAAAAFQXVtKKZ2FzcAAAAbwAAAAIAAAACAAAABBnbHlmAAABxAAAA9QAAAPUx3GYOmhlYWQAAAWYAAAANgAAADYK1CI1aGhlYQAABdAAAAAkAAAAJAfCA8lobXR4AAAF9AAAACAAAAAgFgAAAGxvY2EAAAYUAAAAEgAAABIDFAH+bWF4cAAABigAAAAgAAAAIAAOAG9uYW1lAAAGSAAAAYYAAAGGmUoJ+3Bvc3QAAAfQAAAAIAAAACAAAwAAAAMDmgGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA6QMDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADgAAAAKAAgAAgACAAEAIOkD//3//wAAAAAAIOkA//3//wAB/+MXBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAABQAA/8AEAAPAABMAJwA1AEMAUQAAEzQ+AjMyHgIVFA4CIyIuAiU0LgIjIg4CFRQeAjMyPgIlNDYzMhYdARQGIyImNSU0NjMyFh0BFAYjIiY1ASIGFRQWMyEyNjU0JiMAUIu7amq7i1BQi7tqaruLUAOzRHafWlqfdkREdp9aWp92RP1zHhYVHh4VFh4BTR4VFh4eFhUe/vYRGBgRAS4RGBgRAcBqu4tQUIu7amq7i1BQi7tqWp92RER2n1pan3ZERHaf5xUeHhUzFh4eFjMVHh4VMxYeHhb/ABkRERkZEREZAAAABAAA/8AEAAPAABMAIQAvAE8AAAEiDgIVFB4CMzI+AjU0LgIBNDYzMhYdARQGIyImNSU0NjMyFh0BFAYjIiY1EycuASMiBg8BDgEjIiY1NDY3Jzc+ATMyFhceARUUBicCAGq7i1BQi7tqaruLUFCLu/68HhYVHh4VFh4BTR4VFh4eFhUeRAQqWi8wWyoEAQUCEBUGBgEKMms1NmkzCQocEwPAUIu7amq7i1BQi7tqaruLUP6NFR4eFTMWHh4WMxUeHhUzFh4eFv6bARUVFRUBAQEYEQgPBgMFGBoZGgUTDBMaBgAABAAA/8AEAAPAABMAIQAvAD0AAAUiLgI1ND4CMzIeAhUUDgIBFRQWMzI2PQE0JiMiBgUVFBYzMjY9ATQmIyIGASIGFRQWMyEyNjU0JiMCAGq7i1BQi7tqaruLUFCLu/68HhYVHh4VFh4BTR4VFh4eFhUe/vYRGBgRAS4RGBgRQFCLu2pqu4tQUIu7amq7i1ACjTMWHh4WMxUeHhUzFh4eFjMVHh7+uBkRERkZEREZAAAEAAD/wAQAA8AAEwBQAF4AbAAAASIOAhUUHgIzMj4CNTQuAhMUBhUOARUOAyM4ATE4ATEiLgInNCYnNCY1LgE1NDY3PgEzMhYXMR4BMzI2NzE+ATMyFhceARUUBgcDNDYzMhYdARQGIyImNSU0NjMyFh0BFAYjIiY1AgBqu4tQUIu7amq7i1BQi7vHAQEBFT9NWzIyW00/FQEBAQEBAgIFFQwMFQUgeEtLeCAFFQwMFQUCAgEBvh4VFh4eFhUe/rMeFhUeHhUWHgPAUIu7amq7i1BQi7tqaruLUP1yAgIBAQIBKUIwGxswQikBAgEBAgICBgMFCQQLDAwLPUxMPQsMDAsECQUDBgIBGxUeHhUzFh4eFjMVHh4VMxYeHhYAAAABAAAAAAAA2Ha+a18PPPUACwQAAAAAANPa7twAAAAA09ru3AAA/8AEAAPAAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAQAAAEAAAAAAAAAAAAAAAAAAAAIBAAAAAAAAAAAAAAAAgAAAAQAAAAEAAAABAAAAAQAAAAAAAAAAAoAFAAeAJABAgFaAeoAAAABAAAACABtAAUAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEABwAAAAEAAAAAAAIABwBgAAEAAAAAAAMABwA2AAEAAAAAAAQABwB1AAEAAAAAAAUACwAVAAEAAAAAAAYABwBLAAEAAAAAAAoAGgCKAAMAAQQJAAEADgAHAAMAAQQJAAIADgBnAAMAAQQJAAMADgA9AAMAAQQJAAQADgB8AAMAAQQJAAUAFgAgAAMAAQQJAAYADgBSAAMAAQQJAAoANACkaWNvbW9vbgBpAGMAbwBtAG8AbwBuVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwaWNvbW9vbgBpAGMAbwBtAG8AbwBuaWNvbW9vbgBpAGMAbwBtAG8AbwBuUmVndWxhcgBSAGUAZwB1AGwAYQByaWNvbW9vbgBpAGMAbwBtAG8AbwBuRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==)
+ format('woff'),
+ url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxmb250IGlkPSJpY29tb29uIiBob3Jpei1hZHYteD0iMTAyNCI+PGZvbnQtZmFjZSB1bml0cy1wZXItZW09IjEwMjQiIGFzY2VudD0iOTYwIiBkZXNjZW50PSItNjQiLz48Z2x5cGggaG9yaXotYWR2LXg9IjUxMiIvPjxnbHlwaCB1bmljb2RlPSLupIAiIGdseXBoLW5hbWU9InJhdGUtZmFjZS1vZmYiIGQ9Ik0wIDQ0OGMwIDI4Mi43NjYgMjI5LjIzNCA1MTIgNTEyIDUxMnM1MTItMjI5LjIzNCA1MTItNTEyYzAtMjgyLjc2Ni0yMjkuMjM0LTUxMi01MTItNTEyUzAgMTY1LjIzNCAwIDQ0OHptOTQ3LjIgMGMwIDI0MC4zNTEtMTk0Ljg0OSA0MzUuMi00MzUuMiA0MzUuMlM3Ni44IDY4OC4zNTEgNzYuOCA0NDggMjcxLjY0OSAxMi44IDUxMiAxMi44IDk0Ny4yIDIwNy42NDkgOTQ3LjIgNDQ4ek0yOTQuNCA1ODguODUzQzI5NC40IDYxNy4xIDMxNy4xMjYgNjQwIDM0NS42IDY0MGMyOC4yNzcgMCA1MS4yLTIyLjY2NCA1MS4yLTUxLjE0N3YtNTEuMzA3YzAtMjguMjQ3LTIyLjcyNi01MS4xNDctNTEuMi01MS4xNDctMjguMjc3IDAtNTEuMiAyMi42NjQtNTEuMiA1MS4xNDd2NTEuMzA3em0zMzIuOCAwQzYyNy4yIDYxNy4xIDY0OS45MjYgNjQwIDY3OC40IDY0MGMyOC4yNzcgMCA1MS4yLTIyLjY2NCA1MS4yLTUxLjE0N3YtNTEuMzA3YzAtMjguMjQ3LTIyLjcyNi01MS4xNDctNTEuMi01MS4xNDctMjguMjc3IDAtNTEuMiAyMi42NjQtNTEuMiA1MS4xNDd2NTEuMzA3ek0zNjEuMTQzIDI4MS42QzMzOC40MzIgMjgxLjYgMzIwIDI2Mi45NjMgMzIwIDI0MHMxOC40MzItNDEuNiA0MS4xNDMtNDEuNmgzMDEuNzE0QzY4NS41NjggMTk4LjQgNzA0IDIxNy4wMzcgNzA0IDI0MHMtMTguNDMyIDQxLjYtNDEuMTQzIDQxLjZIMzYxLjE0M3oiLz48Z2x5cGggdW5pY29kZT0i7qSBIiBnbHlwaC1uYW1lPSJyYXRlLWZhY2UtMSIgZD0iTTUxMi4wMDEgOTYwQzIyOS4yMyA5NjAgMCA3MzAuNzcgMCA0NDcuOTk4IDAgMTY1LjIyOCAyMjkuMjMtNjQgNTEyLjAwMS02NCA3OTQuNzctNjQgMTAyNCAxNjUuMjI3IDEwMjQgNDQ3Ljk5OFM3OTQuNzcgOTYwIDUxMi4wMDEgOTYwek0yOTQuNCA1ODguODUzQzI5NC40IDYxNy4xIDMxNy4xMjYgNjQwIDM0NS42IDY0MGMyOC4yNzcgMCA1MS4yLTIyLjY2NCA1MS4yLTUxLjE0N3YtNTEuMzA3YzAtMjguMjQ3LTIyLjcyNi01MS4xNDctNTEuMi01MS4xNDctMjguMjc3IDAtNTEuMiAyMi42NjQtNTEuMiA1MS4xNDd2NTEuMzA3em0zMzIuOCAwQzYyNy4yIDYxNy4xIDY0OS45MjYgNjQwIDY3OC40IDY0MGMyOC4yNzcgMCA1MS4yLTIyLjY2NCA1MS4yLTUxLjE0N3YtNTEuMzA3YzAtMjguMjQ3LTIyLjcyNi01MS4xNDctNTEuMi01MS4xNDctMjguMjc3IDAtNTEuMiAyMi42NjQtNTEuMiA1MS4xNDd2NTEuMzA3em02Ny4zMjktNDA3LjY1NmwtMy40MjIgMS4yMTZjLTU2LjE1IDI3Ljg3Mi0xMTYuMzg4IDQyLjA0Ny0xNzguODgyIDQyLjA0Ny02NC41NTYgMC0xMjUuNjExLTE0LjMxNi0xODEuNTE1LTQyLjQ1bC0zLjM4Mi0xLjEzMmMtMi4xMDItLjYyOC00Ljk0NS0xLjUyOS04LjQ4OS0xLjUyOS0yMC41NTQgMC0zNy4yMzkgMTguMjktMzcuMjM5IDQwLjczNCAwIDEwLjY1NSA0LjU3MSAyMS4zNjEgMTIuMTE0IDI5LjM5OWwtLjQ1NiAyLjQ4MyA5LjUxNiA0LjY5OGM2Ni43NCAzMy4xMDQgMTM5LjMzNiA1MC41MzcgMjA5LjkwNyA1MC41MzcgNzEuODg5IDAgMTQyLjMzNi0xNi45ODQgMjEwLjMxNC01MC45NDggMTEuOTQzLTcuMTgxIDE5LjQwNS0yMC45NTMgMTkuNDA1LTM1LjkwMyAwLTI2LjMyOC0yMS43MS00Ny45NTgtNDcuODcxLTM5LjE1M3oiLz48Z2x5cGggdW5pY29kZT0i7qSCIiBnbHlwaC1uYW1lPSJyYXRlLWZhY2UtMiIgZD0iTTUxMi02NEMyMjkuMjM0LTY0IDAgMTY1LjIzNCAwIDQ0OHMyMjkuMjM0IDUxMiA1MTIgNTEyYzI4Mi43NjYgMCA1MTItMjI5LjIzNCA1MTItNTEyUzc5NC43NjYtNjQgNTEyLTY0ek0yOTQuNCA1ODguODUzdi01MS4zMDdjMC0yOC40ODIgMjIuOTIzLTUxLjE0NyA1MS4yLTUxLjE0NyAyOC40NzQgMCA1MS4yIDIyLjg5OSA1MS4yIDUxLjE0N3Y1MS4zMDdjMCAyOC40ODItMjIuOTIzIDUxLjE0Ny01MS4yIDUxLjE0Ny0yOC40NzQgMC01MS4yLTIyLjg5OS01MS4yLTUxLjE0N3ptMzMyLjggMHYtNTEuMzA3YzAtMjguNDgyIDIyLjkyMy01MS4xNDcgNTEuMi01MS4xNDcgMjguNDc0IDAgNTEuMiAyMi44OTkgNTEuMiA1MS4xNDd2NTEuMzA3YzAgMjguNDgyLTIyLjkyMyA1MS4xNDctNTEuMiA1MS4xNDctMjguNDc0IDAtNTEuMi0yMi44OTktNTEuMi01MS4xNDd6TTM2MS4xNDMgMjgxLjZDMzM4LjQzMiAyODEuNiAzMjAgMjYyLjk2MyAzMjAgMjQwczE4LjQzMi00MS42IDQxLjE0My00MS42aDMwMS43MTRDNjg1LjU2OCAxOTguNCA3MDQgMjE3LjAzNyA3MDQgMjQwcy0xOC40MzIgNDEuNi00MS4xNDMgNDEuNkgzNjEuMTQzeiIvPjxnbHlwaCB1bmljb2RlPSLupIMiIGdseXBoLW5hbWU9InJhdGUtZmFjZS0zIiBkPSJNNTEyLjAwMSA5NjBDMjI5LjIzMSA5NjAgMCA3MzAuNzcgMCA0NDguMDAxUzIyOS4yMy02NCA1MTIuMDAxLTY0Qzc5NC43NzEtNjQgMTAyNCAxNjUuMjMgMTAyNCA0NDcuOTk5Uzc5NC43NzEgOTYwIDUxMi4wMDEgOTYwem0zMDUuNDk0LTY1NC40MzVhNDAuNDA2IDQwLjQwNiAwIDAgMC0xLjU2OS00LjM1IDQwLjg1IDQwLjg1IDAgMCAwLTIuMzE3LTQuNTU2Qzc1Ny45NzggMTg5LjA0NiA2NDQuMDkxIDExNS4yIDUxMi4yODYgMTE1LjJsLS4yODYuMDAyLS4yODYtLjAwMmMtMTMxLjgwNCAwLTI0NS42OTMgNzMuODQ1LTMwMS4zMjMgMTgxLjQ1OWE0MC44NSA0MC44NSAwIDAgMC0yLjMxNyA0LjU1NiA0MC4zMjggNDAuMzI4IDAgMCAwLTEuNTY5IDQuMzUgNDAuMzE3IDQwLjMxNyAwIDAgMC0xLjcwNSAxMS41OTcgNDAuMzE0IDQwLjMxNCAwIDAgMCA0LjM3MiAxOC4yODJjNi44OTcgMTMuNjAxIDIxLjIzOSAyMi45NTUgMzcuODIyIDIyLjk1NXMzMC45MjctOS4zNTUgMzcuODIzLTIyLjk1NWguNjc2QzMyNi45MDQgMjUzLjk5MSA0MTIuNjI0IDE5Ny45IDUxMiAxOTcuNzkyYzk5LjM3NS4xMDggMTg1LjA5NSA1Ni4yIDIyNi41MDcgMTM3LjY1MmguNjc2YzYuODk3IDEzLjYwMSAyMS4yMzkgMjIuOTU1IDM3LjgyMyAyMi45NTVzMzAuOTI3LTkuMzU1IDM3LjgyMi0yMi45NTVhNDAuMjk4IDQwLjI5OCAwIDAgMCA0LjM3Mi0xOC4yODJjMC00LjAyOS0uNjAyLTcuOTE4LTEuNzA1LTExLjU5N3pNNjI3LjIgNTg4Ljg1M0M2MjcuMiA2MTcuMSA2NDkuOTI2IDY0MCA2NzguNCA2NDBjMjguMjc3IDAgNTEuMi0yMi42NjQgNTEuMi01MS4xNDd2LTUxLjMwN2MwLTI4LjI0Ny0yMi43MjYtNTEuMTQ3LTUxLjItNTEuMTQ3LTI4LjI3NyAwLTUxLjIgMjIuNjY0LTUxLjIgNTEuMTQ3djUxLjMwN3ptLTMzMi44IDBDMjk0LjQgNjE3LjEgMzE3LjEyNiA2NDAgMzQ1LjYgNjQwYzI4LjI3NyAwIDUxLjItMjIuNjY0IDUxLjItNTEuMTQ3di01MS4zMDdjMC0yOC4yNDctMjIuNzI2LTUxLjE0Ny01MS4yLTUxLjE0Ny0yOC4yNzcgMC01MS4yIDIyLjY2NC01MS4yIDUxLjE0N3Y1MS4zMDd6Ii8+PC9mb250PjwvZGVmcz48L3N2Zz4=)
+ format('svg');
+ font-weight: 400;
+ font-style: normal;
+}
+[class*=' icon-'],
+[class^='icon-'] {
+ font-family: icomoon !important;
+ speak: none;
+ font-style: normal;
+ font-weight: 400;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.icon-rate-face-off:before {
+ content: '\e900';
+}
+.icon-rate-face-1:before {
+ content: '\e901';
+}
+.icon-rate-face-2:before {
+ content: '\e902';
+}
+.icon-rate-face-3:before {
+ content: '\e903';
+}
+
+.config {
+ padding: 5px 0;
+}
+.config-label {
+ color: #606266;
+ font-size: 14px;
+ padding-bottom: 8px;
+ position: relative;
+}
+.content-80 {
+ box-sizing: border-box;
+ display: inline-block;
+ width: 80%;
+}
+.content-20 {
+ width: 20%;
+}
+.content-10,
+.content-20 {
+ box-sizing: border-box;
+ display: inline-block;
+ vertical-align: bottom;
+}
+.content-10 {
+ width: 10%;
+}
+.content-15 {
+ box-sizing: border-box;
+ display: inline-block;
+ width: 15%;
+ vertical-align: bottom;
+}
+input {
+ cursor: pointer;
+}
+.colorPicker {
+ margin-left: 10px;
+ vertical-align: bottom;
+}
+.select {
+ width: 100%;
+}
+.plus-button[data-v-98c1688e] {
+ position: absolute;
+ left: 90%;
+ margin-top: 4px;
+}
+.colorPicker[data-v-98c1688e] {
+ margin-left: 0;
+}
+.content-20 .el-input__suffix-inner span[data-v-98c1688e] {
+ line-height: 28px;
+}
+.content-20[data-v-98c1688e] {
+ padding: 0 3px;
+}
+.content-10[data-v-98c1688e] {
+ vertical-align: top;
+}
+.content-tip[data-v-98c1688e] {
+ color: #909399;
+ font-size: 12px;
+}
+.config-content[data-v-98c1688e] {
+ padding: 5px 0;
+}
+.el-button--mini.is-round[data-v-98c1688e] {
+ padding: 3px;
+}
+.editor-main {
+ padding: 0 18px 15px;
+ overflow-y: auto;
+}
+.category-name {
+ color: #c0c4cc;
+ font-size: 18px;
+ display: block;
+ margin: 13px 0 3px;
+}
+.configurator-action {
+ padding: 15px 18px 0;
+}
+.configurator-action .action-group {
+ padding: 5px 0;
+}
+.configurator-action .action-group img {
+ cursor: not-allowed;
+ width: 16px;
+ height: 16px;
+ padding: 7px 0;
+ margin-left: 5px;
+ opacity: 0.5;
+}
+.configurator-action .action-group img.active {
+ opacity: 1;
+ cursor: pointer;
+}
+.configurator-action .action-group img:last-of-type {
+ margin-left: 10px;
+}
+.configurator-action .action-group .button-group {
+ float: right;
+}
+.configurator-action .action-group .button-group .el-button {
+ padding: 6px 15px;
+}
+.configurator-action .action-group .button-group .el-button.is-disabled {
+ color: #c0c4cc;
+ background-color: #fff;
+ border-color: #ebeef5;
+}
+.configurator-action .action-group .button-group .reset {
+ background: #e6f1fc;
+ color: #1989fa;
+ border-color: #a2cffc;
+}
+.configurator-action .action-group .button-group .download {
+ background: #1989fa;
+ color: #fff;
+ border-color: #1989fa;
+}
+.configurator-action .selector {
+ width: 100%;
+}
+.configurator-action .selector input {
+ background: #f5f7fa;
+ border: none;
+ font-size: 18px;
+ padding-left: 0;
+ color: #606266;
+}
+.configurator-action .line {
+ width: 100%;
+ height: 0;
+ border-bottom: 1px solid #dcdfe6;
+}
+.main-configurator {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+.component-preview {
+ padding-right: 10px;
+}
+.component-preview:last-of-type {
+ padding-bottom: 20px;
+}
+.component-preview h4 {
+ font-size: 20px;
+ margin: 40px 0 20px;
+ color: #909399;
+}
+.component-preview .demo-item {
+ margin-top: 10px;
+ margin-right: 40px;
+}
+.component-preview .demo-line {
+ margin: 15px 0;
+}
+.component-preview .el-carousel__item:nth-child(2n) {
+ background-color: #99a9bf;
+}
+.component-preview .el-carousel__item:nth-child(odd) {
+ background-color: #d3dce6;
+}
+.component-preview .el-avatar:not(:last-child) {
+ margin-right: 20px;
+}
+.component-preview .avatar-demo {
+ display: flex;
+ align-items: center;
+}
+.component-preview .heading > div {
+ margin-bottom: 15px;
+}
+.component-preview .title {
+ font-size: 18px;
+ font-weight: 400;
+ padding: 0 20px;
+}
+.component-preview .paragraph {
+ padding: 0 20px;
+}
+.component-preview .demo-color-box {
+ margin: 0;
+}
+.component-preview .color {
+ margin-right: -12%;
+}
+.theme-card-item {
+ user-select: none;
+ border-radius: 4px;
+ overflow: hidden;
+ background: #fff;
+ height: 90%;
+ margin: 25px 0;
+ box-shadow: 0 0 1px 0 #666;
+}
+.theme-card-item.is-hidden {
+ opacity: 0;
+ height: 0;
+}
+.theme-card-item .upload {
+ cursor: pointer;
+ background: #f5f7fa;
+ height: 100%;
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+.theme-card-item .upload .upload-action {
+ width: 40%;
+ margin: 0 auto;
+ text-align: center;
+ color: #606266;
+}
+.theme-card-item .upload .upload-action img {
+ display: block;
+ margin: 0 auto;
+}
+.theme-card-item .upload .upload-action span {
+ display: block;
+ font-size: 14px;
+ margin-top: 8px;
+}
+.theme-card-item .preview {
+ position: relative;
+ height: 70%;
+ width: 100%;
+}
+.theme-card-item .preview .line {
+ height: 50%;
+}
+.theme-card-item .preview .line-2 {
+ width: 50%;
+ height: 100%;
+ display: inline-block;
+}
+.theme-card-item .preview .line-4 {
+ width: 25%;
+ height: 100%;
+ display: inline-block;
+}
+.theme-card-item .preview .action {
+ transition: all 0.3s;
+ position: absolute;
+ opacity: 0;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+}
+.theme-card-item .preview .action .action-mask {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: #000;
+ opacity: 0.4;
+}
+.theme-card-item .preview .action .action-block {
+ position: absolute;
+ width: 50%;
+ height: 50%;
+ left: 25%;
+ top: 25%;
+}
+.theme-card-item .preview .action .action-item {
+ cursor: pointer;
+ display: inline-block;
+ height: 100%;
+ width: 30%;
+ color: #eee;
+}
+.theme-card-item .preview .action .action-item:hover {
+ color: #fff;
+}
+.theme-card-item .preview .action .action-item:hover .circle {
+ border-color: #fff;
+}
+.theme-card-item .preview .action .action-item .icon {
+ height: 50%;
+ font-size: 22px;
+ text-align: center;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+.theme-card-item .preview .action .action-item .icon img {
+ width: 130%;
+}
+.theme-card-item .preview .action .action-item .name {
+ font-size: 12px;
+ height: 50%;
+ text-align: center;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin-top: 4px;
+}
+.theme-card-item .preview .action .action-item-right {
+ margin-left: 40%;
+}
+.theme-card-item .info {
+ height: 30%;
+ line-height: 16px;
+ display: flex;
+ align-items: center;
+}
+.theme-card-item .info .info-center {
+ width: 100%;
+}
+.theme-card-item .info .title {
+ font-weight: 700;
+ font-size: 16px;
+ color: #303133;
+ padding: 0 12px;
+ justify-content: space-between;
+}
+.theme-card-item .info .right {
+ float: right;
+ font-weight: 400;
+ font-size: 14px;
+ color: #909399;
+}
+.theme-card-item .info .more {
+ font-size: 16px;
+ cursor: pointer;
+}
+.theme-card-item .info .description {
+ padding: 0 12px;
+ font-size: 14px;
+ color: #606266;
+ margin-top: 10px;
+}
+.theme-card-item.is-upload {
+ box-shadow: none;
+ border: 1px dashed #dcdfe6;
+}
+.theme-card-item.is-upload:hover {
+ box-shadow: none;
+}
+.theme-card-item:hover {
+ box-shadow: 0 0 10px 0 #999;
+}
+.theme-card-item:hover .action {
+ opacity: 1;
+}
diff --git a/packages/design-system/theme/preview/index.html b/packages/design-system/theme/preview/index.html
new file mode 100644
index 0000000000..6a76f97ee1
--- /dev/null
+++ b/packages/design-system/theme/preview/index.html
@@ -0,0 +1,1525 @@
+
+
+
+
+
+
+ Deprecated - Element UI Theme CSS Variable
+
+
+
+
+
+
+
+
+
+
+
+
Color
+
+
+
+
+ {{color}}
+
{{dataProxy(color)}}
+
+
+
+
+
+
+
+ Primary Text
+
{{color_text_primary}}
+
+
+
+
+ Regular Text
+
{{color_text_regular}}
+
+
+
+
+ Secondary Text
+
{{color_text_secondary}}
+
+
+
+
+ Placeholder
+
{{color_text_placeholder}}
+
+
+
+
+
+
+
+ Border Base
+
{{border_color_base}}
+
+
+
+
+ Border Light
+
{{border_color_light}}
+
+
+
+
+ Border Lighter
+
{{border_color_lighter}}
+
+
+
+
+ Border Extralight
+
{{border_color_extra_light}}
+
+
+
+
+
+
+
+ Background B
+
{{color_black}}
+
+
+
+
+ Background W
+
{{color_white}}
+
+
+
+
+ Background
+
Transparent
+
+
+
+
+
+
Typography
+
+
+
+ Heading1
+
+ Heading2
+ Heading3
+ Heading4
+ Heading5
+
+ Heading6
+
+
+
+ Example body text
+
+ With MySpace becoming more popular every day, there is the
+ constant need to be different. There are millions of users.
+ If MySpace layouts are chosen well, then you can enhance
+ your profile a great deal.
+
+
+
+ Example small text
+
+ Computers have become ubiquitous in almost every facet of
+ our lives. At work, desk jockeys spend hours in front of
+ their desktops, while delivery people scan bar codes with
+ handhelds and workers in the field stay in touch with the
+ central office via their notebooks. Computer hardware weaves
+ itself through the fabric of our lives.
+
+
+
+
+
Button
+
+ Default
+ Primary
+ Success
+ Info
+ Warning
+ Danger
+
+
+ Default
+ Primary
+ Success
+ Info
+ Warning
+ Danger
+
+
+ Plain
+ Primary
+ Success
+ Info
+ Warning
+ Danger
+
+
+ Plain
+ Primary
+ Success
+ Info
+ Warning
+ Danger
+
+
+ Round
+ Primary
+ Success
+ Info
+ Warning
+ Danger
+
+
+
+
+
+
+
+
+
+
+ Default
+ Medium
+ Small
+ Mini
+
+
+ 文字按钮
+ 文字按钮
+
+
Radio
+
+ Option A
+ Option B
+
+
+
+
+
+
+
+
+
+
+ Option A
+ Option B
+
+
Checkbox
+
+ Option
+
+
+
+ {{city}}
+
+
+
+
+
+
Input
+
+
+
+
InputNumber
+
+
+
+
Select
+
+
+
+
+
+
+
Cascader
+
+
+
+
Switch
+
+
+
+
+
+
Slider
+
+
+
+
DatePicker
+
+
+
+
Rate
+
+
+
+
+
+
Transfer
+
+
+
+
+
+
+
Table
+
+
+
+
+
+
+
+
Tag
+
+ Tag One
+ Tag Two
+ Tag Three
+ Tag Four
+ Tag Five
+
+
Progress
+
+
+
+
+
+
Tree
+
+
+
+
Pagination
+
+
+
+
Badge
+
+
+ comments
+
+
+ replies
+
+
+ comments
+
+
+ replies
+
+
+
Alert
+
+
+
+
+
+
+
+
Loading
+
+
+
+
+
+
+
+
Message
+
+
+
+
+ Congrats, this is a success message.
+
+
+
+
+
+
+ Warning, this is a warning message.
+
+
+
+
+
+
This is a message.
+
+
+
+
+
+ Oops, this is a error message.
+
+
+
+
+
MessageBox
+
+
+
+
+
+
+
This will permanently delete the file. Continue?
+
+
+
+
+
+
+ Cancel
+
+ OK
+
+
+
+
+
Notification
+
+
+
+
Menu
+
+
+
+
+
+
+ Navigator One
+
+
+ item one
+ item one
+
+
+ item three
+
+
+ item four
+ item one
+
+
+
+
+ Navigator Two
+
+
+
+ Navigator Three
+
+
+
+ Navigator Four
+
+
+
+
Tabs
+
+
+ User
+ Config
+ Role
+ Task
+
+
+ User
+ Config
+ Role
+ Task
+
+
+
Dialog
+
+
+
+
+ This is a message
+
+
+
+
+
Tooltip
+
+
+
+
+
Popover
+
+
+
Title
+ this is content, this is content, this is content
+
+
+
+
Card
+
+
+
+ Card name
+
+
+
+
Carousel
+
+
+
+ {{ item }}
+
+
+
+
Collapse
+
+
+
+
+ Consistent with real life: in line with the process and
+ logic of real life, and comply with languages and habits
+ that the users are used to;
+
+
+
+
+ Operation feedback: enable the users to clearly perceive
+ their operations by style updates and interactive effects;
+
+
+
+
+
Avatar
+
+
+ avatar
+
+ large
+ medium
+ small
+
+
Tree
+
+
+
+
+
+
+
+
+
+
+
+ color-primary 主题色
+
+
+
+
+
+
+
+
+
+ color-success 成功题色
+
+
+
+
+
+
+
+
+
+ color-warning 警告题色
+
+
+
+
+
+
+
+
+
+ color-danger 危险题色
+
+
+
+
+
+
+
+
+
+ color-info 信息题色
+
+
+
+
+
+
+
+
+
+ color-text-primary 主要文字颜色
+
+
+
+
+
+
+
+
+
+ color-text-regular 常规文字颜色
+
+
+
+
+
+
+
+
+
+ color-text-secondary 次要文字颜色
+
+
+
+
+
+
+
+
+
+ color-text-placeholder 占位文字颜色
+
+
+
+
+
+
+
+
+
+ border-color-base 一级边框颜色
+
+
+
+
+
+
+
+
+
+ border-color-light 二级边框颜色
+
+
+
+
+
+
+
+
+
+ border-color-lighter 三级边框颜色
+
+
+
+
+
+
+
+
+
+ border-color-xlight 四级边框颜色
+
+
+
+
+
+
+
+
+
+
+
+ {{ cssVariables}}
+ 使用方式:将上面的代码通过style属性添加到项目的html标签上
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/design-system/theme/src/_tokens.dark.scss b/packages/design-system/theme/src/_tokens.dark.scss
new file mode 100644
index 0000000000..5cf77596b2
--- /dev/null
+++ b/packages/design-system/theme/src/_tokens.dark.scss
@@ -0,0 +1,260 @@
+@mixin theme {
+ --color-primary-h: 7;
+ --color-primary-s: 100%;
+ --color-primary-l: 68%;
+ --color-primary: hsl(
+ var(--color-primary-h),
+ var(--color-primary-s),
+ var(--color-primary-l)
+ );
+
+ --color-primary-tint-1-l: 18%;
+ --color-primary-tint-1: hsl(
+ var(--color-primary-h),
+ var(--color-primary-s),
+ var(--color-primary-tint-1-l)
+ );
+
+ --color-primary-tint-2-l: 9%;
+ --color-primary-tint-2: hsl(
+ var(--color-primary-h),
+ var(--color-primary-s),
+ var(--color-primary-tint-2-l)
+ );
+
+ --color-primary-tint-3-l: 3%;
+ --color-primary-tint-3: hsl(
+ var(--color-primary-h),
+ var(--color-primary-s),
+ var(--color-primary-tint-3-l)
+ );
+
+ --color-primary-shade-1-l: 89%;
+ --color-primary-shade-1: hsl(
+ var(--color-primary-h),
+ var(--color-primary-s),
+ var(--color-primary-shade-1-l)
+ );
+
+ --color-secondary-h: 247;
+ --color-secondary-s: 100%;
+ --color-secondary-l: 35%;
+ --color-secondary: hsl(
+ var(--color-secondary-h),
+ var(--color-secondary-s),
+ var(--color-secondary-l)
+ );
+
+ --color-success-h: 150;
+ --color-success-s: 74%;
+ --color-success-l: 60%;
+ --color-success: hsl(
+ var(--color-success-h),
+ var(--color-success-s),
+ var(--color-success-l)
+ );
+
+ --color-success-tint-1-l: 12%;
+ --color-success-tint-1: hsl(
+ var(--color-success-h),
+ var(--color-success-s),
+ var(--color-success-tint-1-l)
+ );
+
+ --color-success-tint-2-l: 3%;
+ --color-success-tint-2: hsl(
+ var(--color-success-h),
+ var(--color-success-s),
+ var(--color-success-tint-2-l)
+ );
+
+ --color-warning-h: 36;
+ --color-warning-s: 77%;
+ --color-warning-l: 43%;
+ --color-warning: hsl(
+ var(--color-warning-h),
+ var(--color-warning-s),
+ var(--color-warning-l)
+ );
+
+ --color-warning-tint-1-l: 12%;
+ --color-warning-tint-1: hsl(
+ var(--color-warning-h),
+ var(--color-warning-s),
+ var(--color-warning-tint-1-l)
+ );
+
+ --color-warning-tint-2-l: 4%;
+ --color-warning-tint-2: hsl(
+ var(--color-warning-h),
+ var(--color-warning-s),
+ var(--color-warning-tint-2-l)
+ );
+
+ --color-danger-h: 0;
+ --color-danger-s: 88%;
+ --color-danger-l: 35%;
+ --color-danger: hsl(
+ var(--color-danger-h),
+ var(--color-danger-s),
+ var(--color-danger-l)
+ );
+
+ --color-danger-tint-1-l: 8%;
+ --color-danger-tint-1: hsl(
+ var(--color-danger-h),
+ var(--color-danger-s),
+ var(--color-danger-tint-1-l)
+ );
+
+ --color-danger-tint-2-l: 3%;
+ --color-danger-tint-2: hsl(
+ var(--color-danger-h),
+ var(--color-danger-s),
+ var(--color-danger-tint-2-l)
+ );
+
+ --color-info-h: 220;
+ --color-info-s: 4%;
+ --color-info-l: 42%;
+ --color-info: hsl(
+ var(--color-info-h),
+ var(--color-info-s),
+ var(--color-info-l)
+ );
+
+ --color-info-tint-1-l: 12%;
+ --color-info-tint-1: hsl(
+ var(--color-info-h),
+ var(--color-info-s),
+ var(--color-info-tint-1-l)
+ );
+
+ --color-info-tint-2-l: 4%;
+ --color-info-tint-2: hsl(
+ var(--color-info-h),
+ var(--color-info-s),
+ var(--color-info-tint-2-l)
+ );
+
+ --color-text-dark-h: 0;
+ --color-text-dark-s: 0%;
+ --color-text-dark-l: 100%;
+ --color-text-dark: hsl(
+ var(--color-text-dark-h),
+ var(--color-text-dark-s),
+ var(--color-text-dark-l)
+ );
+
+ --color-text-base-h: 240;
+ --color-text-base-s: 4%;
+ --color-text-base-l: 49%;
+ --color-text-base: hsl(
+ var(--color-text-base-h),
+ var(--color-text-base-s),
+ var(--color-text-base-l)
+ );
+
+ --color-text-light-h: 220;
+ --color-text-light-s: 4%;
+ --color-text-light-l: 42%;
+ --color-text-light: hsl(
+ var(--color-text-light-h),
+ var(--color-text-light-s),
+ var(--color-text-light-l)
+ );
+
+ --color-text-lighter-h: 222;
+ --color-text-lighter-s: 17%;
+ --color-text-lighter-l: 12%;
+ --color-text-lighter: hsl(
+ var(--color-text-lighter-h),
+ var(--color-text-lighter-s),
+ var(--color-text-lighter-l)
+ );
+
+ --color-text-xlight-h: 0;
+ --color-text-xlight-s: 0%;
+ --color-text-xlight-l: 100%;
+ --color-text-xlight: hsl(
+ var(--color-text-xlight-h),
+ var(--color-text-xlight-s),
+ var(--color-text-xlight-l)
+ );
+
+ --color-foreground-base-h: 220;
+ --color-foreground-base-s: 20%;
+ --color-foreground-base-l: 12%;
+ --color-foreground-base: hsl(
+ var(--color-foreground-base-h),
+ var(--color-foreground-base-s),
+ var(--color-foreground-base-l)
+ );
+
+ --color-foreground-light-h: 0;
+ --color-foreground-light-s: 0%;
+ --color-foreground-light-l: 7%;
+ --color-foreground-light: hsl(
+ var(--color-foreground-light-h),
+ var(--color-foreground-light-s),
+ var(--color-foreground-light-l)
+ );
+
+ --color-foreground-xlight-h: 0;
+ --color-foreground-xlight-s: 0%;
+ --color-foreground-xlight-l: 0%;
+ --color-foreground-xlight: hsl(
+ var(--color-foreground-xlight-h),
+ var(--color-foreground-xlight-s),
+ var(--color-foreground-xlight-l)
+ );
+
+ --color-background-dark-h: 0;
+ --color-background-dark-s: 0%;
+ --color-background-dark-l: 100%;
+ --color-background-dark: hsl(
+ var(--color-background-dark-h),
+ var(--color-background-dark-s),
+ var(--color-background-dark-l)
+ );
+
+ --color-background-base-h: 252;
+ --color-background-base-s: 71%;
+ --color-background-base-l: 99%;
+ --color-background-base: hsl(
+ var(--color-background-base-h),
+ var(--color-background-base-s),
+ var(--color-background-base-l)
+ );
+
+ --color-background-light-h: 220;
+ --color-background-light-s: 27%;
+ --color-background-light-l: 98%;
+ --color-background-light: hsl(
+ var(--color-background-light-h),
+ var(--color-background-light-s),
+ var(--color-background-light-l)
+ );
+
+ --color-background-lighter-h: 220;
+ --color-background-lighter-s: 30%;
+ --color-background-lighter-l: 96%;
+ --color-background-lighter: hsl(
+ var(--color-background-lighter-h),
+ var(--color-background-lighter-s),
+ var(--color-background-lighter-l)
+ );
+
+ --color-background-xlight-h: 240;
+ --color-background-xlight-s: 4%;
+ --color-background-xlight-l: 19%;
+ --color-background-xlight: hsl(
+ var(--color-background-xlight-h),
+ var(--color-background-xlight-s),
+ var(--color-background-xlight-l)
+ );
+}
+
+body.theme-dark {
+ @include theme;
+}
diff --git a/packages/design-system/theme/src/_tokens.scss b/packages/design-system/theme/src/_tokens.scss
new file mode 100644
index 0000000000..8206e42095
--- /dev/null
+++ b/packages/design-system/theme/src/_tokens.scss
@@ -0,0 +1,307 @@
+@mixin theme {
+ --color-primary-h: 6.9;
+ --color-primary-s: 100%;
+ --color-primary-l: 67.6%;
+ --color-primary: hsl(
+ var(--color-primary-h),
+ var(--color-primary-s),
+ var(--color-primary-l)
+ );
+
+ --color-primary-tint-1-l: 88%;
+ --color-primary-tint-1: hsl(
+ var(--color-primary-h),
+ var(--color-primary-s),
+ var(--color-primary-tint-1-l)
+ );
+
+ --color-primary-tint-2-l: 94.5%;
+ --color-primary-tint-2: hsl(
+ var(--color-primary-h),
+ var(--color-primary-s),
+ var(--color-primary-tint-2-l)
+ );
+
+ --color-primary-tint-3-l: 96.9%;
+ --color-primary-tint-3: hsl(
+ var(--color-primary-h),
+ var(--color-primary-s),
+ var(--color-primary-tint-3-l)
+ );
+
+ --color-primary-shade-1-l: 57.6%;
+ --color-primary-shade-1: hsl(
+ var(--color-primary-h),
+ var(--color-primary-s),
+ var(--color-primary-shade-1-l)
+ );
+
+ --color-primary-shade-2-l: 23%;
+ --color-primary-shade-2: hsl(
+ var(--color-primary-h),
+ var(--color-primary-s),
+ var(--color-primary-shade-2-l)
+ );
+
+ --color-secondary-h: 247;
+ --color-secondary-s: 49%;
+ --color-secondary-l: 53%;
+ --color-secondary: hsl(
+ var(--color-secondary-h),
+ var(--color-secondary-s),
+ var(--color-secondary-l)
+ );
+
+ --color-success-h: 150.4;
+ --color-success-s: 73.8%;
+ --color-success-l: 40.4%;
+ --color-success: hsl(
+ var(--color-success-h),
+ var(--color-success-s),
+ var(--color-success-l)
+ );
+
+ --color-success-tint-1-l: 90%;
+ --color-success-tint-1: hsl(
+ var(--color-success-h),
+ var(--color-success-s),
+ var(--color-success-tint-1-l)
+ );
+
+ --color-success-tint-2-l: 94.9%;
+ --color-success-tint-2: hsl(
+ var(--color-success-h),
+ var(--color-success-s),
+ var(--color-success-tint-2-l)
+ );
+
+ --color-warning-h: 36;
+ --color-warning-s: 77%;
+ --color-warning-l: 57%;
+ --color-warning: hsl(
+ var(--color-warning-h),
+ var(--color-warning-s),
+ var(--color-warning-l)
+ );
+
+ --color-warning-tint-1-l: 88%;
+ --color-warning-tint-1: hsl(
+ var(--color-warning-h),
+ var(--color-warning-s),
+ var(--color-warning-tint-1-l)
+ );
+
+ --color-warning-tint-2-l: 96%;
+ --color-warning-tint-2: hsl(
+ var(--color-warning-h),
+ var(--color-warning-s),
+ var(--color-warning-tint-2-l)
+ );
+
+ --color-danger-h: 0;
+ --color-danger-s: 87.6%;
+ --color-danger-l: 65.3%;
+ --color-danger: hsl(
+ var(--color-danger-h),
+ var(--color-danger-s),
+ var(--color-danger-l)
+ );
+
+ --color-danger-tint-1-l: 93.9%;
+ --color-danger-tint-1: hsl(
+ var(--color-danger-h),
+ var(--color-danger-s),
+ var(--color-danger-tint-1-l)
+ );
+ --color-danger-tint-2-l: 96.9%;
+ --color-danger-tint-2: hsl(
+ var(--color-danger-h),
+ var(--color-danger-s),
+ var(--color-danger-tint-2-l)
+ );
+
+ --color-info-h: 220;
+ --color-info-s: 4%;
+ --color-info-l: 58%;
+ --color-info: hsl(
+ var(--color-info-h),
+ var(--color-info-s),
+ var(--color-info-l)
+ );
+
+ --color-info-tint-1-l: 88%;
+ --color-info-tint-1: hsl(
+ var(--color-info-h),
+ var(--color-info-s),
+ var(--color-info-tint-1-l)
+ );
+ --color-info-tint-2-l: 96%;
+ --color-info-tint-2: hsl(
+ var(--color-info-h),
+ var(--color-info-s),
+ var(--color-info-tint-2-l)
+ );
+
+ --color-text-dark-h: 0;
+ --color-text-dark-s: 0%;
+ --color-text-dark-l: 33.3%;
+ --color-text-dark: hsl(
+ var(--color-text-dark-h),
+ var(--color-text-dark-s),
+ var(--color-text-dark-l)
+ );
+
+ --color-text-base-h: 240;
+ --color-text-base-s: 4%;
+ --color-text-base-l: 51%;
+ --color-text-base: hsl(
+ var(--color-text-base-h),
+ var(--color-text-base-s),
+ var(--color-text-base-l)
+ );
+
+ --color-text-light-h: 220;
+ --color-text-light-s: 4.2%;
+ --color-text-light-l: 58.2%;
+ --color-text-light: hsl(
+ var(--color-text-light-h),
+ var(--color-text-light-s),
+ var(--color-text-light-l)
+ );
+
+ --color-text-lighter-h: 222;
+ --color-text-lighter-s: 16.7%;
+ --color-text-lighter-l: 88.2%;
+ --color-text-lighter: hsl(
+ var(--color-text-lighter-h),
+ var(--color-text-lighter-s),
+ var(--color-text-lighter-l)
+ );
+
+ --color-text-xlight-h: 0;
+ --color-text-xlight-s: 0%;
+ --color-text-xlight-l: 100%;
+ --color-text-xlight: hsl(
+ var(--color-text-xlight-h),
+ var(--color-text-xlight-s),
+ var(--color-text-xlight-l)
+ );
+
+ --color-foreground-base-h: 220;
+ --color-foreground-base-s: 20%;
+ --color-foreground-base-l: 88.2%;
+ --color-foreground-base: hsl(
+ var(--color-foreground-base-h),
+ var(--color-foreground-base-s),
+ var(--color-foreground-base-l)
+ );
+
+ --color-foreground-light-h: 0;
+ --color-foreground-light-s: 0%;
+ --color-foreground-light-l: 93.3%;
+ --color-foreground-light: hsl(
+ var(--color-foreground-light-h),
+ var(--color-foreground-light-s),
+ var(--color-foreground-light-l)
+ );
+
+ --color-foreground-xlight-h: 0;
+ --color-foreground-xlight-s: 0%;
+ --color-foreground-xlight-l: 100%;
+ --color-foreground-xlight: hsl(
+ var(--color-foreground-xlight-h),
+ var(--color-foreground-xlight-s),
+ var(--color-foreground-xlight-l)
+ );
+
+ --color-background-dark-h: 240;
+ --color-background-dark-s: 4.2%;
+ --color-background-dark-l: 18.8%;
+ --color-background-dark: hsl(
+ var(--color-background-dark-h),
+ var(--color-background-dark-s),
+ var(--color-background-dark-l)
+ );
+
+ --color-background-base-h: 220;
+ --color-background-base-s: 30%;
+ --color-background-base-l: 96.1%;
+ --color-background-base: hsl(
+ var(--color-background-base-h),
+ var(--color-background-base-s),
+ var(--color-background-base-l)
+ );
+
+ --color-background-light-h: 220;
+ --color-background-light-s: 27.3%;
+ --color-background-light-l: 97.8%;
+ --color-background-light: hsl(
+ var(--color-background-light-h),
+ var(--color-background-light-s),
+ var(--color-background-light-l)
+ );
+
+ --color-background-lighter-h: 252;
+ --color-background-lighter-s: 71.4%;
+ --color-background-lighter-l: 98.6%;
+ --color-background-lighter: hsl(
+ var(--color-background-lighter-h),
+ var(--color-background-lighter-s),
+ var(--color-background-lighter-l)
+ );
+
+ --color-background-xlight-h: 0;
+ --color-background-xlight-s: 0%;
+ --color-background-xlight-l: 100%;
+ --color-background-xlight: hsl(
+ var(--color-background-xlight-h),
+ var(--color-background-xlight-s),
+ var(--color-background-xlight-l)
+ );
+
+ --border-radius-base: 4px;
+ --border-radius-small: 2px;
+ --border-color-base: var(--color-foreground-base);
+ --border-color-light: var(--color-foreground-light);
+
+ --border-style-base: solid;
+ --border-width-base: 1px;
+ --border-base: var(--border-width-base) var(--border-style-base)
+ var(--color-foreground-base);
+
+ --font-size-2xs: 0.75rem;
+ --font-size-xs: 0.8125rem;
+ --font-size-s: 0.875rem;
+ --font-size-m: 1rem;
+ --font-size-l: 1.125rem;
+ --font-size-xl: 1.25rem;
+ --font-size-2xl: 1.75rem;
+
+ --font-line-height-compact: 1.25;
+ --font-line-height-regular: 1.3;
+ --font-line-height-loose: 1.35;
+ --font-line-height-xloose: 1.5;
+
+ --font-weight-regular: 400;
+ --font-weight-semi-bold: 500;
+ --font-weight-bold: 600;
+ --font-family: 'Open Sans', sans-serif;
+
+ --spacing-5xs: 0.125rem;
+ --spacing-4xs: 0.25rem;
+ --spacing-3xs: 0.375rem;
+ --spacing-2xs: 0.5rem;
+ --spacing-xs: 0.75rem;
+ --spacing-s: 1rem;
+ --spacing-m: 1.25rem;
+ --spacing-l: 1.5rem;
+ --spacing-xl: 2rem;
+ --spacing-2xl: 3rem;
+ --spacing-3xl: 4rem;
+ --spacing-4xl: 8rem;
+ --spacing-5xl: 16rem;
+}
+
+:root {
+ @include theme;
+}
diff --git a/packages/design-system/theme/src/alert.scss b/packages/design-system/theme/src/alert.scss
new file mode 100644
index 0000000000..5ebaf3b9eb
--- /dev/null
+++ b/packages/design-system/theme/src/alert.scss
@@ -0,0 +1,147 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(alert) {
+ width: 100%;
+ padding: var.$alert-padding;
+ margin: 0;
+ box-sizing: border-box;
+ border-radius: var.$alert-border-radius;
+ position: relative;
+ background-color: var.$color-white;
+ overflow: hidden;
+ opacity: 1;
+ display: flex;
+ align-items: center;
+ transition: opacity 0.2s;
+
+ @include mixins.when(light) {
+ .el-alert__closebtn {
+ color: var(--color-text-lighter);
+ }
+ }
+
+ @include mixins.when(dark) {
+ .el-alert__closebtn {
+ color: var.$color-white;
+ }
+ .el-alert__description {
+ color: var.$color-white;
+ }
+ }
+
+ @include mixins.when(center) {
+ justify-content: center;
+ }
+
+ @include mixins.m(success) {
+ &.is-light {
+ background-color: var.$alert-success-color;
+ color: var(--color-success);
+
+ .el-alert__description {
+ color: var(--color-success);
+ }
+ }
+
+ &.is-dark {
+ background-color: var(--color-success);
+ color: var.$color-white;
+ }
+ }
+
+ @include mixins.m(info) {
+ &.is-light {
+ background-color: var.$alert-info-color;
+ color: var(--color-info);
+ }
+
+ &.is-dark {
+ background-color: var(--color-info);
+ color: var.$color-white;
+ }
+
+ .el-alert__description {
+ color: var(--color-info);
+ }
+ }
+
+ @include mixins.m(warning) {
+ &.is-light {
+ background-color: var.$alert-warning-color;
+ color: var(--color-warning);
+
+ .el-alert__description {
+ color: var(--color-warning);
+ }
+ }
+
+ &.is-dark {
+ background-color: var(--color-warning);
+ color: var.$color-white;
+ }
+ }
+
+ @include mixins.m(error) {
+ &.is-light {
+ background-color: var.$alert-danger-color;
+ color: var(--color-danger);
+
+ .el-alert__description {
+ color: var(--color-danger);
+ }
+ }
+
+ &.is-dark {
+ background-color: var(--color-danger);
+ color: var.$color-white;
+ }
+ }
+
+ @include mixins.e(content) {
+ display: table-cell;
+ padding: 0 8px;
+ }
+
+ @include mixins.e(icon) {
+ font-size: var.$alert-icon-size;
+ width: var.$alert-icon-size;
+ @include mixins.when(big) {
+ font-size: var.$alert-icon-large-size;
+ width: var.$alert-icon-large-size;
+ }
+ }
+
+ @include mixins.e(title) {
+ font-size: var.$alert-title-font-size;
+ line-height: 18px;
+ @include mixins.when(bold) {
+ font-weight: bold;
+ }
+ }
+
+ & .el-alert__description {
+ font-size: var.$alert-description-font-size;
+ margin: 5px 0 0 0;
+ }
+
+ @include mixins.e(closebtn) {
+ font-size: var.$alert-close-font-size;
+ opacity: 1;
+ position: absolute;
+ top: 12px;
+ right: 15px;
+ cursor: pointer;
+
+ @include mixins.when(customed) {
+ font-style: normal;
+ font-size: var.$alert-close-customed-font-size;
+ top: 9px;
+ }
+ }
+}
+
+.el-alert-fade-enter,
+.el-alert-fade-leave-active {
+ opacity: 0;
+}
diff --git a/packages/design-system/theme/src/aside.scss b/packages/design-system/theme/src/aside.scss
new file mode 100644
index 0000000000..d89d63ff73
--- /dev/null
+++ b/packages/design-system/theme/src/aside.scss
@@ -0,0 +1,7 @@
+@use "mixins/mixins";
+
+@include mixins.b(aside) {
+ overflow: auto;
+ box-sizing: border-box;
+ flex-shrink: 0;
+}
diff --git a/packages/design-system/theme/src/autocomplete.scss b/packages/design-system/theme/src/autocomplete.scss
new file mode 100644
index 0000000000..8918538677
--- /dev/null
+++ b/packages/design-system/theme/src/autocomplete.scss
@@ -0,0 +1,80 @@
+@use "mixins/mixins";
+@use "mixins/utils";
+@use "./common/var";
+@use "./input.scss";
+@use "./scrollbar.scss";
+@use "./popper";
+
+@include mixins.b(autocomplete) {
+ position: relative;
+ display: inline-block;
+}
+
+@include mixins.b(autocomplete-suggestion) {
+ margin: 5px 0;
+ box-shadow: var.$box-shadow-light;
+ border-radius: var(--border-radius-base);
+ border: 1px solid var(--border-color-base);
+ box-sizing: border-box;
+ background-color: var.$color-white;
+
+ @include mixins.e(wrap) {
+ max-height: 280px;
+ padding: 10px 0;
+ box-sizing: border-box;
+ }
+
+ @include mixins.e(list) {
+ margin: 0;
+ padding: 0;
+ }
+
+ & li {
+ padding: 0 20px;
+ margin: 0;
+ line-height: 34px;
+ cursor: pointer;
+ color: var(--color-text-dark);
+ font-size: var.$font-size-base;
+ list-style: none;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+
+ &:hover {
+ background-color: var.$select-option-hover-background;
+ }
+
+ &.highlighted {
+ background-color: var.$select-option-hover-background;
+ }
+
+ &.divider {
+ margin-top: 6px;
+ border-top: 1px solid var.$color-black;
+ }
+
+ &.divider:last-child {
+ margin-bottom: -6px;
+ }
+ }
+
+ @include mixins.when(loading) {
+ li {
+ text-align: center;
+ height: 100px;
+ line-height: 100px;
+ font-size: 20px;
+ color: #999;
+ @include utils.utils-vertical-center;
+
+ &:hover {
+ background-color: var.$color-white;
+ }
+ }
+
+ & .el-icon-loading {
+ vertical-align: middle;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/avatar.scss b/packages/design-system/theme/src/avatar.scss
new file mode 100644
index 0000000000..120b0cccb3
--- /dev/null
+++ b/packages/design-system/theme/src/avatar.scss
@@ -0,0 +1,51 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(avatar) {
+ display: inline-block;
+ box-sizing: border-box;
+ text-align: center;
+ overflow: hidden;
+ color: var.$avatar-font-color;
+ background: var.$avatar-background-color;
+ width: var.$avatar-large-size;
+ height: var.$avatar-large-size;
+ line-height: var.$avatar-large-size;
+ font-size: var.$avatar-text-font-size;
+
+ > img {
+ display: block;
+ height: 100%;
+ vertical-align: middle;
+ }
+
+ @include mixins.m(circle) {
+ border-radius: 50%;
+ }
+
+ @include mixins.m(square) {
+ border-radius: var.$avatar-border-radius;
+ }
+
+ @include mixins.m(icon) {
+ font-size: var.$avatar-icon-font-size;
+ }
+
+ @include mixins.m(large) {
+ width: var.$avatar-large-size;
+ height: var.$avatar-large-size;
+ line-height: var.$avatar-large-size;
+ }
+
+ @include mixins.m(medium) {
+ width: var.$avatar-medium-size;
+ height: var.$avatar-medium-size;
+ line-height: var.$avatar-medium-size;
+ }
+
+ @include mixins.m(small) {
+ width: var.$avatar-small-size;
+ height: var.$avatar-small-size;
+ line-height: var.$avatar-small-size;
+ }
+}
diff --git a/packages/design-system/theme/src/backtop.scss b/packages/design-system/theme/src/backtop.scss
new file mode 100644
index 0000000000..9813ef2028
--- /dev/null
+++ b/packages/design-system/theme/src/backtop.scss
@@ -0,0 +1,22 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(backtop) {
+ position: fixed;
+ background-color: var.$backtop-background-color;
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ color: var.$backtop-font-color;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 20px;
+ box-shadow: 0 0 6px rgba(0, 0, 0, 0.12);
+ cursor: pointer;
+ z-index: 5;
+
+ &:hover {
+ background-color: var.$backtop-hover-background-color;
+ }
+}
diff --git a/packages/design-system/theme/src/badge.scss b/packages/design-system/theme/src/badge.scss
new file mode 100644
index 0000000000..c1b1f474a0
--- /dev/null
+++ b/packages/design-system/theme/src/badge.scss
@@ -0,0 +1,58 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(badge) {
+ position: relative;
+ vertical-align: middle;
+ display: inline-block;
+
+ @include mixins.e(content) {
+ background-color: var.$badge-background-color;
+ border-radius: var.$badge-radius;
+ color: var.$color-white;
+ display: inline-block;
+ font-size: var.$badge-font-size;
+ height: var.$badge-size;
+ line-height: var.$badge-size;
+ padding: 0 var.$badge-padding;
+ text-align: center;
+ white-space: nowrap;
+ border: 1px solid var.$color-white;
+ box-sizing: content-box;
+
+ @include mixins.when(fixed) {
+ position: absolute;
+ top: 0;
+ right: #{1 + var.$badge-size * 0.5};
+ transform: translateY(-50%) translateX(100%);
+
+ @include mixins.when(dot) {
+ right: 5px;
+ }
+ }
+
+ @include mixins.when(dot) {
+ height: 8px;
+ width: 8px;
+ padding: 0;
+ right: 0;
+ border-radius: 50%;
+ }
+
+ @each $type in (primary, success, warning, info, danger) {
+ @include mixins.m($type) {
+ @if $type == primary {
+ background-color: var(--color-primary);
+ } @else if $type == success {
+ background-color: var(--color-success);
+ } @else if $type == warning {
+ background-color: var(--color-warning);
+ } @else if $type == info {
+ background-color: var(--color-info);
+ } @else {
+ background-color: var(--color-danger);
+ }
+ }
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/base.scss b/packages/design-system/theme/src/base.scss
new file mode 100644
index 0000000000..8557d05fb0
--- /dev/null
+++ b/packages/design-system/theme/src/base.scss
@@ -0,0 +1,3 @@
+@forward "common/var.scss";
+@use "common/transition.scss";
+@use "icon.scss";
diff --git a/packages/design-system/theme/src/breadcrumb-item.scss b/packages/design-system/theme/src/breadcrumb-item.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/design-system/theme/src/breadcrumb.scss b/packages/design-system/theme/src/breadcrumb.scss
new file mode 100644
index 0000000000..b571a6c3b2
--- /dev/null
+++ b/packages/design-system/theme/src/breadcrumb.scss
@@ -0,0 +1,57 @@
+@use "mixins/mixins";
+@use "mixins/utils";
+@use "./common/var";
+
+@include mixins.b(breadcrumb) {
+ font-size: 14px;
+ line-height: 1;
+ @include utils.utils-clearfix;
+
+ @include mixins.e(separator) {
+ margin: 0 9px;
+ font-weight: bold;
+ color: var(--color-text-lighter);
+
+ &[class*='icon'] {
+ margin: 0 6px;
+ font-weight: normal;
+ }
+ }
+
+ @include mixins.e(item) {
+ float: left;
+
+ @include mixins.e(inner) {
+ color: var(--color-text-dark);
+
+ &.is-link,
+ & a {
+ font-weight: bold;
+ text-decoration: none;
+ transition: var.$color-transition-base;
+ color: var(--color-text-dark);
+
+ &:hover {
+ color: var(--color-primary);
+ cursor: pointer;
+ }
+ }
+ }
+
+ &:last-child {
+ .el-breadcrumb__inner,
+ .el-breadcrumb__inner a {
+ &,
+ &:hover {
+ font-weight: normal;
+ color: var(--color-text-dark);
+ cursor: text;
+ }
+ }
+
+ .el-breadcrumb__separator {
+ display: none;
+ }
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/button-group.scss b/packages/design-system/theme/src/button-group.scss
new file mode 100644
index 0000000000..25b280a51a
--- /dev/null
+++ b/packages/design-system/theme/src/button-group.scss
@@ -0,0 +1,84 @@
+@charset "UTF-8";
+@use 'common/var';
+@use 'mixins/button';
+@use 'mixins/mixins';
+@use 'mixins/utils';
+@use 'mixins/function';
+
+@include mixins.b(button-group) {
+ @include utils.utils-clearfix;
+ display: inline-block;
+ vertical-align: middle;
+
+ & > .el-button {
+ float: left;
+ position: relative;
+ & + .el-button {
+ margin-left: 0;
+ }
+ &.is-disabled {
+ z-index: 1;
+ }
+ &:first-child {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+ &:last-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+ &:first-child:last-child {
+ border-top-right-radius: var(--border-radius-base);
+ border-bottom-right-radius: var(--border-radius-base);
+ border-top-left-radius: var(--border-radius-base);
+ border-bottom-left-radius: var(--border-radius-base);
+
+ &.is-round {
+ border-radius: 20px;
+ }
+
+ &.is-circle {
+ border-radius: 50%;
+ }
+ }
+ &:not(:first-child):not(:last-child) {
+ border-radius: 0;
+ }
+ &:not(:last-child) {
+ margin-right: -1px;
+ }
+
+ &:hover,
+ &:focus,
+ &:active {
+ z-index: 1;
+ }
+
+ @include mixins.when(active) {
+ z-index: 1;
+ }
+ }
+
+ & > .el-dropdown {
+ & > .el-button {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ border-left-color: rgba(var.$color-white, 0.5);
+ }
+ }
+
+ @each $type in (primary, success, warning, danger, info) {
+ .el-button--#{$type} {
+ &:first-child {
+ border-right-color: rgba(var.$color-white, 0.5);
+ }
+ &:last-child {
+ border-left-color: rgba(var.$color-white, 0.5);
+ }
+ &:not(:first-child):not(:last-child) {
+ border-left-color: rgba(var.$color-white, 0.5);
+ border-right-color: rgba(var.$color-white, 0.5);
+ }
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/button.scss b/packages/design-system/theme/src/button.scss
new file mode 100644
index 0000000000..c16e720b5d
--- /dev/null
+++ b/packages/design-system/theme/src/button.scss
@@ -0,0 +1,107 @@
+@charset "UTF-8";
+@use 'mixins/mixins';
+@use 'mixins/utils';
+@use 'mixins/function';
+@use 'common/var';
+
+$disabled-border-color: var(--color-foreground-base);
+
+$loading-overlay-background-color: rgba(255, 255, 255, 0.35);
+
+@include mixins.b(button) {
+ display: inline-block;
+ line-height: 1;
+ white-space: nowrap;
+ cursor: pointer;
+
+ border: var(--border-width-base) var.$button-border-color
+ var(--border-style-base);
+ color: var.$button-font-color;
+ background-color: var.$button-background-color;
+ font-weight: var(--font-weight-bold);
+ border-radius: var.$button-border-radius;
+ padding: var.$button-padding-vertical var.$button-padding-horizontal;
+ font-size: var.$button-font-size;
+
+ -webkit-appearance: none;
+ text-align: center;
+ box-sizing: border-box;
+ outline: none;
+ margin: 0;
+ transition: 0.1s;
+
+ @include utils.utils-user-select(none);
+
+ &:active {
+ color: var.$button-active-color;
+ border-color: var.$button-active-border-color;
+ background-color: var.$button-active-background-color;
+ outline: none;
+ }
+
+ &::-moz-focus-inner {
+ border: 0;
+ }
+
+ @include mixins.when(loading) {
+ position: relative;
+ pointer-events: none;
+
+ &:before {
+ pointer-events: none;
+ content: '';
+ position: absolute;
+ left: -1px;
+ top: -1px;
+ right: -1px;
+ bottom: -1px;
+ border-radius: inherit;
+ background-color: $loading-overlay-background-color;
+ }
+ }
+
+ @include mixins.when(disabled) {
+ &,
+ &:hover,
+ &:active,
+ &:focus {
+ cursor: not-allowed;
+ background-image: none;
+ color: var.$button-disabled-font-color;
+ background-color: var.$button-disabled-background-color;
+ border-color: var.$button-disabled-border-color;
+ }
+ }
+
+ @include mixins.when(round) {
+ --button-border-radius: 20px;
+ }
+
+ @include mixins.when(circle) {
+ --button-padding-vertical: var(--spacing-xs);
+ --button-padding-horizontal: var(--spacing-xs);
+ --button-border-radius: 50%;
+ }
+
+ @include mixins.m(small) {
+ --button-padding-vertical: var(--spacing-3xs);
+ --button-padding-horizontal: var(--spacing-xs);
+ --button-font-size: var(--font-size-2xs);
+
+ @include mixins.when(circle) {
+ --button-padding-vertical: var(--spacing-3xs);
+ --button-padding-horizontal: var(--spacing-3xs);
+ }
+ }
+
+ @include mixins.m(medium) {
+ --button-padding-vertical: var(--spacing-2xs);
+ --button-padding-horizontal: var(--spacing-xs);
+ --button-font-size: var(--font-size-2xs);
+
+ @include mixins.when(circle) {
+ --button-padding-vertical: var(--spacing-2xs);
+ --button-padding-horizontal: var(--spacing-2xs);
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/calendar.scss b/packages/design-system/theme/src/calendar.scss
new file mode 100644
index 0000000000..d06e915090
--- /dev/null
+++ b/packages/design-system/theme/src/calendar.scss
@@ -0,0 +1,79 @@
+@use "mixins/mixins";
+@use "./common/var";
+@use "button";
+@use "button-group";
+
+@include mixins.b(calendar) {
+ background-color: #fff;
+
+ @include mixins.e(header) {
+ display: flex;
+ justify-content: space-between;
+ padding: 12px 20px;
+ border-bottom: var.$table-border;
+ }
+
+ @include mixins.e(title) {
+ color: #000000;
+ align-self: center;
+ }
+
+ @include mixins.e(body) {
+ padding: 12px 20px 35px;
+ }
+}
+
+@include mixins.b(calendar-table) {
+ table-layout: fixed;
+ width: 100%;
+
+ thead th {
+ padding: 12px 0;
+ color: var(--color-text-dark);
+ font-weight: normal;
+ }
+
+ &:not(.is-range) {
+ td.prev,
+ td.next {
+ color: var(--color-text-lighter);
+ }
+ }
+
+ td {
+ border-bottom: var.$calendar-border;
+ border-right: var.$calendar-border;
+ vertical-align: top;
+ transition: background-color 0.2s ease;
+
+ @include mixins.when(selected) {
+ background-color: var.$calendar-selected-background-color;
+ }
+
+ @include mixins.when(today) {
+ color: var(--color-primary);
+ }
+ }
+
+ tr:first-child td {
+ border-top: var.$calendar-border;
+ }
+
+ tr td:first-child {
+ border-left: var.$calendar-border;
+ }
+
+ tr.el-calendar-table__row--hide-border td {
+ border-top: none;
+ }
+
+ @include mixins.b(calendar-day) {
+ box-sizing: border-box;
+ padding: 8px;
+ height: var.$calendar-cell-width;
+ &:hover {
+ cursor: pointer;
+ background-color: var.$calendar-selected-background-color;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/card.scss b/packages/design-system/theme/src/card.scss
new file mode 100644
index 0000000000..8cca8fe2e4
--- /dev/null
+++ b/packages/design-system/theme/src/card.scss
@@ -0,0 +1,32 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(card) {
+ border-radius: var.$card-border-radius;
+ border: 1px solid var.$card-border-color;
+ background-color: var.$color-white;
+ overflow: hidden;
+ color: var(--color-text-dark);
+ transition: 0.3s;
+
+ @include mixins.when(always-shadow) {
+ box-shadow: var.$box-shadow-light;
+ }
+
+ @include mixins.when(hover-shadow) {
+ &:hover,
+ &:focus {
+ box-shadow: var.$box-shadow-light;
+ }
+ }
+
+ @include mixins.e(header) {
+ padding: #{var.$card-padding - 2 var.$card-padding};
+ border-bottom: 1px solid var.$card-border-color;
+ box-sizing: border-box;
+ }
+
+ @include mixins.e(body) {
+ padding: var.$card-padding;
+ }
+}
diff --git a/packages/design-system/theme/src/carousel-item.scss b/packages/design-system/theme/src/carousel-item.scss
new file mode 100644
index 0000000000..5ebd254baf
--- /dev/null
+++ b/packages/design-system/theme/src/carousel-item.scss
@@ -0,0 +1,50 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(carousel) {
+ @include mixins.e(item) {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ display: inline-block;
+ overflow: hidden;
+ z-index: #{var.$index-normal - 1};
+
+ @include mixins.when(active) {
+ z-index: #{var.$index-normal + 1};
+ }
+
+ @include mixins.when(animating) {
+ transition: transform 0.4s ease-in-out;
+ }
+
+ @include mixins.m(card) {
+ width: 50%;
+ transition: transform 0.4s ease-in-out;
+ &.is-in-stage {
+ cursor: pointer;
+ z-index: var.$index-normal;
+ &:hover .el-carousel__mask,
+ &.is-hover .el-carousel__mask {
+ opacity: 0.12;
+ }
+ }
+ &.is-active {
+ z-index: #{var.$index-normal + 1};
+ }
+ }
+ }
+
+ @include mixins.e(mask) {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ background-color: var.$color-white;
+ opacity: 0.24;
+ transition: 0.2s;
+ }
+}
diff --git a/packages/design-system/theme/src/carousel.scss b/packages/design-system/theme/src/carousel.scss
new file mode 100644
index 0000000000..fa1f93f75a
--- /dev/null
+++ b/packages/design-system/theme/src/carousel.scss
@@ -0,0 +1,164 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(carousel) {
+ position: relative;
+
+ @include mixins.m(horizontal) {
+ overflow-x: hidden;
+ }
+
+ @include mixins.m(vertical) {
+ overflow-y: hidden;
+ }
+
+ @include mixins.e(container) {
+ position: relative;
+ height: 300px;
+ }
+
+ @include mixins.e(arrow) {
+ border: none;
+ outline: none;
+ padding: 0;
+ margin: 0;
+ height: var.$carousel-arrow-size;
+ width: var.$carousel-arrow-size;
+ cursor: pointer;
+ transition: 0.3s;
+ border-radius: 50%;
+ background-color: var.$carousel-arrow-background;
+ color: var.$color-white;
+ position: absolute;
+ top: 50%;
+ z-index: 10;
+ transform: translateY(-50%);
+ text-align: center;
+ font-size: var.$carousel-arrow-font-size;
+
+ @include mixins.m(left) {
+ left: 16px;
+ }
+
+ @include mixins.m(right) {
+ right: 16px;
+ }
+
+ &:hover {
+ background-color: var.$carousel-arrow-hover-background;
+ }
+
+ & i {
+ cursor: pointer;
+ }
+ }
+
+ @include mixins.e(indicators) {
+ position: absolute;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ z-index: #{var.$index-normal + 1};
+
+ @include mixins.m(horizontal) {
+ bottom: 0;
+ left: 50%;
+ transform: translateX(-50%);
+ }
+
+ @include mixins.m(vertical) {
+ right: 0;
+ top: 50%;
+ transform: translateY(-50%);
+ }
+
+ @include mixins.m(outside) {
+ bottom: #{var.$carousel-indicator-height +
+ var.$carousel-indicator-padding-vertical * 2};
+ text-align: center;
+ position: static;
+ transform: none;
+ .el-carousel__indicator:hover button {
+ opacity: 0.64;
+ }
+ button {
+ background-color: var.$carousel-indicator-out-color;
+ opacity: 0.24;
+ }
+ }
+
+ @include mixins.m(labels) {
+ left: 0;
+ right: 0;
+ transform: none;
+ text-align: center;
+
+ .el-carousel__button {
+ height: auto;
+ width: auto;
+ padding: 2px 18px;
+ font-size: 12px;
+ }
+
+ .el-carousel__indicator {
+ padding: 6px 4px;
+ }
+ }
+ }
+
+ @include mixins.e(indicator) {
+ background-color: transparent;
+ cursor: pointer;
+
+ &:hover button {
+ opacity: 0.72;
+ }
+
+ @include mixins.m(horizontal) {
+ display: inline-block;
+ padding: var.$carousel-indicator-padding-vertical
+ var.$carousel-indicator-padding-horizontal;
+ }
+
+ @include mixins.m(vertical) {
+ padding: var.$carousel-indicator-padding-horizontal
+ var.$carousel-indicator-padding-vertical;
+ .el-carousel__button {
+ width: var.$carousel-indicator-height;
+ height: #{var.$carousel-indicator-width * 0.5};
+ }
+ }
+
+ @include mixins.when(active) {
+ button {
+ opacity: 1;
+ }
+ }
+ }
+
+ @include mixins.e(button) {
+ display: block;
+ opacity: 0.48;
+ width: var.$carousel-indicator-width;
+ height: var.$carousel-indicator-height;
+ background-color: var.$color-white;
+ border: none;
+ outline: none;
+ padding: 0;
+ margin: 0;
+ cursor: pointer;
+ transition: 0.3s;
+ }
+}
+
+.carousel-arrow-left-enter,
+.carousel-arrow-left-leave-active {
+ transform: translateY(-50%) translateX(-10px);
+ opacity: 0;
+}
+
+.carousel-arrow-right-enter,
+.carousel-arrow-right-leave-active {
+ transform: translateY(-50%) translateX(10px);
+ opacity: 0;
+}
diff --git a/packages/design-system/theme/src/cascader-panel.scss b/packages/design-system/theme/src/cascader-panel.scss
new file mode 100644
index 0000000000..74a85d47cc
--- /dev/null
+++ b/packages/design-system/theme/src/cascader-panel.scss
@@ -0,0 +1,121 @@
+@use "mixins/mixins";
+@use "./common/var";
+@use "./checkbox";
+@use "./radio";
+@use "./scrollbar";
+
+@include mixins.b(cascader-panel) {
+ display: flex;
+ border-radius: var.$cascader-menu-radius;
+ font-size: var.$cascader-menu-font-size;
+
+ @include mixins.when(bordered) {
+ border: var.$cascader-menu-border;
+ border-radius: var.$cascader-menu-radius;
+ }
+}
+
+@include mixins.b(cascader-menu) {
+ min-width: 180px;
+ box-sizing: border-box;
+ color: var.$cascader-menu-font-color;
+ border-right: var.$cascader-menu-border;
+
+ &:last-child {
+ border-right: none;
+ .el-cascader-node {
+ padding-right: 20px;
+ }
+ }
+
+ @include mixins.e(wrap) {
+ height: 204px;
+ }
+
+ @include mixins.e(list) {
+ position: relative;
+ min-height: 100%;
+ margin: 0;
+ padding: 6px 0;
+ list-style: none;
+ box-sizing: border-box;
+ }
+
+ @include mixins.e(hover-zone) {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ }
+
+ @include mixins.e(empty-text) {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ text-align: center;
+ color: var.$cascader-color-empty;
+ }
+}
+
+@include mixins.b(cascader-node) {
+ position: relative;
+ display: flex;
+ align-items: center;
+ padding: 0 30px 0 20px;
+ height: 34px;
+ line-height: 34px;
+ outline: none;
+
+ &.is-selectable.in-active-path {
+ color: var.$cascader-menu-font-color;
+ }
+
+ &.in-active-path,
+ &.is-selectable.in-checked-path,
+ &.is-active {
+ color: var.$cascader-menu-selected-font-color;
+ font-weight: bold;
+ }
+
+ &:not(.is-disabled) {
+ cursor: pointer;
+ &:hover,
+ &:focus {
+ background: var.$cascader-node-background-hover;
+ }
+ }
+
+ @include mixins.when(disabled) {
+ color: var.$cascader-node-color-disabled;
+ cursor: not-allowed;
+ }
+
+ @include mixins.e(prefix) {
+ position: absolute;
+ left: 10px;
+ }
+
+ @include mixins.e(postfix) {
+ position: absolute;
+ right: 10px;
+ }
+
+ @include mixins.e(label) {
+ flex: 1;
+ padding: 0 10px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ > .el-radio {
+ margin-right: 0;
+
+ .el-radio__label {
+ padding-left: 0;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/cascader.scss b/packages/design-system/theme/src/cascader.scss
new file mode 100644
index 0000000000..7d0aac273e
--- /dev/null
+++ b/packages/design-system/theme/src/cascader.scss
@@ -0,0 +1,183 @@
+@use "mixins/mixins";
+@use "./common/var";
+@use "./input";
+@use "./popper";
+@use "./tag";
+@use "./cascader-panel";
+
+@include mixins.b(cascader) {
+ display: inline-block;
+ position: relative;
+ font-size: var.$font-size-base;
+ line-height: var.$input-height;
+
+ &:not(.is-disabled):hover {
+ .el-input__inner {
+ cursor: pointer;
+ border-color: var.$input-hover-border;
+ }
+ }
+
+ .el-input {
+ cursor: pointer;
+
+ .el-input__inner {
+ text-overflow: ellipsis;
+
+ &:focus {
+ border-color: var.$input-focus-border;
+ }
+ }
+
+ .el-icon-arrow-down {
+ transition: transform 0.3s;
+ font-size: 14px;
+
+ @include mixins.when(reverse) {
+ transform: rotateZ(180deg);
+ }
+ }
+
+ .el-icon-circle-close:hover {
+ color: var.$input-clear-hover-color;
+ }
+
+ @include mixins.when(focus) {
+ .el-input__inner {
+ border-color: var.$input-focus-border;
+ }
+ }
+ }
+
+ @include mixins.m(medium) {
+ font-size: var.$input-medium-font-size;
+ line-height: var.$input-medium-height;
+ }
+
+ @include mixins.m(small) {
+ font-size: var.$input-small-font-size;
+ line-height: var.$input-small-height;
+ }
+
+ @include mixins.m(mini) {
+ font-size: var.$input-mini-font-size;
+ line-height: var.$input-mini-height;
+ }
+
+ @include mixins.when(disabled) {
+ .el-cascader__label {
+ z-index: #{var.$index-normal + 1};
+ color: var.$disabled-color-base;
+ }
+ }
+
+ @include mixins.e(dropdown) {
+ margin: 5px 0;
+ font-size: var.$cascader-menu-font-size;
+ background: var.$cascader-menu-fill;
+ border: var.$cascader-menu-border;
+ border-radius: var.$cascader-menu-radius;
+ box-shadow: var.$cascader-menu-shadow;
+ }
+
+ @include mixins.e(tags) {
+ position: absolute;
+ left: 0;
+ right: 30px;
+ top: 50%;
+ transform: translateY(-50%);
+ display: flex;
+ flex-wrap: wrap;
+ line-height: normal;
+ text-align: left;
+ box-sizing: border-box;
+
+ .el-tag {
+ display: inline-flex;
+ align-items: center;
+ max-width: 100%;
+ margin: 2px 0 2px 6px;
+ text-overflow: ellipsis;
+ background: var.$cascader-tag-background;
+
+ &:not(.is-hit) {
+ border-color: transparent;
+ }
+
+ > span {
+ flex: 1;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .el-icon-close {
+ flex: none;
+ background-color: var(--color-text-lighter);
+ color: var.$color-white;
+
+ &:hover {
+ background-color: var(--color-text-light);
+ }
+ }
+ }
+ }
+
+ @include mixins.e(suggestion-panel) {
+ border-radius: var.$cascader-menu-radius;
+ }
+
+ @include mixins.e(suggestion-list) {
+ max-height: 204px;
+ margin: 0;
+ padding: 6px 0;
+ font-size: var.$font-size-base;
+ color: var.$cascader-menu-font-color;
+ text-align: center;
+ }
+
+ @include mixins.e(suggestion-item) {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ height: 34px;
+ padding: 0 15px;
+ text-align: left;
+ outline: none;
+ cursor: pointer;
+
+ &:hover,
+ &:focus {
+ background: var.$cascader-node-background-hover;
+ }
+
+ &.is-checked {
+ color: var.$cascader-menu-selected-font-color;
+ font-weight: bold;
+ }
+
+ > span {
+ margin-right: 10px;
+ }
+ }
+
+ @include mixins.e(empty-text) {
+ margin: 10px 0;
+ color: var.$cascader-color-empty;
+ }
+
+ @include mixins.e(search-input) {
+ flex: 1;
+ height: 24px;
+ min-width: 60px;
+ margin: 2px 0 2px 15px;
+ padding: 0;
+ color: var.$cascader-menu-font-color;
+ border: none;
+ outline: none;
+ box-sizing: border-box;
+
+ &::placeholder {
+ color: var(--color-text-lighter);
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/checkbox-button.scss b/packages/design-system/theme/src/checkbox-button.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/design-system/theme/src/checkbox-group.scss b/packages/design-system/theme/src/checkbox-group.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/design-system/theme/src/checkbox.scss b/packages/design-system/theme/src/checkbox.scss
new file mode 100644
index 0000000000..a699b7e39c
--- /dev/null
+++ b/packages/design-system/theme/src/checkbox.scss
@@ -0,0 +1,380 @@
+@use "./common/var";
+@use "mixins/mixins";
+@use "mixins/_button";
+@use "mixins/utils";
+
+@include mixins.b(checkbox) {
+ color: var.$checkbox-font-color;
+ font-weight: var.$checkbox-font-weight;
+ font-size: var.$font-size-base;
+ position: relative;
+ cursor: pointer;
+ display: inline-block;
+ white-space: nowrap;
+ user-select: none;
+ margin-right: 30px;
+
+ @include mixins.when(bordered) {
+ padding: var.$checkbox-bordered-padding;
+ border-radius: var(--border-radius-base);
+ border: var(--border-base);
+ box-sizing: border-box;
+ line-height: normal;
+ height: var.$checkbox-bordered-height;
+
+ &.is-checked {
+ border-color: var(--color-primary);
+ }
+
+ &.is-disabled {
+ border-color: var(--border-color-light);
+ cursor: not-allowed;
+ }
+
+ & + .el-checkbox.is-bordered {
+ margin-left: 10px;
+ }
+
+ &.el-checkbox--medium {
+ padding: var.$checkbox-bordered-medium-padding;
+ border-radius: var.$button-medium-border-radius;
+ height: var.$checkbox-bordered-medium-height;
+
+ .el-checkbox__label {
+ line-height: 17px;
+ font-size: var.$button-medium-font-size;
+ }
+
+ .el-checkbox__inner {
+ height: var.$checkbox-bordered-medium-input-height;
+ width: var.$checkbox-bordered-medium-input-width;
+ }
+ }
+
+ &.el-checkbox--small {
+ padding: var.$checkbox-bordered-small-padding;
+ border-radius: var.$button-small-border-radius;
+ height: var.$checkbox-bordered-small-height;
+
+ .el-checkbox__label {
+ line-height: 15px;
+ font-size: var.$button-small-font-size;
+ }
+
+ .el-checkbox__inner {
+ height: var.$checkbox-bordered-small-input-height;
+ width: var.$checkbox-bordered-small-input-width;
+
+ &::after {
+ height: 6px;
+ width: 2px;
+ }
+ }
+ }
+
+ &.el-checkbox--mini {
+ padding: var.$checkbox-bordered-mini-padding;
+ border-radius: var.$button-mini-border-radius;
+ height: var.$checkbox-bordered-mini-height;
+
+ .el-checkbox__label {
+ line-height: 12px;
+ font-size: var.$button-mini-font-size;
+ }
+
+ .el-checkbox__inner {
+ height: var.$checkbox-bordered-mini-input-height;
+ width: var.$checkbox-bordered-mini-input-width;
+ &::after {
+ height: 6px;
+ width: 2px;
+ }
+ }
+ }
+ }
+
+ @include mixins.e(input) {
+ white-space: nowrap;
+ cursor: pointer;
+ outline: none;
+ display: inline-block;
+ line-height: 1;
+ position: relative;
+ vertical-align: middle;
+
+ @include mixins.when(disabled) {
+ .el-checkbox__inner {
+ background-color: var.$checkbox-disabled-input-fill;
+ border-color: var.$checkbox-disabled-border-color;
+ cursor: not-allowed;
+
+ &::after {
+ cursor: not-allowed;
+ border-color: var.$checkbox-disabled-icon-color;
+ }
+
+ & + .el-checkbox__label {
+ cursor: not-allowed;
+ }
+ }
+
+ &.is-checked {
+ .el-checkbox__inner {
+ background-color: var.$checkbox-disabled-checked-input-fill;
+ border-color: var.$checkbox-disabled-checked-input-border-color;
+
+ &::after {
+ border-color: var.$checkbox-disabled-checked-icon-color;
+ }
+ }
+ }
+
+ &.is-indeterminate {
+ .el-checkbox__inner {
+ background-color: var.$checkbox-disabled-checked-input-fill;
+ border-color: var.$checkbox-disabled-checked-input-border-color;
+
+ &::before {
+ background-color: var.$checkbox-disabled-checked-icon-color;
+ border-color: var.$checkbox-disabled-checked-icon-color;
+ }
+ }
+ }
+
+ & + span.el-checkbox__label {
+ color: var.$disabled-color-base;
+ cursor: not-allowed;
+ }
+ }
+
+ @include mixins.when(checked) {
+ .el-checkbox__inner {
+ background-color: var.$checkbox-checked-background-color;
+ border-color: var.$checkbox-checked-input-border-color;
+
+ &::after {
+ transform: rotate(45deg) scaleY(1);
+ }
+ }
+
+ & + .el-checkbox__label {
+ color: var.$checkbox-checked-font-color;
+ }
+ }
+ @include mixins.when(focus) {
+ /*focus时 视觉上区分*/
+ .el-checkbox__inner {
+ border-color: var.$checkbox-input-border-color-hover;
+ }
+ }
+ @include mixins.when(indeterminate) {
+ .el-checkbox__inner {
+ background-color: var.$checkbox-checked-background-color;
+ border-color: var.$checkbox-checked-input-border-color;
+
+ &::before {
+ content: '';
+ position: absolute;
+ display: block;
+ background-color: var.$checkbox-checked-icon-color;
+ height: 2px;
+ transform: scale(0.5);
+ left: 0;
+ right: 0;
+ top: 5px;
+ }
+
+ &::after {
+ display: none;
+ }
+ }
+ }
+ }
+ @include mixins.e(inner) {
+ display: inline-block;
+ position: relative;
+ border: var.$checkbox-input-border;
+ border-radius: var.$checkbox-border-radius;
+ box-sizing: border-box;
+ width: var.$checkbox-input-width;
+ height: var.$checkbox-input-height;
+ background-color: var.$checkbox-background-color;
+ z-index: var.$index-normal;
+ transition: border-color 0.25s cubic-bezier(0.71, -0.46, 0.29, 1.46),
+ background-color 0.25s cubic-bezier(0.71, -0.46, 0.29, 1.46);
+
+ &:hover {
+ border-color: var.$checkbox-input-border-color-hover;
+ }
+
+ &::after {
+ box-sizing: content-box;
+ content: '';
+ border: 1px solid var.$checkbox-checked-icon-color;
+ border-left: 0;
+ border-top: 0;
+ height: 7px;
+ left: 4px;
+ position: absolute;
+ top: 1px;
+ transform: rotate(45deg) scaleY(0);
+ width: 3px;
+ transition: transform 0.15s ease-in 0.05s;
+ transform-origin: center;
+ }
+ }
+
+ @include mixins.e(original) {
+ opacity: 0;
+ outline: none;
+ position: absolute;
+ margin: 0;
+ width: 0;
+ height: 0;
+ z-index: -1;
+ }
+
+ @include mixins.e(label) {
+ display: inline-block;
+ padding-left: 10px;
+ line-height: 19px;
+ font-size: var.$checkbox-font-size;
+ }
+
+ &:last-of-type {
+ margin-right: 0;
+ }
+}
+
+@include mixins.b(checkbox-button) {
+ position: relative;
+ display: inline-block;
+
+ @include mixins.e(inner) {
+ display: inline-block;
+ line-height: 1;
+ font-weight: var.$checkbox-font-weight;
+ white-space: nowrap;
+ vertical-align: middle;
+ cursor: pointer;
+ background: var.$button-default-background-color;
+ border: var(--border-base);
+ border-left: 0;
+ color: var.$button-default-font-color;
+ -webkit-appearance: none;
+ text-align: center;
+ box-sizing: border-box;
+ outline: none;
+ margin: 0;
+ position: relative;
+ transition: var.$all-transition;
+ border-radius: 0;
+ @include utils.utils-user-select(none);
+
+ @include button.button-size(
+ var.$button-padding-vertical,
+ var.$button-padding-horizontal,
+ var.$button-font-size
+ );
+
+ &:hover {
+ color: var(--color-primary);
+ }
+
+ & [class*='el-icon-'] {
+ line-height: 0.9;
+
+ & + span {
+ margin-left: 5px;
+ }
+ }
+ }
+
+ @include mixins.e(original) {
+ opacity: 0;
+ outline: none;
+ position: absolute;
+ margin: 0;
+ z-index: -1;
+ }
+
+ &.is-checked {
+ & .el-checkbox-button__inner {
+ color: var.$checkbox-button-checked-font-color;
+ background-color: var.$checkbox-button-checked-background-color;
+ border-color: var.$checkbox-button-checked-border-color;
+ box-shadow: -1px 0 0 0 var.$color-primary-light-4;
+ }
+ &:first-child .el-checkbox-button__inner {
+ border-left-color: var.$checkbox-button-checked-border-color;
+ }
+ }
+
+ &.is-disabled {
+ & .el-checkbox-button__inner {
+ color: var.$button-disabled-font-color;
+ cursor: not-allowed;
+ background-image: none;
+ background-color: var.$button-disabled-background-color;
+ border-color: var.$button-disabled-border-color;
+ box-shadow: none;
+ }
+ &:first-child .el-checkbox-button__inner {
+ border-left-color: var.$button-disabled-border-color;
+ }
+ }
+
+ &:first-child {
+ .el-checkbox-button__inner {
+ border-left: var(--border-base);
+ border-radius: var(--border-radius-base) 0 0 var(--border-radius-base);
+ box-shadow: none !important;
+ }
+ }
+
+ &.is-focus {
+ & .el-checkbox-button__inner {
+ border-color: var.$checkbox-button-checked-border-color;
+ }
+ }
+
+ &:last-child {
+ .el-checkbox-button__inner {
+ border-radius: 0 var(--border-radius-base) var(--border-radius-base) 0;
+ }
+ }
+ @include mixins.m(medium) {
+ .el-checkbox-button__inner {
+ border-radius: 0;
+ @include button.button-size(
+ var.$button-medium-padding-vertical,
+ var.$button-medium-padding-horizontal,
+ var.$button-medium-font-size
+ );
+ }
+ }
+ @include mixins.m(small) {
+ .el-checkbox-button__inner {
+ border-radius: 0;
+ @include button.button-size(
+ var.$button-small-padding-vertical,
+ var.$button-small-padding-horizontal,
+ var.$button-small-font-size
+ );
+ }
+ }
+ @include mixins.m(mini) {
+ .el-checkbox-button__inner {
+ border-radius: 0;
+ @include button.button-size(
+ var.$button-mini-padding-vertical,
+ var.$button-mini-padding-horizontal,
+ var.$button-mini-font-size
+ );
+ }
+ }
+}
+
+@include mixins.b(checkbox-group) {
+ font-size: 0;
+}
diff --git a/packages/design-system/theme/src/col.scss b/packages/design-system/theme/src/col.scss
new file mode 100644
index 0000000000..85610c14c5
--- /dev/null
+++ b/packages/design-system/theme/src/col.scss
@@ -0,0 +1,158 @@
+@use "sass:math";
+
+@use "./common/var.scss";
+@use "./mixins/mixins.scss";
+
+[class*='el-col-'] {
+ float: left;
+ box-sizing: border-box;
+}
+
+.el-col-0 {
+ display: none;
+}
+
+@for $i from 0 through 24 {
+ .el-col-#{$i} {
+ width: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-offset-#{$i} {
+ margin-left: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-pull-#{$i} {
+ position: relative;
+ right: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-push-#{$i} {
+ position: relative;
+ left: (math.div(1, 24) * $i * 100) * 1%;
+ }
+}
+
+@include mixins.res(xs) {
+ .el-col-xs-0 {
+ display: none;
+ }
+ @for $i from 0 through 24 {
+ .el-col-xs-#{$i} {
+ width: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-xs-offset-#{$i} {
+ margin-left: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-xs-pull-#{$i} {
+ position: relative;
+ right: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-xs-push-#{$i} {
+ position: relative;
+ left: (math.div(1, 24) * $i * 100) * 1%;
+ }
+ }
+}
+
+@include mixins.res(sm) {
+ .el-col-sm-0 {
+ display: none;
+ }
+ @for $i from 0 through 24 {
+ .el-col-sm-#{$i} {
+ width: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-sm-offset-#{$i} {
+ margin-left: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-sm-pull-#{$i} {
+ position: relative;
+ right: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-sm-push-#{$i} {
+ position: relative;
+ left: (math.div(1, 24) * $i * 100) * 1%;
+ }
+ }
+}
+
+@include mixins.res(md) {
+ .el-col-md-0 {
+ display: none;
+ }
+ @for $i from 0 through 24 {
+ .el-col-md-#{$i} {
+ width: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-md-offset-#{$i} {
+ margin-left: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-md-pull-#{$i} {
+ position: relative;
+ right: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-md-push-#{$i} {
+ position: relative;
+ left: (math.div(1, 24) * $i * 100) * 1%;
+ }
+ }
+}
+
+@include mixins.res(lg) {
+ .el-col-lg-0 {
+ display: none;
+ }
+ @for $i from 0 through 24 {
+ .el-col-lg-#{$i} {
+ width: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-lg-offset-#{$i} {
+ margin-left: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-lg-pull-#{$i} {
+ position: relative;
+ right: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-lg-push-#{$i} {
+ position: relative;
+ left: (math.div(1, 24) * $i * 100) * 1%;
+ }
+ }
+}
+
+@include mixins.res(xl) {
+ .el-col-xl-0 {
+ display: none;
+ }
+ @for $i from 0 through 24 {
+ .el-col-xl-#{$i} {
+ width: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-xl-offset-#{$i} {
+ margin-left: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-xl-pull-#{$i} {
+ position: relative;
+ right: (math.div(1, 24) * $i * 100) * 1%;
+ }
+
+ .el-col-xl-push-#{$i} {
+ position: relative;
+ left: (math.div(1, 24) * $i * 100) * 1%;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/collapse-item.scss b/packages/design-system/theme/src/collapse-item.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/design-system/theme/src/collapse.scss b/packages/design-system/theme/src/collapse.scss
new file mode 100644
index 0000000000..eded66efd0
--- /dev/null
+++ b/packages/design-system/theme/src/collapse.scss
@@ -0,0 +1,63 @@
+@use "mixins/mixins";
+@use "./common/var";
+@use "common/transition";
+
+@include mixins.b(collapse) {
+ border-top: 1px solid var.$collapse-border-color;
+ border-bottom: 1px solid var.$collapse-border-color;
+}
+@include mixins.b(collapse-item) {
+ @include mixins.when(disabled) {
+ .el-collapse-item__header {
+ color: var.$font-color-disabled-base;
+ cursor: not-allowed;
+ }
+ }
+ @include mixins.e(header) {
+ display: flex;
+ align-items: center;
+ height: var.$collapse-header-height;
+ line-height: var.$collapse-header-height;
+ background-color: var.$collapse-header-background-color;
+ color: var.$collapse-header-font-color;
+ cursor: pointer;
+ border-bottom: 1px solid var.$collapse-border-color;
+ font-size: var.$collapse-header-font-size;
+ font-weight: 500;
+ transition: border-bottom-color 0.3s;
+ outline: none;
+ @include mixins.e(arrow) {
+ margin: 0 8px 0 auto;
+ transition: transform 0.3s;
+ font-weight: 300;
+ @include mixins.when(active) {
+ transform: rotate(90deg);
+ }
+ }
+ &.focusing:focus:not(:hover) {
+ color: var(--color-primary);
+ }
+ @include mixins.when(active) {
+ border-bottom-color: transparent;
+ }
+ }
+
+ @include mixins.e(wrap) {
+ will-change: height;
+ background-color: var.$collapse-content-background-color;
+ overflow: hidden;
+ box-sizing: border-box;
+ border-bottom: 1px solid var.$collapse-border-color;
+ }
+
+ @include mixins.e(content) {
+ padding-bottom: 25px;
+ font-size: var.$collapse-content-font-size;
+ color: var.$collapse-content-font-color;
+ line-height: 1.769230769230769;
+ }
+
+ &:last-child {
+ margin-bottom: -1px;
+ }
+}
diff --git a/packages/design-system/theme/src/color-picker.scss b/packages/design-system/theme/src/color-picker.scss
new file mode 100644
index 0000000000..3c4b114f95
--- /dev/null
+++ b/packages/design-system/theme/src/color-picker.scss
@@ -0,0 +1,382 @@
+@use "mixins/mixins";
+@use "mixins/button";
+@use "./common/var";
+
+@include mixins.b(color-predefine) {
+ display: flex;
+ font-size: 12px;
+ margin-top: 8px;
+ width: 280px;
+
+ @include mixins.e(colors) {
+ display: flex;
+ flex: 1;
+ flex-wrap: wrap;
+ }
+
+ @include mixins.e(color-selector) {
+ margin: 0 0 8px 8px;
+ width: 20px;
+ height: 20px;
+ border-radius: 4px;
+ cursor: pointer;
+
+ &:nth-child(10n + 1) {
+ margin-left: 0;
+ }
+
+ &.selected {
+ box-shadow: 0 0 3px 2px var(--color-primary);
+ }
+
+ > div {
+ display: flex;
+ height: 100%;
+ border-radius: 3px;
+ }
+
+ @include mixins.when(alpha) {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);
+ }
+ }
+}
+
+@include mixins.b(color-hue-slider) {
+ position: relative;
+ box-sizing: border-box;
+ width: 280px;
+ height: 12px;
+ background-color: #f00;
+ padding: 0 2px;
+
+ @include mixins.e(bar) {
+ position: relative;
+ background: linear-gradient(
+ to right,
+ #f00 0%,
+ #ff0 17%,
+ #0f0 33%,
+ #0ff 50%,
+ #00f 67%,
+ #f0f 83%,
+ #f00 100%
+ );
+ height: 100%;
+ }
+
+ @include mixins.e(thumb) {
+ position: absolute;
+ cursor: pointer;
+ box-sizing: border-box;
+ left: 0;
+ top: 0;
+ width: 4px;
+ height: 100%;
+ border-radius: 1px;
+ background: #fff;
+ border: 1px solid #f0f0f0;
+ box-shadow: 0 0 2px rgba(0, 0, 0, 0.6);
+ z-index: 1;
+ }
+
+ @include mixins.when(vertical) {
+ width: 12px;
+ height: 180px;
+ padding: 2px 0;
+
+ .el-color-hue-slider__bar {
+ background: linear-gradient(
+ to bottom,
+ #f00 0%,
+ #ff0 17%,
+ #0f0 33%,
+ #0ff 50%,
+ #00f 67%,
+ #f0f 83%,
+ #f00 100%
+ );
+ }
+
+ .el-color-hue-slider__thumb {
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 4px;
+ }
+ }
+}
+
+@include mixins.b(color-svpanel) {
+ position: relative;
+ width: 280px;
+ height: 180px;
+
+ @include mixins.e(('white', 'black')) {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ }
+
+ @include mixins.e('white') {
+ background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0));
+ }
+
+ @include mixins.e('black') {
+ background: linear-gradient(to top, #000, rgba(0, 0, 0, 0));
+ }
+
+ @include mixins.e(cursor) {
+ position: absolute;
+
+ > div {
+ cursor: head;
+ width: 4px;
+ height: 4px;
+ box-shadow: 0 0 0 1.5px #fff, inset 0 0 1px 1px rgba(0, 0, 0, 0.3),
+ 0 0 1px 2px rgba(0, 0, 0, 0.4);
+ border-radius: 50%;
+ transform: translate(-2px, -2px);
+ }
+ }
+}
+
+@include mixins.b(color-alpha-slider) {
+ position: relative;
+ box-sizing: border-box;
+ width: 280px;
+ height: 12px;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);
+
+ @include mixins.e(bar) {
+ position: relative;
+ background: linear-gradient(
+ to right,
+ rgba(255, 255, 255, 0) 0%,
+ rgba(255, 255, 255, 1) 100%
+ );
+ height: 100%;
+ }
+
+ @include mixins.e(thumb) {
+ position: absolute;
+ cursor: pointer;
+ box-sizing: border-box;
+ left: 0;
+ top: 0;
+ width: 4px;
+ height: 100%;
+ border-radius: 1px;
+ background: #fff;
+ border: 1px solid #f0f0f0;
+ box-shadow: 0 0 2px rgba(0, 0, 0, 0.6);
+ z-index: 1;
+ }
+
+ @include mixins.when(vertical) {
+ width: 20px;
+ height: 180px;
+
+ .el-color-alpha-slider__bar {
+ background: linear-gradient(
+ to bottom,
+ rgba(255, 255, 255, 0) 0%,
+ rgba(255, 255, 255, 1) 100%
+ );
+ }
+
+ .el-color-alpha-slider__thumb {
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 4px;
+ }
+ }
+}
+
+@include mixins.b(color-dropdown) {
+ width: 300px;
+
+ @include mixins.e(main-wrapper) {
+ margin-bottom: 6px;
+
+ &::after {
+ content: '';
+ display: table;
+ clear: both;
+ }
+ }
+
+ @include mixins.e(btns) {
+ margin-top: 6px;
+ text-align: right;
+ }
+
+ @include mixins.e(value) {
+ float: left;
+ line-height: 26px;
+ font-size: 12px;
+ color: var.$color-black;
+ width: 160px;
+ }
+
+ @include mixins.e(btn) {
+ @include button.button-round();
+ @include button.button-small();
+ @include button.button-just-primary();
+ }
+
+ @include mixins.e(link-btn) {
+ @include button.button-round();
+ @include button.button-outline();
+ @include button.button-small();
+
+ margin-right: var(--spacing-2xs);
+ }
+}
+
+@include mixins.b(color-picker) {
+ display: inline-block;
+ position: relative;
+ line-height: normal;
+ height: 40px;
+
+ @include mixins.when(disabled) {
+ .el-color-picker__trigger {
+ cursor: not-allowed;
+ }
+ }
+
+ @include mixins.m(medium) {
+ height: 36px;
+
+ .el-color-picker__trigger {
+ height: 36px;
+ width: 36px;
+ }
+
+ .el-color-picker__mask {
+ height: 34px;
+ width: 34px;
+ }
+ }
+
+ @include mixins.m(small) {
+ height: 32px;
+
+ .el-color-picker__trigger {
+ height: 32px;
+ width: 32px;
+ }
+
+ .el-color-picker__mask {
+ height: 30px;
+ width: 30px;
+ }
+
+ .el-color-picker__icon,
+ .el-color-picker__empty {
+ transform: translate3d(-50%, -50%, 0) scale(0.8);
+ }
+ }
+
+ @include mixins.m(mini) {
+ height: 28px;
+
+ .el-color-picker__trigger {
+ height: 28px;
+ width: 28px;
+ }
+
+ .el-color-picker__mask {
+ height: 26px;
+ width: 26px;
+ }
+
+ .el-color-picker__icon,
+ .el-color-picker__empty {
+ transform: translate3d(-50%, -50%, 0) scale(0.8);
+ }
+ }
+
+ @include mixins.e(mask) {
+ height: 38px;
+ width: 38px;
+ border-radius: 4px;
+ position: absolute;
+ top: 1px;
+ left: 1px;
+ z-index: 1;
+ cursor: not-allowed;
+ background-color: rgba(255, 255, 255, 0.7);
+ }
+
+ @include mixins.e(trigger) {
+ display: inline-block;
+ box-sizing: border-box;
+ height: 40px;
+ width: 40px;
+ padding: 4px;
+ border: 1px solid #e6e6e6;
+ border-radius: 4px;
+ font-size: 0;
+ position: relative;
+ cursor: pointer;
+ }
+
+ @include mixins.e(color) {
+ position: relative;
+ display: block;
+ box-sizing: border-box;
+ border: 1px solid #999;
+ border-radius: var(--border-radius-small);
+ width: 100%;
+ height: 100%;
+ text-align: center;
+
+ @include mixins.when(alpha) {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);
+ }
+ }
+
+ @include mixins.e(color-inner) {
+ position: absolute;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ }
+
+ @include mixins.e(empty) {
+ font-size: 12px;
+ color: #999;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate3d(-50%, -50%, 0);
+ }
+
+ @include mixins.e(icon) {
+ display: inline-block;
+ position: absolute;
+ width: 100%;
+ top: 50%;
+ left: 50%;
+ transform: translate3d(-50%, -50%, 0);
+ color: var.$color-white;
+ text-align: center;
+ font-size: 12px;
+ }
+
+ @include mixins.e(panel) {
+ position: absolute;
+ z-index: 10;
+ padding: 6px;
+ box-sizing: content-box;
+ background-color: var.$color-white;
+ border: 1px solid var(--border-color-light);
+ border-radius: var(--border-radius-base);
+ box-shadow: var.$dropdown-menu-box-shadow;
+ }
+}
diff --git a/packages/design-system/theme/src/common/popup.scss b/packages/design-system/theme/src/common/popup.scss
new file mode 100644
index 0000000000..a26c3eea96
--- /dev/null
+++ b/packages/design-system/theme/src/common/popup.scss
@@ -0,0 +1,42 @@
+@use "./var.scss";
+@use "../mixins/mixins";
+
+.v-modal-enter {
+ animation: v-modal-in 0.2s ease;
+}
+
+.v-modal-leave {
+ animation: v-modal-out 0.2s ease forwards;
+}
+
+@keyframes v-modal-in {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ }
+}
+
+@keyframes v-modal-out {
+ 0% {
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+
+.v-modal {
+ position: fixed;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ opacity: var.$popup-modal-opacity;
+ background: var.$popup-modal-background-color;
+}
+
+@include mixins.b(popup-parent) {
+ @include mixins.m(hidden) {
+ overflow: hidden;
+ }
+}
diff --git a/packages/design-system/theme/src/common/transition.scss b/packages/design-system/theme/src/common/transition.scss
new file mode 100644
index 0000000000..576f8f8339
--- /dev/null
+++ b/packages/design-system/theme/src/common/transition.scss
@@ -0,0 +1,102 @@
+@use "./var";
+
+.fade-in-linear-enter-active,
+.fade-in-linear-leave-active {
+ transition: var.$fade-linear-transition;
+}
+.fade-in-linear-enter,
+.fade-in-linear-leave,
+.fade-in-linear-leave-active {
+ opacity: 0;
+}
+
+.el-fade-in-linear-enter-active,
+.el-fade-in-linear-leave-active {
+ transition: var.$fade-linear-transition;
+}
+.el-fade-in-linear-enter,
+.el-fade-in-linear-leave,
+.el-fade-in-linear-leave-active {
+ opacity: 0;
+}
+
+.el-fade-in-enter-active,
+.el-fade-in-leave-active {
+ transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1);
+}
+.el-fade-in-enter,
+.el-fade-in-leave-active {
+ opacity: 0;
+}
+
+.el-zoom-in-center-enter-active,
+.el-zoom-in-center-leave-active {
+ transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1);
+}
+.el-zoom-in-center-enter,
+.el-zoom-in-center-leave-active {
+ opacity: 0;
+ transform: scaleX(0);
+}
+
+.el-zoom-in-top-enter-active,
+.el-zoom-in-top-leave-active {
+ opacity: 1;
+ transform: scaleY(1);
+ transition: var.$md-fade-transition;
+ transform-origin: center top;
+}
+.el-zoom-in-top-enter,
+.el-zoom-in-top-leave-active {
+ opacity: 0;
+ transform: scaleY(0);
+}
+
+.el-zoom-in-bottom-enter-active,
+.el-zoom-in-bottom-leave-active {
+ opacity: 1;
+ transform: scaleY(1);
+ transition: var.$md-fade-transition;
+ transform-origin: center bottom;
+}
+.el-zoom-in-bottom-enter,
+.el-zoom-in-bottom-leave-active {
+ opacity: 0;
+ transform: scaleY(0);
+}
+
+.el-zoom-in-left-enter-active,
+.el-zoom-in-left-leave-active {
+ opacity: 1;
+ transform: scale(1, 1);
+ transition: var.$md-fade-transition;
+ transform-origin: top left;
+}
+.el-zoom-in-left-enter,
+.el-zoom-in-left-leave-active {
+ opacity: 0;
+ transform: scale(0.45, 0.45);
+}
+
+.collapse-transition {
+ transition: 0.3s height ease-in-out, 0.3s padding-top ease-in-out,
+ 0.3s padding-bottom ease-in-out;
+}
+.horizontal-collapse-transition {
+ transition: 0.3s width ease-in-out, 0.3s padding-left ease-in-out,
+ 0.3s padding-right ease-in-out;
+}
+
+.el-list-enter-active,
+.el-list-leave-active {
+ transition: all 1s;
+}
+.el-list-enter,
+.el-list-leave-active {
+ opacity: 0;
+ transform: translateY(-30px);
+}
+
+.el-opacity-transition {
+ transition: opacity 0.3s cubic-bezier(0.55, 0, 0.1, 1);
+}
diff --git a/packages/design-system/theme/src/common/typography.scss b/packages/design-system/theme/src/common/typography.scss
new file mode 100644
index 0000000000..db5365d67c
--- /dev/null
+++ b/packages/design-system/theme/src/common/typography.scss
@@ -0,0 +1,66 @@
+%bold {
+ font-weight: var(--font-weight-bold);
+}
+
+.heading1 {
+ font-size: var(--font-size-2xl);
+ line-height: var(--font-line-height-compact);
+}
+
+.heading1-bold {
+ @extend %bold, .heading1;
+}
+
+.heading2 {
+ font-size: var(--font-size-xl);
+ line-height: var(--font-line-height-loose);
+}
+
+.heading2-bold {
+ @extend %bold, .heading2;
+}
+
+.heading3 {
+ font-size: var(--font-size-m);
+ line-height: var(--font-line-height-loose);
+}
+
+.heading3-bold {
+ @extend %bold, .heading3;
+}
+
+.heading4 {
+ font-size: var(--font-size-s);
+ line-height: var(--font-line-height-regular);
+}
+
+.heading4-bold {
+ @extend %bold, .heading4;
+}
+
+.body-large {
+ font-size: var(--font-size-m);
+ line-height: var(--font-line-height-xloose);
+}
+
+.body-large-bold {
+ @extend %bold, .body-large;
+}
+
+.body-medium {
+ font-size: var(--font-size-s);
+ line-height: var(--font-line-height-loose);
+}
+
+.body-medium-bold {
+ @extend %bold, .body-medium;
+}
+
+.body-small {
+ font-size: var(--font-size-2xs);
+ line-height: var(--font-line-height-loose);
+}
+
+.body-small-bold {
+ @extend %bold, .body-small;
+}
diff --git a/packages/design-system/theme/src/common/var.scss b/packages/design-system/theme/src/common/var.scss
new file mode 100644
index 0000000000..fc009d8af6
--- /dev/null
+++ b/packages/design-system/theme/src/common/var.scss
@@ -0,0 +1,1191 @@
+@use "sass:math";
+@use "../mixins/function.scss";
+
+// Special comment for theme configurator
+// type|skipAutoTranslation|Category|Order
+// skipAutoTranslation 1
+
+/* Transition
+-------------------------- */
+$all-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+$fade-transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
+$fade-linear-transition: opacity 200ms linear;
+$md-fade-transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1),
+ opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
+$border-transition-base: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
+$color-transition-base: color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
+
+/* Color
+-------------------------- */
+$color-white: #ffffff;
+$color-black: #000000;
+
+$color-primary-light-1: function.lightness(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ 4%
+);
+$color-primary-light-2: function.lightness(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ 8%
+);
+$color-primary-light-3: function.lightness(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ 12%
+);
+$color-primary-light-4: function.lightness(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ 16%
+);
+$color-primary-light-5: function.lightness(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ 20%
+);
+$color-primary-light-6: function.lightness(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ 24%
+);
+$color-primary-light-7: function.lightness(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ 28%
+);
+$color-primary-light-8: function.lightness(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ 32%
+);
+$color-primary-light-9: function.lightness(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ 36%
+);
+$color-primary-light: function.lightness(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ 30%
+);
+$color-primary-lighter: function.lightness(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ 34%
+);
+
+$color-primary-shade-1: function.lightness(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ -(10)
+);
+
+$color-success-light-1: function.lightness(
+ --color-success-h,
+ --color-success-s,
+ --color-success-l,
+ 4%
+);
+$color-success-light-3: function.lightness(
+ --color-success-h,
+ --color-success-s,
+ --color-success-l,
+ 12%
+);
+$color-success-light-5: function.lightness(
+ --color-success-h,
+ --color-success-s,
+ --color-success-l,
+ 20%
+);
+$color-success-light: function.lightness(
+ --color-success-h,
+ --color-success-s,
+ --color-success-l,
+ 41%
+);
+$color-success-lighter: function.lightness(
+ --color-success-h,
+ --color-success-s,
+ --color-success-l,
+ 48%
+);
+
+$color-warning-light-1: function.lightness(
+ --color-warning-h,
+ --color-warning-s,
+ --color-warning-l,
+ 4%
+);
+$color-warning-light-3: function.lightness(
+ --color-warning-h,
+ --color-warning-s,
+ --color-warning-l,
+ 12%
+);
+$color-warning-light-5: function.lightness(
+ --color-warning-h,
+ --color-warning-s,
+ --color-warning-l,
+ 20%
+);
+$color-warning-light: function.lightness(
+ --color-warning-h,
+ --color-warning-s,
+ --color-warning-l,
+ 34%
+);
+$color-warning-lighter: function.lightness(
+ --color-warning-h,
+ --color-warning-s,
+ --color-warning-l,
+ 40%
+);
+
+$color-danger-light-1: function.lightness(
+ --color-danger-h,
+ --color-danger-s,
+ --color-danger-l,
+ 4%
+);
+$color-danger-light-3: function.lightness(
+ --color-danger-h,
+ --color-danger-s,
+ --color-danger-l,
+ 12%
+);
+$color-danger-light-5: function.lightness(
+ --color-danger-h,
+ --color-danger-s,
+ --color-danger-l,
+ 20%
+);
+$color-danger-light: function.lightness(
+ --color-danger-h,
+ --color-danger-s,
+ --color-danger-l,
+ 24%
+);
+$color-danger-lighter: var(--color-danger-tint-2);
+
+$color-info-light-1: function.lightness(
+ --color-info-h,
+ --color-info-s,
+ --color-info-l,
+ 4%
+);
+$color-info-light-3: function.lightness(
+ --color-info-h,
+ --color-info-s,
+ --color-info-l,
+ 12%
+);
+$color-info-light-5: function.lightness(
+ --color-info-h,
+ --color-info-s,
+ --color-info-l,
+ 20%
+);
+$color-info-lighter: function.lightness(
+ --color-info-h,
+ --color-info-s,
+ --color-info-l,
+ 39%
+);
+
+// Background
+/// color|1|Background Color|4
+$background-color-base: var(--color-background-base);
+
+/* Link
+-------------------------- */
+$link-color: $color-primary-light-2;
+$link-hover-color: var(--color-primary);
+
+/* Border
+-------------------------- */
+$border-color-hover: var(--color-text-lighter);
+/// borderRadius|1|Radius|0
+$border-radius-circle: 100%;
+
+// Box-shadow
+/// boxShadow|1|Shadow|1
+$box-shadow-base: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
+// boxShadow|1|Shadow|1
+$box-shadow-dark: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.12);
+/// boxShadow|1|Shadow|1
+$box-shadow-light: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+
+/* Fill
+-------------------------- */
+$fill-base: $color-white;
+
+/* Typography
+-------------------------- */
+$font-path: 'fonts' !default;
+$font-display: 'auto';
+/// fontSize|1|Font Size|0
+$font-size-extra-large: var(--font-size-xl);
+/// fontSize|1|Font Size|0
+$font-size-large: var(--font-size-l);
+/// fontSize|1|Font Size|0
+$font-size-medium: var(--font-size-m);
+/// fontSize|1|Font Size|0
+$font-size-base: var(--font-size-s);
+/// fontSize|1|Font Size|0
+$font-size-small: var(--font-size-xs);
+/// fontSize|1|Font Size|0
+$font-size-extra-small: var(--font-size-2xs);
+/// fontWeight|1|Font Weight|1
+$font-weight-primary: var(--font-weight-semi-bold);
+/// fontLineHeight|1|Line Height|2
+$font-line-height-primary: 24px;
+$font-color-disabled-base: #bbb;
+
+/* z-index
+-------------------------- */
+$index-normal: 1;
+$index-top: 1000;
+$index-popper: 2000;
+
+/* Disable base
+-------------------------- */
+$disabled-fill-base: var(--disabled-fill, var(--color-background-light));
+$disabled-color-base: var(--disabled-color, var(--color-text-base));
+$disabled-border-base: var(--disabled-border, var(--border-color-base));
+
+/* Icon
+-------------------------- */
+$icon-color: #666;
+$icon-color-base: var(--color-info);
+
+/* Checkbox
+-------------------------- */
+/// fontSize||Font|1
+$checkbox-font-size: 14px;
+/// fontWeight||Font|1
+$checkbox-font-weight: $font-weight-primary;
+/// color||Color|0
+$checkbox-font-color: var(--color-text-dark);
+$checkbox-input-height: 14px;
+$checkbox-input-width: 14px;
+/// borderRadius||Border|2
+$checkbox-border-radius: var(--border-radius-small);
+/// color||Color|0
+$checkbox-background-color: $color-white;
+$checkbox-input-border: var(--border-base);
+
+/// color||Color|0
+$checkbox-disabled-border-color: var(--border-color-base);
+$checkbox-disabled-input-fill: #edf2fc;
+$checkbox-disabled-icon-color: var(--color-text-lighter);
+
+$checkbox-disabled-checked-input-fill: var(--border-color-light);
+$checkbox-disabled-checked-input-border-color: var(--border-color-base);
+$checkbox-disabled-checked-icon-color: var(--color-text-lighter);
+
+/// color||Color|0
+$checkbox-checked-font-color: var(--color-primary);
+$checkbox-checked-input-border-color: var(--color-primary);
+/// color||Color|0
+$checkbox-checked-background-color: var(--color-primary);
+$checkbox-checked-icon-color: $fill-base;
+
+$checkbox-input-border-color-hover: var(--color-primary);
+/// height||Other|4
+$checkbox-bordered-height: 40px;
+/// padding||Spacing|3
+$checkbox-bordered-padding: 9px 20px 9px 10px;
+/// padding||Spacing|3
+$checkbox-bordered-medium-padding: 7px 20px 7px 10px;
+/// padding||Spacing|3
+$checkbox-bordered-small-padding: 5px 15px 5px 10px;
+/// padding||Spacing|3
+$checkbox-bordered-mini-padding: 3px 15px 3px 10px;
+$checkbox-bordered-medium-input-height: 14px;
+$checkbox-bordered-medium-input-width: 14px;
+/// height||Other|4
+$checkbox-bordered-medium-height: 36px;
+$checkbox-bordered-small-input-height: 12px;
+$checkbox-bordered-small-input-width: 12px;
+/// height||Other|4
+$checkbox-bordered-small-height: 32px;
+$checkbox-bordered-mini-input-height: 12px;
+$checkbox-bordered-mini-input-width: 12px;
+/// height||Other|4
+$checkbox-bordered-mini-height: 28px;
+
+/// color||Color|0
+$checkbox-button-checked-background-color: var(--color-primary);
+/// color||Color|0
+$checkbox-button-checked-font-color: $color-white;
+/// color||Color|0
+$checkbox-button-checked-border-color: var(--color-primary);
+
+/* Radio
+-------------------------- */
+/// fontSize||Font|1
+$radio-font-size: $font-size-base;
+/// fontWeight||Font|1
+$radio-font-weight: $font-weight-primary;
+/// color||Color|0
+$radio-font-color: var(--color-text-dark);
+$radio-input-height: 14px;
+$radio-input-width: 14px;
+/// borderRadius||Border|2
+$radio-input-border-radius: $border-radius-circle;
+/// color||Color|0
+$radio-input-background-color: $color-white;
+$radio-input-border: var(--border-base);
+/// color||Color|0
+$radio-input-border-color: var(--border-color-base);
+/// color||Color|0
+$radio-icon-color: $color-white;
+
+$radio-disabled-input-border-color: $disabled-border-base;
+$radio-disabled-input-fill: $disabled-fill-base;
+$radio-disabled-icon-color: $disabled-fill-base;
+
+$radio-disabled-checked-input-border-color: $disabled-border-base;
+$radio-disabled-checked-input-fill: $disabled-fill-base;
+$radio-disabled-checked-icon-color: var(--color-text-lighter);
+
+/// color||Color|0
+$radio-checked-font-color: var(--color-primary);
+/// color||Color|0
+$radio-checked-input-border-color: var(--color-primary);
+/// color||Color|0
+$radio-checked-input-background-color: $color-white;
+/// color||Color|0
+$radio-checked-icon-color: var(--color-primary);
+
+$radio-input-border-color-hover: var(--color-primary);
+
+$radio-bordered-height: 40px;
+$radio-bordered-padding: 12px 20px 0 10px;
+$radio-bordered-medium-padding: 10px 20px 0 10px;
+$radio-bordered-small-padding: 8px 15px 0 10px;
+$radio-bordered-mini-padding: 6px 15px 0 10px;
+$radio-bordered-medium-input-height: 14px;
+$radio-bordered-medium-input-width: 14px;
+$radio-bordered-medium-height: 36px;
+$radio-bordered-small-input-height: 12px;
+$radio-bordered-small-input-width: 12px;
+$radio-bordered-small-height: 32px;
+$radio-bordered-mini-input-height: 12px;
+$radio-bordered-mini-input-width: 12px;
+$radio-bordered-mini-height: 28px;
+
+/// fontSize||Font|1
+$radio-button-font-size: $font-size-base;
+/// color||Color|0
+$radio-button-checked-background-color: var(--color-primary);
+/// color||Color|0
+$radio-button-checked-font-color: $color-white;
+/// color||Color|0
+$radio-button-checked-border-color: var(--color-primary);
+$radio-button-disabled-checked-fill: var(--border-color-light);
+
+/* Select
+-------------------------- */
+$select-border-color-hover: $border-color-hover;
+$select-disabled-border: $disabled-border-base;
+/// fontSize||Font|1
+$select-font-size: $font-size-base;
+$select-close-hover-color: var(--color-text-light);
+
+$select-input-color: var(--color-text-lighter);
+$select-multiple-input-color: #666;
+/// color||Color|0
+$select-input-focus-border-color: var(--color-secondary);
+/// fontSize||Font|1
+$select-input-font-size: 14px;
+
+$select-option-color: var(--color-text-dark);
+$select-option-disabled-color: var(--color-text-lighter);
+$select-option-disabled-background: $color-white;
+/// height||Other|4
+$select-option-height: 34px;
+$select-option-hover-background: $background-color-base;
+/// color||Color|0
+$select-option-selected-font-color: var(--color-primary);
+$select-option-selected-hover: $background-color-base;
+
+$select-group-color: var(--color-info);
+$select-group-height: 30px;
+$select-group-font-size: 12px;
+
+$select-dropdown-background: $color-white;
+$select-dropdown-shadow: $box-shadow-light;
+$select-dropdown-empty-color: #999;
+/// height||Other|4
+$select-dropdown-max-height: 274px;
+$select-dropdown-padding: 6px 0;
+$select-dropdown-empty-padding: 10px 0;
+$select-dropdown-border: solid 1px var(--border-color-base);
+
+/* Alert
+-------------------------- */
+$alert-padding: 8px 16px;
+/// borderRadius||Border|2
+$alert-border-radius: var(--border-radius-base);
+/// fontSize||Font|1
+$alert-title-font-size: 13px;
+/// fontSize||Font|1
+$alert-description-font-size: 12px;
+/// fontSize||Font|1
+$alert-close-font-size: 12px;
+/// fontSize||Font|1
+$alert-close-customed-font-size: 13px;
+
+$alert-success-color: $color-success-lighter;
+$alert-info-color: $color-info-lighter;
+$alert-warning-color: $color-warning-lighter;
+$alert-danger-color: $color-danger-lighter;
+
+/// height||Other|4
+$alert-icon-size: 16px;
+/// height||Other|4
+$alert-icon-large-size: 28px;
+
+/* MessageBox
+-------------------------- */
+/// color||Color|0
+$messagebox-title-color: var(--color-text-dark);
+$msgbox-width: 420px;
+$msgbox-border-radius: 4px;
+/// fontSize||Font|1
+$messagebox-font-size: $font-size-large;
+/// fontSize||Font|1
+$messagebox-content-font-size: $font-size-base;
+/// color||Color|0
+$messagebox-content-color: var(--color-text-dark);
+/// fontSize||Font|1
+$messagebox-error-font-size: 12px;
+$msgbox-padding-primary: 15px;
+/// color||Color|0
+$messagebox-success-color: var(--color-success);
+/// color||Color|0
+$messagebox-info-color: var(--color-info);
+/// color||Color|0
+$messagebox-warning-color: var(--color-warning);
+/// color||Color|0
+$messagebox-danger-color: var(--color-danger);
+
+/* Message
+-------------------------- */
+$message-shadow: $box-shadow-base;
+$message-min-width: 380px;
+$message-background-color: #edf2fc;
+$message-padding: 15px 15px 15px 20px;
+/// color||Color|0
+$message-close-icon-color: var(--color-text-lighter);
+/// height||Other|4
+$message-close-size: 16px;
+/// color||Color|0
+$message-close-hover-color: var(--color-text-light);
+
+/// color||Color|0
+$message-success-font-color: var(--color-success);
+/// color||Color|0
+$message-info-font-color: var(--color-info);
+/// color||Color|0
+$message-warning-font-color: var(--color-warning);
+/// color||Color|0
+$message-danger-font-color: var(--color-danger);
+
+/* Notification
+-------------------------- */
+$notification-width: 330px;
+/// padding||Spacing|3
+$notification-padding: 14px 26px 14px 13px;
+$notification-radius: 8px;
+$notification-shadow: $box-shadow-light;
+/// color||Color|0
+$notification-border-color: var(--border-color-light);
+$notification-icon-size: 24px;
+$notification-close-font-size: $message-close-size;
+$notification-group-margin-left: 13px;
+$notification-group-margin-right: 8px;
+/// fontSize||Font|1
+$notification-content-font-size: $font-size-base;
+/// color||Color|0
+$notification-content-color: var(--color-text-dark);
+/// fontSize||Font|1
+$notification-title-font-size: 16px;
+/// color||Color|0
+$notification-title-color: var(--color-text-dark);
+
+/// color||Color|0
+$notification-close-color: var(--color-text-light);
+/// color||Color|0
+$notification-close-hover-color: var(--color-text-dark);
+
+/// color||Color|0
+$notification-success-icon-color: var(--color-success);
+/// color||Color|0
+$notification-info-icon-color: var(--color-info);
+/// color||Color|0
+$notification-warning-icon-color: var(--color-warning);
+/// color||Color|0
+$notification-danger-icon-color: var(--color-danger);
+
+/* Input
+-------------------------- */
+$input-placeholder-color: var(--input-placeholder-color, var(--color-text-light));
+$input-focus-border: var(--input-focus-border-color, var(--color-secondary));
+$input-border-color: var(--input-border-color, var(--border-color-base));
+$input-border-style: var(--input-border-style, var(--border-style-base));
+$input-border-width: var(--border-width-base);
+$input-border: $input-border-color $input-border-style $input-border-width;
+
+$input-font-size: var(--input-font-size, var(--font-size-s));
+/// color||Color|0
+$input-font-color: var(--input-font-color, var(--color-text-dark));
+/// height||Other|4
+$input-width: 140px;
+/// height||Other|4
+$input-height: 40px;
+/// borderRadius||Border|2
+$input-border-radius: var(--input-border-radius, var(--border-radius-base));
+$input-border-color-hover: $border-color-hover;
+/// color||Color|0
+$input-background-color: var(--input-background-color, var(--color-foreground-xlight));
+$input-fill-disabled: $disabled-fill-base;
+$input-color-disabled: $font-color-disabled-base;
+/// color||Color|0
+$input-icon-color: var(--color-text-lighter);
+/// color||Color|0
+
+$input-hover-border: $border-color-hover;
+$input-clear-color: var(--color-text-light);
+$input-clear-hover-color: var(--color-text-base);
+
+$input-disabled-fill: $disabled-fill-base;
+$input-disabled-border: $disabled-border-base;
+$input-disabled-color: $disabled-color-base;
+$input-disabled-placeholder-color: var(--color-text-lighter);
+
+/// fontSize||Font|1
+$input-medium-font-size: var(--input-font-size, 14px);
+/// height||Other|4
+$input-medium-height: 36px;
+/// fontSize||Font|1
+$input-small-font-size: 12px !default;
+/// height||Other|4
+$input-small-height: 30px !default;
+/// fontSize||Font|1
+$input-mini-font-size: 12px;
+/// height||Other|4
+$input-mini-height: 26px !default;
+
+/* Cascader
+-------------------------- */
+/// color||Color|0
+$cascader-menu-font-color: var(--color-text-dark);
+/// color||Color|0
+$cascader-menu-selected-font-color: var(--color-primary);
+$cascader-menu-fill: $fill-base;
+$cascader-menu-font-size: $font-size-base;
+$cascader-menu-radius: var(--border-radius-base);
+$cascader-menu-border: solid 1px var(--border-color-base);
+$cascader-menu-shadow: $box-shadow-light;
+$cascader-node-background-hover: $background-color-base;
+$cascader-node-color-disabled: var(--color-text-lighter);
+$cascader-color-empty: var(--color-text-lighter);
+$cascader-tag-background: #f0f2f5;
+
+/* Group
+-------------------------- */
+$group-option-flex: 0 0 (math.div(1, 5)) * 100%;
+$group-option-offset-bottom: 12px;
+$group-option-fill-hover: rgba($color-black, 0.06);
+$group-title-color: $color-black;
+$group-title-font-size: $font-size-base;
+$group-title-width: 66px;
+
+/* Tab
+-------------------------- */
+$tab-font-size: $font-size-base;
+$tab-border-line: 1px solid #e4e4e4;
+$tab-header-color-active: var(--color-text-light);
+$tab-header-color-hover: var(--color-text-dark);
+$tab-header-color: var(--color-text-dark);
+$tab-header-fill-active: rgba($color-black, 0.06);
+$tab-header-fill-hover: rgba($color-black, 0.06);
+$tab-vertical-header-width: 90px;
+$tab-vertical-header-count-color: $color-white;
+$tab-vertical-header-count-fill: var(--color-text-light);
+
+/* Button
+-------------------------- */
+$button-font-size: var(--button-font-size, var(--font-size-s));
+
+$button-padding-vertical: var(--button-padding-vertical, var(--spacing-xs));
+$button-padding-horizontal: var(--button-padding-horizontal, var(--spacing-m));
+
+$button-border-radius: var(--button-border-radius, 4px);
+
+$button-border-color: var(--button-border-color, var(--color-primary));
+
+/// fontSize||Font|1
+$button-medium-font-size: $font-size-base;
+/// borderRadius||Border|2
+$button-medium-border-radius: var(--border-radius-base);
+/// padding||Spacing|3
+$button-medium-padding-vertical: 10px;
+/// padding||Spacing|3
+$button-medium-padding-horizontal: 20px;
+
+/// fontSize||Font|1
+$button-small-font-size: 12px;
+$button-small-border-radius: #{var(--border-radius-base) - 1};
+/// padding||Spacing|3
+$button-small-padding-vertical: 9px;
+/// padding||Spacing|3
+$button-small-padding-horizontal: 15px;
+/// fontSize||Font|1
+$button-mini-font-size: 12px;
+$button-mini-border-radius: #{var(--border-radius-base) - 1};
+/// padding||Spacing|3
+$button-mini-padding-vertical: 7px;
+/// padding||Spacing|3
+$button-mini-padding-horizontal: 15px;
+
+$button-font-color: var(--button-color, var(--color-text-xlight));
+$button-background-color: var(--button-background-color, var(--color-primary));
+$button-active-color: var(--button-active-color, var(--color-text-xlight));
+$button-active-border-color: var(
+ --button-active-border-color,
+ var(--color-primary-shade-1)
+);
+$button-active-background-color: var(
+ --button-active-background-color,
+ var(--color-primary-shade-1)
+);
+
+/// color||Color|0
+$button-default-font-color: var(--color-text-dark);
+/// color||Color|0
+$button-default-background-color: $color-white;
+/// color||Color|0
+$button-default-border-color: var(--border-color-base);
+
+/// color||Color|0
+$button-disabled-font-color: var(--color-text-light);
+/// color||Color|0
+$button-disabled-background-color: var(
+ --button-disabled-background-color,
+ var(--color-foreground-base)
+);
+/// color||Color|0
+$button-disabled-border-color: var(--border-color-base);
+
+/// color||Color|0
+$button-primary-border-color: var(--color-primary);
+/// color||Color|0
+$button-primary-font-color: $color-white;
+/// color||Color|0
+$button-primary-background-color: var(--color-primary);
+/// color||Color|0
+$button-success-border-color: var(--color-success);
+/// color||Color|0
+$button-success-font-color: $color-white;
+/// color||Color|0
+$button-success-background-color: var(--color-success);
+/// color||Color|0
+$button-warning-border-color: var(--color-warning);
+/// color||Color|0
+$button-warning-font-color: $color-white;
+/// color||Color|0
+$button-warning-background-color: var(--color-warning);
+/// color||Color|0
+$button-danger-border-color: var(--color-danger);
+/// color||Color|0
+$button-danger-font-color: $color-white;
+/// color||Color|0
+$button-danger-background-color: var(--color-danger);
+/// color||Color|0
+$button-info-border-color: var(--color-info);
+/// color||Color|0
+$button-info-font-color: $color-white;
+/// color||Color|0
+$button-info-background-color: var(--color-info);
+
+$button-hover-tint-percent: 10%;
+$button-light-tint-percent: 30%;
+$button-active-shade-percent: 10%;
+
+/* cascader
+-------------------------- */
+$cascader-height: 200px;
+
+/* Switch
+-------------------------- */
+/// color||Color|0
+$switch-on-color: var(--color-primary);
+/// color||Color|0
+$switch-off-color: var(--color-text-light);
+/// fontSize||Font|1
+$switch-font-size: $font-size-base;
+$switch-core-border-radius: 10px;
+// height||Other|4 TODO: width 代码写死的40px 所以下面这三个属性都没意义
+$switch-width: 40px;
+// height||Other|4
+$switch-height: 20px;
+// height||Other|4
+$switch-button-size: 16px;
+
+/* Dialog
+-------------------------- */
+$dialog-background-color: $color-white;
+$dialog-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+/// fontSize||Font|1
+$dialog-title-font-size: $font-size-large;
+/// fontSize||Font|1
+$dialog-content-font-size: 14px;
+/// fontLineHeight||LineHeight|2
+$dialog-font-line-height: $font-line-height-primary;
+/// padding||Spacing|3
+$dialog-padding-primary: 20px;
+
+/* Table
+-------------------------- */
+/// color||Color|0
+$table-border-color: var(--border-color-light);
+$table-border: 1px solid $table-border-color;
+/// color||Color|0
+$table-font-color: var(--color-text-dark);
+/// color||Color|0
+$table-header-font-color: var(--color-text-light);
+/// color||Color|0
+$table-row-hover-background-color: $background-color-base;
+$table-current-row-background-color: $color-primary-light-9;
+/// color||Color|0
+$table-header-background-color: $color-white;
+$table-fixed-box-shadow: 0 0 10px rgba(0, 0, 0, 0.12);
+
+/* Pagination
+-------------------------- */
+/// fontSize||Font|1
+$pagination-font-size: 13px;
+/// color||Color|0
+$pagination-background-color: $color-white;
+/// color||Color|0
+$pagination-font-color: var(--color-text-dark);
+$pagination-border-radius: 3px;
+/// color||Color|0
+$pagination-button-color: var(--color-text-dark);
+/// height||Other|4
+$pagination-button-width: 35.5px;
+/// height||Other|4
+$pagination-button-height: 28px;
+/// color||Color|0
+$pagination-button-disabled-color: var(--color-text-lighter);
+/// color||Color|0
+$pagination-button-disabled-background-color: $color-white;
+/// color||Color|0
+$pagination-hover-color: var(--color-primary);
+
+/* Popup
+-------------------------- */
+/// color||Color|0
+$popup-modal-background-color: $color-black;
+/// opacity||Other|1
+$popup-modal-opacity: 0.5;
+
+/* Popover
+-------------------------- */
+/// color||Color|0
+$popover-background-color: $color-white;
+/// fontSize||Font|1
+$popover-font-size: $font-size-base;
+/// color||Color|0
+$popover-border-color: var(--border-color-light);
+$popover-arrow-size: 6px;
+/// padding||Spacing|3
+$popover-padding: 12px;
+$popover-padding-large: 18px 20px;
+/// fontSize||Font|1
+$popover-title-font-size: 16px;
+/// color||Color|0
+$popover-title-font-color: var(--color-text-dark);
+
+/* Tooltip
+-------------------------- */
+/// color|1|Color|0
+$tooltip-fill: var(--color-text-dark);
+/// color|1|Color|0
+$tooltip-color: $color-white;
+/// fontSize||Font|1
+$tooltip-font-size: 12px;
+/// color||Color|0
+$tooltip-border-color: var(--color-text-dark);
+$tooltip-arrow-size: 6px;
+/// padding||Spacing|3
+$tooltip-padding: 10px;
+
+/* Tag
+-------------------------- */
+/// color||Color|0
+$tag-info-color: var(--color-info);
+/// color||Color|0
+$tag-primary-color: var(--color-primary);
+/// color||Color|0
+$tag-success-color: var(--color-success);
+/// color||Color|0
+$tag-warning-color: var(--color-warning);
+/// color||Color|0
+$tag-danger-color: var(--color-danger);
+/// fontSize||Font|1
+$tag-font-size: 12px;
+$tag-border-radius: 4px;
+$tag-padding: 0 10px;
+
+/* Tree
+-------------------------- */
+/// color||Color|0
+$tree-node-hover-background-color: $background-color-base;
+/// color||Color|0
+$tree-font-color: var(--color-text-dark);
+/// color||Color|0
+$tree-expand-icon-color: var(--color-text-lighter);
+
+/* Dropdown
+-------------------------- */
+$dropdown-menu-box-shadow: $box-shadow-light;
+$dropdown-menuItem-hover-fill: $color-primary-light-9;
+$dropdown-menuItem-hover-color: $link-color;
+
+/* Badge
+-------------------------- */
+/// color||Color|0
+$badge-background-color: var(--color-danger);
+$badge-radius: 10px;
+/// fontSize||Font|1
+$badge-font-size: 12px;
+/// padding||Spacing|3
+$badge-padding: 6px;
+/// height||Other|4
+$badge-size: 18px;
+
+/* Card
+--------------------------*/
+/// color||Color|0
+$card-border-color: var(--border-color-light);
+$card-border-radius: 4px;
+/// padding||Spacing|3
+$card-padding: 20px;
+
+/* Slider
+--------------------------*/
+/// color||Color|0
+$slider-main-background-color: var(--color-primary);
+/// color||Color|0
+$slider-runway-background-color: var(--border-color-base);
+$slider-button-hover-color: function.saturation(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ 8%
+);
+$slider-stop-background-color: $color-white;
+$slider-disable-color: var(--color-text-lighter);
+$slider-margin: 16px 0;
+$slider-border-radius: 3px;
+/// height|1|Other|4
+$slider-height: 6px;
+/// height||Other|4
+$slider-button-size: 16px;
+$slider-button-wrapper-size: 36px;
+$slider-button-wrapper-offset: -15px;
+
+/* Steps
+--------------------------*/
+$steps-border-color: $disabled-border-base;
+$steps-border-radius: 4px;
+$steps-padding: 20px;
+
+/* Menu
+--------------------------*/
+/// fontSize||Font|1
+$menu-item-font-size: $font-size-base;
+/// color||Color|0
+$menu-item-font-color: var(--color-text-dark);
+/// color||Color|0
+$menu-background-color: $color-white;
+$menu-item-hover-fill: $color-primary-light-9;
+
+/* Rate
+--------------------------*/
+$rate-height: 20px;
+/// fontSize||Font|1
+$rate-font-size: $font-size-base;
+/// height||Other|3
+$rate-icon-size: 18px;
+/// margin||Spacing|2
+$rate-icon-margin: 6px;
+$rate-icon-color: var(--color-text-lighter);
+
+/* DatePicker
+--------------------------*/
+$datepicker-font-color: var(--color-text-dark);
+/// color|1|Color|0
+$datepicker-off-font-color: var(--color-text-lighter);
+/// color||Color|0
+$datepicker-header-font-color: var(--color-text-dark);
+$datepicker-icon-color: var(--color-text-dark);
+$datepicker-border-color: $disabled-border-base;
+$datepicker-inner-border-color: #e4e4e4;
+/// color||Color|0
+$datepicker-inrange-background-color: var(--border-color-light);
+/// color||Color|0
+$datepicker-inrange-hover-background-color: var(--border-color-light);
+/// color||Color|0
+$datepicker-active-color: var(--color-primary);
+/// color||Color|0
+$datepicker-hover-font-color: var(--color-primary);
+$datepicker-cell-hover-color: #fff;
+
+/* Loading
+--------------------------*/
+/// height||Other|4
+$loading-spinner-size: 42px;
+/// height||Other|4
+$loading-fullscreen-spinner-size: 50px;
+
+/* Scrollbar
+--------------------------*/
+$scrollbar-background-color: hsla(
+ var(#{--color-text-light-h}),
+ var(#{--color-text-light-s}),
+ var(#{--color-text-light-l}),
+ 0.3
+);
+$scrollbar-hover-background-color: hsla(
+ var(#{--color-text-light-h}),
+ var(#{--color-text-light-s}),
+ var(#{--color-text-light-l}),
+ 0.5
+);
+
+/* Carousel
+--------------------------*/
+/// fontSize||Font|1
+$carousel-arrow-font-size: 12px;
+$carousel-arrow-size: 36px;
+$carousel-arrow-background: rgba(31, 45, 61, 0.11);
+$carousel-arrow-hover-background: rgba(31, 45, 61, 0.23);
+/// width||Other|4
+$carousel-indicator-width: 30px;
+/// height||Other|4
+$carousel-indicator-height: 2px;
+$carousel-indicator-padding-horizontal: 4px;
+$carousel-indicator-padding-vertical: 12px;
+$carousel-indicator-out-color: $border-color-hover;
+
+/* Collapse
+--------------------------*/
+/// color||Color|0
+$collapse-border-color: var(--border-color-light);
+/// height||Other|4
+$collapse-header-height: 48px;
+/// color||Color|0
+$collapse-header-background-color: $color-white;
+/// color||Color|0
+$collapse-header-font-color: var(--color-text-dark);
+/// fontSize||Font|1
+$collapse-header-font-size: 13px;
+/// color||Color|0
+$collapse-content-background-color: $color-white;
+/// fontSize||Font|1
+$collapse-content-font-size: 13px;
+/// color||Color|0
+$collapse-content-font-color: var(--color-text-dark);
+
+/* Transfer
+--------------------------*/
+$transfer-border-color: var(--border-color-light);
+$transfer-border-radius: var(--border-radius-base);
+/// height||Other|4
+$transfer-panel-width: 200px;
+/// height||Other|4
+$transfer-panel-header-height: 40px;
+/// color||Color|0
+$transfer-panel-header-background-color: $background-color-base;
+/// height||Other|4
+$transfer-panel-footer-height: 40px;
+/// height||Other|4
+$transfer-panel-body-height: 246px;
+/// height||Other|4
+$transfer-item-height: 30px;
+/// height||Other|4
+$transfer-filter-height: 32px;
+
+/* Header
+ --------------------------*/
+$header-padding: 0 20px;
+
+/* Footer
+--------------------------*/
+$footer-padding: 0 20px;
+
+/* Main
+--------------------------*/
+$main-padding: 20px;
+
+/* Timeline
+--------------------------*/
+$timeline-node-size-normal: 12px;
+$timeline-node-size-large: 14px;
+$timeline-node-color: var(--border-color-base);
+
+/* Backtop
+--------------------------*/
+/// color||Color|0
+$backtop-background-color: $color-white;
+/// color||Color|0
+$backtop-font-color: var(--color-primary);
+/// color||Color|0
+$backtop-hover-background-color: var(--border-color-light);
+
+/* Link
+--------------------------*/
+/// fontSize||Font|1
+$link-font-size: $font-size-base;
+/// fontWeight||Font|1
+$link-font-weight: $font-weight-primary;
+/// color||Color|0
+$link-default-font-color: var(--color-text-dark);
+/// color||Color|0
+$link-default-active-color: var(--color-primary);
+/// color||Color|0
+$link-disabled-font-color: var(--color-text-lighter);
+/// color||Color|0
+$link-primary-font-color: var(--color-primary);
+/// color||Color|0
+$link-success-font-color: var(--color-success);
+/// color||Color|0
+$link-warning-font-color: var(--color-warning);
+/// color||Color|0
+$link-danger-font-color: var(--color-danger);
+/// color||Color|0
+$link-info-font-color: var(--color-info);
+/* Calendar
+--------------------------*/
+/// border||Other|4
+$calendar-border: $table-border;
+/// color||Other|4
+$calendar-selected-background-color: #f2f8fe;
+$calendar-cell-width: 85px;
+
+/* Form
+-------------------------- */
+/// fontSize||Font|1
+$form-label-font-size: $font-size-base;
+
+/* Avatar
+--------------------------*/
+/// color||Color|0
+$avatar-font-color: #fff;
+/// color||Color|0
+$avatar-background-color: #c0c4cc;
+/// fontSize||Font Size|1
+$avatar-text-font-size: 14px;
+/// fontSize||Font Size|1
+$avatar-icon-font-size: 18px;
+/// borderRadius||Border|2
+$avatar-border-radius: var(--border-radius-base);
+/// size|1|Avatar Size|3
+$avatar-large-size: 40px;
+/// size|1|Avatar Size|3
+$avatar-medium-size: 36px;
+/// size|1|Avatar Size|3
+$avatar-small-size: 28px;
+
+/* Break-point
+--------------------------*/
+$sm: 768px;
+$md: 992px;
+$lg: 1200px;
+$xl: 1920px;
+
+$breakpoints: (
+ 'xs': (
+ max-width: $sm - 1,
+ ),
+ 'sm': (
+ min-width: $sm,
+ ),
+ 'md': (
+ min-width: $md,
+ ),
+ 'lg': (
+ min-width: $lg,
+ ),
+ 'xl': (
+ min-width: $xl,
+ ),
+);
+
+$breakpoints-spec: (
+ 'xs-only': (
+ max-width: $sm - 1,
+ ),
+ 'sm-and-up': (
+ min-width: $sm,
+ ),
+ 'sm-only': (
+ min-width: #{$sm},
+ )
+ and
+ (
+ max-width: #{$md - 1},
+ ),
+ 'sm-and-down': (
+ max-width: $md - 1,
+ ),
+ 'md-and-up': (
+ min-width: $md,
+ ),
+ 'md-only': (
+ min-width: #{$md},
+ )
+ and
+ (
+ max-width: #{$lg - 1},
+ ),
+ 'md-and-down': (
+ max-width: $lg - 1,
+ ),
+ 'lg-and-up': (
+ min-width: $lg,
+ ),
+ 'lg-only': (
+ min-width: #{$lg},
+ )
+ and
+ (
+ max-width: #{$xl - 1},
+ ),
+ 'lg-and-down': (
+ max-width: $xl - 1,
+ ),
+ 'xl-only': (
+ min-width: $xl,
+ ),
+);
diff --git a/packages/design-system/theme/src/container.scss b/packages/design-system/theme/src/container.scss
new file mode 100644
index 0000000000..0565ec8412
--- /dev/null
+++ b/packages/design-system/theme/src/container.scss
@@ -0,0 +1,14 @@
+@use "mixins/mixins";
+
+@include mixins.b(container) {
+ display: flex;
+ flex-direction: row;
+ flex: 1;
+ flex-basis: auto;
+ box-sizing: border-box;
+ min-width: 0;
+
+ @include mixins.when(vertical) {
+ flex-direction: column;
+ }
+}
diff --git a/packages/design-system/theme/src/date-picker.scss b/packages/design-system/theme/src/date-picker.scss
new file mode 100644
index 0000000000..6060427914
--- /dev/null
+++ b/packages/design-system/theme/src/date-picker.scss
@@ -0,0 +1,12 @@
+@use "./date-picker/date-table.scss";
+@use "./date-picker/month-table.scss";
+@use "./date-picker/year-table.scss";
+@use "./date-picker/time-spinner.scss";
+@use "./date-picker/picker.scss";
+@use "./date-picker/date-picker.scss";
+@use "./date-picker/date-range-picker.scss";
+@use "./date-picker/time-range-picker.scss";
+@use "./date-picker/time-picker.scss";
+@use "./input.scss";
+@use "./scrollbar.scss";
+@use "./popper";
diff --git a/packages/design-system/theme/src/date-picker/date-picker.scss b/packages/design-system/theme/src/date-picker/date-picker.scss
new file mode 100644
index 0000000000..361758c91b
--- /dev/null
+++ b/packages/design-system/theme/src/date-picker/date-picker.scss
@@ -0,0 +1,97 @@
+@use "../common/var";
+@use "../mixins/mixins";
+@use "./picker-panel.scss";
+
+@include mixins.b(date-picker) {
+ width: 322px;
+
+ &.has-sidebar.has-time {
+ width: 434px;
+ }
+
+ &.has-sidebar {
+ width: 438px;
+ }
+
+ &.has-time .el-picker-panel__body-wrapper {
+ position: relative;
+ }
+
+ .el-picker-panel__content {
+ width: 292px;
+ }
+
+ table {
+ table-layout: fixed;
+ width: 100%;
+ }
+
+ @include mixins.e(editor-wrap) {
+ position: relative;
+ display: table-cell;
+ padding: 0 5px;
+ }
+
+ @include mixins.e(time-header) {
+ position: relative;
+ border-bottom: 1px solid var.$datepicker-inner-border-color;
+ font-size: 12px;
+ padding: 8px 5px 5px 5px;
+ display: table;
+ width: 100%;
+ box-sizing: border-box;
+ }
+
+ @include mixins.e(header) {
+ margin: 12px;
+ text-align: center;
+
+ @include mixins.m(bordered) {
+ margin-bottom: 0;
+ padding-bottom: 12px;
+ border-bottom: solid 1px var(--border-color-light);
+
+ & + .el-picker-panel__content {
+ margin-top: 0;
+ }
+ }
+ }
+
+ @include mixins.e(header-label) {
+ font-size: 16px;
+ font-weight: 500;
+ padding: 0 5px;
+ line-height: 22px;
+ text-align: center;
+ cursor: pointer;
+ color: var(--color-text-dark);
+
+ &:hover {
+ color: var.$datepicker-hover-font-color;
+ }
+
+ &.active {
+ color: var.$datepicker-active-color;
+ }
+ }
+
+ @include mixins.e(prev-btn) {
+ float: left;
+ }
+
+ @include mixins.e(next-btn) {
+ float: right;
+ }
+
+ @include mixins.e(time-wrap) {
+ padding: 10px;
+ text-align: center;
+ }
+
+ @include mixins.e(time-label) {
+ float: left;
+ cursor: pointer;
+ line-height: 30px;
+ margin-left: 10px;
+ }
+}
diff --git a/packages/design-system/theme/src/date-picker/date-range-picker.scss b/packages/design-system/theme/src/date-picker/date-range-picker.scss
new file mode 100644
index 0000000000..fc6746b782
--- /dev/null
+++ b/packages/design-system/theme/src/date-picker/date-range-picker.scss
@@ -0,0 +1,101 @@
+@use "../common/var";
+@use "../mixins/mixins";
+
+@include mixins.b(date-range-picker) {
+ width: 646px;
+
+ &.has-sidebar {
+ width: 756px;
+ }
+
+ table {
+ table-layout: fixed;
+ width: 100%;
+ }
+
+ .el-picker-panel__body {
+ min-width: 513px;
+ }
+
+ .el-picker-panel__content {
+ margin: 0;
+ }
+
+ @include mixins.e(header) {
+ position: relative;
+ text-align: center;
+ height: 28px;
+
+ [class*='arrow-left'] {
+ float: left;
+ }
+
+ [class*='arrow-right'] {
+ float: right;
+ }
+
+ div {
+ font-size: 16px;
+ font-weight: 500;
+ margin-right: 50px;
+ }
+ }
+
+ @include mixins.e(content) {
+ float: left;
+ width: 50%;
+ box-sizing: border-box;
+ margin: 0;
+ padding: 16px;
+
+ @include mixins.when(left) {
+ border-right: 1px solid var.$datepicker-inner-border-color;
+ }
+ .el-date-range-picker__header {
+ div {
+ margin-left: 50px;
+ margin-right: 50px;
+ }
+ }
+ }
+
+ @include mixins.e(editors-wrap) {
+ box-sizing: border-box;
+ display: table-cell;
+
+ @include mixins.when(right) {
+ text-align: right;
+ }
+ }
+
+ @include mixins.e(time-header) {
+ position: relative;
+ border-bottom: 1px solid var.$datepicker-inner-border-color;
+ font-size: 12px;
+ padding: 8px 5px 5px 5px;
+ display: table;
+ width: 100%;
+ box-sizing: border-box;
+
+ > .el-icon-arrow-right {
+ font-size: 20px;
+ vertical-align: middle;
+ display: table-cell;
+ color: var.$datepicker-icon-color;
+ }
+ }
+
+ @include mixins.e(time-picker-wrap) {
+ position: relative;
+ display: table-cell;
+ padding: 0 5px;
+
+ .el-picker-panel {
+ position: absolute;
+ top: 13px;
+ right: 0;
+ z-index: 1;
+ background: var.$color-white;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/date-picker/date-table.scss b/packages/design-system/theme/src/date-picker/date-table.scss
new file mode 100644
index 0000000000..5e0dc82928
--- /dev/null
+++ b/packages/design-system/theme/src/date-picker/date-table.scss
@@ -0,0 +1,151 @@
+@use "../common/var";
+@use "../mixins/mixins";
+
+@include mixins.b(date-table) {
+ font-size: 12px;
+ user-select: none;
+
+ @include mixins.when(week-mode) {
+ .el-date-table__row {
+ &:hover {
+ div {
+ background-color: var.$datepicker-inrange-background-color;
+ }
+ td.available:hover {
+ color: var.$datepicker-font-color;
+ }
+ td:first-child div {
+ margin-left: 5px;
+ border-top-left-radius: 15px;
+ border-bottom-left-radius: 15px;
+ }
+ td:last-child div {
+ margin-right: 5px;
+ border-top-right-radius: 15px;
+ border-bottom-right-radius: 15px;
+ }
+ }
+
+ &.current div {
+ background-color: var.$datepicker-inrange-background-color;
+ }
+ }
+ }
+
+ td {
+ width: 32px;
+ height: 30px;
+ padding: 4px 0;
+ box-sizing: border-box;
+ text-align: center;
+ cursor: pointer;
+ position: relative;
+
+ & div {
+ height: 30px;
+ padding: 3px 0;
+ box-sizing: border-box;
+ }
+
+ & span {
+ width: 24px;
+ height: 24px;
+ display: block;
+ margin: 0 auto;
+ line-height: 24px;
+ position: absolute;
+ left: 50%;
+ transform: translateX(-50%);
+ border-radius: 50%;
+ }
+
+ &.next-month,
+ &.prev-month {
+ color: var.$datepicker-off-font-color;
+ }
+
+ &.today {
+ position: relative;
+ span {
+ color: var(--color-primary);
+ font-weight: bold;
+ }
+ &.start-date span,
+ &.end-date span {
+ color: var.$color-white;
+ }
+ }
+
+ &.available:hover {
+ color: var.$datepicker-hover-font-color;
+ }
+
+ &.in-range div {
+ background-color: var.$datepicker-inrange-background-color;
+ &:hover {
+ background-color: var.$datepicker-inrange-hover-background-color;
+ }
+ }
+
+ &.current:not(.disabled) span {
+ color: var.$color-white;
+ background-color: var.$datepicker-active-color;
+ }
+ &.start-date div,
+ &.end-date div {
+ color: var.$color-white;
+ }
+
+ &.start-date span,
+ &.end-date span {
+ background-color: var.$datepicker-active-color;
+ }
+
+ &.start-date div {
+ margin-left: 5px;
+ border-top-left-radius: 15px;
+ border-bottom-left-radius: 15px;
+ }
+
+ &.end-date div {
+ margin-right: 5px;
+ border-top-right-radius: 15px;
+ border-bottom-right-radius: 15px;
+ }
+
+ &.disabled div {
+ background-color: var.$background-color-base;
+ opacity: 1;
+ cursor: not-allowed;
+ color: var(--color-text-lighter);
+ }
+
+ &.selected div {
+ margin-left: 5px;
+ margin-right: 5px;
+ background-color: var.$datepicker-inrange-background-color;
+ border-radius: 15px;
+ &:hover {
+ background-color: var.$datepicker-inrange-hover-background-color;
+ }
+ }
+
+ &.selected span {
+ background-color: var.$datepicker-active-color;
+ color: var.$color-white;
+ border-radius: 15px;
+ }
+
+ &.week {
+ font-size: 80%;
+ color: var.$datepicker-header-font-color;
+ }
+ }
+
+ th {
+ padding: 5px;
+ color: var.$datepicker-header-font-color;
+ font-weight: 400;
+ border-bottom: solid 1px var(--border-color-light);
+ }
+}
diff --git a/packages/design-system/theme/src/date-picker/month-table.scss b/packages/design-system/theme/src/date-picker/month-table.scss
new file mode 100644
index 0000000000..fba6f41a03
--- /dev/null
+++ b/packages/design-system/theme/src/date-picker/month-table.scss
@@ -0,0 +1,83 @@
+@use "../common/var";
+@use "../mixins/mixins";
+
+@include mixins.b(month-table) {
+ font-size: 12px;
+ margin: -1px;
+ border-collapse: collapse;
+
+ td {
+ text-align: center;
+ padding: 8px 0px;
+ cursor: pointer;
+ & div {
+ height: 48px;
+ padding: 6px 0;
+ box-sizing: border-box;
+ }
+ &.today {
+ .cell {
+ color: var(--color-primary);
+ font-weight: bold;
+ }
+ &.start-date .cell,
+ &.end-date .cell {
+ color: var.$color-white;
+ }
+ }
+
+ &.disabled .cell {
+ background-color: var.$background-color-base;
+ cursor: not-allowed;
+ color: var(--color-text-lighter);
+
+ &:hover {
+ color: var(--color-text-lighter);
+ }
+ }
+
+ .cell {
+ width: 60px;
+ height: 36px;
+ display: block;
+ line-height: 36px;
+ color: var.$datepicker-font-color;
+ margin: 0 auto;
+ border-radius: 18px;
+ &:hover {
+ color: var.$datepicker-hover-font-color;
+ }
+ }
+
+ &.in-range div {
+ background-color: var.$datepicker-inrange-background-color;
+ &:hover {
+ background-color: var.$datepicker-inrange-hover-background-color;
+ }
+ }
+ &.start-date div,
+ &.end-date div {
+ color: var.$color-white;
+ }
+
+ &.start-date .cell,
+ &.end-date .cell {
+ color: var.$color-white;
+ background-color: var.$datepicker-active-color;
+ }
+
+ &.start-date div {
+ border-top-left-radius: 24px;
+ border-bottom-left-radius: 24px;
+ }
+
+ &.end-date div {
+ border-top-right-radius: 24px;
+ border-bottom-right-radius: 24px;
+ }
+
+ &.current:not(.disabled) .cell {
+ color: var.$datepicker-active-color;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/date-picker/picker-panel.scss b/packages/design-system/theme/src/date-picker/picker-panel.scss
new file mode 100644
index 0000000000..fbf001a78a
--- /dev/null
+++ b/packages/design-system/theme/src/date-picker/picker-panel.scss
@@ -0,0 +1,128 @@
+@use "../common/var";
+@use "../mixins/mixins";
+@use "../mixins/button";
+
+@include mixins.b(picker-panel) {
+ color: var(--color-text-dark);
+ border: 1px solid var.$datepicker-border-color;
+ box-shadow: var.$box-shadow-light;
+ background: var.$color-white;
+ border-radius: var(--border-radius-base);
+ line-height: 30px;
+ margin: 5px 0;
+
+ @include mixins.e((body, body-wrapper)) {
+ &::after {
+ content: '';
+ display: table;
+ clear: both;
+ }
+ }
+
+ @include mixins.e(content) {
+ position: relative;
+ margin: 15px;
+ }
+
+ @include mixins.e(footer) {
+ border-top: 1px solid var.$datepicker-inner-border-color;
+ padding: 4px;
+ text-align: right;
+ background-color: var.$color-white;
+ position: relative;
+ font-size: 0;
+ }
+
+ @include mixins.e(shortcut) {
+ display: block;
+ width: 100%;
+ border: 0;
+ background-color: transparent;
+ line-height: 28px;
+ font-size: 14px;
+ color: var.$datepicker-font-color;
+ padding-left: 12px;
+ text-align: left;
+ outline: none;
+ cursor: pointer;
+
+ &:hover {
+ color: var.$datepicker-hover-font-color;
+ }
+
+ &.active {
+ background-color: #e6f1fe;
+ color: var.$datepicker-active-color;
+ }
+ }
+
+ @include mixins.e(btn) {
+ border: 1px solid #dcdcdc;
+ color: #333;
+ line-height: 24px;
+ border-radius: 2px;
+ padding: 0 20px;
+ cursor: pointer;
+ background-color: transparent;
+ outline: none;
+ font-size: 12px;
+
+ &[disabled] {
+ color: #cccccc;
+ cursor: not-allowed;
+ }
+ }
+
+ @include mixins.e(icon-btn) {
+ font-size: 12px;
+ color: var.$datepicker-icon-color;
+ border: 0;
+ background: transparent;
+ cursor: pointer;
+ outline: none;
+ margin-top: 8px;
+
+ &:hover {
+ color: var.$datepicker-hover-font-color;
+ }
+
+ @include mixins.when(disabled) {
+ color: var.$font-color-disabled-base;
+
+ &:hover {
+ cursor: not-allowed;
+ }
+ }
+ }
+
+ @include mixins.e(link-btn) {
+ @include button.button-outline();
+ @include button.button-small();
+ @include button.button-round();
+
+ vertical-align: middle;
+ margin-left: var(--spacing-2xs);
+
+ &.is-plain {
+ @include button.button-just-primary();
+ }
+ }
+}
+
+.el-picker-panel *[slot='sidebar'],
+.el-picker-panel__sidebar {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 110px;
+ border-right: 1px solid var.$datepicker-inner-border-color;
+ box-sizing: border-box;
+ padding-top: 6px;
+ background-color: var.$color-white;
+ overflow: auto;
+}
+
+.el-picker-panel *[slot='sidebar'] + .el-picker-panel__body,
+.el-picker-panel__sidebar + .el-picker-panel__body {
+ margin-left: 110px;
+}
diff --git a/packages/design-system/theme/src/date-picker/picker.scss b/packages/design-system/theme/src/date-picker/picker.scss
new file mode 100644
index 0000000000..28613ff103
--- /dev/null
+++ b/packages/design-system/theme/src/date-picker/picker.scss
@@ -0,0 +1,198 @@
+@use "../mixins/mixins";
+@use "../common/var";
+@use "../common/transition";
+
+@include mixins.b(date-editor) {
+ position: relative;
+ display: inline-block;
+ text-align: left;
+
+ &.el-input,
+ &.el-input__inner {
+ width: 100%;
+ }
+
+ @include mixins.m((monthrange)) {
+ &.el-input,
+ &.el-input__inner {
+ width: 300px;
+ }
+ }
+
+ @include mixins.m((daterange, timerange)) {
+ &.el-input,
+ &.el-input__inner {
+ width: 350px;
+ }
+ }
+
+ @include mixins.m(datetimerange) {
+ &.el-input,
+ &.el-input__inner {
+ width: 400px;
+ }
+ }
+
+ @include mixins.m(dates) {
+ .el-input__inner {
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ }
+
+ .el-icon-circle-close {
+ cursor: pointer;
+ }
+
+ .el-range__icon {
+ font-size: 14px;
+ margin-left: -5px;
+ color: var(--color-text-lighter);
+ float: left;
+ line-height: 32px;
+ }
+
+ .el-range-input {
+ appearance: none;
+ border: none;
+ outline: none;
+ display: inline-block;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ width: 39%;
+ text-align: center;
+ font-size: var.$font-size-base;
+ color: var(--color-text-dark);
+
+ &::placeholder {
+ color: var(--color-text-lighter);
+ }
+ }
+
+ .el-range-separator {
+ display: inline-block;
+ height: 100%;
+ padding: 0 5px;
+ margin: 0;
+ text-align: center;
+ line-height: 32px;
+ font-size: 14px;
+ width: 5%;
+ color: var(--color-text-dark);
+ }
+
+ .el-range__close-icon {
+ font-size: 14px;
+ color: var(--color-text-lighter);
+ width: 25px;
+ display: inline-block;
+ float: right;
+ line-height: 32px;
+ }
+}
+
+@include mixins.b(range-editor) {
+ &.el-input__inner {
+ display: inline-flex;
+ align-items: center;
+ padding: 3px 10px;
+ }
+
+ .el-range-input {
+ line-height: 1;
+ }
+
+ @include mixins.when(active) {
+ border-color: var(--color-primary);
+
+ &:hover {
+ border-color: var(--color-primary);
+ }
+ }
+
+ @include mixins.m(medium) {
+ &.el-input__inner {
+ height: var.$input-medium-height;
+ }
+
+ .el-range-separator {
+ line-height: 28px;
+ font-size: var.$input-medium-font-size;
+ }
+
+ .el-range-input {
+ font-size: var.$input-medium-font-size;
+ }
+
+ .el-range__icon,
+ .el-range__close-icon {
+ line-height: 28px;
+ }
+ }
+
+ @include mixins.m(small) {
+ &.el-input__inner {
+ height: var.$input-small-height;
+ }
+
+ .el-range-separator {
+ line-height: 24px;
+ font-size: var.$input-small-font-size;
+ }
+
+ .el-range-input {
+ font-size: var.$input-small-font-size;
+ }
+
+ .el-range__icon,
+ .el-range__close-icon {
+ line-height: 24px;
+ }
+ }
+
+ @include mixins.m(mini) {
+ &.el-input__inner {
+ height: var.$input-mini-height;
+ }
+
+ .el-range-separator {
+ line-height: 20px;
+ font-size: var.$input-mini-font-size;
+ }
+
+ .el-range-input {
+ font-size: var.$input-mini-font-size;
+ }
+
+ .el-range__icon,
+ .el-range__close-icon {
+ line-height: 20px;
+ }
+ }
+
+ @include mixins.when(disabled) {
+ background-color: var.$input-disabled-fill;
+ border-color: var.$input-disabled-border;
+ color: var.$input-disabled-color;
+ cursor: not-allowed;
+
+ &:hover,
+ &:focus {
+ border-color: var.$input-disabled-border;
+ }
+
+ input {
+ background-color: var.$input-disabled-fill;
+ color: var.$input-disabled-color;
+ cursor: not-allowed;
+ &::placeholder {
+ color: var.$input-disabled-placeholder-color;
+ }
+ }
+
+ .el-range-separator {
+ color: var.$input-disabled-color;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/date-picker/time-picker.scss b/packages/design-system/theme/src/date-picker/time-picker.scss
new file mode 100644
index 0000000000..5588de5e8b
--- /dev/null
+++ b/packages/design-system/theme/src/date-picker/time-picker.scss
@@ -0,0 +1,87 @@
+@use "../common/var";
+@use "../mixins/mixins";
+
+@include mixins.b(time-panel) {
+ margin: 5px 0;
+ border: solid 1px var.$datepicker-border-color;
+ background-color: var.$color-white;
+ box-shadow: var.$box-shadow-light;
+ border-radius: 2px;
+ position: absolute;
+ width: 180px;
+ left: 0;
+ z-index: var.$index-top;
+ user-select: none;
+ box-sizing: content-box;
+
+ @include mixins.e(content) {
+ font-size: 0;
+ position: relative;
+ overflow: hidden;
+
+ &::after,
+ &::before {
+ content: '';
+ top: 50%;
+ position: absolute;
+ margin-top: -15px;
+ height: 32px;
+ z-index: -1;
+ left: 0;
+ right: 0;
+ box-sizing: border-box;
+ padding-top: 6px;
+ text-align: left;
+ border-top: 1px solid var(--border-color-base);
+ border-bottom: 1px solid var(--border-color-base);
+ }
+
+ &::after {
+ left: 50%;
+ margin-left: 12%;
+ margin-right: 12%;
+ }
+
+ &::before {
+ padding-left: 50%;
+ margin-right: 12%;
+ margin-left: 12%;
+ }
+
+ &.has-seconds {
+ &::after {
+ left: calc(100% / 3 * 2);
+ }
+
+ &::before {
+ padding-left: calc(100% / 3);
+ }
+ }
+ }
+
+ @include mixins.e(footer) {
+ border-top: 1px solid var.$datepicker-inner-border-color;
+ padding: 4px;
+ height: 36px;
+ line-height: 25px;
+ text-align: right;
+ box-sizing: border-box;
+ }
+
+ @include mixins.e(btn) {
+ border: none;
+ line-height: 28px;
+ padding: 0 5px;
+ margin: 0 5px;
+ cursor: pointer;
+ background-color: transparent;
+ outline: none;
+ font-size: 12px;
+ color: var(--color-text-dark);
+
+ &.confirm {
+ font-weight: 800;
+ color: var.$datepicker-active-color;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/date-picker/time-range-picker.scss b/packages/design-system/theme/src/date-picker/time-range-picker.scss
new file mode 100644
index 0000000000..7f4a94a6dd
--- /dev/null
+++ b/packages/design-system/theme/src/date-picker/time-range-picker.scss
@@ -0,0 +1,32 @@
+@use "../common/var";
+@use "../mixins/mixins";
+
+@include mixins.b(time-range-picker) {
+ width: 354px;
+ overflow: visible;
+
+ @include mixins.e(content) {
+ position: relative;
+ text-align: center;
+ padding: 10px;
+ }
+
+ @include mixins.e(cell) {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 4px 7px 7px;
+ width: 50%;
+ display: inline-block;
+ }
+
+ @include mixins.e(header) {
+ margin-bottom: 5px;
+ text-align: center;
+ font-size: 14px;
+ }
+
+ @include mixins.e(body) {
+ border-radius: 2px;
+ border: 1px solid var.$datepicker-border-color;
+ }
+}
diff --git a/packages/design-system/theme/src/date-picker/time-spinner.scss b/packages/design-system/theme/src/date-picker/time-spinner.scss
new file mode 100644
index 0000000000..f08660a41a
--- /dev/null
+++ b/packages/design-system/theme/src/date-picker/time-spinner.scss
@@ -0,0 +1,110 @@
+@use "../common/var";
+@use "../mixins/mixins";
+
+@include mixins.b(time-spinner) {
+ &.has-seconds {
+ .el-time-spinner__wrapper {
+ width: 33.3%;
+ }
+ }
+
+ @include mixins.e(wrapper) {
+ max-height: 190px;
+ display: inline-block;
+ width: 50%;
+ vertical-align: top;
+ position: relative;
+
+ & .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default) {
+ padding-bottom: 15px;
+ }
+
+ @include mixins.when(arrow) {
+ box-sizing: border-box;
+ text-align: center;
+ overflow: hidden;
+
+ .el-time-spinner__list {
+ transform: translateY(-32px);
+ }
+
+ .el-time-spinner__item:hover:not(.disabled):not(.active) {
+ background: var.$color-white;
+ cursor: default;
+ }
+ }
+ }
+
+ @include mixins.e(arrow) {
+ font-size: 12px;
+ color: var(--color-text-light);
+ position: absolute;
+ left: 0;
+ width: 100%;
+ z-index: var.$index-normal;
+ text-align: center;
+ height: 30px;
+ line-height: 30px;
+ cursor: pointer;
+
+ &:hover {
+ color: var(--color-primary);
+ }
+
+ &.el-icon-arrow-up {
+ top: 10px;
+ }
+
+ &.el-icon-arrow-down {
+ bottom: 10px;
+ }
+ }
+
+ @include mixins.e(input) {
+ &.el-input {
+ width: 70%;
+
+ .el-input__inner {
+ padding: 0;
+ text-align: center;
+ }
+ }
+ }
+
+ @include mixins.e(list) {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+
+ &::after,
+ &::before {
+ content: '';
+ display: block;
+ width: 100%;
+ height: 80px;
+ }
+ }
+
+ @include mixins.e(item) {
+ height: 32px;
+ line-height: 32px;
+ font-size: 12px;
+ color: var(--color-text-dark);
+
+ &:hover:not(.disabled):not(.active) {
+ background: var.$background-color-base;
+ cursor: pointer;
+ }
+
+ &.active:not(.disabled) {
+ color: var(--color-text-dark);
+ font-weight: bold;
+ }
+
+ &.disabled {
+ color: var(--color-text-lighter);
+ cursor: not-allowed;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/date-picker/year-table.scss b/packages/design-system/theme/src/date-picker/year-table.scss
new file mode 100644
index 0000000000..ee81a75220
--- /dev/null
+++ b/packages/design-system/theme/src/date-picker/year-table.scss
@@ -0,0 +1,52 @@
+@use "../common/var";
+@use "../mixins/mixins";
+
+@include mixins.b(year-table) {
+ font-size: 12px;
+ margin: -1px;
+ border-collapse: collapse;
+
+ .el-icon {
+ color: var.$datepicker-icon-color;
+ }
+
+ td {
+ text-align: center;
+ padding: 20px 3px;
+ cursor: pointer;
+
+ &.today {
+ .cell {
+ color: var(--color-primary);
+ font-weight: bold;
+ }
+ }
+
+ &.disabled .cell {
+ background-color: var.$background-color-base;
+ cursor: not-allowed;
+ color: var(--color-text-lighter);
+
+ &:hover {
+ color: var(--color-text-lighter);
+ }
+ }
+
+ .cell {
+ width: 48px;
+ height: 32px;
+ display: block;
+ line-height: 32px;
+ color: var.$datepicker-font-color;
+ margin: 0 auto;
+
+ &:hover {
+ color: var.$datepicker-hover-font-color;
+ }
+ }
+
+ &.current:not(.disabled) .cell {
+ color: var.$datepicker-active-color;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/dialog.scss b/packages/design-system/theme/src/dialog.scss
new file mode 100644
index 0000000000..087d35b97a
--- /dev/null
+++ b/packages/design-system/theme/src/dialog.scss
@@ -0,0 +1,124 @@
+@use "mixins/mixins";
+@use "mixins/utils";
+@use "./common/var";
+@use "common/popup";
+
+@include mixins.b(dialog) {
+ position: relative;
+ margin: 0 auto 50px;
+ background: var.$dialog-background-color;
+ border-radius: var(--border-radius-small);
+ box-shadow: var.$dialog-box-shadow;
+ box-sizing: border-box;
+ width: 50%;
+
+ @include mixins.when(fullscreen) {
+ width: 100%;
+ margin-top: 0;
+ margin-bottom: 0;
+ height: 100%;
+ overflow: auto;
+ }
+
+ @include mixins.e(wrapper) {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ overflow: auto;
+ margin: 0;
+ }
+
+ @include mixins.e(header) {
+ padding: var.$dialog-padding-primary;
+ padding-bottom: 10px;
+ }
+
+ @include mixins.e(headerbtn) {
+ position: absolute;
+ top: var.$dialog-padding-primary;
+ right: var.$dialog-padding-primary;
+ padding: 0;
+ background: transparent;
+ border: none;
+ outline: none;
+ cursor: pointer;
+ font-size: var.$message-close-size;
+
+ .el-dialog__close {
+ color: var(--color-info);
+ }
+
+ &:focus,
+ &:hover {
+ .el-dialog__close {
+ color: var(--color-primary);
+ }
+ }
+ }
+
+ @include mixins.e(title) {
+ line-height: var.$dialog-font-line-height;
+ font-size: var.$dialog-title-font-size;
+ color: var(--color-text-dark);
+ }
+
+ @include mixins.e(body) {
+ padding: (var.$dialog-padding-primary + 10px) var.$dialog-padding-primary;
+ color: var(--color-text-dark);
+ font-size: var.$dialog-content-font-size;
+ word-break: break-all;
+ }
+
+ @include mixins.e(footer) {
+ padding: var.$dialog-padding-primary;
+ padding-top: 10px;
+ text-align: right;
+ box-sizing: border-box;
+ }
+
+ // 内容居中布局
+ @include mixins.m(center) {
+ text-align: center;
+
+ @include mixins.e(body) {
+ text-align: initial;
+ padding: 25px (var.$dialog-padding-primary + 5px) 30px;
+ }
+
+ @include mixins.e(footer) {
+ text-align: inherit;
+ }
+ }
+}
+
+.dialog-fade-enter-active {
+ animation: dialog-fade-in 0.3s;
+}
+
+.dialog-fade-leave-active {
+ animation: dialog-fade-out 0.3s;
+}
+
+@keyframes dialog-fade-in {
+ 0% {
+ transform: translate3d(0, -20px, 0);
+ opacity: 0;
+ }
+ 100% {
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+@keyframes dialog-fade-out {
+ 0% {
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+ 100% {
+ transform: translate3d(0, -20px, 0);
+ opacity: 0;
+ }
+}
diff --git a/packages/design-system/theme/src/display.scss b/packages/design-system/theme/src/display.scss
new file mode 100644
index 0000000000..5b983376c0
--- /dev/null
+++ b/packages/design-system/theme/src/display.scss
@@ -0,0 +1,12 @@
+@use "./common/var" as var;
+@use "mixins/mixins";
+
+.hidden {
+ @each $break-point-name, $value in var.$breakpoints-spec {
+ &-#{$break-point-name} {
+ @include mixins.res($break-point-name, var.$breakpoints-spec) {
+ display: none !important;
+ }
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/divider.scss b/packages/design-system/theme/src/divider.scss
new file mode 100644
index 0000000000..fbcb831f67
--- /dev/null
+++ b/packages/design-system/theme/src/divider.scss
@@ -0,0 +1,47 @@
+@use "./common/var";
+@use "mixins/mixins";
+
+@include mixins.b(divider) {
+ background-color: var(--border-color-base);
+ position: relative;
+
+ @include mixins.m(horizontal) {
+ display: block;
+ height: 1px;
+ width: 100%;
+ margin: 24px 0;
+ }
+
+ @include mixins.m(vertical) {
+ display: inline-block;
+ width: 1px;
+ height: 1em;
+ margin: 0 8px;
+ vertical-align: middle;
+ position: relative;
+ }
+
+ @include mixins.e(text) {
+ position: absolute;
+ background-color: var.$color-white;
+ padding: 0 20px;
+ font-weight: 500;
+ color: var(--color-text-dark);
+ font-size: 14px;
+
+ @include mixins.when(left) {
+ left: 20px;
+ transform: translateY(-50%);
+ }
+
+ @include mixins.when(center) {
+ left: 50%;
+ transform: translateX(-50%) translateY(-50%);
+ }
+
+ @include mixins.when(right) {
+ right: 20px;
+ transform: translateY(-50%);
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/drawer.scss b/packages/design-system/theme/src/drawer.scss
new file mode 100644
index 0000000000..993ab4ff2d
--- /dev/null
+++ b/packages/design-system/theme/src/drawer.scss
@@ -0,0 +1,217 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@keyframes el-drawer-fade-in {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+
+@mixin drawer-animation($direction) {
+ @keyframes #{$direction}-drawer-in {
+ 0% {
+ @if $direction == ltr {
+ transform: translate(-100%, 0px);
+ }
+
+ @if $direction == rtl {
+ transform: translate(100%, 0px);
+ }
+
+ @if $direction == ttb {
+ transform: translate(0px, -100%);
+ }
+
+ @if $direction == btt {
+ transform: translate(0px, 100%);
+ }
+ }
+
+ 100% {
+ @if $direction == ltr {
+ transform: translate(0px, 0px);
+ }
+
+ @if $direction == rtl {
+ transform: translate(0px, 0px);
+ }
+
+ @if $direction == ttb {
+ transform: translate(0px, 0px);
+ }
+
+ @if $direction == btt {
+ transform: translate(0px, 0px);
+ }
+ }
+ }
+
+ @keyframes #{$direction}-drawer-out {
+ 0% {
+ @if $direction == ltr {
+ transform: translate(0px, 0px);
+ }
+
+ @if $direction == rtl {
+ transform: translate(0px, 0px);
+ }
+
+ @if $direction == ttb {
+ transform: translate(0px, 0px);
+ }
+
+ @if $direction == btt {
+ transform: translate(0px, 0);
+ }
+ }
+
+ 100% {
+ @if $direction == ltr {
+ transform: translate(-100%, 0px);
+ }
+
+ @if $direction == rtl {
+ transform: translate(100%, 0px);
+ }
+
+ @if $direction == ttb {
+ transform: translate(0px, -100%);
+ }
+
+ @if $direction == btt {
+ transform: translate(0px, 100%);
+ }
+ }
+ }
+}
+
+@mixin animation-in($direction) {
+ .el-drawer__open &.#{$direction} {
+ animation: #{$direction}-drawer-in 0.3s 1ms;
+ }
+}
+
+@mixin animation-out($direction) {
+ &.#{$direction} {
+ animation: #{$direction}-drawer-out 0.3s;
+ }
+}
+
+@include drawer-animation(rtl);
+@include drawer-animation(ltr);
+@include drawer-animation(ttb);
+@include drawer-animation(btt);
+
+$directions: rtl, ltr, ttb, btt;
+
+@include mixins.b(drawer) {
+ position: absolute;
+ box-sizing: border-box;
+ background-color: var.$dialog-background-color;
+ display: flex;
+ flex-direction: column;
+ box-shadow: 0 8px 10px -5px rgba(0, 0, 0, 0.2),
+ 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12);
+ overflow: hidden;
+ outline: 0;
+
+ @each $direction in $directions {
+ @include animation-out($direction);
+ @include animation-in($direction);
+ }
+
+ &__wrapper {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ overflow: hidden;
+ margin: 0;
+ }
+
+ &__header {
+ align-items: center;
+ color: rgb(114, 118, 123);
+ display: flex;
+ margin-bottom: 32px;
+ padding: var.$dialog-padding-primary;
+ padding-bottom: 0;
+ & > :first-child {
+ flex: 1;
+ }
+ }
+
+ &__title {
+ margin: 0;
+ flex: 1;
+ line-height: inherit;
+ font-size: 1rem;
+ }
+
+ &__close-btn {
+ border: none;
+ cursor: pointer;
+ font-size: var.$font-size-extra-large;
+ color: inherit;
+ background-color: transparent;
+ }
+
+ &__body {
+ flex: 1;
+ & > * {
+ box-sizing: border-box;
+ }
+ }
+
+ &.ltr,
+ &.rtl {
+ height: 100%;
+ top: 0;
+ bottom: 0;
+ }
+
+ &.ttb,
+ &.btt {
+ width: 100%;
+ left: 0;
+ right: 0;
+ }
+
+ &.ltr {
+ left: 0;
+ }
+
+ &.rtl {
+ right: 0;
+ }
+
+ &.ttb {
+ top: 0;
+ }
+
+ &.btt {
+ bottom: 0;
+ }
+}
+
+.el-drawer__container {
+ position: relative;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ height: 100%;
+ width: 100%;
+}
+
+.el-drawer-fade-enter-active {
+ animation: el-drawer-fade-in 0.3s;
+}
+
+.el-drawer-fade-leave-active {
+ animation: el-drawer-fade-in 0.3s reverse;
+}
diff --git a/packages/design-system/theme/src/dropdown-item.scss b/packages/design-system/theme/src/dropdown-item.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/design-system/theme/src/dropdown-menu.scss b/packages/design-system/theme/src/dropdown-menu.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/design-system/theme/src/dropdown.scss b/packages/design-system/theme/src/dropdown.scss
new file mode 100644
index 0000000000..b7195809bf
--- /dev/null
+++ b/packages/design-system/theme/src/dropdown.scss
@@ -0,0 +1,185 @@
+@use "mixins/mixins";
+@use "./common/var";
+@use "button";
+@use "./popper";
+
+@include mixins.b(dropdown) {
+ display: inline-block;
+ position: relative;
+ color: var(--color-text-dark);
+ font-size: var.$font-size-base;
+
+ .el-button-group {
+ display: block;
+ .el-button {
+ float: none;
+ }
+ }
+
+ & .el-dropdown__caret-button {
+ padding-left: 5px;
+ padding-right: 5px;
+ position: relative;
+ border-left: none;
+
+ &::before {
+ $gap: 5px;
+
+ content: '';
+ position: absolute;
+ display: block;
+ width: 1px;
+ top: $gap;
+ bottom: $gap;
+ left: 0;
+ background: rgba(var.$color-white, 0.5);
+ }
+
+ &.el-button--default::before {
+ background: hsla(
+ var(#{--button-default-border-color-h}),
+ var(#{--button-default-border-color-s}),
+ var(#{--button-default-border-color-l}),
+ 0.5
+ );
+ }
+
+ &:hover {
+ &::before {
+ top: 0;
+ bottom: 0;
+ }
+ }
+
+ & .el-dropdown__icon {
+ padding-left: 0;
+ }
+ }
+ @include mixins.e(icon) {
+ font-size: 12px;
+ margin: 0 3px;
+ }
+
+ .el-dropdown-selfdefine {
+ // 自定义
+ &:focus:active,
+ &:focus:not(.focusing) {
+ outline-width: 0;
+ }
+ }
+}
+
+@include mixins.b(dropdown-menu) {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 10;
+ padding: 10px 0;
+ margin: 5px 0;
+ background-color: var.$color-white;
+ border: 1px solid var(--border-color-light);
+ border-radius: var(--border-radius-base);
+ box-shadow: var.$dropdown-menu-box-shadow;
+
+ @include mixins.e(item) {
+ list-style: none;
+ line-height: 36px;
+ padding: 0 20px;
+ margin: 0;
+ font-size: var.$font-size-base;
+ color: var(--color-text-dark);
+ cursor: pointer;
+ outline: none;
+ &:not(.is-disabled):hover,
+ &:focus {
+ background-color: var.$dropdown-menuItem-hover-fill;
+ color: var.$dropdown-menuItem-hover-color;
+ }
+
+ i {
+ margin-right: 5px;
+ }
+
+ @include mixins.m(divided) {
+ $divided-offset: 6px;
+
+ position: relative;
+ margin-top: $divided-offset;
+ border-top: 1px solid var(--border-color-light);
+
+ &:before {
+ content: '';
+ height: $divided-offset;
+ display: block;
+ margin: 0 -20px;
+ background-color: var.$color-white;
+ }
+ }
+
+ @include mixins.when(disabled) {
+ cursor: default;
+ color: var.$font-color-disabled-base;
+ pointer-events: none;
+ }
+ }
+
+ @include mixins.m(medium) {
+ padding: 6px 0;
+
+ @include mixins.e(item) {
+ line-height: 30px;
+ padding: 0 17px;
+ font-size: 14px;
+
+ &.el-dropdown-menu__item--divided {
+ $divided-offset: 6px;
+ margin-top: $divided-offset;
+
+ &:before {
+ height: $divided-offset;
+ margin: 0 -17px;
+ }
+ }
+ }
+ }
+
+ @include mixins.m(small) {
+ padding: 6px 0;
+
+ @include mixins.e(item) {
+ line-height: 27px;
+ padding: 0 15px;
+ font-size: 13px;
+
+ &.el-dropdown-menu__item--divided {
+ $divided-offset: 4px;
+ margin-top: $divided-offset;
+
+ &:before {
+ height: $divided-offset;
+ margin: 0 -15px;
+ }
+ }
+ }
+ }
+
+ @include mixins.m(mini) {
+ padding: 3px 0;
+
+ @include mixins.e(item) {
+ line-height: 24px;
+ padding: 0 10px;
+ font-size: 12px;
+
+ &.el-dropdown-menu__item--divided {
+ $divided-offset: 3px;
+ margin-top: $divided-offset;
+
+ &:before {
+ height: $divided-offset;
+ margin: 0 -10px;
+ }
+ }
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/fonts/element-icons.ttf b/packages/design-system/theme/src/fonts/element-icons.ttf
new file mode 100644
index 0000000000..91b74de367
Binary files /dev/null and b/packages/design-system/theme/src/fonts/element-icons.ttf differ
diff --git a/packages/design-system/theme/src/fonts/element-icons.woff b/packages/design-system/theme/src/fonts/element-icons.woff
new file mode 100644
index 0000000000..02b9a2539e
Binary files /dev/null and b/packages/design-system/theme/src/fonts/element-icons.woff differ
diff --git a/packages/design-system/theme/src/footer.scss b/packages/design-system/theme/src/footer.scss
new file mode 100644
index 0000000000..c111279008
--- /dev/null
+++ b/packages/design-system/theme/src/footer.scss
@@ -0,0 +1,8 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(footer) {
+ padding: var.$footer-padding;
+ box-sizing: border-box;
+ flex-shrink: 0;
+}
diff --git a/packages/design-system/theme/src/form-item.scss b/packages/design-system/theme/src/form-item.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/design-system/theme/src/form.scss b/packages/design-system/theme/src/form.scss
new file mode 100644
index 0000000000..598ec6bff3
--- /dev/null
+++ b/packages/design-system/theme/src/form.scss
@@ -0,0 +1,168 @@
+@use "mixins/mixins";
+@use "mixins/utils";
+@use "./common/var";
+
+@include mixins.b(form) {
+ @include mixins.m(label-left) {
+ & .el-form-item__label {
+ text-align: left;
+ }
+ }
+ @include mixins.m(label-top) {
+ & .el-form-item__label {
+ float: none;
+ display: inline-block;
+ text-align: left;
+ padding: 0 0 10px 0;
+ }
+ }
+ @include mixins.m(inline) {
+ & .el-form-item {
+ display: inline-block;
+ margin-right: 10px;
+ vertical-align: top;
+ }
+ & .el-form-item__label {
+ float: none;
+ display: inline-block;
+ }
+ & .el-form-item__content {
+ display: inline-block;
+ vertical-align: top;
+ }
+ &.el-form--label-top .el-form-item__content {
+ display: block;
+ }
+ }
+}
+@include mixins.b(form-item) {
+ margin-bottom: 22px;
+ @include utils.utils-clearfix;
+
+ & .el-form-item {
+ margin-bottom: 0;
+ }
+
+ & .el-input__validateIcon {
+ display: none;
+ }
+
+ @include mixins.m(medium) {
+ .el-form-item__label {
+ line-height: 36px;
+ }
+ .el-form-item__content {
+ line-height: 36px;
+ }
+ }
+ @include mixins.m(small) {
+ .el-form-item__label {
+ line-height: 32px;
+ }
+ .el-form-item__content {
+ line-height: 32px;
+ }
+ &.el-form-item {
+ margin-bottom: 18px;
+ }
+ .el-form-item__error {
+ padding-top: 2px;
+ }
+ }
+ @include mixins.m(mini) {
+ .el-form-item__label {
+ line-height: 28px;
+ }
+ .el-form-item__content {
+ line-height: 28px;
+ }
+ &.el-form-item {
+ margin-bottom: 18px;
+ }
+ .el-form-item__error {
+ padding-top: 1px;
+ }
+ }
+
+ @include mixins.e(label-wrap) {
+ float: left;
+ .el-form-item__label {
+ display: inline-block;
+ float: none;
+ }
+ }
+
+ @include mixins.e(label) {
+ text-align: right;
+ vertical-align: middle;
+ float: left;
+ font-size: var.$form-label-font-size;
+ color: var(--color-text-dark);
+ line-height: 40px;
+ padding: 0 12px 0 0;
+ box-sizing: border-box;
+ }
+ @include mixins.e(content) {
+ line-height: 40px;
+ position: relative;
+ font-size: 14px;
+ @include utils.utils-clearfix;
+
+ .el-input-group {
+ vertical-align: top;
+ }
+ }
+ @include mixins.e(error) {
+ color: var(--color-danger);
+ font-size: 12px;
+ line-height: 1;
+ padding-top: 4px;
+ position: absolute;
+ top: 100%;
+ left: 0;
+
+ @include mixins.m(inline) {
+ position: relative;
+ top: auto;
+ left: auto;
+ display: inline-block;
+ margin-left: 10px;
+ }
+ }
+
+ @include mixins.when(required) {
+ @include mixins.pseudo('not(.is-no-asterisk)') {
+ & > .el-form-item__label:before,
+ & .el-form-item__label-wrap > .el-form-item__label:before {
+ content: '*';
+ color: var(--color-danger);
+ margin-right: 4px;
+ }
+ }
+ }
+
+ @include mixins.when(error) {
+ & .el-input__inner,
+ & .el-textarea__inner {
+ &,
+ &:focus {
+ border-color: var(--color-danger);
+ }
+ }
+ & .el-input-group__append,
+ & .el-input-group__prepend {
+ & .el-input__inner {
+ border-color: transparent;
+ }
+ }
+ .el-input__validateIcon {
+ color: var(--color-danger);
+ }
+ }
+
+ @include mixins.m(feedback) {
+ .el-input__validateIcon {
+ display: inline-block;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/header.scss b/packages/design-system/theme/src/header.scss
new file mode 100644
index 0000000000..a37a759f1e
--- /dev/null
+++ b/packages/design-system/theme/src/header.scss
@@ -0,0 +1,8 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(header) {
+ padding: var.$header-padding;
+ box-sizing: border-box;
+ flex-shrink: 0;
+}
diff --git a/packages/design-system/theme/src/icon.scss b/packages/design-system/theme/src/icon.scss
new file mode 100644
index 0000000000..261561d424
--- /dev/null
+++ b/packages/design-system/theme/src/icon.scss
@@ -0,0 +1,1169 @@
+@use "./common/var";
+
+@font-face {
+ font-family: 'element-icons';
+ src: url('#{var.$font-path}/element-icons.woff') format('woff'),
+ /* chrome, firefox */ url('#{var.$font-path}/element-icons.ttf')
+ format('truetype'); /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ font-weight: normal;
+ font-display: var.$font-display;
+ font-style: normal;
+}
+
+[class^='el-icon-'],
+[class*=' el-icon-'] {
+ /* use !important to prevent issues with browser extensions that change fonts */
+ font-family: 'element-icons' !important;
+ speak: none;
+ font-style: normal;
+ font-weight: normal;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+ vertical-align: baseline;
+ display: inline-block;
+
+ /* Better Font Rendering =========== */
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.el-icon-ice-cream-round:before {
+ content: '\e6a0';
+}
+
+.el-icon-ice-cream-square:before {
+ content: '\e6a3';
+}
+
+.el-icon-lollipop:before {
+ content: '\e6a4';
+}
+
+.el-icon-potato-strips:before {
+ content: '\e6a5';
+}
+
+.el-icon-milk-tea:before {
+ content: '\e6a6';
+}
+
+.el-icon-ice-drink:before {
+ content: '\e6a7';
+}
+
+.el-icon-ice-tea:before {
+ content: '\e6a9';
+}
+
+.el-icon-coffee:before {
+ content: '\e6aa';
+}
+
+.el-icon-orange:before {
+ content: '\e6ab';
+}
+
+.el-icon-pear:before {
+ content: '\e6ac';
+}
+
+.el-icon-apple:before {
+ content: '\e6ad';
+}
+
+.el-icon-cherry:before {
+ content: '\e6ae';
+}
+
+.el-icon-watermelon:before {
+ content: '\e6af';
+}
+
+.el-icon-grape:before {
+ content: '\e6b0';
+}
+
+.el-icon-refrigerator:before {
+ content: '\e6b1';
+}
+
+.el-icon-goblet-square-full:before {
+ content: '\e6b2';
+}
+
+.el-icon-goblet-square:before {
+ content: '\e6b3';
+}
+
+.el-icon-goblet-full:before {
+ content: '\e6b4';
+}
+
+.el-icon-goblet:before {
+ content: '\e6b5';
+}
+
+.el-icon-cold-drink:before {
+ content: '\e6b6';
+}
+
+.el-icon-coffee-cup:before {
+ content: '\e6b8';
+}
+
+.el-icon-water-cup:before {
+ content: '\e6b9';
+}
+
+.el-icon-hot-water:before {
+ content: '\e6ba';
+}
+
+.el-icon-ice-cream:before {
+ content: '\e6bb';
+}
+
+.el-icon-dessert:before {
+ content: '\e6bc';
+}
+
+.el-icon-sugar:before {
+ content: '\e6bd';
+}
+
+.el-icon-tableware:before {
+ content: '\e6be';
+}
+
+.el-icon-burger:before {
+ content: '\e6bf';
+}
+
+.el-icon-knife-fork:before {
+ content: '\e6c1';
+}
+
+.el-icon-fork-spoon:before {
+ content: '\e6c2';
+}
+
+.el-icon-chicken:before {
+ content: '\e6c3';
+}
+
+.el-icon-food:before {
+ content: '\e6c4';
+}
+
+.el-icon-dish-1:before {
+ content: '\e6c5';
+}
+
+.el-icon-dish:before {
+ content: '\e6c6';
+}
+
+.el-icon-moon-night:before {
+ content: '\e6ee';
+}
+
+.el-icon-moon:before {
+ content: '\e6f0';
+}
+
+.el-icon-cloudy-and-sunny:before {
+ content: '\e6f1';
+}
+
+.el-icon-partly-cloudy:before {
+ content: '\e6f2';
+}
+
+.el-icon-cloudy:before {
+ content: '\e6f3';
+}
+
+.el-icon-sunny:before {
+ content: '\e6f6';
+}
+
+.el-icon-sunset:before {
+ content: '\e6f7';
+}
+
+.el-icon-sunrise-1:before {
+ content: '\e6f8';
+}
+
+.el-icon-sunrise:before {
+ content: '\e6f9';
+}
+
+.el-icon-heavy-rain:before {
+ content: '\e6fa';
+}
+
+.el-icon-lightning:before {
+ content: '\e6fb';
+}
+
+.el-icon-light-rain:before {
+ content: '\e6fc';
+}
+
+.el-icon-wind-power:before {
+ content: '\e6fd';
+}
+
+.el-icon-baseball:before {
+ content: '\e712';
+}
+
+.el-icon-soccer:before {
+ content: '\e713';
+}
+
+.el-icon-football:before {
+ content: '\e715';
+}
+
+.el-icon-basketball:before {
+ content: '\e716';
+}
+
+.el-icon-ship:before {
+ content: '\e73f';
+}
+
+.el-icon-truck:before {
+ content: '\e740';
+}
+
+.el-icon-bicycle:before {
+ content: '\e741';
+}
+
+.el-icon-mobile-phone:before {
+ content: '\e6d3';
+}
+
+.el-icon-service:before {
+ content: '\e6d4';
+}
+
+.el-icon-key:before {
+ content: '\e6e2';
+}
+
+.el-icon-unlock:before {
+ content: '\e6e4';
+}
+
+.el-icon-lock:before {
+ content: '\e6e5';
+}
+
+.el-icon-watch:before {
+ content: '\e6fe';
+}
+
+.el-icon-watch-1:before {
+ content: '\e6ff';
+}
+
+.el-icon-timer:before {
+ content: '\e702';
+}
+
+.el-icon-alarm-clock:before {
+ content: '\e703';
+}
+
+.el-icon-map-location:before {
+ content: '\e704';
+}
+
+.el-icon-delete-location:before {
+ content: '\e705';
+}
+
+.el-icon-add-location:before {
+ content: '\e706';
+}
+
+.el-icon-location-information:before {
+ content: '\e707';
+}
+
+.el-icon-location-outline:before {
+ content: '\e708';
+}
+
+.el-icon-location:before {
+ content: '\e79e';
+}
+
+.el-icon-place:before {
+ content: '\e709';
+}
+
+.el-icon-discover:before {
+ content: '\e70a';
+}
+
+.el-icon-first-aid-kit:before {
+ content: '\e70b';
+}
+
+.el-icon-trophy-1:before {
+ content: '\e70c';
+}
+
+.el-icon-trophy:before {
+ content: '\e70d';
+}
+
+.el-icon-medal:before {
+ content: '\e70e';
+}
+
+.el-icon-medal-1:before {
+ content: '\e70f';
+}
+
+.el-icon-stopwatch:before {
+ content: '\e710';
+}
+
+.el-icon-mic:before {
+ content: '\e711';
+}
+
+.el-icon-copy-document:before {
+ content: '\e718';
+}
+
+.el-icon-full-screen:before {
+ content: '\e719';
+}
+
+.el-icon-switch-button:before {
+ content: '\e71b';
+}
+
+.el-icon-aim:before {
+ content: '\e71c';
+}
+
+.el-icon-crop:before {
+ content: '\e71d';
+}
+
+.el-icon-odometer:before {
+ content: '\e71e';
+}
+
+.el-icon-time:before {
+ content: '\e71f';
+}
+
+.el-icon-bangzhu:before {
+ content: '\e724';
+}
+
+.el-icon-close-notification:before {
+ content: '\e726';
+}
+
+.el-icon-microphone:before {
+ content: '\e727';
+}
+
+.el-icon-turn-off-microphone:before {
+ content: '\e728';
+}
+
+.el-icon-position:before {
+ content: '\e729';
+}
+
+.el-icon-postcard:before {
+ content: '\e72a';
+}
+
+.el-icon-message:before {
+ content: '\e72b';
+}
+
+.el-icon-chat-line-square:before {
+ content: '\e72d';
+}
+
+.el-icon-chat-dot-square:before {
+ content: '\e72e';
+}
+
+.el-icon-chat-dot-round:before {
+ content: '\e72f';
+}
+
+.el-icon-chat-square:before {
+ content: '\e730';
+}
+
+.el-icon-chat-line-round:before {
+ content: '\e731';
+}
+
+.el-icon-chat-round:before {
+ content: '\e732';
+}
+
+.el-icon-set-up:before {
+ content: '\e733';
+}
+
+.el-icon-turn-off:before {
+ content: '\e734';
+}
+
+.el-icon-open:before {
+ content: '\e735';
+}
+
+.el-icon-connection:before {
+ content: '\e736';
+}
+
+.el-icon-link:before {
+ content: '\e737';
+}
+
+.el-icon-cpu:before {
+ content: '\e738';
+}
+
+.el-icon-thumb:before {
+ content: '\e739';
+}
+
+.el-icon-female:before {
+ content: '\e73a';
+}
+
+.el-icon-male:before {
+ content: '\e73b';
+}
+
+.el-icon-guide:before {
+ content: '\e73c';
+}
+
+.el-icon-news:before {
+ content: '\e73e';
+}
+
+.el-icon-price-tag:before {
+ content: '\e744';
+}
+
+.el-icon-discount:before {
+ content: '\e745';
+}
+
+.el-icon-wallet:before {
+ content: '\e747';
+}
+
+.el-icon-coin:before {
+ content: '\e748';
+}
+
+.el-icon-money:before {
+ content: '\e749';
+}
+
+.el-icon-bank-card:before {
+ content: '\e74a';
+}
+
+.el-icon-box:before {
+ content: '\e74b';
+}
+
+.el-icon-present:before {
+ content: '\e74c';
+}
+
+.el-icon-sell:before {
+ content: '\e6d5';
+}
+
+.el-icon-sold-out:before {
+ content: '\e6d6';
+}
+
+.el-icon-shopping-bag-2:before {
+ content: '\e74d';
+}
+
+.el-icon-shopping-bag-1:before {
+ content: '\e74e';
+}
+
+.el-icon-shopping-cart-2:before {
+ content: '\e74f';
+}
+
+.el-icon-shopping-cart-1:before {
+ content: '\e750';
+}
+
+.el-icon-shopping-cart-full:before {
+ content: '\e751';
+}
+
+.el-icon-smoking:before {
+ content: '\e752';
+}
+
+.el-icon-no-smoking:before {
+ content: '\e753';
+}
+
+.el-icon-house:before {
+ content: '\e754';
+}
+
+.el-icon-table-lamp:before {
+ content: '\e755';
+}
+
+.el-icon-school:before {
+ content: '\e756';
+}
+
+.el-icon-office-building:before {
+ content: '\e757';
+}
+
+.el-icon-toilet-paper:before {
+ content: '\e758';
+}
+
+.el-icon-notebook-2:before {
+ content: '\e759';
+}
+
+.el-icon-notebook-1:before {
+ content: '\e75a';
+}
+
+.el-icon-files:before {
+ content: '\e75b';
+}
+
+.el-icon-collection:before {
+ content: '\e75c';
+}
+
+.el-icon-receiving:before {
+ content: '\e75d';
+}
+
+.el-icon-suitcase-1:before {
+ content: '\e760';
+}
+
+.el-icon-suitcase:before {
+ content: '\e761';
+}
+
+.el-icon-film:before {
+ content: '\e763';
+}
+
+.el-icon-collection-tag:before {
+ content: '\e765';
+}
+
+.el-icon-data-analysis:before {
+ content: '\e766';
+}
+
+.el-icon-pie-chart:before {
+ content: '\e767';
+}
+
+.el-icon-data-board:before {
+ content: '\e768';
+}
+
+.el-icon-data-line:before {
+ content: '\e76d';
+}
+
+.el-icon-reading:before {
+ content: '\e769';
+}
+
+.el-icon-magic-stick:before {
+ content: '\e76a';
+}
+
+.el-icon-coordinate:before {
+ content: '\e76b';
+}
+
+.el-icon-mouse:before {
+ content: '\e76c';
+}
+
+.el-icon-brush:before {
+ content: '\e76e';
+}
+
+.el-icon-headset:before {
+ content: '\e76f';
+}
+
+.el-icon-umbrella:before {
+ content: '\e770';
+}
+
+.el-icon-scissors:before {
+ content: '\e771';
+}
+
+.el-icon-mobile:before {
+ content: '\e773';
+}
+
+.el-icon-attract:before {
+ content: '\e774';
+}
+
+.el-icon-monitor:before {
+ content: '\e775';
+}
+
+.el-icon-search:before {
+ content: '\e778';
+}
+
+.el-icon-takeaway-box:before {
+ content: '\e77a';
+}
+
+.el-icon-paperclip:before {
+ content: '\e77d';
+}
+
+.el-icon-printer:before {
+ content: '\e77e';
+}
+
+.el-icon-document-add:before {
+ content: '\e782';
+}
+
+.el-icon-document:before {
+ content: '\e785';
+}
+
+.el-icon-document-checked:before {
+ content: '\e786';
+}
+
+.el-icon-document-copy:before {
+ content: '\e787';
+}
+
+.el-icon-document-delete:before {
+ content: '\e788';
+}
+
+.el-icon-document-remove:before {
+ content: '\e789';
+}
+
+.el-icon-tickets:before {
+ content: '\e78b';
+}
+
+.el-icon-folder-checked:before {
+ content: '\e77f';
+}
+
+.el-icon-folder-delete:before {
+ content: '\e780';
+}
+
+.el-icon-folder-remove:before {
+ content: '\e781';
+}
+
+.el-icon-folder-add:before {
+ content: '\e783';
+}
+
+.el-icon-folder-opened:before {
+ content: '\e784';
+}
+
+.el-icon-folder:before {
+ content: '\e78a';
+}
+
+.el-icon-edit-outline:before {
+ content: '\e764';
+}
+
+.el-icon-edit:before {
+ content: '\e78c';
+}
+
+.el-icon-date:before {
+ content: '\e78e';
+}
+
+.el-icon-c-scale-to-original:before {
+ content: '\e7c6';
+}
+
+.el-icon-view:before {
+ content: '\e6ce';
+}
+
+.el-icon-loading:before {
+ content: '\e6cf';
+}
+
+.el-icon-rank:before {
+ content: '\e6d1';
+}
+
+.el-icon-sort-down:before {
+ content: '\e7c4';
+}
+
+.el-icon-sort-up:before {
+ content: '\e7c5';
+}
+
+.el-icon-sort:before {
+ content: '\e6d2';
+}
+
+.el-icon-finished:before {
+ content: '\e6cd';
+}
+
+.el-icon-refresh-left:before {
+ content: '\e6c7';
+}
+
+.el-icon-refresh-right:before {
+ content: '\e6c8';
+}
+
+.el-icon-refresh:before {
+ content: '\e6d0';
+}
+
+.el-icon-video-play:before {
+ content: '\e7c0';
+}
+
+.el-icon-video-pause:before {
+ content: '\e7c1';
+}
+
+.el-icon-d-arrow-right:before {
+ content: '\e6dc';
+}
+
+.el-icon-d-arrow-left:before {
+ content: '\e6dd';
+}
+
+.el-icon-arrow-up:before {
+ content: '\e6e1';
+}
+
+.el-icon-arrow-down:before {
+ content: '\e6df';
+}
+
+.el-icon-arrow-right:before {
+ content: '\e6e0';
+}
+
+.el-icon-arrow-left:before {
+ content: '\e6de';
+}
+
+.el-icon-top-right:before {
+ content: '\e6e7';
+}
+
+.el-icon-top-left:before {
+ content: '\e6e8';
+}
+
+.el-icon-top:before {
+ content: '\e6e6';
+}
+
+.el-icon-bottom:before {
+ content: '\e6eb';
+}
+
+.el-icon-right:before {
+ content: '\e6e9';
+}
+
+.el-icon-back:before {
+ content: '\e6ea';
+}
+
+.el-icon-bottom-right:before {
+ content: '\e6ec';
+}
+
+.el-icon-bottom-left:before {
+ content: '\e6ed';
+}
+
+.el-icon-caret-top:before {
+ content: '\e78f';
+}
+
+.el-icon-caret-bottom:before {
+ content: '\e790';
+}
+
+.el-icon-caret-right:before {
+ content: '\e791';
+}
+
+.el-icon-caret-left:before {
+ content: '\e792';
+}
+
+.el-icon-d-caret:before {
+ content: '\e79a';
+}
+
+.el-icon-share:before {
+ content: '\e793';
+}
+
+.el-icon-menu:before {
+ content: '\e798';
+}
+
+.el-icon-s-grid:before {
+ content: '\e7a6';
+}
+
+.el-icon-s-check:before {
+ content: '\e7a7';
+}
+
+.el-icon-s-data:before {
+ content: '\e7a8';
+}
+
+.el-icon-s-opportunity:before {
+ content: '\e7aa';
+}
+
+.el-icon-s-custom:before {
+ content: '\e7ab';
+}
+
+.el-icon-s-claim:before {
+ content: '\e7ad';
+}
+
+.el-icon-s-finance:before {
+ content: '\e7ae';
+}
+
+.el-icon-s-comment:before {
+ content: '\e7af';
+}
+
+.el-icon-s-flag:before {
+ content: '\e7b0';
+}
+
+.el-icon-s-marketing:before {
+ content: '\e7b1';
+}
+
+.el-icon-s-shop:before {
+ content: '\e7b4';
+}
+
+.el-icon-s-open:before {
+ content: '\e7b5';
+}
+
+.el-icon-s-management:before {
+ content: '\e7b6';
+}
+
+.el-icon-s-ticket:before {
+ content: '\e7b7';
+}
+
+.el-icon-s-release:before {
+ content: '\e7b8';
+}
+
+.el-icon-s-home:before {
+ content: '\e7b9';
+}
+
+.el-icon-s-promotion:before {
+ content: '\e7ba';
+}
+
+.el-icon-s-operation:before {
+ content: '\e7bb';
+}
+
+.el-icon-s-unfold:before {
+ content: '\e7bc';
+}
+
+.el-icon-s-fold:before {
+ content: '\e7a9';
+}
+
+.el-icon-s-platform:before {
+ content: '\e7bd';
+}
+
+.el-icon-s-order:before {
+ content: '\e7be';
+}
+
+.el-icon-s-cooperation:before {
+ content: '\e7bf';
+}
+
+.el-icon-bell:before {
+ content: '\e725';
+}
+
+.el-icon-message-solid:before {
+ content: '\e799';
+}
+
+.el-icon-video-camera:before {
+ content: '\e772';
+}
+
+.el-icon-video-camera-solid:before {
+ content: '\e796';
+}
+
+.el-icon-camera:before {
+ content: '\e779';
+}
+
+.el-icon-camera-solid:before {
+ content: '\e79b';
+}
+
+.el-icon-download:before {
+ content: '\e77c';
+}
+
+.el-icon-upload2:before {
+ content: '\e77b';
+}
+
+.el-icon-upload:before {
+ content: '\e7c3';
+}
+
+.el-icon-picture-outline-round:before {
+ content: '\e75f';
+}
+
+.el-icon-picture-outline:before {
+ content: '\e75e';
+}
+
+.el-icon-picture:before {
+ content: '\e79f';
+}
+
+.el-icon-close:before {
+ content: '\e6db';
+}
+
+.el-icon-check:before {
+ content: '\e6da';
+}
+
+.el-icon-plus:before {
+ content: '\e6d9';
+}
+
+.el-icon-minus:before {
+ content: '\e6d8';
+}
+
+.el-icon-help:before {
+ content: '\e73d';
+}
+
+.el-icon-s-help:before {
+ content: '\e7b3';
+}
+
+.el-icon-circle-close:before {
+ content: '\e78d';
+}
+
+.el-icon-circle-check:before {
+ content: '\e720';
+}
+
+.el-icon-circle-plus-outline:before {
+ content: '\e723';
+}
+
+.el-icon-remove-outline:before {
+ content: '\e722';
+}
+
+.el-icon-zoom-out:before {
+ content: '\e776';
+}
+
+.el-icon-zoom-in:before {
+ content: '\e777';
+}
+
+.el-icon-error:before {
+ content: '\e79d';
+}
+
+.el-icon-success:before {
+ content: '\e79c';
+}
+
+.el-icon-circle-plus:before {
+ content: '\e7a0';
+}
+
+.el-icon-remove:before {
+ content: '\e7a2';
+}
+
+.el-icon-info:before {
+ content: '\e7a1';
+}
+
+.el-icon-question:before {
+ content: '\e7a4';
+}
+
+.el-icon-warning-outline:before {
+ content: '\e6c9';
+}
+
+.el-icon-warning:before {
+ content: '\e7a3';
+}
+
+.el-icon-goods:before {
+ content: '\e7c2';
+}
+
+.el-icon-s-goods:before {
+ content: '\e7b2';
+}
+
+.el-icon-star-off:before {
+ content: '\e717';
+}
+
+.el-icon-star-on:before {
+ content: '\e797';
+}
+
+.el-icon-more-outline:before {
+ content: '\e6cc';
+}
+
+.el-icon-more:before {
+ content: '\e794';
+}
+
+.el-icon-phone-outline:before {
+ content: '\e6cb';
+}
+
+.el-icon-phone:before {
+ content: '\e795';
+}
+
+.el-icon-user:before {
+ content: '\e6e3';
+}
+
+.el-icon-user-solid:before {
+ content: '\e7a5';
+}
+
+.el-icon-setting:before {
+ content: '\e6ca';
+}
+
+.el-icon-s-tools:before {
+ content: '\e7ac';
+}
+
+.el-icon-delete:before {
+ content: '\e6d7';
+}
+
+.el-icon-delete-solid:before {
+ content: '\e7c9';
+}
+
+.el-icon-eleme:before {
+ content: '\e7c7';
+}
+
+.el-icon-platform-eleme:before {
+ content: '\e7ca';
+}
+
+.el-icon-loading {
+ animation: rotating 2s linear infinite;
+}
+
+.el-icon--right {
+ margin-left: 5px;
+}
+.el-icon--left {
+ margin-right: 5px;
+}
+
+@keyframes rotating {
+ 0% {
+ transform: rotateZ(0deg);
+ }
+ 100% {
+ transform: rotateZ(360deg);
+ }
+}
diff --git a/packages/design-system/theme/src/image.scss b/packages/design-system/theme/src/image.scss
new file mode 100644
index 0000000000..a60c853beb
--- /dev/null
+++ b/packages/design-system/theme/src/image.scss
@@ -0,0 +1,176 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+%size {
+ width: 100%;
+ height: 100%;
+}
+
+@include mixins.b(image) {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+
+ @include mixins.e(inner) {
+ @extend %size;
+ vertical-align: top;
+
+ @include mixins.m(center) {
+ position: relative;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ display: block;
+ }
+ }
+
+ @include mixins.e(placeholder) {
+ @extend %size;
+ background: var.$background-color-base;
+ }
+
+ @include mixins.e(error) {
+ @extend %size;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: 14px;
+ background: var.$background-color-base;
+ color: var(--color-text-lighter);
+ vertical-align: middle;
+ }
+
+ @include mixins.e(preview) {
+ cursor: pointer;
+ }
+}
+
+@include mixins.b(image-viewer) {
+ @include mixins.e(wrapper) {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ }
+
+ @include mixins.e(btn) {
+ position: absolute;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 50%;
+ opacity: 0.8;
+ cursor: pointer;
+ box-sizing: border-box;
+ user-select: none;
+ }
+
+ @include mixins.e(close) {
+ top: 40px;
+ right: 40px;
+ width: 40px;
+ height: 40px;
+ font-size: 24px;
+ color: #fff;
+ background-color: #606266;
+ }
+
+ @include mixins.e(canvas) {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ @include mixins.e(actions) {
+ left: 50%;
+ bottom: 30px;
+ transform: translateX(-50%);
+ width: 282px;
+ height: 44px;
+ padding: 0 23px;
+ background-color: #606266;
+ border-color: #fff;
+ border-radius: 22px;
+
+ @include mixins.e(actions__inner) {
+ width: 100%;
+ height: 100%;
+ text-align: justify;
+ cursor: default;
+ font-size: 23px;
+ color: #fff;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+ }
+ }
+
+ @include mixins.e(prev) {
+ top: 50%;
+ transform: translateY(-50%);
+ width: 44px;
+ height: 44px;
+ font-size: 24px;
+ color: #fff;
+ background-color: #606266;
+ border-color: #fff;
+ left: 40px;
+ }
+
+ @include mixins.e(next) {
+ top: 50%;
+ transform: translateY(-50%);
+ width: 44px;
+ height: 44px;
+ font-size: 24px;
+ color: #fff;
+ background-color: #606266;
+ border-color: #fff;
+ right: 40px;
+ text-indent: 2px;
+ }
+
+ @include mixins.e(mask) {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ opacity: 0.5;
+ background: #000;
+ }
+}
+
+.viewer-fade-enter-active {
+ animation: viewer-fade-in 0.3s;
+}
+
+.viewer-fade-leave-active {
+ animation: viewer-fade-out 0.3s;
+}
+
+@keyframes viewer-fade-in {
+ 0% {
+ transform: translate3d(0, -20px, 0);
+ opacity: 0;
+ }
+ 100% {
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+@keyframes viewer-fade-out {
+ 0% {
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+ 100% {
+ transform: translate3d(0, -20px, 0);
+ opacity: 0;
+ }
+}
diff --git a/packages/design-system/theme/src/index.scss b/packages/design-system/theme/src/index.scss
new file mode 100644
index 0000000000..353317e1c3
--- /dev/null
+++ b/packages/design-system/theme/src/index.scss
@@ -0,0 +1,83 @@
+@use "./tokens.scss";
+@use "./tokens.dark.scss" as dark;
+@use "./reset.scss";
+@use "./base.scss";
+// @use "./pagination.scss";
+@use "./dialog.scss";
+// @use "./autocomplete.scss";
+@use "./dropdown.scss";
+@use "./dropdown-menu.scss";
+@use "./dropdown-item.scss";
+@use "./menu.scss";
+@use "./submenu.scss";
+@use "./menu-item.scss";
+// @use "./menu-item-group.scss";
+@use "./input.scss";
+@use "./input-number.scss";
+@use "./radio.scss";
+@use "./radio-group.scss";
+@use "./radio-button.scss";
+@use "./checkbox.scss";
+// @use "./checkbox-button.scss";
+// @use "./checkbox-group.scss";
+@use "./switch.scss";
+@use "./select.scss";
+@use "./button.scss";
+// @use "./button-group.scss";
+@use "./table.scss";
+@use "./table-column.scss";
+@use "./date-picker.scss";
+// @use "./time-select.scss";
+// @use "./time-picker.scss";
+@use "./popover.scss";
+@use "./tooltip.scss";
+@use "./message-box.scss";
+// @use "./breadcrumb.scss";
+// @use "./breadcrumb-item.scss";
+@use "./form.scss";
+@use "./form-item.scss";
+@use "./tabs.scss";
+@use "./tab-pane.scss";
+@use "./tag.scss";
+// @use "./tree.scss";
+@use "./alert.scss";
+@use "./notification.scss";
+// @use "./slider.scss";
+@use "./loading.scss";
+@use "./row.scss";
+@use "./col.scss";
+// @use "./upload.scss";
+// @use "./progress.scss";
+// @use "./spinner.scss";
+// @use "./message.scss";
+@use "./badge.scss";
+@use "./card.scss";
+// @use "./rate.scss";
+// @use "./steps.scss";
+// @use "./step.scss";
+// @use "./carousel.scss";
+// @use "./scrollbar.scss";
+// @use "./carousel-item.scss";
+// @use "./collapse.scss";
+// @use "./collapse-item.scss";
+// @use "./cascader.scss";
+@use "./color-picker.scss";
+@use "./transfer.scss";
+@use "./container.scss";
+// @use "./header.scss";
+// @use "./aside.scss";
+// @use "./main.scss";
+// @use "./footer.scss";
+// @use "./timeline.scss";
+// @use "./timeline-item.scss";
+// @use "./link.scss";
+// @use "./divider.scss";
+// @use "./image.scss";
+// @use "./calendar.scss";
+// @use "./backtop.scss";
+// @use "./infinite-scroll.scss";
+// @use "./page-header.scss";
+// @use "./cascader-panel.scss";
+// @use "./avatar.scss";
+@use "./drawer.scss";
+// @use "./popconfirm.scss";
diff --git a/packages/design-system/theme/src/infinite-scroll.scss b/packages/design-system/theme/src/infinite-scroll.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/design-system/theme/src/infiniteScroll.scss b/packages/design-system/theme/src/infiniteScroll.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/design-system/theme/src/input-number.scss b/packages/design-system/theme/src/input-number.scss
new file mode 100644
index 0000000000..9509f77681
--- /dev/null
+++ b/packages/design-system/theme/src/input-number.scss
@@ -0,0 +1,181 @@
+@use "mixins/mixins";
+@use "./common/var";
+@use "input";
+
+@include mixins.b(input-number) {
+ position: relative;
+ display: inline-block;
+ line-height: #{var.$input-height - 2};
+ width: 100%;
+
+ .el-input {
+ display: block;
+
+ &__inner {
+ -webkit-appearance: none;
+ padding-left: #{var.$input-height + 10};
+ padding-right: #{var.$input-height + 10};
+ text-align: center;
+ }
+ }
+
+ @include mixins.e((increase, decrease)) {
+ position: absolute;
+ z-index: 1;
+ top: 1px;
+ width: var.$input-height;
+ height: auto;
+ text-align: center;
+ background: var.$background-color-base;
+ color: var(--color-text-dark);
+ cursor: pointer;
+ font-size: 13px;
+
+ &:hover {
+ color: var(--color-primary);
+
+ &:not(.is-disabled) ~ .el-input .el-input__inner:not(.is-disabled) {
+ border-color: var.$input-focus-border;
+ }
+ }
+
+ &.is-disabled {
+ color: var.$disabled-color-base;
+ cursor: not-allowed;
+ }
+ }
+
+ @include mixins.e(increase) {
+ right: 1px;
+ border-radius: 0 var(--border-radius-base) var(--border-radius-base) 0;
+ border-left: var(--border-base);
+ }
+
+ @include mixins.e(decrease) {
+ left: 1px;
+ border-radius: var(--border-radius-base) 0 0 var(--border-radius-base);
+ border-right: var(--border-base);
+ }
+
+ @include mixins.when(disabled) {
+ @include mixins.e((increase, decrease)) {
+ border-color: var.$disabled-border-base;
+ color: var.$disabled-border-base;
+
+ &:hover {
+ color: var.$disabled-border-base;
+ cursor: not-allowed;
+ }
+ }
+ }
+
+ @include mixins.m(medium) {
+ line-height: #{var.$input-medium-height - 2};
+
+ @include mixins.e((increase, decrease)) {
+ width: var.$input-medium-height;
+ font-size: var.$input-medium-font-size;
+ }
+
+ .el-input__inner {
+ padding-left: #{var.$input-medium-height + 7};
+ padding-right: #{var.$input-medium-height + 7};
+ }
+ }
+
+ @include mixins.m(small) {
+ line-height: #{var.$input-small-height - 2};
+
+ @include mixins.e((increase, decrease)) {
+ width: var.$input-small-height;
+ font-size: var.$input-small-font-size;
+
+ [class*='el-icon'] {
+ transform: scale(0.9);
+ }
+ }
+
+ .el-input__inner {
+ padding-left: #{var.$input-small-height + 7};
+ padding-right: #{var.$input-small-height + 7};
+ }
+ }
+
+ @include mixins.m(mini) {
+ line-height: #{var.$input-mini-height - 2};
+
+ @include mixins.e((increase, decrease)) {
+ width: var.$input-mini-height;
+ font-size: var.$input-mini-font-size;
+
+ [class*='el-icon'] {
+ transform: scale(0.8);
+ }
+ }
+
+ .el-input__inner {
+ padding-left: #{var.$input-mini-height + 7};
+ padding-right: #{var.$input-mini-height + 7};
+ }
+ }
+
+ @include mixins.when(without-controls) {
+ .el-input__inner {
+ text-align: left;
+ padding-left: 12px;
+ padding-right: 12px;
+ }
+ }
+
+ @include mixins.when(controls-right) {
+ .el-input__inner {
+ padding-left: 15px;
+ padding-right: #{var.$input-height + 10};
+ }
+
+ @include mixins.e((increase, decrease)) {
+ height: auto;
+ line-height: #{(var.$input-height - 2) * 0.5};
+
+ [class*='el-icon'] {
+ transform: scale(0.8);
+ }
+ }
+
+ @include mixins.e(increase) {
+ border-radius: 0 var(--border-radius-base) 0 0;
+ border-bottom: var(--border-base);
+ }
+
+ @include mixins.e(decrease) {
+ right: 1px;
+ bottom: 1px;
+ top: auto;
+ left: auto;
+ border-right: none;
+ border-left: var(--border-base);
+ border-radius: 0 0 var(--border-radius-base) 0;
+ }
+
+ &[class*='medium'] {
+ [class*='increase'],
+ [class*='decrease'] {
+ line-height: #{(var.$input-medium-height - 2) * 0.5};
+ }
+ }
+
+ &[class*='small'] {
+ [class*='increase'],
+ [class*='decrease'] {
+ line-height: #{(var.$input-small-height - 2) * 0.5};
+ }
+ }
+
+ &[class*='mini'] {
+ [class*='increase'],
+ [class*='decrease'] {
+ line-height: #{(var.$input-mini-height - 2) * 0.5};
+ }
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/input.scss b/packages/design-system/theme/src/input.scss
new file mode 100644
index 0000000000..1264833936
--- /dev/null
+++ b/packages/design-system/theme/src/input.scss
@@ -0,0 +1,356 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(textarea) {
+ position: relative;
+ display: inline-block;
+ width: 100%;
+ vertical-align: bottom;
+ font-size: var.$font-size-base;
+
+ @include mixins.e(inner) {
+ display: block;
+ resize: vertical;
+ padding: 8px 12px 5px 12px;
+ line-height: 1.5;
+ box-sizing: border-box;
+ width: 100%;
+ font-size: inherit;
+ color: var.$input-font-color;
+ background-color: var.$input-background-color;
+ background-image: none;
+ border-radius: var.$input-border-radius;
+ transition: var.$border-transition-base;
+
+ &,
+ &:hover {
+ border: var.$input-border;
+ }
+
+ &::placeholder {
+ color: var.$input-placeholder-color;
+ }
+
+ &:focus {
+ outline: none;
+ border-color: var.$input-focus-border;
+ }
+ }
+
+ & .el-input__count {
+ color: var(--color-info);
+ background: var.$color-white;
+ position: absolute;
+ font-size: 12px;
+ bottom: 5px;
+ right: 10px;
+ }
+
+ @include mixins.when(disabled) {
+ .el-textarea__inner {
+ background-color: var.$input-disabled-fill;
+ border-color: var.$input-disabled-border;
+ color: var.$input-disabled-color;
+ cursor: not-allowed;
+
+ &::placeholder {
+ color: var.$input-disabled-placeholder-color;
+ }
+ }
+ }
+
+ @include mixins.when(exceed) {
+ .el-textarea__inner {
+ border-color: var(--color-danger);
+ }
+
+ .el-input__count {
+ color: var(--color-danger);
+ }
+ }
+}
+
+@include mixins.b(input) {
+ position: relative;
+ font-size: var.$input-font-size;
+ display: inline-block;
+ width: 100%;
+ @include mixins.scroll-bar;
+
+ & .el-input__clear {
+ color: var.$input-clear-color;
+ font-size: var.$input-font-size;
+ cursor: pointer;
+ transition: var.$color-transition-base;
+
+ &:hover {
+ color: var.$input-clear-hover-color;
+ }
+ }
+
+ & .el-input__count {
+ height: 100%;
+ display: inline-flex;
+ align-items: center;
+ color: var(--color-info);
+ font-size: 12px;
+
+ .el-input__count-inner {
+ background: var.$color-white;
+ line-height: initial;
+ display: inline-block;
+ padding: 0 5px;
+ }
+ }
+
+ @include mixins.e(inner) {
+ -webkit-appearance: none;
+ background-color: var.$input-background-color;
+ background-image: none;
+ border-radius: var.$input-border-radius;
+ border: var.$input-border;
+ box-sizing: border-box;
+ color: var.$input-font-color;
+ display: inline-block;
+ font-size: inherit;
+ height: var.$input-height;
+ line-height: var.$input-height;
+ outline: none;
+ padding: 0 var(--spacing-xs);
+ transition: var.$border-transition-base;
+ width: 100%;
+
+ &::placeholder {
+ color: var.$input-placeholder-color;
+ }
+
+ &:focus {
+ outline: none;
+ border-color: var.$input-focus-border;
+ }
+ }
+
+ @include mixins.e(suffix) {
+ position: absolute;
+ height: 100%;
+ right: 10px;
+ top: 0;
+ text-align: center;
+ color: var(--color-text-light);
+ transition: all 0.3s;
+ pointer-events: none;
+ display: flex;
+ align-items: center;
+ }
+
+ @include mixins.e(suffix-inner) {
+ pointer-events: all;
+ }
+
+ @include mixins.e(prefix) {
+ position: absolute;
+ height: 100%;
+ left: 14px;
+ top: 0;
+ text-align: center;
+ color: var.$input-icon-color;
+ transition: all 0.3s;
+ display: flex;
+ align-items: center;
+ }
+
+ @include mixins.e(icon) {
+ height: 100%;
+ text-align: center;
+ transition: all 0.3s;
+ line-height: var.$input-height;
+
+ &:after {
+ content: '';
+ height: 100%;
+ width: 0;
+ display: inline-block;
+ vertical-align: middle;
+ }
+ }
+
+ @include mixins.e(validateIcon) {
+ pointer-events: none;
+ }
+
+ @include mixins.when(active) {
+ .el-input__inner {
+ outline: none;
+ border-color: var.$input-focus-border;
+ }
+ }
+
+ @include mixins.when(disabled) {
+ .el-input__inner {
+ background-color: var.$input-disabled-fill;
+ border-color: var.$input-disabled-border;
+ color: var.$input-disabled-color;
+ cursor: not-allowed;
+
+ &::placeholder {
+ color: var.$input-disabled-placeholder-color;
+ }
+ }
+
+ .el-input__icon {
+ cursor: not-allowed;
+ }
+ }
+
+ @include mixins.when(exceed) {
+ .el-input__inner {
+ border-color: var(--color-danger);
+ }
+
+ .el-input__suffix {
+ .el-input__count {
+ color: var(--color-danger);
+ }
+ }
+ }
+
+ @include mixins.m(suffix) {
+ .el-input__inner {
+ padding-right: 30px;
+ }
+ }
+
+ @include mixins.m(prefix) {
+ .el-input__inner {
+ padding-left: 37px;
+ }
+ }
+
+ @include mixins.m(medium) {
+ font-size: var.$input-medium-font-size;
+
+ @include mixins.e(inner) {
+ height: var.$input-medium-height;
+ line-height: var.$input-medium-height;
+ }
+
+ .el-input__icon {
+ line-height: var.$input-medium-height;
+ }
+ }
+ @include mixins.m(small) {
+ font-size: var.$input-small-font-size;
+
+ @include mixins.e(inner) {
+ height: var.$input-small-height;
+ line-height: var.$input-small-height;
+ }
+
+ .el-input__icon {
+ line-height: var.$input-small-height;
+ }
+ }
+ @include mixins.m(mini) {
+ font-size: var.$input-mini-font-size;
+
+ @include mixins.e(inner) {
+ height: var.$input-mini-height;
+ line-height: var.$input-mini-height;
+ }
+
+ .el-input__icon {
+ line-height: var.$input-mini-height;
+ }
+ }
+}
+
+@include mixins.b(input-group) {
+ line-height: normal;
+ display: inline-table;
+ width: 100%;
+ border-collapse: separate;
+ border-spacing: 0;
+
+ > .el-input__inner {
+ vertical-align: middle;
+ display: table-cell;
+ }
+
+ @include mixins.e((append, prepend)) {
+ background-color: var.$background-color-base;
+ color: var(--color-info);
+ vertical-align: middle;
+ display: table-cell;
+ position: relative;
+ border: var(--border-base);
+ border-radius: var.$input-border-radius;
+ padding: 0 10px;
+ width: 1px;
+ white-space: nowrap;
+ font-weight: var(--font-weight-regular);
+
+ &:focus {
+ outline: none;
+ }
+
+ .el-select,
+ .el-button {
+ display: inline-block;
+ margin: -10px -20px;
+ }
+
+ button.el-button,
+ div.el-select .el-input__inner,
+ div.el-select:hover .el-input__inner {
+ border-color: transparent;
+ background-color: transparent;
+ color: inherit;
+ border-top: 0;
+ border-bottom: 0;
+ }
+
+ .el-button,
+ .el-input {
+ font-size: inherit;
+ }
+ }
+
+ @include mixins.e(prepend) {
+ border-right: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+
+ @include mixins.e(append) {
+ border-left: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ @include mixins.m(prepend) {
+ .el-input__inner {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+ .el-select .el-input.is-focus .el-input__inner {
+ border-color: transparent;
+ }
+ }
+
+ @include mixins.m(append) {
+ .el-input__inner {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+ .el-select .el-input.is-focus .el-input__inner {
+ border-color: transparent;
+ }
+ }
+}
+
+/** disalbe default clear on IE */
+.el-input__inner::-ms-clear {
+ display: none;
+ width: 0;
+ height: 0;
+}
diff --git a/packages/design-system/theme/src/link.scss b/packages/design-system/theme/src/link.scss
new file mode 100644
index 0000000000..44051a781e
--- /dev/null
+++ b/packages/design-system/theme/src/link.scss
@@ -0,0 +1,80 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+$typeMap: (
+ primary: var.$link-primary-font-color,
+ danger: var.$link-danger-font-color,
+ success: var.$link-success-font-color,
+ warning: var.$link-warning-font-color,
+ info: var.$link-info-font-color,
+);
+
+@include mixins.b(link) {
+ display: inline-flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ vertical-align: middle;
+ position: relative;
+ text-decoration: none;
+ outline: none;
+ cursor: pointer;
+ padding: 0;
+ font-size: var.$link-font-size;
+ font-weight: var.$link-font-weight;
+
+ @include mixins.when(underline) {
+ &:hover:after {
+ content: '';
+ position: absolute;
+ left: 0;
+ right: 0;
+ height: 0;
+ bottom: 0;
+ border-bottom: 1px solid var.$link-default-active-color;
+ }
+ }
+
+ @include mixins.when(disabled) {
+ cursor: not-allowed;
+ }
+
+ & [class*='el-icon-'] {
+ & + span {
+ margin-left: 5px;
+ }
+ }
+
+ &.el-link--default {
+ color: var.$link-default-font-color;
+ &:hover {
+ color: var.$link-default-active-color;
+ }
+ &:after {
+ border-color: var.$link-default-active-color;
+ }
+ @include mixins.when(disabled) {
+ color: var.$link-disabled-font-color;
+ }
+ }
+
+ @each $type, $primaryColor in $typeMap {
+ &.el-link--#{$type} {
+ color: $primaryColor;
+ &:hover {
+ color: var.$color-primary-light-3;
+ }
+ &:after {
+ border-color: $primaryColor;
+ }
+ @include mixins.when(disabled) {
+ color: var.$color-primary-light-6;
+ }
+ @include mixins.when(underline) {
+ &:hover:after {
+ border-color: $primaryColor;
+ }
+ }
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/loading.scss b/packages/design-system/theme/src/loading.scss
new file mode 100644
index 0000000000..2bf4e20d78
--- /dev/null
+++ b/packages/design-system/theme/src/loading.scss
@@ -0,0 +1,96 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(loading-parent) {
+ @include mixins.m(relative) {
+ position: relative !important;
+ }
+
+ @include mixins.m(hidden) {
+ overflow: hidden !important;
+ }
+}
+
+@include mixins.b(loading-mask) {
+ position: absolute;
+ z-index: 2000;
+ background-color: rgba(255, 255, 255, 0.9);
+ margin: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ transition: opacity 0.3s;
+
+ @include mixins.when(fullscreen) {
+ position: fixed;
+
+ .el-loading-spinner {
+ margin-top: #{- var.$loading-fullscreen-spinner-size * 0.5};
+
+ .circular {
+ height: var.$loading-fullscreen-spinner-size;
+ width: var.$loading-fullscreen-spinner-size;
+ }
+ }
+ }
+}
+
+@include mixins.b(loading-spinner) {
+ top: 50%;
+ margin-top: #{- var.$loading-spinner-size * 0.5};
+ width: 100%;
+ text-align: center;
+ position: absolute;
+
+ .el-loading-text {
+ color: var(--color-primary);
+ margin: 3px 0;
+ font-size: 14px;
+ }
+
+ .circular {
+ height: var.$loading-spinner-size;
+ width: var.$loading-spinner-size;
+ animation: loading-rotate 2s linear infinite;
+ }
+
+ .path {
+ animation: loading-dash 1.5s ease-in-out infinite;
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: 0;
+ stroke-width: 2;
+ stroke: var(--color-primary);
+ stroke-linecap: round;
+ }
+
+ i {
+ color: var(--color-primary);
+ }
+}
+
+.el-loading-fade-enter,
+.el-loading-fade-leave-active {
+ opacity: 0;
+}
+
+@keyframes loading-rotate {
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes loading-dash {
+ 0% {
+ stroke-dasharray: 1, 200;
+ stroke-dashoffset: 0;
+ }
+ 50% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -40px;
+ }
+ 100% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -120px;
+ }
+}
diff --git a/packages/design-system/theme/src/main.scss b/packages/design-system/theme/src/main.scss
new file mode 100644
index 0000000000..ad71cd7f03
--- /dev/null
+++ b/packages/design-system/theme/src/main.scss
@@ -0,0 +1,12 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(main) {
+ // IE11 supports the element partially https://caniuse.com/#search=main
+ display: block;
+ flex: 1;
+ flex-basis: auto;
+ overflow: auto;
+ box-sizing: border-box;
+ padding: var.$main-padding;
+}
diff --git a/packages/design-system/theme/src/menu-item-group.scss b/packages/design-system/theme/src/menu-item-group.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/design-system/theme/src/menu-item.scss b/packages/design-system/theme/src/menu-item.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/design-system/theme/src/menu.scss b/packages/design-system/theme/src/menu.scss
new file mode 100644
index 0000000000..24fc102549
--- /dev/null
+++ b/packages/design-system/theme/src/menu.scss
@@ -0,0 +1,289 @@
+@use "mixins/mixins";
+@use "mixins/utils";
+@use "./common/var";
+@use "common/transition";
+
+@mixin menu-item {
+ height: 56px;
+ line-height: 56px;
+ font-size: var.$menu-item-font-size;
+ color: var.$menu-item-font-color;
+ padding: 0 20px;
+ list-style: none;
+ cursor: pointer;
+ position: relative;
+ transition: border-color 0.3s, background-color 0.3s, color 0.3s;
+ box-sizing: border-box;
+ white-space: nowrap;
+
+ * {
+ vertical-align: middle;
+ }
+
+ i {
+ color: var(--color-text-light);
+ }
+
+ &:hover,
+ &:focus {
+ outline: none;
+ background-color: var.$menu-item-hover-fill;
+ }
+
+ @include mixins.when(disabled) {
+ opacity: 0.25;
+ cursor: not-allowed;
+ background: none !important;
+ }
+}
+
+@include mixins.b(menu) {
+ border-right: solid 1px #e6e6e6;
+ list-style: none;
+ position: relative;
+ margin: 0;
+ padding-left: 0;
+ background-color: var.$menu-background-color;
+ @include utils.utils-clearfix;
+ &.el-menu--horizontal {
+ border-bottom: solid 1px #e6e6e6;
+ }
+
+ @include mixins.m(horizontal) {
+ border-right: none;
+ & > .el-menu-item {
+ float: left;
+ height: 60px;
+ line-height: 60px;
+ margin: 0;
+ border-bottom: 2px solid transparent;
+ color: var(--color-text-light);
+
+ a,
+ a:hover {
+ color: inherit;
+ }
+
+ &:not(.is-disabled):hover,
+ &:not(.is-disabled):focus {
+ background-color: #fff;
+ }
+ }
+ & > .el-submenu {
+ float: left;
+
+ &:focus,
+ &:hover {
+ outline: none;
+ .el-submenu__title {
+ color: var(--color-text-dark);
+ }
+ }
+
+ &.is-active {
+ .el-submenu__title {
+ border-bottom: 2px solid var(--color-primary);
+ color: var(--color-text-dark);
+ }
+ }
+
+ & .el-submenu__title {
+ height: 60px;
+ line-height: 60px;
+ border-bottom: 2px solid transparent;
+ color: var(--color-text-light);
+
+ &:hover {
+ background-color: #fff;
+ }
+ }
+ & .el-submenu__icon-arrow {
+ position: static;
+ vertical-align: middle;
+ margin-left: 8px;
+ margin-top: -3px;
+ }
+ }
+ & .el-menu {
+ & .el-menu-item,
+ & .el-submenu__title {
+ background-color: var.$color-white;
+ float: none;
+ height: 36px;
+ line-height: 36px;
+ padding: 0 10px;
+ color: var(--color-text-light);
+ }
+ & .el-menu-item.is-active,
+ & .el-submenu.is-active > .el-submenu__title {
+ color: var(--color-text-dark);
+ }
+ }
+ & .el-menu-item:not(.is-disabled):hover,
+ & .el-menu-item:not(.is-disabled):focus {
+ outline: none;
+ color: var(--color-text-dark);
+ }
+ & > .el-menu-item.is-active {
+ border-bottom: 2px solid var(--color-primary);
+ color: var(--color-text-dark);
+ }
+ }
+ @include mixins.m(collapse) {
+ width: 64px;
+
+ > .el-menu-item,
+ > .el-submenu > .el-submenu__title {
+ [class^='el-icon-'] {
+ margin: 0;
+ vertical-align: middle;
+ width: 24px;
+ text-align: center;
+ }
+ .el-submenu__icon-arrow {
+ display: none;
+ }
+ span {
+ height: 0;
+ width: 0;
+ overflow: hidden;
+ visibility: hidden;
+ display: inline-block;
+ }
+ }
+
+ > .el-menu-item.is-active i {
+ color: inherit;
+ }
+
+ .el-menu .el-submenu {
+ min-width: 200px;
+ }
+
+ .el-submenu {
+ position: relative;
+ & .el-menu {
+ position: absolute;
+ margin-left: 5px;
+ top: 0;
+ left: 100%;
+ z-index: 10;
+ border: 1px solid var(--border-color-base);
+ border-radius: var(--border-radius-small);
+ box-shadow: var.$box-shadow-light;
+ }
+
+ &.is-opened {
+ > .el-submenu__title .el-submenu__icon-arrow {
+ transform: none;
+ }
+ }
+ }
+ }
+ @include mixins.m(popup) {
+ z-index: 100;
+ min-width: 200px;
+ border: none;
+ padding: 5px 0;
+ border-radius: var(--border-radius-small);
+ box-shadow: var.$box-shadow-light;
+
+ &-bottom-start {
+ margin-top: 5px;
+ }
+ &-right-start {
+ margin-left: 5px;
+ margin-right: 5px;
+ }
+ }
+}
+@include mixins.b(menu-item) {
+ @include menu-item;
+
+ & [class^='el-icon-'] {
+ margin-right: 5px;
+ width: 24px;
+ text-align: center;
+ font-size: 18px;
+ vertical-align: middle;
+ }
+ @include mixins.when(active) {
+ color: var(--color-primary);
+ i {
+ color: inherit;
+ }
+ }
+}
+
+@include mixins.b(submenu) {
+ list-style: none;
+ margin: 0;
+ padding-left: 0;
+
+ @include mixins.e(title) {
+ @include menu-item;
+
+ &:hover {
+ background-color: var.$menu-item-hover-fill;
+ }
+ }
+ & .el-menu {
+ border: none;
+ }
+ & .el-menu-item {
+ height: 50px;
+ line-height: 50px;
+ padding: 0 45px;
+ min-width: 200px;
+ }
+ @include mixins.e(icon-arrow) {
+ position: absolute;
+ top: 50%;
+ right: 20px;
+ margin-top: -7px;
+ transition: transform 0.3s;
+ font-size: 12px;
+ }
+ @include mixins.when(active) {
+ .el-submenu__title {
+ border-bottom-color: var(--color-primary);
+ }
+ }
+ @include mixins.when(opened) {
+ > .el-submenu__title .el-submenu__icon-arrow {
+ transform: rotateZ(180deg);
+ }
+ }
+ @include mixins.when(disabled) {
+ .el-submenu__title,
+ .el-menu-item {
+ opacity: 0.25;
+ cursor: not-allowed;
+ background: none !important;
+ }
+ }
+ [class^='el-icon-'] {
+ vertical-align: middle;
+ margin-right: 5px;
+ width: 24px;
+ text-align: center;
+ font-size: 18px;
+ }
+}
+
+@include mixins.b(menu-item-group) {
+ > ul {
+ padding: 0;
+ }
+ @include mixins.e(title) {
+ padding: 7px 0 7px 20px;
+ line-height: normal;
+ font-size: 12px;
+ color: var(--color-text-light);
+ }
+}
+
+.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow {
+ transition: 0.2s;
+ opacity: 0;
+}
diff --git a/packages/design-system/theme/src/message-box.scss b/packages/design-system/theme/src/message-box.scss
new file mode 100644
index 0000000000..06b83ab885
--- /dev/null
+++ b/packages/design-system/theme/src/message-box.scss
@@ -0,0 +1,237 @@
+@use "mixins/mixins";
+@use "mixins/button";
+@use "./common/var";
+@use "common/popup";
+@use "button" as buttons;
+@use "input";
+
+@include mixins.b(message-box) {
+ display: inline-block;
+ width: var.$msgbox-width;
+ padding-bottom: 10px;
+ vertical-align: middle;
+ background-color: var.$color-white;
+ border-radius: var.$msgbox-border-radius;
+ border: 1px solid var(--border-color-light);
+ font-size: var.$messagebox-font-size;
+ box-shadow: var.$box-shadow-light;
+ text-align: left;
+ overflow: hidden;
+ backface-visibility: hidden;
+
+ @include mixins.e(wrapper) {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ text-align: center;
+
+ &::after {
+ content: '';
+ display: inline-block;
+ height: 100%;
+ width: 0;
+ vertical-align: middle;
+ }
+ }
+
+ @include mixins.e(header) {
+ position: relative;
+ padding: var.$msgbox-padding-primary;
+ padding-bottom: 10px;
+ }
+
+ @include mixins.e(title) {
+ padding-left: 0;
+ margin-bottom: 0;
+ font-size: var.$messagebox-font-size;
+ line-height: 1;
+ color: var.$messagebox-title-color;
+ }
+
+ @include mixins.e(headerbtn) {
+ position: absolute;
+ top: var.$msgbox-padding-primary;
+ right: var.$msgbox-padding-primary;
+ padding: 0;
+ border: none;
+ outline: none;
+ background: transparent;
+ font-size: var.$message-close-size;
+ cursor: pointer;
+
+ .el-message-box__close {
+ color: var(--color-info);
+ }
+
+ &:focus,
+ &:hover {
+ .el-message-box__close {
+ color: var(--color-primary);
+ }
+ }
+ }
+
+ @include mixins.e(content) {
+ padding: 10px var.$msgbox-padding-primary;
+ color: var.$messagebox-content-color;
+ font-size: var.$messagebox-content-font-size;
+ }
+
+ @include mixins.e(container) {
+ position: relative;
+ }
+
+ @include mixins.e(input) {
+ padding-top: 15px;
+
+ & input.invalid {
+ border-color: var(--color-danger);
+ &:focus {
+ border-color: var(--color-danger);
+ }
+ }
+ }
+
+ @include mixins.e(status) {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ font-size: 24px !important;
+
+ &::before {
+ // 防止图标切割
+ padding-left: 1px;
+ }
+
+ + .el-message-box__message {
+ padding-left: 36px;
+ padding-right: 12px;
+ }
+
+ &.el-icon-success {
+ color: var.$messagebox-success-color;
+ }
+
+ &.el-icon-info {
+ color: var.$messagebox-info-color;
+ }
+
+ &.el-icon-warning {
+ color: var.$messagebox-warning-color;
+ }
+
+ &.el-icon-error {
+ color: var.$messagebox-danger-color;
+ }
+ }
+
+ @include mixins.e(message) {
+ margin: 0;
+
+ & p {
+ margin: 0;
+ line-height: 24px;
+ }
+ }
+
+ @include mixins.e(errormsg) {
+ color: var(--color-danger);
+ font-size: var.$messagebox-error-font-size;
+ min-height: 18px;
+ margin-top: 2px;
+ }
+
+ @include mixins.e(btns) {
+ padding: 5px 15px 0;
+ text-align: right;
+
+ & button {
+ margin-left: 10px;
+ }
+
+ & .btn--confirm {
+ @include button.button-just-primary();
+ @include button.button-medium();
+ }
+
+ & .btn--cancel {
+ @include button.button-outline();
+ @include button.button-medium();
+ }
+ }
+
+ @include mixins.e(btns-reverse) {
+ flex-direction: row-reverse;
+ }
+
+ // centerAlign 布局
+ @include mixins.m(center) {
+ padding-bottom: 30px;
+
+ @include mixins.e(header) {
+ padding-top: 30px;
+ }
+
+ @include mixins.e(title) {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ @include mixins.e(status) {
+ position: relative;
+ top: auto;
+ padding-right: 5px;
+ text-align: center;
+ transform: translateY(-1px);
+ }
+
+ @include mixins.e(message) {
+ margin-left: 0;
+ }
+
+ @include mixins.e((btns, content)) {
+ text-align: center;
+ }
+
+ @include mixins.e(content) {
+ $padding-horizontal: var.$msgbox-padding-primary + 12px;
+
+ padding-left: $padding-horizontal;
+ padding-right: $padding-horizontal;
+ }
+ }
+}
+
+.msgbox-fade-enter-active {
+ animation: msgbox-fade-in 0.3s;
+}
+
+.msgbox-fade-leave-active {
+ animation: msgbox-fade-out 0.3s;
+}
+
+@keyframes msgbox-fade-in {
+ 0% {
+ transform: translate3d(0, -20px, 0);
+ opacity: 0;
+ }
+ 100% {
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+}
+
+@keyframes msgbox-fade-out {
+ 0% {
+ transform: translate3d(0, 0, 0);
+ opacity: 1;
+ }
+ 100% {
+ transform: translate3d(0, -20px, 0);
+ opacity: 0;
+ }
+}
diff --git a/packages/design-system/theme/src/message.scss b/packages/design-system/theme/src/message.scss
new file mode 100644
index 0000000000..0ecffb84e7
--- /dev/null
+++ b/packages/design-system/theme/src/message.scss
@@ -0,0 +1,120 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(message) {
+ min-width: var.$message-min-width;
+ box-sizing: border-box;
+ border-radius: var(--border-radius-base);
+ border-width: var(--border-width-base);
+ border-style: var(--border-style-base);
+ border-color: var(--border-color-light);
+ position: fixed;
+ left: 50%;
+ top: 20px;
+ transform: translateX(-50%);
+ background-color: var.$message-background-color;
+ transition: opacity 0.3s, transform 0.4s, top 0.4s;
+ overflow: hidden;
+ padding: var.$message-padding;
+ display: flex;
+ align-items: center;
+
+ @include mixins.when(center) {
+ justify-content: center;
+ }
+
+ @include mixins.when(closable) {
+ .el-message__content {
+ padding-right: 16px;
+ }
+ }
+
+ p {
+ margin: 0;
+ }
+
+ @include mixins.m(info) {
+ .el-message__content {
+ color: var.$message-info-font-color;
+ }
+ }
+
+ @include mixins.m(success) {
+ background-color: var.$color-success-lighter;
+ border-color: var.$color-success-light;
+
+ .el-message__content {
+ color: var.$message-success-font-color;
+ }
+ }
+
+ @include mixins.m(warning) {
+ background-color: var.$color-warning-lighter;
+ border-color: var.$color-warning-light;
+
+ .el-message__content {
+ color: var.$message-warning-font-color;
+ }
+ }
+
+ @include mixins.m(error) {
+ background-color: var.$color-danger-lighter;
+ border-color: var.$color-danger-light;
+
+ .el-message__content {
+ color: var.$message-danger-font-color;
+ }
+ }
+
+ @include mixins.e(icon) {
+ margin-right: 10px;
+ }
+
+ @include mixins.e(content) {
+ padding: 0;
+ font-size: 14px;
+ line-height: 1;
+ &:focus {
+ outline-width: 0;
+ }
+ }
+
+ @include mixins.e(closeBtn) {
+ position: absolute;
+ top: 50%;
+ right: 15px;
+ transform: translateY(-50%);
+ cursor: pointer;
+ color: var.$message-close-icon-color;
+ font-size: var.$message-close-size;
+
+ &:focus {
+ outline-width: 0;
+ }
+ &:hover {
+ color: var.$message-close-hover-color;
+ }
+ }
+
+ & .el-icon-success {
+ color: var.$message-success-font-color;
+ }
+
+ & .el-icon-error {
+ color: var.$message-danger-font-color;
+ }
+
+ & .el-icon-info {
+ color: var.$message-info-font-color;
+ }
+
+ & .el-icon-warning {
+ color: var.$message-warning-font-color;
+ }
+}
+
+.el-message-fade-enter,
+.el-message-fade-leave-active {
+ opacity: 0;
+ transform: translate(-50%, -100%);
+}
diff --git a/packages/design-system/theme/src/mixins/_button.scss b/packages/design-system/theme/src/mixins/_button.scss
new file mode 100644
index 0000000000..35e7d8af6c
--- /dev/null
+++ b/packages/design-system/theme/src/mixins/_button.scss
@@ -0,0 +1,170 @@
+@use "../common/var";
+@use './mixins';
+@use "function";
+
+@mixin button-plain($color, $h, $s, $l) {
+ &,
+ &:focus,
+ &:hover {
+ color: hsl(var(#{$h}), var(#{$s}), var(#{$l}));
+ background-color: var(--color-foreground-xlight);
+ border-color: hsl(var(#{$h}), var(#{$s}), var(#{$l}));
+ }
+
+ @include mixins.when(loading) {
+ color: function.lightness($h, $s, $l, var.$button-hover-tint-percent);
+ background-color: var(--color-foreground-xlight);
+ border-color: function.lightness(
+ $h,
+ $s,
+ $l,
+ var.$button-hover-tint-percent
+ );
+ }
+
+ &:active {
+ border-color: function.lightness(
+ $h,
+ $s,
+ $l,
+ -(var.$button-active-shade-percent)
+ );
+ background-color: var(--color-foreground-xlight);
+ color: function.lightness($h, $s, $l, -(var.$button-active-shade-percent));
+ outline: none;
+ }
+
+ &.is-disabled {
+ &,
+ &:hover,
+ &:focus,
+ &:active {
+ color: var(--color-text-light);
+ background-color: var(--color-foreground-xlight);
+ border-color: var(--color-foreground-base);
+ }
+ }
+}
+
+@mixin button-variant(
+ $color,
+ $background-color,
+ $border-color,
+ $h,
+ $s,
+ $l,
+ $t,
+ $plain: true
+) {
+ color: $color;
+ background-color: hsl(var(#{$h}), var(#{$s}), var(#{$l}));
+ border-color: hsl(var(#{$h}), var(#{$s}), var(#{$l}));
+
+ &:active {
+ background: function.lightness(
+ $h,
+ $s,
+ $l,
+ -(var.$button-active-shade-percent)
+ );
+ border-color: function.lightness(
+ $h,
+ $s,
+ $l,
+ -(var.$button-active-shade-percent)
+ );
+ color: $color;
+ outline: none;
+ }
+
+ &.is-active {
+ background: function.lightness(
+ $h,
+ $s,
+ $l,
+ -(var.$button-active-shade-percent)
+ );
+ border-color: function.lightness(
+ $h,
+ $s,
+ $l,
+ -(var.$button-active-shade-percent)
+ );
+ color: $color;
+ }
+
+ &.is-light {
+ color: hsl(var(#{$h}), var(#{$s}), var(#{$l}));
+ background-color: hsl(var(#{$h}), var(#{$s}), var(#{$t}));
+ border-color: hsl(var(#{$h}), var(#{$s}), var(#{$t}));
+ }
+
+ &.is-disabled {
+ &,
+ &:hover,
+ &:focus,
+ &:active {
+ color: var(--color-text-light);
+ background-color: var(--color-foreground-base);
+ border-color: var(--color-foreground-base);
+ }
+ }
+
+ @if $plain {
+ &.is-plain {
+ @include button-plain($background-color, $h, $s, $l);
+ }
+ }
+}
+
+@mixin button-size($padding-vertical, $padding-horizontal, $font-size) {
+ padding: $padding-vertical $padding-horizontal;
+ font-size: $font-size;
+
+ &.is-round {
+ padding: $padding-vertical $padding-horizontal;
+ }
+}
+
+@mixin button-round() {
+ --button-border-radius: 20px;
+}
+
+// ignore plain overrides
+@mixin button-just-primary() {
+ @include button-variant(
+ var.$button-primary-font-color,
+ var.$button-primary-background-color,
+ var.$button-primary-border-color,
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ --color-primary-tint-2-l,
+ $plain: false
+ );
+}
+
+@mixin button-outline() {
+ @include button-plain(
+ var.$button-primary-background-color,
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l
+ );
+}
+
+@mixin button-small() {
+ @include button-size(
+ var(--spacing-3xs),
+ var(--spacing-xs),
+ var(--font-size-2xs)
+ );
+}
+
+@mixin button-medium() {
+ @include button-size(
+ var(--spacing-2xs),
+ var(--spacing-xs),
+ var(--font-size-2xs)
+ );
+}
diff --git a/packages/design-system/theme/src/mixins/config.scss b/packages/design-system/theme/src/mixins/config.scss
new file mode 100644
index 0000000000..87e29b458c
--- /dev/null
+++ b/packages/design-system/theme/src/mixins/config.scss
@@ -0,0 +1,4 @@
+$namespace: 'el';
+$element-separator: '__';
+$modifier-separator: '--';
+$state-prefix: 'is-';
diff --git a/packages/design-system/theme/src/mixins/function.scss b/packages/design-system/theme/src/mixins/function.scss
new file mode 100644
index 0000000000..388f28d1ac
--- /dev/null
+++ b/packages/design-system/theme/src/mixins/function.scss
@@ -0,0 +1,54 @@
+@use "sass:meta";
+@use "sass:string";
+@use "config";
+
+/* BEM support Func
+ -------------------------- */
+@function selectorToString($selector) {
+ $selector: meta.inspect($selector);
+ $selector: string.slice($selector, 2, -2);
+ @return $selector;
+}
+
+@function containsModifier($selector) {
+ $selector: selectorToString($selector);
+
+ @if string.index($selector, config.$modifier-separator) {
+ @return true;
+ } @else {
+ @return false;
+ }
+}
+
+@function containWhenFlag($selector) {
+ $selector: selectorToString($selector);
+
+ @if string.index($selector, '.' + config.$state-prefix) {
+ @return true;
+ } @else {
+ @return false;
+ }
+}
+
+@function containPseudoClass($selector) {
+ $selector: selectorToString($selector);
+
+ @if string.index($selector, ':') {
+ @return true;
+ } @else {
+ @return false;
+ }
+}
+
+@function hitAllSpecialNestRule($selector) {
+ @return containsModifier($selector) or containWhenFlag($selector) or
+ containPseudoClass($selector);
+}
+
+@function lightness($h, $s, $l, $lightness) {
+ @return hsl(var(#{$h}), var(#{$s}), calc(var(#{$l}) + #{$lightness}));
+}
+
+@function saturation($h, $s, $l, $saturation) {
+ @return hsl(var(#{$h}), calc(var(#{$s}) + #{$saturation}), var(#{$l}));
+}
diff --git a/packages/design-system/theme/src/mixins/mixins.scss b/packages/design-system/theme/src/mixins/mixins.scss
new file mode 100644
index 0000000000..b13964a0bd
--- /dev/null
+++ b/packages/design-system/theme/src/mixins/mixins.scss
@@ -0,0 +1,209 @@
+@use "sass:map";
+@use "sass:meta";
+@use "function";
+@use "../common/var";
+@use "config";
+
+/* Break-points
+ -------------------------- */
+@mixin res($key, $map: var.$breakpoints) {
+ // 循环断点Map,如果存在则返回
+ @if map.has-key($map, $key) {
+ @media only screen and #{meta.inspect(map.get($map, $key))} {
+ @content;
+ }
+ } @else {
+ @warn "Undefeined points: `#{$map}`";
+ }
+}
+
+/* Scrollbar
+ -------------------------- */
+@mixin scroll-bar {
+ $scrollbar-thumb-background: #b4bccc;
+ $scrollbar-track-background: #fff;
+
+ &::-webkit-scrollbar {
+ z-index: 11;
+ width: 6px;
+
+ &:horizontal {
+ height: 6px;
+ }
+
+ &-thumb {
+ border-radius: 5px;
+ width: 6px;
+ background: $scrollbar-thumb-background;
+ }
+
+ &-corner {
+ background: $scrollbar-track-background;
+ }
+
+ &-track {
+ background: $scrollbar-track-background;
+
+ &-piece {
+ background: $scrollbar-track-background;
+ width: 6px;
+ }
+ }
+ }
+}
+
+/* Placeholder
+ -------------------------- */
+@mixin placeholder {
+ &::-webkit-input-placeholder {
+ @content;
+ }
+
+ &::-moz-placeholder {
+ @content;
+ }
+
+ &:-ms-input-placeholder {
+ @content;
+ }
+}
+
+/* BEM
+ -------------------------- */
+@mixin b($block) {
+ $B: config.$namespace + '-' + $block !global;
+
+ .#{$B} {
+ @content;
+ }
+}
+
+@mixin e($element) {
+ $E: $element !global;
+ $selector: &;
+ $currentSelector: '';
+ @each $unit in $element {
+ $currentSelector: #{$currentSelector +
+ '.' +
+ $B +
+ config.$element-separator +
+ $unit +
+ ','};
+ }
+
+ @if function.hitAllSpecialNestRule($selector) {
+ @at-root {
+ #{$selector} {
+ #{$currentSelector} {
+ @content;
+ }
+ }
+ }
+ } @else {
+ @at-root {
+ #{$currentSelector} {
+ @content;
+ }
+ }
+ }
+}
+
+@mixin m($modifier) {
+ $selector: &;
+ $currentSelector: '';
+ @each $unit in $modifier {
+ $currentSelector: #{$currentSelector +
+ & +
+ config.$modifier-separator +
+ $unit +
+ ','};
+ }
+
+ @at-root {
+ #{$currentSelector} {
+ @content;
+ }
+ }
+}
+
+@mixin configurable-m($modifier, $E-flag: false) {
+ $selector: &;
+ $interpolation: '';
+
+ @if $E-flag {
+ $interpolation: config.$element-separator + $E-flag;
+ }
+
+ @at-root {
+ #{$selector} {
+ .#{$B + $interpolation + config.$modifier-separator + $modifier} {
+ @content;
+ }
+ }
+ }
+}
+
+@mixin spec-selector(
+ $specSelector: '',
+ $element: $E,
+ $modifier: false,
+ $block: $B
+) {
+ $modifierCombo: '';
+
+ @if $modifier {
+ $modifierCombo: config.$modifier-separator + $modifier;
+ }
+
+ @at-root {
+ #{&}#{$specSelector}.#{$block
+ + config.$element-separator
+ + $element
+ + $modifierCombo} {
+ @content;
+ }
+ }
+}
+
+@mixin meb($modifier: false, $element: $E, $block: $B) {
+ $selector: &;
+ $modifierCombo: '';
+
+ @if $modifier {
+ $modifierCombo: config.$modifier-separator + $modifier;
+ }
+
+ @at-root {
+ #{$selector} {
+ .#{$block + config.$element-separator + $element + $modifierCombo} {
+ @content;
+ }
+ }
+ }
+}
+
+@mixin when($state) {
+ @at-root {
+ &.#{config.$state-prefix + $state} {
+ @content;
+ }
+ }
+}
+
+@mixin extend-rule($name) {
+ @extend #{'%shared-' + $name};
+}
+
+@mixin share-rule($name) {
+ $rule-name: '%shared-' + $name;
+
+ @at-root #{$rule-name} {
+ @content;
+ }
+}
+
+@mixin pseudo($pseudo) {
+ @at-root #{&}#{':#{$pseudo}'} {
+ @content;
+ }
+}
diff --git a/packages/design-system/theme/src/mixins/utils.scss b/packages/design-system/theme/src/mixins/utils.scss
new file mode 100644
index 0000000000..e86ede1e4a
--- /dev/null
+++ b/packages/design-system/theme/src/mixins/utils.scss
@@ -0,0 +1,39 @@
+@mixin utils-user-select($value) {
+ -moz-user-select: $value;
+ -webkit-user-select: $value;
+ -ms-user-select: $value;
+}
+
+@mixin utils-clearfix {
+ $selector: &;
+
+ @at-root {
+ #{$selector}::before,
+ #{$selector}::after {
+ display: table;
+ content: '';
+ }
+ #{$selector}::after {
+ clear: both;
+ }
+ }
+}
+
+@mixin utils-vertical-center {
+ $selector: &;
+
+ @at-root {
+ #{$selector}::after {
+ display: inline-block;
+ content: '';
+ height: 100%;
+ vertical-align: middle;
+ }
+ }
+}
+
+@mixin utils-ellipsis {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
diff --git a/packages/design-system/theme/src/notification.scss b/packages/design-system/theme/src/notification.scss
new file mode 100644
index 0000000000..e1d851664b
--- /dev/null
+++ b/packages/design-system/theme/src/notification.scss
@@ -0,0 +1,100 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(notification) {
+ display: flex;
+ width: var.$notification-width;
+ padding: var.$notification-padding;
+ border-radius: var.$notification-radius;
+ box-sizing: border-box;
+ border: 1px solid var.$notification-border-color;
+ position: fixed;
+ background-color: var.$color-white;
+ box-shadow: var.$notification-shadow;
+ transition: opacity 0.3s, transform 0.3s, left 0.3s, right 0.3s, top 0.4s,
+ bottom 0.3s;
+ overflow: hidden;
+
+ &.right {
+ right: 16px;
+ }
+
+ &.left {
+ left: 16px;
+ }
+
+ @include mixins.e(group) {
+ margin-left: var.$notification-group-margin-left;
+ margin-right: var.$notification-group-margin-right;
+ }
+
+ @include mixins.e(title) {
+ font-weight: bold;
+ font-size: var.$notification-title-font-size;
+ color: var.$notification-title-color;
+ margin: 0;
+ }
+
+ @include mixins.e(content) {
+ font-size: var.$notification-content-font-size;
+ line-height: 21px;
+ margin: 6px 0 0 0;
+ color: var.$notification-content-color;
+ text-align: justify;
+
+ p {
+ margin: 0;
+ }
+ }
+
+ @include mixins.e(icon) {
+ height: var.$notification-icon-size;
+ width: var.$notification-icon-size;
+ font-size: var.$notification-icon-size;
+ }
+
+ @include mixins.e(closeBtn) {
+ position: absolute;
+ top: 18px;
+ right: 15px;
+ cursor: pointer;
+ color: var.$notification-close-color;
+ font-size: var.$notification-close-font-size;
+
+ &:hover {
+ color: var.$notification-close-hover-color;
+ }
+ }
+
+ .el-icon-success {
+ color: var.$notification-success-icon-color;
+ }
+
+ .el-icon-error {
+ color: var.$notification-danger-icon-color;
+ }
+
+ .el-icon-info {
+ color: var.$notification-info-icon-color;
+ }
+
+ .el-icon-warning {
+ color: var.$notification-warning-icon-color;
+ }
+}
+
+.el-notification-fade-enter {
+ &.right {
+ right: 0;
+ transform: translateX(100%);
+ }
+
+ &.left {
+ left: 0;
+ transform: translateX(-100%);
+ }
+}
+
+.el-notification-fade-leave-active {
+ opacity: 0;
+}
diff --git a/packages/design-system/theme/src/option-group.scss b/packages/design-system/theme/src/option-group.scss
new file mode 100644
index 0000000000..84c37badf5
--- /dev/null
+++ b/packages/design-system/theme/src/option-group.scss
@@ -0,0 +1,42 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(select-group) {
+ $gap: 20px;
+
+ margin: 0;
+ padding: 0;
+
+ @include mixins.e(wrap) {
+ position: relative;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+
+ &:not(:last-of-type) {
+ padding-bottom: 24px;
+
+ &::after {
+ content: '';
+ position: absolute;
+ display: block;
+ left: $gap;
+ right: $gap;
+ bottom: 12px;
+ height: 1px;
+ background: var(--border-color-base);
+ }
+ }
+ }
+
+ @include mixins.e(title) {
+ padding-left: $gap;
+ font-size: var.$select-group-font-size;
+ color: var.$select-group-color;
+ line-height: var.$select-group-height;
+ }
+
+ & .el-select-dropdown__item {
+ padding-left: $gap;
+ }
+}
diff --git a/packages/design-system/theme/src/option.scss b/packages/design-system/theme/src/option.scss
new file mode 100644
index 0000000000..97d16f59fc
--- /dev/null
+++ b/packages/design-system/theme/src/option.scss
@@ -0,0 +1,40 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(select-dropdown) {
+ @include mixins.e(item) {
+ font-size: var.$select-font-size;
+ padding: 0 20px;
+ position: relative;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ color: var.$select-option-color;
+ min-height: var.$select-option-height;
+ height: auto;
+ line-height: var.$select-option-height;
+ box-sizing: border-box;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+
+ @include mixins.when(disabled) {
+ color: var.$select-option-disabled-color;
+ cursor: not-allowed;
+
+ &:hover {
+ background-color: var.$color-white;
+ }
+ }
+
+ &.hover,
+ &:hover {
+ background-color: var.$select-option-hover-background;
+ }
+
+ &.selected {
+ color: var.$select-option-selected-font-color;
+ font-weight: bold;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/page-header.scss b/packages/design-system/theme/src/page-header.scss
new file mode 100644
index 0000000000..e15c6728fd
--- /dev/null
+++ b/packages/design-system/theme/src/page-header.scss
@@ -0,0 +1,41 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(page-header) {
+ display: flex;
+ line-height: 24px;
+
+ @include mixins.e(left) {
+ display: flex;
+ cursor: pointer;
+ margin-right: 40px;
+ position: relative;
+
+ &::after {
+ content: '';
+ position: absolute;
+ width: 1px;
+ height: 16px;
+ right: -20px;
+ top: 50%;
+ transform: translateY(-50%);
+ background-color: var(--border-color-base);
+ }
+
+ .el-icon-back {
+ font-size: 18px;
+ margin-right: 6px;
+ align-self: center;
+ }
+
+ @include mixins.e(title) {
+ font-size: 14px;
+ font-weight: 500;
+ }
+ }
+
+ @include mixins.e(content) {
+ font-size: 18px;
+ color: var(--color-text-dark);
+ }
+}
diff --git a/packages/design-system/theme/src/pagination.scss b/packages/design-system/theme/src/pagination.scss
new file mode 100644
index 0000000000..0bc3c1352d
--- /dev/null
+++ b/packages/design-system/theme/src/pagination.scss
@@ -0,0 +1,296 @@
+@use "mixins/mixins";
+@use "mixins/utils";
+@use "./common/var";
+@use "select";
+
+@include mixins.b(pagination) {
+ white-space: nowrap;
+ padding: 2px 5px;
+ color: var.$pagination-font-color;
+ font-weight: bold;
+ @include utils.utils-clearfix;
+
+ span:not([class*='suffix']),
+ button {
+ display: inline-block;
+ font-size: var.$pagination-font-size;
+ min-width: var.$pagination-button-width;
+ height: var.$pagination-button-height;
+ line-height: var.$pagination-button-height;
+ vertical-align: top;
+ box-sizing: border-box;
+ }
+
+ .el-input__inner {
+ text-align: center;
+ -moz-appearance: textfield;
+ line-height: normal;
+ }
+
+ // pagesize 的下拉 icon
+ .el-input__suffix {
+ right: 0;
+ transform: scale(0.8);
+ }
+
+ .el-select .el-input {
+ width: 100px;
+ margin: 0 5px;
+
+ .el-input__inner {
+ padding-right: 25px;
+ border-radius: var.$pagination-border-radius;
+ }
+ }
+
+ button {
+ border: none;
+ padding: 0 6px;
+ background: transparent;
+
+ &:focus {
+ outline: none;
+ }
+
+ &:hover {
+ color: var.$pagination-hover-color;
+ }
+
+ &:disabled {
+ color: var.$pagination-button-disabled-color;
+ background-color: var.$pagination-button-disabled-background-color;
+ cursor: not-allowed;
+ }
+ }
+
+ .btn-prev,
+ .btn-next {
+ background: center center no-repeat;
+ background-size: 16px;
+ background-color: var.$pagination-background-color;
+ cursor: pointer;
+ margin: 0;
+ color: var.$pagination-button-color;
+
+ .el-icon {
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ }
+ }
+
+ .btn-prev {
+ padding-right: 12px;
+ }
+
+ .btn-next {
+ padding-left: 12px;
+ }
+
+ .el-pager li.disabled {
+ color: var(--color-text-lighter);
+ cursor: not-allowed;
+ }
+
+ @include mixins.m(small) {
+ .btn-prev,
+ .btn-next,
+ .el-pager li,
+ .el-pager li.btn-quicknext,
+ .el-pager li.btn-quickprev,
+ .el-pager li:last-child {
+ border-color: transparent;
+ font-size: 12px;
+ line-height: 22px;
+ height: 22px;
+ min-width: 22px;
+ }
+
+ .arrow.disabled {
+ visibility: hidden;
+ }
+
+ .more::before,
+ li.more::before {
+ line-height: 24px;
+ }
+
+ span:not([class*='suffix']),
+ button {
+ height: 22px;
+ line-height: 22px;
+ }
+
+ @include mixins.e(editor) {
+ height: 22px;
+ &.el-input .el-input__inner {
+ height: 22px;
+ }
+ }
+ }
+
+ @include mixins.e(sizes) {
+ margin: 0 10px 0 0;
+ font-weight: normal;
+ color: var(--color-text-dark);
+
+ .el-input .el-input__inner {
+ font-size: var.$pagination-font-size;
+ padding-left: 8px;
+
+ &:hover {
+ border-color: var.$pagination-hover-color;
+ }
+ }
+ }
+
+ @include mixins.e(total) {
+ margin-right: 10px;
+ font-weight: normal;
+ color: var(--color-text-dark);
+ }
+
+ @include mixins.e(jump) {
+ margin-left: 24px;
+ font-weight: normal;
+ color: var(--color-text-dark);
+
+ .el-input__inner {
+ padding: 0 3px;
+ }
+ }
+
+ @include mixins.e(rightwrapper) {
+ float: right;
+ }
+
+ @include mixins.e(editor) {
+ line-height: 18px;
+ padding: 0 2px;
+ height: var.$pagination-button-height;
+
+ text-align: center;
+ margin: 0 2px;
+ box-sizing: border-box;
+ border-radius: var.$pagination-border-radius;
+
+ &.el-input {
+ width: 50px;
+ }
+
+ &.el-input .el-input__inner {
+ height: var.$pagination-button-height;
+ }
+
+ .el-input__inner::-webkit-inner-spin-button,
+ .el-input__inner::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+ }
+ }
+
+ @include mixins.when(background) {
+ .btn-prev,
+ .btn-next,
+ .el-pager li {
+ margin: 0 5px;
+ background-color: var.$color-info-lighter;
+ color: var(--color-text-dark);
+ min-width: 30px;
+ border-radius: 2px;
+
+ &.disabled {
+ color: var(--color-text-lighter);
+ }
+ }
+
+ .btn-prev,
+ .btn-next {
+ padding: 0;
+
+ &:disabled {
+ color: var(--color-text-lighter);
+ }
+ }
+
+ .el-pager li:not(.disabled) {
+ &:hover {
+ color: var.$pagination-hover-color;
+ }
+
+ &.active {
+ background-color: var(--color-primary);
+ color: var.$color-white;
+ }
+ }
+
+ &.el-pagination--small {
+ .btn-prev,
+ .btn-next,
+ .el-pager li {
+ margin: 0 3px;
+ min-width: 22px;
+ }
+ }
+ }
+}
+
+@include mixins.b(pager) {
+ user-select: none;
+ list-style: none;
+ display: inline-block;
+ vertical-align: top;
+ font-size: 0;
+ padding: 0;
+ margin: 0;
+
+ .more::before {
+ line-height: 30px;
+ }
+
+ li {
+ padding: 0 4px;
+ background: var.$pagination-background-color;
+ vertical-align: top;
+ display: inline-block;
+ font-size: var.$pagination-font-size;
+ min-width: var.$pagination-button-width;
+ height: var.$pagination-button-height;
+ line-height: var.$pagination-button-height;
+ cursor: pointer;
+ box-sizing: border-box;
+ text-align: center;
+ margin: 0;
+
+ &.btn-quicknext,
+ &.btn-quickprev {
+ line-height: 28px;
+ color: var.$pagination-button-color;
+
+ &.disabled {
+ color: var(--color-text-lighter);
+ }
+ }
+
+ &.btn-quickprev:hover {
+ cursor: pointer;
+ }
+
+ &.btn-quicknext:hover {
+ cursor: pointer;
+ }
+
+ &.active + li {
+ border-left: 0;
+ }
+
+ &:hover {
+ color: var.$pagination-hover-color;
+ }
+
+ &.active {
+ color: var.$pagination-hover-color;
+ cursor: default;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/popconfirm.scss b/packages/design-system/theme/src/popconfirm.scss
new file mode 100644
index 0000000000..7f63e94f5f
--- /dev/null
+++ b/packages/design-system/theme/src/popconfirm.scss
@@ -0,0 +1,16 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(popconfirm) {
+ @include mixins.e(main) {
+ display: flex;
+ align-items: center;
+ }
+ @include mixins.e(icon) {
+ margin-right: 5px;
+ }
+ @include mixins.e(action) {
+ text-align: right;
+ margin: 0;
+ }
+}
diff --git a/packages/design-system/theme/src/popover.scss b/packages/design-system/theme/src/popover.scss
new file mode 100644
index 0000000000..f8dc582ab3
--- /dev/null
+++ b/packages/design-system/theme/src/popover.scss
@@ -0,0 +1,42 @@
+@use "mixins/mixins";
+@use "./common/var";
+@use "./popper";
+
+@include mixins.b(popover) {
+ position: absolute;
+ background: var.$popover-background-color;
+ min-width: 150px;
+ border-radius: 4px;
+ border: 1px solid var.$popover-border-color;
+ padding: var.$popover-padding;
+ z-index: var.$index-popper;
+ color: var(--color-text-dark);
+ line-height: 1.4;
+ text-align: justify;
+ font-size: var.$popover-font-size;
+ box-shadow: var.$box-shadow-light;
+ word-break: break-all;
+
+ @include mixins.m(plain) {
+ padding: var.$popover-padding-large;
+ }
+
+ @include mixins.e(title) {
+ color: var.$popover-title-font-color;
+ font-size: var.$popover-title-font-size;
+ line-height: 1;
+ margin-bottom: 12px;
+ }
+
+ @include mixins.e(reference) {
+ &:focus:not(.focusing),
+ &:focus:hover {
+ outline-width: 0;
+ }
+ }
+
+ &:focus:active,
+ &:focus {
+ outline-width: 0;
+ }
+}
diff --git a/packages/design-system/theme/src/popper.scss b/packages/design-system/theme/src/popper.scss
new file mode 100644
index 0000000000..f1e1fc1e88
--- /dev/null
+++ b/packages/design-system/theme/src/popper.scss
@@ -0,0 +1,101 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(popper) {
+ .popper__arrow,
+ .popper__arrow::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+ }
+
+ .popper__arrow {
+ border-width: var.$popover-arrow-size;
+ filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
+ }
+
+ .popper__arrow::after {
+ content: ' ';
+ border-width: var.$popover-arrow-size;
+ }
+
+ &[x-placement^='top'] {
+ margin-bottom: #{var.$popover-arrow-size + 6};
+ }
+
+ &[x-placement^='top'] .popper__arrow {
+ bottom: -(var.$popover-arrow-size);
+ left: 50%;
+ margin-right: #{var.$tooltip-arrow-size * 0.5};
+ border-top-color: var.$popover-border-color;
+ border-bottom-width: 0;
+
+ &::after {
+ bottom: 1px;
+ margin-left: -(var.$popover-arrow-size);
+ border-top-color: var.$popover-background-color;
+ border-bottom-width: 0;
+ }
+ }
+
+ &[x-placement^='bottom'] {
+ margin-top: #{var.$popover-arrow-size + 6};
+ }
+
+ &[x-placement^='bottom'] .popper__arrow {
+ top: -(var.$popover-arrow-size);
+ left: 50%;
+ margin-right: #{var.$tooltip-arrow-size * 0.5};
+ border-top-width: 0;
+ border-bottom-color: var.$popover-border-color;
+
+ &::after {
+ top: 1px;
+ margin-left: -(var.$popover-arrow-size);
+ border-top-width: 0;
+ border-bottom-color: var.$popover-background-color;
+ }
+ }
+
+ &[x-placement^='right'] {
+ margin-left: #{var.$popover-arrow-size + 6};
+ }
+
+ &[x-placement^='right'] .popper__arrow {
+ top: 50%;
+ left: -(var.$popover-arrow-size);
+ margin-bottom: #{var.$tooltip-arrow-size * 0.5};
+ border-right-color: var.$popover-border-color;
+ border-left-width: 0;
+
+ &::after {
+ bottom: -(var.$popover-arrow-size);
+ left: 1px;
+ border-right-color: var.$popover-background-color;
+ border-left-width: 0;
+ }
+ }
+
+ &[x-placement^='left'] {
+ margin-right: #{var.$popover-arrow-size + 6};
+ }
+
+ &[x-placement^='left'] .popper__arrow {
+ top: 50%;
+ right: -(var.$popover-arrow-size);
+ margin-bottom: #{var.$tooltip-arrow-size * 0.5};
+ border-right-width: 0;
+ border-left-color: var.$popover-border-color;
+
+ &::after {
+ right: 1px;
+ bottom: -(var.$popover-arrow-size);
+ margin-left: -(var.$popover-arrow-size);
+ border-right-width: 0;
+ border-left-color: var.$popover-background-color;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/progress.scss b/packages/design-system/theme/src/progress.scss
new file mode 100644
index 0000000000..94d51eb70d
--- /dev/null
+++ b/packages/design-system/theme/src/progress.scss
@@ -0,0 +1,140 @@
+@use "mixins/mixins";
+@use "mixins/utils";
+@use "./common/var";
+
+@include mixins.b(progress) {
+ position: relative;
+ line-height: 1;
+
+ @include mixins.e(text) {
+ font-size: 14px;
+ color: var(--color-text-dark);
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: 10px;
+ line-height: 1;
+
+ i {
+ vertical-align: middle;
+ display: block;
+ }
+ }
+
+ @include mixins.m((circle, dashboard)) {
+ display: inline-block;
+
+ .el-progress__text {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ width: 100%;
+ text-align: center;
+ margin: 0;
+ transform: translate(0, -50%);
+
+ i {
+ vertical-align: middle;
+ display: inline-block;
+ }
+ }
+ }
+
+ @include mixins.m(without-text) {
+ .el-progress__text {
+ display: none;
+ }
+
+ .el-progress-bar {
+ padding-right: 0;
+ margin-right: 0;
+ display: block;
+ }
+ }
+
+ @include mixins.m(text-inside) {
+ .el-progress-bar {
+ padding-right: 0;
+ margin-right: 0;
+ }
+ }
+
+ @include mixins.when(success) {
+ .el-progress-bar__inner {
+ background-color: var(--color-success);
+ }
+
+ .el-progress__text {
+ color: var(--color-success);
+ }
+ }
+
+ @include mixins.when(warning) {
+ .el-progress-bar__inner {
+ background-color: var(--color-warning);
+ }
+
+ .el-progress__text {
+ color: var(--color-warning);
+ }
+ }
+
+ @include mixins.when(exception) {
+ .el-progress-bar__inner {
+ background-color: var(--color-danger);
+ }
+
+ .el-progress__text {
+ color: var(--color-danger);
+ }
+ }
+}
+
+@include mixins.b(progress-bar) {
+ padding-right: 50px;
+ display: inline-block;
+ vertical-align: middle;
+ width: 100%;
+ margin-right: -55px;
+ box-sizing: border-box;
+
+ @include mixins.e(outer) {
+ height: 6px;
+ border-radius: 100px;
+ background-color: var(--border-color-light);
+ overflow: hidden;
+ position: relative;
+ vertical-align: middle;
+ }
+ @include mixins.e(inner) {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: 100%;
+ background-color: var(--color-primary);
+ text-align: right;
+ border-radius: 100px;
+ line-height: 1;
+ white-space: nowrap;
+ transition: width 0.6s ease;
+
+ @include utils.utils-vertical-center;
+ }
+
+ @include mixins.e(innerText) {
+ display: inline-block;
+ vertical-align: middle;
+ color: var.$color-white;
+ font-size: 12px;
+ margin: 0 5px;
+ }
+}
+
+@keyframes progress {
+ 0% {
+ background-position: 0 0;
+ }
+
+ 100% {
+ background-position: 32px 0;
+ }
+}
diff --git a/packages/design-system/theme/src/radio-button.scss b/packages/design-system/theme/src/radio-button.scss
new file mode 100644
index 0000000000..93ff04745d
--- /dev/null
+++ b/packages/design-system/theme/src/radio-button.scss
@@ -0,0 +1,134 @@
+@use "mixins/mixins";
+@use "mixins/_button";
+@use "./common/var";
+
+@include mixins.b(radio-button) {
+ position: relative;
+ display: inline-block;
+ outline: none;
+
+ @include mixins.e(inner) {
+ display: inline-block;
+ line-height: 1;
+ white-space: nowrap;
+ vertical-align: middle;
+ background: var.$button-default-background-color;
+ border: var(--border-base);
+ font-weight: var(--font-weight-bold);
+ border-left: 0;
+ color: var.$button-default-font-color;
+ -webkit-appearance: none;
+ text-align: center;
+ box-sizing: border-box;
+ outline: none;
+ margin: 0;
+ position: relative;
+ cursor: pointer;
+ transition: var.$all-transition;
+ border-radius: 0;
+
+ @include button.button-size(
+ var.$button-padding-vertical,
+ var.$button-padding-horizontal,
+ var.$button-font-size
+ );
+
+ &:hover {
+ color: var(--color-primary);
+ }
+
+ & [class*='el-icon-'] {
+ line-height: 0.9;
+
+ & + span {
+ margin-left: 5px;
+ }
+ }
+ }
+
+ &:first-child {
+ .el-radio-button__inner {
+ border-left: var(--border-base);
+ border-radius: var(--border-radius-base) 0 0 var(--border-radius-base);
+ box-shadow: none !important;
+ }
+ }
+
+ @include mixins.e(orig-radio) {
+ opacity: 0;
+ outline: none;
+ position: absolute;
+ z-index: -1;
+
+ &:checked {
+ & + .el-radio-button__inner {
+ color: var.$radio-button-checked-font-color;
+ background-color: var.$radio-button-checked-background-color;
+ border-color: var.$radio-button-checked-border-color;
+ box-shadow: -1px 0 0 0 var.$radio-button-checked-border-color;
+ }
+ }
+
+ &:disabled {
+ & + .el-radio-button__inner {
+ color: var.$button-disabled-font-color;
+ cursor: not-allowed;
+ background-image: none;
+ background-color: var.$button-disabled-background-color;
+ border-color: var.$button-disabled-border-color;
+ box-shadow: none;
+ }
+ &:checked + .el-radio-button__inner {
+ background-color: var.$radio-button-disabled-checked-fill;
+ }
+ }
+ }
+
+ &:last-child {
+ .el-radio-button__inner {
+ border-radius: 0 var(--border-radius-base) var(--border-radius-base) 0;
+ }
+ }
+
+ &:first-child:last-child {
+ .el-radio-button__inner {
+ border-radius: var(--border-radius-base);
+ }
+ }
+
+ @include mixins.m(medium) {
+ & .el-radio-button__inner {
+ border-radius: 0;
+ @include button.button-size(
+ var.$button-medium-padding-vertical,
+ var.$button-medium-padding-horizontal,
+ var.$button-medium-font-size
+ );
+ }
+ }
+ @include mixins.m(small) {
+ & .el-radio-button__inner {
+ border-radius: 0;
+ @include button.button-size(
+ var.$button-small-padding-vertical,
+ var.$button-small-padding-horizontal,
+ var.$button-small-font-size
+ );
+ }
+ }
+ @include mixins.m(mini) {
+ & .el-radio-button__inner {
+ border-radius: 0;
+ @include button.button-size(
+ var.$button-mini-padding-vertical,
+ var.$button-mini-padding-horizontal,
+ var.$button-mini-font-size
+ );
+ }
+ }
+
+ &:focus:not(.is-focus):not(:active):not(.is-disabled) {
+ /*获得焦点时 样式提醒*/
+ box-shadow: 0 0 2px 2px var.$radio-button-checked-border-color;
+ }
+}
diff --git a/packages/design-system/theme/src/radio-group.scss b/packages/design-system/theme/src/radio-group.scss
new file mode 100644
index 0000000000..86358b848d
--- /dev/null
+++ b/packages/design-system/theme/src/radio-group.scss
@@ -0,0 +1,9 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(radio-group) {
+ display: inline-block;
+ line-height: 1;
+ vertical-align: middle;
+ font-size: 0;
+}
diff --git a/packages/design-system/theme/src/radio.scss b/packages/design-system/theme/src/radio.scss
new file mode 100644
index 0000000000..fe173efbbf
--- /dev/null
+++ b/packages/design-system/theme/src/radio.scss
@@ -0,0 +1,200 @@
+@use "mixins/mixins";
+@use "mixins/utils";
+@use 'mixins/button';
+@use "./common/var";
+
+@include mixins.b(radio) {
+ color: var.$radio-font-color;
+ font-weight: var.$radio-font-weight;
+ line-height: 1;
+ position: relative;
+ cursor: pointer;
+ display: inline-block;
+ white-space: nowrap;
+ outline: none;
+ font-size: var.$font-size-base;
+ margin-right: 30px;
+ @include utils.utils-user-select(none);
+
+ @include mixins.when(bordered) {
+ padding: var.$radio-bordered-padding;
+ border-radius: var(--border-radius-base);
+ border: var(--border-base);
+ box-sizing: border-box;
+ height: var.$radio-bordered-height;
+
+ &.is-checked {
+ border-color: var(--color-primary);
+ }
+
+ &.is-disabled {
+ cursor: not-allowed;
+ border-color: var(--border-color-light);
+ }
+
+ & + .el-radio.is-bordered {
+ margin-left: 10px;
+ }
+ }
+
+ @include mixins.m(medium) {
+ &.is-bordered {
+ padding: var.$radio-bordered-medium-padding;
+ border-radius: var.$button-medium-border-radius;
+ height: var.$radio-bordered-medium-height;
+ .el-radio__label {
+ font-size: var.$button-medium-font-size;
+ }
+ .el-radio__inner {
+ height: var.$radio-bordered-medium-input-height;
+ width: var.$radio-bordered-medium-input-width;
+ }
+ }
+ }
+ @include mixins.m(small) {
+ &.is-bordered {
+ padding: var.$radio-bordered-small-padding;
+ border-radius: var.$button-small-border-radius;
+ height: var.$radio-bordered-small-height;
+ .el-radio__label {
+ font-size: var.$button-small-font-size;
+ }
+ .el-radio__inner {
+ height: var.$radio-bordered-small-input-height;
+ width: var.$radio-bordered-small-input-width;
+ }
+ }
+ }
+ @include mixins.m(mini) {
+ &.is-bordered {
+ padding: var.$radio-bordered-mini-padding;
+ border-radius: var.$button-mini-border-radius;
+ height: var.$radio-bordered-mini-height;
+ .el-radio__label {
+ font-size: var.$button-mini-font-size;
+ }
+ .el-radio__inner {
+ height: var.$radio-bordered-mini-input-height;
+ width: var.$radio-bordered-mini-input-width;
+ }
+ }
+ }
+
+ &:last-child {
+ margin-right: 0;
+ }
+
+ @include mixins.e(input) {
+ white-space: nowrap;
+ cursor: pointer;
+ outline: none;
+ display: inline-block;
+ line-height: 1;
+ position: relative;
+ vertical-align: middle;
+
+ @include mixins.when(disabled) {
+ .el-radio__inner {
+ background-color: var.$radio-disabled-input-fill;
+ border-color: var.$radio-disabled-input-border-color;
+ cursor: not-allowed;
+
+ &::after {
+ cursor: not-allowed;
+ background-color: var.$radio-disabled-icon-color;
+ }
+
+ & + .el-radio__label {
+ cursor: not-allowed;
+ }
+ }
+ &.is-checked {
+ .el-radio__inner {
+ background-color: var.$radio-disabled-checked-input-fill;
+ border-color: var.$radio-disabled-checked-input-border-color;
+
+ &::after {
+ background-color: var.$radio-disabled-checked-icon-color;
+ }
+ }
+ }
+ & + span.el-radio__label {
+ color: var(--color-text-lighter);
+ cursor: not-allowed;
+ }
+ }
+
+ @include mixins.when(checked) {
+ .el-radio__inner {
+ border-color: var.$radio-checked-input-border-color;
+ background: var.$radio-checked-icon-color;
+
+ &::after {
+ transform: translate(-50%, -50%) scale(1);
+ }
+ }
+
+ & + .el-radio__label {
+ color: var.$radio-checked-font-color;
+ }
+ }
+
+ @include mixins.when(focus) {
+ .el-radio__inner {
+ border-color: var.$radio-input-border-color-hover;
+ }
+ }
+ }
+ @include mixins.e(inner) {
+ border: var.$radio-input-border;
+ border-radius: var.$radio-input-border-radius;
+ width: var.$radio-input-width;
+ height: var.$radio-input-height;
+ background-color: var.$radio-input-background-color;
+ position: relative;
+ cursor: pointer;
+ display: inline-block;
+ box-sizing: border-box;
+
+ &:hover {
+ border-color: var.$radio-input-border-color-hover;
+ }
+
+ &::after {
+ width: 4px;
+ height: 4px;
+ border-radius: var.$radio-input-border-radius;
+ background-color: var.$color-white;
+ content: '';
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%) scale(0);
+ transition: transform 0.15s ease-in;
+ }
+ }
+
+ @include mixins.e(original) {
+ opacity: 0;
+ outline: none;
+ position: absolute;
+ z-index: -1;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ margin: 0;
+ }
+
+ &:focus:not(.is-focus):not(:active):not(.is-disabled) {
+ /*获得焦点时 样式提醒*/
+ .el-radio__inner {
+ box-shadow: 0 0 2px 2px var.$radio-input-border-color-hover;
+ }
+ }
+
+ @include mixins.e(label) {
+ font-size: var.$radio-font-size;
+ padding-left: 10px;
+ }
+}
diff --git a/packages/design-system/theme/src/rate.scss b/packages/design-system/theme/src/rate.scss
new file mode 100644
index 0000000000..1a37308539
--- /dev/null
+++ b/packages/design-system/theme/src/rate.scss
@@ -0,0 +1,50 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(rate) {
+ height: var.$rate-height;
+ line-height: 1;
+
+ &:focus,
+ &:active {
+ outline-width: 0;
+ }
+
+ @include mixins.e(item) {
+ display: inline-block;
+ position: relative;
+ font-size: 0;
+ vertical-align: middle;
+ }
+
+ @include mixins.e(icon) {
+ position: relative;
+ display: inline-block;
+ font-size: var.$rate-icon-size;
+ margin-right: var.$rate-icon-margin;
+ color: var.$rate-icon-color;
+ transition: 0.3s;
+ &.hover {
+ transform: scale(1.15);
+ }
+
+ .path2 {
+ position: absolute;
+ left: 0;
+ top: 0;
+ }
+ }
+
+ @include mixins.e(decimal) {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: inline-block;
+ overflow: hidden;
+ }
+
+ @include mixins.e(text) {
+ font-size: var.$rate-font-size;
+ vertical-align: middle;
+ }
+}
diff --git a/packages/design-system/theme/src/reset.scss b/packages/design-system/theme/src/reset.scss
new file mode 100644
index 0000000000..1a0e69a4c2
--- /dev/null
+++ b/packages/design-system/theme/src/reset.scss
@@ -0,0 +1,241 @@
+@use "mixins/function";
+@use 'common/var';
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+body {
+ overscroll-behavior-x: none;
+ line-height: 1;
+ font-size: var(--font-size-m);
+ font-weight: 300;
+ color: var(--color-text-dark);
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+body,
+button,
+input {
+ font-family: var(--font-family);
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+input {
+ font-weight: var(--font-weight-regular);
+}
+
+button {
+ font-weight: var(--font-weight-bold);
+}
+
+html,
+body,
+div,
+span,
+object,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+abbr,
+address,
+cite,
+code,
+del,
+dfn,
+em,
+img,
+ins,
+kbd,
+q,
+samp,
+small,
+strong,
+sub,
+sup,
+var,
+b,
+i,
+dl,
+dt,
+dd,
+ol,
+ul,
+li,
+fieldset,
+form,
+label,
+legend,
+table,
+caption,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td,
+article,
+aside,
+canvas,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section,
+summary,
+time,
+mark,
+audio,
+video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ vertical-align: baseline;
+ background: transparent;
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section {
+ display: block;
+}
+
+nav ul {
+ list-style: none;
+}
+
+blockquote,
+q {
+ quotes: none;
+}
+
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+ content: '';
+ content: none;
+}
+
+a {
+ margin: 0;
+ padding: 0;
+ color: var(--color-primary);
+ text-decoration: none;
+ font-size: 100%;
+ vertical-align: baseline;
+ background: transparent;
+ cursor: pointer;
+
+ &:active {
+ color: function.saturation(
+ --color-primary-h,
+ --color-primary-s,
+ --color-primary-l,
+ -(var.$button-active-shade-percent)
+ );
+ }
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ color: var(--color-text-dark);
+ font-weight: inherit;
+
+ &:first-child {
+ margin-top: 0;
+ }
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+}
+
+h4,
+h5,
+h6,
+p {
+ font-size: inherit;
+}
+
+p {
+ line-height: 1.8;
+
+ &:first-child {
+ margin-top: 0;
+ }
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+}
+
+ins {
+ background-color: var(--color-success);
+ color: var(--color-text-dark);
+ text-decoration: none;
+}
+
+mark {
+ background-color: var(--color-warning);
+ color: var(--color-text-dark);
+ font-style: italic;
+ font-weight: bold;
+}
+
+del {
+ text-decoration: line-through;
+}
+
+abbr[title],
+dfn[title] {
+ border-bottom: 1px dotted;
+ cursor: help;
+}
+
+hr {
+ display: block;
+ height: 1px;
+ border: 0;
+ border-top: 1px solid var(--color-foreground-light);
+ margin: 1em 0;
+ padding: 0;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+input,
+select {
+ vertical-align: middle;
+}
diff --git a/packages/design-system/theme/src/row.scss b/packages/design-system/theme/src/row.scss
new file mode 100644
index 0000000000..99b3035591
--- /dev/null
+++ b/packages/design-system/theme/src/row.scss
@@ -0,0 +1,37 @@
+@use "./common/var";
+@use "mixins/mixins";
+@use "mixins/utils";
+
+@include mixins.b(row) {
+ position: relative;
+ box-sizing: border-box;
+ @include utils.utils-clearfix;
+
+ @include mixins.m(flex) {
+ display: flex;
+ &:before,
+ &:after {
+ display: none;
+ }
+
+ @include mixins.when(justify-center) {
+ justify-content: center;
+ }
+ @include mixins.when(justify-end) {
+ justify-content: flex-end;
+ }
+ @include mixins.when(justify-space-between) {
+ justify-content: space-between;
+ }
+ @include mixins.when(justify-space-around) {
+ justify-content: space-around;
+ }
+
+ @include mixins.when(align-middle) {
+ align-items: center;
+ }
+ @include mixins.when(align-bottom) {
+ align-items: flex-end;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/scrollbar.scss b/packages/design-system/theme/src/scrollbar.scss
new file mode 100644
index 0000000000..bd19aa6868
--- /dev/null
+++ b/packages/design-system/theme/src/scrollbar.scss
@@ -0,0 +1,72 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(scrollbar) {
+ overflow: hidden;
+ position: relative;
+
+ &:hover,
+ &:active,
+ &:focus {
+ > .el-scrollbar__bar {
+ opacity: 1;
+ transition: opacity 340ms ease-out;
+ }
+ }
+
+ @include mixins.e(wrap) {
+ overflow: scroll;
+ height: 100%;
+
+ @include mixins.m(hidden-default) {
+ scrollbar-width: none;
+ &::-webkit-scrollbar {
+ width: 0;
+ height: 0;
+ }
+ }
+ }
+
+ @include mixins.e(thumb) {
+ position: relative;
+ display: block;
+ width: 0;
+ height: 0;
+ cursor: pointer;
+ border-radius: inherit;
+ background-color: var.$scrollbar-background-color;
+ transition: 0.3s background-color;
+
+ &:hover {
+ background-color: var.$scrollbar-hover-background-color;
+ }
+ }
+
+ @include mixins.e(bar) {
+ position: absolute;
+ right: 2px;
+ bottom: 2px;
+ z-index: 1;
+ border-radius: 4px;
+ opacity: 0;
+ transition: opacity 120ms ease-out;
+
+ @include mixins.when(vertical) {
+ width: 6px;
+ top: 2px;
+
+ > div {
+ width: 100%;
+ }
+ }
+
+ @include mixins.when(horizontal) {
+ height: 6px;
+ left: 2px;
+
+ > div {
+ height: 100%;
+ }
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/select-dropdown.scss b/packages/design-system/theme/src/select-dropdown.scss
new file mode 100644
index 0000000000..6d2f370ad8
--- /dev/null
+++ b/packages/design-system/theme/src/select-dropdown.scss
@@ -0,0 +1,59 @@
+@use "mixins/mixins";
+@use "./common/var";
+@use "./popper";
+
+@include mixins.b(select-dropdown) {
+ position: absolute;
+ z-index: #{var.$index-top + 1};
+ border: var.$select-dropdown-border;
+ border-radius: var(--border-radius-base);
+ background-color: var.$select-dropdown-background;
+ box-shadow: var.$select-dropdown-shadow;
+ box-sizing: border-box;
+ margin: 5px 0;
+
+ @include mixins.when(multiple) {
+ & .el-select-dropdown__item.selected {
+ color: var.$select-option-selected-font-color;
+ background-color: var.$select-dropdown-background;
+
+ &.hover {
+ background-color: var.$select-option-hover-background;
+ }
+
+ &::after {
+ position: absolute;
+ right: 20px;
+ font-family: 'element-icons';
+ content: '\e6da';
+ font-size: 12px;
+ font-weight: bold;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ }
+ }
+ }
+
+ .el-scrollbar.is-empty .el-select-dropdown__list {
+ padding: 0;
+ }
+}
+
+@include mixins.b(select-dropdown__empty) {
+ padding: var.$select-dropdown-empty-padding;
+ margin: 0;
+ text-align: center;
+ color: var.$select-dropdown-empty-color;
+ font-size: var.$select-font-size;
+}
+
+@include mixins.b(select-dropdown__wrap) {
+ max-height: var.$select-dropdown-max-height;
+}
+
+@include mixins.b(select-dropdown__list) {
+ list-style: none;
+ padding: var.$select-dropdown-padding;
+ margin: 0;
+ box-sizing: border-box;
+}
diff --git a/packages/design-system/theme/src/select.scss b/packages/design-system/theme/src/select.scss
new file mode 100644
index 0000000000..b667c7eadc
--- /dev/null
+++ b/packages/design-system/theme/src/select.scss
@@ -0,0 +1,158 @@
+@use "mixins/mixins";
+@use "mixins/utils";
+@use "./common/var";
+@use "select-dropdown";
+@use "input";
+@use "tag";
+@use "option";
+@use "option-group";
+@use "scrollbar";
+
+@include mixins.b(select) {
+ display: inline-block;
+ position: relative;
+ width: 100%;
+
+ .el-select__tags {
+ overflow-x: scroll;
+ }
+
+ .el-select__tags > span {
+ display: contents;
+ }
+
+ .el-select__tags + .el-input {
+ input {
+ box-sizing: content-box;
+ padding: 0;
+ text-indent: var(--spacing-xs);
+ width: calc(100% - 2px);
+ }
+ }
+
+ .el-input__inner {
+ cursor: pointer;
+ padding-right: 35px;
+
+ &:focus {
+ border-color: var.$select-input-focus-border-color;
+ }
+ }
+
+ .el-input {
+ & .el-select__caret {
+ font-size: var.$select-input-font-size;
+ transition: transform 0.3s;
+ transform: rotateZ(180deg);
+ cursor: pointer;
+
+ @include mixins.when(reverse) {
+ transform: rotateZ(0deg);
+ }
+
+ @include mixins.when(show-close) {
+ font-size: var.$select-font-size;
+ text-align: center;
+ transform: rotateZ(180deg);
+ border-radius: var.$border-radius-circle;
+ color: var.$select-input-color;
+ transition: var.$color-transition-base;
+
+ &:hover {
+ color: var.$select-close-hover-color;
+ }
+ }
+ }
+
+ &.is-disabled {
+ & .el-input__inner {
+ cursor: not-allowed;
+
+ &:hover {
+ border-color: var.$select-disabled-border;
+ }
+ }
+ }
+
+ &.is-focus .el-input__inner {
+ border-color: var.$select-input-focus-border-color;
+ }
+ }
+
+ > .el-input {
+ display: block;
+ }
+
+ @include mixins.e(input) {
+ border: none;
+ outline: none;
+ padding: 0;
+ margin-left: 15px;
+ color: var.$select-multiple-input-color;
+ font-size: var.$select-font-size;
+ appearance: none;
+ height: 28px;
+ background-color: transparent;
+ @include mixins.when(mini) {
+ height: 14px;
+ }
+ }
+
+ @include mixins.e(close) {
+ cursor: pointer;
+ position: absolute;
+ top: 8px;
+ z-index: var.$index-top;
+ right: 25px;
+ color: var.$select-input-color;
+ line-height: 18px;
+ font-size: var.$select-input-font-size;
+
+ &:hover {
+ color: var.$select-close-hover-color;
+ }
+ }
+
+ @include mixins.e(tags) {
+ position: absolute;
+ line-height: normal;
+ white-space: normal;
+ z-index: var.$index-normal;
+ top: 50%;
+ transform: translateY(-50%);
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ }
+
+ .el-tag__close {
+ margin-top: -2px;
+ }
+
+ .el-tag {
+ box-sizing: border-box;
+ margin: 2px 0 2px 6px;
+ border-color: var(--color-foreground-base);
+ background-color: var(--color-foreground-base);
+ color: var(--color-text-dark);
+ border-radius: 20px;
+ font-weight: 400;
+
+ &__close.el-icon-close {
+ background-color: var(--color-text-light);
+ right: -7px;
+ top: 0;
+ color: var.$color-white;
+ margin-right: 6px;
+
+ &:hover {
+ background-color: var(--color-text-base);
+ }
+
+ &::before {
+ display: block;
+ transform: translate(0, 0.5px);
+ }
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/slider.scss b/packages/design-system/theme/src/slider.scss
new file mode 100644
index 0000000000..3d1cc5e04d
--- /dev/null
+++ b/packages/design-system/theme/src/slider.scss
@@ -0,0 +1,246 @@
+@use "mixins/mixins";
+@use "mixins/utils";
+@use "input-number";
+@use "tooltip";
+@use "./common/var";
+
+@include mixins.b(slider) {
+ @include utils.utils-clearfix;
+
+ @include mixins.e(runway) {
+ width: 100%;
+ height: var.$slider-height;
+ margin: var.$slider-margin;
+ background-color: var.$slider-runway-background-color;
+ border-radius: var.$slider-border-radius;
+ position: relative;
+ cursor: pointer;
+ vertical-align: middle;
+
+ &.show-input {
+ margin-right: 160px;
+ width: auto;
+ }
+
+ &.disabled {
+ cursor: default;
+
+ .el-slider__bar {
+ background-color: var.$slider-disable-color;
+ }
+
+ .el-slider__button {
+ border-color: var.$slider-disable-color;
+ }
+
+ .el-slider__button-wrapper {
+ &:hover,
+ &.hover {
+ cursor: not-allowed;
+ }
+
+ &.dragging {
+ cursor: not-allowed;
+ }
+ }
+
+ .el-slider__button {
+ &:hover,
+ &.hover,
+ &.dragging {
+ transform: scale(1);
+ }
+
+ &:hover,
+ &.hover {
+ cursor: not-allowed;
+ }
+
+ &.dragging {
+ cursor: not-allowed;
+ }
+ }
+ }
+ }
+
+ @include mixins.e(input) {
+ float: right;
+ margin-top: 3px;
+ width: 130px;
+
+ &.el-input-number--mini {
+ margin-top: 5px;
+ }
+
+ &.el-input-number--medium {
+ margin-top: 0;
+ }
+
+ &.el-input-number--large {
+ margin-top: -2px;
+ }
+ }
+
+ @include mixins.e(bar) {
+ height: var.$slider-height;
+ background-color: var.$slider-main-background-color;
+ border-top-left-radius: var.$slider-border-radius;
+ border-bottom-left-radius: var.$slider-border-radius;
+ position: absolute;
+ }
+
+ @include mixins.e(button-wrapper) {
+ height: var.$slider-button-wrapper-size;
+ width: var.$slider-button-wrapper-size;
+ position: absolute;
+ z-index: 1001;
+ top: var.$slider-button-wrapper-offset;
+ transform: translateX(-50%);
+ background-color: transparent;
+ text-align: center;
+ user-select: none;
+ line-height: normal;
+ @include utils.utils-vertical-center;
+
+ .el-tooltip {
+ vertical-align: middle;
+ display: inline-block;
+ }
+
+ &:hover,
+ &.hover {
+ cursor: grab;
+ }
+
+ &.dragging {
+ cursor: grabbing;
+ }
+ }
+
+ @include mixins.e(button) {
+ width: var.$slider-button-size;
+ height: var.$slider-button-size;
+ border: solid 2px var.$slider-main-background-color;
+ background-color: var.$color-white;
+ border-radius: 50%;
+ transition: 0.2s;
+ user-select: none;
+
+ &:hover,
+ &.hover,
+ &.dragging {
+ transform: scale(1.2);
+ }
+
+ &:hover,
+ &.hover {
+ cursor: grab;
+ }
+
+ &.dragging {
+ cursor: grabbing;
+ }
+ }
+
+ @include mixins.e(stop) {
+ position: absolute;
+ height: var.$slider-height;
+ width: var.$slider-height;
+ border-radius: var.$border-radius-circle;
+ background-color: var.$slider-stop-background-color;
+ transform: translateX(-50%);
+ }
+
+ @include mixins.e(marks) {
+ top: 0;
+ left: 12px;
+ width: 18px;
+ height: 100%;
+
+ @include mixins.e(marks-text) {
+ position: absolute;
+ transform: translateX(-50%);
+ font-size: 14px;
+ color: var(--color-info);
+ margin-top: 15px;
+ }
+ }
+
+ @include mixins.when(vertical) {
+ position: relative;
+ .el-slider__runway {
+ width: var.$slider-height;
+ height: 100%;
+ margin: 0 16px;
+ }
+ .el-slider__bar {
+ width: var.$slider-height;
+ height: auto;
+ border-radius: 0 0 3px 3px;
+ }
+ .el-slider__button-wrapper {
+ top: auto;
+ left: var.$slider-button-wrapper-offset;
+ transform: translateY(50%);
+ }
+ .el-slider__stop {
+ transform: translateY(50%);
+ }
+ &.el-slider--with-input {
+ padding-bottom: #{var.$input-medium-height + 22px};
+ .el-slider__input {
+ overflow: visible;
+ float: none;
+ position: absolute;
+ bottom: 22px;
+ width: 36px;
+ margin-top: 15px;
+ .el-input__inner {
+ text-align: center;
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+ .el-input-number__decrease,
+ .el-input-number__increase {
+ top: var.$input-small-height;
+ margin-top: -1px;
+ border: var.$input-border;
+ line-height: 20px;
+ box-sizing: border-box;
+ transition: var.$border-transition-base;
+ }
+ .el-input-number__decrease {
+ width: 18px;
+ right: 18px;
+ border-bottom-left-radius: var.$input-border-radius;
+ }
+ .el-input-number__increase {
+ width: 19px;
+ border-bottom-right-radius: var.$input-border-radius;
+ & ~ .el-input .el-input__inner {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+ }
+ &:hover {
+ .el-input-number__decrease,
+ .el-input-number__increase {
+ border-color: var.$input-hover-border;
+ }
+ }
+ &:active {
+ .el-input-number__decrease,
+ .el-input-number__increase {
+ border-color: var.$input-focus-border;
+ }
+ }
+ }
+ }
+
+ @include mixins.e(marks-text) {
+ margin-top: 0;
+ left: 15px;
+ transform: translateY(50%);
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/spinner.scss b/packages/design-system/theme/src/spinner.scss
new file mode 100644
index 0000000000..b5b8126805
--- /dev/null
+++ b/packages/design-system/theme/src/spinner.scss
@@ -0,0 +1,43 @@
+@use "mixins/mixins";
+
+@include mixins.b(time-spinner) {
+ width: 100%;
+ white-space: nowrap;
+}
+
+@include mixins.b(spinner) {
+ display: inline-block;
+ vertical-align: middle;
+}
+@include mixins.b(spinner-inner) {
+ animation: rotate 2s linear infinite;
+ width: 50px;
+ height: 50px;
+
+ & .path {
+ stroke: #ececec;
+ stroke-linecap: round;
+ animation: dash 1.5s ease-in-out infinite;
+ }
+}
+
+@keyframes rotate {
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes dash {
+ 0% {
+ stroke-dasharray: 1, 150;
+ stroke-dashoffset: 0;
+ }
+ 50% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -35;
+ }
+ 100% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -124;
+ }
+}
diff --git a/packages/design-system/theme/src/step.scss b/packages/design-system/theme/src/step.scss
new file mode 100644
index 0000000000..85e45c569b
--- /dev/null
+++ b/packages/design-system/theme/src/step.scss
@@ -0,0 +1,316 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(step) {
+ position: relative;
+ flex-shrink: 1;
+
+ @include mixins.pseudo(last-of-type) {
+ @include mixins.e(line) {
+ display: none;
+ }
+
+ // 只有未设置 space 的情况下才自适应宽度
+ @include mixins.when(flex) {
+ flex-basis: auto !important;
+ flex-shrink: 0;
+ flex-grow: 0;
+ }
+
+ @include mixins.e((main, description)) {
+ padding-right: 0;
+ }
+ }
+
+ @include mixins.e(head) {
+ position: relative;
+ width: 100%;
+
+ @include mixins.when(process) {
+ color: var(--color-text-dark);
+ border-color: var(--color-text-dark);
+ }
+
+ @include mixins.when(wait) {
+ color: var(--color-text-lighter);
+ border-color: var(--color-text-lighter);
+ }
+
+ @include mixins.when(success) {
+ color: var(--color-success);
+ border-color: var(--color-success);
+ }
+
+ @include mixins.when(error) {
+ color: var(--color-danger);
+ border-color: var(--color-danger);
+ }
+
+ @include mixins.when(finish) {
+ color: var(--color-primary);
+ border-color: var(--color-primary);
+ }
+ }
+
+ @include mixins.e(icon) {
+ position: relative;
+ z-index: 1;
+ display: inline-flex;
+ justify-content: center;
+ align-items: center;
+ width: 24px;
+ height: 24px;
+ font-size: 14px;
+ box-sizing: border-box;
+ background: var.$color-white;
+ transition: 0.15s ease-out;
+
+ @include mixins.when(text) {
+ border-radius: 50%;
+ border: 2px solid;
+ border-color: inherit;
+ }
+
+ @include mixins.when(icon) {
+ width: 40px;
+ }
+ }
+
+ @include mixins.e(icon-inner) {
+ display: inline-block;
+ user-select: none;
+ text-align: center;
+ font-weight: bold;
+ line-height: 1;
+ color: inherit;
+
+ &[class*='el-icon']:not(.is-status) {
+ font-size: 25px;
+ font-weight: normal;
+ }
+
+ // 组件自身表示状态的图标
+ @include mixins.when(status) {
+ transform: translateY(1px);
+ }
+ }
+
+ @include mixins.e(line) {
+ position: absolute;
+ border-color: inherit;
+ background-color: var(--color-text-lighter);
+ }
+
+ @include mixins.e(line-inner) {
+ display: block;
+ border-width: 1px;
+ border-style: solid;
+ border-color: inherit;
+ transition: 0.15s ease-out;
+ box-sizing: border-box;
+ width: 0;
+ height: 0;
+ }
+
+ @include mixins.e(main) {
+ white-space: normal;
+ text-align: left;
+ }
+
+ @include mixins.e(title) {
+ font-size: 16px;
+ line-height: 38px;
+
+ @include mixins.when(process) {
+ font-weight: bold;
+ color: var(--color-text-dark);
+ }
+
+ @include mixins.when(wait) {
+ color: var(--color-text-lighter);
+ }
+
+ @include mixins.when(success) {
+ color: var(--color-success);
+ }
+
+ @include mixins.when(error) {
+ color: var(--color-danger);
+ }
+
+ @include mixins.when(finish) {
+ color: var(--color-primary);
+ }
+ }
+
+ @include mixins.e(description) {
+ padding-right: 10%;
+ margin-top: -5px;
+ font-size: 12px;
+ line-height: 20px;
+ font-weight: normal;
+
+ @include mixins.when(process) {
+ color: var(--color-text-dark);
+ }
+
+ @include mixins.when(wait) {
+ color: var(--color-text-lighter);
+ }
+
+ @include mixins.when(success) {
+ color: var(--color-success);
+ }
+
+ @include mixins.when(error) {
+ color: var(--color-danger);
+ }
+
+ @include mixins.when(finish) {
+ color: var(--color-primary);
+ }
+ }
+
+ @include mixins.when(horizontal) {
+ display: inline-block;
+
+ @include mixins.e(line) {
+ height: 2px;
+ top: 11px;
+ left: 0;
+ right: 0;
+ }
+ }
+
+ @include mixins.when(vertical) {
+ display: flex;
+
+ @include mixins.e(head) {
+ flex-grow: 0;
+ width: 24px;
+ }
+
+ @include mixins.e(main) {
+ padding-left: 10px;
+ flex-grow: 1;
+ }
+
+ @include mixins.e(title) {
+ line-height: 24px;
+ padding-bottom: 8px;
+ }
+
+ @include mixins.e(line) {
+ width: 2px;
+ top: 0;
+ bottom: 0;
+ left: 11px;
+ }
+
+ @include mixins.e(icon) {
+ @include mixins.when(icon) {
+ width: 24px;
+ }
+ }
+ }
+
+ @include mixins.when(center) {
+ @include mixins.e(head) {
+ text-align: center;
+ }
+
+ @include mixins.e(main) {
+ text-align: center;
+ }
+
+ @include mixins.e(description) {
+ padding-left: 20%;
+ padding-right: 20%;
+ }
+
+ @include mixins.e(line) {
+ left: 50%;
+ right: -50%;
+ }
+ }
+
+ @include mixins.when(simple) {
+ display: flex;
+ align-items: center;
+
+ @include mixins.e(head) {
+ width: auto;
+ font-size: 0;
+ padding-right: 10px;
+ }
+
+ @include mixins.e(icon) {
+ background: transparent;
+ width: 16px;
+ height: 16px;
+ font-size: 12px;
+ }
+
+ @include mixins.e(icon-inner) {
+ &[class*='el-icon']:not(.is-status) {
+ font-size: 18px;
+ }
+
+ &.is-status {
+ transform: scale(0.8) translateY(1px);
+ }
+ }
+
+ @include mixins.e(main) {
+ position: relative;
+ display: flex;
+ align-items: stretch;
+ flex-grow: 1;
+ }
+
+ @include mixins.e(title) {
+ font-size: 16px;
+ line-height: 20px;
+ }
+
+ @include mixins.pseudo('not(:last-of-type)') {
+ @include mixins.e(title) {
+ max-width: 50%;
+ word-break: break-all;
+ }
+ }
+
+ @include mixins.e(arrow) {
+ flex-grow: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &::before,
+ &::after {
+ content: '';
+ display: inline-block;
+ position: absolute;
+ height: 15px;
+ width: 1px;
+ background: var(--color-text-lighter);
+ }
+
+ &::before {
+ transform: rotate(-45deg) translateY(-4px);
+ transform-origin: 0 0;
+ }
+
+ &::after {
+ transform: rotate(45deg) translateY(4px);
+ transform-origin: 100% 100%;
+ }
+ }
+
+ @include mixins.pseudo(last-of-type) {
+ @include mixins.e(arrow) {
+ display: none;
+ }
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/steps.scss b/packages/design-system/theme/src/steps.scss
new file mode 100644
index 0000000000..70afd39409
--- /dev/null
+++ b/packages/design-system/theme/src/steps.scss
@@ -0,0 +1,21 @@
+@use "mixins/mixins";
+@use "common/var";
+
+@include mixins.b(steps) {
+ display: flex;
+
+ @include mixins.m(simple) {
+ padding: 13px 8%;
+ border-radius: 4px;
+ background: var.$background-color-base;
+ }
+
+ @include mixins.m(horizontal) {
+ white-space: nowrap;
+ }
+
+ @include mixins.m(vertical) {
+ height: 100%;
+ flex-flow: column;
+ }
+}
diff --git a/packages/design-system/theme/src/submenu.scss b/packages/design-system/theme/src/submenu.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/design-system/theme/src/switch.scss b/packages/design-system/theme/src/switch.scss
new file mode 100644
index 0000000000..b6d6429317
--- /dev/null
+++ b/packages/design-system/theme/src/switch.scss
@@ -0,0 +1,116 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(switch) {
+ display: inline-flex;
+ align-items: center;
+ position: relative;
+ font-size: var.$switch-font-size;
+ line-height: var.$switch-height;
+ height: var.$switch-height;
+ vertical-align: middle;
+ @include mixins.when(disabled) {
+ & .el-switch__core,
+ & .el-switch__label {
+ cursor: not-allowed;
+ }
+ }
+
+ @include mixins.e(label) {
+ transition: 0.2s;
+ height: var.$switch-height;
+ display: inline-block;
+ font-size: var.$switch-font-size;
+ font-weight: 500;
+ cursor: pointer;
+ vertical-align: middle;
+ color: var(--color-text-dark);
+
+ @include mixins.when(active) {
+ color: var(--color-primary);
+ }
+
+ @include mixins.m(left) {
+ margin-right: 10px;
+ }
+ @include mixins.m(right) {
+ margin-left: 10px;
+ }
+ & * {
+ line-height: 1;
+ font-size: var.$switch-font-size;
+ display: inline-block;
+ }
+ }
+
+ @include mixins.e(input) {
+ position: absolute;
+ width: 0;
+ height: 0;
+ opacity: 0;
+ margin: 0;
+ }
+
+ @include mixins.e(core) {
+ margin: 0;
+ display: inline-block;
+ position: relative;
+ width: var.$switch-width;
+ height: var.$switch-height;
+ border: 1px solid var.$switch-off-color;
+ outline: none;
+ border-radius: var.$switch-core-border-radius;
+ box-sizing: border-box;
+ background: var.$switch-off-color;
+ cursor: pointer;
+ transition: border-color 0.1s, background-color 0.1s;
+ vertical-align: middle;
+
+ &:after {
+ content: '';
+ position: absolute;
+ top: 1px;
+ left: 1px;
+ border-radius: var.$border-radius-circle;
+ transition: all 0.1s;
+ width: var.$switch-button-size;
+ height: var.$switch-button-size;
+ background-color: var.$color-white;
+ }
+ }
+
+ @include mixins.when(checked) {
+ .el-switch__core {
+ border-color: var.$switch-on-color;
+ background-color: var.$switch-on-color;
+ &::after {
+ left: 100%;
+ margin-left: -(var.$switch-button-size) - 1px;
+ }
+ }
+ }
+
+ @include mixins.when(disabled) {
+ opacity: 0.6;
+ }
+
+ @include mixins.m(wide) {
+ .el-switch__label {
+ &.el-switch__label--left {
+ span {
+ left: 10px;
+ }
+ }
+ &.el-switch__label--right {
+ span {
+ right: 10px;
+ }
+ }
+ }
+ }
+
+ & .label-fade-enter,
+ & .label-fade-leave-active {
+ opacity: 0;
+ }
+}
diff --git a/packages/design-system/theme/src/tab-pane.scss b/packages/design-system/theme/src/tab-pane.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/design-system/theme/src/table-column.scss b/packages/design-system/theme/src/table-column.scss
new file mode 100644
index 0000000000..1ca87502ef
--- /dev/null
+++ b/packages/design-system/theme/src/table-column.scss
@@ -0,0 +1,97 @@
+@use "mixins/mixins";
+@use "checkbox";
+@use "tag";
+@use "./common/var";
+
+@include mixins.b(table-column) {
+ @include mixins.m(selection) {
+ .cell {
+ padding-left: 14px;
+ padding-right: 14px;
+ }
+ }
+}
+
+@include mixins.b(table-filter) {
+ border: solid 1px var(--border-color-light);
+ border-radius: 2px;
+ background-color: var.$color-white;
+ box-shadow: var.$dropdown-menu-box-shadow;
+ box-sizing: border-box;
+ margin: 2px 0;
+
+ /** used for dropdown mode */
+ @include mixins.e(list) {
+ padding: 5px 0;
+ margin: 0;
+ list-style: none;
+ min-width: 100px;
+ }
+
+ @include mixins.e(list-item) {
+ line-height: 36px;
+ padding: 0 10px;
+ cursor: pointer;
+ font-size: var.$font-size-base;
+
+ &:hover {
+ background-color: var.$dropdown-menuItem-hover-fill;
+ color: var.$dropdown-menuItem-hover-color;
+ }
+
+ @include mixins.when(active) {
+ background-color: var(--color-primary);
+ color: var.$color-white;
+ }
+ }
+
+ @include mixins.e(content) {
+ min-width: 100px;
+ }
+
+ @include mixins.e(bottom) {
+ border-top: 1px solid var(--border-color-light);
+ padding: 8px;
+
+ button {
+ background: transparent;
+ border: none;
+ color: var(--color-text-dark);
+ cursor: pointer;
+ font-size: var.$font-size-small;
+ padding: 0 3px;
+
+ &:hover {
+ color: var(--color-primary);
+ }
+
+ &:focus {
+ outline: none;
+ }
+
+ &.is-disabled {
+ color: var.$disabled-color-base;
+ cursor: not-allowed;
+ }
+ }
+ }
+
+ @include mixins.e(wrap) {
+ max-height: 280px;
+ }
+
+ @include mixins.e(checkbox-group) {
+ padding: 10px;
+
+ label.el-checkbox {
+ display: block;
+ margin-right: 5px;
+ margin-bottom: 8px;
+ margin-left: 5px;
+ }
+
+ .el-checkbox:last-child {
+ margin-bottom: 0;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/table.scss b/packages/design-system/theme/src/table.scss
new file mode 100644
index 0000000000..55f37a3d8d
--- /dev/null
+++ b/packages/design-system/theme/src/table.scss
@@ -0,0 +1,572 @@
+@use "mixins/mixins";
+@use "checkbox";
+@use "tag";
+@use "tooltip";
+@use "./common/var";
+
+@include mixins.b(table) {
+ position: relative;
+ overflow: hidden;
+ box-sizing: border-box;
+ flex: 1;
+ width: 100%;
+ max-width: 100%;
+ background-color: var.$color-white;
+ font-size: 14px;
+ color: var.$table-font-color;
+
+ // 数据为空
+ @include mixins.e(empty-block) {
+ min-height: 60px;
+ text-align: center;
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ @include mixins.e(empty-text) {
+ // min-height doesn't work in IE10 and IE11 https://github.com/philipwalton/flexbugs#3-min-height-on-a-flex-container-wont-apply-to-its-flex-items
+ // set empty text line height up to contrainer min-height as workaround.
+ line-height: 60px;
+ width: 50%;
+ color: var(--color-text-light);
+ }
+
+ // 展开行
+ @include mixins.e(expand-column) {
+ .cell {
+ padding: 0;
+ text-align: center;
+ }
+ }
+
+ @include mixins.e(expand-icon) {
+ position: relative;
+ cursor: pointer;
+ color: #666;
+ font-size: 12px;
+ transition: transform 0.2s ease-in-out;
+ height: 20px;
+
+ @include mixins.m(expanded) {
+ transform: rotate(90deg);
+ }
+
+ > .el-icon {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin-left: -5px;
+ margin-top: -5px;
+ }
+ }
+
+ @include mixins.e(expanded-cell) {
+ background-color: var.$color-white;
+
+ // 纯属为了增加权重
+ &[class*='cell'] {
+ padding: 20px 50px;
+ }
+
+ &:hover {
+ background-color: transparent !important;
+ }
+ }
+
+ @include mixins.e(placeholder) {
+ display: inline-block;
+ width: 20px;
+ }
+
+ @include mixins.e(append-wrapper) {
+ // 避免外边距重合 https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Box_Model/Mastering_margin_collapsing
+ overflow: hidden;
+ }
+
+ @include mixins.m(fit) {
+ border-right: 0;
+ border-bottom: 0;
+
+ th.gutter,
+ td.gutter {
+ border-right-width: 1px;
+ }
+ }
+
+ @include mixins.m(scrollable-x) {
+ .el-table__body-wrapper {
+ overflow-x: auto;
+ }
+ }
+
+ @include mixins.m(scrollable-y) {
+ .el-table__body-wrapper {
+ overflow-y: auto;
+ }
+ }
+
+ thead {
+ color: var.$table-header-font-color;
+ font-weight: 500;
+
+ &.is-group {
+ th {
+ background: var.$background-color-base;
+ }
+ }
+ }
+
+ th,
+ td {
+ padding: 12px 0;
+ min-width: 0;
+ box-sizing: border-box;
+ text-overflow: ellipsis;
+ vertical-align: middle;
+ position: relative;
+ text-align: left;
+
+ @include mixins.when(center) {
+ text-align: center;
+ }
+
+ @include mixins.when(right) {
+ text-align: right;
+ }
+
+ &.gutter {
+ width: 15px;
+ border-right-width: 0;
+ border-bottom-width: 0;
+ padding: 0;
+ }
+
+ &.is-hidden {
+ > * {
+ visibility: hidden;
+ }
+ }
+ }
+
+ @include mixins.m(medium) {
+ th,
+ td {
+ padding: 10px 0;
+ }
+ }
+
+ @include mixins.m(small) {
+ font-size: 12px;
+ th,
+ td {
+ padding: 8px 0;
+ }
+ }
+
+ @include mixins.m(mini) {
+ font-size: 12px;
+ th,
+ td {
+ padding: 6px 0;
+ }
+ }
+
+ tr {
+ background-color: var.$color-white;
+
+ input[type='checkbox'] {
+ margin: 0;
+ }
+ }
+
+ th.is-leaf,
+ td {
+ border-bottom: var.$table-border;
+ }
+
+ th.is-sortable {
+ cursor: pointer;
+ }
+
+ th {
+ overflow: hidden;
+ user-select: none;
+ background-color: var.$table-header-background-color;
+
+ > .cell {
+ display: inline-block;
+ box-sizing: border-box;
+ position: relative;
+ vertical-align: middle;
+ padding-left: 10px;
+ padding-right: 10px;
+ width: 100%;
+
+ &.highlight {
+ color: var(--color-primary);
+ }
+ }
+
+ &.required > div::before {
+ display: inline-block;
+ content: '';
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background: #ff4d51;
+ margin-right: 5px;
+ vertical-align: middle;
+ }
+ }
+
+ td {
+ div {
+ box-sizing: border-box;
+ }
+
+ &.gutter {
+ width: 0;
+ }
+ }
+
+ .cell {
+ box-sizing: border-box;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: normal;
+ word-break: break-all;
+ line-height: 23px;
+ padding-left: 10px;
+ padding-right: 10px;
+
+ &.el-tooltip {
+ white-space: nowrap;
+ min-width: 50px;
+ }
+ }
+
+ // 拥有多级表头
+ @include mixins.m((group, border)) {
+ border: var.$table-border;
+
+ @include mixins.share-rule(border-pseudo) {
+ content: '';
+ position: absolute;
+ background-color: var.$table-border-color;
+ z-index: 1;
+ }
+
+ // 表格右部伪 border
+ &::after {
+ @include mixins.extend-rule(border-pseudo);
+ top: 0;
+ right: 0;
+ width: 1px;
+ height: 100%;
+ }
+ }
+
+ // 表格底部伪 border,总是有的
+ &::before {
+ @include mixins.extend-rule(border-pseudo);
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ height: 1px;
+ }
+
+ // table--border
+ @include mixins.m(border) {
+ border-right: none;
+ border-bottom: none;
+
+ &.el-loading-parent--relative {
+ border-color: transparent;
+ }
+
+ th,
+ td {
+ border-right: var.$table-border;
+
+ &:first-child .cell {
+ padding-left: 10px;
+ }
+ }
+
+ th.gutter:last-of-type {
+ border-bottom: var.$table-border;
+ border-bottom-width: 1px;
+ }
+
+ & th {
+ border-bottom: var.$table-border;
+ }
+ }
+
+ @include mixins.m(hidden) {
+ visibility: hidden;
+ }
+
+ @include mixins.e((fixed, fixed-right)) {
+ position: absolute;
+ top: 0;
+ left: 0;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ box-shadow: var.$table-fixed-box-shadow;
+
+ &::before {
+ content: '';
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ height: 1px;
+ background-color: var(--border-color-light);
+ z-index: 4;
+ }
+ }
+
+ @include mixins.e(fixed-right-patch) {
+ position: absolute;
+ top: -1px;
+ right: 0;
+ background-color: var.$color-white;
+ border-bottom: var.$table-border;
+ }
+
+ @include mixins.e(fixed-right) {
+ top: 0;
+ left: auto;
+ right: 0;
+
+ .el-table__fixed-header-wrapper,
+ .el-table__fixed-body-wrapper,
+ .el-table__fixed-footer-wrapper {
+ left: auto;
+ right: 0;
+ }
+ }
+
+ @include mixins.e(fixed-header-wrapper) {
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: 3;
+ }
+
+ @include mixins.e(fixed-footer-wrapper) {
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ z-index: 3;
+
+ & tbody td {
+ border-top: var.$table-border;
+ background-color: var.$table-row-hover-background-color;
+ color: var.$table-font-color;
+ }
+ }
+
+ @include mixins.e(fixed-body-wrapper) {
+ position: absolute;
+ left: 0;
+ top: 37px;
+ overflow: hidden;
+ z-index: 3;
+ }
+
+ @include mixins.e((header-wrapper, body-wrapper, footer-wrapper)) {
+ width: 100%;
+ }
+
+ @include mixins.e(footer-wrapper) {
+ margin-top: -1px;
+ td {
+ border-top: var.$table-border;
+ }
+ }
+
+ @include mixins.e((header, body, footer)) {
+ table-layout: fixed;
+ border-collapse: separate;
+ }
+
+ @include mixins.e((header-wrapper, footer-wrapper)) {
+ overflow: hidden;
+
+ & tbody td {
+ background-color: var.$table-row-hover-background-color;
+ color: var.$table-font-color;
+ }
+ }
+
+ @include mixins.e(body-wrapper) {
+ overflow: hidden;
+ position: relative;
+
+ @include mixins.when(scrolling-none) {
+ ~ .el-table__fixed,
+ ~ .el-table__fixed-right {
+ box-shadow: none;
+ }
+ }
+
+ @include mixins.when(scrolling-left) {
+ ~ .el-table__fixed {
+ box-shadow: none;
+ }
+ }
+
+ @include mixins.when(scrolling-right) {
+ ~ .el-table__fixed-right {
+ box-shadow: none;
+ }
+ }
+
+ .el-table--border {
+ @include mixins.when(scrolling-right) {
+ ~ .el-table__fixed-right {
+ border-left: var.$table-border;
+ }
+ }
+
+ @include mixins.when(scrolling-left) {
+ ~ .el-table__fixed {
+ border-right: var.$table-border;
+ }
+ }
+ }
+ }
+
+ .caret-wrapper {
+ display: inline-flex;
+ flex-direction: column;
+ align-items: center;
+ height: 34px;
+ width: 24px;
+ vertical-align: middle;
+ cursor: pointer;
+ overflow: initial;
+ position: relative;
+ }
+
+ .sort-caret {
+ width: 0;
+ height: 0;
+ border: solid 5px transparent;
+ position: absolute;
+ left: 7px;
+
+ &.ascending {
+ border-bottom-color: var(--color-text-lighter);
+ top: 5px;
+ }
+
+ &.descending {
+ border-top-color: var(--color-text-lighter);
+ bottom: 7px;
+ }
+ }
+
+ .ascending .sort-caret.ascending {
+ border-bottom-color: var(--color-primary);
+ }
+
+ .descending .sort-caret.descending {
+ border-top-color: var(--color-primary);
+ }
+
+ .hidden-columns {
+ visibility: hidden;
+ position: absolute;
+ z-index: -1;
+ }
+
+ @include mixins.m(striped) {
+ & .el-table__body {
+ & tr.el-table__row--striped {
+ td {
+ background: #fafafa;
+ }
+
+ &.current-row td {
+ background-color: var.$table-current-row-background-color;
+ }
+ }
+ }
+ }
+
+ @include mixins.e(body) {
+ tr.hover-row {
+ &,
+ &.el-table__row--striped {
+ &,
+ &.current-row {
+ > td {
+ background-color: var.$table-row-hover-background-color;
+ }
+ }
+ }
+ }
+
+ tr.current-row > td {
+ background-color: var.$table-current-row-background-color;
+ }
+ }
+
+ @include mixins.e(column-resize-proxy) {
+ position: absolute;
+ left: 200px;
+ top: 0;
+ bottom: 0;
+ width: 0;
+ border-left: var.$table-border;
+ z-index: 10;
+ }
+
+ @include mixins.e(column-filter-trigger) {
+ display: inline-block;
+ line-height: 34px;
+ cursor: pointer;
+
+ & i {
+ color: var(--color-info);
+ font-size: 12px;
+ transform: scale(0.75);
+ }
+ }
+
+ @include mixins.m(enable-row-transition) {
+ .el-table__body td {
+ transition: background-color 0.25s ease;
+ }
+ }
+
+ @include mixins.m(enable-row-hover) {
+ .el-table__body tr:hover > td {
+ background-color: var.$table-row-hover-background-color;
+ }
+ }
+
+ @include mixins.m(fluid-height) {
+ .el-table__fixed,
+ .el-table__fixed-right {
+ bottom: 0;
+ overflow: hidden;
+ }
+ }
+
+ [class*='el-table__row--level'] {
+ .el-table__expand-icon {
+ display: inline-block;
+ width: 20px;
+ line-height: 20px;
+ height: 20px;
+ text-align: center;
+ margin-right: 3px;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/tabs.scss b/packages/design-system/theme/src/tabs.scss
new file mode 100644
index 0000000000..47adcd305b
--- /dev/null
+++ b/packages/design-system/theme/src/tabs.scss
@@ -0,0 +1,606 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(tabs) {
+ @include mixins.e(header) {
+ padding: 0;
+ position: relative;
+ margin: 0 0 15px;
+ }
+ @include mixins.e(active-bar) {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ height: 2px;
+ background-color: var(--color-primary);
+ z-index: 1;
+ transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+ list-style: none;
+ }
+ @include mixins.e(new-tab) {
+ float: right;
+ border: 1px solid #d3dce6;
+ height: 18px;
+ width: 18px;
+ line-height: 18px;
+ margin: 12px 0 9px 10px;
+ border-radius: 3px;
+ text-align: center;
+ font-size: 12px;
+ color: #d3dce6;
+ cursor: pointer;
+ transition: all 0.15s;
+
+ .el-icon-plus {
+ transform: scale(0.8, 0.8);
+ }
+
+ &:hover {
+ color: var(--color-primary);
+ }
+ }
+ @include mixins.e(nav-wrap) {
+ overflow: hidden;
+ margin-bottom: -1px;
+ position: relative;
+
+ &::after {
+ content: '';
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ height: 2px;
+ background-color: var(--border-color-base);
+ z-index: var.$index-normal;
+ }
+
+ @include mixins.when(scrollable) {
+ padding: 0 20px;
+ box-sizing: border-box;
+ }
+ }
+ @include mixins.e(nav-scroll) {
+ overflow: hidden;
+ }
+ @include mixins.e((nav-next, nav-prev)) {
+ position: absolute;
+ cursor: pointer;
+ line-height: 44px;
+ font-size: 12px;
+ color: var(--color-text-light);
+ }
+ @include mixins.e(nav-next) {
+ right: 0;
+ }
+ @include mixins.e(nav-prev) {
+ left: 0;
+ }
+ @include mixins.e(nav) {
+ white-space: nowrap;
+ position: relative;
+ transition: transform 0.3s;
+ float: left;
+ z-index: #{var.$index-normal + 1};
+
+ @include mixins.when(stretch) {
+ min-width: 100%;
+ display: flex;
+ & > * {
+ flex: 1;
+ text-align: center;
+ }
+ }
+ }
+ @include mixins.e(item) {
+ padding: 0 20px;
+ height: 40px;
+ box-sizing: border-box;
+ line-height: 40px;
+ display: inline-block;
+ list-style: none;
+ font-size: 14px;
+ font-weight: 500;
+ color: var(--color-text-dark);
+ position: relative;
+
+ &:focus,
+ &:focus:active {
+ outline: none;
+ }
+
+ &:focus.is-active.is-focus:not(:active) {
+ box-shadow: 0 0 2px 2px var(--color-primary) inset;
+ border-radius: 3px;
+ }
+
+ & .el-icon-close {
+ border-radius: 50%;
+ text-align: center;
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+ margin-left: 5px;
+ &:before {
+ transform: scale(0.9);
+ display: inline-block;
+ }
+
+ &:hover {
+ background-color: var(--color-text-lighter);
+ color: var.$color-white;
+ }
+ }
+
+ @include mixins.when(active) {
+ color: var(--color-primary);
+ }
+
+ &:hover {
+ color: var(--color-primary);
+ cursor: pointer;
+ }
+
+ @include mixins.when(disabled) {
+ color: var.$disabled-color-base;
+ cursor: default;
+ }
+ }
+ @include mixins.e(content) {
+ overflow: hidden;
+ position: relative;
+ }
+ @include mixins.m(card) {
+ > .el-tabs__header {
+ border-bottom: 1px solid var(--border-color-base);
+ }
+ > .el-tabs__header .el-tabs__nav-wrap::after {
+ content: none;
+ }
+ > .el-tabs__header .el-tabs__nav {
+ border: 1px solid var(--border-color-base);
+ border-bottom: none;
+ border-radius: 4px 4px 0 0;
+ box-sizing: border-box;
+ }
+ > .el-tabs__header .el-tabs__active-bar {
+ display: none;
+ }
+ > .el-tabs__header .el-tabs__item .el-icon-close {
+ position: relative;
+ font-size: 12px;
+ width: 0;
+ height: 14px;
+ vertical-align: middle;
+ line-height: 15px;
+ overflow: hidden;
+ top: -1px;
+ right: -2px;
+ transform-origin: 100% 50%;
+ }
+ > .el-tabs__header .el-tabs__item {
+ border-bottom: 1px solid transparent;
+ border-left: 1px solid var(--border-color-base);
+ transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1),
+ padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+ &:first-child {
+ border-left: none;
+ }
+ &.is-closable {
+ &:hover {
+ padding-left: 13px;
+ padding-right: 13px;
+
+ & .el-icon-close {
+ width: 14px;
+ }
+ }
+ }
+ &.is-active {
+ border-bottom-color: var.$color-white;
+
+ &.is-closable {
+ padding-left: 20px;
+ padding-right: 20px;
+
+ .el-icon-close {
+ width: 14px;
+ }
+ }
+ }
+ }
+ }
+ @include mixins.m(border-card) {
+ background: var.$color-white;
+ border: 1px solid var(--border-color-base);
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04);
+
+ > .el-tabs__content {
+ padding: 15px;
+ }
+ > .el-tabs__header {
+ background-color: var.$background-color-base;
+ border-bottom: 1px solid var(--border-color-base);
+ margin: 0;
+ }
+ > .el-tabs__header .el-tabs__nav-wrap::after {
+ content: none;
+ }
+ > .el-tabs__header .el-tabs__item {
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+ border: 1px solid transparent;
+ margin-top: -1px;
+ color: var(--color-text-light);
+
+ &:first-child {
+ margin-left: -1px;
+ }
+
+ & + .el-tabs__item {
+ margin-left: -1px;
+ }
+
+ &.is-active {
+ color: var(--color-primary);
+ background-color: var.$color-white;
+ border-right-color: var(--border-color-base);
+ border-left-color: var(--border-color-base);
+ }
+ &:not(.is-disabled):hover {
+ color: var(--color-primary);
+ }
+ &.is-disabled {
+ color: var.$disabled-color-base;
+ }
+ }
+
+ > .el-tabs__header .is-scrollable .el-tabs__item:first-child {
+ margin-left: 0;
+ }
+ }
+ @include mixins.m((top, bottom)) {
+ .el-tabs__item.is-top:nth-child(2),
+ .el-tabs__item.is-bottom:nth-child(2) {
+ padding-left: 0;
+ }
+ .el-tabs__item.is-top:last-child,
+ .el-tabs__item.is-bottom:last-child {
+ padding-right: 0;
+ }
+
+ &.el-tabs--border-card,
+ &.el-tabs--card,
+ .el-tabs--left,
+ .el-tabs--right {
+ > .el-tabs__header {
+ .el-tabs__item:nth-child(2) {
+ padding-left: 20px;
+ }
+ .el-tabs__item:last-child {
+ padding-right: 20px;
+ }
+ }
+ }
+ }
+ @include mixins.m(bottom) {
+ .el-tabs__header.is-bottom {
+ margin-bottom: 0;
+ margin-top: 10px;
+ }
+ &.el-tabs--border-card {
+ .el-tabs__header.is-bottom {
+ border-bottom: 0;
+ border-top: 1px solid var(--border-color-base);
+ }
+ .el-tabs__nav-wrap.is-bottom {
+ margin-top: -1px;
+ margin-bottom: 0;
+ }
+ .el-tabs__item.is-bottom:not(.is-active) {
+ border: 1px solid transparent;
+ }
+ .el-tabs__item.is-bottom {
+ margin: 0 -1px -1px -1px;
+ }
+ }
+ }
+ @include mixins.m((left, right)) {
+ overflow: hidden;
+
+ .el-tabs__header.is-left,
+ .el-tabs__header.is-right,
+ .el-tabs__nav-wrap.is-left,
+ .el-tabs__nav-wrap.is-right,
+ .el-tabs__nav-scroll {
+ height: 100%;
+ }
+
+ .el-tabs__active-bar.is-left,
+ .el-tabs__active-bar.is-right {
+ top: 0;
+ bottom: auto;
+ width: 2px;
+ height: auto;
+ }
+
+ .el-tabs__nav-wrap.is-left,
+ .el-tabs__nav-wrap.is-right {
+ margin-bottom: 0;
+
+ > .el-tabs__nav-prev,
+ > .el-tabs__nav-next {
+ height: 30px;
+ line-height: 30px;
+ width: 100%;
+ text-align: center;
+ cursor: pointer;
+
+ i {
+ transform: rotateZ(90deg);
+ }
+ }
+ > .el-tabs__nav-prev {
+ left: auto;
+ top: 0;
+ }
+ > .el-tabs__nav-next {
+ right: auto;
+ bottom: 0;
+ }
+
+ &.is-scrollable {
+ padding: 30px 0;
+ }
+
+ &::after {
+ height: 100%;
+ width: 2px;
+ bottom: auto;
+ top: 0;
+ }
+ }
+
+ .el-tabs__nav.is-left,
+ .el-tabs__nav.is-right {
+ float: none;
+ }
+ .el-tabs__item.is-left,
+ .el-tabs__item.is-right {
+ display: block;
+ }
+ }
+ @include mixins.m(left) {
+ .el-tabs__header.is-left {
+ float: left;
+ margin-bottom: 0;
+ margin-right: 10px;
+ }
+ .el-tabs__nav-wrap.is-left {
+ margin-right: -1px;
+ &::after {
+ left: auto;
+ right: 0;
+ }
+ }
+ .el-tabs__active-bar.is-left {
+ right: 0;
+ left: auto;
+ }
+ .el-tabs__item.is-left {
+ text-align: right;
+ }
+
+ &.el-tabs--card {
+ .el-tabs__active-bar.is-left {
+ display: none;
+ }
+ .el-tabs__item.is-left {
+ border-left: none;
+ border-right: 1px solid var(--border-color-base);
+ border-bottom: none;
+ border-top: 1px solid var(--border-color-base);
+ text-align: left;
+ }
+ .el-tabs__item.is-left:first-child {
+ border-right: 1px solid var(--border-color-base);
+ border-top: none;
+ }
+ .el-tabs__item.is-left.is-active {
+ border: 1px solid var(--border-color-base);
+ border-right-color: #fff;
+ border-left: none;
+ border-bottom: none;
+
+ &:first-child {
+ border-top: none;
+ }
+ &:last-child {
+ border-bottom: none;
+ }
+ }
+
+ .el-tabs__nav {
+ border-radius: 4px 0 0 4px;
+ border-bottom: 1px solid var(--border-color-base);
+ border-right: none;
+ }
+
+ .el-tabs__new-tab {
+ float: none;
+ }
+ }
+
+ &.el-tabs--border-card {
+ .el-tabs__header.is-left {
+ border-right: 1px solid #dfe4ed;
+ }
+ .el-tabs__item.is-left {
+ border: 1px solid transparent;
+ margin: -1px 0 -1px -1px;
+
+ &.is-active {
+ border-color: transparent;
+ border-top-color: rgb(209, 219, 229);
+ border-bottom-color: rgb(209, 219, 229);
+ }
+ }
+ }
+ }
+ @include mixins.m(right) {
+ .el-tabs__header.is-right {
+ float: right;
+ margin-bottom: 0;
+ margin-left: 10px;
+ }
+
+ .el-tabs__nav-wrap.is-right {
+ margin-left: -1px;
+ &::after {
+ left: 0;
+ right: auto;
+ }
+ }
+
+ .el-tabs__active-bar.is-right {
+ left: 0;
+ }
+
+ &.el-tabs--card {
+ .el-tabs__active-bar.is-right {
+ display: none;
+ }
+ .el-tabs__item.is-right {
+ border-bottom: none;
+ border-top: 1px solid var(--border-color-base);
+ }
+ .el-tabs__item.is-right:first-child {
+ border-left: 1px solid var(--border-color-base);
+ border-top: none;
+ }
+ .el-tabs__item.is-right.is-active {
+ border: 1px solid var(--border-color-base);
+ border-left-color: #fff;
+ border-right: none;
+ border-bottom: none;
+
+ &:first-child {
+ border-top: none;
+ }
+ &:last-child {
+ border-bottom: none;
+ }
+ }
+
+ .el-tabs__nav {
+ border-radius: 0 4px 4px 0;
+ border-bottom: 1px solid var(--border-color-base);
+ border-left: none;
+ }
+ }
+ &.el-tabs--border-card {
+ .el-tabs__header.is-right {
+ border-left: 1px solid #dfe4ed;
+ }
+ .el-tabs__item.is-right {
+ border: 1px solid transparent;
+ margin: -1px -1px -1px 0;
+
+ &.is-active {
+ border-color: transparent;
+ border-top-color: rgb(209, 219, 229);
+ border-bottom-color: rgb(209, 219, 229);
+ }
+ }
+ }
+ }
+}
+
+.slideInRight-transition,
+.slideInLeft-transition {
+ display: inline-block;
+}
+.slideInRight-enter {
+ animation: slideInRight-enter 0.3s;
+}
+.slideInRight-leave {
+ position: absolute;
+ left: 0;
+ right: 0;
+ animation: slideInRight-leave 0.3s;
+}
+.slideInLeft-enter {
+ animation: slideInLeft-enter 0.3s;
+}
+.slideInLeft-leave {
+ position: absolute;
+ left: 0;
+ right: 0;
+ animation: slideInLeft-leave 0.3s;
+}
+
+@keyframes slideInRight-enter {
+ 0% {
+ opacity: 0;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+@keyframes slideInRight-leave {
+ 0% {
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%);
+ opacity: 0;
+ }
+}
+@keyframes slideInLeft-enter {
+ 0% {
+ opacity: 0;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+}
+@keyframes slideInLeft-leave {
+ 0% {
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%);
+ opacity: 0;
+ }
+}
diff --git a/packages/design-system/theme/src/tag.scss b/packages/design-system/theme/src/tag.scss
new file mode 100644
index 0000000000..2a2a81893e
--- /dev/null
+++ b/packages/design-system/theme/src/tag.scss
@@ -0,0 +1,163 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@mixin genTheme() {
+ background-color: var.$color-primary-lighter;
+ border-color: var.$color-primary-light-5;
+ color: var.$color-primary-light-1;
+
+ @include mixins.when(hit) {
+ border-color: var.$tag-primary-color;
+ }
+
+ .el-tag__close {
+ color: var.$color-primary-light-1;
+ &:hover {
+ color: var.$color-white;
+ background-color: var.$color-primary-light-1;
+ }
+ }
+
+ &.el-tag--info {
+ background-color: var.$color-info-lighter;
+ border-color: var.$color-info-light-5;
+ color: var.$color-info-light-3;
+
+ @include mixins.when(hit) {
+ border-color: var.$tag-info-color;
+ }
+
+ .el-tag__close {
+ color: var.$color-info-light-1;
+ &:hover {
+ color: var.$color-white;
+ background-color: var.$color-info-light-1;
+ }
+ }
+ }
+
+ &.el-tag--success {
+ background-color: var.$color-success-lighter;
+ border-color: var.$color-success-light-5;
+ color: var.$color-success-light-3;
+
+ @include mixins.when(hit) {
+ border-color: var.$tag-success-color;
+ }
+
+ .el-tag__close {
+ color: var.$color-success-light-1;
+ &:hover {
+ color: var.$color-white;
+ background-color: var.$color-success-light-1;
+ }
+ }
+ }
+
+ &.el-tag--warning {
+ background-color: var.$color-warning-lighter;
+ border-color: var.$color-warning-light-5;
+ color: var.$color-warning-light-3;
+
+ @include mixins.when(hit) {
+ border-color: var.$tag-warning-color;
+ }
+
+ .el-tag__close {
+ color: var.$color-warning-light-1;
+ &:hover {
+ color: var.$color-white;
+ background-color: var.$color-warning-light-1;
+ }
+ }
+ }
+
+ &.el-tag--danger {
+ background-color: var.$color-danger-lighter;
+ border-color: var.$color-danger-light-5;
+ color: var.$color-danger-light-3;
+
+ @include mixins.when(hit) {
+ border-color: var.$tag-danger-color;
+ }
+
+ .el-tag__close {
+ color: var.$color-danger-light-1;
+ &:hover {
+ color: var.$color-white;
+ background-color: var.$color-danger-light-1;
+ }
+ }
+ }
+}
+
+@include mixins.b(tag) {
+ @include genTheme();
+ display: inline-block;
+ height: 32px;
+ padding: var.$tag-padding;
+ line-height: 30px;
+ font-size: var.$tag-font-size;
+ color: var.$tag-primary-color;
+ border-width: 1px;
+ border-style: solid;
+ border-radius: var.$tag-border-radius;
+ box-sizing: border-box;
+ white-space: nowrap;
+
+ .el-icon-close {
+ border-radius: 50%;
+ text-align: center;
+ position: relative;
+ cursor: pointer;
+ font-size: 12px;
+ height: 16px;
+ width: 16px;
+ line-height: 16px;
+ vertical-align: middle;
+ top: -1px;
+ right: -5px;
+
+ &::before {
+ display: block;
+ }
+ }
+
+ @include mixins.m(dark) {
+ @include genTheme();
+ }
+
+ @include mixins.m(plain) {
+ @include genTheme();
+ }
+
+ @include mixins.m(medium) {
+ height: 28px;
+ line-height: 26px;
+
+ .el-icon-close {
+ transform: scale(0.8);
+ }
+ }
+
+ @include mixins.m(small) {
+ height: 24px;
+ padding: 0 8px;
+ line-height: 22px;
+
+ .el-icon-close {
+ transform: scale(0.8);
+ }
+ }
+
+ @include mixins.m(mini) {
+ height: 20px;
+ padding: 0 5px;
+ line-height: 18px;
+
+ .el-icon-close {
+ margin-left: -3px;
+ transform: scale(0.7);
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/time-picker.scss b/packages/design-system/theme/src/time-picker.scss
new file mode 100644
index 0000000000..de273215de
--- /dev/null
+++ b/packages/design-system/theme/src/time-picker.scss
@@ -0,0 +1,8 @@
+@use "./date-picker/picker.scss";
+@use "./date-picker/picker-panel.scss";
+@use "./date-picker/time-spinner.scss";
+@use "./date-picker/time-picker.scss";
+@use "./date-picker/time-range-picker.scss";
+@use "./input.scss";
+@use "./scrollbar.scss";
+@use "./popper";
diff --git a/packages/design-system/theme/src/time-select.scss b/packages/design-system/theme/src/time-select.scss
new file mode 100644
index 0000000000..8f4f239218
--- /dev/null
+++ b/packages/design-system/theme/src/time-select.scss
@@ -0,0 +1,37 @@
+@use "./common/var";
+@use "./date-picker/picker.scss";
+@use "./date-picker/date-picker.scss";
+@use "./scrollbar.scss";
+@use "./popper";
+
+.time-select {
+ margin: 5px 0;
+ min-width: 0;
+}
+
+.time-select .el-picker-panel__content {
+ max-height: 200px;
+ margin: 0;
+}
+
+.time-select-item {
+ padding: 8px 10px;
+ font-size: 14px;
+ line-height: 20px;
+}
+
+.time-select-item.selected:not(.disabled) {
+ color: var(--color-primary);
+ font-weight: bold;
+}
+
+.time-select-item.disabled {
+ color: var.$datepicker-border-color;
+ cursor: not-allowed;
+}
+
+.time-select-item:hover {
+ background-color: var.$background-color-base;
+ font-weight: bold;
+ cursor: pointer;
+}
diff --git a/packages/design-system/theme/src/timeline-item.scss b/packages/design-system/theme/src/timeline-item.scss
new file mode 100644
index 0000000000..3e83bf6361
--- /dev/null
+++ b/packages/design-system/theme/src/timeline-item.scss
@@ -0,0 +1,86 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(timeline-item) {
+ position: relative;
+ padding-bottom: 20px;
+
+ @include mixins.e(wrapper) {
+ position: relative;
+ padding-left: 28px;
+ top: -3px;
+ }
+
+ @include mixins.e(tail) {
+ position: absolute;
+ left: 4px;
+ height: 100%;
+ border-left: 2px solid var.$timeline-node-color;
+ }
+
+ @include mixins.e(icon) {
+ color: var.$color-white;
+ font-size: var.$font-size-small;
+ }
+
+ @include mixins.e(node) {
+ position: absolute;
+ background-color: var.$timeline-node-color;
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ @include mixins.m(normal) {
+ left: -1px;
+ width: var.$timeline-node-size-normal;
+ height: var.$timeline-node-size-normal;
+ }
+ @include mixins.m(large) {
+ left: -2px;
+ width: var.$timeline-node-size-large;
+ height: var.$timeline-node-size-large;
+ }
+
+ @include mixins.m(primary) {
+ background-color: var(--color-primary);
+ }
+ @include mixins.m(success) {
+ background-color: var(--color-success);
+ }
+ @include mixins.m(warning) {
+ background-color: var(--color-warning);
+ }
+ @include mixins.m(danger) {
+ background-color: var(--color-danger);
+ }
+ @include mixins.m(info) {
+ background-color: var(--color-info);
+ }
+ }
+
+ @include mixins.e(dot) {
+ position: absolute;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ @include mixins.e(content) {
+ color: var(--color-text-dark);
+ }
+
+ @include mixins.e(timestamp) {
+ color: var(--color-text-light);
+ line-height: 1;
+ font-size: var.$font-size-small;
+
+ @include mixins.when(top) {
+ margin-bottom: 8px;
+ padding-top: 4px;
+ }
+ @include mixins.when(bottom) {
+ margin-top: 8px;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/timeline.scss b/packages/design-system/theme/src/timeline.scss
new file mode 100644
index 0000000000..635d7038da
--- /dev/null
+++ b/packages/design-system/theme/src/timeline.scss
@@ -0,0 +1,14 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(timeline) {
+ margin: 0;
+ font-size: var.$font-size-base;
+ list-style: none;
+
+ & .el-timeline-item:last-child {
+ & .el-timeline-item__tail {
+ display: none;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/tooltip.scss b/packages/design-system/theme/src/tooltip.scss
new file mode 100644
index 0000000000..cbcc3c7c08
--- /dev/null
+++ b/packages/design-system/theme/src/tooltip.scss
@@ -0,0 +1,147 @@
+@use "mixins/mixins";
+@use "./common/var";
+
+@include mixins.b(tooltip) {
+ &:focus:not(.focusing),
+ &:focus:hover {
+ outline-width: 0;
+ }
+
+ a {
+ font-weight: var(--font-weight-bold);
+ }
+
+ @include mixins.e(popper) {
+ position: absolute;
+ border-radius: 4px;
+ padding: var.$tooltip-padding;
+ z-index: var.$index-popper;
+ font-size: var.$tooltip-font-size;
+ line-height: 1.2;
+ min-width: 10px;
+ word-wrap: break-word;
+
+ .popper__arrow,
+ .popper__arrow::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+ }
+
+ .popper__arrow {
+ border-width: var.$tooltip-arrow-size;
+ }
+
+ .popper__arrow::after {
+ content: ' ';
+ border-width: 5px;
+ }
+
+ &[x-placement^='top'] {
+ margin-bottom: #{var.$tooltip-arrow-size + 6px};
+ }
+
+ &[x-placement^='top'] .popper__arrow {
+ bottom: -(var.$tooltip-arrow-size);
+ border-top-color: var.$tooltip-border-color;
+ border-bottom-width: 0;
+
+ &::after {
+ bottom: 1px;
+ margin-left: -5px;
+ border-top-color: var.$tooltip-fill;
+ border-bottom-width: 0;
+ }
+ }
+
+ &[x-placement^='bottom'] {
+ margin-top: #{var.$tooltip-arrow-size + 6px};
+ }
+
+ &[x-placement^='bottom'] .popper__arrow {
+ top: -(var.$tooltip-arrow-size);
+ border-top-width: 0;
+ border-bottom-color: var.$tooltip-border-color;
+
+ &::after {
+ top: 1px;
+ margin-left: -5px;
+ border-top-width: 0;
+ border-bottom-color: var.$tooltip-fill;
+ }
+ }
+
+ &[x-placement^='right'] {
+ margin-left: #{var.$tooltip-arrow-size + 6px};
+ }
+
+ &[x-placement^='right'] .popper__arrow {
+ left: -(var.$tooltip-arrow-size);
+ border-right-color: var.$tooltip-border-color;
+ border-left-width: 0;
+
+ &::after {
+ bottom: -5px;
+ left: 1px;
+ border-right-color: var.$tooltip-fill;
+ border-left-width: 0;
+ }
+ }
+
+ &[x-placement^='left'] {
+ margin-right: #{var.$tooltip-arrow-size + 6px};
+ }
+
+ &[x-placement^='left'] .popper__arrow {
+ right: -(var.$tooltip-arrow-size);
+ border-right-width: 0;
+ border-left-color: var.$tooltip-border-color;
+
+ &::after {
+ right: 1px;
+ bottom: -5px;
+ margin-left: -5px;
+ border-right-width: 0;
+ border-left-color: var.$tooltip-fill;
+ }
+ }
+
+ @include mixins.when(dark) {
+ background: var.$tooltip-fill;
+ color: var.$tooltip-color;
+ }
+
+ @include mixins.when(light) {
+ background: var.$tooltip-color;
+ border: 1px solid var.$tooltip-fill;
+
+ &[x-placement^='top'] .popper__arrow {
+ border-top-color: var.$tooltip-fill;
+ &::after {
+ border-top-color: var.$tooltip-color;
+ }
+ }
+ &[x-placement^='bottom'] .popper__arrow {
+ border-bottom-color: var.$tooltip-fill;
+ &::after {
+ border-bottom-color: var.$tooltip-color;
+ }
+ }
+ &[x-placement^='left'] .popper__arrow {
+ border-left-color: var.$tooltip-fill;
+ &::after {
+ border-left-color: var.$tooltip-color;
+ }
+ }
+ &[x-placement^='right'] .popper__arrow {
+ border-right-color: var.$tooltip-fill;
+ &::after {
+ border-right-color: var.$tooltip-color;
+ }
+ }
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/transfer.scss b/packages/design-system/theme/src/transfer.scss
new file mode 100644
index 0000000000..28d6037953
--- /dev/null
+++ b/packages/design-system/theme/src/transfer.scss
@@ -0,0 +1,229 @@
+@use "mixins/mixins";
+@use "mixins/utils";
+@use "./common/var";
+@use "input";
+@use "button";
+@use "checkbox";
+@use "checkbox-group";
+
+@include mixins.b(transfer) {
+ font-size: var.$font-size-base;
+
+ @include mixins.e(buttons) {
+ display: inline-block;
+ vertical-align: middle;
+ padding: 0 30px;
+ }
+
+ @include mixins.e(button) {
+ display: block;
+ margin: 0 auto;
+ padding: 10px;
+ border-radius: 50%;
+ color: var.$color-white;
+ background-color: var(--color-primary);
+ font-size: 0;
+
+ @include mixins.when(with-texts) {
+ border-radius: var(--border-radius-base);
+ }
+
+ @include mixins.when(disabled) {
+ border: var(--border-base);
+ background-color: var.$background-color-base;
+ color: var(--color-text-lighter);
+
+ &:hover {
+ border: var(--border-base);
+ background-color: var.$background-color-base;
+ color: var(--color-text-lighter);
+ }
+ }
+
+ &:first-child {
+ margin-bottom: 10px;
+ }
+
+ &:nth-child(2) {
+ margin: 0;
+ }
+
+ i,
+ span {
+ font-size: 14px;
+ }
+
+ & [class*='el-icon-'] + span {
+ margin-left: 0;
+ }
+ }
+}
+
+@include mixins.b(transfer-panel) {
+ border: 1px solid var.$transfer-border-color;
+ border-radius: var.$transfer-border-radius;
+ overflow: hidden;
+ background: var.$color-white;
+ display: inline-block;
+ vertical-align: middle;
+ width: var.$transfer-panel-width;
+ max-height: 100%;
+ box-sizing: border-box;
+ position: relative;
+
+ @include mixins.e(body) {
+ height: var.$transfer-panel-body-height;
+
+ @include mixins.when(with-footer) {
+ padding-bottom: var.$transfer-panel-footer-height;
+ }
+ }
+
+ @include mixins.e(list) {
+ margin: 0;
+ padding: 6px 0;
+ list-style: none;
+ height: var.$transfer-panel-body-height;
+ overflow: auto;
+ box-sizing: border-box;
+
+ @include mixins.when(filterable) {
+ height: #{var.$transfer-panel-body-height - var.$transfer-filter-height -
+ 20px};
+ padding-top: 0;
+ }
+ }
+
+ @include mixins.e(item) {
+ height: var.$transfer-item-height;
+ line-height: var.$transfer-item-height;
+ padding-left: 15px;
+ display: block !important;
+
+ & + .el-transfer-panel__item {
+ margin-left: 0;
+ }
+
+ &.el-checkbox {
+ color: var(--color-text-dark);
+ }
+
+ &:hover {
+ color: var(--color-primary);
+ }
+
+ &.el-checkbox .el-checkbox__label {
+ width: 100%;
+ @include utils.utils-ellipsis;
+ display: block;
+ box-sizing: border-box;
+ padding-left: 24px;
+ line-height: var.$transfer-item-height;
+ }
+
+ .el-checkbox__input {
+ position: absolute;
+ top: 8px;
+ }
+ }
+
+ @include mixins.e(filter) {
+ text-align: center;
+ margin: 15px;
+ box-sizing: border-box;
+ display: block;
+ width: auto;
+
+ .el-input__inner {
+ height: var.$transfer-filter-height;
+ width: 100%;
+ font-size: 12px;
+ display: inline-block;
+ box-sizing: border-box;
+ border-radius: #{var.$transfer-filter-height * 0.5};
+ padding-right: 10px;
+ padding-left: 30px;
+ }
+
+ .el-input__icon {
+ margin-left: 5px;
+ }
+
+ .el-icon-circle-close {
+ cursor: pointer;
+ }
+ }
+
+ .el-transfer-panel__header {
+ height: var.$transfer-panel-header-height;
+ line-height: var.$transfer-panel-header-height;
+ background: var.$transfer-panel-header-background-color;
+ margin: 0;
+ padding-left: 15px;
+ border-bottom: 1px solid var.$transfer-border-color;
+ box-sizing: border-box;
+ color: var.$color-black;
+
+ .el-checkbox {
+ display: block;
+ line-height: 40px;
+
+ .el-checkbox__label {
+ font-size: 16px;
+ color: var(--color-text-dark);
+ font-weight: normal;
+
+ span {
+ position: absolute;
+ right: 15px;
+ color: var(--color-text-light);
+ font-size: 12px;
+ font-weight: normal;
+ }
+ }
+ }
+ }
+
+ .el-transfer-panel__footer {
+ height: var.$transfer-panel-footer-height;
+ background: var.$color-white;
+ margin: 0;
+ padding: 0;
+ border-top: 1px solid var.$transfer-border-color;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ z-index: var.$index-normal;
+ @include utils.utils-vertical-center;
+
+ .el-checkbox {
+ padding-left: 20px;
+ color: var(--color-text-dark);
+ }
+ }
+
+ .el-transfer-panel__empty {
+ margin: 0;
+ height: var.$transfer-item-height;
+ line-height: var.$transfer-item-height;
+ padding: 6px 15px 0;
+ color: var(--color-text-light);
+ text-align: center;
+ }
+
+ .el-checkbox__label {
+ padding-left: 8px;
+ }
+
+ .el-checkbox__inner {
+ height: 14px;
+ width: 14px;
+ border-radius: 3px;
+ &::after {
+ height: 6px;
+ width: 3px;
+ left: 4px;
+ }
+ }
+}
diff --git a/packages/design-system/theme/src/tree.scss b/packages/design-system/theme/src/tree.scss
new file mode 100644
index 0000000000..eea1c38453
--- /dev/null
+++ b/packages/design-system/theme/src/tree.scss
@@ -0,0 +1,124 @@
+@use "mixins/mixins";
+@use "./common/var";
+@use "common/transition";
+@use "checkbox";
+
+@include mixins.b(tree) {
+ position: relative;
+ cursor: default;
+ background: var.$color-white;
+ color: var.$tree-font-color;
+
+ @include mixins.e(empty-block) {
+ position: relative;
+ min-height: 60px;
+ text-align: center;
+ width: 100%;
+ height: 100%;
+ }
+
+ @include mixins.e(empty-text) {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ color: var(--color-text-light);
+ font-size: var.$font-size-base;
+ }
+
+ @include mixins.e(drop-indicator) {
+ position: absolute;
+ left: 0;
+ right: 0;
+ height: 1px;
+ background-color: var(--color-primary);
+ }
+}
+
+@include mixins.b(tree-node) {
+ white-space: nowrap;
+ outline: none;
+ &:focus {
+ /* focus */
+ > .el-tree-node__content {
+ background-color: var.$tree-node-hover-background-color;
+ }
+ }
+
+ @include mixins.when(drop-inner) {
+ > .el-tree-node__content .el-tree-node__label {
+ background-color: var(--color-primary);
+ color: #fff;
+ }
+ }
+
+ @include mixins.e(content) {
+ display: flex;
+ align-items: center;
+ height: 26px;
+ cursor: pointer;
+
+ & > .el-tree-node__expand-icon {
+ padding: 6px;
+ }
+ & > label.el-checkbox {
+ margin-right: 8px;
+ }
+ &:hover {
+ background-color: var.$tree-node-hover-background-color;
+ }
+
+ .el-tree.is-dragging & {
+ cursor: move;
+
+ & * {
+ pointer-events: none;
+ }
+ }
+
+ .el-tree.is-dragging.is-drop-not-allow & {
+ cursor: not-allowed;
+ }
+ }
+
+ @include mixins.e(expand-icon) {
+ cursor: pointer;
+ color: var.$tree-expand-icon-color;
+ font-size: 12px;
+
+ transform: rotate(0deg);
+ transition: transform 0.3s ease-in-out;
+
+ &.expanded {
+ transform: rotate(90deg);
+ }
+
+ &.is-leaf {
+ color: transparent;
+ cursor: default;
+ }
+ }
+
+ @include mixins.e(label) {
+ font-size: var.$font-size-base;
+ }
+
+ @include mixins.e(loading-icon) {
+ margin-right: 8px;
+ font-size: var.$font-size-base;
+ color: var.$tree-expand-icon-color;
+ }
+
+ & > .el-tree-node__children {
+ overflow: hidden;
+ background-color: transparent;
+ }
+
+ &.is-expanded > .el-tree-node__children {
+ display: block;
+ }
+}
+
+.el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
+ background-color: var.$color-primary-lighter;
+}
diff --git a/packages/design-system/theme/src/upload.scss b/packages/design-system/theme/src/upload.scss
new file mode 100644
index 0000000000..8f5ee22656
--- /dev/null
+++ b/packages/design-system/theme/src/upload.scss
@@ -0,0 +1,609 @@
+@use "mixins/mixins";
+@use "progress";
+@use "./common/var";
+@use "mixins/utils";
+
+@include mixins.b(upload) {
+ display: inline-block;
+ text-align: center;
+ cursor: pointer;
+ outline: none;
+ @include mixins.e(input) {
+ display: none;
+ }
+
+ @include mixins.e(tip) {
+ font-size: 12px;
+ color: var(--color-text-dark);
+ margin-top: 7px;
+ }
+
+ iframe {
+ position: absolute;
+ z-index: -1;
+ top: 0;
+ left: 0;
+ opacity: 0;
+ filter: alpha(opacity=0);
+ }
+
+ /* 照片墙模式 */
+ @include mixins.m(picture-card) {
+ background-color: #fbfdff;
+ border: 1px dashed #c0ccda;
+ border-radius: 6px;
+ box-sizing: border-box;
+ width: 148px;
+ height: 148px;
+ cursor: pointer;
+ line-height: 146px;
+ vertical-align: top;
+
+ i {
+ font-size: 28px;
+ color: #8c939d;
+ }
+
+ &:hover {
+ border-color: var(--color-primary);
+ color: var(--color-primary);
+ }
+ }
+ &:focus {
+ border-color: var(--color-primary);
+ color: var(--color-primary);
+
+ .el-upload-dragger {
+ border-color: var(--color-primary);
+ }
+ }
+}
+
+@include mixins.b(upload-dragger) {
+ background-color: #fff;
+ border: 1px dashed #d9d9d9;
+ border-radius: 6px;
+ box-sizing: border-box;
+ width: 360px;
+ height: 180px;
+ text-align: center;
+ cursor: pointer;
+ position: relative;
+ overflow: hidden;
+
+ .el-icon-upload {
+ font-size: 67px;
+ color: var(--color-text-lighter);
+ margin: 40px 0 16px;
+ line-height: 50px;
+ }
+
+ + .el-upload__tip {
+ text-align: center;
+ }
+
+ ~ .el-upload__files {
+ border-top: var(--border-base);
+ margin-top: 7px;
+ padding-top: 5px;
+ }
+
+ .el-upload__text {
+ color: var(--color-text-dark);
+ font-size: 14px;
+ text-align: center;
+
+ em {
+ color: var(--color-primary);
+ font-style: normal;
+ }
+ }
+
+ &:hover {
+ border-color: var(--color-primary);
+ }
+
+ @include mixins.when(dragover) {
+ background-color: rgba(32, 159, 255, 0.06);
+ border: 2px dashed var(--color-primary);
+ }
+}
+
+@include mixins.b(upload-list) {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+
+ @include mixins.e(item) {
+ transition: all 0.5s cubic-bezier(0.55, 0, 0.1, 1);
+ font-size: 14px;
+ color: var(--color-text-dark);
+ line-height: 1.8;
+ margin-top: 5px;
+ position: relative;
+ box-sizing: border-box;
+ border-radius: 4px;
+ width: 100%;
+
+ .el-progress {
+ position: absolute;
+ top: 20px;
+ width: 100%;
+ }
+
+ .el-progress__text {
+ position: absolute;
+ right: 0;
+ top: -13px;
+ }
+
+ .el-progress-bar {
+ margin-right: 0;
+ padding-right: 0;
+ }
+
+ &:first-child {
+ margin-top: 10px;
+ }
+
+ & .el-icon-upload-success {
+ color: var(--color-success);
+ }
+
+ .el-icon-close {
+ display: none;
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ cursor: pointer;
+ opacity: 0.75;
+ color: var(--color-text-dark);
+ //transform: scale(.7);
+
+ &:hover {
+ opacity: 1;
+ }
+ }
+
+ & .el-icon-close-tip {
+ display: none;
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ font-size: 12px;
+ cursor: pointer;
+ opacity: 1;
+ color: var(--color-primary);
+ }
+
+ &:hover {
+ background-color: var.$background-color-base;
+
+ .el-icon-close {
+ display: inline-block;
+ }
+
+ .el-progress__text {
+ display: none;
+ }
+ }
+
+ @include mixins.when(success) {
+ .el-upload-list__item-status-label {
+ display: block;
+ }
+
+ .el-upload-list__item-name:hover,
+ .el-upload-list__item-name:focus {
+ color: var.$link-hover-color;
+ cursor: pointer;
+ }
+
+ &:focus:not(:hover) {
+ /* 键盘focus */
+ .el-icon-close-tip {
+ display: inline-block;
+ }
+ }
+
+ &:not(.focusing):focus,
+ &:active {
+ /* click时 */
+ outline-width: 0;
+ .el-icon-close-tip {
+ display: none;
+ }
+ }
+
+ &:hover,
+ &:focus {
+ .el-upload-list__item-status-label {
+ display: none;
+ }
+ }
+ }
+ }
+
+ @include mixins.when(disabled) {
+ .el-upload-list__item:hover .el-upload-list__item-status-label {
+ display: block;
+ }
+ }
+
+ @include mixins.e(item-name) {
+ color: var(--color-text-dark);
+ display: block;
+ margin-right: 40px;
+ overflow: hidden;
+ padding-left: 4px;
+ text-overflow: ellipsis;
+ transition: color 0.3s;
+ white-space: nowrap;
+
+ [class^='el-icon'] {
+ height: 100%;
+ margin-right: 7px;
+ color: var(--color-text-light);
+ line-height: inherit;
+ }
+ }
+
+ @include mixins.e(item-status-label) {
+ position: absolute;
+ right: 5px;
+ top: 0;
+ line-height: inherit;
+ display: none;
+ }
+
+ @include mixins.e(item-delete) {
+ position: absolute;
+ right: 10px;
+ top: 0;
+ font-size: 12px;
+ color: var(--color-text-dark);
+ display: none;
+
+ &:hover {
+ color: var(--color-primary);
+ }
+ }
+
+ @include mixins.m(picture-card) {
+ margin: 0;
+ display: inline;
+ vertical-align: top;
+
+ .el-upload-list__item {
+ overflow: hidden;
+ background-color: #fff;
+ border: 1px solid #c0ccda;
+ border-radius: 6px;
+ box-sizing: border-box;
+ width: 148px;
+ height: 148px;
+ margin: 0 8px 8px 0;
+ display: inline-block;
+
+ .el-icon-check,
+ .el-icon-circle-check {
+ color: var.$color-white;
+ }
+
+ .el-icon-close {
+ display: none;
+ }
+ &:hover {
+ .el-upload-list__item-status-label {
+ display: none;
+ }
+
+ .el-progress__text {
+ display: block;
+ }
+ }
+ }
+
+ .el-upload-list__item-name {
+ display: none;
+ }
+
+ .el-upload-list__item-thumbnail {
+ width: 100%;
+ height: 100%;
+ }
+
+ .el-upload-list__item-status-label {
+ position: absolute;
+ right: -15px;
+ top: -6px;
+ width: 40px;
+ height: 24px;
+ background: #13ce66;
+ text-align: center;
+ transform: rotate(45deg);
+ box-shadow: 0 0 1pc 1px rgba(0, 0, 0, 0.2);
+
+ i {
+ font-size: 12px;
+ margin-top: 11px;
+ transform: rotate(-45deg);
+ }
+ }
+
+ .el-upload-list__item-actions {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ left: 0;
+ top: 0;
+ cursor: default;
+ text-align: center;
+ color: #fff;
+ opacity: 0;
+ font-size: 20px;
+ background-color: rgba(0, 0, 0, 0.5);
+ transition: opacity 0.3s;
+ &::after {
+ display: inline-block;
+ content: '';
+ height: 100%;
+ vertical-align: middle;
+ }
+
+ span {
+ display: none;
+ cursor: pointer;
+ }
+
+ span + span {
+ margin-left: 15px;
+ }
+
+ .el-upload-list__item-delete {
+ position: static;
+ font-size: inherit;
+ color: inherit;
+ }
+
+ &:hover {
+ opacity: 1;
+ span {
+ display: inline-block;
+ }
+ }
+ }
+
+ .el-progress {
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ bottom: auto;
+ width: 126px;
+
+ .el-progress__text {
+ top: 50%;
+ }
+ }
+ }
+
+ @include mixins.m(picture) {
+ .el-upload-list__item {
+ overflow: hidden;
+ z-index: 0;
+ background-color: #fff;
+ border: 1px solid #c0ccda;
+ border-radius: 6px;
+ box-sizing: border-box;
+ margin-top: 10px;
+ padding: 10px 10px 10px 90px;
+ height: 92px;
+
+ .el-icon-check,
+ .el-icon-circle-check {
+ color: var.$color-white;
+ }
+
+ &:hover {
+ .el-upload-list__item-status-label {
+ background: transparent;
+ box-shadow: none;
+ top: -2px;
+ right: -12px;
+ }
+
+ .el-progress__text {
+ display: block;
+ }
+ }
+
+ &.is-success {
+ .el-upload-list__item-name {
+ line-height: 70px;
+ margin-top: 0;
+ i {
+ display: none;
+ }
+ }
+ }
+ }
+
+ .el-upload-list__item-thumbnail {
+ vertical-align: middle;
+ display: inline-block;
+ width: 70px;
+ height: 70px;
+ float: left;
+ position: relative;
+ z-index: 1;
+ margin-left: -80px;
+ background-color: var.$color-white;
+ }
+
+ .el-upload-list__item-name {
+ display: block;
+ margin-top: 20px;
+
+ i {
+ font-size: 70px;
+ line-height: 1;
+ position: absolute;
+ left: 9px;
+ top: 10px;
+ }
+ }
+
+ .el-upload-list__item-status-label {
+ position: absolute;
+ right: -17px;
+ top: -7px;
+ width: 46px;
+ height: 26px;
+ background: #13ce66;
+ text-align: center;
+ transform: rotate(45deg);
+ box-shadow: 0 1px 1px #ccc;
+
+ i {
+ font-size: 12px;
+ margin-top: 12px;
+ transform: rotate(-45deg);
+ }
+ }
+
+ .el-progress {
+ position: relative;
+ top: -7px;
+ }
+ }
+}
+
+@include mixins.b(upload-cover) {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ z-index: 10;
+ cursor: default;
+ @include utils.utils-vertical-center;
+
+ img {
+ display: block;
+ width: 100%;
+ height: 100%;
+ }
+
+ @include mixins.e(label) {
+ position: absolute;
+ right: -15px;
+ top: -6px;
+ width: 40px;
+ height: 24px;
+ background: #13ce66;
+ text-align: center;
+ transform: rotate(45deg);
+ box-shadow: 0 0 1pc 1px rgba(0, 0, 0, 0.2);
+
+ i {
+ font-size: 12px;
+ margin-top: 11px;
+ transform: rotate(-45deg);
+ color: #fff;
+ }
+ }
+
+ @include mixins.e(progress) {
+ display: inline-block;
+ vertical-align: middle;
+ position: static;
+ width: 243px;
+
+ + .el-upload__inner {
+ opacity: 0;
+ }
+ }
+
+ @include mixins.e(content) {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ }
+
+ @include mixins.e(interact) {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(#000, 0.72);
+ text-align: center;
+
+ .btn {
+ display: inline-block;
+ color: var.$color-white;
+ font-size: 14px;
+ cursor: pointer;
+ vertical-align: middle;
+ transition: var.$md-fade-transition;
+ margin-top: 60px;
+
+ i {
+ margin-top: 0;
+ }
+
+ span {
+ opacity: 0;
+ transition: opacity 0.15s linear;
+ }
+
+ &:not(:first-child) {
+ margin-left: 35px;
+ }
+
+ &:hover {
+ transform: translateY(-13px);
+
+ span {
+ opacity: 1;
+ }
+ }
+
+ i {
+ color: var.$color-white;
+ display: block;
+ font-size: 24px;
+ line-height: inherit;
+ margin: 0 auto 5px;
+ }
+ }
+ }
+
+ @include mixins.e(title) {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ background-color: var.$color-white;
+ height: 36px;
+ width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-weight: normal;
+ text-align: left;
+ padding: 0 10px;
+ margin: 0;
+ line-height: 36px;
+ font-size: 14px;
+ color: var(--color-text-dark);
+ }
+
+ + .el-upload__inner {
+ opacity: 0;
+ position: relative;
+ z-index: 1;
+ }
+}
diff --git a/packages/design-system/tsconfig.json b/packages/design-system/tsconfig.json
new file mode 100644
index 0000000000..91298452c5
--- /dev/null
+++ b/packages/design-system/tsconfig.json
@@ -0,0 +1,29 @@
+{
+ "compilerOptions": {
+ "target": "esnext",
+ "module": "esnext",
+ "strict": true,
+ "jsx": "preserve",
+ "importHelpers": true,
+ "moduleResolution": "node",
+ "experimentalDecorators": true,
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "sourceMap": true,
+ "baseUrl": ".",
+ "types": ["webpack-env", "jest"],
+ "paths": {
+ "@/*": ["src/*"]
+ },
+ "lib": ["esnext", "dom", "dom.iterable", "scripthost"]
+ },
+ "include": [
+ "src/**/*.ts",
+ "src/**/*.tsx",
+ "src/**/*.vue",
+ "tests/**/*.ts",
+ "tests/**/*.tsx"
+ ],
+ "exclude": ["node_modules"]
+}
diff --git a/packages/design-system/tslint.json b/packages/design-system/tslint.json
new file mode 100644
index 0000000000..0442c6446e
--- /dev/null
+++ b/packages/design-system/tslint.json
@@ -0,0 +1,80 @@
+{
+ "linterOptions": {
+ "exclude": ["node_modules/**/*", "../../node_modules/**/*"]
+ },
+ "defaultSeverity": "error",
+ "jsRules": {},
+ "rules": {
+ "array-type": [true, "array-simple"],
+ "arrow-return-shorthand": true,
+ "ban": [
+ true,
+ {
+ "name": "Array",
+ "message": "tsstyle#array-constructor"
+ }
+ ],
+ "ban-types": [
+ true,
+ ["Object", "Use {} instead."],
+ ["String", "Use 'string' instead."],
+ ["Number", "Use 'number' instead."],
+ ["Boolean", "Use 'boolean' instead."]
+ ],
+ "class-name": true,
+ "curly": [true, "ignore-same-line"],
+ "forin": true,
+ "jsdoc-format": true,
+ "label-position": true,
+ "indent": [true, "tabs", 2],
+ "member-access": [true, "no-public"],
+ "new-parens": true,
+ "no-angle-bracket-type-assertion": true,
+ "no-any": true,
+ "no-arg": true,
+ "no-conditional-assignment": true,
+ "no-construct": true,
+ "no-debugger": true,
+ // "no-default-export": true,
+ "no-duplicate-variable": true,
+ "no-inferrable-types": true,
+ "no-namespace": [true, "allow-declarations"],
+ "no-reference": true,
+ "no-string-throw": true,
+ "no-unused-expression": true,
+ "no-var-keyword": true,
+ "object-literal-shorthand": true,
+ "only-arrow-functions": [
+ true,
+ "allow-declarations",
+ "allow-named-functions"
+ ],
+ "prefer-const": true,
+ "radix": true,
+ "semicolon": [true, "always", "ignore-bound-class-methods"],
+ "switch-default": true,
+ "trailing-comma": [
+ true,
+ {
+ "multiline": {
+ "objects": "always",
+ "arrays": "always",
+ "functions": "always",
+ "typeLiterals": "ignore"
+ },
+ "esSpecCompliant": true
+ }
+ ],
+ "triple-equals": [true, "allow-null-check"],
+ "use-isnan": true,
+ "quotes": ["error", "single"],
+ "variable-name": [
+ true,
+ "check-format",
+ "ban-keywords",
+ "allow-leading-underscore",
+ "allow-trailing-underscore"
+ ]
+ },
+ "rulesDirectory": []
+}
diff --git a/packages/editor-ui/package.json b/packages/editor-ui/package.json
index 7757447075..1b4f190d98 100644
--- a/packages/editor-ui/package.json
+++ b/packages/editor-ui/package.json
@@ -25,15 +25,16 @@
"test:unit": "vue-cli-service test:unit"
},
"dependencies": {
+ "n8n-design-system": "~0.1.0",
"timeago.js": "^4.0.2",
"v-click-outside": "^3.1.2",
"vue-fragment": "^1.5.2"
},
"devDependencies": {
"@beyonk/google-fonts-webpack-plugin": "^1.5.0",
- "@fortawesome/fontawesome-svg-core": "^1.2.19",
- "@fortawesome/free-solid-svg-icons": "^5.9.0",
- "@fortawesome/vue-fontawesome": "^0.1.6",
+ "@fortawesome/fontawesome-svg-core": "^1.2.35",
+ "@fortawesome/free-solid-svg-icons": "^5.15.3",
+ "@fortawesome/vue-fontawesome": "^2.0.2",
"@types/dateformat": "^3.0.0",
"@types/express": "^4.17.6",
"@types/file-saver": "^2.0.1",
@@ -43,16 +44,16 @@
"@types/node": "^14.14.40",
"@types/quill": "^2.0.1",
"@types/uuid": "^8.3.0",
- "@typescript-eslint/eslint-plugin": "^2.13.0",
- "@typescript-eslint/parser": "^2.13.0",
- "@vue/cli-plugin-babel": "^4.1.2",
- "@vue/cli-plugin-eslint": "^4.1.2",
- "@vue/cli-plugin-typescript": "~4.5.6",
- "@vue/cli-plugin-unit-jest": "^4.1.2",
- "@vue/cli-service": "^3.11.0",
+ "@typescript-eslint/eslint-plugin": "^4.18.0",
+ "@typescript-eslint/parser": "^4.18.0",
+ "@vue/cli-plugin-babel": "~4.5.0",
+ "@vue/cli-plugin-eslint": "~4.5.0",
+ "@vue/cli-plugin-typescript": "~4.5.0",
+ "@vue/cli-plugin-unit-jest": "~4.5.0",
+ "@vue/cli-service": "~4.5.0",
"@vue/eslint-config-standard": "^5.0.1",
- "@vue/eslint-config-typescript": "~5.0.1",
- "@vue/test-utils": "^1.0.0-beta.24",
+ "@vue/eslint-config-typescript": "^7.0.0",
+ "@vue/test-utils": "^1.0.3",
"axios": "^0.21.1",
"babel-core": "7.0.0-bridge.0",
"babel-eslint": "^10.0.1",
@@ -61,7 +62,7 @@
"element-ui": "~2.13.0",
"eslint": "^6.8.0",
"eslint-plugin-import": "^2.19.1",
- "eslint-plugin-vue": "^6.1.1",
+ "eslint-plugin-vue": "^6.2.2",
"file-saver": "^2.0.2",
"flatted": "^2.0.0",
"jquery": "^3.4.1",
@@ -71,23 +72,23 @@
"lodash.get": "^4.4.2",
"lodash.set": "^4.3.2",
"n8n-workflow": "~0.65.0",
- "node-sass": "^4.12.0",
+ "sass": "^1.26.5",
"normalize-wheel": "^1.0.1",
"prismjs": "^1.17.1",
"quill": "^2.0.0-dev.3",
"quill-autoformat": "^0.1.1",
- "sass-loader": "^8.0.0",
+ "sass-loader": "^8.0.2",
"string-template-parser": "^1.2.6",
"ts-jest": "^26.3.0",
"tslint": "^6.1.2",
"typescript": "~3.9.7",
"uuid": "^8.3.0",
- "vue": "^2.6.9",
+ "vue": "^2.6.11",
"vue-cli-plugin-webpack-bundle-analyzer": "^2.0.0",
"vue-json-pretty": "1.7.1",
"vue-prism-editor": "^0.3.0",
"vue-router": "^3.0.6",
- "vue-template-compiler": "^2.5.17",
+ "vue-template-compiler": "^2.6.11",
"vue-typed-mixins": "^0.2.0",
"vue2-touch-events": "^3.2.1",
"vuex": "^3.1.1"
diff --git a/packages/editor-ui/src/components/About.vue b/packages/editor-ui/src/components/About.vue
index 8b2e901f81..a9bb49f323 100644
--- a/packages/editor-ui/src/components/About.vue
+++ b/packages/editor-ui/src/components/About.vue
@@ -28,9 +28,7 @@
-
- Close
-
+
diff --git a/packages/editor-ui/src/components/BinaryDataDisplay.vue b/packages/editor-ui/src/components/BinaryDataDisplay.vue
index 3a737c1f0f..3945a356ba 100644
--- a/packages/editor-ui/src/components/BinaryDataDisplay.vue
+++ b/packages/editor-ui/src/components/BinaryDataDisplay.vue
@@ -1,14 +1,13 @@
-
- Back to list
-
+ icon="arrow-left"
+ label="Back to list"
+ />
@@ -103,6 +102,7 @@ export default mixins(
text-align: center;
.binary-data-window-wrapper {
+ margin-top: .5em;
padding: 0 1em;
height: calc(100% - 50px);
@@ -112,10 +112,6 @@ export default mixins(
}
}
- .binary-data-window-back {
- margin: 0 0 0.5em 0;
- }
-
.binary-data {
background-color: #fff;
diff --git a/packages/editor-ui/src/components/CollectionParameter.vue b/packages/editor-ui/src/components/CollectionParameter.vue
index ac299c130d..a03e62365c 100644
--- a/packages/editor-ui/src/components/CollectionParameter.vue
+++ b/packages/editor-ui/src/components/CollectionParameter.vue
@@ -7,16 +7,23 @@
-
-
{{ getPlaceholderText }}
-
-
-
-
+
@@ -177,11 +184,10 @@ export default mixins(
diff --git a/packages/editor-ui/src/components/DuplicateWorkflowDialog.vue b/packages/editor-ui/src/components/DuplicateWorkflowDialog.vue
index e76fe0bf30..f35db5ea54 100644
--- a/packages/editor-ui/src/components/DuplicateWorkflowDialog.vue
+++ b/packages/editor-ui/src/components/DuplicateWorkflowDialog.vue
@@ -8,7 +8,7 @@
>
-
- Save
- Cancel
+
+
+
+
@@ -123,3 +125,11 @@ export default mixins(showMessage, workflowHelpers).extend({
},
});
+
+
diff --git a/packages/editor-ui/src/components/Error/NodeViewError.vue b/packages/editor-ui/src/components/Error/NodeViewError.vue
index 4c86eb2571..2f0243f3d9 100644
--- a/packages/editor-ui/src/components/Error/NodeViewError.vue
+++ b/packages/editor-ui/src/components/Error/NodeViewError.vue
@@ -37,9 +37,9 @@
Data below may contain sensitive information. Proceed with caution when sharing.
-
-
-
+
+
+
-
+
Filters:
-
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
-
+
+
-
-
-
+
Auto refresh
@@ -39,7 +35,7 @@
Selected: {{numSelected}} / ~ {{finishedExecutionsCount}}
-
+
@@ -76,10 +72,10 @@
-
+
-
+
@@ -97,13 +93,18 @@
Unknown
-
+
-
-
-
-
+
+
Retry with currently saved workflow
@@ -131,24 +132,20 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
- Load More
-
+
@@ -697,13 +694,7 @@ export default mixins(
}
.retry-button {
- color: $--custom-error-text;
- background-color: $--custom-error-background;
margin-left: 5px;
- &.warning {
- background-color: $--custom-warning-background;
- color: $--custom-warning-text;
- }
}
.selection-options {
@@ -714,30 +705,26 @@ export default mixins(
position: relative;
display: inline-block;
padding: 0 10px;
- height: 30px;
- line-height: 30px;
+ height: 22.6px;
+ line-height: 22.6px;
border-radius: 15px;
text-align: center;
font-weight: 400;
+ font-size: 12px;
&.error {
- background-color: $--custom-error-background;
- color: $--custom-error-text;
- }
-
- &.running {
- background-color: $--custom-running-background;
- color: $--custom-running-text;
+ background-color: var(--color-danger-tint-1);
+ color: var(--color-danger);
}
&.success {
- background-color: $--custom-success-background;
- color: $--custom-success-text;
+ background-color: var(--color-success-tint-1);
+ color: var(--color-success);
}
- &.warning {
- background-color: $--custom-warning-background;
- color: $--custom-warning-text;
+ &.running, &.warning {
+ background-color: var(--color-warning-tint-2);
+ color: var(--color-warning);
}
}
@@ -745,6 +732,10 @@ export default mixins(
font-weight: bold;
}
+.actions-container > * {
+ margin-left: 5px;
+}
+
diff --git a/packages/editor-ui/src/components/ExpressionEdit.vue b/packages/editor-ui/src/components/ExpressionEdit.vue
index fe5e5f4482..ff64dc41eb 100644
--- a/packages/editor-ui/src/components/ExpressionEdit.vue
+++ b/packages/editor-ui/src/components/ExpressionEdit.vue
@@ -117,6 +117,7 @@ export default mixins(
diff --git a/packages/editor-ui/src/components/MainHeader/ExecutionDetails/ExecutionDetails.vue b/packages/editor-ui/src/components/MainHeader/ExecutionDetails/ExecutionDetails.vue
index 02e69ebd0d..7d451ca8e4 100644
--- a/packages/editor-ui/src/components/MainHeader/ExecutionDetails/ExecutionDetails.vue
+++ b/packages/editor-ui/src/components/MainHeader/ExecutionDetails/ExecutionDetails.vue
@@ -97,10 +97,10 @@ export default mixins(titleChange).extend({
.execution-icon {
&.success {
- color: $--custom-success-text-light;
+ color: var(--color-success);
}
&.warning {
- color: $--custom-running-text;
+ color: var(--color-warning);
}
}
diff --git a/packages/editor-ui/src/components/MainHeader/ExecutionDetails/ReadOnly.vue b/packages/editor-ui/src/components/MainHeader/ExecutionDetails/ReadOnly.vue
index f94558a963..526ee3a729 100644
--- a/packages/editor-ui/src/components/MainHeader/ExecutionDetails/ReadOnly.vue
+++ b/packages/editor-ui/src/components/MainHeader/ExecutionDetails/ReadOnly.vue
@@ -1,5 +1,5 @@
-
+
You're viewing the log of a previous execution. You cannot
make changes since this execution already occured. Make changes
@@ -9,5 +9,5 @@
Read only
-
-
\ No newline at end of file
+
+
diff --git a/packages/editor-ui/src/components/MainHeader/MainHeader.vue b/packages/editor-ui/src/components/MainHeader/MainHeader.vue
index 42b25b29bd..db3aaa6629 100644
--- a/packages/editor-ui/src/components/MainHeader/MainHeader.vue
+++ b/packages/editor-ui/src/components/MainHeader/MainHeader.vue
@@ -77,10 +77,6 @@ export default mixins(
&.expanded {
padding-left: $--sidebar-expanded-width;
}
-
- * {
- box-sizing: border-box;
- }
}
.top-menu {
diff --git a/packages/editor-ui/src/components/MainSidebar.vue b/packages/editor-ui/src/components/MainSidebar.vue
index f214802765..4ca6233512 100644
--- a/packages/editor-ui/src/components/MainSidebar.vue
+++ b/packages/editor-ui/src/components/MainSidebar.vue
@@ -492,7 +492,7 @@ export default mixins(
diff --git a/packages/editor-ui/src/components/MultipleParameter.vue b/packages/editor-ui/src/components/MultipleParameter.vue
index 2aeef6df26..36f2570d04 100644
--- a/packages/editor-ui/src/components/MultipleParameter.vue
+++ b/packages/editor-ui/src/components/MultipleParameter.vue
@@ -3,10 +3,10 @@
{{parameter.displayName}}:
-
-
+
+
-
+
@@ -21,7 +21,7 @@
@@ -29,7 +29,7 @@
Currently no items exist
- {{ addButtonText }}
+
@@ -141,10 +141,6 @@ export default mixins(genericHelpers)
margin: 0.5em 0 0em 2em;
}
-.add-item {
- width: 100%;
-}
-
.delete-item {
display: none;
position: absolute;
diff --git a/packages/editor-ui/src/components/Node.vue b/packages/editor-ui/src/components/Node.vue
index 99a53d15e7..4955b5c13b 100644
--- a/packages/editor-ui/src/components/Node.vue
+++ b/packages/editor-ui/src/components/Node.vue
@@ -2,18 +2,18 @@
@@ -218,6 +218,7 @@ export default mixins(externalHooks, nodeBase, nodeHelpers, workflowHelpers).ext
height: 100px;
.node-description {
+ line-height: 1.5;
position: absolute;
bottom: -55px;
left: -50px;
@@ -307,7 +308,7 @@ export default mixins(externalHooks, nodeBase, nodeHelpers, workflowHelpers).ext
.node-info-icon {
position: absolute;
- top: -18px;
+ top: -14px;
right: 12px;
z-index: 11;
@@ -350,9 +351,8 @@ export default mixins(externalHooks, nodeBase, nodeHelpers, workflowHelpers).ext
text-align: center;
.option {
- width: 20px;
+ width: 28px;
display: inline-block;
- padding: 0 0.3em;
&.touch {
display: none;
diff --git a/packages/editor-ui/src/components/NodeCreator/MainPanel.vue b/packages/editor-ui/src/components/NodeCreator/MainPanel.vue
index bd7f665dbd..c6475d3695 100644
--- a/packages/editor-ui/src/components/NodeCreator/MainPanel.vue
+++ b/packages/editor-ui/src/components/NodeCreator/MainPanel.vue
@@ -279,15 +279,15 @@ export default mixins(externalHooks).extend({
diff --git a/packages/editor-ui/src/components/ParameterInputFull.vue b/packages/editor-ui/src/components/ParameterInputFull.vue
index b15c002674..f1779dd1ba 100644
--- a/packages/editor-ui/src/components/ParameterInputFull.vue
+++ b/packages/editor-ui/src/components/ParameterInputFull.vue
@@ -1,14 +1,14 @@
-
+
{{parameter.displayName}} :
-
-
+
+
-
+
-
+
@@ -74,7 +74,12 @@ export default Vue
\ No newline at end of file
+
+.saved {
+ color: $--custom-font-very-light;
+ font-size: 12px;
+ font-weight: 600;
+ line-height: 12px;
+ text-align: center;
+ padding: var(--spacing-2xs) var(--spacing-xs);
+}
+
diff --git a/packages/editor-ui/src/components/TagsDropdown.vue b/packages/editor-ui/src/components/TagsDropdown.vue
index 98b673f054..26e5674e3a 100644
--- a/packages/editor-ui/src/components/TagsDropdown.vue
+++ b/packages/editor-ui/src/components/TagsDropdown.vue
@@ -1,6 +1,6 @@
-
-
Create tag "{{ filter }}"
-
-
+
+
Type to create a tag
No matching tags exist
No tags exist
-
+
-
-
+
Manage tags
-
-
+
+
@@ -235,31 +236,12 @@ export default mixins(showMessage).extend({
\ No newline at end of file
+
diff --git a/packages/editor-ui/src/components/TagsManager/TagsManager.vue b/packages/editor-ui/src/components/TagsManager/TagsManager.vue
index 8bb3fead02..1ba310a3db 100644
--- a/packages/editor-ui/src/components/TagsManager/TagsManager.vue
+++ b/packages/editor-ui/src/components/TagsManager/TagsManager.vue
@@ -24,7 +24,7 @@
- Done
+
diff --git a/packages/editor-ui/src/components/TagsManager/TagsView/TagsTable.vue b/packages/editor-ui/src/components/TagsManager/TagsView/TagsTable.vue
index 6afb3b6e0d..b47df283ba 100644
--- a/packages/editor-ui/src/components/TagsManager/TagsView/TagsTable.vue
+++ b/packages/editor-ui/src/components/TagsManager/TagsView/TagsTable.vue
@@ -13,13 +13,13 @@
-
+ >
Are you sure you want to delete this tag?
@@ -44,22 +44,20 @@
- Cancel
-
- Create tag
-
+
+
- Cancel
- Save changes
+
+
- Cancel
- Delete tag
+
+
-
-
+
+
@@ -170,11 +168,6 @@ export default Vue.extend({
min-height: 45px;
display: flex;
align-items: center;
-
- /deep/ input {
- border: 1px solid $--color-primary;
- background: white;
- }
}
.ops {
@@ -183,8 +176,9 @@ export default Vue.extend({
align-items: center;
display: flex;
flex-wrap: nowrap;
+ float: right;
- > .el-button {
+ > * {
margin: 2px;
}
}
@@ -199,22 +193,17 @@ export default Vue.extend({
opacity: 0;
}
-.ops.main > .el-button {
+.ops.main {
display: none;
- float: right;
margin-left: 2px;
}
-/deep/ tr.disabled {
+::v-deep tr.disabled {
pointer-events: none;
}
-/deep/ tr:hover .ops:not(.disabled) .el-button {
- display: block;
-}
-
-/deep/ .el-input.is-disabled > input {
- border: none;
+tr:hover .ops:not(.disabled) {
+ display: flex;
}
.fade-enter-active,
@@ -225,4 +214,4 @@ export default Vue.extend({
.fade-leave-to {
opacity: 0;
}
-
\ No newline at end of file
+
diff --git a/packages/editor-ui/src/components/TagsManager/TagsView/TagsTableHeader.vue b/packages/editor-ui/src/components/TagsManager/TagsView/TagsTableHeader.vue
index 3977104eab..7f7aefe0ac 100644
--- a/packages/editor-ui/src/components/TagsManager/TagsView/TagsTableHeader.vue
+++ b/packages/editor-ui/src/components/TagsManager/TagsView/TagsTableHeader.vue
@@ -1,7 +1,7 @@
@@ -53,8 +50,4 @@ export default Vue.extend({
.tags-header {
margin-bottom: 15px;
}
-
-.el-button {
- float: right;
-}
-
\ No newline at end of file
+
diff --git a/packages/editor-ui/src/components/TextEdit.vue b/packages/editor-ui/src/components/TextEdit.vue
index f236998673..52fc71166b 100644
--- a/packages/editor-ui/src/components/TextEdit.vue
+++ b/packages/editor-ui/src/components/TextEdit.vue
@@ -7,7 +7,7 @@
{{parameter.displayName}}:
-
+
diff --git a/packages/editor-ui/src/components/VariableSelector.vue b/packages/editor-ui/src/components/VariableSelector.vue
index f55db7d272..6f9c6734c1 100644
--- a/packages/editor-ui/src/components/VariableSelector.vue
+++ b/packages/editor-ui/src/components/VariableSelector.vue
@@ -1,7 +1,7 @@
-
+
diff --git a/packages/editor-ui/src/components/VariableSelectorItem.vue b/packages/editor-ui/src/components/VariableSelectorItem.vue
index 3c52494878..529384778d 100644
--- a/packages/editor-ui/src/components/VariableSelectorItem.vue
+++ b/packages/editor-ui/src/components/VariableSelectorItem.vue
@@ -123,7 +123,7 @@ export default Vue.extend({
font-weight: 600;
font-size: 0.8em;
white-space: nowrap;
- overflow-x: hidden;
+ overflow: hidden;
text-overflow: ellipsis;
}
.headline {
diff --git a/packages/editor-ui/src/components/WarningTooltip.vue b/packages/editor-ui/src/components/WarningTooltip.vue
index da6a7ad017..dadfc814e3 100644
--- a/packages/editor-ui/src/components/WarningTooltip.vue
+++ b/packages/editor-ui/src/components/WarningTooltip.vue
@@ -1,8 +1,8 @@
-
+
-
+
@@ -12,4 +12,4 @@
height: 18px;
color: $--warning-tooltip-color;
}
-
\ No newline at end of file
+
diff --git a/packages/editor-ui/src/components/WorkflowActivator.vue b/packages/editor-ui/src/components/WorkflowActivator.vue
index b1517d59d0..d051b0100b 100644
--- a/packages/editor-ui/src/components/WorkflowActivator.vue
+++ b/packages/editor-ui/src/components/WorkflowActivator.vue
@@ -12,10 +12,10 @@
-
+
The workflow is set to be active but could not be started. Click to display error message.
-
+
@@ -185,7 +185,7 @@ export default mixins(
margin-left: 0.5em;
}
-/deep/ .el-loading-spinner {
+::v-deep .el-loading-spinner {
margin-top: -10px;
}
diff --git a/packages/editor-ui/src/components/WorkflowOpen.vue b/packages/editor-ui/src/components/WorkflowOpen.vue
index 77e9e8a640..9ced9332cf 100644
--- a/packages/editor-ui/src/components/WorkflowOpen.vue
+++ b/packages/editor-ui/src/components/WorkflowOpen.vue
@@ -19,9 +19,9 @@
/>
-
-
-
+
+
+
diff --git a/packages/editor-ui/src/components/WorkflowSettings.vue b/packages/editor-ui/src/components/WorkflowSettings.vue
index e92322d2a1..2014108221 100644
--- a/packages/editor-ui/src/components/WorkflowSettings.vue
+++ b/packages/editor-ui/src/components/WorkflowSettings.vue
@@ -1,133 +1,132 @@
-
+
Error Workflow:
-
+
-
+
-
-
+
-
-
+
+
Timezone:
-
+
-
+
-
-
+
-
-
+
+
Save Data Error Execution:
-
+
-
+
-
-
+
-
-
+
+
Save Data Success Execution:
-
+
-
+
-
-
+
-
-
+
+
Save Manual Executions:
-
+
-
+
-
-
+
-
-
+
+
Save Execution Progress:
-
+
-
+
-
-
+
-
-
+
+
Timeout Workflow:
-
+
-
+
@@ -135,29 +134,30 @@
Timeout After:
-
+
-
+
-
- hours
+ setTimeout('hours', value)" :min="0">
+ hours
+
-
-
- minutes
+
+ setTimeout('minutes', value)" :min="0" :max="60">
+ minutes
+
-
-
- seconds
+
+ setTimeout('seconds', value)" :min="0" :max="60">
+ seconds
+
-
- Save
-
+
@@ -237,6 +237,14 @@ export default mixins(
this.$emit('closeDialog');
return false;
},
+ setTimeout (key: string, value: string) {
+ const time = value ? parseInt(value, 10) : 0;
+
+ this.timeoutHMS = {
+ ...this.timeoutHMS,
+ [key]: time,
+ };
+ },
async loadSaveDataErrorExecutionOptions () {
this.saveDataErrorExecutionOptions.length = 0;
this.saveDataErrorExecutionOptions.push.apply( // eslint-disable-line no-useless-call
@@ -471,7 +479,7 @@ export default mixins(
});
this.closeDialog();
-
+
this.$externalHooks().run('workflowSettings.saveSettings', { oldSettings });
},
toggleTimeout() {
@@ -518,9 +526,8 @@ export default mixins(
}
}
-.timeout-setting-name {
- text-align: center;
- width: calc(100% - 20px);
+.timeout-input {
+ margin-left: 5px;
}
diff --git a/packages/editor-ui/src/components/mixins/emitter.ts b/packages/editor-ui/src/components/mixins/emitter.ts
index 0df8bcd534..3514c3def7 100644
--- a/packages/editor-ui/src/components/mixins/emitter.ts
+++ b/packages/editor-ui/src/components/mixins/emitter.ts
@@ -7,6 +7,7 @@ function broadcast(componentName: string, eventName: string, params: any) { // t
if (name === componentName) {
// @ts-ignore
+ // eslint-disable-next-line prefer-spread
child.$emit.apply(child, [eventName].concat(params));
} else {
// @ts-ignore
@@ -30,6 +31,7 @@ export default Vue.extend({
}
if (parent) {
// @ts-ignore
+ // eslint-disable-next-line prefer-spread
parent.$emit.apply(parent, [eventName].concat(params));
}
},
@@ -37,4 +39,4 @@ export default Vue.extend({
broadcast.call(this, componentName, eventName, params);
},
},
-});
\ No newline at end of file
+});
diff --git a/packages/editor-ui/src/components/mixins/genericHelpers.ts b/packages/editor-ui/src/components/mixins/genericHelpers.ts
index 54d24edab0..a1eee3d8b8 100644
--- a/packages/editor-ui/src/components/mixins/genericHelpers.ts
+++ b/packages/editor-ui/src/components/mixins/genericHelpers.ts
@@ -59,6 +59,7 @@ export const genericHelpers = mixins(showMessage).extend({
return;
}
+ // @ts-ignore
this.loadingService = this.$loading(
{
lock: true,
diff --git a/packages/editor-ui/src/components/mixins/showMessage.ts b/packages/editor-ui/src/components/mixins/showMessage.ts
index 14a8021db5..bf4fdae9b2 100644
--- a/packages/editor-ui/src/components/mixins/showMessage.ts
+++ b/packages/editor-ui/src/components/mixins/showMessage.ts
@@ -1,4 +1,4 @@
-import { Notification } from 'element-ui';
+// @ts-ignore
import { ElNotificationComponent, ElNotificationOptions } from 'element-ui/types/notification';
import mixins from 'vue-typed-mixins';
@@ -13,10 +13,11 @@ export const showMessage = mixins(externalHooks).extend({
messageData.position = 'bottom-right';
}
- return Notification(messageData);
+ return this.$notify(messageData);
},
$showWarning(title: string, message: string, config?: {onClick?: () => void, duration?: number, customClass?: string, closeOnClick?: boolean}) {
+ // eslint-disable-next-line prefer-const
let notification: ElNotificationComponent;
if (config && config.closeOnClick) {
const cb = config.onClick;
diff --git a/packages/editor-ui/src/components/mixins/workflowHelpers.ts b/packages/editor-ui/src/components/mixins/workflowHelpers.ts
index 3eda0d42ac..64d8028ba3 100644
--- a/packages/editor-ui/src/components/mixins/workflowHelpers.ts
+++ b/packages/editor-ui/src/components/mixins/workflowHelpers.ts
@@ -546,8 +546,7 @@ export const workflowHelpers = mixins(
async dataHasChanged(id: string) {
const currentData = await this.getWorkflowDataToSave();
- let data: IWorkflowDb;
- data = await this.restApi().getWorkflow(id);
+ const data: IWorkflowDb = await this.restApi().getWorkflow(id);
if(data !== undefined) {
const x = {
diff --git a/packages/editor-ui/src/main.ts b/packages/editor-ui/src/main.ts
index f45d674a2f..6e212de852 100644
--- a/packages/editor-ui/src/main.ts
+++ b/packages/editor-ui/src/main.ts
@@ -2,16 +2,11 @@
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue';
+import './plugins';
import 'prismjs';
import 'prismjs/themes/prism.css';
import 'vue-prism-editor/dist/VuePrismEditor.css';
import 'vue-json-pretty/lib/styles.css';
-import Vue2TouchEvents from 'vue2-touch-events';
-
-import * as ElementUI from 'element-ui';
-// @ts-ignore
-import locale from 'element-ui/lib/locale/lang/en';
-
import './n8n-theme.scss';
import App from '@/App.vue';
@@ -19,188 +14,8 @@ import router from './router';
import { runExternalHook } from './components/mixins/externalHooks';
-// @ts-ignore
-import vClickOutside from 'v-click-outside';
-import Fragment from 'vue-fragment';
-
-import { library } from '@fortawesome/fontawesome-svg-core';
-import {
- faAngleDoubleLeft,
- faAngleDown,
- faAngleRight,
- faAngleUp,
- faArrowLeft,
- faArrowRight,
- faAt,
- faBook,
- faBug,
- faCalendar,
- faCheck,
- faChevronDown,
- faChevronUp,
- faCode,
- faCodeBranch,
- faCog,
- faCogs,
- faClock,
- faClone,
- faCloud,
- faCloudDownloadAlt,
- faCopy,
- faCut,
- faDotCircle,
- faEdit,
- faEnvelope,
- faEye,
- faExclamationTriangle,
- faExpand,
- faExternalLinkAlt,
- faExchangeAlt,
- faFile,
- faFileArchive,
- faFileCode,
- faFileDownload,
- faFileExport,
- faFileImport,
- faFilePdf,
- faFolderOpen,
- faGift,
- faHdd,
- faHome,
- faHourglass,
- faImage,
- faInbox,
- faInfo,
- faInfoCircle,
- faKey,
- faMapSigns,
- faNetworkWired,
- faPause,
- faPauseCircle,
- faPen,
- faPlay,
- faPlayCircle,
- faPlus,
- faPlusCircle,
- faQuestion,
- faQuestionCircle,
- faRedo,
- faRss,
- faSave,
- faSearch,
- faSearchMinus,
- faSearchPlus,
- faServer,
- faSignInAlt,
- faSlidersH,
- faSpinner,
- faStop,
- faSun,
- faSync,
- faSyncAlt,
- faTable,
- faTasks,
- faTerminal,
- faThLarge,
- faTimes,
- faTrash,
- faUndo,
- faUsers,
-} from '@fortawesome/free-solid-svg-icons';
-import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
-
import { store } from './store';
-Vue.use(Vue2TouchEvents);
-
-Vue.use(ElementUI, { locale });
-Vue.use(vClickOutside);
-
-library.add(faAngleDoubleLeft);
-library.add(faAngleDown);
-library.add(faAngleRight);
-library.add(faAngleUp);
-library.add(faArrowLeft);
-library.add(faArrowRight);
-library.add(faAt);
-library.add(faBook);
-library.add(faBug);
-library.add(faCalendar);
-library.add(faCheck);
-library.add(faChevronDown);
-library.add(faChevronUp);
-library.add(faCode);
-library.add(faCodeBranch);
-library.add(faCog);
-library.add(faCogs);
-library.add(faClock);
-library.add(faClone);
-library.add(faCloud);
-library.add(faCloudDownloadAlt);
-library.add(faCopy);
-library.add(faCut);
-library.add(faDotCircle);
-library.add(faEdit);
-library.add(faEnvelope);
-library.add(faEye);
-library.add(faExclamationTriangle);
-library.add(faExpand);
-library.add(faExternalLinkAlt);
-library.add(faExchangeAlt);
-library.add(faFile);
-library.add(faFileArchive);
-library.add(faFileCode);
-library.add(faFileDownload);
-library.add(faFileExport);
-library.add(faFileImport);
-library.add(faFilePdf);
-library.add(faFolderOpen);
-library.add(faGift);
-library.add(faHdd);
-library.add(faHome);
-library.add(faHourglass);
-library.add(faImage);
-library.add(faInbox);
-library.add(faInfo);
-library.add(faInfoCircle);
-library.add(faKey);
-library.add(faMapSigns);
-library.add(faNetworkWired);
-library.add(faPause);
-library.add(faPauseCircle);
-library.add(faPen);
-library.add(faPlay);
-library.add(faPlayCircle);
-library.add(faPlus);
-library.add(faPlusCircle);
-library.add(faQuestion);
-library.add(faQuestionCircle);
-library.add(faRedo);
-library.add(faRss);
-library.add(faSave);
-library.add(faSearch);
-library.add(faSearchMinus);
-library.add(faSearchPlus);
-library.add(faServer);
-library.add(faSignInAlt);
-library.add(faSlidersH);
-library.add(faSpinner);
-library.add(faStop);
-library.add(faSun);
-library.add(faSync);
-library.add(faSyncAlt);
-library.add(faTable);
-library.add(faTasks);
-library.add(faTerminal);
-library.add(faThLarge);
-library.add(faTimes);
-library.add(faTrash);
-library.add(faUndo);
-library.add(faUsers);
-
-Vue.component('font-awesome-icon', FontAwesomeIcon);
-Vue.use(Fragment.Plugin);
-
Vue.config.productionTip = false;
router.afterEach((to, from) => {
runExternalHook('main.routeChange', store, { from, to });
diff --git a/packages/editor-ui/src/n8n-theme-variables.scss b/packages/editor-ui/src/n8n-theme-variables.scss
index 9e0c61695d..b414edca4b 100644
--- a/packages/editor-ui/src/n8n-theme-variables.scss
+++ b/packages/editor-ui/src/n8n-theme-variables.scss
@@ -18,16 +18,6 @@ $--custom-expression-background: #f7f5ff;
$--custom-window-sidebar-top : #fff5f2;
-$--custom-error-background : #ffe5e5;
-$--custom-error-text : #eb2222;
-$--custom-running-background : #ffffe5;
-$--custom-running-text : #eb9422;
-$--custom-success-background : #e3f0e4;
-$--custom-success-text-light: #2f4;
-$--custom-success-text : #40c351;
-$--custom-warning-background : #ffffe5;
-$--custom-warning-text : #eb9422;
-
// Badge
$--badge-danger-color: #f45959;
$--badge-danger-background-color: #fef0f0;
@@ -74,9 +64,6 @@ $--breakpoint-sm: 992px;
$--breakpoint-md: 1200px;
$--breakpoint-lg: 1920px;
-// scrollbars
-$--scrollbar-thumb-color: lighten($--color-primary, 20%);
-
// tags
$--tag-background-color: #dce1e9;
$--tag-text-color: #3d3f46;
diff --git a/packages/editor-ui/src/n8n-theme.scss b/packages/editor-ui/src/n8n-theme.scss
index a32a6d3d79..b524e11158 100644
--- a/packages/editor-ui/src/n8n-theme.scss
+++ b/packages/editor-ui/src/n8n-theme.scss
@@ -1,35 +1,9 @@
-// https://github.com/ElemeFE/element/blob/dev/packages/theme-chalk/src/table.scss
-
-
@import "./n8n-theme-variables";
-$--font-path: '~element-ui/lib/theme-chalk/fonts';
-
-@import "~element-ui/packages/theme-chalk/src/index";
-@import "~element-ui/lib/theme-chalk/display.css";
+@import "~n8n-design-system/theme/dist/index.css";
body {
- font-family: 'Open Sans', sans-serif;
- font-weight: 300;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
background-color: $--custom-node-view-background;
- margin: 0;
- overscroll-behavior-x: none;
- padding: 0;
-}
-
-input {
- font-family: 'Open Sans', sans-serif;
- font-weight: 400;
-}
-button {
- font-family: 'Open Sans', sans-serif;
- font-weight: 600;
-}
-
-h1, h2, h3, h4, h5, h6 {
- color: #555;
}
.clickable {
@@ -159,8 +133,11 @@ h1, h2, h3, h4, h5, h6 {
left: 60px;
top: 1px;
}
- }
+ &:hover, &:focus {
+ background-color: #fff0ef;
+ }
+ }
}
.el-menu--vertical {
.el-menu-item {
@@ -210,128 +187,6 @@ h1, h2, h3, h4, h5, h6 {
}
}
-
-// Select input
-.el-scrollbar {
- background-color: #fff;
-}
-.el-select-dropdown__item {
- font-size: 0.8em;
- color: #555;
- height: auto;
- line-height: 1.8em;
- margin: 0.25em 0;
- padding: 0.25em 1em;
-}
-.el-select-dropdown__item.selected {
- font-weight: normal;
-}
-.el-select-dropdown__item + .el-select-dropdown__item {
- border-top: 1px solid #ddd;
-}
-.el-dropdown-menu__item {
- color: $--color-primary;
-}
-
-
-// Color-Picker
-.color-picker {
- .el-color-picker__trigger {
- border: none;
- background: none;
- padding: 2px 0 0 4px;
- .el-color-picker__icon {
- color: $--color-primary;
- left: 14px;
- }
- }
- .el-color-picker__color {
- position: relative;
- top: 2px;
- width: 20px;
- height: 20px;
- border: none;
- }
- .el-color-picker__color:hover {
- transform: scale(1.1);
- }
- .el-color-picker__color-inner {
- border: none;
- border-radius: 11px;
- }
-}
-
-
-// Date selector
-.el-date-editor.el-input {
- width: 100%;
-}
-
-// Select input
-.el-select {
- width: 100%;
- .el-tag {
- color: $--custom-input-font;
-
- .el-tag__close.el-icon-close {
- background-color: $--custom-input-font;
-
- &:hover {
- background-color: $--custom-input-font;
- transform: scale(0.8);
- }
- }
- }
-}
-.el-switch__label {
- color: #fff;
-}
-
-
-// Input
-.el-input__inner {
- border-radius: 20px;
- text-overflow: ellipsis;
-}
-.el-input--small .el-input__inner {
- border-radius: 13px;
-}
-.el-input__inner,
-.el-input__inner:hover {
- background-color: $--custom-input-background;
- color: $--custom-input-font;
- border: none;
- outline: 0;
-}
-
-
-// Number Input
-.el-input-number {
- background-color: $--custom-input-background;
- border-radius: 16px;
- width: calc(100% - 20px);
-
- .el-input-number__decrease,
- .el-input-number__increase {
- border: none;
- color: #fff;
- background-color: $--custom-table-background-main;
- width: 20px;
- height: 20px;
- line-height: 20px;
- border-radius: 10px;
- margin: 3px;
- }
- .el-input-number__decrease:hover,
- .el-input-number__increase:hover {
- transform: scale(1.1);
- }
- .el-input-number__decrease.is-disabled,
- .el-input-number__increase.is-disabled {
- background-color: $--custom-input-background-disabled;
- }
-}
-
// Transfer list (nodes)
.el-transfer {
.el-transfer-panel {
@@ -354,63 +209,6 @@ h1, h2, h3, h4, h5, h6 {
}
}
-// Buttons
-.el-button,
-.el-button:active,
-.el-button:focus {
- border: none;
- border-radius: 20px;
- color: #fff;
- font-weight: 600;
- background-color: $--color-primary;
-
- .next-icon-text {
- display: inline-block;
- margin-left: 10px;
- }
-}
-.el-button.el-button--mini:not(.is-circle) {
- padding: 7px 10px;
-}
-.el-button:hover {
- background-color: $--color-primary;
- color: #fff;
- transform: scale(1.05);
-}
-.el-input.is-disabled .el-input__inner,
-.el-button.is-disabled,
-.el-button.is-disabled:hover,
-.el-button.is-disabled:focus {
- background-color: $--custom-input-background-disabled;
- border-color: #555;
- color: $--custom-input-font-disabled;
-}
-.el-button.is-plain,.el-button.is-plain:hover {
- color: $--color-primary;
- border: 1px solid $--color-primary;
- background-color: #fff;
-}
-
-// Textarea
-.ql-editor,
-.el-textarea textarea,
-.el-textarea textarea:active,
-.el-textarea textarea:focus,
-.el-textarea textarea:hover {
- background-color: $--custom-input-background;
- color: $--custom-input-font;
- border: none;
- border-radius: 3px;
- outline: 0;
- padding: 0.8em 1em;
- line-height: 1.5em;
-}
-.el-textarea.is-disabled .el-textarea__inner {
- background-color: $--custom-input-background-disabled;
- color: $--custom-input-font-disabled;
-}
-
-
// Tabs
.type-selector:focus,
.el-tabs__header:focus,
@@ -450,14 +248,6 @@ h1, h2, h3, h4, h5, h6 {
color: #555;
}
-// Tooltip
-.el-tooltip__popper.is-light {
- border: none;
- -webkit-box-shadow: 0px 0px 12px 0px rgba(0,0,0,0.15);
- -moz-box-shadow: 0px 0px 12px 0px rgba(0,0,0,0.15);
- box-shadow: 0px 0px 12px 0px rgba(0,0,0,0.15);
-}
-
// Notification
.el-notification {
border-radius: 0;
@@ -469,36 +259,6 @@ h1, h2, h3, h4, h5, h6 {
}
-// Custom scrollbar
-::-webkit-scrollbar {
- width: 12px;
- height: 12px;
-}
-::-webkit-scrollbar-track {
- border-radius: 6px;
-}
-::-webkit-scrollbar-track:hover {
- background: #ddd;
-}
-::-webkit-scrollbar-thumb {
- border-radius: 6px;
- background: $--scrollbar-thumb-color;
-}
-::-webkit-scrollbar-thumb:hover {
- background: $--color-primary;
-}
-
-.el-dialog__wrapper {
- &::-webkit-scrollbar-track,
- &::-webkit-scrollbar-track:hover {
- background: #fff;
- }
- &::-webkit-scrollbar-thumb {
- background: $--color-primary;
- border-radius: 6px;
- }
-}
-
.tags-container {
.el-tag {
color: $--tag-text-color;
diff --git a/packages/editor-ui/src/plugins/compontents.ts b/packages/editor-ui/src/plugins/compontents.ts
new file mode 100644
index 0000000000..a1e90d3571
--- /dev/null
+++ b/packages/editor-ui/src/plugins/compontents.ts
@@ -0,0 +1,158 @@
+// @ts-nocheck
+
+import Vue from "vue";
+import Fragment from 'vue-fragment';
+
+import "regenerator-runtime/runtime";
+
+import Drawer from 'element-ui/lib/drawer';
+import Dialog from 'element-ui/lib/dialog';
+import Dropdown from 'element-ui/lib/dropdown';
+import DropdownMenu from 'element-ui/lib/dropdown-menu';
+import DropdownItem from 'element-ui/lib/dropdown-item';
+import Menu from 'element-ui/lib/menu';
+import Submenu from 'element-ui/lib/submenu';
+import MenuItem from 'element-ui/lib/menu-item';
+import Radio from 'element-ui/lib/radio';
+import RadioGroup from 'element-ui/lib/radio-group';
+import RadioButton from 'element-ui/lib/radio-button';
+import Checkbox from 'element-ui/lib/checkbox';
+import Switch from 'element-ui/lib/switch';
+import Select from 'element-ui/lib/select';
+import Option from 'element-ui/lib/option';
+import OptionGroup from 'element-ui/lib/option-group';
+import ButtonGroup from 'element-ui/lib/button-group';
+import Table from 'element-ui/lib/table';
+import TableColumn from 'element-ui/lib/table-column';
+import DatePicker from 'element-ui/lib/date-picker';
+import Tabs from 'element-ui/lib/tabs';
+import TabPane from 'element-ui/lib/tab-pane';
+import Tag from 'element-ui/lib/tag';
+import Row from 'element-ui/lib/row';
+import Col from 'element-ui/lib/col';
+import Badge from 'element-ui/lib/badge';
+import Card from 'element-ui/lib/card';
+import ColorPicker from 'element-ui/lib/color-picker';
+import Transfer from 'element-ui/lib/transfer';
+import Container from 'element-ui/lib/container';
+import Loading from 'element-ui/lib/loading';
+import MessageBox from 'element-ui/lib/message-box';
+import Message from 'element-ui/lib/message';
+import Notification from 'element-ui/lib/notification';
+import CollapseTransition from 'element-ui/lib/transitions/collapse-transition';
+
+// @ts-ignore
+import lang from 'element-ui/lib/locale/lang/en';
+// @ts-ignore
+import locale from 'element-ui/lib/locale';
+
+import {
+ N8nIconButton,
+ N8nButton,
+ N8nInput,
+ N8nInputLabel,
+ N8nInputNumber,
+ N8nSelect,
+ N8nOption,
+} from 'n8n-design-system';
+import { ElMessageBoxOptions } from "element-ui/types/message-box";
+
+Vue.use(Fragment.Plugin);
+
+// n8n design system
+Vue.use(N8nButton);
+Vue.use(N8nIconButton);
+Vue.use(N8nInput);
+Vue.use(N8nInputLabel);
+Vue.use(N8nInputNumber);
+Vue.use(N8nSelect);
+Vue.use(N8nOption);
+
+// element io
+locale.use(lang);
+
+Vue.use(Dialog);
+Vue.use(Drawer);
+Vue.use(Dropdown);
+Vue.use(DropdownMenu);
+Vue.use(DropdownItem);
+Vue.use(Menu);
+Vue.use(Submenu);
+Vue.use(MenuItem);
+Vue.use(Radio);
+Vue.use(RadioGroup);
+Vue.use(RadioButton);
+Vue.use(Checkbox);
+Vue.use(Switch);
+Vue.use(Select);
+Vue.use(Option);
+Vue.use(OptionGroup);
+Vue.use(ButtonGroup);
+Vue.use(Table);
+Vue.use(TableColumn);
+Vue.use(DatePicker);
+Vue.use(Tabs);
+Vue.use(TabPane);
+Vue.use(Tag);
+Vue.use(Row);
+Vue.use(Col);
+Vue.use(Badge);
+Vue.use(Card);
+Vue.use(ColorPicker);
+Vue.use(Transfer);
+Vue.use(Container);
+
+Vue.component(CollapseTransition.name, CollapseTransition);
+
+Vue.use(Loading.directive);
+
+Vue.prototype.$loading = Loading.service;
+Vue.prototype.$msgbox = MessageBox;
+
+Vue.prototype.$alert = async (message: string, configOrTitle: string | ElMessageBoxOptions | undefined, config: ElMessageBoxOptions | undefined) => {
+ let temp = config || (typeof configOrTitle === 'object' ? configOrTitle : {});
+ temp = {
+ ...temp,
+ roundButton: true,
+ cancelButtonClass: 'btn--cancel',
+ confirmButtonClass: 'btn--confirm',
+ };
+
+ if (typeof configOrTitle === 'string') {
+ return await MessageBox.alert(message, configOrTitle, temp);
+ }
+ return await MessageBox.alert(message, temp);
+};
+
+Vue.prototype.$confirm = async (message: string, configOrTitle: string | ElMessageBoxOptions | undefined, config: ElMessageBoxOptions | undefined) => {
+ let temp = config || (typeof configOrTitle === 'object' ? configOrTitle : {});
+ temp = {
+ ...temp,
+ roundButton: true,
+ cancelButtonClass: 'btn--cancel',
+ confirmButtonClass: 'btn--confirm',
+ };
+
+ if (typeof configOrTitle === 'string') {
+ return await MessageBox.confirm(message, configOrTitle, temp);
+ }
+ return await MessageBox.confirm(message, temp);
+};
+
+Vue.prototype.$prompt = async (message: string, configOrTitle: string | ElMessageBoxOptions | undefined, config: ElMessageBoxOptions | undefined) => {
+ let temp = config || (typeof configOrTitle === 'object' ? configOrTitle : {});
+ temp = {
+ ...temp,
+ roundButton: true,
+ cancelButtonClass: 'btn--cancel',
+ confirmButtonClass: 'btn--confirm',
+ };
+
+ if (typeof configOrTitle === 'string') {
+ return await MessageBox.prompt(message, configOrTitle, temp);
+ }
+ return await MessageBox.prompt(message, temp);
+};
+
+Vue.prototype.$notify = Notification;
+Vue.prototype.$message = Message;
diff --git a/packages/editor-ui/src/plugins/directives.ts b/packages/editor-ui/src/plugins/directives.ts
new file mode 100644
index 0000000000..b1ff6f0357
--- /dev/null
+++ b/packages/editor-ui/src/plugins/directives.ts
@@ -0,0 +1,8 @@
+import Vue from "vue";
+
+import Vue2TouchEvents from 'vue2-touch-events';
+// @ts-ignore
+import vClickOutside from 'v-click-outside';
+
+Vue.use(Vue2TouchEvents);
+Vue.use(vClickOutside);
diff --git a/packages/editor-ui/src/plugins/icons.ts b/packages/editor-ui/src/plugins/icons.ts
new file mode 100644
index 0000000000..bf7d57fd7c
--- /dev/null
+++ b/packages/editor-ui/src/plugins/icons.ts
@@ -0,0 +1,172 @@
+import Vue from 'vue';
+
+import { library } from '@fortawesome/fontawesome-svg-core';
+import {
+ faAngleDoubleLeft,
+ faAngleDown,
+ faAngleRight,
+ faAngleUp,
+ faArrowLeft,
+ faArrowRight,
+ faAt,
+ faBook,
+ faBug,
+ faCalendar,
+ faCheck,
+ faChevronDown,
+ faChevronUp,
+ faCode,
+ faCodeBranch,
+ faCog,
+ faCogs,
+ faClock,
+ faClone,
+ faCloud,
+ faCloudDownloadAlt,
+ faCopy,
+ faCut,
+ faDotCircle,
+ faEdit,
+ faEnvelope,
+ faEye,
+ faExclamationTriangle,
+ faExpand,
+ faExternalLinkAlt,
+ faExchangeAlt,
+ faFile,
+ faFileArchive,
+ faFileCode,
+ faFileDownload,
+ faFileExport,
+ faFileImport,
+ faFilePdf,
+ faFolderOpen,
+ faGift,
+ faHdd,
+ faHome,
+ faHourglass,
+ faImage,
+ faInbox,
+ faInfo,
+ faInfoCircle,
+ faKey,
+ faMapSigns,
+ faNetworkWired,
+ faPause,
+ faPauseCircle,
+ faPen,
+ faPlay,
+ faPlayCircle,
+ faPlus,
+ faPlusCircle,
+ faQuestion,
+ faQuestionCircle,
+ faRedo,
+ faRss,
+ faSave,
+ faSearch,
+ faSearchMinus,
+ faSearchPlus,
+ faServer,
+ faSignInAlt,
+ faSlidersH,
+ faSpinner,
+ faStop,
+ faSun,
+ faSync,
+ faSyncAlt,
+ faTable,
+ faTasks,
+ faTerminal,
+ faThLarge,
+ faTimes,
+ faTrash,
+ faUndo,
+ faUsers,
+} from '@fortawesome/free-solid-svg-icons';
+import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
+
+library.add(faAngleDoubleLeft);
+library.add(faAngleDown);
+library.add(faAngleRight);
+library.add(faAngleUp);
+library.add(faArrowLeft);
+library.add(faArrowRight);
+library.add(faAt);
+library.add(faBook);
+library.add(faBug);
+library.add(faCalendar);
+library.add(faCheck);
+library.add(faChevronDown);
+library.add(faChevronUp);
+library.add(faCode);
+library.add(faCodeBranch);
+library.add(faCog);
+library.add(faCogs);
+library.add(faClock);
+library.add(faClone);
+library.add(faCloud);
+library.add(faCloudDownloadAlt);
+library.add(faCopy);
+library.add(faCut);
+library.add(faDotCircle);
+library.add(faEdit);
+library.add(faEnvelope);
+library.add(faEye);
+library.add(faExclamationTriangle);
+library.add(faExpand);
+library.add(faExternalLinkAlt);
+library.add(faExchangeAlt);
+library.add(faFile);
+library.add(faFileArchive);
+library.add(faFileCode);
+library.add(faFileDownload);
+library.add(faFileExport);
+library.add(faFileImport);
+library.add(faFilePdf);
+library.add(faFolderOpen);
+library.add(faGift);
+library.add(faHdd);
+library.add(faHome);
+library.add(faHourglass);
+library.add(faImage);
+library.add(faInbox);
+library.add(faInfo);
+library.add(faInfoCircle);
+library.add(faKey);
+library.add(faMapSigns);
+library.add(faNetworkWired);
+library.add(faPause);
+library.add(faPauseCircle);
+library.add(faPen);
+library.add(faPlay);
+library.add(faPlayCircle);
+library.add(faPlus);
+library.add(faPlusCircle);
+library.add(faQuestion);
+library.add(faQuestionCircle);
+library.add(faRedo);
+library.add(faRss);
+library.add(faSave);
+library.add(faSearch);
+library.add(faSearchMinus);
+library.add(faSearchPlus);
+library.add(faServer);
+library.add(faSignInAlt);
+library.add(faSlidersH);
+library.add(faSpinner);
+library.add(faStop);
+library.add(faSun);
+library.add(faSync);
+library.add(faSyncAlt);
+library.add(faTable);
+library.add(faTasks);
+library.add(faTerminal);
+library.add(faThLarge);
+library.add(faTimes);
+library.add(faTrash);
+library.add(faUndo);
+library.add(faUsers);
+
+Vue.component('font-awesome-icon', FontAwesomeIcon);
+
diff --git a/packages/editor-ui/src/plugins/index.ts b/packages/editor-ui/src/plugins/index.ts
new file mode 100644
index 0000000000..61ee9b1aab
--- /dev/null
+++ b/packages/editor-ui/src/plugins/index.ts
@@ -0,0 +1,3 @@
+import './icons';
+import './directives';
+import './compontents';
\ No newline at end of file
diff --git a/packages/editor-ui/src/views/NodeView.vue b/packages/editor-ui/src/views/NodeView.vue
index 3199ffb55c..a42177abe6 100644
--- a/packages/editor-ui/src/views/NodeView.vue
+++ b/packages/editor-ui/src/views/NodeView.vue
@@ -32,7 +32,7 @@
-
+
-
-
-
-
-
+ :type="workflowRunning ? 'light' : 'primary'"
+ />
- {{runButtonText}}
-
-
-
-
-
-
+
+
-
-
-
+
+
-
-
+ icon="trash"
+ size="large"
+ @click.stop="clearExecutionData()"
+ />
@@ -2313,13 +2305,6 @@ export default mixins(
.node-creator-button button {
position: relative;
- background: $--color-primary;
- font-size: 1.4em;
- color: #fff;
-}
-
-.node-creator-button:hover button {
- transform: scale(1.05);
}
.node-view-root {
@@ -2376,20 +2361,8 @@ export default mixins(
width: 300px;
text-align: center;
- .run-icon {
- display: inline-block;
- transform: scale(1.4);
- margin-right: 0.5em;
- }
-
- .workflow-run-button {
- padding: 12px;
- }
-
- .stop-execution,
- .workflow-run-button.running {
- color: $--color-primary;
- background-color: $--color-primary-light;
+ > * {
+ margin-inline-end: 0.625rem;
}
}