cubefarm 0.3.8 → 0.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cubefarm",
3
- "version": "0.3.8",
3
+ "version": "0.3.10",
4
4
  "description": "A cartoon 3D office where a team of AI coding agents works through your GitHub issues.",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/rapier-sDtDRX5B.js","assets/index-B7sInPPW.js","assets/index-CIr98Zaa.css"])))=>i.map(i=>d[i]);
2
- import{$ as e,$t as t,A as n,At as r,B as i,Bt as a,C as o,Ct as s,D as c,Dt as l,E as u,Et as d,F as f,Ft as p,G as m,Gt as h,H as g,Ht as _,I as v,It as y,J as b,Jt as x,K as S,Kt as C,L as ee,Lt as w,M as T,Mt as E,N as te,Nt as D,O as ne,Ot as O,P as k,Pt as re,Q as ie,Qt as ae,R as oe,Rt as se,S as ce,St as le,T as ue,Tt as de,U as fe,Ut as pe,Vt as me,W as he,Wt as ge,X as _e,Xt as ve,Y as ye,Yt as be,Z as xe,Zt as Se,_ as Ce,_t as we,a as Te,at as Ee,b as De,bt as Oe,c as ke,ct as Ae,d as je,dt as Me,en as A,et as Ne,f as Pe,ft as Fe,g as Ie,gt as Le,h as Re,ht as ze,i as Be,it as Ve,j as He,jt as Ue,k as We,kt as Ge,l as Ke,lt as qe,m as Je,mt as Ye,n as Xe,nt as Ze,o as Qe,ot as $e,p as et,pt as tt,q as nt,qt as rt,r as it,rn as at,rt as ot,s as st,st as j,t as ct,tn as lt,tt as ut,u as dt,ut as ft,v as pt,vt as M,w as mt,wt as ht,x as gt,xt as _t,y as vt,yt,z as bt,zt as xt}from"./index-B7sInPPW.js";import{a as St,i as Ct,n as wt,r as Tt,t as Et}from"./rapier-sDtDRX5B.js";var N=at(lt());function Dt(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function Ot(e){var t=Dt(e,`string`);return typeof t==`symbol`?t:t+``}function kt(e,t,n){return(t=Ot(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function At(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function P(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?At(Object(n),!0).forEach(function(t){kt(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):At(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}var jt=new ve;new pe;var Mt=new A;new be;var Nt=new C,F=new A,I=new ve,Pt=new A,Ft=e=>{let[t,n,r]=e;return new A(t,n,r)},It=({x:e,y:t,z:n,w:r})=>jt.set(e,t,n,r),Lt=e=>{if(Array.isArray(e))return new Ct(e[0],e[1],e[2]);if(typeof e==`number`)return new Ct(e,e,e);{let t=e;return new Ct(t.x,t.y,t.z)}},Rt={fixed:1,dynamic:0,kinematicPosition:2,kinematicVelocity:3},zt=e=>Rt[e],Bt=(e,t)=>{let n=Array.from(e);for(let r=0;r<e.length/3;r++)n[r*3]*=t.x,n[r*3+1]*=t.y,n[r*3+2]*=t.z;return n},Vt=e=>e?e instanceof ve?[e.x,e.y,e.z,e.w]:e instanceof A||e instanceof pe?[e.x,e.y,e.z]:Array.isArray(e)?e:[e]:[0];function L(e){let t=(0,N.useRef)(void 0);return t.current===void 0&&(t.current={value:typeof e==`function`?e():e}),t.current.value}var Ht=e=>{let t=(0,N.useRef)(e),n=(0,N.useRef)(0),r=(0,N.useRef)(0);(0,N.useEffect)(()=>{t.current=e},[e]),(0,N.useEffect)(()=>{let e=()=>{let i=performance.now(),a=i-r.current;n.current=requestAnimationFrame(e),t.current(a/1e3),r.current=i};return n.current=requestAnimationFrame(e),()=>cancelAnimationFrame(n.current)},[])},Ut=({onStep:e,updatePriority:t})=>(E((t,n)=>{e(n)},t),null),Wt=({onStep:e})=>(Ht(t=>{e(t)}),null),Gt=(0,N.memo)(({onStep:e,type:t,updatePriority:n})=>t===`independent`?N.createElement(Wt,{onStep:e}):N.createElement(Ut,{onStep:e,updatePriority:n}));function Kt(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function qt(e,t){if(e==null)return{};var n,r,i=Kt(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var Jt=[`mass`,`linearDamping`,`angularDamping`,`type`,`onCollisionEnter`,`onCollisionExit`,`onIntersectionEnter`,`onIntersectionExit`,`onContactForce`,`children`,`canSleep`,`ccd`,`gravityScale`,`softCcdPrediction`,`ref`],Yt=(e,t,n)=>{let r=t.slice();if(e===`heightfield`){let e=r[3];return e.x*=n.x,e.x*=n.y,e.x*=n.z,r}if(e===`trimesh`||e===`convexHull`)return r[0]=Bt(r[0],n),r;let i=[n.x,n.y,n.z,n.x,n.x];return r.map((e,t)=>i[t]*e)},Xt=(e,t,n,r)=>{let i=Yt(e.shape,e.args,n),a=Tt[e.shape](...i);return t.createCollider(a,r?.())},Zt=[`shape`,`args`],Qt="Please pick ONLY ONE of the `density`, `mass` and `massProperties` options.",$t=(e,t)=>{if(t.density!==void 0){if(t.mass!==void 0||t.massProperties!==void 0)throw Error(Qt);e.setDensity(t.density);return}if(t.mass!==void 0){if(t.massProperties!==void 0)throw Error(Qt);e.setMass(t.mass);return}t.massProperties!==void 0&&e.setMassProperties(t.massProperties.mass,t.massProperties.centerOfMass,t.massProperties.principalAngularInertia,t.massProperties.angularInertiaLocalFrame)},en={sensor:(e,t)=>{e.setSensor(t)},collisionGroups:(e,t)=>{e.setCollisionGroups(t)},solverGroups:(e,t)=>{e.setSolverGroups(t)},friction:(e,t)=>{e.setFriction(t)},frictionCombineRule:(e,t)=>{e.setFrictionCombineRule(t)},restitution:(e,t)=>{e.setRestitution(t)},restitutionCombineRule:(e,t)=>{e.setRestitutionCombineRule(t)},activeCollisionTypes:(e,t)=>{e.setActiveCollisionTypes(t)},contactSkin:(e,t)=>{e.setContactSkin(t)},quaternion:()=>{},position:()=>{},rotation:()=>{},scale:()=>{}},tn=Object.keys(en),nn=(e,t,n)=>{let r=n.get(e.handle);if(r){let n=r.object.parent.getWorldScale(Mt),i=r.worldParent?.matrixWorld.clone().invert();r.object.updateWorldMatrix(!0,!1),Nt.copy(r.object.matrixWorld),i&&Nt.premultiply(i),Nt.decompose(F,I,Pt),e.parent()?(e.setTranslationWrtParent({x:F.x*n.x,y:F.y*n.y,z:F.z*n.z}),e.setRotationWrtParent(I)):(e.setTranslation({x:F.x*n.x,y:F.y*n.y,z:F.z*n.z}),e.setRotation(I)),tn.forEach(n=>{if(n in t){let r=t[n];en[n](e,r,t)}}),$t(e,t)}},rn=(e,t,n)=>{let r=(0,N.useMemo)(()=>tn.flatMap(e=>Vt(t[e])),[t]);(0,N.useEffect)(()=>{nn(e(),t,n)},[...r,e])},an=e=>{let t=!1;return e.traverseAncestors(e=>{e.userData.r3RapierType===`MeshCollider`&&(t=!0)}),t},on=(e,t,n)=>({collider:e,worldParent:n||void 0,object:t}),sn={cuboid:`cuboid`,ball:`ball`,hull:`convexHull`,trimesh:`trimesh`},cn=({object:e,ignoreMeshColliders:t=!0,options:n})=>{let r=[];e.updateWorldMatrix(!0,!1);let i=e.matrixWorld.clone().invert(),a=e=>{if(`isMesh`in e){if(t&&an(e))return;let a=e.getWorldScale(Pt),o=sn[n.colliders||`cuboid`];e.updateWorldMatrix(!0,!1),Nt.copy(e.matrixWorld).premultiply(i).decompose(F,I,Pt);let s=new pe().setFromQuaternion(I,`XYZ`),{geometry:c}=e,{args:l,offset:u}=ln(c,n.colliders||`cuboid`),d=P(P({},fn(n)),{},{args:l,shape:o,rotation:[s.x,s.y,s.z],position:[F.x+u.x*a.x,F.y+u.y*a.y,F.z+u.z*a.z],scale:[a.x,a.y,a.z]});r.push(d)}};return n.includeInvisible?e.traverse(a):e.traverseVisible(a),r},ln=(e,t)=>{switch(t){case`cuboid`:{e.computeBoundingBox();let{boundingBox:t}=e,n=t.getSize(new A);return{args:[n.x/2,n.y/2,n.z/2],offset:t.getCenter(new A)}}case`ball`:{e.computeBoundingSphere();let{boundingSphere:t}=e;return{args:[t.radius],offset:t.center}}case`trimesh`:{let t=e.index?e.clone():Ue(e);return{args:[t.attributes.position.array,t.index?.array],offset:new A}}case`hull`:return{args:[e.clone().attributes.position.array],offset:new A}}return{args:[],offset:new A}},un=e=>({collision:!!(e!=null&&e.onCollisionEnter||e!=null&&e.onCollisionExit||e!=null&&e.onIntersectionEnter||e!=null&&e.onIntersectionExit),contactForce:!!(e!=null&&e.onContactForce)}),dn=(e,t,n,r={})=>{let{onCollisionEnter:i,onCollisionExit:a,onIntersectionEnter:o,onIntersectionExit:s,onContactForce:c}=t;(0,N.useEffect)(()=>{let l=e();if(l){let{collision:e,contactForce:u}=un(t),d=e||r.collision,f=u||r.contactForce;d&&f?l.setActiveEvents(Et.COLLISION_EVENTS|Et.CONTACT_FORCE_EVENTS):d?l.setActiveEvents(Et.COLLISION_EVENTS):f&&l.setActiveEvents(Et.CONTACT_FORCE_EVENTS),n.set(l.handle,{onCollisionEnter:i,onCollisionExit:a,onIntersectionEnter:o,onIntersectionExit:s,onContactForce:c})}return()=>{l&&n.delete(l.handle)}},[i,a,o,s,c,r])},fn=(e={})=>qt(e,Jt),pn=e=>{let t=(0,N.useRef)(e);return(0,N.useEffect)(()=>{t.current=e},[e]),t},R=()=>{let e=(0,N.useContext)(yn);if(!e)throw Error(`react-three-rapier: useRapier must be used within <Physics />!`);return e},mn=e=>{let{beforeStepCallbacks:t}=R(),n=pn(e);(0,N.useEffect)(()=>(t.add(n),()=>{t.delete(n)}),[])},hn=e=>{let{afterStepCallbacks:t}=R(),n=pn(e);(0,N.useEffect)(()=>(t.add(n),()=>{t.delete(n)}),[])},gn=(e,t,n=!0)=>{let[r,i]=(0,N.useState)([]);return(0,N.useEffect)(()=>{e.current&&t.colliders!==!1&&i(cn({object:e.current,options:t,ignoreMeshColliders:n}))},[t.colliders]),r},_n=(0,N.memo)(()=>{let{world:e}=R(),t=(0,N.useRef)(null);return E(()=>{let n=t.current;if(!n)return;let r=e.debugRender(),i=new w;i.setAttribute(`position`,new y(r.vertices,3)),i.setAttribute(`color`,new y(r.colors,4)),n.geometry.dispose(),n.geometry=i}),N.createElement(`group`,null,N.createElement(`lineSegments`,{ref:t,frustumCulled:!1},N.createElement(`lineBasicMaterial`,{color:16777215,vertexColors:!0}),N.createElement(`bufferGeometry`,null)))}),vn=e=>{let t;return{proxy:new Proxy({},{get(n,r){return t||=e(),Reflect.get(t,r)},set(n,r,i){return t||=e(),Reflect.set(t,r,i)}}),reset:()=>{t=void 0},set:e=>{t=e}}},yn=(0,N.createContext)(void 0),bn=(e,t)=>({target:{rigidBody:e.rigidBody.object,collider:e.collider.object,colliderObject:e.collider.state?.object,rigidBodyObject:e.rigidBody.state?.object},other:{rigidBody:t.rigidBody.object,collider:t.collider.object,colliderObject:t.collider.state?.object,rigidBodyObject:t.rigidBody.state?.object},rigidBody:t.rigidBody.object,collider:t.collider.object,colliderObject:t.collider.state?.object,rigidBodyObject:t.rigidBody.state?.object}),xn=async()=>{let e=await Ge(()=>import(`./rapier-sDtDRX5B.js`).then(e=>e.o),__vite__mapDeps([0,1,2]));return await e.init(),e},Sn=e=>{let{colliders:t=`cuboid`,children:n,timeStep:r=1/60,paused:i=!1,interpolate:a=!0,updatePriority:o,updateLoop:s=`follow`,debug:c=!1,gravity:l=[0,-9.81,0],allowedLinearError:u=.001,predictionDistance:d=.002,numSolverIterations:f=4,numInternalPgsIterations:p=1,minIslandSize:m=128,maxCcdSubsteps:g=1,contactNaturalFrequency:_=30,lengthUnit:v=1}=e,y=re(xn,[`@react-thee/rapier`,xn]),{invalidate:b}=D(),x=L(()=>new Map),S=L(()=>new Map),C=L(()=>new Map),ee=L(()=>new Map),w=L(()=>new wt(!1)),T=L(()=>new Set),E=L(()=>new Set),te=L(()=>({filterContactPair:(...e)=>{for(let t of T){let n=t.current(...e);if(n!==null)return n}return null},filterIntersectionPair:(...e)=>{for(let t of E)if(t.current(...e)===!1)return!1;return!0}})),ne=L(()=>new Set),O=L(()=>new Set),{proxy:k,reset:ie,set:ae}=L(()=>vn(()=>new y.World(Ft(l))));(0,N.useEffect)(()=>()=>{k.free(),ie()},[]),(0,N.useEffect)(()=>{k.gravity=Lt(l),k.integrationParameters.numSolverIterations=f,k.integrationParameters.numInternalPgsIterations=p,k.integrationParameters.normalizedAllowedLinearError=u,k.integrationParameters.minIslandSize=m,k.integrationParameters.maxCcdSubsteps=g,k.integrationParameters.normalizedPredictionDistance=d,k.lengthUnit=v,k.integrationParameters.contact_natural_frequency=_},[k,...l,f,p,u,m,g,d,v,_]);let oe=(0,N.useCallback)(e=>{let t=k.getCollider(e),n=ee.get(e),r=S.get(e),i=t?.parent()?.handle,a=i===void 0?void 0:k.getRigidBody(i),o=a&&i!==void 0?C.get(i):void 0,s=i===void 0?void 0:x.get(i);return{collider:{object:t,events:n,state:r},rigidBody:{object:a,events:o,state:s}}},[]),[se]=(0,N.useState)({previousState:{},accumulator:0}),ce=(0,N.useCallback)(e=>{let t=k,n=r===`vary`,o=h.clamp(e,0,.5),s=e=>{ne.forEach(e=>{e.current(t)}),t.timestep=e;let n=T.size>0||E.size>0;t.step(w,n?te:void 0),O.forEach(e=>{e.current(t)})};if(n)s(o);else for(se.accumulator+=o;se.accumulator>=r;)a&&(se.previousState={},t.forEachRigidBody(e=>{se.previousState[e.handle]={position:e.translation(),rotation:e.rotation()}})),s(r),se.accumulator-=r;let c=n||!a||i?1:se.accumulator/r;x.forEach((e,n)=>{let r=t.getRigidBody(n),i=C.get(n);if(i!=null&&i.onSleep||i!=null&&i.onWake){if(r.isSleeping()&&!e.isSleeping){var a;i==null||(a=i.onSleep)==null||a.call(i)}if(!r.isSleeping()&&e.isSleeping){var o;i==null||(o=i.onWake)==null||o.call(i)}e.isSleeping=r.isSleeping()}if(!r||r.isSleeping()&&!(`isInstancedMesh`in e.object)||!e.setMatrix)return;let s=r.translation(),l=r.rotation(),u=se.previousState[n];u&&(Nt.compose(u.position,It(u.rotation),e.scale).premultiply(e.invertedWorldMatrix).decompose(F,I,Pt),e.meshType==`mesh`&&(e.object.position.copy(F),e.object.quaternion.copy(I))),Nt.compose(s,It(l),e.scale).premultiply(e.invertedWorldMatrix).decompose(F,I,Pt),e.meshType==`instancedMesh`?e.setMatrix(Nt):(e.object.position.lerp(F,c),e.object.quaternion.slerp(I,c))}),w.drainCollisionEvents((e,n,r)=>{let i=oe(e),a=oe(n);if(!(i!=null&&i.collider.object)||!(a!=null&&a.collider.object))return;let o=bn(i,a),s=bn(a,i);if(r)t.contactPair(i.collider.object,a.collider.object,(e,t)=>{var n,r,c,l,u,d,f,p;(n=i.rigidBody.events)==null||(r=n.onCollisionEnter)==null||r.call(n,P(P({},o),{},{manifold:e,flipped:t})),(c=a.rigidBody.events)==null||(l=c.onCollisionEnter)==null||l.call(c,P(P({},s),{},{manifold:e,flipped:t})),(u=i.collider.events)==null||(d=u.onCollisionEnter)==null||d.call(u,P(P({},o),{},{manifold:e,flipped:t})),(f=a.collider.events)==null||(p=f.onCollisionEnter)==null||p.call(f,P(P({},s),{},{manifold:e,flipped:t}))});else{var c,l,u,d,f,p,m,h;(c=i.rigidBody.events)==null||(l=c.onCollisionExit)==null||l.call(c,o),(u=a.rigidBody.events)==null||(d=u.onCollisionExit)==null||d.call(u,s),(f=i.collider.events)==null||(p=f.onCollisionExit)==null||p.call(f,o),(m=a.collider.events)==null||(h=m.onCollisionExit)==null||h.call(m,s)}if(r){if(t.intersectionPair(i.collider.object,a.collider.object)){var g,_,v,y,b,x,S,C;(g=i.rigidBody.events)==null||(_=g.onIntersectionEnter)==null||_.call(g,o),(v=a.rigidBody.events)==null||(y=v.onIntersectionEnter)==null||y.call(v,s),(b=i.collider.events)==null||(x=b.onIntersectionEnter)==null||x.call(b,o),(S=a.collider.events)==null||(C=S.onIntersectionEnter)==null||C.call(S,s)}}else{var ee,w,T,E,te,D,ne,O;(ee=i.rigidBody.events)==null||(w=ee.onIntersectionExit)==null||w.call(ee,o),(T=a.rigidBody.events)==null||(E=T.onIntersectionExit)==null||E.call(T,s),(te=i.collider.events)==null||(D=te.onIntersectionExit)==null||D.call(te,o),(ne=a.collider.events)==null||(O=ne.onIntersectionExit)==null||O.call(ne,s)}}),w.drainContactForceEvents(e=>{var t,n,r,i,a,o,s,c;let l=oe(e.collider1()),u=oe(e.collider2());if(!(l!=null&&l.collider.object)||!(u!=null&&u.collider.object))return;let d=bn(l,u),f=bn(u,l);(t=l.rigidBody.events)==null||(n=t.onContactForce)==null||n.call(t,P(P({},d),{},{totalForce:e.totalForce(),totalForceMagnitude:e.totalForceMagnitude(),maxForceDirection:e.maxForceDirection(),maxForceMagnitude:e.maxForceMagnitude()})),(r=u.rigidBody.events)==null||(i=r.onContactForce)==null||i.call(r,P(P({},f),{},{totalForce:e.totalForce(),totalForceMagnitude:e.totalForceMagnitude(),maxForceDirection:e.maxForceDirection(),maxForceMagnitude:e.maxForceMagnitude()})),(a=l.collider.events)==null||(o=a.onContactForce)==null||o.call(a,P(P({},d),{},{totalForce:e.totalForce(),totalForceMagnitude:e.totalForceMagnitude(),maxForceDirection:e.maxForceDirection(),maxForceMagnitude:e.maxForceMagnitude()})),(s=u.collider.events)==null||(c=s.onContactForce)==null||c.call(s,P(P({},f),{},{totalForce:e.totalForce(),totalForceMagnitude:e.totalForceMagnitude(),maxForceDirection:e.maxForceDirection(),maxForceMagnitude:e.maxForceMagnitude()}))}),t.forEachActiveRigidBody(()=>{b()})},[i,r,a,k]),le=(0,N.useMemo)(()=>({rapier:y,world:k,setWorld:e=>{ae(e)},physicsOptions:{colliders:t,gravity:l},rigidBodyStates:x,colliderStates:S,rigidBodyEvents:C,colliderEvents:ee,beforeStepCallbacks:ne,afterStepCallbacks:O,isPaused:i,isDebug:c,step:ce,filterContactPairHooks:T,filterIntersectionPairHooks:E}),[i,ce,c,t,l]),ue=(0,N.useCallback)(e=>{i||ce(e)},[i,ce]);return N.createElement(yn.Provider,{value:le},N.createElement(Gt,{onStep:ue,type:s,updatePriority:o}),c&&N.createElement(_n,null),n)};function z(){return z=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},z.apply(null,arguments)}var Cn=(e,t=null)=>{let n=(0,N.useRef)(t);return e&&typeof e!=`function`?(e.current||=n.current,e):n},wn=(e,t,n)=>{let r=(0,N.useRef)(void 0),i=(0,N.useCallback)(()=>(r.current||=e(),r.current),n);return(0,N.useEffect)(()=>{let e=i(),n=()=>t(e);return()=>{n(),r.current=void 0}},[i]),i},Tn=e=>{let t=zt(e?.type||`dynamic`),n=new St(t);return n.canSleep=e?.canSleep??!0,n},En=({rigidBody:e,object:t,setMatrix:n,getMatrix:r,worldScale:i,meshType:a=`mesh`})=>(t.updateWorldMatrix(!0,!1),{object:t,rigidBody:e,invertedWorldMatrix:t.parent.matrixWorld.clone().invert(),setMatrix:n||(e=>{t.matrix.copy(e)}),getMatrix:r||(e=>e.copy(t.matrix)),scale:i||t.getWorldScale(Pt).clone(),isSleeping:!1,meshType:a}),Dn=[`args`,`colliders`,`canSleep`],On={gravityScale:(e,t)=>{e.setGravityScale(t,!0)},additionalSolverIterations(e,t){e.setAdditionalSolverIterations(t)},linearDamping:(e,t)=>{e.setLinearDamping(t)},angularDamping:(e,t)=>{e.setAngularDamping(t)},dominanceGroup:(e,t)=>{e.setDominanceGroup(t)},enabledRotations:(e,[t,n,r])=>{e.setEnabledRotations(t,n,r,!0)},enabledTranslations:(e,[t,n,r])=>{e.setEnabledTranslations(t,n,r,!0)},lockRotations:(e,t)=>{e.lockRotations(t,!0)},lockTranslations:(e,t)=>{e.lockTranslations(t,!0)},angularVelocity:(e,[t,n,r])=>{e.setAngvel({x:t,y:n,z:r},!0)},linearVelocity:(e,[t,n,r])=>{e.setLinvel({x:t,y:n,z:r},!0)},ccd:(e,t)=>{e.enableCcd(t)},softCcdPrediction:(e,t)=>{e.setSoftCcdPrediction(t)},userData:(e,t)=>{e.userData=t},type(e,t){e.setBodyType(zt(t),!0)},position:()=>{},rotation:()=>{},quaternion:()=>{},scale:()=>{}},kn=Object.keys(On),An=(e,t,n,r=!0)=>{if(!e)return;let i=n.get(e.handle);i&&(r&&(i.object.updateWorldMatrix(!0,!1),Nt.copy(i.object.matrixWorld).decompose(F,I,Pt),e.setTranslation(F,!1),e.setRotation(I,!1)),kn.forEach(n=>{n in t&&On[n](e,t[n])}))},jn=(e,t,n,r=!0)=>{let i=(0,N.useMemo)(()=>kn.flatMap(e=>Vt(t[e])),[t]);(0,N.useEffect)(()=>{An(e(),t,n,r)},i)},Mn=(e,t,n)=>{let{onWake:r,onSleep:i,onCollisionEnter:a,onCollisionExit:o,onIntersectionEnter:s,onIntersectionExit:c,onContactForce:l}=t,u={onWake:r,onSleep:i,onCollisionEnter:a,onCollisionExit:o,onIntersectionEnter:s,onIntersectionExit:c,onContactForce:l};(0,N.useEffect)(()=>{let t=e();return n.set(t.handle,u),()=>{n.delete(t.handle)}},[r,i,a,o,s,c,l])},Nn=({x:e,y:t,z:n}={x:0,y:0,z:0})=>new A(e,t,n),B=(0,N.memo)(e=>{let{children:t,position:n,rotation:r,quaternion:i,scale:a,name:o}=e,{world:s,colliderEvents:c,colliderStates:l}=R(),u=Gn(),d=Cn(e.ref),f=(0,N.useRef)(null),p=wn(()=>{let t=f.current.getWorldScale(Nn()),n=Xt(e,s,t,u?.getRigidBody);return typeof e.ref==`function`&&e.ref(n),d.current=n,n},e=>{s.getCollider(e.handle)&&s.removeCollider(e,!0)},[...Zt.flatMap(t=>Array.isArray(e[t])?e[t]:[e[t]]),u]);(0,N.useEffect)(()=>{let e=p();return l.set(e.handle,on(e,f.current,u?.ref.current)),()=>{l.delete(e.handle)}},[p]);let m=(0,N.useMemo)(()=>P(P({},fn(u?.options)),e),[e,u?.options]);return rn(p,m,l),dn(p,m,c,un(u?.options)),N.createElement(`object3D`,{position:n,rotation:r,quaternion:i,scale:a,ref:f,name:o},t)}),V=N.forwardRef((e,t)=>N.createElement(B,z({},e,{shape:`cuboid`,ref:t})));V.displayName=`CuboidCollider`;var Pn=N.forwardRef((e,t)=>N.createElement(B,z({},e,{shape:`roundCuboid`,ref:t})));Pn.displayName=`RoundCuboidCollider`;var Fn=N.forwardRef((e,t)=>N.createElement(B,z({},e,{shape:`ball`,ref:t})));Fn.displayName=`BallCollider`;var In=N.forwardRef((e,t)=>N.createElement(B,z({},e,{shape:`capsule`,ref:t})));In.displayName=`CapsuleCollider`;var Ln=N.forwardRef((e,t)=>N.createElement(B,z({},e,{shape:`heightfield`,ref:t})));Ln.displayName=`HeightfieldCollider`;var Rn=N.forwardRef((e,t)=>N.createElement(B,z({},e,{shape:`trimesh`,ref:t})));Rn.displayName=`TrimeshCollider`;var zn=N.forwardRef((e,t)=>N.createElement(B,z({},e,{shape:`cone`,ref:t})));zn.displayName=`ConeCollider`;var Bn=N.forwardRef((e,t)=>N.createElement(B,z({},e,{shape:`roundCone`,ref:t})));Bn.displayName=`RoundConeCollider`;var Vn=N.forwardRef((e,t)=>N.createElement(B,z({},e,{shape:`cylinder`,ref:t})));Vn.displayName=`CylinderCollider`,Vn.displayName=`RoundCylinderCollider`;var Hn=N.forwardRef((e,t)=>N.createElement(B,z({},e,{shape:`convexHull`,ref:t})));Hn.displayName=`ConvexHullCollider`;var Un=[`ref`,`children`,`type`,`position`,`rotation`,`scale`,`quaternion`,`transformState`],Wn=(0,N.createContext)(void 0),Gn=()=>(0,N.useContext)(Wn),H=(0,N.memo)(e=>{let{ref:t,children:n,type:r,position:i,rotation:a,scale:o,quaternion:s,transformState:c}=e,l=qt(e,Un),u=(0,N.useRef)(null),d=Cn(t),{world:f,rigidBodyStates:p,physicsOptions:m,rigidBodyEvents:h}=R(),g=(0,N.useMemo)(()=>P(P(P({},m),e),{},{children:void 0}),[m,e]),_=Dn.flatMap(e=>Array.isArray(g[e])?[...g[e]]:g[e]),v=gn(u,g),y=wn(()=>{let e=Tn(g),n=f.createRigidBody(e);return typeof t==`function`&&t(n),d.current=n,n},e=>{f.getRigidBody(e.handle)&&f.removeRigidBody(e)},_);(0,N.useEffect)(()=>{let t=y(),n=En({rigidBody:t,object:u.current});return p.set(t.handle,e.transformState?e.transformState(n):n),()=>{p.delete(t.handle)}},[y]),jn(y,g,p),Mn(y,g,h);let b=(0,N.useMemo)(()=>({ref:u,getRigidBody:y,options:g}),[y]);return N.createElement(Wn.Provider,{value:b},N.createElement(`object3D`,z({ref:u},l,{position:i,rotation:a,quaternion:s,scale:o}),n,v.map((e,t)=>N.createElement(B,z({key:t},e)))))});H.displayName=`RigidBody`;var Kn=(0,N.memo)(e=>{let{children:t,type:n}=e,{physicsOptions:r}=R(),i=(0,N.useRef)(null),{options:a}=Gn(),o=gn(i,(0,N.useMemo)(()=>P(P(P({},r),a),{},{children:void 0,colliders:n}),[r,a]),!1);return N.createElement(`object3D`,{ref:i,userData:{r3RapierType:`MeshCollider`}},t,o.map((e,t)=>N.createElement(B,z({key:t},e))))});Kn.displayName=`MeshCollider`;var qn=[`ref`],Jn=[`children`,`instances`,`colliderNodes`,`position`,`rotation`,`quaternion`,`scale`],Yn=(0,N.memo)(e=>{let{ref:t}=e,n=qt(e,qn),r=Cn(t,[]),i=(0,N.useRef)(null),a=(0,N.useRef)(null),{children:o,instances:s,colliderNodes:c=[],position:l,rotation:u,quaternion:d,scale:f}=n,p=qt(n,Jn),m=gn(i,P(P({},n),{},{children:void 0})),h=()=>{let e=a.current.children[0];if(e&&`isInstancedMesh`in e)return e};(0,N.useEffect)(()=>{let e=h();e?e.instanceMatrix.setUsage(_):console.warn(`InstancedRigidBodies expects exactly one child, which must be an InstancedMesh`)},[]);let g=(e,t)=>{let n=h();return n?P(P({},e),{},{getMatrix:e=>(n.getMatrixAt(t,e),e),setMatrix:e=>{n.setMatrixAt(t,e),n.instanceMatrix.needsUpdate=!0},meshType:`instancedMesh`}):e};return N.createElement(`object3D`,z({ref:i},p,{position:l,rotation:u,quaternion:d,scale:f}),N.createElement(`object3D`,{ref:a},o),s?.map((e,t)=>N.createElement(H,z({},p,e,{ref:e=>{r.current[t]=e},transformState:e=>g(e,t)}),N.createElement(N.Fragment,null,c.map((e,t)=>N.createElement(N.Fragment,{key:t},e)),m.map((e,t)=>N.createElement(B,z({key:t},e)))))))});Yn.displayName=`InstancedRigidBodies`;var Xn=(e,t)=>(Zn(e)<<16)+(t===void 0?65535:Zn(t)),Zn=e=>[e].flat().reduce((e,t)=>e|1<<t,0),U={standoff:.32,board:{w:1.2,h:.62,t:.05,bottom:2.56},square:{w:.48,h:.36},rim:{y:2.7,r:.23,tube:.018,gap:.15},net:{h:.42,bottomR:.14},score:{w:1.24,h:.36,bottom:3.2},bounce:{board:.6,rim:.45},ball:{r:.12,restitution:.75,density:60,damping:.5,throwSpeed:9.5}},Qn={office:10.5,lobby:-9},$n=U.standoff+U.board.t+U.rim.gap+U.rim.r,er=24;function tr(){let{standoff:e,board:t,rim:n,score:r,bounce:i}=U,a=e+t.t,o=r.bottom+r.h;return[{box:[Math.max(t.w,r.w)/2,(o-t.bottom)/2,a/2],at:[0,(t.bottom+o)/2,-a/2],restitution:i.board,friction:.5},{box:[.07,.013,n.gap/2],at:[0,n.y,-(a+n.gap/2)],restitution:i.rim,friction:.5},...Array.from({length:er},(e,t)=>{let r=t/er*Math.PI*2;return{ball:n.tube+.004,at:[Math.cos(r)*n.r,n.y,-$n+Math.sin(r)*n.r],restitution:i.rim,friction:.4}})]}var nr=e=>({x:Qn[e],y:U.rim.y,z:12-$n,r:U.rim.r}),rr=e=>({x:Qn[e],y:U.rim.y+U.square.h/2,z:12-U.standoff-U.board.t}),ir=()=>({prev:null,armed:!0}),ar=1.5;function or(e,t,n){let r=(e.y-n.y)/(e.y-t.y),i=e.x+(t.x-e.x)*r,a=e.z+(t.z-e.z)*r;return Math.hypot(i-n.x,a-n.z)<n.r}function sr(e,t,n){let r=e.prev;if(e.prev={x:t.x,y:t.y,z:t.z},!r)return!1;if(Math.hypot(t.x-r.x,t.y-r.y,t.z-r.z)>ar)return e.armed=!0,!1;let i=r.y>n.y&&t.y<=n.y,a=r.y<=n.y&&t.y>n.y;if((i||a)&&or(r,t,n)){let t=i&&e.armed;return e.armed=!1,t}return!e.armed&&Math.hypot(t.x-n.x,t.z-n.z)>n.r&&(e.armed=!0),!1}var W=p(),cr=`#1f1d2b`,lr=`#ff7b00`,ur=`#e63946`,dr=`cubefarm:hoop-best`,fr=new Map;function pr(){try{let e=JSON.parse(localStorage.getItem(dr)??`{}`);return e&&typeof e==`object`?e:{}}catch{return{}}}function mr(e){let t=Number(pr()[e]);return Number.isFinite(t)&&t>0?Math.floor(t):0}function hr(e,t){try{localStorage.setItem(dr,JSON.stringify({...pr(),[e]:t}))}catch{}}function gr(e,t,n,{score:r,best:i}){Ee(e,0,0,t,n,22),e.fillStyle=`#15151f`,e.fill();let a=`Score ${r} · Best ${i}`,o=88;for(e.font=`700 ${o}px ${ot}`;o>30&&e.measureText(a).width>t-48;)o-=4,e.font=`700 ${o}px ${ot}`;e.textAlign=`center`,e.textBaseline=`middle`,e.fillStyle=`#ffd166`,e.fillText(a,t/2,n/2+4),e.textAlign=`left`}function _r({r:e}){let t=j(cr),n=e*.05;return(0,W.jsxs)(`group`,{children:[(0,W.jsxs)(`mesh`,{castShadow:!0,material:j(`#f3722c`),children:[(0,W.jsx)(`sphereGeometry`,{args:[e,24,16]}),(0,W.jsx)(r,{thickness:.012,color:cr})]}),(0,W.jsx)(`mesh`,{rotation:[Math.PI/2,0,0],material:t,children:(0,W.jsx)(`torusGeometry`,{args:[e*1.004,n,6,40]})}),(0,W.jsx)(`mesh`,{material:t,children:(0,W.jsx)(`torusGeometry`,{args:[e*1.004,n,6,40]})}),[-1,1].map(r=>(0,W.jsx)(`mesh`,{position:[r*e*.6,0,0],rotation:[0,Math.PI/2,0],material:t,children:(0,W.jsx)(`torusGeometry`,{args:[e*.8*1.006,n,6,32]})},r))]})}var vr=null;function yr(){if(vr)return vr;let e=document.createElement(`canvas`);e.width=e.height=64;let n=e.getContext(`2d`);n.strokeStyle=`#ffffff`,n.lineWidth=7,n.beginPath(),n.moveTo(0,0),n.lineTo(64,64),n.moveTo(64,0),n.lineTo(0,64),n.stroke();let r=new se(e);return r.colorSpace=t,r.wrapS=r.wrapT=ae,r.repeat.set(12,3),vr=new rt({map:r,color:`#f1f3f5`,alphaTest:.5,side:2}),vr}var br=e=>e.current<0?1/0:(performance.now()-e.current)/1e3;function xr({burst:e}){let t=(0,N.useRef)(null);E(()=>{let n=t.current;if(!n)return;let r=br(e);if(r>2.5){n.scale.y!==1&&(n.scale.set(1,1,1),n.rotation.set(0,0,0));return}let i=Math.exp(-3*r),a=Math.sin(r*12)*i;n.scale.set(1-.16*a,1+.4*a,1-.16*a),n.rotation.set(.2*i*Math.sin(r*9),0,.12*i*Math.sin(r*7))});let{h:n,bottomR:r}=U.net;return(0,W.jsx)(`group`,{ref:t,position:[0,U.rim.y,-$n],children:(0,W.jsx)(`mesh`,{position:[0,-n/2,0],material:yr(),children:(0,W.jsx)(`cylinderGeometry`,{args:[U.rim.r,r,n,24,1,!0]})})})}var Sr=42,Cr=1.8,wr=[`#ef476f`,`#ffd166`,`#06d6a0`,`#118ab2`,`#ff9f1c`,`#9b5de5`];function Tr({burst:e}){let t=(0,N.useRef)(null),n=(0,N.useMemo)(()=>Array.from({length:Sr},()=>({v:new A,spin:new A})),[]),r=(0,N.useMemo)(()=>new be,[]),i=(0,N.useRef)(-1);return(0,N.useLayoutEffect)(()=>{let e=t.current;if(!e)return;let n=new xt;for(let t=0;t<Sr;t++)e.setColorAt(t,n.set(wr[t%wr.length]));e.instanceColor&&(e.instanceColor.needsUpdate=!0)},[]),E(()=>{let a=t.current;if(!a)return;let o=br(e);if(o>Cr){a.visible&&=!1;return}if(i.current!==e.current){i.current=e.current;for(let e of n){let t=Math.random()*Math.PI*2,n=.6+Math.random()*1.6;e.v.set(Math.cos(t)*n,1.2+Math.random()*2,Math.sin(t)*n-.8),e.spin.set(Math.random()*12,Math.random()*12,Math.random()*12)}}a.visible=!0;let s=Math.min(1,(Cr-o)/.4);for(let e=0;e<Sr;e++){let t=n[e];r.position.set(t.v.x*o,Math.max(.02-U.rim.y,t.v.y*o-2.2*o*o),t.v.z*o),r.rotation.set(t.spin.x*o,t.spin.y*o,t.spin.z*o),r.scale.setScalar(s),r.updateMatrix(),a.setMatrixAt(e,r.matrix)}a.instanceMatrix.needsUpdate=!0}),(0,W.jsxs)(`instancedMesh`,{ref:t,args:[void 0,void 0,Sr],position:[0,U.rim.y-.05,-$n],visible:!1,frustumCulled:!1,children:[(0,W.jsx)(`planeGeometry`,{args:[.06,.035]}),(0,W.jsx)(`meshBasicMaterial`,{side:2,toneMapped:!1})]})}function Er({tally:e}){let{w:t,h:n,bottom:i}=U.score,a=ut(640,186,t=>gr(t,640,186,e),[e.score,e.best]);return(0,W.jsxs)(`group`,{position:[0,i+n/2,-(U.standoff+U.board.t/2)],children:[(0,W.jsxs)(`mesh`,{material:j(`#2b2d42`),children:[(0,W.jsx)(`boxGeometry`,{args:[t,n,.06]}),(0,W.jsx)(r,{thickness:.015,color:cr})]}),(0,W.jsxs)(`mesh`,{position:[0,0,-.031],rotation:[0,Math.PI,0],children:[(0,W.jsx)(`planeGeometry`,{args:[t-.05,n-.05]}),(0,W.jsx)(`meshBasicMaterial`,{map:a,toneMapped:!1})]})]})}var Dr=(0,N.memo)(function(){let{standoff:e,board:t,square:n,rim:i}=U,a=-(e+t.t)-.003,o=.035,s={cy:i.y+n.h/2,w:n.w,h:n.h};return(0,W.jsxs)(`group`,{children:[[-.4,.4].flatMap(t=>[2.72,3.05].map(n=>(0,W.jsx)(`mesh`,{position:[t,n,-e/2],material:j(`#8d99ae`),children:(0,W.jsx)(`boxGeometry`,{args:[.05,.05,e]})},`${t}${n}`))),(0,W.jsxs)(`mesh`,{position:[0,t.bottom+t.h/2,-(e+t.t/2)],material:j(`#fdfdfd`),castShadow:!0,children:[(0,W.jsx)(`boxGeometry`,{args:[t.w,t.h,t.t]}),(0,W.jsx)(r,{thickness:.015,color:cr})]}),[[0,t.bottom+t.h-o/2,t.w-.04,o],[0,t.bottom+o/2,t.w-.04,o],[-(t.w/2-.02-o/2),t.bottom+t.h/2,o,t.h-.04],[t.w/2-.02-o/2,t.bottom+t.h/2,o,t.h-.04],[0,s.cy+s.h/2-o/2,s.w,o],[0,s.cy-s.h/2+o/2,s.w,o],[-(s.w/2-o/2),s.cy,o,s.h],[s.w/2-o/2,s.cy,o,s.h]].map(([e,t,n,r],i)=>(0,W.jsx)(`mesh`,{position:[e,t,a],material:j(ur),children:(0,W.jsx)(`boxGeometry`,{args:[n,r,.004]})},i)),(0,W.jsx)(`mesh`,{position:[0,i.y,-(e+t.t+i.gap/2)],material:j(lr),children:(0,W.jsx)(`boxGeometry`,{args:[.14,.025,i.gap+.02]})}),(0,W.jsxs)(`mesh`,{position:[0,i.y,-$n],rotation:[Math.PI/2,0,0],material:j(lr),castShadow:!0,children:[(0,W.jsx)(`torusGeometry`,{args:[i.r,i.tube,8,40]}),(0,W.jsx)(r,{thickness:.008,color:cr})]})]})}),Or=(0,N.memo)(function({groups:e}){return(0,N.useMemo)(tr,[]).map((t,n)=>t.box?(0,W.jsx)(V,{args:t.box,position:t.at,restitution:t.restitution,friction:t.friction,collisionGroups:e},n):(0,W.jsx)(Fn,{args:[t.ball??0],position:t.at,restitution:t.restitution,friction:t.friction,collisionGroups:e},n))}),kr=(0,N.memo)(function({floor:e,groups:t}){let n=(0,N.useMemo)(()=>nr(e),[e]),r=(0,N.useMemo)(()=>{let t=M.getState();return e===`lobby`?`lobby`:we(t.repos,t.floor)?.id??`floor-${t.floor}`},[e]),[i,a]=(0,N.useState)(()=>({score:fr.get(r)??0,best:mr(r)})),o=(0,N.useRef)(i),s=(0,N.useRef)(-1);(0,N.useEffect)(()=>(ce(()=>({...o.current})),()=>ce(null)),[]);let c=(0,N.useCallback)(()=>{let e=o.current,t={score:e.score+1,best:Math.max(e.best,e.score+1)};o.current=t,fr.set(r,t.score),t.best>e.best&&hr(r,t.best),a(t),s.current=performance.now(),l()},[r]),u=(0,N.useRef)(new Map);hn((0,N.useCallback)(e=>{e.bodies.forEach(e=>{if(e.userData?.toy!==`basketball`||e.isSleeping())return;let t=u.current.get(e.handle);t||u.current.set(e.handle,t=ir()),sr(t,e.translation(),n)&&c()})},[c,n]));let d=[Qn[e],0,12];return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(H,{type:`fixed`,colliders:!1,position:d,children:(0,W.jsx)(Or,{groups:t})}),(0,W.jsxs)(`group`,{position:d,children:[(0,W.jsx)(Dr,{}),(0,W.jsx)(xr,{burst:s}),(0,W.jsx)(Tr,{burst:s}),(0,W.jsx)(Er,{tally:i})]})]})}),Ar=`#1f1d2b`,jr={beach:{kind:`beach`,r:.4,restitution:.8,density:1.2,damping:.9},exercise:{kind:`exercise`,r:.45,restitution:.7,density:1.6,damping:.9},yarn:{kind:`yarn`,r:.33,restitution:.35,density:2.5,damping:1.3},basketball:{kind:`basketball`,...U.ball}},Mr=(e,t,n,r)=>({id:e,...jr[t],start:{x:n,y:jr[t].r+.02,z:r}}),Nr=e=>Mr(`basketball`,`basketball`,nr(e).x,nr(e).z-.35),Pr={office:[Mr(`beach-ball`,`beach`,6.6,6.8),Mr(`exercise-ball`,`exercise`,9.8,8.6),Mr(`yarn-ball`,`yarn`,12.2,6.2),Nr(`office`)],lobby:[Mr(`beach-ball`,`beach`,-11,5.6),Mr(`exercise-ball`,`exercise`,-7.6,8.2),Mr(`yarn-ball`,`yarn`,-5.4,4.4),Nr(`lobby`)]},Fr=e=>Math.abs(e.x)>16||Math.abs(e.z)>12||e.y<-.5||e.y>6,Ir=[`#ef476f`,`#ffffff`,`#ffd166`,`#ffffff`,`#118ab2`,`#ffffff`],G=null;function Lr(){if(G)return G;let e=new Uint8Array(Ir.length*10*4);for(let t=0;t<10;t++)for(let n=0;n<Ir.length;n++){let r=parseInt((t===0||t===9?`#ffffff`:Ir[n]).slice(1),16),i=(t*Ir.length+n)*4;e[i]=r>>16&255,e[i+1]=r>>8&255,e[i+2]=r&255,e[i+3]=255}return G=new me(e,Ir.length,10,Se),G.colorSpace=t,G.minFilter=x,G.magFilter=x,G.generateMipmaps=!1,G.needsUpdate=!0,G}var Rr=`#8338ec`,zr=`#ff70a6`,Br=[[0,0,0],[Math.PI/2,0,0],[.6,0,1.1],[-.7,.3,-1],[1.2,.9,.4]];function Vr({def:e}){let{r:t}=e;return e.kind===`basketball`?(0,W.jsx)(_r,{r:t}):e.kind===`beach`?(0,W.jsxs)(`mesh`,{castShadow:!0,material:Ae(`beach-ball`,Lr()),children:[(0,W.jsx)(`sphereGeometry`,{args:[t,24,16]}),(0,W.jsx)(r,{thickness:.02,color:Ar})]}):e.kind===`exercise`?(0,W.jsxs)(`group`,{children:[(0,W.jsxs)(`mesh`,{castShadow:!0,material:j(Rr),children:[(0,W.jsx)(`sphereGeometry`,{args:[t,24,16]}),(0,W.jsx)(r,{thickness:.02,color:Ar})]}),(0,W.jsx)(`mesh`,{rotation:[Math.PI/2,0,0],material:j($e(Rr,-.14)),children:(0,W.jsx)(`torusGeometry`,{args:[t*1.002,.018,6,40]})}),(0,W.jsx)(`mesh`,{position:[0,0,t],rotation:[Math.PI/2,0,0],material:j(`#f8f9fa`),children:(0,W.jsx)(`cylinderGeometry`,{args:[.045,.05,.04,12]})})]}):(0,W.jsxs)(`group`,{children:[(0,W.jsxs)(`mesh`,{castShadow:!0,material:j(zr),children:[(0,W.jsx)(`sphereGeometry`,{args:[t,20,14]}),(0,W.jsx)(r,{thickness:.02,color:Ar})]}),Br.map((e,n)=>(0,W.jsx)(`mesh`,{rotation:e,material:j($e(zr,n%2?-.12:.08)),children:(0,W.jsx)(`torusGeometry`,{args:[t*1.005,.022,6,36]})},n)),(0,W.jsx)(`mesh`,{position:[t*.55,-t*.62,t*.45],rotation:[.4,0,.9],material:j($e(zr,-.12)),children:(0,W.jsx)(`capsuleGeometry`,{args:[.022,.3,3,6]})})]})}var K=`toys`,q=(e,t=.06)=>e*(1-t+Math.random()*t*2),Hr={beach:(e,{gain:t,bright:n})=>{let r=`bounce:beach`;O({name:r,group:K,pos:e,freq:q(340),to:260,type:`triangle`,dur:.08,peak:.09*t,attack:.003}),le({name:r,group:K,pos:e,dur:.05,peak:.05*t,filter:`bandpass`,freq:q(1400+n*1600),q:2.5,attack:.002})},exercise:(e,{gain:t,bright:n})=>{let r=`bounce:exercise`;O({name:r,group:K,pos:e,freq:q(105),to:62,dur:.2,peak:.16*t,attack:.006}),le({name:r,group:K,pos:e,dur:.09,peak:.05*t,freq:220+n*380,q:.8,attack:.004})},yarn:(e,{gain:t,bright:n})=>{let r=`bounce:yarn`;le({name:r,group:K,pos:e,dur:.1,peak:.07*t,freq:q(260+n*260),q:.6,attack:.008}),O({name:r,group:K,pos:e,freq:q(130),to:95,dur:.08,peak:.04*t,attack:.008})},basketball:(e,{gain:t,bright:n})=>{let r=`bounce:basketball`;O({name:r,group:K,pos:e,freq:q(150),to:105,dur:.12,peak:.13*t,attack:.003}),le({name:r,group:K,pos:e,dur:.05,peak:.06*t,filter:`bandpass`,freq:q(700+n*1300),q:1.4,attack:.002}),O({name:r,group:K,pos:e,freq:q(560,.03),to:540,type:`triangle`,dur:.22,peak:.025*t*(.4+n*.6),attack:.004})}},Ur=(e,t,n)=>Hr[e](t,n);function Wr(e,{gain:t,bright:n}){let r=q(620,.04);[1,1.48,2.37].forEach((n,i)=>O({name:`rim`,group:K,pos:e,freq:r*n,type:i?`triangle`:`square`,dur:.32-i*.07,peak:(i?.06:.04)*t,attack:.002})),le({name:`rim`,group:K,pos:e,dur:.04,peak:.07*t,filter:`highpass`,freq:2200+n*2e3,q:.7,attack:.001})}function Gr(e,{gain:t,bright:n}){let r=`backboard`;O({name:r,group:K,pos:e,freq:q(92),to:74,dur:.22,peak:.13*t,attack:.004}),O({name:r,group:K,pos:e,freq:q(230),to:205,type:`triangle`,dur:.14,peak:.04*t,attack:.004}),le({name:r,group:K,pos:e,dur:.07,peak:.06*t,filter:`bandpass`,freq:450+n*500,q:1.3,attack:.002})}var Kr={beach:{freq:1600,peak:.035,q:1.6},exercise:{freq:500,peak:.04,q:.9},yarn:{freq:700,peak:.03,q:.5},basketball:{freq:1100,peak:.035,q:1.2}};function qr(e,t){let n=Kr[e];le({name:`grab:${e}`,group:K,pos:t,dur:.07,peak:n.peak,filter:`bandpass`,freq:q(n.freq),q:n.q,attack:.006})}var Jr=1/60,Yr=`#2b2d42`,Xr=2.8;function Zr({def:e,shadow:t=!0,mag:n}){let{body:r,trim:i}=e;return(0,W.jsxs)(`group`,{children:[(0,W.jsx)(b,{size:[.1,.12,.3],position:[0,.02,-.02],color:r,outline:!0,shadow:t}),(0,W.jsx)(b,{size:[.104,.03,.2],position:[0,-.01,-.04],color:`#ffffff`,shadow:!1}),(0,W.jsx)(b,{size:[.05,.035,.22],position:[0,.095,-.03],color:i,outline:!0,shadow:t}),(0,W.jsx)(ye,{r:.038,h:.14,position:[0,.03,-.23],rotation:[Math.PI/2,0,0],color:i,outline:!0,shadow:t}),(0,W.jsx)(ye,{r:.046,h:.04,position:[0,.03,-.31],rotation:[Math.PI/2,0,0],color:`#ffd166`,outline:!0,shadow:t}),(0,W.jsx)(b,{size:[.11,.07,.08],position:[0,.03,.16],color:i,outline:!0,shadow:t}),(0,W.jsx)(b,{size:[.065,.15,.075],position:[0,-.1,.09],rotation:[.3,0,0],color:Yr,outline:!0,shadow:t}),(0,W.jsx)(b,{size:[.02,.05,.07],position:[0,-.065,.01],color:Yr,shadow:!1}),(0,W.jsx)(`group`,{ref:n,position:[0,-.08,-.1],children:(0,W.jsx)(b,{size:[.055,.12,.08],color:$e(r,-.2),outline:!0,shadow:t})})]})}var J={x:.17,y:-.155,z:-.3,scale:.5},Qr=new A(J.x,J.y+.03*J.scale,J.z-.33*J.scale);function $r({def:e}){let t=(0,N.useRef)(null),n=(0,N.useRef)(null),r=(0,N.useRef)(null);return E(({camera:e})=>{let i=t.current,a=n.current;if(!i||!a)return;i.position.copy(e.position),i.quaternion.copy(e.quaternion);let o=performance.now(),s=(o-je.at)/160,c=s<1?Math.min(1,s*4)*(1-s):0,l=M.getState().held,u=l?.kind===`blaster`?fe(l,o):null,d=u===null?0:Math.sin(u*Math.PI);a.position.set(J.x,J.y-d*.06,J.z+c*.05),a.rotation.set(c*.25+d*.45,0,d*.5),r.current&&(r.current.position.y=-.08-d*.14)}),(0,W.jsx)(`group`,{ref:t,children:(0,W.jsx)(`group`,{ref:n,scale:J.scale,children:(0,W.jsx)(Zr,{def:e,shadow:!1,mag:r})})})}var ei=[1.4,1.06];function ti({x:e,onRack:t}){let n=t[0],r=Ze(n?{id:`toy:rack:${n.id}`,label:`Take a blaster`,action:{kind:`pickup`,toyId:n.id}}:null,Xr),{w:a,d:o,h:s}=qe;return(0,W.jsxs)(`group`,{position:[e,0,12],rotation:[0,Math.PI,0],children:[(0,W.jsxs)(`group`,{ref:r,children:[(0,W.jsx)(b,{size:[a,.8,o],position:[0,.4,o/2],color:`#ffd166`,outline:!0}),(0,W.jsx)(b,{size:[a-.2,.08,.01],position:[0,.62,o+.005],color:`#ff8c1a`,shadow:!1}),(0,W.jsx)(b,{size:[a-.1,s-.85,.04],position:[0,.8+(s-.8)/2,.03],color:`#f4e1c1`,outline:!0}),ei.flatMap(e=>[-.16,.16].map(t=>(0,W.jsx)(ye,{r:.012,h:.1,position:[t,e-.1,.09],rotation:[Math.PI/2,0,0],color:Yr,shadow:!1},`${e}${t}`))),i.map((e,n)=>t.includes(e)?(0,W.jsx)(`group`,{position:[0,ei[n],.13],rotation:[0,Math.PI/2,0],children:(0,W.jsx)(Zr,{def:e})},e.id):null),(0,W.jsx)(b,{size:[.34,.1,.2],position:[.36,.85,.16],color:`#3a86ff`,outline:!0}),[0,1,2,3].map(e=>(0,W.jsxs)(`group`,{position:[.26+e*.065,.92,.16],rotation:[Math.PI/2,0,.2*(e-1.5)],children:[(0,W.jsx)(ye,{r:.02,h:.13,color:e%2?`#ff8c1a`:`#3a86ff`,shadow:!1}),(0,W.jsx)(ye,{r:.026,rTop:.02,h:.025,position:[0,-.075,0],color:`#ffd166`,shadow:!1})]},e))]}),(0,W.jsx)(gt,{position:[0,s-.14,.055],rotationY:0,size:[a-.2,.22],px:[512,96],draw:e=>Ve(e,512,96,[{text:`🎯 FOAM ZONE`,size:54}],`#ef476f`),deps:[]})]})}function ni({def:e,spot:t,groups:n,onLost:r}){let i=Ze({id:`toy:${e.id}`,label:`Pick up blaster`,action:{kind:`pickup`,toyId:e.id}},Xr),a=(0,N.useRef)(null),o=(0,N.useRef)(0),s=(0,N.useRef)({vy:0,landings:0});return hn(()=>{let e=a.current,t=s.current;if(e&&t.landings<Ie.blaster&&!e.isSleeping()){let n=e.linvel().y,r=De(t.vy,n);t.vy=n,r!==null&&(t.landings++,Je(e.translation(),Math.min(1,r/3.5)))}++o.current%15||!e||e.isSleeping()||Fr(e.translation())&&r()}),(0,W.jsxs)(H,{ref:a,colliders:!1,position:t.at,rotation:[0,t.yaw,0],linearVelocity:t.vel,linearDamping:.3,angularDamping:.6,ccd:!0,userData:{toy:e.id},children:[(0,W.jsx)(V,{args:[.055,.15,.27],position:[0,-.03,-.07],density:260,friction:.8,restitution:.25,collisionGroups:n}),(0,W.jsxs)(`group`,{ref:i,children:[(0,W.jsx)(Zr,{def:e}),(0,W.jsx)(`mesh`,{visible:!1,position:[0,-.03,-.07],children:(0,W.jsx)(`boxGeometry`,{args:[.36,.36,.6]})})]})]})}var Y={r:.026,half:.064,tip:.105,speed:19,flightGravity:.35,density:35,embed:.012,slow:4},ri=new A(0,1,0),ii=new A(1,1,1),ai={x:0,y:0,z:0},oi=Fe();function si(e){let t=Ce(`glance`,vt(e.ahead,e.sincePerson,`furniture`),e.speed);t&&Re(t.sound,e.body.translation(),t.gain),e.vy=e.body.linvel().y,e.state=`loose`,e.body.setGravityScale(1,!0),e.body.setLinearDamping(.3)}function ci(e){let t=e.body;if(e.landings>=Ie.dart||t.isSleeping())return;let n=t.linvel().y,r=De(e.vy,n);if(e.vy=n,r===null)return;e.landings++;let i=t.translation(),a=Ce(`land`,i.y<.2?`floor`:`furniture`,r);a&&Re(a.sound,i,a.gain)}function li({groups:e}){let{world:t,rapier:n}=R(),r=D(e=>e.camera),o=(0,N.useRef)([]),s=(0,N.useRef)(1),c=(0,N.useRef)(0),l=(0,N.useMemo)(()=>({fwd:new A,muzzle:new A,aim:new A,v:new A,n:new A,q:new ve,m:new C,p:new A}),[]),u=(0,N.useMemo)(()=>new n.Ray({x:0,y:0,z:0},{x:0,y:0,z:-1}),[n]),d=(0,N.useMemo)(()=>{let e=new ge(new a(Y.r,Y.r,.15,8),j(`#ffffff`),48),t=new ge(new a(.035,Y.r,.03,10).translate(0,.09,0),j(`#ffd166`),48);for(let n of[e,t])n.count=0,n.frustumCulled=!1,n.instanceMatrix.setUsage(_);return e.setColorAt(0,new xt(`#ffffff`)),{foam:e,tip:t}},[]);(0,N.useEffect)(()=>()=>{for(let e of[d.foam,d.tip])e.geometry.dispose(),e.dispose()},[d]);let f=(0,N.useCallback)(e=>{let n=o.current.indexOf(e);n<0||(o.current.splice(n,1),t.removeRigidBody(e.body))},[t]);(0,N.useEffect)(()=>(m({count:()=>o.current.length,stuck:()=>o.current.filter(e=>e.state===`stuck`).length,loose:()=>o.current.filter(e=>e.state===`loose`).map(e=>{let t=e.body.translation();return{id:e.id,x:t.x,y:t.y,z:t.z,color:`#${e.color.getHexString()}`,q:e.body.rotation()}}),remove:e=>{let t=o.current.find(t=>t.id===e);return t&&f(t),!!t}}),()=>{m(null),o.current=[]}),[f]);let p=(0,N.useCallback)((n,r,i)=>(u.origin=n,u.dir=r,t.castRay(u,i,!0,void 0,e)),[u,t,e]),h=(0,N.useCallback)(a=>{let c=i.find(e=>e.id===a)??i[0],{fwd:u,muzzle:d,aim:m,v:h,q:g}=l;u.set(0,0,-1).applyQuaternion(r.quaternion),d.copy(Qr).applyQuaternion(r.quaternion).add(r.position),h.subVectors(d,r.position);let _=h.length();h.divideScalar(_);let v=p(r.position,h,_+Y.tip);v&&d.copy(r.position).addScaledVector(h,Math.max(0,v.timeOfImpact-Y.tip-.02));let y=p(r.position,u,60),b=y?y.timeOfImpact:40;b>1.2?m.copy(r.position).addScaledVector(u,b):m.copy(d).add(u),h.subVectors(m,d).normalize(),g.setFromUnitVectors(ri,h);for(let e of nt(o.current,40))f(e);let x=t.createRigidBody(n.RigidBodyDesc.dynamic().setTranslation(d.x,d.y,d.z).setRotation(g).setLinvel(h.x*Y.speed,h.y*Y.speed,h.z*Y.speed).setGravityScale(Y.flightGravity).setLinearDamping(.05).setAngularDamping(1.5).setCcdEnabled(!0).setUserData({toy:`dart`}));t.createCollider(n.ColliderDesc.capsule(Y.half,Y.r).setDensity(Y.density).setRestitution(.35).setFriction(.9).setCollisionGroups(e),x),o.current.push({id:s.current++,born:performance.now(),body:x,color:new xt(c.foam),state:`flying`,dir:h.clone(),speed:Y.speed,ahead:null,sincePerson:1/0,vy:0,landings:0})},[r,p,e,n,f,l,t]),g=(0,N.useCallback)((e,r,i)=>{let a=e.body;a.setBodyType(n.RigidBodyType.Fixed,!1),t.removeCollider(a.collider(0),!1),a.setTranslation(r.addScaledVector(i,Y.tip-Y.embed),!1),a.setRotation(l.q.setFromUnitVectors(ri,i.negate()),!1),e.state=`stuck`;let o=Ce(`stick`,vt(e.ahead,e.sincePerson,`wall`),e.speed);o&&Re(o.sound,r,o.gain)},[n,l,t]);return mn((0,N.useCallback)(()=>{for(let e=et();e;e=et())h(e);let{v:r,n:i,p:a,q:s}=l;for(let c of[...o.current]){if(c.state===`loose`&&ci(c),c.state!==`flying`)continue;let o=c.body,l=o.linvel(),d=Math.hypot(l.x,l.y,l.z);if(r.set(l.x,l.y,l.z).divideScalar(d||1),d<Y.slow||r.dot(c.dir)<.97){si(c);continue}c.dir.copy(r),o.setRotation(s.setFromUnitVectors(ri,r),!0),o.setAngvel(ai,!0);let f=o.translation();u.origin=f,u.dir=r;let p=t.castRayAndGetNormal(u,d*Jr+Y.tip,!0,void 0,e,void 0,o);if(c.speed=d,p){let e=p.collider,t=e.parent();c.ahead=pt({fixed:!!t?.isFixed(),tag:t?.userData,halfHeight:e.shapeType()===n.ShapeType.Cuboid?e.halfExtents().y:null,normalY:p.normal.y,y:f.y+r.y*p.timeOfImpact})}else c.ahead=null;if(c.sincePerson=c.ahead===`person`?0:c.sincePerson+1,!p||!p.collider.parent()?.isFixed())continue;a.set(f.x,f.y,f.z).addScaledVector(r,p.timeOfImpact);let m=a.x>oi.minX&&a.x<oi.maxX&&a.z>oi.minZ-.05;i.set(p.normal.x,p.normal.y,p.normal.z),!m&&S(l,i)&&g(c,a,i)}if(!(++c.current%15))for(let e of[...o.current])e.state!==`stuck`&&Fr(e.body.translation())&&f(e)},[e,n,u,f,h,g,l,t])),E(()=>{let{foam:e,tip:t}=d,{m:n,p:r,q:i}=l,a=o.current;for(let o=0;o<a.length;o++){let s=a[o].body,c=s.translation(),l=s.rotation();n.compose(r.set(c.x,c.y,c.z),i.set(l.x,l.y,l.z,l.w),ii),e.setMatrixAt(o,n),t.setMatrixAt(o,n),e.setColorAt(o,a[o].color)}(e.count!==a.length||a.length)&&(e.count=t.count=a.length,e.instanceMatrix.needsUpdate=!0,t.instanceMatrix.needsUpdate=!0,e.instanceColor&&(e.instanceColor.needsUpdate=!0))}),(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`primitive`,{object:d.foam}),(0,W.jsx)(`primitive`,{object:d.tip})]})}var ui=()=>Object.fromEntries(i.map(e=>[e.id,{where:`rack`}]));function di({floor:e,groups:t}){let n=M(e=>e.held?.kind===`blaster`?e.held.id:null),r=D(e=>e.camera),{world:a,rapier:o}=R(),[s,c]=(0,N.useState)(ui),l=(0,N.useRef)(null),u=(0,N.useRef)(0);(0,N.useEffect)(()=>Pe(),[]);let d=(0,N.useCallback)(()=>{let e=new A(0,0,-1).applyQuaternion(r.quaternion);e.y=0,e.lengthSq()<1e-6&&e.set(0,0,-1),e.normalize();let n={x:r.position.x,y:1.1,z:r.position.z},i=a.castRay(new o.Ray(n,e),1,!0,void 0,t),s=i?Math.max(0,Math.min(.45,i.timeOfImpact-.3)):.45;return{where:`loose`,key:++u.current,at:[n.x+e.x*s,n.y,n.z+e.z*s],vel:[Be.x*.5,0,Be.z*.5],yaw:r.rotation.y}},[r,t,o,a]);(0,N.useEffect)(()=>{let e=l.current;if(l.current=n,e===n)return;let t=e?d():null;c(r=>{let i={...r};return e&&t&&(i[e]=t),n&&(i[n]={where:`held`}),i})},[n,d]);let f=(0,N.useCallback)(e=>c(t=>({...t,[e]:{where:`rack`}})),[]),p=i.find(e=>e.id===n),m=e===`office`?qe.officeX:qe.lobbyX;return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(ti,{x:m,onRack:i.filter(e=>s[e.id]?.where===`rack`)}),i.map(e=>{let n=s[e.id];return n?.where===`loose`?(0,W.jsx)(ni,{def:e,spot:n,groups:t,onLost:()=>f(e.id)},`${e.id}:${n.key}`):null}),p&&(0,W.jsx)($r,{def:p}),(0,W.jsx)(li,{groups:t})]})}var fi={half:[.43,.5,.43],y:1},pi=(0,N.memo)(function({floor:t,groups:n}){let r=(0,N.useSyncExternalStore)(e,ie),i=(0,N.useMemo)(()=>Pr[t].map(e=>e.id),[t]),a=(0,N.useRef)(new Map),o=(0,N.useRef)(new Map),s=(0,N.useMemo)(()=>new Map,[]),c=(0,N.useMemo)(()=>({p:new A,q:new ve,found:[]}),[]),l=()=>{for(let[e,t]of a.current)t.isValid()||(a.current.delete(e),o.current.delete(e));return a.current};return E(()=>{let{p:e,q:t}=c;for(let[n,r]of l()){n.obj.getWorldPosition(e),n.obj.getWorldQuaternion(t);let i=r.translation(),a=r.rotation(),o=Math.abs(i.x-e.x)+Math.abs(i.y-e.y)+Math.abs(i.z-e.z)>.005,s=Math.abs(a.x*t.x+a.y*t.y+a.z*t.z+a.w*t.w)<.99999;(o||s)&&(r.setTranslation(e,!0),r.setRotation(t,!0))}}),mn(e=>{s.clear(),a.current.size&&e.forEachActiveRigidBody(e=>{if(!e.isDynamic())return;let t=e.linvel();s.set(e.handle,Math.hypot(t.x,t.y,t.z))})}),hn(e=>{let t=M.getState().held,n=t?.kind===`ball`?t.id:null,r=c.found;for(let[t,a]of l()){if(!a.numColliders())continue;let c=a.collider(0);r.length=0,e.intersectionPairsWith(c,e=>void r.push(e));let l=o.current.get(t),u=null;for(let a of r){let r=a.parent();if(!r||!e.intersectionPair(c,a)||((u??=new Set).add(r.handle),l?.has(r.handle)))continue;let o=r.userData,d=xe(o,i);_e(d,s.get(r.handle)??0,d===`ball`&&o?.toy===n)&&Ne(t.id)}u?o.current.set(t,u):o.current.delete(t)}}),r.map(e=>(0,W.jsx)(H,{ref:t=>{t&&a.current.set(e,t)},type:`kinematicPosition`,colliders:!1,position:e.obj.getWorldPosition(new A).toArray(),userData:{seat:e.id},children:(0,W.jsx)(V,{sensor:!0,args:fi.half,position:[0,fi.y,0],collisionGroups:n})},e.key))}),mi={min:.8,full:9,cooldownMs:70};function hi(e){if(!(e>=mi.min))return null;let t=Math.min(1,(e-mi.min)/(mi.full-mi.min));return{gain:.12+.88*Math.sqrt(t),bright:t}}var gi=(e,t)=>t-e>=mi.cooldownMs,_i=.05,vi=.08;function yi(e,t,n,r=0){let i=_i+Math.min(vi,Math.max(0,r)),a=Math.hypot(e.x-n.x,e.z-n.z)-n.r;if(Math.hypot(a,e.y-n.y)<=t+U.rim.tube+i)return`rim`;let o=12-U.standoff-U.board.t,s=Math.max(U.board.w,U.score.w)/2,c=U.score.bottom+U.score.h;return e.z>=o-t-i&&Math.abs(e.x-n.x)<=s+t&&e.y>=U.board.bottom-t-i&&e.y<=c+t?`board`:null}var bi=2.5,xi=1/60,Si=6,Ci=[4,1,3],wi=[.5,.3],Ti=new A(0,1,0),Ei=3,Di={half:[.02,.038,.01],at:[T.r+.02,.004,0]},X={x:.16,y:-.13,z:-.42,tilt:.55,turn:-.6,scale:.75},Oi={x:.02,y:-.1,z:-.3,turn:-.15};function ki({mug:e}){let t=(0,N.useRef)(null),n=(0,N.useRef)(null),r=(0,N.useRef)(null);return E(({camera:e})=>{let i=t.current,a=n.current;if(!i||!a)return;r.current&&(r.current.visible=We.lift<.05),i.position.copy(e.position),i.quaternion.copy(e.quaternion);let o=performance.now()/1e3,s=We.lift;a.position.set(X.x+(Oi.x-X.x)*s,X.y+(Oi.y-X.y)*s+Math.sin(o*1.6)*.003*(1-s),X.z+(Oi.z-X.z)*s),a.rotation.set(X.tilt+We.tilt,X.turn+(Oi.turn-X.turn)*s,0)}),(0,W.jsxs)(`group`,{ref:t,children:[(0,W.jsx)(`group`,{ref:n,rotation:[X.tilt,X.turn,0],scale:X.scale,children:(0,W.jsx)(te,{color:f(e.id),sips:e.sips,shadow:!1,steam:!1})}),e.sips>0&&(0,W.jsx)(`group`,{ref:r,position:[X.x,X.y+T.h*X.scale*.45,X.z-.02],scale:X.scale,children:(0,W.jsx)(k,{y:0,sips:e.sips})})]})}function Ai({mug:e,groups:t,bodies:r,onLost:i}){let a=Ze({id:`toy:${e.id}`,label:`Pick up mug`,action:{kind:`pickup`,toyId:e.id}},bi),o=(0,N.useRef)(null),s=(0,N.useRef)(null),c=(0,N.useRef)(null),l=(0,N.useRef)(0),u=(0,N.useRef)(-1/0);(0,N.useEffect)(()=>{let t=o.current;if(t)return r.set(e.id,t),()=>{r.get(e.id)===t&&r.delete(e.id)}},[r,e.id]),(0,N.useEffect)(()=>{s.current?.setContactForceEventThreshold(Si),c.current?.setContactForceEventThreshold(Si)},[]);let d=(0,N.useCallback)(e=>{let t=o.current;if(!t)return;let r=performance.now(),i=n(He(e.totalForceMagnitude,xi,t.mass()),r-u.current);i&&(u.current=r,ne(t.translation(),i))},[]);hn(()=>{let t=o.current;++l.current%15||!t||t.isSleeping()||Fr(t.translation())&&i(e.id)});let{r:p,rBase:m,h}=T;return(0,W.jsxs)(H,{ref:o,colliders:!1,position:e.at,rotation:e.rot,linearVelocity:e.vel,angularVelocity:e.spin,linearDamping:.3,angularDamping:Ei,ccd:!0,userData:{toy:e.id},onContactForce:d,children:[(0,W.jsx)(Vn,{ref:s,args:[h/2,(p+m)/2],density:300,friction:.7,restitution:.2,collisionGroups:t}),(0,W.jsx)(V,{ref:c,args:Di.half,position:Di.at,density:300,friction:.7,restitution:.2,collisionGroups:t}),(0,W.jsxs)(`group`,{ref:a,children:[(0,W.jsx)(te,{color:f(e.id),sips:e.sips}),(0,W.jsx)(`mesh`,{visible:!1,children:(0,W.jsx)(`boxGeometry`,{args:[.26,.26,.26]})})]})]})}function ji({groups:e}){let t=M(e=>e.held?.kind===`mug`?e.held:null),n=D(e=>e.camera),{world:r,rapier:i}=R(),a=(0,N.useRef)([]),o=(0,N.useMemo)(()=>new Map,[]),[,s]=(0,N.useReducer)(e=>e+1,0),c=(0,N.useRef)(0),l=(0,N.useMemo)(()=>({fwd:new A,ray:new i.Ray({x:0,y:0,z:0},{x:0,y:0,z:-1})}),[i]),u=(0,N.useCallback)(e=>{let t=a.current.findIndex(t=>t.id===e);if(t<0)return null;let[n]=a.current.splice(t,1);return s(),n},[]);(0,N.useEffect)(()=>(ee(),oe({loose:()=>a.current.map(e=>{let t=o.get(e.id),n=t?t.translation():{x:e.at[0],y:e.at[1],z:e.at[2]};return{id:e.id,x:n.x,y:n.y,z:n.z,sips:e.sips,sleeping:t?t.isSleeping():!1}}),take:e=>u(e)?.sips??null}),()=>{oe(null),a.current=[]}),[o,u]);let d=(0,N.useCallback)((t,i)=>{let{fwd:o,ray:d}=l;o.set(0,0,-1).applyQuaternion(n.quaternion),o.y=0,o.lengthSq()<1e-6&&o.set(0,0,-1),o.normalize(),d.origin={x:n.position.x,y:1.1,z:n.position.z},d.dir=o;let f=r.castRay(d,1,!0,void 0,e),p=f?Math.max(0,Math.min(.45,f.timeOfImpact-.2)):.45;for(let e of v(a.current))u(e.id);let m=n.rotation.y,h=new pe().setFromQuaternion(new ve().setFromEuler(new pe(wi[0],m,wi[1],`YXZ`)),`XYZ`),g=new A(...Ci).applyAxisAngle(Ti,m);a.current.push({id:t,sips:i,born:performance.now(),key:++c.current,at:[n.position.x+o.x*p,1.1,n.position.z+o.z*p],vel:[Be.x*.5,0,Be.z*.5],rot:[h.x,h.y,h.z],spin:[g.x,g.y,g.z]}),s()},[n,e,u,l,r]);return mn((0,N.useCallback)(()=>{for(let e=bt();e;e=bt())d(e.id,e.sips)},[d])),(0,W.jsxs)(W.Fragment,{children:[a.current.map(t=>(0,W.jsx)(Ai,{mug:t,groups:e,bodies:o,onLost:u},t.key)),t&&(0,W.jsx)(ki,{mug:t})]})}var Z={r:.17,h:.09,speed:.3,turnRate:1.8,backSpeed:.2,cleanMin:120,cleanMax:180,charge:30,firstCharge:6,stuckAfter:5,spin:1.3},Q={leave:1,home:2,dock:4,full:8,stuck:16,bump:32},Mi={w:.44,d:.14,h:.26},Ni=Z.r+.03,Pi=Ni+.1,Fi=.2,Ii=.8/(Z.cleanMax+90),Li=.6,Ri=.6,zi=.45,Bi={office:12.8,lobby:-3.5},Vi={office:[[-7.1,-11.3,1],[7.1,-11.3,1],[-15.3,11.2,1.2],[-11,-11.3,1.1],[15.3,11.3,.9]],lobby:[[-7.1,-11.4,1.1],[-15.4,-4.1,.9],[15.3,-4.2,1.1],[7.1,-4.1,.9],[15.3,11.3,1.2],[-15.3,11.3,1.2],[-3,11.4,1],[3,-11.3,.8]]};function Hi(e){let t=Bi[e];return{x:t,z:-12+Mi.d+Ni+.01,heading:-Math.PI/2,rect:{minX:t-Mi.w/2,maxX:t+Mi.w/2,minZ:-12,maxZ:-12+Mi.d,h:Mi.h}}}function Ui(e){let t=e===`office`?Ye():tt();t.push(Fe());for(let[n,r,i]of Vi[e])t.push(ze(n,r,.6*i,.6*i));return t.push(Hi(e).rect),t}function Wi(e,t,n,r=Ni){if(Math.abs(t)>16-r||Math.abs(n)>12-r)return!1;for(let i of e)if(t>i.minX-r&&t<i.maxX+r&&n>i.minZ-r&&n<i.maxZ+r)return!1;return!0}function Gi(e,{planR:t=Pi,lineR:n=Ni+.04,greed:r=1}={}){let i=Math.round(32/Fi),a=Math.round(24/Fi),o=new Uint8Array(i*a);for(let n=0;n<a;n++)for(let r=0;r<i;r++)o[n*i+r]=+!Wi(e,Ki(r),qi(n),t);return{rects:e,cols:i,rows:a,blocked:o,planR:t,lineR:n,greed:r}}var Ki=e=>-16+(e+.5)*Fi,qi=e=>-12+(e+.5)*Fi,Ji=(e,t)=>Math.min(t-1,Math.max(0,Math.floor((e+16)/Fi))),Yi=(e,t)=>Math.min(t-1,Math.max(0,Math.floor((e+12)/Fi)));function Xi(e,t,n,r=Ni+.04){let i=Math.max(1,Math.ceil(Math.hypot(n.x-t.x,n.z-t.z)/.08)),a=1;for(;a*2<=i;)a*=2;for(let o=a;o>=1;o>>=1)for(let s=o;s<=i;s+=o)if((o===a||s%(o*2)!=0)&&!Wi(e,t.x+(n.x-t.x)*s/i,t.z+(n.z-t.z)*s/i,r))return!1;return!0}function Zi(e,t,n,r){let{cols:i,rows:a,blocked:o}=e;for(let e=0;e<12;e++){let s=-1,c=1/0;for(let l=-e;l<=e;l++)for(let u=-e;u<=e;u++){if(Math.max(Math.abs(u),Math.abs(l))!==e)continue;let d=t+u,f=n+l;if(d<0||f<0||d>=i||f>=a)continue;let p=f*i+d;if(o[p]||r(p))continue;let m=u*u+l*l;m<c&&(c=m,s=p)}if(s>=0)return s}return-1}function Qi(e,t,n,r=null){let{cols:i,rows:a,blocked:o}=e,s=r?r.r+e.planR:0,c=e=>!!r&&Math.hypot(Ki(e%i)-r.x,qi(Math.floor(e/i))-r.z)<s,l=Zi(e,Ji(t.x,i),Yi(t.z,a),c),u=Zi(e,Ji(n.x,i),Yi(n.z,a),()=>!1);if(l<0||u<0)return null;let d=i*a,f=new Float32Array(d).fill(1/0),p=new Int32Array(d).fill(-1),m=new Uint8Array(d),h=u%i,g=Math.floor(u/i),_=t=>{let n=Math.abs(t%i-h),r=Math.abs(Math.floor(t/i)-g);return e.greed*(Math.max(n,r)+(Math.SQRT2-1)*Math.min(n,r))},v=[],y=(e,t)=>{v.push([e,t]);let n=v.length-1;for(;n>0;){let e=n-1>>1;if(v[e][0]<=v[n][0])break;[v[e],v[n]]=[v[n],v[e]],n=e}},b=()=>{let e=v[0],t=v.pop();if(v.length){v[0]=t;let e=0;for(;;){let t=2*e+1,n=t+1,r=e;if(t<v.length&&v[t][0]<v[r][0]&&(r=t),n<v.length&&v[n][0]<v[r][0]&&(r=n),r===e)break;[v[r],v[e]]=[v[e],v[r]],e=r}}return e[1]},x=(e,t)=>e>=0&&t>=0&&e<i&&t<a&&!o[t*i+e]&&!c(t*i+e);f[l]=0,y(_(l),l);let S=!1;for(;v.length;){let e=b();if(m[e])continue;if(m[e]=1,e===u){S=!0;break}let t=e%i,n=Math.floor(e/i);for(let r=-1;r<=1;r++)for(let a=-1;a<=1;a++){if(!a&&!r||!x(t+a,n+r)||a&&r&&(!x(t+a,n)||!x(t,n+r)))continue;let o=(n+r)*i+t+a,s=f[e]+(a&&r?Math.SQRT2:1);s<f[o]&&(f[o]=s,p[o]=e,y(s+_(o),o))}}if(!S)return null;let C=[];for(let e=u;e>=0;e=p[e])C.push({x:Ki(e%i),z:qi(Math.floor(e/i))});C.reverse(),C.push({x:n.x,z:n.z});let ee=[],w=t,T=0;for(;T<C.length;){let t=T;for(let n=C.length-1;n>T;n--)if(Xi(e.rects,w,C[n],e.lineR)){t=n;break}w=C[t],ee.push(w),T=t+1}return ee}function $i(e,t=1){let n=Z.charge-Z.firstCharge,r=.9;return{x:e.x,z:e.z,heading:e.heading,state:`charging`,move:`idle`,battery:r+.09999999999999998*n/Z.charge,stateTime:n,moveTime:0,turnLeft:0,spiralR:0,path:[],cleanFor:Z.cleanMin,chargeFrom:r,stuck:0,mark:{x:e.x,z:e.z},waited:0,spinFrom:0,resume:{move:`idle`,moveTime:0},speed:0,seed:t>>>0||1,events:0}}function ea(e){e.seed=e.seed+1831565813>>>0;let t=e.seed;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}var ta=(e,t,n)=>t+(n-t)*ea(e),na=e=>Math.atan2(Math.sin(e),Math.cos(e));function ra(e){return e.state===`charging`?e.battery<.995?`charging`:`docked`:e.state===`returning`||e.state===`docking`?`heading home`:`cleaning`}function ia(e){e.move!==`spin`&&(e.resume={move:e.move,moveTime:e.moveTime},e.spinFrom=e.heading,e.move=`spin`,e.moveTime=Z.spin)}var aa=e=>({x:e.x-Math.cos(e.heading)*Ri,z:e.z-Math.sin(e.heading)*Ri});function oa(e,t,n){if(e.speed=0,e.stateTime+=t,e.move===`spin`){e.moveTime-=t;let n=Math.min(1,1-e.moveTime/Z.spin);e.heading=e.spinFrom+4*Math.PI*(n*n*(3-2*n)),e.moveTime<=0&&(e.heading=e.spinFrom,e.move=e.resume.move,e.moveTime=e.resume.moveTime),e.state===`charging`&&ca(e);return}if(e.state===`charging`){ca(e),e.stateTime>=Z.charge&&(sa(e,`leaving`),e.events|=Q.leave,e.cleanFor=ta(e,Z.cleanMin,Z.cleanMax),e.move=`back`,e.moveTime=Li/Z.backSpeed);return}e.battery=Math.max(0,e.battery-Ii*t),e.state===`cleaning`&&(e.stateTime>=e.cleanFor||e.battery<.1)&&va(e,n);let r=n.player;if(r){let i=r.x-e.x,a=r.z-e.z,o=Math.hypot(i,a);if(o<Z.r+.3+.02){let r=o>1e-6?-i/o:-Math.cos(e.heading),s=o>1e-6?-a/o:-Math.sin(e.heading);da(e,r*Z.speed*1.5*t,s*Z.speed*1.5*t,t,n),e.stuck=0;return}}switch(e.move){case`wait`:{if(e.stuck=0,e.moveTime-=t,e.moveTime>0)break;let i=r!==null&&la(e,r);if(e.state===`cleaning`||e.state===`leaving`){i?ha(e,Math.atan2(e.z-r.z,e.x-r.x)+ta(e,-.7,.7)):e.move=`drive`;break}i?(e.waited+=.8,e.moveTime=.8,e.waited>=4&&(e.waited=0,ya(e,n,r))):(e.waited=0,e.move=e.state===`docking`?`park`:`path`);break}case`turn`:{let n=Math.sign(e.turnLeft)*Math.min(Math.abs(e.turnLeft),Z.turnRate*t);e.heading=na(e.heading+n),e.turnLeft-=n,Math.abs(e.turnLeft)<1e-4&&ga(e);break}case`back`:if(e.moveTime-=t,da(e,-Math.cos(e.heading)*Z.backSpeed*t,-Math.sin(e.heading)*Z.backSpeed*t,t,n)&&e.moveTime>0)break;e.stuck=0,e.state===`leaving`?(sa(e,`cleaning`),ha(e,n.dock.heading+Math.PI+ta(e,-.8,.8))):e.state===`cleaning`?ma(e,(ea(e)<.5?1:-1)*ta(e,2,3.6)):ya(e,n,null);break;case`drive`:if(ua(e,r))break;fa(e,Z.speed,t,n)?ea(e)<.02*t&&(e.move=`spiral`,e.spiralR=.15,e.moveTime=25):pa(e);break;case`spiral`:if(e.moveTime-=t,e.heading=na(e.heading+Z.speed/e.spiralR*t),e.spiralR+=Z.speed*.32/(2*Math.PI*e.spiralR)*t,ua(e,r))break;fa(e,Z.speed,t,n)?(e.spiralR>1.4||e.moveTime<=0)&&(e.move=`drive`):pa(e);break;case`follow`:{if(e.moveTime-=t,e.moveTime<=0){ma(e,-ta(e,.6,1.4));break}let i=Z.speed*t,a=Math.cos(e.heading),o=Math.sin(e.heading);if(!Wi(n.nav.rects,e.x+a*(i+.02),e.z+o*(i+.02))){e.heading=na(e.heading-Z.turnRate*t);break}if(Wi(n.nav.rects,e.x-o*.12+a*.05,e.z+a*.12+o*.05)&&(e.heading=na(e.heading+Z.speed/.3*t)),ua(e,r))break;fa(e,Z.speed,t,n)||(e.heading=na(e.heading-Z.turnRate*t));break}case`path`:{let i=e.path[0];if(!i){sa(e,`docking`),ha(e,n.dock.heading);break}let a=i.x-e.x,o=i.z-e.z,s=Math.hypot(a,o);if(s<.04){e.path.shift();break}let c=na(Math.atan2(o,a)-e.heading);if(Math.abs(c)>.3){e.heading=na(e.heading+Math.sign(c)*Math.min(Math.abs(c),Z.turnRate*t));break}if(e.heading=na(e.heading+Math.sign(c)*Math.min(Math.abs(c),Z.turnRate*t)),ua(e,r))break;fa(e,Math.min(Z.speed,s/t),t,n)||(e.events|=Q.bump,_a(e,.5));break}case`park`:{let i=Math.hypot(n.dock.x-e.x,n.dock.z-e.z);if(i<.005){e.x=n.dock.x,e.z=n.dock.z,e.heading=n.dock.heading,sa(e,`charging`),e.events|=Q.dock,e.move=`idle`,e.chargeFrom=e.battery;break}if(e.heading=Math.atan2(n.dock.z-e.z,n.dock.x-e.x),ua(e,r))break;fa(e,Math.min(.15,i/t),t,n)||(e.events|=Q.bump,_a(e,.8));break}}Math.hypot(e.x-e.mark.x,e.z-e.mark.z)>.2?(e.mark={x:e.x,z:e.z},e.stuck=0):e.move!==`wait`&&(e.stuck+=t,e.stuck>=Z.stuckAfter&&(e.stuck=0,e.events|=Q.stuck,e.state===`docking`&&sa(e,`returning`),_a(e,.8)))}function sa(e,t){e.state=t,e.stateTime=0}function ca(e){let t=e.battery;e.battery=e.chargeFrom+(1-e.chargeFrom)*Math.min(1,e.stateTime/Z.charge),t<.995&&e.battery>=.995&&(e.events|=Q.full)}function la(e,t){let n=t.x-e.x,r=t.z-e.z,i=Math.hypot(n,r);return i<Z.r+.3+zi&&(n*Math.cos(e.heading)+r*Math.sin(e.heading))/i>.35}function ua(e,t){return!t||!la(e,t)?!1:(e.move=`wait`,e.moveTime=.8,!0)}function da(e,t,n,r,i){let a=e.x+t,o=e.z+n;if(!Wi(i.nav.rects,a,o))return!1;let s=i.player;if(s){let t=Z.r+ft+.08,n=Math.hypot(s.x-e.x,s.z-e.z),r=Math.hypot(s.x-a,s.z-o);if(r<t&&r<n)return!1}return e.x=a,e.z=o,e.speed=Math.hypot(t,n)/r,!0}function fa(e,t,n,r){return da(e,Math.cos(e.heading)*t*n,Math.sin(e.heading)*t*n,n,r)}function pa(e){if(e.events|=Q.bump,ea(e)<.3){e.move=`follow`,e.moveTime=ta(e,6,14);return}ma(e,(ea(e)<.5?1:-1)*ta(e,Math.PI/2,Math.PI))}function ma(e,t){e.move=`turn`,e.turnLeft=t}function ha(e,t){ma(e,na(t-e.heading))}function ga(e){e.move=e.state===`docking`?`park`:e.state===`returning`?`path`:`drive`}function _a(e,t){e.move=`back`,e.moveTime=t}function va(e,t){let n=Qi(t.nav,e,aa(t.dock));if(!n){e.cleanFor+=15;return}sa(e,`returning`),e.events|=Q.home,e.path=n,e.move=`path`,e.waited=0}function ya(e,t,n){e.state===`docking`&&sa(e,`returning`);let r=Qi(t.nav,e,aa(t.dock),n?{...n,r:.3}:null)??Qi(t.nav,e,aa(t.dock));e.path=r??[],e.move=r?`path`:`wait`,e.moveTime=.8}var ba=3,xa=.4;function Sa(e,t,n,r){if(e===`charging`&&t!==`spin`)return r.level=0,r.pitch=.8,r;if(t===`spin`)return r.level=.85,r.pitch=1.08,r;if(t===`idle`||t===`wait`)return r.level=0,r.pitch=.8,r;let i=Math.min(1,n/Z.speed);return t===`turn`||i<.02?(r.level=.6,r.pitch=.9,r):(r.level=.45+.55*i,r.pitch=.8+.2*i,r)}function Ca(e){if(e<=ba)return 1;if(e>=8)return 0;let t=(e-ba)/5;return(1-t)*(1-t)}var wa=(e,t)=>t-e>=xa,Ta=.06,Ea=.05,Da=110,Oa=1650,ka=.8,Aa=(e,t)=>({name:`roomba:${e}`,group:`toys`,pos:t});function ja(e){[1046.5,1568].forEach((t,n)=>O({...Aa(`leave`,e),freq:t,type:`triangle`,at:n*.13,dur:.1,peak:.06}))}function Ma(e){[1568,1318.5,1175,988].forEach((t,n)=>O({...Aa(`home`,e),freq:t,type:`triangle`,at:n*.06,dur:.08,peak:.05}))}function Na(e){O({...Aa(`dock`,e),freq:784,to:1175,dur:.14,peak:.07,attack:.01})}function Pa(e){[784,988,1175,1568].forEach((t,n)=>O({...Aa(`full`,e),freq:t,type:`triangle`,at:n*.1,dur:n===3?.3:.12,peak:.055}))}function Fa(e){O({...Aa(`stuck`,e),freq:659,type:`triangle`,dur:.16,peak:.06}),O({...Aa(`stuck`,e),freq:494,to:392,type:`triangle`,at:.2,dur:.32,peak:.06})}function Ia(e){le({...Aa(`bump`,e),dur:.06,peak:.07,filter:`bandpass`,freq:1100,q:1.6,attack:.002}),O({...Aa(`bump`,e),freq:210,to:140,dur:.09,peak:.06,attack:.003})}function La(e,t,n){let r=e.createGain();r.gain.value=0;let i=Oe(e,n);r.connect(i);let a=e.createOscillator();a.type=`sawtooth`,a.frequency.value=Da;let o=e.createBiquadFilter();o.type=`lowpass`,o.frequency.value=480,o.Q.value=.7;let s=e.createGain();s.gain.value=.55,a.connect(o).connect(s).connect(r);let c=e.createOscillator();c.type=`triangle`,c.frequency.value=Oa;let l=e.createGain();l.gain.value=.05,c.connect(l).connect(r);let u=e.createBuffer(1,e.sampleRate,e.sampleRate),d=u.getChannelData(0);for(let e=0;e<d.length;e++)d[e]=Math.random()*2-1;let f=e.createBufferSource();f.buffer=u,f.loop=!0;let p=e.createBiquadFilter();p.type=`bandpass`,p.frequency.value=2800,p.Q.value=.6;let m=e.createGain();return m.gain.value=.35,f.connect(p).connect(m).connect(r),a.start(),c.start(),f.start(),a.onended=()=>{try{i.disconnect(),r.disconnect()}catch{}},{env:r,panner:i,out:t,motor:a,whine:c,brush:f,hooked:!1}}function Ra({brain:e}){let t=Le(),n=M(e=>e.travel!==null||e.overlay!==null),r=t||n,i=(0,N.useRef)({graph:null,level:0,pitch:1,silentFor:0,lastBump:-1/0,quiet:r,humming:!1});i.current.quiet=r;let a=(0,N.useMemo)(()=>({x:e.x,y:Ta,z:e.z}),[e]),o=(0,N.useMemo)(()=>({level:0,pitch:1}),[]);return(0,N.useEffect)(()=>{let e=i.current.graph,t=yt();if(!r||!e||!t)return;try{e.env.gain.cancelScheduledValues(t.ctx.currentTime),e.env.gain.setTargetAtTime(0,t.ctx.currentTime,.04)}catch{}i.current.level=0,i.current.humming=!1;let n=setTimeout(()=>{if(e.hooked&&i.current.graph===e){try{e.panner.disconnect()}catch{}e.hooked=!1}},400);return()=>clearTimeout(n)},[r]),(0,N.useEffect)(()=>()=>{let e=i.current.graph;if(i.current.graph=null,e)try{let t=e.env.context.currentTime;e.env.gain.cancelScheduledValues(t),e.env.gain.setTargetAtTime(0,t,.05);for(let n of[e.motor,e.whine,e.brush])n.stop(t+.4)}catch{}},[]),E(({camera:t},n)=>{let r=i.current;a.x=e.x,a.z=e.z;let c=e.events;if(c&&(e.events=0,!r.quiet)){c&Q.leave&&ja(a),c&Q.home&&Ma(a),c&Q.dock&&Na(a),c&Q.full&&Pa(a),c&Q.stuck&&Fa(a);let e=performance.now()/1e3;c&Q.bump&&wa(r.lastBump,e)&&(r.lastBump=e,Ia(a))}Sa(e.state,e.move,e.speed,o);let l=Math.hypot(t.position.x-a.x,t.position.y-a.y,t.position.z-a.z),u=r.quiet?0:o.level*Ca(l);u>0&&!r.humming&&s(`roomba:hum`,{group:`toys`,pos:a,peak:Ea*o.level,played:!!yt()}),r.humming=u>0;let d=r.graph;if(!d){if(u<=0)return;let e=yt(),t=_t(`toys`);if(!e||!t)return;try{d=r.graph=La(e.ctx,t,a)}catch{return}}try{let e=d.env.context.currentTime;if(u>0?(r.silentFor=0,d.hooked||(d.panner.connect(d.out),d.hooked=!0)):d.hooked&&(r.silentFor+=n)>ka&&(d.panner.disconnect(),d.hooked=!1),!d.hooked)return;de(d.panner,a.x,a.y,a.z),Math.abs(u-r.level)>.01&&(r.level=u,d.env.gain.setTargetAtTime(Ea*u,e,.12)),u>0&&Math.abs(o.pitch-r.pitch)>.005&&(r.pitch=o.pitch,d.motor.frequency.setTargetAtTime(Da*o.pitch,e,.15),d.whine.frequency.setTargetAtTime(Oa*o.pitch,e,.15))}catch{}}),null}var za=8,Ba=.05;function Va({brain:e}){let t=(0,N.useRef)(0),n=(0,N.useRef)([]),r=(0,N.useRef)([]),i=(0,N.useRef)([]),o=(0,N.useMemo)(()=>({foam:new a(.026,.026,.15,8),tip:new a(.035,.026,.03,10).translate(0,.09,0)}),[]);(0,N.useEffect)(()=>()=>{o.foam.dispose(),o.tip.dispose()},[o]),mn(()=>{if(++t.current%4)return;let r=c(e.state,e.x,e.z,g(),Z.r),i=0;for(let e of r)he(e.id)&&(i++,n.current.push({from:new A(e.x,e.y,e.z),q:new ve(e.q.x,e.q.y,e.q.z,e.q.w),color:e.color,since:performance.now()}));i&&(u(i),n.current.length>za&&n.current.splice(0,n.current.length-za),d({x:e.x,y:Ba,z:e.z}))});let s=(0,N.useMemo)(()=>new A,[]);return E(()=>{let t=performance.now();n.current=n.current.filter(e=>t-e.since<ue.animMs),s.set(e.x,Ba,e.z);for(let e=0;e<za;e++){let a=r.current[e];if(!a)continue;let o=n.current[e];if(a.visible=!!o,!o)continue;let c=(t-o.since)/ue.animMs;a.position.lerpVectors(o.from,s,c*c),a.quaternion.copy(o.q),a.scale.setScalar(Math.max(.01,1-c));let l=i.current[e];l&&(l.material=j(o.color))}}),Array.from({length:za},(e,t)=>(0,W.jsxs)(`group`,{ref:e=>void(r.current[t]=e),visible:!1,children:[(0,W.jsx)(`mesh`,{ref:e=>void(i.current[t]=e),geometry:o.foam,material:j(`#ffffff`)}),(0,W.jsx)(`mesh`,{geometry:o.tip,material:j(`#ffd166`)})]},t))}var Ha=`#1f1d2b`,Ua=new A(0,1,0),Wa={clean:new xt(`#4cc9f0`),home:new xt(`#ffd166`),charge:new xt(`#ff9f1c`),full:new xt(`#06d6a0`),off:new xt(`#3a3f4b`)},Ga=e=>`Roomba · ${ra(e)} (battery ${Math.round(e.battery*100)}%)`;function Ka({brain:e}){let[t,n]=(0,N.useState)(()=>Ga(e)),r=Ze({id:`toy:roomba`,label:t,action:{kind:`poke`,toyId:`roomba`}},3);return E(()=>{let r=Ga(e);r!==t&&n(r)}),(0,W.jsxs)(`mesh`,{ref:r,position:[0,.08,0],children:[(0,W.jsx)(`cylinderGeometry`,{args:[.25,.25,.16,12]}),(0,W.jsx)(`meshBasicMaterial`,{visible:!1})]})}function qa({brain:e,light:t}){let n=(0,N.useRef)(null);E((t,r)=>{let i=n.current;i&&(e.speed>0||e.move===`turn`||e.move===`follow`)&&(i.rotation.y+=Math.min(r,.1)*14)});let{r:i}=Z;return(0,W.jsxs)(`group`,{children:[(0,W.jsxs)(`mesh`,{position:[0,.045,0],castShadow:!0,material:j(`#f1f3f5`),children:[(0,W.jsx)(`cylinderGeometry`,{args:[i,i,.07,32]}),(0,W.jsx)(r,{thickness:.01,color:Ha})]}),(0,W.jsx)(`mesh`,{position:[0,.04,0],material:j(`#495057`),children:(0,W.jsx)(`cylinderGeometry`,{args:[i+.008,i+.008,.045,24,1,!1,0,Math.PI]})}),(0,W.jsx)(`mesh`,{position:[0,.084,0],material:j(`#ced4da`),children:(0,W.jsx)(`cylinderGeometry`,{args:[.12,.12,.012,28]})}),(0,W.jsx)(`mesh`,{position:[-.02,.092,0],material:j(`#868e96`),children:(0,W.jsx)(`cylinderGeometry`,{args:[.035,.035,.008,16]})}),(0,W.jsx)(`mesh`,{position:[.085,.09,0],material:t,children:(0,W.jsx)(`sphereGeometry`,{args:[.016,10,8]})}),(0,W.jsxs)(`group`,{ref:n,position:[.115,.012,.095],children:[[0,1,2].map(e=>(0,W.jsx)(`mesh`,{rotation:[0,e*2*Math.PI/3,0],position:[0,0,0],material:j(`#adb5bd`),children:(0,W.jsx)(`boxGeometry`,{args:[.13,.006,.008]})},e)),(0,W.jsx)(`mesh`,{material:j(`#495057`),children:(0,W.jsx)(`cylinderGeometry`,{args:[.018,.018,.012,10]})})]})]})}function Ja({dock:e,led:t,groups:n}){let{w:i,d:a,h:o}=Mi,s=(e.rect.minX+e.rect.maxX)/2,c=(e.rect.minZ+e.rect.maxZ)/2,l=Math.atan2(e.x-s,e.z-c);return(0,W.jsxs)(`group`,{position:[s,0,c],rotation:[0,l,0],children:[(0,W.jsx)(H,{type:`fixed`,colliders:!1,children:(0,W.jsx)(V,{args:[i/2,o/2,a/2],position:[0,o/2,0],collisionGroups:n})}),(0,W.jsxs)(`mesh`,{position:[0,o/2,0],castShadow:!0,material:j(`#343a40`),children:[(0,W.jsx)(`boxGeometry`,{args:[i,o,a]}),(0,W.jsx)(r,{thickness:.012,color:Ha})]}),(0,W.jsx)(`mesh`,{position:[0,o-.02,0],material:j(`#495057`),children:(0,W.jsx)(`boxGeometry`,{args:[i+.02,.04,a+.02]})}),(0,W.jsx)(`mesh`,{position:[0,o*.62,a/2+.004],material:t,children:(0,W.jsx)(`circleGeometry`,{args:[.022,14]})}),(0,W.jsx)(`mesh`,{position:[0,.004,a/2+.09],material:j(`#2b2d42`),children:(0,W.jsx)(`boxGeometry`,{args:[.3,.008,.18]})}),[-.07,.07].map(e=>(0,W.jsx)(`mesh`,{position:[e,.009,a/2+.06],material:j(`#ced4da`),children:(0,W.jsx)(`boxGeometry`,{args:[.05,.004,.08]})},e))]})}var Ya=(0,N.memo)(function({floor:e,groups:t,dockGroups:n}){let r=D(e=>e.camera),i=(0,N.useMemo)(()=>Hi(e),[e]),a=(0,N.useMemo)(()=>$i(i,Math.random()*2**32>>>0),[i]),s=(0,N.useMemo)(()=>({nav:Gi(Ui(e)),dock:i,player:{x:0,z:0}}),[e,i]),c=(0,N.useRef)(null),l=(0,N.useMemo)(()=>({x:0,y:0,z:0}),[]),u=(0,N.useMemo)(()=>new ve,[]),d=(0,N.useMemo)(()=>new rt({color:Wa.clean,toneMapped:!1}),[]),f=(0,N.useMemo)(()=>new rt({color:Wa.off,toneMapped:!1}),[]);(0,N.useEffect)(()=>()=>{d.dispose(),f.dispose()},[d,f]),(0,N.useEffect)(()=>{let e=0;o(()=>({x:a.x,z:a.z,state:a.state,battery:Math.round(a.battery*100),spinning:a.move===`spin`,spins:e}));let t=ct(`roomba`,()=>{a.move!==`spin`&&e++,ia(a),ht({x:a.x,y:.1,z:a.z})});return()=>{o(null),t()}},[a]),mn(e=>{let t=c.current;if(!t)return;let n=s.player;n.x=r.position.x,n.z=r.position.z,oa(a,e.timestep,s),l.x=a.x,l.z=a.z,t.setNextKinematicTranslation(l),t.setNextKinematicRotation(u.setFromAxisAngle(Ua,-a.heading))}),E(({clock:e})=>{let t=e.elapsedTime,n=a.state===`charging`;a.move===`spin`?d.color.setHSL(t*2%1,.9,.6):n?d.color.copy(a.battery>=.995?Wa.full:Wa.charge).multiplyScalar(.45+.55*(.5+.5*Math.sin(t*3))):a.state===`returning`||a.state===`docking`?d.color.copy(Math.sin(t*8)>0?Wa.home:Wa.off):d.color.copy(Wa.clean),f.color.copy(n?d.color:Wa.off)});let p=(0,N.useMemo)(()=>new Set(Pr[e].map(e=>e.id)),[e]),m=(0,N.useMemo)(()=>e=>{let t=e.other.rigidBodyObject?.userData?.toy;t&&p.has(t)&&(a.events|=Q.bump)},[p,a]);return(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(Ja,{dock:i,led:f,groups:n}),(0,W.jsxs)(H,{ref:c,type:`kinematicPosition`,colliders:!1,position:[i.x,0,i.z],rotation:[0,-i.heading,0],userData:{toy:`roomba`},onCollisionEnter:m,children:[(0,W.jsx)(Vn,{args:[Z.h/2,Z.r],position:[0,Z.h/2+.005,0],friction:.3,restitution:.3,collisionGroups:t}),(0,W.jsx)(qa,{brain:a,light:d}),(0,W.jsx)(Ka,{brain:a})]}),(0,W.jsx)(Va,{brain:a}),(0,W.jsx)(Ra,{brain:a})]})}),Xa=1/60,$={building:0,doorway:1,pusher:2,toys:3},Za=Xn($.doorway,[$.toys]),Qa=Xn($.pusher,[$.building,$.toys]),$a=Xn($.toys,[$.building,$.doorway,$.pusher,$.toys]),eo=Xn($.toys,[$.building,$.doorway,$.toys]),to=Xn($.building,[$.pusher,$.toys]),no=Xn($.toys,[$.toys]),ro=Xn($.toys,[$.toys]),io=Fe();function ao({floor:e}){let t=(0,N.useMemo)(()=>e===`office`?Ye():tt(),[e]);return(0,W.jsxs)(H,{type:`fixed`,colliders:!1,children:[(0,W.jsx)(V,{args:[17,.5,16],position:[0,-.5,2],friction:.8,restitution:.5,collisionGroups:to}),(0,W.jsx)(V,{args:[17,.5,16],position:[0,Me+.5,2],collisionGroups:to}),(0,W.jsx)(V,{args:[(io.maxX-io.minX)/2,Me/2,(io.maxZ-io.minZ)/2],position:[(io.minX+io.maxX)/2,Me/2,(io.minZ+io.maxZ)/2],collisionGroups:Za}),t.map((e,t)=>{let n=e.h??3.6;return(0,W.jsx)(V,{args:[(e.maxX-e.minX)/2,n/2,(e.maxZ-e.minZ)/2],position:[(e.minX+e.maxX)/2,n/2,(e.minZ+e.maxZ)/2],friction:.6,restitution:.5,collisionGroups:to},t)})]})}var oo={x:0,y:0,z:0},so={half:.62,y:.95,mass:4,maxSpeed:12,maxImpulse:600*Xa,teleport:1.5};function co(){let e=D(e=>e.camera),t=(0,N.useRef)(null),n=(0,N.useMemo)(()=>({x:0,y:so.y,z:0}),[]),r=(0,N.useMemo)(()=>({x:0,y:0,z:0}),[]),i=(0,N.useRef)({x:NaN,z:NaN});return mn(()=>{let a=t.current;if(!a)return;let{x:o,z:s}=e.position,c=i.current,l=o===c.x&&s===c.z;if(c.x=o,c.z=s,l&&a.isSleeping())return;let u=a.translation(),d=o-u.x,f=s-u.z,p=Math.hypot(d,f);if(p>so.teleport){n.x=o,n.z=s,a.setTranslation(n,!0),a.setLinvel(oo,!0);return}if(l&&p<.002){a.setLinvel(oo,!1);return}let m=so.maxImpulse*Math.min(1,Math.max(.1,(.7-p)/.4)),h=p>0?Math.min(1/Xa,so.maxSpeed/p):0,g=a.linvel();r.x=so.mass*(d*h-g.x),r.z=so.mass*(f*h-g.z);let _=Math.hypot(r.x,r.z);_>m&&(r.x*=m/_,r.z*=m/_),a.applyImpulse(r,!0)}),(0,W.jsx)(H,{ref:t,colliders:!1,position:[e.position.x,so.y,e.position.z],gravityScale:0,enabledTranslations:[!0,!1,!0],lockRotations:!0,children:(0,W.jsx)(In,{args:[so.half,ft],mass:so.mass,restitution:0,friction:.2,collisionGroups:Qa})})}var lo={x:0,y:0,z:0,w:1};function uo(e,t){e.setTranslation(t.start,!0),e.setRotation(lo,!0),e.setLinvel(oo,!0),e.setAngvel(oo,!0)}var fo=1500,po=2.5,mo=new A;function ho({def:e}){let t=M(t=>t.held?.kind===`ball`&&t.held.id===e.id),n=Ze(t?null:{id:`toy:${e.id}`,label:`Pick up ball`,action:{kind:`pickup`,toyId:e.id}},po);return E(({camera:r})=>{let i=n.current;if(!i)return;let a=t&&i.getWorldPosition(mo).distanceTo(r.position)<e.r+.12;i.visible===a&&(i.visible=!a)}),(0,W.jsx)(`group`,{ref:n,children:(0,W.jsx)(Vr,{def:e})})}function go({floor:e}){let t=Pr[e],{world:n}=R(),r=D(e=>e.camera),i=(0,N.useRef)([]),a=(0,N.useMemo)(()=>t.map((e,t)=>e=>void(i.current[t]=e)),[t]);(0,N.useEffect)(()=>(mt(()=>({bodies:n.bodies.len(),balls:t.map((e,t)=>{let n=i.current[t],r=n?n.translation():e.start;return{id:e.id,x:r.x,y:r.y,z:r.z,sleeping:!n||n.isSleeping()}})})),()=>{mt(null),Xe()}),[n,t]);let o=(0,N.useRef)(0),s=(0,N.useRef)([]);hn((0,N.useCallback)(()=>{if(!(++o.current%15))for(let e=0;e<t.length;e++){let n=i.current[e];n&&!n.isSleeping()&&Fr(n.translation())&&(uo(n,t[e]),s.current[e]=!0)}},[t]));let c=(0,N.useRef)(-1),l=(0,N.useRef)(0),u=(0,N.useRef)([]),d=(0,N.useRef)([]),f=(0,N.useMemo)(()=>({x:0,y:0,z:0}),[]),p=(0,N.useMemo)(()=>({x:0,y:0,z:0}),[]),m=(0,N.useMemo)(()=>({eye:r.position,pitch:0,yaw:0}),[r]),h=(0,N.useMemo)(()=>({rim:nr(e),square:rr(e)}),[e]),g=(0,N.useCallback)(e=>{e.setGravityScale(0,!0),e.setLinearDamping(0),e.setAngularDamping(3),e.collider(0).setCollisionGroups(eo)},[]),_=(0,N.useCallback)((e,n)=>{let a=i.current[e];if(!a)return;let o=t[e];if(a.setGravityScale(1,!0),a.setAngularDamping(o.damping),u.current[e]=performance.now()+fo,n===null){a.setLinearDamping(o.damping),f.x=Be.x*.5,f.y=0,f.z=Be.z*.5,a.setLinvel(f,!0);return}m.pitch=r.rotation.x,m.yaw=r.rotation.y;let s=o.throwSpeed??Qe.hard,c=a.translation();(o.kind!==`basketball`||!Ke(m,c,n,s,h,f))&&dt(m,c,n,s,Be,f),a.setLinearDamping(Qe.flightDamping),a.setLinvel(f,!0),d.current[e]=!0},[r,t,h,f,m]),v=(0,N.useMemo)(()=>t.map((e,t)=>()=>{d.current[t]&&(d.current[t]=!1,i.current[t]?.setLinearDamping(e.damping))}),[t]),y=(0,N.useCallback)((e,t,n)=>{m.pitch=r.rotation.x,m.yaw=r.rotation.y;let i=n===null?0:st(performance.now()-n)*Te.windUp;ke(m,t,i,p);let a=e.translation(),o=p.x-a.x,s=p.y-a.y,c=p.z-a.z,l=Math.hypot(o,s,c),u=l>0?Math.min(Te.follow,Te.maxSpeed/l):0;return f.x=o*u,f.y=s*u,f.z=c*u,e.setLinvel(f,!0),l},[p,r,f,m]);mn((0,N.useCallback)(()=>{let e=M.getState(),n=-1;if(e.held?.kind===`ball`)for(let r=0;r<t.length;r++)t[r].id===e.held.id&&(n=r);let a=c.current;if(n!==a){a>=0&&_(a,it(t[a].id));let e=n>=0?i.current[n]:null;e&&(g(e),qr(t[n].kind,e.translation()),d.current[n]=!1,u.current[n]=0),c.current=e?n:-1,l.current=0}let o=c.current;if(o>=0){let n=i.current[o];n&&y(n,t[o].r,e.chargeAt)>Te.lost?(l.current+=Xa,l.current>Te.lostFor&&Xe()):l.current=0}let s=performance.now();for(let e=0;e<t.length;e++){let n=u.current[e];if(!n)continue;let a=i.current[e];if(!a)continue;let o=a.translation();(s>n||Math.hypot(o.x-r.position.x,o.z-r.position.z)>t[e].r+.3+.15)&&(u.current[e]=0,a.collider(0).setCollisionGroups($a))}},[r,t,g,_,y]));let b=(0,N.useMemo)(()=>t.map(()=>({x:0,y:0,z:0})),[t]),x=(0,N.useRef)([]),S=(0,N.useRef)(30);(0,N.useEffect)(()=>void(S.current=30),[t]);let C=(0,N.useMemo)(()=>nr(e),[e]);return mn((0,N.useCallback)(()=>{for(let e=0;e<t.length;e++){let t=i.current[e];if(!t)continue;let n=t.linvel();b[e].x=n.x,b[e].y=n.y,b[e].z=n.z}},[b,t])),hn((0,N.useCallback)(e=>{if(S.current>0&&S.current--)return;let n=performance.now(),r=e.gravity.y*Xa;for(let e=0;e<t.length;e++){let a=i.current[e];if(s.current[e]){s.current[e]=!1;continue}if(!a||e===c.current||a.isSleeping())continue;let o=a.linvel(),l=b[e],u=hi(Math.hypot(o.x-l.x,o.y-l.y-r*a.gravityScale(),o.z-l.z));if(!u||!gi(x.current[e]??-1/0,n))continue;x.current[e]=n;let d=a.translation(),f=yi(d,t[e].r,C,Math.hypot(o.x,o.y,o.z)*Xa);f===`rim`?Wr({x:C.x,y:C.y,z:C.z},u):f===`board`?Gr(d,u):Ur(t[e].kind,d,u)}},[b,t,C])),t.map((e,t)=>(0,W.jsxs)(H,{ref:a[t],colliders:!1,position:[e.start.x,e.start.y,e.start.z],linearDamping:e.damping,angularDamping:e.damping,ccd:!0,userData:{toy:e.id},onCollisionEnter:v[t],children:[(0,W.jsx)(Fn,{args:[e.r],restitution:e.restitution,friction:.7,density:e.density,collisionGroups:$a}),(0,W.jsx)(ho,{def:e})]},e.id))}function _o({floor:e}){let t=M(e=>e.travel!==null);return(0,W.jsxs)(Sn,{timeStep:Xa,paused:t,numSolverIterations:8,children:[(0,W.jsx)(ao,{floor:e}),(0,W.jsx)(co,{}),(0,W.jsx)(go,{floor:e}),(0,W.jsx)(kr,{floor:e,groups:to}),(0,W.jsx)(Ya,{floor:e,groups:no,dockGroups:to}),(0,W.jsx)(di,{floor:e,groups:eo}),(0,W.jsx)(ji,{groups:eo}),(0,W.jsx)(pi,{floor:e,groups:ro})]})}var vo=(0,N.memo)(_o);export{vo as default};
@@ -1 +0,0 @@
1
- .xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}.games-list .game-card:first-of-type{margin-top:4px}.games-blurb{margin:0 2px 12px;line-height:1.45}.games-blurb kbd{font-size:.72rem}.game-card{width:100%;font-family:var(--font);color:var(--ink);text-align:left;border:2.5px solid var(--ink);box-shadow:0 3px 0 var(--ink);cursor:pointer;background:#fff;border-radius:16px;align-items:center;gap:12px;margin-bottom:12px;padding:10px 12px 10px 10px;transition:transform 60ms,box-shadow 60ms;display:flex}.game-card:hover{box-shadow:0 4px 0 var(--ink);transform:translateY(-1px)}.game-card:active{box-shadow:0 1px 0 var(--ink);transform:translateY(2px)}.game-thumb{border:2px solid var(--ink);background:color-mix(in srgb, var(--game) 22%, #fff);border-radius:12px;flex:none}.game-card-text{flex-direction:column;flex:1;gap:1px;min-width:0;display:flex}.game-card-text b{font-size:1.05rem}.game-card-what{color:var(--muted);font-size:.78rem;font-weight:500}.game-card-status{text-overflow:ellipsis;white-space:nowrap;font-size:.78rem;font-weight:600;overflow:hidden}.game-card-go{color:#fff;background:var(--game);border:2px solid var(--ink);text-shadow:0 1px #00000040;border-radius:50%;flex:none;place-items:center;width:30px;height:30px;font-size:.8rem;display:grid}.game{-webkit-user-select:none;user-select:none;flex-direction:column;flex:1;min-height:0;display:flex}.game-head{background:#fff;border-bottom:2px solid #1f1d2b14;align-items:center;gap:8px;padding:8px 10px;display:flex}.game-back{font-family:var(--font);color:var(--ink);cursor:pointer;background:0 0;border:2px solid #1f1d2b4d;border-radius:9px;padding:3px 9px 3px 6px;font-size:.82rem;font-weight:600}.game-back:hover{border-color:var(--ink)}.game-title{color:var(--ink);background:color-mix(in srgb, var(--game) 45%, #fff);border:2px solid var(--ink);border-radius:999px;padding:2px 10px;font-size:.95rem}.game-head-right{align-items:center;min-width:0;margin-left:auto;display:flex}.game-mini{width:32px;height:28px;color:var(--ink);border:2px solid var(--ink);box-shadow:0 2px 0 var(--ink);cursor:pointer;background:#fff;border-radius:9px;font-size:.85rem;line-height:1}.game-mini:active{box-shadow:none;transform:translateY(2px)}.game-chip{text-overflow:ellipsis;white-space:nowrap;border:2px solid var(--ink);background:#fff3b0;border-radius:999px;padding:2px 9px;font-size:.78rem;font-weight:600;overflow:hidden}.game-canvas-wrap{flex:1;justify-content:center;align-items:center;min-height:0;padding:6px 8px;display:flex;overflow:hidden}.game-canvas{touch-action:none;cursor:pointer}.game-keys{text-align:center;color:var(--muted);padding:2px 10px 8px;font-size:.7rem;line-height:1.7}.game-keys kbd{font-size:.66rem}.game-pads{justify-content:center;align-items:center;gap:7px;padding:2px 10px 8px;display:flex}.game-pad-gap{width:10px}.game-pad{width:46px;height:42px;font-family:var(--font);color:var(--ink);border:2.5px solid var(--ink);box-shadow:0 3px 0 var(--ink);cursor:pointer;touch-action:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;background:#fff;border-radius:12px;place-items:center;padding:0;font-size:1.15rem;line-height:1;display:grid}.game-pad:active{box-shadow:0 1px 0 var(--ink);background:#f3f0ff;transform:translateY(2px)}.game-pad-round{background:#eadcff;border-radius:50%;width:46px;height:46px}.game-pad-hot{background:#ffc93c}.game-dpad{grid-template-columns:repeat(3,46px);grid-template-areas:".up.""left down right";justify-content:center;gap:5px 7px;padding:0 10px 6px;display:grid}.game-dpad .game-pad{height:38px}.game-pad-up{grid-area:up}.game-pad-left{grid-area:left}.game-pad-right{grid-area:right}.game-pad-down{grid-area:down}.pet-say{border:2.5px solid var(--ink);min-height:2.3em;box-shadow:0 3px 0 var(--ink);background:#fff;border-radius:14px;align-items:center;margin:10px 14px 2px;padding:7px 12px;font-size:.85rem;font-weight:600;line-height:1.3;display:flex;position:relative}.pet-say:after{content:"";border-right:2.5px solid var(--ink);border-bottom:2.5px solid var(--ink);background:#fff;width:12px;height:12px;position:absolute;bottom:-9px;left:50%;transform:translate(-50%)rotate(45deg)}.pet .game-canvas-wrap{padding-top:10px}.pet-bars{gap:5px;padding:2px 16px 6px;display:grid}.pet-bar{grid-template-columns:82px 1fr;align-items:center;font-size:.8rem;font-weight:600;display:grid}.pet-meter{border:2px solid var(--ink);background:#eef0f6;border-radius:999px;height:13px;overflow:hidden}.pet-meter i{border-right:2px solid var(--ink);border-radius:999px;height:100%;transition:width .5s ease-out;display:block}.pet-bar-low .pet-meter{animation:1s ease-in-out infinite pet-low}@keyframes pet-low{50%{border-color:var(--bad);box-shadow:0 0 0 2px #ef476f59}}.pet-actions{grid-template-columns:repeat(4,1fr);gap:6px;padding:4px 12px 6px;display:grid}.pet-act{flex-direction:column;align-items:center;gap:1px;padding:5px 2px;display:flex}.pet-act-icon{font-size:1.25rem;line-height:1.2}.pet-unbox{grid-column:1/-1;margin:4px 0 12px}:root{--ink:#1f1d2b;--paper:#fffdf6;--muted:#6c7086;--good:#2dc653;--bad:#ef476f;--warn:#ffb703;--accent:#ff8a5b;--font:Fredoka, "Segoe UI", system-ui, sans-serif;--mono:"JetBrains Mono", Consolas, monospace;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}*{box-sizing:border-box}html,body,#root{height:100%;font-family:var(--font);color:var(--ink);background:#bfe3ff;margin:0;overflow:hidden}canvas{display:block}a{color:#3a56d4}kbd{border:2px solid var(--ink);min-width:1.6em;font-family:var(--font);text-align:center;background:#fff;border-bottom-width:4px;border-radius:6px;margin:0 .1em;padding:0 .4em;font-size:.85em;font-weight:600;line-height:1.5;display:inline-block}code{font-family:var(--mono);background:#0000000f;border-radius:5px;padding:1px 5px;font-size:.85em}.muted{color:var(--muted)}.small{font-size:.85rem}.spacer{flex:1}.grow{flex:1;min-width:0}.nowrap{white-space:nowrap}.btn{font-family:var(--font);border:2.5px solid var(--ink);color:var(--ink);box-shadow:0 3px 0 var(--ink);cursor:pointer;white-space:nowrap;background:#fff;border-radius:12px;padding:8px 14px;font-size:.95rem;font-weight:600;transition:transform 60ms,box-shadow 60ms}.btn:hover:not(:disabled){box-shadow:0 4px 0 var(--ink);transform:translateY(-1px)}.btn:active:not(:disabled){box-shadow:0 1px 0 var(--ink);transform:translateY(2px)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn-good{background:#80ed99}.btn-bad{background:#ff8fa3}.btn-ghost{box-shadow:none;background:0 0;border-color:#1f1d2b59}.btn-small{box-shadow:0 2px 0 var(--ink);border-width:2px;border-radius:9px;padding:4px 10px;font-size:.82rem}.btn-ghost.btn-small{box-shadow:none}.btn-big{background:var(--accent);color:#fff;text-shadow:0 2px #0003;box-shadow:0 5px 0 var(--ink);border-radius:18px;padding:14px 32px;font-size:1.3rem}a.btn{text-decoration:none;display:inline-block}input,textarea,select{font-family:var(--font);color:var(--ink);background:#fff;border:2px solid #1f1d2b40;border-radius:10px;outline:none;width:100%;padding:8px 10px;font-size:.95rem}input:focus,textarea:focus,select:focus{border-color:var(--accent)}input[type=checkbox],input[type=radio]{width:auto;accent-color:var(--accent)}input[type=color]{width:42px;height:34px;padding:2px}textarea{resize:vertical}textarea.msg-box{resize:none;flex:1;min-width:0;max-height:calc(8.1em + 20px);line-height:1.35;overflow-y:auto}input.inline{background:0 0;border-color:#0000;padding:4px 6px}input.inline:hover,input.inline:focus{background:#fff;border-color:#1f1d2b40}.row{align-items:center;gap:8px;margin:6px 0;display:flex}.row.wrap{flex-wrap:wrap}.toggle{cursor:pointer;align-items:center;gap:6px;font-size:.92rem;display:inline-flex}.toggle.block{align-items:flex-start;margin:8px 0;display:flex}.pill,.chip{border:2px solid var(--ink);background:#fff;border-radius:999px;align-items:center;gap:4px;padding:3px 10px;font-size:.8rem;font-weight:600;display:inline-flex}.chip{color:var(--ink);border-width:1.5px;padding:1px 8px;font-size:.72rem;text-decoration:none}.chip-good,.pill-ok{background:#b9fbc0}.pill-bad{background:#ffc2d1}.pill-demo{background:#ffd166}.dot{border:2px solid var(--ink);border-radius:50%;width:12px;height:12px;display:inline-block}.agent-chip{align-items:center;gap:5px;font-size:.85rem;font-weight:600;display:inline-flex}.status{border:2px solid var(--ink);text-transform:uppercase;letter-spacing:.03em;border-radius:999px;padding:1px 9px;font-size:.75rem;font-weight:600;display:inline-block}.status-idle{background:#e9ecef}.status-preparing{background:#ffe066}.status-working{background:#74c0fc}.status-done{background:#8ce99a}.status-error{background:#ffa8a8}.status-stopped{background:#dee2e6}.status-installing,.status-starting{background:#ffe066}.status-running{background:#8ce99a}.status-unconfigured{background:#e9ecef}.hud{pointer-events:none;z-index:10;position:fixed;inset:0}.hud>*{pointer-events:auto}.hud-floor{background:var(--paper);border:3px solid var(--ink);box-shadow:0 4px 0 var(--ink);border-radius:18px;align-items:center;gap:12px;max-width:min(520px,100vw - 32px);padding:8px 16px 8px 8px;display:flex;position:absolute;top:16px;left:16px}.floor-num{background:var(--accent);border:3px solid var(--ink);color:#fff;text-shadow:0 2px #00000040;border-radius:12px;flex:none;place-items:center;width:46px;height:46px;font-size:1.5rem;font-weight:700;display:grid}.floor-name{text-overflow:ellipsis;white-space:nowrap;font-size:1.1rem;font-weight:700;overflow:hidden}.floor-sub{color:var(--muted);font-size:.85rem}.hud-status{flex-wrap:wrap;justify-content:flex-end;gap:6px;max-width:50vw;display:flex;position:absolute;top:16px;right:16px}.hud-banner{border:3px solid var(--ink);background:#ffe066;border-radius:14px;max-width:90vw;padding:8px 16px;font-weight:600;position:absolute;top:84px;left:50%;transform:translate(-50%)}.office-chip{max-width:min(420px,100vw - 32px);font-family:var(--font);color:var(--ink);border:2px solid var(--ink);box-shadow:0 3px 0 var(--ink);cursor:pointer;text-align:left;background:#ffe8a3;border-radius:999px;padding:5px 12px;font-size:.8rem;font-weight:600;position:absolute;top:100px;left:16px}.office-chip:hover{transform:translateY(-1px)}.office-chip:focus-visible{outline:3px solid var(--accent,#ff8a5b);outline-offset:2px}.crosshair{border:2px solid var(--ink);pointer-events:none;background:#fff;border-radius:50%;width:8px;height:8px;margin:-4px 0 0 -4px;transition:transform .15s;position:absolute;top:50%;left:50%}.crosshair-hot{background:var(--accent);transform:scale(1.8)}.hud-hint{background:var(--paper);border:3px solid var(--ink);box-shadow:0 4px 0 var(--ink);white-space:nowrap;pointer-events:none;border-radius:14px;padding:8px 16px;font-size:1.05rem;font-weight:600;position:absolute;bottom:22%;left:50%;transform:translate(-50%)}.hud-held{font-size:.95rem;bottom:calc(22% - 56px)}.charge{border:2px solid var(--ink);background:var(--paper);opacity:0;pointer-events:none;border-radius:6px;width:56px;height:9px;margin-left:-28px;transition:opacity .1s;position:absolute;top:calc(50% + 14px);left:50%;overflow:hidden}.charge-on{opacity:1}.charge-fill{transform-origin:0;background:#ffd166;height:100%;transform:scaleX(0)}.charge-full .charge-fill{background:#ff8a5b}.hud-ammo{background:var(--paper);border:3px solid var(--ink);box-shadow:0 4px 0 var(--ink);pointer-events:none;border-radius:14px;flex-direction:column;align-items:flex-end;gap:4px;padding:8px 14px;font-weight:700;display:flex;position:absolute;bottom:72px;right:16px}.hud-ammo-count{font-variant-numeric:tabular-nums;font-size:1.15rem}.hud-ammo-empty .hud-ammo-count{color:#ef476f}.hud-ammo-note{opacity:.75;font-size:.8rem;font-weight:600}.hud-ammo-bar{border:2px solid var(--ink);border-radius:6px;width:100%;min-width:110px;height:8px;overflow:hidden}.hud-ammo-fill{transform-origin:0;background:#ffd166;height:100%;transform:scaleX(0)}.hud-resume{color:#fff;text-shadow:0 2px 0 var(--ink), 0 0 6px var(--ink);pointer-events:none;font-weight:600;position:absolute;top:calc(50% + 26px);left:50%;transform:translate(-50%)}.workers{background:var(--paper);border:3px solid var(--ink);width:min(360px,100vw - 32px);max-height:calc(100vh - 180px);box-shadow:0 4px 0 var(--ink);border-radius:18px;flex-direction:column;display:flex;position:absolute;top:60px;right:16px;overflow:hidden}.workers-closed{width:auto}.wk-head{font-family:var(--font);letter-spacing:.08em;text-transform:uppercase;color:var(--ink);cursor:pointer;text-align:left;background:0 0;border:0;justify-content:space-between;align-items:center;gap:12px;padding:8px 14px;font-size:.8rem;font-weight:600;display:flex}.wk-head b{color:#1e9e45}.wk-chevron{color:var(--muted);letter-spacing:0;text-transform:none}.wk-list{padding:0 6px 6px;overflow-y:auto}.wk-empty{color:var(--muted);padding:4px 10px 8px;font-size:.85rem}.wk-row{width:100%;font-family:var(--font);color:var(--ink);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:10px;padding:5px 8px 5px 26px;display:grid}.wk-row:hover{background:#1f1d2b0f}.wk-dot{border:2px solid var(--ink);border-radius:50%;width:12px;height:12px}.wk-main{flex-direction:column;min-width:0;display:flex}.wk-name{white-space:nowrap;text-overflow:ellipsis;font-size:.95rem;font-weight:600;overflow:hidden}.wk-task{color:var(--muted);margin-left:6px;font-size:.78rem;font-weight:500}.wk-line{gap:6px;min-width:0;display:flex}.wk-last{min-width:0;font-family:var(--mono);color:var(--muted);white-space:nowrap;text-overflow:ellipsis;flex:auto;font-size:.72rem;overflow:hidden}.wk-last-text{font-family:var(--font);color:var(--ink);font-size:.8rem}.wk-last-thinking{font-style:italic}.wk-last-error{color:var(--bad)}.wk-ago{color:var(--muted);flex:none;font-size:.72rem}.wk-group+.wk-group{margin-top:4px}.wk-group-head{width:100%;font-family:var(--font);letter-spacing:.05em;text-transform:uppercase;color:var(--muted);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:10px;align-items:center;gap:8px;padding:6px 8px 2px;font-size:.75rem;font-weight:600;display:flex}.wk-group-head:hover{color:var(--ink)}.wk-group-arrow{width:10px}.wk-swatch{border:2px solid var(--ink);border-radius:4px;flex:none;width:12px;height:12px}.wk-group-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--ink);overflow:hidden}.wk-group-count{color:var(--ink);background:#1f1d2b14;border-radius:999px;margin-left:auto;padding:0 7px}@media (width<=700px){.workers{display:none}}.hud-help{pointer-events:none;background:#fffdf6d9;border-radius:12px;padding:6px 10px;font-size:.85rem;position:absolute;bottom:14px;left:16px}.stats{z-index:60;font:10px/1.2 var(--mono);color:#7cffb2;white-space:nowrap;pointer-events:none;background:#15151fcc;border-bottom-right-radius:8px;padding:1px 8px;position:fixed;top:0;left:0}.fade{opacity:0;pointer-events:none;background:#15151f;place-items:center;transition:opacity .6s;display:grid;position:absolute;inset:0}.fade-in{opacity:1}.fade-label{color:#7cffb2;font-size:3rem;font-weight:700}.toasts{z-index:40;flex-direction:column;align-items:flex-end;gap:8px;max-width:min(420px,100vw - 32px);display:flex;position:absolute;bottom:16px;right:16px}.toast{background:var(--paper);border:3px solid var(--ink);box-shadow:0 4px 0 var(--ink);cursor:pointer;border-radius:14px;padding:10px 14px;font-weight:500;animation:.25s ease-out pop}.toast-success{background:#d8f9df}.toast-error{background:#ffd6de}@keyframes pop{0%{opacity:0;transform:translateY(12px)scale(.95)}}.start{z-index:50;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:radial-gradient(circle at 30% 20%,#ffd6a5bf,#74c0fccc);place-items:center;padding:16px;display:grid;position:fixed;inset:0}.start-card{background:var(--paper);border:4px solid var(--ink);width:min(640px,100%);box-shadow:0 8px 0 var(--ink);text-align:center;border-radius:28px;max-height:calc(100vh - 32px);padding:28px 32px;overflow:auto}.start-logo{color:var(--accent);font-size:4rem;line-height:1;animation:12s linear infinite spin;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}.start h1{margin:6px 0 4px;font-size:2.6rem}.start-tag{color:var(--muted);margin:0 0 16px;font-size:1.1rem}.start-list{text-align:left;gap:8px;margin:0 0 22px;padding:0;list-style:none;display:grid}.start-meta{color:var(--muted);flex-wrap:wrap;justify-content:center;align-items:center;gap:10px;margin-top:16px;display:flex}.overlay{z-index:30;background:#15151f59;place-items:center;padding:16px;animation:.15s ease-out fadein;display:grid;position:fixed;inset:0}@keyframes fadein{0%{opacity:0}}.panel{background:var(--paper);border:4px solid var(--ink);width:min(640px,100%);max-height:calc(100vh - 32px);box-shadow:0 8px 0 var(--ink);border-radius:24px;flex-direction:column;animation:.2s ease-out pop;display:flex;overflow:hidden}.panel-wide{width:min(1320px,100%);height:calc(100vh - 32px)}.panel-head{background:var(--accent);border-bottom:4px solid var(--ink);align-items:center;gap:10px;padding:12px 16px;display:flex}.panel-title{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:1.25rem;font-weight:700;overflow:hidden}.panel-title a{color:var(--ink)}.panel-x{border:3px solid var(--ink);cursor:pointer;background:#fff;border-radius:12px;flex:none;width:36px;height:36px;font-weight:700}.panel-body{flex-direction:column;flex:1;min-height:0;padding:16px;display:flex;overflow:auto}.help h3{margin:14px 0 4px}.help p{margin:0;line-height:1.55}.mouse-settings{border:2px solid var(--ink);background:#fff8ef;border-radius:12px;flex-direction:column;gap:8px;margin-top:10px;padding:10px 12px;display:flex}.mouse-sens{align-items:center;gap:10px;font-size:.92rem;display:flex}.mouse-sens input[type=range]{max-width:260px;accent-color:var(--accent,#ff8a5b);flex:1}.mouse-sens b{font-variant-numeric:tabular-nums;min-width:3.4em}.sound{gap:10px 18px}.sound-volume{flex:200px;align-items:center;gap:8px;max-width:340px;display:flex}.sound-volume input[type=range]{accent-color:var(--accent);background:0 0;border:0;flex:1;padding:0}.sound-pct{text-align:right;font-variant-numeric:tabular-nums;min-width:3.2em}.sound-groups{grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:6px 18px;margin-top:8px;display:grid}.sound-group-name{min-width:5.2em}.elevator{flex-direction:column;gap:10px;display:flex}.floor-btn{text-align:left;border:3px solid var(--ink);box-shadow:0 4px 0 var(--ink);cursor:pointer;font-family:var(--font);background:#fff;border-radius:16px;grid-template-rows:auto auto;grid-template-columns:54px 1fr;align-items:center;column-gap:12px;padding:10px;display:grid}.floor-btn:hover{transform:translateY(-1px)}.floor-btn-here{outline:3px dashed var(--accent);outline-offset:3px;background:#fff4e6}.floor-btn-num{border:3px solid var(--ink);background:var(--accent);color:#fff;text-shadow:0 2px #00000040;border-radius:50%;grid-row:span 2;place-items:center;width:54px;height:54px;font-size:1.5rem;font-weight:700;display:grid}.floor-btn-name{text-overflow:ellipsis;white-space:nowrap;font-size:1.1rem;font-weight:700;overflow:hidden}.floor-btn-meta{color:var(--muted);font-size:.85rem}.term-title{align-items:center;gap:10px;display:flex}.avatar{border:3px solid var(--ink);color:#fff;text-shadow:0 1px #0000004d;border-radius:50%;flex:none;place-items:center;width:34px;height:34px;font-weight:700;display:grid}.term-meta{flex-wrap:wrap;align-items:center;gap:6px 14px;margin-bottom:10px;font-size:.92rem;display:flex}.term-error{word-break:break-word;background:#ffe3e3;border:2px solid #ff8787;border-radius:10px;margin-bottom:8px;padding:6px 10px;font-size:.88rem}.term-split{flex:1;grid-template-columns:1fr;gap:12px;min-height:0;display:grid}.term-split-2{grid-template-columns:minmax(0,1.4fr) minmax(0,1fr)}.term{color:#e8e8f2;border:3px solid var(--ink);font-family:var(--mono);background:#1b1b29;border-radius:14px;min-height:200px;padding:12px 14px;font-size:13px;line-height:1.5;overflow:auto}.term-line{white-space:pre-wrap;word-break:break-word}.term-tool{color:#8be9fd}.term-result{color:#8d8da8}.term-system{color:#bd93f9}.term-error.term-line,.term-line.term-error{color:#ff6b6b;font-size:inherit;background:0 0;border:none;margin:0;padding:0}.term-manager{color:#ffb86c;font-weight:600}.term-done{color:#50fa7b;font-weight:600}.term-thinking{color:#f1fa8c;font-style:italic}.term-spin{color:#ff9e64;animation:1.4s ease-in-out infinite blink}.live-term{border:3px solid var(--ink);background:#1b1b29;border-radius:14px;flex-direction:column;min-width:0;min-height:200px;display:flex;overflow:hidden}.live-term-screen{flex:1;min-width:0;min-height:0;overflow:hidden}.live-term-screen .xterm{box-sizing:border-box;height:100%;padding:8px 4px 4px 10px}.live-term-foot{color:#8d8da8;border-top:1px solid #2c2c42;align-items:center;gap:8px;padding:4px 12px 6px;font-size:.78rem;display:flex}.live-dot{background:#55566e;border-radius:50%;flex:none;width:8px;height:8px}.live-dot-on{background:#50fa7b;box-shadow:0 0 6px #50fa7b}@keyframes blink{50%{opacity:.55}}.browser{flex-direction:column;gap:6px;min-height:0;display:flex}.browser-bar{border:3px solid var(--ink);text-overflow:ellipsis;white-space:nowrap;background:#e9ecf2;border-bottom:none;border-radius:14px 14px 0 0;padding:6px 12px;font-size:.85rem;overflow:hidden}.browser-view{border:3px solid var(--ink);background:#fff;border-radius:0 0 14px 14px;flex:1;min-height:0;margin-top:-6px;overflow:auto}.browser-view img{width:100%;display:block}.term-input{align-items:flex-end;gap:8px;margin-top:12px;display:flex}.term-actions{flex-wrap:wrap;align-items:center;gap:8px;margin-top:10px;display:flex}.term-actions select{width:auto;max-width:420px}.kanban-toolbar{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:12px;display:flex}.issue-form{background:#fff;border:3px dashed #1f1d2b4d;border-radius:16px;flex-direction:column;gap:8px;margin-bottom:12px;padding:12px;display:flex}.issue-form .row select{flex:1}.kanban{flex:1;grid-template-columns:repeat(4,minmax(220px,1fr));gap:12px;min-height:0;display:grid;overflow-x:auto}.kcol{border:3px solid var(--ink);background:#f4f1ea;border-radius:18px;flex-direction:column;min-height:0;display:flex;overflow:hidden}.kcol-head{border-bottom:3px solid var(--ink);padding:10px 12px;font-weight:700}.kcol-backlog .kcol-head{background:#ffd166}.kcol-progress .kcol-head{background:#4cc9f0}.kcol-review .kcol-head{background:#80ed99}.kcol-qa .kcol-head{background:#ff9f68}.kanban-5{grid-template-columns:repeat(5,minmax(210px,1fr))}.kcol-merged .kcol-head{background:#c77dff}.count{border:2px solid var(--ink);text-align:center;background:#fff;border-radius:999px;min-width:24px;padding:0 6px;font-size:.8rem;display:inline-block}.kcol-body{flex-direction:column;gap:8px;padding:10px;display:flex;overflow:auto}.kempty{padding:8px}.kcard{border:2.5px solid var(--ink);background:#fff;border-radius:12px;padding:8px 10px;box-shadow:0 3px #1f1d2bcc}.kcard-warn{background:#fff3d6}.kcard-bad{background:#ffe0e6}.kcard-good{background:#e3fbe7}.kcard-title{font-size:.92rem;font-weight:500;line-height:1.35}.kcard-title a{font-weight:700}.kcard-foot{align-items:center;gap:6px;margin-top:6px;display:flex}.kcard-foot select{width:auto;margin-left:auto;padding:3px 6px;font-size:.82rem}.kcard-foot-wrap{flex-wrap:wrap}.panel-app{width:100%;max-width:1600px}.panel-app .panel-body{padding:12px 16px}.app-title{align-items:center;gap:10px;min-width:0;display:flex}.app-title-name,.app-title-ref{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.app-title-name{flex:0 auto}.app-title-ref{color:var(--ink);opacity:.75;flex:0 2 auto;font-weight:500}.app-title .status{flex:none}.app-toolbar{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:10px;display:flex}.app-ref{flex:0 auto;width:260px;min-width:0;padding:5px 8px;font-size:.88rem}.seg{border:2px solid var(--ink);box-shadow:0 2px 0 var(--ink);border-radius:9px;display:inline-flex;overflow:hidden}.seg-btn{font-family:var(--font);color:var(--ink);cursor:pointer;white-space:nowrap;background:#fff;border:0;padding:4px 10px;font-size:.82rem;font-weight:600}.seg-btn+.seg-btn{border-left:2px solid var(--ink)}.seg-btn.seg-on{background:var(--accent)}.seg-btn:focus-visible{outline-offset:-3px;outline:3px solid #3a56d4}.app-stage{border:3px solid var(--ink);background:repeating-linear-gradient(45deg,#efeadf 0 12px,#f6f2e9 12px 24px);border-radius:14px;flex:1;justify-content:center;min-height:280px;display:flex;position:relative;overflow:hidden}.app-frame{background:#fff;border:0;width:100%;height:100%;display:block}.app-stage-phone .app-frame{border-left:3px solid var(--ink);border-right:3px solid var(--ink);width:396px;max-width:100%}.app-frame-hint{border:2.5px solid var(--ink);width:min(560px,100% - 24px);box-shadow:0 3px 0 var(--ink);background:#fff3d6;border-radius:12px;padding:10px 14px;font-size:.9rem;line-height:1.4;position:absolute;bottom:16px;left:50%;transform:translate(-50%)}.app-foot{margin:8px 0 0;line-height:1.4}.app-state{text-align:center;background:#fff;border:3px dashed #1f1d2b4d;border-radius:14px;flex-direction:column;flex:1;align-items:center;gap:10px;min-height:0;padding:24px 16px;display:flex;overflow:auto}.app-state h3{margin:0}.app-state p{max-width:560px;margin:0}.app-state-left{text-align:left;align-items:stretch}.app-state-left p{max-width:none}.app-state-icon{font-size:2.6rem;line-height:1}.app-spin{animation:2.4s linear infinite spin}.app-steps{text-align:left;color:var(--muted);margin:0;padding:0;font-weight:500;list-style:none}.app-steps li{padding:2px 0}.app-step-done{color:#1b873a}.app-step-now{color:var(--ink);font-weight:700}.app-log{text-align:left;white-space:pre-wrap;word-break:break-word;width:100%;max-width:900px;min-height:0;max-height:320px;margin:0;font-size:12px}.app-state-left .app-log{flex:0 auto;max-width:none}.app-settings{width:min(640px,100%)}.preview-form{flex-direction:column;gap:2px;display:flex}.preview-form input,.preview-form textarea{font-family:var(--mono);font-size:.85rem}.preview-form p{margin:2px 0 4px}.preview-details summary{cursor:pointer;font-weight:600}.preview-details summary code{word-break:break-all;font-weight:400}.preview-details[open] summary{margin-bottom:6px}.preview-details .status{font-size:.68rem}@media (width<=520px){.panel-app .panel-body{padding:10px}.app-ref{flex:100%;max-width:none}.app-toolbar .spacer,.app-title-ref{display:none}}.tabs{flex-wrap:wrap;gap:6px;margin-bottom:12px;display:flex}.tab{font-family:var(--font);border:2.5px solid var(--ink);cursor:pointer;background:#fff;border-radius:12px;padding:8px 14px;font-size:.95rem;font-weight:600}.tab-on{background:var(--accent);color:#fff;text-shadow:0 1px #00000040;box-shadow:0 3px 0 var(--ink)}.tab-body{flex:1;min-height:0;overflow:auto}.tab-grid{grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);align-items:start;gap:16px;display:grid}@media (width<=900px){.tab-grid{grid-template-columns:1fr}.kanban,.kanban-5{grid-template-columns:repeat(5,250px)}.term-split-2{grid-template-rows:minmax(200px,1fr) auto;grid-template-columns:1fr}}.section{margin:0 0 10px}.card{border:3px solid var(--ink);background:#fff;border-radius:18px;flex-direction:column;gap:6px;margin-bottom:12px;padding:12px 14px;display:flex}.card h3{margin:0 0 4px}.floor-card{border-left:12px solid var(--accent)}.floor-badge{background:var(--accent);border:2.5px solid var(--ink);color:#fff;text-shadow:0 1px #00000040;border-radius:10px;flex:none;place-items:center;width:36px;height:36px;font-weight:700;display:grid}.office-card{border-left:12px solid var(--ink)}.office-badge{text-shadow:none;background:#fff3c4}.office-card .grow{min-width:190px}.office-state{overflow-wrap:anywhere;font-weight:600}.office-state-ok{color:#1b873a}.office-state-busy{color:#9a5b00}.office-state-bad{color:#c0223b}.office-actions{flex:none;gap:6px;margin-left:auto;display:flex}.repo-list{border:2px solid #1f1d2b1f;border-radius:12px;flex-direction:column;gap:4px;max-height:260px;padding:6px;display:flex;overflow:auto}.repo-list.tall{max-height:520px}.repo-row{border-radius:10px;justify-content:space-between;align-items:center;gap:10px;padding:6px 8px;display:flex}.repo-row:hover{background:#fff4e6}.repo-row select{width:auto}.links{font-size:.85rem}.team{border-collapse:collapse;width:100%}.team td{vertical-align:middle;border-top:1.5px solid #1f1d2b14;padding:4px 6px}.team select{width:auto;padding:4px 6px}.field{flex-direction:column;gap:4px;margin:6px 0;font-size:.9rem;font-weight:600;display:flex}.wizard{text-align:left;width:min(680px,100%)}.wizard h1,.wizard .start-logo,.wizard .start-tag,.wizard h2,.wizard-icon{text-align:center}.wizard h2{margin:4px 0 6px;font-size:1.9rem}.wizard-icon{font-size:3rem;line-height:1.1}.wizard .start-logo{width:fit-content;margin:0 auto;display:block}.wizard .btn-big{margin:0 auto;display:block}.wizard-steps{justify-content:center;gap:8px;margin-bottom:10px;display:flex}.wizard-dot{border:2px solid var(--ink);background:#fff;border-radius:50%;width:12px;height:12px}.wizard-dot-done{background:#80ed99}.wizard-dot-on{background:var(--accent);transform:scale(1.25)}.wizard-nav{align-items:center;gap:10px;margin-top:18px;display:flex}.wizard-done{text-align:center;padding:10px 0}.wizard-done p{margin:6px 0}.ceo-setup{align-items:center;gap:18px;display:flex}.ceo-portrait{flex:none;width:120px;height:120px}.swatch{border:2.5px solid var(--ink);cursor:pointer;border-radius:50%;width:24px;height:24px;padding:0}.swatch-on{box-shadow:0 0 0 3px #fff, 0 0 0 5px var(--ink)}.picker{flex-direction:column;gap:8px;display:flex}.picker-tabs{flex-wrap:wrap;gap:6px;display:flex}.picker-tab{font-family:var(--font);border:2.5px solid var(--ink);cursor:pointer;white-space:nowrap;background:#fff;border-radius:12px;flex:1;padding:8px 10px;font-size:.88rem;font-weight:600}.picker-tab-on{background:var(--accent);color:#fff;text-shadow:0 1px #00000040;box-shadow:0 3px 0 var(--ink)}.picker-mode{flex-direction:column;gap:6px;display:flex}.picker-mode .row{margin:0}.folder-list{max-height:240px}.chip-warn{background:#fff3bf}.tour{z-index:45;background:var(--paper);border:3px solid var(--ink);border-left:10px solid var(--accent);width:min(390px,100vw - 32px);box-shadow:0 5px 0 var(--ink);border-radius:18px;padding:10px 14px;animation:.25s ease-out pop;position:fixed;bottom:16px;left:16px}.tour-cheer{border-left-color:var(--good);background:#eafbee}.tour-head{align-items:center;display:flex}.tour-count{color:var(--muted);font-size:.78rem;font-weight:700}.tour-title{margin:2px 0 4px;font-size:1.1rem;font-weight:700}.tour-body{font-size:.9rem;line-height:1.5}.tour-nav{align-items:center;margin-top:8px;display:flex}.ceo-term{flex:none;height:340px}.job-brief{margin:0 0 8px}.job-brief summary{cursor:pointer;font-weight:600}.job-brief .md{margin-top:4px;line-height:1.45}.setup-toggle{flex:none}.setup-toggle-on{background:var(--ink);color:#fff}.setup-wrap{flex:none}.setup-wrap+.term-split{min-height:260px}.agent-setup h3{margin:0}.setup-grid{grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:0 14px;display:grid}.agent-setup textarea{min-height:140px}.prompt-preview{margin:8px 0 4px}.prompt-preview summary{cursor:pointer;font-weight:600}.prompt-preview p{margin:4px 0}.prompt-text{max-height:320px;font-family:var(--mono);font-variant-ligatures:none;white-space:pre-wrap;overflow-wrap:anywhere;background:#f6f4ec;border:1px solid #1f1d2b26;border-radius:8px;margin:6px 0;padding:8px 10px;font-size:.75rem;line-height:1.45;overflow:auto}.prompt-preview mark{color:inherit;background:#ffe08a;border-radius:3px;box-shadow:0 0 0 2px #ffe08a}.confirm-overlay{z-index:60;background:#15151f73;place-items:center;padding:16px;animation:.12s ease-out fadein;display:grid;position:fixed;inset:0}.confirm{background:var(--paper);border:4px solid var(--ink);width:min(440px,100%);box-shadow:0 8px 0 var(--ink);text-align:center;border-radius:24px;padding:20px 22px 14px;animation:.18s ease-out pop}.confirm-danger{border-top:12px solid var(--bad)}.confirm-warn{border-top:12px solid var(--warn)}.confirm-good{border-top:12px solid var(--good)}.confirm-icon{font-size:2.4rem;line-height:1}.confirm h3{margin:8px 0 6px;font-size:1.25rem}.confirm-body{color:#4a4e69;margin-bottom:4px;line-height:1.5}.confirm-actions{justify-content:center;gap:10px;margin-top:14px;display:flex}.confirm-keys{margin-top:10px}.btn-warn{background:#ffd166}.badge{background:var(--bad);color:#fff;border:2px solid var(--ink);border-radius:999px;place-items:center;min-width:20px;height:20px;padding:0 6px;font-size:.72rem;font-weight:700;line-height:1;display:inline-grid}.toasts{bottom:88px}.phone-btn{font-family:var(--font);color:var(--ink);background:var(--paper);border:3px solid var(--ink);box-shadow:0 4px 0 var(--ink);cursor:pointer;border-radius:18px;align-items:center;gap:8px;padding:6px 14px 6px 8px;font-size:.9rem;font-weight:600;display:flex;position:absolute;bottom:16px;right:16px}.phone-btn:hover{transform:translateY(-1px)}.phone-btn-icon{font-size:1.7rem;line-height:1;display:inline-block}.phone-btn-ring .phone-btn-icon{animation:2.4s ease-in-out infinite ring}@keyframes ring{0%,72%,to{transform:rotate(0)}76%{transform:rotate(-16deg)}80%{transform:rotate(14deg)}84%{transform:rotate(-10deg)}88%{transform:rotate(8deg)}}.phone-btn-badge{position:absolute;top:-8px;left:26px}.phone-overlay{background:#15151f47;place-items:end;padding:16px 24px}.phone{border:4px solid var(--ink);width:min(400px,100%);height:min(760px,100vh - 32px);box-shadow:0 10px 0 var(--ink), inset 0 0 0 3px #3b3f5c;background:#23263a;border-radius:38px;flex-direction:column;padding:10px 10px 8px;animation:.22s ease-out slideup;display:flex}@keyframes slideup{0%{opacity:0;transform:translateY(40px)}}.phone-status{color:#e9e9f5;justify-content:space-between;align-items:center;padding:2px 16px 8px;font-size:.8rem;font-weight:600;display:flex}.phone-notch{background:#15151f;border-radius:999px;width:90px;height:18px}.phone-screen{background:var(--paper);border-radius:26px 26px 12px 12px;flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.phone-tabs{gap:4px;padding:8px 4px 2px;display:flex}.phone-tab{color:#b8bbd6;font-family:var(--font);cursor:pointer;background:0 0;border:none;border-radius:14px;flex-direction:column;flex:1;align-items:center;gap:2px;padding:6px 4px;font-size:.78rem;font-weight:600;display:flex}.phone-tab-on{color:#fff;background:#3b3f5c}.phone-tab-icon{font-size:1.3rem;position:relative}.badge-dot{min-width:18px;height:18px;font-size:.65rem;position:absolute;top:-6px;right:-14px}.phone-hint{text-align:center;color:#8e92b3;padding-top:4px;font-size:.72rem}.phone-hint kbd{font-size:.7rem}.phone-scroll{flex:1;padding:12px;overflow:auto}.phone-h{align-items:center;gap:6px;margin:10px 2px 8px;font-size:1rem;display:flex}.phone-h:first-child{margin-top:0}.phone-empty{padding:10px 6px;line-height:1.5}.linkish{color:#3a56d4;font-family:var(--font);cursor:pointer;text-align:left;background:0 0;border:none;padding:0;font-weight:600}.phone-chat{flex-direction:column;flex:1;min-height:0;display:flex}.chat-head{background:#fff;border-bottom:2px solid #1f1d2b14;align-items:center;gap:10px;padding:10px 12px;display:flex}.presence-busy{color:#d9480f;font-weight:600}.chat-log{background:#f4f1ea;flex-direction:column;flex:1;gap:8px;padding:10px;display:flex;overflow:auto}.bubble-row{display:flex}.bubble-row-me{justify-content:flex-end}.bubble{border:2px solid var(--ink);border-radius:16px;max-width:86%;padding:8px 11px 5px;font-size:.9rem;line-height:1.4}.bubble-them{background:#fff;border-bottom-left-radius:4px}.bubble-me{background:#ffd6a5;border-bottom-right-radius:4px}.bubble-from{color:var(--muted);font-size:.72rem;font-weight:700}.bubble-text{white-space:pre-wrap;overflow-wrap:anywhere}.bubble:has(.md pre,.md-table){width:86%}.md{overflow-wrap:anywhere;min-width:0}.md>:first-child{margin-top:0}.md>:last-child{margin-bottom:0}.md p,.md ul,.md ol,.md pre,.md blockquote,.md .md-table{margin:0 0 .55em}.md ul,.md ol{padding-left:1.3em}.md li>ul,.md li>ol{margin:.15em 0 .2em}.md li+li{margin-top:.15em}.md li>p{margin:0}.md h1,.md h2,.md h3,.md h4,.md h5,.md h6{margin:.7em 0 .3em;font-size:1em;line-height:1.25}.md h1{font-size:1.15em}.md h2{font-size:1.08em}.md h5,.md h6{color:var(--muted)}.md a{color:#3a56d4;overflow-wrap:anywhere;font-weight:600}.md a:focus-visible{outline:2px solid var(--accent);outline-offset:1px;border-radius:3px}.md-deadlink{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.md code{font-family:var(--mono);background:#1f1d2b14;border-radius:5px;padding:.1em .3em;font-size:.86em}.md pre,.md-table{contain:inline-size;overflow-x:auto}.md pre{background:#1f1d2b14;border-radius:8px;padding:7px 9px;line-height:1.35}.md pre code{white-space:pre;overflow-wrap:normal;background:0 0;padding:0}.md blockquote{color:#4a4e69;border-left:3px solid #1f1d2b40;padding:0 0 0 9px}.md hr{border:none;border-top:1.5px solid #1f1d2b26;margin:.6em 0}.md table{border-collapse:collapse;font-size:.9em}.md th,.md td{text-align:left;overflow-wrap:normal;border:1px solid #1f1d2b33;padding:3px 7px}.md th{background:#1f1d2b0f}.md td code{white-space:nowrap}.md input[type=checkbox]{vertical-align:middle;margin:0 4px 0 0}.md li:has(>input[type=checkbox]){margin-left:-1.1em;list-style:none}.bubble-time{text-align:right;color:var(--muted);margin-top:2px;font-size:.65rem}.bubble-office{text-align:center;color:#4a4e69;background:#1f1d2b12;border-radius:999px;align-self:center;max-width:92%;padding:3px 10px;font-size:.76rem}.bubble-typing{gap:4px;padding:10px 12px;display:flex}.bubble-typing span{background:var(--muted);border-radius:50%;width:7px;height:7px;animation:1.2s infinite typing}.bubble-typing span:nth-child(2){animation-delay:.15s}.bubble-typing span:nth-child(3){animation-delay:.3s}@keyframes typing{0%,60%,to{opacity:.5;transform:translateY(0)}30%{opacity:1;transform:translateY(-4px)}}.quick{background:#fff;gap:6px;padding:6px 10px 0;display:flex;overflow-x:auto}.quick-chip{font-family:var(--font);cursor:pointer;background:#fff;border:1.5px solid #1f1d2b4d;border-radius:999px;flex:none;padding:4px 10px;font-size:.75rem;font-weight:600}.quick-chip:hover{border-color:var(--accent)}.chat-input{background:#fff;align-items:flex-end;gap:6px;padding:8px 10px 10px;display:flex}.resume{border:3px solid var(--ink);color:var(--ink);background:#fff;border-radius:16px;flex-direction:column;gap:6px;margin-bottom:10px;padding:10px 12px;display:flex}.bubble .resume{border-width:2px;margin:6px 0 2px}.resume-letgo{background:#fff4f2}.resume-hot{box-shadow:0 0 0 4px var(--accent)}.resume-done{opacity:.75}.resume-head{align-items:center;gap:10px;display:flex}.resume-name{font-size:1.05rem;font-weight:700}.resume-title{color:var(--muted);font-size:.85rem;font-weight:600}.resume-meta{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.resume-reason{border-left:3px solid #1f1d2b33;padding-left:9px;font-size:.88rem;line-height:1.45}.resume-brief{background:#f6f3ec;border-radius:10px;margin:0;padding:8px;font-size:.82rem;line-height:1.45}.tiles{grid-template-columns:repeat(3,1fr);gap:8px;display:grid}.tile{border:2.5px solid var(--ink);text-align:center;background:#fff;border-radius:14px;padding:8px}.tile-value{white-space:nowrap;font-size:1.15rem;font-weight:700}.tile-label{color:var(--muted);font-size:.7rem;font-weight:600}.report{flex-direction:column;gap:6px;margin:0;padding:0;list-style:none;display:flex}.report li{background:#fff;border:2px solid #1f1d2b1f;border-radius:12px;align-items:flex-start;gap:8px;padding:7px 10px;font-size:.86rem;line-height:1.4;display:flex}.report li.report-good{background:#e7fbe9;border-color:#80ed99}.report li.report-warn{background:#fff4d6;border-color:#ffd166}.proj{border:2.5px solid var(--ink);border-left:10px solid var(--accent);background:#fff;border-radius:14px;margin-bottom:8px;padding:6px 10px 8px}.proj .row{margin:2px 0}.proj .floor-badge{width:30px;height:30px}.proj-name{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.proj-sum{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.proj-stats{flex-wrap:wrap;gap:10px;font-weight:600;display:flex}.proj-ready{color:#1b873a}@media (width<=520px){.phone-overlay{place-items:center;padding:8px}.phone-btn-label{display:none}}