├── .cz-config.js
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── .husky
├── commit-msg
├── common.sh
├── lint-staged.config.js
└── pre-commit
├── .ls-lint.yml
├── .prettierignore
├── .stylelintignore
├── .versionrc.js
├── CHANGELOG.md
├── README.md
├── babel.config.js
├── build
├── rollup-build.js
├── rollup-creat-Config.js
└── utils.js
├── commitlint.config.js
├── compoments.json
├── components.d.ts
├── config
├── alias.js
└── rollup-config.js
├── directoryList.md
├── docs
├── .vuepress
│ ├── components
│ │ ├── card
│ │ │ ├── demo1.vue
│ │ │ ├── demo2.vue
│ │ │ ├── demo3.vue
│ │ │ └── demo4.vue
│ │ ├── press-row.vue
│ │ └── source-block.vue
│ ├── config.js
│ ├── enhanceApp.js
│ ├── public
│ │ ├── js
│ │ │ └── constant.js
│ │ ├── logo.png
│ │ └── logo.svg
│ ├── sidebarRoutes
│ │ ├── business.js
│ │ ├── developer.js
│ │ ├── element.js
│ │ └── guide.js
│ └── styles
│ │ ├── developer
│ │ └── update-theme.styl
│ │ ├── element-ui
│ │ ├── alert.styl
│ │ ├── avatar.styl
│ │ ├── badge.styl
│ │ ├── border.styl
│ │ ├── button.styl
│ │ ├── calendar.styl
│ │ ├── card.styl
│ │ ├── carousel.styl
│ │ ├── cascader.styl
│ │ ├── collapse.styl
│ │ ├── color-picker.styl
│ │ ├── color.styl
│ │ ├── container.styl
│ │ ├── date-picker.styl
│ │ ├── datetime-picker.styl
│ │ ├── descriptions.styl
│ │ ├── dialog.styl
│ │ ├── divider.styl
│ │ ├── drawer.styl
│ │ ├── dropdown.styl
│ │ ├── form.styl
│ │ ├── i18n.styl
│ │ ├── icon.styl
│ │ ├── image.styl
│ │ ├── infinite-scroll.styl
│ │ ├── input-number.styl
│ │ ├── input.styl
│ │ ├── layout.styl
│ │ ├── loading.styl
│ │ ├── menu.styl
│ │ ├── pagination.styl
│ │ ├── popover.styl
│ │ ├── progress.styl
│ │ ├── rate.styl
│ │ ├── select.styl
│ │ ├── skeleton.styl
│ │ ├── slider.styl
│ │ ├── switch.styl
│ │ ├── table.styl
│ │ ├── tag.styl
│ │ ├── time-picker.styl
│ │ ├── timeline.styl
│ │ ├── tooltip.styl
│ │ ├── transfer.styl
│ │ ├── transition.styl
│ │ ├── tree.styl
│ │ ├── typography.styl
│ │ └── upload.styl
│ │ ├── index.styl
│ │ └── theme
│ │ ├── code
│ │ ├── base.styl
│ │ ├── dark.styl
│ │ ├── helper.styl
│ │ ├── index.styl
│ │ └── light.styl
│ │ ├── fonts
│ │ └── crimson.css
│ │ ├── index.styl
│ │ ├── layout.styl
│ │ ├── normalize.styl
│ │ ├── palette.styl
│ │ ├── plugins
│ │ ├── index.styl
│ │ ├── nprogress.styl
│ │ └── search.styl
│ │ ├── theme-color.styl
│ │ ├── theme.styl
│ │ └── vars.styl
├── README.md
├── developer
│ ├── build-advance.md
│ ├── changelog.md
│ ├── contributor.md
│ ├── custom-theme.md
│ ├── development-guide.md
│ ├── installation.md
│ ├── question.md
│ ├── quickstart.md
│ ├── sass.md
│ ├── specify-build.md
│ └── update-theme.md
├── guide
│ ├── button.md
│ ├── concept.md
│ ├── datePicker.md
│ ├── instroduce.md
│ └── time-picker.md
└── packages
│ ├── business
│ ├── cropper.md
│ └── rich-text.md
│ └── element
│ ├── alert.md
│ ├── avatar.md
│ ├── backtop.md
│ ├── badge.md
│ ├── border.md
│ ├── breadcrumb.md
│ ├── button.md
│ ├── calendar.md
│ ├── card.md
│ ├── carousel.md
│ ├── cascader.md
│ ├── checkbox.md
│ ├── collapse.md
│ ├── color-picker.md
│ ├── color.md
│ ├── container.md
│ ├── custom-theme.md
│ ├── date-picker.md
│ ├── datetime-picker.md
│ ├── descriptions.md
│ ├── dialog.md
│ ├── divider.md
│ ├── drawer.md
│ ├── dropdown.md
│ ├── empty.md
│ ├── form.md
│ ├── i18n.md
│ ├── icon.md
│ ├── image.md
│ ├── infiniteScroll.md
│ ├── input-number.md
│ ├── input.md
│ ├── installation.md
│ ├── layout.md
│ ├── link.md
│ ├── loading.md
│ ├── menu.md
│ ├── message-box.md
│ ├── message.md
│ ├── notification.md
│ ├── page-header.md
│ ├── pagination.md
│ ├── popconfirm.md
│ ├── popover.md
│ ├── progress.md
│ ├── quickstart.md
│ ├── radio.md
│ ├── rate.md
│ ├── result.md
│ ├── select.md
│ ├── skeleton.md
│ ├── slider.md
│ ├── steps.md
│ ├── switch.md
│ ├── table.md
│ ├── tabs.md
│ ├── tag.md
│ ├── time-picker.md
│ ├── timeline.md
│ ├── tooltip.md
│ ├── transfer.md
│ ├── transition.md
│ ├── tree.md
│ ├── typography.md
│ └── upload.md
├── examples
├── assets
│ ├── json
│ │ ├── dl-icon.json
│ │ └── el-icon.json
│ ├── logo.png
│ └── logo.svg
├── main.js
└── src
│ ├── App.vue
│ ├── layout
│ ├── components
│ │ ├── AppMain.vue
│ │ ├── index.js
│ │ └── sidebar
│ │ │ └── index.vue
│ └── index.vue
│ ├── router
│ └── index.js
│ ├── utils
│ └── validate.js
│ └── views
│ ├── button
│ ├── demo
│ │ └── demo1.vue
│ └── index.vue
│ ├── checkbox
│ ├── demo
│ │ └── demo1.vue
│ └── index.vue
│ ├── datePicker
│ ├── components
│ │ ├── datePicker1.vue
│ │ ├── datePicker2.vue
│ │ ├── datePicker3.vue
│ │ ├── datePicker4.vue
│ │ ├── datePicker5.vue
│ │ └── datePicker6.vue
│ └── index.vue
│ ├── dialog
│ ├── demo
│ │ └── demo1.vue
│ └── index.vue
│ ├── drawer
│ ├── demo
│ │ └── demo1.vue
│ └── index.vue
│ ├── empty
│ ├── demo
│ │ └── demo1.vue
│ └── index.vue
│ ├── form
│ ├── demo
│ │ ├── demo1.vue
│ │ ├── demo2.vue
│ │ ├── demo3.vue
│ │ ├── demo4.vue
│ │ ├── demo5.vue
│ │ ├── demo6.vue
│ │ ├── demo7.vue
│ │ └── demo8.vue
│ └── index.vue
│ ├── icon
│ ├── demo
│ │ └── demo1.vue
│ └── index.vue
│ ├── input
│ ├── demo
│ │ └── demo1.vue
│ └── index.vue
│ ├── pagination
│ ├── demo
│ │ └── demo1.vue
│ └── index.vue
│ ├── popconfirm
│ ├── demo
│ │ └── demo1.vue
│ └── index.vue
│ ├── popover
│ ├── demo
│ │ └── demo1.vue
│ └── index.vue
│ ├── radio
│ ├── demo
│ │ └── demo1.vue
│ └── index.vue
│ ├── select
│ ├── demo
│ │ └── demo1.vue
│ └── index.vue
│ ├── table
│ ├── demo
│ │ ├── align-table.vue
│ │ ├── basis-table.vue
│ │ ├── border-table.vue
│ │ ├── custom-index-table.vue
│ │ ├── edit-dialog-table.vue
│ │ ├── edit-table.vue
│ │ ├── empty-table.vue
│ │ ├── expand-row-table.vue
│ │ ├── filter-table.vue
│ │ ├── fixed-column-table.vue
│ │ ├── fixed-header-table.vue
│ │ ├── fluid-height-table.vue
│ │ ├── footer-total-table.vue
│ │ ├── merge-row-column-table.vue
│ │ ├── merge-table.vue
│ │ ├── multi-header-table.vue
│ │ ├── multiple-table.vue
│ │ ├── pagination-table.vue
│ │ ├── radio-table.vue
│ │ ├── render-header-table.vue
│ │ ├── render-table.vue
│ │ ├── sort-table.vue
│ │ ├── status-table.vue
│ │ ├── stripe-table.vue
│ │ └── tree-table.vue
│ └── index.vue
│ ├── tag
│ ├── demo
│ │ └── demo1.vue
│ └── index.vue
│ ├── timePicker
│ ├── components
│ │ ├── timePicker1.vue
│ │ ├── timePicker2.vue
│ │ ├── timePicker3.vue
│ │ └── timePicker4.vue
│ └── index.vue
│ └── tooltip
│ ├── demo
│ └── demo1.vue
│ └── index.vue
├── gulpfile.js
├── index.html
├── jsconfig.json
├── package-lock.json
├── package.json
├── packages
└── element-ui
│ ├── button
│ ├── index.js
│ └── src
│ │ └── button.vue
│ ├── checkbox-button
│ └── index.js
│ ├── checkbox-group
│ └── index.js
│ ├── checkbox
│ ├── index.js
│ └── src
│ │ ├── checkbox-button.vue
│ │ ├── checkbox-group.vue
│ │ └── checkbox.vue
│ ├── date-picker
│ ├── index.js
│ └── src
│ │ └── date-picker.vue
│ ├── dialog
│ ├── index.js
│ └── src
│ │ └── dialog.vue
│ ├── drawer
│ ├── index.js
│ └── src
│ │ └── drawer.vue
│ ├── empty
│ ├── index.js
│ └── src
│ │ └── empty.vue
│ ├── form-item
│ └── index.js
│ ├── form
│ ├── index.js
│ └── src
│ │ ├── form-item.vue
│ │ └── form.vue
│ ├── icon
│ ├── index.js
│ └── src
│ │ └── icon.vue
│ ├── input
│ ├── index.js
│ └── src
│ │ └── input.vue
│ ├── pagination
│ ├── index.js
│ └── src
│ │ └── pagination.vue
│ ├── popconfirm
│ ├── index.js
│ └── src
│ │ └── popconfirm.vue
│ ├── popover
│ ├── index.js
│ └── src
│ │ └── popover.vue
│ ├── radio-button
│ └── index.js
│ ├── radio-group
│ └── index.js
│ ├── radio
│ ├── index.js
│ └── src
│ │ ├── radio-button.vue
│ │ ├── radio-group.vue
│ │ └── radio.vue
│ ├── select
│ ├── index.js
│ └── src
│ │ └── select.vue
│ ├── table-column
│ └── index.js
│ ├── table
│ ├── index.js
│ └── src
│ │ ├── column.vue
│ │ ├── forced.jsx
│ │ ├── render.vue
│ │ └── table.vue
│ ├── tag-group
│ └── index.js
│ ├── tag
│ ├── index.js
│ └── src
│ │ ├── tag-group.vue
│ │ └── tag.vue
│ ├── time-picker
│ ├── index.js
│ └── src
│ │ └── time-picker.vue
│ └── tooltip
│ ├── index.js
│ └── src
│ └── tooltip.vue
├── play
├── .gitignore
├── components.d.ts
├── index.html
├── package-lock.json
├── package.json
├── public
│ └── vite.svg
├── src
│ ├── App.vue
│ └── main.js
├── vite.config.js
└── yarn.lock
├── prettier.config.js
├── scripts
└── docs.sh
├── src
├── images
│ ├── default-hospital.png
│ ├── default_dep.png
│ ├── default_doctor.png
│ ├── default_user.png
│ └── empty.png
├── index.js
└── utils
│ ├── update-element-theme.js
│ ├── update-ui-theme.js
│ └── use-namespace.js
├── stylelint.config.js
├── styles
└── src
│ ├── common
│ └── var.scss
│ ├── element-ui
│ ├── button.scss
│ ├── checkbox-button.scss
│ ├── checkbox.scss
│ ├── datePicker.scss
│ ├── dialog.scss
│ ├── drawer.scss
│ ├── empty.scss
│ ├── icon.scss
│ ├── input.scss
│ ├── pagination.scss
│ ├── popover.scss
│ ├── radio-button.scss
│ ├── radio-group.scss
│ ├── radio.scss
│ ├── select.scss
│ ├── table.scss
│ ├── tag-group.scss
│ ├── tag.scss
│ ├── time-picker.scss
│ └── tooltip.scss
│ ├── fonts
│ ├── iconfont.ttf
│ └── iconfont.woff
│ ├── iconfont.scss
│ ├── index.scss
│ ├── mixins
│ ├── _button.scss
│ ├── _var.scss
│ ├── config.scss
│ ├── function.scss
│ ├── mixins.scss
│ └── utils.scss
│ └── var.scss
└── vite.config.js
/.editorconfig:
--------------------------------------------------------------------------------
1 | # 表示是最顶层的 EditorConfig 配置文件
2 | root = true
3 |
4 | [*] # 表示所有文件适用
5 | charset = utf-8 # 设置文件字符集为 utf-8
6 | indent_style = space # 缩进风格(tab | space)
7 | indent_size = 2 # 缩进大小
8 | end_of_line = lf # 控制换行类型(lf | cr | crlf)
9 | trim_trailing_whitespace = true # 去除行首的任意空白字符
10 | insert_final_newline = true # 始终在文件末尾插入一个新行
11 |
12 | [*.md] # 表示仅 md 文件适用以下规则
13 | max_line_length = off
14 | trim_trailing_whitespace = false
15 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | *.sh
2 | node_modules
3 | *.md
4 | *.woff
5 | *.ttf
6 | .vscode
7 | .idea
8 | dist
9 | /public
10 | /docs
11 | .husky
12 | .local
13 | /bin
14 | /lib
15 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | .temp
4 | .cache
5 | /lib
6 | /dist
7 | /styles/theme/**
8 |
9 | # local env files
10 | .env.local
11 | .env.*.local
12 |
13 | # Log files
14 | npm-debug.log*
15 | yarn-debug.log*
16 | yarn-error.log*
17 | pnpm-debug.log*
18 |
19 | # Editor directories and files
20 | .idea
21 | .vscode
22 | *.suo
23 | *.ntvs*
24 | *.njsproj
25 | *.sln
26 | *.sw?
27 | *.tgz
28 |
--------------------------------------------------------------------------------
/.husky/commit-msg:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | # shellcheck source=./_/husky.sh
4 | . "$(dirname "$0")/_/husky.sh"
5 |
6 | npx --no-install commitlint --edit "$1"
7 |
--------------------------------------------------------------------------------
/.husky/common.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | # 解决Windows 上通过 Git Bash ( stdin is not a tty)使用 Yarn 时,Git 钩子可能会失败
3 | command_exists () {
4 | command -v "$1" >/dev/null 2>&1
5 | }
6 |
7 | # Workaround for Windows 10, Git Bash and Yarn
8 | if command_exists winpty && test -t 1; then
9 | exec < /dev/tty
10 | fi
11 |
--------------------------------------------------------------------------------
/.husky/lint-staged.config.js:
--------------------------------------------------------------------------------
1 | // .husky/lint-staged.config.js
2 | module.exports = {
3 | 'packages/**.{js,jsx,ts,tsx}': ['eslint --fix', 'prettier --write'],
4 | '{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': ['prettier --write--parser json'],
5 | 'package.json': ['prettier --write'],
6 | 'packages/***.vue': ['eslint --fix', 'prettier --write', 'stylelint --fix'],
7 | 'packages/***.{scss,less,styl,html}': ['stylelint --fix', 'prettier --write'],
8 | };
9 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | . "$(dirname "$0")/_/husky.sh"
3 | . "$(dirname "$0")/common.sh"
4 |
5 | [ -n "$CI" ] && exit 0
6 |
7 | npm run lint:ls-lint
8 |
9 | # Format and submit code according to lintstagedrc.js configuration
10 | npm run lint:lint-staged
11 |
--------------------------------------------------------------------------------
/.ls-lint.yml:
--------------------------------------------------------------------------------
1 | ls:
2 | packages/**:
3 | .js: kebab-case
4 | .ts: kebab-case
5 | .d.ts: kebab-case
6 |
7 | ignore:
8 | - .git
9 | - node_modules
10 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | **/*.svg
2 | **/*.ejs
3 | **/*.html
4 | package.json
5 |
--------------------------------------------------------------------------------
/.stylelintignore:
--------------------------------------------------------------------------------
1 | /dist/*
2 | /public/*
3 | /docs/*
4 | /lib/*
5 | /styles/**
6 |
--------------------------------------------------------------------------------
/.versionrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | skip: {
3 | tag: true
4 | },
5 | types: [
6 | { type: 'feat', section: '✨ Features | 新功能' },
7 | { type: 'fix', section: '🐛 Bug Fixes | Bug 修复' },
8 | { type: 'init', section: '🎉 Init | 初始化' },
9 | { type: 'docs', section: '✏️ Documentation | 文档' },
10 | { type: 'style', section: '💄 Styles | 风格' },
11 | { type: 'refactor', section: '♻️ Code Refactoring | 代码重构' },
12 | { type: 'perf', section: '⚡ Performance Improvements | 性能优化' },
13 | { type: 'test', section: '✅ Tests | 测试' },
14 | { type: 'revert', section: '⏪ Revert | 回退', hidden: true },
15 | { type: 'build', section: '📦 Build System | 打包构建' },
16 | { type: 'chore', section: '🚀 Chore | 构建/工程依赖/工具' },
17 | { type: 'ci', section: '👷 Continuous Integration | CI 配置' }
18 | ]
19 | }
20 |
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 |
4 | ],
5 | };
6 |
--------------------------------------------------------------------------------
/build/rollup-build.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs')
2 | const components = require('../compoments.json')
3 | const { styleOutputPath } = require('../config/rollup-config.js')
4 | const { build } = require('./rollup-creat-Config.js')
5 | const { resolve, getAssetsPath } = require('./utils.js')
6 | // 创建 lib 目录
7 | fs.mkdirSync(resolve())
8 | // 创建 lib/theme 目录
9 | fs.mkdirSync(getAssetsPath(styleOutputPath))
10 | // 输出文件格式
11 | const formatTypeList = [
12 | // { format: 'umd', min: false, suffix: '.umd.js' },
13 | // { format: 'umd', min: true, suffix: '.umd.min.js' },
14 | // { format: 'cjs', min: false, suffix: '.common.js' },
15 | // { format: 'cjs', min: true, suffix: '.common.min.js' },
16 | // { format: 'es', min: false, suffix: '.es.js' },
17 | { format: 'es', min: false, suffix: '.js' }
18 | ]
19 |
20 | let pkg = []
21 | formatTypeList.forEach(({ format, min, suffix } = {}) => {
22 | Object.keys(components).forEach((moduleName) => {
23 | const input = components[moduleName]
24 | pkg.push({ min, format, suffix, moduleName, input, output: moduleName })
25 | })
26 | })
27 |
28 | build(pkg)
29 |
--------------------------------------------------------------------------------
/build/utils.js:
--------------------------------------------------------------------------------
1 | const path = require('path')
2 | const fs = require('fs')
3 | var { outputPath } = require('../config/rollup-config.js')
4 | const chalk = require('chalk')
5 |
6 | module.exports = {
7 | getAssetsPath(_path = '.') {
8 | return path.posix.join(outputPath, _path)
9 | },
10 | resolve(_path) {
11 | return _path ? path.resolve(__dirname, _path) : path.resolve(__dirname, '..', outputPath)
12 | },
13 | isProduct: ['production', 'prod'].includes(process.env.NODE_ENV),
14 | env: process.env.NODE_ENV,
15 | chalkConsole: {
16 | success: () => {
17 | console.log(chalk.green(`=========================================`))
18 | console.log(chalk.green(`========打包成功(build success)!=========`))
19 | console.log(chalk.green(`=========================================`))
20 | },
21 | building: (index, total) => {
22 | console.log(chalk.blue(`正在打包第${index}/${total}个文件...`))
23 | }
24 | },
25 | fsExistsSync: (_path) => {
26 | try {
27 | fs.accessSync(_path, fs.F_OK)
28 | } catch (e) {
29 | return false
30 | }
31 | return true
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/commitlint.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | ignores: [(commit) => commit.includes('init')],
3 | // extends: ['@commitlint/config-conventional', 'cz'],
4 | extends: ['gitmoji'],
5 | rules: {
6 | 'body-leading-blank': [2, 'always'],
7 | 'footer-leading-blank': [1, 'always'],
8 | 'header-max-length': [2, 'always', 108],
9 | 'subject-empty': [2, 'never'],
10 | 'type-empty': [2, 'never'],
11 | 'subject-case': [0],
12 | 'type-enum': [
13 | 2,
14 | 'always',
15 | [
16 | 'feat',
17 | ':sparkles: feat',
18 | 'fix',
19 | 'perf',
20 | 'style',
21 | 'docs',
22 | 'test',
23 | 'refactor',
24 | 'build',
25 | 'ci',
26 | ':construction_worker: ci',
27 | 'chore',
28 | 'revert',
29 | 'wip',
30 | 'workflow',
31 | 'types',
32 | 'release'
33 | ]
34 | // [
35 | // 'feat',
36 | // 'fix',nvm
37 | // 'perf',
38 | // 'style',
39 | // 'docs',
40 | // 'test',
41 | // 'refactor',
42 | // 'build',
43 | // 'ci',
44 | // 'chore',
45 | // 'revert',
46 | // 'wip',
47 | // 'workflow',
48 | // 'types',
49 | // 'release'
50 | // ]
51 | ]
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/compoments.json:
--------------------------------------------------------------------------------
1 | {
2 | "index": "./src/index.js",
3 | "button": "./packages/element-ui/button/index.js",
4 | "icon": "./packages/element-ui/icon/index.js",
5 | "date-picker": "./packages/element-ui/date-picker/index.js",
6 | "time-picker": "./packages/element-ui/time-picker/index.js",
7 | "radio": "./packages/element-ui/radio/index.js",
8 | "radio-button": "./packages/element-ui/radio-button/index.js",
9 | "radio-group": "./packages/element-ui/radio-group/index.js",
10 | "checkbox": "./packages/element-ui/checkbox/index.js",
11 | "checkbox-button": "./packages/element-ui/checkbox-button/index.js",
12 | "checkbox-group": "./packages/element-ui/checkbox-group/index.js",
13 | "form": "./packages/element-ui/form/index.js",
14 | "form-item": "./packages/element-ui/form-item/index.js",
15 | "input": "./packages/element-ui/input/index.js",
16 | "table": "./packages/element-ui/table/index.js",
17 | "table-column": "./packages/element-ui/table-column/index.js",
18 | "empty": "./packages/element-ui/empty/index.js",
19 | "pagination": "./packages/element-ui/pagination/index.js",
20 | "dialog": "./packages/element-ui/dialog/index.js",
21 | "drawer": "./packages/element-ui/drawer/index.js",
22 | "popconfirm": "./packages/element-ui/popconfirm/index.js",
23 | "tooltip": "./packages/element-ui/tooltip/index.js",
24 | "select": "./packages/element-ui/select/index.js",
25 | "tag": "./packages/element-ui/tag/index.js"
26 | }
27 |
--------------------------------------------------------------------------------
/config/alias.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const resolve = p => path.resolve(__dirname, '../', p);
4 |
5 | module.exports = {
6 | src: resolve('src'),
7 | packages: resolve('packages')
8 | };
9 |
--------------------------------------------------------------------------------
/config/rollup-config.js:
--------------------------------------------------------------------------------
1 | const { version, author } = require('../package.json')
2 |
3 | module.exports = {
4 | banner:`/*
5 | * douluo-ui v${version}
6 | * Copyright ©2022-${new Date().getFullYear()} ${author.name}
7 | * Released under the MIT License.
8 | */\n`,
9 | // 打包样式目录
10 | styleOutputPath: 'theme',
11 | // 打包脚步目录
12 | outputPath: 'lib',
13 | // 清空console
14 | clearConsole: true,
15 | rollupResolve: {
16 | extensions: ['.js', '.vue', '.json', '.jsx']
17 | },
18 | // 打包忽略
19 | externalMap: {
20 | vue: 'Vue',
21 | lodash: 'lodash'
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/docs/.vuepress/components/card/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 卡片名称
5 | 操作按钮
6 |
7 |
8 | {{ '列表内容 ' + o }}
9 |
10 |
11 |
12 |
13 |
35 |
--------------------------------------------------------------------------------
/docs/.vuepress/components/card/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{ '列表内容 ' + o }}
4 |
5 |
6 |
19 |
--------------------------------------------------------------------------------
/docs/.vuepress/components/card/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 |
好吃的汉堡
10 |
11 |
12 | 操作按钮
13 |
14 |
15 |
16 |
17 |
18 |
19 |
54 |
55 |
64 |
--------------------------------------------------------------------------------
/docs/.vuepress/components/card/demo4.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 总是显示
5 | 鼠标悬浮时显示
6 | 从不显示
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/docs/.vuepress/components/press-row.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
19 |
--------------------------------------------------------------------------------
/docs/.vuepress/components/source-block.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
14 | {{ toggleText }}
15 |
16 |
17 |
18 |
19 |
39 |
40 |
62 |
--------------------------------------------------------------------------------
/docs/.vuepress/enhanceApp.js:
--------------------------------------------------------------------------------
1 | // 引入 @internal/page-components 解决组件内部注册报错
2 | import pageComponents from '@internal/page-components'
3 | import ElementUI from 'element-ui';
4 | import 'element-ui/lib/theme-chalk/index.css';
5 | import DouluoUI from '../../src/index'
6 | import '../../styles/src/index.scss'
7 | import elIcons from '../../examples/assets/json/el-icon.json'
8 | import dlIcons from '../../examples/assets/json/dl-icon.json'
9 |
10 |
11 | export default async ({ Vue, options, router, siteData, isServer }) => {
12 | if (!isServer) {
13 | for (const [name, component] of Object.entries(pageComponents)) {
14 | Vue.component(name, component)
15 | }
16 | await DouluoUI.updateUITheme({
17 | primaryColor: '#FFAA00',
18 | primarySecondColor: '#231909',
19 | oldTheme: window.oldTheme || '#409EFF'
20 | })
21 | Vue.use(DouluoUI);
22 | Vue.use(ElementUI);
23 | Vue.prototype.$elIcons = elIcons
24 | Vue.prototype.$dlIcons = dlIcons
25 | window.oldTheme = '#FFAA00'
26 | window.primarySecond = '#231909'
27 | window.$updateTheme = DouluoUI.updateUITheme
28 | // Vue.prototype.$updateTheme = DouluoUI.updateTheme
29 | }
30 | };
31 |
--------------------------------------------------------------------------------
/docs/.vuepress/public/js/constant.js:
--------------------------------------------------------------------------------
1 | export const DEFAULT_THEME_CONFIG = {
2 | global: {},
3 | local: {}
4 | };
5 |
6 | export const ELEMENT_THEME_USER_CONFIG = 'ELEMENT_THEME_USER_CONFIG';
7 |
8 | export const ELEMENT_THEME_PREVIEW_CONFIG = 'ELEMENT_THEME_PREVIEW_CONFIG';
9 |
10 | export const ACTION_DOWNLOAD_THEME = 'ELEMENT_THEME_ACTION_DOWNLOAD';
11 |
12 | export const ACTION_APPLY_THEME = 'ELEMENT_THEME_ACTION_ALLPY_CSS';
13 |
14 | export const ACTION_COMPONECT_SELECT = 'ELEMENT_THEME_ACTION_COMPONECT_SELECT';
15 |
16 | export const ACTION_USER_CONFIG_UPDATE = 'ELEMENT_THEME_USER_CONFIG_UPDATE';
17 |
--------------------------------------------------------------------------------
/docs/.vuepress/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebJeffery/douluo-ui/6c83bdeb013e15083b6474dfcece7a0417dc9904/docs/.vuepress/public/logo.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/docs/.vuepress/sidebarRoutes/business.js:
--------------------------------------------------------------------------------
1 | module.exports = [
2 | {
3 | title: '业务组件',
4 | collapsable: false,
5 | children: [
6 | ['/packages/business/rich-text', 'RichText 富文本编辑器'],
7 | ['/packages/business/cropper', 'Cropper 图片裁切'],
8 | ]
9 | }
10 | ]
11 |
--------------------------------------------------------------------------------
/docs/.vuepress/sidebarRoutes/developer.js:
--------------------------------------------------------------------------------
1 | module.exports = [
2 | {
3 | title: '开发指南',
4 | collapsable: false,
5 | children: [
6 | ['/developer/changelog', '更新日志'],
7 | ['/developer/installation', '安装'],
8 | ['/developer/quickstart', '快速开始'],
9 | ['/developer/contributor', '代码贡献'],
10 | ['/developer/update-theme', '更改主题'],
11 | ]
12 | },
13 | {
14 | title: '开发须知',
15 | collapsable: false,
16 | children: [
17 | ['/developer/specify-build', '开发规范搭建'],
18 | ['/developer/custom-theme', '自定义主题'],
19 | ['/developer/sass', 'SCSS 开发指南'],
20 | ]
21 | }
22 | ]
23 |
--------------------------------------------------------------------------------
/docs/.vuepress/sidebarRoutes/guide.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | module.exports = [
4 | {
5 | title: '介绍说明',
6 | collapsable: false,
7 | children: [
8 | {
9 | title: '背景',
10 | collapsable: false,
11 | path: '/guide/instroduce',
12 | },
13 | {
14 | title: '概念',
15 | collapsable: false,
16 | path: '/guide/concept',
17 | }
18 | ]
19 | },
20 | {
21 | title: 'Basic 基础',
22 | collapsable: false,
23 | children: [
24 | {
25 | title: 'Button 按钮',
26 | collapsable: false,
27 | path: '/guide/button',
28 | },
29 | {
30 | title: 'DatePicker 日期选择器',
31 | collapsable: false,
32 | path: '/guide/datePicker',
33 | },
34 | {
35 | title: 'TimePicker 时间选择器',
36 | collapsable: false,
37 | path: '/guide/time-picker',
38 | }
39 | ]
40 | }
41 | ]
42 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/developer/update-theme.styl:
--------------------------------------------------------------------------------
1 | .demo-theme {
2 | .el-row {
3 | margin-bottom: 20px;
4 |
5 | &:last-child {
6 | margin-bottom: 0;
7 | }
8 | }
9 | .el-button + .el-button {
10 | margin-left: 10px;
11 | }
12 | .el-button-group {
13 | .el-button + .el-button {
14 | margin-left: 0;
15 | }
16 |
17 | & + .el-button-group {
18 | margin-left: 10px;
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/alert.styl:
--------------------------------------------------------------------------------
1 | .demo-alert .el-alert {
2 | margin: 20px 0 0;
3 | }
4 |
5 | .demo-alert .el-alert:first-child {
6 | margin: 0;
7 | }
8 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/avatar.styl:
--------------------------------------------------------------------------------
1 | .demo-avatar {
2 |
3 | &.demo-basic {
4 | text-align: center;
5 |
6 | .demo-basic--circle, .demo-basic--square {
7 | display: flex;
8 | justify-content: space-between;
9 | align-items: center;
10 | .block {
11 | flex: 1;
12 | }
13 |
14 | .block:not(:last-child) {
15 | border-right: 1px solid rgba(224, 230, 237, 0.5);
16 | }
17 | }
18 |
19 | }
20 |
21 | .sub-title {
22 | margin-bottom: 10px;
23 | font-size: 14px;
24 | color: #8492a6;
25 | }
26 |
27 | .el-col:not(:last-child) {
28 | border-right: 1px solid rgba(224,230,237,.5);
29 | }
30 |
31 | .demo-type {
32 | display: flex;
33 |
34 | >div {
35 | flex: 1;
36 | text-align: center;
37 | }
38 |
39 | >div:not(:last-child) {
40 | border-right: 1px solid rgba(224,230,237,.5);
41 | }
42 | }
43 |
44 | .demo-fit {
45 | display: flex;
46 | text-align: center;
47 | justify-content: space-between;
48 |
49 | .block {
50 | flex: 1;
51 | display: flex;
52 | flex-direction: column;
53 | flex-grow: 0;
54 | }
55 |
56 | .title {
57 | margin-bottom: 10px;
58 | font-size: 14px;
59 | color: #8492a6;
60 | }
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/badge.styl:
--------------------------------------------------------------------------------
1 | .demo-badge .el-dropdown {
2 | vertical-align: middle;
3 | }
4 | .demo-badge {
5 | .share-button {
6 | width: 36px;
7 | padding: 10px;
8 | }
9 |
10 | .mark {
11 | margin-top: 8px;
12 | line-height: 1;
13 | float: right;
14 | }
15 |
16 | .item {
17 | margin-right: 40px;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/border.styl:
--------------------------------------------------------------------------------
1 | .demo-border .text {
2 | width: 15%;
3 | }
4 | .demo-border .line {
5 | width: 70%;
6 | }
7 | .demo-border .line div {
8 | width: 100%;
9 | height: 0;
10 | border-top: 1px solid #eee;
11 | }
12 | .demo-border .line .dashed {
13 | border-top: 2px dashed #eee;
14 | }
15 | .demo-shadow {
16 | height: 100px;
17 | width: 50%;
18 | border: 1px solid #eee;
19 | }
20 | .demo-shadow-text {
21 | line-height: 50px;
22 | color: #666;
23 | font-size: 14px;
24 | }
25 | .demo-radius .title {
26 | color: #666;
27 | font-size: 18px;
28 | margin: 10px 0;
29 | }
30 | .demo-radius .value {
31 | color: #333;
32 | font-size: 16px;
33 | margin: 10px 0;
34 | }
35 | .demo-radius .radius {
36 | height: 60px;
37 | width: 70%;
38 | border: 1px solid #d7dae2;
39 | border-radius: 0;
40 | margin-top: 20px;
41 | }
42 | .demo-radius .radius-30 {
43 | border-radius: 30px;
44 | }
45 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/button.styl:
--------------------------------------------------------------------------------
1 | .demo-button {
2 | .el-row {
3 | margin-bottom: 20px;
4 |
5 | &:last-child {
6 | margin-bottom: 0;
7 | }
8 | }
9 | .el-button + .el-button {
10 | margin-left: 10px;
11 | }
12 | .el-button-group {
13 | .el-button + .el-button {
14 | margin-left: 0;
15 | }
16 |
17 | & + .el-button-group {
18 | margin-left: 10px;
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/calendar.styl:
--------------------------------------------------------------------------------
1 | .demo-calendar {
2 | .is-selected {
3 | color: #1989FA;
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/card.styl:
--------------------------------------------------------------------------------
1 | .demo-card {
2 | .text {
3 | font-size: 14px;
4 | }
5 |
6 | .time {
7 | font-size: 13px;
8 | color: #999;
9 | }
10 |
11 | .bottom {
12 | margin-top: 13px;
13 | line-height: 12px;
14 | }
15 |
16 | .item {
17 | margin-bottom: 18px;
18 | }
19 |
20 | .button {
21 | padding: 0;
22 | float: right;
23 | }
24 |
25 | .image {
26 | width: 100%;
27 | display: block;
28 | }
29 |
30 | .box-card {
31 | width: 480px;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/carousel.styl:
--------------------------------------------------------------------------------
1 | .demo-carousel .block {
2 | padding: 30px;
3 | text-align: center;
4 | border-right: solid 1px #eff2f6;
5 | display: inline-block;
6 | width: 49%;
7 | box-sizing: border-box;
8 | &:last-child {
9 | border-right: none;
10 | }
11 | }
12 |
13 | .demo-carousel .demonstration {
14 | display: block;
15 | color: #8492a6;
16 | font-size: 14px;
17 | margin-bottom: 20px;
18 | }
19 |
20 | .demo-carousel .el-carousel__container {
21 | text-align: center;
22 | }
23 |
24 | .demo-carousel .el-carousel__item {
25 | h3 {
26 | color: #fff;
27 | font-size: 18px;
28 | line-height: 300px;
29 | margin: 0;
30 | &.small {
31 | font-size: 14px;
32 | line-height: 150px;
33 | }
34 | &.medium {
35 | font-size: 14px;
36 | line-height: 200px;
37 | }
38 | }
39 | &:nth-child(2n) {
40 | background-color: #99a9bf;
41 | }
42 | &:nth-child(2n + 1) {
43 | background-color: #d3dce6;
44 | }
45 | }
46 |
47 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/cascader.styl:
--------------------------------------------------------------------------------
1 | .demo-cascader {
2 | .el-cascader {
3 | width: 222px;
4 | }
5 | }
6 | .demo-cascader-size {
7 | .el-cascader {
8 | vertical-align: top;
9 | margin-right: 15px;
10 | }
11 | }
12 | .demo-cascader .source > div {
13 | display: flex;
14 | }
15 | .demo-cascader .block {
16 | padding: 30px 0;
17 | text-align: center;
18 | border-right: solid 1px #eff2f6;
19 | width: 50%;
20 | box-sizing: border-box;
21 | &:last-child {
22 | border-right: none;
23 | }
24 | }
25 | .demo-cascader .demonstration {
26 | display: block;
27 | color: #8492a6;
28 | font-size: 14px;
29 | margin-bottom: 20px;
30 | }
31 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/collapse.styl:
--------------------------------------------------------------------------------
1 | .demo-collapse {
2 | .el-collapse-item__header {
3 | .header-icon {
4 | margin-left: 5px;
5 | }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/color-picker.styl:
--------------------------------------------------------------------------------
1 | .demo-color-picker .block {
2 | padding: 30px 0;
3 | text-align: center;
4 | border-right: solid 1px #eff2f6;
5 | display: inline-block;
6 | width: 50%;
7 | box-sizing: border-box;
8 | &:last-child {
9 | border-right: none;
10 | }
11 | }
12 | .demo-color-picker .demonstration {
13 | display: block;
14 | color: #8492a6;
15 | font-size: 14px;
16 | margin-bottom: 20px;
17 | }
18 | .demo-color-picker .el-color-picker + .el-color-picker {
19 | margin-left: 20px;
20 | }
21 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/color.styl:
--------------------------------------------------------------------------------
1 | .demo-color-box {
2 | position: relative;
3 | border-radius: 4px;
4 | padding: 20px;
5 | margin: 5px 0;
6 | height: 114px;
7 | box-sizing: border-box;
8 | color: #fff;
9 | font-size: 14px;
10 |
11 | & .value {
12 | font-size: 12px;
13 | opacity: 0.69;
14 | line-height: 24px;
15 | }
16 | }
17 | .demo-color-box-other {
18 | height: 74px;
19 | margin: 10px 0 !important;
20 | border-radius: 4px 4px 4px 4px !important;
21 | padding: 15px 20px;
22 | }
23 | .demo-color-box-group {
24 | .demo-color-box {
25 | border-radius: 0;
26 | margin: 0;
27 | }
28 | .demo-color-box:first-child {
29 | border-radius: 4px 4px 0 0;
30 | }
31 | .demo-color-box:last-child {
32 | border-radius: 0 0 4px 4px;
33 | }
34 | }
35 | .bg-color-sub {
36 | width: 100%;
37 | height: 40px;
38 | left: 0;
39 | bottom: 0;
40 | position: absolute;
41 | border-radius: 0 0 4px 4px;
42 | }
43 | .bg-blue-sub-item {
44 | width: 11.1111111%;
45 | height: 100%;
46 | display: inline-block;
47 | }
48 | .bg-blue-sub-item:first-child {
49 | border-radius: 0 0 0 4px;
50 | }
51 | .bg-success-sub-item {
52 | width: 50%;
53 | height: 100%;
54 | display: inline-block;
55 | }
56 | .bg-success-sub-item:first-child {
57 | border-radius: 0 0 0 4px;
58 | }
59 | .bg-success-sub-item:last-child {
60 | border-radius: 0 0 4px 0;
61 | }
62 | .bg-transparent {
63 | border: 1px solid #fcc3c3;
64 | color: #303133;
65 | background: url("data:image/svg+xml;utf8,");
66 | background-repeat: no-repeat;
67 | background-position: center center;
68 | background-size: 100% 100%, auto;
69 | }
70 | .demo-color-box-lite {
71 | color: #303133;
72 | }
73 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/container.styl:
--------------------------------------------------------------------------------
1 | .el-header,
2 | .el-footer {
3 | background-color: #b3c0d1;
4 | color: #333;
5 | line-height: 60px;
6 | }
7 |
8 | .el-aside {
9 | color: #333;
10 | }
11 |
12 | #chang-jian-ye-mian-bu-ju + .demo-container {
13 | .el-header,
14 | .el-footer {
15 | text-align: center;
16 | }
17 |
18 | .el-aside {
19 | background-color: #d3dce6;
20 | text-align: center;
21 | line-height: 200px;
22 | }
23 |
24 | .el-main {
25 | background-color: #e9eef3;
26 | color: #333;
27 | text-align: center;
28 | line-height: 160px;
29 | }
30 |
31 | & > .source > .el-container {
32 | margin-bottom: 40px;
33 |
34 | &:nth-child(5) .el-aside,
35 | &:nth-child(6) .el-aside {
36 | line-height: 260px;
37 | }
38 |
39 | &:nth-child(7) .el-aside {
40 | line-height: 320px;
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/date-picker.styl:
--------------------------------------------------------------------------------
1 | .demo-date-picker .source > div {
2 | padding: 0;
3 | display: flex;
4 | flex-wrap: wrap;
5 | }
6 |
7 | .demo-date-picker .block {
8 | padding: 30px 0;
9 | text-align: center;
10 | border-right: solid 1px #eff2f6;
11 | flex: 1;
12 | &:last-child {
13 | border-right: none;
14 | }
15 | }
16 |
17 | .demo-date-picker .container {
18 | flex: 1;
19 | border-right: solid 1px #eff2f6;
20 | .block {
21 | border-right: none;
22 | &:last-child {
23 | border-top: solid 1px #eff2f6;
24 | }
25 | }
26 | &:last-child {
27 | border-right: none;
28 | }
29 | }
30 |
31 | .demo-date-picker .demonstration {
32 | display: block;
33 | color: #8492a6;
34 | font-size: 14px;
35 | margin-bottom: 20px;
36 | }
37 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/datetime-picker.styl:
--------------------------------------------------------------------------------
1 | .demo-datetime-picker .source > div {
2 | padding: 0;
3 | display: flex;
4 | }
5 |
6 | .demo-datetime-picker .block {
7 | padding: 30px 0;
8 | text-align: center;
9 | border-right: solid 1px #eff2f6;
10 | flex: 1;
11 | &:last-child {
12 | border-right: none;
13 | }
14 | }
15 |
16 | .demo-datetime-picker .demonstration {
17 | display: block;
18 | color: #8492a6;
19 | font-size: 14px;
20 | margin-bottom: 20px;
21 | }
22 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/descriptions.styl:
--------------------------------------------------------------------------------
1 | .demo-descriptions {
2 | .margin-top {
3 | margin-top: 20px;
4 | }
5 |
6 | .my-label {
7 | background: #E1F3D8;
8 | }
9 |
10 | .my-content {
11 | background: #FDE2E2;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/dialog.styl:
--------------------------------------------------------------------------------
1 | .demo-dialog,
2 | .el-dialog {
3 | .dialog-footer button:first-child {
4 | margin-right: 10px;
5 | }
6 | .full-image {
7 | width: 100%;
8 | }
9 | .el-dialog__wrapper {
10 | margin: 0;
11 | }
12 | .el-select {
13 | width: 300px;
14 | }
15 | .el-input {
16 | width: 300px;
17 | }
18 | .el-button--text {
19 | margin-right: 15px;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/divider.styl:
--------------------------------------------------------------------------------
1 | .demo-divider-container-1 {
2 | display: inline-block;
3 | width: 33%;
4 | }
5 |
6 | .demo-divider-container-2 {
7 | display: inline-block;
8 | width: 50%;
9 | }
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/drawer.styl:
--------------------------------------------------------------------------------
1 | .demo-drawer,
2 | .el-drawer__wrapper {
3 | &__content {
4 | display: flex;
5 | flex-direction: column;
6 | height: 100%;
7 | form {
8 | flex: 1;
9 | }
10 | }
11 |
12 | &__footer {
13 | display: flex;
14 | button {
15 | flex: 1;
16 | }
17 | }
18 | }
19 |
20 | .el-drawer__body {
21 | padding: 20px;
22 | }
23 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/dropdown.styl:
--------------------------------------------------------------------------------
1 | .demo-dropdown {
2 | .el-dropdown {
3 | vertical-align: top;
4 |
5 | & + .el-dropdown {
6 | margin-left: 15px;
7 | }
8 | }
9 | .el-dropdown-link {
10 | cursor: pointer;
11 | color: #409eff;
12 | }
13 | .el-icon-arrow-down {
14 | font-size: 12px;
15 | }
16 | }
17 |
18 | .block-col-2 {
19 | margin: -24px;
20 |
21 | .el-col {
22 | padding: 30px 0;
23 | text-align: center;
24 | border-right: 1px solid #eff2f6;
25 |
26 | &:last-child {
27 | border-right: 0;
28 | }
29 | }
30 | }
31 |
32 | .demo-dropdown .demonstration {
33 | display: block;
34 | color: #8492a6;
35 | font-size: 14px;
36 | margin-bottom: 20px;
37 | }
38 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/form.styl:
--------------------------------------------------------------------------------
1 | .demo-form {
2 | .el-select .el-input {
3 | width: 380px;
4 | }
5 | .el-form {
6 | width: auto;
7 | }
8 |
9 | .line {
10 | text-align: center;
11 | }
12 |
13 | .el-checkbox-group {
14 | // width: 320px;
15 | margin: 0;
16 | padding: 0;
17 | list-style: none;
18 |
19 | &:after,
20 | &:before {
21 | content: " ";
22 | display: table;
23 | }
24 | &:after {
25 | clear: both;
26 | visibility: hidden;
27 | font-size: 0;
28 | height: 0;
29 | }
30 |
31 | .el-checkbox {
32 | float: left;
33 | width: 160px;
34 | padding-right: 20px;
35 | margin: 0;
36 | padding: 0;
37 |
38 | + .el-checkbox {
39 | margin-left: 0;
40 | }
41 | }
42 | }
43 | .demo-form-normal {
44 | width: 460px;
45 | }
46 | .demo-form-inline {
47 | width: auto;
48 |
49 | .el-input {
50 | width: 150px;
51 | }
52 | > * {
53 | margin-right: 10px;
54 | }
55 | }
56 | .demo-ruleForm {
57 | width: 460px;
58 |
59 | .el-select .el-input {
60 | width: 360px;
61 | }
62 | }
63 | .demo-dynamic {
64 | .el-input {
65 | margin-right: 10px;
66 | width: 270px;
67 | vertical-align: top;
68 | }
69 | }
70 | .fr {
71 | float: right;
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/i18n.styl:
--------------------------------------------------------------------------------
1 | ul.language-list {
2 | color: #5e6d82;
3 | font-size: 14px;
4 | padding-left: 20px;
5 | li {
6 | line-height: 1.8;
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/icon.styl:
--------------------------------------------------------------------------------
1 | .demo-icon .source > div > i {
2 | color: #606266;
3 | margin: 0 20px;
4 | font-size: 1.5em;
5 | vertical-align: middle;
6 | }
7 |
8 | .demo-icon .source button {
9 | margin: 0 20px;
10 | }
11 |
12 | ul.icon-list {
13 | overflow: hidden;
14 | list-style: none;
15 | padding: 0!important;
16 | border: solid 1px #eaeefb;
17 | border-radius: 4px;
18 | display: flex;
19 | flex-wrap: wrap;
20 | }
21 | .icon-list li {
22 |
23 | width: 16.66%;
24 | text-align: center;
25 | height: 120px;
26 | line-height: 120px;
27 | color: #666;
28 | font-size: 13px;
29 | border-right: 1px solid #eee;
30 | border-bottom: 1px solid #eee;
31 | margin-right: -1px;
32 | margin-bottom: -1px;
33 |
34 | &::after {
35 | display: inline-block;
36 | content: "";
37 | height: 100%;
38 | vertical-align: middle;
39 | }
40 |
41 | span {
42 | display: inline-block;
43 | line-height: normal;
44 | vertical-align: middle;
45 | font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB",
46 | "Microsoft YaHei", SimSun, sans-serif;
47 | color: #99a9bf;
48 | transition: color 0.15s linear;
49 | }
50 |
51 | i {
52 | display: block;
53 | font-size: 32px;
54 | margin-bottom: 15px;
55 | color: #606266;
56 | transition: color 0.15s linear;
57 | }
58 |
59 | .icon-name {
60 | display: inline-block;
61 | padding: 0 3px;
62 | height: 1em;
63 | }
64 |
65 | &:hover {
66 | span,
67 | i {
68 | color: rgb(92, 182, 255);
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/image.styl:
--------------------------------------------------------------------------------
1 | @keyframes dot {
2 | 0% { width: 0; margin-right: 1em; }
3 | 100% { width: 1em; margin-right: 0; }
4 | }
5 |
6 | .demo-image {
7 | .block {
8 | padding: 30px 0;
9 | text-align: center;
10 | border-right: solid 1px #eff2f6;
11 | display: inline-block;
12 | width: 20%;
13 | box-sizing: border-box;
14 | vertical-align: top;
15 | &:last-child {
16 | border-right: none;
17 | }
18 | }
19 |
20 | .demonstration {
21 | display: block;
22 | color: #8492a6;
23 | font-size: 14px;
24 | margin-bottom: 20px;
25 | }
26 | }
27 |
28 | .demo-image__placeholder, .demo-image__error {
29 | @extend .demo-image;
30 |
31 | .block {
32 | width: 49%;
33 | }
34 |
35 | .el-image {
36 | width: 300px;
37 | height: 200px;
38 | }
39 |
40 | .image-slot {
41 | display: flex;
42 | justify-content: center;
43 | align-items: center;
44 | width: 100%;
45 | height: 100%;
46 | background: #f5f7fa;
47 | color: #909399;
48 | font-size: 14px;
49 | }
50 | }
51 |
52 | .demo-image__placeholder {
53 | .dot {
54 | animation: dot 2s infinite steps(3, start);
55 | overflow: hidden;
56 | }
57 | }
58 |
59 | .demo-image__error {
60 | .image-slot {
61 | font-size: 30px;
62 | }
63 | }
64 |
65 | .demo-image__lazy {
66 | height: 400px;
67 | overflow-y: auto;
68 |
69 | .el-image {
70 | display: block;
71 | min-height: 200px;
72 | margin-bottom: 10px;
73 |
74 | &:last-child {
75 | margin-bottom: 0;
76 | }
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/infinite-scroll.styl:
--------------------------------------------------------------------------------
1 | .infinite-list {
2 | height: 300px;
3 | padding: 0;
4 | margin: 0;
5 | list-style: none;
6 |
7 | .infinite-list-item {
8 | display: flex;
9 | align-items: center;
10 | justify-content: center;
11 | height: 50px;
12 | background: #e8f3fe;
13 | margin: 10px;
14 | color: lighten(#1989fa, 20%);
15 | & + .list-item {
16 | margin-top: 10px
17 | }
18 | }
19 | }
20 |
21 | .infinite-list-wrapper {
22 | height: 300px;
23 | text-align: center;
24 |
25 | .list{
26 | padding: 0;
27 | margin: 0;
28 | list-style: none;
29 | }
30 |
31 |
32 | .list-item{
33 | display: flex;
34 | align-items: center;
35 | justify-content: center;
36 | height: 50px;
37 | background: #fff6f6;
38 | color: #ff8484;
39 | & + .list-item {
40 | margin-top: 10px
41 | }
42 | }
43 | }
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/input-number.styl:
--------------------------------------------------------------------------------
1 | .demo-input-number {
2 | .el-input-number + .el-input-number {
3 | margin-left: 10px;
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/input.styl:
--------------------------------------------------------------------------------
1 | .demo-input {
2 | .el-select .el-input {
3 | width: 130px;
4 | }
5 | .el-input {
6 | width: 180px;
7 | }
8 | .el-textarea {
9 | width: 414px;
10 | }
11 | .el-input-group {
12 | width: 100%;
13 | }
14 | .demo-input-size {
15 | .el-input {
16 | vertical-align: top;
17 | margin: 0 10px 10px 0;
18 | }
19 | }
20 | .input-with-select .el-input-group__prepend {
21 | background-color: #fff;
22 | }
23 | .demo-autocomplete {
24 | text-align: center;
25 |
26 | .sub-title {
27 | margin-bottom: 10px;
28 | font-size: 14px;
29 | color: #8492a6;
30 | }
31 |
32 | .el-col:not(:last-child) {
33 | border-right: 1px solid rgba(224, 230, 237, 0.5);
34 | }
35 |
36 | .el-autocomplete {
37 | text-align: left;
38 | }
39 | }
40 | }
41 | .el-autocomplete-suggestion.my-autocomplete {
42 | li {
43 | line-height: normal;
44 | padding-top: 7px;
45 | padding-bottom: 7px;
46 |
47 | .name {
48 | text-overflow: ellipsis;
49 | overflow: hidden;
50 | }
51 | .addr {
52 | font-size: 12px;
53 | color: #b4b4b4;
54 | }
55 | .highlighted .addr {
56 | color: #ddd;
57 | }
58 | }
59 | }
60 | .demo-input-suffix {
61 | margin-bottom: 15px;
62 | .el-input {
63 | margin-right: 15px;
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/layout.styl:
--------------------------------------------------------------------------------
1 | .demo-layout {
2 | .el-row {
3 | margin-bottom: 20px;
4 | &:last-child {
5 | margin-bottom: 0;
6 | }
7 | }
8 | .el-col {
9 | border-radius: 4px;
10 | }
11 | .bg-purple-dark {
12 | background: #99a9bf;
13 | }
14 | .bg-purple {
15 | background: #d3dce6;
16 | }
17 | .bg-purple-light {
18 | background: #e5e9f2;
19 | }
20 | .grid-content {
21 | border-radius: 4px;
22 | min-height: 36px;
23 | }
24 | .row-bg {
25 | padding: 10px 0;
26 | background-color: #f9fafc;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/loading.styl:
--------------------------------------------------------------------------------
1 | .demo-loading .el-table {
2 | border: none;
3 | }
4 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/menu.styl:
--------------------------------------------------------------------------------
1 | .demo-menu {
2 | .el-menu-demo {
3 | padding-left: 55px;
4 | }
5 | .el-menu-vertical-demo:not(.el-menu--collapse) {
6 | width: 240px;
7 | min-height: 400px;
8 | }
9 | .line {
10 | height: 1px;
11 | background-color: #e0e6ed;
12 | margin: 35px -24px;
13 | }
14 | h5 {
15 | font-size: 14px;
16 | color: #8492a6;
17 | margin-top: 10px;
18 | }
19 | .tac {
20 | text-align: center;
21 |
22 | .el-menu-vertical-demo {
23 | display: inline-block;
24 | text-align: left;
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/pagination.styl:
--------------------------------------------------------------------------------
1 | .demo-pagination .source.first {
2 | padding: 0;
3 | }
4 |
5 | .demo-pagination .first .block {
6 | padding: 30px 0;
7 | text-align: center;
8 | border-right: solid 1px #eff2f6;
9 | display: inline-block;
10 | width: 50%;
11 | box-sizing: border-box;
12 |
13 | &:last-child {
14 | border-right: none;
15 | }
16 | }
17 |
18 | .demo-pagination .first .demonstration {
19 | display: block;
20 | color: #8492a6;
21 | font-size: 14px;
22 | margin-bottom: 20px;
23 | }
24 |
25 | .demo-pagination .source.last {
26 | padding: 0;
27 | }
28 |
29 | .demo-pagination .last .block {
30 | padding: 30px 24px;
31 | border-bottom: solid 1px #eff2f6;
32 | &:last-child {
33 | border-bottom: none;
34 | }
35 | }
36 |
37 | .demo-pagination .last .demonstration {
38 | font-size: 14px;
39 | color: #8492a6;
40 | line-height: 44px;
41 | }
42 |
43 | .demo-pagination .last .demonstration + .el-pagination {
44 | width: 70%;
45 | margin: 5px 20px 0 0;
46 | }
47 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/popover.styl:
--------------------------------------------------------------------------------
1 | .demo-popover {
2 | .el-popover + .el-popover {
3 | margin-left: 10px;
4 | }
5 | .el-input {
6 | width: 360px;
7 | }
8 | .el-button {
9 | margin-left: 10px;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/progress.styl:
--------------------------------------------------------------------------------
1 | .demo-progress {
2 | .el-progress--line {
3 | margin-bottom: 15px;
4 | width: 350px;
5 | }
6 | .el-progress--circle {
7 | margin-right: 15px;
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/rate.styl:
--------------------------------------------------------------------------------
1 | .demo-rate .block {
2 | padding: 30px 0;
3 | text-align: center;
4 | border-right: solid 1px #eff2f6;
5 | display: inline-block;
6 | width: 49%;
7 | box-sizing: border-box;
8 | &:last-child {
9 | border-right: none;
10 | }
11 | }
12 |
13 | .demo-rate .demonstration {
14 | display: block;
15 | color: #8492a6;
16 | font-size: 14px;
17 | margin-bottom: 20px;
18 | }
19 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/select.styl:
--------------------------------------------------------------------------------
1 | .demo-select .el-select {
2 | width: 240px;
3 | }
4 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/skeleton.styl:
--------------------------------------------------------------------------------
1 | .demo-skeleton {
2 | .el-card {
3 | margin-bottom: 16px;
4 | }
5 |
6 | .card-header {
7 | display: flex;
8 | justify-content: space-between;
9 | align-items: center;
10 | }
11 |
12 | .time {
13 | font-size: 13px;
14 | color: #999;
15 | }
16 |
17 | .bottom {
18 | margin-top: 13px;
19 | line-height: 12px;
20 | }
21 |
22 | .button {
23 | padding: 0;
24 | min-height: auto;
25 | }
26 |
27 | .image {
28 | &.multi-content {
29 | width: 400px;
30 | height: 267px;
31 | }
32 |
33 | width: 100%;
34 | display: block;
35 | }
36 |
37 | .clearfix:before,
38 | .clearfix:after {
39 | display: table;
40 | content: '';
41 | }
42 |
43 | .clearfix:after {
44 | clear: both;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/slider.styl:
--------------------------------------------------------------------------------
1 | .demo-slider .source {
2 | padding: 0;
3 | }
4 |
5 | .demo-slider .block {
6 | padding: 30px 24px;
7 | overflow: hidden;
8 | border-bottom: solid 1px #eff2f6;
9 | &:last-child {
10 | border-bottom: none;
11 | }
12 | }
13 |
14 | .demo-slider .demonstration {
15 | font-size: 14px;
16 | color: #8492a6;
17 | line-height: 44px;
18 | }
19 |
20 | .demo-slider .demonstration + .el-slider {
21 | float: right;
22 | width: 70%;
23 | margin-right: 20px;
24 | }
25 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/switch.styl:
--------------------------------------------------------------------------------
1 | .demo-switch {
2 | .el-switch {
3 | margin: 20px 20px 20px 0;
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/table.styl:
--------------------------------------------------------------------------------
1 | .el-table .warning-row {
2 | background: oldlace;
3 | }
4 |
5 | .el-table .success-row {
6 | background: #f0f9eb;
7 | }
8 |
9 | .demo-table .name-wrapper {
10 | display: inline-block;
11 | }
12 |
13 | .demo-table .demo-table-expand {
14 | label {
15 | width: 90px;
16 | color: #99a9bf;
17 | }
18 | .el-form-item {
19 | margin-right: 0;
20 | margin-bottom: 0;
21 | width: 50%;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/tag.styl:
--------------------------------------------------------------------------------
1 | .demo-tag {
2 | .el-row {
3 | margin-bottom: 20px;
4 |
5 | &:last-child {
6 | margin-bottom: 0;
7 | }
8 | }
9 | .el-tag + .el-tag {
10 | margin-left: 10px;
11 | }
12 |
13 | .button-new-tag {
14 | margin-left: 10px;
15 | height: 32px;
16 | line-height: 30px;
17 | padding-top: 0;
18 | padding-bottom: 0;
19 | }
20 |
21 | .input-new-tag {
22 | width: 90px;
23 | margin-left: 10px;
24 | vertical-align: bottom;
25 | }
26 |
27 | .tag-group {
28 | display: flex;
29 | align-items: center;
30 |
31 | &__title {
32 | width: 45px;
33 | font-size: 14px;
34 | color: #606266;
35 | }
36 |
37 | &+.tag-group {
38 | margin-top: 10px;
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/time-picker.styl:
--------------------------------------------------------------------------------
1 | .demo-time-picker {
2 | .el-date-editor + .el-date-editor {
3 | margin-left: 10px;
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/timeline.styl:
--------------------------------------------------------------------------------
1 | .demo-timeline .source .radio {
2 | margin-bottom: 20px;
3 | }
4 | .demo-timeline .source .radio .el-radio-group {
5 | margin-left: 20px;
6 | }
7 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/tooltip.styl:
--------------------------------------------------------------------------------
1 | .demo-tooltip {
2 | .el-tooltip + .el-tooltip {
3 | margin-left: 15px;
4 | }
5 | .box {
6 | width: 400px;
7 |
8 | .top {
9 | text-align: center;
10 | }
11 |
12 | .left {
13 | float: left;
14 | width: 60px;
15 | }
16 |
17 | .right {
18 | float: right;
19 | width: 60px;
20 | }
21 |
22 | .bottom {
23 | clear: both;
24 | text-align: center;
25 | }
26 |
27 | .item {
28 | margin: 4px;
29 | }
30 |
31 | .left .el-tooltip__popper,
32 | .right .el-tooltip__popper {
33 | padding: 8px 10px;
34 | }
35 | .el-tooltip {
36 | margin-left: 0;
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/transfer.styl:
--------------------------------------------------------------------------------
1 | .demo-transfer {
2 | .transfer-footer {
3 | margin-left: 15px;
4 | padding: 6px 5px;
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/transition.styl:
--------------------------------------------------------------------------------
1 | .demo-transition {
2 | .transition-box {
3 | margin-bottom: 10px;
4 | width: 200px;
5 | height: 100px;
6 | border-radius: 4px;
7 | background-color: #409EFF;
8 | text-align: center;
9 | color: #fff;
10 | padding: 40px 20px;
11 | margin-right: 20px;
12 | box-sizing: border-box;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/tree.styl:
--------------------------------------------------------------------------------
1 | .demo-tree {
2 | .leaf {
3 | width: 20px;
4 | background: #ddd;
5 | }
6 |
7 | .folder {
8 | width: 20px;
9 | background: #888;
10 | }
11 |
12 | .buttons {
13 | margin-top: 20px;
14 | }
15 |
16 | .filter-tree {
17 | margin-top: 20px;
18 | }
19 |
20 | .custom-tree-container {
21 | display: flex;
22 | margin: -24px;
23 | }
24 |
25 | .block {
26 | flex: 1;
27 | padding: 8px 24px 24px;
28 |
29 | &:first-child {
30 | border-right: solid 1px #eff2f6;
31 | }
32 |
33 | > p {
34 | text-align: center;
35 | margin: 0;
36 | line-height: 4;
37 | }
38 | }
39 |
40 | .custom-tree-node {
41 | flex: 1;
42 | display: flex;
43 | align-items: center;
44 | justify-content: space-between;
45 | font-size: 14px;
46 | padding-right: 8px;
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/typography.styl:
--------------------------------------------------------------------------------
1 | .demo-typo-size {
2 | .color-dark-light {
3 | color: #99a9bf;
4 | }
5 | }
6 | .demo-term-box img {
7 | width: 24%;
8 | margin: 0 4% 20px 0;
9 | }
10 |
11 | .lineH-left {
12 | display: inline-block;
13 | height: 80px;
14 | }
15 | .lineH-right {
16 | display: inline-block;
17 | list-style: none;
18 | padding: 0 0 0 90px;
19 | margin: 0;
20 | vertical-align: top;
21 | }
22 | .lineH-right li {
23 | font-size: 13px;
24 | color: #666;
25 | height: 20px;
26 | line-height: 20px;
27 | }
28 | .lineH-right li span {
29 | padding-left: 40px;
30 | }
31 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/element-ui/upload.styl:
--------------------------------------------------------------------------------
1 | .upload-tip {
2 | color: #8492a6;
3 | font-size: 12px;
4 | margin-top: 7px;
5 | }
6 | .demo-upload {
7 | margin-bottom: 24px;
8 |
9 | .upload-demo {
10 | width: 360px;
11 | }
12 | .avatar-uploader {
13 | .el-upload {
14 | border: 1px dashed #d9d9d9;
15 | border-radius: 6px;
16 | cursor: pointer;
17 | position: relative;
18 | overflow: hidden;
19 |
20 | &:hover,
21 | &:focus {
22 | border-color: #409eff;
23 | }
24 | }
25 | .avatar-uploader-icon {
26 | font-size: 28px;
27 | color: #8c939d;
28 | width: 178px;
29 | height: 178px;
30 | line-height: 178px;
31 | text-align: center;
32 | }
33 | .avatar {
34 | width: 178px;
35 | height: 178px;
36 | display: block;
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/index.styl:
--------------------------------------------------------------------------------
1 | @import 'developer/*'
2 | @import 'element-ui/*'
3 | @require './theme/index.styl';
4 | // 文档图标库
5 | @import '//at.alicdn.com/t/c/font_3584623_m93bbem50c.css'
6 |
7 | .home header img
8 | width: 300px
9 |
10 |
11 | .text.item
12 | line-height: 24px
13 | padding: 0
14 |
15 | .demo-block .copy-code-button {
16 | display: none
17 | }
18 |
19 | .theme-default-content:not(.custom) {
20 | max-width: 880px}
21 |
22 | .theme-default-content code {
23 | color: #476582;
24 | }
25 |
26 | body:not(.theme-dark) .theme-default-content code, body.theme-light .theme-default-content code {
27 | background: rgba(27, 31, 35, .05)
28 | }
29 |
30 | div[class*='language-'] {
31 | background: #fafafa;
32 | }
33 |
34 | .theme-default-content code {
35 | padding: 0.1rem 0.3rem
36 | }
37 |
38 | .icon-new {
39 | color: red;
40 | font-size: 20px;
41 | }
42 |
43 | th, td {
44 | border: none;
45 | }
46 |
47 | table {
48 | margin: 0;
49 | }
50 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/theme/code/helper.styl:
--------------------------------------------------------------------------------
1 | color-helper($codeColor, $codeBgColor) {
2 | --code-color: $codeColor;
3 | --code-line-color: alpha($codeColor, 0.67);
4 | --code-bg-color: $codeBgColor;
5 | --code-border-color: darken(saturate($codeBgColor, 20%), 10%);
6 | --code-highlight-line-color: darken(saturate($codeBgColor, 10%), 5%);
7 | }
8 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/theme/code/index.styl:
--------------------------------------------------------------------------------
1 | @require './base';
2 | @require './light';
3 | @require './dark';
--------------------------------------------------------------------------------
/docs/.vuepress/styles/theme/index.styl:
--------------------------------------------------------------------------------
1 | @require './normalize';
2 | @require './vars';
3 | @require './code/index';
4 | @require './theme';
5 | @require './layout';
6 | @require './plugins/index';
7 | @require './theme-color';
8 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/theme/layout.styl:
--------------------------------------------------------------------------------
1 | :root {
2 | @media (prefers-reduced-motion: no-preference) {
3 | scroll-behavior: smooth;
4 | }
5 | }
6 |
7 | ::-webkit-scrollbar {
8 | width: 6px;
9 | height: 6px;
10 | }
11 |
12 | ::-webkit-scrollbar-track-piece {
13 | -webkit-border-radius: 6px;
14 | border-radius: 6px;
15 | background: rgba(0, 0, 0, 10%);
16 | }
17 |
18 | ::-webkit-scrollbar-thumb {
19 | background-color: var(--accent-color);
20 | }
21 |
22 | .hide-in-mobile {
23 | @media (max-width: $MQMobile) {
24 | display: none !important;
25 | }
26 | }
27 |
28 | .hide-in-pad {
29 | @media (max-width: $MQNarrow) {
30 | display: none !important;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/theme/normalize.styl:
--------------------------------------------------------------------------------
1 |
2 | html, body {
3 | background: var(--bg-color);
4 | transition: background-color var(--color-transition);
5 | }
6 |
7 | html.dark {
8 | color-scheme: dark;
9 | }
10 |
11 | body {
12 | color: var(--text-color);
13 | font-family: var(--font-family);
14 | }
15 |
16 | a {
17 | color: var(--accent-color);
18 | }
19 |
20 | kbd {
21 | border-color: var(--grey14);
22 | background: var(--bg-color-light);
23 | font-family: var(--font-family-code);
24 | }
25 |
26 | code {
27 | font-family: var(--font-family-code);
28 | transition: background-color var(--color-transition), color var(--color-transition);
29 |
30 | html.dark & {
31 | background: #333;
32 | }
33 |
34 | p a & {
35 | color: var(--accent-color);
36 | }
37 | }
38 |
39 | blockquote {
40 | border-color: #eee;
41 | color: #666;
42 | transition: border-color var(--color-transition), color var(--color-transition);
43 |
44 | html.dark & {
45 | border-color: #333;
46 | }
47 | }
48 |
49 | h1 {
50 | @media (max-width: $MQMobileNarrow) {
51 | font-size: 1.9rem;
52 | }
53 | }
54 |
55 | h2 {
56 | border-color: var(--border-color);
57 | transition: border-bottom-color var(--color-transition);
58 | }
59 |
60 | hr {
61 | border-color: var(--border-color);
62 | transition: border-top-color var(--color-transition);
63 | }
64 |
65 | tr {
66 | border-color: var(--grey14);
67 |
68 | &:nth-child(2n) {
69 | background: var(--bg-color-light);
70 |
71 | html.dark & {
72 | background: #252322;
73 | }
74 | }
75 | }
76 |
77 | th, td {
78 | border-color: var(--grey14);
79 | }
80 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/theme/plugins/index.styl:
--------------------------------------------------------------------------------
1 | @require './nprogress';
2 | @require './search';
3 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/theme/plugins/nprogress.styl:
--------------------------------------------------------------------------------
1 |
2 | for $themeColorName, $themeColor in $colorPicker {
3 | .theme-{$themeColorName} {
4 | #nprogress {
5 | .bar {
6 | background: $themeColor;
7 | }
8 |
9 | .peg {
10 | box-shadow: 0 0 10px $themeColor, 0 0 5px $themeColor;
11 | }
12 |
13 | .spinner-icon {
14 | border-color: $themeColor;
15 | }
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/theme/theme-color.styl:
--------------------------------------------------------------------------------
1 | body {
2 | --accent-color: $accentColor;
3 | --accent-color-light: lighten($accentColor, 10%);
4 | --accent-color-dark: darken($accentColor, 10%);
5 | --accent-color-a15: alpha($accentColor, 15%);
6 | }
7 |
8 | theme-color($themeColor, $colorName) {
9 | body.theme-{$colorName} {
10 | --accent-color: $themeColor;
11 | --accent-color-light: lighten($themeColor, 10%);
12 | --accent-color-dark: darken($themeColor, 10%);
13 | --accent-color-a15: alpha($themeColor, 15%);
14 | }
15 | }
16 |
17 | for key, value in $colorPicker {
18 | theme-color(value, key);
19 | }
20 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/theme/theme.styl:
--------------------------------------------------------------------------------
1 |
2 | {$contentClass} {
3 | &:not(.custom) {
4 | wrapper();
5 |
6 | > {
7 | // heading fix
8 | h1, h2, h3, h4, h5, h6 {
9 | margin-top: calc(0.5rem - var(--navbar-height));
10 | margin-bottom: 0.5rem;
11 | padding-top: calc(1rem + var(--navbar-height));
12 | outline: none;
13 |
14 | .theme-container.no-navbar & {
15 | margin-top: 1.5rem;
16 | padding-top: 0;
17 | }
18 | }
19 |
20 | // paragraph fix
21 | p, ul p, ol p {
22 | text-align: justify;
23 | word-break: break-word;
24 | overflow-wrap: break-word;
25 | hyphens: auto;
26 |
27 | @media (max-width: $MQMobileNarrow) {
28 | text-align: left;
29 | }
30 | }
31 |
32 | a:hover {
33 | text-decoration: underline;
34 | }
35 | }
36 |
37 | img {
38 | max-width: 100%;
39 | }
40 | }
41 |
42 | &.custom {
43 | margin: 0;
44 | padding: 0;
45 |
46 | img {
47 | max-width: 100%;
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | home: true
3 | heroImage: '/logo.svg'
4 | # heroImage: 'https://cn.vuejs.org/images/logo.svg'
5 | heroText: Douluo UI
6 | tagline: '基于 Element UI 封装的 Douluo UI 组件库'
7 | actions:
8 | - text: 开始 💡
9 | link: /guide/
10 | type: primary
11 |
12 | - text: 组件文档 🛠
13 | link: /packages/element/layout/
14 |
15 | features:
16 | - title: 更易用
17 | details: 开箱即用,案例丰富
18 | - title: 更高效
19 | details: 傻瓜写法,超高性能
20 | - title: 更专业
21 | details: 完备,灵活,优雅
22 | footer: MIT Licensed | Copyright © 2022-present
23 | ---
24 |
25 | ## 🛠 安装
26 |
27 | :::: code-group
28 |
29 | ::: code-group-item npm
30 |
31 | ```bash
32 | npm add element-ui -S
33 | npm add douluo-ui -S
34 | ```
35 |
36 | :::
37 |
38 | ::: code-group-item yarn
39 |
40 | ```bash
41 | yarn add element-ui
42 | yarn add douluo-ui
43 | ```
44 |
45 | :::
46 |
47 | ::::
48 |
49 | ## 🚀 使用
50 |
51 | ```js
52 | import ElementUI from 'element-ui';
53 | import DouluoUI from 'douluo-ui';
54 | import 'element-ui/lib/theme-chalk/index.css';
55 | import 'douluo-ui/lib/css/index.css';
56 |
57 | Vue.use(ElementUI);
58 | Vue.use(DouluoUI);
59 | ```
60 |
61 |
62 | ::: tip
63 |
64 | `douluo-ui` 是基于 Element-UI 二次封装的组件库,使用前需要先安装 element-ui 组件库,提供了自定义换肤、自定义组件前缀、丰富的业务组件等功能
65 |
--------------------------------------------------------------------------------
/docs/developer/changelog.md:
--------------------------------------------------------------------------------
1 | # 更新日志
2 |
3 | ## [1.1.0](https://github.com/JefferyXZF/douluo-ui/tree/develop)(2022-11-01)
4 |
5 |
6 | #### ✨ Features | 新功能
7 |
8 |
9 | * 新增 Icon 图标
10 | * 新增 Button 按钮
11 | * 新增 Radio 单选框
12 | * 新增 Checkbox 多选框
13 | * 新增 Input 输入框
14 | * 新增 Select 选择器
15 | * 新增 TimePicker 时间选择器
16 | * 新增 DatePicker 日期选择器
17 | * 新增 DateTimePicker 日期时间选择器
18 | * 新增 Form 表单
19 | * 新增 Table 表格
20 | * 新增 Pagination 分页
21 | * 新增 Empty 空状态
22 | * 新增 Dialog 对话框
23 | * 新增 Tooltip 文字提示
24 | * 新增 Popover 弹出框
25 | * 新增 Popconfirm 气泡确认框
26 | * 新增 Drawer 抽屉
27 |
--------------------------------------------------------------------------------
/docs/developer/development-guide.md:
--------------------------------------------------------------------------------
1 | # 开发指南
2 |
--------------------------------------------------------------------------------
/docs/developer/installation.md:
--------------------------------------------------------------------------------
1 | # 安装使用
2 |
3 | 此组件库基于 `element-ui` 二次开发。使用前请查看[更新日志](../changelog)
4 |
5 | ## 安装
6 |
7 |
8 | :::: code-group
9 |
10 | ::: code-group-item npm
11 |
12 | ```bash
13 | npm install douluo-ui -S
14 | ```
15 |
16 | :::
17 |
18 | ::: code-group-item yarn
19 |
20 | ```bash
21 | yarn add douluo-ui -S
22 | ```
23 |
24 | :::
25 |
26 | ::: code-group-item pnpm
27 |
28 | ```bash
29 | pnpm add douluo-ui
30 | ```
31 |
32 | :::
33 |
34 | ::::
35 |
36 | ## 使用
37 |
38 | ```js
39 | import ElementUI from 'element-ui';
40 | import DouluoUI from 'douluo-ui';
41 | import 'element-ui/lib/theme-chalk/index.css';
42 | import 'douluo-ui/lib/css/index.css';
43 |
44 | Vue.use(ElementUI);
45 | Vue.use(DouluoUI);
46 | ```
47 |
--------------------------------------------------------------------------------
/docs/developer/question.md:
--------------------------------------------------------------------------------
1 | # 常见问题
2 |
3 | ### 安装新的插件使用打包失败
4 |
5 |
6 |
7 | ###
8 |
--------------------------------------------------------------------------------
/docs/guide/button.md:
--------------------------------------------------------------------------------
1 | # Button 按钮
2 |
3 | buttong 按钮
4 |
--------------------------------------------------------------------------------
/docs/guide/concept.md:
--------------------------------------------------------------------------------
1 | # 概念
2 |
3 | ## 物料
4 |
5 | 在中后台系统的开发中,我们早已习惯了基础组件库搭建我们的页面。然而这些基础组件很难完全满足我们的业务需求,实际项目开发中往往包含大量重复的业务场景。这些业务场景很多都是大同小异的,有些是有一定业务逻辑的组件(用户选择器、表单等),另一些是由基础组件和业务组件组合成的列表、模块,还有一些是页面布局、视觉规范、项目工程化等。如何复用这些业务场景,降低中后台系统开发的成本呢?我们通过与其他产品一起共建物料体系,提供丰富的物料来解决这些问题。
6 |
7 | 物料即组成一个前端项目的不同单位,根据抽象粒度的不同,我们将物料从小到大分为 组件(component)、区块(block) 和 模板(template) 。在基于物料体系的开发中,我们使用模板物料来初始化前端工程,提供最佳实践,解决工程问题,再使用区块和组件像搭积木一样快速搭建页面。
8 |
9 | ## 构成
10 |
11 | 物料分为 组件(component)、区块(block) 和 模板(template) 三种类型:
12 |
13 | - 组件(component):组件是组成页面的基本结构单元,是对局部交互逻辑的抽象和封装。通常需要设计和暴露属性、插槽、事件和方法等 API。使用者根据这些 API 直接使用,一般不需要做二次修改。从业务维度去看,组件又可分为基础组件和业务组件两种:
14 | - 基础组件:与业务无关的组件,基础组件保持统一的视觉规范,考虑高内聚低耦合的设计思想,例如 Button、Input、Table 等;
15 | - 业务组件:面向业务的组件,一般功能比较确定可复用,同时复杂度较高,例如富文本、大文件上传等。
16 | - 区块(block):区块可以理解为在页面中,由一些组件组合而成的代码片段。在一个页面中,使用者可以快速把某个区块的代码添加到自身项目里,进行二次修改。
17 | - 模板(template):项目的样板工程,包含了完整前端项目所有组成部分,包括布局、常用页面、基础插件、工程配置等,用户可以快速初始化项目。
18 |
19 | 基于以上三种不同粒度的物料,开发者可以加速前端项目开发。
20 |
--------------------------------------------------------------------------------
/docs/guide/instroduce.md:
--------------------------------------------------------------------------------
1 | # 背景
2 |
3 | 随着公司业务的扩张和增长,自研产品数量越来越多,系统也变得更复杂。高频的产品迭代,需要设计师、开发、产品经理能快速做出响应。另一方面,市场同类的产品和服务层出不穷,客户也开始对企业级的中后台产品追求更好的用户体验。我们迫切需要提升产品的商业价值和市场竞争力,打造使客户满意、用户满意的具备有用性、可用性和吸引力的产品。
4 |
5 | 为了提高产品的研发效率,我们经过大量的产品、项目实践和总结,沉淀出一个企业级的 Web 设计指南。旨在统一企业级的产品设计和前端开发,减少不必要的设计差异和实现成本,提升效率,节约设计和前端的研发资源,帮助设计师们创建易用性和实用性较强的产品和应用程序。
6 |
--------------------------------------------------------------------------------
/docs/packages/business/cropper.md:
--------------------------------------------------------------------------------
1 | # 图片裁剪
2 |
3 | 图片裁剪组件说明文档
4 |
5 |
6 |
--------------------------------------------------------------------------------
/docs/packages/business/rich-text.md:
--------------------------------------------------------------------------------
1 | # 富文本
2 |
3 | 富文本组件说明文档
4 |
--------------------------------------------------------------------------------
/docs/packages/element/backtop.md:
--------------------------------------------------------------------------------
1 | # Backtop 回到顶部
2 |
3 | 返回页面顶部的操作按钮
4 |
5 | ### 基础用法
6 |
7 | 滑动页面即可看到右下方的按钮。
8 | :::demo
9 |
10 | ```html
11 |
12 | Scroll down to see the bottom-right button.
13 |
14 |
15 | ```
16 |
17 | :::
18 |
19 | ### 自定义显示内容
20 |
21 | 显示区域被固定为 40px \* 40px 的区域, 其中的内容可支持自定义。
22 | :::demo
23 |
24 | ```html
25 |
26 | Scroll down to see the bottom-right button.
27 |
28 |
39 | UP
40 |
41 |
42 |
43 | ```
44 |
45 | :::
46 |
47 | ### Attributes
48 |
49 | | 参数 | 说明 | 类型 | 可选值 | 默认值 |
50 | | ----------------- | -------------------------------- | --------------- | ------ | ------ |
51 | | target | 触发滚动的对象 | string | | |
52 | | visibility-height | 滚动高度达到此参数值才出现 | number | | 200 |
53 | | right | 控制其显示位置, 距离页面右边距 | number | | 40 |
54 | | bottom | 控制其显示位置, 距离页面底部距离 | number | | 40 |
55 |
56 | ### Events
57 |
58 | | 事件名 | 说明 | 回调参数 |
59 | | ------ | ------------------ | -------- |
60 | | click | 点击按钮触发的事件 | 点击事件 |
61 |
--------------------------------------------------------------------------------
/docs/packages/element/breadcrumb.md:
--------------------------------------------------------------------------------
1 | # Breadcrumb 面包屑
2 | 显示当前页面的路径,快速返回之前的任意页面。
3 |
4 | ### 基础用法
5 |
6 | 适用广泛的基础用法。
7 |
8 | :::demo 在`el-breadcrumb`中使用`el-breadcrumb-item`标签表示从首页开始的每一级。Element 提供了一个`separator`属性,在`el-breadcrumb`标签中设置它来决定分隔符,它只能是字符串,默认为斜杠`/`。
9 |
10 | ```html
11 |
12 | 首页
13 | 活动管理
14 | 活动列表
15 | 活动详情
16 |
17 | ```
18 | :::
19 |
20 | ### 图标分隔符
21 |
22 | :::demo 通过设置 `separator-class` 可使用相应的 `iconfont` 作为分隔符,注意这将使 `separator` 设置失效
23 |
24 | ```html
25 |
26 | 首页
27 | 活动管理
28 | 活动列表
29 | 活动详情
30 |
31 | ```
32 | :::
33 |
34 | ### Breadcrumb Attributes
35 | | 参数 | 说明 | 类型 | 可选值 | 默认值 |
36 | |---------- |-------------- |---------- |-------------------------------- |-------- |
37 | | separator | 分隔符 | string | — | 斜杠'/' |
38 | | separator-class | 图标分隔符 class | string | — | - |
39 |
40 | ### Breadcrumb Item Attributes
41 | | 参数 | 说明 | 类型 | 可选值 | 默认值 |
42 | |---------- |-------------- |---------- |-------------------------------- |-------- |
43 | | to | 路由跳转对象,同 `vue-router` 的 `to` | string/object | — | — |
44 | | replace | 在使用 to 进行路由跳转时,启用 replace 将不会向 history 添加新记录 | boolean | — | false |
45 |
--------------------------------------------------------------------------------
/docs/packages/element/calendar.md:
--------------------------------------------------------------------------------
1 | # Calendar calendar
2 |
3 | 显示日期
4 |
5 | ### 基本
6 |
7 | :::demo 设置 `value` 来指定当前显示的月份。如果 `value` 未指定,则显示当月。`value` 支持 `v-model` 双向绑定。
8 | ```html
9 |
10 |
11 |
12 |
21 | ```
22 | :::
23 |
24 | ### 自定义内容
25 |
26 | :::demo 通过设置名为 `dateCell` 的 `scoped-slot` 来自定义日历单元格中显示的内容。在 `scoped-slot` 可以获取到 date(当前单元格的日期), data(包括 type,isSelected,day 属性)。详情解释参考下方的 API 文档。
27 | ```html
28 |
29 |
30 |
33 |
34 | {{ data.day.split('-').slice(1).join('-') }} {{ data.isSelected ? '✔️' : ''}}
35 |
36 |
37 |
38 |
43 | ```
44 | :::
45 |
46 | ### 自定义范围
47 |
48 | :::demo 设置 `range` 属性指定日历的显示范围。开始时间必须是周起始日,结束时间必须是周结束日,且时间跨度不能超过两个月。
49 | ```html
50 |
51 |
52 | ```
53 | :::
54 |
55 | ### Attributes
56 | | 参数 | 说明 | 类型 | 可选值 | 默认值 |
57 | |-----------------|-------------- |---------- |------------ |-------- |
58 | | value / v-model | 绑定值 | Date/string/number | — | — |
59 | | range | 时间范围,包括开始时间与结束时间。开始时间必须是周一,结束时间必须是周日,且时间跨度不能超过两个月。 | Array | — | — |
60 | | first-day-of-week | 周起始日 | Number | 1 到 7 | 1 |
61 |
62 | ### dateCell scoped slot 参数
63 | | 参数 | 说明 | 类型 | 可选值 | 默认值 |
64 | |-----------------|-------------- |---------- |------------ |-------- |
65 | | date | 单元格代表的日期 | Date | — | — |
66 | | data | { type, isSelected, day},`type` 表示该日期的所属月份,可选值有 prev-month,current-month,next-month;`isSelected` 标明该日期是否被选中;`day` 是格式化的日期,格式为 yyyy-MM-dd | Object | — | — |
67 |
--------------------------------------------------------------------------------
/docs/packages/element/divider.md:
--------------------------------------------------------------------------------
1 | # Divider 分割线
2 |
3 | 区隔内容的分割线。
4 |
5 | ### 基础用法
6 |
7 | 对不同章节的文本段落进行分割。
8 |
9 | :::demo
10 | ```html
11 |
12 |
13 | 青春是一个短暂的美梦, 当你醒来时, 它早已消失无踪
14 |
15 | 少量的邪恶足以抵消全部高贵的品质, 害得人声名狼藉
16 |
17 |
18 | ```
19 | :::
20 |
21 | ### 设置文案
22 |
23 | 可以在分割线上自定义文案内容。
24 |
25 |
26 | :::demo
27 | ```html
28 |
29 |
30 | 头上一片晴天,心中一个想念
31 | 少年包青天
32 | 饿了别叫妈, 叫饿了么
33 |
34 | 为了无法计算的价值
35 | 阿里云
36 |
37 |
38 | ```
39 | :::
40 |
41 | ### 垂直分割
42 |
43 | :::demo
44 | ```html
45 |
46 |
47 | 雨纷纷
48 |
49 | 旧故里
50 |
51 | 草木深
52 |
53 |
54 | ```
55 | :::
56 |
57 | ### Divider Attributes
58 | | 参数 | 说明 | 类型 | 可选值 | 默认值 |
59 | |------------- |---------------- |---------------- |---------------------- |-------- |
60 | | direction | 设置分割线方向 | string | horizontal / vertical | horizontal |
61 | | content-position | 设置分割线文案的位置 | string | left / right / center | center |
62 |
--------------------------------------------------------------------------------
/docs/packages/element/empty.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Empty 空状态
3 | pageClass: demo-empty
4 | icon: new
5 | ---
6 |
7 | 空状态时的占位提示。
8 |
9 | ### 基础用法
10 |
11 | :::demo
12 |
13 | ```html
14 |
15 | ```
16 | :::
17 |
18 | ### 自定义图片
19 |
20 | 通过设置 `image` 属性传入图片 URL。
21 |
22 | :::demo
23 |
24 | ```html
25 |
26 | ```
27 | :::
28 |
29 | ### 图片尺寸
30 |
31 | 通过设置 `image-size` 属性来控制图片大小。
32 |
33 | :::demo
34 |
35 | ```html
36 |
37 | ```
38 | :::
39 |
40 | ### 底部内容
41 |
42 | 使用默认插槽可在底部插入内容。
43 |
44 | :::demo
45 | ```html
46 |
47 | 按钮
48 |
49 | ```
50 | :::
51 |
52 | ### Empty Attributes
53 | | 参数 | 说明 | 类型 | 可选值 | 默认值 |
54 | |------------- |---------------- |---------------- |---------------------- |-------- |
55 | | image | 图片地址 | string | — | — |
56 | | image-size | 图片大小(宽度) | number | — | — |
57 | | description | 文本描述 | string | — | — |
58 |
59 | ### Empty Slots
60 |
61 | | Name | 说明 |
62 | |------|--------|
63 | | default | 自定义底部内容 |
64 | | image | 自定义图片 |
65 | | description | 自定义描述文字 |
66 |
--------------------------------------------------------------------------------
/docs/packages/element/icon.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Icon 图标
3 | pageClass: demo-icon
4 | icon: new
5 | ---
6 |
7 | 提供了一套常用的图标集合。
8 |
9 | ### 使用方法
10 |
11 | 直接通过设置类名为 `el-icon-iconName` 来使用即可。例如:
12 |
13 | :::demo
14 | ```html
15 |
16 |
17 |
18 | 搜索
19 |
20 | ```
21 | :::
22 |
23 | ### 组件库图标集合
24 |
25 |
26 |
27 | -
28 |
29 |
30 | {{'el-icon-' + name}}
31 |
32 |
33 |
34 |
35 |
36 | ### element-ui 图标集合
37 |
38 |
39 |
40 |
41 | -
42 |
43 |
44 | {{'el-icon-' + name}}
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/docs/packages/element/infiniteScroll.md:
--------------------------------------------------------------------------------
1 | # InfiniteScroll 无限滚动
2 |
3 | 滚动至底部时,加载更多数据。
4 |
5 | ### 基础用法
6 | 在要实现滚动加载的列表上上添加`v-infinite-scroll`,并赋值相应的加载方法,可实现滚动到底部时自动执行加载方法。
7 | :::demo
8 | ```html
9 |
10 |
13 |
14 |
15 |
29 | ```
30 | :::
31 |
32 | ### 禁用加载
33 |
34 | :::demo
35 | ```html
36 |
37 |
38 |
44 |
加载中...
45 |
没有更多了
46 |
47 |
48 |
49 |
76 | ```
77 | :::
78 |
79 |
80 | ### Attributes
81 |
82 | | 参数 | 说明 | 类型 | 可选值 | 默认值 |
83 | | -------------- | ------------------------------ | --------- | ------------------------------------ | ------- |
84 | | infinite-scroll-disabled | 是否禁用 | boolean | - |false |
85 | | infinite-scroll-delay | 节流时延,单位为ms | number | - |200 |
86 | | infinite-scroll-distance| 触发加载的距离阈值,单位为px | number |- |0 |
87 | | infinite-scroll-immediate | 是否立即执行加载方法,以防初始状态下内容无法撑满容器。| boolean | - |true |
88 |
--------------------------------------------------------------------------------
/docs/packages/element/installation.md:
--------------------------------------------------------------------------------
1 | # 安装
2 |
3 | ### npm 安装
4 |
5 | 推荐使用 npm 的方式安装,它能更好地和 [webpack](https://webpack.js.org/) 打包工具配合使用。
6 |
7 | ```shell
8 | npm i element-ui -S
9 | ```
10 |
11 | ### CDN
12 |
13 | 目前可以通过 [unpkg.com/element-ui](https://unpkg.com/element-ui/) 获取到最新版本的资源,在页面上引入 js 和 css 文件即可开始使用。
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 | ```
21 |
22 | :::tip
23 | 我们建议使用 CDN 引入 Element 的用户在链接地址上锁定版本,以免将来 Element 升级时受到非兼容性更新的影响。锁定版本的方法请查看 [unpkg.com](https://unpkg.com)。
24 | :::
25 |
26 | ### Hello world
27 |
28 | 通过 CDN 的方式我们可以很容易地使用 Element 写出一个 Hello world 页面。[在线演示](https://codepen.io/ziyoung/pen/rRKYpd)
29 |
30 |
34 |
35 | 如果是通过 npm 安装,并希望配合 webpack 使用,请阅读下一节:[快速上手](/#/zh-CN/component/quickstart)。
36 |
--------------------------------------------------------------------------------
/docs/packages/element/link.md:
--------------------------------------------------------------------------------
1 | # Link 文字链接
2 |
3 | 文字超链接
4 |
5 | ### 基础用法
6 | 基础的文字链接用法。
7 | :::demo
8 | ```html
9 |
10 | 默认链接
11 | 主要链接
12 | 成功链接
13 | 警告链接
14 | 危险链接
15 | 信息链接
16 |
17 | ```
18 | :::
19 |
20 | ### 禁用状态
21 | 文字链接不可用状态。
22 | :::demo
23 | ```html
24 |
25 | 默认链接
26 | 主要链接
27 | 成功链接
28 | 警告链接
29 | 危险链接
30 | 信息链接
31 |
32 | ```
33 | :::
34 |
35 | ### 下划线
36 | 文字链接下划线。
37 | :::demo
38 | ```html
39 |
40 | 无下划线
41 | 有下划线
42 |
43 | ```
44 | :::
45 |
46 | ### 图标
47 |
48 | 带图标的文字链接可增强辨识度。
49 | :::demo
50 | ```html
51 |
52 | 编辑
53 | 查看
54 |
55 | ```
56 | :::
57 |
58 | ### Attributes
59 |
60 | | 参数 | 说明 | 类型 | 可选值 | 默认值 |
61 | | -------------- | ------------------------------ | --------- | ------------------------------------ | ------- |
62 | | type | 类型 | string | primary / success / warning / danger / info | default |
63 | | underline | 是否下划线 | boolean | — | true |
64 | | disabled | 是否禁用状态 | boolean | — | false |
65 | | href | 原生 href 属性 | string | — | - |
66 | | icon | 图标类名 | string | — | - |
67 |
--------------------------------------------------------------------------------
/docs/packages/element/page-header.md:
--------------------------------------------------------------------------------
1 | # PageHeader 页头
2 |
3 | 如果页面的路径比较简单,推荐使用页头组件而非面包屑组件。
4 |
5 | ### 基础
6 |
7 | :::demo
8 | ```html
9 |
10 |
11 |
12 |
21 | ```
22 | :::
23 |
24 | ### Attributes
25 | | 参数 | 说明 | 类型 | 可选值 | 默认值 |
26 | |---------- |-------------- |---------- |------------------------------ | ------ |
27 | | title | 标题 | string | — | 返回 |
28 | | content | 内容 | string | — | — |
29 |
30 |
31 | ### Events
32 | | 事件名称 | 说明 | 回调参数 |
33 | |---------- |-------------- |---------- |
34 | | back | 点击左侧区域触发 | — |
35 |
36 | ### Slots
37 | | 事件名称 | 说明 |
38 | |---------- |------------- |
39 | | title | 标题内容 |
40 | | content | 内容 |
41 |
--------------------------------------------------------------------------------
/docs/packages/element/popconfirm.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Popconfirm 气泡确认框
3 | pageClass: demo-popconfirm
4 | icon: new
5 | ---
6 |
7 | 点击元素,弹出气泡确认框。
8 |
9 | ### 基础用法
10 |
11 | Popconfirm 的属性与 Popover 很类似,因此对于重复属性,请参考 Popover 的文档,在此文档中不做详尽解释。
12 | :::demo 在 Popconfirm 中,只有 `title` 属性可用,`content` 属性不会被展示。
13 | ```html
14 |
15 |
18 | 删除
19 |
20 |
21 | ````
22 | :::
23 |
24 | ### 自定义
25 |
26 | 可以在 Popconfirm 中自定义内容。
27 | :::demo
28 | ```html
29 |
30 |
37 | 删除
38 |
39 |
40 | ```
41 | :::
42 |
43 | ### Attributes
44 | | 参数 | 说明 | 类型 | 可选值 | 默认值 |
45 | |--------------------|----------------------------------------------------------|-------------------|-------------|--------|
46 | | title | 标题 | String | — | — |
47 | | confirm-button-text | 确认按钮文字 | String | — | — |
48 | | cancdl-button-text | 取消按钮文字 | String | — | — |
49 | | confirm-button-type | 确认按钮类型 | String | — | Primary |
50 | | cancdl-button-type | 取消按钮类型 | String | — | Text |
51 | | icon | Icon | String | — | dl-icon-question |
52 | | icon-color | Icon 颜色 | String | — | #f90 |
53 | | hide-icon | 是否隐藏 Icon | Boolean | — | false |
54 |
55 | ### Slot
56 | | 参数 | 说明 |
57 | |--- | ---|
58 | | reference | 触发 Popconfirm 显示的 HTML 元素 |
59 |
60 | ### Events
61 | | 事件名称 | 说明 | 回调参数 |
62 | |---------|--------|---------|
63 | | confirm | 点击确认按钮时触发 | — |
64 | | cancel | 点击取消按钮时触发 | — |
65 |
--------------------------------------------------------------------------------
/docs/packages/element/result.md:
--------------------------------------------------------------------------------
1 | # Result 结果
2 |
3 | 用于对用户的操作结果或者异常状态做反馈。
4 |
5 | ### 基础用法
6 |
7 | :::demo
8 |
9 | ```html
10 |
11 |
12 |
13 |
14 | 返回
15 |
16 |
17 |
18 |
19 |
20 |
21 | 返回
22 |
23 |
24 |
25 |
26 |
27 |
28 | 返回
29 |
30 |
31 |
32 |
33 |
34 |
35 | 返回
36 |
37 |
38 |
39 |
40 | ```
41 |
42 | :::
43 |
44 | ### 自定义内容
45 |
46 | :::demo
47 |
48 | ```html
49 |
50 |
51 |
52 |
53 |
54 | 返回
55 |
56 |
57 | ```
58 |
59 | :::
60 |
61 | ### Result Attributes
62 |
63 | | 参数 | 说明 | 类型 | 可选值 | 默认值 |
64 | |------------- |---------------- |---------------- |---------------------- |-------- |
65 | | title | 标题 | string | — | — |
66 | | sub-title | 二级标题 | string | — | — |
67 | | icon | 图标类型 | string | success / warning / info / error | info |
68 |
69 | ### Result Slots
70 |
71 | | Name | 说明 |
72 | |------|--------|
73 | | icon | 自定义图标 |
74 | | title | 自定义标题 |
75 | | subTitle | 自定义二级标题 |
76 | | extra | 自定义底部额外区域 |
77 |
--------------------------------------------------------------------------------
/examples/assets/json/dl-icon.json:
--------------------------------------------------------------------------------
1 | ["warning","info","lock","check","success","error","help","reflesh","setting","pass","delete","star","yanjing","right","left","review"]
2 |
--------------------------------------------------------------------------------
/examples/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebJeffery/douluo-ui/6c83bdeb013e15083b6474dfcece7a0417dc9904/examples/assets/logo.png
--------------------------------------------------------------------------------
/examples/assets/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/examples/main.js:
--------------------------------------------------------------------------------
1 | // main.js
2 | import Vue from 'vue'
3 | import App from './src/App.vue'
4 | import router from './src/router/index.js'
5 |
6 | import ElementUI from 'element-ui'
7 | import 'element-ui/lib/theme-chalk/index.css'
8 |
9 | // 本地安装组件测试的包
10 | // import DouluoUI from 'douluo-ui'
11 | // import 'douluo-ui/lib/theme/index.css'
12 |
13 | import DouluoUI from '../src/index.js'
14 | import '../styles/src/index.scss'
15 |
16 | Vue.use(ElementUI)
17 | Vue.use(DouluoUI)
18 |
19 | const creatApp = async () => {
20 | try {
21 | await DouluoUI.updateUITheme({
22 | primaryColor: '#FFAA00',
23 | primarySecondColor: '#231909'
24 | })
25 |
26 | new Vue({
27 | el: '#app',
28 | router,
29 | render: (h) => h(App)
30 | }).$mount()
31 | } catch (error) {
32 | new Vue({
33 | el: '#app',
34 | router,
35 | render: (h) => h(App)
36 | }).$mount()
37 | console.error('主题更新失败')
38 | }
39 | }
40 |
41 | creatApp()
42 |
--------------------------------------------------------------------------------
/examples/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
23 |
24 |
32 |
--------------------------------------------------------------------------------
/examples/src/layout/components/AppMain.vue:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
21 |
22 |
--------------------------------------------------------------------------------
/examples/src/layout/components/index.js:
--------------------------------------------------------------------------------
1 | export { default as AppMain } from './AppMain.vue'
2 | export { default as Sidebar } from './Sidebar/index.vue'
3 |
--------------------------------------------------------------------------------
/examples/src/layout/components/sidebar/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
17 |
18 |
19 |
20 |
39 |
40 |
45 |
--------------------------------------------------------------------------------
/examples/src/layout/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
22 |
23 |
35 |
--------------------------------------------------------------------------------
/examples/src/utils/validate.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @param {string} path
3 | * @returns {Boolean}
4 | */
5 | export function isExternal(path) {
6 | return /^(https?:|mailto:|tel:)/.test(path)
7 | }
8 |
--------------------------------------------------------------------------------
/examples/src/views/button/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Button 组件
4 |
5 |
6 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/examples/src/views/checkbox/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Checkbox 组件
4 |
5 |
6 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/examples/src/views/datePicker/components/datePicker1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
选择日
4 |
以「日」为基本单位,基础的日期选择控件
5 |
9 |
19 |
20 |
21 |
22 |
61 |
69 |
--------------------------------------------------------------------------------
/examples/src/views/datePicker/components/datePicker2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
其他日期单位
4 |
通过扩展基础的日期选择,可以选择周、月、年或多个日期
5 |
15 |
25 |
26 |
27 |
28 |
40 |
47 |
--------------------------------------------------------------------------------
/examples/src/views/datePicker/components/datePicker3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
选择日期范围
4 |
可在一个选择器中便捷地选择一个时间范围
5 |
15 |
28 |
29 |
30 |
31 |
72 |
80 |
--------------------------------------------------------------------------------
/examples/src/views/datePicker/components/datePicker4.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
选择月份范围
4 |
可在一个选择器中便捷地选择一个月份范围
5 |
15 |
28 |
29 |
30 |
31 |
68 |
76 |
--------------------------------------------------------------------------------
/examples/src/views/datePicker/components/datePicker5.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
日期格式
4 |
使用format指定输入框的格式;使用value-format指定绑定值的格式。
5 |
6 |
默认为 Date 对象
7 |
值:{{ value1 }}
8 |
9 |
10 |
11 |
使用 value-format
12 |
值:{{ value2 }}
13 |
20 |
21 |
22 |
时间戳
23 |
值:{{ value3 }}
24 |
31 |
32 |
33 |
34 |
35 |
46 |
--------------------------------------------------------------------------------
/examples/src/views/datePicker/components/datePicker6.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
默认显示日期
4 |
在选择日期范围时,指定起始日期和结束日期的默认时刻。
5 |
组件值:{{ value }}
6 |
13 |
14 |
15 |
16 |
25 |
--------------------------------------------------------------------------------
/examples/src/views/datePicker/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
日期选择器
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
29 |
--------------------------------------------------------------------------------
/examples/src/views/dialog/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Dialog 组件
4 |
5 |
6 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/examples/src/views/drawer/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Drawer 组件
4 |
5 |
6 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/examples/src/views/empty/demo/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
19 |
20 |
21 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/examples/src/views/empty/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Input 组件
4 |
5 |
6 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/examples/src/views/form/demo/demo2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
行内表单
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | 查询
16 |
17 |
18 |
19 |
20 |
21 |
38 |
--------------------------------------------------------------------------------
/examples/src/views/form/demo/demo3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
对齐方式
4 |
5 | 左对齐
6 | 右对齐
7 | 顶部对齐
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
37 |
--------------------------------------------------------------------------------
/examples/src/views/form/demo/demo7.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
数字类型验证
4 |
5 |
13 |
14 |
15 |
16 | 提交
17 | 重置
18 |
19 |
20 |
21 |
22 |
23 |
49 |
--------------------------------------------------------------------------------
/examples/src/views/form/demo/demo8.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
表单内组件尺寸控制
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | -
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | 立即创建
38 | 取消
39 |
40 |
41 |
42 |
43 |
44 |
67 |
--------------------------------------------------------------------------------
/examples/src/views/form/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Form 组件
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
40 |
41 |
66 |
--------------------------------------------------------------------------------
/examples/src/views/icon/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Icon 组件
4 |
5 |
6 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/examples/src/views/input/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Input 组件
4 |
5 |
6 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/examples/src/views/pagination/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Pagination 分页组件
4 |
5 |
6 |
7 |
8 |
18 |
19 |
29 |
--------------------------------------------------------------------------------
/examples/src/views/popconfirm/demo/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
基本用法
4 |
7 | 删除
8 |
9 |
10 |
自定义
11 |
18 | 删除
19 |
20 |
21 |
22 |
23 |
65 |
66 |
71 |
--------------------------------------------------------------------------------
/examples/src/views/popconfirm/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Popconfirm 组件
4 |
5 |
6 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/examples/src/views/popover/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Popover 组件
4 |
5 |
6 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/examples/src/views/radio/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Radio 组件
4 |
5 |
6 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/examples/src/views/select/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Select 组件
4 |
5 |
6 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/examples/src/views/table/demo/basis-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
基础表格
4 |
5 |
6 |
预览
7 |
查看留言
8 |
9 | {{ scope.row.linksInfo ? '已屏蔽' : '屏蔽' }}
10 |
11 |
12 |
13 |
14 |
15 |
16 |
57 |
--------------------------------------------------------------------------------
/examples/src/views/table/demo/border-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
49 |
--------------------------------------------------------------------------------
/examples/src/views/table/demo/custom-index-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
58 |
--------------------------------------------------------------------------------
/examples/src/views/table/demo/empty-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
33 |
--------------------------------------------------------------------------------
/examples/src/views/table/demo/fixed-column-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
78 |
79 |
88 |
--------------------------------------------------------------------------------
/examples/src/views/table/demo/fixed-header-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
40 |
--------------------------------------------------------------------------------
/examples/src/views/table/demo/fluid-height-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
65 |
--------------------------------------------------------------------------------
/examples/src/views/table/demo/multiple-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
多选
4 |
10 |
11 | 切换第二、第三行的选中状态
12 | 取消选择
13 |
14 |
15 |
16 |
17 |
76 |
--------------------------------------------------------------------------------
/examples/src/views/table/demo/pagination-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
20 |
21 |
22 |
78 |
--------------------------------------------------------------------------------
/examples/src/views/table/demo/radio-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
单选
4 |
11 |
12 | 选中第二行
13 | 取消选择
14 |
15 |
16 |
17 |
18 |
72 |
--------------------------------------------------------------------------------
/examples/src/views/table/demo/sort-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 |
62 |
--------------------------------------------------------------------------------
/examples/src/views/table/demo/status-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
64 |
65 |
74 |
--------------------------------------------------------------------------------
/examples/src/views/table/demo/stripe-table.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
49 |
--------------------------------------------------------------------------------
/examples/src/views/tag/demo/demo1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
基础用法
4 |
默认的状态
5 |
6 | 我是标签
7 |
8 |
9 |
其他的状态
10 |
11 | 成功标签
12 | 等待中标签
13 | 失败标签
14 |
15 |
16 |
禁用的状态
17 |
18 | 禁用标签
19 |
20 |
21 |
可移除标签
22 |
默认的状态
23 |
24 | 可移除标签
25 |
26 |
禁用的状态
27 |
28 | 可移除标签
29 |
30 |
31 |
可编辑标签
32 |
默认的状态
33 |
34 |
35 |
36 |
禁用状态
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/examples/src/views/tag/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Tag 组件
4 |
5 |
6 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/examples/src/views/timePicker/components/timePicker1.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
固定时间点
4 |
提供几个固定的时间点供用户选择
5 |
15 |
16 |
17 |
18 |
27 |
--------------------------------------------------------------------------------
/examples/src/views/timePicker/components/timePicker2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
任意时间点
4 |
可以选择任意时间
5 |
12 |
20 |
21 |
22 |
23 |
33 |
--------------------------------------------------------------------------------
/examples/src/views/timePicker/components/timePicker3.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
固定时间范围
4 |
若先选择开始时间,则结束时间内备选项的状态会随之改变
5 |
14 |
24 |
25 |
26 |
27 |
37 |
--------------------------------------------------------------------------------
/examples/src/views/timePicker/components/timePicker4.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
任意时间范围
4 |
可选择任意的时间范围
5 |
13 |
22 |
23 |
24 |
25 |
35 |
--------------------------------------------------------------------------------
/examples/src/views/timePicker/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
时间选择器
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
22 |
--------------------------------------------------------------------------------
/examples/src/views/tooltip/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Tooltip 组件
4 |
5 |
6 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/gulpfile.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const path = require('path')
4 | const { series, src, dest } = require('gulp');
5 | const gulpSass = require('gulp-sass');
6 | const dartSass = require('sass')
7 | const autoprefixer = require('gulp-autoprefixer');
8 | const cssmin = require('gulp-cssmin');
9 |
10 | const distFolder = path.resolve(__dirname, 'styles')
11 |
12 | function compileIndex() {
13 | const sass = gulpSass(dartSass)
14 | return src('./styles/src/**.scss')
15 | .pipe(sass.sync())
16 | .pipe(autoprefixer({
17 | browsers: ['ie > 9', 'last 2 versions'],
18 | cascade: false
19 | }))
20 | .pipe(cssmin())
21 | .pipe(dest('./styles/theme'));
22 | }
23 |
24 | const compileElement = function () {
25 | const sass = gulpSass(dartSass)
26 | return src('./styles/src/element-ui/**.scss')
27 | .pipe(sass.sync())
28 | .pipe(autoprefixer({
29 | browsers: ['ie > 9', 'last 2 versions'],
30 | cascade: false
31 | }))
32 | .pipe(cssmin())
33 | .pipe(dest('./styles/theme/element-ui'));
34 |
35 | }
36 |
37 | /**
38 | * copy from packages/theme-chalk/dist to dist/element-plus/theme-chalk
39 | */
40 | function copyThemeChalkBundle() {
41 | return src(`${distFolder}/theme/**`).pipe(dest('./lib/theme'))
42 | }
43 |
44 | function copyfont() {
45 | return src(`${distFolder}/src/fonts/**`)
46 | .pipe(cssmin())
47 | .pipe(dest('./lib/theme/fonts'));
48 | }
49 |
50 | exports.build = series(
51 | compileIndex,
52 | compileElement,
53 | copyThemeChalkBundle,
54 | copyfont
55 | );
56 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Vite App
7 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "experimentalDecorators": true,
4 | "baseUrl": ".",
5 | "paths": {
6 | "@/*": ["./examples/*"],
7 | "src/*": ["./src/*"],
8 | }
9 | },
10 | "implicitProjectConfig":{
11 | "experimentalDecorators": true
12 | },
13 | "exclude": ["node_modules", "dist"]
14 | }
15 |
16 |
--------------------------------------------------------------------------------
/packages/element-ui/button/index.js:
--------------------------------------------------------------------------------
1 | import Button from './src/button.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Button.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('button', { prefix: options.prefix }), Button)
6 | }
7 |
8 | export default Button
9 |
--------------------------------------------------------------------------------
/packages/element-ui/button/src/button.vue:
--------------------------------------------------------------------------------
1 |
2 |
31 |
32 |
86 |
--------------------------------------------------------------------------------
/packages/element-ui/checkbox-button/index.js:
--------------------------------------------------------------------------------
1 | import CheckboxButton from '../checkbox/src/checkbox-button.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | CheckboxButton.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('CheckboxButton', { prefix: options.prefix }), CheckboxButton)
6 | }
7 |
8 | export default CheckboxButton
9 |
--------------------------------------------------------------------------------
/packages/element-ui/checkbox-group/index.js:
--------------------------------------------------------------------------------
1 | import CheckboxGroup from '../checkbox/src/checkbox-group.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | CheckboxGroup.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('CheckboxGroup', { prefix: options.prefix }), CheckboxGroup)
6 | }
7 |
8 | export default CheckboxGroup
9 |
--------------------------------------------------------------------------------
/packages/element-ui/checkbox/index.js:
--------------------------------------------------------------------------------
1 | import Checkbox from './src/checkbox.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Checkbox.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('Checkbox', { prefix: options.prefix }), Checkbox)
6 | }
7 |
8 | export default Checkbox
9 |
--------------------------------------------------------------------------------
/packages/element-ui/checkbox/src/checkbox-button.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
20 |
--------------------------------------------------------------------------------
/packages/element-ui/checkbox/src/checkbox-group.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
19 |
--------------------------------------------------------------------------------
/packages/element-ui/checkbox/src/checkbox.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
17 |
18 | {{ label }}
19 |
20 |
21 |
22 |
23 |
24 |
25 |
56 |
--------------------------------------------------------------------------------
/packages/element-ui/date-picker/index.js:
--------------------------------------------------------------------------------
1 | import DatePicker from './src/date-picker.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | DatePicker.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('datePicker', { prefix: options.prefix }), DatePicker)
6 | }
7 |
8 | export default DatePicker
9 |
--------------------------------------------------------------------------------
/packages/element-ui/date-picker/src/date-picker.vue:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
65 |
--------------------------------------------------------------------------------
/packages/element-ui/dialog/index.js:
--------------------------------------------------------------------------------
1 | import Dialog from './src/dialog.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Dialog.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('Dialog', { prefix: options.prefix }), Dialog)
6 | }
7 |
8 | export default Dialog
9 |
--------------------------------------------------------------------------------
/packages/element-ui/dialog/src/dialog.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
36 |
--------------------------------------------------------------------------------
/packages/element-ui/drawer/index.js:
--------------------------------------------------------------------------------
1 | import Drawer from './src/drawer.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Drawer.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('Drawer', { prefix: options.prefix }), Drawer)
6 | }
7 |
8 | export default Drawer
9 |
--------------------------------------------------------------------------------
/packages/element-ui/drawer/src/drawer.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
33 |
--------------------------------------------------------------------------------
/packages/element-ui/empty/index.js:
--------------------------------------------------------------------------------
1 | import Empty from './src/empty.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Empty.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('Empty', { prefix: options.prefix }), Empty)
6 | }
7 |
8 | export default Empty
9 |
--------------------------------------------------------------------------------
/packages/element-ui/empty/src/empty.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
{{ emptyDescription }}
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
53 |
--------------------------------------------------------------------------------
/packages/element-ui/form-item/index.js:
--------------------------------------------------------------------------------
1 | import FormItem from '../form/src/form-item.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | FormItem.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('FormItem', { prefix: options.prefix }), FormItem)
6 | }
7 |
8 | export default FormItem
9 |
--------------------------------------------------------------------------------
/packages/element-ui/form/index.js:
--------------------------------------------------------------------------------
1 | import Form from './src/form.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Form.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('Form', { prefix: options.prefix }), Form)
6 | }
7 |
8 | export default Form
9 |
--------------------------------------------------------------------------------
/packages/element-ui/form/src/form-item.vue:
--------------------------------------------------------------------------------
1 |
2 |
8 | {{ label }}
9 |
10 |
11 |
12 |
13 |
14 |
40 |
--------------------------------------------------------------------------------
/packages/element-ui/form/src/form.vue:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
12 |
50 |
--------------------------------------------------------------------------------
/packages/element-ui/icon/index.js:
--------------------------------------------------------------------------------
1 | import Icon from './src/icon.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Icon.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('icon', { prefix: options.prefix }), Icon)
6 | }
7 |
8 | export default Icon
9 |
--------------------------------------------------------------------------------
/packages/element-ui/icon/src/icon.vue:
--------------------------------------------------------------------------------
1 |
59 |
--------------------------------------------------------------------------------
/packages/element-ui/input/index.js:
--------------------------------------------------------------------------------
1 | import Input from './src/input.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Input.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('Input', { prefix: options.prefix }), Input)
6 | }
7 |
8 | export default Input
9 |
--------------------------------------------------------------------------------
/packages/element-ui/input/src/input.vue:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
58 |
--------------------------------------------------------------------------------
/packages/element-ui/pagination/index.js:
--------------------------------------------------------------------------------
1 | import Pagination from './src/pagination.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Pagination.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('Pagination', { prefix: options.prefix }), Pagination)
6 | }
7 |
8 | export default Pagination
9 |
--------------------------------------------------------------------------------
/packages/element-ui/pagination/src/pagination.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
14 |
15 |
16 |
17 |
71 |
--------------------------------------------------------------------------------
/packages/element-ui/popconfirm/index.js:
--------------------------------------------------------------------------------
1 | import Popconfirm from './src/popconfirm.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Popconfirm.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('Popconfirm', { prefix: options.prefix }), Popconfirm)
6 | }
7 |
8 | export default Popconfirm
9 |
--------------------------------------------------------------------------------
/packages/element-ui/popconfirm/src/popconfirm.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
22 |
--------------------------------------------------------------------------------
/packages/element-ui/popover/index.js:
--------------------------------------------------------------------------------
1 | import Popover from './src/popover.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Popover.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('Popover', { prefix: options.prefix }), Popover)
6 | }
7 |
8 | export default Popover
9 |
--------------------------------------------------------------------------------
/packages/element-ui/popover/src/popover.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
22 |
--------------------------------------------------------------------------------
/packages/element-ui/radio-button/index.js:
--------------------------------------------------------------------------------
1 | import RadioButton from '../radio/src/radio-button.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | RadioButton.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('RadioButton', { prefix: options.prefix }), RadioButton)
6 | }
7 |
8 | export default RadioButton
9 |
--------------------------------------------------------------------------------
/packages/element-ui/radio-group/index.js:
--------------------------------------------------------------------------------
1 | import RadioGroup from '../radio/src/radio-group.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | RadioGroup.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('RadioGroup', { prefix: options.prefix }), RadioGroup)
6 | }
7 |
8 | export default RadioGroup
9 |
--------------------------------------------------------------------------------
/packages/element-ui/radio/index.js:
--------------------------------------------------------------------------------
1 | import Radio from './src/radio.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Radio.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('Radio', { prefix: options.prefix }), Radio)
6 | }
7 |
8 | export default Radio
9 |
--------------------------------------------------------------------------------
/packages/element-ui/radio/src/radio-button.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
21 |
--------------------------------------------------------------------------------
/packages/element-ui/radio/src/radio-group.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
19 |
--------------------------------------------------------------------------------
/packages/element-ui/radio/src/radio.vue:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
13 |
30 |
--------------------------------------------------------------------------------
/packages/element-ui/select/index.js:
--------------------------------------------------------------------------------
1 | import Select from './src/select.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Select.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('Select', { prefix: options.prefix }), Select)
6 | }
7 |
8 | export default Select
9 |
--------------------------------------------------------------------------------
/packages/element-ui/table-column/index.js:
--------------------------------------------------------------------------------
1 | import TableColumn from '../table/src/column.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | TableColumn.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('TableColumn', { prefix: options.prefix }), TableColumn)
6 | }
7 |
8 | export default TableColumn
9 |
--------------------------------------------------------------------------------
/packages/element-ui/table/index.js:
--------------------------------------------------------------------------------
1 | import Table from './src/table.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Table.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('Table', { prefix: options.prefix }), Table)
6 | }
7 |
8 | export default Table
9 |
--------------------------------------------------------------------------------
/packages/element-ui/table/src/forced.jsx:
--------------------------------------------------------------------------------
1 | export default {
2 | selection: {
3 | renderHeader: (h, { store }) => {
4 | return (
5 | 0 && !store.states.isAllSelected
9 | }
10 | nativeOn-click={store.toggleAllSelection}
11 | value={store.states.isAllSelected}
12 | />
13 | )
14 | },
15 | renderCell: (h, { row, column, store, $index }) => {
16 | return (
17 | event.stopPropagation()}
19 | value={store.isSelected(row)}
20 | disabled={
21 | column.selectable
22 | ? !column.selectable.call(null, row, $index)
23 | : false
24 | }
25 | on-input={() => {
26 | store.commit('rowSelectedChanged', row)
27 | }}
28 | />
29 | )
30 | },
31 | sortable: false,
32 | resizable: false
33 | },
34 | index: {
35 | renderHeader: (h, scope) => {
36 | return {scope.column.label || '#'}
37 | },
38 | renderCell: (h, { $index, column }) => {
39 | let i = $index + 1
40 | const index = column.index
41 |
42 | if (typeof index === 'number') {
43 | i = $index + index
44 | } else if (typeof index === 'function') {
45 | i = index($index)
46 | }
47 |
48 | return {i}
49 | },
50 | sortable: false
51 | },
52 | expand: {
53 | renderHeader: (h, scope) => {
54 | return {scope.column.label || ''}
55 | },
56 | renderCell: (h, { row, store }, proxy) => {
57 | const expanded = store.states.expandRows.indexOf(row) > -1
58 | return (
59 | proxy.handleExpandClick(row, e)}
65 | >
66 |
67 |
68 | )
69 | },
70 | sortable: false,
71 | resizable: false,
72 | className: 'el-table__expand-column'
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/packages/element-ui/table/src/render.vue:
--------------------------------------------------------------------------------
1 |
2 |
15 |
--------------------------------------------------------------------------------
/packages/element-ui/tag-group/index.js:
--------------------------------------------------------------------------------
1 | import TagGroup from '../tag/src/tag-group.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | TagGroup.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('TagGroup', { prefix: options.prefix }), TagGroup)
6 | }
7 |
8 | export default TagGroup
9 |
--------------------------------------------------------------------------------
/packages/element-ui/tag/index.js:
--------------------------------------------------------------------------------
1 | import Tag from './src/tag.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Tag.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('tag', { prefix: options.prefix }), Tag)
6 | }
7 |
8 | export default Tag
9 |
--------------------------------------------------------------------------------
/packages/element-ui/tag/src/tag-group.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | {{ title }}
7 |
8 |
9 |
10 |
17 | {{ item }}
18 |
19 |
20 |
21 |
22 |
68 |
--------------------------------------------------------------------------------
/packages/element-ui/tag/src/tag.vue:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
12 |
13 |
40 |
--------------------------------------------------------------------------------
/packages/element-ui/time-picker/index.js:
--------------------------------------------------------------------------------
1 | import TimePicker from './src/time-picker.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | TimePicker.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('TimePicker', { prefix: options.prefix }), TimePicker)
6 | }
7 |
8 | export default TimePicker
9 |
--------------------------------------------------------------------------------
/packages/element-ui/time-picker/src/time-picker.vue:
--------------------------------------------------------------------------------
1 |
2 |
13 |
24 |
25 |
26 |
64 |
--------------------------------------------------------------------------------
/packages/element-ui/tooltip/index.js:
--------------------------------------------------------------------------------
1 | import Tooltip from './src/tooltip.vue'
2 | import { createNamespace } from '../../../src/utils/use-namespace.js'
3 |
4 | Tooltip.install = (Vue, options = {}) => {
5 | Vue.component(createNamespace('Tooltip', { prefix: options.prefix }), Tooltip)
6 | }
7 |
8 | export default Tooltip
9 |
--------------------------------------------------------------------------------
/packages/element-ui/tooltip/src/tooltip.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
22 |
--------------------------------------------------------------------------------
/play/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/play/components.d.ts:
--------------------------------------------------------------------------------
1 | // generated by unplugin-vue-components
2 | // We suggest you to commit this file into source control
3 | // Read more: https://github.com/vuejs/core/pull/3399
4 | import '@vue/runtime-core'
5 |
6 | export {}
7 |
8 | declare module '@vue/runtime-core' {
9 | export interface GlobalComponents {
10 | RouterLink: typeof import('vue-router')['RouterLink']
11 | RouterView: typeof import('vue-router')['RouterView']
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/play/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Vite App
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/play/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "play",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "preview": "vite preview"
10 | },
11 | "devDependencies": {
12 | "@vitejs/plugin-legacy": "^2.0.0",
13 | "@vitejs/plugin-vue2": "^1.1.2",
14 | "@vitejs/plugin-vue2-jsx": "^1.0.3",
15 | "unplugin-vue-components": "^0.21.2",
16 | "vite": "^3.0.0"
17 | },
18 | "dependencies": {
19 | "@types/node": "^18.7.2",
20 | "douluo-ui": "file:douluo-ui-1.0.4.tgz",
21 | "element-ui": "^2.15.9",
22 | "vue": "^2.7.8"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/play/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
hello
4 |
斗罗 ZUI
5 |
8 |
9 |
10 |
11 |
12 |
35 |
--------------------------------------------------------------------------------
/play/src/main.js:
--------------------------------------------------------------------------------
1 | // main.js
2 | import Vue from 'vue'
3 | import App from './App.vue'
4 |
5 | import ElementUI from 'element-ui'
6 | import 'element-ui/lib/theme-chalk/index.css'
7 |
8 | // 这是本地组件测试的包
9 | import Button from 'douluo-ui/lib/button'
10 | import 'douluo-ui/lib/theme/index.css'
11 |
12 | // import DouluoUI from '../../src/index'
13 | // import '../../styles/src/index.scss'
14 | // import '../../lib/theme/index.css'
15 |
16 | Vue.use(ElementUI)
17 | Vue.use(Button)
18 | console.log(Button)
19 |
20 | // DouluoUI.updateUITheme({
21 | // primaryColor: '#FFAA00',
22 | // primarySecondColor: '#231909'
23 | // })
24 |
25 | new Vue({
26 | el: '#app',
27 | render: (h) => h(App)
28 | }).$mount()
29 |
--------------------------------------------------------------------------------
/play/vite.config.js:
--------------------------------------------------------------------------------
1 |
2 | // https://github.com/antfu/unplugin-vue-components 组件按需引入插件
3 | import Components from 'unplugin-vue-components/vite'
4 | import { ElementUiResolver } from 'unplugin-vue-components/resolvers'
5 | // 兼容 IE
6 | import legacy from '@vitejs/plugin-legacy'
7 | // 分离打包
8 | import { defineConfig, splitVendorChunkPlugin } from 'vite'
9 | // 支持 Vue2
10 | import Vue from '@vitejs/plugin-vue2'
11 | import vueJsx from '@vitejs/plugin-vue2-jsx'
12 |
13 | import { resolve } from 'path'
14 |
15 | export default defineConfig({
16 | plugins: [
17 | Vue(),
18 | vueJsx(),
19 | Components({
20 | resolvers: [ElementUiResolver()],
21 | }),
22 | legacy({
23 | targets: ['defaults', 'not ie < 9'],
24 | }),
25 | splitVendorChunkPlugin(),
26 | ],
27 | resolve: {
28 | alias: {
29 | src: resolve(__dirname, '../src'),
30 | packages: resolve('../packages')
31 | }
32 | },
33 | build: {
34 | rollupOptions: {
35 | output: {
36 | manualChunks: {
37 | 'element-ui': ['element-ui'],
38 | },
39 | },
40 | },
41 | }
42 | })
43 |
--------------------------------------------------------------------------------
/prettier.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | // 单行代码的最大宽度
3 | printWidth: 120,
4 | // 指定每个缩进级别的空格数
5 | tabWidth: 2,
6 | // 使用制表符 (tab) 缩进
7 | useTabs: false,
8 | // 在语句末尾打印分号
9 | semi: false,
10 | // 多行时尽可能打印尾随逗号
11 | trailingComma: 'none',
12 | // 使用单引号而不是双引号
13 | singleQuote: true,
14 | // 在对象文字中打印括号之间的空格
15 | bracketSpacing: true,
16 | // 将 > 多行 JSX 元素放在最后一行的末尾,而不是单独放在下一行(不适用于自闭元素)。
17 | jsxBracketSameLine: false,
18 | // auto | lf | crlf | cr
19 | endOfLine: 'lf'
20 | }
21 |
--------------------------------------------------------------------------------
/scripts/docs.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | # 确保脚本抛出遇到的错误
4 | set -e
5 |
6 | # 生成静态文件
7 | npm run docs:build
8 |
9 | # 进入生成的文件夹
10 | cd docs/.vuepress/dist
11 |
12 | # 如果是发布到自定义域名
13 | # echo 'www.example.com' > CNAME
14 |
15 | git init
16 | git add -A
17 | git commit -m 'deploy'
18 |
19 | # 如果发布到 https://.github.io
20 | # git push -f git@github.com:/.github.io.git master
21 |
22 | # 如果发布到 https://.github.io/
23 | git push -f git@github.com:JefferyXZF/douluo-ui.git master:gh-pages
24 |
25 | cd -
26 |
--------------------------------------------------------------------------------
/src/images/default-hospital.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebJeffery/douluo-ui/6c83bdeb013e15083b6474dfcece7a0417dc9904/src/images/default-hospital.png
--------------------------------------------------------------------------------
/src/images/default_dep.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebJeffery/douluo-ui/6c83bdeb013e15083b6474dfcece7a0417dc9904/src/images/default_dep.png
--------------------------------------------------------------------------------
/src/images/default_doctor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebJeffery/douluo-ui/6c83bdeb013e15083b6474dfcece7a0417dc9904/src/images/default_doctor.png
--------------------------------------------------------------------------------
/src/images/default_user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebJeffery/douluo-ui/6c83bdeb013e15083b6474dfcece7a0417dc9904/src/images/default_user.png
--------------------------------------------------------------------------------
/src/images/empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebJeffery/douluo-ui/6c83bdeb013e15083b6474dfcece7a0417dc9904/src/images/empty.png
--------------------------------------------------------------------------------
/styles/src/element-ui/datePicker.scss:
--------------------------------------------------------------------------------
1 | @use 'sass:map';
2 |
3 | // 样式变量
4 | @use '../common/var' as *;
5 | // mixin 函数,例如:b(),e(),m()
6 | @use '../mixins/mixins' as *;
7 | // 工具方法 clearfix vertical-center ellipsis
8 | @use '../mixins/utils' as *;
9 | // set-css-var-value set-component-css-var css 变量方法
10 | @use '../mixins/var' as *;
11 |
12 | // 创建组件 css 变量
13 | @include b(date-picker) {
14 | @include set-component-css-var('date-picker', $datepicker);
15 | }
16 |
--------------------------------------------------------------------------------
/styles/src/element-ui/dialog.scss:
--------------------------------------------------------------------------------
1 | @use 'sass:map';
2 |
3 | // 样式变量
4 | @use '../common/var' as *;
5 | // el 命名空间
6 | @use '../mixins/config' as *;
7 | // mixin 函数,例如:b(),e(),m()
8 | @use '../mixins/mixins' as *;
9 | // set-css-var-value set-component-css-var css 变量方法
10 | @use '../mixins/var' as *;
11 |
12 | // 创建组件 css 变量
13 | @include b(dialog) {
14 | @include set-component-css-var('dialog', $dialog);
15 | }
16 |
17 | @include b(dialog) {
18 |
19 | .el-dialog__title {
20 | color: getCssVar('text-color', 'primary');
21 | }
22 | .el-dialog__body {
23 | color: getCssVar('text-color', 'regular');
24 | }
25 | .el-dialog__close {
26 | color: getCssVar('text-color', 'secondary');
27 |
28 | &:focus,
29 | &:hover {
30 | color: getCssVar('color', 'primary');
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/styles/src/element-ui/drawer.scss:
--------------------------------------------------------------------------------
1 | @use 'sass:map';
2 |
3 | // 样式变量
4 | @use '../common/var' as *;
5 | // el 命名空间
6 | @use '../mixins/config' as *;
7 | // mixin 函数,例如:b(),e(),m()
8 | @use '../mixins/mixins' as *;
9 | // set-css-var-value set-component-css-var css 变量方法
10 | @use '../mixins/var' as *;
11 |
12 | // 创建组件 css 变量
13 | @include b(drawer) {
14 | @include set-component-css-var('drawer', $drawer);
15 | }
16 |
17 | @include b(drawer) {
18 |
19 | .el-drawer__header {
20 | color: getCssVar('text-color', 'primary');
21 | }
22 | .el-drawer__body {
23 | color: getCssVar('text-color', 'regular');
24 | padding: getCssVar('drawer', 'body-padding');
25 | }
26 | .el-dialog__close {
27 | color: getCssVar('text-color', 'secondary');
28 |
29 | &:focus,
30 | &:hover {
31 | color: getCssVar('color', 'primary');
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/styles/src/element-ui/empty.scss:
--------------------------------------------------------------------------------
1 | @use 'sass:map';
2 |
3 | // 样式变量
4 | @use '../common/var' as *;
5 | // el 命名空间
6 | @use '../mixins/config' as *;
7 | // mixin 函数,例如:b(),e(),m()
8 | @use '../mixins/mixins' as *;
9 | // set-css-var-value set-component-css-var css 变量方法
10 | @use '../mixins/var' as *;
11 |
12 | // 创建组件 css 变量
13 | @include b(empty) {
14 | @include set-component-css-var('empty', $empty);
15 |
16 | display: flex;
17 | justify-content: center;
18 | align-items: center;
19 | flex-direction: column;
20 | text-align: center;
21 | box-sizing: border-box;
22 | padding: getCssVar('empty-padding');
23 |
24 | @include e(image) {
25 | width: getCssVar('empty-image-width');
26 |
27 | img {
28 | user-select: none;
29 | width: 100%;
30 | height: 100%;
31 | vertical-align: top;
32 | object-fit: contain;
33 | }
34 | }
35 |
36 | @include e(description) {
37 | margin: getCssVar('empty-description-margin');
38 |
39 | p {
40 | margin: 0;
41 | font-size: getCssVar('font-size', 'base');
42 | color: getCssVar('text-color', 'secondary');
43 | line-height: map.get($line-height, 'default'),
44 | }
45 | }
46 |
47 | @include e(bottom) {
48 | margin-top: getCssVar('empty-bottom-margin-top');
49 | }
50 | }
51 |
52 |
--------------------------------------------------------------------------------
/styles/src/element-ui/icon.scss:
--------------------------------------------------------------------------------
1 | @use 'sass:map';
2 |
3 | // 样式变量
4 | @use '../common/var' as *;
5 | // el 命名空间
6 | @use '../mixins/config' as *;
7 | // mixin 函数,例如:b(),e(),m()
8 | @use '../mixins/mixins' as *;
9 | // set-css-var-value set-component-css-var css 变量方法
10 | @use '../mixins/var' as *;
11 |
12 | // 创建组件 css 变量
13 | // @include b(icon) {
14 | // @include set-component-css-var('icon', $icon);
15 | // }
16 |
17 | @include b(icon) {
18 | display: inline-block;
19 | transition: all 0.1s cubic-bezier(1, 0.5, 0.8, 1);
20 | }
21 |
--------------------------------------------------------------------------------
/styles/src/element-ui/pagination.scss:
--------------------------------------------------------------------------------
1 | @use 'sass:map';
2 |
3 | // 样式变量
4 | @use '../common/var' as *;
5 | // el 命名空间
6 | @use '../mixins/config' as *;
7 | // mixin 函数,例如:b(),e(),m()
8 | @use '../mixins/mixins' as *;
9 | // set-css-var-value set-component-css-var css 变量方法
10 | @use '../mixins/var' as *;
11 |
12 | // 创建组件 css 变量
13 | @include b(pagination) {
14 | @include set-component-css-var('pagination', $pagination);
15 |
16 | display: flex;
17 | justify-content: flex-end;
18 | align-items: center;
19 |
20 | .el-pagination {
21 | padding: getCssVar('pagination-padding');
22 |
23 | .el-pagination__total,
24 | &.is-background .btn-prev,
25 | .el-pager .number,
26 | &.is-background .btn-quicknext,
27 | &.is-background .btn-next,
28 | .el-pagination__jump,
29 | .el-pagination__editor,
30 | .el-pagination__jump .el-input__inner {
31 | font-size: getCssVar('pagination-font-size');;
32 | color: getCssVar('pagination-text-color');
33 | height: getCssVar('pagination-height');
34 | line-height: getCssVar('pagination-line-height');
35 | border-radius: getCssVar('pagination-border-radius');
36 | }
37 |
38 | .el-pagination__jump {
39 | margin-left: 15px;
40 | }
41 |
42 | &.is-background .btn-prev,
43 | &.is-background .btn-next {
44 | &:disabled {
45 | color: #ccc;
46 | }
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/styles/src/element-ui/popover.scss:
--------------------------------------------------------------------------------
1 | @use 'sass:map';
2 |
3 | // 样式变量
4 | @use '../common/var' as *;
5 | // el 命名空间
6 | @use '../mixins/config' as *;
7 | // mixin 函数,例如:b(),e(),m()
8 | @use '../mixins/mixins' as *;
9 | // set-css-var-value set-component-css-var css 变量方法
10 | @use '../mixins/var' as *;
11 |
12 | // 创建组件 css 变量
13 | @include b(popover) {
14 | @include set-component-css-var('popover', $popover);
15 | }
16 |
17 | @include b(popover) {
18 |
19 | }
20 |
21 | .el-popper {
22 | .dl-button {
23 | min-width: 0;
24 | min-height: 0;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/styles/src/element-ui/radio-group.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebJeffery/douluo-ui/6c83bdeb013e15083b6474dfcece7a0417dc9904/styles/src/element-ui/radio-group.scss
--------------------------------------------------------------------------------
/styles/src/element-ui/tag-group.scss:
--------------------------------------------------------------------------------
1 | @use 'sass:map';
2 |
3 | // 样式变量
4 | @use '../common/var' as *;
5 | // el 命名空间
6 | @use '../mixins/config' as *;
7 | // mixin 函数,例如:b(),e(),m()
8 | @use '../mixins/mixins' as *;
9 | // set-css-var-value set-component-css-var css 变量方法
10 | @use '../mixins/var' as *;
11 |
12 | // 创建组件 css 变量
13 | @include b(tag-group) {
14 | @include set-component-css-var('tag-group', $tag);
15 | }
16 |
17 | @include b(tag-group) {
18 | @include m(button) {
19 | display: inline-block;
20 | box-sizing: border-box;
21 | padding: 0 24px;
22 | min-width: 120px;
23 | height: 40px;
24 | line-height: 40px;
25 | text-align: center;
26 | border-radius: 4px;
27 | border: 1px dashed getCssVar('border-color-input'),;
28 | font-size: 14px;
29 | color: getCssVar('text-color-secondary');
30 | cursor: pointer;
31 | &:hover{
32 | border: 1px dashed getCssVar('color','primary');
33 | }
34 | @include when(select) {
35 | border: 1px dashed getCssVar('color','primary');
36 | }
37 | @include when(disabled) {
38 | background-color:getCssVar('bg-color-light');
39 | color:getCssVar('text-color-disabled');
40 | cursor: not-allowed;
41 | &:hover{
42 | border: 1px dashed getCssVar('border-color-input'),;
43 | }
44 | @include when(select) {
45 | border: 1px dashed getCssVar('border-color-input'),;
46 | }
47 | }
48 | }
49 | .el-tag:not(:last-child){
50 | margin-right: 20px;
51 | }
52 | .dl-tag-group--title{
53 | margin-left: 3px
54 | }
55 | .dl-tag-group--tag-list{
56 | margin-top: 10px;
57 | }
58 | }
--------------------------------------------------------------------------------
/styles/src/element-ui/tag.scss:
--------------------------------------------------------------------------------
1 | @use 'sass:map';
2 |
3 | // 样式变量
4 | @use '../common/var' as *;
5 | // el 命名空间
6 | @use '../mixins/config' as *;
7 | // mixin 函数,例如:b(),e(),m()
8 | @use '../mixins/mixins' as *;
9 | // set-css-var-value set-component-css-var css 变量方法
10 | @use '../mixins/var' as *;
11 |
12 | // 创建组件 css 变量
13 | @include b(tag) {
14 | @include set-component-css-var('tag', $tag);
15 | }
16 |
17 | @include b(tag, true) {
18 | @each $type in (primary, success, warning, error) {
19 | border: none;
20 | @at-root {
21 | @include m($type) {
22 | background-color:getCssVar('color',$type,'light-9');
23 | color:getCssVar('color',$type);
24 | @include when(disabled) {
25 | background-color:getCssVar('bg-color-light');
26 | color:getCssVar('text-color-disabled');
27 | cursor: not-allowed;
28 | .el-tag__close{
29 | cursor: not-allowed;
30 | color: getCssVar('text-color-disabled');
31 | &:hover{
32 | background-color: getCssVar('bg-color-light');
33 | }
34 | }
35 | }
36 | }
37 | }
38 | .el-tag__close{
39 | color: getCssVar('color','primary');
40 | &:hover{
41 | background-color: getCssVar('color','primary');
42 | color: #fff;
43 | }
44 | }
45 | }
46 | }
--------------------------------------------------------------------------------
/styles/src/element-ui/time-picker.scss:
--------------------------------------------------------------------------------
1 | @use 'sass:map';
2 |
3 | // 样式变量
4 | @use '../common/var' as *;
5 | // mixin 函数,例如:b(),e(),m()
6 | @use '../mixins/mixins' as *;
7 | // 工具方法 clearfix vertical-center ellipsis
8 | @use '../mixins/utils' as *;
9 | // set-css-var-value set-component-css-var css 变量方法
10 | @use '../mixins/var' as *;
11 |
12 | @include b(date-editor) {
13 | @include set-component-css-var('date-editor', $date-editor);
14 | }
15 |
16 | @include b(date-editor, true) {
17 | .el-input__icon {
18 | font-size: getCssVar('date-editor', 'icon-size');
19 | }
20 | &:not(.is-disabled):hover {
21 | border-color: getCssVar('date-editor', 'border-color');
22 | .el-icon-time {
23 | color: getCssVar('date-editor', 'icon-color');
24 | }
25 | }
26 |
27 | &.el-input {
28 | width: getCssVar('date-editor', 'width');
29 | }
30 | &.el-range-editor {
31 | width: getCssVar('date-editor', 'range-width');
32 | }
33 | .el-input__inner, .el-range-input {
34 | width: getCssVar('date-editor', 'width');
35 | text-align: center;
36 | color: getCssVar('date-editor', 'text-color');
37 | &:not(:disabled):hover {
38 | border-color: getCssVar('date-editor', 'border-color');
39 | }
40 | &:disabled {
41 | color: getCssVar('date-editor', 'disabled-color');
42 | }
43 | &::-webkit-input-placeholder {
44 | text-align: center;
45 | color: getCssVar('date-editor', 'placeholder-color');
46 | }
47 | }
48 | }
49 |
50 | .el-picker-panel {
51 | .el-picker-panel__content {
52 | .time-select-item:hover {
53 | color: getCssVar('color-primary');
54 | background-color: getCssVar( 'color-primary-light-9');
55 | font-weight: getCssVar('font-weight-primary');
56 | }
57 | }
58 | }
59 |
60 | .el-time-panel, .el-picker-panel {
61 | .el-time-panel__content {
62 | .el-time-spinner__wrapper {
63 | .el-time-spinner__item {
64 | color: getCssVar('text-color-regular');
65 | &.active {
66 | color: getCssVar('color-primary');
67 | background-color: getCssVar('color-primary-light-9');
68 | }
69 | }
70 | }
71 | &::before, &::after {
72 | border-top: transparent;
73 | border-bottom: transparent;
74 | }
75 | }
76 | }
77 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/styles/src/element-ui/tooltip.scss:
--------------------------------------------------------------------------------
1 | @use 'sass:map';
2 |
3 | // 样式变量
4 | @use '../common/var' as *;
5 | // el 命名空间
6 | @use '../mixins/config' as *;
7 | // mixin 函数,例如:b(),e(),m()
8 | @use '../mixins/mixins' as *;
9 | // set-css-var-value set-component-css-var css 变量方法
10 | @use '../mixins/var' as *;
11 |
12 | // 创建组件 css 变量
13 | // @include b(tooltip) {
14 | // @include set-component-css-var('tooltip', $tooltip);
15 | // }
16 |
17 | // @include b(tooltip) {
18 |
19 | // }
20 |
--------------------------------------------------------------------------------
/styles/src/fonts/iconfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebJeffery/douluo-ui/6c83bdeb013e15083b6474dfcece7a0417dc9904/styles/src/fonts/iconfont.ttf
--------------------------------------------------------------------------------
/styles/src/fonts/iconfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebJeffery/douluo-ui/6c83bdeb013e15083b6474dfcece7a0417dc9904/styles/src/fonts/iconfont.woff
--------------------------------------------------------------------------------
/styles/src/iconfont.scss:
--------------------------------------------------------------------------------
1 | @use 'common/var' as *;
2 |
3 | @font-face {
4 | font-family: "douluo-icons";
5 | src: url('./fonts/iconfont.woff?t=1662431203509') format('woff'),
6 | url('./fonts/iconfont.ttf?t=1662431203509') format('truetype');
7 | }
8 |
9 | [class^="dl-icon-"], [class*=" dl-icon-"] {
10 | /* use !important to prevent issues with browser extensions that change fonts */
11 | font-family: "douluo-icons" !important;
12 | speak: none;
13 | font-style: normal;
14 | font-weight: normal;
15 | font-variant: normal;
16 | text-transform: none;
17 | line-height: 1;
18 | vertical-align: baseline;
19 | display: inline-block;
20 |
21 | /* Better Font Rendering =========== */
22 | -webkit-font-smoothing: antialiased;
23 | -moz-osx-font-smoothing: grayscale;
24 | }
25 |
26 |
27 | .dl-icon-add:before {
28 | content: "\e608";
29 | }
30 |
31 | .dl-icon-close:before {
32 | content: "\e607";
33 | }
34 |
35 | .dl-icon-warning:before {
36 | content: "\e606";
37 | }
38 |
39 | .dl-icon-info:before {
40 | content: "\e675";
41 | }
42 |
43 | .dl-icon-lock:before {
44 | content: "\e604";
45 | }
46 |
47 | .dl-icon-check:before {
48 | content: "\e663";
49 | }
50 |
51 | .dl-icon-success:before {
52 | content: "\e603";
53 | }
54 |
55 | .dl-icon-error:before {
56 | content: "\e601";
57 | }
58 |
59 | .dl-icon-help:before {
60 | content: "\e662";
61 | }
62 |
63 | .dl-icon-reflesh:before {
64 | content: "\e628";
65 | }
66 |
67 | .dl-icon-setting:before {
68 | content: "\e639";
69 | }
70 |
71 | .dl-icon-pass:before {
72 | content: "\e65a";
73 | }
74 |
75 | .dl-icon-delete:before {
76 | content: "\e605";
77 | }
78 |
79 | .dl-icon-star:before {
80 | content: "\e617";
81 | }
82 |
83 | .dl-icon-yanjing:before {
84 | content: "\e61a";
85 | }
86 |
87 | .dl-icon-right:before {
88 | content: "\e621";
89 | }
90 |
91 | .dl-icon-left:before {
92 | content: "\e622";
93 | }
94 |
95 | .dl-icon-review:before {
96 | content: "\e674";
97 | }
--------------------------------------------------------------------------------
/styles/src/index.scss:
--------------------------------------------------------------------------------
1 | @use 'var.scss';
2 | @use 'iconfont.scss';
3 |
4 | @use 'element-ui/button.scss';
5 | @use 'element-ui/icon.scss';
6 | @use 'element-ui/datePicker.scss';
7 | @use 'element-ui/radio.scss';
8 | @use 'element-ui/radio-button.scss';
9 | @use 'element-ui/checkbox.scss';
10 | @use 'element-ui/checkbox-button.scss';
11 | @use 'element-ui/input.scss';
12 | @use 'element-ui/table.scss';
13 | @use 'element-ui/empty.scss';
14 | @use 'element-ui/pagination.scss';
15 | @use 'element-ui/dialog.scss';
16 | @use 'element-ui/drawer.scss';
17 | @use 'element-ui/popover.scss';
18 | @use 'element-ui/select.scss';
19 | @use 'element-ui/tag.scss';
20 | @use 'element-ui/tag-group.scss';
21 |
22 |
--------------------------------------------------------------------------------
/styles/src/mixins/_var.scss:
--------------------------------------------------------------------------------
1 | @use 'sass:map';
2 |
3 | @use 'config';
4 | @use 'function' as *;
5 | @use '../common/var' as *;
6 |
7 | // set css var value, because we need translate value to string
8 | // for example:
9 | // @include set-css-var-value(('color', 'primary'), red);
10 | // --el-color-primary: red;
11 | @mixin set-css-var-value($name, $value) {
12 | #{joinVarName($name)}: #{$value};
13 | }
14 |
15 | // @include set-css-var-type('color', 'primary', $map);
16 | // --el-color-primary: #{map.get($map, 'primary')};
17 | @mixin set-css-var-type($name, $type, $variables) {
18 | #{getCssVarName($name, $type)}: #{map.get($variables, $type)};
19 | }
20 |
21 | @mixin set-css-color-type($colors, $type) {
22 | @include set-css-var-value(('color', $type), map.get($colors, $type, 'base'));
23 |
24 | @each $i in (3, 5, 7, 8, 9) {
25 | @include set-css-var-value(
26 | ('color', $type, 'light', $i),
27 | map.get($colors, $type, 'light-#{$i}')
28 | );
29 | }
30 |
31 | @include set-css-var-value(
32 | ('color', $type, 'dark-2'),
33 | map.get($colors, $type, 'dark-2')
34 | );
35 | }
36 |
37 | // set all css var for component by map
38 | @mixin set-component-css-var($name, $variables) {
39 | @each $attribute, $value in $variables {
40 | @if $attribute == 'default' {
41 | #{getCssVarName($name)}: #{$value};
42 | } @else {
43 | #{getCssVarName($name, $attribute)}: #{$value};
44 | }
45 | }
46 | }
47 |
48 | @mixin set-css-color-rgb($type) {
49 | $color: map.get($colors, $type, 'base');
50 | @include set-css-var-value(
51 | ('color', $type, 'rgb'),
52 | #{red($color),
53 | green($color),
54 | blue($color)}
55 | );
56 | }
57 |
58 | // generate css var from existing css var
59 | // for example:
60 | // @include css-var-from-global(('button', 'text-color'), ('color', $type))
61 | // --el-button-text-color: var(--el-color-#{$type});
62 | @mixin css-var-from-global($var, $gVar) {
63 | $varName: joinVarName($var);
64 | $gVarName: joinVarName($gVar);
65 | #{$varName}: var(#{$gVarName});
66 | }
67 |
--------------------------------------------------------------------------------
/styles/src/mixins/config.scss:
--------------------------------------------------------------------------------
1 | $namespace: 'dl' !default;
2 | $el-namespace: 'el' !default;
3 | $common-separator: '-' !default;
4 | $element-separator: '__' !default;
5 | $modifier-separator: '--' !default;
6 | $state-prefix: 'is-' !default;
7 |
--------------------------------------------------------------------------------
/styles/src/mixins/utils.scss:
--------------------------------------------------------------------------------
1 | @mixin utils-clearfix {
2 | $selector: &;
3 |
4 | @at-root {
5 | #{$selector}::before,
6 | #{$selector}::after {
7 | display: table;
8 | content: '';
9 | }
10 | #{$selector}::after {
11 | clear: both;
12 | }
13 | }
14 | }
15 |
16 | @mixin utils-vertical-center {
17 | $selector: &;
18 |
19 | @at-root {
20 | #{$selector}::after {
21 | display: inline-block;
22 | content: '';
23 | height: 100%;
24 | vertical-align: middle;
25 | }
26 | }
27 | }
28 |
29 | @mixin utils-ellipsis {
30 | overflow: hidden;
31 | text-overflow: ellipsis;
32 | white-space: nowrap;
33 | }
34 |
35 | @mixin utils-inline-flex-center {
36 | display: inline-flex;
37 | justify-content: center;
38 | align-items: center;
39 | }
40 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 |
2 | // https://github.com/antfu/unplugin-vue-components 组件按需引入插件
3 | import Components from 'unplugin-vue-components/vite'
4 | import { ElementUiResolver } from 'unplugin-vue-components/resolvers'
5 | // 兼容 IE
6 | import legacy from '@vitejs/plugin-legacy'
7 | // 分离打包
8 | import { defineConfig, splitVendorChunkPlugin } from 'vite'
9 | // 支持 Vue2
10 | import Vue from '@vitejs/plugin-vue2'
11 | import vueJsx from '@vitejs/plugin-vue2-jsx'
12 |
13 | import { resolve } from 'path'
14 |
15 | export default defineConfig({
16 | plugins: [
17 | Vue(),
18 | vueJsx(),
19 | Components({
20 | resolvers: [ElementUiResolver()],
21 | }),
22 | legacy({
23 | targets: ['defaults', 'not ie < 9'],
24 | }),
25 | splitVendorChunkPlugin(),
26 | ],
27 | resolve: {
28 | alias: {
29 | '@': resolve(__dirname, './examples/src'),
30 | src: resolve(__dirname, './src'),
31 | packages: resolve('./packages'),
32 | examples: resolve('./examples'),
33 | }
34 | },
35 | build: {
36 | rollupOptions: {
37 | output: {
38 | manualChunks: {
39 | 'element-ui': ['element-ui'],
40 | },
41 | },
42 | },
43 | }
44 | })
45 |
--------------------------------------------------------------------------------