Commit c7b48a7574c7c69a67f9747d2501aff446a0965e

Authored by 黄 x
0 parents

Initial commit

Too many changes to show.

To preserve performance only 58 of 709 files are displayed.

  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
  1 +# port
  2 +VITE_PORT = 8083
  3 +
  4 +# spa-title
  5 +VITE_GLOB_APP_TITLE = Yunteng IOT
  6 +
  7 +# spa shortname
  8 +VITE_GLOB_APP_SHORT_NAME = Yunteng IOT
  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
  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
  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
  1 +
  2 +*.sh
  3 +node_modules
  4 +*.md
  5 +*.woff
  6 +*.ttf
  7 +.vscode
  8 +.idea
  9 +dist
  10 +/public
  11 +/docs
  12 +.husky
  13 +.local
  14 +/bin
  15 +Dockerfile
  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 +});
  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?
  1 +ports:
  2 + - port: 3344
  3 + onOpen: open-preview
  4 +tasks:
  5 + - init: yarn
  6 + command: yarn dev
  1 +/dist/*
  2 +.local
  3 +.output.js
  4 +/node_modules/**
  5 +
  6 +**/*.svg
  7 +**/*.sh
  8 +
  9 +/public/*
  1 +/dist/*
  2 +/public/*
  3 +public/*
  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
  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](https://img.shields.io/github/license/anncwb/vue-vben-admin.svg)](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 +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](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 +非常欢迎你的加入![提一个 Issue](https://github.com/anncwb/vue-vben-admin/issues/new/choose) 或者提交一个 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 +![donate](https://anncwb.github.io/anncwb/images/sponsor.png)
  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)
  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 +}
  1 +/**
  2 + * The name of the configuration file entered in the production environment
  3 + */
  4 +export const GLOB_CONFIG_FILE_NAME = '_app.config.js';
  5 +
  6 +export const OUTPUT_DIR = 'target/dist';
  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 +}
  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();
  1 +/**
  2 + * Get the configuration file variable name
  3 + * @param env
  4 + */
  5 +export const getConfigFileName = (env: Record<string, any>) => {
  6 + return `__PRODUCTION__${env.VITE_GLOB_APP_SHORT_NAME || '__APP'}__CONF__`
  7 + .toUpperCase()
  8 + .replace(/\s/g, '');
  9 +};
  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 +}
  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();
  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 +}
  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 +};
  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 +}
  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 +}
  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 +}
  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 +}
  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 +}
  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 +}
  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 +}
  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 +}
  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 +}
  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 +}
  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 +}
  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 +}
  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>
  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 +};
  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 +}
  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 +}
  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[];
  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[];
  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[];
  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[];
  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[];
  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[];
  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[];
  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 +}
  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>
  1 +module.exports = {
  2 + plugins: {
  3 + autoprefixer: {},
  4 + },
  5 +};
  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 +};
No preview for this file type
  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 +})
  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;}