@solumflow-app/product-configurator 0.1.0 → 0.3.0

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.
@@ -0,0 +1 @@
1
+ import {b as b$1}from'./chunk-RNTBO6KY.js';import*as d from'three';import {RoundedBoxGeometry}from'three/examples/jsm/geometries/RoundedBoxGeometry.js';var B=1/1e3,f=32;function r(e){return e*B}function _(e){e.computeBoundingBox();let t=e.boundingBox?.getCenter(new d.Vector3);return t&&e.translate(-t.x,-t.y,-t.z),e.computeBoundingBox(),e}function I(e){let t=e.getAttribute("position"),o=e.getAttribute("normal");if(!t||!o)return e;let a=new Float32Array(t.count*2);for(let s=0;s<t.count;s+=1){let m=Math.abs(o.getX(s)),i=Math.abs(o.getY(s)),n=Math.abs(o.getZ(s));m>=i&&m>=n?(a[s*2]=t.getZ(s),a[s*2+1]=t.getY(s)):i>=n?(a[s*2]=t.getX(s),a[s*2+1]=t.getZ(s)):(a[s*2]=t.getX(s),a[s*2+1]=t.getY(s));}return e.setAttribute("uv",new d.BufferAttribute(a,2)),e}function p(e){return I(_(e))}var g=3;function c(e,t=0){let o=Math.min(t,e/4);return o<=0?{depth:e,bevelEnabled:false,curveSegments:f,steps:1}:{depth:e-2*o,bevelEnabled:true,bevelThickness:o,bevelSize:o,bevelOffset:-o,bevelSegments:g,curveSegments:f,steps:1}}function Y(e){return (Array.isArray(e)?e:[e]).every(o=>!o.transparent&&o.toneMapped)}function Z(e){for(let t of Array.isArray(e)?e:[e]){let o=t.emissive;o&&(o.r>0||o.g>0||o.b>0)&&(t.toneMapped=false);}}function O(e){let[t,,o]=e.size,a=Math.max(0,Math.min(e.params.thickness??0,t,o));return {width:t,depth:o,thickness:a,mirrored:(e.params.mirror??0)>=.5}}function A(e){let{width:t,depth:o,thickness:a,mirrored:s}=O(e),m=[];for(let i=0;i<=f;i+=1){let n=i/f*(Math.PI/2);m.push([t*Math.cos(n),o*Math.sin(n)]);}for(let i=f;i>=0;i-=1){let n=i/f*(Math.PI/2);m.push([(t-a)*Math.cos(n),(o-a)*Math.sin(n)]);}return m.map(([i,n])=>[s?t-i:i,n])}function M(e,t=0){let[,o]=e.size,a=new d.Shape(A(e).map(([m,i])=>new d.Vector2(r(m),r(i)))),s=new d.ExtrudeGeometry(a,c(r(o),r(t)));return s.rotateX(Math.PI/2),p(s)}function G(e,t=0){let[o,a,s]=e.size;return t<=0?p(new d.BoxGeometry(r(o),r(a),r(s))):p(new RoundedBoxGeometry(r(o),r(a),r(s),g,r(t)))}var k=5;function b(e,t){if(t==="sharp"||e.type==="led_strip"||e.type==="model")return 0;let o=Math.min(...e.size,...D(e));return Math.max(0,Math.min(k,o/4))}function D(e){if(e.type==="arc_panel")return [e.params.thickness??0];if(e.type==="niche_panel"){let t=b$1(e);return t.width<=0||t.height<=0?[]:[t.x,t.y,e.size[0]-t.x-t.width,e.size[1]-t.y-t.height]}return []}function H(e){let[t,o,a]=e.size;return p(new d.BoxGeometry(r(t),r(o),r(a)))}function S(e,t=0){let[o,a,s]=e.size,m=b$1(e),i=new d.Shape;if(i.moveTo(0,0),i.lineTo(r(o),0),i.lineTo(r(o),r(a)),i.lineTo(0,r(a)),i.closePath(),m.width>0&&m.height>0){let n=new d.Path;n.moveTo(r(m.x),r(m.y)),n.lineTo(r(m.x+m.width),r(m.y)),n.lineTo(r(m.x+m.width),r(m.y+m.height)),n.lineTo(r(m.x),r(m.y+m.height)),n.closePath(),i.holes.push(n);}return p(new d.ExtrudeGeometry(i,c(r(s),r(t))))}function N(e){let[,t,o]=e.size,a=Math.max(0,Math.min(e.params.radius??0,t,o));return {depth:o,height:t,radius:a}}function v(e,t=0){let[o]=e.size,{depth:a,height:s,radius:m}=N(e),i=r(a),n=r(s),h=r(m),u=new d.Shape;u.moveTo(0,0),u.lineTo(i,0),u.lineTo(i,n-h),h>0&&u.absarc(i-h,n-h,h,0,Math.PI/2,false),u.lineTo(0,n),u.closePath();let P=new d.ExtrudeGeometry(u,c(r(o),r(t)));return P.rotateY(-Math.PI/2),p(P)}function U(e){let[t,o]=e.size;return Math.min(t,o)/2}function z(e,t=0){let[o,a,s]=e.size,m=r(o),i=r(a),n=r(U(e)),h=new d.Shape;return h.moveTo(n,0),h.lineTo(m-n,0),h.absarc(m-n,n,n,-Math.PI/2,0,false),h.lineTo(m,i-n),h.absarc(m-n,i-n,n,0,Math.PI/2,false),h.lineTo(n,i),h.absarc(n,i-n,n,Math.PI/2,Math.PI,false),h.lineTo(0,n),h.absarc(n,n,n,Math.PI,3*Math.PI/2,false),p(new d.ExtrudeGeometry(h,c(r(s),r(t))))}var V={box:G,rounded_top_box:v,stadium_prism:z,arc_panel:M,led_strip:H,niche_panel:S,model:e=>G(e)};function ye(e,t){return V[e.type](e,b(e,t))}function le(e){return [r(e.at[0]+e.size[0]/2),r(e.at[1]+e.size[1]/2),r(e.at[2]+e.size[2]/2)]}export{B as a,r as b,Y as c,Z as d,ye as e,le as f};
@@ -0,0 +1 @@
1
+ var n=Object.defineProperty;var m=(h,t)=>{for(var e in t)n(h,e,{get:t[e],enumerable:true});};function o(h){let[t,e]=h.size,a=Math.min(Math.max(h.params.niche_x??0,0),t),i=Math.min(Math.max(h.params.niche_y??0,0),e);return {x:a,y:i,width:Math.min(Math.max(h.params.niche_width??0,0),t-a),height:Math.min(Math.max(h.params.niche_height??0,0),e-i)}}export{m as a,o as b};
@@ -0,0 +1 @@
1
+ import {o,j,n,m}from'./chunk-ATEH2U7F.js';import {f,e,c,a}from'./chunk-QLPSL2DY.js';import'./chunk-RNTBO6KY.js';import {lazy,useState,useRef,useLayoutEffect,Suspense,useMemo,useEffect}from'react';import {ContactShadows,OrbitControls}from'@react-three/drei';import {Canvas,useThree,useFrame}from'@react-three/fiber';import*as v from'three';import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {RoomEnvironment}from'three/examples/jsm/environments/RoomEnvironment.js';function B(r){let{handle:e,labels:t}=r,o=(n,a,i,c)=>jsx("button",{type:"button",className:"pc-camera-button",style:{gridArea:c},"aria-label":n,title:n,"data-test":`configurator-camera-${c}`,onClick:()=>{e.current&&i(e.current);},children:jsx("span",{"aria-hidden":"true",children:a})});return jsxs("div",{className:"pc-camera",role:"group","aria-label":t.cameraControls,children:[jsxs("div",{className:"pc-camera-pad",children:[o(t.cameraUp,"\u2191",n=>n.pan(0,1),"up"),o(t.cameraLeft,"\u2190",n=>n.pan(-1,0),"left"),o(t.cameraReset,"\u27F2",n=>n.reset(),"reset"),o(t.cameraRight,"\u2192",n=>n.pan(1,0),"right"),o(t.cameraDown,"\u2193",n=>n.pan(0,-1),"down")]}),jsxs("div",{className:"pc-camera-zoom",children:[o(t.cameraZoomIn,"+",n=>n.zoom(1),"in"),o(t.cameraZoomOut,"\u2212",n=>n.zoom(-1),"out")]})]})}function U(r,e){let o={ArrowLeft:()=>e.pan(-1,0),ArrowRight:()=>e.pan(1,0),ArrowUp:()=>e.pan(0,1),ArrowDown:()=>e.pan(0,-1),"+":()=>e.zoom(1),"=":()=>e.zoom(1),"-":()=>e.zoom(-1),0:()=>e.reset()}[r];return o?.(),o!==void 0}var O=35,se=1.5,R=Math.PI/180;function x(r){let{bounds:e,azimuth:t=0,elevation:o=10,aspect:n=se}=r,a$1=g=>(e.min[g]+e.max[g])/2*a,i=g=>(e.max[g]-e.min[g])*a,c=[a$1(0),a$1(1),a$1(2)],s=Math.max(Math.hypot(i(0),i(1),i(2))/2,.1),f=O*R/2,l=Math.atan(Math.tan(f)*n),m=s/Math.sin(Math.min(f,l)),h=[c[0]+m*Math.sin(t*R)*Math.cos(o*R),c[1]+m*Math.sin(o*R),c[2]+m*Math.cos(t*R)*Math.cos(o*R)];return {target:c,position:h,radius:s,distance:m}}function z(r,e){return [0,1,2].map(t=>{let o=e.min[t]*a,n=e.max[t]*a,a$1=(n-o)/4;return Math.min(Math.max(r[t],o-a$1),n+a$1)})}function W(r){let{before:e,turning:t,camera:o,middle:n,radius:a,bounds:i}=r,c=a/e.radius,s=z(n.map((l,m)=>l+(t[m]-e.middle[m])*c),i),f=s.map((l,m)=>l+(o[m]-t[m])*c);return {target:s,position:f}}function Z(r){let{geometry:e,camera:t,interactive:o,handle:n}=r,{camera:a,invalidate:i,size:c}=useThree(),s=useRef(null),f=useRef(null),l=x({bounds:e.bounds,azimuth:t?.azimuth,elevation:t?.elevation}),[m,h,g]=l.target,{radius:E}=l;useLayoutEffect(()=>{let p=[m,h,g],u=f.current,d=s.current;if(u){let S=W({before:u,turning:d?d.target.toArray():u.middle,camera:a.position.toArray(),middle:p,radius:E,bounds:e.bounds});a.position.set(...S.position),d?.target.set(...S.target);}else d?.target.set(...p);d?.update(),a.lookAt(d?.target??new v.Vector3(...p)),f.current={middle:p,radius:E},i();},[m,h,g,E,a,i]);let b=p=>{let u=s.current;if(!u)return;let d=new v.Vector3(...z(p.toArray(),e.bounds));a.position.add(d.clone().sub(u.target)),u.target.copy(d),u.update(),i();};return useLayoutEffect(()=>(n.current={pan:(p,u)=>{let d=s.current;if(!d)return;a.updateMatrixWorld();let S=E*.15,ie=new v.Vector3().setFromMatrixColumn(a.matrixWorld,0).multiplyScalar(p*S).add(new v.Vector3().setFromMatrixColumn(a.matrixWorld,1).multiplyScalar(u*S));b(d.target.clone().add(ie));},zoom:p=>{let u=s.current;if(!u)return;let d=a.position.clone().sub(u.target),S=Math.min(Math.max(d.length()*(p>0?.8:1.25),E*.8),E*8);a.position.copy(u.target).add(d.setLength(S)),u.update(),i();},reset:()=>{let p=s.current,u=x({bounds:e.bounds,azimuth:t?.azimuth,elevation:t?.elevation,aspect:c.height>0?c.width/c.height:void 0});a.position.set(...u.position),p?.target.set(...u.target),p?.update(),i();}},()=>{n.current=null;})),jsx(OrbitControls,{ref:s,makeDefault:true,enabled:o,enablePan:true,screenSpacePanning:true,minDistance:E*.8,maxDistance:E*8,maxPolarAngle:Math.PI/2+.05,onChange:()=>{let p=s.current;if(!p)return;z(p.target.toArray(),e.bounds).some((d,S)=>d!==p.target.getComponent(S))&&b(p.target.clone());}})}var J={studio:{exposure:1.3,environmentIntensity:.6,key:{color:"#ffffff",intensity:2.6,position:[3,5,4]},shadowOpacity:.5},warm:{exposure:1.4,environmentIntensity:.75,key:{color:"#ffd8b0",intensity:1.7,position:[2.5,4,4]},shadowOpacity:.55},daylight:{exposure:1.6,environmentIntensity:1.15,key:{color:"#eef3ff",intensity:1.8,position:[4,6,3]},shadowOpacity:.4}};function $(r){return j.includes(r)?J[r]:J.studio}function Q(r){let e=useThree(a=>a.invalidate),t=JSON.stringify(Object.entries(r).map(([a,i])=>[a,n(i)])),o=useMemo(()=>JSON.parse(t),[t]),n$1=useMemo(()=>Object.fromEntries(o.map(([a,i])=>[a,pe(i)])),[o]);return useEffect(()=>{let a=new v.TextureLoader;a.setCrossOrigin("anonymous");let i=false,c=[];for(let[s,f]of o){let l=n$1[s];if(l)for(let m$1 of de(f))a.load(m$1.url,h=>{if(i){h.dispose();return}h.colorSpace=m$1.colorSpace,h.wrapS=v.RepeatWrapping,h.wrapT=v.RepeatWrapping;let g=m(f);h.repeat.set(g.repeat,g.repeat),h.rotation=g.rotation,m$1.apply(l,h),l.needsUpdate=true,c.push(h),e();},void 0,()=>{});}return ()=>{i=true;for(let s of c)s.dispose();}},[o,n$1,e]),useEffect(()=>()=>{for(let a of Object.values(n$1))a.dispose();},[n$1]),n$1}function pe(r){let e=new v.MeshStandardMaterial({color:r.color,roughness:r.roughness,metalness:r.metalness});return r.emissive&&(e.emissive.set(r.color),e.emissiveIntensity=1,e.toneMapped=false),r.transparent&&(e.transparent=true,e.opacity=r.opacity,e.depthWrite=false),e}function de(r){let e=[];return r.texture&&e.push({url:r.texture,colorSpace:v.SRGBColorSpace,apply:(t,o)=>{t.map=o,t.color.set("#ffffff");}}),r.normalMap&&e.push({url:r.normalMap,colorSpace:v.NoColorSpace,apply:(t,o)=>{t.normalMap=o,t.normalScale.set(r.normalScale,r.normalScale);}}),r.roughnessMap&&e.push({url:r.roughnessMap,colorSpace:v.NoColorSpace,apply:(t,o)=>{t.roughnessMap=o;}}),e}function ee(r){let{intensity:e}=r,t=useThree(o=>o.get);return useEffect(()=>{let{gl:o,scene:n,invalidate:a}=t(),i=new v.PMREMGenerator(o),c=new RoomEnvironment,s=i.fromScene(c,.04);return c.dispose(),i.dispose(),n.environment=s.texture,a(),()=>{n.environment===s.texture&&(n.environment=null),s.dispose();}},[t]),useEffect(()=>{let{scene:o,invalidate:n}=t();o.environmentIntensity=e,n();},[t,e]),null}function te(r){let{exposure:e}=r,t=useThree(o=>o.get);return useEffect(()=>{let{gl:o,invalidate:n}=t();o.toneMapping=v.AgXToneMapping,o.toneMappingExposure=e,o.outputColorSpace=v.SRGBColorSpace,n();},[t,e]),null}var Ce=lazy(()=>import('./model-part-CGYO323N.js')),Me=.05,xe=1e-4;function st(r){let{geometry:e,slots:t,camera:o,interactive:n=true,className:a}=r,i=$(r.lighting),c=useState(()=>x({bounds:e.bounds,azimuth:o?.azimuth,elevation:o?.elevation}))[0],s=e.bounds.min[1]/1e3-.001,f=useRef(null),l=n&&r.cameraLabels;return jsxs("div",{className:a,style:{position:"relative",width:"100%",height:"100%"},onContextMenu:m=>m.preventDefault(),tabIndex:l?0:void 0,onKeyDown:m=>{l&&f.current&&U(m.key,f.current)&&m.preventDefault();},children:[jsxs(Canvas,{frameloop:"demand",dpr:[1,2],camera:{fov:O,position:c.position,near:.05,far:100},gl:{antialias:true,alpha:true},shadows:"soft",children:[jsx(te,{exposure:i.exposure}),jsx(ee,{intensity:i.environmentIntensity}),jsx(Te,{position:i.key.position,color:i.key.color,intensity:i.key.intensity,target:c.target,radius:c.radius}),jsx(we,{parts:e.parts,slots:t,edges:r.edges}),jsx(ContactShadows,{position:[c.target[0],s,c.target[2]],opacity:i.shadowOpacity,scale:Math.max(c.radius*4,2),resolution:1024,blur:2,far:1.5}),jsx(Z,{geometry:e,camera:o,interactive:n,handle:f})]}),l?jsx(B,{handle:f,labels:l}):null]})}function Te(r){let{target:e,radius:t}=r,o=useRef(null),n=useThree(i=>i.invalidate),a=Math.max(t*1.5,1);return useLayoutEffect(()=>{let i=o.current;if(!i)return;let c=new v.Vector3(...r.position).normalize();i.position.set(...e).add(c.multiplyScalar(a*2)),i.target.position.set(...e),i.target.updateMatrixWorld();let s=i.shadow.camera;s.left=-a,s.right=a,s.top=a,s.bottom=-a,s.near=.1,s.far=a*4,s.updateProjectionMatrix(),i.shadow.needsUpdate=true,n();},[r.position,e,a,n]),jsx("directionalLight",{ref:o,color:r.color,intensity:r.intensity,castShadow:true,"shadow-mapSize":[2048,2048],"shadow-bias":-8e-4,"shadow-normalBias":.04,"shadow-radius":4})}function we(r){let e=Q(r.slots);return jsx(Fragment,{children:r.parts.map(t=>{let o$1=e[t.slot];if(!o$1)return null;if(t.type!=="model"||!t.model)return jsx(oe,{part:t,material:o$1,edges:r.edges},t.key);let n=jsx(oe,{part:t,material:o$1});return jsx(o,{fallback:n,children:jsx(Suspense,{fallback:n,children:jsx(Ce,{part:{...t,model:t.model},material:o$1})})},`${t.key}:${t.model}`)})})}function oe(r){let{part:e$1,material:t,edges:o}=r,n=useRef(null),a=useRef(false),i=useRef(e$1.size),c$1=useThree(g=>g.invalidate),[s,f$1,l]=f(e$1),m=JSON.stringify(e$1.params),h=useMemo(()=>e(e$1,o),[e$1.type,e$1.size[0],e$1.size[1],e$1.size[2],m,o]);return useEffect(()=>()=>h.dispose(),[h]),useLayoutEffect(()=>{let g=n.current;if(g){if(!a.current)g.position.set(s,f$1,l),a.current=true;else {let E=i.current,b=g.scale;b.set(b.x*k(E[0],e$1.size[0]),b.y*k(E[1],e$1.size[1]),b.z*k(E[2],e$1.size[2]));}i.current=e$1.size,c$1();}},[h,e$1.size,s,f$1,l,c$1]),useFrame((g,E)=>{let b=n.current;if(!b)return;let p=1-Math.exp(-E/Me),u=new v.Vector3(s,f$1,l),d=new v.Vector3(1,1,1),S=Math.max(b.position.distanceTo(u),b.scale.distanceTo(d));if(S<xe){S>0&&(b.position.copy(u),b.scale.copy(d));return}b.position.lerp(u,p),b.scale.lerp(d,p),c$1();}),jsx("mesh",{ref:n,geometry:h,material:t,castShadow:c(t),receiveShadow:true})}function k(r,e){return r>0&&e>0?r/e:1}export{st as ConfiguratorScene};
package/dist/index.d.ts CHANGED
@@ -71,6 +71,14 @@ export interface ConfiguratorLabels {
71
71
  sketchUnavailable: string;
72
72
  sceneLoading: string;
73
73
  sceneLabel: string;
74
+ cameraControls: string;
75
+ cameraLeft: string;
76
+ cameraRight: string;
77
+ cameraUp: string;
78
+ cameraDown: string;
79
+ cameraZoomIn: string;
80
+ cameraZoomOut: string;
81
+ cameraReset: string;
74
82
  }
75
83
 
76
84
  export interface ConfigurationChange {