Must be read before adding or modifying Oh My PPT slide animations. Defines exportable data-anim usage, trigger decisions, and how to replace unsupported scripted/anime.js animation.
68
81%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
For deeper examples (trigger choice guide, scripted animation patterns, timing tips), read references/data-anim.md.
Before adding animation, answer these:
Add data-anim attributes directly on HTML elements. This works in preview and exports deterministically to PPTX.
<div data-anim="fade-up" data-anim-delay="stagger(90)">Card 1</div>
<div data-anim="fade-up" data-anim-delay="stagger(90)">Card 2</div>
<div data-anim="fade-up" data-anim-delay="stagger(90)">Card 3</div>fade, fade-up, fade-down, fade-left, fade-right, scale-in, slide-up, slide-down, slide-left, slide-right, fly-in, wipe, zoom-in, spin-in, grow-shrink-soft, grow-shrink, grow-shrink-strong, pulse-soft, pulse, pulse-strong, exit-fade, exit-scale, exit-zoom, exit-wipe, exit-fly, path
| Attribute | Values | Notes |
|---|---|---|
data-anim | type from supported list | required |
data-anim-trigger | load, click, with, after | omit for load |
data-anim-sequence | with, after | preferred load-order control for new content |
data-anim-click-group | stable token such as step-1 | only for contiguous click animations that should reveal on the same click |
data-anim-from | left, right, top, bottom, center | direction/origin |
data-anim-delay | ms or stagger(N) | stagger for repeated items |
data-anim-stagger | ms | preferred new declarative stagger gap |
data-anim-duration | ms | prefer 300–1200 |
data-anim-path | inline linear path string such as M 0 0 L 120 30 | only for path type |
stagger(N) — repeated items appearing in sequence:
<div data-anim="fade-up" data-anim-delay="stagger(90)">Point 1</div>
<div data-anim="fade-up" data-anim-delay="stagger(90)">Point 2</div>data-anim-stagger="N" — preferred new syntax for repeated items:
<div data-anim="fade-up" data-anim-stagger="90">Point 1</div>
<div data-anim="fade-up" data-anim-stagger="90">Point 2</div>with — group starts together with previous animated element:
<h2 data-anim="fade-up">Market Signal</h2>
<p data-anim="fade" data-anim-trigger="with" data-anim-delay="120">Supporting text.</p>after — short auto-playing sequence:
<div data-anim="fade-up">1. First</div>
<div data-anim="fade-up" data-anim-trigger="after">2. Second</div>
<div data-anim="fade-up" data-anim-trigger="after">3. Third</div>For new content, prefer data-anim-sequence so trigger semantics stay separate from load ordering:
<div data-anim="fade-up">1. First</div>
<div data-anim="fade" data-anim-sequence="with" data-anim-delay="80">Supporting note</div>
<div data-anim="fade-up" data-anim-sequence="after">2. Second</div>click — only for explicit presentation control (step-by-step, one-by-one reveal). Use load, stagger, with, or after for timelines, processes, steps, and flows.
click-group — multiple contiguous click-triggered elements on the same build step:
<div data-anim="fade-up" data-anim-trigger="click" data-anim-click-group="reveal">Headline</div>
<div data-anim="pulse-soft" data-anim-trigger="click" data-anim-click-group="reveal">Badge</div>
<div data-anim="fade" data-anim-trigger="click">Next click step</div>data-anim-trigger="click" elements.splitText, per-letter/per-word choreography, SVG draw/morph helpers, and arbitrary path choreography are not part of the normal editable contract.data-anim="path" semantic with an inline linear path string such as M 0 0 L 120 30. Richer path/draw/morph ideas belong to a future preview-only lane.data-anim-easing, data-anim-repeat, and data-anim-direction are runtime-only compatibility attributes. Do not use them in standard generated editable/exportable pages because PPTX export/import does not preserve them semantically.<div data-anim="fly-in" data-anim-from="left">Side metric</div>
<div data-anim="wipe" data-anim-from="right">Process bar</div>
<div data-anim="slide-right">Supporting card</div>
<div data-anim="exit-wipe" data-anim-from="top">Dismissed panel</div>
<div data-anim="exit-scale">Quietly de-emphasized chip</div>
<div data-anim="exit-zoom">Dramatic hero outro</div>
<div data-anim="zoom-in">Hero number</div>
<div data-anim="pulse">Key risk</div>
<div data-anim="pulse-strong" data-anim-trigger="click">Escalation callout</div>
<div data-anim="grow-shrink-soft">Subtle confirmation</div>Use PPT.animate(targets, params) only when data-anim cannot express a complex timeline or synchronized choreography:
PPT.animate(".card", {
opacity: [0, 1],
translateY: [20, 0],
duration: 500,
delay: PPT.stagger(100)
})PPT.createTimeline(targets, params).PPT.stagger(ms) for staggered scripted delays.load, stagger, with, or after before click.data-anim-click-group="name" only for contiguous click animations that share one reveal step.pulse-soft|pulse|pulse-strong and grow-shrink-soft|grow-shrink|grow-shrink-strong.data-anim-easing, data-anim-repeat, or data-anim-direction in normal generated editable pages. Those attributes are runtime-only compatibility and are not part of the export-friendly contract.PPT.animate(selector, params) — targets is the first argument, not an object property. Call PPT.animate(...), never anime(...) or anime.timeline(...).opacity-0, invisible, visibility:hidden, display:none, or inline opacity:0 on animated elements.When animation is broken or not playing:
typewriter, glitch-in, path-draw are not supported.opacity-0, invisible, visibility:hidden, display:none, or inline opacity:0 — the runtime sets these automatically.anime(...) or anime.timeline(...) with PPT.animate(...) or PPT.createTimeline(...).PPT.animate takes targets as the first argument, not as an object property like { targets: ".card" }.Two levels of chart animation, each handled by a different system:
data-anim on the .ppt-chart-frame div.options.animation. The runtime defaults handle this.data-anim for the container, and Chart.js options for the internals.data-anim-from="center" cannot roundtrip reliably with trace-based motions (fly-in, wipe, exit-fly, exit-wipe). The validator will reject these incompatible combinations. Use center only with fade/zoom/path animations that don't depend on directional motion paths.
data-anim-click-group values preserve grouping structure and click timing when roundtripping through PPTX, but the token text itself may change (e.g., reveal → 1). The semantic behavior (elements grouped into the same click step) is preserved. Do not rely on token name identity across export/import — only structural grouping is guaranteed.
data-anim-sequence="with|after" controls HTML→PPTX export timing, but PPTX import does not reconstruct this attribute. Sequence semantics are HTML→PPTX only, not roundtrip. Imported animations use trigger/delay to express timing.
External PPTX files with custom animation scale values (e.g., scaleTo=80000) are projected to the nearest built-in preset bucket via distance-based matching. The resulting data-anim type (e.g., exit-scale vs exit-zoom) is a best-fit approximation, not an identity-preserving roundtrip value. This applies to both entrance (zoom-in/scale-in/spin-in) and exit (exit-scale/exit-zoom) scale animations.
data-anim="path" requires data-anim-path with a constrained linear path format: M x y L dx dy (integer or decimal coordinates). More complex SVG path commands are not supported in the editable contract.
d2046bf
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.