comfyui-frontend-package 1.38.5__py3-none-any.whl → 1.38.6__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 (139) hide show
  1. comfyui_frontend_package/static/assets/{AboutPanel-CHse5rOA.js → AboutPanel-lkjGFasi.js} +2 -2
  2. comfyui_frontend_package/static/assets/{AboutPanel-CHse5rOA.js.map → AboutPanel-lkjGFasi.js.map} +1 -1
  3. comfyui_frontend_package/static/assets/{AudioPreviewPlayer-CAa8V66L.js → AudioPreviewPlayer-BxCSKPl9.js} +2 -2
  4. comfyui_frontend_package/static/assets/{AudioPreviewPlayer-CAa8V66L.js.map → AudioPreviewPlayer-BxCSKPl9.js.map} +1 -1
  5. comfyui_frontend_package/static/assets/AudioPreviewPlayer-CkxKvcVf.js +1 -0
  6. comfyui_frontend_package/static/assets/{BaseViewTemplate-DA6zfigT.js → BaseViewTemplate-CjODF2hh.js} +2 -2
  7. comfyui_frontend_package/static/assets/{BaseViewTemplate-DA6zfigT.js.map → BaseViewTemplate-CjODF2hh.js.map} +1 -1
  8. comfyui_frontend_package/static/assets/{CloudAuthTimeoutView-9OPBS1hE.js → CloudAuthTimeoutView-D-QkjPNh.js} +2 -2
  9. comfyui_frontend_package/static/assets/{CloudAuthTimeoutView-9OPBS1hE.js.map → CloudAuthTimeoutView-D-QkjPNh.js.map} +1 -1
  10. comfyui_frontend_package/static/assets/{CloudBadge-BnLiAHDN.js → CloudBadge-B4nmLus2.js} +2 -2
  11. comfyui_frontend_package/static/assets/{CloudBadge-BnLiAHDN.js.map → CloudBadge-B4nmLus2.js.map} +1 -1
  12. comfyui_frontend_package/static/assets/{CloudForgotPasswordView-BqDR_C7K.js → CloudForgotPasswordView-DOEV9hGr.js} +2 -2
  13. comfyui_frontend_package/static/assets/{CloudForgotPasswordView-BqDR_C7K.js.map → CloudForgotPasswordView-DOEV9hGr.js.map} +1 -1
  14. comfyui_frontend_package/static/assets/{CloudLayoutView-vTrrVUOY.js → CloudLayoutView-ShKH6rRV.js} +2 -2
  15. comfyui_frontend_package/static/assets/{CloudLayoutView-vTrrVUOY.js.map → CloudLayoutView-ShKH6rRV.js.map} +1 -1
  16. comfyui_frontend_package/static/assets/{CloudLoginView-T17euJly.js → CloudLoginView-C3Te42U9.js} +2 -2
  17. comfyui_frontend_package/static/assets/{CloudLoginView-T17euJly.js.map → CloudLoginView-C3Te42U9.js.map} +1 -1
  18. comfyui_frontend_package/static/assets/CloudRunButtonWrapper-Cub7EB34.js +3 -0
  19. comfyui_frontend_package/static/assets/{CloudRunButtonWrapper-hQc4BNkX.js.map → CloudRunButtonWrapper-Cub7EB34.js.map} +1 -1
  20. comfyui_frontend_package/static/assets/{CloudSignupView-vEDby5k3.js → CloudSignupView-X2oiL3ZR.js} +2 -2
  21. comfyui_frontend_package/static/assets/{CloudSignupView-vEDby5k3.js.map → CloudSignupView-X2oiL3ZR.js.map} +1 -1
  22. comfyui_frontend_package/static/assets/{CloudSubscriptionRedirectView-DPyO745g.js → CloudSubscriptionRedirectView-UjNv8emo.js} +2 -2
  23. comfyui_frontend_package/static/assets/{CloudSubscriptionRedirectView-DPyO745g.js.map → CloudSubscriptionRedirectView-UjNv8emo.js.map} +1 -1
  24. comfyui_frontend_package/static/assets/{CloudSurveyView-CBtTd9Ru.js → CloudSurveyView-IaiucCTP.js} +2 -2
  25. comfyui_frontend_package/static/assets/{CloudSurveyView-CBtTd9Ru.js.map → CloudSurveyView-IaiucCTP.js.map} +1 -1
  26. comfyui_frontend_package/static/assets/ComfyQueueButton-BppnHbrl.js +1 -0
  27. comfyui_frontend_package/static/assets/{ComfyQueueButton-MZrp7wYJ.js → ComfyQueueButton-HjSIKZKO.js} +2 -2
  28. comfyui_frontend_package/static/assets/{ComfyQueueButton-MZrp7wYJ.js.map → ComfyQueueButton-HjSIKZKO.js.map} +1 -1
  29. comfyui_frontend_package/static/assets/{ExtensionPanel-CrWVGUtg.js → ExtensionPanel-Bzb9QtKj.js} +2 -2
  30. comfyui_frontend_package/static/assets/{ExtensionPanel-CrWVGUtg.js.map → ExtensionPanel-Bzb9QtKj.js.map} +1 -1
  31. comfyui_frontend_package/static/assets/{GlobalToast-BiCmpIvO.js → GlobalToast-BSCvu6Hw.js} +2 -2
  32. comfyui_frontend_package/static/assets/{GlobalToast-BiCmpIvO.js.map → GlobalToast-BSCvu6Hw.js.map} +1 -1
  33. comfyui_frontend_package/static/assets/{GraphView-BCkpNGgz.js → GraphView-gYVCtm1V.js} +5 -5
  34. comfyui_frontend_package/static/assets/GraphView-gYVCtm1V.js.map +1 -0
  35. comfyui_frontend_package/static/assets/{KeybindingPanel-CAXL5TlV.js → KeybindingPanel-DF-bG4iO.js} +2 -2
  36. comfyui_frontend_package/static/assets/{KeybindingPanel-CAXL5TlV.js.map → KeybindingPanel-DF-bG4iO.js.map} +1 -1
  37. comfyui_frontend_package/static/assets/{LegacyCreditsPanel-6vR8koQy.js → LegacyCreditsPanel-D-CboO8k.js} +2 -2
  38. comfyui_frontend_package/static/assets/{LegacyCreditsPanel-6vR8koQy.js.map → LegacyCreditsPanel-D-CboO8k.js.map} +1 -1
  39. comfyui_frontend_package/static/assets/Load3D-c9UwgGoI.js +1 -0
  40. comfyui_frontend_package/static/assets/{Load3D-ei1BUF9O.js → Load3D-vYr8M3jJ.js} +2 -2
  41. comfyui_frontend_package/static/assets/{Load3D-ei1BUF9O.js.map → Load3D-vYr8M3jJ.js.map} +1 -1
  42. comfyui_frontend_package/static/assets/{PanelTemplate-BjN5XNg2.js → PanelTemplate-BJda9e5J.js} +2 -2
  43. comfyui_frontend_package/static/assets/{PanelTemplate-BjN5XNg2.js.map → PanelTemplate-BJda9e5J.js.map} +1 -1
  44. comfyui_frontend_package/static/assets/{ServerConfigPanel-CxovH9Qk.js → ServerConfigPanel-VsC6xlZJ.js} +2 -2
  45. comfyui_frontend_package/static/assets/{ServerConfigPanel-CxovH9Qk.js.map → ServerConfigPanel-VsC6xlZJ.js.map} +1 -1
  46. comfyui_frontend_package/static/assets/{SubscribeButton-CTOQRkfg.js → SubscribeButton-DZBycfCA.js} +2 -2
  47. comfyui_frontend_package/static/assets/{SubscribeButton-CTOQRkfg.js.map → SubscribeButton-DZBycfCA.js.map} +1 -1
  48. comfyui_frontend_package/static/assets/{SubscribeToRun-DnXzV8y0.js → SubscribeToRun-4YolxBOL.js} +2 -2
  49. comfyui_frontend_package/static/assets/{SubscribeToRun-DnXzV8y0.js.map → SubscribeToRun-4YolxBOL.js.map} +1 -1
  50. comfyui_frontend_package/static/assets/{SubscriptionPanel-D9uv7z8f.js → SubscriptionPanel-B6txX4Vm.js} +2 -2
  51. comfyui_frontend_package/static/assets/{SubscriptionPanel-D9uv7z8f.js.map → SubscriptionPanel-B6txX4Vm.js.map} +1 -1
  52. comfyui_frontend_package/static/assets/{SubscriptionRequiredDialogContent--VmT16oc.js → SubscriptionRequiredDialogContent-COEF2VQ_.js} +2 -2
  53. comfyui_frontend_package/static/assets/{SubscriptionRequiredDialogContent--VmT16oc.js.map → SubscriptionRequiredDialogContent-COEF2VQ_.js.map} +1 -1
  54. comfyui_frontend_package/static/assets/{UserCheckView-spD3LyMu.js → UserCheckView-x-fkcYzc.js} +2 -2
  55. comfyui_frontend_package/static/assets/{UserCheckView-spD3LyMu.js.map → UserCheckView-x-fkcYzc.js.map} +1 -1
  56. comfyui_frontend_package/static/assets/{UserPanel-Su6NtJ5q.js → UserPanel-7N9QknQj.js} +2 -2
  57. comfyui_frontend_package/static/assets/{UserPanel-Su6NtJ5q.js.map → UserPanel-7N9QknQj.js.map} +1 -1
  58. comfyui_frontend_package/static/assets/{UserSelectView-C5LBOPcv.js → UserSelectView-BYjOkfSa.js} +2 -2
  59. comfyui_frontend_package/static/assets/{UserSelectView-C5LBOPcv.js.map → UserSelectView-BYjOkfSa.js.map} +1 -1
  60. comfyui_frontend_package/static/assets/{ValueControlPopover-BdlDzT8l.js → ValueControlPopover-BPAa35QG.js} +2 -2
  61. comfyui_frontend_package/static/assets/{ValueControlPopover-BdlDzT8l.js.map → ValueControlPopover-BPAa35QG.js.map} +1 -1
  62. comfyui_frontend_package/static/assets/{WidgetAudioUI-BDZxDx_r.js → WidgetAudioUI-Dw-r3Ews.js} +2 -2
  63. comfyui_frontend_package/static/assets/{WidgetAudioUI-BDZxDx_r.js.map → WidgetAudioUI-Dw-r3Ews.js.map} +1 -1
  64. comfyui_frontend_package/static/assets/{WidgetImageCrop-CYRW7t2Q.js → WidgetImageCrop-kERy9g5I.js} +2 -2
  65. comfyui_frontend_package/static/assets/{WidgetImageCrop-CYRW7t2Q.js.map → WidgetImageCrop-kERy9g5I.js.map} +1 -1
  66. comfyui_frontend_package/static/assets/{WidgetInputNumber-BOKO36G3.js → WidgetInputNumber-BaClCNAC.js} +1 -1
  67. comfyui_frontend_package/static/assets/WidgetInputNumber-DU_D0Fzy.js +3 -0
  68. comfyui_frontend_package/static/assets/WidgetInputNumber-DU_D0Fzy.js.map +1 -0
  69. comfyui_frontend_package/static/assets/{WidgetLegacy-Bslv9wZZ.js → WidgetLegacy-B4nipUM9.js} +1 -1
  70. comfyui_frontend_package/static/assets/{WidgetRecordAudio-Bzy8PIzN.js → WidgetRecordAudio-Nk8dH238.js} +2 -2
  71. comfyui_frontend_package/static/assets/{WidgetRecordAudio-Bzy8PIzN.js.map → WidgetRecordAudio-Nk8dH238.js.map} +1 -1
  72. comfyui_frontend_package/static/assets/WidgetSelect-DzZPpO_-.js +1 -0
  73. comfyui_frontend_package/static/assets/{WidgetSelect-zgrFVzHH.js → WidgetSelect-nSQrk_hd.js} +2 -2
  74. comfyui_frontend_package/static/assets/{WidgetSelect-zgrFVzHH.js.map → WidgetSelect-nSQrk_hd.js.map} +1 -1
  75. comfyui_frontend_package/static/assets/{WidgetWithControl-Dh2FWOiA.js → WidgetWithControl-Da6zUB5e.js} +3 -3
  76. comfyui_frontend_package/static/assets/{WidgetWithControl-Dh2FWOiA.js.map → WidgetWithControl-Da6zUB5e.js.map} +1 -1
  77. comfyui_frontend_package/static/assets/{api-CUAc7rDA.js → api-Dwq2LQIW.js} +4 -4
  78. comfyui_frontend_package/static/assets/api-Dwq2LQIW.js.map +1 -0
  79. comfyui_frontend_package/static/assets/{audioService-DvndbCi2.js → audioService-DvVaKhuU.js} +2 -2
  80. comfyui_frontend_package/static/assets/{audioService-DvndbCi2.js.map → audioService-DvVaKhuU.js.map} +1 -1
  81. comfyui_frontend_package/static/assets/{audioUtils-DpjpcKbH.js → audioUtils-DD4rUYVZ.js} +2 -2
  82. comfyui_frontend_package/static/assets/{audioUtils-DpjpcKbH.js.map → audioUtils-DD4rUYVZ.js.map} +1 -1
  83. comfyui_frontend_package/static/assets/{auth-B8ZZ0KKQ.js → auth-B9axG-yZ.js} +2 -2
  84. comfyui_frontend_package/static/assets/{auth-B8ZZ0KKQ.js.map → auth-B9axG-yZ.js.map} +1 -1
  85. comfyui_frontend_package/static/assets/auth-D74DTev8.js +1 -0
  86. comfyui_frontend_package/static/assets/{cloudBadges-C1a7fBky.js → cloudBadges-D5mGJbRy.js} +2 -2
  87. comfyui_frontend_package/static/assets/{cloudBadges-C1a7fBky.js.map → cloudBadges-D5mGJbRy.js.map} +1 -1
  88. comfyui_frontend_package/static/assets/{cloudFeedbackTopbarButton-DR0T8sWG.js → cloudFeedbackTopbarButton-RZUssOmb.js} +2 -2
  89. comfyui_frontend_package/static/assets/{cloudFeedbackTopbarButton-DR0T8sWG.js.map → cloudFeedbackTopbarButton-RZUssOmb.js.map} +1 -1
  90. comfyui_frontend_package/static/assets/{cloudRemoteConfig-DhMjC5TB.js → cloudRemoteConfig-F9J0iGyF.js} +2 -2
  91. comfyui_frontend_package/static/assets/{cloudRemoteConfig-DhMjC5TB.js.map → cloudRemoteConfig-F9J0iGyF.js.map} +1 -1
  92. comfyui_frontend_package/static/assets/{cloudSessionCookie-Duxk6ux1.js → cloudSessionCookie-MEORlqtg.js} +2 -2
  93. comfyui_frontend_package/static/assets/{cloudSessionCookie-Duxk6ux1.js.map → cloudSessionCookie-MEORlqtg.js.map} +1 -1
  94. comfyui_frontend_package/static/assets/{cloudSubscription-B8l6B9Nx.js → cloudSubscription-CuWNXKVx.js} +2 -2
  95. comfyui_frontend_package/static/assets/{cloudSubscription-B8l6B9Nx.js.map → cloudSubscription-CuWNXKVx.js.map} +1 -1
  96. comfyui_frontend_package/static/assets/{core-DBfeqMDR.js → core-IYu8XAIx.js} +4 -4
  97. comfyui_frontend_package/static/assets/{core-DBfeqMDR.js.map → core-IYu8XAIx.js.map} +1 -1
  98. comfyui_frontend_package/static/assets/{dialogService-BZ1FmjZL.js → dialogService-YG0RH337.js} +9 -9
  99. comfyui_frontend_package/static/assets/{dialogService-BZ1FmjZL.js.map → dialogService-YG0RH337.js.map} +1 -1
  100. comfyui_frontend_package/static/assets/firebaseAuthStore-DnNaPbuZ.js +1 -0
  101. comfyui_frontend_package/static/assets/{graphHasMissingNodes-C79Wi51S.js → graphHasMissingNodes-BhD1N6zI.js} +2 -2
  102. comfyui_frontend_package/static/assets/{graphHasMissingNodes-C79Wi51S.js.map → graphHasMissingNodes-BhD1N6zI.js.map} +1 -1
  103. comfyui_frontend_package/static/assets/{index-CGxJFSof.js → index-BMy3twho.js} +3 -3
  104. comfyui_frontend_package/static/assets/{index-CGxJFSof.js.map → index-BMy3twho.js.map} +1 -1
  105. comfyui_frontend_package/static/assets/{index-DNpOhRra.css → index-KMO9qFHH.css} +1 -1
  106. comfyui_frontend_package/static/assets/{keybindingService-B88NjeAU.js → keybindingService-CBLPjYHI.js} +2 -2
  107. comfyui_frontend_package/static/assets/{keybindingService-B88NjeAU.js.map → keybindingService-CBLPjYHI.js.map} +1 -1
  108. comfyui_frontend_package/static/assets/{releaseStore-x0vHjxrw.js → releaseStore-DDOxzkVb.js} +2 -2
  109. comfyui_frontend_package/static/assets/{releaseStore-x0vHjxrw.js.map → releaseStore-DDOxzkVb.js.map} +1 -1
  110. comfyui_frontend_package/static/assets/releaseStore-iVkqunL8.js +1 -0
  111. comfyui_frontend_package/static/assets/{subscriptionCheckoutUtil-B_OvUP2T.js → subscriptionCheckoutUtil-DswSOreM.js} +2 -2
  112. comfyui_frontend_package/static/assets/{subscriptionCheckoutUtil-B_OvUP2T.js.map → subscriptionCheckoutUtil-DswSOreM.js.map} +1 -1
  113. comfyui_frontend_package/static/assets/{useCurrentUser-BJcn2Vgo.js → useCurrentUser-NdaCJzIK.js} +1 -1
  114. comfyui_frontend_package/static/assets/{useErrorHandling-CI8_F4yx.js → useErrorHandling-Cfa5N_7c.js} +2 -2
  115. comfyui_frontend_package/static/assets/{useErrorHandling-CI8_F4yx.js.map → useErrorHandling-Cfa5N_7c.js.map} +1 -1
  116. comfyui_frontend_package/static/assets/{useSubscriptionDialog-Chxkdny5.js → useSubscriptionDialog-792qfEJ2.js} +3 -3
  117. comfyui_frontend_package/static/assets/{useSubscriptionDialog-Chxkdny5.js.map → useSubscriptionDialog-792qfEJ2.js.map} +1 -1
  118. comfyui_frontend_package/static/assets/useSubscriptionDialog-B-eGeK3j.js +1 -0
  119. comfyui_frontend_package/static/assets/{userStore-BkgQPjq6.js → userStore-BAS9m9W6.js} +2 -2
  120. comfyui_frontend_package/static/assets/{userStore-BkgQPjq6.js.map → userStore-BAS9m9W6.js.map} +1 -1
  121. comfyui_frontend_package/static/assets/vendor-three-BFcUNSs9.js.map +1 -1
  122. comfyui_frontend_package/static/index.html +1 -1
  123. {comfyui_frontend_package-1.38.5.dist-info → comfyui_frontend_package-1.38.6.dist-info}/METADATA +1 -1
  124. {comfyui_frontend_package-1.38.5.dist-info → comfyui_frontend_package-1.38.6.dist-info}/RECORD +126 -126
  125. comfyui_frontend_package/static/assets/AudioPreviewPlayer-BoEdyGI_.js +0 -1
  126. comfyui_frontend_package/static/assets/CloudRunButtonWrapper-hQc4BNkX.js +0 -3
  127. comfyui_frontend_package/static/assets/ComfyQueueButton-BbQnRThI.js +0 -1
  128. comfyui_frontend_package/static/assets/GraphView-BCkpNGgz.js.map +0 -1
  129. comfyui_frontend_package/static/assets/Load3D-DHBmC_AU.js +0 -1
  130. comfyui_frontend_package/static/assets/WidgetInputNumber-DGKypM5j.js +0 -3
  131. comfyui_frontend_package/static/assets/WidgetInputNumber-DGKypM5j.js.map +0 -1
  132. comfyui_frontend_package/static/assets/WidgetSelect-DsJGH12l.js +0 -1
  133. comfyui_frontend_package/static/assets/api-CUAc7rDA.js.map +0 -1
  134. comfyui_frontend_package/static/assets/auth-D3RiiqZ8.js +0 -1
  135. comfyui_frontend_package/static/assets/firebaseAuthStore-CZgxeMyf.js +0 -1
  136. comfyui_frontend_package/static/assets/releaseStore-CubqSv5t.js +0 -1
  137. comfyui_frontend_package/static/assets/useSubscriptionDialog-BzMzio2H.js +0 -1
  138. {comfyui_frontend_package-1.38.5.dist-info → comfyui_frontend_package-1.38.6.dist-info}/WHEEL +0 -0
  139. {comfyui_frontend_package-1.38.5.dist-info → comfyui_frontend_package-1.38.6.dist-info}/top_level.txt +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"CloudSurveyView-CBtTd9Ru.js","names":[],"sources":["../../src/platform/cloud/onboarding/CloudSurveyView.vue","../../src/platform/cloud/onboarding/CloudSurveyView.vue"],"sourcesContent":["<template>\n <div>\n <Stepper\n value=\"1\"\n class=\"flex h-[638px] max-h-[80vh] w-[320px] max-w-[90vw] flex-col\"\n >\n <ProgressBar\n :value=\"progressPercent\"\n :show-value=\"false\"\n class=\"mb-8 h-2\"\n />\n\n <StepPanels class=\"flex flex-1 flex-col p-0\">\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"1\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_familiarity')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in familiarityOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <RadioButton\n v-model=\"surveyData.familiarity\"\n :input-id=\"`fam-${opt.value}`\"\n name=\"familiarity\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`fam-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-between pt-4\">\n <span />\n <Button\n :disabled=\"!validStep1\"\n class=\"h-10 w-full border-none text-white\"\n @click=\"goTo(2, activateCallback)\"\n >\n {{ $t('g.next') }}\n </Button>\n </div>\n </StepPanel>\n\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"2\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_purpose')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in purposeOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <RadioButton\n v-model=\"surveyData.useCase\"\n :input-id=\"`purpose-${opt.value}`\"\n name=\"purpose\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`purpose-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n <div v-if=\"surveyData.useCase === 'other'\" class=\"mt-4 ml-8\">\n <InputText\n v-model=\"surveyData.useCaseOther\"\n class=\"w-full\"\n :placeholder=\"\n $t('cloudOnboarding.survey.options.industry.otherPlaceholder')\n \"\n />\n </div>\n </div>\n\n <div class=\"flex gap-6 pt-4\">\n <Button\n variant=\"secondary\"\n class=\"flex-1 text-white\"\n @click=\"goTo(1, activateCallback)\"\n >\n {{ $t('g.back') }}\n </Button>\n <Button\n :disabled=\"!validStep2\"\n class=\"h-10 flex-1 text-white\"\n @click=\"goTo(3, activateCallback)\"\n >\n {{ $t('g.next') }}\n </Button>\n </div>\n </StepPanel>\n\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"3\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_industry')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in industryOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <RadioButton\n v-model=\"surveyData.industry\"\n :input-id=\"`industry-${opt.value}`\"\n name=\"industry\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`industry-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n <div v-if=\"surveyData.industry === 'other'\" class=\"mt-4 ml-8\">\n <InputText\n v-model=\"surveyData.industryOther\"\n class=\"w-full\"\n :placeholder=\"\n $t('cloudOnboarding.survey.options.industry.otherPlaceholder')\n \"\n />\n </div>\n </div>\n\n <div class=\"flex gap-6 pt-4\">\n <Button\n variant=\"secondary\"\n class=\"flex-1 text-white\"\n @click=\"goTo(2, activateCallback)\"\n >\n {{ $t('g.back') }}\n </Button>\n <Button\n :disabled=\"!validStep3\"\n class=\"h-10 flex-1 border-none text-white\"\n @click=\"goTo(4, activateCallback)\"\n >\n {{ $t('g.next') }}\n </Button>\n </div>\n </StepPanel>\n\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"4\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_making')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in makingOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <Checkbox\n v-model=\"surveyData.making\"\n :input-id=\"`making-${opt.value}`\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`making-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n </div>\n\n <div class=\"flex gap-6 pt-4\">\n <Button\n variant=\"secondary\"\n class=\"flex-1 text-white\"\n @click=\"goTo(3, activateCallback)\"\n >\n {{ $t('g.back') }}\n </Button>\n <Button\n :disabled=\"!validStep4 || isSubmitting\"\n :loading=\"isSubmitting\"\n class=\"h-10 flex-1 border-none text-white\"\n @click=\"onSubmitSurvey\"\n >\n {{ $t('g.submit') }}\n </Button>\n </div>\n </StepPanel>\n </StepPanels>\n </Stepper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Checkbox from 'primevue/checkbox'\nimport InputText from 'primevue/inputtext'\nimport ProgressBar from 'primevue/progressbar'\nimport RadioButton from 'primevue/radiobutton'\nimport StepPanel from 'primevue/steppanel'\nimport StepPanels from 'primevue/steppanels'\nimport Stepper from 'primevue/stepper'\nimport { computed, onMounted, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\n\nimport Button from '@/components/ui/button/Button.vue'\nimport { useFeatureFlags } from '@/composables/useFeatureFlags'\nimport {\n getSurveyCompletedStatus,\n submitSurvey\n} from '@/platform/cloud/onboarding/auth'\nimport { isCloud } from '@/platform/distribution/types'\nimport { useTelemetry } from '@/platform/telemetry'\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst { flags } = useFeatureFlags()\nconst onboardingSurveyEnabled = computed(() => flags.onboardingSurveyEnabled)\n\n// Check if survey is already completed on mount\nonMounted(async () => {\n if (!onboardingSurveyEnabled.value) {\n await router.replace({ name: 'cloud-user-check' })\n return\n }\n try {\n const surveyCompleted = await getSurveyCompletedStatus()\n if (surveyCompleted) {\n // User already completed survey, return to onboarding flow\n await router.replace({ name: 'cloud-user-check' })\n } else {\n // Track survey opened event\n if (isCloud) {\n useTelemetry()?.trackSurvey('opened')\n }\n }\n } catch (error) {\n console.error('Failed to check survey status:', error)\n }\n})\n\nconst activeStep = ref(1)\nconst totalSteps = 4\nconst progressPercent = computed(() =>\n Math.max(20, Math.min(100, ((activeStep.value - 1) / (totalSteps - 1)) * 100))\n)\n\nconst isSubmitting = ref(false)\n\nconst surveyData = ref({\n familiarity: '',\n useCase: '',\n useCaseOther: '',\n industry: '',\n industryOther: '',\n making: [] as string[]\n})\n\n// Options\nconst familiarityOptions = [\n { label: 'New to ComfyUI (never used it before)', value: 'new' },\n { label: 'Just getting started (following tutorials)', value: 'starting' },\n { label: 'Comfortable with basics', value: 'basics' },\n { label: 'Advanced user (custom workflows)', value: 'advanced' },\n { label: 'Expert (help others)', value: 'expert' }\n]\n\nconst purposeOptions = [\n { label: 'Personal projects/hobby', value: 'personal' },\n {\n label: 'Community contributions (nodes, workflows, etc.)',\n value: 'community'\n },\n { label: 'Client work (freelance)', value: 'client' },\n { label: 'My own workplace (in-house)', value: 'inhouse' },\n { label: 'Academic research', value: 'research' },\n { label: 'Other', value: 'other' }\n]\n\nconst industryOptions = [\n { label: 'Film, TV, & animation', value: 'film_tv_animation' },\n { label: 'Gaming', value: 'gaming' },\n { label: 'Marketing & advertising', value: 'marketing' },\n { label: 'Architecture', value: 'architecture' },\n { label: 'Product & graphic design', value: 'product_design' },\n { label: 'Fine art & illustration', value: 'fine_art' },\n { label: 'Software & technology', value: 'software' },\n { label: 'Education', value: 'education' },\n { label: 'Other', value: 'other' }\n]\n\nconst makingOptions = [\n { label: 'Images', value: 'images' },\n { label: 'Video & animation', value: 'video' },\n { label: '3D assets', value: '3d' },\n { label: 'Audio/music', value: 'audio' },\n { label: 'Custom nodes & workflows', value: 'custom_nodes' }\n]\n\n// Validation per step\nconst validStep1 = computed(() => !!surveyData.value.familiarity)\nconst validStep2 = computed(() => {\n if (!surveyData.value.useCase) return false\n if (surveyData.value.useCase === 'other') {\n return !!surveyData.value.useCaseOther?.trim()\n }\n return true\n})\nconst validStep3 = computed(() => {\n if (!surveyData.value.industry) return false\n if (surveyData.value.industry === 'other') {\n return !!surveyData.value.industryOther?.trim()\n }\n return true\n})\nconst validStep4 = computed(() => surveyData.value.making.length > 0)\n\nconst changeActiveStep = (step: number) => {\n activeStep.value = step\n}\n\nconst goTo = (step: number, activate: (val: string | number) => void) => {\n // keep Stepper panel and progress bar in sync; Stepper values are strings\n changeActiveStep(step)\n activate(String(step))\n}\n\n// Submit\nconst onSubmitSurvey = async () => {\n try {\n if (!onboardingSurveyEnabled.value) {\n await router.replace({ name: 'cloud-user-check' })\n return\n }\n isSubmitting.value = true\n // prepare payload with consistent structure\n const payload = {\n familiarity: surveyData.value.familiarity,\n useCase:\n surveyData.value.useCase === 'other'\n ? surveyData.value.useCaseOther?.trim() || 'other'\n : surveyData.value.useCase,\n industry:\n surveyData.value.industry === 'other'\n ? surveyData.value.industryOther?.trim() || 'other'\n : surveyData.value.industry,\n making: surveyData.value.making\n }\n\n await submitSurvey(payload)\n\n // Track survey submitted event with responses\n if (isCloud) {\n useTelemetry()?.trackSurvey('submitted', {\n industry: payload.industry,\n useCase: payload.useCase,\n familiarity: payload.familiarity,\n making: payload.making\n })\n }\n\n await router.push({ name: 'cloud-user-check' })\n } finally {\n isSubmitting.value = false\n }\n}\n</script>\n\n<style scoped>\n:deep(.p-progressbar .p-progressbar-value) {\n background-color: #f0ff41 !important;\n}\n:deep(.p-radiobutton-checked .p-radiobutton-box) {\n background-color: #f0ff41 !important;\n border-color: #f0ff41 !important;\n}\n:deep(.p-checkbox-checked .p-checkbox-box) {\n background-color: #f0ff41 !important;\n border-color: #f0ff41 !important;\n}\n</style>\n","<template>\n <div>\n <Stepper\n value=\"1\"\n class=\"flex h-[638px] max-h-[80vh] w-[320px] max-w-[90vw] flex-col\"\n >\n <ProgressBar\n :value=\"progressPercent\"\n :show-value=\"false\"\n class=\"mb-8 h-2\"\n />\n\n <StepPanels class=\"flex flex-1 flex-col p-0\">\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"1\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_familiarity')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in familiarityOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <RadioButton\n v-model=\"surveyData.familiarity\"\n :input-id=\"`fam-${opt.value}`\"\n name=\"familiarity\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`fam-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-between pt-4\">\n <span />\n <Button\n :disabled=\"!validStep1\"\n class=\"h-10 w-full border-none text-white\"\n @click=\"goTo(2, activateCallback)\"\n >\n {{ $t('g.next') }}\n </Button>\n </div>\n </StepPanel>\n\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"2\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_purpose')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in purposeOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <RadioButton\n v-model=\"surveyData.useCase\"\n :input-id=\"`purpose-${opt.value}`\"\n name=\"purpose\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`purpose-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n <div v-if=\"surveyData.useCase === 'other'\" class=\"mt-4 ml-8\">\n <InputText\n v-model=\"surveyData.useCaseOther\"\n class=\"w-full\"\n :placeholder=\"\n $t('cloudOnboarding.survey.options.industry.otherPlaceholder')\n \"\n />\n </div>\n </div>\n\n <div class=\"flex gap-6 pt-4\">\n <Button\n variant=\"secondary\"\n class=\"flex-1 text-white\"\n @click=\"goTo(1, activateCallback)\"\n >\n {{ $t('g.back') }}\n </Button>\n <Button\n :disabled=\"!validStep2\"\n class=\"h-10 flex-1 text-white\"\n @click=\"goTo(3, activateCallback)\"\n >\n {{ $t('g.next') }}\n </Button>\n </div>\n </StepPanel>\n\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"3\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_industry')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in industryOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <RadioButton\n v-model=\"surveyData.industry\"\n :input-id=\"`industry-${opt.value}`\"\n name=\"industry\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`industry-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n <div v-if=\"surveyData.industry === 'other'\" class=\"mt-4 ml-8\">\n <InputText\n v-model=\"surveyData.industryOther\"\n class=\"w-full\"\n :placeholder=\"\n $t('cloudOnboarding.survey.options.industry.otherPlaceholder')\n \"\n />\n </div>\n </div>\n\n <div class=\"flex gap-6 pt-4\">\n <Button\n variant=\"secondary\"\n class=\"flex-1 text-white\"\n @click=\"goTo(2, activateCallback)\"\n >\n {{ $t('g.back') }}\n </Button>\n <Button\n :disabled=\"!validStep3\"\n class=\"h-10 flex-1 border-none text-white\"\n @click=\"goTo(4, activateCallback)\"\n >\n {{ $t('g.next') }}\n </Button>\n </div>\n </StepPanel>\n\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"4\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_making')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in makingOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <Checkbox\n v-model=\"surveyData.making\"\n :input-id=\"`making-${opt.value}`\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`making-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n </div>\n\n <div class=\"flex gap-6 pt-4\">\n <Button\n variant=\"secondary\"\n class=\"flex-1 text-white\"\n @click=\"goTo(3, activateCallback)\"\n >\n {{ $t('g.back') }}\n </Button>\n <Button\n :disabled=\"!validStep4 || isSubmitting\"\n :loading=\"isSubmitting\"\n class=\"h-10 flex-1 border-none text-white\"\n @click=\"onSubmitSurvey\"\n >\n {{ $t('g.submit') }}\n </Button>\n </div>\n </StepPanel>\n </StepPanels>\n </Stepper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Checkbox from 'primevue/checkbox'\nimport InputText from 'primevue/inputtext'\nimport ProgressBar from 'primevue/progressbar'\nimport RadioButton from 'primevue/radiobutton'\nimport StepPanel from 'primevue/steppanel'\nimport StepPanels from 'primevue/steppanels'\nimport Stepper from 'primevue/stepper'\nimport { computed, onMounted, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\n\nimport Button from '@/components/ui/button/Button.vue'\nimport { useFeatureFlags } from '@/composables/useFeatureFlags'\nimport {\n getSurveyCompletedStatus,\n submitSurvey\n} from '@/platform/cloud/onboarding/auth'\nimport { isCloud } from '@/platform/distribution/types'\nimport { useTelemetry } from '@/platform/telemetry'\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst { flags } = useFeatureFlags()\nconst onboardingSurveyEnabled = computed(() => flags.onboardingSurveyEnabled)\n\n// Check if survey is already completed on mount\nonMounted(async () => {\n if (!onboardingSurveyEnabled.value) {\n await router.replace({ name: 'cloud-user-check' })\n return\n }\n try {\n const surveyCompleted = await getSurveyCompletedStatus()\n if (surveyCompleted) {\n // User already completed survey, return to onboarding flow\n await router.replace({ name: 'cloud-user-check' })\n } else {\n // Track survey opened event\n if (isCloud) {\n useTelemetry()?.trackSurvey('opened')\n }\n }\n } catch (error) {\n console.error('Failed to check survey status:', error)\n }\n})\n\nconst activeStep = ref(1)\nconst totalSteps = 4\nconst progressPercent = computed(() =>\n Math.max(20, Math.min(100, ((activeStep.value - 1) / (totalSteps - 1)) * 100))\n)\n\nconst isSubmitting = ref(false)\n\nconst surveyData = ref({\n familiarity: '',\n useCase: '',\n useCaseOther: '',\n industry: '',\n industryOther: '',\n making: [] as string[]\n})\n\n// Options\nconst familiarityOptions = [\n { label: 'New to ComfyUI (never used it before)', value: 'new' },\n { label: 'Just getting started (following tutorials)', value: 'starting' },\n { label: 'Comfortable with basics', value: 'basics' },\n { label: 'Advanced user (custom workflows)', value: 'advanced' },\n { label: 'Expert (help others)', value: 'expert' }\n]\n\nconst purposeOptions = [\n { label: 'Personal projects/hobby', value: 'personal' },\n {\n label: 'Community contributions (nodes, workflows, etc.)',\n value: 'community'\n },\n { label: 'Client work (freelance)', value: 'client' },\n { label: 'My own workplace (in-house)', value: 'inhouse' },\n { label: 'Academic research', value: 'research' },\n { label: 'Other', value: 'other' }\n]\n\nconst industryOptions = [\n { label: 'Film, TV, & animation', value: 'film_tv_animation' },\n { label: 'Gaming', value: 'gaming' },\n { label: 'Marketing & advertising', value: 'marketing' },\n { label: 'Architecture', value: 'architecture' },\n { label: 'Product & graphic design', value: 'product_design' },\n { label: 'Fine art & illustration', value: 'fine_art' },\n { label: 'Software & technology', value: 'software' },\n { label: 'Education', value: 'education' },\n { label: 'Other', value: 'other' }\n]\n\nconst makingOptions = [\n { label: 'Images', value: 'images' },\n { label: 'Video & animation', value: 'video' },\n { label: '3D assets', value: '3d' },\n { label: 'Audio/music', value: 'audio' },\n { label: 'Custom nodes & workflows', value: 'custom_nodes' }\n]\n\n// Validation per step\nconst validStep1 = computed(() => !!surveyData.value.familiarity)\nconst validStep2 = computed(() => {\n if (!surveyData.value.useCase) return false\n if (surveyData.value.useCase === 'other') {\n return !!surveyData.value.useCaseOther?.trim()\n }\n return true\n})\nconst validStep3 = computed(() => {\n if (!surveyData.value.industry) return false\n if (surveyData.value.industry === 'other') {\n return !!surveyData.value.industryOther?.trim()\n }\n return true\n})\nconst validStep4 = computed(() => surveyData.value.making.length > 0)\n\nconst changeActiveStep = (step: number) => {\n activeStep.value = step\n}\n\nconst goTo = (step: number, activate: (val: string | number) => void) => {\n // keep Stepper panel and progress bar in sync; Stepper values are strings\n changeActiveStep(step)\n activate(String(step))\n}\n\n// Submit\nconst onSubmitSurvey = async () => {\n try {\n if (!onboardingSurveyEnabled.value) {\n await router.replace({ name: 'cloud-user-check' })\n return\n }\n isSubmitting.value = true\n // prepare payload with consistent structure\n const payload = {\n familiarity: surveyData.value.familiarity,\n useCase:\n surveyData.value.useCase === 'other'\n ? surveyData.value.useCaseOther?.trim() || 'other'\n : surveyData.value.useCase,\n industry:\n surveyData.value.industry === 'other'\n ? surveyData.value.industryOther?.trim() || 'other'\n : surveyData.value.industry,\n making: surveyData.value.making\n }\n\n await submitSurvey(payload)\n\n // Track survey submitted event with responses\n if (isCloud) {\n useTelemetry()?.trackSurvey('submitted', {\n industry: payload.industry,\n useCase: payload.useCase,\n familiarity: payload.familiarity,\n making: payload.making\n })\n }\n\n await router.push({ name: 'cloud-user-check' })\n } finally {\n isSubmitting.value = false\n }\n}\n</script>\n\n<style scoped>\n:deep(.p-progressbar .p-progressbar-value) {\n background-color: #f0ff41 !important;\n}\n:deep(.p-radiobutton-checked .p-radiobutton-box) {\n background-color: #f0ff41 !important;\n border-color: #f0ff41 !important;\n}\n:deep(.p-checkbox-checked .p-checkbox-box) {\n background-color: #f0ff41 !important;\n border-color: #f0ff41 !important;\n}\n</style>\n"],"mappings":"29CC8QM,GAAa,0CA5BnB,KAAM,CAAE,EAAA,CAAA,EAAM,EAAA,EACR,EAAS,EAAA,EACT,CAAE,MAAA,CAAA,EAAU,GAAA,EACZ,EAA0B,EAAA,IAAe,EAAM,uBAAA,EAGrD,EAAU,SAAY,CACpB,GAAI,CAAC,EAAwB,MAAO,CAClC,MAAM,EAAO,QAAQ,CAAE,KAAM,kBAAA,CAAoB,EACjD,OAEF,GAAI,CACsB,MAAM,GAAA,EAG5B,MAAM,EAAO,QAAQ,CAAE,KAAM,kBAAA,CAAoB,EAG7C,GACF,EAAA,GAAgB,YAAY,QAAA,QAGzB,EAAO,CACd,QAAQ,MAAM,iCAAkC,CAAA,KAIpD,MAAM,EAAa,EAAI,CAAA,EAEjB,EAAkB,EAAA,IACtB,KAAK,IAAI,GAAI,KAAK,IAAI,KAAO,EAAW,MAAQ,IAAM,GAAa,GAAM,GAAA,CAAI,CAAA,EAGzE,EAAe,EAAI,EAAA,EAEnB,EAAa,EAAI,CACrB,YAAa,GACb,QAAS,GACT,aAAc,GACd,SAAU,GACV,cAAe,GACf,OAAQ,CAAA,EACT,EAGK,EAAqB,CACzB,CAAE,MAAO,wCAAyC,MAAO,OACzD,CAAE,MAAO,6CAA8C,MAAO,YAC9D,CAAE,MAAO,0BAA2B,MAAO,UAC3C,CAAE,MAAO,mCAAoC,MAAO,YACpD,CAAE,MAAO,uBAAwB,MAAO,WAGpC,EAAiB,CACrB,CAAE,MAAO,0BAA2B,MAAO,YAC3C,CACE,MAAO,mDACP,MAAO,aAET,CAAE,MAAO,0BAA2B,MAAO,UAC3C,CAAE,MAAO,8BAA+B,MAAO,WAC/C,CAAE,MAAO,oBAAqB,MAAO,YACrC,CAAE,MAAO,QAAS,MAAO,UAGrB,EAAkB,CACtB,CAAE,MAAO,wBAAyB,MAAO,qBACzC,CAAE,MAAO,SAAU,MAAO,UAC1B,CAAE,MAAO,0BAA2B,MAAO,aAC3C,CAAE,MAAO,eAAgB,MAAO,gBAChC,CAAE,MAAO,2BAA4B,MAAO,kBAC5C,CAAE,MAAO,0BAA2B,MAAO,YAC3C,CAAE,MAAO,wBAAyB,MAAO,YACzC,CAAE,MAAO,YAAa,MAAO,aAC7B,CAAE,MAAO,QAAS,MAAO,UAGrB,EAAgB,CACpB,CAAE,MAAO,SAAU,MAAO,UAC1B,CAAE,MAAO,oBAAqB,MAAO,SACrC,CAAE,MAAO,YAAa,MAAO,MAC7B,CAAE,MAAO,cAAe,MAAO,SAC/B,CAAE,MAAO,2BAA4B,MAAO,iBAIxC,EAAa,EAAA,IAAe,CAAC,CAAC,EAAW,MAAM,WAAA,EAC/C,EAAa,EAAA,IACZ,EAAW,MAAM,QAClB,EAAW,MAAM,UAAY,QACxB,CAAC,CAAC,EAAW,MAAM,cAAc,KAAA,EAEnC,GAJ+B,IAMlC,EAAa,EAAA,IACZ,EAAW,MAAM,SAClB,EAAW,MAAM,WAAa,QACzB,CAAC,CAAC,EAAW,MAAM,eAAe,KAAA,EAEpC,GAJgC,IAMnC,EAAa,EAAA,IAAe,EAAW,MAAM,OAAO,OAAS,CAAA,EAE7D,EAAA,EAAoB,GAAiB,CACzC,EAAW,MAAQ,GADf,oBAIA,EAAA,EAAA,CAAQ,EAAc,IAA6C,CAEvE,EAAiB,CAAA,EACjB,EAAS,OAAO,CAAA,CAAK,GAHjB,QAOA,EAAiB,EAAA,SAAY,CACjC,GAAI,CACF,GAAI,CAAC,EAAwB,MAAO,CAClC,MAAM,EAAO,QAAQ,CAAE,KAAM,kBAAA,CAAoB,EACjD,OAEF,EAAa,MAAQ,GAErB,MAAM,EAAU,CACd,YAAa,EAAW,MAAM,YAC9B,QACE,EAAW,MAAM,UAAY,QACzB,EAAW,MAAM,cAAc,KAAA,GAAU,QACzC,EAAW,MAAM,QACvB,SACE,EAAW,MAAM,WAAa,QAC1B,EAAW,MAAM,eAAe,KAAA,GAAU,QAC1C,EAAW,MAAM,SACvB,OAAQ,EAAW,MAAM,QAG3B,MAAM,GAAa,CAAA,EAGf,GACF,EAAA,GAAgB,YAAY,YAAa,CACvC,SAAU,EAAQ,SAClB,QAAS,EAAQ,QACjB,YAAa,EAAQ,YACrB,OAAQ,EAAQ,OACjB,EAGH,MAAM,EAAO,KAAK,CAAE,KAAM,kBAAA,CAAoB,UAE9C,EAAa,MAAQ,KAnCF"}
1
+ {"version":3,"file":"CloudSurveyView-IaiucCTP.js","names":[],"sources":["../../src/platform/cloud/onboarding/CloudSurveyView.vue","../../src/platform/cloud/onboarding/CloudSurveyView.vue"],"sourcesContent":["<template>\n <div>\n <Stepper\n value=\"1\"\n class=\"flex h-[638px] max-h-[80vh] w-[320px] max-w-[90vw] flex-col\"\n >\n <ProgressBar\n :value=\"progressPercent\"\n :show-value=\"false\"\n class=\"mb-8 h-2\"\n />\n\n <StepPanels class=\"flex flex-1 flex-col p-0\">\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"1\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_familiarity')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in familiarityOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <RadioButton\n v-model=\"surveyData.familiarity\"\n :input-id=\"`fam-${opt.value}`\"\n name=\"familiarity\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`fam-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-between pt-4\">\n <span />\n <Button\n :disabled=\"!validStep1\"\n class=\"h-10 w-full border-none text-white\"\n @click=\"goTo(2, activateCallback)\"\n >\n {{ $t('g.next') }}\n </Button>\n </div>\n </StepPanel>\n\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"2\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_purpose')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in purposeOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <RadioButton\n v-model=\"surveyData.useCase\"\n :input-id=\"`purpose-${opt.value}`\"\n name=\"purpose\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`purpose-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n <div v-if=\"surveyData.useCase === 'other'\" class=\"mt-4 ml-8\">\n <InputText\n v-model=\"surveyData.useCaseOther\"\n class=\"w-full\"\n :placeholder=\"\n $t('cloudOnboarding.survey.options.industry.otherPlaceholder')\n \"\n />\n </div>\n </div>\n\n <div class=\"flex gap-6 pt-4\">\n <Button\n variant=\"secondary\"\n class=\"flex-1 text-white\"\n @click=\"goTo(1, activateCallback)\"\n >\n {{ $t('g.back') }}\n </Button>\n <Button\n :disabled=\"!validStep2\"\n class=\"h-10 flex-1 text-white\"\n @click=\"goTo(3, activateCallback)\"\n >\n {{ $t('g.next') }}\n </Button>\n </div>\n </StepPanel>\n\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"3\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_industry')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in industryOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <RadioButton\n v-model=\"surveyData.industry\"\n :input-id=\"`industry-${opt.value}`\"\n name=\"industry\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`industry-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n <div v-if=\"surveyData.industry === 'other'\" class=\"mt-4 ml-8\">\n <InputText\n v-model=\"surveyData.industryOther\"\n class=\"w-full\"\n :placeholder=\"\n $t('cloudOnboarding.survey.options.industry.otherPlaceholder')\n \"\n />\n </div>\n </div>\n\n <div class=\"flex gap-6 pt-4\">\n <Button\n variant=\"secondary\"\n class=\"flex-1 text-white\"\n @click=\"goTo(2, activateCallback)\"\n >\n {{ $t('g.back') }}\n </Button>\n <Button\n :disabled=\"!validStep3\"\n class=\"h-10 flex-1 border-none text-white\"\n @click=\"goTo(4, activateCallback)\"\n >\n {{ $t('g.next') }}\n </Button>\n </div>\n </StepPanel>\n\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"4\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_making')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in makingOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <Checkbox\n v-model=\"surveyData.making\"\n :input-id=\"`making-${opt.value}`\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`making-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n </div>\n\n <div class=\"flex gap-6 pt-4\">\n <Button\n variant=\"secondary\"\n class=\"flex-1 text-white\"\n @click=\"goTo(3, activateCallback)\"\n >\n {{ $t('g.back') }}\n </Button>\n <Button\n :disabled=\"!validStep4 || isSubmitting\"\n :loading=\"isSubmitting\"\n class=\"h-10 flex-1 border-none text-white\"\n @click=\"onSubmitSurvey\"\n >\n {{ $t('g.submit') }}\n </Button>\n </div>\n </StepPanel>\n </StepPanels>\n </Stepper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Checkbox from 'primevue/checkbox'\nimport InputText from 'primevue/inputtext'\nimport ProgressBar from 'primevue/progressbar'\nimport RadioButton from 'primevue/radiobutton'\nimport StepPanel from 'primevue/steppanel'\nimport StepPanels from 'primevue/steppanels'\nimport Stepper from 'primevue/stepper'\nimport { computed, onMounted, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\n\nimport Button from '@/components/ui/button/Button.vue'\nimport { useFeatureFlags } from '@/composables/useFeatureFlags'\nimport {\n getSurveyCompletedStatus,\n submitSurvey\n} from '@/platform/cloud/onboarding/auth'\nimport { isCloud } from '@/platform/distribution/types'\nimport { useTelemetry } from '@/platform/telemetry'\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst { flags } = useFeatureFlags()\nconst onboardingSurveyEnabled = computed(() => flags.onboardingSurveyEnabled)\n\n// Check if survey is already completed on mount\nonMounted(async () => {\n if (!onboardingSurveyEnabled.value) {\n await router.replace({ name: 'cloud-user-check' })\n return\n }\n try {\n const surveyCompleted = await getSurveyCompletedStatus()\n if (surveyCompleted) {\n // User already completed survey, return to onboarding flow\n await router.replace({ name: 'cloud-user-check' })\n } else {\n // Track survey opened event\n if (isCloud) {\n useTelemetry()?.trackSurvey('opened')\n }\n }\n } catch (error) {\n console.error('Failed to check survey status:', error)\n }\n})\n\nconst activeStep = ref(1)\nconst totalSteps = 4\nconst progressPercent = computed(() =>\n Math.max(20, Math.min(100, ((activeStep.value - 1) / (totalSteps - 1)) * 100))\n)\n\nconst isSubmitting = ref(false)\n\nconst surveyData = ref({\n familiarity: '',\n useCase: '',\n useCaseOther: '',\n industry: '',\n industryOther: '',\n making: [] as string[]\n})\n\n// Options\nconst familiarityOptions = [\n { label: 'New to ComfyUI (never used it before)', value: 'new' },\n { label: 'Just getting started (following tutorials)', value: 'starting' },\n { label: 'Comfortable with basics', value: 'basics' },\n { label: 'Advanced user (custom workflows)', value: 'advanced' },\n { label: 'Expert (help others)', value: 'expert' }\n]\n\nconst purposeOptions = [\n { label: 'Personal projects/hobby', value: 'personal' },\n {\n label: 'Community contributions (nodes, workflows, etc.)',\n value: 'community'\n },\n { label: 'Client work (freelance)', value: 'client' },\n { label: 'My own workplace (in-house)', value: 'inhouse' },\n { label: 'Academic research', value: 'research' },\n { label: 'Other', value: 'other' }\n]\n\nconst industryOptions = [\n { label: 'Film, TV, & animation', value: 'film_tv_animation' },\n { label: 'Gaming', value: 'gaming' },\n { label: 'Marketing & advertising', value: 'marketing' },\n { label: 'Architecture', value: 'architecture' },\n { label: 'Product & graphic design', value: 'product_design' },\n { label: 'Fine art & illustration', value: 'fine_art' },\n { label: 'Software & technology', value: 'software' },\n { label: 'Education', value: 'education' },\n { label: 'Other', value: 'other' }\n]\n\nconst makingOptions = [\n { label: 'Images', value: 'images' },\n { label: 'Video & animation', value: 'video' },\n { label: '3D assets', value: '3d' },\n { label: 'Audio/music', value: 'audio' },\n { label: 'Custom nodes & workflows', value: 'custom_nodes' }\n]\n\n// Validation per step\nconst validStep1 = computed(() => !!surveyData.value.familiarity)\nconst validStep2 = computed(() => {\n if (!surveyData.value.useCase) return false\n if (surveyData.value.useCase === 'other') {\n return !!surveyData.value.useCaseOther?.trim()\n }\n return true\n})\nconst validStep3 = computed(() => {\n if (!surveyData.value.industry) return false\n if (surveyData.value.industry === 'other') {\n return !!surveyData.value.industryOther?.trim()\n }\n return true\n})\nconst validStep4 = computed(() => surveyData.value.making.length > 0)\n\nconst changeActiveStep = (step: number) => {\n activeStep.value = step\n}\n\nconst goTo = (step: number, activate: (val: string | number) => void) => {\n // keep Stepper panel and progress bar in sync; Stepper values are strings\n changeActiveStep(step)\n activate(String(step))\n}\n\n// Submit\nconst onSubmitSurvey = async () => {\n try {\n if (!onboardingSurveyEnabled.value) {\n await router.replace({ name: 'cloud-user-check' })\n return\n }\n isSubmitting.value = true\n // prepare payload with consistent structure\n const payload = {\n familiarity: surveyData.value.familiarity,\n useCase:\n surveyData.value.useCase === 'other'\n ? surveyData.value.useCaseOther?.trim() || 'other'\n : surveyData.value.useCase,\n industry:\n surveyData.value.industry === 'other'\n ? surveyData.value.industryOther?.trim() || 'other'\n : surveyData.value.industry,\n making: surveyData.value.making\n }\n\n await submitSurvey(payload)\n\n // Track survey submitted event with responses\n if (isCloud) {\n useTelemetry()?.trackSurvey('submitted', {\n industry: payload.industry,\n useCase: payload.useCase,\n familiarity: payload.familiarity,\n making: payload.making\n })\n }\n\n await router.push({ name: 'cloud-user-check' })\n } finally {\n isSubmitting.value = false\n }\n}\n</script>\n\n<style scoped>\n:deep(.p-progressbar .p-progressbar-value) {\n background-color: #f0ff41 !important;\n}\n:deep(.p-radiobutton-checked .p-radiobutton-box) {\n background-color: #f0ff41 !important;\n border-color: #f0ff41 !important;\n}\n:deep(.p-checkbox-checked .p-checkbox-box) {\n background-color: #f0ff41 !important;\n border-color: #f0ff41 !important;\n}\n</style>\n","<template>\n <div>\n <Stepper\n value=\"1\"\n class=\"flex h-[638px] max-h-[80vh] w-[320px] max-w-[90vw] flex-col\"\n >\n <ProgressBar\n :value=\"progressPercent\"\n :show-value=\"false\"\n class=\"mb-8 h-2\"\n />\n\n <StepPanels class=\"flex flex-1 flex-col p-0\">\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"1\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_familiarity')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in familiarityOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <RadioButton\n v-model=\"surveyData.familiarity\"\n :input-id=\"`fam-${opt.value}`\"\n name=\"familiarity\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`fam-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-between pt-4\">\n <span />\n <Button\n :disabled=\"!validStep1\"\n class=\"h-10 w-full border-none text-white\"\n @click=\"goTo(2, activateCallback)\"\n >\n {{ $t('g.next') }}\n </Button>\n </div>\n </StepPanel>\n\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"2\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_purpose')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in purposeOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <RadioButton\n v-model=\"surveyData.useCase\"\n :input-id=\"`purpose-${opt.value}`\"\n name=\"purpose\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`purpose-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n <div v-if=\"surveyData.useCase === 'other'\" class=\"mt-4 ml-8\">\n <InputText\n v-model=\"surveyData.useCaseOther\"\n class=\"w-full\"\n :placeholder=\"\n $t('cloudOnboarding.survey.options.industry.otherPlaceholder')\n \"\n />\n </div>\n </div>\n\n <div class=\"flex gap-6 pt-4\">\n <Button\n variant=\"secondary\"\n class=\"flex-1 text-white\"\n @click=\"goTo(1, activateCallback)\"\n >\n {{ $t('g.back') }}\n </Button>\n <Button\n :disabled=\"!validStep2\"\n class=\"h-10 flex-1 text-white\"\n @click=\"goTo(3, activateCallback)\"\n >\n {{ $t('g.next') }}\n </Button>\n </div>\n </StepPanel>\n\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"3\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_industry')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in industryOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <RadioButton\n v-model=\"surveyData.industry\"\n :input-id=\"`industry-${opt.value}`\"\n name=\"industry\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`industry-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n <div v-if=\"surveyData.industry === 'other'\" class=\"mt-4 ml-8\">\n <InputText\n v-model=\"surveyData.industryOther\"\n class=\"w-full\"\n :placeholder=\"\n $t('cloudOnboarding.survey.options.industry.otherPlaceholder')\n \"\n />\n </div>\n </div>\n\n <div class=\"flex gap-6 pt-4\">\n <Button\n variant=\"secondary\"\n class=\"flex-1 text-white\"\n @click=\"goTo(2, activateCallback)\"\n >\n {{ $t('g.back') }}\n </Button>\n <Button\n :disabled=\"!validStep3\"\n class=\"h-10 flex-1 border-none text-white\"\n @click=\"goTo(4, activateCallback)\"\n >\n {{ $t('g.next') }}\n </Button>\n </div>\n </StepPanel>\n\n <StepPanel\n v-slot=\"{ activateCallback }\"\n value=\"4\"\n class=\"flex min-h-full flex-1 flex-col justify-between bg-transparent\"\n >\n <div>\n <label class=\"mb-8 block text-lg font-medium\">{{\n t('cloudSurvey_steps_making')\n }}</label>\n <div class=\"flex flex-col gap-6\">\n <div\n v-for=\"opt in makingOptions\"\n :key=\"opt.value\"\n class=\"flex items-center gap-3\"\n >\n <Checkbox\n v-model=\"surveyData.making\"\n :input-id=\"`making-${opt.value}`\"\n :value=\"opt.value\"\n />\n <label\n :for=\"`making-${opt.value}`\"\n class=\"cursor-pointer text-sm\"\n >{{ opt.label }}</label\n >\n </div>\n </div>\n </div>\n\n <div class=\"flex gap-6 pt-4\">\n <Button\n variant=\"secondary\"\n class=\"flex-1 text-white\"\n @click=\"goTo(3, activateCallback)\"\n >\n {{ $t('g.back') }}\n </Button>\n <Button\n :disabled=\"!validStep4 || isSubmitting\"\n :loading=\"isSubmitting\"\n class=\"h-10 flex-1 border-none text-white\"\n @click=\"onSubmitSurvey\"\n >\n {{ $t('g.submit') }}\n </Button>\n </div>\n </StepPanel>\n </StepPanels>\n </Stepper>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Checkbox from 'primevue/checkbox'\nimport InputText from 'primevue/inputtext'\nimport ProgressBar from 'primevue/progressbar'\nimport RadioButton from 'primevue/radiobutton'\nimport StepPanel from 'primevue/steppanel'\nimport StepPanels from 'primevue/steppanels'\nimport Stepper from 'primevue/stepper'\nimport { computed, onMounted, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useRouter } from 'vue-router'\n\nimport Button from '@/components/ui/button/Button.vue'\nimport { useFeatureFlags } from '@/composables/useFeatureFlags'\nimport {\n getSurveyCompletedStatus,\n submitSurvey\n} from '@/platform/cloud/onboarding/auth'\nimport { isCloud } from '@/platform/distribution/types'\nimport { useTelemetry } from '@/platform/telemetry'\n\nconst { t } = useI18n()\nconst router = useRouter()\nconst { flags } = useFeatureFlags()\nconst onboardingSurveyEnabled = computed(() => flags.onboardingSurveyEnabled)\n\n// Check if survey is already completed on mount\nonMounted(async () => {\n if (!onboardingSurveyEnabled.value) {\n await router.replace({ name: 'cloud-user-check' })\n return\n }\n try {\n const surveyCompleted = await getSurveyCompletedStatus()\n if (surveyCompleted) {\n // User already completed survey, return to onboarding flow\n await router.replace({ name: 'cloud-user-check' })\n } else {\n // Track survey opened event\n if (isCloud) {\n useTelemetry()?.trackSurvey('opened')\n }\n }\n } catch (error) {\n console.error('Failed to check survey status:', error)\n }\n})\n\nconst activeStep = ref(1)\nconst totalSteps = 4\nconst progressPercent = computed(() =>\n Math.max(20, Math.min(100, ((activeStep.value - 1) / (totalSteps - 1)) * 100))\n)\n\nconst isSubmitting = ref(false)\n\nconst surveyData = ref({\n familiarity: '',\n useCase: '',\n useCaseOther: '',\n industry: '',\n industryOther: '',\n making: [] as string[]\n})\n\n// Options\nconst familiarityOptions = [\n { label: 'New to ComfyUI (never used it before)', value: 'new' },\n { label: 'Just getting started (following tutorials)', value: 'starting' },\n { label: 'Comfortable with basics', value: 'basics' },\n { label: 'Advanced user (custom workflows)', value: 'advanced' },\n { label: 'Expert (help others)', value: 'expert' }\n]\n\nconst purposeOptions = [\n { label: 'Personal projects/hobby', value: 'personal' },\n {\n label: 'Community contributions (nodes, workflows, etc.)',\n value: 'community'\n },\n { label: 'Client work (freelance)', value: 'client' },\n { label: 'My own workplace (in-house)', value: 'inhouse' },\n { label: 'Academic research', value: 'research' },\n { label: 'Other', value: 'other' }\n]\n\nconst industryOptions = [\n { label: 'Film, TV, & animation', value: 'film_tv_animation' },\n { label: 'Gaming', value: 'gaming' },\n { label: 'Marketing & advertising', value: 'marketing' },\n { label: 'Architecture', value: 'architecture' },\n { label: 'Product & graphic design', value: 'product_design' },\n { label: 'Fine art & illustration', value: 'fine_art' },\n { label: 'Software & technology', value: 'software' },\n { label: 'Education', value: 'education' },\n { label: 'Other', value: 'other' }\n]\n\nconst makingOptions = [\n { label: 'Images', value: 'images' },\n { label: 'Video & animation', value: 'video' },\n { label: '3D assets', value: '3d' },\n { label: 'Audio/music', value: 'audio' },\n { label: 'Custom nodes & workflows', value: 'custom_nodes' }\n]\n\n// Validation per step\nconst validStep1 = computed(() => !!surveyData.value.familiarity)\nconst validStep2 = computed(() => {\n if (!surveyData.value.useCase) return false\n if (surveyData.value.useCase === 'other') {\n return !!surveyData.value.useCaseOther?.trim()\n }\n return true\n})\nconst validStep3 = computed(() => {\n if (!surveyData.value.industry) return false\n if (surveyData.value.industry === 'other') {\n return !!surveyData.value.industryOther?.trim()\n }\n return true\n})\nconst validStep4 = computed(() => surveyData.value.making.length > 0)\n\nconst changeActiveStep = (step: number) => {\n activeStep.value = step\n}\n\nconst goTo = (step: number, activate: (val: string | number) => void) => {\n // keep Stepper panel and progress bar in sync; Stepper values are strings\n changeActiveStep(step)\n activate(String(step))\n}\n\n// Submit\nconst onSubmitSurvey = async () => {\n try {\n if (!onboardingSurveyEnabled.value) {\n await router.replace({ name: 'cloud-user-check' })\n return\n }\n isSubmitting.value = true\n // prepare payload with consistent structure\n const payload = {\n familiarity: surveyData.value.familiarity,\n useCase:\n surveyData.value.useCase === 'other'\n ? surveyData.value.useCaseOther?.trim() || 'other'\n : surveyData.value.useCase,\n industry:\n surveyData.value.industry === 'other'\n ? surveyData.value.industryOther?.trim() || 'other'\n : surveyData.value.industry,\n making: surveyData.value.making\n }\n\n await submitSurvey(payload)\n\n // Track survey submitted event with responses\n if (isCloud) {\n useTelemetry()?.trackSurvey('submitted', {\n industry: payload.industry,\n useCase: payload.useCase,\n familiarity: payload.familiarity,\n making: payload.making\n })\n }\n\n await router.push({ name: 'cloud-user-check' })\n } finally {\n isSubmitting.value = false\n }\n}\n</script>\n\n<style scoped>\n:deep(.p-progressbar .p-progressbar-value) {\n background-color: #f0ff41 !important;\n}\n:deep(.p-radiobutton-checked .p-radiobutton-box) {\n background-color: #f0ff41 !important;\n border-color: #f0ff41 !important;\n}\n:deep(.p-checkbox-checked .p-checkbox-box) {\n background-color: #f0ff41 !important;\n border-color: #f0ff41 !important;\n}\n</style>\n"],"mappings":"29CC8QM,GAAa,0CA5BnB,KAAM,CAAE,EAAA,CAAA,EAAM,EAAA,EACR,EAAS,EAAA,EACT,CAAE,MAAA,CAAA,EAAU,GAAA,EACZ,EAA0B,EAAA,IAAe,EAAM,uBAAA,EAGrD,EAAU,SAAY,CACpB,GAAI,CAAC,EAAwB,MAAO,CAClC,MAAM,EAAO,QAAQ,CAAE,KAAM,kBAAA,CAAoB,EACjD,OAEF,GAAI,CACsB,MAAM,GAAA,EAG5B,MAAM,EAAO,QAAQ,CAAE,KAAM,kBAAA,CAAoB,EAG7C,GACF,EAAA,GAAgB,YAAY,QAAA,QAGzB,EAAO,CACd,QAAQ,MAAM,iCAAkC,CAAA,KAIpD,MAAM,EAAa,EAAI,CAAA,EAEjB,EAAkB,EAAA,IACtB,KAAK,IAAI,GAAI,KAAK,IAAI,KAAO,EAAW,MAAQ,IAAM,GAAa,GAAM,GAAA,CAAI,CAAA,EAGzE,EAAe,EAAI,EAAA,EAEnB,EAAa,EAAI,CACrB,YAAa,GACb,QAAS,GACT,aAAc,GACd,SAAU,GACV,cAAe,GACf,OAAQ,CAAA,EACT,EAGK,EAAqB,CACzB,CAAE,MAAO,wCAAyC,MAAO,OACzD,CAAE,MAAO,6CAA8C,MAAO,YAC9D,CAAE,MAAO,0BAA2B,MAAO,UAC3C,CAAE,MAAO,mCAAoC,MAAO,YACpD,CAAE,MAAO,uBAAwB,MAAO,WAGpC,EAAiB,CACrB,CAAE,MAAO,0BAA2B,MAAO,YAC3C,CACE,MAAO,mDACP,MAAO,aAET,CAAE,MAAO,0BAA2B,MAAO,UAC3C,CAAE,MAAO,8BAA+B,MAAO,WAC/C,CAAE,MAAO,oBAAqB,MAAO,YACrC,CAAE,MAAO,QAAS,MAAO,UAGrB,EAAkB,CACtB,CAAE,MAAO,wBAAyB,MAAO,qBACzC,CAAE,MAAO,SAAU,MAAO,UAC1B,CAAE,MAAO,0BAA2B,MAAO,aAC3C,CAAE,MAAO,eAAgB,MAAO,gBAChC,CAAE,MAAO,2BAA4B,MAAO,kBAC5C,CAAE,MAAO,0BAA2B,MAAO,YAC3C,CAAE,MAAO,wBAAyB,MAAO,YACzC,CAAE,MAAO,YAAa,MAAO,aAC7B,CAAE,MAAO,QAAS,MAAO,UAGrB,EAAgB,CACpB,CAAE,MAAO,SAAU,MAAO,UAC1B,CAAE,MAAO,oBAAqB,MAAO,SACrC,CAAE,MAAO,YAAa,MAAO,MAC7B,CAAE,MAAO,cAAe,MAAO,SAC/B,CAAE,MAAO,2BAA4B,MAAO,iBAIxC,EAAa,EAAA,IAAe,CAAC,CAAC,EAAW,MAAM,WAAA,EAC/C,EAAa,EAAA,IACZ,EAAW,MAAM,QAClB,EAAW,MAAM,UAAY,QACxB,CAAC,CAAC,EAAW,MAAM,cAAc,KAAA,EAEnC,GAJ+B,IAMlC,EAAa,EAAA,IACZ,EAAW,MAAM,SAClB,EAAW,MAAM,WAAa,QACzB,CAAC,CAAC,EAAW,MAAM,eAAe,KAAA,EAEpC,GAJgC,IAMnC,EAAa,EAAA,IAAe,EAAW,MAAM,OAAO,OAAS,CAAA,EAE7D,EAAA,EAAoB,GAAiB,CACzC,EAAW,MAAQ,GADf,oBAIA,EAAA,EAAA,CAAQ,EAAc,IAA6C,CAEvE,EAAiB,CAAA,EACjB,EAAS,OAAO,CAAA,CAAK,GAHjB,QAOA,EAAiB,EAAA,SAAY,CACjC,GAAI,CACF,GAAI,CAAC,EAAwB,MAAO,CAClC,MAAM,EAAO,QAAQ,CAAE,KAAM,kBAAA,CAAoB,EACjD,OAEF,EAAa,MAAQ,GAErB,MAAM,EAAU,CACd,YAAa,EAAW,MAAM,YAC9B,QACE,EAAW,MAAM,UAAY,QACzB,EAAW,MAAM,cAAc,KAAA,GAAU,QACzC,EAAW,MAAM,QACvB,SACE,EAAW,MAAM,WAAa,QAC1B,EAAW,MAAM,eAAe,KAAA,GAAU,QAC1C,EAAW,MAAM,SACvB,OAAQ,EAAW,MAAM,QAG3B,MAAM,GAAa,CAAA,EAGf,GACF,EAAA,GAAgB,YAAY,YAAa,CACvC,SAAU,EAAQ,SAClB,QAAS,EAAQ,QACjB,YAAa,EAAQ,YACrB,OAAQ,EAAQ,OACjB,EAGH,MAAM,EAAO,KAAK,CAAE,KAAM,kBAAA,CAAoB,UAE9C,EAAa,MAAQ,KAnCF"}
@@ -0,0 +1 @@
1
+ import"./vendor-primevue-DcMRXJN3.js";import"./vendor-other-DlQF6V2E.js";import"./api-Dwq2LQIW.js";import"./remoteConfig-CZcEXsZS.js";import"./colorUtil-CzxntCbX.js";import"./useErrorHandling-Cfa5N_7c.js";import"./Button-Do2I1OAA.js";import"./PanelTemplate-BJda9e5J.js";import"./dialogService-YG0RH337.js";import"./vendor-tiptap-_UqYL7N_.js";import"./vendor-xterm-BU_lcTPR.js";import"./vendor-three-BFcUNSs9.js";import"./markdownRendererUtil-DglHsU8t.js";import"./userStore-BAS9m9W6.js";import{t as y}from"./ComfyQueueButton-HjSIKZKO.js";export{y as default};
@@ -1,3 +1,3 @@
1
- var I=Object.defineProperty;var u=(_,t)=>I(_,"name",{value:t,configurable:!0});import{F as T,x as U}from"./vendor-primevue-DcMRXJN3.js";import{$o as z,Ba as E,Do as f,Ha as P,Jo as m,Ka as W,No as F,Oo as b,Ua as h,Va as g,Xo as k,Ya as w,do as i,go as B,qa as S,za as s}from"./vendor-other-DlQF6V2E.js";import{m as D,n as K}from"./vendor-vue-D9IUuwPJ.js";import{Lt as L}from"./api-CUAc7rDA.js";import{t as O}from"./Button-Do2I1OAA.js";import{Or as j,P as H,_n as q,ft as v,mt as R,vt as G,yr as J}from"./dialogService-BZ1FmjZL.js";import{t as M}from"./_plugin-vue_export-helper-PHE0iSCb.js";import{t as X}from"./graphHasMissingNodes-C79Wi51S.js";var Y=["aria-label"],A=1,Z=w({__name:"BatchCountEdit",setup(_){const{batchCount:t}=D(q()),o=J(),c=s(()=>o.get("Comfy.QueueButton.BatchCountLimit")),d=u(n=>{let e;if(n){const a=t.value-1;e=Math.min(a*2,c.value)}else{const a=t.value+1;e=Math.floor(a/2)}t.value=e},"handleClick");return(n,e)=>{const a=B("tooltip");return b((i(),h("div",{class:"batch-count","aria-label":n.$t("menu.batchCount")},[S(m(T),{modelValue:m(t),"onUpdate:modelValue":e[0]||(e[0]=p=>F(t)?t.value=p:null),class:"w-14",min:A,max:c.value,fluid:"","show-buttons":"",pt:{incrementButton:{class:"w-6",onmousedown:u(()=>{d(!0)},"onmousedown")},decrementButton:{class:"w-6",onmousedown:u(()=>{d(!1)},"onmousedown")}}},null,8,["modelValue","max","pt"])],8,Y)),[[a,{value:n.$t("menu.batchCount"),showDelay:600},void 0,{bottom:!0}]])}}}),ee=M(Z,[["__scopeId","data-v-19217ad4"]]),te={class:"queue-button-group flex"},oe=w({__name:"ComfyQueueButton",setup(_){const t=G(),{mode:o,batchCount:c}=D(q()),d=R(),n=s(()=>X(H.rootGraph,d.nodeDefsByName)),{t:e}=K(),a=s(()=>{const l={disabled:{key:"disabled",label:e("menu.run"),tooltip:e("menu.disabledTooltip"),command:u(()=>{o.value="disabled"},"command")},change:{key:"change",label:`${e("menu.run")} (${e("menu.onChange")})`,tooltip:e("menu.onChangeTooltip"),command:u(()=>{v()?.trackUiButtonClicked({button_id:"queue_mode_option_run_on_change_selected"}),o.value="change"},"command")}};return L||(l.instant={key:"instant",label:`${e("menu.run")} (${e("menu.instant")})`,tooltip:e("menu.instantTooltip"),command:u(()=>{v()?.trackUiButtonClicked({button_id:"queue_mode_option_run_instant_selected"}),o.value="instant"},"command")}),l}),p=s(()=>a.value[o.value]||a.value.disabled),x=s(()=>Object.values(a.value)),Q=s(()=>n.value?"icon-[lucide--triangle-alert]":t.shiftDown?"icon-[lucide--list-start]":o.value==="disabled"?"icon-[lucide--play]":o.value==="instant"?"icon-[lucide--fast-forward]":o.value==="change"?"icon-[lucide--step-forward]":"icon-[lucide--play]"),N=s(()=>n.value?e("menu.runWorkflowDisabled"):t.shiftDown?e("menu.runWorkflowFront"):e("menu.runWorkflow")),$=j(),V=u(async l=>{const C="shiftKey"in l&&l.shiftKey?"Comfy.QueuePromptFront":"Comfy.QueuePrompt";c.value>1&&v()?.trackUiButtonClicked({button_id:"queue_run_multiple_batches_submitted"}),await $.execute(C,{metadata:{subscribe_to_run:!1,trigger_source:"button"}})},"queuePrompt");return(l,C)=>{const y=B("tooltip");return i(),h("div",te,[b((i(),g(m(U),{class:"comfyui-queue-button",label:String(p.value?.label??""),severity:"primary",size:"small",model:x.value,"data-testid":"queue-button",onClick:V},{icon:f(()=>[E("i",{class:k(Q.value)},null,2)]),item:f(({item:r})=>[b((i(),g(O,{variant:r.key===m(o)?"primary":"secondary",size:"sm",class:"w-full justify-start"},{default:f(()=>[r.icon?(i(),h("i",{key:0,class:k(r.icon)},null,2)):P("",!0),W(" "+z(String(r.label??"")),1)]),_:2},1032,["variant"])),[[y,{value:r.tooltip,showDelay:600}]])]),_:1},8,["label","model"])),[[y,{value:N.value,showDelay:600},void 0,{bottom:!0}]]),S(ee)])}}}),me=M(oe,[["__scopeId","data-v-214102f7"]]);export{me as t};
1
+ var I=Object.defineProperty;var u=(_,t)=>I(_,"name",{value:t,configurable:!0});import{F as T,x as U}from"./vendor-primevue-DcMRXJN3.js";import{$o as z,Ba as E,Do as f,Ha as P,Jo as m,Ka as W,No as F,Oo as b,Ua as h,Va as g,Xo as k,Ya as w,do as i,go as B,qa as S,za as s}from"./vendor-other-DlQF6V2E.js";import{m as D,n as K}from"./vendor-vue-D9IUuwPJ.js";import{Lt as L}from"./api-Dwq2LQIW.js";import{t as O}from"./Button-Do2I1OAA.js";import{Or as j,P as H,_n as q,ft as v,mt as R,vt as G,yr as J}from"./dialogService-YG0RH337.js";import{t as M}from"./_plugin-vue_export-helper-PHE0iSCb.js";import{t as X}from"./graphHasMissingNodes-BhD1N6zI.js";var Y=["aria-label"],A=1,Z=w({__name:"BatchCountEdit",setup(_){const{batchCount:t}=D(q()),o=J(),c=s(()=>o.get("Comfy.QueueButton.BatchCountLimit")),d=u(n=>{let e;if(n){const a=t.value-1;e=Math.min(a*2,c.value)}else{const a=t.value+1;e=Math.floor(a/2)}t.value=e},"handleClick");return(n,e)=>{const a=B("tooltip");return b((i(),h("div",{class:"batch-count","aria-label":n.$t("menu.batchCount")},[S(m(T),{modelValue:m(t),"onUpdate:modelValue":e[0]||(e[0]=p=>F(t)?t.value=p:null),class:"w-14",min:A,max:c.value,fluid:"","show-buttons":"",pt:{incrementButton:{class:"w-6",onmousedown:u(()=>{d(!0)},"onmousedown")},decrementButton:{class:"w-6",onmousedown:u(()=>{d(!1)},"onmousedown")}}},null,8,["modelValue","max","pt"])],8,Y)),[[a,{value:n.$t("menu.batchCount"),showDelay:600},void 0,{bottom:!0}]])}}}),ee=M(Z,[["__scopeId","data-v-19217ad4"]]),te={class:"queue-button-group flex"},oe=w({__name:"ComfyQueueButton",setup(_){const t=G(),{mode:o,batchCount:c}=D(q()),d=R(),n=s(()=>X(H.rootGraph,d.nodeDefsByName)),{t:e}=K(),a=s(()=>{const l={disabled:{key:"disabled",label:e("menu.run"),tooltip:e("menu.disabledTooltip"),command:u(()=>{o.value="disabled"},"command")},change:{key:"change",label:`${e("menu.run")} (${e("menu.onChange")})`,tooltip:e("menu.onChangeTooltip"),command:u(()=>{v()?.trackUiButtonClicked({button_id:"queue_mode_option_run_on_change_selected"}),o.value="change"},"command")}};return L||(l.instant={key:"instant",label:`${e("menu.run")} (${e("menu.instant")})`,tooltip:e("menu.instantTooltip"),command:u(()=>{v()?.trackUiButtonClicked({button_id:"queue_mode_option_run_instant_selected"}),o.value="instant"},"command")}),l}),p=s(()=>a.value[o.value]||a.value.disabled),x=s(()=>Object.values(a.value)),Q=s(()=>n.value?"icon-[lucide--triangle-alert]":t.shiftDown?"icon-[lucide--list-start]":o.value==="disabled"?"icon-[lucide--play]":o.value==="instant"?"icon-[lucide--fast-forward]":o.value==="change"?"icon-[lucide--step-forward]":"icon-[lucide--play]"),N=s(()=>n.value?e("menu.runWorkflowDisabled"):t.shiftDown?e("menu.runWorkflowFront"):e("menu.runWorkflow")),$=j(),V=u(async l=>{const C="shiftKey"in l&&l.shiftKey?"Comfy.QueuePromptFront":"Comfy.QueuePrompt";c.value>1&&v()?.trackUiButtonClicked({button_id:"queue_run_multiple_batches_submitted"}),await $.execute(C,{metadata:{subscribe_to_run:!1,trigger_source:"button"}})},"queuePrompt");return(l,C)=>{const y=B("tooltip");return i(),h("div",te,[b((i(),g(m(U),{class:"comfyui-queue-button",label:String(p.value?.label??""),severity:"primary",size:"small",model:x.value,"data-testid":"queue-button",onClick:V},{icon:f(()=>[E("i",{class:k(Q.value)},null,2)]),item:f(({item:r})=>[b((i(),g(O,{variant:r.key===m(o)?"primary":"secondary",size:"sm",class:"w-full justify-start"},{default:f(()=>[r.icon?(i(),h("i",{key:0,class:k(r.icon)},null,2)):P("",!0),W(" "+z(String(r.label??"")),1)]),_:2},1032,["variant"])),[[y,{value:r.tooltip,showDelay:600}]])]),_:1},8,["label","model"])),[[y,{value:N.value,showDelay:600},void 0,{bottom:!0}]]),S(ee)])}}}),me=M(oe,[["__scopeId","data-v-214102f7"]]);export{me as t};
2
2
 
3
- //# sourceMappingURL=ComfyQueueButton-MZrp7wYJ.js.map
3
+ //# sourceMappingURL=ComfyQueueButton-HjSIKZKO.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComfyQueueButton-MZrp7wYJ.js","names":[],"sources":["../../src/components/actionbar/BatchCountEdit.vue","../../src/components/actionbar/BatchCountEdit.vue","../../src/components/actionbar/ComfyRunButton/ComfyQueueButton.vue","../../src/components/actionbar/ComfyRunButton/ComfyQueueButton.vue"],"sourcesContent":["<template>\n <div\n v-tooltip.bottom=\"{\n value: $t('menu.batchCount'),\n showDelay: 600\n }\"\n class=\"batch-count\"\n :aria-label=\"$t('menu.batchCount')\"\n >\n <InputNumber\n v-model=\"batchCount\"\n class=\"w-14\"\n :min=\"minQueueCount\"\n :max=\"maxQueueCount\"\n fluid\n show-buttons\n :pt=\"{\n incrementButton: {\n class: 'w-6',\n onmousedown: () => {\n handleClick(true)\n }\n },\n decrementButton: {\n class: 'w-6',\n onmousedown: () => {\n handleClick(false)\n }\n }\n }\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { storeToRefs } from 'pinia'\nimport InputNumber from 'primevue/inputnumber'\nimport { computed } from 'vue'\n\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport { useQueueSettingsStore } from '@/stores/queueStore'\n\nconst queueSettingsStore = useQueueSettingsStore()\nconst { batchCount } = storeToRefs(queueSettingsStore)\nconst minQueueCount = 1\n\nconst settingStore = useSettingStore()\nconst maxQueueCount = computed(() =>\n settingStore.get('Comfy.QueueButton.BatchCountLimit')\n)\n\nconst handleClick = (increment: boolean) => {\n let newCount: number\n if (increment) {\n const originalCount = batchCount.value - 1\n newCount = Math.min(originalCount * 2, maxQueueCount.value)\n } else {\n const originalCount = batchCount.value + 1\n newCount = Math.floor(originalCount / 2)\n }\n\n batchCount.value = newCount\n}\n</script>\n\n<style scoped>\n:deep(.p-inputtext) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n</style>\n","<template>\n <div\n v-tooltip.bottom=\"{\n value: $t('menu.batchCount'),\n showDelay: 600\n }\"\n class=\"batch-count\"\n :aria-label=\"$t('menu.batchCount')\"\n >\n <InputNumber\n v-model=\"batchCount\"\n class=\"w-14\"\n :min=\"minQueueCount\"\n :max=\"maxQueueCount\"\n fluid\n show-buttons\n :pt=\"{\n incrementButton: {\n class: 'w-6',\n onmousedown: () => {\n handleClick(true)\n }\n },\n decrementButton: {\n class: 'w-6',\n onmousedown: () => {\n handleClick(false)\n }\n }\n }\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { storeToRefs } from 'pinia'\nimport InputNumber from 'primevue/inputnumber'\nimport { computed } from 'vue'\n\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport { useQueueSettingsStore } from '@/stores/queueStore'\n\nconst queueSettingsStore = useQueueSettingsStore()\nconst { batchCount } = storeToRefs(queueSettingsStore)\nconst minQueueCount = 1\n\nconst settingStore = useSettingStore()\nconst maxQueueCount = computed(() =>\n settingStore.get('Comfy.QueueButton.BatchCountLimit')\n)\n\nconst handleClick = (increment: boolean) => {\n let newCount: number\n if (increment) {\n const originalCount = batchCount.value - 1\n newCount = Math.min(originalCount * 2, maxQueueCount.value)\n } else {\n const originalCount = batchCount.value + 1\n newCount = Math.floor(originalCount / 2)\n }\n\n batchCount.value = newCount\n}\n</script>\n\n<style scoped>\n:deep(.p-inputtext) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n</style>\n","<template>\n <div class=\"queue-button-group flex\">\n <SplitButton\n v-tooltip.bottom=\"{\n value: queueButtonTooltip,\n showDelay: 600\n }\"\n class=\"comfyui-queue-button\"\n :label=\"String(activeQueueModeMenuItem?.label ?? '')\"\n severity=\"primary\"\n size=\"small\"\n :model=\"queueModeMenuItems\"\n data-testid=\"queue-button\"\n @click=\"queuePrompt\"\n >\n <template #icon>\n <i :class=\"iconClass\" />\n </template>\n <template #item=\"{ item }\">\n <Button\n v-tooltip=\"{\n value: item.tooltip,\n showDelay: 600\n }\"\n :variant=\"item.key === queueMode ? 'primary' : 'secondary'\"\n size=\"sm\"\n class=\"w-full justify-start\"\n >\n <i v-if=\"item.icon\" :class=\"item.icon\" />\n {{ String(item.label ?? '') }}\n </Button>\n </template>\n </SplitButton>\n <BatchCountEdit />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { storeToRefs } from 'pinia'\nimport type { MenuItem } from 'primevue/menuitem'\nimport SplitButton from 'primevue/splitbutton'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport Button from '@/components/ui/button/Button.vue'\nimport { isCloud } from '@/platform/distribution/types'\nimport { useTelemetry } from '@/platform/telemetry'\nimport { app } from '@/scripts/app'\nimport { useCommandStore } from '@/stores/commandStore'\nimport { useNodeDefStore } from '@/stores/nodeDefStore'\nimport { useQueueSettingsStore } from '@/stores/queueStore'\nimport { useWorkspaceStore } from '@/stores/workspaceStore'\nimport { graphHasMissingNodes } from '@/workbench/extensions/manager/utils/graphHasMissingNodes'\n\nimport BatchCountEdit from '../BatchCountEdit.vue'\n\nconst workspaceStore = useWorkspaceStore()\nconst { mode: queueMode, batchCount } = storeToRefs(useQueueSettingsStore())\n\nconst nodeDefStore = useNodeDefStore()\nconst hasMissingNodes = computed(() =>\n graphHasMissingNodes(app.rootGraph, nodeDefStore.nodeDefsByName)\n)\n\nconst { t } = useI18n()\nconst queueModeMenuItemLookup = computed(() => {\n const items: Record<string, MenuItem> = {\n disabled: {\n key: 'disabled',\n label: t('menu.run'),\n tooltip: t('menu.disabledTooltip'),\n command: () => {\n queueMode.value = 'disabled'\n }\n },\n change: {\n key: 'change',\n label: `${t('menu.run')} (${t('menu.onChange')})`,\n tooltip: t('menu.onChangeTooltip'),\n command: () => {\n useTelemetry()?.trackUiButtonClicked({\n button_id: 'queue_mode_option_run_on_change_selected'\n })\n queueMode.value = 'change'\n }\n }\n }\n if (!isCloud) {\n items.instant = {\n key: 'instant',\n label: `${t('menu.run')} (${t('menu.instant')})`,\n tooltip: t('menu.instantTooltip'),\n command: () => {\n useTelemetry()?.trackUiButtonClicked({\n button_id: 'queue_mode_option_run_instant_selected'\n })\n queueMode.value = 'instant'\n }\n }\n }\n return items\n})\n\nconst activeQueueModeMenuItem = computed(() => {\n // Fallback to disabled mode if current mode is not available (e.g., instant mode in cloud)\n return (\n queueModeMenuItemLookup.value[queueMode.value] ||\n queueModeMenuItemLookup.value.disabled\n )\n})\nconst queueModeMenuItems = computed(() =>\n Object.values(queueModeMenuItemLookup.value)\n)\n\nconst iconClass = computed(() => {\n if (hasMissingNodes.value) {\n return 'icon-[lucide--triangle-alert]'\n }\n if (workspaceStore.shiftDown) {\n return 'icon-[lucide--list-start]'\n }\n if (queueMode.value === 'disabled') {\n return 'icon-[lucide--play]'\n }\n if (queueMode.value === 'instant') {\n return 'icon-[lucide--fast-forward]'\n }\n if (queueMode.value === 'change') {\n return 'icon-[lucide--step-forward]'\n }\n return 'icon-[lucide--play]'\n})\n\nconst queueButtonTooltip = computed(() => {\n if (hasMissingNodes.value) {\n return t('menu.runWorkflowDisabled')\n }\n if (workspaceStore.shiftDown) {\n return t('menu.runWorkflowFront')\n }\n return t('menu.runWorkflow')\n})\n\nconst commandStore = useCommandStore()\nconst queuePrompt = async (e: Event) => {\n const isShiftPressed = 'shiftKey' in e && e.shiftKey\n const commandId = isShiftPressed\n ? 'Comfy.QueuePromptFront'\n : 'Comfy.QueuePrompt'\n\n if (batchCount.value > 1) {\n useTelemetry()?.trackUiButtonClicked({\n button_id: 'queue_run_multiple_batches_submitted'\n })\n }\n\n await commandStore.execute(commandId, {\n metadata: {\n subscribe_to_run: false,\n trigger_source: 'button'\n }\n })\n}\n</script>\n\n<style scoped>\n.comfyui-queue-button :deep(.p-splitbutton-dropdown) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n</style>\n","<template>\n <div class=\"queue-button-group flex\">\n <SplitButton\n v-tooltip.bottom=\"{\n value: queueButtonTooltip,\n showDelay: 600\n }\"\n class=\"comfyui-queue-button\"\n :label=\"String(activeQueueModeMenuItem?.label ?? '')\"\n severity=\"primary\"\n size=\"small\"\n :model=\"queueModeMenuItems\"\n data-testid=\"queue-button\"\n @click=\"queuePrompt\"\n >\n <template #icon>\n <i :class=\"iconClass\" />\n </template>\n <template #item=\"{ item }\">\n <Button\n v-tooltip=\"{\n value: item.tooltip,\n showDelay: 600\n }\"\n :variant=\"item.key === queueMode ? 'primary' : 'secondary'\"\n size=\"sm\"\n class=\"w-full justify-start\"\n >\n <i v-if=\"item.icon\" :class=\"item.icon\" />\n {{ String(item.label ?? '') }}\n </Button>\n </template>\n </SplitButton>\n <BatchCountEdit />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { storeToRefs } from 'pinia'\nimport type { MenuItem } from 'primevue/menuitem'\nimport SplitButton from 'primevue/splitbutton'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport Button from '@/components/ui/button/Button.vue'\nimport { isCloud } from '@/platform/distribution/types'\nimport { useTelemetry } from '@/platform/telemetry'\nimport { app } from '@/scripts/app'\nimport { useCommandStore } from '@/stores/commandStore'\nimport { useNodeDefStore } from '@/stores/nodeDefStore'\nimport { useQueueSettingsStore } from '@/stores/queueStore'\nimport { useWorkspaceStore } from '@/stores/workspaceStore'\nimport { graphHasMissingNodes } from '@/workbench/extensions/manager/utils/graphHasMissingNodes'\n\nimport BatchCountEdit from '../BatchCountEdit.vue'\n\nconst workspaceStore = useWorkspaceStore()\nconst { mode: queueMode, batchCount } = storeToRefs(useQueueSettingsStore())\n\nconst nodeDefStore = useNodeDefStore()\nconst hasMissingNodes = computed(() =>\n graphHasMissingNodes(app.rootGraph, nodeDefStore.nodeDefsByName)\n)\n\nconst { t } = useI18n()\nconst queueModeMenuItemLookup = computed(() => {\n const items: Record<string, MenuItem> = {\n disabled: {\n key: 'disabled',\n label: t('menu.run'),\n tooltip: t('menu.disabledTooltip'),\n command: () => {\n queueMode.value = 'disabled'\n }\n },\n change: {\n key: 'change',\n label: `${t('menu.run')} (${t('menu.onChange')})`,\n tooltip: t('menu.onChangeTooltip'),\n command: () => {\n useTelemetry()?.trackUiButtonClicked({\n button_id: 'queue_mode_option_run_on_change_selected'\n })\n queueMode.value = 'change'\n }\n }\n }\n if (!isCloud) {\n items.instant = {\n key: 'instant',\n label: `${t('menu.run')} (${t('menu.instant')})`,\n tooltip: t('menu.instantTooltip'),\n command: () => {\n useTelemetry()?.trackUiButtonClicked({\n button_id: 'queue_mode_option_run_instant_selected'\n })\n queueMode.value = 'instant'\n }\n }\n }\n return items\n})\n\nconst activeQueueModeMenuItem = computed(() => {\n // Fallback to disabled mode if current mode is not available (e.g., instant mode in cloud)\n return (\n queueModeMenuItemLookup.value[queueMode.value] ||\n queueModeMenuItemLookup.value.disabled\n )\n})\nconst queueModeMenuItems = computed(() =>\n Object.values(queueModeMenuItemLookup.value)\n)\n\nconst iconClass = computed(() => {\n if (hasMissingNodes.value) {\n return 'icon-[lucide--triangle-alert]'\n }\n if (workspaceStore.shiftDown) {\n return 'icon-[lucide--list-start]'\n }\n if (queueMode.value === 'disabled') {\n return 'icon-[lucide--play]'\n }\n if (queueMode.value === 'instant') {\n return 'icon-[lucide--fast-forward]'\n }\n if (queueMode.value === 'change') {\n return 'icon-[lucide--step-forward]'\n }\n return 'icon-[lucide--play]'\n})\n\nconst queueButtonTooltip = computed(() => {\n if (hasMissingNodes.value) {\n return t('menu.runWorkflowDisabled')\n }\n if (workspaceStore.shiftDown) {\n return t('menu.runWorkflowFront')\n }\n return t('menu.runWorkflow')\n})\n\nconst commandStore = useCommandStore()\nconst queuePrompt = async (e: Event) => {\n const isShiftPressed = 'shiftKey' in e && e.shiftKey\n const commandId = isShiftPressed\n ? 'Comfy.QueuePromptFront'\n : 'Comfy.QueuePrompt'\n\n if (batchCount.value > 1) {\n useTelemetry()?.trackUiButtonClicked({\n button_id: 'queue_run_multiple_batches_submitted'\n })\n }\n\n await commandStore.execute(commandId, {\n metadata: {\n subscribe_to_run: false,\n trigger_source: 'button'\n }\n })\n}\n</script>\n\n<style scoped>\n.comfyui-queue-button :deep(.p-splitbutton-dropdown) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n</style>\n"],"mappings":"4pBC4CM,EAAgB,wCADtB,KAAM,CAAE,WAAA,CAAA,EAAe,EADI,EAAA,CAAsB,EAI3C,EAAe,EAAA,EACf,EAAgB,EAAA,IACpB,EAAa,IAAI,mCAAA,CAAmC,EAGhD,EAAA,EAAe,GAAuB,CAC1C,IAAI,EACJ,GAAI,EAAW,CACb,MAAM,EAAgB,EAAW,MAAQ,EACzC,EAAW,KAAK,IAAI,EAAgB,EAAG,EAAc,KAAA,MAChD,CACL,MAAM,EAAgB,EAAW,MAAQ,EACzC,EAAW,KAAK,MAAM,EAAgB,CAAA,EAGxC,EAAW,MAAQ,GAVf,ipBEKN,MAAM,EAAiB,EAAA,EACjB,CAAE,KAAM,EAAW,WAAA,CAAA,EAAe,EAAY,EAAA,CAAuB,EAErE,EAAe,EAAA,EACf,EAAkB,EAAA,IACtB,EAAqB,EAAI,UAAW,EAAa,cAAA,CAAc,EAG3D,CAAE,EAAA,CAAA,EAAM,EAAA,EACR,EAA0B,EAAA,IAAe,CAC7C,MAAM,EAAkC,CACtC,SAAU,CACR,IAAK,WACL,MAAO,EAAE,UAAA,EACT,QAAS,EAAE,sBAAA,EACX,QAAA,EAAA,IAAe,CACb,EAAU,MAAQ,YADpB,YAIF,OAAQ,CACN,IAAK,SACL,MAAO,GAAG,EAAE,UAAA,CAAW,KAAK,EAAE,eAAA,CAAgB,IAC9C,QAAS,EAAE,sBAAA,EACX,QAAA,EAAA,IAAe,CACb,EAAA,GAAgB,qBAAqB,CACnC,UAAW,0CAAA,CACZ,EACD,EAAU,MAAQ,UAJpB,aAQJ,OAAK,IACH,EAAM,QAAU,CACd,IAAK,UACL,MAAO,GAAG,EAAE,UAAA,CAAW,KAAK,EAAE,cAAA,CAAe,IAC7C,QAAS,EAAE,qBAAA,EACX,QAAA,EAAA,IAAe,CACb,EAAA,GAAgB,qBAAqB,CACnC,UAAW,wCAAA,CACZ,EACD,EAAU,MAAQ,WAJpB,aAQG,IAGH,EAA0B,EAAA,IAG5B,EAAwB,MAAM,EAAU,KAAA,GACxC,EAAwB,MAAM,UAG5B,EAAqB,EAAA,IACzB,OAAO,OAAO,EAAwB,KAAA,CAAK,EAGvC,EAAY,EAAA,IACZ,EAAgB,MACX,gCAEL,EAAe,UACV,4BAEL,EAAU,QAAU,WACf,sBAEL,EAAU,QAAU,UACf,8BAEL,EAAU,QAAU,SACf,8BAEF,uBAGH,EAAqB,EAAA,IACrB,EAAgB,MACX,EAAE,0BAAA,EAEP,EAAe,UACV,EAAE,uBAAA,EAEJ,EAAE,kBAAA,GAGL,EAAe,EAAA,EACf,EAAc,EAAA,MAAO,GAAa,CAEtC,MAAM,EADiB,aAAc,GAAK,EAAE,SAExC,yBACA,oBAEA,EAAW,MAAQ,GACrB,EAAA,GAAgB,qBAAqB,CACnC,UAAW,sCAAA,CACZ,EAGH,MAAM,EAAa,QAAQ,EAAW,CACpC,SAAU,CACR,iBAAkB,GAClB,eAAgB,SAClB,CACD,GAjBiB"}
1
+ {"version":3,"file":"ComfyQueueButton-HjSIKZKO.js","names":[],"sources":["../../src/components/actionbar/BatchCountEdit.vue","../../src/components/actionbar/BatchCountEdit.vue","../../src/components/actionbar/ComfyRunButton/ComfyQueueButton.vue","../../src/components/actionbar/ComfyRunButton/ComfyQueueButton.vue"],"sourcesContent":["<template>\n <div\n v-tooltip.bottom=\"{\n value: $t('menu.batchCount'),\n showDelay: 600\n }\"\n class=\"batch-count\"\n :aria-label=\"$t('menu.batchCount')\"\n >\n <InputNumber\n v-model=\"batchCount\"\n class=\"w-14\"\n :min=\"minQueueCount\"\n :max=\"maxQueueCount\"\n fluid\n show-buttons\n :pt=\"{\n incrementButton: {\n class: 'w-6',\n onmousedown: () => {\n handleClick(true)\n }\n },\n decrementButton: {\n class: 'w-6',\n onmousedown: () => {\n handleClick(false)\n }\n }\n }\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { storeToRefs } from 'pinia'\nimport InputNumber from 'primevue/inputnumber'\nimport { computed } from 'vue'\n\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport { useQueueSettingsStore } from '@/stores/queueStore'\n\nconst queueSettingsStore = useQueueSettingsStore()\nconst { batchCount } = storeToRefs(queueSettingsStore)\nconst minQueueCount = 1\n\nconst settingStore = useSettingStore()\nconst maxQueueCount = computed(() =>\n settingStore.get('Comfy.QueueButton.BatchCountLimit')\n)\n\nconst handleClick = (increment: boolean) => {\n let newCount: number\n if (increment) {\n const originalCount = batchCount.value - 1\n newCount = Math.min(originalCount * 2, maxQueueCount.value)\n } else {\n const originalCount = batchCount.value + 1\n newCount = Math.floor(originalCount / 2)\n }\n\n batchCount.value = newCount\n}\n</script>\n\n<style scoped>\n:deep(.p-inputtext) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n</style>\n","<template>\n <div\n v-tooltip.bottom=\"{\n value: $t('menu.batchCount'),\n showDelay: 600\n }\"\n class=\"batch-count\"\n :aria-label=\"$t('menu.batchCount')\"\n >\n <InputNumber\n v-model=\"batchCount\"\n class=\"w-14\"\n :min=\"minQueueCount\"\n :max=\"maxQueueCount\"\n fluid\n show-buttons\n :pt=\"{\n incrementButton: {\n class: 'w-6',\n onmousedown: () => {\n handleClick(true)\n }\n },\n decrementButton: {\n class: 'w-6',\n onmousedown: () => {\n handleClick(false)\n }\n }\n }\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { storeToRefs } from 'pinia'\nimport InputNumber from 'primevue/inputnumber'\nimport { computed } from 'vue'\n\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport { useQueueSettingsStore } from '@/stores/queueStore'\n\nconst queueSettingsStore = useQueueSettingsStore()\nconst { batchCount } = storeToRefs(queueSettingsStore)\nconst minQueueCount = 1\n\nconst settingStore = useSettingStore()\nconst maxQueueCount = computed(() =>\n settingStore.get('Comfy.QueueButton.BatchCountLimit')\n)\n\nconst handleClick = (increment: boolean) => {\n let newCount: number\n if (increment) {\n const originalCount = batchCount.value - 1\n newCount = Math.min(originalCount * 2, maxQueueCount.value)\n } else {\n const originalCount = batchCount.value + 1\n newCount = Math.floor(originalCount / 2)\n }\n\n batchCount.value = newCount\n}\n</script>\n\n<style scoped>\n:deep(.p-inputtext) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n</style>\n","<template>\n <div class=\"queue-button-group flex\">\n <SplitButton\n v-tooltip.bottom=\"{\n value: queueButtonTooltip,\n showDelay: 600\n }\"\n class=\"comfyui-queue-button\"\n :label=\"String(activeQueueModeMenuItem?.label ?? '')\"\n severity=\"primary\"\n size=\"small\"\n :model=\"queueModeMenuItems\"\n data-testid=\"queue-button\"\n @click=\"queuePrompt\"\n >\n <template #icon>\n <i :class=\"iconClass\" />\n </template>\n <template #item=\"{ item }\">\n <Button\n v-tooltip=\"{\n value: item.tooltip,\n showDelay: 600\n }\"\n :variant=\"item.key === queueMode ? 'primary' : 'secondary'\"\n size=\"sm\"\n class=\"w-full justify-start\"\n >\n <i v-if=\"item.icon\" :class=\"item.icon\" />\n {{ String(item.label ?? '') }}\n </Button>\n </template>\n </SplitButton>\n <BatchCountEdit />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { storeToRefs } from 'pinia'\nimport type { MenuItem } from 'primevue/menuitem'\nimport SplitButton from 'primevue/splitbutton'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport Button from '@/components/ui/button/Button.vue'\nimport { isCloud } from '@/platform/distribution/types'\nimport { useTelemetry } from '@/platform/telemetry'\nimport { app } from '@/scripts/app'\nimport { useCommandStore } from '@/stores/commandStore'\nimport { useNodeDefStore } from '@/stores/nodeDefStore'\nimport { useQueueSettingsStore } from '@/stores/queueStore'\nimport { useWorkspaceStore } from '@/stores/workspaceStore'\nimport { graphHasMissingNodes } from '@/workbench/extensions/manager/utils/graphHasMissingNodes'\n\nimport BatchCountEdit from '../BatchCountEdit.vue'\n\nconst workspaceStore = useWorkspaceStore()\nconst { mode: queueMode, batchCount } = storeToRefs(useQueueSettingsStore())\n\nconst nodeDefStore = useNodeDefStore()\nconst hasMissingNodes = computed(() =>\n graphHasMissingNodes(app.rootGraph, nodeDefStore.nodeDefsByName)\n)\n\nconst { t } = useI18n()\nconst queueModeMenuItemLookup = computed(() => {\n const items: Record<string, MenuItem> = {\n disabled: {\n key: 'disabled',\n label: t('menu.run'),\n tooltip: t('menu.disabledTooltip'),\n command: () => {\n queueMode.value = 'disabled'\n }\n },\n change: {\n key: 'change',\n label: `${t('menu.run')} (${t('menu.onChange')})`,\n tooltip: t('menu.onChangeTooltip'),\n command: () => {\n useTelemetry()?.trackUiButtonClicked({\n button_id: 'queue_mode_option_run_on_change_selected'\n })\n queueMode.value = 'change'\n }\n }\n }\n if (!isCloud) {\n items.instant = {\n key: 'instant',\n label: `${t('menu.run')} (${t('menu.instant')})`,\n tooltip: t('menu.instantTooltip'),\n command: () => {\n useTelemetry()?.trackUiButtonClicked({\n button_id: 'queue_mode_option_run_instant_selected'\n })\n queueMode.value = 'instant'\n }\n }\n }\n return items\n})\n\nconst activeQueueModeMenuItem = computed(() => {\n // Fallback to disabled mode if current mode is not available (e.g., instant mode in cloud)\n return (\n queueModeMenuItemLookup.value[queueMode.value] ||\n queueModeMenuItemLookup.value.disabled\n )\n})\nconst queueModeMenuItems = computed(() =>\n Object.values(queueModeMenuItemLookup.value)\n)\n\nconst iconClass = computed(() => {\n if (hasMissingNodes.value) {\n return 'icon-[lucide--triangle-alert]'\n }\n if (workspaceStore.shiftDown) {\n return 'icon-[lucide--list-start]'\n }\n if (queueMode.value === 'disabled') {\n return 'icon-[lucide--play]'\n }\n if (queueMode.value === 'instant') {\n return 'icon-[lucide--fast-forward]'\n }\n if (queueMode.value === 'change') {\n return 'icon-[lucide--step-forward]'\n }\n return 'icon-[lucide--play]'\n})\n\nconst queueButtonTooltip = computed(() => {\n if (hasMissingNodes.value) {\n return t('menu.runWorkflowDisabled')\n }\n if (workspaceStore.shiftDown) {\n return t('menu.runWorkflowFront')\n }\n return t('menu.runWorkflow')\n})\n\nconst commandStore = useCommandStore()\nconst queuePrompt = async (e: Event) => {\n const isShiftPressed = 'shiftKey' in e && e.shiftKey\n const commandId = isShiftPressed\n ? 'Comfy.QueuePromptFront'\n : 'Comfy.QueuePrompt'\n\n if (batchCount.value > 1) {\n useTelemetry()?.trackUiButtonClicked({\n button_id: 'queue_run_multiple_batches_submitted'\n })\n }\n\n await commandStore.execute(commandId, {\n metadata: {\n subscribe_to_run: false,\n trigger_source: 'button'\n }\n })\n}\n</script>\n\n<style scoped>\n.comfyui-queue-button :deep(.p-splitbutton-dropdown) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n</style>\n","<template>\n <div class=\"queue-button-group flex\">\n <SplitButton\n v-tooltip.bottom=\"{\n value: queueButtonTooltip,\n showDelay: 600\n }\"\n class=\"comfyui-queue-button\"\n :label=\"String(activeQueueModeMenuItem?.label ?? '')\"\n severity=\"primary\"\n size=\"small\"\n :model=\"queueModeMenuItems\"\n data-testid=\"queue-button\"\n @click=\"queuePrompt\"\n >\n <template #icon>\n <i :class=\"iconClass\" />\n </template>\n <template #item=\"{ item }\">\n <Button\n v-tooltip=\"{\n value: item.tooltip,\n showDelay: 600\n }\"\n :variant=\"item.key === queueMode ? 'primary' : 'secondary'\"\n size=\"sm\"\n class=\"w-full justify-start\"\n >\n <i v-if=\"item.icon\" :class=\"item.icon\" />\n {{ String(item.label ?? '') }}\n </Button>\n </template>\n </SplitButton>\n <BatchCountEdit />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { storeToRefs } from 'pinia'\nimport type { MenuItem } from 'primevue/menuitem'\nimport SplitButton from 'primevue/splitbutton'\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport Button from '@/components/ui/button/Button.vue'\nimport { isCloud } from '@/platform/distribution/types'\nimport { useTelemetry } from '@/platform/telemetry'\nimport { app } from '@/scripts/app'\nimport { useCommandStore } from '@/stores/commandStore'\nimport { useNodeDefStore } from '@/stores/nodeDefStore'\nimport { useQueueSettingsStore } from '@/stores/queueStore'\nimport { useWorkspaceStore } from '@/stores/workspaceStore'\nimport { graphHasMissingNodes } from '@/workbench/extensions/manager/utils/graphHasMissingNodes'\n\nimport BatchCountEdit from '../BatchCountEdit.vue'\n\nconst workspaceStore = useWorkspaceStore()\nconst { mode: queueMode, batchCount } = storeToRefs(useQueueSettingsStore())\n\nconst nodeDefStore = useNodeDefStore()\nconst hasMissingNodes = computed(() =>\n graphHasMissingNodes(app.rootGraph, nodeDefStore.nodeDefsByName)\n)\n\nconst { t } = useI18n()\nconst queueModeMenuItemLookup = computed(() => {\n const items: Record<string, MenuItem> = {\n disabled: {\n key: 'disabled',\n label: t('menu.run'),\n tooltip: t('menu.disabledTooltip'),\n command: () => {\n queueMode.value = 'disabled'\n }\n },\n change: {\n key: 'change',\n label: `${t('menu.run')} (${t('menu.onChange')})`,\n tooltip: t('menu.onChangeTooltip'),\n command: () => {\n useTelemetry()?.trackUiButtonClicked({\n button_id: 'queue_mode_option_run_on_change_selected'\n })\n queueMode.value = 'change'\n }\n }\n }\n if (!isCloud) {\n items.instant = {\n key: 'instant',\n label: `${t('menu.run')} (${t('menu.instant')})`,\n tooltip: t('menu.instantTooltip'),\n command: () => {\n useTelemetry()?.trackUiButtonClicked({\n button_id: 'queue_mode_option_run_instant_selected'\n })\n queueMode.value = 'instant'\n }\n }\n }\n return items\n})\n\nconst activeQueueModeMenuItem = computed(() => {\n // Fallback to disabled mode if current mode is not available (e.g., instant mode in cloud)\n return (\n queueModeMenuItemLookup.value[queueMode.value] ||\n queueModeMenuItemLookup.value.disabled\n )\n})\nconst queueModeMenuItems = computed(() =>\n Object.values(queueModeMenuItemLookup.value)\n)\n\nconst iconClass = computed(() => {\n if (hasMissingNodes.value) {\n return 'icon-[lucide--triangle-alert]'\n }\n if (workspaceStore.shiftDown) {\n return 'icon-[lucide--list-start]'\n }\n if (queueMode.value === 'disabled') {\n return 'icon-[lucide--play]'\n }\n if (queueMode.value === 'instant') {\n return 'icon-[lucide--fast-forward]'\n }\n if (queueMode.value === 'change') {\n return 'icon-[lucide--step-forward]'\n }\n return 'icon-[lucide--play]'\n})\n\nconst queueButtonTooltip = computed(() => {\n if (hasMissingNodes.value) {\n return t('menu.runWorkflowDisabled')\n }\n if (workspaceStore.shiftDown) {\n return t('menu.runWorkflowFront')\n }\n return t('menu.runWorkflow')\n})\n\nconst commandStore = useCommandStore()\nconst queuePrompt = async (e: Event) => {\n const isShiftPressed = 'shiftKey' in e && e.shiftKey\n const commandId = isShiftPressed\n ? 'Comfy.QueuePromptFront'\n : 'Comfy.QueuePrompt'\n\n if (batchCount.value > 1) {\n useTelemetry()?.trackUiButtonClicked({\n button_id: 'queue_run_multiple_batches_submitted'\n })\n }\n\n await commandStore.execute(commandId, {\n metadata: {\n subscribe_to_run: false,\n trigger_source: 'button'\n }\n })\n}\n</script>\n\n<style scoped>\n.comfyui-queue-button :deep(.p-splitbutton-dropdown) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n</style>\n"],"mappings":"4pBC4CM,EAAgB,wCADtB,KAAM,CAAE,WAAA,CAAA,EAAe,EADI,EAAA,CAAsB,EAI3C,EAAe,EAAA,EACf,EAAgB,EAAA,IACpB,EAAa,IAAI,mCAAA,CAAmC,EAGhD,EAAA,EAAe,GAAuB,CAC1C,IAAI,EACJ,GAAI,EAAW,CACb,MAAM,EAAgB,EAAW,MAAQ,EACzC,EAAW,KAAK,IAAI,EAAgB,EAAG,EAAc,KAAA,MAChD,CACL,MAAM,EAAgB,EAAW,MAAQ,EACzC,EAAW,KAAK,MAAM,EAAgB,CAAA,EAGxC,EAAW,MAAQ,GAVf,ipBEKN,MAAM,EAAiB,EAAA,EACjB,CAAE,KAAM,EAAW,WAAA,CAAA,EAAe,EAAY,EAAA,CAAuB,EAErE,EAAe,EAAA,EACf,EAAkB,EAAA,IACtB,EAAqB,EAAI,UAAW,EAAa,cAAA,CAAc,EAG3D,CAAE,EAAA,CAAA,EAAM,EAAA,EACR,EAA0B,EAAA,IAAe,CAC7C,MAAM,EAAkC,CACtC,SAAU,CACR,IAAK,WACL,MAAO,EAAE,UAAA,EACT,QAAS,EAAE,sBAAA,EACX,QAAA,EAAA,IAAe,CACb,EAAU,MAAQ,YADpB,YAIF,OAAQ,CACN,IAAK,SACL,MAAO,GAAG,EAAE,UAAA,CAAW,KAAK,EAAE,eAAA,CAAgB,IAC9C,QAAS,EAAE,sBAAA,EACX,QAAA,EAAA,IAAe,CACb,EAAA,GAAgB,qBAAqB,CACnC,UAAW,0CAAA,CACZ,EACD,EAAU,MAAQ,UAJpB,aAQJ,OAAK,IACH,EAAM,QAAU,CACd,IAAK,UACL,MAAO,GAAG,EAAE,UAAA,CAAW,KAAK,EAAE,cAAA,CAAe,IAC7C,QAAS,EAAE,qBAAA,EACX,QAAA,EAAA,IAAe,CACb,EAAA,GAAgB,qBAAqB,CACnC,UAAW,wCAAA,CACZ,EACD,EAAU,MAAQ,WAJpB,aAQG,IAGH,EAA0B,EAAA,IAG5B,EAAwB,MAAM,EAAU,KAAA,GACxC,EAAwB,MAAM,UAG5B,EAAqB,EAAA,IACzB,OAAO,OAAO,EAAwB,KAAA,CAAK,EAGvC,EAAY,EAAA,IACZ,EAAgB,MACX,gCAEL,EAAe,UACV,4BAEL,EAAU,QAAU,WACf,sBAEL,EAAU,QAAU,UACf,8BAEL,EAAU,QAAU,SACf,8BAEF,uBAGH,EAAqB,EAAA,IACrB,EAAgB,MACX,EAAE,0BAAA,EAEP,EAAe,UACV,EAAE,uBAAA,EAEJ,EAAE,kBAAA,GAGL,EAAe,EAAA,EACf,EAAc,EAAA,MAAO,GAAa,CAEtC,MAAM,EADiB,aAAc,GAAK,EAAE,SAExC,yBACA,oBAEA,EAAW,MAAQ,GACrB,EAAA,GAAgB,qBAAqB,CACnC,UAAW,sCAAA,CACZ,EAGH,MAAM,EAAa,QAAQ,EAAW,CACpC,SAAU,CACR,iBAAkB,GAClB,eAAgB,SAClB,CACD,GAjBiB"}
@@ -1,3 +1,3 @@
1
- var R=Object.defineProperty;var i=(C,u)=>R(C,"name",{value:u,configurable:!0});import{A as j,C as I,L as h,N as F,W as K,_t as L,c as V,ut as q}from"./vendor-primevue-DcMRXJN3.js";import{$o as E,Ba as c,Do as r,Ha as H,Jo as l,Ka as g,Pa as J,Ua as $,Va as y,Ya as W,co as Y,do as m,po as G,qa as o,za as p,zo as f}from"./vendor-other-DlQF6V2E.js";import{n as Q}from"./vendor-vue-D9IUuwPJ.js";import"./api-CUAc7rDA.js";import"./remoteConfig-CZcEXsZS.js";import"./colorUtil-CzxntCbX.js";import"./useErrorHandling-CI8_F4yx.js";import{t as k}from"./Button-Do2I1OAA.js";import{n as X,t as Z}from"./PanelTemplate-BjN5XNg2.js";import{ir as ee,yr as ae}from"./dialogService-BZ1FmjZL.js";import"./vendor-tiptap-_UqYL7N_.js";import"./vendor-xterm-BU_lcTPR.js";import"./vendor-three-BFcUNSs9.js";import"./markdownRendererUtil-DglHsU8t.js";import"./userStore-BkgQPjq6.js";var ne={class:"flex justify-end"},te={class:"mb-3 flex gap-2"},le=W({__name:"ExtensionPanel",setup(C){const{t:u}=Q(),S=["all","core","custom"],N=p(()=>S.map(e=>({label:u(`g.${e}`),value:e}))),x=f("all"),v=f([]),b=f({global:{value:"",matchMode:L.CONTAINS}}),a=X(),T=ae(),s=f({}),A=p(()=>{const e=a.extensions;switch(x.value){case"core":return e.filter(t=>a.isCoreExtension(t.name));case"custom":return e.filter(t=>!a.isCoreExtension(t.name));default:return e}});Y(()=>{a.extensions.forEach(e=>{s.value[e.name]=a.isExtensionEnabled(e.name)})});const _=p(()=>a.extensions.filter(e=>s.value[e.name]!==a.isExtensionEnabled(e.name))),B=p(()=>_.value.length>0),d=i(async()=>{const e=Object.entries(s.value).filter(([t,n])=>!n).map(([t])=>t);await T.set("Comfy.Extension.Disabled",[...a.inactiveDisabledExtensionNames,...e])},"updateExtensionStatus"),O=i(async()=>{a.extensions.forEach(e=>{a.isExtensionReadOnly(e.name)||(s.value[e.name]=!0)}),await d()},"enableAllExtensions"),U=i(async()=>{a.extensions.forEach(e=>{a.isExtensionReadOnly(e.name)||(s.value[e.name]=!1)}),await d()},"disableAllExtensions"),z=i(async()=>{a.extensions.forEach(e=>{a.isCoreExtension(e.name)||(s.value[e.name]=!1)}),await d()},"disableThirdPartyExtensions"),D=i(()=>{window.location.reload()},"applyChanges"),w=f(),M=p(()=>[{label:u("g.enableSelected"),icon:"pi pi-check",command:i(async()=>{v.value.forEach(e=>{a.isExtensionReadOnly(e.name)||(s.value[e.name]=!0)}),await d()},"command")},{label:u("g.disableSelected"),icon:"pi pi-times",command:i(async()=>{v.value.forEach(e=>{a.isExtensionReadOnly(e.name)||(s.value[e.name]=!1)}),await d()},"command")},{separator:!0},{label:u("g.enableAll"),icon:"pi pi-check",command:O},{label:u("g.disableAll"),icon:"pi pi-times",command:U},{label:u("g.disableThirdParty"),icon:"pi pi-times",command:z,disabled:!a.hasThirdPartyExtensions}]);return(e,t)=>(m(),y(Z,{value:"Extension",class:"extension-panel"},{header:r(()=>[o(ee,{modelValue:b.value.global.value,"onUpdate:modelValue":t[0]||(t[0]=n=>b.value.global.value=n),placeholder:e.$t("g.searchExtensions")+"..."},null,8,["modelValue","placeholder"]),B.value?(m(),y(l(q),{key:0,severity:"info","pt:text":"w-full",class:"max-h-96 overflow-y-auto"},{default:r(()=>[c("ul",null,[(m(!0),$(J,null,G(_.value,n=>(m(),$("li",{key:n.name},[c("span",null,E(l(a).isExtensionEnabled(n.name)?"[-]":"[+]"),1),g(" "+E(n.name),1)]))),128))]),c("div",ne,[o(k,{variant:"destructive",onClick:D},{default:r(()=>[g(E(e.$t("g.reloadToApplyChanges")),1)]),_:1})])]),_:1})):H("",!0)]),default:r(()=>[c("div",te,[o(l(I),{modelValue:x.value,"onUpdate:modelValue":t[1]||(t[1]=n=>x.value=n),options:N.value,"option-label":"label","option-value":"value"},null,8,["modelValue","options"])]),o(l(F),{selection:v.value,"onUpdate:selection":t[3]||(t[3]=n=>v.value=n),value:A.value,"striped-rows":"",size:"small",filters:b.value,"selection-mode":"multiple","data-key":"name"},{default:r(()=>[o(l(h),{"selection-mode":"multiple",frozen:!0,style:{width:"3rem"}}),o(l(h),{header:e.$t("g.extensionName"),sortable:"",field:"name"},{body:r(n=>[g(E(n.data.name)+" ",1),l(a).isCoreExtension(n.data.name)?(m(),y(l(V),{key:0,value:e.$t("g.core")},null,8,["value"])):(m(),y(l(V),{key:1,value:e.$t("g.custom"),severity:"info"},null,8,["value"]))]),_:1},8,["header"]),o(l(h),{pt:{headerCell:"flex items-center justify-end",bodyCell:"flex items-center justify-end"}},{header:r(()=>[o(k,{size:"icon",variant:"muted-textonly",onClick:t[2]||(t[2]=n=>w.value?.show(n))},{default:r(()=>t[4]||(t[4]=[c("i",{class:"pi pi-ellipsis-h"},null,-1)])),_:1}),o(l(K),{ref_key:"menu",ref:w,model:M.value},null,8,["model"])]),body:r(n=>[o(l(j),{modelValue:s.value[n.data.name],"onUpdate:modelValue":i(P=>s.value[n.data.name]=P,"onUpdate:modelValue"),disabled:l(a).isExtensionReadOnly(n.data.name),onChange:d},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:1})]),_:1},8,["selection","value","filters"])]),_:1}))}}),ge=le;export{ge as default};
1
+ var R=Object.defineProperty;var i=(C,u)=>R(C,"name",{value:u,configurable:!0});import{A as j,C as I,L as h,N as F,W as K,_t as L,c as V,ut as q}from"./vendor-primevue-DcMRXJN3.js";import{$o as E,Ba as c,Do as r,Ha as H,Jo as l,Ka as g,Pa as J,Ua as $,Va as y,Ya as W,co as Y,do as m,po as G,qa as o,za as p,zo as f}from"./vendor-other-DlQF6V2E.js";import{n as Q}from"./vendor-vue-D9IUuwPJ.js";import"./api-Dwq2LQIW.js";import"./remoteConfig-CZcEXsZS.js";import"./colorUtil-CzxntCbX.js";import"./useErrorHandling-Cfa5N_7c.js";import{t as k}from"./Button-Do2I1OAA.js";import{n as X,t as Z}from"./PanelTemplate-BJda9e5J.js";import{ir as ee,yr as ae}from"./dialogService-YG0RH337.js";import"./vendor-tiptap-_UqYL7N_.js";import"./vendor-xterm-BU_lcTPR.js";import"./vendor-three-BFcUNSs9.js";import"./markdownRendererUtil-DglHsU8t.js";import"./userStore-BAS9m9W6.js";var ne={class:"flex justify-end"},te={class:"mb-3 flex gap-2"},le=W({__name:"ExtensionPanel",setup(C){const{t:u}=Q(),S=["all","core","custom"],N=p(()=>S.map(e=>({label:u(`g.${e}`),value:e}))),x=f("all"),v=f([]),b=f({global:{value:"",matchMode:L.CONTAINS}}),a=X(),T=ae(),s=f({}),A=p(()=>{const e=a.extensions;switch(x.value){case"core":return e.filter(t=>a.isCoreExtension(t.name));case"custom":return e.filter(t=>!a.isCoreExtension(t.name));default:return e}});Y(()=>{a.extensions.forEach(e=>{s.value[e.name]=a.isExtensionEnabled(e.name)})});const _=p(()=>a.extensions.filter(e=>s.value[e.name]!==a.isExtensionEnabled(e.name))),B=p(()=>_.value.length>0),d=i(async()=>{const e=Object.entries(s.value).filter(([t,n])=>!n).map(([t])=>t);await T.set("Comfy.Extension.Disabled",[...a.inactiveDisabledExtensionNames,...e])},"updateExtensionStatus"),O=i(async()=>{a.extensions.forEach(e=>{a.isExtensionReadOnly(e.name)||(s.value[e.name]=!0)}),await d()},"enableAllExtensions"),U=i(async()=>{a.extensions.forEach(e=>{a.isExtensionReadOnly(e.name)||(s.value[e.name]=!1)}),await d()},"disableAllExtensions"),z=i(async()=>{a.extensions.forEach(e=>{a.isCoreExtension(e.name)||(s.value[e.name]=!1)}),await d()},"disableThirdPartyExtensions"),D=i(()=>{window.location.reload()},"applyChanges"),w=f(),M=p(()=>[{label:u("g.enableSelected"),icon:"pi pi-check",command:i(async()=>{v.value.forEach(e=>{a.isExtensionReadOnly(e.name)||(s.value[e.name]=!0)}),await d()},"command")},{label:u("g.disableSelected"),icon:"pi pi-times",command:i(async()=>{v.value.forEach(e=>{a.isExtensionReadOnly(e.name)||(s.value[e.name]=!1)}),await d()},"command")},{separator:!0},{label:u("g.enableAll"),icon:"pi pi-check",command:O},{label:u("g.disableAll"),icon:"pi pi-times",command:U},{label:u("g.disableThirdParty"),icon:"pi pi-times",command:z,disabled:!a.hasThirdPartyExtensions}]);return(e,t)=>(m(),y(Z,{value:"Extension",class:"extension-panel"},{header:r(()=>[o(ee,{modelValue:b.value.global.value,"onUpdate:modelValue":t[0]||(t[0]=n=>b.value.global.value=n),placeholder:e.$t("g.searchExtensions")+"..."},null,8,["modelValue","placeholder"]),B.value?(m(),y(l(q),{key:0,severity:"info","pt:text":"w-full",class:"max-h-96 overflow-y-auto"},{default:r(()=>[c("ul",null,[(m(!0),$(J,null,G(_.value,n=>(m(),$("li",{key:n.name},[c("span",null,E(l(a).isExtensionEnabled(n.name)?"[-]":"[+]"),1),g(" "+E(n.name),1)]))),128))]),c("div",ne,[o(k,{variant:"destructive",onClick:D},{default:r(()=>[g(E(e.$t("g.reloadToApplyChanges")),1)]),_:1})])]),_:1})):H("",!0)]),default:r(()=>[c("div",te,[o(l(I),{modelValue:x.value,"onUpdate:modelValue":t[1]||(t[1]=n=>x.value=n),options:N.value,"option-label":"label","option-value":"value"},null,8,["modelValue","options"])]),o(l(F),{selection:v.value,"onUpdate:selection":t[3]||(t[3]=n=>v.value=n),value:A.value,"striped-rows":"",size:"small",filters:b.value,"selection-mode":"multiple","data-key":"name"},{default:r(()=>[o(l(h),{"selection-mode":"multiple",frozen:!0,style:{width:"3rem"}}),o(l(h),{header:e.$t("g.extensionName"),sortable:"",field:"name"},{body:r(n=>[g(E(n.data.name)+" ",1),l(a).isCoreExtension(n.data.name)?(m(),y(l(V),{key:0,value:e.$t("g.core")},null,8,["value"])):(m(),y(l(V),{key:1,value:e.$t("g.custom"),severity:"info"},null,8,["value"]))]),_:1},8,["header"]),o(l(h),{pt:{headerCell:"flex items-center justify-end",bodyCell:"flex items-center justify-end"}},{header:r(()=>[o(k,{size:"icon",variant:"muted-textonly",onClick:t[2]||(t[2]=n=>w.value?.show(n))},{default:r(()=>t[4]||(t[4]=[c("i",{class:"pi pi-ellipsis-h"},null,-1)])),_:1}),o(l(K),{ref_key:"menu",ref:w,model:M.value},null,8,["model"])]),body:r(n=>[o(l(j),{modelValue:s.value[n.data.name],"onUpdate:modelValue":i(P=>s.value[n.data.name]=P,"onUpdate:modelValue"),disabled:l(a).isExtensionReadOnly(n.data.name),onChange:d},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:1})]),_:1},8,["selection","value","filters"])]),_:1}))}}),ge=le;export{ge as default};
2
2
 
3
- //# sourceMappingURL=ExtensionPanel-CrWVGUtg.js.map
3
+ //# sourceMappingURL=ExtensionPanel-Bzb9QtKj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionPanel-CrWVGUtg.js","names":[],"sources":["../../src/platform/settings/components/ExtensionPanel.vue","../../src/platform/settings/components/ExtensionPanel.vue"],"sourcesContent":["<template>\n <PanelTemplate value=\"Extension\" class=\"extension-panel\">\n <template #header>\n <SearchBox\n v-model=\"filters['global'].value\"\n :placeholder=\"$t('g.searchExtensions') + '...'\"\n />\n <Message\n v-if=\"hasChanges\"\n severity=\"info\"\n pt:text=\"w-full\"\n class=\"max-h-96 overflow-y-auto\"\n >\n <ul>\n <li v-for=\"ext in changedExtensions\" :key=\"ext.name\">\n <span>\n {{ extensionStore.isExtensionEnabled(ext.name) ? '[-]' : '[+]' }}\n </span>\n {{ ext.name }}\n </li>\n </ul>\n <div class=\"flex justify-end\">\n <Button variant=\"destructive\" @click=\"applyChanges\">\n {{ $t('g.reloadToApplyChanges') }}\n </Button>\n </div>\n </Message>\n </template>\n <div class=\"mb-3 flex gap-2\">\n <SelectButton\n v-model=\"filterType\"\n :options=\"filterTypes\"\n option-label=\"label\"\n option-value=\"value\"\n />\n </div>\n <DataTable\n v-model:selection=\"selectedExtensions\"\n :value=\"filteredExtensions\"\n striped-rows\n size=\"small\"\n :filters=\"filters\"\n selection-mode=\"multiple\"\n data-key=\"name\"\n >\n <Column selection-mode=\"multiple\" :frozen=\"true\" style=\"width: 3rem\" />\n <Column :header=\"$t('g.extensionName')\" sortable field=\"name\">\n <template #body=\"slotProps\">\n {{ slotProps.data.name }}\n <Tag\n v-if=\"extensionStore.isCoreExtension(slotProps.data.name)\"\n :value=\"$t('g.core')\"\n />\n <Tag v-else :value=\"$t('g.custom')\" severity=\"info\" />\n </template>\n </Column>\n <Column\n :pt=\"{\n headerCell: 'flex items-center justify-end',\n bodyCell: 'flex items-center justify-end'\n }\"\n >\n <template #header>\n <Button\n size=\"icon\"\n variant=\"muted-textonly\"\n @click=\"menu?.show($event)\"\n >\n <i class=\"pi pi-ellipsis-h\" />\n </Button>\n <ContextMenu ref=\"menu\" :model=\"contextMenuItems\" />\n </template>\n <template #body=\"slotProps\">\n <ToggleSwitch\n v-model=\"editingEnabledExtensions[slotProps.data.name]\"\n :disabled=\"extensionStore.isExtensionReadOnly(slotProps.data.name)\"\n @change=\"updateExtensionStatus\"\n />\n </template>\n </Column>\n </DataTable>\n </PanelTemplate>\n</template>\n\n<script setup lang=\"ts\">\nimport { FilterMatchMode } from '@primevue/core/api'\nimport Column from 'primevue/column'\nimport ContextMenu from 'primevue/contextmenu'\nimport DataTable from 'primevue/datatable'\nimport Message from 'primevue/message'\nimport SelectButton from 'primevue/selectbutton'\nimport Tag from 'primevue/tag'\nimport ToggleSwitch from 'primevue/toggleswitch'\nimport { computed, onMounted, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport SearchBox from '@/components/common/SearchBox.vue'\nimport PanelTemplate from '@/components/dialog/content/setting/PanelTemplate.vue'\nimport Button from '@/components/ui/button/Button.vue'\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport { useExtensionStore } from '@/stores/extensionStore'\nimport type { ComfyExtension } from '@/types/comfy'\n\nconst { t } = useI18n()\n\nconst filterTypeKeys = ['all', 'core', 'custom'] as const\ntype FilterTypeKey = (typeof filterTypeKeys)[number]\nconst filterTypes = computed(() =>\n filterTypeKeys.map((key) => ({\n label: t(`g.${key}`),\n value: key\n }))\n)\nconst filterType = ref<FilterTypeKey>('all')\nconst selectedExtensions = ref<ComfyExtension[]>([])\n\nconst filters = ref({\n global: { value: '', matchMode: FilterMatchMode.CONTAINS }\n})\n\nconst extensionStore = useExtensionStore()\nconst settingStore = useSettingStore()\n\nconst editingEnabledExtensions = ref<Record<string, boolean>>({})\n\nconst filteredExtensions = computed(() => {\n const extensions = extensionStore.extensions\n switch (filterType.value) {\n case 'core':\n return extensions.filter((ext) =>\n extensionStore.isCoreExtension(ext.name)\n )\n case 'custom':\n return extensions.filter(\n (ext) => !extensionStore.isCoreExtension(ext.name)\n )\n default:\n return extensions\n }\n})\n\nonMounted(() => {\n extensionStore.extensions.forEach((ext) => {\n editingEnabledExtensions.value[ext.name] =\n extensionStore.isExtensionEnabled(ext.name)\n })\n})\n\nconst changedExtensions = computed(() => {\n return extensionStore.extensions.filter(\n (ext) =>\n editingEnabledExtensions.value[ext.name] !==\n extensionStore.isExtensionEnabled(ext.name)\n )\n})\n\nconst hasChanges = computed(() => {\n return changedExtensions.value.length > 0\n})\n\nconst updateExtensionStatus = async () => {\n const editingDisabledExtensionNames = Object.entries(\n editingEnabledExtensions.value\n )\n .filter(([_, enabled]) => !enabled)\n .map(([name]) => name)\n\n await settingStore.set('Comfy.Extension.Disabled', [\n ...extensionStore.inactiveDisabledExtensionNames,\n ...editingDisabledExtensionNames\n ])\n}\n\nconst enableAllExtensions = async () => {\n extensionStore.extensions.forEach((ext) => {\n if (extensionStore.isExtensionReadOnly(ext.name)) return\n\n editingEnabledExtensions.value[ext.name] = true\n })\n await updateExtensionStatus()\n}\n\nconst disableAllExtensions = async () => {\n extensionStore.extensions.forEach((ext) => {\n if (extensionStore.isExtensionReadOnly(ext.name)) return\n\n editingEnabledExtensions.value[ext.name] = false\n })\n await updateExtensionStatus()\n}\n\nconst disableThirdPartyExtensions = async () => {\n extensionStore.extensions.forEach((ext) => {\n if (extensionStore.isCoreExtension(ext.name)) return\n\n editingEnabledExtensions.value[ext.name] = false\n })\n await updateExtensionStatus()\n}\n\nconst applyChanges = () => {\n // Refresh the page to apply changes\n window.location.reload()\n}\n\nconst menu = ref<InstanceType<typeof ContextMenu>>()\nconst contextMenuItems = computed(() => [\n {\n label: t('g.enableSelected'),\n icon: 'pi pi-check',\n command: async () => {\n selectedExtensions.value.forEach((ext) => {\n if (!extensionStore.isExtensionReadOnly(ext.name)) {\n editingEnabledExtensions.value[ext.name] = true\n }\n })\n await updateExtensionStatus()\n }\n },\n {\n label: t('g.disableSelected'),\n icon: 'pi pi-times',\n command: async () => {\n selectedExtensions.value.forEach((ext) => {\n if (!extensionStore.isExtensionReadOnly(ext.name)) {\n editingEnabledExtensions.value[ext.name] = false\n }\n })\n await updateExtensionStatus()\n }\n },\n {\n separator: true\n },\n {\n label: t('g.enableAll'),\n icon: 'pi pi-check',\n command: enableAllExtensions\n },\n {\n label: t('g.disableAll'),\n icon: 'pi pi-times',\n command: disableAllExtensions\n },\n {\n label: t('g.disableThirdParty'),\n icon: 'pi pi-times',\n command: disableThirdPartyExtensions,\n disabled: !extensionStore.hasThirdPartyExtensions\n }\n])\n</script>\n","<template>\n <PanelTemplate value=\"Extension\" class=\"extension-panel\">\n <template #header>\n <SearchBox\n v-model=\"filters['global'].value\"\n :placeholder=\"$t('g.searchExtensions') + '...'\"\n />\n <Message\n v-if=\"hasChanges\"\n severity=\"info\"\n pt:text=\"w-full\"\n class=\"max-h-96 overflow-y-auto\"\n >\n <ul>\n <li v-for=\"ext in changedExtensions\" :key=\"ext.name\">\n <span>\n {{ extensionStore.isExtensionEnabled(ext.name) ? '[-]' : '[+]' }}\n </span>\n {{ ext.name }}\n </li>\n </ul>\n <div class=\"flex justify-end\">\n <Button variant=\"destructive\" @click=\"applyChanges\">\n {{ $t('g.reloadToApplyChanges') }}\n </Button>\n </div>\n </Message>\n </template>\n <div class=\"mb-3 flex gap-2\">\n <SelectButton\n v-model=\"filterType\"\n :options=\"filterTypes\"\n option-label=\"label\"\n option-value=\"value\"\n />\n </div>\n <DataTable\n v-model:selection=\"selectedExtensions\"\n :value=\"filteredExtensions\"\n striped-rows\n size=\"small\"\n :filters=\"filters\"\n selection-mode=\"multiple\"\n data-key=\"name\"\n >\n <Column selection-mode=\"multiple\" :frozen=\"true\" style=\"width: 3rem\" />\n <Column :header=\"$t('g.extensionName')\" sortable field=\"name\">\n <template #body=\"slotProps\">\n {{ slotProps.data.name }}\n <Tag\n v-if=\"extensionStore.isCoreExtension(slotProps.data.name)\"\n :value=\"$t('g.core')\"\n />\n <Tag v-else :value=\"$t('g.custom')\" severity=\"info\" />\n </template>\n </Column>\n <Column\n :pt=\"{\n headerCell: 'flex items-center justify-end',\n bodyCell: 'flex items-center justify-end'\n }\"\n >\n <template #header>\n <Button\n size=\"icon\"\n variant=\"muted-textonly\"\n @click=\"menu?.show($event)\"\n >\n <i class=\"pi pi-ellipsis-h\" />\n </Button>\n <ContextMenu ref=\"menu\" :model=\"contextMenuItems\" />\n </template>\n <template #body=\"slotProps\">\n <ToggleSwitch\n v-model=\"editingEnabledExtensions[slotProps.data.name]\"\n :disabled=\"extensionStore.isExtensionReadOnly(slotProps.data.name)\"\n @change=\"updateExtensionStatus\"\n />\n </template>\n </Column>\n </DataTable>\n </PanelTemplate>\n</template>\n\n<script setup lang=\"ts\">\nimport { FilterMatchMode } from '@primevue/core/api'\nimport Column from 'primevue/column'\nimport ContextMenu from 'primevue/contextmenu'\nimport DataTable from 'primevue/datatable'\nimport Message from 'primevue/message'\nimport SelectButton from 'primevue/selectbutton'\nimport Tag from 'primevue/tag'\nimport ToggleSwitch from 'primevue/toggleswitch'\nimport { computed, onMounted, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport SearchBox from '@/components/common/SearchBox.vue'\nimport PanelTemplate from '@/components/dialog/content/setting/PanelTemplate.vue'\nimport Button from '@/components/ui/button/Button.vue'\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport { useExtensionStore } from '@/stores/extensionStore'\nimport type { ComfyExtension } from '@/types/comfy'\n\nconst { t } = useI18n()\n\nconst filterTypeKeys = ['all', 'core', 'custom'] as const\ntype FilterTypeKey = (typeof filterTypeKeys)[number]\nconst filterTypes = computed(() =>\n filterTypeKeys.map((key) => ({\n label: t(`g.${key}`),\n value: key\n }))\n)\nconst filterType = ref<FilterTypeKey>('all')\nconst selectedExtensions = ref<ComfyExtension[]>([])\n\nconst filters = ref({\n global: { value: '', matchMode: FilterMatchMode.CONTAINS }\n})\n\nconst extensionStore = useExtensionStore()\nconst settingStore = useSettingStore()\n\nconst editingEnabledExtensions = ref<Record<string, boolean>>({})\n\nconst filteredExtensions = computed(() => {\n const extensions = extensionStore.extensions\n switch (filterType.value) {\n case 'core':\n return extensions.filter((ext) =>\n extensionStore.isCoreExtension(ext.name)\n )\n case 'custom':\n return extensions.filter(\n (ext) => !extensionStore.isCoreExtension(ext.name)\n )\n default:\n return extensions\n }\n})\n\nonMounted(() => {\n extensionStore.extensions.forEach((ext) => {\n editingEnabledExtensions.value[ext.name] =\n extensionStore.isExtensionEnabled(ext.name)\n })\n})\n\nconst changedExtensions = computed(() => {\n return extensionStore.extensions.filter(\n (ext) =>\n editingEnabledExtensions.value[ext.name] !==\n extensionStore.isExtensionEnabled(ext.name)\n )\n})\n\nconst hasChanges = computed(() => {\n return changedExtensions.value.length > 0\n})\n\nconst updateExtensionStatus = async () => {\n const editingDisabledExtensionNames = Object.entries(\n editingEnabledExtensions.value\n )\n .filter(([_, enabled]) => !enabled)\n .map(([name]) => name)\n\n await settingStore.set('Comfy.Extension.Disabled', [\n ...extensionStore.inactiveDisabledExtensionNames,\n ...editingDisabledExtensionNames\n ])\n}\n\nconst enableAllExtensions = async () => {\n extensionStore.extensions.forEach((ext) => {\n if (extensionStore.isExtensionReadOnly(ext.name)) return\n\n editingEnabledExtensions.value[ext.name] = true\n })\n await updateExtensionStatus()\n}\n\nconst disableAllExtensions = async () => {\n extensionStore.extensions.forEach((ext) => {\n if (extensionStore.isExtensionReadOnly(ext.name)) return\n\n editingEnabledExtensions.value[ext.name] = false\n })\n await updateExtensionStatus()\n}\n\nconst disableThirdPartyExtensions = async () => {\n extensionStore.extensions.forEach((ext) => {\n if (extensionStore.isCoreExtension(ext.name)) return\n\n editingEnabledExtensions.value[ext.name] = false\n })\n await updateExtensionStatus()\n}\n\nconst applyChanges = () => {\n // Refresh the page to apply changes\n window.location.reload()\n}\n\nconst menu = ref<InstanceType<typeof ContextMenu>>()\nconst contextMenuItems = computed(() => [\n {\n label: t('g.enableSelected'),\n icon: 'pi pi-check',\n command: async () => {\n selectedExtensions.value.forEach((ext) => {\n if (!extensionStore.isExtensionReadOnly(ext.name)) {\n editingEnabledExtensions.value[ext.name] = true\n }\n })\n await updateExtensionStatus()\n }\n },\n {\n label: t('g.disableSelected'),\n icon: 'pi pi-times',\n command: async () => {\n selectedExtensions.value.forEach((ext) => {\n if (!extensionStore.isExtensionReadOnly(ext.name)) {\n editingEnabledExtensions.value[ext.name] = false\n }\n })\n await updateExtensionStatus()\n }\n },\n {\n separator: true\n },\n {\n label: t('g.enableAll'),\n icon: 'pi pi-check',\n command: enableAllExtensions\n },\n {\n label: t('g.disableAll'),\n icon: 'pi pi-times',\n command: disableAllExtensions\n },\n {\n label: t('g.disableThirdParty'),\n icon: 'pi pi-times',\n command: disableThirdPartyExtensions,\n disabled: !extensionStore.hasThirdPartyExtensions\n }\n])\n</script>\n"],"mappings":"m8BCuGA,KAAM,CAAE,EAAA,CAAA,EAAM,EAAA,EAER,EAAiB,CAAC,MAAO,OAAQ,UAEjC,EAAc,EAAA,IAClB,EAAe,IAAK,IAAS,CAC3B,MAAO,EAAE,KAAK,CAAA,EAAA,EACd,MAAO,GACR,CAAC,EAEE,EAAa,EAAmB,KAAA,EAChC,EAAqB,EAAsB,CAAA,CAAE,EAE7C,EAAU,EAAI,CAClB,OAAQ,CAAE,MAAO,GAAI,UAAW,EAAgB,SAAS,CAC1D,EAEK,EAAiB,EAAA,EACjB,EAAe,GAAA,EAEf,EAA2B,EAA6B,CAAA,CAAE,EAE1D,EAAqB,EAAA,IAAe,CACxC,MAAM,EAAa,EAAe,WAClC,OAAQ,EAAW,MAAnB,CACE,IAAK,OACH,OAAO,EAAW,OAAQ,GACxB,EAAe,gBAAgB,EAAI,IAAA,CAAI,EAE3C,IAAK,SACH,OAAO,EAAW,OACf,GAAQ,CAAC,EAAe,gBAAgB,EAAI,IAAA,CAAI,EAErD,QACE,OAAO,KAIb,EAAA,IAAgB,CACd,EAAe,WAAW,QAAS,GAAQ,CACzC,EAAyB,MAAM,EAAI,IAAA,EACjC,EAAe,mBAAmB,EAAI,IAAA,MAI5C,MAAM,EAAoB,EAAA,IACjB,EAAe,WAAW,OAC9B,GACC,EAAyB,MAAM,EAAI,IAAA,IACnC,EAAe,mBAAmB,EAAI,IAAA,CAAI,GAI1C,EAAa,EAAA,IACV,EAAkB,MAAM,OAAS,GAGpC,EAAwB,EAAA,SAAY,CACxC,MAAM,EAAgC,OAAO,QAC3C,EAAyB,KAAA,EAExB,OAAA,CAAQ,CAAC,EAAG,CAAA,IAAa,CAAC,CAAA,EAC1B,IAAA,CAAK,CAAC,CAAA,IAAU,CAAA,EAEnB,MAAM,EAAa,IAAI,2BAA4B,CACjD,GAAG,EAAe,+BAClB,GAAG,CAAA,CACJ,GAV2B,yBAaxB,EAAsB,EAAA,SAAY,CACtC,EAAe,WAAW,QAAS,GAAQ,CACrC,EAAe,oBAAoB,EAAI,IAAA,IAE3C,EAAyB,MAAM,EAAI,IAAA,EAAQ,MAE7C,MAAM,EAAA,GANoB,uBAStB,EAAuB,EAAA,SAAY,CACvC,EAAe,WAAW,QAAS,GAAQ,CACrC,EAAe,oBAAoB,EAAI,IAAA,IAE3C,EAAyB,MAAM,EAAI,IAAA,EAAQ,MAE7C,MAAM,EAAA,GANqB,wBASvB,EAA8B,EAAA,SAAY,CAC9C,EAAe,WAAW,QAAS,GAAQ,CACrC,EAAe,gBAAgB,EAAI,IAAA,IAEvC,EAAyB,MAAM,EAAI,IAAA,EAAQ,MAE7C,MAAM,EAAA,GAN4B,+BAS9B,EAAA,EAAA,IAAqB,CAEzB,OAAO,SAAS,OAAA,GAFZ,gBAKA,EAAO,EAAA,EACP,EAAmB,EAAA,IAAe,CACtC,CACE,MAAO,EAAE,kBAAA,EACT,KAAM,cACN,QAAS,EAAA,SAAY,CACnB,EAAmB,MAAM,QAAS,GAAQ,CACnC,EAAe,oBAAoB,EAAI,IAAA,IAC1C,EAAyB,MAAM,EAAI,IAAA,EAAQ,MAG/C,MAAM,EAAA,GANC,YASX,CACE,MAAO,EAAE,mBAAA,EACT,KAAM,cACN,QAAS,EAAA,SAAY,CACnB,EAAmB,MAAM,QAAS,GAAQ,CACnC,EAAe,oBAAoB,EAAI,IAAA,IAC1C,EAAyB,MAAM,EAAI,IAAA,EAAQ,MAG/C,MAAM,EAAA,GANC,YASX,CACE,UAAW,EAAA,EAEb,CACE,MAAO,EAAE,aAAA,EACT,KAAM,cACN,QAAS,GAEX,CACE,MAAO,EAAE,cAAA,EACT,KAAM,cACN,QAAS,GAEX,CACE,MAAO,EAAE,qBAAA,EACT,KAAM,cACN,QAAS,EACT,SAAU,CAAC,EAAe,yBAE7B"}
1
+ {"version":3,"file":"ExtensionPanel-Bzb9QtKj.js","names":[],"sources":["../../src/platform/settings/components/ExtensionPanel.vue","../../src/platform/settings/components/ExtensionPanel.vue"],"sourcesContent":["<template>\n <PanelTemplate value=\"Extension\" class=\"extension-panel\">\n <template #header>\n <SearchBox\n v-model=\"filters['global'].value\"\n :placeholder=\"$t('g.searchExtensions') + '...'\"\n />\n <Message\n v-if=\"hasChanges\"\n severity=\"info\"\n pt:text=\"w-full\"\n class=\"max-h-96 overflow-y-auto\"\n >\n <ul>\n <li v-for=\"ext in changedExtensions\" :key=\"ext.name\">\n <span>\n {{ extensionStore.isExtensionEnabled(ext.name) ? '[-]' : '[+]' }}\n </span>\n {{ ext.name }}\n </li>\n </ul>\n <div class=\"flex justify-end\">\n <Button variant=\"destructive\" @click=\"applyChanges\">\n {{ $t('g.reloadToApplyChanges') }}\n </Button>\n </div>\n </Message>\n </template>\n <div class=\"mb-3 flex gap-2\">\n <SelectButton\n v-model=\"filterType\"\n :options=\"filterTypes\"\n option-label=\"label\"\n option-value=\"value\"\n />\n </div>\n <DataTable\n v-model:selection=\"selectedExtensions\"\n :value=\"filteredExtensions\"\n striped-rows\n size=\"small\"\n :filters=\"filters\"\n selection-mode=\"multiple\"\n data-key=\"name\"\n >\n <Column selection-mode=\"multiple\" :frozen=\"true\" style=\"width: 3rem\" />\n <Column :header=\"$t('g.extensionName')\" sortable field=\"name\">\n <template #body=\"slotProps\">\n {{ slotProps.data.name }}\n <Tag\n v-if=\"extensionStore.isCoreExtension(slotProps.data.name)\"\n :value=\"$t('g.core')\"\n />\n <Tag v-else :value=\"$t('g.custom')\" severity=\"info\" />\n </template>\n </Column>\n <Column\n :pt=\"{\n headerCell: 'flex items-center justify-end',\n bodyCell: 'flex items-center justify-end'\n }\"\n >\n <template #header>\n <Button\n size=\"icon\"\n variant=\"muted-textonly\"\n @click=\"menu?.show($event)\"\n >\n <i class=\"pi pi-ellipsis-h\" />\n </Button>\n <ContextMenu ref=\"menu\" :model=\"contextMenuItems\" />\n </template>\n <template #body=\"slotProps\">\n <ToggleSwitch\n v-model=\"editingEnabledExtensions[slotProps.data.name]\"\n :disabled=\"extensionStore.isExtensionReadOnly(slotProps.data.name)\"\n @change=\"updateExtensionStatus\"\n />\n </template>\n </Column>\n </DataTable>\n </PanelTemplate>\n</template>\n\n<script setup lang=\"ts\">\nimport { FilterMatchMode } from '@primevue/core/api'\nimport Column from 'primevue/column'\nimport ContextMenu from 'primevue/contextmenu'\nimport DataTable from 'primevue/datatable'\nimport Message from 'primevue/message'\nimport SelectButton from 'primevue/selectbutton'\nimport Tag from 'primevue/tag'\nimport ToggleSwitch from 'primevue/toggleswitch'\nimport { computed, onMounted, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport SearchBox from '@/components/common/SearchBox.vue'\nimport PanelTemplate from '@/components/dialog/content/setting/PanelTemplate.vue'\nimport Button from '@/components/ui/button/Button.vue'\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport { useExtensionStore } from '@/stores/extensionStore'\nimport type { ComfyExtension } from '@/types/comfy'\n\nconst { t } = useI18n()\n\nconst filterTypeKeys = ['all', 'core', 'custom'] as const\ntype FilterTypeKey = (typeof filterTypeKeys)[number]\nconst filterTypes = computed(() =>\n filterTypeKeys.map((key) => ({\n label: t(`g.${key}`),\n value: key\n }))\n)\nconst filterType = ref<FilterTypeKey>('all')\nconst selectedExtensions = ref<ComfyExtension[]>([])\n\nconst filters = ref({\n global: { value: '', matchMode: FilterMatchMode.CONTAINS }\n})\n\nconst extensionStore = useExtensionStore()\nconst settingStore = useSettingStore()\n\nconst editingEnabledExtensions = ref<Record<string, boolean>>({})\n\nconst filteredExtensions = computed(() => {\n const extensions = extensionStore.extensions\n switch (filterType.value) {\n case 'core':\n return extensions.filter((ext) =>\n extensionStore.isCoreExtension(ext.name)\n )\n case 'custom':\n return extensions.filter(\n (ext) => !extensionStore.isCoreExtension(ext.name)\n )\n default:\n return extensions\n }\n})\n\nonMounted(() => {\n extensionStore.extensions.forEach((ext) => {\n editingEnabledExtensions.value[ext.name] =\n extensionStore.isExtensionEnabled(ext.name)\n })\n})\n\nconst changedExtensions = computed(() => {\n return extensionStore.extensions.filter(\n (ext) =>\n editingEnabledExtensions.value[ext.name] !==\n extensionStore.isExtensionEnabled(ext.name)\n )\n})\n\nconst hasChanges = computed(() => {\n return changedExtensions.value.length > 0\n})\n\nconst updateExtensionStatus = async () => {\n const editingDisabledExtensionNames = Object.entries(\n editingEnabledExtensions.value\n )\n .filter(([_, enabled]) => !enabled)\n .map(([name]) => name)\n\n await settingStore.set('Comfy.Extension.Disabled', [\n ...extensionStore.inactiveDisabledExtensionNames,\n ...editingDisabledExtensionNames\n ])\n}\n\nconst enableAllExtensions = async () => {\n extensionStore.extensions.forEach((ext) => {\n if (extensionStore.isExtensionReadOnly(ext.name)) return\n\n editingEnabledExtensions.value[ext.name] = true\n })\n await updateExtensionStatus()\n}\n\nconst disableAllExtensions = async () => {\n extensionStore.extensions.forEach((ext) => {\n if (extensionStore.isExtensionReadOnly(ext.name)) return\n\n editingEnabledExtensions.value[ext.name] = false\n })\n await updateExtensionStatus()\n}\n\nconst disableThirdPartyExtensions = async () => {\n extensionStore.extensions.forEach((ext) => {\n if (extensionStore.isCoreExtension(ext.name)) return\n\n editingEnabledExtensions.value[ext.name] = false\n })\n await updateExtensionStatus()\n}\n\nconst applyChanges = () => {\n // Refresh the page to apply changes\n window.location.reload()\n}\n\nconst menu = ref<InstanceType<typeof ContextMenu>>()\nconst contextMenuItems = computed(() => [\n {\n label: t('g.enableSelected'),\n icon: 'pi pi-check',\n command: async () => {\n selectedExtensions.value.forEach((ext) => {\n if (!extensionStore.isExtensionReadOnly(ext.name)) {\n editingEnabledExtensions.value[ext.name] = true\n }\n })\n await updateExtensionStatus()\n }\n },\n {\n label: t('g.disableSelected'),\n icon: 'pi pi-times',\n command: async () => {\n selectedExtensions.value.forEach((ext) => {\n if (!extensionStore.isExtensionReadOnly(ext.name)) {\n editingEnabledExtensions.value[ext.name] = false\n }\n })\n await updateExtensionStatus()\n }\n },\n {\n separator: true\n },\n {\n label: t('g.enableAll'),\n icon: 'pi pi-check',\n command: enableAllExtensions\n },\n {\n label: t('g.disableAll'),\n icon: 'pi pi-times',\n command: disableAllExtensions\n },\n {\n label: t('g.disableThirdParty'),\n icon: 'pi pi-times',\n command: disableThirdPartyExtensions,\n disabled: !extensionStore.hasThirdPartyExtensions\n }\n])\n</script>\n","<template>\n <PanelTemplate value=\"Extension\" class=\"extension-panel\">\n <template #header>\n <SearchBox\n v-model=\"filters['global'].value\"\n :placeholder=\"$t('g.searchExtensions') + '...'\"\n />\n <Message\n v-if=\"hasChanges\"\n severity=\"info\"\n pt:text=\"w-full\"\n class=\"max-h-96 overflow-y-auto\"\n >\n <ul>\n <li v-for=\"ext in changedExtensions\" :key=\"ext.name\">\n <span>\n {{ extensionStore.isExtensionEnabled(ext.name) ? '[-]' : '[+]' }}\n </span>\n {{ ext.name }}\n </li>\n </ul>\n <div class=\"flex justify-end\">\n <Button variant=\"destructive\" @click=\"applyChanges\">\n {{ $t('g.reloadToApplyChanges') }}\n </Button>\n </div>\n </Message>\n </template>\n <div class=\"mb-3 flex gap-2\">\n <SelectButton\n v-model=\"filterType\"\n :options=\"filterTypes\"\n option-label=\"label\"\n option-value=\"value\"\n />\n </div>\n <DataTable\n v-model:selection=\"selectedExtensions\"\n :value=\"filteredExtensions\"\n striped-rows\n size=\"small\"\n :filters=\"filters\"\n selection-mode=\"multiple\"\n data-key=\"name\"\n >\n <Column selection-mode=\"multiple\" :frozen=\"true\" style=\"width: 3rem\" />\n <Column :header=\"$t('g.extensionName')\" sortable field=\"name\">\n <template #body=\"slotProps\">\n {{ slotProps.data.name }}\n <Tag\n v-if=\"extensionStore.isCoreExtension(slotProps.data.name)\"\n :value=\"$t('g.core')\"\n />\n <Tag v-else :value=\"$t('g.custom')\" severity=\"info\" />\n </template>\n </Column>\n <Column\n :pt=\"{\n headerCell: 'flex items-center justify-end',\n bodyCell: 'flex items-center justify-end'\n }\"\n >\n <template #header>\n <Button\n size=\"icon\"\n variant=\"muted-textonly\"\n @click=\"menu?.show($event)\"\n >\n <i class=\"pi pi-ellipsis-h\" />\n </Button>\n <ContextMenu ref=\"menu\" :model=\"contextMenuItems\" />\n </template>\n <template #body=\"slotProps\">\n <ToggleSwitch\n v-model=\"editingEnabledExtensions[slotProps.data.name]\"\n :disabled=\"extensionStore.isExtensionReadOnly(slotProps.data.name)\"\n @change=\"updateExtensionStatus\"\n />\n </template>\n </Column>\n </DataTable>\n </PanelTemplate>\n</template>\n\n<script setup lang=\"ts\">\nimport { FilterMatchMode } from '@primevue/core/api'\nimport Column from 'primevue/column'\nimport ContextMenu from 'primevue/contextmenu'\nimport DataTable from 'primevue/datatable'\nimport Message from 'primevue/message'\nimport SelectButton from 'primevue/selectbutton'\nimport Tag from 'primevue/tag'\nimport ToggleSwitch from 'primevue/toggleswitch'\nimport { computed, onMounted, ref } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport SearchBox from '@/components/common/SearchBox.vue'\nimport PanelTemplate from '@/components/dialog/content/setting/PanelTemplate.vue'\nimport Button from '@/components/ui/button/Button.vue'\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport { useExtensionStore } from '@/stores/extensionStore'\nimport type { ComfyExtension } from '@/types/comfy'\n\nconst { t } = useI18n()\n\nconst filterTypeKeys = ['all', 'core', 'custom'] as const\ntype FilterTypeKey = (typeof filterTypeKeys)[number]\nconst filterTypes = computed(() =>\n filterTypeKeys.map((key) => ({\n label: t(`g.${key}`),\n value: key\n }))\n)\nconst filterType = ref<FilterTypeKey>('all')\nconst selectedExtensions = ref<ComfyExtension[]>([])\n\nconst filters = ref({\n global: { value: '', matchMode: FilterMatchMode.CONTAINS }\n})\n\nconst extensionStore = useExtensionStore()\nconst settingStore = useSettingStore()\n\nconst editingEnabledExtensions = ref<Record<string, boolean>>({})\n\nconst filteredExtensions = computed(() => {\n const extensions = extensionStore.extensions\n switch (filterType.value) {\n case 'core':\n return extensions.filter((ext) =>\n extensionStore.isCoreExtension(ext.name)\n )\n case 'custom':\n return extensions.filter(\n (ext) => !extensionStore.isCoreExtension(ext.name)\n )\n default:\n return extensions\n }\n})\n\nonMounted(() => {\n extensionStore.extensions.forEach((ext) => {\n editingEnabledExtensions.value[ext.name] =\n extensionStore.isExtensionEnabled(ext.name)\n })\n})\n\nconst changedExtensions = computed(() => {\n return extensionStore.extensions.filter(\n (ext) =>\n editingEnabledExtensions.value[ext.name] !==\n extensionStore.isExtensionEnabled(ext.name)\n )\n})\n\nconst hasChanges = computed(() => {\n return changedExtensions.value.length > 0\n})\n\nconst updateExtensionStatus = async () => {\n const editingDisabledExtensionNames = Object.entries(\n editingEnabledExtensions.value\n )\n .filter(([_, enabled]) => !enabled)\n .map(([name]) => name)\n\n await settingStore.set('Comfy.Extension.Disabled', [\n ...extensionStore.inactiveDisabledExtensionNames,\n ...editingDisabledExtensionNames\n ])\n}\n\nconst enableAllExtensions = async () => {\n extensionStore.extensions.forEach((ext) => {\n if (extensionStore.isExtensionReadOnly(ext.name)) return\n\n editingEnabledExtensions.value[ext.name] = true\n })\n await updateExtensionStatus()\n}\n\nconst disableAllExtensions = async () => {\n extensionStore.extensions.forEach((ext) => {\n if (extensionStore.isExtensionReadOnly(ext.name)) return\n\n editingEnabledExtensions.value[ext.name] = false\n })\n await updateExtensionStatus()\n}\n\nconst disableThirdPartyExtensions = async () => {\n extensionStore.extensions.forEach((ext) => {\n if (extensionStore.isCoreExtension(ext.name)) return\n\n editingEnabledExtensions.value[ext.name] = false\n })\n await updateExtensionStatus()\n}\n\nconst applyChanges = () => {\n // Refresh the page to apply changes\n window.location.reload()\n}\n\nconst menu = ref<InstanceType<typeof ContextMenu>>()\nconst contextMenuItems = computed(() => [\n {\n label: t('g.enableSelected'),\n icon: 'pi pi-check',\n command: async () => {\n selectedExtensions.value.forEach((ext) => {\n if (!extensionStore.isExtensionReadOnly(ext.name)) {\n editingEnabledExtensions.value[ext.name] = true\n }\n })\n await updateExtensionStatus()\n }\n },\n {\n label: t('g.disableSelected'),\n icon: 'pi pi-times',\n command: async () => {\n selectedExtensions.value.forEach((ext) => {\n if (!extensionStore.isExtensionReadOnly(ext.name)) {\n editingEnabledExtensions.value[ext.name] = false\n }\n })\n await updateExtensionStatus()\n }\n },\n {\n separator: true\n },\n {\n label: t('g.enableAll'),\n icon: 'pi pi-check',\n command: enableAllExtensions\n },\n {\n label: t('g.disableAll'),\n icon: 'pi pi-times',\n command: disableAllExtensions\n },\n {\n label: t('g.disableThirdParty'),\n icon: 'pi pi-times',\n command: disableThirdPartyExtensions,\n disabled: !extensionStore.hasThirdPartyExtensions\n }\n])\n</script>\n"],"mappings":"m8BCuGA,KAAM,CAAE,EAAA,CAAA,EAAM,EAAA,EAER,EAAiB,CAAC,MAAO,OAAQ,UAEjC,EAAc,EAAA,IAClB,EAAe,IAAK,IAAS,CAC3B,MAAO,EAAE,KAAK,CAAA,EAAA,EACd,MAAO,GACR,CAAC,EAEE,EAAa,EAAmB,KAAA,EAChC,EAAqB,EAAsB,CAAA,CAAE,EAE7C,EAAU,EAAI,CAClB,OAAQ,CAAE,MAAO,GAAI,UAAW,EAAgB,SAAS,CAC1D,EAEK,EAAiB,EAAA,EACjB,EAAe,GAAA,EAEf,EAA2B,EAA6B,CAAA,CAAE,EAE1D,EAAqB,EAAA,IAAe,CACxC,MAAM,EAAa,EAAe,WAClC,OAAQ,EAAW,MAAnB,CACE,IAAK,OACH,OAAO,EAAW,OAAQ,GACxB,EAAe,gBAAgB,EAAI,IAAA,CAAI,EAE3C,IAAK,SACH,OAAO,EAAW,OACf,GAAQ,CAAC,EAAe,gBAAgB,EAAI,IAAA,CAAI,EAErD,QACE,OAAO,KAIb,EAAA,IAAgB,CACd,EAAe,WAAW,QAAS,GAAQ,CACzC,EAAyB,MAAM,EAAI,IAAA,EACjC,EAAe,mBAAmB,EAAI,IAAA,MAI5C,MAAM,EAAoB,EAAA,IACjB,EAAe,WAAW,OAC9B,GACC,EAAyB,MAAM,EAAI,IAAA,IACnC,EAAe,mBAAmB,EAAI,IAAA,CAAI,GAI1C,EAAa,EAAA,IACV,EAAkB,MAAM,OAAS,GAGpC,EAAwB,EAAA,SAAY,CACxC,MAAM,EAAgC,OAAO,QAC3C,EAAyB,KAAA,EAExB,OAAA,CAAQ,CAAC,EAAG,CAAA,IAAa,CAAC,CAAA,EAC1B,IAAA,CAAK,CAAC,CAAA,IAAU,CAAA,EAEnB,MAAM,EAAa,IAAI,2BAA4B,CACjD,GAAG,EAAe,+BAClB,GAAG,CAAA,CACJ,GAV2B,yBAaxB,EAAsB,EAAA,SAAY,CACtC,EAAe,WAAW,QAAS,GAAQ,CACrC,EAAe,oBAAoB,EAAI,IAAA,IAE3C,EAAyB,MAAM,EAAI,IAAA,EAAQ,MAE7C,MAAM,EAAA,GANoB,uBAStB,EAAuB,EAAA,SAAY,CACvC,EAAe,WAAW,QAAS,GAAQ,CACrC,EAAe,oBAAoB,EAAI,IAAA,IAE3C,EAAyB,MAAM,EAAI,IAAA,EAAQ,MAE7C,MAAM,EAAA,GANqB,wBASvB,EAA8B,EAAA,SAAY,CAC9C,EAAe,WAAW,QAAS,GAAQ,CACrC,EAAe,gBAAgB,EAAI,IAAA,IAEvC,EAAyB,MAAM,EAAI,IAAA,EAAQ,MAE7C,MAAM,EAAA,GAN4B,+BAS9B,EAAA,EAAA,IAAqB,CAEzB,OAAO,SAAS,OAAA,GAFZ,gBAKA,EAAO,EAAA,EACP,EAAmB,EAAA,IAAe,CACtC,CACE,MAAO,EAAE,kBAAA,EACT,KAAM,cACN,QAAS,EAAA,SAAY,CACnB,EAAmB,MAAM,QAAS,GAAQ,CACnC,EAAe,oBAAoB,EAAI,IAAA,IAC1C,EAAyB,MAAM,EAAI,IAAA,EAAQ,MAG/C,MAAM,EAAA,GANC,YASX,CACE,MAAO,EAAE,mBAAA,EACT,KAAM,cACN,QAAS,EAAA,SAAY,CACnB,EAAmB,MAAM,QAAS,GAAQ,CACnC,EAAe,oBAAoB,EAAI,IAAA,IAC1C,EAAyB,MAAM,EAAI,IAAA,EAAQ,MAG/C,MAAM,EAAA,GANC,YASX,CACE,UAAW,EAAA,EAEb,CACE,MAAO,EAAE,aAAA,EACT,KAAM,cACN,QAAS,GAEX,CACE,MAAO,EAAE,cAAA,EACT,KAAM,cACN,QAAS,GAEX,CACE,MAAO,EAAE,qBAAA,EACT,KAAM,cACN,QAAS,EACT,SAAU,CAAC,EAAe,yBAE7B"}
@@ -1,4 +1,4 @@
1
- var l=Object.defineProperty;var n=(s,a)=>l(s,"name",{value:a,configurable:!0});import{mt as u,o as p}from"./vendor-primevue-DcMRXJN3.js";import{Jo as f,Va as g,Ya as _,do as y,io as c,wo as r}from"./vendor-other-DlQF6V2E.js";import{It as h}from"./api-CUAc7rDA.js";import{yr as v}from"./dialogService-BZ1FmjZL.js";var T=_({__name:"GlobalToast",setup(s){const a=u(),o=h(),i=v();r(()=>o.messagesToAdd,t=>{t.length!==0&&(t.forEach(e=>{a.add(e)}),o.messagesToAdd=[])},{deep:!0}),r(()=>o.messagesToRemove,t=>{t.length!==0&&(t.forEach(e=>{a.remove(e)}),o.messagesToRemove=[])},{deep:!0}),r(()=>o.removeAllRequested,t=>{t&&(a.removeAllGroups(),o.removeAllRequested=!1)});function m(){const t=document.getElementById("dynamic-toast-style")||d(),e=document.querySelector(".graph-canvas-container")?.getBoundingClientRect();e&&(t.textContent=`
1
+ var l=Object.defineProperty;var n=(s,a)=>l(s,"name",{value:a,configurable:!0});import{mt as u,o as p}from"./vendor-primevue-DcMRXJN3.js";import{Jo as f,Va as g,Ya as _,do as y,io as c,wo as r}from"./vendor-other-DlQF6V2E.js";import{It as h}from"./api-Dwq2LQIW.js";import{yr as v}from"./dialogService-YG0RH337.js";var T=_({__name:"GlobalToast",setup(s){const a=u(),o=h(),i=v();r(()=>o.messagesToAdd,t=>{t.length!==0&&(t.forEach(e=>{a.add(e)}),o.messagesToAdd=[])},{deep:!0}),r(()=>o.messagesToRemove,t=>{t.length!==0&&(t.forEach(e=>{a.remove(e)}),o.messagesToRemove=[])},{deep:!0}),r(()=>o.removeAllRequested,t=>{t&&(a.removeAllGroups(),o.removeAllRequested=!1)});function m(){const t=document.getElementById("dynamic-toast-style")||d(),e=document.querySelector(".graph-canvas-container")?.getBoundingClientRect();e&&(t.textContent=`
2
2
  .p-toast.p-component.p-toast-top-right {
3
3
  top: ${e.top+100}px !important;
4
4
  right: ${window.innerWidth-(e.left+e.width)+20}px !important;
@@ -6,4 +6,4 @@ var l=Object.defineProperty;var n=(s,a)=>l(s,"name",{value:a,configurable:!0});i
6
6
  }
7
7
  `)}n(m,"updateToastPosition");function d(){const t=document.createElement("style");return t.id="dynamic-toast-style",document.head.appendChild(t),t}return n(d,"createStyleElement"),r(()=>i.get("Comfy.UseNewMenu"),()=>c(m),{immediate:!0}),r(()=>i.get("Comfy.Sidebar.Location"),()=>c(m),{immediate:!0}),(t,e)=>(y(),g(f(p)))}}),A=T;export{A as t};
8
8
 
9
- //# sourceMappingURL=GlobalToast-BiCmpIvO.js.map
9
+ //# sourceMappingURL=GlobalToast-BSCvu6Hw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalToast-BiCmpIvO.js","names":[],"sources":["../../src/components/toast/GlobalToast.vue","../../src/components/toast/GlobalToast.vue"],"sourcesContent":["<template>\n <Toast />\n</template>\n\n<script setup lang=\"ts\">\nimport Toast from 'primevue/toast'\nimport { useToast } from 'primevue/usetoast'\nimport { nextTick, watch } from 'vue'\n\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport { useToastStore } from '@/platform/updates/common/toastStore'\n\nconst toast = useToast()\nconst toastStore = useToastStore()\nconst settingStore = useSettingStore()\n\nwatch(\n () => toastStore.messagesToAdd,\n (newMessages) => {\n if (newMessages.length === 0) {\n return\n }\n\n newMessages.forEach((message) => {\n toast.add(message)\n })\n toastStore.messagesToAdd = []\n },\n { deep: true }\n)\n\nwatch(\n () => toastStore.messagesToRemove,\n (messagesToRemove) => {\n if (messagesToRemove.length === 0) {\n return\n }\n\n messagesToRemove.forEach((message) => {\n toast.remove(message)\n })\n toastStore.messagesToRemove = []\n },\n { deep: true }\n)\n\nwatch(\n () => toastStore.removeAllRequested,\n (requested) => {\n if (requested) {\n toast.removeAllGroups()\n toastStore.removeAllRequested = false\n }\n }\n)\n\nfunction updateToastPosition() {\n const styleElement =\n document.getElementById('dynamic-toast-style') || createStyleElement()\n const rect = document\n .querySelector('.graph-canvas-container')\n ?.getBoundingClientRect()\n if (!rect) return\n\n styleElement.textContent = `\n .p-toast.p-component.p-toast-top-right {\n top: ${rect.top + 100}px !important;\n right: ${window.innerWidth - (rect.left + rect.width) + 20}px !important;\n z-index: 10000 !important;\n }\n `\n}\n\nfunction createStyleElement() {\n const style = document.createElement('style')\n style.id = 'dynamic-toast-style'\n document.head.appendChild(style)\n return style\n}\n\nwatch(\n () => settingStore.get('Comfy.UseNewMenu'),\n () => nextTick(updateToastPosition),\n { immediate: true }\n)\nwatch(\n () => settingStore.get('Comfy.Sidebar.Location'),\n () => nextTick(updateToastPosition),\n { immediate: true }\n)\n</script>\n","<template>\n <Toast />\n</template>\n\n<script setup lang=\"ts\">\nimport Toast from 'primevue/toast'\nimport { useToast } from 'primevue/usetoast'\nimport { nextTick, watch } from 'vue'\n\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport { useToastStore } from '@/platform/updates/common/toastStore'\n\nconst toast = useToast()\nconst toastStore = useToastStore()\nconst settingStore = useSettingStore()\n\nwatch(\n () => toastStore.messagesToAdd,\n (newMessages) => {\n if (newMessages.length === 0) {\n return\n }\n\n newMessages.forEach((message) => {\n toast.add(message)\n })\n toastStore.messagesToAdd = []\n },\n { deep: true }\n)\n\nwatch(\n () => toastStore.messagesToRemove,\n (messagesToRemove) => {\n if (messagesToRemove.length === 0) {\n return\n }\n\n messagesToRemove.forEach((message) => {\n toast.remove(message)\n })\n toastStore.messagesToRemove = []\n },\n { deep: true }\n)\n\nwatch(\n () => toastStore.removeAllRequested,\n (requested) => {\n if (requested) {\n toast.removeAllGroups()\n toastStore.removeAllRequested = false\n }\n }\n)\n\nfunction updateToastPosition() {\n const styleElement =\n document.getElementById('dynamic-toast-style') || createStyleElement()\n const rect = document\n .querySelector('.graph-canvas-container')\n ?.getBoundingClientRect()\n if (!rect) return\n\n styleElement.textContent = `\n .p-toast.p-component.p-toast-top-right {\n top: ${rect.top + 100}px !important;\n right: ${window.innerWidth - (rect.left + rect.width) + 20}px !important;\n z-index: 10000 !important;\n }\n `\n}\n\nfunction createStyleElement() {\n const style = document.createElement('style')\n style.id = 'dynamic-toast-style'\n document.head.appendChild(style)\n return style\n}\n\nwatch(\n () => settingStore.get('Comfy.UseNewMenu'),\n () => nextTick(updateToastPosition),\n { immediate: true }\n)\nwatch(\n () => settingStore.get('Comfy.Sidebar.Location'),\n () => nextTick(updateToastPosition),\n { immediate: true }\n)\n</script>\n"],"mappings":"gWCYA,MAAM,EAAQ,EAAA,EACR,EAAa,EAAA,EACb,EAAe,EAAA,EAErB,EAAA,IACQ,EAAW,cAChB,GAAgB,CACX,EAAY,SAAW,IAI3B,EAAY,QAAS,GAAY,CAC/B,EAAM,IAAI,CAAA,IAEZ,EAAW,cAAgB,CAAA,IAE7B,CAAE,KAAM,EAAA,CAAK,EAGf,EAAA,IACQ,EAAW,iBAChB,GAAqB,CAChB,EAAiB,SAAW,IAIhC,EAAiB,QAAS,GAAY,CACpC,EAAM,OAAO,CAAA,IAEf,EAAW,iBAAmB,CAAA,IAEhC,CAAE,KAAM,EAAA,CAAK,EAGf,EAAA,IACQ,EAAW,mBAChB,GAAc,CACT,IACF,EAAM,gBAAA,EACN,EAAW,mBAAqB,MAKtC,SAAS,GAAsB,CAC7B,MAAM,EACJ,SAAS,eAAe,qBAAA,GAA0B,EAAA,EAC9C,EAAO,SACV,cAAc,yBAAA,GACb,sBAAA,EACC,IAEL,EAAa,YAAc;AAAA;AAAA,aAEhB,EAAK,IAAM,GAAA;AAAA,eACT,OAAO,YAAc,EAAK,KAAO,EAAK,OAAS,EAAA;AAAA;AAAA;AAAA,KAXrD,EAAA,EAAA,uBAiBT,SAAS,GAAqB,CAC5B,MAAM,EAAQ,SAAS,cAAc,OAAA,EACrC,OAAA,EAAM,GAAK,sBACX,SAAS,KAAK,YAAY,CAAA,EACnB,EAJA,OAAA,EAAA,EAAA,sBAOT,EAAA,IACQ,EAAa,IAAI,kBAAA,EAAmB,IACpC,EAAS,CAAA,EACf,CAAE,UAAW,EAAA,CAAK,EAEpB,EAAA,IACQ,EAAa,IAAI,wBAAA,EAAyB,IAC1C,EAAS,CAAA,EACf,CAAE,UAAW,EAAA,CAAK"}
1
+ {"version":3,"file":"GlobalToast-BSCvu6Hw.js","names":[],"sources":["../../src/components/toast/GlobalToast.vue","../../src/components/toast/GlobalToast.vue"],"sourcesContent":["<template>\n <Toast />\n</template>\n\n<script setup lang=\"ts\">\nimport Toast from 'primevue/toast'\nimport { useToast } from 'primevue/usetoast'\nimport { nextTick, watch } from 'vue'\n\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport { useToastStore } from '@/platform/updates/common/toastStore'\n\nconst toast = useToast()\nconst toastStore = useToastStore()\nconst settingStore = useSettingStore()\n\nwatch(\n () => toastStore.messagesToAdd,\n (newMessages) => {\n if (newMessages.length === 0) {\n return\n }\n\n newMessages.forEach((message) => {\n toast.add(message)\n })\n toastStore.messagesToAdd = []\n },\n { deep: true }\n)\n\nwatch(\n () => toastStore.messagesToRemove,\n (messagesToRemove) => {\n if (messagesToRemove.length === 0) {\n return\n }\n\n messagesToRemove.forEach((message) => {\n toast.remove(message)\n })\n toastStore.messagesToRemove = []\n },\n { deep: true }\n)\n\nwatch(\n () => toastStore.removeAllRequested,\n (requested) => {\n if (requested) {\n toast.removeAllGroups()\n toastStore.removeAllRequested = false\n }\n }\n)\n\nfunction updateToastPosition() {\n const styleElement =\n document.getElementById('dynamic-toast-style') || createStyleElement()\n const rect = document\n .querySelector('.graph-canvas-container')\n ?.getBoundingClientRect()\n if (!rect) return\n\n styleElement.textContent = `\n .p-toast.p-component.p-toast-top-right {\n top: ${rect.top + 100}px !important;\n right: ${window.innerWidth - (rect.left + rect.width) + 20}px !important;\n z-index: 10000 !important;\n }\n `\n}\n\nfunction createStyleElement() {\n const style = document.createElement('style')\n style.id = 'dynamic-toast-style'\n document.head.appendChild(style)\n return style\n}\n\nwatch(\n () => settingStore.get('Comfy.UseNewMenu'),\n () => nextTick(updateToastPosition),\n { immediate: true }\n)\nwatch(\n () => settingStore.get('Comfy.Sidebar.Location'),\n () => nextTick(updateToastPosition),\n { immediate: true }\n)\n</script>\n","<template>\n <Toast />\n</template>\n\n<script setup lang=\"ts\">\nimport Toast from 'primevue/toast'\nimport { useToast } from 'primevue/usetoast'\nimport { nextTick, watch } from 'vue'\n\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport { useToastStore } from '@/platform/updates/common/toastStore'\n\nconst toast = useToast()\nconst toastStore = useToastStore()\nconst settingStore = useSettingStore()\n\nwatch(\n () => toastStore.messagesToAdd,\n (newMessages) => {\n if (newMessages.length === 0) {\n return\n }\n\n newMessages.forEach((message) => {\n toast.add(message)\n })\n toastStore.messagesToAdd = []\n },\n { deep: true }\n)\n\nwatch(\n () => toastStore.messagesToRemove,\n (messagesToRemove) => {\n if (messagesToRemove.length === 0) {\n return\n }\n\n messagesToRemove.forEach((message) => {\n toast.remove(message)\n })\n toastStore.messagesToRemove = []\n },\n { deep: true }\n)\n\nwatch(\n () => toastStore.removeAllRequested,\n (requested) => {\n if (requested) {\n toast.removeAllGroups()\n toastStore.removeAllRequested = false\n }\n }\n)\n\nfunction updateToastPosition() {\n const styleElement =\n document.getElementById('dynamic-toast-style') || createStyleElement()\n const rect = document\n .querySelector('.graph-canvas-container')\n ?.getBoundingClientRect()\n if (!rect) return\n\n styleElement.textContent = `\n .p-toast.p-component.p-toast-top-right {\n top: ${rect.top + 100}px !important;\n right: ${window.innerWidth - (rect.left + rect.width) + 20}px !important;\n z-index: 10000 !important;\n }\n `\n}\n\nfunction createStyleElement() {\n const style = document.createElement('style')\n style.id = 'dynamic-toast-style'\n document.head.appendChild(style)\n return style\n}\n\nwatch(\n () => settingStore.get('Comfy.UseNewMenu'),\n () => nextTick(updateToastPosition),\n { immediate: true }\n)\nwatch(\n () => settingStore.get('Comfy.Sidebar.Location'),\n () => nextTick(updateToastPosition),\n { immediate: true }\n)\n</script>\n"],"mappings":"gWCYA,MAAM,EAAQ,EAAA,EACR,EAAa,EAAA,EACb,EAAe,EAAA,EAErB,EAAA,IACQ,EAAW,cAChB,GAAgB,CACX,EAAY,SAAW,IAI3B,EAAY,QAAS,GAAY,CAC/B,EAAM,IAAI,CAAA,IAEZ,EAAW,cAAgB,CAAA,IAE7B,CAAE,KAAM,EAAA,CAAK,EAGf,EAAA,IACQ,EAAW,iBAChB,GAAqB,CAChB,EAAiB,SAAW,IAIhC,EAAiB,QAAS,GAAY,CACpC,EAAM,OAAO,CAAA,IAEf,EAAW,iBAAmB,CAAA,IAEhC,CAAE,KAAM,EAAA,CAAK,EAGf,EAAA,IACQ,EAAW,mBAChB,GAAc,CACT,IACF,EAAM,gBAAA,EACN,EAAW,mBAAqB,MAKtC,SAAS,GAAsB,CAC7B,MAAM,EACJ,SAAS,eAAe,qBAAA,GAA0B,EAAA,EAC9C,EAAO,SACV,cAAc,yBAAA,GACb,sBAAA,EACC,IAEL,EAAa,YAAc;AAAA;AAAA,aAEhB,EAAK,IAAM,GAAA;AAAA,eACT,OAAO,YAAc,EAAK,KAAO,EAAK,OAAS,EAAA;AAAA;AAAA;AAAA,KAXrD,EAAA,EAAA,uBAiBT,SAAS,GAAqB,CAC5B,MAAM,EAAQ,SAAS,cAAc,OAAA,EACrC,OAAA,EAAM,GAAK,sBACX,SAAS,KAAK,YAAY,CAAA,EACnB,EAJA,OAAA,EAAA,EAAA,sBAOT,EAAA,IACQ,EAAa,IAAI,kBAAA,EAAmB,IACpC,EAAS,CAAA,EACf,CAAE,UAAW,EAAA,CAAK,EAEpB,EAAA,IACQ,EAAa,IAAI,wBAAA,EAAyB,IAC1C,EAAS,CAAA,EACf,CAAE,UAAW,EAAA,CAAK"}