YUV.AIMOTION CATALOG EnglishEN
YUV.AI · MOTION CATALOG

מה אפשר
לבקש.

קטלוג חי של אבני בניין לסרטוני מושן עם AI, מוסבר מאפס

Recharts · shadcn/ui · Lucide · Simple Icons · three.js

▶מתחילים מהיסודותישר לבונה הפרומפטים
גררו כדי לסובב

סרטון מושן (motion graphics) הוא סרטון שבו הכל מצויר ומונפש ולא מצולם: טקסט, גרפים, אייקונים וצורות. בדרך כלל עושים אותו בתוכנה After Effects של Adobe; כאן כותבים אותו כקוד. כל מה שזז בעמוד הזה הוא קוד שרץ עכשיו בדפדפן שלכם. אין כאן אף קובץ וידאו. כל אלמנט הוא משהו שאפשר לבקש מ-Claude לשלב בסרטון, וליד כל אחד יש שלושה דברים: הדגמה חיה שאפשר לגרור בה את הזמן, הסבר מאפס (מה זה, איך זה עובד מתחת למכסה, מתי כן ומתי לא), ופרומפט מלא להעתקה. לא צריך רקע ב-After Effects או בתכנות: כל מונח מוסבר במקום שבו הוא מופיע לראשונה. בעמוד הזה אלמנט הוא אבן בניין שלמה שאפשר להכניס לסרטון, כמו גרף או טלפון תלת-ממדי.

24אלמנטים חיים9מושגי יסוד24פרומפטים מלאים1בונה פרומפטים
HOW

איך לקרוא את הקטלוג

ארבעה חלקים בכל כרטיס, ודוגמה אחת שמלווה את כל העמוד.

LIVEהדגמהכל הדגמה מצוירת מתוך מספר אחד: הזמן. הסרגל שמתחתיה הוא השעון. גררו אותו לכל רגע ותראו בדיוק את התמונה (הפריים) של אותו רגע. כך בדיוק מצלמים סרטון.
WHAT · HOWמה ואיךמה רואים, ואיך זה עובד מתחת למכסה, צעד אחרי צעד. כולל מה הספרייה (קוד מוכן שמישהו אחר כתב, מוסבר ב-0.3) עושה בשבילכם, כדי שתדעו מה אתם מבקשים.
FITמתי כן, מתי לאאיפה האלמנט משרת את הסיפור, ואיפה הוא רק מוסיף רעש. אלמנט יפה במקום הלא נכון מחליש סרטון.
PROMPTפרומפטפרומפט שלם, מוכן להדבקה ב-Claude Code: Claude שעובד ישירות על המחשב שלכם, כותב קבצים, מריץ פקודות ובודק את התוצאה. אפשר להשתמש בפרומפט לבד, או לשלב כמה אלמנטים בבונה הפרומפטים שבסוף.
הדוגמה שמלווה את העמוד: "קצב""קצב" היא אפליקציית כושר בדיונית בעברית. כל אלמנט בקטלוג מוצג כסצנה אפשרית בסרטון ההשקה שלה: הגרף מראה את ההתקדמות של המתאמן, הממשק (מה שרואים ולוחצים עליו במסך: כפתורים, שדות, תפריטים) מראה את האפליקציה עצמה, הטלפון התלת-ממדי מציג אותה על מכשיר. כך רואים לא רק מה כל אלמנט, אלא איפה הוא נכנס בסיפור. את הסרט המלא של "קצב", שנבנה באותה שיטה, אפשר לראות בעמוד השיטה.

כל האלמנטים במבט אחד

00

תשעה מושגים, ואז הכל מובן

בלי אפטר אפקטס ובלי רקע בתכנות. כל מושג נבנה על הקודם, אז כדאי לקרוא לפי הסדר.

0.1

סרטון הוא ערימה של תמונות

ואם אפשר לצייר כל תמונה לפי דרישה, אפשר לייצר סרטון.

סרטון הוא רצף מהיר של תמונות דוממות. כל תמונה כזו נקראת פריים (frame). כשהתמונות מתחלפות מהר מספיק, העין כבר לא רואה תמונות נפרדות אלא תנועה רציפה. כמה מהר? זה ה-fps, ראשי תיבות של frames per second, פריימים בשנייה. בקולנוע מקובל 24, ברשת 30, ובסרטוני מושן של ממשקים 60. למה לא מספיק 24? כי מצלמה מורחת תנועה מהירה (טשטוש תנועה), והמריחה ממלאת את הפער בין התמונות. תמונה שמצוירת בקוד חדה לגמרי, ולכן ב-24 או ב-30 רואים בה קפיצות. ב-60 הקפיצות קטנות מספיק, וגם מסכי טלפונים מתרעננים לפחות 60 פעמים בשנייה.

המחיר של 60: יותר תמונות לחשב. סרטון של 30 שניות ב-60fps הוא 30 × 60 = 1,800 תמונות. כל תמונה בנויה מפיקסלים, ריבועים זעירים בצבע אחד, והרזולוציה אומרת כמה כאלה יש: 1920×1080 הן 1,920 פיקסלים לרוחב ו-1,080 לגובה. היחס בין הרוחב לגובה הוא יחס התמונה: ‏16:9 הוא מסך שוכב (יוטיוב, מצגות), ו-9:16 הוא מסך עומד (רילס, טיקטוק, שורטס).

ומכאן התובנה שעליה עומד כל הקטלוג: כדי לייצר סרטון, מספיק לדעת לצייר את תמונה מספר N. אם יש לכם דרך לצייר כל פריים לפי דרישה, אפשר לבקש את פריים 0, ואז 1, ואז 2, עד 1,799, ולהדביק אותם יחד. זה כל הסוד של "וידאו שהוא קוד".

0.2

דף אינטרנט: שלוש שפות, שלוש שכבות

למה דפדפן הוא מנוע הציור הכי טוב לסרטוני AI.

מאיפה מגיעות התמונות? מדף אינטרנט. הדפדפן (כרום, למשל) הוא מנוע ציור חינמי ועוצמתי להפליא: הוא יודע לצייר טקסט בכל שפה, כולל עברית מימין לשמאל, כל פונט, צורות, תמונות, וידאו, ואפילו תלת-ממד. ו-Claude כותב קוד של דפי אינטרנט בשטף, כי זה סוג הקוד הנפוץ ביותר ברשת.

דף אינטרנט בנוי משלוש שפות, וכל אחת אחראית על שכבה אחרת. בהדגמה למטה יש כפתור אחד מהסרטון של קצב. כבו ודלקו כל שכבה ותראו מה היא תורמת:

  • HTML אומר מה יש על המסך: "יש כפתור, ועליו כתוב התחל אימון". כל פריט כזה, כפתור או כותרת או תמונה, נקרא אלמנט.
  • CSS אומר איך זה נראה: כתום, מעוגל לגמרי, בפונט קרנטינה. בלי CSS תראו את הכפתור האפור והבסיסי של הדפדפן.
  • JavaScript (JS בקיצור) אומר מה קורה. אצלנו: איך הכפתור משתנה עם הזמן. בלי JS הכפתור קופא.
LAB 0.2

שלוש השכבות של כפתור אחד

HTMLCSSJS

שורות ה-JS בהדגמה משתמשות ב-seek וב-spring. לא צריך להבין אותן עכשיו; הן מוסברות בצעדים 0.7 ו-0.8.

ואיך מדף כזה יוצא קובץ וידאו? בעזרת שני כלים חינמיים. Playwright הוא כלי של מיקרוסופט שפותח דפדפן בלתי נראה ומפעיל אותו מתוך קוד: "פתח את הדף, קבע את הזמן ל-0.5 שניות, צלם", וחוזר חלילה 1,800 פעמים. ffmpeg היא תוכנה ותיקה שמדביקה את התמונות, יחד עם המוזיקה, לקובץ MP4 אחד. היא גם דוחסת: 1,800 תמונות מלאות שוקלות כמה ג׳יגה-בייט, וקובץ MP4 שומר בעיקר את מה שהשתנה בין תמונה לתמונה ומוותר על הבדלים זעירים, ולכן הוא קטן פי מאות. המחיר: פרטים עדינים, כמו מעבר צבע איטי, עלולים להיפגע.

0.3

ספרייה, npm ורישיון

למה לא כותבים כל דבר מאפס, ולמה חשוב לנקוב בשם המדויק.

ספרייה היא קוד שמישהו אחר כתב, בדק ושיתף, כדי שלא תצטרכו לכתוב אותו בעצמכם. לצייר גרף נכון, עם צירים, שנתות, תוויות ומרווחים, זו עבודה של שבועות. ספרייה כמו Recharts עושה את זה בעשר שורות. npm הוא המאגר הגדול בעולם של ספריות JavaScript, והוא חינמי: הפקודה npm install recharts מורידה את הספרייה לפרויקט. ספרייה שארוזה בשביל npm נקראת חבילה (package), ויש לה מספר גרסה כמו 3.2.1. המספר הראשון עולה כשהגרסה החדשה כבר לא תואמת לקוד שנכתב לישנה, האמצעי כשמוסיפים יכולת בלי לשבור כלום, והאחרון כשמתקנים תקלה. לכן מציינים גרסה: אם Claude מכיר את גרסה 2 והפרויקט מתקין את 3, חלק מהקוד עלול לא לעבוד. (פקודה כזו מקלידים בטרמינל, חלון טקסט שבו נותנים למחשב הוראות. בפועל, Claude Code מקליד אותה בשבילכם.)

למה זה חשוב בפרומפט? כי Claude מכיר היטב את הספריות הפופולריות ואת הדרך הנכונה להשתמש בהן. כשאתם כותבים "גרף שטח של Recharts", הוא יודע בדיוק מה לבנות. כשאתם כותבים רק "גרף", הוא עלול לאלתר גרסה ביתית שנראית ממוצעת. שם מדויק הופך בקשה עמומה למטרה ברורה.

רישיון הוא האישור המשפטי להשתמש בקוד. כל אלמנט בקטלוג מסומן ברישיון שלו, ושלושה סוגים חוזרים:

  • MIT ו-ISC: מותר כמעט הכל, גם בעבודה מסחרית ללקוח. התנאי היחיד הוא להשאיר את הודעת זכויות היוצרים בקוד.
  • Apache 2.0: דומה, ומוסיף הגנה מפני תביעות פטנטים.
  • CC0: נחלת הכלל. אין שום תנאי.
רישיון קוד הוא לא רישיון לסימן מסחריקובץ הלוגו (בפורמט SVG, שנכיר ב-0.5) יכול להיות חופשי לגמרי, והלוגו עצמו עדיין סימן מסחרי: שם או סמל שהחוק שומר לחברה, כדי שאף אחד לא יציג את עצמו כאילו הוא החברה או פועל מטעמה. מותר להראות לוגו כדי לציין שמוצר עובד עם השירות שלה, אבל אסור לרמוז שהחברה ממליצה עליכם, ורוב החברות אוסרות בהנחיות המותג שלהן לעוות את הלוגו או לצבוע אותו מחדש. ויש כלים שחינמיים רק עד גודל מסוים: Remotion, כלי ליצירת סרטונים מקוד שנכיר בפרק 09, חינמי ליחידים ולחברות של עד שלושה עובדים. לפני עבודה מסחרית, בדקו.
0.4

רכיב ו-React

אבני לגו עם הגדרות, ולמה הן מושלמות לווידאו.

רכיב (component) הוא אבן בניין שאפשר להשתמש בה שוב ושוב, עם הגדרות. כמו לבנת לגו שמגיעה בכמה צבעים וגדלים: אותו כפתור יכול להיות כתום או שקוף, גדול או קטן. ההגדרות האלה נקראות props. React היא ספרייה של Meta לבניית ממשקים מתוך רכיבים. במקום להגיד לדפדפן "תזיז את זה, תצבע את זה", מתארים לה איך המסך צריך להיראות בהינתן הנתונים. בכל פעם שהתיאור משתנה, React משווה אותו לתיאור הקודם ומשנה בדף רק את מה שבאמת השתנה.

וזה בדיוק מה שווידאו צריך. מחשבים מהזמן את הנתונים של הפריים ("בשנייה 3.6 ההתקדמות היא 72%"), נותנים אותם ל-React, והיא מציירת בדיוק את הפריים הזה. אותו קלט נותן תמיד אותה תמונה. פונקציה היא מתכון בקוד: מכניסים לה ערך (קלט) והיא מחזירה תוצאה (פלט), למשל זמן נכנס ואחוז התקדמות יוצא. לפונקציה שאין לה זיכרון נסתר, והתוצאה שלה תלויה רק בקלט, קוראים פונקציה טהורה:

a React component that is a pure function of time
function Frame({ t }) {                       // t = the time in seconds
  const progress = Math.min(100, t * 20);     // 0% at t=0, 100% at t=5
  return <Progress value={progress} />;       // a ready-made progress-bar component
}

ההתקדמות היא t כפול 20, אבל לא יותר מ-100 (Math.min בוחר את הקטן מבין השניים). את המספר מעבירים לרכיב מוכן שמצייר פס התקדמות (Progress, נכיר אותו בפרק 02).

0.5

וקטור מול רסטר

למה לוגו ואייקון צריכים להיות SVG.

יש שתי דרכים לשמור תמונה. וקטור שומר תיאור: "עיגול, המרכז כאן, הרדיוס כזה, הצבע כתום". כשמגדילים, המחשב מצייר מחדש מהתיאור, ולכן הקצוות חדים בכל גודל. פורמט הווקטור של הרשת נקרא SVG. רסטר שומר טבלה של פיקסלים (PNG, JPG): כשמגדילים, כל פיקסל הופך לריבוע גדול, או נמרח אם מפעילים החלקה.

במושן זה קריטי, כי המצלמה עושה זום: דחיפה של פי 3 על לוגו היא הגדלה של פי 3. בהדגמה, שני הצדדים מציגים בדיוק את אותו אייקון. הגדילו את הזום וראו מה קורה לכל אחד:

LAB 0.5

אותו אייקון, שתי דרכים לשמור אותו

SVGPNG

הכלל: לוגואים, אייקונים, צורות וטקסט, תמיד וקטור. צילומים הם רסטר מטבעם, וזה בסדר, רק דאגו שהרזולוציה שלהם גבוהה מהגודל שבו יופיעו אחרי הזום.

0.6

שלוש דרכים לצייר: DOM, ‏Canvas, ‏WebGL

ולמה חלקיקים ותלת-ממד צריכים את כרטיס המסך.

  • DOM (קיצור של Document Object Model) הוא הדרך הרגילה. הדפדפן מחזיק כל אלמנט כאובייקט בזיכרון, עם כל הסגנונות שלו, מחשב מי נמצא איפה ומצייר. מצוין לטקסט ולממשקים, ואיטי כשיש אלפי אלמנטים, כי על כל אחד צריך לשמור ולחשב.
  • Canvas הוא לוח ציור ריק של פיקסלים. נותנים לו פקודות ("צייר עיגול כאן") בכל פריים, והוא לא זוכר מה צויר. מהיר מאוד לאלפי צורות, אבל הכל עליכם: אין פריסה אוטומטית, אין שבירת שורות.
  • WebGL היא דרך לצייר דרך כרטיס המסך (GPU). למעבד הרגיל יש מעט ליבות חזקות שעובדות אחת אחרי השנייה; לכרטיס מסך יש אלפי ליבות קטנות שמחשבות אלפי נקודות במקביל. לכן תלת-ממד ועשרות אלפי חלקיקים עוברים דרכו. הספרייה three.js הופכת אותו לנוח לשימוש.

בהדגמה, אותן נקודות מצוירות בשלוש הדרכים, והזמן נמדד עכשיו במכשיר שלכם. הזיזו ל-30,000 ולחצו "מדוד עכשיו":

LAB 0.6

כמה עולה לצייר N נקודות

DOMCanvas 2DWebGL

למה המספר 16.7 מסומן? ב-60fps יש לכל פריים 1000 ÷ 60 = 16.7 אלפיות שנייה. מה שלוקח יותר, מגמגם בצפייה חיה. אבל שימו לב לניואנס החשוב: כשמייצרים קובץ וידאו, אין תקציב. ‏Playwright מחכה לכל פריים כמה שצריך, אז סצנה כבדה שמגמגמת בתצוגה המקדימה (הניגון החי בדפדפן בזמן העבודה, לפני שמייצרים קובץ) תצא חלקה לגמרי בסרטון. בתנאי אחד, שהוא הנושא של הצעד הבא: שהדף מצייר כל פריים לפי מספר זמן שנותנים לו, ולא לפי השעון. התקציב חשוב לתצוגה המקדימה ולמהירות העבודה, לא לתוצאה.

0.7

השעון t: למה אנימציה של ספרייה שוברת וידאו

הכלל שחל על כל אלמנט בקטלוג הזה.

רוב הספריות מנפישות לפי השעון שעל הקיר: "תזיז את זה במשך שנייה וחצי של זמן אמיתי". בדפדפן זה מושלם. אבל בזמן צילום סרטון, כל פריים לוקח 100 עד 500 אלפיות שנייה לצלם, כי בכל צילום הדפדפן צריך לסיים לצייר, להפוך כ-2 מיליון פיקסלים לקובץ תמונה ולהעביר אותו לתוכנה שמצלמת. זה פי 6 עד 30 יותר מ-16.7 אלפיות השנייה של ניגון חי. בינתיים האנימציה של הספרייה ממשיכה לרוץ בזמן אמיתי, ותוך כמה פריימים היא כבר נגמרה. הסרטון קופץ.

הפתרון, שמופעל בכל הדגמה בעמוד: מכבים את האנימציה של הספרייה ומחשבים הכל מתוך t. פריים מספר i מקבל t = i ÷ 60, ומצייר את מה שצריך להיות על המסך ברגע הזה. כך פריים 37 הוא תמיד אותה תמונה, לא משנה כמה זמן לקח לצלם אותו. לפונקציה שמציירת את התמונה של רגע t קוראים seek(t). ההדגמה מצלמת 12 פריימים בשתי השיטות, עם זמני צילום אקראיים כמו במציאות:

LAB 0.7

שעון קיר מול seek(t)

seek(t)Playwright

בשורה העליונה, הנקודה מגיעה לסוף כבר אחרי פריים או שניים, והשאר מבוזבזים. בשורה התחתונה, כל פריים מראה צעד קטן ושווה. בכל פרומפט בעמוד הזה תמצאו את המשפט שאוכף את זה. לרוב הספריות יש דרך לכבות את האנימציה המובנית שלהן: בספריית הגרפים Recharts (פרק 01) זו הגדרה אחת, isAnimationActive={false}. לרכיבי הממשק שנכיר בפרק 02 אין מתג כזה, ולכן מוחקים מהקוד שלהם את ההוראות שגורמות לדפדפן להנפיש לבד.

0.8

תנועה שנראית אמיתית: האטה וקפיץ

למה תנועה במהירות קבועה נראית רובוטית.

שום דבר בעולם לא זז במהירות קבועה: כדור מאיץ כשהוא נופל, דלת מאטה לפני שהיא נסגרת. תנועה במהירות קבועה (ליניארית) נראית לכן מכנית. Easing, או האטה, היא עקומה שממירה "כמה מהזמן עבר" (מ-0 עד 1) ל"כמה מהדרך עברנו". יש לה שלוש צורות נפוצות, ותראו את השמות שלהן בפרומפטים: ease-in מאיצה בהתחלה, ease-out מאטה בסוף, ו-ease-in-out עושה את שתיהן.

קפיץ הוא עקומה שעוברת קצת את היעד וחוזרת, כמו דלת על ציר קפיצי. יש לו שתי הגדרות: קשיחות (כמה מהר הוא מגיע) וריסון (כמה מהר הקפיצות נבלמות: ריסון גבוה, פחות קפיצות). בקטלוג מחשבים את הקפיץ בנוסחה סגורה: מציבים t ומקבלים מיד את המיקום, בלי לחשב את כל הפריימים שלפניו. לכן הוא מציית לכלל של t:

a closed-form spring: position at time t, straight from the formula
const spring = (t, w = 12, z = 0.8) => {    // w = frequency (higher = faster), z = damping, must stay below 1
  if (t <= 0) return 0;
  const wd = w * Math.sqrt(1 - z * z);
  return 1 - Math.exp(-z * w * t) * (Math.cos(wd * t) + (z * w / wd) * Math.sin(wd * t));
};
// spring(0.1) = 0.38, spring(0.2) = 0.79, spring(0.4) = 1.013 (just past the target), spring(0.6) = 1.005, then 1

איך לקרוא את זה: בקוד, w היא הקשיחות (מספר גבוה יותר, קפיץ מהיר יותר; טכנית זו התדירות שלו) ו-z הוא הריסון. Math.exp(…) הוא הבלם, מספר שמתחיל ב-1 וקטן עם הזמן, ולכן התנודה דועכת. cos ו-sin עולות ויורדות בגל חלק ומחזורי בין ‎-1 ל-1, והן התנודה עצמה. (אם המיקום האופקי של נקודה הוא cos של t והאנכי הוא sin של t, הנקודה נעה במעגל. כך זזים העיגולים בכמה מהאפקטים בהמשך.) z חייב להישאר מתחת ל-1, כי ב-1 הנוסחה מחלקת באפס; 0.99 הוא כמעט בלי קפיצה. כשתראו בפרומפטים "closed-form springs", זה מה שזה אומר. מעבדה אינטראקטיבית שמאפשרת לשחק בקשיחות ובריסון יש בפרק הקפיצים בעמוד השיטה.

0.9

איך מבקשים: שישה בלוקים

השלד שעליו בנוי כל פרומפט בקטלוג.

כל הפרומפטים כאן בנויים באותו שלד, שפיתח היוצר zero (@twoclipping) לסרטוני ההשקה שלו. מודל שפה שלא מקבל הוראות מדויקות נותן את הממוצע של מה שראה, ובמושן הממוצע הוא "תבנית": רקע כהה, זוהר, חלקיקים ופייד (מעבר שבו תמונה אחת נמוגה לאט ומתחתיה מופיעה הבאה). ששת הבלוקים מוחקים את הממוצע:

  • <inputs>: מה Claude צריך לבקש מכם לפני שהוא מתחיל (נתונים, לוגו, מוזיקה), ומה לעשות אם לא נתתם.
  • <direction>: הטעם. פורמט, צבעים בקוד מדויק, פונטים בשם, ורשימה של מה אסור. צבע מדויק נכתב כך: #FF8F3A. אלה שלושה זוגות תווים: כמה אדום, כמה ירוק וכמה כחול, מ-00 (כלום) עד FF (הכי הרבה, 255). הרבה אדום, קצת ירוק ומעט כחול נותנים כתום, וכך Claude מקבל בדיוק את הגוון.
  • <structure>: מה קורה מתי, בביטים של המוזיקה. ביט הוא פעימה אחת של השיר, והקצב נמדד בפעימות לדקה (באנגלית BPM). ב-120 BPM: ‏60 שניות חלקי 120 = חצי שנייה לביט. 120 נפוץ במוזיקה פופולרית, והמספרים יוצאים עגולים: ביט אחד = 0.5 שנייה = 30 פריימים ב-60fps.
  • <build>: איך לבנות. כאן נכנס כלל ה-t וההוראות הטכניות של כל ספרייה.
  • <gotchas>: באגים מוכרים מראש, כדי ש-Claude ימנע מהם בכתיבה הראשונה.
  • <start>: שער אישור זול. קודם מפת ביטים (רשימה של מה קורה על כל ביט) וארבע סטילס (תמונות בודדות מהסרט), ורק אחרי האישור שלכם הסרט המלא. זה זול, כי ארבע תמונות נוצרות בשניות, בעוד שהרינדור, הפקת כל הפריימים לקובץ הסופי, לוקח דקות ארוכות.

הפרומפטים באנגלית מסיבה מעשית: שמות הספריות, הפונקציות והמונחים הטכניים ממילא באנגלית, וכך הם עובדים בכל כלי. הטקסט שיופיע על המסך כתוב בתוכם בעברית. פירוק מלא של כל בלוק, ולמה הוא עובד על מודל שפה, יש בפרק האנטומיה בעמוד השיטה.

01

נתונים וגרפים

הרגע שבו הסרטון מוכיח משהו: צמיחה, תוצאות, התקדמות.

סרטון השקה טוב עונה על "למה להאמין לכם?", ולרוב התשובה היא מספר. בסרטון של קצב, זה הרגע שבו המתאמן רואה כמה התקדם בחודש. ארבעת האלמנטים כאן הם ארבע דרכים להראות מספר: קו שמתפתח בזמן, השוואה בין ימים, מספר אחד גדול, ואחוז מיעד.

הספרייה שבה משתמשים כאן היא Recharts: אוסף רכיבי React לגרפים, שמצייר אותם כ-SVG (כלומר וקטור, חד בכל זום). מתחת למכסה היא נעזרת בחלקים של ספרייה בשם D3 בשביל החישובים: איפה כל שנתה, איך מעגלים עקומה. היא חינמית ברישיון MIT, והגרסה הנוכחית היא 3. החלופות העיקריות, ומתי לבחור בהן:

  • Chart.js: מצייר על Canvas ולא צריך React. מהיר ופשוט, פחות גמיש בעיצוב. MIT.
  • Apache ECharts: מאות סוגי גרפים, כולל מפות. כבד יותר. Apache 2.0.
  • D3: השכבה הנמוכה עצמה. שליטה מלאה בכל פיקסל, והרבה יותר קוד. ISC.

הכלל לבחירה: אם הפרויקט ב-React והגרף סטנדרטי, Recharts. אם צריך צורה שאין לה שם, D3. ובכל מקרה, האנימציה המובנית כבויה והכל מחושב מ-t.

01.1

גרף שטח שמצטייר

RechartsReactSVGMIT

מה רואים

30 ימים של דקות אימון באפליקציית "קצב". הקו מצטייר משמאל לימין, נקודה כתומה רוכבת על הקצה שלו, ובסוף נוחת קו מקווקו של היעד: 60 דקות. הצופה רואה את המגמה נבנית, במקום לקבל אותה מוכנה.

נסו

סמנו "תנו ל-Recharts להנפיש לבד". עכשיו הספרייה מנפישה לפי שעון הקיר, והסרגל כבר לא שולט בה. זו בדיוק האנימציה שהייתה נשברת בצילום.

איך זה עובד

  • בכל פריים מחשבים מ-t כמה מהקו כבר נחשף, ומעבירים ל-Recharts רק את הנקודות האלה, ועוד נקודת ביניים אחת כדי שהקצה יזוז בצורה רציפה ולא בקפיצות של יום שלם.
  • isAnimationActive={false} מכבה את האנימציה של הספרייה. החשיפה היא שלנו.
  • type="monotone" מעגל את הקו בלי לעבור מעל הנתונים, כך שלא מומצאים שיאים שלא היו.
  • המילוי הוא מעבר צבע מכתום לשקוף, והיעד הוא ReferenceLine שעוביו גדל על קפיץ.
מתי כןרגע ההוכחה: "תראו כמה התקדמתם". מגמה אחת, ברורה, עם סוף שנוחת על הביט.
מתי לאיותר משלושה קווים, או ערכים מדויקים שהצופה צריך לקרוא בשתי שניות. במקרה כזה, מספר גדול אחד (01.3) עובד טוב יותר.
פרומפט מלא
area chart · Recharts · paste into Claude Code
<inputs>
Ask me for the data series (one value per day) and its label. If I skip it, invent a plausible 30-day series of workout minutes that trends upward with natural noise, and say so.
</inputs>

<direction>
A 7-second clip, 1920x1080, 60fps. A Recharts AreaChart draws itself from left to right as the data is revealed. A dot in the accent colour rides the tip of the line. At the end, a dashed goal line at 60 lands on a beat with the label "יעד: 60 דקות".
Look: light background #EEF3FB, navy text and grid #12163F, the line is a gradient #FFC74E → #FF8F3A → #F56B49, the area fill is the same orange fading to transparent. Axis labels in Hebrew in Assistant; the title in Karantina 700. Swap the colours and fonts for your brand.
Banned: 3D charts, drop shadows on the line, legends that nobody needs, gridlines on both axes.
</direction>

<structure>
120 BPM, a beat every 0.5s. Beats 0-1: the empty axes. Beats 1-9: the line draws with an ease-in-out. Beat 10: the goal line springs in. Beats 10-13: hold, with the dot pulsing once per beat.
</structure>

<build>
One HTML file with React and Recharts that exposes window.seek(t). Every frame is computed from t alone: no CSS transitions, no timers, no state between frames.
Set isAnimationActive={false} on every series. For each frame, compute how far along the line we are, pass only the points revealed so far plus one interpolated point at the tip, and render with flushSync so the DOM is ready before the screenshot.
Use type="monotone" for the curve. The goal line's stroke width and label size come from a closed-form spring of t.
Render with Playwright at 60fps and assemble with ffmpeg.
</build>

<gotchas>
- Recharts animates on its own clock by default. If isAnimationActive is left on anywhere, captured frames jump.
- Fix the Y axis domain (for example 0 to 80), or the axis rescales every frame as points are added.
- Wait for document.fonts.ready before the first frame.
</gotchas>

<start>
Show me 3 stills (beat 1, beat 6, beat 12) before rendering the full clip.
</start>
01.2

עמודות שנוחתות על הביט

RechartsBarChartMIT

מה רואים

שבוע של אימונים. כל עמודה קופצת למעלה בביט משלה, חצי שנייה אחרי הקודמת, עוברת קצת את הגובה שלה וחוזרת. העמודה של היום צבועה במעבר הצבע "אש" של המותג (צהוב, כתום, אדום). הימים מסודרים מימין לשמאל, כמו שקוראים בעברית.

איך זה עובד

  • הגובה של כל עמודה = הערך שלה × spring(t − הזמן של הביט שלה). מחסירים את זמן הביט כדי לאפס את השעון של כל עמודה בנפרד: לפני הביט שלה התוצאה שלילית, והקפיץ מחזיר 0, כלומר העמודה עוד לא התחילה. הקפיץ עובר קצת את 1 וחוזר, ולכן העמודה "נוחתת" במקום לעצור יבש.
  • המספר מעל העמודה מופיע רק כשהיא עברה 60% מהדרך, כדי שלא יקפוץ לפניה.
  • הצבע של היום מגיע מ-Cell, רכיב של Recharts שמאפשר צבע שונה לכל עמודה.
מתי כןהשוואה בין 4 עד 12 פריטים, והדגשה של אחד מהם. מושלם לקצב מוזיקלי, כי כל עמודה היא ביט.
מתי לאיותר מ-12 עמודות: הן נעשות דקות מדי לקריאה במסך טלפון, והאנימציה נמשכת יותר מדי.
פרומפט מלא
bar chart on the beat · Recharts
<inputs>
Ask me for the 7 values and which bar to highlight. If I skip them, use workout minutes for a week (Sunday to Saturday) and highlight Friday.
</inputs>

<direction>
A 5.5-second clip, 1080x1920 for Reels, 60fps. A Recharts BarChart of 7 days where each bar springs up on its own beat, overshoots slightly and settles. The highlighted bar is filled with the gradient #FFC74E → #FF8F3A → #F56B49; the others are navy #12163F on a light #EEF3FB background. Day labels in Hebrew (א׳ to ש׳), ordered right to left. The value appears above each bar once it is most of the way up.
Banned: bars growing all at once, bouncing more than once, 3D bars.
</direction>

<structure>
120 BPM. Bar i lands on beat i+1 (0.5s apart). The highlighted bar gets a small extra scale pop on its beat.
</structure>

<build>
One HTML file with React and Recharts that exposes window.seek(t); every frame is computed from t alone, no CSS transitions or timers.
BarChart with isAnimationActive={false}. Each bar's value = target × spring(t − beatTime), where spring is this closed-form damped spring with ω = 13 and ζ = 0.5: spring(t) = 1 − e^(−ζωt)·(cos(ω_d·t) + (ζω/ω_d)·sin(ω_d·t)), ω_d = ω·√(1 − ζ²). Use Cell for per-bar colours. Render each frame with flushSync. Capture with Playwright at 60fps and assemble with ffmpeg.
</build>

<gotchas>
- Clamp the spring at 0 so a bar never dips below the axis.
- Fix the Y domain so the axis does not rescale while bars grow.
- Reverse the data order (or use reversed on the X axis) so the week reads right to left.
</gotchas>

<start>
Show me stills at beats 2, 5 and 10 before the full render.
</start>
01.3

מונים שעולים

CSStabular-numsIntl.NumberFormat

מה רואים

שלושה מספרים שרצים מאפס לערך הסופי, כל אחד בתורו, ונוחתים עם קפיצה קטנה מעבר לערך וחזרה. בלי ספרייה בכלל: זה רק מספר שמחושב מ-t ונכתב לתוך אלמנט.

נסו

בטלו את "ספרות ברוחב קבוע" ותראו את המספרים רועדים בזמן הספירה.

למה הם רועדים

בהרבה פונטים, למשל Inter שבו כתובים המספרים כאן, הספרה 1 צרה יותר מהספרה 8. הן נקראות ספרות פרופורציונליות. כשהמספר משתנה בכל פריים, הרוחב שלו משתנה, וכל מה שמסביבו זז. הפתרון הוא תכונה של הפונט שנקראת tabular-nums: כל הספרות מקבלות רוחב זהה, כמו בטבלה. (זה עובד רק אם הפונט כולל ספרות כאלה; ל-Inter יש.) שורה אחת של CSS: font-variant-numeric: tabular-nums.

ובשביל הפסיקים של האלפים (1,248) משתמשים ב-Intl.NumberFormat, הכלי המובנה בדפדפן לעיצוב מספרים לפי שפה.

מתי כןמספר אחד שהוא הסיפור: "1,248 דקות". הוא נקרא מיד, גם בטלפון.
מתי לאיותר משלושה מונים באותו רגע: העין לא יודעת על מה להסתכל.
פרומפט מלא
count-up KPI tiles
<inputs>
Ask me for up to three KPIs (value, label, optional suffix like % or +). If I skip them, use: 1,248 "דקות אימון", 30 "ימים ברצף", +38% "שיפור החודש".
</inputs>

<direction>
A 4.5-second clip, 1920x1080, 60fps. Three KPI tiles side by side, ordered right to left. Each number counts up from 0 to its value and lands with a small overshoot, one tile per beat. Numbers in Inter 800, labels in Hebrew in Karantina 700. Light tiles #EEF3FB on white, navy numbers #12163F, the middle number in orange #B4501A.
Banned: slot-machine rolling digits, confetti, numbers that keep moving after they land.
</direction>

<structure>
120 BPM. Tile 1 starts on beat 1, tile 2 on beat 2, tile 3 on beat 3. Each count lasts 1.2s with an ease-out and a tiny spring at the end.
</structure>

<build>
One HTML file exposing window.seek(t); every value is computed from t alone, no timers or CSS transitions.
displayed = round(target × easeOut(progress(t))); format with Intl.NumberFormat('he-IL'); keep the suffix outside the number in its own span. Use font-variant-numeric: tabular-nums on every number. Capture with Playwright at 60fps, assemble with ffmpeg.
</build>

<gotchas>
- Without tabular-nums the numbers change width every frame and the tiles shake.
- Isolate the "+" and "%" with unicode-bidi: isolate, or they jump to the wrong side in RTL.
</gotchas>

<start>
Show me one still mid-count and one at the end before rendering.
</start>
01.4

טבעת התקדמות

SVGstroke-dasharray

מה רואים

טבעת שמתמלאת ל-78% מהיעד השבועי, עם המספר שעולה במרכז. הטבעת של אפליקציות הכושר, מצוירת בקוד, בלי שום ספרייה.

נסו

סמנו "הראו את קו המתאר המלא" ותראו שהטבעת היא בעצם קו מקווקו ארוך אחד.

איך זה עובד

ב-SVG אפשר להפוך את קו המתאר של עיגול לקו מקווקו. stroke-dasharray קובע את אורך המקטע וגם את אורך הרווח שאחריו, ו-stroke-dashoffset מזיז את נקודת ההתחלה של התבנית. הטריק: קובעים מקטע ורווח שניהם באורך ההיקף כולו (2πr: פעמיים פאי, כ-6.28, כפול הרדיוס r). כשמזיזים את המקטע, הרווח נכנס במקומו, כלומר כלום, ורק חלק מהמקטע נשאר גלוי:

offset = היקף × (1 − התקדמות). כשההתקדמות 0, המקטע כולו מחוץ לעיגול. כש-1, הוא מכסה הכל. המספרים מתעדכנים חי בתיבה הכהה. ומסובבים את העיגול ב-‎−90°, כי ב-SVG עיגול מתחיל בשעה 3, ואנחנו רוצים שיתחיל בשעה 12.

מתי כןאחוז מיעד, ספירה לאחור, טעינה. צורה שכולם מזהים מהשעון והטלפון.
מתי לאהשוואה בין כמה ערכים: טבעות מקוננות קשות לקריאה. עמודות (01.2) ברורות יותר.
פרומפט מלא
progress ring · SVG
<inputs>
Ask me for the goal and the reached value. If I skip them, fill to 78% with the label "מהיעד השבועי".
</inputs>

<direction>
A 4-second clip, 1080x1080, 60fps. A circular progress ring fills from 12 o'clock to its value with a spring that settles, while the percentage counts up in the centre. Track in navy at 10% opacity, the arc in the gradient #FFC74E → #FF8F3A → #F56B49 with round caps, 22px thick at a 92px radius (scale up for 1080). Number in Inter 800, label in Hebrew in Karantina 700.
Banned: glow, multiple nested rings, a ring that spins after it lands.
</direction>

<structure>
Beat 1: the track appears. Beats 1-5: the arc fills with a closed-form spring, ω = 6 and ζ = 0.85: spring(t) = 1 − e^(−ζωt)·(cos(ω_d·t) + (ζω/ω_d)·sin(ω_d·t)), ω_d = ω·√(1 − ζ²). Beat 6: a small scale pop on the number.
</structure>

<build>
One HTML file exposing window.seek(t); every attribute is computed from t, no CSS transitions.
SVG circle with stroke-dasharray = 2πr and stroke-dashoffset = 2πr × (1 − progress(t)), rotated −90° around its centre so it starts at 12 o'clock. The number uses tabular-nums. Capture with Playwright at 60fps, assemble with ffmpeg.
</build>

<gotchas>
- With round caps, a 0% ring still shows a dot. Hide the arc until progress passes 1%.
- Set the dash values as attributes every frame; a CSS transition on stroke-dashoffset would run on the wall clock.
</gotchas>

<start>
Show me a still at 50% and at the end before rendering.
</start>
02

ממשק אמיתי עם shadcn/ui

סרטון מוצר צריך אפליקציה שנראית אמיתית. הנה איך מקבלים אחת, בלי לעצב אותה מאפס.

הסצנה הכי חשובה בסרטון של קצב היא סיור באפליקציה: מישהו מקליד, לוחץ, מחליף לשונית, ורואים שהמוצר עובד. כדי שזה ייראה כמו אפליקציה אמיתית, בונים אותו מרכיבי ממשק אמיתיים. שלושה מושגים, אחד על השני:

  • Tailwind CSS היא דרך לכתוב עיצוב בעזרת מחלקות: מחלקה (class) היא תווית שמדביקים על אלמנט, וה-CSS קובע מה כל תווית עושה. ב-Tailwind כל תווית עושה דבר אחד קטן, ולכן במקום לכתוב קובץ CSS נפרד, כותבים rounded-full bg-primary px-4: מעוגל לגמרי, בצבע הראשי, ריווח אופקי.
  • Radix היא ספרייה של רכיבים בלי עיצוב בכלל, שמטפלת בכל ההתנהגות: מקלדת, פוקוס, ותוכנות שמקריאות את המסך בקול לאנשים עם לקות ראייה. לשונית שעובדת נכון עם מקש Tab, למשל.
  • shadcn/ui מחברת את שתיהן. היא מגדירה את עצמה "לא ספריית רכיבים": במקום להתקין חבילה, מעתיקים את הקוד של כל רכיב לפרויקט (npx shadcn add button), והוא שלכם לשנות. זה בדיוק מה שמאפשר להתאים אותה לווידאו.

shadcn/ui פופולרית מאוד, ולכן היא נראית "כמו אפליקציה אמיתית". מאותה סיבה היא גם עלולה להיראות גנרית. בהדגמה למטה כל הרכיבים קיבלו את צבעי Phoenix, פלטת המותג של YUV.AI (נייבי, כתום, זהב), ואת הפונט קרנטינה, וזה מה שהופך אותם לשלכם.

02.1

סיור באפליקציה, מרכיבים אמיתיים

shadcn/uiRadixTailwindReactMIT
  1. Card נכנסכרטיס עם כותרת, שעולה על קפיץ.
  2. Input מקבל הקלדה"אימון בוקר", אות כל 0.14 שנייה, עם סמן שנמדד לפי רוחב הטקסט.
  3. Button נלחץהסמן מגיע, לוחץ, והכפתור מתכווץ ומשנה צבע.
  4. Progress מתמלאמ-0 ל-72% על קפיץ איטי.
  5. Tabs מתחלפותהיום ← שבוע ← חודש, והמספר הגדול מתעדכן.
  6. Switch נדלקהכפתור הקטן קופץ לצד השני.
  7. Slider זזעצימות מ-30 ל-80.
  8. Alert צונחהודעה: היעד השבועי הושג.
  9. Badge קופץתווית קטנה שקופצת מעבר לגודלה וחוזרת.

מה רואים

מסך של קצב שבנוי מתשעה רכיבים אמיתיים של shadcn/ui. הרשימה בצד מסמנת איזה רכיב פועל עכשיו. גררו את הסרגל אחורה ותראו שכל רכיב חוזר בדיוק למצב של אותו רגע, גם הלשונית, גם המתג.

רכיב מבוקר: המושג החשוב כאן

מתג רגיל זוכר בעצמו אם הוא דלוק. זה נקרא מצב פנימי. בסרטון זו בעיה: אם המתג "זוכר" שהוא נדלק, ואתם קופצים אחורה בזמן, הוא יישאר דלוק. לכן כל רכיב כאן הוא מבוקר (controlled): הוא לא מחליט כלום לבד. בכל פריים אומרים לו מבחוץ מה המצב, למשל checked={t > 6.6}.

איך זה עובד

  • הרכיבים הועתקו מ-shadcn/ui, וכל מחלקות ה-transition נמחקו מהם. מחלקה כזו גורמת לדפדפן להנפיש שינויים לבד, לפי שעון הקיר.
  • כל ערך הוא פונקציה של t: הטקסט שהוקלד, הלשונית הפעילה, מיקום המתג, ערך המחוון.
  • הסמן של העכבר מחשב את המיקום של הכפתור האמיתי על המסך, ומגיע אליו בתנועה עם האטה.
  • הצבעים מוגדרים פעם אחת כמשתנים (--primary, --accent). משתנה הוא שם לערך ששומרים פעם אחת, וכל אלמנט "יורש" את המשתנים של האלמנט שעוטף אותו. לכן מגדירים אותם פעם אחת למעלה, וכל הרכיבים מקבלים אותם. כך מחליפים מותג בשורה אחת.
מתי כןסרטון מוצר, הדגמת פיצ'ר, "ככה זה עובד". כשהצופה צריך להאמין שיש אפליקציה אמיתית.
מתי לאכשיש לכם צילומי מסך אמיתיים ומוצר קיים: עדיף להשתמש במסכים האמיתיים שלכם, ולבנות מחדש רק את מה שזז.
פרומפט מלא
app tour · shadcn/ui · paste into Claude Code
<inputs>
Ask me for my app's name, its main screen (screenshot or description) and the one action the tour should show. If I skip them, invent a believable Hebrew fitness app called "קצב" with a workout card.
</inputs>

<direction>
An 11-second product tour, 1080x1920, 60fps, built from real shadcn/ui components: Card, Input, Button, Progress, Tabs, Switch, Slider, Alert and Badge. A cursor types "אימון בוקר" into the search input with a real keystroke rhythm, clicks the start button, the weekly progress fills to 72%, the tabs switch day → week → month, a reminders switch flips on, an intensity slider moves from 30 to 80, an alert drops in ("יעד שבועי הושג") and a badge pops.
The UI is right to left (dir="rtl"). Restyle the shadcn tokens to my brand: navy #12163F as --primary, orange #FF8F3A as --accent, #EEF3FB as --background, radius 28px. Headlines in Karantina 700, UI text in Assistant.
Banned: default shadcn grey look, default Tailwind colours, generic lorem ipsum, a cursor that teleports.
</direction>

<structure>
Card enters 0-0.9s, typing 0.9-2.4s, click at 3.1s, progress 3.4-4.4s, tabs at 4.4s and 5.4s, switch at 6.6s, slider 7.2-8.8s, alert at 8.8s, badge at 9.6s. Every event lands on a beat at 120 BPM.
</structure>

<build>
One HTML file with React, exposing window.seek(t). Add the components with npx shadcn add (or copy their source), then:
- Delete every transition-* and animate-* class from them.
- Make every component controlled: value, checked, the active tab and the slider value are props computed from t. Render each frame with flushSync.
- The cursor's target is measured from the real button's bounding box; its path is an ease-in-out from off-screen.
- Measure the typed text width with canvas measureText so the caret sits exactly after the last letter.
Capture with Playwright at 60fps, assemble with ffmpeg.
</build>

<gotchas>
- Radix components keep internal state. If they are not controlled from t, scrubbing backwards leaves them in the wrong state.
- In RTL, the Progress indicator and the Switch thumb must move from right to left; flip their translate direction.
- Tailwind's preflight reset can break the rest of the page; scope it or disable it.
</gotchas>

<start>
Show me 4 stills (typing, click, tabs on month, alert) before the full render.
</start>
03

אייקונים ולוגואים רשמיים

אלפי סמלים חינמיים, ומה מותר לעשות איתם.

שני סוגים של סמלים נכנסים כמעט לכל סרטון. אייקונים הם סמלים כלליים: משקולת, להבה, שעון. לוגואים הם סמלים של חברות: GitHub, React, Claude. לשניהם יש ספריות חינמיות ענקיות, וכולם וקטור (SVG), אז הם חדים בכל זום.

03.1

אייקונים שמצטיירים

Lucidelucide-reactSVGISC

מה רואים

שמונה אייקונים של כושר, כל אחד מצייר את עצמו קו אחרי קו, ברבע שנייה אחרי הקודם, ובסוף נדלקים בכתום. נסו את מחוון עובי הקו: אותם אייקונים, אופי אחר לגמרי.

מה זה Lucide

ספריית אייקונים בקוד פתוח עם קרוב לאלפיים אייקונים, ברישיון ISC (מותר הכל, גם מסחרי). כל האייקונים מצוירים בקווים בעובי אחיד על רשת של 24×24, ולכן הם נראים כמו משפחה אחת. lucide-react נותנת כל אייקון כרכיב React: <Dumbbell />.

איך זה עובד

זה אותו טריק של הטבעת (01.4): מודדים את האורך של כל קו (getTotalLength), הופכים אותו לקו מקווקו עם מקטע אחד באורך הזה, ומזיזים את המקטע מ"מוסתר" ל"גלוי" לפי t. אייקון שבנוי מכמה קווים מצייר אותם אחד אחרי השני.

קיצור דרך: אם נותנים לכל קו pathLength="1", הדפדפן מתייחס לכל קו כאילו אורכו 1, ואז לא צריך למדוד.

מתי כןרשימת פיצ'רים, שלבים, "מה תקבלו". ציור עצמי מושך את העין לפריט הבא.
מתי לאערבוב של שתי ספריות אייקונים באותו סרטון: עוביים וסגנונות שונים נראים מרושלים.
פרומפט מלא
self-drawing icons · Lucide
<inputs>
Ask me for the features to show (a short Hebrew label each). If I skip them, use 4 fitness features: אימון כוח, שריפת קלוריות, דופק, טיימר.
</inputs>

<direction>
A 5-second clip, 1920x1080, 60fps. Four Lucide icons (Dumbbell, Flame, HeartPulse, Timer) in a row, right to left. Each icon draws itself stroke by stroke on its own beat, then its Hebrew label rises out of a mask line under it. When all are drawn, they light up in orange #FF8F3A together. Icons navy #12163F, stroke width 2, on #EEF3FB. Labels in Karantina 700.
Banned: icons fading in, mixing icon libraries, filled icons.
</direction>

<structure>
120 BPM. Icon i starts drawing on beat i+1 and takes 1 beat. All light up on beat 7.
</structure>

<build>
One HTML file with React and lucide-react, exposing window.seek(t); everything is computed from t, no CSS transitions.
Give every path pathLength="1", set stroke-dasharray to 1, and animate stroke-dashoffset from 1 to 0 with an eased progress of t. Multi-path icons draw their paths in sequence. Capture with Playwright at 60fps, assemble with ffmpeg.
</build>

<gotchas>
- Without pathLength="1", paths of different lengths draw at different speeds.
- lucide-react sets stroke on the svg element; set the dash styles on each child path, circle and line.
</gotchas>

<start>
Show me a still at beat 2 and at beat 7 before rendering.
</start>
03.2

לוגואים רשמיים

Simple IconsSVGCC0 · trademarks apply

מה רואים

קיר של 16 לוגואים של הכלים שבנו את העמוד הזה, קופצים פנימה אחד אחרי השני בצבעי המותג הרשמיים שלהם. נסו לכבות את "צבעי המותג" ולהדליק "רקע כהה". הגרסה החד-צבעית בשחור או בלבן היא בדרך כלל הגרסה היחידה שמותגים מתירים מלבד הצבע הרשמי, ולכן ההדגמה עוברת אליה ולא לצבע אחר.

מה זה Simple Icons

מאגר של יותר מ-3,400 לוגואים של מותגים, כל אחד כ-SVG נקי, יחד עם קוד הצבע הרשמי של המותג. החבילה simple-icons ב-npm נותנת לכל לוגו את הצורה ואת הצבע, כך ש-Claude לא צריך לצייר לוגו מהזיכרון, ולא ימציא צורה "בערך".

מה מותר ומה אסור

הקבצים עצמם ב-CC0, נחלת הכלל. אבל הלוגו הוא סימן מסחרי, וזה כבר חוק אחר. Simple Icons עצמם מבקשים לכבד את הנחיות המותג של כל חברה. בפועל:

  • מותר להראות לוגו כדי לומר "עובד עם" או "נבנה עם".
  • אסור לשנות צבע לצבע לא רשמי, למתוח, לחתוך או להוסיף אפקטים.
  • אסור לרמוז שהחברה ממליצה עליכם או שותפה שלכם.
  • לוגו בגרסה רשמית עדכנית מוצאים בדף ה-Brand או Press של החברה.
מתי כן"משתלב עם הכלים שלכם", "נבנה עם", לקוחות שאישרו להופיע.
מתי לאלקוחות שלא אישרו, או כל מצב שבו הלוגו נראה כמו המלצה שלא קיבלתם.
פרומפט מלא
official logo wall · simple-icons
<inputs>
Ask me which brands to show and confirm that I have the right to show each of them. If I skip it, use the tools this project was built with: Claude, React, Three.js, Tailwind CSS, shadcn/ui, FFmpeg, Node.js, GitHub.
</inputs>

<direction>
A 4.5-second "built with" clip, 1920x1080, 60fps. A grid of official logos pops in on the beat, one after another from the right, each in its official brand colour on white tiles over #EEF3FB. A title above in Karantina 700: "נבנה עם". Logos keep their exact proportions and colours.
Banned: recoloured logos, logos with glow or shadows, logos drawn from memory, distortion.
</direction>

<structure>
120 BPM, 16th-note stagger: a new logo every 0.125s, each with a short spring scale from 0.6 to 1.
</structure>

<build>
One HTML file exposing window.seek(t); everything is computed from t, no CSS transitions.
Import each logo from the simple-icons npm package (import { siReact } from 'simple-icons'), use its .path in a 24×24 viewBox and "#" + its .hex as the fill (.hex comes without the #). Do not redraw or modify any logo. Capture with Playwright at 60fps, assemble with ffmpeg.
</build>

<gotchas>
- Some brands (for example GitHub) have black logos; on a dark background, switch to the brand's official white version, never an invented colour.
- simple-icons occasionally removes logos at a brand's request; if one is missing, ask me for the official file instead of approximating it.
</gotchas>

<start>
List the logos you will use and their hex colours, then show me the final frame before rendering.
</start>
04

טיפוגרפיה קינטית

טקסט שזז עם המוזיקה. ארבע טכניקות שמחליפות כמעט כל "פייד".

טיפוגרפיה קינטית היא טקסט שהתנועה שלו היא חלק מהמסר: מילה שנוחתת חזק מרגישה חשובה, מילה שמוקלדת מרגישה כמו שיחה. בסרטוני השקה רוב המסך הוא טקסט, ולכן זה אולי האלמנט החשוב ביותר בקטלוג. ההדגמה למטה מראה ארבע טכניקות ברצף, כל אחת בשתי שניות וחצי.

04.1

ארבע טכניקות לטקסט שזז

Canvas 2DKarantinaRTL

SLAM: מילים שנוחתות

כל מילה מופיעה בביט שלה, מתחילה גדולה מדי וקטנה לגודלה עם קפיץ, כמו חותמת. מתאים לכותרות של שלוש-ארבע מילים בשיא של המוזיקה.

MASK RISE: עולות מקו

המילים עולות מתוך קו בלתי נראה, כאילו היו מתחתיו. ה"קו" הוא מסכה: מלבן שמראה רק את מה שבתוכו, כמו שבלונה. הטקסט זז, המסכה לא, ולכן נראה שהוא נולד מהקו.

POP TYPE: הקלדה

אות אחרי אות, כל אחת קופצת קצת כשהיא נכתבת, עם סמן מהבהב. הקצב לא אחיד כמו אצל אדם אמיתי, וכל הקשה נוחתת על חצי ביט או רבע ביט (מה שבמוזיקה נקרא "שמינית" ו"שש-עשרית"; ב-120 BPM אלה 0.25 ו-0.125 שנייה), כך שההקלדה "מתנגנת" עם המוזיקה.

MARKER: מרקר

פס צבע שנמתח מאחורי המילה החשובה, מימין לשמאל כמו כיוון הקריאה. הדרך הכי פשוטה להגיד לצופה "זו המילה".

עברית: שלושה דברים שחשוב לבקשחושפים מילים מימין לשמאל, לפי סדר הקריאה. עוטפים מספרים ומילים באנגלית בתוך unicode-bidi: isolate. למה? הדפדפן מסדר עברית מימין לשמאל, ואנגלית ומספרים משמאל לימין. סימנים ניטרליים כמו +, % ורווח לוקחים את הכיוון מהשכנים שלהם, ולכן לפעמים נודדים לצד השני. ההגדרה הזו אומרת לדפדפן לסדר את הקטע העטוף כיחידה סגורה, בלי שיתערבב עם כיוון המשפט. וקרנטינה צרה, אז כותרת בקרנטינה צריכה להיות בערך פי 1.25 מכותרת בפונט רחב יותר כדי להרגיש באותו משקל.
מתי כןבכל סרטון השקה. SLAM לשיא, MASK RISE למשפטים, POP TYPE לפרומפטים ולשיחות, MARKER למילת מפתח.
מתי לאיותר משתי טכניקות באותה סצנה: הטקסט מתחיל להתחרות על תשומת הלב במקום לספר סיפור.
פרומפט מלא
kinetic typography · Hebrew
<inputs>
Ask me for the exact on-screen lines and which word is the key word. If I skip them, use: "כל אימון הוא ביט" (slam), "קצב סופר את החזרות בשבילך" (mask rise), "תתחיל אימון בוקר" (typed), and mark "ביט".
</inputs>

<direction>
A 10-second kinetic typography clip, 1920x1080, 60fps, Hebrew, right to left. Four moments, each on its own colour spread with a hard wipe between them: SLAM (words land one per beat from 1.6× scale with a spring), MASK RISE (words rise out of an invisible line and leave through it), POP TYPE (letters type on with a slight pop and a blinking caret), MARKER (an orange marker swipe from right to left behind the key word).
Type: Karantina 700 for Hebrew headlines (about 1.25× the size you would give a wider font), Anton uppercase for any English label, Assistant for small text. Colours: navy #12163F, orange #FF8F3A, gold #FFC74E, light #EEF3FB, denim #AFCBEF.
Banned: fades, blur-ins, letter-by-letter scramble effects, text that moves after it lands.
</direction>

<structure>
120 BPM. Slam: one word per beat. Mask rise: words 0.12s apart. Typing: one keystroke per 16th note (0.125s), with 2 short pauses between words. Marker: swipes in over half a beat on the downbeat.
</structure>

<build>
One HTML file exposing window.seek(t), drawing on a 2D canvas (or DOM) from t alone.
Lay out each line once (measure words with measureText, right-aligned for RTL), then move and clip each word as a function of t. The mask is a clip rectangle; the word's y offset goes from below the line to 0 with a spring. Capture with Playwright at 60fps, assemble with ffmpeg.
</build>

<gotchas>
- Set ctx.direction = 'rtl' and textAlign = 'right' for Hebrew, and measure with the real font loaded (await document.fonts.ready).
- Wrap numbers and English words with unicode-bidi: isolate (DOM) or draw them as separate runs (canvas), or they jump to the wrong side.
- Never split Hebrew words letter by letter across lines.
</gotchas>

<start>
Show me one still of each of the four moments before rendering.
</start>
05

תלת-ממד עם three.js

טלפונים, זכוכית, חלקיקים, ים. ומה כל מילה בפרומפט אומרת.

three.js היא הספרייה הפופולרית ביותר לתלת-ממד ברשת, חינמית ב-MIT. היא יושבת מעל WebGL, הדרך לצייר עם כרטיס המסך, וחוסכת את אלפי שורות הקוד שהוא דורש. כדי להבין פרומפט של תלת-ממד, עוזר לחשוב על סט צילומים:

  • Scene (סצנה): הבמה, שעליה מניחים הכל.
  • Camera (מצלמה): מאיפה מסתכלים, ובאיזו זווית ראייה (רחבה כמו עדשה רחבה, או צרה כמו עדשת טלה, עדשת זום).
  • Mesh (גוף): כל אובייקט. הוא בנוי משני חלקים: Geometry, הצורה עצמה, ו-Material, החומר של המעטפת: צבע, כמה הוא מבריק, כמה הוא מחוספס, האם הוא שקוף. כרטיס המסך יודע לצייר מהר מאוד דבר אחד, משולשים, ולכן כל צורה, גם כדור, מפורקת להרבה משולשים קטנים.
  • Light (אור), ו-Environment map: תמונת 360° של הסביבה שמשתקפת במשטחים מבריקים. בלעדיה מתכת וזכוכית נראות אפורות ומתות, כי למתכת כמעט אין צבע משלה: רואים בה את מה שהיא משקפת, ובלי סביבה היא משקפת כלום.
  • Renderer (הצלם): הופך את כל זה לתמונה דו-ממדית אחת, הפריים.

עוד שני מושגים שחוזרים בפרומפטים. PBR (Physically Based Rendering) הם חומרים שמגיבים לאור לפי חוקי הפיזיקה, ולכן נראים אמיתיים בכל תאורה. שולטים בהם בעיקר בשני מספרים בין 0 ל-1: metalness (כמה הוא מתכת) ו-roughness (כמה הוא מחוספס: 0 הוא מראה, 1 הוא גיר). GLTF הוא פורמט הקובץ הסטנדרטי למודלים תלת-ממדיים, "ה-JPEG של התלת-ממד": מודל שבניתם בתוכנת תלת-ממד (למשל Blender, החינמית, שמופיעה בסוף הפרק) או הורדתם מאתר נכנס ל-three.js כקובץ GLTF. בכל ההדגמות כאן אפשר לגרור כדי לסובב. זה רק בתצוגה המקדימה: בסרטון, הזווית נקבעת מ-t.

05.1

טלפון ולפטופ עם מסכים חיים

three.jsCanvasTexturePBRMIT

מה רואים

מכסה של לפטופ נפתח, טלפון עולה לידו, והמצלמה מסתובבת לאט. על המסכים יש תוכן חי: בטלפון מונה של שכיבות סמיכה שמתמלא, בלפטופ קוד שמוקלד. הכל בונה את עצמו מצורות פשוטות בקוד, בלי שום קובץ מודל.

תשובה כנה על "אייפון" ו"מקבוק"

אלה מכשירים גנריים בהשראת טלפון ולפטופ מודרניים, לא מודלים של אפל. העיצוב של המכשירים והלוגו של אפל מוגנים. אם צריך מכשיר מוכר, משתמשים במודל GLTF שהרישיון שלו מתיר את השימוש, או בתבניות המכשירים הרשמיות שאפל מפרסמת למשווקים, לפי ההנחיות שלה.

איך זה עובד

  • הגוף של כל מכשיר הוא קופסה עם פינות מעוגלות, בחומר PBR מתכתי, ומשתקף בו "חדר סטודיו" וירטואלי (RoomEnvironment).
  • המסך החי: מציירים את ממשק המשתמש על Canvas דו-ממדי רגיל בכל פריים, והופכים אותו לטקסטורה (CanvasTexture), "מדבקה" שנמתחת על המסך התלת-ממדי. needsUpdate = true אומר ל-three.js להעתיק את הציור החדש לכרטיס המסך. ברירת המחדל היא לא להעתיק, כי העתקת תמונה לכרטיס המסך בכל פריים היא פעולה יקרה, וברוב הטקסטורות התמונה לא משתנה.
  • המכסה הוא ציר: הסיבוב שלו מחושב מ-t עם קפיץ. המצלמה נעה על מסלול עגול סביב המכשירים.
מתי כן"זה עובד בכל מכשיר", הצגת אפליקציה בתוך העולם, מעבר מממשק שטוח למוצר אמיתי.
מתי לאכשהצופה צריך לקרוא את מה שעל המסך: בזווית תלת-ממדית טקסט קטן נבלע. הראו את המסך שטוח, ורק אז הכניסו אותו למכשיר.
פרומפט מלא
3D phone + laptop with live screens · three.js
<inputs>
Ask me what each screen should show. If I skip it: the phone shows a push-up counter ring filling to 12 reps with a Hebrew title, the laptop shows code typing line by line.
</inputs>

<direction>
A 9-second 3D clip, 1920x1080, 60fps, three.js. A generic modern laptop opens its lid while a generic phone rises beside it; the camera orbits slowly around both. Both screens are live and animate in sync with the film.
Devices: rounded aluminium-like bodies (PBR, metalness 0.8, roughness 0.3), black glass screens with a thin bezel, no brand logos. Background: the clear sky gradient #5EA9F2 → #93CBFF → #DDF0FF, a soft contact shadow under the devices. Accent colours on screen: #FFC74E, #FF8F3A, #F56B49.
Banned: Apple logos or exact Apple product shapes, floating particles, lens flares, a camera that reverses direction.
</direction>

<structure>
120 BPM. Beats 0-3: lid opens on a spring. Beats 2-5: the phone rises. Beats 4-17: slow orbit, the counter ring fills on screen, the code types on the laptop at one line per beat.
</structure>

<build>
One HTML file with three.js that exposes window.seek(t); every transform and every screen pixel is computed from t, no clocks.
Build the devices from rounded boxes. For each screen, draw its UI on an offscreen 2D canvas every frame, wrap it in a CanvasTexture with colorSpace = SRGBColorSpace, and set needsUpdate = true after drawing. Use RoomEnvironment through PMREMGenerator for reflections and ACES tone mapping. The lid's rotation and the phone's height come from closed-form springs of t; the camera orbit angle is a smooth function of t.
Capture with Playwright at 60fps (preserveDrawingBuffer on the renderer), assemble with ffmpeg.
</build>

<gotchas>
- Forgetting needsUpdate = true leaves the screen frozen on its first frame.
- Screen text drawn on the canvas must be large; on a tilted 3D screen anything under about 28px becomes unreadable.
- Never call renderer.setAnimationLoop; render once inside seek(t).
</gotchas>

<start>
Show me 3 stills (lid half open, phone up, mid orbit) before rendering.
</start>
05.2

כדור זכוכית נושם

three.jsMeshPhysicalMaterialshader

מה רואים

כדור זכוכית שמשנה את צורתו לאט, כמו טיפה, וטבעת וכדורים קטנים סובבים סביבו. מאחוריו כתוב YUV.AI, והזכוכית מעקמת את הטקסט, בדיוק כמו כוס מים שמעוותת את מה שמאחוריה.

החומר: זכוכית אמיתית

MeshPhysicalMaterial הוא החומר המתקדם של three.js. שלוש הגדרות הופכות אותו לזכוכית: transmission (כמה אור עובר דרכו), thickness (כמה הוא עבה, כי זכוכית עבה מעקמת יותר), ו-ior, מקדם השבירה: כמה האור מתכופף כשהוא נכנס לחומר. לזכוכית זה בערך 1.5, למים 1.33.

איך הוא "נושם"

כל נקודה על פני הכדור נדחפת החוצה או פנימה לפי רעש (noise): פונקציה שנותנת ערכים אקראיים אבל חלקים, כך ששכנות מקבלות ערכים קרובים, וזה נראה אורגני ולא מרצד. את החישוב עושה שיידר (shader): תוכנה קטנה שרצה על כרטיס המסך, על כל הנקודות במקביל. מכניסים לשיידר המובנה של three.js כמה שורות בעזרת onBeforeCompile, ומעבירים לו את t כמשתנה (uTime).

מתי כןרגע "פרימיום", לוגו או שם מוצר מאחורי זכוכית, מעבר בין פרקים.
מתי לארקע בהיר ושטוח: לזכוכית אין מה לשבור, והיא נראית כמו פלסטיק אפור.
פרומפט מלא
liquid glass orb · three.js
<inputs>
Ask me for the word that sits behind the glass. If I skip it, use "YUV.AI".
</inputs>

<direction>
A 12-second loopable 3D clip, 1920x1080, 60fps. A liquid glass orb slowly breathes (its surface swells and settles organically) in front of a large word set in Anton in the fire gradient #FFC74E → #FF8F3A → #F56B49, which it refracts. An orange torus ring tilts slowly behind it and five small glossy spheres in brand colours (#FFC74E, #12163F, #F56B49, #5EA9F2, #D74270) orbit it. Background: the sky gradient #2C78D2 → #93CBFF → #F4FBFF, one white key light from the upper right.
Banned: rainbow chromatic aberration, bloom everywhere, particles, a glass that looks grey.
</direction>

<structure>
One breath cycle every 4 beats at 120 BPM (2s). The orbiting spheres complete one orbit over the full 12s so the clip loops seamlessly.
</structure>

<build>
One HTML file with three.js that exposes window.seek(t); every uniform and transform is computed from t.
Material: MeshPhysicalMaterial with transmission 1, thickness 1.2, ior 1.45, roughness 0.05, an environment map from RoomEnvironment via PMREMGenerator. Displace vertices along their normals with 3D simplex noise injected through onBeforeCompile; the shader's uTime uniform is set from t every frame. Use a high-segment sphere (at least 128×128) so the displacement is smooth.
Capture with Playwright at 60fps, assemble with ffmpeg.
</build>

<gotchas>
- Transmission needs an environment map and something behind the object, or the glass reads as grey.
- After displacing vertices, recompute normals in the shader (or use a normal-from-noise approximation), or the lighting looks flat.
- For a seamless loop, make every periodic motion an integer number of cycles over the clip's length.
</gotchas>

<start>
Show me 2 stills (inhale and exhale) before rendering.
</start>
05.3

20,000 חלקיקים שמשנים צורה

three.jsPointsGPU

מה רואים

עשרים אלף נקודות שעוברות בין ארבע צורות: כדור, קשר, המילה AI, וגלקסיה. אותה טכניקה מופעלת בראש העמוד. רגע: "חלקיקים" ברשימת האסור של zero, לא? כן, כי חלקיקים סתמיים ברקע הם קלישאה. חלקיקים שהופכים למילה ומספרים משהו הם כבר טכניקה.

איך זה עובד

  • Points הוא אובייקט של three.js שמצייר כל נקודה ברשימה כנקודה על המסך, כולן בבת אחת על כרטיס המסך. 20,000 כאלה ב-DOM היו חונקים את הדפדפן (ראו מעבדה 0.6).
  • לכל צורה מחשבים מראש 20,000 מיקומי יעד. את המילה דוגמים מציור שלה: כותבים אותה על Canvas דו-ממדי, וקוראים אילו פיקסלים נצבעו.
  • המיקום של כל נקודה = ערבוב בין הצורה הקודמת לבאה, לפי התקדמות עם האטה: mix(A, B, ease(p)). לכל נקודה עיכוב קטן משלה, כדי שהמעבר ייראה כמו נחיל ולא כמו בלוק.
מתי כןפתיחה או סגירה, "מכאוס לסדר", לוגו שנבנה מאלפי נקודות.
מתי לאכרקע שזז מאחורי טקסט: זו בדיוק הקלישאה, והיא מתחרה בקריאה.
פרומפט מלא
particle morph · three.js Points
<inputs>
Ask me for the word or logo the particles should form. If I skip it, use "AI".
</inputs>

<direction>
An 11-second 3D clip, 1920x1080, 60fps. 20,000 particles morph from a sphere into a torus knot, into a word, into a spiral galaxy, holding each shape for about 1.6s. Particles are small soft dots in #FFC74E, #FF8F3A, #F56B49 and a little #5DE4E9, additive blending on #0B0E2A. The camera drifts slowly.
Banned: particles drifting randomly in the background, bloom halos around everything, a linear morph.
</direction>

<structure>
120 BPM. Each morph takes 3 beats (1.5s) and starts on a downbeat; each hold is just over 3 beats.
</structure>

<build>
One HTML file with three.js that exposes window.seek(t); positions are computed from t every frame, no simulation state.
THREE.Points with a fixed count of 20,000. Precompute a Float32Array of target positions per shape: sphere (Fibonacci sphere), torus knot (TorusKnotGeometry vertices, resampled), word (draw it on a 2D canvas, sample lit pixels, add a little depth jitter), galaxy (logarithmic spiral arms with noise). position = mix(A, B, easeInOut(progress)), with a small per-particle delay. Custom point shader for round soft dots.
Capture with Playwright at 60fps, assemble with ffmpeg.
</build>

<gotchas>
- Every shape must have exactly the same particle count; resample, never truncate.
- Seed the random jitter (a fixed seed), so frame 300 is identical on every render.
- Additive blending with depthWrite on causes black squares; set depthWrite: false.
</gotchas>

<start>
Show me one still of each shape before rendering.
</start>
05.4

ים ושמיים: מיום לשקיעה

three.jsSkyWater

מה רואים

ים רגוע ושמיים שעוברים מצהריים לשקיעה וחזרה, בשתים-עשרה שניות. זה ה-time-lapse מסרט ההשקה YUV.AI MOTION, שבו המכשירים צפים מעל המים.

איך זה עובד

  • Sky הוא תוסף של three.js שמחשב את צבע השמיים מהמיקום של השמש, לפי מודל פיזיקלי של פיזור אור באטמוספרה. למה כתום? האוויר מפזר אור כחול הרבה יותר מאור אדום. כשהשמש נמוכה, האור שלה עובר דרך הרבה יותר אוויר בדרך אלינו, רוב הכחול מתפזר לצדדים, ומה שמגיע הוא בעיקר כתום ואדום. לא מציירים שקיעה: מורידים את השמש.
  • Water הוא תוסף שמצייר את הסצנה פעם נוספת, כמו במראה מתחת לפני המים, ומעוות את ההשתקפות בדפוס גלים שזז לפי t.
  • שעת היום היא מספר אחד שמחושב מ-t, וממנו נגזרים גובה השמש, צבע האור והחשיפה.
מתי כן"מעבר זמן", אווירה, רקע לסצנת מוצר תלת-ממדית, סיום רגשי.
מתי לאסרטון ממשק טהור: עולם שלם מסיח את הדעת מהאפליקציה.
פרומפט מלא
ocean time-lapse · three.js Sky + Water
<inputs>
Ask me whether something should float above the water (a product, a logo). If I skip it, keep the scene empty.
</inputs>

<direction>
A 12-second 3D clip, 1920x1080, 60fps. A calm open ocean under a physically based sky. Time of day goes from midday to golden hour to sunset and back to day, so the clip loops. The camera is low over the water and drifts forward slowly. Warm sunset tones should land near #FF8F3A and #F56B49, the day sky near #5EA9F2.
Banned: lens flares, birds, a sun that jumps, choppy stormy waves.
</direction>

<structure>
120 BPM. The sun reaches its lowest point on beat 12 (6s), exactly mid-clip.
</structure>

<build>
One HTML file with three.js and its Sky and Water addons, exposing window.seek(t).
One number tod(t) from 0 (midday) to 1 (sunset) drives the sun's elevation, the Sky's turbidity and rayleigh, the directional light's colour and the renderer's exposure. The Water shader's time uniform is set from t every frame.
Capture with Playwright at 60fps, assemble with ffmpeg.
</build>

<gotchas>
- The Water addon advances its own time if you let it. Set material.uniforms.time.value from t every frame.
- Update the sun direction on both the Sky and the Water, or the reflection points at a different sun.
- Lower exposure at sunset, or the sky blows out to white.
</gotchas>

<start>
Show me stills at midday, golden hour and sunset before rendering.
</start>
05.6

אקולייזר תלת-ממדי

three.jsInstancedMesh

מה רואים

רשת של 20×20 עמודים שגל עובר בה, וכל ביט נותן לה "בעיטה" מהמרכז החוצה. הצבע תלוי בגובה: נמוך בכחול, בינוני בכתום, גבוה בזהב. כאן הגל מחושב מנוסחה; בסרט אמיתי הגבהים מגיעים מהמוזיקה עצמה.

מהמוזיקה, בלי לשבור את השעון

מנתח שמע חי בדפדפן רץ לפי שעון הקיר, ולכן לא מתאים לצילום. במקום זה מנתחים את השיר מראש: לכל פריים מחשבים את הספקטרום, כמה אנרגיה יש בכל תדר (בס, אמצע, גבוהים), ושומרים בטבלה. בזמן הצילום רק קוראים את השורה של t.

איך זה עובד: צורה אחת, 400 מופעים

כל אובייקט נפרד ב-three.js הוא הוראת ציור נפרדת שהמעבד שולח לכרטיס המסך (draw call). אלפי הוראות כאלה בכל פריים מאטות את המעבד, גם כשכרטיס המסך פנוי. זה חשוב בעיקר לתצוגה המקדימה (0.6); הסרטון ייצא חלק בכל מקרה. InstancedMesh שולח הוראה אחת: "צייר את הקופסה הזו 400 פעמים, הנה המיקום והצבע של כל אחת". אותה תמונה, חלק קטן מהעבודה.

מתי כןסרטון מוזיקלי, "המוזיקה היא השעון", מעבר אנרגטי לפני הדרופ.
מתי לאסרטון בלי מוזיקה בולטת: אקולייזר שזז על שקט נראה מנותק.
פרומפט מלא
3D audio equalizer · InstancedMesh
<inputs>
Ask me for the music track. If I skip it, use a royalty-free 120 BPM track with a clear kick (Mixkit, licensed for commercial use) and tell me which one.
</inputs>

<direction>
A 12-second 3D clip, 1920x1080, 60fps. A 20×20 grid of bars seen from a three-quarter angle above. Bar heights follow the music: bass in the centre, highs at the edges, and every kick sends a ring-shaped pulse from the centre outward. Colour by height from blue #2C78D2 through orange #FF8F3A to gold #FFC74E. Background #0B0E2A, a soft rim light.
Banned: random heights not tied to the audio, bloom on everything, a camera that shakes.
</direction>

<structure>
The track's own beat grid drives everything: measure the BPM and the kick times first.
</structure>

<build>
Analyse the track offline first (Python with librosa, or ffmpeg plus an FFT): for every frame at 60fps, store the energy of 20 frequency bands and the kick onsets in a JSON file.
Then one HTML file with three.js exposing window.seek(t): one InstancedMesh of 400 boxes; for each frame, read row round(t × 60) of the JSON, set each instance's scale.y and colour with setMatrixAt and setColorAt, then set instanceMatrix.needsUpdate and instanceColor.needsUpdate. The pulse is a ring whose radius grows from each kick time.
Capture with Playwright at 60fps and mux the same audio with ffmpeg.
</build>

<gotchas>
- A live Web Audio analyser runs on the wall clock. Precompute the spectrum, or picture and sound drift apart.
- Scale boxes from their base, not their centre (translate the geometry up by half its height once).
- Smooth the band energies over 2-3 frames, or the bars flicker.
</gotchas>

<start>
Show me the detected BPM, the kick times and 2 stills before rendering.
</start>

כשצריך יותר מזה

  • React Three Fiber: three.js בצורת רכיבי React. שימושי כשהסצנה גדולה והפרויקט כבר ב-React. MIT. גרסה 9 שלו מיועדת ל-React 19.
  • Spline: עורך תלת-ממד ויזואלי בדפדפן, בלי קוד. מעצבים ביד ומייצאים ל-GLTF, ל-three.js או ל-React. יש תוכנית חינמית.
  • Blender: תוכנת תלת-ממד מלאה וחינמית, ברישיון GPL: מותר להשתמש בה לכל מטרה, גם מסחרית, ומה שיוצרים בה שלכם; התנאים של GPL חלים רק על מי שמשנה את התוכנה עצמה ומפיץ אותה. בונים בה מודלים מותאמים אישית ומייצאים GLTF. עקומת לימוד תלולה, תוצאה בלי גבולות.
06

מתחת למכסה: WebGL, ‏WebGPU ושיידרים

מי באמת מצייר את הפיקסלים, ולמה זה משנה כשמצלמים סרטון.

בפרק הקודם three.js עשתה בשבילנו את העבודה. עכשיו יורדים שכבה אחת למטה, לשתי שאלות: מי מצייר בפועל, ובאיזו שפה מדברים איתו.

  • כרטיס מסך (GPU): מעבד שבנוי מאלפי ליבות קטנות שעושות את אותה פעולה על הרבה נתונים בבת אחת. המעבד הרגיל (CPU) הוא כמה שפים מומחים; כרטיס המסך הוא אלף טבחים שכל אחד מהם חותך מלפפון אחד. ציור של תמונה הוא בדיוק עבודה כזו: מיליוני פיקסלים, ואותו חישוב לכל אחד.
  • WebGL: הדרך הוותיקה של הדפדפן לדבר עם כרטיס המסך, מ-2011 (וגרסה 2 שלה מ-2017). עובדת כמעט בכל דפדפן ומכשיר, ו-three.js משתמשת בה כברירת מחדל.
  • WebGPU: הדרך החדשה. מהירה יותר כשיש הרבה אובייקטים, ויודעת לעשות גם חישוב כללי (compute): להשתמש בכרטיס המסך לא רק לציור אלא לכל חישוב שחוזר על עצמו, כמו סימולציה של מאות אלפי חלקיקים. לפי Google (נובמבר 2025) היא זמינה ב-Chrome וב-Edge (ב-Windows, ב-macOS, ב-ChromeOS ובאנדרואיד), ב-Safari 26, וב-Firefox ב-Windows ובמק עם שבב ARM. בלינוקס היא עדיין בדרך, וזה חשוב לנו, כי מחשבי רינדור הם בדרך כלל לינוקס.
  • שיידר (shader): תוכנית קטנה שרצה על כרטיס המסך. שיידר פיקסלים (fragment shader) רץ פעם אחת לכל פיקסל בכל פריים ומחזיר צבע. שיידר קודקודים (vertex shader) רץ פעם אחת לכל נקודה של צורה ומחליט איפה היא תופיע על המסך. ב-WebGL כותבים שיידרים בשפה GLSL, וב-WebGPU בשפה WGSL.
  • TSL (Three Shading Language): שפת השיידרים של three.js. כותבים אותה כ-JavaScript רגיל, והיא הופכת לבד ל-WGSL או ל-GLSL, לפי מה שהדפדפן תומך בו.

למה זה מעניין בסרטון? כי שיידר הוא בדיוק פונקציה של זמן: הצבע של כל פיקסל נגזר מהמיקום שלו ומהזמן, color = f(pixel, t). זה אותו רעיון כמו seek(t), רק שכרטיס המסך מריץ אותו על מיליון פיקסלים בבת אחת. שקיעה, ים, שיש וגרעין של פילם הם כמה שורות קוד, בלי אף קובץ תמונה.

המלכודת של רינדור סרטוןכש-Playwright מצלם את הסרטון, הוא מריץ את הדפדפן במצב headless: בלי חלון, בדרך כלל על שרת. במצב הזה Chrome מכבה את כרטיס המסך כברירת מחדל. WebGL ממשיך לעבוד דרך SwiftShader, תוכנה שמחקה כרטיס מסך על המעבד הרגיל: איטי יותר, אבל עובד ויוצא אותו דבר בכל פעם. WebGPU דורש דגלים מיוחדים, ובחלק מהשרתים גם דרייברים. בדקנו: עם הדגלים --enable-unsafe-webgpu --enable-features=Vulkan --use-vulkan=swiftshader --use-webgpu-adapter=swiftshader ההדגמה של WebGPU למטה רצה גם בלי כרטיס מסך. בלי הדגלים, three.js עוברת לבד ל-WebGL 2.

איך בוחרים מנוע, בארבע שורות

  1. ממשק, כפתורים וטקסט: HTML ו-CSS. הדפדפן כבר יודע לצייר אותם מצוין.
  2. איורים, גרפים ותנועה דו-ממדית: Canvas 2D, משטח ציור שמציירים עליו בפקודות.
  3. תלת-ממד, חומרים ושיידרים: three.js עם WebGLRenderer. הבחירה הבטוחה לרינדור.
  4. מאות אלפי חלקיקים או סימולציה: three.js עם WebGPURenderer, שעוברת לבד ל-WebGL 2 כשאין WebGPU.
06.1

שיידר: צבע לכל פיקסל

WebGL 2GLSLבלי ספרייה

מה רואים

חמישה עולמות שמצוירים בלי אף תמונה ובלי אף ספרייה: שקיעה, ים, שיש, גרדיאנט נוזלי ונייר עם גרעין. כל אחד מהם הוא פונקציה אחת של כמה שורות. פתחו את "הקוד שמצייר כל פיקסל" כדי לראות אותה, ובחרו עולם בכפתורים.

איך זה עובד

  • הקנבס מכוסה במשולש אחד גדול מהמסך. כרטיס המסך מריץ את השיידר פעם אחת לכל פיקסל שהמשולש מכסה, כלומר על כל הקנבס, ובמקביל.
  • כל פיקסל מקבל את המיקום שלו (p) ואת הזמן (t), ומחזיר צבע. אין זיכרון בין פריימים, ולכן אפשר לחשב כל פריים לבד, בדיוק כמו seek(t).
  • שיש ונייר עשויים מרעש (noise): פונקציה שמחזירה מספרים אקראיים שמשתנים בהדרגה, כמו נוף של גבעות ולא כמו שלג בטלוויזיה. מחברים כמה שכבות רעש בגדלים שונים (fbm), ומעקמים רעש אחד בעזרת רעש אחר (domain warping), ומקבלים עורקים של שיש.
  • הגרעין בגרדיאנט ובנייר הוא לא קישוט: גרדיאנט חלק נשבר ל"מדרגות" של צבע אחרי דחיסת וידאו (banding), ורעש עדין מסתיר את זה.
מתי כןרקעים, שמיים, מים, טקסטורות ואווירה, בלי קבצים כבדים ובאיכות מלאה בכל רזולוציה.
מתי לאאובייקט עם צורה מוגדרת (טלפון, בקבוק). שם עדיף three.js עם מודל.
פרומפט מלא
background · raw WebGL2 fragment shader
<inputs>
Ask me which look I want behind the film (sunset sky, sea, marble, a liquid brand gradient, paper with grain) and my brand colours. If I skip it, use a liquid gradient in my brand colours.
</inputs>

<direction>
A full-frame animated background drawn by a single fragment shader, 1920x1080, 60fps, under the rest of the film. It moves slowly and continuously and never competes with the text on top of it. Colours come only from my palette. Fine film grain on top so gradients never band after compression.
Banned: image files for the background, video loops, a background that moves faster than the foreground, visible banding.
</direction>

<structure>
The background runs for the whole film. Its slowest motion completes one cycle over the full length, so the first and last frames match.
</structure>

<build>
Raw WebGL2 (no library): one triangle that covers the canvas, and a GLSL fragment shader with uniforms u_t (seconds), u_res and u_aspect. color = f(gl_FragCoord, u_t) with no state between frames, so seek(t) can render any frame in any order.
Build textures from value noise and fbm (4 to 5 octaves); use domain warping for marble-like veins; add grain as hash(pixel + floor(t * 24)) at about 3% amplitude.
Set u_t from seek(t) every frame; create the context with preserveDrawingBuffer: true so Playwright can capture the canvas.
</build>

<gotchas>
- smoothstep(edge0, edge1, x) with edge0 > edge1 is undefined in GLSL. Write 1.0 - smoothstep(a, b, x) instead.
- Waves near the horizon get so dense that they flicker (aliasing). Fade their amplitude to zero near the horizon.
- Headless Chrome has no GPU by default; WebGL still runs through SwiftShader, only slower. Keep the shader cheap (loops of 5 steps at most).
- Use highp precision, or noise turns blocky on some mobile GPUs.
</gotchas>

<start>
Show me 3 stills of the background (start, middle, end) under a sample headline before rendering.
</start>
06.2

WebGPU: מאתיים אלף חלקיקים

three.jsWebGPURendererTSL

מה רואים

200,000 חלקיקים שעוברים מכדור לגלקסיה ולגל. בפינה כתוב מה הדפדפן שלכם מריץ בפועל: WebGPU, או WebGL 2 כשאין בו WebGPU.

איך זה עובד

  • ל-three.js יש שתי גרסאות: three עם WebGLRenderer, ו-three/webgpu עם WebGPURenderer. השנייה מנסה WebGPU, ואם אין, עוברת לבד ל-WebGL 2. בשביל זה היא צריכה רגע כדי להתחיל, ולכן מחכים ל-await renderer.init() לפני הפריים הראשון.
  • כל החלקיקים הם עותקים של אותו ריבוע קטן (instancing): כרטיס המסך מקבל צורה אחת ומספר עותקים, ומצייר את כולם בפקודה אחת.
  • המיקום של כל חלקיק מחושב על כרטיס המסך, בקוד TSL: מהמספר הסידורי של החלקיק נגזרים שלושה מספרים אקראיים קבועים, מהם שלוש צורות, ומספר אחד שמגיע מ-t קובע כמה עברנו מצורה לצורה. כל חלקיק מתחיל קצת אחרי השכן שלו, וזה מה שהופך את המעבר לגל.
  • הכוח הגדול של WebGPU הוא חישוב כללי (compute), למשל סימולציה שבה כל פריים נבנה מהקודם. בסרטון אנחנו מעדיפים פונקציה טהורה של t, כדי שאפשר יהיה לקפוץ לכל פריים, ולכן כאן הכל מחושב מחדש בכל פריים ישירות מ-t.
מתי כןרגע "וואו" של כמות, מעבר בין צורות, לוגו שנבנה מחלקיקים.
מתי לאחלקיקים כקישוט על רקע שחור. זו בדיוק "התבנית" ש-zero אוסר.
פרומפט מלא
particles · three.js WebGPURenderer + TSL
<inputs>
Ask me for the word or logo the particles should end on, if any. If I skip it, morph sphere → galaxy → wave.
</inputs>

<direction>
A 12-second particle scene, 1920x1080, 60fps: 200,000 soft particles on deep navy that morph between three shapes, each particle starting slightly after its neighbour so the morph ripples. Colours: the phoenix fire gradient and the clear sky blues, additive, never pure white.
Banned: random jitter that changes every frame, particles that pop in or out, a wall of white from over-bright additive blending.
</direction>

<structure>
120 BPM. Beats 0-6: the first shape, turning slowly. Beats 6-10: the morph to the second. Beats 10-16: hold and turn. Beats 16-20: the morph to the third. Beats 20-24: hold.
</structure>

<build>
three.js WebGPURenderer from 'three/webgpu' (it falls back to WebGL 2 by itself); await renderer.init() before the first seek(t).
One instanced sprite mesh with SpriteNodeMaterial and mesh.count = 200000. Positions are computed in TSL from instanceIndex: three fixed hashes per particle, three target shapes, and one uniform morph value that seek(t) sets every frame. No compute pass and no state between frames, so any frame can be rendered in any order.
Alpha is a soft disc from uv(); colour mixes fire and sky by a per-particle hash.
</build>

<gotchas>
- WebGPURenderer does not support ShaderMaterial or onBeforeCompile; write custom shading in TSL.
- Headless Chrome has no WebGPU by default. Launch it with --enable-unsafe-webgpu --enable-features=Vulkan --use-vulkan=swiftshader --use-webgpu-adapter=swiftshader, or let it fall back to WebGL 2, and log which backend actually ran.
- Additive blending of 200,000 particles blows out to white. Keep each particle's colour around 25% brightness.
- Import everything in this file from 'three/webgpu'; mixing it with 'three' loads two copies of the library.
</gotchas>

<start>
Show me one still per shape and tell me which backend the render used.
</start>
07

אפקטים ומעברים

הניאון של "AI חושב", זכוכית, זוהר, ומעברים בלי פייד.

07.1

קצה ניאון: "ה-AI חושב"

CSSconic-gradientmask

מה רואים

שדה הקלדה עם קצה צבעוני שמסתובב סביבו והילה רכה, שפועמת בכל ביט, בזמן שבקשה מוקלדת בפנים. זה האות החזותי שהשתרש לרגע שבו AI מעבד בקשה.

איך זה עובד

  • conic-gradient הוא מעבר צבעים שמסתובב סביב נקודה, כמו מחוגים של שעון: כל זווית מקבלת צבע אחר. משנים את זווית ההתחלה, והצבעים מסתובבים.
  • mask חותכת מהמעבר הזה רק טבעת דקה בקצה, כך שנשאר רק קו מתאר צבעוני.
  • עותק שני של אותו מעבר, מטושטש מאחור, יוצר את ההילה. בכל ביט היא מתחזקת לרגע.
  • הזווית = t × 1.5 רדיאנים. רדיאן הוא יחידת זווית כמו מעלה: סיבוב שלם הוא 2π, בערך 6.28 רדיאנים. 1.5 רדיאנים בשנייה הם סיבוב שלם בכל 4.2 שניות בערך, איטי מספיק כדי להרגיש "חושב" ולא מסחרר. בעמוד עצמו (הכפתור למעלה) הניאון מסתובב באנימציית CSS רגילה, כי שם אין צילום. בסרטון, הזווית מגיעה מ-t.
מתי כןשדה פרומפט, כפתור הפעולה הראשי, כרטיס אחד מרכזי. אלמנט אחד בכל מסך.
מתי לאעל כל דבר: ניאון בכל מקום מבטל את עצמו והופך לרעש.
פרומפט מלא
neon "AI is thinking" edge · CSS
<inputs>
Ask me for the request that types into the field. If I skip it, use "השקה לאפליקציית כושר".
</inputs>

<direction>
A 6-second clip, 1920x1080, 60fps. A large white pill-shaped input field on the sky gradient #5EA9F2 → #93CBFF → #DDF0FF. Around it, an iridescent neon edge (a conic gradient of #5DE4E9, #4FA3FF, #8B6CFF, #FF66C4, #FF8F3A, #FFC74E) rotates slowly, with a soft blurred halo behind it that swells on every beat. The placeholder "על מה הסרטון?" is replaced by the request typing in, with a blinking caret, and a round send button in the fire gradient. Hebrew in Assistant, right to left.
Banned: a glow that covers the text, neon on more than this one element, flicker.
</direction>

<structure>
120 BPM. The halo pulses on every beat. Typing starts on beat 2 at one letter per 16th note.
</structure>

<build>
One HTML file exposing window.seek(t); every style is computed from t.
The ring is a pseudo-element with background: conic-gradient(from var(--ang), …), masked to a 4px ring (-webkit-mask-composite: xor plus the standard mask-composite: exclude); a second copy behind it has filter: blur(22px). Set --ang = t × 1.5rad and the halo opacity from a beat-synced spring on every frame. Do not use a CSS keyframe animation.
Capture with Playwright at 60fps, assemble with ffmpeg.
</build>

<gotchas>
- A CSS @keyframes rotation runs on the wall clock and breaks the capture. Set the angle from t.
- If you register --ang with @property and inherits: false, a value set on the element never reaches its ::before. Leave it unregistered (plain custom properties inherit) or register it with inherits: true.
- Keep the mask on both -webkit-mask (with -webkit-mask-composite: xor) and mask (with mask-composite: exclude).
</gotchas>

<start>
Show me a still before typing and one mid-typing before rendering.
</start>
07.2

כרטיס זכוכית

CSSbackdrop-filter

מה רואים

כרטיס נתונים חלבי שצף מעל עיגולי צבע שזזים. הכרטיס עצמו כמעט שקוף; מה שנותן לו את המראה הוא הטשטוש של מה שמאחוריו. הזיזו את מחוון הטשטוש, וכבו את הזכוכית כדי לראות את ההבדל.

איך זה עובד

backdrop-filter: blur() מטשטש את מה שמאחורי האלמנט, ולא את האלמנט עצמו. saturate() מגביר את הצבעים של הרקע המטושטש, וזה מה שנותן את התחושה ה"נוזלית". מוסיפים מסגרת לבנה דקה ושקופה למחצה, ונראה שיש לזכוכית עובי. העיגולים זזים לפי sin ו-cos של t.

מתי כןכרטיס מידע מעל רקע צבעוני שזז, התראה מעל תמונה, ממשק בסגנון "זכוכית" של מערכות הפעלה.
מתי לאמעל רקע אחיד ושטוח: אין מה לטשטש, והכרטיס נראה אפור.
פרומפט מלא
frosted glass card · CSS backdrop-filter
<inputs>
Ask me for the number and label on the card. If I skip them, use 268 "דקות השבוע" with a "+12%" chip.
</inputs>

<direction>
A 10-second loopable clip, 1080x1920, 60fps. Four large soft colour blobs (#FF8F3A, #5EA9F2, #FFC74E, #D74270) drift slowly on navy #12163F. A frosted glass card floats in the centre: background white at 16% opacity, a 1.5px white border at 40%, strong backdrop blur and saturation. On it, a big number in Inter 800, a Hebrew label in Karantina 700, and a small fire-gradient chip. The card springs in at the start.
Banned: a glass card over a flat background, heavy drop shadows, noise textures on the card.
</direction>

<structure>
The card springs in on beat 1 at 120 BPM; the blobs complete whole cycles over 10s so the clip loops.
</structure>

<build>
One HTML file exposing window.seek(t); blob positions and the card's scale are computed from t, no CSS animations.
The card uses backdrop-filter: blur(22px) saturate(1.6) (plus -webkit-backdrop-filter). Blob positions = sin/cos of t with different speeds, each completing an integer number of cycles in 10s.
Capture with Playwright at 60fps, assemble with ffmpeg.
</build>

<gotchas>
- backdrop-filter only shows when something moves behind the card; keep the blobs passing under it.
- An ancestor with opacity below 1, filter, mask, clip-path, mix-blend-mode or will-change creates a new backdrop root and the card stops seeing the blobs; keep those off the card's ancestors.
</gotchas>

<start>
Show me one still before rendering.
</start>
07.3

רקע זוהר צפוני

Canvas 2Dblurgrain

מה רואים

רקע של כתמי צבע ענקיים ורכים שנודדים לאט, עם גרעין עדין כמו של פילם. סמנו "בלי טשטוש" ותגלו את הסוד: אלה חמישה עיגולים פשוטים.

איך זה עובד

מציירים חמישה עיגולים גדולים בצבעי המותג, כל אחד זז על מסלול של sin ו-cos של t במהירות אחרת, ומטשטשים את כולם בטשטוש כבד מאוד (70 פיקסלים). מעל, שכבה של רעש אקראי חלש.

למה הגרעין חשוב

סרטון שומר כל ערוץ צבע (אדום, ירוק, כחול) ב-8 ביטים, כלומר 256 רמות. מעבר עדין, למשל מנייבי לנייבי קצת יותר בהיר, משתמש אולי ב-20 מהן. על פני 1,000 פיקסלים אלה 20 מדרגות ברוחב 50 פיקסלים כל אחת, והעין רואה פסים (banding). הדחיסה של קובץ הווידאו מחמירה את זה עוד יותר. רעש עדין שובר את הפסים, כי העין ממצעת אותו לגוון חלק. לטכניקה הזו קוראים dithering.

מתי כןרקע לכותרת או לסצנת סיום, מעבר אווירה בין פרקים.
מתי לאמאחורי טקסט קטן או ממשק עמוס: הוא מוריד את הניגודיות.
פרומפט מלא
aurora background with grain · Canvas
<inputs>
Ask me for the headline that sits on top. If I skip it, use "FLY HIGH" in Anton.
</inputs>

<direction>
A 14-second loopable background clip, 1920x1080, 60fps. Five huge soft colour blobs (#5EA9F2, #FF8F3A, #FFC74E, #D74270, #93CBFF) drift slowly on navy #12163F and blend into an aurora, with fine film grain on top. The headline sits centred in white.
Banned: hard edges, fast movement, a rainbow, grain so strong it looks dirty.
</direction>

<structure>
No beat sync: the motion is slow and continuous. Every blob completes a whole number of cycles in 14s so the clip loops.
</structure>

<build>
One HTML file exposing window.seek(t), drawing on a 2D canvas.
Draw five large circles with ctx.filter = 'blur(70px)' at positions from sin/cos of t with different speeds. Overlay a tiled noise texture generated once from a seeded random function, at about 9% opacity.
Capture with Playwright at 60fps. Encode with ffmpeg at a high bitrate (or -tune grain) so the compression keeps the grain.
</build>

<gotchas>
- Smooth gradients band after video compression. The grain hides it, but only if the encoder keeps it.
- Generate the noise from a fixed seed so every frame uses the same pattern (a changing pattern looks like TV static).
</gotchas>

<start>
Show me one still with and one without grain before rendering.
</start>
07.4

ארבעה מעברים בלי פייד

Canvas 2Dfloodmorphwipeiris

למה בלי פייד

פייד (crossfade) הוא כשתמונה אחת נעלמת לאט ומתחתיה מופיעה הבאה. זה המעבר הראשון בכל תוכנת עריכה, ולכן הוא נראה "תבנית". הכלל של zero: כל סצנה נולדת מאובייקט שכבר על המסך. כך העין עוקבת אחרי משהו, ולא נקטעת.

FLOOD: הצפה

כפתור נלחץ, והצבע שלו מתפשט כעיגול עד שהוא ממלא את כל המסך. הרדיוס הסופי = המרחק מהכפתור לפינה הרחוקה ביותר, כדי שלא יישאר שום פס.

MORPH: שינוי צורה

גלולה קטנה מתרחבת, ואז גדלה לגובה ומעגלת פינות אחרת, עד שהיא כרטיס. רוחב, גובה ורדיוס הפינות, כל אחד על קפיץ משלו.

WIPE: מגב

עמוד חדש נכנס מימין, ולפניו פס של אש שמוביל אותו. הפס הוא מה שהופך מגב פשוט למשהו עם אנרגיה.

IRIS: איריס

המסך נסגר לעיגול שהולך וקטן, עד שנשארת נקודה, והנקודה הופכת לנקודה שבלוגו YUV.AI. הרדיוס קטן בקנה מידה לוגריתמי: בכל פרק זמן שווה הוא קטן פי אותו מספר. בסרט של 1920×1080 הוא מתחיל ב-1,100 פיקסלים, המרחק ממרכז המסך לפינה, כך שבהתחלה העיגול מכסה הכל, ומסתיים ב-14, גודל הנקודה בלוגו. ארבעה צעדים שווים: 1,100, ‏370, ‏125, ‏42, ‏14, כל אחד קטן פי 3 מהקודם. למה לא ליניארי? כיווץ ליניארי מוריד בכל פריים אותו מספר פיקסלים: 18 פיקסלים מתוך 1,100 כמעט לא מורגשים, אבל 18 מתוך 30 הם יותר מחצי. לכן העיגול כמעט לא זז בהתחלה ואז נטרק בבת אחת, כי העין קולטת שינויי גודל ביחס, לא בפיקסלים.

מתי כןבכל מעבר בין סצנות. בחרו לפי האובייקט שעל המסך: כפתור מציף, גלולה הופכת לכרטיס, נקודה הופכת ללוגו.
מתי לאמעבר שלא יוצא מאובייקט על המסך נראה כמו חיתוך, גם אם הוא מהודר.
פרומפט מלא
four transitions without a crossfade · Canvas
<inputs>
Ask me for the scenes on each side of each transition. If I skip them, use simple Hebrew title cards in my brand.
</inputs>

<direction>
An 11-second clip, 1920x1080, 60fps, showing four transitions in a row. FLOOD: a "התחל" button is pressed and its fire gradient floods the frame as a growing circle. MORPH: a navy pill widens, then grows into a card with a progress bar. WIPE: a new page slides in from the right led by a fire-gradient band. IRIS: the frame closes into a shrinking circle that becomes the dot of the YUV.AI logo.
Colours: navy #12163F, denim #AFCBEF, light #EEF3FB and #DDF0FF, fire #FFC74E → #FF8F3A → #F56B49. Hebrew titles in Karantina 700.
Banned: crossfades, blur transitions, any transition that does not start from an object already on screen.
</direction>

<structure>
120 BPM. Each transition gets 2.8s; the main motion of each starts on a downbeat and takes about one beat.
</structure>

<build>
One HTML file exposing window.seek(t), drawing on a 2D canvas.
Flood: radius = distance from the button to the farthest corner × 1.03 × easeOut(progress). Morph: width, height and corner radius each follow a sum of springs. Wipe: clip the new page to a rectangle whose edge follows an eased progress, and draw a fire band at the edge. Iris: radius interpolated in log space, exp(lerp(log(rStart), log(rEnd), easeInOut(p))).
Capture with Playwright at 60fps, assemble with ffmpeg.
</build>

<gotchas>
- A flood radius smaller than the farthest corner leaves a sliver of the old scene.
- Linear iris shrinking crawls at the start and snaps shut at the end; use log space.
- Give each layer an explicit z-order so the flood covers the old scene but not the label it came from.
</gotchas>

<start>
Show me one still in the middle of each transition before rendering.
</start>
08

עולם אמיתי: מפות, תמונות וחומרים

מה שגורם לסרטון קוד להרגיש מצולם, ולא מחשבי.

כשהכל וקטורי ושטוח, העין מזהה מחשב. סרטוני המוצר הטובים מכניסים פיסות של עולם אמיתי: מפה שבה שליח נוסע, תמונה אמיתית, חומרים שמחזירים אור כמו בעולם, ומודל תלת-ממדי של מוצר אמיתי. ארבעת האלמנטים כאן עושים את זה, וכולם עדיין פונקציה של t.

חומרים מהעולם האמיתי מגיעים עם רישיון, אז שלושה מושגים שכדאי להכיר:

  • CC0: ויתור מלא על זכויות יוצרים. מותר להשתמש, לשנות ולמכור, גם בלי קרדיט. Poly Haven (סביבות HDRI, טקסטורות ומודלים) ו-Khronos (מודלים לדוגמה) מפרסמים כך חלק גדול מהנכסים שלהם. לוגואים וסימנים מסחריים שמופיעים בתוך נכס כזה בדרך כלל לא כלולים בוויתור.
  • הרישיון של Pexels: מותר להשתמש בתמונות ובסרטונים בחינם, גם מסחרית ובלי קרדיט. אסור להציג אנשים מזוהים באור שלילי, אסור לרמוז שמישהו בתמונה ממליץ על המוצר, ואסור למכור את התמונה כמו שהיא.
  • OpenStreetMap: מפה חופשית של העולם. מי שמשתמש בנתונים או באריחי המפה שלה חייב להציג קרדיט ולציין שהנתונים ברישיון ODbL. מפה מסוגננת שמציירים בקוד, כמו בהדגמה למטה, לא מחייבת כלום.
08.1

מפה ומסלול: שליח בדרך

Canvas 2Darc length

מה רואים

מפה מסוגננת, מסלול שמצייר את עצמו מהמסעדה הביתה, שליח שנוסע עליו כשהמצלמה עוקבת, שעון הגעה שיורד, וסיכה שהופכת לסימן המותג. זה הרגע מסרט האוכל ומסרט ההדפסות של zero.

איך זה עובד

  • המפה מצוירת פעם אחת לקנבס נסתר, ובכל פריים רק "המצלמה" זזה מעליה: הזזה והגדלה של אותה תמונה. זה זול מאוד.
  • השליח זז לפי אורך קשת (arc length): מודדים את האורך של כל קטע במסלול ומזיזים אותו לפי מרחק, לא לפי מספר הקטע. כך הוא נוסע באותה מהירות גם כשקטע אחד ארוך והבא קצר.
  • החלק שכבר נסענו בו נצבע בגרדיאנט האש, ומה שנשאר נשאר מקווקו. שניהם מצוירים מאותה פונקציה של מרחק.
  • הזום עובר במרחב לוגריתמי: כל רגע מוסיף את אותו אחוז, ולא את אותו מספר, ולכן העין מרגישה תנועה אחידה.
  • הסיכה לא נעלמת: הראש שלה גדל והופך לעיגול עם וי. הסצנה החדשה נולדת מאובייקט שכבר על המסך.
מתי כןמשלוחים, נסיעות, "איפה ההזמנה שלי", המסע של משתמש.
מתי לאכשהגיאוגרפיה האמיתית חשובה, כמו כתובת או מסלול אמיתי. אז צריך מפה אמיתית עם הקרדיט שלה.
פרומפט מלא
delivery map · Canvas 2D, arc length
<inputs>
Ask me for: the start and end of the route (names only, like "the restaurant" and "home"), my brand mark, and whether the map must show a real place. If it must be real, ask for the area and use OpenStreetMap data with its attribution on screen; otherwise draw a stylised map.
</inputs>

<direction>
A 10-second delivery scene, 1920x1080, 60fps. A stylised 2D city map in my palette: light streets on a pale ground, a strip of sea, a few parks, a handful of street names. A route draws itself from the start pin to the destination pin, a courier chip rides it while the camera follows, an ETA chip counts down, and on arrival the destination pin's head grows into my brand mark with a check. One continuous take, no cuts.
Banned: satellite imagery, 3D buildings, a camera that zooms in and out more than once, a courier that moves at uneven speed.
</direction>

<structure>
120 BPM. Beats 0-2: the map and both pins pop in. Beats 2-5: the route draws itself. Beats 5-7: the camera zooms in on the courier. Beats 7-16: the ride, with the camera following. Beats 16-18: the camera pulls back to the destination. Beats 18-20: the pin becomes the brand mark.
</structure>

<build>
Canvas 2D. Draw the static map once into an offscreen canvas at 2x, then every frame only translate and scale it (that is the camera).
Move the courier by arc length: precompute each segment's length and place it at distance s(t) = eased(t) x total length, with its heading from the current segment.
Draw the travelled part of the route in the accent gradient and the rest dashed, both from the same arc-length function.
Interpolate the zoom in log space. Pins and chips pop on closed-form springs evaluated at t.
</build>

<gotchas>
- Moving by segment index instead of arc length makes the courier speed up on short segments.
- Make the map larger than the widest camera view, or its edge shows when the camera pulls back.
- Real map tiles need their attribution on screen and the tile provider's usage policy.
- Hebrew street names: set ctx.direction = 'rtl' before fillText.
</gotchas>

<start>
Show me stills of the overview, mid-ride and the arrival before rendering.
</start>
08.2

תמונה אמיתית: קן ברנס והחלפת תאורה

Canvas 2Dwipe2 shots

מה רואים

כרטיס תמונה שנכנס בקפיץ, עם תנועת מצלמה איטית פנימה. אחר כך מופיע סליידר, הסמן גורר אותו, והתמונה עוברת מצהריים לשעת הזהב לפי המיקום של הידית. נסו לגרור את הידית בעצמכם.

איך זה עובד

  • אפקט קן ברנס הוא תנועה איטית של זום והזזה על תמונה סטטית, על שם הבמאי התיעודי שהשתמש בו הרבה. מתחילים מזום קצת מעל 1, כדי שההזזה לא תחשוף את קצה התמונה.
  • ההחלפה היא לא פייד: יש שתי תמונות מיושרות של אותו מקום, והשנייה נחשפת משמאל לימין עד הידית, עם קצה מואר. זה מגב (wipe) שהמשתמש שולט בו.
  • כדי שזה יעבוד, שתי התמונות חייבות להיות מיושרות פיקסל לפיקסל: מצלמים מחצובה, או מייצאים שתי גרסאות של אותה תמונה. כאן שתי ה"תמונות" הן שני רינדורים של סצנת הים שלנו, מאותה מצלמה.
  • הידית גדלה כשמחזיקים אותה, משוב קטן שאומר "תפסת".
מתי כןלפני ואחרי, יום ולילה, מוצר בשני צבעים, ערכות צבע.
מתי לאכשאין שתי תמונות מיושרות. מגב בין תמונות שלא מתאימות נראה כמו טעות.
פרומפט מלא
photo relight · Ken Burns + wipe
<inputs>
Ask me for two aligned photos of the same scene in two states (day and golden hour, before and after, two product colours), shot from a tripod or exported as two versions of one image. If I don't have them, stop and tell me: this effect needs aligned shots.
</inputs>

<direction>
A 10-second scene, 1920x1080, 60fps. The first photo lands in a rounded card (radius 28, a soft navy shadow) on a spring and gets a slow Ken Burns push. Then a glass slider grows out of the card's bottom edge, a cursor drags its knob with two small pauses, and the second photo is revealed by a wipe that follows the knob, with a lit leading edge. Labels for the two states sit on the card.
Banned: crossfading the two photos, brightness or filter "developing", a knob that moves at constant speed.
</direction>

<structure>
120 BPM. Beats 0-6: the card and the Ken Burns push. Beat 6: the slider appears. Beats 8-14: the drag, pausing on beats 10 and 11. Beats 14-20: hold on the second state while the push continues.
</structure>

<build>
Canvas 2D. Draw each photo to cover the card (scale = max(cardW / imgW, cardH / imgH) x zoom), clipped to a rounded rect.
Ken Burns: zoom from 1.07 to 1.2 in log space plus a small pan, all functions of t; starting above 1 means the pan never shows an edge.
The wipe: clip the second photo to x < knob position, and draw a 3px white edge with a soft accent glow just before it.
The knob position is an eased function of t with two pauses; the knob grows while it is held.
</build>

<gotchas>
- If the two photos are not aligned pixel for pixel, the wipe exposes the mismatch. Align them first.
- Decode the images before the first seek() (await img.decode()), or the first frames are empty.
- Use photos you are licensed to use; every stock site has its own licence.
</gotchas>

<start>
Show me stills at beats 4, 11 and 18 before rendering.
</start>
08.3

חומרים וטקסטורות: שש פעמים אותו כדור

three.jsPBRnormal map

מה רואים

שישה כדורים זהים באותה תאורה: כרום, מתכת מוברשת, זכוכית, קרמיקה מבריקה, קטיפה ושיש. רק כמה מספרים וטקסטורה אחת משתנים ביניהם, וכתוב בפינה אילו.

איך זה עובד

  • PBR הם חומרים שמחשבים אור לפי חוקי הפיזיקה. שני המספרים הראשיים: metalness (0 פלסטיק, 1 מתכת) ו-roughness (0 מראה, 1 גיר).
  • transmission הופך חומר לשקוף כמו זכוכית, ו-ior, מקדם השבירה (1.45 לזכוכית), קובע כמה הוא מעקם את מה שמאחוריו. לכן שמנו פסים מאחורי הכדורים: בלי משהו מאחור, אין מה לעקם.
  • clearcoat מוסיף שכבת לכה שקופה מעל הצבע, כמו בקרמיקה או בצבע של מכונית. sheen מוסיף ברק רך בקצוות, כמו בבד.
  • טקסטורה היא תמונה שעוטפת את הגוף. map קובעת את הצבע (העורקים בשיש). normalMap "משקרת" לאור לגבי הכיוון של כל פיקסל, ולכן משטח חלק נראה מוברש או ארוג בלי להוסיף אף משולש. כל הטקסטורות כאן נוצרות בקוד מרעש, בלי קבצים.
  • טקסטורות אמיתיות, כמו עץ, בטון ובד, מורידים בחינם מ-Poly Haven, ברישיון CC0.
מתי כןמוצר פיזי, אריזה, "החומר" של מותג, מעבר בין גימורים.
מתי לאסרטון ממשק שטוח. חומרים מבריקים מושכים את העין מהמסך.
פרומפט מלא
materials · three.js PBR
<inputs>
Ask me which finishes my product comes in (for example aluminium, glass, matte ceramic, fabric) and my brand colours. If I skip it, show chrome, brushed metal, glass, glazed ceramic, velvet and marble.
</inputs>

<direction>
A 12-second material showcase, 1920x1080, 60fps, in three.js. Identical spheres in a row on a pale floor, lit by one studio environment, with a striped backdrop so transparent materials have something to bend. Every 2 seconds the camera glides to the next sphere, it lifts on a spring, and a label shows the material's name and its key PBR numbers.
Banned: different lighting per material, coloured lights, bloom, orbiting the camera around the row.
</direction>

<structure>
120 BPM. One material per 4 beats; the lift lands on the first beat of each group.
</structure>

<build>
three.js WebGLRenderer, ACES tone mapping, sRGB output, RoomEnvironment through PMREMGenerator for reflections.
One MeshPhysicalMaterial per finish: chrome (metalness 1, roughness 0.05), brushed metal (metalness 1, roughness 0.35, a stretched-noise normalMap), glass (transmission 1, ior 1.45, thickness 0.8), glazed ceramic (roughness 0.4, clearcoat 1), velvet (roughness 0.9, sheen 1), marble (a generated colour map, roughness 0.18).
Generate the textures in code: value noise → height field → normal map on a canvas, used as a CanvasTexture with RepeatWrapping.
The camera's x and the lift are functions of t (an eased glide and a closed-form spring).
</build>

<gotchas>
- Metal without an environment map renders almost black: metal shows what it reflects.
- Transmission needs something behind the object, or glass reads as grey plastic.
- Colour textures need colorSpace = SRGBColorSpace; normal maps must stay linear.
</gotchas>

<start>
Show me one still per material before rendering.
</start>
08.4

מודל אמיתי ותאורת HDRI: בקבוק על פטיפון

three.jsglTFHDRICC0

מה רואים

בקבוק אמיתי מקובץ glTF מסתובב רבע סיבוב בכל פעם. בחצי הראשון הוא מואר בסטודיו, ובחצי השני בתמונת 360° אמיתית של שקיעה בוונציה, וההשתקפויות זזות עליו. התווית שלו מצוירת מחדש מ-t, והתווית השנייה מוחקת את הראשונה במגב. אפשר גם לבחור תאורה בכפתורים.

איך זה עובד

  • glTF הוא פורמט הקובץ הסטנדרטי למודלים תלת-ממדיים: צורה, חומרים וטקסטורות בקובץ אחד (.glb). מורידים מודל, בונים אותו ב-Blender, או מקבלים אותו מהלקוח, ו-GLTFLoader של three.js טוען אותו.
  • HDRI היא תמונה פנורמית של 360° שנשמרת עם טווח הבהירות המלא, כולל השמש עצמה, שבהירה הרבה יותר מכל השאר. כשמשתמשים בה כסביבה, האור על המוצר מגיע מהתמונה וההשתקפויות שלו אמיתיות. סיבוב הסביבה לפי t (environmentRotation) מזיז את ההשתקפויות על המוצר.
  • המודל עבר הכנה לרשת: הטקסטורות הוקטנו ל-1024 פיקסלים ועברו לפורמט WebP בעזרת הכלי glTF-Transform, והקובץ ירד מ-9 מגה-בייט ל-230 קילו-בייט.
  • את התווית מציירים על קנבס מעל טקסטורת הצבע המקורית ומעדכנים בכל פריים. כך שמים את המותג שלנו על מוצר בלי לגעת במודל.
  • המודל (Water Bottle של Khronos) והסביבה (Venice Sunset של Poly Haven) ברישיון CC0. מודל של מוצר אמיתי של חברה אחרת, כמו אייפון, דורש רישיון לשימוש.
מתי כןצילום מוצר (packshot), אריזה, השקה של מוצר פיזי.
מתי לאכשאין מודל של המוצר. עדיף מכשיר כללי או תמונה אמיתית מאשר מודל שמחקה מוצר.
פרומפט מלא
packshot · glTF + HDRI
<inputs>
Ask me for my product as a glTF/GLB model (from my designer, from Blender, or a model whose licence allows this use), my label artwork or brand name, and an HDRI environment. If I have no model, ask whether to use a generic shape instead; never imitate someone else's real product. If I skip the HDRI, use a CC0 one from Poly Haven.
</inputs>

<direction>
A 12-second packshot, 1920x1080, 60fps, in three.js. The product stands on a soft contact shadow and turns a quarter turn on every third beat, settling with a slight overshoot. The first half is lit by a clean studio environment on a light gradient; the second half by the HDRI, shown blurred behind the product, with the environment slowly rotating so reflections sweep across the surface. Mid-film, a new label wipes across the old one. The camera pushes in slowly, once.
Banned: spinning at constant speed, a lighting change that is not on a beat, floating particles, lens flares.
</direction>

<structure>
120 BPM. Quarter turns on beats 3, 6, 9, 12, 16 and 20. Beat 12: the light changes and the label wipe starts. The push-in runs from beat 0 to beat 22.
</structure>

<build>
three.js WebGLRenderer, ACES tone mapping. Load the model with GLTFLoader and the HDRI with RGBELoader; pre-filter both environments once with PMREMGenerator (fromScene(new RoomEnvironment()) and fromEquirectangular(hdr)).
Normalise the model: centre it, stand it on y = 0, scale it to a fixed height.
The label: draw the model's base colour image onto a canvas, paint the label artwork over its label area (find it in the UV layout), and use the canvas as a CanvasTexture with flipY = false and SRGBColorSpace; redraw it every frame so the wipe is a function of t.
Rotation is a sum of springs keyed on the beats; scene.environmentRotation.y and scene.backgroundRotation.y are functions of t.
Optimise the model for the web first: gltf-transform resize --width 1024 --height 1024, then gltf-transform webp.
</build>

<gotchas>
- glTF textures use flipY = false. A CanvasTexture defaults to flipY = true, so the label comes out upside down unless you set it.
- A label wider than about a third of the circumference disappears around the back. Keep words short, or stack them.
- CC0 model licences usually exclude logos and trademarks. Paint out any brand mark that isn't yours.
- Await both loaders before the first seek(), or the first frames render an empty scene.
</gotchas>

<start>
Show me stills at beats 4, 12 and 20 before rendering.
</start>
09

מפת הכלים: מה עוד קיים

הקטלוג בנוי על HTML ו-seek(t). הנה הכלים שעושים את אותה עבודה אחרת, ומתי כל אחד מנצח.

כל המידע על רישיונות ומחירים נבדק ב-17.10.2026, ומחירים משתנים, אז לפני עבודה מסחרית כדאי לבדוק שוב בקישור שבמקורות.

כלימה זהמתי לבחור בורישיון ומחיר
HTML + seek(t)השיטה של העמודקובץ HTML אחד ש-Claude כותב מאפס, עם פונקציה שמציירת כל רגע. Playwright מצלם, ffmpeg מרכיב.סרטון אחד בשליטה מלאה, בלי להתקין מסגרת (framework: מבנה מוכן לפרויקט שלם, עם כללים ופקודות משלו). כל ספרייה בקטלוג נכנסת לתוכו.חינם
Remotionremotion.devמסגרת שבה כל סרטון הוא רכיב React שמקבל את מספר הפריים. מרנדרת ל-MP4, גם בענן.הרבה סרטונים דומים מתבנית אחת (למשל סרטון אישי לכל לקוח), צוות שכבר עובד ב-React.חינם ליחידים ולחברות של עד 3 עובדים; מעבר לזה רישיון חברה בתשלום
HyperFramesHeyGen · v0.8קובץ HTML שבו לכל אלמנט יש data-start ו-data-duration, וצילום דטרמיניסטי ל-MP4: כל פריים יוצא תמיד אותו דבר, בדיוק כמו seek(t). נבנה לסוכני AI (AI שמבצע פעולות בעצמו, כמו Claude Code), כולל סקילים: קובצי הוראות שמלמדים סוכן לעבוד עם הכלי.כשרוצים את שיטת ה-seek(t) עם כלי מוכן שמפעילים בפקודות בטרמינל (init, preview, render). עדיין לפני גרסה 1.0, אז דברים עוד עשויים להשתנות.קוד פתוח, Apache 2.0
GSAPgsap.comספריית אנימציה עם צירי זמן (timelines). אפשר לעצור ציר זמן ולקפוץ לכל רגע בו, ולכן הוא מתאים לצילום פריים אחרי פריים.כוריאוגרפיה מורכבת של הרבה אלמנטים. HyperFrames משתמש בו כברירת מחדל.חינמי לגמרי, גם מסחרית, כולל כל התוספים. הרישיון של Webflow (לא קוד פתוח) אוסר רק לבנות איתו כלי ליצירת אנימציות בלי קוד שמתחרה ב-Webflow
Motion Canvasmotioncanvas.ioספרייה ב-TypeScript (גרסה של JavaScript שבה מציינים לכל ערך את הסוג שלו, כדי לתפוס טעויות מוקדם), ועורך עם תצוגה חיה, לאנימציות וקטוריות שמתוזמנות לקריינות.סרטוני הסבר עם קריינות, דיאגרמות, קוד שמשתנה על המסך.קוד פתוח, MIT
Lottielottie-webפורמט אנימציה מבוסס JSON (פורמט טקסט פשוט לשמירת נתונים). אנימטור בונה ב-After Effects ומייצא עם התוסף Bodymovin, והאנימציה רצה בדפדפן ובאפליקציות. אפשר לקפוץ לכל פריים (goToAndStop).כשיש אנימציה מוכנה ממעצב, או מספריית LottieFiles, ורוצים לשלב אותה בסרטון.הנגן בקוד פתוח (MIT); לכל אנימציה רישיון משלה
Riverive.appעורך לאנימציות אינטראקטיביות שמגיבות למשתמש, בעזרת "מכונת מצבים": רשימת מצבים, כמו "רגיל", "העכבר מעל" ו"נלחץ", וכללים מתי עוברים ביניהם.אנימציה בתוך אפליקציה או אתר, שמגיבה ללחיצות. פחות לסרטון ליניארי.הנגנים בקוד פתוח (MIT); ייצוא דורש תוכנית בתשלום, מ-9$ לחודש בחיוב שנתי
Splinespline.designעורך תלת-ממד ויזואלי בדפדפן.לעצב סצנה תלת-ממדית ביד, ולייצא ל-GLTF או לקוד.תוכנית חינמית, ותוכניות בתשלום
React Three Fiberpmndrsthree.js בצורת רכיבי React.סצנת תלת-ממד גדולה בפרויקט React.קוד פתוח, MIT

איך בוחרים, בארבע שאלות

  1. סרטון אחד או מאה? אחד: HTML ו-seek(t). מאה מאותה תבנית: Remotion או HyperFrames.
  2. יש אנימציה מוכנה ממעצב? Lottie נכנס לכל אחת מהשיטות.
  3. זה בתוך אפליקציה ומגיב למשתמש? Rive. זו כבר לא שאלה של וידאו.
  4. צריך מודל תלת-ממדי מותאם? Blender או Spline, מייצאים GLTF, ומכניסים ל-three.js.
10

בונה הפרומפטים

מתחילים מתבנית, בונים את הסצנות על רשת הביטים, ומקבלים פרומפט אחד שלם לסרט כולו. אפשר לשמור ולשתף בקישור.

אין כאן AI. הבונה מרכיב את הפרומפט מחלקים קבועים, כך שאפשר לראות בדיוק איזה משפט כל בחירה מוסיפה. הוא בנוי בסדר של ששת הבלוקים:

  1. מתחילים מתבנית: השקת אפליקציה, הזמנת אוכל בסגנון של zero, מוצר פיזי או סרטון נתונים. כל תבנית ממלאת את כל השדות, והכל נשאר פתוח לשינוי.
  2. הסיפור, הפורמט, הקצב והמיתוג נכנסים ל-<direction>. את המשפט על הסרטון כתבו באנגלית; הוא נכנס לפרומפט כמו שהוא.
  3. האלמנטים: כל אלמנט מהקטלוג מוסיף שורה לכל בלוק: מה לראות, איך לבנות אותו ב-<build>, ואיזה באג להזהיר מפניו ב-<gotchas>. הבונה גם מסכם אילו מנועים הסרט צריך (Canvas, ‏three.js, ‏WebGPU) ומוסיף את הדגלים של WebGPU כשצריך.
  4. הסצנות הן <structure>: לכל סצנה יש שם, מספר ביטים, הטקסט שעל המסך, אלמנט, ואיך היא נולדת מהקודמת. מסמנים באיזו סצנה נוחת הדרופ, והאורך של הסרט מחושב מסכום הביטים. כשמזיזים את סרגל האורך, כל הסצנות נמתחות יחד.
  5. איך דברים הופכים זה לזה: פעלי התנועה והמצלמה ממילון הממשק, טריק חתימה אחד, ורשימת האסור.
  6. שמירה: הבונה זוכר את מה שבניתם בדפדפן הזה, "העתק קישור" שומר את כל הבחירות בתוך הכתובת כדי לחזור אליהן או לשלוח לאחרים, ו"הורד כקובץ" שומר את הפרומפט כטקסט.
10.1

הפרומפט שלכם

6 blockslive

הצעד הבא: הדביקו ב-Claude Code (או בכל סוכן קוד), ענו על השאלות שהוא שואל ב-<inputs>, ואשרו את מפת הביטים והסטילס לפני הרינדור המלא. את התהליך המלא, מצילום ועד מוזיקה, תמצאו בפרק הצנרת בעמוד השיטה. (סוכן קוד הוא AI שכותב ומריץ קוד בעצמו על המחשב שלכם.)

11

מקורות

כל הקישורים נבדקו כחיים ב-17.10.2026.

  1. Recharts: ספריית הגרפים, MIT.
  2. shadcn/ui · Introduction: "This is not a component library", ואיך מוסיפים רכיבים.
  3. Radix Primitives: רכיבי התנהגות ונגישות בלי עיצוב.
  4. Tailwind CSS
  5. Lucide: ספריית האייקונים, ISC.
  6. Simple Icons ו-ההבהרה המשפטית שלהם על סימנים מסחריים.
  7. three.js ו-MeshPhysicalMaterial.
  8. MDN · font-variant-numeric (tabular-nums).
  9. MDN · stroke-dashoffset
  10. MDN · backdrop-filter
  11. MDN · conic-gradient()
  12. Playwright ו-FFmpeg
  13. Remotion · LICENSE: חינם ליחידים ולחברות עד 3 עובדים.
  14. HyperFrames (HeyGen), Apache 2.0, והסקירה שלי ב-yuv.ai.
  15. GSAP · Pricing: חינמי לגמרי, כולל התוספים, והרישיון הסטנדרטי: מסחרי מותר, כלי אנימציה ללא קוד שמתחרה ב-Webflow אסור.
  16. Motion Canvas, MIT.
  17. lottie-web, MIT, ו-Lottie בוויקיפדיה (התוסף Bodymovin מ-2015, והספריות של Airbnb מ-2017).
  18. Rive · the new $9/mo plan (20.10.2025): הרנטיימים ב-MIT, ייצוא מתוכנית בתשלום.
  19. Spline
  20. React Three Fiber, MIT.
  21. Chart.js, Apache ECharts, D3
  22. מקורות עמוד השיטה: המאמר והפרומפטים המקוריים של zero (@twoclipping).