Browse Source

初始化

online
jianglong 4 years ago
parent
commit
6df91f6dff
  1. 3
      README.md
  2. 5
      babel.config.js
  3. 546
      cms后台.postman_collection.json
  4. BIN
      ele-admin-20210316.zip
  5. 14
      jsconfig.json
  6. 12781
      package-lock.json
  7. 56
      package.json
  8. BIN
      public/favicon.ico
  9. 22
      public/index.html
  10. 389
      public/tinymce/langs/zh_CN.js
  11. 59
      public/tinymce/skins/content/dark/content.css
  12. 7
      public/tinymce/skins/content/dark/content.min.css
  13. 49
      public/tinymce/skins/content/default/content.css
  14. 7
      public/tinymce/skins/content/default/content.min.css
  15. 54
      public/tinymce/skins/content/document/content.css
  16. 7
      public/tinymce/skins/content/document/content.min.css
  17. 50
      public/tinymce/skins/content/writer/content.css
  18. 7
      public/tinymce/skins/content/writer/content.min.css
  19. 677
      public/tinymce/skins/ui/oxide-dark/content.css
  20. 689
      public/tinymce/skins/ui/oxide-dark/content.inline.css
  21. 7
      public/tinymce/skins/ui/oxide-dark/content.inline.min.css
  22. 7
      public/tinymce/skins/ui/oxide-dark/content.min.css
  23. 29
      public/tinymce/skins/ui/oxide-dark/content.mobile.css
  24. 7
      public/tinymce/skins/ui/oxide-dark/content.mobile.min.css
  25. BIN
      public/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff
  26. 2937
      public/tinymce/skins/ui/oxide-dark/skin.css
  27. 7
      public/tinymce/skins/ui/oxide-dark/skin.min.css
  28. 673
      public/tinymce/skins/ui/oxide-dark/skin.mobile.css
  29. 7
      public/tinymce/skins/ui/oxide-dark/skin.mobile.min.css
  30. 695
      public/tinymce/skins/ui/oxide/content.css
  31. 689
      public/tinymce/skins/ui/oxide/content.inline.css
  32. 7
      public/tinymce/skins/ui/oxide/content.inline.min.css
  33. 7
      public/tinymce/skins/ui/oxide/content.min.css
  34. 29
      public/tinymce/skins/ui/oxide/content.mobile.css
  35. 7
      public/tinymce/skins/ui/oxide/content.mobile.min.css
  36. BIN
      public/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff
  37. 2937
      public/tinymce/skins/ui/oxide/skin.css
  38. 7
      public/tinymce/skins/ui/oxide/skin.min.css
  39. 673
      public/tinymce/skins/ui/oxide/skin.mobile.css
  40. 7
      public/tinymce/skins/ui/oxide/skin.mobile.min.css
  41. 5
      src/App.vue
  42. BIN
      src/assets/bg-login.jpg
  43. 480
      src/assets/ic-403.svg
  44. 299
      src/assets/ic-404.svg
  45. 191
      src/assets/ic-500.svg
  46. 24
      src/assets/logo.svg
  47. 259
      src/components/TinymceEditor/index.vue
  48. 79
      src/config/axios-config.js
  49. 134
      src/config/setting.js
  50. BIN
      src/fonts/element-icons.ttf
  51. BIN
      src/fonts/element-icons.woff
  52. 33
      src/layout/footer.vue
  53. 111
      src/layout/header-right.vue
  54. 189
      src/layout/index.vue
  55. 300
      src/layout/notice.vue
  56. 136
      src/layout/password.vue
  57. 23
      src/main.js
  58. 145
      src/router/index.js
  59. 4
      src/store/getters.js
  60. 21
      src/store/index.js
  61. 302
      src/store/modules/theme.js
  62. 259
      src/store/modules/user.js
  63. 63
      src/styles/index.scss
  64. 5
      src/styles/theme/cyan-dark.scss
  65. 6
      src/styles/theme/cyan.scss
  66. 4
      src/styles/theme/dark.scss
  67. 5
      src/styles/theme/dust-dark.scss
  68. 6
      src/styles/theme/dust.scss
  69. 5
      src/styles/theme/geekblue-dark.scss
  70. 6
      src/styles/theme/geekblue.scss
  71. 5
      src/styles/theme/green-dark.scss
  72. 6
      src/styles/theme/green.scss
  73. 5
      src/styles/theme/purple-dark.scss
  74. 6
      src/styles/theme/purple.scss
  75. 5
      src/styles/theme/sunset-dark.scss
  76. 6
      src/styles/theme/sunset.scss
  77. 5
      src/styles/theme/volcano-dark.scss
  78. 6
      src/styles/theme/volcano.scss
  79. 2
      src/styles/var.scss
  80. 128
      src/utils/permission.js
  81. 202
      src/views/ad/ad-data-edit.vue
  82. 263
      src/views/ad/ad-data.vue
  83. 190
      src/views/ad/ad-edit.vue
  84. 276
      src/views/ad/index.vue
  85. 355
      src/views/cate/cate-edit.vue
  86. 174
      src/views/cate/cate-relation-edit.vue
  87. 298
      src/views/cate/cate-relation.vue
  88. 367
      src/views/cate/index.vue
  89. 404
      src/views/config/index.vue
  90. 470
      src/views/config/message.vue
  91. 240
      src/views/content/content-edit.vue
  92. 234
      src/views/content/content-list.vue
  93. 105
      src/views/content/index.vue
  94. 559
      src/views/dashboard/analysis.vue
  95. 613
      src/views/dashboard/monitor.vue
  96. 622
      src/views/dashboard/workplace.vue
  97. 195
      src/views/debris/debris-edit.vue
  98. 306
      src/views/debris/index.vue
  99. 247
      src/views/example/choose/index.vue
  100. 310
      src/views/example/document/file-sort.vue

3
README.md

@ -0,0 +1,3 @@
# front.cms.ahbmz.com
cms前台页面

5
babel.config.js

@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

546
cms后台.postman_collection.json

File diff suppressed because one or more lines are too long

BIN
ele-admin-20210316.zip

Binary file not shown.

14
jsconfig.json

@ -0,0 +1,14 @@
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@/*": [
"src/*"
]
}
},
"exclude": [
"node_modules",
"dist"
]
}

12781
package-lock.json

File diff suppressed because it is too large

56
package.json

@ -0,0 +1,56 @@
{
"name": "ele-admin-template",
"version": "1.2.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"build:preview": "vue-cli-service build --mode preview",
"build:report": "vue-cli-service build --report",
"lint": "vue-cli-service lint"
},
"dependencies": {
"@amap/amap-jsapi-loader": "^0.0.7",
"@riophae/vue-treeselect": "^0.4.0",
"@tinymce/tinymce-vue": "^3.2.8",
"axios": "^0.21.1",
"core-js": "^3.8.3",
"countup.js": "^2.0.7",
"cropperjs": "^1.5.9",
"echarts": "^4.9.0",
"echarts-wordcloud": "^1.1.3",
"ele-admin": "^1.2.0",
"element-ui": "^2.15.0",
"nprogress": "^0.2.0",
"tinymce": "^5.7.0",
"vue": "^2.6.12",
"vue-axios": "^2.1.5",
"vue-clipboard2": "^0.3.1",
"vue-countup-v2": "^4.0.0",
"vue-qr": "^2.3.0",
"vue-router": "^3.5.1",
"vuedraggable": "^2.24.3",
"vuex": "^3.6.2",
"xgplayer-vue": "^1.1.5",
"xlsx": "^0.16.9"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.5.11",
"@vue/cli-plugin-eslint": "^4.5.11",
"@vue/cli-plugin-router": "^4.5.11",
"@vue/cli-plugin-vuex": "^4.5.11",
"@vue/cli-service": "^4.5.11",
"babel-eslint": "^10.1.0",
"compression-webpack-plugin": "^6.1.1",
"eslint": "^6.8.0",
"eslint-plugin-vue": "^7.6.0",
"sass": "^1.3.0",
"sass-loader": "^10.1.1",
"vue-template-compiler": "^2.6.12"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}

BIN
public/favicon.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

22
public/index.html

@ -0,0 +1,22 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= process.env.VUE_APP_NAME %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app">
<div class="ele-admin-loading"></div>
<style>
.ele-admin-loading{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.ele-admin-loading:before{content:"";width:30px;height:30px;margin:0 auto;display:block;border-radius:50%;background:#409eff;animation:loading-bounce .3s cubic-bezier(0.05,0,0.2,1) infinite alternate}.ele-admin-loading:after{content:"";width:10px;height:2px;margin:0 auto;display:block;border-radius:50%;background:#BBB;animation:loading-shadow .3s cubic-bezier(0.05,0,0.2,1) infinite alternate}@keyframes loading-bounce{from{transform:translateY(0)}to{transform:translateY(-40px)}}@keyframes loading-shadow{from{transform:scale(1,1);opacity:1}to{transform:scale(3,2);opacity:.3}}
</style>
</div>
<!-- built files will be auto injected -->
</body>
</html>

389
public/tinymce/langs/zh_CN.js

@ -0,0 +1,389 @@
tinymce.addI18n('zh_CN',{
"Redo": "\u91cd\u505a",
"Undo": "\u64a4\u9500",
"Cut": "\u526a\u5207",
"Copy": "\u590d\u5236",
"Paste": "\u7c98\u8d34",
"Select all": "\u5168\u9009",
"New document": "\u65b0\u6587\u4ef6",
"Ok": "\u786e\u5b9a",
"Cancel": "\u53d6\u6d88",
"Visual aids": "\u7f51\u683c\u7ebf",
"Bold": "\u7c97\u4f53",
"Italic": "\u659c\u4f53",
"Underline": "\u4e0b\u5212\u7ebf",
"Strikethrough": "\u5220\u9664\u7ebf",
"Superscript": "\u4e0a\u6807",
"Subscript": "\u4e0b\u6807",
"Clear formatting": "\u6e05\u9664\u683c\u5f0f",
"Align left": "\u5de6\u8fb9\u5bf9\u9f50",
"Align center": "\u4e2d\u95f4\u5bf9\u9f50",
"Align right": "\u53f3\u8fb9\u5bf9\u9f50",
"Justify": "\u4e24\u7aef\u5bf9\u9f50",
"Bullet list": "\u9879\u76ee\u7b26\u53f7",
"Numbered list": "\u7f16\u53f7\u5217\u8868",
"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb",
"Increase indent": "\u589e\u52a0\u7f29\u8fdb",
"Close": "\u5173\u95ed",
"Formats": "\u683c\u5f0f",
"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",
"Headers": "\u6807\u9898",
"Header 1": "\u6807\u98981",
"Header 2": "\u6807\u98982",
"Header 3": "\u6807\u98983",
"Header 4": "\u6807\u98984",
"Header 5": "\u6807\u98985",
"Header 6": "\u6807\u98986",
"Headings": "\u6807\u9898",
"Heading 1": "\u6807\u98981",
"Heading 2": "\u6807\u98982",
"Heading 3": "\u6807\u98983",
"Heading 4": "\u6807\u98984",
"Heading 5": "\u6807\u98985",
"Heading 6": "\u6807\u98986",
"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684",
"Div": "Div",
"Pre": "Pre",
"Code": "\u4ee3\u7801",
"Paragraph": "\u6bb5\u843d",
"Blockquote": "\u5f15\u6587\u533a\u5757",
"Inline": "\u6587\u672c",
"Blocks": "\u57fa\u5757",
"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",
"Fonts": "\u5b57\u4f53",
"Font Sizes": "\u5b57\u53f7",
"Class": "\u7c7b\u578b",
"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf",
"OR": "\u6216",
"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64",
"Upload": "\u4e0a\u4f20",
"Block": "\u5757",
"Align": "\u5bf9\u9f50",
"Default": "\u9ed8\u8ba4",
"Circle": "\u7a7a\u5fc3\u5706",
"Disc": "\u5b9e\u5fc3\u5706",
"Square": "\u65b9\u5757",
"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd",
"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd",
"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd",
"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd",
"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd",
"Anchor...": "\u951a\u70b9...",
"Name": "\u540d\u79f0",
"Id": "\u6807\u8bc6\u7b26",
"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",
"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",
"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f",
"Special characters...": "\u7279\u6b8a\u5b57\u7b26...",
"Source code": "\u6e90\u4ee3\u7801",
"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b",
"Language": "\u8bed\u8a00",
"Code sample...": "\u793a\u4f8b\u4ee3\u7801...",
"Color Picker": "\u9009\u8272\u5668",
"R": "R",
"G": "G",
"B": "B",
"Left to right": "\u4ece\u5de6\u5230\u53f3",
"Right to left": "\u4ece\u53f3\u5230\u5de6",
"Emoticons...": "\u8868\u60c5\u7b26\u53f7...",
"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027",
"Title": "\u6807\u9898",
"Keywords": "\u5173\u952e\u8bcd",
"Description": "\u63cf\u8ff0",
"Robots": "\u673a\u5668\u4eba",
"Author": "\u4f5c\u8005",
"Encoding": "\u7f16\u7801",
"Fullscreen": "\u5168\u5c4f",
"Action": "\u64cd\u4f5c",
"Shortcut": "\u5feb\u6377\u952e",
"Help": "\u5e2e\u52a9",
"Address": "\u5730\u5740",
"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f",
"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f",
"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84",
"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355",
"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):",
"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a",
"Learn more...": "\u4e86\u89e3\u66f4\u591a...",
"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}",
"Plugins": "\u63d2\u4ef6",
"Handy Shortcuts": "\u5feb\u6377\u952e",
"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf",
"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247",
"Image description": "\u56fe\u7247\u63cf\u8ff0",
"Source": "\u5730\u5740",
"Dimensions": "\u5927\u5c0f",
"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4",
"General": "\u666e\u901a",
"Advanced": "\u9ad8\u7ea7",
"Style": "\u6837\u5f0f",
"Vertical space": "\u5782\u76f4\u8fb9\u8ddd",
"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd",
"Border": "\u8fb9\u6846",
"Insert image": "\u63d2\u5165\u56fe\u7247",
"Image...": "\u56fe\u7247...",
"Image list": "\u56fe\u7247\u5217\u8868",
"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c",
"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c",
"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c",
"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c",
"Edit image": "\u7f16\u8f91\u56fe\u7247",
"Image options": "\u56fe\u7247\u9009\u9879",
"Zoom in": "\u653e\u5927",
"Zoom out": "\u7f29\u5c0f",
"Crop": "\u88c1\u526a",
"Resize": "\u8c03\u6574\u5927\u5c0f",
"Orientation": "\u65b9\u5411",
"Brightness": "\u4eae\u5ea6",
"Sharpen": "\u9510\u5316",
"Contrast": "\u5bf9\u6bd4\u5ea6",
"Color levels": "\u989c\u8272\u5c42\u6b21",
"Gamma": "\u4f3d\u9a6c\u503c",
"Invert": "\u53cd\u8f6c",
"Apply": "\u5e94\u7528",
"Back": "\u540e\u9000",
"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4",
"Date\/time": "\u65e5\u671f\/\u65f6\u95f4",
"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
"Text to display": "\u663e\u793a\u6587\u5b57",
"Url": "\u5730\u5740",
"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...",
"Current window": "\u5f53\u524d\u7a97\u53e3",
"None": "\u65e0",
"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00",
"Remove link": "\u5220\u9664\u94fe\u63a5",
"Anchors": "\u951a\u70b9",
"Link...": "\u94fe\u63a5...",
"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5",
"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",
"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",
"Link list": "\u94fe\u63a5\u5217\u8868",
"Insert video": "\u63d2\u5165\u89c6\u9891",
"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891",
"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53",
"Alternative source": "\u955c\u50cf",
"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740",
"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)",
"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:",
"Embed": "\u5185\u5d4c",
"Media...": "\u591a\u5a92\u4f53...",
"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c",
"Page break": "\u5206\u9875\u7b26",
"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c",
"Preview": "\u9884\u89c8",
"Print...": "\u6253\u5370...",
"Save": "\u4fdd\u5b58",
"Find": "\u67e5\u627e",
"Replace with": "\u66ff\u6362\u4e3a",
"Replace": "\u66ff\u6362",
"Replace all": "\u5168\u90e8\u66ff\u6362",
"Previous": "\u4e0a\u4e00\u4e2a",
"Next": "\u4e0b\u4e00\u4e2a",
"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...",
"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.",
"Match case": "\u533a\u5206\u5927\u5c0f\u5199",
"Find whole words only": "\u5168\u5b57\u5339\u914d",
"Spell check": "\u62fc\u5199\u68c0\u67e5",
"Ignore": "\u5ffd\u7565",
"Ignore all": "\u5168\u90e8\u5ffd\u7565",
"Finish": "\u5b8c\u6210",
"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178",
"Insert table": "\u63d2\u5165\u8868\u683c",
"Table properties": "\u8868\u683c\u5c5e\u6027",
"Delete table": "\u5220\u9664\u8868\u683c",
"Cell": "\u5355\u5143\u683c",
"Row": "\u884c",
"Column": "\u5217",
"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027",
"Merge cells": "\u5408\u5e76\u5355\u5143\u683c",
"Split cell": "\u62c6\u5206\u5355\u5143\u683c",
"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165",
"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165",
"Delete row": "\u5220\u9664\u884c",
"Row properties": "\u884c\u5c5e\u6027",
"Cut row": "\u526a\u5207\u884c",
"Copy row": "\u590d\u5236\u884c",
"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9",
"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9",
"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165",
"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165",
"Delete column": "\u5220\u9664\u5217",
"Cols": "\u5217",
"Rows": "\u884c",
"Width": "\u5bbd",
"Height": "\u9ad8",
"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd",
"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd",
"Show caption": "\u663e\u793a\u6807\u9898",
"Left": "\u5de6\u5bf9\u9f50",
"Center": "\u5c45\u4e2d",
"Right": "\u53f3\u5bf9\u9f50",
"Cell type": "\u5355\u5143\u683c\u7c7b\u578b",
"Scope": "\u8303\u56f4",
"Alignment": "\u5bf9\u9f50\u65b9\u5f0f",
"H Align": "\u6c34\u5e73\u5bf9\u9f50",
"V Align": "\u5782\u76f4\u5bf9\u9f50",
"Top": "\u9876\u90e8\u5bf9\u9f50",
"Middle": "\u5782\u76f4\u5c45\u4e2d",
"Bottom": "\u5e95\u90e8\u5bf9\u9f50",
"Header cell": "\u8868\u5934\u5355\u5143\u683c",
"Row group": "\u884c\u7ec4",
"Column group": "\u5217\u7ec4",
"Row type": "\u884c\u7c7b\u578b",
"Header": "\u8868\u5934",
"Body": "\u8868\u4f53",
"Footer": "\u8868\u5c3e",
"Border color": "\u8fb9\u6846\u989c\u8272",
"Insert template...": "\u63d2\u5165\u6a21\u677f...",
"Templates": "\u6a21\u677f",
"Template": "\u6a21\u677f",
"Text color": "\u6587\u5b57\u989c\u8272",
"Background color": "\u80cc\u666f\u8272",
"Custom...": "\u81ea\u5b9a\u4e49...",
"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272",
"No color": "\u65e0",
"Remove color": "\u79fb\u9664\u989c\u8272",
"Table of Contents": "\u5185\u5bb9\u5217\u8868",
"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846",
"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26",
"Word count": "\u5b57\u6570",
"Words: {0}": "\u5b57\u6570\uff1a{0}",
"{0} words": "{0} \u5b57",
"File": "\u6587\u4ef6",
"Edit": "\u7f16\u8f91",
"Insert": "\u63d2\u5165",
"View": "\u89c6\u56fe",
"Format": "\u683c\u5f0f",
"Table": "\u8868\u683c",
"Tools": "\u5de5\u5177",
"Powered by {0}": "\u7531{0}\u9a71\u52a8",
"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",
"Image title": "\u56fe\u7247\u6807\u9898",
"Border width": "\u8fb9\u6846\u5bbd\u5ea6",
"Border style": "\u8fb9\u6846\u6837\u5f0f",
"Error": "\u9519\u8bef",
"Warn": "\u8b66\u544a",
"Valid": "\u6709\u6548",
"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846",
"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002",
"System Font": "\u7cfb\u7edf\u5b57\u4f53",
"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}",
"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}",
"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}",
"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}",
"example": "\u793a\u4f8b",
"Search": "\u641c\u7d22",
"All": "\u5168\u90e8",
"Currency": "\u8d27\u5e01",
"Text": "\u6587\u5b57",
"Quotations": "\u5f15\u7528",
"Mathematical": "\u6570\u5b66",
"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145",
"Symbols": "\u7b26\u53f7",
"Arrows": "\u7bad\u5934",
"User Defined": "\u81ea\u5b9a\u4e49",
"dollar sign": "\u7f8e\u5143\u7b26\u53f7",
"currency sign": "\u8d27\u5e01\u7b26\u53f7",
"euro-currency sign": "\u6b27\u5143\u7b26\u53f7",
"colon sign": "\u5192\u53f7",
"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7",
"french franc sign": "\u6cd5\u90ce\u7b26\u53f7",
"lira sign": "\u91cc\u62c9\u7b26\u53f7",
"mill sign": "\u5bc6\u5c14\u7b26\u53f7",
"naira sign": "\u5948\u62c9\u7b26\u53f7",
"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7",
"rupee sign": "\u5362\u6bd4\u7b26\u53f7",
"won sign": "\u97e9\u5143\u7b26\u53f7",
"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7",
"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7",
"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7",
"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7",
"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7",
"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7",
"peso sign": "\u6bd4\u7d22\u7b26\u53f7",
"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7",
"austral sign": "\u6fb3\u5143\u7b26\u53f7",
"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7",
"cedi sign": "\u585e\u5730\u7b26\u53f7",
"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7",
"spesmilo sign": "spesmilo\u7b26\u53f7",
"tenge sign": "\u575a\u6208\u7b26\u53f7",
"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4",
"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9",
"nordic mark sign": "\u5317\u6b27\u9a6c\u514b",
"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7",
"ruble sign": "\u5362\u5e03\u7b26\u53f7",
"yen character": "\u65e5\u5143\u5b57\u6837",
"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837",
"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09",
"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09",
"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...",
"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7",
"People": "\u4eba\u7c7b",
"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136",
"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1",
"Activity": "\u6d3b\u52a8",
"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9",
"Objects": "\u7269\u4ef6",
"Flags": "\u65d7\u5e1c",
"Characters": "\u5b57\u7b26",
"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)",
"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002",
"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002",
"Update": "\u66f4\u65b0",
"Color swatch": "\u989c\u8272\u6837\u672c",
"Turquoise": "\u9752\u7eff\u8272",
"Green": "\u7eff\u8272",
"Blue": "\u84dd\u8272",
"Purple": "\u7d2b\u8272",
"Navy Blue": "\u6d77\u519b\u84dd",
"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272",
"Dark Green": "\u6df1\u7eff\u8272",
"Medium Blue": "\u4e2d\u84dd\u8272",
"Medium Purple": "\u4e2d\u7d2b\u8272",
"Midnight Blue": "\u6df1\u84dd\u8272",
"Yellow": "\u9ec4\u8272",
"Orange": "\u6a59\u8272",
"Red": "\u7ea2\u8272",
"Light Gray": "\u6d45\u7070\u8272",
"Gray": "\u7070\u8272",
"Dark Yellow": "\u6697\u9ec4\u8272",
"Dark Orange": "\u6df1\u6a59\u8272",
"Dark Red": "\u6df1\u7ea2\u8272",
"Medium Gray": "\u4e2d\u7070\u8272",
"Dark Gray": "\u6df1\u7070\u8272",
"Black": "\u9ed1\u8272",
"White": "\u767d\u8272",
"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f",
"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846",
"history": "\u5386\u53f2",
"styles": "\u6837\u5f0f",
"formatting": "\u683c\u5f0f\u5316",
"alignment": "\u5bf9\u9f50",
"indentation": "\u7f29\u8fdb",
"permanent pen": "\u8bb0\u53f7\u7b14",
"comments": "\u5907\u6ce8",
"Anchor": "\u951a\u70b9",
"Special character": "\u7279\u6b8a\u7b26\u53f7",
"Code sample": "\u4ee3\u7801\u793a\u4f8b",
"Color": "\u989c\u8272",
"Emoticons": "\u8868\u60c5",
"Document properties": "\u6587\u6863\u5c5e\u6027",
"Image": "\u56fe\u7247",
"Insert link": "\u63d2\u5165\u94fe\u63a5",
"Target": "\u6253\u5f00\u65b9\u5f0f",
"Link": "\u94fe\u63a5",
"Poster": "\u5c01\u9762",
"Media": "\u5a92\u4f53",
"Print": "\u6253\u5370",
"Prev": "\u4e0a\u4e00\u4e2a",
"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362",
"Whole words": "\u5168\u5b57\u5339\u914d",
"Spellcheck": "\u62fc\u5199\u68c0\u67e5",
"Caption": "\u6807\u9898",
"Insert template": "\u63d2\u5165\u6a21\u677f"
});

59
public/tinymce/skins/content/dark/content.css

@ -0,0 +1,59 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
body {
background-color: #2f3742;
color: #dfe0e4;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
line-height: 1.4;
margin: 1rem;
}
a {
color: #4099ff;
}
table {
border-collapse: collapse;
}
table th,
table td {
border: 1px solid #6d737b;
padding: 0.4rem;
}
figure {
display: table;
margin: 1rem auto;
}
figure figcaption {
color: #8a8f97;
display: block;
margin-top: 0.25rem;
text-align: center;
}
hr {
border-color: #6d737b;
border-style: solid;
border-width: 1px 0 0 0;
}
code {
background-color: #6d737b;
border-radius: 3px;
padding: 0.1rem 0.2rem;
}
/* Make text in selected cells in tables dark and readable */
td[data-mce-selected],
th[data-mce-selected] {
color: #333;
}
.mce-content-body:not([dir=rtl]) blockquote {
border-left: 2px solid #6d737b;
margin-left: 1.5rem;
padding-left: 1rem;
}
.mce-content-body[dir=rtl] blockquote {
border-right: 2px solid #6d737b;
margin-right: 1.5rem;
padding-right: 1rem;
}

7
public/tinymce/skins/content/dark/content.min.css

@ -0,0 +1,7 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
body{background-color:#2f3742;color:#dfe0e4;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}a{color:#4099ff}table{border-collapse:collapse}table td,table th{border:1px solid #6d737b;padding:.4rem}figure{display:table;margin:1rem auto}figure figcaption{color:#8a8f97;display:block;margin-top:.25rem;text-align:center}hr{border-color:#6d737b;border-style:solid;border-width:1px 0 0 0}code{background-color:#6d737b;border-radius:3px;padding:.1rem .2rem}td[data-mce-selected],th[data-mce-selected]{color:#333}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #6d737b;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #6d737b;margin-right:1.5rem;padding-right:1rem}

49
public/tinymce/skins/content/default/content.css

@ -0,0 +1,49 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
line-height: 1.4;
margin: 1rem;
}
table {
border-collapse: collapse;
}
table th,
table td {
border: 1px solid #ccc;
padding: 0.4rem;
}
figure {
display: table;
margin: 1rem auto;
}
figure figcaption {
color: #999;
display: block;
margin-top: 0.25rem;
text-align: center;
}
hr {
border-color: #ccc;
border-style: solid;
border-width: 1px 0 0 0;
}
code {
background-color: #e8e8e8;
border-radius: 3px;
padding: 0.1rem 0.2rem;
}
.mce-content-body:not([dir=rtl]) blockquote {
border-left: 2px solid #ccc;
margin-left: 1.5rem;
padding-left: 1rem;
}
.mce-content-body[dir=rtl] blockquote {
border-right: 2px solid #ccc;
margin-right: 1.5rem;
padding-right: 1rem;
}

7
public/tinymce/skins/content/default/content.min.css

@ -0,0 +1,7 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table td,table th{border:1px solid #ccc;padding:.4rem}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}

54
public/tinymce/skins/content/document/content.css

@ -0,0 +1,54 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
@media screen {
html {
background: #f4f4f4;
min-height: 100%;
}
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
}
@media screen {
body {
background-color: #fff;
box-shadow: 0 0 4px rgba(0, 0, 0, 0.15);
box-sizing: border-box;
margin: 1rem auto 0;
max-width: 820px;
min-height: calc(100vh - 1rem);
padding: 4rem 6rem 6rem 6rem;
}
}
table {
border-collapse: collapse;
}
table th,
table td {
border: 1px solid #ccc;
padding: 0.4rem;
}
figure figcaption {
color: #999;
margin-top: 0.25rem;
text-align: center;
}
hr {
border-color: #ccc;
border-style: solid;
border-width: 1px 0 0 0;
}
.mce-content-body:not([dir=rtl]) blockquote {
border-left: 2px solid #ccc;
margin-left: 1.5rem;
padding-left: 1rem;
}
.mce-content-body[dir=rtl] blockquote {
border-right: 2px solid #ccc;
margin-right: 1.5rem;
padding-right: 1rem;
}

7
public/tinymce/skins/content/document/content.min.css

@ -0,0 +1,7 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
@media screen{html{background:#f4f4f4;min-height:100%}}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif}@media screen{body{background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.15);box-sizing:border-box;margin:1rem auto 0;max-width:820px;min-height:calc(100vh - 1rem);padding:4rem 6rem 6rem 6rem}}table{border-collapse:collapse}table td,table th{border:1px solid #ccc;padding:.4rem}figure figcaption{color:#999;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}

50
public/tinymce/skins/content/writer/content.css

@ -0,0 +1,50 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
line-height: 1.4;
margin: 1rem auto;
max-width: 900px;
}
table {
border-collapse: collapse;
}
table th,
table td {
border: 1px solid #ccc;
padding: 0.4rem;
}
figure {
display: table;
margin: 1rem auto;
}
figure figcaption {
color: #999;
display: block;
margin-top: 0.25rem;
text-align: center;
}
hr {
border-color: #ccc;
border-style: solid;
border-width: 1px 0 0 0;
}
code {
background-color: #e8e8e8;
border-radius: 3px;
padding: 0.1rem 0.2rem;
}
.mce-content-body:not([dir=rtl]) blockquote {
border-left: 2px solid #ccc;
margin-left: 1.5rem;
padding-left: 1rem;
}
.mce-content-body[dir=rtl] blockquote {
border-right: 2px solid #ccc;
margin-right: 1.5rem;
padding-right: 1rem;
}

7
public/tinymce/skins/content/writer/content.min.css

@ -0,0 +1,7 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem auto;max-width:900px}table{border-collapse:collapse}table td,table th{border:1px solid #ccc;padding:.4rem}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}

677
public/tinymce/skins/ui/oxide-dark/content.css

@ -0,0 +1,677 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
.mce-content-body .mce-item-anchor {
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'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
cursor: default;
display: inline-block;
height: 12px !important;
padding: 0 2px;
-webkit-user-modify: read-only;
-moz-user-modify: read-only;
-webkit-user-select: all;
-moz-user-select: all;
-ms-user-select: all;
user-select: all;
width: 8px !important;
}
.mce-content-body .mce-item-anchor[data-mce-selected] {
outline-offset: 1px;
}
.tox-comments-visible .tox-comment {
background-color: #fff0b7;
}
.tox-comments-visible .tox-comment--active {
background-color: #ffe168;
}
.tox-checklist > li:not(.tox-checklist--hidden) {
list-style: none;
margin: 0.25em 0;
}
.tox-checklist > li:not(.tox-checklist--hidden)::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-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%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
background-size: 100%;
content: '';
cursor: pointer;
height: 1em;
margin-left: -1.5em;
margin-top: 0.125em;
position: absolute;
width: 1em;
}
.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");
}
[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
margin-left: 0;
margin-right: -1.5em;
}
/* stylelint-disable */
/* http://prismjs.com/ */
/**
* Dracula Theme originally by Zeno Rocha [@zenorocha]
* https://draculatheme.com/
*
* Ported for PrismJS by Albert Vallverdu [@byverdu]
*/
code[class*="language-"],
pre[class*="language-"] {
color: #f8f8f2;
background: none;
text-shadow: 0 1px rgba(0, 0, 0, 0.3);
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: 0.5em 0;
overflow: auto;
border-radius: 0.3em;
}
:not(pre) > code[class*="language-"],
pre[class*="language-"] {
background: #282a36;
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: 0.1em;
border-radius: 0.3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: #6272a4;
}
.token.punctuation {
color: #f8f8f2;
}
.namespace {
opacity: 0.7;
}
.token.property,
.token.tag,
.token.constant,
.token.symbol,
.token.deleted {
color: #ff79c6;
}
.token.boolean,
.token.number {
color: #bd93f9;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #50fa7b;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string,
.token.variable {
color: #f8f8f2;
}
.token.atrule,
.token.attr-value,
.token.function,
.token.class-name {
color: #f1fa8c;
}
.token.keyword {
color: #8be9fd;
}
.token.regex,
.token.important {
color: #ffb86c;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
/* stylelint-enable */
.mce-content-body {
overflow-wrap: break-word;
word-wrap: break-word;
}
.mce-content-body .mce-visual-caret {
background-color: black;
background-color: currentColor;
position: absolute;
}
.mce-content-body .mce-visual-caret-hidden {
display: none;
}
.mce-content-body *[data-mce-caret] {
left: -1000px;
margin: 0;
padding: 0;
position: absolute;
right: auto;
top: 0;
}
.mce-content-body .mce-offscreen-selection {
left: -2000000px;
max-width: 1000000px;
position: absolute;
}
.mce-content-body *[contentEditable=false] {
cursor: default;
}
.mce-content-body *[contentEditable=true] {
cursor: text;
}
.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;
}
.mce-content-body figure.align-left {
float: left;
}
.mce-content-body figure.align-right {
float: right;
}
.mce-content-body figure.image.align-center {
display: table;
margin-left: auto;
margin-right: auto;
}
.mce-preview-object {
border: 1px solid gray;
display: inline-block;
line-height: 0;
margin: 0 2px 0 2px;
position: relative;
}
.mce-preview-object .mce-shim {
background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
.mce-preview-object[data-mce-selected="2"] .mce-shim {
display: none;
}
.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%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
border: 1px dashed #aaa;
}
.mce-pagebreak {
border: 1px dashed #aaa;
cursor: default;
display: block;
height: 5px;
margin-top: 15px;
page-break-before: always;
width: 100%;
}
@media print {
.mce-pagebreak {
border: 0;
}
}
.tiny-pageembed .mce-shim {
background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
.tiny-pageembed[data-mce-selected="2"] .mce-shim {
display: none;
}
.tiny-pageembed {
display: inline-block;
position: relative;
}
.tiny-pageembed--21by9,
.tiny-pageembed--16by9,
.tiny-pageembed--4by3,
.tiny-pageembed--1by1 {
display: block;
overflow: hidden;
padding: 0;
position: relative;
width: 100%;
}
.tiny-pageembed--21by9 {
padding-top: 42.857143%;
}
.tiny-pageembed--16by9 {
padding-top: 56.25%;
}
.tiny-pageembed--4by3 {
padding-top: 75%;
}
.tiny-pageembed--1by1 {
padding-top: 100%;
}
.tiny-pageembed--21by9 iframe,
.tiny-pageembed--16by9 iframe,
.tiny-pageembed--4by3 iframe,
.tiny-pageembed--1by1 iframe {
border: 0;
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
.mce-content-body[data-mce-placeholder] {
position: relative;
}
.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
color: rgba(34, 47, 62, 0.7);
content: attr(data-mce-placeholder);
position: absolute;
}
.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
left: 1px;
}
.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
right: 1px;
}
.mce-content-body div.mce-resizehandle {
background-color: #4099ff;
border-color: #4099ff;
border-style: solid;
border-width: 1px;
box-sizing: border-box;
height: 10px;
position: absolute;
width: 10px;
z-index: 10000;
}
.mce-content-body div.mce-resizehandle:hover {
background-color: #4099ff;
}
.mce-content-body div.mce-resizehandle:nth-of-type(1) {
cursor: nwse-resize;
}
.mce-content-body div.mce-resizehandle:nth-of-type(2) {
cursor: nesw-resize;
}
.mce-content-body div.mce-resizehandle:nth-of-type(3) {
cursor: nwse-resize;
}
.mce-content-body div.mce-resizehandle:nth-of-type(4) {
cursor: nesw-resize;
}
.mce-content-body .mce-clonedresizable {
opacity: 0.5;
outline: 1px dashed black;
position: absolute;
z-index: 10000;
}
.mce-content-body .mce-resize-helper {
background: #555;
background: rgba(0, 0, 0, 0.75);
border: 1px;
border-radius: 3px;
color: white;
display: none;
font-family: sans-serif;
font-size: 12px;
line-height: 14px;
margin: 5px 10px;
padding: 5px;
position: absolute;
white-space: nowrap;
z-index: 10001;
}
.tox-rtc-user-selection {
position: relative;
}
.tox-rtc-user-cursor {
bottom: 0;
cursor: default;
position: absolute;
top: 0;
width: 2px;
}
.tox-rtc-user-cursor::before {
background-color: inherit;
border-radius: 50%;
content: '';
display: block;
height: 8px;
position: absolute;
right: -3px;
top: -3px;
width: 8px;
}
.tox-rtc-user-cursor:hover::after {
background-color: inherit;
border-radius: 100px;
box-sizing: border-box;
color: #fff;
content: attr(data-user);
display: block;
font-size: 12px;
font-weight: bold;
left: -5px;
min-height: 8px;
min-width: 8px;
padding: 0 12px;
position: absolute;
top: -11px;
white-space: nowrap;
z-index: 1000;
}
.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
background-color: #2dc26b;
}
.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
background-color: #e03e2d;
}
.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
background-color: #f1c40f;
}
.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
background-color: #3598db;
}
.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
background-color: #b96ad9;
}
.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
background-color: #e67e23;
}
.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
background-color: #aaa69d;
}
.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
background-color: #f368e0;
}
.tox-rtc-remote-image {
background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
border: 1px solid #ccc;
min-height: 240px;
min-width: 320px;
}
.mce-match-marker {
background: #aaa;
color: #fff;
}
.mce-match-marker-selected {
background: #39f;
color: #fff;
}
.mce-match-marker-selected::-moz-selection {
background: #39f;
color: #fff;
}
.mce-match-marker-selected::selection {
background: #39f;
color: #fff;
}
.mce-content-body img[data-mce-selected],
.mce-content-body table[data-mce-selected] {
outline: 3px solid #4099ff;
}
.mce-content-body hr[data-mce-selected] {
outline: 3px solid #4099ff;
outline-offset: 1px;
}
.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
outline: 3px solid #4099ff;
}
.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
outline: 3px solid #4099ff;
}
.mce-content-body *[contentEditable=false][data-mce-selected] {
cursor: not-allowed;
outline: 3px solid #4099ff;
}
.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
outline: none;
}
.mce-content-body *[data-mce-selected="inline-boundary"] {
background-color: #4099ff;
}
.mce-content-body .mce-edit-focus {
outline: 3px solid #4099ff;
}
.mce-content-body td[data-mce-selected],
.mce-content-body th[data-mce-selected] {
background-color: #b4d7ff !important;
}
.mce-content-body td[data-mce-selected]::-moz-selection,
.mce-content-body th[data-mce-selected]::-moz-selection {
background: none;
}
.mce-content-body td[data-mce-selected]::selection,
.mce-content-body th[data-mce-selected]::selection {
background: none;
}
.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;
}
.mce-content-body img::-moz-selection {
background: none;
}
.mce-content-body img::selection {
background: none;
}
.ephox-snooker-resizer-bar {
background-color: #4099ff;
opacity: 0;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.ephox-snooker-resizer-cols {
cursor: col-resize;
}
.ephox-snooker-resizer-rows {
cursor: row-resize;
}
.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
opacity: 1;
}
.mce-spellchecker-word {
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'.75'%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;
cursor: default;
height: 2rem;
}
.mce-spellchecker-grammar {
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'%2300A835'%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;
cursor: default;
}
.mce-toc {
border: 1px solid gray;
}
.mce-toc h2 {
margin: 4px;
}
.mce-toc li {
list-style-type: none;
}
.mce-item-table,
.mce-item-table td,
.mce-item-table th,
.mce-item-table caption {
border: 1px dashed #bbb;
}
.mce-visualblocks p,
.mce-visualblocks h1,
.mce-visualblocks h2,
.mce-visualblocks h3,
.mce-visualblocks h4,
.mce-visualblocks h5,
.mce-visualblocks h6,
.mce-visualblocks div:not([data-mce-bogus]),
.mce-visualblocks section,
.mce-visualblocks article,
.mce-visualblocks blockquote,
.mce-visualblocks address,
.mce-visualblocks pre,
.mce-visualblocks figure,
.mce-visualblocks figcaption,
.mce-visualblocks hgroup,
.mce-visualblocks aside,
.mce-visualblocks ul,
.mce-visualblocks ol,
.mce-visualblocks dl {
background-repeat: no-repeat;
border: 1px dashed #bbb;
margin-left: 3px;
padding-top: 10px;
}
.mce-visualblocks p {
background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
}
.mce-visualblocks h1 {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
}
.mce-visualblocks h2 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
}
.mce-visualblocks h3 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
}
.mce-visualblocks h4 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
}
.mce-visualblocks h5 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
}
.mce-visualblocks h6 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
}
.mce-visualblocks div:not([data-mce-bogus]) {
background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
}
.mce-visualblocks section {
background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
}
.mce-visualblocks article {
background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
}
.mce-visualblocks blockquote {
background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
}
.mce-visualblocks address {
background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
}
.mce-visualblocks pre {
background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
}
.mce-visualblocks figure {
background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
}
.mce-visualblocks figcaption {
border: 1px dashed #bbb;
}
.mce-visualblocks hgroup {
background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
}
.mce-visualblocks aside {
background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
}
.mce-visualblocks ul {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
}
.mce-visualblocks ol {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
}
.mce-visualblocks dl {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
}
.mce-visualblocks:not([dir=rtl]) p,
.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]) div:not([data-mce-bogus]),
.mce-visualblocks:not([dir=rtl]) section,
.mce-visualblocks:not([dir=rtl]) article,
.mce-visualblocks:not([dir=rtl]) blockquote,
.mce-visualblocks:not([dir=rtl]) address,
.mce-visualblocks:not([dir=rtl]) pre,
.mce-visualblocks:not([dir=rtl]) figure,
.mce-visualblocks:not([dir=rtl]) figcaption,
.mce-visualblocks:not([dir=rtl]) hgroup,
.mce-visualblocks:not([dir=rtl]) aside,
.mce-visualblocks:not([dir=rtl]) ul,
.mce-visualblocks:not([dir=rtl]) ol,
.mce-visualblocks:not([dir=rtl]) dl {
margin-left: 3px;
}
.mce-visualblocks[dir=rtl] p,
.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] div:not([data-mce-bogus]),
.mce-visualblocks[dir=rtl] section,
.mce-visualblocks[dir=rtl] article,
.mce-visualblocks[dir=rtl] blockquote,
.mce-visualblocks[dir=rtl] address,
.mce-visualblocks[dir=rtl] pre,
.mce-visualblocks[dir=rtl] figure,
.mce-visualblocks[dir=rtl] figcaption,
.mce-visualblocks[dir=rtl] hgroup,
.mce-visualblocks[dir=rtl] aside,
.mce-visualblocks[dir=rtl] ul,
.mce-visualblocks[dir=rtl] ol,
.mce-visualblocks[dir=rtl] dl {
background-position-x: right;
margin-right: 3px;
}
.mce-nbsp,
.mce-shy {
background: #aaa;
}
.mce-shy::after {
content: '-';
}
body {
font-family: sans-serif;
}
table {
border-collapse: collapse;
}

689
public/tinymce/skins/ui/oxide-dark/content.inline.css

@ -0,0 +1,689 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
.mce-content-body .mce-item-anchor {
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;
cursor: default;
display: inline-block;
height: 12px !important;
padding: 0 2px;
-webkit-user-modify: read-only;
-moz-user-modify: read-only;
-webkit-user-select: all;
-moz-user-select: all;
-ms-user-select: all;
user-select: all;
width: 8px !important;
}
.mce-content-body .mce-item-anchor[data-mce-selected] {
outline-offset: 1px;
}
.tox-comments-visible .tox-comment {
background-color: #fff0b7;
}
.tox-comments-visible .tox-comment--active {
background-color: #ffe168;
}
.tox-checklist > li:not(.tox-checklist--hidden) {
list-style: none;
margin: 0.25em 0;
}
.tox-checklist > li:not(.tox-checklist--hidden)::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-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: '';
cursor: pointer;
height: 1em;
margin-left: -1.5em;
margin-top: 0.125em;
position: absolute;
width: 1em;
}
.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");
}
[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
margin-left: 0;
margin-right: -1.5em;
}
/* stylelint-disable */
/* http://prismjs.com/ */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
font-size: 1em;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: 0.5em 0;
overflow: auto;
}
:not(pre) > code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: 0.1em;
border-radius: 0.3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: 0.7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, 0.5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
/* stylelint-enable */
.mce-content-body {
overflow-wrap: break-word;
word-wrap: break-word;
}
.mce-content-body .mce-visual-caret {
background-color: black;
background-color: currentColor;
position: absolute;
}
.mce-content-body .mce-visual-caret-hidden {
display: none;
}
.mce-content-body *[data-mce-caret] {
left: -1000px;
margin: 0;
padding: 0;
position: absolute;
right: auto;
top: 0;
}
.mce-content-body .mce-offscreen-selection {
left: -2000000px;
max-width: 1000000px;
position: absolute;
}
.mce-content-body *[contentEditable=false] {
cursor: default;
}
.mce-content-body *[contentEditable=true] {
cursor: text;
}
.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;
}
.mce-content-body figure.align-left {
float: left;
}
.mce-content-body figure.align-right {
float: right;
}
.mce-content-body figure.image.align-center {
display: table;
margin-left: auto;
margin-right: auto;
}
.mce-preview-object {
border: 1px solid gray;
display: inline-block;
line-height: 0;
margin: 0 2px 0 2px;
position: relative;
}
.mce-preview-object .mce-shim {
background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
.mce-preview-object[data-mce-selected="2"] .mce-shim {
display: none;
}
.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;
}
.mce-pagebreak {
border: 1px dashed #aaa;
cursor: default;
display: block;
height: 5px;
margin-top: 15px;
page-break-before: always;
width: 100%;
}
@media print {
.mce-pagebreak {
border: 0;
}
}
.tiny-pageembed .mce-shim {
background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
.tiny-pageembed[data-mce-selected="2"] .mce-shim {
display: none;
}
.tiny-pageembed {
display: inline-block;
position: relative;
}
.tiny-pageembed--21by9,
.tiny-pageembed--16by9,
.tiny-pageembed--4by3,
.tiny-pageembed--1by1 {
display: block;
overflow: hidden;
padding: 0;
position: relative;
width: 100%;
}
.tiny-pageembed--21by9 {
padding-top: 42.857143%;
}
.tiny-pageembed--16by9 {
padding-top: 56.25%;
}
.tiny-pageembed--4by3 {
padding-top: 75%;
}
.tiny-pageembed--1by1 {
padding-top: 100%;
}
.tiny-pageembed--21by9 iframe,
.tiny-pageembed--16by9 iframe,
.tiny-pageembed--4by3 iframe,
.tiny-pageembed--1by1 iframe {
border: 0;
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
.mce-content-body[data-mce-placeholder] {
position: relative;
}
.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
color: rgba(34, 47, 62, 0.7);
content: attr(data-mce-placeholder);
position: absolute;
}
.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
left: 1px;
}
.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
right: 1px;
}
.mce-content-body div.mce-resizehandle {
background-color: #4099ff;
border-color: #4099ff;
border-style: solid;
border-width: 1px;
box-sizing: border-box;
height: 10px;
position: absolute;
width: 10px;
z-index: 10000;
}
.mce-content-body div.mce-resizehandle:hover {
background-color: #4099ff;
}
.mce-content-body div.mce-resizehandle:nth-of-type(1) {
cursor: nwse-resize;
}
.mce-content-body div.mce-resizehandle:nth-of-type(2) {
cursor: nesw-resize;
}
.mce-content-body div.mce-resizehandle:nth-of-type(3) {
cursor: nwse-resize;
}
.mce-content-body div.mce-resizehandle:nth-of-type(4) {
cursor: nesw-resize;
}
.mce-content-body .mce-clonedresizable {
opacity: 0.5;
outline: 1px dashed black;
position: absolute;
z-index: 10000;
}
.mce-content-body .mce-resize-helper {
background: #555;
background: rgba(0, 0, 0, 0.75);
border: 1px;
border-radius: 3px;
color: white;
display: none;
font-family: sans-serif;
font-size: 12px;
line-height: 14px;
margin: 5px 10px;
padding: 5px;
position: absolute;
white-space: nowrap;
z-index: 10001;
}
.tox-rtc-user-selection {
position: relative;
}
.tox-rtc-user-cursor {
bottom: 0;
cursor: default;
position: absolute;
top: 0;
width: 2px;
}
.tox-rtc-user-cursor::before {
background-color: inherit;
border-radius: 50%;
content: '';
display: block;
height: 8px;
position: absolute;
right: -3px;
top: -3px;
width: 8px;
}
.tox-rtc-user-cursor:hover::after {
background-color: inherit;
border-radius: 100px;
box-sizing: border-box;
color: #fff;
content: attr(data-user);
display: block;
font-size: 12px;
font-weight: bold;
left: -5px;
min-height: 8px;
min-width: 8px;
padding: 0 12px;
position: absolute;
top: -11px;
white-space: nowrap;
z-index: 1000;
}
.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
background-color: #2dc26b;
}
.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
background-color: #e03e2d;
}
.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
background-color: #f1c40f;
}
.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
background-color: #3598db;
}
.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
background-color: #b96ad9;
}
.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
background-color: #e67e23;
}
.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
background-color: #aaa69d;
}
.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
background-color: #f368e0;
}
.tox-rtc-remote-image {
background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
border: 1px solid #ccc;
min-height: 240px;
min-width: 320px;
}
.mce-match-marker {
background: #aaa;
color: #fff;
}
.mce-match-marker-selected {
background: #39f;
color: #fff;
}
.mce-match-marker-selected::-moz-selection {
background: #39f;
color: #fff;
}
.mce-match-marker-selected::selection {
background: #39f;
color: #fff;
}
.mce-content-body img[data-mce-selected],
.mce-content-body table[data-mce-selected] {
outline: 3px solid #b4d7ff;
}
.mce-content-body hr[data-mce-selected] {
outline: 3px solid #b4d7ff;
outline-offset: 1px;
}
.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
outline: 3px solid #b4d7ff;
}
.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
outline: 3px solid #b4d7ff;
}
.mce-content-body *[contentEditable=false][data-mce-selected] {
cursor: not-allowed;
outline: 3px solid #b4d7ff;
}
.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
outline: none;
}
.mce-content-body *[data-mce-selected="inline-boundary"] {
background-color: #b4d7ff;
}
.mce-content-body .mce-edit-focus {
outline: 3px solid #b4d7ff;
}
.mce-content-body td[data-mce-selected],
.mce-content-body th[data-mce-selected] {
background-color: #b4d7ff !important;
}
.mce-content-body td[data-mce-selected]::-moz-selection,
.mce-content-body th[data-mce-selected]::-moz-selection {
background: none;
}
.mce-content-body td[data-mce-selected]::selection,
.mce-content-body th[data-mce-selected]::selection {
background: none;
}
.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;
}
.mce-content-body img::-moz-selection {
background: none;
}
.mce-content-body img::selection {
background: none;
}
.ephox-snooker-resizer-bar {
background-color: #b4d7ff;
opacity: 0;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.ephox-snooker-resizer-cols {
cursor: col-resize;
}
.ephox-snooker-resizer-rows {
cursor: row-resize;
}
.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
opacity: 1;
}
.mce-spellchecker-word {
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'.75'%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;
cursor: default;
height: 2rem;
}
.mce-spellchecker-grammar {
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'%2300A835'%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;
cursor: default;
}
.mce-toc {
border: 1px solid gray;
}
.mce-toc h2 {
margin: 4px;
}
.mce-toc li {
list-style-type: none;
}
.mce-item-table,
.mce-item-table td,
.mce-item-table th,
.mce-item-table caption {
border: 1px dashed #bbb;
}
.mce-visualblocks p,
.mce-visualblocks h1,
.mce-visualblocks h2,
.mce-visualblocks h3,
.mce-visualblocks h4,
.mce-visualblocks h5,
.mce-visualblocks h6,
.mce-visualblocks div:not([data-mce-bogus]),
.mce-visualblocks section,
.mce-visualblocks article,
.mce-visualblocks blockquote,
.mce-visualblocks address,
.mce-visualblocks pre,
.mce-visualblocks figure,
.mce-visualblocks figcaption,
.mce-visualblocks hgroup,
.mce-visualblocks aside,
.mce-visualblocks ul,
.mce-visualblocks ol,
.mce-visualblocks dl {
background-repeat: no-repeat;
border: 1px dashed #bbb;
margin-left: 3px;
padding-top: 10px;
}
.mce-visualblocks p {
background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
}
.mce-visualblocks h1 {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
}
.mce-visualblocks h2 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
}
.mce-visualblocks h3 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
}
.mce-visualblocks h4 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
}
.mce-visualblocks h5 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
}
.mce-visualblocks h6 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
}
.mce-visualblocks div:not([data-mce-bogus]) {
background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
}
.mce-visualblocks section {
background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
}
.mce-visualblocks article {
background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
}
.mce-visualblocks blockquote {
background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
}
.mce-visualblocks address {
background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
}
.mce-visualblocks pre {
background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
}
.mce-visualblocks figure {
background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
}
.mce-visualblocks figcaption {
border: 1px dashed #bbb;
}
.mce-visualblocks hgroup {
background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
}
.mce-visualblocks aside {
background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
}
.mce-visualblocks ul {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
}
.mce-visualblocks ol {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
}
.mce-visualblocks dl {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
}
.mce-visualblocks:not([dir=rtl]) p,
.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]) div:not([data-mce-bogus]),
.mce-visualblocks:not([dir=rtl]) section,
.mce-visualblocks:not([dir=rtl]) article,
.mce-visualblocks:not([dir=rtl]) blockquote,
.mce-visualblocks:not([dir=rtl]) address,
.mce-visualblocks:not([dir=rtl]) pre,
.mce-visualblocks:not([dir=rtl]) figure,
.mce-visualblocks:not([dir=rtl]) figcaption,
.mce-visualblocks:not([dir=rtl]) hgroup,
.mce-visualblocks:not([dir=rtl]) aside,
.mce-visualblocks:not([dir=rtl]) ul,
.mce-visualblocks:not([dir=rtl]) ol,
.mce-visualblocks:not([dir=rtl]) dl {
margin-left: 3px;
}
.mce-visualblocks[dir=rtl] p,
.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] div:not([data-mce-bogus]),
.mce-visualblocks[dir=rtl] section,
.mce-visualblocks[dir=rtl] article,
.mce-visualblocks[dir=rtl] blockquote,
.mce-visualblocks[dir=rtl] address,
.mce-visualblocks[dir=rtl] pre,
.mce-visualblocks[dir=rtl] figure,
.mce-visualblocks[dir=rtl] figcaption,
.mce-visualblocks[dir=rtl] hgroup,
.mce-visualblocks[dir=rtl] aside,
.mce-visualblocks[dir=rtl] ul,
.mce-visualblocks[dir=rtl] ol,
.mce-visualblocks[dir=rtl] dl {
background-position-x: right;
margin-right: 3px;
}
.mce-nbsp,
.mce-shy {
background: #aaa;
}
.mce-shy::after {
content: '-';
}

7
public/tinymce/skins/ui/oxide-dark/content.inline.min.css

File diff suppressed because one or more lines are too long

7
public/tinymce/skins/ui/oxide-dark/content.min.css

File diff suppressed because one or more lines are too long

29
public/tinymce/skins/ui/oxide-dark/content.mobile.css

@ -0,0 +1,29 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection {
/* Note: this file is used inside the content, so isn't part of theming */
background-color: green;
display: inline-block;
opacity: 0.5;
position: absolute;
}
body {
-webkit-text-size-adjust: none;
}
body img {
/* this is related to the content margin */
max-width: 96vw;
}
body table img {
max-width: 95%;
}
body {
font-family: sans-serif;
}
table {
border-collapse: collapse;
}

7
public/tinymce/skins/ui/oxide-dark/content.mobile.min.css

@ -0,0 +1,7 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse}

BIN
public/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff

Binary file not shown.

2937
public/tinymce/skins/ui/oxide-dark/skin.css

File diff suppressed because it is too large

7
public/tinymce/skins/ui/oxide-dark/skin.min.css

File diff suppressed because one or more lines are too long

673
public/tinymce/skins/ui/oxide-dark/skin.mobile.css

@ -0,0 +1,673 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
/* RESET all the things! */
.tinymce-mobile-outer-container {
all: initial;
display: block;
}
.tinymce-mobile-outer-container * {
border: 0;
box-sizing: initial;
cursor: inherit;
float: none;
line-height: 1;
margin: 0;
outline: 0;
padding: 0;
-webkit-tap-highlight-color: transparent;
/* TBIO-3691, stop the gray flicker on touch. */
text-shadow: none;
white-space: nowrap;
}
.tinymce-mobile-icon-arrow-back::before {
content: "\e5cd";
}
.tinymce-mobile-icon-image::before {
content: "\e412";
}
.tinymce-mobile-icon-cancel-circle::before {
content: "\e5c9";
}
.tinymce-mobile-icon-full-dot::before {
content: "\e061";
}
.tinymce-mobile-icon-align-center::before {
content: "\e234";
}
.tinymce-mobile-icon-align-left::before {
content: "\e236";
}
.tinymce-mobile-icon-align-right::before {
content: "\e237";
}
.tinymce-mobile-icon-bold::before {
content: "\e238";
}
.tinymce-mobile-icon-italic::before {
content: "\e23f";
}
.tinymce-mobile-icon-unordered-list::before {
content: "\e241";
}
.tinymce-mobile-icon-ordered-list::before {
content: "\e242";
}
.tinymce-mobile-icon-font-size::before {
content: "\e245";
}
.tinymce-mobile-icon-underline::before {
content: "\e249";
}
.tinymce-mobile-icon-link::before {
content: "\e157";
}
.tinymce-mobile-icon-unlink::before {
content: "\eca2";
}
.tinymce-mobile-icon-color::before {
content: "\e891";
}
.tinymce-mobile-icon-previous::before {
content: "\e314";
}
.tinymce-mobile-icon-next::before {
content: "\e315";
}
.tinymce-mobile-icon-large-font::before,
.tinymce-mobile-icon-style-formats::before {
content: "\e264";
}
.tinymce-mobile-icon-undo::before {
content: "\e166";
}
.tinymce-mobile-icon-redo::before {
content: "\e15a";
}
.tinymce-mobile-icon-removeformat::before {
content: "\e239";
}
.tinymce-mobile-icon-small-font::before {
content: "\e906";
}
.tinymce-mobile-icon-readonly-back::before,
.tinymce-mobile-format-matches::after {
content: "\e5ca";
}
.tinymce-mobile-icon-small-heading::before {
content: "small";
}
.tinymce-mobile-icon-large-heading::before {
content: "large";
}
.tinymce-mobile-icon-small-heading::before,
.tinymce-mobile-icon-large-heading::before {
font-family: sans-serif;
font-size: 80%;
}
.tinymce-mobile-mask-edit-icon::before {
content: "\e254";
}
.tinymce-mobile-icon-back::before {
content: "\e5c4";
}
.tinymce-mobile-icon-heading::before {
/* TODO: Translate */
content: "Headings";
font-family: sans-serif;
font-size: 80%;
font-weight: bold;
}
.tinymce-mobile-icon-h1::before {
content: "H1";
font-weight: bold;
}
.tinymce-mobile-icon-h2::before {
content: "H2";
font-weight: bold;
}
.tinymce-mobile-icon-h3::before {
content: "H3";
font-weight: bold;
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask {
align-items: center;
display: flex;
justify-content: center;
background: rgba(51, 51, 51, 0.5);
height: 100%;
position: absolute;
top: 0;
width: 100%;
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container {
align-items: center;
border-radius: 50%;
display: flex;
flex-direction: column;
font-family: sans-serif;
font-size: 1em;
justify-content: space-between;
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item {
align-items: center;
display: flex;
justify-content: center;
border-radius: 50%;
height: 2.1em;
width: 2.1em;
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section {
align-items: center;
display: flex;
justify-content: center;
flex-direction: column;
font-size: 1em;
}
@media only screen and (min-device-width:700px) {
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section {
font-size: 1.2em;
}
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon {
align-items: center;
display: flex;
justify-content: center;
border-radius: 50%;
height: 2.1em;
width: 2.1em;
background-color: white;
color: #207ab7;
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before {
content: "\e900";
font-family: 'tinymce-mobile', sans-serif;
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon {
z-index: 2;
}
.tinymce-mobile-android-container.tinymce-mobile-android-maximized {
background: #ffffff;
border: none;
bottom: 0;
display: flex;
flex-direction: column;
left: 0;
position: fixed;
right: 0;
top: 0;
}
.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized) {
position: relative;
}
.tinymce-mobile-android-container .tinymce-mobile-editor-socket {
display: flex;
flex-grow: 1;
}
.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe {
display: flex !important;
flex-grow: 1;
height: auto !important;
}
.tinymce-mobile-android-scroll-reload {
overflow: hidden;
}
:not(.tinymce-mobile-readonly-mode) > .tinymce-mobile-android-selection-context-toolbar {
margin-top: 23px;
}
.tinymce-mobile-toolstrip {
background: #fff;
display: flex;
flex: 0 0 auto;
z-index: 1;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar {
align-items: center;
background-color: #fff;
border-bottom: 1px solid #cccccc;
display: flex;
flex: 1;
height: 2.5em;
width: 100%;
/* Make it no larger than the toolstrip, so that it needs to scroll */
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group {
align-items: center;
display: flex;
height: 100%;
flex-shrink: 1;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group > div {
align-items: center;
display: flex;
height: 100%;
flex: 1;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container {
background: #f44336;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group {
flex-grow: 1;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item {
padding-left: 0.5em;
padding-right: 0.5em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button {
align-items: center;
display: flex;
height: 80%;
margin-left: 2px;
margin-right: 2px;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected {
background: #c8cbcf;
color: #cccccc;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type {
background: #207ab7;
color: #eceff1;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar {
/* Note, this file is imported inside .tinymce-mobile-context-toolbar, so that prefix is on everything here. */
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group {
align-items: center;
display: flex;
height: 100%;
flex: 1;
padding-bottom: 0.4em;
padding-top: 0.4em;
/* Make any buttons appearing on the left and right display in the centre (e.g. color edges) */
/* For widgets like the colour picker, use the whole height */
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog {
display: flex;
min-height: 1.5em;
overflow: hidden;
padding-left: 0;
padding-right: 0;
position: relative;
width: 100%;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain {
display: flex;
height: 100%;
transition: left cubic-bezier(0.4, 0, 1, 1) 0.15s;
width: 100%;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen {
display: flex;
flex: 0 0 auto;
justify-content: space-between;
width: 100%;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input {
font-family: Sans-serif;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container {
display: flex;
flex-grow: 1;
position: relative;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x {
-ms-grid-row-align: center;
align-self: center;
background: inherit;
border: none;
border-radius: 50%;
color: #888;
font-size: 0.6em;
font-weight: bold;
height: 100%;
padding-right: 2px;
position: absolute;
right: 0;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x {
display: none;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next {
align-items: center;
display: flex;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before {
align-items: center;
display: flex;
font-weight: bold;
height: 100%;
padding-left: 0.5em;
padding-right: 0.5em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before {
visibility: hidden;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item {
color: #cccccc;
font-size: 10px;
line-height: 10px;
margin: 0 2px;
padding-top: 3px;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active {
color: #c8cbcf;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before {
margin-left: 0.5em;
margin-right: 0.9em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before {
margin-left: 0.9em;
margin-right: 0.5em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider {
display: flex;
flex: 1;
margin-left: 0;
margin-right: 0;
padding: 0.28em 0;
position: relative;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container {
align-items: center;
display: flex;
flex-grow: 1;
height: 100%;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line {
background: #cccccc;
display: flex;
flex: 1;
height: 0.2em;
margin-bottom: 0.3em;
margin-top: 0.3em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container {
padding-left: 2em;
padding-right: 2em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container {
align-items: center;
display: flex;
flex-grow: 1;
height: 100%;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient {
background: linear-gradient(to right, hsl(0, 100%, 50%) 0%, hsl(60, 100%, 50%) 17%, hsl(120, 100%, 50%) 33%, hsl(180, 100%, 50%) 50%, hsl(240, 100%, 50%) 67%, hsl(300, 100%, 50%) 83%, hsl(0, 100%, 50%) 100%);
display: flex;
flex: 1;
height: 0.2em;
margin-bottom: 0.3em;
margin-top: 0.3em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black {
/* Not part of theming */
background: black;
height: 0.2em;
margin-bottom: 0.3em;
margin-top: 0.3em;
width: 1.2em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white {
/* Not part of theming */
background: white;
height: 0.2em;
margin-bottom: 0.3em;
margin-top: 0.3em;
width: 1.2em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb {
/* vertically centering trick (margin: auto, top: 0, bottom: 0). On iOS and Safari, if you leave
* out these values, then it shows the thumb at the top of the spectrum. This is probably because it is
* absolutely positioned with only a left value, and not a top. Note, on Chrome it seems to be fine without
* this approach.
*/
align-items: center;
background-clip: padding-box;
background-color: #455a64;
border: 0.5em solid rgba(136, 136, 136, 0);
border-radius: 3em;
bottom: 0;
color: #fff;
display: flex;
height: 0.5em;
justify-content: center;
left: -10px;
margin: auto;
position: absolute;
top: 0;
transition: border 120ms cubic-bezier(0.39, 0.58, 0.57, 1);
width: 0.5em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active {
border: 0.5em solid rgba(136, 136, 136, 0.39);
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group > div {
align-items: center;
display: flex;
height: 100%;
flex: 1;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper {
flex-direction: column;
justify-content: center;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item {
align-items: center;
display: flex;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog) {
height: 100%;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container {
display: flex;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input {
background: #ffffff;
border: none;
border-radius: 0;
color: #455a64;
flex-grow: 1;
font-size: 0.85em;
padding-bottom: 0.1em;
padding-left: 5px;
padding-top: 0.1em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder {
/* WebKit, Blink, Edge */
color: #888;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder {
/* WebKit, Blink, Edge */
color: #888;
}
/* dropup */
.tinymce-mobile-dropup {
background: white;
display: flex;
overflow: hidden;
width: 100%;
}
.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking {
transition: height 0.3s ease-out;
}
.tinymce-mobile-dropup.tinymce-mobile-dropup-growing {
transition: height 0.3s ease-in;
}
.tinymce-mobile-dropup.tinymce-mobile-dropup-closed {
flex-grow: 0;
}
.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing) {
flex-grow: 1;
}
/* TODO min-height for device size and orientation */
.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {
min-height: 200px;
}
@media only screen and (orientation: landscape) {
.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {
min-height: 200px;
}
}
@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) {
.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {
min-height: 150px;
}
}
/* styles menu */
.tinymce-mobile-styles-menu {
font-family: sans-serif;
outline: 4px solid black;
overflow: hidden;
position: relative;
width: 100%;
}
.tinymce-mobile-styles-menu [role="menu"] {
display: flex;
flex-direction: column;
height: 100%;
position: absolute;
width: 100%;
}
.tinymce-mobile-styles-menu [role="menu"].transitioning {
transition: transform 0.5s ease-in-out;
}
.tinymce-mobile-styles-menu .tinymce-mobile-styles-item {
border-bottom: 1px solid #ddd;
color: #455a64;
cursor: pointer;
display: flex;
padding: 1em 1em;
position: relative;
}
.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before {
color: #455a64;
content: "\e314";
font-family: 'tinymce-mobile', sans-serif;
}
.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after {
color: #455a64;
content: "\e315";
font-family: 'tinymce-mobile', sans-serif;
padding-left: 1em;
padding-right: 1em;
position: absolute;
right: 0;
}
.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after {
font-family: 'tinymce-mobile', sans-serif;
padding-left: 1em;
padding-right: 1em;
position: absolute;
right: 0;
}
.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator,
.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser {
align-items: center;
background: #fff;
border-top: #455a64;
color: #455a64;
display: flex;
min-height: 2.5em;
padding-left: 1em;
padding-right: 1em;
}
.tinymce-mobile-styles-menu [data-transitioning-destination="before"][data-transitioning-state],
.tinymce-mobile-styles-menu [data-transitioning-state="before"] {
transform: translate(-100%);
}
.tinymce-mobile-styles-menu [data-transitioning-destination="current"][data-transitioning-state],
.tinymce-mobile-styles-menu [data-transitioning-state="current"] {
transform: translate(0%);
}
.tinymce-mobile-styles-menu [data-transitioning-destination="after"][data-transitioning-state],
.tinymce-mobile-styles-menu [data-transitioning-state="after"] {
transform: translate(100%);
}
@font-face {
font-family: 'tinymce-mobile';
font-style: normal;
font-weight: normal;
src: url('fonts/tinymce-mobile.woff?8x92w3') format('woff');
}
@media (min-device-width: 700px) {
.tinymce-mobile-outer-container,
.tinymce-mobile-outer-container input {
font-size: 25px;
}
}
@media (max-device-width: 700px) {
.tinymce-mobile-outer-container,
.tinymce-mobile-outer-container input {
font-size: 18px;
}
}
.tinymce-mobile-icon {
font-family: 'tinymce-mobile', sans-serif;
}
.mixin-flex-and-centre {
align-items: center;
display: flex;
justify-content: center;
}
.mixin-flex-bar {
align-items: center;
display: flex;
height: 100%;
}
.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe {
background-color: #fff;
width: 100%;
}
.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {
/* Note, on the iPod touch in landscape, this isn't visible when the navbar appears */
background-color: #207ab7;
border-radius: 50%;
bottom: 1em;
color: white;
font-size: 1em;
height: 2.1em;
position: fixed;
right: 2em;
width: 2.1em;
align-items: center;
display: flex;
justify-content: center;
}
@media only screen and (min-device-width:700px) {
.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {
font-size: 1.2em;
}
}
.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket {
height: 300px;
overflow: hidden;
}
.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe {
height: 100%;
}
.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip {
display: none;
}
/*
Note, that if you don't include this (::-webkit-file-upload-button), the toolbar width gets
increased and the whole body becomes scrollable. It's important!
*/
input[type="file"]::-webkit-file-upload-button {
display: none;
}
@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) {
.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {
bottom: 50%;
}
}

7
public/tinymce/skins/ui/oxide-dark/skin.mobile.min.css

File diff suppressed because one or more lines are too long

695
public/tinymce/skins/ui/oxide/content.css

@ -0,0 +1,695 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
.mce-content-body .mce-item-anchor {
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;
cursor: default;
display: inline-block;
height: 12px !important;
padding: 0 2px;
-webkit-user-modify: read-only;
-moz-user-modify: read-only;
-webkit-user-select: all;
-moz-user-select: all;
-ms-user-select: all;
user-select: all;
width: 8px !important;
}
.mce-content-body .mce-item-anchor[data-mce-selected] {
outline-offset: 1px;
}
.tox-comments-visible .tox-comment {
background-color: #fff0b7;
}
.tox-comments-visible .tox-comment--active {
background-color: #ffe168;
}
.tox-checklist > li:not(.tox-checklist--hidden) {
list-style: none;
margin: 0.25em 0;
}
.tox-checklist > li:not(.tox-checklist--hidden)::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-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: '';
cursor: pointer;
height: 1em;
margin-left: -1.5em;
margin-top: 0.125em;
position: absolute;
width: 1em;
}
.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");
}
[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
margin-left: 0;
margin-right: -1.5em;
}
/* stylelint-disable */
/* http://prismjs.com/ */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
font-size: 1em;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: 0.5em 0;
overflow: auto;
}
:not(pre) > code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: 0.1em;
border-radius: 0.3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: 0.7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, 0.5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
/* stylelint-enable */
.mce-content-body {
overflow-wrap: break-word;
word-wrap: break-word;
}
.mce-content-body .mce-visual-caret {
background-color: black;
background-color: currentColor;
position: absolute;
}
.mce-content-body .mce-visual-caret-hidden {
display: none;
}
.mce-content-body *[data-mce-caret] {
left: -1000px;
margin: 0;
padding: 0;
position: absolute;
right: auto;
top: 0;
}
.mce-content-body .mce-offscreen-selection {
left: -2000000px;
max-width: 1000000px;
position: absolute;
}
.mce-content-body *[contentEditable=false] {
cursor: default;
}
.mce-content-body *[contentEditable=true] {
cursor: text;
}
.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;
}
.mce-content-body figure.align-left {
float: left;
}
.mce-content-body figure.align-right {
float: right;
}
.mce-content-body figure.image.align-center {
display: table;
margin-left: auto;
margin-right: auto;
}
.mce-preview-object {
border: 1px solid gray;
display: inline-block;
line-height: 0;
margin: 0 2px 0 2px;
position: relative;
}
.mce-preview-object .mce-shim {
background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
.mce-preview-object[data-mce-selected="2"] .mce-shim {
display: none;
}
.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;
}
.mce-pagebreak {
border: 1px dashed #aaa;
cursor: default;
display: block;
height: 5px;
margin-top: 15px;
page-break-before: always;
width: 100%;
}
@media print {
.mce-pagebreak {
border: 0;
}
}
.tiny-pageembed .mce-shim {
background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
.tiny-pageembed[data-mce-selected="2"] .mce-shim {
display: none;
}
.tiny-pageembed {
display: inline-block;
position: relative;
}
.tiny-pageembed--21by9,
.tiny-pageembed--16by9,
.tiny-pageembed--4by3,
.tiny-pageembed--1by1 {
display: block;
overflow: hidden;
padding: 0;
position: relative;
width: 100%;
}
.tiny-pageembed--21by9 {
padding-top: 42.857143%;
}
.tiny-pageembed--16by9 {
padding-top: 56.25%;
}
.tiny-pageembed--4by3 {
padding-top: 75%;
}
.tiny-pageembed--1by1 {
padding-top: 100%;
}
.tiny-pageembed--21by9 iframe,
.tiny-pageembed--16by9 iframe,
.tiny-pageembed--4by3 iframe,
.tiny-pageembed--1by1 iframe {
border: 0;
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
.mce-content-body[data-mce-placeholder] {
position: relative;
}
.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
color: rgba(34, 47, 62, 0.7);
content: attr(data-mce-placeholder);
position: absolute;
}
.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
left: 1px;
}
.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
right: 1px;
}
.mce-content-body div.mce-resizehandle {
background-color: #4099ff;
border-color: #4099ff;
border-style: solid;
border-width: 1px;
box-sizing: border-box;
height: 10px;
position: absolute;
width: 10px;
z-index: 10000;
}
.mce-content-body div.mce-resizehandle:hover {
background-color: #4099ff;
}
.mce-content-body div.mce-resizehandle:nth-of-type(1) {
cursor: nwse-resize;
}
.mce-content-body div.mce-resizehandle:nth-of-type(2) {
cursor: nesw-resize;
}
.mce-content-body div.mce-resizehandle:nth-of-type(3) {
cursor: nwse-resize;
}
.mce-content-body div.mce-resizehandle:nth-of-type(4) {
cursor: nesw-resize;
}
.mce-content-body .mce-clonedresizable {
opacity: 0.5;
outline: 1px dashed black;
position: absolute;
z-index: 10000;
}
.mce-content-body .mce-resize-helper {
background: #555;
background: rgba(0, 0, 0, 0.75);
border: 1px;
border-radius: 3px;
color: white;
display: none;
font-family: sans-serif;
font-size: 12px;
line-height: 14px;
margin: 5px 10px;
padding: 5px;
position: absolute;
white-space: nowrap;
z-index: 10001;
}
.tox-rtc-user-selection {
position: relative;
}
.tox-rtc-user-cursor {
bottom: 0;
cursor: default;
position: absolute;
top: 0;
width: 2px;
}
.tox-rtc-user-cursor::before {
background-color: inherit;
border-radius: 50%;
content: '';
display: block;
height: 8px;
position: absolute;
right: -3px;
top: -3px;
width: 8px;
}
.tox-rtc-user-cursor:hover::after {
background-color: inherit;
border-radius: 100px;
box-sizing: border-box;
color: #fff;
content: attr(data-user);
display: block;
font-size: 12px;
font-weight: bold;
left: -5px;
min-height: 8px;
min-width: 8px;
padding: 0 12px;
position: absolute;
top: -11px;
white-space: nowrap;
z-index: 1000;
}
.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
background-color: #2dc26b;
}
.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
background-color: #e03e2d;
}
.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
background-color: #f1c40f;
}
.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
background-color: #3598db;
}
.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
background-color: #b96ad9;
}
.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
background-color: #e67e23;
}
.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
background-color: #aaa69d;
}
.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
background-color: #f368e0;
}
.tox-rtc-remote-image {
background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
border: 1px solid #ccc;
min-height: 240px;
min-width: 320px;
}
.mce-match-marker {
background: #aaa;
color: #fff;
}
.mce-match-marker-selected {
background: #39f;
color: #fff;
}
.mce-match-marker-selected::-moz-selection {
background: #39f;
color: #fff;
}
.mce-match-marker-selected::selection {
background: #39f;
color: #fff;
}
.mce-content-body img[data-mce-selected],
.mce-content-body table[data-mce-selected] {
outline: 3px solid #b4d7ff;
}
.mce-content-body hr[data-mce-selected] {
outline: 3px solid #b4d7ff;
outline-offset: 1px;
}
.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
outline: 3px solid #b4d7ff;
}
.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
outline: 3px solid #b4d7ff;
}
.mce-content-body *[contentEditable=false][data-mce-selected] {
cursor: not-allowed;
outline: 3px solid #b4d7ff;
}
.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
outline: none;
}
.mce-content-body *[data-mce-selected="inline-boundary"] {
background-color: #b4d7ff;
}
.mce-content-body .mce-edit-focus {
outline: 3px solid #b4d7ff;
}
.mce-content-body td[data-mce-selected],
.mce-content-body th[data-mce-selected] {
background-color: #b4d7ff !important;
}
.mce-content-body td[data-mce-selected]::-moz-selection,
.mce-content-body th[data-mce-selected]::-moz-selection {
background: none;
}
.mce-content-body td[data-mce-selected]::selection,
.mce-content-body th[data-mce-selected]::selection {
background: none;
}
.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;
}
.mce-content-body img::-moz-selection {
background: none;
}
.mce-content-body img::selection {
background: none;
}
.ephox-snooker-resizer-bar {
background-color: #b4d7ff;
opacity: 0;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.ephox-snooker-resizer-cols {
cursor: col-resize;
}
.ephox-snooker-resizer-rows {
cursor: row-resize;
}
.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
opacity: 1;
}
.mce-spellchecker-word {
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'.75'%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;
cursor: default;
height: 2rem;
}
.mce-spellchecker-grammar {
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'%2300A835'%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;
cursor: default;
}
.mce-toc {
border: 1px solid gray;
}
.mce-toc h2 {
margin: 4px;
}
.mce-toc li {
list-style-type: none;
}
.mce-item-table,
.mce-item-table td,
.mce-item-table th,
.mce-item-table caption {
border: 1px dashed #bbb;
}
.mce-visualblocks p,
.mce-visualblocks h1,
.mce-visualblocks h2,
.mce-visualblocks h3,
.mce-visualblocks h4,
.mce-visualblocks h5,
.mce-visualblocks h6,
.mce-visualblocks div:not([data-mce-bogus]),
.mce-visualblocks section,
.mce-visualblocks article,
.mce-visualblocks blockquote,
.mce-visualblocks address,
.mce-visualblocks pre,
.mce-visualblocks figure,
.mce-visualblocks figcaption,
.mce-visualblocks hgroup,
.mce-visualblocks aside,
.mce-visualblocks ul,
.mce-visualblocks ol,
.mce-visualblocks dl {
background-repeat: no-repeat;
border: 1px dashed #bbb;
margin-left: 3px;
padding-top: 10px;
}
.mce-visualblocks p {
background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
}
.mce-visualblocks h1 {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
}
.mce-visualblocks h2 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
}
.mce-visualblocks h3 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
}
.mce-visualblocks h4 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
}
.mce-visualblocks h5 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
}
.mce-visualblocks h6 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
}
.mce-visualblocks div:not([data-mce-bogus]) {
background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
}
.mce-visualblocks section {
background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
}
.mce-visualblocks article {
background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
}
.mce-visualblocks blockquote {
background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
}
.mce-visualblocks address {
background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
}
.mce-visualblocks pre {
background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
}
.mce-visualblocks figure {
background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
}
.mce-visualblocks figcaption {
border: 1px dashed #bbb;
}
.mce-visualblocks hgroup {
background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
}
.mce-visualblocks aside {
background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
}
.mce-visualblocks ul {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
}
.mce-visualblocks ol {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
}
.mce-visualblocks dl {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
}
.mce-visualblocks:not([dir=rtl]) p,
.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]) div:not([data-mce-bogus]),
.mce-visualblocks:not([dir=rtl]) section,
.mce-visualblocks:not([dir=rtl]) article,
.mce-visualblocks:not([dir=rtl]) blockquote,
.mce-visualblocks:not([dir=rtl]) address,
.mce-visualblocks:not([dir=rtl]) pre,
.mce-visualblocks:not([dir=rtl]) figure,
.mce-visualblocks:not([dir=rtl]) figcaption,
.mce-visualblocks:not([dir=rtl]) hgroup,
.mce-visualblocks:not([dir=rtl]) aside,
.mce-visualblocks:not([dir=rtl]) ul,
.mce-visualblocks:not([dir=rtl]) ol,
.mce-visualblocks:not([dir=rtl]) dl {
margin-left: 3px;
}
.mce-visualblocks[dir=rtl] p,
.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] div:not([data-mce-bogus]),
.mce-visualblocks[dir=rtl] section,
.mce-visualblocks[dir=rtl] article,
.mce-visualblocks[dir=rtl] blockquote,
.mce-visualblocks[dir=rtl] address,
.mce-visualblocks[dir=rtl] pre,
.mce-visualblocks[dir=rtl] figure,
.mce-visualblocks[dir=rtl] figcaption,
.mce-visualblocks[dir=rtl] hgroup,
.mce-visualblocks[dir=rtl] aside,
.mce-visualblocks[dir=rtl] ul,
.mce-visualblocks[dir=rtl] ol,
.mce-visualblocks[dir=rtl] dl {
background-position-x: right;
margin-right: 3px;
}
.mce-nbsp,
.mce-shy {
background: #aaa;
}
.mce-shy::after {
content: '-';
}
body {
font-family: sans-serif;
}
table {
border-collapse: collapse;
}

689
public/tinymce/skins/ui/oxide/content.inline.css

@ -0,0 +1,689 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
.mce-content-body .mce-item-anchor {
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;
cursor: default;
display: inline-block;
height: 12px !important;
padding: 0 2px;
-webkit-user-modify: read-only;
-moz-user-modify: read-only;
-webkit-user-select: all;
-moz-user-select: all;
-ms-user-select: all;
user-select: all;
width: 8px !important;
}
.mce-content-body .mce-item-anchor[data-mce-selected] {
outline-offset: 1px;
}
.tox-comments-visible .tox-comment {
background-color: #fff0b7;
}
.tox-comments-visible .tox-comment--active {
background-color: #ffe168;
}
.tox-checklist > li:not(.tox-checklist--hidden) {
list-style: none;
margin: 0.25em 0;
}
.tox-checklist > li:not(.tox-checklist--hidden)::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-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: '';
cursor: pointer;
height: 1em;
margin-left: -1.5em;
margin-top: 0.125em;
position: absolute;
width: 1em;
}
.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");
}
[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
margin-left: 0;
margin-right: -1.5em;
}
/* stylelint-disable */
/* http://prismjs.com/ */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
font-size: 1em;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: 0.5em 0;
overflow: auto;
}
:not(pre) > code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: 0.1em;
border-radius: 0.3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: 0.7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, 0.5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
/* stylelint-enable */
.mce-content-body {
overflow-wrap: break-word;
word-wrap: break-word;
}
.mce-content-body .mce-visual-caret {
background-color: black;
background-color: currentColor;
position: absolute;
}
.mce-content-body .mce-visual-caret-hidden {
display: none;
}
.mce-content-body *[data-mce-caret] {
left: -1000px;
margin: 0;
padding: 0;
position: absolute;
right: auto;
top: 0;
}
.mce-content-body .mce-offscreen-selection {
left: -2000000px;
max-width: 1000000px;
position: absolute;
}
.mce-content-body *[contentEditable=false] {
cursor: default;
}
.mce-content-body *[contentEditable=true] {
cursor: text;
}
.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;
}
.mce-content-body figure.align-left {
float: left;
}
.mce-content-body figure.align-right {
float: right;
}
.mce-content-body figure.image.align-center {
display: table;
margin-left: auto;
margin-right: auto;
}
.mce-preview-object {
border: 1px solid gray;
display: inline-block;
line-height: 0;
margin: 0 2px 0 2px;
position: relative;
}
.mce-preview-object .mce-shim {
background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
.mce-preview-object[data-mce-selected="2"] .mce-shim {
display: none;
}
.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;
}
.mce-pagebreak {
border: 1px dashed #aaa;
cursor: default;
display: block;
height: 5px;
margin-top: 15px;
page-break-before: always;
width: 100%;
}
@media print {
.mce-pagebreak {
border: 0;
}
}
.tiny-pageembed .mce-shim {
background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
.tiny-pageembed[data-mce-selected="2"] .mce-shim {
display: none;
}
.tiny-pageembed {
display: inline-block;
position: relative;
}
.tiny-pageembed--21by9,
.tiny-pageembed--16by9,
.tiny-pageembed--4by3,
.tiny-pageembed--1by1 {
display: block;
overflow: hidden;
padding: 0;
position: relative;
width: 100%;
}
.tiny-pageembed--21by9 {
padding-top: 42.857143%;
}
.tiny-pageembed--16by9 {
padding-top: 56.25%;
}
.tiny-pageembed--4by3 {
padding-top: 75%;
}
.tiny-pageembed--1by1 {
padding-top: 100%;
}
.tiny-pageembed--21by9 iframe,
.tiny-pageembed--16by9 iframe,
.tiny-pageembed--4by3 iframe,
.tiny-pageembed--1by1 iframe {
border: 0;
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
.mce-content-body[data-mce-placeholder] {
position: relative;
}
.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
color: rgba(34, 47, 62, 0.7);
content: attr(data-mce-placeholder);
position: absolute;
}
.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
left: 1px;
}
.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
right: 1px;
}
.mce-content-body div.mce-resizehandle {
background-color: #4099ff;
border-color: #4099ff;
border-style: solid;
border-width: 1px;
box-sizing: border-box;
height: 10px;
position: absolute;
width: 10px;
z-index: 10000;
}
.mce-content-body div.mce-resizehandle:hover {
background-color: #4099ff;
}
.mce-content-body div.mce-resizehandle:nth-of-type(1) {
cursor: nwse-resize;
}
.mce-content-body div.mce-resizehandle:nth-of-type(2) {
cursor: nesw-resize;
}
.mce-content-body div.mce-resizehandle:nth-of-type(3) {
cursor: nwse-resize;
}
.mce-content-body div.mce-resizehandle:nth-of-type(4) {
cursor: nesw-resize;
}
.mce-content-body .mce-clonedresizable {
opacity: 0.5;
outline: 1px dashed black;
position: absolute;
z-index: 10000;
}
.mce-content-body .mce-resize-helper {
background: #555;
background: rgba(0, 0, 0, 0.75);
border: 1px;
border-radius: 3px;
color: white;
display: none;
font-family: sans-serif;
font-size: 12px;
line-height: 14px;
margin: 5px 10px;
padding: 5px;
position: absolute;
white-space: nowrap;
z-index: 10001;
}
.tox-rtc-user-selection {
position: relative;
}
.tox-rtc-user-cursor {
bottom: 0;
cursor: default;
position: absolute;
top: 0;
width: 2px;
}
.tox-rtc-user-cursor::before {
background-color: inherit;
border-radius: 50%;
content: '';
display: block;
height: 8px;
position: absolute;
right: -3px;
top: -3px;
width: 8px;
}
.tox-rtc-user-cursor:hover::after {
background-color: inherit;
border-radius: 100px;
box-sizing: border-box;
color: #fff;
content: attr(data-user);
display: block;
font-size: 12px;
font-weight: bold;
left: -5px;
min-height: 8px;
min-width: 8px;
padding: 0 12px;
position: absolute;
top: -11px;
white-space: nowrap;
z-index: 1000;
}
.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
background-color: #2dc26b;
}
.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
background-color: #e03e2d;
}
.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
background-color: #f1c40f;
}
.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
background-color: #3598db;
}
.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
background-color: #b96ad9;
}
.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
background-color: #e67e23;
}
.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
background-color: #aaa69d;
}
.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
background-color: #f368e0;
}
.tox-rtc-remote-image {
background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
border: 1px solid #ccc;
min-height: 240px;
min-width: 320px;
}
.mce-match-marker {
background: #aaa;
color: #fff;
}
.mce-match-marker-selected {
background: #39f;
color: #fff;
}
.mce-match-marker-selected::-moz-selection {
background: #39f;
color: #fff;
}
.mce-match-marker-selected::selection {
background: #39f;
color: #fff;
}
.mce-content-body img[data-mce-selected],
.mce-content-body table[data-mce-selected] {
outline: 3px solid #b4d7ff;
}
.mce-content-body hr[data-mce-selected] {
outline: 3px solid #b4d7ff;
outline-offset: 1px;
}
.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
outline: 3px solid #b4d7ff;
}
.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
outline: 3px solid #b4d7ff;
}
.mce-content-body *[contentEditable=false][data-mce-selected] {
cursor: not-allowed;
outline: 3px solid #b4d7ff;
}
.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
outline: none;
}
.mce-content-body *[data-mce-selected="inline-boundary"] {
background-color: #b4d7ff;
}
.mce-content-body .mce-edit-focus {
outline: 3px solid #b4d7ff;
}
.mce-content-body td[data-mce-selected],
.mce-content-body th[data-mce-selected] {
background-color: #b4d7ff !important;
}
.mce-content-body td[data-mce-selected]::-moz-selection,
.mce-content-body th[data-mce-selected]::-moz-selection {
background: none;
}
.mce-content-body td[data-mce-selected]::selection,
.mce-content-body th[data-mce-selected]::selection {
background: none;
}
.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;
}
.mce-content-body img::-moz-selection {
background: none;
}
.mce-content-body img::selection {
background: none;
}
.ephox-snooker-resizer-bar {
background-color: #b4d7ff;
opacity: 0;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.ephox-snooker-resizer-cols {
cursor: col-resize;
}
.ephox-snooker-resizer-rows {
cursor: row-resize;
}
.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
opacity: 1;
}
.mce-spellchecker-word {
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'.75'%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;
cursor: default;
height: 2rem;
}
.mce-spellchecker-grammar {
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'%2300A835'%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;
cursor: default;
}
.mce-toc {
border: 1px solid gray;
}
.mce-toc h2 {
margin: 4px;
}
.mce-toc li {
list-style-type: none;
}
.mce-item-table,
.mce-item-table td,
.mce-item-table th,
.mce-item-table caption {
border: 1px dashed #bbb;
}
.mce-visualblocks p,
.mce-visualblocks h1,
.mce-visualblocks h2,
.mce-visualblocks h3,
.mce-visualblocks h4,
.mce-visualblocks h5,
.mce-visualblocks h6,
.mce-visualblocks div:not([data-mce-bogus]),
.mce-visualblocks section,
.mce-visualblocks article,
.mce-visualblocks blockquote,
.mce-visualblocks address,
.mce-visualblocks pre,
.mce-visualblocks figure,
.mce-visualblocks figcaption,
.mce-visualblocks hgroup,
.mce-visualblocks aside,
.mce-visualblocks ul,
.mce-visualblocks ol,
.mce-visualblocks dl {
background-repeat: no-repeat;
border: 1px dashed #bbb;
margin-left: 3px;
padding-top: 10px;
}
.mce-visualblocks p {
background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
}
.mce-visualblocks h1 {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
}
.mce-visualblocks h2 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
}
.mce-visualblocks h3 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
}
.mce-visualblocks h4 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
}
.mce-visualblocks h5 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
}
.mce-visualblocks h6 {
background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
}
.mce-visualblocks div:not([data-mce-bogus]) {
background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
}
.mce-visualblocks section {
background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
}
.mce-visualblocks article {
background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
}
.mce-visualblocks blockquote {
background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
}
.mce-visualblocks address {
background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
}
.mce-visualblocks pre {
background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
}
.mce-visualblocks figure {
background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
}
.mce-visualblocks figcaption {
border: 1px dashed #bbb;
}
.mce-visualblocks hgroup {
background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
}
.mce-visualblocks aside {
background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
}
.mce-visualblocks ul {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
}
.mce-visualblocks ol {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
}
.mce-visualblocks dl {
background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
}
.mce-visualblocks:not([dir=rtl]) p,
.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]) div:not([data-mce-bogus]),
.mce-visualblocks:not([dir=rtl]) section,
.mce-visualblocks:not([dir=rtl]) article,
.mce-visualblocks:not([dir=rtl]) blockquote,
.mce-visualblocks:not([dir=rtl]) address,
.mce-visualblocks:not([dir=rtl]) pre,
.mce-visualblocks:not([dir=rtl]) figure,
.mce-visualblocks:not([dir=rtl]) figcaption,
.mce-visualblocks:not([dir=rtl]) hgroup,
.mce-visualblocks:not([dir=rtl]) aside,
.mce-visualblocks:not([dir=rtl]) ul,
.mce-visualblocks:not([dir=rtl]) ol,
.mce-visualblocks:not([dir=rtl]) dl {
margin-left: 3px;
}
.mce-visualblocks[dir=rtl] p,
.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] div:not([data-mce-bogus]),
.mce-visualblocks[dir=rtl] section,
.mce-visualblocks[dir=rtl] article,
.mce-visualblocks[dir=rtl] blockquote,
.mce-visualblocks[dir=rtl] address,
.mce-visualblocks[dir=rtl] pre,
.mce-visualblocks[dir=rtl] figure,
.mce-visualblocks[dir=rtl] figcaption,
.mce-visualblocks[dir=rtl] hgroup,
.mce-visualblocks[dir=rtl] aside,
.mce-visualblocks[dir=rtl] ul,
.mce-visualblocks[dir=rtl] ol,
.mce-visualblocks[dir=rtl] dl {
background-position-x: right;
margin-right: 3px;
}
.mce-nbsp,
.mce-shy {
background: #aaa;
}
.mce-shy::after {
content: '-';
}

7
public/tinymce/skins/ui/oxide/content.inline.min.css

File diff suppressed because one or more lines are too long

7
public/tinymce/skins/ui/oxide/content.min.css

File diff suppressed because one or more lines are too long

29
public/tinymce/skins/ui/oxide/content.mobile.css

@ -0,0 +1,29 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection {
/* Note: this file is used inside the content, so isn't part of theming */
background-color: green;
display: inline-block;
opacity: 0.5;
position: absolute;
}
body {
-webkit-text-size-adjust: none;
}
body img {
/* this is related to the content margin */
max-width: 96vw;
}
body table img {
max-width: 95%;
}
body {
font-family: sans-serif;
}
table {
border-collapse: collapse;
}

7
public/tinymce/skins/ui/oxide/content.mobile.min.css

@ -0,0 +1,7 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse}

BIN
public/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff

Binary file not shown.

2937
public/tinymce/skins/ui/oxide/skin.css

File diff suppressed because it is too large

7
public/tinymce/skins/ui/oxide/skin.min.css

File diff suppressed because one or more lines are too long

673
public/tinymce/skins/ui/oxide/skin.mobile.css

@ -0,0 +1,673 @@
/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*/
/* RESET all the things! */
.tinymce-mobile-outer-container {
all: initial;
display: block;
}
.tinymce-mobile-outer-container * {
border: 0;
box-sizing: initial;
cursor: inherit;
float: none;
line-height: 1;
margin: 0;
outline: 0;
padding: 0;
-webkit-tap-highlight-color: transparent;
/* TBIO-3691, stop the gray flicker on touch. */
text-shadow: none;
white-space: nowrap;
}
.tinymce-mobile-icon-arrow-back::before {
content: "\e5cd";
}
.tinymce-mobile-icon-image::before {
content: "\e412";
}
.tinymce-mobile-icon-cancel-circle::before {
content: "\e5c9";
}
.tinymce-mobile-icon-full-dot::before {
content: "\e061";
}
.tinymce-mobile-icon-align-center::before {
content: "\e234";
}
.tinymce-mobile-icon-align-left::before {
content: "\e236";
}
.tinymce-mobile-icon-align-right::before {
content: "\e237";
}
.tinymce-mobile-icon-bold::before {
content: "\e238";
}
.tinymce-mobile-icon-italic::before {
content: "\e23f";
}
.tinymce-mobile-icon-unordered-list::before {
content: "\e241";
}
.tinymce-mobile-icon-ordered-list::before {
content: "\e242";
}
.tinymce-mobile-icon-font-size::before {
content: "\e245";
}
.tinymce-mobile-icon-underline::before {
content: "\e249";
}
.tinymce-mobile-icon-link::before {
content: "\e157";
}
.tinymce-mobile-icon-unlink::before {
content: "\eca2";
}
.tinymce-mobile-icon-color::before {
content: "\e891";
}
.tinymce-mobile-icon-previous::before {
content: "\e314";
}
.tinymce-mobile-icon-next::before {
content: "\e315";
}
.tinymce-mobile-icon-large-font::before,
.tinymce-mobile-icon-style-formats::before {
content: "\e264";
}
.tinymce-mobile-icon-undo::before {
content: "\e166";
}
.tinymce-mobile-icon-redo::before {
content: "\e15a";
}
.tinymce-mobile-icon-removeformat::before {
content: "\e239";
}
.tinymce-mobile-icon-small-font::before {
content: "\e906";
}
.tinymce-mobile-icon-readonly-back::before,
.tinymce-mobile-format-matches::after {
content: "\e5ca";
}
.tinymce-mobile-icon-small-heading::before {
content: "small";
}
.tinymce-mobile-icon-large-heading::before {
content: "large";
}
.tinymce-mobile-icon-small-heading::before,
.tinymce-mobile-icon-large-heading::before {
font-family: sans-serif;
font-size: 80%;
}
.tinymce-mobile-mask-edit-icon::before {
content: "\e254";
}
.tinymce-mobile-icon-back::before {
content: "\e5c4";
}
.tinymce-mobile-icon-heading::before {
/* TODO: Translate */
content: "Headings";
font-family: sans-serif;
font-size: 80%;
font-weight: bold;
}
.tinymce-mobile-icon-h1::before {
content: "H1";
font-weight: bold;
}
.tinymce-mobile-icon-h2::before {
content: "H2";
font-weight: bold;
}
.tinymce-mobile-icon-h3::before {
content: "H3";
font-weight: bold;
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask {
align-items: center;
display: flex;
justify-content: center;
background: rgba(51, 51, 51, 0.5);
height: 100%;
position: absolute;
top: 0;
width: 100%;
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container {
align-items: center;
border-radius: 50%;
display: flex;
flex-direction: column;
font-family: sans-serif;
font-size: 1em;
justify-content: space-between;
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item {
align-items: center;
display: flex;
justify-content: center;
border-radius: 50%;
height: 2.1em;
width: 2.1em;
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section {
align-items: center;
display: flex;
justify-content: center;
flex-direction: column;
font-size: 1em;
}
@media only screen and (min-device-width:700px) {
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section {
font-size: 1.2em;
}
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon {
align-items: center;
display: flex;
justify-content: center;
border-radius: 50%;
height: 2.1em;
width: 2.1em;
background-color: white;
color: #207ab7;
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before {
content: "\e900";
font-family: 'tinymce-mobile', sans-serif;
}
.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon {
z-index: 2;
}
.tinymce-mobile-android-container.tinymce-mobile-android-maximized {
background: #ffffff;
border: none;
bottom: 0;
display: flex;
flex-direction: column;
left: 0;
position: fixed;
right: 0;
top: 0;
}
.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized) {
position: relative;
}
.tinymce-mobile-android-container .tinymce-mobile-editor-socket {
display: flex;
flex-grow: 1;
}
.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe {
display: flex !important;
flex-grow: 1;
height: auto !important;
}
.tinymce-mobile-android-scroll-reload {
overflow: hidden;
}
:not(.tinymce-mobile-readonly-mode) > .tinymce-mobile-android-selection-context-toolbar {
margin-top: 23px;
}
.tinymce-mobile-toolstrip {
background: #fff;
display: flex;
flex: 0 0 auto;
z-index: 1;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar {
align-items: center;
background-color: #fff;
border-bottom: 1px solid #cccccc;
display: flex;
flex: 1;
height: 2.5em;
width: 100%;
/* Make it no larger than the toolstrip, so that it needs to scroll */
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group {
align-items: center;
display: flex;
height: 100%;
flex-shrink: 1;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group > div {
align-items: center;
display: flex;
height: 100%;
flex: 1;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container {
background: #f44336;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group {
flex-grow: 1;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item {
padding-left: 0.5em;
padding-right: 0.5em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button {
align-items: center;
display: flex;
height: 80%;
margin-left: 2px;
margin-right: 2px;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected {
background: #c8cbcf;
color: #cccccc;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type {
background: #207ab7;
color: #eceff1;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar {
/* Note, this file is imported inside .tinymce-mobile-context-toolbar, so that prefix is on everything here. */
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group {
align-items: center;
display: flex;
height: 100%;
flex: 1;
padding-bottom: 0.4em;
padding-top: 0.4em;
/* Make any buttons appearing on the left and right display in the centre (e.g. color edges) */
/* For widgets like the colour picker, use the whole height */
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog {
display: flex;
min-height: 1.5em;
overflow: hidden;
padding-left: 0;
padding-right: 0;
position: relative;
width: 100%;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain {
display: flex;
height: 100%;
transition: left cubic-bezier(0.4, 0, 1, 1) 0.15s;
width: 100%;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen {
display: flex;
flex: 0 0 auto;
justify-content: space-between;
width: 100%;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input {
font-family: Sans-serif;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container {
display: flex;
flex-grow: 1;
position: relative;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x {
-ms-grid-row-align: center;
align-self: center;
background: inherit;
border: none;
border-radius: 50%;
color: #888;
font-size: 0.6em;
font-weight: bold;
height: 100%;
padding-right: 2px;
position: absolute;
right: 0;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x {
display: none;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next {
align-items: center;
display: flex;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before {
align-items: center;
display: flex;
font-weight: bold;
height: 100%;
padding-left: 0.5em;
padding-right: 0.5em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before {
visibility: hidden;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item {
color: #cccccc;
font-size: 10px;
line-height: 10px;
margin: 0 2px;
padding-top: 3px;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active {
color: #c8cbcf;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before {
margin-left: 0.5em;
margin-right: 0.9em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before {
margin-left: 0.9em;
margin-right: 0.5em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider {
display: flex;
flex: 1;
margin-left: 0;
margin-right: 0;
padding: 0.28em 0;
position: relative;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container {
align-items: center;
display: flex;
flex-grow: 1;
height: 100%;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line {
background: #cccccc;
display: flex;
flex: 1;
height: 0.2em;
margin-bottom: 0.3em;
margin-top: 0.3em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container {
padding-left: 2em;
padding-right: 2em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container {
align-items: center;
display: flex;
flex-grow: 1;
height: 100%;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient {
background: linear-gradient(to right, hsl(0, 100%, 50%) 0%, hsl(60, 100%, 50%) 17%, hsl(120, 100%, 50%) 33%, hsl(180, 100%, 50%) 50%, hsl(240, 100%, 50%) 67%, hsl(300, 100%, 50%) 83%, hsl(0, 100%, 50%) 100%);
display: flex;
flex: 1;
height: 0.2em;
margin-bottom: 0.3em;
margin-top: 0.3em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black {
/* Not part of theming */
background: black;
height: 0.2em;
margin-bottom: 0.3em;
margin-top: 0.3em;
width: 1.2em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white {
/* Not part of theming */
background: white;
height: 0.2em;
margin-bottom: 0.3em;
margin-top: 0.3em;
width: 1.2em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb {
/* vertically centering trick (margin: auto, top: 0, bottom: 0). On iOS and Safari, if you leave
* out these values, then it shows the thumb at the top of the spectrum. This is probably because it is
* absolutely positioned with only a left value, and not a top. Note, on Chrome it seems to be fine without
* this approach.
*/
align-items: center;
background-clip: padding-box;
background-color: #455a64;
border: 0.5em solid rgba(136, 136, 136, 0);
border-radius: 3em;
bottom: 0;
color: #fff;
display: flex;
height: 0.5em;
justify-content: center;
left: -10px;
margin: auto;
position: absolute;
top: 0;
transition: border 120ms cubic-bezier(0.39, 0.58, 0.57, 1);
width: 0.5em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active {
border: 0.5em solid rgba(136, 136, 136, 0.39);
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group > div {
align-items: center;
display: flex;
height: 100%;
flex: 1;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper {
flex-direction: column;
justify-content: center;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item {
align-items: center;
display: flex;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog) {
height: 100%;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container {
display: flex;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input {
background: #ffffff;
border: none;
border-radius: 0;
color: #455a64;
flex-grow: 1;
font-size: 0.85em;
padding-bottom: 0.1em;
padding-left: 5px;
padding-top: 0.1em;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder {
/* WebKit, Blink, Edge */
color: #888;
}
.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder {
/* WebKit, Blink, Edge */
color: #888;
}
/* dropup */
.tinymce-mobile-dropup {
background: white;
display: flex;
overflow: hidden;
width: 100%;
}
.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking {
transition: height 0.3s ease-out;
}
.tinymce-mobile-dropup.tinymce-mobile-dropup-growing {
transition: height 0.3s ease-in;
}
.tinymce-mobile-dropup.tinymce-mobile-dropup-closed {
flex-grow: 0;
}
.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing) {
flex-grow: 1;
}
/* TODO min-height for device size and orientation */
.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {
min-height: 200px;
}
@media only screen and (orientation: landscape) {
.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {
min-height: 200px;
}
}
@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) {
.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {
min-height: 150px;
}
}
/* styles menu */
.tinymce-mobile-styles-menu {
font-family: sans-serif;
outline: 4px solid black;
overflow: hidden;
position: relative;
width: 100%;
}
.tinymce-mobile-styles-menu [role="menu"] {
display: flex;
flex-direction: column;
height: 100%;
position: absolute;
width: 100%;
}
.tinymce-mobile-styles-menu [role="menu"].transitioning {
transition: transform 0.5s ease-in-out;
}
.tinymce-mobile-styles-menu .tinymce-mobile-styles-item {
border-bottom: 1px solid #ddd;
color: #455a64;
cursor: pointer;
display: flex;
padding: 1em 1em;
position: relative;
}
.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before {
color: #455a64;
content: "\e314";
font-family: 'tinymce-mobile', sans-serif;
}
.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after {
color: #455a64;
content: "\e315";
font-family: 'tinymce-mobile', sans-serif;
padding-left: 1em;
padding-right: 1em;
position: absolute;
right: 0;
}
.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after {
font-family: 'tinymce-mobile', sans-serif;
padding-left: 1em;
padding-right: 1em;
position: absolute;
right: 0;
}
.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator,
.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser {
align-items: center;
background: #fff;
border-top: #455a64;
color: #455a64;
display: flex;
min-height: 2.5em;
padding-left: 1em;
padding-right: 1em;
}
.tinymce-mobile-styles-menu [data-transitioning-destination="before"][data-transitioning-state],
.tinymce-mobile-styles-menu [data-transitioning-state="before"] {
transform: translate(-100%);
}
.tinymce-mobile-styles-menu [data-transitioning-destination="current"][data-transitioning-state],
.tinymce-mobile-styles-menu [data-transitioning-state="current"] {
transform: translate(0%);
}
.tinymce-mobile-styles-menu [data-transitioning-destination="after"][data-transitioning-state],
.tinymce-mobile-styles-menu [data-transitioning-state="after"] {
transform: translate(100%);
}
@font-face {
font-family: 'tinymce-mobile';
font-style: normal;
font-weight: normal;
src: url('fonts/tinymce-mobile.woff?8x92w3') format('woff');
}
@media (min-device-width: 700px) {
.tinymce-mobile-outer-container,
.tinymce-mobile-outer-container input {
font-size: 25px;
}
}
@media (max-device-width: 700px) {
.tinymce-mobile-outer-container,
.tinymce-mobile-outer-container input {
font-size: 18px;
}
}
.tinymce-mobile-icon {
font-family: 'tinymce-mobile', sans-serif;
}
.mixin-flex-and-centre {
align-items: center;
display: flex;
justify-content: center;
}
.mixin-flex-bar {
align-items: center;
display: flex;
height: 100%;
}
.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe {
background-color: #fff;
width: 100%;
}
.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {
/* Note, on the iPod touch in landscape, this isn't visible when the navbar appears */
background-color: #207ab7;
border-radius: 50%;
bottom: 1em;
color: white;
font-size: 1em;
height: 2.1em;
position: fixed;
right: 2em;
width: 2.1em;
align-items: center;
display: flex;
justify-content: center;
}
@media only screen and (min-device-width:700px) {
.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {
font-size: 1.2em;
}
}
.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket {
height: 300px;
overflow: hidden;
}
.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe {
height: 100%;
}
.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip {
display: none;
}
/*
Note, that if you don't include this (::-webkit-file-upload-button), the toolbar width gets
increased and the whole body becomes scrollable. It's important!
*/
input[type="file"]::-webkit-file-upload-button {
display: none;
}
@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) {
.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {
bottom: 50%;
}
}

7
public/tinymce/skins/ui/oxide/skin.mobile.min.css

File diff suppressed because one or more lines are too long

5
src/App.vue

@ -0,0 +1,5 @@
<template>
<div id="app">
<router-view/>
</div>
</template>

BIN
src/assets/bg-login.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

480
src/assets/ic-403.svg

@ -0,0 +1,480 @@
<svg width="227" height="269" viewBox="0 0 227 269" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<path d="M0 131.5c0-29.712 2.002-61.194 6.007-94.445 2.225-18.473 17.225-32.78 35.782-34.13C68.622.976 91.041 0 109.044 0c18.09 0 40.799.985 68.129 2.954 18.572 1.338 33.589 15.656 35.809 34.144C216.994 70.51 219 102.083 219 131.813c0 29.66-1.997 61.03-5.99 94.114-2.23 18.474-17.237 32.778-35.797 34.12-27.238 1.969-49.735 2.953-67.491 2.953-17.794 0-40.43-.989-67.91-2.966-18.569-1.336-33.585-15.649-35.81-34.133C2 192.666 0 161.2 0 131.5z" id="b" />
<filter x="-4.5%" y="-1.4%" width="106.2%" height="104.4%" filterUnits="objectBoundingBox" id="a">
<feMorphology radius=".81" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1" />
<feOffset dx="-6" dy="4" in="shadowSpreadOuter1" result="shadowOffsetOuter1" />
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" />
</filter>
<path d="M39.654 130.992c0-20.899.881-41.798 2.643-62.697.97-11.504 9.9-20.738 21.366-22.091a388.15 388.15 0 0 1 45.531-2.687c15.167 0 30.333.895 45.5 2.684 11.47 1.353 20.403 10.593 21.368 22.103a755.378 755.378 0 0 1 2.657 63.124c0 20.88-.88 41.76-2.64 62.638-.97 11.505-9.903 20.74-21.369 22.091a389.034 389.034 0 0 1-45.598 2.693c-15.145 0-30.291-.894-45.437-2.682-11.468-1.355-20.4-10.593-21.365-22.101a754.09 754.09 0 0 1-2.656-63.075z" id="d" />
<filter x="-6%" y="-2.3%" width="108.6%" height="105.9%" filterUnits="objectBoundingBox" id="c">
<feMorphology radius=".81" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1" />
<feOffset dx="-5" dy="3" in="shadowSpreadOuter1" result="shadowOffsetOuter1" />
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" />
</filter>
<path d="M161.51 89.858h15.333v17.534H161.51a6.568 6.568 0 0 1-6.567-6.568v-4.398a6.568 6.568 0 0 1 6.567-6.568z" id="f" />
<filter x="-13.7%" y="-5.7%" width="118.3%" height="117.1%" filterUnits="objectBoundingBox" id="e">
<feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" />
</filter>
<path d="M183.958 89.858h15.332v17.534h-15.332a6.568 6.568 0 0 1-6.568-6.568v-4.398a6.568 6.568 0 0 1 6.568-6.568z" id="h" />
<filter x="-2.3%" y="-2.9%" width="109.1%" height="111.4%" filterUnits="objectBoundingBox" id="g">
<feOffset dx="1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" />
</filter>
<filter x="-55.5%" y="-9.3%" width="177.5%" height="148%" filterUnits="objectBoundingBox" id="i">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-55.5%" y="-9.3%" width="177.5%" height="148%" filterUnits="objectBoundingBox" id="j">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<path d="M8.865 17.248a1.754 1.754 0 0 1-.77-1.454 1.75 1.75 0 0 1 1.748-1.754 1.75 1.75 0 0 1 1.747 1.754c0 .605-.305 1.139-.77 1.454l.976 2.737a.615.615 0 0 1-.579.82H8.468a.615.615 0 0 1-.579-.82l.976-2.737z" id="k" />
<filter x="-12%" y="-7.4%" width="124.1%" height="114.8%" filterUnits="objectBoundingBox" id="l">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetInner1" />
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 1 0" in="shadowInnerInner1" />
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="m">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="n">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="o">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="p">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="q">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="r">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="s">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="t">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="u">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="v">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-44.4%" y="-20%" width="166.7%" height="160%" filterUnits="objectBoundingBox" id="w">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-44.4%" y="-20%" width="166.7%" height="160%" filterUnits="objectBoundingBox" id="x">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-44.4%" y="-20%" width="166.7%" height="160%" filterUnits="objectBoundingBox" id="y">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-44.4%" y="-20%" width="166.7%" height="160%" filterUnits="objectBoundingBox" id="z">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-44.4%" y="-20%" width="166.7%" height="160%" filterUnits="objectBoundingBox" id="A">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-44.4%" y="-20%" width="166.7%" height="160%" filterUnits="objectBoundingBox" id="B">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-44.4%" y="-20%" width="166.7%" height="160%" filterUnits="objectBoundingBox" id="C">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<path id="E" d="M79.083 68.794h60.833v24.352H79.083z" />
<filter x="-2.5%" y="-2.1%" width="103.3%" height="108.2%" filterUnits="objectBoundingBox" id="D">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" />
</filter>
<path id="F" d="M119.233 71.235h18.25v19.507h-18.25z" />
<path d="M6.692.215h8.762v30.683H6.692A6.568 6.568 0 0 1 .124 24.33V6.782A6.568 6.568 0 0 1 6.692.215z" id="H" />
<filter x="-29.4%" y="-4.9%" width="139.1%" height="116.3%" filterUnits="objectBoundingBox" id="G">
<feOffset dx="-3" dy="2" in="SourceAlpha" result="shadowOffsetOuter1" />
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.866666667 0 0 0 0 0.890196078 0 0 0 0 0.909803922 0 0 0 1 0" in="shadowOffsetOuter1" />
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="I">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="J">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<path d="M42.83 11.876v7.36c0 .69-.493 1.3-1.091 1.36l-24.095 2.083V8.433l24.095 2.084c.602.06 1.09.668 1.09 1.359z" id="K" />
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="L">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="M">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<rect id="O" x="12.23" y="6.79" width="7.117" height="17.533" rx="1.095" />
<filter x="-42.1%" y="-5.7%" width="156.2%" height="117.1%" filterUnits="objectBoundingBox" id="N">
<feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" />
</filter>
<path d="M6.692.215h8.762v30.683H6.692A6.568 6.568 0 0 1 .124 24.33V6.782A6.568 6.568 0 0 1 6.692.215z" id="Q" />
<filter x="-29.4%" y="-4.9%" width="139.1%" height="116.3%" filterUnits="objectBoundingBox" id="P">
<feOffset dx="-3" dy="2" in="SourceAlpha" result="shadowOffsetOuter1" />
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.866666667 0 0 0 0 0.890196078 0 0 0 0 0.909803922 0 0 0 1 0" in="shadowOffsetOuter1" />
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="R">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="S">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<path d="M42.83 11.876v7.36c0 .69-.493 1.3-1.091 1.36l-24.095 2.083V8.433l24.095 2.084c.602.06 1.09.668 1.09 1.359z" id="T" />
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="U">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter x="-50%" width="160%" height="160%" filterUnits="objectBoundingBox" id="V">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" result="shadowMatrixOuter1" />
<feMerge>
<feMergeNode in="shadowMatrixOuter1" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<rect id="X" x="12.23" y="6.79" width="7.117" height="17.533" rx="1.095" />
<filter x="-42.1%" y="-5.7%" width="156.2%" height="117.1%" filterUnits="objectBoundingBox" id="W">
<feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" />
</filter>
<path d="M24.598 18.916c-1.887-.225-4.41-.546-5.998-.826-2.828-.498-8.375-1.863-8.375-1.863l-.793 4.498s5.701.552 8.518 1.048c1.365.241 3.377.703 5.086 1.114-.964 1.487-2.121 3.236-2.943 4.366-1.688 2.324-5.346 6.71-5.346 6.71l3.695 2.685s2.995-4.882 4.677-7.196c.84-1.158 2.196-2.832 3.338-4.213.981 1.507 2.148 3.335 2.864 4.575 1.436 2.487 3.956 7.613 3.956 7.613l3.955-2.283s-3.241-4.722-4.672-7.2c-.752-1.303-1.795-3.358-2.613-5.01 1.788-.483 4.046-1.073 5.526-1.388 2.81-.597 8.463-1.409 8.463-1.409l-.95-4.468s-5.492 1.624-8.29 2.219c-1.553.33-4.001.71-5.868.98-.105-1.888-.225-4.382-.225-5.972 0-2.872.381-8.57.381-8.57h-4.567s.446 5.71.446 8.57c0 1.609-.142 4.128-.265 6.02z" id="Y" />
<filter x="-14.6%" y="-6.2%" width="120.9%" height="121.4%" filterUnits="objectBoundingBox" id="Z">
<feMorphology radius=".547" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1" />
<feOffset dx="-3" dy="3" in="shadowSpreadOuter1" result="shadowOffsetOuter1" />
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" in="shadowOffsetOuter1" />
</filter>
<ellipse id="ab" cx="26.803" cy="22.671" rx="4.38" ry="4.383" />
<filter x="-34.2%" y="-11.4%" width="145.7%" height="134.2%" filterUnits="objectBoundingBox" id="aa">
<feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1" />
<feColorMatrix values="0 0 0 0 0.596078431 0 0 0 0 0.647058824 0 0 0 0 0.701960784 0 0 0 1 0" in="shadowOffsetOuter1" />
</filter>
</defs>
<g fill="none" fill-rule="evenodd">
<g transform="translate(7 1)">
<use fill="#000" filter="url(#a)" xlink:href="#b" />
<use stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5" xlink:href="#b" />
<use fill="#000" filter="url(#c)" xlink:href="#d" />
<use stroke="#A3B1BF" stroke-width="1.62" fill-opacity=".15" fill="#A3B1BF" xlink:href="#d" />
<use fill="#000" filter="url(#e)" xlink:href="#f" />
<use fill="#F0F2F5" xlink:href="#f" />
<path stroke="#A3B1BF" stroke-width="1.62" d="M176.032 106.582V90.668H161.51a5.758 5.758 0 0 0-5.757 5.758v4.398a5.758 5.758 0 0 0 5.757 5.758h14.523z" />
<g transform="matrix(-1 0 0 1 376.68 0)">
<use fill="#000" filter="url(#g)" xlink:href="#h" />
<use fill="#F0F2F5" xlink:href="#h" />
<path stroke="#A3B1BF" stroke-width="1.62" d="M198.48 106.582V90.668h-14.522a5.758 5.758 0 0 0-5.758 5.758v4.398a5.758 5.758 0 0 0 5.758 5.758h14.522z" />
</g>
<path d="M169.538 109.199h9.983v-2.882c.136.343-4.552 0-7.101 0l1.733-6.073c-2.547 0-4.615 2.05-4.615 4.579v4.376zm11.867-2.435l-.07-.935c-2.842.49-5.457 0-9.247 0l2.065-7.813c-3.787 0-6.861 3.048-6.861 6.807v1.941h-.422c-1.111 0-2.012.9-2.012 2.012v6.764a8.045 8.045 0 0 0 8.046 8.046h3.376a8.045 8.045 0 0 0 8.045-8.046v-6.764c0-1.111-.9-2.012-2.011-2.012h-.91z" fill="#D4DBE2" fill-rule="nonzero" />
<g filter="url(#i)" transform="translate(160.42 95.473)">
<ellipse stroke="#D9D9D9" stroke-width="1.095" fill="#F5F5F5" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#D9D9D9" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#j)" transform="translate(189.26 95.473)">
<ellipse stroke="#D9D9D9" stroke-width="1.095" fill="#F5F5F5" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#D9D9D9" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<path d="M169.117 106.147v-1.598c0-3.411 2.216-6.3 5.272-7.274v3.576a4.378 4.378 0 0 0-1.866 3.595v1.7h8.643v-1.7a4.38 4.38 0 0 0-1.262-3.085v-3.698a7.633 7.633 0 0 1 4.3 6.886v1.599a2.011 2.011 0 0 1 1.946 2.01v6.972a8.045 8.045 0 0 1-8.045 8.046h-3.376a8.045 8.045 0 0 1-8.046-8.046v-6.972c0-1.11.9-2.011 2.012-2.011h.422z" stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5" />
<g transform="translate(166.683 96.799)">
<use fill-opacity=".3" fill="#A3B1BF" xlink:href="#k" />
<use fill="#000" filter="url(#l)" xlink:href="#k" />
</g>
<g filter="url(#m)" transform="translate(64 75)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F5F5F5" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#n)" transform="translate(152 75)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F5F5F5" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#o)" transform="translate(57 120)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F5F5F5" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#p)" transform="translate(57 137)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F5F5F5" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#q)" transform="translate(64 186)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F5F5F5" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#r)" transform="translate(93 191)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F5F5F5" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#s)" transform="translate(122 191)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F5F5F5" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#t)" transform="translate(152 186)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F5F5F5" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#u)" transform="translate(160.42 95.473)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F5F5F5" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#v)" transform="translate(189.26 95.473)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F7FAFC" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#w)" transform="translate(25 38)">
<ellipse stroke="#A3B1BF" stroke-width="1.642" fill="#F7FAFC" cx="4.38" cy="4.931" rx="4.38" ry="4.383" />
<path fill="#A3B1BF" d="M4.004 9.133l3.558-.9L2.343.445.446 3.63.79 7.806z" />
</g>
<g filter="url(#x)" transform="translate(25 218)">
<ellipse stroke="#A3B1BF" stroke-width="1.642" fill="#F7FAFC" cx="4.38" cy="4.931" rx="4.38" ry="4.383" />
<path fill="#A3B1BF" d="M4.004 9.133l3.558-.9L2.343.445.446 3.63.79 7.806z" />
</g>
<g filter="url(#y)" transform="translate(106 237)">
<ellipse stroke="#A3B1BF" stroke-width="1.642" fill="#F7FAFC" cx="4.38" cy="4.931" rx="4.38" ry="4.383" />
<path fill="#A3B1BF" d="M4.004 9.133l3.558-.9L2.343.445.446 3.63.79 7.806z" />
</g>
<g filter="url(#z)" transform="translate(185 219)">
<ellipse stroke="#A3B1BF" stroke-width="1.642" fill="#F7FAFC" cx="4.38" cy="4.931" rx="4.38" ry="4.383" />
<path fill="#A3B1BF" d="M4.004 9.133l3.558-.9L2.343.445.446 3.63.79 7.806z" />
</g>
<g filter="url(#A)" transform="translate(14.42 129.699)">
<ellipse stroke="#A3B1BF" stroke-width="1.642" fill="#F7FAFC" cx="4.38" cy="4.931" rx="4.38" ry="4.383" />
<path fill="#A3B1BF" d="M4.004 9.133l3.558-.9L2.343.445.446 3.63.79 7.806z" />
</g>
<g filter="url(#B)" transform="translate(105.444 20.716)">
<ellipse stroke="#A3B1BF" stroke-width="1.642" fill="#F7FAFC" cx="4.38" cy="4.931" rx="4.38" ry="4.383" />
<path fill="#A3B1BF" d="M4.004 9.133l3.558-.9L2.343.445.446 3.63.79 7.806z" />
</g>
<g filter="url(#C)" transform="translate(185.055 37.806)">
<ellipse stroke="#A3B1BF" stroke-width="1.642" fill="#F5F5F5" cx="4.38" cy="4.931" rx="4.38" ry="4.383" />
<path fill="#A3B1BF" d="M4.004 9.133l3.558-.9L2.343.445.446 3.63.79 7.806z" />
</g>
<use fill="#000" filter="url(#D)" xlink:href="#E" />
<use fill="#F0F2F5" xlink:href="#E" />
<path stroke="#A3B1BF" stroke-width="2.43" d="M80.298 70.009h58.403v21.922H80.298z" />
<use fill-opacity=".3" fill="#A3B1BF" xlink:href="#F" />
<rect fill="#A3B1BF" x="114.367" y="77.317" width="1.825" height="8.117" rx=".912" />
<rect fill="#A3B1BF" x="118.017" y="72.65" width="2.433" height="16.235" rx="1.217" />
<g>
<g transform="translate(25 88)">
<use fill="#000" filter="url(#G)" xlink:href="#H" />
<use fill="#EAEFF3" xlink:href="#H" />
<path stroke="#A3B1BF" stroke-width="1.62" d="M14.644 30.088V1.025H6.692A5.758 5.758 0 0 0 .934 6.782V24.33a5.758 5.758 0 0 0 5.758 5.758h7.952z" />
</g>
<g filter="url(#I)" transform="translate(31.207 94.79)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F7FAFC" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#J)" transform="translate(31.543 107.182)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F7FAFC" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g transform="translate(25 88)">
<use fill="#F0F2F5" xlink:href="#K" />
<path stroke="#A3B1BF" stroke-width="1.62" d="M18.454 9.316v12.48l23.203-2.006c.165-.017.362-.262.362-.553v-7.361c0-.294-.195-.537-.35-.552L18.454 9.316z" />
</g>
<g filter="url(#L)" transform="translate(48 101)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F7FAFC" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#M)" transform="translate(58 101)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F7FAFC" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g transform="translate(25 88)">
<use fill="#000" filter="url(#N)" xlink:href="#O" />
<use fill="#EAEFF3" xlink:href="#O" />
<rect stroke="#A3B1BF" stroke-width="1.62" x="13.04" y="7.6" width="5.497" height="15.913" rx="1.095" />
</g>
<path d="M38.599 103.556h4.38" stroke="#A3B1BF" stroke-width="2.189" stroke-linecap="square" />
</g>
<g>
<g transform="translate(25 145)">
<use fill="#000" filter="url(#P)" xlink:href="#Q" />
<use fill="#EAEFF3" xlink:href="#Q" />
<path stroke="#A3B1BF" stroke-width="1.62" d="M14.644 30.088V1.025H6.692A5.758 5.758 0 0 0 .934 6.782V24.33a5.758 5.758 0 0 0 5.758 5.758h7.952z" />
</g>
<g filter="url(#R)" transform="translate(31.207 151.79)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F7FAFC" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#S)" transform="translate(31.543 164.182)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F7FAFC" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g transform="translate(25 145)">
<use fill="#F0F2F5" xlink:href="#T" />
<path stroke="#A3B1BF" stroke-width="1.62" d="M18.454 9.316v12.48l23.203-2.006c.165-.017.362-.262.362-.553v-7.361c0-.294-.195-.537-.35-.552L18.454 9.316z" />
</g>
<g filter="url(#U)" transform="translate(48 158)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F7FAFC" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g filter="url(#V)" transform="translate(58 158)">
<ellipse stroke="#A3B1BF" stroke-width="1.095" fill="#F7FAFC" cx="2.19" cy="2.74" rx="2.19" ry="2.192" />
<path fill="#A3B1BF" d="M3.781 4.39L1.171.497.224 2.09.101 4.39z" />
</g>
<g transform="translate(25 145)">
<use fill="#000" filter="url(#W)" xlink:href="#X" />
<use fill="#EAEFF3" xlink:href="#X" />
<rect stroke="#A3B1BF" stroke-width="1.62" x="13.04" y="7.6" width="5.497" height="15.913" rx="1.095" />
</g>
<path d="M38.599 160.556h4.38" stroke="#A3B1BF" stroke-width="2.189" stroke-linecap="square" />
</g>
</g>
<path d="M164.669 178.731c-12.398 0-22.448-10.058-22.448-22.465 0-12.406 10.05-22.464 22.448-22.464 12.397 0 22.447 10.058 22.447 22.464 0 12.407-10.05 22.465-22.447 22.465zm0-6.575c8.769 0 15.877-7.114 15.877-15.89 0-8.775-7.108-15.89-15.877-15.89-8.77 0-15.878 7.115-15.878 15.89 0 8.776 7.109 15.89 15.878 15.89z" fill-opacity=".3" fill="#A3B1BF" />
<g transform="translate(142.185 132.5)">
<use fill="#000" filter="url(#Z)" xlink:href="#Y" />
<use stroke="#A3B1BF" stroke-width="1.095" fill="#A3B1BF" xlink:href="#Y" />
</g>
<path d="M163.11 133.506a22.515 22.515 0 0 1 4.803-.516c12.398 0 22.448 10.058 22.448 22.465 0 10.862-7.704 19.924-17.943 22.012l-2.403-6.26c7.776-1.03 13.776-7.69 13.776-15.752 0-8.776-7.109-15.89-15.878-15.89a15.796 15.796 0 0 0-8.976 2.781l-1.083-2.82 5.255-6.02z" fill="#98A5B3" />
<path d="M168.988 177.635c-12.398 0-22.448-10.058-22.448-22.464 0-12.407 10.05-22.465 22.448-22.465 12.397 0 22.447 10.058 22.447 22.465 0 12.406-10.05 22.464-22.447 22.464zm0-6.575c8.769 0 15.877-7.114 15.877-15.89 0-8.775-7.108-15.889-15.877-15.889-8.769 0-15.878 7.114-15.878 15.89 0 8.775 7.109 15.89 15.878 15.89z" fill="#A3B1BF" />
<path d="M179.754 138.974s2.787 1.59 5.432 6.022c2.644 4.432 2.986 8.99 2.986 8.99" stroke="#F7FAFC" stroke-width="1.62" stroke-linecap="round" />
<g transform="translate(142.185 132.5)">
<use fill="#000" filter="url(#aa)" xlink:href="#ab" />
<use fill="#A3B1BF" xlink:href="#ab" />
</g>
<path d="M171.213 156.862a2.434 2.434 0 0 0-3.321-3.562s1.204.368 2.12 1.351c.918.984 1.201 2.21 1.201 2.21z" fill="#F7FAFC" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 36 KiB

299
src/assets/ic-404.svg

@ -0,0 +1,299 @@
<svg width="423" height="341" viewBox="0 0 423 341" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<g stroke="#A3B1BF" stroke-width="1.62" opacity=".6" stroke-linejoin="round" stroke-dasharray="12.15">
<path d="M224.993 290.054c-65.929 0-119.375-53.434-119.375-119.35 0-65.915 53.446-119.35 119.375-119.35 65.928 0 119.374 53.435 119.374 119.35 0 65.916-53.446 119.35-119.374 119.35z" />
<path d="M224.823 339.72c-93.378 0-169.076-75.684-169.076-169.043 0-93.36 75.698-169.042 169.076-169.042s169.076 75.683 169.076 169.042c0 93.36-75.698 169.042-169.076 169.042z" />
</g>
<path fill="#F5F5F5" d="M78.617 196.401l20.278-1.052L84.052 209.2z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M78.617 196.401l20.278-1.052L84.052 209.2z" />
<path d="M22.038 208.972l20.251-8.594 13.665 32.184-20.251 8.594z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M22.038 208.972l20.251-8.594 13.665 32.184-20.251 8.594z" />
<path fill="#F5F5F5" d="M38.867 193.414l4.997-2.12 19.721 46.447-4.997 2.12z" />
<path stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5" stroke-linejoin="round" d="M38.867 193.414l4.997-2.12 19.721 46.447-4.997 2.12z" />
<path d="M43.485 251.004l18.752-7.958 23.674 55.757-18.751 7.957z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M43.485 251.004l18.752-7.958 23.674 55.757-18.751 7.957z" />
<path d="M48.068 201.196l3.463-1.47 11.313 26.643-3.463 1.47z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M48.068 201.196l3.463-1.47 11.313 26.643-3.463 1.47z" />
<path fill="#F5F5F5" d="M53.783 204.42l8.022-3.405.765 1.802-8.022 3.404z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M53.783 204.42l8.022-3.405.765 1.802-8.022 3.404z" />
<path fill="#F5F5F5" d="M60.283 219.73l8.022-3.404.765 1.802-8.021 3.404z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M60.283 219.73l8.022-3.404.765 1.802-8.021 3.404z" />
<path d="M49.437 239.012l3.405 8.02-1.802.766-3.405-8.022z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M49.437 239.012l3.405 8.02-1.802.766-3.405-8.022z" />
<path d="M17.433 217.134l4.605-8.162 13.665 32.184-9.072-2.359z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M17.433 217.134l4.605-8.162 13.665 32.184-9.072-2.359z" />
<path d="M17.433 217.134l-5.653-3.81 13.666 32.185 1.185-6.712z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M17.433 217.134l-5.653-3.81 13.666 32.185 1.185-6.712z" />
<path d="M14.117 219.19l-5.772-1.165 4.074 9.596 3.171-4.96z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M14.117 219.19l-5.772-1.165 4.074 9.596 3.171-4.96z" />
<path d="M21.375 236.284l-5.772-1.165 4.074 9.595 3.171-4.96z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M21.375 236.284l-5.772-1.165 4.074 9.595 3.171-4.96z" />
<path fill="#F0F2F5" d="M52.498 201.393l2.41-1.023 3.3 7.77-2.41 1.024z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M52.498 201.393l2.41-1.023 3.3 7.77-2.41 1.024z" />
<path fill="#F0F2F5" d="M59.016 216.746l2.411-1.023 3.3 7.77-2.411 1.024z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M59.016 216.746l2.411-1.023 3.3 7.77-2.411 1.024z" />
<path d="M45.41 237.037l3.6-1.528 1.65 3.885-3.6 1.528z" />
<path stroke="#A3B1BF" stroke-width="1.62" fill="#F5F5F5" stroke-linejoin="round" d="M45.41 237.037l3.6-1.528 1.65 3.885-3.6 1.528z" />
<path d="M66.817 209.043c-6.095-14.354-5.144-28.946 1.659-35.517 1.125-1.086 3.702-2.908 5.748 1.91l21.773 51.281c1.864 4.389-.907 5.75-2.468 5.805-9.455.33-20.617-9.123-26.712-23.479z" fill="#F5F5F5" />
<path d="M66.817 209.043c-6.095-14.354-5.144-28.946 1.659-35.517 1.125-1.086 3.702-2.908 5.748 1.91l21.773 51.281c1.864 4.389-.907 5.75-2.468 5.805-9.455.33-20.617-9.123-26.712-23.479z" stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5" stroke-linejoin="round" />
<path fill="#F0F2F5" d="M61.153 199.48l2.41-1.022 8.552 20.139-2.411 1.023z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M61.153 199.48l2.41-1.022 8.552 20.139-2.411 1.023z" />
<path d="M100.73 197.68a2.863 2.863 0 1 1-2.237-5.272 2.863 2.863 0 0 1 2.237 5.272" fill="#A3B1BF" />
<path fill-opacity=".6" fill="#A3B1BF" d="M60.645 250.555l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M60.645 250.555l-.893-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M62.097 253.974l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M62.097 253.974l-.893-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M63.548 257.392l-.893-2.103 2.104-.893.893 2.104z" />
<path d="M63.548 257.392l-.893-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M65 260.811l-.893-2.104 2.104-.892.893 2.103z" />
<path d="M65 260.811l-.893-2.104 2.104-.892.893 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M57.49 251.894l-.894-2.104 2.104-.893.893 2.104z" />
<path d="M57.49 251.894l-.894-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M58.94 255.313l-.893-2.104 2.104-.893.894 2.104z" />
<path d="M58.94 255.313l-.893-2.104 2.104-.893.894 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M60.392 258.732l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M59.5 256.628l2.103-.893.893 2.104-2.104.893z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M61.844 262.15l-.893-2.103 2.104-.893.893 2.104z" />
<path d="M61.844 262.15l-.893-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M54.333 253.233l-.893-2.103 2.104-.893.893 2.104z" />
<path d="M54.333 253.233l-.893-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M55.785 256.652l-.894-2.104 2.104-.892.894 2.103z" />
<path d="M55.785 256.652l-.894-2.104 2.104-.892.894 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M57.236 260.07l-.893-2.103 2.104-.893.893 2.104z" />
<path d="M57.236 260.07l-.893-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M58.688 263.49l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M58.688 263.49l-.893-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M51.177 254.573l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M51.177 254.573l-.893-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M52.629 257.991l-.894-2.103 2.104-.893.893 2.104z" />
<path d="M52.629 257.991l-.894-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M54.08 261.41l-.893-2.103 2.104-.893.893 2.103z" />
<path d="M54.08 261.41l-.893-2.103 2.104-.893.893 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M55.532 264.83l-.893-2.105 2.103-.892.894 2.103z" />
<path d="M55.532 264.83l-.893-2.105 2.103-.892.894 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M48.02 255.912l-.892-2.104 2.104-.893.893 2.104z" />
<path d="M48.02 255.912l-.892-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M49.472 259.33l-.893-2.103 2.104-.893.893 2.104z" />
<path d="M49.472 259.33l-.893-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M50.924 262.75l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M50.924 262.75l-.893-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M52.376 266.168l-.894-2.103 2.104-.893.894 2.104z" />
<path d="M52.376 266.168l-.894-2.103 2.104-.893.894 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M68.248 268.46l-.894-2.104 2.104-.893.893 2.104z" />
<path d="M68.248 268.46l-.894-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M69.7 271.878l-.894-2.103 2.104-.893.893 2.104z" />
<path d="M69.7 271.878l-.894-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M71.15 275.297l-.892-2.103 2.103-.893.894 2.103z" />
<path d="M71.15 275.297l-.892-2.103 2.103-.893.894 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M72.602 278.716l-.893-2.104 2.104-.892.893 2.103z" />
<path d="M72.602 278.716l-.893-2.104 2.104-.892.893 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M65.091 269.799l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M65.091 269.799l-.893-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M66.543 273.218l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M66.543 273.218l-.893-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M67.995 276.637l-.894-2.104 2.104-.893.894 2.104z" />
<path d="M67.995 276.637l-.894-2.104 2.104-.893.894 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M69.446 280.055l-.893-2.103 2.104-.893.893 2.104z" />
<path d="M69.446 280.055l-.893-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M61.935 271.138l-.893-2.103 2.104-.893.893 2.103z" />
<path d="M61.935 271.138l-.893-2.103 2.104-.893.893 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M63.387 274.557l-.893-2.104 2.104-.892.893 2.103z" />
<path d="M63.387 274.557l-.893-2.104 2.104-.892.893 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M64.839 277.976l-.894-2.104 2.104-.893.893 2.104z" />
<path d="M64.839 277.976l-.894-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M66.29 281.395l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M66.29 281.395l-.893-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M58.78 272.478l-.894-2.104 2.104-.893.893 2.104z" />
<path d="M58.78 272.478l-.894-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M60.23 275.896l-.892-2.103 2.104-.893.893 2.104z" />
<path d="M60.23 275.896l-.892-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M61.682 279.315l-.893-2.104 2.104-.892.893 2.103z" />
<path d="M61.682 279.315l-.893-2.104 2.104-.892.893 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M63.134 282.734l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M63.134 282.734l-.893-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M55.623 273.817l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M55.623 273.817l-.893-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M57.075 277.236l-.893-2.104 2.103-.893.894 2.104z" />
<path d="M57.075 277.236l-.893-2.104 2.103-.893.894 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M58.526 280.654l-.893-2.103 2.104-.893.893 2.104z" />
<path d="M58.526 280.654l-.893-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M59.978 284.073l-.893-2.103 2.104-.893.893 2.103z" />
<path d="M59.978 284.073l-.893-2.103 2.104-.893.893 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M75.85 286.365l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M75.85 286.365l-.893-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M77.302 289.783l-.894-2.103 2.104-.893.893 2.104z" />
<path d="M77.302 289.783l-.894-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M78.753 293.202l-.893-2.104 2.104-.892.893 2.103z" />
<path d="M78.753 293.202l-.893-2.104 2.104-.892.893 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M80.205 296.621l-.893-2.104 2.103-.893.894 2.104z" />
<path d="M80.205 296.621l-.893-2.104 2.103-.893.894 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M72.694 287.704L71.8 285.6l2.103-.893.894 2.104z" />
<path d="M72.694 287.704L71.8 285.6l2.103-.893.894 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M74.145 291.123l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M74.145 291.123l-.893-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M75.597 294.541l-.893-2.103 2.104-.893.893 2.104z" />
<path d="M75.597 294.541l-.893-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M77.049 297.96l-.894-2.103 2.104-.893.894 2.103z" />
<path d="M77.049 297.96l-.894-2.103 2.104-.893.894 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M69.538 289.043l-.894-2.104 2.104-.892.894 2.103z" />
<path d="M69.538 289.043l-.894-2.104 2.104-.892.894 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M70.99 292.462l-.894-2.104 2.104-.893.893 2.104z" />
<path d="M70.99 292.462l-.894-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M72.44 295.88l-.892-2.103 2.104-.893.893 2.104z" />
<path d="M72.44 295.88l-.892-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M73.893 299.3l-.894-2.104 2.104-.893.893 2.104z" />
<path d="M73.893 299.3l-.894-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M66.382 290.382l-.894-2.103 2.104-.893.893 2.104z" />
<path d="M66.382 290.382l-.894-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M67.833 293.801l-.893-2.103 2.104-.893.893 2.103z" />
<path d="M67.833 293.801l-.893-2.103 2.104-.893.893 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M69.285 297.22l-.893-2.104 2.103-.892.894 2.103z" />
<path d="M69.285 297.22l-.893-2.104 2.103-.892.894 2.103z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M70.736 300.639l-.893-2.104 2.104-.893.893 2.104z" />
<path d="M70.736 300.639l-.893-2.104 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M63.226 291.722l-.894-2.104 2.104-.893.893 2.104z" />
<path d="M62.332 289.618l2.104-.893.893 2.104-2.103.893z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M64.677 295.14l-.893-2.103 2.104-.893.893 2.104z" />
<path d="M64.677 295.14l-.893-2.103 2.104-.893.893 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M66.129 298.56l-.893-2.104 2.103-.893.894 2.104z" />
<path d="M66.129 298.56l-.893-2.104 2.103-.893.894 2.104z" />
<path fill-opacity=".6" fill="#A3B1BF" d="M67.58 301.978l-.893-2.104 2.104-.892.893 2.103z" />
<path d="M67.58 301.978l-.893-2.104 2.104-.892.893 2.103zM20.241 196.26l18.752-7.957-23.674-55.758-18.752 7.958z" />
<path d="M33.004 200.31l-3.406-8.02-1.802.764 3.406 8.021z" />
<path stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" d="M33.004 200.31l-3.406-8.02-1.802.764 3.406 8.021z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M31.628 204.578l3.6-1.528-1.649-3.885-3.6 1.528z" />
<path stroke="#A3B1BF" stroke-width="1.62" fill="#FFF" stroke-linejoin="round" d="M31.628 204.578l3.6-1.528-1.649-3.885-3.6 1.528z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M32.485 184.231l.893 2.104 2.104-.893-.893-2.103z" />
<path d="M32.485 184.231l.893 2.104 2.104-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M31.033 180.813l.893 2.103 2.104-.893-.893-2.103z" />
<path d="M31.033 180.813l.893 2.103 2.104-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M29.581 177.394l.894 2.103 2.104-.892-.894-2.104z" />
<path d="M29.581 177.394l.894 2.103 2.104-.892-.894-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M28.13 173.975l.893 2.104 2.104-.893-.893-2.104z" />
<path d="M28.13 173.975l.893 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M29.329 185.57l.893 2.104 2.104-.892-.893-2.104z" />
<path d="M29.329 185.57l.893 2.104 2.104-.892-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M27.877 182.152l.893 2.104 2.104-.893-.893-2.104z" />
<path d="M27.877 182.152l.893 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M26.425 178.733l.894 2.104 2.104-.893-.894-2.104z" />
<path d="M26.425 178.733l.894 2.104 2.104-.893-.894-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M24.974 175.314l.893 2.104 2.104-.893-.893-2.104z" />
<path d="M24.974 175.314l.893 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M26.173 186.91l.893 2.104 2.104-.893-.894-2.104z" />
<path d="M26.173 186.91l.893 2.104 2.104-.893-.894-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M24.72 183.491l.894 2.104 2.104-.893-.893-2.104z" />
<path d="M24.72 183.491l.894 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M23.27 180.072l.893 2.104 2.103-.893-.893-2.103z" />
<path d="M23.27 180.072l.893 2.104 2.103-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M21.818 176.654l.893 2.103 2.104-.893-.893-2.103z" />
<path d="M21.818 176.654l.893 2.103 2.104-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M23.016 188.25l.894 2.103 2.104-.893-.894-2.104z" />
<path d="M23.016 188.25l.894 2.103 2.104-.893-.894-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M21.565 184.83l.893 2.104 2.104-.893-.893-2.103z" />
<path d="M21.565 184.83l.893 2.104 2.104-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M20.113 181.412l.893 2.103 2.104-.892-.893-2.104z" />
<path d="M20.113 181.412l.893 2.103 2.104-.892-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M18.662 177.993l.893 2.104 2.104-.893-.893-2.104z" />
<path d="M18.662 177.993l.893 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M19.86 189.589l.894 2.103 2.103-.893-.893-2.103z" />
<path d="M19.86 189.589l.894 2.103 2.103-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M18.409 186.17l.893 2.103 2.104-.892-.893-2.104z" />
<path d="M18.409 186.17l.893 2.103 2.104-.892-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M16.957 182.75l.893 2.105 2.104-.893-.893-2.104z" />
<path d="M16.957 182.75l.893 2.105 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M15.505 179.332l.894 2.104 2.104-.893-.894-2.104z" />
<path d="M15.505 179.332l.894 2.104 2.104-.893-.894-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M24.882 166.326l.894 2.104 2.103-.893-.893-2.103z" />
<path d="M24.882 166.326l.894 2.104 2.103-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M23.43 162.908l.894 2.103 2.104-.892-.893-2.104z" />
<path d="M23.43 162.908l.894 2.103 2.104-.892-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M21.98 159.489l.892 2.104 2.104-.893-.893-2.104z" />
<path d="M21.98 159.489l.892 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M20.528 156.07l.893 2.104 2.104-.893-.894-2.104z" />
<path d="M20.528 156.07l.893 2.104 2.104-.893-.894-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M21.726 167.666l.893 2.103 2.104-.892-.893-2.104z" />
<path d="M21.726 167.666l.893 2.103 2.104-.892-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M20.275 164.247l.893 2.104 2.104-.893-.893-2.104z" />
<path d="M20.275 164.247l.893 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M18.823 160.828l.893 2.104 2.104-.893-.893-2.104z" />
<path d="M18.823 160.828l.893 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M17.371 157.41l.894 2.103 2.104-.893-.894-2.103z" />
<path d="M17.371 157.41l.894 2.103 2.104-.893-.894-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M18.57 169.005l.893 2.104 2.104-.893-.893-2.104z" />
<path d="M18.57 169.005l.893 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M17.119 165.586l.893 2.104 2.104-.893-.894-2.104z" />
<path d="M17.119 165.586l.893 2.104 2.104-.893-.894-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M15.667 162.167l.893 2.104 2.104-.893-.893-2.103z" />
<path d="M15.667 162.167l.893 2.104 2.104-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M14.215 158.749l.894 2.103 2.103-.892-.893-2.104z" />
<path d="M14.215 158.749l.894 2.103 2.103-.892-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M15.414 170.344l.893 2.104 2.104-.893-.893-2.103z" />
<path d="M15.414 170.344l.893 2.104 2.104-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M13.963 166.926l.893 2.103 2.104-.893-.894-2.103z" />
<path d="M13.963 166.926l.893 2.103 2.104-.893-.894-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M12.51 163.507l.894 2.103 2.104-.892-.893-2.104z" />
<path d="M12.51 163.507l.894 2.103 2.104-.892-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M11.06 160.088l.892 2.104 2.104-.893-.893-2.104z" />
<path d="M11.06 160.088l.892 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M12.258 171.684l.893 2.103 2.104-.892-.893-2.104z" />
<path d="M12.258 171.684l.893 2.103 2.104-.892-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M10.806 168.265l.894 2.104 2.104-.893-.894-2.104z" />
<path d="M10.806 168.265l.894 2.104 2.104-.893-.894-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M9.355 164.846l.893 2.104 2.104-.893-.893-2.104z" />
<path d="M9.355 164.846l.893 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M7.903 161.427l.893 2.104 2.104-.893-.893-2.104z" />
<path d="M7.903 161.427l.893 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M17.28 148.422l.893 2.103 2.104-.893-.893-2.103z" />
<path d="M17.28 148.422l.893 2.103 2.104-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M15.828 145.003l.894 2.103 2.104-.892-.894-2.104z" />
<path d="M15.828 145.003l.894 2.103 2.104-.892-.894-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M14.377 141.584l.893 2.104 2.104-.893-.893-2.104z" />
<path d="M14.377 141.584l.893 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M12.925 138.165l.893 2.104 2.104-.893-.893-2.104z" />
<path fill="#B2BECA" d="M13.818 140.269l2.104-.893-.893-2.104-2.104.893z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M14.124 149.76l.893 2.105 2.104-.893-.893-2.104z" />
<path d="M14.124 149.76l.893 2.105 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M12.672 146.342l.894 2.104 2.103-.893-.893-2.104z" />
<path d="M12.672 146.342l.894 2.104 2.103-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M11.22 142.923l.894 2.104 2.104-.893-.893-2.104z" />
<path d="M11.22 142.923l.894 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M9.77 139.504l.892 2.104 2.104-.893-.893-2.103z" />
<path d="M9.77 139.504l.892 2.104 2.104-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M10.968 151.1l.893 2.104 2.104-.893-.893-2.104z" />
<path d="M10.968 151.1l.893 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M9.516 147.681l.893 2.104 2.104-.893-.893-2.103z" />
<path d="M9.516 147.681l.893 2.104 2.104-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M8.065 144.262l.893 2.104 2.104-.893-.893-2.103z" />
<path d="M8.065 144.262l.893 2.104 2.104-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M6.613 140.844l.893 2.103 2.104-.892-.893-2.104z" />
<path d="M6.613 140.844l.893 2.103 2.104-.892-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M7.812 152.44l.893 2.103 2.104-.893-.893-2.103z" />
<path d="M7.812 152.44l.893 2.103 2.104-.893-.893-2.103z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M6.36 149.02l.893 2.104 2.104-.892-.893-2.104z" />
<path d="M6.36 149.02l.893 2.104 2.104-.892-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M4.909 145.602l.893 2.104 2.104-.893-.894-2.104z" />
<path d="M4.909 145.602l.893 2.104 2.104-.893-.894-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M3.457 142.183l.893 2.104 2.104-.893-.893-2.104z" />
<path d="M3.457 142.183l.893 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M4.656 153.779l.893 2.103 2.104-.892-.893-2.104z" />
<path d="M4.656 153.779l.893 2.103 2.104-.892-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M3.204 150.36l.893 2.104 2.104-.893-.893-2.104z" />
<path d="M3.204 150.36l.893 2.104 2.104-.893-.893-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M1.752 146.941l.894 2.104 2.104-.893-.894-2.104z" />
<path d="M1.752 146.941l.894 2.104 2.104-.893-.894-2.104z" />
<path fill-opacity=".8" fill="#A3B1BF" d="M.3 143.522l.894 2.104 2.104-.893-.893-2.104z" />
<path d="M.3 143.522l.894 2.104 2.104-.893-.893-2.104z" />
<path d="M108.976 190.44c-1.626-3.83-2.29-7.213-1.482-7.556.808-.343 2.781 2.484 4.408 6.314 1.625 3.83 2.29 7.213 1.481 7.555-.808.343-2.78-2.484-4.407-6.313z" fill="#F5F5F5" />
<path d="M108.976 190.44c-1.626-3.83-2.29-7.213-1.482-7.556.808-.343 2.781 2.484 4.408 6.314 1.625 3.83 2.29 7.213 1.481 7.555-.808.343-2.78-2.484-4.407-6.313z" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" />
<path d="M115.406 187.71c-3.249-7.652-4.575-14.41-2.96-15.096 1.614-.685 5.556 4.964 8.805 12.616 3.25 7.653 4.576 14.412 2.961 15.097-1.614.685-5.556-4.963-8.806-12.617z" fill="#F5F5F5" />
<path d="M115.406 187.71c-3.249-7.652-4.575-14.41-2.96-15.096 1.614-.685 5.556 4.964 8.805 12.616 3.25 7.653 4.576 14.412 2.961 15.097-1.614.685-5.556-4.963-8.806-12.617z" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" />
<path d="M125.79 183.305c-4.355-10.256-6.132-19.314-3.968-20.232 2.163-.918 7.446 6.652 11.8 16.908 4.355 10.255 6.132 19.313 3.969 20.231-2.164.918-7.447-6.652-11.802-16.907z" fill-opacity=".35" fill="#F5F5F5" />
<path d="M125.79 183.305c-4.355-10.256-6.132-19.314-3.968-20.232 2.163-.918 7.446 6.652 11.8 16.908 4.355 10.255 6.132 19.313 3.969 20.231-2.164.918-7.447-6.652-11.802-16.907z" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" />
<path d="M44.715 90.559c-2.536-1.139-4.219-2.494-3.935-3.273.283-.779 2.439-.736 5.11.02 1.131-2.535 2.462-4.223 3.214-3.95.751.274.686 2.422-.077 5.092 2.532 1.138 4.21 2.49 3.927 3.269-.284.78-2.443.736-5.119-.023-1.12 2.473-2.422 4.106-3.162 3.836-.741-.27-.688-2.357.042-4.971z" fill-opacity=".4" fill="#A3B1BF" opacity=".85" />
<path d="M98.776 330.14l-.351.386a2.43 2.43 0 0 1-4.19-1.201l-.092-.512-.474-.214a2.43 2.43 0 0 1-.152-4.356l.458-.246.057-.518a2.43 2.43 0 0 1 4.095-1.49l.377.36.51-.106a2.43 2.43 0 0 1 2.682 3.434l-.225.469.258.451a2.43 2.43 0 0 1-2.437 3.614l-.516-.07zM412.965 121.001a1.523 1.523 0 0 1-2.291-1.487 1.523 1.523 0 0 1 .707-2.639 1.523 1.523 0 0 1 2.728-.143 1.523 1.523 0 0 1 .98 2.55 1.523 1.523 0 0 1-2.123 1.72zM78.26 39.51l-.833.127a2.43 2.43 0 0 1-2.5-3.57l.405-.738-.378-.752a2.43 2.43 0 0 1 2.623-3.48l.827.156.599-.593a2.43 2.43 0 0 1 4.12 1.419l.107.836.748.386a2.43 2.43 0 0 1-.076 4.357l-.76.36-.136.83a2.43 2.43 0 0 1-4.168 1.275l-.578-.614zM376.631 306.744l-.533-.135a2.43 2.43 0 0 1-.906-4.263l.431-.34-.035-.548a2.43 2.43 0 0 1 3.774-2.179l.456.305.511-.204a2.43 2.43 0 0 1 3.239 2.916l-.15.53.352.422a2.43 2.43 0 0 1-1.773 3.981l-.548.022-.293.464a2.43 2.43 0 0 1-4.334-.455l-.19-.516zM420.263 147.294a1.523 1.523 0 0 1-2.496-1.11 1.523 1.523 0 0 1 .285-2.717 1.523 1.523 0 0 1 2.673-.568 1.523 1.523 0 0 1 1.366 2.365 1.523 1.523 0 0 1-1.828 2.03z" fill-opacity=".4" fill="#A3B1BF" />
<path d="M224.622 221.613c32.537 0 58.914-26.37 58.914-58.902 0-32.53-26.377-58.901-58.914-58.901-32.538 0-58.914 26.37-58.914 58.901 0 32.531 26.376 58.902 58.914 58.902z" fill-opacity=".66" fill="#A3B1BF" />
<path d="M225.346 142.06c-4.2 0-7.465 1.282-9.798 3.847-2.333 2.448-3.44 5.712-3.44 9.792h4.606c0-2.856.642-5.07 1.925-6.703 1.4-1.923 3.557-2.856 6.473-2.856 2.45 0 4.374.641 5.716 2.04 1.283 1.282 1.983 3.09 1.983 5.42 0 1.633-.584 3.148-1.75 4.605-.35.466-1.05 1.166-1.983 2.098-3.15 2.798-5.074 5.013-5.89 6.762-.7 1.457-1.05 3.147-1.05 5.07v1.341h4.666v-1.34c0-1.574.35-2.973 1.108-4.255.583-1.05 1.458-2.099 2.74-3.206 2.567-2.273 4.142-3.789 4.725-4.488 1.458-1.924 2.216-4.197 2.216-6.82 0-3.497-1.108-6.236-3.266-8.218-2.275-2.098-5.249-3.089-8.981-3.089zm-.875 35.496c-.992 0-1.808.291-2.508.99-.7.642-.991 1.458-.991 2.449 0 .99.291 1.807.991 2.506.7.641 1.516.991 2.508.991.991 0 1.808-.35 2.508-.99.7-.642 1.05-1.458 1.05-2.507 0-.99-.35-1.807-.992-2.448-.7-.7-1.575-.99-2.566-.99z" fill="#FFF" />
<path d="M203.262 134.14c5.815-3.357 16.37-7.312 13.012-13.126-3.358-5.815-15.708-4.97-21.524-1.613-5.815 3.357-12.02 13.223-8.662 19.037 3.357 5.815 11.358-.941 17.174-4.298M229.679 120.82a4.863 4.863 0 1 0 .001-9.726 4.863 4.863 0 0 0-.001 9.727z" fill="#FAFAFA" />
<path d="M401.5 322.5l1.5 1.5" stroke="#979797" stroke-linecap="square" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 30 KiB

191
src/assets/ic-500.svg

@ -0,0 +1,191 @@
<svg width="422" height="193" viewBox="0 0 422 193" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<path fill-opacity=".25" fill="#A3B1BF" opacity=".9" d="M218.562 13.895v114.572h109.58V13.895z" />
<path stroke="#A3B1BF" stroke-width="1.62" d="M218.562 13.895v114.572h109.58V13.895z" />
<path d="M322.202 12.485c0-4.562 3.747-8.295 8.327-8.295h12.539c4.58 0 8.326 3.733 8.326 8.295v117.488c0 4.562-3.747 8.295-8.326 8.295h-12.54c-4.58 0-8.326-3.733-8.326-8.295V12.485z" fill="#F0F2F5" />
<path d="M322.202 12.485c0-4.562 3.747-8.295 8.327-8.295h12.539c4.58 0 8.326 3.733 8.326 8.295v117.488c0 4.562-3.747 8.295-8.326 8.295h-12.54c-4.58 0-8.326-3.733-8.326-8.295V12.485z" stroke="#A3B1BF" stroke-width="1.62" />
<path d="M343.897 15.047a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49l26.491-16.73 13.386-7.278" />
<path d="M343.957 15.08a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M343.957 24.004a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.827 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M343.957 24.004a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.827 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M343.957 32.927a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.827 0 1.497.668 1.497 1.492s-.67 1.491-1.497 1.491" fill="#FFF" />
<path d="M343.957 32.927a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.827 0 1.497.668 1.497 1.492s-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M343.957 41.851a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.827 0 1.497.668 1.497 1.492 0 .823-.67 1.491-1.497 1.491" fill="#FFF" />
<path d="M343.957 41.851a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.827 0 1.497.668 1.497 1.492 0 .823-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M343.957 50.775a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M343.957 50.775a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M343.957 59.698a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.492 1.497-1.492.827 0 1.497.667 1.497 1.491 0 .824-.67 1.491-1.497 1.491" fill="#FFF" />
<path d="M343.957 59.698a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.492 1.497-1.492.827 0 1.497.667 1.497 1.491 0 .824-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M327.904 13.589c0-.824.67-1.492 1.496-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49a1.494 1.494 0 0 1-1.496-1.49z" fill="#FFF" />
<path d="M329.4 15.08a1.494 1.494 0 0 1-1.496-1.491c0-.824.67-1.492 1.496-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M329.4 24.004a1.494 1.494 0 0 1-1.496-1.491c0-.825.67-1.492 1.496-1.492.827 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M329.4 24.004a1.494 1.494 0 0 1-1.496-1.491c0-.825.67-1.492 1.496-1.492.827 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M329.4 32.927a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.493 1.496-1.493.827 0 1.497.668 1.497 1.492s-.67 1.491-1.497 1.491" fill="#FFF" />
<path d="M329.4 32.927a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.493 1.496-1.493.827 0 1.497.668 1.497 1.492s-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M329.4 41.851a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.493 1.496-1.493.827 0 1.497.668 1.497 1.492 0 .823-.67 1.491-1.497 1.491" fill="#FFF" />
<path d="M329.4 41.851a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.493 1.496-1.493.827 0 1.497.668 1.497 1.492 0 .823-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M329.4 50.775a1.494 1.494 0 0 1-1.496-1.491c0-.824.67-1.492 1.496-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M329.4 50.775a1.494 1.494 0 0 1-1.496-1.491c0-.824.67-1.492 1.496-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M329.4 59.698a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.492 1.496-1.492.827 0 1.497.667 1.497 1.491 0 .824-.67 1.491-1.497 1.491" fill="#FFF" />
<path d="M329.4 59.698a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.492 1.496-1.492.827 0 1.497.667 1.497 1.491 0 .824-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M335.182 17.645c0-.824.67-1.492 1.497-1.492.826 0 1.497.668 1.497 1.492 0 .823-.67 1.491-1.497 1.491a1.494 1.494 0 0 1-1.497-1.49z" fill="#FFF" />
<path d="M336.679 19.136a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.497.668 1.497 1.492 0 .823-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M336.679 28.06a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M336.679 28.06a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M336.679 36.984a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.826 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M336.679 36.984a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.826 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M336.679 45.907a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.497.668 1.497 1.492s-.67 1.491-1.497 1.491" fill="#FFF" />
<path d="M336.679 45.907a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.497.668 1.497 1.492s-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M336.679 54.83a1.494 1.494 0 0 1-1.497-1.49c0-.824.67-1.492 1.497-1.492.826 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M336.679 54.83a1.494 1.494 0 0 1-1.497-1.49c0-.824.67-1.492 1.497-1.492.826 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M336.679 63.755a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.826 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M336.679 63.755a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.826 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M332.747 122.705c0-2.39 1.944-4.326 4.342-4.326 2.399 0 4.343 1.937 4.343 4.326 0 2.388-1.944 4.325-4.343 4.325-2.398 0-4.342-1.937-4.342-4.325z" fill="#A3B1BF" />
<path d="M308.374 114.052a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#F5F5F5" />
<path d="M308.374 114.052a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M294.626 114.052a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#F5F5F5" />
<path d="M294.626 114.052a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M308.374 31.305a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#F5F5F5" />
<path d="M308.374 31.305a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M294.626 31.305a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#F5F5F5" />
<path d="M294.626 31.305a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M251.844 12.485c0-4.562 3.747-8.295 8.327-8.295h12.54c4.579 0 8.326 3.733 8.326 8.295v117.488c0 4.562-3.747 8.295-8.327 8.295h-12.539c-4.58 0-8.327-3.733-8.327-8.295V12.485z" fill="#F0F2F5" />
<path d="M251.844 12.485c0-4.562 3.747-8.295 8.327-8.295h12.54c4.579 0 8.326 3.733 8.326 8.295v117.488c0 4.562-3.747 8.295-8.327 8.295h-12.539c-4.58 0-8.327-3.733-8.327-8.295V12.485z" stroke="#A3B1BF" stroke-width="1.62" />
<path d="M273.6 15.08a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.496.668 1.496 1.492 0 .823-.67 1.49-1.496 1.49" fill="#FFF" />
<path d="M273.6 15.08a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.496.668 1.496 1.492 0 .823-.67 1.49-1.496 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M273.6 24.004a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.826 0 1.496.667 1.496 1.492 0 .823-.67 1.49-1.496 1.49" fill="#FFF" />
<path d="M273.6 24.004a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.826 0 1.496.667 1.496 1.492 0 .823-.67 1.49-1.496 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M273.6 32.927a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.496.668 1.496 1.492s-.67 1.491-1.496 1.491" fill="#FFF" />
<path d="M273.6 32.927a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.496.668 1.496 1.492s-.67 1.491-1.496 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M273.6 41.851a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.496.668 1.496 1.492 0 .823-.67 1.491-1.496 1.491" fill="#FFF" />
<path d="M273.6 41.851a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.496.668 1.496 1.492 0 .823-.67 1.491-1.496 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M273.6 50.775a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.496.668 1.496 1.492 0 .823-.67 1.49-1.496 1.49" fill="#FFF" />
<path d="M273.6 50.775a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.496.668 1.496 1.492 0 .823-.67 1.49-1.496 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M272.103 58.207c0-.824.67-1.491 1.497-1.491.826 0 1.496.667 1.496 1.491 0 .824-.67 1.491-1.496 1.491a1.494 1.494 0 0 1-1.497-1.49z" fill="#FFF" />
<path d="M273.6 59.698a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.492 1.497-1.492.826 0 1.496.667 1.496 1.491 0 .824-.67 1.491-1.496 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M259.043 15.08a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M259.043 15.08a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M259.043 24.004a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.826 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M259.043 24.004a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.826 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M259.043 32.927a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.497.668 1.497 1.492s-.67 1.491-1.497 1.491" fill="#FFF" />
<path d="M259.043 32.927a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.497.668 1.497 1.492s-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M259.043 41.851a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.497.668 1.497 1.492 0 .823-.67 1.491-1.497 1.491" fill="#FFF" />
<path d="M259.043 41.851a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.497.668 1.497 1.492 0 .823-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M259.043 50.775a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M259.043 50.775a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M259.043 59.698a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.492 1.497-1.492.826 0 1.497.667 1.497 1.491 0 .824-.67 1.491-1.497 1.491" fill="#FFF" />
<path d="M259.043 59.698a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.492 1.497-1.492.826 0 1.497.667 1.497 1.491 0 .824-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M266.321 19.136a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.493 1.496-1.493.827 0 1.497.668 1.497 1.492 0 .823-.67 1.491-1.497 1.491" fill="#FFF" />
<path d="M266.321 19.136a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.493 1.496-1.493.827 0 1.497.668 1.497 1.492 0 .823-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M266.321 28.06a1.494 1.494 0 0 1-1.496-1.491c0-.824.67-1.492 1.496-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M266.321 28.06a1.494 1.494 0 0 1-1.496-1.491c0-.824.67-1.492 1.496-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M266.321 36.984a1.494 1.494 0 0 1-1.496-1.491c0-.825.67-1.492 1.496-1.492.827 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M266.321 36.984a1.494 1.494 0 0 1-1.496-1.491c0-.825.67-1.492 1.496-1.492.827 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M266.321 45.907a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.493 1.496-1.493.827 0 1.497.668 1.497 1.492s-.67 1.491-1.497 1.491" fill="#FFF" />
<path d="M266.321 45.907a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.493 1.496-1.493.827 0 1.497.668 1.497 1.492s-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M266.321 54.83a1.494 1.494 0 0 1-1.496-1.49c0-.824.67-1.492 1.496-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M266.321 54.83a1.494 1.494 0 0 1-1.496-1.49c0-.824.67-1.492 1.496-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M266.321 63.755a1.494 1.494 0 0 1-1.496-1.491c0-.825.67-1.492 1.496-1.492.827 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49" fill="#FFF" />
<path d="M266.321 63.755a1.494 1.494 0 0 1-1.496-1.491c0-.825.67-1.492 1.496-1.492.827 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M261.58 122.705c0-2.39 1.945-4.326 4.343-4.326 2.398 0 4.343 1.937 4.343 4.326 0 2.388-1.945 4.325-4.343 4.325-2.398 0-4.342-1.937-4.342-4.325z" fill="#A3B1BF" />
<path d="M216.261 12.485c0-4.562 3.747-8.295 8.327-8.295h12.54c4.579 0 8.326 3.733 8.326 8.295v117.488c0 4.562-3.747 8.295-8.327 8.295h-12.539c-4.58 0-8.327-3.733-8.327-8.295V12.485z" fill="#F0F2F5" />
<path d="M216.261 12.485c0-4.562 3.747-8.295 8.327-8.295h12.54c4.579 0 8.326 3.733 8.326 8.295v117.488c0 4.562-3.747 8.295-8.327 8.295h-12.539c-4.58 0-8.327-3.733-8.327-8.295V12.485z" stroke="#A3B1BF" stroke-width="1.62" />
<path d="M238.017 15.08a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.496.668 1.496 1.492 0 .823-.67 1.49-1.496 1.49" />
<path d="M238.017 15.08a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.496.668 1.496 1.492 0 .823-.67 1.49-1.496 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M238.017 24.004a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.826 0 1.496.667 1.496 1.492 0 .823-.67 1.49-1.496 1.49" />
<path d="M238.017 24.004a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.826 0 1.496.667 1.496 1.492 0 .823-.67 1.49-1.496 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M238.017 32.927a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.496.668 1.496 1.492s-.67 1.491-1.496 1.491" />
<path d="M238.017 32.927a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.496.668 1.496 1.492s-.67 1.491-1.496 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M238.017 41.851a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.496.668 1.496 1.492 0 .823-.67 1.491-1.496 1.491" />
<path d="M238.017 41.851a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.496.668 1.496 1.492 0 .823-.67 1.491-1.496 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M238.017 50.775a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.496.668 1.496 1.492 0 .823-.67 1.49-1.496 1.49" />
<path d="M238.017 50.775a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.496.668 1.496 1.492 0 .823-.67 1.49-1.496 1.49z" stroke-opacity=".85" stroke="#A3B1BF" stroke-width=".81" />
<path d="M238.017 59.698a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.492 1.497-1.492.826 0 1.496.667 1.496 1.491 0 .824-.67 1.491-1.496 1.491" />
<path d="M238.017 59.698a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.492 1.497-1.492.826 0 1.496.667 1.496 1.491 0 .824-.67 1.491-1.496 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M224.269 15.08a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.496.668 1.496 1.492 0 .823-.67 1.49-1.496 1.49" />
<path d="M224.269 15.08a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.496.668 1.496 1.492 0 .823-.67 1.49-1.496 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M224.269 24.004a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.826 0 1.496.667 1.496 1.492 0 .823-.67 1.49-1.496 1.49" />
<path d="M224.269 24.004a1.494 1.494 0 0 1-1.497-1.491c0-.825.67-1.492 1.497-1.492.826 0 1.496.667 1.496 1.492 0 .823-.67 1.49-1.496 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M224.269 32.927a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.496.668 1.496 1.492s-.67 1.491-1.496 1.491" />
<path d="M224.269 32.927a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.496.668 1.496 1.492s-.67 1.491-1.496 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M224.269 41.851a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.496.668 1.496 1.492 0 .823-.67 1.491-1.496 1.491" />
<path d="M224.269 41.851a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.493 1.497-1.493.826 0 1.496.668 1.496 1.492 0 .823-.67 1.491-1.496 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M224.269 50.775a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.496.668 1.496 1.492 0 .823-.67 1.49-1.496 1.49" />
<path d="M224.269 50.775a1.494 1.494 0 0 1-1.497-1.491c0-.824.67-1.492 1.497-1.492.826 0 1.496.668 1.496 1.492 0 .823-.67 1.49-1.496 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M224.269 59.698a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.492 1.497-1.492.826 0 1.496.667 1.496 1.491 0 .824-.67 1.491-1.496 1.491" />
<path d="M224.269 59.698a1.494 1.494 0 0 1-1.497-1.49c0-.825.67-1.492 1.497-1.492.826 0 1.496.667 1.496 1.491 0 .824-.67 1.491-1.496 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M230.738 19.136a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.493 1.496-1.493.827 0 1.497.668 1.497 1.492 0 .823-.67 1.491-1.497 1.491" />
<path d="M230.738 19.136a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.493 1.496-1.493.827 0 1.497.668 1.497 1.492 0 .823-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M230.738 28.06a1.494 1.494 0 0 1-1.496-1.491c0-.824.67-1.492 1.496-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" />
<path d="M230.738 28.06a1.494 1.494 0 0 1-1.496-1.491c0-.824.67-1.492 1.496-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M230.738 36.984a1.494 1.494 0 0 1-1.496-1.491c0-.825.67-1.492 1.496-1.492.827 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49" />
<path d="M230.738 36.984a1.494 1.494 0 0 1-1.496-1.491c0-.825.67-1.492 1.496-1.492.827 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M230.738 45.907a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.493 1.496-1.493.827 0 1.497.668 1.497 1.492s-.67 1.491-1.497 1.491" />
<path d="M230.738 45.907a1.494 1.494 0 0 1-1.496-1.49c0-.825.67-1.493 1.496-1.493.827 0 1.497.668 1.497 1.492s-.67 1.491-1.497 1.491z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M230.738 54.83a1.494 1.494 0 0 1-1.496-1.49c0-.824.67-1.492 1.496-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49" />
<path d="M230.738 54.83a1.494 1.494 0 0 1-1.496-1.49c0-.824.67-1.492 1.496-1.492.827 0 1.497.668 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M230.738 63.755a1.494 1.494 0 0 1-1.496-1.491c0-.825.67-1.492 1.496-1.492.827 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49" />
<path d="M230.738 63.755a1.494 1.494 0 0 1-1.496-1.491c0-.825.67-1.492 1.496-1.492.827 0 1.497.667 1.497 1.492 0 .823-.67 1.49-1.497 1.49z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M231.149 127.03c-2.398 0-4.342-1.937-4.342-4.325 0-2.39 1.944-4.326 4.342-4.326 2.398 0 4.342 1.937 4.342 4.326 0 2.388-1.944 4.325-4.342 4.325v-6.665" fill="#A3B1BF" />
<path d="M153.138 11.025l11.888-3.975c4.342-1.452 9.086.9 10.544 5.224a17757910638.196 17757910638.196 0 0 0 37.532 111.381c1.458 4.326-.902 9.051-5.243 10.503l-11.888 3.975c-4.342 1.451-9.086-.899-10.544-5.225l-37.532-111.38c-1.458-4.325.902-9.051 5.243-10.503z" stroke="#A3B1BF" stroke-width="1.62" />
<path d="M171.093 27.043a1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887 1.498 1.498 0 0 1-1.896-.939z" />
<path d="M171.093 27.043a1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887 1.498 1.498 0 0 1-1.896-.939z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M175.415 36.906a1.498 1.498 0 0 1-1.896-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.896.939 1.49 1.49 0 0 1-.943 1.888" />
<path d="M173.52 35.967a1.489 1.489 0 0 1 .942-1.888 1.498 1.498 0 0 1 1.896.939 1.49 1.49 0 0 1-.943 1.888 1.498 1.498 0 0 1-1.896-.94z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M178.65 45.018a1.498 1.498 0 0 1-1.896-.939 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887" />
<path d="M176.754 44.08a1.489 1.489 0 0 1 .943-1.889 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887 1.498 1.498 0 0 1-1.896-.939z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M181.076 53.942a1.498 1.498 0 0 1-1.896-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887" />
<path d="M181.076 53.942a1.498 1.498 0 0 1-1.896-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M184.31 62.055a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.895.94 1.49 1.49 0 0 1-.943 1.888" />
<path d="M184.31 62.055a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.895.94 1.49 1.49 0 0 1-.943 1.888z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M186.737 70.978a1.498 1.498 0 0 1-1.896-.939 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887" />
<path d="M186.737 70.978a1.498 1.498 0 0 1-1.896-.939 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M169.754 32.85a1.498 1.498 0 0 1-1.896-.94 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.888" />
<path d="M157.069 31.91a1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.895.94 1.49 1.49 0 0 1-.943 1.888 1.498 1.498 0 0 1-1.895-.94z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M172.18 40.962a1.498 1.498 0 0 1-1.896-.94 1.489 1.489 0 0 1 .944-1.887 1.498 1.498 0 0 1 1.895.94 1.49 1.49 0 0 1-.943 1.887" />
<path d="M161.39 40.962a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.895.94 1.49 1.49 0 0 1-.943 1.887z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M175.415 49.886a1.498 1.498 0 0 1-1.896-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.896.939 1.49 1.49 0 0 1-.943 1.888" />
<path d="M164.625 49.886a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.895.939 1.49 1.49 0 0 1-.943 1.888z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M167.328 57.998a1.498 1.498 0 0 1-1.896-.939 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887" />
<path d="M167.328 57.998a1.498 1.498 0 0 1-1.896-.939 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M170.562 66.922a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.895.94 1.49 1.49 0 0 1-.943 1.887" />
<path d="M170.562 66.922a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.895.94 1.49 1.49 0 0 1-.943 1.887z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M173.797 75.035a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.895.94 1.49 1.49 0 0 1-.943 1.888" />
<path d="M173.797 75.035a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.895.94 1.49 1.49 0 0 1-.943 1.888z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M167.328 34.472a1.498 1.498 0 0 1-1.896-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887" />
<path d="M167.328 34.472a1.498 1.498 0 0 1-1.896-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M170.562 43.396a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.895.939 1.49 1.49 0 0 1-.943 1.888" />
<path d="M170.562 43.396a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.895.939 1.49 1.49 0 0 1-.943 1.888z" stroke-opacity=".85" stroke="#A3B1BF" stroke-width=".81" />
<path d="M172.989 51.508a1.498 1.498 0 0 1-1.896-.939 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887" />
<path d="M172.989 51.508a1.498 1.498 0 0 1-1.896-.939 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.887z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M176.223 60.432a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.895.94 1.49 1.49 0 0 1-.943 1.887" />
<path d="M176.223 60.432a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.895.94 1.49 1.49 0 0 1-.943 1.887z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M178.65 68.545a1.498 1.498 0 0 1-1.896-.94 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.888" />
<path d="M178.65 68.545a1.498 1.498 0 0 1-1.896-.94 1.489 1.489 0 0 1 .943-1.888 1.498 1.498 0 0 1 1.896.94 1.49 1.49 0 0 1-.943 1.888z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M181.884 77.468a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.895.94 1.49 1.49 0 0 1-.943 1.887" />
<path d="M181.884 77.468a1.498 1.498 0 0 1-1.895-.94 1.489 1.489 0 0 1 .943-1.887 1.498 1.498 0 0 1 1.895.94 1.49 1.49 0 0 1-.943 1.887z" stroke="#A3B1BF" stroke-width=".81" />
<path d="M198.567 126.807a4.347 4.347 0 0 1-5.5-2.725 4.32 4.32 0 0 1 2.736-5.477 4.346 4.346 0 0 1 5.499 2.724 4.322 4.322 0 0 1-2.735 5.478" fill="#A3B1BF" />
<path stroke="#A3B1BF" stroke-width=".81" d="M193.655 2.255l2.626-1.51 2.626 1.51v3.02l-2.626 1.51-2.626-1.51z" />
<path d="M263.204 183.163l2.626-1.51 2.626 1.51v3.02l-2.626 1.51-2.626-1.51z" />
<path stroke="#A3B1BF" stroke-width=".81" d="M263.204 183.163l2.626-1.51 2.626 1.51v3.02l-2.626 1.51-2.626-1.51zM201.942 33.194l2.626 1.51v3.021l-2.626 1.51-2.626-1.51v-3.02zM205.177 23.46l2.626 1.51v3.02l-2.626 1.51-2.626-1.51v-3.02z" />
<path d="M30.71 140.675H410.8" stroke="#A3B1BF" stroke-width="2.43" />
<path d="M128.737 148.382h281.659s-60.248 47.052-134.245 44.212c-73.996-2.839-98.258-15.008-116.858-21.916-18.6-6.909-55.37-9.722-80.881-4.043-25.511 5.678-48.107-18.253-48.107-18.253h98.432z" fill-opacity=".25" fill="#A3B1BF" />
<g transform="translate(2 66.851)">
<ellipse stroke="#A3B1BF" stroke-width="2.43" fill-opacity=".25" fill="#A3B1BF" cx="35.583" cy="35.695" rx="35.583" ry="35.695" />
<ellipse fill="#F0F2F5" cx="35.853" cy="35.965" rx="30.461" ry="30.557" />
</g>
<path d="M41.627 98.896l38.817 11.357M67.91 131.751l-33.157-25.149" stroke="#A3B1BF" stroke-width=".81" />
<g fill="#A3B1BF">
<path d="M70.31 119.831c-1.096 3.183.447 6.611 3.44 7.642 2.993 1.03 6.32-.721 7.416-3.904s-.448-6.61-3.44-7.641c-2.994-1.03-6.32.72-7.416 3.903m-2.422-.834c1.585-4.602 6.396-7.135 10.724-5.645 4.329 1.49 6.56 6.449 4.976 11.05-1.585 4.604-6.396 7.136-10.725 5.646-4.328-1.49-6.56-6.448-4.975-11.05l12.93 5.459" fill-opacity=".4" />
<path d="M65.796 118.038c-1.93 5.602.787 11.636 6.056 13.45 5.268 1.815 11.124-1.268 13.053-6.87 1.93-5.603-.787-11.637-6.056-13.451-5.268-1.814-11.124 1.268-13.053 6.87m-2.422-.833c2.418-7.023 9.758-10.887 16.362-8.613 6.604 2.274 10.01 9.838 7.592 16.86-2.419 7.024-9.76 10.887-16.363 8.613-6.604-2.273-10.01-9.837-7.591-16.86M33.648 100.545c-.872 2.53.293 5.235 2.597 6.028 2.303.793 4.886-.62 5.758-3.151.871-2.53-.294-5.235-2.598-6.028-2.303-.793-4.886.62-5.757 3.15m-1.06-.364c1.093-3.172 4.33-4.944 7.218-3.95 2.887.995 4.348 4.384 3.256 7.556-1.092 3.173-4.33 4.944-7.218 3.95-2.887-.994-4.348-4.384-3.255-7.556" />
<path d="M40.45 102.82l40.58-25.097 47.72 11.062-55.428 28.205.495 1.142L40.45 102.82zm-4.505 1.928l37.263 17.098c.812.289 1.543.052 2.004-.498l1.153 2.656 55.493-28.238 1.764 40.685c.046 1.059.702 1.913 1.597 2.22.294.102.614.144.948.116 1.344-.118 2.384-1.354 2.323-2.76l-2.803-64.639 3.695 1.273-2.395 6.957c-.272.79.11 1.638.853 1.894l13.86 4.773c.364.125.768.088 1.117-.103l9.903-5.416a4.23 4.23 0 0 1 .486 2.775c-.336 2.046-2.286 5.3-9.671 9.188a1.581 1.581 0 0 0-.697 2.024c.166.37.463.629.807.747.344.119.737.098 1.096-.092 6.875-3.619 10.677-7.5 11.3-11.538.576-3.723-1.807-6.042-1.909-6.139a1.364 1.364 0 0 0-1.61-.197l-10.406 5.692-11.945-4.113 1.903-5.526 1.704.587c1.264.435 2.663-.301 3.125-1.645.463-1.343-.186-2.785-1.45-3.22l-11.528-3.97c-.766-.263-1.62-.102-2.278.43a2.71 2.71 0 0 0-.993 2.216l.767 17.692L83.325 74.53 85.42 62.11c.074-.995-.633-1.835-1.582-1.874-.947-.04-1.774.736-1.847 1.732l-2.09 12.333-44.048 27.242a1.905 1.905 0 0 0-.888 1.669c.019.676.397 1.268.98 1.536z" />
</g>
<path d="M122.093 124.044s-2.83 0-2.83 1.217 10.917 10.14 10.917 10.14l-8.087-11.357zM148.376 124.044s2.83 0 2.83 1.217-10.917 10.14-10.917 10.14l8.087-11.357zM116.922 128.687s-2.624 1.06-2.168 2.189c.455 1.128 13.92 5.312 13.92 5.312l-11.752-7.5zM152.029 129.517s2.624 1.063 2.17 2.191c-.455 1.129-13.91 5.3-13.91 5.3l11.74-7.491z" fill="#A3B1BF" />
<path d="M76.4 50.627c-1.426-.358-6.03-1.67-6.469.81-.356 2.015 2.58 8.016 5.661 8.924 6.874 2.029 14.557-.81 21.43 1.217 6.875 2.028 6.478-1.615 5.258-2.839-2.427-2.434-22.644-7.301-25.88-8.112z" stroke="#A3B1BF" stroke-width="2.43" />
<g transform="translate(348.684 67.257)">
<ellipse stroke="#A3B1BF" stroke-width="2.43" fill="#DCE1E7" cx="35.583" cy="35.695" rx="35.583" ry="35.695" />
<ellipse fill="#F0F2F5" cx="35.853" cy="35.965" rx="30.461" ry="30.557" />
</g>
<path d="M366.901 84.293c-1.334.748-2.97 2.594-4.488 6.146-4.852 11.358-3.639 21.498-3.639 21.498s1.617-19.47 8.087-23.12M402.135 122.483c1.334-.748 2.97-2.594 4.487-6.146 4.853-11.357 3.64-21.498 3.64-21.498s-1.618 19.47-8.087 23.12" fill="#A3B1BF" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 32 KiB

24
src/assets/logo.svg

@ -0,0 +1,24 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="280" height="280" viewBox="-18.75 0 280 280">
<defs xmlns="http://www.w3.org/2000/svg">
<linearGradient x1="60%" y1="0%" x2="50%" y2="120%" id="linearGradient-1">
<stop stop-color="#29CDFF" offset="0%"/>
<stop stop-color="#148EFF" offset="60%"/>
<stop stop-color="#0A60FF" offset="100%"/>
</linearGradient>
<linearGradient x1="20%" y1="0%" x2="100%" y2="80%" id="linearGradient-2">
<stop stop-color="#4285EB" offset="0%"/>
<stop stop-color="#2EC7FF" offset="100%"/>
</linearGradient>
<linearGradient x1="120%" y1="60%" x2="20%" y2="40%" id="linearGradient-3">
<stop stop-color="#FA816E" offset="0%"/>
<stop stop-color="#F74A5C" offset="60%"/>
<stop stop-color="#F51D2C" offset="100%"/>
</linearGradient>
</defs>
<path d="M173.2050808 170 L121.2435565 200 L69.2820323 170 L69.2820323 110 L121.2435565 80 L155.8845727 100 L103.9230485 130 L103.9230485 150 L121.2435565 160 L173.2050808 130 Z"
fill="url(#linearGradient-3)"/>
<path d="M121.2435565 0 L242.4871131 70 L242.4871131 130 L173.2050808 170 L173.2050808 130 L207.8460969 110 L207.8460969 90 L121.2435565 40 Z"
fill="url(#linearGradient-2)"/>
<path d="M242.4871131 210 L121.2435565 280 L0 210 L0 70 L121.2435565 0 L181.8653348 35 Q 155.5544457 23.5 121.2435565 40 L34.64101615 90 L34.64101615 190 L121.2435565 240 L242.4871131 170 Z"
fill="url(#linearGradient-1)"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

259
src/components/TinymceEditor/index.vue

@ -0,0 +1,259 @@
<!-- tinymce富文本编辑器组件 license by http://eleadmin.com -->
<template>
<editor
:init="config"
:disabled="disabled"
:value="value"
@input="updateValue"/>
</template>
<script>
import tinymce from 'tinymce/tinymce';
import 'tinymce/icons/default';
import 'tinymce/themes/silver';
import 'tinymce/plugins/code';
import 'tinymce/plugins/print';
import 'tinymce/plugins/preview';
import 'tinymce/plugins/fullscreen';
import 'tinymce/plugins/paste';
import 'tinymce/plugins/searchreplace';
import 'tinymce/plugins/save';
import 'tinymce/plugins/autosave';
import 'tinymce/plugins/link';
import 'tinymce/plugins/autolink';
import 'tinymce/plugins/image';
import 'tinymce/plugins/imagetools';
import 'tinymce/plugins/media';
import 'tinymce/plugins/table';
import 'tinymce/plugins/codesample';
import 'tinymce/plugins/lists';
import 'tinymce/plugins/advlist';
import 'tinymce/plugins/hr';
import 'tinymce/plugins/charmap';
import 'tinymce/plugins/emoticons';
import 'tinymce/plugins/anchor';
import 'tinymce/plugins/directionality';
import 'tinymce/plugins/pagebreak';
import 'tinymce/plugins/quickbars';
import 'tinymce/plugins/nonbreaking';
import 'tinymce/plugins/visualblocks';
import 'tinymce/plugins/visualchars';
import 'tinymce/plugins/wordcount';
import 'tinymce/plugins/emoticons/js/emojis';
import Editor from '@tinymce/tinymce-vue';
//
const defaultConfig = {
height: 300,
branding: false,
skin_url: '/tinymce/skins/ui/oxide',
content_css: '/tinymce/skins/content/default/content.min.css',
language_url: '/tinymce/langs/zh_CN.js',
language: 'zh_CN',
plugins: [
'code',
'print',
'preview',
'fullscreen',
'paste',
'searchreplace',
'save',
'autosave',
'link',
'autolink',
'image',
'imagetools',
'media',
'table',
'codesample',
'lists',
'advlist',
'hr',
'charmap',
'emoticons',
'anchor',
'directionality',
'pagebreak',
'quickbars',
'nonbreaking',
'visualblocks',
'visualchars',
'wordcount'
].join(' '),
toolbar: [
'fullscreen',
'preview',
'code',
'|',
'undo',
'redo',
'|',
'forecolor',
'backcolor',
'|',
'bold',
'italic',
'underline',
'strikethrough',
'|',
'alignleft',
'aligncenter',
'alignright',
'alignjustify',
'|',
'outdent',
'indent',
'|',
'numlist',
'bullist',
'|',
'formatselect',
'fontselect',
'fontsizeselect',
'|',
'link',
'image',
'media',
'emoticons',
'charmap',
'anchor',
'pagebreak',
'codesample',
'|',
'ltr',
'rtl'
].join(' '),
toolbar_drawer: 'sliding',
images_upload_handler: (blobInfo, success) => {
success('data:image/jpeg;base64,' + blobInfo.base64());
},
file_picker_types: 'media',
file_picker_callback: () => {
}
};
export default {
name: 'TinymceEditor',
components: {Editor},
model: {
prop: 'value',
event: 'change'
},
props: {
//
value: String,
//
init: Object,
//
disabled: Boolean,
//
autoTheme: {
type: Boolean,
default: true
}
},
data() {
let theme;
if (this.autoTheme) {
const darkMode = this.$store.state.theme.darkMode;
theme = {
skin_url: darkMode ? '/tinymce/skins/ui/oxide-dark' : '/tinymce/skins/ui/oxide',
content_css: darkMode ? '/tinymce/skins/content/dark/content.min.css' : '/tinymce/skins/content/default/content.min.css'
}
}
let config = Object.assign({}, defaultConfig, this.init, theme);
return {
//
config: config
};
},
computed: {
//
darkMode() {
try {
return this.$store.state.theme.darkMode;
} catch (e) {
return null;
}
}
},
mounted() {
tinymce.init({});
},
methods: {
/* 更新value */
updateValue(value) {
this.$emit('change', value);
},
/* 切换编辑器主题 */
changeTheme(darkMode) {
document.head.querySelectorAll('[id^="mce-"]').forEach(elem => {
let href = elem.getAttribute('href');
if (href.indexOf('/oxide-dark/') !== -1) {
if (!darkMode) {
href = href.replace('/oxide-dark/', '/oxide/');
elem.setAttribute('href', href);
}
} else {
if (darkMode) {
href = href.replace('/oxide/', '/oxide-dark/');
elem.setAttribute('href', href);
}
}
});
this.changeContentTheme(darkMode);
},
/* 切换编辑器内容区的主题 */
changeContentTheme(darkMode) {
document.body.querySelectorAll('iframe[id^="tiny-vue_"]').forEach(frame => {
const win = frame.contentWindow;
if (win) {
const doc = win.document;
if (doc) {
doc.head.querySelectorAll('[id^="mce-"]').forEach(elem => {
let href = elem.getAttribute('href');
if (href.indexOf('/skins/ui/') !== -1) {
if (href.indexOf('/oxide-dark/') !== -1) {
if (!darkMode) {
href = href.replace('/oxide-dark/', '/oxide/');
elem.setAttribute('href', href);
}
} else {
if (darkMode) {
href = href.replace('/oxide/', '/oxide-dark/');
elem.setAttribute('href', href);
}
}
} else if (href.indexOf('/skins/content/') !== -1) {
if (href.indexOf('/dark/') !== -1) {
if (!darkMode) {
href = href.replace('/dark/', '/default/');
elem.setAttribute('href', href);
}
} else {
if (darkMode) {
href = href.replace('/default/', '/dark/');
elem.setAttribute('href', href);
}
}
}
});
}
}
});
}
},
watch: {
darkMode() {
if (this.autoTheme) {
this.changeTheme(this.darkMode);
}
}
}
}
</script>
<style>
body .tox-tinymce-aux {
z-index: 19892000;
}
</style>

79
src/config/axios-config.js

@ -0,0 +1,79 @@
/**
* axios配置
*/
import Vue from 'vue';
import VueAxios from 'vue-axios';
import axios from 'axios';
import store from '../store';
import router from '../router';
import setting from './setting';
import {MessageBox} from 'element-ui';
Vue.use(VueAxios, axios);
// 设置统一的url
axios.defaults.baseURL = process.env.VUE_APP_API_BASE_URL;
/* 请求拦截器 */
axios.interceptors.request.use((config) => {
// 添加token到header
let token = setting.takeToken();
if (token) {
config.headers[setting.tokenHeaderName] = token;
}
return config;
}, function (error) {
return Promise.reject(error);
});
/* 响应拦截器 */
axios.interceptors.response.use((res) => {
// 登录过期处理
if (res.data.code === 40512) {
if (res.config.url === setting.menuUrl) {
goLogin();
} else {
MessageBox.alert('登录状态已过期, 请退出重新登录!', '系统提示', {
confirmButtonText: '重新登录',
callback: (action) => {
if (action === 'confirm') {
goLogin();
}
},
beforeClose: () => {
MessageBox.close();
}
});
}
return Promise.reject(new Error(res.data.msg));
}
// token自动续期
let access_token = res.headers[setting.tokenHeaderName];
if (access_token) {
setting.cacheToken(access_token);
}
return res;
}, (error) => {
return Promise.reject(error);
});
/**
* 跳转到登录页面
*/
function goLogin() {
store.dispatch('user/removeToken').then(() => {
const current = router.currentRoute;
if (current && current.path && current.path !== '/') {
router.push({
path: '/login',
query: {
form: current.path
}
}).then(() => {
});
} else {
router.push('/login').then(() => {
});
}
});
}

134
src/config/setting.js

@ -0,0 +1,134 @@
/**
* 项目统一配置
*/
export default {
// 路由白名单(不需要登录的)
whiteList: ['/login', '/forget'],
// 不显示全局页脚的路由地址
hideFooters: ['/system/dictionary', '/system/organization'],
// 需要缓存的组件名称
keepAliveList: [],
// 菜单数据接口
menuUrl: '/manager/permissMenu',
// 自定义解析接口菜单数据
parseMenu: null,
// 自定义解析接口菜单每一个数据格式
parseMenuItem: (item) => {
if (!item) {
return;
}
item.menuId = item.id;
item.title = item.name;
item.parentId = item.parent_id;
item.menuType = item.menu_type;
return item;
},
// 直接指定菜单数据
menus: null,
// 用户信息接口
userUrl: '/manager/readPersional',
uploadImageUrl:'http://api.static.ahbmz.com/api/upload',
// 自定义解析接口用户信息
parseUser(res) {
// 这里code和msg字段如果不一样可在这里修改
let result = {code: res.code, msg: res.msg};
if (res.data) {
// 这里只需要姓名和头像两个字段,如需缓存其它字段可在这里添加
result.data = {
nickname: res.data.truename,
avatar: res.data.avatar
};
// 下面是获取角色和权限列表,需要string数组类型
if (res.data.roles) {
result.data.roles = res.data.roles.map(d => d.role_code);
}
if (res.data.authorities) {
result.data.authorities = res.data.authorities.map(d => d.authority);
}
}
return result;
},
// token传递的header名称
tokenHeaderName: 'Token',
// token存储的名称
tokenStoreName: 'access_token',
// 获取缓存的token
takeToken() {
let token = localStorage.getItem(this.tokenStoreName);
if (!token) {
token = sessionStorage.getItem(this.tokenStoreName);
}
return token;
},
// 缓存token
cacheToken(token, remember) {
localStorage.removeItem(this.tokenStoreName);
sessionStorage.removeItem(this.tokenStoreName);
if (token) {
if (remember) {
localStorage.setItem(this.tokenStoreName, token);
} else {
sessionStorage.setItem(this.tokenStoreName, token);
}
}
},
// 用户信息存储的名称
userStoreName: 'user',
// 获取缓存的用户信息
takeUser() {
try {
return JSON.parse(localStorage.getItem(this.userStoreName)) || {};
} catch (e) {
console.error(e);
}
return {};
},
// 缓存用户信息
cacheUser(user) {
if (user) {
localStorage.setItem(this.userStoreName, JSON.stringify(user));
} else {
localStorage.removeItem(this.userStoreName);
}
},
// 主题配置存储的名称
themeStoreName: 'theme',
// 首页tab显示标题, null会根据菜单自动获取
homeTitle: '主页',
// 首页路径, null会自动获取
homePath: null,
// 顶栏是否显示主题设置按钮
showSetting: true,
// 侧边栏风格: 0亮色, 1暗色
sideStyle: 0,
// 顶栏风格: 0亮色, 1暗色, 2主色
headStyle: 2,
// 标签页风格: 0默认, 1圆点, 2卡片
tabStyle: 0,
// 布局风格: 0默认, 1顶部菜单风格, 2混合菜单风格
layoutStyle: 0,
// 是否固定侧栏
fixedSidebar: true,
// 是否固定顶栏
fixedHeader: false,
// 是否固定主体
fixedBody: true,
// logo是否自适应宽度
logoAutoSize: true,
// 内容区域宽度是否铺满
bodyFull: true,
// 是否开启多标签
showTabs: true,
// 侧栏是否多彩图标
colorfulIcon: true,
// 侧边栏是否只保持一个子菜单展开
sideUniqueOpen: true,
// 是否开启页脚
showFooter: true,
// 是否是色弱模式
weakMode: false,
// 是否是暗黑模式
darkMode: false,
// 默认主题色
color: null
}

BIN
src/fonts/element-icons.ttf

Binary file not shown.

BIN
src/fonts/element-icons.woff

Binary file not shown.

33
src/layout/footer.vue

@ -0,0 +1,33 @@
<!-- 页脚 -->
<template>
<div class="ele-text-center" style="padding: 16px 0;">
<div>
<a
class="ele-text-secondary"
href="https://eleadmin.com"
target="_blank">官网
</a>
<em/>
<a
class="ele-text-secondary"
href="https://eleadmin.com/doc/eleadmin/"
target="_blank">文档
</a>
<em/>
<a
class="ele-text-secondary"
href="https://eleadmin.com/goods/8"
target="_blank">授权
</a>
</div>
<div class="ele-text-secondary" style="margin-top: 8px;">
Copyright © 2021 武汉易云智科技有限公司
</div>
</div>
</template>
<script>
export default {
name: 'EleFooter'
}
</script>

111
src/layout/header-right.vue

@ -0,0 +1,111 @@
<!-- 顶栏右侧区域按钮 -->
<template>
<div class="ele-admin-header-tool">
<div
class="ele-admin-header-tool-item"
@click="toggleFullscreen">
<i :class="isFullscreen?'el-icon-_screen-restore':'el-icon-_screen-full'"></i>
</div>
<!-- 消息通知 -->
<div class="ele-admin-header-tool-item">
<ele-notice/>
</div>
<!-- 用户信息 -->
<div class="ele-admin-header-tool-item">
<el-dropdown @command="onUserDropClick">
<div class="ele-admin-header-avatar">
<el-avatar :src="loginUser.avatar"/>
<span>{{ loginUser.nickname }}</span>
<i class="el-icon-arrow-down"></i>
</div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
command="user"
icon="el-icon-user">个人中心
</el-dropdown-item>
<el-dropdown-item
command="password"
icon="el-icon-key">修改密码
</el-dropdown-item>
<el-dropdown-item
command="logout"
icon="el-icon-switch-button"
divided>退出登录
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<!-- 主题设置 -->
<div
class="ele-admin-header-tool-item"
v-if="showSetting"
@click="openSetting">
<i class="el-icon-_more"></i>
</div>
</div>
</template>
<script>
import EleNotice from './notice';
export default {
name: 'EleHeaderRight',
components: {EleNotice},
props: {
//
showSetting: {
type: Boolean,
default: true
}
},
computed: {
//
loginUser() {
return this.$store.state.user.user;
}
},
data() {
return {
//
isFullscreen: false
};
},
methods: {
/* 个人信息下拉菜单点击 */
onUserDropClick(command) {
if (command === 'user') {
if (this.$route.fullPath !== '/user/info') {
this.$router.push('/user/info');
}
} else if (command === 'password') {
this.$emit('item-click', 'password');
} else if (command === 'logout') {
// 退
this.$confirm(
'确定要退出登录吗?',
'提示',
{type: 'warning'}
).then(() => {
// token
this.$store.dispatch('user/setToken').then(() => {
location.replace('/');
});
}).catch(() => {
});
}
},
/* 打开设置抽屉 */
openSetting() {
this.$emit('item-click', 'setting');
},
/* 全屏切换 */
toggleFullscreen() {
try {
this.isFullscreen = this.$util.toggleFullscreen();
} catch (e) {
this.$message.error('您的浏览器不支持全屏模式');
}
}
}
}
</script>

189
src/layout/index.vue

@ -0,0 +1,189 @@
<template>
<ele-pro-layout
:collapse="theme.collapse"
:fixed-header="theme.fixedHeader"
:fixed-sidebar="theme.fixedSidebar"
:fixed-body="theme.fixedBody"
:layout-style="theme.layoutStyle"
:head-style="theme.headStyle"
:side-style="theme.sideStyle"
:logo-auto-size="theme.logoAutoSize"
:colorful-icon="theme.colorfulIcon"
:side-unique-open="theme.sideUniqueOpen"
:show-tabs="theme.showTabs"
:tab-style="theme.tabStyle"
:body-full="theme.bodyFull"
:keep-alive-list="keepAliveList"
:home-title="homeTitle"
:project-name="projectName"
:tabs="user.tabs"
:menus="user.menus"
:need-setting="needSetting"
:show-setting.sync="showSetting"
:color="theme.color"
:dark-mode="theme.darkMode"
:weak-mode="theme.weakMode"
:show-content="showContent"
@update-collapse="updateCollapse"
@update-screen="updateScreen"
@tab-add="tabAdd"
@tab-remove="tabRemove"
@tab-remove-left="tabRemoveLeft"
@tab-remove-right="tabRemoveRight"
@tab-remove-other="tabRemoveOther"
@tab-remove-all="tabRemoveAll"
@change-color="changeColor"
@change-style="changeStyle">
<!-- logo图标 -->
<template slot="logo">
<img src="@/assets/logo.svg" alt="logo"/>
</template>
<!-- 顶栏右侧区域 -->
<template slot="right">
<ele-header-right
:show-setting="needSetting"
@item-click="onItemClick"/>
</template>
<!-- 修改密码弹窗 -->
<ele-password :visible.sync="showPassword"/>
</ele-pro-layout>
</template>
<script>
import {mapGetters} from 'vuex';
import setting from '@/config/setting';
import EleHeaderRight from './header-right';
import ElePassword from './password';
export default {
name: 'EleLayout',
components: {
EleHeaderRight,
ElePassword
},
computed: {
//
homeTitle() {
return setting.homeTitle;
},
//
keepAliveList() {
return setting.keepAliveList;
},
//
needSetting() {
return setting.showSetting;
},
...mapGetters(['theme', 'user'])
},
data() {
return {
//
projectName: process.env.VUE_APP_NAME,
//
showPassword: false,
//
showSetting: false,
// , , false,
showContent: true
};
},
mounted() {
//
this.getUserInfo();
},
methods: {
/* 获取当前用户信息 */
getUserInfo() {
if (setting.userUrl) {
this.$http.get(setting.userUrl).then(res => {
let result;
if (setting.parseUser) {
result = setting.parseUser(res.data);
} else {
result = res.data;
}
if (res.data.code === 0) {
const user = result.data;
this.$store.dispatch('user/setUser', user);
this.$store.dispatch('user/setRoles', user ? user.roles : null);
this.$store.dispatch('user/setAuthorities', user ? user.authorities : null);
} else {
this.$message.error(res.data.msg);
}
// ,
this.showContent = true;
}).catch(e => {
this.showContent = true;
this.$message.error(e.message);
});
}
},
/* 顶栏右侧点击 */
onItemClick(key) {
if (key === 'password') {
this.showPassword = true;
} else if (key === 'setting') {
this.showSetting = true;
}
},
/* 更新collapse */
updateCollapse(value) {
this.$store.dispatch('theme/set', {
key: 'collapse',
value: value
});
},
/* 更新屏幕尺寸 */
updateScreen() {
this.$store.dispatch('theme/updateScreen');
},
/* 切换主题色 */
changeColor(value) {
const loading = this.$loading({
lock: true,
background: 'transparent'
});
this.$store.dispatch('theme/setColor', value).then(() => {
loading.close();
}).catch(e => {
loading.close();
console.error(e);
this.$message.error('主题加载失败');
});
},
/* 切换主题风格 */
changeStyle(value) {
this.$store.dispatch('theme/set', value);
},
/* 添加tab */
tabAdd(value) {
this.$store.dispatch('user/tabAdd', value);
},
/* 移除tab */
tabRemove(obj) {
this.$store.dispatch('user/tabRemove', obj.name).then(last => {
if (obj.active === obj.name) {
this.$router.push(last === -1 ? '/' : this.user.tabs[last].path);
}
});
},
/* 移除左边tab */
tabRemoveLeft(value) {
this.$store.dispatch('user/tabRemoveLeft', value);
},
/* 移除右边tab */
tabRemoveRight(value) {
this.$store.dispatch('user/tabRemoveRight', value);
},
/* 移除其它tab */
tabRemoveOther(value) {
this.$store.dispatch('user/tabRemoveOther', value);
},
/* 移除全部tab */
tabRemoveAll() {
this.$store.dispatch('user/tabRemoveAll');
}
}
}
</script>

300
src/layout/notice.vue

@ -0,0 +1,300 @@
<!-- 顶栏消息图标 -->
<template>
<el-popover
width="300"
v-model="visible"
trigger="click"
popper-class="ele-notice-pop"
transition="el-zoom-in-top"
class="ele-notice-group">
<div
class="ele-notice-group"
slot="reference">
<el-badge
:value="allNum"
:hidden="!allNum">
<i class="el-icon-bell"></i>
</el-badge>
</div>
<el-tabs
v-model="active"
class="user-info-tabs">
<el-tab-pane
:label="noticeLabel"
name="notice">
<div class="ele-notice-list ele-scrollbar-mini">
<div
v-for="(item,index) in notice"
:key="index"
class="ele-notice-item">
<div class="ele-cell ele-notice-item-wrapper">
<i :class="[item.icon,'ele-notice-item-icon']"></i>
<div class="ele-cell-content">
<div class="ele-elip">{{ item.title }}</div>
<div class="ele-text-secondary ele-elip">{{ item.pub_time }}</div>
</div>
</div>
<el-divider/>
</div>
</div>
<div
v-if="notice.length"
class="ele-cell ele-notice-actions">
<!-- <div-->
<!-- @click="clear(1)"-->
<!-- class="ele-cell-content">清空通知-->
<!-- </div>-->
<el-divider
direction="vertical"
class="line-color-light"/>
<div
@click="more(1)"
class="ele-cell-content">查看更多
</div>
</div>
<ele-empty
v-if="!notice.length"
text="你已查看所有通知"/>
</el-tab-pane>
<el-tab-pane
:label="messageLabel"
name="message">
<div class="ele-notice-list ele-scrollbar-mini">
<div
v-for="(item,index) in message"
:key="index"
class="ele-notice-item">
<div class="ele-cell ele-notice-item-wrapper ele-cell-align-top">
<el-avatar
:src="item.avatar_str"
size="medium"/>
<div class="ele-cell-content">
<div class="ele-elip">{{ item.title }}</div>
<div class="ele-text-secondary ele-elip">{{ item.content }}</div>
<div class="ele-cell-desc ele-elip">{{ item.pub_time }}</div>
</div>
</div>
<el-divider/>
</div>
</div>
<div
v-if="message.length"
class="ele-cell ele-notice-actions">
<!-- <div-->
<!-- @click="clear(2)"-->
<!-- class="ele-cell-content">清空消息-->
<!-- </div>-->
<el-divider
direction="vertical"
class="line-color-light"/>
<div
@click="more(2)"
class="ele-cell-content">查看更多
</div>
</div>
<ele-empty
v-if="!message.length"
text="你已读完所有私信"/>
</el-tab-pane>
</el-tabs>
</el-popover>
</template>
<script>
export default {
name: 'EleNotice',
data() {
return {
visible: false,
active: 'notice',
notice: [
],
notice_count:0,
message: [
],
message_count:0,
};
},
computed: {
//
noticeLabel() {
if (this.notice_count) {
return `通知(${this.notice_count})`;
}
return '通知';
},
//
messageLabel() {
if (this.message_count) {
return `私信(${this.message_count})`;
}
return '私信';
},
//
allNum() {
return this.notice_count + this.message_count ;
}
},
mounted() {
//
this.getMessage();
setInterval(this.setM,60000)
},
methods: {
setM(){
this.setMessage();
this.getMessage();
},
getMessage(){
this.$http.get('/manager/getMessage?type=99').then(res => {
if (res.data.code === 0) {
this.message = res.data.data.sx.list;
this.notice = res.data.data.gg.list;
this.message_count = res.data.data.sx.count;
this.notice_count = res.data.data.gg.count;
}
})
},
setMessage(){
this.$http.get('/manager/setMessage?type=99').then(res => {
if (res.data.code === 0) {
this.message = res.data.data.sx.list;
this.notice = res.data.data.gg.list;
this.message_count = res.data.data.sx.count;
this.notice_count = res.data.data.gg.count;
}
})
},
/* 清空消息 */
clear(type) {
if (type === 1) {
this.notice = [];
} else if (type === 2) {
this.message = [];
}
},
/* 查看更多 */
more(type) {
console.log(type);
if (this.$route.path !== '/user/message') {
this.$router.push('/user/message');
}
this.show = false;
}
}
}
</script>
<style lang="scss">
.ele-notice-group {
vertical-align: top !important;
display: inline-block;
.el-badge {
line-height: normal;
}
}
/* 消息通知pop */
.ele-notice-pop {
margin: 0 !important;
padding: 0 !important;
/* tab */
.el-tabs__nav-scroll {
text-align: center;
}
.el-tabs__nav {
float: none;
display: inline-block;
}
.el-tabs__item {
padding: 0 20px;
}
/* 空视图 */
.ele-empty {
padding: 100px 0;
}
}
/* 列表 */
.ele-notice-list {
padding-top: 8px;
max-height: 360px;
overflow: auto;
}
.ele-notice-item {
.ele-notice-item-wrapper {
padding: 12px 15px;
transition: background-color .2s;
cursor: pointer;
&:hover {
background-color: hsla(0, 0%, 60%, .05);
}
}
.ele-text-secondary {
margin-top: 5px;
font-size: 13px;
}
.ele-cell-desc {
margin-top: 3px !important;
font-size: 12px !important;
}
}
.ele-notice-item-icon {
width: 32px;
height: 32px;
line-height: 32px !important;
color: #FFF;
font-size: 16px;
background-color: #60B2FC;
border-radius: 50%;
text-align: center;
&.el-icon-s-check {
background-color: #F5686F;
}
&.el-icon-video-camera {
background-color: #7CD734;
}
&.el-icon-s-claim {
background-color: #FAAD14;
}
&.el-icon-message-solid {
background-color: #2BCACD;
}
}
/* 操作按钮 */
.ele-notice-actions > .ele-cell-content {
line-height: 42px;
text-align: center;
cursor: pointer;
&:hover {
background-color: hsla(0, 0%, 60%, .05);
}
}
</style>

136
src/layout/password.vue

@ -0,0 +1,136 @@
<!-- 修改密码弹窗 -->
<template>
<el-dialog
:visible="visible"
title="修改密码"
width="400px"
@closed="onClose"
@update:visible="updateVisible"
:append-to-body="true"
:lock-scroll="false">
<el-form
ref="form"
:model="form"
:rules="rules"
label-width="82px"
@keyup.enter.native="save">
<el-form-item
label="旧密码:"
prop="old">
<el-input
v-model="form.old"
placeholder="请输入旧密码"
show-password/>
</el-form-item>
<el-form-item
label="新密码:"
prop="password">
<el-input
v-model="form.password"
placeholder="请输入新密码"
show-password/>
</el-form-item>
<el-form-item
label="确认密码:"
prop="password2">
<el-input
v-model="form.password2"
placeholder="请再次输入新密码"
show-password/>
</el-form-item>
</el-form>
<div slot="footer">
<el-button
@click="cancel">取消
</el-button>
<el-button
type="primary"
@click="save">确定
</el-button>
</div>
</el-dialog>
</template>
<script>
export default {
name: 'ElePassword',
props: {
visible: Boolean
},
data() {
let rePswRule = (rule, value, callback) => {
if (!value) {
callback(new Error('请再次输入新密码'));
} else if (value !== this.form.password) {
callback(new Error('两次输入密码不一致'));
} else {
callback();
}
};
return {
//
form: {
old: '',
password: '',
password2: ''
},
//
rules: {
old: [
{required: true, message: '请输入旧密码', trigger: 'blur'}
],
password: [
{required: true, message: '请输入新密码', trigger: 'blur'}
],
password2: [
{validator: rePswRule, trigger: 'blur'}
]
},
// loading
loading: false
};
},
methods: {
/* 保存修改 */
save() {
this.$refs['form'].validate((valid) => {
if (valid) {
this.loading = true;
let formData = new FormData();
formData.append('old_password', this.form.old);
formData.append('password', this.form.password);
formData.append('password2', this.form.password2);
this.$http.post('/manager/passwordEdit', formData).then(res => {
this.loading = false;
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
this.cancel();
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
this.loading = false;
this.$message.error(e.message);
});
} else {
return false;
}
});
},
/* 取消 */
cancel() {
this.updateVisible(false);
},
/* 关闭回调 */
onClose() {
this.form = {};
this.$refs['form'].resetFields();
this.loading = false;
},
/* 修改visible */
updateVisible(value) {
this.$emit('update:visible', value);
}
}
}
</script>

23
src/main.js

@ -0,0 +1,23 @@
/** 主入口js */
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import setting from './config/setting';
import permission from '@/utils/permission';
import VueClipboard from 'vue-clipboard2';
import './config/axios-config';
import EleAdmin from 'ele-admin';
import './styles/index.scss';
Vue.config.productionTip = false;
Vue.prototype.$setting = setting;
Vue.use(EleAdmin, {size: 'medium'});
Vue.use(permission);
Vue.use(VueClipboard);
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app');

145
src/router/index.js

@ -0,0 +1,145 @@
/**
* 路由配置
*/
import Vue from 'vue';
import VueRouter from 'vue-router';
import store from '@/store';
import setting from '@/config/setting';
import EleLayout from '@/layout';
import {EleEmptyLayout, EleIframeLayout} from 'ele-admin';
import NProgress from 'nprogress';
Vue.use(VueRouter);
// 静态路由
const routes = [
{
path: '/login',
component: () => import('@/views/login/login'),
meta: {title: '登录'}
},
{
path: '/forget',
component: () => import('@/views/login/forget'),
meta: {title: '忘记密码'}
},
{
path: '*',
component: () => import('@/views/exception/404'),
meta: {title: ''}
}
];
const router = new VueRouter({
routes,
mode: 'history' // 把这个删掉就是hash模式
});
// 路由守卫
router.beforeEach((to, from, next) => {
NProgress.start();
updateTitle(to);
// 判断是否登录
if (setting.takeToken()) {
// 判断是否已经注册动态路由
if (!store.state.user.menus) {
// 获取动态路由
store.dispatch('user/getMenus').then(({menus, home}) => {
if (menus) {
router.addRoute({
name: '/',
path: '/',
component: EleLayout,
redirect: setting.homePath || home,
children: menuToRoutes(menus)
});
}
next({...to, replace: true});
}).catch(() => {
next();
});
} else {
next();
}
} else if (setting.whiteList.indexOf(to.path) !== -1) {
next(); // 在无需登录的白名单内
} else {
// 未登录跳转登录页面
next({path: '/login', query: to.path === '/' ? {} : {from: to.path}});
}
});
router.afterEach(() => {
setTimeout(() => {
NProgress.done(true);
}, 300);
});
export default router;
/**
* 菜单生成路由
* @param menus
* @returns {[]}
*/
function menuToRoutes(menus) {
if (!menus) {
return null;
}
let routes = [];
menus.forEach(item => {
const path = item.path;
if (path && !isUrl(path)) {
let meta = Object.assign({}, item.meta);
let component;
if (item.component) {
if (isUrl(item.component)) {
component = EleIframeLayout;
meta.iframe = item.component;
meta.hideFooter = true;
} else {
component = () => import('@/views' + item.component);
}
} else {
component = EleEmptyLayout;
}
routes.push({
meta: meta,
name: item.path,
path: item.path,
component: component,
redirect: item.redirect,
children: menuToRoutes(item.children)
});
}
});
return routes;
}
/**
* 判断是否是网址
* @param url
*/
function isUrl(url) {
return url && (
url.startsWith('http://') ||
url.startsWith('https://') ||
url.startsWith('//')
);
}
/**
* 更新浏览器标题
* @param route
*/
function updateTitle(route) {
let names = [];
if (route && route.meta && route.meta.title) {
names.push(route.meta.title);
}
const appName = process.env.VUE_APP_NAME;
if (appName) {
names.push(appName);
}
document.title = names.join(' - ');
}

4
src/store/getters.js

@ -0,0 +1,4 @@
export default {
theme: state => state.theme,
user: state => state.user
}

21
src/store/index.js

@ -0,0 +1,21 @@
/**
* vuex状态管理
*/
import Vue from 'vue';
import Vuex from 'vuex';
import getters from './getters';
import theme from './modules/theme';
import user from './modules/user';
Vue.use(Vuex);
export default new Vuex.Store({
state: {},
mutations: {},
actions: {},
modules: {
theme,
user
},
getters
});

302
src/store/modules/theme.js

@ -0,0 +1,302 @@
/**
* 主题状态管理 license by http://eleadmin.com
*/
import setting from '@/config/setting';
// 获取本地缓存配置
let cache = {};
try {
cache = JSON.parse(localStorage.getItem(setting.themeStoreName)) || {};
} catch (e) {
console.error(e);
}
// 获取缓存的主题配置和缓存的主题css
const cacheTheme = getCache(cache, [
'color', 'sideStyle', 'headStyle',
'tabStyle', 'layoutStyle', 'bodyFull',
'fixedHeader', 'fixedSidebar', 'fixedBody',
'showTabs', 'logoAutoSize', 'colorfulIcon',
'sideUniqueOpen', 'showFooter', 'weakMode', 'darkMode'
], setting);
// 恢复色弱模式
if (cacheTheme.weakMode) {
document.body.classList.add('ele-admin-weak');
}
// 恢复主题色
window.onload = function () {
changeTheme(cacheTheme.color, cacheTheme.darkMode).catch(e => {
console.error(e);
});
}
// 获取屏幕宽度
const screenWidth = document.documentElement.clientWidth || document.body.clientWidth,
screenHeight = document.documentElement.clientHeight || document.body.clientHeight;
export default {
namespaced: true,
state: {
// 侧边栏风格: 0亮色, 1暗色
sideStyle: cacheTheme.sideStyle,
// 顶栏风格: 0亮色, 1暗色, 2主色
headStyle: cacheTheme.headStyle,
// 标签页风格: 0默认, 1圆点, 2卡片
tabStyle: cacheTheme.tabStyle,
// 布局风格: 0默认, 1顶部菜单风格, 2混合菜单风格
layoutStyle: cacheTheme.layoutStyle,
// 是否固定侧栏
fixedSidebar: cacheTheme.fixedSidebar,
// 是否固定顶栏
fixedHeader: cacheTheme.fixedHeader,
// 是否固定主体
fixedBody: cacheTheme.fixedBody,
// 内容区域宽度铺满
bodyFull: cacheTheme.bodyFull,
// 是否开启多标签
showTabs: cacheTheme.showTabs,
// logo是否自适应宽度
logoAutoSize: cacheTheme.logoAutoSize,
// 侧栏是否多彩图标
colorfulIcon: cacheTheme.colorfulIcon,
// 侧边栏是否只保持一个子菜单展开
sideUniqueOpen: cacheTheme.sideUniqueOpen,
// 是否开启页脚
showFooter: cacheTheme.showFooter,
// 是否是色弱模式
weakMode: cacheTheme.weakMode,
// 是否是暗黑模式
darkMode: cacheTheme.darkMode,
// 主题色
color: cacheTheme.color,
// 是否折叠侧边栏
collapse: screenWidth < 992,
// 当前屏幕宽度
screenWidth: screenWidth,
// 当前屏幕高度
screenHeight: screenHeight
},
mutations: {
SET: (state, obj) => {
state[obj.key] = obj.value;
// 开关色弱模式
if ('weakMode' === obj.key) {
if (obj.value) {
document.body.classList.add('ele-admin-weak');
} else {
document.body.classList.remove('ele-admin-weak');
}
}
// 缓存修改的配置
if (['collapse', 'screenWidth', 'screenHeight'].indexOf(obj.key) === -1) {
let temp = JSON.parse(localStorage.getItem(setting.themeStoreName) || '{}');
temp[obj.key] = obj.value;
localStorage.setItem(setting.themeStoreName, JSON.stringify(temp));
}
}
},
actions: {
/**
* 修改配置
* @param commit
* @param obj
*/
set({commit}, obj) {
commit('SET', obj);
},
/**
* 切换配置(boolean类型的配置)
* @param commit
* @param state
* @param key
*/
toggle({commit, state}, key) {
commit('SET', {key: key, value: !state[key]});
},
/**
* 更新屏幕尺寸
* @param commit
* @param state
*/
updateScreen({commit, state}) {
const w = document.documentElement.clientWidth || document.body.clientWidth,
h = document.documentElement.clientHeight || document.body.clientHeight;
if (w !== state.screenWidth) {
commit('SET', {key: 'screenWidth', value: w});
}
if (h !== state.screenHeight) {
commit('SET', {key: 'screenHeight', value: h});
}
},
/**
* 切换主题色
* @param commit
* @param state
* @param color
* @returns {Promise<>}
*/
setColor({commit, state}, color) {
return new Promise((resolve, reject) => {
changeTheme(color, state.darkMode).then(() => {
commit('SET', {key: 'color', value: color});
return resolve();
}).catch(e => {
reject(e);
});
});
}
}
}
/**
* 获取缓存配置项
* @param cache 缓存数据
* @param k 配置项
* @param v 默认值
*/
function getCache(cache, k, v) {
if (Array.isArray(k)) {
let obj = {};
k.forEach(t => {
obj[t] = (cache[t] === null || cache[t] === undefined) ? v[t] : cache[t];
});
return obj;
} else {
if (cache[k] === null || cache[k] === undefined) {
return v;
}
return cache[k];
}
}
/**
* 切换主题
* @param color 主题色
* @param darkMode 是否是暗黑模式
* @returns {Promise<>}
*/
function changeTheme(color, darkMode) {
const version = process.env.VUE_APP_VERSION;
// 对应的css文件名
let colorCss;
if (darkMode) {
if (color) {
colorCss = color + '-dark';
} else {
colorCss = 'dark';
}
} else {
colorCss = color;
}
// 获取缓存的主题css
let themeCache = {},
cacheStoreName = setting.themeStoreName + '-cache';
if (window.eleThemeCache) {
themeCache = window.eleThemeCache;
} else {
try {
const localCache = JSON.parse(localStorage.getItem(cacheStoreName) || '{}');
if (localCache && version === localCache.version && localCache.cache) {
themeCache = localCache.cache;
window.eleThemeCache = themeCache;
}
} catch (e) {
console.error(e);
}
}
// 加载主题css
return new Promise((resolve, reject) => {
// 恢复默认主题
if (!colorCss) {
removeTheme();
return resolve();
}
// 主题css已经缓存过
if (themeCache[colorCss]) {
removeTheme(); // 移除上次的主题
let elem = document.createElement('style');
elem.id = `ele-theme-${colorCss}`;
elem.setAttribute('type', 'text/css');
elem.innerHTML = themeCache[colorCss];
document.head.appendChild(elem);
return resolve();
}
// 主题css的js模块已被加载过
const oldElem = document.head.querySelector(`#ele-theme-${colorCss}-js`);
if (oldElem) {
removeTheme(); // 移除上次的主题
let elem = document.createElement('link');
elem.id = `ele-theme-${colorCss}`;
elem.setAttribute('type', 'text/css');
elem.setAttribute('rel', 'stylesheet');
elem.setAttribute('href', oldElem.getAttribute('ele-css'));
document.head.appendChild(elem);
return resolve();
}
// 把head下面相关元素标记为非主题元素
const nid = ':not([id^="ele-theme-"])', sel = `style${nid},link${nid},script${nid}`;
document.head.querySelectorAll(sel).forEach(elem => {
if (!elem.getAttribute('ele-theme')) {
elem.setAttribute('ele-theme', 'no');
}
});
// 加载主题css模块
import(`@/styles/theme/${colorCss}.scss`).then(() => {
removeTheme(); // 移除上次的主题
// 获取import之后的主题标签
let elem = document.head.querySelectorAll('style:not([ele-theme="no"])');
elem = elem.length ? elem[elem.length - 1] : null;
if (!elem) {
// 可能是style标签也可能是link标签
elem = document.head.querySelectorAll('link:not([ele-theme="no"])');
elem = elem.length ? elem[elem.length - 1] : null;
if (!elem) {
return reject(new Error('theme element not found.'));
}
// 再找到对应的主题js模块的标签
const href = elem.getAttribute('href'),
uuid = href.substring(href.indexOf('chunk-'), href.indexOf('.')),
qs = `script[src^="/js/${uuid}"]:not([ele-theme="no"])`;
let node = document.head.querySelectorAll(qs);
if (node.length) {
node[node.length - 1].id = `ele-theme-${colorCss}-js`;
// 记录css地址
node[node.length - 1].setAttribute('ele-css', href);
}
}
elem.id = `ele-theme-${colorCss}`;
// 缓存主题css
if (elem.innerHTML) {
let cache = {};
cache[colorCss] = elem.innerHTML;
try {
localStorage.setItem(cacheStoreName, JSON.stringify({
version: version,
cache: cache
}));
} catch (e) {
console.error(e);
}
if (!window.eleThemeCache) {
window.eleThemeCache = {};
}
window.eleThemeCache[colorCss] = cache[colorCss];
}
return resolve();
}).catch(e => {
reject(e);
});
});
}
/**
* 移除主题
*/
function removeTheme() {
const sel = 'style[id^="ele-theme-"],link[id^="ele-theme-"]';
document.head.querySelectorAll(sel).forEach(elem => {
elem.parentNode.removeChild(elem);
});
}

259
src/store/modules/user.js

@ -0,0 +1,259 @@
/**
* 登录状态管理
*/
import axios from 'axios';
import {util} from 'ele-admin';
import setting from '@/config/setting';
export default {
namespaced: true,
state: {
// 当前用户信息
user: setting.takeUser(),
// 当前用户权限
authorities: [],
// 当前用户角色
roles: [],
// 当前用户的菜单
menus: null,
// 当前打开的选项卡
tabs: []
},
mutations: {
SET: (state, obj) => {
state[obj.key] = obj.value;
},
SET_TOKEN: (state, obj) => {
setting.cacheToken(obj.token, obj.remember);
state.token = obj.token;
if (!obj.token) {
state.user = {};
state.menus = null;
state.tabs = [];
setting.cacheUser();
}
},
TAB_PUSH(state, obj) {
if (!state.tabs.some(r => r.path === obj.path)) {
state.tabs.push(obj);
}
}
},
actions: {
/**
* 缓存token
* @param commit
* @param token {String, {token: String, remember: String}}
*/
setToken({commit}, token) {
let remember = true;
if (typeof token === 'object') {
remember = token.remember;
token = token.token;
}
commit('SET_TOKEN', {token: token, remember: remember});
},
/**
* 移除token
* @param commit
*/
removeToken({commit}) {
commit('SET_TOKEN', {});
},
/**
* 缓存用户信息
* @param commit
* @param user {Object} 用户信息
*/
setUser({commit}, user) {
setting.cacheUser(user);
commit('SET', {key: 'user', value: user});
},
/**
* 设置用户权限
* @param commit
* @param authorities {Array<String>} 权限
*/
setAuthorities({commit}, authorities) {
commit('SET', {key: 'authorities', value: authorities});
},
/**
* 设置用户角色
* @param commit
* @param roles {Array<String>} 角色
*/
setRoles({commit}, roles) {
commit('SET', {key: 'roles', value: roles});
},
/**
* 设置用户菜单
* @param commit
* @param menus {Array<Object>} 菜单
*/
setMenus({commit}, menus) {
commit('SET', {key: 'menus', value: menus});
},
/**
* 获取用户菜单路由
* @param commit
* @returns {Promise<Object>} {menus: Array, home: String}
*/
getMenus({commit}) {
return new Promise((resolve, reject) => {
if (!setting.menuUrl) {
let menus = setting.menus || [];
commit('SET', {key: 'menus', value: menus});
return resolve({menus: menus});
}
axios.get(setting.menuUrl).then(res => {
let result = setting.parseMenu ? setting.parseMenu(res.data) : res.data;
let menus = result.data, home = null;
if (!menus) {
return reject(new Error(result.msg));
}
util.eachTreeData(menus, item => {
if (setting.parseMenuItem) {
item = setting.parseMenuItem(item);
}
item.meta = Object.assign({
title: item.title,
icon: item.icon,
hide: item.hide,
active: item.active || item.uid,
hideFooter: item.hideFooter
}, item.meta);
if (!item.children || !item.children.length) {
if (!home && item.path && !(
item.path.startsWith('http://') ||
item.path.startsWith('https://') ||
item.path.startsWith('//')
)) {
home = item.path;
if (!setting.homeTitle) {
setting.homeTitle = item.title;
}
}
} else if (item.children[0].path) {
if (!item.redirect) {
item.redirect = item.children[0].path;
}
if (!item.path) {
const cp = item.children[0].path;
item.path = cp.substring(0, cp.lastIndexOf('/'));
}
}
});
commit('SET', {key: 'menus', value: menus});
resolve({menus: menus, home: home});
}).catch(e => {
reject(e);
});
});
},
/**
* 添加新tab
* @param commit
* @param obj {{path: String, title: String}} tab信息
*/
tabAdd({commit}, obj) {
commit('TAB_PUSH', obj);
},
/**
* 关闭指定tab
* @param commit
* @param state
* @param path {String} tab路由
* @returns {Promise<Number>} 前一个tab位置
*/
tabRemove({commit, state}, path) {
return new Promise((resolve) => {
let lastIndex = -1, lastPath, last;
for (let i = 0; i < state.tabs.length; i++) {
if (state.tabs[i].path === path) {
break;
}
lastIndex = i;
last = state.tabs[i];
lastPath = last.path;
}
commit('SET', {
key: 'tabs',
value: state.tabs.filter(d => d.path !== path)
});
resolve({
lastIndex: lastIndex,
lastPath: lastPath,
last: last
});
});
},
/**
* 关闭所有tab
* @param commit
*/
tabRemoveAll({commit}) {
commit('SET', {key: 'tabs', value: []});
},
/**
* 关闭左侧tab
* @param commit
* @param state
* @param path {String} tab路由
*/
tabRemoveLeft({commit, state}, path) {
for (let i = 0; i < state.tabs.length; i++) {
if (state.tabs[i].path === path) {
commit('SET', {
key: 'tabs',
value: state.tabs.slice(i)
});
break;
}
}
},
/**
* 关闭右侧tab
* @param commit
* @param state
* @param path {String} tab路由
*/
tabRemoveRight({commit, state}, path) {
for (let i = 0; i < state.tabs.length; i++) {
if (state.tabs[i].path === path) {
commit('SET', {
key: 'tabs',
value: state.tabs.slice(0, i + 1)
});
break;
}
}
},
/**
* 关闭其他tab
* @param commit
* @param state
* @param path {String} tab路由
*/
tabRemoveOther({commit, state}, path) {
commit('SET', {
key: 'tabs',
value: state.tabs.filter(d => d.path === path)
});
},
/**
* 修改指定tab标题
* @param commit
* @param state
* @param obj {{path: String, title: String}}
*/
tabSetTitle({commit, state}, obj) {
let i = state.tabs.findIndex(d => d.path === obj.path);
let tabs = state.tabs.slice(0, i).concat([
Object.assign({}, state.tabs[i], {
title: obj.title
})
]).concat(state.tabs.slice(i + 1));
commit('SET', {key: 'tabs', value: tabs});
}
}
}

63
src/styles/index.scss

@ -0,0 +1,63 @@
/** 如果需要自己定义一些全局样式写在这里 */
$--ele-font-path: "~ele-admin/packages/style/fonts";
@import "./var.scss";
@import "~ele-admin/packages/style/index.scss";
/* 异常页面 */
.ele-exception {
margin: 145px 0;
.ele-exception-img,
.ele-exception-content {
margin: 15px 30px;
display: inline-block;
vertical-align: middle;
}
.ele-exception-content > h1 {
font-size: 72px;
font-weight: 600;
margin: 0 0 20px 0;
}
&:not(.ele-exception-dark) .ele-exception-content > h1 {
color: #515A6E;
}
.ele-exception-content > p {
font-size: 20px;
margin: 0 0 25px 0;
}
&:not(.ele-exception-dark) .ele-exception-content > p {
color: #808695;
}
&.ele-exception-dark .ele-exception-img {
opacity: .7;
}
}
@media screen and (max-width: 768px) {
.ele-exception {
margin: 40px 0;
.ele-exception-img {
margin: 0;
img {
max-height: 200px;
}
}
.ele-exception-content {
text-align: center;
}
}
}
//表格不对齐bug
.el-table th.gutter {
display: table-cell !important;
}

5
src/styles/theme/cyan-dark.scss

@ -0,0 +1,5 @@
/** 明青主题暗黑 */
$--color-primary: #2BCCCE;
@import "./dark.scss";

6
src/styles/theme/cyan.scss

@ -0,0 +1,6 @@
/** 明青主题 */
$--color-primary: #2BCCCE;
@import "../var.scss";
@import "~ele-admin/packages/style/themes/default.scss";

4
src/styles/theme/dark.scss

@ -0,0 +1,4 @@
/** 暗黑主题 */
@import "../var.scss";
@import "~ele-admin/packages/style/themes/dark.scss";

5
src/styles/theme/dust-dark.scss

@ -0,0 +1,5 @@
/** 薄暮主题暗黑 */
$--color-primary: #5F80C7;
@import "./dark.scss";

6
src/styles/theme/dust.scss

@ -0,0 +1,6 @@
/** 薄暮主题 */
$--color-primary: #5F80C7;
@import "../var.scss";
@import "~ele-admin/packages/style/themes/default.scss";

5
src/styles/theme/geekblue-dark.scss

@ -0,0 +1,5 @@
/** 极客蓝主题暗黑 */
$--color-primary: #32A2D4;
@import "./dark.scss";

6
src/styles/theme/geekblue.scss

@ -0,0 +1,6 @@
/** 极客蓝主题 */
$--color-primary: #32A2D4;
@import "../var.scss";
@import "~ele-admin/packages/style/themes/default.scss";

5
src/styles/theme/green-dark.scss

@ -0,0 +1,5 @@
/** 极光绿主题暗黑 */
$--color-primary: #33CC99;
@import "./dark.scss";

6
src/styles/theme/green.scss

@ -0,0 +1,6 @@
/** 极光绿主题 */
$--color-primary: #33CC99;
@import "../var.scss";
@import "~ele-admin/packages/style/themes/default.scss";

5
src/styles/theme/purple-dark.scss

@ -0,0 +1,5 @@
/** 酱紫主题暗黑 */
$--color-primary: #9266F9;
@import "./dark.scss";

6
src/styles/theme/purple.scss

@ -0,0 +1,6 @@
/** 酱紫主题 */
$--color-primary: #9266F9;
@import "../var.scss";
@import "~ele-admin/packages/style/themes/default.scss";

5
src/styles/theme/sunset-dark.scss

@ -0,0 +1,5 @@
/** 日暮主题暗黑 */
$--color-primary: #FAAD14;
@import "./dark.scss";

6
src/styles/theme/sunset.scss

@ -0,0 +1,6 @@
/** 日暮主题 */
$--color-primary: #FAAD14;
@import "../var.scss";
@import "~ele-admin/packages/style/themes/default.scss";

5
src/styles/theme/volcano-dark.scss

@ -0,0 +1,5 @@
/** 火山主题暗黑 */
$--color-primary: #F5686F;
@import "./dark.scss";

6
src/styles/theme/volcano.scss

@ -0,0 +1,6 @@
/** 火山主题 */
$--color-primary: #F5686F;
@import "../var.scss";
@import "~ele-admin/packages/style/themes/default.scss";

2
src/styles/var.scss

@ -0,0 +1,2 @@
/** 如果需要覆盖框架样式变量写在这里 */
$--sidebar-width: 220px; // 侧边栏宽度

128
src/utils/permission.js

@ -0,0 +1,128 @@
/**
* 权限角色控制组件
*/
import store from '@/store';
export default {
install(Vue) {
// 添加全局方法
Vue.prototype.$hasRole = this.hasRole;
Vue.prototype.$hasAnyRole = this.hasAnyRole;
Vue.prototype.$hasPermission = this.hasPermission;
Vue.prototype.$hasAnyPermission = this.hasAnyPermission;
// 添加自定义指令
Vue.directive('role', {
inserted: (el, binding) => {
if (!this.hasRole(binding.value)) {
el.parentNode && el.parentNode.removeChild(el);
}
}
});
Vue.directive('any-role', {
inserted: (el, binding) => {
if (!this.hasAnyRole(binding.value)) {
el.parentNode && el.parentNode.removeChild(el);
}
}
});
Vue.directive('permission', {
inserted: (el, binding) => {
if (!this.hasPermission(binding.value)) {
el.parentNode && el.parentNode.removeChild(el);
}
}
});
Vue.directive('any-permission', {
inserted: (el, binding) => {
if (!this.hasAnyPermission(binding.value)) {
el.parentNode && el.parentNode.removeChild(el);
}
}
});
},
/**
* 是否有某些角色
* @param role {String, Array<String>} 角色字符或字符数组
* @returns {boolean}
*/
hasRole(role) {
const data = store.state.user ? store.state.user.roles : null;
return arrayHas(data, role);
},
/**
* 是否有任意角色
* @param role {String, Array<String>} 角色字符或字符数组
* @returns {boolean}
*/
hasAnyRole(role) {
const data = store.state.user ? store.state.user.roles : null;
return arrayHasAny(data, role);
},
/**
* 是否有某些权限
* @param auth {String, Array<String>} 权限字符或字符数组
* @returns {boolean}
*/
hasPermission(auth) {
const data = store.state.user ? store.state.user.authorities : null;
return arrayHas(data, auth);
},
/**
* 是否有任意权限
* @param auth {String, Array<String>} 权限字符或字符数组
* @returns {boolean}
*/
hasAnyPermission(auth) {
const data = store.state.user ? store.state.user.authorities : null;
return arrayHasAny(data, auth);
}
}
/**
* 数组是否有某些值
* @param array {Array<String>} 数组
* @param obj {String, Array<String>}
* @returns {boolean}
*/
function arrayHas(array, obj) {
if (!obj) {
return true;
}
if (!array) {
return false;
}
if (Array.isArray(obj)) {
for (let i = 0; i < obj.length; i++) {
if (array.indexOf(obj[i]) === -1) {
return false;
}
}
return true;
}
return array.indexOf(obj) !== -1;
}
/**
* 数组是否有任意值
* @param array {Array<String>} 数组
* @param obj {String, Array<String>}
* @returns {boolean}
*/
function arrayHasAny(array, obj) {
if (!obj) {
return true;
}
if (!array) {
return false;
}
if (Array.isArray(obj)) {
for (let i = 0; i < obj.length; i++) {
if (array.indexOf(obj[i]) !== -1) {
return true;
}
}
return false;
}
return array.indexOf(obj) !== -1;
}

202
src/views/ad/ad-data-edit.vue

@ -0,0 +1,202 @@
<!-- 用户编辑弹窗 -->
<template>
<el-dialog
:title="isUpdate?'修改广告':'添加广告'"
:visible="visible"
width="600px"
:destroy-on-close="true"
:lock-scroll="false"
custom-class="ele-dialog-form"
@update:visible="updateVisible">
<el-form
:model="form"
ref="form"
:rules="rules"
label-width="82px">
<el-row :gutter="15">
<el-col>
<el-form-item
label="名称:"
prop="name">
<el-input
v-model="form.name"
placeholder="请输入广告名称"
clearable/>
</el-form-item>
<el-form-item
label="排序号:"
prop="sortNumber">
<el-input-number
v-model="form.sort"
controls-position="right"
:min="0"
placeholder="请输入排序号"
class="ele-fluid ele-text-left"/>
</el-form-item>
<el-form-item
label="跳转链接:"
prop="url">
<el-input
v-model="form.url"
placeholder="请输入跳转链接"
clearable/>
</el-form-item>
<el-form-item label="起止日期:" prop="datetime">
<el-date-picker
v-model="form.datetime"
type="daterange"
unlink-panels range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
class="ele-fluid"/>
</el-form-item>
<el-form-item label="图片">
<el-row>
<el-col>
<el-input
v-model="form.image"
placeholder="请上传图片"
clearable/>
<el-upload
class="upload-demo"
:show-file-list="false"
:action="this.uploadImage+'?upload_type=img'"
:on-success="afterUploadImage">
<img v-if="form.image" :src="form.image" width="150" height="150" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="描述:">
<el-input
v-model="form.desc"
placeholder="请输入描述"
clearable/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer">
<el-button
@click="updateVisible(false)">取消
</el-button>
<el-button
type="primary"
@click="save"
:loading="loading">保存
</el-button>
</div>
</el-dialog>
</template>
<script>
import setting from "@/config/setting";
export default {
name: 'AdDataEdit',
props: {
//
visible: Boolean,
//
data: Object,
},
data() {
return {
//
form: Object.assign({
ad_id:this.$route.query.ad_id
}, this.data),
//
rules: {
name: [
{required: true, message: '请输入广告名称', trigger: 'blur'}
],
sort: [
{required: true, message: '请输入广告排序', trigger: 'blur'}
],
},
//
loading: false,
//
isUpdate: false,
//
tagLists: [],
uploadImage: setting.uploadImageUrl,
}
},
watch: {
data() {
if (this.data) {
this.form = Object.assign({}, this.data);
this.isUpdate = true;
console.log(222)
} else {
this.form = {};
this.$set(this.form,'ad_id',this.$route.query.ad_id)
this.isUpdate = false;
console.log(1111)
}
}
},
mounted() {
},
methods: {
afterUploadImage(response) {
if (response.code != 0 || response.url == '') {
this.$message.error(response.msg)
} else {
this.$set(this.form,'image',response.url)
}
},
/* 保存编辑 */
save() {
this.$refs['form'].validate((valid) => {
if (valid) {
this.loading = true;
this.$http.post('/AdData/' + (this.isUpdate ? 'edit' : 'add'), this.form).then(res => {
this.loading = false;
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
if (!this.isUpdate) {
this.$set(this.form,'ad_id',this.$route.query.ad_id)
this.form = {};
}
this.updateVisible(false);
this.$emit('done');
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
this.loading = false;
this.$message.error(e.message);
});
} else {
return false;
}
});
},
/* 更新visible */
updateVisible(value) {
this.$emit('update:visible', value);
},
}
}
</script>
<style scoped>
</style>

263
src/views/ad/ad-data.vue

@ -0,0 +1,263 @@
<template>
<div class="ele-body">
<el-card shadow="never">
<!-- 搜索表单 -->
<el-form
:model="where"
label-width="77px"
class="ele-form-search"
@keyup.enter.native="reload"
@submit.native.prevent>
<el-row :gutter="15">
<el-col :md="5" :sm="12">
<el-form-item label="名称:">
<el-input
v-model="where.name"
placeholder="请输入广告名称"
clearable/>
</el-form-item>
</el-col>
<el-col :md="6" :sm="12">
<div class="ele-form-actions">
<el-button
type="primary"
@click="reload"
icon="el-icon-search"
class="ele-btn-icon">查询
</el-button>
<el-button @click="reset">重置</el-button>
</div>
</el-col>
</el-row>
</el-form>
<!-- 数据表格 -->
<ele-pro-table
ref="table"
:datasource="url"
:columns="columns"
:where="where"
:selection.sync="selection">
<!-- 表头工具栏 -->
<template slot="toolbar">
<el-button
@click="openEdit(null)"
type="primary"
icon="el-icon-plus"
class="ele-btn-icon"
size="small">添加
</el-button>
<el-button
@click="removeBatch"
type="danger"
icon="el-icon-delete"
class="ele-btn-icon"
size="small">删除
</el-button>
</template>
<template slot="image" slot-scope="{row}">
<div class="ele-cell">
<a :href="row.image" target="_blank"><el-avatar shape="square" :size="100" :src="row.image"/></a>
</div>
</template>
<!-- 操作列 -->
<template slot="action" slot-scope="{row}">
<el-link
@click="openEdit(row)"
icon="el-icon-edit"
type="primary"
:underline="false">修改
</el-link>
<el-popconfirm
title="确定要删除广告位吗?"
@confirm="remove(row)"
class="ele-action">
<el-link
slot="reference"
icon="el-icon-delete"
type="danger"
:underline="false">删除
</el-link>
</el-popconfirm>
</template>
</ele-pro-table>
</el-card>
<!-- 编辑弹窗 -->
<ad-data-edit
:visible.sync="showEdit"
:data="current"
@done="reload"/>
</div>
</template>
<script>
import AdDataEdit from './ad-data-edit';
export default {
name: 'adData',
components: { AdDataEdit},
data() {
return {
//
url: '/AdData/index',
//
columns: [
{
columnKey: 'selection',
type: 'selection',
width: 45,
align: 'center',
fixed: 'left'
},
{
prop: 'name',
label: '广告名称',
sortable: false,
showOverflowTooltip: true,
minWidth: 80
},
{
prop: 'image',
label: '图片',
sortable: false,
showOverflowTooltip: true,
minWidth: 100,
slot: "image"
},
{
prop: 'url',
label: '广告链接',
sortable: false,
showOverflowTooltip: true,
minWidth: 180
},
{
prop: 'sort',
label: '排序',
width: 80,
sortable: true,
align: 'center',
fixed: 'left',
},
{
prop: 'start_time',
label: '开始时间',
sortable: 'custom',
showOverflowTooltip: true,
minWidth: 130,
formatter: (row, column, cellValue) => {
return this.$util.toDateString(cellValue);
}
},
{
prop: 'end_time',
label: '结束时间',
sortable: 'custom',
showOverflowTooltip: true,
minWidth: 130,
formatter: (row, column, cellValue) => {
return this.$util.toDateString(cellValue);
}
},
{
columnKey: 'action',
label: '操作',
width: 180,
align: 'center',
resizable: false,
slot: 'action'
}
],
//
where: {
ad_id:this.$route.query.ad_id
},
//
selection: [],
//
current: null,
//
showEdit: false,
//
showImport: false,
}
},
mounted() {
},
methods: {
/* 刷新表格 */
reload() {
this.$refs.table.reload({page: 1});
},
/* 重置搜索 */
reset() {
this.where = {};
this.$nextTick(() => {
this.reload();
});
},
/* 显示编辑 */
openEdit(row) {
this.current = row;
this.showEdit = true;
},
/* 删除 */
remove(row) {
const loading = this.$loading({lock: true});
let formData = new FormData();
formData.append('id', row.id);
this.$http.post('/AdData/delete/', formData).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
this.reload();
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
},
/* 批量删除 */
removeBatch() {
if (!this.selection.length) {
this.$message.error('请至少选择一条数据')
return;
}
this.$confirm('确定要删除选中的广告吗?', '提示', {
type: 'warning'
}).then(() => {
const loading = this.$loading({lock: true});
let formData = new FormData();
formData.append('id', this.selection.map(d => d.id));
this.$http.post('/AdData/delete/', formData).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
this.reload();
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
}).catch(() => {
});
},
}
}
</script>
<style scoped>
</style>

190
src/views/ad/ad-edit.vue

@ -0,0 +1,190 @@
<!-- 用户编辑弹窗 -->
<template>
<el-dialog
:title="isUpdate?'修改广告位':'添加广告位'"
:visible="visible"
width="600px"
:destroy-on-close="true"
:lock-scroll="false"
custom-class="ele-dialog-form"
@update:visible="updateVisible">
<el-form
:model="form"
ref="form"
:rules="rules"
label-width="82px">
<el-row :gutter="15">
<el-col>
<el-form-item
label="名称:"
prop="name">
<el-input
v-model="form.name"
placeholder="请输入广告位名称"
clearable/>
</el-form-item>
<el-form-item
label="广告标识:"
prop="name">
<el-input
v-model="form.idf"
:disabled="isUpdate?true:false"
placeholder="请输入广告位前台调用标识"
clearable/>
</el-form-item>
<el-form-item label="分类:">
<el-select
v-model="form.type"
placeholder="请选择广告位分类"
class="ele-fluid">
<el-option
v-for="item in tagLists"
:key="item.id"
:label="item.name"
:value="item.id">
<span style="padding-left: 8px;">{{ item.name }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item
label="排序号:"
prop="sortNumber">
<el-input-number
v-model="form.sort"
controls-position="right"
:min="0"
placeholder="请输入排序号"
class="ele-fluid ele-text-left"/>
</el-form-item>
<el-form-item label="描述:">
<el-input
v-model="form.desc"
placeholder="请输入描述"
clearable/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer">
<el-button
@click="updateVisible(false)">取消
</el-button>
<el-button
type="primary"
@click="save"
:loading="loading">保存
</el-button>
</div>
</el-dialog>
</template>
<script>
export default {
name: 'AdEdit',
props: {
//
visible: Boolean,
//
data: Object,
},
data() {
return {
//
form: Object.assign({}, this.data),
//
rules: {
name: [
{required: true, message: '请输入广告位名称', trigger: 'blur'}
],
sort: [
{required: true, message: '请输入广告位排序', trigger: 'blur'}
],
},
//
loading: false,
//
isUpdate: false,
//
tagLists: [],
}
},
watch: {
data() {
if (this.data) {
this.form = Object.assign({}, this.data);
console.log(this.form )
this.isUpdate = true;
} else {
this.form = {};
this.isUpdate = false;
}
}
},
mounted() {
this.getTagLists(); //
},
methods: {
afterUploadImage(response) {
if (response.code != 0 || response.url == '') {
this.$message.error(response.msg)
} else {
// console.log(this.form)
// this.form.url = response.url
// console.log(this.form)
this.$set(this.form,'url',response.url)
}
},
/* 保存编辑 */
save() {
this.$refs['form'].validate((valid) => {
if (valid) {
this.loading = true;
this.$http.post('/Ad/' + (this.isUpdate ? 'edit' : 'add'), this.form).then(res => {
this.loading = false;
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
if (!this.isUpdate) {
this.form = {};
}
this.updateVisible(false);
this.$emit('done');
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
this.loading = false;
this.$message.error(e.message);
});
} else {
return false;
}
});
},
/* 更新visible */
updateVisible(value) {
this.$emit('update:visible', value);
},
/* 查询角色列表 */
getTagLists(){
this.$http.get('/Ad/getType').then(res => {
if (res.data.code === 0) {
this.tagLists = res.data.data;
}
})
},
}
}
</script>
<style scoped>
</style>

276
src/views/ad/index.vue

@ -0,0 +1,276 @@
<template>
<div class="ele-body">
<el-card shadow="never">
<!-- 搜索表单 -->
<el-form
:model="where"
label-width="77px"
class="ele-form-search"
@keyup.enter.native="reload"
@submit.native.prevent>
<el-row :gutter="15">
<el-col :md="5" :sm="12">
<el-form-item label="名称:">
<el-input
v-model="where.name"
placeholder="请输入名称"
clearable/>
</el-form-item>
</el-col>
<el-col :md="4" :sm="12">
<el-form-item label="分类:">
<el-select
v-model="where.type"
placeholder="请选择"
clearable
class="ele-fluid">
<el-option
v-for="item in tagLists"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :md="6" :sm="12">
<div class="ele-form-actions">
<el-button
type="primary"
@click="reload"
icon="el-icon-search"
class="ele-btn-icon">查询
</el-button>
<el-button @click="reset">重置</el-button>
</div>
</el-col>
</el-row>
</el-form>
<!-- 数据表格 -->
<ele-pro-table
ref="table"
:datasource="url"
:columns="columns"
:where="where"
:selection.sync="selection">
<!-- 表头工具栏 -->
<template slot="toolbar">
<el-button
@click="openEdit(null)"
type="primary"
icon="el-icon-plus"
class="ele-btn-icon"
size="small">添加
</el-button>
<el-button
@click="removeBatch"
type="danger"
icon="el-icon-delete"
class="ele-btn-icon"
size="small">删除
</el-button>
</template>
<!-- 操作列 -->
<template slot="action" slot-scope="{row}">
<el-link
@click="openAdLists(row)"
icon="el-icon-_nav"
type="primary"
:underline="false">查看广告
</el-link>
<el-link
@click="openEdit(row)"
icon="el-icon-edit"
type="primary"
:underline="false">修改
</el-link>
<el-popconfirm
title="确定要删除广告位吗?"
@confirm="remove(row)"
class="ele-action">
<el-link
slot="reference"
icon="el-icon-delete"
type="danger"
:underline="false">删除
</el-link>
</el-popconfirm>
</template>
</ele-pro-table>
</el-card>
<!-- 编辑弹窗 -->
<ad-edit
:visible.sync="showEdit"
:data="current"
@done="reload"/>
</div>
</template>
<script>
import AdEdit from './ad-edit';
export default {
name: 'ad',
components: { AdEdit},
data() {
return {
//
url: '/Ad/index',
//
columns: [
{
columnKey: 'selection',
type: 'selection',
width: 45,
align: 'center',
fixed: 'left'
},
{
columnKey: 'id',
type: 'index',
width: 45,
align: 'center',
fixed: 'left',
showOverflowTooltip: true
},
{
prop: 'name',
label: '广告位名称',
sortable: false,
showOverflowTooltip: true,
minWidth: 80
},
{
prop: 'sort',
label: '排序',
width: 80,
sortable: true,
align: 'center',
fixed: 'left',
},
{
prop: 'desc',
label: '备注',
sortable: false,
showOverflowTooltip: true,
minWidth: 100,
},
{
prop: 'type_str',
label: '分类',
sortable: false,
showOverflowTooltip: true,
minWidth: 60
},
{
columnKey: 'action',
label: '操作',
width: 220,
align: 'center',
resizable: false,
slot: 'action'
}
],
//
where: {},
//
selection: [],
//
current: null,
//
showEdit: false,
//
showImport: false,
tagLists:[],
}
},
mounted() {
this.getTagLists();
},
methods: {
getTagLists(){
this.$http.get('/Ad/getType').then(res => {
if (res.data.code === 0) {
this.tagLists = res.data.data;
}
})
},
/* 刷新表格 */
reload() {
this.$refs.table.reload({page: 1});
},
/* 重置搜索 */
reset() {
this.where = {};
this.$nextTick(() => {
this.reload();
});
},
/* 显示编辑 */
openEdit(row) {
this.current = row;
this.showEdit = true;
},
/* 删除 */
remove(row) {
const loading = this.$loading({lock: true});
let formData = new FormData();
formData.append('id', row.id);
this.$http.post('/Ad/delete/', formData).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
this.reload();
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
},
/* 批量删除 */
removeBatch() {
if (!this.selection.length) {
this.$message.error('请至少选择一条数据')
return;
}
this.$confirm('确定要删除选中的广告位吗?', '提示', {
type: 'warning'
}).then(() => {
const loading = this.$loading({lock: true});
let formData = new FormData();
formData.append('id', this.selection.map(d => d.id));
this.$http.post('/Ad/delete/', formData).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
this.reload();
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
}).catch(() => {
});
},
openAdLists(row){
this.$router.push({
path:'/ad/ad-data',
query:{
ad_id : row.id
}
})
},
}
}
</script>
<style scoped>
</style>

355
src/views/cate/cate-edit.vue

@ -0,0 +1,355 @@
<!-- 编辑弹窗 -->
<template>
<el-dialog
width="720px"
:visible="visible"
:lock-scroll="false"
:destroy-on-close="true"
custom-class="ele-dialog-form"
:title="isUpdate?'修改栏目':'添加栏目'"
@update:visible="updateVisible">
<el-form
ref="form"
:model="form"
:rules="rules"
label-width="92px"
@keyup.enter.native="save"
@submit.native.prevent>
<el-card
shadow="never"
header="基础设置"
body-style="padding: 10px 10px 0 10px;">
<el-row :gutter="15">
<el-form-item label="上级栏目:">
<treeselect
:options="cateList"
v-model="form.parent_id"
:defaultExpandLevel="3"
:normalizer="normalizer"
placeholder="请选择上级栏目"/>
</el-form-item>
<el-form-item label="模型:">
<el-select
v-model="form.module_id"
class="ele-fluid"
placeholder="请选择模型"
>
<el-option
v-for="item in moduleList"
:key="item.module_id"
:label="item.module_name"
:value="item.module_id">
<span style="padding-left: 8px;">{{ item.module_name }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="栏目名称:" prop="cate_name">
<el-input
clearable
v-model="form.cate_name"
placeholder="请输入栏目名称"/>
</el-form-item>
<el-form-item label="英文名称:" prop="en_name">
<el-input
clearable
v-model="form.en_name"
placeholder="请输入栏目英文名称"/>
</el-form-item>
<el-form-item label="栏目目录:" prop="cate_folder">
<el-input
clearable
v-model="form.cate_folder"
placeholder="请输入栏目目录"/>
</el-form-item>
<el-form-item label="栏目图片">
<el-row>
<el-col>
<el-input
v-model="form.image"
placeholder="请上传图片"
clearable/>
<el-upload
class="upload-demo"
:show-file-list="false"
:action="this.uploadImage+'?upload_type=img'"
:on-success="afterUploadImage">
<img v-if="form.image" :src="form.image" width="150" height="150" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="ico图片">
<el-row>
<el-col>
<el-input
v-model="form.ico_image"
placeholder="请上传ico"
clearable/>
<el-upload
class="upload-demo"
:show-file-list="false"
:action="this.uploadImage+'?upload_type=img'"
:on-success="afterUploadIcoImage">
<img v-if="form.ico_image" :src="form.ico_image" width="150" height="150" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="简介:">
<el-input
v-model="form.summary"
placeholder="请输入简介"
clearable/>
</el-form-item>
<el-form-item label="导航状态:">
<el-radio-group
v-model="form.is_menu">
<el-radio :label="1">显示</el-radio>
<el-radio :label="0">隐藏</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="状态:">
<el-radio-group
v-model="form.status">
<el-radio :label="1">显示</el-radio>
<el-radio :label="0">隐藏</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="排序号:" prop="sort">
<el-input-number
:min="0"
v-model="form.sort"
placeholder="请输入排序号"
controls-position="right"
class="ele-fluid ele-text-left"/>
</el-form-item>
</el-row>
</el-card>
<el-card
shadow="never"
header="SEO设置"
body-style="padding: 10px 10px 0 10px;">
<el-row :gutter="15">
<el-form-item label="SEO标题:" prop="seo_title">
<el-input
clearable
v-model="form.seo_title"
placeholder="请输入SEO标题"/>
</el-form-item>
<el-form-item label="SEO关键字:" prop="seo_keyword">
<el-input
clearable
v-model="form.seo_keyword"
placeholder="请输入SEO关键字"/>
</el-form-item>
<el-form-item label="SEO描述:" prop="seo_description">
<el-input
clearable
v-model="form.seo_description"
placeholder="请输入SEO描述"/>
</el-form-item>
</el-row>
</el-card>
<el-card
shadow="never"
header="其他设置"
body-style="padding: 10px 10px 0 10px;">
<el-row :gutter="15">
<el-form-item label="外部链接:" prop="url">
<el-input
clearable
v-model="form.url"
placeholder="请输入外部链接"/>
</el-form-item>
<el-form-item label="列表模块:" prop="template_list">
<el-input
clearable
v-model="form.template_list"
placeholder="请输入列表模块"/>
</el-form-item>
<el-form-item label="详情模板:" prop="template_show">
<el-input
clearable
v-model="form.template_show"
placeholder="请输入详情模板"/>
</el-form-item>
<el-form-item label="分页条数:" prop="page_size">
<el-input-number
:min="0"
v-model="form.page_size"
placeholder="请输入分页数"
controls-position="right"
class="ele-fluid ele-text-left"/>
</el-form-item>
<el-form-item label="跳转下级:">
<el-radio-group
v-model="form.is_next">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="新窗口打开:">
<el-radio-group
v-model="form.is_blank">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-row>
</el-card>
</el-form>
<div slot="footer">
<el-button @click="updateVisible(false)">取消</el-button>
<el-button
type="primary"
:loading="loading"
@click="save">保存
</el-button>
</div>
</el-dialog>
</template>
<script>
import Treeselect from '@riophae/vue-treeselect';
import '@riophae/vue-treeselect/dist/vue-treeselect.css';
import setting from "@/config/setting";
// import EleIconPicker from 'ele-admin/packages/ele-icon-picker';
export default {
name: 'CateEdit',
components: {Treeselect},
props: {
//
visible: Boolean,
//
data: Object,
//
cateList: Array,
moduleList: Array,
},
data() {
return {
uploadImage: setting.uploadImageUrl,
//
form: this.initFormData(this.data),
//
rules: {
cate_name: [
{required: true, message: '请输入栏目名称', trigger: 'blur'}
],
},
//
loading: false,
//
isUpdate: false
};
},
watch: {
data() {
this.isUpdate = !!(this.data && this.data.id);
this.form = this.initFormData(this.data);
}
},
methods: {
afterUploadImage(response) {
if (response.code != 0 || response.url == '') {
this.$message.error(response.msg)
} else {
this.$set(this.form,'image',response.url)
}
},
afterUploadIcoImage(response) {
if (response.code != 0 || response.url == '') {
this.$message.error(response.msg)
} else {
this.$set(this.form,'ico_image',response.url)
}
},
/* 下拉树格式化 */
normalizer(d) {
return {
id: d.id,
label: d.cate_name,
children: d.children || undefined
};
},
/* 保存编辑 */
save() {
this.$refs['form'].validate((valid) => {
if (valid) {
this.loading = true;
this.$http.post('/Cate/' + (this.isUpdate ? 'edit' : 'add'),
Object.assign({}, this.form, {
parent_id: this.form.parent_id || 0,
module_id: this.form.module_id || 0,
})
).then(res => {
this.loading = false;
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
this.updateVisible(false);
this.$emit('done');
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
this.loading = false;
this.$message.error(e.message);
});
} else {
return false;
}
});
},
/* 更新visible */
updateVisible(value) {
this.$emit('update:visible', value);
},
/* 初始化form数据 */
initFormData(data) {
let form = {
parent_id : 0,
module_id : 0,
is_menu : 1,
status : 1,
is_next:0,
is_blank:0,
};
if (data) {
Object.assign(form, data, {
parent_id: data.parent_id === 0 ? null : data.parent_id,
module_id: data.module_id === 0 ? null : data.module_id,
});
}
return form;
},
}
}
</script>
<style scoped>
</style>

174
src/views/cate/cate-relation-edit.vue

@ -0,0 +1,174 @@
<!-- 编辑弹窗 -->
<template>
<el-dialog
width="720px"
:visible="visible"
:lock-scroll="false"
:destroy-on-close="true"
custom-class="ele-dialog-form"
:title="isUpdate?'修改栏目调用配置':'添加栏目调用配置'"
@update:visible="updateVisible">
<el-form
ref="form"
:model="form"
:rules="rules"
label-width="92px"
@keyup.enter.native="save"
@submit.native.prevent>
<el-row :gutter="15">
<el-form-item label="调用标志:" prop="idf">
<el-input
clearable
v-model="form.idf"
placeholder="请输入调用标志"/>
</el-form-item>
<el-form-item label="使用备注:" prop="remark">
<el-input
clearable
v-model="form.remark"
placeholder="请输入调用标志"/>
</el-form-item>
<el-form-item label="数据栏目:">
<treeselect
:options="cateList"
v-model="form.cate_ids_arr"
:multiple="true"
:defaultExpandLevel="3"
:normalizer="normalizer"
placeholder="请选择栏目"/>
</el-form-item>
<el-form-item label="数据类型:">
<el-radio-group
v-model="form.type">
<el-radio :label="0">栏目自身</el-radio>
<el-radio :label="1">栏目内容</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="状态:">
<el-radio-group
v-model="form.status">
<el-radio :label="1">显示</el-radio>
<el-radio :label="0">隐藏</el-radio>
</el-radio-group>
</el-form-item>
</el-row>
</el-form>
<div slot="footer">
<el-button @click="updateVisible(false)">取消</el-button>
<el-button
type="primary"
:loading="loading"
@click="save">保存
</el-button>
</div>
</el-dialog>
</template>
<script>
import Treeselect from '@riophae/vue-treeselect';
import '@riophae/vue-treeselect/dist/vue-treeselect.css';
export default {
name: 'CateRelationEdit',
components: {Treeselect},
props: {
//
visible: Boolean,
//
data: Object,
//
cateList: Array,
moduleList: Array,
},
data() {
return {
//
form: this.initFormData(this.data),
//
rules: {
idf: [
{required: true, message: '请输入调用名称', trigger: 'blur'}
],
},
//
loading: false,
//
isUpdate: false
};
},
watch: {
data() {
this.isUpdate = !!(this.data && this.data.id);
this.form = this.initFormData(this.data);
}
},
methods: {
/* 下拉树格式化 */
normalizer(d) {
return {
id: d.id,
label: d.cate_name,
children: d.children || undefined
};
},
/* 保存编辑 */
save() {
this.$refs['form'].validate((valid) => {
if (valid) {
this.loading = true;
this.$http.post('/CateRelation/' + (this.isUpdate ? 'edit' : 'add'), Object.assign({}, this.form)
).then(res => {
this.loading = false;
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
this.updateVisible(false);
this.$emit('done');
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
this.loading = false;
this.$message.error(e.message);
});
} else {
return false;
}
});
},
/* 更新visible */
updateVisible(value) {
this.$emit('update:visible', value);
},
/* 初始化form数据 */
initFormData(data) {
let form = {
catd_ids : '',
status : 1,
type:0,
cate_ids_arr:[]
};
if (data) {
let cate_ids_arr = data.cate_ids.split(',')
Object.assign(form, data, {
cate_ids_arr : cate_ids_arr
});
}
return form;
},
}
}
</script>
<style scoped>
</style>

298
src/views/cate/cate-relation.vue

@ -0,0 +1,298 @@
<template>
<div class="ele-body">
<el-card shadow="never">
<!-- 搜索表单 -->
<el-form
:model="where"
label-width="77px"
class="ele-form-search"
@keyup.enter.native="reload"
@submit.native.prevent>
<el-row :gutter="15">
<el-col :md="5" :sm="12">
<el-form-item label="标志:">
<el-input
v-model="where.idf"
placeholder="请输入调用标志"
clearable/>
</el-form-item>
</el-col>
<el-col :md="6" :sm="12">
<div class="ele-form-actions">
<el-button
type="primary"
@click="reload"
icon="el-icon-search"
class="ele-btn-icon">查询
</el-button>
<el-button @click="reset">重置</el-button>
</div>
</el-col>
</el-row>
</el-form>
<!-- 数据表格 -->
<ele-pro-table
ref="table"
:datasource="url"
:columns="columns"
:where="where"
:selection.sync="selection">
<!-- 表头工具栏 -->
<template slot="toolbar">
<el-button
@click="openEdit(null)"
type="primary"
icon="el-icon-plus"
class="ele-btn-icon"
size="small">添加
</el-button>
<el-button
@click="removeBatch"
type="danger"
icon="el-icon-delete"
class="ele-btn-icon"
size="small">删除
</el-button>
</template>
<!-- 状态列 -->
<template slot="status" slot-scope="{row}">
<el-switch
v-model="row.status"
@change="editStatus(row)"
:active-value="1"
:inactive-value="0"/>
</template>
<!-- 操作列 -->
<template slot="action" slot-scope="{row}">
<el-link
@click="openEdit(row)"
icon="el-icon-edit"
type="primary"
:underline="false">修改
</el-link>
<el-popconfirm
title="确定要删除此调用吗?"
@confirm="remove(row)"
class="ele-action">
<el-link
slot="reference"
icon="el-icon-delete"
type="danger"
:underline="false">删除
</el-link>
</el-popconfirm>
</template>
</ele-pro-table>
</el-card>
<!-- 编辑弹窗 -->
<CateRelation-edit
:visible.sync="showEdit"
:data="current"
:cate-list="cateList"
@done="reload"/>
</div>
</template>
<script>
import CateRelationEdit from './cate-relation-edit';
export default {
name: 'cateRelation',
components: {CateRelationEdit},
data() {
return {
//
url: '/CateRelation/index',
//
columns: [
{
columnKey: 'selection',
type: 'selection',
width: 45,
align: 'center',
fixed: 'left'
},
{
columnKey: 'index',
type: 'index',
width: 45,
align: 'center',
fixed: 'left',
showOverflowTooltip: true
},
{
prop: 'idf',
label: '标志',
sortable: false,
showOverflowTooltip: true,
minWidth: 80
},
{
prop: 'remark',
label: '备注',
sortable: false,
showOverflowTooltip: true,
minWidth: 80
},
{
prop: 'cate_strs',
label: '调用栏目',
sortable: false,
showOverflowTooltip: true,
minWidth: 60
},
{
prop: 'create_time',
label: '创建时间',
sortable: 'custom',
showOverflowTooltip: true,
minWidth: 100,
formatter: (row, column, cellValue) => {
return this.$util.toDateString(cellValue);
}
},
{
prop: 'status',
label: '状态',
align: 'center',
sortable: 'custom',
width: 80,
resizable: false,
slot: 'status'
},
{
columnKey: 'action',
label: '操作',
width: 150,
align: 'center',
resizable: false,
slot: 'action'
}
],
//
where: {},
//
selection: [],
cateList:[],
//
current: null,
//
showEdit: false,
//
showImport: false
}
},
mounted() {
this.getCateLists()
},
methods: {
/* 查询栏目列表 */
getCateLists(){
this.$http.get('/Cate/index?limit=1000').then(res => {
if (res.data.code === 0) {
this.parseData(res.data)
}
})
},
/* 刷新表格 */
reload() {
this.$refs.table.reload({page: 1});
},
/* 重置搜索 */
reset() {
this.where = {};
this.$nextTick(() => {
this.reload();
});
},
/* 解析接口返回数据 */
parseData(res) {
console.log(res.data)
res.data = this.$util.toTreeData(res.data, 'id', 'parent_id');
this.cateList = res.data;
return res;
},
/* 显示编辑 */
openEdit(row) {
this.current = row;
this.showEdit = true;
},
/* 删除 */
remove(row) {
const loading = this.$loading({lock: true});
let formData = new FormData();
formData.append('id', row.id);
this.$http.post('/CateRelation/delete/', formData).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
this.reload();
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
},
/* 批量删除 */
removeBatch() {
if (!this.selection.length) {
this.$message.error('请至少选择一条数据')
return;
}
this.$confirm('确定要删除选中的碎片吗?', '提示', {
type: 'warning'
}).then(() => {
const loading = this.$loading({lock: true});
let formData = new FormData();
formData.append('id', this.selection.map(d => d.id));
this.$http.post('/CateRelation/delete/', formData).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
this.reload();
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
}).catch(() => {
});
},
/* 更改状态 */
editStatus(row) {
const loading = this.$loading({lock: true});
let params = new FormData();
params.append('status', row.status);
params.append('id', row.id);
this.$http.post('/CateRelation/status', params).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
} else {
row.status = !row.status ? 1 : 0;
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
}
}
}
</script>
<style scoped>
</style>

367
src/views/cate/index.vue

@ -0,0 +1,367 @@
<template>
<div class="ele-body">
<el-card shadow="never">
<!-- 搜索表单 -->
<el-form
:model="where"
label-width="77px"
class="ele-form-search"
@keyup.enter.native="reload"
@submit.native.prevent>
<el-row :gutter="15">
<el-col :md="6" :sm="12">
<el-form-item label="栏目名称:">
<el-input
v-model="where.catename"
placeholder="请输入"
clearable/>
</el-form-item>
</el-col>
<el-col :md="6" :sm="12">
<el-form-item label="选择模型:">
<el-select
v-model="where.module_id"
class="ele-fluid"
placeholder="请选择模型"
>
<el-option
v-for="item in moduleLists"
:key="item.module_id"
:label="item.module_name"
:value="item.module_id">
<span style="padding-left: 8px;">{{ item.module_name }}</span>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :md="12" :sm="12">
<div class="ele-form-actions">
<el-button
type="primary"
@click="reload"
icon="el-icon-search"
class="ele-btn-icon">查询
</el-button>
<el-button @click="reset">重置</el-button>
</div>
</el-col>
</el-row>
</el-form>
<!-- 数据表格 -->
<ele-pro-table
ref="table"
:datasource="url"
:columns="columns"
:where="where"
:parse-data="parseData"
row-key="id"
height="calc(100vh - 265px)"
default-expand-all
:need-page="false">
<!-- 表头工具栏 -->
<template slot="toolbar">
<el-button
@click="openEdit(null)"
type="primary"
icon="el-icon-plus"
class="ele-btn-icon"
size="small">添加
</el-button>
<el-button
@click="expandAll"
class="ele-btn-icon"
size="small">展开全部
</el-button>
<el-button
@click="foldAll"
class="ele-btn-icon"
size="small">折叠全部
</el-button>
</template>
<!-- 标题列 -->
<template slot="cate_name" slot-scope="{row}">
{{ row.cate_name }}
</template>
<!-- 类型列 -->
<template slot="is_menu" slot-scope="{row}">
<el-tag
:type="['info','primary'][row.is_menu]"
size="mini">
{{ [ '隐藏','显示'][row.is_menu] }}
</el-tag>
</template>
<!-- 跳转下级 -->
<template slot="is_next" slot-scope="{row}">
<el-tag
:type="['info','primary'][row.is_next]"
size="mini">
{{ ['否','是'][row.is_next] }}
</el-tag>
</template>
<!-- 状态列 -->
<template slot="status" slot-scope="{row}">
<el-switch
v-model="row.status"
@change="editStatus(row)"
:active-value="1"
:inactive-value="0"/>
</template>
<!-- 操作列 -->
<template slot="action" slot-scope="{row}">
<el-link
@click="openEdit(null, row.id)"
icon="el-icon-plus"
type="primary"
:underline="false">添加
</el-link>
<el-link
@click="openEdit(row)"
icon="el-icon-edit"
type="primary"
:underline="false">修改
</el-link>
<el-popconfirm
title="确定要删除栏目吗?"
@confirm="remove(row)"
class="ele-action">
<el-link
slot="reference"
icon="el-icon-delete"
type="danger"
:underline="false">删除
</el-link>
</el-popconfirm>
</template>
</ele-pro-table>
</el-card>
<!-- 编辑弹窗 -->
<cate-edit
:visible.sync="showEdit"
:data="current"
:cate-list="cateList"
:module-list="moduleLists"
@done="reload"/>
</div>
</template>
<script>
import CateEdit from './cate-edit';
export default {
name: 'Cate',
components: {CateEdit},
data() {
return {
//
url: '/Cate/index',
//
columns: [
{
columnKey: 'index',
type: 'index',
width: 45,
align: 'center',
fixed: 'left',
showOverflowTooltip: true
},
{
prop: 'cate_name',
label: '栏目名称',
showOverflowTooltip: true,
minWidth: 160,
slot: 'cate_name'
},
{
prop: 'module_name',
label: '所属模块',
showOverflowTooltip: true,
minWidth: 160,
},
{
prop: 'en_name',
label: '英文名称',
showOverflowTooltip: true,
minWidth: 110
},
{
prop: 'cate_folder',
label: '栏目目录',
showOverflowTooltip: true,
minWidth: 110
},
{
prop: 'is_menu',
label: '导航状态',
showOverflowTooltip: true,
minWidth: 100,
slot: 'is_menu'
},
{
prop: 'is_next',
label: '跳转下级',
showOverflowTooltip: true,
minWidth: 100,
slot: 'is_next'
},
{
prop: 'sort',
label: '排序',
align: 'center',
showOverflowTooltip: true,
width: 60
},
{
prop: 'status',
label: '状态',
align: 'center',
sortable: 'custom',
width: 80,
resizable: false,
slot: 'status'
},
{
prop: 'create_time',
label: '创建时间',
showOverflowTooltip: true,
minWidth: 110,
formatter: (row, column, cellValue) => {
return this.$util.toDateString(cellValue);
}
},
{
columnKey: 'action',
label: '操作',
width: 190,
align: 'center',
resizable: false,
slot: 'action'
}
],
//
where: {},
//
selection: [],
//
current: null,
//
showEdit: false,
//
cateList: [],
moduleLists:[],
}
},
mounted() {
this.getModuleLists()
},
methods: {
/* 查询模型列表 */
getModuleLists(){
this.$http.get('/Module/index?limit=100').then(res => {
if (res.data.code === 0) {
var moduleLists = [];
var tmp = {}
tmp['module_id'] = '0'
tmp['module_name'] = '请选择'
moduleLists[0] = tmp
var data_tmp = res.data.data;
for(var i =0;i<=res.data.data.length;i++){
tmp = {}
if(data_tmp[i]){
tmp['module_id'] = data_tmp[i]['id']
tmp['module_name'] = data_tmp[i]['module_name']
moduleLists[i+1] = tmp ;
}
}
this.moduleLists = moduleLists;
}
})
},
/* 解析接口返回数据 */
parseData(res) {
res.data = this.$util.toTreeData(res.data, 'id', 'parent_id');
this.cateList = res.data;
return res;
},
/* 刷新表格 */
reload() {
this.$refs.table.reload();
},
/* 重置搜索 */
reset() {
this.where = {};
this.$nextTick(() => {
this.reload();
});
},
/* 显示编辑 */
openEdit(row, parent_id) {
this.current = Object.assign({
parent_id: parent_id
}, row);
this.showEdit = true;
},
/* 删除 */
remove(row) {
if (row.children && row.children.length > 0) {
this.$message.error('请先删除子节点');
return;
}
const loading = this.$loading({lock: true});
this.$http.get('/Cate/delete/id/' + row.id).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
this.reload();
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
},
/* 更改状态 */
editStatus(row) {
const loading = this.$loading({lock: true});
let params = new FormData();
params.append('status', row.status);
params.append('en_name', row.en_name);
params.append('id', row.id);
this.$http.post('/Cate/status', params).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
} else {
row.status = !row.status ? 1 : 0;
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
},
/* 展开全部 */
expandAll() {
this.$refs.table.data.forEach(d => {
this.$refs.table.toggleRowExpansion(d, true);
});
},
/* 折叠全部 */
foldAll() {
this.$refs.table.data.forEach(d => {
this.$refs.table.toggleRowExpansion(d, false);
});
}
}
}
</script>
<style scoped>
</style>

404
src/views/config/index.vue

@ -0,0 +1,404 @@
<template>
<div class="ele-body" id="table" v-show="loaded">
<el-row :gutter="15">
<el-col>
<el-card shadow="never" body-style="padding-top: 5px;">
<el-tabs v-model="active" class="user-info-tabs">
<el-tab-pane label="基础设置" name="base">
<el-form
ref="configForm"
:model="form"
:rules="rules"
label-width="110px"
style="max-width: 450px;padding-top: 40px;"
@keyup.enter.native="save"
@submit.native.prevent>
<el-form-item label="网站名称:" prop="name">
<el-input
v-model="form.name"
placeholder="请输入网站名称"
auto-complete="on"
clearable/>
</el-form-item>
<el-form-item label="网站域名:" prop="host">
<el-input
v-model="form.host"
placeholder="请输入网站域名"
clearable/>
</el-form-item>
<el-form-item label="电脑端Logo">
<el-row>
<el-col>
<el-input
v-model="form.logo"
placeholder="请上传电脑端Logo"
clearable/>
<el-upload
class="upload-demo"
:show-file-list="false"
:action="this.uploadImage+'?upload_type=img'"
:on-success="afterUploadLogo">
<img v-if="form.logo" :src="form.logo" width="150" height="150" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="手机端Logo:" prop="logo_phone">
<el-input
v-model="form.logo_phone"
placeholder="请上传手机端Logo"
clearable/>
</el-form-item>
<el-form-item label="电脑端Icon:" prop="icon">
<el-input
v-model="form.icon"
placeholder="请上传电脑端电脑端Icon"
clearable/>
</el-form-item>
<el-form-item label="手机端Icon:" prop="icon_phone">
<el-input
v-model="form.icon_phone"
placeholder="请上传手机端Icon"
clearable/>
</el-form-item>
<el-form-item label="网站备案号:" prop="record">
<el-input
v-model="form.record"
placeholder="请输入网站备案号"
clearable/>
</el-form-item>
<el-form-item label="公安备案号:" prop="public_security_record">
<el-input
v-model="form.public_security_record"
placeholder="请输入网站公安备案号"
clearable/>
</el-form-item>
<el-form-item label="版权信息:" prop="copyright">
<el-input
v-model="form.copyright"
placeholder="请输入版权信息"
:rows="4"
type="textarea"
clearable/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@click="save"
:loading="loading">保存更改
</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="SEO配置" name="seo">
<el-form
ref="configSeoForm"
:model="form"
:rules="rules"
label-width="110px"
style="max-width: 450px;padding-top: 40px;"
@keyup.enter.native="save"
@submit.native.prevent>
<el-form-item label="SEO标题:" prop="seo_title">
<el-input
v-model="form.seo_title"
placeholder="请输入SEO标题"
clearable/>
</el-form-item>
<el-form-item label="SEO关键词:" prop="seo_keyword">
<el-input
v-model="form.seo_keyword"
placeholder="请输入SEO关键词"
clearable/>
</el-form-item>
<el-form-item label="SEO描述:" prop="seo_description">
<el-input
v-model="form.seo_description"
placeholder="请输入SEO描述"
:rows="4"
type="textarea"/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@click="saveSeo"
:loading="loading">保存更改
</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="联系方式" name="contact">
<el-form
ref="configContactForm"
:model="form"
:rules="rules"
label-width="110px"
style="max-width: 450px;padding-top: 40px;"
@keyup.enter.native="save"
@submit.native.prevent>
<el-form-item label="联系人:" prop="contact_person">
<el-input
v-model="form.contact_person"
placeholder="请输入联系人姓名"
clearable/>
</el-form-item>
<el-form-item label="公司地址:" prop="address">
<el-input
v-model="form.address"
placeholder="请输入公司地址"
clearable/>
</el-form-item>
<el-form-item label="QQ客服:" prop="qq">
<el-input
v-model="form.qq"
placeholder="请输入QQ客服"
clearable/>
</el-form-item>
<el-form-item label="联系电话:" prop="tel">
<el-input
v-model="form.tel"
placeholder="请输入联系电话"
clearable/>
</el-form-item>
<el-form-item label="400电话:" prop="tel_400">
<el-input
v-model="form.tel_400"
placeholder="请输入400电话"
clearable/>
</el-form-item>
<el-form-item label="手机号码:" prop="phone">
<el-input
v-model="form.phone"
placeholder="请输入手机号码"
clearable/>
</el-form-item>
<el-form-item label="传真号码:" prop="fax">
<el-input
v-model="form.fax"
placeholder="请输入传真号码"
clearable/>
</el-form-item>
<el-form-item label="邮箱:" prop="email">
<el-input
v-model="form.email"
placeholder="请输入邮箱"
clearable/>
</el-form-item>
<el-form-item label="公众号二维码:" prop="qrcode_wechat">
<el-input
v-model="form.qrcode_wechat"
placeholder="请上传公众号二维码"
clearable/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@click="saveContact"
:loading="loading">保存更改
</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="统计代码" name="jscode">
<el-form
ref="configJscodeForm"
:model="form"
:rules="rules"
label-width="110px"
style="max-width: 450px;padding-top: 40px;"
@keyup.enter.native="save"
@submit.native.prevent>
<el-form-item label="统计代码:" prop="js_code">
<el-input
v-model="form.js_code"
placeholder="请输入统计代码"
:rows="4"
type="textarea"
clearable/>
</el-form-item>
<el-form-item label="客服代码:" prop="js_code_service">
<el-input
v-model="form.js_code_service"
placeholder="请输入客服代码"
:rows="4"
type="textarea"
clearable/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@click="saveJscode"
:loading="loading">保存更改
</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
</el-tabs>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script>
import setting from "@/config/setting";
export default {
name: 'ConfigIndex',
data() {
return {
uploadImage: setting.uploadImageUrl,
// tab
active: 'base',
labelPosition: 'left',
//
form: {},
//
rules: {
name: [
{required: true, message: '请输入网站名称', trigger: 'blur'}
],
host: [
{required: true, message: '请输入网站域名', trigger: 'blur'}
],
},
// loading
loading: false,
//
showCropper: false,
//
loaded: false,
}
},
created() {
this.loading = true;
this.$http.get('/config/index').then(res => {
this.loading = false;
if (res.data.code === 0) {
this.form = res.data.data;
} else {
this.$message.error(res.data.msg);
}
this.loaded = true;
}).catch(e => {
this.$message.error(e.message);
});
},
methods: {
afterUploadLogo(response) {
if (response.code != 0 || response.url == '') {
this.$message.error(response.msg)
} else {
this.form.logo = response.url
}
},
/* 保存更改 */
save() {
this.$refs['configForm'].validate((valid) => {
return this.postSave(valid);
});
},
saveSeo() {
this.$refs['configSeoForm'].validate((valid) => {
return this.postSave(valid);
});
},
saveContact() {
this.$refs['configContactForm'].validate((valid) => {
return this.postSave(valid);
});
},
saveJscode() {
this.$refs['configJscodeForm'].validate((valid) => {
return this.postSave(valid);
});
},
postSave(valid) {
if (!valid) {
return false;
}
this.loading = true;
this.$http.post('/config/save', this.form).then(res => {
this.loading = false;
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
this.loading = false;
this.$message.error(e.message);
});
},
}
}
</script>
<style scoped>
.ele-body {
padding-bottom: 0;
}
.el-card {
margin-bottom: 15px;
}
/* tab页签 */
.user-info-tabs ::v-deep .el-tabs__nav-wrap {
padding-left: 20px;
}
/* 电脑端头像 */
.upload-demo{
padding-top: 15px;
}
.avatar-uploader-icon {
border: 1px solid #D9D9D9;
font-size: 28px;
color: #409EFF;
width: 148px;
height: 148px;
line-height: 148px;
text-align: center;
border-radius: 6px;
}
.avatar-uploader-icon:hover {
border-color: #409EFF;
}
.avatar {
display: block;
width: 150px;
height: 150px;
border-radius: 6px;
}
</style>

470
src/views/config/message.vue

@ -0,0 +1,470 @@
<template>
<div class="ele-body">
<el-card shadow="never" body-style="padding:0;">
<div class="ele-cell ele-cell-align-top ele-user-message">
<el-menu
:default-active="active"
:mode="mode"
@select="query">
<el-menu-item index="0">
<span>全部消息</span>
<el-badge
v-if="allUnReadNum"
:value="allUnReadNum"
class="ele-badge-static"/>
</el-menu-item>
<el-menu-item index="1">
<span>系统通知</span>
<el-badge
v-if="unReadNum1"
:value="unReadNum1"
class="ele-badge-static"/>
</el-menu-item>
<el-menu-item index="2">
<span>用户私信</span>
<el-badge
v-if="unReadNum2"
:value="unReadNum2"
class="ele-badge-static"/>
</el-menu-item>
<el-menu-item index="3">
<span>代办事项</span>
<el-badge
v-if="unReadNum3"
:value="unReadNum3"
class="ele-badge-static"/>
</el-menu-item>
</el-menu>
<div class="ele-cell-content">
<!-- 数据表格 -->
<ele-pro-table
ref="table"
:datasource="data"
:columns="columns"
:selection.sync="choose">
<template slot="toolbar">
<el-button
size="small"
@click="read"
type="primary"
plain>标记已读
</el-button>
<el-button
size="small"
@click="readAll"
type="primary"
plain>全部已读
</el-button>
<el-button
size="small"
@click="remove()"
type="danger"
plain>删除消息
</el-button>
</template>
<template slot="state" slot-scope="{row}">
<span :class="['ele-text-danger','ele-text-info'][row.state]">
{{ ['未读', '已读'][row.state] }}
</span>
</template>
<template slot="action" slot-scope="{row}">
<el-link
@click="view(row)"
icon="el-icon-view"
type="primary"
:underline="false">查看
</el-link>
<el-popconfirm
title="确定要删除此消息吗?"
@confirm="remove(row)"
class="ele-action">
<el-link
slot="reference"
icon="el-icon-delete"
type="danger"
:underline="false">删除
</el-link>
</el-popconfirm>
</template>
</ele-pro-table>
</div>
</div>
</el-card>
</div>
</template>
<script>
export default {
name: 'UserMessage',
data() {
return {
//
active: '0',
//
data: [],
columns: [
{
columnKey: 'selection',
type: 'selection',
width: 45,
align: 'center',
fixed: 'left'
},
{
columnKey: 'index',
type: 'index',
width: 45,
align: 'center',
fixed: 'left',
showOverflowTooltip: true
},
{
prop: 'title',
label: '标题内容',
showOverflowTooltip: true,
minWidth: 110
},
{
prop: 'time',
label: '时间',
align: 'center',
showOverflowTooltip: true,
width: 140
},
{
prop: 'state',
label: '状态',
align: 'center',
showOverflowTooltip: true,
width: 80,
slot: 'state'
},
{
columnKey: 'action',
label: '操作',
align: 'center',
showOverflowTooltip: true,
width: 140,
fixed: 'right',
resizable: false,
slot: 'action'
}
],
//
choose: [],
//
allData: [
{
title: '你有两条任务待完成,不要忘了哦~',
type: 3,
time: '2020-07-24 11:35',
state: 0
},
{
title: '你有两条任务待完成,不要忘了哦~',
type: 3,
time: '2020-07-24 11:35',
state: 0
},
{
title: '你有两条任务待完成,不要忘了哦~',
type: 3,
time: '2020-07-24 11:35',
state: 0
},
{
title: '你有两条任务待完成,不要忘了哦~',
type: 3,
time: '2020-07-24 11:35',
state: 0
},
{
title: '你有两条任务待完成,不要忘了哦~',
type: 3,
time: '2020-07-24 11:35',
state: 1
},
{
title: '你有两条任务待完成,不要忘了哦~',
type: 3,
time: '2020-07-24 11:35',
state: 1
},
{
title: '你有两条任务待完成,不要忘了哦~',
type: 3,
time: '2020-07-24 11:35',
state: 1
},
{
title: '你有两条任务待完成,不要忘了哦~',
type: 3,
time: '2020-07-24 11:35',
state: 1
},
{
title: '你有两条任务待完成,不要忘了哦~',
type: 3,
time: '2020-07-24 11:35',
state: 1
},
{
title: '你有两条任务待完成,不要忘了哦~',
type: 3,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'Jasmine给你发来了一条私信',
type: 2,
time: '2020-07-24 11:35',
state: 0
},
{
title: 'Jasmine给你发来了一条私信',
type: 2,
time: '2020-07-24 11:35',
state: 0
},
{
title: 'Jasmine给你发来了一条私信',
type: 2,
time: '2020-07-24 11:35',
state: 0
},
{
title: 'Jasmine给你发来了一条私信',
type: 2,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'Jasmine给你发来了一条私信',
type: 2,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'Jasmine给你发来了一条私信',
type: 2,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'Jasmine给你发来了一条私信',
type: 2,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'Jasmine给你发来了一条私信',
type: 2,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'Jasmine给你发来了一条私信',
type: 2,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'Jasmine给你发来了一条私信',
type: 2,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'EleAdmin新版本发布,欢迎体验',
type: 1,
time: '2020-07-24 11:35',
state: 0
},
{
title: 'EleAdmin新版本发布,欢迎体验',
type: 1,
time: '2020-07-24 11:35',
state: 0
},
{
title: 'EleAdmin新版本发布,欢迎体验',
type: 1,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'EleAdmin新版本发布,欢迎体验',
type: 1,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'EleAdmin新版本发布,欢迎体验',
type: 1,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'EleAdmin新版本发布,欢迎体验',
type: 1,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'EleAdmin新版本发布,欢迎体验',
type: 1, time: '2020-07-24 11:35',
state: 1
},
{
title: 'EleAdmin新版本发布,欢迎体验',
type: 1,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'EleAdmin新版本发布,欢迎体验',
type: 1,
time: '2020-07-24 11:35',
state: 1
},
{
title: 'EleAdmin新版本发布,欢迎体验',
type: 1,
time: '2020-07-24 11:35',
state: 1
}
]
}
},
computed: {
//
mode() {
return this.$store.state.theme.screenWidth < 768 ? 'horizontal' : 'vertical';
},
//
allUnReadNum() {
return this.allData.filter(d => d.state === 0).length;
},
//
unReadNum1() {
return this.allData.filter(d => d.state === 0 && d.type === 1).length;
},
//
unReadNum2() {
return this.allData.filter(d => d.state === 0 && d.type === 2).length;
},
//
unReadNum3() {
return this.allData.filter(d => d.state === 0 && d.type === 3).length;
}
},
mounted() {
this.query();
},
methods: {
/* 查询数据 */
query(index) {
this.active = index || '0';
if (this.active === '0') {
this.data = this.allData;
} else {
this.data = this.allData.filter(d => String(d.type) === this.active);
}
},
/* 查看 */
view(row) {
console.log(row);
this.$message('点击了查看');
},
/* 删除 */
remove(row) {
if (row) {
//
this.data.splice(this.data.indexOf(row), 1);
this.$message({type: 'success', message: '删除成功'});
} else {
//
if (this.choose.length === 0) {
return this.$message.error('请至少选择一条数据');
}
this.$confirm('确定要删除选中的消息吗?', '提示', {
type: 'warning'
}).then(() => {
this.choose.forEach(d => {
this.data.splice(this.data.indexOf(d), 1);
});
this.$message({type: 'success', message: '删除成功'});
}).catch(() => {
});
}
},
/* 标记已读 */
read() {
if (this.choose.length === 0) {
return this.$message.error('请至少选择一条数据');
}
this.choose.forEach(d => {
this.data[this.data.indexOf(d)].state = 1;
});
},
/* 全部标记已读 */
readAll() {
this.data.forEach(d => {
d.state = 1;
});
}
}
}
</script>
<style scoped>
.ele-user-message ::v-deep .el-menu {
flex-shrink: 0;
}
.ele-user-message .ele-cell-content {
padding: 15px;
box-sizing: border-box;
overflow: auto;
}
.ele-user-message .ele-badge-static {
margin-left: 10px;
}
@media screen and (min-width: 768px) {
.ele-user-message ::v-deep .el-menu-item {
min-width: 150px;
text-align: right;
border-right: 2px solid transparent;
}
.ele-user-message ::v-deep .el-menu-item:first-child {
margin-top: 15px;
}
}
@media screen and (max-width: 768px) {
.ele-user-message {
display: block;
}
.ele-user-message ::v-deep .el-menu-item {
height: 45px;
line-height: 45px;
padding: 0 5px;
display: inline-block;
float: none;
}
.ele-user-message ::v-deep .el-menu {
text-align: center;
white-space: nowrap;
overflow: auto;
}
.ele-user-message .ele-badge-static {
margin-left: 3px;
}
}
</style>

240
src/views/content/content-edit.vue

@ -0,0 +1,240 @@
<!-- 用户编辑弹窗 -->
<template>
<el-dialog
:title="isUpdate?'修改用户':'添加用户'"
:visible="visible"
width="600px"
:destroy-on-close="true"
:lock-scroll="false"
custom-class="ele-dialog-form"
@update:visible="updateVisible">
<el-form
:model="form"
ref="form"
:rules="rules"
label-width="82px">
<el-row :gutter="15">
<el-col :sm="12">
<el-form-item label="所属机构:">
<treeselect
v-model="form.organizationId"
:options="organizationList"
placeholder="请选择所属机构"
:defaultExpandLevel="4"
:normalizer="normalizer"/>
</el-form-item>
<el-form-item
label="用户账号:"
prop="username">
<el-input
v-model="form.username"
placeholder="请输入账号"
clearable
:disabled="isUpdate"/>
</el-form-item>
<el-form-item
label="用户名:"
prop="nickname">
<el-input
v-model="form.nickname"
placeholder="请输入用户名"
clearable/>
</el-form-item>
<el-form-item
label="性别:"
prop="sex">
<el-select
v-model="form.sex"
placeholder="请选择性别"
class="ele-block"
clearable>
<el-option label="男" :value="1"/>
<el-option label="女" :value="2"/>
</el-select>
</el-form-item>
<el-form-item
label="角色:"
prop="roleIds">
<el-select
v-model="form.roleIds"
placeholder="请选择角色"
class="ele-block"
clearable
multiple>
<el-option
v-for="(item,index) in roleList"
:key="index"
:label="item.roleName"
:value="item.roleId"/>
</el-select>
</el-form-item>
</el-col>
<el-col :sm="12">
<el-form-item label="手机号:">
<el-input
v-model="form.phone"
placeholder="请输入手机号"
clearable/>
</el-form-item>
<el-form-item label="邮箱:">
<el-input
v-model="form.email"
placeholder="请输入邮箱"
clearable/>
</el-form-item>
<el-form-item label="个人简介:">
<el-input
v-model="form.introduction"
placeholder="请输入个人简介"
:rows="4"
type="textarea"/>
</el-form-item>
<el-form-item
v-if="!isUpdate"
label="登录密码:"
prop="password">
<el-input
v-model="form.password"
placeholder="请输入登录密码"
show-password/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer">
<el-button @click="updateVisible(false)">取消</el-button>
<el-button
type="primary"
@click="save"
:loading="loading">保存
</el-button>
</div>
</el-dialog>
</template>
<script>
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
name: 'ContentEdit',
components: {Treeselect},
props: {
//
visible: Boolean,
//
data: Object,
//
organizationList: Array,
// id
organizationId: Number
},
data() {
return {
//
form: Object.assign({}, this.data, {
organizationId: this.organizationId
}),
//
rules: {
username: [
{required: true, message: '请输入账号', trigger: 'blur'}
],
nickname: [
{required: true, message: '请输入用户名', trigger: 'blur'}
],
sex: [
{required: true, message: '请选择性别', trigger: 'blur'}
],
roleIds: [
{required: true, message: '请选择角色', trigger: 'blur'}
],
password: [
{required: true, message: '请输入登录密码', trigger: 'blur'}
]
},
//
loading: false,
//
isUpdate: false,
//
roleList: []
}
},
watch: {
data() {
if (this.data) {
this.form = Object.assign({}, this.data, {
roleIds: this.data.roles.map(d => d.roleId)
});
this.isUpdate = true;
} else {
this.form = {organizationId: this.organizationId};
this.isUpdate = false;
}
},
organizationId() {
if (!this.isUpdate) {
this.form = {organizationId: this.organizationId};
}
}
},
mounted() {
// this.queryRoles(); //
},
methods: {
/* 下拉树组件格式化数据 */
normalizer(d) {
return {
id: d.organizationId,
label: d.organizationName
};
},
/* 保存编辑 */
save() {
this.$refs['form'].validate((valid) => {
if (valid) {
this.loading = true;
this.$http[this.isUpdate ? 'put' : 'post']('/sys/user', this.form).then(res => {
this.loading = false;
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
if (!this.isUpdate) {
this.form = {};
}
this.updateVisible(false);
this.$emit('done');
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
this.loading = false;
this.$message.error(e.message);
});
} else {
return false;
}
});
},
/* 更新visible */
updateVisible(value) {
this.$emit('update:visible', value);
},
/* 查询角色列表 */
queryRoles() {
this.$http.get('/sys/role').then(res => {
if (res.data.code === 0) {
this.roleList = res.data.data;
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
this.$message.error(e.message);
});
}
}
}
</script>
<style scoped>
</style>

234
src/views/content/content-list.vue

@ -0,0 +1,234 @@
<template>
<div>
<!-- 数据表格 -->
<ele-pro-table
ref="table"
:datasource="url"
:columns="columns"
:where="where"
height="calc(100vh - 261px)"
tool-class="ele-toolbar-form">
<!-- 表头工具栏 -->
<template slot="toolbar">
<el-form
:model="where"
class="ele-form-search"
size="small"
@keyup.enter.native="reload"
@submit.native.prevent>
<el-row :gutter="10">
<el-col :md="8">
<el-form-item>
<el-input
v-model="where.title"
placeholder="请输入标题"
clearable
size="small"/>
</el-form-item>
</el-col>
<el-col :md="15">
<div class="ele-form-actions">
<el-button
type="primary"
@click="reload"
icon="el-icon-search"
class="ele-btn-icon"
size="small">查询
</el-button>
<el-button
@click="openEdit(null)"
type="primary"
icon="el-icon-plus"
class="ele-btn-icon"
size="small">添加
</el-button>
</div>
</el-col>
</el-row>
</el-form>
</template>
<!-- 角色列 -->
<!-- 状态列 -->
<template slot="state" slot-scope="{row}">
<el-switch
v-model="row.status"
@change="editState(row)"
:active-value="1"
:inactive-value="0"/>
</template>
<!-- 操作列 -->
<template slot="action" slot-scope="{row}">
<el-link
@click="openEdit(row)"
icon="el-icon-edit"
type="primary"
:underline="false">修改
</el-link>
<el-popconfirm
title="确定要删除此用户吗?"
@confirm="remove(row)"
class="ele-action">
<el-link
slot="reference"
icon="el-icon-delete"
type="danger"
:underline="false">删除
</el-link>
</el-popconfirm>
</template>
</ele-pro-table>
<!-- 编辑弹窗 -->
<content-edit
:visible.sync="showEdit"
:data="current"
:cate_list="cate_list"
:cate_id="cate_id"
@done="reload"/>
</div>
</template>
<script>
import ContentEdit from './content-edit';
export default {
name: 'contentList',
components: {ContentEdit},
props: {
// id
cate_id: Number,
//
cate_list: Array
},
data() {
return {
//
url: '/content/index',
//
columns: [
{
columnKey: 'index',
type: 'index',
width: 45,
align: 'center',
fixed: 'left',
showOverflowTooltip: true
},
{
prop: 'title',
label: '标题',
sortable: 'custom',
showOverflowTooltip: true,
minWidth: 110
},
{
prop: 'createTime',
label: '创建时间',
sortable: 'custom',
showOverflowTooltip: true,
minWidth: 110,
formatter: (row, column, cellValue) => {
return this.$util.toDateString(cellValue);
}
},
{
prop: 'status',
label: '状态',
align: 'center',
sortable: 'custom',
width: 80,
resizable: false,
slot: 'state'
},
{
prop: 'sort',
label: '排序',
align: 'center',
sortable: 'custom',
width: 80,
},
{
columnKey: 'action',
label: '操作',
width: 130,
align: 'center',
resizable: false,
slot: 'action'
}
],
response: {
statusName: 'code', // (xxx.xxx)
statusCode: 0, // 200
msgName: 'msg', //
dataName: 'data.content_data', // result.list
countName: 'count' //
},
//
where: {
cate_id: this.cate_id
},
//
current: null,
//
showEdit: false
}
},
methods: {
/* 刷新表格 */
reload() {
this.$refs.table.reload({page: 1});
},
/* 显示编辑 */
openEdit(row) {
this.current = row;
this.showEdit = true;
},
/* 删除 */
remove(row) {
const loading = this.$loading({lock: true});
this.$http.get('/Content/delete/id/' + row.id).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
this.reload();
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
},
/* 更改状态 */
editState(row) {
const loading = this.$loading({lock: true});
let params = new FormData();
params.append('status', row.status);
this.$http.put('/Content/status/' + row.id, params).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
} else {
row.state = !row.state ? 1 : 0;
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
}
},
watch: {
// id
cate_id() {
this.where.cate_id = this.cate_id;
this.reload();
}
}
}
</script>
<style scoped>
</style>

105
src/views/content/index.vue

@ -0,0 +1,105 @@
<template>
<div class="ele-body">
<el-card
shadow="never"
v-loading="loading"
body-style="padding-bottom: 0;">
<el-row :gutter="15">
<el-col :md="6" style="margin-bottom: 15px;">
<!-- 机构列表 -->
<div class="org-tree-group">
<el-tree
ref="tree"
:data="data"
:props="{label: 'cate_name'}"
:expand-on-click-node="false"
node-key="id"
:default-expand-all="false"
@node-click="onNodeClick"
highlight-current/>
</div>
</el-col>
<!-- 内容列表 -->
<el-col :md="18" style="margin-bottom: 15px;">
<content-list
v-if="current"
:cate_id="current.id"
:cate_list="data" />
</el-col>
</el-row>
</el-card>
</div>
</template>
<script>
import ContentList from './content-list';
export default {
name: 'Content',
components: {ContentList},
data() {
return {
//
loading: true,
//
data: [],
//
current: null,
//
showEdit: false,
//
editData: null
}
},
mounted() {
this.query();
},
methods: {
/* 查询 */
query() {
this.loading = true;
this.$http.get('/Cate/index').then(res => {
this.loading = false;
if (res.data.code === 0) {
this.data = this.$util.toTreeData(res.data.data, 'id', 'parent_id');
this.$nextTick(() => {
this.onNodeClick(this.data[0]);
});
} else {
this.$message.error(res.data.msg || '获取数据失败');
}
}).catch(e => {
this.loading = false;
this.$message.error(e.message);
});
},
/* 选择数据 */
onNodeClick(row) {
if (row != null) {
this.current = row;
this.$refs.tree.setCurrentKey(row.id);
} else {
this.current = null;
}
},
}
}
</script>
<style scoped>
.org-tree-group {
border: 1px solid hsla(0, 0%, 60%, .15);
height: calc(100vh - 262px);
box-sizing: border-box;
overflow: auto;
}
.org-tree-group ::v-deep .el-tree-node__content {
height: 40px;
}
.org-tree-group ::v-deep .el-tree-node__content > .el-tree-node__expand-icon {
margin-left: 10px;
}
</style>

559
src/views/dashboard/analysis.vue

@ -0,0 +1,559 @@
<template>
<div class="ele-body ele-body-card">
<!-- 顶部统计卡片 -->
<el-row :gutter="15">
<el-col :md="6" :sm="12">
<el-card class="analysis-chart-card" shadow="never">
<div slot="header">
<span>总销售额</span>
<el-tooltip content="指标说明" placement="top">
<i
class="el-icon-_question ele-pull-right ele-text-placeholder"
style="cursor: pointer;">
</i>
</el-tooltip>
</div>
<div class="analysis-chart-card-num">¥ 126,560</div>
<div class="analysis-chart-card-content" style="padding-top: 18px;">
<span class="ele-action">
<span>周同比12%</span>
<i class="el-icon-caret-top ele-text-danger"></i>
</span>
<span class="ele-action">
<span>日同比11%</span>
<i class="el-icon-caret-bottom ele-text-success"></i>
</span>
</div>
<el-divider/>
<div class="analysis-chart-card-text">日销售额 12,423</div>
</el-card>
</el-col>
<el-col :md="6" :sm="12">
<el-card class="analysis-chart-card" shadow="never">
<div slot="header">
<span>访问量</span>
<el-tag
type="danger"
size="mini"
class="ele-pull-right">
</el-tag>
</div>
<div class="analysis-chart-card-num">8,846</div>
<div class="analysis-chart-card-content">
<ele-chart :option="visitChartOption" style="height: 40px;"/>
</div>
<el-divider/>
<div class="analysis-chart-card-text">日访问量 1,234</div>
</el-card>
</el-col>
<el-col :md="6" :sm="12">
<el-card class="analysis-chart-card" shadow="never">
<div slot="header">
<span>支付笔数</span>
<el-tag
size="mini"
class="ele-pull-right">
</el-tag>
</div>
<div class="analysis-chart-card-num">6,560</div>
<div class="analysis-chart-card-content">
<ele-chart
:option="payNumChartOption"
style="height: 40px;"/>
</div>
<el-divider/>
<div class="analysis-chart-card-text">转化率 60%</div>
</el-card>
</el-col>
<el-col :md="6" :sm="12">
<el-card class="analysis-chart-card" shadow="never">
<div slot="header">
<span>运营活动效果</span>
<el-tag
type="success"
size="mini"
class="ele-pull-right">
</el-tag>
</div>
<div class="analysis-chart-card-num">78%</div>
<div class="analysis-chart-card-content" style="padding-top: 25px;">
<el-progress
:percentage="78"
:show-text="false"
:stroke-width="10"
color="#13c2c2"/>
</div>
<el-divider/>
<div class="analysis-chart-card-text">
<span class="ele-action">
<span>周同比12%</span>
<i class="el-icon-caret-top ele-text-danger"/>
</span>
<span class="ele-action">
<span>日同比11%</span>
<i class="el-icon-caret-bottom ele-text-success"/>
</span>
</div>
</el-card>
</el-col>
</el-row>
<!-- 销售额访问量 -->
<el-card shadow="never" body-style="padding: 0;">
<div class="ele-cell demo-monitor-tool">
<div class="ele-cell-content">
<el-tabs
v-model="saleSearch.type"
class="demo-monitor-tabs"
@tab-click="onSaleTypeChange">
<el-tab-pane label="销售额" name="saleroom"/>
<el-tab-pane label="访问量" name="visits"/>
</el-tabs>
</div>
<div class="ele-inline-block hidden-xs-only">
<el-radio-group v-model="saleSearch.dateType" size="small">
<el-radio-button :label="0">今天</el-radio-button>
<el-radio-button :label="1">本周</el-radio-button>
<el-radio-button :label="2">本月</el-radio-button>
<el-radio-button :label="3">本年</el-radio-button>
</el-radio-group>
</div>
<div class="ele-inline-block hidden-xs-only">
<el-date-picker
v-model="saleSearch.datetime"
type="daterange"
range-separator="至" size="small"
start-placeholder="开始日期"
end-placeholder="结束日期" unlink-panels/>
</div>
</div>
<el-divider/>
<el-row>
<el-col :md="18" :sm="16">
<div class="demo-monitor-title">
{{ {saleroom: '销售', visits: '访问量'}[saleSearch.type] }}趋势
</div>
<ele-chart
:option="saleChartOption"
style="height:285px;"/>
</el-col>
<el-col :md="6" :sm="8">
<div class="demo-monitor-title">
门店{{ {saleroom: '销售额', visits: '访问量'}[saleSearch.type] }}排名
</div>
<div
v-for="(item,index) in saleroomRankData"
:key="index"
class="demo-monitor-rank-item ele-cell">
<el-tag
:type="index<3?'':'info'"
size="mini"
class="ele-tag-round">
{{ index + 1 }}
</el-tag>
<div class="ele-cell-content">{{ item.name }}</div>
<div class="ele-text-secondary">{{ item.value }}</div>
</div>
</el-col>
</el-row>
</el-card>
<!-- 最近1小时访问情况 -->
<el-row :gutter="15">
<el-col :md="18" :sm="16">
<el-card
shadow="never"
header="最近1小时访问情况"
body-style="padding: 10px 5px 0 0;">
<ele-chart
:option="visitHourChartOption"
style="height: 323px;"/>
</el-card>
</el-col>
<el-col :md="6" :sm="8">
<el-card shadow="never" header="热门搜索">
<ele-word-cloud
:data="hotSearchData"
style="height: 303px;"/>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script>
import EleChart from 'ele-admin/packages/ele-chart';
import EleWordCloud from 'ele-admin/packages/ele-word-cloud';
export default {
name: 'DashboardAnalysis',
components: {EleChart, EleWordCloud},
data() {
return {
//
payNumData: [],
//
saleSearch: {
type: 'saleroom',
dateType: 0,
datetime: ''
},
//
saleroomData: [],
//
saleroomRankData: [],
// 1访
visitHourData: [],
//
hotSearchData: []
}
},
computed: {
// 访线
visitChartOption() {
if (!this.payNumData.length) return {};
return {
color: '#975fe5',
tooltip: {
trigger: 'axis',
formatter: '<i class="ele-chart-dot" style="background: #975fe5;"></i>{b0}: {c0}'
},
grid: {
top: 10,
bottom: 0,
left: 0,
right: 0
},
xAxis: [
{
show: false,
type: 'category',
boundaryGap: false,
data: this.payNumData.map(d => d.date)
}
],
yAxis: [
{
show: false,
type: 'value',
splitLine: {
show: false
}
}
],
series: [
{
type: 'line',
smooth: true,
symbol: 'none',
areaStyle: {
opacity: 0.5
},
data: this.payNumData.map(d => d.value)
}
]
};
},
//
payNumChartOption() {
return {
tooltip: {
trigger: 'axis',
formatter: '<i class="ele-chart-dot" style="background: #3aa1ff;"></i>{b0}: {c0}'
},
grid: {
top: 10,
bottom: 0,
left: 0,
right: 0
},
xAxis: [
{
show: false,
type: 'category',
data: this.payNumData.map(d => d.date)
}
],
yAxis: [
{
show: false,
type: 'value',
splitLine: {
show: false
}
}
],
series: [
{
type: 'bar',
data: this.payNumData.map(d => d.value)
}
]
}
},
//
saleChartOption() {
return {
tooltip: {
trigger: 'axis'
},
xAxis: [
{
type: 'category',
data: this.saleroomData.map(d => d.month)
}
],
yAxis: [
{
type: 'value'
}
],
series: [
{
type: 'bar',
data: this.saleroomData.map(d => d.value)
}
]
};
},
// 1访线
visitHourChartOption() {
if (!this.visitHourData.length) return {};
return {
tooltip: {
trigger: 'axis'
},
legend: {
data: ['浏览量', '访问量'],
right: 20
},
xAxis: [
{
type: 'category',
boundaryGap: false,
data: this.visitHourData.map(d => d.time)
}
],
yAxis: [
{
type: 'value'
}
],
series: [
{
name: '浏览量',
type: 'line',
smooth: true,
symbol: 'none',
areaStyle: {
opacity: 0.5
},
data: this.visitHourData.map(d => d.views)
},
{
name: '访问量',
type: 'line',
smooth: true,
symbol: 'none',
areaStyle: {
opacity: 0.5
},
data: this.visitHourData.map(d => d.visits)
}
]
}
}
},
mounted() {
this.getPayNumData();
this.getSaleroomData();
this.getVisitHourData();
this.getWordCloudData();
},
methods: {
/* 获取支付笔数数据 */
getPayNumData() {
this.payNumData = [
{date: '2020-06-12', value: 7},
{date: '2020-06-13', value: 5},
{date: '2020-06-14', value: 4},
{date: '2020-06-15', value: 2},
{date: '2020-06-16', value: 4},
{date: '2020-06-17', value: 7},
{date: '2020-06-18', value: 5},
{date: '2020-06-19', value: 6},
{date: '2020-06-20', value: 5},
{date: '2020-06-21', value: 9},
{date: '2020-06-22', value: 6},
{date: '2020-06-23', value: 3},
{date: '2020-06-24', value: 1},
{date: '2020-06-25', value: 5},
{date: '2020-06-26', value: 3},
{date: '2020-06-27', value: 6},
{date: '2020-06-18', value: 5}
];
},
/* 获取销售量数据 */
getSaleroomData() {
if (this.saleSearch.type === 'saleroom') {
this.saleroomData = [
{month: '1月', value: 816},
{month: '2月', value: 542},
{month: '3月', value: 914},
{month: '4月', value: 781},
{month: '5月', value: 355},
{month: '6月', value: 796},
{month: '7月', value: 714},
{month: '8月', value: 1195},
{month: '9月', value: 1055},
{month: '10月', value: 271},
{month: '11月', value: 384},
{month: '12月', value: 1098}
];
} else {
this.saleroomData = [
{month: '1月', value: 1098},
{month: '2月', value: 384},
{month: '3月', value: 271},
{month: '4月', value: 1055},
{month: '5月', value: 1195},
{month: '6月', value: 714},
{month: '7月', value: 796},
{month: '8月', value: 355},
{month: '9月', value: 781},
{month: '10月', value: 914},
{month: '11月', value: 542},
{month: '12月', value: 816}
];
}
this.saleroomRankData = [
{name: '工专路 1 号店', value: '323,234'},
{name: '工专路 2 号店', value: '323,234'},
{name: '工专路 3 号店', value: '323,234'},
{name: '工专路 4 号店', value: '323,234'},
{name: '工专路 5 号店', value: '323,234'},
{name: '工专路 6 号店', value: '323,234'},
{name: '工专路 7 号店', value: '323,234'}
];
},
/* 获取最近1小时访问情况数据 */
getVisitHourData() {
this.visitHourData = [
{time: '16:00', visits: 15, views: 45},
{time: '16:05', visits: 39, views: 169},
{time: '16:10', visits: 152, views: 400},
{time: '16:15', visits: 94, views: 285},
{time: '16:20', visits: 102, views: 316},
{time: '16:25', visits: 86, views: 148},
{time: '16:30', visits: 39, views: 150},
{time: '16:35', visits: 38, views: 234},
{time: '16:40', visits: 95, views: 158},
{time: '16:45', visits: 30, views: 100},
{time: '16:50', visits: 86, views: 266}
];
},
/* 获取词云数据 */
getWordCloudData() {
this.hotSearchData = [
{name: "软妹子", value: 23},
{name: "汪星人", value: 23},
{name: "长腿欧巴", value: 23},
{name: "萝莉", value: 22},
{name: "辣~", value: 22},
{name: "K歌", value: 22},
{name: "大长腿", value: 21},
{name: "川妹子", value: 21},
{name: "女神", value: 21},
{name: "米粉", value: 20},
{name: "专注设计", value: 20},
{name: "逛街", value: 20},
{name: "黑长直", value: 20},
{name: "海纳百川", value: 19},
{name: "萌萌哒", value: 19},
{name: "坚持", value: 19},
{name: "话唠", value: 19},
{name: "果粉", value: 18},
{name: "喵星人", value: 18},
{name: "花粉", value: 18},
{name: "衬衫控", value: 18},
{name: "宅男", value: 17},
{name: "小清新", value: 17},
{name: "眼镜男", value: 17},
{name: "琼瑶", value: 17},
{name: "穷游党", value: 16},
{name: "铲屎官", value: 16},
{name: "正太", value: 16},
{name: "中二病", value: 16},
{name: "夜猫子", value: 15},
{name: "逗比", value: 15},
{name: "腹黑", value: 15},
{name: "吃鸡", value: 15},
{name: "为了联盟", value: 14},
{name: "背包客", value: 14},
{name: "民谣", value: 14},
{name: "为了部落", value: 14},
{name: "懒癌患者", value: 13},
{name: "追剧", value: 13},
{name: "IT民工", value: 13},
{name: "CNB成员", value: 13},
{name: "选择困难", value: 12},
{name: "锤粉", value: 12},
{name: "欧皇", value: 12},
{name: "仙气十足", value: 12}
];
},
/* 销售量tab选择改变事件 */
onSaleTypeChange() {
this.getSaleroomData();
}
}
}
</script>
<style scoped>
/* 统计卡片 */
.analysis-chart-card-num {
font-size: 30px;
}
.analysis-chart-card-content {
height: 40px;
box-sizing: border-box;
margin-bottom: 12px;
}
.analysis-chart-card-text {
padding-top: 12px;
}
/* 销售额、访问量工具栏 */
.demo-monitor-tool {
padding: 0 20px;
}
.demo-monitor-tool ::v-deep .el-tabs__nav-wrap:after {
display: none;
}
.demo-monitor-tool ::v-deep .el-tabs__item {
height: 50px;
line-height: 50px;
font-size: 15px;
}
.demo-monitor-tool .el-date-editor {
width: 256px;
margin-left: 10px;
}
/* 小标题 */
.demo-monitor-title {
padding: 0 20px;
margin: 15px 0 5px 0;
}
/* 排名item */
.demo-monitor-rank-item {
padding: 0 20px;
line-height: 20px;
margin-top: 18px;
}
</style>

613
src/views/dashboard/monitor.vue

@ -0,0 +1,613 @@
<template>
<div class="ele-body ele-body-card">
<!-- 顶部统计卡片 -->
<el-row :gutter="15">
<el-col :sm="6" :xs="12">
<el-card shadow="never" class="monitor-count-card">
<el-tag size="large" class="ele-tag-round">
<i class="el-icon-s-custom"></i>
</el-tag>
<div class="monitor-count-card-num">21.2 k</div>
<div class="monitor-count-card-text ele-text-secondary">总访问人数</div>
<ele-avatar-list :data="visitUsers" :size="22" :max="4"/>
</el-card>
</el-col>
<el-col :sm="6" :xs="12">
<el-card shadow="never" class="monitor-count-card">
<el-tag size="large" type="warning" class="ele-tag-round">
<i class="el-icon-_sent"></i>
</el-tag>
<div class="monitor-count-card-num">1.6 k</div>
<div class="monitor-count-card-text ele-text-secondary">点击量近30天</div>
<div class="monitor-count-card-trend ele-text-success">
<i class="el-icon-arrow-up"></i>
<span>110.5%</span>
</div>
<el-tooltip content="指标说明" placement="top">
<i class="el-icon-_question ele-text-placeholder monitor-count-card-tips"></i>
</el-tooltip>
</el-card>
</el-col>
<el-col :sm="6" :xs="12">
<el-card shadow="never" class="monitor-count-card">
<el-tag size="large" type="danger" class="ele-tag-round">
<i class="el-icon-s-flag"></i>
</el-tag>
<div class="monitor-count-card-num">826.0</div>
<div class="monitor-count-card-text ele-text-secondary">到达量近30天</div>
<div class="monitor-count-card-trend ele-text-danger">
<i class="el-icon-arrow-down"></i>
<span>15.5%</span>
</div>
</el-card>
</el-col>
<el-col :sm="6" :xs="12">
<el-card shadow="never" class="monitor-count-card">
<el-tag size="large" type="success" class="ele-tag-round">
<i class="el-icon-_flash-solid"></i>
</el-tag>
<div class="monitor-count-card-num">28.8 %</div>
<div class="monitor-count-card-text">转化率近30天</div>
<div class="monitor-count-card-trend ele-text-success">
<i class="el-icon-arrow-up"></i>
<span>65.8%</span>
</div>
<el-tooltip content="指标说明" placement="top">
<i class="el-icon-_question ele-text-placeholder monitor-count-card-tips"></i>
</el-tooltip>
</el-card>
</el-col>
</el-row>
<!-- 用户分布浏览器分布 -->
<el-row :gutter="15">
<el-col :md="18">
<el-card shadow="never" header="用户分布">
<el-row>
<el-col :sm="18">
<ele-chart
:option="userCountMapOption"
style="height: 438px;"/>
</el-col>
<el-col :sm="6">
<ele-chart
:option="userCountChartOption"
style="height: 438px;"/>
</el-col>
</el-row>
</el-card>
</el-col>
<el-col :md="6">
<el-row :gutter="15">
<el-col :md="24" :sm="12">
<el-card shadow="never" header="在线人数">
<div class="monitor-online-num-card">
<div class="monitor-online-num-text">{{ currentTime }}</div>
<div class="monitor-online-num-title">
<vue-count-up
:end-val="228"
@ready="(ins) => { onlineNumAnimIns = ins; }"/>
</div>
<div class="monitor-online-num-text">在线总人数</div>
<ele-dot :text="updateTimeText"/>
</div>
</el-card>
</el-col>
<el-col :md="24" :sm="12">
<el-card
shadow="never"
header="浏览器分布"
body-style="padding: 0 10px;">
<ele-chart
:option="browserChartOption"
style="height: 240px;"/>
</el-card>
</el-col>
</el-row>
</el-col>
<el-col :md="12">
<el-card shadow="never" header="用户评价">
<div class="ele-cell ele-cell-align-bottom">
<div style="font-size: 48px;">4.5</div>
<div class="ele-cell-content" style="padding-bottom: 8px;">
<el-rate
v-model="userRate"
disabled
show-score
text-color="#F7BA2A"
score-template="很棒"/>
</div>
</div>
<div class="ele-cell" style="margin: 15px 0;">
<div style="font-size: 28px;" class="ele-text-placeholder">-0%</div>
<div class="ele-cell-content ele-text-small ele-text-secondary">当前没有评价波动</div>
</div>
<div class="ele-cell">
<div class="ele-cell-content">
<el-progress :percentage="60" :show-text="false" status="success"/>
</div>
<div style="width: 80px;white-space: nowrap;" class="ele-text-secondary">
<span><s/><i class="el-icon-star-on"></i></span>
<span> 5 : 368</span>
</div>
</div>
<div class="ele-cell">
<div class="ele-cell-content">
<el-progress :percentage="40" :show-text="false"/>
</div>
<div style="width: 80px;white-space: nowrap;" class="ele-text-secondary">
<span><s/><i class="el-icon-star-on"></i></span>
<span> 4 : 256</span>
</div>
</div>
<div class="ele-cell">
<div class="ele-cell-content">
<el-progress :percentage="20" :show-text="false" status="warning"/>
</div>
<div style="width: 80px;white-space: nowrap;" class="ele-text-secondary">
<span><s/><i class="el-icon-star-on"></i></span>
<span> 3 : 49</span>
</div>
</div>
<div class="ele-cell">
<div class="ele-cell-content">
<el-progress :percentage="10" :show-text="false" status="exception"/>
</div>
<div style="width: 80px;white-space: nowrap;" class="ele-text-secondary">
<span><s/><i class="el-icon-star-on"></i></span>
<span> 2 : 14</span>
</div>
</div>
<div class="ele-cell">
<div class="ele-cell-content">
<el-progress :percentage="0" :show-text="false"/>
</div>
<div style="width: 80px;white-space: nowrap;" class="ele-text-secondary">
<span><s/><i class="el-icon-star-on"></i></span>
<span> 1 : 0</span>
</div>
</div>
</el-card>
</el-col>
<el-col :md="6" :sm="12">
<el-card shadow="never" header="用户满意度">
<div class="ele-cell" style="margin: 15px 0;">
<div class="ele-cell-content ele-text-center" style="font-size: 24px;">856</div>
<div class="ele-cell-content ele-text-center">
<div class="monitor-face-smile">
<span></span>
</div>
<div class="ele-text-secondary" style="margin-top:5px;">正面评论</div>
</div>
<h2 class="ele-cell-content ele-text-success ele-text-center">82%</h2>
</div>
<el-divider/>
<div class="ele-cell" style="margin: 15px 0 12px 0;">
<div class="ele-cell-content ele-text-center" style="font-size: 24px;">60</div>
<div class="ele-cell-content ele-text-center">
<div class="monitor-face-cry">
<span></span>
</div>
<div class="ele-text-secondary" style="margin-top: 5px;">负面评论</div>
</div>
<h2 class="ele-cell-content ele-text-danger ele-text-center">9%</h2>
</div>
</el-card>
</el-col>
<el-col :md="6" :sm="12">
<el-card shadow="never" header="用户活跃度">
<div class="ele-cell" style="padding: 34px 0;">
<div class="ele-cell-content ele-text-center">
<div class="monitor-progress-group">
<el-progress
type="circle"
:percentage="70"
status="success"
:show-text="false"
:width="140"/>
<el-progress
type="circle"
:percentage="60"
:show-text="false"
:width="115"
:stroke-width="5"/>
<el-progress
type="circle"
:percentage="35"
status="exception"
:show-text="false"
:width="90"
:stroke-width="4"/>
</div>
</div>
<div class="monitor-progress-legends">
<div class="ele-text-small">
<ele-dot :ripple="false" text="活跃率: 70%"/>
</div>
<div class="ele-text-small">
<ele-dot type="success" :ripple="false" text="留存率: 60%"/>
</div>
<div class="ele-text-small">
<ele-dot type="danger" :ripple="false" text="跳出率: 35%"/>
</div>
</div>
</div>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script>
import VueCountUp from 'vue-countup-v2';
import EleChart from 'ele-admin/packages/ele-chart';
export default {
name: 'DashboardMonitor',
components: {VueCountUp, EleChart},
data() {
return {
// 访
visitUsers: [
{
name: 'SunSmile',
avatar: 'https://cdn.eleadmin.com/20200609/c184eef391ae48dba87e3057e70238fb.jpg'
},
{
name: '你的名字很好听',
avatar: 'https://cdn.eleadmin.com/20200609/b6a811873e704db49db994053a5019b2.jpg'
},
{
name: '全村人的希望',
avatar: 'https://cdn.eleadmin.com/20200609/948344a2a77c47a7a7b332fe12ff749a.jpg'
},
{
name: 'Jasmine',
avatar: 'https://cdn.eleadmin.com/20200609/f6bc05af944a4f738b54128717952107.jpg'
},
{
name: '酷酷的大叔',
avatar: 'https://cdn.eleadmin.com/20200609/2d98970a51b34b6b859339c96b240dcd.jpg'
}
],
// 线
updateTime: 5,
//
chinaMapData: null,
//
userCountData: [],
//
currentTime: '20:58:22',
// 线
onlineNumAnimIns: null,
// 线
onlineNumTimer: null,
//
browserCountData: [],
//
userRate: 4.5
}
},
computed: {
// 线
updateTimeText() {
return this.updateTime + ' 秒后更新';
},
//
userCountMapOption() {
if (!this.chinaMapData) {
return {};
}
let data = this.userCountData.map(d => d.value).sort((a, b) => (a - b));
return {
tooltip: {
trigger: 'item'
},
visualMap: {
min: data[data.length - 1] || 0,
max: data[0] || 0,
text: ['高', '低'],
calculable: true,
color: ['rgba(24,144,255,1)', 'rgba(24,144,255,.1)']
},
series: [
{
name: '用户数',
type: 'map',
mapType: 'china',
label: {
show: true
},
data: this.userCountData
}
]
};
},
//
userCountChartOption() {
let data = this.userCountData
.filter(d => d.value > 0)
.sort((a, b) => {
return a.value - b.value;
});
return {
tooltip: {
trigger: 'axis',
formatter: '<i class="ele-chart-dot" style="background: #3aa1ff;"></i>{b0}: {c0}'
},
grid: {
top: 0,
bottom: 0,
left: 50,
right: 0
},
yAxis: [
{
type: 'category',
axisLine: {
show: false
},
axisTick: {
show: false
},
data: data.map(d => d.name)
}
],
xAxis: [
{
show: false,
type: 'value',
splitLine: {
show: false
}
}
],
series: [
{
type: 'bar',
data: data.map(d => d.value)
}
]
};
},
//
browserChartOption() {
return {
tooltip: {
trigger: 'item'
},
legend: {
data: this.browserCountData.map(d => d.name),
bottom: 5,
itemWidth: 10,
itemHeight: 10,
icon: 'circle'
},
series: [
{
type: 'pie',
radius: ['45%', '70%'],
center: ['50%', '43%'],
label: {
show: false
},
data: this.browserCountData
}
]
};
}
},
mounted() {
this.doUpdateOnlineNum();
this.getChinaMapData();
this.getUserCountData();
this.getBrowserCountData();
},
methods: {
/* 在线人数更新倒计时 */
doUpdateOnlineNum() {
this.currentTime = this.$util.toDateString(new Date(), 'HH:mm:ss');
this.onlineNumTimer = setInterval(() => {
this.currentTime = this.$util.toDateString(new Date(), 'HH:mm:ss');
if (this.updateTime === 1) {
this.updateTime = 5;
if (this.onlineNumAnimIns) {
this.onlineNumAnimIns.update(100 + Math.round(Math.random() * 900));
}
} else {
this.updateTime--;
}
}, 1000);
},
/* 获取中国地图数据并注册地图 */
getChinaMapData() {
this.$http.get('https://cdn.eleadmin.com/20200610/china-provinces.geo.json').then(res => {
EleChart.registerMap('china', res.data);
this.chinaMapData = res.data;
}).catch(e => {
this.$message.error(e.message);
});
},
/* 获取用户分布数据 */
getUserCountData() {
this.userCountData = [
{name: "贵州", value: 570},
{name: "云南", value: 8890},
{name: "重庆", value: 10010},
{name: "吉林", value: 5056},
{name: "山西", value: 2123},
{name: "天津", value: 9130},
{name: "江西", value: 10170},
{name: "广西", value: 6172},
{name: "陕西", value: 9251},
{name: "黑龙江", value: 5125},
{name: "安徽", value: 9530},
{name: "北京", value: 51919},
{name: "福建", value: 3756},
{name: "上海", value: 59190},
{name: "湖北", value: 37109},
{name: "湖南", value: 8966},
{name: "四川", value: 31020},
{name: "辽宁", value: 7222},
{name: "河北", value: 3451},
{name: "河南", value: 9693},
{name: "浙江", value: 62310},
{name: "山东", value: 39231},
{name: "江苏", value: 35911},
{name: "广东", value: 55891}
];
},
/* 获取用户浏览器分布数据 */
getBrowserCountData() {
this.browserCountData = [
{name: 'Chrome', value: 9052},
{name: 'Safari', value: 535},
{name: 'Firefox', value: 1610},
{name: 'Edge', value: 2800},
{name: 'IE', value: 3200},
{name: 'Other', value: 1700}
];
}
},
beforeDestroy() {
//
if (this.onlineNumTimer) {
clearInterval(this.onlineNumTimer);
}
}
}
</script>
<style scoped>
/* 统计卡片 */
.monitor-count-card ::v-deep .el-card__body {
padding-top: 18px;
text-align: center;
position: relative;
}
.monitor-count-card ::v-deep .el-tag {
border-color: transparent;
font-size: 15px;
}
.monitor-count-card .monitor-count-card-num {
font-weight: 500;
font-size: 32px;
margin-top: 12px;
}
.monitor-count-card .monitor-count-card-text {
font-size: 12px;
margin: 10px 0;
}
.monitor-count-card .monitor-count-card-trend {
font-weight: 600;
padding: 6px 0;
}
.monitor-count-card .monitor-count-card-trend > i {
font-size: 12px;
font-weight: 600;
margin-right: 5px;
}
.monitor-count-card .monitor-count-card-tips {
position: absolute;
top: 15px;
right: 15px;
cursor: pointer;
}
/* 当前在线人数卡片 */
.monitor-online-num-card {
text-align: center;
padding: 5px 0;
}
.monitor-online-num-text {
margin-bottom: 5px;
}
.monitor-online-num-title {
font-size: 48px;
margin-bottom: 10px;
}
@media screen and (max-width: 992px) {
.monitor-online-num-card {
padding: 38px 0;
}
}
/* 笑脸、哭脸 */
.monitor-face-smile,
.monitor-face-cry {
width: 50px;
height: 50px;
display: inline-block;
background-color: #FBD971;
border-radius: 50%;
position: relative;
}
.monitor-face-smile > span,
.monitor-face-smile:before,
.monitor-face-smile:after,
.monitor-face-cry > span,
.monitor-face-cry:before,
.monitor-face-cry:after {
width: 22px;
height: 22px;
border-radius: 50%;
transform: rotate(225deg);
border: 3px solid #F0C419;
border-right-color: transparent !important;
border-bottom-color: transparent !important;
position: absolute;
bottom: 8px;
left: 11px;
}
.monitor-face-smile:before,
.monitor-face-smile:after,
.monitor-face-cry:before,
.monitor-face-cry:after {
content: "";
width: 6px;
height: 6px;
left: 8px;
top: 14px;
border-color: #F29C1F;
transform: rotate(45deg);
}
.monitor-face-smile:after,
.monitor-face-cry:after {
left: auto;
right: 8px;
}
.monitor-face-cry > span {
transform: rotate(45deg);
bottom: -6px;
}
/* 圆形进度条组合 */
.monitor-progress-group {
position: relative;
display: inline-block;
}
.monitor-progress-group .el-progress:not(:first-child) {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
margin-top: -1px;
}
.monitor-progress-legends > div + div {
margin-top: 8px;
}
</style>

622
src/views/dashboard/workplace.vue

@ -0,0 +1,622 @@
<template>
<div class="ele-body ele-body-card">
<!-- 顶部卡片 -->
<el-card shadow="never" body-style="padding: 20px;">
<div class="ele-cell workplace-user-card">
<div class="ele-cell-content ele-cell">
<el-avatar :size="68" :src="loginUser.avatar"/>
<div class="ele-cell-content">
<h4 class="ele-elip">早安{{ loginUser.nickname }}开始您一天的工作吧</h4>
<div class="ele-text-secondary ele-elip" style="margin-top: 8px;">
<i class="el-icon-heavy-rain"></i>
<span><s/><s/>今日阴转小雨22 - 32出门记得带伞哦</span>
</div>
</div>
</div>
<div class="workplace-count-group">
<div class="workplace-count-item">
<div class="workplace-count-header">
<el-tag size="small" class="ele-tag-round">
<i class="el-icon-menu"></i>
</el-tag>
<span class="workplace-count-name">项目数</span>
</div>
<div class="workplace-count-num">3</div>
</div>
<div class="workplace-count-item">
<div class="workplace-count-header">
<el-tag type="warning" size="small" class="ele-tag-round">
<i class="el-icon-finished"></i>
</el-tag>
<span class="workplace-count-name">待办项</span>
</div>
<div class="workplace-count-num">6 / 24</div>
</div>
<div class="workplace-count-item">
<div class="workplace-count-header">
<el-tag type="success" size="small" class="ele-tag-round">
<i class="el-icon-bell"></i>
</el-tag>
<span class="workplace-count-name">消息</span>
</div>
<div class="workplace-count-num">1,689</div>
</div>
</div>
</div>
</el-card>
<!-- 快捷方式 -->
<el-row :gutter="15">
<el-col :md="3" :sm="6" :xs="12">
<el-card shadow="hover" body-style="padding: 0;">
<router-link to="/system/user" class="app-link-block">
<i class="app-link-icon el-icon-user"></i>
<div class="app-link-title">用户</div>
</router-link>
</el-card>
</el-col>
<el-col :md="3" :sm="6" :xs="12">
<el-card shadow="hover" body-style="padding: 0;">
<router-link to="/dashboard/analysis" class="app-link-block">
<i class="app-link-icon el-icon-data-line" style="color: #95de64;"></i>
<div class="app-link-title">分析</div>
</router-link>
</el-card>
</el-col>
<el-col :md="3" :sm="6" :xs="12">
<el-card shadow="hover" body-style="padding: 0;">
<router-link to="/list/card/project" class="app-link-block">
<i class="app-link-icon el-icon-shopping-cart-2" style="color: #ff9c6e;"></i>
<div class="app-link-title">商品</div>
</router-link>
</el-card>
</el-col>
<el-col :md="3" :sm="6" :xs="12">
<el-card shadow="hover" body-style="padding: 0;">
<router-link to="/list/basic" class="app-link-block">
<i class="app-link-icon el-icon-tickets" style="color: #b37feb;"></i>
<div class="app-link-title">订单</div>
</router-link>
</el-card>
</el-col>
<el-col :md="3" :sm="6" :xs="12">
<el-card shadow="hover" body-style="padding: 0;">
<router-link to="/list/advanced" class="app-link-block">
<i class="app-link-icon el-icon-bank-card" style="color: #ffd666;"></i>
<div class="app-link-title">票据</div>
</router-link>
</el-card>
</el-col>
<el-col :md="3" :sm="6" :xs="12">
<el-card shadow="hover" body-style="padding: 0;">
<router-link to="/user/message" class="app-link-block">
<i class="app-link-icon el-icon-message" style="color: #5cdbd3;"></i>
<div class="app-link-title">消息</div>
</router-link>
</el-card>
</el-col>
<el-col :md="3" :sm="6" :xs="12">
<el-card shadow="hover" body-style="padding: 0;">
<router-link to="/extension/more" class="app-link-block">
<i class="app-link-icon el-icon-discount" style="color: #ff85c0;"></i>
<div class="app-link-title">标签</div>
</router-link>
</el-card>
</el-col>
<el-col :md="3" :sm="6" :xs="12">
<el-card shadow="hover" body-style="padding: 0;">
<router-link to="/user/info" class="app-link-block">
<i class="app-link-icon el-icon-s-operation" style="color: #ffc069;"></i>
<div class="app-link-title">配置</div>
</router-link>
</el-card>
</el-col>
</el-row>
<!-- 最新动态我的任务本月目标 -->
<el-row :gutter="15">
<el-col :sm="8">
<el-card
shadow="never"
header="最新动态"
body-style="padding: 0;">
<el-scrollbar
style="height: 318px;"
wrapStyle="overflow-x: hidden;"
viewStyle="padding: 20px 10px;">
<el-timeline
:reverse="false"
class="ele-timeline ele-timeline-act">
<el-timeline-item
v-for="(act, index) in activities"
:key="index"
:timestamp="act.timestamp"
:type="act.primary ? 'primary' : ''">
{{ act.title }}
</el-timeline-item>
</el-timeline>
</el-scrollbar>
</el-card>
</el-col>
<el-col :sm="8">
<el-card
class="workplace-table-card"
shadow="never"
header="我的任务"
body-style="padding: 0;">
<el-table-draggable handle=".sort-handle" :animate="300">
<el-table :data="taskList" :height="318" class="ele-table-default-head">
<el-table-column width="38" align="center">
<i class="sort-handle el-icon-_nav ele-text-placeholder"></i>
</el-table-column>
<el-table-column label="优先级" width="65">
<template slot-scope="{row}">
<el-tag
size="mini"
:type="['danger','warning','primary'][row.priority-1]"
class="ele-tag-round">
{{ row.priority }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="任务名称">
<template slot-scope="{row}">
<el-link
type="primary"
:underline="false">
{{ row.taskName }}
</el-link>
</template>
</el-table-column>
<el-table-column label="状态" width="70" align="center">
<template slot-scope="{row}">
<span
:class="['ele-text-warning','ele-text-success','ele-text-info'][row.state]">
{{ ['未开始', '进行中', '已完成'][row.state] }}
</span>
</template>
</el-table-column>
</el-table>
</el-table-draggable>
</el-card>
</el-col>
<el-col :sm="8">
<el-card shadow="never" header="本月目标">
<div class="workplace-goal-group">
<el-progress
type="dashboard"
:percentage="80"
:width="170"
:format="()=>{return ''}"/>
<div class="workplace-goal-content">
<el-tag
size="large"
class="ele-tag-round">
<i class="el-icon-s-data"></i>
</el-tag>
<div class="workplace-goal-num">285</div>
</div>
<div class="workplace-goal-text">恭喜本月目标已达标</div>
</div>
</el-card>
</el-col>
<el-col :sm="16">
<el-card
class="workplace-table-card"
shadow="never"
header="项目进度"
body-style="padding: 12px;">
<el-table :data="projectList" height="358">
<el-table-column
type="index"
width="35"
min-width="35"
align="right"/>
<el-table-column
label="项目名称"
min-width="110">
<template slot-scope="{row}">
<el-link
type="primary"
:underline="false">
{{ row.projectName }}
</el-link>
</template>
</el-table-column>
<el-table-column
prop="startDate"
label="开始时间"
width="95"
min-width="80"
align="center"/>
<el-table-column
prop="endDate"
label="结束时间"
width="95"
min-width="80"
align="center"/>
<el-table-column
label="状态"
width="70"
min-width="60"
align="center">
<template slot-scope="{row}">
<span
:class="['ele-text-success','ele-text-danger','ele-text-warning','ele-text-info ele-text-delete'][row.state]">
{{ ['进行中', '已延期', '未开始', '已结束'][row.state] }}
</span>
</template>
</el-table-column>
<el-table-column label="进度" width="160" min-width="100" align="center">
<template slot-scope="{row}">
<el-progress :percentage="row.progress" class="ele-text-small"/>
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
<el-col :sm="8">
<el-card
shadow="never"
header="小组成员"
body-style="padding: 19px 0;">
<div
v-for="(item,index) in userList"
:key="index"
class="ele-cell user-list-item">
<el-avatar :size="42" :src="item.avatar"/>
<div class="ele-cell-content">
<div class="ele-cell-title">{{ item.name }}</div>
<div class="ele-cell-desc">{{ item.desc }}</div>
</div>
<el-tag
size="mini"
:type="['success','danger'][item.state]">
{{ ['在线', '离线'][item.state] }}
</el-tag>
</div>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script>
export default {
name: 'DashboardWorkplace',
data() {
return {
//
activities: [
{
title: 'SunSmile 解决了bug 登录提示操作失败',
timestamp: '20:30',
primary: false
},
{
title: 'Jasmine 解决了bug 按钮颜色与设计不符',
timestamp: '19:30',
primary: false
},
{
title: '项目经理 指派了任务 解决项目一的bug',
timestamp: '18:30',
primary: true
},
{
title: '项目经理 指派了任务 解决项目二的bug',
timestamp: '17:30',
primary: true
},
{
title: '项目经理 指派了任务 解决项目三的bug',
timestamp: '16:30',
primary: true
},
{
title: '项目经理 指派了任务 解决项目四的bug',
timestamp: '15:30',
primary: false
},
{
title: '项目经理 指派了任务 解决项目五的bug',
timestamp: '14:30',
primary: false
},
{
title: '项目经理 指派了任务 解决项目六的bug',
timestamp: '12:30',
primary: false
},
{
title: '项目经理 指派了任务 解决项目七的bug',
timestamp: '11:30',
primary: true
},
{
title: '项目经理 指派了任务 解决项目八的bug',
timestamp: '10:30',
primary: false
},
{
title: '项目经理 指派了任务 解决项目九的bug',
timestamp: '09:30',
primary: false
},
{
title: '项目经理 指派了任务 解决项目十的bug',
timestamp: '08:30',
primary: false
}
],
//
taskList: [
{
id: 1,
priority: 1,
taskName: '解决项目一的bug',
state: 0
},
{
id: 2,
priority: 2,
taskName: '解决项目二的bug',
state: 0
},
{
id: 3,
priority: 2,
taskName: '解决项目三的bug',
state: 1
},
{
id: 4,
priority: 3,
taskName: '解决项目四的bug',
state: 1
},
{
id: 5,
priority: 3,
taskName: '解决项目五的bug',
state: 2
},
{
id: 6,
priority: 3,
taskName: '解决项目六的bug',
state: 2
}
],
//
projectList: [
{
projectName: '项目0000001',
state: 0,
startDate: '2020-03-01',
endDate: '2020-06-01',
progress: 30
},
{
projectName: '项目0000002',
state: 0,
startDate: '2020-03-01',
endDate: '2020-08-01',
progress: 10
},
{
projectName: '项目0000003',
state: 1,
startDate: '2020-01-01',
endDate: '2020-05-01',
progress: 60
},
{
projectName: '项目0000004',
state: 1,
startDate: '2020-06-01',
endDate: '2020-10-01',
progress: 0
},
{
projectName: '项目0000005',
state: 2, startDate: '2020-01-01',
endDate: '2020-03-01',
progress: 100
},
{
projectName: '项目0000006',
state: 3,
startDate: '2020-01-01',
endDate: '2020-03-01',
progress: 100
},
{
projectName: '项目0000007',
state: 3,
startDate: '2020-01-01',
endDate: '2020-03-01',
progress: 100
}
],
//
userList: [
{
name: 'SunSmile',
desc: 'UI设计师、交互专家',
state: 0,
avatar: 'https://cdn.eleadmin.com/20200609/c184eef391ae48dba87e3057e70238fb.jpg'
},
{
name: '你的名字很好听',
desc: '前端工程师',
state: 0,
avatar: 'https://cdn.eleadmin.com/20200609/b6a811873e704db49db994053a5019b2.jpg'
},
{
name: '全村人的希望',
desc: '前端工程师',
state: 0,
avatar: 'https://cdn.eleadmin.com/20200609/948344a2a77c47a7a7b332fe12ff749a.jpg'
},
{
name: 'Jasmine',
desc: '产品经理、项目经理',
state: 1,
avatar: 'https://cdn.eleadmin.com/20200609/f6bc05af944a4f738b54128717952107.jpg'
},
{
name: '酷酷的大叔',
desc: '组长、后端工程师',
state: 1,
avatar: 'https://cdn.eleadmin.com/20200609/2d98970a51b34b6b859339c96b240dcd.jpg'
}
]
}
},
computed: {
//
loginUser() {
return this.$store.state.user.user;
}
}
}
</script>
<style scoped>
/* 顶部用户信息卡片 */
.workplace-user-card .ele-cell-content {
overflow: hidden;
}
.workplace-count-group {
white-space: nowrap;
}
.workplace-count-item {
padding: 0 5px 0 25px;
box-sizing: border-box;
display: inline-block;
text-align: right;
}
.workplace-count-name {
padding-left: 8px;
}
.workplace-count-num {
font-size: 24px;
margin-top: 6px;
}
@media screen and (max-width: 992px) {
.workplace-count-item {
padding: 0 5px 0 10px;
}
}
@media screen and (max-width: 768px) {
.workplace-user-card,
.workplace-count-group {
display: block;
}
.workplace-count-group {
margin-top: 15px;
text-align: right;
}
}
/* 快捷方式 */
.app-link-block {
display: block;
color: inherit;
padding: 15px 0;
text-align: center;
text-decoration: none;
cursor: pointer;
}
.app-link-block .app-link-icon {
color: #69c0ff;
font-size: 30px;
margin-top: 5px;
}
.app-link-block .app-link-title {
margin-top: 8px;
}
/* 最新动态时间轴 */
.ele-timeline-act {
padding-left: 50px;
}
.ele-timeline-act ::v-deep .el-timeline-item__timestamp {
margin: 0;
position: absolute;
top: 3px;
left: -45px;
}
.ele-timeline-act ::v-deep .el-timeline-item {
padding-bottom: 19px;
}
.ele-timeline-act ::v-deep .el-timeline-item:last-child {
padding-bottom: 0;
}
/* 表格 */
.workplace-table-card ::v-deep .el-table tbody > .el-table__row:last-child td {
border-bottom: none;
}
.workplace-table-card ::v-deep .el-table:before {
display: none;
}
.workplace-table-card .sort-handle {
cursor: move;
font-size: 18px;
vertical-align: middle;
}
.workplace-table-card ::v-deep .el-table__row.sortable-chosen {
background-color: hsla(0, 0%, 60%, .1);
}
.workplace-table-card ::v-deep .el-table__row.sortable-chosen td {
background-color: transparent;
}
/* 本月目标 */
.workplace-goal-group {
text-align: center;
position: relative;
padding: 48px 0;
}
.workplace-goal-group .workplace-goal-content {
position: absolute;
top: 90px;
left: 0;
width: 100%;
}
.workplace-goal-group .workplace-goal-num {
font-size: 40px;
margin-top: 15px;
}
/* 小组成员 */
.user-list-item {
padding: 13px 18px;
}
.user-list-item + .user-list-item {
border-top: 1px solid hsla(0, 0%, 60%, .15);
}
.user-list-item .ele-cell-desc {
margin-top: 5px;
}
</style>

195
src/views/debris/debris-edit.vue

@ -0,0 +1,195 @@
<!-- 用户编辑弹窗 -->
<template>
<el-dialog
:title="isUpdate?'修改碎片':'添加碎片'"
:visible="visible"
width="600px"
:destroy-on-close="true"
:lock-scroll="false"
custom-class="ele-dialog-form"
@update:visible="updateVisible">
<el-form
:model="form"
ref="form"
:rules="rules"
label-width="82px">
<el-row :gutter="15">
<el-col>
<el-form-item
label="调用名:"
prop="name">
<el-input
v-model="form.name"
placeholder="请输入调用名"
clearable
/>
</el-form-item>
<el-form-item
label="标题:"
prop="title">
<el-input
v-model="form.title"
placeholder="请输入标题"
clearable/>
</el-form-item>
<el-form-item
label="排序号:"
prop="sortNumber">
<el-input-number
v-model="form.sort"
controls-position="right"
:min="0"
placeholder="请输入排序号"
class="ele-fluid ele-text-left"/>
</el-form-item>
<el-form-item
label="链接:"
prop="url">
<el-input
v-model="form.url"
placeholder="请输入url"
clearable/>
</el-form-item>
<el-form-item label="图片">
<el-row>
<el-col>
<el-input
v-model="form.image"
placeholder="请上传图片"
clearable/>
<el-upload
class="upload-demo"
:show-file-list="false"
:action="this.uploadImage+'?upload_type=img'"
:on-success="afterUploadImage">
<img v-if="form.image" :src="form.image" width="150" height="150" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="内容:">
<el-input
v-model="form.content"
placeholder="请输入内容"
clearable/>
</el-form-item>
<el-form-item label="描述:">
<el-input
v-model="form.description"
placeholder="请输入描述"
clearable/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer">
<el-button
@click="updateVisible(false)">取消
</el-button>
<el-button
type="primary"
@click="save"
:loading="loading">保存
</el-button>
</div>
</el-dialog>
</template>
<script>
import setting from "@/config/setting";
export default {
name: 'debrisEdit',
props: {
//
visible: Boolean,
//
data: Object
},
data() {
return {
//
form: Object.assign({}, this.data),
//
rules: {
name: [
{required: true, message: '请输入调用名称', trigger: 'blur'}
],
title: [
{required: true, message: '请输入标题', trigger: 'blur'}
],
},
//
loading: false,
//
isUpdate: false,
//
roleList: [],
uploadImage: setting.uploadImageUrl,
}
},
watch: {
data() {
if (this.data) {
this.form = Object.assign({}, this.data);
this.isUpdate = true;
} else {
this.form = {};
this.isUpdate = false;
}
}
},
methods: {
afterUploadImage(response) {
if (response.code != 0 || response.url == '') {
this.$message.error(response.msg)
} else {
this.$set(this.form,'image',response.url)
}
},
/* 保存编辑 */
save() {
this.$refs['form'].validate((valid) => {
if (valid) {
this.loading = true;
this.$http.post('/debris/' + (this.isUpdate ? 'edit' : 'add'), this.form).then(res => {
this.loading = false;
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
if (!this.isUpdate) {
this.form = {};
}
this.updateVisible(false);
this.$emit('done');
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
this.loading = false;
this.$message.error(e.message);
});
} else {
return false;
}
});
},
/* 更新visible */
updateVisible(value) {
this.$emit('update:visible', value);
},
}
}
</script>
<style scoped>
</style>

306
src/views/debris/index.vue

@ -0,0 +1,306 @@
<template>
<div class="ele-body">
<el-card shadow="never">
<!-- 搜索表单 -->
<el-form
:model="where"
label-width="77px"
class="ele-form-search"
@keyup.enter.native="reload"
@submit.native.prevent>
<el-row :gutter="15">
<el-col :md="5" :sm="12">
<el-form-item label="标志:">
<el-input
v-model="where.name"
placeholder="请输入碎片标志"
clearable/>
</el-form-item>
</el-col>
<el-col :md="4" :sm="12">
<el-form-item label="标题:">
<el-input
v-model="where.title"
placeholder="请输入标题"
clearable/>
</el-form-item>
</el-col>
<el-col :md="6" :sm="12">
<div class="ele-form-actions">
<el-button
type="primary"
@click="reload"
icon="el-icon-search"
class="ele-btn-icon">查询
</el-button>
<el-button @click="reset">重置</el-button>
</div>
</el-col>
</el-row>
</el-form>
<!-- 数据表格 -->
<ele-pro-table
ref="table"
:datasource="url"
:columns="columns"
:where="where"
:selection.sync="selection">
<!-- 表头工具栏 -->
<template slot="toolbar">
<el-button
@click="openEdit(null)"
type="primary"
icon="el-icon-plus"
class="ele-btn-icon"
size="small">添加
</el-button>
<el-button
@click="removeBatch"
type="danger"
icon="el-icon-delete"
class="ele-btn-icon"
size="small">删除
</el-button>
</template>
<template slot="image" slot-scope="{row}">
<div class="ele-cell">
<a :href="row.image" target="_blank"><el-avatar shape="square" :size="100" :src="row.image"/></a>
</div>
</template>
<!-- 状态列 -->
<template slot="status" slot-scope="{row}">
<el-switch
v-model="row.status"
@change="editStatus(row)"
:active-value="1"
:inactive-value="0"/>
</template>
<!-- 操作列 -->
<template slot="action" slot-scope="{row}">
<el-link
@click="openEdit(row)"
icon="el-icon-edit"
type="primary"
:underline="false">修改
</el-link>
<el-popconfirm
title="确定要删除此碎片吗?"
@confirm="remove(row)"
class="ele-action">
<el-link
slot="reference"
icon="el-icon-delete"
type="danger"
:underline="false">删除
</el-link>
</el-popconfirm>
</template>
</ele-pro-table>
</el-card>
<!-- 编辑弹窗 -->
<debris-edit
:visible.sync="showEdit"
:data="current"
@done="reload"/>
</div>
</template>
<script>
import DebrisEdit from './debris-edit';
export default {
name: 'debris',
components: {DebrisEdit},
data() {
return {
//
url: '/debris/index',
//
columns: [
{
columnKey: 'selection',
type: 'selection',
width: 45,
align: 'center',
fixed: 'left'
},
{
columnKey: 'index',
type: 'index',
width: 45,
align: 'center',
fixed: 'left',
showOverflowTooltip: true
},
{
prop: 'name',
label: '标志',
sortable: false,
showOverflowTooltip: true,
minWidth: 80
},
{
prop: 'title',
label: '标题',
sortable: false,
showOverflowTooltip: true,
minWidth: 80
},
{
prop: 'url',
label: '地址',
sortable: false,
showOverflowTooltip: true,
minWidth: 60
},
{
prop: 'image',
label: '图片',
sortable: false,
showOverflowTooltip: true,
minWidth: 100,
slot: "image"
},
{
prop: 'sort',
label: '排序',
sortable: 'custom',
align: 'center',
showOverflowTooltip: true,
minWidth: 50
},
{
prop: 'create_time',
label: '创建时间',
sortable: 'custom',
showOverflowTooltip: true,
minWidth: 100,
formatter: (row, column, cellValue) => {
return this.$util.toDateString(cellValue);
}
},
{
prop: 'status',
label: '状态',
align: 'center',
sortable: 'custom',
width: 80,
resizable: false,
slot: 'status'
},
{
columnKey: 'action',
label: '操作',
width: 150,
align: 'center',
resizable: false,
slot: 'action'
}
],
//
where: {},
//
selection: [],
//
current: null,
//
showEdit: false,
//
showImport: false
}
},
methods: {
/* 刷新表格 */
reload() {
this.$refs.table.reload({page: 1});
},
/* 重置搜索 */
reset() {
this.where = {};
this.$nextTick(() => {
this.reload();
});
},
/* 显示编辑 */
openEdit(row) {
this.current = row;
this.showEdit = true;
},
/* 删除 */
remove(row) {
const loading = this.$loading({lock: true});
let formData = new FormData();
formData.append('id', row.id);
this.$http.post('/debris/delete/', formData).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
this.reload();
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
},
/* 批量删除 */
removeBatch() {
if (!this.selection.length) {
this.$message.error('请至少选择一条数据')
return;
}
this.$confirm('确定要删除选中的碎片吗?', '提示', {
type: 'warning'
}).then(() => {
const loading = this.$loading({lock: true});
let formData = new FormData();
formData.append('id', this.selection.map(d => d.id));
this.$http.post('/debris/delete/', formData).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
this.reload();
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
}).catch(() => {
});
},
/* 更改状态 */
editStatus(row) {
const loading = this.$loading({lock: true});
let params = new FormData();
params.append('status', row.status);
params.append('id', row.id);
this.$http.post('/debris/status', params).then(res => {
loading.close();
if (res.data.code === 0) {
this.$message({type: 'success', message: res.data.msg});
} else {
row.status = !row.status ? 1 : 0;
this.$message.error(res.data.msg);
}
}).catch(e => {
loading.close();
this.$message.error(e.message);
});
}
}
}
</script>
<style scoped>
</style>

247
src/views/example/choose/index.vue

@ -0,0 +1,247 @@
<template>
<div class="ele-body" style="padding-bottom: 71px;">
<el-form
ref="trainingForm"
:model="form"
:rules="rules"
label-width="90px">
<el-card
shadow="never"
header="发布实训活动"
body-style="padding: 22px 22px 3px 22px;">
<el-row :gutter="15">
<el-col :sm="8">
<el-form-item label="实训名称:" prop="title">
<el-input
v-model="form.title"
placeholder="请输入实训名称"
clearable/>
</el-form-item>
</el-col>
<el-col :sm="8">
<el-form-item label="起止日期:" prop="datetime">
<el-date-picker
v-model="form.datetime"
type="daterange"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
class="ele-fluid"/>
</el-form-item>
</el-col>
<el-col :sm="8">
<el-form-item label="实训地点:" prop="address">
<el-select
v-model="form.address"
placeholder="请选择地点"
class="ele-fluid"
clearable>
<el-option label="地点一" :value="1"/>
<el-option label="地点二" :value="2"/>
<el-option label="地点三" :value="3"/>
</el-select>
</el-form-item>
</el-col>
<el-col :sm="24">
<el-form-item label="实训内容:" prop="content">
<el-input
v-model="form.content"
placeholder="请输入实训内容"
:rows="4"
type="textarea"/>
</el-form-item>
</el-col>
</el-row>
</el-card>
<el-card shadow="never" header="选择实训班级:">
<el-row :gutter="15">
<el-col :sm="12">
<!-- 未选择的班级数据表格 -->
<ele-pro-table
:datasource="unChooseClass"
:columns="columns"
sub-title="未选班级:"
height="535px"
emptyText="已全部选择"
:toolkit="[]"
layout="total, prev, pager, next, jumper">
<template slot="toolkit">
<el-button
@click="addAll"
size="mini"
class="ele-btn-icon">全部添加
</el-button>
</template>
<template slot="action" slot-scope="{row}">
<el-button
@click="add(row)"
size="mini">添加
</el-button>
</template>
</ele-pro-table>
</el-col>
<el-col :sm="12">
<!-- 已选择的班级数据表格 -->
<ele-pro-table
:datasource="chooseClasses"
:columns="columns"
sub-title="已选班级:"
height="535px"
emptyText="未选择班级"
:toolkit="[]"
layout="total, prev, pager, next, jumper">
<template slot="toolkit">
<el-button
@click="removeAll"
size="mini"
type="danger"
plain
class="ele-btn-icon">全部移除
</el-button>
</template>
<template slot="action" slot-scope="{row}">
<el-button
@click="remove(row)"
type="danger"
plain
size="mini">移除
</el-button>
</template>
</ele-pro-table>
</el-col>
</el-row>
</el-card>
<!-- 底部工具栏 -->
<div class="ele-bottom-tool">
<div class="ele-bottom-tool-actions">
<el-button type="primary" @click="submit" :loading="loading">发布</el-button>
</div>
</div>
</el-form>
</div>
</template>
<script>
export default {
name: 'ExampleChoose',
data() {
return {
//
loading: false,
//
form: {},
//
rules: {
title: [
{required: true, message: '请输入实训名称', trigger: 'blur'}
],
datetime: [
{required: true, message: '请选择起止日期', trigger: 'blur'}
],
content: [
{required: true, message: '请输入实训内容', trigger: 'blur'}
],
address: [
{required: true, message: '请选择实训地点', trigger: 'blur'}
]
},
//
classes: [],
//
chooseClasses: [],
columns: [
{
columnKey: 'action',
label: '操作',
width: 100,
align: 'center',
slot: 'action'
},
{
prop: 'classesName',
label: '班级名称',
showOverflowTooltip: true,
minWidth: 110,
sortable: 'custom'
},
{
prop: 'major',
label: '专业',
showOverflowTooltip: true,
minWidth: 110,
sortable: 'custom'
},
{
prop: 'college',
label: '学院',
showOverflowTooltip: true,
minWidth: 110,
sortable: 'custom'
}
]
}
},
computed: {
/* 未选择的班级数据 */
unChooseClass() {
return this.classes.filter(d => this.chooseClasses.indexOf(d) === -1);
}
},
mounted() {
this.query();
},
methods: {
/* 获取全部实训班级 */
query() {
this.$http.get('https://cdn.eleadmin.com/20200610/classes.json').then(res => {
if (res.data.code === 0) {
this.classes = res.data.data;
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
this.$message.error(e.message);
});
},
/* 提交 */
submit() {
this.$refs['trainingForm'].validate((valid) => {
if (valid) {
if (!this.chooseClasses.length) {
return this.$message.error('请选择实训班级');
}
this.loading = true;
setTimeout(() => {
this.loading = false;
this.$message({type: 'success', message: '发布成功'});
}, 1500);
} else {
return false;
}
});
},
/* 添加 */
add(row) {
this.chooseClasses.push(row);
},
/* 移除 */
remove(row) {
this.chooseClasses.splice(this.chooseClasses.indexOf(row), 1);
},
/* 添加全部 */
addAll() {
this.unChooseClass.forEach(d => {
this.chooseClasses.push(d);
})
},
/* 移除所有 */
removeAll() {
this.chooseClasses.splice(0, this.chooseClasses.length);
}
}
}
</script>
<style scoped>
</style>

310
src/views/example/document/file-sort.vue

@ -0,0 +1,310 @@
<template>
<el-dialog
title="卷内文件调整"
width="980px"
top="5vh"
@opened="onOpened"
@closed="onClosed"
:visible="visible"
@update:visible="updateVisible"
custom-class="demo-file-sort-dialog"
:lock-scroll="false">
<el-row :gutter="15">
<el-col :md="8">
<ele-pro-table
ref="docTable"
sub-title="案卷列表"
:datasource="documents"
:columns="columns1"
highlight-current-row
height="400px"
:toolkit="[]"
:need-page="false"
:current.sync="current"
class="demo-file-sort-table">
</ele-pro-table>
</el-col>
<el-col :md="8">
<ele-pro-table
ref="fileTable"
:loading="loading"
sub-title="卷内列表"
:datasource="data1"
:columns="columns2"
height="400px"
:selection.sync="selection1"
:need-page="false"
:toolkit="[]">
<template slot="toolkit">
<el-button
@click="moveUp"
type="primary"
icon="el-icon-top"
class="ele-btn-icon"
size="mini">上移
</el-button>
<el-button
@click="moveDown"
type="primary"
icon="el-icon-bottom"
class="ele-btn-icon"
size="mini">下移
</el-button>
<el-button
@click="moveOut"
type="primary"
icon="el-icon-top-right"
class="ele-btn-icon"
size="mini">调出
</el-button>
</template>
</ele-pro-table>
</el-col>
<el-col :md="8">
<ele-pro-table
:loading="loading"
sub-title="未归档列表"
:datasource="data2"
:columns="columns2"
height="400px"
:selection.sync="selection2"
:need-page="false"
:toolkit="[]">
<template slot="toolkit">
<el-button
@click="moveIn"
type="primary"
icon="el-icon-top-left"
class="ele-btn-icon"
size="mini">调入
</el-button>
</template>
</ele-pro-table>
</el-col>
</el-row>
<div slot="footer">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="save">保存</el-button>
</div>
</el-dialog>
</template>
<script>
export default {
name: 'FileSort',
props: {
//
visible: Boolean,
//
documents: {
type: Array,
required: true
}
},
data() {
return {
//
columns1: [
{
prop: 'title',
label: '案卷题名',
showOverflowTooltip: true
},
{
prop: 'piece_no',
label: '案卷档号',
showOverflowTooltip: true
}
],
//
columns2: [
{
columnKey: 'selection',
type: 'selection',
width: 45,
align: 'center'
},
{
prop: 'title',
label: '文件题名',
showOverflowTooltip: true
},
{
prop: 'archive_no',
label: '文件档号',
showOverflowTooltip: true
}
],
//
data: [],
//
current: null,
// loading
loading: true,
//
selection1: [],
//
selection2: []
}
},
computed: {
//
data1() {
if (!this.current) {
return [];
}
return this.data.filter(d => d.piece_no === this.current.piece_no);
},
//
data2() {
return this.data.filter(d => !d.piece_no);
}
},
methods: {
/* 弹窗被打开 */
onOpened() {
this.query();
if (this.documents.length) {
this.$refs.docTable.setCurrentRow(this.documents[0]);
}
},
/* 弹窗被关闭 */
onClosed() {
this.data = [];
},
/* 查询所选案卷的卷内文件 */
query() {
this.loading = true;
this.$http.get('https://cdn.eleadmin.com/20200610/archive.json').then(res => {
this.loading = false;
if (res.data.code === 0) {
this.data = res.data.data;
} else {
this.$message.error(res.data.msg);
}
}).catch(e => {
this.loading = false;
this.$message.error(e.message);
});
},
/* 上移 */
moveUp() {
if (!this.selection1.length) {
return this.$message.error('请选择一条数据');
}
if (this.selection1.length > 1) {
return this.$message.error('只能选择一条数据');
}
if (this.data1.indexOf(this.selection1[0]) === 0) {
return;
}
let index = this.data.indexOf(this.selection1[0]);
let old = this.data[index - 1];
this.$set(this.data, index - 1, this.selection1[0]);
this.$set(this.data, index, old);
this.$nextTick(() => {
this.$refs.fileTable.toggleRowSelection(this.data[index - 1]);
});
},
/* 下移 */
moveDown() {
if (!this.selection1.length) {
return this.$message.error('请选择一条数据');
}
if (this.selection1.length > 1) {
return this.$message.error('只能选择一条数据');
}
if (this.data1.indexOf(this.selection1[0]) === this.data1.length - 1) {
return;
}
let index = this.data.indexOf(this.selection1[0]);
let old = this.data[index + 1];
this.$set(this.data, index + 1, this.selection1[0]);
this.$set(this.data, index, old);
this.$nextTick(() => {
this.$refs.fileTable.toggleRowSelection(this.data[index + 1]);
});
},
/* 调出 */
moveOut() {
if (!this.selection1.length) {
return this.$message.error('请至少选择一条数据');
}
this.selection1.forEach(d => {
d.piece_no = '';
});
},
/* 调入 */
moveIn() {
if (!this.current) return;
if (!this.selection2.length) {
return this.$message.error('请至少选择一条数据');
}
this.selection2.forEach(d => {
d.piece_no = this.current.piece_no;
});
},
/* 保存 */
save() {
let result = this.data.map(d => {
return {
archive_no: d.archive_no,
piece_no: d.piece_no
};
});
console.log(result);
this.updateVisible(false);
},
/* 关闭弹窗 */
close() {
this.updateVisible(false);
},
/* 更新visible */
updateVisible(value) {
this.$emit('update:visible', value);
}
}
}
</script>
<style>
.demo-file-sort-dialog {
margin-bottom: 5vh;
}
.demo-file-sort-dialog .el-dialog__body {
padding-top: 15px;
padding-bottom: 0;
}
.demo-file-sort-dialog .el-dialog__body > .el-row > .el-col {
margin-bottom: 15px;
}
.demo-file-sort-table .el-table__row {
cursor: pointer;
}
.demo-file-sort-table .el-table__row > td:last-child:after {
content: "\e6e0";
font-family: element-icons !important;
font-style: normal;
font-variant: normal;
text-transform: none;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
line-height: 1;
position: absolute;
right: 10px;
top: 50%;
margin-top: -7px;
}
.demo-file-sort-table .el-table__row > td:last-child .cell {
padding-right: 20px;
}
.demo-file-sort-table .ele-table-tool-title {
line-height: 28px;
}
</style>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save