@spacecorexdev/core 0.0.4 → 0.0.5
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.
- package/package.json +2 -36
- package/src/api/_base.ts +243 -0
- package/src/api/index.ts +17 -0
- package/src/api/project.ts +1345 -0
- package/src/api/user.ts +1174 -0
- package/src/contract.ts +50 -0
- package/src/hooks/index.ts +2 -0
- package/{dist/hooks/index.js → src/hooks/useLongPress.ts} +53 -49
- package/src/hooks/useOnlineStatus.ts +22 -0
- package/src/index.ts +14 -0
- package/src/types/id.ts +2 -0
- package/src/types/index.ts +5 -0
- package/src/types/project/base.ts +63 -0
- package/src/types/project/contract.ts +79 -0
- package/src/types/project/contractStatus.tsx +15 -0
- package/src/types/project/index.ts +5 -0
- package/src/types/project/member.ts +46 -0
- package/src/types/project/progress.ts +43 -0
- package/src/types/projectRole.ts +17 -0
- package/src/types/theme.ts +1 -0
- package/src/types/user/index.ts +1 -0
- package/src/types/user/role.ts +7 -0
- package/src/ui/CommentTimeline/index.tsx +330 -0
- package/src/ui/FileManager/FileContextMenu.tsx +628 -0
- package/src/ui/FileManager/FileGridView.tsx +529 -0
- package/src/ui/FileManager/FileTableView.tsx +405 -0
- package/src/ui/FileManager/FileToolbar.tsx +119 -0
- package/src/ui/FileManager/FileVersionHistoryModal.tsx +175 -0
- package/src/ui/FileManager/MoveCopyToProjectModal.tsx +119 -0
- package/src/ui/FileManager/ShareToWechatModal.tsx +419 -0
- package/src/ui/FileManager/hooks/useFileManagerActions.ts +2532 -0
- package/src/ui/FileManager/hooks/useFileManagerState.ts +419 -0
- package/src/ui/FileManager/index.tsx +580 -0
- package/src/ui/FileManager/projectFileManagerApi.ts +57 -0
- package/src/ui/FileManager/types.ts +184 -0
- package/src/ui/FileManager/utils/fileDeltaWorker.ts +193 -0
- package/src/ui/FileManager/utils/fileTree.ts +178 -0
- package/src/ui/FileManager/utils/fileUpload.ts +714 -0
- package/src/ui/FileManager/utils/fileUtils.ts +65 -0
- package/src/ui/InvoiceRecordsList/index.tsx +813 -0
- package/src/ui/MyFileSelectorModal.tsx +261 -0
- package/src/ui/ProjectSelector/index.tsx +472 -0
- package/src/ui/ProjectSelector/projectCache.ts +40 -0
- package/src/ui/RoleSelector/index.tsx +473 -0
- package/src/ui/RoleSelector/roleCache.ts +40 -0
- package/src/ui/UIAlert.tsx +399 -0
- package/src/ui/UIAlertExample.tsx +129 -0
- package/src/ui/UIConfirm.tsx +335 -0
- package/src/ui/UIConfirmExample.tsx +165 -0
- package/src/ui/UIDatePicker.tsx +146 -0
- package/src/ui/UIDateRangePicker.tsx +38 -0
- package/src/ui/UIFilePreview/ExcelEditor/index.tsx +617 -0
- package/src/ui/UIFilePreview/ExcelEditor/types.ts +24 -0
- package/src/ui/UIFilePreview/ExportDropdown.css +85 -0
- package/src/ui/UIFilePreview/ExportDropdown.tsx +109 -0
- package/src/ui/UIFilePreview/IndexedDBUtils.ts +564 -0
- package/src/ui/UIFilePreview/MarkdownEditor/exportMarkdownPdf.ts +576 -0
- package/src/ui/UIFilePreview/MarkdownEditor/index.tsx +677 -0
- package/src/ui/UIFilePreview/MarkdownEditor/markdownEditor.css +1005 -0
- package/src/ui/UIFilePreview/MarkdownEditor/types.ts +15 -0
- package/src/ui/UIFilePreview/PPTXEditor/index.tsx +602 -0
- package/src/ui/UIFilePreview/RichDocEditor/exportRDocMarkdown.ts +77 -0
- package/src/ui/UIFilePreview/RichDocEditor/exportRDocPdf.ts +374 -0
- package/src/ui/UIFilePreview/RichDocEditor/index.tsx +730 -0
- package/src/ui/UIFilePreview/RichDocEditor/richdoc-editor.css +59 -0
- package/src/ui/UIFilePreview/UIFilePreview.tsx +611 -0
- package/src/ui/UIFilePreview/WordEditor/index.tsx +3933 -0
- package/src/ui/UIFilePreview/WordEditor/style.ts +1213 -0
- package/src/ui/UIFilePreview/WordEditor/word-editor.css +999 -0
- package/src/ui/UIFilePreview/filePreview.css +193 -0
- package/src/ui/UIFilePreview/filetypes/archive.tsx +66 -0
- package/src/ui/UIFilePreview/filetypes/cad.tsx +287 -0
- package/src/ui/UIFilePreview/filetypes/excel.tsx +355 -0
- package/src/ui/UIFilePreview/filetypes/image.tsx +20 -0
- package/src/ui/UIFilePreview/filetypes/imageLoader.ts +63 -0
- package/src/ui/UIFilePreview/filetypes/pdf.tsx +156 -0
- package/src/ui/UIFilePreview/filetypes/ppt.tsx +535 -0
- package/src/ui/UIFilePreview/filetypes/pptExportPdf.ts +523 -0
- package/src/ui/UIFilePreview/filetypes/video.tsx +482 -0
- package/src/ui/UIFilePreview/filetypes/word.tsx +245 -0
- package/src/ui/UIFilePreview/filetypes/wordExportMarkdown.ts +86 -0
- package/src/ui/UIFilePreview/filetypes/wordExportPdf.tsx +427 -0
- package/src/ui/UIFilePreview/index.ts +35 -0
- package/src/ui/UIFilePreview/pdfPagination.ts +143 -0
- package/src/ui/UIFilePreview/previewUtils.tsx +531 -0
- package/src/ui/UIFileUpload.tsx +382 -0
- package/src/ui/UIImageUpload.tsx +195 -0
- package/src/ui/UILoading.tsx +255 -0
- package/src/ui/UILoadingExample.tsx +139 -0
- package/src/ui/UISelect.tsx +105 -0
- package/src/ui/UIToast.tsx +381 -0
- package/src/ui/UIToastExample.tsx +69 -0
- package/src/ui/UIToastSingle.tsx +279 -0
- package/src/ui/UIViewToggle.tsx +64 -0
- package/src/ui/UserSelector/index.tsx +583 -0
- package/src/ui/index.ts +84 -0
- package/src/ui/upload/image.ts +135 -0
- package/src/ui/upload/index.ts +73 -0
- package/src/ui/upload/submitFile.ts +106 -0
- package/src/ui/upload/submitForm.ts +124 -0
- package/src/ui/upload/upload.err.ts +15 -0
- package/src/ui/upload/upload.ts +250 -0
- package/src/utils/CacheDepartmentInfo.ts +372 -0
- package/src/utils/CacheFileContent.ts +315 -0
- package/src/utils/CachePermissionInfo.ts +235 -0
- package/src/utils/CacheRoleInfo.ts +303 -0
- package/src/utils/CacheUserInfo.ts +818 -0
- package/src/utils/CacheViewToggleInfo.ts +182 -0
- package/src/utils/MessageContentUtils.ts +268 -0
- package/src/utils/clipboard.ts +70 -0
- package/src/utils/companyEmail.ts +19 -0
- package/src/utils/forbidDebugger.ts +59 -0
- package/src/utils/formatters.ts +94 -0
- package/src/utils/htmlUtils.tsx +59 -0
- package/src/utils/index.ts +18 -0
- package/src/utils/keyboard.ts +114 -0
- package/src/utils/mammothApi.ts +16 -0
- package/src/utils/polyfills.ts +928 -0
- package/src/utils/regex.ts +14 -0
- package/src/utils/storage.ts +95 -0
- package/src/utils/workerBootstrap.ts +87 -0
- package/dist/api/index.js +0 -1553
- package/dist/contract.js +0 -5
- package/dist/index.js +0 -4492
- package/dist/types/index.js +0 -49
- package/dist/ui/index.css +0 -1876
- package/dist/ui/index.js +0 -22245
- package/dist/utils/index.js +0 -4296
- /package/{dist → src}/styles/ant-modal.css +0 -0
- /package/{dist → src}/styles/ant-spin.css +0 -0
- /package/{dist → src}/styles/ant-table.css +0 -0
- /package/{dist → src}/styles/index.css +0 -0
|
@@ -0,0 +1,999 @@
|
|
|
1
|
+
/* Word Editor 样式下拉框字体预览修复
|
|
2
|
+
* 通过 CSS 属性选择器为不同 styleId 设置正确的字体
|
|
3
|
+
* 因为 @eigenpal/docx-editor-core 的 stylePreview 模块
|
|
4
|
+
* 在生成预览样式时不包含 fontFamily
|
|
5
|
+
*
|
|
6
|
+
* 字体优先级:优先使用 macOS 系统字体,其次使用 Windows 字体作为回退
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* 正文 - 仿宋 */
|
|
10
|
+
[role="option"][data-value="Normal"] span {
|
|
11
|
+
font-family: "STFangsong", "STSong", "FangSong", serif !important;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* 标题 1-6, 标题 - 黑体 */
|
|
15
|
+
[role="option"][data-value="Heading1"] span,
|
|
16
|
+
[role="option"][data-value="Heading2"] span,
|
|
17
|
+
[role="option"][data-value="Heading3"] span,
|
|
18
|
+
[role="option"][data-value="Heading4"] span,
|
|
19
|
+
[role="option"][data-value="Heading5"] span,
|
|
20
|
+
[role="option"][data-value="Heading6"] span,
|
|
21
|
+
[role="option"][data-value="Title"] span {
|
|
22
|
+
font-family: "STHeiti", "STSong", "SimHei", "Microsoft YaHei", sans-serif !important;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* 副标题 - 楷体 */
|
|
26
|
+
[role="option"][data-value="Subtitle"] span {
|
|
27
|
+
font-family: "STKaiti", "STSong", "KaiTi", serif !important;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* 引用, 强调引用 - 楷体 */
|
|
31
|
+
[role="option"][data-value="Quote"] span,
|
|
32
|
+
[role="option"][data-value="IntenseQuote"] span {
|
|
33
|
+
font-family: "STKaiti", "STSong", "KaiTi", serif !important;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* ============================================================================
|
|
37
|
+
Word 分页编辑器页脚/页眉布局修复(三层前缀兜底 + JS 强制双保险)
|
|
38
|
+
|
|
39
|
+
问题根因(结合截图对比):
|
|
40
|
+
1) 图一(应用中,有 bug):页脚"第 3 页"出现在正文"3.2.2 乙方责任与义务"
|
|
41
|
+
标题的右边、同一水平线,没有在页面底部。说明 .layout-page-footer
|
|
42
|
+
作为普通流元素时宽度被压缩到仅包裹文字,导致它无法独占一行,
|
|
43
|
+
"漂"到了前一段正文的右侧。
|
|
44
|
+
2) 全局 CSS 重置 * { box-sizing: border-box; margin: 0; padding: 0 } 以及
|
|
45
|
+
Tailwind base preflight 会干扰 layout-painter 通过 inline style
|
|
46
|
+
写入的 position / width / top / left 盒模型与定位计算:
|
|
47
|
+
- .layout-page 如果没有明确的 position: relative,页脚 absolute
|
|
48
|
+
定位的锚点会"逃"到外层容器,top/bottom 值完全错位
|
|
49
|
+
- box-sizing: border-box 把内边距算入宽度,使得按 content-box
|
|
50
|
+
计算的页眉/页脚宽度"缩水",内容撑不开,横向宽度不够占满一行
|
|
51
|
+
|
|
52
|
+
修复策略(三层兜底):
|
|
53
|
+
第 1 层(CSS 层 - 三重前缀):
|
|
54
|
+
- 前缀 A: `.ep-root` —— 来自 @eigenpal/docx-editor-react/styles.css 的根类
|
|
55
|
+
- 前缀 B: `#vendorsys-word-editor-root` / `.vendorsys-word-editor-root`
|
|
56
|
+
—— 我们在 WordEditor 外层容器上写入的本地唯一 ID/Class(新增,100% 命中)
|
|
57
|
+
- 无前缀兜底:仅对布局关键类(.layout-page/footer/header)生效,作为最后保险
|
|
58
|
+
第 2 层(JS 层 - 强制写 DOM style):
|
|
59
|
+
- 在 WordEditor/index.tsx 的 useEffect 中,通过 querySelectorAll
|
|
60
|
+
直接把 page.style.position / footer.style.position 写入节点的 style 属性,
|
|
61
|
+
优先级高于任何 CSS 规则(等同内联 style)
|
|
62
|
+
- 配合 MutationObserver + setTimeout 多时间点重试,覆盖异步增量渲染场景
|
|
63
|
+
|
|
64
|
+
无论哪一层命中,都只兜底关键字段(position / display / box-sizing),
|
|
65
|
+
绝不覆盖 top / left / width 的精确像素值(由 layout-painter 内联写入)。
|
|
66
|
+
============================================================================ */
|
|
67
|
+
|
|
68
|
+
/* ————————————————————————————————————————————————————————————————————————————
|
|
69
|
+
前缀 A:.ep-root (@eigenpal/docx-editor-react 默认根类)
|
|
70
|
+
———————————————————————————————————————————————————————————————————————————— */
|
|
71
|
+
|
|
72
|
+
.ep-root .paged-editor,
|
|
73
|
+
.ep-root .paged-editor__pages-container {
|
|
74
|
+
display: block !important;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* —— 修复 dropdown 闪现/被裁掉:把 antd Select 的 popup 从 body 改挂到 .ep-root
|
|
78
|
+
内部之后,必须保证 .ep-root 与外层容器的 overflow 不会裁剪掉 popup。
|
|
79
|
+
popup 的 top 可能超过 .ep-root 的高度,这里显式写 overflow: visible。
|
|
80
|
+
这个选择器前缀(.ep-root / #vendorsys-word-editor-root)和正文 layout 规则
|
|
81
|
+
属于同一层,不会产生任何副作用(只影响溢出裁剪)。
|
|
82
|
+
*/
|
|
83
|
+
.ep-root,
|
|
84
|
+
#vendorsys-word-editor-root,
|
|
85
|
+
.vendorsys-word-editor-root {
|
|
86
|
+
overflow: visible !important;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.ep-root .layout-page {
|
|
90
|
+
position: relative !important;
|
|
91
|
+
box-sizing: content-box !important;
|
|
92
|
+
display: block !important;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.ep-root .layout-page-header {
|
|
96
|
+
position: absolute !important;
|
|
97
|
+
box-sizing: content-box !important;
|
|
98
|
+
display: block !important;
|
|
99
|
+
clear: both !important;
|
|
100
|
+
float: none !important;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* ============== 关键新增:清除"页眉内部包装层"的负 top/left 偏移 ==============
|
|
104
|
+
layout-painter 有时会在页眉/页脚内容外包一层裸 div,并写入
|
|
105
|
+
style="position: relative; top: -XXXpx; left: -YYYpx" 作为相对定位容器。
|
|
106
|
+
正常 Word/WPS 渲染里,页眉/页脚的内容本身就在页眉/页脚的矩形内,
|
|
107
|
+
不应该有任何往外的负偏移。下面几条规则强制把它清零,让孙节点
|
|
108
|
+
(如 .layout-textbox)的 absolute 定位锚点直接落到 header/footer 上。
|
|
109
|
+
============================================================================ */
|
|
110
|
+
.ep-root .layout-page-header > * {
|
|
111
|
+
position: static !important;
|
|
112
|
+
top: 0 !important;
|
|
113
|
+
left: 0 !important;
|
|
114
|
+
right: auto !important;
|
|
115
|
+
bottom: auto !important;
|
|
116
|
+
transform: none !important;
|
|
117
|
+
margin: 0 !important;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.ep-root .layout-page-footer {
|
|
121
|
+
position: absolute !important;
|
|
122
|
+
box-sizing: content-box !important;
|
|
123
|
+
display: block !important;
|
|
124
|
+
clear: both !important;
|
|
125
|
+
float: none !important;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* ============== 关键新增:清除"页脚内部包装层"的负 top/left 偏移 ==============
|
|
129
|
+
这正是用户截图里"第 4 页"漂到正文右边的根因:
|
|
130
|
+
页脚 footer 的 top=1033(底部)是对的,但它的直接子 div 写了
|
|
131
|
+
style="position: relative; top: -168px",把整个 layout-textbox 向上拉了
|
|
132
|
+
168px,导致 Y 坐标变成 1033 - 168 = 865(正好与"乙方责任与义务"同一水平线)。
|
|
133
|
+
这里强制把包装层打回 position:static / top:0,孙节点的 absolute 锚点就会
|
|
134
|
+
直接落到 footer 自身的左上角,textbox 的 top/left 就是相对 footer 的偏移,
|
|
135
|
+
与 WPS 渲染一致,内容正确地待在页脚矩形内。
|
|
136
|
+
============================================================================ */
|
|
137
|
+
.ep-root .layout-page-footer > * {
|
|
138
|
+
position: static !important;
|
|
139
|
+
top: 0 !important;
|
|
140
|
+
left: 0 !important;
|
|
141
|
+
right: auto !important;
|
|
142
|
+
bottom: auto !important;
|
|
143
|
+
transform: none !important;
|
|
144
|
+
margin: 0 !important;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.ep-root .layout-page-content {
|
|
148
|
+
box-sizing: content-box !important;
|
|
149
|
+
display: block !important;
|
|
150
|
+
clear: both !important;
|
|
151
|
+
float: none !important;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.ep-root .layout-page-header > *,
|
|
155
|
+
.ep-root .layout-page-footer > *,
|
|
156
|
+
.ep-root .layout-page-header p,
|
|
157
|
+
.ep-root .layout-page-footer p {
|
|
158
|
+
text-align: inherit;
|
|
159
|
+
float: none !important;
|
|
160
|
+
clear: both;
|
|
161
|
+
box-sizing: content-box !important;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.ep-root .layout-page-header *,
|
|
165
|
+
.ep-root .layout-page-footer * {
|
|
166
|
+
box-sizing: content-box !important;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.ep-root .docx-editor__pages-container,
|
|
170
|
+
.ep-root .docx-editor-vue__pages-container,
|
|
171
|
+
.ep-root .prosemirror-zoom-container,
|
|
172
|
+
.ep-root .prosemirror-editor-wrapper {
|
|
173
|
+
box-sizing: content-box !important;
|
|
174
|
+
display: block !important;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.ep-root .layout-paragraph,
|
|
178
|
+
.ep-root .layout-line,
|
|
179
|
+
.ep-root .layout-fragment {
|
|
180
|
+
box-sizing: content-box !important;
|
|
181
|
+
display: block !important;
|
|
182
|
+
float: none !important;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.ep-root .docx-editor__scroll-container,
|
|
186
|
+
.ep-root .docx-editor-vue__pages-viewport {
|
|
187
|
+
display: block !important;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/* ============== 关键新增:页眉/页脚内的 .layout-textbox 收缩 + 居中 ==============
|
|
191
|
+
问题场景(用户对比 WPS):
|
|
192
|
+
.layout-page-footer 宽 554px,内部 .layout-textbox 被 layout-painter 写死为
|
|
193
|
+
width: 192px,left: 181px → 外层盒子在页脚里是居中的,但 textbox 内部段落
|
|
194
|
+
是 text-align: left → "第 4 页"(约 40px 宽)在 192px 大盒里靠左,文字实际
|
|
195
|
+
中心点比页脚中心偏左 ~76px,和 WPS 的"页码正好居中"观感不一致。
|
|
196
|
+
|
|
197
|
+
解决思路(不猜测 docx 原文段落想左/中/右对齐,通用更稳):
|
|
198
|
+
1) 把 textbox 本身从"固定 192x192 大框"收缩成"刚好包裹内容的小盒"
|
|
199
|
+
→ width:auto; height:auto(内容只有 ~40x14.6,不再是 192 大框)
|
|
200
|
+
2) 把收缩后的小盒用 left:50% + translateX(-50%) 水平居中
|
|
201
|
+
→ 小盒中心正好落在页脚中心
|
|
202
|
+
3) 因为小盒宽度 = 内容宽度,所以无论段落内部是 left/center/right 对齐,
|
|
203
|
+
视觉效果都等于"文字整体正好在页脚正中心",与 WPS 完全一致。
|
|
204
|
+
|
|
205
|
+
仅在 .layout-page-header / .layout-page-footer 内生效,绝不碰正文里的
|
|
206
|
+
layout-textbox(正文 textbox 需要精确坐标承载浮动图片/文本框)。
|
|
207
|
+
============================================================================ */
|
|
208
|
+
.ep-root .layout-page-header .layout-textbox,
|
|
209
|
+
.ep-root .layout-page-footer .layout-textbox {
|
|
210
|
+
width: auto !important;
|
|
211
|
+
height: auto !important;
|
|
212
|
+
min-width: 0 !important;
|
|
213
|
+
min-height: 0 !important;
|
|
214
|
+
left: 50% !important;
|
|
215
|
+
transform: translateX(-50%) !important;
|
|
216
|
+
top: 0 !important;
|
|
217
|
+
bottom: auto !important;
|
|
218
|
+
right: auto !important;
|
|
219
|
+
position: absolute !important;
|
|
220
|
+
box-sizing: content-box !important;
|
|
221
|
+
padding: 0 !important;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/* 页眉/页脚 textbox 内部的段落/行/片段:收缩后取消 block 默认 100% 宽,
|
|
225
|
+
避免内部又撑开到原来的 192px */
|
|
226
|
+
.ep-root .layout-page-header .layout-textbox .layout-paragraph,
|
|
227
|
+
.ep-root .layout-page-footer .layout-textbox .layout-paragraph,
|
|
228
|
+
.ep-root .layout-page-header .layout-textbox .layout-line,
|
|
229
|
+
.ep-root .layout-page-footer .layout-textbox .layout-line {
|
|
230
|
+
display: inline-block !important;
|
|
231
|
+
width: auto !important;
|
|
232
|
+
box-sizing: content-box !important;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/* ————————————————————————————————————————————————————————————————————————————
|
|
236
|
+
前缀 B:#vendorsys-word-editor-root(本地唯一容器)
|
|
237
|
+
———————————————————————————————————————————————————————————————————————————— */
|
|
238
|
+
|
|
239
|
+
#vendorsys-word-editor-root .paged-editor,
|
|
240
|
+
#vendorsys-word-editor-root .paged-editor__pages-container,
|
|
241
|
+
.vendorsys-word-editor-root .paged-editor,
|
|
242
|
+
.vendorsys-word-editor-root .paged-editor__pages-container {
|
|
243
|
+
display: block !important;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/* 页面容器:作为页眉/页脚 absolute 定位的锚点(最关键) */
|
|
247
|
+
#vendorsys-word-editor-root .layout-page,
|
|
248
|
+
.vendorsys-word-editor-root .layout-page {
|
|
249
|
+
position: relative !important;
|
|
250
|
+
box-sizing: content-box !important;
|
|
251
|
+
display: block !important;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/* 页眉:position / display / box-sizing 兜底,精确坐标仍由内联 style 决定 */
|
|
255
|
+
#vendorsys-word-editor-root .layout-page-header,
|
|
256
|
+
.vendorsys-word-editor-root .layout-page-header {
|
|
257
|
+
position: absolute !important;
|
|
258
|
+
box-sizing: content-box !important;
|
|
259
|
+
display: block !important;
|
|
260
|
+
clear: both !important;
|
|
261
|
+
float: none !important;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/* 页眉内部包装层清零:同步前缀 A 的修复 */
|
|
265
|
+
#vendorsys-word-editor-root .layout-page-header > *,
|
|
266
|
+
.vendorsys-word-editor-root .layout-page-header > * {
|
|
267
|
+
position: static !important;
|
|
268
|
+
top: 0 !important;
|
|
269
|
+
left: 0 !important;
|
|
270
|
+
right: auto !important;
|
|
271
|
+
bottom: auto !important;
|
|
272
|
+
transform: none !important;
|
|
273
|
+
margin: 0 !important;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/* 页脚:核心修复 —— 强制 absolute + block,防止漂到正文右侧同一行 */
|
|
277
|
+
#vendorsys-word-editor-root .layout-page-footer,
|
|
278
|
+
.vendorsys-word-editor-root .layout-page-footer {
|
|
279
|
+
position: absolute !important;
|
|
280
|
+
box-sizing: content-box !important;
|
|
281
|
+
display: block !important;
|
|
282
|
+
clear: both !important;
|
|
283
|
+
float: none !important;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/* 页脚内部包装层清零:修复 top:-168px 把内容拉到正文右侧同一水平线的问题 */
|
|
287
|
+
#vendorsys-word-editor-root .layout-page-footer > *,
|
|
288
|
+
.vendorsys-word-editor-root .layout-page-footer > * {
|
|
289
|
+
position: static !important;
|
|
290
|
+
top: 0 !important;
|
|
291
|
+
left: 0 !important;
|
|
292
|
+
right: auto !important;
|
|
293
|
+
bottom: auto !important;
|
|
294
|
+
transform: none !important;
|
|
295
|
+
margin: 0 !important;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
#vendorsys-word-editor-root .layout-page-content,
|
|
299
|
+
.vendorsys-word-editor-root .layout-page-content {
|
|
300
|
+
box-sizing: content-box !important;
|
|
301
|
+
display: block !important;
|
|
302
|
+
clear: both !important;
|
|
303
|
+
float: none !important;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
#vendorsys-word-editor-root .layout-page-header > *,
|
|
307
|
+
.vendorsys-word-editor-root .layout-page-header > *,
|
|
308
|
+
#vendorsys-word-editor-root .layout-page-footer > *,
|
|
309
|
+
.vendorsys-word-editor-root .layout-page-footer > *,
|
|
310
|
+
#vendorsys-word-editor-root .layout-page-header p,
|
|
311
|
+
.vendorsys-word-editor-root .layout-page-header p,
|
|
312
|
+
#vendorsys-word-editor-root .layout-page-footer p,
|
|
313
|
+
.vendorsys-word-editor-root .layout-page-footer p {
|
|
314
|
+
text-align: inherit;
|
|
315
|
+
float: none !important;
|
|
316
|
+
clear: both;
|
|
317
|
+
box-sizing: content-box !important;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
#vendorsys-word-editor-root .layout-page-header *,
|
|
321
|
+
.vendorsys-word-editor-root .layout-page-header *,
|
|
322
|
+
#vendorsys-word-editor-root .layout-page-footer *,
|
|
323
|
+
.vendorsys-word-editor-root .layout-page-footer * {
|
|
324
|
+
box-sizing: content-box !important;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
#vendorsys-word-editor-root .docx-editor__pages-container,
|
|
328
|
+
.vendorsys-word-editor-root .docx-editor__pages-container,
|
|
329
|
+
#vendorsys-word-editor-root .docx-editor-vue__pages-container,
|
|
330
|
+
.vendorsys-word-editor-root .docx-editor-vue__pages-container,
|
|
331
|
+
#vendorsys-word-editor-root .prosemirror-zoom-container,
|
|
332
|
+
.vendorsys-word-editor-root .prosemirror-zoom-container,
|
|
333
|
+
#vendorsys-word-editor-root .prosemirror-editor-wrapper,
|
|
334
|
+
.vendorsys-word-editor-root .prosemirror-editor-wrapper {
|
|
335
|
+
box-sizing: content-box !important;
|
|
336
|
+
display: block !important;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
#vendorsys-word-editor-root .layout-paragraph,
|
|
340
|
+
.vendorsys-word-editor-root .layout-paragraph,
|
|
341
|
+
#vendorsys-word-editor-root .layout-line,
|
|
342
|
+
.vendorsys-word-editor-root .layout-line,
|
|
343
|
+
#vendorsys-word-editor-root .layout-fragment,
|
|
344
|
+
.vendorsys-word-editor-root .layout-fragment {
|
|
345
|
+
box-sizing: content-box !important;
|
|
346
|
+
display: block !important;
|
|
347
|
+
float: none !important;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
#vendorsys-word-editor-root .docx-editor__scroll-container,
|
|
351
|
+
.vendorsys-word-editor-root .docx-editor__scroll-container,
|
|
352
|
+
#vendorsys-word-editor-root .docx-editor-vue__pages-viewport,
|
|
353
|
+
.vendorsys-word-editor-root .docx-editor-vue__pages-viewport {
|
|
354
|
+
display: block !important;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/* 前缀 B 同步:页眉/页脚内的 layout-textbox 收缩 + 居中(规则与前缀 A 等价) */
|
|
358
|
+
#vendorsys-word-editor-root .layout-page-header .layout-textbox,
|
|
359
|
+
.vendorsys-word-editor-root .layout-page-header .layout-textbox,
|
|
360
|
+
#vendorsys-word-editor-root .layout-page-footer .layout-textbox,
|
|
361
|
+
.vendorsys-word-editor-root .layout-page-footer .layout-textbox {
|
|
362
|
+
width: auto !important;
|
|
363
|
+
height: auto !important;
|
|
364
|
+
min-width: 0 !important;
|
|
365
|
+
min-height: 0 !important;
|
|
366
|
+
left: 50% !important;
|
|
367
|
+
transform: translateX(-50%) !important;
|
|
368
|
+
top: 0 !important;
|
|
369
|
+
bottom: auto !important;
|
|
370
|
+
right: auto !important;
|
|
371
|
+
position: absolute !important;
|
|
372
|
+
box-sizing: content-box !important;
|
|
373
|
+
padding: 0 !important;
|
|
374
|
+
}
|
|
375
|
+
#vendorsys-word-editor-root .layout-page-header .layout-textbox .layout-paragraph,
|
|
376
|
+
.vendorsys-word-editor-root .layout-page-header .layout-textbox .layout-paragraph,
|
|
377
|
+
#vendorsys-word-editor-root .layout-page-footer .layout-textbox .layout-paragraph,
|
|
378
|
+
.vendorsys-word-editor-root .layout-page-footer .layout-textbox .layout-paragraph,
|
|
379
|
+
#vendorsys-word-editor-root .layout-page-header .layout-textbox .layout-line,
|
|
380
|
+
.vendorsys-word-editor-root .layout-page-header .layout-textbox .layout-line,
|
|
381
|
+
#vendorsys-word-editor-root .layout-page-footer .layout-textbox .layout-line,
|
|
382
|
+
.vendorsys-word-editor-root .layout-page-footer .layout-textbox .layout-line {
|
|
383
|
+
display: inline-block !important;
|
|
384
|
+
width: auto !important;
|
|
385
|
+
box-sizing: content-box !important;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/* ————————————————————————————————————————————————————————————————————————————
|
|
389
|
+
无前缀兜底:对 layout-* 核心类生效(最后一层保险)
|
|
390
|
+
仅对最关键的定位/盒模型字段加 !important,其它不碰
|
|
391
|
+
———————————————————————————————————————————————————————————————————————————— */
|
|
392
|
+
|
|
393
|
+
.layout-page {
|
|
394
|
+
position: relative;
|
|
395
|
+
box-sizing: content-box;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
.layout-page-header,
|
|
399
|
+
.layout-page-footer {
|
|
400
|
+
position: absolute;
|
|
401
|
+
box-sizing: content-box;
|
|
402
|
+
display: block;
|
|
403
|
+
clear: both;
|
|
404
|
+
float: none;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/* 无前缀兜底:页眉/页脚内部包装层同样清零负偏移 */
|
|
408
|
+
.layout-page-header > *,
|
|
409
|
+
.layout-page-footer > * {
|
|
410
|
+
position: static !important;
|
|
411
|
+
top: 0 !important;
|
|
412
|
+
left: 0 !important;
|
|
413
|
+
right: auto !important;
|
|
414
|
+
bottom: auto !important;
|
|
415
|
+
transform: none !important;
|
|
416
|
+
margin: 0 !important;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/* 无前缀兜底:页眉/页脚内的 layout-textbox 收缩 + 居中(最后一层保险) */
|
|
420
|
+
.layout-page-header .layout-textbox,
|
|
421
|
+
.layout-page-footer .layout-textbox {
|
|
422
|
+
width: auto !important;
|
|
423
|
+
height: auto !important;
|
|
424
|
+
min-width: 0 !important;
|
|
425
|
+
min-height: 0 !important;
|
|
426
|
+
left: 50% !important;
|
|
427
|
+
transform: translateX(-50%) !important;
|
|
428
|
+
top: 0 !important;
|
|
429
|
+
position: absolute !important;
|
|
430
|
+
box-sizing: content-box !important;
|
|
431
|
+
padding: 0 !important;
|
|
432
|
+
}
|
|
433
|
+
.layout-page-header .layout-textbox .layout-paragraph,
|
|
434
|
+
.layout-page-footer .layout-textbox .layout-paragraph,
|
|
435
|
+
.layout-page-header .layout-textbox .layout-line,
|
|
436
|
+
.layout-page-footer .layout-textbox .layout-line {
|
|
437
|
+
display: inline-block !important;
|
|
438
|
+
width: auto !important;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
.layout-page-content {
|
|
442
|
+
box-sizing: content-box;
|
|
443
|
+
display: block;
|
|
444
|
+
float: none;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/* ============================================================================
|
|
448
|
+
自定义段落样式选择器(WordEditor toolbarExtra 里新增的 antd Select)
|
|
449
|
+
下拉选项预览样式:为不同 styleId 设置正确的字体/字号/加粗等视觉特征,
|
|
450
|
+
让用户在下拉框里一眼就能看到样式长什么样(和 Word/WPS 一致)。
|
|
451
|
+
对应 JSX 里给每个 option 加的 className: `style-preview-${styleId}`。
|
|
452
|
+
============================================================================ */
|
|
453
|
+
|
|
454
|
+
/* 通用:所有 style-preview 选项让字体渲染更清晰、不要让 antd 截断高度 */
|
|
455
|
+
.ep-root .style-preview-Normal,
|
|
456
|
+
#vendorsys-word-editor-root .style-preview-Normal,
|
|
457
|
+
.style-preview-Normal,
|
|
458
|
+
.ep-root .style-preview-Heading1,
|
|
459
|
+
#vendorsys-word-editor-root .style-preview-Heading1,
|
|
460
|
+
.style-preview-Heading1,
|
|
461
|
+
.ep-root .style-preview-Heading2,
|
|
462
|
+
#vendorsys-word-editor-root .style-preview-Heading2,
|
|
463
|
+
.style-preview-Heading2,
|
|
464
|
+
.ep-root .style-preview-Heading3,
|
|
465
|
+
#vendorsys-word-editor-root .style-preview-Heading3,
|
|
466
|
+
.style-preview-Heading3,
|
|
467
|
+
.ep-root .style-preview-Title,
|
|
468
|
+
#vendorsys-word-editor-root .style-preview-Title,
|
|
469
|
+
.style-preview-Title,
|
|
470
|
+
.ep-root .style-preview-Subtitle,
|
|
471
|
+
#vendorsys-word-editor-root .style-preview-Subtitle,
|
|
472
|
+
.style-preview-Subtitle,
|
|
473
|
+
.ep-root .style-preview-Quote,
|
|
474
|
+
#vendorsys-word-editor-root .style-preview-Quote,
|
|
475
|
+
.style-preview-Quote,
|
|
476
|
+
.ep-root .style-preview-IntenseQuote,
|
|
477
|
+
#vendorsys-word-editor-root .style-preview-IntenseQuote,
|
|
478
|
+
.style-preview-IntenseQuote,
|
|
479
|
+
.ep-root .style-preview-NoSpacing,
|
|
480
|
+
#vendorsys-word-editor-root .style-preview-NoSpacing,
|
|
481
|
+
.style-preview-NoSpacing,
|
|
482
|
+
.ep-root .style-preview-PlainText,
|
|
483
|
+
#vendorsys-word-editor-root .style-preview-PlainText,
|
|
484
|
+
.style-preview-PlainText {
|
|
485
|
+
line-height: 1.8 !important;
|
|
486
|
+
padding: 2px 6px !important;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/* 正文 Normal —— 仿宋 三号 */
|
|
490
|
+
.ep-root .style-preview-Normal,
|
|
491
|
+
#vendorsys-word-editor-root .style-preview-Normal,
|
|
492
|
+
.style-preview-Normal {
|
|
493
|
+
font-family: "STFangsong", "STSong", "FangSong", serif !important;
|
|
494
|
+
font-size: 16px !important;
|
|
495
|
+
font-weight: normal !important;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/* 标题 1 —— 黑体 小二号 加粗 */
|
|
499
|
+
.ep-root .style-preview-Heading1,
|
|
500
|
+
#vendorsys-word-editor-root .style-preview-Heading1,
|
|
501
|
+
.style-preview-Heading1,
|
|
502
|
+
/* 标题 Title 同样用黑体(我们 preset 里 Title 的字体属性是黑体+大字号) */
|
|
503
|
+
.ep-root .style-preview-Title,
|
|
504
|
+
#vendorsys-word-editor-root .style-preview-Title,
|
|
505
|
+
.style-preview-Title {
|
|
506
|
+
font-family: "STHeiti", "STSong", "SimHei", "Microsoft YaHei", sans-serif !important;
|
|
507
|
+
font-size: 18px !important;
|
|
508
|
+
font-weight: 700 !important;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/* 标题 2 —— 黑体 三号 加粗 */
|
|
512
|
+
.ep-root .style-preview-Heading2,
|
|
513
|
+
#vendorsys-word-editor-root .style-preview-Heading2,
|
|
514
|
+
.style-preview-Heading2 {
|
|
515
|
+
font-family: "STHeiti", "STSong", "SimHei", "Microsoft YaHei", sans-serif !important;
|
|
516
|
+
font-size: 16px !important;
|
|
517
|
+
font-weight: 700 !important;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/* 标题 3+4+5+6 —— 黑体 小三号 加粗 */
|
|
521
|
+
.ep-root .style-preview-Heading3,
|
|
522
|
+
#vendorsys-word-editor-root .style-preview-Heading3,
|
|
523
|
+
.style-preview-Heading3,
|
|
524
|
+
.ep-root .style-preview-Heading4,
|
|
525
|
+
#vendorsys-word-editor-root .style-preview-Heading4,
|
|
526
|
+
.style-preview-Heading4,
|
|
527
|
+
.ep-root .style-preview-Heading5,
|
|
528
|
+
#vendorsys-word-editor-root .style-preview-Heading5,
|
|
529
|
+
.style-preview-Heading5,
|
|
530
|
+
.ep-root .style-preview-Heading6,
|
|
531
|
+
#vendorsys-word-editor-root .style-preview-Heading6,
|
|
532
|
+
.style-preview-Heading6 {
|
|
533
|
+
font-family: "STHeiti", "STSong", "SimHei", "Microsoft YaHei", sans-serif !important;
|
|
534
|
+
font-size: 15px !important;
|
|
535
|
+
font-weight: 700 !important;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/* 副标题 Subtitle —— 楷体 三号 */
|
|
539
|
+
.ep-root .style-preview-Subtitle,
|
|
540
|
+
#vendorsys-word-editor-root .style-preview-Subtitle,
|
|
541
|
+
.style-preview-Subtitle {
|
|
542
|
+
font-family: "STKaiti", "STSong", "KaiTi", serif !important;
|
|
543
|
+
font-size: 16px !important;
|
|
544
|
+
font-weight: normal !important;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
/* 引用 Quote / 强调引用 IntenseQuote —— 楷体 三号 倾斜 */
|
|
548
|
+
.ep-root .style-preview-Quote,
|
|
549
|
+
#vendorsys-word-editor-root .style-preview-Quote,
|
|
550
|
+
.style-preview-Quote,
|
|
551
|
+
.ep-root .style-preview-IntenseQuote,
|
|
552
|
+
#vendorsys-word-editor-root .style-preview-IntenseQuote,
|
|
553
|
+
.style-preview-IntenseQuote {
|
|
554
|
+
font-family: "STKaiti", "STSong", "KaiTi", serif !important;
|
|
555
|
+
font-size: 16px !important;
|
|
556
|
+
font-style: italic !important;
|
|
557
|
+
font-weight: normal !important;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/* 紧凑 No Spacing / 纯文本 Plain Text —— 仿宋 小四 */
|
|
561
|
+
.ep-root .style-preview-NoSpacing,
|
|
562
|
+
#vendorsys-word-editor-root .style-preview-NoSpacing,
|
|
563
|
+
.style-preview-NoSpacing,
|
|
564
|
+
.ep-root .style-preview-PlainText,
|
|
565
|
+
#vendorsys-word-editor-root .style-preview-PlainText,
|
|
566
|
+
.style-preview-PlainText {
|
|
567
|
+
font-family: "STFangsong", "STSong", "FangSong", serif !important;
|
|
568
|
+
font-size: 14px !important;
|
|
569
|
+
font-weight: normal !important;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
/* ============================================================================
|
|
573
|
+
隐藏工具栏里 DocxEditor 自带的"段落样式选择器"(避免与自定义 antd Select
|
|
574
|
+
并存导致用户困惑,并且自带的那个 value 同步有 bug)。
|
|
575
|
+
|
|
576
|
+
只保留一层命中手段(配合 JS 脚本加的 data 属性,高优先级 !important 加固):
|
|
577
|
+
1) JS 脚本识别 trigger 文本命中 PRESET_STYLES 的 Radix Select → 隐藏,并加
|
|
578
|
+
data-vendorsys-hidden-style-picker="true"(会排除我们自定义的 Select)
|
|
579
|
+
2) 下面这条 CSS 配合 JS 的 data 属性,再加固一次(防止 React re-render 清掉)
|
|
580
|
+
|
|
581
|
+
—— 为什么不再写更泛的兜底 CSS(如 [class*="toolbar"][data-value=Normal])?
|
|
582
|
+
因为它**无法区分**"DocxEditor 自带的样式选择器"和"我们自定义的 antd Select",
|
|
583
|
+
两个选择器都在 toolbar 区域内、也都可能写 data-value="Normal",泛化规则会
|
|
584
|
+
把我们自定义的样式选择器也隐藏 → 用户看到工具栏样式工具消失(同时字号选择器
|
|
585
|
+
顶到前面的空位置,被误以为"多了一个奇怪的工具")。
|
|
586
|
+
============================================================================ */
|
|
587
|
+
|
|
588
|
+
/* 唯一一层隐藏规则:命中 JS 脚本加的 data 属性(自带样式选择器独有) */
|
|
589
|
+
.ep-root [data-vendorsys-hidden-style-picker="true"],
|
|
590
|
+
#vendorsys-word-editor-root [data-vendorsys-hidden-style-picker="true"],
|
|
591
|
+
[data-vendorsys-hidden-style-picker="true"] {
|
|
592
|
+
display: none !important;
|
|
593
|
+
visibility: hidden !important;
|
|
594
|
+
width: 0 !important;
|
|
595
|
+
height: 0 !important;
|
|
596
|
+
overflow: hidden !important;
|
|
597
|
+
padding: 0 !important;
|
|
598
|
+
margin: 0 !important;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/* ============================================================================
|
|
602
|
+
自定义受控样式选择器 vendorsys-custom-style-picker:极轻量 CSS
|
|
603
|
+
—— 修复上一轮"画蛇添足的通用 position/static 通配符把 antd Select 内部布局彻底搞坏"
|
|
604
|
+
的问题(导致 Select 变成空白白框,点不开也看不到文字)
|
|
605
|
+
|
|
606
|
+
重要结论(从历史踩坑总结):
|
|
607
|
+
之前为页眉/页脚写的全局 !important 规则都带了 .layout-textbox / .layout-paragraph
|
|
608
|
+
这类 layout 专属类名作为前缀,**根本不可能命中 toolbarExtra 里的 antd Select**
|
|
609
|
+
(antd Select 的 DOM 里完全不会出现 .layout-textbox 这种类)。
|
|
610
|
+
所以完全不需要给 antd Select 写任何"通用重置"!
|
|
611
|
+
只需要:
|
|
612
|
+
1) Label "样式:" 的简单样式
|
|
613
|
+
2) dropdown 里的 option 字体预览样式(style-preview-*)
|
|
614
|
+
3) 极少量的 box-sizing / overflow 修正(如果被全局 * { box-sizing: border-box } 影响)
|
|
615
|
+
============================================================================ */
|
|
616
|
+
|
|
617
|
+
/* 1. 最外层容器:在工具栏里看起来是一个独立的、带 Label 的小区域 */
|
|
618
|
+
.ep-root .vendorsys-custom-style-picker,
|
|
619
|
+
#vendorsys-word-editor-root .vendorsys-custom-style-picker,
|
|
620
|
+
.vendorsys-custom-style-picker {
|
|
621
|
+
display: inline-flex !important;
|
|
622
|
+
align-items: center !important;
|
|
623
|
+
height: 28px !important;
|
|
624
|
+
padding: 0 6px !important;
|
|
625
|
+
box-sizing: border-box !important;
|
|
626
|
+
background: transparent !important;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
/* Label "样式:" 的文本样式 */
|
|
630
|
+
.ep-root .vendorsys-custom-style-picker__label,
|
|
631
|
+
#vendorsys-word-editor-root .vendorsys-custom-style-picker__label,
|
|
632
|
+
.vendorsys-custom-style-picker__label {
|
|
633
|
+
font-size: 12px !important;
|
|
634
|
+
line-height: 28px !important;
|
|
635
|
+
color: #8c8c8c !important;
|
|
636
|
+
margin-right: 4px !important;
|
|
637
|
+
white-space: nowrap !important;
|
|
638
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
/* 2. antd Select 只需要修正最基础的 box-sizing 和宽度,
|
|
642
|
+
其余完全交给 antd 默认样式(不要再写 position: static 这种通配符!) */
|
|
643
|
+
.ep-root .vendorsys-custom-style-picker > .ant-select,
|
|
644
|
+
#vendorsys-word-editor-root .vendorsys-custom-style-picker > .ant-select,
|
|
645
|
+
.vendorsys-custom-style-picker > .ant-select {
|
|
646
|
+
width: 150px !important;
|
|
647
|
+
box-sizing: border-box !important;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
/* 3. 挂在 body 下的 antd Select dropdown + 里面每个 option 的字体预览样式
|
|
651
|
+
(这部分之前的逻辑是对的,保留即可)
|
|
652
|
+
|
|
653
|
+
新增:专属 .vendorsys-word-style-dropdown 类的 z-index 强制提升。
|
|
654
|
+
antd 默认 dropdown 的 z-index 只有 150,会被 DocxEditor 的深色主题工具栏
|
|
655
|
+
(z-index 通常在 100~1000 范围)和页面顶部导航(1000+)盖住,用户看到
|
|
656
|
+
"点了 Select 但 popup 完全没出现"的假象。这里提到 10000 保证绝对可见。
|
|
657
|
+
*/
|
|
658
|
+
.ant-select-dropdown.vendorsys-word-style-dropdown,
|
|
659
|
+
body > .ant-select-dropdown.vendorsys-word-style-dropdown {
|
|
660
|
+
z-index: 10000 !important;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
/* —— 2026/08/14 新增:自定义 dropdown option 的样式预览"不会被 antd 默认字体覆盖"保护
|
|
664
|
+
*
|
|
665
|
+
* 根因:antd Select 默认给 `.ant-select-item-option` 写了一个 `font: 12px/22px ...`
|
|
666
|
+
* 简写属性(font-size / line-height / font-family / font-weight 写在同一个属性里),
|
|
667
|
+
* 这个简写的优先级比分开立的 font-size/font-weight 等高,所以即便我们给 option 容器
|
|
668
|
+
* 挂了 `style={{ fontSize: '21px', fontWeight: 700 }}`,antd 的默认 font 简写依然
|
|
669
|
+
* 会把这些值全部重置回 12px/normal,导致用户看到"所有 option 都是 12px 小字体"
|
|
670
|
+
* (就是用户截图 1 的现象)。
|
|
671
|
+
*
|
|
672
|
+
* 修复:用 `font: inherit !important` + `line-height: inherit !important`,
|
|
673
|
+
* 强制 antd 的默认 font 简写失效,让 option 内部元素的字体/字号/加粗/斜体/行高
|
|
674
|
+
* 100% 继承自外层 .ant-select-item-option(我们在上面挂了精确的 inline style)。
|
|
675
|
+
* 再配合 padding 变大,避免大号字体被上下 padding 裁剪。
|
|
676
|
+
*/
|
|
677
|
+
:where(.ant-select-dropdown.vendorsys-word-style-dropdown) .ant-select-item,
|
|
678
|
+
:where(.ant-select-dropdown.vendorsys-word-style-dropdown) .ant-select-item-option,
|
|
679
|
+
:where(.ant-select-dropdown.vendorsys-word-style-dropdown) .ant-select-item-option-content,
|
|
680
|
+
:where(.ant-select-dropdown.vendorsys-word-style-dropdown) .ant-select-item-option-content > * {
|
|
681
|
+
font: inherit !important;
|
|
682
|
+
line-height: inherit !important;
|
|
683
|
+
}
|
|
684
|
+
:where(.ant-select-dropdown.vendorsys-word-style-dropdown) .ant-select-item,
|
|
685
|
+
:where(.ant-select-dropdown.vendorsys-word-style-dropdown) .ant-select-item-option {
|
|
686
|
+
padding-top: 7px !important;
|
|
687
|
+
padding-bottom: 7px !important;
|
|
688
|
+
/* 颜色/下划线/删除线等 inline style 写在容器上时会自动继承到子元素文字,
|
|
689
|
+
此处无需额外声明 */
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
/* 下面 .style-preview-XXX 的规则全部用 :where() 包一层 → 选择器优先级变成 0。
|
|
693
|
+
* 这样做的原因:这些规则是我们之前的"静态手写字体兜底",优先级必须低于
|
|
694
|
+
* 现在每个 option 动态计算的 inline style(inline style 本来就更高,但加上
|
|
695
|
+
* :where() 是为了防止这里之前的 !important 盖掉 inline 计算值)。
|
|
696
|
+
* 只有当某个 Style 缺少 fontFamily 时(inline style 里没设置),这些 CSS
|
|
697
|
+
* 才会作为系统字体兜底生效(不会冲突)。
|
|
698
|
+
*/
|
|
699
|
+
:where(.ant-select-dropdown) .style-preview-Normal {
|
|
700
|
+
font-family: "STFangsong", "STSong", "FangSong", serif !important;
|
|
701
|
+
}
|
|
702
|
+
:where(.ant-select-dropdown) .style-preview-Heading1,
|
|
703
|
+
:where(.ant-select-dropdown) .style-preview-Title {
|
|
704
|
+
font-family: "STHeiti", "STSong", "SimHei", "Microsoft YaHei", sans-serif !important;
|
|
705
|
+
font-weight: 700 !important;
|
|
706
|
+
}
|
|
707
|
+
:where(.ant-select-dropdown) .style-preview-Heading2 {
|
|
708
|
+
font-family: "STHeiti", "STSong", "SimHei", "Microsoft YaHei", sans-serif !important;
|
|
709
|
+
font-weight: 700 !important;
|
|
710
|
+
}
|
|
711
|
+
:where(.ant-select-dropdown) .style-preview-Heading3,
|
|
712
|
+
:where(.ant-select-dropdown) .style-preview-Heading4,
|
|
713
|
+
:where(.ant-select-dropdown) .style-preview-Heading5,
|
|
714
|
+
:where(.ant-select-dropdown) .style-preview-Heading6 {
|
|
715
|
+
font-family: "STHeiti", "STSong", "SimHei", "Microsoft YaHei", sans-serif !important;
|
|
716
|
+
font-weight: 700 !important;
|
|
717
|
+
}
|
|
718
|
+
:where(.ant-select-dropdown) .style-preview-Subtitle {
|
|
719
|
+
font-family: "STKaiti", "STSong", "KaiTi", serif !important;
|
|
720
|
+
}
|
|
721
|
+
:where(.ant-select-dropdown) .style-preview-Quote,
|
|
722
|
+
:where(.ant-select-dropdown) .style-preview-IntenseQuote {
|
|
723
|
+
font-family: "STKaiti", "STSong", "KaiTi", serif !important;
|
|
724
|
+
font-style: italic !important;
|
|
725
|
+
}
|
|
726
|
+
:where(.ant-select-dropdown) .style-preview-NoSpacing,
|
|
727
|
+
:where(.ant-select-dropdown) .style-preview-PlainText {
|
|
728
|
+
font-family: "STFangsong", "STSong", "FangSong", serif !important;
|
|
729
|
+
}
|
|
730
|
+
:where(.ant-select-dropdown) .style-preview-fallback {
|
|
731
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important;
|
|
732
|
+
color: #bfbfbf !important;
|
|
733
|
+
font-style: italic !important;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
/* ============================================================================
|
|
737
|
+
深色模式下:样式下拉框(popup)强制按浅色模式配色显示
|
|
738
|
+
|
|
739
|
+
现象:应用切到深色模式后,popup 挂在 .ep-root 内部,被 DocxEditor 的深色主题
|
|
740
|
+
染成深底浅字,和浅色模式差异很大。
|
|
741
|
+
需求:深色模式下这个下拉框仍按浅色模式显示。
|
|
742
|
+
|
|
743
|
+
注意:每个 option 的字体/颜色是 JS 按样式预览计算后写在 inline style 上的,
|
|
744
|
+
所以这里只覆盖「容器」配色,绝不给 .ant-select-item-option 本身加
|
|
745
|
+
color !important —— 否则会把「引用」的灰色斜体、「强调引用」的蓝色等
|
|
746
|
+
样式预览颜色一起压掉。
|
|
747
|
+
============================================================================ */
|
|
748
|
+
[data-theme="dark"] .ant-select-dropdown.vendorsys-word-style-dropdown {
|
|
749
|
+
background-color: #ffffff !important;
|
|
750
|
+
/* 只作为未设置颜色 option 的继承基色,不直接影响带 inline 预览色的 option */
|
|
751
|
+
color: rgba(0, 0, 0, 0.88) !important;
|
|
752
|
+
/* 根节点有 color-scheme: dark,会让原生滚动条/控件跟着变深,这里单独拉回浅色 */
|
|
753
|
+
color-scheme: light !important;
|
|
754
|
+
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12), 0 3px 6px -4px rgba(0, 0, 0, 0.16) !important;
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
[data-theme="dark"] .ant-select-dropdown.vendorsys-word-style-dropdown .rc-virtual-list-holder,
|
|
758
|
+
[data-theme="dark"] .ant-select-dropdown.vendorsys-word-style-dropdown .rc-virtual-list-holder-inner {
|
|
759
|
+
background-color: #ffffff !important;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
/* 选项文字:这里刻意「不加 !important」。
|
|
763
|
+
antd 深色算法给 .ant-select-item-option 写了一条 color(浅色字),
|
|
764
|
+
优先级低于本规则(多了 .vendorsys-word-style-dropdown 一级类名)会被覆盖;
|
|
765
|
+
而每个 option 自带的 inline 预览色(引用=灰、强调引用=蓝等)优先级高于
|
|
766
|
+
任何非 !important 的样式表规则,所以仍然正常生效。 */
|
|
767
|
+
[data-theme="dark"] .ant-select-dropdown.vendorsys-word-style-dropdown .ant-select-item,
|
|
768
|
+
[data-theme="dark"] .ant-select-dropdown.vendorsys-word-style-dropdown .ant-select-item-option,
|
|
769
|
+
[data-theme="dark"] .ant-select-dropdown.vendorsys-word-style-dropdown .ant-select-item-option-content {
|
|
770
|
+
color: rgba(0, 0, 0, 0.88);
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
[data-theme="dark"] .ant-select-dropdown.vendorsys-word-style-dropdown .ant-select-item-option-active:not(.ant-select-item-option-disabled) {
|
|
774
|
+
background-color: #f5f5f5 !important;
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
[data-theme="dark"] .ant-select-dropdown.vendorsys-word-style-dropdown .ant-select-item-option-selected:not(.ant-select-item-option-disabled) {
|
|
778
|
+
background-color: #e6f4ff !important;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
[data-theme="dark"] .ant-select-dropdown.vendorsys-word-style-dropdown .ant-select-item-option-disabled {
|
|
782
|
+
color: #bfbfbf !important;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
[data-theme="dark"] .ant-select-dropdown.vendorsys-word-style-dropdown ::-webkit-scrollbar-thumb {
|
|
786
|
+
background-color: rgba(0, 0, 0, 0.2) !important;
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
/* 工具栏上的触发框(「样式:正文」那个 Select 本体)也按浅色模式渲染 */
|
|
790
|
+
[data-theme="dark"] .vendorsys-custom-style-picker {
|
|
791
|
+
/* 外层容器背景是 JS inline 的 rgba(255,255,255,0.04),深色下几乎看不见 */
|
|
792
|
+
background: rgba(0, 0, 0, 0.04) !important;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
[data-theme="dark"] .vendorsys-custom-style-picker .ant-select-selector {
|
|
796
|
+
background-color: #ffffff !important;
|
|
797
|
+
border-color: #d9d9d9 !important;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
[data-theme="dark"] .vendorsys-custom-style-picker .ant-select-selection-item,
|
|
801
|
+
[data-theme="dark"] .vendorsys-custom-style-picker .ant-select-selection-placeholder {
|
|
802
|
+
color: rgba(0, 0, 0, 0.88) !important;
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
[data-theme="dark"] .vendorsys-custom-style-picker .ant-select-arrow {
|
|
806
|
+
color: rgba(0, 0, 0, 0.45) !important;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
[data-theme="dark"] .vendorsys-custom-style-picker:hover .ant-select-selector,
|
|
810
|
+
[data-theme="dark"] .vendorsys-custom-style-picker .ant-select-focused .ant-select-selector {
|
|
811
|
+
border-color: #4096ff !important;
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
/* ============================================================================
|
|
815
|
+
红头分隔线:修正 paragraph.attrs.borders.bottom 渲染异常的三层 CSS 兜底
|
|
816
|
+
|
|
817
|
+
问题(对应 JS 里 markHongTouSeparatorParagraphs 的说明):
|
|
818
|
+
1) lib 把其他 undefined 边 fallback 成 bottom 的样式 → 画出四边框(用户截图反馈)
|
|
819
|
+
2) lib 把 border 画在 line-box 上而非 paragraph 容器上 → 短文字时红线只紧贴文字宽度
|
|
820
|
+
|
|
821
|
+
修复策略(不影响保存,只改浏览器视觉):
|
|
822
|
+
A. 先清掉 lib 在目标 paragraph 上写的任何 border(四边全部 none)
|
|
823
|
+
B. paragraph 容器加 position: relative + padding-bottom(模拟 Word w:space=1pt)
|
|
824
|
+
C. 用 ::after 伪元素绝对定位,画一条横贯整段宽的红色 1.5pt ≈ 2px 实线
|
|
825
|
+
- 位置:paragraph 容器最下方 (bottom:0),占满整段宽 (left/right:0)
|
|
826
|
+
- 效果与 Word 的 pBdr.bottom 完全一致(整段横红线 + 1pt 间距)
|
|
827
|
+
D. 三层前缀兜底 (.ep-root / #vendorsys-word-editor-root / .vendorsys-word-editor-root)
|
|
828
|
+
保证无论在哪种布局环境下都能命中,且使用 !important 压盖 lib 内联样式。
|
|
829
|
+
============================================================================ */
|
|
830
|
+
|
|
831
|
+
/* —— 前缀 A:.ep-root(@eigenpal/docx-editor-react 自带) —— */
|
|
832
|
+
.ep-root [data-vendorsys-style-id="HongTouSeparator"],
|
|
833
|
+
.ep-root .vendorsys-pstyle-hongtouseparator {
|
|
834
|
+
position: relative !important;
|
|
835
|
+
border-top: none !important;
|
|
836
|
+
border-left: none !important;
|
|
837
|
+
border-right: none !important;
|
|
838
|
+
border-bottom: none !important;
|
|
839
|
+
padding-bottom: 2px !important; /* 模拟 Word pBdr.space=1 (≈ 1.33px) 下的视觉间距 */
|
|
840
|
+
box-sizing: content-box !important; /* 防止 padding-bottom 被 box-sizing 吞掉导致横线错位 */
|
|
841
|
+
}
|
|
842
|
+
.ep-root [data-vendorsys-style-id="HongTouSeparator"]::after,
|
|
843
|
+
.ep-root .vendorsys-pstyle-hongtouseparator::after {
|
|
844
|
+
content: '' !important;
|
|
845
|
+
display: block !important;
|
|
846
|
+
position: absolute !important;
|
|
847
|
+
left: 0 !important;
|
|
848
|
+
right: 0 !important;
|
|
849
|
+
bottom: 0 !important;
|
|
850
|
+
width: auto !important; /* 让 left/right 共同决定占满整段容器宽 */
|
|
851
|
+
height: 2px !important; /* 1.5pt = size=12 (12/8=1.5pt),浏览器视觉用 2px 最接近国标红头线粗 */
|
|
852
|
+
background-color: #FF0000 !important; /* 与红头文字同色 */
|
|
853
|
+
opacity: 1 !important;
|
|
854
|
+
visibility: visible !important;
|
|
855
|
+
pointer-events: none !important; /* 不挡选区点击、光标定位 */
|
|
856
|
+
z-index: 1 !important;
|
|
857
|
+
border: none !important; /* 防止伪元素自身被父级 border 继承污染 */
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
/* —— 前缀 B:我们自己加的唯一 ID / Class 容器(最强兜底) —— */
|
|
861
|
+
#vendorsys-word-editor-root [data-vendorsys-style-id="HongTouSeparator"],
|
|
862
|
+
#vendorsys-word-editor-root .vendorsys-pstyle-hongtouseparator,
|
|
863
|
+
.vendorsys-word-editor-root [data-vendorsys-style-id="HongTouSeparator"],
|
|
864
|
+
.vendorsys-word-editor-root .vendorsys-pstyle-hongtouseparator {
|
|
865
|
+
position: relative !important;
|
|
866
|
+
border-top: none !important;
|
|
867
|
+
border-left: none !important;
|
|
868
|
+
border-right: none !important;
|
|
869
|
+
border-bottom: none !important;
|
|
870
|
+
padding-bottom: 2px !important;
|
|
871
|
+
box-sizing: content-box !important;
|
|
872
|
+
}
|
|
873
|
+
#vendorsys-word-editor-root [data-vendorsys-style-id="HongTouSeparator"]::after,
|
|
874
|
+
#vendorsys-word-editor-root .vendorsys-pstyle-hongtouseparator::after,
|
|
875
|
+
.vendorsys-word-editor-root [data-vendorsys-style-id="HongTouSeparator"]::after,
|
|
876
|
+
.vendorsys-word-editor-root .vendorsys-pstyle-hongtouseparator::after {
|
|
877
|
+
content: '' !important;
|
|
878
|
+
display: block !important;
|
|
879
|
+
position: absolute !important;
|
|
880
|
+
left: 0 !important;
|
|
881
|
+
right: 0 !important;
|
|
882
|
+
bottom: 0 !important;
|
|
883
|
+
width: auto !important;
|
|
884
|
+
height: 2px !important;
|
|
885
|
+
background-color: #FF0000 !important;
|
|
886
|
+
opacity: 1 !important;
|
|
887
|
+
visibility: visible !important;
|
|
888
|
+
pointer-events: none !important;
|
|
889
|
+
z-index: 1 !important;
|
|
890
|
+
border: none !important;
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
/* —— 前缀 C:无前缀兜底(在 iframe / 脱离容器的场景也能命中) —— */
|
|
894
|
+
[data-vendorsys-style-id="HongTouSeparator"],
|
|
895
|
+
.vendorsys-pstyle-hongtouseparator {
|
|
896
|
+
position: relative !important;
|
|
897
|
+
border-top: none !important;
|
|
898
|
+
border-left: none !important;
|
|
899
|
+
border-right: none !important;
|
|
900
|
+
border-bottom: none !important;
|
|
901
|
+
padding-bottom: 2px !important;
|
|
902
|
+
box-sizing: content-box !important;
|
|
903
|
+
}
|
|
904
|
+
[data-vendorsys-style-id="HongTouSeparator"]::after,
|
|
905
|
+
.vendorsys-pstyle-hongtouseparator::after {
|
|
906
|
+
content: '' !important;
|
|
907
|
+
display: block !important;
|
|
908
|
+
position: absolute !important;
|
|
909
|
+
left: 0 !important;
|
|
910
|
+
right: 0 !important;
|
|
911
|
+
bottom: 0 !important;
|
|
912
|
+
width: auto !important;
|
|
913
|
+
height: 2px !important;
|
|
914
|
+
background-color: #FF0000 !important;
|
|
915
|
+
opacity: 1 !important;
|
|
916
|
+
visibility: visible !important;
|
|
917
|
+
pointer-events: none !important;
|
|
918
|
+
z-index: 1 !important;
|
|
919
|
+
border: none !important;
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
/* ===== 粘贴选项浮动按钮(WPS 风格) ===== */
|
|
923
|
+
.vendorsys-paste-smart-tag {
|
|
924
|
+
position: fixed;
|
|
925
|
+
z-index: 11000;
|
|
926
|
+
}
|
|
927
|
+
.vendorsys-paste-smart-tag-trigger {
|
|
928
|
+
display: inline-flex;
|
|
929
|
+
align-items: center;
|
|
930
|
+
gap: 2px;
|
|
931
|
+
padding: 2px 6px;
|
|
932
|
+
background: #fff;
|
|
933
|
+
border: 1px solid #d9d9d9;
|
|
934
|
+
border-radius: 4px;
|
|
935
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
|
936
|
+
cursor: pointer;
|
|
937
|
+
font-size: 13px;
|
|
938
|
+
color: #444;
|
|
939
|
+
}
|
|
940
|
+
.vendorsys-paste-smart-tag-trigger:hover {
|
|
941
|
+
color: #1677ff;
|
|
942
|
+
border-color: #1677ff;
|
|
943
|
+
}
|
|
944
|
+
.vendorsys-paste-smart-tag-trigger .arrow {
|
|
945
|
+
font-size: 9px;
|
|
946
|
+
}
|
|
947
|
+
.vendorsys-paste-smart-tag-menu {
|
|
948
|
+
min-width: 176px;
|
|
949
|
+
background: #fff;
|
|
950
|
+
border: 1px solid #e5e5e5;
|
|
951
|
+
border-radius: 6px;
|
|
952
|
+
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.18);
|
|
953
|
+
padding: 4px 0;
|
|
954
|
+
}
|
|
955
|
+
.vendorsys-paste-smart-tag-menu button {
|
|
956
|
+
display: flex;
|
|
957
|
+
align-items: center;
|
|
958
|
+
justify-content: space-between;
|
|
959
|
+
width: 100%;
|
|
960
|
+
padding: 6px 14px;
|
|
961
|
+
border: none;
|
|
962
|
+
background: transparent;
|
|
963
|
+
cursor: pointer;
|
|
964
|
+
font-size: 13px;
|
|
965
|
+
color: #333;
|
|
966
|
+
text-align: left;
|
|
967
|
+
}
|
|
968
|
+
.vendorsys-paste-smart-tag-menu button:hover {
|
|
969
|
+
background: #f0f5ff;
|
|
970
|
+
color: #1677ff;
|
|
971
|
+
}
|
|
972
|
+
.vendorsys-paste-smart-tag-menu button .key {
|
|
973
|
+
margin-left: 20px;
|
|
974
|
+
font-size: 12px;
|
|
975
|
+
color: #999;
|
|
976
|
+
}
|
|
977
|
+
.vendorsys-paste-smart-tag-menu button:hover .key {
|
|
978
|
+
color: #1677ff;
|
|
979
|
+
}
|
|
980
|
+
[data-theme="dark"] .vendorsys-paste-smart-tag-trigger {
|
|
981
|
+
background: #2b2b2b;
|
|
982
|
+
border-color: #4a4a4a;
|
|
983
|
+
color: #ddd;
|
|
984
|
+
}
|
|
985
|
+
[data-theme="dark"] .vendorsys-paste-smart-tag-menu {
|
|
986
|
+
background: #2b2b2b;
|
|
987
|
+
border-color: #4a4a4a;
|
|
988
|
+
}
|
|
989
|
+
[data-theme="dark"] .vendorsys-paste-smart-tag-menu button {
|
|
990
|
+
color: #ddd;
|
|
991
|
+
}
|
|
992
|
+
[data-theme="dark"] .vendorsys-paste-smart-tag-menu button:hover {
|
|
993
|
+
background: rgba(22, 119, 255, 0.18);
|
|
994
|
+
color: #69a9ff;
|
|
995
|
+
}
|
|
996
|
+
[data-theme="dark"] .vendorsys-paste-smart-tag-menu button:hover .key {
|
|
997
|
+
color: #69a9ff;
|
|
998
|
+
}
|
|
999
|
+
|