@jx3box/jx3box-editor 2.2.48 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/config/global.js +79 -0
  2. package/config/global.less +16 -0
  3. package/index.js +21 -8
  4. package/package.json +64 -63
  5. package/readme.md +25 -99
  6. package/src/Article.vue +96 -57
  7. package/src/ArticleMarkdown.vue +54 -47
  8. package/src/BoxResource.vue +67 -42
  9. package/src/Buff.vue +18 -7
  10. package/src/GameText.vue +32 -45
  11. package/src/Item.vue +143 -235
  12. package/src/ItemSimple.vue +27 -37
  13. package/src/Markdown.vue +362 -210
  14. package/src/Npc.vue +51 -30
  15. package/src/Resource.vue +296 -252
  16. package/src/Skill.vue +36 -26
  17. package/src/Tinymce.vue +124 -137
  18. package/src/Upload.vue +238 -155
  19. package/src/UploadAlbum.vue +189 -118
  20. package/{assets → src/assets}/css/article.less +1 -0
  21. package/src/assets/css/markdown.less +4 -0
  22. package/{assets → src/assets}/css/module/author.less +4 -3
  23. package/{assets → src/assets}/css/module/directory.less +23 -32
  24. package/{assets → src/assets}/css/module/talent.less +2 -2
  25. package/{assets → src/assets}/css/resource.less +56 -22
  26. package/src/assets/css/tinymce/_.less +28 -0
  27. package/src/assets/css/tinymce/a.less +21 -0
  28. package/{assets → src/assets}/css/tinymce/code.less +1 -1
  29. package/{assets/css → src/assets/css/tinymce}/combo.less +123 -18
  30. package/{assets → src/assets}/css/tinymce/fold.less +3 -6
  31. package/src/assets/css/tinymce/h.less +90 -0
  32. package/{assets → src/assets}/css/tinymce/latex.less +14 -14
  33. package/{assets → src/assets}/css/tinymce/macro.less +3 -3
  34. package/{assets → src/assets}/css/tinymce/pz.less +2 -2
  35. package/{assets → src/assets}/css/tinymce/table.less +5 -10
  36. package/{assets → src/assets}/css/tinymce.less +8 -4
  37. package/src/assets/css/upload.less +195 -0
  38. package/src/assets/css/upload_album.less +164 -0
  39. package/src/assets/css/var.less +2 -0
  40. package/src/assets/img/other/qr-code.svg +1 -0
  41. package/{assets → src/assets}/js/audio.js +2 -2
  42. package/{assets → src/assets}/js/directory.js +51 -23
  43. package/src/assets/js/hljs_languages.js +177 -0
  44. package/src/assets/js/katex.js +211 -0
  45. package/src/assets/js/renderImgPreview.js +49 -0
  46. package/{assets → src/assets}/js/xss.js +48 -5
  47. package/src/components/Author.vue +32 -13
  48. package/src/components/Avatar.vue +22 -3
  49. package/src/components/Combo.vue +118 -72
  50. package/src/components/PostAuthor.vue +13 -11
  51. package/src/components/QRcode.vue +136 -0
  52. package/src/components/SkillMartial.vue +13 -12
  53. package/src/pages/article.js +14 -0
  54. package/src/pages/index.js +5 -0
  55. package/src/pages/markdown.js +14 -0
  56. package/src/pages/tinymce.js +49 -0
  57. package/src/pages/upload.js +14 -0
  58. package/{service → src/service}/author.js +2 -2
  59. package/{service → src/service}/cms.js +5 -3
  60. package/{service → src/service}/database.js +4 -2
  61. package/{service → src/service}/item.js +1 -1
  62. package/{service → src/service}/node.js +1 -1
  63. package/{service → src/service}/resource.js +1 -1
  64. package/src/views/article.vue +72 -0
  65. package/src/views/index.vue +11 -0
  66. package/src/views/markdown.vue +58 -0
  67. package/src/views/tinymce.vue +58 -0
  68. package/src/views/upload.vue +111 -0
  69. package/.env +0 -2
  70. package/.vscode/settings.json +0 -5
  71. package/assets/css/katex-fix.css +0 -20
  72. package/assets/css/tinymce/_.less +0 -30
  73. package/assets/css/tinymce/a.less +0 -30
  74. package/assets/css/tinymce/combo.less +0 -111
  75. package/assets/css/tinymce/h.less +0 -58
  76. package/assets/css/upload.less +0 -105
  77. package/assets/js/katex.js +0 -191
  78. package/assets/js/renderImgPreview.js +0 -25
  79. package/babel.config.js +0 -3
  80. package/docs/markdown.md +0 -16
  81. package/jsconfig.json +0 -9
  82. package/public/article.html +0 -15
  83. package/public/css/article.css +0 -2481
  84. package/public/css/article.less +0 -3
  85. package/public/favicon.ico +0 -0
  86. package/public/tinymce.html +0 -33
  87. package/src/Equip.vue +0 -301
  88. package/src/components/LetterDemo.vue +0 -93
  89. package/src/components/medal.vue +0 -43
  90. package/test-audio.html +0 -121
  91. package/vue.config.js +0 -147
  92. /package/{assets → src/assets}/css/markdown/_.less +0 -0
  93. /package/{assets → src/assets}/css/markdown/macro.less +0 -0
  94. /package/{assets/css/article_markdown.less → src/assets/css/markdown/markdown-article.less} +0 -0
  95. /package/{assets/css/markdown.less → src/assets/css/markdown/markdown-editor.less} +0 -0
  96. /package/{assets → src/assets}/css/markdown/talent.less +0 -0
  97. /package/{assets → src/assets}/css/markdown/video.less +0 -0
  98. /package/{assets → src/assets}/css/module/buff.less +0 -0
  99. /package/{assets → src/assets}/css/module/icon.less +0 -0
  100. /package/{assets → src/assets}/css/module/item.less +0 -0
  101. /package/{assets → src/assets}/css/module/item_simple.less +0 -0
  102. /package/{assets → src/assets}/css/module/jx3_element.less +0 -0
  103. /package/{assets → src/assets}/css/module/macro.less +0 -0
  104. /package/{assets → src/assets}/css/module/npc.less +0 -0
  105. /package/{assets → src/assets}/css/module/resource.less +0 -0
  106. /package/{assets → src/assets}/css/module/skill.less +0 -0
  107. /package/{assets → src/assets}/css/tinymce/hr.less +0 -0
  108. /package/{assets → src/assets}/css/tinymce/img.less +0 -0
  109. /package/{assets → src/assets}/css/tinymce/imgpreview.less +0 -0
  110. /package/{assets → src/assets}/css/tinymce/list.less +0 -0
  111. /package/{assets → src/assets}/css/tinymce/nextpage.less +0 -0
  112. /package/{assets → src/assets}/css/tinymce/p.less +0 -0
  113. /package/{assets → src/assets}/css/tinymce/plugin.less +0 -0
  114. /package/{assets → src/assets}/css/tinymce/qixue.less +0 -0
  115. /package/{assets → src/assets}/css/tinymce/quote.less +0 -0
  116. /package/{assets → src/assets}/css/tinymce/video.less +0 -0
  117. /package/{assets → src/assets}/css/tinymce/voice.less +0 -0
  118. /package/{assets → src/assets}/data/detach_type.json +0 -0
  119. /package/{assets → src/assets}/data/game_font.json +0 -0
  120. /package/{assets → src/assets}/data/markdown_whitelist.json +0 -0
  121. /package/{assets → src/assets}/data/weapon_type.json +0 -0
  122. /package/{assets → src/assets}/img/buff.svg +0 -0
  123. /package/{assets → src/assets}/img/equip_bg.png +0 -0
  124. /package/{assets → src/assets}/img/file.svg +0 -0
  125. /package/{assets → src/assets}/img/icons.svg +0 -0
  126. /package/{assets → src/assets}/img/item/pve.png +0 -0
  127. /package/{assets → src/assets}/img/item/pvp.png +0 -0
  128. /package/{assets → src/assets}/img/item/pvx.png +0 -0
  129. /package/{assets → src/assets}/img/item/std.png +0 -0
  130. /package/{assets → src/assets}/img/item/wujie.png +0 -0
  131. /package/{assets → src/assets}/img/item.svg +0 -0
  132. /package/{assets → src/assets}/img/jx3.svg +0 -0
  133. /package/{assets → src/assets}/img/jx3box.svg +0 -0
  134. /package/{assets → src/assets}/img/npc/attack.svg +0 -0
  135. /package/{assets → src/assets}/img/npc/buff.svg +0 -0
  136. /package/{assets → src/assets}/img/npc/energy.svg +0 -0
  137. /package/{assets → src/assets}/img/npc/miss.svg +0 -0
  138. /package/{assets → src/assets}/img/npc/npc.svg +0 -0
  139. /package/{assets → src/assets}/img/npc/radar.svg +0 -0
  140. /package/{assets → src/assets}/img/npc/shield.svg +0 -0
  141. /package/{assets → src/assets}/img/npc/sight.svg +0 -0
  142. /package/{assets → src/assets}/img/npc/skull.svg +0 -0
  143. /package/{assets → src/assets}/img/npc/target.svg +0 -0
  144. /package/{assets → src/assets}/img/skill.svg +0 -0
  145. /package/{assets → src/assets}/img/skillset.png +0 -0
  146. /package/{assets → src/assets}/js/a.js +0 -0
  147. /package/{assets → src/assets}/js/code.js +0 -0
  148. /package/{assets → src/assets}/js/combo.js +0 -0
  149. /package/{assets → src/assets}/js/drag.js +0 -0
  150. /package/{assets → src/assets}/js/filter2.js +0 -0
  151. /package/{assets → src/assets}/js/fold.js +0 -0
  152. /package/{assets → src/assets}/js/gallery.js +0 -0
  153. /package/{assets → src/assets}/js/iframe.js +0 -0
  154. /package/{assets → src/assets}/js/img.js +0 -0
  155. /package/{assets → src/assets}/js/item/attribute_percent.js +0 -0
  156. /package/{assets → src/assets}/js/item/bind.js +0 -0
  157. /package/{assets → src/assets}/js/item/border.js +0 -0
  158. /package/{assets → src/assets}/js/item/border_quest.js +0 -0
  159. /package/{assets → src/assets}/js/item/color.js +0 -0
  160. /package/{assets → src/assets}/js/item/hljs_languages.js +0 -0
  161. /package/{assets → src/assets}/js/item/icon_url.js +0 -0
  162. /package/{assets → src/assets}/js/item/second_format.js +0 -0
  163. /package/{assets → src/assets}/js/jx3_element.js +0 -0
  164. /package/{assets → src/assets}/js/macro.js +0 -0
  165. /package/{assets → src/assets}/js/nextpage.js +0 -0
  166. /package/{assets → src/assets}/js/pswp.js +0 -0
  167. /package/{assets → src/assets}/js/pswp_template.js +0 -0
  168. /package/{assets → src/assets}/js/pz_iframe.js +0 -0
  169. /package/{assets → src/assets}/js/qixue.js +0 -0
  170. /package/{assets → src/assets}/js/script.js +0 -0
  171. /package/{assets → src/assets}/js/talent2.js +0 -0
  172. /package/{assets → src/assets}/js/tex-mml-chtml.js +0 -0
  173. /package/{service → src/service}/enum/CollectionPublic.js +0 -0
  174. /package/{service → src/service}/enum/EquipPosition.js +0 -0
  175. /package/{service → src/service}/enum/EquipType.js +0 -0
@@ -1,162 +1,233 @@
1
1
  <template>
2
2
  <div class="c-upload-album">
3
- <Upload @insert="updateFileList" text="批量上传图片" />
4
- <div class="c-upload-album-list">
5
- <draggable v-model="imgList" v-if="imgList && imgList.length">
6
- <transition-group>
7
- <div class="u-album-item" v-for="(item,i) in imgList" :key="item.name + item.url">
8
- <img class="u-pic" :src="item.url | showThumbnail" />
3
+ <el-button type="primary" @click="triggerFileSelect" :loading="uploading">
4
+ <el-icon><UploadFilled /></el-icon>
5
+ <span>批量上传图片</span>
6
+ </el-button>
7
+ <input ref="fileInput" class="u-hidden-input" type="file" accept="image/*" multiple @change="onFileInputChange" />
8
+
9
+ <div
10
+ class="c-upload-album-list"
11
+ :class="{ 'is-dragover': isDragover, 'is-uploading': uploading, 'is-empty': !imgList.length }"
12
+ @click="triggerFileSelect"
13
+ @dragenter.prevent="onDragEnter"
14
+ @dragover.prevent="onDragOver"
15
+ @dragleave.prevent="onDragLeave"
16
+ @drop.prevent="onDrop"
17
+ >
18
+ <draggable v-if="imgList.length" v-model="imgList" item-key="id" class="u-draggable-list">
19
+ <template #item="{ element, index }">
20
+ <div class="u-album-item" @click.stop>
21
+ <img class="u-pic" :src="showThumbnail(element.url)" />
9
22
  <i class="u-mask"></i>
10
- <i class="u-op u-preview el-icon-zoom-in" @click="previewHandle(item)"></i>
11
- <i class="u-op u-delete el-icon-delete" @click="deleteHandle(i)"></i>
23
+ <span class="u-op u-preview" @click.stop="previewHandle(element)">
24
+ <el-icon><ZoomIn /></el-icon>
25
+ </span>
26
+ <span class="u-op u-delete" @click.stop="deleteHandle(index)">
27
+ <el-icon><Delete /></el-icon>
28
+ </span>
12
29
  </div>
13
- </transition-group>
30
+ </template>
14
31
  </draggable>
15
- <div class="u-null" v-else><i class="el-icon-warning-outline"></i> 当前没有任何图片</div>
32
+ <div v-if="imgList.length" class="u-add-card" @click.stop="triggerFileSelect">
33
+ <el-icon><Plus /></el-icon>
34
+ </div>
35
+ <div v-else class="u-drop-hint is-empty">
36
+ <el-icon class="u-drop-icon"><UploadFilled /></el-icon>
37
+ <span>将文件拖到此处,或 <span class="u-drop-link">点击上传</span></span>
38
+ </div>
16
39
  </div>
17
- <el-dialog class="c-upload-album-preview" :visible.sync="dialogVisible">
18
- <img width="100%" :src="dialogImageUrl" alt />
40
+ <el-dialog v-model="dialogVisible" class="c-upload-album-preview">
41
+ <img width="100%" :src="dialogImageUrl" alt="" />
19
42
  </el-dialog>
20
43
  </div>
21
44
  </template>
22
45
 
23
46
  <script>
24
- import Upload from "./Upload.vue";
47
+ import axios from "axios";
48
+ import JX3BOX from "@jx3box/jx3box-common/data/jx3box.json";
49
+ import { Delete, Plus, ZoomIn } from "@element-plus/icons-vue";
50
+ import { UploadFilled } from "@element-plus/icons-vue";
25
51
  import { getThumbnail } from "@jx3box/jx3box-common/js/utils.js";
26
52
  import draggable from "vuedraggable";
53
+ const { __cms } = JX3BOX;
54
+ const API = __cms + "api/cms/upload";
55
+
56
+ const normalizeItem = (item, index = 0) => {
57
+ if (!item || !item.url) return null;
58
+ return {
59
+ ...item,
60
+ id: item.id || item.uid || `${item.url || "img"}-${item.name || "image"}-${index}`,
61
+ };
62
+ };
63
+
64
+ const isSameList = (a = [], b = []) => {
65
+ if (a.length !== b.length) return false;
66
+ return a.every((item, index) => {
67
+ const target = b[index] || {};
68
+ return item.id === target.id && item.url === target.url && item.name === target.name;
69
+ });
70
+ };
27
71
 
28
72
  export default {
29
- name: "album",
30
- props: ["data"],
31
- data: function () {
73
+ name: "UploadAlbum",
74
+ components: {
75
+ draggable,
76
+ ZoomIn,
77
+ Delete,
78
+ Plus,
79
+ UploadFilled,
80
+ },
81
+ props: {
82
+ modelValue: {
83
+ type: Array,
84
+ default: undefined,
85
+ },
86
+ data: {
87
+ type: Array,
88
+ default() {
89
+ return [];
90
+ },
91
+ },
92
+ },
93
+ emits: ["update:modelValue", "update"],
94
+ data() {
32
95
  return {
33
- imgList: this.data || [],
96
+ imgList: [],
34
97
  dialogImageUrl: "",
35
98
  dialogVisible: false,
99
+ isDragover: false,
100
+ uploading: false,
36
101
  };
37
102
  },
38
- model: {
39
- prop: "data", //向上同步数据
40
- event: "update",
103
+ computed: {
104
+ sourceList() {
105
+ return this.modelValue !== undefined ? this.modelValue : this.data;
106
+ },
41
107
  },
42
108
  watch: {
43
- data: {
109
+ sourceList: {
44
110
  immediate: true,
45
111
  deep: true,
46
- handler: function (newval) {
47
- this.imgList = newval || [];
112
+ handler(newval) {
113
+ const normalized = (newval || []).map((item, index) => normalizeItem(item, index)).filter(Boolean);
114
+ if (!isSameList(normalized, this.imgList)) {
115
+ this.imgList = normalized;
116
+ }
48
117
  },
49
118
  },
50
119
  imgList: {
51
120
  deep: true,
52
- handler: function (newval) {
121
+ handler(newval) {
53
122
  this.$emit("update", newval);
123
+ this.$emit("update:modelValue", newval);
54
124
  },
55
125
  },
56
126
  },
57
- computed: {},
58
127
  methods: {
59
- updateFileList: function (data) {
60
- let upload_list = data.list;
61
- let img_list = [];
62
- upload_list.forEach((item) => {
63
- if (item.is_img) {
64
- img_list.push({
65
- name: item.name,
66
- url: item.url,
67
- });
128
+ triggerFileSelect() {
129
+ this.$refs.fileInput?.click();
130
+ },
131
+ onFileInputChange(e) {
132
+ const files = Array.from(e.target?.files || []);
133
+ if (e.target) e.target.value = "";
134
+ this.uploadFiles(files);
135
+ },
136
+ onDragEnter() {
137
+ this.isDragover = true;
138
+ },
139
+ onDragOver() {
140
+ this.isDragover = true;
141
+ },
142
+ onDragLeave(e) {
143
+ if (!e.currentTarget.contains(e.relatedTarget)) {
144
+ this.isDragover = false;
145
+ }
146
+ },
147
+ onDrop(e) {
148
+ this.isDragover = false;
149
+ const files = Array.from(e.dataTransfer?.files || []);
150
+ this.uploadFiles(files);
151
+ },
152
+ isImageFile(file) {
153
+ if (!file) return false;
154
+ if (file.type && file.type.startsWith("image/")) return true;
155
+ const name = (file.name || "").toLowerCase();
156
+ return /\.(jpg|jpeg|png|gif|bmp|webp|svg)$/.test(name);
157
+ },
158
+ async uploadFiles(files = []) {
159
+ if (!files.length) return;
160
+
161
+ const imageFiles = files.filter((file) => this.isImageFile(file));
162
+ const skipped = files.length - imageFiles.length;
163
+ if (skipped > 0) {
164
+ this.$message.warning(`已跳过 ${skipped} 个非图片文件`);
165
+ }
166
+ if (!imageFiles.length) return;
167
+
168
+ this.uploading = true;
169
+ try {
170
+ const uploaded = await Promise.all(imageFiles.map((file, index) => this.uploadSingle(file, index)));
171
+ const valid = uploaded.filter(Boolean);
172
+ if (valid.length) {
173
+ this.imgList = [...this.imgList, ...valid];
174
+ this.$message.success(`上传成功 ${valid.length} 张图片`);
175
+ }
176
+ } finally {
177
+ this.uploading = false;
178
+ }
179
+ },
180
+ async uploadSingle(file, index) {
181
+ const fdata = new FormData();
182
+ fdata.append("file", file);
183
+ try {
184
+ const res = await axios.post(API, fdata, {
185
+ headers: {
186
+ "Content-Type": "multipart/form-data",
187
+ },
188
+ withCredentials: true,
189
+ auth: {
190
+ username: (localStorage && localStorage.getItem("token")) || "",
191
+ password: "cms common request",
192
+ },
193
+ });
194
+
195
+ const payload = res.data || {};
196
+ if (payload.code) {
197
+ this.$message.error(payload.msg || "上传失败");
198
+ return null;
68
199
  }
69
- });
70
- this.imgList = img_list;
200
+
201
+ const url =
202
+ payload.location ||
203
+ payload.url ||
204
+ (payload.data &&
205
+ (Array.isArray(payload.data) ? payload.data[0] : payload.data.url || payload.data.location || payload.data));
206
+
207
+ if (!url) return null;
208
+ return {
209
+ id: `${url}-${Date.now()}-${index}`,
210
+ name: file.name,
211
+ url,
212
+ };
213
+ } catch (err) {
214
+ const message = err?.response?.data?.message || err?.response?.data?.msg || "请求异常";
215
+ this.$message.error(message);
216
+ return null;
217
+ }
71
218
  },
72
- previewHandle: function (item) {
219
+ showThumbnail(val) {
220
+ return getThumbnail(val, 146);
221
+ },
222
+ previewHandle(item) {
73
223
  this.dialogImageUrl = item.url;
74
224
  this.dialogVisible = true;
75
225
  },
76
- deleteHandle: function (i) {
226
+ deleteHandle(i) {
77
227
  this.imgList.splice(i, 1);
78
228
  },
79
229
  },
80
- filters: {
81
- showThumbnail: function (val) {
82
- return getThumbnail(val, 146);
83
- },
84
- },
85
- mounted: function () {},
86
- components: {
87
- draggable,
88
- Upload,
89
- },
90
230
  };
91
231
  </script>
92
232
 
93
- <style lang="less">
94
- .c-upload-album-list {
95
- border: 2px dashed #eee;
96
- padding: 8px 0 0 8px;
97
- margin-top: 20px;
98
- .r(4px);
99
-
100
- @h:148px;
101
- min-height:@h;
102
- .u-null{
103
- .x;
104
- .fz(12px,@h);
105
- color:#999;
106
- }
107
-
108
- .u-album-item {
109
- .pr;
110
- .size(@h);
111
- img {
112
- .db;
113
- .size(100%);
114
- }
115
- overflow: hidden;
116
- background-color: #fff;
117
- border: 1px solid #c0ccda;
118
- border-radius: 6px;
119
- -webkit-box-sizing: border-box;
120
- box-sizing: border-box;
121
- margin: 0 8px 8px 0;
122
- display: inline-block;
123
- &:hover {
124
- .u-mask,
125
- .u-op {
126
- .db;
127
- }
128
- }
129
- }
130
-
131
- .u-mask,
132
- .u-op {
133
- .pa;
134
- .none;
135
- }
136
- .u-op {
137
- .pointer;
138
- }
139
- .u-mask {
140
- background-color: rgba(0, 0, 0, 0.5);
141
- transition: opacity 0.3s;
142
- .lt(0);
143
- .size(100%);
144
- .none;
145
- cursor: move;
146
- }
147
- .u-delete,
148
- .u-preview {
149
- .fz(20px);
150
- color: #fff;
151
- .lt(50%);
152
- .size(20px);
153
- transform: translate(-50%, -50%);
154
- }
155
- .u-delete {
156
- .ml(20px);
157
- }
158
- .u-preview {
159
- .ml(-20px);
160
- }
161
- }
162
- </style>
233
+ <style lang="less" src="./assets/css/upload_album.less"></style>
@@ -1,4 +1,5 @@
1
1
  // tinymce文章样式
2
+ @import 'var.less';
2
3
 
3
4
  @import "tinymce/_.less";
4
5
  @import "tinymce/a.less";
@@ -0,0 +1,4 @@
1
+ @import 'var.less';
2
+
3
+ @import 'markdown/markdown-article.less';
4
+ @import 'markdown/markdown-editor.less';
@@ -1,3 +1,4 @@
1
+ @import '../var.less';
1
2
  .w-author {
2
3
  .w-author-wrapper {
3
4
  @max-width: 280px;
@@ -22,9 +23,9 @@
22
23
  .u-name {
23
24
  .lh(2.2);
24
25
  .bold;
25
- color: @darkblue;
26
+ color: #222;
26
27
  &:hover {
27
- color: #f39;
28
+ color: @primary;
28
29
  }
29
30
  .nobreak;
30
31
  }
@@ -158,7 +159,7 @@
158
159
  span {
159
160
  .fz(13px);
160
161
  }
161
- border-bottom: 1px solid @border;
162
+ border-bottom: 1px solid #e4e7ed;
162
163
  }
163
164
 
164
165
  .u-teams {
@@ -19,7 +19,7 @@
19
19
  padding: 8px 0;
20
20
  &:hover {
21
21
  // font-weight: 600;
22
- color: #0366d6;
22
+ color: @primary;
23
23
  }
24
24
  font-size: 12px;
25
25
  }
@@ -29,7 +29,10 @@
29
29
 
30
30
  h1,
31
31
  h2,
32
- h3,h4,h5,h6 {
32
+ h3,
33
+ h4,
34
+ h5,
35
+ h6 {
33
36
  &::before {
34
37
  content: "\e78b";
35
38
 
@@ -48,52 +51,39 @@
48
51
  }
49
52
  }
50
53
 
51
- // .hasChild {
52
- // font-size: 14px;
53
- // &::before {
54
- // content: "\e784";
55
- // }
56
- // }
57
-
58
- // h2,h3,h4,h5,h6{
59
- // margin-left: 20px;
60
- // }
61
- // .hasChild{
62
- // margin-left: 0;
63
- // }
64
-
65
- // h3 + h2,h4 + h3,h5 + h4,h6 + h5{
66
- // margin-left: 0;
67
- // }
68
-
69
- .lv2{
70
- padding-left:20px;
54
+ .lv2 {
55
+ padding-left: 20px;
71
56
  }
72
57
 
73
- .lv3{
74
- padding-left:40px;
58
+ .lv3 {
59
+ padding-left: 40px;
75
60
  }
76
61
 
77
- .lv0{
62
+ .lv0 {
78
63
  display: none;
79
64
  }
80
-
81
65
  }
82
66
 
83
67
  .c-article-directory-title {
84
68
  margin-bottom: 5px;
69
+ display:flex;
70
+ justify-content: space-between;
85
71
  .c-article-directory-title-label {
86
72
  font-weight: 300;
87
73
  font-size: 18px;
74
+ line-height: 18px;
75
+ display: inline-flex;
76
+ align-items: center;
77
+ gap:3px;
88
78
  .u-icon{
89
- font-size: 20px;
79
+ font-size: 18px;
90
80
  }
91
81
  }
92
- .c-article-directory-title-skip,.c-article-directory-title-folder{
82
+ .c-article-directory-title-skip,
83
+ .c-article-directory-title-folder {
93
84
  font-size: 14px;
94
- float: right;
95
85
  padding: 0 5px;
96
- line-height: 25px;
86
+ line-height: 18px;
97
87
  color: darken(#dcdfe6, 5%);
98
88
  cursor: pointer;
99
89
  &:hover {
@@ -107,7 +97,7 @@
107
97
 
108
98
  @keyframes focusFade {
109
99
  from {
110
- background-color: #c3fcff;
100
+ background-color: #fffd94;
111
101
  }
112
102
  to {
113
103
  background-color: transparent;
@@ -118,6 +108,7 @@
118
108
  animation: focusFade 0.5s ease-in-out;
119
109
  }
120
110
 
111
+
121
112
  .w-directory-anchor{
122
113
  .fz(16px);
123
114
  .pointer;
@@ -126,4 +117,4 @@
126
117
  box-shadow:none !important;
127
118
  color:#c00 !important;
128
119
  }
129
- }
120
+ }
@@ -279,7 +279,7 @@
279
279
 
280
280
  .u-pic {
281
281
  &:before {
282
- .full;
282
+ .size(100%);
283
283
  .pa;
284
284
  .lt(0);
285
285
  background-color: rgba(0, 0, 0, 0.6);
@@ -414,7 +414,7 @@
414
414
  &.disabled:after {
415
415
  content: "";
416
416
  .db;
417
- .full;
417
+ .size(100%);
418
418
  .pa;
419
419
  .lt(0);
420
420
  .z(10);
@@ -1,5 +1,34 @@
1
+ @import "var.less";
2
+
1
3
  .c-resource {
4
+ .w-dialog,
5
+ .el-dialog {
6
+ max-width: 100%;
7
+ min-width: 290px;
8
+ max-height: calc(100vh - 15vh - 50px);
9
+ overflow: auto;
10
+ margin-top: 10vh;
11
+ padding: 0;
12
+
13
+ .el-dialog__header {
14
+ padding: 20px 20px 0 20px;
15
+ }
16
+
17
+ .el-dialog__footer {
18
+ padding: 0 20px 20px 20px;
19
+ }
20
+
21
+ .el-dialog__body {
22
+ padding-top: 10px;
23
+ .scrollbar();
24
+ }
25
+ }
26
+
2
27
  margin-right: 5px;
28
+ .el-dialog__header {
29
+ padding-bottom: 0;
30
+ }
31
+
3
32
  .u-switch {
4
33
  .u-icon {
5
34
  .size(14px);
@@ -20,7 +49,9 @@
20
49
  .pr;
21
50
  .u-mode {
22
51
  .pa;
23
- .rt(0);
52
+ .rt(1px, 0);
53
+ .flex;
54
+ align-items: center
24
55
  }
25
56
  }
26
57
 
@@ -31,7 +62,7 @@
31
62
 
32
63
  .u-item {
33
64
  .db;
34
- border: 2px solid @border-hr;
65
+ border: 2px solid #e1e4e8;
35
66
  background: #fafbfc;
36
67
  margin-bottom: 10px;
37
68
  padding: 10px 10px 10px 70px;
@@ -199,24 +230,30 @@
199
230
  }
200
231
  }
201
232
 
202
- .c-large-dialog .el-dialog {
233
+ .c-large-dialog.el-dialog {
203
234
  .w(60%);
204
235
  height: 70%;
236
+ margin-top: 10vh;
237
+ display: flex;
238
+ flex-direction: column;
239
+ gap: 20px;
240
+
205
241
  .el-dialog__body {
206
242
  height: calc(100% - 54px - 70px);
207
243
  overflow-y: auto;
208
244
  box-sizing: border-box;
209
245
  // padding: 10px 20px 30px 20px;
210
246
  padding: 0;
247
+ flex-grow: 1;
211
248
  }
212
249
  }
213
250
  @media screen and (max-width: @notebook) {
214
- .c-large-dialog .el-dialog {
251
+ .c-large-dialog.el-dialog {
215
252
  .w(90%);
216
253
  }
217
254
  }
218
255
  @media screen and (max-width: @ipad-y) {
219
- .c-large-dialog .el-dialog {
256
+ .c-large-dialog.el-dialog {
220
257
  margin: 0 !important;
221
258
  .size(100%);
222
259
  max-height: none;
@@ -224,11 +261,17 @@
224
261
  }
225
262
  }
226
263
 
264
+ .c-resource-content {
265
+ .flex;
266
+ flex-direction: column;
267
+ gap: 20px;
268
+ padding: 0 20px;
269
+ }
270
+
227
271
  .m-database-search {
228
272
  position: sticky;
229
273
  z-index: 100;
230
274
  top: 0;
231
- padding: 10px 20px 10px 20px;
232
275
  background-color: #fff;
233
276
  .pr;
234
277
 
@@ -243,8 +286,6 @@
243
286
  }
244
287
 
245
288
  .m-database-tabs {
246
- // .mt(10px);
247
- padding: 10px 20px 20px 20px;
248
289
  user-select: none;
249
290
  .u-icon {
250
291
  .size(20px);
@@ -282,24 +323,19 @@
282
323
  background: #fff;
283
324
  color: #6843f4;
284
325
  }
285
- &.el-tabs--card > .el-tabs__header .el-tabs__item {
286
- transition: none;
326
+
327
+ .u-tab-label {
328
+ .flex;
329
+ align-items: center;
330
+ }
331
+ .u-tab-icon {
332
+ .mr(5px);
287
333
  }
288
334
  .el-tabs__item:hover {
289
335
  svg {
290
336
  fill: @primary;
291
337
  }
292
338
  }
293
- .el-tabs__item {
294
- background-color: @bg-light;
295
- border-bottom: 1px solid @border !important;
296
-
297
- &.is-active {
298
- border-bottom: none !important;
299
- background-color: #fff;
300
- .bold;
301
- }
302
- }
303
339
  }
304
340
 
305
341
  .m-database-tip {
@@ -314,9 +350,7 @@
314
350
  // 加载更多
315
351
  .m-archive-more {
316
352
  .none;
317
- margin: 0 20px 10px 20px;
318
353
  box-sizing: border-box;
319
- width: calc(100% - 40px);
320
354
  }
321
355
  .m-archive-more.show {
322
356
  .db;