@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,1269 @@
1
+ import {
2
+ MenuCommands
3
+ } from "./chunk-GUOSVDXA.js";
4
+ import {
5
+ XionName
6
+ } from "./chunk-YLZRRUY7.js";
7
+ import {
8
+ SettingWindowIdentity
9
+ } from "./chunk-PVWRRUOK.js";
10
+
11
+ // src/main/menu/menu-items.ts
12
+ import { app, BrowserWindow, clipboard, dialog, session, shell } from "electron";
13
+ import { copyFile, writeFile } from "node:fs/promises";
14
+ import { basename } from "node:path";
15
+ import { fileURLToPath } from "node:url";
16
+ var MenuItems = class _MenuItems {
17
+ //<editor-fold desc="iconfont 图标">
18
+ /**
19
+ * 内置菜单图标
20
+ * @param {string} name 图标名称
21
+ * @returns {XoMenu.Icon}
22
+ */
23
+ static icon(name) {
24
+ return {
25
+ type: "class",
26
+ value: `xion-font xion-icon-${name}`
27
+ };
28
+ }
29
+ //</editor-fold>
30
+ //<editor-fold desc="菜单分组">
31
+ /**
32
+ * 菜单组
33
+ * @param {string} label 菜单组名称
34
+ * @param {XoMenu.SubMenus} items 菜单项
35
+ * @returns {XoMenu.Item}
36
+ */
37
+ static group(label, items) {
38
+ return {
39
+ label,
40
+ submenu: items
41
+ };
42
+ }
43
+ //</editor-fold>
44
+ //<editor-fold desc="Electron 内置菜单">
45
+ /**
46
+ * 分割线
47
+ * @param {boolean} enabled 是否启用
48
+ * @returns {XoMenu.Item}
49
+ */
50
+ static separator(enabled = true) {
51
+ return {
52
+ type: "separator",
53
+ enabled
54
+ };
55
+ }
56
+ /**
57
+ * 撤销
58
+ * @param {boolean} enabled 是否启用
59
+ * @returns {XoMenu.Item}
60
+ */
61
+ static undo(enabled = true) {
62
+ return {
63
+ label: "\u64A4\u9500",
64
+ role: "undo",
65
+ accelerator: "CmdOrCtrl+Z",
66
+ rendererIcon: _MenuItems.icon("undo"),
67
+ enabled
68
+ };
69
+ }
70
+ /**
71
+ * 重做
72
+ * @param {boolean} enabled 是否启用
73
+ * @returns {XoMenu.Item}
74
+ */
75
+ static redo(enabled = true) {
76
+ return {
77
+ label: "\u91CD\u505A",
78
+ role: "redo",
79
+ accelerator: "CmdOrCtrl+Shift+Z",
80
+ rendererIcon: _MenuItems.icon("redo"),
81
+ enabled
82
+ };
83
+ }
84
+ /**
85
+ * 剪切
86
+ * @param {boolean} enabled 是否启用
87
+ * @returns {XoMenu.Item}
88
+ */
89
+ static cut(enabled = true) {
90
+ return {
91
+ label: "\u526A\u5207",
92
+ role: "cut",
93
+ accelerator: "CmdOrCtrl+X",
94
+ rendererIcon: _MenuItems.icon("cut"),
95
+ enabled
96
+ };
97
+ }
98
+ /**
99
+ * 复制
100
+ * @param {boolean} enabled 是否启用
101
+ * @returns {XoMenu.Item}
102
+ */
103
+ static copy(enabled = true) {
104
+ return {
105
+ label: "\u590D\u5236",
106
+ role: "copy",
107
+ accelerator: "CmdOrCtrl+C",
108
+ rendererIcon: _MenuItems.icon("copy"),
109
+ enabled
110
+ };
111
+ }
112
+ /**
113
+ * 粘贴
114
+ * @param {boolean} enabled 是否启用
115
+ * @returns {XoMenu.Item}
116
+ */
117
+ static paste(enabled = true) {
118
+ return {
119
+ label: "\u7C98\u8D34",
120
+ role: "paste",
121
+ accelerator: "CmdOrCtrl+V",
122
+ rendererIcon: _MenuItems.icon("paste"),
123
+ enabled
124
+ };
125
+ }
126
+ /**
127
+ * 删除
128
+ * @param {boolean} enabled 是否启用
129
+ * @returns {XoMenu.Item}
130
+ */
131
+ static del(enabled = true) {
132
+ return {
133
+ label: "\u5220\u9664",
134
+ role: "delete",
135
+ accelerator: "Delete",
136
+ rendererIcon: _MenuItems.icon("delete"),
137
+ enabled
138
+ };
139
+ }
140
+ /**
141
+ * 全选
142
+ * @param {boolean} enabled 是否启用
143
+ * @returns {XoMenu.Item}
144
+ */
145
+ static selectAll(enabled = true) {
146
+ return {
147
+ label: "\u5168\u9009",
148
+ role: "selectAll",
149
+ accelerator: "CmdOrCtrl+A",
150
+ rendererIcon: _MenuItems.icon("select-all"),
151
+ enabled
152
+ };
153
+ }
154
+ /**
155
+ * 最小化
156
+ * @param {boolean} enabled 是否启用
157
+ * @returns {XoMenu.Item}
158
+ */
159
+ static minimize(enabled = true) {
160
+ return {
161
+ label: "\u6700\u5C0F\u5316",
162
+ role: "minimize",
163
+ accelerator: "CmdOrCtrl+M",
164
+ rendererIcon: _MenuItems.icon("minimize"),
165
+ enabled
166
+ };
167
+ }
168
+ /**
169
+ * 刷新
170
+ * @param {boolean} enabled 是否启用
171
+ * @returns {XoMenu.Item}
172
+ */
173
+ static reload(enabled = true) {
174
+ return {
175
+ label: "\u5237\u65B0",
176
+ role: "reload",
177
+ accelerator: "F5",
178
+ rendererIcon: _MenuItems.icon("reload"),
179
+ visible: enabled,
180
+ enabled
181
+ };
182
+ }
183
+ /**
184
+ * 强制刷新
185
+ * @param {boolean} enabled 是否启用
186
+ * @returns {XoMenu.Item}
187
+ */
188
+ static forceReload(enabled = true) {
189
+ return {
190
+ label: "\u5F3A\u5236\u5237\u65B0",
191
+ role: "forceReload",
192
+ accelerator: "CmdOrCtrl+F5",
193
+ rendererIcon: _MenuItems.icon("force-reload"),
194
+ visible: enabled,
195
+ enabled
196
+ };
197
+ }
198
+ /**
199
+ * 切换全屏
200
+ * @param {boolean} enabled 是否启用
201
+ * @returns {XoMenu.Item}
202
+ */
203
+ static toggleFullscreen(enabled = true) {
204
+ const isFullScreen = BrowserWindow.getFocusedWindow()?.isFullScreen();
205
+ return {
206
+ label: `${isFullScreen ? "\u9000\u51FA" : ""}\u5168\u5C4F`,
207
+ role: "togglefullscreen",
208
+ accelerator: "F11",
209
+ rendererIcon: _MenuItems.icon(isFullScreen ? "exit-fullscreen" : "fullscreen"),
210
+ enabled
211
+ };
212
+ }
213
+ /**
214
+ * 切换开发者工具
215
+ * @returns {XoMenu.Item}
216
+ */
217
+ static toggleDevTools() {
218
+ const isDevToolsOpened = BrowserWindow.getFocusedWindow()?.webContents?.isDevToolsOpened();
219
+ return {
220
+ label: `${isDevToolsOpened ? "\u5173\u95ED" : "\u6253\u5F00"}\u5F00\u53D1\u8005\u5DE5\u5177`,
221
+ role: "toggleDevTools",
222
+ accelerator: "F12",
223
+ rendererIcon: _MenuItems.icon("toggle-dev-tools"),
224
+ enabled: !app.isPackaged,
225
+ visible: !app.isPackaged
226
+ };
227
+ }
228
+ /**
229
+ * 关闭窗口
230
+ * @param {boolean} enabled 是否启用
231
+ * @param {string} label 名称
232
+ * @returns {XoMenu.Item}
233
+ */
234
+ static close(enabled = true, label = "\u5173\u95ED\u7A97\u53E3") {
235
+ return {
236
+ label,
237
+ enabled,
238
+ role: "close",
239
+ accelerator: "CmdOrCtrl+W",
240
+ rendererIcon: _MenuItems.icon("close")
241
+ };
242
+ }
243
+ /**
244
+ * 关于
245
+ * @param {boolean} enabled 是否启用
246
+ * @param {string} label 名称
247
+ * @returns {XoMenu.Item}
248
+ */
249
+ static about(enabled = true, label = "\u5173\u4E8E") {
250
+ return {
251
+ label,
252
+ enabled,
253
+ role: "about",
254
+ accelerator: "F1"
255
+ };
256
+ }
257
+ //</editor-fold>
258
+ //<editor-fold desc="页面内容菜单">
259
+ /**
260
+ * 打开链接
261
+ * @param {string} url 链接地址
262
+ * @param {boolean} enabled 是否启用
263
+ * @returns {XoMenu.Item}
264
+ */
265
+ static openLink(url, enabled = Boolean(url)) {
266
+ return {
267
+ label: "\u6253\u5F00\u94FE\u63A5",
268
+ visible: Boolean(url),
269
+ enabled,
270
+ rendererIcon: _MenuItems.icon("open-link"),
271
+ command: MenuCommands.linkOpen,
272
+ payload: null,
273
+ click: () => {
274
+ url && void shell.openExternal(url);
275
+ }
276
+ };
277
+ }
278
+ /**
279
+ * 复制链接地址
280
+ * @param {string} url 链接地址
281
+ * @param {boolean} enabled 是否启用
282
+ * @returns {XoMenu.Item}
283
+ */
284
+ static copyLink(url, enabled = Boolean(url)) {
285
+ return {
286
+ label: "\u590D\u5236\u94FE\u63A5\u5730\u5740",
287
+ visible: Boolean(url),
288
+ enabled,
289
+ rendererIcon: _MenuItems.icon("copy-link"),
290
+ command: MenuCommands.linkCopy,
291
+ payload: null,
292
+ click: () => {
293
+ url && clipboard.writeText(url);
294
+ }
295
+ };
296
+ }
297
+ /**
298
+ * 打开图片
299
+ * @param {XoMenu.ContextState} state 上下文状态
300
+ * @returns {XoMenu.Item}
301
+ */
302
+ static openImage(state) {
303
+ const visible = state.mediaType === "image" || Boolean(state.hasImageContents);
304
+ const enabled = visible && Boolean(state.srcURL);
305
+ return {
306
+ label: "\u6253\u5F00\u56FE\u50CF",
307
+ visible,
308
+ enabled,
309
+ rendererIcon: _MenuItems.icon("open-image"),
310
+ command: MenuCommands.imageOpen,
311
+ payload: null,
312
+ click: async () => {
313
+ if (!state.srcURL) {
314
+ return;
315
+ }
316
+ if (state.srcURL.startsWith("file://")) {
317
+ const filePath = fileURLToPath(state.srcURL);
318
+ await shell.openPath(filePath);
319
+ return;
320
+ }
321
+ await shell.openExternal(state.srcURL);
322
+ }
323
+ };
324
+ }
325
+ /**
326
+ * 复制图片
327
+ * @param {XoMenu.ContextState} state 上下文状态
328
+ * @returns {XoMenu.Item}
329
+ */
330
+ static copyImage(state) {
331
+ const visible = state.mediaType === "image" || Boolean(state.hasImageContents);
332
+ const enabled = visible && state.x !== void 0 && state.y !== void 0;
333
+ return {
334
+ label: "\u590D\u5236\u56FE\u50CF",
335
+ visible,
336
+ enabled,
337
+ rendererIcon: _MenuItems.icon("copy-image"),
338
+ command: MenuCommands.imageCopy,
339
+ payload: null,
340
+ click: (_menuItem, win) => {
341
+ if (win instanceof BrowserWindow && state.x !== void 0 && state.y !== void 0) {
342
+ win.webContents.copyImageAt(state.x, state.y);
343
+ }
344
+ }
345
+ };
346
+ }
347
+ /**
348
+ * 复制图像链接
349
+ * @param {XoMenu.ContextState} state 上下文状态
350
+ * @returns {XoMenu.Item}
351
+ */
352
+ static copyImageLink(state) {
353
+ const visible = state.mediaType === "image" || Boolean(state.hasImageContents);
354
+ const enabled = visible && Boolean(state.srcURL);
355
+ return {
356
+ label: "\u590D\u5236\u56FE\u50CF\u94FE\u63A5",
357
+ visible,
358
+ enabled,
359
+ rendererIcon: _MenuItems.icon("copy-image-link"),
360
+ command: MenuCommands.imageCopyLink,
361
+ payload: null,
362
+ click: () => {
363
+ state.srcURL && clipboard.writeText(state.srcURL);
364
+ }
365
+ };
366
+ }
367
+ /**
368
+ * 将图像另存为
369
+ * @param {XoMenu.ContextState} state 上下文状态
370
+ * @returns {XoMenu.Item}
371
+ */
372
+ static saveImageAs(state) {
373
+ const visible = state.mediaType === "image" || Boolean(state.hasImageContents);
374
+ const enabled = visible && Boolean(state.srcURL);
375
+ return {
376
+ label: "\u5C06\u56FE\u50CF\u53E6\u5B58\u4E3A",
377
+ visible,
378
+ enabled,
379
+ rendererIcon: _MenuItems.icon("image-save"),
380
+ command: MenuCommands.imageSaveAs,
381
+ payload: null,
382
+ click: async (_menuItem, win) => {
383
+ if (!state.srcURL) {
384
+ return;
385
+ }
386
+ const options = {
387
+ defaultPath: _MenuItems.imageFileName(state),
388
+ filters: [
389
+ {
390
+ name: "Images",
391
+ extensions: ["png", "jpg", "jpeg", "gif", "webp", "bmp", "svg"]
392
+ },
393
+ {
394
+ name: "All Files",
395
+ extensions: ["*"]
396
+ }
397
+ ]
398
+ };
399
+ const result = win instanceof BrowserWindow ? await dialog.showSaveDialog(win, options) : await dialog.showSaveDialog(options);
400
+ if (result.canceled || !result.filePath) {
401
+ return;
402
+ }
403
+ if (state.srcURL.startsWith("file://")) {
404
+ await copyFile(fileURLToPath(state.srcURL), result.filePath);
405
+ return;
406
+ }
407
+ const targetSession = win instanceof BrowserWindow ? win.webContents.session : session.defaultSession;
408
+ const response = await targetSession.fetch(state.srcURL);
409
+ if (!response.ok) {
410
+ return;
411
+ }
412
+ const data = Buffer.from(await response.arrayBuffer());
413
+ await writeFile(result.filePath, data);
414
+ }
415
+ };
416
+ }
417
+ /**
418
+ * 获取图片文件名
419
+ * @param {XoMenu.ContextState} state 上下文状态
420
+ * @returns {string}
421
+ */
422
+ static imageFileName(state) {
423
+ if (state.suggestedFilename) {
424
+ return state.suggestedFilename;
425
+ }
426
+ if (!state.srcURL) {
427
+ return "image";
428
+ }
429
+ try {
430
+ const url = new URL(state.srcURL);
431
+ const name = basename(url.pathname);
432
+ return name || "image";
433
+ } catch {
434
+ return basename(state.srcURL) || "image";
435
+ }
436
+ }
437
+ //</editor-fold>
438
+ //<editor-fold desc="窗口管理">
439
+ /**
440
+ * 显示主窗口
441
+ * @param {XoAppAbstract} xoApp XionApp
442
+ * @returns {XoMenu.Item}
443
+ */
444
+ static showMainWindow(xoApp) {
445
+ return {
446
+ label: `\u6253\u5F00 ${xoApp.getAppConfig()?.eletronAppConfig?.productName ?? XionName}`,
447
+ click: async () => {
448
+ await xoApp?.showMainWindow();
449
+ xoApp?.getTrayManager()?.setFocus();
450
+ }
451
+ };
452
+ }
453
+ /**
454
+ * 显示设置窗口
455
+ * @param {XoAppAbstract} xoApp XionApp
456
+ * @param {string} label 名称
457
+ * @returns {XoMenu.Item}
458
+ */
459
+ static showSettingWindow(xoApp, label = "\u6253\u5F00\u8BBE\u7F6E") {
460
+ return {
461
+ label,
462
+ click: () => {
463
+ void xoApp.showSettingWindow();
464
+ }
465
+ };
466
+ }
467
+ //</editor-fold>
468
+ //<editor-fold desc="APP 管理">
469
+ /**
470
+ * 检查更新
471
+ * @param {XoAppAbstract} xoApp XionApp
472
+ * @param {string} label 名称
473
+ * @param {string} version 当前版本号
474
+ * @returns {XoMenu.Item}
475
+ */
476
+ static checkForUpdate(xoApp, label = "\u68C0\u67E5\u66F4\u65B0", version) {
477
+ return {
478
+ label: `${label}${`v${version ?? app.getVersion()}`.padStart(16)}`,
479
+ click: () => {
480
+ void xoApp.getUpdaterManager().checkForUpdates();
481
+ const updaterSettingsRoute = xoApp.getAppConfig()?.updaterSettingsRoute;
482
+ if (updaterSettingsRoute) {
483
+ void this.showSettingWindowWithRoute(xoApp, updaterSettingsRoute);
484
+ return;
485
+ }
486
+ void xoApp.showMainWindow();
487
+ }
488
+ };
489
+ }
490
+ /**
491
+ * 打开设置窗口并跳转到指定路由
492
+ * <p>先确保设置窗口存在,避免首次创建时丢失路由请求。</p>
493
+ * @param {XoAppAbstract} xoApp XionApp
494
+ * @param {XoWindow.RouteRedirectRequestWithoutWindow} request 路由重定向请求
495
+ * @returns {Promise<void>}
496
+ * @private
497
+ */
498
+ static async showSettingWindowWithRoute(xoApp, request) {
499
+ await xoApp.showSettingWindow();
500
+ await xoApp.getWindowManager().redirectRoute({
501
+ ...request,
502
+ windowIdentity: SettingWindowIdentity
503
+ });
504
+ }
505
+ /**
506
+ * 退出应用
507
+ * @param {XoAppAbstract} xoApp XionApp
508
+ * @param {string} label 名称
509
+ * @returns {XoMenu.Item}
510
+ */
511
+ static appQuit(xoApp, label = "\u9000\u51FA") {
512
+ return {
513
+ label,
514
+ click: () => xoApp.quit()
515
+ };
516
+ }
517
+ //</editor-fold>
518
+ };
519
+
520
+ // src/main/menu/menu-manager-abstract.ts
521
+ import { app as app2, BrowserWindow as BrowserWindow2, Menu } from "electron";
522
+ import { existsSync, readFileSync } from "node:fs";
523
+ import path from "node:path";
524
+ import { fileURLToPath as fileURLToPath2 } from "node:url";
525
+ var MenuManagerAbstract = class {
526
+ //<editor-fold desc="属性">
527
+ /**
528
+ * Xion 应用
529
+ * @type {XoAppAbstract}
530
+ */
531
+ xoApp;
532
+ /**
533
+ * 上下文菜单缓存过期时间
534
+ * @type {number}
535
+ * @protected
536
+ */
537
+ contextMenuTTL = 3e4;
538
+ /**
539
+ * 上下文菜单请求序号
540
+ * @type {number}
541
+ * @private
542
+ */
543
+ contextMenuSeq = 0;
544
+ /**
545
+ * 上下文菜单缓存
546
+ * @type {Map<string, XoMenu.ContextMenuRecord>}
547
+ * @private
548
+ */
549
+ contextMenuRecords = /* @__PURE__ */ new Map();
550
+ /**
551
+ * 渲染进程图片地址缓存
552
+ * @type {Map<string, string>}
553
+ * @private
554
+ */
555
+ rendererImageUrlCache = /* @__PURE__ */ new Map();
556
+ /**
557
+ * 菜单命令处理器
558
+ * @type {Map<XoMenu.Command, XoMenu.CommandHandler>}
559
+ * @private
560
+ */
561
+ commandHandlers = /* @__PURE__ */ new Map();
562
+ //</editor-fold>
563
+ //<editor-fold desc="构造函数">
564
+ /**
565
+ * 构造函数
566
+ * @param {XoAppAbstract} xoApp Xion 应用
567
+ */
568
+ constructor(xoApp) {
569
+ this.xoApp = xoApp;
570
+ this.registerCommands();
571
+ }
572
+ //</editor-fold>
573
+ //<editor-fold desc="安装应用菜单">
574
+ /**
575
+ * 安装应用菜单
576
+ */
577
+ installAppMenu() {
578
+ Menu.setApplicationMenu(this.getApplicationMenu());
579
+ }
580
+ //</editor-fold>
581
+ //<editor-fold desc="获取菜单">
582
+ /**
583
+ * 获取应用菜单
584
+ * @returns {Electron.Menu}
585
+ */
586
+ getApplicationMenu() {
587
+ return this.buildMenu(this.applicationMenuItems());
588
+ }
589
+ /**
590
+ * 获取托盘菜单
591
+ * @returns {Electron.Menu}
592
+ */
593
+ getTrayMenu() {
594
+ return this.buildMenu(this.trayMenuItems());
595
+ }
596
+ /**
597
+ * 按上下文获取菜单
598
+ * @param {Electron.ContextMenuParams} params 上下文菜单参数
599
+ * @returns {Electron.Menu}
600
+ */
601
+ getContextMenu(params) {
602
+ const type = this.contextType(params);
603
+ const state = this.contextState(params);
604
+ return this.buildMenu(this.contextMenuItems(type, state));
605
+ }
606
+ //</editor-fold>
607
+ //<editor-fold desc="菜单弹出/解析">
608
+ /**
609
+ * 弹出上下文菜单(主进程中)
610
+ * @param {Electron.ContextMenuParams} params 上下文菜单参数
611
+ * @param {Electron.BrowserWindow} window 生效窗口
612
+ */
613
+ popupContextMenu(params, window) {
614
+ window && this.getContextMenu(params).popup({ window });
615
+ }
616
+ /**
617
+ * 解析上下文菜单(渲染进程)
618
+ * @param {Electron.ContextMenuParams} params 上下文菜单参数
619
+ * @param {Electron.BrowserWindow} window 生效窗口
620
+ * @returns {XoMenu.ContextMenuRequest}
621
+ */
622
+ resolveContextMenu(params, window) {
623
+ const type = this.contextType(params);
624
+ const state = this.contextState(params);
625
+ const requestId = this.nextContextMenuRequestId();
626
+ const items = this.contextMenuItems(type, state);
627
+ const rendererItems = this.toRendererItems(items);
628
+ const timer = setTimeout(() => {
629
+ this.deleteContextMenuRecord(requestId);
630
+ }, this.contextMenuTTL);
631
+ this.contextMenuRecords.set(requestId, {
632
+ requestId,
633
+ window,
634
+ params,
635
+ state,
636
+ timer
637
+ });
638
+ return {
639
+ requestId,
640
+ x: params.x,
641
+ y: params.y,
642
+ items: rendererItems
643
+ };
644
+ }
645
+ /**
646
+ * 生成上下文菜单请求 ID
647
+ * @returns {string}
648
+ * @protected
649
+ */
650
+ nextContextMenuRequestId() {
651
+ this.contextMenuSeq += 1;
652
+ return `context-menu-${Date.now()}-${this.contextMenuSeq}`;
653
+ }
654
+ /**
655
+ * 转换为渲染进程菜单项
656
+ * @param {XoMenu.Item[]} items 菜单项
657
+ * @returns {XoMenu.RendererItem[]}
658
+ * @protected
659
+ */
660
+ toRendererItems(items) {
661
+ const commandNames = this.builtInRoleCommands();
662
+ return items.filter((item) => item.visible !== false).map((item, index) => {
663
+ const submenu = Array.isArray(item.submenu) ? this.toRendererItems(item.submenu) : [];
664
+ const type = item.type === "separator" ? item.type : submenu.length > 0 ? "submenu" : item.type ?? "normal";
665
+ return {
666
+ id: item.id ?? `${item.command ?? item.role ?? item.label ?? "item"}:${index}`,
667
+ label: item.label ?? "",
668
+ type,
669
+ enabled: item.enabled !== false,
670
+ visible: item.visible !== false,
671
+ checked: item.checked === true,
672
+ accelerator: this.rendererAccelerator(item.accelerator),
673
+ icon: this.rendererIcon(item.rendererIcon),
674
+ command: item.command ?? (item.role ? commandNames[item.role] ?? null : null),
675
+ payload: item.payload ?? null,
676
+ submenu
677
+ };
678
+ });
679
+ }
680
+ /**
681
+ * 内置 electron 菜单 role 与命令名的映射
682
+ * @returns {XoMenu.RoleCommandMap}
683
+ * @protected
684
+ */
685
+ builtInRoleCommands() {
686
+ return {
687
+ undo: MenuCommands.editUndo,
688
+ redo: MenuCommands.editRedo,
689
+ cut: MenuCommands.editCut,
690
+ copy: MenuCommands.editCopy,
691
+ paste: MenuCommands.editPaste,
692
+ delete: MenuCommands.editDelete,
693
+ selectAll: MenuCommands.editSelectAll,
694
+ reload: MenuCommands.windowReload,
695
+ forceReload: MenuCommands.windowForceReload,
696
+ minimize: MenuCommands.windowMinimize,
697
+ togglefullscreen: MenuCommands.windowToggleFullscreen,
698
+ close: MenuCommands.windowClose,
699
+ toggleDevTools: MenuCommands.windowToggleDevTools
700
+ };
701
+ }
702
+ /**
703
+ * 转换渲染进程快捷键文本
704
+ * @param {Electron.Accelerator | undefined} accelerator Electron 快捷键
705
+ * @returns {string | null}
706
+ * @protected
707
+ */
708
+ rendererAccelerator(accelerator) {
709
+ if (typeof accelerator !== "string") {
710
+ return null;
711
+ }
712
+ return accelerator.split("+").map((key) => this.rendererAcceleratorKey(key)).join("+");
713
+ }
714
+ /**
715
+ * 转换渲染进程快捷键按键文本
716
+ * @param {string} key 按键
717
+ * @returns {string}
718
+ * @protected
719
+ */
720
+ rendererAcceleratorKey(key) {
721
+ const isMac = process.platform === "darwin";
722
+ const modifiers = {
723
+ command: "Cmd",
724
+ cmd: "Cmd",
725
+ control: "Ctrl",
726
+ ctrl: "Ctrl",
727
+ commandorcontrol: isMac ? "Cmd" : "Ctrl",
728
+ cmdorctrl: isMac ? "Cmd" : "Ctrl",
729
+ alt: "Alt",
730
+ option: isMac ? "Option" : "Alt",
731
+ altgr: "AltGr",
732
+ shift: "Shift",
733
+ super: isMac ? "Cmd" : "Win",
734
+ meta: isMac ? "Cmd" : "Win"
735
+ };
736
+ return modifiers[key.toLowerCase()] ?? key;
737
+ }
738
+ /**
739
+ * 转换渲染进程菜单图标
740
+ * @param {XoMenu.Icon | undefined} icon 菜单图标
741
+ * @returns {XoMenu.Icon | null}
742
+ * @protected
743
+ */
744
+ rendererIcon(icon) {
745
+ if (!icon || !icon.value) {
746
+ return null;
747
+ }
748
+ if (icon.type === "class") {
749
+ return icon;
750
+ }
751
+ if (icon.type === "image") {
752
+ return {
753
+ ...icon,
754
+ value: this.rendererImageUrl(icon.value)
755
+ };
756
+ }
757
+ return null;
758
+ }
759
+ /**
760
+ * 转换渲染进程图片地址
761
+ * @param {string} value 图片地址或本地路径
762
+ * @returns {string}
763
+ * @protected
764
+ */
765
+ rendererImageUrl(value) {
766
+ const file = this.localImageFile(value);
767
+ if (!file) {
768
+ return value;
769
+ }
770
+ const cached = this.rendererImageUrlCache.get(file);
771
+ if (cached) {
772
+ return cached;
773
+ }
774
+ try {
775
+ const url = `data:${this.imageMimeType(file)};base64,${readFileSync(file).toString("base64")}`;
776
+ this.rendererImageUrlCache.set(file, url);
777
+ return url;
778
+ } catch (e) {
779
+ this.xoApp.appLog.warn("\u83DC\u5355\u56FE\u6807\u8BFB\u53D6\u5931\u8D25", { file, error: e });
780
+ return value;
781
+ }
782
+ }
783
+ /**
784
+ * 获取本地图片路径
785
+ * @param {string} value 图片地址或本地路径
786
+ * @returns {string | null}
787
+ * @protected
788
+ */
789
+ localImageFile(value) {
790
+ let file = null;
791
+ if (value.startsWith("file://")) {
792
+ file = fileURLToPath2(value);
793
+ } else if (path.isAbsolute(value)) {
794
+ file = value;
795
+ }
796
+ return file && existsSync(file) ? file : null;
797
+ }
798
+ /**
799
+ * 获取图片 MIME 类型
800
+ * @param {string} file 图片路径
801
+ * @returns {string}
802
+ * @protected
803
+ */
804
+ imageMimeType(file) {
805
+ const ext = path.extname(file).toLowerCase();
806
+ const types = {
807
+ ".apng": "image/apng",
808
+ ".avif": "image/avif",
809
+ ".bmp": "image/bmp",
810
+ ".gif": "image/gif",
811
+ ".ico": "image/x-icon",
812
+ ".jpg": "image/jpeg",
813
+ ".jpeg": "image/jpeg",
814
+ ".png": "image/png",
815
+ ".svg": "image/svg+xml",
816
+ ".webp": "image/webp"
817
+ };
818
+ return types[ext] ?? "application/octet-stream";
819
+ }
820
+ /**
821
+ * 内置命令
822
+ * @returns {XoMenu.CommandHandlerMap}
823
+ * @protected
824
+ */
825
+ builtInCommands() {
826
+ return {
827
+ /* --- Electron 内置命令 --- */
828
+ // 编辑命令
829
+ [MenuCommands.editUndo]: (record) => record.window.webContents.undo(),
830
+ [MenuCommands.editRedo]: (record) => record.window.webContents.redo(),
831
+ [MenuCommands.editCut]: (record) => record.window.webContents.cut(),
832
+ [MenuCommands.editCopy]: (record) => record.window.webContents.copy(),
833
+ [MenuCommands.editPaste]: (record) => record.window.webContents.paste(),
834
+ [MenuCommands.editDelete]: (record) => record.window.webContents.delete(),
835
+ [MenuCommands.editSelectAll]: (record) => record.window.webContents.selectAll(),
836
+ // 窗口命令
837
+ [MenuCommands.windowReload]: (record) => record.window.webContents.reload(),
838
+ [MenuCommands.windowForceReload]: (record) => record.window.webContents.reloadIgnoringCache(),
839
+ [MenuCommands.windowMinimize]: (record) => record.window.minimize(),
840
+ [MenuCommands.windowToggleFullscreen]: (record) => record.window.setFullScreen(!record.window.isFullScreen()),
841
+ [MenuCommands.windowClose]: (record) => record.window.close(),
842
+ [MenuCommands.windowToggleDevTools]: (record) => {
843
+ const webContents = record.window.webContents;
844
+ webContents.isDevToolsOpened() ? webContents.closeDevTools() : webContents.openDevTools();
845
+ },
846
+ /* --- Xion 框架内置命令 --- */
847
+ // 链接命令
848
+ [MenuCommands.linkOpen]: this.toCommandHandler((record, _payload) => MenuItems.openLink(record.state.linkURL)),
849
+ [MenuCommands.linkCopy]: this.toCommandHandler((record, _payload) => MenuItems.copyLink(record.state.linkURL)),
850
+ // 图片命令
851
+ [MenuCommands.imageOpen]: this.toCommandHandler((record, _payload) => MenuItems.openImage(record.state)),
852
+ [MenuCommands.imageSaveAs]: this.toCommandHandler((record, _payload) => MenuItems.saveImageAs(record.state)),
853
+ [MenuCommands.imageCopy]: this.toCommandHandler((record, _payload) => MenuItems.copyImage(record.state)),
854
+ [MenuCommands.imageCopyLink]: this.toCommandHandler((record, _payload) => MenuItems.copyImageLink(record.state))
855
+ };
856
+ }
857
+ /**
858
+ * 菜单项转命令处理器
859
+ * @param {(record: XoMenu.ContextMenuRecord, payload: any) => XoMenu.Item} item 菜单项
860
+ * @returns {XoMenu.CommandHandler}
861
+ * @protected
862
+ */
863
+ toCommandHandler(item) {
864
+ return async (record, payload) => {
865
+ await this.executeClick(item(record, payload), record);
866
+ };
867
+ }
868
+ /**
869
+ * 执行菜单项点击事件
870
+ * @param {XoMenu.Item} item 菜单项
871
+ * @param {XoMenu.ContextMenuRecord} record 上下文菜单缓存
872
+ * @returns {Promise<void>}
873
+ * @protected
874
+ */
875
+ async executeClick(item, record) {
876
+ if (item.visible === false || item.enabled === false || !item.click) {
877
+ return;
878
+ }
879
+ void item.click({}, record.window, {});
880
+ }
881
+ /**
882
+ * 注册菜单命令
883
+ * @param {XoMenu.Command} command 命令
884
+ * @param {XoMenu.CommandHandler} handler 处理器
885
+ */
886
+ registerCommand(command, handler) {
887
+ this.commandHandlers.set(command, handler);
888
+ }
889
+ /**
890
+ * 批量注册菜单命令
891
+ * @protected
892
+ */
893
+ registerCommands() {
894
+ const commands = {
895
+ // 内置命令
896
+ ...this.builtInCommands(),
897
+ // 业务命令
898
+ ...this.commands()
899
+ };
900
+ for (let [command, handler] of Object.entries(commands)) {
901
+ this.registerCommand(command, handler);
902
+ }
903
+ }
904
+ /**
905
+ * 执行菜单命令
906
+ * @param {XoMenu.ExecuteCommandRequest} request 请求
907
+ * @returns {Promise<boolean>}
908
+ */
909
+ async executeCommand(request) {
910
+ const { requestId, command, payload } = request;
911
+ const record = this.contextMenuRecords.get(requestId);
912
+ if (!record) {
913
+ return false;
914
+ }
915
+ this.deleteContextMenuRecord(requestId);
916
+ if (record.window.isDestroyed()) {
917
+ return false;
918
+ }
919
+ const handler = this.commandHandlers.get(command);
920
+ if (!handler) {
921
+ return false;
922
+ }
923
+ try {
924
+ await handler(record, payload);
925
+ } catch (err) {
926
+ this.xoApp.appLog.error("[Menu executeCommand]", err);
927
+ throw err;
928
+ }
929
+ return true;
930
+ }
931
+ /**
932
+ * 删除上下文菜单缓存
933
+ * @param {string} requestId 请求 ID
934
+ * @protected
935
+ */
936
+ deleteContextMenuRecord(requestId) {
937
+ const record = this.contextMenuRecords.get(requestId);
938
+ if (!record) {
939
+ return;
940
+ }
941
+ clearTimeout(record.timer);
942
+ this.contextMenuRecords.delete(requestId);
943
+ }
944
+ //</editor-fold>
945
+ //<editor-fold desc="辅助方法">
946
+ /**
947
+ * 解析上下文菜单类型
948
+ * @param {Electron.ContextMenuParams} params 上下文菜单参数
949
+ * @returns {XoMenu.Type}
950
+ */
951
+ contextType(params) {
952
+ if (!params) {
953
+ return "default";
954
+ }
955
+ if (params.isEditable) {
956
+ return "input";
957
+ }
958
+ if (params.selectionText.length > 0) {
959
+ return "selection";
960
+ }
961
+ if (params.mediaType === "image" || params.hasImageContents) {
962
+ return "image";
963
+ }
964
+ if (params.linkURL.length > 0) {
965
+ return "link";
966
+ }
967
+ return "default";
968
+ }
969
+ /**
970
+ * 解析上下文菜单状态
971
+ * @param {Electron.ContextMenuParams} params 上下文菜单参数
972
+ * @returns {XoMenu.ContextState}
973
+ */
974
+ contextState(params) {
975
+ return params ? {
976
+ canUndo: params.editFlags.canUndo,
977
+ canRedo: params.editFlags.canRedo,
978
+ hasSelection: params.selectionText.length > 0,
979
+ isPassword: params.formControlType === "input-password",
980
+ canCut: params.editFlags.canCut,
981
+ canCopy: params.editFlags.canCopy,
982
+ canPaste: params.editFlags.canPaste,
983
+ canDelete: params.editFlags.canDelete,
984
+ canSelectAll: params.editFlags.canSelectAll,
985
+ canEditRichly: params.editFlags.canEditRichly,
986
+ linkURL: params.linkURL,
987
+ srcURL: params.srcURL,
988
+ suggestedFilename: params.suggestedFilename,
989
+ mediaType: params.mediaType,
990
+ hasImageContents: params.hasImageContents,
991
+ x: params.x,
992
+ y: params.y
993
+ } : {};
994
+ }
995
+ /**
996
+ * 菜单项去重键
997
+ * @param {XoMenu.Item} item 菜单项
998
+ * @returns {string | undefined}
999
+ */
1000
+ menuItemKey(item) {
1001
+ if (item.id) {
1002
+ return `id:${item.id}`;
1003
+ }
1004
+ if (item.role && item.label) {
1005
+ return `role:${item.role}:${item.label}`;
1006
+ }
1007
+ return item.label ? `label:${item.label}` : void 0;
1008
+ }
1009
+ /**
1010
+ * 创建菜单
1011
+ * @param {XoMenu.Item[]} items 菜单项
1012
+ * @returns {Electron.Menu}
1013
+ */
1014
+ buildMenu(items) {
1015
+ return Menu.buildFromTemplate(items);
1016
+ }
1017
+ //</editor-fold>
1018
+ //<editor-fold desc="菜单项">
1019
+ /**
1020
+ * 默认窗口菜单项
1021
+ * @param {XoMenu.ContextState} state 上下文状态
1022
+ * @returns {XoMenu.Item[]}
1023
+ */
1024
+ defaultMenuItems(state) {
1025
+ const focusedWindow = BrowserWindow2.getFocusedWindow();
1026
+ const isMinimizable = focusedWindow?.isMinimizable();
1027
+ const isFullScreenable = focusedWindow?.isFullScreenable();
1028
+ const isClosable = focusedWindow?.isClosable();
1029
+ return this.autoSeparator(
1030
+ [
1031
+ MenuItems.copy(state.canCopy ?? state.hasSelection ?? false),
1032
+ MenuItems.selectAll(state.canSelectAll ?? true)
1033
+ ],
1034
+ [
1035
+ MenuItems.reload(!app2.isPackaged),
1036
+ MenuItems.forceReload(!app2.isPackaged),
1037
+ ...isMinimizable ? [MenuItems.minimize()] : [],
1038
+ ...isFullScreenable ? [MenuItems.toggleFullscreen()] : [],
1039
+ ...isClosable ? [MenuItems.close()] : []
1040
+ ],
1041
+ [
1042
+ MenuItems.toggleDevTools()
1043
+ ]
1044
+ );
1045
+ }
1046
+ /**
1047
+ * 获取页面基于内容的菜单项
1048
+ * @param {XoMenu.ContextState} state 上下文状态
1049
+ * @returns {XoMenu.Item[]}
1050
+ */
1051
+ contentMenuItems(state) {
1052
+ return this.autoSeparator(
1053
+ this.linkMenuItems(state),
1054
+ this.imageMenuItems(state)
1055
+ );
1056
+ }
1057
+ /**
1058
+ * 获取应用菜单项
1059
+ * @returns {XoMenu.Item[]}
1060
+ */
1061
+ applicationMenuItems() {
1062
+ return [
1063
+ MenuItems.group(
1064
+ "\u7F16\u8F91",
1065
+ [
1066
+ ...this.autoSeparator(
1067
+ [
1068
+ MenuItems.undo(),
1069
+ MenuItems.redo()
1070
+ ],
1071
+ [
1072
+ MenuItems.cut(),
1073
+ MenuItems.copy(),
1074
+ MenuItems.paste(),
1075
+ MenuItems.del()
1076
+ ],
1077
+ [
1078
+ MenuItems.selectAll()
1079
+ ]
1080
+ )
1081
+ ]
1082
+ ),
1083
+ MenuItems.group(
1084
+ "\u7A97\u53E3",
1085
+ [
1086
+ ...this.autoSeparator(
1087
+ [
1088
+ MenuItems.reload(!app2.isPackaged),
1089
+ MenuItems.forceReload(!app2.isPackaged)
1090
+ ],
1091
+ [
1092
+ MenuItems.minimize(),
1093
+ MenuItems.toggleFullscreen(),
1094
+ MenuItems.close()
1095
+ ],
1096
+ [
1097
+ MenuItems.toggleDevTools()
1098
+ ]
1099
+ )
1100
+ ]
1101
+ )
1102
+ ];
1103
+ }
1104
+ /**
1105
+ * 获取托盘菜单项
1106
+ * @returns {XoMenu.Item[]}
1107
+ */
1108
+ trayMenuItems() {
1109
+ return this.autoSeparator(
1110
+ [
1111
+ MenuItems.showMainWindow(this.xoApp)
1112
+ ],
1113
+ [
1114
+ MenuItems.showSettingWindow(this.xoApp),
1115
+ MenuItems.checkForUpdate(this.xoApp)
1116
+ ],
1117
+ [
1118
+ MenuItems.appQuit(this.xoApp)
1119
+ ]
1120
+ );
1121
+ }
1122
+ /**
1123
+ * 获取链接菜单项
1124
+ * @param {XoMenu.ContextState} state 上下文状态
1125
+ * @returns {XoMenu.Item[]}
1126
+ */
1127
+ linkMenuItems(state) {
1128
+ return this.autoSeparator(
1129
+ [
1130
+ MenuItems.openLink(state.linkURL),
1131
+ MenuItems.copyLink(state.linkURL)
1132
+ ]
1133
+ );
1134
+ }
1135
+ /**
1136
+ * 获取图片菜单项
1137
+ * @param {XoMenu.ContextState} state 上下文状态
1138
+ * @returns {XoMenu.Item[]}
1139
+ */
1140
+ imageMenuItems(state) {
1141
+ return this.autoSeparator(
1142
+ [
1143
+ MenuItems.openImage(state),
1144
+ MenuItems.saveImageAs(state),
1145
+ MenuItems.copyImage(state),
1146
+ MenuItems.copyImageLink(state)
1147
+ ]
1148
+ );
1149
+ }
1150
+ /**
1151
+ * 获取编辑菜单项
1152
+ * @param {XoMenu.ContextState} state 上下文状态
1153
+ * @returns {XoMenu.Item[]}
1154
+ */
1155
+ editableMenuItems(state) {
1156
+ return this.autoSeparator(
1157
+ [
1158
+ MenuItems.undo(state.canUndo ?? false),
1159
+ MenuItems.redo(state.canRedo ?? false)
1160
+ ],
1161
+ [
1162
+ MenuItems.cut(state.canCut ?? false),
1163
+ MenuItems.copy(state.canCopy ?? false),
1164
+ MenuItems.paste(state.canPaste ?? state.hasClipboard ?? true),
1165
+ MenuItems.del(state.canDelete ?? false)
1166
+ ],
1167
+ [
1168
+ MenuItems.selectAll(state.canSelectAll ?? true)
1169
+ ]
1170
+ );
1171
+ }
1172
+ /**
1173
+ * 获取选区菜单项
1174
+ * @param {XoMenu.ContextState} state 上下文状态
1175
+ * @returns {XoMenu.Item[]}
1176
+ */
1177
+ selectionMenuItems(state) {
1178
+ return this.autoSeparator(
1179
+ [
1180
+ MenuItems.copy(state.canCopy ?? state.hasSelection ?? false),
1181
+ MenuItems.selectAll(state.canSelectAll ?? true)
1182
+ ]
1183
+ );
1184
+ }
1185
+ /**
1186
+ * 按上下文获取菜单项
1187
+ * @param {XoMenu.Type} type 菜单类型
1188
+ * @param {XoMenu.ContextState} state 上下文状态
1189
+ * @returns {XoMenu.Item[]}
1190
+ */
1191
+ contextMenuItems(type, state) {
1192
+ const contentItems = this.contentMenuItems(state);
1193
+ switch (type) {
1194
+ case "input":
1195
+ case "editable":
1196
+ return this.autoSeparator(
1197
+ contentItems,
1198
+ this.editableMenuItems(state)
1199
+ );
1200
+ case "selection":
1201
+ return this.autoSeparator(
1202
+ contentItems,
1203
+ this.selectionMenuItems(state)
1204
+ );
1205
+ case "link":
1206
+ case "image":
1207
+ return this.autoSeparator(
1208
+ contentItems
1209
+ );
1210
+ case "tray":
1211
+ return this.trayMenuItems();
1212
+ case "all":
1213
+ return this.autoSeparator(
1214
+ contentItems,
1215
+ this.editableMenuItems(state),
1216
+ this.defaultMenuItems(state)
1217
+ );
1218
+ case "app":
1219
+ case "default":
1220
+ default:
1221
+ return this.autoSeparator(
1222
+ contentItems,
1223
+ this.defaultMenuItems(state)
1224
+ );
1225
+ }
1226
+ }
1227
+ /**
1228
+ * 自动添加分割线
1229
+ * @param {XoMenu.Item[][]} groups 菜单分组
1230
+ * @returns {XoMenu.Item[]}
1231
+ */
1232
+ autoSeparator(...groups) {
1233
+ const exists = /* @__PURE__ */ new Set();
1234
+ return groups.map((group) => group.filter((item) => {
1235
+ if (item.visible === false) {
1236
+ return false;
1237
+ }
1238
+ const key = this.menuItemKey(item);
1239
+ if (!key) {
1240
+ return true;
1241
+ }
1242
+ if (exists.has(key)) {
1243
+ return false;
1244
+ }
1245
+ exists.add(key);
1246
+ return true;
1247
+ })).filter((group) => group.length > 0).flatMap((group, index) => {
1248
+ return index <= 0 ? group : [MenuItems.separator(), ...group];
1249
+ });
1250
+ }
1251
+ //</editor-fold>
1252
+ };
1253
+
1254
+ // src/main/menu/menu-manager.ts
1255
+ var MenuManager = class extends MenuManagerAbstract {
1256
+ /**
1257
+ * 业务命令
1258
+ * @returns {XoMenu.CommandHandlerMap}
1259
+ */
1260
+ commands() {
1261
+ return {};
1262
+ }
1263
+ };
1264
+
1265
+ export {
1266
+ MenuItems,
1267
+ MenuManagerAbstract,
1268
+ MenuManager
1269
+ };