{"id":"paper-cut-hills","version":"1.0.0","title":"Paper-Cut Hills","summary":"A diorama of layered paper hills in soft colours sliding past each other, a paper sun behind and birds crossing the sky. Loops perfectly.","kind":"background","target":"canvas2d","collections":["backgrounds","hypnotic-loops","satisfying"],"tags":["paper cut","paper craft","hills","landscape","parallax","diorama","layers","handmade","calm","loop"],"loopable":true,"motion":"procedural","durationSeconds":12,"status":"published","media":{"poster":"https://aipixelwizard.com/media/paper-cut-hills/1.0.0/poster.webp","preview":"https://aipixelwizard.com/media/paper-cut-hills/1.0.0/preview.mp4","sample":"https://aipixelwizard.com/media/paper-cut-hills/1.0.0/sample.mp4","sampleBytes":537886,"sampleNote":"Pre-rendered with the default settings. Customised settings must be exported locally (npm run render)."},"urls":{"page":"https://aipixelwizard.com/visuals/paper-cut-hills","manifest":"https://aipixelwizard.com/api/v1/visuals/paper-cut-hills/versions/1.0.0","agentMd":"https://aipixelwizard.com/registry/paper-cut-hills/1.0.0/agent.md","files":"https://aipixelwizard.com/registry/paper-cut-hills/1.0.0/","demo":"https://aipixelwizard.com/registry/paper-cut-hills/1.0.0/index.html"},"description":"A diorama of layered paper: rows of rolling hills cut from card, each layer a different colour and a little darker the nearer it sits, every layer casting a soft shadow on the one behind, a pale sun or moon behind the farthest ridge and a few paper birds crossing the sky. The layers slide sideways at different speeds, so the scene has real parallax, and each moves a whole number of its own repeats per loop so the loop is exact. Choose the number of layers, the colours (dawn, forest, dusk or snow), how many repeats the nearest layer moves per loop, whether birds fly and the seed.","role":"Background (Canvas 2D): a handmade, calm, parallax landscape for titles, children's content and wellness.","useCases":["A children's, story or wellness title backdrop","A calm looping background behind text","A handmade-style scene for social posts"],"synonyms":["papercut landscape","layered paper","paper art","parallax hills","cut paper scene","diorama background"],"digest":"db56a4aabea20946b76f3d379905b4f86fc3e34cfd34d262057f74c940309056","implementation":{"target":"canvas2d","runtime":"browser","language":"javascript","module":"esm","entry":"src/paper-cut-hills.js","exports":[{"name":"createPaperCutHills","signature":"createPaperCutHills({ layers?, palette?, speed?, birds?, seed? }) => { draw(ctx, info, width, height) }","description":"Canvas 2D scene; info.progress (0 to 1 over the loop) sets the place in the loop; it fills the canvas."},{"name":"PALETTES","signature":"PALETTES: { dawn, forest, dusk, snow }","description":"Sky, sun and layer colours."}],"reusable":["src/paper-cut-hills.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":"layers","label":"Layers","type":"integer","min":3,"max":7,"step":1,"default":6},{"key":"palette","label":"Colours","type":"select","default":"dawn","options":[{"value":"dawn","label":"Dawn"},{"value":"forest","label":"Forest"},{"value":"dusk","label":"Dusk"},{"value":"snow","label":"Snow"}]},{"key":"speed","label":"Speed","help":"Repeats of the nearest layer's hills per loop.","type":"integer","min":1,"max":3,"step":1,"default":1},{"key":"birds","label":"Birds","type":"boolean","default":true},{"key":"seed","label":"Seed","type":"integer","min":1,"max":999,"step":1,"default":4}],"presets":[{"id":"default","label":"Dawn, six layers","params":{}},{"id":"forest","label":"Forest, fast","params":{"palette":"forest","speed":2,"seed":9}},{"id":"dusk","label":"Dusk, no birds","params":{"palette":"dusk","birds":false,"seed":13}},{"id":"snow","label":"Snow, four layers","params":{"palette":"snow","layers":4,"seed":2}}],"output":{"width":1080,"height":1080,"fps":30,"durationSeconds":12,"posterSeconds":3,"alpha":false,"motion":"procedural","loop":{"seamless":true,"cycleSeconds":12,"method":"Each layer moves exactly a whole number of its own repeats per loop and the birds make whole laps with whole wing-beats, so the last frame meets the first."},"seed":{"param":"seed","behavior":"Seed shapes every layer's hills and places and sizes the birds: same seed, same landscape."}},"composition":{"inputs":"Canvas 2D context, info.progress (0 to 1 over the loop), width, height.","outputs":"Fills the whole canvas.","coordinates":"Layers are drawn farthest first; each layer's ridge is a sum of three sine harmonics of its own repeat length, longer for nearer layers.","lighting":"Each layer casts a soft shadow upwards onto the one behind; the sun has a pale halo.","timing":"Pure function of info.progress.","compatibleWith":["kinetic-title","gradient-background"],"notes":["A faint fixed paper grain is drawn over everything."]},"reuse":["Story title: Dawn, six layers.","Nature video: Forest, fast.","Bedtime: Dusk, no birds."],"integration":{"newProject":"Create the scene once, then each frame call hills.draw(ctx, { progress }, width, height).","existingProject":"Copy src/paper-cut-hills.js. Call draw on your 2D canvas as the first thing in the frame."},"performance":{"notes":"Each layer is one path of about 300 points plus a shadow; a few milliseconds a frame.","limits":"Software canvas shadows are the slowest part; fewer layers draw faster."},"limitations":["The look is flat paper with soft shadows; there is no 3D or real lighting.","Hills repeat exactly with the loop, so a very long clip can look cyclic."],"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":{"paper-cut-hills@1.0.0":"db56a4aabea20946b76f3d379905b4f86fc3e34cfd34d262057f74c940309056","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":360,"renderSeconds":27.4,"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/paper-cut-hills/1.0.0/poster.webp","preview":"/media/paper-cut-hills/1.0.0/preview.mp4","sample":"/media/paper-cut-hills/1.0.0/sample.mp4","sampleBytes":537886}},"files":[{"path":"LICENSE","size":1072,"sha256":"8a5f3a96f07e11522ec4bdd0a583356f99bad1245920f9709cee09b995a45153","contentType":"text/plain; charset=utf-8","url":"https://aipixelwizard.com/registry/paper-cut-hills/1.0.0/LICENSE"},{"path":"asset.json","size":6677,"sha256":"b099ed99b0ba66f33b797bce1c96e2cd8a5690cf36385e43e40ef23764295804","contentType":"application/json; charset=utf-8","url":"https://aipixelwizard.com/registry/paper-cut-hills/1.0.0/asset.json"},{"path":"demo.js","size":556,"sha256":"426b08a5176805bf33e21028bd13e103e00c44f348a78a7e765681ab3b3e3e4c","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/paper-cut-hills/1.0.0/demo.js"},{"path":"index.html","size":529,"sha256":"60b4f821e142fdc4d2f39ff5d3df32fe1d3754cc02f6484bcb2db96b3afc35de","contentType":"text/html; charset=utf-8","url":"https://aipixelwizard.com/registry/paper-cut-hills/1.0.0/index.html"},{"path":"src/paper-cut-hills.js","size":6091,"sha256":"359f5e06ff0d98f70796dfec9a8a79f048b63018a8d8718f54ab64026c083049","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/paper-cut-hills/1.0.0/src/paper-cut-hills.js"}],"warnings":[]}