{
 "version": 3,
 "format": "START --> END item NAME \"slot|slot\" options",
 "shared_options": {
  "pos": "x,y centre on 0-1 grid (default 0.5,0.5)",
  "w": "square side as fraction of frame width (default 0.5)",
  "theme": "theme name for this item only",
  "accent": "#hex accent override"
 },
 "number_formats": {
  "lakh": "1.2K / 2.50L / 1.00Cr",
  "inr": "\u20b9 with Indian grouping",
  "group": "1,23,456",
  "pct": "72%",
  "one": "one decimal",
  "short": "2.4K / 1.2M",
  "plain": "no grouping (years)"
 },
 "colour_roles": [
  "$surface",
  "$accent",
  "$accentInk",
  "$good",
  "$goodInk",
  "$ink",
  "$soft",
  "$bar"
 ],
 "themes": {
  "midnight": {
   "bg": "#0A0E12",
   "sfHi": "#2B3A55",
   "sfLo": "#141C2B",
   "acHi": "#FFD166",
   "acLo": "#F08A24",
   "acInk": "#2B1400",
   "goodHi": "#3BD68A",
   "goodLo": "#0E7A45",
   "goodInk": "#FFFFFF",
   "ink": "#FFFFFF",
   "soft": "#9FB3D9",
   "bar": "#5B6B95",
   "vig": "rgba(0,0,0,.55)"
  },
  "sunset": {
   "bg": "#1A0B12",
   "sfHi": "#5A1E3A",
   "sfLo": "#2A0C1C",
   "acHi": "#FF9A62",
   "acLo": "#E2335F",
   "acInk": "#2A0610",
   "goodHi": "#FFC15E",
   "goodLo": "#E07B1A",
   "goodInk": "#2A0610",
   "ink": "#FFF4EC",
   "soft": "#F5B7C5",
   "bar": "#A04A6E",
   "vig": "rgba(0,0,0,.5)"
  },
  "ocean": {
   "bg": "#04141C",
   "sfHi": "#0F4C5C",
   "sfLo": "#062530",
   "acHi": "#6AF5D8",
   "acLo": "#12A3B8",
   "acInk": "#022A2E",
   "goodHi": "#6AF5D8",
   "goodLo": "#0E8C8C",
   "goodInk": "#022A2E",
   "ink": "#EFFFFC",
   "soft": "#8FD3D8",
   "bar": "#2E7C8C",
   "vig": "rgba(0,0,0,.5)"
  },
  "neon": {
   "bg": "#07070C",
   "sfHi": "#24124A",
   "sfLo": "#0C0718",
   "acHi": "#FF5CF4",
   "acLo": "#7A2BFF",
   "acInk": "#FFFFFF",
   "goodHi": "#5CFF9D",
   "goodLo": "#00B85C",
   "goodInk": "#04210F",
   "ink": "#FFFFFF",
   "soft": "#C9A8FF",
   "bar": "#4B2D8F",
   "vig": "rgba(0,0,0,.6)"
  },
  "paper": {
   "bg": "#F3EEE4",
   "sfHi": "#FFFFFF",
   "sfLo": "#E9E1D1",
   "acHi": "#E4572E",
   "acLo": "#B8321A",
   "acInk": "#FFFFFF",
   "goodHi": "#3E9B65",
   "goodLo": "#1D5C38",
   "goodInk": "#FFFFFF",
   "ink": "#1B1A17",
   "soft": "#6B655A",
   "bar": "#C9BEA8",
   "vig": "rgba(80,60,30,.12)"
  },
  "mono": {
   "bg": "#0B0B0B",
   "sfHi": "#2C2C2C",
   "sfLo": "#141414",
   "acHi": "#FFFFFF",
   "acLo": "#C9C9C9",
   "acInk": "#111111",
   "goodHi": "#FFFFFF",
   "goodLo": "#BDBDBD",
   "goodInk": "#111111",
   "ink": "#FFFFFF",
   "soft": "#A8A8A8",
   "bar": "#4A4A4A",
   "vig": "rgba(0,0,0,.55)"
  }
 },
 "items": [
  {
   "name": "stat.tile",
   "pack": "general",
   "status": "final",
   "about": "One big number that counts up, with a label.",
   "use": "",
   "slots": [
    {
     "key": "value",
     "type": "number",
     "optional": false,
     "hint": "the value",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": false,
     "hint": "label under it, 1 to 3 words, no commas",
     "length": "up to 3 words"
    }
   ],
   "options": "fmt=lakh|inr|pct|group",
   "example": "00:02.00 --> 00:06.00 item stat.tile \"250000|per month\" fmt=lakh pos=0.5,0.4",
   "layers": "card id=@ w=1 h=1 grad=$surface in=popIn\n+0.15 text \"{1}\" parent=@ pos=0,-0.06 size=150 weight=800 font=display count=0,{1},+0.3,+1.6,{fmt} in=fadeUp\n+0.35 text \"{2}\" parent=@ pos=0,0.2 size=46 color=$soft in=fadeUp"
  },
  {
   "name": "badge.check",
   "pack": "general",
   "status": "final",
   "about": "Green disc with a check mark that draws itself.",
   "use": "",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:04.00 --> 00:07.00 item badge.check \"Done\" pos=0.5,0.45",
   "layers": "shape circle id=@ w=0.7 gradr=$good shadow=0.3 in=popIn\n+0.2 shape check parent=@ w=0.36 thick=0.18 color=$goodInk in=scaleIn\n+0.45 text \"{1}\" pos=0,0.48 size=56 weight=800 in=fadeUp"
  },
  {
   "name": "tag.price",
   "pack": "general",
   "status": "final",
   "about": "Price-flash starburst that pulses.",
   "use": "",
   "slots": [
    {
     "key": "price",
     "type": "text",
     "optional": false,
     "hint": "price, e.g. \u20b9499",
     "length": "up to 4 words"
    },
    {
     "key": "above",
     "type": "text",
     "optional": true,
     "hint": "small word above",
     "length": "1 word"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:06.50 item tag.price \"\u20b9499|only\" pos=0.7,0.3 w=0.4",
   "layers": "shape burst id=@ w=0.9 points=12 inner=0.78 grad=$accent rot=-8 in=popIn emph=pulse\n+0.15 text \"{2}\" parent=@ pos=0,-0.16 size=40 weight=600 color=$accentInk opacity=0.8 in=fadeUp\n+0.25 text \"{1}\" parent=@ pos=0,0.06 size=110 weight=800 color=$accentInk in=popIn"
  },
  {
   "name": "icon.tile",
   "pack": "general",
   "status": "final",
   "about": "3D sticker on a soft card, with a label. Floats gently.",
   "use": "",
   "slots": [
    {
     "key": "sticker",
     "type": "emoji",
     "optional": false,
     "hint": "sticker",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": false,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:05.00 item icon.tile \"\ud83d\ude80|Launch\" pos=0.5,0.45",
   "layers": "card id=@ w=1 h=1 grad=$surface in=popIn\n+0.2 sticker \"{1}\" parent=@ pos=0,-0.1 w=0.5 in=popIn emph=float\n+0.4 text \"{2}\" parent=@ pos=0,0.3 size=54 weight=800 in=fadeUp"
  },
  {
   "name": "alert.tile",
   "pack": "general",
   "status": "final",
   "about": "Warning triangle that drops in and shakes.",
   "use": "",
   "slots": [
    {
     "key": "warning",
     "type": "text",
     "optional": false,
     "hint": "warning line",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:05.00 --> 00:08.00 item alert.tile \"Don't miss this\" pos=0.5,0.4",
   "layers": "shape triangle id=@ w=0.75 grad=$accent radius=0.08 in=dropIn emph=shake\n+0.1 text \"!\" parent=@ pos=0,0.08 size=180 weight=800 color=$accentInk\n+0.4 text \"{1}\" pos=0,0.5 size=52 weight=800 in=fadeUp"
  },
  {
   "name": "quote.square",
   "pack": "general",
   "status": "final",
   "about": "A short quote on a card, revealed word by word.",
   "use": "",
   "slots": [
    {
     "key": "quote",
     "type": "text",
     "optional": false,
     "hint": "quote (\\n for a line break)",
     "length": "sentence"
    },
    {
     "key": "author",
     "type": "text",
     "optional": true,
     "hint": "who said it",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:08.00 item quote.square \"Small steps,\\nbig results|Asha Rao\" pos=0.5,0.45",
   "layers": "card id=@ w=1 h=1 grad=$surface in=popIn\n+0.1 text \"\u201c\" parent=@ pos=-0.3,-0.3 size=200 font=playfair color=$accent in=fadeUp\n+0.3 text \"{1}\" parent=@ pos=0,0 size=64 weight=800 align=center in=wordIn\n+1.2 text \"\u2014 {2}\" parent=@ pos=0,0.3 size=38 color=$soft in=fadeUp"
  },
  {
   "name": "list.tile",
   "pack": "general",
   "status": "final",
   "about": "Three points with ticks, sliding in one after another.",
   "use": "",
   "slots": [
    {
     "key": "point1",
     "type": "text",
     "optional": false,
     "hint": "point 1",
     "length": "up to 4 words"
    },
    {
     "key": "point2",
     "type": "text",
     "optional": false,
     "hint": "point 2",
     "length": "up to 4 words"
    },
    {
     "key": "point3",
     "type": "text",
     "optional": true,
     "hint": "point 3",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:09.00 item list.tile \"Save daily|Invest monthly|Review yearly\" pos=0.5,0.45",
   "layers": "card id=@ w=1 h=1 grad=$surface in=popIn\n# each row i = 0,1,2 starts at +0.3 + 0.35*i, y = -0.25 + 0.25*i\n+0.3  shape circle parent=@ pos=-0.32,-0.25 w=0.1 gradr=$good in=popIn\n+0.3  text \"{1}\" parent=@ pos=0.08,-0.25 w=0.6 size=46 weight=600 align=left in=slideL\n# \u2026rows 2 and 3 the same with {2} and {3}"
  },
  {
   "name": "bars.tile",
   "pack": "general",
   "status": "final",
   "about": "Three bars grow; the last one carries a counting label.",
   "use": "",
   "slots": [
    {
     "key": "bar1",
     "type": "number",
     "optional": false,
     "hint": "bar 1",
     "length": "number"
    },
    {
     "key": "bar2",
     "type": "number",
     "optional": false,
     "hint": "bar 2",
     "length": "number"
    },
    {
     "key": "bar3",
     "type": "number",
     "optional": false,
     "hint": "bar 3 (labelled)",
     "length": "number"
    }
   ],
   "options": "fmt=lakh|inr|pct|group",
   "example": "00:04.00 --> 00:09.00 item bars.tile \"120000|180000|260000\" fmt=lakh pos=0.5,0.45",
   "layers": "card id=@ w=1 h=1 grad=$surface in=popIn\n# bars grow from a shared ground line, heights scaled to the largest slot\n+0.2 shape rect id=@b1 parent=@ pos=-0.25,0.32 anchor=bottom w=0.14 radius=0.2 color=$bar growTo=h,0,{1}/max*0.55,+0.2,+1.0\n+0.35 shape rect id=@b2 \u2026 growTo=h,0,{2}/max*0.55,+0.35,+1.15\n+0.5 shape rect id=@b3 \u2026 grad=$accent growTo=h,0,{3}/max*0.55,+0.5,+1.3\n+0.5 text \"0\" follow=@b3,top,-24 size=44 weight=800 count=0,{3},+0.5,+1.3,{fmt}"
  },
  {
   "name": "heart.like",
   "pack": "general",
   "status": "final",
   "about": "Heart pops, a ripple and ten sparks burst out, +1 floats up.",
   "use": "",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:05.00 item heart.like \"1.2K likes\" pos=0.5,0.45",
   "layers": "shape heart id=@ w=0.46 grad=$accent keys=\"scale:+0=0,+0.25=1.25~eb,+0.5=1\"\n+0.2 shape ring parent=@ w=0.5 thick=0.06 color=$accent keys=\"scale:+0.2=0.6,+0.9=1.7;opacity:+0.2=1,+0.9=0\"\n# 10 sparks, i = 0..9, angle 36\u00b0\u00b7i: dots fly out to radius 0.34 and fade\n+0.25 shape circle parent=@ w=0.045 color=$accent|$good keys=\"x:+0.25=0,+0.95=cos\u00b70.34;y:\u2026;opacity:+0.6=1,+0.95=0\"\n+0.4 text \"+1\" pos=0.2,-0.25 size=60 weight=800 color=$accent keys=\"y:+0.4=-0.2,+1.4=-0.38;opacity:+1.0=1,+1.4=0\"\n+0.5 text \"{1}\" pos=0,0.36 size=48 weight=800 in=fadeUp"
  },
  {
   "name": "rocket.launch",
   "pack": "general",
   "status": "final",
   "about": "Rocket rumbles, blasts off through a smoke cloud, then the label lands.",
   "use": "",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label after lift-off",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:05.00 item rocket.launch \"Launched\" pos=0.5,0.45",
   "layers": "card id=@ w=1 h=1 grad=$surface in=popIn\n+0.2 sticker \"\ud83d\ude80\" parent=@ w=0.4 rot=-45 keys=\"x:+0.2=0,+0.25=-0.01~ll,+0.3=0.01~ll,\u2026(rumble to +0.9);y:+0.9=0,+1.5=-1.1~ee;scale:+0.9=1,+1.5=1.3\"\n# 8 smoke puffs from the exhaust: soft circles grow, drift sideways and fade\n+0.85 shape circle parent=@ pos=0,0.2 w=0.12 color=$soft blur=0.3 keys=\"scale:+0.85=0.3,+1.8=1.6;opacity:+0.85=0.8,+1.8=0;x:\u2026\"\n+1.4 text \"{1}\" parent=@ size=70 weight=800 in=popIn"
  },
  {
   "name": "coin.rain",
   "pack": "general",
   "status": "final",
   "about": "Coins rain into a pile while the total counts up.",
   "use": "",
   "slots": [
    {
     "key": "total",
     "type": "number",
     "optional": false,
     "hint": "total",
     "length": "number"
    }
   ],
   "options": "fmt=inr|lakh|group",
   "example": "00:03.00 --> 00:07.00 item coin.rain \"50000\" fmt=inr pos=0.5,0.45",
   "layers": "card id=@ w=1 h=1 grad=$surface in=popIn\n# 9 coins, i = 0..8, staggered 0.12 s, random x in \u22120.3..0.3, land on a pile line\n+0.2 sticker \"\ud83e\ude99\" parent=@ w=0.16 keys=\"y:+0.2=-0.7,+0.75=0.28~eb;rot:+0.2=-30,+0.75=10\"\n+0.2 text \"{1}\" parent=@ pos=0,-0.18 size=96 weight=800 color=$accent count=0,{1},+0.2,+1.6,{fmt} emph=pulse"
  },
  {
   "name": "trophy.reveal",
   "pack": "general",
   "status": "final",
   "about": "Spinning starburst, the trophy slams down, confetti falls.",
   "use": "",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:04.00 --> 00:08.00 item trophy.reveal \"Winner\" pos=0.5,0.45",
   "layers": "shape burst id=@ w=0.9 points=16 inner=0.6 grad=$accent opacity=0.35 keys=\"scale:+0=0,+0.4=1;rot:+0=0,+4=90~ll\"\n+0.25 sticker \"\ud83c\udfc6\" parent=@ w=0.42 keys=\"y:+0.25=-0.6,+0.6=0~eb;scale:+0.6=1.15,+0.8=1\"\n# 18 confetti pieces: small rects in $accent / $good / $ink, fall with rot keys\n+0.6 shape rect w=0.03 h=0.05 color=$accent keys=\"y:+0.6=-0.55,+2.2=0.6;x:\u2026;rot:+0.6=0,+2.2=540\"\n+0.7 text \"{1}\" pos=0,0.36 size=64 weight=800 in=popIn"
  },
  {
   "name": "countdown.tile",
   "pack": "general",
   "status": "final",
   "about": "3, 2, 1 beats with a ripple each, then GO! shakes in.",
   "use": "",
   "slots": [
    {
     "key": "final",
     "type": "text",
     "optional": true,
     "hint": "final word",
     "length": "1 word"
    }
   ],
   "options": "from=3",
   "example": "00:00.00 --> 00:04.50 item countdown.tile \"GO!\" pos=0.5,0.45",
   "layers": "card id=@ w=1 h=1 grad=$surface in=popIn\n# beats k = 0,1,2 at +0.3 + 0.8\u00b7k: number pops in big and shrinks out, ring ripples\n+0.3 text \"3\" parent=@ size=260 weight=800 keys=\"scale:+0.3=1.6,+0.5=1,+1.0=0.6;opacity:+0.3=0,+0.4=1,+1.0=0\"\n+0.3 shape ring parent=@ w=0.7 thick=0.04 color=$accent keys=\"scale:+0.3=0.5,+1.0=1.3;opacity:+0.3=1,+1.0=0\"\n# \u2026\"2\" at +1.1, \"1\" at +1.9\n+2.7 text \"{1}\" parent=@ size=200 weight=800 color=$accent in=popIn emph=shake"
  },
  {
   "name": "glitch.title",
   "pack": "general",
   "status": "final",
   "about": "A word tears in with RGB split and slice glitches, then locks.",
   "use": "",
   "slots": [
    {
     "key": "title",
     "type": "text",
     "optional": false,
     "hint": "title (short, caps)",
     "length": "1 word"
    },
    {
     "key": "subtitle",
     "type": "text",
     "optional": true,
     "hint": "subtitle",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:00.50 --> 00:04.00 item glitch.title \"BREAKING|news\" pos=0.5,0.45",
   "layers": "text \"{1}\" id=@ size=130 weight=800 font=anton fx=glitch:amount=0.8,speed=1;rgb:amount=0.6 keys=\"\u2026fx off at +1.1\" in=charPop\n+1.1 shape rect parent=@ pos=0,0.14 h=0.02 color=$accent growTo=w,0,0.8,+1.1,+1.5\n+1.3 text \"{2}\" parent=@ pos=0,0.24 size=44 weight=600 color=$soft in=wordIn"
  },
  {
   "name": "shatter.reveal",
   "pack": "general",
   "status": "final",
   "about": "A mystery card cracks into pieces that fly away to reveal the number.",
   "use": "",
   "slots": [
    {
     "key": "value",
     "type": "number",
     "optional": false,
     "hint": "revealed value",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=lakh|inr|pct|group",
   "example": "00:02.00 --> 00:06.00 item shatter.reveal \"10000000|subscribers\" fmt=lakh pos=0.5,0.45",
   "layers": "card id=@ w=1 h=1 grad=$surface fx=shatter:mode=0,pieces=9,force=0.7,dur=0.6 out=none\n+0 text \"?\" parent=@ size=240 weight=800 color=$soft out=none\n# the card's life ends at +0.9 where shatter breaks it; the reveal sits beneath\n+0.8 text \"{1}\" size=150 weight=800 color=$accent count=0,{1},+0.9,+2.0,{fmt} in=zoomIn\n+1.0 text \"{2}\" pos=0,0.2 size=48 color=$soft in=fadeUp"
  },
  {
   "name": "bell.notify",
   "pack": "general",
   "status": "final",
   "about": "Bell swings, ripples ring out, a badge pops with the count.",
   "use": "",
   "slots": [
    {
     "key": "count",
     "type": "number",
     "optional": false,
     "hint": "badge count",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:04.50 item bell.notify \"3|new messages\" pos=0.5,0.45",
   "layers": "card id=@ w=1 h=1 grad=$surface in=popIn\n+0.2 sticker \"\ud83d\udd14\" parent=@ pos=0,-0.06 w=0.42 keys=\"rot:+0.2=0,+0.35=22,+0.5=-18,+0.65=12,+0.8=-7,+0.95=0\"\n+0.25 shape ring parent=@ w=0.5 thick=0.03 color=$soft keys=\"scale:+0.25=0.7,+1.0=1.5;opacity:+0.25=0.9,+1.0=0\"\n+0.5 shape circle parent=@ pos=0.17,-0.22 w=0.17 grad=$accent in=popIn\n+0.5 text \"{1}\" parent=@ pos=0.17,-0.22 size=56 weight=800 color=$accentInk count=0,{1},+0.5,+0.9\n+0.9 text \"{2}\" parent=@ pos=0,0.3 size=46 weight=600 color=$soft in=fadeUp"
  },
  {
   "name": "follow.cta",
   "pack": "general",
   "status": "final",
   "about": "A finger taps the button and it flips to Following.",
   "use": "end screens, mid-video asks, newsletter or channel plugs",
   "slots": [
    {
     "key": "button",
     "type": "text",
     "optional": false,
     "hint": "button word",
     "length": "1 word"
    },
    {
     "key": "after",
     "type": "text",
     "optional": true,
     "hint": "word after the tap",
     "length": "1 word"
    }
   ],
   "options": "",
   "example": "00:40.00 --> 00:44.00 item follow.cta \"Follow|Following\" pos=0.5,0.75",
   "layers": "shape pill id=@ w=0.62 h=0.2 grad=$accent shadow=0.3 in=popIn\n+0 text \"{1}\" parent=@ size=64 weight=800 color=$accentInk out=none keys=\"opacity:+1.05=1~eh,+1.1=0\"\n+0.3 sticker \"\ud83d\udc46\" parent=@ pos=0.38,0.45 w=0.22 keys=\"x:+0.3=0.38,+0.9=0.06;y:+0.3=0.45,+0.9=0.08;scale:+0.95=1,+1.05=0.82,+1.15=1;opacity:+1.5=1,+1.8=0\"\n+1.05 shape pill parent=@ w=0.62 h=0.2 grad=$surface stroke=4 strokeColor=$accent in=none keys=\"scale:+1.05=0.92,+1.25=1\"\n+1.1 text \"{2} \u2713\" parent=@ size=60 weight=800 in=none"
  },
  {
   "name": "progress.bar",
   "pack": "general",
   "status": "final",
   "about": "A bar fills in steps with a running percentage and a shine.",
   "use": "loading, goals, course progress, savings targets, \"part 2 of 3\"",
   "slots": [
    {
     "key": "percent",
     "type": "number",
     "optional": false,
     "hint": "percent 0\u2013100",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": false,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:05.00 --> 00:08.00 item progress.bar \"78|Saving goal\" pos=0.5,0.5",
   "layers": "card id=@ w=1 h=0.5 grad=$surface in=popIn\n+0.2 text \"{2}\" parent=@ pos=-0.2,-0.12 size=44 weight=600 color=$soft align=left in=fadeUp\n+0.2 text \"0%\" parent=@ pos=0.3,-0.12 size=56 weight=800 color=$accent count=0,{1},+0.3,+1.6,pct\n+0.2 shape pill parent=@ pos=0,0.08 w=0.8 h=0.07 color=$bar\n+0.3 shape pill parent=@ pos=-0.4,0.08 anchor=left h=0.07 grad=$accent growTo=w,0,{1}/100*0.8,+0.3,+1.6"
  },
  {
   "name": "compare.split",
   "pack": "general",
   "status": "final",
   "about": "Before and after: a divider wipes across and reveals the change.",
   "use": "transformations, old vs new, mistakes vs fixes, results",
   "slots": [
    {
     "key": "left",
     "type": "text",
     "optional": false,
     "hint": "left label",
     "length": "1 word"
    },
    {
     "key": "right",
     "type": "text",
     "optional": false,
     "hint": "right label",
     "length": "1 word"
    },
    {
     "key": "leftSticker",
     "type": "emoji",
     "optional": true,
     "hint": "left sticker",
     "length": "number"
    },
    {
     "key": "rightSticker",
     "type": "emoji",
     "optional": true,
     "hint": "right sticker",
     "length": "number"
    }
   ],
   "options": "",
   "example": "00:10.00 --> 00:14.00 item compare.split \"Before|After|\ud83d\ude29|\ud83d\ude0e\" pos=0.5,0.45",
   "layers": "card id=@ w=1 h=1 grad=$surface in=popIn\n+0.2 sticker \"{3}\" parent=@ pos=-0.22,0 w=0.3 in=popIn\n+0.2 text \"{1}\" parent=@ pos=-0.22,0.3 size=44 weight=600 color=$soft in=fadeUp\n+0.6 card parent=@ pos=0.25,0 w=0.5 h=1 grad=$accent keys=\"w:+0.6=0,+1.2=0.5\" radius=0\n+1.0 sticker \"{4}\" parent=@ pos=0.22,0 w=0.3 in=popIn emph=float\n+1.1 text \"{2}\" parent=@ pos=0.22,0.3 size=44 weight=800 color=$accentInk in=fadeUp\n+0.6 shape rect parent=@ w=0.012 h=1 color=$ink keys=\"x:+0.6=0.5,+1.2=0\""
  },
  {
   "name": "chat.bubble",
   "pack": "general",
   "status": "final",
   "about": "Typing dots, then a question; the reply pops in from the other side.",
   "use": "dialogue, FAQs, testimonials, \"people ask me\u2026\" hooks",
   "slots": [
    {
     "key": "message",
     "type": "text",
     "optional": false,
     "hint": "first message",
     "length": "sentence"
    },
    {
     "key": "reply",
     "type": "text",
     "optional": true,
     "hint": "reply",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:07.00 item chat.bubble \"Is this worth it?|100% yes!\" pos=0.5,0.45",
   "layers": "card id=@ pos=-0.12,-0.15 w=0.66 h=0.2 radius=0.4 grad=$surface in=popIn\n+0.2 text \"\u2022 \u2022 \u2022\" parent=@ size=50 color=$soft emph=pulse out=none keys=\"opacity:+0.9=1~eh,+1.0=0\"\n+1.0 text \"{1}\" parent=@ size=44 weight=600 in=fadeUp\n+1.5 card pos=0.14,0.15 w=0.5 h=0.2 radius=0.4 grad=$accent in=popIn\n+1.6 text \"{2}\" size=48 weight=800 color=$accentInk in=fadeUp"
  },
  {
   "name": "map.pin",
   "pack": "general",
   "status": "final",
   "about": "A pin drops onto its shadow, ripples spread, the place name slides up.",
   "use": "travel, locations, local businesses, \"where it happened\"",
   "slots": [
    {
     "key": "place",
     "type": "text",
     "optional": false,
     "hint": "place name",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item map.pin \"Mumbai, India\" pos=0.5,0.45",
   "layers": "shape circle id=@ pos=0,0.12 w=0.28 h=0.08 color=#000000 opacity=0.35 in=scaleIn\n+0.1 sticker \"\ud83d\udccd\" parent=@ pos=0,-0.12 w=0.34 keys=\"y:+0.1=-0.8,+0.55=-0.12~eb\"\n+0.55 shape ring parent=@ w=0.3 thick=0.04 color=$accent keys=\"scale:+0.55=0.3,+1.3=1.6;opacity:+0.55=1,+1.3=0\"\n+0.85 shape ring \u2026 same, 0.3 s later\n+0.8 card parent=@ pos=0,0.32 w=0.7 h=0.15 grad=$surface in=slideU\n+0.9 text \"{1}\" parent=@ pos=0,0.32 size=46 weight=800 in=fadeUp"
  },
  {
   "name": "step.number",
   "pack": "general",
   "status": "final",
   "about": "Outlined step number slides in, a bar sweeps, the title writes on.",
   "use": "tutorials, lists, recipes, \"3 things you need\" videos",
   "slots": [
    {
     "key": "step",
     "type": "text",
     "optional": false,
     "hint": "step number, e.g. 01",
     "length": "1 word"
    },
    {
     "key": "title",
     "type": "text",
     "optional": false,
     "hint": "step title",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:12.00 --> 00:16.00 item step.number \"01|Set your goal\" pos=0.5,0.45",
   "layers": "text \"{1}\" id=@ pos=0,-0.12 size=280 weight=800 font=anton color=$accent in=slideL\n+0.1 text \"{1}\" parent=@ pos=0.03,0.02 size=280 font=anton stroke=4 strokeColor=$ink opacity=0.35 in=slideR\n+0.45 shape pill parent=@ pos=0,0.2 h=0.02 grad=$accent growTo=w,0,0.6,+0.45,+0.8\n+0.6 text \"{2}\" parent=@ pos=0,0.32 size=60 weight=800 in=wordIn"
  },
  {
   "name": "arrow.trend",
   "pack": "general",
   "status": "final",
   "about": "A zig-zag line climbs and draws itself, the area fills, the gain counts up.",
   "use": "growth, stats, results, prices going up (flip it for down)",
   "slots": [
    {
     "key": "change",
     "type": "number",
     "optional": false,
     "hint": "change",
     "length": "number"
    }
   ],
   "options": "fmt=pct|group dir=up|down",
   "example": "00:06.00 --> 00:10.00 item arrow.trend \"32\" fmt=pct dir=up pos=0.5,0.45",
   "layers": "card id=@ w=1 h=1 grad=$surface in=popIn\n+0.2 shape line parent=@ points=\"-0.35,0.25 -0.15,0.08 0,0.16 0.18,-0.08 0.35,-0.25\" thick=0.03 color=$accent keys=\"draw:+0.2=0,+1.2=1\"\n+0.9 shape arrow parent=@ pos=0.35,-0.25 w=0.1 rot=-45 color=$accent in=popIn\n+1.0 text \"+{1}%\" parent=@ pos=-0.15,-0.2 size=110 weight=800 color=$accent count=0,{1},+1.0,+1.7,pct in=popIn"
  },
  {
   "name": "versus.tile",
   "pack": "general",
   "status": "final",
   "about": "Two sides slam in from the edges and VS crashes between them.",
   "use": "comparisons, debates, product A vs B, option 1 vs option 2",
   "slots": [
    {
     "key": "left",
     "type": "text",
     "optional": false,
     "hint": "left side",
     "length": "1 word"
    },
    {
     "key": "right",
     "type": "text",
     "optional": false,
     "hint": "right side",
     "length": "1 word"
    }
   ],
   "options": "",
   "example": "00:08.00 --> 00:12.00 item versus.tile \"Rent|Buy\" pos=0.5,0.45",
   "layers": "card id=@ pos=-0.25,0 w=0.5 h=1 radius=0 grad=$surface keys=\"x:+0=-0.8,+0.4=-0.25~eb\"\n+0 card pos=0.25,0 w=0.5 h=1 radius=0 grad=$accent keys=\"x:+0=0.8,+0.4=0.25~eb\"\n+0.3 text \"{1}\" pos=-0.25,0 size=70 weight=800 in=fadeUp\n+0.3 text \"{2}\" pos=0.25,0 size=70 weight=800 color=$accentInk in=fadeUp\n+0.5 shape circle w=0.26 color=$ink in=popIn emph=shake\n+0.5 text \"VS\" size=80 weight=800 font=anton color=$bg in=popIn emph=shake"
  },
  {
   "name": "tip.bulb",
   "pack": "general",
   "status": "final",
   "about": "The bulb flickers on, a glow and rays spread, \"Pro tip\" appears.",
   "use": "tips, ideas, hacks, \"here's the trick\" moments",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:15.00 --> 00:19.00 item tip.bulb \"Pro tip\" pos=0.5,0.45",
   "layers": "shape circle id=@ w=0.6 gradr=$accent blur=0.6 keys=\"opacity:+0.6=0,+1.0=0.6;scale:+0.6=0.5,+1.0=1\" emph=breathe\n+0.6 shape burst parent=@ w=0.75 points=12 inner=0.2 color=$accent opacity=0.25 keys=\"rot:+0.6=0,+4=60~ll;scale:+0.6=0,+1.0=1\"\n+0 sticker \"\ud83d\udca1\" parent=@ w=0.36 keys=\"opacity:+0=0,+0.15=1~eh,+0.25=0.2~eh,+0.35=1~eh,+0.45=0.3~eh,+0.6=1\"\n+0.9 text \"{1}\" pos=0,0.36 size=60 weight=800 in=popIn"
  },
  {
   "name": "myth.fact",
   "pack": "general",
   "status": "final",
   "about": "The myth gets crossed out, then a FACT stamp slams on and the truth appears.",
   "use": "myth-busting, corrections, \"you've been told wrong\" hooks",
   "slots": [
    {
     "key": "myth",
     "type": "text",
     "optional": false,
     "hint": "the myth, a short sentence",
     "length": "sentence"
    },
    {
     "key": "fact",
     "type": "text",
     "optional": false,
     "hint": "the truth, a short sentence",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:04.00 --> 00:09.00 item myth.fact \"You need a big salary to save|You need a habit\"",
   "layers": "text \"MYTH\" id=@ pos=0,-0.36 size=70 font=anton color=$soft in=fadeUp\n+0.1 text \"{1}\" pos=0,-0.16 w=0.84 size=44 weight=600 color=$soft align=center wrap=2 in=fadeUp\n+0.6 strike on \"{1}\" color=#FF3B3B thick=0.2em sweeps left to right, line by line, +0.6 to +1.0\n+0.9 text \"{1}\" (same layer) keys=\"opacity:+0.9=1,+1.1=0.45\"\n+1.2 shape rect pos=0,0.1 w=0.42 h=0.15 radius=0.05 grad=$good rot=-6 keys=\"scale:+1.2=2.2,+1.45=0.95,+1.6=1;opacity:+1.2=0,+1.3=1\"\n+1.2 text \"FACT\" pos=0,0.1 size=80 font=anton color=$goodInk rot=-6 (same keys)\n+1.6 text \"{2}\" pos=0,0.33 w=0.86 size=52 weight=800 color=$ink align=center wrap=2 in=fadeUp"
  },
  {
   "name": "rating.stars",
   "pack": "general",
   "status": "final",
   "about": "Five stars pop in one by one while the score counts up.",
   "use": "reviews, ratings, product verdicts, testimonials",
   "slots": [
    {
     "key": "score",
     "type": "number",
     "optional": false,
     "hint": "score out of 5",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:20.00 --> 00:24.00 item rating.stars \"4.8|2,341 reviews\" pos=0.5,0.45",
   "layers": "card id=@ w=1 h=0.62 grad=$surface in=popIn\n+0.15 text \"{1}\" parent=@ pos=0,-0.12 size=150 weight=800 count=0,{1},+0.2,+1.2,one\n# 5 stars, k = 0..4, x = -0.3 + 0.15k, start +0.3 + 0.12k\n+0.3 shape star parent=@ pos=-0.3,0.1 w=0.12 points=5 inner=0.42 grad=$accent in=popIn\n+1.0 text \"{2}\" parent=@ pos=0,0.24 size=40 color=$soft in=fadeUp"
  },
  {
   "name": "search.type",
   "pack": "general",
   "status": "final",
   "about": "A search bar types the question, then results slide in under it.",
   "use": "\"I searched for\u2026\" hooks, how-tos, research, trending topics",
   "slots": [
    {
     "key": "query",
     "type": "text",
     "optional": false,
     "hint": "what gets typed",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:00.50 --> 00:05.00 item search.type \"how to save money\" pos=0.5,0.4",
   "layers": "card id=@ w=0.92 h=0.18 radius=1 grad=$surface stroke=3 strokeColor=$accent in=popIn\n+0.1 sticker \"\ud83d\udd0d\" parent=@ pos=-0.36,0 w=0.1\n+0.3 text \"{1}\" parent=@ pos=0.06,0 w=0.65 size=46 align=left in=typeOn\n# 3 result rows k = 0..2 at +1.6 + 0.15k: a card with two grey bars (skeleton lines)\n+1.6 card pos=0,0.2 w=0.92 h=0.13 grad=$surface opacity=0.8 in=slideU"
  },
  {
   "name": "price.drop",
   "pack": "general",
   "status": "final",
   "about": "The old price gets slashed, the new one drops in and bounces.",
   "use": "deals, discounts, \"it used to cost\u2026\", price comparisons",
   "slots": [
    {
     "key": "old",
     "type": "text",
     "optional": false,
     "hint": "old price",
     "length": "up to 4 words"
    },
    {
     "key": "new",
     "type": "text",
     "optional": false,
     "hint": "new price",
     "length": "up to 4 words"
    },
    {
     "key": "tag",
     "type": "text",
     "optional": true,
     "hint": "small tag, e.g. SALE",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:05.00 --> 00:09.00 item price.drop \"\u20b9999|\u20b9499|SALE\"",
   "layers": "text \"{1}\" id=@ pos=0,-0.18 size=90 weight=600 color=$soft in=fadeUp\n+0.5 shape line parent=@ w=0.5 thick=0.035 rot=-10 color=#FF3B3B growTo=w,0,0.5,+0.5,+0.75\n+0.8 text \"{2}\" pos=0,0.08 size=170 weight=800 color=$accent keys=\"y:+0.8=-0.4,+1.2=0.08~eb\"\n+1.1 shape pill pos=0.24,-0.1 w=0.3 h=0.1 grad=$accent rot=12 in=popIn emph=pulse\n+1.1 text \"{3}\" pos=0.24,-0.1 size=40 weight=800 color=$accentInk rot=12 in=popIn"
  },
  {
   "name": "percent.ring",
   "pack": "general",
   "status": "final",
   "about": "A ring draws round to the percentage while the number counts up.",
   "use": "completion, survey results, battery or health levels, \"9 out of 10\"",
   "slots": [
    {
     "key": "percent",
     "type": "number",
     "optional": false,
     "hint": "percent 0\u2013100",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:07.00 item percent.ring \"72|said yes\"",
   "layers": "shape ring id=@ w=0.62 thick=0.1 color=$bar in=scaleIn\n+0.2 shape ring parent=@ w=0.62 thick=0.1 grad=$accent arc=0 keys=\"arc:+0.2=0,+1.4={1}/100\"\n+0.2 text \"{1}%\" parent=@ size=130 weight=800 count=0,{1},+0.2,+1.4,pct\n+0.8 text \"{2}\" parent=@ pos=0,0.42 size=46 color=$soft in=fadeUp"
  },
  {
   "name": "poll.bars",
   "pack": "general",
   "status": "final",
   "about": "Two options with bars that race to their percentages; the winner glows.",
   "use": "polls, survey splits, \"what most people pick\", A or B results",
   "slots": [
    {
     "key": "optionA",
     "type": "text",
     "optional": false,
     "hint": "first option",
     "length": "up to 4 words"
    },
    {
     "key": "a",
     "type": "number",
     "optional": false,
     "hint": "first option %",
     "length": "number"
    },
    {
     "key": "optionB",
     "type": "text",
     "optional": false,
     "hint": "second option",
     "length": "up to 4 words"
    },
    {
     "key": "b",
     "type": "number",
     "optional": false,
     "hint": "second option %",
     "length": "number"
    }
   ],
   "options": "",
   "example": "00:06.00 --> 00:10.00 item poll.bars \"Save|68|Spend|32\"",
   "layers": "card id=@ w=1 h=0.7 grad=$surface in=popIn\n+0.2 text \"{1}\" parent=@ pos=-0.36,-0.14 size=48 weight=800 align=left in=fadeUp\n+0.3 shape pill parent=@ pos=-0.4,0 anchor=left h=0.09 grad=$accent growTo=w,0,{2}/100*0.8,+0.3,+1.3\n+0.3 text \"{2}%\" parent=@ follow=bar1,right,40 size=44 weight=800 count=0,{2},+0.3,+1.3,pct\n# option B the same at y=0.22 with color=$bar; the higher value gets emph=pulse"
  },
  {
   "name": "timeline.dots",
   "pack": "general",
   "status": "final",
   "about": "A line draws across and three milestones pop on it in turn.",
   "use": "history, roadmaps, before \u2192 now \u2192 next, step-by-step journeys",
   "slots": [
    {
     "key": "point1",
     "type": "text",
     "optional": false,
     "hint": "first date or step",
     "length": "up to 4 words"
    },
    {
     "key": "point2",
     "type": "text",
     "optional": false,
     "hint": "second",
     "length": "up to 4 words"
    },
    {
     "key": "point3",
     "type": "text",
     "optional": false,
     "hint": "third",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:10.00 --> 00:15.00 item timeline.dots \"2019|2022|2025\"",
   "layers": "shape line id=@ w=0.8 thick=0.015 color=$bar growTo=w,0,0.8,+0,+0.8\n# k = 0..2 at x = -0.32 + 0.32k, start +0.3 + 0.35k\n+0.3 shape circle parent=@ pos=-0.32,0 w=0.09 gradr=$accent in=popIn\n+0.3 shape ring parent=@ pos=-0.32,0 w=0.09 thick=0.05 color=$accent keys=\"scale:+0.3=1,+1.0=2.2;opacity:+0.3=0.8,+1.0=0\"\n+0.4 text \"{1}\" parent=@ pos=-0.32,0.14 size=46 weight=800 in=fadeUp"
  },
  {
   "name": "calendar.date",
   "pack": "general",
   "status": "final",
   "about": "A calendar page flips down to the date, the day stamps in.",
   "use": "launch dates, deadlines, events, \"on this day\"",
   "slots": [
    {
     "key": "day",
     "type": "text",
     "optional": false,
     "hint": "day, e.g. 12",
     "length": "1 word"
    },
    {
     "key": "month",
     "type": "text",
     "optional": false,
     "hint": "month, e.g. OCT",
     "length": "1 word"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item calendar.date \"12|OCT|Launch day\"",
   "layers": "card id=@ w=0.62 h=0.66 grad=$surface in=popIn\n+0 shape rect parent=@ pos=0,-0.26 w=0.62 h=0.16 grad=$accent\n+0.1 text \"{2}\" parent=@ pos=0,-0.26 size=48 weight=800 color=$accentInk\n+0.25 card parent=@ pos=0,0.08 w=0.62 h=0.5 grad=$surface keys=\"rx:+0.25=-90,+0.6=0~eb\" anchor=top\n+0.5 text \"{1}\" parent=@ pos=0,0.08 size=200 weight=800 in=popIn\n+0.8 text \"{3}\" pos=0,0.42 size=46 color=$soft in=fadeUp"
  },
  {
   "name": "clock.timer",
   "pack": "general",
   "status": "final",
   "about": "A clock hand sweeps a full turn, the face pulses, the duration lands.",
   "use": "time taken, \"in 5 minutes\", deadlines, before-and-after time jumps",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "duration, e.g. 5 min",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:04.00 --> 00:08.00 item clock.timer \"5 min\"",
   "layers": "shape circle id=@ w=0.56 grad=$surface stroke=8 strokeColor=$accent in=popIn emph=pulse\n+0 shape rect parent=@ w=0.02 h=0.2 anchor=bottom color=$ink rot=0\n+0.2 shape rect parent=@ w=0.03 h=0.24 anchor=bottom color=$accent keys=\"rot:+0.2=0,+1.6=360~ee\"\n+0.2 shape circle parent=@ w=0.05 color=$accent\n+1.4 text \"{1}\" pos=0,0.4 size=64 weight=800 in=popIn"
  },
  {
   "name": "name.card",
   "pack": "general",
   "status": "final",
   "about": "An initials badge pops, the name slides out beside it, the role follows.",
   "use": "introducing a speaker, guest, creator or expert; quotes from a person",
   "slots": [
    {
     "key": "name",
     "type": "text",
     "optional": false,
     "hint": "person's name (initials drawn from it)",
     "length": "up to 4 words"
    },
    {
     "key": "role",
     "type": "text",
     "optional": true,
     "hint": "role or handle",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:05.00 item name.card \"Asha Rao|Founder, Finwise\"",
   "layers": "shape circle id=@ pos=-0.3,0 w=0.26 grad=$accent in=popIn\n+0.1 text \"{1:initials}\" parent=@ size=80 weight=800 color=$accentInk in=popIn\n+0.3 card parent=@ pos=0.36,0 anchor=left h=0.24 grad=$surface growTo=w,0,0.62,+0.3,+0.7\n+0.6 text \"{1}\" parent=@ pos=0.12,-0.04 align=left size=54 weight=800 in=slideL\n+0.75 text \"{2}\" parent=@ pos=0.12,0.05 align=left size=36 color=$soft in=slideL"
  },
  {
   "name": "question.mark",
   "pack": "general",
   "status": "final",
   "about": "A big question mark bounces in and wobbles; the question writes on below.",
   "use": "hooks, quizzes, \"did you know?\", posing the video's question",
   "slots": [
    {
     "key": "question",
     "type": "text",
     "optional": true,
     "hint": "the question",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:00.50 --> 00:04.50 item question.mark \"Why do most people stay broke?\"",
   "layers": "text \"?\" id=@ pos=0,-0.12 size=320 weight=800 grad=$accent keys=\"y:+0=-0.7,+0.5=-0.12~eb;rot:+0.5=0,+0.7=-10,+0.9=8,+1.1=0\"\n+0.6 text \"{1}\" pos=0,0.32 w=0.85 size=54 weight=800 align=center in=wordIn"
  },
  {
   "name": "lock.secure",
   "pack": "general",
   "status": "final",
   "about": "A padlock snaps shut with a click flash and a shield ring.",
   "use": "privacy, safety, \"locked in\", guarantees, secure payments",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:06.00 item lock.secure \"100% safe\"",
   "layers": "sticker \"\ud83d\udd13\" id=@ w=0.4 in=popIn out=none keys=\"opacity:+0.6=1~eh,+0.62=0\"\n+0.6 sticker \"\ud83d\udd12\" parent=@ w=0.4 keys=\"scale:+0.6=1.2,+0.8=1\"\n+0.6 shape ring parent=@ w=0.5 thick=0.04 color=$good keys=\"scale:+0.6=0.6,+1.3=1.6;opacity:+0.6=1,+1.3=0\"\n+0.9 text \"{1}\" pos=0,0.36 size=60 weight=800 color=$good in=popIn"
  },
  {
   "name": "fire.streak",
   "pack": "general",
   "status": "final",
   "about": "A flame flares up and flickers while the streak count ticks up.",
   "use": "streaks, challenges, \"day 30\", hot topics, trending",
   "slots": [
    {
     "key": "count",
     "type": "number",
     "optional": false,
     "hint": "streak count",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item fire.streak \"30|day streak\"",
   "layers": "sticker \"\ud83d\udd25\" id=@ pos=0,-0.12 w=0.42 keys=\"scale:+0=0,+0.35=1.25~eb,+0.5=1\" emph=breathe\n+0.4 shape circle parent=@ w=0.5 gradr=$accent blur=0.6 opacity=0.4 emph=pulse\n+0.4 text \"{1}\" pos=0,0.2 size=150 weight=800 count=0,{1},+0.4,+1.4\n+0.8 text \"{2}\" pos=0,0.38 size=44 weight=600 color=$soft in=fadeUp"
  },
  {
   "name": "swipe.up",
   "pack": "general",
   "status": "final",
   "about": "Chevrons ripple upward and a hand swipes up through them.",
   "use": "\"swipe up\", \"link below\", next part, scroll for more",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:40.00 --> 00:44.00 item swipe.up \"Part 2\"",
   "layers": "# 3 chevrons k = 0..2 stacked upward; each fades in and rises in a repeating wave\n+0 shape chevron id=@ pos=0,0.1 w=0.24 rot=-90 color=$accent keys=\"opacity:+0=0.2,+0.3=1,+0.6=0.2\" emph=float\n+0.4 sticker \"\ud83d\udc46\" pos=0.04,0.3 w=0.2 keys=\"y:+0.4=0.3,+1.0=-0.1;opacity:+0.4=0,+0.5=1,+1.0=0\"\n+0.6 text \"{1}\" pos=0,0.4 size=60 weight=800 in=fadeUp"
  },
  {
   "name": "emoji.burst",
   "pack": "general",
   "status": "final",
   "about": "One emoji pops big while copies of it burst out and float away.",
   "use": "reactions, mood moments, laughs, shock, celebration; any emoji",
   "slots": [
    {
     "key": "emoji",
     "type": "emoji",
     "optional": false,
     "hint": "the emoji",
     "length": "number"
    }
   ],
   "options": "",
   "example": "00:07.00 --> 00:09.00 item emoji.burst \"\ud83d\ude02\"",
   "layers": "sticker \"{1}\" id=@ w=0.42 keys=\"scale:+0=0,+0.3=1.3~eb,+0.45=1\" emph=pulse\n# 8 small copies, angle 45\u00b0\u00b7i: fly out to radius 0.38, shrink, turn and fade\n+0.2 sticker \"{1}\" parent=@ w=0.12 keys=\"x:+0.2=0,+1.2=cos\u00b70.38;y:+0.2=0,+1.2=sin\u00b70.38-0.1;rot:+0.2=0,+1.2=\u00b140;opacity:+0.8=1,+1.2=0\""
  },
  {
   "name": "fin.ticker",
   "pack": "fin",
   "status": "final",
   "about": "A stock card: the price counts up, the change chip pops, a sparkline draws.",
   "use": "stock or index updates, market news, \"Nifty today\", crypto prices",
   "slots": [
    {
     "key": "symbol",
     "type": "text",
     "optional": false,
     "hint": "stock or index name",
     "length": "up to 4 words"
    },
    {
     "key": "price",
     "type": "number",
     "optional": false,
     "hint": "price",
     "length": "number"
    },
    {
     "key": "change",
     "type": "number",
     "optional": false,
     "hint": "% change, minus for a fall",
     "length": "number"
    }
   ],
   "options": "fmt=group|inr",
   "example": "00:02.00 --> 00:06.00 item fin.ticker \"NIFTY 50|24850|1.8\" fmt=group",
   "layers": "card id=@ w=1 h=0.66 grad=$surface in=popIn\n+0.1 text \"{1}\" parent=@ pos=-0.2,-0.2 align=left size=44 weight=800 color=$soft in=fadeUp\n+0.2 text \"{2}\" parent=@ pos=-0.08,-0.04 align=left size=110 weight=800 count=0,{2},+0.2,+1.3,{fmt}\n+0.6 shape pill parent=@ pos=0.28,-0.2 w=0.3 h=0.11 color=$good|#FF4D5E in=popIn   # green if {3} \u2265 0, red if below\n+0.6 text \"\u25b2 {3}%\" parent=@ pos=0.28,-0.2 size=36 weight=800 color=$goodInk in=popIn\n+0.4 shape line parent=@ pos=0,0.2 points=\"\u20267 points rising\" thick=0.012 color=$good keys=\"draw:+0.4=0,+1.4=1\""
  },
  {
   "name": "fin.candles",
   "pack": "fin",
   "status": "final",
   "about": "Candlesticks rise one by one along a trend; the result tag lands on the last.",
   "use": "market moves, trading, \"the stock went up\", chart talk",
   "slots": [
    {
     "key": "change",
     "type": "text",
     "optional": true,
     "hint": "result tag, e.g. +4.2%",
     "length": "up to 4 words"
    }
   ],
   "options": "dir=up|down",
   "example": "00:04.00 --> 00:08.00 item fin.candles \"+4.2%\" dir=up",
   "layers": "# 8 candles k = 0..7, x = -0.38 + 0.11k; body + wick; green if close \u2265 open, else red (fixed #FF4D5E)\n+0.1k shape rect pos=x,ybody w=0.06 h=hbody color=$good|#FF4D5E keys=\"h:+0.1k=0,+0.1k+0.3=hbody\"\n+0.1k shape rect pos=x,ywick w=0.01 h=hwick color=$good|#FF4D5E in=fadeUp\n+1.0 shape pill pos=0.3,-0.36 w=0.32 h=0.12 grad=$good in=popIn\n+1.0 text \"{1}\" pos=0.3,-0.36 size=44 weight=800 color=$goodInk in=popIn"
  },
  {
   "name": "fin.compound",
   "pack": "fin",
   "status": "final",
   "about": "Ten bars climb on a curve and the final amount counts up over the last one.",
   "use": "compound interest, SIPs, long-term investing, \"what \u20b91L becomes\"",
   "slots": [
    {
     "key": "start",
     "type": "number",
     "optional": false,
     "hint": "amount invested",
     "length": "number"
    },
    {
     "key": "end",
     "type": "number",
     "optional": false,
     "hint": "amount it grows to",
     "length": "number"
    },
    {
     "key": "years",
     "type": "text",
     "optional": true,
     "hint": "time, e.g. 20 years",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=lakh|inr|group",
   "example": "00:06.00 --> 00:11.00 item fin.compound \"100000|1000000|in 20 years\" fmt=lakh",
   "layers": "# 10 bars k = 0..9, height = start\u00b7(end/start)^(k/9) scaled to 0.55, staggered 0.08 s\n+0.08k shape rect pos=-0.4+0.09k,0.3 anchor=bottom w=0.06 radius=0.2 color=$bar|$accent(k=9) growTo=h,0,hk,+0.08k,+0.08k+0.4\n+0 text \"{1}\" pos=-0.4,0.38 size=34 color=$soft in=fadeUp\n+0.8 text \"{2}\" follow=bar9,top,-30 size=60 weight=800 color=$accent count={1},{2},+0.8,+1.6,{fmt}\n+1.2 text \"{3}\" pos=0,0.44 size=40 weight=600 color=$soft in=fadeUp"
  },
  {
   "name": "fin.emi",
   "pack": "fin",
   "status": "final",
   "about": "A donut splits into principal and interest; the monthly EMI counts up in the middle.",
   "use": "loans, EMIs, home or car loan costs, \"how much interest you really pay\"",
   "slots": [
    {
     "key": "emi",
     "type": "number",
     "optional": false,
     "hint": "monthly payment",
     "length": "number"
    },
    {
     "key": "interest",
     "type": "number",
     "optional": false,
     "hint": "interest share of total, %",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=inr|group",
   "example": "00:03.00 --> 00:07.00 item fin.emi \"21400|38|per month\" fmt=inr",
   "layers": "shape ring id=@ w=0.62 thick=0.14 color=$bar opacity=0.35 in=scaleIn\n+0.2 shape ring parent=@ w=0.62 thick=0.14 color=$good arc=0 keys=\"arc:+0.2=0,+1.0=(100-{2})/100\"\n+1.0 shape ring parent=@ w=0.62 thick=0.14 color=$accent arcStart=(100-{2})/100 keys=\"arc:+1.0=0,+1.5={2}/100\"\n+0.2 text \"{1}\" parent=@ size=96 weight=800 count=0,{1},+0.2,+1.3,{fmt}\n+0.6 text \"{3}\" parent=@ pos=0,0.12 size=36 color=$soft in=fadeUp\n+1.5 text \"Principal {100-2}%  \u00b7  Interest {2}%\" pos=0,0.44 size=36 weight=600 in=fadeUp"
  },
  {
   "name": "fin.piggy",
   "pack": "fin",
   "status": "final",
   "about": "Coins drop into a piggy bank, it bounces with each one, the total counts up.",
   "use": "saving habits, emergency funds, kids and money, \"how much I saved\"",
   "slots": [
    {
     "key": "total",
     "type": "number",
     "optional": false,
     "hint": "amount saved",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=inr|lakh|group",
   "example": "00:02.00 --> 00:06.00 item fin.piggy \"50000|saved this year\" fmt=inr",
   "layers": "sticker \"\ud83d\udc37\" id=@ pos=0,0.08 w=0.5 in=popIn keys=\"scale:\u2026squash 1.1,0.92 at each coin landing (+0.6,+0.9,+1.2)\"\n# 3 coins k = 0..2: fall from above into the slot, vanish on landing\n+0.3+0.3k sticker \"\ud83e\ude99\" pos=0,-0.4 w=0.12 keys=\"y:+0.3+0.3k=-0.45,+0.6+0.3k=-0.08;opacity:+0.58+0.3k=1,+0.6+0.3k=0\"\n+0.2 text \"{1}\" pos=0,-0.34 size=96 weight=800 color=$accent count=0,{1},+0.5,+1.3,{fmt}\n+1.3 text \"{2}\" pos=0,0.4 size=44 color=$soft in=fadeUp"
  },
  {
   "name": "fin.budget",
   "pack": "fin",
   "status": "final",
   "about": "One bar splits into three parts that grow in turn, each with its label and share.",
   "use": "50/30/20 budgets, where salary goes, expense splits, any 3-way split",
   "slots": [
    {
     "key": "labelA",
     "type": "text",
     "optional": false,
     "hint": "first part",
     "length": "up to 4 words"
    },
    {
     "key": "a",
     "type": "number",
     "optional": false,
     "hint": "first %",
     "length": "number"
    },
    {
     "key": "labelB",
     "type": "text",
     "optional": false,
     "hint": "second part",
     "length": "up to 4 words"
    },
    {
     "key": "b",
     "type": "number",
     "optional": false,
     "hint": "second %",
     "length": "number"
    },
    {
     "key": "labelC",
     "type": "text",
     "optional": false,
     "hint": "third part",
     "length": "up to 4 words"
    },
    {
     "key": "c",
     "type": "number",
     "optional": false,
     "hint": "third %",
     "length": "number"
    }
   ],
   "options": "",
   "example": "00:05.00 --> 00:09.00 item fin.budget \"Needs|50|Wants|30|Savings|20\"",
   "layers": "# one 0.84-wide bar in three segments; segment k grows to its share, then the next starts\n+0.2 shape rect pos=-0.42,0 anchor=left h=0.12 grad=$accent growTo=w,0,0.84\u00b7{2}/100,+0.2,+0.6\n+0.6 shape rect follow=seg1,right,0 h=0.12 grad=$good growTo=w,0,0.84\u00b7{4}/100,+0.6,+1.0\n+1.0 shape rect follow=seg2,right,0 h=0.12 color=$bar growTo=w,0,0.84\u00b7{6}/100,+1.0,+1.4\n# under each segment: \"{label}\" and \"{n}%\" fade up as it finishes"
  },
  {
   "name": "fin.portfolio",
   "pack": "fin",
   "status": "final",
   "about": "A donut sweeps round in three slices; the legend lists each holding's share.",
   "use": "asset allocation, portfolio mix, where the money is invested",
   "slots": [
    {
     "key": "labelA",
     "type": "text",
     "optional": false,
     "hint": "first holding",
     "length": "up to 4 words"
    },
    {
     "key": "a",
     "type": "number",
     "optional": false,
     "hint": "first %",
     "length": "number"
    },
    {
     "key": "labelB",
     "type": "text",
     "optional": false,
     "hint": "second holding",
     "length": "up to 4 words"
    },
    {
     "key": "b",
     "type": "number",
     "optional": false,
     "hint": "second %",
     "length": "number"
    },
    {
     "key": "labelC",
     "type": "text",
     "optional": false,
     "hint": "third holding",
     "length": "up to 4 words"
    },
    {
     "key": "c",
     "type": "number",
     "optional": false,
     "hint": "third %",
     "length": "number"
    }
   ],
   "options": "",
   "example": "00:04.00 --> 00:09.00 item fin.portfolio \"Equity|60|Debt|25|Gold|15\"",
   "layers": "shape ring id=@ pos=0,-0.1 w=0.56 thick=0.16 color=$bar opacity=0.35 in=scaleIn\n+0.2 shape ring parent=@ w=0.56 thick=0.16 color=$accent arc=0 keys=\"arc:+0.2=0,+0.8={2}/100\"\n+0.8 shape ring parent=@ \u2026 color=$good arcStart={2}/100 keys=\"arc:+0.8=0,+1.2={4}/100\"\n+1.2 shape ring parent=@ \u2026 color=$soft arcStart=({2}+{4})/100 keys=\"arc:+1.2=0,+1.5={6}/100\"\n+1.4 text \"\u25cf {1} {2}%   \u25cf {3} {4}%   \u25cf {5} {6}%\" pos=0,0.4 size=36 weight=600 in=fadeUp"
  },
  {
   "name": "fin.goal",
   "pack": "fin",
   "status": "final",
   "about": "A tall bar fills toward a flag at the top; saved and goal amounts count in.",
   "use": "savings goals, targets, \"how close I am\", fundraising",
   "slots": [
    {
     "key": "saved",
     "type": "number",
     "optional": false,
     "hint": "saved so far",
     "length": "number"
    },
    {
     "key": "target",
     "type": "number",
     "optional": false,
     "hint": "goal amount",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "what the goal is",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=lakh|inr|group",
   "example": "00:03.00 --> 00:07.00 item fin.goal \"320000|500000|New car\" fmt=lakh",
   "layers": "card id=@ pos=-0.18,0.02 w=0.16 h=0.7 radius=1 color=$bar\n+0.2 card parent=@ anchor=bottom w=0.16 radius=1 grad=$accent growTo=h,0,0.7\u00b7{1}/{2},+0.2,+1.3\n+0.1 sticker \"\ud83d\udea9\" parent=@ pos=0.02,-0.42 w=0.14 in=dropIn\n+0.3 text \"{1}\" pos=0.22,-0.06 align=left size=84 weight=800 color=$accent count=0,{1},+0.3,+1.3,{fmt}\n+0.5 text \"of {2}\" pos=0.22,0.08 align=left size=40 color=$soft in=fadeUp\n+0.7 text \"{3}\" pos=0.22,0.2 align=left size=44 weight=800 in=fadeUp"
  },
  {
   "name": "fin.inflation",
   "pack": "fin",
   "status": "final",
   "about": "A banknote shrinks and greys while its value counts down.",
   "use": "inflation, purchasing power, \"\u20b9100 today is worth\u2026\", cost of waiting",
   "slots": [
    {
     "key": "from",
     "type": "number",
     "optional": false,
     "hint": "value today",
     "length": "number"
    },
    {
     "key": "to",
     "type": "number",
     "optional": false,
     "hint": "value later",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "when, e.g. in 10 years",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=inr|group",
   "example": "00:04.00 --> 00:08.00 item fin.inflation \"100|55|in 10 years\" fmt=inr",
   "layers": "card id=@ pos=0,-0.06 w=0.7 h=0.36 radius=0.08 grad=$good keys=\"scale:+0.4=1,+1.6=0.72;opacity:+0.4=1,+1.6=0.6\" fx=sat:amount=1 keys(fx)=\"sat:+0.4=1,+1.6=0.2\"\n+0.1 text \"{1}\" parent=@ size=110 weight=800 color=$goodInk count={1},{2},+0.4,+1.6,{fmt}\n+0.4 shape arrow pos=0.36,0.2 w=0.12 rot=90 color=#FF4D5E in=dropIn\n+1.0 text \"{3}\" pos=0,0.36 size=46 weight=600 color=$soft in=fadeUp"
  },
  {
   "name": "fin.creditscore",
   "pack": "fin",
   "status": "final",
   "about": "A gauge needle sweeps across red, amber and green to the score.",
   "use": "credit scores, ratings, risk levels, any 'how good is it' score",
   "slots": [
    {
     "key": "score",
     "type": "number",
     "optional": false,
     "hint": "score 300\u2013900",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "rating word",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item fin.creditscore \"782|Excellent\"",
   "layers": "shape ring id=@ pos=0,0.06 w=0.74 thick=0.08 arc=0.5 arcStart=0.5 color=#FF4D5E|$accent|$good   # three zones: 300\u2013600 red, 600\u2013750 accent, 750\u2013900 good\n+0.2 shape rect parent=@ anchor=bottom w=0.02 h=0.3 color=$ink keys=\"rot:+0.2=-90,+1.3=(({1}-300)/600)\u00b7180-90~eb\"\n+0.2 text \"{1}\" parent=@ pos=0,0.12 size=110 weight=800 count=300,{1},+0.2,+1.3\n+1.2 text \"{2}\" pos=0,0.36 size=50 weight=800 color=$good in=popIn"
  },
  {
   "name": "fin.tax",
   "pack": "fin",
   "status": "final",
   "about": "A receipt prints down from a slot line by line; the total counts and gets a tick.",
   "use": "tax savings, bills, invoices, \"what it really cost\", refunds",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": false,
     "hint": "line on the receipt, e.g. Tax saved",
     "length": "up to 4 words"
    },
    {
     "key": "amount",
     "type": "number",
     "optional": false,
     "hint": "amount",
     "length": "number"
    }
   ],
   "options": "fmt=inr|group",
   "example": "00:05.00 --> 00:09.00 item fin.tax \"Tax saved|46800\" fmt=inr",
   "layers": "shape rect id=@ pos=0,-0.36 w=0.7 h=0.04 radius=1 color=$ink   # the printer slot\n+0.1 card pos=0,0.04 anchor=top w=0.6 h=0.72 radius=0.04 color=#FFFFFF keys=\"h:+0.1=0,+0.9=0.72\"\n# 4 grey line pairs appear as the paper passes them; then the total row\n+0.9 text \"{1}\" pos=-0.24,0.22 align=left size=40 weight=600 color=#333333 in=fadeUp\n+0.9 text \"{2}\" pos=0.24,0.22 align=right size=56 weight=800 color=$good count=0,{2},+0.9,+1.5,{fmt}\n+1.5 shape circle pos=0.26,0.38 w=0.12 grad=$good in=popIn   + shape check \u2026"
  },
  {
   "name": "fin.cashflow",
   "pack": "fin",
   "status": "final",
   "about": "Money in rises green, money out drops red, a line draws and what's left pops.",
   "use": "income vs expenses, monthly cash flow, profit, \"where did my salary go\"",
   "slots": [
    {
     "key": "in",
     "type": "number",
     "optional": false,
     "hint": "money in",
     "length": "number"
    },
    {
     "key": "out",
     "type": "number",
     "optional": false,
     "hint": "money out",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "word for what is left",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=inr|group",
   "example": "00:03.00 --> 00:08.00 item fin.cashflow \"85000|62000|left\" fmt=inr",
   "layers": "text \"\u25b2 {1}\" id=@ pos=0,-0.26 size=80 weight=800 color=$good count=0,{1},+0.1,+0.9,{fmt} keys=\"y:+0=-0.16,+0.4=-0.26\"\n+0.1 text \"In\" pos=-0.34,-0.26 size=40 color=$soft in=fadeUp\n+0.5 text \"\u25bc {2}\" pos=0,-0.06 size=80 weight=800 color=#FF4D5E count=0,{2},+0.5,+1.3,{fmt} keys=\"y:+0.5=-0.16,+0.9=-0.06\"\n+0.5 text \"Out\" pos=-0.34,-0.06 size=40 color=$soft in=fadeUp\n+1.2 shape line pos=0,0.08 w=0.8 thick=0.01 color=$soft growTo=w,0,0.8,+1.2,+1.5\n+1.5 text \"{1}\u2212{2} {3}\" pos=0,0.26 size=100 weight=800 color=$accent in=popIn emph=pulse"
  },
  {
   "name": "ai.prompt",
   "pack": "ai",
   "status": "final",
   "about": "A prompt box types the request, the send button pulses, a shimmer says it's generating.",
   "use": "showing a prompt, \"I asked AI to\u2026\", tool demos, before-and-after AI results",
   "slots": [
    {
     "key": "prompt",
     "type": "text",
     "optional": false,
     "hint": "what gets typed into the box",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:05.00 item ai.prompt \"Make me a 30-day workout plan\"",
   "layers": "card id=@ w=0.92 h=0.36 radius=0.12 grad=$surface stroke=3 strokeColor=$accent in=popIn\n+0.3 text \"{1}\" parent=@ pos=-0.04,-0.06 w=0.7 size=40 align=left in=typeOn\n+1.6 shape circle parent=@ pos=0.36,0.1 w=0.12 grad=$accent in=popIn emph=pulse\n+1.6 shape arrow parent=@ pos=0.36,0.1 w=0.06 rot=-90 color=$accentInk in=popIn\n+1.9 text \"Generating\u2026\" parent=@ pos=-0.2,0.1 size=32 color=$soft in=fadeUp fx=\u2026shimmer"
  },
  {
   "name": "ai.chat",
   "pack": "ai",
   "status": "final",
   "about": "The user's message pops in, a sparkle avatar appears, the AI reply streams word by word.",
   "use": "AI conversations, \"I asked ChatGPT-style tools\u2026\", showing answers, comparisons",
   "slots": [
    {
     "key": "question",
     "type": "text",
     "optional": false,
     "hint": "the user's message",
     "length": "sentence"
    },
    {
     "key": "answer",
     "type": "text",
     "optional": false,
     "hint": "the AI's reply (streams in)",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:08.00 item ai.chat \"Is AI taking my job?|Not yet. It will change it first.\"",
   "layers": "card id=@ pos=0.12,-0.28 w=0.66 h=0.16 radius=0.4 grad=$accent in=popIn\n+0 text \"{1}\" parent=@ size=38 weight=600 color=$accentInk in=fadeUp\n+0.5 shape circle pos=-0.38,0.02 w=0.11 grad=$good in=popIn\n+0.5 shape star pos=-0.38,0.02 w=0.06 points=4 inner=0.26 color=$goodInk in=popIn\n+0.6 card pos=0.06,0.12 w=0.76 h=0.36 radius=0.1 grad=$surface in=popIn\n+0.8 text \"{2}\" pos=0.06,0.12 w=0.66 size=38 align=left in=wordFade"
  },
  {
   "name": "ai.neural",
   "pack": "ai",
   "status": "final",
   "about": "A neural network lights up layer by layer as signals pulse along its links.",
   "use": "how AI works, machine learning explainers, \"the model learns\u2026\"",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:05.00 --> 00:09.00 item ai.neural \"Neural network\"",
   "layers": "# 4 layers of 3/4/4/2 nodes; links are lines; layer L lights at +0.3\u00b7L\n+0 shape line \u2026 color=$bar opacity=0.5 in=fadeUp            # every link\n+0.3L shape circle pos=xL,yk w=0.07 gradr=$accent in=popIn emph=pulse\n+0.3L shape circle w=0.025 color=$ink keys=\"x:\u2026along the link;opacity:\u2026\"   # a signal dot per link\n+1.4 text \"{1}\" pos=0,0.42 size=46 weight=800 in=fadeUp"
  },
  {
   "name": "ai.chip",
   "pack": "ai",
   "status": "final",
   "about": "Circuit traces light up toward a processor chip and its core glows.",
   "use": "GPUs, AI hardware, compute, \"the chips behind AI\", data centres",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "text on the chip, e.g. GPU",
     "length": "1 word"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item ai.chip \"GPU\"",
   "layers": "card id=@ w=0.4 h=0.4 radius=0.12 grad=$surface stroke=3 strokeColor=$accent in=popIn\n# 16 pins round the chip; 8 traces run out to the edge and draw inward toward it\n+0 shape rect parent=@ \u2026 w=0.02 h=0.06 color=$soft in=fadeUp\n+0.1 shape line \u2026 thick=0.01 color=$accent keys=\"draw:+0.1=0,+0.8=1\"\n+0.8 shape rect parent=@ w=0.2 h=0.2 radius=0.1 gradr=$accent glow=0.6 in=popIn emph=breathe\n+0.9 text \"{1}\" parent=@ size=56 weight=800 color=$accentInk in=popIn"
  },
  {
   "name": "ai.sparkle",
   "pack": "ai",
   "status": "final",
   "about": "An AI badge pops with sparkles spinning round it; the label slides up.",
   "use": "\"AI-powered\", feature callouts, \"made with AI\", new AI tools",
   "slots": [
    {
     "key": "badge",
     "type": "text",
     "optional": false,
     "hint": "badge word, e.g. AI",
     "length": "1 word"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:05.00 item ai.sparkle \"AI|AI-powered\"",
   "layers": "shape pill id=@ w=0.46 h=0.24 grad=$accent in=popIn emph=breathe\n+0.1 text \"{1}\" parent=@ size=110 weight=800 color=$accentInk in=popIn\n# 4 four-point stars orbit the badge at radius 0.34, rot keys 0\u2192360 over 4 s, twinkle scale\n+0.2 shape star parent=@ points=4 inner=0.3 w=0.08 color=$accent keys=\"\u2026orbit;scale:twinkle\"\n+0.6 text \"{2}\" pos=0,0.36 size=52 weight=800 in=fadeUp"
  },
  {
   "name": "ai.robot",
   "pack": "ai",
   "status": "final",
   "about": "A drawn robot head pops up, a scan line sweeps its visor, it blinks, its bubble types a line.",
   "use": "AI characters, chatbots, automation, \"the robot says\u2026\" moments",
   "slots": [
    {
     "key": "message",
     "type": "text",
     "optional": true,
     "hint": "what the robot says",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:05.00 item ai.robot \"Hello, human.\"",
   "layers": "card id=@ pos=0,0.1 w=0.4 h=0.34 radius=0.3 grad=$surface stroke=3 strokeColor=$accent keys=\"y:+0=0.6,+0.4=0.1~eb\"\n+0 card parent=@ w=0.3 h=0.15 radius=0.5 color=#07080C            # visor\n+0 shape circle parent=@ pos=\u00b10.065,-0.01 w=0.065 color=$accent glow=0.6 keys=\"h:+1.3=1,+1.4=0.1,+1.5=1\"   # eyes blink\n+0 shape line parent=@ pos=0,-0.22 h=0.08 thick=0.015 color=$soft   + shape circle pos=0,-0.27 w=0.05 color=$accent emph=pulse\n+0.5 shape rect parent=@ w=0.4 h=0.012 color=$accent glow=0.8 keys=\"y:+0.5=-0.18,+1.0=0.16;opacity:+0.5=1,+1.0=0\"\n+0.9 card pos=0.14,-0.3 w=0.62 h=0.16 radius=0.4 grad=$surface in=popIn\n+1.0 text \"{1}\" pos=0.14,-0.3 size=44 weight=800 in=typeOn"
  },
  {
   "name": "ai.tokens",
   "pack": "ai",
   "status": "final",
   "about": "A sentence breaks into coloured token chips that pull apart; the token count counts up.",
   "use": "how LLMs read text, tokens and context windows, explaining AI pricing",
   "slots": [
    {
     "key": "text",
     "type": "text",
     "optional": false,
     "hint": "a short sentence",
     "length": "sentence"
    },
    {
     "key": "count",
     "type": "number",
     "optional": true,
     "hint": "token count",
     "length": "number"
    }
   ],
   "options": "",
   "example": "00:04.00 --> 00:08.00 item ai.tokens \"AI reads text in tokens|6\"",
   "layers": "text \"{1}\" id=@ pos=0,-0.1 size=52 weight=800 in=fadeUp out=none keys=\"opacity:+0.6=1~eh,+0.62=0\"\n# the app splits {1} into tokens; each becomes a pill in a rotating colour, sliding apart with a gap\n+0.6 shape pill w=auto h=0.1 color=$accent|$good|$bar\u2026 keys=\"x:+0.6=x0,+1.1=x1;y:\u2026wrap to 2 rows\"\n+0.6 text \"token\" \u2026 size=44 weight=800\n+1.2 text \"{2} tokens\" pos=0,0.34 size=56 weight=800 color=$accent count=0,{2},+1.2,+1.8"
  },
  {
   "name": "ai.benchmark",
   "pack": "ai",
   "status": "final",
   "about": "Three model bars race to their scores; the winner gets a crown.",
   "use": "model comparisons, benchmarks, \"which AI is best\", tool shoot-outs",
   "slots": [
    {
     "key": "modelA",
     "type": "text",
     "optional": false,
     "hint": "first model",
     "length": "up to 4 words"
    },
    {
     "key": "a",
     "type": "number",
     "optional": false,
     "hint": "first score",
     "length": "number"
    },
    {
     "key": "modelB",
     "type": "text",
     "optional": false,
     "hint": "second model",
     "length": "up to 4 words"
    },
    {
     "key": "b",
     "type": "number",
     "optional": false,
     "hint": "second score",
     "length": "number"
    },
    {
     "key": "modelC",
     "type": "text",
     "optional": false,
     "hint": "third model",
     "length": "up to 4 words"
    },
    {
     "key": "c",
     "type": "number",
     "optional": false,
     "hint": "third score",
     "length": "number"
    }
   ],
   "options": "fmt=one|pct|group",
   "example": "00:06.00 --> 00:11.00 item ai.benchmark \"Model A|92.4|Model B|88.1|Model C|79.5\" fmt=one",
   "layers": "card id=@ w=1 h=0.8 grad=$surface in=popIn\n# rows k = 0..2: label left, bar grows to score/max\u00b70.6, value counts at its end; the highest gets $accent and a \ud83d\udc51\n+0.2+0.1k text \"{label}\" parent=@ pos=-0.4,y align=left size=40 weight=800 in=fadeUp\n+0.3+0.1k shape pill parent=@ pos=-0.4,y+0.08 anchor=left h=0.07 grad=$accent|$bar growTo=w,0,score/max\u00b70.6,+0.3+0.1k,+1.3\n+0.3+0.1k text \"{score}\" follow=bar,right,40 size=40 weight=800 count=0,{score},+0.3,+1.3,{fmt}\n+1.4 sticker \"\ud83d\udc51\" follow=bar1,top,-20 w=0.1 in=dropIn"
  },
  {
   "name": "ai.thinking",
   "pack": "ai",
   "status": "final",
   "about": "A glowing orb with counter-rotating rings and bouncing dots: the AI is thinking.",
   "use": "waiting on AI, processing, \"let it think\", loading moments",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "status, e.g. Thinking\u2026",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:05.00 item ai.thinking \"Thinking\u2026\"",
   "layers": "shape circle id=@ w=0.3 gradr=$accent glow=0.8 in=popIn emph=breathe\n+0 shape ring parent=@ w=0.5 thick=0.02 color=$accent arc=0.7 keys=\"rot:+0=0,+3=360~ll\"\n+0 shape ring parent=@ w=0.64 thick=0.015 color=$good arc=0.5 keys=\"rot:+0=0,+3=-360~ll\"\n+0.4 text \"{1}\" pos=0,0.38 size=52 weight=800 in=fadeUp\n# 3 dots after the label bounce in turn, looping"
  },
  {
   "name": "ai.image",
   "pack": "ai",
   "status": "final",
   "about": "A noisy pixel grid sharpens into a picture while the progress counts to 100%.",
   "use": "AI image generation, \"I made this with AI\", before/after renders",
   "slots": [
    {
     "key": "prompt",
     "type": "text",
     "optional": true,
     "hint": "image prompt caption",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:07.00 item ai.image \"a city at sunset\"",
   "layers": "card id=@ pos=0,-0.06 w=0.74 h=0.74 radius=0.06 img=\u2026 fx=pixelate:size=1\u21920;blur:\u2026 keys=\"fx\u2026:+0.2=noisy,+1.6=clear\"\n# the picture is the theme's own gradient scene, so it matches every theme; pixelate and blur ease out\n+0.2 text \"{0}%\" pos=0.26,-0.36 size=36 weight=800 count=0,100,+0.2,+1.6,pct\n+1.0 text \"\u201c{1}\u201d\" pos=0,0.4 size=40 color=$soft in=fadeUp"
  },
  {
   "name": "ai.model",
   "pack": "ai",
   "status": "final",
   "about": "A model card slides in: name, size and a NEW tag, with a sweeping shine.",
   "use": "new model launches, AI news, \"meet the model\", release announcements",
   "slots": [
    {
     "key": "name",
     "type": "text",
     "optional": false,
     "hint": "model name",
     "length": "up to 4 words"
    },
    {
     "key": "params",
     "type": "text",
     "optional": false,
     "hint": "size, e.g. 70B",
     "length": "up to 4 words"
    },
    {
     "key": "tag",
     "type": "text",
     "optional": true,
     "hint": "tag, e.g. NEW",
     "length": "1 word"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:05.00 item ai.model \"Nova 2|70B params|NEW\"",
   "layers": "card id=@ w=0.9 h=0.5 grad=$surface stroke=3 strokeColor=$accent in=slideR fx=\u2026shine sweep at +0.5\n+0.2 shape circle parent=@ pos=-0.3,0 w=0.18 grad=$accent in=popIn\n+0.2 shape star parent=@ pos=-0.3,0 w=0.1 points=4 inner=0.26 color=$accentInk in=popIn\n+0.3 text \"{1}\" parent=@ pos=0.08,-0.06 align=left size=80 weight=800 in=slideL\n+0.45 text \"{2}\" parent=@ pos=0.08,0.08 align=left size=38 color=$soft in=fadeUp\n+0.7 shape pill parent=@ pos=0.32,-0.2 w=0.2 h=0.09 grad=$good in=popIn emph=pulse   + text \"{3}\" color=$goodInk"
  },
  {
   "name": "ai.agent",
   "pack": "ai",
   "status": "final",
   "about": "An agent works a checklist: each step spins, then ticks, in order.",
   "use": "AI agents, automation, workflows, \"it did this for me in 3 steps\"",
   "slots": [
    {
     "key": "step1",
     "type": "text",
     "optional": false,
     "hint": "first step",
     "length": "up to 4 words"
    },
    {
     "key": "step2",
     "type": "text",
     "optional": false,
     "hint": "second step",
     "length": "up to 4 words"
    },
    {
     "key": "step3",
     "type": "text",
     "optional": false,
     "hint": "third step",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:04.00 --> 00:10.00 item ai.agent \"Read the inbox|Draft replies|Send summary\"",
   "layers": "card id=@ w=0.9 h=0.72 grad=$surface in=popIn\n+0.1 text \"Agent\" parent=@ pos=-0.3,-0.28 align=left size=36 weight=800 color=$soft in=fadeUp   + shape star points=4 inner=0.26 color=$accent\n# rows k = 0..2 at y = -0.1 + 0.16k: a spinner ring (rot keys) for 0.5 s, then a $good tick pops; text goes from $soft to $ink\n+0.3+0.6k shape ring parent=@ pos=-0.32,y w=0.07 thick=0.2 arc=0.7 color=$accent keys=\"rot:\u2026;opacity:+0.8+0.6k=1~eh,+0.82+0.6k=0\"\n+0.8+0.6k shape circle parent=@ pos=-0.32,y w=0.07 grad=$good in=popIn   + shape check color=$goodInk\n+0.3+0.6k text \"{k+1}\" parent=@ pos=0.06,y align=left size=40 weight=600 in=fadeUp"
  },
  {
   "name": "grow.subs",
   "pack": "grow",
   "status": "final",
   "about": "A subscriber icon pops, the count rolls up and lands with a punch.",
   "use": "subscriber milestones, channel growth, \"we just hit\u2026\" moments",
   "slots": [
    {
     "key": "count",
     "type": "number",
     "optional": false,
     "hint": "subscriber count",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=short|group",
   "example": "00:02.00 --> 00:06.00 item grow.subs \"100000|subscribers\" fmt=short",
   "layers": "shape circle id=@ pos=0,-0.22 w=0.24 grad=$accent in=popIn\n+0 shape person parent=@ w=0.13 color=$accentInk in=popIn                 # drawn icon, no logo\n+0.2 text \"{1}\" pos=0,0.08 size=150 weight=800 count=0,{1},+0.2,+1.4,{fmt} keys=\"scale:+1.4=1,+1.55=1.12,+1.75=1\"\n+0.8 text \"{2}\" pos=0,0.32 size=48 color=$soft in=fadeUp"
  },
  {
   "name": "grow.views",
   "pack": "grow",
   "status": "final",
   "about": "An eye icon opens, views count up and a green arrow climbs beside them.",
   "use": "view counts, viral moments, \"this video got\u2026\", reach",
   "slots": [
    {
     "key": "views",
     "type": "number",
     "optional": false,
     "hint": "view count",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=short|group",
   "example": "00:03.00 --> 00:07.00 item grow.views \"2400000|views in 7 days\" fmt=short",
   "layers": "shape eye id=@ pos=0,-0.22 w=0.24 color=$accent keys=\"h:+0=0.02,+0.3=0.24~eb\"     # the eye opens\n+0.2 text \"{1}\" pos=-0.04,0.06 size=150 weight=800 count=0,{1},+0.2,+1.4,{fmt}\n+0.9 shape arrow pos=0.36,0.04 w=0.1 rot=-90 color=$good in=slideU emph=float\n+0.8 text \"{2}\" pos=0,0.3 size=46 color=$soft in=fadeUp"
  },
  {
   "name": "grow.milestone",
   "pack": "grow",
   "status": "final",
   "about": "A metal award plaque with a play mark drops in; a shine sweeps across it.",
   "use": "creator awards, 100K / 1M milestones, celebration moments",
   "slots": [
    {
     "key": "milestone",
     "type": "text",
     "optional": false,
     "hint": "milestone, e.g. 100K",
     "length": "1 word"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item grow.milestone \"100K|Thank you!\"",
   "layers": "card id=@ pos=0,-0.04 w=0.56 h=0.68 radius=0.08 grad=#F4F6FA,#9AA3B2 bevel=1 shadow=0.4 keys=\"y:+0=-0.8,+0.4=-0.04~eb\"   # fixed silver\n+0.2 shape circle parent=@ pos=0,-0.08 w=0.26 grad=$accent   + shape triangle rot=90 w=0.1 color=$accentInk\n+0.4 text \"{1}\" parent=@ pos=0,0.2 size=80 weight=800 color=#2A2F3A in=popIn\n+0.6 shape rect parent=@ w=0.2 h=0.8 rot=20 color=#FFFFFF opacity=0.4 keys=\"x:+0.6=-0.4,+1.2=0.4\"   # shine\n+0.9 text \"{2}\" pos=0,0.4 size=50 weight=800 in=fadeUp"
  },
  {
   "name": "grow.ctr",
   "pack": "grow",
   "status": "final",
   "about": "Two thumbnails side by side; their click-through bars rise and the winner gets a tick.",
   "use": "thumbnail A/B tests, title tests, \"which one got more clicks\"",
   "slots": [
    {
     "key": "labelA",
     "type": "text",
     "optional": false,
     "hint": "first thumbnail",
     "length": "up to 4 words"
    },
    {
     "key": "a",
     "type": "number",
     "optional": false,
     "hint": "first CTR %",
     "length": "number"
    },
    {
     "key": "labelB",
     "type": "text",
     "optional": false,
     "hint": "second thumbnail",
     "length": "up to 4 words"
    },
    {
     "key": "b",
     "type": "number",
     "optional": false,
     "hint": "second CTR %",
     "length": "number"
    }
   ],
   "options": "fmt=one|pct",
   "example": "00:05.00 --> 00:10.00 item grow.ctr \"Old thumbnail|4.1|New thumbnail|9.6\" fmt=one",
   "layers": "# two thumbnail frames k = 0,1 at x = \u22130.23: 16:9 cards with a play mark\n+0.1k card pos=x,-0.18 w=0.42 h=0.24 radius=0.06 grad=$surface stroke=2 strokeColor=$soft in=popIn\n+0.4 shape rect pos=x,0.28 anchor=bottom w=0.16 radius=0.2 grad=$accent|$bar growTo=h,0,{v}/max\u00b70.3,+0.4,+1.3\n+0.4 text \"{v}%\" follow=bar,top,-24 size=44 weight=800 count=0,{v},+0.4,+1.3,{fmt}\n+0.3 text \"{label}\" pos=x,0.38 size=30 color=$soft in=fadeUp\n+1.4 shape circle follow=bar2,top,-80 w=0.08 grad=$good in=popIn   + shape check"
  },
  {
   "name": "grow.retention",
   "pack": "grow",
   "status": "final",
   "about": "A retention curve draws: the early drop, a long steady line, then the end value pins.",
   "use": "retention talk, hooks, \"most people leave at\u2026\", analytics breakdowns",
   "slots": [
    {
     "key": "percent",
     "type": "number",
     "optional": false,
     "hint": "retention at the end, %",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:06.00 --> 00:10.00 item grow.retention \"62|still watching at the end\"",
   "layers": "card id=@ w=1 h=0.72 grad=$surface in=popIn\n+0 shape line parent=@ \u2026 color=$bar opacity=0.5      # 3 gridlines + a base axis, labels 100% / 50% / 0%\n+0.1 shape line parent=@ smooth=1 points=\"-0.4,-0.24 -0.33,-0.1 -0.24,-0.04 -0.1,-0.01 0.1,0.0 0.25,0.02 0.4,(1-{1}/100)\u00b70.48-0.24\" thick=0.012 color=$accent keys=\"draw:+0.1=0,+1.2=1\"\n+0.5 shape area parent=@ (same points down to the axis) grad=$accent opacity=0.3 in=fadeUp\n+1.2 shape circle parent=@ pos=0.4,end w=0.04 color=$accent in=popIn emph=pulse\n+1.2 text \"{1}%\" parent=@ pos=0.3,end-0.1 size=64 weight=800 color=$accent in=popIn\n+1.3 text \"{2}\" pos=0,0.42 size=40 color=$soft in=fadeUp"
  },
  {
   "name": "grow.engage",
   "pack": "grow",
   "status": "final",
   "about": "Like, comment and share icons pop in a row, each with its count rolling up.",
   "use": "engagement stats, \"like and share\", community moments, post-video recaps",
   "slots": [
    {
     "key": "likes",
     "type": "number",
     "optional": false,
     "hint": "likes",
     "length": "number"
    },
    {
     "key": "comments",
     "type": "number",
     "optional": false,
     "hint": "comments",
     "length": "number"
    },
    {
     "key": "shares",
     "type": "number",
     "optional": false,
     "hint": "shares",
     "length": "number"
    }
   ],
   "options": "fmt=short|group",
   "example": "00:04.00 --> 00:08.00 item grow.engage \"48000|2300|5100\" fmt=short",
   "layers": "# three columns k = 0..2 at x = -0.3 + 0.3k: drawn icon (heart / bubble / share) + count\n+0.15k shape heart|bubble|share pos=x,-0.08 w=0.16 color=$accent|$good|$ink in=popIn\n+0.15k+0.1 text \"{k+1}\" pos=x,0.14 size=56 weight=800 count=0,{k+1},+0.2,+1.2,{fmt}\n# the heart gets a pulse when its count finishes"
  },
  {
   "name": "grow.watchtime",
   "pack": "grow",
   "status": "final",
   "about": "A clock face fills like a ring while the watch hours count up.",
   "use": "watch hours, monetisation goals, \"4,000 hours\" progress, time spent",
   "slots": [
    {
     "key": "hours",
     "type": "number",
     "optional": false,
     "hint": "watch hours",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=group|lakh",
   "example": "00:03.00 --> 00:07.00 item grow.watchtime \"4000|watch hours\" fmt=group",
   "layers": "shape ring id=@ pos=0,-0.1 w=0.56 thick=0.08 color=$bar opacity=0.35 in=scaleIn\n+0.2 shape ring parent=@ w=0.56 thick=0.08 grad=$accent arc=0 keys=\"arc:+0.2=0,+1.4=1\"\n+0 shape clock parent=@ w=0.2 color=$ink in=popIn\n+0.2 text \"{1}\" pos=0,0.28 size=110 weight=800 count=0,{1},+0.2,+1.4,{fmt}\n+0.8 text \"{2}\" pos=0,0.42 size=44 color=$soft in=fadeUp"
  },
  {
   "name": "grow.thumbnail",
   "pack": "grow",
   "status": "final",
   "about": "A video card builds: a bold thumbnail with highlighted words, a circled result and a pointing arrow, then the title row.",
   "use": "showing a video or thumbnail idea, \"my best video\", thumbnail breakdowns",
   "slots": [
    {
     "key": "title",
     "type": "text",
     "optional": false,
     "hint": "big thumbnail words (2\u20133)",
     "length": "up to 4 words"
    },
    {
     "key": "highlight",
     "type": "text",
     "optional": true,
     "hint": "highlighted words",
     "length": "up to 4 words"
    },
    {
     "key": "duration",
     "type": "text",
     "optional": true,
     "hint": "length, e.g. 12:04",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item grow.thumbnail \"I TRIED IT|30 DAYS|12:04\"",
   "layers": "card id=@ pos=0,-0.1 w=0.92 h=0.52 radius=0.05 grad=$surface in=popIn         # 16:9 thumbnail\n+0 shape circle parent=@ pos=0.22,0 w=0.7 gradr=$accent opacity=0.35            # glow behind the result\n+0.15 text \"{1}\" parent=@ pos=-0.2,-0.08 w=0.5 size=110 weight=800 font=anton color=$ink in=scaleIn\n+0.3 shape rect parent=@ pos=-0.2,0.12 w=0.4 h=0.13 grad=$accent rot=-3 growTo=w,0,0.4,+0.3,+0.5\n+0.35 text \"{2}\" parent=@ pos=-0.2,0.12 size=70 font=anton color=$accentInk rot=-3 in=popIn\n+0.6 shape ring parent=@ pos=0.25,-0.02 w=0.3 thick=0.04 color=#FF3B3B keys=\"draw:+0.6=0,+0.9=1\"\n+0.8 shape arrow parent=@ pos=0.06,0.16 w=0.14 rot=-35 color=#FF3B3B in=slideL\n+0.5 shape pill parent=@ pos=0.38,0.2 w=0.15 h=0.07 color=#000000 opacity=0.8   + text \"{3}\" color=#FFFFFF\n+0.7 shape circle pos=-0.4,0.3 w=0.09 grad=$accent in=popIn     # channel row: avatar + 2 title lines\n+0.75 shape pill pos=-0.04,0.27 w=0.6 h=0.035 color=$ink opacity=0.85 growTo=w\u2026   + pill w=0.4 color=$soft"
  },
  {
   "name": "grow.comment",
   "pack": "grow",
   "status": "final",
   "about": "A comment card slides up with initials, name and text; a heart pops on it as pinned.",
   "use": "reading viewer comments, shout-outs, Q&A, social proof",
   "slots": [
    {
     "key": "name",
     "type": "text",
     "optional": false,
     "hint": "commenter name",
     "length": "up to 4 words"
    },
    {
     "key": "comment",
     "type": "text",
     "optional": false,
     "hint": "the comment",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:05.00 --> 00:09.00 item grow.comment \"Riya Sharma|This video changed how I save money!\"",
   "layers": "card id=@ w=0.94 h=0.46 radius=0.08 grad=$surface in=slideU\n+0.1 shape circle parent=@ pos=-0.36,-0.08 w=0.14 grad=$accent in=popIn   + text \"{1:initials}\" color=$accentInk\n+0.2 text \"{1}\" parent=@ pos=-0.22,-0.12 align=left size=36 weight=800 color=$soft in=fadeUp\n+0.3 text \"{2}\" parent=@ pos=-0.22,0.02 w=0.66 align=left size=40 weight=600 in=wordFade\n+1.2 shape heart parent=@ pos=0.38,0.16 w=0.07 color=$accent in=popIn   + text \"Pinned\" size=26 color=$soft"
  },
  {
   "name": "grow.revenue",
   "pack": "grow",
   "status": "final",
   "about": "Earnings bars stack up and the per-1,000-views figure counts in.",
   "use": "creator income, RPM / CPM talk, \"how much I earned from\u2026\"",
   "slots": [
    {
     "key": "rpm",
     "type": "number",
     "optional": false,
     "hint": "earnings per 1,000 views",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=inr|group",
   "example": "00:07.00 --> 00:11.00 item grow.revenue \"180|per 1,000 views\" fmt=inr",
   "layers": "card id=@ w=1 h=0.72 grad=$surface in=popIn\n# 6 month bars rising (the last in $good), then the headline value\n+0.08k shape rect parent=@ pos=-0.35+0.14k,0.26 anchor=bottom w=0.08 radius=0.2 color=$bar|$good growTo=h,0,hk,+0.08k,+0.08k+0.4\n+0.6 text \"{1}\" parent=@ pos=0,-0.2 size=120 weight=800 color=$good count=0,{1},+0.6,+1.4,{fmt}\n+0.9 text \"{2}\" parent=@ pos=0,-0.06 size=40 color=$soft in=fadeUp"
  },
  {
   "name": "grow.upload",
   "pack": "grow",
   "status": "final",
   "about": "A video file uploads with a filling bar, then flips to Published with a tick.",
   "use": "upload day, \"new video out now\", publishing schedules, behind the scenes",
   "slots": [
    {
     "key": "title",
     "type": "text",
     "optional": false,
     "hint": "video title",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:05.00 item grow.upload \"My first 1M views\"",
   "layers": "card id=@ w=0.9 h=0.4 radius=0.08 grad=$surface in=popIn\n+0.1 card parent=@ pos=-0.3,-0.04 w=0.22 h=0.14 radius=0.1 grad=$accent   + shape play w=0.06 color=$accentInk\n+0.2 text \"{1}\" parent=@ pos=0.08,-0.08 w=0.5 align=left size=40 weight=800 in=fadeUp\n+0.3 shape pill parent=@ pos=-0.12,0.08 anchor=left h=0.04 grad=$accent growTo=w,0,0.56,+0.3,+1.3\n+0.3 text \"Uploading\u2026 {0}%\" \u2026 count=0,100,+0.3,+1.3,pct  \u2192  at +1.4: \"Published\" color=$good + shape circle grad=$good + check in=popIn"
  },
  {
   "name": "grow.boost",
   "pack": "grow",
   "status": "final",
   "about": "A video card rides up a stack of rising arrows into the recommended feed.",
   "use": "the algorithm, getting recommended, \"how videos blow up\", reach explainers",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label, e.g. Recommended",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:07.00 item grow.boost \"Recommended\"",
   "layers": "# 3 feed cards stacked at the top (faded), arrows chevron up the middle\n+0 card pos=0,-0.3 w=0.7 h=0.12 radius=0.2 color=$bar opacity=0.4 in=fadeUp   (\u00d72 more, offset)\n+0.2 shape chevron w=0.16 rot=-90 color=$accent keys=\"opacity:wave\" emph=float   (\u00d73 stacked)\n+0.3 card id=@ pos=0,0.3 w=0.7 h=0.16 radius=0.2 grad=$accent keys=\"y:+0.3=0.3,+1.1=-0.14~eb\" glow=0.4\n+0.4 shape play parent=@ pos=-0.26,0 w=0.08 color=$accentInk   + text \"Your video\" \u2026\n+1.1 text \"{1}\" pos=0,0.42 size=50 weight=800 color=$accent in=popIn"
  },
  {
   "name": "health.heartrate",
   "pack": "health",
   "status": "final",
   "about": "A heart beats while an ECG line sweeps across and the BPM counts in.",
   "use": "heart rate, cardio, stress, \"what happens to your heart when\u2026\"",
   "slots": [
    {
     "key": "bpm",
     "type": "number",
     "optional": false,
     "hint": "beats per minute",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item health.heartrate \"72|resting heart rate\"",
   "layers": "card id=@ w=1 h=0.7 grad=$surface in=popIn\n+0 shape heart parent=@ pos=-0.32,-0.2 w=0.14 color=#FF4D5E in=popIn emph=pulse       # fixed heart red\n+0.1 text \"{1}\" parent=@ pos=0.04,-0.2 align=left size=110 weight=800 count=40,{1},+0.1,+1.0   + text \"BPM\" size=36 color=$soft\n+0.2 shape line parent=@ pos=0,0.12 points=\"flat\u2026spike\u2026flat\u2026spike\" thick=0.012 color=$accent keys=\"draw:+0.2=0,+1.4=1\"\n+0.9 text \"{2}\" pos=0,0.42 size=40 color=$soft in=fadeUp"
  },
  {
   "name": "health.steps",
   "pack": "health",
   "status": "final",
   "about": "A ring fills toward the daily goal as the step count rolls up; footprints step in.",
   "use": "walking, step goals, daily activity, \"10,000 steps a day\"",
   "slots": [
    {
     "key": "steps",
     "type": "number",
     "optional": false,
     "hint": "steps taken",
     "length": "number"
    },
    {
     "key": "goal",
     "type": "number",
     "optional": false,
     "hint": "step goal",
     "length": "number"
    }
   ],
   "options": "fmt=group|short",
   "example": "00:03.00 --> 00:07.00 item health.steps \"8420|10000\" fmt=group",
   "layers": "shape ring id=@ pos=0,-0.08 w=0.62 thick=0.1 color=$bar opacity=0.35 in=scaleIn\n+0.2 shape ring parent=@ w=0.62 thick=0.1 grad=$good arc=0 keys=\"arc:+0.2=0,+1.4={1}/{2}\"\n+0 shape foot parent=@ pos=\u00b10.05,-0.12 w=0.07 color=$good in=popIn (left, then right 0.15 s later)\n+0.2 text \"{1}\" parent=@ pos=0,0.06 size=90 weight=800 count=0,{1},+0.2,+1.4,{fmt}\n+0.8 text \"of {2} steps\" pos=0,0.4 size=42 color=$soft in=fadeUp"
  },
  {
   "name": "health.water",
   "pack": "health",
   "status": "final",
   "about": "A glass fills with a moving wave, glass by glass toward the daily goal.",
   "use": "hydration, drinking water, daily habits, \"drink more water\" tips",
   "slots": [
    {
     "key": "glasses",
     "type": "number",
     "optional": false,
     "hint": "glasses drunk",
     "length": "number"
    },
    {
     "key": "goal",
     "type": "number",
     "optional": false,
     "hint": "glasses goal",
     "length": "number"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item health.water \"6|8\"",
   "layers": "shape glass id=@ pos=0,-0.06 w=0.36 h=0.5 stroke=4 strokeColor=$soft color=none in=fadeUp\n+0.2 shape wave parent=@ clip=glass color=$accent keys=\"h:+0.2=0,+1.4={1}/{2};x:loop\" emph=float\n+0.2 text \"{1}/{2}\" pos=0.3,-0.1 align=left size=90 weight=800 count=0,{1},+0.2,+1.4\n+0.6 text \"glasses\" pos=0.3,0.04 align=left size=40 color=$soft in=fadeUp\n# 8 small drops below fill in one by one up to {1}"
  },
  {
   "name": "health.calories",
   "pack": "health",
   "status": "final",
   "about": "A flame flickers while calories in and calories out race as bars; the gap shows.",
   "use": "diet, calorie deficit, burning fat, food vs exercise",
   "slots": [
    {
     "key": "in",
     "type": "number",
     "optional": false,
     "hint": "calories eaten",
     "length": "number"
    },
    {
     "key": "out",
     "type": "number",
     "optional": false,
     "hint": "calories burned",
     "length": "number"
    }
   ],
   "options": "fmt=group",
   "example": "00:04.00 --> 00:08.00 item health.calories \"2100|2600\" fmt=group",
   "layers": "shape flame id=@ pos=0,-0.32 w=0.14 grad=$accent in=popIn emph=breathe        # drawn flame\n+0.2 text \"In\" pos=-0.38,-0.1 align=left size=40 color=$soft   + shape pill anchor=left h=0.08 grad=$accent growTo=w,0,{1}/max\u00b70.66,+0.2,+1.1\n+0.4 text \"Out\" pos=-0.38,0.1 align=left size=40 color=$soft   + shape pill anchor=left h=0.08 grad=$good growTo=w,0,{2}/max\u00b70.66,+0.4,+1.3\n+0.2 text \"{1}\" / \"{2}\" at each bar's end, count=0,{n},\u2026,{fmt}\n+1.4 text \"\u2212{2-1} kcal\" pos=0,0.34 size=70 weight=800 color=$good in=popIn"
  },
  {
   "name": "health.sleep",
   "pack": "health",
   "status": "final",
   "about": "A moon rises with drifting Zs; a week of sleep bars grows and the average counts in.",
   "use": "sleep habits, rest and recovery, \"how much sleep you need\"",
   "slots": [
    {
     "key": "hours",
     "type": "number",
     "optional": false,
     "hint": "hours slept",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=one",
   "example": "00:05.00 --> 00:09.00 item health.sleep \"7.5|average this week\" fmt=one",
   "layers": "shape moon id=@ pos=-0.3,-0.3 w=0.16 grad=$accent keys=\"y:+0=-0.2,+0.4=-0.3~eb\"     # drawn crescent\n+0.3 text \"z\" pos=-0.2,-0.36 size=40 color=$soft keys=\"y,opacity: drift up and fade\" (\u00d73, staggered)\n# 7 nightly bars k = 0..6 grow from the base; the best night in $accent\n+0.08k shape rect pos=-0.36+0.12k,0.26 anchor=bottom w=0.08 radius=0.3 color=$bar|$accent growTo=h,0,hk,\u2026\n+0.4 text \"{1} h\" pos=0.18,-0.3 size=96 weight=800 count=0,{1},+0.4,+1.3,{fmt}\n+0.8 text \"{2}\" pos=0,0.42 size=40 color=$soft in=fadeUp"
  },
  {
   "name": "health.bmi",
   "pack": "health",
   "status": "final",
   "about": "A colour scale from under to over; the marker slides to the value and the rating lands.",
   "use": "BMI, body composition, any low-normal-high health scale",
   "slots": [
    {
     "key": "bmi",
     "type": "number",
     "optional": false,
     "hint": "BMI value",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "rating word",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=one",
   "example": "00:04.00 --> 00:08.00 item health.bmi \"22.4|Healthy\" fmt=one",
   "layers": "shape pill id=@ w=0.84 h=0.08 grad=$soft,$good,$accent,#FF4D5E in=fadeUp   # four zones: under, healthy, over, obese\n+0 text \"Under \u00b7 Healthy \u00b7 Over \u00b7 Obese\" \u2026 size=28 color=$soft\n+0.2 shape triangle parent=@ pos=x,-0.1 w=0.06 rot=180 color=$ink keys=\"x:+0.2=-0.42,+1.2=({1}-15)/25\u00b70.84-0.42~eb\"\n+0.2 text \"{1}\" pos=0,-0.28 size=130 weight=800 count=15,{1},+0.2,+1.2,{fmt}\n+1.2 text \"{2}\" pos=0,0.3 size=60 weight=800 color=$good in=popIn"
  },
  {
   "name": "health.macros",
   "pack": "health",
   "status": "final",
   "about": "A donut splits into protein, carbs and fat with a legend.",
   "use": "diet plans, meal breakdowns, nutrition, \"what I eat in a day\"",
   "slots": [
    {
     "key": "protein",
     "type": "number",
     "optional": false,
     "hint": "protein %",
     "length": "number"
    },
    {
     "key": "carbs",
     "type": "number",
     "optional": false,
     "hint": "carbs %",
     "length": "number"
    },
    {
     "key": "fat",
     "type": "number",
     "optional": false,
     "hint": "fat %",
     "length": "number"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:07.00 item health.macros \"30|45|25\"",
   "layers": "shape ring id=@ pos=0,-0.1 w=0.56 thick=0.16 color=$bar opacity=0.35 in=scaleIn\n+0.2 shape ring parent=@ \u2026 color=$accent arc keys \u2192 {1}/100        # protein\n+0.7 shape ring parent=@ \u2026 color=$good arcStart={1} keys \u2192 {2}/100  # carbs\n+1.1 shape ring parent=@ \u2026 color=$soft arcStart={1}+{2} keys \u2192 {3}/100   # fat\n+1.3 text \"\u25cf Protein {1}%  \u25cf Carbs {2}%  \u25cf Fat {3}%\" pos=0,0.4 size=34 weight=600 in=fadeUp"
  },
  {
   "name": "health.workout",
   "pack": "health",
   "status": "final",
   "about": "A countdown ring ticks down the seconds of a set; the set label sits below.",
   "use": "workouts, intervals, HIIT, planks, \"hold for 45 seconds\"",
   "slots": [
    {
     "key": "seconds",
     "type": "number",
     "optional": false,
     "hint": "countdown seconds",
     "length": "number"
    },
    {
     "key": "set",
     "type": "text",
     "optional": true,
     "hint": "set label, e.g. Set 2 of 4",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:10.00 --> 00:14.00 item health.workout \"45|Set 2 of 4\"",
   "layers": "shape ring id=@ pos=0,-0.06 w=0.6 thick=0.08 color=$bar opacity=0.35 in=scaleIn\n+0 shape ring parent=@ w=0.6 thick=0.08 grad=$accent arc=1 keys=\"arc:+0=1,+END=0~ll\"     # drains over the item's life\n+0 text \"00:{1}\" parent=@ size=120 weight=800 font=mono count={1},0,+0,+END\n+0.4 text \"{2}\" pos=0,0.36 size=50 weight=800 in=fadeUp\n# 4 set dots under it, filled up to the current set"
  },
  {
   "name": "health.weight",
   "pack": "health",
   "status": "final",
   "about": "A weight line steps down week by week; the total lost counts up.",
   "use": "weight loss journeys, transformations, progress updates",
   "slots": [
    {
     "key": "change",
     "type": "number",
     "optional": false,
     "hint": "kg lost (or gained)",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "time span",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=one",
   "example": "00:04.00 --> 00:09.00 item health.weight \"6.5|in 8 weeks\" fmt=one",
   "layers": "card id=@ w=1 h=0.72 grad=$surface in=popIn\n# 8 weekly points falling; dots pop as the line reaches them\n+0.1 shape line parent=@ points=\"\u20268 points down\" thick=0.012 color=$good keys=\"draw:+0.1=0,+1.3=1\"\n+0.1+0.15k shape circle parent=@ pos=xk,yk w=0.03 color=$good in=popIn\n+0.4 text \"\u2212{1} kg\" parent=@ pos=0.2,-0.24 size=96 weight=800 color=$good count=0,{1},+0.4,+1.4,{fmt}\n+0.9 text \"{2}\" pos=0,0.42 size=40 color=$soft in=fadeUp"
  },
  {
   "name": "health.pill",
   "pack": "health",
   "status": "final",
   "about": "A capsule drops and bounces; a week of doses ticks off one day at a time.",
   "use": "medicine, supplements, vitamins, routines, \"take it daily\"",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label, e.g. Daily vitamin D",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item health.pill \"Daily vitamin D\"",
   "layers": "shape pill id=@ pos=0,-0.2 w=0.3 h=0.12 rot=-30 grad=$accent keys=\"y:+0=-0.7,+0.45=-0.2~eb\"   # half $accent, half $surface\n# 7 day circles M T W T F S S; each fills with $good and a tick, 0.12 s apart\n+0.5+0.12k shape circle pos=-0.36+0.12k,0.12 w=0.09 grad=$good in=popIn   + text \"MTWTFSS\"[k] size=24 color=$soft\n+1.4 text \"{1}\" pos=0,0.36 size=50 weight=800 in=fadeUp"
  },
  {
   "name": "health.breathe",
   "pack": "health",
   "status": "final",
   "about": "A soft circle grows and shrinks in a breathing rhythm while the word swaps in and out.",
   "use": "breathing exercises, calm, anxiety tips, meditation, focus",
   "slots": [
    {
     "key": "in",
     "type": "text",
     "optional": true,
     "hint": "inhale word",
     "length": "up to 4 words"
    },
    {
     "key": "out",
     "type": "text",
     "optional": true,
     "hint": "exhale word",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:00.00 --> 00:08.00 item health.breathe \"Breathe in|Breathe out\"",
   "layers": "shape circle id=@ w=0.3 gradr=$good opacity=0.85 keys=\"scale:+0=0.7,+2=1.6~ee,+4=0.7~ee\" (repeats)\n+0 shape ring parent=@ w=0.62 thick=0.01 color=$good opacity=0.4\n+0 text \"{1}\" size=60 weight=800 color=$goodInk keys=\"opacity:+0=1,+1.8=1~eh,+2=0,+3.8=0~eh,+4=1\"\n+2 text \"{2}\" size=60 weight=800 color=$goodInk keys=\"opacity: the opposite\""
  },
  {
   "name": "health.mood",
   "pack": "health",
   "status": "final",
   "about": "A drawn face turns from a frown to a smile as the mood slider moves up.",
   "use": "mental health, mood tracking, \"how this made me feel\", before/after wellbeing",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label, e.g. Mood after a walk",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:07.00 item health.mood \"Mood after a walk\"",
   "layers": "shape circle id=@ pos=0,-0.12 w=0.42 color=$bar keys=\"color:+0.3=$bar,+1.3=$good\"\n+0 shape circle parent=@ pos=\u00b10.07,-0.05 w=0.05 color=$ink                 # eyes\n+0 shape arc parent=@ pos=0,0.08 w=0.18 thick=0.03 color=$ink keys=\"bend:+0.3=-1,+1.3=1~ee\"   # mouth: frown \u2192 smile\n+0.3 shape pill pos=0,0.24 w=0.7 h=0.04 grad=#FF4D5E,$accent,$good   + shape circle w=0.07 color=$ink keys=\"x:+0.3=-0.35,+1.3=0.3\"\n+1.2 text \"{1}\" pos=0,0.4 size=46 weight=800 in=fadeUp"
  },
  {
   "name": "biz.funding",
   "pack": "biz",
   "status": "final",
   "about": "A funding round card: the round tag pops, the amount counts up, investor dots line up.",
   "use": "startup funding news, \"they just raised\u2026\", investor deals",
   "slots": [
    {
     "key": "amount",
     "type": "number",
     "optional": false,
     "hint": "amount raised",
     "length": "number"
    },
    {
     "key": "round",
     "type": "text",
     "optional": false,
     "hint": "round, e.g. Series A",
     "length": "1 word"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "who led it, or a label",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=short|lakh cur=\u20b9|$",
   "example": "00:02.00 --> 00:06.00 item biz.funding \"50000000|Series B|led by 3 investors\" fmt=short cur=$",
   "layers": "card id=@ w=1 h=0.66 grad=$surface in=popIn\n+0.1 shape pill parent=@ pos=-0.22,-0.2 w=0.36 h=0.1 grad=$accent in=popIn   + text \"{2}\" size=36 weight=800 color=$accentInk\n+0.2 text \"{cur}{1}\" parent=@ pos=0,0.0 size=130 weight=800 count=0,{1},+0.2,+1.3,{fmt}\n+0.8 shape circle parent=@ pos=-0.12+0.1k,0.2 w=0.08 grad=$bar|$accent in=popIn   (3, overlapping, staggered)\n+0.9 text \"{3}\" parent=@ pos=0.16,0.2 align=left size=34 color=$soft in=fadeUp"
  },
  {
   "name": "biz.valuation",
   "pack": "biz",
   "status": "final",
   "about": "A valuation bar climbs past marker ticks to the value; a badge stamps on at the top.",
   "use": "company valuations, unicorns, \"now worth\u2026\", growth stories",
   "slots": [
    {
     "key": "value",
     "type": "number",
     "optional": false,
     "hint": "valuation",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label, e.g. Unicorn",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=short|lakh cur=\u20b9|$",
   "example": "00:03.00 --> 00:07.00 item biz.valuation \"1200000000|Unicorn\" fmt=short cur=$",
   "layers": "shape rect id=@ pos=-0.16,0.36 anchor=bottom w=0.18 radius=0.2 color=$bar h=0.72\n+0.2 shape rect parent=@ anchor=bottom w=0.18 radius=0.2 grad=$accent growTo=h,0,0.72\u00b7min(1,{1}/max),+0.2,+1.4\n+0 text \"$100M \u00b7 $500M \u00b7 $1B\" ticks along the bar, size=28 color=$soft\n+0.2 text \"{cur}{1}\" pos=0.24,-0.06 align=left size=110 weight=800 color=$accent count=0,{1},+0.2,+1.4,{fmt}\n+1.4 shape pill pos=0.24,0.1 w=0.32 h=0.1 grad=$good rot=-6 keys=\"scale:+1.4=2,+1.6=1\"   + text \"{2}\" color=$goodInk"
  },
  {
   "name": "biz.profit",
   "pack": "biz",
   "status": "final",
   "about": "Revenue and profit bars rise side by side; the margin badge shows the share kept.",
   "use": "company results, \"revenue isn't profit\", margins, quarterly numbers",
   "slots": [
    {
     "key": "revenue",
     "type": "number",
     "optional": false,
     "hint": "revenue",
     "length": "number"
    },
    {
     "key": "profit",
     "type": "number",
     "optional": false,
     "hint": "profit (minus for a loss)",
     "length": "number"
    }
   ],
   "options": "fmt=short|lakh cur=\u20b9|$",
   "example": "00:05.00 --> 00:09.00 item biz.profit \"8400000000|1100000000\" fmt=short cur=\u20b9",
   "layers": "# two bars from a base line; profit is $good (or #FF4D5E below the line for a loss)\n+0.2 shape rect pos=-0.18,0.3 anchor=bottom w=0.22 radius=0.15 grad=$accent growTo=h,0,0.56,+0.2,+1.1\n+0.4 shape rect pos=0.18,0.3 anchor=bottom w=0.22 radius=0.15 grad=$good growTo=h,0,0.56\u00b7{2}/{1},+0.4,+1.3\n+0.2 text \"{cur}{1}\" follow=bar1,top,-30 size=54 weight=800 count\u2026   + text \"Revenue\" under it\n+0.4 text \"{cur}{2}\" follow=bar2,top,-30 size=54 weight=800 color=$good count\u2026   + text \"Profit\" under it\n+1.4 shape pill pos=0.18,-0.34 w=0.36 h=0.1 color=$good in=popIn   + text \"{2/1}% margin\""
  },
  {
   "name": "biz.founder",
   "pack": "biz",
   "status": "final",
   "about": "A founder card: initials badge, name, company and a founded-year tag slide in.",
   "use": "founder stories, \"who built this\", interviews, business profiles",
   "slots": [
    {
     "key": "name",
     "type": "text",
     "optional": false,
     "hint": "founder name (initials drawn from it)",
     "length": "up to 4 words"
    },
    {
     "key": "company",
     "type": "text",
     "optional": false,
     "hint": "company and role",
     "length": "up to 4 words"
    },
    {
     "key": "year",
     "type": "text",
     "optional": true,
     "hint": "founded year",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:05.00 item biz.founder \"Ritesh Agarwal|Founder & CEO, Stayly|2013\"",
   "layers": "card id=@ w=0.9 h=0.56 grad=$surface in=popIn\n+0.1 shape circle parent=@ pos=0,-0.12 w=0.24 grad=$accent in=popIn   + text \"{1:initials}\" size=70 weight=800 color=$accentInk\n+0.3 text \"{1}\" parent=@ pos=0,0.08 size=64 weight=800 in=fadeUp\n+0.45 text \"{2}\" parent=@ pos=0,0.17 size=36 color=$soft in=fadeUp\n+0.7 shape pill pos=0.28,-0.22 w=0.3 h=0.08 grad=$good in=popIn   + text \"Since {3}\" color=$goodInk"
  },
  {
   "name": "biz.marketshare",
   "pack": "biz",
   "status": "final",
   "about": "Three company bubbles pop, sized by market share, with their percentages.",
   "use": "market share, competition, \"who owns this market\", industry breakdowns",
   "slots": [
    {
     "key": "nameA",
     "type": "text",
     "optional": false,
     "hint": "first company",
     "length": "up to 4 words"
    },
    {
     "key": "a",
     "type": "number",
     "optional": false,
     "hint": "first share %",
     "length": "number"
    },
    {
     "key": "nameB",
     "type": "text",
     "optional": false,
     "hint": "second company",
     "length": "up to 4 words"
    },
    {
     "key": "b",
     "type": "number",
     "optional": false,
     "hint": "second share %",
     "length": "number"
    },
    {
     "key": "nameC",
     "type": "text",
     "optional": false,
     "hint": "third company",
     "length": "up to 4 words"
    },
    {
     "key": "c",
     "type": "number",
     "optional": false,
     "hint": "third share %",
     "length": "number"
    }
   ],
   "options": "",
   "example": "00:04.00 --> 00:08.00 item biz.marketshare \"Alpha|48|Beta|32|Gamma|20\"",
   "layers": "# three circles, diameter \u221d \u221ashare; the largest is $accent, then $good, then $bar; they nudge apart\n+0.2 shape circle pos=-0.14,-0.02 w=0.56\u00b7\u221a({2}/{2}) grad=$accent keys=\"scale:+0.2=0,+0.6=1.08~eb,+0.75=1\"\n+0.4 shape circle pos=0.26,-0.18 w=0.56\u00b7\u221a({4}/{2}) grad=$good \u2026\n+0.6 shape circle pos=0.24,0.22 w=0.56\u00b7\u221a({6}/{2}) color=$bar \u2026\n+0.3 text \"{1}\" + \"{2}%\" inside each bubble, count"
  },
  {
   "name": "biz.unit",
   "pack": "biz",
   "status": "final",
   "about": "A balance scale tips: the cost to get a customer on one side, what they're worth on the other.",
   "use": "unit economics, CAC vs LTV, \"is this business profitable per customer\"",
   "slots": [
    {
     "key": "cac",
     "type": "number",
     "optional": false,
     "hint": "cost to get a customer",
     "length": "number"
    },
    {
     "key": "ltv",
     "type": "number",
     "optional": false,
     "hint": "what a customer is worth",
     "length": "number"
    }
   ],
   "options": "fmt=inr|short cur=\u20b9|$",
   "example": "00:06.00 --> 00:10.00 item biz.unit \"800|4200\" fmt=inr cur=\u20b9",
   "layers": "shape triangle id=@ pos=0,0.3 w=0.12 color=$soft            # the pivot\n+0 shape rect parent=@ pos=0,-0.2 w=0.8 h=0.02 color=$ink keys=\"rot:+0.3=0,+1.2=-12~eb\"   # beam tips toward the heavier side\n+0 shape pill (pan) under each end, riding the beam; left pan \"{cur}{1}\" + \"Cost (CAC)\", right pan \"{cur}{2}\" + \"Worth (LTV)\" color=$good\n+1.3 text \"LTV {2/1}\u00d7 CAC\" pos=0,0.42 size=52 weight=800 color=$good in=popIn"
  },
  {
   "name": "biz.timeline",
   "pack": "biz",
   "status": "final",
   "about": "A vertical timeline draws down; each year pops with its milestone beside it.",
   "use": "company history, startup journeys, \"from garage to IPO\"",
   "slots": [
    {
     "key": "year1",
     "type": "text",
     "optional": false,
     "hint": "first year",
     "length": "up to 4 words"
    },
    {
     "key": "event1",
     "type": "text",
     "optional": false,
     "hint": "first event",
     "length": "up to 4 words"
    },
    {
     "key": "year2",
     "type": "text",
     "optional": false,
     "hint": "second year",
     "length": "up to 4 words"
    },
    {
     "key": "event2",
     "type": "text",
     "optional": false,
     "hint": "second event",
     "length": "up to 4 words"
    },
    {
     "key": "year3",
     "type": "text",
     "optional": false,
     "hint": "third year",
     "length": "up to 4 words"
    },
    {
     "key": "event3",
     "type": "text",
     "optional": false,
     "hint": "third event",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:08.00 --> 00:13.00 item biz.timeline \"2013|Founded in a dorm|2017|Series C|2024|Goes public\"",
   "layers": "shape line id=@ pos=-0.22,0 h=0.76 thick=0.012 color=$bar growTo=h,0,0.76,+0,+0.9\n# rows k = 0..2 at y = -0.26 + 0.26k, start +0.2 + 0.35k\n+0.2+0.35k shape circle parent=@ pos=0,y w=0.06 grad=$accent in=popIn   (the last one $good)\n+0.25+0.35k text \"{year}\" pos=-0.3,y align=right size=46 weight=800 color=$accent in=slideR\n+0.3+0.35k text \"{event}\" pos=-0.14,y align=left size=40 weight=600 in=slideL"
  },
  {
   "name": "biz.versus",
   "pack": "biz",
   "status": "final",
   "about": "Two company cards face off on one number; the bigger one gets the crown glow.",
   "use": "company vs company, \"who's bigger\", competitor breakdowns",
   "slots": [
    {
     "key": "nameA",
     "type": "text",
     "optional": false,
     "hint": "first company",
     "length": "up to 4 words"
    },
    {
     "key": "a",
     "type": "number",
     "optional": false,
     "hint": "its number",
     "length": "number"
    },
    {
     "key": "nameB",
     "type": "text",
     "optional": false,
     "hint": "second company",
     "length": "up to 4 words"
    },
    {
     "key": "b",
     "type": "number",
     "optional": false,
     "hint": "its number",
     "length": "number"
    },
    {
     "key": "metric",
     "type": "text",
     "optional": false,
     "hint": "what is compared, e.g. Revenue",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=short|lakh cur=\u20b9|$",
   "example": "00:05.00 --> 00:09.00 item biz.versus \"Alpha|9200000000|Beta|5600000000|Revenue\" fmt=short cur=$",
   "layers": "card pos=-0.24,0 w=0.44 h=0.6 grad=$surface keys=\"x:+0=-0.8,+0.4=-0.24~eb\"\n+0 card pos=0.24,0 w=0.44 h=0.6 grad=$surface keys=\"x:+0=0.8,+0.4=0.24~eb\"\n+0.3 text \"{1}\" / \"{3}\" at the top of each card, size=50 weight=800\n+0.4 text \"{cur}{2}\" / \"{cur}{4}\" in each card, size=70 weight=800 count\u2026   (bigger one color=$accent)\n+0.2 text \"{5}\" pos=0,-0.4 size=40 color=$soft in=fadeUp\n+0.5 shape circle pos=0,0 w=0.14 color=$ink in=popIn   + text \"VS\" color=$bg\n+1.3 the winning card gets stroke=4 strokeColor=$accent glow=0.5"
  },
  {
   "name": "biz.moneyflow",
   "pack": "biz",
   "status": "final",
   "about": "Three income streams flow into the company in the centre, each with its share.",
   "use": "\"how this company makes money\", business models, revenue streams",
   "slots": [
    {
     "key": "company",
     "type": "text",
     "optional": false,
     "hint": "company name",
     "length": "up to 4 words"
    },
    {
     "key": "src1",
     "type": "text",
     "optional": false,
     "hint": "first income source",
     "length": "up to 4 words"
    },
    {
     "key": "p1",
     "type": "number",
     "optional": false,
     "hint": "its %",
     "length": "number"
    },
    {
     "key": "src2",
     "type": "text",
     "optional": false,
     "hint": "second source",
     "length": "up to 4 words"
    },
    {
     "key": "p2",
     "type": "number",
     "optional": false,
     "hint": "its %",
     "length": "number"
    },
    {
     "key": "src3",
     "type": "text",
     "optional": false,
     "hint": "third source",
     "length": "up to 4 words"
    },
    {
     "key": "p3",
     "type": "number",
     "optional": false,
     "hint": "its %",
     "length": "number"
    }
   ],
   "options": "",
   "example": "00:04.00 --> 00:09.00 item biz.moneyflow \"Stayly|Bookings|62|Ads|23|Subscriptions|15\"",
   "layers": "card id=@ pos=0,0.2 w=0.4 h=0.16 radius=0.3 grad=$accent in=popIn   + text \"{1}\" size=50 weight=800 color=$accentInk\n# three sources k = 0..2 across the top; a curved line draws from each into the company, then a % chip pops on it\n+0.2k card pos=-0.32+0.32k,-0.3 w=0.28 h=0.12 radius=0.3 grad=$surface in=popIn   + text \"{src}\" size=32\n+0.3+0.2k shape line parent=@ curve=\u2026 thick=0.012 color=$good keys=\"draw:\u2026\"\n+0.8+0.2k shape pill on the line w=0.16 h=0.07 grad=$good in=popIn   + text \"{p}%\" color=$goodInk"
  },
  {
   "name": "biz.pricing",
   "pack": "biz",
   "status": "final",
   "about": "Three plan cards pop in; the middle one lifts up with a Popular tag.",
   "use": "pricing breakdowns, SaaS plans, \"which plan is worth it\", product tiers",
   "slots": [
    {
     "key": "tier1",
     "type": "text",
     "optional": false,
     "hint": "first plan",
     "length": "up to 4 words"
    },
    {
     "key": "price1",
     "type": "text",
     "optional": false,
     "hint": "its price",
     "length": "up to 4 words"
    },
    {
     "key": "tier2",
     "type": "text",
     "optional": false,
     "hint": "middle plan (gets Popular)",
     "length": "up to 4 words"
    },
    {
     "key": "price2",
     "type": "text",
     "optional": false,
     "hint": "its price",
     "length": "up to 4 words"
    },
    {
     "key": "tier3",
     "type": "text",
     "optional": false,
     "hint": "third plan",
     "length": "up to 4 words"
    },
    {
     "key": "price3",
     "type": "text",
     "optional": false,
     "hint": "its price",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item biz.pricing \"Basic|\u20b9199|Pro|\u20b9499|Team|\u20b9999\"",
   "layers": "# three cards k = 0..2 at x = -0.32 + 0.32k; the middle one is taller, $accent-edged and lifted\n+0.1k card pos=x,0.04 w=0.3 h=0.5 radius=0.1 grad=$surface in=popIn   (middle: h=0.6 stroke=4 strokeColor=$accent keys=\"y:+0.6=0.04,+0.9=-0.02\")\n+0.2+0.1k text \"{tier}\" pos=x,-0.12 size=36 weight=600 color=$soft in=fadeUp\n+0.3+0.1k text \"{price}\" pos=x,0.02 size=60 weight=800 in=popIn\n+0.8 shape pill pos=0,-0.3 w=0.26 h=0.08 grad=$accent in=popIn   + text \"Popular\" color=$accentInk"
  },
  {
   "name": "biz.funnel",
   "pack": "biz",
   "status": "final",
   "about": "A funnel narrows from visitors to buyers; each stage's count rolls in as it fills.",
   "use": "sales funnels, conversion rates, marketing breakdowns, \"how many actually buy\"",
   "slots": [
    {
     "key": "stage1",
     "type": "text",
     "optional": false,
     "hint": "top stage",
     "length": "up to 4 words"
    },
    {
     "key": "n1",
     "type": "number",
     "optional": false,
     "hint": "its count",
     "length": "number"
    },
    {
     "key": "stage2",
     "type": "text",
     "optional": false,
     "hint": "middle stage",
     "length": "up to 4 words"
    },
    {
     "key": "n2",
     "type": "number",
     "optional": false,
     "hint": "its count",
     "length": "number"
    },
    {
     "key": "stage3",
     "type": "text",
     "optional": false,
     "hint": "bottom stage",
     "length": "up to 4 words"
    },
    {
     "key": "n3",
     "type": "number",
     "optional": false,
     "hint": "its count",
     "length": "number"
    }
   ],
   "options": "fmt=short|group",
   "example": "00:06.00 --> 00:11.00 item biz.funnel \"Visitors|100000|Sign-ups|12000|Paid|1800\" fmt=short",
   "layers": "# three stacked trapezoids, each narrower; they drop in top to bottom\n+0.2k shape trapezoid pos=0,-0.26+0.24k w=0.8-0.22k h=0.2 grad=$accent|$accent|$good keys=\"y:+0.2k=y-0.1,+0.2k+0.3=y~eb\"\n+0.25+0.2k text \"{stage}\" pos=0,y-0.03 size=34 weight=600 color=$accentInk in=fadeUp\n+0.25+0.2k text \"{n}\" pos=0,y+0.05 size=56 weight=800 color=$accentInk count=0,{n},\u2026,{fmt}\n+1.2 text \"{n3/n1}% convert\" pos=0,0.44 size=40 color=$good in=fadeUp"
  },
  {
   "name": "biz.ipo",
   "pack": "biz",
   "status": "final",
   "about": "A ticker ribbon scrolls, an IPO stamp slams down and the listing gain counts up.",
   "use": "IPOs, listing day, stock market debuts, \"went public at\u2026\"",
   "slots": [
    {
     "key": "symbol",
     "type": "text",
     "optional": false,
     "hint": "ticker or company",
     "length": "up to 4 words"
    },
    {
     "key": "gain",
     "type": "number",
     "optional": false,
     "hint": "listing gain %, minus for a fall",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=one|pct",
   "example": "00:03.00 --> 00:07.00 item biz.ipo \"STAYLY|38.5|listing day gain\" fmt=one",
   "layers": "shape rect id=@ pos=0,-0.32 w=1.2 h=0.1 color=$surface   + text \"{1} \u25b2 {2}%  \u00b7  {1} \u25b2 {2}%  \u00b7  \u2026\" size=36 keys=\"x:+0=0.2,+4=-0.6~ll\"   # ticker ribbon\n+0.3 shape rect pos=0,-0.02 w=0.5 h=0.2 radius=0.1 stroke=6 strokeColor=$accent rot=-8 keys=\"scale:+0.3=2.4,+0.5=0.95,+0.6=1;opacity:+0.3=0,+0.4=1\"\n+0.3 text \"IPO\" pos=0,-0.02 size=110 font=anton color=$accent rot=-8 (same keys)\n+0.7 text \"\u25b2 {2}%\" pos=0,0.24 size=100 weight=800 color=$good count=0,{2},+0.7,+1.5,{fmt}\n+1.0 text \"{3}\" pos=0,0.4 size=40 color=$soft in=fadeUp"
  },
  {
   "name": "edu.definition",
   "pack": "edu",
   "status": "final",
   "about": "A dictionary card: the word lands, its type tag pops, the meaning writes on.",
   "use": "defining a term, jargon explainers, \"what does X actually mean\"",
   "slots": [
    {
     "key": "word",
     "type": "text",
     "optional": false,
     "hint": "the word",
     "length": "1 word"
    },
    {
     "key": "meaning",
     "type": "text",
     "optional": false,
     "hint": "the meaning, one short line",
     "length": "sentence"
    },
    {
     "key": "type",
     "type": "text",
     "optional": true,
     "hint": "word type, e.g. noun",
     "length": "1 word"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:07.00 item edu.definition \"Inflation|When prices rise and money buys less|noun\"",
   "layers": "card id=@ w=0.92 h=0.6 grad=$surface in=popIn\n+0.1 text \"{1}\" parent=@ pos=-0.38,-0.16 align=left size=96 weight=800 font=playfair in=slideL\n+0.3 shape pill parent=@ pos=0.3,-0.16 w=0.2 h=0.08 grad=$accent in=popIn   + text \"{3}\" size=30 color=$accentInk\n+0.4 shape line parent=@ pos=0,-0.04 w=0.76 thick=0.006 color=$bar growTo=w,0,0.76,+0.4,+0.7\n+0.6 text \"{2}\" parent=@ pos=-0.38,0.1 w=0.76 align=left size=44 weight=600 in=wordFade"
  },
  {
   "name": "edu.steps",
   "pack": "edu",
   "status": "final",
   "about": "Three numbered steps drop in down a line that connects them.",
   "use": "how-tos, processes, recipes, \"do these 3 things\"",
   "slots": [
    {
     "key": "step1",
     "type": "text",
     "optional": false,
     "hint": "first step",
     "length": "up to 4 words"
    },
    {
     "key": "step2",
     "type": "text",
     "optional": false,
     "hint": "second step",
     "length": "up to 4 words"
    },
    {
     "key": "step3",
     "type": "text",
     "optional": true,
     "hint": "third step",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:04.00 --> 00:09.00 item edu.steps \"Open an account|Set up auto-pay|Review monthly\"",
   "layers": "shape line id=@ pos=-0.3,0 h=0.6 thick=0.01 color=$bar growTo=h,0,0.6,+0,+1.0\n# k = 0..2 at y = -0.26 + 0.26k: numbered circle ($accent) + step text, staggered 0.3 s\n+0.3k shape circle parent=@ pos=0,y w=0.12 grad=$accent in=popIn   + text \"{k+1}\" size=50 weight=800 color=$accentInk\n+0.1+0.3k text \"{k+1}\" pos=-0.18,y align=left size=46 weight=700 in=slideL"
  },
  {
   "name": "edu.formula",
   "pack": "edu",
   "status": "final",
   "about": "A formula builds term by term; one term gets a highlight box and a note.",
   "use": "science, maths, finance formulas, \"the one equation you need\"",
   "slots": [
    {
     "key": "formula",
     "type": "text",
     "optional": false,
     "hint": "formula, parts split by spaces; the last part is highlighted",
     "length": "up to 4 words"
    },
    {
     "key": "note",
     "type": "text",
     "optional": true,
     "hint": "note on the highlighted part",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:08.00 item edu.formula \"E = mc\u00b2|c is the speed of light\"",
   "layers": "# the app splits {1} on spaces; each part pops in 0.15 s apart, centred, font=playfair size=140\n+0.15k text \"{part}\" pos=xk,-0.08 size=140 font=playfair in=popIn\n+0.9 shape rect pos=x(last),-0.08 w=0.3 h=0.26 radius=0.1 stroke=4 strokeColor=$accent color=none keys=\"draw:+0.9=0,+1.2=1\"\n+1.1 text \"{2}\" pos=0,0.24 size=42 weight=600 color=$soft in=fadeUp   + shape arrow up toward the box"
  },
  {
   "name": "edu.quiz",
   "pack": "edu",
   "status": "final",
   "about": "A question with four options; a timer bar runs out and the right answer lights up.",
   "use": "quizzes, \"can you guess?\", trivia, test-yourself moments",
   "slots": [
    {
     "key": "question",
     "type": "text",
     "optional": false,
     "hint": "the question",
     "length": "up to 4 words"
    },
    {
     "key": "a",
     "type": "text",
     "optional": false,
     "hint": "option A",
     "length": "up to 4 words"
    },
    {
     "key": "b",
     "type": "text",
     "optional": false,
     "hint": "option B",
     "length": "up to 4 words"
    },
    {
     "key": "c",
     "type": "text",
     "optional": false,
     "hint": "option C",
     "length": "up to 4 words"
    },
    {
     "key": "d",
     "type": "text",
     "optional": false,
     "hint": "option D",
     "length": "up to 4 words"
    },
    {
     "key": "answer",
     "type": "number",
     "optional": false,
     "hint": "correct option 1\u20134",
     "length": "number"
    }
   ],
   "options": "",
   "example": "00:05.00 --> 00:11.00 item edu.quiz \"Largest planet?|Earth|Jupiter|Saturn|Mars|2\"",
   "layers": "text \"{1}\" id=@ pos=0,-0.36 size=56 weight=800 in=fadeUp\n# options k = 0..3 in a 2\u00d72 grid: card + letter chip A\u2013D + text, staggered 0.1 s\n+0.2+0.1k card pos=\u00b10.23,-0.08/0.14 w=0.44 h=0.16 radius=0.2 grad=$surface in=popIn\n+0.3 shape pill pos=0,0.36 w=0.8 h=0.02 grad=$accent keys=\"w:+0.3=0.8,+2.0=0~ll\"     # timer\n+2.0 the correct card ({6}) \u2192 grad=$good + shape check; the others \u2192 opacity=0.4"
  },
  {
   "name": "edu.truefalse",
   "pack": "edu",
   "status": "final",
   "about": "A statement card with TRUE and FALSE; the answer gets stamped.",
   "use": "myths vs facts, quizzes, \"true or false?\" hooks",
   "slots": [
    {
     "key": "statement",
     "type": "text",
     "optional": false,
     "hint": "the statement",
     "length": "sentence"
    },
    {
     "key": "answer",
     "type": "text",
     "optional": false,
     "hint": "true or false",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:08.00 item edu.truefalse \"Goldfish have a 3-second memory|false\"",
   "layers": "card id=@ pos=0,-0.16 w=0.9 h=0.36 grad=$surface in=popIn   + text \"{1}\" w=0.8 size=48 weight=700 in=wordFade\n+0.6 shape pill pos=-0.2,0.2 w=0.34 h=0.12 color=$good in=popIn   + text \"TRUE\"\n+0.7 shape pill pos=0.2,0.2 w=0.34 h=0.12 color=#FF4D5E in=popIn   + text \"FALSE\"\n+1.4 the {2} pill scales up with a stamp ring; the other fades to 0.3"
  },
  {
   "name": "edu.fact",
   "pack": "edu",
   "status": "final",
   "about": "A numbered fact badge pops and the fact writes on beside a big quote rule.",
   "use": "fun facts, list videos (\"fact #3\"), did-you-know moments",
   "slots": [
    {
     "key": "number",
     "type": "number",
     "optional": false,
     "hint": "fact number",
     "length": "number"
    },
    {
     "key": "fact",
     "type": "text",
     "optional": false,
     "hint": "the fact",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:07.00 item edu.fact \"3|Octopuses have three hearts\"",
   "layers": "shape pill id=@ pos=0,-0.28 w=0.36 h=0.12 grad=$accent in=popIn   + text \"FACT #{1}\" size=40 weight=800 color=$accentInk\n+0.3 shape rect pos=-0.4,0.06 w=0.015 h=0.3 grad=$accent growTo=h,0,0.3,+0.3,+0.6\n+0.4 text \"{2}\" pos=-0.34,0.06 w=0.74 align=left size=64 weight=800 in=wordIn"
  },
  {
   "name": "edu.flowchart",
   "pack": "edu",
   "status": "final",
   "about": "Three boxes connect with drawn arrows, top to bottom, the last one highlighted.",
   "use": "processes, how systems work, input \u2192 process \u2192 output",
   "slots": [
    {
     "key": "step1",
     "type": "text",
     "optional": false,
     "hint": "first box",
     "length": "up to 4 words"
    },
    {
     "key": "step2",
     "type": "text",
     "optional": false,
     "hint": "middle box",
     "length": "up to 4 words"
    },
    {
     "key": "step3",
     "type": "text",
     "optional": false,
     "hint": "last box (highlighted)",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:04.00 --> 00:09.00 item edu.flowchart \"You search|Engine ranks pages|You see results\"",
   "layers": "# boxes k = 0..2 at y = -0.3 + 0.3k; arrows between them draw, then the next box pops\n+0.4k card pos=0,y w=0.66 h=0.16 radius=0.2 grad=$surface|$accent(k=2) in=popIn   + text \"{k+1}\" size=44 weight=700\n+0.25+0.4k shape arrow pos=0,y+0.15 w=0.08 rot=90 color=$soft in=slideD"
  },
  {
   "name": "edu.causeeffect",
   "pack": "edu",
   "status": "final",
   "about": "A cause card, a thick arrow draws across, the effect card lands on the other side.",
   "use": "cause and effect, \"because of this, that happens\", explainers",
   "slots": [
    {
     "key": "cause",
     "type": "text",
     "optional": false,
     "hint": "the cause",
     "length": "up to 4 words"
    },
    {
     "key": "effect",
     "type": "text",
     "optional": false,
     "hint": "the effect",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:07.00 item edu.causeeffect \"Less sleep|Worse memory\"",
   "layers": "card id=@ pos=-0.26,0 w=0.4 h=0.36 radius=0.12 grad=$surface in=popIn   + text \"CAUSE\" size=28 color=$soft + text \"{1}\" size=50 weight=800\n+0.4 shape arrow pos=0,0 w=0.14 color=$accent keys=\"scale:+0.4=0,+0.7=1\" emph=pulse\n+0.7 card pos=0.26,0 w=0.4 h=0.36 radius=0.12 grad=$accent in=popIn   + text \"EFFECT\" + text \"{2}\" color=$accentInk"
  },
  {
   "name": "edu.proscons",
   "pack": "edu",
   "status": "final",
   "about": "A two-column pros and cons card: ticks and crosses slide in row by row.",
   "use": "pros and cons, should-you-do-it videos, comparisons",
   "slots": [
    {
     "key": "pro1",
     "type": "text",
     "optional": false,
     "hint": "first pro",
     "length": "up to 4 words"
    },
    {
     "key": "pro2",
     "type": "text",
     "optional": false,
     "hint": "second pro",
     "length": "up to 4 words"
    },
    {
     "key": "con1",
     "type": "text",
     "optional": false,
     "hint": "first con",
     "length": "up to 4 words"
    },
    {
     "key": "con2",
     "type": "text",
     "optional": false,
     "hint": "second con",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:05.00 --> 00:10.00 item edu.proscons \"Saves time|Cheaper|Less flexible|Needs setup\"",
   "layers": "card id=@ w=0.94 h=0.66 grad=$surface in=popIn\n+0.1 text \"Pros\" pos=-0.23,-0.24 size=40 weight=800 color=$good   + text \"Cons\" pos=0.23,-0.24 color=#FF4D5E\n+0.2 shape line pos=0,0.02 h=0.5 thick=0.006 color=$bar growTo=h\u2026\n# rows k = 0,1: \"\u2713 {pro}\" left, \"\u2717 {con}\" right, staggered 0.25 s\n+0.3+0.25k text \"\u2713 {1|2}\" pos=-0.42,y align=left size=40 in=slideL     +0.4+0.25k text \"\u2717 {3|4}\" pos=0.04,y in=slideR"
  },
  {
   "name": "edu.globe",
   "pack": "edu",
   "status": "final",
   "about": "A drawn globe turns, a location dot pings on it and the place name appears.",
   "use": "geography, world facts, \"in this country\u2026\", global stats",
   "slots": [
    {
     "key": "place",
     "type": "text",
     "optional": false,
     "hint": "country or place",
     "length": "up to 4 words"
    }
   ],
   "options": "at=lat,lon",
   "example": "00:02.00 --> 00:06.00 item edu.globe \"Japan\"",
   "layers": "shape circle id=@ pos=0,-0.06 w=0.56 gradr=$surface stroke=3 strokeColor=$soft in=scaleIn\n+0 shape line parent=@ \u2026 latitude / longitude arcs color=$soft opacity=0.4 keys=\"x:\u2026slow turn\"\n+0.6 shape circle parent=@ pos=0.12,-0.06 w=0.04 color=$accent in=popIn   + ring ping keys=\"scale:0.4\u21922.4;opacity:1\u21920\" (repeat)\n+0.8 text \"{1}\" pos=0,0.36 size=60 weight=800 in=fadeUp"
  },
  {
   "name": "edu.year",
   "pack": "edu",
   "status": "final",
   "about": "The year rolls fast like a flip counter and stops; the event writes on below.",
   "use": "history, \"in 1969\u2026\", time travel through eras, on-this-day",
   "slots": [
    {
     "key": "year",
     "type": "number",
     "optional": false,
     "hint": "the year",
     "length": "number"
    },
    {
     "key": "event",
     "type": "text",
     "optional": false,
     "hint": "what happened",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:05.00 item edu.year \"1969|Humans land on the Moon\"",
   "layers": "text \"{1}\" id=@ pos=0,-0.08 size=220 weight=800 font=mono count={1}-120,{1},+0,+1.2 keys=\"scale:+1.2=1.1,+1.35=1\"\n+0 shape line pos=0,0.14 w=0.6 thick=0.012 grad=$accent growTo=w,0,0.6,+1.1,+1.4\n+1.2 text \"{2}\" pos=0,0.3 w=0.84 size=50 weight=700 in=wordFade"
  },
  {
   "name": "edu.ratio",
   "pack": "edu",
   "status": "final",
   "about": "Ten person icons appear; the right number of them light up: \"3 in 10\".",
   "use": "statistics, \"1 in 4 people\", survey facts, odds",
   "slots": [
    {
     "key": "n",
     "type": "number",
     "optional": false,
     "hint": "how many",
     "length": "number"
    },
    {
     "key": "total",
     "type": "number",
     "optional": false,
     "hint": "out of (up to 10)",
     "length": "number"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "who or what",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:07.00 item edu.ratio \"3|10|people skip breakfast\"",
   "layers": "# {2} drawn person icons in rows (max 10), 0.05 s apart; the first {1} turn $accent one by one\n+0.05k shape person pos=\u2026 w=0.1 color=$bar in=popIn\n+0.8+0.12k (k < {1}) color \u2192 $accent, keys=\"scale:1\u21921.2\u21921\"\n+0.4 text \"{1} in {2}\" pos=0,-0.32 size=110 weight=800   + text \"{3}\" pos=0,0.36 size=42 color=$soft in=fadeUp"
  },
  {
   "name": "edu.scale",
   "pack": "edu",
   "status": "final",
   "about": "A size comparison: a small circle and a huge one grow in turn with their labels and ratio.",
   "use": "how big is X vs Y, space, science scale, \"the Sun is 109\u00d7 wider\"",
   "slots": [
    {
     "key": "small",
     "type": "text",
     "optional": false,
     "hint": "small thing",
     "length": "up to 4 words"
    },
    {
     "key": "big",
     "type": "text",
     "optional": false,
     "hint": "big thing",
     "length": "up to 4 words"
    },
    {
     "key": "ratio",
     "type": "number",
     "optional": false,
     "hint": "how many times bigger",
     "length": "number"
    }
   ],
   "options": "",
   "example": "00:04.00 --> 00:08.00 item edu.scale \"Earth|Sun|109\"",
   "layers": "shape circle id=@ pos=-0.34,0.2 w=0.06 gradr=$good in=popIn   + text \"{1}\" below size=34\n+0.4 shape circle pos=0.4,0.2 w=1.1 gradr=$accent keys=\"scale:+0.4=0,+1.2=1~eb\"     # bleeds off the edge on purpose\n+1.0 text \"{3}\u00d7 wider\" pos=0,-0.3 size=96 weight=800 count=1,{3},+1.0,+1.6   + text \"{2}\" on the big circle"
  },
  {
   "name": "edu.book",
   "pack": "edu",
   "status": "final",
   "about": "A book opens, a page turns, and the title and author write on.",
   "use": "book summaries, reading lists, \"this book changed\u2026\", lessons from books",
   "slots": [
    {
     "key": "title",
     "type": "text",
     "optional": false,
     "hint": "book title",
     "length": "up to 4 words"
    },
    {
     "key": "author",
     "type": "text",
     "optional": true,
     "hint": "author",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:05.00 item edu.book \"Atomic Habits|James Clear\"",
   "layers": "card id=@ pos=-0.17,-0.08 w=0.34 h=0.46 radius=0.04 color=#FFFFFF   + card pos=0.17,\u2026 (two pages, the right one keys=\"rx:+0.3=-180,+0.9=0\" \u2014 page turn)\n+0 shape rect pos=0,-0.08 w=0.74 h=0.5 radius=0.06 grad=$accent   # cover behind the pages\n+0.4 shape line \u00d7 4 per page color=#C9CDD6 in=fadeUp     # text lines\n+0.9 text \"{1}\" pos=0,0.26 size=60 weight=800 font=playfair in=fadeUp   + text \"{2}\" size=38 color=$soft"
  },
  {
   "name": "edu.brain",
   "pack": "edu",
   "status": "final",
   "about": "A drawn brain: its regions light up one after another with a label.",
   "use": "psychology, learning, memory, \"what happens in your brain when\u2026\"",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:07.00 item edu.brain \"Dopamine hit\"",
   "layers": "shape brain id=@ pos=0,-0.08 w=0.6 color=$bar stroke=3 strokeColor=$soft in=popIn     # drawn outline, 4 lobes\n+0.4+0.2k lobe k fill \u2192 $accent with glow=0.5, then back to 0.6 opacity (a wave across the brain)\n+0.6 shape circle (spark) \u00d7 6 drift up from the lit lobes, opacity 1\u21920\n+1.0 text \"{1}\" pos=0,0.36 size=60 weight=800 in=popIn"
  },
  {
   "name": "edu.atom",
   "pack": "edu",
   "status": "final",
   "about": "An atom: the nucleus pulses while three electrons orbit on tilted rings.",
   "use": "science and chemistry, physics, \"at the atomic level\", tech explainers",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item edu.atom \"Atom\"",
   "layers": "shape circle id=@ w=0.14 gradr=$accent in=popIn emph=pulse      # nucleus\n+0 shape ring parent=@ w=0.7 h=0.24 thick=0.01 color=$soft rot=0|60|120 in=scaleIn     # 3 orbits\n+0.3 shape circle parent=@ w=0.035 color=$good keys=\"orbit along ring k, 1.6 s per turn\" (one per ring)\n+0.8 text \"{1}\" pos=0,0.4 size=56 weight=800 in=fadeUp"
  },
  {
   "name": "edu.dna",
   "pack": "edu",
   "status": "final",
   "about": "A DNA double helix twists in place, its rungs flashing in turn.",
   "use": "biology, genetics, health science, \"it's in your DNA\"",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:07.00 item edu.dna \"Genes\"",
   "layers": "# 12 rungs down the middle; each rung's two ends move on sine paths with a phase offset, so the strands twist\n+0 shape circle \u00d7 24 w=0.035 color=$accent|$good keys=\"x: sin(t + k\u00b70.5)\u00b70.18\" (looping)\n+0 shape line \u00d7 12 thick=0.008 color=$bar between each pair\n+0.8 text \"{1}\" pos=0,0.42 size=56 weight=800 in=fadeUp"
  },
  {
   "name": "edu.mindmap",
   "pack": "edu",
   "status": "final",
   "about": "A centre idea pops; four branches draw out to their topics one by one.",
   "use": "topic overviews, brainstorming, \"everything you need to know about X\"",
   "slots": [
    {
     "key": "centre",
     "type": "text",
     "optional": false,
     "hint": "main topic",
     "length": "up to 4 words"
    },
    {
     "key": "b1",
     "type": "text",
     "optional": false,
     "hint": "branch 1",
     "length": "up to 4 words"
    },
    {
     "key": "b2",
     "type": "text",
     "optional": false,
     "hint": "branch 2",
     "length": "up to 4 words"
    },
    {
     "key": "b3",
     "type": "text",
     "optional": false,
     "hint": "branch 3",
     "length": "up to 4 words"
    },
    {
     "key": "b4",
     "type": "text",
     "optional": true,
     "hint": "branch 4",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:05.00 --> 00:10.00 item edu.mindmap \"Investing|Stocks|Gold|Real estate|Bonds\"",
   "layers": "shape pill id=@ w=0.36 h=0.14 grad=$accent in=popIn   + text \"{1}\" size=48 weight=800 color=$accentInk\n# branches k = 0..3 to the four corners: a curved line draws, then a topic chip pops\n+0.3+0.2k shape line parent=@ curve=\u2026 thick=0.01 color=$soft keys=\"draw:\u2026\"\n+0.5+0.2k shape pill pos=\u00b10.3,\u00b10.3 w=0.32 h=0.11 grad=$surface in=popIn   + text \"{k+2}\" size=36 weight=700"
  },
  {
   "name": "edu.highlight",
   "pack": "edu",
   "status": "final",
   "about": "A sentence writes on, then a marker sweeps over the key words.",
   "use": "quotes from studies, key takeaways, \"the important part is\u2026\"",
   "slots": [
    {
     "key": "sentence",
     "type": "text",
     "optional": false,
     "hint": "start of the sentence",
     "length": "sentence"
    },
    {
     "key": "keyword",
     "type": "text",
     "optional": false,
     "hint": "the words to highlight",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:08.00 item edu.highlight \"Most millionaires are|self-made\"",
   "layers": "text \"{1} {2}\" id=@ w=0.84 size=72 weight=800 in=wordFade\n+1.0 shape rect behind \"{2}\" h=0.12 rot=-1.5 grad=$accent opacity=0.85 growTo=w,0,width({2}),+1.0,+1.4    # marker stroke, rough edges\n+1.0 \"{2}\" color \u2192 $accentInk"
  },
  {
   "name": "edu.keypoint",
   "pack": "edu",
   "status": "final",
   "about": "A sticky note swings in on a pin with the key point written on it.",
   "use": "key takeaways, \"remember this\", summaries, revision notes",
   "slots": [
    {
     "key": "point",
     "type": "text",
     "optional": false,
     "hint": "the key point",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:06.00 --> 00:10.00 item edu.keypoint \"Spend less than you earn\"",
   "layers": "card id=@ w=0.66 h=0.62 radius=0.02 grad=$accent rot=-4 shadow=0.4 keys=\"rot:+0=-25,+0.5=-4~eb\" anchor=top\n+0 shape circle parent=@ pos=0,-0.27 w=0.06 color=#FF4D5E in=popIn                  # pin\n+0.3 text \"KEY POINT\" parent=@ pos=0,-0.16 size=30 weight=800 color=$accentInk opacity=0.7\n+0.5 text \"{1}\" parent=@ pos=0,0.04 w=0.56 size=64 weight=800 color=$accentInk in=wordFade"
  },
  {
   "name": "edu.question",
   "pack": "edu",
   "status": "final",
   "about": "A big question word slams in with a scribbled underline; the full question follows.",
   "use": "explainer openers, hooks, \"Why does\u2026?\", section headers",
   "slots": [
    {
     "key": "word",
     "type": "text",
     "optional": false,
     "hint": "big word, e.g. WHY?",
     "length": "1 word"
    },
    {
     "key": "question",
     "type": "text",
     "optional": true,
     "hint": "the full question",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:00.50 --> 00:04.50 item edu.question \"WHY?|Why is the sky blue?\"",
   "layers": "text \"{1}\" id=@ pos=0,-0.12 size=240 font=anton grad=$accent in=scaleIn emph=shake\n+0.4 shape line pos=0,0.08 w=0.6 thick=0.02 color=$accent squiggle=1 keys=\"draw:+0.4=0,+0.8=1\"\n+0.7 text \"{2}\" pos=0,0.3 w=0.84 size=56 weight=800 in=wordFade"
  },
  {
   "name": "edu.checklist",
   "pack": "edu",
   "status": "final",
   "about": "\"What you'll learn\": three lines tick off one by one.",
   "use": "video intros, course outlines, agendas, \"in this video\"",
   "slots": [
    {
     "key": "title",
     "type": "text",
     "optional": false,
     "hint": "heading",
     "length": "up to 4 words"
    },
    {
     "key": "i1",
     "type": "text",
     "optional": false,
     "hint": "first line",
     "length": "up to 4 words"
    },
    {
     "key": "i2",
     "type": "text",
     "optional": false,
     "hint": "second line",
     "length": "up to 4 words"
    },
    {
     "key": "i3",
     "type": "text",
     "optional": true,
     "hint": "third line",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:06.00 item edu.checklist \"What you'll learn|How it works|Why it matters|What to do next\"",
   "layers": "card id=@ w=0.9 h=0.66 grad=$surface in=popIn\n+0.1 text \"{1}\" parent=@ pos=-0.36,-0.22 align=left size=44 weight=800 color=$accent in=fadeUp\n# rows k = 0..2: an empty box, then a $good tick pops into it 0.4 s later; text goes $soft \u2192 $ink\n+0.3+0.35k shape rect parent=@ pos=-0.34,y w=0.07 h=0.07 radius=0.2 stroke=3 strokeColor=$soft   + text \"{k+2}\" pos=-0.24,y align=left size=42 weight=700 in=fadeUp\n+0.6+0.35k shape check parent=@ pos=-0.34,y w=0.06 color=$good in=popIn"
  },
  {
   "name": "edu.grade",
   "pack": "edu",
   "status": "final",
   "about": "A test paper slides up, a red-pen grade circles in and the score counts.",
   "use": "results, exam tips, rating something like a teacher, \"I graded\u2026\"",
   "slots": [
    {
     "key": "score",
     "type": "number",
     "optional": false,
     "hint": "score out of 100",
     "length": "number"
    },
    {
     "key": "grade",
     "type": "text",
     "optional": false,
     "hint": "grade, e.g. A+",
     "length": "1 word"
    }
   ],
   "options": "",
   "example": "00:04.00 --> 00:08.00 item edu.grade \"92|A+\"",
   "layers": "card id=@ pos=0,0.04 w=0.62 h=0.74 radius=0.03 color=#FFFFFF in=slideU     # paper, grey lines\n+0.3 text \"{1}/100\" parent=@ pos=0.12,-0.28 size=56 weight=800 color=#C8102E count=0,{1},+0.3,+1.1\n+0.8 shape ring parent=@ pos=-0.12,-0.24 w=0.28 thick=0.03 color=#C8102E keys=\"draw:+0.8=0,+1.1=1\"   # red pen, fixed colour\n+1.0 text \"{2}\" parent=@ pos=-0.12,-0.24 size=90 font=marker color=#C8102E in=scaleIn"
  },
  {
   "name": "edu.chapter",
   "pack": "edu",
   "status": "final",
   "about": "A chapter card: the number counts in big, the title slides, progress dots fill.",
   "use": "chapter breaks in long videos, part 1 / part 2, section intros",
   "slots": [
    {
     "key": "n",
     "type": "number",
     "optional": false,
     "hint": "chapter number",
     "length": "number"
    },
    {
     "key": "title",
     "type": "text",
     "optional": false,
     "hint": "chapter title",
     "length": "up to 4 words"
    },
    {
     "key": "total",
     "type": "number",
     "optional": true,
     "hint": "total chapters",
     "length": "number"
    }
   ],
   "options": "",
   "example": "00:30.00 --> 00:34.00 item edu.chapter \"2|How compounding works|5\"",
   "layers": "text \"CHAPTER\" id=@ pos=0,-0.3 size=34 weight=800 color=$soft letterSpacing=0.3 in=fadeUp\n+0.1 text \"{1}\" pos=0,-0.1 size=200 font=anton grad=$accent in=scaleIn\n+0.4 text \"{2}\" pos=0,0.14 w=0.84 size=60 weight=800 in=slideL\n+0.7 shape circle \u00d7 {3} pos=\u2026,0.32 w=0.03 color=$bar|$accent(k # progress dots"
  },
  {
   "name": "saas.blurUp",
   "pack": "saas",
   "status": "final",
   "about": "Words rise from a soft blur one after another: the signature product-launch headline.",
   "use": "any headline or tagline, hero lines, feature names",
   "slots": [
    {
     "key": "text",
     "type": "text",
     "optional": false,
     "hint": "headline",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:04.00 item saas.blurUp \"Ship faster than ever\"",
   "layers": "text \"{1}\" id=@ size=96 weight=800 in=wordFade fx=\u2026per word: y +0.04\u21920, blur 0.4\u21920, opacity 0\u21921, 0.08 s stagger, ease spring"
  },
  {
   "name": "saas.maskReveal",
   "pack": "saas",
   "status": "final",
   "about": "Each line slides up from behind an invisible edge, crisp and fast.",
   "use": "two-line headlines, section titles, statements",
   "slots": [
    {
     "key": "line1",
     "type": "text",
     "optional": false,
     "hint": "first line",
     "length": "sentence"
    },
    {
     "key": "line2",
     "type": "text",
     "optional": true,
     "hint": "second line",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:04.00 item saas.maskReveal \"Built for teams|that move fast\"",
   "layers": "text \"{1}\" id=@ size=96 weight=800 mask=line keys=\"y:+0=0.12,+0.6=0~expo\"\n+0.12 text \"{2}\" pos=0,0.12 size=96 weight=800 mask=line keys=\"y:\u2026same\""
  },
  {
   "name": "saas.typeCursor",
   "pack": "saas",
   "status": "final",
   "about": "Text types in with a blinking caret, like a live product demo.",
   "use": "prompts, search terms, commands, \"type to start\" moments",
   "slots": [
    {
     "key": "text",
     "type": "text",
     "optional": false,
     "hint": "what gets typed",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:00.50 --> 00:04.00 item saas.typeCursor \"Generate a landing page\"",
   "layers": "text \"{1}\" id=@ size=72 weight=700 in=typeOn   + shape rect w=0.008 h=0.08 color=$accent emph=blink  # caret follows the last letter"
  },
  {
   "name": "saas.scramble",
   "pack": "saas",
   "status": "final",
   "about": "Characters scramble through random glyphs and lock into the word, left to right.",
   "use": "tech words, security, AI, data, product names, reveals",
   "slots": [
    {
     "key": "word",
     "type": "text",
     "optional": false,
     "hint": "word (short, caps work best)",
     "length": "1 word"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:04.00 item saas.scramble \"ENCRYPTED\"",
   "layers": "text \"{1}\" id=@ size=110 weight=800 font=mono fx=scramble:dur=1.0,stagger=0.06     # renderer swaps each glyph for random ones until its lock time"
  },
  {
   "name": "saas.wordSwap",
   "pack": "saas",
   "status": "final",
   "about": "A fixed line with one word that rolls through options in a slot.",
   "use": "\"Build faster / smarter / together\", feature lists, audiences",
   "slots": [
    {
     "key": "fixed",
     "type": "text",
     "optional": false,
     "hint": "the fixed word",
     "length": "1 word"
    },
    {
     "key": "w1",
     "type": "text",
     "optional": false,
     "hint": "swap word 1",
     "length": "1 word"
    },
    {
     "key": "w2",
     "type": "text",
     "optional": false,
     "hint": "swap word 2",
     "length": "1 word"
    },
    {
     "key": "w3",
     "type": "text",
     "optional": true,
     "hint": "swap word 3",
     "length": "1 word"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item saas.wordSwap \"Build|faster|smarter|together\"",
   "layers": "text \"{1}\" id=@ pos=-0.16,0 align=right size=96 weight=800\n+0 text slot pos=0.02,0 align=left size=96 weight=800 color=$accent mask=line     # {2}, {3}, {4} roll up in turn, 0.9 s each"
  },
  {
   "name": "saas.gradientSweep",
   "pack": "saas",
   "status": "final",
   "about": "A headline with a light gradient that sweeps across its letters.",
   "use": "hero titles, product names, \"introducing\u2026\", premium moments",
   "slots": [
    {
     "key": "text",
     "type": "text",
     "optional": false,
     "hint": "headline",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:04.00 item saas.gradientSweep \"Introducing Nova\"",
   "layers": "text \"{1}\" id=@ size=110 weight=800 grad=$ink,$accent,$ink fx=sweep:speed=0.8 in=blurIn"
  },
  {
   "name": "saas.highlightPill",
   "pack": "saas",
   "status": "final",
   "about": "A sentence fades in, then a soft pill grows behind the key word.",
   "use": "value props, \"the only tool you need\", emphasis",
   "slots": [
    {
     "key": "start",
     "type": "text",
     "optional": false,
     "hint": "start of the line",
     "length": "sentence"
    },
    {
     "key": "keyword",
     "type": "text",
     "optional": false,
     "hint": "highlighted words",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item saas.highlightPill \"The only tool|you need\"",
   "layers": "text \"{1} {2}\" id=@ size=84 weight=800 in=wordFade\n+0.7 shape pill behind \"{2}\" h=0.12 grad=$accent opacity=0.25 growTo=w,0,width({2}),+0.7,+1.1   + \"{2}\" color \u2192 $accent"
  },
  {
   "name": "saas.statNumber",
   "pack": "saas",
   "status": "final",
   "about": "A big number counts up with a suffix, a small label under it fades in.",
   "use": "any stat: users, uptime, speed, \"10\u00d7 faster\", \"99.9%\"",
   "slots": [
    {
     "key": "value",
     "type": "number",
     "optional": false,
     "hint": "the number",
     "length": "number"
    },
    {
     "key": "suffix",
     "type": "text",
     "optional": true,
     "hint": "suffix, e.g. % or \u00d7",
     "length": "up to 4 words"
    },
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "fmt=one|short|group|plain",
   "example": "00:02.00 --> 00:05.00 item saas.statNumber \"99.9|%|uptime\"",
   "layers": "text \"{1}{2}\" id=@ size=170 weight=800 count=0,{1},+0.1,+1.3,{fmt} fx=\u2026blur 0.3\u21920\n+0.5 text \"{3}\" pos=0,0.16 size=40 weight=600 color=$soft in=fadeUp"
  },
  {
   "name": "saas.splitSlide",
   "pack": "saas",
   "status": "final",
   "about": "Two lines glide in from opposite sides and meet in the middle.",
   "use": "contrasts (\"Less work. More done.\"), two-part slogans",
   "slots": [
    {
     "key": "line1",
     "type": "text",
     "optional": false,
     "hint": "first line",
     "length": "up to 4 words"
    },
    {
     "key": "line2",
     "type": "text",
     "optional": false,
     "hint": "second line (accent)",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:04.00 item saas.splitSlide \"Less work.|More done.\"",
   "layers": "text \"{1}\" id=@ pos=0,-0.07 size=100 weight=800 keys=\"x:+0=-0.5,+0.6=0~expo;opacity:+0=0,+0.3=1\"\n+0.1 text \"{2}\" pos=0,0.07 size=100 weight=800 color=$accent keys=\"x:+0.1=0.5,+0.7=0~expo\""
  },
  {
   "name": "saas.tracking",
   "pack": "saas",
   "status": "final",
   "about": "A word starts wide-spaced and faint, then tightens into place: the cinematic title.",
   "use": "brand words, chapter titles, quiet reveals, outros",
   "slots": [
    {
     "key": "word",
     "type": "text",
     "optional": false,
     "hint": "one word or short title",
     "length": "1 word"
    }
   ],
   "options": "",
   "example": "00:00.50 --> 00:04.00 item saas.tracking \"FOCUS\"",
   "layers": "text \"{1}\" id=@ size=120 weight=800 letterSpacing=0.6\u21920.08 keys over 1.6 s; opacity 0\u21921; blur 0.4\u21920"
  },
  {
   "name": "saas.underline",
   "pack": "saas",
   "status": "final",
   "about": "A word gets a clean underline that draws from left to right, then a soft glow.",
   "use": "emphasis on one word, CTAs, key terms",
   "slots": [
    {
     "key": "text",
     "type": "text",
     "optional": false,
     "hint": "text to underline",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:05.00 item saas.underline \"Automate everything\"",
   "layers": "text \"{1}\" id=@ size=90 weight=800 in=blurIn\n+0.5 shape pill pos=0,0.08 h=0.015 grad=$accent glow=0.5 growTo=w,0,width({1}),+0.5,+0.9"
  },
  {
   "name": "saas.triplet",
   "pack": "saas",
   "status": "final",
   "about": "Three short words land one beat apart: \"Fast. Simple. Secure.\"",
   "use": "three-word slogans, feature triplets, beats on music",
   "slots": [
    {
     "key": "w1",
     "type": "text",
     "optional": false,
     "hint": "first word",
     "length": "1 word"
    },
    {
     "key": "w2",
     "type": "text",
     "optional": false,
     "hint": "second word",
     "length": "1 word"
    },
    {
     "key": "w3",
     "type": "text",
     "optional": false,
     "hint": "third word (accent)",
     "length": "1 word"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:04.00 item saas.triplet \"Fast.|Simple.|Secure.\"",
   "layers": "# k = 0..2 stacked at y = -0.14 + 0.14k; each pops with spring at +0.35k; the last one in $accent\n+0.35k text \"{k+1}\" pos=0,y size=110 weight=800 keys=\"scale:0.6\u21921.06\u21921;opacity:0\u21921;blur:0.3\u21920\""
  },
  {
   "name": "saas.glassCard",
   "pack": "saas",
   "status": "final",
   "about": "A frosted glass card glides up with a soft shadow and floats gently, with a title and line.",
   "use": "feature cards, quotes, any boxed message, UI mockups",
   "slots": [
    {
     "key": "title",
     "type": "text",
     "optional": false,
     "hint": "card title",
     "length": "up to 4 words"
    },
    {
     "key": "body",
     "type": "text",
     "optional": true,
     "hint": "one line under it",
     "length": "sentence"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item saas.glassCard \"Real-time sync|Every change, everywhere, instantly.\"",
   "layers": "card id=@ w=0.84 h=0.46 radius=0.08 grad=$surface opacity=0.92 stroke=1 strokeColor=$ink@0.14 shadow=0.5 keys=\"y:+0=0.12,+0.7=0~spring\" emph=float\n+0.3 text \"{1}\" parent=@ pos=-0.34,-0.08 align=left size=60 weight=800 in=fadeUp\n+0.45 text \"{2}\" parent=@ pos=-0.34,0.06 w=0.68 align=left size=36 color=$soft in=fadeUp"
  },
  {
   "name": "saas.blob",
   "pack": "saas",
   "status": "final",
   "about": "A soft gradient blob morphs and drifts slowly: a living shape behind text or a product.",
   "use": "behind headlines or screenshots, ambient accents, intros",
   "slots": [],
   "options": "",
   "example": "00:00.00 --> 00:06.00 item saas.blob \"\" w=0.8",
   "layers": "shape blob id=@ w=0.8 gradr=$accent,$good blur=0.5 opacity=0.8 keys=\"morph: 4 shapes, 6 s loop;rot:+0=0,+6=40~ll\"   # no text; place it under other layers"
  },
  {
   "name": "saas.rings",
   "pack": "saas",
   "status": "final",
   "about": "Concentric rings ripple out from a glowing dot: live, broadcast, signal.",
   "use": "live status, notifications, \"listening\", radar, focus points",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label, e.g. Live",
     "length": "1 word"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:05.00 item saas.rings \"Live\"",
   "layers": "shape circle id=@ w=0.1 gradr=$accent glow=0.7 in=popIn\n+0 shape ring parent=@ w=0.1 thick=0.04 color=$accent keys=\"scale:1\u21926;opacity:0.8\u21920\" every 0.6 s (\u00d74)\n+0.4 text \"{1}\" pos=0,0.3 size=50 weight=800 in=fadeUp"
  },
  {
   "name": "saas.dotGrid",
   "pack": "saas",
   "status": "final",
   "about": "A grid of dots fades in as a ripple from the centre, then a highlight wave passes.",
   "use": "tech texture behind text, data, \"scale\", minimal intros",
   "slots": [],
   "options": "",
   "example": "00:00.00 --> 00:05.00 item saas.dotGrid \"\"",
   "layers": "# 9\u00d79 dots, w=0.012, color=$soft; each fades in at +dist\u00b70.05; then a $accent wave scales dots 1\u21922\u21921 outward\n+dist\u00b70.05 shape circle pos=grid w=0.012 color=$soft opacity=0.5 in=popIn"
  },
  {
   "name": "saas.orbit",
   "pack": "saas",
   "status": "final",
   "about": "Small icon tiles orbit a central app tile: the classic integrations shot.",
   "use": "integrations, \"works with everything\", ecosystems, connections",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:06.00 item saas.orbit \"Works with your stack\"",
   "layers": "card id=@ w=0.2 h=0.2 radius=0.3 grad=$accent glow=0.5 in=popIn\n+0 shape ring parent=@ w=0.62 thick=0.006 color=$soft opacity=0.4 in=scaleIn\n+0.2 card \u00d7 6 parent=@ w=0.1 h=0.1 radius=0.3 grad=$surface keys=\"orbit r=0.31, 8 s per turn\" in=popIn   + simple glyph shapes (circle, square, triangle\u2026)\n+0.8 text \"{1}\" pos=0,0.42 size=42 weight=700 in=fadeUp"
  },
  {
   "name": "saas.cursorClick",
   "pack": "saas",
   "status": "final",
   "about": "A cursor glides to a button, clicks with a ripple and the button presses.",
   "use": "CTAs, product demos, \"just one click\", sign-up moments",
   "slots": [
    {
     "key": "button",
     "type": "text",
     "optional": false,
     "hint": "button text",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:03.00 --> 00:06.00 item saas.cursorClick \"Get started\"",
   "layers": "shape pill id=@ w=0.5 h=0.14 grad=$accent in=popIn   + text \"{1}\" size=44 weight=800 color=$accentInk\n+0.2 shape cursor pos=0.36,0.3 w=0.08 color=$ink keys=\"x:+0.2=0.36,+0.9=0.08;y:+0.2=0.3,+0.9=0.03~expo\"\n+1.0 shape ring parent=@ pos=0.08,0.03 w=0.04 thick=0.1 color=$ink keys=\"scale:1\u21924;opacity:0.6\u21920\"   + @ keys=\"scale:+1.0=1,+1.08=0.94,+1.2=1\""
  },
  {
   "name": "saas.toggle",
   "pack": "saas",
   "status": "final",
   "about": "A toggle switch slides on, its track fills with colour and the label lights up.",
   "use": "settings, \"turn it on\", features enabled, before/after states",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": false,
     "hint": "setting name",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:05.00 item saas.toggle \"Dark mode\"",
   "layers": "card id=@ w=0.8 h=0.2 radius=0.3 grad=$surface in=popIn   + text \"{1}\" pos=-0.3,0 align=left size=48 weight=700\n+0.6 shape pill parent=@ pos=0.26,0 w=0.2 h=0.11 color=$bar \u2192 grad=$accent at +0.8\n+0.6 shape circle parent=@ pos=0.21\u21920.31,0 w=0.09 color=#FFFFFF keys=\"x:+0.6=0.21,+0.9=0.31~spring\""
  },
  {
   "name": "saas.toast",
   "pack": "saas",
   "status": "final",
   "about": "A notification toast slides down with an icon, a title and a time stamp.",
   "use": "alerts, \"payment received\", new message, success states",
   "slots": [
    {
     "key": "title",
     "type": "text",
     "optional": false,
     "hint": "notification title",
     "length": "up to 4 words"
    },
    {
     "key": "body",
     "type": "text",
     "optional": true,
     "hint": "detail line",
     "length": "sentence"
    },
    {
     "key": "time",
     "type": "text",
     "optional": true,
     "hint": "time, e.g. now",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:05.00 item saas.toast \"Payment received|\u20b912,400 from Asha|now\"",
   "layers": "card id=@ pos=0,-0.1 w=0.86 h=0.2 radius=0.2 grad=$surface stroke=1 shadow=0.5 keys=\"y:+0=-0.4,+0.6=-0.1~spring\"\n+0.2 shape circle parent=@ pos=-0.34,0 w=0.1 grad=$good in=popIn   + shape check color=$goodInk\n+0.3 text \"{1}\" parent=@ pos=-0.24,-0.03 align=left size=40 weight=800   + text \"{2}\" pos=\u2026,0.04 size=32 color=$soft\n+0.3 text \"{3}\" parent=@ pos=0.36,-0.03 align=right size=28 color=$soft"
  },
  {
   "name": "saas.sparkCard",
   "pack": "saas",
   "status": "final",
   "about": "A small metric card: the line draws, the area fills, the number and change chip pop.",
   "use": "dashboards, analytics, MRR, any metric with a trend",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": false,
     "hint": "metric name",
     "length": "up to 4 words"
    },
    {
     "key": "value",
     "type": "number",
     "optional": false,
     "hint": "value",
     "length": "number"
    },
    {
     "key": "change",
     "type": "number",
     "optional": true,
     "hint": "% change",
     "length": "number"
    }
   ],
   "options": "fmt=short|group cur=\u20b9|$",
   "example": "00:03.00 --> 00:07.00 item saas.sparkCard \"Revenue|48200|12\" fmt=short cur=$",
   "layers": "card id=@ w=0.84 h=0.52 radius=0.08 grad=$surface in=popIn\n+0.1 text \"{1}\" parent=@ pos=-0.34,-0.18 align=left size=34 color=$soft   + text \"{cur}{2}\" size=80 weight=800 count\u2026\n+0.3 shape pill parent=@ pos=0.3,-0.18 w=0.18 h=0.08 color=$good in=popIn   + text \"\u25b2 {3}%\"\n+0.3 shape line parent=@ pos=0,0.12 points=\u2026 smooth=1 thick=0.01 color=$accent keys=\"draw:\u2026\"   + area grad=$accent opacity=0.25"
  },
  {
   "name": "saas.stack",
   "pack": "saas",
   "status": "final",
   "about": "Three cards fan in and settle into a neat offset stack, the front one sharpest.",
   "use": "layers, versions, \"everything in one place\", multiple projects",
   "slots": [
    {
     "key": "label",
     "type": "text",
     "optional": true,
     "hint": "label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:05.00 item saas.stack \"All your projects\"",
   "layers": "# k = 2,1,0 back to front: card w=0.66 h=0.4 at y = -0.06k, scale 1-0.06k, opacity 1-0.25k, each slides up 0.12 s apart with spring\n+0.12(2-k) card pos=0,-0.06k w=0.66 h=0.4 radius=0.08 grad=$surface keys=\"y:+\u2026=0.3,+\u2026+0.6=-0.06k~spring\"\n+0.6 text \"{1}\" pos=0,0.38 size=48 weight=800 in=fadeUp"
  },
  {
   "name": "saas.badge",
   "pack": "saas",
   "status": "final",
   "about": "A small pill badge with a shimmering border and a dot: \"New\", \"Beta\", \"v2.0\".",
   "use": "above headlines, launch tags, version labels, announcements",
   "slots": [
    {
     "key": "text",
     "type": "text",
     "optional": false,
     "hint": "badge text, e.g. New \u00b7 AI assistant",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:01.00 --> 00:04.00 item saas.badge \"New \u00b7 AI assistant\"",
   "layers": "shape pill id=@ h=0.1 w=auto grad=$surface stroke=2 strokeColor=$accent fx=shimmer:border in=popIn\n+0 shape circle parent=@ pos=left w=0.025 color=$accent emph=pulse\n+0.1 text \"{1}\" parent=@ size=36 weight=700 in=fadeUp"
  },
  {
   "name": "saas.beam",
   "pack": "saas",
   "status": "final",
   "about": "Two nodes connect: a light beam travels along the line between them, then both glow.",
   "use": "connections, data flow, sync, \"from A to B\", API calls",
   "slots": [
    {
     "key": "from",
     "type": "text",
     "optional": false,
     "hint": "left node label",
     "length": "up to 4 words"
    },
    {
     "key": "to",
     "type": "text",
     "optional": false,
     "hint": "right node label",
     "length": "up to 4 words"
    }
   ],
   "options": "",
   "example": "00:02.00 --> 00:05.00 item saas.beam \"Your app|Cloud\"",
   "layers": "card id=@ pos=-0.32,0 w=0.22 h=0.22 radius=0.3 grad=$surface in=popIn   + text \"{1}\" below\n+0 card pos=0.32,0 w=0.22 h=0.22 radius=0.3 grad=$surface in=popIn   + text \"{2}\" below\n+0.2 shape line pos=0,0 w=0.42 thick=0.006 color=$bar\n+0.4 shape pill w=0.12 h=0.012 grad=$accent glow=0.8 keys=\"x:+0.4=-0.2,+1.0=0.2~ease\" (loops)\n+1.0 both nodes stroke \u2192 $accent, glow=0.5"
  }
 ]
}