comfyui-frontend-package 1.37.11__py3-none-any.whl → 1.38.0__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.
- comfyui_frontend_package/static/assets/{AboutPanel-B-lCq9HV.js → AboutPanel-DeWaRZUc.js} +2 -2
- comfyui_frontend_package/static/assets/{AboutPanel-B-lCq9HV.js.map → AboutPanel-DeWaRZUc.js.map} +1 -1
- comfyui_frontend_package/static/assets/{AudioPreviewPlayer-CXgr12AM.js → AudioPreviewPlayer-CSxbl0y3.js} +2 -2
- comfyui_frontend_package/static/assets/{AudioPreviewPlayer-CXgr12AM.js.map → AudioPreviewPlayer-CSxbl0y3.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ComfyQueueButton-C6ttLtL6.js → ComfyQueueButton-BV0p-R1-.js} +2 -2
- comfyui_frontend_package/static/assets/{ComfyQueueButton-C6ttLtL6.js.map → ComfyQueueButton-BV0p-R1-.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ExtensionPanel-uFlj7Yfm.js → ExtensionPanel-DvPzK040.js} +2 -2
- comfyui_frontend_package/static/assets/{ExtensionPanel-uFlj7Yfm.js.map → ExtensionPanel-DvPzK040.js.map} +1 -1
- comfyui_frontend_package/static/assets/GraphView-BuGkgiGk.js +15 -0
- comfyui_frontend_package/static/assets/GraphView-BuGkgiGk.js.map +1 -0
- comfyui_frontend_package/static/assets/{KeybindingPanel-DtxoTOoX.js → KeybindingPanel-DbjoObzw.js} +2 -2
- comfyui_frontend_package/static/assets/{KeybindingPanel-DtxoTOoX.js.map → KeybindingPanel-DbjoObzw.js.map} +1 -1
- comfyui_frontend_package/static/assets/{LazyImage.vue_vue_type_script_setup_true_lang-BSzd4gKh.js → LazyImage.vue_vue_type_script_setup_true_lang-Op4fug5d.js} +2 -2
- comfyui_frontend_package/static/assets/{LazyImage.vue_vue_type_script_setup_true_lang-BSzd4gKh.js.map → LazyImage.vue_vue_type_script_setup_true_lang-Op4fug5d.js.map} +1 -1
- comfyui_frontend_package/static/assets/{LegacyCreditsPanel-CO0JRKfg.js → LegacyCreditsPanel-BFKSdy5y.js} +2 -2
- comfyui_frontend_package/static/assets/{LegacyCreditsPanel-CO0JRKfg.js.map → LegacyCreditsPanel-BFKSdy5y.js.map} +1 -1
- comfyui_frontend_package/static/assets/{Load3D-NG6IeknA.js → Load3D-B3uXG_Os.js} +2 -2
- comfyui_frontend_package/static/assets/Load3D-B3uXG_Os.js.map +1 -0
- comfyui_frontend_package/static/assets/{Load3D.vue_vue_type_script_setup_true_lang-DYT5Ecka.js → Load3D.vue_vue_type_script_setup_true_lang-CslfLloq.js} +2 -2
- comfyui_frontend_package/static/assets/{Load3D.vue_vue_type_script_setup_true_lang-DYT5Ecka.js.map → Load3D.vue_vue_type_script_setup_true_lang-CslfLloq.js.map} +1 -1
- comfyui_frontend_package/static/assets/{Media3DTop-iLfJefgN.js → Media3DTop-CfCHfZKG.js} +2 -2
- comfyui_frontend_package/static/assets/{Media3DTop-iLfJefgN.js.map → Media3DTop-CfCHfZKG.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ServerConfigPanel-B8Qy2naY.js → ServerConfigPanel-DvFzfUMn.js} +2 -2
- comfyui_frontend_package/static/assets/{ServerConfigPanel-B8Qy2naY.js.map → ServerConfigPanel-DvFzfUMn.js.map} +1 -1
- comfyui_frontend_package/static/assets/{SubscriptionRequiredDialogContent-CIYbxFB5.js → SubscriptionRequiredDialogContent-DTq1ffwv.js} +2 -2
- comfyui_frontend_package/static/assets/{SubscriptionRequiredDialogContent-CIYbxFB5.js.map → SubscriptionRequiredDialogContent-DTq1ffwv.js.map} +1 -1
- comfyui_frontend_package/static/assets/{UserPanel-D5s95p9f.js → UserPanel-Xvm9QBld.js} +2 -2
- comfyui_frontend_package/static/assets/{UserPanel-D5s95p9f.js.map → UserPanel-Xvm9QBld.js.map} +1 -1
- comfyui_frontend_package/static/assets/{UserSelectView-TWmqiRNC.js → UserSelectView-Bh8_ghwS.js} +2 -2
- comfyui_frontend_package/static/assets/{UserSelectView-TWmqiRNC.js.map → UserSelectView-Bh8_ghwS.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ValueControlPopover-oFjRn7nT.js → ValueControlPopover-BrAoQ_2-.js} +2 -2
- comfyui_frontend_package/static/assets/{ValueControlPopover-oFjRn7nT.js.map → ValueControlPopover-BrAoQ_2-.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetAudioUI-DYG-X1jd.js → WidgetAudioUI-BjV6M32Q.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetAudioUI-DYG-X1jd.js.map → WidgetAudioUI-BjV6M32Q.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetButton-pJqn_pIo.js → WidgetButton-Dk30Nukl.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetButton-pJqn_pIo.js.map → WidgetButton-Dk30Nukl.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetColorPicker-JIRhb2dg.js → WidgetColorPicker-CkqNsGhI.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetColorPicker-JIRhb2dg.js.map → WidgetColorPicker-CkqNsGhI.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetGalleria-CtUTrKmF.js → WidgetGalleria-BYYCCQyX.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetGalleria-CtUTrKmF.js.map → WidgetGalleria-BYYCCQyX.js.map} +1 -1
- comfyui_frontend_package/static/assets/WidgetInputNumber-psomfHIy.js +2 -0
- comfyui_frontend_package/static/assets/WidgetInputNumber-psomfHIy.js.map +1 -0
- comfyui_frontend_package/static/assets/{WidgetInputNumber.vue_vue_type_script_setup_true_lang-Cb9Vjdsr.js → WidgetInputNumber.vue_vue_type_script_setup_true_lang-qjF5C0EN.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetInputNumber.vue_vue_type_script_setup_true_lang-Cb9Vjdsr.js.map → WidgetInputNumber.vue_vue_type_script_setup_true_lang-qjF5C0EN.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetInputText-C9e7Utok.js → WidgetInputText-Btor0Uhs.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetInputText-C9e7Utok.js.map → WidgetInputText-Btor0Uhs.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetLayoutField.vue_vue_type_script_setup_true_lang-B2h9BxrZ.js → WidgetLayoutField.vue_vue_type_script_setup_true_lang-Bq1noASf.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetLayoutField.vue_vue_type_script_setup_true_lang-B2h9BxrZ.js.map → WidgetLayoutField.vue_vue_type_script_setup_true_lang-Bq1noASf.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetLegacy-DxWXa1q8.js → WidgetLegacy-Cj4T7tN3.js} +2 -2
- comfyui_frontend_package/static/assets/WidgetLegacy-Cj4T7tN3.js.map +1 -0
- comfyui_frontend_package/static/assets/{WidgetMarkdown-BbdYbwjR.js → WidgetMarkdown-CsRRMdeD.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetMarkdown-BbdYbwjR.js.map → WidgetMarkdown-CsRRMdeD.js.map} +1 -1
- comfyui_frontend_package/static/assets/WidgetRecordAudio-CbCqPJqI.js +2 -0
- comfyui_frontend_package/static/assets/WidgetRecordAudio-CbCqPJqI.js.map +1 -0
- comfyui_frontend_package/static/assets/WidgetSelect-DcVQrOUl.js +2 -0
- comfyui_frontend_package/static/assets/WidgetSelect-DcVQrOUl.js.map +1 -0
- comfyui_frontend_package/static/assets/{WidgetSelect.vue_vue_type_script_setup_true_lang-DnNAGP6n.js → WidgetSelect.vue_vue_type_script_setup_true_lang-B0Z0OQv6.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetSelect.vue_vue_type_script_setup_true_lang-DnNAGP6n.js.map → WidgetSelect.vue_vue_type_script_setup_true_lang-B0Z0OQv6.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetTextarea-DtdgdYZv.js → WidgetTextarea-OMPagx9K.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetTextarea-DtdgdYZv.js.map → WidgetTextarea-OMPagx9K.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetToggleSwitch-BZnc8nGp.js → WidgetToggleSwitch-mOArdF4c.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetToggleSwitch-BZnc8nGp.js.map → WidgetToggleSwitch-mOArdF4c.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetWithControl.vue_vue_type_script_setup_true_lang-39lKeCWN.js → WidgetWithControl.vue_vue_type_script_setup_true_lang-Bx6suA2O.js} +3 -3
- comfyui_frontend_package/static/assets/{WidgetWithControl.vue_vue_type_script_setup_true_lang-39lKeCWN.js.map → WidgetWithControl.vue_vue_type_script_setup_true_lang-Bx6suA2O.js.map} +1 -1
- comfyui_frontend_package/static/assets/{audioService-CxmGtl4K.js → audioService-jRjL5LtP.js} +2 -2
- comfyui_frontend_package/static/assets/{audioService-CxmGtl4K.js.map → audioService-jRjL5LtP.js.map} +1 -1
- comfyui_frontend_package/static/assets/{audioUtils-B4fAuqez.js → audioUtils-DsaLmBXU.js} +2 -2
- comfyui_frontend_package/static/assets/{audioUtils-B4fAuqez.js.map → audioUtils-DsaLmBXU.js.map} +1 -1
- comfyui_frontend_package/static/assets/{commands-DHxq3nWN.js → commands-6krn3srk.js} +2 -2
- comfyui_frontend_package/static/assets/commands-6krn3srk.js.map +1 -0
- comfyui_frontend_package/static/assets/commands-B8TX-OdW.js +2 -0
- comfyui_frontend_package/static/assets/commands-B8TX-OdW.js.map +1 -0
- comfyui_frontend_package/static/assets/commands-BBMcY34D.js +2 -0
- comfyui_frontend_package/static/assets/commands-BBMcY34D.js.map +1 -0
- comfyui_frontend_package/static/assets/commands-C0R_Md8R.js +2 -0
- comfyui_frontend_package/static/assets/commands-C0R_Md8R.js.map +1 -0
- comfyui_frontend_package/static/assets/commands-CAv4QkZ-.js +2 -0
- comfyui_frontend_package/static/assets/commands-CAv4QkZ-.js.map +1 -0
- comfyui_frontend_package/static/assets/commands-CeIcZl_a.js +2 -0
- comfyui_frontend_package/static/assets/commands-CeIcZl_a.js.map +1 -0
- comfyui_frontend_package/static/assets/commands-CtwQRBL_.js +2 -0
- comfyui_frontend_package/static/assets/commands-CtwQRBL_.js.map +1 -0
- comfyui_frontend_package/static/assets/commands-DjX42wW9.js +2 -0
- comfyui_frontend_package/static/assets/commands-DjX42wW9.js.map +1 -0
- comfyui_frontend_package/static/assets/commands-DzwpXu9N.js +2 -0
- comfyui_frontend_package/static/assets/commands-DzwpXu9N.js.map +1 -0
- comfyui_frontend_package/static/assets/commands-E4h99f7h.js +2 -0
- comfyui_frontend_package/static/assets/commands-E4h99f7h.js.map +1 -0
- comfyui_frontend_package/static/assets/commands-we3Embjk.js +2 -0
- comfyui_frontend_package/static/assets/commands-we3Embjk.js.map +1 -0
- comfyui_frontend_package/static/assets/{index-BFHZsBkN.js → index--yK73oka.js} +14 -14
- comfyui_frontend_package/static/assets/index--yK73oka.js.map +1 -0
- comfyui_frontend_package/static/assets/{index-DJa4hQi7.css → index-CofcAZPL.css} +1 -1
- comfyui_frontend_package/static/assets/{index-tImAQKwZ.js → index-CwTFEsg4.js} +2 -2
- comfyui_frontend_package/static/assets/{index-tImAQKwZ.js.map → index-CwTFEsg4.js.map} +1 -1
- comfyui_frontend_package/static/assets/{index-B7ehZHKU.js → index-Hz5b30sA.js} +2 -2
- comfyui_frontend_package/static/assets/{index-B7ehZHKU.js.map → index-Hz5b30sA.js.map} +1 -1
- comfyui_frontend_package/static/assets/{keybindingService-B_cUhEnt.js → keybindingService-XE4XFAxf.js} +2 -2
- comfyui_frontend_package/static/assets/{keybindingService-B_cUhEnt.js.map → keybindingService-XE4XFAxf.js.map} +1 -1
- comfyui_frontend_package/static/assets/main-B1lLjnTc.js +17 -0
- comfyui_frontend_package/static/assets/main-B1lLjnTc.js.map +1 -0
- comfyui_frontend_package/static/assets/main-B6hk_BFB.js +17 -0
- comfyui_frontend_package/static/assets/main-B6hk_BFB.js.map +1 -0
- comfyui_frontend_package/static/assets/main-BJ1OB7_l.js +14 -0
- comfyui_frontend_package/static/assets/main-BJ1OB7_l.js.map +1 -0
- comfyui_frontend_package/static/assets/main-Beff11ll.js +17 -0
- comfyui_frontend_package/static/assets/main-Beff11ll.js.map +1 -0
- comfyui_frontend_package/static/assets/main-Bmv0nfqm.js +14 -0
- comfyui_frontend_package/static/assets/main-Bmv0nfqm.js.map +1 -0
- comfyui_frontend_package/static/assets/main-Bmv_vwNy.js +14 -0
- comfyui_frontend_package/static/assets/main-Bmv_vwNy.js.map +1 -0
- comfyui_frontend_package/static/assets/main-CC-DWYqg.js +17 -0
- comfyui_frontend_package/static/assets/main-CC-DWYqg.js.map +1 -0
- comfyui_frontend_package/static/assets/main-CPEN9kTz.js +17 -0
- comfyui_frontend_package/static/assets/main-CPEN9kTz.js.map +1 -0
- comfyui_frontend_package/static/assets/main-Ca_1lXEg.js +17 -0
- comfyui_frontend_package/static/assets/main-Ca_1lXEg.js.map +1 -0
- comfyui_frontend_package/static/assets/main-CiNLJloN.js +17 -0
- comfyui_frontend_package/static/assets/main-CiNLJloN.js.map +1 -0
- comfyui_frontend_package/static/assets/main-Dy-2iV5r.js +14 -0
- comfyui_frontend_package/static/assets/main-Dy-2iV5r.js.map +1 -0
- comfyui_frontend_package/static/index.html +1 -1
- {comfyui_frontend_package-1.37.11.dist-info → comfyui_frontend_package-1.38.0.dist-info}/METADATA +1 -1
- {comfyui_frontend_package-1.37.11.dist-info → comfyui_frontend_package-1.38.0.dist-info}/RECORD +126 -126
- comfyui_frontend_package/static/assets/GraphView-0U0T8pwU.js +0 -15
- comfyui_frontend_package/static/assets/GraphView-0U0T8pwU.js.map +0 -1
- comfyui_frontend_package/static/assets/Load3D-NG6IeknA.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetInputNumber-DPITONSH.js +0 -2
- comfyui_frontend_package/static/assets/WidgetInputNumber-DPITONSH.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetLegacy-DxWXa1q8.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetRecordAudio-DQzt1Okr.js +0 -2
- comfyui_frontend_package/static/assets/WidgetRecordAudio-DQzt1Okr.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetSelect-BCeT8JsM.js +0 -2
- comfyui_frontend_package/static/assets/WidgetSelect-BCeT8JsM.js.map +0 -1
- comfyui_frontend_package/static/assets/commands-2re7xZu6.js +0 -2
- comfyui_frontend_package/static/assets/commands-2re7xZu6.js.map +0 -1
- comfyui_frontend_package/static/assets/commands-5dfPmqrI.js +0 -2
- comfyui_frontend_package/static/assets/commands-5dfPmqrI.js.map +0 -1
- comfyui_frontend_package/static/assets/commands-9-tUiihM.js +0 -2
- comfyui_frontend_package/static/assets/commands-9-tUiihM.js.map +0 -1
- comfyui_frontend_package/static/assets/commands-BOYC3thj.js +0 -2
- comfyui_frontend_package/static/assets/commands-BOYC3thj.js.map +0 -1
- comfyui_frontend_package/static/assets/commands-CSrZnGH2.js +0 -2
- comfyui_frontend_package/static/assets/commands-CSrZnGH2.js.map +0 -1
- comfyui_frontend_package/static/assets/commands-DGL_KBDe.js +0 -2
- comfyui_frontend_package/static/assets/commands-DGL_KBDe.js.map +0 -1
- comfyui_frontend_package/static/assets/commands-DHxq3nWN.js.map +0 -1
- comfyui_frontend_package/static/assets/commands-DOgmN2m6.js +0 -2
- comfyui_frontend_package/static/assets/commands-DOgmN2m6.js.map +0 -1
- comfyui_frontend_package/static/assets/commands-DoQ2gxMh.js +0 -2
- comfyui_frontend_package/static/assets/commands-DoQ2gxMh.js.map +0 -1
- comfyui_frontend_package/static/assets/commands-irqWUFB-.js +0 -2
- comfyui_frontend_package/static/assets/commands-irqWUFB-.js.map +0 -1
- comfyui_frontend_package/static/assets/commands-xGVSTfS4.js +0 -2
- comfyui_frontend_package/static/assets/commands-xGVSTfS4.js.map +0 -1
- comfyui_frontend_package/static/assets/index-BFHZsBkN.js.map +0 -1
- comfyui_frontend_package/static/assets/main-B3vd7GL1.js +0 -17
- comfyui_frontend_package/static/assets/main-B3vd7GL1.js.map +0 -1
- comfyui_frontend_package/static/assets/main-BKCc2TkD.js +0 -17
- comfyui_frontend_package/static/assets/main-BKCc2TkD.js.map +0 -1
- comfyui_frontend_package/static/assets/main-BNvzUx74.js +0 -17
- comfyui_frontend_package/static/assets/main-BNvzUx74.js.map +0 -1
- comfyui_frontend_package/static/assets/main-BPu7av80.js +0 -17
- comfyui_frontend_package/static/assets/main-BPu7av80.js.map +0 -1
- comfyui_frontend_package/static/assets/main-BQ4z0Xxc.js +0 -14
- comfyui_frontend_package/static/assets/main-BQ4z0Xxc.js.map +0 -1
- comfyui_frontend_package/static/assets/main-BoyaoV4J.js +0 -14
- comfyui_frontend_package/static/assets/main-BoyaoV4J.js.map +0 -1
- comfyui_frontend_package/static/assets/main-CJ1ZmTbz.js +0 -14
- comfyui_frontend_package/static/assets/main-CJ1ZmTbz.js.map +0 -1
- comfyui_frontend_package/static/assets/main-DxByB8u3.js +0 -17
- comfyui_frontend_package/static/assets/main-DxByB8u3.js.map +0 -1
- comfyui_frontend_package/static/assets/main-Dyk43SJi.js +0 -17
- comfyui_frontend_package/static/assets/main-Dyk43SJi.js.map +0 -1
- comfyui_frontend_package/static/assets/main-QMLeyFJQ.js +0 -17
- comfyui_frontend_package/static/assets/main-QMLeyFJQ.js.map +0 -1
- comfyui_frontend_package/static/assets/main-f7MqrMkx.js +0 -14
- comfyui_frontend_package/static/assets/main-f7MqrMkx.js.map +0 -1
- {comfyui_frontend_package-1.37.11.dist-info → comfyui_frontend_package-1.38.0.dist-info}/WHEEL +0 -0
- {comfyui_frontend_package-1.37.11.dist-info → comfyui_frontend_package-1.38.0.dist-info}/top_level.txt +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var P=Object.defineProperty;var S=(i,e)=>P(i,"name",{value:e,configurable:!0});import{q as k,ac as N,G as B,w as I}from"./vendor-primevue-DeKsC2uk.js";import{ds as x,a2 as M,aa as A,a3 as T,dt as E,ab as F,bo as R,du as D}from"./index
|
|
2
|
-
//# sourceMappingURL=AboutPanel-
|
|
1
|
+
var P=Object.defineProperty;var S=(i,e)=>P(i,"name",{value:e,configurable:!0});import{q as k,ac as N,G as B,w as I}from"./vendor-primevue-DeKsC2uk.js";import{ds as x,a2 as M,aa as A,a3 as T,dt as E,ab as F,bo as R,du as D}from"./index--yK73oka.js";import{bx as $,c as n,d as t,F as _,y as b,e as a,u as m,E as p,q as C,z as g,by as c,j as v,k as y,A as U,s as z}from"./vendor-other-B8t_Wf2K.js";import{d as O}from"./vendor-vue-DaLZjKA7.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-DH0o8VQ7.js";import"./vendor-tiptap-VxK0yxkd.js";const j={class:"grid grid-cols-2 gap-2"},q={class:"font-medium"},V=$({__name:"DeviceInfo",props:{device:{}},setup(i){const e=i,u=[{field:"name",header:"Name"},{field:"type",header:"Type"},{field:"vram_total",header:"VRAM Total"},{field:"vram_free",header:"VRAM Free"},{field:"torch_vram_total",header:"Torch VRAM Total"},{field:"torch_vram_free",header:"Torch VRAM Free"}],r=S((l,s)=>["vram_total","vram_free","torch_vram_total","torch_vram_free"].includes(s)?x(l):l,"formatValue");return(l,s)=>(t(),n("div",j,[(t(),n(_,null,b(u,f=>(t(),n(_,{key:f.field},[a("div",q,m(f.header),1),a("div",null,m(r(e.device[f.field],f.field)),1)],64))),64))]))}}),w={class:"system-stats"},L={class:"mb-6"},G={class:"mb-4 text-2xl font-semibold"},H={class:"grid grid-cols-2 gap-2"},J={class:"font-medium"},K={class:"mb-4 text-2xl font-semibold"},Q=$({__name:"SystemStatsPanel",props:{stats:{}},setup(i){const e=i,u=p(()=>({...e.stats.system,argv:e.stats.system.argv.join(" ")})),r=p(()=>e.stats.devices.length>0),l=[{field:"os",header:"OS"},{field:"python_version",header:"Python Version"},{field:"embedded_python",header:"Embedded Python"},{field:"pytorch_version",header:"Pytorch Version"},{field:"argv",header:"Arguments"},{field:"ram_total",header:"RAM Total",formatNumber:x},{field:"ram_free",header:"RAM Free",formatNumber:x}],s=p(()=>l),f=S(o=>{const h=u.value[o.field];return o.formatNumber&&typeof h=="number"?o.formatNumber(h):o.format&&typeof h=="string"?o.format(h):h},"getDisplayValue");return(o,h)=>(t(),n("div",w,[a("div",L,[a("h2",G,m(o.$t("g.systemInfo")),1),a("div",H,[(t(!0),n(_,null,b(s.value,d=>(t(),n(_,{key:d.field},[a("div",J,m(d.header),1),a("div",null,m(f(d)),1)],64))),128))])]),r.value?(t(),n(_,{key:0},[g(c(k)),a("div",null,[a("h2",K,m(o.$t("g.devices")),1),e.stats.devices.length>1?(t(),v(c(N),{key:0},{default:y(()=>[(t(!0),n(_,null,b(e.stats.devices,d=>(t(),v(c(B),{key:d.index,header:d.name,value:d.index},{default:y(()=>[g(V,{device:d},null,8,["device"])]),_:2},1032,["header","value"]))),128))]),_:1})):(t(),v(V,{key:1,device:e.stats.devices[0]},null,8,["device"]))])],64)):C("",!0)]))}}),W=O("aboutPanel",()=>{const i="1.38.0",e=M(),u=A(),{staticUrls:r}=T(),l=p(()=>u?.systemStats?.system?.comfyui_version??""),s=p(()=>[{label:`ComfyUI ${F()?"v"+R().getComfyUIVersion():E(l.value)}`,url:r.github,icon:"pi pi-github"},{label:`ComfyUI_frontend v${i}`,url:r.githubFrontend,icon:"pi pi-github"},{label:"Discord",url:r.discord,icon:"pi pi-discord"},{label:"ComfyOrg",url:r.comfyOrg,icon:"pi pi-globe"}]);return{badges:p(()=>[...s.value,...e.extensions.flatMap(o=>o.aboutPageBadges??[])])}}),X={class:"mb-2 text-2xl font-bold"},Y={class:"space-y-2"},Z=["href","title"],le=$({__name:"AboutPanel",setup(i){const e=A(),u=W();return(r,l)=>(t(),v(D,{value:"About",class:"about-container"},{default:y(()=>[a("h2",X,m(r.$t("g.about")),1),a("div",Y,[(t(!0),n(_,null,b(c(u).badges,s=>(t(),n("a",{key:s.url,href:s.url,target:"_blank",rel:"noopener noreferrer",class:"about-badge inline-flex items-center no-underline",title:s.url},[g(c(I),{class:"mr-2"},{icon:y(()=>[a("i",{class:z([s.icon,"mr-2 text-xl"])},null,2)]),default:y(()=>[U(" "+m(s.label),1)]),_:2},1024)],8,Z))),128))]),g(c(k)),c(e).systemStats?(t(),v(Q,{key:0,stats:c(e).systemStats},null,8,["stats"])):C("",!0)]),_:1}))}});export{le as default};
|
|
2
|
+
//# sourceMappingURL=AboutPanel-DeWaRZUc.js.map
|
comfyui_frontend_package/static/assets/{AboutPanel-B-lCq9HV.js.map → AboutPanel-DeWaRZUc.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AboutPanel-
|
|
1
|
+
{"version":3,"file":"AboutPanel-DeWaRZUc.js","sources":["../../src/components/common/DeviceInfo.vue","../../src/components/common/SystemStatsPanel.vue","../../src/stores/aboutPanelStore.ts","../../src/components/dialog/content/setting/AboutPanel.vue"],"sourcesContent":["<template>\n <div class=\"grid grid-cols-2 gap-2\">\n <template v-for=\"col in deviceColumns\" :key=\"col.field\">\n <div class=\"font-medium\">\n {{ col.header }}\n </div>\n <div>\n {{ formatValue(props.device[col.field], col.field) }}\n </div>\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { DeviceStats } from '@/schemas/apiSchema'\nimport { formatSize } from '@/utils/formatUtil'\n\nconst props = defineProps<{\n device: DeviceStats\n}>()\n\nconst deviceColumns: { field: keyof DeviceStats; header: string }[] = [\n { field: 'name', header: 'Name' },\n { field: 'type', header: 'Type' },\n { field: 'vram_total', header: 'VRAM Total' },\n { field: 'vram_free', header: 'VRAM Free' },\n { field: 'torch_vram_total', header: 'Torch VRAM Total' },\n { field: 'torch_vram_free', header: 'Torch VRAM Free' }\n]\n\nconst formatValue = (value: any, field: string) => {\n if (\n ['vram_total', 'vram_free', 'torch_vram_total', 'torch_vram_free'].includes(\n field\n )\n ) {\n return formatSize(value)\n }\n return value\n}\n</script>\n","<template>\n <div class=\"system-stats\">\n <div class=\"mb-6\">\n <h2 class=\"mb-4 text-2xl font-semibold\">\n {{ $t('g.systemInfo') }}\n </h2>\n <div class=\"grid grid-cols-2 gap-2\">\n <template v-for=\"col in systemColumns\" :key=\"col.field\">\n <div class=\"font-medium\">\n {{ col.header }}\n </div>\n <div>{{ getDisplayValue(col) }}</div>\n </template>\n </div>\n </div>\n\n <template v-if=\"hasDevices\">\n <Divider />\n\n <div>\n <h2 class=\"mb-4 text-2xl font-semibold\">\n {{ $t('g.devices') }}\n </h2>\n <TabView v-if=\"props.stats.devices.length > 1\">\n <TabPanel\n v-for=\"device in props.stats.devices\"\n :key=\"device.index\"\n :header=\"device.name\"\n :value=\"device.index\"\n >\n <DeviceInfo :device=\"device\" />\n </TabPanel>\n </TabView>\n <DeviceInfo v-else :device=\"props.stats.devices[0]\" />\n </div>\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Divider from 'primevue/divider'\nimport TabPanel from 'primevue/tabpanel'\nimport TabView from 'primevue/tabview'\nimport { computed } from 'vue'\n\nimport DeviceInfo from '@/components/common/DeviceInfo.vue'\nimport { isCloud } from '@/platform/distribution/types'\nimport type { SystemStats } from '@/schemas/apiSchema'\nimport { formatCommitHash, formatSize } from '@/utils/formatUtil'\n\nconst props = defineProps<{\n stats: SystemStats\n}>()\n\nconst systemInfo = computed(() => ({\n ...props.stats.system,\n argv: props.stats.system.argv.join(' ')\n}))\n\nconst hasDevices = computed(() => props.stats.devices.length > 0)\n\ntype SystemInfoKey = keyof SystemStats['system']\n\ntype ColumnDef = {\n field: SystemInfoKey\n header: string\n format?: (value: string) => string\n formatNumber?: (value: number) => string\n}\n\n/** Columns for local distribution */\nconst localColumns: ColumnDef[] = [\n { field: 'os', header: 'OS' },\n { field: 'python_version', header: 'Python Version' },\n { field: 'embedded_python', header: 'Embedded Python' },\n { field: 'pytorch_version', header: 'Pytorch Version' },\n { field: 'argv', header: 'Arguments' },\n { field: 'ram_total', header: 'RAM Total', formatNumber: formatSize },\n { field: 'ram_free', header: 'RAM Free', formatNumber: formatSize }\n]\n\n/** Columns for cloud distribution */\nconst cloudColumns: ColumnDef[] = [\n { field: 'cloud_version', header: 'Cloud Version' },\n {\n field: 'comfyui_version',\n header: 'ComfyUI Version',\n format: formatCommitHash\n },\n {\n field: 'comfyui_frontend_version',\n header: 'Frontend Version',\n format: formatCommitHash\n },\n { field: 'workflow_templates_version', header: 'Templates Version' }\n]\n\nconst systemColumns = computed(() => (isCloud ? cloudColumns : localColumns))\n\nconst getDisplayValue = (column: ColumnDef) => {\n const value = systemInfo.value[column.field]\n if (column.formatNumber && typeof value === 'number') {\n return column.formatNumber(value)\n }\n if (column.format && typeof value === 'string') {\n return column.format(value)\n }\n return value\n}\n</script>\n","import { defineStore } from 'pinia'\nimport { computed } from 'vue'\n\nimport { useExternalLink } from '@/composables/useExternalLink'\nimport { isCloud } from '@/platform/distribution/types'\nimport type { AboutPageBadge } from '@/types/comfy'\nimport { electronAPI, isElectron } from '@/utils/envUtil'\nimport { formatCommitHash } from '@/utils/formatUtil'\n\nimport { useExtensionStore } from './extensionStore'\nimport { useSystemStatsStore } from './systemStatsStore'\n\nexport const useAboutPanelStore = defineStore('aboutPanel', () => {\n const frontendVersion = __COMFYUI_FRONTEND_VERSION__\n const extensionStore = useExtensionStore()\n const systemStatsStore = useSystemStatsStore()\n const { staticUrls } = useExternalLink()\n const coreVersion = computed(\n () => systemStatsStore?.systemStats?.system?.comfyui_version ?? ''\n )\n\n const coreBadges = computed<AboutPageBadge[]>(() => [\n // In electron, the ComfyUI is packaged without the git repo,\n // so the python server's API doesn't have the version info.\n {\n label: `ComfyUI ${\n isElectron()\n ? 'v' + electronAPI().getComfyUIVersion()\n : formatCommitHash(coreVersion.value)\n }`,\n url: isCloud ? staticUrls.comfyOrg : staticUrls.github,\n icon: isCloud ? 'pi pi-cloud' : 'pi pi-github'\n },\n {\n label: `ComfyUI_frontend v${frontendVersion}`,\n url: staticUrls.githubFrontend,\n icon: 'pi pi-github'\n },\n {\n label: 'Discord',\n url: staticUrls.discord,\n icon: 'pi pi-discord'\n },\n { label: 'ComfyOrg', url: staticUrls.comfyOrg, icon: 'pi pi-globe' }\n ])\n\n const allBadges = computed<AboutPageBadge[]>(() => [\n ...coreBadges.value,\n ...extensionStore.extensions.flatMap((e) => e.aboutPageBadges ?? [])\n ])\n\n return {\n badges: allBadges\n }\n})\n","<template>\n <PanelTemplate value=\"About\" class=\"about-container\">\n <h2 class=\"mb-2 text-2xl font-bold\">\n {{ $t('g.about') }}\n </h2>\n <div class=\"space-y-2\">\n <a\n v-for=\"badge in aboutPanelStore.badges\"\n :key=\"badge.url\"\n :href=\"badge.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"about-badge inline-flex items-center no-underline\"\n :title=\"badge.url\"\n >\n <Tag class=\"mr-2\">\n <template #icon>\n <i :class=\"[badge.icon, 'mr-2 text-xl']\" />\n </template>\n {{ badge.label }}\n </Tag>\n </a>\n </div>\n\n <Divider />\n\n <SystemStatsPanel\n v-if=\"systemStatsStore.systemStats\"\n :stats=\"systemStatsStore.systemStats\"\n />\n </PanelTemplate>\n</template>\n\n<script setup lang=\"ts\">\nimport Divider from 'primevue/divider'\nimport Tag from 'primevue/tag'\n\nimport SystemStatsPanel from '@/components/common/SystemStatsPanel.vue'\nimport { useAboutPanelStore } from '@/stores/aboutPanelStore'\nimport { useSystemStatsStore } from '@/stores/systemStatsStore'\n\nimport PanelTemplate from './PanelTemplate.vue'\n\nconst systemStatsStore = useSystemStatsStore()\nconst aboutPanelStore = useAboutPanelStore()\n</script>\n"],"names":["props","__props","deviceColumns","formatValue","__name","value","field","formatSize","systemInfo","computed","hasDevices","localColumns","systemColumns","getDisplayValue","column","useAboutPanelStore","defineStore","frontendVersion","extensionStore","useExtensionStore","systemStatsStore","useSystemStatsStore","staticUrls","useExternalLink","coreVersion","coreBadges","isElectron","electronAPI","formatCommitHash","e","aboutPanelStore"],"mappings":"upBAiBA,MAAMA,EAAQC,EAIRC,EAAgE,CACpE,CAAE,MAAO,OAAQ,OAAQ,MAAA,EACzB,CAAE,MAAO,OAAQ,OAAQ,MAAA,EACzB,CAAE,MAAO,aAAc,OAAQ,YAAA,EAC/B,CAAE,MAAO,YAAa,OAAQ,WAAA,EAC9B,CAAE,MAAO,mBAAoB,OAAQ,kBAAA,EACrC,CAAE,MAAO,kBAAmB,OAAQ,iBAAA,CAAkB,EAGlDC,EAAcC,EAAA,CAACC,EAAYC,IAE7B,CAAC,aAAc,YAAa,mBAAoB,iBAAiB,EAAE,SACjEA,CAAA,EAGKC,EAAWF,CAAK,EAElBA,EARW,kaCoBpB,MAAML,EAAQC,EAIRO,EAAaC,EAAS,KAAO,CACjC,GAAGT,EAAM,MAAM,OACf,KAAMA,EAAM,MAAM,OAAO,KAAK,KAAK,GAAG,CAAA,EACtC,EAEIU,EAAaD,EAAS,IAAMT,EAAM,MAAM,QAAQ,OAAS,CAAC,EAY1DW,EAA4B,CAChC,CAAE,MAAO,KAAM,OAAQ,IAAA,EACvB,CAAE,MAAO,iBAAkB,OAAQ,gBAAA,EACnC,CAAE,MAAO,kBAAmB,OAAQ,iBAAA,EACpC,CAAE,MAAO,kBAAmB,OAAQ,iBAAA,EACpC,CAAE,MAAO,OAAQ,OAAQ,WAAA,EACzB,CAAE,MAAO,YAAa,OAAQ,YAAa,aAAcJ,CAAA,EACzD,CAAE,MAAO,WAAY,OAAQ,WAAY,aAAcA,CAAA,CAAW,EAmB9DK,EAAgBH,EAAS,IAAgCE,CAAa,EAEtEE,EAAkBT,EAACU,GAAsB,CAC7C,MAAMT,EAAQG,EAAW,MAAMM,EAAO,KAAK,EAC3C,OAAIA,EAAO,cAAgB,OAAOT,GAAU,SACnCS,EAAO,aAAaT,CAAK,EAE9BS,EAAO,QAAU,OAAOT,GAAU,SAC7BS,EAAO,OAAOT,CAAK,EAErBA,CACT,EATwB,moBCvFXU,EAAqBC,EAAY,aAAc,IAAM,CAChE,MAAMC,EAAkB,SAClBC,EAAiBC,EAAA,EACjBC,EAAmBC,EAAA,EACnB,CAAE,WAAAC,CAAA,EAAeC,EAAA,EACjBC,EAAcf,EAClB,IAAMW,GAAkB,aAAa,QAAQ,iBAAmB,EAAA,EAG5DK,EAAahB,EAA2B,IAAM,CAGlD,CACE,MAAO,WACLiB,EAAA,EACI,IAAMC,IAAc,kBAAA,EACpBC,EAAiBJ,EAAY,KAAK,CACxC,GACA,IAAqCF,EAAW,OAChD,KAAgC,cAAA,EAElC,CACE,MAAO,qBAAqBL,CAAe,GAC3C,IAAKK,EAAW,eAChB,KAAM,cAAA,EAER,CACE,MAAO,UACP,IAAKA,EAAW,QAChB,KAAM,eAAA,EAER,CAAE,MAAO,WAAY,IAAKA,EAAW,SAAU,KAAM,aAAA,CAAc,CACpE,EAOD,MAAO,CACL,OANgBb,EAA2B,IAAM,CACjD,GAAGgB,EAAW,MACd,GAAGP,EAAe,WAAW,QAASW,GAAMA,EAAE,iBAAmB,CAAA,CAAE,CAAA,CACpE,CAGS,CAEZ,CAAC,kHCXD,MAAMT,EAAmBC,EAAA,EACnBS,EAAkBf,EAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var Q=Object.defineProperty;var t=(k,r)=>Q(k,"name",{value:r,configurable:!0});import{a6 as X,j as Y}from"./vendor-primevue-DeKsC2uk.js";import{u as Z}from"./vendor-vue-DaLZjKA7.js";import{r as L,aC as ee,c0 as ae,b$ as te,a as oe,c as C,d as se}from"./index
|
|
2
|
-
//# sourceMappingURL=AudioPreviewPlayer-
|
|
1
|
+
var Q=Object.defineProperty;var t=(k,r)=>Q(k,"name",{value:r,configurable:!0});import{a6 as X,j as Y}from"./vendor-primevue-DeKsC2uk.js";import{u as Z}from"./vendor-vue-DaLZjKA7.js";import{r as L,aC as ee,c0 as ae,b$ as te,a as oe,c as C,d as se}from"./index--yK73oka.js";import{g as le,f as N}from"./audioUtils-DsaLmBXU.js";import{bx as ne,r as i,E as u,w as ue,cd as ie,c as l,d as n,q as z,s as re,by as p,e as o,z as T,u as _,G as ce,k as de,n as ve}from"./vendor-other-B8t_Wf2K.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-DH0o8VQ7.js";import"./vendor-tiptap-VxK0yxkd.js";const pe={class:"relative"},me={class:"relative flex shrink-0 items-center justify-start gap-2"},fe=["aria-label"],be={key:0,class:"text-secondary icon-[lucide--play] size-4"},ge={key:1,class:"text-secondary icon-[lucide--pause] size-4"},he={class:"text-sm font-normal text-nowrap text-base-foreground"},ye={class:"relative h-0.5 flex-1 rounded-full bg-interface-stroke"},_e=["value","aria-label"],ke={class:"relative flex shrink-0 items-center justify-start gap-2"},xe=["aria-label"],we={key:0,class:"text-secondary icon-[lucide--volume-2] size-4"},Ce={key:1,class:"text-secondary icon-[lucide--volume-1] size-4"},ze={key:2,class:"text-secondary icon-[lucide--volume-x] size-4"},Oe=["aria-label"],Ie={key:0,class:"w-48 px-4 py-2"},Pe={class:"mb-2 block text-xs text-base-foreground"},Ae=["onClick"],Le={class:"text-base-foreground"},Ne={key:0,class:"ml-auto icon-[lucide--check] size-4 text-base-foreground"},Te=ne({__name:"AudioPreviewPlayer",props:{hideWhenEmpty:{type:Boolean,default:!0},showOptionsButton:{type:Boolean},nodeId:{},audioUrl:{}},setup(k){const{t:r}=Z(),g=k,a=i(),O=i(),m=i(!1),c=i(!1),f=i(1),b=i(0),d=i(0),I=i(!1),h=i(1),P=u(()=>!d.value||d.value===0?0:b.value/d.value*100),U=u(()=>!c.value&&f.value>.5),B=u(()=>c.value&&f.value>0),y=u(()=>!g.nodeId||!L.canvas.graph?null:L.canvas.graph.getNodeById(g.nodeId)),R=u(()=>y.value?y.value.constructor?.comfyClass==="LoadAudio"&&!!g.nodeId:!1),S=u(()=>{const e=y.value;return!!e&&ee(e)}),A=u(()=>{const e=y.value;return e?ae(e):null}),V=te(),$=u(()=>{if(!S.value||!A.value)return"";const e=V.nodeOutputs[A.value];if(!e?.audio||e.audio.length===0)return"";const s=e.audio[0];return s.filename?oe.apiURL(le(s.subfolder||"",s.filename,s.type||"output")):""}),j=u(()=>$.value||g.audioUrl||""),E=t(()=>{!a.value||!a.value.src||(m.value?a.value.pause():a.value.play(),m.value=!m.value)},"togglePlayPause"),M=t(()=>{a.value&&(c.value=!c.value,a.value.muted=c.value)},"toggleMute"),F=t(e=>{const s=e.target,v=parseFloat(s.value);if(a.value&&d.value>0){const w=v/100*d.value;a.value.currentTime=w,b.value=w}},"handleSeek"),D=t(()=>{a.value&&(d.value=a.value.duration)},"handleLoadedMetadata"),W=t(()=>{a.value&&(b.value=a.value.currentTime)},"handleTimeUpdate"),q=t(()=>{m.value=!1,b.value=0},"handleEnded"),G=t(e=>{O.value?.toggle(e)},"toggleOptionsMenu"),x=t(e=>{h.value=e,a.value&&(a.value.playbackRate=e)},"setPlaybackSpeed"),H=t(e=>{const s=Array.isArray(e)?e[0]:e;f.value=s/10,a.value&&(a.value.volume=f.value,f.value>0&&c.value&&(c.value=!1,a.value.muted=!1))},"handleVolumeChange"),J=u(()=>[{label:r("g.playbackSpeed"),items:[{label:r("g.halfSpeed"),onClick:t(()=>x(.5),"onClick"),selected:h.value===.5},{label:r("g.1x"),onClick:t(()=>x(1),"onClick"),selected:h.value===1},{label:r("g.2x"),onClick:t(()=>x(2),"onClick"),selected:h.value===2}]},{label:r("g.volume"),key:"volume"}]),K=t(e=>{a.value&&(m.value=!1,a.value.pause(),a.value.src=e,a.value.load(),I.value=!!e)},"loadAudioFromUrl");return ue(j,e=>{e&&ve(()=>{K(e)})},{immediate:!0}),ie(()=>{a.value&&(a.value.pause(),a.value.src="")}),(e,s)=>(n(),l("div",pe,[R.value?z("",!0):(n(),l("div",{key:0,class:re(p(C)("bg-component-node-widget-background box-border flex gap-4 items-center justify-start relative rounded-lg w-full h-16 px-4 py-0",{hidden:e.hideWhenEmpty&&!I.value}))},[o("audio",{ref_key:"audioRef",ref:a,onLoadedmetadata:D,onTimeupdate:W,onEnded:q},null,544),o("div",me,[o("div",{role:"button",tabindex:0,"aria-label":e.$t("g.playPause"),class:"flex size-6 cursor-pointer items-center justify-center rounded hover:bg-interface-menu-component-surface-hovered",onClick:E},[m.value?(n(),l("i",ge)):(n(),l("i",be))],8,fe),o("div",he,_(p(N)(b.value))+" / "+_(p(N)(d.value)),1)]),o("div",ye,[o("div",{class:"absolute top-0 left-0 h-full rounded-full bg-button-icon transition-all",style:ce({width:`${P.value}%`})},null,4),o("input",{type:"range",value:P.value,min:"0",max:"100",step:"0.1","aria-label":e.$t("g.audioProgress"),class:"absolute inset-0 w-full cursor-pointer opacity-0",onInput:F},null,40,_e)]),o("div",ke,[o("div",{role:"button",tabindex:0,"aria-label":e.$t("g.volume"),class:"flex size-6 cursor-pointer items-center justify-center rounded hover:bg-interface-menu-component-surface-hovered",onClick:M},[U.value?(n(),l("i",we)):B.value?(n(),l("i",Ce)):(n(),l("i",ze))],8,xe),e.showOptionsButton?(n(),l("div",{key:0,role:"button",tabindex:0,"aria-label":e.$t("g.moreOptions"),class:"flex size-6 cursor-pointer items-center justify-center rounded hover:bg-interface-menu-component-surface-hovered",onClick:G},s[0]||(s[0]=[o("i",{class:"text-secondary icon-[lucide--more-vertical] size-4"},null,-1)]),8,Oe)):z("",!0)]),T(p(X),{ref_key:"optionsMenu",ref:O,model:J.value,popup:"",class:"audio-player-menu","pt:root:class":p(C)("bg-component-node-widget-background border-component-node-border"),"pt:submenu:class":p(C)("bg-component-node-widget-background")},{item:de(({item:v})=>[v.key==="volume"?(n(),l("div",Ie,[o("label",Pe,_(v.label),1),T(p(Y),{"model-value":f.value*10,min:0,max:10,step:1,class:"w-full","onUpdate:modelValue":H},null,8,["model-value"])])):(n(),l("div",{key:1,class:"flex cursor-pointer items-center px-4 py-2 text-xs hover:bg-white/10",onClick:t(w=>v.onClick?.(),"onClick")},[o("span",Le,_(v.label),1),v.selected?(n(),l("i",Ne)):z("",!0)],8,Ae))]),_:1},8,["model","pt:root:class","pt:submenu:class"])],2))]))}}),Fe=se(Te,[["__scopeId","data-v-b2e1591f"]]);export{Fe as default};
|
|
2
|
+
//# sourceMappingURL=AudioPreviewPlayer-CSxbl0y3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioPreviewPlayer-CXgr12AM.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/audio/AudioPreviewPlayer.vue"],"sourcesContent":["<template>\n <div class=\"relative\">\n <div\n v-if=\"!hidden\"\n :class=\"\n cn(\n 'bg-component-node-widget-background box-border flex gap-4 items-center justify-start relative rounded-lg w-full h-16 px-4 py-0',\n { hidden: hideWhenEmpty && !hasAudio }\n )\n \"\n >\n <!-- Hidden audio element -->\n <audio\n ref=\"audioRef\"\n @loadedmetadata=\"handleLoadedMetadata\"\n @timeupdate=\"handleTimeUpdate\"\n @ended=\"handleEnded\"\n />\n\n <!-- Left Actions -->\n <div class=\"relative flex shrink-0 items-center justify-start gap-2\">\n <!-- Play/Pause Button -->\n <div\n role=\"button\"\n :tabindex=\"0\"\n :aria-label=\"$t('g.playPause')\"\n class=\"flex size-6 cursor-pointer items-center justify-center rounded hover:bg-interface-menu-component-surface-hovered\"\n @click=\"togglePlayPause\"\n >\n <i\n v-if=\"!isPlaying\"\n class=\"text-secondary icon-[lucide--play] size-4\"\n />\n <i v-else class=\"text-secondary icon-[lucide--pause] size-4\" />\n </div>\n\n <!-- Time Display -->\n <div class=\"text-sm font-normal text-nowrap text-base-foreground\">\n {{ formatTime(currentTime) }} / {{ formatTime(duration) }}\n </div>\n </div>\n\n <!-- Progress Bar -->\n <div class=\"relative h-0.5 flex-1 rounded-full bg-interface-stroke\">\n <div\n class=\"absolute top-0 left-0 h-full rounded-full bg-button-icon transition-all\"\n :style=\"{ width: `${progressPercentage}%` }\"\n />\n <input\n type=\"range\"\n :value=\"progressPercentage\"\n min=\"0\"\n max=\"100\"\n step=\"0.1\"\n :aria-label=\"$t('g.audioProgress')\"\n class=\"absolute inset-0 w-full cursor-pointer opacity-0\"\n @input=\"handleSeek\"\n />\n </div>\n\n <!-- Right Actions -->\n <div class=\"relative flex shrink-0 items-center justify-start gap-2\">\n <!-- Volume Button -->\n <div\n role=\"button\"\n :tabindex=\"0\"\n :aria-label=\"$t('g.volume')\"\n class=\"flex size-6 cursor-pointer items-center justify-center rounded hover:bg-interface-menu-component-surface-hovered\"\n @click=\"toggleMute\"\n >\n <i\n v-if=\"showVolumeTwo\"\n class=\"text-secondary icon-[lucide--volume-2] size-4\"\n />\n <i\n v-else-if=\"showVolumeOne\"\n class=\"text-secondary icon-[lucide--volume-1] size-4\"\n />\n <i v-else class=\"text-secondary icon-[lucide--volume-x] size-4\" />\n </div>\n\n <!-- Options Button -->\n <div\n v-if=\"showOptionsButton\"\n role=\"button\"\n :tabindex=\"0\"\n :aria-label=\"$t('g.moreOptions')\"\n class=\"flex size-6 cursor-pointer items-center justify-center rounded hover:bg-interface-menu-component-surface-hovered\"\n @click=\"toggleOptionsMenu\"\n >\n <i class=\"text-secondary icon-[lucide--more-vertical] size-4\" />\n </div>\n </div>\n\n <!-- Options Menu -->\n <TieredMenu\n ref=\"optionsMenu\"\n :model=\"menuItems\"\n popup\n class=\"audio-player-menu\"\n :pt:root:class=\"\n cn('bg-component-node-widget-background border-component-node-border')\n \"\n :pt:submenu:class=\"cn('bg-component-node-widget-background')\"\n >\n <template #item=\"{ item }\">\n <div v-if=\"item.key === 'volume'\" class=\"w-48 px-4 py-2\">\n <label class=\"mb-2 block text-xs text-base-foreground\">{{\n item.label\n }}</label>\n <Slider\n :model-value=\"volume * 10\"\n :min=\"0\"\n :max=\"10\"\n :step=\"1\"\n class=\"w-full\"\n @update:model-value=\"handleVolumeChange\"\n />\n </div>\n <div\n v-else\n class=\"flex cursor-pointer items-center px-4 py-2 text-xs hover:bg-white/10\"\n @click=\"item.onClick?.()\"\n >\n <span class=\"text-base-foreground\">{{ item.label }}</span>\n <i\n v-if=\"item.selected\"\n class=\"ml-auto icon-[lucide--check] size-4 text-base-foreground\"\n />\n </div>\n </template>\n </TieredMenu>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Slider from 'primevue/slider'\nimport TieredMenu from 'primevue/tieredmenu'\nimport { computed, nextTick, onUnmounted, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport type { LGraphNode } from '@/lib/litegraph/src/LGraphNode'\nimport { api } from '@/scripts/api'\nimport { app } from '@/scripts/app'\nimport { useNodeOutputStore } from '@/stores/imagePreviewStore'\nimport { getLocatorIdFromNodeData } from '@/utils/graphTraversalUtil'\nimport { isOutputNode } from '@/utils/nodeFilterUtil'\nimport { cn } from '@/utils/tailwindUtil'\n\nimport { formatTime, getResourceURL } from '../../utils/audioUtils'\n\nconst { t } = useI18n()\n\nconst props = withDefaults(\n defineProps<{\n hideWhenEmpty?: boolean\n showOptionsButton?: boolean\n nodeId?: string\n audioUrl?: string\n }>(),\n {\n hideWhenEmpty: true\n }\n)\n\n// Refs\nconst audioRef = ref<HTMLAudioElement>()\nconst optionsMenu = ref()\nconst isPlaying = ref(false)\nconst isMuted = ref(false)\nconst volume = ref(1)\nconst currentTime = ref(0)\nconst duration = ref(0)\nconst hasAudio = ref(false)\nconst playbackRate = ref(1)\n\n// Computed\nconst progressPercentage = computed(() => {\n if (!duration.value || duration.value === 0) return 0\n return (currentTime.value / duration.value) * 100\n})\n\nconst showVolumeTwo = computed(() => !isMuted.value && volume.value > 0.5)\nconst showVolumeOne = computed(() => isMuted.value && volume.value > 0)\n\nconst litegraphNode = computed(() => {\n if (!props.nodeId || !app.canvas.graph) return null\n return app.canvas.graph.getNodeById(props.nodeId) as LGraphNode | null\n})\n\nconst hidden = computed(() => {\n if (!litegraphNode.value) return false\n // dont show if its a LoadAudio and we have nodeId\n const isLoadAudio =\n litegraphNode.value.constructor?.comfyClass === 'LoadAudio'\n return isLoadAudio && !!props.nodeId\n})\n\n// Check if this is an output node\nconst isOutputNodeRef = computed(() => {\n const node = litegraphNode.value\n return !!node && isOutputNode(node)\n})\n\nconst nodeLocatorId = computed(() => {\n const node = litegraphNode.value\n if (!node) return null\n return getLocatorIdFromNodeData(node)\n})\n\nconst nodeOutputStore = useNodeOutputStore()\n\n// Computed audio URL from node output (for output nodes)\nconst audioUrlFromOutput = computed(() => {\n if (!isOutputNodeRef.value || !nodeLocatorId.value) return ''\n\n const nodeOutput = nodeOutputStore.nodeOutputs[nodeLocatorId.value]\n if (!nodeOutput?.audio || nodeOutput.audio.length === 0) return ''\n\n const audio = nodeOutput.audio[0]\n if (!audio.filename) return ''\n\n return api.apiURL(\n getResourceURL(\n audio.subfolder || '',\n audio.filename,\n audio.type || 'output'\n )\n )\n})\n\n// Combined audio URL (output takes precedence for output nodes)\nconst finalAudioUrl = computed(() => {\n return audioUrlFromOutput.value || props.audioUrl || ''\n})\n\n// Playback controls\nconst togglePlayPause = () => {\n if (!audioRef.value || !audioRef.value.src) {\n return\n }\n\n if (isPlaying.value) {\n audioRef.value.pause()\n } else {\n void audioRef.value.play()\n }\n isPlaying.value = !isPlaying.value\n}\n\nconst toggleMute = () => {\n if (audioRef.value) {\n isMuted.value = !isMuted.value\n audioRef.value.muted = isMuted.value\n }\n}\n\nconst handleSeek = (event: Event) => {\n const target = event.target as HTMLInputElement\n const value = parseFloat(target.value)\n if (audioRef.value && duration.value > 0) {\n const newTime = (value / 100) * duration.value\n audioRef.value.currentTime = newTime\n currentTime.value = newTime\n }\n}\n\n// Audio events\nconst handleLoadedMetadata = () => {\n if (audioRef.value) {\n duration.value = audioRef.value.duration\n }\n}\n\nconst handleTimeUpdate = () => {\n if (audioRef.value) {\n currentTime.value = audioRef.value.currentTime\n }\n}\n\nconst handleEnded = () => {\n isPlaying.value = false\n currentTime.value = 0\n}\n\n// Options menu\nconst toggleOptionsMenu = (event: Event) => {\n optionsMenu.value?.toggle(event)\n}\n\nconst setPlaybackSpeed = (speed: number) => {\n playbackRate.value = speed\n if (audioRef.value) {\n audioRef.value.playbackRate = speed\n }\n}\n\nconst handleVolumeChange = (value: number | number[]) => {\n const numValue = Array.isArray(value) ? value[0] : value\n volume.value = numValue / 10\n if (audioRef.value) {\n audioRef.value.volume = volume.value\n if (volume.value > 0 && isMuted.value) {\n isMuted.value = false\n audioRef.value.muted = false\n }\n }\n}\n\nconst menuItems = computed(() => [\n {\n label: t('g.playbackSpeed'),\n items: [\n {\n label: t('g.halfSpeed'),\n onClick: () => setPlaybackSpeed(0.5),\n selected: playbackRate.value === 0.5\n },\n {\n label: t('g.1x'),\n onClick: () => setPlaybackSpeed(1),\n selected: playbackRate.value === 1\n },\n {\n label: t('g.2x'),\n onClick: () => setPlaybackSpeed(2),\n selected: playbackRate.value === 2\n }\n ]\n },\n {\n label: t('g.volume'),\n key: 'volume'\n }\n])\n\n// Load audio from URL\nconst loadAudioFromUrl = (url: string) => {\n if (!audioRef.value) return\n isPlaying.value = false\n audioRef.value.pause()\n audioRef.value.src = url\n void audioRef.value.load()\n hasAudio.value = !!url\n}\n\n// Watch for finalAudioUrl changes\nwatch(\n finalAudioUrl,\n (newUrl) => {\n if (newUrl) {\n void nextTick(() => {\n loadAudioFromUrl(newUrl)\n })\n }\n },\n { immediate: true }\n)\n\n// Cleanup\nonUnmounted(() => {\n if (audioRef.value) {\n audioRef.value.pause()\n audioRef.value.src = ''\n }\n})\n</script>\n\n<style scoped>\n.audio-player-menu {\n --p-tieredmenu-item-focus-background: rgb(255 255 255 / 0.1);\n --p-tieredmenu-item-active-background: rgb(255 255 255 / 0.1);\n}\n</style>\n"],"names":["t","useI18n","props","__props","audioRef","ref","optionsMenu","isPlaying","isMuted","volume","currentTime","duration","hasAudio","playbackRate","progressPercentage","computed","showVolumeTwo","showVolumeOne","litegraphNode","app","hidden","isOutputNodeRef","node","isOutputNode","nodeLocatorId","getLocatorIdFromNodeData","nodeOutputStore","useNodeOutputStore","audioUrlFromOutput","nodeOutput","audio","api","getResourceURL","finalAudioUrl","togglePlayPause","__name","toggleMute","handleSeek","event","target","value","newTime","handleLoadedMetadata","handleTimeUpdate","handleEnded","toggleOptionsMenu","setPlaybackSpeed","speed","handleVolumeChange","numValue","menuItems","loadAudioFromUrl","url","watch","newUrl","nextTick","onUnmounted"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AudioPreviewPlayer-CSxbl0y3.js","sources":["../../src/renderer/extensions/vueNodes/widgets/components/audio/AudioPreviewPlayer.vue"],"sourcesContent":["<template>\n <div class=\"relative\">\n <div\n v-if=\"!hidden\"\n :class=\"\n cn(\n 'bg-component-node-widget-background box-border flex gap-4 items-center justify-start relative rounded-lg w-full h-16 px-4 py-0',\n { hidden: hideWhenEmpty && !hasAudio }\n )\n \"\n >\n <!-- Hidden audio element -->\n <audio\n ref=\"audioRef\"\n @loadedmetadata=\"handleLoadedMetadata\"\n @timeupdate=\"handleTimeUpdate\"\n @ended=\"handleEnded\"\n />\n\n <!-- Left Actions -->\n <div class=\"relative flex shrink-0 items-center justify-start gap-2\">\n <!-- Play/Pause Button -->\n <div\n role=\"button\"\n :tabindex=\"0\"\n :aria-label=\"$t('g.playPause')\"\n class=\"flex size-6 cursor-pointer items-center justify-center rounded hover:bg-interface-menu-component-surface-hovered\"\n @click=\"togglePlayPause\"\n >\n <i\n v-if=\"!isPlaying\"\n class=\"text-secondary icon-[lucide--play] size-4\"\n />\n <i v-else class=\"text-secondary icon-[lucide--pause] size-4\" />\n </div>\n\n <!-- Time Display -->\n <div class=\"text-sm font-normal text-nowrap text-base-foreground\">\n {{ formatTime(currentTime) }} / {{ formatTime(duration) }}\n </div>\n </div>\n\n <!-- Progress Bar -->\n <div class=\"relative h-0.5 flex-1 rounded-full bg-interface-stroke\">\n <div\n class=\"absolute top-0 left-0 h-full rounded-full bg-button-icon transition-all\"\n :style=\"{ width: `${progressPercentage}%` }\"\n />\n <input\n type=\"range\"\n :value=\"progressPercentage\"\n min=\"0\"\n max=\"100\"\n step=\"0.1\"\n :aria-label=\"$t('g.audioProgress')\"\n class=\"absolute inset-0 w-full cursor-pointer opacity-0\"\n @input=\"handleSeek\"\n />\n </div>\n\n <!-- Right Actions -->\n <div class=\"relative flex shrink-0 items-center justify-start gap-2\">\n <!-- Volume Button -->\n <div\n role=\"button\"\n :tabindex=\"0\"\n :aria-label=\"$t('g.volume')\"\n class=\"flex size-6 cursor-pointer items-center justify-center rounded hover:bg-interface-menu-component-surface-hovered\"\n @click=\"toggleMute\"\n >\n <i\n v-if=\"showVolumeTwo\"\n class=\"text-secondary icon-[lucide--volume-2] size-4\"\n />\n <i\n v-else-if=\"showVolumeOne\"\n class=\"text-secondary icon-[lucide--volume-1] size-4\"\n />\n <i v-else class=\"text-secondary icon-[lucide--volume-x] size-4\" />\n </div>\n\n <!-- Options Button -->\n <div\n v-if=\"showOptionsButton\"\n role=\"button\"\n :tabindex=\"0\"\n :aria-label=\"$t('g.moreOptions')\"\n class=\"flex size-6 cursor-pointer items-center justify-center rounded hover:bg-interface-menu-component-surface-hovered\"\n @click=\"toggleOptionsMenu\"\n >\n <i class=\"text-secondary icon-[lucide--more-vertical] size-4\" />\n </div>\n </div>\n\n <!-- Options Menu -->\n <TieredMenu\n ref=\"optionsMenu\"\n :model=\"menuItems\"\n popup\n class=\"audio-player-menu\"\n :pt:root:class=\"\n cn('bg-component-node-widget-background border-component-node-border')\n \"\n :pt:submenu:class=\"cn('bg-component-node-widget-background')\"\n >\n <template #item=\"{ item }\">\n <div v-if=\"item.key === 'volume'\" class=\"w-48 px-4 py-2\">\n <label class=\"mb-2 block text-xs text-base-foreground\">{{\n item.label\n }}</label>\n <Slider\n :model-value=\"volume * 10\"\n :min=\"0\"\n :max=\"10\"\n :step=\"1\"\n class=\"w-full\"\n @update:model-value=\"handleVolumeChange\"\n />\n </div>\n <div\n v-else\n class=\"flex cursor-pointer items-center px-4 py-2 text-xs hover:bg-white/10\"\n @click=\"item.onClick?.()\"\n >\n <span class=\"text-base-foreground\">{{ item.label }}</span>\n <i\n v-if=\"item.selected\"\n class=\"ml-auto icon-[lucide--check] size-4 text-base-foreground\"\n />\n </div>\n </template>\n </TieredMenu>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Slider from 'primevue/slider'\nimport TieredMenu from 'primevue/tieredmenu'\nimport { computed, nextTick, onUnmounted, ref, watch } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport type { LGraphNode } from '@/lib/litegraph/src/LGraphNode'\nimport { api } from '@/scripts/api'\nimport { app } from '@/scripts/app'\nimport { useNodeOutputStore } from '@/stores/imagePreviewStore'\nimport { getLocatorIdFromNodeData } from '@/utils/graphTraversalUtil'\nimport { isOutputNode } from '@/utils/nodeFilterUtil'\nimport { cn } from '@/utils/tailwindUtil'\n\nimport { formatTime, getResourceURL } from '../../utils/audioUtils'\n\nconst { t } = useI18n()\n\nconst props = withDefaults(\n defineProps<{\n hideWhenEmpty?: boolean\n showOptionsButton?: boolean\n nodeId?: string\n audioUrl?: string\n }>(),\n {\n hideWhenEmpty: true\n }\n)\n\n// Refs\nconst audioRef = ref<HTMLAudioElement>()\nconst optionsMenu = ref()\nconst isPlaying = ref(false)\nconst isMuted = ref(false)\nconst volume = ref(1)\nconst currentTime = ref(0)\nconst duration = ref(0)\nconst hasAudio = ref(false)\nconst playbackRate = ref(1)\n\n// Computed\nconst progressPercentage = computed(() => {\n if (!duration.value || duration.value === 0) return 0\n return (currentTime.value / duration.value) * 100\n})\n\nconst showVolumeTwo = computed(() => !isMuted.value && volume.value > 0.5)\nconst showVolumeOne = computed(() => isMuted.value && volume.value > 0)\n\nconst litegraphNode = computed(() => {\n if (!props.nodeId || !app.canvas.graph) return null\n return app.canvas.graph.getNodeById(props.nodeId) as LGraphNode | null\n})\n\nconst hidden = computed(() => {\n if (!litegraphNode.value) return false\n // dont show if its a LoadAudio and we have nodeId\n const isLoadAudio =\n litegraphNode.value.constructor?.comfyClass === 'LoadAudio'\n return isLoadAudio && !!props.nodeId\n})\n\n// Check if this is an output node\nconst isOutputNodeRef = computed(() => {\n const node = litegraphNode.value\n return !!node && isOutputNode(node)\n})\n\nconst nodeLocatorId = computed(() => {\n const node = litegraphNode.value\n if (!node) return null\n return getLocatorIdFromNodeData(node)\n})\n\nconst nodeOutputStore = useNodeOutputStore()\n\n// Computed audio URL from node output (for output nodes)\nconst audioUrlFromOutput = computed(() => {\n if (!isOutputNodeRef.value || !nodeLocatorId.value) return ''\n\n const nodeOutput = nodeOutputStore.nodeOutputs[nodeLocatorId.value]\n if (!nodeOutput?.audio || nodeOutput.audio.length === 0) return ''\n\n const audio = nodeOutput.audio[0]\n if (!audio.filename) return ''\n\n return api.apiURL(\n getResourceURL(\n audio.subfolder || '',\n audio.filename,\n audio.type || 'output'\n )\n )\n})\n\n// Combined audio URL (output takes precedence for output nodes)\nconst finalAudioUrl = computed(() => {\n return audioUrlFromOutput.value || props.audioUrl || ''\n})\n\n// Playback controls\nconst togglePlayPause = () => {\n if (!audioRef.value || !audioRef.value.src) {\n return\n }\n\n if (isPlaying.value) {\n audioRef.value.pause()\n } else {\n void audioRef.value.play()\n }\n isPlaying.value = !isPlaying.value\n}\n\nconst toggleMute = () => {\n if (audioRef.value) {\n isMuted.value = !isMuted.value\n audioRef.value.muted = isMuted.value\n }\n}\n\nconst handleSeek = (event: Event) => {\n const target = event.target as HTMLInputElement\n const value = parseFloat(target.value)\n if (audioRef.value && duration.value > 0) {\n const newTime = (value / 100) * duration.value\n audioRef.value.currentTime = newTime\n currentTime.value = newTime\n }\n}\n\n// Audio events\nconst handleLoadedMetadata = () => {\n if (audioRef.value) {\n duration.value = audioRef.value.duration\n }\n}\n\nconst handleTimeUpdate = () => {\n if (audioRef.value) {\n currentTime.value = audioRef.value.currentTime\n }\n}\n\nconst handleEnded = () => {\n isPlaying.value = false\n currentTime.value = 0\n}\n\n// Options menu\nconst toggleOptionsMenu = (event: Event) => {\n optionsMenu.value?.toggle(event)\n}\n\nconst setPlaybackSpeed = (speed: number) => {\n playbackRate.value = speed\n if (audioRef.value) {\n audioRef.value.playbackRate = speed\n }\n}\n\nconst handleVolumeChange = (value: number | number[]) => {\n const numValue = Array.isArray(value) ? value[0] : value\n volume.value = numValue / 10\n if (audioRef.value) {\n audioRef.value.volume = volume.value\n if (volume.value > 0 && isMuted.value) {\n isMuted.value = false\n audioRef.value.muted = false\n }\n }\n}\n\nconst menuItems = computed(() => [\n {\n label: t('g.playbackSpeed'),\n items: [\n {\n label: t('g.halfSpeed'),\n onClick: () => setPlaybackSpeed(0.5),\n selected: playbackRate.value === 0.5\n },\n {\n label: t('g.1x'),\n onClick: () => setPlaybackSpeed(1),\n selected: playbackRate.value === 1\n },\n {\n label: t('g.2x'),\n onClick: () => setPlaybackSpeed(2),\n selected: playbackRate.value === 2\n }\n ]\n },\n {\n label: t('g.volume'),\n key: 'volume'\n }\n])\n\n// Load audio from URL\nconst loadAudioFromUrl = (url: string) => {\n if (!audioRef.value) return\n isPlaying.value = false\n audioRef.value.pause()\n audioRef.value.src = url\n void audioRef.value.load()\n hasAudio.value = !!url\n}\n\n// Watch for finalAudioUrl changes\nwatch(\n finalAudioUrl,\n (newUrl) => {\n if (newUrl) {\n void nextTick(() => {\n loadAudioFromUrl(newUrl)\n })\n }\n },\n { immediate: true }\n)\n\n// Cleanup\nonUnmounted(() => {\n if (audioRef.value) {\n audioRef.value.pause()\n audioRef.value.src = ''\n }\n})\n</script>\n\n<style scoped>\n.audio-player-menu {\n --p-tieredmenu-item-focus-background: rgb(255 255 255 / 0.1);\n --p-tieredmenu-item-active-background: rgb(255 255 255 / 0.1);\n}\n</style>\n"],"names":["t","useI18n","props","__props","audioRef","ref","optionsMenu","isPlaying","isMuted","volume","currentTime","duration","hasAudio","playbackRate","progressPercentage","computed","showVolumeTwo","showVolumeOne","litegraphNode","app","hidden","isOutputNodeRef","node","isOutputNode","nodeLocatorId","getLocatorIdFromNodeData","nodeOutputStore","useNodeOutputStore","audioUrlFromOutput","nodeOutput","audio","api","getResourceURL","finalAudioUrl","togglePlayPause","__name","toggleMute","handleSeek","event","target","value","newTime","handleLoadedMetadata","handleTimeUpdate","handleEnded","toggleOptionsMenu","setPlaybackSpeed","speed","handleVolumeChange","numValue","menuItems","loadAudioFromUrl","url","watch","newUrl","nextTick","onUnmounted"],"mappings":"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"}
|
comfyui_frontend_package/static/assets/{ComfyQueueButton-C6ttLtL6.js → ComfyQueueButton-BV0p-R1-.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var I=Object.defineProperty;var a=(f,u)=>I(f,"name",{value:u,configurable:!0});import{s as w,u as V}from"./vendor-vue-DaLZjKA7.js";import{J as T,ag as P}from"./vendor-primevue-DeKsC2uk.js";import{cp as S,e as z,d as k,q as E,H as W,r as j,A,_ as F}from"./index
|
|
2
|
-
//# sourceMappingURL=ComfyQueueButton-
|
|
1
|
+
var I=Object.defineProperty;var a=(f,u)=>I(f,"name",{value:u,configurable:!0});import{s as w,u as V}from"./vendor-vue-DaLZjKA7.js";import{J as T,ag as P}from"./vendor-primevue-DeKsC2uk.js";import{cp as S,e as z,d as k,q as E,H as W,r as j,A,_ as F}from"./index--yK73oka.js";import{g as H}from"./GraphView-BuGkgiGk.js";import{bx as B,E as s,h as D,l as _,c as y,d as c,z as q,by as p,bg as K,j as C,k as b,q as L,A as R,s as g,u as G,e as J}from"./vendor-other-B8t_Wf2K.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-DH0o8VQ7.js";import"./vendor-tiptap-VxK0yxkd.js";import"./UserAvatar.vue_vue_type_script_setup_true_lang-COE-v4cY.js";import"./index-Hz5b30sA.js";import"./LazyImage.vue_vue_type_script_setup_true_lang-Op4fug5d.js";import"./keybindingService-XE4XFAxf.js";import"./serverConfigStore-D8kGBwZ6.js";import"./WidgetInputNumber.vue_vue_type_script_setup_true_lang-qjF5C0EN.js";import"./widgetPropFilter-CygYoMQt.js";import"./WidgetLayoutField.vue_vue_type_script_setup_true_lang-Bq1noASf.js";import"./WidgetWithControl.vue_vue_type_script_setup_true_lang-Bx6suA2O.js";const O=["aria-label"],U=1,X=B({__name:"BatchCountEdit",setup(f){const u=S(),{batchCount:t}=w(u),v=z(),m=s(()=>v.get("Comfy.QueueButton.BatchCountLimit")),r=a(e=>{let o;if(e){const n=t.value-1;o=Math.min(n*2,m.value)}else{const n=t.value+1;o=Math.floor(n/2)}t.value=o},"handleClick");return(e,o)=>{const n=D("tooltip");return _((c(),y("div",{class:"batch-count","aria-label":e.$t("menu.batchCount")},[q(p(T),{modelValue:p(t),"onUpdate:modelValue":o[0]||(o[0]=h=>K(t)?t.value=h:null),class:"w-14",min:U,max:m.value,fluid:"","show-buttons":"",pt:{incrementButton:{class:"w-6",onmousedown:a(()=>{r(!0)},"onmousedown")},decrementButton:{class:"w-6",onmousedown:a(()=>{r(!1)},"onmousedown")}}},null,8,["modelValue","max","pt"])],8,O)),[[n,{value:e.$t("menu.batchCount"),showDelay:600},void 0,{bottom:!0}]])}}}),Y=k(X,[["__scopeId","data-v-19217ad4"]]),Z={class:"queue-button-group flex"},ee=B({__name:"ComfyQueueButton",setup(f){const u=E(),{mode:t,batchCount:v}=w(S()),m=W(),r=s(()=>H(j.rootGraph,m.nodeDefsByName)),{t:e}=V(),o=s(()=>{const i={disabled:{key:"disabled",label:e("menu.run"),tooltip:e("menu.disabledTooltip"),command:a(()=>{t.value="disabled"},"command")},change:{key:"change",label:`${e("menu.run")} (${e("menu.onChange")})`,tooltip:e("menu.onChangeTooltip"),command:a(()=>{t.value="change"},"command")}};return i.instant={key:"instant",label:`${e("menu.run")} (${e("menu.instant")})`,tooltip:e("menu.instantTooltip"),command:a(()=>{t.value="instant"},"command")},i}),n=s(()=>o.value[t.value]||o.value.disabled),h=s(()=>Object.values(o.value)),M=s(()=>r.value?"icon-[lucide--triangle-alert]":u.shiftDown?"icon-[lucide--list-start]":t.value==="disabled"?"icon-[lucide--play]":t.value==="instant"?"icon-[lucide--fast-forward]":t.value==="change"?"icon-[lucide--step-forward]":"icon-[lucide--play]"),x=s(()=>r.value?e("menu.runWorkflowDisabled"):u.shiftDown?e("menu.runWorkflowFront"):e("menu.runWorkflow")),$=A(),Q=a(async i=>{const d="shiftKey"in i&&i.shiftKey?"Comfy.QueuePromptFront":"Comfy.QueuePrompt";v.value>1,await $.execute(d,{metadata:{subscribe_to_run:!1,trigger_source:"button"}})},"queuePrompt");return(i,N)=>{const d=D("tooltip");return c(),y("div",Z,[_((c(),C(p(P),{class:"comfyui-queue-button",label:String(n.value?.label??""),severity:"primary",size:"small",model:h.value,"data-testid":"queue-button",onClick:Q},{icon:b(()=>[J("i",{class:g(M.value)},null,2)]),item:b(({item:l})=>[_((c(),C(F,{variant:l.key===p(t)?"primary":"secondary",size:"sm",class:"w-full justify-start"},{default:b(()=>[l.icon?(c(),y("i",{key:0,class:g(l.icon)},null,2)):L("",!0),R(" "+G(String(l.label??"")),1)]),_:2},1032,["variant"])),[[d,{value:l.tooltip,showDelay:600}]])]),_:1},8,["label","model"])),[[d,{value:x.value,showDelay:600},void 0,{bottom:!0}]]),q(Y)])}}}),ye=k(ee,[["__scopeId","data-v-214102f7"]]);export{ye as default};
|
|
2
|
+
//# sourceMappingURL=ComfyQueueButton-BV0p-R1-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComfyQueueButton-
|
|
1
|
+
{"version":3,"file":"ComfyQueueButton-BV0p-R1-.js","sources":["../../src/components/actionbar/BatchCountEdit.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 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"],"names":["minQueueCount","queueSettingsStore","useQueueSettingsStore","batchCount","storeToRefs","settingStore","useSettingStore","maxQueueCount","computed","handleClick","__name","increment","newCount","originalCount","workspaceStore","useWorkspaceStore","queueMode","nodeDefStore","useNodeDefStore","hasMissingNodes","graphHasMissingNodes","app","t","useI18n","queueModeMenuItemLookup","items","activeQueueModeMenuItem","queueModeMenuItems","iconClass","queueButtonTooltip","commandStore","useCommandStore","queuePrompt","e","commandId"],"mappings":"0lCA4CMA,EAAgB,wCAFtB,MAAMC,EAAqBC,EAAA,EACrB,CAAE,WAAAC,CAAA,EAAeC,EAAYH,CAAkB,EAG/CI,EAAeC,EAAA,EACfC,EAAgBC,EAAS,IAC7BH,EAAa,IAAI,mCAAmC,CAAA,EAGhDI,EAAcC,EAACC,GAAuB,CAC1C,IAAIC,EACJ,GAAID,EAAW,CACb,MAAME,EAAgBV,EAAW,MAAQ,EACzCS,EAAW,KAAK,IAAIC,EAAgB,EAAGN,EAAc,KAAK,CAC5D,KAAO,CACL,MAAMM,EAAgBV,EAAW,MAAQ,EACzCS,EAAW,KAAK,MAAMC,EAAgB,CAAC,CACzC,CAEAV,EAAW,MAAQS,CACrB,EAXoB,+oBCKpB,MAAME,EAAiBC,EAAA,EACjB,CAAE,KAAMC,EAAW,WAAAb,GAAeC,EAAYF,GAAuB,EAErEe,EAAeC,EAAA,EACfC,EAAkBX,EAAS,IAC/BY,EAAqBC,EAAI,UAAWJ,EAAa,cAAc,CAAA,EAG3D,CAAE,EAAAK,CAAA,EAAMC,EAAA,EACRC,EAA0BhB,EAAS,IAAM,CAC7C,MAAMiB,EAAkC,CACtC,SAAU,CACR,IAAK,WACL,MAAOH,EAAE,UAAU,EACnB,QAASA,EAAE,sBAAsB,EACjC,QAASZ,EAAA,IAAM,CACbM,EAAU,MAAQ,UACpB,EAFS,UAET,EAEF,OAAQ,CACN,IAAK,SACL,MAAO,GAAGM,EAAE,UAAU,CAAC,KAAKA,EAAE,eAAe,CAAC,IAC9C,QAASA,EAAE,sBAAsB,EACjC,QAASZ,EAAA,IAAM,CAIbM,EAAU,MAAQ,QACpB,EALS,UAKT,CACF,EAGA,OAAAS,EAAM,QAAU,CACd,IAAK,UACL,MAAO,GAAGH,EAAE,UAAU,CAAC,KAAKA,EAAE,cAAc,CAAC,IAC7C,QAASA,EAAE,qBAAqB,EAChC,QAASZ,EAAA,IAAM,CAIbM,EAAU,MAAQ,SACpB,EALS,UAKT,EAGGS,CACT,CAAC,EAEKC,EAA0BlB,EAAS,IAGrCgB,EAAwB,MAAMR,EAAU,KAAK,GAC7CQ,EAAwB,MAAM,QAEjC,EACKG,EAAqBnB,EAAS,IAClC,OAAO,OAAOgB,EAAwB,KAAK,CAAA,EAGvCI,EAAYpB,EAAS,IACrBW,EAAgB,MACX,gCAELL,EAAe,UACV,4BAELE,EAAU,QAAU,WACf,sBAELA,EAAU,QAAU,UACf,8BAELA,EAAU,QAAU,SACf,8BAEF,qBACR,EAEKa,EAAqBrB,EAAS,IAC9BW,EAAgB,MACXG,EAAE,0BAA0B,EAEjCR,EAAe,UACVQ,EAAE,uBAAuB,EAE3BA,EAAE,kBAAkB,CAC5B,EAEKQ,EAAeC,EAAA,EACfC,EAActB,EAAA,MAAOuB,GAAa,CAEtC,MAAMC,EADiB,aAAcD,GAAKA,EAAE,SAExC,yBACA,oBAEA9B,EAAW,MAAQ,EAMvB,MAAM2B,EAAa,QAAQI,EAAW,CACpC,SAAU,CACR,iBAAkB,GAClB,eAAgB,QAAA,CAClB,CACD,CACH,EAlBoB"}
|
comfyui_frontend_package/static/assets/{ExtensionPanel-uFlj7Yfm.js → ExtensionPanel-DvPzK040.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var D=Object.defineProperty;var i=(C,u)=>D(C,"name",{value:u,configurable:!0});import{v as F,ad as I,ae as h,w as $,L,o as q,s as K,af as P}from"./vendor-primevue-DeKsC2uk.js";import{u as G}from"./vendor-vue-DaLZjKA7.js";import{a2 as H,e as J,_ as k,S as Q,du as W}from"./index
|
|
2
|
-
//# sourceMappingURL=ExtensionPanel-
|
|
1
|
+
var D=Object.defineProperty;var i=(C,u)=>D(C,"name",{value:u,configurable:!0});import{v as F,ad as I,ae as h,w as $,L,o as q,s as K,af as P}from"./vendor-primevue-DeKsC2uk.js";import{u as G}from"./vendor-vue-DaLZjKA7.js";import{a2 as H,e as J,_ as k,S as Q,du as W}from"./index--yK73oka.js";import{bx as X,E as c,r as p,o as Y,j as y,d as m,k as r,e as f,z as o,by as l,A as g,u as E,q as Z,c as S,F as ee,y as ae}from"./vendor-other-B8t_Wf2K.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-DH0o8VQ7.js";import"./vendor-tiptap-VxK0yxkd.js";const ne={class:"flex justify-end"},se={class:"mb-3 flex gap-2"},ce=X({__name:"ExtensionPanel",setup(C){const{t:u}=G(),_=["all","core","custom"],N=c(()=>_.map(e=>({label:u(`g.${e}`),value:e}))),x=p("all"),v=p([]),b=p({global:{value:"",matchMode:P.CONTAINS}}),a=H(),T=J(),t=p({}),A=c(()=>{const e=a.extensions;switch(x.value){case"core":return e.filter(s=>a.isCoreExtension(s.name));case"custom":return e.filter(s=>!a.isCoreExtension(s.name));default:return e}});Y(()=>{a.extensions.forEach(e=>{t.value[e.name]=a.isExtensionEnabled(e.name)})});const w=c(()=>a.extensions.filter(e=>t.value[e.name]!==a.isExtensionEnabled(e.name))),O=c(()=>w.value.length>0),d=i(async()=>{const e=Object.entries(t.value).filter(([s,n])=>!n).map(([s])=>s);await T.set("Comfy.Extension.Disabled",[...a.inactiveDisabledExtensionNames,...e])},"updateExtensionStatus"),j=i(async()=>{a.extensions.forEach(e=>{a.isExtensionReadOnly(e.name)||(t.value[e.name]=!0)}),await d()},"enableAllExtensions"),B=i(async()=>{a.extensions.forEach(e=>{a.isExtensionReadOnly(e.name)||(t.value[e.name]=!1)}),await d()},"disableAllExtensions"),M=i(async()=>{a.extensions.forEach(e=>{a.isCoreExtension(e.name)||(t.value[e.name]=!1)}),await d()},"disableThirdPartyExtensions"),R=i(()=>{window.location.reload()},"applyChanges"),V=p(),U=c(()=>[{label:u("g.enableSelected"),icon:"pi pi-check",command:i(async()=>{v.value.forEach(e=>{a.isExtensionReadOnly(e.name)||(t.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)||(t.value[e.name]=!1)}),await d()},"command")},{separator:!0},{label:u("g.enableAll"),icon:"pi pi-check",command:j},{label:u("g.disableAll"),icon:"pi pi-times",command:B},{label:u("g.disableThirdParty"),icon:"pi pi-times",command:M,disabled:!a.hasThirdPartyExtensions}]);return(e,s)=>(m(),y(W,{value:"Extension",class:"extension-panel"},{header:r(()=>[o(Q,{modelValue:b.value.global.value,"onUpdate:modelValue":s[0]||(s[0]=n=>b.value.global.value=n),placeholder:e.$t("g.searchExtensions")+"..."},null,8,["modelValue","placeholder"]),O.value?(m(),y(l(K),{key:0,severity:"info","pt:text":"w-full",class:"max-h-96 overflow-y-auto"},{default:r(()=>[f("ul",null,[(m(!0),S(ee,null,ae(w.value,n=>(m(),S("li",{key:n.name},[f("span",null,E(l(a).isExtensionEnabled(n.name)?"[-]":"[+]"),1),g(" "+E(n.name),1)]))),128))]),f("div",ne,[o(k,{variant:"destructive",onClick:R},{default:r(()=>[g(E(e.$t("g.reloadToApplyChanges")),1)]),_:1})])]),_:1})):Z("",!0)]),default:r(()=>[f("div",se,[o(l(F),{modelValue:x.value,"onUpdate:modelValue":s[1]||(s[1]=n=>x.value=n),options:N.value,"option-label":"label","option-value":"value"},null,8,["modelValue","options"])]),o(l(I),{selection:v.value,"onUpdate:selection":s[3]||(s[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($),{key:0,value:e.$t("g.core")},null,8,["value"])):(m(),y(l($),{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:s[2]||(s[2]=n=>V.value?.show(n))},{default:r(()=>s[4]||(s[4]=[f("i",{class:"pi pi-ellipsis-h"},null,-1)])),_:1}),o(l(q),{ref_key:"menu",ref:V,model:U.value},null,8,["model"])]),body:r(n=>[o(l(L),{modelValue:t.value[n.data.name],"onUpdate:modelValue":i(z=>t.value[n.data.name]=z,"onUpdate:modelValue"),disabled:l(a).isExtensionReadOnly(n.data.name),onChange:d},null,8,["modelValue","onUpdate:modelValue","disabled"])]),_:1})]),_:1},8,["selection","value","filters"])]),_:1}))}});export{ce as default};
|
|
2
|
+
//# sourceMappingURL=ExtensionPanel-DvPzK040.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionPanel-uFlj7Yfm.js","sources":["../../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"],"names":["t","useI18n","filterTypeKeys","filterTypes","computed","key","filterType","ref","selectedExtensions","filters","FilterMatchMode","extensionStore","useExtensionStore","settingStore","useSettingStore","editingEnabledExtensions","filteredExtensions","extensions","ext","onMounted","changedExtensions","hasChanges","updateExtensionStatus","__name","editingDisabledExtensionNames","_","enabled","name","enableAllExtensions","disableAllExtensions","disableThirdPartyExtensions","applyChanges","menu","contextMenuItems"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExtensionPanel-DvPzK040.js","sources":["../../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"],"names":["t","useI18n","filterTypeKeys","filterTypes","computed","key","filterType","ref","selectedExtensions","filters","FilterMatchMode","extensionStore","useExtensionStore","settingStore","useSettingStore","editingEnabledExtensions","filteredExtensions","extensions","ext","onMounted","changedExtensions","hasChanges","updateExtensionStatus","__name","editingDisabledExtensionNames","_","enabled","name","enableAllExtensions","disableAllExtensions","disableThirdPartyExtensions","applyChanges","menu","contextMenuItems"],"mappings":"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"}
|