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 | +}); |
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;} |