TITLE: Kite Festival — A Windy Afternoon on the Hill PROMPT: Build a single-file, full-viewport canvas scene of a kite festival on a breezy spring afternoon. Palette: sky #bfe3f2 deepening to #a6d8ee at the top with a warm sun bloom, kites in #ff6b6b red, #ffd166 yellow and #6ee7b7 mint, hill #2f4858 with a pale distant ridge #9dc3d2, figures in near-black #12212b. Six diamond kites at different depths fly on strings anchored to the raised hands of tiny silhouetted figures standing on the ridge. Sky is a cached canvas linear-gradient plus a radial sun glow; two hills are sine-curve ridges filled with a 6px-step path; clouds are four-blob white circles at 26-60% alpha drifting right and wrapping. Each kite is driven by a layered-sine value noise (three harmonics) feeding a spring: velocity integrates toward a noise-driven target with per-kite amplitude, phase and speed, damped with Math.pow(0.055, dt) so motion is smooth and frame-rate independent. Strings are quadratic beziers whose control point sags downward by up to 150px scaled inversely with wind. Tails are eleven chained points that lag behind the kite with a per-segment lerp, plus a sine curl term and gravity, drawn as a thin curve with alternating small diamond bows in the kite palette. A gust system fires random gusts every 3-9 seconds and decays them exponentially, modulating kite amplitude, cloud drift, string sag and banner flap speed. The top banner is DOM: an SVG catenary rope, seventeen clip-path pennant triangles on a parabolic sag, each flapping with a per-index animation delay, and the title KITE FESTIVAL split into per-letter spans that flap independently, all sharing a --wdur duration set from the wind value. Bottom-left glass HUD: wind label, a gradient gauge bar, a range slider and a big tabular percent readout. Interactions: drag a kite to steer it with pointer capture and velocity tracking, click to make it fly a double loop, double-click to release it so it drifts off, fades and respawns; the wind slider (or arrow keys) changes gust strength. prefers-reduced-motion damps noise amplitude and slows cloud drift; DPR-scaled canvas refits on resize and orientation change. DESCRIPTION: A joyful, airy kite festival rendered entirely in code — no images, no fonts, no libraries. The composition is deliberately calm at the top and busy at the bottom: a wide soft sky with drifting clouds, six kites in red, yellow and mint weaving on invisible wind at different depths, and a dark hill with tiny figures holding the strings. The festival banner overhead flutters and the whole scene breathes with gusts that rise and fall. Dragging a kite feels physical — it swings on its string, tails curling behind — and double-clicking one sets it free to tumble away. It is the page you leave open in a tab on a slow afternoon. TECHNIQUES: - Layered-sine value noise (three harmonics) driving per-kite spring targets, frame-rate-independent damping - Quadratic bezier strings with catenary-ish sag scaled inversely by wind strength - Eleven-segment lagging tail chain with sine curl, gravity and alternating diamond bows - Randomised gust system with exponential decay modulating amplitude, drift, sag and flap speed - DPR-scaled canvas with cached sky/sun gradients rebuilt only on resize - Sine-curve hill ridges, four-blob cloud fills in a single path, silhouette figures with raised arms - DOM banner: SVG catenary rope, 17 clip-path pennants on a parabolic sag, per-letter title flap driven by a --wdur custom property - Pointer capture drag with velocity tracking, click/double-click disambiguation via a 310ms pending timer - prefers-reduced-motion damps noise and cloud drift; resize and orientationchange refit INTERACTION: - Drag any kite to steer it; it swings on its string and keeps the throw velocity on release - Click a kite to make it loop twice; double-click to release it — it drifts up and away, fades, and respawns at its home position - Drag the wind slider (or press Left/Right arrows) to change gust strength; kites fly wider, clouds speed up, strings tighten and the banner flaps faster - Wind label switches between calm, light, steady, fresh and gusting, and the gauge bar fills - Random gusts periodically surge the whole scene without any input