Showing
58 changed files
with
3957 additions
and
0 deletions
Too many changes to show.
To preserve performance only 58 of 709 files are displayed.
.editorconfig
0 → 100644
1 | +root = true | |
2 | + | |
3 | +[*] | |
4 | +charset=utf-8 | |
5 | +end_of_line=lf | |
6 | +insert_final_newline=true | |
7 | +indent_style=space | |
8 | +indent_size=2 | |
9 | +max_line_length = 100 | |
10 | + | |
11 | +[*.{yml,yaml,json}] | |
12 | +indent_style = space | |
13 | +indent_size = 2 | |
14 | + | |
15 | +[*.md] | |
16 | +trim_trailing_whitespace = false | |
17 | + | |
18 | +[Makefile] | |
19 | +indent_style = tab | ... | ... |
.env
0 → 100644
.env.development
0 → 100644
1 | +# Whether to open mock | |
2 | +VITE_USE_MOCK = false | |
3 | + | |
4 | +# public path | |
5 | +VITE_PUBLIC_PATH = / | |
6 | + | |
7 | +# Cross-domain proxy, you can configure multiple | |
8 | +# Please note that no line breaks | |
9 | +VITE_PROXY = [["/api","http://localhost:8082/api"],["/upload","http://localhost:3300/upload"]] | |
10 | +# VITE_PROXY=[["/api","https://vvbin.cn/test"]] | |
11 | + | |
12 | +# Delete console | |
13 | +VITE_DROP_CONSOLE = false | |
14 | + | |
15 | +# Basic interface address SPA | |
16 | +VITE_GLOB_API_URL=/api | |
17 | + | |
18 | +# File upload address, optional | |
19 | +VITE_GLOB_UPLOAD_URL=/upload | |
20 | + | |
21 | +# Interface prefix | |
22 | +VITE_GLOB_API_URL_PREFIX=/v1 | ... | ... |
.env.production
0 → 100644
1 | +# Whether to open mock | |
2 | +VITE_USE_MOCK = false | |
3 | + | |
4 | +# public path | |
5 | +VITE_PUBLIC_PATH = / | |
6 | + | |
7 | +# Delete console | |
8 | +VITE_DROP_CONSOLE = true | |
9 | + | |
10 | +# Whether to enable gzip or brotli compression | |
11 | +# Optional: gzip | brotli | none | |
12 | +# If you need multiple forms, you can use `,` to separate | |
13 | +VITE_BUILD_COMPRESS = 'none' | |
14 | + | |
15 | +# Whether to delete origin files when using compress, default false | |
16 | +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false | |
17 | + | |
18 | +# Basic interface address SPA | |
19 | +VITE_GLOB_API_URL=/api | |
20 | + | |
21 | +# File upload address, optional | |
22 | +# It can be forwarded by nginx or write the actual address directly | |
23 | +VITE_GLOB_UPLOAD_URL=/upload | |
24 | + | |
25 | +# Interface prefix | |
26 | +VITE_GLOB_API_URL_PREFIX=/v1 | |
27 | + | |
28 | +# Whether to enable image compression | |
29 | +VITE_USE_IMAGEMIN= true | |
30 | + | |
31 | +# use pwa | |
32 | +VITE_USE_PWA = false | |
33 | + | |
34 | +# Is it compatible with older browsers | |
35 | +VITE_LEGACY = false | ... | ... |
.env.test
0 → 100644
1 | +NODE_ENV=production | |
2 | +# Whether to open mock | |
3 | +VITE_USE_MOCK = true | |
4 | + | |
5 | +# public path | |
6 | +VITE_PUBLIC_PATH = / | |
7 | + | |
8 | +# Delete console | |
9 | +VITE_DROP_CONSOLE = true | |
10 | + | |
11 | +# Whether to enable gzip or brotli compression | |
12 | +# Optional: gzip | brotli | none | |
13 | +# If you need multiple forms, you can use `,` to separate | |
14 | +VITE_BUILD_COMPRESS = 'none' | |
15 | + | |
16 | +# Whether to delete origin files when using compress, default false | |
17 | +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false | |
18 | + | |
19 | +# Basic interface address SPA | |
20 | +VITE_GLOB_API_URL=/basic-api | |
21 | + | |
22 | +# File upload address, optional | |
23 | +# It can be forwarded by nginx or write the actual address directly | |
24 | +VITE_GLOB_UPLOAD_URL=/upload | |
25 | + | |
26 | +# Interface prefix | |
27 | +VITE_GLOB_API_URL_PREFIX= | |
28 | + | |
29 | +# Whether to enable image compression | |
30 | +VITE_USE_IMAGEMIN= true | |
31 | + | |
32 | +# use pwa | |
33 | +VITE_USE_PWA = false | |
34 | + | |
35 | +# Is it compatible with older browsers | |
36 | +VITE_LEGACY = false | ... | ... |
.eslintignore
0 → 100644
.eslintrc.js
0 → 100644
1 | +// @ts-check | |
2 | +const { defineConfig } = require('eslint-define-config'); | |
3 | +module.exports = defineConfig({ | |
4 | + root: true, | |
5 | + env: { | |
6 | + browser: true, | |
7 | + node: true, | |
8 | + es6: true, | |
9 | + }, | |
10 | + parser: 'vue-eslint-parser', | |
11 | + parserOptions: { | |
12 | + parser: '@typescript-eslint/parser', | |
13 | + ecmaVersion: 2020, | |
14 | + sourceType: 'module', | |
15 | + jsxPragma: 'React', | |
16 | + ecmaFeatures: { | |
17 | + jsx: true, | |
18 | + }, | |
19 | + }, | |
20 | + extends: [ | |
21 | + 'plugin:vue/vue3-recommended', | |
22 | + 'plugin:@typescript-eslint/recommended', | |
23 | + 'prettier', | |
24 | + 'plugin:prettier/recommended', | |
25 | + 'plugin:jest/recommended', | |
26 | + ], | |
27 | + rules: { | |
28 | + 'vue/script-setup-uses-vars': 'error', | |
29 | + '@typescript-eslint/ban-ts-ignore': 'off', | |
30 | + '@typescript-eslint/explicit-function-return-type': 'off', | |
31 | + '@typescript-eslint/no-explicit-any': 'off', | |
32 | + '@typescript-eslint/no-var-requires': 'off', | |
33 | + '@typescript-eslint/no-empty-function': 'off', | |
34 | + 'vue/custom-event-name-casing': 'off', | |
35 | + 'no-use-before-define': 'off', | |
36 | + '@typescript-eslint/no-use-before-define': 'off', | |
37 | + '@typescript-eslint/ban-ts-comment': 'off', | |
38 | + '@typescript-eslint/ban-types': 'off', | |
39 | + '@typescript-eslint/no-non-null-assertion': 'off', | |
40 | + '@typescript-eslint/explicit-module-boundary-types': 'off', | |
41 | + '@typescript-eslint/no-unused-vars': [ | |
42 | + 'error', | |
43 | + { | |
44 | + argsIgnorePattern: '^_', | |
45 | + varsIgnorePattern: '^_', | |
46 | + }, | |
47 | + ], | |
48 | + 'no-unused-vars': [ | |
49 | + 'error', | |
50 | + { | |
51 | + argsIgnorePattern: '^_', | |
52 | + varsIgnorePattern: '^_', | |
53 | + }, | |
54 | + ], | |
55 | + 'space-before-function-paren': 'off', | |
56 | + | |
57 | + 'vue/attributes-order': 'off', | |
58 | + 'vue/one-component-per-file': 'off', | |
59 | + 'vue/html-closing-bracket-newline': 'off', | |
60 | + 'vue/max-attributes-per-line': 'off', | |
61 | + 'vue/multiline-html-element-content-newline': 'off', | |
62 | + 'vue/singleline-html-element-content-newline': 'off', | |
63 | + 'vue/attribute-hyphenation': 'off', | |
64 | + 'vue/require-default-prop': 'off', | |
65 | + 'vue/html-self-closing': [ | |
66 | + 'error', | |
67 | + { | |
68 | + html: { | |
69 | + void: 'always', | |
70 | + normal: 'never', | |
71 | + component: 'always', | |
72 | + }, | |
73 | + svg: 'always', | |
74 | + math: 'always', | |
75 | + }, | |
76 | + ], | |
77 | + }, | |
78 | +}); | ... | ... |
.gitignore
0 → 100644
1 | +node_modules | |
2 | +.DS_Store | |
3 | +dist | |
4 | +.npmrc | |
5 | +.cache | |
6 | + | |
7 | +tests/server/static | |
8 | +tests/server/static/upload | |
9 | + | |
10 | +.local | |
11 | +# local env files | |
12 | +.env.local | |
13 | +.env.*.local | |
14 | +.eslintcache | |
15 | + | |
16 | +# Log files | |
17 | +npm-debug.log* | |
18 | +yarn-debug.log* | |
19 | +yarn-error.log* | |
20 | +pnpm-debug.log* | |
21 | + | |
22 | +# Editor directories and files | |
23 | +.idea | |
24 | +# .vscode | |
25 | +*.suo | |
26 | +*.ntvs* | |
27 | +*.njsproj | |
28 | +*.sln | |
29 | +*.sw? | ... | ... |
.gitpod.yml
0 → 100644
.prettierignore
0 → 100644
.stylelintignore
0 → 100644
.yarnclean
0 → 100644
1 | +# test directories | |
2 | +__tests__ | |
3 | +test | |
4 | +tests | |
5 | +powered-test | |
6 | + | |
7 | +# asset directories | |
8 | +docs | |
9 | +doc | |
10 | +website | |
11 | +images | |
12 | +assets | |
13 | + | |
14 | +# examples | |
15 | +example | |
16 | +examples | |
17 | + | |
18 | +# code coverage directories | |
19 | +coverage | |
20 | +.nyc_output | |
21 | + | |
22 | +# build scripts | |
23 | +Makefile | |
24 | +Gulpfile.js | |
25 | +Gruntfile.js | |
26 | + | |
27 | +# configs | |
28 | +appveyor.yml | |
29 | +circle.yml | |
30 | +codeship-services.yml | |
31 | +codeship-steps.yml | |
32 | +wercker.yml | |
33 | +.tern-project | |
34 | +.gitattributes | |
35 | +.editorconfig | |
36 | +.*ignore | |
37 | +.eslintrc | |
38 | +.jshintrc | |
39 | +.flowconfig | |
40 | +.documentup.json | |
41 | +.yarn-metadata.json | |
42 | +.travis.yml | |
43 | + | |
44 | +# misc | |
45 | +*.md | |
46 | + | |
47 | +!istanbul-reports/lib/html/assets | |
48 | +!istanbul-api/node_modules/istanbul-reports/lib/html/assets | ... | ... |
README.md
0 → 100644
1 | +<div align="center"> <a href="https://github.com/anncwb/vue-vben-admin"> <img alt="VbenAdmin Logo" width="200" height="200" src="https://anncwb.github.io/anncwb/images/logo.png"> </a> <br> <br> | |
2 | + | |
3 | +[](LICENSE) | |
4 | + | |
5 | +<h1>Vue vben admin</h1> | |
6 | +</div> | |
7 | + | |
8 | +**中文** | [English](./README.md) | |
9 | + | |
10 | +## 简介 | |
11 | + | |
12 | +Vue Vben Admin 是一个免费开源的中后台模版。使用了最新的`vue3`,`vite2`,`TypeScript`等主流技术开发,开箱即用的中后台前端解决方案,也可用于学习参考。 | |
13 | + | |
14 | +## 特性 | |
15 | + | |
16 | +- **最新技术栈**:使用 Vue3/vite2 等前端前沿技术开发 | |
17 | +- **TypeScript**: 应用程序级 JavaScript 的语言 | |
18 | +- **主题**:可配置的主题 | |
19 | +- **国际化**:内置完善的国际化方案 | |
20 | +- **Mock 数据** 内置 Mock 数据方案 | |
21 | +- **权限** 内置完善的动态路由权限生成方案 | |
22 | +- **组件** 二次封装了多个常用的组件 | |
23 | + | |
24 | +## 预览 | |
25 | + | |
26 | +- [vue-vben-admin](https://vvbin.cn/next/) - 完整版中文站点 | |
27 | +- [vue-vben-admin-gh-pages](https://anncwb.github.io/vue-vben-admin/) - 完整版 github 站点 | |
28 | +- [vben-admin-thin-next](https://vvbin.cn/thin/next/) - 简化版中文站点 | |
29 | +- [vben-admin-thin-gh-pages](https://anncwb.github.io/vben-admin-thin-next/) - 简化版 github 站点 | |
30 | + | |
31 | +测试账号: vben/123456 | |
32 | + | |
33 | +<p align="center"> | |
34 | + <img alt="VbenAdmin Logo" width="100%" src="https://anncwb.github.io/anncwb/images/preview1.png"> | |
35 | + <img alt="VbenAdmin Logo" width="100%" src="https://anncwb.github.io/anncwb/images/preview2.png"> | |
36 | + <img alt="VbenAdmin Logo" width="100%" src="https://anncwb.github.io/anncwb/images/preview3.png"> | |
37 | +</p> | |
38 | + | |
39 | +### 使用 Gitpod | |
40 | + | |
41 | +在 Gitpod(适用于 GitHub 的免费在线开发环境)中打开项目,并立即开始编码. | |
42 | + | |
43 | +[](https://gitpod.io/#https://github.com/anncwb/vue-vben-admin) | |
44 | + | |
45 | +## 文档 | |
46 | + | |
47 | +[文档地址](https://vvbin.cn/doc-next/) | |
48 | + | |
49 | +## 准备 | |
50 | + | |
51 | +- [node](http://nodejs.org/) 和 [git](https://git-scm.com/) -项目开发环境 | |
52 | +- [Vite](https://vitejs.dev/) - 熟悉 vite 特性 | |
53 | +- [Vue3](https://v3.vuejs.org/) - 熟悉 Vue 基础语法 | |
54 | +- [TypeScript](https://www.typescriptlang.org/) - 熟悉`TypeScript`基本语法 | |
55 | +- [Es6+](http://es6.ruanyifeng.com/) - 熟悉 es6 基本语法 | |
56 | +- [Vue-Router-Next](https://next.router.vuejs.org/) - 熟悉 vue-router 基本使用 | |
57 | +- [Ant-Design-Vue](https://2x.antdv.com/docs/vue/introduce-cn/) - ui 基本使用 | |
58 | +- [Mock.js](https://github.com/nuysoft/Mock) - mockjs 基本语法 | |
59 | + | |
60 | +## 安装使用 | |
61 | + | |
62 | +- 获取项目代码 | |
63 | + | |
64 | +```bash | |
65 | +git clone https://github.com/anncwb/vue-vben-admin.git | |
66 | +``` | |
67 | + | |
68 | +- 安装依赖 | |
69 | + | |
70 | +```bash | |
71 | +cd vue-vben-admin | |
72 | + | |
73 | +yarn install | |
74 | + | |
75 | +``` | |
76 | + | |
77 | +- 运行 | |
78 | + | |
79 | +```bash | |
80 | +yarn serve | |
81 | +``` | |
82 | + | |
83 | +- 打包 | |
84 | + | |
85 | +```bash | |
86 | +yarn build | |
87 | +``` | |
88 | + | |
89 | +## 更新日志 | |
90 | + | |
91 | +[CHANGELOG](./CHANGELOG.zh_CN.md) | |
92 | + | |
93 | +## 项目地址 | |
94 | + | |
95 | +- [vue-vben-admin](https://github.com/anncwb/vue-vben-admin) - 完整版 | |
96 | +- [vue-vben-admin-thin-next](https://github.com/anncwb/vben-admin-thin-next) - 简化版 | |
97 | + | |
98 | +## 如何贡献 | |
99 | + | |
100 | +非常欢迎你的加入 或者提交一个 Pull Request。 | |
101 | + | |
102 | +**Pull Request:** | |
103 | + | |
104 | +1. Fork 代码! | |
105 | +2. 创建自己的分支: `git checkout -b feat/xxxx` | |
106 | +3. 提交你的修改: `git commit -am 'feat(function): add xxxxx'` | |
107 | +4. 推送您的分支: `git push origin feat/xxxx` | |
108 | +5. 提交`pull request` | |
109 | + | |
110 | +## Git 贡献提交规范 | |
111 | + | |
112 | +- 参考 [vue](https://github.com/vuejs/vue/blob/dev/.github/COMMIT_CONVENTION.md) 规范 ([Angular](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular)) | |
113 | + | |
114 | + - `feat` 增加新功能 | |
115 | + - `fix` 修复问题/BUG | |
116 | + - `style` 代码风格相关无影响运行结果的 | |
117 | + - `perf` 优化/性能提升 | |
118 | + - `refactor` 重构 | |
119 | + - `revert` 撤销修改 | |
120 | + - `test` 测试相关 | |
121 | + - `docs` 文档/注释 | |
122 | + - `chore` 依赖更新/脚手架配置修改等 | |
123 | + - `workflow` 工作流改进 | |
124 | + - `ci` 持续集成 | |
125 | + - `types` 类型定义文件更改 | |
126 | + - `wip` 开发中 | |
127 | + | |
128 | +## 浏览器支持 | |
129 | + | |
130 | +本地开发推荐使用`Chrome 80+` 浏览器 | |
131 | + | |
132 | +支持现代浏览器, 不支持 IE | |
133 | + | |
134 | +| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari | | |
135 | +| :-: | :-: | :-: | :-: | :-: | | |
136 | +| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions | | |
137 | + | |
138 | +## 相关仓库 | |
139 | + | |
140 | +如果这些插件对你有帮助,可以给一个 star 支持下 | |
141 | + | |
142 | +- [vite-plugin-mock](https://github.com/anncwb/vite-plugin-mock) - 用于本地及开发环境数据 mock | |
143 | +- [vite-plugin-html](https://github.com/anncwb/vite-plugin-html) - 用于 html 模版转换及压缩 | |
144 | +- [vite-plugin-style-import](https://github.com/anncwb/vite-plugin-style-import) - 用于组件库样式按需引入 | |
145 | +- [vite-plugin-theme](https://github.com/anncwb/vite-plugin-theme) - 用于在线切换主题色等颜色相关配置 | |
146 | +- [vite-plugin-imagemin](https://github.com/anncwb/vite-plugin-imagemin) - 用于打包压缩图片资源 | |
147 | +- [vite-plugin-compression](https://github.com/anncwb/vite-plugin-compression) - 用于打包输出.gz|.brotil 文件 | |
148 | +- [vite-plugin-svg-icons](https://github.com/anncwb/vite-plugin-svg-icons) - 用于快速生成 svg 雪碧图 | |
149 | + | |
150 | +## 后台整合示例 | |
151 | + | |
152 | +- [lamp-cloud](https://github.com/zuihou/lamp-cloud) - 基于 SpringCloud Alibaba 的微服务中后台快速开发平台 | |
153 | + | |
154 | +## 维护者 | |
155 | + | |
156 | +[@Vben](https://github.com/anncwb) | |
157 | + | |
158 | +## 捐赠 | |
159 | + | |
160 | +如果你觉得这个项目对你有帮助,你可以帮作者买一杯咖啡表示支持! | |
161 | + | |
162 | + | |
163 | + | |
164 | +<a style="display: block;width: 100px;height: 50px;line-height: 50px; color: #fff;text-align: center; background: #408aed;border-radius: 4px;" href="https://www.paypal.com/paypalme/cvvben">Paypal Me</a> | |
165 | + | |
166 | +## 交流 | |
167 | + | |
168 | +`Vue-vben-Admin` 是完全开源免费的项目,在帮助开发者更方便地进行中大型管理系统开发,同时也提供 QQ 交流群使用问题欢迎在群内提问。 | |
169 | + | |
170 | +- QQ 群 `569291866` | |
171 | + | |
172 | +## License | |
173 | + | |
174 | +[MIT © Vben-2020](./LICENSE) | ... | ... |
build/config/themeConfig.ts
0 → 100644
1 | +import { generate } from '@ant-design/colors'; | |
2 | + | |
3 | +export const primaryColor = '#0960bd'; | |
4 | + | |
5 | +export const darkMode = 'light'; | |
6 | + | |
7 | +type Fn = (...arg: any) => any; | |
8 | + | |
9 | +type GenerateTheme = 'default' | 'dark'; | |
10 | + | |
11 | +export interface GenerateColorsParams { | |
12 | + mixLighten: Fn; | |
13 | + mixDarken: Fn; | |
14 | + tinycolor: any; | |
15 | + color?: string; | |
16 | +} | |
17 | + | |
18 | +export function generateAntColors(color: string, theme: GenerateTheme = 'default') { | |
19 | + return generate(color, { | |
20 | + theme, | |
21 | + }); | |
22 | +} | |
23 | + | |
24 | +export function getThemeColors(color?: string) { | |
25 | + const tc = color || primaryColor; | |
26 | + const lightColors = generateAntColors(tc); | |
27 | + const primary = lightColors[5]; | |
28 | + const modeColors = generateAntColors(primary, 'dark'); | |
29 | + | |
30 | + return [...lightColors, ...modeColors]; | |
31 | +} | |
32 | + | |
33 | +export function generateColors({ | |
34 | + color = primaryColor, | |
35 | + mixLighten, | |
36 | + mixDarken, | |
37 | + tinycolor, | |
38 | +}: GenerateColorsParams) { | |
39 | + const arr = new Array(19).fill(0); | |
40 | + const lightens = arr.map((_t, i) => { | |
41 | + return mixLighten(color, i / 5); | |
42 | + }); | |
43 | + | |
44 | + const darkens = arr.map((_t, i) => { | |
45 | + return mixDarken(color, i / 5); | |
46 | + }); | |
47 | + | |
48 | + const alphaColors = arr.map((_t, i) => { | |
49 | + return tinycolor(color) | |
50 | + .setAlpha(i / 20) | |
51 | + .toRgbString(); | |
52 | + }); | |
53 | + | |
54 | + const shortAlphaColors = alphaColors.map((item) => item.replace(/\s/g, '').replace(/0\./g, '.')); | |
55 | + | |
56 | + const tinycolorLightens = arr | |
57 | + .map((_t, i) => { | |
58 | + return tinycolor(color) | |
59 | + .lighten(i * 5) | |
60 | + .toHexString(); | |
61 | + }) | |
62 | + .filter((item) => item !== '#ffffff'); | |
63 | + | |
64 | + const tinycolorDarkens = arr | |
65 | + .map((_t, i) => { | |
66 | + return tinycolor(color) | |
67 | + .darken(i * 5) | |
68 | + .toHexString(); | |
69 | + }) | |
70 | + .filter((item) => item !== '#000000'); | |
71 | + return [ | |
72 | + ...lightens, | |
73 | + ...darkens, | |
74 | + ...alphaColors, | |
75 | + ...shortAlphaColors, | |
76 | + ...tinycolorDarkens, | |
77 | + ...tinycolorLightens, | |
78 | + ].filter((item) => !item.includes('-')); | |
79 | +} | ... | ... |
build/constant.ts
0 → 100644
build/generate/generateModifyVars.ts
0 → 100644
1 | +import { generateAntColors, primaryColor } from '../config/themeConfig'; | |
2 | +import { getThemeVariables } from 'ant-design-vue/dist/theme'; | |
3 | +import { resolve } from 'path'; | |
4 | + | |
5 | +/** | |
6 | + * less global variable | |
7 | + */ | |
8 | +export function generateModifyVars(dark = false) { | |
9 | + const palettes = generateAntColors(primaryColor); | |
10 | + const primary = palettes[5]; | |
11 | + | |
12 | + const primaryColorObj: Record<string, string> = {}; | |
13 | + | |
14 | + for (let index = 0; index < 10; index++) { | |
15 | + primaryColorObj[`primary-${index + 1}`] = palettes[index]; | |
16 | + } | |
17 | + | |
18 | + const modifyVars = getThemeVariables({ dark }); | |
19 | + return { | |
20 | + ...modifyVars, | |
21 | + // Used for global import to avoid the need to import each style file separately | |
22 | + // reference: Avoid repeated references | |
23 | + hack: `${modifyVars.hack} @import (reference) "${resolve('src/design/config.less')}";`, | |
24 | + 'primary-color': primary, | |
25 | + ...primaryColorObj, | |
26 | + 'info-color': primary, | |
27 | + 'processing-color': primary, | |
28 | + 'success-color': '#55D187', // Success color | |
29 | + 'error-color': '#ED6F6F', // False color | |
30 | + 'warning-color': '#EFBD47', // Warning color | |
31 | + //'border-color-base': '#EEEEEE', | |
32 | + 'font-size-base': '14px', // Main font size | |
33 | + 'border-radius-base': '2px', // Component/float fillet | |
34 | + 'link-color': primary, // Link color | |
35 | + 'app-content-background': '#fafafa', // Link color | |
36 | + }; | |
37 | +} | ... | ... |
build/generate/icon/index.ts
0 → 100644
1 | +import path from 'path'; | |
2 | +import fs from 'fs-extra'; | |
3 | +import inquirer from 'inquirer'; | |
4 | +import chalk from 'chalk'; | |
5 | +import pkg from '../../../package.json'; | |
6 | + | |
7 | +async function generateIcon() { | |
8 | + const dir = path.resolve(process.cwd(), 'node_modules/@iconify/json'); | |
9 | + | |
10 | + const raw = await fs.readJSON(path.join(dir, 'collections.json')); | |
11 | + | |
12 | + const collections = Object.entries(raw).map(([id, v]) => ({ | |
13 | + ...(v as any), | |
14 | + id, | |
15 | + })); | |
16 | + | |
17 | + const choices = collections.map((item) => ({ key: item.id, value: item.id, name: item.name })); | |
18 | + | |
19 | + inquirer | |
20 | + .prompt([ | |
21 | + { | |
22 | + type: 'list', | |
23 | + name: 'useType', | |
24 | + choices: [ | |
25 | + { key: 'local', value: 'local', name: 'Local' }, | |
26 | + { key: 'onLine', value: 'onLine', name: 'OnLine' }, | |
27 | + ], | |
28 | + message: 'How to use icons?', | |
29 | + }, | |
30 | + { | |
31 | + type: 'list', | |
32 | + name: 'iconSet', | |
33 | + choices: choices, | |
34 | + message: 'Select the icon set that needs to be generated?', | |
35 | + }, | |
36 | + { | |
37 | + type: 'input', | |
38 | + name: 'output', | |
39 | + message: 'Select the icon set that needs to be generated?', | |
40 | + default: 'src/components/Icon/data', | |
41 | + }, | |
42 | + ]) | |
43 | + .then(async (answers) => { | |
44 | + const { iconSet, output, useType } = answers; | |
45 | + const outputDir = path.resolve(process.cwd(), output); | |
46 | + fs.ensureDir(outputDir); | |
47 | + const genCollections = collections.filter((item) => [iconSet].includes(item.id)); | |
48 | + const prefixSet: string[] = []; | |
49 | + for (const info of genCollections) { | |
50 | + const data = await fs.readJSON(path.join(dir, 'json', `${info.id}.json`)); | |
51 | + if (data) { | |
52 | + const { prefix } = data; | |
53 | + const isLocal = useType === 'local'; | |
54 | + const icons = Object.keys(data.icons).map( | |
55 | + (item) => `${isLocal ? prefix + ':' : ''}${item}` | |
56 | + ); | |
57 | + | |
58 | + await fs.writeFileSync( | |
59 | + path.join(output, `icons.data.ts`), | |
60 | + `export default ${isLocal ? JSON.stringify(icons) : JSON.stringify({ prefix, icons })}` | |
61 | + ); | |
62 | + prefixSet.push(prefix); | |
63 | + } | |
64 | + } | |
65 | + fs.emptyDir(path.join(process.cwd(), 'node_modules/.vite')); | |
66 | + console.log( | |
67 | + `✨ ${chalk.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]` | |
68 | + ); | |
69 | + }); | |
70 | +} | |
71 | + | |
72 | +generateIcon(); | ... | ... |
build/getConfigFileName.ts
0 → 100644
build/script/buildConf.ts
0 → 100644
1 | +/** | |
2 | + * Generate additional configuration files when used for packaging. The file can be configured with some global variables, so that it can be changed directly externally without repackaging | |
3 | + */ | |
4 | +import { GLOB_CONFIG_FILE_NAME, OUTPUT_DIR } from '../constant'; | |
5 | +import fs, { writeFileSync } from 'fs-extra'; | |
6 | +import chalk from 'chalk'; | |
7 | + | |
8 | +import { getRootPath, getEnvConfig } from '../utils'; | |
9 | +import { getConfigFileName } from '../getConfigFileName'; | |
10 | + | |
11 | +import pkg from '../../package.json'; | |
12 | + | |
13 | +function createConfig( | |
14 | + { | |
15 | + configName, | |
16 | + config, | |
17 | + configFileName = GLOB_CONFIG_FILE_NAME, | |
18 | + }: { configName: string; config: any; configFileName?: string } = { configName: '', config: {} } | |
19 | +) { | |
20 | + try { | |
21 | + const windowConf = `window.${configName}`; | |
22 | + // Ensure that the variable will not be modified | |
23 | + const configStr = `${windowConf}=${JSON.stringify(config)}; | |
24 | + Object.freeze(${windowConf}); | |
25 | + Object.defineProperty(window, "${configName}", { | |
26 | + configurable: false, | |
27 | + writable: false, | |
28 | + }); | |
29 | + `.replace(/\s/g, ''); | |
30 | + fs.mkdirp(getRootPath(OUTPUT_DIR)); | |
31 | + writeFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), configStr); | |
32 | + | |
33 | + console.log(chalk.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`); | |
34 | + console.log(chalk.gray(OUTPUT_DIR + '/' + chalk.green(configFileName)) + '\n'); | |
35 | + } catch (error) { | |
36 | + console.log(chalk.red('configuration file configuration file failed to package:\n' + error)); | |
37 | + } | |
38 | +} | |
39 | + | |
40 | +export function runBuildConfig() { | |
41 | + const config = getEnvConfig(); | |
42 | + const configFileName = getConfigFileName(config); | |
43 | + createConfig({ config, configName: configFileName }); | |
44 | +} | ... | ... |
build/script/postBuild.ts
0 → 100644
1 | +// #!/usr/bin/env node | |
2 | + | |
3 | +import { runBuildConfig } from './buildConf'; | |
4 | +import chalk from 'chalk'; | |
5 | + | |
6 | +import pkg from '../../package.json'; | |
7 | + | |
8 | +export const runBuild = async () => { | |
9 | + try { | |
10 | + const argvList = process.argv.splice(2); | |
11 | + | |
12 | + // Generate configuration file | |
13 | + if (!argvList.includes('disabled-config')) { | |
14 | + runBuildConfig(); | |
15 | + } | |
16 | + | |
17 | + console.log(`✨ ${chalk.cyan(`[${pkg.name}]`)}` + ' - build successfully!'); | |
18 | + } catch (error) { | |
19 | + console.log(chalk.red('vite build error:\n' + error)); | |
20 | + process.exit(1); | |
21 | + } | |
22 | +}; | |
23 | +runBuild(); | ... | ... |
build/utils.ts
0 → 100644
1 | +import fs from 'fs'; | |
2 | +import path from 'path'; | |
3 | +import dotenv from 'dotenv'; | |
4 | + | |
5 | +export function isDevFn(mode: string): boolean { | |
6 | + return mode === 'development'; | |
7 | +} | |
8 | + | |
9 | +export function isProdFn(mode: string): boolean { | |
10 | + return mode === 'production'; | |
11 | +} | |
12 | + | |
13 | +/** | |
14 | + * Whether to generate package preview | |
15 | + */ | |
16 | +export function isReportMode(): boolean { | |
17 | + return process.env.REPORT === 'true'; | |
18 | +} | |
19 | + | |
20 | +// Read all environment variable configuration files to process.env | |
21 | +export function wrapperEnv(envConf: Recordable): ViteEnv { | |
22 | + const ret: any = {}; | |
23 | + | |
24 | + for (const envName of Object.keys(envConf)) { | |
25 | + let realName = envConf[envName].replace(/\\n/g, '\n'); | |
26 | + realName = realName === 'true' ? true : realName === 'false' ? false : realName; | |
27 | + | |
28 | + if (envName === 'VITE_PORT') { | |
29 | + realName = Number(realName); | |
30 | + } | |
31 | + if (envName === 'VITE_PROXY') { | |
32 | + try { | |
33 | + realName = JSON.parse(realName); | |
34 | + } catch (error) { | |
35 | + realName = ''; | |
36 | + } | |
37 | + } | |
38 | + ret[envName] = realName; | |
39 | + if (typeof realName === 'string') { | |
40 | + process.env[envName] = realName; | |
41 | + } else if (typeof realName === 'object') { | |
42 | + process.env[envName] = JSON.stringify(realName); | |
43 | + } | |
44 | + } | |
45 | + return ret; | |
46 | +} | |
47 | + | |
48 | +/** | |
49 | + * 获取当前环境下生效的配置文件名 | |
50 | + */ | |
51 | +function getConfFiles() { | |
52 | + const script = process.env.npm_lifecycle_script; | |
53 | + const reg = new RegExp('--mode ([a-z]+)'); | |
54 | + const result = reg.exec(script as string) as any; | |
55 | + if (result) { | |
56 | + const mode = result[1] as string; | |
57 | + return ['.env', `.env.${mode}`]; | |
58 | + } | |
59 | + return ['.env', '.env.production']; | |
60 | +} | |
61 | + | |
62 | +/** | |
63 | + * Get the environment variables starting with the specified prefix | |
64 | + * @param match prefix | |
65 | + * @param confFiles ext | |
66 | + */ | |
67 | +export function getEnvConfig(match = 'VITE_GLOB_', confFiles = getConfFiles()) { | |
68 | + let envConfig = {}; | |
69 | + confFiles.forEach((item) => { | |
70 | + try { | |
71 | + const env = dotenv.parse(fs.readFileSync(path.resolve(process.cwd(), item))); | |
72 | + envConfig = { ...envConfig, ...env }; | |
73 | + } catch (e) { | |
74 | + console.error(`Error in parsing ${item}`, e); | |
75 | + } | |
76 | + }); | |
77 | + const reg = new RegExp(`^(${match})`); | |
78 | + Object.keys(envConfig).forEach((key) => { | |
79 | + if (!reg.test(key)) { | |
80 | + Reflect.deleteProperty(envConfig, key); | |
81 | + } | |
82 | + }); | |
83 | + return envConfig; | |
84 | +} | |
85 | + | |
86 | +/** | |
87 | + * Get user root directory | |
88 | + * @param dir file path | |
89 | + */ | |
90 | +export function getRootPath(...dir: string[]) { | |
91 | + return path.resolve(process.cwd(), ...dir); | |
92 | +} | ... | ... |
build/vite/optimizer.ts
0 → 100644
1 | +// TODO | |
2 | +import type { GetManualChunk } from 'rollup'; | |
3 | + | |
4 | +// | |
5 | +const vendorLibs: { match: string[]; output: string }[] = [ | |
6 | + // { | |
7 | + // match: ['xlsx'], | |
8 | + // output: 'xlsx', | |
9 | + // }, | |
10 | +]; | |
11 | + | |
12 | +// @ts-ignore | |
13 | +export const configManualChunk: GetManualChunk = (id: string) => { | |
14 | + if (/[\\/]node_modules[\\/]/.test(id)) { | |
15 | + const matchItem = vendorLibs.find((item) => { | |
16 | + const reg = new RegExp(`[\\/]node_modules[\\/]_?(${item.match.join('|')})(.*)`, 'ig'); | |
17 | + return reg.test(id); | |
18 | + }); | |
19 | + return matchItem ? matchItem.output : null; | |
20 | + } | |
21 | +}; | ... | ... |
build/vite/plugin/compress.ts
0 → 100644
1 | +/** | |
2 | + * Used to package and output gzip. Note that this does not work properly in Vite, the specific reason is still being investigated | |
3 | + * https://github.com/anncwb/vite-plugin-compression | |
4 | + */ | |
5 | +import type { Plugin } from 'vite'; | |
6 | + | |
7 | +import compressPlugin from 'vite-plugin-compression'; | |
8 | + | |
9 | +export function configCompressPlugin( | |
10 | + compress: 'gzip' | 'brotli' | 'none', | |
11 | + deleteOriginFile = false | |
12 | +): Plugin | Plugin[] { | |
13 | + const compressList = compress.split(','); | |
14 | + | |
15 | + const plugins: Plugin[] = []; | |
16 | + | |
17 | + if (compressList.includes('gzip')) { | |
18 | + plugins.push( | |
19 | + compressPlugin({ | |
20 | + ext: '.gz', | |
21 | + deleteOriginFile, | |
22 | + }) | |
23 | + ); | |
24 | + } | |
25 | + if (compressList.includes('brotli')) { | |
26 | + plugins.push( | |
27 | + compressPlugin({ | |
28 | + ext: '.br', | |
29 | + algorithm: 'brotliCompress', | |
30 | + deleteOriginFile, | |
31 | + }) | |
32 | + ); | |
33 | + } | |
34 | + return plugins; | |
35 | +} | ... | ... |
build/vite/plugin/hmr.ts
0 → 100644
1 | +import type { Plugin } from 'vite'; | |
2 | + | |
3 | +/** | |
4 | + * TODO | |
5 | + * Temporarily solve the Vite circular dependency problem, and wait for a better solution to fix it later. I don't know what problems this writing will bring. | |
6 | + * @returns | |
7 | + */ | |
8 | + | |
9 | +export function configHmrPlugin(): Plugin { | |
10 | + return { | |
11 | + name: 'singleHMR', | |
12 | + handleHotUpdate({ modules, file }) { | |
13 | + if (file.match(/xml$/)) return []; | |
14 | + | |
15 | + modules.forEach((m) => { | |
16 | + if (!m.url.match(/\.(css|less)/)) { | |
17 | + m.importedModules = new Set(); | |
18 | + m.importers = new Set(); | |
19 | + } | |
20 | + }); | |
21 | + | |
22 | + return modules; | |
23 | + }, | |
24 | + }; | |
25 | +} | ... | ... |
build/vite/plugin/html.ts
0 → 100644
1 | +/** | |
2 | + * Plugin to minimize and use ejs template syntax in index.html. | |
3 | + * https://github.com/anncwb/vite-plugin-html | |
4 | + */ | |
5 | +import type { Plugin } from 'vite'; | |
6 | + | |
7 | +import html from 'vite-plugin-html'; | |
8 | + | |
9 | +import pkg from '../../../package.json'; | |
10 | +import { GLOB_CONFIG_FILE_NAME } from '../../constant'; | |
11 | + | |
12 | +export function configHtmlPlugin(env: ViteEnv, isBuild: boolean) { | |
13 | + const { VITE_GLOB_APP_TITLE, VITE_PUBLIC_PATH } = env; | |
14 | + | |
15 | + const path = VITE_PUBLIC_PATH.endsWith('/') ? VITE_PUBLIC_PATH : `${VITE_PUBLIC_PATH}/`; | |
16 | + | |
17 | + const getAppConfigSrc = () => { | |
18 | + return `${path || '/'}${GLOB_CONFIG_FILE_NAME}?v=${pkg.version}-${new Date().getTime()}`; | |
19 | + }; | |
20 | + | |
21 | + const htmlPlugin: Plugin[] = html({ | |
22 | + minify: isBuild, | |
23 | + inject: { | |
24 | + // Inject data into ejs template | |
25 | + injectData: { | |
26 | + title: VITE_GLOB_APP_TITLE, | |
27 | + }, | |
28 | + // Embed the generated app.config.js file | |
29 | + tags: isBuild | |
30 | + ? [ | |
31 | + { | |
32 | + tag: 'script', | |
33 | + attrs: { | |
34 | + src: getAppConfigSrc(), | |
35 | + }, | |
36 | + }, | |
37 | + ] | |
38 | + : [], | |
39 | + }, | |
40 | + }); | |
41 | + return htmlPlugin; | |
42 | +} | ... | ... |
build/vite/plugin/imagemin.ts
0 → 100644
1 | +// Image resource files used to compress the output of the production environment | |
2 | +// https://github.com/anncwb/vite-plugin-imagemin | |
3 | + | |
4 | +import viteImagemin from 'vite-plugin-imagemin'; | |
5 | + | |
6 | +export function configImageminPlugin() { | |
7 | + const plugin = viteImagemin({ | |
8 | + gifsicle: { | |
9 | + optimizationLevel: 7, | |
10 | + interlaced: false, | |
11 | + }, | |
12 | + optipng: { | |
13 | + optimizationLevel: 7, | |
14 | + }, | |
15 | + mozjpeg: { | |
16 | + quality: 20, | |
17 | + }, | |
18 | + pngquant: { | |
19 | + quality: [0.8, 0.9], | |
20 | + speed: 4, | |
21 | + }, | |
22 | + svgo: { | |
23 | + plugins: [ | |
24 | + { | |
25 | + name: 'removeViewBox', | |
26 | + }, | |
27 | + { | |
28 | + name: 'removeEmptyAttrs', | |
29 | + active: false, | |
30 | + }, | |
31 | + ], | |
32 | + }, | |
33 | + }); | |
34 | + return plugin; | |
35 | +} | ... | ... |
build/vite/plugin/index.ts
0 → 100644
1 | +import type { Plugin } from 'vite'; | |
2 | + | |
3 | +import vue from '@vitejs/plugin-vue'; | |
4 | +import vueJsx from '@vitejs/plugin-vue-jsx'; | |
5 | +import legacy from '@vitejs/plugin-legacy'; | |
6 | + | |
7 | +import purgeIcons from 'vite-plugin-purge-icons'; | |
8 | +import windiCSS from 'vite-plugin-windicss'; | |
9 | +import { configHtmlPlugin } from './html'; | |
10 | +import { configPwaConfig } from './pwa'; | |
11 | +import { configMockPlugin } from './mock'; | |
12 | +import { configCompressPlugin } from './compress'; | |
13 | +import { configStyleImportPlugin } from './styleImport'; | |
14 | +import { configVisualizerConfig } from './visualizer'; | |
15 | +import { configThemePlugin } from './theme'; | |
16 | +import { configImageminPlugin } from './imagemin'; | |
17 | +import { configSvgIconsPlugin } from './svgSprite'; | |
18 | +import { configHmrPlugin } from './hmr'; | |
19 | + | |
20 | +export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) { | |
21 | + const { | |
22 | + VITE_USE_IMAGEMIN, | |
23 | + VITE_USE_MOCK, | |
24 | + VITE_LEGACY, | |
25 | + VITE_BUILD_COMPRESS, | |
26 | + VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE, | |
27 | + } = viteEnv; | |
28 | + | |
29 | + const vitePlugins: (Plugin | Plugin[])[] = [ | |
30 | + // have to | |
31 | + vue(), | |
32 | + // have to | |
33 | + vueJsx(), | |
34 | + ]; | |
35 | + | |
36 | + // vite-plugin-windicss | |
37 | + vitePlugins.push(windiCSS()); | |
38 | + | |
39 | + // TODO | |
40 | + !isBuild && vitePlugins.push(configHmrPlugin()); | |
41 | + | |
42 | + // @vitejs/plugin-legacy | |
43 | + VITE_LEGACY && isBuild && vitePlugins.push(legacy()); | |
44 | + | |
45 | + // vite-plugin-html | |
46 | + vitePlugins.push(configHtmlPlugin(viteEnv, isBuild)); | |
47 | + | |
48 | + // vite-plugin-svg-icons | |
49 | + vitePlugins.push(configSvgIconsPlugin(isBuild)); | |
50 | + | |
51 | + // vite-plugin-mock | |
52 | + VITE_USE_MOCK && vitePlugins.push(configMockPlugin(isBuild)); | |
53 | + | |
54 | + // vite-plugin-purge-icons | |
55 | + vitePlugins.push(purgeIcons()); | |
56 | + | |
57 | + // vite-plugin-style-import | |
58 | + vitePlugins.push(configStyleImportPlugin(isBuild)); | |
59 | + | |
60 | + // rollup-plugin-visualizer | |
61 | + vitePlugins.push(configVisualizerConfig()); | |
62 | + | |
63 | + //vite-plugin-theme | |
64 | + vitePlugins.push(configThemePlugin(isBuild)); | |
65 | + | |
66 | + // The following plugins only work in the production environment | |
67 | + if (isBuild) { | |
68 | + //vite-plugin-imagemin | |
69 | + VITE_USE_IMAGEMIN && vitePlugins.push(configImageminPlugin()); | |
70 | + | |
71 | + // rollup-plugin-gzip | |
72 | + vitePlugins.push( | |
73 | + configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE) | |
74 | + ); | |
75 | + | |
76 | + // vite-plugin-pwa | |
77 | + vitePlugins.push(configPwaConfig(viteEnv)); | |
78 | + } | |
79 | + | |
80 | + return vitePlugins; | |
81 | +} | ... | ... |
build/vite/plugin/mock.ts
0 → 100644
1 | +/** | |
2 | + * Mock plugin for development and production. | |
3 | + * https://github.com/anncwb/vite-plugin-mock | |
4 | + */ | |
5 | +import { viteMockServe } from 'vite-plugin-mock'; | |
6 | + | |
7 | +export function configMockPlugin(isBuild: boolean) { | |
8 | + return viteMockServe({ | |
9 | + ignore: /^\_/, | |
10 | + mockPath: 'mock', | |
11 | + localEnabled: !isBuild, | |
12 | + prodEnabled: isBuild, | |
13 | + injectCode: ` | |
14 | + import { setupProdMockServer } from '../mock/_createProductionServer'; | |
15 | + | |
16 | + setupProdMockServer(); | |
17 | + `, | |
18 | + }); | |
19 | +} | ... | ... |
build/vite/plugin/pwa.ts
0 → 100644
1 | +/** | |
2 | + * Zero-config PWA for Vite | |
3 | + * https://github.com/antfu/vite-plugin-pwa | |
4 | + */ | |
5 | + | |
6 | +import { VitePWA } from 'vite-plugin-pwa'; | |
7 | + | |
8 | +export function configPwaConfig(env: ViteEnv) { | |
9 | + const { VITE_USE_PWA, VITE_GLOB_APP_TITLE, VITE_GLOB_APP_SHORT_NAME } = env; | |
10 | + | |
11 | + if (VITE_USE_PWA) { | |
12 | + // vite-plugin-pwa | |
13 | + const pwaPlugin = VitePWA({ | |
14 | + manifest: { | |
15 | + name: VITE_GLOB_APP_TITLE, | |
16 | + short_name: VITE_GLOB_APP_SHORT_NAME, | |
17 | + icons: [ | |
18 | + { | |
19 | + src: './resource/img/pwa-192x192.png', | |
20 | + sizes: '192x192', | |
21 | + type: 'image/png', | |
22 | + }, | |
23 | + { | |
24 | + src: './resource/img/pwa-512x512.png', | |
25 | + sizes: '512x512', | |
26 | + type: 'image/png', | |
27 | + }, | |
28 | + ], | |
29 | + }, | |
30 | + }); | |
31 | + return pwaPlugin; | |
32 | + } | |
33 | + return []; | |
34 | +} | ... | ... |
build/vite/plugin/styleImport.ts
0 → 100644
1 | +/** | |
2 | + * Introduces component library styles on demand. | |
3 | + * https://github.com/anncwb/vite-plugin-style-import | |
4 | + */ | |
5 | + | |
6 | +import styleImport from 'vite-plugin-style-import'; | |
7 | + | |
8 | +export function configStyleImportPlugin(isBuild: boolean) { | |
9 | + if (!isBuild) return []; | |
10 | + const styleImportPlugin = styleImport({ | |
11 | + libs: [ | |
12 | + { | |
13 | + libraryName: 'ant-design-vue', | |
14 | + esModule: true, | |
15 | + resolveStyle: (name) => { | |
16 | + return `ant-design-vue/es/${name}/style/index`; | |
17 | + }, | |
18 | + }, | |
19 | + ], | |
20 | + }); | |
21 | + return styleImportPlugin; | |
22 | +} | ... | ... |
build/vite/plugin/svgSprite.ts
0 → 100644
1 | +/** | |
2 | + * Vite Plugin for fast creating SVG sprites. | |
3 | + * https://github.com/anncwb/vite-plugin-svg-icons | |
4 | + */ | |
5 | + | |
6 | +import SvgIconsPlugin from 'vite-plugin-svg-icons'; | |
7 | +import path from 'path'; | |
8 | + | |
9 | +export function configSvgIconsPlugin(isBuild: boolean) { | |
10 | + const svgIconsPlugin = SvgIconsPlugin({ | |
11 | + iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')], | |
12 | + svgoOptions: isBuild, | |
13 | + // default | |
14 | + symbolId: 'icon-[dir]-[name]', | |
15 | + }); | |
16 | + return svgIconsPlugin; | |
17 | +} | ... | ... |
build/vite/plugin/theme.ts
0 → 100644
1 | +/** | |
2 | + * Vite plugin for website theme color switching | |
3 | + * https://github.com/anncwb/vite-plugin-theme | |
4 | + */ | |
5 | +import type { Plugin } from 'vite'; | |
6 | +import path from 'path'; | |
7 | +import { | |
8 | + viteThemePlugin, | |
9 | + antdDarkThemePlugin, | |
10 | + mixLighten, | |
11 | + mixDarken, | |
12 | + tinycolor, | |
13 | +} from 'vite-plugin-theme'; | |
14 | +import { getThemeColors, generateColors } from '../../config/themeConfig'; | |
15 | +import { generateModifyVars } from '../../generate/generateModifyVars'; | |
16 | + | |
17 | +export function configThemePlugin(isBuild: boolean): Plugin[] { | |
18 | + const colors = generateColors({ | |
19 | + mixDarken, | |
20 | + mixLighten, | |
21 | + tinycolor, | |
22 | + }); | |
23 | + const plugin = [ | |
24 | + viteThemePlugin({ | |
25 | + resolveSelector: (s) => { | |
26 | + s = s.trim(); | |
27 | + switch (s) { | |
28 | + case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon': | |
29 | + return '.ant-steps-item-icon > .ant-steps-icon'; | |
30 | + case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)': | |
31 | + case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover': | |
32 | + case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active': | |
33 | + return s; | |
34 | + case '.ant-steps-item-icon > .ant-steps-icon': | |
35 | + return s; | |
36 | + case '.ant-select-item-option-selected:not(.ant-select-item-option-disabled)': | |
37 | + return s; | |
38 | + default: | |
39 | + if (s.indexOf('.ant-btn') >= -1) { | |
40 | + // 按钮被重新定制过,需要过滤掉class防止覆盖 | |
41 | + return s; | |
42 | + } | |
43 | + } | |
44 | + return s.startsWith('[data-theme') ? s : `[data-theme] ${s}`; | |
45 | + }, | |
46 | + colorVariables: [...getThemeColors(), ...colors], | |
47 | + }), | |
48 | + antdDarkThemePlugin({ | |
49 | + preloadFiles: [ | |
50 | + path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.less'), | |
51 | + //path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.dark.less'), | |
52 | + path.resolve(process.cwd(), 'src/design/index.less'), | |
53 | + ], | |
54 | + filter: (id) => (isBuild ? !id.endsWith('antd.less') : true), | |
55 | + // extractCss: false, | |
56 | + darkModifyVars: { | |
57 | + ...generateModifyVars(true), | |
58 | + 'text-color': '#c9d1d9', | |
59 | + 'primary-1': 'rgb(255 255 255 / 8%)', | |
60 | + 'text-color-base': '#c9d1d9', | |
61 | + 'component-background': '#151515', | |
62 | + 'heading-color': 'rgb(255 255 255 / 65%)', | |
63 | + // black: '#0e1117', | |
64 | + // #8b949e | |
65 | + 'text-color-secondary': '#8b949e', | |
66 | + 'border-color-base': '#303030', | |
67 | + // 'border-color-split': '#30363d', | |
68 | + 'item-active-bg': '#111b26', | |
69 | + 'app-content-background': 'rgb(255 255 255 / 4%)', | |
70 | + 'tree-node-selected-bg': '#11263c', | |
71 | + | |
72 | + 'alert-success-border-color': '#274916', | |
73 | + 'alert-success-bg-color': '#162312', | |
74 | + 'alert-success-icon-color': '#49aa19', | |
75 | + 'alert-info-border-color': '#153450', | |
76 | + 'alert-info-bg-color': '#111b26', | |
77 | + 'alert-info-icon-color': '#177ddc', | |
78 | + 'alert-warning-border-color': '#594214', | |
79 | + 'alert-warning-bg-color': '#2b2111', | |
80 | + 'alert-warning-icon-color': '#d89614', | |
81 | + 'alert-error-border-color': '#58181c', | |
82 | + 'alert-error-bg-color': '#2a1215', | |
83 | + 'alert-error-icon-color': '#a61d24', | |
84 | + }, | |
85 | + }), | |
86 | + ]; | |
87 | + | |
88 | + return plugin as unknown as Plugin[]; | |
89 | +} | ... | ... |
build/vite/plugin/visualizer.ts
0 → 100644
1 | +/** | |
2 | + * Package file volume analysis | |
3 | + */ | |
4 | +import visualizer from 'rollup-plugin-visualizer'; | |
5 | +import { isReportMode } from '../../utils'; | |
6 | + | |
7 | +export function configVisualizerConfig() { | |
8 | + if (isReportMode()) { | |
9 | + return visualizer({ | |
10 | + filename: './node_modules/.cache/visualizer/stats.html', | |
11 | + open: true, | |
12 | + gzipSize: true, | |
13 | + brotliSize: true, | |
14 | + }) as Plugin; | |
15 | + } | |
16 | + return []; | |
17 | +} | ... | ... |
build/vite/proxy.ts
0 → 100644
1 | +/** | |
2 | + * Used to parse the .env.development proxy configuration | |
3 | + */ | |
4 | +import type { ProxyOptions } from 'vite'; | |
5 | + | |
6 | +type ProxyItem = [string, string]; | |
7 | + | |
8 | +type ProxyList = ProxyItem[]; | |
9 | + | |
10 | +type ProxyTargetList = Record<string, ProxyOptions & { rewrite: (path: string) => string }>; | |
11 | + | |
12 | +const httpsRE = /^https:\/\//; | |
13 | + | |
14 | +/** | |
15 | + * Generate proxy | |
16 | + * @param list | |
17 | + */ | |
18 | +export function createProxy(list: ProxyList = []) { | |
19 | + const ret: ProxyTargetList = {}; | |
20 | + for (const [prefix, target] of list) { | |
21 | + const isHttps = httpsRE.test(target); | |
22 | + | |
23 | + // https://github.com/http-party/node-http-proxy#options | |
24 | + ret[prefix] = { | |
25 | + target: target, | |
26 | + changeOrigin: true, | |
27 | + ws: true, | |
28 | + rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''), | |
29 | + // https is require secure=false | |
30 | + ...(isHttps ? { secure: false } : {}), | |
31 | + }; | |
32 | + } | |
33 | + return ret; | |
34 | +} | ... | ... |
index.html
0 → 100644
1 | +<!DOCTYPE html> | |
2 | +<html lang="en" id="htmlRoot"> | |
3 | + <head> | |
4 | + <meta charset="UTF-8" /> | |
5 | + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> | |
6 | + <meta name="renderer" content="webkit" /> | |
7 | + <meta | |
8 | + name="viewport" | |
9 | + content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0" | |
10 | + /> | |
11 | + | |
12 | + <title><%= title %></title> | |
13 | + <link rel="icon" href="/favicon.ico" /> | |
14 | + </head> | |
15 | + <body> | |
16 | + <script> | |
17 | + (() => { | |
18 | + var htmlRoot = document.getElementById('htmlRoot'); | |
19 | + var theme = window.localStorage.getItem('__APP__DARK__MODE__'); | |
20 | + if (htmlRoot && theme) { | |
21 | + htmlRoot.setAttribute('data-theme', theme); | |
22 | + theme = htmlRoot = null; | |
23 | + } | |
24 | + })(); | |
25 | + </script> | |
26 | + <div id="app"> | |
27 | + <style> | |
28 | + html[data-theme='dark'] .app-loading { | |
29 | + background-color: #2c344a; | |
30 | + } | |
31 | + | |
32 | + html[data-theme='dark'] .app-loading .app-loading-title { | |
33 | + color: rgba(255, 255, 255, 0.85); | |
34 | + } | |
35 | + | |
36 | + .app-loading { | |
37 | + display: flex; | |
38 | + width: 100%; | |
39 | + height: 100%; | |
40 | + justify-content: center; | |
41 | + align-items: center; | |
42 | + flex-direction: column; | |
43 | + background-color: #f4f7f9; | |
44 | + } | |
45 | + | |
46 | + .app-loading .app-loading-wrap { | |
47 | + position: absolute; | |
48 | + top: 50%; | |
49 | + left: 50%; | |
50 | + display: flex; | |
51 | + -webkit-transform: translate3d(-50%, -50%, 0); | |
52 | + transform: translate3d(-50%, -50%, 0); | |
53 | + justify-content: center; | |
54 | + align-items: center; | |
55 | + flex-direction: column; | |
56 | + } | |
57 | + | |
58 | + .app-loading .dots { | |
59 | + display: flex; | |
60 | + padding: 98px; | |
61 | + justify-content: center; | |
62 | + align-items: center; | |
63 | + } | |
64 | + | |
65 | + .app-loading .app-loading-title { | |
66 | + display: flex; | |
67 | + margin-top: 30px; | |
68 | + font-size: 30px; | |
69 | + color: rgba(0, 0, 0, 0.85); | |
70 | + justify-content: center; | |
71 | + align-items: center; | |
72 | + } | |
73 | + | |
74 | + .app-loading .app-loading-logo { | |
75 | + display: block; | |
76 | + width: 90px; | |
77 | + margin: 0 auto; | |
78 | + margin-bottom: 20px; | |
79 | + } | |
80 | + | |
81 | + .dot { | |
82 | + position: relative; | |
83 | + display: inline-block; | |
84 | + width: 48px; | |
85 | + height: 48px; | |
86 | + margin-top: 30px; | |
87 | + font-size: 32px; | |
88 | + transform: rotate(45deg); | |
89 | + box-sizing: border-box; | |
90 | + animation: antRotate 1.2s infinite linear; | |
91 | + } | |
92 | + | |
93 | + .dot i { | |
94 | + position: absolute; | |
95 | + display: block; | |
96 | + width: 20px; | |
97 | + height: 20px; | |
98 | + background-color: #0065cc; | |
99 | + border-radius: 100%; | |
100 | + opacity: 0.3; | |
101 | + transform: scale(0.75); | |
102 | + animation: antSpinMove 1s infinite linear alternate; | |
103 | + transform-origin: 50% 50%; | |
104 | + } | |
105 | + | |
106 | + .dot i:nth-child(1) { | |
107 | + top: 0; | |
108 | + left: 0; | |
109 | + } | |
110 | + | |
111 | + .dot i:nth-child(2) { | |
112 | + top: 0; | |
113 | + right: 0; | |
114 | + -webkit-animation-delay: 0.4s; | |
115 | + animation-delay: 0.4s; | |
116 | + } | |
117 | + | |
118 | + .dot i:nth-child(3) { | |
119 | + right: 0; | |
120 | + bottom: 0; | |
121 | + -webkit-animation-delay: 0.8s; | |
122 | + animation-delay: 0.8s; | |
123 | + } | |
124 | + | |
125 | + .dot i:nth-child(4) { | |
126 | + bottom: 0; | |
127 | + left: 0; | |
128 | + -webkit-animation-delay: 1.2s; | |
129 | + animation-delay: 1.2s; | |
130 | + } | |
131 | + @keyframes antRotate { | |
132 | + to { | |
133 | + -webkit-transform: rotate(405deg); | |
134 | + transform: rotate(405deg); | |
135 | + } | |
136 | + } | |
137 | + @-webkit-keyframes antRotate { | |
138 | + to { | |
139 | + -webkit-transform: rotate(405deg); | |
140 | + transform: rotate(405deg); | |
141 | + } | |
142 | + } | |
143 | + @keyframes antSpinMove { | |
144 | + to { | |
145 | + opacity: 1; | |
146 | + } | |
147 | + } | |
148 | + @-webkit-keyframes antSpinMove { | |
149 | + to { | |
150 | + opacity: 1; | |
151 | + } | |
152 | + } | |
153 | + </style> | |
154 | + <div class="app-loading"> | |
155 | + <div class="app-loading-wrap"> | |
156 | + <img src="/resource/img/logo.png" class="app-loading-logo" alt="Logo" /> | |
157 | + <div class="app-loading-dots"> | |
158 | + <span class="dot dot-spin"><i></i><i></i><i></i><i></i></span> | |
159 | + </div> | |
160 | + <div class="app-loading-title"><%= title %></div> | |
161 | + </div> | |
162 | + </div> | |
163 | + </div> | |
164 | + <script type="module" src="/src/main.ts"></script> | |
165 | + </body> | |
166 | +</html> | ... | ... |
jest.config.mjs
0 → 100644
1 | +export default { | |
2 | + preset: 'ts-jest', | |
3 | + roots: ['<rootDir>/tests/'], | |
4 | + clearMocks: true, | |
5 | + moduleDirectories: ['node_modules', 'src'], | |
6 | + moduleFileExtensions: ['js', 'ts', 'vue', 'tsx', 'jsx', 'json', 'node'], | |
7 | + modulePaths: ['<rootDir>/src', '<rootDir>/node_modules'], | |
8 | + testMatch: [ | |
9 | + '**/tests/**/*.[jt]s?(x)', | |
10 | + '**/?(*.)+(spec|test).[tj]s?(x)', | |
11 | + '(/__tests__/.*|(\\.|/)(test|spec))\\.(js|ts)$', | |
12 | + ], | |
13 | + testPathIgnorePatterns: [ | |
14 | + '<rootDir>/tests/server/', | |
15 | + '<rootDir>/tests/__mocks__/', | |
16 | + '/node_modules/', | |
17 | + ], | |
18 | + transform: { | |
19 | + '^.+\\.tsx?$': 'ts-jest', | |
20 | + }, | |
21 | + transformIgnorePatterns: ['<rootDir>/tests/__mocks__/', '/node_modules/'], | |
22 | + // A map from regular expressions to module names that allow to stub out resources with a single module | |
23 | + moduleNameMapper: { | |
24 | + '\\.(vs|fs|vert|frag|glsl|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': | |
25 | + '<rootDir>/tests/__mocks__/fileMock.ts', | |
26 | + '\\.(sass|s?css|less)$': '<rootDir>/tests/__mocks__/styleMock.ts', | |
27 | + '\\?worker$': '<rootDir>/tests/__mocks__/workerMock.ts', | |
28 | + '^/@/(.*)$': '<rootDir>/src/$1', | |
29 | + }, | |
30 | + testEnvironment: 'jsdom', | |
31 | + verbose: true, | |
32 | + collectCoverage: false, | |
33 | + coverageDirectory: 'coverage', | |
34 | + collectCoverageFrom: ['src/**/*.{js,ts,vue}'], | |
35 | + coveragePathIgnorePatterns: ['^.+\\.d\\.ts$'], | |
36 | +}; | ... | ... |
mock/_createProductionServer.ts
0 → 100644
1 | +import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'; | |
2 | + | |
3 | +const modules = import.meta.globEager('./**/*.ts'); | |
4 | + | |
5 | +const mockModules: any[] = []; | |
6 | +Object.keys(modules).forEach((key) => { | |
7 | + if (key.includes('/_')) { | |
8 | + return; | |
9 | + } | |
10 | + mockModules.push(...modules[key].default); | |
11 | +}); | |
12 | + | |
13 | +/** | |
14 | + * Used in a production environment. Need to manually import all modules | |
15 | + */ | |
16 | +export function setupProdMockServer() { | |
17 | + createProdMockServer(mockModules); | |
18 | +} | ... | ... |
mock/_util.ts
0 → 100644
1 | +// Interface data format used to return a unified format | |
2 | + | |
3 | +export function resultSuccess<T = Recordable>(result: T, { message = 'ok' } = {}) { | |
4 | + return { | |
5 | + code: 0, | |
6 | + result, | |
7 | + message, | |
8 | + type: 'success', | |
9 | + }; | |
10 | +} | |
11 | + | |
12 | +export function resultPageSuccess<T = any>( | |
13 | + page: number, | |
14 | + pageSize: number, | |
15 | + list: T[], | |
16 | + { message = 'ok' } = {} | |
17 | +) { | |
18 | + const pageData = pagination(page, pageSize, list); | |
19 | + | |
20 | + return { | |
21 | + ...resultSuccess({ | |
22 | + items: pageData, | |
23 | + total: list.length, | |
24 | + }), | |
25 | + message, | |
26 | + }; | |
27 | +} | |
28 | + | |
29 | +export function resultError(message = 'Request failed', { code = -1, result = null } = {}) { | |
30 | + return { | |
31 | + code, | |
32 | + result, | |
33 | + message, | |
34 | + type: 'error', | |
35 | + }; | |
36 | +} | |
37 | + | |
38 | +export function pagination<T = any>(pageNo: number, pageSize: number, array: T[]): T[] { | |
39 | + const offset = (pageNo - 1) * Number(pageSize); | |
40 | + const ret = | |
41 | + offset + Number(pageSize) >= array.length | |
42 | + ? array.slice(offset, array.length) | |
43 | + : array.slice(offset, offset + Number(pageSize)); | |
44 | + return ret; | |
45 | +} | |
46 | + | |
47 | +export interface requestParams { | |
48 | + method: string; | |
49 | + body: any; | |
50 | + headers?: { authorization?: string }; | |
51 | + query: any; | |
52 | +} | |
53 | + | |
54 | +/** | |
55 | + * @description 本函数用于从request数据中获取token,请根据项目的实际情况修改 | |
56 | + * | |
57 | + */ | |
58 | +export function getRequestToken({ headers }: requestParams): string | undefined { | |
59 | + return headers?.authorization; | |
60 | +} | ... | ... |
mock/demo/account.ts
0 → 100644
1 | +import { MockMethod } from 'vite-plugin-mock'; | |
2 | +import { resultSuccess, resultError } from '../_util'; | |
3 | + | |
4 | +const userInfo = { | |
5 | + name: 'Vben', | |
6 | + userid: '00000001', | |
7 | + email: 'test@gmail.com', | |
8 | + signature: '海纳百川,有容乃大', | |
9 | + introduction: '微笑着,努力着,欣赏着', | |
10 | + title: '交互专家', | |
11 | + group: '某某某事业群-某某平台部-某某技术部-UED', | |
12 | + tags: [ | |
13 | + { | |
14 | + key: '0', | |
15 | + label: '很有想法的', | |
16 | + }, | |
17 | + { | |
18 | + key: '1', | |
19 | + label: '专注设计', | |
20 | + }, | |
21 | + { | |
22 | + key: '2', | |
23 | + label: '辣~', | |
24 | + }, | |
25 | + { | |
26 | + key: '3', | |
27 | + label: '大长腿', | |
28 | + }, | |
29 | + { | |
30 | + key: '4', | |
31 | + label: '川妹子', | |
32 | + }, | |
33 | + { | |
34 | + key: '5', | |
35 | + label: '海纳百川', | |
36 | + }, | |
37 | + ], | |
38 | + notifyCount: 12, | |
39 | + unreadCount: 11, | |
40 | + country: 'China', | |
41 | + address: 'Xiamen City 77', | |
42 | + phone: '0592-268888888', | |
43 | +}; | |
44 | + | |
45 | +export default [ | |
46 | + { | |
47 | + url: '/basic-api/account/getAccountInfo', | |
48 | + timeout: 1000, | |
49 | + method: 'get', | |
50 | + response: () => { | |
51 | + return resultSuccess(userInfo); | |
52 | + }, | |
53 | + }, | |
54 | + { | |
55 | + url: '/basic-api/user/sessionTimeout', | |
56 | + method: 'post', | |
57 | + statusCode: 401, | |
58 | + response: () => { | |
59 | + return resultError(); | |
60 | + }, | |
61 | + }, | |
62 | +] as MockMethod[]; | ... | ... |
mock/demo/select-demo.ts
0 → 100644
1 | +import { MockMethod } from 'vite-plugin-mock'; | |
2 | +import { resultSuccess } from '../_util'; | |
3 | + | |
4 | +const demoList = (keyword) => { | |
5 | + const result = { | |
6 | + list: [] as any[], | |
7 | + }; | |
8 | + for (let index = 0; index < 20; index++) { | |
9 | + result.list.push({ | |
10 | + name: `${keyword ?? ''}选项${index}`, | |
11 | + id: `${index}`, | |
12 | + }); | |
13 | + } | |
14 | + return result; | |
15 | +}; | |
16 | + | |
17 | +export default [ | |
18 | + { | |
19 | + url: '/basic-api/select/getDemoOptions', | |
20 | + timeout: 1000, | |
21 | + method: 'get', | |
22 | + response: ({ query }) => { | |
23 | + const { keyword } = query; | |
24 | + console.log(keyword); | |
25 | + return resultSuccess(demoList(keyword)); | |
26 | + }, | |
27 | + }, | |
28 | +] as MockMethod[]; | ... | ... |
mock/demo/system.ts
0 → 100644
1 | +import { MockMethod } from 'vite-plugin-mock'; | |
2 | +import { resultError, resultPageSuccess, resultSuccess } from '../_util'; | |
3 | + | |
4 | +const accountList = (() => { | |
5 | + const result: any[] = []; | |
6 | + for (let index = 0; index < 20; index++) { | |
7 | + result.push({ | |
8 | + id: `${index}`, | |
9 | + account: '@first', | |
10 | + email: '@email', | |
11 | + nickname: '@cname()', | |
12 | + role: '@first', | |
13 | + createTime: '@datetime', | |
14 | + remark: '@cword(10,20)', | |
15 | + 'status|1': ['0', '1'], | |
16 | + }); | |
17 | + } | |
18 | + return result; | |
19 | +})(); | |
20 | + | |
21 | +const roleList = (() => { | |
22 | + const result: any[] = []; | |
23 | + for (let index = 0; index < 4; index++) { | |
24 | + result.push({ | |
25 | + id: index + 1, | |
26 | + orderNo: `${index + 1}`, | |
27 | + roleName: ['超级管理员', '管理员', '文章管理员', '普通用户'][index], | |
28 | + roleValue: '@first', | |
29 | + createTime: '@datetime', | |
30 | + remark: '@cword(10,20)', | |
31 | + menu: [['0', '1', '2'], ['0', '1'], ['0', '2'], ['2']][index], | |
32 | + 'status|1': ['0', '1'], | |
33 | + }); | |
34 | + } | |
35 | + return result; | |
36 | +})(); | |
37 | + | |
38 | +const deptList = (() => { | |
39 | + const result: any[] = []; | |
40 | + for (let index = 0; index < 3; index++) { | |
41 | + result.push({ | |
42 | + id: `${index}`, | |
43 | + deptName: ['华东分部', '华南分部', '西北分部'][index], | |
44 | + orderNo: index + 1, | |
45 | + createTime: '@datetime', | |
46 | + remark: '@cword(10,20)', | |
47 | + 'status|1': ['0', '0', '1'], | |
48 | + children: (() => { | |
49 | + const children: any[] = []; | |
50 | + for (let j = 0; j < 4; j++) { | |
51 | + children.push({ | |
52 | + id: `${index}-${j}`, | |
53 | + deptName: ['研发部', '市场部', '商务部', '财务部'][j], | |
54 | + orderNo: j + 1, | |
55 | + createTime: '@datetime', | |
56 | + remark: '@cword(10,20)', | |
57 | + 'status|1': ['0', '1'], | |
58 | + parentDept: `${index}`, | |
59 | + children: undefined, | |
60 | + }); | |
61 | + } | |
62 | + return children; | |
63 | + })(), | |
64 | + }); | |
65 | + } | |
66 | + return result; | |
67 | +})(); | |
68 | + | |
69 | +const menuList = (() => { | |
70 | + const result: any[] = []; | |
71 | + for (let index = 0; index < 3; index++) { | |
72 | + result.push({ | |
73 | + id: `${index}`, | |
74 | + icon: ['ion:layers-outline', 'ion:git-compare-outline', 'ion:tv-outline'][index], | |
75 | + component: 'LAYOUT', | |
76 | + type: '0', | |
77 | + menuName: ['Dashboard', '权限管理', '功能'][index], | |
78 | + permission: '', | |
79 | + orderNo: index + 1, | |
80 | + createTime: '@datetime', | |
81 | + 'status|1': ['0', '0', '1'], | |
82 | + children: (() => { | |
83 | + const children: any[] = []; | |
84 | + for (let j = 0; j < 4; j++) { | |
85 | + children.push({ | |
86 | + id: `${index}-${j}`, | |
87 | + type: '1', | |
88 | + menuName: ['菜单1', '菜单2', '菜单3', '菜单4'][j], | |
89 | + icon: 'ion:document', | |
90 | + permission: ['menu1:view', 'menu2:add', 'menu3:update', 'menu4:del'][index], | |
91 | + component: [ | |
92 | + '/dashboard/welcome/index', | |
93 | + '/dashboard/analysis/index', | |
94 | + '/dashboard/workbench/index', | |
95 | + '/dashboard/test/index', | |
96 | + ][j], | |
97 | + orderNo: j + 1, | |
98 | + createTime: '@datetime', | |
99 | + 'status|1': ['0', '1'], | |
100 | + parentMenu: `${index}`, | |
101 | + children: (() => { | |
102 | + const children: any[] = []; | |
103 | + for (let k = 0; k < 4; k++) { | |
104 | + children.push({ | |
105 | + id: `${index}-${j}-${k}`, | |
106 | + type: '2', | |
107 | + menuName: '按钮' + (j + 1) + '-' + (k + 1), | |
108 | + icon: '', | |
109 | + permission: | |
110 | + ['menu1:view', 'menu2:add', 'menu3:update', 'menu4:del'][index] + | |
111 | + ':btn' + | |
112 | + (k + 1), | |
113 | + component: [ | |
114 | + '/dashboard/welcome/index', | |
115 | + '/dashboard/analysis/index', | |
116 | + '/dashboard/workbench/index', | |
117 | + '/dashboard/test/index', | |
118 | + ][j], | |
119 | + orderNo: j + 1, | |
120 | + createTime: '@datetime', | |
121 | + 'status|1': ['0', '1'], | |
122 | + parentMenu: `${index}-${j}`, | |
123 | + children: undefined, | |
124 | + }); | |
125 | + } | |
126 | + return children; | |
127 | + })(), | |
128 | + }); | |
129 | + } | |
130 | + return children; | |
131 | + })(), | |
132 | + }); | |
133 | + } | |
134 | + return result; | |
135 | +})(); | |
136 | + | |
137 | +export default [ | |
138 | + { | |
139 | + url: '/basic-api/system/getAccountList', | |
140 | + timeout: 100, | |
141 | + method: 'get', | |
142 | + response: ({ query }) => { | |
143 | + const { page = 1, pageSize = 20 } = query; | |
144 | + return resultPageSuccess(page, pageSize, accountList); | |
145 | + }, | |
146 | + }, | |
147 | + { | |
148 | + url: '/basic-api/system/getRoleListByPage', | |
149 | + timeout: 100, | |
150 | + method: 'get', | |
151 | + response: ({ query }) => { | |
152 | + const { page = 1, pageSize = 20 } = query; | |
153 | + return resultPageSuccess(page, pageSize, roleList); | |
154 | + }, | |
155 | + }, | |
156 | + { | |
157 | + url: '/basic-api/system/setRoleStatus', | |
158 | + timeout: 500, | |
159 | + method: 'post', | |
160 | + response: ({ query }) => { | |
161 | + const { id, status } = query; | |
162 | + return resultSuccess({ id, status }); | |
163 | + }, | |
164 | + }, | |
165 | + { | |
166 | + url: '/basic-api/system/getAllRoleList', | |
167 | + timeout: 100, | |
168 | + method: 'get', | |
169 | + response: () => { | |
170 | + return resultSuccess(roleList); | |
171 | + }, | |
172 | + }, | |
173 | + { | |
174 | + url: '/basic-api/system/getDeptList', | |
175 | + timeout: 100, | |
176 | + method: 'get', | |
177 | + response: () => { | |
178 | + return resultSuccess(deptList); | |
179 | + }, | |
180 | + }, | |
181 | + { | |
182 | + url: '/basic-api/system/getMenuList', | |
183 | + timeout: 100, | |
184 | + method: 'get', | |
185 | + response: () => { | |
186 | + return resultSuccess(menuList); | |
187 | + }, | |
188 | + }, | |
189 | + { | |
190 | + url: '/basic-api/system/accountExist', | |
191 | + timeout: 500, | |
192 | + method: 'post', | |
193 | + response: ({ body }) => { | |
194 | + const { account } = body || {}; | |
195 | + if (account && account.indexOf('admin') !== -1) { | |
196 | + return resultError('该字段不能包含admin'); | |
197 | + } else { | |
198 | + return resultSuccess(`${account} can use`); | |
199 | + } | |
200 | + }, | |
201 | + }, | |
202 | +] as MockMethod[]; | ... | ... |
mock/demo/table-demo.ts
0 → 100644
1 | +import { MockMethod } from 'vite-plugin-mock'; | |
2 | +import { Random } from 'mockjs'; | |
3 | +import { resultPageSuccess } from '../_util'; | |
4 | + | |
5 | +function getRandomPics(count = 10): string[] { | |
6 | + const arr: string[] = []; | |
7 | + for (let i = 0; i < count; i++) { | |
8 | + arr.push(Random.image('800x600', Random.color(), Random.color(), Random.title())); | |
9 | + } | |
10 | + return arr; | |
11 | +} | |
12 | + | |
13 | +const demoList = (() => { | |
14 | + const result: any[] = []; | |
15 | + for (let index = 0; index < 60; index++) { | |
16 | + result.push({ | |
17 | + id: `${index}`, | |
18 | + beginTime: '@datetime', | |
19 | + endTime: '@datetime', | |
20 | + address: '@city()', | |
21 | + name: '@cname()', | |
22 | + name1: '@cname()', | |
23 | + name2: '@cname()', | |
24 | + name3: '@cname()', | |
25 | + name4: '@cname()', | |
26 | + name5: '@cname()', | |
27 | + name6: '@cname()', | |
28 | + name7: '@cname()', | |
29 | + name8: '@cname()', | |
30 | + avatar: Random.image('400x400', Random.color(), Random.color(), Random.first()), | |
31 | + imgArr: getRandomPics(Math.ceil(Math.random() * 3) + 1), | |
32 | + imgs: getRandomPics(Math.ceil(Math.random() * 3) + 1), | |
33 | + date: `@date('yyyy-MM-dd')`, | |
34 | + time: `@time('HH:mm')`, | |
35 | + 'no|100000-10000000': 100000, | |
36 | + 'status|1': ['normal', 'enable', 'disable'], | |
37 | + }); | |
38 | + } | |
39 | + return result; | |
40 | +})(); | |
41 | + | |
42 | +export default [ | |
43 | + { | |
44 | + url: '/basic-api/table/getDemoList', | |
45 | + timeout: 100, | |
46 | + method: 'get', | |
47 | + response: ({ query }) => { | |
48 | + const { page = 1, pageSize = 20 } = query; | |
49 | + return resultPageSuccess(page, pageSize, demoList); | |
50 | + }, | |
51 | + }, | |
52 | +] as MockMethod[]; | ... | ... |
mock/demo/tree-demo.ts
0 → 100644
1 | +import { MockMethod } from 'vite-plugin-mock'; | |
2 | +import { resultSuccess } from '../_util'; | |
3 | + | |
4 | +const demoTreeList = (keyword) => { | |
5 | + const result = { | |
6 | + list: [] as Recordable[], | |
7 | + }; | |
8 | + for (let index = 0; index < 5; index++) { | |
9 | + const children: Recordable[] = []; | |
10 | + for (let j = 0; j < 3; j++) { | |
11 | + children.push({ | |
12 | + title: `${keyword ?? ''}选项${index}-${j}`, | |
13 | + value: `${index}-${j}`, | |
14 | + key: `${index}-${j}`, | |
15 | + }); | |
16 | + } | |
17 | + result.list.push({ | |
18 | + title: `${keyword ?? ''}选项${index}`, | |
19 | + value: `${index}`, | |
20 | + key: `${index}`, | |
21 | + children, | |
22 | + }); | |
23 | + } | |
24 | + return result; | |
25 | +}; | |
26 | + | |
27 | +export default [ | |
28 | + { | |
29 | + url: '/basic-api/tree/getDemoOptions', | |
30 | + timeout: 1000, | |
31 | + method: 'get', | |
32 | + response: ({ query }) => { | |
33 | + const { keyword } = query; | |
34 | + console.log(keyword); | |
35 | + return resultSuccess(demoTreeList(keyword)); | |
36 | + }, | |
37 | + }, | |
38 | +] as MockMethod[]; | ... | ... |
mock/sys/menu.ts
0 → 100644
1 | +import { resultSuccess, resultError, getRequestToken, requestParams } from '../_util'; | |
2 | +import { MockMethod } from 'vite-plugin-mock'; | |
3 | +import { createFakeUserList } from './user'; | |
4 | + | |
5 | +// single | |
6 | +const dashboardRoute = { | |
7 | + path: '/dashboard', | |
8 | + name: 'Dashboard', | |
9 | + component: 'LAYOUT', | |
10 | + redirect: '/dashboard/analysis', | |
11 | + meta: { | |
12 | + title: 'routes.dashboard.dashboard', | |
13 | + hideChildrenInMenu: true, | |
14 | + icon: 'bx:bx-home', | |
15 | + }, | |
16 | + children: [ | |
17 | + { | |
18 | + path: 'analysis', | |
19 | + name: 'Analysis', | |
20 | + component: '/dashboard/analysis/index', | |
21 | + meta: { | |
22 | + hideMenu: true, | |
23 | + hideBreadcrumb: true, | |
24 | + title: 'routes.dashboard.analysis', | |
25 | + currentActiveMenu: '/dashboard', | |
26 | + icon: 'bx:bx-home', | |
27 | + }, | |
28 | + }, | |
29 | + { | |
30 | + path: 'workbench', | |
31 | + name: 'Workbench', | |
32 | + component: '/dashboard/workbench/index', | |
33 | + meta: { | |
34 | + hideMenu: true, | |
35 | + hideBreadcrumb: true, | |
36 | + title: 'routes.dashboard.workbench', | |
37 | + currentActiveMenu: '/dashboard', | |
38 | + icon: 'bx:bx-home', | |
39 | + }, | |
40 | + }, | |
41 | + ], | |
42 | +}; | |
43 | + | |
44 | +const backRoute = { | |
45 | + path: 'back', | |
46 | + name: 'PermissionBackDemo', | |
47 | + meta: { | |
48 | + title: 'routes.demo.permission.back', | |
49 | + }, | |
50 | + | |
51 | + children: [ | |
52 | + { | |
53 | + path: 'page', | |
54 | + name: 'BackAuthPage', | |
55 | + component: '/demo/permission/back/index', | |
56 | + meta: { | |
57 | + title: 'routes.demo.permission.backPage', | |
58 | + }, | |
59 | + }, | |
60 | + { | |
61 | + path: 'btn', | |
62 | + name: 'BackAuthBtn', | |
63 | + component: '/demo/permission/back/Btn', | |
64 | + meta: { | |
65 | + title: 'routes.demo.permission.backBtn', | |
66 | + }, | |
67 | + }, | |
68 | + ], | |
69 | +}; | |
70 | + | |
71 | +const authRoute = { | |
72 | + path: '/permission', | |
73 | + name: 'Permission', | |
74 | + component: 'LAYOUT', | |
75 | + redirect: '/permission/front/page', | |
76 | + meta: { | |
77 | + icon: 'carbon:user-role', | |
78 | + title: 'routes.demo.permission.permission', | |
79 | + }, | |
80 | + children: [backRoute], | |
81 | +}; | |
82 | + | |
83 | +const levelRoute = { | |
84 | + path: '/level', | |
85 | + name: 'Level', | |
86 | + component: 'LAYOUT', | |
87 | + redirect: '/level/menu1/menu1-1', | |
88 | + meta: { | |
89 | + icon: 'carbon:user-role', | |
90 | + title: 'routes.demo.level.level', | |
91 | + }, | |
92 | + | |
93 | + children: [ | |
94 | + { | |
95 | + path: 'menu1', | |
96 | + name: 'Menu1Demo', | |
97 | + meta: { | |
98 | + title: 'Menu1', | |
99 | + }, | |
100 | + children: [ | |
101 | + { | |
102 | + path: 'menu1-1', | |
103 | + name: 'Menu11Demo', | |
104 | + meta: { | |
105 | + title: 'Menu1-1', | |
106 | + }, | |
107 | + children: [ | |
108 | + { | |
109 | + path: 'menu1-1-1', | |
110 | + name: 'Menu111Demo', | |
111 | + component: '/demo/level/Menu111', | |
112 | + meta: { | |
113 | + title: 'Menu111', | |
114 | + }, | |
115 | + }, | |
116 | + ], | |
117 | + }, | |
118 | + { | |
119 | + path: 'menu1-2', | |
120 | + name: 'Menu12Demo', | |
121 | + component: '/demo/level/Menu12', | |
122 | + meta: { | |
123 | + title: 'Menu1-2', | |
124 | + }, | |
125 | + }, | |
126 | + ], | |
127 | + }, | |
128 | + { | |
129 | + path: 'menu2', | |
130 | + name: 'Menu2Demo', | |
131 | + component: '/demo/level/Menu2', | |
132 | + meta: { | |
133 | + title: 'Menu2', | |
134 | + }, | |
135 | + }, | |
136 | + ], | |
137 | +}; | |
138 | + | |
139 | +const sysRoute = { | |
140 | + path: '/system', | |
141 | + name: 'System', | |
142 | + component: 'LAYOUT', | |
143 | + redirect: '/system/account', | |
144 | + meta: { | |
145 | + icon: 'ion:settings-outline', | |
146 | + title: 'routes.demo.system.moduleName', | |
147 | + }, | |
148 | + children: [ | |
149 | + { | |
150 | + path: 'account', | |
151 | + name: 'AccountManagement', | |
152 | + meta: { | |
153 | + title: 'routes.demo.system.account', | |
154 | + ignoreKeepAlive: true, | |
155 | + }, | |
156 | + component: '/demo/system/account/index', | |
157 | + }, | |
158 | + { | |
159 | + path: 'account_detail/:id', | |
160 | + name: 'AccountDetail', | |
161 | + meta: { | |
162 | + hideMenu: true, | |
163 | + title: 'routes.demo.system.account_detail', | |
164 | + ignoreKeepAlive: true, | |
165 | + showMenu: false, | |
166 | + currentActiveMenu: '/system/account', | |
167 | + }, | |
168 | + component: '/demo/system/account/AccountDetail', | |
169 | + }, | |
170 | + { | |
171 | + path: 'role', | |
172 | + name: 'RoleManagement', | |
173 | + meta: { | |
174 | + title: 'routes.demo.system.role', | |
175 | + ignoreKeepAlive: true, | |
176 | + }, | |
177 | + component: '/demo/system/role/index', | |
178 | + }, | |
179 | + | |
180 | + { | |
181 | + path: 'menu', | |
182 | + name: 'MenuManagement', | |
183 | + meta: { | |
184 | + title: 'routes.demo.system.menu', | |
185 | + ignoreKeepAlive: true, | |
186 | + }, | |
187 | + component: '/demo/system/menu/index', | |
188 | + }, | |
189 | + { | |
190 | + path: 'dept', | |
191 | + name: 'DeptManagement', | |
192 | + meta: { | |
193 | + title: 'routes.demo.system.dept', | |
194 | + ignoreKeepAlive: true, | |
195 | + }, | |
196 | + component: '/demo/system/dept/index', | |
197 | + }, | |
198 | + { | |
199 | + path: 'changePassword', | |
200 | + name: 'ChangePassword', | |
201 | + meta: { | |
202 | + title: 'routes.demo.system.password', | |
203 | + ignoreKeepAlive: true, | |
204 | + }, | |
205 | + component: '/demo/system/password/index', | |
206 | + }, | |
207 | + ], | |
208 | +}; | |
209 | + | |
210 | +const linkRoute = { | |
211 | + path: '/link', | |
212 | + name: 'Link', | |
213 | + component: 'LAYOUT', | |
214 | + meta: { | |
215 | + icon: 'ion:tv-outline', | |
216 | + title: 'routes.demo.iframe.frame', | |
217 | + }, | |
218 | + children: [ | |
219 | + { | |
220 | + path: 'doc', | |
221 | + name: 'Doc', | |
222 | + meta: { | |
223 | + title: 'routes.demo.iframe.doc', | |
224 | + frameSrc: 'https://vvbin.cn/doc-next/', | |
225 | + }, | |
226 | + }, | |
227 | + { | |
228 | + path: 'https://vvbin.cn/doc-next/', | |
229 | + name: 'DocExternal', | |
230 | + component: 'LAYOUT', | |
231 | + meta: { | |
232 | + title: 'routes.demo.iframe.docExternal', | |
233 | + }, | |
234 | + }, | |
235 | + ], | |
236 | +}; | |
237 | + | |
238 | +export default [ | |
239 | + { | |
240 | + url: '/basic-api/getMenuList', | |
241 | + timeout: 1000, | |
242 | + method: 'get', | |
243 | + response: (request: requestParams) => { | |
244 | + const token = getRequestToken(request); | |
245 | + if (!token) { | |
246 | + return resultError('Invalid token!'); | |
247 | + } | |
248 | + const checkUser = createFakeUserList().find((item) => item.token === token); | |
249 | + if (!checkUser) { | |
250 | + return resultError('Invalid user token!'); | |
251 | + } | |
252 | + const id = checkUser.userId; | |
253 | + let menu: Object[]; | |
254 | + switch (id) { | |
255 | + case '1': | |
256 | + dashboardRoute.redirect = dashboardRoute.path + '/' + dashboardRoute.children[0].path; | |
257 | + menu = [dashboardRoute, authRoute, levelRoute, sysRoute, linkRoute]; | |
258 | + break; | |
259 | + case '2': | |
260 | + dashboardRoute.redirect = dashboardRoute.path + '/' + dashboardRoute.children[1].path; | |
261 | + menu = [dashboardRoute, authRoute, levelRoute, linkRoute]; | |
262 | + break; | |
263 | + default: | |
264 | + menu = []; | |
265 | + } | |
266 | + | |
267 | + return resultSuccess(menu); | |
268 | + }, | |
269 | + }, | |
270 | +] as MockMethod[]; | ... | ... |
mock/sys/user.ts
0 → 100644
1 | +import { MockMethod } from 'vite-plugin-mock'; | |
2 | +import { resultError, resultSuccess, getRequestToken, requestParams } from '../_util'; | |
3 | + | |
4 | +export function createFakeUserList() { | |
5 | + return [ | |
6 | + { | |
7 | + userId: '1', | |
8 | + username: 'vben', | |
9 | + realName: 'Vben Admin', | |
10 | + avatar: 'https://q1.qlogo.cn/g?b=qq&nk=190848757&s=640', | |
11 | + desc: 'manager', | |
12 | + password: '123456', | |
13 | + token: 'fakeToken1', | |
14 | + homePath: '/dashboard/analysis', | |
15 | + roles: [ | |
16 | + { | |
17 | + roleName: 'Super Admin', | |
18 | + value: 'super', | |
19 | + }, | |
20 | + ], | |
21 | + }, | |
22 | + { | |
23 | + userId: '2', | |
24 | + username: 'test', | |
25 | + password: '123456', | |
26 | + realName: 'test user', | |
27 | + avatar: 'https://q1.qlogo.cn/g?b=qq&nk=339449197&s=640', | |
28 | + desc: 'tester', | |
29 | + token: 'fakeToken2', | |
30 | + homePath: '/dashboard/workbench', | |
31 | + roles: [ | |
32 | + { | |
33 | + roleName: 'Tester', | |
34 | + value: 'test', | |
35 | + }, | |
36 | + ], | |
37 | + }, | |
38 | + ]; | |
39 | +} | |
40 | + | |
41 | +const fakeCodeList: any = { | |
42 | + '1': ['1000', '3000', '5000'], | |
43 | + | |
44 | + '2': ['2000', '4000', '6000'], | |
45 | +}; | |
46 | +export default [ | |
47 | + // mock user login | |
48 | + { | |
49 | + url: '/auth/login', | |
50 | + timeout: 200, | |
51 | + method: 'post', | |
52 | + response: ({ body }) => { | |
53 | + const { username, password } = body; | |
54 | + const checkUser = createFakeUserList().find( | |
55 | + (item) => item.username === username && password === item.password | |
56 | + ); | |
57 | + if (!checkUser) { | |
58 | + return resultError('Incorrect account or password!'); | |
59 | + } | |
60 | + const { userId, username: _username, token, realName, desc, roles } = checkUser; | |
61 | + return resultSuccess({ | |
62 | + roles, | |
63 | + userId, | |
64 | + username: _username, | |
65 | + token, | |
66 | + realName, | |
67 | + desc, | |
68 | + }); | |
69 | + }, | |
70 | + }, | |
71 | + { | |
72 | + url: '/basic-api/getUserInfo', | |
73 | + method: 'get', | |
74 | + response: (request: requestParams) => { | |
75 | + const token = getRequestToken(request); | |
76 | + if (!token) return resultError('Invalid token'); | |
77 | + const checkUser = createFakeUserList().find((item) => item.token === token); | |
78 | + if (!checkUser) { | |
79 | + return resultError('The corresponding user information was not obtained!'); | |
80 | + } | |
81 | + return resultSuccess(checkUser); | |
82 | + }, | |
83 | + }, | |
84 | + { | |
85 | + url: '/basic-api/getPermCode', | |
86 | + timeout: 200, | |
87 | + method: 'get', | |
88 | + response: (request: requestParams) => { | |
89 | + const token = getRequestToken(request); | |
90 | + if (!token) return resultError('Invalid token'); | |
91 | + const checkUser = createFakeUserList().find((item) => item.token === token); | |
92 | + if (!checkUser) { | |
93 | + return resultError('Invalid token!'); | |
94 | + } | |
95 | + const codeList = fakeCodeList[checkUser.userId]; | |
96 | + | |
97 | + return resultSuccess(codeList); | |
98 | + }, | |
99 | + }, | |
100 | + { | |
101 | + url: '/basic-api/logout', | |
102 | + timeout: 200, | |
103 | + method: 'get', | |
104 | + response: (request: requestParams) => { | |
105 | + const token = getRequestToken(request); | |
106 | + if (!token) return resultError('Invalid token'); | |
107 | + const checkUser = createFakeUserList().find((item) => item.token === token); | |
108 | + if (!checkUser) { | |
109 | + return resultError('Invalid token!'); | |
110 | + } | |
111 | + return resultSuccess(undefined, { message: 'Token has been destroyed' }); | |
112 | + }, | |
113 | + }, | |
114 | +] as MockMethod[]; | ... | ... |
package.json
0 → 100644
1 | +{ | |
2 | + "name": "vben-admin", | |
3 | + "version": "2.7.1", | |
4 | + "author": { | |
5 | + "name": "vben", | |
6 | + "email": "anncwb@126.com", | |
7 | + "url": "https://github.com/anncwb" | |
8 | + }, | |
9 | + "scripts": { | |
10 | + "bootstrap": "yarn install", | |
11 | + "serve": "npm run dev", | |
12 | + "dev": "vite", | |
13 | + "build": "cross-env NODE_ENV=production vite build && esno ./build/script/postBuild.ts", | |
14 | + "build:test": "cross-env vite build --mode test && esno ./build/script/postBuild.ts", | |
15 | + "build:no-cache": "yarn clean:cache && npm run build", | |
16 | + "report": "cross-env REPORT=true npm run build", | |
17 | + "type:check": "vue-tsc --noEmit --skipLibCheck", | |
18 | + "preview": "npm run build && vite preview", | |
19 | + "preview:dist": "vite preview", | |
20 | + "log": "conventional-changelog -p angular -i CHANGELOG.md -s", | |
21 | + "clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite", | |
22 | + "clean:lib": "rimraf node_modules", | |
23 | + "lint:eslint": "eslint --cache --max-warnings 0 \"{src,mock}/**/*.{vue,ts,tsx}\" --fix", | |
24 | + "lint:prettier": "prettier --write \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"", | |
25 | + "lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/", | |
26 | + "lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.js", | |
27 | + "lint:pretty": "pretty-quick --staged", | |
28 | + "test:unit": "jest", | |
29 | + "test:unit-coverage": "jest --coverage", | |
30 | + "test:gzip": "http-server dist --cors --gzip -c-1", | |
31 | + "test:br": "http-server dist --cors --brotli -c-1", | |
32 | + "reinstall": "rimraf yarn.lock && rimraf package.lock.json && rimraf node_modules && npm run bootstrap", | |
33 | + "prepare": "husky install", | |
34 | + "gen:icon": "esno ./build/generate/icon/index.ts" | |
35 | + }, | |
36 | + "dependencies": { | |
37 | + "@iconify/iconify": "^2.0.3", | |
38 | + "@logicflow/core": "^0.6.9", | |
39 | + "@logicflow/extension": "^0.6.9", | |
40 | + "@vueuse/core": "^5.3.0", | |
41 | + "@zxcvbn-ts/core": "^1.0.0-beta.0", | |
42 | + "ant-design-vue": "2.2.6", | |
43 | + "axios": "^0.21.1", | |
44 | + "codemirror": "^5.62.2", | |
45 | + "cropperjs": "^1.5.12", | |
46 | + "crypto-js": "^4.1.1", | |
47 | + "echarts": "^5.1.2", | |
48 | + "intro.js": "^4.1.0", | |
49 | + "jwt-decode": "^3.1.2", | |
50 | + "lodash-es": "^4.17.21", | |
51 | + "mockjs": "^1.1.0", | |
52 | + "nprogress": "^0.2.0", | |
53 | + "path-to-regexp": "^6.2.0", | |
54 | + "pinia": "2.0.0-rc.4", | |
55 | + "print-js": "^1.6.0", | |
56 | + "qrcode": "^1.4.4", | |
57 | + "resize-observer-polyfill": "^1.5.1", | |
58 | + "sortablejs": "^1.14.0", | |
59 | + "tinymce": "^5.8.2", | |
60 | + "vditor": "^3.8.6", | |
61 | + "vue": "3.2.2", | |
62 | + "vue-i18n": "9.1.7", | |
63 | + "vue-json-pretty": "^2.0.4", | |
64 | + "vue-router": "^4.0.11", | |
65 | + "vue-types": "^4.0.3", | |
66 | + "xlsx": "^0.17.0" | |
67 | + }, | |
68 | + "devDependencies": { | |
69 | + "@commitlint/cli": "^13.1.0", | |
70 | + "@commitlint/config-conventional": "^13.1.0", | |
71 | + "@iconify/json": "^1.1.386", | |
72 | + "@purge-icons/generated": "^0.7.0", | |
73 | + "@types/codemirror": "^5.60.2", | |
74 | + "@types/crypto-js": "^4.0.2", | |
75 | + "@types/fs-extra": "^9.0.12", | |
76 | + "@types/inquirer": "^7.3.3", | |
77 | + "@types/intro.js": "^3.0.2", | |
78 | + "@types/jest": "^27.0.1", | |
79 | + "@types/lodash-es": "^4.17.4", | |
80 | + "@types/mockjs": "^1.0.4", | |
81 | + "@types/node": "^16.6.1", | |
82 | + "@types/nprogress": "^0.2.0", | |
83 | + "@types/qrcode": "^1.4.1", | |
84 | + "@types/qs": "^6.9.7", | |
85 | + "@types/sortablejs": "^1.10.7", | |
86 | + "@typescript-eslint/eslint-plugin": "^4.29.1", | |
87 | + "@typescript-eslint/parser": "^4.29.1", | |
88 | + "@vitejs/plugin-legacy": "^1.5.1", | |
89 | + "@vitejs/plugin-vue": "^1.4.0", | |
90 | + "@vitejs/plugin-vue-jsx": "^1.1.7", | |
91 | + "@vue/compiler-sfc": "3.2.2", | |
92 | + "@vue/test-utils": "^2.0.0-rc.12", | |
93 | + "autoprefixer": "^10.3.1", | |
94 | + "commitizen": "^4.2.4", | |
95 | + "conventional-changelog-cli": "^2.1.1", | |
96 | + "cross-env": "^7.0.3", | |
97 | + "dotenv": "^10.0.0", | |
98 | + "eslint": "^7.32.0", | |
99 | + "eslint-config-prettier": "^8.3.0", | |
100 | + "eslint-define-config": "^1.0.9", | |
101 | + "eslint-plugin-jest": "^24.4.0", | |
102 | + "eslint-plugin-prettier": "^3.4.0", | |
103 | + "eslint-plugin-vue": "^7.16.0", | |
104 | + "esno": "^0.8.0", | |
105 | + "fs-extra": "^10.0.0", | |
106 | + "http-server": "^13.0.0", | |
107 | + "husky": "^7.0.1", | |
108 | + "inquirer": "^8.1.2", | |
109 | + "is-ci": "^3.0.0", | |
110 | + "jest": "^27.0.6", | |
111 | + "less": "^4.1.1", | |
112 | + "lint-staged": "^11.1.2", | |
113 | + "npm-run-all": "^4.1.5", | |
114 | + "postcss": "^8.3.6", | |
115 | + "prettier": "^2.3.2", | |
116 | + "pretty-quick": "^3.1.1", | |
117 | + "rimraf": "^3.0.2", | |
118 | + "rollup-plugin-visualizer": "5.5.2", | |
119 | + "stylelint": "^13.13.1", | |
120 | + "stylelint-config-prettier": "^8.0.2", | |
121 | + "stylelint-config-standard": "^22.0.0", | |
122 | + "stylelint-order": "^4.1.0", | |
123 | + "ts-jest": "^27.0.4", | |
124 | + "ts-node": "^10.2.0", | |
125 | + "typescript": "4.3.5", | |
126 | + "vite": "2.5.0", | |
127 | + "vite-plugin-compression": "^0.3.3", | |
128 | + "vite-plugin-html": "^2.0.7", | |
129 | + "vite-plugin-imagemin": "^0.4.3", | |
130 | + "vite-plugin-mock": "^2.9.4", | |
131 | + "vite-plugin-purge-icons": "^0.7.0", | |
132 | + "vite-plugin-pwa": "^0.10.0", | |
133 | + "vite-plugin-style-import": "^1.1.1", | |
134 | + "vite-plugin-svg-icons": "^1.0.4", | |
135 | + "vite-plugin-theme": "^0.8.1", | |
136 | + "vite-plugin-windicss": "^1.2.7", | |
137 | + "vue-eslint-parser": "^7.10.0", | |
138 | + "vue-tsc": "^0.2.3" | |
139 | + }, | |
140 | + "resolutions": { | |
141 | + "//": "Used to install imagemin dependencies, because imagemin may not be installed in China. If it is abroad, you can delete it", | |
142 | + "bin-wrapper": "npm:bin-wrapper-china", | |
143 | + "rollup": "^2.56.2" | |
144 | + }, | |
145 | + "homepage": "https://github.com/anncwb/vue-vben-admin", | |
146 | + "engines": { | |
147 | + "node": "^12 || >=14" | |
148 | + } | |
149 | +} | ... | ... |
pom.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<project xmlns="http://maven.apache.org/POM/4.0.0" | |
3 | + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
4 | + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |
5 | + <parent> | |
6 | + <artifactId>fast-iot</artifactId> | |
7 | + <groupId>com.codeez</groupId> | |
8 | + <version>0.0.1</version> | |
9 | + </parent> | |
10 | + <modelVersion>4.0.0</modelVersion> | |
11 | + <packaging>jar</packaging> | |
12 | + | |
13 | + <artifactId>fast-iot-ui</artifactId> | |
14 | + | |
15 | + <properties> | |
16 | + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |
17 | + <main.dir>${basedir}/..</main.dir> | |
18 | + </properties> | |
19 | + <build> | |
20 | + <resources> | |
21 | + <resource> | |
22 | + <directory>${project.build.directory}/generated-resources</directory> | |
23 | + </resource> | |
24 | + </resources> | |
25 | + <plugins> | |
26 | + <plugin> | |
27 | + <groupId>com.github.eirslett</groupId> | |
28 | + <artifactId>frontend-maven-plugin</artifactId> | |
29 | + <version>1.7.5</version> | |
30 | + <configuration> | |
31 | + <installDirectory>target</installDirectory> | |
32 | + <workingDirectory>${basedir}</workingDirectory> | |
33 | + </configuration> | |
34 | + <executions> | |
35 | + <execution> | |
36 | + <id>install node and npm</id> | |
37 | + <goals> | |
38 | + <goal>install-node-and-yarn</goal> | |
39 | + </goals> | |
40 | + <configuration> | |
41 | + <nodeVersion>v12.16.1</nodeVersion> | |
42 | + <yarnVersion>v1.22.4</yarnVersion> | |
43 | + </configuration> | |
44 | + </execution> | |
45 | + <execution> | |
46 | + <id>yarn install</id> | |
47 | + <goals> | |
48 | + <goal>yarn</goal> | |
49 | + </goals> | |
50 | + <configuration> | |
51 | + <arguments>install</arguments> | |
52 | + </configuration> | |
53 | + </execution> | |
54 | + </executions> | |
55 | + </plugin> | |
56 | + </plugins> | |
57 | + </build> | |
58 | + <profiles> | |
59 | + <profile> | |
60 | + <id>yarn-build</id> | |
61 | + <activation> | |
62 | + <activeByDefault>true</activeByDefault> | |
63 | + </activation> | |
64 | + <build> | |
65 | + <plugins> | |
66 | + <plugin> | |
67 | + <groupId>com.github.eirslett</groupId> | |
68 | + <artifactId>frontend-maven-plugin</artifactId> | |
69 | + <version>1.7.5</version> | |
70 | + <configuration> | |
71 | + <installDirectory>target</installDirectory> | |
72 | + <workingDirectory>${basedir}</workingDirectory> | |
73 | + </configuration> | |
74 | + <executions> | |
75 | + <execution> | |
76 | + <id>yarn build</id> | |
77 | + <goals> | |
78 | + <goal>yarn</goal> | |
79 | + </goals> | |
80 | + <configuration> | |
81 | + <arguments>build</arguments> | |
82 | + </configuration> | |
83 | + </execution> | |
84 | + </executions> | |
85 | + </plugin> | |
86 | + </plugins> | |
87 | + </build> | |
88 | + </profile> | |
89 | +<!-- <profile>--> | |
90 | +<!-- <id>yarn-serve</id>--> | |
91 | +<!-- <activation>--> | |
92 | +<!-- <property>--> | |
93 | +<!-- <name>yarn-serve</name>--> | |
94 | +<!-- </property>--> | |
95 | +<!-- </activation>--> | |
96 | +<!-- <build>--> | |
97 | +<!-- <plugins>--> | |
98 | +<!-- <plugin>--> | |
99 | +<!-- <groupId>com.github.eirslett</groupId>--> | |
100 | +<!-- <artifactId>frontend-maven-plugin</artifactId>--> | |
101 | +<!-- <version>1.7.5</version>--> | |
102 | +<!-- <configuration>--> | |
103 | +<!-- <installDirectory>target</installDirectory>--> | |
104 | +<!-- <workingDirectory>${basedir}</workingDirectory>--> | |
105 | +<!-- </configuration>--> | |
106 | +<!-- <executions>--> | |
107 | +<!-- <execution>--> | |
108 | +<!-- <id>yarn serve</id>--> | |
109 | +<!-- <goals>--> | |
110 | +<!-- <goal>yarn</goal>--> | |
111 | +<!-- </goals>--> | |
112 | +<!-- <configuration>--> | |
113 | +<!-- <arguments>serve</arguments>--> | |
114 | +<!-- </configuration>--> | |
115 | +<!-- </execution>--> | |
116 | +<!-- </executions>--> | |
117 | +<!-- </plugin>--> | |
118 | +<!-- </plugins>--> | |
119 | +<!-- </build>--> | |
120 | +<!-- </profile>--> | |
121 | + </profiles> | |
122 | + | |
123 | +</project> | ... | ... |
postcss.config.js
0 → 100644
prettier.config.js
0 → 100644
1 | +module.exports = { | |
2 | + printWidth: 100, | |
3 | + tabWidth: 2, | |
4 | + useTabs: false, | |
5 | + semi: true, | |
6 | + vueIndentScriptAndStyle: true, | |
7 | + singleQuote: true, | |
8 | + quoteProps: 'as-needed', | |
9 | + bracketSpacing: true, | |
10 | + trailingComma: 'es5', | |
11 | + jsxBracketSameLine: false, | |
12 | + jsxSingleQuote: false, | |
13 | + arrowParens: 'always', | |
14 | + insertPragma: false, | |
15 | + requirePragma: false, | |
16 | + proseWrap: 'never', | |
17 | + htmlWhitespaceSensitivity: 'strict', | |
18 | + endOfLine: 'auto', | |
19 | + rangeStart: 0, | |
20 | +}; | ... | ... |
public/favicon.ico
0 → 100644
No preview for this file type
public/resource/img/logo.png
0 → 100644
3.95 KB
public/resource/img/pwa-192x192.png
0 → 100644
11.9 KB
public/resource/img/pwa-512x512.png
0 → 100644
51.4 KB
public/resource/tinymce/langs/en.js
0 → 100644
1 | +tinymce.addI18n('es', { | |
2 | + Redo: 'Rehacer', | |
3 | + Undo: 'Deshacer', | |
4 | + Cut: 'Cortar', | |
5 | + Copy: 'Copiar', | |
6 | + Paste: 'Pegar', | |
7 | + 'Select all': 'Seleccionar todo', | |
8 | + 'New document': 'Nuevo documento', | |
9 | + Ok: 'Ok', | |
10 | + Cancel: 'Cancelar', | |
11 | + 'Visual aids': 'Ayudas visuales', | |
12 | + Bold: 'Negrita', | |
13 | + Italic: 'Cursiva', | |
14 | + Underline: 'Subrayado', | |
15 | + Strikethrough: 'Tachado', | |
16 | + Superscript: 'Super\u00edndice', | |
17 | + Subscript: 'Sub\u00edndice', | |
18 | + 'Clear formatting': 'Limpiar formato', | |
19 | + 'Align left': 'Alinear a la izquierda', | |
20 | + 'Align center': 'Alinear al centro', | |
21 | + 'Align right': 'Alinear a la derecha', | |
22 | + Justify: 'Justificar', | |
23 | + 'Bullet list': 'Lista de vi\u00f1etas', | |
24 | + 'Numbered list': 'Lista numerada', | |
25 | + 'Decrease indent': 'Disminuir sangr\u00eda', | |
26 | + 'Increase indent': 'Incrementar sangr\u00eda', | |
27 | + Close: 'Cerrar', | |
28 | + Formats: 'Formatos', | |
29 | + "Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": 'Su navegador no es compatible con el acceso directo al portapapeles. Use las teclas Crtl+X\/C\/V de su teclado.', | |
30 | + Headers: 'Encabezados', | |
31 | + 'Header 1': 'Encabezado 1', | |
32 | + 'Header 2': 'Encabezado 2', | |
33 | + 'Header 3': 'Encabezado 3', | |
34 | + 'Header 4': 'Encabezado 4', | |
35 | + 'Header 5': 'Encabezado 5', | |
36 | + 'Header 6': 'Encabezado 6', | |
37 | + Headings: 'Encabezados', | |
38 | + 'Heading 1': 'Encabezado 1', | |
39 | + 'Heading 2': 'Encabezado 2', | |
40 | + 'Heading 3': 'Encabezado 3', | |
41 | + 'Heading 4': 'Encabezado 4', | |
42 | + 'Heading 5': 'Encabezado 5', | |
43 | + 'Heading 6': 'Encabezado 6', | |
44 | + Preformatted: 'Con formato previo', | |
45 | + Div: 'Div', | |
46 | + Pre: 'Pre', | |
47 | + Code: 'C\u00f3digo', | |
48 | + Paragraph: 'P\u00e1rrafo', | |
49 | + Blockquote: 'Blockquote', | |
50 | + Inline: 'Alineado', | |
51 | + Blocks: 'Bloques', | |
52 | + 'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.': 'Pegar est\u00e1 ahora en modo de texto plano. El contenido se pegar\u00e1 como texto plano hasta que desactive esta opci\u00f3n.', | |
53 | + Fonts: 'Fuentes', | |
54 | + 'Font Sizes': 'Tama\u00f1os de fuente', | |
55 | + Class: 'Clase', | |
56 | + 'Browse for an image': 'Buscar una imagen', | |
57 | + OR: 'OR', | |
58 | + 'Drop an image here': 'Arrastre una imagen aqu\u00ed', | |
59 | + Upload: 'Cargar', | |
60 | + Block: 'Bloque', | |
61 | + Align: 'Alinear', | |
62 | + Default: 'Por defecto', | |
63 | + Circle: 'C\u00edrculo', | |
64 | + Disc: 'Disco', | |
65 | + Square: 'Cuadrado', | |
66 | + 'Lower Alpha': 'Inferior Alfa', | |
67 | + 'Lower Greek': 'Inferior Griega', | |
68 | + 'Lower Roman': 'Inferior Romana', | |
69 | + 'Upper Alpha': 'Superior Alfa', | |
70 | + 'Upper Roman': 'Superior Romana', | |
71 | + 'Anchor...': 'Anclaje...', | |
72 | + Name: 'Nombre', | |
73 | + Id: 'Id', | |
74 | + 'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.': 'Deber\u00eda comenzar por una letra, seguida solo de letras, n\u00fameros, guiones, puntos, dos puntos o guiones bajos.', | |
75 | + 'You have unsaved changes are you sure you want to navigate away?': 'Tiene cambios sin guardar. \u00bfEst\u00e1 seguro de que quiere salir?', | |
76 | + 'Restore last draft': 'Restaurar el \u00faltimo borrador', | |
77 | + 'Special character...': 'Car\u00e1cter especial...', | |
78 | + 'Source code': 'C\u00f3digo fuente', | |
79 | + 'Insert\/Edit code sample': 'Insertar\/editar c\u00f3digo de prueba', | |
80 | + Language: 'Idioma', | |
81 | + 'Code sample...': 'Ejemplo de c\u00f3digo...', | |
82 | + 'Color Picker': 'Selector de colores', | |
83 | + R: 'R', | |
84 | + G: 'V', | |
85 | + B: 'A', | |
86 | + 'Left to right': 'De izquierda a derecha', | |
87 | + 'Right to left': 'De derecha a izquierda', | |
88 | + 'Emoticons...': 'Emoticones...', | |
89 | + 'Metadata and Document Properties': 'Metadatos y propiedades del documento', | |
90 | + Title: 'T\u00edtulo', | |
91 | + Keywords: 'Palabras clave', | |
92 | + Description: 'Descripci\u00f3n', | |
93 | + Robots: 'Robots', | |
94 | + Author: 'Autor', | |
95 | + Encoding: 'Codificaci\u00f3n', | |
96 | + Fullscreen: 'Pantalla completa', | |
97 | + Action: 'Acci\u00f3n', | |
98 | + Shortcut: 'Atajo', | |
99 | + Help: 'Ayuda', | |
100 | + Address: 'Direcci\u00f3n', | |
101 | + 'Focus to menubar': 'Enfocar la barra del men\u00fa', | |
102 | + 'Focus to toolbar': 'Enfocar la barra de herramientas', | |
103 | + 'Focus to element path': 'Enfocar la ruta del elemento', | |
104 | + 'Focus to contextual toolbar': 'Enfocar la barra de herramientas contextual', | |
105 | + 'Insert link (if link plugin activated)': 'Insertar enlace (si el complemento de enlace est\u00e1 activado)', | |
106 | + 'Save (if save plugin activated)': 'Guardar (si el componente de salvar est\u00e1 activado)', | |
107 | + 'Find (if searchreplace plugin activated)': 'Buscar (si el complemento buscar-remplazar est\u00e1 activado)', | |
108 | + 'Plugins installed ({0}):': 'Plugins instalados ({0}):', | |
109 | + 'Premium plugins:': 'Complementos premium:', | |
110 | + 'Learn more...': 'Aprende m\u00e1s...', | |
111 | + 'You are using {0}': 'Estas usando {0}', | |
112 | + Plugins: 'Complementos', | |
113 | + 'Handy Shortcuts': 'Accesos directos', | |
114 | + 'Horizontal line': 'L\u00ednea horizontal', | |
115 | + 'Insert\/edit image': 'Insertar\/editar imagen', | |
116 | + 'Image description': 'Descripci\u00f3n de la imagen', | |
117 | + Source: 'Enlace', | |
118 | + Dimensions: 'Dimensiones', | |
119 | + 'Constrain proportions': 'Restringir proporciones', | |
120 | + General: 'General', | |
121 | + Advanced: 'Avanzado', | |
122 | + Style: 'Estilo', | |
123 | + 'Vertical space': 'Espacio vertical', | |
124 | + 'Horizontal space': 'Espacio horizontal', | |
125 | + Border: 'Borde', | |
126 | + 'Insert image': 'Insertar imagen', | |
127 | + 'Image...': 'Imagen...', | |
128 | + 'Image list': 'Lista de im\u00e1genes', | |
129 | + 'Rotate counterclockwise': 'Girar a la izquierda', | |
130 | + 'Rotate clockwise': 'Girar a la derecha', | |
131 | + 'Flip vertically': 'Invertir verticalmente', | |
132 | + 'Flip horizontally': 'Invertir horizontalmente', | |
133 | + 'Edit image': 'Editar imagen', | |
134 | + 'Image options': 'Opciones de imagen', | |
135 | + 'Zoom in': 'Acercar', | |
136 | + 'Zoom out': 'Alejar', | |
137 | + Crop: 'Recortar', | |
138 | + Resize: 'Redimensionar', | |
139 | + Orientation: 'Orientaci\u00f3n', | |
140 | + Brightness: 'Brillo', | |
141 | + Sharpen: 'Forma', | |
142 | + Contrast: 'Contraste', | |
143 | + 'Color levels': 'Niveles de color', | |
144 | + Gamma: 'Gamma', | |
145 | + Invert: 'Invertir', | |
146 | + Apply: 'Aplicar', | |
147 | + Back: 'Atr\u00e1s', | |
148 | + 'Insert date\/time': 'Insertar fecha\/hora', | |
149 | + 'Date\/time': 'Fecha\/hora', | |
150 | + 'Insert\/Edit Link': 'Insertar\/editar enlace', | |
151 | + 'Insert\/edit link': 'Insertar\/editar enlace', | |
152 | + 'Text to display': 'Texto para mostrar', | |
153 | + Url: 'URL', | |
154 | + 'Open link in...': 'Abrir enlace en...', | |
155 | + 'Current window': 'Ventana actual', | |
156 | + None: 'Ninguno', | |
157 | + 'New window': 'Nueva ventana', | |
158 | + 'Remove link': 'Quitar enlace', | |
159 | + Anchors: 'Anclas', | |
160 | + 'Link...': 'Enlace...', | |
161 | + 'Paste or type a link': 'Pega o introduce un enlace', | |
162 | + 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?': 'El enlace que has introducido no parece ser una direcci\u00f3n de correo electr\u00f3nico. Quieres a\u00f1adir el prefijo necesario mailto: ?', | |
163 | + 'The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?': 'El enlace que has introducido no parece ser una enlace externo. Quieres a\u00f1adir el prefijo necesario http:\/\/ ?', | |
164 | + 'Link list': 'Lista de enlaces', | |
165 | + 'Insert video': 'Insertar video', | |
166 | + 'Insert\/edit video': 'Insertar\/editar video', | |
167 | + 'Insert\/edit media': 'Insertar\/editar medio', | |
168 | + 'Alternative source': 'Enlace alternativo', | |
169 | + 'Alternative source URL': 'Origen de URL alternativo', | |
170 | + 'Media poster (Image URL)': 'P\u00f3ster de medio (URL de imagen)', | |
171 | + 'Paste your embed code below:': 'Pega tu c\u00f3digo embebido debajo', | |
172 | + Embed: 'Incrustado', | |
173 | + 'Media...': 'Medios...', | |
174 | + 'Nonbreaking space': 'Espacio fijo', | |
175 | + 'Page break': 'Salto de p\u00e1gina', | |
176 | + 'Paste as text': 'Pegar como texto', | |
177 | + Preview: 'Previsualizar', | |
178 | + 'Print...': 'Imprimir...', | |
179 | + Save: 'Guardar', | |
180 | + Find: 'Buscar', | |
181 | + 'Replace with': 'Reemplazar con', | |
182 | + Replace: 'Reemplazar', | |
183 | + 'Replace all': 'Reemplazar todo', | |
184 | + Previous: 'Anterior', | |
185 | + Next: 'Siguiente', | |
186 | + 'Find and replace...': 'Buscar y reemplazar...', | |
187 | + 'Could not find the specified string.': 'No se encuentra la cadena de texto especificada', | |
188 | + 'Match case': 'Coincidencia exacta', | |
189 | + 'Find whole words only': 'Solo palabras completas', | |
190 | + 'Spell check': 'Revisar ortograf\u00eda', | |
191 | + Ignore: 'Ignorar', | |
192 | + 'Ignore all': 'Ignorar todos', | |
193 | + Finish: 'Finalizar', | |
194 | + 'Add to Dictionary': 'A\u00f1adir al Diccionario', | |
195 | + 'Insert table': 'Insertar tabla', | |
196 | + 'Table properties': 'Propiedades de la tabla', | |
197 | + 'Delete table': 'Eliminar tabla', | |
198 | + Cell: 'Celda', | |
199 | + Row: 'Fila', | |
200 | + Column: 'Columna', | |
201 | + 'Cell properties': 'Propiedades de la celda', | |
202 | + 'Merge cells': 'Combinar celdas', | |
203 | + 'Split cell': 'Dividir celdas', | |
204 | + 'Insert row before': 'Insertar fila antes', | |
205 | + 'Insert row after': 'Insertar fila despu\u00e9s ', | |
206 | + 'Delete row': 'Eliminar fila', | |
207 | + 'Row properties': 'Propiedades de la fila', | |
208 | + 'Cut row': 'Cortar fila', | |
209 | + 'Copy row': 'Copiar fila', | |
210 | + 'Paste row before': 'Pegar la fila antes', | |
211 | + 'Paste row after': 'Pegar la fila despu\u00e9s', | |
212 | + 'Insert column before': 'Insertar columna antes', | |
213 | + 'Insert column after': 'Insertar columna despu\u00e9s', | |
214 | + 'Delete column': 'Eliminar columna', | |
215 | + Cols: 'Columnas', | |
216 | + Rows: 'Filas', | |
217 | + Width: 'Ancho', | |
218 | + Height: 'Alto', | |
219 | + 'Cell spacing': 'Espacio entre celdas', | |
220 | + 'Cell padding': 'Relleno de celda', | |
221 | + 'Show caption': 'Mostrar t\u00edtulo', | |
222 | + Left: 'Izquierda', | |
223 | + Center: 'Centrado', | |
224 | + Right: 'Derecha', | |
225 | + 'Cell type': 'Tipo de celda', | |
226 | + Scope: '\u00c1mbito', | |
227 | + Alignment: 'Alineaci\u00f3n', | |
228 | + 'H Align': 'Alineamiento Horizontal', | |
229 | + 'V Align': 'Alineamiento Vertical', | |
230 | + Top: 'Arriba', | |
231 | + Middle: 'Centro', | |
232 | + Bottom: 'Abajo', | |
233 | + 'Header cell': 'Celda de la cebecera', | |
234 | + 'Row group': 'Grupo de filas', | |
235 | + 'Column group': 'Grupo de columnas', | |
236 | + 'Row type': 'Tipo de fila', | |
237 | + Header: 'Cabecera', | |
238 | + Body: 'Cuerpo', | |
239 | + Footer: 'Pie de p\u00e1gina', | |
240 | + 'Border color': 'Color del borde', | |
241 | + 'Insert template...': 'Insertar plantilla...', | |
242 | + Templates: 'Plantillas', | |
243 | + Template: 'Plantilla', | |
244 | + 'Text color': 'Color del texto', | |
245 | + 'Background color': 'Color de fondo', | |
246 | + 'Custom...': 'Personalizar...', | |
247 | + 'Custom color': 'Color personalizado', | |
248 | + 'No color': 'Sin color', | |
249 | + 'Remove color': 'Quitar color', | |
250 | + 'Table of Contents': 'Tabla de contenidos', | |
251 | + 'Show blocks': 'Mostrar bloques', | |
252 | + 'Show invisible characters': 'Mostrar caracteres invisibles', | |
253 | + 'Word count': 'Contar palabras', | |
254 | + Count: 'Recuento', | |
255 | + Document: 'Documento', | |
256 | + Selection: 'Selecci\u00f3n', | |
257 | + Words: 'Palabras', | |
258 | + 'Words: {0}': 'Palabras: {0}', | |
259 | + '{0} words': '{0} palabras', | |
260 | + File: 'Archivo', | |
261 | + Edit: 'Editar', | |
262 | + Insert: 'Insertar', | |
263 | + View: 'Ver', | |
264 | + Format: 'Formato', | |
265 | + Table: 'Tabla', | |
266 | + Tools: 'Herramientas', | |
267 | + 'Powered by {0}': 'Desarrollado por {0}', | |
268 | + 'Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help': '\u00c1rea de texto enriquecido. Pulse ALT-F9 para el menu. Pulse ALT-F10 para la barra de herramientas. Pulse ALT-0 para ayuda', | |
269 | + 'Image title': 'Titulo de imagen', | |
270 | + 'Border width': 'Ancho de borde', | |
271 | + 'Border style': 'Estilo de borde', | |
272 | + Error: 'Error', | |
273 | + Warn: 'Advertencia', | |
274 | + Valid: 'V\u00e1lido', | |
275 | + 'To open the popup, press Shift+Enter': 'Para abrir el elemento emergente, pulse May\u00fas+Intro', | |
276 | + 'Rich Text Area. Press ALT-0 for help.': '\u00c1rea de texto enriquecido. Pulse ALT-0 para abrir la ayuda.', | |
277 | + 'System Font': 'Fuente de sistema', | |
278 | + 'Failed to upload image: {0}': 'Fallo al cargar imagen: {0}', | |
279 | + 'Failed to load plugin: {0} from url {1}': 'Fallo al cargar complemento: {0} desde URL {1}', | |
280 | + 'Failed to load plugin url: {0}': 'Fallo al cargar URL del complemento: {0}', | |
281 | + 'Failed to initialize plugin: {0}': 'Fallo al iniciar el complemento: {0}', | |
282 | + example: 'ejemplo', | |
283 | + Search: 'Buscar', | |
284 | + All: 'Todo', | |
285 | + Currency: 'Divisa', | |
286 | + Text: 'Texto', | |
287 | + Quotations: 'Comillas', | |
288 | + Mathematical: 'S\u00edmbolo matem\u00e1tico', | |
289 | + 'Extended Latin': 'Latino extendido A', | |
290 | + Symbols: 'S\u00edmbolos', | |
291 | + Arrows: 'Flechas', | |
292 | + 'User Defined': 'Definido por el usuario', | |
293 | + 'dollar sign': 'signo de d\u00f3lar', | |
294 | + 'currency sign': 'signo de divisa', | |
295 | + 'euro-currency sign': 'signo de euro', | |
296 | + 'colon sign': 'signo de dos puntos', | |
297 | + 'cruzeiro sign': 'signo de cruceiro', | |
298 | + 'french franc sign': 'signo de franco franc\u00e9s', | |
299 | + 'lira sign': 'signo de lira', | |
300 | + 'mill sign': 'signo de mill', | |
301 | + 'naira sign': 'signo de naira', | |
302 | + 'peseta sign': 'signo de peseta', | |
303 | + 'rupee sign': 'signo de rupia', | |
304 | + 'won sign': 'signo de won', | |
305 | + 'new sheqel sign': 'signo de nuevo s\u00e9quel', | |
306 | + 'dong sign': 'signo de dong', | |
307 | + 'kip sign': 'signo de kip', | |
308 | + 'tugrik sign': 'signo de tugrik', | |
309 | + 'drachma sign': 'signo de dracma', | |
310 | + 'german penny symbol': 'signo de penique alem\u00e1n', | |
311 | + 'peso sign': 'signo de peso', | |
312 | + 'guarani sign': 'signo de guaran\u00ed', | |
313 | + 'austral sign': 'signo de austral', | |
314 | + 'hryvnia sign': 'signo de grivna', | |
315 | + 'cedi sign': 'signo de cedi', | |
316 | + 'livre tournois sign': 'signo de libra tornesa', | |
317 | + 'spesmilo sign': 'signo de spesmilo', | |
318 | + 'tenge sign': 'signo de tenge', | |
319 | + 'indian rupee sign': 'signo de rupia india', | |
320 | + 'turkish lira sign': 'signo de lira turca', | |
321 | + 'nordic mark sign': 'signo de marco n\u00f3rdico', | |
322 | + 'manat sign': 'signo de manat', | |
323 | + 'ruble sign': 'signo de rublo', | |
324 | + 'yen character': 'car\u00e1cter de yen', | |
325 | + 'yuan character': 'car\u00e1cter de yuan', | |
326 | + 'yuan character, in hong kong and taiwan': 'car\u00e1cter de yuan en Hong Kong y Taiw\u00e1n', | |
327 | + 'yen\/yuan character variant one': 'Variante uno de car\u00e1cter de yen\/yuan', | |
328 | + 'Loading emoticons...': 'Cargando emoticonos...', | |
329 | + 'Could not load emoticons': 'No se han podido cargar los emoticonos', | |
330 | + People: 'Personas', | |
331 | + 'Animals and Nature': 'Animales y naturaleza', | |
332 | + 'Food and Drink': 'Comida y bebida', | |
333 | + Activity: 'Actividad', | |
334 | + 'Travel and Places': 'Viajes y lugares', | |
335 | + Objects: 'Objetos', | |
336 | + Flags: 'Banderas', | |
337 | + Characters: 'Caracteres', | |
338 | + 'Characters (no spaces)': 'Caracteres (sin espacios)', | |
339 | + '{0} characters': '{0} caracteres', | |
340 | + 'Error: Form submit field collision.': 'Error: Colisi\u00f3n de campo al enviar formulario.', | |
341 | + 'Error: No form element found.': 'Error: No se encuentra ning\u00fan elemento de formulario.', | |
342 | + Update: 'Actualizar', | |
343 | + 'Color swatch': 'Muestrario de colores', | |
344 | + Turquoise: 'Turquesa', | |
345 | + Green: 'Verde', | |
346 | + Blue: 'Azul', | |
347 | + Purple: 'P\u00farpura', | |
348 | + 'Navy Blue': 'Azul marino', | |
349 | + 'Dark Turquoise': 'Turquesa oscuro', | |
350 | + 'Dark Green': 'Verde oscuro', | |
351 | + 'Medium Blue': 'Azul medio', | |
352 | + 'Medium Purple': 'P\u00farpura medio', | |
353 | + 'Midnight Blue': 'Azul medio', | |
354 | + Yellow: 'Amarillo', | |
355 | + Orange: 'Naranja', | |
356 | + Red: 'Rojo', | |
357 | + 'Light Gray': 'Gris claro', | |
358 | + Gray: 'Gris', | |
359 | + 'Dark Yellow': 'Amarillo oscuro', | |
360 | + 'Dark Orange': 'Naranja oscuro', | |
361 | + 'Dark Red': 'Rojo oscuro', | |
362 | + 'Medium Gray': 'Gris medio', | |
363 | + 'Dark Gray': 'Gris oscuro', | |
364 | + 'Light Green': 'Verde claro', | |
365 | + 'Light Yellow': 'Amarillo claro', | |
366 | + 'Light Red': 'Rojo claro', | |
367 | + 'Light Purple': 'Morado claro', | |
368 | + 'Light Blue': 'Azul claro', | |
369 | + 'Dark Purple': 'Morado oscuro', | |
370 | + 'Dark Blue': 'Azul oscuro', | |
371 | + Black: 'Negro', | |
372 | + White: 'Blanco', | |
373 | + 'Switch to or from fullscreen mode': 'Activar o desactivar modo pantalla completa', | |
374 | + 'Open help dialog': 'Abrir di\u00e1logo de ayuda', | |
375 | + history: 'historial', | |
376 | + styles: 'estilos', | |
377 | + formatting: 'formato', | |
378 | + alignment: 'alineaci\u00f3n', | |
379 | + indentation: 'sangr\u00eda', | |
380 | + 'permanent pen': 'bol\u00edgrafo permanente', | |
381 | + comments: 'comentarios', | |
382 | + 'Format Painter': 'Copiar formato', | |
383 | + 'Insert\/edit iframe': 'Insertar\/editar iframe', | |
384 | + Capitalization: 'Uso de may\u00fasculas', | |
385 | + lowercase: 'min\u00fasculas', | |
386 | + UPPERCASE: 'MAY\u00daSCULAS', | |
387 | + 'Title Case': 'Tipo T\u00edtulo', | |
388 | + 'Permanent Pen Properties': 'Propiedades del bol\u00edgrafo permanente', | |
389 | + 'Permanent pen properties...': 'Propiedades del bol\u00edgrafo permanente...', | |
390 | + Font: 'Fuente', | |
391 | + Size: 'Tama\u00f1o', | |
392 | + 'More...': 'M\u00e1s...', | |
393 | + 'Spellcheck Language': 'Corrector', | |
394 | + 'Select...': 'Seleccionar...', | |
395 | + Preferences: 'Preferencias', | |
396 | + Yes: 'S\u00ed', | |
397 | + No: 'No', | |
398 | + 'Keyboard Navigation': 'Navegaci\u00f3n con el teclado', | |
399 | + Version: 'Versi\u00f3n', | |
400 | + Anchor: 'Ancla', | |
401 | + 'Special character': 'Car\u00e1cter especial', | |
402 | + 'Code sample': 'Ejemplo de c\u00f3digo', | |
403 | + Color: 'Color', | |
404 | + Emoticons: 'Emoticonos', | |
405 | + 'Document properties': 'Propiedades del documento', | |
406 | + Image: 'Imagen', | |
407 | + 'Insert link': 'Insertar enlace', | |
408 | + Target: 'Destino', | |
409 | + Link: 'Enlace', | |
410 | + Poster: 'Miniatura', | |
411 | + Media: 'Media', | |
412 | + Print: 'Imprimir', | |
413 | + Prev: 'Anterior', | |
414 | + 'Find and replace': 'Buscar y reemplazar', | |
415 | + 'Whole words': 'Palabras completas', | |
416 | + Spellcheck: 'Corrector ortogr\u00e1fico', | |
417 | + Caption: 'Subt\u00edtulo', | |
418 | + 'Insert template': 'Insertar plantilla' | |
419 | +}) | ... | ... |
public/resource/tinymce/langs/zh_CN.js
0 → 100644
1 | +tinymce.addI18n('zh_CN',{ | |
2 | +"Redo": "\u91cd\u505a", | |
3 | +"Undo": "\u64a4\u9500", | |
4 | +"Cut": "\u526a\u5207", | |
5 | +"Copy": "\u590d\u5236", | |
6 | +"Paste": "\u7c98\u8d34", | |
7 | +"Select all": "\u5168\u9009", | |
8 | +"New document": "\u65b0\u6587\u4ef6", | |
9 | +"Ok": "\u786e\u5b9a", | |
10 | +"Cancel": "\u53d6\u6d88", | |
11 | +"Visual aids": "\u7f51\u683c\u7ebf", | |
12 | +"Bold": "\u7c97\u4f53", | |
13 | +"Italic": "\u659c\u4f53", | |
14 | +"Underline": "\u4e0b\u5212\u7ebf", | |
15 | +"Strikethrough": "\u5220\u9664\u7ebf", | |
16 | +"Superscript": "\u4e0a\u6807", | |
17 | +"Subscript": "\u4e0b\u6807", | |
18 | +"Clear formatting": "\u6e05\u9664\u683c\u5f0f", | |
19 | +"Align left": "\u5de6\u8fb9\u5bf9\u9f50", | |
20 | +"Align center": "\u4e2d\u95f4\u5bf9\u9f50", | |
21 | +"Align right": "\u53f3\u8fb9\u5bf9\u9f50", | |
22 | +"Justify": "\u4e24\u7aef\u5bf9\u9f50", | |
23 | +"Bullet list": "\u9879\u76ee\u7b26\u53f7", | |
24 | +"Numbered list": "\u7f16\u53f7\u5217\u8868", | |
25 | +"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", | |
26 | +"Increase indent": "\u589e\u52a0\u7f29\u8fdb", | |
27 | +"Close": "\u5173\u95ed", | |
28 | +"Formats": "\u683c\u5f0f", | |
29 | +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002", | |
30 | +"Headers": "\u6807\u9898", | |
31 | +"Header 1": "\u6807\u98981", | |
32 | +"Header 2": "\u6807\u98982", | |
33 | +"Header 3": "\u6807\u98983", | |
34 | +"Header 4": "\u6807\u98984", | |
35 | +"Header 5": "\u6807\u98985", | |
36 | +"Header 6": "\u6807\u98986", | |
37 | +"Headings": "\u6807\u9898", | |
38 | +"Heading 1": "\u6807\u98981", | |
39 | +"Heading 2": "\u6807\u98982", | |
40 | +"Heading 3": "\u6807\u98983", | |
41 | +"Heading 4": "\u6807\u98984", | |
42 | +"Heading 5": "\u6807\u98985", | |
43 | +"Heading 6": "\u6807\u98986", | |
44 | +"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684", | |
45 | +"Div": "Div", | |
46 | +"Pre": "Pre", | |
47 | +"Code": "\u4ee3\u7801", | |
48 | +"Paragraph": "\u6bb5\u843d", | |
49 | +"Blockquote": "\u5f15\u6587\u533a\u5757", | |
50 | +"Inline": "\u6587\u672c", | |
51 | +"Blocks": "\u57fa\u5757", | |
52 | +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", | |
53 | +"Fonts": "\u5b57\u4f53", | |
54 | +"Font Sizes": "\u5b57\u53f7", | |
55 | +"Class": "\u7c7b\u578b", | |
56 | +"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", | |
57 | +"OR": "\u6216", | |
58 | +"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", | |
59 | +"Upload": "\u4e0a\u4f20", | |
60 | +"Block": "\u5757", | |
61 | +"Align": "\u5bf9\u9f50", | |
62 | +"Default": "\u9ed8\u8ba4", | |
63 | +"Circle": "\u7a7a\u5fc3\u5706", | |
64 | +"Disc": "\u5b9e\u5fc3\u5706", | |
65 | +"Square": "\u65b9\u5757", | |
66 | +"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", | |
67 | +"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", | |
68 | +"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", | |
69 | +"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", | |
70 | +"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", | |
71 | +"Anchor...": "\u951a\u70b9...", | |
72 | +"Name": "\u540d\u79f0", | |
73 | +"Id": "\u6807\u8bc6\u7b26", | |
74 | +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", | |
75 | +"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", | |
76 | +"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", | |
77 | +"Special characters...": "\u7279\u6b8a\u5b57\u7b26...", | |
78 | +"Source code": "\u6e90\u4ee3\u7801", | |
79 | +"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", | |
80 | +"Language": "\u8bed\u8a00", | |
81 | +"Code sample...": "\u793a\u4f8b\u4ee3\u7801...", | |
82 | +"Color Picker": "\u9009\u8272\u5668", | |
83 | +"R": "R", | |
84 | +"G": "G", | |
85 | +"B": "B", | |
86 | +"Left to right": "\u4ece\u5de6\u5230\u53f3", | |
87 | +"Right to left": "\u4ece\u53f3\u5230\u5de6", | |
88 | +"Emoticons...": "\u8868\u60c5\u7b26\u53f7...", | |
89 | +"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027", | |
90 | +"Title": "\u6807\u9898", | |
91 | +"Keywords": "\u5173\u952e\u8bcd", | |
92 | +"Description": "\u63cf\u8ff0", | |
93 | +"Robots": "\u673a\u5668\u4eba", | |
94 | +"Author": "\u4f5c\u8005", | |
95 | +"Encoding": "\u7f16\u7801", | |
96 | +"Fullscreen": "\u5168\u5c4f", | |
97 | +"Action": "\u64cd\u4f5c", | |
98 | +"Shortcut": "\u5feb\u6377\u952e", | |
99 | +"Help": "\u5e2e\u52a9", | |
100 | +"Address": "\u5730\u5740", | |
101 | +"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", | |
102 | +"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", | |
103 | +"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", | |
104 | +"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", | |
105 | +"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", | |
106 | +"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", | |
107 | +"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", | |
108 | +"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", | |
109 | +"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", | |
110 | +"Learn more...": "\u4e86\u89e3\u66f4\u591a...", | |
111 | +"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", | |
112 | +"Plugins": "\u63d2\u4ef6", | |
113 | +"Handy Shortcuts": "\u5feb\u6377\u952e", | |
114 | +"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", | |
115 | +"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", | |
116 | +"Image description": "\u56fe\u7247\u63cf\u8ff0", | |
117 | +"Source": "\u5730\u5740", | |
118 | +"Dimensions": "\u5927\u5c0f", | |
119 | +"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", | |
120 | +"General": "\u666e\u901a", | |
121 | +"Advanced": "\u9ad8\u7ea7", | |
122 | +"Style": "\u6837\u5f0f", | |
123 | +"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", | |
124 | +"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", | |
125 | +"Border": "\u8fb9\u6846", | |
126 | +"Insert image": "\u63d2\u5165\u56fe\u7247", | |
127 | +"Image...": "\u56fe\u7247...", | |
128 | +"Image list": "\u56fe\u7247\u5217\u8868", | |
129 | +"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", | |
130 | +"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", | |
131 | +"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", | |
132 | +"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", | |
133 | +"Edit image": "\u7f16\u8f91\u56fe\u7247", | |
134 | +"Image options": "\u56fe\u7247\u9009\u9879", | |
135 | +"Zoom in": "\u653e\u5927", | |
136 | +"Zoom out": "\u7f29\u5c0f", | |
137 | +"Crop": "\u88c1\u526a", | |
138 | +"Resize": "\u8c03\u6574\u5927\u5c0f", | |
139 | +"Orientation": "\u65b9\u5411", | |
140 | +"Brightness": "\u4eae\u5ea6", | |
141 | +"Sharpen": "\u9510\u5316", | |
142 | +"Contrast": "\u5bf9\u6bd4\u5ea6", | |
143 | +"Color levels": "\u989c\u8272\u5c42\u6b21", | |
144 | +"Gamma": "\u4f3d\u9a6c\u503c", | |
145 | +"Invert": "\u53cd\u8f6c", | |
146 | +"Apply": "\u5e94\u7528", | |
147 | +"Back": "\u540e\u9000", | |
148 | +"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", | |
149 | +"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", | |
150 | +"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", | |
151 | +"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", | |
152 | +"Text to display": "\u663e\u793a\u6587\u5b57", | |
153 | +"Url": "\u5730\u5740", | |
154 | +"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...", | |
155 | +"Current window": "\u5f53\u524d\u7a97\u53e3", | |
156 | +"None": "\u65e0", | |
157 | +"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", | |
158 | +"Remove link": "\u5220\u9664\u94fe\u63a5", | |
159 | +"Anchors": "\u951a\u70b9", | |
160 | +"Link...": "\u94fe\u63a5...", | |
161 | +"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", | |
162 | +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", | |
163 | +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", | |
164 | +"Link list": "\u94fe\u63a5\u5217\u8868", | |
165 | +"Insert video": "\u63d2\u5165\u89c6\u9891", | |
166 | +"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", | |
167 | +"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", | |
168 | +"Alternative source": "\u955c\u50cf", | |
169 | +"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740", | |
170 | +"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)", | |
171 | +"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", | |
172 | +"Embed": "\u5185\u5d4c", | |
173 | +"Media...": "\u591a\u5a92\u4f53...", | |
174 | +"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", | |
175 | +"Page break": "\u5206\u9875\u7b26", | |
176 | +"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", | |
177 | +"Preview": "\u9884\u89c8", | |
178 | +"Print...": "\u6253\u5370...", | |
179 | +"Save": "\u4fdd\u5b58", | |
180 | +"Find": "\u67e5\u627e", | |
181 | +"Replace with": "\u66ff\u6362\u4e3a", | |
182 | +"Replace": "\u66ff\u6362", | |
183 | +"Replace all": "\u5168\u90e8\u66ff\u6362", | |
184 | +"Previous": "\u4e0a\u4e00\u4e2a", | |
185 | +"Next": "\u4e0b\u4e00\u4e2a", | |
186 | +"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...", | |
187 | +"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", | |
188 | +"Match case": "\u533a\u5206\u5927\u5c0f\u5199", | |
189 | +"Find whole words only": "\u5168\u5b57\u5339\u914d", | |
190 | +"Spell check": "\u62fc\u5199\u68c0\u67e5", | |
191 | +"Ignore": "\u5ffd\u7565", | |
192 | +"Ignore all": "\u5168\u90e8\u5ffd\u7565", | |
193 | +"Finish": "\u5b8c\u6210", | |
194 | +"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", | |
195 | +"Insert table": "\u63d2\u5165\u8868\u683c", | |
196 | +"Table properties": "\u8868\u683c\u5c5e\u6027", | |
197 | +"Delete table": "\u5220\u9664\u8868\u683c", | |
198 | +"Cell": "\u5355\u5143\u683c", | |
199 | +"Row": "\u884c", | |
200 | +"Column": "\u5217", | |
201 | +"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", | |
202 | +"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", | |
203 | +"Split cell": "\u62c6\u5206\u5355\u5143\u683c", | |
204 | +"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", | |
205 | +"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", | |
206 | +"Delete row": "\u5220\u9664\u884c", | |
207 | +"Row properties": "\u884c\u5c5e\u6027", | |
208 | +"Cut row": "\u526a\u5207\u884c", | |
209 | +"Copy row": "\u590d\u5236\u884c", | |
210 | +"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", | |
211 | +"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", | |
212 | +"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", | |
213 | +"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", | |
214 | +"Delete column": "\u5220\u9664\u5217", | |
215 | +"Cols": "\u5217", | |
216 | +"Rows": "\u884c", | |
217 | +"Width": "\u5bbd", | |
218 | +"Height": "\u9ad8", | |
219 | +"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", | |
220 | +"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", | |
221 | +"Show caption": "\u663e\u793a\u6807\u9898", | |
222 | +"Left": "\u5de6\u5bf9\u9f50", | |
223 | +"Center": "\u5c45\u4e2d", | |
224 | +"Right": "\u53f3\u5bf9\u9f50", | |
225 | +"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", | |
226 | +"Scope": "\u8303\u56f4", | |
227 | +"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", | |
228 | +"H Align": "\u6c34\u5e73\u5bf9\u9f50", | |
229 | +"V Align": "\u5782\u76f4\u5bf9\u9f50", | |
230 | +"Top": "\u9876\u90e8\u5bf9\u9f50", | |
231 | +"Middle": "\u5782\u76f4\u5c45\u4e2d", | |
232 | +"Bottom": "\u5e95\u90e8\u5bf9\u9f50", | |
233 | +"Header cell": "\u8868\u5934\u5355\u5143\u683c", | |
234 | +"Row group": "\u884c\u7ec4", | |
235 | +"Column group": "\u5217\u7ec4", | |
236 | +"Row type": "\u884c\u7c7b\u578b", | |
237 | +"Header": "\u8868\u5934", | |
238 | +"Body": "\u8868\u4f53", | |
239 | +"Footer": "\u8868\u5c3e", | |
240 | +"Border color": "\u8fb9\u6846\u989c\u8272", | |
241 | +"Insert template...": "\u63d2\u5165\u6a21\u677f...", | |
242 | +"Templates": "\u6a21\u677f", | |
243 | +"Template": "\u6a21\u677f", | |
244 | +"Text color": "\u6587\u5b57\u989c\u8272", | |
245 | +"Background color": "\u80cc\u666f\u8272", | |
246 | +"Custom...": "\u81ea\u5b9a\u4e49...", | |
247 | +"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", | |
248 | +"No color": "\u65e0", | |
249 | +"Remove color": "\u79fb\u9664\u989c\u8272", | |
250 | +"Table of Contents": "\u5185\u5bb9\u5217\u8868", | |
251 | +"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", | |
252 | +"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", | |
253 | +"Word count": "\u5b57\u6570", | |
254 | +"Words: {0}": "\u5b57\u6570\uff1a{0}", | |
255 | +"{0} words": "{0} \u5b57", | |
256 | +"File": "\u6587\u4ef6", | |
257 | +"Edit": "\u7f16\u8f91", | |
258 | +"Insert": "\u63d2\u5165", | |
259 | +"View": "\u89c6\u56fe", | |
260 | +"Format": "\u683c\u5f0f", | |
261 | +"Table": "\u8868\u683c", | |
262 | +"Tools": "\u5de5\u5177", | |
263 | +"Powered by {0}": "\u7531{0}\u9a71\u52a8", | |
264 | +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9", | |
265 | +"Image title": "\u56fe\u7247\u6807\u9898", | |
266 | +"Border width": "\u8fb9\u6846\u5bbd\u5ea6", | |
267 | +"Border style": "\u8fb9\u6846\u6837\u5f0f", | |
268 | +"Error": "\u9519\u8bef", | |
269 | +"Warn": "\u8b66\u544a", | |
270 | +"Valid": "\u6709\u6548", | |
271 | +"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846", | |
272 | +"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002", | |
273 | +"System Font": "\u7cfb\u7edf\u5b57\u4f53", | |
274 | +"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}", | |
275 | +"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}", | |
276 | +"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}", | |
277 | +"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}", | |
278 | +"example": "\u793a\u4f8b", | |
279 | +"Search": "\u641c\u7d22", | |
280 | +"All": "\u5168\u90e8", | |
281 | +"Currency": "\u8d27\u5e01", | |
282 | +"Text": "\u6587\u5b57", | |
283 | +"Quotations": "\u5f15\u7528", | |
284 | +"Mathematical": "\u6570\u5b66", | |
285 | +"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145", | |
286 | +"Symbols": "\u7b26\u53f7", | |
287 | +"Arrows": "\u7bad\u5934", | |
288 | +"User Defined": "\u81ea\u5b9a\u4e49", | |
289 | +"dollar sign": "\u7f8e\u5143\u7b26\u53f7", | |
290 | +"currency sign": "\u8d27\u5e01\u7b26\u53f7", | |
291 | +"euro-currency sign": "\u6b27\u5143\u7b26\u53f7", | |
292 | +"colon sign": "\u5192\u53f7", | |
293 | +"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7", | |
294 | +"french franc sign": "\u6cd5\u90ce\u7b26\u53f7", | |
295 | +"lira sign": "\u91cc\u62c9\u7b26\u53f7", | |
296 | +"mill sign": "\u5bc6\u5c14\u7b26\u53f7", | |
297 | +"naira sign": "\u5948\u62c9\u7b26\u53f7", | |
298 | +"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7", | |
299 | +"rupee sign": "\u5362\u6bd4\u7b26\u53f7", | |
300 | +"won sign": "\u97e9\u5143\u7b26\u53f7", | |
301 | +"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7", | |
302 | +"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7", | |
303 | +"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7", | |
304 | +"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7", | |
305 | +"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7", | |
306 | +"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7", | |
307 | +"peso sign": "\u6bd4\u7d22\u7b26\u53f7", | |
308 | +"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7", | |
309 | +"austral sign": "\u6fb3\u5143\u7b26\u53f7", | |
310 | +"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7", | |
311 | +"cedi sign": "\u585e\u5730\u7b26\u53f7", | |
312 | +"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7", | |
313 | +"spesmilo sign": "spesmilo\u7b26\u53f7", | |
314 | +"tenge sign": "\u575a\u6208\u7b26\u53f7", | |
315 | +"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4", | |
316 | +"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9", | |
317 | +"nordic mark sign": "\u5317\u6b27\u9a6c\u514b", | |
318 | +"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7", | |
319 | +"ruble sign": "\u5362\u5e03\u7b26\u53f7", | |
320 | +"yen character": "\u65e5\u5143\u5b57\u6837", | |
321 | +"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837", | |
322 | +"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09", | |
323 | +"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09", | |
324 | +"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...", | |
325 | +"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7", | |
326 | +"People": "\u4eba\u7c7b", | |
327 | +"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136", | |
328 | +"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1", | |
329 | +"Activity": "\u6d3b\u52a8", | |
330 | +"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9", | |
331 | +"Objects": "\u7269\u4ef6", | |
332 | +"Flags": "\u65d7\u5e1c", | |
333 | +"Characters": "\u5b57\u7b26", | |
334 | +"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)", | |
335 | +"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002", | |
336 | +"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002", | |
337 | +"Update": "\u66f4\u65b0", | |
338 | +"Color swatch": "\u989c\u8272\u6837\u672c", | |
339 | +"Turquoise": "\u9752\u7eff\u8272", | |
340 | +"Green": "\u7eff\u8272", | |
341 | +"Blue": "\u84dd\u8272", | |
342 | +"Purple": "\u7d2b\u8272", | |
343 | +"Navy Blue": "\u6d77\u519b\u84dd", | |
344 | +"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272", | |
345 | +"Dark Green": "\u6df1\u7eff\u8272", | |
346 | +"Medium Blue": "\u4e2d\u84dd\u8272", | |
347 | +"Medium Purple": "\u4e2d\u7d2b\u8272", | |
348 | +"Midnight Blue": "\u6df1\u84dd\u8272", | |
349 | +"Yellow": "\u9ec4\u8272", | |
350 | +"Orange": "\u6a59\u8272", | |
351 | +"Red": "\u7ea2\u8272", | |
352 | +"Light Gray": "\u6d45\u7070\u8272", | |
353 | +"Gray": "\u7070\u8272", | |
354 | +"Dark Yellow": "\u6697\u9ec4\u8272", | |
355 | +"Dark Orange": "\u6df1\u6a59\u8272", | |
356 | +"Dark Red": "\u6df1\u7ea2\u8272", | |
357 | +"Medium Gray": "\u4e2d\u7070\u8272", | |
358 | +"Dark Gray": "\u6df1\u7070\u8272", | |
359 | +"Black": "\u9ed1\u8272", | |
360 | +"White": "\u767d\u8272", | |
361 | +"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f", | |
362 | +"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846", | |
363 | +"history": "\u5386\u53f2", | |
364 | +"styles": "\u6837\u5f0f", | |
365 | +"formatting": "\u683c\u5f0f\u5316", | |
366 | +"alignment": "\u5bf9\u9f50", | |
367 | +"indentation": "\u7f29\u8fdb", | |
368 | +"permanent pen": "\u8bb0\u53f7\u7b14", | |
369 | +"comments": "\u5907\u6ce8", | |
370 | +"Anchor": "\u951a\u70b9", | |
371 | +"Special character": "\u7279\u6b8a\u7b26\u53f7", | |
372 | +"Code sample": "\u4ee3\u7801\u793a\u4f8b", | |
373 | +"Color": "\u989c\u8272", | |
374 | +"Emoticons": "\u8868\u60c5", | |
375 | +"Document properties": "\u6587\u6863\u5c5e\u6027", | |
376 | +"Image": "\u56fe\u7247", | |
377 | +"Insert link": "\u63d2\u5165\u94fe\u63a5", | |
378 | +"Target": "\u6253\u5f00\u65b9\u5f0f", | |
379 | +"Link": "\u94fe\u63a5", | |
380 | +"Poster": "\u5c01\u9762", | |
381 | +"Media": "\u5a92\u4f53", | |
382 | +"Print": "\u6253\u5370", | |
383 | +"Prev": "\u4e0a\u4e00\u4e2a", | |
384 | +"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", | |
385 | +"Whole words": "\u5168\u5b57\u5339\u914d", | |
386 | +"Spellcheck": "\u62fc\u5199\u68c0\u67e5", | |
387 | +"Caption": "\u6807\u9898", | |
388 | +"Insert template": "\u63d2\u5165\u6a21\u677f" | |
389 | +}); | |
\ No newline at end of file | ... | ... |
1 | +/** | |
2 | + * Copyright (c) Tiny Technologies, Inc. All rights reserved. | |
3 | + * Licensed under the LGPL or a commercial license. | |
4 | + * For LGPL see License.txt in the project root for license information. | |
5 | + * For commercial licenses see https://www.tiny.cloud/ | |
6 | + */ | |
7 | +.mce-content-body .mce-item-anchor{display: inline-block;width: 8px !important;height: 12px !important;padding: 0 2px;cursor: default;background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;-webkit-user-select: all;-moz-user-select: all;-ms-user-select: all;user-select: all;-webkit-user-modify: read-only;-moz-user-modify: read-only;} | |
8 | + | |
9 | +.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset: 1px;} | |
10 | + | |
11 | +.tox-comments-visible .tox-comment{background-color: #fff0b7;} | |
12 | + | |
13 | +.tox-comments-visible .tox-comment--active{background-color: #ffe168;} | |
14 | + | |
15 | +.tox-checklist>li:not(.tox-checklist--hidden){margin: .25em 0;list-style: none;} | |
16 | + | |
17 | +.tox-checklist>li:not(.tox-checklist--hidden)::before{position: absolute;width: 1em;height: 1em;margin-top: .125em;margin-left: -1.5em;cursor: pointer;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");background-size: 100%;content: '';} | |
18 | + | |
19 | +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");} | |
20 | + | |
21 | +[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-right: -1.5em;margin-left: 0;} | |
22 | + | |
23 | +code[class*=language-],pre[class*=language-]{font-family: Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size: .875rem;-webkit-hyphens: none;-ms-hyphens: none;hyphens: none;line-height: 1.5;word-spacing: normal;color: #000;text-shadow: 0 1px #fff;word-break: normal;word-wrap: normal;white-space: pre;-moz-tab-size: 4;tab-size: 4;} | |
24 | + | |
25 | +code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow: none;background: #b3d4fc;} | |
26 | + | |
27 | +code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow: none;background: #b3d4fc;}@media print{code[class*=language-],pre[class*=language-]{text-shadow: none;}} | |
28 | + | |
29 | +pre[class*=language-]{padding: 1em;margin: .5em 0;overflow: auto;} | |
30 | + | |
31 | +:not(pre)>code[class*=language-],pre[class*=language-]{background: 0 0 !important;border: 1px solid #ccc;} | |
32 | + | |
33 | +:not(pre)>code[class*=language-]{padding: .1em;border-radius: .3em;} | |
34 | + | |
35 | +.token.cdata,.token.comment,.token.doctype,.token.prolog{color: #708090;} | |
36 | + | |
37 | +.token.punctuation{color: #999;} | |
38 | + | |
39 | +.namespace{opacity: .7;} | |
40 | + | |
41 | +.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color: #905;} | |
42 | + | |
43 | +.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color: #690;} | |
44 | + | |
45 | +.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color: #a67f59;background: hsla(0,0%,100%,.5);} | |
46 | + | |
47 | +.token.atrule,.token.attr-value,.token.keyword{color: #07a;} | |
48 | + | |
49 | +.token.function{color: #dd4a68;} | |
50 | + | |
51 | +.token.important,.token.regex,.token.variable{color: #e90;} | |
52 | + | |
53 | +.token.bold,.token.important{font-weight: 700;} | |
54 | + | |
55 | +.token.italic{font-style: italic;} | |
56 | + | |
57 | +.token.entity{cursor: help;} | |
58 | + | |
59 | +:not([dir=rtl]) code[class*=language-],:not([dir=rtl]) pre[class*=language-]{text-align: left;direction: ltr;} | |
60 | + | |
61 | +[dir=rtl] code[class*=language-],[dir=rtl] pre[class*=language-]{text-align: right;direction: rtl;} | |
62 | + | |
63 | +.mce-content-body{overflow-wrap: break-word;word-wrap: break-word;} | |
64 | + | |
65 | +.mce-content-body .mce-visual-caret{position: absolute;background-color: #000;background-color: currentColor;} | |
66 | + | |
67 | +.mce-content-body .mce-visual-caret-hidden{display: none;} | |
68 | + | |
69 | +.mce-content-body [data-mce-caret]{position: absolute;top: 0;right: auto;left: -1000px;padding: 0;margin: 0;} | |
70 | + | |
71 | +.mce-content-body .mce-offscreen-selection{position: absolute;left: -9999999999px;max-width: 1000000px;} | |
72 | + | |
73 | +.mce-content-body [contentEditable=false]{cursor: default;} | |
74 | + | |
75 | +.mce-content-body [contentEditable=true]{cursor: text;} | |
76 | + | |
77 | +.tox-cursor-format-painter{cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default;} | |
78 | + | |
79 | +.mce-content-body figure.align-left{float: left;} | |
80 | + | |
81 | +.mce-content-body figure.align-right{float: right;} | |
82 | + | |
83 | +.mce-content-body figure.image.align-center{display: table;margin-right: auto;margin-left: auto;} | |
84 | + | |
85 | +.mce-preview-object{position: relative;display: inline-block;margin: 0 2px 0 2px;line-height: 0;border: 1px solid gray;} | |
86 | + | |
87 | +.mce-preview-object .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);} | |
88 | + | |
89 | +.mce-preview-object[data-mce-selected="2"] .mce-shim{display: none;} | |
90 | + | |
91 | +.mce-object{background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border: 1px dashed #aaa;} | |
92 | + | |
93 | +.mce-pagebreak{display: block;width: 100%;height: 5px;margin-top: 15px;cursor: default;border: 1px dashed #aaa;page-break-before: always;}@media print{.mce-pagebreak{border: 0;}} | |
94 | + | |
95 | +.tiny-pageembed .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);} | |
96 | + | |
97 | +.tiny-pageembed[data-mce-selected="2"] .mce-shim{display: none;} | |
98 | + | |
99 | +.tiny-pageembed{position: relative;display: inline-block;} | |
100 | + | |
101 | +.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{position: relative;display: block;width: 100%;padding: 0;overflow: hidden;} | |
102 | + | |
103 | +.tiny-pageembed--16by9::before,.tiny-pageembed--1by1::before,.tiny-pageembed--21by9::before,.tiny-pageembed--4by3::before{display: block;content: "";} | |
104 | + | |
105 | +.tiny-pageembed--21by9::before{padding-top: 42.857143%;} | |
106 | + | |
107 | +.tiny-pageembed--16by9::before{padding-top: 56.25%;} | |
108 | + | |
109 | +.tiny-pageembed--4by3::before{padding-top: 75%;} | |
110 | + | |
111 | +.tiny-pageembed--1by1::before{padding-top: 100%;} | |
112 | + | |
113 | +.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{position: absolute;top: 0;left: 0;width: 100%;height: 100%;border: 0;} | |
114 | + | |
115 | +.mce-content-body div.mce-resizehandle{position: absolute;z-index: 10000;width: 10px;height: 10px;background-color: #4099ff;border-color: #4099ff;border-style: solid;border-width: 1px;box-sizing: border-box;} | |
116 | + | |
117 | +.mce-content-body div.mce-resizehandle:hover{background-color: #4099ff;} | |
118 | + | |
119 | +.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor: nwse-resize;} | |
120 | + | |
121 | +.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor: nesw-resize;} | |
122 | + | |
123 | +.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor: nwse-resize;} | |
124 | + | |
125 | +.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor: nesw-resize;} | |
126 | + | |
127 | +.mce-content-body .mce-clonedresizable{position: absolute;z-index: 10000;outline: 1px dashed #000;opacity: .5;} | |
128 | + | |
129 | +.mce-content-body .mce-resize-helper{position: absolute;z-index: 10001;display: none;padding: 5px;margin: 5px 10px;font-family: sans-serif;font-size: 12px;line-height: 14px;color: #fff;white-space: nowrap;background: #555;background: rgba(0,0,0,.75);border: 1px;border-radius: 3px;} | |
130 | + | |
131 | +.mce-match-marker{color: #fff;background: #aaa;} | |
132 | + | |
133 | +.mce-match-marker-selected{color: #fff;background: #39f;} | |
134 | + | |
135 | +.mce-content-body img[data-mce-selected],.mce-content-body table[data-mce-selected]{outline: 3px solid #b4d7ff;} | |
136 | + | |
137 | +.mce-content-body hr[data-mce-selected]{outline: 3px solid #b4d7ff;outline-offset: 1px;} | |
138 | + | |
139 | +.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline: 3px solid #b4d7ff;} | |
140 | + | |
141 | +.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline: 3px solid #b4d7ff;} | |
142 | + | |
143 | +.mce-content-body [contentEditable=false][data-mce-selected]{cursor: not-allowed;outline: 3px solid #b4d7ff;} | |
144 | + | |
145 | +.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline: 0;} | |
146 | + | |
147 | +.mce-content-body [data-mce-selected=inline-boundary]{background-color: #b4d7ff;} | |
148 | + | |
149 | +.mce-content-body .mce-edit-focus{outline: 3px solid #b4d7ff;} | |
150 | + | |
151 | +.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{background-color: #b4d7ff !important;} | |
152 | + | |
153 | +.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background: 0 0;} | |
154 | + | |
155 | +.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background: 0 0;} | |
156 | + | |
157 | +.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{-webkit-touch-callout: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;} | |
158 | + | |
159 | +.mce-content-body img::-moz-selection{background: 0 0;} | |
160 | + | |
161 | +.mce-content-body img::selection{background: 0 0;} | |
162 | + | |
163 | +.ephox-snooker-resizer-bar{background-color: #b4d7ff;opacity: 0;} | |
164 | + | |
165 | +.ephox-snooker-resizer-cols{cursor: col-resize;} | |
166 | + | |
167 | +.ephox-snooker-resizer-rows{cursor: row-resize;} | |
168 | + | |
169 | +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity: 1;} | |
170 | + | |
171 | +.mce-spellchecker-word{height: 2rem;cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.5'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;} | |
172 | + | |
173 | +.mce-spellchecker-grammar{cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23008800'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;} | |
174 | + | |
175 | +.mce-toc{border: 1px solid gray;} | |
176 | + | |
177 | +.mce-toc h2{margin: 4px;} | |
178 | + | |
179 | +.mce-toc li{list-style-type: none;} | |
180 | + | |
181 | +.mce-item-table,.mce-item-table caption,.mce-item-table td,.mce-item-table th{border: 1px dashed #bbb;} | |
182 | + | |
183 | +.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{padding-top: 10px;margin-left: 3px;background-repeat: no-repeat;border: 1px dashed #bbb;} | |
184 | + | |
185 | +.mce-visualblocks p{background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);} | |
186 | + | |
187 | +.mce-visualblocks h1{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);} | |
188 | + | |
189 | +.mce-visualblocks h2{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);} | |
190 | + | |
191 | +.mce-visualblocks h3{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);} | |
192 | + | |
193 | +.mce-visualblocks h4{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);} | |
194 | + | |
195 | +.mce-visualblocks h5{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);} | |
196 | + | |
197 | +.mce-visualblocks h6{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);} | |
198 | + | |
199 | +.mce-visualblocks div:not([data-mce-bogus]){background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);} | |
200 | + | |
201 | +.mce-visualblocks section{background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);} | |
202 | + | |
203 | +.mce-visualblocks article{background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);} | |
204 | + | |
205 | +.mce-visualblocks blockquote{background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);} | |
206 | + | |
207 | +.mce-visualblocks address{background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);} | |
208 | + | |
209 | +.mce-visualblocks pre{background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);} | |
210 | + | |
211 | +.mce-visualblocks figure{background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);} | |
212 | + | |
213 | +.mce-visualblocks figcaption{border: 1px dashed #bbb;} | |
214 | + | |
215 | +.mce-visualblocks hgroup{background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);} | |
216 | + | |
217 | +.mce-visualblocks aside{background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);} | |
218 | + | |
219 | +.mce-visualblocks ul{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);} | |
220 | + | |
221 | +.mce-visualblocks ol{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);} | |
222 | + | |
223 | +.mce-visualblocks dl{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);} | |
224 | + | |
225 | +.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left: 3px;} | |
226 | + | |
227 | +.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x: right;margin-right: 3px;} | |
228 | + | |
229 | +.mce-nbsp,.mce-shy{background: #aaa;} | |
230 | + | |
231 | +.mce-shy::after{content: '-';} | |
232 | + | |
233 | +.tox-toolbar-dock-fadeout{opacity: 0;visibility: hidden;} | |
234 | + | |
235 | +.tox-toolbar-dock-fadein{opacity: 1;visibility: visible;} | |
236 | + | |
237 | +.tox-toolbar-dock-transition{transition: visibility 0s linear .3s,opacity .3s ease;} | |
238 | + | |
239 | +.tox-toolbar-dock-transition.tox-toolbar-dock-fadein{transition-delay: 0s;} | ... | ... |
1 | +/** | |
2 | + * Copyright (c) Tiny Technologies, Inc. All rights reserved. | |
3 | + * Licensed under the LGPL or a commercial license. | |
4 | + * For LGPL see License.txt in the project root for license information. | |
5 | + * For commercial licenses see https://www.tiny.cloud/ | |
6 | + */ | |
7 | +.mce-content-body .mce-item-anchor{display: inline-block;width: 8px !important;height: 12px !important;padding: 0 2px;cursor: default;background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;-webkit-user-select: all;-moz-user-select: all;-ms-user-select: all;user-select: all;-webkit-user-modify: read-only;-moz-user-modify: read-only;} | |
8 | + | |
9 | +.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset: 1px;} | |
10 | + | |
11 | +.tox-comments-visible .tox-comment{background-color: #fff0b7;} | |
12 | + | |
13 | +.tox-comments-visible .tox-comment--active{background-color: #ffe168;} | |
14 | + | |
15 | +.tox-checklist>li:not(.tox-checklist--hidden){margin: .25em 0;list-style: none;} | |
16 | + | |
17 | +.tox-checklist>li:not(.tox-checklist--hidden)::before{position: absolute;width: 1em;height: 1em;margin-top: .125em;margin-left: -1.5em;cursor: pointer;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");background-size: 100%;content: '';} | |
18 | + | |
19 | +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");} | |
20 | + | |
21 | +[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-right: -1.5em;margin-left: 0;} | |
22 | + | |
23 | +code[class*=language-],pre[class*=language-]{font-family: Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size: .875rem;-webkit-hyphens: none;-ms-hyphens: none;hyphens: none;line-height: 1.5;word-spacing: normal;color: #000;text-shadow: 0 1px #fff;word-break: normal;word-wrap: normal;white-space: pre;-moz-tab-size: 4;tab-size: 4;} | |
24 | + | |
25 | +code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow: none;background: #b3d4fc;} | |
26 | + | |
27 | +code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow: none;background: #b3d4fc;}@media print{code[class*=language-],pre[class*=language-]{text-shadow: none;}} | |
28 | + | |
29 | +pre[class*=language-]{padding: 1em;margin: .5em 0;overflow: auto;} | |
30 | + | |
31 | +:not(pre)>code[class*=language-],pre[class*=language-]{background: 0 0 !important;border: 1px solid #ccc;} | |
32 | + | |
33 | +:not(pre)>code[class*=language-]{padding: .1em;border-radius: .3em;} | |
34 | + | |
35 | +.token.cdata,.token.comment,.token.doctype,.token.prolog{color: #708090;} | |
36 | + | |
37 | +.token.punctuation{color: #999;} | |
38 | + | |
39 | +.namespace{opacity: .7;} | |
40 | + | |
41 | +.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color: #905;} | |
42 | + | |
43 | +.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color: #690;} | |
44 | + | |
45 | +.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color: #a67f59;background: hsla(0,0%,100%,.5);} | |
46 | + | |
47 | +.token.atrule,.token.attr-value,.token.keyword{color: #07a;} | |
48 | + | |
49 | +.token.function{color: #dd4a68;} | |
50 | + | |
51 | +.token.important,.token.regex,.token.variable{color: #e90;} | |
52 | + | |
53 | +.token.bold,.token.important{font-weight: 700;} | |
54 | + | |
55 | +.token.italic{font-style: italic;} | |
56 | + | |
57 | +.token.entity{cursor: help;} | |
58 | + | |
59 | +:not([dir=rtl]) code[class*=language-],:not([dir=rtl]) pre[class*=language-]{text-align: left;direction: ltr;} | |
60 | + | |
61 | +[dir=rtl] code[class*=language-],[dir=rtl] pre[class*=language-]{text-align: right;direction: rtl;} | |
62 | + | |
63 | +.mce-content-body{overflow-wrap: break-word;word-wrap: break-word;} | |
64 | + | |
65 | +.mce-content-body .mce-visual-caret{position: absolute;background-color: #000;background-color: currentColor;} | |
66 | + | |
67 | +.mce-content-body .mce-visual-caret-hidden{display: none;} | |
68 | + | |
69 | +.mce-content-body [data-mce-caret]{position: absolute;top: 0;right: auto;left: -1000px;padding: 0;margin: 0;} | |
70 | + | |
71 | +.mce-content-body .mce-offscreen-selection{position: absolute;left: -9999999999px;max-width: 1000000px;} | |
72 | + | |
73 | +.mce-content-body [contentEditable=false]{cursor: default;} | |
74 | + | |
75 | +.mce-content-body [contentEditable=true]{cursor: text;} | |
76 | + | |
77 | +.tox-cursor-format-painter{cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default;} | |
78 | + | |
79 | +.mce-content-body figure.align-left{float: left;} | |
80 | + | |
81 | +.mce-content-body figure.align-right{float: right;} | |
82 | + | |
83 | +.mce-content-body figure.image.align-center{display: table;margin-right: auto;margin-left: auto;} | |
84 | + | |
85 | +.mce-preview-object{position: relative;display: inline-block;margin: 0 2px 0 2px;line-height: 0;border: 1px solid gray;} | |
86 | + | |
87 | +.mce-preview-object .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);} | |
88 | + | |
89 | +.mce-preview-object[data-mce-selected="2"] .mce-shim{display: none;} | |
90 | + | |
91 | +.mce-object{background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border: 1px dashed #aaa;} | |
92 | + | |
93 | +.mce-pagebreak{display: block;width: 100%;height: 5px;margin-top: 15px;cursor: default;border: 1px dashed #aaa;page-break-before: always;}@media print{.mce-pagebreak{border: 0;}} | |
94 | + | |
95 | +.tiny-pageembed .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);} | |
96 | + | |
97 | +.tiny-pageembed[data-mce-selected="2"] .mce-shim{display: none;} | |
98 | + | |
99 | +.tiny-pageembed{position: relative;display: inline-block;} | |
100 | + | |
101 | +.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{position: relative;display: block;width: 100%;padding: 0;overflow: hidden;} | |
102 | + | |
103 | +.tiny-pageembed--16by9::before,.tiny-pageembed--1by1::before,.tiny-pageembed--21by9::before,.tiny-pageembed--4by3::before{display: block;content: "";} | |
104 | + | |
105 | +.tiny-pageembed--21by9::before{padding-top: 42.857143%;} | |
106 | + | |
107 | +.tiny-pageembed--16by9::before{padding-top: 56.25%;} | |
108 | + | |
109 | +.tiny-pageembed--4by3::before{padding-top: 75%;} | |
110 | + | |
111 | +.tiny-pageembed--1by1::before{padding-top: 100%;} | |
112 | + | |
113 | +.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{position: absolute;top: 0;left: 0;width: 100%;height: 100%;border: 0;} | |
114 | + | |
115 | +.mce-content-body div.mce-resizehandle{position: absolute;z-index: 10000;width: 10px;height: 10px;background-color: #4099ff;border-color: #4099ff;border-style: solid;border-width: 1px;box-sizing: border-box;} | |
116 | + | |
117 | +.mce-content-body div.mce-resizehandle:hover{background-color: #4099ff;} | |
118 | + | |
119 | +.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor: nwse-resize;} | |
120 | + | |
121 | +.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor: nesw-resize;} | |
122 | + | |
123 | +.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor: nwse-resize;} | |
124 | + | |
125 | +.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor: nesw-resize;} | |
126 | + | |
127 | +.mce-content-body .mce-clonedresizable{position: absolute;z-index: 10000;outline: 1px dashed #000;opacity: .5;} | |
128 | + | |
129 | +.mce-content-body .mce-resize-helper{position: absolute;z-index: 10001;display: none;padding: 5px;margin: 5px 10px;font-family: sans-serif;font-size: 12px;line-height: 14px;color: #fff;white-space: nowrap;background: #555;background: rgba(0,0,0,.75);border: 1px;border-radius: 3px;} | |
130 | + | |
131 | +.mce-match-marker{color: #fff;background: #aaa;} | |
132 | + | |
133 | +.mce-match-marker-selected{color: #fff;background: #39f;} | |
134 | + | |
135 | +.mce-content-body img[data-mce-selected],.mce-content-body table[data-mce-selected]{outline: 3px solid #b4d7ff;} | |
136 | + | |
137 | +.mce-content-body hr[data-mce-selected]{outline: 3px solid #b4d7ff;outline-offset: 1px;} | |
138 | + | |
139 | +.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline: 3px solid #b4d7ff;} | |
140 | + | |
141 | +.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline: 3px solid #b4d7ff;} | |
142 | + | |
143 | +.mce-content-body [contentEditable=false][data-mce-selected]{cursor: not-allowed;outline: 3px solid #b4d7ff;} | |
144 | + | |
145 | +.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline: 0;} | |
146 | + | |
147 | +.mce-content-body [data-mce-selected=inline-boundary]{background-color: #b4d7ff;} | |
148 | + | |
149 | +.mce-content-body .mce-edit-focus{outline: 3px solid #b4d7ff;} | |
150 | + | |
151 | +.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{background-color: #b4d7ff !important;} | |
152 | + | |
153 | +.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background: 0 0;} | |
154 | + | |
155 | +.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background: 0 0;} | |
156 | + | |
157 | +.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{-webkit-touch-callout: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;} | |
158 | + | |
159 | +.mce-content-body img::-moz-selection{background: 0 0;} | |
160 | + | |
161 | +.mce-content-body img::selection{background: 0 0;} | |
162 | + | |
163 | +.ephox-snooker-resizer-bar{background-color: #b4d7ff;opacity: 0;} | |
164 | + | |
165 | +.ephox-snooker-resizer-cols{cursor: col-resize;} | |
166 | + | |
167 | +.ephox-snooker-resizer-rows{cursor: row-resize;} | |
168 | + | |
169 | +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity: 1;} | |
170 | + | |
171 | +.mce-spellchecker-word{height: 2rem;cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.5'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;} | |
172 | + | |
173 | +.mce-spellchecker-grammar{cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23008800'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;} | |
174 | + | |
175 | +.mce-toc{border: 1px solid gray;} | |
176 | + | |
177 | +.mce-toc h2{margin: 4px;} | |
178 | + | |
179 | +.mce-toc li{list-style-type: none;} | |
180 | + | |
181 | +.mce-item-table,.mce-item-table caption,.mce-item-table td,.mce-item-table th{border: 1px dashed #bbb;} | |
182 | + | |
183 | +.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{padding-top: 10px;margin-left: 3px;background-repeat: no-repeat;border: 1px dashed #bbb;} | |
184 | + | |
185 | +.mce-visualblocks p{background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);} | |
186 | + | |
187 | +.mce-visualblocks h1{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);} | |
188 | + | |
189 | +.mce-visualblocks h2{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);} | |
190 | + | |
191 | +.mce-visualblocks h3{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);} | |
192 | + | |
193 | +.mce-visualblocks h4{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);} | |
194 | + | |
195 | +.mce-visualblocks h5{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);} | |
196 | + | |
197 | +.mce-visualblocks h6{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);} | |
198 | + | |
199 | +.mce-visualblocks div:not([data-mce-bogus]){background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);} | |
200 | + | |
201 | +.mce-visualblocks section{background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);} | |
202 | + | |
203 | +.mce-visualblocks article{background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);} | |
204 | + | |
205 | +.mce-visualblocks blockquote{background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);} | |
206 | + | |
207 | +.mce-visualblocks address{background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);} | |
208 | + | |
209 | +.mce-visualblocks pre{background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);} | |
210 | + | |
211 | +.mce-visualblocks figure{background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);} | |
212 | + | |
213 | +.mce-visualblocks figcaption{border: 1px dashed #bbb;} | |
214 | + | |
215 | +.mce-visualblocks hgroup{background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);} | |
216 | + | |
217 | +.mce-visualblocks aside{background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);} | |
218 | + | |
219 | +.mce-visualblocks ul{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);} | |
220 | + | |
221 | +.mce-visualblocks ol{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);} | |
222 | + | |
223 | +.mce-visualblocks dl{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);} | |
224 | + | |
225 | +.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left: 3px;} | |
226 | + | |
227 | +.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x: right;margin-right: 3px;} | |
228 | + | |
229 | +.mce-nbsp,.mce-shy{background: #aaa;} | |
230 | + | |
231 | +.mce-shy::after{content: '-';} | |
232 | + | |
233 | +body{font-family: sans-serif;} | |
234 | + | |
235 | +table{border-collapse: collapse;} | ... | ... |
1 | +/** | |
2 | + * Copyright (c) Tiny Technologies, Inc. All rights reserved. | |
3 | + * Licensed under the LGPL or a commercial license. | |
4 | + * For LGPL see License.txt in the project root for license information. | |
5 | + * For commercial licenses see https://www.tiny.cloud/ | |
6 | + */ | |
7 | +.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{position: absolute;display: inline-block;background-color: green;opacity: .5;} | |
8 | + | |
9 | +body{-webkit-text-size-adjust: none;} | |
10 | + | |
11 | +body img{max-width: 96vw;} | |
12 | + | |
13 | +body table img{max-width: 95%;} | |
14 | + | |
15 | +body{font-family: sans-serif;} | |
16 | + | |
17 | +table{border-collapse: collapse;} | ... | ... |