@topy-ai/maggie 0.8.11 → 0.8.13
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.
- package/README-zh-TW.md +1 -1
- package/README.md +2 -2
- package/bundled-references/ai-media-generation.md +88 -0
- package/bundled-references/captions-transcription.md +41 -0
- package/bundled-references/generative-visuals.md +94 -0
- package/bundled-references/image-recipes.md +89 -0
- package/bundled-references/web-animation-patterns.md +364 -0
- package/bundled-skills/catalog.json +4 -0
- package/bundled-skills/maggie-design/SKILL.md +7 -2
- package/bundled-skills/maggie-design-motion/SKILL.md +4 -1
- package/bundled-skills/maggie-image/SKILL.md +101 -0
- package/bundled-skills/maggie-landing-page/SKILL.md +5 -1
- package/bundled-skills/maggie-spirit/SKILL.md +4 -2
- package/bundled-skills/maggie-video/SKILL.md +3 -2
- package/bundled-tools/clis/maggie_image.py +221 -0
- package/package.json +1 -1
- package/references/ai-media-generation.md +88 -0
- package/references/captions-transcription.md +41 -0
- package/references/generative-visuals.md +94 -0
- package/references/image-recipes.md +89 -0
- package/references/web-animation-patterns.md +364 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
# Web / UI animation patterns
|
|
2
|
+
|
|
3
|
+
Engine-neutral motion vocabulary for marketing web pages, distilled from the leading
|
|
4
|
+
open-source animation libraries. We adopt **patterns and per-library guidance, not
|
|
5
|
+
code** — we rarely ship these libraries; we copy the technique (the eases, the
|
|
6
|
+
IntersectionObserver reveal, the spring config, the Lottie workflow). Feeds
|
|
7
|
+
`maggie-landing-page` (B7 motion + the mandatory tagline reveal) and
|
|
8
|
+
`maggie-design-motion` (its *website* context).
|
|
9
|
+
|
|
10
|
+
Rule of thumb: a marketing page needs **CSS transitions + IntersectionObserver +
|
|
11
|
+
one tiny helper** far more often than a 30KB animation engine. Reach for a library
|
|
12
|
+
only when the pattern below says so. Default is zero-dependency.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1. The libraries
|
|
17
|
+
|
|
18
|
+
Each entry: what it is · core API shape (real snippet) · license · when to reach for it.
|
|
19
|
+
|
|
20
|
+
### GSAP (greensock/GSAP) — v3.15
|
|
21
|
+
Framework-agnostic JS animation engine: tweens, timelines, eases, plugins
|
|
22
|
+
(ScrollTrigger, SplitText, MorphSVG, Flip, MotionPath). The gold standard for
|
|
23
|
+
sequenced, scroll-driven work.
|
|
24
|
+
```js
|
|
25
|
+
gsap.registerPlugin(ScrollTrigger);
|
|
26
|
+
const tl = gsap.timeline({ defaults: { ease: "power3.out", duration: 0.6 } });
|
|
27
|
+
tl.from(".hero h1", { y: 40, opacity: 0 })
|
|
28
|
+
.from(".hero p", { y: 24, opacity: 0 }, "-=0.3"); // overlap previous by 0.3s
|
|
29
|
+
gsap.from(".card", {
|
|
30
|
+
scrollTrigger: { trigger: ".card", start: "top 80%", once: true },
|
|
31
|
+
y: 32, opacity: 0, stagger: 0.08,
|
|
32
|
+
});
|
|
33
|
+
```
|
|
34
|
+
**License: custom "Standard no-charge license" (NOT MIT/OSI).** As of 2024 (Webflow)
|
|
35
|
+
GSAP including all former Club plugins is 100% free for commercial use, but it is a
|
|
36
|
+
proprietary license, not open source — flag it before bundling. CDN:
|
|
37
|
+
`cdn.jsdelivr.net/npm/gsap@3.15/dist/gsap.min.js`.
|
|
38
|
+
**Reach for it when:** a page needs a real timeline (chained, overlapping steps) or
|
|
39
|
+
scroll-scrubbed sequencing beyond a one-shot reveal. Overkill for simple fades.
|
|
40
|
+
|
|
41
|
+
### Motion / framer-motion (motiondivision/motion)
|
|
42
|
+
Hybrid engine: a tiny imperative `animate()` for vanilla JS plus declarative
|
|
43
|
+
`<motion.div>` for React/Vue. Uses the native WAAPI where possible (GPU, 120fps),
|
|
44
|
+
springs, `scroll()`, `inView()`, layout transitions.
|
|
45
|
+
```js
|
|
46
|
+
import { animate, inView, scroll, stagger } from "motion";
|
|
47
|
+
animate("#box", { x: 100, opacity: 1 }, { type: "spring", stiffness: 300, damping: 30 });
|
|
48
|
+
inView(".card", (el) => { animate(el, { opacity: 1, y: 0 }); }, { amount: 0.3 });
|
|
49
|
+
// React: <motion.div initial={{opacity:0,y:24}} whileInView={{opacity:1,y:0}} viewport={{once:true}}/>
|
|
50
|
+
```
|
|
51
|
+
**License: MIT** (core; a paid "Motion+" add-on exists but isn't required).
|
|
52
|
+
**Reach for it when:** the project is already React/Vue, or you want springs +
|
|
53
|
+
scroll + inView from one small MIT lib. `inView` is a clean IntersectionObserver
|
|
54
|
+
wrapper — our preferred engine when a dependency is acceptable.
|
|
55
|
+
|
|
56
|
+
### anime.js (juliangarnier/anime) — v4
|
|
57
|
+
Small, elegant timeline/stagger/easing lib. V4 is ESM tree-shakable.
|
|
58
|
+
```js
|
|
59
|
+
import { animate, stagger } from "animejs";
|
|
60
|
+
animate(".square", {
|
|
61
|
+
x: 320, rotate: { from: -180 }, duration: 1250,
|
|
62
|
+
delay: stagger(65, { from: "center" }), ease: "inOutQuint",
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
**License: MIT.** **Reach for it when:** you want expressive staggers/keyframes
|
|
66
|
+
lighter than GSAP and don't need ScrollTrigger-grade scroll control.
|
|
67
|
+
|
|
68
|
+
### lottie-web (airbnb/lottie-web)
|
|
69
|
+
Plays **Lottie JSON** (vector animations exported from After Effects via Bodymovin)
|
|
70
|
+
in the browser as SVG/canvas/HTML.
|
|
71
|
+
```js
|
|
72
|
+
const anim = lottie.loadAnimation({
|
|
73
|
+
container: el, renderer: "svg", loop: true, autoplay: true,
|
|
74
|
+
path: "hero.json", // or animationData: <obj>
|
|
75
|
+
});
|
|
76
|
+
anim.playSegments([0, 60], true); // play part of the timeline
|
|
77
|
+
anim.setSpeed(1); anim.pause();
|
|
78
|
+
```
|
|
79
|
+
**License: MIT.** **Reach for it when:** a designer delivers an AE/Lottie file and
|
|
80
|
+
you need a crisp, scalable, small looped illustration (see §2 Lottie workflow).
|
|
81
|
+
Default to `renderer: "svg"`; switch to `canvas` for heavy/many-layer files.
|
|
82
|
+
|
|
83
|
+
### rlottie (Samsung/rlottie)
|
|
84
|
+
Native (C++) Lottie renderer — the runtime behind Lottie on native/embedded (not a
|
|
85
|
+
web lib). Category O. **License: MIT** (mostly; some vendored parts differ, see
|
|
86
|
+
COPYING). **Reach for it when:** the same Lottie JSON must also play in a native app
|
|
87
|
+
(our Expo/RN surfaces) — same asset, native renderer. On web it's lottie-web.
|
|
88
|
+
|
|
89
|
+
### theatre.js (theatre-js/theatre)
|
|
90
|
+
In-browser motion-design **editor**: scrub a timeline, keyframe any JS object's
|
|
91
|
+
props, then play the saved sequence at runtime via `@theatre/core`.
|
|
92
|
+
```js
|
|
93
|
+
import { getProject } from "@theatre/core";
|
|
94
|
+
const sheet = getProject("Hero").sheet("Intro");
|
|
95
|
+
const obj = sheet.object("Logo", { x: 0, opacity: 0 });
|
|
96
|
+
obj.onValuesChange((v) => { el.style.transform = `translateX(${v.x}px)`; el.style.opacity = v.opacity; });
|
|
97
|
+
sheet.sequence.play({ iterationCount: 1 });
|
|
98
|
+
```
|
|
99
|
+
**License: Apache-2.0.** **Reach for it when:** a complex bespoke sequence is easier
|
|
100
|
+
to hand-author on a timeline than in code. Niche for marketing pages; mostly a
|
|
101
|
+
design-time tool. Note for `maggie-design-motion`, not landing pages.
|
|
102
|
+
|
|
103
|
+
### auto-animate (formkit/auto-animate)
|
|
104
|
+
Zero-config: one call and children added/removed/moved animate automatically.
|
|
105
|
+
```js
|
|
106
|
+
import autoAnimate from "@formkit/auto-animate";
|
|
107
|
+
autoAnimate(document.getElementById("list")); // React: const [ref] = useAutoAnimate()
|
|
108
|
+
```
|
|
109
|
+
**License: MIT.** **Reach for it when:** lists, filters, accordions, or reordering UI
|
|
110
|
+
need smooth transitions with no keyframes. Great low-effort polish for interactive
|
|
111
|
+
sections (pricing toggles, FAQ, filtered galleries).
|
|
112
|
+
|
|
113
|
+
### AOS (michalsnik/aos)
|
|
114
|
+
Animate-on-scroll via HTML data-attributes + a prebuilt CSS set.
|
|
115
|
+
```html
|
|
116
|
+
<div data-aos="fade-up" data-aos-delay="50" data-aos-duration="800"
|
|
117
|
+
data-aos-once="true" data-aos-anchor-placement="top-center"></div>
|
|
118
|
+
<script>AOS.init({ once: true, duration: 800, easing: "ease-out-cubic" });</script>
|
|
119
|
+
```
|
|
120
|
+
**License: MIT.** Uses IntersectionObserver internally. **Reach for it when:** a
|
|
121
|
+
no-JS-authoring team wants declarative scroll reveals fast. For our output we
|
|
122
|
+
usually hand-roll the same effect (§2) rather than ship AOS, but its attribute
|
|
123
|
+
vocabulary (`fade-up`, `once`, per-element delay/offset) is the pattern to copy.
|
|
124
|
+
|
|
125
|
+
### typed.js (mattboldt/typed.js)
|
|
126
|
+
Typewriter effect.
|
|
127
|
+
```js
|
|
128
|
+
const typed = new Typed("#el", { strings: ["First.", "& second."], typeSpeed: 50, backSpeed: 30, loop: true });
|
|
129
|
+
```
|
|
130
|
+
**License: GPL — flag it.** GNU GPL, not MIT. Do **not** bundle into proprietary
|
|
131
|
+
output; reimplement the ~20-line effect yourself (or use a permissive alt) if you
|
|
132
|
+
need typing. **Reach for the pattern when:** a hero rotates through phrases. Keep it
|
|
133
|
+
short, respect reduced-motion (render the final string statically).
|
|
134
|
+
|
|
135
|
+
### tsparticles (tsparticles/tsparticles)
|
|
136
|
+
Config-driven particle backgrounds/confetti.
|
|
137
|
+
```js
|
|
138
|
+
await tsParticles.load({ id: "tsparticles", options: {
|
|
139
|
+
background: { color: "#0d1117" },
|
|
140
|
+
particles: { number: { value: 60 }, move: { enable: true } },
|
|
141
|
+
}});
|
|
142
|
+
```
|
|
143
|
+
**License: MIT.** **Reach for it when:** a hero wants a subtle particle/constellation
|
|
144
|
+
backdrop or a celebratory confetti burst. Use sparingly — it's a performance and
|
|
145
|
+
taste liability; cap particle count, pause offscreen, disable on reduced-motion.
|
|
146
|
+
|
|
147
|
+
### rive (rive-app/rive-runtime)
|
|
148
|
+
Interactive vector animations driven by **state machines** (inputs → states), not
|
|
149
|
+
just linear playback. `rive-runtime` is the C++ core; on web you use `@rive-app/canvas`.
|
|
150
|
+
```js
|
|
151
|
+
import { Rive } from "@rive-app/canvas";
|
|
152
|
+
const r = new Rive({ src: "button.riv", canvas, autoplay: true,
|
|
153
|
+
stateMachines: "State Machine 1", onLoad: () => r.resizeDrawingSurfaceToCanvas() });
|
|
154
|
+
r.stateMachineInputs("State Machine 1").find(i => i.name === "hover").value = true;
|
|
155
|
+
```
|
|
156
|
+
**License: MIT.** **Reach for it when:** an element must *react* (hover/click/scroll
|
|
157
|
+
drives animation state) — interactive mascots, animated toggles. Heavier workflow
|
|
158
|
+
(needs the Rive editor); overkill for passive decoration — prefer Lottie for that.
|
|
159
|
+
|
|
160
|
+
### vivus (maxwellito/vivus)
|
|
161
|
+
Animates SVG stroke draw-on ("self-drawing" line art).
|
|
162
|
+
```js
|
|
163
|
+
new Vivus("my-svg", { type: "oneByOne", duration: 200, start: "inViewport" }, cb);
|
|
164
|
+
// type: delayed | sync | oneByOne | scenario ; start: inViewport | manual | autostart
|
|
165
|
+
```
|
|
166
|
+
**License: MIT.** **Reach for it when:** a logo/icon/diagram should draw itself in.
|
|
167
|
+
The same effect is achievable with CSS `stroke-dasharray`/`stroke-dashoffset` — use
|
|
168
|
+
that for one element, Vivus when orchestrating many paths.
|
|
169
|
+
|
|
170
|
+
### lenis (darkroomengineering/lenis)
|
|
171
|
+
Smooth-scroll normalizer (momentum/eased scrolling). Already referenced by
|
|
172
|
+
`maggie-clone`.
|
|
173
|
+
```js
|
|
174
|
+
const lenis = new Lenis({ autoRaf: true }); // or drive lenis.raf(t) in your own rAF
|
|
175
|
+
lenis.on("scroll", (e) => {/* sync scroll-linked effects */});
|
|
176
|
+
```
|
|
177
|
+
**License: MIT.** **Reach for it when:** the design calls for premium eased scrolling
|
|
178
|
+
and you pair it with scroll-triggered motion (commonly `lenis.raf` + GSAP
|
|
179
|
+
ScrollTrigger). Accessibility caveat: disable/reduce under `prefers-reduced-motion`;
|
|
180
|
+
never trap or override scroll in a way that breaks keyboard/anchor jumps.
|
|
181
|
+
|
|
182
|
+
### barba.js (barbajs/barba)
|
|
183
|
+
SPA-style page transitions over MPAs: intercepts navigation, animates the old
|
|
184
|
+
container out and the new one in (no full reload).
|
|
185
|
+
```js
|
|
186
|
+
barba.init({ transitions: [{
|
|
187
|
+
name: "fade",
|
|
188
|
+
leave: ({ current }) => gsap.to(current.container, { opacity: 0 }),
|
|
189
|
+
enter: ({ next }) => gsap.from(next.container, { opacity: 0 }),
|
|
190
|
+
}]});
|
|
191
|
+
// markup: <main data-barba="wrapper"><section data-barba="container" data-barba-namespace="home">
|
|
192
|
+
```
|
|
193
|
+
**License: MIT.** **Reach for it when:** a multi-page marketing site wants seamless
|
|
194
|
+
cross-page transitions. Needs care for SEO/analytics/scroll-restore; often more than
|
|
195
|
+
a landing page needs.
|
|
196
|
+
|
|
197
|
+
### react-spring (pmndrs/react-spring)
|
|
198
|
+
Spring-physics animation for React (hooks).
|
|
199
|
+
```js
|
|
200
|
+
import { animated, useSpring } from "@react-spring/web";
|
|
201
|
+
const styles = useSpring({ from: { opacity: 0, y: 24 }, to: { opacity: 1, y: 0 } });
|
|
202
|
+
return <animated.div style={styles}>…</animated.div>;
|
|
203
|
+
```
|
|
204
|
+
**License: MIT.** **Reach for it when:** a React project wants physics-based
|
|
205
|
+
(not duration-based) motion. For non-React, Motion's `spring` covers the same need.
|
|
206
|
+
|
|
207
|
+
### animate.css (animate-css/animate.css)
|
|
208
|
+
Prebuilt CSS keyframe classes (`animate__animated animate__fadeInUp`).
|
|
209
|
+
```html
|
|
210
|
+
<h1 class="animate__animated animate__fadeInUp">Hi</h1>
|
|
211
|
+
```
|
|
212
|
+
**License: Hippocratic License 2.1 — flag it (NOT MIT).** An ethical-source license
|
|
213
|
+
with use restrictions; not OSI-approved. Treat as a caution for commercial bundling;
|
|
214
|
+
the keyframe recipes (`fadeInUp`, durations, timing) are fine to **reimplement**
|
|
215
|
+
yourself. **Reach for the patterns when:** you want a quick named-entrance
|
|
216
|
+
vocabulary — but author your own keyframes to stay license-clean.
|
|
217
|
+
|
|
218
|
+
### Category O (offline / desktop, NOT web)
|
|
219
|
+
- **synfig** (synfig/synfig) — desktop 2D vector animation studio. **GPL-3.0.**
|
|
220
|
+
- **friction** (friction2d/friction) — desktop motion-graphics/vector animator.
|
|
221
|
+
**GPL-3.0.** Sparse docs.
|
|
222
|
+
Both are authoring tools, not runtimes. Note as offline/GPL; they can *produce*
|
|
223
|
+
assets (e.g. exported video/sequences) but nothing here ships to the web.
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## 2. Engine-neutral pattern set (what we actually adopt)
|
|
228
|
+
|
|
229
|
+
For each pattern: the technique, which libs embody it, and where it belongs
|
|
230
|
+
(**LP** = `maggie-landing-page`, **DM** = `maggie-design-motion` website context).
|
|
231
|
+
|
|
232
|
+
### Eased entrances — the good cubic-beziers
|
|
233
|
+
Default to expressive ease-out curves, never browser defaults (`ease`, `linear`,
|
|
234
|
+
`ease-in-out`). House base curve: `cubic-bezier(0.22, 1, 0.36, 1)` ("ease-out-quint",
|
|
235
|
+
~500ms for layout/position; GSAP's `power3/power4.out` equivalent). Hover
|
|
236
|
+
color/opacity 300ms (never < 200ms). Other good ones: `cubic-bezier(0.16,1,0.3,1)`
|
|
237
|
+
(ease-out-expo), `cubic-bezier(0.34,1.56,0.64,1)` (gentle back/overshoot).
|
|
238
|
+
Libs: GSAP eases, anime `inOut*`, Motion. **LP + DM.**
|
|
239
|
+
|
|
240
|
+
### Spring physics
|
|
241
|
+
Duration-less, physics-based motion — natural for interactive/hover and anything
|
|
242
|
+
that should feel tactile. Config shape is universal: `{ stiffness, damping, mass }`
|
|
243
|
+
(Motion: `type:"spring", stiffness:300, damping:30`; react-spring: `config.gentle`).
|
|
244
|
+
Libs: Motion `spring`, react-spring, GSAP (via plugins). **DM;** light touch on LP
|
|
245
|
+
(mostly micro-interactions).
|
|
246
|
+
|
|
247
|
+
### Scroll-reveal via IntersectionObserver — never scroll listeners
|
|
248
|
+
Elements rise ~32px and fade over 600–800ms, **once**, when they cross into view.
|
|
249
|
+
Always IntersectionObserver (or a lib that wraps it); never an unthrottled `scroll`
|
|
250
|
+
listener. Engine-neutral baseline (no dependency):
|
|
251
|
+
```js
|
|
252
|
+
const io = new IntersectionObserver((entries) => {
|
|
253
|
+
for (const e of entries) if (e.isIntersecting) {
|
|
254
|
+
e.target.classList.add("in"); // CSS transitions transform+opacity
|
|
255
|
+
io.unobserve(e.target); // once
|
|
256
|
+
}
|
|
257
|
+
}, { threshold: 0.2, rootMargin: "0px 0px -10% 0px" });
|
|
258
|
+
document.querySelectorAll("[data-reveal]").forEach((el) => io.observe(el));
|
|
259
|
+
```
|
|
260
|
+
Libs that embody it: Motion `inView`, AOS (`data-aos` + `once`), GSAP ScrollTrigger
|
|
261
|
+
(`once:true`). **LP (core) + DM.**
|
|
262
|
+
|
|
263
|
+
### Stagger
|
|
264
|
+
Sequence a group so items arrive one after another (reading order), stepped
|
|
265
|
+
~60–80ms, capped (~400ms total for menus). Libs: GSAP `stagger`, anime
|
|
266
|
+
`stagger(65,{from:"center"})`, Motion `stagger`. Hand-rolled: per-item
|
|
267
|
+
`transition-delay: calc(var(--i) * 60ms)`. **LP (menu entrance, card grids) + DM.**
|
|
268
|
+
|
|
269
|
+
### SVG draw-on
|
|
270
|
+
Line art draws itself via `stroke-dasharray`/`stroke-dashoffset` animated to 0.
|
|
271
|
+
Libs: Vivus (`type:"oneByOne"`), or pure CSS for a single path. **DM (logos,
|
|
272
|
+
diagrams);** occasional LP hero accent.
|
|
273
|
+
|
|
274
|
+
### Typing
|
|
275
|
+
Rotate/type phrases in a hero. Pattern: type → pause → delete → next, respect
|
|
276
|
+
reduced-motion by rendering the final string. Lib: typed.js (**GPL — reimplement**,
|
|
277
|
+
don't bundle). **LP (hero headline variants) + DM.**
|
|
278
|
+
|
|
279
|
+
### Page transitions + smooth scroll
|
|
280
|
+
Cross-page: animate container out/in instead of a hard reload (barba.js, or a
|
|
281
|
+
framework's view-transitions). Smooth scroll: eased momentum scrolling (lenis),
|
|
282
|
+
commonly paired with scroll-triggered motion (`lenis.raf` → GSAP ScrollTrigger).
|
|
283
|
+
**DM / full-site builds;** a single landing page rarely needs barba. Lenis already
|
|
284
|
+
used by `maggie-clone`.
|
|
285
|
+
|
|
286
|
+
### Particles
|
|
287
|
+
Subtle generative backdrop or confetti. Lib: tsparticles (config: `particles.number`,
|
|
288
|
+
`move`, `background`). Use sparingly; cap count, pause offscreen, kill on
|
|
289
|
+
reduced-motion. **LP hero (optional accent) + DM.**
|
|
290
|
+
|
|
291
|
+
### The Lottie workflow
|
|
292
|
+
Pipeline: **design in After Effects → export with Bodymovin → `.json` →** play with
|
|
293
|
+
**lottie-web** on web / **rlottie** on native (same JSON asset, two renderers).
|
|
294
|
+
```js
|
|
295
|
+
lottie.loadAnimation({ container: el, renderer: "svg", loop: true, autoplay: true, path: "hero.json" });
|
|
296
|
+
```
|
|
297
|
+
**When to use Lottie vs code vs looped video:**
|
|
298
|
+
- **Lottie** — designer-authored vector illustration/icon motion; scalable, crisp,
|
|
299
|
+
small, loopable, recolorable, interactive (segments/speed). The default for
|
|
300
|
+
"animated illustration." Prefer `renderer:"svg"`; use `canvas` for heavy files.
|
|
301
|
+
- **Code (CSS/GSAP/Motion)** — UI motion tied to the DOM: entrances, hovers,
|
|
302
|
+
scroll reveals, state changes. Anything that must respond to layout/interaction.
|
|
303
|
+
- **Looped video (mp4/webm)** — photographic/complex/3D content that isn't vector
|
|
304
|
+
and doesn't need interaction or recolor. Heaviest payload; provide a poster and
|
|
305
|
+
`prefers-reduced-motion` fallback. (See `references/programmatic-video.md`.)
|
|
306
|
+
Libs: lottie-web (web), rlottie (native). **DM (primary);** LP for a hero/spot
|
|
307
|
+
illustration when a designer supplies the JSON.
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## 3. Performance & accessibility rules (shared by all of them)
|
|
312
|
+
|
|
313
|
+
- **Animate only `transform` and `opacity`.** Never `top`/`left`/`width`/`height`/
|
|
314
|
+
`margin` (they trigger layout/paint and jank). Use `transform: translate/scale`
|
|
315
|
+
for position and size. Prefer the compositor; add `will-change` only on the
|
|
316
|
+
element about to animate, and remove it after.
|
|
317
|
+
- **No scroll/resize listeners for reveal.** Use IntersectionObserver for visibility
|
|
318
|
+
and `requestAnimationFrame` for any per-frame work; throttle/debounce the rest.
|
|
319
|
+
Never run animation logic directly in a `scroll` handler.
|
|
320
|
+
- **Respect `prefers-reduced-motion`.** Replace movement with a plain opacity change
|
|
321
|
+
(or show the final state instantly). Gate every nontrivial effect:
|
|
322
|
+
```css
|
|
323
|
+
@media (prefers-reduced-motion: reduce) {
|
|
324
|
+
*, *::before, *::after { animation-duration:.01ms!important;
|
|
325
|
+
animation-iteration-count:1!important; transition-duration:.01ms!important; }
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
In JS, branch on `matchMedia("(prefers-reduced-motion: reduce)").matches` before
|
|
329
|
+
typing, particles, smooth-scroll, or autoplay loops.
|
|
330
|
+
- **Reveal once; don't re-fire** on scroll-back (`once:true` / `unobserve`).
|
|
331
|
+
- **Pause offscreen / on hidden tab** (Lottie, particles, video): check
|
|
332
|
+
`document.hidden` / IntersectionObserver and stop rAF to save battery/CPU.
|
|
333
|
+
- **Keep durations honest:** entrances 300–800ms; hovers 200–300ms; never block
|
|
334
|
+
interaction or delay content paint behind an animation. Don't animate above the
|
|
335
|
+
fold in a way that hides LCP text.
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## License quick-reference
|
|
340
|
+
|
|
341
|
+
| Library | License | Note |
|
|
342
|
+
|---|---|---|
|
|
343
|
+
| GSAP | Custom "no-charge" | **Not OSI/MIT.** Free (incl. all plugins) but proprietary — flag before bundling. |
|
|
344
|
+
| Motion / framer-motion | MIT | Paid Motion+ add-on optional, not required. |
|
|
345
|
+
| anime.js | MIT | |
|
|
346
|
+
| lottie-web | MIT | |
|
|
347
|
+
| rlottie | MIT | Some vendored parts differ (see COPYING). |
|
|
348
|
+
| theatre.js | Apache-2.0 | |
|
|
349
|
+
| auto-animate | MIT | |
|
|
350
|
+
| AOS | MIT | |
|
|
351
|
+
| typed.js | **GPL** | **Flag — don't bundle in proprietary output; reimplement.** |
|
|
352
|
+
| tsparticles | MIT | |
|
|
353
|
+
| rive-runtime | MIT | Web runtime is `@rive-app/canvas`. |
|
|
354
|
+
| vivus | MIT | |
|
|
355
|
+
| lenis | MIT | |
|
|
356
|
+
| barba.js | MIT | |
|
|
357
|
+
| react-spring | MIT | |
|
|
358
|
+
| animate.css | **Hippocratic 2.1** | **Flag — ethical-source, not OSI. Reimplement keyframes.** |
|
|
359
|
+
| synfig / friction | GPL-3.0 | Desktop authoring tools (category O), not web runtimes. |
|
|
360
|
+
|
|
361
|
+
Most are MIT and safe to reference/learn from freely. The four to flag: **GSAP**
|
|
362
|
+
(proprietary no-charge), **typed.js** (GPL), **animate.css** (Hippocratic 2.1), and
|
|
363
|
+
**synfig/friction** (GPL desktop tools). For the flagged ones we adopt the *pattern*
|
|
364
|
+
and author our own code.
|
|
@@ -66,6 +66,10 @@
|
|
|
66
66
|
"name": "maggie-fundraising",
|
|
67
67
|
"description": "Fundraising and investor relations for a founder - draft a pitch deck and narrative, assemble a data room, write investor updates, keep cap-table and round hygiene, and prepare SEIS/EIS materials. Use when the user asks to prepare to raise, build a deck or data room, write an investor update, or organise round documents. Factual only; not securities, investment, legal, or tax advice. Pairs with maggie-finance and the TOPY/CEO tools."
|
|
68
68
|
},
|
|
69
|
+
{
|
|
70
|
+
"name": "maggie-image",
|
|
71
|
+
"description": "Process marketing images - resize and fit to channel/OG sizes, convert to WebP/AVIF, make favicon and OG-image sets, strip metadata, compress, optimize and render SVG, and build contact-sheet montages. A recipe generator over ImageMagick (primary) with dedicated tools (svgo/resvg/cwebp/avifenc/pngquant) used when installed. Use when the user wants to resize, convert, optimize, favicon, watermark, or batch-process images for a site or social post."
|
|
72
|
+
},
|
|
69
73
|
{
|
|
70
74
|
"name": "maggie-landing-page",
|
|
71
75
|
"description": "Build a high-converting landing page - intake, page structure, layout selection, conversion copy, SEO/AEO, plus a visual-system discipline (typography, spacing, radius, backgrounds, hero, icons, motion) whose specific values are defaults the project's DESIGN.md overrides. Use when building, editing, styling, or writing copy for a landing page, marketing page, or a page section meant to convert. Designs the page; maggie-design produces and validates it."
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: maggie-design
|
|
3
3
|
description: Design authorized interior pages, review rendered responsive layouts, explicitly rebrand a packaged homepage/template, or audit and upgrade an existing site/app in place (fix generic AI-design patterns, weak states, and sloppy code). Use rebrand only with a named source brand and target brand. Use the redesign audit whenever the user wants to improve, polish, upgrade, refine, audit, or redesign an existing page, even when they just say it looks cheap, generic, or AI-made.
|
|
4
4
|
metadata:
|
|
5
|
-
version: 1.7.
|
|
5
|
+
version: 1.7.1
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Maggie Design
|
|
@@ -21,7 +21,12 @@ Concrete values come from
|
|
|
21
21
|
overridden by the project's own DESIGN.md/tokens. For building a new landing page
|
|
22
22
|
from scratch use [`maggie-landing-page`](../maggie-landing-page/SKILL.md); for
|
|
23
23
|
turning a design into an animated showcase use
|
|
24
|
-
[`maggie-design-motion`](../maggie-design-motion/SKILL.md).
|
|
24
|
+
[`maggie-design-motion`](../maggie-design-motion/SKILL.md). For page visuals and
|
|
25
|
+
assets: process images with [`maggie-image`](../maggie-image/SKILL.md)
|
|
26
|
+
([recipes](../../references/image-recipes.md)), add motion from
|
|
27
|
+
[web animation patterns](../../references/web-animation-patterns.md), and generate
|
|
28
|
+
code-drawn backgrounds/3D/stylized art from
|
|
29
|
+
[generative visuals](../../references/generative-visuals.md).
|
|
25
30
|
|
|
26
31
|
## In-place route evidence
|
|
27
32
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: maggie-design-motion
|
|
3
3
|
description: Turn a static design (a Figma frame, screenshot, dashboard, card set, app screen, or a UI on a photo) into a pixel-exact HTML replica that loads from an empty state, then has every visual act out what it does in a seamless loop, and export an MP4 plus GIFs. Use when asked to animate a design, a Figma link, a screenshot, UI cards, a dashboard or hero image, or to make a showcase loop, motion mockup, or a video/GIF of a design. Also for bento/feature cards on a landing page.
|
|
4
4
|
metadata:
|
|
5
|
-
version: 0.1.
|
|
5
|
+
version: 0.1.2
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Maggie Design Motion
|
|
@@ -287,6 +287,9 @@ size/dimensions/fps/duration; anything not reproduced exactly, named plainly.
|
|
|
287
287
|
- `maggie-spirit` - deterministic brand sprites/avatars (a different motion job).
|
|
288
288
|
- `maggie-landing-page` / `maggie-design` - where website motion lives and is
|
|
289
289
|
produced.
|
|
290
|
+
- [web animation patterns](../../references/web-animation-patterns.md) - the motion
|
|
291
|
+
vocabulary for the website context; [generative visuals](../../references/generative-visuals.md)
|
|
292
|
+
- code-drawn visuals you capture through this skill's Part C.
|
|
290
293
|
|
|
291
294
|
# Credits
|
|
292
295
|
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: maggie-image
|
|
3
|
+
description: Process marketing images - resize and fit to channel/OG sizes, convert to WebP/AVIF, make favicon and OG-image sets, strip metadata, compress, optimize and render SVG, and build contact-sheet montages. A recipe generator over ImageMagick (primary) with dedicated tools (svgo/resvg/cwebp/avifenc/pngquant) used when installed. Use when the user wants to resize, convert, optimize, favicon, watermark, or batch-process images for a site or social post.
|
|
4
|
+
metadata:
|
|
5
|
+
version: 0.1.1
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Maggie Image
|
|
9
|
+
|
|
10
|
+
The image-asset lane: turn a source image into the correctly-sized, correctly-
|
|
11
|
+
formatted, metadata-clean asset a site or social post needs. It is a **recipe
|
|
12
|
+
generator** like `maggie-video` - it prints the exact command (reviewable/loggable)
|
|
13
|
+
and runs it with `--run` when the tool is on PATH. It **invokes binaries at arm's
|
|
14
|
+
length** (no GPL code vendored).
|
|
15
|
+
|
|
16
|
+
This is image *processing*. For generating *new* visuals from a prompt see
|
|
17
|
+
`maggie media generate` and the [AI media generation](../../references/ai-media-generation.md)
|
|
18
|
+
plan (self-hosted models - licensing and cost gated); for brand marks/avatars see
|
|
19
|
+
`maggie-spirit`; for generative/3D/stylized visuals see
|
|
20
|
+
[generative visuals](../../references/generative-visuals.md). Responsive-variant
|
|
21
|
+
manifests are `maggie_images.py` (a different concern).
|
|
22
|
+
|
|
23
|
+
Follow the [Maggie Memory Hook](../../references/memory-hook.md) at invocation and
|
|
24
|
+
completion.
|
|
25
|
+
|
|
26
|
+
## When to use
|
|
27
|
+
|
|
28
|
+
- Resize/crop an image to a channel or OG size (1200x630, 1080x1080, 9:16, ...).
|
|
29
|
+
- Convert to WebP/AVIF for faster pages.
|
|
30
|
+
- Make a favicon set and OG/social images.
|
|
31
|
+
- Strip EXIF/GPS metadata, compress, or optimize before publishing.
|
|
32
|
+
- Optimize an SVG (svgo) or render one to PNG (resvg).
|
|
33
|
+
- Build a contact sheet / grid for a carousel.
|
|
34
|
+
|
|
35
|
+
## Tool posture
|
|
36
|
+
|
|
37
|
+
ImageMagick (`magick` on IM7, else `convert`) is the primary path - almost always
|
|
38
|
+
present and covers nearly every raster op. Dedicated tools give better bytes-per-
|
|
39
|
+
quality and are used **automatically when installed**: `cwebp`/`avifenc` (encode),
|
|
40
|
+
`pngquant` (lossy PNG), `svgo` (SVG optimize), `resvg`/`rsvg-convert` (SVG render).
|
|
41
|
+
`--force-im` forces the ImageMagick path. Full commands are in
|
|
42
|
+
[image recipes](../../references/image-recipes.md).
|
|
43
|
+
|
|
44
|
+
## CLI
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
maggie tool maggie_image.py social --input hero.png --output og.jpg --preset og # 1200x630 cover-crop
|
|
48
|
+
maggie tool maggie_image.py resize --input a.jpg --output a.jpg --size 1080x1080 --mode cover
|
|
49
|
+
maggie tool maggie_image.py --run webp --input hero.png --output hero.webp --quality 80
|
|
50
|
+
maggie tool maggie_image.py --run avif --input hero.png --output hero.avif
|
|
51
|
+
maggie tool maggie_image.py --run favicon --input logo.png --out-dir public/
|
|
52
|
+
maggie tool maggie_image.py --run strip --input photo.jpg --output photo.jpg
|
|
53
|
+
maggie tool maggie_image.py --run compress --input big.jpg --output small.jpg --quality 82
|
|
54
|
+
maggie tool maggie_image.py svgo --input logo.svg --output logo.min.svg --multipass
|
|
55
|
+
maggie tool maggie_image.py svg2png --input logo.svg --output logo.png --width 512
|
|
56
|
+
maggie tool maggie_image.py --run montage --inputs a.png b.png c.png --output sheet.jpg --tile 3x
|
|
57
|
+
maggie tool maggie_image.py presets
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Subcommands: `resize`, `social`, `webp`, `avif`, `favicon`, `strip`, `compress`,
|
|
61
|
+
`svgo`, `svg2png`, `montage`, `presets`. `--run` (before the subcommand) executes
|
|
62
|
+
when the tool is present; otherwise the command is printed for review.
|
|
63
|
+
|
|
64
|
+
## Defaults and quality
|
|
65
|
+
|
|
66
|
+
- Metadata **stripped** on public assets (privacy + bytes).
|
|
67
|
+
- JPEG/WebP quality ~80, AVIF ~50 (sharp/squoosh web-delivery defaults).
|
|
68
|
+
- OG/social are **cover-cropped** (fill, no distortion); logos **contain-pad**.
|
|
69
|
+
- Favicon: `.ico` (64/48/32/16) + PNG set (16/32/48/180-apple-touch/192/512).
|
|
70
|
+
- SVG: svgo keeps `viewBox` and `title` (responsive + accessible); never rasterize an
|
|
71
|
+
SVG as a substitute for optimizing it.
|
|
72
|
+
|
|
73
|
+
## Quality bar
|
|
74
|
+
|
|
75
|
+
- Output is the exact target size with no distortion; cover vs pad chosen for the
|
|
76
|
+
content (photos crop, logos pad).
|
|
77
|
+
- Public images carry no EXIF/GPS; file sizes are web-appropriate (WebP/AVIF offered).
|
|
78
|
+
- SVGs stay vector and keep `viewBox`; a rendered PNG is only made on request.
|
|
79
|
+
- Every command is printed/logged before (or instead of) running.
|
|
80
|
+
|
|
81
|
+
## Guardrails
|
|
82
|
+
|
|
83
|
+
- Local tools only; invoke `convert`/`magick` and dedicated binaries at arm's length;
|
|
84
|
+
never vendor GPL/AGPL code (e.g. Upscayl is AGPL - for AI upscaling invoke the
|
|
85
|
+
separate `realesrgan-ncnn-vulkan` binary instead).
|
|
86
|
+
- Do not claim a file was produced unless `--run` executed and it exists.
|
|
87
|
+
- Do not upscale/alter a logo or product shot in a way that misrepresents it; keep
|
|
88
|
+
brand assets faithful.
|
|
89
|
+
- Reproducing copyrighted or third-party imagery is the caller's responsibility.
|
|
90
|
+
|
|
91
|
+
## Related skills
|
|
92
|
+
|
|
93
|
+
- `maggie-video` - the moving-image counterpart (same recipe-generator pattern).
|
|
94
|
+
- `maggie-spirit` - brand marks/avatars; `maggie-design` - where assets are placed
|
|
95
|
+
and the icon/responsive gates run.
|
|
96
|
+
- `maggie media generate` - generating new images from a prompt.
|
|
97
|
+
- [generative visuals](../../references/generative-visuals.md) - making visuals in code.
|
|
98
|
+
|
|
99
|
+
## Boundaries
|
|
100
|
+
|
|
101
|
+
- Processing and optimization only; generation and placement live in other lanes.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: maggie-landing-page
|
|
3
3
|
description: Build a high-converting landing page - intake, page structure, layout selection, conversion copy, SEO/AEO, plus a visual-system discipline (typography, spacing, radius, backgrounds, hero, icons, motion) whose specific values are defaults the project's DESIGN.md overrides. Use when building, editing, styling, or writing copy for a landing page, marketing page, or a page section meant to convert. Designs the page; maggie-design produces and validates it.
|
|
4
4
|
metadata:
|
|
5
|
-
version: 0.1.
|
|
5
|
+
version: 0.1.2
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Maggie Landing Page
|
|
@@ -156,6 +156,10 @@ icon inventory + glyph-render gates before release.
|
|
|
156
156
|
|
|
157
157
|
## B7. Motion
|
|
158
158
|
|
|
159
|
+
The motion vocabulary (eases, scroll-reveal, stagger, SVG draw-on, typing, page
|
|
160
|
+
transitions, Lottie, particles) with per-library guidance is in
|
|
161
|
+
[web animation patterns](../../references/web-animation-patterns.md).
|
|
162
|
+
|
|
159
163
|
Weighted, decelerating motion; never a browser-default curve. Default base curve
|
|
160
164
|
`cubic-bezier(0.22,1,0.36,1)` ~500ms for layout/position; 300ms (never under 200ms)
|
|
161
165
|
for hover colour/opacity. Animate only `transform`/`opacity`. Respect
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: maggie-spirit
|
|
3
3
|
description: Generate an AI brand's flat-pixel spirit (sprite) system - a logo mark that animates through a fixed 32-state base set, and per-agent avatar faces animated through the same states. Use for agent/brand avatars, logo marks, sprite-sheet and sprite-animation assets, and a shared motion vocabulary across Core and Service agents.
|
|
4
4
|
metadata:
|
|
5
|
-
version: 0.1.
|
|
5
|
+
version: 0.1.1
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Maggie Spirit
|
|
@@ -14,7 +14,9 @@ states** (power, work, comms, outcome, gov). Agents differ only by their
|
|
|
14
14
|
and status badges stay identical so a state reads the same everywhere.
|
|
15
15
|
|
|
16
16
|
Everything is deterministic (seeded by accent + persona) and self-contained
|
|
17
|
-
(Pillow only - no model calls, no per-image cost).
|
|
17
|
+
(Pillow only - no model calls, no per-image cost). For code-drawn generative
|
|
18
|
+
visuals (backgrounds, 3D, stylized photos) beyond the brand mark, see
|
|
19
|
+
[generative visuals](../../references/generative-visuals.md). It pairs with
|
|
18
20
|
[agent goal-led design](../../references/agent-goal-design.md): design the agent,
|
|
19
21
|
then give it a spirit.
|
|
20
22
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: maggie-video
|
|
3
3
|
description: Produce and process marketing video - render a composition to MP4/GIF/WebM, assemble clips/images/text/captions/audio on a timeline, cut to channel aspects (reel/square/youtube), burn in captions, normalize loudness, watermark, transcode, and make social cuts. Engine-neutral over the renderer (ffmpeg for assembly/transcode, a programmatic engine for code-drawn animation). Use when the user wants to make, edit, cut, caption, resize, or export a video for marketing.
|
|
4
4
|
metadata:
|
|
5
|
-
version: 0.1.
|
|
5
|
+
version: 0.1.4
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Maggie Video
|
|
@@ -92,7 +92,8 @@ paid API):
|
|
|
92
92
|
toggleable track.
|
|
93
93
|
|
|
94
94
|
Never fabricate a transcript; generate it from the real audio and have a human
|
|
95
|
-
review before publishing.
|
|
95
|
+
review before publishing. Engine choice and the full flow are in
|
|
96
|
+
[captions and transcription](../../references/captions-transcription.md).
|
|
96
97
|
|
|
97
98
|
## Channel presets and safe areas
|
|
98
99
|
|