@imagineio/configurator-sdk 0.1.0 → 0.1.1
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.
- package/dist/87bb469216.js +1 -1
- package/package.json +1 -1
package/dist/87bb469216.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Fragment as ne,jsx as g,jsxs as rt}from"react/jsx-runtime";import{useCallback as nt,useEffect as K,useMemo as X,useRef as te,useState as Pt,useSyncExternalStore as Ne}from"react";import{Html as un,useProgress as pn}from"@react-three/drei";import F from"./9c6c598569.js";import $ from"./872c4302e0.js";import R from"./be337ddda5.js";import mt from"./d94df858ea.js";import{normalizeMaterialTargets as hn}from"./dc2a1a0e13.js";import A from"./8f60e5059a.js";import mn from"./60d697292c.js";import fn from"./811b403d43.js";import{useUiToggles as gn}from"./d0f9681634.js";import{ProductInstance as ee,SelectionActionPanel as In,FreeMovable as Sn,PlacementGaps as yn,SceneStage as bn,SceneRoom as vn,SceneProductsSource as Pn}from"./8a3a57c008.js";import Mn from"./205827c5c8.js";import{computeTargets as xn,resolveTarget as wn,resolveTargetRenderer as Cn,resolveInsertSequence as _n}from"./58e6419ba8.js";import{disarmPlacement as Xe}from"./ab6c80484f.js";import{resolveComponent as Ze,useComponentRegistry as Tn}from"./882bc739c8.js";import{SlotHost as Fn}from"./73f7d65985.js";import{ModalHost as Gn}from"./09c4973968.js";import On from"./6c0a2572dd.js";import An from"./20b0104576.js";import{getConfigState as kn,subscribe as He,getVersion as kt}from"./817d930a49.js";import{getPlacementStrategy as je}from"./281cf952fa.js";import{resolveAddMode as Dn,armPlacement as Rn}from"./ab6c80484f.js";import{resolveReplaceTarget as Ln}from"./4d7a0d1897.js";import{enforceCorners as qn}from"./388cadacbd.js";import{resolvePlacementStrategyConfig as Ve}from"./281cf952fa.js";import{getLabel as zn}from"./28d887bf8a.js";import{isAddFeature as En}from"./8c27edda0f.js";import{usePlacementInteraction as Nn}from"./4b8958aa4c.js";import{refreshCanonicalState as Xn,seedInitialState as Zn,addProduct as Dt}from"./a77b15c0d6.js";import{resolveLayout as Hn,hasLayout as jn,useLayoutRegistry as Vn,layoutOverride as Un,_publishResolvedLayoutKey as Wn}from"./31ea036f5c.js";import{themeLayoutKey as Yn,useSystemTheme as Bn}from"./5c9fd9201c.js";import"./1a2629800a.css";import{runIntent as Rt,INTENTS as Lt}from"./6d238282c1.js";function Kn(){const x=mt(r=>r.sceneSelections),I=mt(r=>r.selectionOrder),h=F(r=>r.activeSceneConfigId),u=R(r=>r.defaultPresetId),i=R(r=>r.sceneConfigurations),G=R(r=>r.getSceneFeatures),S=Ne(He,kt,kt);return X(()=>{const r=h||u||Object.keys(i||{})[0],ft=r?G(r):[],U=$.getState(),b=[],Q=new Set,at=(c,O)=>{if(!c||c.id==null||Q.has(String(c.id))||O>4)return;Q.add(String(c.id)),b.push(c);const P=(U.features?.[c.id]||U.features?.[String(c.id)])?.childOptionSetIds||[];for(const M of P){const d=U.features?.[M]||U.features?.[String(M)];d&&at({id:M,type:d.type,sequence:d.sequence},O+1)}};for(const c of ft)at(c,0);const ct=b.filter(c=>/finish/i.test(c.type||"")&&x[c.id]!=null).sort((c,O)=>{const E=I?.[String(c.id)]??-1,P=I?.[String(O.id)]??-1;return E!==P?E-P:(c.sequence??0)-(O.sequence??0)}),y={};for(const c of ct){const O=x[c.id],E=U.options?.[O]?.value;if(E==null)continue;const P=U.features?.[c.id]||{},M=hn(P.materialTargets??P.material_targets??P.materials);for(const d of M)y[String(d).toLowerCase()]=E}return y},[x,I,h,u,i,G,S])}function $n(x,I){if(I==null)return null;const h=String(I);for(const u of Object.values(x.products||{})){const i=u?.components_configuration||u?.componentsConfiguration;if(!(!i||typeof i!="object"))for(const G of Object.values(i))for(const S of Array.isArray(G)?G:[G]){const r=S&&typeof S=="object"?S.componentId??S.component_id:S;if(r!=null&&String(r)===h)return u}}return null}function Qn(x){const I=mt(b=>b.sceneSelections),h=mt(b=>b.setSceneSelection),u=R(b=>b.getSceneFeatures),i=R(b=>b.sceneConfigurations),G=Ne(He,kt,kt),S=X(()=>new Set((x?u(x)||[]:[]).filter(b=>En(b)).map(b=>String(b.id))),[x,u,i,G]),r=te({}),ft=te(!1),U=mt(b=>b.sceneSelectionsSettled);K(()=>{if(!U){r.current={...I};return}if(!ft.current){ft.current=!0;let y=!1;for(const[c,O]of Object.entries(I||{}))O==null||!S.has(String(c))||(h(c,null),y=!0);if(y){r.current={...I};return}}const b=r.current,Q=[];for(const[y,c]of Object.entries(I||{}))b[y]===c||c==null||S.has(String(y))&&Q.push([y,c]);if(r.current={...I},!Q.length)return;const at=R.getState().systemId;let ct=!1;return(async()=>{const y=$.getState(),c=F.getState();for(const[O,E]of Q){const P=y.options?.[E];let M=P?.valueProductVariantId??P?.value_product_variant_id??P?.value_product_variant??P?.variantId??P?.variant_id??null,d=M!=null?y.getProduct?.(M):null;if(d==null){const m=P?.value??(y.optionToProducts?.[String(E)]||[])[0]??P?.product_id??P?.productId??null;d=m!=null?y.getProduct?.(m):null,d==null&&m!=null&&y.getComponent?.(m)&&(d=$n(y,m)),M=d?.id??M??m}else M=d?.id??M;if(M==null){h(O,null);continue}const it=d?.id??M,W=d?.placementGroup??d?.placement_group??null,J=d?.productGraph??d?.product_graph??null,lt=d?.compatibleSlots??d?.compatible_slots??null;if(Array.isArray(lt)&<.length){const m=new Set(lt.map(String));if(Object.values(c.productInstances||{}).some(Z=>{const f=y.getProduct?.(Z.variantId)||y.getProduct?.(Z.productId),It=f?.product_graph??f?.productGraph;return It!=null&&m.has(String(It))})){A.getState().setPendingSlotPlacement?.({productId:it,variantId:M,name:d?.name??d?.displayName??d?.variantName??"product",compatibleGraphIds:Array.from(m)}),h(O,null);continue}}if(Dn(at,d)==="arm"){Rn({productId:it,variantId:M});const m=je(),wt=typeof m?.computeTargets=="function",Z=Object.prototype.hasOwnProperty.call(m??{},"armHint")?m.armHint:zn(wt?"placement.armedPickTarget":"placement.armedPickGap",wt?"":"Click a + between pieces to insert it.");Z&&A.getState().showInfo?.(Z),h(O,null);continue}const q=F.getState(),Mt=q.selectedInstanceId,Y=Mt!=null?(q.productInstances||{})[Mt]:null,qt=Y&&Number.isFinite(Number(Y.sequence))?Number(Y.sequence):void 0,gt=Ln({placementGroup:W}),dt=gt!=null?(q.productInstances||{})[gt]:null,oe=dt&&Number.isFinite(Number(dt.sequence))?Number(dt.sequence):qt,se=Array.isArray(dt?.position)?dt.position:[0,0,0];let xt=null;try{xt=await Rt({type:Lt.PRODUCT_ADD,productGraphId:J,variantId:M,placementGroup:W,sequence:oe,replacePlacementId:gt??void 0},m=>Dt({productGraphId:m.productGraphId,variantId:m.variantId,placementGroup:m.placementGroup,position:se,sequence:m.sequence,replace:m.replacePlacementId!=null,replacePlacementId:m.replacePlacementId}))}catch{}if(h(O,null),ct)return}})(),()=>{ct=!0}},[I,S,x,h])}function Jn({position:x,onClick:I}){const[h,u]=Pt(!1);return g(un,{position:x,center:!0,style:{pointerEvents:"auto"},zIndexRange:[100,0],children:g("div",{onClick:I,onPointerEnter:()=>u(!0),onPointerLeave:()=>u(!1),style:{width:22,height:22,borderRadius:"50%",background:h?"#ff8a65":"rgba(255, 87, 34, 0.85)",display:"flex",alignItems:"center",justifyContent:"center",color:"var(--bg-primary, #fff)",fontSize:13,fontWeight:"bold",boxShadow:"0 1px 4px rgba(0,0,0,0.3)",cursor:"pointer",transition:"transform 0.2s",transform:h?"scale(1.15)":"scale(1)"},children:"+"})})}function to({isMobile:x}={}){Tn();const I=Ze("SelectionActionPanel",In),h=F(t=>t.productInstances),u=$(t=>t.getProduct),i=$(t=>t.componentGroups),G=F(t=>t.clearSelection),S=F(t=>t.selectedInstanceId),r=F(t=>t.isFocusing),ft=F(t=>t.removeProductInstance),U=F(t=>t.addProductInstance),b=F(t=>t.updateInstancePosition),Q=F(t=>t.updateInstanceRotation),at=F(t=>t.activeSceneConfigId),ct=R(t=>t.defaultPresetId),y=R(t=>t.sceneConfigurations),c=R(t=>t.systemId),O=R(t=>t.useTransform),E=A(t=>t.sceneCapabilities),P=A(t=>t.showWalls),M=A(t=>t.showDimensions),d=A(t=>t.pendingSlotPlacement),it=Kn(),W=A(t=>t.hostMaterialOverrides),J=(kn()||{}).room||null,lt=at||ct||Object.keys(y||{})[0]||null;Qn(lt);const[q,Mt]=Pt(!0),[Y,qt]=Pt(!1),gt=nt(async()=>{try{await Zn()}catch{}qt(!0)},[]),{edgeOf:dt,cornerOf:oe,isHostAnchored:se,isMovable:xt,rawFree:m,splitReliable:wt,freeInstances:Z,ordered:f,syntheticHosts:It,moveInFlightRef:no}=mn(),Ct=X(()=>new Map(It.map(t=>[t.hostedProductId,t])),[It]),[St,We]=Pt({}),zt=nt((t,e)=>{We(n=>{const o=n[t],a=e.full||null;return o&&o.width===e.width&&o.depth===e.depth&&o.height===e.height&&o.cx===e.cx&&o.cz===e.cz&&(o.full?.width??null)===(a?.width??null)&&(o.full?.height??null)===(a?.height??null)&&(o.full?.depth??null)===(a?.depth??null)?n:{...n,[t]:{width:e.width,depth:e.depth,height:e.height,cx:e.cx,cz:e.cz,full:a}}})},[]),ut=nt(t=>St[t]||null,[St]),re=$(t=>t.placementBoundsExcludeIds),ae=X(()=>new Set((re||[]).map(t=>String(t))),[re]),Et=nt((t,e)=>{const n=t?.componentId??e?.id??e?.componentId??null;return n!=null&&ae.has(String(n))||/leg|arm/i.test(String(t?.slotKey||""))?!0:(e?.groups||e?.group_ids||[]).some(a=>{const l=i?.[a]||i?.[String(a)];return/leg|arm/i.test(String(l?.name??l?.slotKey??l?.slot_key??""))})},[i,ae]),yt=te(!1),L=f.length+Z.length,Nt=X(()=>[...f,...Z],[f,Z]),pt=L>0&&Nt.every(t=>St[t.productId]),Xt=X(()=>Nt.filter(t=>St[t.productId]).length,[Nt,St]),{active:ce,loaded:ie,total:Zt}=pn(),le=A(t=>t.isEvaluating),_t=A(t=>t.isLayoutLoading),de=A(t=>t.bootEvaluating);K(()=>{if(!Y)return;const t=!ce&&(Zt===0||ie>=Zt),e=(pt||L===0)&&t&&!le&&!de,n=()=>{Mt(!1),A.getState().endBootLoading()};if(e){const a=setTimeout(n,900);return()=>clearTimeout(a)}const o=setTimeout(n,15e3);return()=>clearTimeout(o)},[Y,pt,L,Xt,ce,ie,Zt,le,de]);const[ue,pe]=Pt(!1);K(()=>{if(!q){pe(!1);return}(pt&&L>0||Y&&L===0)&&pe(!0)},[pt,L,Y,q]);const he=Y?ue||L===0?"Finishing up\u2026":`Loading products\u2026 ${Math.min(Xt,L)}/${L}`:"Preparing your configurator\u2026",me=ue?100:L>0?Math.min(Math.round(Xt/L*100),92):0;K(()=>{q&&A.getState().setBootPhase(he,me)},[q,he,me]),K(()=>(A.setState({initialSceneLoading:q}),()=>A.setState({initialSceneLoading:!1})),[q]),K(()=>{_t&&(yt.current=!1)},[_t]),K(()=>{if(L===0){yt.current=!1;return}if(yt.current||q||_t||!pt)return;const t=requestAnimationFrame(()=>{yt.current||(F.getState().resetCameraToDefault?.({instant:!0}),yt.current=!0)});return()=>cancelAnimationFrame(t)},[L,q,_t,pt]);const bt=je(),Tt=X(()=>f.map(t=>{const e=Ct.get(t.id);return e?{...t,productId:e.hostVariantId}:t}),[f,Ct]),fe=O||!!y?.[lt]?.useTransform,N=F(t=>t.pendingPlacementPiece),ge=!!N&&typeof bt?.computeTargets=="function"&&!!Cn(),ot=X(()=>{const t={getProduct:u,getDims:ut,useTransform:fe,candidate:N,openSlots:ge,config:Ve()},e=bt.computeLayout?bt.computeLayout(Tt,t):Tt.map(()=>({position:[0,0,0],rotation:[0,0,0]}));return qn(e,Tt,t,bt)},[bt,Tt,u,ut,fe,N,ge]),H=X(()=>{const e=J?.height>0?J.height:2.7,n=.1,o=.05,a=new Map;let l=1/0,w=-1/0,k=1/0,p=-1/0,j=0,D=!1;if(f.forEach((s,V)=>{const C=ot[V];if(!C||xt(s))return;const v=C.position||[0,0,0],_=ut(s.productId),B=u(s.productId),z=_?.full||_,Kt=z?.height>0?z.height:B?.height>0?B.height*.0254:0,Ot=(v[1]||0)+Kt;if(Ot>j&&(j=Ot),(s.positionedAbove??s.positioned_above)!=null)return;const $t=(v[1]||0)<=.01,At=-((Array.isArray(C.rotation)?C.rotation[1]:0)||0),Qt=_?.depth>0?_.depth:B?.depth>0?B.depth*.0254:.6,Jt=_?.width>0?_.width:B?.width>0?B.width*.0254:.9,tt=Math.cos(At),et=Math.sin(At),Me=_?.cx||0,xe=_?.cz||0,we=v[0]+tt*Me-et*xe,Ce=v[2]+et*Me+tt*xe,_e=(Jt*Math.abs(tt)+Qt*Math.abs(et))/2,Te=(Jt*Math.abs(et)+Qt*Math.abs(tt))/2,Fe=we-_e,Ge=we+_e,Oe=Ce-Te,Ae=Ce+Te,ke=z?.width>0?z.width:Jt,De=z?.depth>0?z.depth:Qt,Re=v[0]+tt*(z?.cx||0)-et*(z?.cz||0),Le=v[2]+et*(z?.cx||0)+tt*(z?.cz||0),qe=(ke*Math.abs(tt)+De*Math.abs(et))/2,ze=(ke*Math.abs(et)+De*Math.abs(tt))/2,an=Re-qe,cn=Re+qe,ln=Le-ze,dn=Le+ze,Ee=String((Math.round(At/(Math.PI/2))%4+4)%4),T=a.get(Ee)||{heading:At,minX:1/0,maxX:-1/0,minZ:1/0,maxZ:-1/0,fMinX:1/0,fMaxX:-1/0,fMinZ:1/0,fMaxZ:-1/0,hasFloor:!1};T.minX=Math.min(T.minX,Fe),T.maxX=Math.max(T.maxX,Ge),T.minZ=Math.min(T.minZ,Oe),T.maxZ=Math.max(T.maxZ,Ae),$t&&(T.fMinX=Math.min(T.fMinX,Fe),T.fMaxX=Math.max(T.fMaxX,Ge),T.fMinZ=Math.min(T.fMinZ,Oe),T.fMaxZ=Math.max(T.fMaxZ,Ae),T.hasFloor=!0),a.set(Ee,T),l=Math.min(l,an),w=Math.max(w,cn),k=Math.min(k,ln),p=Math.max(p,dn),D=!0}),!D)return null;const ht=Math.max(e,j>0?j+.02:e),Ft=[...a.values()].map(s=>{const V=Math.sin(s.heading),C=Math.cos(s.heading),v=V,_=-C,B=Math.abs(v)>Math.abs(_),z=s.hasFloor?s.fMinX:s.minX,Kt=s.hasFloor?s.fMaxX:s.maxX,Ot=s.hasFloor?s.fMinZ:s.minZ,$t=s.hasFloor?s.fMaxZ:s.maxZ,Pe=B?(v>0?Kt:z)+(v>0?n/2:-n/2):(_>0?$t:Ot)+(_>0?n/2:-n/2);return{g:s,isSide:B,plane:Pe}}),nn=Ft.filter(s=>s.isSide).map(s=>s.plane),on=Ft.filter(s=>!s.isSide).map(s=>s.plane),Vt=[];for(const s of Ft){const{g:V}=s;if(s.isSide){let C=V.minZ,v=V.maxZ;for(const _ of on)C=Math.min(C,_),v=Math.max(v,_);Vt.push({cx:s.plane,cz:(C+v)/2,cy:ht/2,length:v-C+o*2,thickness:n,height:ht,rotY:Math.PI/2})}else{let C=V.minX,v=V.maxX;for(const _ of nn)C=Math.min(C,_),v=Math.max(v,_);Vt.push({cx:(C+v)/2,cz:s.plane,cy:ht/2,length:v-C+o*2,thickness:n,height:ht,rotY:0})}}const Gt=.4,ve=w>l&&p>k;let Ut=l-Gt,Wt=w+Gt,Yt=k-Gt,Bt=p+Gt;for(const s of Ft){const V=Math.sin(s.g.heading),C=-Math.cos(s.g.heading);s.isSide?V<0?Ut=s.plane-n/2:Wt=s.plane+n/2:C<0?Yt=s.plane-n/2:Bt=s.plane+n/2}const sn=ve?{cx:(Ut+Wt)/2,cz:(Yt+Bt)/2,w:Wt-Ut,d:Bt-Yt}:null,rn=ve?{minX:l,maxX:w,minZ:k,maxZ:p,w:w-l,d:p-k,h:ht,height:j>0?j:ht}:null;return{segments:Vt,floor:sn,bbox:rn}},[f,ot,J,ut,u,xt]),Ye=P&&!!(H&&H.segments&&H.segments.length),Be=M&&!!(H&&H.bbox&&H.bbox.w>0),Ke=(t,e)=>{const n=ot[e]||{position:[0,0,0],rotation:[0,0,0]},o=Ct.get(t.id);if(!o)return n;const a=n.position||[0,0,0],l=(Array.isArray(n.rotation)?n.rotation[1]:0)||0,w=Math.cos(l),k=Math.sin(l),p=o.offset||[0,0,0];return{position:[a[0]+(p[0]||0)*w+(p[2]||0)*k,a[1]+(p[1]||0),a[2]-(p[0]||0)*k+(p[2]||0)*w],rotation:[0,l+(o.rotDegY||0)*Math.PI/180,0]}},st=d,vt=!!st,Ie=X(()=>{if(!st)return new Set;const t=new Set((st.compatibleGraphIds||[]).map(String)),e=new Set;for(const n of Object.values(h||{})){const o=u(n.variantId)||u(n.productId),a=o?.product_graph??o?.productGraph;a!=null&&t.has(String(a))&&e.add(String(n.id))}return e},[st,h,u]),Ht=nt(()=>{A.getState().clearPendingSlotPlacement?.(),A.getState().clearPendingHostedProduct?.()},[]),Se=nt((t,e)=>{if(!e)return;const n=$.getState(),o=n.getProduct?.(e.variantId)||n.getProduct?.(e.productId),a=o?.productGraph??o?.product_graph??null,l=F.getState().productInstances?.[String(t)],w=o?.placementGroup??o?.placement_group??l?.placementGroup??null,k=Array.isArray(l?.position)?l.position:[0,0,0],p=l?.variantId??l?.productId??null,j=Number.isFinite(Number(l?.sequence))?Number(l.sequence):void 0;Ht(),Rt({type:Lt.PRODUCT_ADD,productGraphId:a,variantId:e.variantId??e.productId,placementGroup:w,sequence:j,hostPlacementId:String(t),hostVariantId:p},D=>Dt({productGraphId:D.productGraphId,variantId:D.variantId,placementGroup:D.placementGroup,position:k,sequence:D.sequence,hostPlacementId:D.hostPlacementId,hostVariantId:D.hostVariantId}).catch(()=>{}))},[Ht]),jt=nt((t,e)=>{const n=$.getState(),o=n.getProduct?.(e.variantId)||n.getProduct?.(e.productId),a=o?.productGraph??o?.product_graph??null,l=o?.placementGroup??o?.placement_group??null,w=f[t-1]||f[t],k=Array.isArray(w?.position)?w.position:[0,0,0],p=f[t],j=p&&Number.isFinite(Number(p.sequence))?Number(p.sequence):void 0;Rt({type:Lt.PRODUCT_ADD,productGraphId:a,variantId:e.variantId??e.productId,placementGroup:l,sequence:j},D=>Dt({productGraphId:D.productGraphId,variantId:D.variantId,placementGroup:D.placementGroup,position:k,sequence:D.sequence}).catch(()=>{}))},[f]);K(()=>{if(!N||f.length>0)return;const t=N;Xe(),jt(0,t)},[N,f.length,jt]);const{gaps:$e,onInsert:Qe}=Nn({systemId:c,count:f.length,positionOf:t=>ot[t]?.position||[0,0,0],insertAt:jt}),ye=X(()=>{if(!N)return[];const t=$.getState();return xn(f,{candidate:N,getProduct:e=>t.getProduct?.(e),getDims:ut,config:Ve(),layout:ot})},[N,f,ot,ut]),Je=nt(t=>{const e=wn(t,{candidate:N});if(!e)return;const n=$.getState(),o=n.getProduct?.(e.variantId)||n.getProduct?.(e.productId),a=o?.productGraph??o?.product_graph??null,l=o?.placementGroup??o?.placement_group??null,w=e.transform?.position??t.position??[0,0,0],k=_n(e,t,f);Rt({type:Lt.PRODUCT_ADD,productGraphId:a,variantId:e.variantId??e.productId,placementGroup:l,anchor:e.anchor??null,sequence:k},p=>Dt({productGraphId:p.productGraphId,variantId:p.variantId,placementGroup:p.placementGroup,position:w,sequence:p.sequence}).catch(()=>{})),Xe()},[N,f]),{selectedInst:oo,swapOrder:so,panelActions:be,priceInfo:tn}=fn(),en=gn()("selectionPanel");K(()=>{if(S==null)return;const t=h||{},e=String(S),n="__host";if(e.endsWith(n)){const o=e.slice(0,-n.length);if(t[o]||Object.values(t).some(a=>String(a?.id??a?.instanceId)===o))return}else if(t[S]||Object.values(t).some(o=>String(o?.instanceId??o?.id)===e))return;G?.()},[S,h,G]);const ao=mt(t=>t.placementPricing),co=R(t=>t.getChannelPriceConfig);return rt(ne,{children:[g(Pn,{onSeeded:gt}),rt(bn,{isMobile:x,camera:{position:[2.6,2.2,4],fov:45},controlsTarget:[0,.5,0],onPointerMissed:()=>G?.(),groundShadowCatcher:!0,overlay:rt(ne,{children:[!vt&&be&&en?g(I,{actions:be,priceInfo:tn}):null,vt&&g("div",{className:"placement-mode-overlay",children:rt("div",{className:"placement-mode-overlay__content",children:[rt("span",{className:"placement-mode-overlay__text",children:["Click on a highlighted slot to place ",g("strong",{children:st?.name})]}),g("button",{type:"button",className:"placement-mode-overlay__cancel",onClick:Ht,children:g("span",{className:"placement-mode-overlay__cancel-text",children:"Cancel"})})]})}),g(Fn,{name:"overlay"}),r&&g("div",{"aria-hidden":"true",style:{position:"absolute",inset:0,zIndex:30,cursor:"default"}})]}),children:[Ye&&g(vn,{width:J?.width,depth:J?.depth,height:J?.height??H?.bbox?.h??2.7,showCeiling:E?.ceiling===!0,segments:H?.segments||null,floor:H?.floor||null}),Be&&(()=>{const t=Ze("SceneDimensions",An);return g(t,{bbox:H.bbox})})(),f.map((t,e)=>{const n=Ct.get(t.id),o=ot[e]||{position:[0,0,0],rotation:[0,0,0]};return o.hidden?null:rt("group",{children:[n&&g(ee,{instance:{id:n.id,instanceId:n.id,productId:n.hostVariantId,variantId:n.hostVariantId,position:o.position||[0,0,0],rotation:o.rotation||[0,0,0]},slotMaterials:{...it,...W?.[n.hostedProductId]||{},...W?.[n.id]||{}},stateInstanceId:n.hostedProductId,onSelect:()=>F.getState().selectInstance(n.id),isSelected:String(S)===String(n.id),onMeasure:a=>zt(n.hostVariantId,a),footprintExcludeItem:Et,hoverable:!0,focusable:!0},n.id),g(ee,{instance:{...t,...Ke(t,e)},slotMaterials:{...it,...W?.[t.id]||W?.[t.instanceId]||{}},onSelect:(a,l,w)=>{if(vt){Ie.has(String(t.id))&&Se(t.id,st);return}F.getState().selectInstance(a,w??null)},isSelected:!vt&&String(S)===String(t.instanceId??t.id),onMeasure:a=>zt(t.productId,a),footprintExcludeItem:Et,hoverable:!0,focusable:!0}),vt&&Ie.has(String(t.id))&&g(Jn,{position:[o.position?.[0]||0,(o.position?.[1]||0)+.45,o.position?.[2]||0],onClick:()=>Se(t.id,st)})]},t.id??t.instanceId??e)}),Z.map((t,e)=>g(Sn,{selected:S===t.id,disabled:!!t.locked,position:t.position||[0,0,0],rotationY:(Array.isArray(t.rotation)&&t.rotation[1]||0)*Math.PI/180,onCommit:({position:n,rotationY:o})=>{b(t.id,n),Q(t.id,[0,o*180/Math.PI,0]),Xn({allowRevert:!0}).catch(()=>{})},children:g(ee,{instance:{...t,position:[0,0,0],rotation:[0,0,0]},slotMaterials:{...it,...W?.[t.id]||W?.[t.instanceId]||{}},onMeasure:n=>zt(t.productId,n),footprintExcludeItem:Et})},t.id??t.instanceId??`free-${e}`)),ye.length>0?g(Mn,{targets:ye,onPick:Je}):g(yn,{gaps:$e,onInsert:Qe})]})]})}const Ue=new Set;function eo(){Vn();const x=R(r=>r.systemLayoutTemplate),I=R(r=>r.systemTheme),h=R(r=>r.systemThemeRecord);Bn(I,h);const u=Yn(h)||(I?String(I).trim().toLowerCase():null);let i=x;try{const r=new URLSearchParams(window.location.search);r.has("template")?i=r.get("template"):r.has("theme")&&(i=r.get("theme"))}catch{}i=i||x||u||null;const G=Un();G&&(i=G),!G&&!x&&i&&i===u&&!jn(i)&&!/^theme\d+$/.test(i)&&!Ue.has(i)&&Ue.add(i),Wn(i);const S=Hn(i);return rt(ne,{children:[g(S,{Scene:to,template:i}),g(Gn,{}),g(On,{})]})}export{to as SharedConfiguratorScene,eo as default};
|
|
1
|
+
import{Fragment as ne,jsx as g,jsxs as rt}from"react/jsx-runtime";import{useCallback as nt,useEffect as K,useMemo as X,useRef as te,useState as Pt,useSyncExternalStore as Ne}from"react";import{Html as un,useProgress as pn}from"@react-three/drei";import G from"./9c6c598569.js";import $ from"./872c4302e0.js";import R from"./be337ddda5.js";import mt from"./d94df858ea.js";import{normalizeMaterialTargets as hn}from"./dc2a1a0e13.js";import k from"./8f60e5059a.js";import mn from"./60d697292c.js";import fn from"./811b403d43.js";import{useUiToggles as gn}from"./d0f9681634.js";import{ProductInstance as ee,SelectionActionPanel as In,FreeMovable as Sn,PlacementGaps as yn,SceneStage as bn,SceneRoom as vn,SceneProductsSource as Pn}from"./8a3a57c008.js";import Mn from"./205827c5c8.js";import{computeTargets as xn,resolveTarget as wn,resolveTargetRenderer as Cn,resolveInsertSequence as _n}from"./58e6419ba8.js";import{disarmPlacement as Xe}from"./ab6c80484f.js";import{resolveComponent as Ze,useComponentRegistry as Tn}from"./882bc739c8.js";import{SlotHost as Gn}from"./73f7d65985.js";import{ModalHost as On}from"./09c4973968.js";import Fn from"./6c0a2572dd.js";import kn from"./20b0104576.js";import{getConfigState as An,subscribe as He,getVersion as Dt}from"./817d930a49.js";import{getPlacementStrategy as je}from"./281cf952fa.js";import{resolveAddMode as Dn,armPlacement as Rn}from"./ab6c80484f.js";import{resolveReplaceTarget as Ln}from"./4d7a0d1897.js";import{enforceCorners as zn}from"./388cadacbd.js";import{resolvePlacementStrategyConfig as Ve}from"./281cf952fa.js";import{getLabel as qn}from"./28d887bf8a.js";import{isAddFeature as En}from"./8c27edda0f.js";import{usePlacementInteraction as Nn}from"./4b8958aa4c.js";import{refreshCanonicalState as Xn,seedInitialState as Zn,addProduct as Rt}from"./a77b15c0d6.js";import{resolveLayout as Hn,hasLayout as jn,useLayoutRegistry as Vn,layoutOverride as Un,_publishResolvedLayoutKey as Wn}from"./31ea036f5c.js";import{themeLayoutKey as Yn,useSystemTheme as Bn}from"./5c9fd9201c.js";import"./1a2629800a.css";import{runIntent as Lt,INTENTS as zt}from"./6d238282c1.js";function Kn(){const x=mt(r=>r.sceneSelections),I=mt(r=>r.selectionOrder),h=G(r=>r.activeSceneConfigId),u=R(r=>r.defaultPresetId),i=R(r=>r.sceneConfigurations),O=R(r=>r.getSceneFeatures),S=Ne(He,Dt,Dt);return X(()=>{const r=h||u||Object.keys(i||{})[0],ft=r?O(r):[],U=$.getState(),b=[],Q=new Set,at=(c,F)=>{if(!c||c.id==null||Q.has(String(c.id))||F>4)return;Q.add(String(c.id)),b.push(c);const P=(U.features?.[c.id]||U.features?.[String(c.id)])?.childOptionSetIds||[];for(const M of P){const d=U.features?.[M]||U.features?.[String(M)];d&&at({id:M,type:d.type,sequence:d.sequence},F+1)}};for(const c of ft)at(c,0);const ct=b.filter(c=>/finish/i.test(c.type||"")&&x[c.id]!=null).sort((c,F)=>{const E=I?.[String(c.id)]??-1,P=I?.[String(F.id)]??-1;return E!==P?E-P:(c.sequence??0)-(F.sequence??0)}),y={};for(const c of ct){const F=x[c.id],E=U.options?.[F]?.value;if(E==null)continue;const P=U.features?.[c.id]||{},M=hn(P.materialTargets??P.material_targets??P.materials);for(const d of M)y[String(d).toLowerCase()]=E}return y},[x,I,h,u,i,O,S])}function $n(x,I){if(I==null)return null;const h=String(I);for(const u of Object.values(x.products||{})){const i=u?.components_configuration||u?.componentsConfiguration;if(!(!i||typeof i!="object"))for(const O of Object.values(i))for(const S of Array.isArray(O)?O:[O]){const r=S&&typeof S=="object"?S.componentId??S.component_id:S;if(r!=null&&String(r)===h)return u}}return null}function Qn(x){const I=mt(b=>b.sceneSelections),h=mt(b=>b.setSceneSelection),u=R(b=>b.getSceneFeatures),i=R(b=>b.sceneConfigurations),O=Ne(He,Dt,Dt),S=X(()=>new Set((x?u(x)||[]:[]).filter(b=>En(b)).map(b=>String(b.id))),[x,u,i,O]),r=te({}),ft=te(!1),U=mt(b=>b.sceneSelectionsSettled);K(()=>{if(!U){r.current={...I};return}if(!ft.current){ft.current=!0;let y=!1;for(const[c,F]of Object.entries(I||{}))F==null||!S.has(String(c))||(h(c,null),y=!0);if(y){r.current={...I};return}}const b=r.current,Q=[];for(const[y,c]of Object.entries(I||{}))b[y]===c||c==null||S.has(String(y))&&Q.push([y,c]);if(r.current={...I},!Q.length)return;const at=R.getState().systemId;let ct=!1;return(async()=>{const y=$.getState(),c=G.getState();for(const[F,E]of Q){const P=y.options?.[E];let M=P?.valueProductVariantId??P?.value_product_variant_id??P?.value_product_variant??P?.variantId??P?.variant_id??null,d=M!=null?y.getProduct?.(M):null;if(d==null){const m=P?.value??(y.optionToProducts?.[String(E)]||[])[0]??P?.product_id??P?.productId??null;d=m!=null?y.getProduct?.(m):null,d==null&&m!=null&&y.getComponent?.(m)&&(d=$n(y,m)),M=d?.id??M??m}else M=d?.id??M;if(M==null){h(F,null);continue}const it=d?.id??M,W=d?.placementGroup??d?.placement_group??null,J=d?.productGraph??d?.product_graph??null,lt=d?.compatibleSlots??d?.compatible_slots??null;if(Array.isArray(lt)&<.length){const m=new Set(lt.map(String));if(Object.values(c.productInstances||{}).some(Z=>{const f=y.getProduct?.(Z.variantId)||y.getProduct?.(Z.productId),It=f?.product_graph??f?.productGraph;return It!=null&&m.has(String(It))})){k.getState().setPendingSlotPlacement?.({productId:it,variantId:M,name:d?.name??d?.displayName??d?.variantName??"product",compatibleGraphIds:Array.from(m)}),h(F,null);continue}}if(Dn(at,d)==="arm"){Rn({productId:it,variantId:M});const m=je(),wt=typeof m?.computeTargets=="function",Z=Object.prototype.hasOwnProperty.call(m??{},"armHint")?m.armHint:qn(wt?"placement.armedPickTarget":"placement.armedPickGap",wt?"":"Click a + between pieces to insert it.");Z&&k.getState().showInfo?.(Z),h(F,null);continue}const z=G.getState(),Mt=z.selectedInstanceId,Y=Mt!=null?(z.productInstances||{})[Mt]:null,qt=Y&&Number.isFinite(Number(Y.sequence))?Number(Y.sequence):void 0,gt=Ln({placementGroup:W}),dt=gt!=null?(z.productInstances||{})[gt]:null,oe=dt&&Number.isFinite(Number(dt.sequence))?Number(dt.sequence):qt,se=Array.isArray(dt?.position)?dt.position:[0,0,0];let xt=null;try{xt=await Lt({type:zt.PRODUCT_ADD,productGraphId:J,variantId:M,placementGroup:W,sequence:oe,replacePlacementId:gt??void 0},m=>Rt({productGraphId:m.productGraphId,variantId:m.variantId,placementGroup:m.placementGroup,position:se,sequence:m.sequence,replace:m.replacePlacementId!=null,replacePlacementId:m.replacePlacementId}))}catch{}if(h(F,null),ct)return}})(),()=>{ct=!0}},[I,S,x,h])}function Jn({position:x,onClick:I}){const[h,u]=Pt(!1);return g(un,{position:x,center:!0,style:{pointerEvents:"auto"},zIndexRange:[100,0],children:g("div",{onClick:I,onPointerEnter:()=>u(!0),onPointerLeave:()=>u(!1),style:{width:22,height:22,borderRadius:"50%",background:h?"#ff8a65":"rgba(255, 87, 34, 0.85)",display:"flex",alignItems:"center",justifyContent:"center",color:"var(--bg-primary, #fff)",fontSize:13,fontWeight:"bold",boxShadow:"0 1px 4px rgba(0,0,0,0.3)",cursor:"pointer",transition:"transform 0.2s",transform:h?"scale(1.15)":"scale(1)"},children:"+"})})}function to({isMobile:x}={}){Tn();const I=Ze("SelectionActionPanel",In),h=G(t=>t.productInstances),u=$(t=>t.getProduct),i=$(t=>t.componentGroups),O=G(t=>t.clearSelection),S=G(t=>t.selectedInstanceId),r=G(t=>t.isFocusing),ft=G(t=>t.removeProductInstance),U=G(t=>t.addProductInstance),b=G(t=>t.updateInstancePosition),Q=G(t=>t.updateInstanceRotation),at=G(t=>t.activeSceneConfigId),ct=R(t=>t.defaultPresetId),y=R(t=>t.sceneConfigurations),c=R(t=>t.systemId),F=R(t=>t.useTransform),E=k(t=>t.sceneCapabilities),P=k(t=>t.showWalls),M=k(t=>t.showDimensions),d=k(t=>t.pendingSlotPlacement),it=Kn(),W=k(t=>t.hostMaterialOverrides),J=(An()||{}).room||null,lt=at||ct||Object.keys(y||{})[0]||null;Qn(lt);const[z,Mt]=Pt(!0),[Y,qt]=Pt(!1),gt=nt(async()=>{try{await Zn()}catch{}qt(!0)},[]),{edgeOf:dt,cornerOf:oe,isHostAnchored:se,isMovable:xt,rawFree:m,splitReliable:wt,freeInstances:Z,ordered:f,syntheticHosts:It,moveInFlightRef:no}=mn(),Ct=X(()=>new Map(It.map(t=>[t.hostedProductId,t])),[It]),[St,We]=Pt({}),Et=nt((t,e)=>{We(n=>{const o=n[t],a=e.full||null;return o&&o.width===e.width&&o.depth===e.depth&&o.height===e.height&&o.cx===e.cx&&o.cz===e.cz&&(o.full?.width??null)===(a?.width??null)&&(o.full?.height??null)===(a?.height??null)&&(o.full?.depth??null)===(a?.depth??null)?n:{...n,[t]:{width:e.width,depth:e.depth,height:e.height,cx:e.cx,cz:e.cz,full:a}}})},[]),ut=nt(t=>St[t]||null,[St]),re=$(t=>t.placementBoundsExcludeIds),ae=X(()=>new Set((re||[]).map(t=>String(t))),[re]),Nt=nt((t,e)=>{const n=t?.componentId??e?.id??e?.componentId??null;return n!=null&&ae.has(String(n))||/leg|arm/i.test(String(t?.slotKey||""))?!0:(e?.groups||e?.group_ids||[]).some(a=>{const l=i?.[a]||i?.[String(a)];return/leg|arm/i.test(String(l?.name??l?.slotKey??l?.slot_key??""))})},[i,ae]),yt=te(!1),L=f.length+Z.length,Xt=X(()=>[...f,...Z],[f,Z]),pt=L>0&&Xt.every(t=>St[t.productId]),_t=X(()=>Xt.filter(t=>St[t.productId]).length,[Xt,St]),{active:ce,loaded:ie,total:Zt}=pn(),le=k(t=>t.isEvaluating),Tt=k(t=>t.isLayoutLoading),de=k(t=>t.bootEvaluating);K(()=>{if(!Y)return;const t=!ce&&(Zt===0||ie>=Zt),e=(pt||L===0)&&t&&!le&&!de,n=()=>{Mt(!1),k.getState().endBootLoading()};if(e){const a=setTimeout(n,900);return()=>clearTimeout(a)}const o=setTimeout(n,15e3);return()=>clearTimeout(o)},[Y,pt,L,_t,ce,ie,Zt,le,de]);const[ue,pe]=Pt(!1);K(()=>{if(!z){pe(!1);return}(pt&&L>0||Y&&L===0)&&pe(!0)},[pt,L,Y,z]);const he=Y?ue||L===0?"Finishing up\u2026":`Loading products\u2026 ${Math.min(_t,L)}/${L}`:"Preparing your configurator\u2026",me=ue?100:L>0?Math.min(Math.round(_t/L*100),92):0;K(()=>{z&&k.getState().setBootPhase(he,me)},[z,he,me]),K(()=>(k.setState({initialSceneLoading:z}),()=>k.setState({initialSceneLoading:!1})),[z]),K(()=>{Tt&&(yt.current=!1)},[Tt]),K(()=>{if(L===0){yt.current=!1;return}if(yt.current||z||Tt||!pt)return;const t=setTimeout(()=>{yt.current||(G.getState().resetCameraToDefault?.({instant:!0}),yt.current=!0)},250);return()=>clearTimeout(t)},[L,_t,z,Tt,pt]);const bt=je(),Gt=X(()=>f.map(t=>{const e=Ct.get(t.id);return e?{...t,productId:e.hostVariantId}:t}),[f,Ct]),fe=F||!!y?.[lt]?.useTransform,N=G(t=>t.pendingPlacementPiece),ge=!!N&&typeof bt?.computeTargets=="function"&&!!Cn(),ot=X(()=>{const t={getProduct:u,getDims:ut,useTransform:fe,candidate:N,openSlots:ge,config:Ve()},e=bt.computeLayout?bt.computeLayout(Gt,t):Gt.map(()=>({position:[0,0,0],rotation:[0,0,0]}));return zn(e,Gt,t,bt)},[bt,Gt,u,ut,fe,N,ge]),H=X(()=>{const e=J?.height>0?J.height:2.7,n=.1,o=.05,a=new Map;let l=1/0,w=-1/0,A=1/0,p=-1/0,j=0,D=!1;if(f.forEach((s,V)=>{const C=ot[V];if(!C||xt(s))return;const v=C.position||[0,0,0],_=ut(s.productId),B=u(s.productId),q=_?.full||_,Kt=q?.height>0?q.height:B?.height>0?B.height*.0254:0,kt=(v[1]||0)+Kt;if(kt>j&&(j=kt),(s.positionedAbove??s.positioned_above)!=null)return;const $t=(v[1]||0)<=.01,At=-((Array.isArray(C.rotation)?C.rotation[1]:0)||0),Qt=_?.depth>0?_.depth:B?.depth>0?B.depth*.0254:.6,Jt=_?.width>0?_.width:B?.width>0?B.width*.0254:.9,tt=Math.cos(At),et=Math.sin(At),Me=_?.cx||0,xe=_?.cz||0,we=v[0]+tt*Me-et*xe,Ce=v[2]+et*Me+tt*xe,_e=(Jt*Math.abs(tt)+Qt*Math.abs(et))/2,Te=(Jt*Math.abs(et)+Qt*Math.abs(tt))/2,Ge=we-_e,Oe=we+_e,Fe=Ce-Te,ke=Ce+Te,Ae=q?.width>0?q.width:Jt,De=q?.depth>0?q.depth:Qt,Re=v[0]+tt*(q?.cx||0)-et*(q?.cz||0),Le=v[2]+et*(q?.cx||0)+tt*(q?.cz||0),ze=(Ae*Math.abs(tt)+De*Math.abs(et))/2,qe=(Ae*Math.abs(et)+De*Math.abs(tt))/2,an=Re-ze,cn=Re+ze,ln=Le-qe,dn=Le+qe,Ee=String((Math.round(At/(Math.PI/2))%4+4)%4),T=a.get(Ee)||{heading:At,minX:1/0,maxX:-1/0,minZ:1/0,maxZ:-1/0,fMinX:1/0,fMaxX:-1/0,fMinZ:1/0,fMaxZ:-1/0,hasFloor:!1};T.minX=Math.min(T.minX,Ge),T.maxX=Math.max(T.maxX,Oe),T.minZ=Math.min(T.minZ,Fe),T.maxZ=Math.max(T.maxZ,ke),$t&&(T.fMinX=Math.min(T.fMinX,Ge),T.fMaxX=Math.max(T.fMaxX,Oe),T.fMinZ=Math.min(T.fMinZ,Fe),T.fMaxZ=Math.max(T.fMaxZ,ke),T.hasFloor=!0),a.set(Ee,T),l=Math.min(l,an),w=Math.max(w,cn),A=Math.min(A,ln),p=Math.max(p,dn),D=!0}),!D)return null;const ht=Math.max(e,j>0?j+.02:e),Ot=[...a.values()].map(s=>{const V=Math.sin(s.heading),C=Math.cos(s.heading),v=V,_=-C,B=Math.abs(v)>Math.abs(_),q=s.hasFloor?s.fMinX:s.minX,Kt=s.hasFloor?s.fMaxX:s.maxX,kt=s.hasFloor?s.fMinZ:s.minZ,$t=s.hasFloor?s.fMaxZ:s.maxZ,Pe=B?(v>0?Kt:q)+(v>0?n/2:-n/2):(_>0?$t:kt)+(_>0?n/2:-n/2);return{g:s,isSide:B,plane:Pe}}),nn=Ot.filter(s=>s.isSide).map(s=>s.plane),on=Ot.filter(s=>!s.isSide).map(s=>s.plane),Vt=[];for(const s of Ot){const{g:V}=s;if(s.isSide){let C=V.minZ,v=V.maxZ;for(const _ of on)C=Math.min(C,_),v=Math.max(v,_);Vt.push({cx:s.plane,cz:(C+v)/2,cy:ht/2,length:v-C+o*2,thickness:n,height:ht,rotY:Math.PI/2})}else{let C=V.minX,v=V.maxX;for(const _ of nn)C=Math.min(C,_),v=Math.max(v,_);Vt.push({cx:(C+v)/2,cz:s.plane,cy:ht/2,length:v-C+o*2,thickness:n,height:ht,rotY:0})}}const Ft=.4,ve=w>l&&p>A;let Ut=l-Ft,Wt=w+Ft,Yt=A-Ft,Bt=p+Ft;for(const s of Ot){const V=Math.sin(s.g.heading),C=-Math.cos(s.g.heading);s.isSide?V<0?Ut=s.plane-n/2:Wt=s.plane+n/2:C<0?Yt=s.plane-n/2:Bt=s.plane+n/2}const sn=ve?{cx:(Ut+Wt)/2,cz:(Yt+Bt)/2,w:Wt-Ut,d:Bt-Yt}:null,rn=ve?{minX:l,maxX:w,minZ:A,maxZ:p,w:w-l,d:p-A,h:ht,height:j>0?j:ht}:null;return{segments:Vt,floor:sn,bbox:rn}},[f,ot,J,ut,u,xt]),Ye=P&&!!(H&&H.segments&&H.segments.length),Be=M&&!!(H&&H.bbox&&H.bbox.w>0),Ke=(t,e)=>{const n=ot[e]||{position:[0,0,0],rotation:[0,0,0]},o=Ct.get(t.id);if(!o)return n;const a=n.position||[0,0,0],l=(Array.isArray(n.rotation)?n.rotation[1]:0)||0,w=Math.cos(l),A=Math.sin(l),p=o.offset||[0,0,0];return{position:[a[0]+(p[0]||0)*w+(p[2]||0)*A,a[1]+(p[1]||0),a[2]-(p[0]||0)*A+(p[2]||0)*w],rotation:[0,l+(o.rotDegY||0)*Math.PI/180,0]}},st=d,vt=!!st,Ie=X(()=>{if(!st)return new Set;const t=new Set((st.compatibleGraphIds||[]).map(String)),e=new Set;for(const n of Object.values(h||{})){const o=u(n.variantId)||u(n.productId),a=o?.product_graph??o?.productGraph;a!=null&&t.has(String(a))&&e.add(String(n.id))}return e},[st,h,u]),Ht=nt(()=>{k.getState().clearPendingSlotPlacement?.(),k.getState().clearPendingHostedProduct?.()},[]),Se=nt((t,e)=>{if(!e)return;const n=$.getState(),o=n.getProduct?.(e.variantId)||n.getProduct?.(e.productId),a=o?.productGraph??o?.product_graph??null,l=G.getState().productInstances?.[String(t)],w=o?.placementGroup??o?.placement_group??l?.placementGroup??null,A=Array.isArray(l?.position)?l.position:[0,0,0],p=l?.variantId??l?.productId??null,j=Number.isFinite(Number(l?.sequence))?Number(l.sequence):void 0;Ht(),Lt({type:zt.PRODUCT_ADD,productGraphId:a,variantId:e.variantId??e.productId,placementGroup:w,sequence:j,hostPlacementId:String(t),hostVariantId:p},D=>Rt({productGraphId:D.productGraphId,variantId:D.variantId,placementGroup:D.placementGroup,position:A,sequence:D.sequence,hostPlacementId:D.hostPlacementId,hostVariantId:D.hostVariantId}).catch(()=>{}))},[Ht]),jt=nt((t,e)=>{const n=$.getState(),o=n.getProduct?.(e.variantId)||n.getProduct?.(e.productId),a=o?.productGraph??o?.product_graph??null,l=o?.placementGroup??o?.placement_group??null,w=f[t-1]||f[t],A=Array.isArray(w?.position)?w.position:[0,0,0],p=f[t],j=p&&Number.isFinite(Number(p.sequence))?Number(p.sequence):void 0;Lt({type:zt.PRODUCT_ADD,productGraphId:a,variantId:e.variantId??e.productId,placementGroup:l,sequence:j},D=>Rt({productGraphId:D.productGraphId,variantId:D.variantId,placementGroup:D.placementGroup,position:A,sequence:D.sequence}).catch(()=>{}))},[f]);K(()=>{if(!N||f.length>0)return;const t=N;Xe(),jt(0,t)},[N,f.length,jt]);const{gaps:$e,onInsert:Qe}=Nn({systemId:c,count:f.length,positionOf:t=>ot[t]?.position||[0,0,0],insertAt:jt}),ye=X(()=>{if(!N)return[];const t=$.getState();return xn(f,{candidate:N,getProduct:e=>t.getProduct?.(e),getDims:ut,config:Ve(),layout:ot})},[N,f,ot,ut]),Je=nt(t=>{const e=wn(t,{candidate:N});if(!e)return;const n=$.getState(),o=n.getProduct?.(e.variantId)||n.getProduct?.(e.productId),a=o?.productGraph??o?.product_graph??null,l=o?.placementGroup??o?.placement_group??null,w=e.transform?.position??t.position??[0,0,0],A=_n(e,t,f);Lt({type:zt.PRODUCT_ADD,productGraphId:a,variantId:e.variantId??e.productId,placementGroup:l,anchor:e.anchor??null,sequence:A},p=>Rt({productGraphId:p.productGraphId,variantId:p.variantId,placementGroup:p.placementGroup,position:w,sequence:p.sequence}).catch(()=>{})),Xe()},[N,f]),{selectedInst:oo,swapOrder:so,panelActions:be,priceInfo:tn}=fn(),en=gn()("selectionPanel");K(()=>{if(S==null)return;const t=h||{},e=String(S),n="__host";if(e.endsWith(n)){const o=e.slice(0,-n.length);if(t[o]||Object.values(t).some(a=>String(a?.id??a?.instanceId)===o))return}else if(t[S]||Object.values(t).some(o=>String(o?.instanceId??o?.id)===e))return;O?.()},[S,h,O]);const ao=mt(t=>t.placementPricing),co=R(t=>t.getChannelPriceConfig);return rt(ne,{children:[g(Pn,{onSeeded:gt}),rt(bn,{isMobile:x,camera:{position:[2.6,2.2,4],fov:45},controlsTarget:[0,.5,0],onPointerMissed:()=>O?.(),groundShadowCatcher:!0,overlay:rt(ne,{children:[!vt&&be&&en?g(I,{actions:be,priceInfo:tn}):null,vt&&g("div",{className:"placement-mode-overlay",children:rt("div",{className:"placement-mode-overlay__content",children:[rt("span",{className:"placement-mode-overlay__text",children:["Click on a highlighted slot to place ",g("strong",{children:st?.name})]}),g("button",{type:"button",className:"placement-mode-overlay__cancel",onClick:Ht,children:g("span",{className:"placement-mode-overlay__cancel-text",children:"Cancel"})})]})}),g(Gn,{name:"overlay"}),r&&g("div",{"aria-hidden":"true",style:{position:"absolute",inset:0,zIndex:30,cursor:"default"}})]}),children:[Ye&&g(vn,{width:J?.width,depth:J?.depth,height:J?.height??H?.bbox?.h??2.7,showCeiling:E?.ceiling===!0,segments:H?.segments||null,floor:H?.floor||null}),Be&&(()=>{const t=Ze("SceneDimensions",kn);return g(t,{bbox:H.bbox})})(),f.map((t,e)=>{const n=Ct.get(t.id),o=ot[e]||{position:[0,0,0],rotation:[0,0,0]};return o.hidden?null:rt("group",{children:[n&&g(ee,{instance:{id:n.id,instanceId:n.id,productId:n.hostVariantId,variantId:n.hostVariantId,position:o.position||[0,0,0],rotation:o.rotation||[0,0,0]},slotMaterials:{...it,...W?.[n.hostedProductId]||{},...W?.[n.id]||{}},stateInstanceId:n.hostedProductId,onSelect:()=>G.getState().selectInstance(n.id),isSelected:String(S)===String(n.id),onMeasure:a=>Et(n.hostVariantId,a),footprintExcludeItem:Nt,hoverable:!0,focusable:!0},n.id),g(ee,{instance:{...t,...Ke(t,e)},slotMaterials:{...it,...W?.[t.id]||W?.[t.instanceId]||{}},onSelect:(a,l,w)=>{if(vt){Ie.has(String(t.id))&&Se(t.id,st);return}G.getState().selectInstance(a,w??null)},isSelected:!vt&&String(S)===String(t.instanceId??t.id),onMeasure:a=>Et(t.productId,a),footprintExcludeItem:Nt,hoverable:!0,focusable:!0}),vt&&Ie.has(String(t.id))&&g(Jn,{position:[o.position?.[0]||0,(o.position?.[1]||0)+.45,o.position?.[2]||0],onClick:()=>Se(t.id,st)})]},t.id??t.instanceId??e)}),Z.map((t,e)=>g(Sn,{selected:S===t.id,disabled:!!t.locked,position:t.position||[0,0,0],rotationY:(Array.isArray(t.rotation)&&t.rotation[1]||0)*Math.PI/180,onCommit:({position:n,rotationY:o})=>{b(t.id,n),Q(t.id,[0,o*180/Math.PI,0]),Xn({allowRevert:!0}).catch(()=>{})},children:g(ee,{instance:{...t,position:[0,0,0],rotation:[0,0,0]},slotMaterials:{...it,...W?.[t.id]||W?.[t.instanceId]||{}},onMeasure:n=>Et(t.productId,n),footprintExcludeItem:Nt})},t.id??t.instanceId??`free-${e}`)),ye.length>0?g(Mn,{targets:ye,onPick:Je}):g(yn,{gaps:$e,onInsert:Qe})]})]})}const Ue=new Set;function eo(){Vn();const x=R(r=>r.systemLayoutTemplate),I=R(r=>r.systemTheme),h=R(r=>r.systemThemeRecord);Bn(I,h);const u=Yn(h)||(I?String(I).trim().toLowerCase():null);let i=x;try{const r=new URLSearchParams(window.location.search);r.has("template")?i=r.get("template"):r.has("theme")&&(i=r.get("theme"))}catch{}i=i||x||u||null;const O=Un();O&&(i=O),!O&&!x&&i&&i===u&&!jn(i)&&!/^theme\d+$/.test(i)&&!Ue.has(i)&&Ue.add(i),Wn(i);const S=Hn(i);return rt(ne,{children:[g(S,{Scene:to,template:i}),g(On,{}),g(Fn,{})]})}export{to as SharedConfiguratorScene,eo as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@imagineio/configurator-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Configurator SDK — backend Configuration Engine client, state stores, shared 3D scene primitives, and pluggable placement (strategy + type). Drives every configurator (kitchen, sectional, …) from one self-contained surface.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"type": "module",
|