@imagineio/configurator-sdk 0.1.2 → 0.1.4

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.
@@ -1 +1 @@
1
- import{onEvent as w}from"./2e366d7386.js";let c=null;function m(e){c=Array.isArray(e)?e.map(t=>String(t).replace(/\/+$/,"")):null}function S(){return c?[...c]:null}const f=e=>!c||c.includes(e);function u(e){if(e==null)return e;try{return JSON.parse(JSON.stringify(e))}catch{return{_unserializable:!0}}}function d(e){if(typeof window>"u"||window.parent===window)return;const t=c||["*"];for(const n of t)try{window.parent.postMessage(e,n)}catch{}}function l(e,t){const n=e.filter(s=>!t.includes(s));if(n.length)throw new Error(`unknown region(s): ${n.join(", ")}. Available: ${t.join(", ")}`)}const a={async selectOption(e={}){const{options:t}=await import("./a0f71d0bf5.js"),{optionSet:n,option:s,optionSetId:o,optionId:r}=e;if(!(o!=null&&r!=null?await t.selectByIds(o,r):n!=null?await t.select(n,s):await t.select(s)))throw new Error("selectOption: not applied \u2014 unknown, ambiguous, or unavailable (see configurator console)");return{applied:!0}},async setSceneOption({optionSetId:e,featureId:t,optionId:n}){const{options:s}=await import("./a0f71d0bf5.js"),o=e??t;return await s.selectForScene({optionSetId:o,optionId:n}),{optionSetId:o,optionId:n}},async setProductOption({placementId:e,instanceId:t,optionSetId:n,featureId:s,optionId:o}){const{options:r}=await import("./a0f71d0bf5.js"),i=e??t,p=n??s;return await r.selectForProduct({placementId:i,optionSetId:p,optionId:o}),{placementId:i,optionSetId:p,optionId:o}},async setLayout({layoutId:e}){const{options:t}=await import("./a0f71d0bf5.js");if(!await t.select(e))throw new Error(`setLayout: "${e}" did not resolve to a selectable option`);return{layoutId:e}},async getQuote(){const{quote:e}=await import("./a0f71d0bf5.js");return u(e.read())},async getSelections(){const{options:e}=await import("./a0f71d0bf5.js"),{default:t}=await import("./9c6c598569.js"),{default:n}=await import("./d94df858ea.js"),s={};for(const o of Object.keys(t.getState().productInstances||{})){const r=e.effective(o);r&&(s[o]=r)}return u({scene:n.getState().sceneSelections||{},placements:s})},async getOptionSets(){const{default:e}=await import("./872c4302e0.js"),{features:t={},options:n={}}=e.getState(),s={};for(const[o,r]of Object.entries(t))s[o]={id:o,name:r.name,type:r.type,options:(r.options||[]).map(i=>({id:i,name:n[i]?.name,value:n[i]?.value}))};return s},async getProductInstances(){const{default:e}=await import("./9c6c598569.js"),{default:t}=await import("./d94df858ea.js"),n=e.getState().productInstances||{},s=t.getState().instanceSelections||{},o={};for(const[r,i]of Object.entries(n))o[r]={instanceId:r,productId:i.productId,selections:u(s[r])||{}};return o},async getSceneSelections(){const{default:e}=await import("./d94df858ea.js");return u(e.getState().sceneSelections)},async getConfiguration(){const{snapshotScene:e}=await import("./2cafe3274b.js");return u(await e())},async getScreenshot(){const e=document.querySelector(".scene-canvas canvas")||document.querySelector("canvas");if(!e)throw new Error("Canvas not found");return{dataUrl:e.toDataURL("image/jpeg",.92)}},async setCameraPosition({position:e}){if(!Array.isArray(e)||e.length!==3)throw new Error("position must be [x, y, z] array");const{default:t}=await import("./9c6c598569.js");return t.getState().setCameraPosition(e),{position:e}},async resetCamera(){const{scene:e}=await import("./a0f71d0bf5.js");return e.camera.reset(),{reset:!0}},async toggleView(){const{scene:e}=await import("./a0f71d0bf5.js");return e.view.toggle(),{is3D:e.view.is3D()}},async toggleWalls(){const{scene:e}=await import("./a0f71d0bf5.js");return e.toggle.walls(),{toggled:"walls"}},async toggleDimensions(){const{scene:e}=await import("./a0f71d0bf5.js");return e.toggle.dimensions(),{toggled:"dimensions"}},async setGuiVisible({visible:e}){const{ui:t}=await import("./a0f71d0bf5.js");return t.setSceneOverlaysVisible(e),{guiVisible:e}},async hideUI({regions:e}={}){const{ui:t}=await import("./a0f71d0bf5.js"),n=e==null?[]:[].concat(e);return l(n,t.regions),t.hide(...n),t.visible()},async showUI({regions:e}={}){const{ui:t}=await import("./a0f71d0bf5.js"),n=e==null?[]:[].concat(e);return l(n,t.regions),t.show(...n),t.visible()},async setUIRegions(e={}){const{ui:t}=await import("./a0f71d0bf5.js");return l(Object.keys(e),t.regions),t.setVisible(e),t.visible()},async getUIRegions(){const{ui:e}=await import("./a0f71d0bf5.js");return{regions:e.visible(),available:[...e.regions]}},async undo(){const{history:e}=await import("./a0f71d0bf5.js");return e.undo(),{undone:!0}},async redo(){const{history:e}=await import("./a0f71d0bf5.js");return e.redo(),{redone:!0}}};a.setSceneFeature=a.setSceneOption,a.setProductFeature=a.setProductOption,a.getFeatures=a.getOptionSets;let g=!1;function b(){g||(g=!0,!(typeof window>"u"||window.parent===window)&&(window.addEventListener("message",async e=>{const{action:t,payload:n,requestId:s}=e.data||{};if(!(!t||typeof t!="string")&&f(e.origin)){if(!a[t]){e.source?.postMessage({type:"configurator:response",requestId:s,success:!1,error:`Unknown action: "${t}". Available: ${Object.keys(a).join(", ")}`},e.origin);return}try{const o=await a[t](n||{});e.source?.postMessage({type:"configurator:response",requestId:s,success:!0,data:u(o)},e.origin)}catch(o){e.source?.postMessage({type:"configurator:response",requestId:s,success:!1,error:o?.message||String(o)},e.origin)}}}),w("*",(e,t)=>{d({type:"configurator:event",event:e,data:u(t)})}),d({type:"configurator:ready"})))}export{S as getAllowedOrigins,b as initIframeMessageService,m as setAllowedOrigins};
1
+ import{onEvent as w}from"./2e366d7386.js";let c=null;function m(e){c=Array.isArray(e)?e.map(t=>String(t).replace(/\/+$/,"")):null}function S(){return c?[...c]:null}const f=e=>!c||c.includes(e);function u(e){if(e==null)return e;try{return JSON.parse(JSON.stringify(e))}catch{return{_unserializable:!0}}}function d(e){if(typeof window>"u"||window.parent===window)return;const t=c||["*"];for(const n of t)try{window.parent.postMessage(e,n)}catch{}}function l(e,t){const n=e.filter(s=>!t.includes(s));if(n.length)throw new Error(`unknown region(s): ${n.join(", ")}. Available: ${t.join(", ")}`)}const a={async selectOption(e={}){const{options:t}=await import("./a0f71d0bf5.js"),{optionSet:n,option:s,optionSetId:o,optionId:r}=e;if(!(o!=null&&r!=null?await t.selectByIds(o,r):n!=null?await t.select(n,s):await t.select(s)))throw new Error("selectOption: not applied \u2014 unknown, ambiguous, or unavailable (see configurator console)");return{applied:!0}},async setSceneOption({optionSetId:e,featureId:t,optionId:n}){const{options:s}=await import("./a0f71d0bf5.js"),o=e??t;return await s.selectForScene({optionSetId:o,optionId:n}),{optionSetId:o,optionId:n}},async setProductOption({placementId:e,instanceId:t,optionSetId:n,featureId:s,optionId:o}){const{options:r}=await import("./a0f71d0bf5.js"),i=e??t,p=n??s;return await r.selectForProduct({placementId:i,optionSetId:p,optionId:o}),{placementId:i,optionSetId:p,optionId:o}},async setLayout({layoutId:e}){const{options:t}=await import("./a0f71d0bf5.js");if(!await t.select(e))throw new Error(`setLayout: "${e}" did not resolve to a selectable option`);return{layoutId:e}},async getQuote(){const{quote:e}=await import("./a0f71d0bf5.js");return u(e.read())},async getSelections(){const{options:e}=await import("./a0f71d0bf5.js"),{default:t}=await import("./9c6c598569.js"),{default:n}=await import("./d94df858ea.js"),s={};for(const o of Object.keys(t.getState().productInstances||{})){const r=e.effective(o);r&&(s[o]=r)}return u({scene:n.getState().sceneSelections||{},placements:s})},async getOptionSets(){const{default:e}=await import("./872c4302e0.js"),{features:t={},options:n={}}=e.getState(),s={};for(const[o,r]of Object.entries(t))s[o]={id:o,name:r.name,type:r.type,options:(r.options||[]).map(i=>({id:i,name:n[i]?.name,value:n[i]?.value}))};return s},async getProductInstances(){const{default:e}=await import("./9c6c598569.js"),{default:t}=await import("./d94df858ea.js"),n=e.getState().productInstances||{},s=t.getState().instanceSelections||{},o={};for(const[r,i]of Object.entries(n))o[r]={instanceId:r,productId:i.productId,selections:u(s[r])||{}};return o},async getSceneSelections(){const{default:e}=await import("./d94df858ea.js");return u(e.getState().sceneSelections)},async getConfiguration(){const{snapshotScene:e}=await import("./2cafe3274b.js");return u(await e())},async getScreenshot(){const e=document.querySelector(".scene-canvas canvas")||document.querySelector("canvas");if(!e)throw new Error("Canvas not found");const{canvasToDataUrl:t}=await import("./97abcad34e.js");return{dataUrl:t(e,{type:"image/jpeg",quality:.92})}},async setCameraPosition({position:e}){if(!Array.isArray(e)||e.length!==3)throw new Error("position must be [x, y, z] array");const{default:t}=await import("./9c6c598569.js");return t.getState().setCameraPosition(e),{position:e}},async resetCamera(){const{scene:e}=await import("./a0f71d0bf5.js");return e.camera.reset(),{reset:!0}},async toggleView(){const{scene:e}=await import("./a0f71d0bf5.js");return e.view.toggle(),{is3D:e.view.is3D()}},async toggleWalls(){const{scene:e}=await import("./a0f71d0bf5.js");return e.toggle.walls(),{toggled:"walls"}},async toggleDimensions(){const{scene:e}=await import("./a0f71d0bf5.js");return e.toggle.dimensions(),{toggled:"dimensions"}},async setGuiVisible({visible:e}){const{ui:t}=await import("./a0f71d0bf5.js");return t.setSceneOverlaysVisible(e),{guiVisible:e}},async hideUI({regions:e}={}){const{ui:t}=await import("./a0f71d0bf5.js"),n=e==null?[]:[].concat(e);return l(n,t.regions),t.hide(...n),t.visible()},async showUI({regions:e}={}){const{ui:t}=await import("./a0f71d0bf5.js"),n=e==null?[]:[].concat(e);return l(n,t.regions),t.show(...n),t.visible()},async setUIRegions(e={}){const{ui:t}=await import("./a0f71d0bf5.js");return l(Object.keys(e),t.regions),t.setVisible(e),t.visible()},async getUIRegions(){const{ui:e}=await import("./a0f71d0bf5.js");return{regions:e.visible(),available:[...e.regions]}},async undo(){const{history:e}=await import("./a0f71d0bf5.js");return e.undo(),{undone:!0}},async redo(){const{history:e}=await import("./a0f71d0bf5.js");return e.redo(),{redone:!0}}};a.setSceneFeature=a.setSceneOption,a.setProductFeature=a.setProductOption,a.getFeatures=a.getOptionSets;let g=!1;function b(){g||(g=!0,!(typeof window>"u"||window.parent===window)&&(window.addEventListener("message",async e=>{const{action:t,payload:n,requestId:s}=e.data||{};if(!(!t||typeof t!="string")&&f(e.origin)){if(!a[t]){e.source?.postMessage({type:"configurator:response",requestId:s,success:!1,error:`Unknown action: "${t}". Available: ${Object.keys(a).join(", ")}`},e.origin);return}try{const o=await a[t](n||{});e.source?.postMessage({type:"configurator:response",requestId:s,success:!0,data:u(o)},e.origin)}catch(o){e.source?.postMessage({type:"configurator:response",requestId:s,success:!1,error:o?.message||String(o)},e.origin)}}}),w("*",(e,t)=>{d({type:"configurator:event",event:e,data:u(t)})}),d({type:"configurator:ready"})))}export{S as getAllowedOrigins,b as initIframeMessageService,m as setAllowedOrigins};
@@ -1 +1 @@
1
- import{useCallback as a,useEffect as G,useMemo as S,useRef as M}from"react";import b from"./872c4302e0.js";import L from"./d94df858ea.js";import O from"./9c6c598569.js";import N from"./be337ddda5.js";import $ from"./8f60e5059a.js";import{getPlacementBindings as h,isOptionAvailable as B,isOptionVisible as x}from"./817d930a49.js";import{selectOption as U}from"./dbd5ba1d07.js";import{sceneOptionSetsFrom as V,productOptionSetsFrom as q,optionsForSetFrom as z}from"./4a99ddb3fd.js";import{isAddFeature as H}from"./8c27edda0f.js";function J({placementId:u}={}){const r=b(e=>e.options),v=b(e=>e.materials),t=b(e=>e.features),d=L(e=>e.sceneSelections),m=O(e=>e.placementSelections),D=O(e=>e.selectedInstanceId),A=O(e=>e.activeSceneConfigId),C=N(e=>e.sceneConfigurations),F=$(e=>e.hiddenOptions),i=u===void 0?D??null:u,o=i!=null,p=S(()=>V({features:t,sceneConfigurations:C,activeSceneConfigId:A}),[t,C,A]),R=S(()=>o?q({features:t,bindings:h(i)||[]}):[],[t,o,i,m]),f=M(new Map),E=`${Object.keys(t).length}_${Object.keys(r).length}`;G(()=>{f.current.clear()},[E]);const g=a(e=>{const n=e?.feature_id||e?.id;if(!n)return[];const c=o;if(!c){const l=f.current.get(n);if(l)return l}const s=z(e,{features:t,options:r,bindings:c?h(i)||[]:null});return c||f.current.set(n,s),s},[t,r,o,i,f]),y=S(()=>new Set((p||[]).filter(e=>H(e,{productSelected:o})).map(e=>String(e?.id))),[p,o]),_=a(e=>{if(!y.has(String(e))){if(o){const n=m?.[i];if(n&&n[e]!=null)return n[e]}return d[e]}},[y,o,i,m,d]),j=a(e=>e==null?null:d[e]??d[String(e)]??null,[d]),w=a((e,n)=>{if(!n)return{hidden:!1,disabled:!1,disabledReason:null};if(!x(e,n.id))return{hidden:!0,disabled:!0,disabledReason:null};if(!B(e,n.id))return{hidden:!1,disabled:!0,disabledReason:"Not available"};if(i!=null){const s=(h(i)||[]).find(l=>String(l.optionSetId??l.option_set_id)===String(e));if(s&&Array.isArray(s.available)&&!s.available.some(I=>String(I)===String(n.id)))return{hidden:!1,disabled:!0,disabledReason:"Not available"}}return{hidden:!1,disabled:!1,disabledReason:null}},[i]),P=a((e,n)=>(Array.isArray(n)?n:[]).filter(s=>s&&x(e,s.id)),[]),k=a((e,n,c)=>{const s=c||t?.[e]||t?.[String(e)]||null;return U(e,n,s)},[t]);return S(()=>({features:t,optionSets:t,optionSetList:Object.values(t||{}),sceneOptionSets:p,productOptionSets:R,getOptionsForSet:g,options:r,materials:v,hiddenOptions:F,scope:{placementId:i,isPlacementScoped:o},getOptionsForFeature:g,select:k,getSelection:_,getEffectiveSelection:j,optionDisabledPropsFor:w,visibleOptions:P}),[t,r,v,F,i,o,p,R,g,k,_,j,w,P])}function ie(u){const r=M(new Map);return G(()=>{r.current.clear()},[u]),r}export{J as default,ie as useOptionsCache};
1
+ import{useCallback as a,useEffect as G,useMemo as m,useRef as M}from"react";import b from"./872c4302e0.js";import I from"./d94df858ea.js";import O from"./9c6c598569.js";import L from"./be337ddda5.js";import N from"./8f60e5059a.js";import{getPlacementBindings as h,isOptionAvailable as $,isOptionVisible as x,getPlacementBinding as U}from"./817d930a49.js";import{selectOption as V}from"./dbd5ba1d07.js";import{sceneOptionSetsFrom as q,productOptionSetsFrom as z,optionsForSetFrom as H}from"./4a99ddb3fd.js";import{isAddFeature as J}from"./8c27edda0f.js";function K({placementId:u}={}){const r=b(e=>e.options),v=b(e=>e.materials),t=b(e=>e.features),d=I(e=>e.sceneSelections),p=O(e=>e.placementSelections),B=O(e=>e.selectedInstanceId),A=O(e=>e.activeSceneConfigId),C=L(e=>e.sceneConfigurations),F=N(e=>e.hiddenOptions),i=u===void 0?B??null:u,o=i!=null,f=m(()=>q({features:t,sceneConfigurations:C,activeSceneConfigId:A}),[t,C,A]),R=m(()=>o?z({features:t,bindings:h(i)||[]}):[],[t,o,i,p]),S=M(new Map),D=`${Object.keys(t).length}_${Object.keys(r).length}`;G(()=>{S.current.clear()},[D]);const g=a(e=>{const n=e?.feature_id||e?.id;if(!n)return[];const c=o;if(!c){const l=S.current.get(n);if(l)return l}const s=H(e,{features:t,options:r,bindings:c?h(i)||[]:null});return c||S.current.set(n,s),s},[t,r,o,i,S]),y=m(()=>new Set((f||[]).filter(e=>J(e,{productSelected:o&&!!U(i,e?.id??e?.feature_id)})).map(e=>String(e?.id))),[f,o,i,p]),_=a(e=>{if(!y.has(String(e))){if(o){const n=p?.[i];if(n&&n[e]!=null)return n[e]}return d[e]}},[y,o,i,p,d]),P=a(e=>e==null?null:d[e]??d[String(e)]??null,[d]),j=a((e,n)=>{if(!n)return{hidden:!1,disabled:!1,disabledReason:null};if(!x(e,n.id))return{hidden:!0,disabled:!0,disabledReason:null};if(!$(e,n.id))return{hidden:!1,disabled:!0,disabledReason:"Not available"};if(i!=null){const s=(h(i)||[]).find(l=>String(l.optionSetId??l.option_set_id)===String(e));if(s&&Array.isArray(s.available)&&!s.available.some(E=>String(E)===String(n.id)))return{hidden:!1,disabled:!0,disabledReason:"Not available"}}return{hidden:!1,disabled:!1,disabledReason:null}},[i]),w=a((e,n)=>(Array.isArray(n)?n:[]).filter(s=>s&&x(e,s.id)),[]),k=a((e,n,c)=>{const s=c||t?.[e]||t?.[String(e)]||null;return V(e,n,s)},[t]);return m(()=>({features:t,optionSets:t,optionSetList:Object.values(t||{}),sceneOptionSets:f,productOptionSets:R,getOptionsForSet:g,options:r,materials:v,hiddenOptions:F,scope:{placementId:i,isPlacementScoped:o},getOptionsForFeature:g,select:k,getSelection:_,getEffectiveSelection:P,optionDisabledPropsFor:j,visibleOptions:w}),[t,r,v,F,i,o,f,R,g,k,_,P,j,w])}function se(u){const r=M(new Map);return G(()=>{r.current.clear()},[u]),r}export{K as default,se as useOptionsCache};
@@ -1 +1 @@
1
- import p from"./8f60e5059a.js";import h from"./9c6c598569.js";import S from"./872c4302e0.js";import{getEffectiveSelections as v,getPlacementBinding as _}from"./817d930a49.js";const g=t=>String(t??"").toLowerCase().replace(/\s+/g," ").trim();function m(t,e,s){if(e==null||!Array.isArray(t)||t.length===0)return null;const c=r=>r.value_product??r.valueProduct??r.value,o=r=>r==null?null:s?.[r]||s?.[String(r)]||null,i=t.find(r=>{const n=c(r);return n!=null&&String(n)===String(e)});if(i)return i;const l=o(e),a=g(l?.name??l?.title);if(a){const r=t.filter(n=>{const u=g(n.name??n.label??n.title);return u.length>0&&a.includes(u)});if(r.length===1)return r[0]}const d=l?l.productGraph??l.product_graph??null:null;if(d!=null){const r=t.filter(n=>{const u=o(c(n)),f=u?u.productGraph??u.product_graph??null:null;return f!=null&&String(f)===String(d)});if(r.length===1)return r[0]}return null}function O(t,{productInstances:e,hostProductOverrides:s,getProduct:c}={}){if(t==null)return null;const o=e?.[t];let i=s?.[t]??o?.variantId??o?.productId??null;if(i==null&&String(t).endsWith("__host")){const l=String(t).replace(/__host$/,""),a=e?.[l],d=c?.(a?.variantId??a?.productId),r=d?.hostVariants??d?.host_variants,n=Array.isArray(r)?r.find(u=>u?.isDefault??u?.is_default)??r[0]:null;i=n?.hostVariantId??n?.host_variant_id??null}return i}function C(t){return y(t).id}function y({placementId:t,set:e,opts:s,inputs:c}){const o=c||V(),i=String(e?.type??""),l=e?.feature_id??e?.id;if(l==null)return{id:null,rule:"none"};let a=null;if(t!=null&&(i==="load_new_product"||i==="product_change")){a=O(t,o);const n=m(s,a,o.products);if(n)return{id:n.id,rule:"variant",currentVariantId:a}}if(t!=null&&/finish/i.test(i)){const n=P(t,e,o);if(n.size>0){const u=(s||[]).find(f=>f?.value!=null&&n.has(String(f.value)));if(u)return{id:u.id,rule:"material",currentVariantId:a}}}if(t!=null){const n=v(t)||{},u=n[l]??n[String(l)];if(u!=null)return{id:u,rule:"tracked",currentVariantId:a};const f=_(t,l);return f?.default!=null?{id:f.default,rule:"binding-default",currentVariantId:a}:{id:null,rule:"none",currentVariantId:a}}const d=o.sceneSelections||{},r=d[l]??d[String(l)]??null;return{id:r,rule:r==null?"none":"scene"}}function P(t,e,s){const c=s.hostMaterialOverrides?.[t]||{},o=new Set((e?.material_targets??e?.materialTargets??e?.materials??[]).map(i=>String(i).toLowerCase()));return new Set(Object.entries(c).filter(([i])=>o.size===0||o.has(String(i).toLowerCase())).map(([,i])=>String(i)))}function V(){const t=p.getState(),e=h.getState(),s=S.getState();return{productInstances:e.productInstances||{},hostProductOverrides:t.hostProductOverrides||{},hostMaterialOverrides:t.hostMaterialOverrides||{},products:s.products||{},getProduct:s.getProduct,sceneSelections:void 0}}export{C as currentOptionIdFor,O as currentVariantIdFor,y as explainCurrentOption,V as readCurrentOptionInputs,m as resolveCurrentSwapOption};
1
+ import p from"./8f60e5059a.js";import S from"./9c6c598569.js";import h from"./872c4302e0.js";import{getEffectiveSelections as v,getPlacementBinding as m}from"./817d930a49.js";import{resolveHostVariantId as _}from"./be07a7f885.js";const g=t=>String(t??"").toLowerCase().replace(/\s+/g," ").trim();function O(t,n,a){if(n==null||!Array.isArray(t)||t.length===0)return null;const s=r=>r.value_product??r.valueProduct??r.value,o=r=>r==null?null:a?.[r]||a?.[String(r)]||null,i=t.find(r=>{const e=s(r);return e!=null&&String(e)===String(n)});if(i)return i;const u=o(n),l=g(u?.name??u?.title);if(l){const r=t.filter(e=>{const c=g(e.name??e.label??e.title);return c.length>0&&l.includes(c)});if(r.length===1)return r[0]}const f=u?u.productGraph??u.product_graph??null:null;if(f!=null){const r=t.filter(e=>{const c=o(s(e)),d=c?c.productGraph??c.product_graph??null:null;return d!=null&&String(d)===String(f)});if(r.length===1)return r[0]}return null}function P(t,{productInstances:n,hostProductOverrides:a,getProduct:s}={}){if(t==null)return null;const o=n?.[t];let i=a?.[t]??o?.variantId??o?.productId??null;if(i==null&&String(t).endsWith("__host")){const u=String(t).replace(/__host$/,""),l=n?.[u],f=s?.(l?.variantId??l?.productId);i=_(f,l)}return i}function L(t){return b(t).id}function b({placementId:t,set:n,opts:a,inputs:s}){const o=s||x(),i=String(n?.type??""),u=n?.feature_id??n?.id;if(u==null)return{id:null,rule:"none"};let l=null;if(t!=null&&(i==="load_new_product"||i==="product_change")){l=P(t,o);const e=O(a,l,o.products);if(e)return{id:e.id,rule:"variant",currentVariantId:l}}if(t!=null&&/finish/i.test(i)){const e=w(t,n,o);if(e.size>0){const c=(a||[]).find(d=>d?.value!=null&&e.has(String(d.value)));if(c)return{id:c.id,rule:"material",currentVariantId:l}}}if(t!=null){const e=v(t)||{},c=e[u]??e[String(u)];if(c!=null)return{id:c,rule:"tracked",currentVariantId:l};const d=m(t,u);return d?.default!=null?{id:d.default,rule:"binding-default",currentVariantId:l}:{id:null,rule:"none",currentVariantId:l}}const f=o.sceneSelections||{},r=f[u]??f[String(u)]??null;return{id:r,rule:r==null?"none":"scene"}}function w(t,n,a){const s=a.hostMaterialOverrides?.[t]||{},o=new Set((n?.material_targets??n?.materialTargets??n?.materials??[]).map(i=>String(i).toLowerCase()));return new Set(Object.entries(s).filter(([i])=>o.size===0||o.has(String(i).toLowerCase())).map(([,i])=>String(i)))}function x(){const t=p.getState(),n=S.getState(),a=h.getState();return{productInstances:n.productInstances||{},hostProductOverrides:t.hostProductOverrides||{},hostMaterialOverrides:t.hostMaterialOverrides||{},products:a.products||{},getProduct:a.getProduct,sceneSelections:void 0}}export{L as currentOptionIdFor,P as currentVariantIdFor,b as explainCurrentOption,x as readCurrentOptionInputs,O as resolveCurrentSwapOption};
@@ -1,110 +1,110 @@
1
1
  @layer sdk-base, vendor, sdk;
2
2
  @layer sdk {
3
- /* Boot failure screen — a FIXED palette, deliberately no theme tokens.
4
- Same reasoning as ui/LicenceNotice.css: this renders when boot did not finish, so the theme
5
- may never have applied, and a token that resolves to nothing leaves unreadable text on an
6
- unpainted ground (which is exactly how a shell's CTA went invisible once). Every value here
7
- is literal, and every property .error-screen would otherwise supply is set at higher
8
- specificity. */
9
- .error-screen.boot-error {
10
- position: absolute;
11
- inset: 0;
12
- display: flex;
13
- align-items: center;
14
- justify-content: center;
15
- height: 100%;
16
- padding: 24px;
17
- box-sizing: border-box;
18
- background: #f4f5f7;
19
- color: #111111;
20
- color-scheme: light;
21
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
22
- text-align: left;
23
- }
24
-
25
- .error-screen.boot-error .boot-error__card {
26
- max-width: 520px;
27
- padding: 28px 32px;
28
- background: #ffffff;
29
- border: 1px solid #e3e5e8;
30
- border-radius: 12px;
31
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
32
- }
33
-
34
- .error-screen.boot-error h1.boot-error__title {
35
- margin: 0 0 10px;
36
- font-size: 18px;
37
- font-weight: 600;
38
- line-height: 1.35;
39
- color: #111111;
40
- }
41
-
42
- .error-screen.boot-error button.boot-error__retry {
43
- margin-top: 18px;
44
- padding: 9px 18px;
45
- border: 1px solid #d0d3d8;
46
- border-radius: 6px;
47
- background: #ffffff;
48
- color: #111111;
49
- font-size: 13px;
50
- font-weight: 600;
51
- cursor: pointer;
52
- }
53
-
54
- .error-screen.boot-error button.boot-error__retry:hover {
55
- background: #f4f5f7;
56
- }
57
-
58
- .error-screen.boot-error p.boot-error__body {
59
- margin: 0;
60
- font-size: 14px;
61
- line-height: 1.55;
62
- color: #555b66;
63
- }
64
-
65
- /* DEV ONLY (see BootErrorNotice.jsx): the integrator's instruction, COLLAPSED so it never
66
- competes with the shopper's message, and visually separated so it cannot be mistaken for it. */
67
- .error-screen.boot-error .boot-error__dev {
68
- margin-top: 20px;
69
- padding-top: 16px;
70
- border-top: 1px dashed #d8dbe0;
71
- }
72
-
73
- .error-screen.boot-error summary.boot-error__dev-tag {
74
- display: inline-block;
75
- padding: 3px 10px;
76
- border-radius: 999px;
77
- background: #eef1f5;
78
- color: #5b6472;
79
- font-size: 10px;
80
- font-weight: 700;
81
- letter-spacing: 0.06em;
82
- text-transform: uppercase;
83
- cursor: pointer;
84
- user-select: none;
85
- list-style: none; /* hide the default marker; the pill IS the affordance */
86
- }
87
-
88
- .error-screen.boot-error summary.boot-error__dev-tag::-webkit-details-marker { display: none; }
89
-
90
- .error-screen.boot-error summary.boot-error__dev-tag::after {
91
- content: ' ▸';
92
- font-size: 9px;
93
- }
94
-
95
- .error-screen.boot-error .boot-error__dev[open] summary.boot-error__dev-tag::after {
96
- content: ' ▾';
97
- }
98
-
99
- .error-screen.boot-error summary.boot-error__dev-tag:hover {
100
- background: #e4e8ee;
101
- }
102
-
103
- .error-screen.boot-error p.boot-error__dev-fix {
104
- margin: 10px 0 0;
105
- font-size: 13px;
106
- line-height: 1.55;
107
- color: #3f4652;
108
- }
3
+ /* Boot failure screen — a FIXED palette, deliberately no theme tokens.
4
+ Same reasoning as ui/LicenceNotice.css: this renders when boot did not finish, so the theme
5
+ may never have applied, and a token that resolves to nothing leaves unreadable text on an
6
+ unpainted ground (which is exactly how a shell's CTA went invisible once). Every value here
7
+ is literal, and every property .error-screen would otherwise supply is set at higher
8
+ specificity. */
9
+ .error-screen.boot-error {
10
+ position: absolute;
11
+ inset: 0;
12
+ display: flex;
13
+ align-items: center;
14
+ justify-content: center;
15
+ height: 100%;
16
+ padding: 24px;
17
+ box-sizing: border-box;
18
+ background: #f4f5f7;
19
+ color: #111111;
20
+ color-scheme: light;
21
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
22
+ text-align: left;
23
+ }
24
+
25
+ .error-screen.boot-error .boot-error__card {
26
+ max-width: 520px;
27
+ padding: 28px 32px;
28
+ background: #ffffff;
29
+ border: 1px solid #e3e5e8;
30
+ border-radius: 12px;
31
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
32
+ }
33
+
34
+ .error-screen.boot-error h1.boot-error__title {
35
+ margin: 0 0 10px;
36
+ font-size: 18px;
37
+ font-weight: 600;
38
+ line-height: 1.35;
39
+ color: #111111;
40
+ }
41
+
42
+ .error-screen.boot-error button.boot-error__retry {
43
+ margin-top: 18px;
44
+ padding: 9px 18px;
45
+ border: 1px solid #d0d3d8;
46
+ border-radius: 6px;
47
+ background: #ffffff;
48
+ color: #111111;
49
+ font-size: 13px;
50
+ font-weight: 600;
51
+ cursor: pointer;
52
+ }
53
+
54
+ .error-screen.boot-error button.boot-error__retry:hover {
55
+ background: #f4f5f7;
56
+ }
57
+
58
+ .error-screen.boot-error p.boot-error__body {
59
+ margin: 0;
60
+ font-size: 14px;
61
+ line-height: 1.55;
62
+ color: #555b66;
63
+ }
64
+
65
+ /* DEV ONLY (see BootErrorNotice.jsx): the integrator's instruction, COLLAPSED so it never
66
+ competes with the shopper's message, and visually separated so it cannot be mistaken for it. */
67
+ .error-screen.boot-error .boot-error__dev {
68
+ margin-top: 20px;
69
+ padding-top: 16px;
70
+ border-top: 1px dashed #d8dbe0;
71
+ }
72
+
73
+ .error-screen.boot-error summary.boot-error__dev-tag {
74
+ display: inline-block;
75
+ padding: 3px 10px;
76
+ border-radius: 999px;
77
+ background: #eef1f5;
78
+ color: #5b6472;
79
+ font-size: 10px;
80
+ font-weight: 700;
81
+ letter-spacing: 0.06em;
82
+ text-transform: uppercase;
83
+ cursor: pointer;
84
+ user-select: none;
85
+ list-style: none; /* hide the default marker; the pill IS the affordance */
86
+ }
87
+
88
+ .error-screen.boot-error summary.boot-error__dev-tag::-webkit-details-marker { display: none; }
89
+
90
+ .error-screen.boot-error summary.boot-error__dev-tag::after {
91
+ content: ' ▸';
92
+ font-size: 9px;
93
+ }
94
+
95
+ .error-screen.boot-error .boot-error__dev[open] summary.boot-error__dev-tag::after {
96
+ content: ' ▾';
97
+ }
98
+
99
+ .error-screen.boot-error summary.boot-error__dev-tag:hover {
100
+ background: #e4e8ee;
101
+ }
102
+
103
+ .error-screen.boot-error p.boot-error__dev-fix {
104
+ margin: 10px 0 0;
105
+ font-size: 13px;
106
+ line-height: 1.55;
107
+ color: #3f4652;
108
+ }
109
109
 
110
110
  }
@@ -1 +1 @@
1
- import{jsx as b,jsxs as fn}from"react/jsx-runtime";import{memo as qt,useRef as Z,useState as J,useCallback as kt,useEffect as lt,useSyncExternalStore as Qt}from"react";import{useFrame as Ut,useThree as Xt}from"@react-three/fiber";import{Html as Ct}from"@react-three/drei";import*as _ from"three";import q from"./9c6c598569.js";import ut from"./872c4302e0.js";import Yt from"./8f60e5059a.js";import _t from"./c9a1656c62.js";import{resolveComponentRenderer as Zt,subscribeSceneRegistry as Jt,getSceneRegistryVersion as Ot,runInteraction as dt}from"./95a44ebec2.js";import mt,{SELECTION_COLOR as tn}from"./66c461dc2c.js";import{useUiToggles as nn}from"./d0f9681634.js";import{_anchorHasData as on}from"./9326c23506.js";function en(o){Qt(Jt,Ot,Ot);const c=[o?.slotName,o?.component?.slotName,o?.component?.slot_name,o?.component?.kind,o?.component?.name];let g=null;for(const l of c)if(l!=null&&(g=Zt(l),g))break;return g?b(g,{...o,Default:_t,THREE:_}):b(_t,{...o})}function Q(o,c,g=[0,0,0]){const l=o?.[c];if(Array.isArray(l)&&l.length>=3)return[Number(l[0])||0,Number(l[1])||0,Number(l[2])||0];if(l&&typeof l=="object")return[Number(l.x)||0,Number(l.y)||0,Number(l.z)||0];const I=D=>o?.[`${c}_${D}`]??o?.[`${c}${D.toUpperCase()}`],A=I("x"),x=I("y"),E=I("z");return A==null&&x==null&&E==null?g:[Number(A)||0,Number(x)||0,Number(E)||0]}function sn(o){if(!Array.isArray(o)||o.length<2)return o;const c=new Set,g=l=>(l?.groups||l?.group_ids||[]).map(String);for(const l of o){const I=l.component,A=I?.anchor_points||I?.anchorPoints;if(!(!Array.isArray(A)||!A.length))for(const x of A){if(!on(x))continue;const E=new Set((x.acceptedGroups||x.accepted_groups||[]).map(String));if(!E.size)continue;const D=new Set((x.excludedGroups||x.excluded_groups||[]).map(String)),L=o.find(B=>{if(B===l||c.has(B.key))return!1;const F=g(B.component);return F.some(T=>E.has(T))&&!F.some(T=>D.has(T))});if(!L)continue;const z=Q(x,"position"),M=Q(x,"orientation");L.position=[z[0],z[1],z[2]],L.rotation=[M[0],M[1],M[2]],c.add(L.key)}}return o}const rn="#ff0000",cn="#333333",Mn=()=>{},an="rgba(255, 87, 34, 0.85)",ln="#ff8a65",un=[0,0,0];function dn(o){return o.map(c=>{const g=new Set,l=I=>{I!=null&&String(I)!==""&&g.add(String(I).toLowerCase())};return l(c.slotKey),l(c.slotName),l(c.component?.slot_name??c.component?.slotName),l(c.componentId),g})}function mn({instance:o,components:c,slotMaterials:g,onMeasure:l,onSelect:I,isSelected:A,selectionColor:x=tn,style:E,footprintExcludeItem:D,stateInstanceId:L,overlapping:z=!1,isPlacementTarget:M=!1,onPlacementClick:B,label:F,hoverable:T=!1,focusable:Mt=!1,disableInteraction:H=!1}){const $=Z(),pt=Z(),tt=Z(),nt=Z({}),[ft,ht]=J(null),[ot,gt]=J(null),[Nt,At]=J(0),Et=kt(()=>At(t=>t+1),[]),[U,yt]=J(!1),X=nn()("selectionPanel");lt(()=>{nt.current={},ht(null),gt(null)},[o?.productId]);const zt=q(t=>t.selectInstance),Rt=q(t=>t.selectedInstanceId),et=ut(t=>t.getProduct),R=ut(t=>t.getComponent),O=ut(t=>t.componentGroups),vt=q(t=>t.componentStates),Pt=q(t=>t.placementOverrides),j=Yt(t=>t.guiVisible)!==!1,st=Xt(t=>t.invalidate);lt(()=>{z&&st?.()},[z,st]),Ut(({clock:t})=>{if(!z||!tt.current)return;const e=.45+.25*Math.sin(t.getElapsedTime()*6);tt.current.traverse(n=>{n.isMesh&&n.material&&(n.material.opacity=e)}),st?.()}),lt(()=>{const t=$.current,e=pt.current;if(!t||!e)return;const n=requestAnimationFrame(()=>{t.updateWorldMatrix(!0,!0);const s=new _.Matrix4().copy(t.matrixWorld).invert(),a=new _.Box3,i=new _.Box3,u=new _.Matrix4;if(e.traverse(r=>{!r.isMesh||!r.geometry||(r.geometry.boundingBox||r.geometry.computeBoundingBox(),i.copy(r.geometry.boundingBox),i.applyMatrix4(u.multiplyMatrices(s,r.matrixWorld)),a.union(i))}),a.isEmpty())return;const m=a.getSize(new _.Vector3),f=a.getCenter(new _.Vector3);gt(r=>r&&r.width===m.x&&r.height===m.y&&r.depth===m.z&&r.cx===f.x&&r.cy===f.y&&r.cz===f.z?r:{width:m.x,height:m.y,depth:m.z,cx:f.x,cy:f.y,cz:f.z})});return()=>cancelAnimationFrame(n)},[ft,Nt]);const Dt=kt((t,e,n,s=!1)=>{const a=(n?.[0]||0)+(e.cx||0),i=(n?.[2]||0)+(e.cz||0),u=(n?.[1]||0)+(e.cy||0);nt.current[t]={minx:a-(e.width||0)/2,maxx:a+(e.width||0)/2,minz:i-(e.depth||0)/2,maxz:i+(e.depth||0)/2,height:e.height||0,bottom:u-(e.height||0)/2,top:u+(e.height||0)/2,isLeg:s};const m=p=>{let d=1/0,h=-1/0,y=1/0,C=-1/0,w=-1/0,v=1/0,xt=!1;for(const N of Object.values(nt.current))p(N)&&(xt=!0,d=Math.min(d,N.minx),h=Math.max(h,N.maxx),y=Math.min(y,N.minz),C=Math.max(C,N.maxz),w=Math.max(w,N.top!=null?N.top:N.height||0),v=Math.min(v,N.bottom!=null?N.bottom:0));if(!xt||!Number.isFinite(d))return null;const Wt=Number.isFinite(w)&&Number.isFinite(v)?Math.max(0,w-v):0;return{width:h-d,depth:C-y,height:Wt,cx:(d+h)/2,cz:(y+C)/2,minX:d,minZ:y}},f=m(()=>!0);f&&ht(p=>p&&p.width===f.width&&p.height===f.height&&p.depth===f.depth&&p.cx===f.cx&&p.cz===f.cz?p:f);const r=m(p=>!p.isLeg)||f;r&&l?.(f?{...r,full:f}:r)},[l]),k=o.instanceId??o.id,bt=L??k,it=et(o.productId)||et(o.variantId),rt=A??Rt===k;if(!it)return null;const ct=(t=null)=>{if(!H){if(M&&B){B(k,o);return}X&&dt("click",{placementId:k,instanceId:k,instance:o,componentId:t},e=>{I?I(e.instanceId,e.instance,e.componentId):zt(e.instanceId,e.componentId)})}},Lt=t=>{H||(t.stopPropagation(),ct())},Bt=X?I?ct:void 0:ct,Tt=t=>{if(H||!Mt||M||!$.current)return;t.stopPropagation();const e=new _.Box3().setFromObject($.current),n=new _.Vector3;e.getCenter(n);const s=new _.Sphere;e.getBoundingSphere(s);const a=new _.Quaternion;$.current.getWorldQuaternion(a);const i=new _.Euler().setFromQuaternion(a,"YXZ").y;q.getState().focusOnObject?.([n.x,n.y,n.z],s.radius,i)},Kt=t=>{H||!T||(t.stopPropagation(),dt("hover",{placementId:k,instanceId:k,instance:o,hovered:!0},()=>{yt(!0),typeof document<"u"&&(document.body.style.cursor="pointer")}))},Ft=()=>{H||!T||dt("hover",{placementId:k,instanceId:k,instance:o,hovered:!1},()=>{yt(!1),typeof document<"u"&&(document.body.style.cursor="auto")})},Ht=it.components_configuration||it.componentsConfiguration||{},G=vt[bt]||{},S=ot||ft,V=S?.height>0?S.height:.8,It=ot?.cy!=null?ot.cy:V/2,St=(t,e)=>{const n=G[t]?.componentId??null;if(n!=null)return n;if(e==null||!O)return null;const s=R(e),a=s?.groups||s?.group_ids||[];for(const i of a){const u=O[i]||O[String(i)];if(!u)continue;const m=new Set([...Object.values(u.variants||{}),...Array.isArray(u.members)?u.members.map(d=>d?.componentId??d?.id??d):[]].map(String));if(m.size&&!m.has(String(e)))continue;const f=u.name??u.slotKey??u.slot_key,r=f!=null?G[f]?.componentId:null,p=G[i]?.componentId??G[String(i)]?.componentId;if(r!=null)return r;if(p!=null)return p}return null},$t=t=>{if(!E||t==null)return null;const e=R(t),n=String(e?.type??"").toLowerCase();if(n!=="door"&&n!=="drawer")return null;const s=e?.groups||e?.group_ids||[];for(const a of s){const u=(O?.[a]||O?.[String(a)])?.variants?.[E];if(u!=null)return u}return null};let P=Array.isArray(c)&&c.length?c.map((t,e)=>{const n=t.slotKey??t.materialSlot??t.material_slot??t.type??`res-${e}`,s=t.componentId??t.component_id??null,a=St(n,s),i=t.component??t;let u=i;if(a!=null&&String(a)!==String(s)){let m=R(a);if(!m){const f=et(a),r=f&&(f.components_configuration||f.componentsConfiguration||f.components);if(r&&typeof r=="object"){const p=r[n]??Object.values(r)[0],d=p?.componentId??p?.component_id??(typeof p=="number"||typeof p=="string"?p:null);m=(d!=null?R(d):null)??(p&&typeof p=="object"?p:null)}}m&&(u={...m,position:i.position??m.position,rotation:i.rotation??m.rotation,scale:i.scale??m.scale,materialSlot:i.materialSlot??i.material_slot??m.materialSlot,rotationRad:i.rotationRad??m.rotationRad})}return{key:t.key??`res-${e}`,slotKey:n,componentId:a??s,component:u,position:t.position??i?.position??null,offset:t.offset??i?.offset??null,baseState:{materialId:t.materialId??null,color:t.color??null,roughness:t.roughness,metalness:t.metalness}}}):Object.entries(Ht).flatMap(([t,e])=>(Array.isArray(e)?e:[e]).map((s,a)=>{const i=s?.slotName??s?.slot_name??t,u=s?.componentId??s?.component_id??i,m=St(i,u)??$t(u)??u;return{key:`${t}-${a}`,slotKey:i,slotName:s?.slotName??s?.slot_name??null,componentId:m,component:R(m),position:s?.position??null,rotation:s?.rotation??null,scale:s?.scale??null,offset:s?.offset??s?.offsets??null,baseState:null}}));{const t=new Set,e=(n,s)=>{if(!n||s>6)return;const a=Array.isArray(n.children)?n.children:[];for(const i of a){const u=i?.componentId??i?.component_id;u!=null&&(t.add(String(u)),e(R(u),s+1))}};for(const n of P)e(n.component??(n.componentId!=null?R(n.componentId):null),0);t.size&&(P=P.filter(n=>!t.has(String(n.componentId))))}{const t=new Map;for(const e of P){const n=String(e.key??e.slotKey??e.componentId??"item"),s=t.get(n)??0;t.set(n,s+1),e.key=s>0?`${n}#${s}`:n}}sn(P);const K=Pt?.[bt]||{},wt=!!(K.visibility||K.transforms),jt=wt?dn(P):null,W=S?.width>0&&S?.depth>0,Y=[S?.cx||0,It,S?.cz||0],at=t=>{const e=t.slotKey;if(e!=null&&String(e)!==""&&O)for(const a of Object.keys(O)){const i=O[a]?.slotKey??O[a]?.slot_key;if(i!=null&&String(i)===String(e))return String(a)}const n=t.component||(t.componentId!=null?R(t.componentId):null),s=n?.groups||n?.group_ids||[];return s.length?String(s[0]):"__ungrouped__"},Gt=(()=>{const t=new Map;return P.forEach((e,n)=>{const s=at(e);t.has(s)||t.set(s,{gid:s,items:[]}),t.get(s).items.push({it:e,i:n})}),[...t.values()]})(),Vt=(t,e)=>{const n=t.component;if(!n)return null;const s=G[t.slotKey],a={visible:!0,materialId:null,variantId:null,...t.baseState,...s};if(a.visible===!1||K.hiddenComponentIds?.some?.(d=>String(d)===String(t.componentId)))return null;let i=null;if(wt){const d=jt[e],h=K.visibility;if(h){for(const[C,w]of Object.entries(h))if(w===!1&&d.has(String(C).toLowerCase()))return null}const y=K.transforms;if(y){for(const[C,w]of Object.entries(y))if(w&&d.has(String(C).toLowerCase())){i=w;break}}}const u=String(n.materialSlot??n.material_slot??"").toLowerCase(),m=g&&u?g[u]:null,f=m?{...a,materialId:m}:a,r={...n,position:t.position||n.position||[0,0,0],rotation:t.rotation||n.rotation||n.orientation||[0,0,0],...t.scale?{scale:t.scale}:{}},p=n.offset||n.offsets||t.offset||null;if(p){const d=Q(p,"position"),h=Q(p,"rotation"),y=Q(p,"scale"),C=r.position||[0,0,0];r.position=[(C[0]||0)+d[0],(C[1]||0)+d[1],(C[2]||0)+d[2]];const w=r.rotation||[0,0,0];r.rotation=[(w[0]||0)+h[0],(w[1]||0)+h[1],(w[2]||0)+h[2]];const v=r.scale||n.scale||[1,1,1];r.scale=[(v[0]||1)+y[0],(v[1]||1)+y[1],(v[2]||1)+y[2]]}if(i){const d=i.position_delta||i.positionDelta;if(Array.isArray(d)){const y=r.position||[0,0,0];r.position=[(y[0]||0)+(d[0]||0),(y[1]||0)+(d[1]||0),(y[2]||0)+(d[2]||0)]}else Array.isArray(i.position)&&(r.position=i.position);Array.isArray(i.rotation)&&(r.rotation=i.rotation);const h=i.scale;Array.isArray(h)?r.scale=h:typeof h=="number"&&(r.scale=[h,h,h]),(i.recalculate_position||i.recalculatePosition)&&(r.recalcPosition=!0)}return b(en,{component:r,componentState:f,instanceId:k,isSelected:!1,onPick:Bt,slotName:t.slotKey??t.component?.slot_name??t.component?.slotName??(t.componentId!=null?`component-${t.componentId}`:null),slotKey:t.slotKey,componentId:t.componentId,hiddenComponentIds:K.hiddenComponentIds||null,slotMaterials:g,onDescendantMeasured:Et,pivot:O?.[at(t)]?.pivot??O?.[String(at(t))]?.pivot??null,onMeasure:d=>Dt(t.key,d,t.position,!!D?.(t,n))},t.key)};return fn("group",{ref:$,name:`placement-${k}`,userData:{instanceId:k,productId:o.productId??null},position:o.position,rotation:o.rotation,scale:Array.isArray(o.scale)?o.scale:[1,1,1],onClick:Lt,onDoubleClick:Tt,onPointerOver:Kt,onPointerOut:Ft,children:[M&&j&&W&&b(Ct,{position:Y,center:!0,style:{pointerEvents:"none"},zIndexRange:[100,0],children:b("div",{style:{width:22,height:22,borderRadius:"50%",background:U?ln:an,display:"flex",alignItems:"center",justifyContent:"center",color:"#fff",fontSize:13,fontWeight:"bold",boxShadow:"0 1px 4px rgba(0,0,0,0.3)",transform:U?"scale(1.15)":"scale(1)"},children:"+"})}),z&&!M&&j&&W&&b("group",{ref:tt,position:Y,children:b(mt,{width:S.width,height:V,depth:S.depth,color:rn,thickness:.01})}),X&&rt&&!M&&j&&W&&b("group",{position:Y,children:b(mt,{width:S.width,height:V,depth:S.depth,color:x,thickness:.008})}),X&&U&&!rt&&!M&&j&&W&&b("group",{position:Y,children:b(mt,{width:S.width,height:V,depth:S.depth,color:cn,thickness:.008})}),F&&(rt||U)&&j&&W&&b(Ct,{position:[S.cx||0,It+V/2+.12,S.cz||0],center:!0,zIndexRange:[100,0],children:b("div",{className:"dimension-label",children:b("span",{children:F})})}),b("group",{ref:pt,children:Gt.map(({gid:t,items:e})=>b("group",{position:un,children:e.map(({it:n,i:s})=>Vt(n,s))},t))})]})}function pn(o,c){if(!o.instance||!c.instance)return o.instance===c.instance;const g=o.instance.instanceId??o.instance.id,l=c.instance.instanceId??c.instance.id;return g===l&&o.instance.productId===c.instance.productId&&o.instance.position===c.instance.position&&o.instance.rotation===c.instance.rotation&&o.components===c.components&&o.slotMaterials===c.slotMaterials&&o.onMeasure===c.onMeasure&&o.footprintExcludeItem===c.footprintExcludeItem&&o.stateInstanceId===c.stateInstanceId&&o.onSelect===c.onSelect&&o.isSelected===c.isSelected&&o.selectionColor===c.selectionColor&&o.overlapping===c.overlapping&&o.isPlacementTarget===c.isPlacementTarget&&o.onPlacementClick===c.onPlacementClick&&o.label===c.label&&o.hoverable===c.hoverable&&o.focusable===c.focusable&&o.disableInteraction===c.disableInteraction}var Nn=qt(mn,pn);export{Nn as default};
1
+ import{jsx as g,jsxs as ye}from"react/jsx-runtime";import{memo as Ut,useRef as P,useState as X,useCallback as dt,useEffect as Z,useSyncExternalStore as Yt}from"react";import{useFrame as Xt,useThree as Zt}from"@react-three/fiber";import{Html as xt}from"@react-three/drei";import*as k from"three";import W from"./9c6c598569.js";import pt from"./872c4302e0.js";import Jt from"./8f60e5059a.js";import At from"./c9a1656c62.js";import{resolveComponentRenderer as te,subscribeSceneRegistry as ee,getSceneRegistryVersion as Nt,runInteraction as mt}from"./95a44ebec2.js";import ft,{SELECTION_COLOR as oe}from"./66c461dc2c.js";import{useUiToggles as ne}from"./d0f9681634.js";import{_anchorHasData as se}from"./9326c23506.js";import{createSlotFootprint as Rt,footprintFlag as re}from"./718ecf1729.js";function ie(o){Yt(ee,Nt,Nt);const i=[o?.slotName,o?.component?.slotName,o?.component?.slot_name,o?.component?.kind,o?.component?.name];let m=null;for(const l of i)if(l!=null&&(m=te(l),m))break;return m?g(m,{...o,Default:At,THREE:k}):g(At,{...o})}function q(o,i,m=[0,0,0]){const l=o?.[i];if(Array.isArray(l)&&l.length>=3)return[Number(l[0])||0,Number(l[1])||0,Number(l[2])||0];if(l&&typeof l=="object")return[Number(l.x)||0,Number(l.y)||0,Number(l.z)||0];const y=z=>o?.[`${i}_${z}`]??o?.[`${i}${z.toUpperCase()}`],x=y("x"),S=y("y"),A=y("z");return x==null&&S==null&&A==null?m:[Number(x)||0,Number(S)||0,Number(A)||0]}function ce(o){if(!Array.isArray(o)||o.length<2)return o;const i=new Set,m=l=>(l?.groups||l?.group_ids||[]).map(String);for(const l of o){const y=l.component,x=y?.anchor_points||y?.anchorPoints;if(!(!Array.isArray(x)||!x.length))for(const S of x){if(!se(S))continue;const A=new Set((S.acceptedGroups||S.accepted_groups||[]).map(String));if(!A.size)continue;const z=new Set((S.excludedGroups||S.excluded_groups||[]).map(String)),D=o.find(L=>{if(L===l||i.has(L.key))return!1;const F=m(L.component);return F.some(B=>A.has(B))&&!F.some(B=>z.has(B))});if(!D)continue;const N=q(S,"position"),_=q(S,"orientation");D.position=[N[0],N[1],N[2]],D.rotation=[_[0],_[1],_[2]],i.add(D.key)}}return o}const ae="#ff0000",le="#333333",Ee=()=>{},ue="rgba(255, 87, 34, 0.85)",de="#ff8a65",pe=re,me=[0,0,0];function fe(o){return o.map(i=>{const m=new Set,l=y=>{y!=null&&String(y)!==""&&m.add(String(y).toLowerCase())};return l(i.slotKey),l(i.slotName),l(i.component?.slot_name??i.component?.slotName),l(i.componentId),m})}function he({instance:o,components:i,slotMaterials:m,onMeasure:l,onSelect:y,isSelected:x,selectionColor:S=oe,style:A,footprintExcludeItem:z,stateInstanceId:D,overlapping:N=!1,isPlacementTarget:_=!1,onPlacementClick:L,label:F,hoverable:B=!1,focusable:vt=!1,disableInteraction:K=!1}){const H=P(),ht=P(),J=P(),tt=P(Rt()),[gt,yt]=X(null),[et,bt]=X(null),[Et,Mt]=X(0),Pt=dt(()=>Mt(t=>t+1),[]),[Q,It]=X(!1),U=ne()("selectionPanel");Z(()=>{tt.current=Rt(),yt(null),bt(null)},[o?.productId]);const zt=W(t=>t.selectInstance),Dt=W(t=>t.selectedInstanceId),ot=pt(t=>t.getProduct),R=pt(t=>t.getComponent),C=pt(t=>t.componentGroups),Lt=W(t=>t.componentStates),Bt=W(t=>t.placementOverrides),$=Jt(t=>t.guiVisible)!==!1,nt=Zt(t=>t.invalidate);Z(()=>{N&&nt?.()},[N,nt]),Xt(({clock:t})=>{if(!N||!J.current)return;const n=.45+.25*Math.sin(t.getElapsedTime()*6);J.current.traverse(e=>{e.isMesh&&e.material&&(e.material.opacity=n)}),nt?.()}),Z(()=>{const t=H.current,n=ht.current;if(!t||!n)return;const e=requestAnimationFrame(()=>{t.updateWorldMatrix(!0,!0);const s=new k.Matrix4().copy(t.matrixWorld).invert(),a=new k.Box3,r=new k.Box3,u=new k.Matrix4;if(n.traverse(c=>{!c.isMesh||!c.geometry||(c.geometry.boundingBox||c.geometry.computeBoundingBox(),r.copy(c.geometry.boundingBox),r.applyMatrix4(u.multiplyMatrices(s,c.matrixWorld)),a.union(r))}),a.isEmpty())return;const d=a.getSize(new k.Vector3),f=a.getCenter(new k.Vector3);bt(c=>c&&c.width===d.x&&c.height===d.y&&c.depth===d.z&&c.cx===f.x&&c.cy===f.y&&c.cz===f.z?c:{width:d.x,height:d.y,depth:d.z,cx:f.x,cy:f.y,cz:f.z})});return()=>cancelAnimationFrame(e)},[gt,Et]);const St=P(!0);Z(()=>()=>{St.current=!1},[]);const wt=P(l);wt.current=l;const st=P(!1),rt=dt(()=>{const t=tt.current,n=t.report();if(!n)return;const e=n.full||n;yt(s=>s&&s.width===e.width&&s.height===e.height&&s.depth===e.depth&&s.cx===e.cx&&s.cz===e.cz?s:e),import.meta.env?.DEV&&(n.__slots={...t.boxes}),wt.current?.(n)},[]),Tt=dt((t,n,e,s=!1)=>{const a=tt.current;if(n!=null){a.set(t,n,e,s),rt();return}a.remove(t)&&(st.current||(st.current=!0,queueMicrotask(()=>{st.current=!1,St.current&&rt()})))},[rt]),w=o.instanceId??o.id,kt=D??w,it=ot(o.productId)||ot(o.variantId),ct=x??Dt===w;if(!it)return null;const at=(t=null)=>{if(!K){if(_&&L){L(w,o);return}U&&mt("click",{placementId:w,instanceId:w,instance:o,componentId:t},n=>{y?y(n.instanceId,n.instance,n.componentId):zt(n.instanceId,n.componentId)})}},Ft=t=>{K||(t.stopPropagation(),at())},Kt=U?y?at:void 0:at,Ht=t=>{if(K||!vt||_||!H.current)return;t.stopPropagation();const n=new k.Box3().setFromObject(H.current),e=new k.Vector3;n.getCenter(e);const s=new k.Sphere;n.getBoundingSphere(s);const a=new k.Quaternion;H.current.getWorldQuaternion(a);const r=new k.Euler().setFromQuaternion(a,"YXZ").y;W.getState().focusOnObject?.([e.x,e.y,e.z],s.radius,r)},$t=t=>{K||!B||(t.stopPropagation(),mt("hover",{placementId:w,instanceId:w,instance:o,hovered:!0},()=>{It(!0),typeof document<"u"&&(document.body.style.cursor="pointer")}))},Gt=()=>{K||!B||mt("hover",{placementId:w,instanceId:w,instance:o,hovered:!1},()=>{It(!1),typeof document<"u"&&(document.body.style.cursor="auto")})},Vt=it.components_configuration||it.componentsConfiguration||{},G=Lt[kt]||{},b=et||gt,V=b?.height>0?b.height:.8,Ct=et?.cy!=null?et.cy:V/2,_t=(t,n)=>{const e=G[t]?.componentId??null;if(e!=null)return e;if(n==null||!C)return null;const s=R(n),a=s?.groups||s?.group_ids||[];for(const r of a){const u=C[r]||C[String(r)];if(!u)continue;const d=new Set([...Object.values(u.variants||{}),...Array.isArray(u.members)?u.members.map(p=>p?.componentId??p?.id??p):[]].map(String));if(d.size&&!d.has(String(n)))continue;const f=u.name??u.slotKey??u.slot_key,c=f!=null?G[f]?.componentId:null,h=G[r]?.componentId??G[String(r)]?.componentId;if(c!=null)return c;if(h!=null)return h}return null},jt=t=>{if(!A||t==null)return null;const n=R(t),e=String(n?.type??"").toLowerCase();if(e!=="door"&&e!=="drawer")return null;const s=n?.groups||n?.group_ids||[];for(const a of s){const u=(C?.[a]||C?.[String(a)])?.variants?.[A];if(u!=null)return u}return null};let E=Array.isArray(i)&&i.length?i.map((t,n)=>{const e=t.slotKey??t.materialSlot??t.material_slot??t.type??`res-${n}`,s=t.componentId??t.component_id??null,a=_t(e,s),r=t.component??t;let u=r;if(a!=null&&String(a)!==String(s)){let d=R(a);if(!d){const f=ot(a),c=f&&(f.components_configuration||f.componentsConfiguration||f.components);if(c&&typeof c=="object"){const h=c[e]??Object.values(c)[0],p=h?.componentId??h?.component_id??(typeof h=="number"||typeof h=="string"?h:null);d=(p!=null?R(p):null)??(h&&typeof h=="object"?h:null)}}d&&(u={...d,position:r.position??d.position,rotation:r.rotation??d.rotation,scale:r.scale??d.scale,materialSlot:r.materialSlot??r.material_slot??d.materialSlot,rotationRad:r.rotationRad??d.rotationRad})}return{key:t.key??`res-${n}`,slotKey:e,componentId:a??s,component:u,position:t.position??r?.position??null,offset:t.offset??r?.offset??null,baseState:{materialId:t.materialId??null,color:t.color??null,roughness:t.roughness,metalness:t.metalness}}}):Object.entries(Vt).flatMap(([t,n])=>(Array.isArray(n)?n:[n]).map((s,a)=>{const r=s?.slotName??s?.slot_name??t,u=s?.componentId??s?.component_id??r,d=_t(r,u)??jt(u)??u;return{key:`${t}-${a}`,slotKey:r,slotName:s?.slotName??s?.slot_name??null,componentId:d,component:R(d),position:s?.position??null,rotation:s?.rotation??null,scale:s?.scale??null,offset:s?.offset??s?.offsets??null,baseState:null}}));{const t=new Set,n=(e,s)=>{if(!e||s>6)return;const a=Array.isArray(e.children)?e.children:[];for(const r of a){const u=r?.componentId??r?.component_id;u!=null&&(t.add(String(u)),n(R(u),s+1))}};for(const e of E)n(e.component??(e.componentId!=null?R(e.componentId):null),0);t.size&&(E=E.filter(e=>!t.has(String(e.componentId))))}{const t=new Map;for(const n of E){const e=String(n.key??n.slotKey??n.componentId??"item"),s=t.get(e)??0;t.set(e,s+1),n.key=s>0?`${e}#${s}`:e}}ce(E);const T=Bt?.[kt]||{},Ot=!!(T.visibility||T.transforms),Wt=Ot?fe(E):null,j=b?.width>0&&b?.depth>0,Y=[b?.cx||0,Ct,b?.cz||0],lt=t=>{const n=t.slotKey;if(n!=null&&String(n)!==""&&C)for(const a of Object.keys(C)){const r=C[a]?.slotKey??C[a]?.slot_key;if(r!=null&&String(r)===String(n))return String(a)}const e=t.component||(t.componentId!=null?R(t.componentId):null),s=e?.groups||e?.group_ids||[];return s.length?String(s[0]):"__ungrouped__"},qt=(()=>{const t=new Map;return E.forEach((n,e)=>{const s=lt(n);t.has(s)||t.set(s,{gid:s,items:[]}),t.get(s).items.push({it:n,i:e})}),[...t.values()]})(),Qt=(t,n)=>{const e=t.component;if(!e)return null;const s=G[t.slotKey],a={visible:!0,materialId:null,variantId:null,...t.baseState,...s};if(a.visible===!1||T.hiddenComponentIds?.some?.(p=>String(p)===String(t.componentId)))return null;let r=null;if(Ot){const p=Wt[n],I=T.visibility;if(I){for(const[M,v]of Object.entries(I))if(v===!1&&p.has(String(M).toLowerCase()))return null}const O=T.transforms;if(O){for(const[M,v]of Object.entries(O))if(v&&p.has(String(M).toLowerCase())){r=v;break}}}const u=String(e.materialSlot??e.material_slot??"").toLowerCase(),d=m&&u?m[u]:null,f=d?{...a,materialId:d}:a,c={...e,position:t.position||e.position||[0,0,0],rotation:t.rotation||e.rotation||e.orientation||[0,0,0],...t.scale?{scale:t.scale}:{}},h=e.offset||e.offsets||t.offset||null;if(h){const p=q(h,"position"),I=q(h,"rotation"),O=q(h,"scale"),M=c.position||[0,0,0];c.position=[(M[0]||0)+p[0],(M[1]||0)+p[1],(M[2]||0)+p[2]];const v=c.rotation||[0,0,0];c.rotation=[(v[0]||0)+I[0],(v[1]||0)+I[1],(v[2]||0)+I[2]];const ut=c.scale||e.scale||[1,1,1];c.scale=[(ut[0]||1)+O[0],(ut[1]||1)+O[1],(ut[2]||1)+O[2]]}if(r){const p=r.position_delta||r.positionDelta;if(Array.isArray(p)){const O=c.position||[0,0,0];c.position=[(O[0]||0)+(p[0]||0),(O[1]||0)+(p[1]||0),(O[2]||0)+(p[2]||0)]}else Array.isArray(r.position)&&(c.position=r.position);Array.isArray(r.rotation)&&(c.rotation=r.rotation);const I=r.scale;Array.isArray(I)?c.scale=I:typeof I=="number"&&(c.scale=[I,I,I]),(r.recalculate_position||r.recalculatePosition)&&(c.recalcPosition=!0)}return g(ie,{component:c,componentState:f,instanceId:w,isSelected:!1,onPick:Kt,slotName:t.slotKey??t.component?.slot_name??t.component?.slotName??(t.componentId!=null?`component-${t.componentId}`:null),slotKey:t.slotKey,componentId:t.componentId,hiddenComponentIds:T.hiddenComponentIds||null,slotMaterials:m,onDescendantMeasured:Pt,pivot:C?.[lt(t)]?.pivot??C?.[String(lt(t))]?.pivot??null,onMeasure:p=>Tt(t.key,p,c,pe(z?.(t,e)))},t.key)};return ye("group",{ref:H,name:`placement-${w}`,userData:{instanceId:w,productId:o.productId??null},position:o.position,rotation:o.rotation,scale:Array.isArray(o.scale)?o.scale:[1,1,1],onClick:Ft,onDoubleClick:Ht,onPointerOver:$t,onPointerOut:Gt,children:[_&&$&&j&&g(xt,{position:Y,center:!0,style:{pointerEvents:"none"},zIndexRange:[100,0],children:g("div",{style:{width:22,height:22,borderRadius:"50%",background:Q?de:ue,display:"flex",alignItems:"center",justifyContent:"center",color:"#fff",fontSize:13,fontWeight:"bold",boxShadow:"0 1px 4px rgba(0,0,0,0.3)",transform:Q?"scale(1.15)":"scale(1)"},children:"+"})}),N&&!_&&$&&j&&g("group",{ref:J,position:Y,children:g(ft,{width:b.width,height:V,depth:b.depth,color:ae,thickness:.01})}),U&&ct&&!_&&$&&j&&g("group",{position:Y,children:g(ft,{width:b.width,height:V,depth:b.depth,color:S,thickness:.008})}),U&&Q&&!ct&&!_&&$&&j&&g("group",{position:Y,children:g(ft,{width:b.width,height:V,depth:b.depth,color:le,thickness:.008})}),F&&(ct||Q)&&$&&j&&g(xt,{position:[b.cx||0,Ct+V/2+.12,b.cz||0],center:!0,zIndexRange:[100,0],children:g("div",{className:"dimension-label",children:g("span",{children:F})})}),g("group",{ref:ht,children:qt.map(({gid:t,items:n})=>g("group",{position:me,children:n.map(({it:e,i:s})=>Qt(e,s))},t))})]})}function ge(o,i){if(!o.instance||!i.instance)return o.instance===i.instance;const m=o.instance.instanceId??o.instance.id,l=i.instance.instanceId??i.instance.id;return m===l&&o.instance.productId===i.instance.productId&&o.instance.position===i.instance.position&&o.instance.rotation===i.instance.rotation&&o.components===i.components&&o.slotMaterials===i.slotMaterials&&o.onMeasure===i.onMeasure&&o.footprintExcludeItem===i.footprintExcludeItem&&o.stateInstanceId===i.stateInstanceId&&o.onSelect===i.onSelect&&o.isSelected===i.isSelected&&o.selectionColor===i.selectionColor&&o.overlapping===i.overlapping&&o.isPlacementTarget===i.isPlacementTarget&&o.onPlacementClick===i.onPlacementClick&&o.label===i.label&&o.hoverable===i.hoverable&&o.focusable===i.focusable&&o.disableInteraction===i.disableInteraction}var Me=Ut(he,ge);export{Me as default};
@@ -1 +1 @@
1
- const o=Object.freeze({CHANGE_VARIANT:"changeVariant",SET_ROOM_DIMENSIONS:"setRoomDimensions",RESTORE_STATE:"restoreState",SELECT_OPTION:"selectOption",SELECT_SYSTEM_OPTION:"selectSystemOption",ADD_PLACEMENT:"addPlacement",REMOVE_PLACEMENT:"removePlacement",MOVE_PLACEMENT:"movePlacement",SET_TRANSFORM:"setTransform",APPLY_PRESET:"applyPreset",CLEAR_SELECTION:"clearSelection",CLEAR_SYSTEM_SELECTION:"clearSystemSelection",NOOP:"noop"}),s=(e,t)=>({type:o.CHANGE_VARIANT,placementId:e,variantId:t}),O=(e,t,E)=>({type:o.SET_ROOM_DIMENSIONS,width:e,depth:t,height:E}),_=e=>({type:o.RESTORE_STATE,savedState:e}),a=(e,t,E)=>({type:o.SELECT_OPTION,placementId:e,optionSetId:t,optionId:E}),i=(e,t)=>({type:o.SELECT_SYSTEM_OPTION,optionSetId:e,optionId:t}),N=({productGraphId:e,variantId:t,placementGroup:E,position:p,sequence:T,hostPlacementId:r,hostVariantId:l,replace:n,replacePlacementId:c}={})=>{const S={type:o.ADD_PLACEMENT,productGraphId:e,variantId:t,placementGroup:E,position:p};return T!=null&&(S.sequence=T),r!=null&&(S.hostPlacementId=r),l!=null&&(S.hostVariantId=l),n&&(S.replace=!0,c!=null&&(S.replacePlacementId=c)),S},P=e=>({type:o.REMOVE_PLACEMENT,placementId:e}),A=({placementId:e,sequence:t,placementGroup:E,position:p,rotation:T,hostPlacementId:r,hostVariantId:l}={})=>{const n={type:o.MOVE_PLACEMENT,placementId:e,sequence:t};return E!=null&&(n.placementGroup=E),p!=null&&(n.position=p),T!=null&&(n.rotation=T),r!=null&&(n.hostPlacementId=r),l!=null&&(n.hostVariantId=l),n},R=(e,t,E)=>({type:o.SET_TRANSFORM,placementId:e,position:t,rotation:E}),M=e=>({type:o.APPLY_PRESET,presetId:e}),m=(e,t)=>({type:o.CLEAR_SELECTION,placementId:e,optionSetId:t}),y=e=>({type:o.CLEAR_SYSTEM_SELECTION,optionSetId:e}),L=()=>({type:o.NOOP});function C(e){return e?.type===o.SET_TRANSFORM}export{o as MutationType,N as addPlacement,M as applyPreset,s as changeVariant,m as clearSelection,y as clearSystemSelection,C as isLocalOnlyMutation,A as movePlacement,L as noop,P as removePlacement,_ as restoreState,a as selectOption,i as selectSystemOption,O as setRoomDimensions,R as setTransform};
1
+ const o=Object.freeze({CHANGE_VARIANT:"changeVariant",CHANGE_HOST_VARIANT:"changeHostVariant",SET_ROOM_DIMENSIONS:"setRoomDimensions",RESTORE_STATE:"restoreState",SELECT_OPTION:"selectOption",SELECT_SYSTEM_OPTION:"selectSystemOption",ADD_PLACEMENT:"addPlacement",REMOVE_PLACEMENT:"removePlacement",MOVE_PLACEMENT:"movePlacement",SET_TRANSFORM:"setTransform",APPLY_PRESET:"applyPreset",CLEAR_SELECTION:"clearSelection",CLEAR_SYSTEM_SELECTION:"clearSystemSelection",NOOP:"noop"}),l=(e,t)=>({type:o.CHANGE_VARIANT,placementId:e,variantId:t}),O=(e,t)=>({type:o.CHANGE_HOST_VARIANT,placementId:e,variantId:t}),_=(e,t,n)=>({type:o.SET_ROOM_DIMENSIONS,width:e,depth:t,height:n}),a=e=>({type:o.RESTORE_STATE,savedState:e}),A=(e,t,n)=>({type:o.SELECT_OPTION,placementId:e,optionSetId:t,optionId:n}),N=(e,t)=>({type:o.SELECT_SYSTEM_OPTION,optionSetId:e,optionId:t}),i=({productGraphId:e,variantId:t,placementGroup:n,position:p,sequence:S,hostPlacementId:r,hostVariantId:c,replace:E,replacePlacementId:s}={})=>{const T={type:o.ADD_PLACEMENT,productGraphId:e,variantId:t,placementGroup:n,position:p};return S!=null&&(T.sequence=S),r!=null&&(T.hostPlacementId=r),c!=null&&(T.hostVariantId=c),E&&(T.replace=!0,s!=null&&(T.replacePlacementId=s)),T},P=e=>({type:o.REMOVE_PLACEMENT,placementId:e}),R=({placementId:e,sequence:t,placementGroup:n,position:p,rotation:S,hostPlacementId:r,hostVariantId:c}={})=>{const E={type:o.MOVE_PLACEMENT,placementId:e,sequence:t};return n!=null&&(E.placementGroup=n),p!=null&&(E.position=p),S!=null&&(E.rotation=S),r!=null&&(E.hostPlacementId=r),c!=null&&(E.hostVariantId=c),E},y=(e,t,n)=>({type:o.SET_TRANSFORM,placementId:e,position:t,rotation:n}),M=e=>({type:o.APPLY_PRESET,presetId:e}),m=(e,t)=>({type:o.CLEAR_SELECTION,placementId:e,optionSetId:t}),C=e=>({type:o.CLEAR_SYSTEM_SELECTION,optionSetId:e}),L=()=>({type:o.NOOP});function u(e){return e?.type===o.SET_TRANSFORM}export{o as MutationType,i as addPlacement,M as applyPreset,O as changeHostVariant,l as changeVariant,m as clearSelection,C as clearSystemSelection,u as isLocalOnlyMutation,R as movePlacement,L as noop,P as removePlacement,a as restoreState,A as selectOption,N as selectSystemOption,_ as setRoomDimensions,y as setTransform};
@@ -1 +1 @@
1
- import*as o from"three";const t={ACESFilmic:o.ACESFilmicToneMapping,Reinhard:o.ReinhardToneMapping,Linear:o.LinearToneMapping,None:o.NoToneMapping,Cineon:o.CineonToneMapping},d={PCF:o.PCFSoftShadowMap,PCFSoft:o.PCFSoftShadowMap,PCFHard:o.PCFShadowMap,VSM:o.VSMShadowMap,Basic:o.BasicShadowMap},M={toneMapping:o.NoToneMapping,exposure:1,shadowMapType:o.PCFSoftShadowMap};function r(a,p){if(!a||!p)return;if(a.tone_mapping||a.toneMapping){const n=a.tone_mapping??a.toneMapping,s=t[n];s!=null&&(p.toneMapping=s)}const e=a.exposure,i=e!=null&&e!==""?Number(e):NaN;if(p.toneMappingExposure=Number.isFinite(i)?i:M.exposure,a.shadows&&(typeof a.shadows.enabled=="boolean"&&(p.shadowMap.enabled=a.shadows.enabled),a.shadows.type)){const n=d[a.shadows.type];n!=null&&(p.shadowMap.type=n),p.shadowMap.needsUpdate=!0}}export{M as RENDERER_DEFAULTS,r as applyEnvironmentToRenderer};
1
+ import*as o from"three";const M={ACESFilmic:o.ACESFilmicToneMapping,Reinhard:o.ReinhardToneMapping,Linear:o.LinearToneMapping,None:o.NoToneMapping,Cineon:o.CineonToneMapping},r={PCF:o.PCFSoftShadowMap,PCFSoft:o.PCFSoftShadowMap,PCFHard:o.PCFShadowMap,VSM:o.VSMShadowMap,Basic:o.BasicShadowMap},i={toneMapping:o.NoToneMapping,exposure:1,shadowMapType:o.PCFSoftShadowMap};function h(a,p){if(!a||!p)return;const n=a.tone_mapping??a.toneMapping,s=n!=null&&n!==""?M[n]:null;p.toneMapping=s??i.toneMapping;const e=a.exposure,t=e!=null&&e!==""?Number(e):NaN;if(p.toneMappingExposure=Number.isFinite(t)?t:i.exposure,a.shadows){typeof a.shadows.enabled=="boolean"&&(p.shadowMap.enabled=a.shadows.enabled);const d=a.shadows.type?r[a.shadows.type]:null;p.shadowMap.type=d??i.shadowMapType,p.shadowMap.needsUpdate=!0}}export{i as RENDERER_DEFAULTS,h as applyEnvironmentToRenderer};
@@ -1 +1 @@
1
- import{useCallback as d,useMemo as v,useRef as y}from"react";import O from"./872c4302e0.js";import _ from"./9c6c598569.js";function j(){const r=O(e=>e.getProduct),s=_(e=>e.productInstances),u=d(e=>r(e?.variantId)?.edge||r(e?.productId)?.edge||""||null,[r]),l=d(e=>{const o=r(e?.variantId)||r(e?.productId);return o?.corner===!0||o?.corner==="true"||String(o?.edge??"").toLowerCase()==="corner"},[r]),f=d(e=>{if(e?.positionedAbove!=null)return!0;const o=r(e?.variantId)||r(e?.productId),c=o?.hostVariants??o?.host_variants;return Array.isArray(c)&&c.length>0},[r]),p=d(e=>!f(e)&&!!(r(e?.variantId)?.movable??r(e?.productId)?.movable),[r,f]),i=v(()=>Object.values(s||{}).filter(p),[s,p]),I=i.length>0&&i.length<Object.keys(s||{}).length,h=I?i:[],m=y(!1),b=v(()=>{const e=t=>t==="left"?-1:t==="right"?1:0,o=new Set(h.map(t=>t.id)),c=t=>{const n=Number(t?.sequence);return Number.isFinite(n)?n:t?.createdAt||0};return Object.values(s||{}).filter(t=>!o.has(t.id)).map(t=>({inst:{...t,corner:l(t)},edge:u(t)})).sort((t,n)=>e(t.edge)-e(n.edge)||c(t.inst)-c(n.inst)).map(t=>t.inst)},[s,u,l,h]),A=v(()=>{const e=[];for(const o of Object.values(s||{})){if(o.positionedAbove!=null)continue;const c=r(o.variantId)||r(o.productId),a=c?.hostVariants??c?.host_variants;if(!Array.isArray(a)||!a.length)continue;const t=a.find(g=>g?.isDefault??g?.is_default)||a[0],n=t?.hostVariantId??t?.host_variant_id;n==null||!r(n)||e.push({id:`${o.id}__host`,hostedProductId:o.id,hostVariantId:n,offset:Array.isArray(t?.position)?t.position:[0,0,0],rotDegY:Array.isArray(t?.rotation)&&t.rotation[1]||0})}return e},[s,r]);return{edgeOf:u,cornerOf:l,isHostAnchored:f,isMovable:p,rawFree:i,splitReliable:I,freeInstances:h,ordered:b,syntheticHosts:A,moveInFlightRef:m,productInstances:s,getProduct:r}}export{j as default};
1
+ import{useCallback as d,useMemo as v,useRef as y}from"react";import A from"./872c4302e0.js";import O from"./9c6c598569.js";import{resolveHostEntry as j}from"./be07a7f885.js";function S(){const r=A(t=>t.getProduct),n=O(t=>t.productInstances),u=d(t=>r(t?.variantId)?.edge||r(t?.productId)?.edge||""||null,[r]),l=d(t=>{const o=r(t?.variantId)||r(t?.productId);return o?.corner===!0||o?.corner==="true"||String(o?.edge??"").toLowerCase()==="corner"},[r]),f=d(t=>{if(t?.positionedAbove!=null)return!0;const o=r(t?.variantId)||r(t?.productId),c=o?.hostVariants??o?.host_variants;return Array.isArray(c)&&c.length>0},[r]),p=d(t=>!f(t)&&!!(r(t?.variantId)?.movable??r(t?.productId)?.movable),[r,f]),i=v(()=>Object.values(n||{}).filter(p),[n,p]),I=i.length>0&&i.length<Object.keys(n||{}).length,h=I?i:[],m=y(!1),g=v(()=>{const t=e=>e==="left"?-1:e==="right"?1:0,o=new Set(h.map(e=>e.id)),c=e=>{const a=Number(e?.sequence);return Number.isFinite(a)?a:e?.createdAt||0};return Object.values(n||{}).filter(e=>!o.has(e.id)).map(e=>({inst:{...e,corner:l(e)},edge:u(e)})).sort((e,a)=>t(e.edge)-t(a.edge)||c(e.inst)-c(a.inst)).map(e=>e.inst)},[n,u,l,h]),b=v(()=>{const t=[];for(const o of Object.values(n||{})){if(o.positionedAbove!=null)continue;const c=r(o.variantId)||r(o.productId),s=j(c,o);if(!s)continue;const e=s?.hostVariantId??s?.host_variant_id;e==null||!r(e)||t.push({id:`${o.id}__host`,hostedProductId:o.id,hostVariantId:e,offset:Array.isArray(s?.position)?s.position:[0,0,0],rotDegY:Array.isArray(s?.rotation)&&s.rotation[1]||0})}return t},[n,r]);return{edgeOf:u,cornerOf:l,isHostAnchored:f,isMovable:p,rawFree:i,splitReliable:I,freeInstances:h,ordered:g,syntheticHosts:b,moveInFlightRef:m,productInstances:n,getProduct:r}}export{S as default};
@@ -1 +1 @@
1
- import ht from"./d803155241.js";import{resolveLockVariantId as lt}from"./061b81ad81.js";const ft=E=>{const O=Number(E);return!Number.isFinite(O)||O===0?null:O},ut=(E,O)=>{const H=Array.isArray(E?.hostVariants)?E.hostVariants:Array.isArray(E?.host_variants)?E.host_variants:[];if(!H.length)return null;const R=J=>String(J?.hostVariantId??J?.host_variant_id)===String(O);return H.find(R)||H.find(J=>J?.isDefault??J?.is_default)||H[0]||null},Mt=(E,O)=>{const H=E?.placementGroup??E?.placement_group;if(H!=null&&String(H)!=="")return String(H);const R=O?.(E?.variantId)||O?.(E?.productId);return String(R?.placementGroup??R?.placement_group??"")};var wt={id:"grouped-chain",label:"Grouped chain (backend + group attach)",mode:"compute",handlesCorners:!0,computeLayout(E,O={}){const{getProduct:H}=O,R=Array.isArray(E)?E:[],J=p=>String(p?.id??p?.instanceId??""),pt=new Map(R.map(p=>[J(p),p])),W=p=>H?.(p?.variantId)||H?.(p?.productId)||null,it=p=>{const x=W(p),w=x?.hostVariants??x?.host_variants;return Array.isArray(w)&&w.length?w:null},et=p=>{const x=p?.positionedAbove??p?.positioned_above??null;return x!=null?String(x):null},tt=p=>et(p)!=null,nt=p=>lt(p)??lt(W(p)),yt=p=>nt(p)!=null,ct=p=>String(p?.variantId??p?.productId??""),ot=new Set,C=p=>ot.has(p),j=R.filter(p=>!tt(p)),U=R.filter(p=>tt(p));if(O.useTransform){const p=Math.PI/180;return R.map(x=>{const w=Array.isArray(x?.position)?x.position:[0,0,0],Z=Array.isArray(x?.rotation)?x.rotation:[0,0,0];return{position:[Number(w[0])||0,Number(w[1])||0,Number(w[2])||0],rotation:[(Number(Z[0])||0)*p,(Number(Z[1])||0)*p,(Number(Z[2])||0)*p]}})}const G=new Map;for(const p of j){const x=Mt(p,H);G.has(x)||G.set(x,[]),G.get(x).push(p)}const g=new Map;for(const[,p]of G){const x=ht.computeLayout(p,O);p.forEach((w,Z)=>{const a=x[Z]||{position:[0,0,0],rotation:[0,0,0]},s=Array.isArray(w?.position)?w.position:[],t=a.position||[0,0,0],o=ft(s[1]);g.set(w,{position:[t[0],o??t[1],t[2]],rotation:a.rotation||[0,0,0]})})}for(const[,p]of G){const x=new Map;for(const a of p){const s=g.get(a)?.position?.[1]||0;s>.01&&x.set(s,(x.get(s)||0)+1)}if(!x.size)continue;let w=0,Z=0;for(const[a,s]of x)s>Z&&(Z=s,w=a);if(!(Z<p.length/2))for(const a of p){const s=g.get(a);s&&(s.position[1]||0)<=.01&&g.set(a,{position:[s.position[0],w,s.position[2]],rotation:s.rotation})}}{const x=t=>{const o=g.get(t);if(!o)return null;const M=o.position,i=-((Array.isArray(o.rotation)?o.rotation[1]:0)||0),h=Math.cos(i),e=Math.sin(i),r=-Math.sin(i),c=Math.cos(i),l=O.getDims?.(t.productId)??O.getDims?.(t.variantId)??null,u=W(t),m=l?.width>.05&&l?.depth>.05,f=m?l.width:u?.width>0?u.width*.0254:.9,A=m?l.depth:u?.depth>0?u.depth*.0254:.95,X=m&&l.cx||0,I=m&&l.cz||0,N=M[0]+h*X+r*I,d=M[2]+e*X+c*I;return[N+h*(f/2)-r*(A/2),d+e*(f/2)-c*(A/2)]},w=new Set;for(const t of R){const o=nt(t);o!=null&&w.add(o)}let Z=null,a=0;for(const[t,o]of G){const M=o.reduce((i,h)=>i+(w.has(ct(h))?1:0),0);M>a&&(a=M,Z=t)}const s=Z!=null?G.get(Z):null;if(s){const t=new Map;for(const o of[...s].sort((M,i)=>Number(M.sequence)-Number(i.sequence))){const M=ct(o);t.has(M)||t.set(M,[]),t.get(M).push(o)}for(const[o,M]of G){if(o===Z)continue;const i=M.map(c=>({inst:c,tv:nt(c),seq:Number(c.sequence)})).filter(c=>c.tv!=null&&Number.isFinite(c.seq)).sort((c,l)=>c.seq-l.seq);if(!i.length)continue;const h=new Map,e=[];for(const c of i){const l=t.get(c.tv);if(!l||!l.length)continue;const u=h.get(c.tv)||0,m=Math.min(u,l.length-1);h.set(c.tv,u+1);const f=l[m],A=x(c.inst),X=x(f);!A||!X||(e.push({seq:c.seq,delta:[X[0]-A[0],X[1]-A[1]],lockInst:c.inst}),ot.add(c.inst),ot.add(f))}if(!e.length)continue;e.sort((c,l)=>c.seq-l.seq);const r=new Map;for(const c of M){const l=Number(c?.sequence);let u=e[0];if(Number.isFinite(l))for(const m of e)if(m.seq<=l)u=m;else break;r.set(c,u.delta)}for(const c of M){const l=g.get(c);if(!l)continue;const u=r.get(c)||e[0].delta;g.set(c,{position:[l.position[0]+u[0],l.position[1],l.position[2]+u[1]],rotation:l.rotation})}}}}{const x=Z=>{const a=O.getDims?.(Z.productId)??O.getDims?.(Z.variantId)??null,s=W(Z),t=a?.width>.05&&a?.depth>.05;return{w:t?a.width:s?.width>0?s.width*.0254:.9,dp:t?a.depth:s?.depth>0?s.depth*.0254:.6,cx:t&&a.cx||0,cz:t&&a.cz||0}},w=Z=>{const a=g.get(Z);if(!a)return null;const[s,,t]=a.position,o=(Array.isArray(a.rotation)?a.rotation[1]:0)||0,{cx:M,cz:i}=x(Z);return{x:s+M*Math.cos(o)+i*Math.sin(o),z:t-M*Math.sin(o)+i*Math.cos(o),y:a.position[1],r:o}};for(const[,Z]of G){const a=Z.filter(r=>C(r)&&Number.isFinite(Number(r.sequence))).map(r=>({inst:r,seq:Number(r.sequence)})).sort((r,c)=>r.seq-c.seq);if(a.length<2)continue;const s=[];for(let r=0;r<a.length-1;r++){const c=a[r].inst,l=a[r+1].inst,u=Z.filter(Y=>{const F=Number(Y?.sequence);return!C(Y)&&Number.isFinite(F)&&F>a[r].seq&&F<a[r+1].seq}).sort((Y,F)=>Number(Y.sequence)-Number(F.sequence));if(!u.length)continue;const m=-((Array.isArray(g.get(u[0])?.rotation)?g.get(u[0]).rotation[1]:0)||0),f=Math.cos(m),A=Math.sin(m),X=-A,I=f,N=Y=>Y.x*f+Y.z*A,d=Y=>{const{w:F,dp:D}=x(Y),P=w(Y);return P?Math.abs(Math.cos(P.r+m))*(F/2)+Math.abs(Math.sin(P.r+m))*(D/2):0},z=w(c),n=w(l);if(!z||!n)continue;const b=N(z),q=N(n),v=q>=b?1:-1,y=b+v*d(c),S=q-v*d(l),L=(S-y)*v,_=u.map(Y=>x(Y).w),k=_.reduce((Y,F)=>Y+F,0),V=new Array(u.length);if(k<=L+.02){const Y=k/2;let F=0,D=u.length;for(let T=0;T<u.length;T++)if(F+=_[T],F>Y){D=T;break}let P=y;for(let T=0;T<D;T++)V[T]=P+v*_[T]/2,P+=v*_[T];P=S;for(let T=u.length-1;T>=D;T--)V[T]=P-v*_[T]/2,P-=v*_[T]}else{let Y=0,F=0;for(let B=0;B<u.length&&!(F+_[B]>L+.02);B++)F+=_[B],Y=B+1;for(let B=Y;B<u.length;B++)s.push(u[B]);const P=_.slice(0,Y).reduce((B,xt)=>B+xt,0)/2;let T=0,K=Y;for(let B=0;B<Y;B++)if(T+=_[B],T>P){K=B;break}let Q=y;for(let B=0;B<K;B++)V[B]=Q+v*_[B]/2,Q+=v*_[B];Q=S;for(let B=Y-1;B>=K;B--)V[B]=Q-v*_[B]/2,Q-=v*_[B]}u.forEach((Y,F)=>{const D=w(Y);if(!D||V[F]==null)return;const{cx:P,cz:T}=x(Y),K=D.x*X+D.z*I,Q=V[F]*f+K*X,B=V[F]*A+K*I;g.set(Y,{position:[Q-(P*Math.cos(D.r)+T*Math.sin(D.r)),D.y,B-(-P*Math.sin(D.r)+T*Math.cos(D.r))],rotation:g.get(Y).rotation})})}const t=(r,c,l)=>{if(!c.length||!r)return;const u=l&&l.rotY!=null,m=u?l.rotY:(Array.isArray(g.get(c[0])?.rotation)?g.get(c[0]).rotation[1]:0)||0,f=-m,A=Math.cos(f),X=Math.sin(f),I=-X,N=A,d=S=>S.x*A+S.z*X,z=w(r);if(!z)return;const n=w(l?.dirRef||c[0]),b=n&&Math.sign(d(n)-d(z))||1,q=x(r),v=Math.abs(Math.cos(z.r+f))*(q.w/2)+Math.abs(Math.sin(z.r+f))*(q.dp/2);let y=d(z)+b*v;for(const S of c){const L=w(S);if(!L)continue;const{w:_,dp:k,cx:V,cz:Y}=x(S),F=y+b*_/2,D=u?m:L.r,P=u?l.perpBack!=null?l.perpBack+k/2:l.perpLine:L.x*I+L.z*N,T=F*A+P*I,K=F*X+P*N;g.set(S,{position:[T-(V*Math.cos(D)+Y*Math.sin(D)),L.y,K-(-V*Math.sin(D)+Y*Math.cos(D))],rotation:u?[0,m,0]:g.get(S).rotation}),y+=b*_}},o=a[0].seq,M=a[a.length-1].seq,i=Z.filter(r=>{const c=Number(r?.sequence);return!C(r)&&Number.isFinite(c)&&c<o}).sort((r,c)=>Number(c.sequence)-Number(r.sequence)),h=Z.filter(r=>{const c=Number(r?.sequence);return!C(r)&&Number.isFinite(c)&&c>M}).sort((r,c)=>Number(r.sequence)-Number(c.sequence));t(a[0].inst,i);const e=a[a.length-1].inst;if(h.length){const r=w(h[0]),c=(Array.isArray(g.get(h[0])?.rotation)?g.get(h[0]).rotation[1]:0)||0,l=-c,u=-Math.sin(l),m=Math.cos(l),f=r?r.x*u+r.z*m:0,A=f-x(h[0]).dp/2,X=[...s,...h],I=X.findIndex(z=>!!z?.corner),N=I>=0?X.slice(0,I+1):X;t(e,N,{rotY:c,perpLine:f,perpBack:A,dirRef:h[0]});const d=I>=0?X.slice(I+1):[];if(d.length){const z=X[I],n=[z,...d],b=ht.computeLayout(n,O)||[],q=g.get(z),v=b[0];if(q&&v){const y=(q.rotation?.[1]||0)-(v.rotation?.[1]||0),S=Math.cos(y),L=Math.sin(y);d.forEach((_,k)=>{const V=b[k+1];if(!V)return;const Y=V.position[0]-v.position[0],F=V.position[2]-v.position[2],D=g.get(_);g.set(_,{position:[q.position[0]+Y*S+F*L,D?.position?.[1]??q.position[1],q.position[2]-Y*L+F*S],rotation:[0,(V.rotation?.[1]||0)+y,0]})})}}}else t(e,s)}}const rt=new Map;for(const p of R){if(!C(p))continue;const x=g.get(p);x?.position&&rt.set(p,x.position.slice())}const dt=()=>{for(const[p,x]of rt){const w=g.get(p);w&&g.set(p,{position:x.slice(),rotation:w.rotation})}};{const x=a=>{const s=O.getDims?.(a.productId)??O.getDims?.(a.variantId)??null,t=W(a);return{w:s?.width>0?s.width:t?.width>0?t.width*.0254:.9,dp:s?.depth>0?s.depth:t?.depth>0?t.depth*.0254:.6,h:s?.height>0?s.height:t?.height>0?t.height*.0254:.9,cx:s?.cx||0,cz:s?.cz||0}},w=a=>{const s=g.get(a);if(!s)return null;const[t,o,M]=s.position,i=(Array.isArray(s.rotation)?s.rotation[1]:0)||0,{w:h,dp:e,h:r,cx:c,cz:l}=x(a),u=Math.cos(i),m=Math.sin(i),f=t+c*u+l*m,A=M-c*m+l*u,X=Math.abs(u),I=Math.abs(m),N=(h*X+e*I)/2,d=(h*I+e*X)/2;let z=f-N,n=f+N,b=A-d,q=A+d;if(tt(a)?null:it(a)){const y=ut(W(a),null),S=Array.isArray(y?.position)?y.position:[0,0,0],L=f+(S[0]||0)*u+(S[2]||0)*m,_=A-(S[0]||0)*m+(S[2]||0)*u;z=Math.min(z,L-N),n=Math.max(n,L+N),b=Math.min(b,_-d),q=Math.max(q,_+d)}return{minX:z,maxX:n,minZ:b,maxZ:q,minY:o,maxY:o+r}};let Z=1/0;for(const a of R){const s=g.get(a)?.position?.[1]||0;s>.01&&s<Z&&(Z=s)}if(Number.isFinite(Z)){const a=new Map,s=new Map;for(const i of j){const h=w(i);h&&(a.set(i,h),s.set(i,(g.get(i)?.position?.[1]||0)>.01))}const t=j.filter(i=>{if(C(i))return!1;const h=a.get(i);return h&&!s.get(i)&&h.maxY>Z+.05}),o=(i,h)=>i.minX<h.maxX-.02&&i.maxX>h.minX+.02&&i.minZ<h.maxZ-.02&&i.maxZ>h.minZ+.02&&i.minY<h.maxY-.02&&i.maxY>h.minY+.02,M=new Set(t);for(const i of t){const h=a.get(i),e=-(g.get(i)?.rotation?.[1]||0),r=Math.cos(e),c=Math.sin(e),l=-c,u=r,m=y=>({lo:Math.min(y.minX*r+y.minZ*c,y.maxX*r+y.maxZ*c),hi:Math.max(y.minX*r+y.minZ*c,y.maxX*r+y.maxZ*c)}),f=y=>(y.minX+y.maxX)/2*l+(y.minZ+y.maxZ)/2*u,A=f(h),X=m(h);let I=!1;for(const y of j){if(!s.get(y))continue;const S=a.get(y);if(S&&o(h,S)){I=!0;break}}if(!I)continue;const N=j.filter(y=>{if(y===i||M.has(y))return!1;const S=-(g.get(y)?.rotation?.[1]||0);if(Math.abs(Math.cos(e-S))<.9)return!1;const L=a.get(y);return L&&Math.abs(f(L)-A)<1});if(!N.length)continue;let d=null;for(const y of[...j,...U]){if(!y?.corner)continue;const S=a.get(y)||w(y);if(!S||Math.abs(f(S)-A)>1.6)continue;const L=m(S);d=(L.lo+L.hi)/2;break}const z=(X.lo+X.hi)/2,n=d!=null&&z<d?-1:1;let b=0;const q=Math.max(...N.map(y=>m(a.get(y)).hi)),v=Math.min(...N.map(y=>m(a.get(y)).lo));if(n>0?b=Math.max(0,q+.005-X.lo):b=Math.min(0,v-.005-X.hi),Math.abs(b)>.005){const y=g.get(i);g.set(i,{position:[y.position[0]+r*b,y.position[1],y.position[2]+c*b],rotation:y.rotation}),a.set(i,w(i))}}}}const at=p=>String(p?.variantId??p?.productId??""),gt=p=>{const x=et(p);if(x!=null)return pt.get(x)||null;const w=it(p)||[],Z=new Set(w.map(a=>String(a?.hostVariantId??a?.host_variant_id)));return R.find(a=>a!==p&&Z.has(at(a)))||null};let $=U.slice(),st=!0;for(;$.length&&st;){st=!1;const p=[];for(const x of $){const w=gt(x),Z=w?g.get(w):null;if(!Z){p.push(x);continue}const a=ut(W(x),at(w)),s=Z.position||[0,0,0],t=(Array.isArray(Z.rotation)?Z.rotation[1]:0)||0,o=Math.cos(t),M=Math.sin(t),i=a&&Array.isArray(a.position)?a.position:[0,0,0],e=(O.getDims?.(w.productId)??O.getDims?.(w.variantId)??null)?.cx||0,r=ft(Array.isArray(x?.position)?x.position[1]:null),c=[s[0]+e*o+(i[2]||0)*M,r??s[1]+(i[1]||0),s[2]-e*M+(i[2]||0)*o],l=a&&Array.isArray(a.rotation)?(a.rotation[1]||0)*Math.PI/180:0;g.set(x,{position:c,rotation:[0,t+l,0]}),st=!0}$=p}for(const p of $){const x=Array.isArray(p?.position)?p.position:[];g.set(p,{position:x.length?x:[0,0,0],rotation:p?.rotation||[0,0,0]})}{const x=[],w=t=>{const o=O.getDims?.(t.productId)??O.getDims?.(t.variantId)??null,M=W(t);return{w:o?.width>0?o.width:M?.width>0?M.width*.0254:.9,dp:o?.depth>0?o.depth:M?.depth>0?M.depth*.0254:.6,h:o?.height>0?o.height:M?.height>0?M.height*.0254:.9,cx:o?.cx||0,cz:o?.cz||0}},Z=t=>{const o=g.get(t);if(!o)return null;const[M,i,h]=o.position,e=(Array.isArray(o.rotation)?o.rotation[1]:0)||0,{w:r,dp:c,h:l,cx:u,cz:m}=w(t),f=Math.cos(e),A=Math.sin(e),X=M+u*f+m*A,I=h-u*A+m*f,N=Math.abs(f),d=Math.abs(A),z=(r*N+c*d)/2,n=(r*d+c*N)/2;return{minX:X-z,maxX:X+z,minZ:I-n,maxZ:I+n,minY:i,maxY:i+l}};let a=1/0;for(const t of R){const o=g.get(t)?.position?.[1]||0;o>.01&&o<a&&(a=o)}const s=t=>(g.get(t)?.position?.[1]||0)>.01;for(const t of U){const o=Z(t);if(!o||o.maxY<=a+.05)continue;const M=-((Array.isArray(g.get(t)?.rotation)?g.get(t).rotation[1]:0)||0),i=Math.cos(M),h=Math.sin(M),e=-h,r=i,c=n=>Math.min(n.minX*i+n.minZ*h,n.maxX*i+n.maxZ*h),l=n=>Math.max(n.minX*i+n.minZ*h,n.maxX*i+n.maxZ*h),u=n=>(n.minX+n.maxX)/2*e+(n.minZ+n.maxZ)/2*r,m=n=>(n.minX+n.maxX)/2*i+(n.minZ+n.maxZ)/2*h,f=c(o),A=l(o),X=(f+A)/2,I=u(o);let N=null;for(const n of[...j,...U]){if(!n?.corner)continue;const b=Z(n);if(b&&!(Math.abs(u(b)-I)>1.6)){N=m(b);break}}const d=N!=null&&X<N?-1:1,z=[];for(const n of j){if(C(n)||!s(n))continue;const b=Z(n);if(!b)continue;const q=-((Array.isArray(g.get(n)?.rotation)?g.get(n).rotation[1]:0)||0);Math.abs(Math.cos(M-q))<.9||Math.abs(u(b)-I)>1||z.push({inst:n,lo:c(b),hi:l(b)})}if(d>0){const n=z.filter(q=>q.hi>f),b=n.filter(q=>q.lo<A);if(b.length){const q=A-Math.min(...b.map(v=>v.lo))+.01;for(const{inst:v}of n){const y=g.get(v);g.set(v,{...y,position:[y.position[0]+i*q,y.position[1],y.position[2]+h*q]})}x.push({chimShift:+q.toFixed(3),dir:"+run",n:n.length})}}else{const n=z.filter(q=>q.lo<A),b=n.filter(q=>q.hi>f);if(b.length){const q=Math.max(...b.map(v=>v.hi))-f+.01;for(const{inst:v}of n){const y=g.get(v);g.set(v,{...y,position:[y.position[0]-i*q,y.position[1],y.position[2]-h*q]})}x.push({chimShift:+q.toFixed(3),dir:"-run",n:n.length})}}}}{const x=s=>{const t=O.getDims?.(s.productId)??O.getDims?.(s.variantId)??null,o=H?.(s.variantId)||H?.(s.productId);return{w:t?.width>0?t.width:o?.width>0?o.width*.0254:.9,dp:t?.depth>0?t.depth:o?.depth>0?o.depth*.0254:.6,h:t?.height>0?t.height:o?.height>0?o.height*.0254:.9,cx:t?.cx||0,cz:t?.cz||0}},w=s=>{const t=g.get(s);if(!t)return null;const[o,M,i]=t.position,h=(Array.isArray(t.rotation)?t.rotation[1]:0)||0,{w:e,dp:r,h:c,cx:l,cz:u}=x(s),m=Math.cos(h),f=Math.sin(h),A=o+l*m+u*f,X=i-l*f+u*m,I=Math.abs(m),N=Math.abs(f),d=(e*I+r*N)/2,z=(e*N+r*I)/2;return{minX:A-d,maxX:A+d,minZ:X-z,maxZ:X+z,minY:M,maxY:M+c}},Z=(s,t)=>s&&t&&s.minX<t.maxX-.02&&s.maxX>t.minX+.02&&s.minZ<t.maxZ-.02&&s.maxZ>t.minZ+.02&&s.minY<t.maxY-.02&&s.maxY>t.minY+.02;let a=1/0;for(const s of R){const t=g.get(s)?.position?.[1]||0;t>.01&&t<a&&(a=t)}if(Number.isFinite(a)){const s=new Map;for(const i of R){const h=w(i);h&&s.set(i,h)}const t=i=>(g.get(i)?.position?.[1]||0)>.01,o=R.filter(i=>{if(C(i))return!1;const h=s.get(i);return h&&!t(i)&&h.maxY>a+.05}),M=new Set(o);for(const i of o){const h=-(g.get(i)?.rotation?.[1]||0),e=Math.cos(h),r=Math.sin(h),c=d=>({lo:Math.min(d.minX*e+d.minZ*r,d.maxX*e+d.maxZ*r),hi:Math.max(d.minX*e+d.minZ*r,d.maxX*e+d.maxZ*r)});let l=s.get(i),u=1/0,m=-1/0,f=!1;for(const d of R){if(d===i||M.has(d)||!t(d))continue;const z=s.get(d);if(!z||!Z(l,z))continue;const n=c(z);u=Math.min(u,n.lo),m=Math.max(m,n.hi),f=!0}if(!f)continue;const A=c(l),X=(A.lo+A.hi)/2,I=(u+m)/2,N=X>=I?m+.005-A.lo:u-.005-A.hi;if(Math.abs(N)>.002){const d=g.get(i);g.set(i,{position:[d.position[0]+e*N,d.position[1],d.position[2]+r*N],rotation:d.rotation}),l=w(i),s.set(i,l)}}}}{const x=s=>{const t=O.getDims?.(s.productId)??O.getDims?.(s.variantId)??null,o=W(s),M=t?.width>.05&&t?.depth>.05;return{w:M?t.width:o?.width>0?o.width*.0254:.9,dp:M?t.depth:o?.depth>0?o.depth*.0254:.6,cx:M&&t.cx||0,cz:M&&t.cz||0}},w=s=>{const t=g.get(s);if(!t)return null;const[o,,M]=t.position,i=(Array.isArray(t.rotation)?t.rotation[1]:0)||0,{cx:h,cz:e}=x(s);return{x:o+h*Math.cos(i)+e*Math.sin(i),z:M-h*Math.sin(i)+e*Math.cos(i),y:t.position[1],r:i}},Z=s=>{const t=w(s);if(!t)return null;const{w:o,dp:M}=x(s),i=Math.abs(Math.cos(t.r)),h=Math.abs(Math.sin(t.r)),e=(o*i+M*h)/2,r=(o*h+M*i)/2;return{minX:t.x-e,maxX:t.x+e,minZ:t.z-r,maxZ:t.z+r}},a=(s,t)=>s&&t&&s.minX<t.maxX-.04&&s.maxX>t.minX+.04&&s.minZ<t.maxZ-.04&&s.maxZ>t.minZ+.04;for(const[,s]of G){const t=s.filter(n=>C(n)&&Number.isFinite(Number(n.sequence))).map(n=>({inst:n,seq:Number(n.sequence)})).sort((n,b)=>n.seq-b.seq);if(!t.length)continue;const o=t[t.length-1].inst,M=t[t.length-1].seq,i=s.filter(n=>!C(n)&&Number.isFinite(Number(n.sequence))).sort((n,b)=>Number(n.sequence)-Number(b.sequence)),h=[];for(const n of t){const b=Z(n.inst);b&&h.push(b)}const e=[];for(const n of i){const b=Z(n);b&&(h.some(q=>a(b,q))?e.push(n):h.push(b))}if(!e.length)continue;const r=i.filter(n=>Number(n.sequence)>M&&!e.includes(n)),c=r.length?(Array.isArray(g.get(r[0])?.rotation)?g.get(r[0]).rotation[1]:0)||0:((Array.isArray(g.get(o)?.rotation)?g.get(o).rotation[1]:0)||0)-Math.PI/2,l=-c,u=Math.cos(l),m=Math.sin(l),f=-m,A=u,X=n=>n.x*u+n.z*m,I=w(o);if(!I)continue;const N=r.length?(()=>{const n=w(r[0]);return n?n.x*f+n.z*A:I.x*f+I.z*A})():I.x*f+I.z*A;let d,z;if(r.length){const n=w(r[0]);d=Math.sign(X(n)-X(I))||1,z=Math.max(...r.map(b=>{const q=w(b);return q?X(q)+d*x(b).w/2:-1/0}))}else{d=1;const n=x(o);z=X(I)+d*(Math.abs(Math.cos(I.r+l))*(n.w/2)+Math.abs(Math.sin(I.r+l))*(n.dp/2))}if(Number.isFinite(z))for(const n of e){const b=w(n);if(!b)continue;const{w:q,cx:v,cz:y}=x(n),S=z+d*q/2,L=S*u+N*f,_=S*m+N*A;g.set(n,{position:[L-(v*Math.cos(c)+y*Math.sin(c)),b.y,_-(-v*Math.sin(c)+y*Math.cos(c))],rotation:[0,c,0]}),z+=d*q}}}{const x=t=>{const o=O.getDims?.(t.productId)??O.getDims?.(t.variantId)??null,M=W(t),i=o?.width>.05&&o?.depth>.05;return{w:i?o.width:M?.width>0?M.width*.0254:.9,dp:i?o.depth:M?.depth>0?M.depth*.0254:.6,cx:i&&o.cx||0,cz:i&&o.cz||0}},w=t=>{const o=g.get(t);if(!o)return null;const[M,,i]=o.position,h=(Array.isArray(o.rotation)?o.rotation[1]:0)||0,{w:e,dp:r,cx:c,cz:l}=x(t),u=M+c*Math.cos(h)+l*Math.sin(h),m=i-c*Math.sin(h)+l*Math.cos(h),f=Math.abs(Math.cos(h)),A=Math.abs(Math.sin(h)),X=(e*f+r*A)/2,I=(e*A+r*f)/2;return{minX:u-X,maxX:u+X,minZ:m-I,maxZ:m+I}};let Z=0,a=0,s=0;for(const t of R){const o=g.get(t);o&&(Z+=o.position[0],a+=o.position[2],s+=1)}s&&(Z/=s,a/=s);for(const[,t]of G){const o=t.filter(e=>C(e)).map(e=>({b:w(e)})).filter(e=>e.b);if(!o.length)continue;const M=t.filter(e=>!C(e)).map(e=>({inst:e,b:w(e)})).filter(e=>e.b);for(const{b:e}of o){const r=(u,m)=>o.some(({b:f})=>f===e?!1:u==="x"?f.minZ<e.maxZ-.05&&f.maxZ>e.minZ+.05&&(m?f.minX>e.maxX:f.maxX<e.minX):f.minX<e.maxX-.05&&f.maxX>e.minX+.05&&(m?f.minZ>e.maxZ:f.maxZ<e.minZ)),c={xp:[],xn:[],zp:[],zn:[]};for(const{inst:u,b:m}of M){const f=m.minZ<e.maxZ-.05&&m.maxZ>e.minZ+.05,A=m.minX<e.maxX-.05&&m.maxX>e.minX+.05;f&&!A?m.minX>=e.maxX?c.xp.push({inst:u,gap:m.minX-e.maxX}):m.maxX<=e.minX&&c.xn.push({inst:u,gap:e.minX-m.maxX}):A&&!f&&(m.minZ>=e.maxZ?c.zp.push({inst:u,gap:m.minZ-e.maxZ}):m.maxZ<=e.minZ&&c.zn.push({inst:u,gap:e.minZ-m.maxZ}))}const l=(u,m,f,A)=>{if(!u.length||r(m,f))return;const X=Math.min(...u.map(N=>N.gap));if(X>.015&&X<.5){const N=A*X;for(const{inst:d}of u){const z=g.get(d);z&&g.set(d,{position:[z.position[0]+(m==="x"?N:0),z.position[1],z.position[2]+(m==="z"?N:0)],rotation:z.rotation})}}const I=m==="x"?"z":"x";for(const{inst:N}of u){const d=w(N),z=g.get(N);if(!(!d||!z))if(I==="z"){const n=mt((d.minZ+d.maxZ)/2,z.position[2],a),b=n?d.maxZ:d.minZ,v=(n?e.maxZ:e.minZ)-b;(n?v>0:v<0)&&Math.abs(v)>.015&&Math.abs(v)<.5&&g.set(N,{position:[z.position[0],z.position[1],z.position[2]+v],rotation:z.rotation})}else{const n=mt((d.minX+d.maxX)/2,z.position[0],Z),b=n?d.maxX:d.minX,v=(n?e.maxX:e.minX)-b;(n?v>0:v<0)&&Math.abs(v)>.015&&Math.abs(v)<.5&&g.set(N,{position:[z.position[0]+v,z.position[1],z.position[2]],rotation:z.rotation})}}};l(c.xp,"x",!0,-1),l(c.xn,"x",!1,1),l(c.zp,"z",!0,-1),l(c.zn,"z",!1,1)}const i=(e,r)=>r==="x"?(e.minX+e.maxX)/2:(e.minZ+e.maxZ)/2,h=(e,r)=>r==="x"?(e.minZ+e.maxZ)/2:(e.minX+e.maxX)/2;for(let e=0;e<o.length;e++)for(let r=e+1;r<o.length;r++){const c=o[e].b,l=o[r].b,u=Math.abs((c.minX+c.maxX)/2-(l.minX+l.maxX)/2),m=Math.abs((c.minZ+c.maxZ)/2-(l.minZ+l.maxZ)/2);let f=null;if(m<.35&&u>.5?f="x":u<.35&&m>.5&&(f="z"),!f)continue;const A=i(c,f)<i(l,f),X=A?c:l,I=A?l:c,N=f==="x"?X.maxX:X.maxZ,d=f==="x"?I.minX:I.minZ,z=h(X,f),n=t.filter(k=>!C(k)).map(k=>({inst:k,b:w(k)})).filter(({b:k})=>k&&i(k,f)>N-.15&&i(k,f)<d+.15&&Math.abs(h(k,f)-z)<.4).sort((k,V)=>i(k.b,f)-i(V.b,f));if(!n.length)continue;const b=n.map(({inst:k})=>x(k).w),q=b.reduce((k,V)=>k+V,0);if(q>d-N+.02)continue;const v=q/2;let y=0,S=n.length;for(let k=0;k<n.length;k++)if(y+=b[k],y>v){S=k;break}const L=(k,V)=>{const Y=g.get(k);if(!Y)return;const F=(Array.isArray(Y.rotation)?Y.rotation[1]:0)||0,{cx:D,cz:P}=x(k);f==="x"?g.set(k,{position:[V-(D*Math.cos(F)+P*Math.sin(F)),Y.position[1],Y.position[2]],rotation:Y.rotation}):g.set(k,{position:[Y.position[0],Y.position[1],V-(-D*Math.sin(F)+P*Math.cos(F))],rotation:Y.rotation})};let _=N;for(let k=0;k<S;k++)L(n[k].inst,_+b[k]/2),_+=b[k];_=d;for(let k=n.length-1;k>=S;k--)L(n[k].inst,_-b[k]/2),_-=b[k]}}}return dt(),R.map(p=>g.get(p)||{position:[0,0,0],rotation:[0,0,0]})}};import{appendTargetFor as Zt,neighborsFor as It,groupByPlacement as Nt}from"./dc812f3e14.js";function mt(E,O,H){const R=E-O;return R<-.01?!0:R>.01?!1:O>H}export{Zt as appendTargetFor,wt as default,Nt as groupByPlacement,It as neighborsFor};
1
+ import ht from"./d803155241.js";import{resolveLockVariantId as lt}from"./061b81ad81.js";const ft=C=>{const B=Number(C);return!Number.isFinite(B)||B===0?null:B},ut=(C,B)=>{const P=Array.isArray(C?.hostVariants)?C.hostVariants:Array.isArray(C?.host_variants)?C.host_variants:[];if(!P.length)return null;const H=K=>String(K?.hostVariantId??K?.host_variant_id)===String(B);return P.find(H)||P.find(K=>K?.isDefault??K?.is_default)||P[0]||null},yt=(C,B)=>{const P=C?.placementGroup??C?.placement_group;if(P!=null&&String(P)!=="")return String(P);const H=B?.(C?.variantId)||B?.(C?.productId);return String(H?.placementGroup??H?.placement_group??"")};var At={id:"grouped-chain",label:"Grouped chain (backend + group attach)",mode:"compute",handlesCorners:!0,computeLayout(C,B={}){const{getProduct:P}=B,H=Array.isArray(C)?C:[],K=u=>String(u?.id??u?.instanceId??""),pt=new Map(H.map(u=>[K(u),u])),G=u=>P?.(u?.variantId)||P?.(u?.productId)||null,it=u=>{const d=G(u),b=d?.hostVariants??d?.host_variants;return Array.isArray(b)&&b.length?b:null},et=u=>{const d=u?.positionedAbove??u?.positioned_above??null;return d!=null?String(d):null},tt=u=>et(u)!=null,nt=u=>lt(u)??lt(G(u)),zt=u=>nt(u)!=null,ct=u=>String(u?.variantId??u?.productId??""),ot=new Set,V=u=>ot.has(u),U=H.filter(u=>!tt(u)),Q=H.filter(u=>tt(u));if(B.useTransform){const u=Math.PI/180;return H.map(d=>{const b=Array.isArray(d?.position)?d.position:[0,0,0],v=Array.isArray(d?.rotation)?d.rotation:[0,0,0];return{position:[Number(b[0])||0,Number(b[1])||0,Number(b[2])||0],rotation:[(Number(v[0])||0)*u,(Number(v[1])||0)*u,(Number(v[2])||0)*u]}})}const W=new Map;for(const u of U){const d=yt(u,P);W.has(d)||W.set(d,[]),W.get(d).push(u)}const g=new Map,dt=new Set;for(const[,u]of W){const d=ht.computeLayout(u,B);u.forEach((b,v)=>{const h=d[v]||{position:[0,0,0],rotation:[0,0,0]},i=Array.isArray(b?.position)?b.position:[],t=h.position||[0,0,0],c=ft(i[1]);g.set(b,{position:[t[0],c??t[1],t[2]],rotation:h.rotation||[0,0,0]})})}for(const[,u]of W){const d=new Map;for(const h of u){const i=g.get(h)?.position?.[1]||0;i>.01&&d.set(i,(d.get(i)||0)+1)}if(!d.size)continue;let b=0,v=0;for(const[h,i]of d)i>v&&(v=i,b=h);if(!(v<u.length/2))for(const h of u){const i=g.get(h);i&&(i.position[1]||0)<=.01&&g.set(h,{position:[i.position[0],b,i.position[2]],rotation:i.rotation})}}{const d=t=>{const c=g.get(t);if(!c)return null;const y=c.position,m=-((Array.isArray(c.rotation)?c.rotation[1]:0)||0),p=Math.cos(m),r=Math.sin(m),o=-Math.sin(m),s=Math.cos(m),a=B.getDims?.(t.productId,t)??B.getDims?.(t.variantId,t)??null,f=G(t),x=a?.width>.05&&a?.depth>.05,l=x?a.width:f?.width>0?f.width*.0254:.9,z=x?a.depth:f?.depth>0?f.depth*.0254:.95,I=x&&a.cx||0,X=x&&a.cz||0,S=y[0]+p*I+o*X,N=y[2]+r*I+s*X;return[S+p*(l/2)-o*(z/2),N+r*(l/2)-s*(z/2)]},b=new Set;for(const t of H){const c=nt(t);c!=null&&b.add(c)}let v=null,h=0;for(const[t,c]of W){const y=c.reduce((m,p)=>m+(b.has(ct(p))?1:0),0);y>h&&(h=y,v=t)}const i=v!=null?W.get(v):null;if(i){const t=new Map;for(const c of[...i].sort((y,m)=>Number(y.sequence)-Number(m.sequence))){const y=ct(c);t.has(y)||t.set(y,[]),t.get(y).push(c)}for(const[c,y]of W){if(c===v)continue;const m=y.map(s=>({inst:s,tv:nt(s),seq:Number(s.sequence)})).filter(s=>s.tv!=null&&Number.isFinite(s.seq)).sort((s,a)=>s.seq-a.seq);if(!m.length)continue;const p=new Map,r=[];for(const s of m){const a=t.get(s.tv);if(!a||!a.length)continue;const f=p.get(s.tv)||0,x=Math.min(f,a.length-1);p.set(s.tv,f+1);const l=a[x],z=d(s.inst),I=d(l);!z||!I||(r.push({seq:s.seq,delta:[I[0]-z[0],I[1]-z[1]],lockInst:s.inst}),ot.add(s.inst),ot.add(l))}if(!r.length)continue;r.sort((s,a)=>s.seq-a.seq);const o=new Map;for(const s of y){const a=Number(s?.sequence);let f=r[0];if(Number.isFinite(a))for(const x of r)if(x.seq<=a)f=x;else break;o.set(s,f.delta)}for(const s of y){const a=g.get(s);if(!a)continue;const f=o.get(s)||r[0].delta;g.set(s,{position:[a.position[0]+f[0],a.position[1],a.position[2]+f[1]],rotation:a.rotation})}}}}{const d=v=>{const h=B.getDims?.(v.productId,v)??B.getDims?.(v.variantId,v)??null,i=G(v),t=h?.width>.05&&h?.depth>.05;return{w:t?h.width:i?.width>0?i.width*.0254:.9,dp:t?h.depth:i?.depth>0?i.depth*.0254:.6,cx:t&&h.cx||0,cz:t&&h.cz||0}},b=v=>{const h=g.get(v);if(!h)return null;const[i,,t]=h.position,c=(Array.isArray(h.rotation)?h.rotation[1]:0)||0,{cx:y,cz:m}=d(v);return{x:i+y*Math.cos(c)+m*Math.sin(c),z:t-y*Math.sin(c)+m*Math.cos(c),y:h.position[1],r:c}};for(const[,v]of W){const h=v.filter(o=>V(o)&&Number.isFinite(Number(o.sequence))).map(o=>({inst:o,seq:Number(o.sequence)})).sort((o,s)=>o.seq-s.seq);if(h.length<2)continue;const i=[];for(let o=0;o<h.length-1;o++){const s=h[o].inst,a=h[o+1].inst,f=v.filter(e=>{const A=Number(e?.sequence);return!V(e)&&Number.isFinite(A)&&A>h[o].seq&&A<h[o+1].seq}).sort((e,A)=>Number(e.sequence)-Number(A.sequence));if(!f.length)continue;const x=-((Array.isArray(g.get(f[0])?.rotation)?g.get(f[0]).rotation[1]:0)||0),l=Math.cos(x),z=Math.sin(x),I=-z,X=l,S=e=>e.x*l+e.z*z,N=e=>{const{w:A,dp:L}=d(e),E=b(e);return E?Math.abs(Math.cos(E.r+x))*(A/2)+Math.abs(Math.sin(E.r+x))*(L/2):0},Z=b(s),n=b(a);if(!Z||!n)continue;const M=S(Z),q=S(n),Y=q>=M?1:-1,O=M+Y*N(s),F=q-Y*N(a),T=(F-O)*Y,_=f.map(e=>d(e).w),k=_.reduce((e,A)=>e+A,0),w=new Array(f.length);if(k<=T+.02){const e=k/2;let A=0,L=f.length;for(let R=0;R<f.length;R++)if(A+=_[R],A>e){L=R;break}let E=O;for(let R=0;R<L;R++)w[R]=E+Y*_[R]/2,E+=Y*_[R];E=F;for(let R=f.length-1;R>=L;R--)w[R]=E-Y*_[R]/2,E-=Y*_[R]}else{let e=0,A=0;for(let D=0;D<f.length&&!(A+_[D]>T+.02);D++)A+=_[D],e=D+1;for(let D=e;D<f.length;D++)i.push(f[D]);const E=_.slice(0,e).reduce((D,Mt)=>D+Mt,0)/2;let R=0,j=e;for(let D=0;D<e;D++)if(R+=_[D],R>E){j=D;break}let J=O;for(let D=0;D<j;D++)w[D]=J+Y*_[D]/2,J+=Y*_[D];J=F;for(let D=e-1;D>=j;D--)w[D]=J-Y*_[D]/2,J-=Y*_[D]}f.forEach((e,A)=>{const L=b(e);if(!L||w[A]==null)return;const{cx:E,cz:R}=d(e),j=L.x*I+L.z*X,J=w[A]*l+j*I,D=w[A]*z+j*X;g.set(e,{position:[J-(E*Math.cos(L.r)+R*Math.sin(L.r)),L.y,D-(-E*Math.sin(L.r)+R*Math.cos(L.r))],rotation:g.get(e).rotation})})}const t=(o,s,a)=>{if(!s.length||!o)return;const f=a&&a.rotY!=null,x=f?a.rotY:(Array.isArray(g.get(s[0])?.rotation)?g.get(s[0]).rotation[1]:0)||0,l=-x,z=Math.cos(l),I=Math.sin(l),X=-I,S=z,N=F=>F.x*z+F.z*I,Z=b(o);if(!Z)return;const n=b(a?.dirRef||s[0]),M=n&&Math.sign(N(n)-N(Z))||1,q=d(o),Y=Math.abs(Math.cos(Z.r+l))*(q.w/2)+Math.abs(Math.sin(Z.r+l))*(q.dp/2);let O=N(Z)+M*Y;for(const F of s){const T=b(F);if(!T)continue;const{w:_,dp:k,cx:w,cz:e}=d(F),A=O+M*_/2,L=f?x:T.r,E=f?a.perpBack!=null?a.perpBack+k/2:a.perpLine:T.x*X+T.z*S,R=A*z+E*X,j=A*I+E*S;g.set(F,{position:[R-(w*Math.cos(L)+e*Math.sin(L)),T.y,j-(-w*Math.sin(L)+e*Math.cos(L))],rotation:f?[0,x,0]:g.get(F).rotation}),O+=M*_}},c=h[0].seq,y=h[h.length-1].seq,m=v.filter(o=>{const s=Number(o?.sequence);return!V(o)&&Number.isFinite(s)&&s<c}).sort((o,s)=>Number(s.sequence)-Number(o.sequence)),p=v.filter(o=>{const s=Number(o?.sequence);return!V(o)&&Number.isFinite(s)&&s>y}).sort((o,s)=>Number(o.sequence)-Number(s.sequence));t(h[0].inst,m);const r=h[h.length-1].inst;if(p.length){const o=b(p[0]),s=(Array.isArray(g.get(p[0])?.rotation)?g.get(p[0]).rotation[1]:0)||0,a=-s,f=-Math.sin(a),x=Math.cos(a),l=o?o.x*f+o.z*x:0,z=l-d(p[0]).dp/2,I=[...i,...p],X=I.findIndex(Z=>!!Z?.corner),S=X>=0?I.slice(0,X+1):I;t(r,S,{rotY:s,perpLine:l,perpBack:z,dirRef:p[0]});const N=X>=0?I.slice(X+1):[];if(N.length){const Z=I[X],n=[Z,...N],M=ht.computeLayout(n,B)||[],q=g.get(Z),Y=M[0];if(q&&Y){const O=(q.rotation?.[1]||0)-(Y.rotation?.[1]||0),F=Math.cos(O),T=Math.sin(O);N.forEach((_,k)=>{const w=M[k+1];if(!w)return;const e=w.position[0]-Y.position[0],A=w.position[2]-Y.position[2],L=g.get(_);g.set(_,{position:[q.position[0]+e*F+A*T,L?.position?.[1]??q.position[1],q.position[2]-e*T+A*F],rotation:[0,(w.rotation?.[1]||0)+O,0]})})}}}else t(r,i)}}const rt=new Map;for(const u of H){if(!V(u))continue;const d=g.get(u);d?.position&&rt.set(u,d.position.slice())}const gt=()=>{for(const[u,d]of rt){const b=g.get(u);b&&g.set(u,{position:d.slice(),rotation:b.rotation})}};{const d=h=>{const i=B.getDims?.(h.productId,h)??B.getDims?.(h.variantId,h)??null,t=G(h);return{w:i?.width>0?i.width:t?.width>0?t.width*.0254:.9,dp:i?.depth>0?i.depth:t?.depth>0?t.depth*.0254:.6,h:i?.height>0?i.height:t?.height>0?t.height*.0254:.9,cx:i?.cx||0,cz:i?.cz||0}},b=h=>{const i=g.get(h);if(!i)return null;const[t,c,y]=i.position,m=(Array.isArray(i.rotation)?i.rotation[1]:0)||0,{w:p,dp:r,h:o,cx:s,cz:a}=d(h),f=Math.cos(m),x=Math.sin(m),l=t+s*f+a*x,z=y-s*x+a*f,I=Math.abs(f),X=Math.abs(x),S=(p*I+r*X)/2,N=(p*X+r*I)/2;let Z=l-S,n=l+S,M=z-N,q=z+N;if(tt(h)?null:it(h)){const O=ut(G(h),null),F=Array.isArray(O?.position)?O.position:[0,0,0],T=l+(F[0]||0)*f+(F[2]||0)*x,_=z-(F[0]||0)*x+(F[2]||0)*f;Z=Math.min(Z,T-S),n=Math.max(n,T+S),M=Math.min(M,_-N),q=Math.max(q,_+N)}return{minX:Z,maxX:n,minZ:M,maxZ:q,minY:c,maxY:c+o}};let v=1/0;for(const h of H){const i=g.get(h)?.position?.[1]||0;i>.01&&i<v&&(v=i)}if(Number.isFinite(v)){const h=new Map,i=new Map;for(const o of U){const s=b(o);s&&(h.set(o,s),i.set(o,(g.get(o)?.position?.[1]||0)>.01))}const t=U.filter(o=>{if(V(o))return!1;const s=h.get(o);return s&&!i.get(o)&&s.maxY>v+.05}),c=(o,s)=>o.minX<s.maxX-.02&&o.maxX>s.minX+.02&&o.minZ<s.maxZ-.02&&o.maxZ>s.minZ+.02&&o.minY<s.maxY-.02&&o.maxY>s.minY+.02,y=o=>{const s=-(g.get(o)?.rotation?.[1]||0),a=Math.cos(s),f=Math.sin(s);return{ht:s,rx:a,rz:f,nx:-f,nz:a}},m=(o,s,a)=>({lo:Math.min(o.minX*s+o.minZ*a,o.maxX*s+o.maxZ*a),hi:Math.max(o.minX*s+o.minZ*a,o.maxX*s+o.maxZ*a)}),p=(o,s,a)=>(o.minX+o.maxX)/2*s+(o.minZ+o.maxZ)/2*a,r=new Set;for(const o of t){if(r.has(o))continue;const{ht:s,rx:a,rz:f,nx:x,nz:l}=y(o),z=p(h.get(o),x,l),I=w=>{const e=-(g.get(w)?.rotation?.[1]||0);if(Math.abs(Math.cos(s-e))<.9)return!1;const A=h.get(w);return!!A&&Math.abs(p(A,x,l)-z)<1},X=t.filter(w=>!r.has(w)&&I(w));X.forEach(w=>r.add(w));const S=U.filter(w=>i.get(w)&&I(w));if(!S.length)continue;let N=null;for(const w of[...U,...Q]){if(!w?.corner)continue;const e=h.get(w)||b(w);if(!e||Math.abs(p(e,x,l)-z)>1.6)continue;const A=m(e,a,f);N=(A.lo+A.hi)/2;break}const Z=w=>{const e=m(h.get(w),a,f);return(e.lo+e.hi)/2},n=N!=null&&Z(X[0])<N?-1:1;X.sort((w,e)=>(Z(w)-Z(e))*n);const M=X.findIndex(w=>S.some(e=>c(h.get(w),h.get(e))));if(M<0)continue;const q=X[M],Y=Math.max(...S.map(w=>m(h.get(w),a,f).hi)),O=Math.min(...S.map(w=>m(h.get(w),a,f).lo)),F=m(h.get(q),a,f),T=n>0?Math.max(0,Y+.005-F.lo):Math.min(0,O-.005-F.hi);if(Math.abs(T)<.005)continue;const _=Z(q),k=U.filter(w=>{if(w===q)return!0;if(i.get(w)||V(w)||!I(w))return!1;const e=m(h.get(w),a,f),A=(e.lo+e.hi)/2;return n>0?A>_-.01:A<_+.01});for(const w of k){const e=g.get(w);g.set(w,{position:[e.position[0]+a*T,e.position[1],e.position[2]+f*T],rotation:e.rotation}),h.set(w,b(w))}}}}const at=u=>String(u?.variantId??u?.productId??""),xt=u=>{const d=et(u);if(d!=null)return pt.get(d)||null;const b=it(u)||[],v=new Set(b.map(h=>String(h?.hostVariantId??h?.host_variant_id)));return H.find(h=>h!==u&&v.has(at(h)))||null};let $=Q.slice(),st=!0;for(;$.length&&st;){st=!1;const u=[];for(const d of $){const b=xt(d),v=b?g.get(b):null;if(!v){u.push(d);continue}const h=ut(G(d),at(b)),i=v.position||[0,0,0],t=(Array.isArray(v.rotation)?v.rotation[1]:0)||0,c=Math.cos(t),y=Math.sin(t),m=h&&Array.isArray(h.position)?h.position:[0,0,0],r=(B.getDims?.(b.productId,b)??B.getDims?.(b.variantId,b)??null)?.cx||0,o=ft(Array.isArray(d?.position)?d.position[1]:null),s=[i[0]+r*c+(m[2]||0)*y,o??i[1]+(m[1]||0),i[2]-r*y+(m[2]||0)*c],a=h&&Array.isArray(h.rotation)?(h.rotation[1]||0)*Math.PI/180:0;g.set(d,{position:s,rotation:[0,t+a,0]}),st=!0}$=u}for(const u of $){const d=Array.isArray(u?.position)?u.position:[];g.set(u,{position:d.length?d:[0,0,0],rotation:u?.rotation||[0,0,0]})}{const d=[],b=t=>{const c=B.getDims?.(t.productId,t)??B.getDims?.(t.variantId,t)??null,y=G(t);return{w:c?.width>0?c.width:y?.width>0?y.width*.0254:.9,dp:c?.depth>0?c.depth:y?.depth>0?y.depth*.0254:.6,h:c?.height>0?c.height:y?.height>0?y.height*.0254:.9,cx:c?.cx||0,cz:c?.cz||0}},v=t=>{const c=g.get(t);if(!c)return null;const[y,m,p]=c.position,r=(Array.isArray(c.rotation)?c.rotation[1]:0)||0,{w:o,dp:s,h:a,cx:f,cz:x}=b(t),l=Math.cos(r),z=Math.sin(r),I=y+f*l+x*z,X=p-f*z+x*l,S=Math.abs(l),N=Math.abs(z),Z=(o*S+s*N)/2,n=(o*N+s*S)/2;return{minX:I-Z,maxX:I+Z,minZ:X-n,maxZ:X+n,minY:m,maxY:m+a}};let h=1/0;for(const t of H){const c=g.get(t)?.position?.[1]||0;c>.01&&c<h&&(h=c)}const i=t=>(g.get(t)?.position?.[1]||0)>.01;for(const t of Q){const c=v(t);if(!c||c.maxY<=h+.05)continue;const y=-((Array.isArray(g.get(t)?.rotation)?g.get(t).rotation[1]:0)||0),m=Math.cos(y),p=Math.sin(y),r=-p,o=m,s=n=>Math.min(n.minX*m+n.minZ*p,n.maxX*m+n.maxZ*p),a=n=>Math.max(n.minX*m+n.minZ*p,n.maxX*m+n.maxZ*p),f=n=>(n.minX+n.maxX)/2*r+(n.minZ+n.maxZ)/2*o,x=n=>(n.minX+n.maxX)/2*m+(n.minZ+n.maxZ)/2*p,l=s(c),z=a(c),I=(l+z)/2,X=f(c);let S=null;for(const n of[...U,...Q]){if(!n?.corner)continue;const M=v(n);if(M&&!(Math.abs(f(M)-X)>1.6)){S=x(M);break}}const N=S!=null&&I<S?-1:1,Z=[];for(const n of U){if(V(n)||!i(n))continue;const M=v(n);if(!M)continue;const q=-((Array.isArray(g.get(n)?.rotation)?g.get(n).rotation[1]:0)||0);Math.abs(Math.cos(y-q))<.9||Math.abs(f(M)-X)>1||Z.push({inst:n,lo:s(M),hi:a(M)})}if(N>0){const n=Z.filter(q=>q.hi>l),M=n.filter(q=>q.lo<z);if(M.length){const q=z-Math.min(...M.map(Y=>Y.lo))+.01;for(const{inst:Y}of n){const O=g.get(Y);g.set(Y,{...O,position:[O.position[0]+m*q,O.position[1],O.position[2]+p*q]})}d.push({chimShift:+q.toFixed(3),dir:"+run",n:n.length})}}else{const n=Z.filter(q=>q.lo<z),M=n.filter(q=>q.hi>l);if(M.length){const q=Math.max(...M.map(Y=>Y.hi))-l+.01;for(const{inst:Y}of n){const O=g.get(Y);g.set(Y,{...O,position:[O.position[0]-m*q,O.position[1],O.position[2]-p*q]})}d.push({chimShift:+q.toFixed(3),dir:"-run",n:n.length})}}}}{const d=i=>{const t=B.getDims?.(i.productId,i)??B.getDims?.(i.variantId,i)??null,c=P?.(i.variantId)||P?.(i.productId);return{w:t?.width>0?t.width:c?.width>0?c.width*.0254:.9,dp:t?.depth>0?t.depth:c?.depth>0?c.depth*.0254:.6,h:t?.height>0?t.height:c?.height>0?c.height*.0254:.9,cx:t?.cx||0,cz:t?.cz||0}},b=i=>{const t=g.get(i);if(!t)return null;const[c,y,m]=t.position,p=(Array.isArray(t.rotation)?t.rotation[1]:0)||0,{w:r,dp:o,h:s,cx:a,cz:f}=d(i),x=Math.cos(p),l=Math.sin(p),z=c+a*x+f*l,I=m-a*l+f*x,X=Math.abs(x),S=Math.abs(l),N=(r*X+o*S)/2,Z=(r*S+o*X)/2;return{minX:z-N,maxX:z+N,minZ:I-Z,maxZ:I+Z,minY:y,maxY:y+s}},v=(i,t)=>i&&t&&i.minX<t.maxX-.02&&i.maxX>t.minX+.02&&i.minZ<t.maxZ-.02&&i.maxZ>t.minZ+.02&&i.minY<t.maxY-.02&&i.maxY>t.minY+.02;let h=1/0;for(const i of H){const t=g.get(i)?.position?.[1]||0;t>.01&&t<h&&(h=t)}if(Number.isFinite(h)){const i=new Map;for(const p of H){const r=b(p);r&&i.set(p,r)}const t=p=>(g.get(p)?.position?.[1]||0)>.01,c=H.filter(p=>{if(V(p))return!1;const r=i.get(p);return r&&!t(p)&&r.maxY>h+.05}),y=new Set(c),m=new Set;for(const p of c){if(m.has(p))continue;const r=-(g.get(p)?.rotation?.[1]||0),o=Math.cos(r),s=Math.sin(r),a=-s,f=o,x=e=>({lo:Math.min(e.minX*o+e.minZ*s,e.maxX*o+e.maxZ*s),hi:Math.max(e.minX*o+e.minZ*s,e.maxX*o+e.maxZ*s)}),l=e=>(e.minX+e.maxX)/2*a+(e.minZ+e.maxZ)/2*f,z=i.get(p);if(!z){m.add(p);continue}const I=l(z),X=e=>{const A=-(g.get(e)?.rotation?.[1]||0);if(Math.abs(Math.cos(r-A))<.9)return!1;const L=i.get(e);return!!L&&Math.abs(l(L)-I)<1},S=c.filter(e=>!m.has(e)&&X(e));S.forEach(e=>m.add(e));const N=H.filter(e=>!y.has(e)&&t(e)&&X(e));if(!N.length)continue;let Z=null;for(const e of H){if(!e?.corner)continue;const A=i.get(e);if(!A||Math.abs(l(A)-I)>1.6)continue;const L=x(A);Z=(L.lo+L.hi)/2;break}const n=e=>{const A=x(i.get(e));return(A.lo+A.hi)/2},M=Z!=null&&n(S[0])<Z?-1:1;S.sort((e,A)=>(n(e)-n(A))*M);const q=S.findIndex(e=>N.some(A=>v(i.get(e),i.get(A))));if(q<0)continue;const Y=S[q],O=Math.max(...N.map(e=>x(i.get(e)).hi)),F=Math.min(...N.map(e=>x(i.get(e)).lo)),T=x(i.get(Y)),_=M>0?Math.max(0,O+.005-T.lo):Math.min(0,F-.005-T.hi);if(Math.abs(_)<.002)continue;const k=n(Y),w=H.filter(e=>{if(e===Y)return!0;if(t(e)||V(e)||!X(e))return!1;const A=n(e);return M>0?A>k-.01:A<k+.01});for(const e of w){const A=g.get(e);g.set(e,{position:[A.position[0]+o*_,A.position[1],A.position[2]+s*_],rotation:A.rotation}),i.set(e,b(e))}}}}{const d=i=>{const t=B.getDims?.(i.productId,i)??B.getDims?.(i.variantId,i)??null,c=G(i),y=t?.width>.05&&t?.depth>.05;return{w:y?t.width:c?.width>0?c.width*.0254:.9,dp:y?t.depth:c?.depth>0?c.depth*.0254:.6,cx:y&&t.cx||0,cz:y&&t.cz||0}},b=i=>{const t=g.get(i);if(!t)return null;const[c,,y]=t.position,m=(Array.isArray(t.rotation)?t.rotation[1]:0)||0,{cx:p,cz:r}=d(i);return{x:c+p*Math.cos(m)+r*Math.sin(m),z:y-p*Math.sin(m)+r*Math.cos(m),y:t.position[1],r:m}},v=i=>{const t=b(i);if(!t)return null;const{w:c,dp:y}=d(i),m=Math.abs(Math.cos(t.r)),p=Math.abs(Math.sin(t.r)),r=(c*m+y*p)/2,o=(c*p+y*m)/2;return{minX:t.x-r,maxX:t.x+r,minZ:t.z-o,maxZ:t.z+o}},h=(i,t)=>i&&t&&i.minX<t.maxX-.04&&i.maxX>t.minX+.04&&i.minZ<t.maxZ-.04&&i.maxZ>t.minZ+.04;for(const[,i]of W){const t=i.filter(n=>V(n)&&Number.isFinite(Number(n.sequence))).map(n=>({inst:n,seq:Number(n.sequence)})).sort((n,M)=>n.seq-M.seq);if(!t.length)continue;const c=t[t.length-1].inst,y=t[t.length-1].seq,m=i.filter(n=>!V(n)&&Number.isFinite(Number(n.sequence))).sort((n,M)=>Number(n.sequence)-Number(M.sequence)),p=[];for(const n of t){const M=v(n.inst);M&&p.push(M)}const r=[];for(const n of m){const M=v(n);M&&(p.some(q=>h(M,q))?r.push(n):p.push(M))}if(!r.length)continue;const o=m.filter(n=>Number(n.sequence)>y&&!r.includes(n)),s=o.length?(Array.isArray(g.get(o[0])?.rotation)?g.get(o[0]).rotation[1]:0)||0:((Array.isArray(g.get(c)?.rotation)?g.get(c).rotation[1]:0)||0)-Math.PI/2,a=-s,f=Math.cos(a),x=Math.sin(a),l=-x,z=f,I=n=>n.x*f+n.z*x,X=b(c);if(!X)continue;const S=o.length?(()=>{const n=b(o[0]);return n?n.x*l+n.z*z:X.x*l+X.z*z})():X.x*l+X.z*z;let N,Z;if(o.length){const n=b(o[0]);N=Math.sign(I(n)-I(X))||1,Z=Math.max(...o.map(M=>{const q=b(M);return q?I(q)+N*d(M).w/2:-1/0}))}else{N=1;const n=d(c);Z=I(X)+N*(Math.abs(Math.cos(X.r+a))*(n.w/2)+Math.abs(Math.sin(X.r+a))*(n.dp/2))}if(Number.isFinite(Z))for(const n of r){const M=b(n);if(!M)continue;const{w:q,cx:Y,cz:O}=d(n),F=Z+N*q/2,T=F*f+S*l,_=F*x+S*z;g.set(n,{position:[T-(Y*Math.cos(s)+O*Math.sin(s)),M.y,_-(-Y*Math.sin(s)+O*Math.cos(s))],rotation:[0,s,0]}),Z+=N*q}}}{const d=t=>{const c=B.getDims?.(t.productId,t)??B.getDims?.(t.variantId,t)??null,y=G(t),m=c?.width>.05&&c?.depth>.05;return{w:m?c.width:y?.width>0?y.width*.0254:.9,dp:m?c.depth:y?.depth>0?y.depth*.0254:.6,cx:m&&c.cx||0,cz:m&&c.cz||0}},b=t=>{const c=g.get(t);if(!c)return null;const[y,,m]=c.position,p=(Array.isArray(c.rotation)?c.rotation[1]:0)||0,{w:r,dp:o,cx:s,cz:a}=d(t),f=y+s*Math.cos(p)+a*Math.sin(p),x=m-s*Math.sin(p)+a*Math.cos(p),l=Math.abs(Math.cos(p)),z=Math.abs(Math.sin(p)),I=(r*l+o*z)/2,X=(r*z+o*l)/2;return{minX:f-I,maxX:f+I,minZ:x-X,maxZ:x+X}};let v=0,h=0,i=0;for(const t of H){const c=g.get(t);c&&(v+=c.position[0],h+=c.position[2],i+=1)}i&&(v/=i,h/=i);for(const[,t]of W){const c=t.filter(r=>V(r)).map(r=>({b:b(r)})).filter(r=>r.b);if(!c.length)continue;const y=t.filter(r=>!V(r)).map(r=>({inst:r,b:b(r)})).filter(r=>r.b);for(const{b:r}of c){const o=(x,l)=>c.some(({b:z})=>z===r?!1:x==="x"?z.minZ<r.maxZ-.05&&z.maxZ>r.minZ+.05&&(l?z.minX>r.maxX:z.maxX<r.minX):z.minX<r.maxX-.05&&z.maxX>r.minX+.05&&(l?z.minZ>r.maxZ:z.maxZ<r.minZ)),a={xp:[],xn:[],zp:[],zn:[]};for(const{inst:x,b:l}of y){const z=l.minZ<r.maxZ-.05&&l.maxZ>r.minZ+.05,I=l.minX<r.maxX-.05&&l.maxX>r.minX+.05;z&&!I?l.minX>=r.maxX-.02?a.xp.push({inst:x,gap:Math.max(0,l.minX-r.maxX)}):l.maxX<=r.minX+.02&&a.xn.push({inst:x,gap:Math.max(0,r.minX-l.maxX)}):I&&!z&&(l.minZ>=r.maxZ-.02?a.zp.push({inst:x,gap:Math.max(0,l.minZ-r.maxZ)}):l.maxZ<=r.minZ+.02&&a.zn.push({inst:x,gap:Math.max(0,r.minZ-l.maxZ)}))}const f=(x,l,z,I)=>{if(!x.length||o(l,z))return;const X=Math.min(...x.map(N=>N.gap));if(X>.015&&X<.5){const N=I*X;for(const{inst:Z}of x){const n=g.get(Z);n&&g.set(Z,{position:[n.position[0]+(l==="x"?N:0),n.position[1],n.position[2]+(l==="z"?N:0)],rotation:n.rotation})}}const S=l==="x"?"z":"x";for(const{inst:N}of x){const Z=b(N),n=g.get(N);if(!(!Z||!n))if(S==="z"){const M=mt((Z.minZ+Z.maxZ)/2,n.position[2],h),q=M?Z.maxZ:Z.minZ,O=(M?r.maxZ:r.minZ)-q;(M?O>0:O<0)&&Math.abs(O)>.015&&Math.abs(O)<.5&&g.set(N,{position:[n.position[0],n.position[1],n.position[2]+O],rotation:n.rotation})}else{const M=mt((Z.minX+Z.maxX)/2,n.position[0],v),q=M?Z.maxX:Z.minX,O=(M?r.maxX:r.minX)-q;(M?O>0:O<0)&&Math.abs(O)>.015&&Math.abs(O)<.5&&g.set(N,{position:[n.position[0]+O,n.position[1],n.position[2]],rotation:n.rotation})}}};f(a.xp,"x",!0,-1),f(a.xn,"x",!1,1),f(a.zp,"z",!0,-1),f(a.zn,"z",!1,1)}const m=(r,o)=>o==="x"?(r.minX+r.maxX)/2:(r.minZ+r.maxZ)/2,p=(r,o)=>o==="x"?(r.minZ+r.maxZ)/2:(r.minX+r.maxX)/2;for(let r=0;r<c.length;r++)for(let o=r+1;o<c.length;o++){const s=c[r].b,a=c[o].b,f=Math.abs((s.minX+s.maxX)/2-(a.minX+a.maxX)/2),x=Math.abs((s.minZ+s.maxZ)/2-(a.minZ+a.maxZ)/2);let l=null;if(x<.35&&f>.5?l="x":f<.35&&x>.5&&(l="z"),!l)continue;const z=m(s,l)<m(a,l),I=z?s:a,X=z?a:s,S=l==="x"?I.maxX:I.maxZ,N=l==="x"?X.minX:X.minZ,Z=p(I,l),n=t.filter(k=>!V(k)).map(k=>({inst:k,b:b(k)})).filter(({b:k})=>k&&m(k,l)>S-.15&&m(k,l)<N+.15&&Math.abs(p(k,l)-Z)<.4).sort((k,w)=>m(k.b,l)-m(w.b,l));if(!n.length)continue;const M=n.map(({inst:k})=>d(k).w),q=M.reduce((k,w)=>k+w,0);if(q>N-S+.02)continue;const Y=q/2;let O=0,F=n.length;for(let k=0;k<n.length;k++)if(O+=M[k],O>Y){F=k;break}const T=(k,w)=>{const e=g.get(k);if(!e)return;const A=(Array.isArray(e.rotation)?e.rotation[1]:0)||0,{cx:L,cz:E}=d(k);l==="x"?g.set(k,{position:[w-(L*Math.cos(A)+E*Math.sin(A)),e.position[1],e.position[2]],rotation:e.rotation}):g.set(k,{position:[e.position[0],e.position[1],w-(-L*Math.sin(A)+E*Math.cos(A))],rotation:e.rotation})};let _=S;for(let k=0;k<F;k++)T(n[k].inst,_+M[k]/2),_+=M[k];_=N;for(let k=n.length-1;k>=F;k--)T(n[k].inst,_-M[k]/2),_-=M[k]}}}return gt(),H.map(u=>{const d=g.get(u)||{position:[0,0,0],rotation:[0,0,0]};return dt.has(u)?{...d,hidden:!0}:d})}};import{appendTargetFor as It,neighborsFor as Nt,groupByPlacement as qt}from"./dc812f3e14.js";function mt(C,B,P){const H=C-B;return H<-.01?!0:H>.01?!1:B>P}export{It as appendTargetFor,At as default,qt as groupByPlacement,Nt as neighborsFor};
@@ -0,0 +1 @@
1
+ function g(n){return n===!0?!0:n==="depth"?"depth":!1}function B(n,t,i=!1){const o=Array.isArray(t?.position)?t.position:Array.isArray(t)?t:[0,0,0],r=Array.isArray(t?.scale)?t.scale:[1,1,1],a=Array.isArray(t?.rotation)&&t.rotation[1]||0,s=t?.rotationRad?a:a*Math.PI/180,c=Math.cos(s),h=Math.sin(s),l=(n.width||0)/2,e=(n.depth||0)/2,d=(n.height||0)/2;let u=1/0,x=-1/0,p=1/0,m=-1/0;for(const w of[-l,l])for(const A of[-e,e]){const z=((n.cx||0)+w)*(r[0]||1),F=((n.cz||0)+A)*(r[2]||1),I=z*c+F*h+(o[0]||0),b=-z*h+F*c+(o[2]||0);u=Math.min(u,I),x=Math.max(x,I),p=Math.min(p,b),m=Math.max(m,b)}const y=Math.abs(r[1]||1),M=(o[1]||0)+(n.cy||0)*(r[1]||1);return{minx:u,maxx:x,minz:p,maxz:m,height:(n.height||0)*y,bottom:M-d*y,top:M+d*y,excludedFromFootprint:g(i)}}function f(n,t=()=>!0){let i=1/0,o=-1/0,r=1/0,a=-1/0,s=-1/0,c=1/0,h=!1;for(const e of Object.values(n||{}))!e||!t(e)||(h=!0,i=Math.min(i,e.minx),o=Math.max(o,e.maxx),r=Math.min(r,e.minz),a=Math.max(a,e.maxz),s=Math.max(s,e.top!=null?e.top:e.height||0),c=Math.min(c,e.bottom!=null?e.bottom:0));if(!h||!Number.isFinite(i))return null;const l=Number.isFinite(s)&&Number.isFinite(c)?Math.max(0,s-c):0;return{width:o-i,depth:a-r,height:l,cx:(i+o)/2,cz:(r+a)/2,minX:i,minZ:r}}function N(n){const t=f(n),i=f(n,a=>a.excludedFromFootprint!==!0),o=f(n,a=>!a.excludedFromFootprint);return{body:i&&o?{...o,width:i.width,cx:i.cx,minX:i.minX}:i||o||t,full:t}}function X(){const n={};return{boxes:n,set(t,i,o,r){return n[t]=B(i,o,r),n[t]},remove(t){const i=t in n;return delete n[t],i},has(t){return t in n},report(){const{body:t,full:i}=N(n);return t?i?{...t,full:i}:t:null}}}export{X as createSlotFootprint,g as footprintFlag,N as footprintOf,B as slotBox,f as unionBoxes};
@@ -1 +1 @@
1
- import{evaluateConfiguration as C}from"./fbd844f2d1.js";import{emitEvent as p,EVENTS as s}from"./2e366d7386.js";import{recordEvaluationStarted as j,recordEvaluationSettled as T,recordEvaluationResult as R}from"./9f474b5d1a.js";import{getConfigState as m,getCatalogVersion as h,applyEvaluateResult as w,patchConfigState as V}from"./817d930a49.js";import{isLocalOnlyMutation as x,MutationType as S}from"./3c916f744f.js";let l=null,y=null;function H(t){y=typeof t=="function"?t:null}let d=null;function I(t){d=typeof t=="function"?t:null}let E=null;function U(t){E=typeof t=="function"?t:null}function v(t){if(E)try{E(t)}catch{}}let g=null;function b(t){g=typeof t=="function"?t:null}function D(t){t.type===S.SET_TRANSFORM&&V(i=>({...i,placements:(i.placements||[]).map(n=>String(n.id)===String(t.placementId)?{...n,transform:{position:t.position??n.transform?.position,rotation:t.rotation??n.transform?.rotation}}:n)}))}async function _(t,i,n){const u=m();return C({systemId:u.systemId,catalogVersion:i,state:u,mutation:t},{signal:n})}async function F(t,{optimistic:i,rollback:n}={}){if(!m()||!t)return null;if(x(t))return D(t),null;if(typeof i=="function")try{i()}catch{}let r=t;if(d&&r.context==null)try{const o=d();o&&typeof o=="object"&&Object.keys(o).length&&(r={...r,context:{focus:o}})}catch{}l&&l.abort();const c=new AbortController;l=c;const a=r.type===S.NOOP;a||v(!0),p(s.EVALUATE_STARTED,{mutation:r,internal:a}),j();const A=Date.now();let e=null;try{if(e=await _(r,h(),c.signal),e.staleCatalog)if(y){const f=(await y(e))?.catalogVersion??e.catalogVersion??h();e=await _(r,f,c.signal)}else return e}catch(o){if(o?.name==="AbortError")return null;if(typeof n=="function")try{n()}catch{}throw o}finally{l===c&&(l=null),a||v(!1),T()}w(e);{const o=e?.rejected?"rejected":"completed",f={mutation:r,internal:a,applied:!!e?.applied,rejected:!!e?.rejected,resolvedState:e?.resolvedState??null,warnings:e?.warnings??[],pricing:e?.pricing??null,code:e?.code??null,errors:Array.isArray(e?.errors)?e.errors:[]};R(o,f,e,Date.now()-A),p(o==="rejected"?s.EVALUATE_REJECTED:s.EVALUATE_COMPLETED,f),!a&&e?.pricing&&p(s.PRICE_CHANGED,e.pricing)}if(e.rejected&&typeof n=="function")try{n()}catch{}if(e.rejected&&r.type!=="noop"&&typeof g=="function")try{g(e,r)}catch{}return e}export{F as dispatch,U as setEvaluationStateHandler,I as setFocusProvider,H as setRefetchCatalogHandler,b as setRejectionHandler};
1
+ import{evaluateConfiguration as D}from"./fbd844f2d1.js";import{emitEvent as d,EVENTS as s}from"./2e366d7386.js";import{recordEvaluationStarted as I,recordEvaluationSettled as R,recordEvaluationResult as V}from"./9f474b5d1a.js";import{getConfigState as A,getCatalogVersion as C,applyEvaluateResult as O,patchConfigState as b}from"./817d930a49.js";import{isLocalOnlyMutation as N,MutationType as y}from"./3c916f744f.js";let c=null,g=!1,E=!1,m=null;function J(t){m=typeof t=="function"?t:null}let h=null;function q(t){h=typeof t=="function"?t:null}let _=null;function z(t){_=typeof t=="function"?t:null}function j(t){if(_)try{_(t)}catch{}}let S=null;function B(t){S=typeof t=="function"?t:null}function L(t){t.type===y.SET_TRANSFORM&&b(l=>({...l,placements:(l.placements||[]).map(r=>String(r.id)===String(t.placementId)?{...r,transform:{position:t.position??r.transform?.position,rotation:t.rotation??r.transform?.rotation}}:r)}))}async function T(t,l,r){const p=A();return D({systemId:p.systemId,catalogVersion:l,state:p,mutation:t},{signal:r})}async function P(t,{optimistic:l,rollback:r}={}){if(!A()||!t)return null;if(N(t))return L(t),null;if(typeof l=="function")try{l()}catch{}let n=t;if(h&&n.context==null)try{const o=h();o&&typeof o=="object"&&Object.keys(o).length&&(n={...n,context:{focus:o}})}catch{}if(n&&typeof n=="object"&&!(n.context&&n.context.mutation)){const{type:o,optionSetId:a,optionId:v,placementId:w}=n,u={type:o};a!=null&&(u.optionSetId=a),v!=null&&(u.optionId=v),w!=null&&(u.placementId=w),n={...n,context:{...n.context||{},mutation:u}}}try{import.meta.env?.DEV&&typeof window<"u"&&window.__layoutDebug&&(n={...n,_layoutDebug:window.__layoutDebug})}catch{}const i=n.type===y.NOOP;if(i&&c&&!g)return E=!0,null;c&&c.abort();const f=new AbortController;c=f,g=i,i||j(!0),d(s.EVALUATE_STARTED,{mutation:n,internal:i}),I();const x=Date.now();let e=null;try{if(e=await T(n,C(),f.signal),e.staleCatalog)if(m){const a=(await m(e))?.catalogVersion??e.catalogVersion??C();e=await T(n,a,f.signal)}else return e}catch(o){if(o?.name==="AbortError")return null;if(typeof r=="function")try{r()}catch{}throw o}finally{c===f&&(c=null,g=!1,!i&&E&&(E=!1,setTimeout(()=>{P({type:y.NOOP}).catch(()=>{})},0))),i||j(!1),R()}O(e);{const o=e?.rejected?"rejected":"completed",a={mutation:n,internal:i,applied:!!e?.applied,rejected:!!e?.rejected,resolvedState:e?.resolvedState??null,warnings:e?.warnings??[],pricing:e?.pricing??null,code:e?.code??null,errors:Array.isArray(e?.errors)?e.errors:[]};V(o,a,e,Date.now()-x),d(o==="rejected"?s.EVALUATE_REJECTED:s.EVALUATE_COMPLETED,a),!i&&e?.pricing&&d(s.PRICE_CHANGED,e.pricing)}if(e.rejected&&typeof r=="function")try{r()}catch{}if(e.rejected&&n.type!=="noop"&&typeof S=="function")try{S(e,n)}catch{}return e}export{P as dispatch,z as setEvaluationStateHandler,q as setFocusProvider,J as setRefetchCatalogHandler,B as setRejectionHandler};
@@ -1 +1 @@
1
- const w=.0254,a=.9,i=c=>{const t=c?.width;return typeof t=="number"&&t>0?t*.0254:.9};var _={id:"append-sequence",label:"Append in a row",mode:"compute",computeLayout(c,{getProduct:t,getDims:r}){let n=0;const e=[];for(const s of c||[]){const o=r?.(s.productId),d=o?.width>0?o.width:i(t(s.productId)),u=o?.cx||0,p=o?.cz||0;e.push({position:[n+d/2-u,0,-p],rotation:[0,0,0]}),n+=d}return e}};export{_ as default};
1
+ const w=.0254,a=.9,i=c=>{const t=c?.width;return typeof t=="number"&&t>0?t*.0254:.9};var _={id:"append-sequence",label:"Append in a row",mode:"compute",computeLayout(c,{getProduct:t,getDims:r}){let e=0;const s=[];for(const n of c||[]){const o=r?.(n.productId,n),d=o?.width>0?o.width:i(t(n.productId)),u=o?.cx||0,p=o?.cz||0;s.push({position:[e+d/2-u,0,-p],rotation:[0,0,0]}),e+=d}return s}};export{_ as default};
@@ -1 +1 @@
1
- import{useCallback as w,useEffect as k,useMemo as C,useRef as x}from"react";import g from"./9c6c598569.js";import{registerBuiltinCommand as H,hasCommand as B,COMMANDS as S}from"./d6851ea979.js";import z from"./d94df858ea.js";import J from"./be337ddda5.js";import D from"./872c4302e0.js";import Q from"./60d697292c.js";import{runIntent as b,INTENTS as y}from"./6d238282c1.js";import{addProduct as W,moveProduct as X,removeProduct as Y}from"./a77b15c0d6.js";function Z(){const d=g(e=>e.selectedInstanceId),V=g(e=>e.addProductInstance),M=g(e=>e.removeProductInstance),_=g(e=>e.clearSelection),R=z(e=>e.placementPricing),N=J(e=>e.getChannelPriceConfig),$=D(e=>e.getProduct),{edgeOf:I,isMovable:G,ordered:T,syntheticHosts:L,moveInFlightRef:E,productInstances:h}=Q(),O=C(()=>{if(!d)return null;const e=h||{};return e[d]??Object.values(e).find(r=>String(r?.instanceId??r?.id)===String(d))??null},[d,h]),v=w((e,r)=>{const o=g.getState().productInstances||{},l=o[r],i=o[e],c=Number(l?.sequence),p=Number.isFinite(c)?Math.round(c):null;let a=i?.positionedAbove!=null?String(i.positionedAbove):null,s=null;if(a){const u=o[a];s=u?u.variantId??u.productId??null:null}else{const u=D.getState(),t=u.getProduct?.(i?.variantId)||u.getProduct?.(i?.productId),n=t?.hostVariants??t?.host_variants;if(Array.isArray(n)&&n.length){const f=n.find(P=>P?.isDefault??P?.is_default)||n[0];s=f?.hostVariantId??f?.host_variant_id??null}}const m=Number(i?.sequence);p==null||Number.isFinite(m)&&Math.round(m)===p||E.current||(E.current=!0,X({placementId:e,sequence:p,hostPlacementId:a,hostVariantId:s}).catch(()=>{}).finally(()=>{E.current=!1}))},[]),q=C(()=>{let e=O;if(!e&&d!=null){const t=L.find(n=>n.id===String(d));if(t){const n=h||{};e=n[t.hostedProductId]??Object.values(n).find(f=>String(f?.id??f?.instanceId)===String(t.hostedProductId))??null}}if(!e)return null;const r=I(e),o=G(e),l=e.placementGroup??null,i=T.filter(t=>(t.placementGroup??null)===l),c=i.findIndex(t=>t.id===e.id),p=i[c-1],a=i[c+1],s=t=>t==="left"||t==="right",m=!o&&!s(r)&&p&&!s(I(p)),u=!o&&!s(r)&&a&&!s(I(a));return{targetId:e.id,placementId:e.id,onMoveLeft:()=>b({type:y.PRODUCT_MOVE,placementId:e.id,direction:"left"},()=>{m&&v(e.id,p.id)}),onMoveRight:()=>b({type:y.PRODUCT_MOVE,placementId:e.id,direction:"right"},()=>{u&&v(e.id,a.id)}),onDuplicate:r?void 0:()=>b({type:y.PRODUCT_DUPLICATE,placementId:e.id},()=>{const t=D.getState(),n=t.getProduct?.(e.variantId)||t.getProduct?.(e.productId),f=n?.productGraph??n?.product_graph??null,P=e.placementGroup??n?.placementGroup??n?.placement_group??null,j=Array.isArray(e.position)?e.position:[0,0,0],F=Number.isFinite(Number(e.sequence))?Number(e.sequence):void 0;W({productGraphId:f,variantId:e.variantId??e.productId,placementGroup:P,position:j,sequence:F}).catch(()=>{})}),onDelete:()=>b({type:y.PRODUCT_REMOVE,placementId:e.id},()=>{const t=e.id;Y(t).then(n=>{n&&n.applied&&(M(t),_())}).catch(()=>{})}),disabledActions:{moveLeft:m?void 0:{disabled:!0,reason:o?"Drag to move":"Already at the start"},moveRight:u?void 0:{disabled:!0,reason:o?"Drag to move":"Already at the end"},duplicate:r?{disabled:!0,reason:"Only one of this piece allowed"}:void 0}}},[O,d,L,h,T,I,G,v,V,M,_]),A=x(null);A.current=q,k(()=>{const e=(o,l,i)=>async()=>{let c=A.current;for(let a=0;a<5;a++){const s=g.getState().selectedInstanceId;if(s==null?c==null:c!=null&&String(c.targetId)===String(s))break;await new Promise(u=>setTimeout(u,0)),c=A.current}return!c||(i?c.disabledActions?.[i]:null)||typeof c[l]!="function"?!1:(c[l](),!0)},r=[[S.MOVE_LEFT,e("moveLeft","onMoveLeft","moveLeft")],[S.MOVE_RIGHT,e("moveRight","onMoveRight","moveRight")],[S.DUPLICATE,e("duplicate","onDuplicate","duplicate")],[S.DELETE,e("deleteSelected","onDelete",null)]].map(([o,l])=>B(o)?()=>{}:H(o,l));return()=>r.forEach(o=>o())},[]);const U=C(()=>{const e=d?R?.[d]:null,r=e?.unitPrice??e?.unit_price;return e==null||!Number.isFinite(Number(r))?null:{unitPrice:Number(r),adjustments:Array.isArray(e.adjustments)?e.adjustments:[],currency:(N?.()||{}).currency||"USD"}},[d,R,N]);return{selectedInst:O,swapOrder:v,panelActions:q,priceInfo:U}}export{Z as default};
1
+ import{useCallback as w,useEffect as k,useMemo as M,useRef as x}from"react";import f from"./9c6c598569.js";import{registerBuiltinCommand as H,hasCommand as B,COMMANDS as v}from"./d6851ea979.js";import z from"./d94df858ea.js";import J from"./be337ddda5.js";import y from"./872c4302e0.js";import Q from"./60d697292c.js";import{resolveHostVariantId as W}from"./be07a7f885.js";import{runIntent as S,INTENTS as b}from"./6d238282c1.js";import{addProduct as X,moveProduct as Y,removeProduct as Z}from"./a77b15c0d6.js";function $(){const d=f(e=>e.selectedInstanceId),q=f(e=>e.addProductInstance),D=f(e=>e.removeProductInstance),R=f(e=>e.clearSelection),A=z(e=>e.placementPricing),N=J(e=>e.getChannelPriceConfig),K=y(e=>e.getProduct),{edgeOf:g,isMovable:G,ordered:T,syntheticHosts:_,moveInFlightRef:E,productInstances:I}=Q(),O=M(()=>{if(!d)return null;const e=I||{};return e[d]??Object.values(e).find(n=>String(n?.instanceId??n?.id)===String(d))??null},[d,I]),h=w((e,n)=>{const o=f.getState().productInstances||{},a=o[n],c=o[e],r=Number(a?.sequence),p=Number.isFinite(r)?Math.round(r):null;let l=c?.positionedAbove!=null?String(c.positionedAbove):null,s=null;if(l){const u=o[l];s=u?u.variantId??u.productId??null:null}else{const u=y.getState(),t=u.getProduct?.(c?.variantId)||u.getProduct?.(c?.productId);s=W(t,c)}const m=Number(c?.sequence);p==null||Number.isFinite(m)&&Math.round(m)===p||E.current||(E.current=!0,Y({placementId:e,sequence:p,hostPlacementId:l,hostVariantId:s}).catch(()=>{}).finally(()=>{E.current=!1}))},[]),L=M(()=>{let e=O;if(!e&&d!=null){const t=_.find(i=>i.id===String(d));if(t){const i=I||{};e=i[t.hostedProductId]??Object.values(i).find(P=>String(P?.id??P?.instanceId)===String(t.hostedProductId))??null}}if(!e)return null;const n=g(e),o=G(e),a=e.placementGroup??null,c=T.filter(t=>(t.placementGroup??null)===a),r=c.findIndex(t=>t.id===e.id),p=c[r-1],l=c[r+1],s=t=>t==="left"||t==="right",m=!o&&!s(n)&&p&&!s(g(p)),u=!o&&!s(n)&&l&&!s(g(l));return{targetId:e.id,placementId:e.id,onMoveLeft:()=>S({type:b.PRODUCT_MOVE,placementId:e.id,direction:"left"},()=>{m&&h(e.id,p.id)}),onMoveRight:()=>S({type:b.PRODUCT_MOVE,placementId:e.id,direction:"right"},()=>{u&&h(e.id,l.id)}),onDuplicate:n?void 0:()=>S({type:b.PRODUCT_DUPLICATE,placementId:e.id},()=>{const t=y.getState(),i=t.getProduct?.(e.variantId)||t.getProduct?.(e.productId),P=i?.productGraph??i?.product_graph??null,V=e.placementGroup??i?.placementGroup??i?.placement_group??null,j=Array.isArray(e.position)?e.position:[0,0,0],F=Number.isFinite(Number(e.sequence))?Number(e.sequence):void 0;X({productGraphId:P,variantId:e.variantId??e.productId,placementGroup:V,position:j,sequence:F}).catch(()=>{})}),onDelete:()=>S({type:b.PRODUCT_REMOVE,placementId:e.id},()=>{const t=e.id;Z(t).then(i=>{i&&i.applied&&(D(t),R())}).catch(()=>{})}),disabledActions:{moveLeft:m?void 0:{disabled:!0,reason:o?"Drag to move":"Already at the start"},moveRight:u?void 0:{disabled:!0,reason:o?"Drag to move":"Already at the end"},duplicate:n?{disabled:!0,reason:"Only one of this piece allowed"}:void 0}}},[O,d,_,I,T,g,G,h,q,D,R]),C=x(null);C.current=L,k(()=>{const e=(o,a,c)=>async()=>{let r=C.current;for(let l=0;l<5;l++){const s=f.getState().selectedInstanceId;if(s==null?r==null:r!=null&&String(r.targetId)===String(s))break;await new Promise(u=>setTimeout(u,0)),r=C.current}return!r||(c?r.disabledActions?.[c]:null)||typeof r[a]!="function"?!1:(r[a](),!0)},n=[[v.MOVE_LEFT,e("moveLeft","onMoveLeft","moveLeft")],[v.MOVE_RIGHT,e("moveRight","onMoveRight","moveRight")],[v.DUPLICATE,e("duplicate","onDuplicate","duplicate")],[v.DELETE,e("deleteSelected","onDelete",null)]].map(([o,a])=>B(o)?()=>{}:H(o,a));return()=>n.forEach(o=>o())},[]);const U=M(()=>{const e=d?A?.[d]:null,n=e?.unitPrice??e?.unit_price;return e==null||!Number.isFinite(Number(n))?null:{unitPrice:Number(n),adjustments:Array.isArray(e.adjustments)?e.adjustments:[],currency:(N?.()||{}).currency||"USD"}},[d,A,N]);return{selectedInst:O,swapOrder:h,panelActions:L,priceInfo:U}}export{$ as default};