{"id":"snowfall","version":"1.0.0","title":"Snowfall","summary":"Snow falling in three depths: big soft flakes in front, tiny slow ones behind, drifting on the wind. Loops perfectly.","kind":"effect","target":"canvas2d","collections":["particles","backgrounds","hypnotic-loops"],"tags":["snow","snowfall","winter","particles","christmas","weather","falling","bokeh","holiday","loop"],"loopable":true,"motion":"procedural","durationSeconds":10,"status":"published","media":{"poster":"https://aipixelwizard.com/media/snowfall/1.0.0/poster.webp","preview":"https://aipixelwizard.com/media/snowfall/1.0.0/preview.mp4","sample":"https://aipixelwizard.com/media/snowfall/1.0.0/sample.mp4","sampleBytes":1462971,"sampleNote":"Pre-rendered with the default settings. Customised settings must be exported locally (npm run render)."},"urls":{"page":"https://aipixelwizard.com/visuals/snowfall","manifest":"https://aipixelwizard.com/api/v1/visuals/snowfall/versions/1.0.0","agentMd":"https://aipixelwizard.com/registry/snowfall/1.0.0/agent.md","files":"https://aipixelwizard.com/registry/snowfall/1.0.0/","demo":"https://aipixelwizard.com/registry/snowfall/1.0.0/index.html"},"description":"Snow falling in three depths. Near flakes are big, soft and fast, middle ones medium, far ones tiny and slow, so the scene has depth; each drifts sideways on its own slow sine and the near flakes are slightly blurred as if out of focus. Every flake falls a whole number of screen heights per loop, so the loop is exact. It draws over whatever is on the canvas. Choose the number of flakes, the wind, the sky colours and the seed.","role":"Particle overlay (Canvas 2D): winter, holiday and calm-night atmosphere.","useCases":["A winter or holiday greeting backdrop","A snowy atmosphere over a title or product","A calm looping particle overlay"],"synonyms":["falling snow","snowflakes","winter overlay","snow overlay","snowstorm","christmas snow"],"digest":"00d166a92caa7f42d0e1f9dfc4d83cb365f578a2b90cae241601acbd05264104","implementation":{"target":"canvas2d","runtime":"browser","language":"javascript","module":"esm","entry":"src/snowfall.js","exports":[{"name":"createSnowfall","signature":"createSnowfall({ flakes?, wind?, colour?, seed? }) => { draw(ctx, info, width, height) }","description":"Canvas 2D snow layer; info.progress (0 to 1 over the loop) sets the place in the loop; draws on top of the canvas."}],"reusable":["src/snowfall.js"],"demo":"demo.js","harness":"index.html"},"dependencies":[{"id":"apw-runtime","version":"1.0.0","scope":"demo","reason":"Demo harness. The reusable source has no dependencies."}],"uses":[],"usedBy":[],"params":[{"key":"flakes","label":"Flakes","type":"integer","min":60,"max":600,"step":10,"default":220},{"key":"wind","label":"Wind","type":"number","min":0,"max":1.5,"step":0.1,"default":0.4},{"key":"skyTop","label":"Sky top","type":"color","default":"#0b1530"},{"key":"skyBottom","label":"Sky bottom","type":"color","default":"#3a5a8a"},{"key":"seed","label":"Seed","type":"integer","min":1,"max":999,"step":1,"default":6}],"presets":[{"id":"default","label":"Winter night","params":{}},{"id":"blizzard","label":"Blizzard","params":{"flakes":560,"wind":1.4,"skyTop":"#2a3a52","skyBottom":"#9ab0c8","seed":12}},{"id":"gentle","label":"Gentle, dusk","params":{"flakes":110,"wind":0.1,"skyTop":"#2a1a4a","skyBottom":"#c47aa0","seed":3}},{"id":"white","label":"Daylight, soft","params":{"flakes":300,"wind":0.6,"skyTop":"#9ab6d6","skyBottom":"#dce8f4","seed":9}}],"output":{"width":1080,"height":1080,"fps":30,"durationSeconds":10,"posterSeconds":3,"alpha":false,"motion":"procedural","loop":{"seamless":true,"cycleSeconds":10,"method":"Every flake falls a whole number of screen heights per loop and sways in whole cycles, so the last frame meets the first."},"seed":{"param":"seed","behavior":"Seed places and sizes the flakes: same seed, same snowfall."}},"composition":{"inputs":"Canvas 2D context, info.progress (0 to 1 over the loop), width, height.","outputs":"Draws snow on top of the canvas; does not clear it.","coordinates":"Flakes are placed in fractions of the canvas; sizes scale with the smaller side.","lighting":"None; near flakes are soft radial gradients.","timing":"Pure function of info.progress.","compatibleWith":["kinetic-title","gradient-background"],"notes":["Flakes are drawn far to near so nearer flakes cover farther ones."]},"reuse":["Winter title: Winter night.","Storm: Blizzard.","Soft greeting: Gentle, dusk."],"integration":{"newProject":"Create it once, then each frame draw your backdrop and call draw(ctx, { progress }, width, height).","existingProject":"Copy src/snowfall.js. Call draw on your existing 2D canvas."},"performance":{"notes":"Up to 600 small shapes per frame; about 2 ms.","limits":"The near flakes use radial gradients, the slowest part."},"limitations":["Flakes do not collide or settle; they leave the bottom and re-enter at the top.","The backdrop in the demo is not part of the reusable code."],"license":{"spdx":"MIT","notice":"Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder.","thirdParty":[]},"rights":{"approvedForPublicRelease":true},"provenance":"Original code written for AI Pixel Wizard in October 2026, to the catalog quality bar (docs/QUALITY.md).","changelog":[{"version":"1.0.0","date":"2026-10-08","notes":"Initial release."}],"verification":{"testedOn":"2026-10-08","inputs":{"snowfall@1.0.0":"00d166a92caa7f42d0e1f9dfc4d83cb365f578a2b90cae241601acbd05264104","apw-runtime@1.0.0":"5be859cdac74823ba0bcc32c6daf06688a871104d24db5d4ceaffffd84d7c40d"},"environment":"Chrome 154.0.8037.97 headless on Linux 7.0.0-38-generic (x64), Node 22.14.0","renderer":"Canvas 2D","width":1080,"height":1080,"fps":30,"frames":300,"renderSeconds":21.9,"loopCheck":{"checked":true,"seamless":true,"maxDifference":0,"note":"Frame 0 vs end state (progress 1): mean |Δ| 0.0000, max |Δ| 0 of 255."},"determinism":{"checked":true,"identical":true},"errors":[],"media":{"poster":"/media/snowfall/1.0.0/poster.webp","preview":"/media/snowfall/1.0.0/preview.mp4","sample":"/media/snowfall/1.0.0/sample.mp4","sampleBytes":1462971}},"files":[{"path":"LICENSE","size":1072,"sha256":"8a5f3a96f07e11522ec4bdd0a583356f99bad1245920f9709cee09b995a45153","contentType":"text/plain; charset=utf-8","url":"https://aipixelwizard.com/registry/snowfall/1.0.0/LICENSE"},{"path":"asset.json","size":5809,"sha256":"09062d62c1e57ee1628f086781a8bed7e39933910249a32ce917d5b9881c650e","contentType":"application/json; charset=utf-8","url":"https://aipixelwizard.com/registry/snowfall/1.0.0/asset.json"},{"path":"demo.js","size":1162,"sha256":"c086114fb008607ff98a73f78a434add5b758d94782da5a787ce92d4267253e1","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/snowfall/1.0.0/demo.js"},{"path":"index.html","size":522,"sha256":"040cc4e5319148bb0b06cb26ffff32dd62332e59ad4b02f9b658d4f631f21cfc","contentType":"text/html; charset=utf-8","url":"https://aipixelwizard.com/registry/snowfall/1.0.0/index.html"},{"path":"src/snowfall.js","size":2792,"sha256":"2e95bc803fe60f10f55016ecc0a36d35b8511f28919f23b3ffebf852f94883aa","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/snowfall/1.0.0/src/snowfall.js"}],"warnings":[]}