YUV.AIMOTION CATALOG לעמוד השיטה English
YUV.AI · MOTION CATALOG

מה אפשר
לבקש.

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

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

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

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

18אלמנטים חיים9מושגי יסוד18פרומפטים מלאים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, כלי ליצירת סרטונים מקוד שנכיר בפרק 07, חינמי ליחידים ולחברות של עד שלושה עובדים. לפני עבודה מסחרית, בדקו.
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

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

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

06.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>
06.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>
06.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>
06.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>
07

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

הקטלוג בנוי על 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.
08

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

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

אין כאן AI. הבונה מרכיב את הפרומפט מחלקים קבועים, כך שאפשר לראות בדיוק איזה משפט כל בחירה מוסיפה: כל אלמנט מוסיף שורה לכל אחד מששת הבלוקים, למשל איך לבנות אותו ב-<build> ואיזה באג להזהיר מפניו ב-<gotchas>. קצב המוזיקה והאורך מחושבים למספר ביטים, והאלמנטים מתפזרים לאורך הסרט בין פתיחה של ארבעה ביטים לסיום של ארבעה, בסדר של סיפור: קודם המוצר, אחר כך ההוכחה (גרפים ומספרים), ובסוף האמון (לוגואים). מעברים ורקע לא מקבלים טווח ביטים משלהם, כי הם לא סצנה: הם נשזרים לאורך כל הסרט. את המשפט בשדה 1 כתבו באנגלית; הוא נכנס לפרומפט כמו שהוא.

08.1

הפרומפט שלכם

6 blockslive

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

09

מקורות

כל הקישורים נבדקו כחיים ב-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).