comfyui-frontend-package 1.10.15__py3-none-any.whl → 1.10.17__py3-none-any.whl

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 (225) hide show
  1. comfyui_frontend_package/static/assets/BaseViewTemplate-Cfc_maDe.js +51 -0
  2. comfyui_frontend_package/static/assets/BaseViewTemplate-Cfc_maDe.js.map +1 -0
  3. comfyui_frontend_package/static/assets/CREDIT.txt +1 -0
  4. comfyui_frontend_package/static/assets/DesktopStartView-DVyok7BW.js +19 -0
  5. comfyui_frontend_package/static/assets/DesktopStartView-DVyok7BW.js.map +1 -0
  6. comfyui_frontend_package/static/assets/DesktopUpdateView-C0tkEEm8.js +59 -0
  7. comfyui_frontend_package/static/assets/DesktopUpdateView-C0tkEEm8.js.map +1 -0
  8. comfyui_frontend_package/static/assets/DesktopUpdateView-CoZUcBzh.css +20 -0
  9. comfyui_frontend_package/static/assets/DownloadGitView-GmLJG7y3.js +58 -0
  10. comfyui_frontend_package/static/assets/DownloadGitView-GmLJG7y3.js.map +1 -0
  11. comfyui_frontend_package/static/assets/ExtensionPanel-BxSiczZ7.js +182 -0
  12. comfyui_frontend_package/static/assets/ExtensionPanel-BxSiczZ7.js.map +1 -0
  13. comfyui_frontend_package/static/assets/GraphView-Bcjny_2g.js +5306 -0
  14. comfyui_frontend_package/static/assets/GraphView-Bcjny_2g.js.map +1 -0
  15. comfyui_frontend_package/static/assets/GraphView-DlmVRoyu.css +404 -0
  16. comfyui_frontend_package/static/assets/InstallView-B5n3tAa3.css +81 -0
  17. comfyui_frontend_package/static/assets/InstallView-BdiI5ip6.js +971 -0
  18. comfyui_frontend_package/static/assets/InstallView-BdiI5ip6.js.map +1 -0
  19. comfyui_frontend_package/static/assets/KeybindingPanel-CwPLIgAf.css +8 -0
  20. comfyui_frontend_package/static/assets/KeybindingPanel-hJVF8FAR.js +292 -0
  21. comfyui_frontend_package/static/assets/KeybindingPanel-hJVF8FAR.js.map +1 -0
  22. comfyui_frontend_package/static/assets/MaintenanceView-Cu_e206A.css +87 -0
  23. comfyui_frontend_package/static/assets/MaintenanceView-DO4HPw8x.js +770 -0
  24. comfyui_frontend_package/static/assets/MaintenanceView-DO4HPw8x.js.map +1 -0
  25. comfyui_frontend_package/static/assets/ManualConfigurationView-Cq3hPfap.css +7 -0
  26. comfyui_frontend_package/static/assets/ManualConfigurationView-CvJpDJS_.js +74 -0
  27. comfyui_frontend_package/static/assets/ManualConfigurationView-CvJpDJS_.js.map +1 -0
  28. comfyui_frontend_package/static/assets/MetricsConsentView-CI-g-8Yo.js +86 -0
  29. comfyui_frontend_package/static/assets/MetricsConsentView-CI-g-8Yo.js.map +1 -0
  30. comfyui_frontend_package/static/assets/NotSupportedView-BiyVuLfX.css +19 -0
  31. comfyui_frontend_package/static/assets/NotSupportedView-Cf74_5Wu.js +86 -0
  32. comfyui_frontend_package/static/assets/NotSupportedView-Cf74_5Wu.js.map +1 -0
  33. comfyui_frontend_package/static/assets/ServerConfigPanel-DAMVD2aC.js +156 -0
  34. comfyui_frontend_package/static/assets/ServerConfigPanel-DAMVD2aC.js.map +1 -0
  35. comfyui_frontend_package/static/assets/ServerStartView-BLlSvhJ0.css +5 -0
  36. comfyui_frontend_package/static/assets/ServerStartView-DH5tYErF.js +100 -0
  37. comfyui_frontend_package/static/assets/ServerStartView-DH5tYErF.js.map +1 -0
  38. comfyui_frontend_package/static/assets/TerminalOutputDrawer-7rFWHPs_.js +676 -0
  39. comfyui_frontend_package/static/assets/TerminalOutputDrawer-7rFWHPs_.js.map +1 -0
  40. comfyui_frontend_package/static/assets/UserSelectView-UkgtJ2nt.js +101 -0
  41. comfyui_frontend_package/static/assets/UserSelectView-UkgtJ2nt.js.map +1 -0
  42. comfyui_frontend_package/static/assets/WelcomeView-Cy40CZLr.js +39 -0
  43. comfyui_frontend_package/static/assets/WelcomeView-Cy40CZLr.js.map +1 -0
  44. comfyui_frontend_package/static/assets/WelcomeView-aCH40CSK.css +36 -0
  45. comfyui_frontend_package/static/assets/images/Git-Logo-White.svg +1 -0
  46. comfyui_frontend_package/static/assets/images/apple-mps-logo.png +0 -0
  47. comfyui_frontend_package/static/assets/images/manual-configuration.svg +5 -0
  48. comfyui_frontend_package/static/assets/images/nvidia-logo.svg +6 -0
  49. comfyui_frontend_package/static/assets/images/sad_girl.png +0 -0
  50. comfyui_frontend_package/static/assets/index-BUod660P.css +4972 -0
  51. comfyui_frontend_package/static/assets/index-Bau4Kssl.js +392 -0
  52. comfyui_frontend_package/static/assets/index-Bau4Kssl.js.map +1 -0
  53. comfyui_frontend_package/static/assets/index-C1Lqjdil.js +539 -0
  54. comfyui_frontend_package/static/assets/index-C1Lqjdil.js.map +1 -0
  55. comfyui_frontend_package/static/assets/index-C9mZcmb9.js +224952 -0
  56. comfyui_frontend_package/static/assets/index-C9mZcmb9.js.map +1 -0
  57. comfyui_frontend_package/static/assets/index-CC55z89j.css +149 -0
  58. comfyui_frontend_package/static/assets/index-CDQonahO.js +27 -0
  59. comfyui_frontend_package/static/assets/index-CDQonahO.js.map +1 -0
  60. comfyui_frontend_package/static/assets/index-DR8gUcA3.js +54899 -0
  61. comfyui_frontend_package/static/assets/index-DR8gUcA3.js.map +1 -0
  62. comfyui_frontend_package/static/assets/index-DgMP9-YA.js +24875 -0
  63. comfyui_frontend_package/static/assets/index-DgMP9-YA.js.map +1 -0
  64. comfyui_frontend_package/static/assets/index-DuUExRqW.js +618 -0
  65. comfyui_frontend_package/static/assets/index-DuUExRqW.js.map +1 -0
  66. comfyui_frontend_package/static/assets/index-MqedrmEn.js +8790 -0
  67. comfyui_frontend_package/static/assets/index-MqedrmEn.js.map +1 -0
  68. comfyui_frontend_package/static/assets/index-XFtdqRHS.js +4993 -0
  69. comfyui_frontend_package/static/assets/index-XFtdqRHS.js.map +1 -0
  70. comfyui_frontend_package/static/assets/keybindingService-BHWf0bpL.js +250 -0
  71. comfyui_frontend_package/static/assets/keybindingService-BHWf0bpL.js.map +1 -0
  72. comfyui_frontend_package/static/assets/primeicons-C6QP2o4f.woff2 +0 -0
  73. comfyui_frontend_package/static/assets/primeicons-DMOk5skT.eot +0 -0
  74. comfyui_frontend_package/static/assets/primeicons-Dr5RGzOO.svg +345 -0
  75. comfyui_frontend_package/static/assets/primeicons-MpK4pl85.ttf +0 -0
  76. comfyui_frontend_package/static/assets/primeicons-WjwUDZjB.woff +0 -0
  77. comfyui_frontend_package/static/assets/serverConfigStore-SH1U-rDu.js +90 -0
  78. comfyui_frontend_package/static/assets/serverConfigStore-SH1U-rDu.js.map +1 -0
  79. comfyui_frontend_package/static/assets/sorted-custom-node-map.json +2602 -0
  80. comfyui_frontend_package/static/assets/uvMirrors-B-HKMf6X.js +16 -0
  81. comfyui_frontend_package/static/assets/uvMirrors-B-HKMf6X.js.map +1 -0
  82. comfyui_frontend_package/static/cursor/colorSelect.png +0 -0
  83. comfyui_frontend_package/static/cursor/paintBucket.png +0 -0
  84. comfyui_frontend_package/static/extensions/core/clipspace.js +2 -0
  85. comfyui_frontend_package/static/extensions/core/groupNode.js +3 -0
  86. comfyui_frontend_package/static/extensions/core/groupNodeManage.js +2 -0
  87. comfyui_frontend_package/static/extensions/core/maskEditorOld.js +2 -0
  88. comfyui_frontend_package/static/extensions/core/widgetInputs.js +5 -0
  89. comfyui_frontend_package/static/fonts/materialdesignicons-webfont.woff2 +0 -0
  90. comfyui_frontend_package/static/index.html +15 -0
  91. comfyui_frontend_package/static/materialdesignicons.min.css +3 -0
  92. comfyui_frontend_package/static/scripts/api.js +3 -0
  93. comfyui_frontend_package/static/scripts/app.js +4 -0
  94. comfyui_frontend_package/static/scripts/changeTracker.js +2 -0
  95. comfyui_frontend_package/static/scripts/defaultGraph.js +4 -0
  96. comfyui_frontend_package/static/scripts/domWidget.js +2 -0
  97. comfyui_frontend_package/static/scripts/metadata/flac.js +3 -0
  98. comfyui_frontend_package/static/scripts/metadata/png.js +3 -0
  99. comfyui_frontend_package/static/scripts/pnginfo.js +6 -0
  100. comfyui_frontend_package/static/scripts/ui/components/asyncDialog.js +2 -0
  101. comfyui_frontend_package/static/scripts/ui/components/button.js +2 -0
  102. comfyui_frontend_package/static/scripts/ui/components/buttonGroup.js +2 -0
  103. comfyui_frontend_package/static/scripts/ui/components/popup.js +2 -0
  104. comfyui_frontend_package/static/scripts/ui/components/splitButton.js +2 -0
  105. comfyui_frontend_package/static/scripts/ui/dialog.js +2 -0
  106. comfyui_frontend_package/static/scripts/ui/draggableList.js +2 -0
  107. comfyui_frontend_package/static/scripts/ui/imagePreview.js +3 -0
  108. comfyui_frontend_package/static/scripts/ui/menu/index.js +2 -0
  109. comfyui_frontend_package/static/scripts/ui/settings.js +2 -0
  110. comfyui_frontend_package/static/scripts/ui/toggleSwitch.js +2 -0
  111. comfyui_frontend_package/static/scripts/ui/utils.js +3 -0
  112. comfyui_frontend_package/static/scripts/ui.js +4 -0
  113. comfyui_frontend_package/static/scripts/utils.js +9 -0
  114. comfyui_frontend_package/static/scripts/widgets.js +6 -0
  115. comfyui_frontend_package/static/templates/2_pass_pose_worship-1.webp +0 -0
  116. comfyui_frontend_package/static/templates/2_pass_pose_worship-2.webp +0 -0
  117. comfyui_frontend_package/static/templates/2_pass_pose_worship.json +673 -0
  118. comfyui_frontend_package/static/templates/area_composition-1.webp +0 -0
  119. comfyui_frontend_package/static/templates/area_composition.json +966 -0
  120. comfyui_frontend_package/static/templates/area_composition_reversed-1.webp +0 -0
  121. comfyui_frontend_package/static/templates/area_composition_reversed.json +967 -0
  122. comfyui_frontend_package/static/templates/area_composition_square_area_for_subject-1.webp +0 -0
  123. comfyui_frontend_package/static/templates/area_composition_square_area_for_subject.json +620 -0
  124. comfyui_frontend_package/static/templates/controlnet_example-1.webp +0 -0
  125. comfyui_frontend_package/static/templates/controlnet_example-2.webp +0 -0
  126. comfyui_frontend_package/static/templates/controlnet_example.json +385 -0
  127. comfyui_frontend_package/static/templates/default-1.webp +0 -0
  128. comfyui_frontend_package/static/templates/default.json +356 -0
  129. comfyui_frontend_package/static/templates/depth_controlnet-1.webp +0 -0
  130. comfyui_frontend_package/static/templates/depth_controlnet-2.webp +0 -0
  131. comfyui_frontend_package/static/templates/depth_controlnet.json +378 -0
  132. comfyui_frontend_package/static/templates/depth_t2i_adapter-1.webp +0 -0
  133. comfyui_frontend_package/static/templates/depth_t2i_adapter-2.webp +0 -0
  134. comfyui_frontend_package/static/templates/depth_t2i_adapter.json +371 -0
  135. comfyui_frontend_package/static/templates/embedding_example-1.webp +0 -0
  136. comfyui_frontend_package/static/templates/embedding_example.json +267 -0
  137. comfyui_frontend_package/static/templates/esrgan_example-1.webp +0 -0
  138. comfyui_frontend_package/static/templates/esrgan_example.json +329 -0
  139. comfyui_frontend_package/static/templates/flux_canny_model_example-1.webp +0 -0
  140. comfyui_frontend_package/static/templates/flux_canny_model_example-2.webp +0 -0
  141. comfyui_frontend_package/static/templates/flux_canny_model_example.json +474 -0
  142. comfyui_frontend_package/static/templates/flux_depth_lora_example-1.webp +0 -0
  143. comfyui_frontend_package/static/templates/flux_depth_lora_example-2.webp +0 -0
  144. comfyui_frontend_package/static/templates/flux_depth_lora_example.json +454 -0
  145. comfyui_frontend_package/static/templates/flux_dev_checkpoint_example-1.webp +0 -0
  146. comfyui_frontend_package/static/templates/flux_dev_checkpoint_example.json +332 -0
  147. comfyui_frontend_package/static/templates/flux_dev_example.json +771 -0
  148. comfyui_frontend_package/static/templates/flux_fill_inpaint_example-1.webp +0 -0
  149. comfyui_frontend_package/static/templates/flux_fill_inpaint_example-2.webp +0 -0
  150. comfyui_frontend_package/static/templates/flux_fill_inpaint_example.json +458 -0
  151. comfyui_frontend_package/static/templates/flux_fill_outpaint_example-1.webp +0 -0
  152. comfyui_frontend_package/static/templates/flux_fill_outpaint_example-2.webp +0 -0
  153. comfyui_frontend_package/static/templates/flux_fill_outpaint_example.json +491 -0
  154. comfyui_frontend_package/static/templates/flux_redux_model_example-1.webp +0 -0
  155. comfyui_frontend_package/static/templates/flux_redux_model_example.json +951 -0
  156. comfyui_frontend_package/static/templates/flux_schnell-1.webp +0 -0
  157. comfyui_frontend_package/static/templates/flux_schnell.json +302 -0
  158. comfyui_frontend_package/static/templates/gligen_textbox_example-1.webp +0 -0
  159. comfyui_frontend_package/static/templates/gligen_textbox_example.json +376 -0
  160. comfyui_frontend_package/static/templates/hiresfix_esrgan_workflow-1.webp +0 -0
  161. comfyui_frontend_package/static/templates/hiresfix_esrgan_workflow.json +607 -0
  162. comfyui_frontend_package/static/templates/hiresfix_latent_workflow-1.webp +0 -0
  163. comfyui_frontend_package/static/templates/hiresfix_latent_workflow.json +442 -0
  164. comfyui_frontend_package/static/templates/hunyuan_video_text_to_video-1.webp +0 -0
  165. comfyui_frontend_package/static/templates/hunyuan_video_text_to_video.json +553 -0
  166. comfyui_frontend_package/static/templates/image2image-1.webp +0 -0
  167. comfyui_frontend_package/static/templates/image2image.json +447 -0
  168. comfyui_frontend_package/static/templates/image_to_video-1.webp +0 -0
  169. comfyui_frontend_package/static/templates/image_to_video.json +314 -0
  170. comfyui_frontend_package/static/templates/inpain_model_outpainting-1.webp +0 -0
  171. comfyui_frontend_package/static/templates/inpain_model_outpainting-2.webp +0 -0
  172. comfyui_frontend_package/static/templates/inpain_model_outpainting.json +360 -0
  173. comfyui_frontend_package/static/templates/inpaint_example-1.webp +0 -0
  174. comfyui_frontend_package/static/templates/inpaint_example-2.webp +0 -0
  175. comfyui_frontend_package/static/templates/inpaint_example.json +323 -0
  176. comfyui_frontend_package/static/templates/latent_upscale_different_prompt_model-1.webp +0 -0
  177. comfyui_frontend_package/static/templates/latent_upscale_different_prompt_model.json +528 -0
  178. comfyui_frontend_package/static/templates/lora-1.webp +0 -0
  179. comfyui_frontend_package/static/templates/lora.json +311 -0
  180. comfyui_frontend_package/static/templates/lora_multiple-1.webp +0 -0
  181. comfyui_frontend_package/static/templates/lora_multiple.json +357 -0
  182. comfyui_frontend_package/static/templates/ltxv_image_to_video-1.webp +0 -0
  183. comfyui_frontend_package/static/templates/ltxv_image_to_video.json +482 -0
  184. comfyui_frontend_package/static/templates/ltxv_text_to_video-1.webp +0 -0
  185. comfyui_frontend_package/static/templates/ltxv_text_to_video.json +419 -0
  186. comfyui_frontend_package/static/templates/mixing_controlnets-1.webp +0 -0
  187. comfyui_frontend_package/static/templates/mixing_controlnets-2.webp +0 -0
  188. comfyui_frontend_package/static/templates/mixing_controlnets.json +492 -0
  189. comfyui_frontend_package/static/templates/mochi_text_to_video_example-1.webp +0 -0
  190. comfyui_frontend_package/static/templates/mochi_text_to_video_example.json +308 -0
  191. comfyui_frontend_package/static/templates/sd3.5_large_blur-1.webp +0 -0
  192. comfyui_frontend_package/static/templates/sd3.5_large_blur-2.webp +0 -0
  193. comfyui_frontend_package/static/templates/sd3.5_large_blur.json +582 -0
  194. comfyui_frontend_package/static/templates/sd3.5_large_canny_controlnet_example-1.webp +0 -0
  195. comfyui_frontend_package/static/templates/sd3.5_large_canny_controlnet_example-2.webp +0 -0
  196. comfyui_frontend_package/static/templates/sd3.5_large_canny_controlnet_example.json +470 -0
  197. comfyui_frontend_package/static/templates/sd3.5_large_depth-1.webp +0 -0
  198. comfyui_frontend_package/static/templates/sd3.5_large_depth-2.webp +0 -0
  199. comfyui_frontend_package/static/templates/sd3.5_large_depth.json +713 -0
  200. comfyui_frontend_package/static/templates/sd3.5_simple_example-1.webp +0 -0
  201. comfyui_frontend_package/static/templates/sd3.5_simple_example.json +278 -0
  202. comfyui_frontend_package/static/templates/sdxl_refiner_prompt_example-1.webp +0 -0
  203. comfyui_frontend_package/static/templates/sdxl_refiner_prompt_example.json +728 -0
  204. comfyui_frontend_package/static/templates/sdxl_revision_text_prompts-1.webp +0 -0
  205. comfyui_frontend_package/static/templates/sdxl_revision_text_prompts.json +490 -0
  206. comfyui_frontend_package/static/templates/sdxl_revision_zero_positive-1.webp +0 -0
  207. comfyui_frontend_package/static/templates/sdxl_revision_zero_positive.json +494 -0
  208. comfyui_frontend_package/static/templates/sdxl_simple_example-1.webp +0 -0
  209. comfyui_frontend_package/static/templates/sdxl_simple_example.json +896 -0
  210. comfyui_frontend_package/static/templates/sdxlturbo_example-1.webp +0 -0
  211. comfyui_frontend_package/static/templates/sdxlturbo_example.json +372 -0
  212. comfyui_frontend_package/static/templates/stable_audio_example-1.flac +0 -0
  213. comfyui_frontend_package/static/templates/stable_audio_example.json +302 -0
  214. comfyui_frontend_package/static/templates/stable_zero123_example-1.webp +0 -0
  215. comfyui_frontend_package/static/templates/stable_zero123_example.json +273 -0
  216. comfyui_frontend_package/static/templates/txt_to_image_to_video-1.webp +0 -0
  217. comfyui_frontend_package/static/templates/txt_to_image_to_video.json +535 -0
  218. comfyui_frontend_package/static/user.css +1 -0
  219. {comfyui_frontend_package-1.10.15.dist-info → comfyui_frontend_package-1.10.17.dist-info}/METADATA +1 -1
  220. comfyui_frontend_package-1.10.17.dist-info/RECORD +223 -0
  221. comfyui_frontend_package-1.10.17.dist-info/top_level.txt +1 -0
  222. comfyui_frontend_package-1.10.15.dist-info/RECORD +0 -5
  223. comfyui_frontend_package-1.10.15.dist-info/top_level.txt +0 -1
  224. {comfyui_frontend → comfyui_frontend_package}/__init__.py +0 -0
  225. {comfyui_frontend_package-1.10.15.dist-info → comfyui_frontend_package-1.10.17.dist-info}/WHEEL +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstallView-BdiI5ip6.js","sources":["../../src/components/install/DesktopSettingsConfiguration.vue","../../../../../../../assets/images/nvidia-logo.svg","../../../../../../../assets/images/apple-mps-logo.png","../../../../../../../assets/images/manual-configuration.svg","../../src/components/install/GpuPicker.vue","../../src/components/install/InstallLocationPicker.vue","../../src/components/install/MigrationPicker.vue","../../src/components/install/mirror/MirrorItem.vue","../../src/components/install/MirrorsConfiguration.vue","../../src/views/InstallView.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col gap-6 w-[600px]\">\n <div class=\"flex flex-col gap-4\">\n <h2 class=\"text-2xl font-semibold text-neutral-100\">\n {{ $t('install.desktopAppSettings') }}\n </h2>\n\n <p class=\"text-neutral-400 my-0\">\n {{ $t('install.desktopAppSettingsDescription') }}\n </p>\n </div>\n\n <div class=\"flex flex-col bg-neutral-800 p-4 rounded-lg\">\n <!-- Auto Update Setting -->\n <div class=\"flex items-center gap-4\">\n <div class=\"flex-1\">\n <h3 class=\"text-lg font-medium text-neutral-100\">\n {{ $t('install.settings.autoUpdate') }}\n </h3>\n <p class=\"text-sm text-neutral-400 mt-1\">\n {{ $t('install.settings.autoUpdateDescription') }}\n </p>\n </div>\n <ToggleSwitch v-model=\"autoUpdate\" />\n </div>\n\n <Divider />\n\n <!-- Metrics Collection Setting -->\n <div class=\"flex items-center gap-4\">\n <div class=\"flex-1\">\n <h3 class=\"text-lg font-medium text-neutral-100\">\n {{ $t('install.settings.allowMetrics') }}\n </h3>\n <p class=\"text-sm text-neutral-400 mt-1\">\n {{ $t('install.settings.allowMetricsDescription') }}\n </p>\n <a\n href=\"#\"\n class=\"text-sm text-blue-400 hover:text-blue-300 mt-1 inline-block\"\n @click.prevent=\"showMetricsInfo\"\n >\n {{ $t('install.settings.learnMoreAboutData') }}\n </a>\n </div>\n <ToggleSwitch v-model=\"allowMetrics\" />\n </div>\n </div>\n\n <!-- Info Dialog -->\n <Dialog\n v-model:visible=\"showDialog\"\n modal\n :header=\"$t('install.settings.dataCollectionDialog.title')\"\n >\n <div class=\"text-neutral-300\">\n <h4 class=\"font-medium mb-2\">\n {{ $t('install.settings.dataCollectionDialog.whatWeCollect') }}\n </h4>\n <ul class=\"list-disc pl-6 space-y-1\">\n <li>\n {{\n $t('install.settings.dataCollectionDialog.collect.errorReports')\n }}\n </li>\n <li>\n {{ $t('install.settings.dataCollectionDialog.collect.systemInfo') }}\n </li>\n <li>\n {{\n $t(\n 'install.settings.dataCollectionDialog.collect.userJourneyEvents'\n )\n }}\n </li>\n </ul>\n\n <h4 class=\"font-medium mt-4 mb-2\">\n {{ $t('install.settings.dataCollectionDialog.whatWeDoNotCollect') }}\n </h4>\n <ul class=\"list-disc pl-6 space-y-1\">\n <li>\n {{\n $t(\n 'install.settings.dataCollectionDialog.doNotCollect.personalInformation'\n )\n }}\n </li>\n <li>\n {{\n $t(\n 'install.settings.dataCollectionDialog.doNotCollect.workflowContents'\n )\n }}\n </li>\n <li>\n {{\n $t(\n 'install.settings.dataCollectionDialog.doNotCollect.fileSystemInformation'\n )\n }}\n </li>\n <li>\n {{\n $t(\n 'install.settings.dataCollectionDialog.doNotCollect.customNodeConfigurations'\n )\n }}\n </li>\n </ul>\n\n <div class=\"mt-4\">\n <a\n href=\"https://comfy.org/privacy\"\n target=\"_blank\"\n class=\"text-blue-400 hover:text-blue-300 underline\"\n >\n {{ $t('install.settings.dataCollectionDialog.viewFullPolicy') }}\n </a>\n </div>\n </div>\n </Dialog>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Dialog from 'primevue/dialog'\nimport Divider from 'primevue/divider'\nimport ToggleSwitch from 'primevue/toggleswitch'\nimport { ref } from 'vue'\n\nconst showDialog = ref(false)\nconst autoUpdate = defineModel<boolean>('autoUpdate', { required: true })\nconst allowMetrics = defineModel<boolean>('allowMetrics', { required: true })\n\nconst showMetricsInfo = () => {\n showDialog.value = true\n}\n</script>\n","export default \"__VITE_PUBLIC_ASSET__fe43f3f5__\"","export default \"__VITE_PUBLIC_ASSET__2bae65e3__\"","export default \"__VITE_PUBLIC_ASSET__57befc1b__\"","<template>\n <div class=\"flex flex-col gap-6 w-[600px] h-[30rem] select-none\">\n <!-- Installation Path Section -->\n <div class=\"grow flex flex-col gap-4 text-neutral-300\">\n <h2 class=\"text-2xl font-semibold text-neutral-100\">\n {{ $t('install.gpuSelection.selectGpu') }}\n </h2>\n\n <p class=\"m-1 text-neutral-400\">\n {{ $t('install.gpuSelection.selectGpuDescription') }}:\n </p>\n\n <!-- GPU Selection buttons -->\n <div\n class=\"flex gap-2 text-center transition-opacity\"\n :class=\"{ selected: selected }\"\n >\n <!-- NVIDIA -->\n <div\n v-if=\"platform !== 'darwin'\"\n class=\"gpu-button\"\n :class=\"{ selected: selected === 'nvidia' }\"\n role=\"button\"\n @click=\"pickGpu('nvidia')\"\n >\n <img\n class=\"m-12\"\n alt=\"NVIDIA logo\"\n width=\"196\"\n height=\"32\"\n src=\"/assets/images/nvidia-logo.svg\"\n />\n </div>\n <!-- MPS -->\n <div\n v-if=\"platform === 'darwin'\"\n class=\"gpu-button\"\n :class=\"{ selected: selected === 'mps' }\"\n role=\"button\"\n @click=\"pickGpu('mps')\"\n >\n <img\n class=\"rounded-lg hover-brighten\"\n alt=\"Apple Metal Performance Shaders Logo\"\n width=\"292\"\n ratio\n src=\"/assets/images/apple-mps-logo.png\"\n />\n </div>\n <!-- Manual configuration -->\n <div\n class=\"gpu-button\"\n :class=\"{ selected: selected === 'unsupported' }\"\n role=\"button\"\n @click=\"pickGpu('unsupported')\"\n >\n <img\n class=\"m-12\"\n alt=\"Manual configuration\"\n width=\"196\"\n src=\"/assets/images/manual-configuration.svg\"\n />\n </div>\n </div>\n\n <!-- Details on selected GPU -->\n <p v-if=\"selected === 'nvidia'\" class=\"m-1\">\n <Tag icon=\"pi pi-check\" severity=\"success\" :value=\"'CUDA'\" />\n {{ $t('install.gpuSelection.nvidiaDescription') }}\n </p>\n\n <p v-if=\"selected === 'mps'\" class=\"m-1\">\n <Tag icon=\"pi pi-check\" severity=\"success\" :value=\"'MPS'\" />\n {{ $t('install.gpuSelection.mpsDescription') }}\n </p>\n\n <div v-if=\"selected === 'unsupported'\" class=\"text-neutral-300\">\n <p class=\"m-1\">\n <Tag\n icon=\"pi pi-exclamation-triangle\"\n severity=\"warn\"\n :value=\"t('icon.exclamation-triangle')\"\n />\n {{ $t('install.gpuSelection.customSkipsPython') }}\n </p>\n\n <ul>\n <li>\n <strong>\n {{ $t('install.gpuSelection.customComfyNeedsPython') }}\n </strong>\n </li>\n <li>{{ $t('install.gpuSelection.customManualVenv') }}</li>\n <li>{{ $t('install.gpuSelection.customInstallRequirements') }}</li>\n <li>{{ $t('install.gpuSelection.customMayNotWork') }}</li>\n </ul>\n </div>\n\n <div v-if=\"selected === 'cpu'\">\n <p class=\"m-1\">\n <Tag\n icon=\"pi pi-exclamation-triangle\"\n severity=\"warn\"\n :value=\"t('icon.exclamation-triangle')\"\n ></Tag>\n {{ $t('install.gpuSelection.cpuModeDescription') }}\n </p>\n <p class=\"m-1\">\n {{ $t('install.gpuSelection.cpuModeDescription2') }}\n </p>\n </div>\n </div>\n\n <div\n class=\"transition-opacity flex gap-3 h-0\"\n :class=\"{\n 'opacity-40': selected && selected !== 'cpu'\n }\"\n >\n <ToggleSwitch\n v-model=\"cpuMode\"\n inputId=\"cpu-mode\"\n class=\"-translate-y-40\"\n />\n <label for=\"cpu-mode\" class=\"select-none\">\n {{ $t('install.gpuSelection.enableCpuMode') }}\n </label>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { TorchDeviceType } from '@comfyorg/comfyui-electron-types'\nimport Tag from 'primevue/tag'\nimport ToggleSwitch from 'primevue/toggleswitch'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport { electronAPI } from '@/utils/envUtil'\n\nconst { t } = useI18n()\n\nconst cpuMode = computed({\n get: () => selected.value === 'cpu',\n set: (value) => {\n selected.value = value ? 'cpu' : null\n }\n})\nconst selected = defineModel<TorchDeviceType>('device', {\n required: true\n})\n\nconst electron = electronAPI()\nconst platform = electron.getPlatform()\n\nconst pickGpu = (value: typeof selected.value) => {\n const newValue = selected.value === value ? null : value\n selected.value = newValue\n}\n</script>\n\n<style scoped>\n.p-tag {\n --p-tag-gap: 0.5rem;\n}\n\n.hover-brighten {\n @apply transition-colors;\n transition-property: filter, box-shadow;\n\n &:hover {\n filter: brightness(107%) contrast(105%);\n box-shadow: 0 0 0.25rem #ffffff79;\n }\n}\n.p-accordioncontent-content {\n @apply bg-neutral-900 rounded-lg transition-colors;\n}\n\ndiv.selected {\n .gpu-button:not(.selected) {\n @apply opacity-50 hover:opacity-100;\n }\n}\n\n.gpu-button {\n @apply w-1/2 m-0 cursor-pointer rounded-lg flex flex-col items-center justify-around bg-neutral-800 bg-opacity-50 hover:bg-opacity-75 transition-colors;\n\n &.selected {\n @apply opacity-100 bg-neutral-700 bg-opacity-50 hover:bg-opacity-60;\n }\n}\n\n.disabled {\n @apply pointer-events-none opacity-40;\n}\n\n.p-card-header {\n @apply text-center grow;\n}\n\n.p-card-body {\n @apply text-center pt-0;\n}\n</style>\n","<template>\n <div class=\"flex flex-col gap-6 w-[600px]\">\n <!-- Installation Path Section -->\n <div class=\"flex flex-col gap-4\">\n <h2 class=\"text-2xl font-semibold text-neutral-100\">\n {{ $t('install.chooseInstallationLocation') }}\n </h2>\n\n <p class=\"text-neutral-400 my-0\">\n {{ $t('install.installLocationDescription') }}\n </p>\n\n <div class=\"flex gap-2\">\n <IconField class=\"flex-1\">\n <InputText\n v-model=\"installPath\"\n class=\"w-full\"\n :class=\"{ 'p-invalid': pathError }\"\n @update:modelValue=\"validatePath\"\n @focus=\"onFocus\"\n />\n <InputIcon\n class=\"pi pi-info-circle\"\n v-tooltip.top=\"$t('install.installLocationTooltip')\"\n />\n </IconField>\n <Button icon=\"pi pi-folder\" @click=\"browsePath\" class=\"w-12\" />\n </div>\n\n <Message v-if=\"pathError\" severity=\"error\" class=\"whitespace-pre-line\">\n {{ pathError }}\n </Message>\n <Message v-if=\"pathExists\" severity=\"warn\">\n {{ $t('install.pathExists') }}\n </Message>\n </div>\n\n <!-- System Paths Info -->\n <div class=\"bg-neutral-800 p-4 rounded-lg\">\n <h3 class=\"text-lg font-medium mt-0 mb-3 text-neutral-100\">\n {{ $t('install.systemLocations') }}\n </h3>\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex items-center gap-2\">\n <i class=\"pi pi-folder text-neutral-400\" />\n <span class=\"text-neutral-400\">App Data:</span>\n <span class=\"text-neutral-200\">{{ appData }}</span>\n <span\n class=\"pi pi-info-circle\"\n v-tooltip=\"$t('install.appDataLocationTooltip')\"\n ></span>\n </div>\n <div class=\"flex items-center gap-2\">\n <i class=\"pi pi-desktop text-neutral-400\" />\n <span class=\"text-neutral-400\">App Path:</span>\n <span class=\"text-neutral-200\">{{ appPath }}</span>\n <span\n class=\"pi pi-info-circle\"\n v-tooltip=\"$t('install.appPathLocationTooltip')\"\n ></span>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Button from 'primevue/button'\nimport IconField from 'primevue/iconfield'\nimport InputIcon from 'primevue/inputicon'\nimport InputText from 'primevue/inputtext'\nimport Message from 'primevue/message'\nimport { onMounted, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport { electronAPI } from '@/utils/envUtil'\n\nconst { t } = useI18n()\n\nconst installPath = defineModel<string>('installPath', { required: true })\nconst pathError = defineModel<string>('pathError', { required: true })\nconst pathExists = ref(false)\nconst appData = ref('')\nconst appPath = ref('')\nconst inputTouched = ref(false)\n\nconst electron = electronAPI()\n\n// Get system paths on component mount\nonMounted(async () => {\n const paths = await electron.getSystemPaths()\n appData.value = paths.appData\n appPath.value = paths.appPath\n installPath.value = paths.defaultInstallPath\n\n await validatePath(paths.defaultInstallPath)\n})\n\nconst validatePath = async (path: string) => {\n try {\n pathError.value = ''\n pathExists.value = false\n const validation = await electron.validateInstallPath(path)\n\n // Create a pre-formatted list of errors\n if (!validation.isValid) {\n const errors: string[] = []\n if (validation.cannotWrite) errors.push(t('install.cannotWrite'))\n if (validation.freeSpace < validation.requiredSpace) {\n const requiredGB = validation.requiredSpace / 1024 / 1024 / 1024\n errors.push(`${t('install.insufficientFreeSpace')}: ${requiredGB} GB`)\n }\n if (validation.parentMissing) errors.push(t('install.parentMissing'))\n if (validation.error)\n errors.push(`${t('install.unhandledError')}: ${validation.error}`)\n pathError.value = errors.join('\\n')\n }\n\n // Display the path exists warning\n if (validation.exists) pathExists.value = true\n } catch (error) {\n pathError.value = t('install.pathValidationFailed')\n }\n}\n\nconst browsePath = async () => {\n try {\n const result = await electron.showDirectoryPicker()\n if (result) {\n installPath.value = result\n await validatePath(result)\n }\n } catch (error) {\n pathError.value = t('install.failedToSelectDirectory')\n }\n}\n\nconst onFocus = () => {\n if (!inputTouched.value) {\n inputTouched.value = true\n return\n }\n // Refresh validation on re-focus\n validatePath(installPath.value)\n}\n</script>\n","<template>\n <div class=\"flex flex-col gap-6 w-[600px]\">\n <!-- Source Location Section -->\n <div class=\"flex flex-col gap-4\">\n <h2 class=\"text-2xl font-semibold text-neutral-100\">\n {{ $t('install.migrateFromExistingInstallation') }}\n </h2>\n\n <p class=\"text-neutral-400 my-0\">\n {{ $t('install.migrationSourcePathDescription') }}\n </p>\n\n <div class=\"flex gap-2\">\n <InputText\n v-model=\"sourcePath\"\n placeholder=\"Select existing ComfyUI installation (optional)\"\n class=\"flex-1\"\n :class=\"{ 'p-invalid': pathError }\"\n @update:modelValue=\"validateSource\"\n />\n <Button icon=\"pi pi-folder\" @click=\"browsePath\" class=\"w-12\" />\n </div>\n\n <Message v-if=\"pathError\" severity=\"error\">\n {{ pathError }}\n </Message>\n </div>\n\n <!-- Migration Options -->\n <div\n v-if=\"isValidSource\"\n class=\"flex flex-col gap-4 bg-neutral-800 p-4 rounded-lg\"\n >\n <h3 class=\"text-lg mt-0 font-medium text-neutral-100\">\n {{ $t('install.selectItemsToMigrate') }}\n </h3>\n\n <div class=\"flex flex-col gap-3\">\n <div\n v-for=\"item in migrationItems\"\n :key=\"item.id\"\n class=\"flex items-center gap-3 p-2 hover:bg-neutral-700 rounded\"\n @click=\"item.selected = !item.selected\"\n >\n <Checkbox\n v-model=\"item.selected\"\n :inputId=\"item.id\"\n :binary=\"true\"\n @click.stop\n />\n <div>\n <label :for=\"item.id\" class=\"text-neutral-200 font-medium\">\n {{ item.label }}\n </label>\n <p class=\"text-sm text-neutral-400 my-1\">\n {{ item.description }}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Skip Migration -->\n <div v-else class=\"text-neutral-400 italic\">\n {{ $t('install.migrationOptional') }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { MigrationItems } from '@comfyorg/comfyui-electron-types'\nimport Button from 'primevue/button'\nimport Checkbox from 'primevue/checkbox'\nimport InputText from 'primevue/inputtext'\nimport Message from 'primevue/message'\nimport { computed, ref, watchEffect } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport { electronAPI } from '@/utils/envUtil'\n\nconst { t } = useI18n()\n\nconst electron = electronAPI()\n\nconst sourcePath = defineModel<string>('sourcePath', { required: false })\nconst migrationItemIds = defineModel<string[]>('migrationItemIds', {\n required: false\n})\n\nconst migrationItems = ref(\n MigrationItems.map((item) => ({\n ...item,\n selected: true\n }))\n)\n\nconst pathError = ref('')\nconst isValidSource = computed(\n () => sourcePath.value !== '' && pathError.value === ''\n)\n\nconst validateSource = async (sourcePath: string) => {\n if (!sourcePath) {\n pathError.value = ''\n return\n }\n\n try {\n pathError.value = ''\n const validation = await electron.validateComfyUISource(sourcePath)\n\n if (!validation.isValid) pathError.value = validation.error\n } catch (error) {\n console.error(error)\n pathError.value = t('install.pathValidationFailed')\n }\n}\n\nconst browsePath = async () => {\n try {\n const result = await electron.showDirectoryPicker()\n if (result) {\n sourcePath.value = result\n await validateSource(result)\n }\n } catch (error) {\n console.error(error)\n pathError.value = t('install.failedToSelectDirectory')\n }\n}\n\nwatchEffect(() => {\n migrationItemIds.value = migrationItems.value\n .filter((item) => item.selected)\n .map((item) => item.id)\n})\n</script>\n","<template>\n <div class=\"flex flex-col items-center gap-4\">\n <div class=\"w-full\">\n <h3 class=\"text-lg font-medium text-neutral-100\">\n {{ $t(`settings.${normalizedSettingId}.name`) }}\n </h3>\n <p class=\"text-sm text-neutral-400 mt-1\">\n {{ $t(`settings.${normalizedSettingId}.tooltip`) }}\n </p>\n </div>\n <UrlInput\n v-model=\"modelValue\"\n :validate-url-fn=\"\n (mirror: string) =>\n checkMirrorReachable(mirror + (item.validationPathSuffix ?? ''))\n \"\n @state-change=\"validationState = $event\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\n\nimport UrlInput from '@/components/common/UrlInput.vue'\nimport { UVMirror } from '@/constants/uvMirrors'\nimport { normalizeI18nKey } from '@/utils/formatUtil'\nimport { checkMirrorReachable } from '@/utils/networkUtil'\nimport { ValidationState } from '@/utils/validationUtil'\n\nconst { item } = defineProps<{\n item: UVMirror\n}>()\n\nconst emit = defineEmits<{\n 'state-change': [state: ValidationState]\n}>()\n\nconst modelValue = defineModel<string>('modelValue', { required: true })\nconst validationState = ref<ValidationState>(ValidationState.IDLE)\n\nconst normalizedSettingId = computed(() => {\n return normalizeI18nKey(item.settingId)\n})\n\nonMounted(() => {\n modelValue.value = item.mirror\n})\n\nwatch(validationState, (newState) => {\n emit('state-change', newState)\n\n // Set fallback mirror if default mirror is invalid\n if (\n newState === ValidationState.INVALID &&\n modelValue.value === item.mirror\n ) {\n modelValue.value = item.fallbackMirror\n }\n})\n</script>\n","<template>\n <Panel\n :header=\"$t('install.settings.mirrorSettings')\"\n toggleable\n :collapsed=\"!showMirrorInputs\"\n pt:root=\"bg-neutral-800 border-none w-[600px]\"\n >\n <template\n v-for=\"([item, modelValue], index) in mirrors\"\n :key=\"item.settingId + item.mirror\"\n >\n <Divider v-if=\"index > 0\" />\n\n <MirrorItem\n :item=\"item\"\n v-model=\"modelValue.value\"\n @state-change=\"validationStates[index] = $event\"\n />\n </template>\n <template #icons>\n <i\n :class=\"{\n 'pi pi-spin pi-spinner text-neutral-400':\n validationState === ValidationState.LOADING,\n 'pi pi-check text-green-500':\n validationState === ValidationState.VALID,\n 'pi pi-times text-red-500':\n validationState === ValidationState.INVALID\n }\"\n v-tooltip=\"validationStateTooltip\"\n />\n </template>\n </Panel>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n CUDA_TORCH_URL,\n NIGHTLY_CPU_TORCH_URL,\n TorchDeviceType\n} from '@comfyorg/comfyui-electron-types'\nimport Divider from 'primevue/divider'\nimport Panel from 'primevue/panel'\nimport { ModelRef, computed, onMounted, ref } from 'vue'\n\nimport MirrorItem from '@/components/install/mirror/MirrorItem.vue'\nimport { PYPI_MIRROR, PYTHON_MIRROR, UVMirror } from '@/constants/uvMirrors'\nimport { t } from '@/i18n'\nimport { isInChina } from '@/utils/networkUtil'\nimport { ValidationState, mergeValidationStates } from '@/utils/validationUtil'\n\nconst showMirrorInputs = ref(false)\nconst { device } = defineProps<{ device: TorchDeviceType }>()\nconst pythonMirror = defineModel<string>('pythonMirror', { required: true })\nconst pypiMirror = defineModel<string>('pypiMirror', { required: true })\nconst torchMirror = defineModel<string>('torchMirror', { required: true })\n\nconst getTorchMirrorItem = (device: TorchDeviceType): UVMirror => {\n const settingId = 'Comfy-Desktop.UV.TorchInstallMirror'\n switch (device) {\n case 'mps':\n return {\n settingId,\n mirror: NIGHTLY_CPU_TORCH_URL,\n fallbackMirror: NIGHTLY_CPU_TORCH_URL\n }\n case 'nvidia':\n return {\n settingId,\n mirror: CUDA_TORCH_URL,\n fallbackMirror: CUDA_TORCH_URL\n }\n case 'cpu':\n default:\n return {\n settingId,\n mirror: PYPI_MIRROR.mirror,\n fallbackMirror: PYPI_MIRROR.fallbackMirror\n }\n }\n}\n\nconst userIsInChina = ref(false)\nonMounted(async () => {\n userIsInChina.value = await isInChina()\n})\n\nconst useFallbackMirror = (mirror: UVMirror) => ({\n ...mirror,\n mirror: mirror.fallbackMirror\n})\n\nconst mirrors = computed<[UVMirror, ModelRef<string>][]>(() =>\n (\n [\n [PYTHON_MIRROR, pythonMirror],\n [PYPI_MIRROR, pypiMirror],\n [getTorchMirrorItem(device), torchMirror]\n ] as [UVMirror, ModelRef<string>][]\n ).map(([item, modelValue]) => [\n userIsInChina.value ? useFallbackMirror(item) : item,\n modelValue\n ])\n)\n\nconst validationStates = ref<ValidationState[]>(\n mirrors.value.map(() => ValidationState.IDLE)\n)\nconst validationState = computed(() => {\n return mergeValidationStates(validationStates.value)\n})\nconst validationStateTooltip = computed(() => {\n switch (validationState.value) {\n case ValidationState.INVALID:\n return t('install.settings.mirrorsUnreachable')\n case ValidationState.VALID:\n return t('install.settings.mirrorsReachable')\n default:\n return t('install.settings.checkingMirrors')\n }\n})\n</script>\n","<template>\n <BaseViewTemplate dark>\n <!-- h-full to make sure the stepper does not layout shift between steps\n as for each step the stepper height is different. Inherit the center element\n placement from BaseViewTemplate would cause layout shift. -->\n <Stepper\n class=\"h-full p-8 2xl:p-16\"\n value=\"0\"\n @update:value=\"handleStepChange\"\n >\n <StepList class=\"select-none\">\n <Step value=\"0\">\n {{ $t('install.gpu') }}\n </Step>\n <Step value=\"1\" :disabled=\"noGpu\">\n {{ $t('install.installLocation') }}\n </Step>\n <Step value=\"2\" :disabled=\"noGpu || hasError || highestStep < 1\">\n {{ $t('install.migration') }}\n </Step>\n <Step value=\"3\" :disabled=\"noGpu || hasError || highestStep < 2\">\n {{ $t('install.desktopSettings') }}\n </Step>\n </StepList>\n <StepPanels>\n <StepPanel value=\"0\" v-slot=\"{ activateCallback }\">\n <GpuPicker v-model:device=\"device\" />\n <div class=\"flex pt-6 justify-end\">\n <Button\n :label=\"$t('g.next')\"\n icon=\"pi pi-arrow-right\"\n iconPos=\"right\"\n @click=\"activateCallback('1')\"\n :disabled=\"typeof device !== 'string'\"\n />\n </div>\n </StepPanel>\n <StepPanel value=\"1\" v-slot=\"{ activateCallback }\">\n <InstallLocationPicker\n v-model:installPath=\"installPath\"\n v-model:pathError=\"pathError\"\n />\n <div class=\"flex pt-6 justify-between\">\n <Button\n :label=\"$t('g.back')\"\n severity=\"secondary\"\n icon=\"pi pi-arrow-left\"\n @click=\"activateCallback('0')\"\n />\n <Button\n :label=\"$t('g.next')\"\n icon=\"pi pi-arrow-right\"\n iconPos=\"right\"\n @click=\"activateCallback('2')\"\n :disabled=\"pathError !== ''\"\n />\n </div>\n </StepPanel>\n <StepPanel value=\"2\" v-slot=\"{ activateCallback }\">\n <MigrationPicker\n v-model:sourcePath=\"migrationSourcePath\"\n v-model:migrationItemIds=\"migrationItemIds\"\n />\n <div class=\"flex pt-6 justify-between\">\n <Button\n :label=\"$t('g.back')\"\n severity=\"secondary\"\n icon=\"pi pi-arrow-left\"\n @click=\"activateCallback('1')\"\n />\n <Button\n :label=\"$t('g.next')\"\n icon=\"pi pi-arrow-right\"\n iconPos=\"right\"\n @click=\"activateCallback('3')\"\n />\n </div>\n </StepPanel>\n <StepPanel value=\"3\" v-slot=\"{ activateCallback }\">\n <DesktopSettingsConfiguration\n v-model:autoUpdate=\"autoUpdate\"\n v-model:allowMetrics=\"allowMetrics\"\n />\n <MirrorsConfiguration\n :device=\"device\"\n v-model:pythonMirror=\"pythonMirror\"\n v-model:pypiMirror=\"pypiMirror\"\n v-model:torchMirror=\"torchMirror\"\n class=\"mt-6\"\n />\n <div class=\"flex mt-6 justify-between\">\n <Button\n :label=\"$t('g.back')\"\n severity=\"secondary\"\n icon=\"pi pi-arrow-left\"\n @click=\"activateCallback('2')\"\n />\n <Button\n :label=\"$t('g.install')\"\n icon=\"pi pi-check\"\n iconPos=\"right\"\n :disabled=\"hasError\"\n @click=\"install()\"\n />\n </div>\n </StepPanel>\n </StepPanels>\n </Stepper>\n </BaseViewTemplate>\n</template>\n\n<script setup lang=\"ts\">\nimport type {\n InstallOptions,\n TorchDeviceType\n} from '@comfyorg/comfyui-electron-types'\nimport Button from 'primevue/button'\nimport Step from 'primevue/step'\nimport StepList from 'primevue/steplist'\nimport StepPanel from 'primevue/steppanel'\nimport StepPanels from 'primevue/steppanels'\nimport Stepper from 'primevue/stepper'\nimport { computed, onMounted, ref, toRaw } from 'vue'\nimport { useRouter } from 'vue-router'\n\nimport DesktopSettingsConfiguration from '@/components/install/DesktopSettingsConfiguration.vue'\nimport GpuPicker from '@/components/install/GpuPicker.vue'\nimport InstallLocationPicker from '@/components/install/InstallLocationPicker.vue'\nimport MigrationPicker from '@/components/install/MigrationPicker.vue'\nimport MirrorsConfiguration from '@/components/install/MirrorsConfiguration.vue'\nimport { electronAPI } from '@/utils/envUtil'\nimport BaseViewTemplate from '@/views/templates/BaseViewTemplate.vue'\n\nconst device = ref<TorchDeviceType>(null)\n\nconst installPath = ref('')\nconst pathError = ref('')\n\nconst migrationSourcePath = ref('')\nconst migrationItemIds = ref<string[]>([])\n\nconst autoUpdate = ref(true)\nconst allowMetrics = ref(true)\nconst pythonMirror = ref('')\nconst pypiMirror = ref('')\nconst torchMirror = ref('')\n\n/** Forces each install step to be visited at least once. */\nconst highestStep = ref(0)\n\nconst handleStepChange = (value: string | number) => {\n setHighestStep(value)\n\n electronAPI().Events.trackEvent('install_stepper_change', {\n step: value\n })\n}\n\nconst setHighestStep = (value: string | number) => {\n const int = typeof value === 'number' ? value : parseInt(value, 10)\n if (!isNaN(int) && int > highestStep.value) highestStep.value = int\n}\n\nconst hasError = computed(() => pathError.value !== '')\nconst noGpu = computed(() => typeof device.value !== 'string')\n\nconst electron = electronAPI()\nconst router = useRouter()\nconst install = () => {\n const options: InstallOptions = {\n installPath: installPath.value,\n autoUpdate: autoUpdate.value,\n allowMetrics: allowMetrics.value,\n migrationSourcePath: migrationSourcePath.value,\n migrationItemIds: toRaw(migrationItemIds.value),\n pythonMirror: pythonMirror.value,\n pypiMirror: pypiMirror.value,\n torchMirror: torchMirror.value,\n device: device.value\n }\n electron.installComfyUI(options)\n\n const nextPage =\n options.device === 'unsupported' ? '/manual-configuration' : '/server-start'\n router.push(nextPage)\n}\n\nonMounted(async () => {\n if (!electron) return\n\n const detectedGpu = await electron.Config.getDetectedGpu()\n if (detectedGpu === 'mps' || detectedGpu === 'nvidia') {\n device.value = detectedGpu\n }\n\n electronAPI().Events.trackEvent('install_stepper_change', {\n step: '0',\n gpu: detectedGpu\n })\n})\n</script>\n\n<style scoped>\n:deep(.p-steppanel) {\n @apply bg-transparent;\n}\n</style>\n"],"names":["_useModel","t","sourcePath"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+
2
+ [data-v-8454e24f] .p-datatable-tbody > tr > td {
3
+ padding: 0.25rem;
4
+ min-height: 2rem
5
+ }
6
+ [data-v-8454e24f] .p-datatable-row-selected .actions,[data-v-8454e24f] .p-datatable-selectable-row:hover .actions {
7
+ visibility: visible
8
+ }
@@ -0,0 +1,292 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ import { d as defineComponent, c as computed, o as openBlock, f as createElementBlock, F as Fragment, D as renderList, k as createVNode, z as withCtx, aj as createTextVNode, E as toDisplayString, j as unref, ag as script, B as createCommentVNode, T as ref, dE as FilterMatchMode, ay as useKeybindingStore, J as useCommandStore, I as useI18n, X as normalizeI18nKey, w as watchEffect, b1 as useToast, r as resolveDirective, y as createBlock, dF as SearchBox, m as createBaseVNode, l as script$2, br as script$4, aC as withModifiers, bu as script$5, an as script$6, i as withDirectives, dG as _sfc_main$2, dH as KeyComboImpl, dI as KeybindingImpl, _ as _export_sfc } from "./index-C9mZcmb9.js";
4
+ import { g as script$1, h as script$3 } from "./index-MqedrmEn.js";
5
+ import { u as useKeybindingService } from "./keybindingService-BHWf0bpL.js";
6
+ import "./index-CDQonahO.js";
7
+ const _hoisted_1$1 = {
8
+ key: 0,
9
+ class: "px-2"
10
+ };
11
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
12
+ __name: "KeyComboDisplay",
13
+ props: {
14
+ keyCombo: {},
15
+ isModified: { type: Boolean, default: false }
16
+ },
17
+ setup(__props) {
18
+ const props = __props;
19
+ const keySequences = computed(() => props.keyCombo.getKeySequences());
20
+ return (_ctx, _cache) => {
21
+ return openBlock(), createElementBlock("span", null, [
22
+ (openBlock(true), createElementBlock(Fragment, null, renderList(keySequences.value, (sequence, index) => {
23
+ return openBlock(), createElementBlock(Fragment, { key: index }, [
24
+ createVNode(unref(script), {
25
+ severity: _ctx.isModified ? "info" : "secondary"
26
+ }, {
27
+ default: withCtx(() => [
28
+ createTextVNode(toDisplayString(sequence), 1)
29
+ ]),
30
+ _: 2
31
+ }, 1032, ["severity"]),
32
+ index < keySequences.value.length - 1 ? (openBlock(), createElementBlock("span", _hoisted_1$1, "+")) : createCommentVNode("", true)
33
+ ], 64);
34
+ }), 128))
35
+ ]);
36
+ };
37
+ }
38
+ });
39
+ const _hoisted_1 = { class: "actions invisible flex flex-row" };
40
+ const _hoisted_2 = ["title"];
41
+ const _hoisted_3 = { key: 1 };
42
+ const _sfc_main = /* @__PURE__ */ defineComponent({
43
+ __name: "KeybindingPanel",
44
+ setup(__props) {
45
+ const filters = ref({
46
+ global: { value: "", matchMode: FilterMatchMode.CONTAINS }
47
+ });
48
+ const keybindingStore = useKeybindingStore();
49
+ const keybindingService = useKeybindingService();
50
+ const commandStore = useCommandStore();
51
+ const { t } = useI18n();
52
+ const commandsData = computed(() => {
53
+ return Object.values(commandStore.commands).map((command) => ({
54
+ id: command.id,
55
+ label: t(`commands.${normalizeI18nKey(command.id)}.label`, command.label),
56
+ keybinding: keybindingStore.getKeybindingByCommandId(command.id)
57
+ }));
58
+ });
59
+ const selectedCommandData = ref(null);
60
+ const editDialogVisible = ref(false);
61
+ const newBindingKeyCombo = ref(null);
62
+ const currentEditingCommand = ref(null);
63
+ const keybindingInput = ref(null);
64
+ const existingKeybindingOnCombo = computed(() => {
65
+ if (!currentEditingCommand.value) {
66
+ return null;
67
+ }
68
+ if (currentEditingCommand.value.keybinding?.combo?.equals(
69
+ newBindingKeyCombo.value
70
+ )) {
71
+ return null;
72
+ }
73
+ if (!newBindingKeyCombo.value) {
74
+ return null;
75
+ }
76
+ return keybindingStore.getKeybinding(newBindingKeyCombo.value);
77
+ });
78
+ function editKeybinding(commandData) {
79
+ currentEditingCommand.value = commandData;
80
+ newBindingKeyCombo.value = commandData.keybinding ? commandData.keybinding.combo : null;
81
+ editDialogVisible.value = true;
82
+ }
83
+ __name(editKeybinding, "editKeybinding");
84
+ watchEffect(() => {
85
+ if (editDialogVisible.value) {
86
+ setTimeout(() => {
87
+ keybindingInput.value?.$el?.focus();
88
+ }, 300);
89
+ }
90
+ });
91
+ function removeKeybinding(commandData) {
92
+ if (commandData.keybinding) {
93
+ keybindingStore.unsetKeybinding(commandData.keybinding);
94
+ keybindingService.persistUserKeybindings();
95
+ }
96
+ }
97
+ __name(removeKeybinding, "removeKeybinding");
98
+ function captureKeybinding(event) {
99
+ if (!event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey) {
100
+ switch (event.key) {
101
+ case "Escape":
102
+ cancelEdit();
103
+ return;
104
+ case "Enter":
105
+ saveKeybinding();
106
+ return;
107
+ }
108
+ }
109
+ const keyCombo = KeyComboImpl.fromEvent(event);
110
+ newBindingKeyCombo.value = keyCombo;
111
+ }
112
+ __name(captureKeybinding, "captureKeybinding");
113
+ function cancelEdit() {
114
+ editDialogVisible.value = false;
115
+ currentEditingCommand.value = null;
116
+ newBindingKeyCombo.value = null;
117
+ }
118
+ __name(cancelEdit, "cancelEdit");
119
+ function saveKeybinding() {
120
+ if (currentEditingCommand.value && newBindingKeyCombo.value) {
121
+ const updated = keybindingStore.updateKeybindingOnCommand(
122
+ new KeybindingImpl({
123
+ commandId: currentEditingCommand.value.id,
124
+ combo: newBindingKeyCombo.value
125
+ })
126
+ );
127
+ if (updated) {
128
+ keybindingService.persistUserKeybindings();
129
+ }
130
+ }
131
+ cancelEdit();
132
+ }
133
+ __name(saveKeybinding, "saveKeybinding");
134
+ const toast = useToast();
135
+ async function resetKeybindings() {
136
+ keybindingStore.resetKeybindings();
137
+ await keybindingService.persistUserKeybindings();
138
+ toast.add({
139
+ severity: "info",
140
+ summary: "Info",
141
+ detail: "Keybindings reset",
142
+ life: 3e3
143
+ });
144
+ }
145
+ __name(resetKeybindings, "resetKeybindings");
146
+ return (_ctx, _cache) => {
147
+ const _directive_tooltip = resolveDirective("tooltip");
148
+ return openBlock(), createBlock(_sfc_main$2, {
149
+ value: "Keybinding",
150
+ class: "keybinding-panel"
151
+ }, {
152
+ header: withCtx(() => [
153
+ createVNode(SearchBox, {
154
+ modelValue: filters.value["global"].value,
155
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => filters.value["global"].value = $event),
156
+ placeholder: _ctx.$t("g.searchKeybindings") + "..."
157
+ }, null, 8, ["modelValue", "placeholder"])
158
+ ]),
159
+ default: withCtx(() => [
160
+ createVNode(unref(script$3), {
161
+ value: commandsData.value,
162
+ selection: selectedCommandData.value,
163
+ "onUpdate:selection": _cache[1] || (_cache[1] = ($event) => selectedCommandData.value = $event),
164
+ "global-filter-fields": ["id", "label"],
165
+ filters: filters.value,
166
+ selectionMode: "single",
167
+ stripedRows: "",
168
+ pt: {
169
+ header: "px-0"
170
+ }
171
+ }, {
172
+ default: withCtx(() => [
173
+ createVNode(unref(script$1), {
174
+ field: "actions",
175
+ header: ""
176
+ }, {
177
+ body: withCtx((slotProps) => [
178
+ createBaseVNode("div", _hoisted_1, [
179
+ createVNode(unref(script$2), {
180
+ icon: "pi pi-pencil",
181
+ class: "p-button-text",
182
+ onClick: /* @__PURE__ */ __name(($event) => editKeybinding(slotProps.data), "onClick")
183
+ }, null, 8, ["onClick"]),
184
+ createVNode(unref(script$2), {
185
+ icon: "pi pi-trash",
186
+ class: "p-button-text p-button-danger",
187
+ onClick: /* @__PURE__ */ __name(($event) => removeKeybinding(slotProps.data), "onClick"),
188
+ disabled: !slotProps.data.keybinding
189
+ }, null, 8, ["onClick", "disabled"])
190
+ ])
191
+ ]),
192
+ _: 1
193
+ }),
194
+ createVNode(unref(script$1), {
195
+ field: "id",
196
+ header: _ctx.$t("g.command"),
197
+ sortable: "",
198
+ class: "max-w-64 2xl:max-w-full"
199
+ }, {
200
+ body: withCtx((slotProps) => [
201
+ createBaseVNode("div", {
202
+ class: "overflow-hidden text-ellipsis whitespace-nowrap",
203
+ title: slotProps.data.id
204
+ }, toDisplayString(slotProps.data.label), 9, _hoisted_2)
205
+ ]),
206
+ _: 1
207
+ }, 8, ["header"]),
208
+ createVNode(unref(script$1), {
209
+ field: "keybinding",
210
+ header: _ctx.$t("g.keybinding")
211
+ }, {
212
+ body: withCtx((slotProps) => [
213
+ slotProps.data.keybinding ? (openBlock(), createBlock(_sfc_main$1, {
214
+ key: 0,
215
+ keyCombo: slotProps.data.keybinding.combo,
216
+ isModified: unref(keybindingStore).isCommandKeybindingModified(slotProps.data.id)
217
+ }, null, 8, ["keyCombo", "isModified"])) : (openBlock(), createElementBlock("span", _hoisted_3, "-"))
218
+ ]),
219
+ _: 1
220
+ }, 8, ["header"])
221
+ ]),
222
+ _: 1
223
+ }, 8, ["value", "selection", "filters"]),
224
+ createVNode(unref(script$6), {
225
+ class: "min-w-96",
226
+ visible: editDialogVisible.value,
227
+ "onUpdate:visible": _cache[2] || (_cache[2] = ($event) => editDialogVisible.value = $event),
228
+ modal: "",
229
+ header: currentEditingCommand.value?.label,
230
+ onHide: cancelEdit
231
+ }, {
232
+ footer: withCtx(() => [
233
+ createVNode(unref(script$2), {
234
+ label: "Save",
235
+ icon: "pi pi-check",
236
+ onClick: saveKeybinding,
237
+ disabled: !!existingKeybindingOnCombo.value,
238
+ autofocus: ""
239
+ }, null, 8, ["disabled"])
240
+ ]),
241
+ default: withCtx(() => [
242
+ createBaseVNode("div", null, [
243
+ createVNode(unref(script$4), {
244
+ class: "mb-2 text-center",
245
+ ref_key: "keybindingInput",
246
+ ref: keybindingInput,
247
+ modelValue: newBindingKeyCombo.value?.toString() ?? "",
248
+ placeholder: "Press keys for new binding",
249
+ onKeydown: withModifiers(captureKeybinding, ["stop", "prevent"]),
250
+ autocomplete: "off",
251
+ fluid: "",
252
+ invalid: !!existingKeybindingOnCombo.value
253
+ }, null, 8, ["modelValue", "invalid"]),
254
+ existingKeybindingOnCombo.value ? (openBlock(), createBlock(unref(script$5), {
255
+ key: 0,
256
+ severity: "error"
257
+ }, {
258
+ default: withCtx(() => [
259
+ _cache[3] || (_cache[3] = createTextVNode(" Keybinding already exists on ")),
260
+ createVNode(unref(script), {
261
+ severity: "secondary",
262
+ value: existingKeybindingOnCombo.value.commandId
263
+ }, null, 8, ["value"])
264
+ ]),
265
+ _: 1
266
+ })) : createCommentVNode("", true)
267
+ ])
268
+ ]),
269
+ _: 1
270
+ }, 8, ["visible", "header"]),
271
+ withDirectives(createVNode(unref(script$2), {
272
+ class: "mt-4",
273
+ label: _ctx.$t("g.reset"),
274
+ icon: "pi pi-trash",
275
+ severity: "danger",
276
+ fluid: "",
277
+ text: "",
278
+ onClick: resetKeybindings
279
+ }, null, 8, ["label"]), [
280
+ [_directive_tooltip, _ctx.$t("g.resetKeybindingsTooltip")]
281
+ ])
282
+ ]),
283
+ _: 1
284
+ });
285
+ };
286
+ }
287
+ });
288
+ const KeybindingPanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-8454e24f"]]);
289
+ export {
290
+ KeybindingPanel as default
291
+ };
292
+ //# sourceMappingURL=KeybindingPanel-hJVF8FAR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeybindingPanel-hJVF8FAR.js","sources":["../../src/components/dialog/content/setting/keybinding/KeyComboDisplay.vue","../../src/components/dialog/content/setting/KeybindingPanel.vue"],"sourcesContent":["<template>\n <span>\n <template v-for=\"(sequence, index) in keySequences\" :key=\"index\">\n <Tag :severity=\"isModified ? 'info' : 'secondary'\">\n {{ sequence }}\n </Tag>\n <span v-if=\"index < keySequences.length - 1\" class=\"px-2\">+</span>\n </template>\n </span>\n</template>\n\n<script setup lang=\"ts\">\nimport Tag from 'primevue/tag'\nimport { computed } from 'vue'\n\nimport { KeyComboImpl } from '@/stores/keybindingStore'\n\nconst props = withDefaults(\n defineProps<{\n keyCombo: KeyComboImpl\n isModified: boolean\n }>(),\n {\n isModified: false\n }\n)\n\nconst keySequences = computed(() => props.keyCombo.getKeySequences())\n</script>\n","<template>\n <PanelTemplate value=\"Keybinding\" class=\"keybinding-panel\">\n <template #header>\n <SearchBox\n v-model=\"filters['global'].value\"\n :placeholder=\"$t('g.searchKeybindings') + '...'\"\n />\n </template>\n\n <DataTable\n :value=\"commandsData\"\n v-model:selection=\"selectedCommandData\"\n :global-filter-fields=\"['id', 'label']\"\n :filters=\"filters\"\n selectionMode=\"single\"\n stripedRows\n :pt=\"{\n header: 'px-0'\n }\"\n >\n <Column field=\"actions\" header=\"\">\n <template #body=\"slotProps\">\n <div class=\"actions invisible flex flex-row\">\n <Button\n icon=\"pi pi-pencil\"\n class=\"p-button-text\"\n @click=\"editKeybinding(slotProps.data)\"\n />\n <Button\n icon=\"pi pi-trash\"\n class=\"p-button-text p-button-danger\"\n @click=\"removeKeybinding(slotProps.data)\"\n :disabled=\"!slotProps.data.keybinding\"\n />\n </div>\n </template>\n </Column>\n <Column\n field=\"id\"\n :header=\"$t('g.command')\"\n sortable\n class=\"max-w-64 2xl:max-w-full\"\n >\n <template #body=\"slotProps\">\n <div\n class=\"overflow-hidden text-ellipsis whitespace-nowrap\"\n :title=\"slotProps.data.id\"\n >\n {{ slotProps.data.label }}\n </div>\n </template>\n </Column>\n <Column field=\"keybinding\" :header=\"$t('g.keybinding')\">\n <template #body=\"slotProps\">\n <KeyComboDisplay\n v-if=\"slotProps.data.keybinding\"\n :keyCombo=\"slotProps.data.keybinding.combo\"\n :isModified=\"\n keybindingStore.isCommandKeybindingModified(slotProps.data.id)\n \"\n />\n <span v-else>-</span>\n </template>\n </Column>\n </DataTable>\n\n <Dialog\n class=\"min-w-96\"\n v-model:visible=\"editDialogVisible\"\n modal\n :header=\"currentEditingCommand?.label\"\n @hide=\"cancelEdit\"\n >\n <div>\n <InputText\n class=\"mb-2 text-center\"\n ref=\"keybindingInput\"\n :modelValue=\"newBindingKeyCombo?.toString() ?? ''\"\n placeholder=\"Press keys for new binding\"\n @keydown.stop.prevent=\"captureKeybinding\"\n autocomplete=\"off\"\n fluid\n :invalid=\"!!existingKeybindingOnCombo\"\n />\n <Message v-if=\"existingKeybindingOnCombo\" severity=\"error\">\n Keybinding already exists on\n <Tag\n severity=\"secondary\"\n :value=\"existingKeybindingOnCombo.commandId\"\n />\n </Message>\n </div>\n <template #footer>\n <Button\n label=\"Save\"\n icon=\"pi pi-check\"\n @click=\"saveKeybinding\"\n :disabled=\"!!existingKeybindingOnCombo\"\n autofocus\n />\n </template>\n </Dialog>\n <Button\n class=\"mt-4\"\n :label=\"$t('g.reset')\"\n v-tooltip=\"$t('g.resetKeybindingsTooltip')\"\n icon=\"pi pi-trash\"\n severity=\"danger\"\n fluid\n text\n @click=\"resetKeybindings\"\n />\n </PanelTemplate>\n</template>\n\n<script setup lang=\"ts\">\nimport { FilterMatchMode } from '@primevue/core/api'\nimport Button from 'primevue/button'\nimport Column from 'primevue/column'\nimport DataTable from 'primevue/datatable'\nimport Dialog from 'primevue/dialog'\nimport InputText from 'primevue/inputtext'\nimport Message from 'primevue/message'\nimport Tag from 'primevue/tag'\nimport { useToast } from 'primevue/usetoast'\nimport { computed, ref, watchEffect } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport SearchBox from '@/components/common/SearchBox.vue'\nimport { useKeybindingService } from '@/services/keybindingService'\nimport { useCommandStore } from '@/stores/commandStore'\nimport {\n KeyComboImpl,\n KeybindingImpl,\n useKeybindingStore\n} from '@/stores/keybindingStore'\nimport { normalizeI18nKey } from '@/utils/formatUtil'\n\nimport PanelTemplate from './PanelTemplate.vue'\nimport KeyComboDisplay from './keybinding/KeyComboDisplay.vue'\n\nconst filters = ref({\n global: { value: '', matchMode: FilterMatchMode.CONTAINS }\n})\n\nconst keybindingStore = useKeybindingStore()\nconst keybindingService = useKeybindingService()\nconst commandStore = useCommandStore()\nconst { t } = useI18n()\n\ninterface ICommandData {\n id: string\n keybinding: KeybindingImpl | null\n label: string\n}\n\nconst commandsData = computed<ICommandData[]>(() => {\n return Object.values(commandStore.commands).map((command) => ({\n id: command.id,\n label: t(`commands.${normalizeI18nKey(command.id)}.label`, command.label),\n keybinding: keybindingStore.getKeybindingByCommandId(command.id)\n }))\n})\n\nconst selectedCommandData = ref<ICommandData | null>(null)\nconst editDialogVisible = ref(false)\nconst newBindingKeyCombo = ref<KeyComboImpl | null>(null)\nconst currentEditingCommand = ref<ICommandData | null>(null)\nconst keybindingInput = ref(null)\n\nconst existingKeybindingOnCombo = computed<KeybindingImpl | null>(() => {\n if (!currentEditingCommand.value) {\n return null\n }\n\n // If the new keybinding is the same as the current editing command, then don't show the error\n if (\n currentEditingCommand.value.keybinding?.combo?.equals(\n newBindingKeyCombo.value\n )\n ) {\n return null\n }\n\n if (!newBindingKeyCombo.value) {\n return null\n }\n\n return keybindingStore.getKeybinding(newBindingKeyCombo.value)\n})\n\nfunction editKeybinding(commandData: ICommandData) {\n currentEditingCommand.value = commandData\n newBindingKeyCombo.value = commandData.keybinding\n ? commandData.keybinding.combo\n : null\n editDialogVisible.value = true\n}\n\nwatchEffect(() => {\n if (editDialogVisible.value) {\n // nextTick doesn't work here, so we use a timeout instead\n setTimeout(() => {\n keybindingInput.value?.$el?.focus()\n }, 300)\n }\n})\n\nfunction removeKeybinding(commandData: ICommandData) {\n if (commandData.keybinding) {\n keybindingStore.unsetKeybinding(commandData.keybinding)\n keybindingService.persistUserKeybindings()\n }\n}\n\nfunction captureKeybinding(event: KeyboardEvent) {\n // Allow the use of keyboard shortcuts when adding keyboard shortcuts\n if (!event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey) {\n switch (event.key) {\n case 'Escape':\n cancelEdit()\n return\n case 'Enter':\n saveKeybinding()\n return\n }\n }\n const keyCombo = KeyComboImpl.fromEvent(event)\n newBindingKeyCombo.value = keyCombo\n}\n\nfunction cancelEdit() {\n editDialogVisible.value = false\n currentEditingCommand.value = null\n newBindingKeyCombo.value = null\n}\n\nfunction saveKeybinding() {\n if (currentEditingCommand.value && newBindingKeyCombo.value) {\n const updated = keybindingStore.updateKeybindingOnCommand(\n new KeybindingImpl({\n commandId: currentEditingCommand.value.id,\n combo: newBindingKeyCombo.value\n })\n )\n if (updated) {\n keybindingService.persistUserKeybindings()\n }\n }\n cancelEdit()\n}\n\nconst toast = useToast()\nasync function resetKeybindings() {\n keybindingStore.resetKeybindings()\n await keybindingService.persistUserKeybindings()\n toast.add({\n severity: 'info',\n summary: 'Info',\n detail: 'Keybindings reset',\n life: 3000\n })\n}\n</script>\n\n<style scoped>\n:deep(.p-datatable-tbody) > tr > td {\n @apply p-1;\n min-height: 2rem;\n}\n\n:deep(.p-datatable-row-selected) .actions,\n:deep(.p-datatable-selectable-row:hover) .actions {\n @apply visible;\n}\n</style>\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+
2
+ .task-card-ok[data-v-c3bd7658] {
3
+
4
+ position: absolute;
5
+
6
+ right: -1rem;
7
+
8
+ bottom: -1rem;
9
+
10
+ grid-column: 1 / -1;
11
+
12
+ grid-row: 1 / -1;
13
+
14
+ --tw-text-opacity: 1;
15
+
16
+ color: rgb(150 206 76 / var(--tw-text-opacity));
17
+
18
+ opacity: 1;
19
+
20
+ transition-property: opacity;
21
+
22
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
23
+
24
+ transition-duration: 150ms;
25
+
26
+ font-size: 4rem;
27
+ text-shadow: 0.25rem 0 0.5rem black;
28
+ z-index: 10;
29
+ }
30
+ .p-card {
31
+ &[data-v-c3bd7658] {
32
+
33
+ transition-property: opacity;
34
+
35
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
36
+
37
+ transition-duration: 150ms;
38
+
39
+ --p-card-background: var(--p-button-secondary-background);
40
+ opacity: 0.9;
41
+ }
42
+ &.opacity-65[data-v-c3bd7658] {
43
+ opacity: 0.4;
44
+ }
45
+ &[data-v-c3bd7658]:hover {
46
+ opacity: 1;
47
+ }
48
+ }
49
+ [data-v-c3bd7658] .p-card-header {
50
+ z-index: 0;
51
+ }
52
+ [data-v-c3bd7658] .p-card-body {
53
+ z-index: 1;
54
+ flex-grow: 1;
55
+ justify-content: space-between;
56
+ }
57
+ .task-div {
58
+ > i[data-v-c3bd7658] {
59
+ pointer-events: none;
60
+ }
61
+ &:hover > i[data-v-c3bd7658] {
62
+ opacity: 0.2;
63
+ }
64
+ }
65
+
66
+ [data-v-1073ace1] .p-tag {
67
+ --p-tag-gap: 0.375rem;
68
+ }
69
+ .backspan[data-v-1073ace1]::before {
70
+ position: absolute;
71
+ margin: 0px;
72
+ color: var(--p-text-muted-color);
73
+ font-family: 'primeicons';
74
+ top: -2rem;
75
+ right: -2rem;
76
+ speak: none;
77
+ font-style: normal;
78
+ font-weight: normal;
79
+ font-variant: normal;
80
+ text-transform: none;
81
+ line-height: 1;
82
+ display: inline-block;
83
+ -webkit-font-smoothing: antialiased;
84
+ opacity: 0.02;
85
+ font-size: min(14rem, 90vw);
86
+ z-index: 0;
87
+ }