├── .gitignore ├── 16-braids ├── sandbox.config.json ├── braids.png ├── README.md ├── scratch │ ├── package.json │ ├── sketch.js │ └── package-lock.json ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 01-lines-tiled ├── sandbox.config.json ├── lines-tiled.png ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 02-lines-tiled ├── sandbox.config.json ├── lines-tiled-2.png ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 03-lines-displaced ├── sandbox.config.json ├── lines-displaced.png ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 04-curves-tiled ├── sandbox.config.json ├── curves-tiled.png ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 07-curve-repeated ├── sandbox.config.json ├── curve-repeated.png ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 09-shapes-tiled ├── sandbox.config.json ├── shapes-tiled.png ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 10-squares-displaced ├── sandbox.config.json ├── squares-displaced.png ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 12-squares-recursive ├── sandbox.config.json ├── squares-recursive.png ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 13-triangle-recursive ├── sandbox.config.json ├── triangle-recursive.png ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 14-branches-circular ├── sandbox.config.json ├── branches-circular.png ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 15-shapes-tiled-colors ├── sandbox.config.json ├── shapes-tiled-colors.png ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 05-lines-displaced-curved ├── sandbox.config.json ├── lines-displaced-curved.png ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 06-lines-displaced-curved ├── sandbox.config.json ├── lines-displaced-curved-2.png ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json ├── 11-circle-displaced-repeated ├── sandbox.config.json ├── circle-displaced-repeated.png ├── scratch │ ├── package.json │ ├── sketch.js │ └── package-lock.json ├── README.md ├── package.json ├── index.html ├── sketch.js └── package-lock.json └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | .cache/ 4 | /tmp/ 5 | -------------------------------------------------------------------------------- /16-braids/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /01-lines-tiled/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /02-lines-tiled/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /03-lines-displaced/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /04-curves-tiled/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /07-curve-repeated/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /09-shapes-tiled/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /10-squares-displaced/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /12-squares-recursive/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /13-triangle-recursive/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /14-branches-circular/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /15-shapes-tiled-colors/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /05-lines-displaced-curved/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /06-lines-displaced-curved/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /11-circle-displaced-repeated/sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "template": "parcel" 3 | } 4 | -------------------------------------------------------------------------------- /16-braids/braids.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/16-braids/braids.png -------------------------------------------------------------------------------- /01-lines-tiled/lines-tiled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/01-lines-tiled/lines-tiled.png -------------------------------------------------------------------------------- /02-lines-tiled/lines-tiled-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/02-lines-tiled/lines-tiled-2.png -------------------------------------------------------------------------------- /04-curves-tiled/curves-tiled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/04-curves-tiled/curves-tiled.png -------------------------------------------------------------------------------- /09-shapes-tiled/shapes-tiled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/09-shapes-tiled/shapes-tiled.png -------------------------------------------------------------------------------- /03-lines-displaced/lines-displaced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/03-lines-displaced/lines-displaced.png -------------------------------------------------------------------------------- /07-curve-repeated/curve-repeated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/07-curve-repeated/curve-repeated.png -------------------------------------------------------------------------------- /10-squares-displaced/squares-displaced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/10-squares-displaced/squares-displaced.png -------------------------------------------------------------------------------- /12-squares-recursive/squares-recursive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/12-squares-recursive/squares-recursive.png -------------------------------------------------------------------------------- /14-branches-circular/branches-circular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/14-branches-circular/branches-circular.png -------------------------------------------------------------------------------- /13-triangle-recursive/triangle-recursive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/13-triangle-recursive/triangle-recursive.png -------------------------------------------------------------------------------- /15-shapes-tiled-colors/shapes-tiled-colors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/15-shapes-tiled-colors/shapes-tiled-colors.png -------------------------------------------------------------------------------- /05-lines-displaced-curved/lines-displaced-curved.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/05-lines-displaced-curved/lines-displaced-curved.png -------------------------------------------------------------------------------- /06-lines-displaced-curved/lines-displaced-curved-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/06-lines-displaced-curved/lines-displaced-curved-2.png -------------------------------------------------------------------------------- /11-circle-displaced-repeated/circle-displaced-repeated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mhyfritz/generative-art-speedrun-examples/HEAD/11-circle-displaced-repeated/circle-displaced-repeated.png -------------------------------------------------------------------------------- /16-braids/README.md: -------------------------------------------------------------------------------- 1 | # Colored braids 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /16-braids/scratch/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "scratch", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "sketch.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "canvas-sketch": "^0.2.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /04-curves-tiled/README.md: -------------------------------------------------------------------------------- 1 | # Tiled curves 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /09-shapes-tiled/README.md: -------------------------------------------------------------------------------- 1 | # Tiled shapes 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /01-lines-tiled/README.md: -------------------------------------------------------------------------------- 1 | # Tiled diagonal lines 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /07-curve-repeated/README.md: -------------------------------------------------------------------------------- 1 | # Repeated curve 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /03-lines-displaced/README.md: -------------------------------------------------------------------------------- 1 | # Displaced lines 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /02-lines-tiled/README.md: -------------------------------------------------------------------------------- 1 | # Tiled horizontal and vertical lines 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /12-squares-recursive/README.md: -------------------------------------------------------------------------------- 1 | # Recursive squares 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /14-branches-circular/README.md: -------------------------------------------------------------------------------- 1 | # Circular branches 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /15-shapes-tiled-colors/README.md: -------------------------------------------------------------------------------- 1 | # Colored tiled shapes 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /10-squares-displaced/README.md: -------------------------------------------------------------------------------- 1 | # Displaced squares ("Cubic Disarray") 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /04-curves-tiled/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "04-curves-tiled", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Tiled curves", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /05-lines-displaced-curved/README.md: -------------------------------------------------------------------------------- 1 | # Displaced curved lines 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /09-shapes-tiled/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "09-shapes-tiled", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Tiled shapes", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /13-triangle-recursive/README.md: -------------------------------------------------------------------------------- 1 | # Recursive displaced repeated triangle 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /11-circle-displaced-repeated/scratch/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "scratch", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "sketch.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "canvas-sketch": "^0.2.0", 14 | "random": "^2.0.13" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /01-lines-tiled/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "01-lines-tiled", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Tiled, diagonal lines.", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /03-lines-displaced/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "03-lines-displaced", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Displaced lines", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /11-circle-displaced-repeated/README.md: -------------------------------------------------------------------------------- 1 | # Displaced repeated circle 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /10-squares-displaced/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "10-squares-displaced", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Displaced squares", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /12-squares-recursive/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "12-squares-recursive", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Recursive squares", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /14-branches-circular/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "14-branches-circular", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Circular branches", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /02-lines-tiled/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "02-lines-tiled", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Tiled horizontal and vertical lines", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /05-lines-displaced-curved/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "05-lines-displaced-curved", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Displaced curved lines", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /06-lines-displaced-curved/README.md: -------------------------------------------------------------------------------- 1 | # Displaced (center) curved lines ("Joy Division cover") 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 |

10 | 11 |

12 | -------------------------------------------------------------------------------- /16-braids/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "16-braids", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Colored braids", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0", 15 | "nice-color-palettes": "^2.0.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /07-curve-repeated/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "07-curve-repeated", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Repeated curve", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0", 15 | "random": "^2.0.13" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /13-triangle-recursive/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "13-triangle-recursive", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Recursive displaced repeated triangle", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0", 15 | "random": "^2.0.13" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /15-shapes-tiled-colors/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "15-shapes-tiled-colors", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Colored tiled shapes", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0", 15 | "nice-color-palettes": "^2.0.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /11-circle-displaced-repeated/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "11-circle-displaced-repeated", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Displaced repeated circle", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0", 15 | "random": "^2.0.13" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /06-lines-displaced-curved/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "06-lines-displaced-curved", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Displaced (center) curved lines", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "canvas-sketch sketch.js" 9 | }, 10 | "keywords": [], 11 | "author": "Markus Hsi-Yang Fritz", 12 | "license": "MIT", 13 | "dependencies": { 14 | "canvas-sketch": "^0.2.0", 15 | "d3-scale": "^2.2.2", 16 | "random": "^2.0.13" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /16-braids/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /01-lines-tiled/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /02-lines-tiled/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /04-curves-tiled/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /09-shapes-tiled/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /03-lines-displaced/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /07-curve-repeated/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /10-squares-displaced/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /12-squares-recursive/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /13-triangle-recursive/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /14-branches-circular/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /05-lines-displaced-curved/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /06-lines-displaced-curved/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /15-shapes-tiled-colors/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /11-circle-displaced-repeated/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | sketch 10 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /01-lines-tiled/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | 3 | const size = 620; 4 | 5 | const settings = { 6 | dimensions: [size, size] 7 | }; 8 | 9 | const numRows = 50; 10 | const numCols = numRows; 11 | 12 | const margin = 10; 13 | const sizeInner = size - 2 * margin; 14 | const widthCell = sizeInner / numCols; 15 | const heightCell = sizeInner / numRows; 16 | 17 | const sketch = ({ canvas, context, width, height }) => { 18 | canvas.addEventListener("click", render); 19 | 20 | function render() { 21 | context.fillStyle = "white"; 22 | context.fillRect(0, 0, width, height); 23 | context.save(); 24 | context.translate(margin, margin); 25 | context.strokeStyle = "black"; 26 | context.beginPath(); 27 | for (let i = 0; i < numRows; i += 1) { 28 | for (let j = 0; j < numCols; j += 1) { 29 | context.save(); 30 | context.translate(j * widthCell, i * heightCell); 31 | let x1, y1, x2, y2; 32 | if (Math.random() < 0.5) { 33 | [x1, y1, x2, y2] = [0, 0, widthCell, heightCell]; 34 | } else { 35 | [x1, y1, x2, y2] = [widthCell, 0, 0, heightCell]; 36 | } 37 | context.moveTo(x1, y1); 38 | context.lineTo(x2, y2); 39 | context.restore(); 40 | } 41 | } 42 | context.stroke(); 43 | context.closePath(); 44 | context.restore(); 45 | } 46 | 47 | return render; 48 | }; 49 | 50 | canvasSketch(sketch, settings); 51 | -------------------------------------------------------------------------------- /02-lines-tiled/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | 3 | const size = 620; 4 | 5 | const settings = { 6 | dimensions: [size, size] 7 | }; 8 | 9 | const numRows = 50; 10 | const numCols = numRows; 11 | 12 | const margin = 10; 13 | const sizeInner = size - 2 * margin; 14 | const widthCell = sizeInner / numCols; 15 | const heightCell = sizeInner / numRows; 16 | 17 | const sketch = ({ canvas, context, width, height }) => { 18 | canvas.addEventListener("click", render); 19 | 20 | function render() { 21 | context.fillStyle = "white"; 22 | context.fillRect(0, 0, width, height); 23 | context.save(); 24 | context.translate(margin, margin); 25 | context.strokeStyle = "black"; 26 | context.beginPath(); 27 | for (let i = 0; i < numRows; i += 1) { 28 | for (let j = 0; j < numCols; j += 1) { 29 | context.save(); 30 | context.translate(j * widthCell, i * heightCell); 31 | let x1, y1, x2, y2; 32 | if (Math.random() < 0.5) { 33 | [x1, y1, x2, y2] = [widthCell / 2, 0, widthCell / 2, heightCell]; 34 | } else { 35 | [x1, y1, x2, y2] = [0, heightCell / 2, widthCell, heightCell / 2]; 36 | } 37 | context.moveTo(x1, y1); 38 | context.lineTo(x2, y2); 39 | context.restore(); 40 | } 41 | } 42 | context.stroke(); 43 | context.closePath(); 44 | context.restore(); 45 | } 46 | 47 | return render; 48 | }; 49 | 50 | canvasSketch(sketch, settings); 51 | -------------------------------------------------------------------------------- /03-lines-displaced/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | 3 | const size = 620; 4 | 5 | const settings = { 6 | dimensions: [size, size] 7 | }; 8 | 9 | const numRows = 50; 10 | const numCols = numRows; 11 | 12 | const margin = 10; 13 | const sizeInner = size - 2 * margin; 14 | const widthCell = sizeInner / numCols; 15 | const heightCell = sizeInner / numRows; 16 | 17 | function cap(x, max) { 18 | return x > max ? max : x; 19 | } 20 | 21 | const sketch = ({ canvas, context, width, height }) => { 22 | canvas.addEventListener("click", render); 23 | 24 | function render() { 25 | context.fillStyle = "white"; 26 | context.fillRect(0, 0, width, height); 27 | context.save(); 28 | context.translate(margin, margin); 29 | context.strokeStyle = "black"; 30 | for (let i = 0; i < numRows; i += 1) { 31 | context.save(); 32 | context.translate(0, i * heightCell); 33 | context.beginPath(); 34 | context.moveTo(0, heightCell / 2); 35 | for (let j = 0; j < numCols; j += 1) { 36 | context.lineTo( 37 | widthCell, 38 | heightCell / 2 + 39 | (Math.random() < 0.5 ? -1 : 1) * 40 | // cap to value >1 to allow overlap / crossing of lines 41 | cap((i * j * 4) / (numRows * numCols), 1.2) * 42 | Math.floor(Math.random() * (heightCell / 2)) 43 | ); 44 | context.translate(widthCell, 0); 45 | } 46 | context.stroke(); 47 | context.closePath(); 48 | context.restore(); 49 | } 50 | context.restore(); 51 | } 52 | 53 | return render; 54 | }; 55 | 56 | canvasSketch(sketch, settings); 57 | -------------------------------------------------------------------------------- /10-squares-displaced/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | 3 | const size = 620; 4 | 5 | const settings = { 6 | dimensions: [size, size] 7 | }; 8 | 9 | const numRows = 10; 10 | const numCols = numRows; 11 | 12 | const margin = 20; 13 | const sizeInner = size - 2 * margin; 14 | const widthCell = sizeInner / numCols; 15 | const heightCell = sizeInner / numRows; 16 | 17 | const sketch = ({ canvas, context, width, height }) => { 18 | canvas.addEventListener("click", render); 19 | 20 | function render() { 21 | context.fillStyle = "white"; 22 | context.fillRect(0, 0, width, height); 23 | context.save(); 24 | context.translate(margin, margin); 25 | context.strokeStyle = "black"; 26 | context.beginPath(); 27 | for (let i = 0; i < numRows; i += 1) { 28 | for (let j = 0; j < numCols; j += 1) { 29 | context.save(); 30 | context.translate(j * widthCell, i * heightCell); 31 | const off = (i + 1) / numRows; 32 | context.translate( 33 | widthCell / 2 + randomSign(Math.random() * (widthCell / 8) * off), 34 | heightCell / 2 + randomSign(Math.random() * (widthCell / 8) * off) 35 | ); 36 | context.rotate(randomSign(Math.random() * (Math.PI / 10)) * off); 37 | context.translate(-widthCell / 2, -heightCell / 2); 38 | context.rect(0, 0, widthCell, heightCell); 39 | context.restore(); 40 | } 41 | } 42 | context.stroke(); 43 | context.restore(); 44 | } 45 | 46 | return render; 47 | }; 48 | 49 | canvasSketch(sketch, settings); 50 | 51 | function randomSign(x) { 52 | return Math.random() < 0.5 ? x : -x; 53 | } 54 | -------------------------------------------------------------------------------- /11-circle-displaced-repeated/scratch/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | const random = require("random"); 3 | 4 | const size = 600; 5 | 6 | const settings = { 7 | animate: true, 8 | dimensions: [size, size], 9 | loop: false, 10 | totalFrames: 500 11 | }; 12 | 13 | const numPoints = 8; 14 | const margin = 10; 15 | 16 | const sketch = ({ context, width, height }) => { 17 | context.fillStyle = "white"; 18 | context.fillRect(0, 0, width, height); 19 | const cx = size / 2; 20 | const cy = cx; 21 | const r = size / 4; 22 | const gap = (2 * Math.PI) / numPoints; 23 | 24 | context.lineWidth = 5; 25 | for (i = 0; i < numPoints; i += 1) { 26 | const angle = i * gap; 27 | const x = r * Math.cos(angle) + cx; 28 | const y = r * Math.sin(angle) + cy; 29 | context.beginPath(); 30 | context.strokeStyle = "red"; 31 | context.moveTo(cx, cy); 32 | context.lineTo(x, y); 33 | context.stroke(); 34 | } 35 | 36 | context.beginPath(); 37 | context.strokeStyle = "blue"; 38 | context.arc(cx, cy, r, 0, 2 * Math.PI); 39 | context.stroke(); 40 | 41 | function isInSegment(x, y) { 42 | const angle = Math.atan2(y - cy, x - cx); 43 | return angle > gap && angle < 2 * gap; 44 | } 45 | 46 | function render() { 47 | context.save(); 48 | //context.translate(margin, margin); 49 | const x = Math.floor(Math.random() * size); 50 | const y = Math.floor(Math.random() * size); 51 | context.beginPath(); 52 | context.fillStyle = isInSegment(x, y) ? "black" : "#ccc"; 53 | context.arc(x, y, 3, 0, 2 * Math.PI); 54 | context.fill(); 55 | } 56 | 57 | return render; 58 | }; 59 | 60 | canvasSketch(sketch, settings); 61 | -------------------------------------------------------------------------------- /07-curve-repeated/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | const random = require("random"); 3 | 4 | const size = 620; 5 | 6 | const settings = { 7 | animate: true, 8 | dimensions: [size, size], 9 | loop: false, 10 | totalFrames: 500 11 | }; 12 | 13 | const numPoints = 21; 14 | const margin = 10; 15 | const sizeInner = size - 2 * margin; 16 | 17 | const sketch = ({ context, width, height }) => { 18 | context.fillStyle = "white"; 19 | context.fillRect(0, 0, width, height); 20 | const gap = sizeInner / (numPoints - 1); 21 | const off = random.normal(0, sizeInner / 100); 22 | const points = []; 23 | for (let i = 0; i < numPoints; i += 1) { 24 | points.push({ 25 | x: i * gap, 26 | y: sizeInner / 2 + off() 27 | }); 28 | } 29 | 30 | function render() { 31 | context.save(); 32 | context.translate(margin, margin); 33 | context.beginPath(); 34 | context.strokeStyle = "rgba(30, 30, 30, 0.01)"; 35 | context.moveTo(points[0].x, points[0].y); 36 | for (let i = 1; i < numPoints - 2; i += 1) { 37 | context.quadraticCurveTo( 38 | points[i].x, 39 | points[i].y, 40 | (points[i].x + points[i + 1].x) / 2, 41 | (points[i].y + points[i + 1].y) / 2 42 | ); 43 | } 44 | context.quadraticCurveTo( 45 | points[numPoints - 2].x, 46 | points[numPoints - 2].y, 47 | points[numPoints - 1].x, 48 | points[numPoints - 1].y 49 | ); 50 | context.stroke(); 51 | context.restore(); 52 | 53 | for (let i = 0; i < numPoints; i += 1) { 54 | const point = points[i]; 55 | if (Math.random() < 0.1) { 56 | point.y += off(); 57 | } 58 | } 59 | } 60 | 61 | return render; 62 | }; 63 | 64 | canvasSketch(sketch, settings); 65 | -------------------------------------------------------------------------------- /14-branches-circular/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | 3 | const size = 620; 4 | 5 | const settings = { 6 | dimensions: [size, size] 7 | }; 8 | 9 | const maxLineLen = 60; 10 | const maxLevel = 8; 11 | const maxBranchWidth = 4; 12 | const n = 50; 13 | 14 | const sketch = ({ canvas, context, width, height }) => { 15 | canvas.addEventListener("click", render); 16 | 17 | function render() { 18 | context.fillStyle = "white"; 19 | context.fillRect(0, 0, width, height); 20 | for (let i = 0; i < n; i += 1) { 21 | const a = (i / n) * 2 * Math.PI + rand(-0.15, 0.15); 22 | branch(context, size / 2, size / 2, a, 1, maxLevel); 23 | } 24 | context.beginPath(); 25 | context.arc(size / 2, size / 2, 35, 0, 2 * Math.PI); 26 | context.fillStyle = "rgb(50,50,50)"; 27 | context.fill(); 28 | } 29 | 30 | return render; 31 | }; 32 | 33 | canvasSketch(sketch, settings); 34 | 35 | function branch(context, x, y, a, level, maxLevel) { 36 | if (level > maxLevel) { 37 | return; 38 | } 39 | 40 | context.save(); 41 | context.translate(x, y); 42 | context.rotate(a); 43 | 44 | context.beginPath(); 45 | context.moveTo(0, 0); 46 | const len = -maxLineLen * ((maxLevel - level + 1) / maxLevel); 47 | const end = rand(len - 10, len + 10); 48 | context.lineTo(0, end); 49 | context.lineWidth = maxBranchWidth * ((maxLevel - level + 1) / maxLevel); 50 | context.lineCap = "round"; 51 | context.strokeStyle = "rgb(50,50,50)"; 52 | context.stroke(); 53 | 54 | branch(context, 0, end, rand(-0.2, -0.15), level + 1, maxLevel); 55 | branch(context, 0, end, rand(0.15, 0.2), level + 1, maxLevel); 56 | 57 | context.restore(); 58 | } 59 | 60 | function rand(min, max) { 61 | return Math.random() * (max - min) + min; 62 | } 63 | -------------------------------------------------------------------------------- /04-curves-tiled/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | 3 | const size = 620; 4 | 5 | const settings = { 6 | dimensions: [size, size] 7 | }; 8 | 9 | const numRows = 30; 10 | const numCols = numRows; 11 | 12 | const margin = 10; 13 | const sizeInner = size - 2 * margin; 14 | const widthCell = sizeInner / numCols; 15 | const heightCell = sizeInner / numRows; 16 | 17 | const sketch = ({ canvas, context, width, height }) => { 18 | canvas.addEventListener("click", render); 19 | 20 | function render() { 21 | context.fillStyle = "white"; 22 | context.fillRect(0, 0, width, height); 23 | context.save(); 24 | context.translate(margin, margin); 25 | context.strokeStyle = "black"; 26 | context.beginPath(); 27 | for (let i = 0; i < numRows; i += 1) { 28 | for (let j = 0; j < numCols; j += 1) { 29 | context.save(); 30 | context.translate(j * widthCell, i * heightCell); 31 | 32 | if (Math.random() < 0.5) { 33 | context.moveTo(widthCell / 2, 0); 34 | context.quadraticCurveTo( 35 | widthCell / 2, 36 | heightCell / 2, 37 | widthCell, 38 | heightCell / 2 39 | ); 40 | context.moveTo(0, heightCell / 2); 41 | context.quadraticCurveTo( 42 | widthCell / 2, 43 | heightCell / 2, 44 | widthCell / 2, 45 | heightCell 46 | ); 47 | } else { 48 | context.moveTo(widthCell / 2, 0); 49 | context.quadraticCurveTo( 50 | widthCell / 2, 51 | heightCell / 2, 52 | 0, 53 | heightCell / 2 54 | ); 55 | context.moveTo(widthCell, heightCell / 2); 56 | context.quadraticCurveTo( 57 | widthCell / 2, 58 | heightCell / 2, 59 | widthCell / 2, 60 | heightCell 61 | ); 62 | } 63 | context.restore(); 64 | } 65 | } 66 | context.stroke(); 67 | context.closePath(); 68 | context.restore(); 69 | } 70 | 71 | return render; 72 | }; 73 | 74 | canvasSketch(sketch, settings); 75 | -------------------------------------------------------------------------------- /05-lines-displaced-curved/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | 3 | const size = 620; 4 | 5 | const settings = { 6 | dimensions: [size, size] 7 | }; 8 | 9 | const numRows = 40; 10 | const numCols = 40; 11 | 12 | const margin = 10; 13 | const sizeInner = size - 2 * margin; 14 | const widthCell = sizeInner / numCols; 15 | const heightCell = sizeInner / numRows; 16 | 17 | function cap(x, max) { 18 | return x > max ? max : x; 19 | } 20 | 21 | const sketch = ({ canvas, context, width, height }) => { 22 | canvas.addEventListener("click", render); 23 | 24 | function render() { 25 | context.fillStyle = "white"; 26 | context.fillRect(0, 0, width, height); 27 | context.save(); 28 | context.translate(margin, margin); 29 | context.strokeStyle = "black"; 30 | for (let i = 0; i < numRows; i += 1) { 31 | const points = []; 32 | for (let j = 0; j < numCols; j += 1) { 33 | points.push({ 34 | x: j * widthCell + widthCell / 2, 35 | y: 36 | heightCell / 2 + 37 | (Math.random() < 0.5 ? -1 : 1) * 38 | cap((i * j * 4) / (numRows * numCols), 1.4) * 39 | Math.floor(Math.random() * heightCell * 0.8) 40 | }); 41 | } 42 | 43 | context.save(); 44 | context.translate(0, i * heightCell); 45 | 46 | context.beginPath(); 47 | context.moveTo(points[0].x, points[0].y); 48 | for (let j = 1; j < numCols - 2; j += 1) { 49 | /* 50 | use points as control points and midpoint as end points to generate smooth curve 51 | https://stackoverflow.com/a/7058606 52 | */ 53 | const xEnd = (points[j].x + points[j + 1].x) / 2; 54 | const yEnd = (points[j].y + points[j + 1].y) / 2; 55 | context.quadraticCurveTo(points[j].x, points[j].y, xEnd, yEnd); 56 | } 57 | context.quadraticCurveTo( 58 | points[numCols - 2].x, 59 | points[numCols - 2].y, 60 | points[numCols - 1].x, 61 | points[numCols - 1].y 62 | ); 63 | 64 | context.stroke(); 65 | context.restore(); 66 | } 67 | context.restore(); 68 | } 69 | 70 | return render; 71 | }; 72 | 73 | canvasSketch(sketch, settings); 74 | -------------------------------------------------------------------------------- /09-shapes-tiled/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | 3 | const size = 620; 4 | 5 | const settings = { 6 | dimensions: [size, size] 7 | }; 8 | 9 | const numRows = 40; 10 | const numCols = numRows; 11 | 12 | const margin = 10; 13 | const sizeInner = size - 2 * margin; 14 | const widthCell = sizeInner / numCols; 15 | const heightCell = sizeInner / numRows; 16 | 17 | const sketch = ({ canvas, context, width, height }) => { 18 | canvas.addEventListener("click", render); 19 | 20 | function render() { 21 | context.fillStyle = "white"; 22 | context.fillRect(0, 0, width, height); 23 | context.save(); 24 | context.translate(margin, margin); 25 | context.fillStyle = "black"; 26 | context.strokeStyle = "black"; 27 | for (let i = 0; i < numRows; i += 1) { 28 | for (let j = 0; j < numCols; j += 1) { 29 | context.save(); 30 | context.translate(j * widthCell, i * heightCell); 31 | const shape = randomPickShape(); 32 | shape(context, widthCell, heightCell); 33 | context.restore(); 34 | } 35 | } 36 | context.restore(); 37 | } 38 | 39 | return render; 40 | }; 41 | 42 | canvasSketch(sketch, settings); 43 | 44 | function randomPickShape() { 45 | const choices = [circle, squares, triangle]; 46 | return choices[Math.floor(Math.random() * choices.length)]; 47 | } 48 | 49 | function circle(context, width, height) { 50 | context.beginPath(); 51 | context.arc(width / 2, height / 2, width * 0.35, 0, 2 * Math.PI); 52 | context.fill(); 53 | } 54 | 55 | function squares(context, width, height) { 56 | if (Math.random() < 0.5) { 57 | context.fillRect(0, 0, width / 2, height / 2); 58 | context.fillRect(width / 2, height / 2, width / 2, height / 2); 59 | } else { 60 | context.fillRect(width / 2, 0, width / 2, height / 2); 61 | context.fillRect(0, height / 2, width / 2, height / 2); 62 | } 63 | } 64 | 65 | function triangle(context, width, height) { 66 | context.beginPath(); 67 | if (Math.random() < 0.5) { 68 | context.moveTo(0, 0); 69 | context.lineTo(width, 0); 70 | context.lineTo(0, height); 71 | } else { 72 | context.moveTo(width, 0); 73 | context.lineTo(width, height); 74 | context.lineTo(0, height); 75 | } 76 | context.fill(); 77 | } 78 | -------------------------------------------------------------------------------- /15-shapes-tiled-colors/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | const palettes = require("nice-color-palettes"); 3 | 4 | const size = 620; 5 | 6 | const settings = { 7 | dimensions: [size, size] 8 | }; 9 | 10 | const numRows = 40; 11 | const numCols = numRows; 12 | 13 | const margin = 10; 14 | const sizeInner = size - 2 * margin; 15 | const widthCell = sizeInner / numCols; 16 | const heightCell = sizeInner / numRows; 17 | 18 | const sketch = ({ canvas, context, width, height }) => { 19 | canvas.addEventListener("click", render); 20 | 21 | function render() { 22 | context.fillStyle = "white"; 23 | context.fillRect(0, 0, width, height); 24 | context.save(); 25 | context.translate(margin, margin); 26 | const colors = palettes[Math.floor(Math.random() * palettes.length)]; 27 | for (let i = 0; i < numRows; i += 1) { 28 | for (let j = 0; j < numCols; j += 1) { 29 | context.save(); 30 | context.translate(j * widthCell, i * heightCell); 31 | const shape = randomPickShape(); 32 | const color = colors[Math.floor(Math.random() * colors.length)]; 33 | shape(context, widthCell, heightCell, color); 34 | context.restore(); 35 | } 36 | } 37 | context.restore(); 38 | } 39 | 40 | return render; 41 | }; 42 | 43 | canvasSketch(sketch, settings); 44 | 45 | function randomPickShape() { 46 | const choices = [circle, squares, triangle]; 47 | return choices[Math.floor(Math.random() * choices.length)]; 48 | } 49 | 50 | function circle(context, width, height, color) { 51 | context.beginPath(); 52 | context.arc(width / 2, height / 2, width * 0.35, 0, 2 * Math.PI); 53 | context.fillStyle = color; 54 | context.fill(); 55 | } 56 | 57 | function squares(context, width, height, color) { 58 | context.fillStyle = color; 59 | if (Math.random() < 0.5) { 60 | context.fillRect(0, 0, width / 2, height / 2); 61 | context.fillRect(width / 2, height / 2, width / 2, height / 2); 62 | } else { 63 | context.fillRect(width / 2, 0, width / 2, height / 2); 64 | context.fillRect(0, height / 2, width / 2, height / 2); 65 | } 66 | } 67 | 68 | function triangle(context, width, height, color) { 69 | context.fillStyle = color; 70 | context.strokeStyle = color; 71 | context.beginPath(); 72 | if (Math.random() < 0.5) { 73 | context.moveTo(0, 0); 74 | context.lineTo(width, 0); 75 | context.lineTo(0, height); 76 | } else { 77 | context.moveTo(width, 0); 78 | context.lineTo(width, height); 79 | context.lineTo(0, height); 80 | } 81 | context.fill(); 82 | } 83 | -------------------------------------------------------------------------------- /12-squares-recursive/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | 3 | const size = 620; 4 | 5 | const settings = { 6 | dimensions: [size, size] 7 | }; 8 | 9 | const numRows = 12; 10 | const numCols = numRows; 11 | 12 | const margin = 20; 13 | const sizeInner = size - 2 * margin; 14 | const widthCell = sizeInner / numCols; 15 | const heightCell = sizeInner / numRows; 16 | 17 | // north, northeast, east, ... 18 | const directions = "n ne e se s sw w nw".split(" "); 19 | const minLevels = 3; 20 | const maxLevels = 6; 21 | 22 | const sketch = ({ canvas, context, width, height }) => { 23 | canvas.addEventListener("click", render); 24 | 25 | function render() { 26 | context.fillStyle = "white"; 27 | context.fillRect(0, 0, width, height); 28 | context.save(); 29 | context.translate(margin, margin); 30 | context.strokeStyle = "#555"; 31 | context.lineWidth = 1.5; 32 | context.beginPath(); 33 | for (let i = 0; i < numRows; i += 1) { 34 | for (let j = 0; j < numCols; j += 1) { 35 | context.save(); 36 | context.translate(j * widthCell, i * heightCell); 37 | const numLevels = 38 | minLevels + Math.floor(Math.random() * (maxLevels + 1 - minLevels)); 39 | const direction = randomPick(directions); 40 | drawSquare(context, widthCell, 1, numLevels, direction); 41 | context.restore(); 42 | } 43 | } 44 | context.stroke(); 45 | context.restore(); 46 | } 47 | 48 | return render; 49 | }; 50 | 51 | canvasSketch(sketch, settings); 52 | 53 | function randomSign(x) { 54 | return Math.random() < 0.5 ? x : -x; 55 | } 56 | 57 | function drawSquare(context, size, level, maxLevel, direction = "") { 58 | if (level > maxLevel) { 59 | return; 60 | } 61 | const numSegments = 2 * maxLevel - 1; 62 | const gap = size / numSegments; 63 | const x = (level - 1) * gap; 64 | const y = x; 65 | const w = ((maxLevel - level) * 2 + 1) * gap; 66 | const h = w; 67 | 68 | let dx = 0; 69 | let dy = 0; 70 | 71 | if (direction.indexOf("n") >= 0) { 72 | dy += -(level - 1) * (gap / 2); 73 | } 74 | if (direction.indexOf("s") >= 0) { 75 | dy += (level - 1) * (gap / 2); 76 | } 77 | if (direction.indexOf("w") >= 0) { 78 | dx += -(level - 1) * (gap / 2); 79 | } 80 | if (direction.indexOf("e") >= 0) { 81 | dx += (level - 1) * (gap / 2); 82 | } 83 | 84 | context.translate(dx, dy); 85 | context.rect(x, y, w, h); 86 | context.translate(-dx, -dy); 87 | drawSquare(context, size, level + 1, maxLevel, direction); 88 | } 89 | 90 | function randomPick(choices) { 91 | const index = Math.floor(Math.random() * choices.length); 92 | return choices[index]; 93 | } 94 | -------------------------------------------------------------------------------- /06-lines-displaced-curved/sketch.js: -------------------------------------------------------------------------------- 1 | import canvasSketch from "canvas-sketch"; 2 | import { scaleLinear } from "d3-scale"; 3 | 4 | const size = 620; 5 | 6 | const settings = { 7 | dimensions: [size, size] 8 | }; 9 | 10 | const numRows = 30; 11 | const numCols = 20; 12 | 13 | const margin = 10; 14 | const sizeInner = size - 2 * margin; 15 | const widthCell = sizeInner / numCols; 16 | const heightCell = sizeInner / numRows; 17 | 18 | function cap(x, max) { 19 | return x > max ? max : x; 20 | } 21 | 22 | const sketch = ({ canvas, context, width, height }) => { 23 | canvas.addEventListener("click", render); 24 | 25 | function render() { 26 | context.fillStyle = "white"; 27 | context.fillRect(0, 0, width, height); 28 | context.save(); 29 | context.translate(margin, margin); 30 | context.fillStyle = "black"; 31 | context.fillRect(0, 0, sizeInner, sizeInner); 32 | context.strokeStyle = "white"; 33 | context.lineWidth = 2; 34 | const center = Math.floor(numCols / 2); 35 | 36 | const y = scaleLinear() 37 | .domain([0, center]) 38 | .range([heightCell, 0]); 39 | 40 | const maxOff = scaleLinear() 41 | .domain([0, center]) 42 | .range([heightCell * 5, 0]); 43 | 44 | for (let i = 4; i < numRows; i += 1) { 45 | const points = []; 46 | for (let j = 0; j < numCols; j += 1) { 47 | const toCenter = Math.abs(center - j); 48 | points.push({ 49 | x: j * widthCell + widthCell / 2, 50 | y: 51 | y(toCenter) - 52 | (Math.random() * maxOff(toCenter) * ((center - toCenter) * 2)) / 53 | (center * 2) 54 | }); 55 | } 56 | 57 | context.save(); 58 | context.translate(0, i * heightCell); 59 | 60 | context.beginPath(); 61 | context.moveTo(points[0].x, points[0].y); 62 | for (let j = 1; j < numCols - 2; j += 1) { 63 | /* 64 | use points as control points and midpoint as end points to generate smooth curve 65 | https://stackoverflow.com/a/7058606 66 | */ 67 | const xEnd = (points[j].x + points[j + 1].x) / 2; 68 | const yEnd = (points[j].y + points[j + 1].y) / 2; 69 | context.quadraticCurveTo(points[j].x, points[j].y, xEnd, yEnd); 70 | } 71 | context.quadraticCurveTo( 72 | points[numCols - 2].x, 73 | points[numCols - 2].y, 74 | points[numCols - 1].x, 75 | points[numCols - 1].y 76 | ); 77 | context.fillStyle = "black"; 78 | context.fill(); 79 | context.stroke(); 80 | context.restore(); 81 | } 82 | context.restore(); 83 | } 84 | 85 | return render; 86 | }; 87 | 88 | canvasSketch(sketch, settings); 89 | -------------------------------------------------------------------------------- /11-circle-displaced-repeated/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | const random = require("random"); 3 | 4 | const size = 620; 5 | 6 | const settings = { 7 | animate: true, 8 | dimensions: [size, size], 9 | loop: false, 10 | totalFrames: 1000 11 | }; 12 | 13 | const numPoints = 30; 14 | const margin = 10; 15 | 16 | const sketch = ({ context, width, height }) => { 17 | context.fillStyle = "white"; 18 | context.fillRect(0, 0, width, height); 19 | 20 | const cx = size / 2; 21 | const cy = cx; 22 | const r = size / 4; 23 | const gap = (2 * Math.PI) / numPoints; 24 | const off = random.normal(0, r / 6 / 3); 25 | 26 | const points = []; 27 | for (let i = 0; i < numPoints; i += 1) { 28 | const angle = i * gap; 29 | const x = r * Math.cos(angle) + cx; 30 | const y = r * Math.sin(angle) + cy; 31 | points.push({ 32 | _angle: angle, 33 | x, 34 | y 35 | }); 36 | } 37 | 38 | function angle(x, y) { 39 | const a = Math.atan2(y - cy, x - cx); 40 | return mod(a + 2 * Math.PI, 2 * Math.PI); 41 | } 42 | 43 | function render() { 44 | context.beginPath(); 45 | context.strokeStyle = "white"; 46 | context.lineWidth = margin; 47 | context.strokeRect(0, 0, size, size); 48 | //context.save(); 49 | //context.translate(margin, margin); 50 | context.beginPath(); 51 | context.moveTo(points[0].x, points[0].y); 52 | for (let i = 1; i < numPoints - 1; i += 1) { 53 | context.quadraticCurveTo( 54 | points[i].x, 55 | points[i].y, 56 | (points[i].x + points[i + 1].x) / 2, 57 | (points[i].y + points[i + 1].y) / 2 58 | ); 59 | } 60 | context.quadraticCurveTo( 61 | points[numPoints - 1].x, 62 | points[numPoints - 1].y, 63 | points[0].x, 64 | points[0].y 65 | ); 66 | context.strokeStyle = "rgba(50, 50, 50, 0.04)"; 67 | context.lineWidth = 1; 68 | context.stroke(); 69 | //context.restore(); 70 | 71 | for (let i = 0; i < numPoints; i += 1) { 72 | const point = points[i]; 73 | if (Math.random() < 0.1) { 74 | const xNew = point.x + off(); 75 | const yNew = point.y + off(); 76 | const a = angle(xNew, yNew); 77 | let s = mod(point._angle - gap / 3, 2 * Math.PI); 78 | let e = mod(point._angle + gap / 3, 2 * Math.PI); 79 | if (i == 0 && (a > s || a < e)) { 80 | point.x = xNew; 81 | point.y = yNew; 82 | } else if (a > s && a < e) { 83 | point.x = xNew; 84 | point.y = yNew; 85 | } 86 | } 87 | } 88 | } 89 | 90 | return render; 91 | }; 92 | 93 | canvasSketch(sketch, settings); 94 | 95 | function mod(n, m) { 96 | return ((n % m) + m) % m; 97 | } 98 | -------------------------------------------------------------------------------- /16-braids/scratch/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | 3 | const size = 600; 4 | 5 | const settings = { 6 | dimensions: [size, size] 7 | }; 8 | 9 | const sketch = ({ canvas, context, width, height }) => { 10 | canvas.addEventListener("click", render); 11 | 12 | function render() { 13 | context.fillStyle = "white"; 14 | context.fillRect(0, 0, width, height); 15 | context.strokeStyle = "black"; 16 | context.lineCap = "round"; 17 | context.lineWidth = 25; 18 | const p = Math.random(); 19 | if (p < 1 / 3) { 20 | context.beginPath(); 21 | context.strokeStyle = "lavender"; 22 | context.moveTo(width * 0.25, 0); 23 | context.lineTo(width * 0.25, height); 24 | context.stroke(); 25 | 26 | context.beginPath(); 27 | context.strokeStyle = "lightpink"; 28 | context.moveTo(width * 0.75, 0); 29 | context.lineTo(width * 0.75, height); 30 | context.stroke(); 31 | } else if (p < 2 / 3) { 32 | context.beginPath(); 33 | context.strokeStyle = "lavender"; 34 | context.moveTo(width * 0.25, 0); 35 | context.lineTo(width * 0.25, height * 0.2); 36 | context.bezierCurveTo( 37 | width * 0.25, 38 | height * 0.6, 39 | width * 0.75, 40 | height * 0.4, 41 | width * 0.75, 42 | height * 0.8 43 | ); 44 | context.lineTo(width * 0.75, height); 45 | context.stroke(); 46 | 47 | context.beginPath(); 48 | context.strokeStyle = "lightpink"; 49 | context.moveTo(width * 0.75, 0); 50 | context.lineTo(width * 0.75, height * 0.2); 51 | context.bezierCurveTo( 52 | width * 0.75, 53 | height * 0.6, 54 | width * 0.25, 55 | height * 0.4, 56 | width * 0.25, 57 | height * 0.8 58 | ); 59 | context.lineTo(width * 0.25, height); 60 | context.stroke(); 61 | } else { 62 | context.beginPath(); 63 | context.strokeStyle = "lightpink"; 64 | context.moveTo(width * 0.75, 0); 65 | context.lineTo(width * 0.75, height * 0.2); 66 | context.bezierCurveTo( 67 | width * 0.75, 68 | height * 0.6, 69 | width * 0.25, 70 | height * 0.4, 71 | width * 0.25, 72 | height * 0.8 73 | ); 74 | context.lineTo(width * 0.25, height); 75 | context.stroke(); 76 | 77 | context.beginPath(); 78 | context.strokeStyle = "lavender"; 79 | context.moveTo(width * 0.25, 0); 80 | context.lineTo(width * 0.25, height * 0.2); 81 | context.bezierCurveTo( 82 | width * 0.25, 83 | height * 0.6, 84 | width * 0.75, 85 | height * 0.4, 86 | width * 0.75, 87 | height * 0.8 88 | ); 89 | context.lineTo(width * 0.75, height); 90 | context.stroke(); 91 | } 92 | } 93 | 94 | return render; 95 | }; 96 | 97 | canvasSketch(sketch, settings); 98 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | My attempt to reproduce some of the examples from 2 | Tim Holman's [Generative Art Speedrun talk](https://www.youtube.com/watch?v=4Se0_w0ISYk). 3 | 4 | ## Examples 5 | 6 | ### [Tiled diagonal lines](01-lines-tiled/) 7 | 8 | 9 | 10 | 11 | 12 | ### [Tiled horizontal and vertical lines](02-lines-tiled/) 13 | 14 | 15 | 16 | 17 | 18 | ### [Displaced lines](03-lines-displaced/) 19 | 20 | 21 | 22 | 23 | 24 | ### [Tiled curves](04-curves-tiled/) 25 | 26 | 27 | 28 | 29 | 30 | ### [Displaced curved lines](05-lines-displaced-curved/) 31 | 32 | 33 | 34 | 35 | 36 | ### [Displaced (center) curved lines ("Joy Division cover")](06-lines-displaced-curved/) 37 | 38 | 39 | 40 | 41 | 42 | ### [Repeated curve](07-curve-repeated/) 43 | 44 | 45 | 46 | 47 | 48 | ### [Tiled shapes](09-shapes-tiled/) 49 | 50 | 51 | 52 | 53 | 54 | ### [Displaced squares ("Cubic disarray")](10-squares-displaced/) 55 | 56 | 57 | 58 | 59 | 60 | ### [Displaced repeated circle](11-circle-displaced-repeated/) 61 | 62 | 63 | 64 | 65 | 66 | ### [Recursive squares](12-squares-recursive/) 67 | 68 | 69 | 70 | 71 | 72 | ### [Recursive displaced repeated triangle](13-triangle-recursive/) 73 | 74 | 75 | 76 | 77 | 78 | ### [Circular branches](14-branches-circular/) 79 | 80 | 81 | 82 | 83 | 84 | ### [Colored tiled shapes](15-shapes-tiled-colors/) 85 | 86 | 87 | 88 | 89 | 90 | ### [Colored braids](16-braids/) 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /13-triangle-recursive/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | const random = require("random"); 3 | 4 | const size = 620; 5 | 6 | const settings = { 7 | dimensions: [size, size] 8 | }; 9 | 10 | const margin = 60; 11 | const sizeInner = size - 2 * margin; 12 | 13 | const maxLevel = 3; 14 | const repeat = 20; 15 | 16 | const sketch = ({ canvas, context, width, height }) => { 17 | canvas.addEventListener("click", render); 18 | 19 | function render() { 20 | context.fillStyle = "white"; 21 | context.fillRect(0, 0, width, height); 22 | context.save(); 23 | context.translate(margin, margin); 24 | draw( 25 | context, 26 | { x: sizeInner / 2 + off1(), y: 0 + off1() }, 27 | { x: 0 + off1(), y: sizeInner + off1() }, 28 | { x: sizeInner + off1(), y: sizeInner + off1() }, 29 | 1, 30 | maxLevel 31 | ); 32 | context.restore(); 33 | } 34 | 35 | return render; 36 | }; 37 | 38 | canvasSketch(sketch, settings); 39 | 40 | function draw(context, p1, p2, p3, level, maxLevel) { 41 | const midpoints = [ 42 | { 43 | x: p2.x + (p3.x - p2.x) * 0.25 + off1(), 44 | y: p1.y + (p2.y - p1.y) / 2 + off1() 45 | }, 46 | { 47 | x: p2.x + (p3.x - p2.x) * 0.75 + off1(), 48 | y: p1.y + (p2.y - p1.y) / 2 + off1() 49 | }, 50 | { x: p2.x + (p3.x - p2.x) * 0.5 + off1(), y: p2.y + off1() } 51 | ]; 52 | 53 | if (level === maxLevel) { 54 | triangle(context, p1, midpoints[0], midpoints[1]); 55 | triangle(context, midpoints[0], p2, midpoints[2]); 56 | triangle(context, midpoints[1], midpoints[2], p3); 57 | for (let i = 0; i < repeat; i += 1) { 58 | triangle( 59 | context, 60 | { x: p1.x + off2(), y: p1.y + off2() }, 61 | { x: midpoints[0].x + off2(), y: midpoints[0].y + off2() }, 62 | { x: midpoints[1].x + off2(), y: midpoints[1].y + off2() } 63 | ); 64 | triangle( 65 | context, 66 | { x: midpoints[0].x + off2(), y: midpoints[0].y + off2() }, 67 | { x: p2.x + off2(), y: p2.y + off2() }, 68 | { x: midpoints[2].x + off2(), y: midpoints[2].y + off2() } 69 | ); 70 | triangle( 71 | context, 72 | { x: midpoints[1].x + off2(), y: midpoints[1].y + off2() }, 73 | { x: midpoints[2].x + off2(), y: midpoints[2].y + off2() }, 74 | { x: p3.x + off2(), y: p3.y + off2() } 75 | ); 76 | } 77 | return; 78 | } 79 | 80 | draw(context, p1, midpoints[0], midpoints[1], level + 1, maxLevel); 81 | draw(context, midpoints[0], p2, midpoints[2], level + 1, maxLevel); 82 | draw(context, midpoints[1], midpoints[2], p3, level + 1, maxLevel); 83 | } 84 | 85 | function triangle(context, p1, p2, p3) { 86 | context.beginPath(); 87 | context.strokeStyle = "rgba(0,0,0,0.25)"; 88 | context.lineWidth = 2; 89 | context.moveTo(p1.x, p1.y); 90 | context.lineTo(p2.x, p2.y); 91 | context.lineTo(p3.x, p3.y); 92 | context.closePath(); 93 | context.stroke(); 94 | } 95 | 96 | function off1() { 97 | return random.normal(0, 8)(); 98 | } 99 | 100 | function off2() { 101 | return random.normal(0, 4)(); 102 | } 103 | -------------------------------------------------------------------------------- /16-braids/scratch/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "scratch", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "canvas-sketch": { 8 | "version": "0.2.0", 9 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 10 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 11 | "requires": { 12 | "convert-length": "^1.0.1", 13 | "dateformat": "^3.0.3", 14 | "deep-equal": "^1.0.1", 15 | "defined": "^1.0.0", 16 | "get-canvas-context": "^1.0.2", 17 | "is-class": "0.0.5", 18 | "is-dom": "^1.0.9", 19 | "is-promise": "^2.1.0", 20 | "object-assign": "^4.1.1", 21 | "pad-left": "^2.1.0", 22 | "right-now": "^1.0.0", 23 | "two.js": "^0.7.0-beta.1" 24 | } 25 | }, 26 | "convert-length": { 27 | "version": "1.0.1", 28 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 29 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 30 | "requires": { 31 | "defined": "^1.0.0" 32 | } 33 | }, 34 | "dateformat": { 35 | "version": "3.0.3", 36 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 37 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 38 | }, 39 | "deep-equal": { 40 | "version": "1.0.1", 41 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 42 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 43 | }, 44 | "defined": { 45 | "version": "1.0.0", 46 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 47 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 48 | }, 49 | "get-canvas-context": { 50 | "version": "1.0.2", 51 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 52 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 53 | }, 54 | "is-class": { 55 | "version": "0.0.5", 56 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 57 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 58 | }, 59 | "is-dom": { 60 | "version": "1.0.9", 61 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 62 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 63 | }, 64 | "is-promise": { 65 | "version": "2.1.0", 66 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 67 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 68 | }, 69 | "object-assign": { 70 | "version": "4.1.1", 71 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 72 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 73 | }, 74 | "pad-left": { 75 | "version": "2.1.0", 76 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 77 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 78 | "requires": { 79 | "repeat-string": "^1.5.4" 80 | } 81 | }, 82 | "repeat-string": { 83 | "version": "1.6.1", 84 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 85 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 86 | }, 87 | "right-now": { 88 | "version": "1.0.0", 89 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 90 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 91 | }, 92 | "two.js": { 93 | "version": "0.7.0-beta.3", 94 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 95 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /01-lines-tiled/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "01-lines-tiled", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "canvas-sketch": { 8 | "version": "0.2.0", 9 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 10 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 11 | "requires": { 12 | "convert-length": "^1.0.1", 13 | "dateformat": "^3.0.3", 14 | "deep-equal": "^1.0.1", 15 | "defined": "^1.0.0", 16 | "get-canvas-context": "^1.0.2", 17 | "is-class": "0.0.5", 18 | "is-dom": "^1.0.9", 19 | "is-promise": "^2.1.0", 20 | "object-assign": "^4.1.1", 21 | "pad-left": "^2.1.0", 22 | "right-now": "^1.0.0", 23 | "two.js": "^0.7.0-beta.1" 24 | } 25 | }, 26 | "convert-length": { 27 | "version": "1.0.1", 28 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 29 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 30 | "requires": { 31 | "defined": "^1.0.0" 32 | } 33 | }, 34 | "dateformat": { 35 | "version": "3.0.3", 36 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 37 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 38 | }, 39 | "deep-equal": { 40 | "version": "1.0.1", 41 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 42 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 43 | }, 44 | "defined": { 45 | "version": "1.0.0", 46 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 47 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 48 | }, 49 | "get-canvas-context": { 50 | "version": "1.0.2", 51 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 52 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 53 | }, 54 | "is-class": { 55 | "version": "0.0.5", 56 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 57 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 58 | }, 59 | "is-dom": { 60 | "version": "1.0.9", 61 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 62 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 63 | }, 64 | "is-promise": { 65 | "version": "2.1.0", 66 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 67 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 68 | }, 69 | "object-assign": { 70 | "version": "4.1.1", 71 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 72 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 73 | }, 74 | "pad-left": { 75 | "version": "2.1.0", 76 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 77 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 78 | "requires": { 79 | "repeat-string": "^1.5.4" 80 | } 81 | }, 82 | "repeat-string": { 83 | "version": "1.6.1", 84 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 85 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 86 | }, 87 | "right-now": { 88 | "version": "1.0.0", 89 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 90 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 91 | }, 92 | "two.js": { 93 | "version": "0.7.0-beta.3", 94 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 95 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /02-lines-tiled/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "02-lines-tiled", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "canvas-sketch": { 8 | "version": "0.2.0", 9 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 10 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 11 | "requires": { 12 | "convert-length": "^1.0.1", 13 | "dateformat": "^3.0.3", 14 | "deep-equal": "^1.0.1", 15 | "defined": "^1.0.0", 16 | "get-canvas-context": "^1.0.2", 17 | "is-class": "0.0.5", 18 | "is-dom": "^1.0.9", 19 | "is-promise": "^2.1.0", 20 | "object-assign": "^4.1.1", 21 | "pad-left": "^2.1.0", 22 | "right-now": "^1.0.0", 23 | "two.js": "^0.7.0-beta.1" 24 | } 25 | }, 26 | "convert-length": { 27 | "version": "1.0.1", 28 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 29 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 30 | "requires": { 31 | "defined": "^1.0.0" 32 | } 33 | }, 34 | "dateformat": { 35 | "version": "3.0.3", 36 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 37 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 38 | }, 39 | "deep-equal": { 40 | "version": "1.0.1", 41 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 42 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 43 | }, 44 | "defined": { 45 | "version": "1.0.0", 46 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 47 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 48 | }, 49 | "get-canvas-context": { 50 | "version": "1.0.2", 51 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 52 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 53 | }, 54 | "is-class": { 55 | "version": "0.0.5", 56 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 57 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 58 | }, 59 | "is-dom": { 60 | "version": "1.0.9", 61 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 62 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 63 | }, 64 | "is-promise": { 65 | "version": "2.1.0", 66 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 67 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 68 | }, 69 | "object-assign": { 70 | "version": "4.1.1", 71 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 72 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 73 | }, 74 | "pad-left": { 75 | "version": "2.1.0", 76 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 77 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 78 | "requires": { 79 | "repeat-string": "^1.5.4" 80 | } 81 | }, 82 | "repeat-string": { 83 | "version": "1.6.1", 84 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 85 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 86 | }, 87 | "right-now": { 88 | "version": "1.0.0", 89 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 90 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 91 | }, 92 | "two.js": { 93 | "version": "0.7.0-beta.3", 94 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 95 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /04-curves-tiled/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "04-curves-tiled", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "canvas-sketch": { 8 | "version": "0.2.0", 9 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 10 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 11 | "requires": { 12 | "convert-length": "^1.0.1", 13 | "dateformat": "^3.0.3", 14 | "deep-equal": "^1.0.1", 15 | "defined": "^1.0.0", 16 | "get-canvas-context": "^1.0.2", 17 | "is-class": "0.0.5", 18 | "is-dom": "^1.0.9", 19 | "is-promise": "^2.1.0", 20 | "object-assign": "^4.1.1", 21 | "pad-left": "^2.1.0", 22 | "right-now": "^1.0.0", 23 | "two.js": "^0.7.0-beta.1" 24 | } 25 | }, 26 | "convert-length": { 27 | "version": "1.0.1", 28 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 29 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 30 | "requires": { 31 | "defined": "^1.0.0" 32 | } 33 | }, 34 | "dateformat": { 35 | "version": "3.0.3", 36 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 37 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 38 | }, 39 | "deep-equal": { 40 | "version": "1.0.1", 41 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 42 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 43 | }, 44 | "defined": { 45 | "version": "1.0.0", 46 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 47 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 48 | }, 49 | "get-canvas-context": { 50 | "version": "1.0.2", 51 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 52 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 53 | }, 54 | "is-class": { 55 | "version": "0.0.5", 56 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 57 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 58 | }, 59 | "is-dom": { 60 | "version": "1.0.9", 61 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 62 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 63 | }, 64 | "is-promise": { 65 | "version": "2.1.0", 66 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 67 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 68 | }, 69 | "object-assign": { 70 | "version": "4.1.1", 71 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 72 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 73 | }, 74 | "pad-left": { 75 | "version": "2.1.0", 76 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 77 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 78 | "requires": { 79 | "repeat-string": "^1.5.4" 80 | } 81 | }, 82 | "repeat-string": { 83 | "version": "1.6.1", 84 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 85 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 86 | }, 87 | "right-now": { 88 | "version": "1.0.0", 89 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 90 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 91 | }, 92 | "two.js": { 93 | "version": "0.7.0-beta.3", 94 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 95 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /09-shapes-tiled/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "09-shapes-tiled", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "canvas-sketch": { 8 | "version": "0.2.0", 9 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 10 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 11 | "requires": { 12 | "convert-length": "^1.0.1", 13 | "dateformat": "^3.0.3", 14 | "deep-equal": "^1.0.1", 15 | "defined": "^1.0.0", 16 | "get-canvas-context": "^1.0.2", 17 | "is-class": "0.0.5", 18 | "is-dom": "^1.0.9", 19 | "is-promise": "^2.1.0", 20 | "object-assign": "^4.1.1", 21 | "pad-left": "^2.1.0", 22 | "right-now": "^1.0.0", 23 | "two.js": "^0.7.0-beta.1" 24 | } 25 | }, 26 | "convert-length": { 27 | "version": "1.0.1", 28 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 29 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 30 | "requires": { 31 | "defined": "^1.0.0" 32 | } 33 | }, 34 | "dateformat": { 35 | "version": "3.0.3", 36 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 37 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 38 | }, 39 | "deep-equal": { 40 | "version": "1.0.1", 41 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 42 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 43 | }, 44 | "defined": { 45 | "version": "1.0.0", 46 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 47 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 48 | }, 49 | "get-canvas-context": { 50 | "version": "1.0.2", 51 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 52 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 53 | }, 54 | "is-class": { 55 | "version": "0.0.5", 56 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 57 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 58 | }, 59 | "is-dom": { 60 | "version": "1.0.9", 61 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 62 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 63 | }, 64 | "is-promise": { 65 | "version": "2.1.0", 66 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 67 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 68 | }, 69 | "object-assign": { 70 | "version": "4.1.1", 71 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 72 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 73 | }, 74 | "pad-left": { 75 | "version": "2.1.0", 76 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 77 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 78 | "requires": { 79 | "repeat-string": "^1.5.4" 80 | } 81 | }, 82 | "repeat-string": { 83 | "version": "1.6.1", 84 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 85 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 86 | }, 87 | "right-now": { 88 | "version": "1.0.0", 89 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 90 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 91 | }, 92 | "two.js": { 93 | "version": "0.7.0-beta.3", 94 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 95 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /03-lines-displaced/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "03-lines-displaced", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "canvas-sketch": { 8 | "version": "0.2.0", 9 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 10 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 11 | "requires": { 12 | "convert-length": "^1.0.1", 13 | "dateformat": "^3.0.3", 14 | "deep-equal": "^1.0.1", 15 | "defined": "^1.0.0", 16 | "get-canvas-context": "^1.0.2", 17 | "is-class": "0.0.5", 18 | "is-dom": "^1.0.9", 19 | "is-promise": "^2.1.0", 20 | "object-assign": "^4.1.1", 21 | "pad-left": "^2.1.0", 22 | "right-now": "^1.0.0", 23 | "two.js": "^0.7.0-beta.1" 24 | } 25 | }, 26 | "convert-length": { 27 | "version": "1.0.1", 28 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 29 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 30 | "requires": { 31 | "defined": "^1.0.0" 32 | } 33 | }, 34 | "dateformat": { 35 | "version": "3.0.3", 36 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 37 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 38 | }, 39 | "deep-equal": { 40 | "version": "1.0.1", 41 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 42 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 43 | }, 44 | "defined": { 45 | "version": "1.0.0", 46 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 47 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 48 | }, 49 | "get-canvas-context": { 50 | "version": "1.0.2", 51 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 52 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 53 | }, 54 | "is-class": { 55 | "version": "0.0.5", 56 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 57 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 58 | }, 59 | "is-dom": { 60 | "version": "1.0.9", 61 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 62 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 63 | }, 64 | "is-promise": { 65 | "version": "2.1.0", 66 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 67 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 68 | }, 69 | "object-assign": { 70 | "version": "4.1.1", 71 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 72 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 73 | }, 74 | "pad-left": { 75 | "version": "2.1.0", 76 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 77 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 78 | "requires": { 79 | "repeat-string": "^1.5.4" 80 | } 81 | }, 82 | "repeat-string": { 83 | "version": "1.6.1", 84 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 85 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 86 | }, 87 | "right-now": { 88 | "version": "1.0.0", 89 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 90 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 91 | }, 92 | "two.js": { 93 | "version": "0.7.0-beta.3", 94 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 95 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /10-squares-displaced/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "10-squares-displaced", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "canvas-sketch": { 8 | "version": "0.2.0", 9 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 10 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 11 | "requires": { 12 | "convert-length": "^1.0.1", 13 | "dateformat": "^3.0.3", 14 | "deep-equal": "^1.0.1", 15 | "defined": "^1.0.0", 16 | "get-canvas-context": "^1.0.2", 17 | "is-class": "0.0.5", 18 | "is-dom": "^1.0.9", 19 | "is-promise": "^2.1.0", 20 | "object-assign": "^4.1.1", 21 | "pad-left": "^2.1.0", 22 | "right-now": "^1.0.0", 23 | "two.js": "^0.7.0-beta.1" 24 | } 25 | }, 26 | "convert-length": { 27 | "version": "1.0.1", 28 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 29 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 30 | "requires": { 31 | "defined": "^1.0.0" 32 | } 33 | }, 34 | "dateformat": { 35 | "version": "3.0.3", 36 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 37 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 38 | }, 39 | "deep-equal": { 40 | "version": "1.0.1", 41 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 42 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 43 | }, 44 | "defined": { 45 | "version": "1.0.0", 46 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 47 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 48 | }, 49 | "get-canvas-context": { 50 | "version": "1.0.2", 51 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 52 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 53 | }, 54 | "is-class": { 55 | "version": "0.0.5", 56 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 57 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 58 | }, 59 | "is-dom": { 60 | "version": "1.0.9", 61 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 62 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 63 | }, 64 | "is-promise": { 65 | "version": "2.1.0", 66 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 67 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 68 | }, 69 | "object-assign": { 70 | "version": "4.1.1", 71 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 72 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 73 | }, 74 | "pad-left": { 75 | "version": "2.1.0", 76 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 77 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 78 | "requires": { 79 | "repeat-string": "^1.5.4" 80 | } 81 | }, 82 | "repeat-string": { 83 | "version": "1.6.1", 84 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 85 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 86 | }, 87 | "right-now": { 88 | "version": "1.0.0", 89 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 90 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 91 | }, 92 | "two.js": { 93 | "version": "0.7.0-beta.3", 94 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 95 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /12-squares-recursive/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "12-squares-recursive", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "canvas-sketch": { 8 | "version": "0.2.0", 9 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 10 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 11 | "requires": { 12 | "convert-length": "^1.0.1", 13 | "dateformat": "^3.0.3", 14 | "deep-equal": "^1.0.1", 15 | "defined": "^1.0.0", 16 | "get-canvas-context": "^1.0.2", 17 | "is-class": "0.0.5", 18 | "is-dom": "^1.0.9", 19 | "is-promise": "^2.1.0", 20 | "object-assign": "^4.1.1", 21 | "pad-left": "^2.1.0", 22 | "right-now": "^1.0.0", 23 | "two.js": "^0.7.0-beta.1" 24 | } 25 | }, 26 | "convert-length": { 27 | "version": "1.0.1", 28 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 29 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 30 | "requires": { 31 | "defined": "^1.0.0" 32 | } 33 | }, 34 | "dateformat": { 35 | "version": "3.0.3", 36 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 37 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 38 | }, 39 | "deep-equal": { 40 | "version": "1.0.1", 41 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 42 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 43 | }, 44 | "defined": { 45 | "version": "1.0.0", 46 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 47 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 48 | }, 49 | "get-canvas-context": { 50 | "version": "1.0.2", 51 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 52 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 53 | }, 54 | "is-class": { 55 | "version": "0.0.5", 56 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 57 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 58 | }, 59 | "is-dom": { 60 | "version": "1.0.9", 61 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 62 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 63 | }, 64 | "is-promise": { 65 | "version": "2.1.0", 66 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 67 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 68 | }, 69 | "object-assign": { 70 | "version": "4.1.1", 71 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 72 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 73 | }, 74 | "pad-left": { 75 | "version": "2.1.0", 76 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 77 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 78 | "requires": { 79 | "repeat-string": "^1.5.4" 80 | } 81 | }, 82 | "repeat-string": { 83 | "version": "1.6.1", 84 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 85 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 86 | }, 87 | "right-now": { 88 | "version": "1.0.0", 89 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 90 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 91 | }, 92 | "two.js": { 93 | "version": "0.7.0-beta.3", 94 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 95 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /14-branches-circular/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "14-branches-circular", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "canvas-sketch": { 8 | "version": "0.2.0", 9 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 10 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 11 | "requires": { 12 | "convert-length": "^1.0.1", 13 | "dateformat": "^3.0.3", 14 | "deep-equal": "^1.0.1", 15 | "defined": "^1.0.0", 16 | "get-canvas-context": "^1.0.2", 17 | "is-class": "0.0.5", 18 | "is-dom": "^1.0.9", 19 | "is-promise": "^2.1.0", 20 | "object-assign": "^4.1.1", 21 | "pad-left": "^2.1.0", 22 | "right-now": "^1.0.0", 23 | "two.js": "^0.7.0-beta.1" 24 | } 25 | }, 26 | "convert-length": { 27 | "version": "1.0.1", 28 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 29 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 30 | "requires": { 31 | "defined": "^1.0.0" 32 | } 33 | }, 34 | "dateformat": { 35 | "version": "3.0.3", 36 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 37 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 38 | }, 39 | "deep-equal": { 40 | "version": "1.0.1", 41 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 42 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 43 | }, 44 | "defined": { 45 | "version": "1.0.0", 46 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 47 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 48 | }, 49 | "get-canvas-context": { 50 | "version": "1.0.2", 51 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 52 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 53 | }, 54 | "is-class": { 55 | "version": "0.0.5", 56 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 57 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 58 | }, 59 | "is-dom": { 60 | "version": "1.0.9", 61 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 62 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 63 | }, 64 | "is-promise": { 65 | "version": "2.1.0", 66 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 67 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 68 | }, 69 | "object-assign": { 70 | "version": "4.1.1", 71 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 72 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 73 | }, 74 | "pad-left": { 75 | "version": "2.1.0", 76 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 77 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 78 | "requires": { 79 | "repeat-string": "^1.5.4" 80 | } 81 | }, 82 | "repeat-string": { 83 | "version": "1.6.1", 84 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 85 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 86 | }, 87 | "right-now": { 88 | "version": "1.0.0", 89 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 90 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 91 | }, 92 | "two.js": { 93 | "version": "0.7.0-beta.3", 94 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 95 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /05-lines-displaced-curved/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "05-lines-displaced-curved", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "canvas-sketch": { 8 | "version": "0.2.0", 9 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 10 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 11 | "requires": { 12 | "convert-length": "^1.0.1", 13 | "dateformat": "^3.0.3", 14 | "deep-equal": "^1.0.1", 15 | "defined": "^1.0.0", 16 | "get-canvas-context": "^1.0.2", 17 | "is-class": "0.0.5", 18 | "is-dom": "^1.0.9", 19 | "is-promise": "^2.1.0", 20 | "object-assign": "^4.1.1", 21 | "pad-left": "^2.1.0", 22 | "right-now": "^1.0.0", 23 | "two.js": "^0.7.0-beta.1" 24 | } 25 | }, 26 | "convert-length": { 27 | "version": "1.0.1", 28 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 29 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 30 | "requires": { 31 | "defined": "^1.0.0" 32 | } 33 | }, 34 | "dateformat": { 35 | "version": "3.0.3", 36 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 37 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 38 | }, 39 | "deep-equal": { 40 | "version": "1.0.1", 41 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 42 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 43 | }, 44 | "defined": { 45 | "version": "1.0.0", 46 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 47 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 48 | }, 49 | "get-canvas-context": { 50 | "version": "1.0.2", 51 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 52 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 53 | }, 54 | "is-class": { 55 | "version": "0.0.5", 56 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 57 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 58 | }, 59 | "is-dom": { 60 | "version": "1.0.9", 61 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 62 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 63 | }, 64 | "is-promise": { 65 | "version": "2.1.0", 66 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 67 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 68 | }, 69 | "object-assign": { 70 | "version": "4.1.1", 71 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 72 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 73 | }, 74 | "pad-left": { 75 | "version": "2.1.0", 76 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 77 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 78 | "requires": { 79 | "repeat-string": "^1.5.4" 80 | } 81 | }, 82 | "repeat-string": { 83 | "version": "1.6.1", 84 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 85 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 86 | }, 87 | "right-now": { 88 | "version": "1.0.0", 89 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 90 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 91 | }, 92 | "two.js": { 93 | "version": "0.7.0-beta.3", 94 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 95 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /16-braids/sketch.js: -------------------------------------------------------------------------------- 1 | const canvasSketch = require("canvas-sketch"); 2 | const palettes = require("nice-color-palettes"); 3 | 4 | const size = 620; 5 | 6 | const settings = { 7 | dimensions: [size, size] 8 | }; 9 | 10 | const numRows = 10; 11 | const numCols = 20; 12 | 13 | const margin = 20; 14 | const sizeInner = size - 2 * margin; 15 | const widthCell = sizeInner / numCols; 16 | const heightCell = sizeInner / numRows; 17 | const pCross = 0.5; 18 | 19 | const sketch = ({ canvas, context, width, height }) => { 20 | canvas.addEventListener("click", render); 21 | 22 | function render() { 23 | context.fillStyle = "white"; 24 | context.fillRect(0, 0, width, height); 25 | context.save(); 26 | context.translate(margin, margin); 27 | const colors = genColors(); 28 | context.lineWidth = Math.floor(widthCell / 4); 29 | 30 | // keep track of previous row to avoid immediately "inversing" a crossing 31 | // cf. http://rectangleworld.com/blog/archives/733 32 | // 0: no crossing, 1: crossing "right-on-top" 2: crossing: "left-on-top" 33 | const states = new Array(numCols).fill(0); 34 | 35 | for (let i = 0; i < numRows; i += 1) { 36 | for (let j = 0; j < numCols; ) { 37 | context.save(); 38 | context.translate(j * widthCell, i * heightCell); 39 | const r = Math.random(); 40 | 41 | if (j === numCols - 1 || r > pCross) { 42 | line( 43 | context, 44 | widthCell * 0.5, 45 | 0, 46 | widthCell * 0.5, 47 | heightCell, 48 | colors[j] 49 | ); 50 | states[j] = 0; 51 | j += 1; 52 | } else { 53 | if (states[j] === 1) { 54 | crossing( 55 | context, 56 | widthCell * 0.5, 57 | 0, 58 | widthCell * 1.5, 59 | heightCell, 60 | widthCell * 1.5, 61 | 0, 62 | widthCell * 0.5, 63 | heightCell, 64 | colors[j], 65 | colors[j + 1] 66 | ); 67 | } else if (states[j] === 2) { 68 | crossing( 69 | context, 70 | widthCell * 1.5, 71 | 0, 72 | widthCell * 0.5, 73 | heightCell, 74 | widthCell * 0.5, 75 | 0, 76 | widthCell * 1.5, 77 | heightCell, 78 | colors[j + 1], 79 | colors[j] 80 | ); 81 | } else { 82 | if (Math.random() < 0.5) { 83 | crossing( 84 | context, 85 | widthCell * 0.5, 86 | 0, 87 | widthCell * 1.5, 88 | heightCell, 89 | widthCell * 1.5, 90 | 0, 91 | widthCell * 0.5, 92 | heightCell, 93 | colors[j], 94 | colors[j + 1] 95 | ); 96 | states[j] = 1; 97 | } else { 98 | crossing( 99 | context, 100 | widthCell * 1.5, 101 | 0, 102 | widthCell * 0.5, 103 | heightCell, 104 | widthCell * 0.5, 105 | 0, 106 | widthCell * 1.5, 107 | heightCell, 108 | colors[j + 1], 109 | colors[j] 110 | ); 111 | states[j] = 2; 112 | } 113 | } 114 | [colors[j], colors[j + 1]] = [colors[j + 1], colors[j]]; 115 | j += 2; 116 | } 117 | context.restore(); 118 | } 119 | } 120 | context.restore(); 121 | } 122 | 123 | return render; 124 | }; 125 | 126 | canvasSketch(sketch, settings); 127 | 128 | function genColors() { 129 | const palette = palettes[Math.floor(Math.random() * palettes.length)]; 130 | const colors = []; 131 | for (let i = 0; i < numCols; i += 1) { 132 | colors.push(palette[Math.floor(Math.random() * palette.length)]); 133 | } 134 | return colors; 135 | } 136 | 137 | function line(context, x1, y1, x2, y2, color) { 138 | context.beginPath(); 139 | context.strokeStyle = color; 140 | context.moveTo(x1, y1); 141 | context.lineTo(x2, y2); 142 | context.stroke(); 143 | } 144 | 145 | function curve(context, x1, y1, x2, y2, color) { 146 | context.beginPath(); 147 | context.strokeStyle = color; 148 | context.moveTo(x1, y1); 149 | const h = y2 - y1; 150 | context.lineTo(x1, y1 + h * 0.2); 151 | context.bezierCurveTo(x1, y1 + h * 0.6, x2, y1 + h * 0.4, x2, y1 + h * 0.8); 152 | context.lineTo(x2, y2); 153 | context.stroke(); 154 | } 155 | 156 | function crossing( 157 | context, 158 | x1_1, 159 | y1_1, 160 | x1_2, 161 | y1_2, 162 | x2_1, 163 | y2_1, 164 | x2_2, 165 | y2_2, 166 | color1, 167 | color2 168 | ) { 169 | curve(context, x1_1, y1_1, x1_2, y1_2, color1); 170 | curve(context, x2_1, y2_1, x2_2, y2_2, color2); 171 | } 172 | -------------------------------------------------------------------------------- /07-curve-repeated/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "07-curve-repeated", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "babel-runtime": { 8 | "version": "6.26.0", 9 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 10 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 11 | "requires": { 12 | "core-js": "^2.4.0", 13 | "regenerator-runtime": "^0.11.0" 14 | } 15 | }, 16 | "canvas-sketch": { 17 | "version": "0.2.0", 18 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 19 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 20 | "requires": { 21 | "convert-length": "^1.0.1", 22 | "dateformat": "^3.0.3", 23 | "deep-equal": "^1.0.1", 24 | "defined": "^1.0.0", 25 | "get-canvas-context": "^1.0.2", 26 | "is-class": "0.0.5", 27 | "is-dom": "^1.0.9", 28 | "is-promise": "^2.1.0", 29 | "object-assign": "^4.1.1", 30 | "pad-left": "^2.1.0", 31 | "right-now": "^1.0.0", 32 | "two.js": "^0.7.0-beta.1" 33 | } 34 | }, 35 | "convert-length": { 36 | "version": "1.0.1", 37 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 38 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 39 | "requires": { 40 | "defined": "^1.0.0" 41 | } 42 | }, 43 | "core-js": { 44 | "version": "2.6.4", 45 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz", 46 | "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A==" 47 | }, 48 | "dateformat": { 49 | "version": "3.0.3", 50 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 51 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 52 | }, 53 | "deep-equal": { 54 | "version": "1.0.1", 55 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 56 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 57 | }, 58 | "defined": { 59 | "version": "1.0.0", 60 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 61 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 62 | }, 63 | "get-canvas-context": { 64 | "version": "1.0.2", 65 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 66 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 67 | }, 68 | "is-class": { 69 | "version": "0.0.5", 70 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 71 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 72 | }, 73 | "is-dom": { 74 | "version": "1.0.9", 75 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 76 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 77 | }, 78 | "is-promise": { 79 | "version": "2.1.0", 80 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 81 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 82 | }, 83 | "object-assign": { 84 | "version": "4.1.1", 85 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 86 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 87 | }, 88 | "ow": { 89 | "version": "0.4.0", 90 | "resolved": "https://registry.npmjs.org/ow/-/ow-0.4.0.tgz", 91 | "integrity": "sha512-kJNzxUgVd6EF5LoGs+s2/etJPwjfRDLXPTCfEgV8At77sRrV+PSFA8lcoW2HF15Qd455mIR2Stee/2MzDiFBDA==" 92 | }, 93 | "ow-lite": { 94 | "version": "0.0.2", 95 | "resolved": "https://registry.npmjs.org/ow-lite/-/ow-lite-0.0.2.tgz", 96 | "integrity": "sha1-359QDmdAtlkKHpqWVzDUmo61l9E=" 97 | }, 98 | "pad-left": { 99 | "version": "2.1.0", 100 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 101 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 102 | "requires": { 103 | "repeat-string": "^1.5.4" 104 | } 105 | }, 106 | "random": { 107 | "version": "2.0.13", 108 | "resolved": "https://registry.npmjs.org/random/-/random-2.0.13.tgz", 109 | "integrity": "sha512-vwU1O5Wm0zvGUtwj188MLrqsIs3r6cpVqhBkCJLk4yyb0z5eV846so+JwnvVJKXUkVLRzAjluakzYMz2rtjLmw==", 110 | "requires": { 111 | "babel-runtime": "^6.26.0", 112 | "ow": "^0.4.0", 113 | "ow-lite": "^0.0.2" 114 | } 115 | }, 116 | "regenerator-runtime": { 117 | "version": "0.11.1", 118 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 119 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 120 | }, 121 | "repeat-string": { 122 | "version": "1.6.1", 123 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 124 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 125 | }, 126 | "right-now": { 127 | "version": "1.0.0", 128 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 129 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 130 | }, 131 | "two.js": { 132 | "version": "0.7.0-beta.3", 133 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 134 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 135 | } 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /11-circle-displaced-repeated/scratch/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "scratch", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "babel-runtime": { 8 | "version": "6.26.0", 9 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 10 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 11 | "requires": { 12 | "core-js": "^2.4.0", 13 | "regenerator-runtime": "^0.11.0" 14 | } 15 | }, 16 | "canvas-sketch": { 17 | "version": "0.2.0", 18 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 19 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 20 | "requires": { 21 | "convert-length": "^1.0.1", 22 | "dateformat": "^3.0.3", 23 | "deep-equal": "^1.0.1", 24 | "defined": "^1.0.0", 25 | "get-canvas-context": "^1.0.2", 26 | "is-class": "0.0.5", 27 | "is-dom": "^1.0.9", 28 | "is-promise": "^2.1.0", 29 | "object-assign": "^4.1.1", 30 | "pad-left": "^2.1.0", 31 | "right-now": "^1.0.0", 32 | "two.js": "^0.7.0-beta.1" 33 | } 34 | }, 35 | "convert-length": { 36 | "version": "1.0.1", 37 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 38 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 39 | "requires": { 40 | "defined": "^1.0.0" 41 | } 42 | }, 43 | "core-js": { 44 | "version": "2.6.5", 45 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", 46 | "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" 47 | }, 48 | "dateformat": { 49 | "version": "3.0.3", 50 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 51 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 52 | }, 53 | "deep-equal": { 54 | "version": "1.0.1", 55 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 56 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 57 | }, 58 | "defined": { 59 | "version": "1.0.0", 60 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 61 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 62 | }, 63 | "get-canvas-context": { 64 | "version": "1.0.2", 65 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 66 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 67 | }, 68 | "is-class": { 69 | "version": "0.0.5", 70 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 71 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 72 | }, 73 | "is-dom": { 74 | "version": "1.0.9", 75 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 76 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 77 | }, 78 | "is-promise": { 79 | "version": "2.1.0", 80 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 81 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 82 | }, 83 | "object-assign": { 84 | "version": "4.1.1", 85 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 86 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 87 | }, 88 | "ow": { 89 | "version": "0.4.0", 90 | "resolved": "https://registry.npmjs.org/ow/-/ow-0.4.0.tgz", 91 | "integrity": "sha512-kJNzxUgVd6EF5LoGs+s2/etJPwjfRDLXPTCfEgV8At77sRrV+PSFA8lcoW2HF15Qd455mIR2Stee/2MzDiFBDA==" 92 | }, 93 | "ow-lite": { 94 | "version": "0.0.2", 95 | "resolved": "https://registry.npmjs.org/ow-lite/-/ow-lite-0.0.2.tgz", 96 | "integrity": "sha1-359QDmdAtlkKHpqWVzDUmo61l9E=" 97 | }, 98 | "pad-left": { 99 | "version": "2.1.0", 100 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 101 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 102 | "requires": { 103 | "repeat-string": "^1.5.4" 104 | } 105 | }, 106 | "random": { 107 | "version": "2.0.13", 108 | "resolved": "https://registry.npmjs.org/random/-/random-2.0.13.tgz", 109 | "integrity": "sha512-vwU1O5Wm0zvGUtwj188MLrqsIs3r6cpVqhBkCJLk4yyb0z5eV846so+JwnvVJKXUkVLRzAjluakzYMz2rtjLmw==", 110 | "requires": { 111 | "babel-runtime": "^6.26.0", 112 | "ow": "^0.4.0", 113 | "ow-lite": "^0.0.2" 114 | } 115 | }, 116 | "regenerator-runtime": { 117 | "version": "0.11.1", 118 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 119 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 120 | }, 121 | "repeat-string": { 122 | "version": "1.6.1", 123 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 124 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 125 | }, 126 | "right-now": { 127 | "version": "1.0.0", 128 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 129 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 130 | }, 131 | "two.js": { 132 | "version": "0.7.0-beta.3", 133 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 134 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 135 | } 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /13-triangle-recursive/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "13-triangle-recursive", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "babel-runtime": { 8 | "version": "6.26.0", 9 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 10 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 11 | "requires": { 12 | "core-js": "^2.4.0", 13 | "regenerator-runtime": "^0.11.0" 14 | } 15 | }, 16 | "canvas-sketch": { 17 | "version": "0.2.0", 18 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 19 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 20 | "requires": { 21 | "convert-length": "^1.0.1", 22 | "dateformat": "^3.0.3", 23 | "deep-equal": "^1.0.1", 24 | "defined": "^1.0.0", 25 | "get-canvas-context": "^1.0.2", 26 | "is-class": "0.0.5", 27 | "is-dom": "^1.0.9", 28 | "is-promise": "^2.1.0", 29 | "object-assign": "^4.1.1", 30 | "pad-left": "^2.1.0", 31 | "right-now": "^1.0.0", 32 | "two.js": "^0.7.0-beta.1" 33 | } 34 | }, 35 | "convert-length": { 36 | "version": "1.0.1", 37 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 38 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 39 | "requires": { 40 | "defined": "^1.0.0" 41 | } 42 | }, 43 | "core-js": { 44 | "version": "2.6.5", 45 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", 46 | "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" 47 | }, 48 | "dateformat": { 49 | "version": "3.0.3", 50 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 51 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 52 | }, 53 | "deep-equal": { 54 | "version": "1.0.1", 55 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 56 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 57 | }, 58 | "defined": { 59 | "version": "1.0.0", 60 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 61 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 62 | }, 63 | "get-canvas-context": { 64 | "version": "1.0.2", 65 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 66 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 67 | }, 68 | "is-class": { 69 | "version": "0.0.5", 70 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 71 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 72 | }, 73 | "is-dom": { 74 | "version": "1.0.9", 75 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 76 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 77 | }, 78 | "is-promise": { 79 | "version": "2.1.0", 80 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 81 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 82 | }, 83 | "object-assign": { 84 | "version": "4.1.1", 85 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 86 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 87 | }, 88 | "ow": { 89 | "version": "0.4.0", 90 | "resolved": "https://registry.npmjs.org/ow/-/ow-0.4.0.tgz", 91 | "integrity": "sha512-kJNzxUgVd6EF5LoGs+s2/etJPwjfRDLXPTCfEgV8At77sRrV+PSFA8lcoW2HF15Qd455mIR2Stee/2MzDiFBDA==" 92 | }, 93 | "ow-lite": { 94 | "version": "0.0.2", 95 | "resolved": "https://registry.npmjs.org/ow-lite/-/ow-lite-0.0.2.tgz", 96 | "integrity": "sha1-359QDmdAtlkKHpqWVzDUmo61l9E=" 97 | }, 98 | "pad-left": { 99 | "version": "2.1.0", 100 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 101 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 102 | "requires": { 103 | "repeat-string": "^1.5.4" 104 | } 105 | }, 106 | "random": { 107 | "version": "2.0.13", 108 | "resolved": "https://registry.npmjs.org/random/-/random-2.0.13.tgz", 109 | "integrity": "sha512-vwU1O5Wm0zvGUtwj188MLrqsIs3r6cpVqhBkCJLk4yyb0z5eV846so+JwnvVJKXUkVLRzAjluakzYMz2rtjLmw==", 110 | "requires": { 111 | "babel-runtime": "^6.26.0", 112 | "ow": "^0.4.0", 113 | "ow-lite": "^0.0.2" 114 | } 115 | }, 116 | "regenerator-runtime": { 117 | "version": "0.11.1", 118 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 119 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 120 | }, 121 | "repeat-string": { 122 | "version": "1.6.1", 123 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 124 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 125 | }, 126 | "right-now": { 127 | "version": "1.0.0", 128 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 129 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 130 | }, 131 | "two.js": { 132 | "version": "0.7.0-beta.3", 133 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 134 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 135 | } 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /11-circle-displaced-repeated/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "11-circle-displaced-repeated", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "babel-runtime": { 8 | "version": "6.26.0", 9 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 10 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 11 | "requires": { 12 | "core-js": "^2.4.0", 13 | "regenerator-runtime": "^0.11.0" 14 | } 15 | }, 16 | "canvas-sketch": { 17 | "version": "0.2.0", 18 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 19 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 20 | "requires": { 21 | "convert-length": "^1.0.1", 22 | "dateformat": "^3.0.3", 23 | "deep-equal": "^1.0.1", 24 | "defined": "^1.0.0", 25 | "get-canvas-context": "^1.0.2", 26 | "is-class": "0.0.5", 27 | "is-dom": "^1.0.9", 28 | "is-promise": "^2.1.0", 29 | "object-assign": "^4.1.1", 30 | "pad-left": "^2.1.0", 31 | "right-now": "^1.0.0", 32 | "two.js": "^0.7.0-beta.1" 33 | } 34 | }, 35 | "convert-length": { 36 | "version": "1.0.1", 37 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 38 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 39 | "requires": { 40 | "defined": "^1.0.0" 41 | } 42 | }, 43 | "core-js": { 44 | "version": "2.6.4", 45 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz", 46 | "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A==" 47 | }, 48 | "dateformat": { 49 | "version": "3.0.3", 50 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 51 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 52 | }, 53 | "deep-equal": { 54 | "version": "1.0.1", 55 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 56 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 57 | }, 58 | "defined": { 59 | "version": "1.0.0", 60 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 61 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 62 | }, 63 | "get-canvas-context": { 64 | "version": "1.0.2", 65 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 66 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 67 | }, 68 | "is-class": { 69 | "version": "0.0.5", 70 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 71 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 72 | }, 73 | "is-dom": { 74 | "version": "1.0.9", 75 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 76 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 77 | }, 78 | "is-promise": { 79 | "version": "2.1.0", 80 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 81 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 82 | }, 83 | "object-assign": { 84 | "version": "4.1.1", 85 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 86 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 87 | }, 88 | "ow": { 89 | "version": "0.4.0", 90 | "resolved": "https://registry.npmjs.org/ow/-/ow-0.4.0.tgz", 91 | "integrity": "sha512-kJNzxUgVd6EF5LoGs+s2/etJPwjfRDLXPTCfEgV8At77sRrV+PSFA8lcoW2HF15Qd455mIR2Stee/2MzDiFBDA==" 92 | }, 93 | "ow-lite": { 94 | "version": "0.0.2", 95 | "resolved": "https://registry.npmjs.org/ow-lite/-/ow-lite-0.0.2.tgz", 96 | "integrity": "sha1-359QDmdAtlkKHpqWVzDUmo61l9E=" 97 | }, 98 | "pad-left": { 99 | "version": "2.1.0", 100 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 101 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 102 | "requires": { 103 | "repeat-string": "^1.5.4" 104 | } 105 | }, 106 | "random": { 107 | "version": "2.0.13", 108 | "resolved": "https://registry.npmjs.org/random/-/random-2.0.13.tgz", 109 | "integrity": "sha512-vwU1O5Wm0zvGUtwj188MLrqsIs3r6cpVqhBkCJLk4yyb0z5eV846so+JwnvVJKXUkVLRzAjluakzYMz2rtjLmw==", 110 | "requires": { 111 | "babel-runtime": "^6.26.0", 112 | "ow": "^0.4.0", 113 | "ow-lite": "^0.0.2" 114 | } 115 | }, 116 | "regenerator-runtime": { 117 | "version": "0.11.1", 118 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 119 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 120 | }, 121 | "repeat-string": { 122 | "version": "1.6.1", 123 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 124 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 125 | }, 126 | "right-now": { 127 | "version": "1.0.0", 128 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 129 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 130 | }, 131 | "two.js": { 132 | "version": "0.7.0-beta.3", 133 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 134 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 135 | } 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /06-lines-displaced-curved/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "06-lines-displaced-curved", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "babel-runtime": { 8 | "version": "6.26.0", 9 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 10 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 11 | "requires": { 12 | "core-js": "^2.4.0", 13 | "regenerator-runtime": "^0.11.0" 14 | } 15 | }, 16 | "canvas-sketch": { 17 | "version": "0.2.0", 18 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 19 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 20 | "requires": { 21 | "convert-length": "^1.0.1", 22 | "dateformat": "^3.0.3", 23 | "deep-equal": "^1.0.1", 24 | "defined": "^1.0.0", 25 | "get-canvas-context": "^1.0.2", 26 | "is-class": "0.0.5", 27 | "is-dom": "^1.0.9", 28 | "is-promise": "^2.1.0", 29 | "object-assign": "^4.1.1", 30 | "pad-left": "^2.1.0", 31 | "right-now": "^1.0.0", 32 | "two.js": "^0.7.0-beta.1" 33 | } 34 | }, 35 | "convert-length": { 36 | "version": "1.0.1", 37 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 38 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 39 | "requires": { 40 | "defined": "^1.0.0" 41 | } 42 | }, 43 | "core-js": { 44 | "version": "2.6.4", 45 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz", 46 | "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A==" 47 | }, 48 | "d3-array": { 49 | "version": "1.2.4", 50 | "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", 51 | "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" 52 | }, 53 | "d3-collection": { 54 | "version": "1.0.7", 55 | "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", 56 | "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" 57 | }, 58 | "d3-color": { 59 | "version": "1.2.3", 60 | "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.3.tgz", 61 | "integrity": "sha512-x37qq3ChOTLd26hnps36lexMRhNXEtVxZ4B25rL0DVdDsGQIJGB18S7y9XDwlDD6MD/ZBzITCf4JjGMM10TZkw==" 62 | }, 63 | "d3-format": { 64 | "version": "1.3.2", 65 | "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", 66 | "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" 67 | }, 68 | "d3-interpolate": { 69 | "version": "1.3.2", 70 | "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", 71 | "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", 72 | "requires": { 73 | "d3-color": "1" 74 | } 75 | }, 76 | "d3-scale": { 77 | "version": "2.2.2", 78 | "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", 79 | "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", 80 | "requires": { 81 | "d3-array": "^1.2.0", 82 | "d3-collection": "1", 83 | "d3-format": "1", 84 | "d3-interpolate": "1", 85 | "d3-time": "1", 86 | "d3-time-format": "2" 87 | } 88 | }, 89 | "d3-time": { 90 | "version": "1.0.11", 91 | "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.11.tgz", 92 | "integrity": "sha512-Z3wpvhPLW4vEScGeIMUckDW7+3hWKOQfAWg/U7PlWBnQmeKQ00gCUsTtWSYulrKNA7ta8hJ+xXc6MHrMuITwEw==" 93 | }, 94 | "d3-time-format": { 95 | "version": "2.1.3", 96 | "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", 97 | "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", 98 | "requires": { 99 | "d3-time": "1" 100 | } 101 | }, 102 | "dateformat": { 103 | "version": "3.0.3", 104 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 105 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 106 | }, 107 | "deep-equal": { 108 | "version": "1.0.1", 109 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 110 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 111 | }, 112 | "defined": { 113 | "version": "1.0.0", 114 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 115 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 116 | }, 117 | "get-canvas-context": { 118 | "version": "1.0.2", 119 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 120 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 121 | }, 122 | "is-class": { 123 | "version": "0.0.5", 124 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 125 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 126 | }, 127 | "is-dom": { 128 | "version": "1.0.9", 129 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 130 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 131 | }, 132 | "is-promise": { 133 | "version": "2.1.0", 134 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 135 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 136 | }, 137 | "object-assign": { 138 | "version": "4.1.1", 139 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 140 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 141 | }, 142 | "ow": { 143 | "version": "0.4.0", 144 | "resolved": "https://registry.npmjs.org/ow/-/ow-0.4.0.tgz", 145 | "integrity": "sha512-kJNzxUgVd6EF5LoGs+s2/etJPwjfRDLXPTCfEgV8At77sRrV+PSFA8lcoW2HF15Qd455mIR2Stee/2MzDiFBDA==" 146 | }, 147 | "ow-lite": { 148 | "version": "0.0.2", 149 | "resolved": "https://registry.npmjs.org/ow-lite/-/ow-lite-0.0.2.tgz", 150 | "integrity": "sha1-359QDmdAtlkKHpqWVzDUmo61l9E=" 151 | }, 152 | "pad-left": { 153 | "version": "2.1.0", 154 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 155 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 156 | "requires": { 157 | "repeat-string": "^1.5.4" 158 | } 159 | }, 160 | "random": { 161 | "version": "2.0.13", 162 | "resolved": "https://registry.npmjs.org/random/-/random-2.0.13.tgz", 163 | "integrity": "sha512-vwU1O5Wm0zvGUtwj188MLrqsIs3r6cpVqhBkCJLk4yyb0z5eV846so+JwnvVJKXUkVLRzAjluakzYMz2rtjLmw==", 164 | "requires": { 165 | "babel-runtime": "^6.26.0", 166 | "ow": "^0.4.0", 167 | "ow-lite": "^0.0.2" 168 | } 169 | }, 170 | "regenerator-runtime": { 171 | "version": "0.11.1", 172 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 173 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 174 | }, 175 | "repeat-string": { 176 | "version": "1.6.1", 177 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 178 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 179 | }, 180 | "right-now": { 181 | "version": "1.0.0", 182 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 183 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 184 | }, 185 | "two.js": { 186 | "version": "0.7.0-beta.3", 187 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 188 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 189 | } 190 | } 191 | } 192 | -------------------------------------------------------------------------------- /16-braids/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "16-braids", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "buffer-to-arraybuffer": { 8 | "version": "0.0.5", 9 | "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", 10 | "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" 11 | }, 12 | "canvas-sketch": { 13 | "version": "0.2.0", 14 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 15 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 16 | "requires": { 17 | "convert-length": "^1.0.1", 18 | "dateformat": "^3.0.3", 19 | "deep-equal": "^1.0.1", 20 | "defined": "^1.0.0", 21 | "get-canvas-context": "^1.0.2", 22 | "is-class": "0.0.5", 23 | "is-dom": "^1.0.9", 24 | "is-promise": "^2.1.0", 25 | "object-assign": "^4.1.1", 26 | "pad-left": "^2.1.0", 27 | "right-now": "^1.0.0", 28 | "two.js": "^0.7.0-beta.1" 29 | } 30 | }, 31 | "convert-length": { 32 | "version": "1.0.1", 33 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 34 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 35 | "requires": { 36 | "defined": "^1.0.0" 37 | } 38 | }, 39 | "dateformat": { 40 | "version": "3.0.3", 41 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 42 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 43 | }, 44 | "decode-uri-component": { 45 | "version": "0.2.0", 46 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 47 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" 48 | }, 49 | "decompress-response": { 50 | "version": "3.3.0", 51 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 52 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 53 | "requires": { 54 | "mimic-response": "^1.0.0" 55 | } 56 | }, 57 | "deep-equal": { 58 | "version": "1.0.1", 59 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 60 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 61 | }, 62 | "define-properties": { 63 | "version": "1.1.3", 64 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 65 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 66 | "requires": { 67 | "object-keys": "^1.0.12" 68 | } 69 | }, 70 | "defined": { 71 | "version": "1.0.0", 72 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 73 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 74 | }, 75 | "dom-walk": { 76 | "version": "0.1.1", 77 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", 78 | "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" 79 | }, 80 | "es-abstract": { 81 | "version": "1.13.0", 82 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", 83 | "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", 84 | "requires": { 85 | "es-to-primitive": "^1.2.0", 86 | "function-bind": "^1.1.1", 87 | "has": "^1.0.3", 88 | "is-callable": "^1.1.4", 89 | "is-regex": "^1.0.4", 90 | "object-keys": "^1.0.12" 91 | } 92 | }, 93 | "es-to-primitive": { 94 | "version": "1.2.0", 95 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 96 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 97 | "requires": { 98 | "is-callable": "^1.1.4", 99 | "is-date-object": "^1.0.1", 100 | "is-symbol": "^1.0.2" 101 | } 102 | }, 103 | "for-each": { 104 | "version": "0.3.3", 105 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 106 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 107 | "requires": { 108 | "is-callable": "^1.1.3" 109 | } 110 | }, 111 | "function-bind": { 112 | "version": "1.1.1", 113 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 114 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 115 | }, 116 | "get-canvas-context": { 117 | "version": "1.0.2", 118 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 119 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 120 | }, 121 | "global": { 122 | "version": "4.3.2", 123 | "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", 124 | "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", 125 | "requires": { 126 | "min-document": "^2.19.0", 127 | "process": "~0.5.1" 128 | } 129 | }, 130 | "has": { 131 | "version": "1.0.3", 132 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 133 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 134 | "requires": { 135 | "function-bind": "^1.1.1" 136 | } 137 | }, 138 | "has-symbols": { 139 | "version": "1.0.0", 140 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 141 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" 142 | }, 143 | "is-callable": { 144 | "version": "1.1.4", 145 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 146 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" 147 | }, 148 | "is-class": { 149 | "version": "0.0.5", 150 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 151 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 152 | }, 153 | "is-date-object": { 154 | "version": "1.0.1", 155 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 156 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" 157 | }, 158 | "is-dom": { 159 | "version": "1.0.9", 160 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 161 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 162 | }, 163 | "is-function": { 164 | "version": "1.0.1", 165 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", 166 | "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" 167 | }, 168 | "is-promise": { 169 | "version": "2.1.0", 170 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 171 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 172 | }, 173 | "is-regex": { 174 | "version": "1.0.4", 175 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 176 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 177 | "requires": { 178 | "has": "^1.0.1" 179 | } 180 | }, 181 | "is-symbol": { 182 | "version": "1.0.2", 183 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 184 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 185 | "requires": { 186 | "has-symbols": "^1.0.0" 187 | } 188 | }, 189 | "map-limit": { 190 | "version": "0.0.1", 191 | "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", 192 | "integrity": "sha1-63lhAxwPDo0AG/LVb6toXViCLzg=", 193 | "requires": { 194 | "once": "~1.3.0" 195 | } 196 | }, 197 | "mimic-response": { 198 | "version": "1.0.1", 199 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 200 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 201 | }, 202 | "min-document": { 203 | "version": "2.19.0", 204 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", 205 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", 206 | "requires": { 207 | "dom-walk": "^0.1.0" 208 | } 209 | }, 210 | "minimist": { 211 | "version": "1.2.0", 212 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 213 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 214 | }, 215 | "new-array": { 216 | "version": "1.0.0", 217 | "resolved": "https://registry.npmjs.org/new-array/-/new-array-1.0.0.tgz", 218 | "integrity": "sha1-XbxjnZYerH8an7wacUbsEvKST78=" 219 | }, 220 | "nice-color-palettes": { 221 | "version": "2.0.0", 222 | "resolved": "https://registry.npmjs.org/nice-color-palettes/-/nice-color-palettes-2.0.0.tgz", 223 | "integrity": "sha512-vfQnGTYJuNYaPsCgf5t7mQyRJaVzojRXJ5Qy7iRx4OP914fytCHG3fdtFQIpuGpYjxpcC1Hge1pmLa2a/c0r8w==", 224 | "requires": { 225 | "map-limit": "0.0.1", 226 | "minimist": "^1.2.0", 227 | "new-array": "^1.0.0", 228 | "xhr-request": "^1.0.1" 229 | } 230 | }, 231 | "object-assign": { 232 | "version": "4.1.1", 233 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 234 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 235 | }, 236 | "object-keys": { 237 | "version": "1.1.0", 238 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", 239 | "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==" 240 | }, 241 | "once": { 242 | "version": "1.3.3", 243 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", 244 | "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", 245 | "requires": { 246 | "wrappy": "1" 247 | } 248 | }, 249 | "pad-left": { 250 | "version": "2.1.0", 251 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 252 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 253 | "requires": { 254 | "repeat-string": "^1.5.4" 255 | } 256 | }, 257 | "parse-headers": { 258 | "version": "2.0.2", 259 | "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz", 260 | "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==", 261 | "requires": { 262 | "for-each": "^0.3.3", 263 | "string.prototype.trim": "^1.1.2" 264 | } 265 | }, 266 | "process": { 267 | "version": "0.5.2", 268 | "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", 269 | "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" 270 | }, 271 | "query-string": { 272 | "version": "5.1.1", 273 | "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", 274 | "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", 275 | "requires": { 276 | "decode-uri-component": "^0.2.0", 277 | "object-assign": "^4.1.0", 278 | "strict-uri-encode": "^1.0.0" 279 | } 280 | }, 281 | "repeat-string": { 282 | "version": "1.6.1", 283 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 284 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 285 | }, 286 | "right-now": { 287 | "version": "1.0.0", 288 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 289 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 290 | }, 291 | "simple-concat": { 292 | "version": "1.0.0", 293 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 294 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" 295 | }, 296 | "simple-get": { 297 | "version": "2.8.1", 298 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", 299 | "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", 300 | "requires": { 301 | "decompress-response": "^3.3.0", 302 | "once": "^1.3.1", 303 | "simple-concat": "^1.0.0" 304 | } 305 | }, 306 | "strict-uri-encode": { 307 | "version": "1.1.0", 308 | "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", 309 | "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" 310 | }, 311 | "string.prototype.trim": { 312 | "version": "1.1.2", 313 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 314 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 315 | "requires": { 316 | "define-properties": "^1.1.2", 317 | "es-abstract": "^1.5.0", 318 | "function-bind": "^1.0.2" 319 | } 320 | }, 321 | "timed-out": { 322 | "version": "4.0.1", 323 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 324 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" 325 | }, 326 | "two.js": { 327 | "version": "0.7.0-beta.3", 328 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 329 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 330 | }, 331 | "url-set-query": { 332 | "version": "1.0.0", 333 | "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", 334 | "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" 335 | }, 336 | "wrappy": { 337 | "version": "1.0.2", 338 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 339 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 340 | }, 341 | "xhr": { 342 | "version": "2.5.0", 343 | "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", 344 | "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", 345 | "requires": { 346 | "global": "~4.3.0", 347 | "is-function": "^1.0.1", 348 | "parse-headers": "^2.0.0", 349 | "xtend": "^4.0.0" 350 | } 351 | }, 352 | "xhr-request": { 353 | "version": "1.1.0", 354 | "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", 355 | "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", 356 | "requires": { 357 | "buffer-to-arraybuffer": "^0.0.5", 358 | "object-assign": "^4.1.1", 359 | "query-string": "^5.0.1", 360 | "simple-get": "^2.7.0", 361 | "timed-out": "^4.0.1", 362 | "url-set-query": "^1.0.0", 363 | "xhr": "^2.0.4" 364 | } 365 | }, 366 | "xtend": { 367 | "version": "4.0.1", 368 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 369 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 370 | } 371 | } 372 | } 373 | -------------------------------------------------------------------------------- /15-shapes-tiled-colors/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "15-shapes-tiled-colors", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "buffer-to-arraybuffer": { 8 | "version": "0.0.5", 9 | "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", 10 | "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" 11 | }, 12 | "canvas-sketch": { 13 | "version": "0.2.0", 14 | "resolved": "https://registry.npmjs.org/canvas-sketch/-/canvas-sketch-0.2.0.tgz", 15 | "integrity": "sha512-US+ViyXKcNywgULfbB2dVI0Swdq79vaBzQt+rE6OBNCLLZOS+/L1WOsoHGdsg7GXCRdlqE22H8SM2en0FATN7A==", 16 | "requires": { 17 | "convert-length": "^1.0.1", 18 | "dateformat": "^3.0.3", 19 | "deep-equal": "^1.0.1", 20 | "defined": "^1.0.0", 21 | "get-canvas-context": "^1.0.2", 22 | "is-class": "0.0.5", 23 | "is-dom": "^1.0.9", 24 | "is-promise": "^2.1.0", 25 | "object-assign": "^4.1.1", 26 | "pad-left": "^2.1.0", 27 | "right-now": "^1.0.0", 28 | "two.js": "^0.7.0-beta.1" 29 | } 30 | }, 31 | "convert-length": { 32 | "version": "1.0.1", 33 | "resolved": "https://registry.npmjs.org/convert-length/-/convert-length-1.0.1.tgz", 34 | "integrity": "sha512-w94Vge3sck6J1NHuA0du367/JTbj1zfjTapX7ixR2W+KlU4zb+NRTbou3x9nTpm5vlcXmjoaUJQpVN9pULCdxQ==", 35 | "requires": { 36 | "defined": "^1.0.0" 37 | } 38 | }, 39 | "dateformat": { 40 | "version": "3.0.3", 41 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 42 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" 43 | }, 44 | "decode-uri-component": { 45 | "version": "0.2.0", 46 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 47 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" 48 | }, 49 | "decompress-response": { 50 | "version": "3.3.0", 51 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 52 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 53 | "requires": { 54 | "mimic-response": "^1.0.0" 55 | } 56 | }, 57 | "deep-equal": { 58 | "version": "1.0.1", 59 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 60 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 61 | }, 62 | "define-properties": { 63 | "version": "1.1.3", 64 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 65 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 66 | "requires": { 67 | "object-keys": "^1.0.12" 68 | } 69 | }, 70 | "defined": { 71 | "version": "1.0.0", 72 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 73 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 74 | }, 75 | "dom-walk": { 76 | "version": "0.1.1", 77 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", 78 | "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" 79 | }, 80 | "es-abstract": { 81 | "version": "1.13.0", 82 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", 83 | "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", 84 | "requires": { 85 | "es-to-primitive": "^1.2.0", 86 | "function-bind": "^1.1.1", 87 | "has": "^1.0.3", 88 | "is-callable": "^1.1.4", 89 | "is-regex": "^1.0.4", 90 | "object-keys": "^1.0.12" 91 | } 92 | }, 93 | "es-to-primitive": { 94 | "version": "1.2.0", 95 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 96 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 97 | "requires": { 98 | "is-callable": "^1.1.4", 99 | "is-date-object": "^1.0.1", 100 | "is-symbol": "^1.0.2" 101 | } 102 | }, 103 | "for-each": { 104 | "version": "0.3.3", 105 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 106 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 107 | "requires": { 108 | "is-callable": "^1.1.3" 109 | } 110 | }, 111 | "function-bind": { 112 | "version": "1.1.1", 113 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 114 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 115 | }, 116 | "get-canvas-context": { 117 | "version": "1.0.2", 118 | "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", 119 | "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" 120 | }, 121 | "global": { 122 | "version": "4.3.2", 123 | "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", 124 | "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", 125 | "requires": { 126 | "min-document": "^2.19.0", 127 | "process": "~0.5.1" 128 | } 129 | }, 130 | "has": { 131 | "version": "1.0.3", 132 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 133 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 134 | "requires": { 135 | "function-bind": "^1.1.1" 136 | } 137 | }, 138 | "has-symbols": { 139 | "version": "1.0.0", 140 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 141 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" 142 | }, 143 | "is-callable": { 144 | "version": "1.1.4", 145 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 146 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" 147 | }, 148 | "is-class": { 149 | "version": "0.0.5", 150 | "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.5.tgz", 151 | "integrity": "sha512-jOquneoRNrqbpDgh4hKicrMcGIl7jopvIJaWI+LyDVRzZrQy819qBaYSofOyUMTo/x5Jelvs8G5v/ptdySWy6A==" 152 | }, 153 | "is-date-object": { 154 | "version": "1.0.1", 155 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 156 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" 157 | }, 158 | "is-dom": { 159 | "version": "1.0.9", 160 | "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", 161 | "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" 162 | }, 163 | "is-function": { 164 | "version": "1.0.1", 165 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", 166 | "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" 167 | }, 168 | "is-promise": { 169 | "version": "2.1.0", 170 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 171 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 172 | }, 173 | "is-regex": { 174 | "version": "1.0.4", 175 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 176 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 177 | "requires": { 178 | "has": "^1.0.1" 179 | } 180 | }, 181 | "is-symbol": { 182 | "version": "1.0.2", 183 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 184 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 185 | "requires": { 186 | "has-symbols": "^1.0.0" 187 | } 188 | }, 189 | "map-limit": { 190 | "version": "0.0.1", 191 | "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", 192 | "integrity": "sha1-63lhAxwPDo0AG/LVb6toXViCLzg=", 193 | "requires": { 194 | "once": "~1.3.0" 195 | } 196 | }, 197 | "mimic-response": { 198 | "version": "1.0.1", 199 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 200 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 201 | }, 202 | "min-document": { 203 | "version": "2.19.0", 204 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", 205 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", 206 | "requires": { 207 | "dom-walk": "^0.1.0" 208 | } 209 | }, 210 | "minimist": { 211 | "version": "1.2.0", 212 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 213 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 214 | }, 215 | "new-array": { 216 | "version": "1.0.0", 217 | "resolved": "https://registry.npmjs.org/new-array/-/new-array-1.0.0.tgz", 218 | "integrity": "sha1-XbxjnZYerH8an7wacUbsEvKST78=" 219 | }, 220 | "nice-color-palettes": { 221 | "version": "2.0.0", 222 | "resolved": "https://registry.npmjs.org/nice-color-palettes/-/nice-color-palettes-2.0.0.tgz", 223 | "integrity": "sha512-vfQnGTYJuNYaPsCgf5t7mQyRJaVzojRXJ5Qy7iRx4OP914fytCHG3fdtFQIpuGpYjxpcC1Hge1pmLa2a/c0r8w==", 224 | "requires": { 225 | "map-limit": "0.0.1", 226 | "minimist": "^1.2.0", 227 | "new-array": "^1.0.0", 228 | "xhr-request": "^1.0.1" 229 | } 230 | }, 231 | "object-assign": { 232 | "version": "4.1.1", 233 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 234 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 235 | }, 236 | "object-keys": { 237 | "version": "1.1.0", 238 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", 239 | "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==" 240 | }, 241 | "once": { 242 | "version": "1.3.3", 243 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", 244 | "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", 245 | "requires": { 246 | "wrappy": "1" 247 | } 248 | }, 249 | "pad-left": { 250 | "version": "2.1.0", 251 | "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", 252 | "integrity": "sha1-FuajstRKjhOMsIOMx8tAOk/J6ZQ=", 253 | "requires": { 254 | "repeat-string": "^1.5.4" 255 | } 256 | }, 257 | "parse-headers": { 258 | "version": "2.0.2", 259 | "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz", 260 | "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==", 261 | "requires": { 262 | "for-each": "^0.3.3", 263 | "string.prototype.trim": "^1.1.2" 264 | } 265 | }, 266 | "process": { 267 | "version": "0.5.2", 268 | "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", 269 | "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" 270 | }, 271 | "query-string": { 272 | "version": "5.1.1", 273 | "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", 274 | "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", 275 | "requires": { 276 | "decode-uri-component": "^0.2.0", 277 | "object-assign": "^4.1.0", 278 | "strict-uri-encode": "^1.0.0" 279 | } 280 | }, 281 | "repeat-string": { 282 | "version": "1.6.1", 283 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 284 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 285 | }, 286 | "right-now": { 287 | "version": "1.0.0", 288 | "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", 289 | "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" 290 | }, 291 | "simple-concat": { 292 | "version": "1.0.0", 293 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 294 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" 295 | }, 296 | "simple-get": { 297 | "version": "2.8.1", 298 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", 299 | "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", 300 | "requires": { 301 | "decompress-response": "^3.3.0", 302 | "once": "^1.3.1", 303 | "simple-concat": "^1.0.0" 304 | } 305 | }, 306 | "strict-uri-encode": { 307 | "version": "1.1.0", 308 | "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", 309 | "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" 310 | }, 311 | "string.prototype.trim": { 312 | "version": "1.1.2", 313 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 314 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 315 | "requires": { 316 | "define-properties": "^1.1.2", 317 | "es-abstract": "^1.5.0", 318 | "function-bind": "^1.0.2" 319 | } 320 | }, 321 | "timed-out": { 322 | "version": "4.0.1", 323 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 324 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" 325 | }, 326 | "two.js": { 327 | "version": "0.7.0-beta.3", 328 | "resolved": "https://registry.npmjs.org/two.js/-/two.js-0.7.0-beta.3.tgz", 329 | "integrity": "sha512-oPEmRGCo5c296Wn40+yTxYydwPTf1iwJY+EPdLoka5TxUkLkAUo10CkQxRZJ7VGmbShBxQRXQxS5i5/otwqGZg==" 330 | }, 331 | "url-set-query": { 332 | "version": "1.0.0", 333 | "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", 334 | "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" 335 | }, 336 | "wrappy": { 337 | "version": "1.0.2", 338 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 339 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 340 | }, 341 | "xhr": { 342 | "version": "2.5.0", 343 | "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", 344 | "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", 345 | "requires": { 346 | "global": "~4.3.0", 347 | "is-function": "^1.0.1", 348 | "parse-headers": "^2.0.0", 349 | "xtend": "^4.0.0" 350 | } 351 | }, 352 | "xhr-request": { 353 | "version": "1.1.0", 354 | "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", 355 | "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", 356 | "requires": { 357 | "buffer-to-arraybuffer": "^0.0.5", 358 | "object-assign": "^4.1.1", 359 | "query-string": "^5.0.1", 360 | "simple-get": "^2.7.0", 361 | "timed-out": "^4.0.1", 362 | "url-set-query": "^1.0.0", 363 | "xhr": "^2.0.4" 364 | } 365 | }, 366 | "xtend": { 367 | "version": "4.0.1", 368 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 369 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 370 | } 371 | } 372 | } 373 | --------------------------------------------------------------------------------