comfyui-frontend-package 1.37.1__py3-none-any.whl → 1.37.2__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-CTGWwQqp.js → AboutPanel-DLChcmDc.js} +2 -2
- comfyui_frontend_package/static/assets/{AboutPanel-CTGWwQqp.js.map → AboutPanel-DLChcmDc.js.map} +1 -1
- comfyui_frontend_package/static/assets/{AudioPreviewPlayer-DDwwIMxr.js → AudioPreviewPlayer-B8RfUAL6.js} +2 -2
- comfyui_frontend_package/static/assets/{AudioPreviewPlayer-DDwwIMxr.js.map → AudioPreviewPlayer-B8RfUAL6.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ComfyQueueButton-BDRXGOWF.js → ComfyQueueButton-DRgA2g3T.js} +2 -2
- comfyui_frontend_package/static/assets/{ComfyQueueButton-BDRXGOWF.js.map → ComfyQueueButton-DRgA2g3T.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ExtensionPanel-Dxe7qElb.js → ExtensionPanel-CpMR9h6B.js} +2 -2
- comfyui_frontend_package/static/assets/{ExtensionPanel-Dxe7qElb.js.map → ExtensionPanel-CpMR9h6B.js.map} +1 -1
- comfyui_frontend_package/static/assets/{GraphView-Cx4wYzNo.js → GraphView-xK7kCVVH.js} +5 -5
- comfyui_frontend_package/static/assets/{GraphView-Cx4wYzNo.js.map → GraphView-xK7kCVVH.js.map} +1 -1
- comfyui_frontend_package/static/assets/{KeybindingPanel-pmyMPZHn.js → KeybindingPanel-CM_PwegN.js} +2 -2
- comfyui_frontend_package/static/assets/{KeybindingPanel-pmyMPZHn.js.map → KeybindingPanel-CM_PwegN.js.map} +1 -1
- comfyui_frontend_package/static/assets/{LazyImage.vue_vue_type_script_setup_true_lang-C3ynRbso.js → LazyImage.vue_vue_type_script_setup_true_lang-Dza6G4hd.js} +2 -2
- comfyui_frontend_package/static/assets/{LazyImage.vue_vue_type_script_setup_true_lang-C3ynRbso.js.map → LazyImage.vue_vue_type_script_setup_true_lang-Dza6G4hd.js.map} +1 -1
- comfyui_frontend_package/static/assets/{LegacyCreditsPanel-DSos04Q3.js → LegacyCreditsPanel-BujZmWgC.js} +2 -2
- comfyui_frontend_package/static/assets/{LegacyCreditsPanel-DSos04Q3.js.map → LegacyCreditsPanel-BujZmWgC.js.map} +1 -1
- comfyui_frontend_package/static/assets/{Load3D-Cu5zG2Cw.js → Load3D-DWafZUud.js} +2 -2
- comfyui_frontend_package/static/assets/Load3D-DWafZUud.js.map +1 -0
- comfyui_frontend_package/static/assets/{Load3D.vue_vue_type_script_setup_true_lang-BJ0IqFdp.js → Load3D.vue_vue_type_script_setup_true_lang-_XswHXHt.js} +2 -2
- comfyui_frontend_package/static/assets/{Load3D.vue_vue_type_script_setup_true_lang-BJ0IqFdp.js.map → Load3D.vue_vue_type_script_setup_true_lang-_XswHXHt.js.map} +1 -1
- comfyui_frontend_package/static/assets/{Media3DBottom-DsMr4v-s.js → Media3DBottom-Z9nkVIUT.js} +2 -2
- comfyui_frontend_package/static/assets/{Media3DBottom-DsMr4v-s.js.map → Media3DBottom-Z9nkVIUT.js.map} +1 -1
- comfyui_frontend_package/static/assets/{Media3DTop-DQ18QW3M.js → Media3DTop-DKaMli8A.js} +2 -2
- comfyui_frontend_package/static/assets/{Media3DTop-DQ18QW3M.js.map → Media3DTop-DKaMli8A.js.map} +1 -1
- comfyui_frontend_package/static/assets/{MediaAudioBottom-99GB7NqQ.js → MediaAudioBottom-B62n8OnR.js} +2 -2
- comfyui_frontend_package/static/assets/{MediaAudioBottom-99GB7NqQ.js.map → MediaAudioBottom-B62n8OnR.js.map} +1 -1
- comfyui_frontend_package/static/assets/{MediaImageBottom-C6Bpu_d9.js → MediaImageBottom-DChcPA0h.js} +2 -2
- comfyui_frontend_package/static/assets/{MediaImageBottom-C6Bpu_d9.js.map → MediaImageBottom-DChcPA0h.js.map} +1 -1
- comfyui_frontend_package/static/assets/{MediaTitle.vue_vue_type_script_setup_true_lang-BFgOqxto.js → MediaTitle.vue_vue_type_script_setup_true_lang-CFkifLSX.js} +2 -2
- comfyui_frontend_package/static/assets/{MediaTitle.vue_vue_type_script_setup_true_lang-BFgOqxto.js.map → MediaTitle.vue_vue_type_script_setup_true_lang-CFkifLSX.js.map} +1 -1
- comfyui_frontend_package/static/assets/{MediaVideoBottom-DgdszioB.js → MediaVideoBottom-fWb8qHcu.js} +2 -2
- comfyui_frontend_package/static/assets/{MediaVideoBottom-DgdszioB.js.map → MediaVideoBottom-fWb8qHcu.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ServerConfigPanel-BlC22rDX.js → ServerConfigPanel-umnHESaV.js} +2 -2
- comfyui_frontend_package/static/assets/{ServerConfigPanel-BlC22rDX.js.map → ServerConfigPanel-umnHESaV.js.map} +1 -1
- comfyui_frontend_package/static/assets/SubscriptionRequiredDialogContent-BdL9OjAj.js +2 -0
- comfyui_frontend_package/static/assets/SubscriptionRequiredDialogContent-BdL9OjAj.js.map +1 -0
- comfyui_frontend_package/static/assets/{UserPanel-Ccmz94Hx.js → UserPanel-CwkZrKjy.js} +2 -2
- comfyui_frontend_package/static/assets/{UserPanel-Ccmz94Hx.js.map → UserPanel-CwkZrKjy.js.map} +1 -1
- comfyui_frontend_package/static/assets/{UserSelectView-DVFY57_D.js → UserSelectView-TeLhcKfi.js} +2 -2
- comfyui_frontend_package/static/assets/{UserSelectView-DVFY57_D.js.map → UserSelectView-TeLhcKfi.js.map} +1 -1
- comfyui_frontend_package/static/assets/{ValueControlPopover-BLxzZY7u.js → ValueControlPopover-CSvGimoz.js} +2 -2
- comfyui_frontend_package/static/assets/{ValueControlPopover-BLxzZY7u.js.map → ValueControlPopover-CSvGimoz.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetAudioUI-BtX1BUnO.js → WidgetAudioUI-CfZQ32fr.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetAudioUI-BtX1BUnO.js.map → WidgetAudioUI-CfZQ32fr.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetButton-CyIVF8iQ.js → WidgetButton-Bo9rWiUg.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetButton-CyIVF8iQ.js.map → WidgetButton-Bo9rWiUg.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetColorPicker-BcGFRyIl.js → WidgetColorPicker-CyNNmSC9.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetColorPicker-BcGFRyIl.js.map → WidgetColorPicker-CyNNmSC9.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetGalleria-CfluZbRG.js → WidgetGalleria-X2v42F2a.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetGalleria-CfluZbRG.js.map → WidgetGalleria-X2v42F2a.js.map} +1 -1
- comfyui_frontend_package/static/assets/WidgetInputNumber-BL6P8as9.js +2 -0
- comfyui_frontend_package/static/assets/WidgetInputNumber-BL6P8as9.js.map +1 -0
- comfyui_frontend_package/static/assets/{WidgetInputNumber.vue_vue_type_script_setup_true_lang-Bmxd6b-H.js → WidgetInputNumber.vue_vue_type_script_setup_true_lang-DPaOKLY2.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetInputNumber.vue_vue_type_script_setup_true_lang-Bmxd6b-H.js.map → WidgetInputNumber.vue_vue_type_script_setup_true_lang-DPaOKLY2.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetInputText-CecuaK0n.js → WidgetInputText-LR89p-m1.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetInputText-CecuaK0n.js.map → WidgetInputText-LR89p-m1.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetLayoutField.vue_vue_type_script_setup_true_lang-CbjST6rI.js → WidgetLayoutField.vue_vue_type_script_setup_true_lang-C5dBI8au.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetLayoutField.vue_vue_type_script_setup_true_lang-CbjST6rI.js.map → WidgetLayoutField.vue_vue_type_script_setup_true_lang-C5dBI8au.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetLegacy-B8P9bOsC.js → WidgetLegacy-CJpsLPyI.js} +2 -2
- comfyui_frontend_package/static/assets/WidgetLegacy-CJpsLPyI.js.map +1 -0
- comfyui_frontend_package/static/assets/{WidgetMarkdown-nXPgrFZi.js → WidgetMarkdown-DrH35WSE.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetMarkdown-nXPgrFZi.js.map → WidgetMarkdown-DrH35WSE.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetRecordAudio-C6urheNU.js → WidgetRecordAudio-DL4kMpXw.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetRecordAudio-C6urheNU.js.map → WidgetRecordAudio-DL4kMpXw.js.map} +1 -1
- comfyui_frontend_package/static/assets/WidgetSelect-Bk32AcQe.js +2 -0
- comfyui_frontend_package/static/assets/WidgetSelect-Bk32AcQe.js.map +1 -0
- comfyui_frontend_package/static/assets/{WidgetSelect.vue_vue_type_script_setup_true_lang-DTcBUlhn.js → WidgetSelect.vue_vue_type_script_setup_true_lang-CHjOuVyH.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetSelect.vue_vue_type_script_setup_true_lang-DTcBUlhn.js.map → WidgetSelect.vue_vue_type_script_setup_true_lang-CHjOuVyH.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetTextarea-DuXhEnsH.js → WidgetTextarea-orpeeVx4.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetTextarea-DuXhEnsH.js.map → WidgetTextarea-orpeeVx4.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetToggleSwitch-BTeDQHuf.js → WidgetToggleSwitch-CSN313_V.js} +2 -2
- comfyui_frontend_package/static/assets/{WidgetToggleSwitch-BTeDQHuf.js.map → WidgetToggleSwitch-CSN313_V.js.map} +1 -1
- comfyui_frontend_package/static/assets/{WidgetWithControl.vue_vue_type_script_setup_true_lang-DFvQ9Mdf.js → WidgetWithControl.vue_vue_type_script_setup_true_lang-CU_cmbAA.js} +3 -3
- comfyui_frontend_package/static/assets/{WidgetWithControl.vue_vue_type_script_setup_true_lang-DFvQ9Mdf.js.map → WidgetWithControl.vue_vue_type_script_setup_true_lang-CU_cmbAA.js.map} +1 -1
- comfyui_frontend_package/static/assets/{audioService-B43wn81n.js → audioService-DvqSt3rU.js} +2 -2
- comfyui_frontend_package/static/assets/{audioService-B43wn81n.js.map → audioService-DvqSt3rU.js.map} +1 -1
- comfyui_frontend_package/static/assets/{audioUtils-iqnmct8N.js → audioUtils-bxVioEE3.js} +2 -2
- comfyui_frontend_package/static/assets/{audioUtils-iqnmct8N.js.map → audioUtils-bxVioEE3.js.map} +1 -1
- comfyui_frontend_package/static/assets/{index-FoJ8Eu4a.js → index-BODInyrK.js} +21 -21
- comfyui_frontend_package/static/assets/{index-FoJ8Eu4a.js.map → index-BODInyrK.js.map} +1 -1
- comfyui_frontend_package/static/assets/{index-BbFKUlCt.js → index-CyS0uSKu.js} +2 -2
- comfyui_frontend_package/static/assets/{index-BbFKUlCt.js.map → index-CyS0uSKu.js.map} +1 -1
- comfyui_frontend_package/static/assets/{index-B2FA5n0E.js → index-fwtcK193.js} +2 -2
- comfyui_frontend_package/static/assets/{index-B2FA5n0E.js.map → index-fwtcK193.js.map} +1 -1
- comfyui_frontend_package/static/assets/{keybindingService-D_lPZZ7u.js → keybindingService-DR_nPGKY.js} +2 -2
- comfyui_frontend_package/static/assets/{keybindingService-D_lPZZ7u.js.map → keybindingService-DR_nPGKY.js.map} +1 -1
- comfyui_frontend_package/static/index.html +1 -1
- {comfyui_frontend_package-1.37.1.dist-info → comfyui_frontend_package-1.37.2.dist-info}/METADATA +1 -1
- {comfyui_frontend_package-1.37.1.dist-info → comfyui_frontend_package-1.37.2.dist-info}/RECORD +91 -91
- comfyui_frontend_package/static/assets/Load3D-Cu5zG2Cw.js.map +0 -1
- comfyui_frontend_package/static/assets/SubscriptionRequiredDialogContent-CY-BY6v5.js +0 -2
- comfyui_frontend_package/static/assets/SubscriptionRequiredDialogContent-CY-BY6v5.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetInputNumber-BTFa3T0H.js +0 -2
- comfyui_frontend_package/static/assets/WidgetInputNumber-BTFa3T0H.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetLegacy-B8P9bOsC.js.map +0 -1
- comfyui_frontend_package/static/assets/WidgetSelect-VznDfSeg.js +0 -2
- comfyui_frontend_package/static/assets/WidgetSelect-VznDfSeg.js.map +0 -1
- {comfyui_frontend_package-1.37.1.dist-info → comfyui_frontend_package-1.37.2.dist-info}/WHEEL +0 -0
- {comfyui_frontend_package-1.37.1.dist-info → comfyui_frontend_package-1.37.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Load3D-DWafZUud.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var me=Object.defineProperty;var r=(i,s)=>me(i,"name",{value:s,configurable:!0});import{bq as E,cF as Q,cG as h,r as _,o as K,c6 as Y,h as W,c as k,d as t,l as D,j as b,k as R,e as d,s as T,z as G,br as e,v as H,E as P,q as M,F as ee,y as oe,A as ae,u as J,I as V,T as fe,b9 as F}from"./vendor-other-BxP-0xn6.js";import{j as se,i as ie}from"./vendor-primevue-rR0TB_Js.js";import{_ as I,e as Z,t as q,c as X,d as de,cE as ye,u as be,cF as ke,cG as we,q as xe,cH as he}from"./index-FoJ8Eu4a.js";const Me={class:"relative show-slider"},Ce={class:"absolute top-0 left-12 rounded-lg bg-black/50 p-4 shadow-lg w-[150px]"},re=E({__name:"PopupSlider",props:Q({icon:{default:"pi-expand"},tooltipText:{},min:{default:10},max:{default:150},step:{default:1}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(i){const s=h(i,"modelValue"),l=_(!1),o=r(()=>{l.value=!l.value},"toggleSlider"),a=r(u=>{u.target.closest(".show-slider")||(l.value=!1)},"closeSlider");return K(()=>{document.addEventListener("click",a)}),Y(()=>{document.removeEventListener("click",a)}),(u,p)=>{const v=W("tooltip");return t(),k("div",Me,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":u.tooltipText,onClick:o},{default:R(()=>[d("i",{class:T(["pi",u.icon,"text-lg text-white"])},null,2)]),_:1},8,["aria-label"])),[[v,{value:u.tooltipText,showDelay:300},void 0,{right:!0}]]),D(d("div",Ce,[G(e(se),{modelValue:s.value,"onUpdate:modelValue":p[0]||(p[0]=c=>s.value=c),class:"w-full",min:u.min,max:u.max,step:u.step},null,8,["modelValue","min","max","step"])],512),[[H,l.value]])])}}}),$e={class:"flex flex-col"},De=E({__name:"CameraControls",props:{cameraType:{},cameraTypeModifiers:{},fov:{},fovModifiers:{}},emits:["update:cameraType","update:fov"],setup(i){const s=h(i,"cameraType"),l=h(i,"fov"),o=P(()=>s.value==="perspective"),a=r(()=>{s.value=s.value==="perspective"?"orthographic":"perspective"},"switchCamera");return(u,p)=>{const v=W("tooltip");return t(),k("div",$e,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":u.$t("load3d.switchCamera"),onClick:a},{default:R(()=>p[1]||(p[1]=[d("i",{class:T(["pi","pi-camera","text-lg text-white"])},null,-1)])),_:1},8,["aria-label"])),[[v,{value:u.$t("load3d.switchCamera"),showDelay:300},void 0,{right:!0}]]),o.value?(t(),b(re,{key:0,modelValue:l.value,"onUpdate:modelValue":p[0]||(p[0]=c=>l.value=c),"tooltip-text":u.$t("load3d.fov")},null,8,["modelValue","tooltip-text"])):M("",!0)])}}}),Re={class:"flex flex-col"},Ie={class:"show-export-formats relative"},Le={class:"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg"},Se={class:"flex flex-col"},Be=E({__name:"ExportControls",emits:["exportModel"],setup(i,{emit:s}){const l=s,o=_(!1),a=[{label:"GLB",value:"glb"},{label:"OBJ",value:"obj"},{label:"STL",value:"stl"}];function u(){o.value=!o.value}r(u,"toggleExportFormats");function p(c){l("exportModel",c),o.value=!1}r(p,"exportModel");function v(c){c.target.closest(".show-export-formats")||(o.value=!1)}return r(v,"closeExportFormatsList"),K(()=>{document.addEventListener("click",v)}),Y(()=>{document.removeEventListener("click",v)}),(c,n)=>{const m=W("tooltip");return t(),k("div",Re,[d("div",Ie,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":c.$t("load3d.exportModel"),onClick:u},{default:R(()=>n[0]||(n[0]=[d("i",{class:"pi pi-download text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[m,{value:c.$t("load3d.exportModel"),showDelay:300},void 0,{right:!0}]]),D(d("div",Le,[d("div",Se,[(t(),k(ee,null,oe(a,x=>G(I,{key:x.value,variant:"textonly",class:"text-white",onClick:r(S=>p(x.value),"onClick")},{default:R(()=>[ae(J(x.label),1)]),_:2},1032,["onClick"])),64))])],512),[[H,o.value]])])])}}}),Ue={class:"flex flex-col"},ze={key:0,class:"show-light-intensity relative"},Ve={class:"absolute top-0 left-12 rounded-lg bg-black/50 p-4 shadow-lg",style:{width:"150px"}},Ee=E({__name:"LightControls",props:{lightIntensity:{},lightIntensityModifiers:{},materialMode:{},materialModeModifiers:{}},emits:["update:lightIntensity","update:materialMode"],setup(i){const s=h(i,"lightIntensity"),l=h(i,"materialMode"),o=P(()=>l.value==="original"),a=_(!1),u=Z().get("Comfy.Load3D.LightIntensityMaximum"),p=Z().get("Comfy.Load3D.LightIntensityMinimum"),v=Z().get("Comfy.Load3D.LightAdjustmentIncrement");function c(){a.value=!a.value}r(c,"toggleLightIntensity");function n(m){m.target.closest(".show-light-intensity")||(a.value=!1)}return r(n,"closeLightSlider"),K(()=>{document.addEventListener("click",n)}),Y(()=>{document.removeEventListener("click",n)}),(m,x)=>{const S=W("tooltip");return t(),k("div",Ue,[o.value?(t(),k("div",ze,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":m.$t("load3d.lightIntensity"),onClick:c},{default:R(()=>x[1]||(x[1]=[d("i",{class:"pi pi-sun text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[S,{value:m.$t("load3d.lightIntensity"),showDelay:300},void 0,{right:!0}]]),D(d("div",Ve,[G(e(se),{modelValue:s.value,"onUpdate:modelValue":x[0]||(x[0]=C=>s.value=C),class:"w-full",min:e(p),max:e(u),step:e(v)},null,8,["modelValue","min","max","step"])],512),[[H,a.value]])])):M("",!0)])}}}),Pe={class:"flex flex-col"},Ge={class:"show-up-direction relative"},Te={class:"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg"},Fe={class:"flex flex-col"},_e={key:0,class:"show-material-mode relative"},Ae={class:"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg"},je={class:"flex flex-col"},Oe=E({__name:"ModelControls",props:Q({hideMaterialMode:{type:Boolean,default:!1},isPlyModel:{type:Boolean,default:!1}},{materialMode:{},materialModeModifiers:{},upDirection:{},upDirectionModifiers:{}}),emits:["update:materialMode","update:upDirection"],setup(i){const s=h(i,"materialMode"),l=h(i,"upDirection"),o=_(!1),a=_(!1),u=["original","-x","+x","-y","+y","-z","+z"],p=P(()=>{const C=["original","normal","wireframe"];return i.isPlyModel&&C.splice(1,0,"pointCloud"),C});function v(){o.value=!o.value,a.value=!1}r(v,"toggleUpDirection");function c(C){l.value=C,o.value=!1}r(c,"selectUpDirection");function n(){a.value=!a.value,o.value=!1}r(n,"toggleMaterialMode");function m(C){s.value=C,a.value=!1}r(m,"selectMaterialMode");function x(C){return q(`load3d.materialModes.${C}`)}r(x,"formatMaterialMode");function S(C){const B=C.target;B.closest(".show-up-direction")||(o.value=!1),B.closest(".show-material-mode")||(a.value=!1)}return r(S,"closeSceneSlider"),K(()=>{document.addEventListener("click",S)}),Y(()=>{document.removeEventListener("click",S)}),(C,B)=>{const A=W("tooltip");return t(),k("div",Pe,[d("div",Ge,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":e(q)("load3d.upDirection"),onClick:v},{default:R(()=>B[0]||(B[0]=[d("i",{class:"pi pi-arrow-up text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[A,{value:e(q)("load3d.upDirection"),showDelay:300},void 0,{right:!0}]]),D(d("div",Te,[d("div",Fe,[(t(),k(ee,null,oe(u,U=>G(I,{key:U,variant:"textonly",class:T(e(X)("text-white",l.value===U&&"bg-blue-500")),onClick:r(j=>c(U),"onClick")},{default:R(()=>[ae(J(U.toUpperCase()),1)]),_:2},1032,["class","onClick"])),64))])],512),[[H,o.value]])]),C.hideMaterialMode?M("",!0):(t(),k("div",_e,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":e(q)("load3d.materialMode"),onClick:n},{default:R(()=>B[1]||(B[1]=[d("i",{class:"pi pi-box text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[A,{value:e(q)("load3d.materialMode"),showDelay:300},void 0,{right:!0}]]),D(d("div",Ae,[d("div",je,[(t(!0),k(ee,null,oe(p.value,U=>(t(),b(I,{key:U,variant:"textonly",class:T(e(X)("whitespace-nowrap text-white",s.value===U&&"bg-blue-500")),onClick:r(j=>m(U),"onClick")},{default:R(()=>[ae(J(x(U)),1)]),_:2},1032,["class","onClick"]))),128))])],512),[[H,a.value]])]))])}}}),Ne={class:"flex flex-col"},qe={key:0},We=["value"],He={key:1},Je={key:2},Ke={key:4},Qe=E({__name:"SceneControls",props:{showGrid:{type:Boolean},showGridModifiers:{},backgroundColor:{},backgroundColorModifiers:{},backgroundImage:{},backgroundImageModifiers:{},backgroundRenderMode:{default:"tiled"},backgroundRenderModeModifiers:{},fov:{},fovModifiers:{}},emits:Q(["updateBackgroundImage"],["update:showGrid","update:backgroundColor","update:backgroundImage","update:backgroundRenderMode","update:fov"]),setup(i,{emit:s}){const l=s,o=h(i,"showGrid"),a=h(i,"backgroundColor"),u=h(i,"backgroundImage"),p=h(i,"backgroundRenderMode"),v=h(i,"fov"),c=P(()=>u.value&&u.value!==""),n=_(null),m=_(null),x=r(()=>{o.value=!o.value},"toggleGrid"),S=r(L=>{a.value=L},"updateBackgroundColor"),C=r(()=>{n.value?.click()},"openColorPicker"),B=r(()=>{m.value?.click()},"openImagePicker"),A=r(L=>{const $=L.target;$.files&&$.files[0]&&l("updateBackgroundImage",$.files[0])},"uploadBackgroundImage"),U=r(()=>{l("updateBackgroundImage",null)},"removeBackgroundImage"),j=r(()=>{p.value=p.value==="panorama"?"tiled":"panorama"},"toggleBackgroundRenderMode");return(L,$)=>{const O=W("tooltip");return t(),k("div",Ne,[D((t(),b(I,{variant:"textonly",size:"icon",class:T(e(X)("rounded-full",o.value&&"ring-2 ring-white/50")),"aria-label":L.$t("load3d.showGrid"),onClick:x},{default:R(()=>$[2]||($[2]=[d("i",{class:"pi pi-table text-lg text-white"},null,-1)])),_:1},8,["class","aria-label"])),[[O,{value:L.$t("load3d.showGrid"),showDelay:300},void 0,{right:!0}]]),c.value?M("",!0):(t(),k("div",qe,[D((t(),b(I,{variant:"textonly",size:"icon",class:"rounded-full","aria-label":L.$t("load3d.backgroundColor"),onClick:C},{default:R(()=>[$[3]||($[3]=d("i",{class:"pi pi-palette text-lg text-white"},null,-1)),d("input",{ref_key:"colorPickerRef",ref:n,type:"color",value:a.value,class:"pointer-events-none absolute m-0 h-0 w-0 p-0 opacity-0",onInput:$[0]||($[0]=N=>S(N.target.value))},null,40,We)]),_:1},8,["aria-label"])),[[O,{value:L.$t("load3d.backgroundColor"),showDelay:300},void 0,{right:!0}]])])),c.value?M("",!0):(t(),k("div",He,[D((t(),b(I,{variant:"textonly",size:"icon",class:"rounded-full","aria-label":L.$t("load3d.uploadBackgroundImage"),onClick:B},{default:R(()=>[$[4]||($[4]=d("i",{class:"pi pi-image text-lg text-white"},null,-1)),d("input",{ref_key:"imagePickerRef",ref:m,type:"file",accept:"image/*",class:"pointer-events-none absolute m-0 h-0 w-0 p-0 opacity-0",onChange:A},null,544)]),_:1},8,["aria-label"])),[[O,{value:L.$t("load3d.uploadBackgroundImage"),showDelay:300},void 0,{right:!0}]])])),c.value?(t(),k("div",Je,[D((t(),b(I,{variant:"textonly",size:"icon",class:T(e(X)("rounded-full",p.value==="panorama"&&"ring-2 ring-white/50")),"aria-label":L.$t("load3d.panoramaMode"),onClick:j},{default:R(()=>$[5]||($[5]=[d("i",{class:"pi pi-globe text-lg text-white"},null,-1)])),_:1},8,["class","aria-label"])),[[O,{value:L.$t("load3d.panoramaMode"),showDelay:300},void 0,{right:!0}]])])):M("",!0),c.value&&p.value==="panorama"?(t(),b(re,{key:3,modelValue:v.value,"onUpdate:modelValue":$[1]||($[1]=N=>v.value=N),"tooltip-text":L.$t("load3d.fov")},null,8,["modelValue","tooltip-text"])):M("",!0),c.value?(t(),k("div",Ke,[D((t(),b(I,{variant:"textonly",size:"icon",class:"rounded-full","aria-label":L.$t("load3d.removeBackgroundImage"),onClick:U},{default:R(()=>$[6]||($[6]=[d("i",{class:"pi pi-times text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[O,{value:L.$t("load3d.removeBackgroundImage"),showDelay:300},void 0,{right:!0}]])])):M("",!0)])}}}),Xe={class:"show-menu relative"},Ye={class:"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg"},Ze={class:"flex flex-col"},eo={class:"whitespace-nowrap text-white"},oo={class:"rounded-lg bg-smoke-700/30"},to=E({__name:"Load3DControls",props:Q({isSplatModel:{type:Boolean,default:!1},isPlyModel:{type:Boolean,default:!1}},{sceneConfig:{},sceneConfigModifiers:{},modelConfig:{},modelConfigModifiers:{},cameraConfig:{},cameraConfigModifiers:{},lightConfig:{},lightConfigModifiers:{}}),emits:Q(["updateBackgroundImage","exportModel"],["update:sceneConfig","update:modelConfig","update:cameraConfig","update:lightConfig"]),setup(i,{emit:s}){const l=h(i,"sceneConfig"),o=h(i,"modelConfig"),a=h(i,"cameraConfig"),u=h(i,"lightConfig"),p=_(!1),v=_("scene"),c={scene:"load3d.scene",model:"load3d.model",camera:"load3d.camera",light:"load3d.light",export:"load3d.export"},n=P(()=>i.isSplatModel?["scene","model","camera"]:["scene","model","camera","light","export"]),m=P(()=>v.value==="scene"&&!!l.value),x=P(()=>v.value==="model"&&!!o.value),S=P(()=>v.value==="camera"&&!!a.value),C=P(()=>v.value==="light"&&!!u.value&&!!o.value),B=P(()=>v.value==="export"),A=r(()=>{p.value=!p.value},"toggleMenu"),U=r(z=>{v.value=z,p.value=!1},"selectCategory"),j=r(z=>`${{scene:"pi pi-image",model:"pi pi-box",camera:"pi pi-camera",light:"pi pi-sun",export:"pi pi-download"}[z]} text-white text-lg`,"getCategoryIcon"),L=s,$=r(z=>{L("updateBackgroundImage",z)},"handleBackgroundImageUpdate"),O=r(z=>{L("exportModel",z)},"handleExportModel"),N=r(z=>{z.target.closest(".show-menu")||(p.value=!1)},"closeSlider");return K(()=>{document.addEventListener("click",N)}),Y(()=>{document.removeEventListener("click",N)}),(z,g)=>(t(),k("div",{class:"pointer-events-auto absolute top-12 left-2 z-20 flex flex-col rounded-lg bg-smoke-700/30",onPointerdown:g[11]||(g[11]=V(()=>{},["stop"])),onPointermove:g[12]||(g[12]=V(()=>{},["stop"])),onPointerup:g[13]||(g[13]=V(()=>{},["stop"])),onWheel:g[14]||(g[14]=V(()=>{},["stop"]))},[d("div",Xe,[G(I,{variant:"textonly",size:"icon","aria-label":z.$t("menu.showMenu"),class:"rounded-full",onClick:A},{default:R(()=>g[15]||(g[15]=[d("i",{class:"pi pi-bars text-lg text-white"},null,-1)])),_:1},8,["aria-label"]),D(d("div",Ye,[d("div",Ze,[(t(!0),k(ee,null,oe(n.value,y=>(t(),b(I,{key:y,variant:"textonly",class:T(e(X)("flex w-full items-center justify-start",v.value===y&&"bg-smoke-600")),onClick:r(ne=>U(y),"onClick")},{default:R(()=>[d("i",{class:T(j(y))},null,2),d("span",eo,J(z.$t(c[y])),1)]),_:2},1032,["class","onClick"]))),128))])],512),[[H,p.value]])]),D(d("div",oo,[m.value?(t(),b(Qe,{key:0,"show-grid":l.value.showGrid,"onUpdate:showGrid":g[0]||(g[0]=y=>l.value.showGrid=y),"background-color":l.value.backgroundColor,"onUpdate:backgroundColor":g[1]||(g[1]=y=>l.value.backgroundColor=y),"background-image":l.value.backgroundImage,"onUpdate:backgroundImage":g[2]||(g[2]=y=>l.value.backgroundImage=y),"background-render-mode":l.value.backgroundRenderMode,"onUpdate:backgroundRenderMode":g[3]||(g[3]=y=>l.value.backgroundRenderMode=y),fov:a.value.fov,"onUpdate:fov":g[4]||(g[4]=y=>a.value.fov=y),onUpdateBackgroundImage:$},null,8,["show-grid","background-color","background-image","background-render-mode","fov"])):M("",!0),x.value?(t(),b(Oe,{key:1,"material-mode":o.value.materialMode,"onUpdate:materialMode":g[5]||(g[5]=y=>o.value.materialMode=y),"up-direction":o.value.upDirection,"onUpdate:upDirection":g[6]||(g[6]=y=>o.value.upDirection=y),"hide-material-mode":z.isSplatModel,"is-ply-model":z.isPlyModel},null,8,["material-mode","up-direction","hide-material-mode","is-ply-model"])):M("",!0),S.value?(t(),b(De,{key:2,"camera-type":a.value.cameraType,"onUpdate:cameraType":g[7]||(g[7]=y=>a.value.cameraType=y),fov:a.value.fov,"onUpdate:fov":g[8]||(g[8]=y=>a.value.fov=y)},null,8,["camera-type","fov"])):M("",!0),C.value?(t(),b(Ee,{key:3,"light-intensity":u.value.intensity,"onUpdate:lightIntensity":g[9]||(g[9]=y=>u.value.intensity=y),"material-mode":o.value.materialMode,"onUpdate:materialMode":g[10]||(g[10]=y=>o.value.materialMode=y)},null,8,["light-intensity","material-mode"])):M("",!0),B.value?(t(),b(Be,{key:4,onExportModel:O})):M("",!0)],512),[[H,v.value]])],32))}}),lo={key:0,class:"bg-opacity-50 absolute inset-0 z-50 flex items-center justify-center bg-black"},ao={class:"flex flex-col items-center"},no={class:"mt-4 text-lg text-white"},io=E({__name:"LoadingOverlay",props:{loading:{type:Boolean},loadingMessage:{}},setup(i){return(s,l)=>(t(),b(fe,{name:"fade"},{default:R(()=>[s.loading?(t(),k("div",lo,[d("div",ao,[l[0]||(l[0]=d("div",{class:"spinner"},null,-1)),d("div",no,J(s.loadingMessage),1)])])):M("",!0)]),_:1}))}}),so=de(io,[["__scopeId","data-v-b13965f5"]]),ro={key:0,class:"pointer-events-none absolute inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm"},uo={class:"rounded-lg border-2 border-dashed border-blue-400 bg-blue-500/20 px-6 py-4 text-lg font-medium text-blue-100"},co=E({__name:"Load3DScene",props:{initializeLoad3d:{type:Function},cleanup:{type:Function},loading:{type:Boolean},loadingMessage:{},onModelDrop:{type:Function},isPreview:{type:Boolean}},setup(i){const s=i,l=_(null),{isDragging:o,dragMessage:a,handleDragOver:u,handleDragLeave:p,handleDrop:v}=ye({onModelDrop:r(async c=>{s.onModelDrop&&await s.onModelDrop(c)},"onModelDrop"),disabled:P(()=>s.isPreview)});return K(()=>{l.value&&s.initializeLoad3d(l.value)}),Y(()=>{s.cleanup()}),(c,n)=>(t(),k("div",{ref_key:"container",ref:l,class:"relative h-full w-full","data-capture-wheel":"true",onPointerdown:n[0]||(n[0]=V(()=>{},["stop"])),onPointermove:n[1]||(n[1]=V(()=>{},["stop"])),onPointerup:n[2]||(n[2]=V(()=>{},["stop"])),onMousedown:n[3]||(n[3]=V(()=>{},["stop"])),onMousemove:n[4]||(n[4]=V(()=>{},["stop"])),onMouseup:n[5]||(n[5]=V(()=>{},["stop"])),onContextmenu:n[6]||(n[6]=V(()=>{},["stop","prevent"])),onDragover:n[7]||(n[7]=V((...m)=>e(u)&&e(u)(...m),["prevent","stop"])),onDragleave:n[8]||(n[8]=V((...m)=>e(p)&&e(p)(...m),["stop"])),onDrop:n[9]||(n[9]=V((...m)=>e(v)&&e(v)(...m),["prevent","stop"]))},[G(so,{loading:c.loading,"loading-message":c.loadingMessage},null,8,["loading","loading-message"]),!c.isPreview&&e(o)?(t(),k("div",ro,[d("div",uo,J(e(a)),1)])):M("",!0)],544))}}),po={key:0,class:"pointer-events-auto absolute top-0 left-0 z-10 flex w-full items-center justify-center gap-2 pt-2"},go=E({__name:"AnimationControls",props:{animations:{},animationsModifiers:{},playing:{type:Boolean},playingModifiers:{},selectedSpeed:{},selectedSpeedModifiers:{},selectedAnimation:{},selectedAnimationModifiers:{}},emits:["update:animations","update:playing","update:selectedSpeed","update:selectedAnimation"],setup(i){const s=h(i,"animations"),l=h(i,"playing"),o=h(i,"selectedSpeed"),a=h(i,"selectedAnimation"),u=[{name:"0.1x",value:.1},{name:"0.5x",value:.5},{name:"1x",value:1},{name:"1.5x",value:1.5},{name:"2x",value:2}],p=r(()=>{l.value=!l.value},"togglePlay");return(v,c)=>s.value&&s.value.length>0?(t(),k("div",po,[G(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":v.$t("g.playPause"),onClick:p},{default:R(()=>[d("i",{class:T(["pi",l.value?"pi-pause":"pi-play","text-lg text-white"])},null,2)]),_:1},8,["aria-label"]),G(e(ie),{modelValue:o.value,"onUpdate:modelValue":c[0]||(c[0]=n=>o.value=n),options:u,"option-label":"name","option-value":"value",class:"w-24"},null,8,["modelValue"]),G(e(ie),{modelValue:a.value,"onUpdate:modelValue":c[1]||(c[1]=n=>a.value=n),options:s.value,"option-label":"name","option-value":"index",class:"w-32"},null,8,["modelValue","options"])])):M("",!0)}}),vo={class:"relative rounded-lg bg-smoke-700/30"},mo={class:"flex flex-col gap-2"},fo={key:2,class:"mt-1 text-center text-xs text-white"},yo=E({__name:"RecordingControls",props:{hasRecording:{type:Boolean},hasRecordingModifiers:{},isRecording:{type:Boolean},isRecordingModifiers:{},recordingDuration:{},recordingDurationModifiers:{}},emits:Q(["startRecording","stopRecording","exportRecording","clearRecording"],["update:hasRecording","update:isRecording","update:recordingDuration"]),setup(i,{emit:s}){const l=h(i,"hasRecording"),o=h(i,"isRecording"),a=h(i,"recordingDuration"),u=s;function p(){o.value?u("stopRecording"):u("startRecording")}r(p,"toggleRecording");function v(){u("exportRecording")}r(v,"handleExportRecording");function c(){u("clearRecording")}r(c,"handleClearRecording");function n(m){const x=Math.floor(m/60),S=Math.floor(m%60);return`${x.toString().padStart(2,"0")}:${S.toString().padStart(2,"0")}`}return r(n,"formatDuration"),(m,x)=>{const S=W("tooltip");return t(),k("div",vo,[d("div",mo,[D((t(),b(I,{size:"icon",variant:"textonly",class:T(e(X)("rounded-full",o.value&&"text-red-500 recording-button-blink")),"aria-label":o.value?m.$t("load3d.stopRecording"):m.$t("load3d.startRecording"),onClick:p},{default:R(()=>[d("i",{class:T(["pi",o.value?"pi-circle-fill":"pi-video","text-lg text-white"])},null,2)]),_:1},8,["class","aria-label"])),[[S,{value:o.value?m.$t("load3d.stopRecording"):m.$t("load3d.startRecording"),showDelay:300},void 0,{right:!0}]]),l.value&&!o.value?D((t(),b(I,{key:0,size:"icon",variant:"textonly",class:"rounded-full","aria-label":m.$t("load3d.exportRecording"),onClick:v},{default:R(()=>x[0]||(x[0]=[d("i",{class:"pi pi-download text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[S,{value:m.$t("load3d.exportRecording"),showDelay:300},void 0,{right:!0}]]):M("",!0),l.value&&!o.value?D((t(),b(I,{key:1,size:"icon",variant:"textonly",class:"rounded-full","aria-label":m.$t("load3d.clearRecording"),onClick:c},{default:R(()=>x[1]||(x[1]=[d("i",{class:"pi pi-trash text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[S,{value:m.$t("load3d.clearRecording"),showDelay:300},void 0,{right:!0}]]):M("",!0),a.value&&a.value>0&&!o.value?(t(),k("div",fo,J(n(a.value)),1)):M("",!0)])])}}}),bo=de(yo,[["__scopeId","data-v-a74d27e9"]]),ko={class:"relative rounded-lg bg-smoke-700/30"},wo={class:"flex flex-col gap-2"},xo=E({__name:"ViewerControls",props:{node:{}},setup(i){const s=r(()=>{const l={node:i.node};be().showDialog({key:"global-load3d-viewer",title:q("load3d.viewer.title"),component:ke,props:l,dialogComponentProps:{style:"width: 80vw; height: 80vh;",maximizable:!0,onClose:r(async()=>{await we().handleViewerClose(l.node)},"onClose")}})},"openIn3DViewer");return(l,o)=>{const a=W("tooltip");return t(),k("div",ko,[d("div",wo,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":e(q)("load3d.openIn3DViewer"),onClick:s},{default:R(()=>o[0]||(o[0]=[d("i",{class:"pi pi-expand text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[a,{value:e(q)("load3d.openIn3DViewer"),showDelay:300},void 0,{right:!0}]])])])}}}),ho={class:"pointer-events-none absolute top-0 left-0 size-full"},Mo={key:1,class:"pointer-events-auto absolute top-12 right-2 z-20"},Io=E({__name:"Load3D",props:{widget:{},nodeId:{}},setup(i){const s=i;function l(le){return"node"in le&&le.node!==void 0}r(l,"isComponentWidget");const o=_(null);l(s.widget)?o.value=s.widget.node:s.nodeId&&K(()=>{o.value=xe.rootGraph?.getNodeById(s.nodeId)||null});const{sceneConfig:a,modelConfig:u,cameraConfig:p,lightConfig:v,isRecording:c,isPreview:n,isSplatModel:m,isPlyModel:x,hasRecording:S,recordingDuration:C,animations:B,playing:A,selectedSpeed:U,selectedAnimation:j,loading:L,loadingMessage:$,initializeLoad3d:O,handleMouseEnter:N,handleMouseLeave:z,handleStartRecording:g,handleStopRecording:y,handleExportRecording:ne,handleClearRecording:ue,handleBackgroundImageUpdate:ce,handleExportModel:pe,handleModelDrop:ge,cleanup:ve}=he(o),te=P(()=>Z().get("Comfy.Load3D.3DViewerEnable"));return(le,f)=>(t(),k("div",{class:"relative size-full",onMouseenter:f[11]||(f[11]=(...w)=>e(N)&&e(N)(...w)),onMouseleave:f[12]||(f[12]=(...w)=>e(z)&&e(z)(...w)),onPointerdown:f[13]||(f[13]=V(()=>{},["stop"])),onPointermove:f[14]||(f[14]=V(()=>{},["stop"])),onPointerup:f[15]||(f[15]=V(()=>{},["stop"]))},[o.value?(t(),b(co,{key:0,"initialize-load3d":e(O),cleanup:e(ve),loading:e(L),"loading-message":e($),"on-model-drop":e(n)?void 0:e(ge),"is-preview":e(n)},null,8,["initialize-load3d","cleanup","loading","loading-message","on-model-drop","is-preview"])):M("",!0),d("div",ho,[G(to,{"scene-config":e(a),"onUpdate:sceneConfig":f[0]||(f[0]=w=>F(a)?a.value=w:null),"model-config":e(u),"onUpdate:modelConfig":f[1]||(f[1]=w=>F(u)?u.value=w:null),"camera-config":e(p),"onUpdate:cameraConfig":f[2]||(f[2]=w=>F(p)?p.value=w:null),"light-config":e(v),"onUpdate:lightConfig":f[3]||(f[3]=w=>F(v)?v.value=w:null),"is-splat-model":e(m),"is-ply-model":e(x),onUpdateBackgroundImage:e(ce),onExportModel:e(pe)},null,8,["scene-config","model-config","camera-config","light-config","is-splat-model","is-ply-model","onUpdateBackgroundImage","onExportModel"]),e(B)&&e(B).length>0?(t(),b(go,{key:0,animations:e(B),"onUpdate:animations":f[4]||(f[4]=w=>F(B)?B.value=w:null),playing:e(A),"onUpdate:playing":f[5]||(f[5]=w=>F(A)?A.value=w:null),"selected-speed":e(U),"onUpdate:selectedSpeed":f[6]||(f[6]=w=>F(U)?U.value=w:null),"selected-animation":e(j),"onUpdate:selectedAnimation":f[7]||(f[7]=w=>F(j)?j.value=w:null)},null,8,["animations","playing","selected-speed","selected-animation"])):M("",!0)]),te.value&&o.value?(t(),k("div",Mo,[G(xo,{node:o.value},null,8,["node"])])):M("",!0),e(n)?M("",!0):(t(),k("div",{key:2,class:T(["pointer-events-auto absolute right-2 z-20",{"top-12":!te.value,"top-24":te.value}])},[G(bo,{"is-recording":e(c),"onUpdate:isRecording":f[8]||(f[8]=w=>F(c)?c.value=w:null),"has-recording":e(S),"onUpdate:hasRecording":f[9]||(f[9]=w=>F(S)?S.value=w:null),"recording-duration":e(C),"onUpdate:recordingDuration":f[10]||(f[10]=w=>F(C)?C.value=w:null),onStartRecording:e(g),onStopRecording:e(y),onExportRecording:e(ne),onClearRecording:e(ue)},null,8,["is-recording","has-recording","recording-duration","onStartRecording","onStopRecording","onExportRecording","onClearRecording"])],2))],32))}});export{Io as _};
|
|
2
|
-
//# sourceMappingURL=Load3D.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
var me=Object.defineProperty;var r=(i,s)=>me(i,"name",{value:s,configurable:!0});import{bq as E,cF as Q,cG as h,r as _,o as K,c6 as Y,h as W,c as k,d as t,l as D,j as b,k as R,e as d,s as T,z as G,br as e,v as H,E as P,q as M,F as ee,y as oe,A as ae,u as J,I as V,T as fe,b9 as F}from"./vendor-other-BxP-0xn6.js";import{j as se,i as ie}from"./vendor-primevue-rR0TB_Js.js";import{_ as I,e as Z,t as q,c as X,d as de,cE as ye,u as be,cF as ke,cG as we,q as xe,cH as he}from"./index-BODInyrK.js";const Me={class:"relative show-slider"},Ce={class:"absolute top-0 left-12 rounded-lg bg-black/50 p-4 shadow-lg w-[150px]"},re=E({__name:"PopupSlider",props:Q({icon:{default:"pi-expand"},tooltipText:{},min:{default:10},max:{default:150},step:{default:1}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(i){const s=h(i,"modelValue"),l=_(!1),o=r(()=>{l.value=!l.value},"toggleSlider"),a=r(u=>{u.target.closest(".show-slider")||(l.value=!1)},"closeSlider");return K(()=>{document.addEventListener("click",a)}),Y(()=>{document.removeEventListener("click",a)}),(u,p)=>{const v=W("tooltip");return t(),k("div",Me,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":u.tooltipText,onClick:o},{default:R(()=>[d("i",{class:T(["pi",u.icon,"text-lg text-white"])},null,2)]),_:1},8,["aria-label"])),[[v,{value:u.tooltipText,showDelay:300},void 0,{right:!0}]]),D(d("div",Ce,[G(e(se),{modelValue:s.value,"onUpdate:modelValue":p[0]||(p[0]=c=>s.value=c),class:"w-full",min:u.min,max:u.max,step:u.step},null,8,["modelValue","min","max","step"])],512),[[H,l.value]])])}}}),$e={class:"flex flex-col"},De=E({__name:"CameraControls",props:{cameraType:{},cameraTypeModifiers:{},fov:{},fovModifiers:{}},emits:["update:cameraType","update:fov"],setup(i){const s=h(i,"cameraType"),l=h(i,"fov"),o=P(()=>s.value==="perspective"),a=r(()=>{s.value=s.value==="perspective"?"orthographic":"perspective"},"switchCamera");return(u,p)=>{const v=W("tooltip");return t(),k("div",$e,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":u.$t("load3d.switchCamera"),onClick:a},{default:R(()=>p[1]||(p[1]=[d("i",{class:T(["pi","pi-camera","text-lg text-white"])},null,-1)])),_:1},8,["aria-label"])),[[v,{value:u.$t("load3d.switchCamera"),showDelay:300},void 0,{right:!0}]]),o.value?(t(),b(re,{key:0,modelValue:l.value,"onUpdate:modelValue":p[0]||(p[0]=c=>l.value=c),"tooltip-text":u.$t("load3d.fov")},null,8,["modelValue","tooltip-text"])):M("",!0)])}}}),Re={class:"flex flex-col"},Ie={class:"show-export-formats relative"},Le={class:"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg"},Se={class:"flex flex-col"},Be=E({__name:"ExportControls",emits:["exportModel"],setup(i,{emit:s}){const l=s,o=_(!1),a=[{label:"GLB",value:"glb"},{label:"OBJ",value:"obj"},{label:"STL",value:"stl"}];function u(){o.value=!o.value}r(u,"toggleExportFormats");function p(c){l("exportModel",c),o.value=!1}r(p,"exportModel");function v(c){c.target.closest(".show-export-formats")||(o.value=!1)}return r(v,"closeExportFormatsList"),K(()=>{document.addEventListener("click",v)}),Y(()=>{document.removeEventListener("click",v)}),(c,n)=>{const m=W("tooltip");return t(),k("div",Re,[d("div",Ie,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":c.$t("load3d.exportModel"),onClick:u},{default:R(()=>n[0]||(n[0]=[d("i",{class:"pi pi-download text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[m,{value:c.$t("load3d.exportModel"),showDelay:300},void 0,{right:!0}]]),D(d("div",Le,[d("div",Se,[(t(),k(ee,null,oe(a,x=>G(I,{key:x.value,variant:"textonly",class:"text-white",onClick:r(S=>p(x.value),"onClick")},{default:R(()=>[ae(J(x.label),1)]),_:2},1032,["onClick"])),64))])],512),[[H,o.value]])])])}}}),Ue={class:"flex flex-col"},ze={key:0,class:"show-light-intensity relative"},Ve={class:"absolute top-0 left-12 rounded-lg bg-black/50 p-4 shadow-lg",style:{width:"150px"}},Ee=E({__name:"LightControls",props:{lightIntensity:{},lightIntensityModifiers:{},materialMode:{},materialModeModifiers:{}},emits:["update:lightIntensity","update:materialMode"],setup(i){const s=h(i,"lightIntensity"),l=h(i,"materialMode"),o=P(()=>l.value==="original"),a=_(!1),u=Z().get("Comfy.Load3D.LightIntensityMaximum"),p=Z().get("Comfy.Load3D.LightIntensityMinimum"),v=Z().get("Comfy.Load3D.LightAdjustmentIncrement");function c(){a.value=!a.value}r(c,"toggleLightIntensity");function n(m){m.target.closest(".show-light-intensity")||(a.value=!1)}return r(n,"closeLightSlider"),K(()=>{document.addEventListener("click",n)}),Y(()=>{document.removeEventListener("click",n)}),(m,x)=>{const S=W("tooltip");return t(),k("div",Ue,[o.value?(t(),k("div",ze,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":m.$t("load3d.lightIntensity"),onClick:c},{default:R(()=>x[1]||(x[1]=[d("i",{class:"pi pi-sun text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[S,{value:m.$t("load3d.lightIntensity"),showDelay:300},void 0,{right:!0}]]),D(d("div",Ve,[G(e(se),{modelValue:s.value,"onUpdate:modelValue":x[0]||(x[0]=C=>s.value=C),class:"w-full",min:e(p),max:e(u),step:e(v)},null,8,["modelValue","min","max","step"])],512),[[H,a.value]])])):M("",!0)])}}}),Pe={class:"flex flex-col"},Ge={class:"show-up-direction relative"},Te={class:"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg"},Fe={class:"flex flex-col"},_e={key:0,class:"show-material-mode relative"},Ae={class:"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg"},je={class:"flex flex-col"},Oe=E({__name:"ModelControls",props:Q({hideMaterialMode:{type:Boolean,default:!1},isPlyModel:{type:Boolean,default:!1}},{materialMode:{},materialModeModifiers:{},upDirection:{},upDirectionModifiers:{}}),emits:["update:materialMode","update:upDirection"],setup(i){const s=h(i,"materialMode"),l=h(i,"upDirection"),o=_(!1),a=_(!1),u=["original","-x","+x","-y","+y","-z","+z"],p=P(()=>{const C=["original","normal","wireframe"];return i.isPlyModel&&C.splice(1,0,"pointCloud"),C});function v(){o.value=!o.value,a.value=!1}r(v,"toggleUpDirection");function c(C){l.value=C,o.value=!1}r(c,"selectUpDirection");function n(){a.value=!a.value,o.value=!1}r(n,"toggleMaterialMode");function m(C){s.value=C,a.value=!1}r(m,"selectMaterialMode");function x(C){return q(`load3d.materialModes.${C}`)}r(x,"formatMaterialMode");function S(C){const B=C.target;B.closest(".show-up-direction")||(o.value=!1),B.closest(".show-material-mode")||(a.value=!1)}return r(S,"closeSceneSlider"),K(()=>{document.addEventListener("click",S)}),Y(()=>{document.removeEventListener("click",S)}),(C,B)=>{const A=W("tooltip");return t(),k("div",Pe,[d("div",Ge,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":e(q)("load3d.upDirection"),onClick:v},{default:R(()=>B[0]||(B[0]=[d("i",{class:"pi pi-arrow-up text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[A,{value:e(q)("load3d.upDirection"),showDelay:300},void 0,{right:!0}]]),D(d("div",Te,[d("div",Fe,[(t(),k(ee,null,oe(u,U=>G(I,{key:U,variant:"textonly",class:T(e(X)("text-white",l.value===U&&"bg-blue-500")),onClick:r(j=>c(U),"onClick")},{default:R(()=>[ae(J(U.toUpperCase()),1)]),_:2},1032,["class","onClick"])),64))])],512),[[H,o.value]])]),C.hideMaterialMode?M("",!0):(t(),k("div",_e,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":e(q)("load3d.materialMode"),onClick:n},{default:R(()=>B[1]||(B[1]=[d("i",{class:"pi pi-box text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[A,{value:e(q)("load3d.materialMode"),showDelay:300},void 0,{right:!0}]]),D(d("div",Ae,[d("div",je,[(t(!0),k(ee,null,oe(p.value,U=>(t(),b(I,{key:U,variant:"textonly",class:T(e(X)("whitespace-nowrap text-white",s.value===U&&"bg-blue-500")),onClick:r(j=>m(U),"onClick")},{default:R(()=>[ae(J(x(U)),1)]),_:2},1032,["class","onClick"]))),128))])],512),[[H,a.value]])]))])}}}),Ne={class:"flex flex-col"},qe={key:0},We=["value"],He={key:1},Je={key:2},Ke={key:4},Qe=E({__name:"SceneControls",props:{showGrid:{type:Boolean},showGridModifiers:{},backgroundColor:{},backgroundColorModifiers:{},backgroundImage:{},backgroundImageModifiers:{},backgroundRenderMode:{default:"tiled"},backgroundRenderModeModifiers:{},fov:{},fovModifiers:{}},emits:Q(["updateBackgroundImage"],["update:showGrid","update:backgroundColor","update:backgroundImage","update:backgroundRenderMode","update:fov"]),setup(i,{emit:s}){const l=s,o=h(i,"showGrid"),a=h(i,"backgroundColor"),u=h(i,"backgroundImage"),p=h(i,"backgroundRenderMode"),v=h(i,"fov"),c=P(()=>u.value&&u.value!==""),n=_(null),m=_(null),x=r(()=>{o.value=!o.value},"toggleGrid"),S=r(L=>{a.value=L},"updateBackgroundColor"),C=r(()=>{n.value?.click()},"openColorPicker"),B=r(()=>{m.value?.click()},"openImagePicker"),A=r(L=>{const $=L.target;$.files&&$.files[0]&&l("updateBackgroundImage",$.files[0])},"uploadBackgroundImage"),U=r(()=>{l("updateBackgroundImage",null)},"removeBackgroundImage"),j=r(()=>{p.value=p.value==="panorama"?"tiled":"panorama"},"toggleBackgroundRenderMode");return(L,$)=>{const O=W("tooltip");return t(),k("div",Ne,[D((t(),b(I,{variant:"textonly",size:"icon",class:T(e(X)("rounded-full",o.value&&"ring-2 ring-white/50")),"aria-label":L.$t("load3d.showGrid"),onClick:x},{default:R(()=>$[2]||($[2]=[d("i",{class:"pi pi-table text-lg text-white"},null,-1)])),_:1},8,["class","aria-label"])),[[O,{value:L.$t("load3d.showGrid"),showDelay:300},void 0,{right:!0}]]),c.value?M("",!0):(t(),k("div",qe,[D((t(),b(I,{variant:"textonly",size:"icon",class:"rounded-full","aria-label":L.$t("load3d.backgroundColor"),onClick:C},{default:R(()=>[$[3]||($[3]=d("i",{class:"pi pi-palette text-lg text-white"},null,-1)),d("input",{ref_key:"colorPickerRef",ref:n,type:"color",value:a.value,class:"pointer-events-none absolute m-0 h-0 w-0 p-0 opacity-0",onInput:$[0]||($[0]=N=>S(N.target.value))},null,40,We)]),_:1},8,["aria-label"])),[[O,{value:L.$t("load3d.backgroundColor"),showDelay:300},void 0,{right:!0}]])])),c.value?M("",!0):(t(),k("div",He,[D((t(),b(I,{variant:"textonly",size:"icon",class:"rounded-full","aria-label":L.$t("load3d.uploadBackgroundImage"),onClick:B},{default:R(()=>[$[4]||($[4]=d("i",{class:"pi pi-image text-lg text-white"},null,-1)),d("input",{ref_key:"imagePickerRef",ref:m,type:"file",accept:"image/*",class:"pointer-events-none absolute m-0 h-0 w-0 p-0 opacity-0",onChange:A},null,544)]),_:1},8,["aria-label"])),[[O,{value:L.$t("load3d.uploadBackgroundImage"),showDelay:300},void 0,{right:!0}]])])),c.value?(t(),k("div",Je,[D((t(),b(I,{variant:"textonly",size:"icon",class:T(e(X)("rounded-full",p.value==="panorama"&&"ring-2 ring-white/50")),"aria-label":L.$t("load3d.panoramaMode"),onClick:j},{default:R(()=>$[5]||($[5]=[d("i",{class:"pi pi-globe text-lg text-white"},null,-1)])),_:1},8,["class","aria-label"])),[[O,{value:L.$t("load3d.panoramaMode"),showDelay:300},void 0,{right:!0}]])])):M("",!0),c.value&&p.value==="panorama"?(t(),b(re,{key:3,modelValue:v.value,"onUpdate:modelValue":$[1]||($[1]=N=>v.value=N),"tooltip-text":L.$t("load3d.fov")},null,8,["modelValue","tooltip-text"])):M("",!0),c.value?(t(),k("div",Ke,[D((t(),b(I,{variant:"textonly",size:"icon",class:"rounded-full","aria-label":L.$t("load3d.removeBackgroundImage"),onClick:U},{default:R(()=>$[6]||($[6]=[d("i",{class:"pi pi-times text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[O,{value:L.$t("load3d.removeBackgroundImage"),showDelay:300},void 0,{right:!0}]])])):M("",!0)])}}}),Xe={class:"show-menu relative"},Ye={class:"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg"},Ze={class:"flex flex-col"},eo={class:"whitespace-nowrap text-white"},oo={class:"rounded-lg bg-smoke-700/30"},to=E({__name:"Load3DControls",props:Q({isSplatModel:{type:Boolean,default:!1},isPlyModel:{type:Boolean,default:!1}},{sceneConfig:{},sceneConfigModifiers:{},modelConfig:{},modelConfigModifiers:{},cameraConfig:{},cameraConfigModifiers:{},lightConfig:{},lightConfigModifiers:{}}),emits:Q(["updateBackgroundImage","exportModel"],["update:sceneConfig","update:modelConfig","update:cameraConfig","update:lightConfig"]),setup(i,{emit:s}){const l=h(i,"sceneConfig"),o=h(i,"modelConfig"),a=h(i,"cameraConfig"),u=h(i,"lightConfig"),p=_(!1),v=_("scene"),c={scene:"load3d.scene",model:"load3d.model",camera:"load3d.camera",light:"load3d.light",export:"load3d.export"},n=P(()=>i.isSplatModel?["scene","model","camera"]:["scene","model","camera","light","export"]),m=P(()=>v.value==="scene"&&!!l.value),x=P(()=>v.value==="model"&&!!o.value),S=P(()=>v.value==="camera"&&!!a.value),C=P(()=>v.value==="light"&&!!u.value&&!!o.value),B=P(()=>v.value==="export"),A=r(()=>{p.value=!p.value},"toggleMenu"),U=r(z=>{v.value=z,p.value=!1},"selectCategory"),j=r(z=>`${{scene:"pi pi-image",model:"pi pi-box",camera:"pi pi-camera",light:"pi pi-sun",export:"pi pi-download"}[z]} text-white text-lg`,"getCategoryIcon"),L=s,$=r(z=>{L("updateBackgroundImage",z)},"handleBackgroundImageUpdate"),O=r(z=>{L("exportModel",z)},"handleExportModel"),N=r(z=>{z.target.closest(".show-menu")||(p.value=!1)},"closeSlider");return K(()=>{document.addEventListener("click",N)}),Y(()=>{document.removeEventListener("click",N)}),(z,g)=>(t(),k("div",{class:"pointer-events-auto absolute top-12 left-2 z-20 flex flex-col rounded-lg bg-smoke-700/30",onPointerdown:g[11]||(g[11]=V(()=>{},["stop"])),onPointermove:g[12]||(g[12]=V(()=>{},["stop"])),onPointerup:g[13]||(g[13]=V(()=>{},["stop"])),onWheel:g[14]||(g[14]=V(()=>{},["stop"]))},[d("div",Xe,[G(I,{variant:"textonly",size:"icon","aria-label":z.$t("menu.showMenu"),class:"rounded-full",onClick:A},{default:R(()=>g[15]||(g[15]=[d("i",{class:"pi pi-bars text-lg text-white"},null,-1)])),_:1},8,["aria-label"]),D(d("div",Ye,[d("div",Ze,[(t(!0),k(ee,null,oe(n.value,y=>(t(),b(I,{key:y,variant:"textonly",class:T(e(X)("flex w-full items-center justify-start",v.value===y&&"bg-smoke-600")),onClick:r(ne=>U(y),"onClick")},{default:R(()=>[d("i",{class:T(j(y))},null,2),d("span",eo,J(z.$t(c[y])),1)]),_:2},1032,["class","onClick"]))),128))])],512),[[H,p.value]])]),D(d("div",oo,[m.value?(t(),b(Qe,{key:0,"show-grid":l.value.showGrid,"onUpdate:showGrid":g[0]||(g[0]=y=>l.value.showGrid=y),"background-color":l.value.backgroundColor,"onUpdate:backgroundColor":g[1]||(g[1]=y=>l.value.backgroundColor=y),"background-image":l.value.backgroundImage,"onUpdate:backgroundImage":g[2]||(g[2]=y=>l.value.backgroundImage=y),"background-render-mode":l.value.backgroundRenderMode,"onUpdate:backgroundRenderMode":g[3]||(g[3]=y=>l.value.backgroundRenderMode=y),fov:a.value.fov,"onUpdate:fov":g[4]||(g[4]=y=>a.value.fov=y),onUpdateBackgroundImage:$},null,8,["show-grid","background-color","background-image","background-render-mode","fov"])):M("",!0),x.value?(t(),b(Oe,{key:1,"material-mode":o.value.materialMode,"onUpdate:materialMode":g[5]||(g[5]=y=>o.value.materialMode=y),"up-direction":o.value.upDirection,"onUpdate:upDirection":g[6]||(g[6]=y=>o.value.upDirection=y),"hide-material-mode":z.isSplatModel,"is-ply-model":z.isPlyModel},null,8,["material-mode","up-direction","hide-material-mode","is-ply-model"])):M("",!0),S.value?(t(),b(De,{key:2,"camera-type":a.value.cameraType,"onUpdate:cameraType":g[7]||(g[7]=y=>a.value.cameraType=y),fov:a.value.fov,"onUpdate:fov":g[8]||(g[8]=y=>a.value.fov=y)},null,8,["camera-type","fov"])):M("",!0),C.value?(t(),b(Ee,{key:3,"light-intensity":u.value.intensity,"onUpdate:lightIntensity":g[9]||(g[9]=y=>u.value.intensity=y),"material-mode":o.value.materialMode,"onUpdate:materialMode":g[10]||(g[10]=y=>o.value.materialMode=y)},null,8,["light-intensity","material-mode"])):M("",!0),B.value?(t(),b(Be,{key:4,onExportModel:O})):M("",!0)],512),[[H,v.value]])],32))}}),lo={key:0,class:"bg-opacity-50 absolute inset-0 z-50 flex items-center justify-center bg-black"},ao={class:"flex flex-col items-center"},no={class:"mt-4 text-lg text-white"},io=E({__name:"LoadingOverlay",props:{loading:{type:Boolean},loadingMessage:{}},setup(i){return(s,l)=>(t(),b(fe,{name:"fade"},{default:R(()=>[s.loading?(t(),k("div",lo,[d("div",ao,[l[0]||(l[0]=d("div",{class:"spinner"},null,-1)),d("div",no,J(s.loadingMessage),1)])])):M("",!0)]),_:1}))}}),so=de(io,[["__scopeId","data-v-b13965f5"]]),ro={key:0,class:"pointer-events-none absolute inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm"},uo={class:"rounded-lg border-2 border-dashed border-blue-400 bg-blue-500/20 px-6 py-4 text-lg font-medium text-blue-100"},co=E({__name:"Load3DScene",props:{initializeLoad3d:{type:Function},cleanup:{type:Function},loading:{type:Boolean},loadingMessage:{},onModelDrop:{type:Function},isPreview:{type:Boolean}},setup(i){const s=i,l=_(null),{isDragging:o,dragMessage:a,handleDragOver:u,handleDragLeave:p,handleDrop:v}=ye({onModelDrop:r(async c=>{s.onModelDrop&&await s.onModelDrop(c)},"onModelDrop"),disabled:P(()=>s.isPreview)});return K(()=>{l.value&&s.initializeLoad3d(l.value)}),Y(()=>{s.cleanup()}),(c,n)=>(t(),k("div",{ref_key:"container",ref:l,class:"relative h-full w-full","data-capture-wheel":"true",onPointerdown:n[0]||(n[0]=V(()=>{},["stop"])),onPointermove:n[1]||(n[1]=V(()=>{},["stop"])),onPointerup:n[2]||(n[2]=V(()=>{},["stop"])),onMousedown:n[3]||(n[3]=V(()=>{},["stop"])),onMousemove:n[4]||(n[4]=V(()=>{},["stop"])),onMouseup:n[5]||(n[5]=V(()=>{},["stop"])),onContextmenu:n[6]||(n[6]=V(()=>{},["stop","prevent"])),onDragover:n[7]||(n[7]=V((...m)=>e(u)&&e(u)(...m),["prevent","stop"])),onDragleave:n[8]||(n[8]=V((...m)=>e(p)&&e(p)(...m),["stop"])),onDrop:n[9]||(n[9]=V((...m)=>e(v)&&e(v)(...m),["prevent","stop"]))},[G(so,{loading:c.loading,"loading-message":c.loadingMessage},null,8,["loading","loading-message"]),!c.isPreview&&e(o)?(t(),k("div",ro,[d("div",uo,J(e(a)),1)])):M("",!0)],544))}}),po={key:0,class:"pointer-events-auto absolute top-0 left-0 z-10 flex w-full items-center justify-center gap-2 pt-2"},go=E({__name:"AnimationControls",props:{animations:{},animationsModifiers:{},playing:{type:Boolean},playingModifiers:{},selectedSpeed:{},selectedSpeedModifiers:{},selectedAnimation:{},selectedAnimationModifiers:{}},emits:["update:animations","update:playing","update:selectedSpeed","update:selectedAnimation"],setup(i){const s=h(i,"animations"),l=h(i,"playing"),o=h(i,"selectedSpeed"),a=h(i,"selectedAnimation"),u=[{name:"0.1x",value:.1},{name:"0.5x",value:.5},{name:"1x",value:1},{name:"1.5x",value:1.5},{name:"2x",value:2}],p=r(()=>{l.value=!l.value},"togglePlay");return(v,c)=>s.value&&s.value.length>0?(t(),k("div",po,[G(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":v.$t("g.playPause"),onClick:p},{default:R(()=>[d("i",{class:T(["pi",l.value?"pi-pause":"pi-play","text-lg text-white"])},null,2)]),_:1},8,["aria-label"]),G(e(ie),{modelValue:o.value,"onUpdate:modelValue":c[0]||(c[0]=n=>o.value=n),options:u,"option-label":"name","option-value":"value",class:"w-24"},null,8,["modelValue"]),G(e(ie),{modelValue:a.value,"onUpdate:modelValue":c[1]||(c[1]=n=>a.value=n),options:s.value,"option-label":"name","option-value":"index",class:"w-32"},null,8,["modelValue","options"])])):M("",!0)}}),vo={class:"relative rounded-lg bg-smoke-700/30"},mo={class:"flex flex-col gap-2"},fo={key:2,class:"mt-1 text-center text-xs text-white"},yo=E({__name:"RecordingControls",props:{hasRecording:{type:Boolean},hasRecordingModifiers:{},isRecording:{type:Boolean},isRecordingModifiers:{},recordingDuration:{},recordingDurationModifiers:{}},emits:Q(["startRecording","stopRecording","exportRecording","clearRecording"],["update:hasRecording","update:isRecording","update:recordingDuration"]),setup(i,{emit:s}){const l=h(i,"hasRecording"),o=h(i,"isRecording"),a=h(i,"recordingDuration"),u=s;function p(){o.value?u("stopRecording"):u("startRecording")}r(p,"toggleRecording");function v(){u("exportRecording")}r(v,"handleExportRecording");function c(){u("clearRecording")}r(c,"handleClearRecording");function n(m){const x=Math.floor(m/60),S=Math.floor(m%60);return`${x.toString().padStart(2,"0")}:${S.toString().padStart(2,"0")}`}return r(n,"formatDuration"),(m,x)=>{const S=W("tooltip");return t(),k("div",vo,[d("div",mo,[D((t(),b(I,{size:"icon",variant:"textonly",class:T(e(X)("rounded-full",o.value&&"text-red-500 recording-button-blink")),"aria-label":o.value?m.$t("load3d.stopRecording"):m.$t("load3d.startRecording"),onClick:p},{default:R(()=>[d("i",{class:T(["pi",o.value?"pi-circle-fill":"pi-video","text-lg text-white"])},null,2)]),_:1},8,["class","aria-label"])),[[S,{value:o.value?m.$t("load3d.stopRecording"):m.$t("load3d.startRecording"),showDelay:300},void 0,{right:!0}]]),l.value&&!o.value?D((t(),b(I,{key:0,size:"icon",variant:"textonly",class:"rounded-full","aria-label":m.$t("load3d.exportRecording"),onClick:v},{default:R(()=>x[0]||(x[0]=[d("i",{class:"pi pi-download text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[S,{value:m.$t("load3d.exportRecording"),showDelay:300},void 0,{right:!0}]]):M("",!0),l.value&&!o.value?D((t(),b(I,{key:1,size:"icon",variant:"textonly",class:"rounded-full","aria-label":m.$t("load3d.clearRecording"),onClick:c},{default:R(()=>x[1]||(x[1]=[d("i",{class:"pi pi-trash text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[S,{value:m.$t("load3d.clearRecording"),showDelay:300},void 0,{right:!0}]]):M("",!0),a.value&&a.value>0&&!o.value?(t(),k("div",fo,J(n(a.value)),1)):M("",!0)])])}}}),bo=de(yo,[["__scopeId","data-v-a74d27e9"]]),ko={class:"relative rounded-lg bg-smoke-700/30"},wo={class:"flex flex-col gap-2"},xo=E({__name:"ViewerControls",props:{node:{}},setup(i){const s=r(()=>{const l={node:i.node};be().showDialog({key:"global-load3d-viewer",title:q("load3d.viewer.title"),component:ke,props:l,dialogComponentProps:{style:"width: 80vw; height: 80vh;",maximizable:!0,onClose:r(async()=>{await we().handleViewerClose(l.node)},"onClose")}})},"openIn3DViewer");return(l,o)=>{const a=W("tooltip");return t(),k("div",ko,[d("div",wo,[D((t(),b(I,{size:"icon",variant:"textonly",class:"rounded-full","aria-label":e(q)("load3d.openIn3DViewer"),onClick:s},{default:R(()=>o[0]||(o[0]=[d("i",{class:"pi pi-expand text-lg text-white"},null,-1)])),_:1},8,["aria-label"])),[[a,{value:e(q)("load3d.openIn3DViewer"),showDelay:300},void 0,{right:!0}]])])])}}}),ho={class:"pointer-events-none absolute top-0 left-0 size-full"},Mo={key:1,class:"pointer-events-auto absolute top-12 right-2 z-20"},Io=E({__name:"Load3D",props:{widget:{},nodeId:{}},setup(i){const s=i;function l(le){return"node"in le&&le.node!==void 0}r(l,"isComponentWidget");const o=_(null);l(s.widget)?o.value=s.widget.node:s.nodeId&&K(()=>{o.value=xe.rootGraph?.getNodeById(s.nodeId)||null});const{sceneConfig:a,modelConfig:u,cameraConfig:p,lightConfig:v,isRecording:c,isPreview:n,isSplatModel:m,isPlyModel:x,hasRecording:S,recordingDuration:C,animations:B,playing:A,selectedSpeed:U,selectedAnimation:j,loading:L,loadingMessage:$,initializeLoad3d:O,handleMouseEnter:N,handleMouseLeave:z,handleStartRecording:g,handleStopRecording:y,handleExportRecording:ne,handleClearRecording:ue,handleBackgroundImageUpdate:ce,handleExportModel:pe,handleModelDrop:ge,cleanup:ve}=he(o),te=P(()=>Z().get("Comfy.Load3D.3DViewerEnable"));return(le,f)=>(t(),k("div",{class:"relative size-full",onMouseenter:f[11]||(f[11]=(...w)=>e(N)&&e(N)(...w)),onMouseleave:f[12]||(f[12]=(...w)=>e(z)&&e(z)(...w)),onPointerdown:f[13]||(f[13]=V(()=>{},["stop"])),onPointermove:f[14]||(f[14]=V(()=>{},["stop"])),onPointerup:f[15]||(f[15]=V(()=>{},["stop"]))},[o.value?(t(),b(co,{key:0,"initialize-load3d":e(O),cleanup:e(ve),loading:e(L),"loading-message":e($),"on-model-drop":e(n)?void 0:e(ge),"is-preview":e(n)},null,8,["initialize-load3d","cleanup","loading","loading-message","on-model-drop","is-preview"])):M("",!0),d("div",ho,[G(to,{"scene-config":e(a),"onUpdate:sceneConfig":f[0]||(f[0]=w=>F(a)?a.value=w:null),"model-config":e(u),"onUpdate:modelConfig":f[1]||(f[1]=w=>F(u)?u.value=w:null),"camera-config":e(p),"onUpdate:cameraConfig":f[2]||(f[2]=w=>F(p)?p.value=w:null),"light-config":e(v),"onUpdate:lightConfig":f[3]||(f[3]=w=>F(v)?v.value=w:null),"is-splat-model":e(m),"is-ply-model":e(x),onUpdateBackgroundImage:e(ce),onExportModel:e(pe)},null,8,["scene-config","model-config","camera-config","light-config","is-splat-model","is-ply-model","onUpdateBackgroundImage","onExportModel"]),e(B)&&e(B).length>0?(t(),b(go,{key:0,animations:e(B),"onUpdate:animations":f[4]||(f[4]=w=>F(B)?B.value=w:null),playing:e(A),"onUpdate:playing":f[5]||(f[5]=w=>F(A)?A.value=w:null),"selected-speed":e(U),"onUpdate:selectedSpeed":f[6]||(f[6]=w=>F(U)?U.value=w:null),"selected-animation":e(j),"onUpdate:selectedAnimation":f[7]||(f[7]=w=>F(j)?j.value=w:null)},null,8,["animations","playing","selected-speed","selected-animation"])):M("",!0)]),te.value&&o.value?(t(),k("div",Mo,[G(xo,{node:o.value},null,8,["node"])])):M("",!0),e(n)?M("",!0):(t(),k("div",{key:2,class:T(["pointer-events-auto absolute right-2 z-20",{"top-12":!te.value,"top-24":te.value}])},[G(bo,{"is-recording":e(c),"onUpdate:isRecording":f[8]||(f[8]=w=>F(c)?c.value=w:null),"has-recording":e(S),"onUpdate:hasRecording":f[9]||(f[9]=w=>F(S)?S.value=w:null),"recording-duration":e(C),"onUpdate:recordingDuration":f[10]||(f[10]=w=>F(C)?C.value=w:null),onStartRecording:e(g),onStopRecording:e(y),onExportRecording:e(ne),onClearRecording:e(ue)},null,8,["is-recording","has-recording","recording-duration","onStartRecording","onStopRecording","onExportRecording","onClearRecording"])],2))],32))}});export{Io as _};
|
|
2
|
+
//# sourceMappingURL=Load3D.vue_vue_type_script_setup_true_lang-_XswHXHt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Load3D.vue_vue_type_script_setup_true_lang-BJ0IqFdp.js","sources":["../../src/components/load3d/controls/PopupSlider.vue","../../src/components/load3d/controls/CameraControls.vue","../../src/components/load3d/controls/ExportControls.vue","../../src/components/load3d/controls/LightControls.vue","../../src/components/load3d/controls/ModelControls.vue","../../src/components/load3d/controls/SceneControls.vue","../../src/components/load3d/Load3DControls.vue","../../src/components/load3d/Load3DScene.vue","../../src/components/load3d/controls/AnimationControls.vue","../../src/components/load3d/controls/RecordingControls.vue","../../src/components/load3d/controls/ViewerControls.vue","../../src/components/load3d/Load3D.vue"],"sourcesContent":["<template>\n <div class=\"relative show-slider\">\n <Button\n v-tooltip.right=\"{ value: tooltipText, showDelay: 300 }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"tooltipText\"\n @click=\"toggleSlider\"\n >\n <i :class=\"['pi', icon, 'text-lg text-white']\" />\n </Button>\n <div\n v-show=\"showSlider\"\n class=\"absolute top-0 left-12 rounded-lg bg-black/50 p-4 shadow-lg w-[150px]\"\n >\n <Slider\n v-model=\"value\"\n class=\"w-full\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Slider from 'primevue/slider'\nimport { onMounted, onUnmounted, ref } from 'vue'\n\nimport Button from '@/components/ui/button/Button.vue'\n\nconst {\n icon = 'pi-expand',\n min = 10,\n max = 150,\n step = 1\n} = defineProps<{\n icon?: string\n tooltipText: string\n min?: number\n max?: number\n step?: number\n}>()\n\nconst value = defineModel<number>()\nconst showSlider = ref(false)\n\nconst toggleSlider = () => {\n showSlider.value = !showSlider.value\n}\n\nconst closeSlider = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n\n if (!target.closest('.show-slider')) {\n showSlider.value = false\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', closeSlider)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', closeSlider)\n})\n</script>\n","<template>\n <div class=\"flex flex-col\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.switchCamera'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.switchCamera')\"\n @click=\"switchCamera\"\n >\n <i :class=\"['pi', 'pi-camera', 'text-lg text-white']\" />\n </Button>\n <PopupSlider\n v-if=\"showFOVButton\"\n v-model=\"fov\"\n :tooltip-text=\"$t('load3d.fov')\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport PopupSlider from '@/components/load3d/controls/PopupSlider.vue'\nimport Button from '@/components/ui/button/Button.vue'\nimport type { CameraType } from '@/extensions/core/load3d/interfaces'\n\nconst cameraType = defineModel<CameraType>('cameraType')\nconst fov = defineModel<number>('fov')\nconst showFOVButton = computed(() => cameraType.value === 'perspective')\n\nconst switchCamera = () => {\n cameraType.value =\n cameraType.value === 'perspective' ? 'orthographic' : 'perspective'\n}\n</script>\n","<template>\n <div class=\"flex flex-col\">\n <div class=\"show-export-formats relative\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.exportModel'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.exportModel')\"\n @click=\"toggleExportFormats\"\n >\n <i class=\"pi pi-download text-lg text-white\" />\n </Button>\n <div\n v-show=\"showExportFormats\"\n class=\"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg\"\n >\n <div class=\"flex flex-col\">\n <Button\n v-for=\"format in exportFormats\"\n :key=\"format.value\"\n variant=\"textonly\"\n class=\"text-white\"\n @click=\"exportModel(format.value)\"\n >\n {{ format.label }}\n </Button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, onUnmounted, ref } from 'vue'\n\nimport Button from '@/components/ui/button/Button.vue'\n\nconst emit = defineEmits<{\n (e: 'exportModel', format: string): void\n}>()\n\nconst showExportFormats = ref(false)\n\nconst exportFormats = [\n { label: 'GLB', value: 'glb' },\n { label: 'OBJ', value: 'obj' },\n { label: 'STL', value: 'stl' }\n]\n\nfunction toggleExportFormats() {\n showExportFormats.value = !showExportFormats.value\n}\n\nfunction exportModel(format: string) {\n emit('exportModel', format)\n\n showExportFormats.value = false\n}\n\nfunction closeExportFormatsList(e: MouseEvent) {\n const target = e.target as HTMLElement\n\n if (!target.closest('.show-export-formats')) {\n showExportFormats.value = false\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', closeExportFormatsList)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', closeExportFormatsList)\n})\n</script>\n","<template>\n <div class=\"flex flex-col\">\n <div v-if=\"showLightIntensityButton\" class=\"show-light-intensity relative\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.lightIntensity'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.lightIntensity')\"\n @click=\"toggleLightIntensity\"\n >\n <i class=\"pi pi-sun text-lg text-white\" />\n </Button>\n <div\n v-show=\"showLightIntensity\"\n class=\"absolute top-0 left-12 rounded-lg bg-black/50 p-4 shadow-lg\"\n style=\"width: 150px\"\n >\n <Slider\n v-model=\"lightIntensity\"\n class=\"w-full\"\n :min=\"lightIntensityMinimum\"\n :max=\"lightIntensityMaximum\"\n :step=\"lightAdjustmentIncrement\"\n />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Slider from 'primevue/slider'\nimport { computed, onMounted, onUnmounted, ref } from 'vue'\n\nimport Button from '@/components/ui/button/Button.vue'\nimport type { MaterialMode } from '@/extensions/core/load3d/interfaces'\nimport { useSettingStore } from '@/platform/settings/settingStore'\n\nconst lightIntensity = defineModel<number>('lightIntensity')\nconst materialMode = defineModel<MaterialMode>('materialMode')\n\nconst showLightIntensityButton = computed(\n () => materialMode.value === 'original'\n)\nconst showLightIntensity = ref(false)\n\nconst lightIntensityMaximum = useSettingStore().get(\n 'Comfy.Load3D.LightIntensityMaximum'\n)\nconst lightIntensityMinimum = useSettingStore().get(\n 'Comfy.Load3D.LightIntensityMinimum'\n)\nconst lightAdjustmentIncrement = useSettingStore().get(\n 'Comfy.Load3D.LightAdjustmentIncrement'\n)\n\nfunction toggleLightIntensity() {\n showLightIntensity.value = !showLightIntensity.value\n}\n\nfunction closeLightSlider(e: MouseEvent) {\n const target = e.target as HTMLElement\n\n if (!target.closest('.show-light-intensity')) {\n showLightIntensity.value = false\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', closeLightSlider)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', closeLightSlider)\n})\n</script>\n","<template>\n <div class=\"flex flex-col\">\n <div class=\"show-up-direction relative\">\n <Button\n v-tooltip.right=\"{\n value: t('load3d.upDirection'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"t('load3d.upDirection')\"\n @click=\"toggleUpDirection\"\n >\n <i class=\"pi pi-arrow-up text-lg text-white\" />\n </Button>\n <div\n v-show=\"showUpDirection\"\n class=\"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg\"\n >\n <div class=\"flex flex-col\">\n <Button\n v-for=\"direction in upDirections\"\n :key=\"direction\"\n variant=\"textonly\"\n :class=\"\n cn('text-white', upDirection === direction && 'bg-blue-500')\n \"\n @click=\"selectUpDirection(direction)\"\n >\n {{ direction.toUpperCase() }}\n </Button>\n </div>\n </div>\n </div>\n\n <div v-if=\"!hideMaterialMode\" class=\"show-material-mode relative\">\n <Button\n v-tooltip.right=\"{\n value: t('load3d.materialMode'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"t('load3d.materialMode')\"\n @click=\"toggleMaterialMode\"\n >\n <i class=\"pi pi-box text-lg text-white\" />\n </Button>\n <div\n v-show=\"showMaterialMode\"\n class=\"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg\"\n >\n <div class=\"flex flex-col\">\n <Button\n v-for=\"mode in materialModes\"\n :key=\"mode\"\n variant=\"textonly\"\n :class=\"\n cn(\n 'whitespace-nowrap text-white',\n materialMode === mode && 'bg-blue-500'\n )\n \"\n @click=\"selectMaterialMode(mode)\"\n >\n {{ formatMaterialMode(mode) }}\n </Button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted, ref } from 'vue'\n\nimport Button from '@/components/ui/button/Button.vue'\nimport type {\n MaterialMode,\n UpDirection\n} from '@/extensions/core/load3d/interfaces'\nimport { t } from '@/i18n'\nimport { cn } from '@/utils/tailwindUtil'\n\nconst { hideMaterialMode = false, isPlyModel = false } = defineProps<{\n hideMaterialMode?: boolean\n isPlyModel?: boolean\n}>()\n\nconst materialMode = defineModel<MaterialMode>('materialMode')\nconst upDirection = defineModel<UpDirection>('upDirection')\n\nconst showUpDirection = ref(false)\nconst showMaterialMode = ref(false)\n\nconst upDirections: UpDirection[] = [\n 'original',\n '-x',\n '+x',\n '-y',\n '+y',\n '-z',\n '+z'\n]\n\nconst materialModes = computed(() => {\n const modes: MaterialMode[] = [\n 'original',\n 'normal',\n 'wireframe'\n //'depth' disable for now\n ]\n\n // Only show pointCloud mode for PLY files (point cloud rendering)\n if (isPlyModel) {\n modes.splice(1, 0, 'pointCloud')\n }\n\n return modes\n})\n\nfunction toggleUpDirection() {\n showUpDirection.value = !showUpDirection.value\n showMaterialMode.value = false\n}\n\nfunction selectUpDirection(direction: UpDirection) {\n upDirection.value = direction\n showUpDirection.value = false\n}\n\nfunction toggleMaterialMode() {\n showMaterialMode.value = !showMaterialMode.value\n showUpDirection.value = false\n}\n\nfunction selectMaterialMode(mode: MaterialMode) {\n materialMode.value = mode\n showMaterialMode.value = false\n}\n\nfunction formatMaterialMode(mode: MaterialMode) {\n return t(`load3d.materialModes.${mode}`)\n}\n\nfunction closeSceneSlider(e: MouseEvent) {\n const target = e.target as HTMLElement\n\n if (!target.closest('.show-up-direction')) {\n showUpDirection.value = false\n }\n\n if (!target.closest('.show-material-mode')) {\n showMaterialMode.value = false\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', closeSceneSlider)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', closeSceneSlider)\n})\n</script>\n","<template>\n <div class=\"flex flex-col\">\n <Button\n v-tooltip.right=\"{ value: $t('load3d.showGrid'), showDelay: 300 }\"\n variant=\"textonly\"\n size=\"icon\"\n :class=\"cn('rounded-full', showGrid && 'ring-2 ring-white/50')\"\n :aria-label=\"$t('load3d.showGrid')\"\n @click=\"toggleGrid\"\n >\n <i class=\"pi pi-table text-lg text-white\" />\n </Button>\n\n <div v-if=\"!hasBackgroundImage\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.backgroundColor'),\n showDelay: 300\n }\"\n variant=\"textonly\"\n size=\"icon\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.backgroundColor')\"\n @click=\"openColorPicker\"\n >\n <i class=\"pi pi-palette text-lg text-white\" />\n <input\n ref=\"colorPickerRef\"\n type=\"color\"\n :value=\"backgroundColor\"\n class=\"pointer-events-none absolute m-0 h-0 w-0 p-0 opacity-0\"\n @input=\"\n updateBackgroundColor(($event.target as HTMLInputElement).value)\n \"\n />\n </Button>\n </div>\n\n <div v-if=\"!hasBackgroundImage\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.uploadBackgroundImage'),\n showDelay: 300\n }\"\n variant=\"textonly\"\n size=\"icon\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.uploadBackgroundImage')\"\n @click=\"openImagePicker\"\n >\n <i class=\"pi pi-image text-lg text-white\" />\n <input\n ref=\"imagePickerRef\"\n type=\"file\"\n accept=\"image/*\"\n class=\"pointer-events-none absolute m-0 h-0 w-0 p-0 opacity-0\"\n @change=\"uploadBackgroundImage\"\n />\n </Button>\n </div>\n\n <div v-if=\"hasBackgroundImage\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.panoramaMode'),\n showDelay: 300\n }\"\n variant=\"textonly\"\n size=\"icon\"\n :class=\"\n cn(\n 'rounded-full',\n backgroundRenderMode === 'panorama' && 'ring-2 ring-white/50'\n )\n \"\n :aria-label=\"$t('load3d.panoramaMode')\"\n @click=\"toggleBackgroundRenderMode\"\n >\n <i class=\"pi pi-globe text-lg text-white\" />\n </Button>\n </div>\n\n <PopupSlider\n v-if=\"hasBackgroundImage && backgroundRenderMode === 'panorama'\"\n v-model=\"fov\"\n :tooltip-text=\"$t('load3d.fov')\"\n />\n\n <div v-if=\"hasBackgroundImage\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.removeBackgroundImage'),\n showDelay: 300\n }\"\n variant=\"textonly\"\n size=\"icon\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.removeBackgroundImage')\"\n @click=\"removeBackgroundImage\"\n >\n <i class=\"pi pi-times text-lg text-white\" />\n </Button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\n\nimport PopupSlider from '@/components/load3d/controls/PopupSlider.vue'\nimport Button from '@/components/ui/button/Button.vue'\nimport type { BackgroundRenderModeType } from '@/extensions/core/load3d/interfaces'\nimport { cn } from '@/utils/tailwindUtil'\n\nconst emit = defineEmits<{\n (e: 'updateBackgroundImage', file: File | null): void\n}>()\n\nconst showGrid = defineModel<boolean>('showGrid')\nconst backgroundColor = defineModel<string>('backgroundColor')\nconst backgroundImage = defineModel<string>('backgroundImage')\nconst backgroundRenderMode = defineModel<BackgroundRenderModeType>(\n 'backgroundRenderMode',\n { default: 'tiled' }\n)\nconst fov = defineModel<number>('fov')\nconst hasBackgroundImage = computed(\n () => backgroundImage.value && backgroundImage.value !== ''\n)\n\nconst colorPickerRef = ref<HTMLInputElement | null>(null)\nconst imagePickerRef = ref<HTMLInputElement | null>(null)\n\nconst toggleGrid = () => {\n showGrid.value = !showGrid.value\n}\n\nconst updateBackgroundColor = (color: string) => {\n backgroundColor.value = color\n}\n\nconst openColorPicker = () => {\n colorPickerRef.value?.click()\n}\n\nconst openImagePicker = () => {\n imagePickerRef.value?.click()\n}\n\nconst uploadBackgroundImage = (event: Event) => {\n const input = event.target as HTMLInputElement\n\n if (input.files && input.files[0]) {\n emit('updateBackgroundImage', input.files[0])\n }\n}\n\nconst removeBackgroundImage = () => {\n emit('updateBackgroundImage', null)\n}\n\nconst toggleBackgroundRenderMode = () => {\n backgroundRenderMode.value =\n backgroundRenderMode.value === 'panorama' ? 'tiled' : 'panorama'\n}\n</script>\n","<template>\n <div\n class=\"pointer-events-auto absolute top-12 left-2 z-20 flex flex-col rounded-lg bg-smoke-700/30\"\n @pointerdown.stop\n @pointermove.stop\n @pointerup.stop\n @wheel.stop\n >\n <div class=\"show-menu relative\">\n <Button\n variant=\"textonly\"\n size=\"icon\"\n :aria-label=\"$t('menu.showMenu')\"\n class=\"rounded-full\"\n @click=\"toggleMenu\"\n >\n <i class=\"pi pi-bars text-lg text-white\" />\n </Button>\n\n <div\n v-show=\"isMenuOpen\"\n class=\"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg\"\n >\n <div class=\"flex flex-col\">\n <Button\n v-for=\"category in availableCategories\"\n :key=\"category\"\n variant=\"textonly\"\n :class=\"\n cn(\n 'flex w-full items-center justify-start',\n activeCategory === category && 'bg-smoke-600'\n )\n \"\n @click=\"selectCategory(category)\"\n >\n <i :class=\"getCategoryIcon(category)\" />\n <span class=\"whitespace-nowrap text-white\">{{\n $t(categoryLabels[category])\n }}</span>\n </Button>\n </div>\n </div>\n </div>\n\n <div v-show=\"activeCategory\" class=\"rounded-lg bg-smoke-700/30\">\n <SceneControls\n v-if=\"showSceneControls\"\n v-model:show-grid=\"sceneConfig!.showGrid\"\n v-model:background-color=\"sceneConfig!.backgroundColor\"\n v-model:background-image=\"sceneConfig!.backgroundImage\"\n v-model:background-render-mode=\"sceneConfig!.backgroundRenderMode\"\n v-model:fov=\"cameraConfig!.fov\"\n @update-background-image=\"handleBackgroundImageUpdate\"\n />\n\n <ModelControls\n v-if=\"showModelControls\"\n v-model:material-mode=\"modelConfig!.materialMode\"\n v-model:up-direction=\"modelConfig!.upDirection\"\n :hide-material-mode=\"isSplatModel\"\n :is-ply-model=\"isPlyModel\"\n />\n\n <CameraControls\n v-if=\"showCameraControls\"\n v-model:camera-type=\"cameraConfig!.cameraType\"\n v-model:fov=\"cameraConfig!.fov\"\n />\n\n <LightControls\n v-if=\"showLightControls\"\n v-model:light-intensity=\"lightConfig!.intensity\"\n v-model:material-mode=\"modelConfig!.materialMode\"\n />\n\n <ExportControls\n v-if=\"showExportControls\"\n @export-model=\"handleExportModel\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted, ref } from 'vue'\n\nimport CameraControls from '@/components/load3d/controls/CameraControls.vue'\nimport ExportControls from '@/components/load3d/controls/ExportControls.vue'\nimport LightControls from '@/components/load3d/controls/LightControls.vue'\nimport ModelControls from '@/components/load3d/controls/ModelControls.vue'\nimport SceneControls from '@/components/load3d/controls/SceneControls.vue'\nimport Button from '@/components/ui/button/Button.vue'\nimport type {\n CameraConfig,\n LightConfig,\n ModelConfig,\n SceneConfig\n} from '@/extensions/core/load3d/interfaces'\nimport { cn } from '@/utils/tailwindUtil'\n\nconst { isSplatModel = false, isPlyModel = false } = defineProps<{\n isSplatModel?: boolean\n isPlyModel?: boolean\n}>()\n\nconst sceneConfig = defineModel<SceneConfig>('sceneConfig')\nconst modelConfig = defineModel<ModelConfig>('modelConfig')\nconst cameraConfig = defineModel<CameraConfig>('cameraConfig')\nconst lightConfig = defineModel<LightConfig>('lightConfig')\n\nconst isMenuOpen = ref(false)\nconst activeCategory = ref<string>('scene')\nconst categoryLabels: Record<string, string> = {\n scene: 'load3d.scene',\n model: 'load3d.model',\n camera: 'load3d.camera',\n light: 'load3d.light',\n export: 'load3d.export'\n}\n\nconst availableCategories = computed(() => {\n if (isSplatModel) {\n return ['scene', 'model', 'camera']\n }\n\n return ['scene', 'model', 'camera', 'light', 'export']\n})\n\nconst showSceneControls = computed(\n () => activeCategory.value === 'scene' && !!sceneConfig.value\n)\nconst showModelControls = computed(\n () => activeCategory.value === 'model' && !!modelConfig.value\n)\nconst showCameraControls = computed(\n () => activeCategory.value === 'camera' && !!cameraConfig.value\n)\nconst showLightControls = computed(\n () =>\n activeCategory.value === 'light' &&\n !!lightConfig.value &&\n !!modelConfig.value\n)\nconst showExportControls = computed(() => activeCategory.value === 'export')\n\nconst toggleMenu = () => {\n isMenuOpen.value = !isMenuOpen.value\n}\n\nconst selectCategory = (category: string) => {\n activeCategory.value = category\n isMenuOpen.value = false\n}\n\nconst getCategoryIcon = (category: string) => {\n const icons = {\n scene: 'pi pi-image',\n model: 'pi pi-box',\n camera: 'pi pi-camera',\n light: 'pi pi-sun',\n export: 'pi pi-download'\n }\n // @ts-expect-error fixme ts strict error\n return `${icons[category]} text-white text-lg`\n}\n\nconst emit = defineEmits<{\n (e: 'updateBackgroundImage', file: File | null): void\n (e: 'exportModel', format: string): void\n}>()\n\nconst handleBackgroundImageUpdate = (file: File | null) => {\n emit('updateBackgroundImage', file)\n}\n\nconst handleExportModel = (format: string) => {\n emit('exportModel', format)\n}\n\nconst closeSlider = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n\n if (!target.closest('.show-menu')) {\n isMenuOpen.value = false\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', closeSlider)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', closeSlider)\n})\n</script>\n","<template>\n <div\n ref=\"container\"\n class=\"relative h-full w-full\"\n data-capture-wheel=\"true\"\n @pointerdown.stop\n @pointermove.stop\n @pointerup.stop\n @mousedown.stop\n @mousemove.stop\n @mouseup.stop\n @contextmenu.stop.prevent\n @dragover.prevent.stop=\"handleDragOver\"\n @dragleave.stop=\"handleDragLeave\"\n @drop.prevent.stop=\"handleDrop\"\n >\n <LoadingOverlay :loading=\"loading\" :loading-message=\"loadingMessage\" />\n <div\n v-if=\"!isPreview && isDragging\"\n class=\"pointer-events-none absolute inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm\"\n >\n <div\n class=\"rounded-lg border-2 border-dashed border-blue-400 bg-blue-500/20 px-6 py-4 text-lg font-medium text-blue-100\"\n >\n {{ dragMessage }}\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted, ref } from 'vue'\n\nimport LoadingOverlay from '@/components/load3d/LoadingOverlay.vue'\nimport { useLoad3dDrag } from '@/composables/useLoad3dDrag'\n\nconst props = defineProps<{\n initializeLoad3d: (containerRef: HTMLElement) => Promise<void>\n cleanup: () => void\n loading: boolean\n loadingMessage: string\n onModelDrop?: (file: File) => void | Promise<void>\n isPreview: boolean\n}>()\n\nconst container = ref<HTMLElement | null>(null)\n\nconst { isDragging, dragMessage, handleDragOver, handleDragLeave, handleDrop } =\n useLoad3dDrag({\n onModelDrop: async (file) => {\n if (props.onModelDrop) {\n await props.onModelDrop(file)\n }\n },\n disabled: computed(() => props.isPreview)\n })\n\nonMounted(() => {\n if (container.value) {\n void props.initializeLoad3d(container.value)\n }\n})\n\nonUnmounted(() => {\n props.cleanup()\n})\n</script>\n","<template>\n <div\n v-if=\"animations && animations.length > 0\"\n class=\"pointer-events-auto absolute top-0 left-0 z-10 flex w-full items-center justify-center gap-2 pt-2\"\n >\n <Button\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"$t('g.playPause')\"\n @click=\"togglePlay\"\n >\n <i\n :class=\"['pi', playing ? 'pi-pause' : 'pi-play', 'text-lg text-white']\"\n />\n </Button>\n\n <Select\n v-model=\"selectedSpeed\"\n :options=\"speedOptions\"\n option-label=\"name\"\n option-value=\"value\"\n class=\"w-24\"\n />\n\n <Select\n v-model=\"selectedAnimation\"\n :options=\"animations\"\n option-label=\"name\"\n option-value=\"index\"\n class=\"w-32\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Select from 'primevue/select'\n\nimport Button from '@/components/ui/button/Button.vue'\n\ntype Animation = { name: string; index: number }\n\nconst animations = defineModel<Animation[]>('animations')\nconst playing = defineModel<boolean>('playing')\nconst selectedSpeed = defineModel<number>('selectedSpeed')\nconst selectedAnimation = defineModel<number>('selectedAnimation')\n\nconst speedOptions = [\n { name: '0.1x', value: 0.1 },\n { name: '0.5x', value: 0.5 },\n { name: '1x', value: 1 },\n { name: '1.5x', value: 1.5 },\n { name: '2x', value: 2 }\n]\n\nconst togglePlay = () => {\n playing.value = !playing.value\n}\n</script>\n","<template>\n <div class=\"relative rounded-lg bg-smoke-700/30\">\n <div class=\"flex flex-col gap-2\">\n <Button\n v-tooltip.right=\"{\n value: isRecording\n ? $t('load3d.stopRecording')\n : $t('load3d.startRecording'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n :class=\"\n cn(\n 'rounded-full',\n isRecording && 'text-red-500 recording-button-blink'\n )\n \"\n :aria-label=\"\n isRecording ? $t('load3d.stopRecording') : $t('load3d.startRecording')\n \"\n @click=\"toggleRecording\"\n >\n <i\n :class=\"[\n 'pi',\n isRecording ? 'pi-circle-fill' : 'pi-video',\n 'text-lg text-white'\n ]\"\n />\n </Button>\n\n <Button\n v-if=\"hasRecording && !isRecording\"\n v-tooltip.right=\"{\n value: $t('load3d.exportRecording'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.exportRecording')\"\n @click=\"handleExportRecording\"\n >\n <i class=\"pi pi-download text-lg text-white\" />\n </Button>\n\n <Button\n v-if=\"hasRecording && !isRecording\"\n v-tooltip.right=\"{\n value: $t('load3d.clearRecording'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.clearRecording')\"\n @click=\"handleClearRecording\"\n >\n <i class=\"pi pi-trash text-lg text-white\" />\n </Button>\n\n <div\n v-if=\"recordingDuration && recordingDuration > 0 && !isRecording\"\n class=\"mt-1 text-center text-xs text-white\"\n >\n {{ formatDuration(recordingDuration) }}\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Button from '@/components/ui/button/Button.vue'\nimport { cn } from '@/utils/tailwindUtil'\n\nconst hasRecording = defineModel<boolean>('hasRecording')\nconst isRecording = defineModel<boolean>('isRecording')\nconst recordingDuration = defineModel<number>('recordingDuration')\n\nconst emit = defineEmits<{\n (e: 'startRecording'): void\n (e: 'stopRecording'): void\n (e: 'exportRecording'): void\n (e: 'clearRecording'): void\n}>()\n\nfunction toggleRecording() {\n if (isRecording.value) {\n emit('stopRecording')\n } else {\n emit('startRecording')\n }\n}\n\nfunction handleExportRecording() {\n emit('exportRecording')\n}\n\nfunction handleClearRecording() {\n emit('clearRecording')\n}\n\nfunction formatDuration(seconds: number): string {\n const minutes = Math.floor(seconds / 60)\n const remainingSeconds = Math.floor(seconds % 60)\n return `${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`\n}\n</script>\n\n<style scoped>\n.recording-button-blink {\n animation: blink 1s infinite;\n}\n\n@keyframes blink {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n</style>\n","<template>\n <div class=\"relative rounded-lg bg-smoke-700/30\">\n <div class=\"flex flex-col gap-2\">\n <Button\n v-tooltip.right=\"{\n value: t('load3d.openIn3DViewer'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"t('load3d.openIn3DViewer')\"\n @click=\"openIn3DViewer\"\n >\n <i class=\"pi pi-expand text-lg text-white\" />\n </Button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Load3DViewerContent from '@/components/load3d/Load3dViewerContent.vue'\nimport Button from '@/components/ui/button/Button.vue'\nimport { t } from '@/i18n'\nimport type { LGraphNode } from '@/lib/litegraph/src/LGraphNode'\nimport { useLoad3dService } from '@/services/load3dService'\nimport { useDialogStore } from '@/stores/dialogStore'\n\nconst { node } = defineProps<{\n node: LGraphNode\n}>()\n\nconst openIn3DViewer = () => {\n const props = { node: node }\n\n useDialogStore().showDialog({\n key: 'global-load3d-viewer',\n title: t('load3d.viewer.title'),\n component: Load3DViewerContent,\n props: props,\n dialogComponentProps: {\n style: 'width: 80vw; height: 80vh;',\n maximizable: true,\n onClose: async () => {\n await useLoad3dService().handleViewerClose(props.node)\n }\n }\n })\n}\n</script>\n\n<style scoped></style>\n","<template>\n <div\n class=\"relative size-full\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n @pointerdown.stop\n @pointermove.stop\n @pointerup.stop\n >\n <Load3DScene\n v-if=\"node\"\n :initialize-load3d=\"initializeLoad3d\"\n :cleanup=\"cleanup\"\n :loading=\"loading\"\n :loading-message=\"loadingMessage\"\n :on-model-drop=\"isPreview ? undefined : handleModelDrop\"\n :is-preview=\"isPreview\"\n />\n <div class=\"pointer-events-none absolute top-0 left-0 size-full\">\n <Load3DControls\n v-model:scene-config=\"sceneConfig\"\n v-model:model-config=\"modelConfig\"\n v-model:camera-config=\"cameraConfig\"\n v-model:light-config=\"lightConfig\"\n :is-splat-model=\"isSplatModel\"\n :is-ply-model=\"isPlyModel\"\n @update-background-image=\"handleBackgroundImageUpdate\"\n @export-model=\"handleExportModel\"\n />\n <AnimationControls\n v-if=\"animations && animations.length > 0\"\n v-model:animations=\"animations\"\n v-model:playing=\"playing\"\n v-model:selected-speed=\"selectedSpeed\"\n v-model:selected-animation=\"selectedAnimation\"\n />\n </div>\n <div\n v-if=\"enable3DViewer && node\"\n class=\"pointer-events-auto absolute top-12 right-2 z-20\"\n >\n <ViewerControls :node=\"node as LGraphNode\" />\n </div>\n\n <div\n v-if=\"!isPreview\"\n class=\"pointer-events-auto absolute right-2 z-20\"\n :class=\"{\n 'top-12': !enable3DViewer,\n 'top-24': enable3DViewer\n }\"\n >\n <RecordingControls\n v-model:is-recording=\"isRecording\"\n v-model:has-recording=\"hasRecording\"\n v-model:recording-duration=\"recordingDuration\"\n @start-recording=\"handleStartRecording\"\n @stop-recording=\"handleStopRecording\"\n @export-recording=\"handleExportRecording\"\n @clear-recording=\"handleClearRecording\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from 'vue'\nimport type { Ref } from 'vue'\n\nimport Load3DControls from '@/components/load3d/Load3DControls.vue'\nimport Load3DScene from '@/components/load3d/Load3DScene.vue'\nimport AnimationControls from '@/components/load3d/controls/AnimationControls.vue'\nimport RecordingControls from '@/components/load3d/controls/RecordingControls.vue'\nimport ViewerControls from '@/components/load3d/controls/ViewerControls.vue'\nimport { useLoad3d } from '@/composables/useLoad3d'\nimport type { LGraphNode } from '@/lib/litegraph/src/LGraphNode'\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport type { NodeId } from '@/platform/workflow/validation/schemas/workflowSchema'\nimport { app } from '@/scripts/app'\nimport type { ComponentWidget } from '@/scripts/domWidget'\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\n\nconst props = defineProps<{\n widget: ComponentWidget<string[]> | SimplifiedWidget\n nodeId?: NodeId\n}>()\n\nfunction isComponentWidget(\n widget: ComponentWidget<string[]> | SimplifiedWidget\n): widget is ComponentWidget<string[]> {\n return 'node' in widget && widget.node !== undefined\n}\n\nconst node = ref<LGraphNode | null>(null)\n\nif (isComponentWidget(props.widget)) {\n node.value = props.widget.node\n} else if (props.nodeId) {\n onMounted(() => {\n node.value = app.rootGraph?.getNodeById(props.nodeId!) || null\n })\n}\n\nconst {\n // configs\n sceneConfig,\n modelConfig,\n cameraConfig,\n lightConfig,\n\n // other state\n isRecording,\n isPreview,\n isSplatModel,\n isPlyModel,\n hasRecording,\n recordingDuration,\n animations,\n playing,\n selectedSpeed,\n selectedAnimation,\n loading,\n loadingMessage,\n\n // Methods\n initializeLoad3d,\n handleMouseEnter,\n handleMouseLeave,\n handleStartRecording,\n handleStopRecording,\n handleExportRecording,\n handleClearRecording,\n handleBackgroundImageUpdate,\n handleExportModel,\n handleModelDrop,\n cleanup\n} = useLoad3d(node as Ref<LGraphNode | null>)\n\nconst enable3DViewer = computed(() =>\n useSettingStore().get('Comfy.Load3D.3DViewerEnable')\n)\n</script>\n"],"names":["value","_useModel","__props","showSlider","ref","toggleSlider","__name","closeSlider","e","onMounted","onUnmounted","cameraType","fov","showFOVButton","computed","switchCamera","emit","__emit","showExportFormats","exportFormats","toggleExportFormats","exportModel","format","closeExportFormatsList","lightIntensity","materialMode","showLightIntensityButton","showLightIntensity","lightIntensityMaximum","useSettingStore","lightIntensityMinimum","lightAdjustmentIncrement","toggleLightIntensity","closeLightSlider","upDirection","showUpDirection","showMaterialMode","upDirections","materialModes","modes","toggleUpDirection","selectUpDirection","direction","toggleMaterialMode","selectMaterialMode","mode","formatMaterialMode","t","closeSceneSlider","target","showGrid","backgroundColor","backgroundImage","backgroundRenderMode","hasBackgroundImage","colorPickerRef","imagePickerRef","toggleGrid","updateBackgroundColor","color","openColorPicker","openImagePicker","uploadBackgroundImage","event","input","removeBackgroundImage","toggleBackgroundRenderMode","sceneConfig","modelConfig","cameraConfig","lightConfig","isMenuOpen","activeCategory","categoryLabels","availableCategories","showSceneControls","showModelControls","showCameraControls","showLightControls","showExportControls","toggleMenu","selectCategory","category","getCategoryIcon","handleBackgroundImageUpdate","file","handleExportModel","props","container","isDragging","dragMessage","handleDragOver","handleDragLeave","handleDrop","useLoad3dDrag","animations","playing","selectedSpeed","selectedAnimation","speedOptions","togglePlay","hasRecording","isRecording","recordingDuration","toggleRecording","handleExportRecording","handleClearRecording","formatDuration","seconds","minutes","remainingSeconds","openIn3DViewer","useDialogStore","Load3DViewerContent","useLoad3dService","isComponentWidget","widget","node","app","isPreview","isSplatModel","isPlyModel","loading","loadingMessage","initializeLoad3d","handleMouseEnter","handleMouseLeave","handleStartRecording","handleStopRecording","handleModelDrop","cleanup","useLoad3d","enable3DViewer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Load3D.vue_vue_type_script_setup_true_lang-_XswHXHt.js","sources":["../../src/components/load3d/controls/PopupSlider.vue","../../src/components/load3d/controls/CameraControls.vue","../../src/components/load3d/controls/ExportControls.vue","../../src/components/load3d/controls/LightControls.vue","../../src/components/load3d/controls/ModelControls.vue","../../src/components/load3d/controls/SceneControls.vue","../../src/components/load3d/Load3DControls.vue","../../src/components/load3d/Load3DScene.vue","../../src/components/load3d/controls/AnimationControls.vue","../../src/components/load3d/controls/RecordingControls.vue","../../src/components/load3d/controls/ViewerControls.vue","../../src/components/load3d/Load3D.vue"],"sourcesContent":["<template>\n <div class=\"relative show-slider\">\n <Button\n v-tooltip.right=\"{ value: tooltipText, showDelay: 300 }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"tooltipText\"\n @click=\"toggleSlider\"\n >\n <i :class=\"['pi', icon, 'text-lg text-white']\" />\n </Button>\n <div\n v-show=\"showSlider\"\n class=\"absolute top-0 left-12 rounded-lg bg-black/50 p-4 shadow-lg w-[150px]\"\n >\n <Slider\n v-model=\"value\"\n class=\"w-full\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Slider from 'primevue/slider'\nimport { onMounted, onUnmounted, ref } from 'vue'\n\nimport Button from '@/components/ui/button/Button.vue'\n\nconst {\n icon = 'pi-expand',\n min = 10,\n max = 150,\n step = 1\n} = defineProps<{\n icon?: string\n tooltipText: string\n min?: number\n max?: number\n step?: number\n}>()\n\nconst value = defineModel<number>()\nconst showSlider = ref(false)\n\nconst toggleSlider = () => {\n showSlider.value = !showSlider.value\n}\n\nconst closeSlider = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n\n if (!target.closest('.show-slider')) {\n showSlider.value = false\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', closeSlider)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', closeSlider)\n})\n</script>\n","<template>\n <div class=\"flex flex-col\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.switchCamera'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.switchCamera')\"\n @click=\"switchCamera\"\n >\n <i :class=\"['pi', 'pi-camera', 'text-lg text-white']\" />\n </Button>\n <PopupSlider\n v-if=\"showFOVButton\"\n v-model=\"fov\"\n :tooltip-text=\"$t('load3d.fov')\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport PopupSlider from '@/components/load3d/controls/PopupSlider.vue'\nimport Button from '@/components/ui/button/Button.vue'\nimport type { CameraType } from '@/extensions/core/load3d/interfaces'\n\nconst cameraType = defineModel<CameraType>('cameraType')\nconst fov = defineModel<number>('fov')\nconst showFOVButton = computed(() => cameraType.value === 'perspective')\n\nconst switchCamera = () => {\n cameraType.value =\n cameraType.value === 'perspective' ? 'orthographic' : 'perspective'\n}\n</script>\n","<template>\n <div class=\"flex flex-col\">\n <div class=\"show-export-formats relative\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.exportModel'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.exportModel')\"\n @click=\"toggleExportFormats\"\n >\n <i class=\"pi pi-download text-lg text-white\" />\n </Button>\n <div\n v-show=\"showExportFormats\"\n class=\"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg\"\n >\n <div class=\"flex flex-col\">\n <Button\n v-for=\"format in exportFormats\"\n :key=\"format.value\"\n variant=\"textonly\"\n class=\"text-white\"\n @click=\"exportModel(format.value)\"\n >\n {{ format.label }}\n </Button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted, onUnmounted, ref } from 'vue'\n\nimport Button from '@/components/ui/button/Button.vue'\n\nconst emit = defineEmits<{\n (e: 'exportModel', format: string): void\n}>()\n\nconst showExportFormats = ref(false)\n\nconst exportFormats = [\n { label: 'GLB', value: 'glb' },\n { label: 'OBJ', value: 'obj' },\n { label: 'STL', value: 'stl' }\n]\n\nfunction toggleExportFormats() {\n showExportFormats.value = !showExportFormats.value\n}\n\nfunction exportModel(format: string) {\n emit('exportModel', format)\n\n showExportFormats.value = false\n}\n\nfunction closeExportFormatsList(e: MouseEvent) {\n const target = e.target as HTMLElement\n\n if (!target.closest('.show-export-formats')) {\n showExportFormats.value = false\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', closeExportFormatsList)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', closeExportFormatsList)\n})\n</script>\n","<template>\n <div class=\"flex flex-col\">\n <div v-if=\"showLightIntensityButton\" class=\"show-light-intensity relative\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.lightIntensity'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.lightIntensity')\"\n @click=\"toggleLightIntensity\"\n >\n <i class=\"pi pi-sun text-lg text-white\" />\n </Button>\n <div\n v-show=\"showLightIntensity\"\n class=\"absolute top-0 left-12 rounded-lg bg-black/50 p-4 shadow-lg\"\n style=\"width: 150px\"\n >\n <Slider\n v-model=\"lightIntensity\"\n class=\"w-full\"\n :min=\"lightIntensityMinimum\"\n :max=\"lightIntensityMaximum\"\n :step=\"lightAdjustmentIncrement\"\n />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Slider from 'primevue/slider'\nimport { computed, onMounted, onUnmounted, ref } from 'vue'\n\nimport Button from '@/components/ui/button/Button.vue'\nimport type { MaterialMode } from '@/extensions/core/load3d/interfaces'\nimport { useSettingStore } from '@/platform/settings/settingStore'\n\nconst lightIntensity = defineModel<number>('lightIntensity')\nconst materialMode = defineModel<MaterialMode>('materialMode')\n\nconst showLightIntensityButton = computed(\n () => materialMode.value === 'original'\n)\nconst showLightIntensity = ref(false)\n\nconst lightIntensityMaximum = useSettingStore().get(\n 'Comfy.Load3D.LightIntensityMaximum'\n)\nconst lightIntensityMinimum = useSettingStore().get(\n 'Comfy.Load3D.LightIntensityMinimum'\n)\nconst lightAdjustmentIncrement = useSettingStore().get(\n 'Comfy.Load3D.LightAdjustmentIncrement'\n)\n\nfunction toggleLightIntensity() {\n showLightIntensity.value = !showLightIntensity.value\n}\n\nfunction closeLightSlider(e: MouseEvent) {\n const target = e.target as HTMLElement\n\n if (!target.closest('.show-light-intensity')) {\n showLightIntensity.value = false\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', closeLightSlider)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', closeLightSlider)\n})\n</script>\n","<template>\n <div class=\"flex flex-col\">\n <div class=\"show-up-direction relative\">\n <Button\n v-tooltip.right=\"{\n value: t('load3d.upDirection'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"t('load3d.upDirection')\"\n @click=\"toggleUpDirection\"\n >\n <i class=\"pi pi-arrow-up text-lg text-white\" />\n </Button>\n <div\n v-show=\"showUpDirection\"\n class=\"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg\"\n >\n <div class=\"flex flex-col\">\n <Button\n v-for=\"direction in upDirections\"\n :key=\"direction\"\n variant=\"textonly\"\n :class=\"\n cn('text-white', upDirection === direction && 'bg-blue-500')\n \"\n @click=\"selectUpDirection(direction)\"\n >\n {{ direction.toUpperCase() }}\n </Button>\n </div>\n </div>\n </div>\n\n <div v-if=\"!hideMaterialMode\" class=\"show-material-mode relative\">\n <Button\n v-tooltip.right=\"{\n value: t('load3d.materialMode'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"t('load3d.materialMode')\"\n @click=\"toggleMaterialMode\"\n >\n <i class=\"pi pi-box text-lg text-white\" />\n </Button>\n <div\n v-show=\"showMaterialMode\"\n class=\"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg\"\n >\n <div class=\"flex flex-col\">\n <Button\n v-for=\"mode in materialModes\"\n :key=\"mode\"\n variant=\"textonly\"\n :class=\"\n cn(\n 'whitespace-nowrap text-white',\n materialMode === mode && 'bg-blue-500'\n )\n \"\n @click=\"selectMaterialMode(mode)\"\n >\n {{ formatMaterialMode(mode) }}\n </Button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted, ref } from 'vue'\n\nimport Button from '@/components/ui/button/Button.vue'\nimport type {\n MaterialMode,\n UpDirection\n} from '@/extensions/core/load3d/interfaces'\nimport { t } from '@/i18n'\nimport { cn } from '@/utils/tailwindUtil'\n\nconst { hideMaterialMode = false, isPlyModel = false } = defineProps<{\n hideMaterialMode?: boolean\n isPlyModel?: boolean\n}>()\n\nconst materialMode = defineModel<MaterialMode>('materialMode')\nconst upDirection = defineModel<UpDirection>('upDirection')\n\nconst showUpDirection = ref(false)\nconst showMaterialMode = ref(false)\n\nconst upDirections: UpDirection[] = [\n 'original',\n '-x',\n '+x',\n '-y',\n '+y',\n '-z',\n '+z'\n]\n\nconst materialModes = computed(() => {\n const modes: MaterialMode[] = [\n 'original',\n 'normal',\n 'wireframe'\n //'depth' disable for now\n ]\n\n // Only show pointCloud mode for PLY files (point cloud rendering)\n if (isPlyModel) {\n modes.splice(1, 0, 'pointCloud')\n }\n\n return modes\n})\n\nfunction toggleUpDirection() {\n showUpDirection.value = !showUpDirection.value\n showMaterialMode.value = false\n}\n\nfunction selectUpDirection(direction: UpDirection) {\n upDirection.value = direction\n showUpDirection.value = false\n}\n\nfunction toggleMaterialMode() {\n showMaterialMode.value = !showMaterialMode.value\n showUpDirection.value = false\n}\n\nfunction selectMaterialMode(mode: MaterialMode) {\n materialMode.value = mode\n showMaterialMode.value = false\n}\n\nfunction formatMaterialMode(mode: MaterialMode) {\n return t(`load3d.materialModes.${mode}`)\n}\n\nfunction closeSceneSlider(e: MouseEvent) {\n const target = e.target as HTMLElement\n\n if (!target.closest('.show-up-direction')) {\n showUpDirection.value = false\n }\n\n if (!target.closest('.show-material-mode')) {\n showMaterialMode.value = false\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', closeSceneSlider)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', closeSceneSlider)\n})\n</script>\n","<template>\n <div class=\"flex flex-col\">\n <Button\n v-tooltip.right=\"{ value: $t('load3d.showGrid'), showDelay: 300 }\"\n variant=\"textonly\"\n size=\"icon\"\n :class=\"cn('rounded-full', showGrid && 'ring-2 ring-white/50')\"\n :aria-label=\"$t('load3d.showGrid')\"\n @click=\"toggleGrid\"\n >\n <i class=\"pi pi-table text-lg text-white\" />\n </Button>\n\n <div v-if=\"!hasBackgroundImage\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.backgroundColor'),\n showDelay: 300\n }\"\n variant=\"textonly\"\n size=\"icon\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.backgroundColor')\"\n @click=\"openColorPicker\"\n >\n <i class=\"pi pi-palette text-lg text-white\" />\n <input\n ref=\"colorPickerRef\"\n type=\"color\"\n :value=\"backgroundColor\"\n class=\"pointer-events-none absolute m-0 h-0 w-0 p-0 opacity-0\"\n @input=\"\n updateBackgroundColor(($event.target as HTMLInputElement).value)\n \"\n />\n </Button>\n </div>\n\n <div v-if=\"!hasBackgroundImage\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.uploadBackgroundImage'),\n showDelay: 300\n }\"\n variant=\"textonly\"\n size=\"icon\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.uploadBackgroundImage')\"\n @click=\"openImagePicker\"\n >\n <i class=\"pi pi-image text-lg text-white\" />\n <input\n ref=\"imagePickerRef\"\n type=\"file\"\n accept=\"image/*\"\n class=\"pointer-events-none absolute m-0 h-0 w-0 p-0 opacity-0\"\n @change=\"uploadBackgroundImage\"\n />\n </Button>\n </div>\n\n <div v-if=\"hasBackgroundImage\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.panoramaMode'),\n showDelay: 300\n }\"\n variant=\"textonly\"\n size=\"icon\"\n :class=\"\n cn(\n 'rounded-full',\n backgroundRenderMode === 'panorama' && 'ring-2 ring-white/50'\n )\n \"\n :aria-label=\"$t('load3d.panoramaMode')\"\n @click=\"toggleBackgroundRenderMode\"\n >\n <i class=\"pi pi-globe text-lg text-white\" />\n </Button>\n </div>\n\n <PopupSlider\n v-if=\"hasBackgroundImage && backgroundRenderMode === 'panorama'\"\n v-model=\"fov\"\n :tooltip-text=\"$t('load3d.fov')\"\n />\n\n <div v-if=\"hasBackgroundImage\">\n <Button\n v-tooltip.right=\"{\n value: $t('load3d.removeBackgroundImage'),\n showDelay: 300\n }\"\n variant=\"textonly\"\n size=\"icon\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.removeBackgroundImage')\"\n @click=\"removeBackgroundImage\"\n >\n <i class=\"pi pi-times text-lg text-white\" />\n </Button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\n\nimport PopupSlider from '@/components/load3d/controls/PopupSlider.vue'\nimport Button from '@/components/ui/button/Button.vue'\nimport type { BackgroundRenderModeType } from '@/extensions/core/load3d/interfaces'\nimport { cn } from '@/utils/tailwindUtil'\n\nconst emit = defineEmits<{\n (e: 'updateBackgroundImage', file: File | null): void\n}>()\n\nconst showGrid = defineModel<boolean>('showGrid')\nconst backgroundColor = defineModel<string>('backgroundColor')\nconst backgroundImage = defineModel<string>('backgroundImage')\nconst backgroundRenderMode = defineModel<BackgroundRenderModeType>(\n 'backgroundRenderMode',\n { default: 'tiled' }\n)\nconst fov = defineModel<number>('fov')\nconst hasBackgroundImage = computed(\n () => backgroundImage.value && backgroundImage.value !== ''\n)\n\nconst colorPickerRef = ref<HTMLInputElement | null>(null)\nconst imagePickerRef = ref<HTMLInputElement | null>(null)\n\nconst toggleGrid = () => {\n showGrid.value = !showGrid.value\n}\n\nconst updateBackgroundColor = (color: string) => {\n backgroundColor.value = color\n}\n\nconst openColorPicker = () => {\n colorPickerRef.value?.click()\n}\n\nconst openImagePicker = () => {\n imagePickerRef.value?.click()\n}\n\nconst uploadBackgroundImage = (event: Event) => {\n const input = event.target as HTMLInputElement\n\n if (input.files && input.files[0]) {\n emit('updateBackgroundImage', input.files[0])\n }\n}\n\nconst removeBackgroundImage = () => {\n emit('updateBackgroundImage', null)\n}\n\nconst toggleBackgroundRenderMode = () => {\n backgroundRenderMode.value =\n backgroundRenderMode.value === 'panorama' ? 'tiled' : 'panorama'\n}\n</script>\n","<template>\n <div\n class=\"pointer-events-auto absolute top-12 left-2 z-20 flex flex-col rounded-lg bg-smoke-700/30\"\n @pointerdown.stop\n @pointermove.stop\n @pointerup.stop\n @wheel.stop\n >\n <div class=\"show-menu relative\">\n <Button\n variant=\"textonly\"\n size=\"icon\"\n :aria-label=\"$t('menu.showMenu')\"\n class=\"rounded-full\"\n @click=\"toggleMenu\"\n >\n <i class=\"pi pi-bars text-lg text-white\" />\n </Button>\n\n <div\n v-show=\"isMenuOpen\"\n class=\"absolute top-0 left-12 rounded-lg bg-black/50 shadow-lg\"\n >\n <div class=\"flex flex-col\">\n <Button\n v-for=\"category in availableCategories\"\n :key=\"category\"\n variant=\"textonly\"\n :class=\"\n cn(\n 'flex w-full items-center justify-start',\n activeCategory === category && 'bg-smoke-600'\n )\n \"\n @click=\"selectCategory(category)\"\n >\n <i :class=\"getCategoryIcon(category)\" />\n <span class=\"whitespace-nowrap text-white\">{{\n $t(categoryLabels[category])\n }}</span>\n </Button>\n </div>\n </div>\n </div>\n\n <div v-show=\"activeCategory\" class=\"rounded-lg bg-smoke-700/30\">\n <SceneControls\n v-if=\"showSceneControls\"\n v-model:show-grid=\"sceneConfig!.showGrid\"\n v-model:background-color=\"sceneConfig!.backgroundColor\"\n v-model:background-image=\"sceneConfig!.backgroundImage\"\n v-model:background-render-mode=\"sceneConfig!.backgroundRenderMode\"\n v-model:fov=\"cameraConfig!.fov\"\n @update-background-image=\"handleBackgroundImageUpdate\"\n />\n\n <ModelControls\n v-if=\"showModelControls\"\n v-model:material-mode=\"modelConfig!.materialMode\"\n v-model:up-direction=\"modelConfig!.upDirection\"\n :hide-material-mode=\"isSplatModel\"\n :is-ply-model=\"isPlyModel\"\n />\n\n <CameraControls\n v-if=\"showCameraControls\"\n v-model:camera-type=\"cameraConfig!.cameraType\"\n v-model:fov=\"cameraConfig!.fov\"\n />\n\n <LightControls\n v-if=\"showLightControls\"\n v-model:light-intensity=\"lightConfig!.intensity\"\n v-model:material-mode=\"modelConfig!.materialMode\"\n />\n\n <ExportControls\n v-if=\"showExportControls\"\n @export-model=\"handleExportModel\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted, ref } from 'vue'\n\nimport CameraControls from '@/components/load3d/controls/CameraControls.vue'\nimport ExportControls from '@/components/load3d/controls/ExportControls.vue'\nimport LightControls from '@/components/load3d/controls/LightControls.vue'\nimport ModelControls from '@/components/load3d/controls/ModelControls.vue'\nimport SceneControls from '@/components/load3d/controls/SceneControls.vue'\nimport Button from '@/components/ui/button/Button.vue'\nimport type {\n CameraConfig,\n LightConfig,\n ModelConfig,\n SceneConfig\n} from '@/extensions/core/load3d/interfaces'\nimport { cn } from '@/utils/tailwindUtil'\n\nconst { isSplatModel = false, isPlyModel = false } = defineProps<{\n isSplatModel?: boolean\n isPlyModel?: boolean\n}>()\n\nconst sceneConfig = defineModel<SceneConfig>('sceneConfig')\nconst modelConfig = defineModel<ModelConfig>('modelConfig')\nconst cameraConfig = defineModel<CameraConfig>('cameraConfig')\nconst lightConfig = defineModel<LightConfig>('lightConfig')\n\nconst isMenuOpen = ref(false)\nconst activeCategory = ref<string>('scene')\nconst categoryLabels: Record<string, string> = {\n scene: 'load3d.scene',\n model: 'load3d.model',\n camera: 'load3d.camera',\n light: 'load3d.light',\n export: 'load3d.export'\n}\n\nconst availableCategories = computed(() => {\n if (isSplatModel) {\n return ['scene', 'model', 'camera']\n }\n\n return ['scene', 'model', 'camera', 'light', 'export']\n})\n\nconst showSceneControls = computed(\n () => activeCategory.value === 'scene' && !!sceneConfig.value\n)\nconst showModelControls = computed(\n () => activeCategory.value === 'model' && !!modelConfig.value\n)\nconst showCameraControls = computed(\n () => activeCategory.value === 'camera' && !!cameraConfig.value\n)\nconst showLightControls = computed(\n () =>\n activeCategory.value === 'light' &&\n !!lightConfig.value &&\n !!modelConfig.value\n)\nconst showExportControls = computed(() => activeCategory.value === 'export')\n\nconst toggleMenu = () => {\n isMenuOpen.value = !isMenuOpen.value\n}\n\nconst selectCategory = (category: string) => {\n activeCategory.value = category\n isMenuOpen.value = false\n}\n\nconst getCategoryIcon = (category: string) => {\n const icons = {\n scene: 'pi pi-image',\n model: 'pi pi-box',\n camera: 'pi pi-camera',\n light: 'pi pi-sun',\n export: 'pi pi-download'\n }\n // @ts-expect-error fixme ts strict error\n return `${icons[category]} text-white text-lg`\n}\n\nconst emit = defineEmits<{\n (e: 'updateBackgroundImage', file: File | null): void\n (e: 'exportModel', format: string): void\n}>()\n\nconst handleBackgroundImageUpdate = (file: File | null) => {\n emit('updateBackgroundImage', file)\n}\n\nconst handleExportModel = (format: string) => {\n emit('exportModel', format)\n}\n\nconst closeSlider = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n\n if (!target.closest('.show-menu')) {\n isMenuOpen.value = false\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', closeSlider)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', closeSlider)\n})\n</script>\n","<template>\n <div\n ref=\"container\"\n class=\"relative h-full w-full\"\n data-capture-wheel=\"true\"\n @pointerdown.stop\n @pointermove.stop\n @pointerup.stop\n @mousedown.stop\n @mousemove.stop\n @mouseup.stop\n @contextmenu.stop.prevent\n @dragover.prevent.stop=\"handleDragOver\"\n @dragleave.stop=\"handleDragLeave\"\n @drop.prevent.stop=\"handleDrop\"\n >\n <LoadingOverlay :loading=\"loading\" :loading-message=\"loadingMessage\" />\n <div\n v-if=\"!isPreview && isDragging\"\n class=\"pointer-events-none absolute inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm\"\n >\n <div\n class=\"rounded-lg border-2 border-dashed border-blue-400 bg-blue-500/20 px-6 py-4 text-lg font-medium text-blue-100\"\n >\n {{ dragMessage }}\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, onUnmounted, ref } from 'vue'\n\nimport LoadingOverlay from '@/components/load3d/LoadingOverlay.vue'\nimport { useLoad3dDrag } from '@/composables/useLoad3dDrag'\n\nconst props = defineProps<{\n initializeLoad3d: (containerRef: HTMLElement) => Promise<void>\n cleanup: () => void\n loading: boolean\n loadingMessage: string\n onModelDrop?: (file: File) => void | Promise<void>\n isPreview: boolean\n}>()\n\nconst container = ref<HTMLElement | null>(null)\n\nconst { isDragging, dragMessage, handleDragOver, handleDragLeave, handleDrop } =\n useLoad3dDrag({\n onModelDrop: async (file) => {\n if (props.onModelDrop) {\n await props.onModelDrop(file)\n }\n },\n disabled: computed(() => props.isPreview)\n })\n\nonMounted(() => {\n if (container.value) {\n void props.initializeLoad3d(container.value)\n }\n})\n\nonUnmounted(() => {\n props.cleanup()\n})\n</script>\n","<template>\n <div\n v-if=\"animations && animations.length > 0\"\n class=\"pointer-events-auto absolute top-0 left-0 z-10 flex w-full items-center justify-center gap-2 pt-2\"\n >\n <Button\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"$t('g.playPause')\"\n @click=\"togglePlay\"\n >\n <i\n :class=\"['pi', playing ? 'pi-pause' : 'pi-play', 'text-lg text-white']\"\n />\n </Button>\n\n <Select\n v-model=\"selectedSpeed\"\n :options=\"speedOptions\"\n option-label=\"name\"\n option-value=\"value\"\n class=\"w-24\"\n />\n\n <Select\n v-model=\"selectedAnimation\"\n :options=\"animations\"\n option-label=\"name\"\n option-value=\"index\"\n class=\"w-32\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Select from 'primevue/select'\n\nimport Button from '@/components/ui/button/Button.vue'\n\ntype Animation = { name: string; index: number }\n\nconst animations = defineModel<Animation[]>('animations')\nconst playing = defineModel<boolean>('playing')\nconst selectedSpeed = defineModel<number>('selectedSpeed')\nconst selectedAnimation = defineModel<number>('selectedAnimation')\n\nconst speedOptions = [\n { name: '0.1x', value: 0.1 },\n { name: '0.5x', value: 0.5 },\n { name: '1x', value: 1 },\n { name: '1.5x', value: 1.5 },\n { name: '2x', value: 2 }\n]\n\nconst togglePlay = () => {\n playing.value = !playing.value\n}\n</script>\n","<template>\n <div class=\"relative rounded-lg bg-smoke-700/30\">\n <div class=\"flex flex-col gap-2\">\n <Button\n v-tooltip.right=\"{\n value: isRecording\n ? $t('load3d.stopRecording')\n : $t('load3d.startRecording'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n :class=\"\n cn(\n 'rounded-full',\n isRecording && 'text-red-500 recording-button-blink'\n )\n \"\n :aria-label=\"\n isRecording ? $t('load3d.stopRecording') : $t('load3d.startRecording')\n \"\n @click=\"toggleRecording\"\n >\n <i\n :class=\"[\n 'pi',\n isRecording ? 'pi-circle-fill' : 'pi-video',\n 'text-lg text-white'\n ]\"\n />\n </Button>\n\n <Button\n v-if=\"hasRecording && !isRecording\"\n v-tooltip.right=\"{\n value: $t('load3d.exportRecording'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.exportRecording')\"\n @click=\"handleExportRecording\"\n >\n <i class=\"pi pi-download text-lg text-white\" />\n </Button>\n\n <Button\n v-if=\"hasRecording && !isRecording\"\n v-tooltip.right=\"{\n value: $t('load3d.clearRecording'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"$t('load3d.clearRecording')\"\n @click=\"handleClearRecording\"\n >\n <i class=\"pi pi-trash text-lg text-white\" />\n </Button>\n\n <div\n v-if=\"recordingDuration && recordingDuration > 0 && !isRecording\"\n class=\"mt-1 text-center text-xs text-white\"\n >\n {{ formatDuration(recordingDuration) }}\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Button from '@/components/ui/button/Button.vue'\nimport { cn } from '@/utils/tailwindUtil'\n\nconst hasRecording = defineModel<boolean>('hasRecording')\nconst isRecording = defineModel<boolean>('isRecording')\nconst recordingDuration = defineModel<number>('recordingDuration')\n\nconst emit = defineEmits<{\n (e: 'startRecording'): void\n (e: 'stopRecording'): void\n (e: 'exportRecording'): void\n (e: 'clearRecording'): void\n}>()\n\nfunction toggleRecording() {\n if (isRecording.value) {\n emit('stopRecording')\n } else {\n emit('startRecording')\n }\n}\n\nfunction handleExportRecording() {\n emit('exportRecording')\n}\n\nfunction handleClearRecording() {\n emit('clearRecording')\n}\n\nfunction formatDuration(seconds: number): string {\n const minutes = Math.floor(seconds / 60)\n const remainingSeconds = Math.floor(seconds % 60)\n return `${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`\n}\n</script>\n\n<style scoped>\n.recording-button-blink {\n animation: blink 1s infinite;\n}\n\n@keyframes blink {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n</style>\n","<template>\n <div class=\"relative rounded-lg bg-smoke-700/30\">\n <div class=\"flex flex-col gap-2\">\n <Button\n v-tooltip.right=\"{\n value: t('load3d.openIn3DViewer'),\n showDelay: 300\n }\"\n size=\"icon\"\n variant=\"textonly\"\n class=\"rounded-full\"\n :aria-label=\"t('load3d.openIn3DViewer')\"\n @click=\"openIn3DViewer\"\n >\n <i class=\"pi pi-expand text-lg text-white\" />\n </Button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Load3DViewerContent from '@/components/load3d/Load3dViewerContent.vue'\nimport Button from '@/components/ui/button/Button.vue'\nimport { t } from '@/i18n'\nimport type { LGraphNode } from '@/lib/litegraph/src/LGraphNode'\nimport { useLoad3dService } from '@/services/load3dService'\nimport { useDialogStore } from '@/stores/dialogStore'\n\nconst { node } = defineProps<{\n node: LGraphNode\n}>()\n\nconst openIn3DViewer = () => {\n const props = { node: node }\n\n useDialogStore().showDialog({\n key: 'global-load3d-viewer',\n title: t('load3d.viewer.title'),\n component: Load3DViewerContent,\n props: props,\n dialogComponentProps: {\n style: 'width: 80vw; height: 80vh;',\n maximizable: true,\n onClose: async () => {\n await useLoad3dService().handleViewerClose(props.node)\n }\n }\n })\n}\n</script>\n\n<style scoped></style>\n","<template>\n <div\n class=\"relative size-full\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n @pointerdown.stop\n @pointermove.stop\n @pointerup.stop\n >\n <Load3DScene\n v-if=\"node\"\n :initialize-load3d=\"initializeLoad3d\"\n :cleanup=\"cleanup\"\n :loading=\"loading\"\n :loading-message=\"loadingMessage\"\n :on-model-drop=\"isPreview ? undefined : handleModelDrop\"\n :is-preview=\"isPreview\"\n />\n <div class=\"pointer-events-none absolute top-0 left-0 size-full\">\n <Load3DControls\n v-model:scene-config=\"sceneConfig\"\n v-model:model-config=\"modelConfig\"\n v-model:camera-config=\"cameraConfig\"\n v-model:light-config=\"lightConfig\"\n :is-splat-model=\"isSplatModel\"\n :is-ply-model=\"isPlyModel\"\n @update-background-image=\"handleBackgroundImageUpdate\"\n @export-model=\"handleExportModel\"\n />\n <AnimationControls\n v-if=\"animations && animations.length > 0\"\n v-model:animations=\"animations\"\n v-model:playing=\"playing\"\n v-model:selected-speed=\"selectedSpeed\"\n v-model:selected-animation=\"selectedAnimation\"\n />\n </div>\n <div\n v-if=\"enable3DViewer && node\"\n class=\"pointer-events-auto absolute top-12 right-2 z-20\"\n >\n <ViewerControls :node=\"node as LGraphNode\" />\n </div>\n\n <div\n v-if=\"!isPreview\"\n class=\"pointer-events-auto absolute right-2 z-20\"\n :class=\"{\n 'top-12': !enable3DViewer,\n 'top-24': enable3DViewer\n }\"\n >\n <RecordingControls\n v-model:is-recording=\"isRecording\"\n v-model:has-recording=\"hasRecording\"\n v-model:recording-duration=\"recordingDuration\"\n @start-recording=\"handleStartRecording\"\n @stop-recording=\"handleStopRecording\"\n @export-recording=\"handleExportRecording\"\n @clear-recording=\"handleClearRecording\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from 'vue'\nimport type { Ref } from 'vue'\n\nimport Load3DControls from '@/components/load3d/Load3DControls.vue'\nimport Load3DScene from '@/components/load3d/Load3DScene.vue'\nimport AnimationControls from '@/components/load3d/controls/AnimationControls.vue'\nimport RecordingControls from '@/components/load3d/controls/RecordingControls.vue'\nimport ViewerControls from '@/components/load3d/controls/ViewerControls.vue'\nimport { useLoad3d } from '@/composables/useLoad3d'\nimport type { LGraphNode } from '@/lib/litegraph/src/LGraphNode'\nimport { useSettingStore } from '@/platform/settings/settingStore'\nimport type { NodeId } from '@/platform/workflow/validation/schemas/workflowSchema'\nimport { app } from '@/scripts/app'\nimport type { ComponentWidget } from '@/scripts/domWidget'\nimport type { SimplifiedWidget } from '@/types/simplifiedWidget'\n\nconst props = defineProps<{\n widget: ComponentWidget<string[]> | SimplifiedWidget\n nodeId?: NodeId\n}>()\n\nfunction isComponentWidget(\n widget: ComponentWidget<string[]> | SimplifiedWidget\n): widget is ComponentWidget<string[]> {\n return 'node' in widget && widget.node !== undefined\n}\n\nconst node = ref<LGraphNode | null>(null)\n\nif (isComponentWidget(props.widget)) {\n node.value = props.widget.node\n} else if (props.nodeId) {\n onMounted(() => {\n node.value = app.rootGraph?.getNodeById(props.nodeId!) || null\n })\n}\n\nconst {\n // configs\n sceneConfig,\n modelConfig,\n cameraConfig,\n lightConfig,\n\n // other state\n isRecording,\n isPreview,\n isSplatModel,\n isPlyModel,\n hasRecording,\n recordingDuration,\n animations,\n playing,\n selectedSpeed,\n selectedAnimation,\n loading,\n loadingMessage,\n\n // Methods\n initializeLoad3d,\n handleMouseEnter,\n handleMouseLeave,\n handleStartRecording,\n handleStopRecording,\n handleExportRecording,\n handleClearRecording,\n handleBackgroundImageUpdate,\n handleExportModel,\n handleModelDrop,\n cleanup\n} = useLoad3d(node as Ref<LGraphNode | null>)\n\nconst enable3DViewer = computed(() =>\n useSettingStore().get('Comfy.Load3D.3DViewerEnable')\n)\n</script>\n"],"names":["value","_useModel","__props","showSlider","ref","toggleSlider","__name","closeSlider","e","onMounted","onUnmounted","cameraType","fov","showFOVButton","computed","switchCamera","emit","__emit","showExportFormats","exportFormats","toggleExportFormats","exportModel","format","closeExportFormatsList","lightIntensity","materialMode","showLightIntensityButton","showLightIntensity","lightIntensityMaximum","useSettingStore","lightIntensityMinimum","lightAdjustmentIncrement","toggleLightIntensity","closeLightSlider","upDirection","showUpDirection","showMaterialMode","upDirections","materialModes","modes","toggleUpDirection","selectUpDirection","direction","toggleMaterialMode","selectMaterialMode","mode","formatMaterialMode","t","closeSceneSlider","target","showGrid","backgroundColor","backgroundImage","backgroundRenderMode","hasBackgroundImage","colorPickerRef","imagePickerRef","toggleGrid","updateBackgroundColor","color","openColorPicker","openImagePicker","uploadBackgroundImage","event","input","removeBackgroundImage","toggleBackgroundRenderMode","sceneConfig","modelConfig","cameraConfig","lightConfig","isMenuOpen","activeCategory","categoryLabels","availableCategories","showSceneControls","showModelControls","showCameraControls","showLightControls","showExportControls","toggleMenu","selectCategory","category","getCategoryIcon","handleBackgroundImageUpdate","file","handleExportModel","props","container","isDragging","dragMessage","handleDragOver","handleDragLeave","handleDrop","useLoad3dDrag","animations","playing","selectedSpeed","selectedAnimation","speedOptions","togglePlay","hasRecording","isRecording","recordingDuration","toggleRecording","handleExportRecording","handleClearRecording","formatDuration","seconds","minutes","remainingSeconds","openIn3DViewer","useDialogStore","Load3DViewerContent","useLoad3dService","isComponentWidget","widget","node","app","isPreview","isSplatModel","isPlyModel","loading","loadingMessage","initializeLoad3d","handleMouseEnter","handleMouseLeave","handleStartRecording","handleStopRecording","handleModelDrop","cleanup","useLoad3d","enable3DViewer"],"mappings":"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"}
|
comfyui_frontend_package/static/assets/{Media3DBottom-DsMr4v-s.js → Media3DBottom-Z9nkVIUT.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{dq as i,dj as r}from"./index-
|
|
2
|
-
//# sourceMappingURL=Media3DBottom-
|
|
1
|
+
import{dq as i,dj as r}from"./index-BODInyrK.js";import{_ as m}from"./MediaTitle.vue_vue_type_script_setup_true_lang-CFkifLSX.js";import{bq as n,E as l,c as t,d as s,z as c,q as p,e as f,u as d,br as u}from"./vendor-other-BxP-0xn6.js";import"./vendor-primevue-rR0TB_Js.js";import"./vendor-vue-BEnTqVKr.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-BsnVSA6y.js";import"./vendor-tiptap-4vvRsqpM.js";const _={class:"flex flex-col items-center gap-1"},x={key:0,class:"flex items-center gap-2 text-xs text-zinc-400"},V=n({__name:"Media3DBottom",props:{asset:{}},setup(a){const o=l(()=>i(a.asset.name).filename);return(e,z)=>(s(),t("div",_,[c(m,{"file-name":o.value},null,8,["file-name"]),e.asset.size?(s(),t("div",x,[f("span",null,d(u(r)(e.asset.size)),1)])):p("",!0)]))}});export{V as default};
|
|
2
|
+
//# sourceMappingURL=Media3DBottom-Z9nkVIUT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Media3DBottom-
|
|
1
|
+
{"version":3,"file":"Media3DBottom-Z9nkVIUT.js","sources":["../../src/platform/assets/components/Media3DBottom.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col items-center gap-1\">\n <MediaTitle :file-name=\"fileName\" />\n <!-- TBD: File size will be provided by backend history API -->\n <div\n v-if=\"asset.size\"\n class=\"flex items-center gap-2 text-xs text-zinc-400\"\n >\n <span>{{ formatSize(asset.size) }}</span>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport { formatSize, getFilenameDetails } from '@/utils/formatUtil'\n\nimport type { AssetMeta } from '../schemas/mediaAssetSchema'\nimport MediaTitle from './MediaTitle.vue'\n\nconst { asset } = defineProps<{\n asset: AssetMeta\n}>()\n\nconst fileName = computed(() => {\n return getFilenameDetails(asset.name).filename\n})\n</script>\n"],"names":["fileName","computed","getFilenameDetails","__props"],"mappings":"qkBAyBA,MAAMA,EAAWC,EAAS,IACjBC,EAAmBC,EAAA,MAAM,IAAI,EAAE,QACvC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var s=Object.defineProperty;var r=(t,e)=>s(t,"name",{value:e,configurable:!0});import{d as a}from"./index-
|
|
2
|
-
//# sourceMappingURL=Media3DTop-
|
|
1
|
+
var s=Object.defineProperty;var r=(t,e)=>s(t,"name",{value:e,configurable:!0});import{d as a}from"./index-BODInyrK.js";import{c as l,d,e as o,u as i}from"./vendor-other-BxP-0xn6.js";import"./vendor-primevue-rR0TB_Js.js";import"./vendor-vue-BEnTqVKr.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-BsnVSA6y.js";import"./vendor-tiptap-4vvRsqpM.js";const c={},n={class:"relative size-full overflow-hidden rounded"},u={class:"flex size-full flex-col items-center justify-center gap-2 bg-modal-card-placeholder-background transition-transform duration-300 group-hover:scale-105 group-data-[selected=true]:scale-105"},m={class:"text-sm text-base-foreground"};function p(t,e){return d(),l("div",n,[o("div",u,[e[0]||(e[0]=o("i",{class:"icon-[lucide--box] text-3xl text-muted-foreground"},null,-1)),o("span",m,i(t.$t("assetBrowser.media.threeDModelPlaceholder")),1)])])}r(p,"_sfc_render");const k=a(c,[["render",p]]);export{k as default};
|
|
2
|
+
//# sourceMappingURL=Media3DTop-DKaMli8A.js.map
|
comfyui_frontend_package/static/assets/{Media3DTop-DQ18QW3M.js.map → Media3DTop-DKaMli8A.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Media3DTop-
|
|
1
|
+
{"version":3,"file":"Media3DTop-DKaMli8A.js","sources":["../../src/platform/assets/components/Media3DTop.vue"],"sourcesContent":["<template>\n <div class=\"relative size-full overflow-hidden rounded\">\n <div\n class=\"flex size-full flex-col items-center justify-center gap-2 bg-modal-card-placeholder-background transition-transform duration-300 group-hover:scale-105 group-data-[selected=true]:scale-105\"\n >\n <i class=\"icon-[lucide--box] text-3xl text-muted-foreground\" />\n <span class=\"text-sm text-base-foreground\">{{\n $t('assetBrowser.media.threeDModelPlaceholder')\n }}</span>\n </div>\n </div>\n</template>\n"],"names":["_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_ctx"],"mappings":"kXACOA,EAAA,CAAA,MAAM,4CAA4C,EAEnDC,EAAA,CAAA,MAAM,6LAA6L,EAG7LC,EAAA,CAAA,MAAM,8BAA8B,kBAL9C,OAAAC,EAAA,EAAAC,EASM,MATNJ,EASM,CARJK,EAOM,MAPNJ,EAOM,aAJJI,EAA+D,IAAA,CAA5D,MAAM,mDAAmD,EAAA,KAAA,EAAA,GAC5DA,EAES,OAFTH,EAESI,EADPC,EAAA,GAAE,2CAAA,CAAA,EAAA,CAAA"}
|
comfyui_frontend_package/static/assets/{MediaAudioBottom-99GB7NqQ.js → MediaAudioBottom-B62n8OnR.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{dq as i,dj as r}from"./index-
|
|
2
|
-
//# sourceMappingURL=MediaAudioBottom-
|
|
1
|
+
import{dq as i,dj as r}from"./index-BODInyrK.js";import{_ as m}from"./MediaTitle.vue_vue_type_script_setup_true_lang-CFkifLSX.js";import{bq as n,E as l,c as t,d as s,z as c,q as p,e as f,u as d,br as u}from"./vendor-other-BxP-0xn6.js";import"./vendor-primevue-rR0TB_Js.js";import"./vendor-vue-BEnTqVKr.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-BsnVSA6y.js";import"./vendor-tiptap-4vvRsqpM.js";const _={class:"flex flex-col items-center gap-1"},x={key:0,class:"flex items-center gap-2 text-xs text-zinc-400"},b=n({__name:"MediaAudioBottom",props:{asset:{}},setup(a){const o=l(()=>i(a.asset.name).filename);return(e,z)=>(s(),t("div",_,[c(m,{"file-name":o.value},null,8,["file-name"]),e.asset.size?(s(),t("div",x,[f("span",null,d(u(r)(e.asset.size)),1)])):p("",!0)]))}});export{b as default};
|
|
2
|
+
//# sourceMappingURL=MediaAudioBottom-B62n8OnR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaAudioBottom-
|
|
1
|
+
{"version":3,"file":"MediaAudioBottom-B62n8OnR.js","sources":["../../src/platform/assets/components/MediaAudioBottom.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col items-center gap-1\">\n <MediaTitle :file-name=\"fileName\" />\n <!-- TBD: File size will be provided by backend history API -->\n <div\n v-if=\"asset.size\"\n class=\"flex items-center gap-2 text-xs text-zinc-400\"\n >\n <span>{{ formatSize(asset.size) }}</span>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport { formatSize, getFilenameDetails } from '@/utils/formatUtil'\n\nimport type { AssetMeta } from '../schemas/mediaAssetSchema'\nimport MediaTitle from './MediaTitle.vue'\n\nconst { asset } = defineProps<{\n asset: AssetMeta\n}>()\n\nconst fileName = computed(() => {\n return getFilenameDetails(asset.name).filename\n})\n</script>\n"],"names":["fileName","computed","getFilenameDetails","__props"],"mappings":"wkBAyBA,MAAMA,EAAWC,EAAS,IACjBC,EAAmBC,EAAA,MAAM,IAAI,EAAE,QACvC"}
|
comfyui_frontend_package/static/assets/{MediaImageBottom-C6Bpu_d9.js → MediaImageBottom-DChcPA0h.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{dq as n}from"./index-
|
|
2
|
-
//# sourceMappingURL=MediaImageBottom-
|
|
1
|
+
import{dq as n}from"./index-BODInyrK.js";import{_ as m}from"./MediaTitle.vue_vue_type_script_setup_true_lang-CFkifLSX.js";import{bq as r,E as c,c as s,d as t,z as l,e as d,q as p,u as a}from"./vendor-other-BxP-0xn6.js";import"./vendor-primevue-rR0TB_Js.js";import"./vendor-vue-BEnTqVKr.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-BsnVSA6y.js";import"./vendor-tiptap-4vvRsqpM.js";const f={class:"flex flex-col items-center gap-1"},_={class:"flex items-center text-xs text-zinc-400"},u={key:0},y=r({__name:"MediaImageBottom",props:{asset:{}},setup(o){const i=c(()=>n(o.asset.name).filename);return(e,h)=>(t(),s("div",f,[l(m,{"file-name":i.value},null,8,["file-name"]),d("div",_,[e.asset.dimensions?(t(),s("span",u,a(e.asset.dimensions?.width)+"x"+a(e.asset.dimensions?.height),1)):p("",!0)])]))}});export{y as default};
|
|
2
|
+
//# sourceMappingURL=MediaImageBottom-DChcPA0h.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaImageBottom-
|
|
1
|
+
{"version":3,"file":"MediaImageBottom-DChcPA0h.js","sources":["../../src/platform/assets/components/MediaImageBottom.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col items-center gap-1\">\n <MediaTitle :file-name=\"fileName\" />\n <div class=\"flex items-center text-xs text-zinc-400\">\n <span v-if=\"asset.dimensions\"\n >{{ asset.dimensions?.width }}x{{ asset.dimensions?.height }}</span\n >\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport { getFilenameDetails } from '@/utils/formatUtil'\n\nimport type { AssetMeta } from '../schemas/mediaAssetSchema'\nimport MediaTitle from './MediaTitle.vue'\n\nconst { asset } = defineProps<{\n asset: AssetMeta\n}>()\n\nconst fileName = computed(() => {\n return getFilenameDetails(asset.name).filename\n})\n</script>\n"],"names":["fileName","computed","getFilenameDetails","__props"],"mappings":"sjBAuBA,MAAMA,EAAWC,EAAS,IACjBC,EAAmBC,EAAA,MAAM,IAAI,EAAE,QACvC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{dr as l}from"./index-
|
|
2
|
-
//# sourceMappingURL=MediaTitle.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
import{dr as l}from"./index-BODInyrK.js";import{bq as n,E as t,c as m,d as c,u as i}from"./vendor-other-BxP-0xn6.js";const r=["title"],_=n({__name:"MediaTitle",props:{fileName:{}},setup(a){const e=a,o=t(()=>e.fileName),s=t(()=>l(e.fileName));return(p,f)=>(c(),m("h3",{class:"m-0 line-clamp-1 text-sm font-bold text-base-foreground",title:o.value},i(s.value),9,r))}});export{_};
|
|
2
|
+
//# sourceMappingURL=MediaTitle.vue_vue_type_script_setup_true_lang-CFkifLSX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaTitle.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
{"version":3,"file":"MediaTitle.vue_vue_type_script_setup_true_lang-CFkifLSX.js","sources":["../../src/platform/assets/components/MediaTitle.vue"],"sourcesContent":["<template>\n <h3\n class=\"m-0 line-clamp-1 text-sm font-bold text-base-foreground\"\n :title=\"fullName\"\n >\n {{ displayName }}\n </h3>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport { truncateFilename } from '@/utils/formatUtil'\n\nconst props = defineProps<{\n fileName: string\n}>()\n\nconst fullName = computed(() => props.fileName)\nconst displayName = computed(() => truncateFilename(props.fileName))\n</script>\n"],"names":["props","__props","fullName","computed","displayName","truncateFilename"],"mappings":"6LAcA,MAAMA,EAAQC,EAIRC,EAAWC,EAAS,IAAMH,EAAM,QAAQ,EACxCI,EAAcD,EAAS,IAAME,EAAiBL,EAAM,QAAQ,CAAC"}
|
comfyui_frontend_package/static/assets/{MediaVideoBottom-DgdszioB.js → MediaVideoBottom-fWb8qHcu.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{dq as i,dj as r}from"./index-
|
|
2
|
-
//# sourceMappingURL=MediaVideoBottom-
|
|
1
|
+
import{dq as i,dj as r}from"./index-BODInyrK.js";import{_ as m}from"./MediaTitle.vue_vue_type_script_setup_true_lang-CFkifLSX.js";import{bq as n,E as l,c as t,d as s,z as c,q as p,e as f,u as d,br as u}from"./vendor-other-BxP-0xn6.js";import"./vendor-primevue-rR0TB_Js.js";import"./vendor-vue-BEnTqVKr.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-BsnVSA6y.js";import"./vendor-tiptap-4vvRsqpM.js";const _={class:"flex flex-col items-center gap-1"},x={key:0,class:"flex items-center text-xs text-zinc-400"},b=n({__name:"MediaVideoBottom",props:{asset:{}},setup(a){const o=l(()=>i(a.asset.name).filename);return(e,z)=>(s(),t("div",_,[c(m,{"file-name":o.value},null,8,["file-name"]),e.asset.size?(s(),t("div",x,[f("span",null,d(u(r)(e.asset.size)),1)])):p("",!0)]))}});export{b as default};
|
|
2
|
+
//# sourceMappingURL=MediaVideoBottom-fWb8qHcu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaVideoBottom-
|
|
1
|
+
{"version":3,"file":"MediaVideoBottom-fWb8qHcu.js","sources":["../../src/platform/assets/components/MediaVideoBottom.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col items-center gap-1\">\n <MediaTitle :file-name=\"fileName\" />\n <!-- TBD: File size will be provided by backend history API -->\n <div v-if=\"asset.size\" class=\"flex items-center text-xs text-zinc-400\">\n <span>{{ formatSize(asset.size) }}</span>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport { formatSize, getFilenameDetails } from '@/utils/formatUtil'\n\nimport type { AssetMeta } from '../schemas/mediaAssetSchema'\nimport MediaTitle from './MediaTitle.vue'\n\nconst { asset } = defineProps<{\n asset: AssetMeta\n}>()\n\nconst fileName = computed(() => {\n return getFilenameDetails(asset.name).filename\n})\n</script>\n"],"names":["fileName","computed","getFilenameDetails","__props"],"mappings":"kkBAsBA,MAAMA,EAAWC,EAAS,IACjBC,EAAmBC,EAAA,MAAM,IAAI,EAAE,QACvC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var z=Object.defineProperty;var l=(h,d)=>z(h,"name",{value:d,configurable:!0});import{s as D,u as P}from"./vendor-vue-BEnTqVKr.js";import{q as E,s as b}from"./vendor-primevue-rR0TB_Js.js";import{e as M,f as O,M as G,dp as H,_ as C,dl as J,bm as K}from"./index-
|
|
2
|
-
//# sourceMappingURL=ServerConfigPanel-
|
|
1
|
+
var z=Object.defineProperty;var l=(h,d)=>z(h,"name",{value:d,configurable:!0});import{s as D,u as P}from"./vendor-vue-BEnTqVKr.js";import{q as E,s as b}from"./vendor-primevue-rR0TB_Js.js";import{e as M,f as O,M as G,dp as H,_ as C,dl as J,bm as K}from"./index-BODInyrK.js";import{u as Q}from"./serverConfigStore-Rd8VWEbH.js";import{bq as W,w as x,d8 as X,j as m,d as t,k as a,c as u,F as y,y as _,br as o,q as S,e as r,u as n,z as p,A as V}from"./vendor-other-BxP-0xn6.js";import"./vendor-xterm-CWYFmgbN.js";import"./vendor-three-BsnVSA6y.js";import"./vendor-tiptap-4vvRsqpM.js";const Y={class:"flex flex-col gap-2"},Z={class:"flex justify-end gap-2"},ee={class:"flex items-center justify-between"},de=W({__name:"ServerConfigPanel",setup(h){const d=M(),k=Q(),$=O(),{serverConfigsByCategory:A,serverConfigValues:T,launchArgs:B,commandLineArgs:v,modifiedConfigs:g}=D(k);let w=!1;const I=l(()=>{k.revertChanges()},"revertChanges"),q=l(async()=>{w=!0,await K().restartApp()},"restartApp");x(B,async e=>{await d.set("Comfy.Server.LaunchArgs",e)}),x(T,async e=>{await d.set("Comfy.Server.ServerConfigValues",e)});const{copyToClipboard:j}=G(),L=l(async()=>{await j(v.value)},"copyCommandLineArgs"),{t:f}=P();X(()=>{w||g.value.length!==0&&$.add({severity:"warn",summary:f("serverConfig.restartRequiredToastSummary"),detail:f("serverConfig.restartRequiredToastDetail"),life:1e4})});const N=l(e=>({...e,name:f(`serverConfigItems.${e.id}.name`,e.name),tooltip:e.tooltip?f(`serverConfigItems.${e.id}.tooltip`,e.tooltip):void 0}),"translateItem");return(e,c)=>(t(),m(J,{value:"Server-Config",class:"server-config-panel"},{header:a(()=>[r("div",Y,[o(g).length>0?(t(),m(o(b),{key:0,severity:"info","pt:text":"w-full"},{default:a(()=>[r("p",null,n(e.$t("serverConfig.modifiedConfigs")),1),r("ul",null,[(t(!0),u(y,null,_(o(g),s=>(t(),u("li",{key:s.id},n(s.name)+": "+n(s.initialValue)+" → "+n(s.value),1))),128))]),r("div",Z,[p(C,{variant:"secondary",onClick:I},{default:a(()=>[V(n(e.$t("serverConfig.revertChanges")),1)]),_:1}),p(C,{variant:"destructive",onClick:q},{default:a(()=>[V(n(e.$t("serverConfig.restart")),1)]),_:1})])]),_:1})):S("",!0),o(v)?(t(),m(o(b),{key:1,severity:"secondary","pt:text":"w-full"},{icon:a(()=>c[0]||(c[0]=[r("i",{class:"icon-[lucide--terminal] text-xl font-bold"},null,-1)])),default:a(()=>[r("div",ee,[r("p",null,n(o(v)),1),p(C,{size:"icon",variant:"muted-textonly",onClick:L},{default:a(()=>c[1]||(c[1]=[r("i",{class:"pi pi-clipboard"},null,-1)])),_:1})])]),_:1})):S("",!0)])]),default:a(()=>[(t(!0),u(y,null,_(Object.entries(o(A)),([s,F],R)=>(t(),u("div",{key:s},[R>0?(t(),m(o(E),{key:0})):S("",!0),r("h3",null,n(e.$t(`serverConfigCategories.${s}`,s)),1),(t(!0),u(y,null,_(F,i=>(t(),u("div",{key:i.name,class:"mb-4"},[p(H,{id:i.id,"form-value":i.value,"onUpdate:formValue":l(U=>i.value=U,"onUpdate:formValue"),item:N(i),"label-class":{"text-highlight":i.initialValue!==i.value}},null,8,["id","form-value","onUpdate:formValue","item","label-class"])]))),128))]))),128))]),_:1}))}});export{de as default};
|
|
2
|
+
//# sourceMappingURL=ServerConfigPanel-umnHESaV.js.map
|