Files
multipleof4andClaude Opus 5.5 ab7e0dc0df Split the gallery into sections with a divider, start the colored set
Generators now live in gen/<section>/<subject>/<action>.js; the section
folder picks where a tile shows in the gallery and isn't part of the URL.
The first 50 are in gen/bw, a dashed divider follows, then gen/color.

First colored ones: fox/sleep, pig/oink, duck/swim, whale/spout,
turtle/walk, owl/blink, crab/dance, butterfly/flutter, dino/stomp,
jellyfish/pulse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:45:17 +00:00

25 lines
1.3 KiB
JavaScript

// crescent moon sleeping and rocking gently while z's drift up and two stars twinkle
const{sin,cos,PI}=Math,T=2*PI
export const frames=20,delay=90
export default(c,t)=>{
for(const[x,y,p]of[[44,58,0],[214,206,.5]]){
const s=8+6*(1+sin((t+p)*T))/2
c.lineWidth=5;c.beginPath()
for(let k=0;k<8;k++){const r=k%2?s*.35:s,a=k*PI/4-PI/2;c.lineTo(x+r*cos(a),y+r*sin(a))}
c.closePath();c.fill();c.stroke()
}
c.save();c.translate(128,128);c.rotate(.06*sin(t*T));c.translate(-128,-128)
c.lineWidth=7;c.beginPath();c.arc(124,132,72,0,T);c.fill();c.stroke()
c.globalCompositeOperation='destination-out';c.beginPath();c.arc(162,104,63.5,0,T);c.fill();c.globalCompositeOperation='source-over'
c.save();c.beginPath();c.arc(124,132,75.5,0,T);c.clip();c.beginPath();c.arc(162,104,60,0,T);c.stroke();c.restore()
c.lineWidth=5;c.beginPath();c.arc(84,134,9,.15*PI,.85*PI);c.stroke()
c.beginPath();c.arc(100,166,7,.1*PI,.9*PI);c.stroke()
c.lineWidth=3;for(const k of[-5,0,5])c.beginPath(),c.moveTo(80+k-2,154),c.lineTo(80+k+2,148),c.stroke()
c.restore()
for(let k=0;k<3;k++){
const p=(t+k/3)%1,s=22*sin(PI*p),x=156+p*58,y=96-p*72
if(s<2)continue
for(const[l,st]of[[12,'#111'],[5,'#fff']])c.lineWidth=l,c.strokeStyle=st,c.beginPath(),c.moveTo(x-s/2,y-s/2),c.lineTo(x+s/2,y-s/2),c.lineTo(x-s/2,y+s/2),c.lineTo(x+s/2,y+s/2),c.stroke()
}
}