@norbert_bodziony/bloub 0.3.0 → 0.6.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.
Files changed (66) hide show
  1. package/README.md +32 -5
  2. package/dist/package/assets/boule.webp +0 -0
  3. package/dist/package/assets/cloe-corps.webp +0 -0
  4. package/dist/package/assets/cloe-oeil0-x.webp +0 -0
  5. package/dist/package/assets/cloe-oeil0-y.webp +0 -0
  6. package/dist/package/assets/cloe-oeil1-x.webp +0 -0
  7. package/dist/package/assets/cloe-oeil1-y.webp +0 -0
  8. package/dist/package/assets/forme-capsule.webp +0 -0
  9. package/dist/package/assets/forme-carre.webp +0 -0
  10. package/dist/package/assets/forme-cercle.webp +0 -0
  11. package/dist/package/assets/forme-galet.webp +0 -0
  12. package/dist/package/assets/forme-goutte.webp +0 -0
  13. package/dist/package/assets/forme-hexagone.webp +0 -0
  14. package/dist/package/assets/forme-losange.webp +0 -0
  15. package/dist/package/assets/forme-nuage.webp +0 -0
  16. package/dist/package/assets/forme-pentagone.webp +0 -0
  17. package/dist/package/assets/forme-squircle.webp +0 -0
  18. package/dist/package/assets/forme-triangle.webp +0 -0
  19. package/dist/package/assets/fred-corps.webp +0 -0
  20. package/dist/package/assets/fred-oeil0-x.webp +0 -0
  21. package/dist/package/assets/fred-oeil0-y.webp +0 -0
  22. package/dist/package/assets/fred-oeil1-x.webp +0 -0
  23. package/dist/package/assets/fred-oeil1-y.webp +0 -0
  24. package/dist/package/assets/malu-corps.webp +0 -0
  25. package/dist/package/assets/malu-oeil0-x.webp +0 -0
  26. package/dist/package/assets/malu-oeil0-y.webp +0 -0
  27. package/dist/package/assets/malu-oeil1-x.webp +0 -0
  28. package/dist/package/assets/malu-oeil1-y.webp +0 -0
  29. package/dist/package/assets/nexo-corps.webp +0 -0
  30. package/dist/package/assets/nexo-oeil0-x.webp +0 -0
  31. package/dist/package/assets/nexo-oeil0-y.webp +0 -0
  32. package/dist/package/assets/nexo-oeil1-x.webp +0 -0
  33. package/dist/package/assets/nexo-oeil1-y.webp +0 -0
  34. package/dist/package/assets/vita-corps.webp +0 -0
  35. package/dist/package/assets/vita-oeil0-x.webp +0 -0
  36. package/dist/package/assets/vita-oeil0-y.webp +0 -0
  37. package/dist/package/assets/vita-oeil1-x.webp +0 -0
  38. package/dist/package/assets/vita-oeil1-y.webp +0 -0
  39. package/dist/package/assets/yoshi-corps.webp +0 -0
  40. package/dist/package/assets/yoshi-oeil0-x.webp +0 -0
  41. package/dist/package/assets/yoshi-oeil0-y.webp +0 -0
  42. package/dist/package/assets/yoshi-oeil1-x.webp +0 -0
  43. package/dist/package/assets/yoshi-oeil1-y.webp +0 -0
  44. package/dist/package/chunks/BloubBot-_XolrDe1.js +2226 -0
  45. package/dist/package/chunks/BloubBot-server-V9r0a_k-.js +1 -0
  46. package/dist/package/index.js +2 -2115
  47. package/dist/package/plush-server.js +1 -0
  48. package/dist/package/plush.js +1202 -0
  49. package/dist/package/server.js +1 -1
  50. package/dist/package/types/bot/engine.d.ts +57 -1
  51. package/dist/package/types/bot/skins.d.ts +1 -1
  52. package/dist/package/types/bot/states.d.ts +2 -0
  53. package/dist/package/types/components/BloubBot.d.ts +48 -1
  54. package/dist/package/types/index.d.ts +1 -1
  55. package/dist/package/types/plush/PlushBot.d.ts +64 -0
  56. package/dist/package/types/plush/assets.d.ts +1 -0
  57. package/dist/package/types/plush/body.d.ts +28 -0
  58. package/dist/package/types/plush/catalogue.d.ts +56 -0
  59. package/dist/package/types/plush/index.d.ts +5 -0
  60. package/dist/package/types/plush/layer.d.ts +36 -0
  61. package/dist/package/types/plush/motion.d.ts +236 -0
  62. package/dist/package/types/plush/slices.d.ts +49 -0
  63. package/dist/package/types/plush/tint.d.ts +27 -0
  64. package/dist/package/types/plush/transition.d.ts +33 -0
  65. package/dist/package/types/plush/warp.d.ts +10 -0
  66. package/package.json +13 -2
@@ -1 +1 @@
1
- import{Dynamic as e,escape as t,mergeProps as n,ssr as r,ssrAttribute as i,ssrClassName as a,ssrGroup as o,ssrHydrationKey as s,ssrStyle as c}from"@solidjs/web";import{For as l,Show as u,createEffect as d,createMemo as f,createSignal as p,createUniqueId as m,onCleanup as h,onSettled as g,untrack as _}from"solid-js";var v=Math.PI*2,y=(e,t=0,n=1)=>e<t?t:e>n?n:e,b=(e,t,n)=>e+(t-e)*n,x={easeOutCubic:e=>1-(1-e)**3,easeInOutCubic:e=>e<.5?4*e**3:1-(-2*e+2)**3/2,easeOutQuint:e=>1-(1-e)**5};function S(e,t,n=0){let r=e/t*v;return .55*Math.sin(r+n)+.3*Math.sin(2*r+n*1.7+1.1)+.15*Math.sin(3*r+n*2.3+2.4)}function C(e){let t=e>>>0;return()=>{t=t+1831565813>>>0;let e=Math.imul(t^t>>>15,1|t);return e=e+Math.imul(e^e>>>7,61|e)^e,((e^e>>>14)>>>0)/4294967296}}var w=e=>Math.round(e*100)/100;function ee(e,t=.55,n=.62){let r=(e%360+360)%360,i=(1-Math.abs(2*n-1))*t,a=i*(1-Math.abs(r/60%2-1)),o=n-i/2,[s,c,l]=r<60?[i,a,0]:r<120?[a,i,0]:r<180?[0,i,a]:r<240?[0,a,i]:r<300?[a,0,i]:[i,0,a],u=e=>Math.round((e+o)*255).toString(16).padStart(2,`0`);return`#${u(s)}${u(c)}${u(l)}`}function te(e,t,n,r,i=1){let a=e.phase+t*e.speed*v,o=Math.cos(e.tilt),s=Math.sin(e.tilt),c=Math.sqrt(Math.max(0,1-e.k*e.k)),l=e.sweep*v,u=``,d=``,f=null;for(let t=0;t<=64;t++){let r=a+t/64*l,i=Math.cos(r),p=Math.sin(r),m=e.a*(i*o+p*-s*e.k)+e.cx,h=e.a*(i*s+p*o*e.k)+e.cy,g=e.a*p*c<0,_=w(m*n),v=w(h*n),y=g===f?`L`:`M`;g?d+=`${y}${_} ${v}`:u+=`${y}${_} ${v}`,f=g}let p=Math.cos(e.tilt)*e.a*n,m=Math.sin(e.tilt)*e.a*n;return{id:r,front:u,back:d,width:e.width*n,opacity:i,grad:{x1:w(e.cx*n-p),y1:w(e.cy*n-m),x2:w(e.cx*n+p),y2:w(e.cy*n+m),stops:[ee(e.hue),ee(e.hue+e.hueSpan*.5),ee(e.hue+e.hueSpan)]}}}var T=C(659918),E=Array.from({length:6},(e,t)=>({a:1.3+T()*.1,k:.05+T()*.4,tilt:t/6*Math.PI+T()*.5,speed:3+T()*.7,phase:T()*v,sweep:.6+T()*.25,hue:t*360/6+T()*30,hueSpan:60+T()*60,width:.05+T()*.012,cx:0,cy:.1})),ne=Array.from({length:4},(e,t)=>({a:.78+t*.2,k:.05+t*.02,tilt:-.62+t*.05,speed:.3,phase:.06*t,sweep:.4,hue:95+t*62,hueSpan:100,width:.05,cx:0,cy:-.12})),re=[-.557,-.013,.532],D=.165,ie=1.25,O=C(48879),ae=Array.from({length:5},(e,t)=>({birth:t*.2,angle:O()*v,rho:.58+O()*.18}));function oe(e,t){let n=[];for(let r of ae){let i=e-r.birth;if(i<0||i>.62)continue;let a=r.rho*.75**(i*10),o=r.angle+i*100*Math.PI/180;n.push({x:Math.cos(o)*a*t,y:Math.sin(o)*a*t,r:(.04+.028*y(i/.55))*t,depth:y(1-a/.8),opacity:y(i/.06)*y((.62-i)/.08)})}return n}var se=C(49383),ce=Array.from({length:4},(e,t)=>{let n=t-1.5;return{a:.85*(1+n*.03),k:.15/.85*(1+n*.16),tilt:34*Math.PI/180+n*.035,speed:210/360,phase:-t*.045+se()*.012,sweep:.34,hue:t*85+se()*20,hueSpan:80,width:.095,cx:0,cy:0}}),le=.129,ue=`#2496e8`,de=1.003,fe=.15,k=1.14,A=.054,j=15.46,M=.186,N=.412,pe={yaw:28.49,pitch:28.62,roll:-13},P=e=>e*Math.PI/180;function F(e,t,n){let r=Math.cos(n),i=Math.sin(n);return[[e[0]*r+t[0]*i,e[1]*r+t[1]*i,e[2]*r+t[2]*i],[t[0]*r-e[0]*i,t[1]*r-e[1]*i,t[2]*r-e[2]*i]]}function I(e,t,n=j){let r=[0,0,1],i=[1,0,0],a=[0,1,0];[r,i]=F(r,i,P(e.yaw)),[a,r]=F(a,r,P(e.pitch)),[i,a]=F(i,a,P(e.roll));let o=e=>{let[o,s]=F(r,i,P(n*e));return{x:o[0]*t,y:o[1]*t,a:s[0],b:s[1],c:a[0],d:a[1],depth:o[2]}};return[o(-1),o(1)]}var L=C(24301),R=(()=>{let e=[],t=1.4;for(;t<900;)e.push(t),t+=1.9+L()*2.7,L()<.18&&(e.push(t),t+=.24);return e})(),me=.18;function he(e){for(let t=0;t<R.length;t++){let n=R[t];if(e<n)break;let r=(e-n)/me;if(r>=0&&r<=1)return r<.45?1-r/.45:(r-.45)/.55}return 1}function ge(e,t={}){let{wander:n=1,blink:r=!0,float:i=!0}=t;return{dYaw:(S(e,11.3,.4)*5.5+S(e,3.7,2.1)*1.6)*n,dPitch:(S(e,9.1,1.3)*4.2+S(e,4.3,.7)*1.3)*n,dRoll:S(e,13.7,3.2)*2.2*n,lid:r?he(e):1,driftX:i?S(e,7.9,1.9)*.006:0,driftY:i?S(e,5.3,.3)*.007:0,breath:i?1+Math.sin(e/3.4*Math.PI*2)*.005:1}}function z(e){return .06+.94*y(e)}var B=(e,t,n=0,r=1)=>({w:e,h:t,tilt:n,open:r}),V=(e,t,n=0,r=1)=>[B(e,t,n,r),B(e,t,-n,r)],_e=[{id:`neutre`,gaze:{...pe},split:j,eyes:[B(M,N),B(M,N)]},{id:`attentif`,gaze:{yaw:4,pitch:5,roll:-4},split:16,eyes:V(.21,.44)},{id:`surpris`,gaze:{yaw:3,pitch:-3,roll:0},split:19,eyes:V(.45,.47)},{id:`excite`,gaze:{yaw:6,pitch:-14,roll:0},split:19.5,eyes:V(.4,.56,-10)},{id:`heureux`,gaze:{yaw:5,pitch:9,roll:0},split:17,eyes:V(.27,.17,14)},{id:`hilare`,gaze:{yaw:4,pitch:14,roll:0},split:18,eyes:V(.34,.13,20)},{id:`colere`,gaze:{yaw:3,pitch:7,roll:0},split:17,eyes:V(.34,.15,30)},{id:`triste`,gaze:{yaw:3,pitch:-13,roll:0},split:16,eyes:V(.22,.4,-28)},{id:`effraye`,gaze:{yaw:2,pitch:-20,roll:0},split:20.5,eyes:V(.4,.6)},{id:`mefiant`,gaze:{yaw:12,pitch:6,roll:-6},split:16,eyes:[B(.21,.4),B(.22,.15)]},{id:`confus`,gaze:{yaw:-14,pitch:3,roll:8},split:16.5,eyes:[B(.2,.44,-18),B(.28,.17,14)]},{id:`curieux`,gaze:{yaw:16,pitch:-9,roll:-15},split:16.5,eyes:[B(.24,.46,-8),B(.2,.38,-8)]},{id:`fier`,gaze:{yaw:5,pitch:17,roll:0},split:17,eyes:V(.3,.15,18)},{id:`timide`,gaze:{yaw:-19,pitch:-14,roll:-7},split:14,eyes:V(.17,.3)},{id:`blase`,gaze:{yaw:-22,pitch:2,roll:0},split:16,eyes:V(.3,.12)},{id:`somnolent`,gaze:{yaw:6,pitch:-9,roll:-3},split:16,eyes:V(.2,.42,0,.42)}],ve=new Map(_e.map(e=>[e.id,e])),ye=`neutre`,be=(e,t,n)=>({w:b(e.w,t.w,n),h:b(e.h,t.h,n),tilt:b(e.tilt??0,t.tilt??0,n),open:b(e.open,t.open,n)});function xe(e,t,n){return{id:t.id,gaze:{yaw:b(e.gaze.yaw,t.gaze.yaw,n),pitch:b(e.gaze.pitch,t.gaze.pitch,n),roll:b(e.gaze.roll,t.gaze.roll,n)},split:b(e.split,t.split,n),eyes:[be(e.eyes[0],t.eyes[0],n),be(e.eyes[1],t.eyes[1],n)]}}var Se={egg:[.8369,.8424,.8497,.8585,.8674,.8775,.8878,.8983,.9089,.9185,.9288,.9374,.9445,.9504,.9543,.9559,.9555,.9519,.9466,.9389,.9302,.9193,.9085,.8969,.8852,.8734,.8625,.8513,.8411,.8325,.8243,.8179,.8137,.8112,.8102,.8128,.8178,.8262,.8374,.8518,.8702,.8922,.9169,.9446,.9741,1.0023,1.0267,1.0433,1.0481,1.0393,1.0216,.997,.9697,.9418,.9169,.8949,.876,.8604,.849,.8394,.8337,.8314,.8305,.8326],hexagon:[.921,.9282,.9441,.9706,.9984,1.0059,.9896,.9562,.929,.9124,.9047,.9058,.9157,.9349,.9642,.9873,.9882,.9665,.9336,.9105,.8968,.8918,.8955,.908,.9293,.9611,.982,.9812,.959,.9282,.9089,.8978,.8964,.9026,.9189,.9439,.9778,.999,.9964,.9713,.9439,.9274,.9196,.9206,.9308,.9502,.9799,1.0121,1.0226,1.0071,.9752,.951,.9366,.9316,.9351,.9485,.9711,1.0026,1.0213,1.0155,.9863,.9547,.9347,.9232],triangle:[.7819,.8211,.8747,.944,1.0223,1.096,1.1401,1.134,1.0808,1.0047,.9265,.8603,.8104,.773,.745,.7273,.7151,.7118,.7148,.7245,.7427,.768,.8037,.8518,.9148,.9876,1.0583,1.1073,1.1109,1.0667,.994,.9164,.8482,.7948,.7555,.7261,.7056,.6925,.6859,.6869,.6938,.7084,.7305,.7615,.804,.8595,.9311,1.0092,1.0791,1.1171,1.1054,1.0501,.9779,.905,.845,.799,.7656,.7413,.7258,.716,.7146,.7204,.733,.7528]},H=Array.from({length:64},(e,t)=>t/64*v),U=H.map(Math.cos),W=H.map(Math.sin);function G(e,t={}){return{radii:[...Se[e]],rot:0,cx:0,cy:0,sx:1,sy:1,...t}}function K(e,t={}){return{radii:Array(64).fill(e),rot:0,cx:0,cy:0,sx:1,sy:1,...t}}function Ce(e,t,n,r){let i=r??{radii:Array(64),rot:0,cx:0,cy:0,sx:1,sy:1};for(let r=0;r<64;r++)i.radii[r]=b(e.radii[r]??1,t.radii[r]??1,n);let a=t.rot-e.rot;for(;a>Math.PI;)a-=v;for(;a<-Math.PI;)a+=v;return i.rot=e.rot+a*n,i.cx=b(e.cx,t.cx,n),i.cy=b(e.cy,t.cy,n),i.sx=b(e.sx,t.sx,n),i.sy=b(e.sy,t.sy,n),i}function we(e,t,n=[]){let r=Math.cos(e.rot),i=Math.sin(e.rot);for(let a=0;a<64;a++){let o=e.radii[a]??1,s=o*(U[a]??0),c=o*(W[a]??0),l=s*r-c*i,u=s*i+c*r,d=n[a]??{x:0,y:0};d.x=(l*e.sx+e.cx)*t,d.y=(u*e.sy+e.cy)*t,n[a]=d}return n.length=64,n}function Te(e,t=1/6){let n=e.length;if(n<3)return``;let r=e[0],i=`M${w(r.x)} ${w(r.y)}`;for(let r=0;r<n;r++){let a=e[(r-1+n)%n],o=e[r],s=e[(r+1)%n],c=e[(r+2)%n],l=o.x+(s.x-a.x)*t,u=o.y+(s.y-a.y)*t,d=s.x-(c.x-o.x)*t,f=s.y-(c.y-o.y)*t;i+=`C${w(l)} ${w(u)} ${w(d)} ${w(f)} ${w(s.x)} ${w(s.y)}`}return`${i}Z`}function q(e,t,n){let r=Array(64).fill(0),i=e.length;for(let a=0;a<64;a++){let o=U[a]??0,s=W[a]??0,c=0;for(let r=0;r<i;r++){let a=e[r],l=e[(r+1)%i],u=l.x-a.x,d=l.y-a.y,f=o*d-s*u;if(Math.abs(f)<1e-9)continue;let p=a.x-t,m=a.y-n,h=(p*d-m*u)/f,g=(p*s-m*o)/f;h>c&&g>=0&&g<=1&&(c=h)}r[a]=c}return r}function J(e,t,n,r,i,a,o=96){let s=r-e,c=i-t,l=Math.hypot(s,c)||1e-6,u=Math.atan2(c,s),d=Math.acos(Math.max(-1,Math.min(1,(n-a)/l))),f=[];for(let r=0;r<=o/2;r++){let i=u+d+(v-2*d)*r/(o/2);f.push({x:e+Math.cos(i)*n,y:t+Math.sin(i)*n})}for(let e=0;e<=o/2;e++){let t=u-d+2*d*e/(o/2);f.push({x:r+Math.cos(t)*a,y:i+Math.sin(t)*a})}return f}function Ee(e,t){let n=e.length,r=(t/v%1+1)%1*n,i=Math.floor(r);return b(e[i%n]??1,e[(i+1)%n]??1,r-i)}function De(e,t=1,n=1){return H.map((r,i)=>(Math.abs((U[i]??0)/t)**e+Math.abs((W[i]??0)/n)**e)**(-1/e))}function Oe(e){let t=Array(64).fill(0);for(let n=0;n<64;n++){let r=U[n]??0,i=W[n]??0,a=0;for(let t of e){let e=r*t.x+i*t.y,n=e*e-(t.x*t.x+t.y*t.y-t.r*t.r);if(n<0)continue;let o=e+Math.sqrt(n);o>a&&(a=o)}t[n]=a}return t}function ke(e,t,n=10){let r=e.length,i=[],a=(e,t)=>{let n=t.x-e.x,r=t.y-e.y,i=Math.hypot(n,r)||1;return Math.atan2(-n/i,r/i)};for(let o=0;o<r;o++){let s=e[(o-1+r)%r],c=e[o],l=e[(o+1)%r],u=a(s,c),d=a(c,l)-u;for(;d>Math.PI;)d-=v;for(;d<-Math.PI;)d+=v;for(let e=0;e<=n;e++){let r=u+d*e/n;i.push({x:c.x+Math.cos(r)*t,y:c.y+Math.sin(r)*t})}}return i}function Ae(e,t,n,r=0){let i=r*Math.PI/180;return q(ke(Array.from({length:e},(r,a)=>{let o=i+a/e*v;return{x:Math.cos(o)*(t-n),y:Math.sin(o)*(t-n)}}),n),0,0)}function je(e,t=1){if(e.length<3)return``;let n=``;for(let r=0;r<e.length;r++){let i=e[r];n+=`${r===0?`M`:`L`}${w(i.x*t)} ${w(i.y*t)}`}return`${n}Z`}function Me(e,t){let n=Math.max(e,.01)/2,r=Math.max(t,.01)/2,i=Math.min(n,r);return`M${w(-n)} ${w(-r+i)}A${w(i)} ${w(i)} 0 0 1 ${w(-n+i)} ${w(-r)}L${w(n-i)} ${w(-r)}A${w(i)} ${w(i)} 0 0 1 ${w(n)} ${w(-r+i)}L${w(n)} ${w(r-i)}A${w(i)} ${w(i)} 0 0 1 ${w(n-i)} ${w(r)}L${w(-n+i)} ${w(r)}A${w(i)} ${w(i)} 0 0 1 ${w(-n)} ${w(r-i)}Z`}function Ne(e,t=1){let n=Math.max(...e);if(n<=0)return e;let r=t/n;return e.map(e=>e*r)}var Pe=Ne(Array.from({length:64},(e,t)=>t/64*Math.PI*2).map(e=>1+.075*Math.cos(2*e+.5)+.035*Math.cos(3*e+2.1)),1.02),Fe=Ne(Oe([{x:-.44,y:.2,r:.54},{x:.46,y:.2,r:.5},{x:.02,y:.3,r:.6},{x:-.24,y:-.3,r:.48},{x:.3,y:-.24,r:.44}]),1.02),Ie=Ne(q(J(0,.28,.66,0,-.96,.05),0,0),1.04),Le=q(J(-.42,0,.62,.42,0,.62),0,0),Re=[{id:`cercle`,radii:Array(64).fill(1)},{id:`galet`,radii:Pe},{id:`squircle`,radii:Ne(De(4.2),1.15)},{id:`capsule`,radii:Le},{id:`triangle`,radii:Ae(3,1.12,.34,-90)},{id:`hexagone`,radii:Ae(6,1.04,.26,0)},{id:`nuage`,radii:Fe},{id:`goutte`,radii:Ie}],ze=new Map(Re.map(e=>[e.id,e])),Be=`cercle`,Ve=[{id:`encre`,hex:`#0a0a0c`},{id:`brun`,hex:`#8b5e3c`},{id:`rouge`,hex:`#e8483f`},{id:`orange`,hex:`#f08a24`},{id:`ambre`,hex:`#f0b429`},{id:`vert`,hex:`#3ecf8e`},{id:`turquoise`,hex:`#2fbfa0`},{id:`bleu`,hex:`#3b93f0`},{id:`violet`,hex:`#8b5cf6`},{id:`rose`,hex:`#e152b0`},{id:`gris`,hex:`#a3a3a3`},{id:`creme`,hex:`#f1efe9`}],He=new Map(Ve.map(e=>[e.id,e])),Ue=`encre`;function We(e,t,n){let r=e=>{let t=parseInt(e.slice(1),16);return[t>>16&255,t>>8&255,t&255]},i=r(e),a=r(t);return`#${i.map((e,t)=>Math.round(e+(a[t]-e)*n)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}`}var Y=(e,t)=>[{w:e,h:t,open:1},{w:e,h:t,open:1}];function X(e={}){return{sil:K(1),offX:0,offY:0,gaze:{...pe},split:j,eyes:Y(M,N),eyeAlpha:1,bodyAlpha:1,dots:[],arcs:[],notif:null,dotsBehind:!1,...e}}var Ge=-.1875,Ke=q(J(0,-.505,.132,0,.13,.075),0,Ge),qe=q(J(0,-.2535,.1345,0,.2535,.1345),0,0),Je=(e={})=>({radii:[...Ke],rot:0,cx:0,cy:Ge,sx:1,sy:1,...e}),Ye=(e={})=>({radii:[...qe],rot:0,cx:0,cy:0,sx:1,sy:1,...e}),Xe=je(J(0,0,.118,0,.172,.012)),Ze=.213;function Qe(e){return G(`triangle`,{rot:e,cx:-.213*Math.sin(e),cy:Ze*Math.cos(e)})}function $e(e,t){let n=((e-t*.5)/1.5%1+1)%1;return y((n<.5?.5-.5*Math.cos(n*v):0)*2)}var et=[{id:`idle`,duration:2.4,morph:.45,blinkIn:!1,baseFace:!0,baseBody:!0,pose:()=>X()},{id:`thinking`,duration:2.6,morph:.4,baseFace:!1,baseBody:!1,blinkIn:!0,pose:e=>{let t=$e(e,1),n=.3+.7*x.easeOutCubic(y(e/.3));return X({sil:K(D*(1+(ie-1)*t),{cx:re[1]}),eyeAlpha:0,dots:[0,2].map(t=>{let r=$e(e,t);return{x:re[t]*n,y:0,r:D*(1+(ie-1)*r),opacity:.55+.45*r}})})}},{id:`wink`,duration:1.6,morph:.3,blinkIn:!0,baseFace:!1,baseBody:!0,pose:()=>X({gaze:{yaw:-5.37,pitch:4.55,roll:6.7},split:16.25,eyes:[{w:.236,h:.464,open:1},{w:.447,h:.089,open:1}]})},{id:`wide`,duration:1.8,morph:.55,blinkIn:!0,baseFace:!1,baseBody:!0,pose:()=>X({gaze:{yaw:6.92,pitch:-21.96,roll:11.6},split:18.43,eyes:Y(.356,.875)})},{id:`alert`,duration:2.4,minDuration:2,morph:.45,baseFace:!1,baseBody:!1,blinkIn:!1,pose:e=>{let t=y(e/1.5),n=x.easeInOutCubic(t)*.82-.087,r=e>1.6?y((e-1.6)/.4):0,i=n*(1-r)+.1*r,a=Math.sin(e*2.5*v)*.005,o=17.7*Math.PI/180;return X({sil:Ye({rot:o,cx:i,cy:-.325-a}),eyeAlpha:0,dots:[{x:i-Math.sin(o)*.58,y:-.325+Math.cos(o)*.58+a*2.8,r:.118,d:Xe,rot:o*180/Math.PI,opacity:1}]})}},{id:`notify`,duration:2.2,morph:.5,blinkIn:!0,baseFace:!1,baseBody:!0,pose:e=>{let t=y(e/.45),n=1+(k-1)*Math.sin(t*Math.PI)*(1-t*.35),r=fe*(t<1?n:1),i=-42*Math.PI/180;return X({gaze:{yaw:-21.94,pitch:-5.82,roll:-12.2},split:18.89,eyes:Y(.505,.498),notif:{x:Math.cos(i)*de,y:Math.sin(i)*de,r,notch:r+A}})}},{id:`exclaim`,duration:2,morph:.45,baseFace:!1,baseBody:!1,blinkIn:!1,pose:()=>X({sil:Je(),eyeAlpha:0,dots:[{x:-.012,y:.526,r:.113,opacity:1}]})},{id:`sleep`,duration:2.4,morph:.5,baseFace:!1,baseBody:!1,blinkIn:!1,pose:e=>X({sil:K(.1585,{cy:.11+Math.sin(v/.6*e)*.19}),eyeAlpha:0})},{id:`egg`,duration:1.8,morph:.4,baseFace:!1,baseBody:!1,blinkIn:!0,pose:()=>X({sil:G(`egg`),gaze:{yaw:19.97,pitch:26.01,roll:-17.1},split:11.07,eyes:Y(.164,.385)})},{id:`hexagon`,duration:1.6,morph:.4,baseFace:!1,baseBody:!1,blinkIn:!0,pose:()=>X({sil:G(`hexagon`),gaze:{yaw:23.11,pitch:24.42,roll:-13.3},split:13.37,eyes:Y(.177,.411)})},{id:`play`,duration:2,morph:.5,baseFace:!1,baseBody:!1,blinkIn:!0,pose:e=>{let t=y(e/.35)*y((2.2-e)/.5);return X({sil:Qe(0),gaze:{yaw:12,pitch:-8,roll:-6},split:15,eyes:Y(.18,.34),arcs:ne.map((n,r)=>({id:`sw${r}`,seed:{...n,cx:.45-e*.42},t:e,opacity:t}))})}},{id:`orbit`,duration:3.4,minDuration:2.5,morph:.6,baseFace:!1,baseBody:!1,blinkIn:!1,pose:e=>{let t=x.easeInOutCubic(y(e/.35)),n=-v*1.25*e*t,r=x.easeInOutCubic(y((e-1.6)/.9)),i=Qe(n),a=K(1,{rot:n}),o={radii:i.radii.map((e,t)=>e+(a.radii[t]-e)*r),rot:n,cx:i.cx*(1-r),cy:i.cy*(1-r),sx:1,sy:1},s=y(e/.8)*y((3.6-e)/.9);return X({sil:o,gaze:{yaw:pe.yaw+Math.sin(e*6.5)*65*(1-r),pitch:-4+r*32,roll:-13},eyes:Y(.18,.34+r*.07),arcs:E.map((t,n)=>({id:`rg${n}`,seed:t,t:e,opacity:s*y((e-n*.13)/.3)}))})}},{id:`swirl`,duration:1.3,minDuration:1.3,morph:.3,baseFace:!0,baseBody:!0,blinkIn:!0,pose:e=>X({arcs:E.slice(0,3).map((t,n)=>({id:`sw${n}`,seed:t,t:e,opacity:y((e-n*.06)/.14)*y((1.22-e)/.34)}))})},{id:`burst`,duration:2.6,minDuration:2.4,morph:.4,baseFace:!1,baseBody:!1,blinkIn:!1,pose:e=>{let t=1-.834*x.easeOutQuint(y(e/.7)),n=x.easeOutQuint(y((e-1.7)/.7));return X({sil:K(t+(1-t)*n),eyeAlpha:y((e-1.85)/.4),dots:oe(e,1),dotsBehind:!0})}},{id:`comet`,duration:2.4,minDuration:2.4,morph:.45,baseFace:!1,baseBody:!1,blinkIn:!1,pose:e=>{let t=1-(1-le)*x.easeOutQuint(y(e/.55)),n=x.easeOutQuint(y((e-1.85)/.6)),r=y((e-.15)/.25)*y((1.95-e)/.3);return X({sil:K(t+(1-t)*n,{cy:Math.sin(y(e/1.7)*Math.PI)*.035}),eyeAlpha:y((e-2)/.35),arcs:ce.map((t,n)=>({id:`cm${n}`,seed:t,t:e,opacity:r}))})}}],Z=new Map(et.map(e=>[e.id,e])),tt={idle:1,thinking:1.1,wink:.8,wide:.8,alert:.75,notify:.9,exclaim:.8,sleep:.45,egg:.8,hexagon:.8,play:.9,orbit:1.2,swirl:.5,burst:.45,comet:1.15},nt=[`idle`,`thinking`,`wink`,`wide`,`alert`,`notify`,`exclaim`,`sleep`,`egg`,`hexagon`,`play`,`orbit`,`burst`,`comet`],Q=100,rt=7.1,it=5.5,at=.006,ot=.007;function st(e,t,n){let r=[],i=I(e.gaze,Q,e.split);for(let a=0;a<2;a++){let o=i[a];if(o.depth<=.02)continue;let s=e.eyes[a],c=(s.tilt??0)*Math.PI/180,l=Math.cos(c),u=Math.sin(c),d=o.a*l+o.c*u,f=o.b*l+o.d*u,p=-o.a*u+o.c*l,m=-o.b*u+o.d*l,h=Math.max(s.w*Q,.01)/2,g=Math.max(s.h*Q,.01)/2,_=Math.min(h,g),v=g>h,y=v?g-_:h-_,b=Ee(n,Math.atan2(o.y,o.x)-t.rot);r.push({x:o.x*b,y:o.y*b,ax:(v?p:d)*y,ay:(v?m:f)*y,r:_,m:[d,f,p,m]})}return r}function ct(e,t,n,r,i){let a=r-t,o=i-n,s=a*a+o*o,c=1/0,l=0,u=0;for(let r=0;r<e.length;r++){let i=e[r],d=s>0?((i.x-t)*a+(i.y-n)*o)/s:0;d=d<0?0:d>1?1:d;let f=t+d*a-i.x,p=n+d*o-i.y,m=f*f+p*p;m<c&&(c=m,l=f,u=p)}let d=Math.sqrt(c);return{d,ux:d>1e-9?l/d:0,uy:d>1e-9?u/d:0}}var lt=Math.hypot(at,ot)*Q;function ut(e,t,n,r){let i=1/0,a=0,o=0;for(let s of t){let t=s.x+n,c=s.y+r,l=ct(e,t-s.ax,c-s.ay,t+s.ax,c+s.ay),[u,d,f,p]=s.m,m=s.r*Math.hypot(u*l.ux+d*l.uy,f*l.ux+p*l.uy)+lt;l.d-m<i&&(i=l.d-m,a=l.ux,o=l.uy)}return{marge:i,ux:a,uy:o}}var dt=12,ft=8;function pt(e){if(!e.length)return{x:0,y:0};let t=(t,n)=>{let r=1/0;for(let i of e)r=Math.min(r,ut(i.contour,i.empreintes,t,n).marge);return r},n=1/0;for(let t of e)n=Math.min(n,ut(t.calContour,t.reference,0,0).marge);let r=0,i=0,a=e[0].empreintes;for(let e of a)r-=e.x/a.length,i-=e.y/a.length;let o=Math.max(.35*Q,Math.hypot(r,i)*1.25);n=Math.min(n,t(r,i));let s=t(0,0);if(s>=n&&s>=0)return{x:0,y:0};let c=Math.max(n,0),l=0,u=0,d=1/0,f=0,p=0,m=s;for(let e=0;e<dt;e++){let n=e/dt*Math.PI*2,r=Math.cos(n),i=Math.sin(n);if(t(r*o,i*o)<c){for(let e of[.3,.6,1]){let n=t(r*o*e,i*o*e);n>m&&(m=n,f=r*o*e,p=i*o*e)}continue}let a=0,s=o;for(let e=0;e<ft;e++){let e=(a+s)/2;t(r*e,i*e)>=c?s=e:a=e}s<d&&(d=s,l=r*s,u=i*s)}let h=d===1/0?f:l,g=d===1/0?p:u;return{x:+(h/Q).toFixed(6),y:+(g/Q).toFixed(6)}}function mt(e,t,n){return e.baseFace&&n?{gaze:n.gaze,split:n.split,eyes:n.eyes}:{gaze:t.gaze,split:t.split,eyes:t.eyes}}function ht(e){let t=e=>JSON.stringify([e.gaze,e.split,e.eyes,e.sil.rot,e.sil.cx,e.sil.cy,e.sil.sx,e.sil.sy]);return t(e.pose(0))===t(e.pose(e.duration))?[0]:Array.from({length:3},(t,n)=>n/2*e.duration)}function gt(e,t,n){let r=[];for(let i of ht(e)){let a=e.pose(i),o=we({...a.sil,radii:t},Q),s=we(a.sil,Q),c=mt(e,a,n),l=[];for(let e of[-7.1,rt])for(let t of[-5.5,it])l.push({...c,gaze:{yaw:c.gaze.yaw+e,pitch:c.gaze.pitch+t,roll:c.gaze.roll}});for(let e of l)r.push({empreintes:st(e,a.sil,t),reference:st(e,a.sil,a.sil.radii),contour:o,calContour:s})}return pt(r)}var _t={x:0,y:0},vt=(e,t)=>`${e}|${t??``}`;function yt(){return new Map(Re.map(e=>{let t=new Map;for(let n of et){if(!n.baseBody)continue;let r=n.baseFace?[null,..._e]:[null];for(let i of r)t.set(vt(n.id,i?.id??null),gt(n,e.radii,i))}return[e.radii,t]}))}var bt=yt();function xt(e,t,n){if(!e)return _t;let r=bt.get(e);return r?r.get(vt(t,n))??r.get(vt(t,null))??_t:_t}var St={yaw:0,pitch:0,mix:0,spin:0,wander:1},Ct=(e,t,n)=>({yaw:b(e.yaw,t.yaw,n),pitch:b(e.pitch,t.pitch,n),mix:b(e.mix,t.mix,n),spin:b(e.spin,t.spin,n),wander:b(e.wander,t.wander,n)}),wt=(e,t,n)=>({w:b(e.w,t.w,n),h:b(e.h,t.h,n),open:b(e.open,t.open,n),tilt:b(e.tilt??0,t.tilt??0,n)});function Tt(e,t,n){let r=1-n;return{sil:Ce(e.sil,t.sil,n),offX:b(e.offX,t.offX,n),offY:b(e.offY,t.offY,n),gaze:{yaw:b(e.gaze.yaw,t.gaze.yaw,n),pitch:b(e.gaze.pitch,t.gaze.pitch,n),roll:b(e.gaze.roll,t.gaze.roll,n)},split:b(e.split,t.split,n),eyes:[wt(e.eyes[0],t.eyes[0],n),wt(e.eyes[1],t.eyes[1],n)],eyeAlpha:b(e.eyeAlpha,t.eyeAlpha,n),bodyAlpha:b(e.bodyAlpha,t.bodyAlpha,n),dots:[...e.dots.map(e=>({...e,opacity:e.opacity*r})),...t.dots.map(e=>({...e,opacity:e.opacity*n}))],arcs:[...e.arcs.map(e=>({...e,id:`a${e.id}`,opacity:e.opacity*r})),...t.arcs.map(e=>({...e,id:`b${e.id}`,opacity:e.opacity*n}))],notif:n<.5?e.notif:t.notif,dotsBehind:n<.5?e.dotsBehind:t.dotsBehind}}var Et=class e{scale;cur;prev=null;departFige=null;tCur=0;tPrev=0;blinkAt=-10;pts=[];shape=null;shapePrev=null;shapeAt=-10;expr=null;exprPrev=null;exprAt=-10;look=St;lookPrev=St;lookAt=-10;lookMorph=.24;static SHAPE_MORPH=.45;static LOOK_MORPH=.24;constructor(e=100,t=`idle`,n=null,r=null){this.scale=e,this.cur=t,this.shape=n,this.expr=r}setExpression(e,t=0){e!==this.expr&&(this.exprPrev=this.expr,this.expr=e,this.exprAt=t)}exprAtTime(t){let n=this.expr,r=this.exprPrev;if(!n||!r)return n;let i=(t-this.exprAt)/e.SHAPE_MORPH;return i>=1?n:xe(r,n,x.easeOutQuint(y(i)))}setShape(e,t=0){e!==this.shape&&(this.shapePrev=this.shape,this.shape=e,this.shapeAt=t)}shapeAtTime(t){let n=this.shape,r=this.shapePrev;if(!n||!r)return n;let i=(t-this.shapeAt)/e.SHAPE_MORPH;if(i>=1)return n;let a=x.easeOutQuint(y(i));return n.map((e,t)=>b(r[t]??e,e,a))}setLook(t,n,r=e.LOOK_MORPH){t&&!Number.isFinite(t.yaw+t.pitch+t.mix+t.spin+t.wander)||(this.lookPrev=this.lookAtTime(n),this.look=t??St,this.lookAt=n,this.lookMorph=r)}lookAtTime(e){let t=(e-this.lookAt)/this.lookMorph;return t>=1?this.look:Ct(this.lookPrev,this.look,x.easeOutQuint(y(t)))}posed(e,t,n,r){let i=e.pose(t);return e.baseBody&&n&&(i={...i,sil:{...i.sil,radii:n}}),e.baseFace&&r&&(i={...i,gaze:r.gaze,split:r.split,eyes:r.eyes}),i}decalageAtTime(t,n){let r=(e,n,r,i)=>{if(r===i)return i;let a=(t-e)/n;if(a>=1)return i;let o=x.easeOutQuint(y(a));return{x:b(r.x,i.x,o),y:b(r.y,i.y,o)}},i=t=>r(this.exprAt,e.SHAPE_MORPH,xt(t,n,this.exprPrev?.id??null),xt(t,n,this.expr?.id??null));return r(this.shapeAt,e.SHAPE_MORPH,i(this.shapePrev),i(this.shape))}get state(){return this.cur}reset(e,t){this.cur=e,this.prev=null,this.departFige=null,this.tCur=t,this.tPrev=t,this.blinkAt=-10}origine(e,t,n){if(this.departFige)return this.departFige;if(!this.prev)return null;let r=Z.get(this.prev);return this.posed(r,Math.max(0,e-this.tPrev),t,n)}poseComposee(e){let t=Z.get(this.cur),n=this.shapeAtTime(e),r=this.exprAtTime(e),i=this.posed(t,Math.max(0,e-this.tCur),n,r),a=e-this.tCur;if(a>=t.morph)return i;let o=this.origine(e,n,r);return o?Tt(o,i,x.easeOutQuint(y(a/t.morph))):i}setState(e,t){if(e===this.cur)return;let n=Z.get(this.cur).morph,r=this.prev!==null&&t-this.tCur<n;this.departFige=r?this.poseComposee(t):null,this.prev=this.cur,this.tPrev=this.tCur,this.cur=e,this.tCur=t,Z.get(e)?.blinkIn&&(this.blinkAt=t)}sample(e){let t=this.scale,n=Z.get(this.cur),r=this.shapeAtTime(e),i=this.exprAtTime(e),a=this.posed(n,Math.max(0,e-this.tCur),r,i),o=this.decalageAtTime(e,this.cur),s=e-this.tCur,c=s<n.morph?this.origine(e,r,i):null;if(c){let t=x.easeOutQuint(y(s/n.morph));a=Tt(c,a,t);let r=this.prev;if(r){let n=this.decalageAtTime(e,r);o={x:b(n.x,o.x,t),y:b(n.y,o.y,t)}}}let l=a.eyeAlpha>.01,u=this.lookAtTime(e),d=ge(e,{wander:l?u.wander:0,blink:l}),f={yaw:b(a.gaze.yaw,u.yaw,u.mix)+d.dYaw-u.spin,pitch:b(a.gaze.pitch,u.pitch,u.mix)+d.dPitch,roll:a.gaze.roll+d.dRoll},p=y((e-this.blinkAt)/.2),m=p<1?Math.abs(p*2-1):1,h=Math.min(d.lid,m),g=a.offX+d.driftX,_=a.offY+d.driftY,v=Te(we({...a.sil,cx:a.sil.cx+g,cy:a.sil.cy+_,sy:a.sil.sy*d.breath},t,this.pts)),S=(e,t)=>Ee(a.sil.radii,Math.atan2(t,e)-a.sil.rot),C=[];if(a.eyeAlpha>.01){let e=I(f,t,a.split);for(let n=0;n<2;n++){let r=e[n];if(r.depth<=.02)continue;let i=a.eyes[n],s=S(r.x,r.y),c=(i.tilt??0)*Math.PI/180,l=Math.cos(c),u=Math.sin(c),d=r.a*l+r.c*u,f=r.b*l+r.d*u,p=-r.a*u+r.c*l,m=-r.b*u+r.d*l,v=z(Math.min(h,i.open));C.push({d:Me(i.w*t,i.h*t),matrix:`matrix(${w(d)},${w(f*v)},${w(p)},${w(m*v)},${w(r.x*s+(g+o.x)*t)},${w(r.y*s+(_+o.y)*t)})`,alpha:a.eyeAlpha*y(r.depth/.12)})}}let ee=a.dots.filter(e=>e.opacity>.01&&e.r>5e-4).map(e=>({...e,x:(e.x+g)*t,y:(e.y+_)*t,r:e.r*t})),T=a.notif?S(a.notif.x,a.notif.y):1,E=a.notif?(a.notif.x*T+g)*t:0,ne=a.notif?(a.notif.y*T+_)*t:0,re=a.notif?{x:E,y:ne,r:a.notif.r*t}:null,D=a.notif?{x:E,y:ne,r:a.notif.notch*t}:null;return{bodyPath:v,bodyAlpha:a.bodyAlpha,eyes:C,dots:ee,dotsBehind:a.dotsBehind,arcs:a.arcs.filter(e=>e.opacity>.01).map(e=>te(e.seed,e.t,t,e.id,e.opacity)),notif:re,notch:D}}},Dt=1.1,Ot=1.5,kt=e=>({yaw:0,pitch:0,mix:0,spin:360*(1-x.easeInOutCubic(y(e/Ot))),wander:1});function At({nx:e,ny:t,tour:n,pointer:r}){return{yaw:-26+e*16,pitch:10-t*13,mix:n,spin:360*(1-n),wander:+!r}}var jt=Math.max(...et.map(e=>e.morph)),Mt=10,Nt=200,Pt=50,Ft=.1,It=`defaut`;function Lt(e){return Math.max(jt,Z.get(e)?.minDuration??jt)}function Rt(e,t){let n=Math.round(t/Ft)*Ft,r=Math.min(10,Math.max(Lt(e),n));return Math.round(r*100)/100}function zt(e){return{state:e,duration:Rt(e,Z.get(e)?.duration??2)}}function Bt(){return{name:``,id:It,blocks:nt.map(zt)}}function Vt(e){return e.reduce((e,t)=>e+t.duration,0)}function Ht(e,t){let n=0;for(let r=0;r<t&&r<e.length;r++)n+=e[r].duration;return n}function Ut(e,t){let n=Vt(e);if(!e.length||n<=0)return{index:0,elapsed:0};let r=t>=0&&t<n?t:(t%n+n)%n,i=0;for(let t=0;t<e.length;t++){let n=i+e[t].duration;if(r<n)return{index:t,elapsed:r-i};i=n}return{index:e.length-1,elapsed:0}}function Wt(e,t){return e.length>=200?e:[...e,zt(t)]}function Gt(e,t,n){let r=e.slice(),[i]=r.splice(t,1);return i?(r.splice(Math.min(Math.max(n,0),r.length),0,i),r):e}function Kt(e,t){let n=new Set(t.map(e=>e.name));if(!n.has(e))return e;let r=2;for(;n.has(`${e} ${r}`);)r++;return`${e} ${r}`}function qt(e){let t=new Set(e.map(e=>e.id)),n=1;for(;t.has(`c${n}`);)n++;return`c${n}`}function Jt(e){if(typeof e!=`object`||!e)return null;let{state:t,duration:n}=e;return typeof t!=`string`||!nt.includes(t)||typeof n!=`number`||!Number.isFinite(n)?null:{state:t,duration:Rt(t,n)}}function Yt(e,t){if(typeof e!=`object`||!e)return null;let{id:n,name:r,blocks:i}=e;if(typeof n!=`string`||!n||typeof r!=`string`||!Array.isArray(i))return null;let a=i.slice(0,200).map(Jt).filter(e=>e!==null);return!a.length||t.some(e=>e.id===n)?null:{id:n,name:r,blocks:a}}function Xt(e){if(!e)return[];let t;try{t=JSON.parse(e)}catch{return[]}if(!Array.isArray(t))return[];let n=[];for(let e of t.slice(0,50)){let t=Yt(e,n);t&&n.push(t)}return n}var Zt=100,Qt=158,$t=[`<g`,`>`,`</g>`],en=`<svg... viewBox="." role="img". class="." style="."><defs><mask. maskUnits="userSpaceOnUse"....><path. fill="#fff"></path><!--$-->.<!--/--><!--$-->.<!--/--></mask><!--$-->.<!--/--></defs><g fill="none" stroke-linecap="round">.</g><!--$-->.<!--/--><g.><path..></path><g mask="."><rect.....></rect></g></g><!--$-->.<!--/--><!--$-->.<!--/--><g fill="none" stroke-linecap="round">.</g></svg>`.split(`.`),tn=[`<path`,``,``,``,` fill="#000"></path>`],nn=[`<circle`,``,``,``,` fill="#000"></circle>`],rn=[`<linearGradient`,` id="`,`" gradientUnits="userSpaceOnUse"`,``,``,``,`>`,`</linearGradient>`],an=[`<stop`,``,``,`></stop>`],on=[`<path`,``,` stroke="`,`"`,``,`></path>`],sn=[`<circle`,``,``,``,``,`></circle>`];function $(e,t,n){d(e,(e,n)=>{_(()=>t(e,n))},n?.defer?{defer:!0}:void 0)}function cn(v){var y,b,x,S;let C=n({size:320,shape:Be,color:Ue,expression:ye,paper:`#f9f9f9`,cycle:Bt().blocks,follow:!1,gaze:null,autoPause:!0,ariaLabel:`Animated Bloub avatar`},v),[w,ee]=p(0),[te,T]=p(`idle`),[E]=p(!1),[ne,re]=p(0),D=()=>v.block??w(),ie=()=>v.state??te(),O=()=>v.playing??E(),ae=()=>v.elapsed??ne();function oe(e){v.block===void 0&&ee(e),v.onBlockChange?.(e)}function se(e){v.state===void 0&&T(e),v.onStateChange?.(e)}function ce(e){v.elapsed===void 0&&re(e),v.onElapsedChange?.(e)}let le=f(()=>ze.get(C.shape)?.radii??null),de=f(()=>He.get(C.color)?.hex??`#0a0a0c`),fe=f(()=>ve.get(C.expression)??null),k=_(()=>new Et(100,ie(),le(),fe())),[A,j]=p(_(()=>k.sample(C.frozenAt??0)),{equals:!1}),M=m(),N=`bot-mask-${M}`,pe,P=0,F=-1/0,I=1/0,L=0,R=0,me=0,he=0,ge=-1;function z(e,t=0){let n=C.cycle[e];if(!n){I=1/0;return}me=R-t,ce(t),se(n.state),k.setState(n.state,R),I=O()?me+n.duration:1/0}function B(e){oe(e),z(e)}function V(e,t=0){if(D()===e){z(e,t);return}he=t,oe(e)}function _e(e){let t=C.cycle;if(!t.length)return;let{index:n}=Ut(t,e);if(n!==ge){let e=t[n];se(e.state),n<ge?k.reset(e.state,Ht(t,n)):k.setState(e.state,Ht(t,n)),ge=n}j(k.sample(e))}let be=!1,xe=0,Se=!1,H=1/60;function U(e){e.pointerType!==`touch`&&(e.clientX,e.clientY)}function W(){}function G(){be&&=(k.setLook(null,R,Dt),!1)}function K(){if(!Z.get(ie())?.baseFace){G();return}}function Ce(e){k.setLook(e(R-xe),R,H)}function we(){window.removeEventListener(`pointermove`,U),document.removeEventListener(`pointerleave`,W)}function Te(e){P=requestAnimationFrame(Te);let t=L?Math.min((e-L)/1e3,.064):0;L=e,R+=t;let n=C.fps&&C.fps>0?1/C.fps:0;R-F<n||(F=R,O()&&(R>=I&&C.cycle.length?B((D()+1)%C.cycle.length):ce(R-me)),C.follow?K():C.gaze&&Ce(C.gaze),j(k.sample(R)))}function q(){C.frozenAt!==void 0&&j(k.sample(C.frozenAt))}$(()=>C.gaze,e=>{e?(xe=R,Se=!0,k.setLook(e(0),R-H,H)):Se&&=(k.setLook(null,R),!1)}),$(D,e=>{z(e,he),he=0},{defer:!0}),$(ie,e=>{k.state!==e&&(k.setState(e,R),q())},{defer:!0}),$(O,e=>{e?z(D(),ae()):I=1/0},{defer:!0}),$(()=>C.cycle,e=>{if(!e.length){I=1/0;return}let t=Math.min(D(),e.length-1);t===D()?I=O()?me+e[t].duration:1/0:B(t)},{defer:!0}),$(le,e=>{k.setShape(e,R),q()},{defer:!0}),$(fe,e=>{k.setExpression(e,R),q()},{defer:!0}),$(()=>C.frozenAt,q,{defer:!0}),d(()=>C.follow&&C.frozenAt===void 0,e=>{e?(window.addEventListener(`pointermove`,U),document.addEventListener(`pointerleave`,W)):(we(),G())});function J(){P||typeof requestAnimationFrame>`u`||(L=0,P=requestAnimationFrame(Te))}function Ee(){P&&=(typeof cancelAnimationFrame<`u`&&cancelAnimationFrame(P),0)}let[De,Oe]=p(!0),[ke,Ae]=p(!0),[je,Me]=p(!1);d(()=>je()&&C.frozenAt===void 0&&(!C.autoPause||De()&&ke()),e=>{e?J():Ee()}),g(()=>{if(v.ref?.({get svg(){},seek:V,renderAt:_e}),C.frozenAt!==void 0)return;z(D(),ae());let e=()=>Ae(document.visibilityState!==`hidden`);document.addEventListener(`visibilitychange`,e),e();let t=typeof IntersectionObserver>`u`?null:new IntersectionObserver(e=>{let t=e[e.length-1];t&&Oe(t.isIntersecting)});return t?.observe(pe),Me(!0),()=>{document.removeEventListener(`visibilitychange`,e),t?.disconnect()}}),h(()=>{Ee(),typeof window<`u`&&we()});function Ne(e){let t={fill:e.color??(e.depth===void 0?de():We(C.paper,de(),e.depth)),opacity:e.opacity};return e.d?{...t,d:e.d,transform:`translate(${e.x} ${e.y}) rotate(${e.rot??0}) scale(100)`}:{...t,cx:e.x,cy:e.y,r:e.r}}let Pe=()=>l({get each(){return A().dots},keyed:!1,children:t=>e(n({get component(){return t().d?`path`:`circle`}},()=>Ne(t())))});var Fe=s(),Ie=o(()=>[i(`width`,t(C.size,!0)),i(`height`,t(C.size,!0))],2),Le=o(()=>[i(`aria-label`,t(C.ariaLabel,!0)),a(C.class),c(C.style)],3),Re=()=>i(`d`,t(A().bodyPath,!0)),Ve=t(l({get each(){return A().eyes},keyed:!1,children:e=>{var n,a;return n=s(),a=o(()=>[i(`d`,t(e().d,!0)),i(`transform`,t(e().matrix,!0)),i(`opacity`,t(e().alpha,!0))],3),r(tn,n,a,a,a)}})),Y=t(u({get when(){return A().notch},children:e=>{var n,a;return n=s(),a=o(()=>[i(`cx`,t(e().x,!0)),i(`cy`,t(e().y,!0)),i(`r`,t(e().r,!0))],3),r(nn,n,a,a,a)}})),X=t(l({get each(){return A().arcs},keyed:!1,children:e=>{var n,a,c;return n=s(),a=o(()=>[`${t(M,!0)}-${t(e().id,!0)}`,i(`x1`,t(e().grad.x1,!0)),i(`y1`,t(e().grad.y1,!0)),i(`x2`,t(e().grad.x2,!0)),i(`y2`,t(e().grad.y2,!0))],5),c=t(l({get each(){return e().grad.stops},keyed:!1,children:(n,a)=>{var c,l;return c=s(),l=o(()=>[i(`offset`,t(a,!0)/(t(e().grad.stops.length,!0)-1)),i(`stop-color`,t(n(),!0))],2),r(an,c,l,l)}})),r(rn,n,a,a,a,a,a,c)}})),Ge=t(l({get each(){return A().arcs},keyed:!1,children:e=>{var n,a;return n=s(),a=o(()=>[i(`d`,t(e().back,!0)),`url(#${t(M,!0)}-${t(e().id,!0)})`,i(`stroke-width`,t(e().width,!0)),i(`opacity`,t(e().opacity,!0))],4),r(on,n,a,a,a,a)}})),Ke=t(u({get when(){return A().dotsBehind},get children(){return y=s(),b=t(Pe({})),r($t,y,b)}})),qe=o(()=>[i(`opacity`,t(A().bodyAlpha,!0)),i(`d`,t(A().bodyPath,!0)),i(`fill`,t(C.paper,!0))],3),Je=()=>i(`fill`,t(de(),!0)),Ye=t(u({get when(){return!A().dotsBehind},get children(){return x=s(),S=t(Pe({})),r($t,x,S)}})),Xe=t(u({get when(){return A().notif},children:e=>{var n,a;return n=s(),a=o(()=>[i(`cx`,t(e().x,!0)),i(`cy`,t(e().y,!0)),i(`r`,t(e().r,!0))],3),r(sn,n,a,a,a,i(`fill`,t(ue,!0)))}})),Ze=t(l({get each(){return A().arcs},keyed:!1,children:e=>{var n,a;return n=s(),a=o(()=>[i(`d`,t(e().front,!0)),`url(#${t(M,!0)}-${t(e().id,!0)})`,i(`stroke-width`,t(e().width,!0)),i(`opacity`,t(e().opacity,!0))],4),r(on,n,a,a,a,a)}}));return r(en,Fe,Ie,Ie,`-158 -158 ${t(158,!0)*2} ${t(158,!0)*2}`,Le,Le,Le,i(`id`,t(N,!0)),i(`x`,-158),i(`y`,-158),i(`width`,t(158,!0)*2),i(`height`,t(158,!0)*2),Re,Ve,Y,X,Ge,Ke,qe,qe,qe,`url(#${t(N,!0)})`,i(`x`,-158),i(`y`,-158),i(`width`,t(158,!0)*2),i(`height`,t(158,!0)*2),Je,Ye,Xe,Ze)}export{cn as BloubBot,Et as BotEngine,Ve as COLORS,He as COLOR_BY_ID,Ue as DEFAULT_COLOR,ye as DEFAULT_EXPRESSION,Be as DEFAULT_SHAPE,Qt as DEMI_VIEWBOX,_e as EXPRESSIONS,ve as EXPRESSION_BY_ID,Mt as MAX_BLOCK,Nt as MAX_BLOCS,Pt as MAX_CYCLES,jt as MIN_BLOCK,tt as POSES,Zt as RAYON,nt as SEQUENCE,Re as SHAPES,ze as SHAPE_BY_ID,et as STATES,Z as STATE_BY_ID,Ft as STEP,Ot as TOUR_TIME,Dt as TURN_TIME,xe as blendExpression,Ut as blockAt,Wt as blocksWith,Rt as clampDuration,Bt as defaultCycle,At as lookTarget,zt as makeBlock,Lt as minDurationOf,We as mixHex,Gt as moveBlock,qt as nextCycleId,Ht as offsetOf,Xt as parseCycles,Vt as totalDuration,kt as tourLook,Kt as uniqueName};
1
+ import{A as e,B as t,C as n,D as r,E as i,F as a,I as o,L as s,M as c,N as l,O as u,P as d,R as f,S as p,T as m,V as h,_ as g,a as _,b as v,c as y,d as b,f as x,g as S,h as C,i as w,j as T,k as E,l as D,m as O,n as k,o as A,p as j,r as M,s as N,t as P,u as F,v as I,w as L,x as R,y as z,z as B}from"./chunks/BloubBot-server-V9r0a_k-.js";export{P as BloubBot,m as BotEngine,T as COLORS,c as COLOR_BY_ID,l as DEFAULT_COLOR,f as DEFAULT_EXPRESSION,d as DEFAULT_SHAPE,k as DEMI_VIEWBOX,B as EXPRESSIONS,t as EXPRESSION_BY_ID,w as MAX_BLOCK,_ as MAX_BLOCS,A as MAX_CYCLES,N as MIN_BLOCK,i as POSES,M as RAYON,r as SEQUENCE,a as SHAPES,o as SHAPE_BY_ID,u as STATES,E as STATE_BY_ID,y as STEP,R as TOUR_TIME,p as TURN_TIME,h as blendExpression,D as blockAt,F as blocksWith,b as clampDuration,x as defaultCycle,e as dotPulse,n as lookTarget,j as makeBlock,O as minDurationOf,s as mixHex,C as moveBlock,S as nextCycleId,g as offsetOf,I as parseCycles,z as totalDuration,L as tourLook,v as uniqueName};
@@ -5,6 +5,19 @@ export interface RenderedEye {
5
5
  d: string;
6
6
  matrix: string;
7
7
  alpha: number;
8
+ /** taille de la gelule dans son repere (avant `matrix`), en px : ce que `d` dessine */
9
+ w: number;
10
+ h: number;
11
+ /**
12
+ * l'ecrasement vertical du clignement deja compose dans `matrix` (`blinkScale`), 1 oeil
13
+ * ouvert : un rendu qui dessine l'oeil autrement qu'un trou peut le retirer de la matrice
14
+ */
15
+ open: number;
16
+ /**
17
+ * le meme ecrasement hors clignement : celui de l'expression au repos (`EyeCfg.open`,
18
+ * `somnolent`). `open` lui est egal sauf pendant un clignement, ou il descend en dessous
19
+ */
20
+ rest: number;
8
21
  }
9
22
  export interface BotFrame {
10
23
  bodyPath: string;
@@ -56,6 +69,10 @@ export interface BotFrame {
56
69
  * avec l'arrivee. Comme les yeux vivent sur une sphere, un tour les fait passer
57
70
  * derriere la boule et revenir de l'autre cote — et `-360deg` etant le meme
58
71
  * angle que `0`, il ne change rien a l'endroit ou ils se posent.
72
+ *
73
+ * `blink` dit ce qui reste des clignements (1 par defaut, 0 = aucun). Comme `wander`,
74
+ * c'est de la vie automatique qu'on module : un oeil deja ferme en tiret (la peluche
75
+ * endormie) qui clignerait encore s'amincirait d'un coup, a chaque clignement.
59
76
  */
60
77
  export interface Look {
61
78
  yaw: number;
@@ -63,6 +80,7 @@ export interface Look {
63
80
  mix: number;
64
81
  spin: number;
65
82
  wander: number;
83
+ blink?: number;
66
84
  }
67
85
  /**
68
86
  * Moteur sans horloge : `sample(t)` est une fonction pure du temps.
@@ -80,8 +98,21 @@ export declare class BotEngine {
80
98
  * fondu est deja en cours. Cf. `setState`.
81
99
  */
82
100
  private departFige;
101
+ /**
102
+ * Meme chose pour le decalage des yeux (`eyefit.ts`), qui se fond a cote de la pose et
103
+ * avait le meme defaut : en plein fondu, il repartait du decalage PLEIN de l'etat quitte.
104
+ * Mesure sur capsule, `notify -> idle -> notify` a 50 ms : 7,3 px de saut sur les deux
105
+ * yeux, contre 5,3 px pour le plus raide des changements espaces.
106
+ */
107
+ private decalageFige;
83
108
  private tCur;
84
109
  private tPrev;
110
+ /**
111
+ * Avance de la POSE de l'etat courant (et de l'etat quitte) sur son horloge : la pose se
112
+ * lit a `now - tCur + posePhase`, le fondu reste date sur `tCur`. Cf. `setState`.
113
+ */
114
+ private posePhase;
115
+ private previousPosePhase;
85
116
  private blinkAt;
86
117
  private pts;
87
118
  private shape;
@@ -90,6 +121,12 @@ export declare class BotEngine {
90
121
  private expr;
91
122
  private exprPrev;
92
123
  private exprAt;
124
+ /**
125
+ * Depart du decalage des yeux quand une expression arrive en plein morph : les ids lus
126
+ * dans la table et leur poids a l'instant du changement. `null` hors de ce cas, et le
127
+ * depart est alors simplement `exprPrev`. Cf. `setExpression`.
128
+ */
129
+ private exprDepart;
93
130
  private look;
94
131
  private lookPrev;
95
132
  private lookAt;
@@ -159,6 +196,14 @@ export declare class BotEngine {
159
196
  */
160
197
  private decalageAtTime;
161
198
  get state(): StateId;
199
+ /**
200
+ * Rien n'est en cours a `now` hors de la vie au repos : ni fondu d'etat, ni morph de forme
201
+ * ou de visage, ni clignement. C'est l'instant ou un bot en pause (`paused` du composant)
202
+ * peut s'arreter sans figer un oeil a moitie ferme ni une pose a mi-chemin. Le regard n'y
203
+ * est pas : c'est le composant qui le pose, et il sait quand il a fini. Lecture pure,
204
+ * comme `sample`.
205
+ */
206
+ quiet(now: number): boolean;
162
207
  /**
163
208
  * Repart sur `id` SANS etat precedent, comme un moteur neuf pose sur cet etat.
164
209
  *
@@ -183,6 +228,12 @@ export declare class BotEngine {
183
228
  * puisse la figer.
184
229
  */
185
230
  private poseComposee;
231
+ /**
232
+ * Decalage des yeux a l'instant `now`, fondu d'etat compris : il suit la MEME courbe que
233
+ * la silhouette qui le motive, depuis le decalage fige s'il y en a un, sinon depuis celui
234
+ * de l'etat quitte.
235
+ */
236
+ private decalageCompose;
186
237
  /**
187
238
  * Changement d'etat, date.
188
239
  *
@@ -200,7 +251,12 @@ export declare class BotEngine {
200
251
  * exactement l'image affichee. La lecture d'un montage, dont les blocs durent au moins
201
252
  * le plus long fondu (`MIN_BLOCK`), ne fige donc jamais rien et rend au bit ce qu'elle
202
253
  * rendait.
254
+ *
255
+ * `posePhase` avance la pose du nouvel etat sans toucher au fondu : un bot qui entre dans
256
+ * un etat au milieu de son animation (cf. `initialPhase` du composant) morphe depuis
257
+ * l'image a l'ecran, sur la duree normale, vers une pose deja en cours. A 0 — la valeur
258
+ * par defaut — le rendu est celui d'avant, au bit pres.
203
259
  */
204
- setState(id: StateId, now: number): void;
260
+ setState(id: StateId, now: number, posePhase?: number): void;
205
261
  sample(now: number): BotFrame;
206
262
  }
@@ -14,7 +14,7 @@
14
14
  * la cle existe). Un `as const` sur le tableau aurait le meme effet mais
15
15
  * rendrait `radii` en lecture seule, alors que le moteur le passe tel quel.
16
16
  */
17
- export type ShapeId = 'cercle' | 'galet' | 'squircle' | 'capsule' | 'triangle' | 'hexagone' | 'nuage' | 'goutte';
17
+ export type ShapeId = 'cercle' | 'galet' | 'squircle' | 'capsule' | 'triangle' | 'hexagone' | 'nuage' | 'goutte' | 'carre' | 'losange' | 'pentagone';
18
18
  export interface BotShape {
19
19
  id: ShapeId;
20
20
  radii: number[];
@@ -74,6 +74,8 @@ export interface StateDef {
74
74
  baseFace: boolean;
75
75
  pose(local: number): Pose;
76
76
  }
77
+ /** Onde de pulsation qui parcourt les trois points de gauche a droite. */
78
+ export declare function dotPulse(t: number, index: number): number;
77
79
  export declare const STATES: StateDef[];
78
80
  export declare const STATE_BY_ID: Map<StateId, StateDef>;
79
81
  /** Ordre de lecture de la sequence complete, calque sur la video de reference. */
@@ -1,5 +1,8 @@
1
+ import { type Accessor } from 'solid-js';
1
2
  import { type JSX } from '@solidjs/web';
3
+ import { type BotFrame } from '../bot/engine.js';
2
4
  import { type GazeScript } from '../ui/gaze.js';
5
+ import { type BotExpression } from '../bot/expressions.js';
3
6
  import { type Block } from '../bot/cycles.js';
4
7
  import { type StateId } from '../bot/states.js';
5
8
  export interface BloubBotRef {
@@ -7,11 +10,33 @@ export interface BloubBotRef {
7
10
  seek(index: number, offset?: number): void;
8
11
  renderAt(seconds: number): void;
9
12
  }
13
+ /**
14
+ * Ce que le composant passe a un rendu de remplacement du corps (`layer`).
15
+ *
16
+ * `frame` est l'image courante du moteur ; `time` l'instant ou elle a ete echantillonnee,
17
+ * et `clock` l'horloge du bot MAINTENANT — c'est sur elle que le composant date ses
18
+ * changements d'etat (`engine.setState(id, clock)`), donc un rendu qui date les siens
19
+ * pareil reste dans le meme temps que le moteur, fige ou pas.
20
+ *
21
+ * `hold` est la seule chose qu'un rendu dit au composant : « j'ai une transition qui court
22
+ * encore tant de secondes ». Un bot en pause (`paused`) ne s'arrete pas avant ; sans elle,
23
+ * il s'arreterait des que le moteur est au repos et figerait la transition du rendu.
24
+ */
25
+ export interface BotLayerContext {
26
+ frame: Accessor<BotFrame>;
27
+ time: () => number;
28
+ clock: () => number;
29
+ hold: (seconds: number) => void;
30
+ ink: Accessor<string>;
31
+ uid: string;
32
+ }
10
33
  export interface BloubBotProps {
11
34
  size?: number;
12
35
  shape?: string;
36
+ /** un id du personnalisateur, ou une couleur `#rrggbb` donnee telle quelle */
13
37
  color?: string;
14
- expression?: string;
38
+ /** un id du catalogue, ou une expression complete (un visage qui n'est pas au catalogue) */
39
+ expression?: string | BotExpression;
15
40
  paper?: string;
16
41
  ariaLabel?: string;
17
42
  frozenAt?: number;
@@ -38,6 +63,28 @@ export interface BloubBotProps {
38
63
  * `renderAt` (l'export, lui, passe par `frozenAt` et n'a jamais de boucle).
39
64
  */
40
65
  autoPause?: boolean;
66
+ /**
67
+ * Arrete le bot sans le figer : l'horloge s'arrete sur la pose a l'ecran, et la reprise
68
+ * repart de la meme, donc rien ne saute ni a l'arret ni au depart. L'arret attend que le
69
+ * bot soit au repos — pas de fondu, de morph ou de clignement en cours, pas de transition
70
+ * du `layer` — et un changement de prop pendant la pause se joue jusqu'au bout avant de
71
+ * s'arreter a nouveau. C'est ce qu'il faut a un avatar qui ne bouge qu'au survol :
72
+ * `frozenAt`, lui, dessine une DATE, et passer de l'un a l'autre ferait sauter la pose.
73
+ * Un bot qui suit le pointeur (`follow`) ne s'arrete pas.
74
+ */
75
+ paused?: boolean;
76
+ /**
77
+ * Date de depart du bot dans son montage, en secondes. Lue une fois, au montage :
78
+ * l'horloge, le bloc et la pose partent de cette date, donc plusieurs bots montes
79
+ * ensemble ne respirent pas a l'unisson. Ignoree par un bot fige (`frozenAt`).
80
+ */
81
+ initialPhase?: number;
82
+ /**
83
+ * Rendu de remplacement du corps, des points et de la pastille : le moteur tourne
84
+ * pareil, seul le dessin change. C'est ce que `@norbert_bodziony/bloub/plush` branche
85
+ * ici ; le code du rendu reste dans son entree, hors du bundle principal.
86
+ */
87
+ layer?: (context: BotLayerContext) => JSX.Element;
41
88
  onBlockChange?: (value: number) => void;
42
89
  onStateChange?: (value: StateId) => void;
43
90
  onPlayingChange?: (value: boolean) => void;
@@ -1,5 +1,5 @@
1
1
  export { default as BloubBot } from './components/BloubBot.js';
2
- export type { BloubBotProps, BloubBotRef } from './components/BloubBot.js';
2
+ export type { BloubBotProps, BloubBotRef, BotLayerContext } from './components/BloubBot.js';
3
3
  export * from './bot/engine.js';
4
4
  export * from './bot/cycles.js';
5
5
  export * from './bot/states.js';
@@ -0,0 +1,64 @@
1
+ import type { JSX } from '@solidjs/web';
2
+ import { type BotExpression, type ExpressionId } from '../bot/expressions.js';
3
+ import { type PlushCharacterId, type PlushShapeId, type PlushState } from './catalogue.js';
4
+ import { type PlushTransition } from './transition.js';
5
+ export interface PlushBotProps {
6
+ /** un des six personnages : corps, couleur, yeux et visage cuits. Prioritaire sur `shape`. */
7
+ character?: PlushCharacterId;
8
+ /** une forme grise, teinte en `color` */
9
+ shape?: PlushShapeId;
10
+ /** un id du personnaliseur ou `#rrggbb` ; ignore pour un personnage */
11
+ color?: string;
12
+ /**
13
+ * `asleep` et `failed` imposent leur visage (yeux fermes ; la pose et l'inclinaison de
14
+ * `triste` sur l'oeil le plus ouvert de la peluche, cf. `failedFace`), comme `wink` et
15
+ * `wide` le leur : `expression` n'y compte pas.
16
+ */
17
+ state?: PlushState;
18
+ /**
19
+ * Le visage au repos : un id du catalogue ou une expression complete. Sans lui, un
20
+ * personnage garde le sien et une forme prend `neutre`. Il glisse vers le nouveau
21
+ * visage avec la duree des morphs du moteur.
22
+ */
23
+ expression?: ExpressionId | BotExpression;
24
+ /**
25
+ * Comment le corps change (forme, personnage ou couleur) : `flip` par defaut, `pop`,
26
+ * `warp`, `dissolve` ou `cut`. Les yeux suivent le corps. Cf. `transition.ts`.
27
+ */
28
+ transition?: PlushTransition;
29
+ /**
30
+ * Agrandit le visage : un avatar de 24 a 40 px lit mieux son regard avec des yeux plus
31
+ * grands que ceux de la capture, comme un caractere en petit corps a une graisse a lui.
32
+ * Les yeux ET leur ecart grandissent, depuis le bord exterieur du visage (`faceGrowth`) :
33
+ * agrandis sur place, ils passaient a travers le bord des formes etroites. CHOISI, 1 par
34
+ * defaut (le visage ajuste, rendu identique) ; le moteur ne change pas. `wide` deborde deja
35
+ * des corps courts a 1, et davantage au-dela.
36
+ */
37
+ eyeScale?: number;
38
+ size?: number;
39
+ fps?: number;
40
+ autoPause?: boolean;
41
+ /**
42
+ * Arrete la peluche sur la pose a l'ecran, apres la transition en cours, et la reprend de
43
+ * la meme pose : rien ne saute. Pour un avatar qui ne bouge qu'au survol, c'est elle, pas
44
+ * `frozenAt` (cf. `paused` de `BloubBot`).
45
+ */
46
+ paused?: boolean;
47
+ frozenAt?: number;
48
+ follow?: boolean;
49
+ initialPhase?: number;
50
+ /**
51
+ * Ou trouver les images si le bundler ne les a pas emises avec le paquet (un CDN, un
52
+ * dossier `public/`). Un prefixe d'URL : `${assetBase}${fichier}`.
53
+ */
54
+ assetBase?: string;
55
+ ariaLabel?: string;
56
+ class?: string;
57
+ style?: JSX.CSSProperties | string;
58
+ }
59
+ /**
60
+ * Une peluche : `BloubBot` avec le rendu de feutre branche dans `layer`. Le moteur, les
61
+ * yeux, le clignement et les transitions sont les siens ; cette enveloppe ne fait que
62
+ * traduire les props et dater l'entree dans `thinking`.
63
+ */
64
+ export default function PlushBot(props: PlushBotProps): JSX.Element;
@@ -0,0 +1 @@
1
+ export declare const ASSET_URLS: Record<string, string>;
@@ -0,0 +1,28 @@
1
+ import { type Accessor } from 'solid-js';
2
+ import { type PlushTransition, type Rendu } from './transition.js';
3
+ /** un corps de passage : l'image (deja teinte) et le contour que le moteur lui donne */
4
+ export interface PlushBodyView {
5
+ url: string | null;
6
+ radii: readonly number[];
7
+ }
8
+ /** un changement de corps, date sur l'horloge du bot */
9
+ export interface PlushPassage {
10
+ avant: PlushBodyView;
11
+ apres: PlushBodyView;
12
+ debut: number;
13
+ }
14
+ export interface PlushBodyProps {
15
+ passage: PlushPassage;
16
+ transition: PlushTransition;
17
+ rendu: Accessor<Rendu>;
18
+ /** l'instant du bot, pour les rayons du `warp` */
19
+ clock: () => number;
20
+ /** cote du bot en px, pour la resolution du canvas du `warp` */
21
+ size?: number;
22
+ }
23
+ /**
24
+ * Le corps de la peluche, au repos ou en transition. Au repos, une seule `<image>` ; le
25
+ * canvas du `warp` et les filtres du `dissolve` ne sont montes que pendant le passage,
26
+ * pour qu'une peluche immobile ne coute rien de plus qu'avant.
27
+ */
28
+ export default function PlushBody(props: PlushBodyProps): import("@solidjs/web").JSX.Element;
@@ -0,0 +1,56 @@
1
+ import type { BotExpression } from '../bot/expressions.js';
2
+ import type { ShapeId } from '../bot/skins.js';
3
+ export type PlushCharacterId = 'nexo' | 'vita' | 'cloe' | 'malu' | 'yoshi' | 'fred';
4
+ /** Les formes qui ont un corps gris : toutes celles du personnaliseur. */
5
+ export type PlushShapeId = Extract<ShapeId, 'cercle' | 'galet' | 'squircle' | 'capsule' | 'triangle' | 'hexagone' | 'nuage' | 'goutte' | 'carre' | 'losange' | 'pentagone'>;
6
+ export declare const PLUSH_SHAPES: readonly PlushShapeId[];
7
+ /**
8
+ * Les etats d'une peluche : ceux qui GARDENT le corps. Une peluche ne devient pas un point
9
+ * d'exclamation. `thinking` n'est pas l'etat du moteur (il reduit le corps a un point) :
10
+ * la peluche reste au repos, leve les yeux, et trois boules de feutre pulsent a cote.
11
+ *
12
+ * `asleep` et `failed` n'existent que chez la peluche, et rien n'y est releve : ce sont
13
+ * des visages CHOISIS, poses sur l'etat `idle` du moteur (cf. `motion.ts`). `asleep` n'est
14
+ * pas `sleep`, le point qui rebondit dans la video.
15
+ */
16
+ export type PlushState = 'idle' | 'wink' | 'wide' | 'thinking' | 'notify' | 'asleep' | 'failed';
17
+ export declare const PLUSH_STATES: readonly PlushState[];
18
+ /**
19
+ * Un patin d'oeil, en feutre (`tools/peluche/fit/matiere.py`) : cuit en deux gelules, couchee et
20
+ * debout, faites de la gelule de l'oeil sur lequel il a ete ajuste. Sur une gelule, il est
21
+ * recompose de leurs morceaux a l'echelle de son petit cote (`slices.ts`), jamais etire ; le clin d'oeil,
22
+ * lui, l'ecrase a l'ecran. `dx`, `dy` le decalent a l'ecran, en unites de rayon (le recalage de
23
+ * `ajuste-yeux.py`).
24
+ */
25
+ export interface PlushPad {
26
+ /** son identite (`padFade`, `failed`) : l'image couchee */
27
+ file: string;
28
+ /** la gelule couchee et la gelule debout (`slices.ts`) */
29
+ images: {
30
+ x: string;
31
+ y: string;
32
+ };
33
+ /** le petit cote de la gelule ajustee, en unites de rayon */
34
+ court: number;
35
+ /** le patin rond (la gelule sans partie droite) mesure `kw` x `kh` fois ce petit cote */
36
+ kw: number;
37
+ kh: number;
38
+ dx: number;
39
+ dy: number;
40
+ }
41
+ export interface PlushCharacter {
42
+ id: PlushCharacterId;
43
+ /** la forme du moteur sous l'image : c'est elle qui place les yeux */
44
+ shape: ShapeId;
45
+ /** la couleur relevee sur la capture (mediane du haut du corps, hors yeux) */
46
+ ink: string;
47
+ body: string;
48
+ pads: [PlushPad, PlushPad];
49
+ face: BotExpression;
50
+ }
51
+ export declare const PLUSH_CHARACTERS: readonly PlushCharacter[];
52
+ export declare const PLUSH_CHARACTER_BY_ID: Map<PlushCharacterId, PlushCharacter>;
53
+ export declare const GENERIC_PAD: PlushPad;
54
+ /** Corps gris d'une forme, et la boule de feutre (points de reflexion, pastille). */
55
+ export declare const shapeBody: (shape: PlushShapeId) => string;
56
+ export declare const BALL = "boule.webp";
@@ -0,0 +1,5 @@
1
+ export { default as PlushBot } from './PlushBot.js';
2
+ export type { PlushBotProps } from './PlushBot.js';
3
+ export { PLUSH_CHARACTERS, PLUSH_CHARACTER_BY_ID, PLUSH_SHAPES, PLUSH_STATES, type PlushCharacter, type PlushCharacterId, type PlushShapeId, type PlushState } from './catalogue.js';
4
+ export { tintRamp } from './tint.js';
5
+ export { DEFAULT_TRANSITION, PLUSH_TRANSITIONS, type PlushTransition } from './transition.js';
@@ -0,0 +1,36 @@
1
+ import type { BotLayerContext } from '../components/BloubBot.js';
2
+ import { type PlushPassage } from './body.js';
3
+ import type { PlushPad } from './catalogue.js';
4
+ import { type DotsTrack, type PadFade } from './motion.js';
5
+ import { type PlushTransition, type Rendu } from './transition.js';
6
+ export interface PlushLayerProps {
7
+ context: BotLayerContext;
8
+ /** le corps, ou le passage d'un corps a l'autre ; une image nulle n'est pas encore prete */
9
+ passage: PlushPassage;
10
+ transition: PlushTransition;
11
+ /** un bot fige n'a pas d'horloge qui avance : il montre le nouveau corps, au repos */
12
+ frozen?: boolean;
13
+ /** l'etape de la transition, a chaque changement : le moteur suit `bascule` */
14
+ onStep?: (step: Pick<Rendu, 'bascule' | 'fini'>) => void;
15
+ size?: number;
16
+ pads: readonly [PlushPad, PlushPad];
17
+ /** l'echelle des yeux, dans le repere de l'oeil (cf. `eyeScale` de `PlushBot`) */
18
+ eyeScale?: number;
19
+ /** les patins d'avant, en fondu sous les courants (entree et sortie de `failed`) */
20
+ padFade?: PadFade;
21
+ padHref: (file: string) => string;
22
+ /** la boule teinte a la couleur du bot (points de reflexion) et au bleu de la pastille */
23
+ dot: string | null;
24
+ notif: string | null;
25
+ dots: DotsTrack;
26
+ /** les « z » de `asleep` */
27
+ zs: DotsTrack;
28
+ }
29
+ /**
30
+ * Le rendu peluche, branche dans `BloubBot` par `layer`. Le corps est une image FIXE :
31
+ * il ne respire pas, ne se deforme pas. Seuls les yeux bougent, poses par les matrices
32
+ * du moteur — c'est la peluche qui a ete validee, celle « qui ne bouge que des yeux ».
33
+ * La seule exception est le changement de corps (`transition.ts`), qui emporte les yeux
34
+ * avec lui.
35
+ */
36
+ export default function PlushLayer(props: PlushLayerProps): import("@solidjs/web").JSX.Element;