@e-xi/xion 0.0.6

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 (542) hide show
  1. package/README.md +1 -0
  2. package/dist/bin/icon-generator.d.ts +22 -0
  3. package/dist/bin/index.d.ts +5 -0
  4. package/dist/bin/index.js +92 -0
  5. package/dist/bin/logo-generator.d.ts +22 -0
  6. package/dist/chunk-files/chunk-34OODP7M.js +147 -0
  7. package/dist/chunk-files/chunk-3KBZWBNP.js +51 -0
  8. package/dist/chunk-files/chunk-3R6EJDYR.js +10 -0
  9. package/dist/chunk-files/chunk-3RVKOFMP.js +68 -0
  10. package/dist/chunk-files/chunk-3S5OTD47.js +35 -0
  11. package/dist/chunk-files/chunk-3XB4IEWO.js +195 -0
  12. package/dist/chunk-files/chunk-3XOVD6UX.js +8 -0
  13. package/dist/chunk-files/chunk-4HEDNQUP.js +426 -0
  14. package/dist/chunk-files/chunk-4SSGMLEE.js +934 -0
  15. package/dist/chunk-files/chunk-5PKWVAQP.js +92 -0
  16. package/dist/chunk-files/chunk-6BOPFOZD.js +19 -0
  17. package/dist/chunk-files/chunk-6FDO72PN.js +25 -0
  18. package/dist/chunk-files/chunk-6X74EPRM.js +0 -0
  19. package/dist/chunk-files/chunk-B2FI5WI5.js +67 -0
  20. package/dist/chunk-files/chunk-B7DTBTWQ.js +74 -0
  21. package/dist/chunk-files/chunk-BFD2LHLK.js +60 -0
  22. package/dist/chunk-files/chunk-BJOPQNB2.js +319 -0
  23. package/dist/chunk-files/chunk-BMOLIJ3W.js +89 -0
  24. package/dist/chunk-files/chunk-BPTFUGTP.js +97 -0
  25. package/dist/chunk-files/chunk-CSUNGWAE.js +405 -0
  26. package/dist/chunk-files/chunk-D5ZV4VMI.js +627 -0
  27. package/dist/chunk-files/chunk-DD6WZ4NY.js +841 -0
  28. package/dist/chunk-files/chunk-DEODEAKM.js +19 -0
  29. package/dist/chunk-files/chunk-DRMV3M5V.js +1970 -0
  30. package/dist/chunk-files/chunk-EQTU45UO.js +21 -0
  31. package/dist/chunk-files/chunk-F7YTK2MY.js +154 -0
  32. package/dist/chunk-files/chunk-FMQTZ3QV.js +17 -0
  33. package/dist/chunk-files/chunk-FPN7JYR4.js +67 -0
  34. package/dist/chunk-files/chunk-FULHNQ4O.js +1243 -0
  35. package/dist/chunk-files/chunk-GN2FNR3Z.js +259 -0
  36. package/dist/chunk-files/chunk-GROGDGEL.js +177 -0
  37. package/dist/chunk-files/chunk-GUOSVDXA.js +34 -0
  38. package/dist/chunk-files/chunk-HT5V5A7S.js +6 -0
  39. package/dist/chunk-files/chunk-ID3YDA2K.js +19 -0
  40. package/dist/chunk-files/chunk-IH3R2NDR.js +230 -0
  41. package/dist/chunk-files/chunk-IMGYTSWY.js +261 -0
  42. package/dist/chunk-files/chunk-J34MOWJP.js +26 -0
  43. package/dist/chunk-files/chunk-KFK47PDH.js +77 -0
  44. package/dist/chunk-files/chunk-KFV4GXVE.js +11 -0
  45. package/dist/chunk-files/chunk-LFHJJQW3.js +723 -0
  46. package/dist/chunk-files/chunk-LQ67F6EY.js +32 -0
  47. package/dist/chunk-files/chunk-MJ6Q3TIX.js +703 -0
  48. package/dist/chunk-files/chunk-OUFO3LM4.js +135 -0
  49. package/dist/chunk-files/chunk-P4CX6I4J.js +14 -0
  50. package/dist/chunk-files/chunk-PL5KNBCY.js +78 -0
  51. package/dist/chunk-files/chunk-PVWRRUOK.js +11 -0
  52. package/dist/chunk-files/chunk-Q7LCZIQP.js +15 -0
  53. package/dist/chunk-files/chunk-Q7YMMN7J.js +220 -0
  54. package/dist/chunk-files/chunk-RAVPJRBA.js +118 -0
  55. package/dist/chunk-files/chunk-RN7AI33H.js +26 -0
  56. package/dist/chunk-files/chunk-RODB64YF.js +148 -0
  57. package/dist/chunk-files/chunk-SVTZ4T6S.js +10 -0
  58. package/dist/chunk-files/chunk-T3QCAOCO.js +20 -0
  59. package/dist/chunk-files/chunk-U4XEWVBH.js +19 -0
  60. package/dist/chunk-files/chunk-UCMR6V67.js +746 -0
  61. package/dist/chunk-files/chunk-UFYEZIUE.js +1269 -0
  62. package/dist/chunk-files/chunk-UIJUY7QZ.js +18 -0
  63. package/dist/chunk-files/chunk-VGDNICVG.js +67 -0
  64. package/dist/chunk-files/chunk-W2I3I7U7.js +35 -0
  65. package/dist/chunk-files/chunk-WGYOMA43.js +33 -0
  66. package/dist/chunk-files/chunk-WKVLVI6N.js +44 -0
  67. package/dist/chunk-files/chunk-WOJ2UKI7.js +11 -0
  68. package/dist/chunk-files/chunk-Y3OEXVQ2.js +59 -0
  69. package/dist/chunk-files/chunk-YLZRRUY7.js +6 -0
  70. package/dist/chunk-files/chunk-YTHS2ZV7.js +51 -0
  71. package/dist/chunk-files/chunk-YXAEUJKJ.js +331 -0
  72. package/dist/chunk-files/chunk-YZOJOLFL.js +121 -0
  73. package/dist/main/app/app-lifecycle-abstract.d.ts +190 -0
  74. package/dist/main/app/app-lifecycle.d.ts +7 -0
  75. package/dist/main/app/icons/icon.ico +0 -0
  76. package/dist/main/app/index.d.ts +8 -0
  77. package/dist/main/app/index.js +1226 -0
  78. package/dist/main/app/types/app.d.ts +74 -0
  79. package/dist/main/app/xo-app-abstract.d.ts +464 -0
  80. package/dist/main/app/xo-app.d.ts +23 -0
  81. package/dist/main/auth/index.d.ts +8 -0
  82. package/dist/main/auth/index.js +109 -0
  83. package/dist/main/auth/jwt-auth-manager.d.ts +302 -0
  84. package/dist/main/auth/jwt-auth-provider-abstract.d.ts +100 -0
  85. package/dist/main/auth/jwt-auth-refresh-rejected-error.d.ts +12 -0
  86. package/dist/main/auth/jwt-auth-session-changed-error.d.ts +12 -0
  87. package/dist/main/auth/types/jwt-auth-manager.d.ts +13 -0
  88. package/dist/main/banner/banner-abstract.d.ts +38 -0
  89. package/dist/main/banner/banner-manager.d.ts +20 -0
  90. package/dist/main/banner/index.d.ts +6 -0
  91. package/dist/main/banner/index.js +10 -0
  92. package/dist/main/banner/types/banner.d.ts +17 -0
  93. package/dist/main/config/app-config.d.ts +6 -0
  94. package/dist/main/config/index.d.ts +13 -0
  95. package/dist/main/config/index.js +33 -0
  96. package/dist/main/config/logger-config.d.ts +6 -0
  97. package/dist/main/config/remote-service-config.d.ts +6 -0
  98. package/dist/main/config/tray-config.d.ts +6 -0
  99. package/dist/main/config/types/app.d.ts +38 -0
  100. package/dist/main/config/types/logger.d.ts +82 -0
  101. package/dist/main/config/types/window.d.ts +35 -0
  102. package/dist/main/config/updater-config.d.ts +6 -0
  103. package/dist/main/config/window/main-window-config.d.ts +6 -0
  104. package/dist/main/config/window/setting-window-config.d.ts +6 -0
  105. package/dist/main/file-association/file-association-handlers-abstract.d.ts +23 -0
  106. package/dist/main/file-association/file-association-manager-abstract.d.ts +87 -0
  107. package/dist/main/file-association/file-association-manager.d.ts +13 -0
  108. package/dist/main/file-association/handlers/app-file-association-handlers.d.ts +12 -0
  109. package/dist/main/file-association/index.d.ts +8 -0
  110. package/dist/main/file-association/index.js +13 -0
  111. package/dist/main/file-association/types/file-association.d.ts +31 -0
  112. package/dist/main/ipc/handlers/app-handlers.d.ts +13 -0
  113. package/dist/main/ipc/handlers/auth-handlers.d.ts +12 -0
  114. package/dist/main/ipc/handlers/clipboard-handlers.d.ts +13 -0
  115. package/dist/main/ipc/handlers/contex-menu-handlers.d.ts +13 -0
  116. package/dist/main/ipc/handlers/dialog-handlers.d.ts +13 -0
  117. package/dist/main/ipc/handlers/file-handlers.d.ts +13 -0
  118. package/dist/main/ipc/handlers/log-handlers.d.ts +45 -0
  119. package/dist/main/ipc/handlers/remote-service-handlers.d.ts +13 -0
  120. package/dist/main/ipc/handlers/shell-handlers.d.ts +13 -0
  121. package/dist/main/ipc/handlers/theme-handlers.d.ts +13 -0
  122. package/dist/main/ipc/handlers/updater-handlers.d.ts +13 -0
  123. package/dist/main/ipc/handlers/window-handlers.d.ts +13 -0
  124. package/dist/main/ipc/index.d.ts +20 -0
  125. package/dist/main/ipc/index.js +60 -0
  126. package/dist/main/ipc/ipc-handlers-abstract.d.ts +23 -0
  127. package/dist/main/ipc/ipc-manager-abstract.d.ts +46 -0
  128. package/dist/main/ipc/ipc-manager.d.ts +13 -0
  129. package/dist/main/ipc/types/ipc-handler.d.ts +22 -0
  130. package/dist/main/ipc/utils/ipc-handler-util.d.ts +24 -0
  131. package/dist/main/logger/index.d.ts +4 -0
  132. package/dist/main/logger/index.js +13 -0
  133. package/dist/main/logger/xo-logger.d.ts +113 -0
  134. package/dist/main/menu/consts/menu-type.d.ts +1 -0
  135. package/dist/main/menu/index.d.ts +8 -0
  136. package/dist/main/menu/index.js +28 -0
  137. package/dist/main/menu/menu-items.d.ts +192 -0
  138. package/dist/main/menu/menu-manager-abstract.d.ts +273 -0
  139. package/dist/main/menu/menu-manager.d.ts +12 -0
  140. package/dist/main/menu/types/menu.d.ts +101 -0
  141. package/dist/main/mode/app-mode.d.ts +32 -0
  142. package/dist/main/mode/index.d.ts +5 -0
  143. package/dist/main/mode/index.js +9 -0
  144. package/dist/main/mode/types/mode.d.ts +25 -0
  145. package/dist/main/protocol/consts/protocol-keys.d.ts +10 -0
  146. package/dist/main/protocol/handlers/app-protocol-handlers.d.ts +12 -0
  147. package/dist/main/protocol/index.d.ts +9 -0
  148. package/dist/main/protocol/index.js +15 -0
  149. package/dist/main/protocol/protocol-handlers-abstract.d.ts +23 -0
  150. package/dist/main/protocol/protocol-manager-abstract.d.ts +85 -0
  151. package/dist/main/protocol/protocol-manager.d.ts +13 -0
  152. package/dist/main/protocol/types/protocol.d.ts +33 -0
  153. package/dist/main/remote-service/consts/remote-service-methods.d.ts +5 -0
  154. package/dist/main/remote-service/index.d.ts +7 -0
  155. package/dist/main/remote-service/index.js +17 -0
  156. package/dist/main/remote-service/remote-service-manager-abstract.d.ts +303 -0
  157. package/dist/main/remote-service/remote-service-manager.d.ts +7 -0
  158. package/dist/main/remote-service/types/remote-service.d.ts +9 -0
  159. package/dist/main/renderer-protocol/handlers/renderer-remote-service-protocol-handlers.d.ts +130 -0
  160. package/dist/main/renderer-protocol/handlers/renderer-root-protocol-handlers.d.ts +65 -0
  161. package/dist/main/renderer-protocol/index.d.ts +9 -0
  162. package/dist/main/renderer-protocol/index.js +18 -0
  163. package/dist/main/renderer-protocol/renderer-protocol-handlers-abstract.d.ts +23 -0
  164. package/dist/main/renderer-protocol/renderer-protocol-manager-abstract.d.ts +78 -0
  165. package/dist/main/renderer-protocol/renderer-protocol-manager.d.ts +13 -0
  166. package/dist/main/renderer-protocol/types/renderer-protocol.d.ts +34 -0
  167. package/dist/main/shortcut/handlers/app-shortcut-handlers.d.ts +11 -0
  168. package/dist/main/shortcut/handlers/window-shortcut-handlers.d.ts +11 -0
  169. package/dist/main/shortcut/index.d.ts +9 -0
  170. package/dist/main/shortcut/index.js +17 -0
  171. package/dist/main/shortcut/shortcut-handlers-abstract.d.ts +18 -0
  172. package/dist/main/shortcut/shortcut-manager-abstract.d.ts +121 -0
  173. package/dist/main/shortcut/shortcut-manager.d.ts +12 -0
  174. package/dist/main/shortcut/types/shortcut.d.ts +50 -0
  175. package/dist/main/store/app-store.d.ts +179 -0
  176. package/dist/main/store/index.d.ts +7 -0
  177. package/dist/main/store/index.js +13 -0
  178. package/dist/main/store/jwt-auth-store.d.ts +36 -0
  179. package/dist/main/store/types/app-store.d.ts +46 -0
  180. package/dist/main/store/types/jwt-auth-store.d.ts +14 -0
  181. package/dist/main/theme/consts/theme-sources.d.ts +10 -0
  182. package/dist/main/theme/index.d.ts +7 -0
  183. package/dist/main/theme/index.js +16 -0
  184. package/dist/main/theme/theme-manager-abstract.d.ts +93 -0
  185. package/dist/main/theme/theme-manager.d.ts +7 -0
  186. package/dist/main/theme/types/theme.d.ts +38 -0
  187. package/dist/main/tray/consts/tray-animation-name.d.ts +1 -0
  188. package/dist/main/tray/consts/tray-icon-name.d.ts +1 -0
  189. package/dist/main/tray/icons/blur.ico +0 -0
  190. package/dist/main/tray/icons/error.ico +0 -0
  191. package/dist/main/tray/icons/focus.ico +0 -0
  192. package/dist/main/tray/icons/none.ico +0 -0
  193. package/dist/main/tray/icons/offline.ico +0 -0
  194. package/dist/main/tray/icons/online.ico +0 -0
  195. package/dist/main/tray/icons/success.ico +0 -0
  196. package/dist/main/tray/index.d.ts +11 -0
  197. package/dist/main/tray/index.js +27 -0
  198. package/dist/main/tray/tray-animation.d.ts +48 -0
  199. package/dist/main/tray/tray-icon.d.ts +51 -0
  200. package/dist/main/tray/tray-lifecycle-abstract.d.ts +154 -0
  201. package/dist/main/tray/tray-lifecycle.d.ts +7 -0
  202. package/dist/main/tray/tray-manager.d.ts +173 -0
  203. package/dist/main/tray/types/tray.d.ts +81 -0
  204. package/dist/main/updater/dev-app-update.yml +5 -0
  205. package/dist/main/updater/index.d.ts +6 -0
  206. package/dist/main/updater/index.js +20 -0
  207. package/dist/main/updater/types/updater.d.ts +167 -0
  208. package/dist/main/updater/updater-manager-abstract.d.ts +237 -0
  209. package/dist/main/updater/updater-manager.d.ts +7 -0
  210. package/dist/main/utils/file-association-util.d.ts +43 -0
  211. package/dist/main/utils/index.d.ts +14 -0
  212. package/dist/main/utils/index.js +105 -0
  213. package/dist/main/utils/menu-util.d.ts +12 -0
  214. package/dist/main/utils/protocol-util.d.ts +49 -0
  215. package/dist/main/utils/runtime-config-util.d.ts +75 -0
  216. package/dist/main/utils/shortcut-util.d.ts +38 -0
  217. package/dist/main/utils/tray-util.d.ts +18 -0
  218. package/dist/main/utils/window-util.d.ts +55 -0
  219. package/dist/main/utils/xo-app-root-util.d.ts +30 -0
  220. package/dist/main/utils/xo-app-util.d.ts +24 -0
  221. package/dist/main/utils/xo-path-util.d.ts +59 -0
  222. package/dist/main/utils/xo-util.d.ts +17 -0
  223. package/dist/main/window/index.d.ts +10 -0
  224. package/dist/main/window/index.js +36 -0
  225. package/dist/main/window/main/main-window-lifecycle.d.ts +7 -0
  226. package/dist/main/window/main/main-window-type.d.ts +5 -0
  227. package/dist/main/window/setting/setting-window-lifecycle.d.ts +7 -0
  228. package/dist/main/window/setting/setting-window-type.d.ts +5 -0
  229. package/dist/main/window/types/window.d.ts +86 -0
  230. package/dist/main/window/window-lifecycle-abstract.d.ts +514 -0
  231. package/dist/main/window/window-manager.d.ts +422 -0
  232. package/dist/preload/bridge/bridge-abstract.d.ts +11 -0
  233. package/dist/preload/bridge/bridge.d.ts +35 -0
  234. package/dist/preload/bridge/index.d.ts +6 -0
  235. package/dist/preload/bridge/index.js +117 -0
  236. package/dist/preload/bridge/preload.cjs +1706 -0
  237. package/dist/preload/bridge/preload.internal.d.ts +1 -0
  238. package/dist/preload/bridge/types/bridge.d.ts +19 -0
  239. package/dist/preload/bridges/app/app-bridge.d.ts +142 -0
  240. package/dist/preload/bridges/app/types/app.d.ts +65 -0
  241. package/dist/preload/bridges/auth/auth-bridge.d.ts +36 -0
  242. package/dist/preload/bridges/auth/types/auth.d.ts +23 -0
  243. package/dist/preload/bridges/clipboard/clipboard-bridge.d.ts +37 -0
  244. package/dist/preload/bridges/clipboard/types/clipboard.d.ts +23 -0
  245. package/dist/preload/bridges/context-menu/context-menu-bridge.d.ts +27 -0
  246. package/dist/preload/bridges/context-menu/types/context-menu.d.ts +19 -0
  247. package/dist/preload/bridges/dialog/dialog-bridge.d.ts +30 -0
  248. package/dist/preload/bridges/dialog/types/dialog.d.ts +41 -0
  249. package/dist/preload/bridges/file/file-bridge.d.ts +34 -0
  250. package/dist/preload/bridges/file/types/file.d.ts +21 -0
  251. package/dist/preload/bridges/index.d.ts +29 -0
  252. package/dist/preload/bridges/index.js +40 -0
  253. package/dist/preload/bridges/ipc/ipc-bridge.d.ts +43 -0
  254. package/dist/preload/bridges/ipc/types/ipc.d.ts +23 -0
  255. package/dist/preload/bridges/log/log-bridge.d.ts +52 -0
  256. package/dist/preload/bridges/log/types/log.d.ts +20 -0
  257. package/dist/preload/bridges/remote-service/remote-service-bridge.d.ts +55 -0
  258. package/dist/preload/bridges/remote-service/types/remote-service.d.ts +29 -0
  259. package/dist/preload/bridges/shell/shell-bridge.d.ts +27 -0
  260. package/dist/preload/bridges/shell/types/shell.d.ts +19 -0
  261. package/dist/preload/bridges/theme/theme-bridge.d.ts +32 -0
  262. package/dist/preload/bridges/theme/types/theme.d.ts +21 -0
  263. package/dist/preload/bridges/updater/types/updater.d.ts +35 -0
  264. package/dist/preload/bridges/updater/updater-bridge.d.ts +66 -0
  265. package/dist/preload/bridges/window/internal/route-redirect-buffer.d.ts +36 -0
  266. package/dist/preload/bridges/window/types/window.d.ts +53 -0
  267. package/dist/preload/bridges/window/window-bridge.d.ts +118 -0
  268. package/dist/preload/utils/bridge-util.d.ts +43 -0
  269. package/dist/preload/utils/index.d.ts +4 -0
  270. package/dist/preload/utils/index.js +7 -0
  271. package/dist/renderer/app/bootstrap-renderer.d.ts +6 -0
  272. package/dist/renderer/app/index.d.ts +5 -0
  273. package/dist/renderer/app/index.js +164 -0
  274. package/dist/renderer/app/styles-element-plus.internal.d.ts +2 -0
  275. package/dist/renderer/app/styles-xion.internal.d.ts +2 -0
  276. package/dist/renderer/app/types/app.d.ts +51 -0
  277. package/dist/renderer/components/captcha/internal/captcha-controller.d.ts +280 -0
  278. package/dist/renderer/components/captcha/internal/captcha-css-property.d.ts +25 -0
  279. package/dist/renderer/components/captcha/internal/captcha-defaults.d.ts +33 -0
  280. package/dist/renderer/components/captcha/internal/captcha-errors.d.ts +21 -0
  281. package/dist/renderer/components/captcha/internal/captcha-helper.d.ts +72 -0
  282. package/dist/renderer/components/captcha/internal/captcha-injector.d.ts +16 -0
  283. package/dist/renderer/components/captcha/internal/captcha-runtime-types.d.ts +153 -0
  284. package/dist/renderer/components/captcha/internal/captcha-service.d.ts +22 -0
  285. package/dist/renderer/components/captcha/internal/captcha-slide-types.d.ts +62 -0
  286. package/dist/renderer/components/captcha/internal/captcha-ui-patch.d.ts +43 -0
  287. package/dist/renderer/components/captcha/internal/captcha-wasm-loader.d.ts +36 -0
  288. package/dist/renderer/components/captcha/style/index.less +132 -0
  289. package/dist/renderer/components/captcha/types/captcha.d.ts +132 -0
  290. package/dist/renderer/components/captcha/xo-captcha-host.vue +151 -0
  291. package/dist/renderer/components/captcha/xo-captcha.vue +83 -0
  292. package/dist/renderer/components/captcha.d.ts +40 -0
  293. package/dist/renderer/components/context-menu/types/context-menu.d.ts +55 -0
  294. package/dist/renderer/components/context-menu/xo-context-menu-items.vue +112 -0
  295. package/dist/renderer/components/context-menu/xo-context-menu.vue +356 -0
  296. package/dist/renderer/components/context-menu.d.ts +32 -0
  297. package/dist/renderer/components/divider/types/divider.d.ts +31 -0
  298. package/dist/renderer/components/divider/xo-divider.vue +176 -0
  299. package/dist/renderer/components/form/types/form-flex-row.d.ts +21 -0
  300. package/dist/renderer/components/form/types/form-flex.d.ts +49 -0
  301. package/dist/renderer/components/form/xo-form-flex-row.vue +122 -0
  302. package/dist/renderer/components/form/xo-form-flex.vue +115 -0
  303. package/dist/renderer/components/index.d.ts +70 -0
  304. package/dist/renderer/components/index.js +1282 -0
  305. package/dist/renderer/components/layouts/types/app-layout.d.ts +29 -0
  306. package/dist/renderer/components/layouts/types/mini-layout.d.ts +23 -0
  307. package/dist/renderer/components/layouts/types/simple-layout.d.ts +17 -0
  308. package/dist/renderer/components/layouts/xo-app-layout.vue +350 -0
  309. package/dist/renderer/components/layouts/xo-mini-layout.vue +207 -0
  310. package/dist/renderer/components/layouts/xo-simple-layout.vue +43 -0
  311. package/dist/renderer/components/pages/types/app-page.d.ts +25 -0
  312. package/dist/renderer/components/pages/types/bootstrap-page.d.ts +35 -0
  313. package/dist/renderer/components/pages/types/dynamic-page.d.ts +20 -0
  314. package/dist/renderer/components/pages/types/settings-page.d.ts +23 -0
  315. package/dist/renderer/components/pages/xo-app-page.vue +230 -0
  316. package/dist/renderer/components/pages/xo-bootstrap-page.vue +93 -0
  317. package/dist/renderer/components/pages/xo-dynamic-page.vue +28 -0
  318. package/dist/renderer/components/pages/xo-settings-page.vue +143 -0
  319. package/dist/renderer/components/radio-group/types/radio-group.d.ts +30 -0
  320. package/dist/renderer/components/radio-group/xo-radio-group.vue +38 -0
  321. package/dist/renderer/components/service-status-bar/types/service-status-bar.d.ts +65 -0
  322. package/dist/renderer/components/service-status-bar/xo-service-status-bar.vue +193 -0
  323. package/dist/renderer/components/settings-components/types/setting-app-opacity.d.ts +19 -0
  324. package/dist/renderer/components/settings-components/types/setting-log-level.d.ts +23 -0
  325. package/dist/renderer/components/settings-components/types/setting-shortcut-keys-record-for-form-flex-rows.d.ts +47 -0
  326. package/dist/renderer/components/settings-components/types/setting-shortcut-keys-record.d.ts +23 -0
  327. package/dist/renderer/components/settings-components/types/setting-window-material.d.ts +23 -0
  328. package/dist/renderer/components/settings-components/xo-setting-app-opacity.vue +105 -0
  329. package/dist/renderer/components/settings-components/xo-setting-log-level.vue +84 -0
  330. package/dist/renderer/components/settings-components/xo-setting-shortcut-keys-record-for-form-flex-rows.vue +37 -0
  331. package/dist/renderer/components/settings-components/xo-setting-shortcut-keys-record.vue +74 -0
  332. package/dist/renderer/components/settings-components/xo-setting-window-material.vue +83 -0
  333. package/dist/renderer/components/settings-pages/types/setting-page-folder.d.ts +41 -0
  334. package/dist/renderer/components/settings-pages/types/setting-page-general.d.ts +23 -0
  335. package/dist/renderer/components/settings-pages/types/setting-page-remote-service.d.ts +19 -0
  336. package/dist/renderer/components/settings-pages/types/setting-page-updater.d.ts +27 -0
  337. package/dist/renderer/components/settings-pages/xo-setting-page-folder.vue +137 -0
  338. package/dist/renderer/components/settings-pages/xo-setting-page-general.vue +255 -0
  339. package/dist/renderer/components/settings-pages/xo-setting-page-remote-service.vue +183 -0
  340. package/dist/renderer/components/settings-pages/xo-setting-page-updater.vue +350 -0
  341. package/dist/renderer/components/shortcut-keys-record/types/shortcut-keys-record.d.ts +25 -0
  342. package/dist/renderer/components/shortcut-keys-record/xo-shortcut-keys-record.vue +161 -0
  343. package/dist/renderer/components/side-bar/types/sidebar-logo.d.ts +39 -0
  344. package/dist/renderer/components/side-bar/xo-sidebar-logo.vue +133 -0
  345. package/dist/renderer/components/spacing-line/types/spacing-line.d.ts +17 -0
  346. package/dist/renderer/components/spacing-line/xo-spacing-line.vue +53 -0
  347. package/dist/renderer/components/theme-switch/types/theme-switch-mini.d.ts +21 -0
  348. package/dist/renderer/components/theme-switch/types/theme-switch.d.ts +45 -0
  349. package/dist/renderer/components/theme-switch/xo-theme-switch-mini.vue +93 -0
  350. package/dist/renderer/components/theme-switch/xo-theme-switch.vue +200 -0
  351. package/dist/renderer/components/title-bar/types/title-bar.d.ts +58 -0
  352. package/dist/renderer/components/title-bar/xo-title-bar.vue +364 -0
  353. package/dist/renderer/components/types/sidebar-menu.d.ts +37 -0
  354. package/dist/renderer/components/types/vue.d.ts +9 -0
  355. package/dist/renderer/components/updater/types/updater.d.ts +97 -0
  356. package/dist/renderer/components/updater/xo-updater.vue +1190 -0
  357. package/dist/renderer/components/window-control/types/window-control.d.ts +17 -0
  358. package/dist/renderer/components/window-control/xo-window-control.vue +193 -0
  359. package/dist/renderer/composables/index.d.ts +7 -0
  360. package/dist/renderer/composables/index.js +570 -0
  361. package/dist/renderer/composables/use-xo-boolean.d.ts +14 -0
  362. package/dist/renderer/composables/use-xo-data-loader.d.ts +73 -0
  363. package/dist/renderer/composables/use-xo-form-control.d.ts +84 -0
  364. package/dist/renderer/composables/use-xo-updater-action.d.ts +25 -0
  365. package/dist/renderer/global/index.d.ts +4 -0
  366. package/dist/renderer/global/index.js +0 -0
  367. package/dist/renderer/global/types/window.d.ts +21 -0
  368. package/dist/renderer/icons/demo.css +539 -0
  369. package/dist/renderer/icons/iconfont.css +490 -0
  370. package/dist/renderer/services/index.d.ts +6 -0
  371. package/dist/renderer/services/index.js +444 -0
  372. package/dist/renderer/services/orval-axios-mutator.d.ts +9 -0
  373. package/dist/renderer/services/types/xo-api.d.ts +92 -0
  374. package/dist/renderer/services/xo-api-requester.d.ts +129 -0
  375. package/dist/renderer/store/app/app-store.d.ts +68 -0
  376. package/dist/renderer/store/auth/auth-store.d.ts +43 -0
  377. package/dist/renderer/store/index.d.ts +9 -0
  378. package/dist/renderer/store/index.js +595 -0
  379. package/dist/renderer/store/remote-service/remote-service-store.d.ts +52 -0
  380. package/dist/renderer/store/theme/theme-store.d.ts +52 -0
  381. package/dist/renderer/store/updater/updater-store.d.ts +88 -0
  382. package/dist/renderer/store/window/window-store.d.ts +58 -0
  383. package/dist/renderer/styles/css/element-plus.less +280 -0
  384. package/dist/renderer/styles/css/iconfont-patch.less +6 -0
  385. package/dist/renderer/styles/css/reset.less +83 -0
  386. package/dist/renderer/styles/css/scrollbar.less +56 -0
  387. package/dist/renderer/styles/index.less +35 -0
  388. package/dist/renderer/styles/mixin.less +144 -0
  389. package/dist/renderer/styles/var/element-plus/dark.less +32 -0
  390. package/dist/renderer/styles/var/element-plus/root.less +88 -0
  391. package/dist/renderer/styles/var/global/dark.less +10 -0
  392. package/dist/renderer/styles/var/global/root.less +46 -0
  393. package/dist/renderer/styles/var/layout/dark.less +7 -0
  394. package/dist/renderer/styles/var/layout/root.less +9 -0
  395. package/dist/renderer/styles/var/scrollbar/dark.less +13 -0
  396. package/dist/renderer/styles/var/scrollbar/root.less +35 -0
  397. package/dist/renderer/utils/auth-route-util.d.ts +117 -0
  398. package/dist/renderer/utils/context-util.d.ts +13 -0
  399. package/dist/renderer/utils/error-util.d.ts +12 -0
  400. package/dist/renderer/utils/index.d.ts +14 -0
  401. package/dist/renderer/utils/index.js +1522 -0
  402. package/dist/renderer/utils/keyboard-util.d.ts +86 -0
  403. package/dist/renderer/utils/message-util.d.ts +161 -0
  404. package/dist/renderer/utils/renderer-log-util.d.ts +44 -0
  405. package/dist/renderer/utils/renderer-util.d.ts +37 -0
  406. package/dist/renderer/utils/router-util.d.ts +186 -0
  407. package/dist/renderer/utils/shortcut-util.d.ts +20 -0
  408. package/dist/renderer/utils/storage-util.d.ts +85 -0
  409. package/dist/renderer/utils/types/vue-router.d.ts +17 -0
  410. package/dist/shared/app/consts/app-launch-mode.d.ts +9 -0
  411. package/dist/shared/app/consts/update-mode.d.ts +8 -0
  412. package/dist/shared/app/consts/window-close-behavior.d.ts +8 -0
  413. package/dist/shared/app/consts/window-material.d.ts +8 -0
  414. package/dist/shared/app/consts/xion-name.d.ts +5 -0
  415. package/dist/shared/app/electron-app-config.d.ts +5 -0
  416. package/dist/shared/app/index.d.ts +16 -0
  417. package/dist/shared/app/index.js +30 -0
  418. package/dist/shared/app/types/app-info.d.ts +32 -0
  419. package/dist/shared/app/types/app-launch-mode.d.ts +13 -0
  420. package/dist/shared/app/types/app-paths.d.ts +27 -0
  421. package/dist/shared/app/types/general-settings.d.ts +27 -0
  422. package/dist/shared/app/types/on-window-close.d.ts +13 -0
  423. package/dist/shared/app/types/update-mode.d.ts +13 -0
  424. package/dist/shared/app/types/window-material.d.ts +2 -0
  425. package/dist/shared/auth/const/auth-status.d.ts +2 -0
  426. package/dist/shared/auth/index.d.ts +5 -0
  427. package/dist/shared/auth/index.js +5 -0
  428. package/dist/shared/auth/types/auth.d.ts +78 -0
  429. package/dist/shared/color/consts/color.d.ts +5 -0
  430. package/dist/shared/color/index.d.ts +5 -0
  431. package/dist/shared/color/index.js +6 -0
  432. package/dist/shared/color/types/color.d.ts +26 -0
  433. package/dist/shared/electron-builder/index.d.ts +4 -0
  434. package/dist/shared/electron-builder/index.js +0 -0
  435. package/dist/shared/electron-builder/types/electron-builder-options.d.ts +34 -0
  436. package/dist/shared/errors/index.d.ts +4 -0
  437. package/dist/shared/errors/index.js +10 -0
  438. package/dist/shared/errors/ipc-invoke-error.d.ts +32 -0
  439. package/dist/shared/ipc/channels/app-channels.d.ts +56 -0
  440. package/dist/shared/ipc/channels/auth-channels.d.ts +14 -0
  441. package/dist/shared/ipc/channels/clipboard-channels.d.ts +14 -0
  442. package/dist/shared/ipc/channels/context-menu-channels.d.ts +10 -0
  443. package/dist/shared/ipc/channels/dialog-channels.d.ts +12 -0
  444. package/dist/shared/ipc/channels/file-channels.d.ts +12 -0
  445. package/dist/shared/ipc/channels/log-channels.d.ts +14 -0
  446. package/dist/shared/ipc/channels/remote-service-channels.d.ts +20 -0
  447. package/dist/shared/ipc/channels/shell-channels.d.ts +10 -0
  448. package/dist/shared/ipc/channels/theme-channels.d.ts +12 -0
  449. package/dist/shared/ipc/channels/updater-channels.d.ts +26 -0
  450. package/dist/shared/ipc/channels/window-channels.d.ts +44 -0
  451. package/dist/shared/ipc/consts/ipc-channel.d.ts +1 -0
  452. package/dist/shared/ipc/index.d.ts +19 -0
  453. package/dist/shared/ipc/index.js +46 -0
  454. package/dist/shared/ipc/ipc-result.d.ts +20 -0
  455. package/dist/shared/ipc/types/ipc-logger.d.ts +27 -0
  456. package/dist/shared/ipc/types/ipc.d.ts +61 -0
  457. package/dist/shared/logger/consts/log-levels.d.ts +14 -0
  458. package/dist/shared/logger/index.d.ts +4 -0
  459. package/dist/shared/logger/index.js +10 -0
  460. package/dist/shared/menu/consts/menu-command.d.ts +1 -0
  461. package/dist/shared/menu/index.d.ts +6 -0
  462. package/dist/shared/menu/index.js +10 -0
  463. package/dist/shared/menu/menu-command.d.ts +24 -0
  464. package/dist/shared/menu/types/menu.d.ts +72 -0
  465. package/dist/shared/mode/consts/command.d.ts +10 -0
  466. package/dist/shared/mode/consts/mode.d.ts +22 -0
  467. package/dist/shared/mode/index.d.ts +5 -0
  468. package/dist/shared/mode/index.js +18 -0
  469. package/dist/shared/remote-service/const/remote-service.d.ts +8 -0
  470. package/dist/shared/remote-service/index.d.ts +5 -0
  471. package/dist/shared/remote-service/index.js +38 -0
  472. package/dist/shared/remote-service/types/remote-service.d.ts +146 -0
  473. package/dist/shared/renderer/index.d.ts +7 -0
  474. package/dist/shared/renderer/index.js +0 -0
  475. package/dist/shared/renderer/types/element-plus.d.ts +20 -0
  476. package/dist/shared/renderer/types/input.d.ts +11 -0
  477. package/dist/shared/renderer/types/options.d.ts +22 -0
  478. package/dist/shared/renderer/types/switch.d.ts +11 -0
  479. package/dist/shared/renderer-protocol/consts/renderer-protocol-keys.d.ts +10 -0
  480. package/dist/shared/renderer-protocol/index.d.ts +5 -0
  481. package/dist/shared/renderer-protocol/index.js +6 -0
  482. package/dist/shared/renderer-protocol/types/renderer-protocol.d.ts +7 -0
  483. package/dist/shared/runtime/index.d.ts +4 -0
  484. package/dist/shared/runtime/index.js +0 -0
  485. package/dist/shared/runtime/types/runtime.d.ts +20 -0
  486. package/dist/shared/shortcut/consts/shortcut-handler-ids.d.ts +9 -0
  487. package/dist/shared/shortcut/consts/shortcut-id.d.ts +1 -0
  488. package/dist/shared/shortcut/index.d.ts +6 -0
  489. package/dist/shared/shortcut/index.js +10 -0
  490. package/dist/shared/shortcut/types/shortcut.d.ts +13 -0
  491. package/dist/shared/utils/bytes-util.d.ts +16 -0
  492. package/dist/shared/utils/index.d.ts +15 -0
  493. package/dist/shared/utils/index.js +42 -0
  494. package/dist/shared/utils/ipc-util.d.ts +12 -0
  495. package/dist/shared/utils/log-util.d.ts +33 -0
  496. package/dist/shared/utils/menu-util.d.ts +12 -0
  497. package/dist/shared/utils/number-util.d.ts +12 -0
  498. package/dist/shared/utils/object-util.d.ts +88 -0
  499. package/dist/shared/utils/regexp-util.d.ts +22 -0
  500. package/dist/shared/utils/shortcut-util.d.ts +12 -0
  501. package/dist/shared/utils/string-util.d.ts +14 -0
  502. package/dist/shared/utils/time-util.d.ts +32 -0
  503. package/dist/shared/utils/validator-util.d.ts +12 -0
  504. package/dist/shared/utils/window-shared-util.d.ts +26 -0
  505. package/dist/shared/window/consts/window-record-id.d.ts +2 -0
  506. package/dist/shared/window/consts/window-type-name.d.ts +1 -0
  507. package/dist/shared/window/identity/main-window-identity.d.ts +5 -0
  508. package/dist/shared/window/identity/setting-window-identity.d.ts +5 -0
  509. package/dist/shared/window/index.d.ts +8 -0
  510. package/dist/shared/window/index.js +23 -0
  511. package/dist/shared/window/types/window.d.ts +84 -0
  512. package/dist/types/index.d.ts +102 -0
  513. package/dist/types/index.js +0 -0
  514. package/dist/vite/build/build-chunk.d.ts +53 -0
  515. package/dist/vite/build/build-csp-update.d.ts +80 -0
  516. package/dist/vite/build/build-obfuscation.d.ts +33 -0
  517. package/dist/vite/build/component-map.d.ts +38 -0
  518. package/dist/vite/build/component-resolver.d.ts +6 -0
  519. package/dist/vite/build/index.d.ts +9 -0
  520. package/dist/vite/build/index.js +18 -0
  521. package/dist/vite/build/types/build.d.ts +13 -0
  522. package/dist/vite/config/electron-app-config.d.ts +6 -0
  523. package/dist/vite/config/electron-builder-config.d.ts +8 -0
  524. package/dist/vite/config/electron-vite-config.d.ts +9 -0
  525. package/dist/vite/config/index.d.ts +11 -0
  526. package/dist/vite/config/index.js +2259 -0
  527. package/dist/vite/config/types/electron-app-options.d.ts +22 -0
  528. package/dist/vite/config/types/electron-builder-options.d.ts +16 -0
  529. package/dist/vite/config/types/electron-vite-options.d.ts +43 -0
  530. package/dist/vite/config/types/vite-obfuscation.d.ts +36 -0
  531. package/dist/vite/config/vite-obfuscation-config.d.ts +6 -0
  532. package/dist/vite/mode/index.d.ts +4 -0
  533. package/dist/vite/mode/index.js +8 -0
  534. package/dist/vite/mode/vite-mode.d.ts +37 -0
  535. package/dist/vite/orval/index.d.ts +4 -0
  536. package/dist/vite/orval/index.js +75 -0
  537. package/dist/vite/orval/orval-global-types.d.ts +23 -0
  538. package/dist/vite/utils/file-write-vite-util.d.ts +30 -0
  539. package/dist/vite/utils/index.d.ts +5 -0
  540. package/dist/vite/utils/index.js +10 -0
  541. package/dist/vite/utils/runtime-config-vite-util.d.ts +39 -0
  542. package/package.json +287 -0
@@ -0,0 +1,1282 @@
1
+ // src/renderer/components/captcha/internal/captcha-controller.ts
2
+ import { useXoAppStore, useXoThemeStore } from "../store/index";
3
+ import { computed, nextTick as nextTick2, ref, watch } from "vue";
4
+
5
+ // src/renderer/components/captcha/internal/captcha-css-property.ts
6
+ var XoCaptchaCssProperty = class {
7
+ /**
8
+ * 构造函数
9
+ * @param {XoPropsCaptcha} props 组件属性
10
+ * @param {boolean} dark 是否使用深色主题
11
+ */
12
+ constructor(props, dark) {
13
+ this.props = props;
14
+ this.dark = dark;
15
+ }
16
+ /**
17
+ * 动态主题 css 变量
18
+ * @returns {Record<string, string | number | undefined>} CSS 变量
19
+ */
20
+ withTheme() {
21
+ const dark = {
22
+ backgroundColor: "#111",
23
+ dragBarColor: "#666",
24
+ dragBackgroundColor: "#3E7CFF",
25
+ maskColor: "#fff",
26
+ maskOpacity: 0,
27
+ borderColor: "rgba(255, 255, 255, 0.3)",
28
+ titleColor: "#fff",
29
+ iconColor: "#fff",
30
+ shadow: "0 0 15px rgba(255, 255, 255, 0.2)"
31
+ };
32
+ const light = {
33
+ backgroundColor: "#fff",
34
+ dragBarColor: "#E0E0E0",
35
+ dragBackgroundColor: "#3E7CFF",
36
+ maskColor: "#000",
37
+ maskOpacity: 0,
38
+ borderColor: "rgba(0, 0, 0, 0.3)",
39
+ titleColor: "#000",
40
+ iconColor: "#333",
41
+ shadow: "0 0 15px rgba(0, 0, 0, 0.2)"
42
+ };
43
+ const defaults = this.dark ? dark : light;
44
+ return {
45
+ // 公共主题 css 变量
46
+ ...this.commonCssProperty(),
47
+ // 动态主题 css 变量
48
+ "--gc-background-color": this.props?.backgroundColor ?? defaults.backgroundColor,
49
+ "--gc-drag-bar-color": this.props?.dragBarColor ?? defaults.dragBarColor,
50
+ "--gc-drag-background-color": this.props?.dragBackgroundColor ?? defaults.dragBackgroundColor,
51
+ "--gc-mask-color": this.props?.maskColor ?? defaults.maskColor,
52
+ "--gc-mask-opacity": this.props?.maskOpacity ?? defaults.maskOpacity,
53
+ "--gc-border-color": this.props?.borderColor ?? defaults.borderColor,
54
+ "--gc-title-color": this.props?.titleColor ?? defaults.titleColor,
55
+ "--gc-icon-color": this.props?.iconColor ?? defaults.iconColor,
56
+ "--gc-shadow": this.props?.shadow ?? defaults.shadow
57
+ };
58
+ }
59
+ /**
60
+ * 公共主题 css 变量
61
+ * @returns {Record<string, string>} 公共 CSS 变量
62
+ * @private
63
+ */
64
+ commonCssProperty() {
65
+ return {
66
+ "--gc-title-font-size": `${this.props?.titleFontSize || 16}px`,
67
+ "--gc-radius": `${this.props?.radiusSize || 10}px`
68
+ };
69
+ }
70
+ };
71
+
72
+ // src/renderer/components/captcha/internal/captcha-defaults.ts
73
+ var CaptchaDefaults = {
74
+ /** 默认显示状态 */
75
+ modelValue: false,
76
+ /** 默认请求基础地址 */
77
+ baseUrl: "",
78
+ /** 默认验证码接口路径 */
79
+ captchaUrl: "/captcha",
80
+ /** 默认请求超时时间,单位为毫秒 */
81
+ timeout: 5e3,
82
+ /** 默认验证码标题 */
83
+ title: "\u8BF7\u62D6\u52A8\u6ED1\u5757\u5B8C\u6210\u62FC\u56FE",
84
+ /** 默认刷新按钮提示 */
85
+ refreshIconTitle: "\u5237\u65B0\u9A8C\u8BC1\u7801",
86
+ /** 默认关闭按钮提示 */
87
+ closeIconTitle: "\u5173\u95ED\u9A8C\u8BC1\u7801",
88
+ /** 默认显示主题容器 */
89
+ showTheme: true,
90
+ /** 默认横向内边距 */
91
+ horizontalPadding: 20,
92
+ /** 默认纵向内边距 */
93
+ verticalPadding: 20,
94
+ /** 默认图标尺寸 */
95
+ iconSize: 20,
96
+ /** 默认标题字号 */
97
+ titleFontSize: 16,
98
+ /** 默认圆角尺寸 */
99
+ radiusSize: 10,
100
+ /** 默认错误消息清除延迟,单位为毫秒 */
101
+ errorClearDelay: 2e3,
102
+ /** 默认动作类型 */
103
+ action: ""
104
+ };
105
+
106
+ // src/renderer/components/captcha/internal/captcha-errors.ts
107
+ var XoCaptchaScriptLoadError = class extends Error {
108
+ /**
109
+ * 脚本路径
110
+ * @type {string}
111
+ */
112
+ src;
113
+ /**
114
+ * 触发事件
115
+ * @type {Event | string}
116
+ */
117
+ causeEvent;
118
+ /**
119
+ * 创建脚本加载错误。
120
+ * @param {string} src 脚本路径
121
+ * @param {Event | string} causeEvent 触发错误的事件或错误描述
122
+ */
123
+ constructor(src, causeEvent) {
124
+ super(`Script load failed: ${src}`);
125
+ this.name = "XoCaptchaScriptLoadError";
126
+ this.src = src;
127
+ this.causeEvent = causeEvent;
128
+ }
129
+ };
130
+
131
+ // src/renderer/components/captcha/internal/captcha-helper.ts
132
+ var XoCaptchaHelper = class {
133
+ /**
134
+ * 深拷贝
135
+ * @template T 数据类型
136
+ * @param {T} data 数据
137
+ * @returns {T} 深拷贝数据
138
+ */
139
+ static clone(data) {
140
+ return typeof structuredClone === "function" ? structuredClone(data) : JSON.parse(JSON.stringify(data));
141
+ }
142
+ /**
143
+ * 默认滑块验证码配置(基于组件属性)
144
+ * @param {XoPropsCaptcha} props 组件属性
145
+ * @returns {CaptchaSlideConfig} 滑块配置
146
+ */
147
+ static buildSlideConfigFromProps(props) {
148
+ return {
149
+ title: props.title,
150
+ horizontalPadding: props.horizontalPadding,
151
+ verticalPadding: props.verticalPadding,
152
+ iconSize: props.iconSize,
153
+ showTheme: props.showTheme
154
+ };
155
+ }
156
+ /**
157
+ * 默认滑块验证码数据
158
+ * @returns {CaptchaSlideData} 默认滑块数据
159
+ */
160
+ static buildDefaultSlideData() {
161
+ return {
162
+ thumbX: 0,
163
+ thumbY: 0,
164
+ thumbWidth: 0,
165
+ thumbHeight: 0,
166
+ image: "",
167
+ thumb: ""
168
+ };
169
+ }
170
+ /**
171
+ * 生成响应转换为滑块验证码数据
172
+ * @param {CaptchaGenerateResponse} generateResp 生成响应
173
+ * @returns {CaptchaSlideData} 滑块数据
174
+ */
175
+ static generateRespToSlideData(generateResp) {
176
+ return {
177
+ thumbX: generateResp.thumbX,
178
+ thumbY: generateResp.thumbY,
179
+ thumbWidth: generateResp.thumbWidth,
180
+ thumbHeight: generateResp.thumbHeight,
181
+ image: generateResp.image,
182
+ thumb: generateResp.thumb
183
+ };
184
+ }
185
+ /**
186
+ * 利用生成响应初始化 wasm 请求
187
+ * @param {CaptchaGenerateResponse} generateResp 生成响应
188
+ * @param {string} rootId 验证码容器根ID
189
+ * @returns {CaptchaWasmRequest} WASM 签名请求
190
+ */
191
+ static buildWasmReqFromGenerateResp(generateResp, rootId) {
192
+ return {
193
+ rootId,
194
+ captchaId: generateResp.id,
195
+ seed: generateResp.seed,
196
+ token: generateResp.token,
197
+ generateTime: Date.now()
198
+ // 验证码生成时间
199
+ };
200
+ }
201
+ /**
202
+ * 利用生成响应更新滑块大小
203
+ * @param {Ref<CaptchaSlideConfig>} slideConfig 验证码配置
204
+ * @param {CaptchaGenerateResponse} generateResp 生成响应
205
+ */
206
+ static applyThumbSizeFromGenerateResp(slideConfig, generateResp) {
207
+ slideConfig.value.thumbWidth = generateResp.thumbWidth;
208
+ slideConfig.value.thumbHeight = generateResp.thumbHeight;
209
+ }
210
+ /**
211
+ * 利用配置响应更新背景大小
212
+ * @param {Ref<CaptchaSlideConfig>} slideConfig 验证码配置
213
+ * @param {CaptchaConfigResponse} configResp 配置响应
214
+ */
215
+ static applyBackgroundSizeFromConfigResp(slideConfig, configResp) {
216
+ slideConfig.value.width = configResp?.width ?? 0;
217
+ slideConfig.value.height = configResp?.height ?? 0;
218
+ }
219
+ /**
220
+ * 构建验证请求
221
+ * @param {string} action 需要验证的动作类型
222
+ * @param {CaptchaWasmRequest} wasmReq 验证码 WASM 加签请求
223
+ * @param {string} sign 签名
224
+ * @returns {CaptchaVerifyRequest} 验证请求
225
+ */
226
+ static buildVerifyReq(action, wasmReq, sign) {
227
+ return {
228
+ captchaId: wasmReq.captchaId,
229
+ action,
230
+ sign: sign ?? "",
231
+ userAgent: window.navigator?.userAgent ?? "",
232
+ language: window.navigator?.language ?? "",
233
+ screenWidth: window.screen?.width ?? 0,
234
+ screenHeight: window.screen?.height ?? 0,
235
+ colorDepth: window.screen?.colorDepth ?? 0
236
+ };
237
+ }
238
+ /**
239
+ * 生成 UUID
240
+ * @returns {string}
241
+ */
242
+ static genUUID() {
243
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
244
+ const r = Math.random() * 16 | 0;
245
+ const v = c === "x" ? r : r & 3 | 8;
246
+ return v.toString(16);
247
+ });
248
+ }
249
+ /**
250
+ * 去除字符串首尾斜杠
251
+ * @param {string} str 字符串
252
+ * @returns {string}
253
+ * @private
254
+ */
255
+ static trimSlash(str) {
256
+ return str.replace(/^\/+|\/+$/g, "");
257
+ }
258
+ };
259
+
260
+ // src/renderer/components/captcha/internal/captcha-injector.ts
261
+ import { inject, provide, reactive } from "vue";
262
+ var CaptchaGlobalOptionsKey = Symbol("XoCaptchaGlobalOptions");
263
+ var XoCaptchaInjector = class {
264
+ /**
265
+ * 提供验证码全局配置
266
+ * @param {XoComponent.CaptchaProvideOptions} options 配置
267
+ */
268
+ static provide(options) {
269
+ provide(CaptchaGlobalOptionsKey, reactive({
270
+ baseUrl: options.baseUrl,
271
+ timeout: options.timeout,
272
+ captchaUrl: options.captchaUrl
273
+ }));
274
+ }
275
+ /**
276
+ * 获取验证码全局配置
277
+ * @returns {XoComponent.CaptchaGlobalOptions}
278
+ */
279
+ static inject() {
280
+ return inject(CaptchaGlobalOptionsKey, reactive({
281
+ baseUrl: CaptchaDefaults.baseUrl,
282
+ timeout: CaptchaDefaults.timeout,
283
+ captchaUrl: CaptchaDefaults.captchaUrl
284
+ }));
285
+ }
286
+ };
287
+
288
+ // src/renderer/components/captcha/internal/captcha-ui-patch.ts
289
+ import { nextTick } from "vue";
290
+ var XoCaptchaUiPatch = class {
291
+ /**
292
+ * 构造函数
293
+ * @param {CaptchaUiPatchOptions} config 配置
294
+ */
295
+ constructor(config) {
296
+ this.config = config;
297
+ }
298
+ /**
299
+ * 应用补丁
300
+ * @returns {Promise<void>}
301
+ */
302
+ async apply() {
303
+ await nextTick();
304
+ this.replaceCloseIcon();
305
+ this.setIconTitle();
306
+ this.setGcBodyRef();
307
+ }
308
+ /**
309
+ * 替换关闭图标
310
+ * @private
311
+ */
312
+ replaceCloseIcon() {
313
+ const oldSvg = this.config.domRefs.captchaRef.value?.querySelector(
314
+ ".gc-header .gc-icon-block svg:first-child"
315
+ );
316
+ if (!(oldSvg instanceof SVGSVGElement)) return;
317
+ const doc = new DOMParser().parseFromString(this.closeSVG(), "image/svg+xml");
318
+ if (doc.documentElement.nodeName.toLowerCase() === "parsererror" || doc.getElementsByTagName("parsererror").length > 0) {
319
+ return;
320
+ }
321
+ const newSvg = doc.documentElement;
322
+ if (!(newSvg instanceof SVGSVGElement)) return;
323
+ oldSvg.setAttribute("viewBox", newSvg.getAttribute("viewBox") || "0 0 1024 1024");
324
+ oldSvg.innerHTML = newSvg.innerHTML;
325
+ }
326
+ /**
327
+ * 为刷新和关闭按钮添加 title 属性
328
+ */
329
+ setIconTitle() {
330
+ const svgs = this.config.domRefs.captchaRef.value?.querySelectorAll(".gc-header .gc-icon-block svg");
331
+ if (!svgs || svgs.length < 2) return;
332
+ const closeIconTitle = `${this.config.props?.closeIconTitle ?? CaptchaDefaults.closeIconTitle} (ESC)`;
333
+ const refreshIconTitle = `${this.config.props?.refreshIconTitle ?? CaptchaDefaults.refreshIconTitle} (F5)`;
334
+ this.setSvgTooltip(svgs[0], closeIconTitle);
335
+ this.setSvgTooltip(svgs[1], refreshIconTitle);
336
+ }
337
+ /**
338
+ * 设置 SVG 元素的 title 属性
339
+ * @param {Element} svg SVG 元素
340
+ * @param {string} text title 文本
341
+ * @private
342
+ */
343
+ setSvgTooltip(svg, text) {
344
+ const el = svg;
345
+ let titleNode = el.querySelector(":scope > title");
346
+ if (!titleNode) {
347
+ titleNode = document.createElementNS("http://www.w3.org/2000/svg", "title");
348
+ el.prepend(titleNode);
349
+ }
350
+ titleNode.textContent = text;
351
+ el.setAttribute("aria-label", text);
352
+ }
353
+ /**
354
+ * 更新 .go-captcha .gc-body 容器
355
+ * @private
356
+ */
357
+ setGcBodyRef() {
358
+ this.config.domRefs.gcBodyRef.value = this.config.domRefs.captchaRef.value?.querySelector(".go-captcha .gc-body");
359
+ }
360
+ /**
361
+ * 关闭按钮 SVG 图标
362
+ * @private
363
+ */
364
+ closeSVG() {
365
+ return `<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
366
+ <path d="M638.693769 311.555519l-129.957576 129.957576-129.957576-129.957576-71.138251 71.13825 129.957576
367
+ 129.957576-129.957576 129.957577 71.138251 71.13825 129.957576-129.957576 129.957576 129.957576
368
+ 71.138251-71.13825-129.957577-129.957577 129.957577-129.957576-71.138251-71.13825zM508.736193
369
+ 9.911779C230.965679 9.911779 5.996626 234.880832 5.996626 512.651345S230.965679 1015.390912 508.736193
370
+ 1015.390912s502.739567-224.969053 502.739567-502.739567S786.492547 9.911779 508.736193 9.911779z m0
371
+ 904.93122c-221.698166 0-402.191654-180.479327-402.191654-402.191654 0-221.712326 180.479327-402.191654
372
+ 402.191654-402.191653S910.927846 290.939019 910.927846 512.651345c0 221.698166-180.493487
373
+ 402.191654-402.191653 402.191654z m0 0">
374
+ </path>
375
+ </svg>`;
376
+ }
377
+ };
378
+
379
+ // src/renderer/components/captcha/internal/captcha-wasm-loader.ts
380
+ var loadingPromise;
381
+ var XoCaptchaWasmLoader = class {
382
+ /**
383
+ * 创建验证码 WASM 加载器
384
+ * @param {CaptchaWasmLoaderOptions} options WASM 加载配置
385
+ */
386
+ constructor(options) {
387
+ this.options = options;
388
+ }
389
+ /**
390
+ * 加载 WASM 运行时和验证码模块
391
+ * @returns {Promise<void>} WASM 服务准备完成的 Promise
392
+ */
393
+ async load() {
394
+ if (window.__GCaptcha?.Loaded) return;
395
+ if (loadingPromise) {
396
+ return loadingPromise;
397
+ }
398
+ loadingPromise = this.loadResources();
399
+ try {
400
+ await loadingPromise;
401
+ } finally {
402
+ loadingPromise = void 0;
403
+ }
404
+ }
405
+ /**
406
+ * 执行一次 WASM 资源加载
407
+ * @returns {Promise<void>} WASM 服务准备完成的 Promise
408
+ * @private
409
+ */
410
+ async loadResources() {
411
+ const config = window.__GCaptcha?.Config;
412
+ if (!config?.wasmExec || !config.wasm) {
413
+ throw new Error("WASM \u8D44\u6E90\u914D\u7F6E\u4E0D\u5B8C\u6574");
414
+ }
415
+ const root = joinUrl(this.options.baseUrl, this.options.captchaUrl);
416
+ await this.loadWasmExec(joinUrl(root, config.wasmExec));
417
+ const go = new window.Go();
418
+ const controller = new AbortController();
419
+ const timer = window.setTimeout(() => controller.abort(), this.options.timeout);
420
+ try {
421
+ const response = await window.fetch(joinUrl(root, config.wasm), { signal: controller.signal });
422
+ if (!response.ok) {
423
+ throw new Error(`WASM \u52A0\u8F7D\u5931\u8D25 [${response.status}]`);
424
+ }
425
+ const { instance } = await WebAssembly.instantiateStreaming(response, go.importObject);
426
+ void go.run(instance);
427
+ await this.waitUntilReady();
428
+ window.__GCaptcha.Loaded = true;
429
+ } finally {
430
+ window.clearTimeout(timer);
431
+ }
432
+ }
433
+ /**
434
+ * 注入 wasm_exec.js 脚本
435
+ * @param {string} src 脚本地址
436
+ * @returns {Promise<void>} 脚本加载完成的 Promise
437
+ * @private
438
+ */
439
+ loadWasmExec(src) {
440
+ return new Promise((resolve, reject) => {
441
+ if (window.Go) {
442
+ resolve();
443
+ return;
444
+ }
445
+ const script = document.createElement("script");
446
+ const timer = window.setTimeout(() => {
447
+ script.remove();
448
+ reject(new Error(`WASM Bridge \u52A0\u8F7D\u8D85\u65F6 [${this.options.timeout}ms]`));
449
+ }, this.options.timeout);
450
+ script.src = src;
451
+ script.onload = () => {
452
+ window.clearTimeout(timer);
453
+ resolve();
454
+ };
455
+ script.onerror = (event) => {
456
+ window.clearTimeout(timer);
457
+ reject(new XoCaptchaScriptLoadError(src, event));
458
+ };
459
+ document.head.appendChild(script);
460
+ });
461
+ }
462
+ /**
463
+ * 等待 Go WASM 暴露验证码服务
464
+ * @returns {Promise<void>} 服务准备完成的 Promise
465
+ * @private
466
+ */
467
+ async waitUntilReady() {
468
+ const startTime = Date.now();
469
+ while (!window.__GCaptcha?.Service) {
470
+ if (Date.now() - startTime > this.options.timeout) {
471
+ throw new Error(`WASM \u52A0\u8F7D\u8D85\u65F6 [${this.options.timeout}ms]`);
472
+ }
473
+ await new Promise((resolve) => window.setTimeout(resolve, 50));
474
+ }
475
+ }
476
+ };
477
+ function joinUrl(...parts) {
478
+ return parts.filter(Boolean).map((part, index) => index === 0 ? part.replace(/\/$/, "") : part.replace(/^\/+|\/+$/g, "")).join("/");
479
+ }
480
+
481
+ // src/renderer/components/captcha/internal/captcha-controller.ts
482
+ var XoCaptchaCancelledError = class extends Error {
483
+ /**
484
+ * 创建验证码取消错误
485
+ */
486
+ constructor() {
487
+ super("\u9A8C\u8BC1\u7801\u64CD\u4F5C\u5DF2\u53D6\u6D88");
488
+ this.name = "XoCaptchaCancelledError";
489
+ }
490
+ };
491
+ var XoCaptchaController = class {
492
+ /**
493
+ * 组件全局请求配置
494
+ * @type {XoComponentCaptchaGlobalOptions}
495
+ * @private
496
+ */
497
+ globalProps;
498
+ /** 当前滑块验证码配置 */
499
+ slideConfig;
500
+ /** 当前滑块验证码数据 */
501
+ slideData;
502
+ /**
503
+ * 组件引用
504
+ * @type {CaptchaDomRefs}
505
+ * @private
506
+ */
507
+ domRefs;
508
+ /**
509
+ * 组件属性
510
+ * @type {XoPropsCaptcha}
511
+ * @private
512
+ */
513
+ props;
514
+ /**
515
+ * 组件事件
516
+ * @type {XoComponentCaptchaEmits}
517
+ * @private
518
+ */
519
+ emits;
520
+ /** 传递给 go-captcha-vue 的滑块事件 */
521
+ slideEvents;
522
+ /**
523
+ * 验证码 WASM 加签请求
524
+ * @type {CaptchaWasmRequest}
525
+ * @private
526
+ */
527
+ wasmReq;
528
+ /** 当前验证码主题 CSS 变量 */
529
+ cssProperties;
530
+ /** 当前验证码错误或过期提示 */
531
+ errorMessage = ref("");
532
+ /**
533
+ * 错误消息清除定时器
534
+ * @type {number | null}
535
+ * @private
536
+ */
537
+ errorClearTimer = null;
538
+ /**
539
+ * 验证码过期预警定时器
540
+ * @type {number | null}
541
+ * @private
542
+ */
543
+ expirationWarningTimer = null;
544
+ /**
545
+ * 验证码过期刷新定时器
546
+ * @type {number | null}
547
+ * @private
548
+ */
549
+ expirationRefreshTimer = null;
550
+ /**
551
+ * 验证码过期倒计时定时器
552
+ * @type {number | null}
553
+ * @private
554
+ */
555
+ expirationCountdownTimer = null;
556
+ /**
557
+ * 验证码内部显示状态
558
+ * @type {Ref<boolean>}
559
+ * @private
560
+ */
561
+ innerVisible;
562
+ /** 当前验证码显示状态,优先使用 v-model */
563
+ visible;
564
+ /** 验证码根元素 ID */
565
+ rootId;
566
+ /**
567
+ * 绑定后的按键监听器
568
+ * @type {(event: KeyboardEvent) => void}
569
+ * @private
570
+ */
571
+ boundKeydownHandler;
572
+ /** 当前仍在执行的 HTTP 请求控制器 */
573
+ requestControllers = /* @__PURE__ */ new Set();
574
+ /** 当前验证码加载序号,用于阻止旧异步任务回写状态 */
575
+ loadSequence = 0;
576
+ /** 组件是否已销毁 */
577
+ destroyed = false;
578
+ /**
579
+ * 创建验证码控制器并绑定组件生命周期监听
580
+ * @param {CaptchaDomRefs} domRefs 组件引用
581
+ * @param {XoPropsCaptcha} props 组件属性
582
+ * @param {XoComponentCaptchaEmits} emits 组件事件
583
+ */
584
+ constructor(domRefs, props, emits) {
585
+ this.innerVisible = ref(false);
586
+ this.visible = computed(() => props.modelValue ?? this.innerVisible.value);
587
+ const globalProps = XoCaptchaInjector.inject();
588
+ const appRemoteServiceRootUrl = useXoAppStore().remoteServiceRootUrl;
589
+ this.globalProps = {
590
+ baseUrl: props.baseUrl ?? (globalProps.baseUrl || appRemoteServiceRootUrl || CaptchaDefaults.baseUrl),
591
+ timeout: props.timeout ?? globalProps.timeout ?? CaptchaDefaults.timeout,
592
+ captchaUrl: props.captchaUrl ?? globalProps.captchaUrl ?? CaptchaDefaults.captchaUrl
593
+ };
594
+ this.rootId = domRefs.rootId ?? ref(`xo-captcha-${XoCaptchaHelper.genUUID()}`);
595
+ this.domRefs = { ...domRefs, rootId: this.rootId };
596
+ this.props = props;
597
+ this.emits = emits;
598
+ this.slideConfig = ref(XoCaptchaHelper.buildSlideConfigFromProps(props));
599
+ this.slideData = ref(XoCaptchaHelper.buildDefaultSlideData());
600
+ this.slideEvents = ref({
601
+ move: this.move.bind(this),
602
+ refresh: this.refresh.bind(this),
603
+ close: this.close.bind(this),
604
+ confirm: this.confirm.bind(this)
605
+ });
606
+ const themeStore = useXoThemeStore();
607
+ this.cssProperties = computed(() => new XoCaptchaCssProperty(props, themeStore.shouldUseDarkColors).withTheme());
608
+ watch(
609
+ () => [
610
+ props.title,
611
+ props.horizontalPadding,
612
+ props.verticalPadding,
613
+ props.showTheme,
614
+ props.iconSize
615
+ ],
616
+ () => Object.assign(this.slideConfig.value, XoCaptchaHelper.buildSlideConfigFromProps(props)),
617
+ { immediate: true }
618
+ );
619
+ watch(
620
+ () => [
621
+ props.closeIconTitle,
622
+ props.refreshIconTitle
623
+ ],
624
+ // 应用 UI 补丁
625
+ async () => {
626
+ await this.applyUiPatch(this.visible.value);
627
+ }
628
+ );
629
+ this.boundKeydownHandler = this.keydownHandler.bind(this);
630
+ watch(
631
+ this.visible,
632
+ (visible) => {
633
+ if (visible) {
634
+ void this.getCaptcha();
635
+ this.addKeydownListener();
636
+ } else {
637
+ this.cancelPendingOperations();
638
+ this.wasmUnregister();
639
+ this.removeKeydownListener();
640
+ }
641
+ },
642
+ { immediate: true }
643
+ );
644
+ }
645
+ //<editor-fold desc="事件">
646
+ /**
647
+ * 移动滑块
648
+ * @private
649
+ * @param _x
650
+ * @param _y
651
+ */
652
+ move(_x, _y) {
653
+ }
654
+ /**
655
+ * 打开验证码
656
+ * @private
657
+ */
658
+ open() {
659
+ if (this.destroyed) return;
660
+ this.resetErrorClearTimer();
661
+ this.innerVisible.value = true;
662
+ this.emits("update:modelValue", true);
663
+ }
664
+ /**
665
+ * 刷新验证码
666
+ * @private
667
+ */
668
+ refresh() {
669
+ if (this.destroyed) return;
670
+ this.resetErrorClearTimer();
671
+ this.resetExpirationTimers();
672
+ void this.getCaptcha();
673
+ }
674
+ /**
675
+ * 关闭验证码
676
+ * @private
677
+ */
678
+ close() {
679
+ this.resetErrorClearTimer();
680
+ this.resetExpirationTimers();
681
+ this.cancelPendingOperations();
682
+ this.innerVisible.value = false;
683
+ this.emits("update:modelValue", false);
684
+ }
685
+ /**
686
+ * 销毁组件
687
+ */
688
+ destroy() {
689
+ this.destroyed = true;
690
+ this.cancelPendingOperations();
691
+ this.wasmUnregister();
692
+ this.removeKeydownListener();
693
+ this.resetExpirationTimers();
694
+ this.resetErrorClearTimer();
695
+ }
696
+ /**
697
+ * 确认验证码
698
+ * @param {CaptchaSlidePoint} point 滑块位置
699
+ * @param {() => void} resetCaptcha 重置验证码
700
+ * @private
701
+ */
702
+ confirm(point, resetCaptcha) {
703
+ const handleSuccess = (verifyRes) => {
704
+ this.emits("verified", {
705
+ ticket: verifyRes?.ticket ?? "",
706
+ action: this.props.action
707
+ });
708
+ this.close();
709
+ };
710
+ const handleError = (error) => {
711
+ if (error instanceof XoCaptchaCancelledError) return;
712
+ this.setErrMsg(errorMessage(error, "\u9A8C\u8BC1\u8BF7\u6C42\u5931\u8D25"), () => {
713
+ resetCaptcha();
714
+ void this.getCaptcha();
715
+ });
716
+ };
717
+ this.confirmHandler(point).then(handleSuccess).catch(handleError);
718
+ }
719
+ /**
720
+ * 确认验证码处理器
721
+ * @param {CaptchaSlidePoint} _ 滑块位置
722
+ * @returns {Promise<CaptchaVerifyResponse>}
723
+ * @private
724
+ */
725
+ async confirmHandler(_) {
726
+ const wasmResp = window.__GCaptcha?.Service?.Sign(XoCaptchaHelper.clone(this.wasmReq));
727
+ if (!wasmResp?.success) throw new Error("\u7B7E\u540D\u5931\u8D25");
728
+ const verifyReq = XoCaptchaHelper.buildVerifyReq(this.props.action, this.wasmReq, wasmResp?.data?.sign);
729
+ const verifyPart = window.__GCaptcha?.Config?.verify ?? "";
730
+ const data = await this.requestJson(verifyPart, {
731
+ method: "POST",
732
+ body: JSON.stringify(verifyReq)
733
+ });
734
+ if (!data?.success) throw new Error(data?.message ?? `\u9A8C\u8BC1\u672A\u901A\u8FC7`);
735
+ const verifyResponse = data.data;
736
+ if (!verifyResponse?.ticket) throw new Error("\u9A8C\u8BC1\u7ED3\u679C\u7F3A\u5C11\u7968\u636E");
737
+ return verifyResponse;
738
+ }
739
+ //</editor-fold>
740
+ //<editor-fold desc="后端加载">
741
+ /**
742
+ * 同步加载验证码
743
+ */
744
+ async getCaptcha() {
745
+ if (this.destroyed) return;
746
+ const sequence = this.startLoad();
747
+ try {
748
+ await this.loadCaptcha(sequence);
749
+ } catch (error) {
750
+ if (error instanceof XoCaptchaCancelledError) return;
751
+ const fallback = error instanceof XoCaptchaScriptLoadError ? "WASM Bridge \u52A0\u8F7D\u5931\u8D25" : "\u9A8C\u8BC1\u7801\u52A0\u8F7D\u5931\u8D25";
752
+ this.setErrMsg(errorMessage(error, fallback));
753
+ }
754
+ }
755
+ /**
756
+ * 加载验证码配置(全局)
757
+ * @returns {Promise<void>}
758
+ */
759
+ async loadConfig() {
760
+ if (!window.__GCaptcha) {
761
+ window.__GCaptcha = {};
762
+ }
763
+ if (window.__GCaptcha.Config === void 0) {
764
+ const captchaUrl = this.getCaptchaUrl();
765
+ if (!captchaUrl) throw new Error("\u57FA\u7840\u8DEF\u5F84\u672A\u914D\u7F6E");
766
+ const data = await this.requestJson();
767
+ if (!data?.success) throw new Error(`\u914D\u7F6E\u52A0\u8F7D\u5931\u8D25`);
768
+ const configResp = data.data;
769
+ if (!configResp) throw new Error("\u914D\u7F6E\u54CD\u5E94\u7F3A\u5C11\u6570\u636E");
770
+ if (!configResp?.generate) throw new Error(`\u914D\u7F6E\u7F3A\u5C11 'generate' \u8DEF\u5F84\u53C2\u6570`);
771
+ if (!configResp?.verify) throw new Error(`\u914D\u7F6E\u7F3A\u5C11 'verify' \u8DEF\u5F84\u53C2\u6570`);
772
+ if (!configResp?.wasmExec) throw new Error(`\u914D\u7F6E\u7F3A\u5C11 'wasmExec' \u8DEF\u5F84\u53C2\u6570`);
773
+ if (!configResp?.wasm) throw new Error(`\u914D\u7F6E\u7F3A\u5C11 'wasm' \u8DEF\u5F84\u53C2\u6570`);
774
+ if (!configResp?.width) throw new Error(`\u914D\u7F6E\u7F3A\u5C11 'width' \u53C2\u6570`);
775
+ if (!configResp?.height) throw new Error(`\u914D\u7F6E\u7F3A\u5C11 'height' \u53C2\u6570`);
776
+ if (!configResp?.validity) throw new Error(`\u914D\u7F6E\u7F3A\u5C11 'validity' \u53C2\u6570`);
777
+ window.__GCaptcha.Config = {
778
+ ...configResp,
779
+ // 格式化路径
780
+ generate: XoCaptchaHelper.trimSlash(configResp.generate),
781
+ verify: XoCaptchaHelper.trimSlash(configResp.verify),
782
+ wasmExec: XoCaptchaHelper.trimSlash(configResp.wasmExec),
783
+ wasm: XoCaptchaHelper.trimSlash(configResp.wasm)
784
+ };
785
+ }
786
+ XoCaptchaHelper.applyBackgroundSizeFromConfigResp(this.slideConfig, window.__GCaptcha.Config);
787
+ }
788
+ /**
789
+ * 加载验证码数据
790
+ * @returns {Promise<void>}
791
+ */
792
+ async loadCaptcha(sequence) {
793
+ this.clearErrMsg();
794
+ this.resetExpirationTimers();
795
+ await this.applyUiPatch(true);
796
+ this.ensureCurrentLoad(sequence);
797
+ await this.loadConfig();
798
+ this.ensureCurrentLoad(sequence);
799
+ await new XoCaptchaWasmLoader({
800
+ baseUrl: this.getBaseUrl(),
801
+ captchaUrl: this.getCaptchaUrl(),
802
+ timeout: this.getTimeout()
803
+ }).load();
804
+ this.ensureCurrentLoad(sequence);
805
+ const generatePart = window.__GCaptcha?.Config?.generate ?? "";
806
+ const data = await this.requestJson(generatePart);
807
+ this.ensureCurrentLoad(sequence);
808
+ if (!data?.success) throw new Error(data?.message ?? `\u9A8C\u8BC1\u7801\u751F\u6210\u5931\u8D25`);
809
+ const generateResp = data.data;
810
+ if (!generateResp) throw new Error("\u9A8C\u8BC1\u7801\u54CD\u5E94\u7F3A\u5C11\u6570\u636E");
811
+ if (!generateResp?.thumbWidth) throw new Error(`\u9A8C\u8BC1\u7801\u7F3A\u5C11 'sliderW' \u53C2\u6570`);
812
+ if (!generateResp?.thumbHeight) throw new Error(`\u9A8C\u8BC1\u7801\u7F3A\u5C11 'sliderH' \u53C2\u6570`);
813
+ XoCaptchaHelper.applyThumbSizeFromGenerateResp(this.slideConfig, generateResp);
814
+ this.slideData.value = XoCaptchaHelper.generateRespToSlideData(generateResp);
815
+ this.wasmReq = XoCaptchaHelper.buildWasmReqFromGenerateResp(generateResp, this.domRefs.rootId.value);
816
+ await nextTick2();
817
+ this.ensureCurrentLoad(sequence);
818
+ this.wasmRegister();
819
+ this.startExpirationTimers();
820
+ }
821
+ //</editor-fold>
822
+ //<editor-fold desc="UI 补丁及 WASM 功能">
823
+ /**
824
+ * 应用 UI 补丁
825
+ * @param {boolean} apply 使用应用
826
+ * @returns {Promise<void>}
827
+ * @private
828
+ */
829
+ async applyUiPatch(apply) {
830
+ if (!apply) return;
831
+ await new XoCaptchaUiPatch({ domRefs: this.domRefs, props: this.props }).apply();
832
+ }
833
+ /**
834
+ * WASM 功能注册
835
+ * @private
836
+ */
837
+ wasmRegister() {
838
+ const resp = window.__GCaptcha?.Service?.Register(this.domRefs.rootId.value);
839
+ if (!resp?.success) throw new Error(resp?.error || "\u9A8C\u8BC1\u7801\u5BB9\u5668\u7ED1\u5B9A\u5931\u8D25");
840
+ }
841
+ /**
842
+ * WASM 功能注销
843
+ * @private
844
+ */
845
+ wasmUnregister() {
846
+ window.__GCaptcha?.Service?.Unregister(this.domRefs.rootId.value);
847
+ }
848
+ //</editor-fold>
849
+ //<editor-fold desc="动态属性">
850
+ /**
851
+ * 请求验证码 JSON 接口
852
+ * @template T 响应数据类型
853
+ * @param {string} part 验证码接口相对子路径
854
+ * @param {RequestInit} options 请求选项
855
+ * @returns {Promise<XoCaptchaResponse<T>>}
856
+ * @private
857
+ */
858
+ async requestJson(part = "", options = {}) {
859
+ const controller = new AbortController();
860
+ let timedOut = false;
861
+ const timer = window.setTimeout(() => {
862
+ timedOut = true;
863
+ controller.abort();
864
+ }, this.getTimeout());
865
+ this.requestControllers.add(controller);
866
+ const headers = new Headers(options.headers);
867
+ if (options.body !== void 0 && !headers.has("Content-Type")) {
868
+ headers.set("Content-Type", "application/json");
869
+ }
870
+ const requestUrl = this.buildCaptchaUrl(part);
871
+ try {
872
+ const response = await window.fetch(requestUrl, {
873
+ ...options,
874
+ headers,
875
+ signal: controller.signal
876
+ });
877
+ if (!response.ok && response.status !== 400) {
878
+ throw new Error(`\u9A8C\u8BC1\u7801\u8BF7\u6C42\u5931\u8D25 [${response.status}]`);
879
+ }
880
+ return await response.json();
881
+ } catch (error) {
882
+ if (isAbortError(error)) {
883
+ if (!timedOut) throw new XoCaptchaCancelledError();
884
+ throw new Error(`\u9A8C\u8BC1\u7801\u8BF7\u6C42\u8D85\u65F6 [${this.getTimeout()}ms]`);
885
+ }
886
+ throw error;
887
+ } finally {
888
+ window.clearTimeout(timer);
889
+ this.requestControllers.delete(controller);
890
+ }
891
+ }
892
+ /**
893
+ * 开始一次新的验证码加载并取消上一轮 HTTP 请求
894
+ * @returns {number} 本次加载序号
895
+ * @private
896
+ */
897
+ startLoad() {
898
+ this.abortRequests();
899
+ this.loadSequence += 1;
900
+ return this.loadSequence;
901
+ }
902
+ /**
903
+ * 确认当前异步任务仍属于最新验证码加载
904
+ * @param {number} sequence 加载序号
905
+ * @private
906
+ */
907
+ ensureCurrentLoad(sequence) {
908
+ if (this.destroyed || sequence !== this.loadSequence || !this.visible.value) {
909
+ throw new XoCaptchaCancelledError();
910
+ }
911
+ }
912
+ /**
913
+ * 取消当前组件仍在执行的 HTTP 请求
914
+ * @private
915
+ */
916
+ abortRequests() {
917
+ this.requestControllers.forEach((controller) => controller.abort());
918
+ this.requestControllers.clear();
919
+ }
920
+ /**
921
+ * 取消验证码异步操作并使旧加载序号失效
922
+ * @private
923
+ */
924
+ cancelPendingOperations() {
925
+ this.loadSequence += 1;
926
+ this.abortRequests();
927
+ }
928
+ /**
929
+ * 获取当前基础地址
930
+ * @returns {string}
931
+ * @private
932
+ */
933
+ getBaseUrl() {
934
+ return trimTrailingSlash(this.props.baseUrl ?? this.globalProps.baseUrl ?? CaptchaDefaults.baseUrl);
935
+ }
936
+ /**
937
+ * 获取当前请求超时
938
+ * @returns {number}
939
+ * @private
940
+ */
941
+ getTimeout() {
942
+ return this.props.timeout ?? this.globalProps.timeout ?? CaptchaDefaults.timeout;
943
+ }
944
+ /**
945
+ * 获取当前验证码路径
946
+ * @returns {string}
947
+ * @private
948
+ */
949
+ getCaptchaUrl() {
950
+ return XoCaptchaHelper.trimSlash(this.props.captchaUrl ?? this.globalProps.captchaUrl ?? CaptchaDefaults.captchaUrl);
951
+ }
952
+ /**
953
+ * 构建验证码地址
954
+ * @param {string} part 子路径
955
+ * @returns {string}
956
+ * @private
957
+ */
958
+ buildCaptchaUrl(part = "") {
959
+ return [this.getBaseUrl(), this.getCaptchaUrl(), XoCaptchaHelper.trimSlash(part)].filter(Boolean).join("/");
960
+ }
961
+ //</editor-fold>
962
+ //<editor-fold desc="计时器">
963
+ /**
964
+ * 启动验证码有效期定时器
965
+ * @private
966
+ */
967
+ startExpirationTimers() {
968
+ const warningLeadS = 5;
969
+ const validityMs = Number(window.__GCaptcha?.Config?.validity ?? 0) * 1e3;
970
+ if (validityMs <= 0) return;
971
+ const warningDelay = Math.max(validityMs - warningLeadS * 1e3, 0);
972
+ const countdownMessage = (second) => `\u9A8C\u8BC1\u7801\u5373\u5C06\u8FC7\u671F\uFF0C${second} \u79D2\u540E\u81EA\u52A8\u5237\u65B0`;
973
+ this.expirationWarningTimer = window.setTimeout(() => {
974
+ if (!this.visible.value) return;
975
+ let remainS = warningLeadS;
976
+ this.errorMessage.value = countdownMessage(remainS);
977
+ this.expirationCountdownTimer = window.setInterval(() => {
978
+ if (!this.visible.value) return;
979
+ remainS -= 1;
980
+ if (remainS <= 0) {
981
+ this.clearErrMsg();
982
+ this.resetExpirationCountdownTimer();
983
+ return;
984
+ }
985
+ this.errorMessage.value = countdownMessage(remainS);
986
+ }, 1e3);
987
+ }, warningDelay);
988
+ this.expirationRefreshTimer = window.setTimeout(() => {
989
+ if (!this.visible.value) return;
990
+ this.clearErrMsg();
991
+ this.refresh();
992
+ }, validityMs);
993
+ }
994
+ /**
995
+ * 重置验证码有效期定时器
996
+ * @private
997
+ */
998
+ resetExpirationTimers() {
999
+ if (this.expirationWarningTimer) {
1000
+ clearTimeout(this.expirationWarningTimer);
1001
+ this.expirationWarningTimer = null;
1002
+ }
1003
+ if (this.expirationRefreshTimer) {
1004
+ clearTimeout(this.expirationRefreshTimer);
1005
+ this.expirationRefreshTimer = null;
1006
+ }
1007
+ this.resetExpirationCountdownTimer();
1008
+ }
1009
+ /**
1010
+ * 重置验证码过期倒计时定时器
1011
+ * @private
1012
+ */
1013
+ resetExpirationCountdownTimer() {
1014
+ if (this.expirationCountdownTimer) {
1015
+ clearInterval(this.expirationCountdownTimer);
1016
+ this.expirationCountdownTimer = null;
1017
+ }
1018
+ }
1019
+ /**
1020
+ * 重置错误消息清除定时器
1021
+ * @private
1022
+ */
1023
+ resetErrorClearTimer() {
1024
+ if (this.errorClearTimer) {
1025
+ clearTimeout(this.errorClearTimer);
1026
+ this.errorClearTimer = null;
1027
+ }
1028
+ }
1029
+ //</editor-fold>
1030
+ //<editor-fold desc="按键监听">
1031
+ /**
1032
+ * 按键监听处理器
1033
+ * @param {KeyboardEvent} event 按键事件
1034
+ * @private
1035
+ */
1036
+ keydownHandler(event) {
1037
+ if (!this.visible.value) return;
1038
+ if (event.key === "Escape" || event.key === "Esc") {
1039
+ event.preventDefault();
1040
+ event.stopPropagation();
1041
+ event.stopImmediatePropagation();
1042
+ this.close();
1043
+ return;
1044
+ }
1045
+ if (event.key === "F5") {
1046
+ event.preventDefault();
1047
+ event.stopPropagation();
1048
+ event.stopImmediatePropagation();
1049
+ this.refresh();
1050
+ }
1051
+ }
1052
+ /**
1053
+ * 添加按键监听器
1054
+ * @private
1055
+ */
1056
+ addKeydownListener() {
1057
+ document.addEventListener("keydown", this.boundKeydownHandler, true);
1058
+ }
1059
+ /**
1060
+ * 移除按键监听器
1061
+ * @private
1062
+ */
1063
+ removeKeydownListener() {
1064
+ document.removeEventListener("keydown", this.boundKeydownHandler, true);
1065
+ }
1066
+ //</editor-fold>
1067
+ //<editor-fold desc="错误消息">
1068
+ /**
1069
+ * 设置错误消息
1070
+ * @param {string} msg 错误消息
1071
+ * @param {() => void} callback 回调函数
1072
+ * @private
1073
+ */
1074
+ setErrMsg(msg, callback) {
1075
+ this.errorMessage.value = msg;
1076
+ this.resetErrorClearTimer();
1077
+ const errorClearDelay = this.props?.errorClearDelay ?? 0;
1078
+ if (errorClearDelay > 0) {
1079
+ this.errorClearTimer = window.setTimeout(() => {
1080
+ this.clearErrMsg();
1081
+ typeof callback === "function" && callback();
1082
+ }, errorClearDelay);
1083
+ }
1084
+ }
1085
+ /**
1086
+ * 清空错误消息
1087
+ * @private
1088
+ */
1089
+ clearErrMsg() {
1090
+ this.errorMessage.value = "";
1091
+ }
1092
+ //</editor-fold>
1093
+ };
1094
+ function errorMessage(error, fallback) {
1095
+ return error instanceof Error ? error.message : fallback;
1096
+ }
1097
+ function isAbortError(error) {
1098
+ return error instanceof DOMException && error.name === "AbortError";
1099
+ }
1100
+ function trimTrailingSlash(value) {
1101
+ return value.replace(/\/+$/, "");
1102
+ }
1103
+
1104
+ // src/renderer/components/captcha/internal/captcha-service.ts
1105
+ var host = null;
1106
+ function registerCaptchaHost(instance) {
1107
+ host = instance;
1108
+ }
1109
+ function unregisterCaptchaHost(instance) {
1110
+ if (host === instance) {
1111
+ host = null;
1112
+ }
1113
+ }
1114
+ function openCaptcha(options) {
1115
+ const normalizedOptions = typeof options === "string" ? { action: options } : options;
1116
+ const action = normalizedOptions.action.trim();
1117
+ if (!action) {
1118
+ return Promise.reject(new Error("\u9A8C\u8BC1\u7801\u52A8\u4F5C\u7C7B\u578B\u4E0D\u80FD\u4E3A\u7A7A"));
1119
+ }
1120
+ if (!host) {
1121
+ return Promise.reject(new Error("\u9A8C\u8BC1\u7801\u7EC4\u4EF6\u672A\u521D\u59CB\u5316"));
1122
+ }
1123
+ return host.open({ ...normalizedOptions, action });
1124
+ }
1125
+ function closeCaptcha() {
1126
+ host?.close();
1127
+ }
1128
+
1129
+ // src/renderer/components/captcha.ts
1130
+ var XoCaptchaApi = class {
1131
+ /**
1132
+ * 在当前 Vue 应用上下文中提供验证码全局请求配置
1133
+ * @param {XoComponent.CaptchaProvideOptions} options 配置
1134
+ */
1135
+ static provide(options) {
1136
+ XoCaptchaInjector.provide(options);
1137
+ }
1138
+ /**
1139
+ * 获取当前 Vue 应用上下文中的验证码全局请求配置
1140
+ * @returns {XoComponent.CaptchaGlobalOptions}
1141
+ */
1142
+ static inject() {
1143
+ return XoCaptchaInjector.inject();
1144
+ }
1145
+ /**
1146
+ * 通过已挂载的 XoCaptchaHost 打开验证码
1147
+ * @param {string | XoComponent.CaptchaServiceOptions} options 服务选项
1148
+ * @returns {Promise<XoComponent.CaptchaTicket>}
1149
+ */
1150
+ static open(options) {
1151
+ return openCaptcha(options);
1152
+ }
1153
+ /**
1154
+ * 关闭已挂载的全局验证码
1155
+ */
1156
+ static close() {
1157
+ closeCaptcha();
1158
+ }
1159
+ };
1160
+ var XoCaptchaRuntime = {
1161
+ /** 验证码组件状态和生命周期控制器 */
1162
+ Controller: XoCaptchaController,
1163
+ /** 注册全局验证码主机 */
1164
+ registerHost: registerCaptchaHost,
1165
+ /** 注销全局验证码主机 */
1166
+ unregisterHost: unregisterCaptchaHost
1167
+ };
1168
+
1169
+ // src/renderer/components/index.ts
1170
+ import { default as default2 } from "./captcha/xo-captcha-host.vue";
1171
+ import { default as default3 } from "./captcha/xo-captcha.vue";
1172
+
1173
+ // src/renderer/components/context-menu.ts
1174
+ import XoContextMenu from "./context-menu/xo-context-menu.vue";
1175
+ import { createApp } from "vue";
1176
+ var XoContextMenuPlugin = {
1177
+ /**
1178
+ * 安装插件
1179
+ * @param {App} app Vue 应用
1180
+ * @param {XoRendererContextMenu.Options} options 配置
1181
+ */
1182
+ install(app, options = {}) {
1183
+ const unmount = XoMountContextMenu(options);
1184
+ app.onUnmount(() => {
1185
+ unmount();
1186
+ });
1187
+ }
1188
+ };
1189
+ function XoMountContextMenu(options = {}) {
1190
+ const container = createContainer(options.rootId);
1191
+ const app = createApp(XoContextMenu, {
1192
+ maxWidth: options.maxWidth,
1193
+ viewportPadding: options.viewportPadding
1194
+ });
1195
+ app.mount(container);
1196
+ return () => {
1197
+ app.unmount();
1198
+ container.remove();
1199
+ };
1200
+ }
1201
+ function createContainer(rootId = "xo-context-menu-root") {
1202
+ const exists = document.getElementById(rootId);
1203
+ if (exists) {
1204
+ return exists;
1205
+ }
1206
+ const container = document.createElement("div");
1207
+ container.id = rootId;
1208
+ document.body.appendChild(container);
1209
+ return container;
1210
+ }
1211
+
1212
+ // src/renderer/components/index.ts
1213
+ import { default as default4 } from "./context-menu/xo-context-menu-items.vue";
1214
+ import { default as default5 } from "./context-menu/xo-context-menu.vue";
1215
+ import { default as default6 } from "./divider/xo-divider.vue";
1216
+ import { default as default7 } from "./form/xo-form-flex-row.vue";
1217
+ import { default as default8 } from "./form/xo-form-flex.vue";
1218
+ import { default as default9 } from "./layouts/xo-app-layout.vue";
1219
+ import { default as default10 } from "./layouts/xo-mini-layout.vue";
1220
+ import { default as default11 } from "./layouts/xo-simple-layout.vue";
1221
+ import { default as default12 } from "./pages/xo-app-page.vue";
1222
+ import { default as default13 } from "./pages/xo-bootstrap-page.vue";
1223
+ import { default as default14 } from "./pages/xo-dynamic-page.vue";
1224
+ import { default as default15 } from "./pages/xo-settings-page.vue";
1225
+ import { default as default16 } from "./radio-group/xo-radio-group.vue";
1226
+ import { default as default17 } from "./service-status-bar/xo-service-status-bar.vue";
1227
+ import { default as default18 } from "./settings-components/xo-setting-app-opacity.vue";
1228
+ import { default as default19 } from "./settings-components/xo-setting-log-level.vue";
1229
+ import { default as default20 } from "./settings-components/xo-setting-shortcut-keys-record-for-form-flex-rows.vue";
1230
+ import { default as default21 } from "./settings-components/xo-setting-shortcut-keys-record.vue";
1231
+ import { default as default22 } from "./settings-components/xo-setting-window-material.vue";
1232
+ import { default as default23 } from "./settings-pages/xo-setting-page-folder.vue";
1233
+ import { default as default24 } from "./settings-pages/xo-setting-page-general.vue";
1234
+ import { default as default25 } from "./settings-pages/xo-setting-page-remote-service.vue";
1235
+ import { default as default26 } from "./settings-pages/xo-setting-page-updater.vue";
1236
+ import { default as default27 } from "./shortcut-keys-record/xo-shortcut-keys-record.vue";
1237
+ import { default as default28 } from "./side-bar/xo-sidebar-logo.vue";
1238
+ import { default as default29 } from "./spacing-line/xo-spacing-line.vue";
1239
+ import { default as default30 } from "./theme-switch/xo-theme-switch-mini.vue";
1240
+ import { default as default31 } from "./theme-switch/xo-theme-switch.vue";
1241
+ import { default as default32 } from "./title-bar/xo-title-bar.vue";
1242
+ import { default as default33 } from "./updater/xo-updater.vue";
1243
+ import { default as default34 } from "./window-control/xo-window-control.vue";
1244
+ export {
1245
+ default9 as XoAppLayout,
1246
+ default12 as XoAppPage,
1247
+ default13 as XoBootstrapPage,
1248
+ default3 as XoCaptcha,
1249
+ XoCaptchaApi,
1250
+ default2 as XoCaptchaHost,
1251
+ XoCaptchaRuntime,
1252
+ default5 as XoContextMenu,
1253
+ default4 as XoContextMenuItems,
1254
+ XoContextMenuPlugin,
1255
+ default6 as XoDivider,
1256
+ default14 as XoDynamicPage,
1257
+ default8 as XoFormFlex,
1258
+ default7 as XoFormFlexRow,
1259
+ default10 as XoMiniLayout,
1260
+ XoMountContextMenu,
1261
+ default16 as XoRadioGroup,
1262
+ default17 as XoServiceStatusBar,
1263
+ default18 as XoSettingAppOpacity,
1264
+ default19 as XoSettingLogLevel,
1265
+ default23 as XoSettingPageFolder,
1266
+ default24 as XoSettingPageGeneral,
1267
+ default25 as XoSettingPageRemoteService,
1268
+ default26 as XoSettingPageUpdater,
1269
+ default21 as XoSettingShortcutKeysRecord,
1270
+ default20 as XoSettingShortcutKeysRecordForFormFlexRows,
1271
+ default22 as XoSettingWindowMaterial,
1272
+ default15 as XoSettingsPage,
1273
+ default27 as XoShortcutKeysRecord,
1274
+ default28 as XoSidebarLogo,
1275
+ default11 as XoSimpleLayout,
1276
+ default29 as XoSpacingLine,
1277
+ default31 as XoThemeSwitch,
1278
+ default30 as XoThemeSwitchMini,
1279
+ default32 as XoTitleBar,
1280
+ default33 as XoUpdater,
1281
+ default34 as XoWindowControl
1282
+ };