<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Animation System</title>
<meta name="description" content="A programming language that compiles to HTML, CSS, and JavaScript. Build SPAs and static sites with built-in components, reactivity, routing, i18n, and animations.">
<link rel="stylesheet" href="../styles.css">
</head>
<body>
<div id="app">
<div class="wf-row">
<div class="wf-container wf-animate-fadeIn">
<div class="wf-spacer"></div>
<h1 class="wf-heading wf-heading--h1">Animation System</h1>
<p class="wf-text wf-text--muted">Declarative animations built into the language. No CSS keyframes to write.</p>
<div class="wf-spacer"></div>
<h2 class="wf-heading wf-heading--h2">Mount Animations</h2>
<p class="wf-text">Add an animation modifier to any component. It plays when the element appears. Hover each card to replay.</p>
<div class="wf-spacer"></div>
<div class="wf-grid" style="grid-template-columns: repeat(3, 1fr)">
<div class="wf-card wf-card--outlined wf-animate-fadeIn">
<div class="wf-card__body">
<p class="wf-text wf-text--center wf-text--bold">fadeIn</p>
<p class="wf-text wf-text--center wf-text--muted wf-text--small">Fades from transparent</p>
</div>
</div>
<div class="wf-card wf-card--outlined wf-animate-slideUp">
<div class="wf-card__body">
<p class="wf-text wf-text--center wf-text--bold">slideUp</p>
<p class="wf-text wf-text--center wf-text--muted wf-text--small">Slides from below</p>
</div>
</div>
<div class="wf-card wf-card--outlined wf-animate-scaleIn">
<div class="wf-card__body">
<p class="wf-text wf-text--center wf-text--bold">scaleIn</p>
<p class="wf-text wf-text--center wf-text--muted wf-text--small">Scales from 90%</p>
</div>
</div>
<div class="wf-card wf-card--outlined wf-animate-slideDown">
<div class="wf-card__body">
<p class="wf-text wf-text--center wf-text--bold">slideDown</p>
<p class="wf-text wf-text--center wf-text--muted wf-text--small">Slides from above</p>
</div>
</div>
<div class="wf-card wf-card--outlined wf-animate-slideLeft">
<div class="wf-card__body">
<p class="wf-text wf-text--center wf-text--bold">slideLeft</p>
<p class="wf-text wf-text--center wf-text--muted wf-text--small">Slides from right</p>
</div>
</div>
<div class="wf-card wf-card--outlined wf-animate-bounce">
<div class="wf-card__body">
<p class="wf-text wf-text--center wf-text--bold">bounce</p>
<p class="wf-text wf-text--center wf-text--muted wf-text--small">Bouncy entrance</p>
</div>
</div>
<div class="wf-card wf-card--outlined wf-animate-shake">
<div class="wf-card__body">
<p class="wf-text wf-text--center wf-text--bold">shake</p>
<p class="wf-text wf-text--center wf-text--muted wf-text--small">Horizontal shake</p>
</div>
</div>
<div class="wf-card wf-card--outlined wf-animate-pulse">
<div class="wf-card__body">
<p class="wf-text wf-text--center wf-text--bold">pulse</p>
<p class="wf-text wf-text--center wf-text--muted wf-text--small">Gentle scale pulse</p>
</div>
</div>
<div class="wf-card wf-card--outlined wf-animate-slideRight">
<div class="wf-card__body">
<p class="wf-text wf-text--center wf-text--bold">slideRight</p>
<p class="wf-text wf-text--center wf-text--muted wf-text--small">Slides from left</p>
</div>
</div>
</div>
<div class="wf-spacer"></div>
<div class="wf-card wf-card--outlined">
<div class="wf-card__body">
<code class="wf-code">Card(elevated, fadeIn) { ... }
Heading("Title", h1, slideUp)
Button("Click", primary, bounce)</code>
</div>
</div>
<div class="wf-spacer"></div>
<hr class="wf-divider">
<div class="wf-spacer"></div>
<h2 class="wf-heading wf-heading--h2">Live: Conditional Animation</h2>
<p class="wf-text">Toggle the switch to see enter/exit animations on the card below.</p>
<div class="wf-spacer"></div>
<label class="wf-switch">Show animated card</label>
<div class="wf-spacer"></div>
<div class="wf-spacer"></div>
<div class="wf-card wf-card--outlined">
<div class="wf-card__body">
<code class="wf-code">if showCard, animate(scaleIn, fadeOut) {
Card(elevated) {
Text("Animated content")
}
}</code>
</div>
</div>
<div class="wf-spacer"></div>
<hr class="wf-divider">
<div class="wf-spacer"></div>
<h2 class="wf-heading wf-heading--h2">Speed Variants</h2>
<div class="wf-spacer"></div>
<div class="wf-grid" style="grid-template-columns: repeat(3, 1fr)">
<div class="wf-card wf-card--outlined wf-animate-fadeIn">
<div class="wf-card__body">
<p class="wf-text wf-text--center wf-text--bold">fast</p>
<p class="wf-text wf-text--center wf-text--muted">150ms</p>
<code class="wf-code">Card(elevated, fadeIn, fast)</code>
</div>
</div>
<div class="wf-card wf-card--outlined wf-animate-fadeIn">
<div class="wf-card__body">
<p class="wf-text wf-text--center wf-text--bold">default</p>
<p class="wf-text wf-text--center wf-text--muted">300ms</p>
<code class="wf-code">Card(elevated, fadeIn)</code>
</div>
</div>
<div class="wf-card wf-card--outlined wf-animate-fadeIn">
<div class="wf-card__body">
<p class="wf-text wf-text--center wf-text--bold">slow</p>
<p class="wf-text wf-text--center wf-text--muted">500ms</p>
<code class="wf-code">Card(elevated, fadeIn, slow)</code>
</div>
</div>
</div>
<div class="wf-spacer"></div>
<hr class="wf-divider">
<div class="wf-spacer"></div>
<h2 class="wf-heading wf-heading--h2">All 12 Animations</h2>
<div class="wf-spacer"></div>
<table class="wf-table">
<thead>
<td>Name</td>
<td>Effect</td>
<td>Usage</td>
</thead>
<tr>
<td>fadeIn / fadeOut</td>
<td>Opacity fade</td>
<td>Card(elevated, fadeIn)</td>
</tr>
<tr>
<td>slideUp / slideDown</td>
<td>Vertical slide + fade</td>
<td>Heading("Hi", h1, slideUp)</td>
</tr>
<tr>
<td>slideLeft / slideRight</td>
<td>Horizontal slide + fade</td>
<td>Text("Hello", slideLeft)</td>
</tr>
<tr>
<td>scaleIn / scaleOut</td>
<td>Scale from/to 90%</td>
<td>Badge("New", scaleIn)</td>
</tr>
<tr>
<td>bounce</td>
<td>Bouncy entrance</td>
<td>Button("Go", bounce)</td>
</tr>
<tr>
<td>shake</td>
<td>Horizontal shake</td>
<td>Alert("Error!", shake)</td>
</tr>
<tr>
<td>pulse</td>
<td>Scale pulse (infinite)</td>
<td>Badge("Live", pulse)</td>
</tr>
<tr>
<td>spin</td>
<td>360-degree rotation</td>
<td>Spinner(spin)</td>
</tr>
</table>
<div class="wf-spacer"></div>
<hr class="wf-divider">
<div class="wf-spacer"></div>
<h2 class="wf-heading wf-heading--h2">Conditional Animations</h2>
<p class="wf-text">Attach enter and exit animations to if blocks.</p>
<div class="wf-spacer"></div>
<div class="wf-card wf-card--outlined">
<div class="wf-card__body">
<code class="wf-code">if visible, animate(slideUp, fadeOut) {
Card { Text("Appears with slideUp, exits with fadeOut") }
}
if expanded, animate(scaleIn, scaleOut) {
Text("Scales in and out")
}</code>
</div>
</div>
<div class="wf-spacer"></div>
<hr class="wf-divider">
<div class="wf-spacer"></div>
<h2 class="wf-heading wf-heading--h2">List Stagger</h2>
<p class="wf-text">Animate list items with staggered delays.</p>
<div class="wf-spacer"></div>
<div class="wf-card wf-card--outlined">
<div class="wf-card__body">
<code class="wf-code">for item in items, animate(slideUp, fadeOut, stagger: "50ms") {
Card { Text(item.name) }
}</code>
</div>
</div>
<div class="wf-spacer"></div>
<hr class="wf-divider">
<div class="wf-spacer"></div>
<h2 class="wf-heading wf-heading--h2">Transition Blocks</h2>
<p class="wf-text">Smooth CSS transitions on property changes.</p>
<div class="wf-spacer"></div>
<div class="wf-card wf-card--outlined">
<div class="wf-card__body">
<code class="wf-code">Button("Hover me") {
transition {
background 200ms ease
transform 150ms spring
}
}</code>
</div>
</div>
<div class="wf-spacer"></div>
</div>
</div>
</div>
<script src="../app.js"></script>
</body>
</html>