@spacecorexdev/core 0.0.2 → 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.
Files changed (345) hide show
  1. package/package.json +20 -38
  2. package/public/cmaps/78-EUC-H.bcmap +0 -0
  3. package/public/cmaps/78-EUC-V.bcmap +0 -0
  4. package/public/cmaps/78-H.bcmap +0 -0
  5. package/public/cmaps/78-RKSJ-H.bcmap +0 -0
  6. package/public/cmaps/78-RKSJ-V.bcmap +0 -0
  7. package/public/cmaps/78-V.bcmap +0 -0
  8. package/public/cmaps/78ms-RKSJ-H.bcmap +0 -0
  9. package/public/cmaps/78ms-RKSJ-V.bcmap +0 -0
  10. package/public/cmaps/83pv-RKSJ-H.bcmap +0 -0
  11. package/public/cmaps/90ms-RKSJ-H.bcmap +0 -0
  12. package/public/cmaps/90ms-RKSJ-V.bcmap +0 -0
  13. package/public/cmaps/90msp-RKSJ-H.bcmap +0 -0
  14. package/public/cmaps/90msp-RKSJ-V.bcmap +0 -0
  15. package/public/cmaps/90pv-RKSJ-H.bcmap +0 -0
  16. package/public/cmaps/90pv-RKSJ-V.bcmap +0 -0
  17. package/public/cmaps/Add-H.bcmap +0 -0
  18. package/public/cmaps/Add-RKSJ-H.bcmap +0 -0
  19. package/public/cmaps/Add-RKSJ-V.bcmap +0 -0
  20. package/public/cmaps/Add-V.bcmap +0 -0
  21. package/public/cmaps/Adobe-CNS1-0.bcmap +0 -0
  22. package/public/cmaps/Adobe-CNS1-1.bcmap +0 -0
  23. package/public/cmaps/Adobe-CNS1-2.bcmap +0 -0
  24. package/public/cmaps/Adobe-CNS1-3.bcmap +0 -0
  25. package/public/cmaps/Adobe-CNS1-4.bcmap +0 -0
  26. package/public/cmaps/Adobe-CNS1-5.bcmap +0 -0
  27. package/public/cmaps/Adobe-CNS1-6.bcmap +0 -0
  28. package/public/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  29. package/public/cmaps/Adobe-GB1-0.bcmap +0 -0
  30. package/public/cmaps/Adobe-GB1-1.bcmap +0 -0
  31. package/public/cmaps/Adobe-GB1-2.bcmap +0 -0
  32. package/public/cmaps/Adobe-GB1-3.bcmap +0 -0
  33. package/public/cmaps/Adobe-GB1-4.bcmap +0 -0
  34. package/public/cmaps/Adobe-GB1-5.bcmap +0 -0
  35. package/public/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  36. package/public/cmaps/Adobe-Japan1-0.bcmap +0 -0
  37. package/public/cmaps/Adobe-Japan1-1.bcmap +0 -0
  38. package/public/cmaps/Adobe-Japan1-2.bcmap +0 -0
  39. package/public/cmaps/Adobe-Japan1-3.bcmap +0 -0
  40. package/public/cmaps/Adobe-Japan1-4.bcmap +0 -0
  41. package/public/cmaps/Adobe-Japan1-5.bcmap +0 -0
  42. package/public/cmaps/Adobe-Japan1-6.bcmap +0 -0
  43. package/public/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  44. package/public/cmaps/Adobe-Korea1-0.bcmap +0 -0
  45. package/public/cmaps/Adobe-Korea1-1.bcmap +0 -0
  46. package/public/cmaps/Adobe-Korea1-2.bcmap +0 -0
  47. package/public/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  48. package/public/cmaps/B5-H.bcmap +0 -0
  49. package/public/cmaps/B5-V.bcmap +0 -0
  50. package/public/cmaps/B5pc-H.bcmap +0 -0
  51. package/public/cmaps/B5pc-V.bcmap +0 -0
  52. package/public/cmaps/CNS-EUC-H.bcmap +0 -0
  53. package/public/cmaps/CNS-EUC-V.bcmap +0 -0
  54. package/public/cmaps/CNS1-H.bcmap +0 -0
  55. package/public/cmaps/CNS1-V.bcmap +0 -0
  56. package/public/cmaps/CNS2-H.bcmap +0 -0
  57. package/public/cmaps/CNS2-V.bcmap +3 -0
  58. package/public/cmaps/ETHK-B5-H.bcmap +0 -0
  59. package/public/cmaps/ETHK-B5-V.bcmap +0 -0
  60. package/public/cmaps/ETen-B5-H.bcmap +0 -0
  61. package/public/cmaps/ETen-B5-V.bcmap +0 -0
  62. package/public/cmaps/ETenms-B5-H.bcmap +3 -0
  63. package/public/cmaps/ETenms-B5-V.bcmap +0 -0
  64. package/public/cmaps/EUC-H.bcmap +0 -0
  65. package/public/cmaps/EUC-V.bcmap +0 -0
  66. package/public/cmaps/Ext-H.bcmap +0 -0
  67. package/public/cmaps/Ext-RKSJ-H.bcmap +0 -0
  68. package/public/cmaps/Ext-RKSJ-V.bcmap +0 -0
  69. package/public/cmaps/Ext-V.bcmap +0 -0
  70. package/public/cmaps/GB-EUC-H.bcmap +0 -0
  71. package/public/cmaps/GB-EUC-V.bcmap +0 -0
  72. package/public/cmaps/GB-H.bcmap +4 -0
  73. package/public/cmaps/GB-V.bcmap +0 -0
  74. package/public/cmaps/GBK-EUC-H.bcmap +0 -0
  75. package/public/cmaps/GBK-EUC-V.bcmap +0 -0
  76. package/public/cmaps/GBK2K-H.bcmap +0 -0
  77. package/public/cmaps/GBK2K-V.bcmap +0 -0
  78. package/public/cmaps/GBKp-EUC-H.bcmap +0 -0
  79. package/public/cmaps/GBKp-EUC-V.bcmap +0 -0
  80. package/public/cmaps/GBT-EUC-H.bcmap +0 -0
  81. package/public/cmaps/GBT-EUC-V.bcmap +0 -0
  82. package/public/cmaps/GBT-H.bcmap +0 -0
  83. package/public/cmaps/GBT-V.bcmap +0 -0
  84. package/public/cmaps/GBTpc-EUC-H.bcmap +0 -0
  85. package/public/cmaps/GBTpc-EUC-V.bcmap +0 -0
  86. package/public/cmaps/GBpc-EUC-H.bcmap +0 -0
  87. package/public/cmaps/GBpc-EUC-V.bcmap +0 -0
  88. package/public/cmaps/H.bcmap +0 -0
  89. package/public/cmaps/HKdla-B5-H.bcmap +0 -0
  90. package/public/cmaps/HKdla-B5-V.bcmap +0 -0
  91. package/public/cmaps/HKdlb-B5-H.bcmap +0 -0
  92. package/public/cmaps/HKdlb-B5-V.bcmap +0 -0
  93. package/public/cmaps/HKgccs-B5-H.bcmap +0 -0
  94. package/public/cmaps/HKgccs-B5-V.bcmap +0 -0
  95. package/public/cmaps/HKm314-B5-H.bcmap +0 -0
  96. package/public/cmaps/HKm314-B5-V.bcmap +0 -0
  97. package/public/cmaps/HKm471-B5-H.bcmap +0 -0
  98. package/public/cmaps/HKm471-B5-V.bcmap +0 -0
  99. package/public/cmaps/HKscs-B5-H.bcmap +0 -0
  100. package/public/cmaps/HKscs-B5-V.bcmap +0 -0
  101. package/public/cmaps/Hankaku.bcmap +0 -0
  102. package/public/cmaps/Hiragana.bcmap +0 -0
  103. package/public/cmaps/KSC-EUC-H.bcmap +0 -0
  104. package/public/cmaps/KSC-EUC-V.bcmap +0 -0
  105. package/public/cmaps/KSC-H.bcmap +0 -0
  106. package/public/cmaps/KSC-Johab-H.bcmap +0 -0
  107. package/public/cmaps/KSC-Johab-V.bcmap +0 -0
  108. package/public/cmaps/KSC-V.bcmap +0 -0
  109. package/public/cmaps/KSCms-UHC-H.bcmap +0 -0
  110. package/public/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  111. package/public/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  112. package/public/cmaps/KSCms-UHC-V.bcmap +0 -0
  113. package/public/cmaps/KSCpc-EUC-H.bcmap +0 -0
  114. package/public/cmaps/KSCpc-EUC-V.bcmap +0 -0
  115. package/public/cmaps/Katakana.bcmap +0 -0
  116. package/public/cmaps/LICENSE +36 -0
  117. package/public/cmaps/NWP-H.bcmap +0 -0
  118. package/public/cmaps/NWP-V.bcmap +0 -0
  119. package/public/cmaps/RKSJ-H.bcmap +0 -0
  120. package/public/cmaps/RKSJ-V.bcmap +0 -0
  121. package/public/cmaps/Roman.bcmap +0 -0
  122. package/public/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  123. package/public/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  124. package/public/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  125. package/public/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  126. package/public/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  127. package/public/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  128. package/public/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  129. package/public/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  130. package/public/cmaps/UniGB-UCS2-H.bcmap +0 -0
  131. package/public/cmaps/UniGB-UCS2-V.bcmap +0 -0
  132. package/public/cmaps/UniGB-UTF16-H.bcmap +0 -0
  133. package/public/cmaps/UniGB-UTF16-V.bcmap +0 -0
  134. package/public/cmaps/UniGB-UTF32-H.bcmap +0 -0
  135. package/public/cmaps/UniGB-UTF32-V.bcmap +0 -0
  136. package/public/cmaps/UniGB-UTF8-H.bcmap +0 -0
  137. package/public/cmaps/UniGB-UTF8-V.bcmap +0 -0
  138. package/public/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  139. package/public/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  140. package/public/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  141. package/public/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  142. package/public/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  143. package/public/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  144. package/public/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  145. package/public/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  146. package/public/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  147. package/public/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  148. package/public/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  149. package/public/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  150. package/public/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  151. package/public/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  152. package/public/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  153. package/public/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  154. package/public/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  155. package/public/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  156. package/public/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  157. package/public/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  158. package/public/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  159. package/public/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  160. package/public/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  161. package/public/cmaps/UniKS-UCS2-H.bcmap +0 -0
  162. package/public/cmaps/UniKS-UCS2-V.bcmap +0 -0
  163. package/public/cmaps/UniKS-UTF16-H.bcmap +0 -0
  164. package/public/cmaps/UniKS-UTF16-V.bcmap +0 -0
  165. package/public/cmaps/UniKS-UTF32-H.bcmap +0 -0
  166. package/public/cmaps/UniKS-UTF32-V.bcmap +0 -0
  167. package/public/cmaps/UniKS-UTF8-H.bcmap +0 -0
  168. package/public/cmaps/UniKS-UTF8-V.bcmap +0 -0
  169. package/public/cmaps/V.bcmap +0 -0
  170. package/public/cmaps/WP-Symbol.bcmap +0 -0
  171. package/public/polyfills/polyfills.js +802 -0
  172. package/public/vendor/docx/docx.worker.js +5 -0
  173. package/public/vendor/docx/jszip.min.js +13 -0
  174. package/public/vendor/libarchive/libarchive.wasm +0 -0
  175. package/public/vendor/libarchive/worker-bundle.js +6 -0
  176. package/public/vendor/pptx/pptx.worker.js +26 -0
  177. package/public/wasm/cad/0.8.2/dwfv-render.wasm +0 -0
  178. package/public/wasm/cad/0.8.2/dwg-worker.js +24 -0
  179. package/public/wasm/cad/0.8.2/dwg-worker.js.map +1 -0
  180. package/public/wasm/cad/0.8.2/libredwg-web.js +2 -0
  181. package/public/wasm/cad/0.8.2/libredwg-web.wasm +0 -0
  182. package/public/wasm/cad/dwfv-render.wasm +0 -0
  183. package/public/wasm/cad/dwg-worker.js +24 -0
  184. package/public/wasm/cad/dwg-worker.js.map +1 -0
  185. package/public/wasm/cad/libredwg-web.js +2 -0
  186. package/public/wasm/cad/libredwg-web.wasm +0 -0
  187. package/public/wasm/data/sql-wasm.wasm +0 -0
  188. package/public/wasm/hdiff.wasm +0 -0
  189. package/public/wasm/model/LICENSE.occt-import-js.txt +504 -0
  190. package/public/wasm/model/LICENSE.occt.txt +502 -0
  191. package/public/wasm/model/occt-import-js.js +19 -0
  192. package/public/wasm/model/occt-import-js.wasm +0 -0
  193. package/public/wasm/model/occt-worker.js +83 -0
  194. package/public/wasm/typst/fonts/DejaVuSansMono-Bold.ttf +0 -0
  195. package/public/wasm/typst/fonts/DejaVuSansMono-BoldOblique.ttf +0 -0
  196. package/public/wasm/typst/fonts/DejaVuSansMono-Oblique.ttf +0 -0
  197. package/public/wasm/typst/fonts/DejaVuSansMono.ttf +0 -0
  198. package/public/wasm/typst/fonts/LibertinusSerif-Bold.otf +0 -0
  199. package/public/wasm/typst/fonts/LibertinusSerif-BoldItalic.otf +0 -0
  200. package/public/wasm/typst/fonts/LibertinusSerif-Italic.otf +0 -0
  201. package/public/wasm/typst/fonts/LibertinusSerif-Regular.otf +0 -0
  202. package/public/wasm/typst/fonts/LibertinusSerif-Semibold.otf +0 -0
  203. package/public/wasm/typst/fonts/LibertinusSerif-SemiboldItalic.otf +0 -0
  204. package/public/wasm/typst/fonts/NewCM10-Bold.otf +0 -0
  205. package/public/wasm/typst/fonts/NewCM10-BoldItalic.otf +0 -0
  206. package/public/wasm/typst/fonts/NewCM10-Italic.otf +0 -0
  207. package/public/wasm/typst/fonts/NewCM10-Regular.otf +0 -0
  208. package/public/wasm/typst/fonts/NewCMMath-Bold.otf +0 -0
  209. package/public/wasm/typst/fonts/NewCMMath-Book.otf +0 -0
  210. package/public/wasm/typst/fonts/NewCMMath-Regular.otf +0 -0
  211. package/public/wasm/typst/fonts/README.md +7 -0
  212. package/public/wasm/typst/typst_ts_renderer_bg.wasm +0 -0
  213. package/public/wasm/typst/typst_ts_web_compiler_bg.wasm +0 -0
  214. package/scripts/patch-docx-grid.cjs +412 -0
  215. package/src/api/_base.ts +243 -0
  216. package/src/api/index.ts +17 -0
  217. package/src/api/project.ts +1345 -0
  218. package/src/api/user.ts +1174 -0
  219. package/src/contract.ts +50 -0
  220. package/src/hooks/index.ts +2 -0
  221. package/{dist/hooks/index.js → src/hooks/useLongPress.ts} +53 -49
  222. package/src/hooks/useOnlineStatus.ts +22 -0
  223. package/src/index.ts +14 -0
  224. package/src/types/id.ts +2 -0
  225. package/src/types/index.ts +5 -0
  226. package/src/types/project/base.ts +63 -0
  227. package/src/types/project/contract.ts +79 -0
  228. package/src/types/project/contractStatus.tsx +15 -0
  229. package/src/types/project/index.ts +5 -0
  230. package/src/types/project/member.ts +46 -0
  231. package/src/types/project/progress.ts +43 -0
  232. package/src/types/projectRole.ts +17 -0
  233. package/src/types/theme.ts +1 -0
  234. package/src/types/user/index.ts +1 -0
  235. package/src/types/user/role.ts +7 -0
  236. package/src/ui/CommentTimeline/index.tsx +330 -0
  237. package/src/ui/FileManager/FileContextMenu.tsx +628 -0
  238. package/src/ui/FileManager/FileGridView.tsx +529 -0
  239. package/src/ui/FileManager/FileTableView.tsx +405 -0
  240. package/src/ui/FileManager/FileToolbar.tsx +119 -0
  241. package/src/ui/FileManager/FileVersionHistoryModal.tsx +175 -0
  242. package/src/ui/FileManager/MoveCopyToProjectModal.tsx +119 -0
  243. package/src/ui/FileManager/ShareToWechatModal.tsx +419 -0
  244. package/src/ui/FileManager/hooks/useFileManagerActions.ts +2532 -0
  245. package/src/ui/FileManager/hooks/useFileManagerState.ts +419 -0
  246. package/src/ui/FileManager/index.tsx +580 -0
  247. package/src/ui/FileManager/projectFileManagerApi.ts +57 -0
  248. package/src/ui/FileManager/types.ts +184 -0
  249. package/src/ui/FileManager/utils/fileDeltaWorker.ts +193 -0
  250. package/src/ui/FileManager/utils/fileTree.ts +178 -0
  251. package/src/ui/FileManager/utils/fileUpload.ts +714 -0
  252. package/src/ui/FileManager/utils/fileUtils.ts +65 -0
  253. package/src/ui/InvoiceRecordsList/index.tsx +813 -0
  254. package/src/ui/MyFileSelectorModal.tsx +261 -0
  255. package/src/ui/ProjectSelector/index.tsx +472 -0
  256. package/src/ui/ProjectSelector/projectCache.ts +40 -0
  257. package/src/ui/RoleSelector/index.tsx +473 -0
  258. package/src/ui/RoleSelector/roleCache.ts +40 -0
  259. package/src/ui/UIAlert.tsx +399 -0
  260. package/src/ui/UIAlertExample.tsx +129 -0
  261. package/src/ui/UIConfirm.tsx +335 -0
  262. package/src/ui/UIConfirmExample.tsx +165 -0
  263. package/src/ui/UIDatePicker.tsx +146 -0
  264. package/src/ui/UIDateRangePicker.tsx +38 -0
  265. package/src/ui/UIFilePreview/ExcelEditor/index.tsx +617 -0
  266. package/src/ui/UIFilePreview/ExcelEditor/types.ts +24 -0
  267. package/src/ui/UIFilePreview/ExportDropdown.css +85 -0
  268. package/src/ui/UIFilePreview/ExportDropdown.tsx +109 -0
  269. package/src/ui/UIFilePreview/IndexedDBUtils.ts +564 -0
  270. package/src/ui/UIFilePreview/MarkdownEditor/exportMarkdownPdf.ts +576 -0
  271. package/src/ui/UIFilePreview/MarkdownEditor/index.tsx +677 -0
  272. package/src/ui/UIFilePreview/MarkdownEditor/markdownEditor.css +1005 -0
  273. package/src/ui/UIFilePreview/MarkdownEditor/types.ts +15 -0
  274. package/src/ui/UIFilePreview/PPTXEditor/index.tsx +602 -0
  275. package/src/ui/UIFilePreview/RichDocEditor/exportRDocMarkdown.ts +77 -0
  276. package/src/ui/UIFilePreview/RichDocEditor/exportRDocPdf.ts +374 -0
  277. package/src/ui/UIFilePreview/RichDocEditor/index.tsx +730 -0
  278. package/src/ui/UIFilePreview/RichDocEditor/richdoc-editor.css +59 -0
  279. package/src/ui/UIFilePreview/UIFilePreview.tsx +611 -0
  280. package/src/ui/UIFilePreview/WordEditor/index.tsx +3933 -0
  281. package/src/ui/UIFilePreview/WordEditor/style.ts +1213 -0
  282. package/src/ui/UIFilePreview/WordEditor/word-editor.css +999 -0
  283. package/src/ui/UIFilePreview/filePreview.css +193 -0
  284. package/src/ui/UIFilePreview/filetypes/archive.tsx +66 -0
  285. package/src/ui/UIFilePreview/filetypes/cad.tsx +287 -0
  286. package/src/ui/UIFilePreview/filetypes/excel.tsx +355 -0
  287. package/src/ui/UIFilePreview/filetypes/image.tsx +20 -0
  288. package/src/ui/UIFilePreview/filetypes/imageLoader.ts +63 -0
  289. package/src/ui/UIFilePreview/filetypes/pdf.tsx +156 -0
  290. package/src/ui/UIFilePreview/filetypes/ppt.tsx +535 -0
  291. package/src/ui/UIFilePreview/filetypes/pptExportPdf.ts +523 -0
  292. package/src/ui/UIFilePreview/filetypes/video.tsx +482 -0
  293. package/src/ui/UIFilePreview/filetypes/word.tsx +245 -0
  294. package/src/ui/UIFilePreview/filetypes/wordExportMarkdown.ts +86 -0
  295. package/src/ui/UIFilePreview/filetypes/wordExportPdf.tsx +427 -0
  296. package/src/ui/UIFilePreview/index.ts +35 -0
  297. package/src/ui/UIFilePreview/pdfPagination.ts +143 -0
  298. package/src/ui/UIFilePreview/previewUtils.tsx +531 -0
  299. package/src/ui/UIFileUpload.tsx +382 -0
  300. package/src/ui/UIImageUpload.tsx +195 -0
  301. package/src/ui/UILoading.tsx +255 -0
  302. package/src/ui/UILoadingExample.tsx +139 -0
  303. package/src/ui/UISelect.tsx +105 -0
  304. package/src/ui/UIToast.tsx +381 -0
  305. package/src/ui/UIToastExample.tsx +69 -0
  306. package/src/ui/UIToastSingle.tsx +279 -0
  307. package/src/ui/UIViewToggle.tsx +64 -0
  308. package/src/ui/UserSelector/index.tsx +583 -0
  309. package/src/ui/index.ts +84 -0
  310. package/src/ui/upload/image.ts +135 -0
  311. package/src/ui/upload/index.ts +73 -0
  312. package/src/ui/upload/submitFile.ts +106 -0
  313. package/src/ui/upload/submitForm.ts +124 -0
  314. package/src/ui/upload/upload.err.ts +15 -0
  315. package/src/ui/upload/upload.ts +250 -0
  316. package/src/utils/CacheDepartmentInfo.ts +372 -0
  317. package/src/utils/CacheFileContent.ts +315 -0
  318. package/src/utils/CachePermissionInfo.ts +235 -0
  319. package/src/utils/CacheRoleInfo.ts +303 -0
  320. package/src/utils/CacheUserInfo.ts +818 -0
  321. package/src/utils/CacheViewToggleInfo.ts +182 -0
  322. package/src/utils/MessageContentUtils.ts +268 -0
  323. package/src/utils/clipboard.ts +70 -0
  324. package/src/utils/companyEmail.ts +19 -0
  325. package/src/utils/forbidDebugger.ts +59 -0
  326. package/src/utils/formatters.ts +94 -0
  327. package/src/utils/htmlUtils.tsx +59 -0
  328. package/src/utils/index.ts +18 -0
  329. package/src/utils/keyboard.ts +114 -0
  330. package/src/utils/mammothApi.ts +16 -0
  331. package/src/utils/polyfills.ts +928 -0
  332. package/src/utils/regex.ts +14 -0
  333. package/src/utils/storage.ts +95 -0
  334. package/src/utils/workerBootstrap.ts +87 -0
  335. package/dist/api/index.js +0 -1553
  336. package/dist/contract.js +0 -5
  337. package/dist/index.js +0 -4492
  338. package/dist/types/index.js +0 -49
  339. package/dist/ui/index.css +0 -1876
  340. package/dist/ui/index.js +0 -22245
  341. package/dist/utils/index.js +0 -4296
  342. /package/{dist → src}/styles/ant-modal.css +0 -0
  343. /package/{dist → src}/styles/ant-spin.css +0 -0
  344. /package/{dist → src}/styles/ant-table.css +0 -0
  345. /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
+