wobnimo 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +18 -4
- package/README.md +38 -7
- package/dist/characters/bao.d.ts +6 -0
- package/dist/characters/bao.js +1 -0
- package/dist/characters/berry.d.ts +6 -0
- package/dist/characters/berry.js +1 -0
- package/dist/characters/boo.js +1 -1
- package/dist/characters/bumble.d.ts +6 -0
- package/dist/characters/bumble.js +1 -0
- package/dist/characters/cacti.d.ts +6 -0
- package/dist/characters/cacti.js +1 -0
- package/dist/characters/cap.d.ts +6 -0
- package/dist/characters/cap.js +1 -0
- package/dist/characters/drift.d.ts +6 -0
- package/dist/characters/drift.js +1 -0
- package/dist/characters/ember.d.ts +6 -0
- package/dist/characters/ember.js +1 -0
- package/dist/characters/hop.d.ts +6 -0
- package/dist/characters/hop.js +1 -0
- package/dist/characters/index.d.ts +11 -1
- package/dist/characters/index.js +11 -11
- package/dist/characters/inky.js +1 -1
- package/dist/characters/latte.d.ts +6 -0
- package/dist/characters/latte.js +1 -0
- package/dist/characters/microduck.js +1 -1
- package/dist/characters/miso.js +1 -1
- package/dist/characters/mochi.js +1 -1
- package/dist/characters/pebble.js +1 -1
- package/dist/characters/pip.js +1 -1
- package/dist/characters/rex.js +1 -1
- package/dist/characters/swirl.d.ts +6 -0
- package/dist/characters/swirl.js +1 -0
- package/dist/characters/tad.js +1 -1
- package/dist/characters/volt.js +1 -1
- package/dist/cli.js +1888 -0
- package/dist/element.d.ts +1 -1
- package/dist/element.js +9 -9
- package/dist/index-Cm5wWKoT.d.ts +12 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +6 -6
- package/dist/react.js +16 -16
- package/dist/wobnimo.js +12 -12
- package/package.json +14 -4
- package/skill/SKILL.md +719 -0
- package/skill/examples/bao.ts +73 -0
- package/skill/examples/berry.ts +97 -0
- package/skill/examples/boo.ts +87 -0
- package/skill/examples/bumble.ts +70 -0
- package/skill/examples/cacti.ts +79 -0
- package/skill/examples/cap.ts +59 -0
- package/skill/examples/drift.ts +74 -0
- package/skill/examples/ember.ts +78 -0
- package/skill/examples/hop.ts +66 -0
- package/skill/examples/inky.ts +168 -0
- package/skill/examples/latte.ts +73 -0
- package/skill/examples/microduck.ts +222 -0
- package/skill/examples/miso.ts +182 -0
- package/skill/examples/mochi.ts +78 -0
- package/skill/examples/pebble.ts +174 -0
- package/skill/examples/pip.ts +170 -0
- package/skill/examples/rex.ts +193 -0
- package/skill/examples/swirl.ts +69 -0
- package/skill/examples/tad.ts +117 -0
- package/skill/examples/volt.ts +214 -0
- package/skill/reference/recipes.md +551 -0
- package/skill/reference/spec.md +258 -0
- package/skill/templates/starter.ts +73 -0
- package/dist/index-DRDEWSGV.d.ts +0 -8
package/dist/react.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {useRef,useEffect}from'react';import {jsx}from'react/jsx-runtime';var C=()=>U(new Float32Array(16));function U(t){return t.fill(0),t[0]=t[5]=t[10]=t[15]=1,t}function _(t,e,r){let a=new Float32Array(16);for(let o=0;o<4;o++)for(let i=0;i<4;i++)a[o*4+i]=e[i]*r[o*4]+e[4+i]*r[o*4+1]+e[8+i]*r[o*4+2]+e[12+i]*r[o*4+3];return t.set(a),t}function ee(t,e,r,a){return U(t),t[12]=e,t[13]=r,t[14]=a,t}function Te(t,e,r,a){return U(t),t[0]=e,t[5]=r,t[10]=a,t}function X(t,e,r,a){let o=Math.cos(e),i=Math.sin(e),s=Math.cos(r),n=Math.sin(r),l=Math.cos(a),f=Math.sin(a);return U(t),t[0]=l*s,t[1]=f*s,t[2]=-n,t[4]=l*n*i-f*o,t[5]=f*n*i+l*o,t[6]=s*i,t[8]=l*n*o+f*i,t[9]=f*n*o-l*i,t[10]=s*o,t}function te(t,e,r){let[a,o,i]=e,s=Math.cos(r),n=Math.sin(r),l=1-s;return U(t),t[0]=l*a*a+s,t[1]=l*a*o+n*i,t[2]=l*a*i-n*o,t[4]=l*a*o-n*i,t[5]=l*o*o+s,t[6]=l*o*i+n*a,t[8]=l*a*i+n*o,t[9]=l*o*i-n*a,t[10]=l*i*i+s,t}function xe(t,e){let[r,a,o,i,s,n,l,f,h,c,d,m,u,y,w,x]=e,M=r*n-a*s,E=r*l-o*s,z=r*f-i*s,O=a*l-o*n,P=a*f-i*n,F=o*f-i*l,b=h*y-c*u,V=h*w-d*u,N=h*x-m*u,I=c*w-d*y,B=c*x-m*y,j=d*x-m*w,D=M*j-E*B+z*I+O*N-P*V+F*b;if(!D)return U(t);let v=1/D;return t[0]=(n*j-l*B+f*I)*v,t[1]=(o*B-a*j-i*I)*v,t[2]=(y*F-w*P+x*O)*v,t[3]=(d*P-c*F-m*O)*v,t[4]=(l*N-s*j-f*V)*v,t[5]=(r*j-o*N+i*V)*v,t[6]=(w*z-u*F-x*E)*v,t[7]=(h*F-d*z+m*E)*v,t[8]=(s*B-n*N+f*b)*v,t[9]=(a*N-r*B-i*b)*v,t[10]=(u*P-y*z+x*M)*v,t[11]=(c*z-h*P-m*M)*v,t[12]=(n*V-s*I-l*b)*v,t[13]=(r*I-a*V+o*b)*v,t[14]=(y*E-u*O-w*M)*v,t[15]=(h*O-c*E+d*M)*v,t}function ve(t,e){let[r,a,o]=e;return [t[0]*r+t[4]*a+t[8]*o+t[12],t[1]*r+t[5]*a+t[9]*o+t[13],t[2]*r+t[6]*a+t[10]*o+t[14]]}function ye(t,e){let[r,a,o]=e;return [t[0]*r+t[4]*a+t[8]*o,t[1]*r+t[5]*a+t[9]*o,t[2]*r+t[6]*a+t[10]*o]}var R=(t,e,r)=>Math.min(r,Math.max(e,t)),Y=(t,e,r)=>t+(e-t)*r,we=(t,e,r)=>{let a=R((r-t)/(e-t),0,1);return a*a*(3-2*a)},Oe=t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2;function re(t){let e=Math.floor(t*4294967295)>>>0||1;return ()=>{e=e+1831565813>>>0;let r=e;return r=Math.imul(r^r>>>15,r|1),r^=r+Math.imul(r^r>>>7,r|61),((r^r>>>14)>>>0)/4294967296}}var k=class{constructor(e=0){this.x=e;}x;v=0;step(e,r,a,o){let i=a*Math.PI*2;return this.v+=(i*i*(e-this.x)-2*o*i*this.v)*r,this.x+=this.v*r,this.x}};var A0=[{round:0,open:1,weight:.34},{round:.08,open:.55,weight:.26},{round:.7,open:.85,weight:.24},{round:1,open:.5,weight:.16}],ae=class{constructor(e){this.random=e;this.silence=.15+e()*.3;}random;open=0;round=0;age=0;length=0;stress=0;silence=0;syllablesLeft=0;wordsLeft=0;reset(){this.age=this.length=this.open=0,this.syllablesLeft=this.wordsLeft=0,this.silence=.12;}update(e){if(this.silence>0){this.silence-=e,this.open=0;return}this.age+=e,this.age>=this.length&&this.next();let r=R(this.age/this.length,0,1);this.open=this.stress*Math.pow(Math.sin(Math.PI*r),.55);}next(){let e=this.random;this.age=0;let r=this.syllablesLeft===0;r&&(this.wordsLeft===0?(this.wordsLeft=3+Math.floor(e()*5),this.silence=this.length>0?.45+e()*.7:0):this.silence=.04+e()*.09,this.wordsLeft--,this.syllablesLeft=1+Math.floor(Math.pow(e(),1.6)*3)),this.syllablesLeft--;let a=r&&e()<.6,o=q0(A0,e());this.length=.12+e()*.13,this.stress=o.open*(a?.85+e()*.15:.5+e()*.35),this.round=o.round;}};function q0(t,e){for(let r of t){if(e<r.weight)return r;e-=r.weight;}return t[0]}var oe=["idle","thinking","listening","speaking","sleeping","working","error","surprised","celebrating","sad"],L=[...oe,"happy"],Z=Object.fromEntries(L.map((t,e)=>[t,e])),ke={idle:{lid:.06,squint:0,smile:.35,tilt:0,energy:1,flap:.05,glow:[.45,.7,1],exposure:1,wide:0,asym:0},thinking:{lid:.4,squint:0,smile:-0.15,tilt:.22,energy:.6,flap:0,glow:[1,.55,.12],exposure:1,wide:0,asym:0},listening:{lid:0,squint:0,smile:.2,tilt:-0.08,energy:.8,flap:.05,glow:[.25,1,.5],exposure:1,wide:.15,asym:0},speaking:{lid:.04,squint:.1,smile:.45,tilt:0,energy:1.2,flap:.1,glow:[.35,.82,1],exposure:1,wide:0,asym:0},sleeping:{lid:1,squint:0,smile:0,tilt:0,energy:.35,flap:0,glow:[.08,.09,.18],exposure:.84,wide:0,asym:0},working:{lid:.3,squint:.2,smile:.05,tilt:0,energy:1.3,flap:.18,glow:[.6,.45,1],exposure:1,wide:0,asym:0},error:{lid:.12,squint:.15,smile:-0.45,tilt:.1,energy:.9,flap:.25,glow:[1,.16,.12],exposure:.97,wide:.2,asym:1},surprised:{lid:0,squint:0,smile:0,tilt:0,energy:1,flap:.55,glow:[.95,.95,1],exposure:1.04,wide:1,asym:0},celebrating:{lid:0,squint:1,smile:1,tilt:0,energy:1.8,flap:.9,glow:[1,.72,.2],exposure:1.08,wide:0,asym:0},sad:{lid:.42,squint:0,smile:-0.85,tilt:-0.32,energy:.35,flap:-0.12,glow:[.22,.32,.7],exposure:.9,wide:0,asym:0},happy:{lid:0,squint:1,smile:1,tilt:0,energy:1.6,flap:.3,glow:[1,.42,.72],exposure:1.05,wide:0,asym:0}};var P0={float:0,hop:.16,squash:1,snap:1,look:1,snapLook:0,talkSquash:0},ie=.11,F0=1.8,se=class{temperament;state="idle";pointer=null;shown="idle";previous="idle";switched=10;time=0;since=0;random;yaw=new k;pitch=new k;roll=new k;squash=new k;hover;face={lid:new k,squint:new k,smile:new k(.3),tilt:new k,talk:new k,round:new k,gazeX:new k,gazeY:new k,flap:new k,energy:new k(1),exposure:new k(1),wide:new k,asym:new k};weights;glow=[...ke.idle.glow];jump=null;look={yaw:0,pitch:0,x:0,y:0};saccade={x:0,y:0,next:0};nextLook=.6;nextBlink;blinkAge=-1;nextHop;nextSide=4;side=1;nextNod=2.5;shake={start:-10,amount:0,next:0};sigh={start:-10,next:0};reactUntil=-1;speech;lastTalk=0;syllableArmed=true;matrices={a:C(),b:C()};pose;constructor(e={},r=.5){this.temperament={...P0,...e},this.random=re(r),this.speech=new ae(this.random),this.nextBlink=1+this.random()*3,this.nextHop=6+this.random()*6,this.hover=new k(this.temperament.float),this.weights=Object.fromEntries(L.map(a=>[a,new k(a==="idle"?1:0)])),this.pose={root:C(),minScale:1,lift:0,channels:{yaw:0,pitch:0,roll:0,flap:0,talk:0,energy:1},weights:Object.fromEntries(L.map(a=>[a,a==="idle"?1:0])),expression:"idle",faceA:[0,0,0,0],faceB:[0,0,0,0],faceC:[0,0,1,0],faceD:[0,0,0,0],glow:this.glow,exposure:1,events:[]};}setState(e){e!==this.state&&(this.state=e,this.since=0,e==="speaking"&&this.speech.reset(),this.nextLook=0);}poke(){this.hop(this.temperament.hop*1.5,this.random()<.5?1:-1),this.reactUntil=this.time+F0;}update(e){if(!(e>0))return;let r=Math.max(1,Math.ceil(e/(1/120)));for(let a=0;a<r;a++)this.step(e/r);}enter(e,r){let a=this.temperament;e==="surprised"?(this.hop(a.hop*.6,0),this.pitch.v+=1.2,this.startShake(r,.35,1/0)):e==="error"?(this.side=this.random()<.5?1:-1,this.squash.v-=2.5,this.startShake(r,1,r+2+this.random())):e==="celebrating"?this.nextHop=r:e==="sad"&&(this.sigh.next=r+1.2);}startShake(e,r,a){this.shake.start=e,this.shake.amount=r,this.shake.next=a;}hop(e,r){if(this.jump)return;let a=this.temperament.float>0;this.jump={age:a?ie:0,height:e,spin:r,lean:(this.random()-.5)*.3,air:.42+e*.45+(a?.25:0),landed:false};}step(e){this.time+=e,this.since+=e,this.switched+=e;let r=this.time,a=this.random,o=this.temperament,i=this.pose.events,s=r<this.reactUntil?"happy":this.state;s!==this.shown&&(this.previous=this.shown,this.shown=s,this.switched=0,i.push(`enter:${s}`),this.enter(s,r));let n=ke[s];r>this.nextLook&&(this.look.yaw=(a()-.5)*.75,this.look.pitch=(a()-.5)*.24,this.look.x=R(this.look.yaw*2.2,-1,1),this.look.y=a()<.3?.6:a()<.2?-0.6:0,this.nextLook=r+Y(1.4+a()*2.6,.45+a()*1.1,o.snapLook)),r>this.saccade.next&&(this.saccade.x=(a()-.5)*.22,this.saccade.y=(a()-.5)*.14,this.saccade.next=r+.25+a()*.7);let l=0,f=0,h=0,c=Math.sin(r*1.9)*.008,d=0,m=0,u=0,y=0,w=n.flap,x=1.3,M=.62,E=o.float,z=this.pointer,O=z&&(s==="idle"||s==="listening"||s==="speaking"||s==="surprised");switch(s){case "idle":l=this.look.yaw,f=this.look.pitch,h=-this.look.yaw*.16,d=this.look.x,m=this.look.y,r>this.nextHop&&(this.hop(o.hop*(.9+a()*.4),a()<.35?a()<.5?1:-1:0),this.nextHop=r+7+a()*7);break;case "thinking":{r>this.nextSide&&(this.side=-this.side,this.nextSide=r+3+a()*2);let g=this.side;l=.24*g+Math.sin(r*.9)*.05,f=.17+Math.sin(r*1.3)*.03,h=-0.13*g,d=.7*g,m=.8,x=.9;break}case "listening":l=-0.14,f=.02,h=.17,d=-0.2,r>this.nextNod&&(this.pitch.v-=.9,this.nextNod=r+2+a()*2.5);break;case "speaking":{l=Math.sin(r*.7)*.12,h=Math.sin(r*.9)*.05,this.speech.update(e),u=this.speech.open,y=this.speech.round,f=.04+u*.07,c+=u*.014,w+=Math.sin(r*2.6)*.1,x=1.8;break}case "sleeping":f=-0.3,h=.13,l=.06,c=Math.sin(r*1.15)*.016,u=.12+.1*Math.sin(r*1.15),y=.7,E*=.65,x=.55,M=.9,r>this.nextNod&&(this.pitch.v-=.5,this.nextNod=r+5+a()*4);break;case "working":l=Math.sin(r*.8)*.07,f=-0.13+Math.abs(Math.sin(r*5.2))*.03,h=Math.sin(r*.6)*.04,d=Math.sin(r*1.6)*.45,m=-0.55,w+=Math.sin(r*11)*.06,x=1.6;break;case "error":{r>this.shake.next&&this.startShake(r,.55,2.4+a()*1.4);let g=this.side;h=.16*g,l=-0.1*g,f=.05,d=.45*g,m=.3,u=.16,x=1.5;break}case "surprised":f=.1,u=.42,y=1,x=2.2,M=.5;break;case "celebrating":l=Math.sin(r*3.1)*.22,h=Math.sin(r*6.2)*.1,f=.14,u=.6+.12*Math.sin(r*7),y=.05,w+=Math.sin(r*9)*.25,x=2,r>this.nextHop&&(this.hop(o.hop*1.25,a()<.3?a()<.5?1:-1:0),this.nextHop=r+.85+a()*.4);break;case "sad":{r>this.sigh.next&&(this.sigh.start=r,this.sigh.next=r+4+a()*2.5);let g=Math.sin(R((r-this.sigh.start)/1.7,0,1)*Math.PI);f=-0.24+g*.1,l=Math.sin(r*.3)*.1,h=.08,d=-0.15,m=-0.65+g*.3,c+=g*.018,E*=.7,x=.7,M=.85;break}case "happy":l=Math.sin(r*2.2)*.18,h=Math.sin(r*4.4)*.12,f=.12,u=.5+.15*Math.sin(r*8),y=.2,r>this.nextHop&&(this.hop(o.hop*1.05,0),this.nextHop=r+1.05+a()*.4);break}O&&z&&(l=R(z.x,-1,1)*.55,f=R(-z.y,-1,1)*.32+(s==="speaking"?u*.07:0),h=-l*.12+(s==="listening"?.12:0),d=R(z.x*2,-1,1),m=R(-z.y*1.5,-1,1)),s!=="sleeping"&&(d+=this.saccade.x,m+=this.saccade.y),o.float>0&&(c+=Math.sin(r*1.5)*.035);let P=Y(x,x*3.2,o.snapLook)*o.snap,F=Y(M,.95,o.snapLook);this.yaw.step(l*o.look,e,P,F),this.pitch.step(f*o.look,e,P,F),this.roll.step(h,e,x*o.snap,M),this.hover.step(E,e,.6,.8);let b=this.face;b.lid.step(n.lid,e,2.2,.9),b.squint.step(n.squint,e,3,.8),b.smile.step(n.smile,e,2.4,.75),b.tilt.step(n.tilt*this.side,e,1.6,.8),b.talk.step(u,e,14,.8),b.round.step(y,e,6,.8),b.gazeX.step(d,e,7,.85),b.gazeY.step(m,e,7,.85),b.flap.step(w,e,2.4*o.snap,.5),b.energy.step(n.energy,e,.8,1),b.exposure.step(n.exposure,e,.4,1),b.wide.step(n.wide,e,5,.6),b.asym.step(n.asym*this.side,e,3,.8);for(let g of L)this.weights[g].step(g===s?1:0,e,1.6*o.snap,.95);let V=1-Math.exp(-e*4),N=s==="thinking"?.55+.45*Math.sin(r*4.2):s==="speaking"?.6+.6*b.talk.x:s==="working"?.75+.25*Math.sin(r*7):s==="error"?Math.sin(r*7)>0?1.1:.45:1;for(let g=0;g<3;g++)this.glow[g]=Y(this.glow[g],n.glow[g]*N,V);this.syllableArmed&&b.talk.x>.55&&this.lastTalk<=.55&&s==="speaking"&&(i.push("syllable"),this.syllableArmed=false),b.talk.x<.35&&(this.syllableArmed=true),this.lastTalk=b.talk.x;let I=0,B=0,j=0,D=0,v=this.jump;if(v)if(v.age+=e,v.age<ie)D=.14;else {let g=(v.age-ie)/v.air;g<1?(g<.06&&this.squash.x>.05&&(this.squash.v=-2.6),I=4*v.height*g*(1-g),B=v.spin*Math.PI*2*Oe(R(g*1.08,0,1)),j=v.lean*Math.sin(g*Math.PI),D=g<.5?-0.05:0):v.landed?v.age-ie-v.air>.35&&(this.jump=null):(v.landed=true,o.float===0&&(this.squash.v+=3.2,i.push("land")));}o.float>0&&(D*=.3),this.squash.step(D,e,3.2,.32),r>this.nextBlink&&(this.blinkAge=0,this.nextBlink=r+2.2+a()*3.5,a()<.2&&(this.nextBlink=r+.35));let Ae=0;this.blinkAge>=0&&(this.blinkAge+=e,Ae=Math.sin(R(this.blinkAge/.17,0,1)*Math.PI),this.blinkAge>.17&&(this.blinkAge=-1));let be=s==="sleeping",qe=Math.sin(r*(be?1.15:2.1))*(be?.024:.01),Pe=this.squash.x*o.squash+b.talk.x*.05*o.talkSquash,ge=1+Pe*.55-qe*.5,Fe=1-Pe+qe,Ie=I+c+this.hover.x,{a:$0,b:L0}=this.matrices,W=this.pose.root;ee(W,0,Ie,0),_(W,W,X($0,0,B,j)),_(W,W,Te(L0,ge,Fe,ge));let $=this.pose;$.minScale=Math.min(ge,Fe),$.lift=Ie,$.expression=s;let G=$.channels,Be=this.shake.amount*Math.max(0,1-(r-this.shake.start)/.6);G.yaw=this.yaw.x+Math.sin(r*31)*.06*Be,G.pitch=this.pitch.x,G.roll=this.roll.x+Math.sin(r*38)*.07*Be,G.flap=b.flap.x,G.talk=b.talk.x,G.energy=b.energy.x;let je=0;for(let g of L)je+=Math.max(0,this.weights[g].x);for(let g of L)$.weights[g]=Math.max(0,this.weights[g].x)/(je||1);$.faceA=[be?0:Ae,b.lid.x,b.squint.x,b.smile.x],$.faceB=[b.talk.x,b.gazeX.x,b.gazeY.x,b.tilt.x],$.faceC=[Z[this.shown],Z[this.previous],R(this.switched/.35,0,1),this.switched<.3?1-this.switched/.3:0],$.faceD=[this.since,b.round.x,b.wide.x,b.asym.x],$.exposure=b.exposure.x;}};var K=32,I0={z:0,bubble:1,sparkle:2,heart:3,note:4,arc:5,puff:6,ring:7,drop:8,spark:9,mote:10,feather:11,dot:12,exclaim:13,warning:14,confetti:15,cloud:16,star:17,gear:18},Ve={sleeping:[{glyph:"z",anchor:"top",rate:.55,offset:[.12,.04,.05],spread:.02,velocity:[.07,.13,0],jitter:.015,wobble:.05,life:[3,3.6],size:[.045,.12],rotation:-0.2,spin:.12,color:"#7f88ad"}],thinking:[{glyph:"dot",anchor:"top",rate:1.1,offset:[.16,.02,.06],spread:.01,velocity:[.05,.11,0],jitter:.01,wobble:.02,life:[1.5,1.8],size:[.012,.04],color:"#a3abc9"}],listening:[{glyph:"arc",anchor:"ear",rate:1.5,offset:[-0.4,0,.04],velocity:[.3,0,0],life:[1.05,1.2],size:[.1,.05],rotation:0,color:"#5cc489"}],syllable:[{glyph:"arc",anchor:"mouth",rate:2,offset:[.1,0,.06],mirror:true,velocity:[.24,.02,.04],jitter:.02,life:[.55,.7],size:[.03,.085],rotation:0,color:"#6aaee6"}],"enter:happy":[{glyph:"sparkle",anchor:"top",rate:7,spread:.22,velocity:[0,.3,.05],jitter:.4,gravity:.5,drag:1.5,life:[.7,1.1],size:[.06,0],spin:2.4,color:"#ffc94d"},{glyph:"heart",anchor:"top",rate:2,spread:.12,velocity:[0,.32,.05],jitter:.15,wobble:.06,life:[1,1.3],size:[.045,.08],color:"#ff6b8f"}],happy:[{glyph:"sparkle",anchor:"top",rate:2.5,spread:.35,velocity:[0,.14,0],jitter:.1,life:[.6,.9],size:[.045,0],spin:1.6,color:"#ffd166"}],working:[{glyph:"gear",anchor:"top",rate:.7,offset:[.12,.02,.05],spread:.03,velocity:[.05,.1,0],jitter:.02,wobble:.02,life:[2,2.4],size:[.035,.065],spin:2.2,color:"#a99cf0"},{glyph:"dot",anchor:"top",rate:2.2,offset:[-0.16,.06,.05],spread:.02,velocity:[-0.06,.14,0],jitter:.03,life:[.8,1.1],size:[.015,.006],color:"#c7bfff",glow:true}],"enter:error":[{glyph:"warning",anchor:"top",rate:1,offset:[.02,.12,.08],velocity:[0,.16,0],drag:2.2,life:[1.5,1.5],size:[.12,.1],color:"#ff4d3d"},{glyph:"spark",anchor:"top",rate:6,offset:[0,0,.05],velocity:[0,.4,0],jitter:1.3,gravity:1.6,life:[.25,.4],size:[.035,.015],color:"#ffd166",glow:true,align:true}],error:[{glyph:"puff",anchor:"top",rate:2.2,offset:[.02,.02,0],spread:.04,velocity:[0,.16,0],jitter:.05,wobble:.04,drag:.4,life:[1.3,1.7],size:[.04,.13],color:"#8b8fa3"}],"enter:surprised":[{glyph:"exclaim",anchor:"top",rate:1,offset:[.04,.14,.06],velocity:[0,.3,0],drag:3.5,life:[1.1,1.1],size:[.11,.08],rotation:-0.15,color:"#ffcc33"},{glyph:"spark",anchor:"top",rate:8,offset:[0,.02,.04],spread:.04,velocity:[0,.5,0],jitter:1.1,drag:4,life:[.3,.42],size:[.05,.02],color:"#ffe08a",align:true}],celebrating:[{glyph:"confetti",anchor:"top",rate:2.6,spread:.25,velocity:[0,.7,.05],jitter:.7,gravity:.9,drag:1.4,wobble:.06,life:[1.6,2.2],size:[.03,.026],spin:7,color:"#ff5d8f"},{glyph:"confetti",anchor:"top",rate:2.6,spread:.25,velocity:[0,.7,.05],jitter:.7,gravity:.9,drag:1.4,wobble:.06,life:[1.6,2.2],size:[.03,.026],spin:-6,color:"#ffc933"},{glyph:"confetti",anchor:"top",rate:2.6,spread:.25,velocity:[0,.7,.05],jitter:.7,gravity:.9,drag:1.4,wobble:.06,life:[1.6,2.2],size:[.03,.026],spin:8,color:"#4dc3ff"},{glyph:"confetti",anchor:"top",rate:2.6,spread:.25,velocity:[0,.7,.05],jitter:.7,gravity:.9,drag:1.4,wobble:.06,life:[1.6,2.2],size:[.03,.026],spin:-7,color:"#5ee08f"}],"enter:celebrating":[{glyph:"star",anchor:"top",rate:6,spread:.1,velocity:[0,.55,.05],jitter:.9,gravity:.6,drag:1.6,life:[.8,1.2],size:[.06,.02],spin:2,color:"#ffd23f"}],sad:[{glyph:"cloud",anchor:"top",rate:.42,offset:[-0.12,.22,.02],velocity:[0,0,0],wobble:.015,life:[2.6,2.6],size:[.15,.15],color:"#9aa3bd"},{glyph:"drop",anchor:"top",rate:4,offset:[-0.12,.16,.03],spread:.08,velocity:[0,-0.25,0],gravity:1.2,life:[.45,.6],size:[.018,.014],color:"#6aa8ff",align:true}],land:[{glyph:"puff",anchor:"feet",rate:7,spread:.1,velocity:[0,.05,0],jitter:.32,drag:3.5,life:[.45,.7],size:[.05,.12],color:"#c4cad9"}]};function B0(t){let e=parseInt(t.replace("#",""),16);return [(e>>16&255)/255,(e>>8&255)/255,(e&255)/255]}function Ne(t,e){return t==="drop"?Math.atan2(e[0],-e[1]):Math.atan2(e[1],e[0])}var ne=class{constructor(e,r){this.character=e;this.random=r;let a=e.spec.fx??{},o=new Set([...Object.keys(Ve),...Object.keys(a)].filter(i=>i!=="replace"));for(let i of o){let s=a[i]??[],n=a.replace?.includes(i)?s:[...Ve[i]??[],...s];this.emitters[i]=n.filter(l=>e.anchors[l.anchor]);}}character;random;a=new Float32Array(K*4);b=new Float32Array(K*4);c=new Float32Array(K*4);count=0;emitters={};carry=new Map;particles=[];update(e,r,a){for(let i of this.emitters[r.expression]??[])this.emitContinuous(i,e*r.weights[r.expression],a);for(let i of this.emitters.ambient??[])this.emitContinuous(i,e,a);for(let i of r.events)for(let s of this.emitters[i]??[])this.burst(s,s.rate,a);let o=[];for(let i of this.particles){if(i.age+=e,i.age>=i.life)continue;let s=i.spec;i.vel[1]-=(s.gravity??0)*e;let n=Math.max(0,1-(s.drag??0)*e);for(let l=0;l<3;l++)i.vel[l]*=n,i.pos[l]+=i.vel[l]*e;s.wobble&&(i.pos[0]+=Math.cos(i.age*3.1+i.seed*6.28)*s.wobble*e*3),i.rot=s.align?Ne(s.glyph,i.vel):i.rot+(s.spin??0)*e,o.push(i);}this.particles=o.slice(-K),this.pack();}emitContinuous(e,r,a){let o=(this.carry.get(e)??this.random())+e.rate*r,i=Math.floor(o);this.carry.set(e,o-i),i>0&&this.burst(e,i,a);}burst(e,r,a){let o=this.character.anchors[e.anchor],i=this.random;for(let s=0;s<r;s++){let n=e.mirror&&s%2===1?-1:1,l=e.offset??[0,0,0],f=e.spread??0,h=[o.at[0]+l[0]*n+(i()-.5)*2*f,o.at[1]+l[1]+(i()-.5)*2*f,o.at[2]+l[2]+(i()-.5)*2*f],c=e.jitter??0,d=[e.velocity[0]*n+(i()-.5)*2*c,e.velocity[1]+(i()-.5)*c,e.velocity[2]+(i()-.5)*2*c];this.particles.push({pos:a.point(o.bone,h),vel:d,age:0,life:e.life[0]+(e.life[1]-e.life[0])*i(),size:e.size,rot:e.align?Ne(e.glyph,d):n<0?Math.PI-(e.rotation??0):(e.rotation??0)+(e.spin?i():0),spec:e,color:B0(e.color),seed:i()});}}pack(){this.count=this.particles.length,this.particles.forEach((e,r)=>{let a=e.age/e.life,o=1-(1-a)*(1-a),i=we(0,.12,a)*(1-we(.62,1,a)),s=r*4;this.a.set([e.pos[0],e.pos[1],e.pos[2],e.size[0]+(e.size[1]-e.size[0])*o],s),this.b.set([I0[e.spec.glyph],i,e.rot,e.spec.glow?1:0],s),this.c.set([e.color[0],e.color[1],e.color[2],e.seed],s);});}};function T(t){let e=parseInt(t.replace("#",""),16),r=a=>Math.pow(a/255,2.2);return [r(e>>16&255),r(e>>8&255),r(e&255)]}var p=t=>{let e=Number(t.toFixed(5)).toString();return e.includes(".")||e.includes("e")?e:`${e}.0`},H=t=>`vec2(${p(t[0])}, ${p(t[1])})`,S=t=>`vec3(${p(t[0])}, ${p(t[1])}, ${p(t[2])})`;function De(t){let e=X(C(),t[0],t[1],t[2]);return `mat3(${[0,1,2].map(a=>[e[a],e[4+a],e[8+a]]).flat().map(p).join(", ")})`}function He(t){let e=["vec2 map(vec3 p) {"," vec2 r = vec2(1e9, 0.0);"," vec3 l;"],r=new Set,a=o=>(r.has(o)||(r.add(o),e.push(` vec3 b${o} = (uBones[${o}] * vec4(p, 1.0)).xyz;`)),`b${o}`);return t.spec.parts.forEach((o,i)=>{let s=a(t.boneIndex(o.bone,`parts[${i}]`)),n=o.at??[0,0,0],l=o.rot?`${De(o.rot)} * (${s} - ${S(n)})`:`${s} - ${S(n)}`;e.push(` l = ${l};`);let f=p(t.materialId(o.material,`parts[${i}]`));if(o.shape==="hem"){e.push(` r.x = smax(r.x, ${p(o.y)} + ${p(o.amplitude)} * sin(atan(l.z, l.x) * ${p(o.waves)} + uTime * ${p(o.speed)}) - l.y, ${p(o.blend)});`);return}let h=o.clip?`max(${_e(o)}, dot(l, ${S(j0(o.clip.normal))}) - ${p(o.clip.offset??0)})`:_e(o),c=p(o.blend??0);e.push(o.op==="sub"?` opSub(r, ${h}, ${c});`:` opAdd(r, ${h}, ${f}, ${c});`);}),e.push(...T0(t,a)),e.push(" r.x *= uScaleFix;"," return r;","}"),e.join(`
|
|
2
|
-
`)}function
|
|
3
|
-
`)}function
|
|
4
|
-
`)}function
|
|
1
|
+
import {useRef,useEffect}from'react';import {jsx}from'react/jsx-runtime';var L=()=>U(new Float32Array(16));function U(a){return a.fill(0),a[0]=a[5]=a[10]=a[15]=1,a}function H(a,e,t){let r=new Float32Array(16);for(let o=0;o<4;o++)for(let i=0;i<4;i++)r[o*4+i]=e[i]*t[o*4]+e[4+i]*t[o*4+1]+e[8+i]*t[o*4+2]+e[12+i]*t[o*4+3];return a.set(r),a}function e0(a,e,t,r){return U(a),a[12]=e,a[13]=t,a[14]=r,a}function T0(a,e,t,r){return U(a),a[0]=e,a[5]=t,a[10]=r,a}function X(a,e,t,r){let o=Math.cos(e),i=Math.sin(e),s=Math.cos(t),n=Math.sin(t),l=Math.cos(r),d=Math.sin(r);return U(a),a[0]=l*s,a[1]=d*s,a[2]=-n,a[4]=l*n*i-d*o,a[5]=d*n*i+l*o,a[6]=s*i,a[8]=l*n*o+d*i,a[9]=d*n*o-l*i,a[10]=s*o,a}function a0(a,e,t){let[r,o,i]=e,s=Math.cos(t),n=Math.sin(t),l=1-s;return U(a),a[0]=l*r*r+s,a[1]=l*r*o+n*i,a[2]=l*r*i-n*o,a[4]=l*r*o-n*i,a[5]=l*o*o+s,a[6]=l*o*i+n*r,a[8]=l*r*i+n*o,a[9]=l*o*i-n*r,a[10]=l*i*i+s,a}function x0(a,e){let[t,r,o,i,s,n,l,d,h,p,f,m,b,v,k,x]=e,R=t*n-r*s,C=t*l-o*s,z=t*d-i*s,O=r*l-o*n,P=r*d-i*n,F=o*d-i*l,u=h*v-p*b,V=h*k-f*b,N=h*x-m*b,j=p*k-f*v,I=p*x-m*v,B=f*x-m*k,D=R*B-C*I+z*j+O*N-P*V+F*u;if(!D)return U(a);let y=1/D;return a[0]=(n*B-l*I+d*j)*y,a[1]=(o*I-r*B-i*j)*y,a[2]=(v*F-k*P+x*O)*y,a[3]=(f*P-p*F-m*O)*y,a[4]=(l*N-s*B-d*V)*y,a[5]=(t*B-o*N+i*V)*y,a[6]=(k*z-b*F-x*C)*y,a[7]=(h*F-f*z+m*C)*y,a[8]=(s*I-n*N+d*u)*y,a[9]=(r*N-t*I-i*u)*y,a[10]=(b*P-v*z+x*R)*y,a[11]=(p*z-h*P-m*R)*y,a[12]=(n*V-s*j-l*u)*y,a[13]=(t*j-r*V+o*u)*y,a[14]=(v*C-b*O-k*R)*y,a[15]=(h*O-p*C+f*R)*y,a}function y0(a,e){let[t,r,o]=e;return [a[0]*t+a[4]*r+a[8]*o+a[12],a[1]*t+a[5]*r+a[9]*o+a[13],a[2]*t+a[6]*r+a[10]*o+a[14]]}function v0(a,e){let[t,r,o]=e;return [a[0]*t+a[4]*r+a[8]*o,a[1]*t+a[5]*r+a[9]*o,a[2]*t+a[6]*r+a[10]*o]}var M=(a,e,t)=>Math.min(t,Math.max(e,a)),Y=(a,e,t)=>a+(e-a)*t,k0=(a,e,t)=>{let r=M((t-a)/(e-a),0,1);return r*r*(3-2*r)},O0=a=>a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2;function t0(a){let e=Math.floor(a*4294967295)>>>0||1;return ()=>{e=e+1831565813>>>0;let t=e;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}}var w=class{constructor(e=0){this.x=e;}x;v=0;step(e,t,r,o){let i=r*Math.PI*2;return this.v+=(i*i*(e-this.x)-2*o*i*this.v)*t,this.x+=this.v*t,this.x}};var Ne=[{round:0,open:1,weight:.34},{round:.08,open:.55,weight:.26},{round:.7,open:.85,weight:.24},{round:1,open:.5,weight:.16}],r0=class{constructor(e){this.random=e;this.silence=.15+e()*.3;}random;open=0;round=0;age=0;length=0;stress=0;silence=0;syllablesLeft=0;wordsLeft=0;reset(){this.age=this.length=this.open=0,this.syllablesLeft=this.wordsLeft=0,this.silence=.12;}update(e){if(this.silence>0){this.silence-=e,this.open=0;return}this.age+=e,this.age>=this.length&&this.next();let t=M(this.age/this.length,0,1);this.open=this.stress*Math.pow(Math.sin(Math.PI*t),.55);}next(){let e=this.random;this.age=0;let t=this.syllablesLeft===0;t&&(this.wordsLeft===0?(this.wordsLeft=3+Math.floor(e()*5),this.silence=this.length>0?.45+e()*.7:0):this.silence=.04+e()*.09,this.wordsLeft--,this.syllablesLeft=1+Math.floor(Math.pow(e(),1.6)*3)),this.syllablesLeft--;let r=t&&e()<.6,o=De(Ne,e());this.length=.12+e()*.13,this.stress=o.open*(r?.85+e()*.15:.5+e()*.35),this.round=o.round;}};function De(a,e){for(let t of a){if(e<t.weight)return t;e-=t.weight;}return a[0]}var o0=["idle","thinking","listening","speaking","sleeping","working","error","surprised","celebrating","sad"],$=[...o0,"happy"],Z=Object.fromEntries($.map((a,e)=>[a,e])),w0={idle:{lid:.06,squint:0,smile:.35,tilt:0,energy:1,flap:.05,glow:[.45,.7,1],exposure:1,wide:0,asym:0},thinking:{lid:.4,squint:0,smile:-0.15,tilt:.22,energy:.6,flap:0,glow:[1,.55,.12],exposure:1,wide:0,asym:0},listening:{lid:0,squint:0,smile:.2,tilt:-0.08,energy:.8,flap:.05,glow:[.25,1,.5],exposure:1,wide:.15,asym:0},speaking:{lid:.04,squint:.1,smile:.45,tilt:0,energy:1.2,flap:.1,glow:[.35,.82,1],exposure:1,wide:0,asym:0},sleeping:{lid:1,squint:0,smile:0,tilt:0,energy:.35,flap:0,glow:[.08,.09,.18],exposure:.84,wide:0,asym:0},working:{lid:.3,squint:.2,smile:.05,tilt:0,energy:1.3,flap:.18,glow:[.6,.45,1],exposure:1,wide:0,asym:0},error:{lid:.12,squint:.15,smile:-0.45,tilt:.1,energy:.9,flap:.25,glow:[1,.16,.12],exposure:.97,wide:.2,asym:1},surprised:{lid:0,squint:0,smile:0,tilt:0,energy:1,flap:.55,glow:[.95,.95,1],exposure:1.04,wide:1,asym:0},celebrating:{lid:0,squint:1,smile:1,tilt:0,energy:1.8,flap:.9,glow:[1,.72,.2],exposure:1.08,wide:0,asym:0},sad:{lid:.42,squint:0,smile:-0.85,tilt:-0.32,energy:.35,flap:-0.12,glow:[.22,.32,.7],exposure:.9,wide:0,asym:0},happy:{lid:0,squint:1,smile:1,tilt:0,energy:1.6,flap:.3,glow:[1,.42,.72],exposure:1.05,wide:0,asym:0}};var He={float:0,hop:.16,squash:1,snap:1,look:1,snapLook:0,talkSquash:0},i0=.11,_e=1.8,s0=class{temperament;state="idle";pointer=null;shown="idle";previous="idle";switched=10;time=0;since=0;random;yaw=new w;pitch=new w;roll=new w;squash=new w;hover;face={lid:new w,squint:new w,smile:new w(.3),tilt:new w,talk:new w,round:new w,gazeX:new w,gazeY:new w,flap:new w,energy:new w(1),exposure:new w(1),wide:new w,asym:new w};weights;glow=[...w0.idle.glow];jump=null;look={yaw:0,pitch:0,x:0,y:0};saccade={x:0,y:0,next:0};nextLook=.6;nextBlink;blinkAge=-1;nextHop;nextSide=4;side=1;nextNod=2.5;shake={start:-10,amount:0,next:0};sigh={start:-10,next:0};reactUntil=-1;speech;lastTalk=0;syllableArmed=true;matrices={a:L(),b:L()};pose;constructor(e={},t=.5){this.temperament={...He,...e},this.random=t0(t),this.speech=new r0(this.random),this.nextBlink=1+this.random()*3,this.nextHop=6+this.random()*6,this.hover=new w(this.temperament.float),this.weights=Object.fromEntries($.map(r=>[r,new w(r==="idle"?1:0)])),this.pose={root:L(),minScale:1,lift:0,channels:{yaw:0,pitch:0,roll:0,flap:0,talk:0,energy:1},weights:Object.fromEntries($.map(r=>[r,r==="idle"?1:0])),expression:"idle",faceA:[0,0,0,0],faceB:[0,0,0,0],faceC:[0,0,1,0],faceD:[0,0,0,0],glow:this.glow,exposure:1,events:[]};}setState(e){e!==this.state&&(this.state=e,this.since=0,e==="speaking"&&this.speech.reset(),this.nextLook=0);}poke(){this.hop(this.temperament.hop*1.5,this.random()<.5?1:-1),this.reactUntil=this.time+_e;}update(e){if(!(e>0))return;let t=Math.max(1,Math.ceil(e/(1/120)));for(let r=0;r<t;r++)this.step(e/t);}enter(e,t){let r=this.temperament;e==="surprised"?(this.hop(r.hop*.6,0),this.pitch.v+=1.2,this.startShake(t,.35,1/0)):e==="error"?(this.side=this.random()<.5?1:-1,this.squash.v-=2.5,this.startShake(t,1,t+2+this.random())):e==="celebrating"?this.nextHop=t:e==="sad"&&(this.sigh.next=t+1.2);}startShake(e,t,r){this.shake.start=e,this.shake.amount=t,this.shake.next=r;}hop(e,t){if(this.jump)return;let r=this.temperament.float>0;this.jump={age:r?i0:0,height:e,spin:t,lean:(this.random()-.5)*.3,air:.42+e*.45+(r?.25:0),landed:false};}step(e){this.time+=e,this.since+=e,this.switched+=e;let t=this.time,r=this.random,o=this.temperament,i=this.pose.events,s=t<this.reactUntil?"happy":this.state;s!==this.shown&&(this.previous=this.shown,this.shown=s,this.switched=0,i.push(`enter:${s}`),this.enter(s,t));let n=w0[s];t>this.nextLook&&(this.look.yaw=(r()-.5)*.75,this.look.pitch=(r()-.5)*.24,this.look.x=M(this.look.yaw*2.2,-1,1),this.look.y=r()<.3?.6:r()<.2?-0.6:0,this.nextLook=t+Y(1.4+r()*2.6,.45+r()*1.1,o.snapLook)),t>this.saccade.next&&(this.saccade.x=(r()-.5)*.22,this.saccade.y=(r()-.5)*.14,this.saccade.next=t+.25+r()*.7);let l=0,d=0,h=0,p=Math.sin(t*1.9)*.008,f=0,m=0,b=0,v=0,k=n.flap,x=1.3,R=.62,C=o.float,z=this.pointer,O=z&&(s==="idle"||s==="listening"||s==="speaking"||s==="surprised");switch(s){case "idle":l=this.look.yaw,d=this.look.pitch,h=-this.look.yaw*.16,f=this.look.x,m=this.look.y,t>this.nextHop&&(this.hop(o.hop*(.9+r()*.4),r()<.35?r()<.5?1:-1:0),this.nextHop=t+7+r()*7);break;case "thinking":{t>this.nextSide&&(this.side=-this.side,this.nextSide=t+3+r()*2);let g=this.side;l=.24*g+Math.sin(t*.9)*.05,d=.17+Math.sin(t*1.3)*.03,h=-0.13*g,f=.7*g,m=.8,x=.9;break}case "listening":l=-0.14,d=.02,h=.17,f=-0.2,t>this.nextNod&&(this.pitch.v-=.9,this.nextNod=t+2+r()*2.5);break;case "speaking":{l=Math.sin(t*.7)*.12,h=Math.sin(t*.9)*.05,this.speech.update(e),b=this.speech.open,v=this.speech.round,d=.04+b*.07,p+=b*.014,k+=Math.sin(t*2.6)*.1,x=1.8;break}case "sleeping":d=-0.3,h=.13,l=.06,p=Math.sin(t*1.15)*.016,b=.12+.1*Math.sin(t*1.15),v=.7,C*=.65,x=.55,R=.9,t>this.nextNod&&(this.pitch.v-=.5,this.nextNod=t+5+r()*4);break;case "working":l=Math.sin(t*.8)*.07,d=-0.13+Math.abs(Math.sin(t*5.2))*.03,h=Math.sin(t*.6)*.04,f=Math.sin(t*1.6)*.45,m=-0.55,k+=Math.sin(t*11)*.06,x=1.6;break;case "error":{t>this.shake.next&&this.startShake(t,.55,2.4+r()*1.4);let g=this.side;h=.16*g,l=-0.1*g,d=.05,f=.45*g,m=.3,b=.16,x=1.5;break}case "surprised":d=.1,b=.42,v=1,x=2.2,R=.5;break;case "celebrating":l=Math.sin(t*3.1)*.22,h=Math.sin(t*6.2)*.1,d=.14,b=.6+.12*Math.sin(t*7),v=.05,k+=Math.sin(t*9)*.25,x=2,t>this.nextHop&&(this.hop(o.hop*1.25,r()<.3?r()<.5?1:-1:0),this.nextHop=t+.85+r()*.4);break;case "sad":{t>this.sigh.next&&(this.sigh.start=t,this.sigh.next=t+4+r()*2.5);let g=Math.sin(M((t-this.sigh.start)/1.7,0,1)*Math.PI);d=-0.24+g*.1,l=Math.sin(t*.3)*.1,h=.08,f=-0.15,m=-0.65+g*.3,p+=g*.018,C*=.7,x=.7,R=.85;break}case "happy":l=Math.sin(t*2.2)*.18,h=Math.sin(t*4.4)*.12,d=.12,b=.5+.15*Math.sin(t*8),v=.2,t>this.nextHop&&(this.hop(o.hop*1.05,0),this.nextHop=t+1.05+r()*.4);break}O&&z&&(l=M(z.x,-1,1)*.55,d=M(-z.y,-1,1)*.32+(s==="speaking"?b*.07:0),h=-l*.12+(s==="listening"?.12:0),f=M(z.x*2,-1,1),m=M(-z.y*1.5,-1,1)),s!=="sleeping"&&(f+=this.saccade.x,m+=this.saccade.y),o.float>0&&(p+=Math.sin(t*1.5)*.035);let P=Y(x,x*3.2,o.snapLook)*o.snap,F=Y(R,.95,o.snapLook);this.yaw.step(l*o.look,e,P,F),this.pitch.step(d*o.look,e,P,F),this.roll.step(h,e,x*o.snap,R),this.hover.step(C,e,.6,.8);let u=this.face;u.lid.step(n.lid,e,2.2,.9),u.squint.step(n.squint,e,3,.8),u.smile.step(n.smile,e,2.4,.75),u.tilt.step(n.tilt*this.side,e,1.6,.8),u.talk.step(b,e,14,.8),u.round.step(v,e,6,.8),u.gazeX.step(f,e,7,.85),u.gazeY.step(m,e,7,.85),u.flap.step(k,e,2.4*o.snap,.5),u.energy.step(n.energy,e,.8,1),u.exposure.step(n.exposure,e,.4,1),u.wide.step(n.wide,e,5,.6),u.asym.step(n.asym*this.side,e,3,.8);for(let g of $)this.weights[g].step(g===s?1:0,e,1.6*o.snap,.95);let V=1-Math.exp(-e*4),N=s==="thinking"?.55+.45*Math.sin(t*4.2):s==="speaking"?.6+.6*u.talk.x:s==="working"?.75+.25*Math.sin(t*7):s==="error"?Math.sin(t*7)>0?1.1:.45:1;for(let g=0;g<3;g++)this.glow[g]=Y(this.glow[g],n.glow[g]*N,V);this.syllableArmed&&u.talk.x>.55&&this.lastTalk<=.55&&s==="speaking"&&(i.push("syllable"),this.syllableArmed=false),u.talk.x<.35&&(this.syllableArmed=true),this.lastTalk=u.talk.x;let j=0,I=0,B=0,D=0,y=this.jump;if(y)if(y.age+=e,y.age<i0)D=.14;else {let g=(y.age-i0)/y.air;g<1?(g<.06&&this.squash.x>.05&&(this.squash.v=-2.6),j=4*y.height*g*(1-g),I=y.spin*Math.PI*2*O0(M(g*1.08,0,1)),B=y.lean*Math.sin(g*Math.PI),D=g<.5?-0.05:0):y.landed?y.age-i0-y.air>.35&&(this.jump=null):(y.landed=true,o.float===0&&(this.squash.v+=3.2,i.push("land")));}o.float>0&&(D*=.3),this.squash.step(D,e,3.2,.32),t>this.nextBlink&&(this.blinkAge=0,this.nextBlink=t+2.2+r()*3.5,r()<.2&&(this.nextBlink=t+.35));let q0=0;this.blinkAge>=0&&(this.blinkAge+=e,q0=Math.sin(M(this.blinkAge/.17,0,1)*Math.PI),this.blinkAge>.17&&(this.blinkAge=-1));let u0=s==="sleeping",A0=Math.sin(t*(u0?1.15:2.1))*(u0?.024:.01),P0=this.squash.x*o.squash+u.talk.x*.05*o.talkSquash,g0=1+P0*.55-A0*.5,F0=1-P0+A0,j0=j+p+this.hover.x,{a:Oe,b:Ve}=this.matrices,W=this.pose.root;e0(W,0,j0,0),H(W,W,X(Oe,0,I,B)),H(W,W,T0(Ve,g0,F0,g0));let E=this.pose;E.minScale=Math.min(g0,F0),E.lift=j0,E.expression=s;let G=E.channels,I0=this.shake.amount*Math.max(0,1-(t-this.shake.start)/.6);G.yaw=this.yaw.x+Math.sin(t*31)*.06*I0,G.pitch=this.pitch.x,G.roll=this.roll.x+Math.sin(t*38)*.07*I0,G.flap=u.flap.x,G.talk=u.talk.x,G.energy=u.energy.x;let B0=0;for(let g of $)B0+=Math.max(0,this.weights[g].x);for(let g of $)E.weights[g]=Math.max(0,this.weights[g].x)/(B0||1);E.faceA=[u0?0:q0,u.lid.x,u.squint.x,u.smile.x],E.faceB=[u.talk.x,u.gazeX.x,u.gazeY.x,u.tilt.x],E.faceC=[Z[this.shown],Z[this.previous],M(this.switched/.35,0,1),this.switched<.3?1-this.switched/.3:0],E.faceD=[this.since,u.round.x,u.wide.x,u.asym.x],E.exposure=u.exposure.x;}};var K=32,Ge={z:0,bubble:1,sparkle:2,heart:3,note:4,arc:5,puff:6,ring:7,drop:8,spark:9,mote:10,feather:11,dot:12,exclaim:13,warning:14,confetti:15,cloud:16,star:17,gear:18},V0={sleeping:[{glyph:"z",anchor:"top",rate:.55,offset:[.12,.04,.05],spread:.02,velocity:[.07,.13,0],jitter:.015,wobble:.05,life:[3,3.6],size:[.045,.12],rotation:-0.2,spin:.12,color:"#7f88ad"}],thinking:[{glyph:"dot",anchor:"top",rate:1.1,offset:[.16,.02,.06],spread:.01,velocity:[.05,.11,0],jitter:.01,wobble:.02,life:[1.5,1.8],size:[.012,.04],color:"#a3abc9"}],listening:[{glyph:"arc",anchor:"ear",rate:1.5,offset:[-0.4,0,.04],velocity:[.3,0,0],life:[1.05,1.2],size:[.1,.05],rotation:0,color:"#5cc489"}],syllable:[{glyph:"arc",anchor:"mouth",rate:2,offset:[.1,0,.06],mirror:true,velocity:[.24,.02,.04],jitter:.02,life:[.55,.7],size:[.03,.085],rotation:0,color:"#6aaee6"}],"enter:happy":[{glyph:"sparkle",anchor:"top",rate:7,spread:.22,velocity:[0,.3,.05],jitter:.4,gravity:.5,drag:1.5,life:[.7,1.1],size:[.06,0],spin:2.4,color:"#ffc94d"},{glyph:"heart",anchor:"top",rate:2,spread:.12,velocity:[0,.32,.05],jitter:.15,wobble:.06,life:[1,1.3],size:[.045,.08],color:"#ff6b8f"}],happy:[{glyph:"sparkle",anchor:"top",rate:2.5,spread:.35,velocity:[0,.14,0],jitter:.1,life:[.6,.9],size:[.045,0],spin:1.6,color:"#ffd166"}],working:[{glyph:"gear",anchor:"top",rate:.7,offset:[.12,.02,.05],spread:.03,velocity:[.05,.1,0],jitter:.02,wobble:.02,life:[2,2.4],size:[.035,.065],spin:2.2,color:"#a99cf0"},{glyph:"dot",anchor:"top",rate:2.2,offset:[-0.16,.06,.05],spread:.02,velocity:[-0.06,.14,0],jitter:.03,life:[.8,1.1],size:[.015,.006],color:"#c7bfff",glow:true}],"enter:error":[{glyph:"warning",anchor:"top",rate:1,offset:[.02,.12,.08],velocity:[0,.16,0],drag:2.2,life:[1.5,1.5],size:[.12,.1],color:"#ff4d3d"},{glyph:"spark",anchor:"top",rate:6,offset:[0,0,.05],velocity:[0,.4,0],jitter:1.3,gravity:1.6,life:[.25,.4],size:[.035,.015],color:"#ffd166",glow:true,align:true}],error:[{glyph:"puff",anchor:"top",rate:2.2,offset:[.02,.02,0],spread:.04,velocity:[0,.16,0],jitter:.05,wobble:.04,drag:.4,life:[1.3,1.7],size:[.04,.13],color:"#8b8fa3"}],"enter:surprised":[{glyph:"exclaim",anchor:"top",rate:1,offset:[.04,.14,.06],velocity:[0,.3,0],drag:3.5,life:[1.1,1.1],size:[.11,.08],rotation:-0.15,color:"#ffcc33"},{glyph:"spark",anchor:"top",rate:8,offset:[0,.02,.04],spread:.04,velocity:[0,.5,0],jitter:1.1,drag:4,life:[.3,.42],size:[.05,.02],color:"#ffe08a",align:true}],celebrating:[{glyph:"confetti",anchor:"top",rate:2.6,spread:.25,velocity:[0,.7,.05],jitter:.7,gravity:.9,drag:1.4,wobble:.06,life:[1.6,2.2],size:[.03,.026],spin:7,color:"#ff5d8f"},{glyph:"confetti",anchor:"top",rate:2.6,spread:.25,velocity:[0,.7,.05],jitter:.7,gravity:.9,drag:1.4,wobble:.06,life:[1.6,2.2],size:[.03,.026],spin:-6,color:"#ffc933"},{glyph:"confetti",anchor:"top",rate:2.6,spread:.25,velocity:[0,.7,.05],jitter:.7,gravity:.9,drag:1.4,wobble:.06,life:[1.6,2.2],size:[.03,.026],spin:8,color:"#4dc3ff"},{glyph:"confetti",anchor:"top",rate:2.6,spread:.25,velocity:[0,.7,.05],jitter:.7,gravity:.9,drag:1.4,wobble:.06,life:[1.6,2.2],size:[.03,.026],spin:-7,color:"#5ee08f"}],"enter:celebrating":[{glyph:"star",anchor:"top",rate:6,spread:.1,velocity:[0,.55,.05],jitter:.9,gravity:.6,drag:1.6,life:[.8,1.2],size:[.06,.02],spin:2,color:"#ffd23f"}],sad:[{glyph:"cloud",anchor:"top",rate:.42,offset:[-0.12,.22,.02],velocity:[0,0,0],wobble:.015,life:[2.6,2.6],size:[.15,.15],color:"#9aa3bd"},{glyph:"drop",anchor:"top",rate:4,offset:[-0.12,.16,.03],spread:.08,velocity:[0,-0.25,0],gravity:1.2,life:[.45,.6],size:[.018,.014],color:"#6aa8ff",align:true}],land:[{glyph:"puff",anchor:"feet",rate:7,spread:.1,velocity:[0,.05,0],jitter:.32,drag:3.5,life:[.45,.7],size:[.05,.12],color:"#c4cad9"}]};function Ue(a){let e=parseInt(a.replace("#",""),16);return [(e>>16&255)/255,(e>>8&255)/255,(e&255)/255]}function N0(a,e){return a==="drop"?Math.atan2(e[0],-e[1]):Math.atan2(e[1],e[0])}var n0=class{constructor(e,t){this.character=e;this.random=t;let r=e.spec.fx??{},o=new Set([...Object.keys(V0),...Object.keys(r)].filter(i=>i!=="replace"));for(let i of o){let s=r[i]??[],n=r.replace?.includes(i)?s:[...V0[i]??[],...s];this.emitters[i]=n.filter(l=>e.anchors[l.anchor]);}}character;random;a=new Float32Array(K*4);b=new Float32Array(K*4);c=new Float32Array(K*4);count=0;emitters={};carry=new Map;particles=[];update(e,t,r){for(let i of this.emitters[t.expression]??[])this.emitContinuous(i,e*t.weights[t.expression],r);for(let i of this.emitters.ambient??[])this.emitContinuous(i,e,r);for(let i of t.events)for(let s of this.emitters[i]??[])this.burst(s,s.rate,r);let o=[];for(let i of this.particles){if(i.age+=e,i.age>=i.life)continue;let s=i.spec;i.vel[1]-=(s.gravity??0)*e;let n=Math.max(0,1-(s.drag??0)*e);for(let l=0;l<3;l++)i.vel[l]*=n,i.pos[l]+=i.vel[l]*e;s.wobble&&(i.pos[0]+=Math.cos(i.age*3.1+i.seed*6.28)*s.wobble*e*3),i.rot=s.align?N0(s.glyph,i.vel):i.rot+(s.spin??0)*e,o.push(i);}this.particles=o.slice(-K),this.pack();}emitContinuous(e,t,r){let o=(this.carry.get(e)??this.random())+e.rate*t,i=Math.floor(o);this.carry.set(e,o-i),i>0&&this.burst(e,i,r);}burst(e,t,r){let o=this.character.anchors[e.anchor],i=this.random;for(let s=0;s<t;s++){let n=e.mirror&&s%2===1?-1:1,l=e.offset??[0,0,0],d=e.spread??0,h=[o.at[0]+l[0]*n+(i()-.5)*2*d,o.at[1]+l[1]+(i()-.5)*2*d,o.at[2]+l[2]+(i()-.5)*2*d],p=e.jitter??0,f=[e.velocity[0]*n+(i()-.5)*2*p,e.velocity[1]+(i()-.5)*p,e.velocity[2]+(i()-.5)*2*p];this.particles.push({pos:r.point(o.bone,h),vel:f,age:0,life:e.life[0]+(e.life[1]-e.life[0])*i(),size:e.size,rot:e.align?N0(e.glyph,f):n<0?Math.PI-(e.rotation??0):(e.rotation??0)+(e.spin?i():0),spec:e,color:Ue(e.color),seed:i()});}}pack(){this.count=this.particles.length,this.particles.forEach((e,t)=>{let r=e.age/e.life,o=1-(1-r)*(1-r),i=k0(0,.12,r)*(1-k0(.62,1,r)),s=t*4;this.a.set([e.pos[0],e.pos[1],e.pos[2],e.size[0]+(e.size[1]-e.size[0])*o],s),this.b.set([Ge[e.spec.glyph],i,e.rot,e.spec.glow?1:0],s),this.c.set([e.color[0],e.color[1],e.color[2],e.seed],s);});}};function T(a){let e=parseInt(a.replace("#",""),16),t=r=>Math.pow(r/255,2.2);return [t(e>>16&255),t(e>>8&255),t(e&255)]}var c=a=>{let e=Number(a.toFixed(5)).toString();return e.includes(".")||e.includes("e")?e:`${e}.0`},_=a=>`vec2(${c(a[0])}, ${c(a[1])})`,S=a=>`vec3(${c(a[0])}, ${c(a[1])}, ${c(a[2])})`;function D0(a){let e=X(L(),a[0],a[1],a[2]);return `mat3(${[0,1,2].map(r=>[e[r],e[4+r],e[8+r]]).flat().map(c).join(", ")})`}function _0(a){let e=["vec2 map(vec3 p) {"," vec2 r = vec2(1e9, 0.0);"," vec3 l;"],t=new Set,r=o=>(t.has(o)||(t.add(o),e.push(` vec3 b${o} = (uBones[${o}] * vec4(p, 1.0)).xyz;`)),`b${o}`);return a.spec.parts.forEach((o,i)=>{let s=r(a.boneIndex(o.bone,`parts[${i}]`)),n=o.at??[0,0,0],l=o.rot?`${D0(o.rot)} * (${s} - ${S(n)})`:`${s} - ${S(n)}`;e.push(` l = ${l};`);let d=c(a.materialId(o.material,`parts[${i}]`));if(o.shape==="hem"){e.push(` r.x = smax(r.x, ${c(o.y)} + ${c(o.amplitude)} * sin(atan(l.z, l.x) * ${c(o.waves)} + uTime * ${c(o.speed)}) - l.y, ${c(o.blend)});`);return}let h=o.clip?`max(${H0(o)}, dot(l, ${S(Xe(o.clip.normal))}) - ${c(o.clip.offset??0)})`:H0(o),p=c(o.blend??0);e.push(o.op==="sub"?` opSub(r, ${h}, ${p});`:` opAdd(r, ${h}, ${d}, ${p});`);}),e.push(...Ke(a,r)),e.push(" r.x *= uScaleFix;"," return r;","}"),e.join(`
|
|
2
|
+
`)}function Xe(a){let e=Math.hypot(...a)||1;return [a[0]/e,a[1]/e,a[2]/e]}function H0(a){switch(a.shape){case "sphere":return `sdSphere(l, ${c(a.radius)})`;case "ellipsoid":return `sdEllipsoid(l, ${S(a.radii)})`;case "roundBox":return `sdRoundBox(l, ${S(a.half)}, ${c(a.round)})`;case "capsule":return `sdCapsule(l, ${S(a.from)}, ${S(a.to)}, ${c(a.radius)})`;case "roundCone":return `sdRoundCone(l, ${S(a.from)}, ${S(a.to)}, ${c(a.r1)}, ${c(a.r2)})`;case "cylinder":return `sdCylinder(l, ${c(a.radius)}, ${c(a.half)}, ${c(a.round)})`;case "frame":return `sdFrame(l, ${_(a.half)}, ${c(a.corner)}, ${c(a.width)}, ${c(a.depth)})`;case "plate":return `sdPlate(l, ${_(a.half)}, ${c(a.corner)}, ${c(a.depth)})`;case "hem":throw new Error("unreachable")}}function Ke(a,e){let t=a.spec.eyes;if(!t)return [];let r=e(a.boneIndex(t.bone,"eyes")),o=[];if(t.kind==="ball"){let i=c(a.materialId(t.lid,"eyes.lid")),s=t.radius;t.at.forEach((n,l)=>{let d=l===0?"-1.0":"1.0";o.push(` l = ${r} - ${S(n)};`,` opAdd(r, length(l) - ${c(s)}, ${c(a.eyeIds[l])}, 0.0);`," {",` float tilt = uFaceB.w * ${d};`," vec3 q = vec3(mat2(cos(tilt), sin(tilt), -sin(tilt), cos(tilt)) * l.xy, l.z);",` float shell = length(q) - ${c(s*1.1)};`,` float lid = clamp(uFaceA.y + uFaceD.w * ${d} * 0.38 - uFaceD.z * 0.1, 0.0, 1.0);`,` float top = mix(${c(s*1.18)}, ${c(-s*.14)}, max(uFaceA.x, lid));`,` float bottom = mix(${c(-s*1.18)}, ${c(-s*.02)}, uFaceA.z * 0.85);`,` opAdd(r, min(max(shell, top - q.y), max(shell, q.y - bottom)), ${i}, 0.0);`," }");});}else {let i=c(a.materialId(t.material,"eyes.material")),[s,n,l]=t.radii;o.push(" float grow = 1.0 + 0.2 * uFaceD.z;"),t.at.forEach((d,h)=>{let p=h===0?"-1.0":"1.0";o.push(` float open${h} = max(0.12, (1.0 - max(uFaceA.x, clamp(uFaceA.y + uFaceD.w * ${p} * 0.45, 0.0, 1.0))) * (1.0 - 0.6 * uFaceA.z));`,` l = ${r} - ${S(d)} - vec3(uFaceB.y * ${c(s*.45)}, uFaceB.z * ${c(n*.3)}, 0.0);`,` opAdd(r, sdEllipsoid(l, vec3(${c(s)} * grow, ${c(n)} * grow * open${h}, ${c(l)})), ${i}, 0.0);`);});}return o}var q=a=>S(T(a));function We(a,e){let t=a.glows?`uGlow * ${c(a.emitStrength??1)}`:a.emit?`${q(a.emit)} * ${c(a.emitStrength??1)}`:"vec3(0.0)";return `Material(uAlbedo[${e}], ${c(a.f0??.04)}, ${c(a.spec??.5)}, ${c(a.shininess??40)}, ${c(a.metal??0)}, ${c(a.rim??.5)}, ${c(a.sheen??0)}, ${c(a.sss??0)}, ${a.sssColor?q(a.sssColor):"vec3(0.0)"}, ${t}, ${c(a.gloss??.3)})`}var G0=a=>a.map(e=>`k == ${e}`).join(" || ");function U0(a){let e=["Material getMaterial(float id, vec3 p, vec3 n) {"," int k = int(id + 0.5);"," Material m = material(vec3(0.5));"];return a.materials.forEach(({id:t,spec:r},o)=>e.push(` ${o?"else ":""}if (k == ${t}) m = ${We(r,o)};`)),a.spec.paints?.forEach((t,r)=>{let o=a.boneIndex(t.bone,`paints[${r}]`),i=t.on.map(l=>a.materialId(l,`paints[${r}]`)),s=c(t.soft??.15),n=t.kind==="sphere"?`(length(q) - ${c(t.radius??.1)}) / ${c(t.radius??.1)}`:`q.z > 0.0 ? length(q.xy / ${_(t.radii??[.1,.1])}) - 1.0 : 1.0`;e.push(` if (${G0(i)}) {`,` vec3 q = (uBones[${o}] * vec4(p, 1.0)).xyz - ${S(t.at)};`,` float e = ${n};`,` m.albedo = mix(m.albedo, ${q(t.color)}, (1.0 - smoothstep(-${s}, ${s}, e)) * ${c(t.opacity??1)});`," }");}),e.push(...Ze(a),...Je(a)," return m;","}"),e.join(`
|
|
3
|
+
`)}function X0(a){let e=["void surface(float id, vec3 p, inout vec3 n, inout Material m) {"," int k = int(id + 0.5);"];for(let{id:t,spec:r,name:o}of a.materials){let i=r.surface;if(!i)continue;let s=a.boneIndex(i.bone??"root",`materials.${o}.surface`),n=c(i.strength??.5);e.push(` if (k == ${t}) {`,` vec3 q = (uBones[${s}] * vec4(p, 1.0)).xyz * ${c(i.scale)};`,` float detail = ${n} * (1.0 - smoothstep(0.25, 0.9, gPixel * ${c(i.scale)}));`,...Ye(i.kind,i.color)," }");}return e.push("}"),e.join(`
|
|
4
|
+
`)}function Ye(a,e){let t=r=>[` vec3 g = vec3(noise3(${r}), noise3(${r} + 17.3), noise3(${r} + 41.7)) - 0.5;`," g -= n * dot(g, n);"];switch(a){case "fur":return [...t("q")," n = normalize(n + g * 0.5 * detail);"," float clump = noise3(q * 0.23);"," m.albedo *= mix(1.0, 0.9 + 0.2 * clump, detail);"];case "scales":return [" float c = noise3(q);"," float e = 0.12;"," vec3 grad = vec3(noise3(q + vec3(e, 0, 0)), noise3(q + vec3(0, e, 0)), noise3(q + vec3(0, 0, e))) - c;"," grad -= n * dot(grad, n);"," n = normalize(n - grad * 2.2 * detail);"," float seam = 1.0 - smoothstep(0.03, 0.13, abs(c - 0.5));",` m.albedo = mix(m.albedo, ${e?q(e):"m.albedo * 0.55"}, seam * 0.7 * detail);`," m.albedo *= 0.9 + 0.2 * noise3(q * 0.31) * detail;"];case "speckle":return [" float spot = smoothstep(0.66, 0.7, noise3(q)) * (0.6 + 0.4 * noise3(q * 0.37));",` m.albedo = mix(m.albedo, ${e?q(e):"m.albedo * 0.6"}, spot * detail);`];case "ripple":return [...t("q")," n = normalize(n + g * 0.35 * detail);"]}}function Ze(a){let e=a.spec.eyes;if(e?.kind!=="ball")return [];let t=a.boneIndex(e.bone,"eyes"),r=[];return e.at.forEach((o,i)=>{r.push(` if (k == ${a.eyeIds[i]}) {`,` vec3 q = normalize((uBones[${t}] * vec4(p, 1.0)).xyz - ${S(o)});`," vec3 g = normalize(vec3(uFaceB.y * 0.5, uFaceB.z * 0.38, 1.0));"," vec3 right = normalize(cross(vec3(0.0, 1.0, 0.0), g));"," vec3 up = cross(g, right);"," vec2 s = vec2(dot(q, right), dot(q, up));"," float front = step(0.0, dot(q, g));",` float aa = gPixel / ${c(e.radius)} + 0.02;`," float rr = length(s);",` float iris = front - front * smoothstep(${c(e.irisSize)} - aa, ${c(e.irisSize)} + aa, rr);`,` float ps = ${c(e.pupilSize)} * (1.0 - 0.4 * uFaceD.z);`,` float pupil = front - front * smoothstep(ps - aa, ps + aa, length(s / vec2(${c(e.pupilAspect??1)}, 1.0)));`,` vec3 irisCol = ${q(e.iris)} * (0.55 + 0.9 * smoothstep(${c(e.irisSize)}, 0.0, rr)) * (0.7 + 0.3 * hash12(floor(vec2(atan(s.y, s.x) * 9.0, rr * 30.0))));`," vec3 albedo = mix(vec3(0.82, 0.8, 0.78), irisCol, iris);"," albedo = mix(albedo, vec3(0.004), pupil);"," m = Material(albedo, 0.06, 2.4, 600.0, 0.0, 0.15, 0.0, 0.0, vec3(0.0), vec3(0.0), 1.0);"," }");}),r}function Je(a){let e=a.spec.face;if(!e)return [];if(e.kind==="screen"){let i=a.boneIndex(e.bone,"face");return [` if (k == ${a.materialId(e.material,"face.material")}) {`,` vec2 q = (uBones[${i}] * vec4(p, 1.0)).xy - ${_(e.center)};`,` m.emit += screenLight(q, ${q(e.color)}, ${c(e.cell)}, ${_(e.half)}, ${c(e.corner)});`," }"]}let t=a.boneIndex(e.bone,"face"),r=e.on.map(i=>a.materialId(i,"face.on")),o=e.width;return [` if (${G0(r)}) {`,` vec3 q = (uBones[${t}] * vec4(p, 1.0)).xyz - ${S(e.at)};`," if (q.z > -0.02) {",` vec3 mo = mouth(q.xy, ${c(o)}, uFaceB.x * ${c(o*1.1)}, uFaceD.y, uFaceA.w, uFaceD.w, ${c(o*.12)}, gPixel * 0.8);`," float a = mo.x;",` vec3 inner = ${q(e.color)} * (1.25 - 0.5 * mo.z);`,` m.albedo = mix(m.albedo, mix(inner, ${q(e.tongue)}, mo.y), a);`," m.spec *= 1.0 - 0.6 * a; m.sss *= 1.0 - a; m.sheen *= 1.0 - a; m.emit *= 1.0 - a;"," }"," }"]}var K0=`
|
|
5
5
|
const vec3 KEY = vec3(-0.4485, 0.6997, 0.5562);
|
|
6
6
|
const vec3 FILL = vec3(0.8521, -0.1504, 0.5013);
|
|
7
7
|
const vec3 BACK = vec3(0.5529, 0.5529, -0.6233);
|
|
@@ -107,7 +107,7 @@ vec3 shade(Material m, vec3 p, vec3 n, vec3 v) {
|
|
|
107
107
|
vec3 aces(vec3 x) {
|
|
108
108
|
return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);
|
|
109
109
|
}
|
|
110
|
-
`;var
|
|
110
|
+
`;var W0=`
|
|
111
111
|
vec3 calcNormal(vec3 p) {
|
|
112
112
|
vec3 n = vec3(0.0);
|
|
113
113
|
for (int i = ZERO; i < 4; i++) {
|
|
@@ -208,7 +208,7 @@ void main() {
|
|
|
208
208
|
|
|
209
209
|
fragColor = over(front, over(body, over(back, floorLayer)));
|
|
210
210
|
}
|
|
211
|
-
`;var
|
|
211
|
+
`;var Y0=`
|
|
212
212
|
/* q: point in mouth space (x right, y up); w: half width; open: lip
|
|
213
213
|
separation in the same units; round: 0 for "ah"/"ee", 1 for "oo";
|
|
214
214
|
smile: -1..1; crooked: -1..1 tilts and wobbles the line, as when something
|
|
@@ -249,7 +249,7 @@ vec3 mouth(vec2 q, float w, float open, float round, float smile, float crooked,
|
|
|
249
249
|
float depth = clamp(-inside / max(0.5 * open, 1e-4), 0.0, 1.0) * hole;
|
|
250
250
|
return vec3(a, tongue, depth);
|
|
251
251
|
}
|
|
252
|
-
`;var
|
|
252
|
+
`;var Z0=`
|
|
253
253
|
float fxSegment(vec2 p, vec2 a, vec2 b) {
|
|
254
254
|
vec2 pa = p - a, ba = b - a;
|
|
255
255
|
float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);
|
|
@@ -378,7 +378,7 @@ vec2 glyph(int g, vec2 p, float px) {
|
|
|
378
378
|
}
|
|
379
379
|
return vec2(max(1.0 - smoothstep(-px, px, d), soft), light);
|
|
380
380
|
}
|
|
381
|
-
`;var
|
|
381
|
+
`;var J0=`
|
|
382
382
|
float sdSphere(vec3 p, float r) { return length(p) - r; }
|
|
383
383
|
|
|
384
384
|
float sdEllipsoid(vec3 p, vec3 r) {
|
|
@@ -480,7 +480,7 @@ float hash12(vec2 p) {
|
|
|
480
480
|
p3 += dot(p3, p3.yzx + 33.33);
|
|
481
481
|
return fract((p3.x + p3.y) * p3.z);
|
|
482
482
|
}
|
|
483
|
-
`;var
|
|
483
|
+
`;var Q0=`
|
|
484
484
|
float sdBox2(vec2 p, vec2 b) {
|
|
485
485
|
vec2 d = abs(p) - b;
|
|
486
486
|
return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);
|
|
@@ -679,14 +679,14 @@ vec3 screenLight(vec2 q, vec3 color, float cell, vec2 extent, float corner) {
|
|
|
679
679
|
vec3 lit = color * (led * dotMask * 2.1 + glow * 0.2) + glare + vec3(0.012, 0.016, 0.03) * dotMask;
|
|
680
680
|
return lit * edge;
|
|
681
681
|
}
|
|
682
|
-
`;var
|
|
683
|
-
`)}var
|
|
682
|
+
`;var z0=class extends Error{constructor(e,t){super(`${e}: ${t}`),this.name="SpecError";}};function ee(a){let e=p=>{throw new z0(a.id,p)},t=[{name:"root",pivot:[0,0,0],index:0,parentIndex:-1}],r=new Map([["root",0]]);a.bones.forEach((p,f)=>{r.has(p.name)&&e(`bone "${p.name}" is declared twice`);let m=p.parent??"root",b=r.get(m);b===void 0&&e(`bone "${p.name}" names parent "${m}", which is not declared before it`),r.set(p.name,f+1),t.push({...p,index:f+1,parentIndex:b});});let o=Object.entries(a.materials).map(([p,f],m)=>({name:p,id:m+1,spec:f})),i=new Map(o.map(p=>[p.name,p.id])),s=[o.length+1,o.length+2],n=(p,f)=>r.get(p)??e(`${f} names bone "${p}", which does not exist`),l=(p,f)=>i.get(p)??e(`${f} names material "${p}", which does not exist`);o.forEach(p=>{p.spec.shadeOf!==void 0&&l(p.spec.shadeOf,`materials.${p.name}.shadeOf`);}),a.parts.forEach((p,f)=>{n(p.bone,`parts[${f}]`),l(p.material,`parts[${f}]`);}),a.paints?.forEach((p,f)=>{n(p.bone,`paints[${f}]`),p.on.forEach(m=>l(m,`paints[${f}]`));});let d=t.map(()=>[]);for(let[p,f]of Object.entries(a.acting??{}))for(let[m,b]of Object.entries(f)){let v=n(m,`acting.${p}`);for(let[k,x]of Object.entries(b))d[v].push([p,k,x]);}let h={};for(let[p,f]of Object.entries(a.anchors??{}))h[p]={bone:n(f.bone,`anchors.${p}`),at:f.at};for(let[p,f]of Object.entries(a.fx??{}))p!=="replace"&&f.forEach((m,b)=>{h[m.anchor]||e(`fx.${p}[${b}] names anchor "${m.anchor}", which does not exist`);});return {spec:a,bones:t,boneIndex:n,materials:o,materialId:l,eyeIds:s,acting:d,anchors:h}}var l0={uResolution:"vec2",uTime:"float",uCamera:"vec4",uBound:"vec4",uBones:"mat4[]",uScaleFix:"float",uFaceA:"vec4",uFaceB:"vec4",uFaceC:"vec4",uFaceD:"vec4",uGlow:"vec3",uShadow:"vec3",uFloor:"float",uLift:"float",uGlowPool:"float",uExposure:"float",uAlbedo:"vec3[materials]",uFxA:"vec4[fx]",uFxB:"vec4[fx]",uFxC:"vec4[fx]",uFxCount:"int"};function ae(a,e){return Object.entries(l0).map(([t,r])=>r==="mat4[]"?`uniform mat4 ${t}[${a}];`:r==="vec3[materials]"?`uniform vec3 ${t}[${Math.max(1,e)}];`:r==="vec4[fx]"?`uniform vec4 ${t}[${K}];`:`uniform ${r} ${t};`).join(`
|
|
683
|
+
`)}var te=`#version 300 es
|
|
684
684
|
void main() {
|
|
685
685
|
vec2 p = vec2(float((gl_VertexID << 1) & 2), float(gl_VertexID & 2));
|
|
686
686
|
gl_Position = vec4(p * 2.0 - 1.0, 0.0, 1.0);
|
|
687
|
-
}`,
|
|
687
|
+
}`,Qe=()=>$.map(a=>`#define E_${a.toUpperCase()} ${c(Z[a])}`).join(`
|
|
688
688
|
`)+`
|
|
689
|
-
`;function
|
|
690
|
-
`);return {spec:
|
|
691
|
-
`).length}}}var
|
|
692
|
-
${l}`)}i.deleteShader(a),i.deleteShader(o);let s=Object.fromEntries(Object.keys(le).map(l=>[l,i.getUniformLocation(r,le[l].includes("[")?`${l}[0]`:l)])),n={program:r,uniforms:s,character:e};return this.programs.set(e,n),n}};var n0=.2,X0=.1,de=class{constructor(e){this.canvas=e;let r=e.getContext("2d");if(!r)throw new Error("Canvas 2D is not available");this.target=r;}canvas;gpu=fe.shared();target;character=null;load(e){this.character=e,this.gpu.program(e);}render(e){let r=this.character&&this.gpu.program(this.character);if(!r)return false;let{gpu:a}=this,{gl:o}=a,{width:i,height:s}=e;(this.canvas.width!==i||this.canvas.height!==s)&&(this.canvas.width=i,this.canvas.height=s),a.reserve(i,s),o.viewport(0,0,i,s),o.scissor(0,0,i,s),o.clear(o.COLOR_BUFFER_BIT),o.useProgram(r.program);let n=r.uniforms,{spec:l}=r.character,f=e.pose,h=f.lift;return o.uniform2f(n.uResolution,e.width,e.height),o.uniform1f(n.uTime,e.time),o.uniform4f(n.uCamera,l.frame.target,l.frame.radius*e.framing/n0,n0,X0),o.uniform4f(n.uBound,0,l.bound.y+h,0,l.bound.radius),o.uniformMatrix4fv(n.uBones,false,e.bones),o.uniform1f(n.uScaleFix,f.minScale),o.uniform4fv(n.uFaceA,f.faceA),o.uniform4fv(n.uFaceB,f.faceB),o.uniform4fv(n.uFaceC,f.faceC),o.uniform4fv(n.uFaceD,f.faceD),o.uniform3fv(n.uGlow,f.glow),o.uniform3fv(n.uShadow,e.shadow),o.uniform1f(n.uFloor,e.floor),o.uniform1f(n.uLift,h),o.uniform1f(n.uExposure,e.exposure*f.exposure),o.uniform3fv(n.uAlbedo,e.albedo),o.uniform1f(n.uGlowPool,l.glowPool??0),o.uniform4fv(n.uFxA,e.fx.a),o.uniform4fv(n.uFxB,e.fx.b),o.uniform4fv(n.uFxC,e.fx.c),o.uniform1i(n.uFxCount,e.fx.count),o.drawArrays(o.TRIANGLES,0,3),this.target.globalCompositeOperation="copy",this.target.drawImage(a.canvas,0,a.canvas.height-s,i,s,0,0,i,s),true}dispose(){this.character=null;}};var K0=/^#[0-9a-f]{6}$/i;function W0(t,e,r,a){if(!e.includes(r))throw new Error(`${t}: palette names material "${r}". Materials are: ${e.join(", ")}.`);if(!K0.test(a))throw new Error(`${t}: palette colour for "${r}" must look like #rrggbb, got "${a}".`)}function Y0(t,e){let r=Object.keys(t.materials),a=new Map;for(let[o,i]of Object.entries(e))W0(t.id,r,o,i),a.set(o,T(i));for(let[o,i]of Object.entries(t.materials)){let s=i.shadeOf;if(!s||a.has(o)||!(s in e))continue;let n=T(t.materials[s].color),l=T(i.color),f=a.get(s);a.set(o,[0,1,2].map(h=>Math.min(1,n[h]>.001?f[h]*l[h]/n[h]:l[h])));}return a}function Ce(t,e){let r=t.albedo.slice();if(!e)return r;for(let[a,o]of Y0(t.spec,e))r.set(o,t.materials.indexOf(a)*3);return r}var Ee=class{members=new Set;frame=0;last=0;time=0;quality=1;slow=0;fast=0;add(e){this.members.add(e),this.start();}delete(e){this.members.delete(e),this.members.size||this.stop();}start(){this.frame||typeof requestAnimationFrame>"u"||(this.last=performance.now(),this.frame=requestAnimationFrame(this.loop));}stop(){cancelAnimationFrame(this.frame),this.frame=0;}loop=e=>{this.frame=requestAnimationFrame(this.loop);let r=Math.max(0,e-this.last),a=Math.min(r/1e3,1/20);this.adapt(r),this.last=e,this.time+=a;for(let o of this.members)o.active&&o.tick(a,this.time,this.quality);};adapt(e){e>22&&e<200?this.slow++:this.slow=Math.max(0,this.slow-1),e<17.5?this.fast++:this.fast=0,this.slow>20?(this.quality=Math.max(.55,this.quality*.85),this.slow=0):this.fast>120&&this.quality<1&&(this.quality=Math.min(1,this.quality*1.08),this.fast=0);}},$e=new Ee;var l0=new WeakMap;function c0(t){let e=l0.get(t);return e||l0.set(t,e=a0(t)),e}var Q=class{constructor(e,r,a={}){this.canvas=e;if(this.seed=a.seed??Math.random(),this.palette=a.palette,this.options={interactive:a.interactive??true,effects:a.effects??true,speed:a.speed??1,maxPixelRatio:a.maxPixelRatio??2,shadow:a.shadow??[.05,.06,.12],floor:a.floor??1,exposure:a.exposure??1,framing:a.framing??1,respectReducedMotion:a.respectReducedMotion??true},this.renderer=new de(e),this.load(r,a.state??"idle"),e.setAttribute("role","img"),this.reducedMotion=typeof matchMedia=="function"?matchMedia("(prefers-reduced-motion: reduce)"):null,typeof IntersectionObserver<"u"){let o=new IntersectionObserver(([i])=>this.visible=i.isIntersecting);o.observe(e),this.cleanup.push(()=>o.disconnect());}this.options.interactive&&this.listen(),$e.add(this);}canvas;character;brain;rig;fx;renderer;options;seed;palette;albedo;visible=true;paused=false;time=0;reducedMotion;stillFrames=0;drawn=false;listeners={poke:new Set,state:new Set,ready:new Set};cleanup=[];source;get state(){return this.brain.state}get spec(){return this.source}get stats(){return this.character.stats}setState(e){if(!oe.includes(e))throw new Error(`Unknown state "${e}". Expected one of ${oe.join(", ")}.`);e!==this.brain.state&&(this.brain.setState(e),this.stillFrames=0,this.label(),this.emit("state",e));}setSpec(e,r){this.palette=r,this.load(e,this.brain.state);}setPalette(e){this.albedo=Ce(this.character,e),this.palette=e,this.stillFrames=0;}setSpeed(e){this.options.speed=Math.max(0,e);}setEffects(e){this.options.effects=e;}poke(){this.brain.poke(),this.stillFrames=0,this.emit("poke",void 0);}pause(){this.paused=true;}play(){this.paused=false;}on(e,r){return this.listeners[e].add(r),()=>this.listeners[e].delete(r)}get active(){return !this.visible||this.paused?false:!this.still||this.stillFrames<2}tick(e,r,a){let o=this.still,i=e*this.options.speed;if(o)for(let h=0;h<90;h++)this.brain.update(1/60);else this.brain.update(i),this.time+=i;let s=o?0:this.time,n=this.brain.pose;this.rig.update(n.root,n.channels,n.weights,s,o?0:i),!o&&this.options.effects?this.fx.update(i,n,this.rig):this.fx.count=0,n.events.length=0;let l=Math.min(devicePixelRatio||1,this.options.maxPixelRatio)*a,f=this.renderer.render({pose:n,bones:this.rig.inverse,fx:this.fx,albedo:this.albedo,time:s,width:Math.max(1,Math.round(this.canvas.clientWidth*l)),height:Math.max(1,Math.round(this.canvas.clientHeight*l)),shadow:this.options.shadow,floor:this.options.floor,exposure:this.options.exposure,framing:this.options.framing});f&&o&&this.stillFrames++,f&&!this.drawn&&(this.drawn=true,this.emit("ready",void 0));}get ready(){return this.drawn}dispose(){$e.delete(this),this.cleanup.forEach(e=>e()),this.listeners.poke.clear(),this.listeners.state.clear(),this.listeners.ready.clear(),this.renderer.dispose();}load(e,r){this.source=e,this.character=c0(e),this.albedo=Ce(this.character,this.palette),this.renderer.load(this.character),this.brain=new se(e.motion,this.seed),this.brain.setState(r),this.rig=new pe(this.character.bones,this.character.acting),this.fx=new ne(this.character,re(this.seed+.37)),this.stillFrames=0,this.label();}get still(){return this.options.respectReducedMotion&&(this.reducedMotion?.matches??false)}emit(e,r){for(let a of this.listeners[e])a(r);}label(){this.canvas.hasAttribute("data-own-label")||this.canvas.setAttribute("aria-label",`${this.source.name}, ${this.brain.state}`);}listen(){let e=o=>{let i=this.canvas.getBoundingClientRect(),s=Math.max(i.width,1),n=(o.clientX-(i.left+i.width/2))/(s*1.1),l=(o.clientY-(i.top+i.height*.45))/(s*1.1);this.brain.pointer=Math.hypot(n,l)<3?{x:n,y:l}:null;},r=()=>this.brain.pointer=null,a=()=>this.poke();window.addEventListener("pointermove",e,{passive:true}),document.addEventListener("pointerleave",r),this.canvas.addEventListener("click",a),this.cleanup.push(()=>{window.removeEventListener("pointermove",e),document.removeEventListener("pointerleave",r),this.canvas.removeEventListener("click",a);});}};var Z0={submitted:"thinking",streaming:"speaking",error:"error",idle:"idle"};function Le(t,e,r=1400){if(e==="ready"){t.state==="speaking"||t.state==="thinking"?(t.setState("celebrating"),setTimeout(()=>t.state==="celebrating"&&t.setState("idle"),r)):t.setState("idle");return}t.setState(Z0[e]??"idle");}var p0={id:"boo",name:"Boo",tagline:"Floats, glows from inside, trails motes, a hem that ripples",accent:"#8a6cf0",frame:{target:.78,radius:.92},bound:{y:.72,radius:.72},motion:{float:.22,hop:.12,squash:.8,snap:.8,talkSquash:.6},glowPool:.55,materials:{ghost:{color:"#eceaff",f0:.04,spec:.5,shininess:30,rim:1.4,sss:.4,sssColor:"#b9a4ff",emit:"#6f52d9",emitStrength:.06},bead:{color:"#1b1430",f0:.06,spec:2.2,shininess:400,rim:.2,gloss:1}},bones:[{name:"body",pivot:[0,0,0],drive:{rx:[["pitch",-0.5]],ry:[["yaw",.7]],rz:[["roll",.6]]},wave:{rz:[.03,.45,0]}},{name:"armL",parent:"body",pivot:[-0.36,.74,.04],drive:{rz:[["flap",-1.2]]},wave:{rz:[.08,.7,0]},jiggle:{axis:[-0.8,-0.6,0],length:.15,freq:2,damping:.2,maxAngle:.7}},{name:"armR",parent:"body",pivot:[.36,.74,.04],drive:{rz:[["flap",1.2]]},wave:{rz:[-0.08,.7,1.6]},jiggle:{axis:[.8,-0.6,0],length:.15,freq:2,damping:.2,maxAngle:.7}}],parts:[{bone:"body",shape:"sphere",at:[0,.88,0],radius:.4,material:"ghost"},{bone:"body",shape:"roundCone",from:[0,.88,0],to:[0,.4,0],r1:.4,r2:.47,material:"ghost"},{bone:"body",shape:"hem",y:.34,amplitude:.045,waves:6,speed:2.4,blend:.05,material:"ghost"},{bone:"armL",shape:"capsule",from:[0,0,0],to:[-0.12,-0.09,.02],radius:.07,blend:.08,material:"ghost"},{bone:"armR",shape:"capsule",from:[0,0,0],to:[.12,-0.09,.02],radius:.07,blend:.08,material:"ghost"}],paints:[{bone:"body",on:["ghost"],kind:"sphere",at:[-0.24,.78,.31],radius:.07,color:"#ffa3c4",soft:.6,opacity:.7},{bone:"body",on:["ghost"],kind:"sphere",at:[.24,.78,.31],radius:.07,color:"#ffa3c4",soft:.6,opacity:.7}],eyes:{kind:"bead",bone:"body",at:[[-0.135,.9,.375],[.135,.9,.375]],radii:[.048,.072,.03],material:"bead"},face:{kind:"mouth",bone:"body",on:["ghost"],at:[0,.77,.38],width:.075,color:"#2a1a4a",tongue:"#ff7fa6"},anchors:{top:{bone:"body",at:[.16,1.2,.1]},mouth:{bone:"body",at:[0,.77,.4]},ear:{bone:"body",at:[-0.42,.92,0]},center:{bone:"body",at:[0,.8,0]}},acting:{idle:{armL:{rz:[0,.1,.7,0]},armR:{rz:[0,.1,.7,1.3]}},thinking:{armR:{ry:-1.1,rz:.9},armL:{rz:.25}},listening:{armL:{rz:-1,rx:-0.35}},speaking:{armL:{rz:[-0.3,.3,1.2,0],rx:[-0.3,.2,.9,0]},armR:{rz:[.3,.3,1.2,1.7],rx:[-0.3,.2,.9,2.2]}},sleeping:{armL:{rz:.4},armR:{rz:-0.4},body:{rz:.08}},working:{armL:{rx:[-0.6,.15,6,0],rz:-0.3},armR:{rx:[-0.6,.15,6,Math.PI],rz:.3}},error:{armL:{rz:[-1,.25,10,0]},armR:{rz:[1,.25,10,1]}},surprised:{armL:{rz:-1.4,rx:-0.4},armR:{rz:1.4,rx:-0.4}},celebrating:{armL:{rz:[-1.6,.3,4,0]},armR:{rz:[1.6,.3,4,Math.PI]}},sad:{armL:{rz:.5},armR:{rz:-0.5},body:{rz:.05}},happy:{armL:{rz:[-1.3,.35,3,0]},armR:{rz:[1.3,.35,3,1.2]}}},fx:{ambient:[{glyph:"mote",anchor:"center",rate:1.3,spread:.5,velocity:[0,.07,0],jitter:.06,wobble:.09,life:[2.2,3.2],size:[.04,.02],color:"#b49cff",glow:true}],happy:[{glyph:"heart",anchor:"top",rate:1.2,spread:.2,velocity:[0,.22,.05],jitter:.12,wobble:.06,life:[1,1.3],size:[.04,.07],color:"#ff86b0"}]}};var h0=[.085,.064,.044,.016],f0=[-0.6,-0.42,-0.62];function J0(){let t={idle:{},thinking:{},listening:{},speaking:{},sleeping:{},working:{},error:{},surprised:{},celebrating:{},sad:{},happy:{}};for(let e=0;e<6;e++){let r=e*1.05;t.speaking[`t${e}s0`]={rx:[0,.2,1.1,r]},t.speaking[`t${e}s2`]={rx:[0,.35,1.6,r+1]},t.sleeping[`t${e}s0`]={rx:.3},t.sleeping[`t${e}s1`]={rx:.35},t.sleeping[`t${e}s2`]={rx:.55},t.happy[`t${e}s0`]={rx:[-0.45,.35,2.4,r]},t.happy[`t${e}s1`]={rx:[0,.3,2.4,r+1]},t.error[`t${e}s0`]={rx:-0.35},t.error[`t${e}s1`]={rx:[.35,.18,9,r]},t.error[`t${e}s2`]={rx:[.2,.22,11,r+2]},t.surprised[`t${e}s0`]={rx:-0.85},t.surprised[`t${e}s1`]={rx:-0.25},t.surprised[`t${e}s2`]={rx:-0.3},t.celebrating[`t${e}s0`]={rx:[-0.5,.3,3,r]},t.celebrating[`t${e}s1`]={rx:[.15,.3,3,r+1]},t.celebrating[`t${e}s2`]={rx:[.2,.3,3,r+2]},t.sad[`t${e}s0`]={rx:.45},t.sad[`t${e}s1`]={rx:.42},t.sad[`t${e}s2`]={rx:[.55,.06,.4,r]},t.working[`t${e}s0`]={rx:[-0.15,.08,1.2,r]};}return t.working.t0s0={rx:[-1.25,.22,5.5,0]},t.working.t0s1={rx:[.7,.2,5.5,.6]},t.working.t5s0={rx:[-1.25,.22,5.5,Math.PI]},t.working.t5s1={rx:[.7,.2,5.5,Math.PI+.6]},t.celebrating.t0s0={rx:-0.3,rz:[1.05,.25,3.2,0]},t.celebrating.t0s1={rx:[.5,.15,3.2,1]},t.celebrating.t0s2={rx:[.6,.2,3.2,2]},t.celebrating.t5s0={rx:-0.3,rz:[-1.05,.25,3.2,Math.PI]},t.celebrating.t5s1={rx:[.5,.15,3.2,Math.PI+1]},t.celebrating.t5s2={rx:[.6,.2,3.2,Math.PI+2]},t.thinking.t0s0={rx:-1.75},t.thinking.t0s1={rx:.95},t.thinking.t0s2={rx:[1,.12,1.6,0]},t.listening.t5s0={rx:-1.6},t.listening.t5s1={rx:-0.2},t.listening.t5s2={rx:.7},t}var d0=[{name:"mantle",pivot:[0,.42,0],drive:{rx:[["pitch",-0.6]],ry:[["yaw",.6]],rz:[["roll",.6]]}}],m0=[];for(let t=0;t<6;t++){let e=(t+.5)/6*Math.PI*2;for(let r=0;r<3;r++){let a=`t${t}s${r}`;d0.push({name:a,parent:r===0?"mantle":`t${t}s${r-1}`,pivot:r===0?[.26*Math.sin(e),.02,.26*Math.cos(e)]:[0,-0.17,0],rest:r===0?{rx:f0[0],ry:e}:{rx:f0[r]},wave:{rx:[.12+r*.1,.32,t*1.3+r*.8],rz:[.06+r*.05,.21,t*2.1+r]},jiggle:{axis:[0,-1,0],length:.17,freq:2.4-r*.4,damping:.25,maxAngle:.8}}),m0.push({bone:a,shape:"roundCone",from:[0,0,0],to:[0,-0.17,0],r1:h0[r],r2:h0[r+1],blend:r===0?.1:.04,material:"skin"});}}var u0={id:"inky",name:"Inky",tagline:"Floats, with six tentacles that trail on spring chains",accent:"#e04f7d",frame:{target:.86,radius:.98},bound:{y:.64,radius:1},motion:{float:.32,hop:.12,squash:1.1,snap:.85,look:.8,talkSquash:.5},materials:{skin:{color:"#f2647f",f0:.05,spec:1.1,shininess:90,rim:.8,sss:.35,sssColor:"#ffb0c4",gloss:.7}},bones:d0,parts:[{bone:"mantle",shape:"ellipsoid",at:[0,.38,-0.04],radii:[.43,.45,.41],material:"skin"},{bone:"mantle",shape:"ellipsoid",at:[0,.04,0],radii:[.35,.15,.35],blend:.16,material:"skin"},...m0],paints:[...[[.14,.78,.12,.07],[-0.2,.72,.16,.055],[.33,.6,.12,.05],[-0.04,.83,-0.05,.06],[-0.36,.52,.1,.05],[.06,.62,.33,.045],[.3,.42,-0.26,.045]].map(([t,e,r,a])=>({bone:"mantle",on:["skin"],kind:"sphere",at:[t,e,r],radius:a,color:"#d23f6c",soft:.2})),{bone:"mantle",on:["skin"],kind:"sphere",at:[-0.27,.18,.31],radius:.065,color:"#ff9db0",soft:.6,opacity:.7},{bone:"mantle",on:["skin"],kind:"sphere",at:[.27,.18,.31],radius:.065,color:"#ff9db0",soft:.6,opacity:.7}],eyes:{kind:"ball",bone:"mantle",at:[[-0.16,.27,.3],[.16,.27,.3]],radius:.098,iris:"#f2b33d",irisSize:.66,pupilSize:.3,pupilAspect:1.9,lid:"skin"},face:{kind:"mouth",bone:"mantle",on:["skin"],at:[0,.13,.3],width:.062,color:"#5a1430",tongue:"#ff8fa8"},anchors:{top:{bone:"mantle",at:[.16,.86,.1]},mouth:{bone:"mantle",at:[0,.13,.33]},ear:{bone:"mantle",at:[-0.46,.4,0]},skirt:{bone:"mantle",at:[0,0,0]}},acting:J0(),fx:{replace:["syllable"],ambient:[{glyph:"bubble",anchor:"skirt",rate:.7,spread:.35,velocity:[0,.18,0],jitter:.05,wobble:.06,life:[2.4,3.2],size:[.02,.045],color:"#8fcfff"}],syllable:[{glyph:"bubble",anchor:"mouth",rate:2,offset:[0,0,.04],velocity:[.05,.2,.1],jitter:.1,wobble:.05,life:[1,1.4],size:[.014,.034],color:"#9ad7ff"}]}};var q=Math.PI/2,b0={id:"microduck",name:"Microduck",tagline:"A bipedal robot duck: servo neck, lens eyes, a bill that clacks when it talks, and boots it marches in",accent:"#ff6a1f",frame:{target:.57,radius:.8},bound:{y:.58,radius:.88},motion:{hop:.12,squash:.45,snap:1.4,look:.9,snapLook:1,talkSquash:.12},materials:{shell:{color:"#f3f1ec",f0:.04,spec:1.1,shininess:70,rim:.55,gloss:.5,sss:.12,sssColor:"#ffffff",surface:{kind:"ripple",scale:70,strength:.12,bone:"head"}},bodyShell:{color:"#f3f1ec",shadeOf:"shell",f0:.04,spec:1.1,shininess:70,rim:.55,gloss:.5,sss:.12,sssColor:"#ffffff",surface:{kind:"ripple",scale:70,strength:.12,bone:"body"}},bill:{color:"#ff5f1f",f0:.05,spec:1.3,shininess:90,rim:.45,gloss:.65,sss:.2,sssColor:"#ffb27a"},ring:{color:"#ff8410",f0:.05,spec:1.3,shininess:90,rim:.4,gloss:.65,sss:.15,sssColor:"#ffd08a"},boot:{color:"#ff5a24",f0:.04,spec:.9,shininess:50,rim:.4,gloss:.4,sss:.15,sssColor:"#ffb08a"},sole:{color:"#ffb12e",f0:.04,spec:.7,shininess:40,rim:.3,gloss:.3},servo:{color:"#2a2d33",f0:.06,spec:1.2,shininess:80,rim:.5,gloss:.55,metal:.25},horn:{color:"#a3a9b1",f0:.3,spec:1.6,shininess:120,rim:.4,gloss:.7,metal:.8},lens:{color:"#101318",f0:.12,spec:2.6,shininess:420,rim:.3,gloss:1},mouth:{color:"#3b1510",f0:.04,spec:.5,shininess:30,rim:0},led:{color:"#ffffff",f0:.05,spec:1,shininess:120,rim:0,glows:true}},bones:[{name:"hips",pivot:[0,0,0],rest:{ry:.55}},{name:"legL",parent:"hips",pivot:[-0.12,.36,0]},{name:"shinL",parent:"legL",pivot:[0,-0.15,0]},{name:"legR",parent:"hips",pivot:[.12,.36,0]},{name:"shinR",parent:"legR",pivot:[0,-0.15,0]},{name:"body",parent:"hips",pivot:[0,.39,0],drive:{ry:[["yaw",.2]],rz:[["roll",.4]]}},{name:"neck0",parent:"body",pivot:[0,.19,.04],drive:{rx:[["pitch",-0.15]],ry:[["yaw",.25]]}},{name:"neck1",parent:"neck0",pivot:[0,.09,0],drive:{rx:[["pitch",-0.1]],ry:[["yaw",.2]]},jiggle:{axis:[0,1,0],length:.2,freq:3.4,damping:.35,maxAngle:.16}},{name:"head",parent:"neck1",pivot:[0,.09,0],drive:{rx:[["pitch",-0.35]],ry:[["yaw",.55]],rz:[["roll",.6]]}},{name:"jaw",parent:"head",pivot:[0,.063,-0.18],drive:{rx:[["talk",.24]]}}],parts:[{bone:"head",shape:"roundBox",at:[0,.245,.05],half:[.2,.17,.3],round:.16,clip:{normal:[0,-1,0],offset:.145},material:"shell"},{bone:"head",shape:"roundBox",at:[0,.085,.1],half:[.208,.022,.32],round:.016,material:"bill"},{bone:"head",shape:"roundBox",at:[0,.045,-0.06],half:[.17,.035,.12],round:.02,material:"mouth"},{bone:"jaw",shape:"roundBox",at:[0,-0.017,.27],half:[.192,.018,.285],round:.014,material:"bill"},{bone:"head",shape:"cylinder",at:[-0.205,.225,.15],rot:[q,-1.05,0],radius:.08,half:.026,round:.016,material:"ring"},{bone:"head",shape:"cylinder",at:[.205,.225,.15],rot:[q,1.05,0],radius:.08,half:.026,round:.016,material:"ring"},{bone:"head",shape:"sphere",at:[-0.2,.31,.25],radius:.016,material:"servo"},{bone:"head",shape:"sphere",at:[.2,.31,.25],radius:.016,material:"servo"},{bone:"head",shape:"roundBox",at:[0,.01,0],half:[.07,.035,.07],round:.016,material:"servo"},{bone:"neck0",shape:"roundBox",at:[0,.045,0],half:[.048,.047,.042],round:.016,material:"servo"},{bone:"neck0",shape:"cylinder",at:[0,.02,0],rot:[0,0,q],radius:.026,half:.057,round:.01,material:"horn"},{bone:"neck1",shape:"roundBox",at:[0,.045,0],half:[.045,.047,.04],round:.016,material:"servo"},{bone:"neck1",shape:"cylinder",at:[0,.02,0],rot:[0,0,q],radius:.024,half:.053,round:.01,material:"horn"},{bone:"body",shape:"roundBox",at:[0,.1,-0.01],half:[.19,.1,.15],round:.085,material:"bodyShell"},{bone:"body",shape:"capsule",from:[-0.03,.12,.14],to:[.03,.12,.14],radius:.014,material:"led"},{bone:"hips",shape:"roundBox",at:[0,.37,0],half:[.15,.04,.09],round:.02,material:"servo"},{bone:"hips",shape:"cylinder",at:[-0.16,.36,0],rot:[0,0,q],radius:.045,half:.026,round:.012,material:"horn"},{bone:"hips",shape:"cylinder",at:[.16,.36,0],rot:[0,0,q],radius:.045,half:.026,round:.012,material:"horn"},...[["legL","shinL",-1],["legR","shinR",1]].flatMap(([t,e,r])=>[{bone:t,shape:"roundBox",at:[0,-0.075,0],half:[.038,.07,.042],round:.015,material:"servo"},{bone:t,shape:"cylinder",at:[0,-0.15,0],rot:[0,0,q],radius:.036,half:.05,round:.012,material:"horn"},{bone:t,shape:"plate",at:[r*.056,-0.1,-5e-3],rot:[r*q,r*Math.PI/4,q],half:[.058,.058],corner:.034,depth:.012,material:"bodyShell"},{bone:e,shape:"roundBox",at:[0,-0.06,0],half:[.034,.055,.038],round:.014,material:"servo"},{bone:e,shape:"roundBox",at:[0,-0.135,.005],half:[.048,.036,.052],round:.016,material:"servo"},{bone:e,shape:"roundBox",at:[0,-0.17,.045],half:[.074,.04,.108],round:.038,material:"boot"},{bone:e,shape:"roundBox",at:[0,-0.196,.045],half:[.079,.014,.113],round:.012,material:"sole"}])],paints:[...[-1,1].flatMap(t=>[{bone:"head",on:["bill"],kind:"sphere",at:[t*.208,.085,-0.13],radius:.013,color:"#c8261a",soft:.2},{bone:"head",on:["bill"],kind:"sphere",at:[t*.208,.085,-0.18],radius:.013,color:"#c8261a",soft:.2}]),...["shinL","shinR"].flatMap(t=>[[-0.03,.1],[.03,.1],[0,.13],[-0.03,.06],[.03,.06]].map(([e,r])=>({bone:t,on:["boot"],kind:"sphere",at:[e,-0.13,r],radius:.011,color:"#c23a14",soft:.25}))),...[-1,1].map(t=>({bone:"body",on:["bodyShell"],kind:"sphere",at:[t*.15,.03,.13],radius:.009,color:"#8d9198",soft:.2}))],eyes:{kind:"bead",bone:"head",at:[[-0.228,.225,.165],[.228,.225,.165]],radii:[.048,.048,.048],material:"lens"},anchors:{top:{bone:"head",at:[.1,.42,.08]},mouth:{bone:"head",at:[0,.06,.45]},ear:{bone:"head",at:[-0.24,.2,.05]},feet:{bone:"root",at:[0,.02,.08]},chest:{bone:"body",at:[0,.12,.16]},neck:{bone:"neck0",at:[.05,.08,.05]}},acting:{idle:{body:{rz:[0,.03,.45,0]},neck0:{rx:[0,.04,.9,0]}},thinking:{head:{rz:.22,rx:-0.1},jaw:{rx:.06},legR:{rx:[-0.05,.05,2.4,0]},shinR:{rx:[.05,.05,2.4,Math.PI]}},listening:{head:{rz:-0.24,ry:.2},neck0:{rx:.1}},speaking:{neck0:{rx:[0,.05,1.6,0]},body:{rz:[0,.03,.8,0]}},sleeping:{neck0:{rx:.08},neck1:{rx:.05},head:{rz:.12},legL:{rx:-0.12},shinL:{rx:.24},legR:{rx:-0.12},shinR:{rx:.24}},working:{neck0:{rx:[.1,.06,4.2,0]},neck1:{rx:[.04,.04,4.2,.6]},jaw:{rx:[.03,.03,8.4,0]}},error:{head:{rz:[.2,.06,9,0]},jaw:{rx:.06},legL:{rz:.1},legR:{rz:-0.1},neck0:{rx:.12}},surprised:{neck0:{rx:-0.15},head:{rx:.05}},celebrating:{legL:{rx:[-0.25,.25,2.4,0]},shinL:{rx:[.25,.25,2.4,Math.PI]},legR:{rx:[-0.25,.25,2.4,Math.PI]},shinR:{rx:[.25,.25,2.4,0]},head:{rz:[0,.2,1.2,0]}},sad:{head:{rz:-0.1},legL:{rx:-0.08},shinL:{rx:.16},legR:{rx:-0.08},shinR:{rx:.16}},happy:{legL:{rx:[-0.2,.2,4,0]},shinL:{rx:[.2,.2,4,Math.PI]},legR:{rx:[-0.2,.2,4,Math.PI]},shinR:{rx:[.2,.2,4,0]},jaw:{rx:[.08,.08,8,0]}}},fx:{error:[{glyph:"spark",anchor:"neck",rate:5,spread:.03,velocity:[.25,.3,.1],jitter:.8,gravity:2,life:[.2,.35],size:[.03,.012],color:"#ffd166",glow:true,align:true}],working:[{glyph:"dot",anchor:"chest",rate:1.6,offset:[0,.02,.02],spread:.03,velocity:[0,.1,.06],jitter:.02,life:[.7,.9],size:[.012,.004],color:"#ffb27a",glow:true}]}};var g0={id:"miso",name:"Miso",tagline:"A plush tabby with velvet fur, swivelling ears and a tail that never sits still",accent:"#e38b3c",frame:{target:.56,radius:.72},bound:{y:.56,radius:.78},motion:{hop:.14,squash:1.2,snap:1.1,talkSquash:.3},materials:{fur:{color:"#eaa15c",f0:.015,spec:.06,shininess:6,rim:1.1,sheen:.95,gloss:0,sss:.18,sssColor:"#ffcf9e"},cream:{color:"#fbe8d0",f0:.015,spec:.06,shininess:6,rim:1,sheen:.9,gloss:0,sss:.18,sssColor:"#ffe6cc"},pink:{color:"#ff9fb2",f0:.04,spec:.5,shininess:40,rim:.4,sss:.4,sssColor:"#ffc4cf"},nose:{color:"#f27a93",f0:.06,spec:1.6,shininess:160,rim:.3,gloss:.8},whisker:{color:"#fff8ee",f0:.04,spec:.6,shininess:60,rim:.5}},bones:[{name:"body",pivot:[0,0,0],drive:{ry:[["yaw",.2]],rz:[["roll",.25]]}},{name:"head",parent:"body",pivot:[0,.5,.02],drive:{rx:[["pitch",-1]],ry:[["yaw",.85]],rz:[["roll",.8]]}},{name:"earL",parent:"head",pivot:[-0.19,.38,-0.02],rest:{rz:.32},wave:{rx:[.06,.37,0]},jiggle:{axis:[0,1,0],length:.16,freq:3.2,damping:.16,maxAngle:.5}},{name:"earR",parent:"head",pivot:[.19,.38,-0.02],rest:{rz:-0.32},wave:{rx:[.06,.29,2]},jiggle:{axis:[0,1,0],length:.16,freq:3.2,damping:.16,maxAngle:.5}},{name:"pawL",parent:"body",pivot:[-0.13,.22,.17],drive:{rx:[["flap",-1.2]],rz:[["flap",-0.4]]}},{name:"pawR",parent:"body",pivot:[.13,.22,.17],drive:{rx:[["flap",-1.2]],rz:[["flap",.4]]}},{name:"tail0",parent:"body",pivot:[.12,.1,-0.24],rest:{rx:-0.5,rz:-0.5},wave:{rz:[.25,.45,0]},jiggle:{axis:[0,1,0],length:.16,freq:2,damping:.25,maxAngle:.7}},{name:"tail1",parent:"tail0",pivot:[0,.16,0],rest:{rx:-0.3},wave:{rz:[.2,.45,.8]},jiggle:{axis:[0,1,0],length:.15,freq:1.8,damping:.22,maxAngle:.8}},{name:"tail2",parent:"tail1",pivot:[0,.15,0],rest:{rx:.25},wave:{rz:[.3,.45,1.6]},jiggle:{axis:[0,1,0],length:.13,freq:1.6,damping:.2,maxAngle:.9}}],parts:[{bone:"body",shape:"ellipsoid",at:[0,.25,-0.02],radii:[.29,.26,.26],material:"fur"},{bone:"body",shape:"ellipsoid",at:[-0.17,.13,-0.02],radii:[.14,.13,.19],blend:.08,material:"fur"},{bone:"body",shape:"ellipsoid",at:[.17,.13,-0.02],radii:[.14,.13,.19],blend:.08,material:"fur"},{bone:"body",shape:"ellipsoid",at:[-0.17,.04,.14],radii:[.085,.05,.11],blend:.03,material:"cream"},{bone:"body",shape:"ellipsoid",at:[.17,.04,.14],radii:[.085,.05,.11],blend:.03,material:"cream"},{bone:"head",shape:"ellipsoid",at:[0,.2,0],radii:[.34,.28,.29],blend:.1,material:"fur"},{bone:"head",shape:"sphere",at:[-0.17,.1,.12],radius:.15,blend:.1,material:"fur"},{bone:"head",shape:"sphere",at:[.17,.1,.12],radius:.15,blend:.1,material:"fur"},{bone:"head",shape:"ellipsoid",at:[0,.09,.22],radii:[.12,.075,.08],blend:.05,material:"cream"},{bone:"head",shape:"ellipsoid",at:[0,.135,.3],rot:[.3,0,0],radii:[.032,.02,.018],blend:.01,material:"nose"},{bone:"earL",shape:"roundCone",from:[0,0,0],to:[0,.15,0],r1:.1,r2:.022,blend:.05,material:"fur"},{bone:"earL",shape:"ellipsoid",at:[0,.055,.045],radii:[.05,.075,.03],material:"pink"},{bone:"earR",shape:"roundCone",from:[0,0,0],to:[0,.15,0],r1:.1,r2:.022,blend:.05,material:"fur"},{bone:"earR",shape:"ellipsoid",at:[0,.055,.045],radii:[.05,.075,.03],material:"pink"},{bone:"pawL",shape:"capsule",from:[0,0,0],to:[0,-0.15,.03],radius:.065,blend:.05,material:"fur"},{bone:"pawL",shape:"ellipsoid",at:[0,-0.17,.05],radii:[.07,.05,.075],blend:.03,material:"cream"},{bone:"pawR",shape:"capsule",from:[0,0,0],to:[0,-0.15,.03],radius:.065,blend:.05,material:"fur"},{bone:"pawR",shape:"ellipsoid",at:[0,-0.17,.05],radii:[.07,.05,.075],blend:.03,material:"cream"},{bone:"tail0",shape:"roundCone",from:[0,0,0],to:[0,.16,0],r1:.055,r2:.05,blend:.04,material:"fur"},{bone:"tail1",shape:"roundCone",from:[0,0,0],to:[0,.15,0],r1:.05,r2:.047,blend:.02,material:"fur"},{bone:"tail2",shape:"roundCone",from:[0,0,0],to:[0,.12,0],r1:.047,r2:.04,blend:.02,material:"cream"},{bone:"head",shape:"capsule",from:[-0.13,.1,.27],to:[-0.33,.13,.24],radius:.005,material:"whisker"},{bone:"head",shape:"capsule",from:[-0.13,.08,.27],to:[-0.33,.06,.23],radius:.005,material:"whisker"},{bone:"head",shape:"capsule",from:[.13,.1,.27],to:[.33,.13,.24],radius:.005,material:"whisker"},{bone:"head",shape:"capsule",from:[.13,.08,.27],to:[.33,.06,.23],radius:.005,material:"whisker"}],paints:[{bone:"head",on:["fur"],kind:"ellipse",at:[0,.4,.2],radii:[.022,.08],color:"#c4733a",soft:.5},{bone:"head",on:["fur"],kind:"ellipse",at:[-0.075,.38,.2],radii:[.018,.065],color:"#c4733a",soft:.5},{bone:"head",on:["fur"],kind:"ellipse",at:[.075,.38,.2],radii:[.018,.065],color:"#c4733a",soft:.5},{bone:"body",on:["fur"],kind:"ellipse",at:[0,.24,.2],radii:[.17,.2],color:"#fbe8d0",soft:.35},{bone:"head",on:["fur"],kind:"sphere",at:[-0.21,.1,.24],radius:.06,color:"#ff9db0",soft:.6,opacity:.75},{bone:"head",on:["fur"],kind:"sphere",at:[.21,.1,.24],radius:.06,color:"#ff9db0",soft:.6,opacity:.75}],eyes:{kind:"ball",bone:"head",at:[[-0.125,.22,.2],[.125,.22,.2]],radius:.088,iris:"#8ccf4d",irisSize:.78,pupilSize:.42,pupilAspect:.5,lid:"fur"},face:{kind:"mouth",bone:"head",on:["cream"],at:[0,.06,.29],width:.045,color:"#5b2630",tongue:"#ff8ea3"},anchors:{top:{bone:"head",at:[.2,.42,.08]},mouth:{bone:"head",at:[0,.06,.32]},ear:{bone:"head",at:[-0.34,.25,0]},feet:{bone:"root",at:[0,.03,.18]},tail:{bone:"tail2",at:[0,.12,0]}},acting:{idle:{tail0:{rz:[-0.5,.15,.4,0]}},thinking:{pawR:{rx:-1.75,rz:.35},tail2:{rx:[.25,.3,1.6,0]},earL:{ry:.5}},listening:{earL:{rx:-0.35,ry:-0.6},earR:{rx:-0.35},tail0:{rz:-0.35}},speaking:{pawL:{rx:[-0.4,.25,1.2,0]},pawR:{rx:[-0.3,.25,1.2,1.9]},tail0:{rz:[-0.5,.2,.9,0]}},sleeping:{earL:{rz:.5,rx:.4},earR:{rz:-0.5,rx:.4},tail0:{rx:.4,rz:-1.2},tail1:{rx:.5}},working:{pawL:{rx:[-0.35,.3,3.4,0]},pawR:{rx:[-0.35,.3,3.4,Math.PI]},earL:{rx:-0.25},earR:{rx:-0.25},tail2:{rx:[.25,.2,1.7,0]}},error:{earL:{rz:1.1,rx:.3},earR:{rz:-1.1,rx:.3},tail0:{rx:[-0.9,.05,12,0],rz:0},tail1:{rx:.3},tail2:{rx:.2}},surprised:{earL:{rz:-0.1,rx:-0.2},earR:{rz:.1,rx:-0.2},pawL:{rx:-1.4,rz:-0.4},pawR:{rx:-1.4,rz:.4},tail0:{rx:-0.9,rz:0}},celebrating:{pawL:{rx:[-2.2,.35,4,0],rz:-0.5},pawR:{rx:[-2.2,.35,4,Math.PI],rz:.5},tail0:{rz:[-0.4,.5,2.6,0]}},sad:{earL:{rz:.95,rx:.35},earR:{rz:-0.95,rx:.35},tail0:{rx:.7,rz:-0.8},tail1:{rx:.3},tail2:{rx:.1}},happy:{pawL:{rx:[-1.6,.3,5,0]},pawR:{rx:[-1.6,.3,5,1.4]},tail0:{rz:[-0.5,.45,3,0]}}},fx:{happy:[{glyph:"heart",anchor:"top",rate:1.2,spread:.15,velocity:[0,.22,.05],jitter:.12,wobble:.06,life:[1,1.3],size:[.04,.07],color:"#ff86a2"}]}};var x0={id:"mochi",name:"Mochi",tagline:"Translucent jelly that squashes and splashes, with a propeller sprout",accent:"#1fae8a",frame:{target:.56,radius:.8},bound:{y:.5,radius:.82},motion:{hop:.17,squash:1.9,snap:.9,talkSquash:1.3},materials:{jelly:{color:"#3fcf9f",f0:.06,spec:1.6,shininess:140,rim:.7,sss:.55,sssColor:"#9effd9",gloss:.9},bead:{color:"#120d18",f0:.06,spec:2.2,shininess:400,rim:.2,gloss:1},leaf:{color:"#5bbf3a",f0:.04,spec:.7,shininess:50,rim:.6,sss:.25,sssColor:"#c8ff7a"}},bones:[{name:"body",pivot:[0,0,0],drive:{rx:[["pitch",-0.35]],ry:[["yaw",.55]],rz:[["roll",.6]]}},{name:"sprout",parent:"body",pivot:[0,.83,-0.02],jiggle:{axis:[0,1,0],length:.16,freq:2.2,damping:.09}}],parts:[{bone:"body",shape:"sphere",at:[0,.41,0],radius:.42,material:"jelly"},{bone:"body",shape:"ellipsoid",at:[0,.17,0],radii:[.5,.17,.47],blend:.24,material:"jelly"},{bone:"body",shape:"roundCone",from:[0,.62,0],to:[0,.83,-0.02],r1:.17,r2:.035,blend:.22,material:"jelly"},{bone:"sprout",shape:"capsule",from:[0,-0.02,0],to:[0,.09,0],radius:.014,material:"leaf"},{bone:"sprout",shape:"ellipsoid",at:[-0.065,.11,0],rot:[0,.3,.5],radii:[.075,.018,.042],blend:.015,material:"leaf"},{bone:"sprout",shape:"ellipsoid",at:[.07,.12,0],rot:[0,-0.3,-0.45],radii:[.08,.018,.045],blend:.015,material:"leaf"}],paints:[{bone:"body",on:["jelly"],kind:"sphere",at:[-0.25,.32,.31],radius:.07,color:"#ff8fa8",soft:.6,opacity:.8},{bone:"body",on:["jelly"],kind:"sphere",at:[.25,.32,.31],radius:.07,color:"#ff8fa8",soft:.6,opacity:.8}],eyes:{kind:"bead",bone:"body",at:[[-0.14,.43,.385],[.14,.43,.385]],radii:[.045,.066,.03],material:"bead"},face:{kind:"mouth",bone:"body",on:["jelly"],at:[0,.32,.4],width:.065,color:"#173528",tongue:"#ff7d97"},anchors:{top:{bone:"body",at:[.16,.86,.1]},mouth:{bone:"body",at:[0,.32,.42]},ear:{bone:"body",at:[-0.42,.45,0]},feet:{bone:"root",at:[0,.05,.25]}},acting:{idle:{sprout:{rz:[0,.1,.6,0]}},thinking:{sprout:{rx:-0.15,ry:[0,0,0,0,7]}},listening:{sprout:{rx:-0.4,rz:.15}},speaking:{sprout:{rz:[0,.2,2.4,0]}},sleeping:{sprout:{rx:.85,rz:.35}},working:{sprout:{ry:[0,0,0,0,3]}},error:{sprout:{rx:.45,rz:[.3,.15,12,0]}},surprised:{sprout:{rx:-0.3}},celebrating:{sprout:{ry:[0,0,0,0,18]}},sad:{sprout:{rx:1.1,rz:.5}},happy:{sprout:{ry:[0,0,0,0,16]}}},fx:{replace:["land"],land:[{glyph:"drop",anchor:"feet",rate:7,spread:.18,velocity:[0,.65,.05],jitter:.7,gravity:3.2,life:[.45,.6],size:[.035,.022],color:"#55d6ad",align:true}],"enter:happy":[{glyph:"drop",anchor:"top",rate:5,velocity:[0,.7,.05],jitter:.9,gravity:3,life:[.5,.7],size:[.035,.02],color:"#6fe3bd",align:true}]}};var v0={id:"pebble",name:"Pebble",tagline:"A penguin chick in a knitted scarf: satin coat, waddling walk, flippers that flap when it is happy",accent:"#3d5a9e",frame:{target:.56,radius:.76},bound:{y:.52,radius:.74},motion:{hop:.12,squash:1.2,snap:1.05,talkSquash:.45},materials:{coat:{color:"#27324f",f0:.04,spec:.7,shininess:46,rim:1,sheen:.55,gloss:.35,surface:{kind:"fur",scale:130,strength:.28,bone:"head"}},bodyCoat:{color:"#27324f",shadeOf:"coat",f0:.04,spec:.7,shininess:46,rim:1,sheen:.55,gloss:.35,surface:{kind:"fur",scale:130,strength:.28}},flipper:{color:"#222b45",shadeOf:"coat",f0:.04,spec:.8,shininess:50,rim:.9,sheen:.5,gloss:.4},beak:{color:"#ffa53d",f0:.05,spec:1,shininess:80,rim:.4,gloss:.6},mouth:{color:"#5d1a22",f0:.04,spec:.5,shininess:30,rim:0},feet:{color:"#ff9b3d",f0:.04,spec:.7,shininess:50,rim:.35,gloss:.4,sss:.25,sssColor:"#ffc68a"},knit:{color:"#e8433f",f0:.02,spec:.15,shininess:10,rim:.7,sheen:.7,surface:{kind:"scales",scale:42,strength:.75,color:"#a8242a"}},knitStripe:{color:"#fff2e6",f0:.02,spec:.15,shininess:10,rim:.6,sheen:.7}},bones:[{name:"body",pivot:[0,0,0],drive:{ry:[["yaw",.2]],rz:[["roll",.35]]},wave:{rz:[.035,.9,0]}},{name:"head",parent:"body",pivot:[0,.6,.01],drive:{rx:[["pitch",-1]],ry:[["yaw",.8]],rz:[["roll",.7]]}},{name:"beak",parent:"head",pivot:[0,.12,.27],drive:{rx:[["talk",-0.22]]}},{name:"jaw",parent:"head",pivot:[0,.12,.27],drive:{rx:[["talk",.75]]}},{name:"tuft",parent:"head",pivot:[0,.42,.02],rest:{rx:-0.2},jiggle:{axis:[0,1,0],length:.1,freq:3.4,damping:.15}},{name:"flipperL",parent:"body",pivot:[-0.3,.5,0],rest:{rz:-0.2},drive:{rz:[["flap",-1.4]]},jiggle:{axis:[0,-1,0],length:.26,freq:3.4,damping:.3,maxAngle:.45}},{name:"flipperR",parent:"body",pivot:[.3,.5,0],rest:{rz:.2},drive:{rz:[["flap",1.4]]},jiggle:{axis:[0,-1,0],length:.26,freq:3.4,damping:.3,maxAngle:.45}},{name:"scarf",parent:"body",pivot:[.13,.56,.25],rest:{rz:.12,rx:-0.15},jiggle:{axis:[0,-1,0],length:.2,freq:2.4,damping:.16,maxAngle:.7}},{name:"tail",parent:"body",pivot:[0,.1,-0.27],rest:{rx:-1.2},jiggle:{axis:[0,1,0],length:.08,freq:3,damping:.2}}],parts:[{bone:"body",shape:"ellipsoid",at:[0,.34,-0.01],radii:[.32,.34,.29],material:"bodyCoat"},{bone:"head",shape:"sphere",at:[0,.16,0],radius:.28,blend:.14,material:"coat"},{bone:"body",shape:"ellipsoid",at:[0,.575,.005],radii:[.3,.078,.28],material:"knit"},{bone:"scarf",shape:"roundBox",at:[0,-0.1,.01],half:[.05,.1,.018],round:.016,material:"knit"},{bone:"scarf",shape:"roundBox",at:[0,-0.195,.01],half:[.052,.018,.02],round:.012,material:"knitStripe"},{bone:"head",shape:"ellipsoid",at:[0,.12,.29],radii:[.035,.02,.025],material:"mouth"},{bone:"beak",shape:"ellipsoid",at:[0,0,.035],rot:[.15,0,0],radii:[.05,.034,.05],clip:{normal:[0,-1,0]},material:"beak"},{bone:"beak",shape:"ellipsoid",at:[0,0,.035],rot:[.15,0,0],radii:[.041,.028,.042],clip:{normal:[0,-1,0],offset:.003},material:"mouth"},{bone:"jaw",shape:"ellipsoid",at:[0,0,.026],radii:[.043,.025,.044],clip:{normal:[0,1,0]},material:"beak"},{bone:"jaw",shape:"ellipsoid",at:[0,0,.026],radii:[.035,.019,.036],clip:{normal:[0,1,0],offset:.003},material:"mouth"},{bone:"tuft",shape:"roundCone",from:[0,-0.03,0],to:[.01,.07,.02],r1:.035,r2:.008,blend:.03,material:"coat"},{bone:"tuft",shape:"roundCone",from:[0,-0.03,0],to:[-0.04,.05,-0.02],r1:.028,r2:.007,blend:.03,material:"coat"},{bone:"flipperL",shape:"ellipsoid",at:[-0.02,-0.16,.02],rot:[0,0,-0.12],radii:[.045,.2,.11],blend:.02,material:"flipper"},{bone:"flipperR",shape:"ellipsoid",at:[.02,-0.16,.02],rot:[0,0,.12],radii:[.045,.2,.11],blend:.02,material:"flipper"},{bone:"tail",shape:"ellipsoid",at:[0,.05,0],radii:[.08,.07,.025],blend:.03,material:"bodyCoat"},...[-1,1].flatMap(t=>[{bone:"root",shape:"ellipsoid",at:[t*.13,.03,.17],rot:[0,t*.25,0],radii:[.1,.03,.11],material:"feet"},...[-1,0,1].map(e=>({bone:"root",shape:"sphere",at:[t*.16+e*.055,.03,.26-Math.abs(e)*.02],radius:.034,blend:.03,material:"feet"}))])],paints:[{bone:"body",on:["bodyCoat"],kind:"ellipse",at:[0,.3,.08],radii:[.24,.27],color:"#f8f6f0",soft:.12},{bone:"head",on:["coat"],kind:"sphere",at:[-0.1,.13,.22],radius:.14,color:"#f8f6f0",soft:.12},{bone:"head",on:["coat"],kind:"sphere",at:[.1,.13,.22],radius:.14,color:"#f8f6f0",soft:.12},{bone:"head",on:["coat"],kind:"ellipse",at:[0,.02,.1],radii:[.17,.08],color:"#f8f6f0",soft:.2},{bone:"head",on:["coat"],kind:"sphere",at:[-0.17,.06,.2],radius:.05,color:"#ff9eb0",soft:.6,opacity:.8},{bone:"head",on:["coat"],kind:"sphere",at:[.17,.06,.2],radius:.05,color:"#ff9eb0",soft:.6,opacity:.8},{bone:"scarf",on:["knit"],kind:"ellipse",at:[0,-0.12,0],radii:[.08,.018],color:"#fff2e6",soft:.15}],eyes:{kind:"ball",bone:"head",at:[[-0.1,.18,.23],[.1,.18,.23]],radius:.066,iris:"#1d2233",irisSize:.8,pupilSize:.5,lid:"coat"},anchors:{top:{bone:"head",at:[.12,.44,.06]},mouth:{bone:"head",at:[0,.11,.36]},ear:{bone:"head",at:[-0.3,.18,0]},feet:{bone:"root",at:[0,.02,.17]},chest:{bone:"body",at:[0,.4,.3]}},acting:{idle:{tail:{rz:[0,.2,.9,0]}},thinking:{flipperR:{rz:1.2,rx:-1.1,ry:-0.3},head:{rz:.1}},listening:{flipperL:{rz:-0.9,rx:-0.3},tuft:{rx:-0.35}},speaking:{flipperL:{rz:[-0.15,.15,1.8,0]},flipperR:{rz:[.15,.15,1.8,1.5]}},sleeping:{flipperL:{ry:.6,rz:.2},flipperR:{ry:-0.6,rz:-0.2},tuft:{rx:.5}},working:{flipperL:{rx:[-0.7,.15,6,0],rz:.2},flipperR:{rx:[-0.7,.15,6,Math.PI],rz:-0.2},head:{rx:.12}},error:{flipperL:{rz:[-1.25,.08,13,0]},flipperR:{rz:[1.25,.08,13,1]},tuft:{rx:-0.6}},surprised:{flipperL:{rz:-1.6,rx:-0.3},flipperR:{rz:1.6,rx:-0.3},tuft:{rx:-0.7}},celebrating:{flipperL:{rz:[-1.1,.55,8,0]},flipperR:{rz:[1.1,.55,8,0]},tail:{rz:[0,.4,4,0]}},sad:{flipperL:{rz:.18},flipperR:{rz:-0.18},tuft:{rx:.8},scarf:{rx:.1}},happy:{flipperL:{rz:[-0.8,.6,9,0]},flipperR:{rz:[.8,.6,9,0]},tail:{rz:[0,.35,5,0]}}},fx:{replace:["land"],land:[{glyph:"puff",anchor:"feet",rate:8,spread:.12,velocity:[0,.06,0],jitter:.34,drag:3.5,life:[.5,.75],size:[.05,.12],color:"#eef4ff"}],celebrating:[{glyph:"sparkle",anchor:"top",rate:3,spread:.4,velocity:[0,-0.05,0],jitter:.08,wobble:.08,life:[1.4,1.8],size:[.04,.01],spin:1.2,color:"#dff0ff"}]}};var y0={id:"pip",name:"Pip",tagline:"Sings with a real beak, snaps its head like a bird, flaps",accent:"#e8892a",frame:{target:.66,radius:.86},bound:{y:.62,radius:.92},motion:{hop:.13,squash:1.1,snap:1.25,snapLook:1,talkSquash:.5},materials:{feather:{color:"#f4a63c",f0:.03,spec:.22,shininess:14,rim:.9,sheen:.55},wing:{color:"#d8692a",shadeOf:"feather",f0:.03,spec:.25,shininess:16,rim:.8,sheen:.5},beak:{color:"#ff7a45",f0:.05,spec:.9,shininess:70,rim:.4,gloss:.6},feet:{color:"#e9683b",f0:.04,spec:.6,shininess:40,rim:.3},mouth:{color:"#6b1a26",f0:.04,spec:.6,shininess:40,rim:0},tongue:{color:"#ff7f91",f0:.05,spec:1,shininess:60,rim:.2,gloss:.6}},bones:[{name:"body",pivot:[0,0,0],drive:{rz:[["roll",.3]],rx:[["pitch",-0.12]]}},{name:"head",parent:"body",pivot:[0,.62,0],drive:{rx:[["pitch",-1]],ry:[["yaw",.9]],rz:[["roll",.8]]}},{name:"beak",parent:"head",pivot:[0,.14,.33],drive:{rx:[["talk",-0.24]]}},{name:"jaw",parent:"head",pivot:[0,.14,.33],drive:{rx:[["talk",.8]]}},{name:"tuft",parent:"head",pivot:[0,.5,.04],rest:{rx:.25},jiggle:{axis:[0,1,0],length:.14,freq:3,damping:.14}},{name:"wingL",parent:"body",pivot:[-0.38,.6,-0.02],drive:{rz:[["flap",-1.5]]},wave:{rz:[.04,.8,0]},jiggle:{axis:[0,-1,0],length:.3,freq:3.2,damping:.3,maxAngle:.5}},{name:"wingR",parent:"body",pivot:[.38,.6,-0.02],drive:{rz:[["flap",1.5]]},wave:{rz:[-0.04,.8,1.1]},jiggle:{axis:[0,-1,0],length:.3,freq:3.2,damping:.3,maxAngle:.5}},{name:"tail",parent:"body",pivot:[0,.3,-0.36],rest:{rx:-0.95},jiggle:{axis:[0,1,0],length:.18,freq:2.6,damping:.18}}],parts:[{bone:"body",shape:"ellipsoid",at:[0,.42,0],radii:[.45,.41,.42],material:"feather"},{bone:"head",shape:"sphere",at:[0,.18,.03],radius:.35,blend:.18,material:"feather"},{bone:"head",shape:"ellipsoid",at:[0,.14,.37],radii:[.05,.03,.035],material:"mouth"},{bone:"beak",shape:"ellipsoid",at:[0,0,.06],rot:[.12,0,0],radii:[.076,.056,.1],clip:{normal:[0,-1,0]},material:"beak"},{bone:"beak",shape:"ellipsoid",at:[0,0,.06],rot:[.12,0,0],radii:[.064,.048,.088],clip:{normal:[0,-1,0],offset:.003},material:"mouth"},{bone:"jaw",shape:"ellipsoid",at:[0,0,.045],radii:[.064,.04,.08],clip:{normal:[0,1,0]},material:"beak"},{bone:"jaw",shape:"ellipsoid",at:[0,0,.045],radii:[.053,.032,.068],clip:{normal:[0,1,0],offset:.003},material:"mouth"},{bone:"jaw",shape:"ellipsoid",at:[0,.002,.04],radii:[.034,.01,.042],material:"tongue"},{bone:"tuft",shape:"roundCone",from:[0,-0.04,0],to:[.015,.12,.03],r1:.045,r2:.01,blend:.03,material:"feather"},{bone:"tuft",shape:"roundCone",from:[0,-0.04,-0.02],to:[-0.05,.08,-0.05],r1:.035,r2:.008,blend:.03,material:"feather"},{bone:"tuft",shape:"roundCone",from:[0,-0.04,-0.02],to:[.06,.07,-0.04],r1:.03,r2:.008,blend:.03,material:"feather"},{bone:"wingL",shape:"ellipsoid",at:[-0.02,-0.17,0],rot:[0,0,-0.18],radii:[.08,.23,.2],blend:.02,material:"wing"},{bone:"wingR",shape:"ellipsoid",at:[.02,-0.17,0],rot:[0,0,.18],radii:[.08,.23,.2],blend:.02,material:"wing"},{bone:"tail",shape:"ellipsoid",at:[0,.1,0],radii:[.14,.12,.035],blend:.04,material:"wing"},{bone:"root",shape:"capsule",from:[-0.15,.03,.12],to:[-0.2,.025,.25],radius:.026,material:"feet"},{bone:"root",shape:"capsule",from:[-0.15,.03,.12],to:[-0.12,.025,.26],radius:.026,material:"feet"},{bone:"root",shape:"capsule",from:[-0.15,.03,.12],to:[-0.15,.06,.02],radius:.03,blend:.02,material:"feet"},{bone:"root",shape:"capsule",from:[.15,.03,.12],to:[.2,.025,.25],radius:.026,material:"feet"},{bone:"root",shape:"capsule",from:[.15,.03,.12],to:[.12,.025,.26],radius:.026,material:"feet"},{bone:"root",shape:"capsule",from:[.15,.03,.12],to:[.15,.06,.02],radius:.03,blend:.02,material:"feet"}],paints:[{bone:"body",on:["feather"],kind:"ellipse",at:[0,.3,0],radii:[.29,.28],color:"#fde7c0",soft:.07},{bone:"head",on:["feather"],kind:"sphere",at:[-0.22,.08,.27],radius:.075,color:"#ff8c8c",soft:.6,opacity:.75},{bone:"head",on:["feather"],kind:"sphere",at:[.22,.08,.27],radius:.075,color:"#ff8c8c",soft:.6,opacity:.75}],eyes:{kind:"ball",bone:"head",at:[[-0.14,.24,.3],[.14,.24,.3]],radius:.078,iris:"#4a2a12",irisSize:.72,pupilSize:.42,lid:"feather"},anchors:{top:{bone:"head",at:[.14,.5,.1]},mouth:{bone:"head",at:[0,.13,.47]},ear:{bone:"head",at:[-0.32,.22,0]},feet:{bone:"root",at:[0,.02,.12]},chest:{bone:"body",at:[0,.45,.32]}},acting:{idle:{tail:{rx:[0,.14,1.3,0]}},thinking:{wingR:{rz:1.05,rx:-0.95,ry:-0.35},tuft:{rx:.25},tail:{rx:[0,.08,.5,0]}},listening:{wingL:{rz:-1.1,rx:-0.55},tuft:{rx:-0.4},head:{rz:.12}},speaking:{head:{rx:[-0.14,.05,1.1,0]},wingL:{rz:[-0.18,.14,2.3,0]},wingR:{rz:[.18,.14,2.3,1.2]},tail:{rx:[0,.22,2.3,.5]}},sleeping:{wingL:{ry:.5,rz:.12},wingR:{ry:-0.5,rz:-0.12},tuft:{rx:.75}},working:{wingL:{rz:[-0.4,.18,6,0],rx:-0.6},wingR:{rz:[.4,.18,6,Math.PI],rx:-0.6},head:{rx:[.1,.07,5.2,0]}},error:{wingL:{rz:[-1,.1,12,0]},wingR:{rz:[1,.1,12,1]},tuft:{rx:-0.5},tail:{rx:-0.45}},surprised:{wingL:{rz:-1.7},wingR:{rz:1.7},tuft:{rx:-0.6},tail:{rx:-0.5}},celebrating:{wingL:{rz:[-1.4,.5,9,0]},wingR:{rz:[1.4,.5,9,0]},tail:{rx:[0,.3,6,0]},tuft:{rx:[0,.25,6,0]}},sad:{wingL:{rz:.25},wingR:{rz:-0.25},tuft:{rx:.9},tail:{rx:.5}},happy:{wingL:{rz:[-0.9,.75,7,0]},wingR:{rz:[.9,.75,7,0]},tail:{rx:[0,.3,5,0]},tuft:{rx:[0,.2,5,0]}}},fx:{replace:["syllable"],syllable:[{glyph:"note",anchor:"mouth",rate:1,offset:[.12,-0.03,.02],velocity:[.2,.13,.05],jitter:.06,wobble:.07,life:[1.1,1.5],size:[.045,.075],rotation:-0.15,color:"#f08a3c"}],happy:[{glyph:"note",anchor:"mouth",rate:1.6,velocity:[0,.24,.05],jitter:.25,wobble:.07,life:[1,1.3],size:[.04,.07],rotation:.15,color:"#e8664a"}],"enter:happy":[{glyph:"feather",anchor:"chest",rate:4,spread:.12,velocity:[0,.18,.12],jitter:.45,gravity:.12,drag:1.4,wobble:.14,life:[1.8,2.4],size:[.05,.05],spin:1.6,color:"#f6b04a"}]}};var w0=[{parent:"head",at:[0,.43,.05],tilt:-0.1,size:.075},{parent:"head",at:[0,.41,-0.1],tilt:-0.5,size:.09},{parent:"head",at:[0,.3,-0.24],tilt:-1,size:.085},{parent:"body",at:[0,.5,-0.24],tilt:-1.2,size:.08},{parent:"body",at:[0,.34,-0.3],tilt:-1.45,size:.07},{parent:"tail0",at:[0,.12,.07],tilt:0,size:.06},{parent:"tail1",at:[0,.1,.05],tilt:0,size:.045}],k0={id:"rex",name:"Rex",tagline:"A baby T. rex with pebbly scales, wobbly back spikes, tiny arms and a wagging tail",accent:"#4fb86a",frame:{target:.52,radius:.76},bound:{y:.5,radius:.8},motion:{hop:.15,squash:1.15,snap:1.05,talkSquash:.35},materials:{hide:{color:"#78cf7f",f0:.04,spec:.7,shininess:40,rim:.7,gloss:.35,sss:.2,sssColor:"#c8ffb0",surface:{kind:"scales",scale:24,strength:.5,color:"#4b9f5d",bone:"head"}},bodyHide:{color:"#78cf7f",shadeOf:"hide",f0:.04,spec:.7,shininess:40,rim:.7,gloss:.35,sss:.2,sssColor:"#c8ffb0",surface:{kind:"scales",scale:24,strength:.5,color:"#4b9f5d"}},belly:{color:"#fff0c4",f0:.04,spec:.5,shininess:30,rim:.5,gloss:.3,sss:.25,sssColor:"#fff6d8"},spike:{color:"#ff9b4a",f0:.05,spec:.9,shininess:60,rim:.5,gloss:.5,sss:.35,sssColor:"#ffc58f"},claw:{color:"#fff6e2",f0:.05,spec:1,shininess:80,rim:.3,gloss:.6}},bones:[{name:"body",pivot:[0,0,0],drive:{ry:[["yaw",.25]],rz:[["roll",.3]]}},{name:"head",parent:"body",pivot:[0,.56,.06],drive:{rx:[["pitch",-1]],ry:[["yaw",.8]],rz:[["roll",.7]]}},{name:"armL",parent:"body",pivot:[-0.15,.42,.25],rest:{rx:-0.6},drive:{rx:[["flap",-0.9]],rz:[["flap",-0.5]]}},{name:"armR",parent:"body",pivot:[.15,.42,.25],rest:{rx:-0.6},drive:{rx:[["flap",-0.9]],rz:[["flap",.5]]}},{name:"tail0",parent:"body",pivot:[.08,.17,-0.24],rest:{rx:-1.25,rz:-0.6},wave:{rz:[.2,.5,0]},jiggle:{axis:[0,1,0],length:.18,freq:2.2,damping:.25,maxAngle:.6}},{name:"tail1",parent:"tail0",pivot:[0,.18,0],rest:{rx:.2},wave:{rz:[.2,.5,.8]},jiggle:{axis:[0,1,0],length:.15,freq:2,damping:.22,maxAngle:.7}},{name:"tail2",parent:"tail1",pivot:[0,.15,0],rest:{rx:.15},wave:{rz:[.25,.5,1.6]},jiggle:{axis:[0,1,0],length:.12,freq:1.8,damping:.2,maxAngle:.8}},...w0.map(({parent:t,at:e,tilt:r},a)=>({name:`spike${a}`,parent:t,pivot:e,rest:{rx:r},jiggle:{axis:[0,1,0],length:.08,freq:4+a*.3,damping:.12,maxAngle:.45}}))],parts:[{bone:"body",shape:"ellipsoid",at:[0,.3,-0.02],radii:[.3,.3,.28],material:"bodyHide"},{bone:"body",shape:"ellipsoid",at:[-0.19,.15,-0.02],radii:[.13,.15,.17],blend:.08,material:"bodyHide"},{bone:"body",shape:"ellipsoid",at:[.19,.15,-0.02],radii:[.13,.15,.17],blend:.08,material:"bodyHide"},...[-1,1].flatMap(t=>[{bone:"body",shape:"ellipsoid",at:[t*.2,.045,.1],radii:[.1,.05,.13],blend:.05,material:"bodyHide"},...[-1,0,1].map(e=>({bone:"body",shape:"ellipsoid",at:[t*.2+e*.05,.03,.225-Math.abs(e)*.015],radii:[.022,.022,.026],blend:.012,material:"claw"}))]),{bone:"head",shape:"ellipsoid",at:[0,.2,-0.02],radii:[.29,.25,.27],blend:.12,material:"hide"},{bone:"head",shape:"ellipsoid",at:[0,.1,.17],radii:[.23,.14,.18],blend:.1,material:"hide"},{bone:"head",shape:"sphere",at:[-0.05,.17,.34],radius:.014,op:"sub",blend:.01,material:"hide"},{bone:"head",shape:"sphere",at:[.05,.17,.34],radius:.014,op:"sub",blend:.01,material:"hide"},...[["armL",-1],["armR",1]].flatMap(([t,e])=>[{bone:t,shape:"capsule",from:[0,0,0],to:[e*.01,-0.1,.03],radius:.042,blend:.04,material:"bodyHide"},{bone:t,shape:"sphere",at:[e*-0.014,-0.135,.05],radius:.015,blend:.01,material:"claw"},{bone:t,shape:"sphere",at:[e*.02,-0.135,.045],radius:.015,blend:.01,material:"claw"}]),{bone:"tail0",shape:"roundCone",from:[0,0,0],to:[0,.18,0],r1:.12,r2:.09,blend:.06,material:"bodyHide"},{bone:"tail1",shape:"roundCone",from:[0,0,0],to:[0,.15,0],r1:.09,r2:.06,blend:.03,material:"bodyHide"},{bone:"tail2",shape:"roundCone",from:[0,0,0],to:[0,.12,0],r1:.06,r2:.03,blend:.03,material:"bodyHide"},...w0.map(({size:t},e)=>({bone:`spike${e}`,shape:"roundCone",from:[0,-0.02,0],to:[0,t*1.1,0],r1:t*.65,r2:t*.15,blend:.025,material:"spike"}))],paints:[{bone:"body",on:["bodyHide"],kind:"ellipse",at:[0,.24,.08],radii:[.16,.2],color:"#fff0c4",soft:.2},{bone:"head",on:["hide"],kind:"ellipse",at:[0,-0.01,.15],radii:[.17,.06],color:"#fff0c4",soft:.35},{bone:"head",on:["hide"],kind:"sphere",at:[-0.2,.12,.24],radius:.055,color:"#ff9a9a",soft:.6,opacity:.7},{bone:"head",on:["hide"],kind:"sphere",at:[.2,.12,.24],radius:.055,color:"#ff9a9a",soft:.6,opacity:.7},...[[-0.09,.22],[-0.115,.19],[.09,.22],[.115,.19]].map(([t,e])=>({bone:"head",on:["hide"],kind:"sphere",at:[t,e,.31],radius:.009,color:"#3f8a4f",soft:.3}))],eyes:{kind:"ball",bone:"head",at:[[-0.13,.26,.19],[.13,.26,.19]],radius:.085,iris:"#e0942f",irisSize:.78,pupilSize:.46,pupilAspect:.75,lid:"hide"},face:{kind:"mouth",bone:"head",on:["hide"],at:[0,.06,.34],width:.1,color:"#5b1f2b",tongue:"#ff7f93"},anchors:{top:{bone:"head",at:[.16,.44,.06]},mouth:{bone:"head",at:[0,.06,.37]},ear:{bone:"head",at:[-0.3,.22,0]},feet:{bone:"root",at:[0,.02,.15]},tail:{bone:"tail2",at:[0,.12,0]}},acting:{idle:{tail0:{rz:[-0.6,.12,.45,0]}},thinking:{armR:{rx:[-1.3,.08,2.5,0],rz:.3},tail2:{rx:[.15,.3,1.4,0]}},listening:{armL:{rx:-1.1,rz:-0.6},tail0:{rz:-0.4}},speaking:{armL:{rx:[-0.6,.25,1.6,0]},armR:{rx:[-0.6,.25,1.6,2]},tail0:{rz:[-0.6,.18,.9,0]}},sleeping:{armL:{rx:.1,rz:.2},armR:{rx:.1,rz:-0.2},tail0:{rz:-1.3,rx:-1},tail1:{rx:.4}},working:{armL:{rx:[-0.9,.15,7,0]},armR:{rx:[-0.9,.15,7,Math.PI]},head:{rx:.12},tail2:{rx:[.15,.2,2,0]}},error:{armL:{rx:[-1.6,.35,9,0],rz:-0.4},armR:{rx:[-1.6,.35,9,1.4],rz:.4},tail0:{rz:[-0.5,.06,12,0],rx:-1.45},spike1:{rx:-0.2},spike2:{rx:-0.6},spike3:{rx:-0.8}},surprised:{armL:{rx:-1.9,rz:-0.6},armR:{rx:-1.9,rz:.6},tail0:{rx:-1.5}},celebrating:{armL:{rx:[-2.2,.3,4,0],rz:-0.5},armR:{rx:[-2.2,.3,4,Math.PI],rz:.5},tail0:{rz:[-0.6,.55,3,0]}},sad:{armL:{rx:.2},armR:{rx:.2},tail0:{rx:-0.95,rz:-0.4},tail1:{rx:.35}},happy:{armL:{rx:[-1.4,.4,6,0]},armR:{rx:[-1.4,.4,6,1.4]},tail0:{rz:[-0.6,.5,4,0]}}},fx:{"enter:surprised":[{glyph:"arc",anchor:"mouth",rate:3,offset:[.08,0,.05],mirror:true,velocity:[.3,.05,.1],jitter:.04,life:[.5,.6],size:[.04,.11],color:"#7fd18a"}]}};var z0={id:"tad",name:"Tad",tagline:"A glossy tree frog with a wet sheen, eyes on top and a throat that puffs as it talks",accent:"#3fae4a",frame:{target:.42,radius:.66},bound:{y:.4,radius:.72},motion:{hop:.26,squash:1.6,snap:1.2,look:.8,talkSquash:.45},materials:{skin:{color:"#5fc24e",f0:.07,spec:2,shininess:260,rim:.7,gloss:.95,sss:.3,sssColor:"#c6ff8f",surface:{kind:"speckle",scale:9,strength:.85,color:"#2f8a3a",bone:"head"}},bodySkin:{color:"#5fc24e",shadeOf:"skin",f0:.07,spec:2,shininess:260,rim:.7,gloss:.95,sss:.3,sssColor:"#c6ff8f",surface:{kind:"speckle",scale:9,strength:.85,color:"#2f8a3a"}},belly:{color:"#f3f0b6",f0:.06,spec:1.6,shininess:200,rim:.5,gloss:.9,sss:.45,sssColor:"#fffbd0"},toe:{color:"#ffb54a",f0:.06,spec:1.4,shininess:160,rim:.4,gloss:.8,sss:.3,sssColor:"#ffd99a"}},bones:[{name:"body",pivot:[0,0,0],drive:{ry:[["yaw",.25]],rz:[["roll",.3]]}},{name:"head",parent:"body",pivot:[0,.3,.02],drive:{rx:[["pitch",-0.8]],ry:[["yaw",.7]],rz:[["roll",.6]]}},{name:"throat",parent:"head",pivot:[0,.02,.12],drive:{rx:[["talk",.9]]}},{name:"armL",parent:"body",pivot:[-0.22,.2,.18],drive:{rz:[["flap",-1.3]],rx:[["flap",-0.4]]}},{name:"armR",parent:"body",pivot:[.22,.2,.18],drive:{rz:[["flap",1.3]],rx:[["flap",-0.4]]}}],parts:[{bone:"body",shape:"ellipsoid",at:[0,.22,-0.03],radii:[.36,.22,.32],material:"bodySkin"},{bone:"body",shape:"ellipsoid",at:[-0.3,.12,-0.04],rot:[0,.25,0],radii:[.13,.11,.22],blend:.09,material:"bodySkin"},{bone:"body",shape:"ellipsoid",at:[.3,.12,-0.04],rot:[0,-0.25,0],radii:[.13,.11,.22],blend:.09,material:"bodySkin"},{bone:"body",shape:"ellipsoid",at:[-0.33,.025,.16],rot:[0,.5,0],radii:[.08,.025,.13],blend:.03,material:"bodySkin"},{bone:"body",shape:"ellipsoid",at:[.33,.025,.16],rot:[0,-0.5,0],radii:[.08,.025,.13],blend:.03,material:"bodySkin"},{bone:"head",shape:"ellipsoid",at:[0,.1,.05],radii:[.38,.19,.31],blend:.14,material:"skin"},{bone:"head",shape:"sphere",at:[-0.19,.24,.1],radius:.13,blend:.07,material:"skin"},{bone:"head",shape:"sphere",at:[.19,.24,.1],radius:.13,blend:.07,material:"skin"},{bone:"throat",shape:"ellipsoid",at:[0,-0.04,.1],radii:[.14,.1,.12],blend:.05,material:"belly"},{bone:"armL",shape:"capsule",from:[0,0,0],to:[-0.03,-0.17,.08],radius:.045,blend:.05,material:"bodySkin"},{bone:"armL",shape:"sphere",at:[-0.07,-0.19,.12],radius:.026,blend:.02,material:"toe"},{bone:"armL",shape:"sphere",at:[-0.02,-0.19,.15],radius:.026,blend:.02,material:"toe"},{bone:"armL",shape:"sphere",at:[.03,-0.19,.13],radius:.026,blend:.02,material:"toe"},{bone:"armR",shape:"capsule",from:[0,0,0],to:[.03,-0.17,.08],radius:.045,blend:.05,material:"bodySkin"},{bone:"armR",shape:"sphere",at:[.07,-0.19,.12],radius:.026,blend:.02,material:"toe"},{bone:"armR",shape:"sphere",at:[.02,-0.19,.15],radius:.026,blend:.02,material:"toe"},{bone:"armR",shape:"sphere",at:[-0.03,-0.19,.13],radius:.026,blend:.02,material:"toe"}],paints:[{bone:"body",on:["bodySkin"],kind:"ellipse",at:[0,.16,.28],radii:[.22,.13],color:"#f3f0b6",soft:.3},{bone:"head",on:["skin"],kind:"ellipse",at:[0,-0.01,.34],radii:[.2,.06],color:"#f3f0b6",soft:.4},{bone:"head",on:["skin"],kind:"sphere",at:[-0.24,.07,.27],radius:.055,color:"#ff8f9c",soft:.6,opacity:.7},{bone:"head",on:["skin"],kind:"sphere",at:[.24,.07,.27],radius:.055,color:"#ff8f9c",soft:.6,opacity:.7}],eyes:{kind:"ball",bone:"head",at:[[-0.19,.27,.15],[.19,.27,.15]],radius:.1,iris:"#e7b93a",irisSize:.74,pupilSize:.36,pupilAspect:1.8,lid:"skin"},face:{kind:"mouth",bone:"head",on:["skin"],at:[0,.06,.34],width:.12,color:"#5a1f2e",tongue:"#ff7b93"},anchors:{top:{bone:"head",at:[.2,.36,.05]},mouth:{bone:"head",at:[0,.05,.37]},ear:{bone:"head",at:[-0.38,.12,0]},feet:{bone:"root",at:[0,.03,.22]}},acting:{idle:{throat:{rx:[0,.12,1.1,0]}},thinking:{armR:{rz:.6,rx:-1.5}},listening:{armL:{rz:-1.6,rx:-0.4}},speaking:{armL:{rx:[-0.25,.2,1.3,0]},armR:{rx:[-0.25,.2,1.3,2]}},sleeping:{armL:{rx:.2},armR:{rx:.2},throat:{rx:[.2,.25,.18,0]}},working:{armL:{rx:[-0.5,.2,7,0]},armR:{rx:[-0.5,.2,7,Math.PI]},throat:{rx:[0,.15,3.5,0]}},error:{armL:{rz:[-1.2,.15,12,0]},armR:{rz:[1.2,.15,12,1]},throat:{rx:.6}},surprised:{armL:{rz:-1.8},armR:{rz:1.8},throat:{rx:.9}},celebrating:{armL:{rz:[-2,.4,4,0]},armR:{rz:[2,.4,4,Math.PI]},throat:{rx:[.4,.4,4,0]}},sad:{armL:{rz:.2,rx:.3},armR:{rz:-0.2,rx:.3}},happy:{armL:{rz:[-1.5,.4,5,0]},armR:{rz:[1.5,.4,5,1]},throat:{rx:[.4,.4,5,0]}}},fx:{replace:["land"],land:[{glyph:"drop",anchor:"feet",rate:8,spread:.2,velocity:[0,.7,.05],jitter:.7,gravity:3.2,life:[.45,.6],size:[.035,.022],color:"#7fd0ff",align:true}],syllable:[{glyph:"bubble",anchor:"mouth",rate:1,offset:[.1,0,.02],velocity:[.08,.18,.05],jitter:.08,wobble:.05,life:[.9,1.2],size:[.016,.036],color:"#a6e8ff"}]}};function S0(t){let e=t<0?"L":"R";return [{name:`shoulder${e}`,parent:"body",pivot:[.385*t,.47,.02],drive:{rz:[["flap",.5*t]]}},{name:`fore${e}`,parent:`shoulder${e}`,pivot:[0,-0.17,0],jiggle:{axis:[0,-1,0],length:.16,freq:3.2,damping:.35,maxAngle:.3}}]}function M0(t){let e=t<0?"L":"R";return [{bone:`shoulder${e}`,shape:"sphere",radius:.074,material:"trim"},{bone:`shoulder${e}`,shape:"capsule",from:[0,-0.02,0],to:[0,-0.15,0],radius:.058,material:"shell"},{bone:`fore${e}`,shape:"sphere",radius:.052,material:"trim"},{bone:`fore${e}`,shape:"capsule",from:[0,-0.02,0],to:[0,-0.12,0],radius:.052,material:"shell"},{bone:`fore${e}`,shape:"sphere",at:[0,-0.175,0],radius:.066,material:"trim"},{bone:`fore${e}`,shape:"sphere",op:"sub",blend:.012,at:[0,-0.235,.012],radius:.036,material:"trim"}]}function R0(t){let e=t<0?"L":"R";return [{bone:`ear${e}`,shape:"cylinder",rot:[0,0,1.5708],radius:.112,half:.03,round:.018,material:"trim"},{bone:`ear${e}`,shape:"cylinder",at:[.045*t,0,0],rot:[0,0,1.5708],radius:.058,half:.035,round:.018,material:"trim"},{bone:`ear${e}`,shape:"sphere",at:[.035*t,.078,0],radius:.02,material:"metal"},{bone:`ear${e}`,shape:"sphere",at:[.035*t,-0.078,0],radius:.02,material:"metal"}]}var C0={id:"volt",name:"Volt",tagline:"LED face, claw hands, gear ears, a sprung antenna",accent:"#3b63d9",frame:{target:.86,radius:1.02},bound:{y:.86,radius:1.12},motion:{hop:.16,squash:1,snap:1},glowPool:.35,materials:{shell:{color:"#2f56c4",f0:.05,spec:.7,shininess:70,rim:.55,gloss:.55},trim:{color:"#c3cce3",f0:.07,spec:.8,shininess:90,metal:.25,rim:.4,gloss:.5},metal:{color:"#8f98ae",f0:.45,spec:1,shininess:120,metal:.85,rim:.3,gloss:.7},rubber:{color:"#151a28",f0:.03,spec:.15,shininess:12,rim:.2},screen:{color:"#03060c",f0:.045,spec:1.6,shininess:260,rim:.1,gloss:1},bulb:{color:"#f2f5ff",f0:.04,spec:.6,shininess:40,rim:.3,glows:true,emitStrength:1.4,sss:.4,sssColor:"#ffffff"},lamp:{color:"#e9eeff",f0:.05,spec:1,shininess:80,glows:true,emitStrength:1.1,gloss:.9},ring:{color:"#d8e4ff",f0:.04,spec:.4,shininess:30,glows:true,emitStrength:1.6}},bones:[{name:"body",pivot:[0,0,0],drive:{ry:[["yaw",.2]],rz:[["roll",.25]]}},{name:"head",parent:"body",pivot:[0,.64,0],drive:{rx:[["pitch",-1]],ry:[["yaw",.8]],rz:[["roll",.75]]}},{name:"antenna",parent:"head",pivot:[0,.755,0],jiggle:{axis:[0,1,0],length:.26,freq:2.3,damping:.11}},{name:"earL",parent:"head",pivot:[-0.585,.37,0]},{name:"earR",parent:"head",pivot:[.585,.37,0]},...S0(-1),...S0(1)],parts:[{bone:"body",shape:"roundBox",at:[0,.32,0],half:[.35,.27,.28],round:.22,material:"shell"},{bone:"body",shape:"roundBox",at:[0,.38,.27],half:[.15,.08,.03],round:.06,material:"rubber"},{bone:"body",shape:"sphere",at:[0,.38,.285],radius:.04,material:"lamp"},{bone:"body",shape:"plate",op:"sub",blend:.006,at:[0,.225,.3],half:[.075,.009],corner:.009,depth:.03,material:"shell"},{bone:"body",shape:"plate",op:"sub",blend:.006,at:[0,.19,.295],half:[.075,.009],corner:.009,depth:.03,material:"shell"},{bone:"body",shape:"plate",op:"sub",blend:.006,at:[0,.155,.285],half:[.06,.009],corner:.009,depth:.03,material:"shell"},{bone:"body",shape:"roundBox",at:[-0.17,.035,.05],half:[.11,.035,.14],round:.035,material:"trim"},{bone:"body",shape:"roundBox",at:[.17,.035,.05],half:[.11,.035,.14],round:.035,material:"trim"},{bone:"body",shape:"cylinder",at:[0,.62,0],radius:.075,half:.06,round:.02,material:"metal"},{bone:"head",shape:"roundBox",at:[0,.37,0],half:[.56,.37,.35],round:.17,material:"shell"},{bone:"head",shape:"roundBox",op:"sub",blend:.035,at:[0,.37,.41],half:[.45,.28,.1],round:.12,material:"shell"},{bone:"head",shape:"plate",at:[0,.37,.31],half:[.45,.28],corner:.12,depth:.012,material:"screen"},{bone:"head",shape:"frame",at:[0,.37,.3],half:[.448,.278],corner:.118,width:.014,depth:.018,material:"rubber"},{bone:"head",shape:"cylinder",at:[-0.555,.37,0],rot:[0,0,1.5708],radius:.122,half:.012,round:.006,material:"ring"},{bone:"head",shape:"cylinder",at:[.555,.37,0],rot:[0,0,1.5708],radius:.122,half:.012,round:.006,material:"ring"},...R0(-1),...R0(1),{bone:"head",shape:"cylinder",at:[0,.745,0],radius:.065,half:.025,round:.012,material:"trim"},{bone:"antenna",shape:"capsule",from:[0,0,0],to:[0,.2,0],radius:.016,material:"metal"},{bone:"antenna",shape:"sphere",at:[0,.25,0],radius:.055,material:"bulb"},...M0(-1),...M0(1)],face:{kind:"screen",bone:"head",material:"screen",center:[0,.37],half:[.44,.27],corner:.11,cell:.034,color:"#c4ecff"},anchors:{top:{bone:"head",at:[.3,.78,.1]},mouth:{bone:"head",at:[0,.22,.34]},ear:{bone:"head",at:[-0.66,.37,0]},feet:{bone:"root",at:[0,.02,.06]},antenna:{bone:"antenna",at:[0,.25,0]}},acting:{idle:{shoulderL:{rz:[-0.08,.04,.45,0],rx:[0,.06,.35,1]},shoulderR:{rz:[.08,.04,.45,1.6],rx:[0,.06,.35,2.4]},foreL:{rx:-0.25},foreR:{rx:-0.25}},thinking:{shoulderR:{rx:-1.5,ry:-0.8,rz:-0.1},foreR:{rx:[-0.95,.1,1.8,0]},shoulderL:{rx:-1,ry:.8,rz:-0.3},foreL:{rx:-0.8},earL:{rx:[0,0,0,0,5]},earR:{rx:[0,0,0,0,-5]}},listening:{shoulderL:{rx:.1,ry:.3,rz:-2.8},foreL:{rx:-0.6},shoulderR:{rz:.14,rx:.05},foreR:{rx:-0.3},earL:{rx:[.3,.15,.8,0]}},speaking:{shoulderL:{rx:[-0.55,.32,.72,0],rz:[-0.28,.12,.5,0]},foreL:{rx:[-0.85,.38,1.44,.6]},shoulderR:{rx:[-0.45,.32,.72,2.2],rz:[.28,.12,.5,1]},foreR:{rx:[-0.95,.38,1.44,2.8]},earL:{rx:[0,0,0,0,1.4]},earR:{rx:[0,0,0,0,-1.4]}},sleeping:{shoulderL:{rz:-0.03,rx:-0.3},shoulderR:{rz:.03,rx:-0.3},foreL:{rx:-0.4},foreR:{rx:-0.4}},working:{shoulderL:{rx:-0.85,rz:-0.12},shoulderR:{rx:-0.85,rz:.12},foreL:{rx:[-0.95,.2,6,0]},foreR:{rx:[-0.95,.2,6,Math.PI]},earL:{rx:[0,0,0,0,3]},earR:{rx:[0,0,0,0,-3]}},error:{shoulderL:{rz:[-0.95,.1,11,0],rx:-0.2},shoulderR:{rz:[.95,.1,11,1],rx:-0.2},foreL:{rx:-1.1},foreR:{rx:-1.1}},surprised:{shoulderL:{rz:-1.55,rx:-0.3},shoulderR:{rz:1.55,rx:-0.3},foreL:{rx:-0.35},foreR:{rx:-0.35}},celebrating:{shoulderL:{rz:[-2.55,.28,4,0]},shoulderR:{rz:[2.55,.28,4,Math.PI]},foreL:{rz:[.2,.4,8,0]},foreR:{rz:[-0.2,.4,8,Math.PI]},earL:{rx:[0,0,0,0,12]},earR:{rx:[0,0,0,0,-12]}},sad:{shoulderL:{rz:.04,rx:.22},shoulderR:{rz:-0.04,rx:.22},foreL:{rx:-0.05},foreR:{rx:-0.05}},happy:{shoulderL:{rz:[-2.5,.22,2.2,0]},foreL:{rz:[.1,.5,4.2,0]},shoulderR:{rz:[2.5,.22,2.2,1.5]},foreR:{rz:[-0.1,.5,4.2,2]},earL:{rx:[0,0,0,0,10]},earR:{rx:[0,0,0,0,-10]}}},fx:{replace:["syllable"],syllable:[{glyph:"arc",anchor:"mouth",rate:2,offset:[.5,.1,-0.1],mirror:true,velocity:[.26,.02,.02],jitter:.02,life:[.55,.7],size:[.04,.1],rotation:0,color:"#6aaee6"}],thinking:[{glyph:"ring",anchor:"antenna",rate:1.3,velocity:[0,.02,0],life:[.9,1.1],size:[.03,.17],color:"#ffb347",glow:true}],listening:[{glyph:"ring",anchor:"antenna",rate:1.1,velocity:[0,0,0],life:[1,1.2],size:[.2,.03],color:"#62e39a",glow:true}],land:[{glyph:"spark",anchor:"feet",rate:6,spread:.12,velocity:[0,.6,0],jitter:1.1,gravity:3,life:[.25,.42],size:[.035,.02],color:"#ffd27a",glow:true,align:true}],"enter:happy":[{glyph:"spark",anchor:"antenna",rate:8,velocity:[0,.5,0],jitter:1.4,gravity:2,life:[.3,.5],size:[.04,.02],color:"#ffe08a",glow:true,align:true}]}};var E0=[C0,y0,x0,p0,u0,g0,z0,v0,k0,b0];var Q0=new Map(E0.map(t=>[t.id,t])),et=t=>typeof t=="string"?Q0.get(t):t;function Xr({character:t,state:e,status:r,palette:a,onPoke:o,onReady:i,className:s,style:n,...l}){let f=useRef(null),h=useRef(null),c=et(t),d=useRef(o),m=useRef(i);return d.current=o,m.current=i,useEffect(()=>{if(!f.current||!c)return;let u=new Q(f.current.appendChild(document.createElement("canvas")),c,{...l,state:r?"idle":e,palette:a});u.canvas.style.cssText="display:block;width:100%;height:100%";let y=u.on("poke",()=>d.current?.()),w=u.on("ready",()=>m.current?.());return h.current=u,()=>{y(),w(),u.dispose(),u.canvas.remove(),h.current=null;}},[c]),useEffect(()=>{h.current&&r&&Le(h.current,r);},[r]),useEffect(()=>{h.current&&e&&!r&&h.current.setState(e);},[e,r]),useEffect(()=>{h.current?.setPalette(a);},[JSON.stringify(a)]),jsx("div",{ref:f,className:s,style:{width:160,height:160,...n}})}export{Xr as Mascot};
|
|
689
|
+
`;function re(a){let e=ee(a),t=["#version 300 es","precision highp float;","precision highp int;",ae(e.bones.length,e.materials.length),"out vec4 fragColor;","float gPixel = 0.001;","#define ZERO (min(int(uTime), 0))",J0,_0(e),K0,a.face?.kind==="screen"?Qe()+Q0:"",a.face?.kind==="mouth"?Y0:"",U0(e),X0(e),Z0,W0].join(`
|
|
690
|
+
`);return {spec:a,bones:e.bones,acting:e.acting,anchors:e.anchors,fragment:t,materials:e.materials.map(r=>r.name),albedo:new Float32Array(e.materials.flatMap(r=>T(r.spec.color))),stats:{parts:a.parts.length+(a.eyes?2:0),bones:e.bones.length,materials:e.materials.length,shaderLines:t.split(`
|
|
691
|
+
`).length}}}var S0=(a,e)=>[a[0]+e[0],a[1]+e[1],a[2]+e[2]],R0=(a,e)=>[a[0]-e[0],a[1]-e[1],a[2]-e[2]],p0=(a,e)=>[a[0]*e,a[1]*e,a[2]*e],oe=(a,e)=>a[0]*e[0]+a[1]*e[1]+a[2]*e[2],ie=(a,e)=>[a[1]*e[2]-a[2]*e[1],a[2]*e[0]-a[0]*e[2],a[0]*e[1]-a[1]*e[0]],M0=a=>Math.hypot(a[0],a[1],a[2]);function J(a){let e=M0(a)||1;return [a[0]/e,a[1]/e,a[2]/e]}var se=["rx","ry","rz"];function ea(a,e){if(typeof a=="number")return a;let[t,r=0,o=0,i=0]=a;return t+r*Math.sin(e*o*Math.PI*2+i)}var c0=class{constructor(e,t=e.map(()=>[])){this.bones=e;this.acting=t;this.world=e.map(()=>L()),this.inverse=new Float32Array(e.length*16),this.tips=e.map(()=>null),this.spun=e.map(()=>({rx:0,ry:0,rz:0}));}bones;acting;world;inverse;tips;spun;scratch={t:L(),r:L(),j:L(),inv:L()};point(e,t){return y0(this.world[e],t)}update(e,t,r,o,i){let{t:s,r:n,j:l,inv:d}=this.scratch;this.world[0].set(e);for(let h=1;h<this.bones.length;h++){let p=this.bones[h],f={rx:p.rest?.rx??0,ry:p.rest?.ry??0,rz:p.rest?.rz??0};for(let b of se){for(let[k,x]of p.drive?.[b]??[])f[b]+=t[k]*x;let v=p.wave?.[b];v&&(f[b]+=v[0]*t.energy*Math.sin(o*v[1]*Math.PI*2+v[2]));}for(let[b,v,k]of this.acting[h]){let x=r[b];x<.001&&!(Array.isArray(k)&&k[4])||(f[v]+=x*ea(k,o),Array.isArray(k)&&k[4]&&(this.spun[h][v]+=x*k[4]*i));}for(let b of se)f[b]+=this.spun[h][b];let m=this.world[h];H(m,this.world[p.parentIndex],e0(s,...p.pivot)),H(m,m,X(n,f.rx,f.ry,f.rz)),p.jiggle&&H(m,m,this.jiggle(h,m,i,l,d));}for(let h=0;h<this.bones.length;h++)this.inverse.set(x0(d,this.world[h]),h*16);}jiggle(e,t,r,o,i){let{axis:s,length:n,freq:l,damping:d,maxAngle:h=.9}=this.bones[e].jiggle,p=y0(t,[0,0,0]),f=S0(p,p0(J(v0(t,s)),n)),m=this.tips[e];if((!m||!(r>0))&&(m=this.tips[e]=m??{x:f,v:[0,0,0]},!(r>0)))return a0(o,[0,1,0],0);let b=l*Math.PI*2;for(let z=0;z<3;z++)m.v[z]+=(b*b*(f[z]-m.x[z])-2*d*b*m.v[z])*r,m.x[z]+=m.v[z]*r;m.x=S0(p,p0(J(R0(m.x,p)),n)),x0(i,t);let v=J(v0(i,R0(m.x,p))),k=J(s),x=ie(k,v),R=M0(x);if(R<1e-6)return a0(o,[0,1,0],0);let C=M(Math.atan2(R,oe(k,v)),0,h);return a0(o,p0(x,1/R),C)}};var aa=48,h0=128,ta=null,d0=class a{static shared(){return ta??=new a}canvas=document.createElement("canvas");gl;programs=new Map;parallel;lastSyncBuild=-1/0;constructor(){let e=this.canvas.getContext("webgl2",{alpha:true,premultipliedAlpha:true,antialias:false,depth:false,stencil:false,powerPreference:"high-performance"});if(!e)throw new Error("WebGL2 is not available");this.gl=e,this.parallel=e.getExtension("KHR_parallel_shader_compile"),e.enable(e.SCISSOR_TEST),e.clearColor(0,0,0,0),this.canvas.addEventListener("webglcontextlost",t=>t.preventDefault()),this.canvas.addEventListener("webglcontextrestored",()=>{this.programs.clear(),e.enable(e.SCISSOR_TEST),e.clearColor(0,0,0,0);});}program(e){let t=this.programs.get(e);if(t==="failed")return null;if(t&&"program"in t)return t;if(!t){if(!this.parallel){let o=performance.now();if(o-this.lastSyncBuild<aa)return null;this.lastSyncBuild=o;}let r=this.start(e);return this.programs.set(e,r),this.parallel?null:this.finish(e,r)}return this.parallel&&!this.gl.getProgramParameter(t.building,this.parallel.COMPLETION_STATUS_KHR)?null:this.finish(e,t)}reserve(e,t){let r=Math.ceil(e/h0)*h0,o=Math.ceil(t/h0)*h0;r>this.canvas.width&&(this.canvas.width=r),o>this.canvas.height&&(this.canvas.height=o);}start(e){let{gl:t}=this,r=(n,l)=>{let d=t.createShader(n);return t.shaderSource(d,l),t.compileShader(d),d},o=r(t.VERTEX_SHADER,te),i=r(t.FRAGMENT_SHADER,e.fragment),s=t.createProgram();return t.attachShader(s,o),t.attachShader(s,i),t.linkProgram(s),{building:s,vertex:o,fragment:i}}finish(e,{building:t,vertex:r,fragment:o}){let{gl:i}=this;if(!i.getProgramParameter(t,i.LINK_STATUS)){let l=i.getShaderInfoLog(o)||i.getProgramInfoLog(t);throw this.programs.set(e,"failed"),new Error(`${e.spec.id}: shader failed to build
|
|
692
|
+
${l}`)}i.deleteShader(r),i.deleteShader(o);let s=Object.fromEntries(Object.keys(l0).map(l=>[l,i.getUniformLocation(t,l0[l].includes("[")?`${l}[0]`:l)])),n={program:t,uniforms:s,character:e};return this.programs.set(e,n),n}};var ne=.2,ra=.1,f0=class{constructor(e){this.canvas=e;let t=e.getContext("2d");if(!t)throw new Error("Canvas 2D is not available");this.target=t;}canvas;gpu=d0.shared();target;character=null;load(e){this.character=e,this.gpu.program(e);}render(e){let t=this.character&&this.gpu.program(this.character);if(!t)return false;let{gpu:r}=this,{gl:o}=r,{width:i,height:s}=e;(this.canvas.width!==i||this.canvas.height!==s)&&(this.canvas.width=i,this.canvas.height=s),r.reserve(i,s),o.viewport(0,0,i,s),o.scissor(0,0,i,s),o.clear(o.COLOR_BUFFER_BIT),o.useProgram(t.program);let n=t.uniforms,{spec:l}=t.character,d=e.pose,h=d.lift;return o.uniform2f(n.uResolution,e.width,e.height),o.uniform1f(n.uTime,e.time),o.uniform4f(n.uCamera,l.frame.target,l.frame.radius*e.framing/ne,ne,ra),o.uniform4f(n.uBound,0,l.bound.y+h,0,l.bound.radius),o.uniformMatrix4fv(n.uBones,false,e.bones),o.uniform1f(n.uScaleFix,d.minScale),o.uniform4fv(n.uFaceA,d.faceA),o.uniform4fv(n.uFaceB,d.faceB),o.uniform4fv(n.uFaceC,d.faceC),o.uniform4fv(n.uFaceD,d.faceD),o.uniform3fv(n.uGlow,d.glow),o.uniform3fv(n.uShadow,e.shadow),o.uniform1f(n.uFloor,e.floor),o.uniform1f(n.uLift,h),o.uniform1f(n.uExposure,e.exposure*d.exposure),o.uniform3fv(n.uAlbedo,e.albedo),o.uniform1f(n.uGlowPool,l.glowPool??0),o.uniform4fv(n.uFxA,e.fx.a),o.uniform4fv(n.uFxB,e.fx.b),o.uniform4fv(n.uFxC,e.fx.c),o.uniform1i(n.uFxCount,e.fx.count),o.drawArrays(o.TRIANGLES,0,3),this.target.globalCompositeOperation="copy",this.target.drawImage(r.canvas,0,r.canvas.height-s,i,s,0,0,i,s),true}dispose(){this.character=null;}};var oa=/^#[0-9a-f]{6}$/i;function ia(a,e,t,r){if(!e.includes(t))throw new Error(`${a}: palette names material "${t}". Materials are: ${e.join(", ")}.`);if(!oa.test(r))throw new Error(`${a}: palette colour for "${t}" must look like #rrggbb, got "${r}".`)}function sa(a,e){let t=Object.keys(a.materials),r=new Map;for(let[o,i]of Object.entries(e))ia(a.id,t,o,i),r.set(o,T(i));for(let[o,i]of Object.entries(a.materials)){let s=i.shadeOf;if(!s||r.has(o)||!(s in e))continue;let n=T(a.materials[s].color),l=T(i.color),d=r.get(s);r.set(o,[0,1,2].map(h=>Math.min(1,n[h]>.001?d[h]*l[h]/n[h]:l[h])));}return r}function L0(a,e){let t=a.albedo.slice();if(!e)return t;for(let[r,o]of sa(a.spec,e))t.set(o,a.materials.indexOf(r)*3);return t}var C0=class{members=new Set;frame=0;last=0;time=0;quality=1;slow=0;fast=0;add(e){this.members.add(e),this.start();}delete(e){this.members.delete(e),this.members.size||this.stop();}start(){this.frame||typeof requestAnimationFrame>"u"||(this.last=performance.now(),this.frame=requestAnimationFrame(this.loop));}stop(){cancelAnimationFrame(this.frame),this.frame=0;}loop=e=>{this.frame=requestAnimationFrame(this.loop);let t=Math.max(0,e-this.last),r=Math.min(t/1e3,1/20);this.adapt(t),this.last=e,this.time+=r;for(let o of this.members)o.active&&o.tick(r,this.time,this.quality);};adapt(e){e>22&&e<200?this.slow++:this.slow=Math.max(0,this.slow-1),e<17.5?this.fast++:this.fast=0,this.slow>20?(this.quality=Math.max(.55,this.quality*.85),this.slow=0):this.fast>120&&this.quality<1&&(this.quality=Math.min(1,this.quality*1.08),this.fast=0);}},E0=new C0;var le=new WeakMap;function pe(a){let e=le.get(a);return e||le.set(a,e=re(a)),e}var Q=class{constructor(e,t,r={}){this.canvas=e;if(this.seed=r.seed??Math.random(),this.palette=r.palette,this.options={interactive:r.interactive??true,effects:r.effects??true,speed:r.speed??1,maxPixelRatio:r.maxPixelRatio??2,shadow:r.shadow??[.05,.06,.12],floor:r.floor??1,exposure:r.exposure??1,framing:r.framing??1,respectReducedMotion:r.respectReducedMotion??true},this.renderer=new f0(e),this.load(t,r.state??"idle"),e.setAttribute("role","img"),this.reducedMotion=typeof matchMedia=="function"?matchMedia("(prefers-reduced-motion: reduce)"):null,typeof IntersectionObserver<"u"){let o=new IntersectionObserver(([i])=>this.visible=i.isIntersecting);o.observe(e),this.cleanup.push(()=>o.disconnect());}this.options.interactive&&this.listen(),E0.add(this);}canvas;character;brain;rig;fx;renderer;options;seed;palette;albedo;visible=true;paused=false;time=0;reducedMotion;stillFrames=0;drawn=false;listeners={poke:new Set,state:new Set,ready:new Set};cleanup=[];source;get state(){return this.brain.state}get spec(){return this.source}get stats(){return this.character.stats}setState(e){if(!o0.includes(e))throw new Error(`Unknown state "${e}". Expected one of ${o0.join(", ")}.`);e!==this.brain.state&&(this.brain.setState(e),this.stillFrames=0,this.label(),this.emit("state",e));}setSpec(e,t){this.palette=t,this.load(e,this.brain.state);}setPalette(e){this.albedo=L0(this.character,e),this.palette=e,this.stillFrames=0;}setSpeed(e){this.options.speed=Math.max(0,e);}setEffects(e){this.options.effects=e;}poke(){this.brain.poke(),this.stillFrames=0,this.emit("poke",void 0);}pause(){this.paused=true;}play(){this.paused=false;}on(e,t){return this.listeners[e].add(t),()=>this.listeners[e].delete(t)}get active(){return !this.visible||this.paused?false:!this.still||this.stillFrames<2}tick(e,t,r){let o=this.still,i=e*this.options.speed;if(o)for(let h=0;h<90;h++)this.brain.update(1/60);else this.brain.update(i),this.time+=i;let s=o?0:this.time,n=this.brain.pose;this.rig.update(n.root,n.channels,n.weights,s,o?0:i),!o&&this.options.effects?this.fx.update(i,n,this.rig):this.fx.count=0,n.events.length=0;let l=Math.min(devicePixelRatio||1,this.options.maxPixelRatio)*r,d=this.renderer.render({pose:n,bones:this.rig.inverse,fx:this.fx,albedo:this.albedo,time:s,width:Math.max(1,Math.round(this.canvas.clientWidth*l)),height:Math.max(1,Math.round(this.canvas.clientHeight*l)),shadow:this.options.shadow,floor:this.options.floor,exposure:this.options.exposure,framing:this.options.framing});d&&o&&this.stillFrames++,d&&!this.drawn&&(this.drawn=true,this.emit("ready",void 0));}get ready(){return this.drawn}dispose(){E0.delete(this),this.cleanup.forEach(e=>e()),this.listeners.poke.clear(),this.listeners.state.clear(),this.listeners.ready.clear(),this.renderer.dispose();}load(e,t){this.source=e,this.character=pe(e),this.albedo=L0(this.character,this.palette),this.renderer.load(this.character),this.brain=new s0(e.motion,this.seed),this.brain.setState(t),this.rig=new c0(this.character.bones,this.character.acting),this.fx=new n0(this.character,t0(this.seed+.37)),this.stillFrames=0,this.label();}get still(){return this.options.respectReducedMotion&&(this.reducedMotion?.matches??false)}emit(e,t){for(let r of this.listeners[e])r(t);}label(){this.canvas.hasAttribute("data-own-label")||this.canvas.setAttribute("aria-label",`${this.source.name}, ${this.brain.state}`);}listen(){let e=o=>{let i=this.canvas.getBoundingClientRect(),s=Math.max(i.width,1),n=(o.clientX-(i.left+i.width/2))/(s*1.1),l=(o.clientY-(i.top+i.height*.45))/(s*1.1);this.brain.pointer=Math.hypot(n,l)<3?{x:n,y:l}:null;},t=()=>this.brain.pointer=null,r=()=>this.poke();window.addEventListener("pointermove",e,{passive:true}),document.addEventListener("pointerleave",t),this.canvas.addEventListener("click",r),this.cleanup.push(()=>{window.removeEventListener("pointermove",e),document.removeEventListener("pointerleave",t),this.canvas.removeEventListener("click",r);});}};var na={submitted:"thinking",streaming:"speaking",error:"error",idle:"idle"};function $0(a,e,t=1400){if(e==="ready"){a.state==="speaking"||a.state==="thinking"?(a.setState("celebrating"),setTimeout(()=>a.state==="celebrating"&&a.setState("idle"),t)):a.setState("idle");return}a.setState(na[e]??"idle");}var ce={id:"bao",name:"Bao",tagline:"A chubby panda cub: round ears, eye patches, and a belly made for sitting",accent:"#2f3b4c",frame:{target:.46,radius:.62},bound:{y:.45,radius:.57},motion:{hop:.1,squash:1.2,snap:.9,talkSquash:.4},materials:{white:{color:"#f6f3ec",f0:.03,spec:.4,shininess:20,rim:1,sheen:.6,surface:{kind:"fur",scale:100,strength:.3,bone:"head"}},whiteBody:{color:"#f6f3ec",shadeOf:"white",f0:.03,spec:.4,shininess:20,rim:1,sheen:.6,surface:{kind:"fur",scale:100,strength:.3}},black:{color:"#26252b",f0:.03,spec:.4,shininess:20,rim:.9,sheen:.6,surface:{kind:"fur",scale:100,strength:.3}},nose:{color:"#1b1a1f",f0:.06,spec:1.8,shininess:200,rim:.3,gloss:.9}},bones:[{name:"body",pivot:[0,0,0],drive:{ry:[["yaw",.2]],rz:[["roll",.35]]},wave:{rz:[.02,.5,0]}},{name:"head",parent:"body",pivot:[0,.48,.02],drive:{rx:[["pitch",-1]],ry:[["yaw",.8]],rz:[["roll",.7]]}},{name:"armL",parent:"body",pivot:[-0.22,.38,.06],rest:{rz:-0.4},drive:{rz:[["flap",-1]]}},{name:"armR",parent:"body",pivot:[.22,.38,.06],rest:{rz:.4},drive:{rz:[["flap",1]]}}],parts:[{bone:"body",shape:"ellipsoid",at:[0,.26,0],radii:[.29,.27,.26],material:"whiteBody"},{bone:"body",shape:"ellipsoid",at:[-0.15,.08,.14],radii:[.1,.08,.12],blend:.05,material:"black"},{bone:"body",shape:"ellipsoid",at:[.15,.08,.14],radii:[.1,.08,.12],blend:.05,material:"black"},{bone:"body",shape:"ellipsoid",at:[0,.42,-0.01],radii:[.27,.07,.24],blend:.05,material:"black"},{bone:"armL",shape:"capsule",from:[0,0,0],to:[-0.04,-0.16,.06],radius:.07,blend:.04,material:"black"},{bone:"armR",shape:"capsule",from:[0,0,0],to:[.04,-0.16,.06],radius:.07,blend:.04,material:"black"},{bone:"head",shape:"ellipsoid",at:[0,.14,0],radii:[.28,.24,.24],blend:.1,material:"white"},{bone:"head",shape:"ellipsoid",at:[0,.06,.18],radii:[.1,.07,.08],blend:.06,material:"white"},{bone:"head",shape:"ellipsoid",at:[0,.09,.26],radii:[.035,.022,.02],material:"nose"},{bone:"head",shape:"sphere",at:[-0.2,.33,-0.02],radius:.075,blend:.03,material:"black"},{bone:"head",shape:"sphere",at:[.2,.33,-0.02],radius:.075,blend:.03,material:"black"}],paints:[{bone:"head",on:["white"],kind:"ellipse",at:[-0.1,.15,.2],radii:[.06,.08],color:"#26252b",soft:.2},{bone:"head",on:["white"],kind:"ellipse",at:[.1,.15,.2],radii:[.06,.08],color:"#26252b",soft:.2},{bone:"head",on:["white"],kind:"sphere",at:[-0.17,.05,.18],radius:.04,color:"#ffb3c1",soft:.6,opacity:.7},{bone:"head",on:["white"],kind:"sphere",at:[.17,.05,.18],radius:.04,color:"#ffb3c1",soft:.6,opacity:.7}],eyes:{kind:"ball",bone:"head",at:[[-0.095,.16,.21],[.095,.16,.21]],radius:.04,iris:"#3a2a20",irisSize:.7,pupilSize:.5,lid:"black"},face:{kind:"mouth",bone:"head",on:["white"],at:[0,.035,.25],width:.04,color:"#26252b",tongue:"#ff8fa3"},anchors:{top:{bone:"head",at:[.15,.45,.05]},mouth:{bone:"head",at:[0,.035,.27]},ear:{bone:"head",at:[-0.22,.33,0]},feet:{bone:"root",at:[0,.02,.18]}},acting:{idle:{armL:{rz:[0,.05,.5,0]}},thinking:{armR:{rz:1.5,rx:-1.2,ry:-0.4},head:{rz:.1}},listening:{armL:{rz:-0.6,rx:-0.4}},speaking:{armL:{rz:[-0.2,.2,1.2,0]},armR:{rz:[.2,.2,1.2,1.4]}},sleeping:{head:{rx:.25,rz:.15}},working:{armL:{rx:[-0.8,.2,5,0]},armR:{rx:[-0.8,.2,5,Math.PI]}},error:{armL:{rz:-1.6,rx:-0.6},armR:{rz:1.6,rx:-0.6}},surprised:{armL:{rz:-1.1},armR:{rz:1.1}},celebrating:{armL:{rz:[-2.2,.3,4,0]},armR:{rz:[2.2,.3,4,Math.PI]}},sad:{head:{rx:.3},armL:{rz:.1},armR:{rz:-0.1}},happy:{armL:{rz:[-1.5,.3,3,0]},armR:{rz:[1.5,.3,3,1]}}},fx:{happy:[{glyph:"heart",anchor:"top",rate:1.2,velocity:[0,.22,.04],jitter:.1,life:[1,1.3],size:[.04,.06],color:"#ff86b0"}]}};var he={id:"berry",name:"Berry",tagline:"A plump strawberry with golden seeds and a leafy hat with a stalk on top",accent:"#e8324f",frame:{target:.43,radius:.57},bound:{y:.41,radius:.5},motion:{hop:.15,squash:1.3,snap:1.1,talkSquash:.5},materials:{berry:{color:"#e8324f",f0:.07,spec:1.6,shininess:130,rim:.6,sss:.35,sssColor:"#ff7d8f",gloss:.8},leaf:{color:"#3fa34d",f0:.04,spec:.7,shininess:50,rim:.6,sss:.25,sssColor:"#b8f0a0"},bead:{color:"#1a1012",f0:.06,spec:2.2,shininess:400,rim:.2,gloss:1}},bones:[{name:"body",pivot:[0,-0.042,0],drive:{rx:[["pitch",-0.4]],ry:[["yaw",.6]],rz:[["roll",.5]]}},{name:"hat",parent:"body",pivot:[0,.73,0],jiggle:{axis:[0,1,0],length:.12,freq:3.2,damping:.16,maxAngle:.5}}],parts:[{bone:"body",shape:"roundCone",from:[0,.2,0],to:[0,.48,0],r1:.17,r2:.3,material:"berry"},{bone:"body",shape:"ellipsoid",at:[0,.5,0],radii:[.3,.2,.28],blend:.08,material:"berry"},...[0,1,2,3,4].map(a=>{let e=a/5*Math.PI*2+.3;return {bone:"hat",shape:"ellipsoid",at:[Math.sin(e)*.15,-5e-3,Math.cos(e)*.15],rot:[.5,e,0],radii:[.075,.024,.15],blend:.02,material:"leaf"}}),{bone:"hat",shape:"capsule",from:[0,0,0],to:[.02,.1,0],radius:.022,blend:.03,material:"leaf"}],paints:[...[[0,.2,.192],[.133,.21,-0.145],[-0.202,.22,.018],[.165,.229,.126],[-0.037,.239,-0.209],[-0.117,.249,.184],[.215,.259,-0.058],[-0.202,.268,-0.105],[.08,.278,.219],[.091,.288,-0.22],[-0.221,.298,.103],[.238,.308,.075],[-0.128,.317,-0.22],[-0.056,.327,.254],[.218,.337,-0.154],[-0.272,.347,-0.035],[.012,.366,-0.281],[-0.203,.376,.204],[.294,.386,-0.014],[-0.227,.396,-0.19],[.172,.415,-0.248],[-0.301,.425,.068],[.269,.435,.154],[-0.093,.444,-0.293],[.292,.464,-0.122],[-0.299,.474,-0.108],[.079,.493,-0.301],[-0.266,.503,.171],[.314,.513,.054],[-0.191,.523,-0.247],[.227,.542,-0.21],[-0.312,.552,.001],[.225,.562,.205],[-0.027,.572,-0.296],[.291,.591,-0.053],[-0.245,.601,-0.154],[.074,.611,.27],[.126,.62,-0.245],[-0.256,.63,.095],[.246,.64,.1]].map(([a,e,t])=>({bone:"body",on:["berry"],kind:"sphere",at:[a,e,t],radius:.022,color:"#ffd166",soft:.2})),{bone:"body",on:["berry"],kind:"sphere",at:[-0.16,.42,.25],radius:.05,color:"#ff9ab0",soft:.6,opacity:.6},{bone:"body",on:["berry"],kind:"sphere",at:[.16,.42,.25],radius:.05,color:"#ff9ab0",soft:.6,opacity:.6}],eyes:{kind:"bead",bone:"body",at:[[-0.09,.5,.3],[.09,.5,.3]],radii:[.03,.045,.02],material:"bead"},face:{kind:"mouth",bone:"body",on:["berry"],at:[0,.41,.3],width:.045,color:"#5a1020",tongue:"#ff8fa3"},anchors:{top:{bone:"hat",at:[.06,.16,0]},mouth:{bone:"body",at:[0,.41,.31]},ear:{bone:"body",at:[-0.3,.5,0]},feet:{bone:"root",at:[0,.02,.12]}},acting:{thinking:{hat:{rz:.3}},sleeping:{hat:{rz:.4,rx:.2}},error:{hat:{rz:[0,.3,9,0]}},celebrating:{hat:{ry:[0,0,0,0,10]}},sad:{hat:{rx:.4,rz:.3}},happy:{hat:{ry:[0,0,0,0,14]}}}};var de={id:"boo",name:"Boo",tagline:"Floats, glows from inside, trails motes, a hem that ripples",accent:"#8a6cf0",frame:{target:.78,radius:.92},bound:{y:.72,radius:.72},motion:{float:.22,hop:.12,squash:.8,snap:.8,talkSquash:.6},glowPool:.55,materials:{ghost:{color:"#eceaff",f0:.04,spec:.5,shininess:30,rim:1.4,sss:.4,sssColor:"#b9a4ff",emit:"#6f52d9",emitStrength:.06},bead:{color:"#1b1430",f0:.06,spec:2.2,shininess:400,rim:.2,gloss:1}},bones:[{name:"body",pivot:[0,0,0],drive:{rx:[["pitch",-0.5]],ry:[["yaw",.7]],rz:[["roll",.6]]},wave:{rz:[.03,.45,0]}},{name:"armL",parent:"body",pivot:[-0.36,.74,.04],drive:{rz:[["flap",-1.2]]},wave:{rz:[.08,.7,0]},jiggle:{axis:[-0.8,-0.6,0],length:.15,freq:2,damping:.2,maxAngle:.7}},{name:"armR",parent:"body",pivot:[.36,.74,.04],drive:{rz:[["flap",1.2]]},wave:{rz:[-0.08,.7,1.6]},jiggle:{axis:[.8,-0.6,0],length:.15,freq:2,damping:.2,maxAngle:.7}}],parts:[{bone:"body",shape:"sphere",at:[0,.88,0],radius:.4,material:"ghost"},{bone:"body",shape:"roundCone",from:[0,.88,0],to:[0,.4,0],r1:.4,r2:.47,material:"ghost"},{bone:"body",shape:"hem",y:.34,amplitude:.045,waves:6,speed:2.4,blend:.05,material:"ghost"},{bone:"armL",shape:"capsule",from:[0,0,0],to:[-0.12,-0.09,.02],radius:.07,blend:.08,material:"ghost"},{bone:"armR",shape:"capsule",from:[0,0,0],to:[.12,-0.09,.02],radius:.07,blend:.08,material:"ghost"}],paints:[{bone:"body",on:["ghost"],kind:"sphere",at:[-0.24,.78,.31],radius:.07,color:"#ffa3c4",soft:.6,opacity:.7},{bone:"body",on:["ghost"],kind:"sphere",at:[.24,.78,.31],radius:.07,color:"#ffa3c4",soft:.6,opacity:.7}],eyes:{kind:"bead",bone:"body",at:[[-0.135,.9,.375],[.135,.9,.375]],radii:[.048,.072,.03],material:"bead"},face:{kind:"mouth",bone:"body",on:["ghost"],at:[0,.77,.38],width:.075,color:"#2a1a4a",tongue:"#ff7fa6"},anchors:{top:{bone:"body",at:[.16,1.2,.1]},mouth:{bone:"body",at:[0,.77,.4]},ear:{bone:"body",at:[-0.42,.92,0]},center:{bone:"body",at:[0,.8,0]}},acting:{idle:{armL:{rz:[0,.1,.7,0]},armR:{rz:[0,.1,.7,1.3]}},thinking:{armR:{ry:-1.1,rz:.9},armL:{rz:.25}},listening:{armL:{rz:-1,rx:-0.35}},speaking:{armL:{rz:[-0.3,.3,1.2,0],rx:[-0.3,.2,.9,0]},armR:{rz:[.3,.3,1.2,1.7],rx:[-0.3,.2,.9,2.2]}},sleeping:{armL:{rz:.4},armR:{rz:-0.4},body:{rz:.08}},working:{armL:{rx:[-0.6,.15,6,0],rz:-0.3},armR:{rx:[-0.6,.15,6,Math.PI],rz:.3}},error:{armL:{rz:[-1,.25,10,0]},armR:{rz:[1,.25,10,1]}},surprised:{armL:{rz:-1.4,rx:-0.4},armR:{rz:1.4,rx:-0.4}},celebrating:{armL:{rz:[-1.6,.3,4,0]},armR:{rz:[1.6,.3,4,Math.PI]}},sad:{armL:{rz:.5},armR:{rz:-0.5},body:{rz:.05}},happy:{armL:{rz:[-1.3,.35,3,0]},armR:{rz:[1.3,.35,3,1.2]}}},fx:{ambient:[{glyph:"mote",anchor:"center",rate:1.3,spread:.5,velocity:[0,.07,0],jitter:.06,wobble:.09,life:[2.2,3.2],size:[.04,.02],color:"#b49cff",glow:true}],happy:[{glyph:"heart",anchor:"top",rate:1.2,spread:.2,velocity:[0,.22,.05],jitter:.12,wobble:.06,life:[1,1.3],size:[.04,.07],color:"#ff86b0"}]}};var fe={id:"bumble",name:"Bumble",tagline:"A fuzzy round bumblebee that hovers on wings far too small for it",accent:"#f5b700",frame:{target:.61,radius:.81},bound:{y:.5,radius:.62},motion:{float:.2,hop:.08,squash:1,snap:1.2,talkSquash:.5},materials:{fuzz:{color:"#ffc21a",f0:.03,spec:.4,shininess:20,rim:1.1,sheen:.8,surface:{kind:"fur",scale:110,strength:.4,bone:"body"}},stripe:{color:"#2b2118",f0:.03,spec:.4,shininess:20,rim:.8,sheen:.6},wing:{color:"#e8f6ff",f0:.1,spec:1.8,shininess:200,rim:1.4,sss:.6,sssColor:"#ffffff",gloss:.9},feeler:{color:"#2b2118",f0:.04,spec:.8,shininess:60,rim:.5}},bones:[{name:"body",pivot:[0,.4,0],drive:{rx:[["pitch",-0.4]],ry:[["yaw",.7]],rz:[["roll",.6]]},wave:{rx:[.03,.8,0]}},{name:"wingL",parent:"body",pivot:[-0.12,.3,-0.18],rest:{rz:.5,rx:-0.3},wave:{rz:[.35,14,0]}},{name:"wingR",parent:"body",pivot:[.12,.3,-0.18],rest:{rz:-0.5,rx:-0.3},wave:{rz:[-0.35,14,0]}},{name:"feelerL",parent:"body",pivot:[-0.08,.36,.1],rest:{rz:.35},jiggle:{axis:[0,1,0],length:.14,freq:3,damping:.12}},{name:"feelerR",parent:"body",pivot:[.08,.36,.1],rest:{rz:-0.35},jiggle:{axis:[0,1,0],length:.14,freq:3,damping:.12}}],parts:[{bone:"body",shape:"sphere",at:[0,0,0],radius:.36,material:"fuzz"},{bone:"body",shape:"roundCone",from:[0,-0.05,-0.33],to:[0,-0.08,-0.45],r1:.05,r2:.01,blend:.03,material:"stripe"},{bone:"wingL",shape:"ellipsoid",at:[-0.1,.1,0],rot:[0,0,.5],radii:[.12,.17,.012],material:"wing"},{bone:"wingR",shape:"ellipsoid",at:[.1,.1,0],rot:[0,0,-0.5],radii:[.12,.17,.012],material:"wing"},{bone:"feelerL",shape:"capsule",from:[0,0,0],to:[0,.14,.02],radius:.012,material:"feeler"},{bone:"feelerL",shape:"sphere",at:[0,.15,.02],radius:.03,material:"feeler"},{bone:"feelerR",shape:"capsule",from:[0,0,0],to:[0,.14,.02],radius:.012,material:"feeler"},{bone:"feelerR",shape:"sphere",at:[0,.15,.02],radius:.03,material:"feeler"}],paints:[{bone:"body",on:["fuzz"],kind:"sphere",at:[0,-1.04,0],radius:.9,color:"#2b2118",soft:.03},{bone:"body",on:["fuzz"],kind:"sphere",at:[0,-1.15,0],radius:.9,color:"#ffc21a",soft:.03},{bone:"body",on:["fuzz"],kind:"sphere",at:[0,-1.25,0],radius:.9,color:"#2b2118",soft:.03},{bone:"body",on:["fuzz"],kind:"sphere",at:[0,.98,0],radius:.7,color:"#2b2118",soft:.04},{bone:"body",on:["fuzz"],kind:"sphere",at:[-0.2,-0.05,.27],radius:.06,color:"#ff8a6a",soft:.6,opacity:.7},{bone:"body",on:["fuzz"],kind:"sphere",at:[.2,-0.05,.27],radius:.06,color:"#ff8a6a",soft:.6,opacity:.7}],eyes:{kind:"ball",bone:"body",at:[[-0.12,.06,.3],[.12,.06,.3]],radius:.065,iris:"#20160e",irisSize:.85,pupilSize:.55,lid:"fuzz"},face:{kind:"mouth",bone:"body",on:["fuzz"],at:[0,-0.08,.35],width:.05,color:"#3a2412",tongue:"#ff7d6e"},anchors:{top:{bone:"body",at:[.12,.5,.05]},mouth:{bone:"body",at:[0,-0.08,.37]},ear:{bone:"body",at:[-0.36,.05,0]},center:{bone:"body",at:[0,0,0]}},acting:{thinking:{feelerL:{rz:.6},feelerR:{rz:-0.1}},listening:{feelerL:{rx:-0.4},feelerR:{rx:-0.4}},sleeping:{wingL:{rz:.9},wingR:{rz:-0.9},feelerL:{rx:.6},feelerR:{rx:.6}},error:{feelerL:{rz:[.4,.3,9,0]},feelerR:{rz:[-0.4,.3,9,1]}},surprised:{feelerL:{rz:.1,rx:-0.3},feelerR:{rz:-0.1,rx:-0.3}},sad:{feelerL:{rx:.9},feelerR:{rx:.9}}},fx:{happy:[{glyph:"sparkle",anchor:"top",rate:2,velocity:[0,.2,.05],jitter:.15,life:[.8,1.1],size:[.04,.02],color:"#ffd84d",glow:true}]}};var me={id:"cacti",name:"Cacti",tagline:"A tiny potted cactus with a pink flower that bounces on its head",accent:"#3fae6a",frame:{target:.52,radius:.69},bound:{y:.52,radius:.61},motion:{hop:.08,squash:.9,snap:1,talkSquash:.5},materials:{cactus:{color:"#4cb873",f0:.04,spec:.8,shininess:60,rim:.8,sss:.2,sssColor:"#a8f0b0",gloss:.4,surface:{kind:"speckle",scale:30,strength:.4,color:"#2f8a52",bone:"body"}},pot:{color:"#d9774a",f0:.03,spec:.4,shininess:25,rim:.4},rim:{color:"#e88a5c",shadeOf:"pot",f0:.03,spec:.4,shininess:25,rim:.4},soil:{color:"#5b3a28",f0:.02,spec:.1,shininess:8,rim:.2},petal:{color:"#ff7eb6",f0:.04,spec:.6,shininess:40,rim:.7,sss:.4,sssColor:"#ffc1dc",sheen:.4},pollen:{color:"#ffd84d",f0:.04,spec:.5,shininess:30,rim:.4},bead:{color:"#141a14",f0:.06,spec:2.2,shininess:400,rim:.2,gloss:1}},bones:[{name:"body",pivot:[0,.32,0],drive:{rx:[["pitch",-0.3]],ry:[["yaw",.5]],rz:[["roll",.5]]},wave:{rz:[.025,.5,0]}},{name:"armL",parent:"body",pivot:[-0.2,.25,0],rest:{rz:.3},drive:{rz:[["flap",-0.8]]}},{name:"armR",parent:"body",pivot:[.2,.18,0],rest:{rz:-0.2},drive:{rz:[["flap",.8]]}},{name:"flower",parent:"body",pivot:[.04,.56,0],jiggle:{axis:[0,1,0],length:.1,freq:3,damping:.14}}],parts:[{bone:"root",shape:"roundCone",from:[0,.03,0],to:[0,.27,0],r1:.2,r2:.25,clip:{normal:[0,-1,0]},material:"pot"},{bone:"root",shape:"cylinder",at:[0,.3,0],radius:.28,half:.05,round:.03,material:"rim"},{bone:"root",shape:"cylinder",at:[0,.33,0],radius:.24,half:.025,round:.01,material:"soil"},{bone:"body",shape:"capsule",from:[0,.05,0],to:[0,.38,0],radius:.2,material:"cactus"},{bone:"armL",shape:"capsule",from:[0,0,0],to:[-0.1,0,0],radius:.065,blend:.04,material:"cactus"},{bone:"armL",shape:"capsule",from:[-0.1,0,0],to:[-0.11,.12,0],radius:.06,blend:.03,material:"cactus"},{bone:"armR",shape:"capsule",from:[0,0,0],to:[.1,0,0],radius:.06,blend:.04,material:"cactus"},{bone:"armR",shape:"capsule",from:[.1,0,0],to:[.11,.1,0],radius:.055,blend:.03,material:"cactus"},...[0,1,2,3,4].map(a=>{let e=a/5*Math.PI*2;return {bone:"flower",shape:"ellipsoid",at:[Math.cos(e)*.055,.03,Math.sin(e)*.055],rot:[0,-e,.4],radii:[.055,.02,.035],blend:.01,material:"petal"}}),{bone:"flower",shape:"sphere",at:[0,.045,0],radius:.03,material:"pollen"}],paints:[{bone:"body",on:["cactus"],kind:"sphere",at:[-0.13,.2,.16],radius:.045,color:"#ff8fb4",soft:.6,opacity:.7},{bone:"body",on:["cactus"],kind:"sphere",at:[.13,.2,.16],radius:.045,color:"#ff8fb4",soft:.6,opacity:.7}],eyes:{kind:"bead",bone:"body",at:[[-0.08,.27,.185],[.08,.27,.185]],radii:[.03,.045,.02],material:"bead"},face:{kind:"mouth",bone:"body",on:["cactus"],at:[0,.19,.2],width:.045,color:"#173a24",tongue:"#ff7d97"},anchors:{top:{bone:"flower",at:[0,.1,0]},mouth:{bone:"body",at:[0,.19,.22]},ear:{bone:"body",at:[-0.22,.3,0]},feet:{bone:"root",at:[0,.02,.15]}},acting:{idle:{armL:{rz:[0,.08,.6,0]}},thinking:{armR:{rz:.9,rx:-0.5},flower:{rz:.2}},listening:{armL:{rz:-0.4},flower:{rz:-0.15}},speaking:{armL:{rz:[-0.2,.25,1.4,0]},armR:{rz:[.2,.25,1.4,1.5]}},sleeping:{flower:{rz:.6,rx:.4},body:{rz:.08}},working:{armL:{rz:[-0.4,.2,5,0]},armR:{rz:[.4,.2,5,Math.PI]}},error:{armL:{rz:-1},armR:{rz:1},flower:{rz:[0,.3,10,0]}},surprised:{armL:{rz:-0.9},armR:{rz:.9}},celebrating:{armL:{rz:[-0.9,.3,4,0]},armR:{rz:[.9,.3,4,Math.PI]},flower:{ry:[0,0,0,0,10]}},sad:{flower:{rx:.9,rz:.4},armL:{rz:.4},armR:{rz:-0.3}},happy:{flower:{ry:[0,0,0,0,12]}}},fx:{happy:[{glyph:"heart",anchor:"top",rate:1.2,velocity:[0,.22,.04],jitter:.1,life:[1,1.3],size:[.04,.06],color:"#ff7eb6"}]}};var be={id:"cap",name:"Cap",tagline:"A little toadstool with a glossy red cap that wobbles when it walks",accent:"#e0393e",frame:{target:.4,radius:.59},bound:{y:.39,radius:.5},motion:{hop:.12,squash:1.2,snap:1,talkSquash:.5},materials:{cap:{color:"#e53935",f0:.06,spec:1.5,shininess:120,rim:.6,gloss:.75,sss:.15,sssColor:"#ff8a80"},gills:{color:"#efe2cf",f0:.02,spec:.2,shininess:10,rim:.3},stem:{color:"#fbf3e4",f0:.03,spec:.5,shininess:30,rim:.6,sss:.3,sssColor:"#fff8ec"},bead:{color:"#1a1414",f0:.06,spec:2.2,shininess:400,rim:.2,gloss:1}},bones:[{name:"body",pivot:[0,0,0],drive:{rx:[["pitch",-0.3]],ry:[["yaw",.5]],rz:[["roll",.4]]}},{name:"cap",parent:"body",pivot:[0,.42,0],drive:{rx:[["pitch",-0.4]],rz:[["roll",.5]]},jiggle:{axis:[0,1,0],length:.2,freq:2.6,damping:.18,maxAngle:.3}}],parts:[{bone:"body",shape:"roundCone",from:[0,.12,0],to:[0,.4,0],r1:.2,r2:.16,clip:{normal:[0,-1,0]},material:"stem"},{bone:"cap",shape:"ellipsoid",at:[0,.06,0],radii:[.42,.28,.42],clip:{normal:[0,-1,0],offset:.02},material:"cap"},{bone:"cap",shape:"ellipsoid",at:[0,.05,0],radii:[.4,.04,.4],blend:.03,material:"gills"}],paints:[...[[0,.33,.05,.08],[-0.22,.24,.2,.07],[.24,.22,.2,.065],[-0.08,.2,.33,.055],[.12,.3,-0.18,.07],[-0.341,.196,-0.136,.06],[.38,.173,-0.058,.05]].map(([a,e,t,r])=>({bone:"cap",on:["cap"],kind:"sphere",at:[a,e,t],radius:r,color:"#fff8ee",soft:.12})),{bone:"body",on:["stem"],kind:"sphere",at:[-0.13,.22,.14],radius:.045,color:"#ff9eb0",soft:.6,opacity:.8},{bone:"body",on:["stem"],kind:"sphere",at:[.13,.22,.14],radius:.045,color:"#ff9eb0",soft:.6,opacity:.8}],eyes:{kind:"bead",bone:"body",at:[[-0.07,.29,.165],[.07,.29,.165]],radii:[.028,.042,.018],material:"bead"},face:{kind:"mouth",bone:"body",on:["stem"],at:[0,.21,.19],width:.04,color:"#4a2a22",tongue:"#ff7d97"},anchors:{top:{bone:"cap",at:[.1,.38,0]},mouth:{bone:"body",at:[0,.21,.21]},ear:{bone:"body",at:[-0.2,.3,0]},feet:{bone:"root",at:[0,.02,.15]}},acting:{thinking:{cap:{rz:.15}},sleeping:{cap:{rx:.2,rz:.15}},error:{cap:{rz:[0,.12,9,0]}},surprised:{cap:{rx:-0.15}},sad:{cap:{rx:.3}},celebrating:{cap:{rz:[0,.15,4,0]}}},fx:{land:[{glyph:"mote",anchor:"top",rate:6,spread:.2,velocity:[0,.2,0],jitter:.2,wobble:.08,life:[1,1.5],size:[.025,.01],color:"#ffe8a3",glow:true}]}};var ue={id:"drift",name:"Drift",tagline:"A sleepy blue cloud that floats along to the music in its headphones",accent:"#4f7cff",frame:{target:.63,radius:.84},bound:{y:.6,radius:.69},motion:{float:.18,hop:.1,squash:1.3,snap:.75,talkSquash:.8},materials:{cloud:{color:"#9db8ff",f0:.03,spec:.35,shininess:20,rim:1.1,sss:.55,sssColor:"#dbe6ff",sheen:.3},band:{color:"#20253a",f0:.06,spec:1.4,shininess:120,rim:.4,gloss:.7},cup:{color:"#4f7cff",f0:.08,spec:1.6,shininess:160,rim:.5,gloss:.8},cushion:{color:"#2a2f45",f0:.03,spec:.3,shininess:20,rim:.3,sheen:.6}},bones:[{name:"body",pivot:[0,0,0],drive:{rx:[["pitch",-0.4]],ry:[["yaw",.6]],rz:[["roll",.7]]},wave:{rz:[.04,.35,0]}},{name:"phones",parent:"body",pivot:[0,.55,0],wave:{rz:[.03,1.1,0]}}],parts:[{bone:"body",shape:"sphere",at:[0,.52,0],radius:.32,material:"cloud"},{bone:"body",shape:"sphere",at:[-0.3,.42,0],radius:.22,blend:.12,material:"cloud"},{bone:"body",shape:"sphere",at:[.31,.43,0],radius:.23,blend:.12,material:"cloud"},{bone:"body",shape:"sphere",at:[-0.14,.72,-0.03],radius:.2,blend:.12,material:"cloud"},{bone:"body",shape:"sphere",at:[.16,.74,-0.04],radius:.22,blend:.12,material:"cloud"},{bone:"body",shape:"ellipsoid",at:[0,.34,0],radii:[.5,.12,.3],blend:.1,material:"cloud"},{bone:"phones",shape:"capsule",from:[-0.47,0,0],to:[-0.4,.26,0],radius:.028,material:"band"},{bone:"phones",shape:"capsule",from:[-0.4,.26,0],to:[-0.18,.42,0],radius:.028,blend:.02,material:"band"},{bone:"phones",shape:"capsule",from:[-0.18,.42,0],to:[.18,.42,0],radius:.028,blend:.02,material:"band"},{bone:"phones",shape:"capsule",from:[.18,.42,0],to:[.4,.26,0],radius:.028,blend:.02,material:"band"},{bone:"phones",shape:"capsule",from:[.4,.26,0],to:[.47,0,0],radius:.028,material:"band"},{bone:"phones",shape:"cylinder",at:[-0.5,-0.04,0],rot:[0,0,Math.PI/2],radius:.12,half:.05,round:.025,material:"cup"},{bone:"phones",shape:"cylinder",at:[.5,-0.04,0],rot:[0,0,Math.PI/2],radius:.12,half:.05,round:.025,material:"cup"},{bone:"phones",shape:"cylinder",at:[-0.44,-0.04,0],rot:[0,0,Math.PI/2],radius:.1,half:.025,round:.02,material:"cushion"},{bone:"phones",shape:"cylinder",at:[.44,-0.04,0],rot:[0,0,Math.PI/2],radius:.1,half:.025,round:.02,material:"cushion"}],paints:[{bone:"body",on:["cloud"],kind:"sphere",at:[-0.2,.46,.27],radius:.06,color:"#ff9ec4",soft:.6,opacity:.75},{bone:"body",on:["cloud"],kind:"sphere",at:[.2,.46,.27],radius:.06,color:"#ff9ec4",soft:.6,opacity:.75}],eyes:{kind:"ball",bone:"body",at:[[-0.11,.56,.27],[.11,.56,.27]],radius:.05,iris:"#1d2550",irisSize:.8,pupilSize:.5,lid:"cloud"},face:{kind:"mouth",bone:"body",on:["cloud"],at:[0,.45,.31],width:.06,color:"#24305e",tongue:"#ff8fae"},anchors:{top:{bone:"body",at:[.18,.98,.05]},mouth:{bone:"body",at:[0,.45,.33]},ear:{bone:"phones",at:[-0.56,-0.04,0]},center:{bone:"body",at:[0,.5,0]}},acting:{idle:{phones:{rz:[0,.04,1.6,0]}},thinking:{phones:{rz:.12},body:{rz:.06}},listening:{phones:{rz:-0.12}},speaking:{phones:{rz:[0,.05,2.2,0]}},sleeping:{phones:{rz:.18},body:{rz:.1}},working:{phones:{rz:[0,.06,3.2,0]}},celebrating:{phones:{rz:[0,.12,3,0]}},sad:{phones:{rz:-0.1},body:{rx:.1}}},fx:{idle:[{glyph:"note",anchor:"ear",rate:.6,velocity:[-0.12,.25,.04],jitter:.08,wobble:.05,life:[1.4,1.8],size:[.05,.03],color:"#4f7cff"}],sleeping:[{glyph:"cloud",anchor:"top",rate:.5,velocity:[.05,.12,0],jitter:.04,life:[2,2.5],size:[.04,.08],color:"#dbe6ff"}]}};var ge={id:"ember",name:"Ember",tagline:"A fox cub with pointed ears and a big fluffy tail that never stops swishing",accent:"#f07a2a",frame:{target:.48,radius:.72},bound:{y:.38,radius:.85},motion:{hop:.14,squash:1,snap:1.1,talkSquash:.4},materials:{fur:{color:"#f07a2a",f0:.03,spec:.4,shininess:20,rim:1,sheen:.7,surface:{kind:"fur",scale:90,strength:.4,bone:"head"}},bodyFur:{color:"#f07a2a",shadeOf:"fur",f0:.03,spec:.4,shininess:20,rim:1,sheen:.7,surface:{kind:"fur",scale:90,strength:.4}},tailFur:{color:"#f07a2a",shadeOf:"fur",f0:.03,spec:.4,shininess:20,rim:1,sheen:.8,surface:{kind:"fur",scale:70,strength:.5,bone:"tail"}},dark:{color:"#3a2318",f0:.03,spec:.4,shininess:20,rim:.6,sheen:.5},nose:{color:"#1d1410",f0:.06,spec:1.8,shininess:200,rim:.3,gloss:.9}},bones:[{name:"body",pivot:[0,0,0],drive:{ry:[["yaw",.2]],rz:[["roll",.3]]}},{name:"head",parent:"body",pivot:[0,.48,.02],drive:{rx:[["pitch",-1]],ry:[["yaw",.8]],rz:[["roll",.7]]}},{name:"earL",parent:"head",pivot:[-0.14,.28,0],rest:{rz:.3},jiggle:{axis:[0,1,0],length:.16,freq:3.5,damping:.2,maxAngle:.4}},{name:"earR",parent:"head",pivot:[.14,.28,0],rest:{rz:-0.3},jiggle:{axis:[0,1,0],length:.16,freq:3.5,damping:.2,maxAngle:.4}},{name:"tail",parent:"body",pivot:[.15,.12,-0.15],rest:{rz:-0.9,rx:-0.4},wave:{ry:[.35,.8,0]},jiggle:{axis:[0,1,0],length:.35,freq:1.8,damping:.18,maxAngle:.6}}],parts:[{bone:"body",shape:"ellipsoid",at:[0,.25,0],radii:[.22,.25,.2],material:"bodyFur"},{bone:"body",shape:"capsule",from:[-0.1,.12,.08],to:[-0.1,.04,.12],radius:.06,blend:.05,material:"dark"},{bone:"body",shape:"capsule",from:[.1,.12,.08],to:[.1,.04,.12],radius:.06,blend:.05,material:"dark"},{bone:"head",shape:"ellipsoid",at:[0,.12,0],radii:[.27,.22,.23],blend:.1,material:"fur"},{bone:"head",shape:"roundCone",from:[0,.07,.1],to:[0,.05,.3],r1:.12,r2:.04,blend:.08,material:"fur"},{bone:"head",shape:"sphere",at:[0,.06,.33],radius:.035,material:"nose"},{bone:"head",shape:"ellipsoid",at:[-0.22,.02,.06],radii:[.09,.07,.08],blend:.06,material:"fur"},{bone:"head",shape:"ellipsoid",at:[.22,.02,.06],radii:[.09,.07,.08],blend:.06,material:"fur"},{bone:"earL",shape:"roundCone",from:[0,0,0],to:[0,.18,0],r1:.08,r2:.015,material:"fur"},{bone:"earR",shape:"roundCone",from:[0,0,0],to:[0,.18,0],r1:.08,r2:.015,material:"fur"},{bone:"tail",shape:"roundCone",from:[0,0,0],to:[0,.3,0],r1:.06,r2:.13,material:"tailFur"},{bone:"tail",shape:"sphere",at:[0,.36,0],radius:.11,blend:.08,material:"tailFur"}],paints:[{bone:"body",on:["bodyFur"],kind:"ellipse",at:[0,.26,.1],radii:[.13,.17],color:"#fff3e6",soft:.25},{bone:"head",on:["fur"],kind:"sphere",at:[0,0,.25],radius:.13,color:"#fff3e6",soft:.25},{bone:"head",on:["fur"],kind:"sphere",at:[-0.2,-0.02,.12],radius:.1,color:"#fff3e6",soft:.3},{bone:"head",on:["fur"],kind:"sphere",at:[.2,-0.02,.12],radius:.1,color:"#fff3e6",soft:.3},{bone:"earL",on:["fur"],kind:"sphere",at:[0,.2,0],radius:.07,color:"#3a2318",soft:.3},{bone:"earR",on:["fur"],kind:"sphere",at:[0,.2,0],radius:.07,color:"#3a2318",soft:.3},{bone:"earL",on:["fur"],kind:"ellipse",at:[0,.07,.05],radii:[.035,.07],color:"#ffd9c2",soft:.4},{bone:"earR",on:["fur"],kind:"ellipse",at:[0,.07,.05],radii:[.035,.07],color:"#ffd9c2",soft:.4},{bone:"tail",on:["tailFur"],kind:"sphere",at:[0,.46,0],radius:.13,color:"#fff3e6",soft:.2}],eyes:{kind:"ball",bone:"head",at:[[-0.1,.15,.19],[.1,.15,.19]],radius:.055,iris:"#2b1a10",irisSize:.82,pupilSize:.52,lid:"fur"},face:{kind:"mouth",bone:"head",on:["fur"],at:[0,0,.277],width:.045,color:"#3a2318",tongue:"#ff7d8a"},anchors:{top:{bone:"head",at:[.12,.45,.05]},mouth:{bone:"head",at:[0,0,.33]},ear:{bone:"earL",at:[0,.1,0]},feet:{bone:"root",at:[0,.02,.12]}},acting:{idle:{tail:{ry:[0,.2,.7,0]}},thinking:{earL:{rz:.6},head:{rz:.12}},listening:{earL:{rx:-0.3},earR:{rx:-0.3}},speaking:{tail:{ry:[0,.3,1.5,0]}},sleeping:{earL:{rz:.8},earR:{rz:-0.8},tail:{rz:-1.4}},working:{tail:{ry:[0,.4,3,0]}},error:{earL:{rz:1.1},earR:{rz:-1.1}},surprised:{earL:{rz:.05},earR:{rz:-0.05},tail:{rx:-0.8}},celebrating:{tail:{ry:[0,.6,5,0]}},sad:{earL:{rz:1,rx:.4},earR:{rz:-1,rx:.4},tail:{rz:-1.1}},happy:{tail:{ry:[0,.6,6,0]}}}};var xe={id:"hop",name:"Hop",tagline:"A soft white bunny whose long floppy ears swing with every hop",accent:"#ff8fb1",frame:{target:.57,radius:.76},bound:{y:.56,radius:.66},motion:{hop:.22,squash:1.3,snap:1.15,talkSquash:.4},materials:{fur:{color:"#fbf8f4",f0:.03,spec:.4,shininess:20,rim:1,sheen:.7,surface:{kind:"fur",scale:110,strength:.3,bone:"head"}},bodyFur:{color:"#fbf8f4",shadeOf:"fur",f0:.03,spec:.4,shininess:20,rim:1,sheen:.7,surface:{kind:"fur",scale:110,strength:.3}},earFur:{color:"#fbf8f4",shadeOf:"fur",f0:.03,spec:.4,shininess:20,rim:1.2,sheen:.7,sss:.35,sssColor:"#ffc4d4"},nose:{color:"#ff7fa5",f0:.06,spec:1.6,shininess:160,rim:.3,gloss:.8}},bones:[{name:"body",pivot:[0,0,0],drive:{ry:[["yaw",.2]],rz:[["roll",.35]]}},{name:"head",parent:"body",pivot:[0,.42,.02],drive:{rx:[["pitch",-1]],ry:[["yaw",.8]],rz:[["roll",.7]]}},{name:"earL",parent:"head",pivot:[-0.1,.3,-0.02],rest:{rz:.35,rx:.2},jiggle:{axis:[0,1,0],length:.32,freq:2,damping:.14,maxAngle:.8}},{name:"earR",parent:"head",pivot:[.1,.3,-0.02],rest:{rz:-1.2,rx:.2},jiggle:{axis:[0,1,0],length:.32,freq:2,damping:.14,maxAngle:.8}},{name:"tail",parent:"body",pivot:[0,.14,-0.2],jiggle:{axis:[0,0,-1],length:.06,freq:4,damping:.2}}],parts:[{bone:"body",shape:"ellipsoid",at:[0,.22,0],radii:[.22,.22,.21],material:"bodyFur"},{bone:"body",shape:"ellipsoid",at:[-0.12,.05,.1],radii:[.08,.05,.13],blend:.04,material:"bodyFur"},{bone:"body",shape:"ellipsoid",at:[.12,.05,.1],radii:[.08,.05,.13],blend:.04,material:"bodyFur"},{bone:"tail",shape:"sphere",at:[0,0,-0.03],radius:.07,blend:.03,material:"bodyFur"},{bone:"head",shape:"ellipsoid",at:[0,.14,0],radii:[.25,.22,.22],blend:.1,material:"fur"},{bone:"head",shape:"ellipsoid",at:[-0.06,.06,.17],radii:[.07,.055,.06],blend:.04,material:"fur"},{bone:"head",shape:"ellipsoid",at:[.06,.06,.17],radii:[.07,.055,.06],blend:.04,material:"fur"},{bone:"head",shape:"ellipsoid",at:[0,.1,.22],radii:[.028,.02,.018],material:"nose"},{bone:"earL",shape:"ellipsoid",at:[0,.2,0],radii:[.065,.22,.03],material:"earFur"},{bone:"earR",shape:"ellipsoid",at:[0,.2,0],radii:[.065,.22,.03],material:"earFur"}],paints:[{bone:"earL",on:["earFur"],kind:"ellipse",at:[0,.2,.03],radii:[.035,.16],color:"#ffc2d3",soft:.4},{bone:"earR",on:["earFur"],kind:"ellipse",at:[0,.2,.03],radii:[.035,.16],color:"#ffc2d3",soft:.4},{bone:"head",on:["fur"],kind:"sphere",at:[-0.16,.07,.16],radius:.045,color:"#ffb3c8",soft:.6,opacity:.8},{bone:"head",on:["fur"],kind:"sphere",at:[.16,.07,.16],radius:.045,color:"#ffb3c8",soft:.6,opacity:.8}],eyes:{kind:"ball",bone:"head",at:[[-0.1,.17,.17],[.1,.17,.17]],radius:.05,iris:"#3b1f2b",irisSize:.85,pupilSize:.55,lid:"fur"},face:{kind:"mouth",bone:"head",on:["fur"],at:[0,.035,.21],width:.035,color:"#5a2a3a",tongue:"#ff8fa3"},anchors:{top:{bone:"head",at:[.15,.5,.05]},mouth:{bone:"head",at:[0,.035,.24]},ear:{bone:"earL",at:[0,.2,0]},feet:{bone:"root",at:[0,.02,.15]}},acting:{thinking:{earR:{rz:-0.4},head:{rz:.1}},listening:{earL:{rz:0,rx:-0.2},earR:{rz:0,rx:-0.2}},sleeping:{earL:{rz:1.2,rx:.5},earR:{rz:-1.4,rx:.5}},error:{earL:{rz:[.6,.2,9,0]},earR:{rz:[-0.6,.2,9,1]}},surprised:{earL:{rz:.05,rx:-0.1},earR:{rz:-0.05,rx:-0.1}},celebrating:{earL:{rz:[.2,.3,4,0]},earR:{rz:[-0.2,.3,4,Math.PI]}},sad:{earL:{rz:1.4,rx:.6},earR:{rz:-1.4,rx:.6}}},fx:{happy:[{glyph:"heart",anchor:"top",rate:1.2,velocity:[0,.22,.04],jitter:.1,life:[1,1.3],size:[.04,.06],color:"#ff8fb1"}]}};var ye=[.085,.064,.044,.016],ve=[-0.6,-0.42,-0.62];function la(){let a={idle:{},thinking:{},listening:{},speaking:{},sleeping:{},working:{},error:{},surprised:{},celebrating:{},sad:{},happy:{}};for(let e=0;e<6;e++){let t=e*1.05;a.speaking[`t${e}s0`]={rx:[0,.2,1.1,t]},a.speaking[`t${e}s2`]={rx:[0,.35,1.6,t+1]},a.sleeping[`t${e}s0`]={rx:.3},a.sleeping[`t${e}s1`]={rx:.35},a.sleeping[`t${e}s2`]={rx:.55},a.happy[`t${e}s0`]={rx:[-0.45,.35,2.4,t]},a.happy[`t${e}s1`]={rx:[0,.3,2.4,t+1]},a.error[`t${e}s0`]={rx:-0.35},a.error[`t${e}s1`]={rx:[.35,.18,9,t]},a.error[`t${e}s2`]={rx:[.2,.22,11,t+2]},a.surprised[`t${e}s0`]={rx:-0.85},a.surprised[`t${e}s1`]={rx:-0.25},a.surprised[`t${e}s2`]={rx:-0.3},a.celebrating[`t${e}s0`]={rx:[-0.5,.3,3,t]},a.celebrating[`t${e}s1`]={rx:[.15,.3,3,t+1]},a.celebrating[`t${e}s2`]={rx:[.2,.3,3,t+2]},a.sad[`t${e}s0`]={rx:.45},a.sad[`t${e}s1`]={rx:.42},a.sad[`t${e}s2`]={rx:[.55,.06,.4,t]},a.working[`t${e}s0`]={rx:[-0.15,.08,1.2,t]};}return a.working.t0s0={rx:[-1.25,.22,5.5,0]},a.working.t0s1={rx:[.7,.2,5.5,.6]},a.working.t5s0={rx:[-1.25,.22,5.5,Math.PI]},a.working.t5s1={rx:[.7,.2,5.5,Math.PI+.6]},a.celebrating.t0s0={rx:-0.3,rz:[1.05,.25,3.2,0]},a.celebrating.t0s1={rx:[.5,.15,3.2,1]},a.celebrating.t0s2={rx:[.6,.2,3.2,2]},a.celebrating.t5s0={rx:-0.3,rz:[-1.05,.25,3.2,Math.PI]},a.celebrating.t5s1={rx:[.5,.15,3.2,Math.PI+1]},a.celebrating.t5s2={rx:[.6,.2,3.2,Math.PI+2]},a.thinking.t0s0={rx:-1.75},a.thinking.t0s1={rx:.95},a.thinking.t0s2={rx:[1,.12,1.6,0]},a.listening.t5s0={rx:-1.6},a.listening.t5s1={rx:-0.2},a.listening.t5s2={rx:.7},a}var ke=[{name:"mantle",pivot:[0,.42,0],drive:{rx:[["pitch",-0.6]],ry:[["yaw",.6]],rz:[["roll",.6]]}}],we=[];for(let a=0;a<6;a++){let e=(a+.5)/6*Math.PI*2;for(let t=0;t<3;t++){let r=`t${a}s${t}`;ke.push({name:r,parent:t===0?"mantle":`t${a}s${t-1}`,pivot:t===0?[.26*Math.sin(e),.02,.26*Math.cos(e)]:[0,-0.17,0],rest:t===0?{rx:ve[0],ry:e}:{rx:ve[t]},wave:{rx:[.12+t*.1,.32,a*1.3+t*.8],rz:[.06+t*.05,.21,a*2.1+t]},jiggle:{axis:[0,-1,0],length:.17,freq:2.4-t*.4,damping:.25,maxAngle:.8}}),we.push({bone:r,shape:"roundCone",from:[0,0,0],to:[0,-0.17,0],r1:ye[t],r2:ye[t+1],blend:t===0?.1:.04,material:"skin"});}}var ze={id:"inky",name:"Inky",tagline:"Floats, with six tentacles that trail on spring chains",accent:"#e04f7d",frame:{target:.86,radius:.98},bound:{y:.64,radius:1},motion:{float:.32,hop:.12,squash:1.1,snap:.85,look:.8,talkSquash:.5},materials:{skin:{color:"#f2647f",f0:.05,spec:1.1,shininess:90,rim:.8,sss:.35,sssColor:"#ffb0c4",gloss:.7}},bones:ke,parts:[{bone:"mantle",shape:"ellipsoid",at:[0,.38,-0.04],radii:[.43,.45,.41],material:"skin"},{bone:"mantle",shape:"ellipsoid",at:[0,.04,0],radii:[.35,.15,.35],blend:.16,material:"skin"},...we],paints:[...[[.14,.78,.12,.07],[-0.2,.72,.16,.055],[.33,.6,.12,.05],[-0.04,.83,-0.05,.06],[-0.36,.52,.1,.05],[.06,.62,.33,.045],[.338,.425,-0.291,.045]].map(([a,e,t,r])=>({bone:"mantle",on:["skin"],kind:"sphere",at:[a,e,t],radius:r,color:"#d23f6c",soft:.2})),{bone:"mantle",on:["skin"],kind:"sphere",at:[-0.27,.18,.31],radius:.065,color:"#ff9db0",soft:.6,opacity:.7},{bone:"mantle",on:["skin"],kind:"sphere",at:[.27,.18,.31],radius:.065,color:"#ff9db0",soft:.6,opacity:.7}],eyes:{kind:"ball",bone:"mantle",at:[[-0.16,.27,.3],[.16,.27,.3]],radius:.098,iris:"#f2b33d",irisSize:.66,pupilSize:.3,pupilAspect:1.9,lid:"skin"},face:{kind:"mouth",bone:"mantle",on:["skin"],at:[0,.13,.3],width:.062,color:"#5a1430",tongue:"#ff8fa8"},anchors:{top:{bone:"mantle",at:[.16,.86,.1]},mouth:{bone:"mantle",at:[0,.13,.33]},ear:{bone:"mantle",at:[-0.46,.4,0]},skirt:{bone:"mantle",at:[0,0,0]}},acting:la(),fx:{replace:["syllable"],ambient:[{glyph:"bubble",anchor:"skirt",rate:.7,spread:.35,velocity:[0,.18,0],jitter:.05,wobble:.06,life:[2.4,3.2],size:[.02,.045],color:"#8fcfff"}],syllable:[{glyph:"bubble",anchor:"mouth",rate:2,offset:[0,0,.04],velocity:[.05,.2,.1],jitter:.1,wobble:.05,life:[1,1.4],size:[.014,.034],color:"#9ad7ff"}]}};var Se={id:"latte",name:"Latte",tagline:"A cheerful coffee cup with latte-art foam and a curl of steam for hair",accent:"#b7794b",frame:{target:.43,radius:.68},bound:{y:.41,radius:.57},motion:{hop:.1,squash:.7,snap:1,talkSquash:.4},materials:{cup:{color:"#f4efe6",f0:.06,spec:1.6,shininess:140,rim:.6,gloss:.85},band:{color:"#c9854f",f0:.05,spec:1,shininess:80,rim:.5,gloss:.6},coffee:{color:"#6b3f22",f0:.04,spec:1.2,shininess:90,rim:.3,gloss:.7},foam:{color:"#f2dcc0",f0:.03,spec:.4,shininess:20,rim:.4,sss:.3,sssColor:"#fff3e2"},steam:{color:"#ffffff",f0:.02,spec:.2,shininess:10,rim:1.4,sss:.7,sssColor:"#ffffff",emit:"#ffffff",emitStrength:.08},bead:{color:"#2a1a10",f0:.06,spec:2.2,shininess:400,rim:.2,gloss:1}},bones:[{name:"body",pivot:[0,-0.08,0],drive:{rx:[["pitch",-0.3]],ry:[["yaw",.6]],rz:[["roll",.5]]},wave:{rz:[.02,.5,0]}},{name:"handle",parent:"body",pivot:[.31,.36,0],drive:{rz:[["flap",.4]]}},{name:"steam",parent:"body",pivot:[0,.58,0],wave:{rz:[.12,.6,0]},jiggle:{axis:[0,1,0],length:.2,freq:1.6,damping:.12,maxAngle:.6}}],parts:[{bone:"body",shape:"cylinder",at:[0,.33,0],radius:.3,half:.25,round:.05,material:"cup"},{bone:"body",shape:"cylinder",at:[0,.64,0],radius:.25,half:.1,round:.02,op:"sub",blend:.015,material:"cup"},{bone:"body",shape:"cylinder",at:[0,.55,0],radius:.255,half:.012,round:.008,material:"coffee"},{bone:"body",shape:"ellipsoid",at:[0,.562,0],radii:[.2,.022,.2],material:"foam"},{bone:"body",shape:"cylinder",at:[0,.2,0],radius:.305,half:.05,round:.012,material:"band"},{bone:"handle",shape:"frame",at:[.07,-0.02,0],half:[.08,.1],corner:.08,width:.025,depth:.03,rot:[Math.PI/2,0,0],material:"cup"},{bone:"steam",shape:"capsule",from:[0,0,0],to:[-0.05,.12,0],radius:.045,material:"steam"},{bone:"steam",shape:"capsule",from:[-0.05,.12,0],to:[.03,.22,0],radius:.035,blend:.04,material:"steam"},{bone:"steam",shape:"capsule",from:[.03,.22,0],to:[-0.01,.3,0],radius:.022,blend:.03,material:"steam"}],paints:[{bone:"body",on:["foam"],kind:"sphere",at:[-0.035,.584,.02],radius:.05,color:"#b98257",soft:.25},{bone:"body",on:["foam"],kind:"sphere",at:[.035,.584,.02],radius:.05,color:"#b98257",soft:.25},{bone:"body",on:["foam"],kind:"sphere",at:[0,.584,.08],radius:.035,color:"#b98257",soft:.3},{bone:"body",on:["cup"],kind:"sphere",at:[-0.19,.34,.24],radius:.05,color:"#ffa4a4",soft:.6,opacity:.7},{bone:"body",on:["cup"],kind:"sphere",at:[.19,.34,.24],radius:.05,color:"#ffa4a4",soft:.6,opacity:.7}],eyes:{kind:"bead",bone:"body",at:[[-0.1,.42,.3],[.1,.42,.3]],radii:[.032,.048,.02],material:"bead"},face:{kind:"mouth",bone:"body",on:["cup"],at:[0,.33,.305],width:.05,color:"#4a2a18",tongue:"#ff8a8a"},anchors:{top:{bone:"steam",at:[0,.34,0]},mouth:{bone:"body",at:[0,.33,.32]},ear:{bone:"body",at:[-0.32,.45,0]},feet:{bone:"root",at:[0,.02,.2]}},acting:{thinking:{steam:{rz:.4}},listening:{steam:{rz:-0.3}},speaking:{handle:{rz:[.1,.15,1.4,0]}},sleeping:{steam:{rz:.9,rx:.3}},working:{steam:{ry:[0,0,0,0,6]}},error:{steam:{rz:[0,.4,9,0]}},surprised:{steam:{rx:-0.3}},celebrating:{steam:{ry:[0,0,0,0,12]}},sad:{steam:{rz:1.1,rx:.5}}},fx:{ambient:[{glyph:"puff",anchor:"top",rate:.8,velocity:[0,.15,0],jitter:.04,wobble:.06,life:[1.2,1.6],size:[.03,.07],color:"#ffffff"}]}};var A=Math.PI/2,Re={id:"microduck",name:"Microduck",tagline:"A bipedal robot duck: servo neck, lens eyes, a bill that clacks when it talks, and boots it marches in",accent:"#ff6a1f",frame:{target:.57,radius:.8},bound:{y:.58,radius:.88},motion:{hop:.12,squash:.45,snap:1.4,look:.9,snapLook:1,talkSquash:.12},materials:{shell:{color:"#f3f1ec",f0:.04,spec:1.1,shininess:70,rim:.55,gloss:.5,sss:.12,sssColor:"#ffffff",surface:{kind:"ripple",scale:70,strength:.12,bone:"head"}},bodyShell:{color:"#f3f1ec",shadeOf:"shell",f0:.04,spec:1.1,shininess:70,rim:.55,gloss:.5,sss:.12,sssColor:"#ffffff",surface:{kind:"ripple",scale:70,strength:.12,bone:"body"}},bill:{color:"#ff5f1f",f0:.05,spec:1.3,shininess:90,rim:.45,gloss:.65,sss:.2,sssColor:"#ffb27a"},ring:{color:"#ff8410",f0:.05,spec:1.3,shininess:90,rim:.4,gloss:.65,sss:.15,sssColor:"#ffd08a"},boot:{color:"#ff5a24",f0:.04,spec:.9,shininess:50,rim:.4,gloss:.4,sss:.15,sssColor:"#ffb08a"},sole:{color:"#ffb12e",f0:.04,spec:.7,shininess:40,rim:.3,gloss:.3},servo:{color:"#2a2d33",f0:.06,spec:1.2,shininess:80,rim:.5,gloss:.55,metal:.25},horn:{color:"#a3a9b1",f0:.3,spec:1.6,shininess:120,rim:.4,gloss:.7,metal:.8},lens:{color:"#101318",f0:.12,spec:2.6,shininess:420,rim:.3,gloss:1},mouth:{color:"#3b1510",f0:.04,spec:.5,shininess:30,rim:0},led:{color:"#ffffff",f0:.05,spec:1,shininess:120,rim:0,glows:true}},bones:[{name:"hips",pivot:[0,0,0],rest:{ry:.55}},{name:"legL",parent:"hips",pivot:[-0.12,.36,0]},{name:"shinL",parent:"legL",pivot:[0,-0.15,0]},{name:"legR",parent:"hips",pivot:[.12,.36,0]},{name:"shinR",parent:"legR",pivot:[0,-0.15,0]},{name:"body",parent:"hips",pivot:[0,.39,0],drive:{ry:[["yaw",.2]],rz:[["roll",.4]]}},{name:"neck0",parent:"body",pivot:[0,.19,.04],drive:{rx:[["pitch",-0.15]],ry:[["yaw",.25]]}},{name:"neck1",parent:"neck0",pivot:[0,.09,0],drive:{rx:[["pitch",-0.1]],ry:[["yaw",.2]]},jiggle:{axis:[0,1,0],length:.2,freq:3.4,damping:.35,maxAngle:.16}},{name:"head",parent:"neck1",pivot:[0,.09,0],drive:{rx:[["pitch",-0.35]],ry:[["yaw",.55]],rz:[["roll",.6]]}},{name:"jaw",parent:"head",pivot:[0,.063,-0.18],drive:{rx:[["talk",.24]]}}],parts:[{bone:"head",shape:"roundBox",at:[0,.245,.05],half:[.2,.17,.3],round:.16,clip:{normal:[0,-1,0],offset:.145},material:"shell"},{bone:"head",shape:"roundBox",at:[0,.085,.1],half:[.208,.022,.32],round:.016,material:"bill"},{bone:"head",shape:"roundBox",at:[0,.045,-0.06],half:[.17,.035,.12],round:.02,material:"mouth"},{bone:"jaw",shape:"roundBox",at:[0,-0.017,.27],half:[.192,.018,.285],round:.014,material:"bill"},{bone:"head",shape:"cylinder",at:[-0.205,.225,.15],rot:[A,-1.05,0],radius:.08,half:.026,round:.016,material:"ring"},{bone:"head",shape:"cylinder",at:[.205,.225,.15],rot:[A,1.05,0],radius:.08,half:.026,round:.016,material:"ring"},{bone:"head",shape:"sphere",at:[-0.2,.31,.25],radius:.016,material:"servo"},{bone:"head",shape:"sphere",at:[.2,.31,.25],radius:.016,material:"servo"},{bone:"head",shape:"roundBox",at:[0,.01,0],half:[.07,.035,.07],round:.016,material:"servo"},{bone:"neck0",shape:"roundBox",at:[0,.045,0],half:[.048,.047,.042],round:.016,material:"servo"},{bone:"neck0",shape:"cylinder",at:[0,.02,0],rot:[0,0,A],radius:.026,half:.057,round:.01,material:"horn"},{bone:"neck1",shape:"roundBox",at:[0,.045,0],half:[.045,.047,.04],round:.016,material:"servo"},{bone:"neck1",shape:"cylinder",at:[0,.02,0],rot:[0,0,A],radius:.024,half:.053,round:.01,material:"horn"},{bone:"body",shape:"roundBox",at:[0,.1,-0.01],half:[.19,.1,.15],round:.085,material:"bodyShell"},{bone:"body",shape:"capsule",from:[-0.03,.12,.14],to:[.03,.12,.14],radius:.014,material:"led"},{bone:"hips",shape:"roundBox",at:[0,.37,0],half:[.15,.04,.09],round:.02,material:"servo"},{bone:"hips",shape:"cylinder",at:[-0.16,.36,0],rot:[0,0,A],radius:.045,half:.026,round:.012,material:"horn"},{bone:"hips",shape:"cylinder",at:[.16,.36,0],rot:[0,0,A],radius:.045,half:.026,round:.012,material:"horn"},...[["legL","shinL",-1],["legR","shinR",1]].flatMap(([a,e,t])=>[{bone:a,shape:"roundBox",at:[0,-0.075,0],half:[.038,.07,.042],round:.015,material:"servo"},{bone:a,shape:"cylinder",at:[0,-0.15,0],rot:[0,0,A],radius:.036,half:.05,round:.012,material:"horn"},{bone:a,shape:"plate",at:[t*.056,-0.1,-5e-3],rot:[t*A,t*Math.PI/4,A],half:[.058,.058],corner:.034,depth:.012,material:"bodyShell"},{bone:e,shape:"roundBox",at:[0,-0.06,0],half:[.034,.055,.038],round:.014,material:"servo"},{bone:e,shape:"roundBox",at:[0,-0.135,.005],half:[.048,.036,.052],round:.016,material:"servo"},{bone:e,shape:"roundBox",at:[0,-0.17,.045],half:[.074,.04,.108],round:.038,material:"boot"},{bone:e,shape:"roundBox",at:[0,-0.196,.045],half:[.079,.014,.113],round:.012,material:"sole"}])],paints:[...[-1,1].flatMap(a=>[{bone:"head",on:["bill"],kind:"sphere",at:[a*.208,.085,-0.13],radius:.013,color:"#c8261a",soft:.2},{bone:"head",on:["bill"],kind:"sphere",at:[a*.208,.085,-0.18],radius:.013,color:"#c8261a",soft:.2}]),...["shinL","shinR"].flatMap(a=>[[-0.03,.1],[.03,.1],[0,.13],[-0.03,.06],[.03,.06]].map(([e,t])=>({bone:a,on:["boot"],kind:"sphere",at:[e,-0.13,t],radius:.011,color:"#c23a14",soft:.25}))),...[-1,1].map(a=>({bone:"body",on:["bodyShell"],kind:"sphere",at:[a*.142,.04,.117],radius:.009,color:"#8d9198",soft:.2}))],eyes:{kind:"bead",bone:"head",at:[[-0.228,.225,.165],[.228,.225,.165]],radii:[.048,.048,.048],material:"lens"},anchors:{top:{bone:"head",at:[.1,.42,.08]},mouth:{bone:"head",at:[0,.06,.45]},ear:{bone:"head",at:[-0.24,.2,.05]},feet:{bone:"root",at:[0,.02,.08]},chest:{bone:"body",at:[0,.12,.16]},neck:{bone:"neck0",at:[.05,.08,.05]}},acting:{idle:{body:{rz:[0,.03,.45,0]},neck0:{rx:[0,.04,.9,0]}},thinking:{head:{rz:.22,rx:-0.1},jaw:{rx:.06},legR:{rx:[-0.05,.05,2.4,0]},shinR:{rx:[.05,.05,2.4,Math.PI]}},listening:{head:{rz:-0.24,ry:.2},neck0:{rx:.1}},speaking:{neck0:{rx:[0,.05,1.6,0]},body:{rz:[0,.03,.8,0]}},sleeping:{neck0:{rx:.08},neck1:{rx:.05},head:{rz:.12},legL:{rx:-0.12},shinL:{rx:.24},legR:{rx:-0.12},shinR:{rx:.24}},working:{neck0:{rx:[.1,.06,4.2,0]},neck1:{rx:[.04,.04,4.2,.6]},jaw:{rx:[.03,.03,8.4,0]}},error:{head:{rz:[.2,.06,9,0]},jaw:{rx:.06},legL:{rz:.1},legR:{rz:-0.1},neck0:{rx:.12}},surprised:{neck0:{rx:-0.15},head:{rx:.05}},celebrating:{legL:{rx:[-0.25,.25,2.4,0]},shinL:{rx:[.25,.25,2.4,Math.PI]},legR:{rx:[-0.25,.25,2.4,Math.PI]},shinR:{rx:[.25,.25,2.4,0]},head:{rz:[0,.2,1.2,0]}},sad:{head:{rz:-0.1},legL:{rx:-0.08},shinL:{rx:.16},legR:{rx:-0.08},shinR:{rx:.16}},happy:{legL:{rx:[-0.2,.2,4,0]},shinL:{rx:[.2,.2,4,Math.PI]},legR:{rx:[-0.2,.2,4,Math.PI]},shinR:{rx:[.2,.2,4,0]},jaw:{rx:[.08,.08,8,0]}}},fx:{error:[{glyph:"spark",anchor:"neck",rate:5,spread:.03,velocity:[.25,.3,.1],jitter:.8,gravity:2,life:[.2,.35],size:[.03,.012],color:"#ffd166",glow:true,align:true}],working:[{glyph:"dot",anchor:"chest",rate:1.6,offset:[0,.02,.02],spread:.03,velocity:[0,.1,.06],jitter:.02,life:[.7,.9],size:[.012,.004],color:"#ffb27a",glow:true}]}};var Me={id:"miso",name:"Miso",tagline:"A plush tabby with velvet fur, swivelling ears and a tail that never sits still",accent:"#e38b3c",frame:{target:.56,radius:.72},bound:{y:.52,radius:.88},motion:{hop:.14,squash:1.2,snap:1.1,talkSquash:.3},materials:{fur:{color:"#eaa15c",f0:.015,spec:.06,shininess:6,rim:1.1,sheen:.95,gloss:0,sss:.18,sssColor:"#ffcf9e"},cream:{color:"#fbe8d0",f0:.015,spec:.06,shininess:6,rim:1,sheen:.9,gloss:0,sss:.18,sssColor:"#ffe6cc"},pink:{color:"#ff9fb2",f0:.04,spec:.5,shininess:40,rim:.4,sss:.4,sssColor:"#ffc4cf"},nose:{color:"#f27a93",f0:.06,spec:1.6,shininess:160,rim:.3,gloss:.8},whisker:{color:"#fff8ee",f0:.04,spec:.6,shininess:60,rim:.5}},bones:[{name:"body",pivot:[0,0,0],drive:{ry:[["yaw",.2]],rz:[["roll",.25]]}},{name:"head",parent:"body",pivot:[0,.5,.02],drive:{rx:[["pitch",-1]],ry:[["yaw",.85]],rz:[["roll",.8]]}},{name:"earL",parent:"head",pivot:[-0.19,.38,-0.02],rest:{rz:.32},wave:{rx:[.06,.37,0]},jiggle:{axis:[0,1,0],length:.16,freq:3.2,damping:.16,maxAngle:.5}},{name:"earR",parent:"head",pivot:[.19,.38,-0.02],rest:{rz:-0.32},wave:{rx:[.06,.29,2]},jiggle:{axis:[0,1,0],length:.16,freq:3.2,damping:.16,maxAngle:.5}},{name:"pawL",parent:"body",pivot:[-0.13,.22,.17],drive:{rx:[["flap",-1.2]],rz:[["flap",-0.4]]}},{name:"pawR",parent:"body",pivot:[.13,.22,.17],drive:{rx:[["flap",-1.2]],rz:[["flap",.4]]}},{name:"tail0",parent:"body",pivot:[.12,.1,-0.24],rest:{rx:-0.5,rz:-0.5},wave:{rz:[.25,.45,0]},jiggle:{axis:[0,1,0],length:.16,freq:2,damping:.25,maxAngle:.7}},{name:"tail1",parent:"tail0",pivot:[0,.16,0],rest:{rx:-0.3},wave:{rz:[.2,.45,.8]},jiggle:{axis:[0,1,0],length:.15,freq:1.8,damping:.22,maxAngle:.8}},{name:"tail2",parent:"tail1",pivot:[0,.15,0],rest:{rx:.25},wave:{rz:[.3,.45,1.6]},jiggle:{axis:[0,1,0],length:.13,freq:1.6,damping:.2,maxAngle:.9}}],parts:[{bone:"body",shape:"ellipsoid",at:[0,.25,-0.02],radii:[.29,.26,.26],material:"fur"},{bone:"body",shape:"ellipsoid",at:[-0.17,.13,-0.02],radii:[.14,.13,.19],blend:.08,material:"fur"},{bone:"body",shape:"ellipsoid",at:[.17,.13,-0.02],radii:[.14,.13,.19],blend:.08,material:"fur"},{bone:"body",shape:"ellipsoid",at:[-0.17,.04,.14],radii:[.085,.05,.11],blend:.03,material:"cream"},{bone:"body",shape:"ellipsoid",at:[.17,.04,.14],radii:[.085,.05,.11],blend:.03,material:"cream"},{bone:"head",shape:"ellipsoid",at:[0,.2,0],radii:[.34,.28,.29],blend:.1,material:"fur"},{bone:"head",shape:"sphere",at:[-0.17,.1,.12],radius:.15,blend:.1,material:"fur"},{bone:"head",shape:"sphere",at:[.17,.1,.12],radius:.15,blend:.1,material:"fur"},{bone:"head",shape:"ellipsoid",at:[0,.09,.22],radii:[.12,.075,.08],blend:.05,material:"cream"},{bone:"head",shape:"ellipsoid",at:[0,.135,.3],rot:[.3,0,0],radii:[.032,.02,.018],blend:.01,material:"nose"},{bone:"earL",shape:"roundCone",from:[0,0,0],to:[0,.15,0],r1:.1,r2:.022,blend:.05,material:"fur"},{bone:"earL",shape:"ellipsoid",at:[0,.055,.045],radii:[.05,.075,.03],material:"pink"},{bone:"earR",shape:"roundCone",from:[0,0,0],to:[0,.15,0],r1:.1,r2:.022,blend:.05,material:"fur"},{bone:"earR",shape:"ellipsoid",at:[0,.055,.045],radii:[.05,.075,.03],material:"pink"},{bone:"pawL",shape:"capsule",from:[0,0,0],to:[0,-0.15,.03],radius:.065,blend:.05,material:"fur"},{bone:"pawL",shape:"ellipsoid",at:[0,-0.17,.05],radii:[.07,.05,.075],blend:.03,material:"cream"},{bone:"pawR",shape:"capsule",from:[0,0,0],to:[0,-0.15,.03],radius:.065,blend:.05,material:"fur"},{bone:"pawR",shape:"ellipsoid",at:[0,-0.17,.05],radii:[.07,.05,.075],blend:.03,material:"cream"},{bone:"tail0",shape:"roundCone",from:[0,0,0],to:[0,.16,0],r1:.055,r2:.05,blend:.04,material:"fur"},{bone:"tail1",shape:"roundCone",from:[0,0,0],to:[0,.15,0],r1:.05,r2:.047,blend:.02,material:"fur"},{bone:"tail2",shape:"roundCone",from:[0,0,0],to:[0,.12,0],r1:.047,r2:.04,blend:.02,material:"cream"},{bone:"head",shape:"capsule",from:[-0.13,.1,.27],to:[-0.33,.13,.24],radius:.005,material:"whisker"},{bone:"head",shape:"capsule",from:[-0.13,.08,.27],to:[-0.33,.06,.23],radius:.005,material:"whisker"},{bone:"head",shape:"capsule",from:[.13,.1,.27],to:[.33,.13,.24],radius:.005,material:"whisker"},{bone:"head",shape:"capsule",from:[.13,.08,.27],to:[.33,.06,.23],radius:.005,material:"whisker"}],paints:[{bone:"head",on:["fur"],kind:"ellipse",at:[0,.4,.2],radii:[.022,.08],color:"#c4733a",soft:.5},{bone:"head",on:["fur"],kind:"ellipse",at:[-0.075,.38,.2],radii:[.018,.065],color:"#c4733a",soft:.5},{bone:"head",on:["fur"],kind:"ellipse",at:[.075,.38,.2],radii:[.018,.065],color:"#c4733a",soft:.5},{bone:"body",on:["fur"],kind:"ellipse",at:[0,.24,.2],radii:[.17,.2],color:"#fbe8d0",soft:.35},{bone:"head",on:["fur"],kind:"sphere",at:[-0.21,.1,.24],radius:.06,color:"#ff9db0",soft:.6,opacity:.75},{bone:"head",on:["fur"],kind:"sphere",at:[.21,.1,.24],radius:.06,color:"#ff9db0",soft:.6,opacity:.75}],eyes:{kind:"ball",bone:"head",at:[[-0.125,.22,.2],[.125,.22,.2]],radius:.088,iris:"#8ccf4d",irisSize:.78,pupilSize:.42,pupilAspect:.5,lid:"fur"},face:{kind:"mouth",bone:"head",on:["cream"],at:[0,.06,.29],width:.045,color:"#5b2630",tongue:"#ff8ea3"},anchors:{top:{bone:"head",at:[.2,.42,.08]},mouth:{bone:"head",at:[0,.06,.32]},ear:{bone:"head",at:[-0.34,.25,0]},feet:{bone:"root",at:[0,.03,.18]},tail:{bone:"tail2",at:[0,.12,0]}},acting:{idle:{tail0:{rz:[-0.5,.15,.4,0]}},thinking:{pawR:{rx:-1.75,rz:.35},tail2:{rx:[.25,.3,1.6,0]},earL:{ry:.5}},listening:{earL:{rx:-0.35,ry:-0.6},earR:{rx:-0.35},tail0:{rz:-0.35}},speaking:{pawL:{rx:[-0.4,.25,1.2,0]},pawR:{rx:[-0.3,.25,1.2,1.9]},tail0:{rz:[-0.5,.2,.9,0]}},sleeping:{earL:{rz:.5,rx:.4},earR:{rz:-0.5,rx:.4},tail0:{rx:.4,rz:-1.2},tail1:{rx:.5}},working:{pawL:{rx:[-0.35,.3,3.4,0]},pawR:{rx:[-0.35,.3,3.4,Math.PI]},earL:{rx:-0.25},earR:{rx:-0.25},tail2:{rx:[.25,.2,1.7,0]}},error:{earL:{rz:1.1,rx:.3},earR:{rz:-1.1,rx:.3},tail0:{rx:[-0.9,.05,12,0],rz:0},tail1:{rx:.3},tail2:{rx:.2}},surprised:{earL:{rz:-0.1,rx:-0.2},earR:{rz:.1,rx:-0.2},pawL:{rx:-1.4,rz:-0.4},pawR:{rx:-1.4,rz:.4},tail0:{rx:-0.9,rz:0}},celebrating:{pawL:{rx:[-2.2,.35,4,0],rz:-0.5},pawR:{rx:[-2.2,.35,4,Math.PI],rz:.5},tail0:{rz:[-0.4,.5,2.6,0]}},sad:{earL:{rz:.95,rx:.35},earR:{rz:-0.95,rx:.35},tail0:{rx:.7,rz:-0.8},tail1:{rx:.3},tail2:{rx:.1}},happy:{pawL:{rx:[-1.6,.3,5,0]},pawR:{rx:[-1.6,.3,5,1.4]},tail0:{rz:[-0.5,.45,3,0]}}},fx:{happy:[{glyph:"heart",anchor:"top",rate:1.2,spread:.15,velocity:[0,.22,.05],jitter:.12,wobble:.06,life:[1,1.3],size:[.04,.07],color:"#ff86a2"}]}};var Le={id:"mochi",name:"Mochi",tagline:"Translucent jelly that squashes and splashes, with a propeller sprout",accent:"#1fae8a",frame:{target:.56,radius:.8},bound:{y:.5,radius:.82},motion:{hop:.17,squash:1.9,snap:.9,talkSquash:1.3},materials:{jelly:{color:"#3fcf9f",f0:.06,spec:1.6,shininess:140,rim:.7,sss:.55,sssColor:"#9effd9",gloss:.9},bead:{color:"#120d18",f0:.06,spec:2.2,shininess:400,rim:.2,gloss:1},leaf:{color:"#5bbf3a",f0:.04,spec:.7,shininess:50,rim:.6,sss:.25,sssColor:"#c8ff7a"}},bones:[{name:"body",pivot:[0,0,0],drive:{rx:[["pitch",-0.35]],ry:[["yaw",.55]],rz:[["roll",.6]]}},{name:"sprout",parent:"body",pivot:[0,.83,-0.02],jiggle:{axis:[0,1,0],length:.16,freq:2.2,damping:.09}}],parts:[{bone:"body",shape:"sphere",at:[0,.41,0],radius:.42,material:"jelly"},{bone:"body",shape:"ellipsoid",at:[0,.17,0],radii:[.5,.17,.47],blend:.24,material:"jelly"},{bone:"body",shape:"roundCone",from:[0,.62,0],to:[0,.83,-0.02],r1:.17,r2:.035,blend:.22,material:"jelly"},{bone:"sprout",shape:"capsule",from:[0,-0.02,0],to:[0,.09,0],radius:.014,material:"leaf"},{bone:"sprout",shape:"ellipsoid",at:[-0.065,.11,0],rot:[0,.3,.5],radii:[.075,.018,.042],blend:.015,material:"leaf"},{bone:"sprout",shape:"ellipsoid",at:[.07,.12,0],rot:[0,-0.3,-0.45],radii:[.08,.018,.045],blend:.015,material:"leaf"}],paints:[{bone:"body",on:["jelly"],kind:"sphere",at:[-0.25,.32,.31],radius:.07,color:"#ff8fa8",soft:.6,opacity:.8},{bone:"body",on:["jelly"],kind:"sphere",at:[.25,.32,.31],radius:.07,color:"#ff8fa8",soft:.6,opacity:.8}],eyes:{kind:"bead",bone:"body",at:[[-0.14,.43,.385],[.14,.43,.385]],radii:[.045,.066,.03],material:"bead"},face:{kind:"mouth",bone:"body",on:["jelly"],at:[0,.32,.4],width:.065,color:"#173528",tongue:"#ff7d97"},anchors:{top:{bone:"body",at:[.16,.86,.1]},mouth:{bone:"body",at:[0,.32,.42]},ear:{bone:"body",at:[-0.42,.45,0]},feet:{bone:"root",at:[0,.05,.25]}},acting:{idle:{sprout:{rz:[0,.1,.6,0]}},thinking:{sprout:{rx:-0.15,ry:[0,0,0,0,7]}},listening:{sprout:{rx:-0.4,rz:.15}},speaking:{sprout:{rz:[0,.2,2.4,0]}},sleeping:{sprout:{rx:.85,rz:.35}},working:{sprout:{ry:[0,0,0,0,3]}},error:{sprout:{rx:.45,rz:[.3,.15,12,0]}},surprised:{sprout:{rx:-0.3}},celebrating:{sprout:{ry:[0,0,0,0,18]}},sad:{sprout:{rx:1.1,rz:.5}},happy:{sprout:{ry:[0,0,0,0,16]}}},fx:{replace:["land"],land:[{glyph:"drop",anchor:"feet",rate:7,spread:.18,velocity:[0,.65,.05],jitter:.7,gravity:3.2,life:[.45,.6],size:[.035,.022],color:"#55d6ad",align:true}],"enter:happy":[{glyph:"drop",anchor:"top",rate:5,velocity:[0,.7,.05],jitter:.9,gravity:3,life:[.5,.7],size:[.035,.02],color:"#6fe3bd",align:true}]}};var Ce={id:"pebble",name:"Pebble",tagline:"A penguin chick in a knitted scarf: satin coat, waddling walk, flippers that flap when it is happy",accent:"#3d5a9e",frame:{target:.56,radius:.76},bound:{y:.52,radius:.74},motion:{hop:.12,squash:1.2,snap:1.05,talkSquash:.45},materials:{coat:{color:"#27324f",f0:.04,spec:.7,shininess:46,rim:1,sheen:.55,gloss:.35,surface:{kind:"fur",scale:130,strength:.28,bone:"head"}},bodyCoat:{color:"#27324f",shadeOf:"coat",f0:.04,spec:.7,shininess:46,rim:1,sheen:.55,gloss:.35,surface:{kind:"fur",scale:130,strength:.28}},flipper:{color:"#222b45",shadeOf:"coat",f0:.04,spec:.8,shininess:50,rim:.9,sheen:.5,gloss:.4},beak:{color:"#ffa53d",f0:.05,spec:1,shininess:80,rim:.4,gloss:.6},mouth:{color:"#5d1a22",f0:.04,spec:.5,shininess:30,rim:0},feet:{color:"#ff9b3d",f0:.04,spec:.7,shininess:50,rim:.35,gloss:.4,sss:.25,sssColor:"#ffc68a"},knit:{color:"#e8433f",f0:.02,spec:.15,shininess:10,rim:.7,sheen:.7,surface:{kind:"scales",scale:42,strength:.75,color:"#a8242a"}},knitStripe:{color:"#fff2e6",f0:.02,spec:.15,shininess:10,rim:.6,sheen:.7}},bones:[{name:"body",pivot:[0,0,0],drive:{ry:[["yaw",.2]],rz:[["roll",.35]]},wave:{rz:[.035,.9,0]}},{name:"head",parent:"body",pivot:[0,.6,.01],drive:{rx:[["pitch",-1]],ry:[["yaw",.8]],rz:[["roll",.7]]}},{name:"beak",parent:"head",pivot:[0,.12,.27],drive:{rx:[["talk",-0.22]]}},{name:"jaw",parent:"head",pivot:[0,.12,.27],drive:{rx:[["talk",.75]]}},{name:"tuft",parent:"head",pivot:[0,.42,.02],rest:{rx:-0.2},jiggle:{axis:[0,1,0],length:.1,freq:3.4,damping:.15}},{name:"flipperL",parent:"body",pivot:[-0.3,.5,0],rest:{rz:-0.2},drive:{rz:[["flap",-1.4]]},jiggle:{axis:[0,-1,0],length:.26,freq:3.4,damping:.3,maxAngle:.45}},{name:"flipperR",parent:"body",pivot:[.3,.5,0],rest:{rz:.2},drive:{rz:[["flap",1.4]]},jiggle:{axis:[0,-1,0],length:.26,freq:3.4,damping:.3,maxAngle:.45}},{name:"scarf",parent:"body",pivot:[.13,.56,.25],rest:{rz:.12,rx:-0.15},jiggle:{axis:[0,-1,0],length:.2,freq:2.4,damping:.16,maxAngle:.7}},{name:"tail",parent:"body",pivot:[0,.1,-0.27],rest:{rx:-1.2},jiggle:{axis:[0,1,0],length:.08,freq:3,damping:.2}}],parts:[{bone:"body",shape:"ellipsoid",at:[0,.34,-0.01],radii:[.32,.34,.29],material:"bodyCoat"},{bone:"head",shape:"sphere",at:[0,.16,0],radius:.28,blend:.14,material:"coat"},{bone:"body",shape:"ellipsoid",at:[0,.575,.005],radii:[.3,.078,.28],material:"knit"},{bone:"scarf",shape:"roundBox",at:[0,-0.1,.01],half:[.05,.1,.018],round:.016,material:"knit"},{bone:"scarf",shape:"roundBox",at:[0,-0.195,.01],half:[.052,.018,.02],round:.012,material:"knitStripe"},{bone:"head",shape:"ellipsoid",at:[0,.12,.29],radii:[.035,.02,.025],material:"mouth"},{bone:"beak",shape:"ellipsoid",at:[0,0,.035],rot:[.15,0,0],radii:[.05,.034,.05],clip:{normal:[0,-1,0]},material:"beak"},{bone:"beak",shape:"ellipsoid",at:[0,0,.035],rot:[.15,0,0],radii:[.041,.028,.042],clip:{normal:[0,-1,0],offset:.003},material:"mouth"},{bone:"jaw",shape:"ellipsoid",at:[0,0,.026],radii:[.043,.025,.044],clip:{normal:[0,1,0]},material:"beak"},{bone:"jaw",shape:"ellipsoid",at:[0,0,.026],radii:[.035,.019,.036],clip:{normal:[0,1,0],offset:.003},material:"mouth"},{bone:"tuft",shape:"roundCone",from:[0,-0.03,0],to:[.01,.07,.02],r1:.035,r2:.008,blend:.03,material:"coat"},{bone:"tuft",shape:"roundCone",from:[0,-0.03,0],to:[-0.04,.05,-0.02],r1:.028,r2:.007,blend:.03,material:"coat"},{bone:"flipperL",shape:"ellipsoid",at:[-0.02,-0.16,.02],rot:[0,0,-0.12],radii:[.045,.2,.11],blend:.02,material:"flipper"},{bone:"flipperR",shape:"ellipsoid",at:[.02,-0.16,.02],rot:[0,0,.12],radii:[.045,.2,.11],blend:.02,material:"flipper"},{bone:"tail",shape:"ellipsoid",at:[0,.05,0],radii:[.08,.07,.025],blend:.03,material:"bodyCoat"},...[-1,1].flatMap(a=>[{bone:"root",shape:"ellipsoid",at:[a*.13,.03,.17],rot:[0,a*.25,0],radii:[.1,.03,.11],material:"feet"},...[-1,0,1].map(e=>({bone:"root",shape:"sphere",at:[a*.16+e*.055,.03,.26-Math.abs(e)*.02],radius:.034,blend:.03,material:"feet"}))])],paints:[{bone:"body",on:["bodyCoat"],kind:"ellipse",at:[0,.3,.08],radii:[.24,.27],color:"#f8f6f0",soft:.12},{bone:"head",on:["coat"],kind:"sphere",at:[-0.1,.13,.22],radius:.14,color:"#f8f6f0",soft:.12},{bone:"head",on:["coat"],kind:"sphere",at:[.1,.13,.22],radius:.14,color:"#f8f6f0",soft:.12},{bone:"head",on:["coat"],kind:"ellipse",at:[0,.02,.1],radii:[.17,.08],color:"#f8f6f0",soft:.2},{bone:"head",on:["coat"],kind:"sphere",at:[-0.17,.06,.2],radius:.05,color:"#ff9eb0",soft:.6,opacity:.8},{bone:"head",on:["coat"],kind:"sphere",at:[.17,.06,.2],radius:.05,color:"#ff9eb0",soft:.6,opacity:.8},{bone:"scarf",on:["knit"],kind:"ellipse",at:[0,-0.12,0],radii:[.08,.018],color:"#fff2e6",soft:.15}],eyes:{kind:"ball",bone:"head",at:[[-0.1,.18,.23],[.1,.18,.23]],radius:.066,iris:"#1d2233",irisSize:.8,pupilSize:.5,lid:"coat"},anchors:{top:{bone:"head",at:[.12,.44,.06]},mouth:{bone:"head",at:[0,.11,.36]},ear:{bone:"head",at:[-0.3,.18,0]},feet:{bone:"root",at:[0,.02,.17]},chest:{bone:"body",at:[0,.4,.3]}},acting:{idle:{tail:{rz:[0,.2,.9,0]}},thinking:{flipperR:{rz:1.2,rx:-1.1,ry:-0.3},head:{rz:.1}},listening:{flipperL:{rz:-0.9,rx:-0.3},tuft:{rx:-0.35}},speaking:{flipperL:{rz:[-0.15,.15,1.8,0]},flipperR:{rz:[.15,.15,1.8,1.5]}},sleeping:{flipperL:{ry:.6,rz:.2},flipperR:{ry:-0.6,rz:-0.2},tuft:{rx:.5}},working:{flipperL:{rx:[-0.7,.15,6,0],rz:.2},flipperR:{rx:[-0.7,.15,6,Math.PI],rz:-0.2},head:{rx:.12}},error:{flipperL:{rz:[-1.25,.08,13,0]},flipperR:{rz:[1.25,.08,13,1]},tuft:{rx:-0.6}},surprised:{flipperL:{rz:-1.6,rx:-0.3},flipperR:{rz:1.6,rx:-0.3},tuft:{rx:-0.7}},celebrating:{flipperL:{rz:[-1.1,.55,8,0]},flipperR:{rz:[1.1,.55,8,0]},tail:{rz:[0,.4,4,0]}},sad:{flipperL:{rz:.18},flipperR:{rz:-0.18},tuft:{rx:.8},scarf:{rx:.1}},happy:{flipperL:{rz:[-0.8,.6,9,0]},flipperR:{rz:[.8,.6,9,0]},tail:{rz:[0,.35,5,0]}}},fx:{replace:["land"],land:[{glyph:"puff",anchor:"feet",rate:8,spread:.12,velocity:[0,.06,0],jitter:.34,drag:3.5,life:[.5,.75],size:[.05,.12],color:"#eef4ff"}],celebrating:[{glyph:"sparkle",anchor:"top",rate:3,spread:.4,velocity:[0,-0.05,0],jitter:.08,wobble:.08,life:[1.4,1.8],size:[.04,.01],spin:1.2,color:"#dff0ff"}]}};var Ee={id:"pip",name:"Pip",tagline:"Sings with a real beak, snaps its head like a bird, flaps",accent:"#e8892a",frame:{target:.66,radius:.86},bound:{y:.62,radius:.92},motion:{hop:.13,squash:1.1,snap:1.25,snapLook:1,talkSquash:.5},materials:{feather:{color:"#f4a63c",f0:.03,spec:.22,shininess:14,rim:.9,sheen:.55},wing:{color:"#d8692a",shadeOf:"feather",f0:.03,spec:.25,shininess:16,rim:.8,sheen:.5},beak:{color:"#ff7a45",f0:.05,spec:.9,shininess:70,rim:.4,gloss:.6},feet:{color:"#e9683b",f0:.04,spec:.6,shininess:40,rim:.3},mouth:{color:"#6b1a26",f0:.04,spec:.6,shininess:40,rim:0},tongue:{color:"#ff7f91",f0:.05,spec:1,shininess:60,rim:.2,gloss:.6}},bones:[{name:"body",pivot:[0,0,0],drive:{rz:[["roll",.3]],rx:[["pitch",-0.12]]}},{name:"head",parent:"body",pivot:[0,.62,0],drive:{rx:[["pitch",-1]],ry:[["yaw",.9]],rz:[["roll",.8]]}},{name:"beak",parent:"head",pivot:[0,.14,.33],drive:{rx:[["talk",-0.24]]}},{name:"jaw",parent:"head",pivot:[0,.14,.33],drive:{rx:[["talk",.8]]}},{name:"tuft",parent:"head",pivot:[0,.5,.04],rest:{rx:.25},jiggle:{axis:[0,1,0],length:.14,freq:3,damping:.14}},{name:"wingL",parent:"body",pivot:[-0.38,.6,-0.02],drive:{rz:[["flap",-1.5]]},wave:{rz:[.04,.8,0]},jiggle:{axis:[0,-1,0],length:.3,freq:3.2,damping:.3,maxAngle:.5}},{name:"wingR",parent:"body",pivot:[.38,.6,-0.02],drive:{rz:[["flap",1.5]]},wave:{rz:[-0.04,.8,1.1]},jiggle:{axis:[0,-1,0],length:.3,freq:3.2,damping:.3,maxAngle:.5}},{name:"tail",parent:"body",pivot:[0,.3,-0.36],rest:{rx:-0.95},jiggle:{axis:[0,1,0],length:.18,freq:2.6,damping:.18}}],parts:[{bone:"body",shape:"ellipsoid",at:[0,.42,0],radii:[.45,.41,.42],material:"feather"},{bone:"head",shape:"sphere",at:[0,.18,.03],radius:.35,blend:.18,material:"feather"},{bone:"head",shape:"ellipsoid",at:[0,.14,.37],radii:[.05,.03,.035],material:"mouth"},{bone:"beak",shape:"ellipsoid",at:[0,0,.06],rot:[.12,0,0],radii:[.076,.056,.1],clip:{normal:[0,-1,0]},material:"beak"},{bone:"beak",shape:"ellipsoid",at:[0,0,.06],rot:[.12,0,0],radii:[.064,.048,.088],clip:{normal:[0,-1,0],offset:.003},material:"mouth"},{bone:"jaw",shape:"ellipsoid",at:[0,0,.045],radii:[.064,.04,.08],clip:{normal:[0,1,0]},material:"beak"},{bone:"jaw",shape:"ellipsoid",at:[0,0,.045],radii:[.053,.032,.068],clip:{normal:[0,1,0],offset:.003},material:"mouth"},{bone:"jaw",shape:"ellipsoid",at:[0,.002,.04],radii:[.034,.01,.042],material:"tongue"},{bone:"tuft",shape:"roundCone",from:[0,-0.04,0],to:[.015,.12,.03],r1:.045,r2:.01,blend:.03,material:"feather"},{bone:"tuft",shape:"roundCone",from:[0,-0.04,-0.02],to:[-0.05,.08,-0.05],r1:.035,r2:.008,blend:.03,material:"feather"},{bone:"tuft",shape:"roundCone",from:[0,-0.04,-0.02],to:[.06,.07,-0.04],r1:.03,r2:.008,blend:.03,material:"feather"},{bone:"wingL",shape:"ellipsoid",at:[-0.02,-0.17,0],rot:[0,0,-0.18],radii:[.08,.23,.2],blend:.02,material:"wing"},{bone:"wingR",shape:"ellipsoid",at:[.02,-0.17,0],rot:[0,0,.18],radii:[.08,.23,.2],blend:.02,material:"wing"},{bone:"tail",shape:"ellipsoid",at:[0,.1,0],radii:[.14,.12,.035],blend:.04,material:"wing"},{bone:"root",shape:"capsule",from:[-0.15,.03,.12],to:[-0.2,.025,.25],radius:.026,material:"feet"},{bone:"root",shape:"capsule",from:[-0.15,.03,.12],to:[-0.12,.025,.26],radius:.026,material:"feet"},{bone:"root",shape:"capsule",from:[-0.15,.03,.12],to:[-0.15,.06,.02],radius:.03,blend:.02,material:"feet"},{bone:"root",shape:"capsule",from:[.15,.03,.12],to:[.2,.025,.25],radius:.026,material:"feet"},{bone:"root",shape:"capsule",from:[.15,.03,.12],to:[.12,.025,.26],radius:.026,material:"feet"},{bone:"root",shape:"capsule",from:[.15,.03,.12],to:[.15,.06,.02],radius:.03,blend:.02,material:"feet"}],paints:[{bone:"body",on:["feather"],kind:"ellipse",at:[0,.3,0],radii:[.29,.28],color:"#fde7c0",soft:.07},{bone:"head",on:["feather"],kind:"sphere",at:[-0.22,.08,.27],radius:.075,color:"#ff8c8c",soft:.6,opacity:.75},{bone:"head",on:["feather"],kind:"sphere",at:[.22,.08,.27],radius:.075,color:"#ff8c8c",soft:.6,opacity:.75}],eyes:{kind:"ball",bone:"head",at:[[-0.14,.24,.3],[.14,.24,.3]],radius:.078,iris:"#4a2a12",irisSize:.72,pupilSize:.42,lid:"feather"},anchors:{top:{bone:"head",at:[.14,.5,.1]},mouth:{bone:"head",at:[0,.13,.47]},ear:{bone:"head",at:[-0.32,.22,0]},feet:{bone:"root",at:[0,.02,.12]},chest:{bone:"body",at:[0,.45,.32]}},acting:{idle:{tail:{rx:[0,.14,1.3,0]}},thinking:{wingR:{rz:1.05,rx:-0.95,ry:-0.35},tuft:{rx:.25},tail:{rx:[0,.08,.5,0]}},listening:{wingL:{rz:-1.1,rx:-0.55},tuft:{rx:-0.4},head:{rz:.12}},speaking:{head:{rx:[-0.14,.05,1.1,0]},wingL:{rz:[-0.18,.14,2.3,0]},wingR:{rz:[.18,.14,2.3,1.2]},tail:{rx:[0,.22,2.3,.5]}},sleeping:{wingL:{ry:.5,rz:.12},wingR:{ry:-0.5,rz:-0.12},tuft:{rx:.75}},working:{wingL:{rz:[-0.4,.18,6,0],rx:-0.6},wingR:{rz:[.4,.18,6,Math.PI],rx:-0.6},head:{rx:[.1,.07,5.2,0]}},error:{wingL:{rz:[-1,.1,12,0]},wingR:{rz:[1,.1,12,1]},tuft:{rx:-0.5},tail:{rx:-0.45}},surprised:{wingL:{rz:-1.7},wingR:{rz:1.7},tuft:{rx:-0.6},tail:{rx:-0.5}},celebrating:{wingL:{rz:[-1.4,.5,9,0]},wingR:{rz:[1.4,.5,9,0]},tail:{rx:[0,.3,6,0]},tuft:{rx:[0,.25,6,0]}},sad:{wingL:{rz:.25},wingR:{rz:-0.25},tuft:{rx:.9},tail:{rx:.5}},happy:{wingL:{rz:[-0.9,.75,7,0]},wingR:{rz:[.9,.75,7,0]},tail:{rx:[0,.3,5,0]},tuft:{rx:[0,.2,5,0]}}},fx:{replace:["syllable"],syllable:[{glyph:"note",anchor:"mouth",rate:1,offset:[.12,-0.03,.02],velocity:[.2,.13,.05],jitter:.06,wobble:.07,life:[1.1,1.5],size:[.045,.075],rotation:-0.15,color:"#f08a3c"}],happy:[{glyph:"note",anchor:"mouth",rate:1.6,velocity:[0,.24,.05],jitter:.25,wobble:.07,life:[1,1.3],size:[.04,.07],rotation:.15,color:"#e8664a"}],"enter:happy":[{glyph:"feather",anchor:"chest",rate:4,spread:.12,velocity:[0,.18,.12],jitter:.45,gravity:.12,drag:1.4,wobble:.14,life:[1.8,2.4],size:[.05,.05],spin:1.6,color:"#f6b04a"}]}};var $e=[{parent:"head",at:[0,.43,.05],tilt:-0.1,size:.075},{parent:"head",at:[0,.41,-0.1],tilt:-0.5,size:.09},{parent:"head",at:[0,.3,-0.24],tilt:-1,size:.085},{parent:"body",at:[0,.5,-0.24],tilt:-1.2,size:.08},{parent:"body",at:[0,.34,-0.3],tilt:-1.45,size:.07},{parent:"tail0",at:[0,.12,.07],tilt:0,size:.06},{parent:"tail1",at:[0,.1,.05],tilt:0,size:.045}],qe={id:"rex",name:"Rex",tagline:"A baby T. rex with pebbly scales, wobbly back spikes, tiny arms and a wagging tail",accent:"#4fb86a",frame:{target:.52,radius:.76},bound:{y:.46,radius:.86},motion:{hop:.15,squash:1.15,snap:1.05,talkSquash:.35},materials:{hide:{color:"#78cf7f",f0:.04,spec:.7,shininess:40,rim:.7,gloss:.35,sss:.2,sssColor:"#c8ffb0",surface:{kind:"scales",scale:24,strength:.5,color:"#4b9f5d",bone:"head"}},bodyHide:{color:"#78cf7f",shadeOf:"hide",f0:.04,spec:.7,shininess:40,rim:.7,gloss:.35,sss:.2,sssColor:"#c8ffb0",surface:{kind:"scales",scale:24,strength:.5,color:"#4b9f5d"}},belly:{color:"#fff0c4",f0:.04,spec:.5,shininess:30,rim:.5,gloss:.3,sss:.25,sssColor:"#fff6d8"},spike:{color:"#ff9b4a",f0:.05,spec:.9,shininess:60,rim:.5,gloss:.5,sss:.35,sssColor:"#ffc58f"},claw:{color:"#fff6e2",f0:.05,spec:1,shininess:80,rim:.3,gloss:.6}},bones:[{name:"body",pivot:[0,0,0],drive:{ry:[["yaw",.25]],rz:[["roll",.3]]}},{name:"head",parent:"body",pivot:[0,.56,.06],drive:{rx:[["pitch",-1]],ry:[["yaw",.8]],rz:[["roll",.7]]}},{name:"armL",parent:"body",pivot:[-0.15,.42,.25],rest:{rx:-0.6},drive:{rx:[["flap",-0.9]],rz:[["flap",-0.5]]}},{name:"armR",parent:"body",pivot:[.15,.42,.25],rest:{rx:-0.6},drive:{rx:[["flap",-0.9]],rz:[["flap",.5]]}},{name:"tail0",parent:"body",pivot:[.08,.17,-0.24],rest:{rx:-1.25,rz:-0.6},wave:{rz:[.2,.5,0]},jiggle:{axis:[0,1,0],length:.18,freq:2.2,damping:.25,maxAngle:.6}},{name:"tail1",parent:"tail0",pivot:[0,.18,0],rest:{rx:.2},wave:{rz:[.2,.5,.8]},jiggle:{axis:[0,1,0],length:.15,freq:2,damping:.22,maxAngle:.7}},{name:"tail2",parent:"tail1",pivot:[0,.15,0],rest:{rx:.15},wave:{rz:[.25,.5,1.6]},jiggle:{axis:[0,1,0],length:.12,freq:1.8,damping:.2,maxAngle:.8}},...$e.map(({parent:a,at:e,tilt:t},r)=>({name:`spike${r}`,parent:a,pivot:e,rest:{rx:t},jiggle:{axis:[0,1,0],length:.08,freq:4+r*.3,damping:.12,maxAngle:.45}}))],parts:[{bone:"body",shape:"ellipsoid",at:[0,.3,-0.02],radii:[.3,.3,.28],material:"bodyHide"},{bone:"body",shape:"ellipsoid",at:[-0.19,.15,-0.02],radii:[.13,.15,.17],blend:.08,material:"bodyHide"},{bone:"body",shape:"ellipsoid",at:[.19,.15,-0.02],radii:[.13,.15,.17],blend:.08,material:"bodyHide"},...[-1,1].flatMap(a=>[{bone:"body",shape:"ellipsoid",at:[a*.2,.045,.1],radii:[.1,.05,.13],blend:.05,material:"bodyHide"},...[-1,0,1].map(e=>({bone:"body",shape:"ellipsoid",at:[a*.2+e*.05,.03,.225-Math.abs(e)*.015],radii:[.022,.022,.026],blend:.012,material:"claw"}))]),{bone:"head",shape:"ellipsoid",at:[0,.2,-0.02],radii:[.29,.25,.27],blend:.12,material:"hide"},{bone:"head",shape:"ellipsoid",at:[0,.1,.17],radii:[.23,.14,.18],blend:.1,material:"hide"},{bone:"head",shape:"sphere",at:[-0.047,.162,.322],radius:.014,op:"sub",blend:.01,material:"hide"},{bone:"head",shape:"sphere",at:[.047,.162,.322],radius:.014,op:"sub",blend:.01,material:"hide"},...[["armL",-1],["armR",1]].flatMap(([a,e])=>[{bone:a,shape:"capsule",from:[0,0,0],to:[e*.01,-0.1,.03],radius:.042,blend:.04,material:"bodyHide"},{bone:a,shape:"sphere",at:[e*-0.014,-0.135,.05],radius:.015,blend:.01,material:"claw"},{bone:a,shape:"sphere",at:[e*.02,-0.135,.045],radius:.015,blend:.01,material:"claw"}]),{bone:"tail0",shape:"roundCone",from:[0,0,0],to:[0,.18,0],r1:.12,r2:.09,blend:.06,material:"bodyHide"},{bone:"tail1",shape:"roundCone",from:[0,0,0],to:[0,.15,0],r1:.09,r2:.06,blend:.03,material:"bodyHide"},{bone:"tail2",shape:"roundCone",from:[0,0,0],to:[0,.12,0],r1:.06,r2:.03,blend:.03,material:"bodyHide"},...$e.map(({size:a},e)=>({bone:`spike${e}`,shape:"roundCone",from:[0,-0.02,0],to:[0,a*1.1,0],r1:a*.65,r2:a*.15,blend:.025,material:"spike"}))],paints:[{bone:"body",on:["bodyHide"],kind:"ellipse",at:[0,.24,.08],radii:[.16,.2],color:"#fff0c4",soft:.2},{bone:"head",on:["hide"],kind:"ellipse",at:[0,-0.01,.15],radii:[.17,.06],color:"#fff0c4",soft:.35},{bone:"head",on:["hide"],kind:"sphere",at:[-0.2,.12,.24],radius:.055,color:"#ff9a9a",soft:.6,opacity:.7},{bone:"head",on:["hide"],kind:"sphere",at:[.2,.12,.24],radius:.055,color:"#ff9a9a",soft:.6,opacity:.7},...[[-0.083,.204,.289],[-0.109,.181,.297],[.083,.204,.289],[.109,.181,.297]].map(([a,e,t])=>({bone:"head",on:["hide"],kind:"sphere",at:[a,e,t],radius:.009,color:"#3f8a4f",soft:.3}))],eyes:{kind:"ball",bone:"head",at:[[-0.13,.26,.19],[.13,.26,.19]],radius:.085,iris:"#e0942f",irisSize:.78,pupilSize:.46,pupilAspect:.75,lid:"hide"},face:{kind:"mouth",bone:"head",on:["hide"],at:[0,.06,.34],width:.1,color:"#5b1f2b",tongue:"#ff7f93"},anchors:{top:{bone:"head",at:[.16,.44,.06]},mouth:{bone:"head",at:[0,.06,.37]},ear:{bone:"head",at:[-0.3,.22,0]},feet:{bone:"root",at:[0,.02,.15]},tail:{bone:"tail2",at:[0,.12,0]}},acting:{idle:{tail0:{rz:[-0.6,.12,.45,0]}},thinking:{armR:{rx:[-1.3,.08,2.5,0],rz:.3},tail2:{rx:[.15,.3,1.4,0]}},listening:{armL:{rx:-1.1,rz:-0.6},tail0:{rz:-0.4}},speaking:{armL:{rx:[-0.6,.25,1.6,0]},armR:{rx:[-0.6,.25,1.6,2]},tail0:{rz:[-0.6,.18,.9,0]}},sleeping:{armL:{rx:.1,rz:.2},armR:{rx:.1,rz:-0.2},tail0:{rz:-1.3,rx:-1},tail1:{rx:.4}},working:{armL:{rx:[-0.9,.15,7,0]},armR:{rx:[-0.9,.15,7,Math.PI]},head:{rx:.12},tail2:{rx:[.15,.2,2,0]}},error:{armL:{rx:[-1.6,.35,9,0],rz:-0.4},armR:{rx:[-1.6,.35,9,1.4],rz:.4},tail0:{rz:[-0.5,.06,12,0],rx:-1.45},spike1:{rx:-0.2},spike2:{rx:-0.6},spike3:{rx:-0.8}},surprised:{armL:{rx:-1.9,rz:-0.6},armR:{rx:-1.9,rz:.6},tail0:{rx:-1.5}},celebrating:{armL:{rx:[-2.2,.3,4,0],rz:-0.5},armR:{rx:[-2.2,.3,4,Math.PI],rz:.5},tail0:{rz:[-0.6,.55,3,0]}},sad:{armL:{rx:.2},armR:{rx:.2},tail0:{rx:-0.95,rz:-0.4},tail1:{rx:.35}},happy:{armL:{rx:[-1.4,.4,6,0]},armR:{rx:[-1.4,.4,6,1.4]},tail0:{rz:[-0.6,.5,4,0]}}},fx:{"enter:surprised":[{glyph:"arc",anchor:"mouth",rate:3,offset:[.08,0,.05],mirror:true,velocity:[.3,.05,.1],jitter:.04,life:[.5,.6],size:[.04,.11],color:"#7fd18a"}]}};var Ae={id:"swirl",name:"Swirl",tagline:"A slow, sweet snail carrying a glazed cinnamon roll for a shell",accent:"#c27a3e",frame:{target:.38,radius:.59},bound:{y:.35,radius:.6},motion:{hop:.03,squash:1.4,snap:.7,talkSquash:.6},materials:{skin:{color:"#b9d97a",f0:.06,spec:1.4,shininess:110,rim:.7,sss:.45,sssColor:"#e6ffb0",gloss:.8,surface:{kind:"ripple",scale:18,strength:.25}},dough:{color:"#d9944f",f0:.03,spec:.5,shininess:30,rim:.5,sheen:.3},cinnamon:{color:"#8a4b22",shadeOf:"dough",f0:.03,spec:.5,shininess:30,rim:.4},glaze:{color:"#fff4e4",f0:.08,spec:1.6,shininess:160,rim:.6,sss:.4,sssColor:"#ffffff",gloss:.9},bead:{color:"#1a1410",f0:.06,spec:2.2,shininess:400,rim:.2,gloss:1}},bones:[{name:"body",pivot:[0,.053,0],drive:{ry:[["yaw",.3]],rz:[["roll",.3]]},wave:{rz:[.02,.4,0]}},{name:"head",parent:"body",pivot:[.24,.12,.08],drive:{rx:[["pitch",-0.7]],ry:[["yaw",.7]],rz:[["roll",.6]]}},{name:"stalkL",parent:"head",pivot:[-0.06,.3,.02],rest:{rz:.3},jiggle:{axis:[0,1,0],length:.16,freq:2.4,damping:.12}},{name:"stalkR",parent:"head",pivot:[.06,.3,.02],rest:{rz:-0.3},jiggle:{axis:[0,1,0],length:.16,freq:2.4,damping:.12}},{name:"shell",parent:"body",pivot:[-0.08,.12,-0.04],wave:{rz:[.015,.4,1]}}],parts:[{bone:"body",shape:"ellipsoid",at:[0,.07,0],radii:[.42,.08,.2],material:"skin"},{bone:"head",shape:"capsule",from:[0,-0.05,0],to:[0,.2,.02],radius:.13,blend:.08,material:"skin"},{bone:"stalkL",shape:"capsule",from:[0,0,0],to:[0,.14,0],radius:.02,material:"skin"},{bone:"stalkL",shape:"sphere",at:[0,.15,0],radius:.035,material:"skin"},{bone:"stalkR",shape:"capsule",from:[0,0,0],to:[0,.14,0],radius:.02,material:"skin"},{bone:"stalkR",shape:"sphere",at:[0,.15,0],radius:.035,material:"skin"},{bone:"shell",shape:"cylinder",at:[0,.27,0],rot:[Math.PI/2,0,0],radius:.27,half:.13,round:.07,material:"dough"},...[.21,.15,.09].flatMap((a,e)=>[{bone:"shell",shape:"cylinder",at:[.01*e,.27+.01*e,.12],rot:[Math.PI/2,0,0],radius:a,half:.03,round:.02,op:"sub",blend:.015,material:"cinnamon"},{bone:"shell",shape:"cylinder",at:[.01*e,.27+.01*e,.1],rot:[Math.PI/2,0,0],radius:a-.03,half:.03,round:.025,blend:.01,material:"dough"}]),{bone:"shell",shape:"ellipsoid",at:[-0.04,.47,.03],radii:[.2,.06,.15],blend:.03,material:"glaze"}],paints:[{bone:"head",on:["skin"],kind:"sphere",at:[-0.09,.06,.1],radius:.035,color:"#ff9eb0",soft:.6,opacity:.8},{bone:"head",on:["skin"],kind:"sphere",at:[.09,.06,.1],radius:.035,color:"#ff9eb0",soft:.6,opacity:.8}],eyes:{kind:"bead",bone:"head",at:[[-0.055,.14,.128],[.055,.14,.128]],radii:[.026,.038,.018],material:"bead"},face:{kind:"mouth",bone:"head",on:["skin"],at:[0,.05,.14],width:.04,color:"#3d4f1c",tongue:"#ff8a9a"},anchors:{top:{bone:"shell",at:[0,.58,0]},mouth:{bone:"head",at:[0,.05,.16]},ear:{bone:"head",at:[-0.14,.15,0]},feet:{bone:"root",at:[.3,.02,.12]}},acting:{thinking:{head:{rz:.2},stalkL:{rz:.6}},listening:{stalkL:{rx:-0.4},stalkR:{rx:-0.4}},sleeping:{head:{rx:.5},stalkL:{rx:1.1},stalkR:{rx:1.1}},error:{stalkL:{rz:[.3,.3,8,0]},stalkR:{rz:[-0.3,.3,8,1]}},surprised:{stalkL:{rz:.05},stalkR:{rz:-0.05},head:{rx:-0.2}},celebrating:{stalkL:{rz:[.4,.3,4,0]},stalkR:{rz:[-0.4,.3,4,Math.PI]}},sad:{head:{rx:.3},stalkL:{rx:1.2,rz:.5},stalkR:{rx:1.2,rz:-0.5}}}};var Pe={id:"tad",name:"Tad",tagline:"A glossy tree frog with a wet sheen, eyes on top and a throat that puffs as it talks",accent:"#3fae4a",frame:{target:.42,radius:.66},bound:{y:.4,radius:.72},motion:{hop:.26,squash:1.6,snap:1.2,look:.8,talkSquash:.45},materials:{skin:{color:"#5fc24e",f0:.07,spec:2,shininess:260,rim:.7,gloss:.95,sss:.3,sssColor:"#c6ff8f",surface:{kind:"speckle",scale:9,strength:.85,color:"#2f8a3a",bone:"head"}},bodySkin:{color:"#5fc24e",shadeOf:"skin",f0:.07,spec:2,shininess:260,rim:.7,gloss:.95,sss:.3,sssColor:"#c6ff8f",surface:{kind:"speckle",scale:9,strength:.85,color:"#2f8a3a"}},belly:{color:"#f3f0b6",f0:.06,spec:1.6,shininess:200,rim:.5,gloss:.9,sss:.45,sssColor:"#fffbd0"},toe:{color:"#ffb54a",f0:.06,spec:1.4,shininess:160,rim:.4,gloss:.8,sss:.3,sssColor:"#ffd99a"}},bones:[{name:"body",pivot:[0,0,0],drive:{ry:[["yaw",.25]],rz:[["roll",.3]]}},{name:"head",parent:"body",pivot:[0,.3,.02],drive:{rx:[["pitch",-0.8]],ry:[["yaw",.7]],rz:[["roll",.6]]}},{name:"throat",parent:"head",pivot:[0,.02,.12],drive:{rx:[["talk",.9]]}},{name:"armL",parent:"body",pivot:[-0.22,.2,.18],drive:{rz:[["flap",-1.3]],rx:[["flap",-0.4]]}},{name:"armR",parent:"body",pivot:[.22,.2,.18],drive:{rz:[["flap",1.3]],rx:[["flap",-0.4]]}}],parts:[{bone:"body",shape:"ellipsoid",at:[0,.22,-0.03],radii:[.36,.22,.32],material:"bodySkin"},{bone:"body",shape:"ellipsoid",at:[-0.3,.12,-0.04],rot:[0,.25,0],radii:[.13,.11,.22],blend:.09,material:"bodySkin"},{bone:"body",shape:"ellipsoid",at:[.3,.12,-0.04],rot:[0,-0.25,0],radii:[.13,.11,.22],blend:.09,material:"bodySkin"},{bone:"body",shape:"ellipsoid",at:[-0.33,.025,.16],rot:[0,.5,0],radii:[.08,.025,.13],blend:.03,material:"bodySkin"},{bone:"body",shape:"ellipsoid",at:[.33,.025,.16],rot:[0,-0.5,0],radii:[.08,.025,.13],blend:.03,material:"bodySkin"},{bone:"head",shape:"ellipsoid",at:[0,.1,.05],radii:[.38,.19,.31],blend:.14,material:"skin"},{bone:"head",shape:"sphere",at:[-0.19,.24,.1],radius:.13,blend:.07,material:"skin"},{bone:"head",shape:"sphere",at:[.19,.24,.1],radius:.13,blend:.07,material:"skin"},{bone:"throat",shape:"ellipsoid",at:[0,-0.04,.1],radii:[.14,.1,.12],blend:.05,material:"belly"},{bone:"armL",shape:"capsule",from:[0,0,0],to:[-0.03,-0.17,.08],radius:.045,blend:.05,material:"bodySkin"},{bone:"armL",shape:"sphere",at:[-0.07,-0.19,.12],radius:.026,blend:.02,material:"toe"},{bone:"armL",shape:"sphere",at:[-0.02,-0.19,.15],radius:.026,blend:.02,material:"toe"},{bone:"armL",shape:"sphere",at:[.03,-0.19,.13],radius:.026,blend:.02,material:"toe"},{bone:"armR",shape:"capsule",from:[0,0,0],to:[.03,-0.17,.08],radius:.045,blend:.05,material:"bodySkin"},{bone:"armR",shape:"sphere",at:[.07,-0.19,.12],radius:.026,blend:.02,material:"toe"},{bone:"armR",shape:"sphere",at:[.02,-0.19,.15],radius:.026,blend:.02,material:"toe"},{bone:"armR",shape:"sphere",at:[-0.03,-0.19,.13],radius:.026,blend:.02,material:"toe"}],paints:[{bone:"body",on:["bodySkin"],kind:"ellipse",at:[0,.16,.28],radii:[.22,.13],color:"#f3f0b6",soft:.3},{bone:"head",on:["skin"],kind:"ellipse",at:[0,-0.01,.34],radii:[.2,.06],color:"#f3f0b6",soft:.4},{bone:"head",on:["skin"],kind:"sphere",at:[-0.24,.07,.27],radius:.055,color:"#ff8f9c",soft:.6,opacity:.7},{bone:"head",on:["skin"],kind:"sphere",at:[.24,.07,.27],radius:.055,color:"#ff8f9c",soft:.6,opacity:.7}],eyes:{kind:"ball",bone:"head",at:[[-0.19,.27,.15],[.19,.27,.15]],radius:.1,iris:"#e7b93a",irisSize:.74,pupilSize:.36,pupilAspect:1.8,lid:"skin"},face:{kind:"mouth",bone:"head",on:["skin"],at:[0,.06,.34],width:.12,color:"#5a1f2e",tongue:"#ff7b93"},anchors:{top:{bone:"head",at:[.2,.36,.05]},mouth:{bone:"head",at:[0,.05,.37]},ear:{bone:"head",at:[-0.38,.12,0]},feet:{bone:"root",at:[0,.03,.22]}},acting:{idle:{throat:{rx:[0,.12,1.1,0]}},thinking:{armR:{rz:.6,rx:-1.5}},listening:{armL:{rz:-1.6,rx:-0.4}},speaking:{armL:{rx:[-0.25,.2,1.3,0]},armR:{rx:[-0.25,.2,1.3,2]}},sleeping:{armL:{rx:.2},armR:{rx:.2},throat:{rx:[.2,.25,.18,0]}},working:{armL:{rx:[-0.5,.2,7,0]},armR:{rx:[-0.5,.2,7,Math.PI]},throat:{rx:[0,.15,3.5,0]}},error:{armL:{rz:[-1.2,.15,12,0]},armR:{rz:[1.2,.15,12,1]},throat:{rx:.6}},surprised:{armL:{rz:-1.8},armR:{rz:1.8},throat:{rx:.9}},celebrating:{armL:{rz:[-2,.4,4,0]},armR:{rz:[2,.4,4,Math.PI]},throat:{rx:[.4,.4,4,0]}},sad:{armL:{rz:.2,rx:.3},armR:{rz:-0.2,rx:.3}},happy:{armL:{rz:[-1.5,.4,5,0]},armR:{rz:[1.5,.4,5,1]},throat:{rx:[.4,.4,5,0]}}},fx:{replace:["land"],land:[{glyph:"drop",anchor:"feet",rate:8,spread:.2,velocity:[0,.7,.05],jitter:.7,gravity:3.2,life:[.45,.6],size:[.035,.022],color:"#7fd0ff",align:true}],syllable:[{glyph:"bubble",anchor:"mouth",rate:1,offset:[.1,0,.02],velocity:[.08,.18,.05],jitter:.08,wobble:.05,life:[.9,1.2],size:[.016,.036],color:"#a6e8ff"}]}};function Fe(a){let e=a<0?"L":"R";return [{name:`shoulder${e}`,parent:"body",pivot:[.385*a,.47,.02],drive:{rz:[["flap",.5*a]]}},{name:`fore${e}`,parent:`shoulder${e}`,pivot:[0,-0.17,0],jiggle:{axis:[0,-1,0],length:.16,freq:3.2,damping:.35,maxAngle:.3}}]}function je(a){let e=a<0?"L":"R";return [{bone:`shoulder${e}`,shape:"sphere",radius:.074,material:"trim"},{bone:`shoulder${e}`,shape:"capsule",from:[0,-0.02,0],to:[0,-0.15,0],radius:.058,material:"shell"},{bone:`fore${e}`,shape:"sphere",radius:.052,material:"trim"},{bone:`fore${e}`,shape:"capsule",from:[0,-0.02,0],to:[0,-0.12,0],radius:.052,material:"shell"},{bone:`fore${e}`,shape:"sphere",at:[0,-0.175,0],radius:.066,material:"trim"},{bone:`fore${e}`,shape:"sphere",op:"sub",blend:.012,at:[0,-0.235,.012],radius:.036,material:"trim"}]}function Ie(a){let e=a<0?"L":"R";return [{bone:`ear${e}`,shape:"cylinder",rot:[0,0,1.5708],radius:.112,half:.03,round:.018,material:"trim"},{bone:`ear${e}`,shape:"cylinder",at:[.045*a,0,0],rot:[0,0,1.5708],radius:.058,half:.035,round:.018,material:"trim"},{bone:`ear${e}`,shape:"sphere",at:[.035*a,.078,0],radius:.02,material:"metal"},{bone:`ear${e}`,shape:"sphere",at:[.035*a,-0.078,0],radius:.02,material:"metal"}]}var Be={id:"volt",name:"Volt",tagline:"LED face, claw hands, gear ears, a sprung antenna",accent:"#3b63d9",frame:{target:.86,radius:1.02},bound:{y:.86,radius:1.12},motion:{hop:.16,squash:1,snap:1},glowPool:.35,materials:{shell:{color:"#2f56c4",f0:.05,spec:.7,shininess:70,rim:.55,gloss:.55},trim:{color:"#c3cce3",f0:.07,spec:.8,shininess:90,metal:.25,rim:.4,gloss:.5},metal:{color:"#8f98ae",f0:.45,spec:1,shininess:120,metal:.85,rim:.3,gloss:.7},rubber:{color:"#151a28",f0:.03,spec:.15,shininess:12,rim:.2},screen:{color:"#03060c",f0:.045,spec:1.6,shininess:260,rim:.1,gloss:1},bulb:{color:"#f2f5ff",f0:.04,spec:.6,shininess:40,rim:.3,glows:true,emitStrength:1.4,sss:.4,sssColor:"#ffffff"},lamp:{color:"#e9eeff",f0:.05,spec:1,shininess:80,glows:true,emitStrength:1.1,gloss:.9},ring:{color:"#d8e4ff",f0:.04,spec:.4,shininess:30,glows:true,emitStrength:1.6}},bones:[{name:"body",pivot:[0,0,0],drive:{ry:[["yaw",.2]],rz:[["roll",.25]]}},{name:"head",parent:"body",pivot:[0,.64,0],drive:{rx:[["pitch",-1]],ry:[["yaw",.8]],rz:[["roll",.75]]}},{name:"antenna",parent:"head",pivot:[0,.755,0],jiggle:{axis:[0,1,0],length:.26,freq:2.3,damping:.11}},{name:"earL",parent:"head",pivot:[-0.585,.37,0]},{name:"earR",parent:"head",pivot:[.585,.37,0]},...Fe(-1),...Fe(1)],parts:[{bone:"body",shape:"roundBox",at:[0,.32,0],half:[.35,.27,.28],round:.22,material:"shell"},{bone:"body",shape:"roundBox",at:[0,.38,.27],half:[.15,.08,.03],round:.06,material:"rubber"},{bone:"body",shape:"sphere",at:[0,.38,.285],radius:.04,material:"lamp"},{bone:"body",shape:"plate",op:"sub",blend:.006,at:[0,.225,.3],half:[.075,.009],corner:.009,depth:.03,material:"shell"},{bone:"body",shape:"plate",op:"sub",blend:.006,at:[0,.19,.295],half:[.075,.009],corner:.009,depth:.03,material:"shell"},{bone:"body",shape:"plate",op:"sub",blend:.006,at:[0,.155,.27],half:[.06,.009],corner:.009,depth:.03,material:"shell"},{bone:"body",shape:"roundBox",at:[-0.17,.035,.05],half:[.11,.035,.14],round:.035,material:"trim"},{bone:"body",shape:"roundBox",at:[.17,.035,.05],half:[.11,.035,.14],round:.035,material:"trim"},{bone:"body",shape:"cylinder",at:[0,.62,0],radius:.075,half:.06,round:.02,material:"metal"},{bone:"head",shape:"roundBox",at:[0,.37,0],half:[.56,.37,.35],round:.17,material:"shell"},{bone:"head",shape:"roundBox",op:"sub",blend:.035,at:[0,.37,.41],half:[.45,.28,.1],round:.12,material:"shell"},{bone:"head",shape:"plate",at:[0,.37,.31],half:[.45,.28],corner:.12,depth:.012,material:"screen"},{bone:"head",shape:"cylinder",at:[-0.555,.37,0],rot:[0,0,1.5708],radius:.122,half:.012,round:.006,material:"ring"},{bone:"head",shape:"cylinder",at:[.555,.37,0],rot:[0,0,1.5708],radius:.122,half:.012,round:.006,material:"ring"},...Ie(-1),...Ie(1),{bone:"head",shape:"cylinder",at:[0,.745,0],radius:.065,half:.025,round:.012,material:"trim"},{bone:"antenna",shape:"capsule",from:[0,0,0],to:[0,.2,0],radius:.016,material:"metal"},{bone:"antenna",shape:"sphere",at:[0,.25,0],radius:.055,material:"bulb"},...je(-1),...je(1)],face:{kind:"screen",bone:"head",material:"screen",center:[0,.37],half:[.44,.27],corner:.11,cell:.034,color:"#c4ecff"},anchors:{top:{bone:"head",at:[.3,.78,.1]},mouth:{bone:"head",at:[0,.22,.34]},ear:{bone:"head",at:[-0.66,.37,0]},feet:{bone:"root",at:[0,.02,.06]},antenna:{bone:"antenna",at:[0,.25,0]}},acting:{idle:{shoulderL:{rz:[-0.08,.04,.45,0],rx:[0,.06,.35,1]},shoulderR:{rz:[.08,.04,.45,1.6],rx:[0,.06,.35,2.4]},foreL:{rx:-0.25},foreR:{rx:-0.25}},thinking:{shoulderR:{rx:-1.5,ry:-0.8,rz:-0.1},foreR:{rx:[-0.95,.1,1.8,0]},shoulderL:{rx:-1,ry:.8,rz:-0.3},foreL:{rx:-0.8},earL:{rx:[0,0,0,0,5]},earR:{rx:[0,0,0,0,-5]}},listening:{shoulderL:{rx:.1,ry:.3,rz:-2.8},foreL:{rx:-0.6},shoulderR:{rz:.14,rx:.05},foreR:{rx:-0.3},earL:{rx:[.3,.15,.8,0]}},speaking:{shoulderL:{rx:[-0.55,.32,.72,0],rz:[-0.28,.12,.5,0]},foreL:{rx:[-0.85,.38,1.44,.6]},shoulderR:{rx:[-0.45,.32,.72,2.2],rz:[.28,.12,.5,1]},foreR:{rx:[-0.95,.38,1.44,2.8]},earL:{rx:[0,0,0,0,1.4]},earR:{rx:[0,0,0,0,-1.4]}},sleeping:{shoulderL:{rz:-0.03,rx:-0.3},shoulderR:{rz:.03,rx:-0.3},foreL:{rx:-0.4},foreR:{rx:-0.4}},working:{shoulderL:{rx:-0.85,rz:-0.12},shoulderR:{rx:-0.85,rz:.12},foreL:{rx:[-0.95,.2,6,0]},foreR:{rx:[-0.95,.2,6,Math.PI]},earL:{rx:[0,0,0,0,3]},earR:{rx:[0,0,0,0,-3]}},error:{shoulderL:{rz:[-0.95,.1,11,0],rx:-0.2},shoulderR:{rz:[.95,.1,11,1],rx:-0.2},foreL:{rx:-1.1},foreR:{rx:-1.1}},surprised:{shoulderL:{rz:-1.55,rx:-0.3},shoulderR:{rz:1.55,rx:-0.3},foreL:{rx:-0.35},foreR:{rx:-0.35}},celebrating:{shoulderL:{rz:[-2.55,.28,4,0]},shoulderR:{rz:[2.55,.28,4,Math.PI]},foreL:{rz:[.2,.4,8,0]},foreR:{rz:[-0.2,.4,8,Math.PI]},earL:{rx:[0,0,0,0,12]},earR:{rx:[0,0,0,0,-12]}},sad:{shoulderL:{rz:.04,rx:.22},shoulderR:{rz:-0.04,rx:.22},foreL:{rx:-0.05},foreR:{rx:-0.05}},happy:{shoulderL:{rz:[-2.5,.22,2.2,0]},foreL:{rz:[.1,.5,4.2,0]},shoulderR:{rz:[2.5,.22,2.2,1.5]},foreR:{rz:[-0.1,.5,4.2,2]},earL:{rx:[0,0,0,0,10]},earR:{rx:[0,0,0,0,-10]}}},fx:{replace:["syllable"],syllable:[{glyph:"arc",anchor:"mouth",rate:2,offset:[.5,.1,-0.1],mirror:true,velocity:[.26,.02,.02],jitter:.02,life:[.55,.7],size:[.04,.1],rotation:0,color:"#6aaee6"}],thinking:[{glyph:"ring",anchor:"antenna",rate:1.3,velocity:[0,.02,0],life:[.9,1.1],size:[.03,.17],color:"#ffb347",glow:true}],listening:[{glyph:"ring",anchor:"antenna",rate:1.1,velocity:[0,0,0],life:[1,1.2],size:[.2,.03],color:"#62e39a",glow:true}],land:[{glyph:"spark",anchor:"feet",rate:6,spread:.12,velocity:[0,.6,0],jitter:1.1,gravity:3,life:[.25,.42],size:[.035,.02],color:"#ffd27a",glow:true,align:true}],"enter:happy":[{glyph:"spark",anchor:"antenna",rate:8,velocity:[0,.5,0],jitter:1.4,gravity:2,life:[.3,.5],size:[.04,.02],color:"#ffe08a",glow:true,align:true}]}};var pa=[Be,Ee,Le,de,ze,Me,Pe,Ce,qe,Re],ca=[ue,me,Se,fe,Ae,ge,be,he,ce,xe],Te=[...pa,...ca];var ha=new Map(Te.map(a=>[a.id,a])),da=a=>typeof a=="string"?ha.get(a):a;function Rr({character:a,state:e,status:t,palette:r,onPoke:o,onReady:i,className:s,style:n,...l}){let d=useRef(null),h=useRef(null),p=da(a),f=useRef(o),m=useRef(i);return f.current=o,m.current=i,useEffect(()=>{if(!d.current||!p)return;let b=new Q(d.current.appendChild(document.createElement("canvas")),p,{...l,state:t?"idle":e,palette:r});b.canvas.style.cssText="display:block;width:100%;height:100%";let v=b.on("poke",()=>f.current?.()),k=b.on("ready",()=>m.current?.());return h.current=b,()=>{v(),k(),b.dispose(),b.canvas.remove(),h.current=null;}},[p]),useEffect(()=>{h.current&&t&&$0(h.current,t);},[t]),useEffect(()=>{h.current&&e&&!t&&h.current.setState(e);},[e,t]),useEffect(()=>{h.current?.setPalette(r);},[JSON.stringify(r)]),jsx("div",{ref:d,className:s,style:{width:160,height:160,...n}})}export{Rr as Mascot};
|