קרטון, נייר דבק, קפיץ אחד קטן ו-JavaScript. בלי ספריות, בלי CDN, בלי תמונות: כל בובה היא SVG שצויר ביד, וכל תפאורה נצבעת בקוד ברגע שהדף נטען.
האתר כולו הוא במה אחת קבועה. המסגרת (הפרוסניום), הווילונות בצדדים, אורות הרצפה והקהל: כולם שכבות fixed שלא זזות לעולם. התוכן גולל ביניהן, כך שכל מה שקורה, קורה "על הבמה".
התפאורות מתחלפות כמו בתיאטרון אמיתי: כשעוברים מערכה, הרקע הנוכחי "עף" למעלה אל מאחורי הקלעים וחושף את הבא בתור, שכבר חיכה מאחוריו.
.backdrop.flown { transform: translateY(-103%) rotate(.4deg); }
/* לכל תפאורה יש z-index לפי הסדר; מי שסיימה את תפקידה עפה למעלה */
כל בובה היא צירוף של שלושה חלקים: ציור SVG בקו עיפרון עבה, פס נייר דבק, ומקל ארטיק ארוך שיורד אל מתחת לבמה. השלושה עטופים באלמנט אחד שנקרא swing, וציר הסיבוב שלו יושב הרחק מתחת לבובה: בדיוק איפה שהיד של המפעיל הייתה אמורה להיות.
.swing { transform-origin: 50% 140%; }
/* מסובבים סביב נקודה שמתחת למסגרת = הבובה מתנדנדת כמו על יד אמיתית */
לחצו על הבובה 👆
כל לחיצה נותנת לה דחיפה אקראית, והקפיץ עושה את השאר. שני מחוונים שולטים באופי שלה:
אין ספריית פיזיקה. יש שתי שורות של אוסצילטור הרמוני מרוסן, שרצות פעם אחת בפריים לכל בובה שנמצאת על המסך, ועוד גל סינוס איטי שנותן לה "נשימה" גם כשאף אחד לא נוגע בה:
v += (-k * angle - c * v) * dt; // קפיץ + ריסון
angle += v * dt;
display = angle + sin(t * freq + phase) * idleAmp; // נדנוד סרק עדין
swing.style.transform = `rotate(${display}deg)`;
ה"אישיות" של כל בובה היא רק שלושה מספרים אקראיים: תדר הסרק, המשרעת והפאזה. בגלל זה אף שתי בובות לא מתנדנדות אותו דבר, וכשכרטיס מערכה קופץ, הדחיפה שהוא מקבל (v += 60) גורמת לו להתייצב בדיוק כמו שלט שננעץ הרגע.
המסך הגדול הוא שני פאנלים של גרדיאנטים (קפלי קטיפה = repeating-linear-gradient), עם פרנזים מוזהבים שגזורים ב-clip-path. בטעינה: שלוש דפיקות, כמו בתיאטרון הצרפתי, ואז שני הפאנלים נפתחים הצידה ב-transform אחד.
מי שממהר מקליק על המסך והוא נפתח מיד. מי שביקש מהמערכת פחות אנימציות (prefers-reduced-motion) מקבל את הבמה כשהיא כבר פתוחה, הבובות יציבות והתפאורות מתחלפות בעדינות.
אין אף קובץ תמונה באתר. כל תפאורה נצבעת ב-JavaScript משני מכחולים בלבד: קו גלי רוחבי (ככה ילד צובע ים), וספירלה מסתלסלת (ככה ילד צובע שמש, ענן או אלמוג). מחולל אקראיות עם seed קבוע דואג שהציור ייצא אותו ציור בכל טעינה.
טיפוגרפיה: Amatic SC לכיתוב היד על השלטים, Rubik לטקסט. שתיהן עם תת-קבוצות עברית, מוגשות כקבצי woff2 מקומיים.
תלויות: אפס. בלי ספריות, בלי CDN, בלי בילד. קובץ HTML אחד, CSS אחד, JS אחד.
צליל: דפיקות עץ ופופים מסונתזים ב-WebAudio, כבויים כברירת מחדל ונדלקים רק בלחיצה על הפעמון.
עיניים: כל גרסה נבדקה בלולאה של Chrome ללא ראש: צילומי מסך בדסקטופ ובמובייל, ספירת שגיאות קונסולה ובקשות שנכשלו, עד לפסק דין CLEAN.