fablecut 0.0.0-stage → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/CLAUDE.md +1198 -0
  2. package/LICENSE +21 -0
  3. package/README.md +571 -2
  4. package/analyze.js +289 -0
  5. package/app.js +13339 -0
  6. package/audio-fx.js +241 -0
  7. package/cli.js +31 -0
  8. package/color.js +1043 -0
  9. package/denoise.js +120 -0
  10. package/ducking.js +127 -0
  11. package/edit-ops.js +962 -0
  12. package/encode-profiles.js +302 -0
  13. package/encoding-profiles.json +68 -0
  14. package/export-jobs.js +163 -0
  15. package/favicon.svg +14 -0
  16. package/fx-worklet.js +162 -0
  17. package/icons/favicon-32.png +0 -0
  18. package/import-url.js +293 -0
  19. package/index.html +420 -0
  20. package/library/README.md +15 -0
  21. package/library/elements/.gitkeep +0 -0
  22. package/library/elements/bokeh-drift.svg +19 -0
  23. package/library/elements/light-leak-cool.svg +16 -0
  24. package/library/elements/light-leak-warm.svg +22 -0
  25. package/library/elements/vhs-scanlines.svg +18 -0
  26. package/library/elements/vignette-frame.svg +14 -0
  27. package/library/fonts/.gitkeep +0 -0
  28. package/library/fonts/Abril Fatface.woff2 +0 -0
  29. package/library/fonts/Anton.woff2 +0 -0
  30. package/library/fonts/Archivo Black.woff2 +0 -0
  31. package/library/fonts/Bangers.woff2 +0 -0
  32. package/library/fonts/Barlow.woff2 +0 -0
  33. package/library/fonts/Bebas Neue.woff2 +0 -0
  34. package/library/fonts/Bungee.woff2 +0 -0
  35. package/library/fonts/Caveat.woff2 +0 -0
  36. package/library/fonts/DM Sans.woff2 +0 -0
  37. package/library/fonts/Inter.woff2 +0 -0
  38. package/library/fonts/LICENSES.md +31 -0
  39. package/library/fonts/Lato.woff2 +0 -0
  40. package/library/fonts/Montserrat.woff2 +0 -0
  41. package/library/fonts/Oswald.woff2 +0 -0
  42. package/library/fonts/Pacifico.woff2 +0 -0
  43. package/library/fonts/Playfair Display.woff2 +0 -0
  44. package/library/fonts/Poppins.woff2 +0 -0
  45. package/library/fonts/Righteous.woff2 +0 -0
  46. package/library/fonts/Roboto.woff2 +0 -0
  47. package/library/fonts/Rubik.woff2 +0 -0
  48. package/library/fonts/Teko.woff2 +0 -0
  49. package/library/sfx/README.md +18 -0
  50. package/library/svg/ai-star.svg +17 -0
  51. package/library/svg/arrow-bounce.svg +18 -0
  52. package/library/svg/arrow-scribble.svg +13 -0
  53. package/library/svg/burst-lines.svg +30 -0
  54. package/library/svg/checkmark-success.svg +19 -0
  55. package/library/svg/confetti-burst.svg +23 -0
  56. package/library/svg/countdown-ring.svg +92 -0
  57. package/library/svg/equalizer.svg +18 -0
  58. package/library/svg/glow-orbs.svg +29 -0
  59. package/library/svg/heart-pop.svg +28 -0
  60. package/library/svg/loading-dots.svg +16 -0
  61. package/library/svg/location-pin.svg +25 -0
  62. package/library/svg/lower-third.svg +17 -0
  63. package/library/svg/new-badge.svg +18 -0
  64. package/library/svg/progress-bar.svg +16 -0
  65. package/library/svg/radial-pulse.svg +19 -0
  66. package/library/svg/rating-stars.svg +25 -0
  67. package/library/svg/rec-indicator.svg +41 -0
  68. package/library/svg/sparkles.svg +17 -0
  69. package/library/svg/spawning-hearts.svg +39 -0
  70. package/library/svg/speech-bubble.svg +23 -0
  71. package/library/svg/subscribe-bell.svg +29 -0
  72. package/library/svg/subscribe-pill.svg +22 -0
  73. package/library/svg/swipe-up.svg +46 -0
  74. package/library/svg/underline-swoosh.svg +15 -0
  75. package/loudness.js +135 -0
  76. package/mcp-server.js +1421 -0
  77. package/meter-worklet.js +229 -0
  78. package/package.json +45 -4
  79. package/paths.js +106 -0
  80. package/ruler-worker.js +120 -0
  81. package/server.js +775 -0
  82. package/style.css +3563 -0
@@ -0,0 +1,31 @@
1
+ # Font licenses
2
+
3
+ All fonts in this folder were downloaded from [Google Fonts](https://fonts.google.com)
4
+ and are redistributed under the **SIL Open Font License 1.1** (OFL). Each family's
5
+ license text and author information are available on its Google Fonts page.
6
+
7
+ | Family | Google Fonts page |
8
+ | --- | --- |
9
+ | Abril Fatface | https://fonts.google.com/specimen/Abril+Fatface |
10
+ | Anton | https://fonts.google.com/specimen/Anton |
11
+ | Archivo Black | https://fonts.google.com/specimen/Archivo+Black |
12
+ | Bangers | https://fonts.google.com/specimen/Bangers |
13
+ | Barlow | https://fonts.google.com/specimen/Barlow |
14
+ | Bebas Neue | https://fonts.google.com/specimen/Bebas+Neue |
15
+ | Bungee | https://fonts.google.com/specimen/Bungee |
16
+ | Caveat | https://fonts.google.com/specimen/Caveat |
17
+ | DM Sans | https://fonts.google.com/specimen/DM+Sans |
18
+ | Inter | https://fonts.google.com/specimen/Inter |
19
+ | Lato | https://fonts.google.com/specimen/Lato |
20
+ | Montserrat | https://fonts.google.com/specimen/Montserrat |
21
+ | Oswald | https://fonts.google.com/specimen/Oswald |
22
+ | Pacifico | https://fonts.google.com/specimen/Pacifico |
23
+ | Playfair Display | https://fonts.google.com/specimen/Playfair+Display |
24
+ | Poppins | https://fonts.google.com/specimen/Poppins |
25
+ | Righteous | https://fonts.google.com/specimen/Righteous |
26
+ | Roboto | https://fonts.google.com/specimen/Roboto |
27
+ | Rubik | https://fonts.google.com/specimen/Rubik |
28
+ | Teko | https://fonts.google.com/specimen/Teko |
29
+
30
+ The OFL permits free use, modification, and redistribution of the fonts, provided
31
+ they are not sold on their own. Full license: https://openfontlicense.org
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,18 @@
1
+ # Sound FX (bring your own)
2
+
3
+ This folder is **not** distributed with the repo — sound-effect sites usually
4
+ license their files for use *in your videos* but prohibit redistributing the
5
+ files themselves in a public collection, so FableCut doesn't ship any.
6
+
7
+ Drop `.mp3` / `.wav` files in here and they appear in the editor's **Sound FX**
8
+ tab instantly (the open UI live-refreshes). Subfolders are fine.
9
+
10
+ Good sources of free sounds:
11
+
12
+ - **freesound.org** — filter by the CC0 license for no-strings sounds
13
+ - **pixabay.com/sound-effects** — free for use in your projects
14
+ - **mixkit.co/free-sound-effects** — free for use in your projects
15
+
16
+ Handy starter set: a whoosh, an impact/boom, a pop, a camera shutter, a
17
+ typewriter tick, a riser, and a couple of UI clicks — most editing recipes in
18
+ CLAUDE.md reference sounds like these by role.
@@ -0,0 +1,17 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="800" height="450" viewBox="0 0 800 450">
2
+ <!-- FableCut animated SVG · loops · central AI star + three twinkling satellites (white) -->
3
+ <style>
4
+ .tw { transform-box: fill-box; transform-origin: center;
5
+ animation: twinkle 1.8s ease-in-out infinite; }
6
+ @keyframes twinkle {
7
+ 0%, 100% { transform: scale(0.15) rotate(0deg); opacity: 0; }
8
+ 50% { transform: scale(1) rotate(45deg); opacity: 1; }
9
+ }
10
+ </style>
11
+ <g fill="#ffffff">
12
+ <path d="M400 148 l26 74 74 26 -74 26 -26 74 -26 -74 -74 -26 74 -26z"/>
13
+ <path class="tw" style="--d:0s" d="M528 148 l8 20 20 8 -20 8 -8 20 -8 -20 -20 -8 20 -8z"/>
14
+ <path class="tw" style="--d:0.55s" d="M290 167 l7 18 18 7 -18 7 -7 18 -7 -18 -18 -7 18 -7z"/>
15
+ <path class="tw" style="--d:1.1s" d="M288 295 l9 22 22 9 -22 9 -9 22 -9 -22 -22 -9 22 -9z"/>
16
+ </g>
17
+ </svg>
@@ -0,0 +1,18 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="240" height="360" viewBox="0 0 240 360">
2
+ <!-- FableCut animated SVG · loops · downward chevrons bouncing (swipe-up / CTA / "look here") -->
3
+ <style>
4
+ .ch { transform-box: fill-box; transform-origin: center;
5
+ animation: fall 1.6s ease-in-out infinite; }
6
+ @keyframes fall {
7
+ 0% { transform: translateY(-30px); opacity: 0; }
8
+ 40% { opacity: 1; }
9
+ 70% { transform: translateY(20px); opacity: 1; }
10
+ 100% { transform: translateY(50px); opacity: 0; }
11
+ }
12
+ </style>
13
+ <g fill="none" stroke="#fff" stroke-width="20" stroke-linecap="round" stroke-linejoin="round">
14
+ <path class="ch" style="--d:0s" d="M60 70 L120 130 L180 70"/>
15
+ <path class="ch" style="--d:0.2s" d="M60 150 L120 210 L180 150"/>
16
+ <path class="ch" style="--d:0.4s" d="M60 230 L120 290 L180 230"/>
17
+ </g>
18
+ </svg>
@@ -0,0 +1,13 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 400 400">
2
+ <!-- FableCut animated SVG · one-shot (~0.7s) · hand-drawn arrow, points down-right.
3
+ Flip/rotate with clip props to point anywhere. -->
4
+ <style>
5
+ .s { stroke-dasharray: 520; stroke-dashoffset: 520; animation: draw 0.55s cubic-bezier(.3,.8,.3,1) both; }
6
+ .h { stroke-dasharray: 160; stroke-dashoffset: 160; animation: draw 0.25s ease-out both; }
7
+ @keyframes draw { to { stroke-dashoffset: 0; } }
8
+ </style>
9
+ <path class="s" style="--d:0s" d="M60 60 C 200 40, 320 140, 300 300" fill="none"
10
+ stroke="#ffd166" stroke-width="16" stroke-linecap="round"/>
11
+ <path class="h" style="--d:0.45s" d="M240 260 L 300 306 L 344 240" fill="none"
12
+ stroke="#ffd166" stroke-width="16" stroke-linecap="round" stroke-linejoin="round"/>
13
+ </svg>
@@ -0,0 +1,30 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="700" height="700" viewBox="0 0 700 700">
2
+ <!-- FableCut animated SVG · one-shot (~0.6s) · radial impact/speed lines. Align to a hard cut on V4. -->
3
+ <style>
4
+ .ln { stroke-dasharray: 170; stroke-dashoffset: 170;
5
+ animation: shoot 0.55s cubic-bezier(.2,.8,.3,1) both; }
6
+ @keyframes shoot {
7
+ 0% { stroke-dashoffset: 170; opacity: 1; }
8
+ 65% { stroke-dashoffset: 0; opacity: 1; }
9
+ 100% { stroke-dashoffset: -60; opacity: 0; }
10
+ }
11
+ .flash { transform-box: fill-box; transform-origin: center;
12
+ animation: fl 0.4s ease-out both; }
13
+ @keyframes fl { 0% { transform: scale(0.2); opacity: 0.9; } 100% { transform: scale(1.3); opacity: 0; } }
14
+ </style>
15
+ <circle class="flash" style="--d:0s" cx="350" cy="350" r="150" fill="#fff6d8"/>
16
+ <g stroke="#ffd166" stroke-width="16" stroke-linecap="round">
17
+ <line class="ln" style="--d:0s" x1="350.0" y1="200.0" x2="350.0" y2="40.0"/>
18
+ <line class="ln" style="--d:0.02s" x1="425.0" y1="220.1" x2="505.0" y2="81.5"/>
19
+ <line class="ln" style="--d:0.04s" x1="479.9" y1="275.0" x2="618.5" y2="195.0"/>
20
+ <line class="ln" style="--d:0.01s" x1="500.0" y1="350.0" x2="660.0" y2="350.0"/>
21
+ <line class="ln" style="--d:0.03s" x1="479.9" y1="425.0" x2="618.5" y2="505.0"/>
22
+ <line class="ln" style="--d:0.05s" x1="425.0" y1="479.9" x2="505.0" y2="618.5"/>
23
+ <line class="ln" style="--d:0s" x1="350.0" y1="500.0" x2="350.0" y2="660.0"/>
24
+ <line class="ln" style="--d:0.02s" x1="275.0" y1="479.9" x2="195.0" y2="618.5"/>
25
+ <line class="ln" style="--d:0.04s" x1="220.1" y1="425.0" x2="81.5" y2="505.0"/>
26
+ <line class="ln" style="--d:0.01s" x1="200.0" y1="350.0" x2="40.0" y2="350.0"/>
27
+ <line class="ln" style="--d:0.03s" x1="220.1" y1="275.0" x2="81.5" y2="195.0"/>
28
+ <line class="ln" style="--d:0.05s" x1="275.0" y1="220.1" x2="195.0" y2="81.5"/>
29
+ </g>
30
+ </svg>
@@ -0,0 +1,19 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 400 400">
2
+ <!-- FableCut animated SVG · one-shot (~1s) · success check: ring draws, badge pops, tick draws -->
3
+ <style>
4
+ .ring { fill: none; stroke: #22c55e; stroke-width: 14; stroke-linecap: round;
5
+ stroke-dasharray: 880; stroke-dashoffset: 880;
6
+ animation: draw 0.7s cubic-bezier(.3,.8,.3,1) both; }
7
+ .disc { transform-box: fill-box; transform-origin: center;
8
+ animation: pop 0.4s cubic-bezier(.34,1.56,.64,1) both; }
9
+ .tick { fill: none; stroke: #fff; stroke-width: 22; stroke-linecap: round; stroke-linejoin: round;
10
+ stroke-dasharray: 200; stroke-dashoffset: 200;
11
+ animation: draw2 0.4s cubic-bezier(.3,.8,.3,1) both; }
12
+ @keyframes draw { to { stroke-dashoffset: 0; } }
13
+ @keyframes draw2 { to { stroke-dashoffset: 0; } }
14
+ @keyframes pop { 0% { transform: scale(0); } 100% { transform: scale(1); } }
15
+ </style>
16
+ <circle class="ring" style="--d:0s" cx="200" cy="200" r="140"/>
17
+ <circle class="disc" style="--d:0.5s" cx="200" cy="200" r="120" fill="#22c55e"/>
18
+ <path class="tick" style="--d:0.7s" d="M140 205 l40 42 82 -92"/>
19
+ </svg>
@@ -0,0 +1,23 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="800" height="800" viewBox="0 0 800 800">
2
+ <!-- FableCut animated SVG · one-shot (~1.8s) · confetti explosion from center -->
3
+ <style>
4
+ .c { transform-box: fill-box; transform-origin: center; animation: fly 1.6s cubic-bezier(.15,.7,.4,1) both; }
5
+ @keyframes fly {
6
+ 0% { transform: translate(0,0) rotate(0turn) scale(0.4); opacity: 1; }
7
+ 70% { opacity: 1; }
8
+ 100% { transform: translate(var(--tx,0px), var(--ty,-300px)) rotate(2turn) scale(1); opacity: 0; }
9
+ }
10
+ </style>
11
+ <g>
12
+ <rect class="c" style="--d:0s; --tx:-260px; --ty:-200px" x="392" y="392" width="18" height="26" fill="#ff5d73"/>
13
+ <rect class="c" style="--d:0.04s; --tx:230px; --ty:-260px" x="392" y="392" width="16" height="24" fill="#ffd166"/>
14
+ <rect class="c" style="--d:0.08s; --tx:-140px; --ty:-320px" x="392" y="392" width="14" height="22" fill="#6ee7b7"/>
15
+ <rect class="c" style="--d:0.02s; --tx:300px; --ty:-120px" x="392" y="392" width="18" height="18" fill="#7b6cff"/>
16
+ <rect class="c" style="--d:0.06s; --tx:-320px; --ty:-60px" x="392" y="392" width="16" height="20" fill="#4f8cff"/>
17
+ <circle class="c" style="--d:0.03s; --tx:120px; --ty:-340px" cx="400" cy="400" r="10" fill="#ff9f43"/>
18
+ <circle class="c" style="--d:0.07s; --tx:-60px; --ty:-380px" cx="400" cy="400" r="8" fill="#ff5d73"/>
19
+ <circle class="c" style="--d:0.05s; --tx:260px; --ty:60px" cx="400" cy="400" r="9" fill="#6ee7b7"/>
20
+ <rect class="c" style="--d:0.09s; --tx:-230px; --ty:120px" x="392" y="392" width="14" height="14" fill="#ffd166"/>
21
+ <rect class="c" style="--d:0.01s; --tx:60px; --ty:200px" x="392" y="392" width="16" height="22" fill="#7b6cff"/>
22
+ </g>
23
+ </svg>
@@ -0,0 +1,92 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 400 400">
2
+ <!-- FableCut animated SVG · one-shot (~3s) · countdown ring 3 → 2 → 1
3
+ Useful for video intros, transitions, and "ready" cues. -->
4
+ <style>
5
+ /* Ring sweep — draws a circular arc over 1s per digit */
6
+ .ring {
7
+ fill: none;
8
+ stroke-width: 8;
9
+ stroke-linecap: round;
10
+ stroke-dasharray: 502.65;
11
+ stroke-dashoffset: 502.65;
12
+ transform-box: fill-box;
13
+ transform-origin: center;
14
+ animation: sweep 1s cubic-bezier(.4,0,.2,1) both;
15
+ animation-delay: var(--d, 0s);
16
+ }
17
+ @keyframes sweep {
18
+ 0% { stroke-dashoffset: 502.65; opacity: 0.3; }
19
+ 10% { opacity: 1; }
20
+ 100% { stroke-dashoffset: 0; opacity: 1; }
21
+ }
22
+
23
+ /* Digit pop-in */
24
+ .digit {
25
+ font-family: 'Helvetica Neue', Arial, sans-serif;
26
+ font-weight: 700;
27
+ font-size: 120px;
28
+ text-anchor: middle;
29
+ dominant-baseline: central;
30
+ transform-box: fill-box;
31
+ transform-origin: center;
32
+ animation: pop 0.4s cubic-bezier(.34,1.56,.64,1) both,
33
+ hideAtEnd 0.01s linear 1s both;
34
+ animation-delay: var(--d, 0s), calc(var(--d, 0s) + 0.99s);
35
+ opacity: 0;
36
+ }
37
+ @keyframes pop {
38
+ 0% { transform: scale(0.3); opacity: 0; }
39
+ 60% { transform: scale(1.1); opacity: 1; }
40
+ 100% { transform: scale(1); opacity: 1; }
41
+ }
42
+ @keyframes hideAtEnd {
43
+ to { opacity: 0; }
44
+ }
45
+
46
+ /* Digit fade-out at end of each second */
47
+ .digit-out {
48
+ animation: fadeOut 0.25s ease-in both;
49
+ }
50
+ @keyframes fadeOut {
51
+ 0% { opacity: 1; transform: scale(1); }
52
+ 100% { opacity: 0; transform: scale(0.8); }
53
+ }
54
+
55
+ /* Outer glow pulse */
56
+ .glow {
57
+ fill: none;
58
+ stroke-width: 2;
59
+ opacity: 0;
60
+ animation: glowPulse 1s ease-out both;
61
+ animation-delay: var(--d, 0s);
62
+ }
63
+ @keyframes glowPulse {
64
+ 0% { opacity: 0.6; stroke-width: 8; }
65
+ 100% { opacity: 0; stroke-width: 30; }
66
+ }
67
+ </style>
68
+
69
+ <!-- "3" group — 0s to 1s -->
70
+ <g>
71
+ <!-- glow -->
72
+ <circle class="glow" style="--d:0s" cx="200" cy="200" r="150" stroke="#ff6b6b"/>
73
+ <!-- ring -->
74
+ <circle class="ring" style="--d:0s" cx="200" cy="200" r="80" stroke="#ff6b6b"/>
75
+ <!-- digit -->
76
+ <text class="digit" style="--d:0s" x="200" y="200" fill="#ff6b6b">3</text>
77
+ </g>
78
+
79
+ <!-- "2" group — 1s to 2s -->
80
+ <g>
81
+ <circle class="glow" style="--d:1s" cx="200" cy="200" r="150" stroke="#ffd166"/>
82
+ <circle class="ring" style="--d:1s" cx="200" cy="200" r="80" stroke="#ffd166"/>
83
+ <text class="digit" style="--d:1s" x="200" y="200" fill="#ffd166">2</text>
84
+ </g>
85
+
86
+ <!-- "1" group — 2s to 3s -->
87
+ <g>
88
+ <circle class="glow" style="--d:2s" cx="200" cy="200" r="150" stroke="#6ee7b7"/>
89
+ <circle class="ring" style="--d:2s" cx="200" cy="200" r="80" stroke="#6ee7b7"/>
90
+ <text class="digit" style="--d:2s" x="200" y="200" fill="#6ee7b7">1</text>
91
+ </g>
92
+ </svg>
@@ -0,0 +1,18 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="400" height="300" viewBox="0 0 400 300">
2
+ <!-- FableCut animated SVG · loops · audio equalizer bars (music sections / podcast) -->
3
+ <style>
4
+ .bar { transform-box: fill-box; transform-origin: center bottom;
5
+ animation: eq 0.8s ease-in-out infinite; }
6
+ @keyframes eq {
7
+ 0%, 100% { transform: scaleY(0.25); }
8
+ 50% { transform: scaleY(1); }
9
+ }
10
+ </style>
11
+ <g fill="#4f8cff">
12
+ <rect class="bar" style="--d:0s" x="40" y="40" width="34" height="220" rx="8"/>
13
+ <rect class="bar" style="--d:0.25s" x="104" y="40" width="34" height="220" rx="8" fill="#7b6cff"/>
14
+ <rect class="bar" style="--d:0.5s" x="168" y="40" width="34" height="220" rx="8" fill="#6ee7b7"/>
15
+ <rect class="bar" style="--d:0.15s" x="232" y="40" width="34" height="220" rx="8" fill="#ffd166"/>
16
+ <rect class="bar" style="--d:0.4s" x="296" y="40" width="34" height="220" rx="8" fill="#ff5d73"/>
17
+ </g>
18
+ </svg>
@@ -0,0 +1,29 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1280" height="720" viewBox="0 0 1280 720">
2
+ <!-- FableCut animated SVG · loops · floating bokeh orbs. Use on V4 with props {blend:"screen", opacity:0.7, fit:"cover"} -->
3
+ <style>
4
+ .o { transform-box: fill-box; transform-origin: center;
5
+ animation: drift 9s ease-in-out infinite; }
6
+ @keyframes drift {
7
+ 0%, 100% { transform: translate(0,0) scale(1); opacity: 0.35; }
8
+ 50% { transform: translate(30px,-50px) scale(1.25); opacity: 0.85; }
9
+ }
10
+ .p { animation: puff 5s ease-in-out infinite; }
11
+ @keyframes puff { 0%,100% { opacity: 0.2; } 50% { opacity: 0.7; } }
12
+ </style>
13
+ <defs>
14
+ <radialGradient id="g" cx="50%" cy="50%" r="50%">
15
+ <stop offset="0%" stop-color="#fff" stop-opacity="0.95"/>
16
+ <stop offset="45%" stop-color="#bfa8ff" stop-opacity="0.6"/>
17
+ <stop offset="100%" stop-color="#7b6cff" stop-opacity="0"/>
18
+ </radialGradient>
19
+ </defs>
20
+ <g fill="url(#g)">
21
+ <circle class="o" style="--d:0s" cx="220" cy="180" r="120"/>
22
+ <circle class="o" style="--d:2.5s" cx="980" cy="230" r="160"/>
23
+ <circle class="o" style="--d:1.2s" cx="640" cy="520" r="100"/>
24
+ <circle class="o" style="--d:4s" cx="1120" cy="560" r="90"/>
25
+ <circle class="p" style="--d:3s" cx="430" cy="600" r="60"/>
26
+ <circle class="p" style="--d:1.8s" cx="820" cy="120" r="50"/>
27
+ <circle class="o" style="--d:5.5s" cx="120" cy="480" r="70"/>
28
+ </g>
29
+ </svg>
@@ -0,0 +1,28 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="500" height="600" viewBox="0 0 500 600">
2
+ <!-- FableCut animated SVG · loops · beating heart with floating hearts (like / reaction) -->
3
+ <style>
4
+ .beat { transform-box: fill-box; transform-origin: center;
5
+ animation: beat 1.2s ease-in-out infinite; }
6
+ @keyframes beat {
7
+ 0%, 100% { transform: scale(1); }
8
+ 15% { transform: scale(1.18); }
9
+ 30% { transform: scale(1); }
10
+ 45% { transform: scale(1.12); }
11
+ }
12
+ .float { transform-box: fill-box; transform-origin: center;
13
+ opacity: 0;
14
+ animation: rise 3s ease-in infinite both; }
15
+ @keyframes rise {
16
+ 0% { transform: translate(0,0) scale(0.3); opacity: 0; }
17
+ 22% { opacity: 0; }
18
+ 38% { opacity: 0.85; }
19
+ 100% { transform: translate(var(--tx,0px),-360px) scale(1); opacity: 0; }
20
+ }
21
+ </style>
22
+ <g fill="#ff4d6d">
23
+ <path class="beat" style="--d:0s" d="M250 470 C120 380 70 300 70 220 C70 150 120 110 175 110 C215 110 240 135 250 160 C260 135 285 110 325 110 C380 110 430 150 430 220 C430 300 380 380 250 470z"/>
24
+ <path class="float" style="--d:0.45s; --tx:-70px" d="M150 460 c-40 -28 -56 -52 -56 -78 c0 -22 16 -34 33 -34 c12 0 20 8 23 15 c3 -7 11 -15 23 -15 c17 0 33 12 33 34 c0 26 -16 50 -56 78z"/>
25
+ <path class="float" style="--d:1.45s; --tx:60px" d="M330 470 c-40 -28 -56 -52 -56 -78 c0 -22 16 -34 33 -34 c12 0 20 8 23 15 c3 -7 11 -15 23 -15 c17 0 33 12 33 34 c0 26 -16 50 -56 78z"/>
26
+ <path class="float" style="--d:2.45s; --tx:15px" d="M250 480 c-30 -21 -42 -39 -42 -58 c0 -16 12 -26 25 -26 c9 0 15 6 17 11 c2 -5 8 -11 17 -11 c13 0 25 10 25 26 c0 19 -12 37 -42 58z"/>
27
+ </g>
28
+ </svg>
@@ -0,0 +1,16 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="300" height="120" viewBox="0 0 300 120">
2
+ <!-- FableCut animated SVG · loops · three bouncing dots (loading / buffering) -->
3
+ <style>
4
+ .d { transform-box: fill-box; transform-origin: center;
5
+ animation: bob 0.9s cubic-bezier(.4,0,.6,1) infinite; }
6
+ @keyframes bob {
7
+ 0%, 80%, 100% { transform: translateY(0) scale(1); opacity: 0.5; }
8
+ 40% { transform: translateY(-26px) scale(1.15); opacity: 1; }
9
+ }
10
+ </style>
11
+ <g fill="#7b6cff">
12
+ <circle class="d" style="--d:0s" cx="80" cy="60" r="18"/>
13
+ <circle class="d" style="--d:0.15s" cx="150" cy="60" r="18"/>
14
+ <circle class="d" style="--d:0.3s" cx="220" cy="60" r="18"/>
15
+ </g>
16
+ </svg>
@@ -0,0 +1,25 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="400" height="500" viewBox="0 0 400 500">
2
+ <!-- FableCut animated SVG · pin drops in once (~0.9s), then ground ring pulses forever (map / travel) -->
3
+ <style>
4
+ .pin { transform-box: fill-box; transform-origin: center bottom;
5
+ animation: drop 0.8s cubic-bezier(.5,1.6,.5,1) both; }
6
+ @keyframes drop {
7
+ 0% { transform: translateY(-320px) scale(0.6); opacity: 0; }
8
+ 60% { opacity: 1; }
9
+ 80% { transform: translateY(0) scaleY(0.82) scaleX(1.12); }
10
+ 100% { transform: translateY(0) scale(1); opacity: 1; }
11
+ }
12
+ .ping { transform-box: fill-box; transform-origin: center;
13
+ animation: ping 1.8s ease-out infinite; }
14
+ @keyframes ping {
15
+ 0% { transform: scale(0.3); opacity: 0.8; }
16
+ 100% { transform: scale(1.6); opacity: 0; }
17
+ }
18
+ </style>
19
+ <ellipse class="ping" style="--d:0.9s" cx="200" cy="430" rx="90" ry="26" fill="none" stroke="#ff5d73" stroke-width="6"/>
20
+ <g class="pin" style="--d:0s">
21
+ <path d="M200 90 C120 90 70 150 70 220 C70 300 160 380 200 430 C240 380 330 300 330 220 C330 150 280 90 200 90z" fill="#ff5d73"/>
22
+ <circle cx="200" cy="215" r="46" fill="#fff"/>
23
+ <circle cx="200" cy="215" r="22" fill="#ff5d73"/>
24
+ </g>
25
+ </svg>
@@ -0,0 +1,17 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1280" height="720" viewBox="0 0 1280 720">
2
+ <!-- FableCut animated SVG · one-shot (~1.2s in) · lower-third bar.
3
+ Put your name/role with FableCut TEXT clips on top of this. -->
4
+ <style>
5
+ .bar { animation: slide 0.7s cubic-bezier(.2,.9,.25,1) both; }
6
+ .rule { animation: grow 0.6s cubic-bezier(.2,.9,.25,1) both; transform-origin: left center; }
7
+ .dot { transform-box: fill-box; transform-origin: center; animation: pop 0.45s cubic-bezier(.34,1.56,.64,1) both; }
8
+ @keyframes slide { from { transform: translateX(-110%); opacity: 0; } to { transform: translateX(0); opacity: 1; } }
9
+ @keyframes grow { from { transform: scaleX(0); } to { transform: scaleX(1); } }
10
+ @keyframes pop { from { transform: scale(0); } to { transform: scale(1); } }
11
+ </style>
12
+ <g>
13
+ <rect class="bar" style="--d:0s" x="60" y="540" width="520" height="86" rx="14" fill="#101018" opacity="0.85"/>
14
+ <rect class="rule" style="--d:0.35s" x="60" y="632" width="520" height="6" rx="3" fill="#7b6cff"/>
15
+ <circle class="dot" style="--d:0.55s" cx="96" cy="583" r="14" fill="#7b6cff"/>
16
+ </g>
17
+ </svg>
@@ -0,0 +1,18 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="360" height="360" viewBox="0 0 360 360">
2
+ <!-- FableCut animated SVG · badge pops + starburst spins forever (sticker / "NEW" / sale).
3
+ Add your own TEXT clip on top for the label. -->
4
+ <style>
5
+ .burst { transform-box: fill-box; transform-origin: center;
6
+ animation: spin 14s linear infinite; }
7
+ @keyframes spin { to { transform: rotate(360deg); } }
8
+ .in { transform-box: fill-box; transform-origin: center;
9
+ animation: pop 0.6s cubic-bezier(.34,1.56,.64,1) both; }
10
+ @keyframes pop { 0% { transform: scale(0) rotate(-40deg); } 100% { transform: scale(1) rotate(0deg); } }
11
+ </style>
12
+ <g class="in" style="--d:0s">
13
+ <path class="burst" style="--d:0s" fill="#ff5d73" d="M180 20
14
+ l26 34 40 -18 6 44 44 6 -18 40 34 26 -34 26 18 40 -44 6 -6 44 -40 -18 -26 34 -26 -34 -40 18 -6 -44 -44 -6 18 -40 -34 -26 34 -26 -18 -40 44 -6 6 -44 40 18z"/>
15
+ <circle cx="180" cy="180" r="96" fill="#ffd166"/>
16
+ <circle cx="180" cy="180" r="96" fill="none" stroke="#fff" stroke-width="5" stroke-dasharray="10 12"/>
17
+ </g>
18
+ </svg>
@@ -0,0 +1,16 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="800" height="120" viewBox="0 0 800 120">
2
+ <!-- FableCut animated SVG · one-shot (~2s) · progress bar fills left→right with a moving shine -->
3
+ <style>
4
+ .fill { transform-box: fill-box; transform-origin: left center;
5
+ animation: grow 2s cubic-bezier(.5,.05,.2,1) both; }
6
+ @keyframes grow { from { transform: scaleX(0); } to { transform: scaleX(1); } }
7
+ .knob { animation: run 2s cubic-bezier(.5,.05,.2,1) both; }
8
+ @keyframes run { 0% { transform: translateX(0); opacity: 0; } 8% { opacity: 1; } 100% { transform: translateX(720px); opacity: 1; } }
9
+ </style>
10
+ <rect x="40" y="46" width="720" height="28" rx="14" fill="#2a2a3a"/>
11
+ <clipPath id="track"><rect x="40" y="46" width="720" height="28" rx="14"/></clipPath>
12
+ <g clip-path="url(#track)">
13
+ <rect class="fill" style="--d:0s" x="40" y="46" width="720" height="28" fill="#7b6cff"/>
14
+ </g>
15
+ <circle class="knob" style="--d:0s" cx="40" cy="60" r="22" fill="#fff"/>
16
+ </svg>
@@ -0,0 +1,19 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="600" height="600" viewBox="0 0 600 600">
2
+ <!-- FableCut animated SVG · loops · concentric pulse rings (attention / notify / sonar) -->
3
+ <style>
4
+ .r { transform-box: fill-box; transform-origin: center;
5
+ animation: pulse 2.4s cubic-bezier(.2,.6,.3,1) infinite; }
6
+ @keyframes pulse {
7
+ 0% { transform: scale(0.1); opacity: 0; }
8
+ 15% { opacity: 0.9; }
9
+ 100% { transform: scale(1); opacity: 0; }
10
+ }
11
+ </style>
12
+ <g fill="none" stroke="#7b6cff" stroke-width="5">
13
+ <circle class="r" style="--d:0s" cx="300" cy="300" r="290"/>
14
+ <circle class="r" style="--d:0.6s" cx="300" cy="300" r="290"/>
15
+ <circle class="r" style="--d:1.2s" cx="300" cy="300" r="290"/>
16
+ <circle class="r" style="--d:1.8s" cx="300" cy="300" r="290"/>
17
+ </g>
18
+ <circle cx="300" cy="300" r="30" fill="#7b6cff"/>
19
+ </svg>
@@ -0,0 +1,25 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="800" height="240" viewBox="0 0 800 240">
2
+ <!-- FableCut animated SVG · one-shot (~1.1s) · 5 stars pop in sequence (review / rating) -->
3
+ <style>
4
+ .st { transform-box: fill-box; transform-origin: center;
5
+ animation: pop 0.5s cubic-bezier(.34,1.56,.64,1) both; }
6
+ @keyframes pop {
7
+ 0% { transform: scale(0) rotate(-60deg); opacity: 0; }
8
+ 100% { transform: scale(1) rotate(0deg); opacity: 1; }
9
+ }
10
+ .shine { transform-box: fill-box; transform-origin: center;
11
+ animation: gl 0.4s ease-out both; }
12
+ @keyframes gl { 0% { opacity: 0; transform: scale(0.3); } 60% { opacity: 0.9; } 100% { opacity: 0; transform: scale(1.4); } }
13
+ </style>
14
+ <g fill="#ffd166">
15
+ <path class="st" style="--d:0s" d="M110 40 l24 60 64 4 -50 42 17 62 -55 -36 -55 36 17 -62 -50 -42 64 -4z"/>
16
+ <path class="st" style="--d:0.12s" d="M255 40 l24 60 64 4 -50 42 17 62 -55 -36 -55 36 17 -62 -50 -42 64 -4z"/>
17
+ <path class="st" style="--d:0.24s" d="M400 40 l24 60 64 4 -50 42 17 62 -55 -36 -55 36 17 -62 -50 -42 64 -4z"/>
18
+ <path class="st" style="--d:0.36s" d="M545 40 l24 60 64 4 -50 42 17 62 -55 -36 -55 36 17 -62 -50 -42 64 -4z"/>
19
+ <path class="st" style="--d:0.48s" d="M690 40 l24 60 64 4 -50 42 17 62 -55 -36 -55 36 17 -62 -50 -42 64 -4z"/>
20
+ </g>
21
+ <g fill="#fffbe6">
22
+ <circle class="shine" style="--d:0.62s" cx="110" cy="120" r="30"/>
23
+ <circle class="shine" style="--d:0.74s" cx="700" cy="120" r="30"/>
24
+ </g>
25
+ </svg>
@@ -0,0 +1,41 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="200" height="80" viewBox="0 0 200 80">
2
+ <!-- FableCut animated SVG · loop · live-recording REC indicator
3
+ Pulsing red dot + "REC" label. Great for "live" overlays. -->
4
+ <style>
5
+ .dot {
6
+ fill: #ff3b30;
7
+ transform-box: fill-box;
8
+ transform-origin: center;
9
+ animation: pulse 1.2s ease-in-out infinite;
10
+ }
11
+ @keyframes pulse {
12
+ 0%, 100% { opacity: 1; transform: scale(1); }
13
+ 50% { opacity: 0.4; transform: scale(0.75); }
14
+ }
15
+ .ring {
16
+ fill: none;
17
+ stroke: #ff3b30;
18
+ stroke-width: 2;
19
+ transform-box: fill-box;
20
+ transform-origin: center;
21
+ animation: ringPulse 1.2s ease-out infinite;
22
+ }
23
+ @keyframes ringPulse {
24
+ 0% { opacity: 0.8; r: 14; }
25
+ 100% { opacity: 0; r: 28; }
26
+ }
27
+ .label {
28
+ font-family: 'Helvetica Neue', Arial, sans-serif;
29
+ font-weight: 700;
30
+ font-size: 28px;
31
+ fill: #ff3b30;
32
+ letter-spacing: 3px;
33
+ }
34
+ </style>
35
+ <!-- Pulsing ring -->
36
+ <circle class="ring" style="--d:0s" cx="30" cy="40" r="14"/>
37
+ <!-- Solid dot -->
38
+ <circle class="dot" style="--d:0s" cx="30" cy="40" r="10"/>
39
+ <!-- REC text -->
40
+ <text class="label" x="58" y="48">REC</text>
41
+ </svg>
@@ -0,0 +1,17 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="800" height="450" viewBox="0 0 800 450">
2
+ <!-- FableCut animated SVG · loops · twinkling sparkles overlay -->
3
+ <style>
4
+ .sp { transform-box: fill-box; transform-origin: center; animation: tw 1.6s ease-in-out infinite; }
5
+ @keyframes tw {
6
+ 0%, 100% { transform: scale(0.2) rotate(0deg); opacity: 0; }
7
+ 50% { transform: scale(1) rotate(90deg); opacity: 1; }
8
+ }
9
+ </style>
10
+ <g fill="#fff8d8">
11
+ <path class="sp" style="--d:0s" d="M120 90 l10 26 26 10 -26 10 -10 26 -10 -26 -26 -10 26 -10z"/>
12
+ <path class="sp" style="--d:0.35s" d="M640 70 l8 20 20 8 -20 8 -8 20 -8 -20 -20 -8 20 -8z"/>
13
+ <path class="sp" style="--d:0.7s" d="M420 180 l12 30 30 12 -30 12 -12 30 -12 -30 -30 -12 30 -12z"/>
14
+ <path class="sp" style="--d:1.05s" d="M200 320 l8 20 20 8 -20 8 -8 20 -8 -20 -20 -8 20 -8z"/>
15
+ <path class="sp" style="--d:1.3s" d="M660 330 l10 24 24 10 -24 10 -10 24 -10 -24 -24 -10 24 -10z"/>
16
+ </g>
17
+ </svg>