├── .gitignore ├── README.md ├── components ├── ending.js ├── filmGrain.js ├── hackPack.js ├── intro.js ├── meta.js ├── progressButton.js ├── selectable.js ├── sketchEmbed.js ├── slack.js ├── split.js └── step.js ├── docs └── runbook.md ├── draw-dino-auth ├── .gitignore ├── Dockerfile ├── metrics.js ├── package.json ├── server.js └── yarn.lock ├── metrics.js ├── package.json ├── pages ├── api │ └── metric.js ├── index.js └── slackAuthSuccess.js ├── public ├── FileSaver.js ├── back-black.png ├── back-white.png ├── canvas-toBlob.js ├── decorative-bottom.png ├── decorative-corner.png ├── decorative-corner.svg ├── dinoisseur.png ├── down-black.png ├── down-white.png ├── erase-button.gif ├── excanvas.js ├── favicon.ico ├── fonts │ ├── PhantomSans0.6-Bold.ttf │ ├── PhantomSans0.6-Bold.woff │ ├── PhantomSans0.6-Bold.woff2 │ ├── PhantomSans0.6-Book.ttf │ ├── PhantomSans0.6-Book.woff │ ├── PhantomSans0.6-Book.woff2 │ ├── PhantomSans0.6-Italic.ttf │ ├── PhantomSans0.6-Italic.woff │ ├── PhantomSans0.6-Italic.woff2 │ ├── PhantomSans0.6-Medium.ttf │ ├── PhantomSans0.6-Medium.woff │ ├── PhantomSans0.6-Medium.woff2 │ ├── PhantomSans0.6-Regular.ttf │ ├── PhantomSans0.6-Regular.woff │ ├── PhantomSans0.6-Regular.woff2 │ ├── PhantomSans0.6-Semibold.ttf │ ├── PhantomSans0.6-Semibold.woff │ └── PhantomSans0.6-Semibold.woff2 ├── github-edit.svg ├── github.svg ├── grain.jpg ├── next-black.png ├── next-white.png ├── portrait-decoration.svg ├── save-button.gif ├── sketch.html ├── sketch.js ├── slack.svg ├── steps │ ├── create-pr.gif │ ├── create-pr.mp4 │ ├── dino-wallpaper.jpg │ ├── drawing-dino.gif │ ├── drawing-dino.png │ ├── edit-readme.gif │ ├── edit-readme.mp4 │ ├── motivational-dino.png │ ├── new-branch.gif │ ├── new-branch.mp4 │ ├── star.gif │ ├── star.mp4 │ ├── start-editing-readme.gif │ ├── start-editing-readme.mp4 │ ├── upload.gif │ └── upload.mp4 ├── template-button.gif ├── template.jpg ├── thick-button.gif └── thin-button.gif ├── screenshot.png └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | node_modules/ 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | .env* 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Screenshot of site](screenshot.png) 2 | 3 | # Make a Dino 4 | 5 | Hack Club's workshop on submitting PRs on GitHub 6 | 7 | ```sh 8 | # install 9 | $ git clone https://github.com/hackclub/draw-dino 10 | $ cd draw-dino 11 | $ yarn install 12 | 13 | # run a live-reloading server in development 14 | $ yarn dev 15 | ``` 16 | 17 | Before committing, make sure to run the built-in formatter: 18 | 19 | ```sh 20 | $ yarn fmt 21 | ``` 22 | -------------------------------------------------------------------------------- /components/ending.js: -------------------------------------------------------------------------------- 1 | import FilmGrain from './filmGrain' 2 | import packageJson from '../package.json' 3 | 4 | const containerStyle = { 5 | width: '100%', 6 | height: '100vh', 7 | minHeight: '30em', 8 | overflow: 'hidden', 9 | margin: 0, 10 | background: 'black', 11 | fontFamily: "'Bellefair', serif", 12 | display: 'flex', 13 | position: 'relative', 14 | alignItems: 'center', 15 | justifyContent: 'center', 16 | } 17 | 18 | const bannerStyle = { 19 | background: '#222', 20 | boxShadow: '0 0 15vh 15vh #222', 21 | textAlign: 'center', 22 | color: 'white', 23 | margin: '0 auto', 24 | display: 'flex', 25 | flexDirection: 'column', 26 | position: 'absolute', 27 | padding: '1em', 28 | } 29 | 30 | const titleStyle = { 31 | fontFamily: "'Yesteryear', cursive", 32 | fontSize: '8em', 33 | padding: '1em', 34 | paddingBottom: 0, 35 | fontStyle: 'italic', 36 | marginTop: 0, 37 | marginBottom: 0, 38 | textShadow: ` 39 | 1px 1px 3px #ddd, 40 | 2px 2px 9px #555, 41 | 3px 3px 2px #999, 42 | 4px 4px 4px #999, 43 | 6px 6px 6px #999, 44 | 6px 6px 6px #999, 45 | 0.2em 0.2em 0.25em black`, 46 | } 47 | 48 | const footerStyle = { 49 | fontSize: '0.5em', 50 | textShadow: ` 51 | 0px 0px 2px #ddd, 52 | 1px 1px 2px #ccc, 53 | 0 0 1em black`, 54 | } 55 | 56 | export default () => ( 57 | <> 58 | 85 |
86 |
87 | 91 | 100 | 109 | 118 |

The End

119 |

120 | Orpheus says:
121 | “That's all for now folks!” 122 |

123 | 127 |
128 |

129 | ©{' '} 130 | 131 | COPYTHIS FROM THE HACK FOUNDATION 132 | 133 |

134 |

NO RIGHTS RESERVED

135 |
136 |
137 | 138 |
139 | 140 | ) 141 | -------------------------------------------------------------------------------- /components/filmGrain.js: -------------------------------------------------------------------------------- 1 | // from this tutorial: https://redstapler.co/css-film-grain-effect/ 2 | 3 | const maskStyle = { 4 | position: 'absolute', 5 | top: '-20%', 6 | bottom: '-20%', 7 | right: '-20%', 8 | left: '-20%', 9 | pointerEvents: 'none', 10 | zIndex: '999', 11 | backgroundImage: 12 | 'url(data:image/png;base64,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)', 13 | } 14 | const containerStyle = { 15 | position: 'absolute', 16 | overflow: 'hidden', 17 | top: 0, 18 | right: 0, 19 | left: 0, 20 | bottom: 0, 21 | pointerEvents: 'none', 22 | } 23 | export default () => ( 24 | <> 25 | 66 |
67 |
68 |
69 | 70 | ) 71 | -------------------------------------------------------------------------------- /components/hackPack.js: -------------------------------------------------------------------------------- 1 | import ProgressButton from "./progressButton"; 2 | import FilmGrain from "./filmGrain"; 3 | 4 | const containerStyle = { 5 | width: "100%", 6 | height: "100vh", 7 | minHeight: "30em", 8 | overflow: "hidden", 9 | margin: 0, 10 | background: "black", 11 | fontFamily: "'Bellefair', serif", 12 | display: "flex", 13 | position: "relative", 14 | alignItems: "center", 15 | justifyContent: "center", 16 | }; 17 | 18 | const bannerStyle = { 19 | background: "#222", 20 | boxShadow: "0 0 15vh 15vh #222", 21 | textAlign: "center", 22 | color: "white", 23 | margin: "0 auto", 24 | display: "flex", 25 | flexDirection: "column", 26 | position: "absolute", 27 | padding: "1em", 28 | }; 29 | 30 | const footerStyle = { 31 | fontSize: "0.5em", 32 | textShadow: ` 33 | 1px 1px 1px #ddd, 34 | 2px 2px 1px #ccc, 35 | 0 0 1em black`, 36 | }; 37 | 38 | export default ({ index, progress, setProgress }) => ( 39 | <> 40 | 112 |
113 |
114 |
115 | 119 | 128 | 137 | 146 |

149 | Optional 150 |

151 |

152 | Orpheus says:
153 | “Get GitHub Pro through the Hack Pack!” 154 |

155 | 160 | 165 |

166 | Includes GitHub Pro, free domains, server credits, and much more! 167 |

168 |

Click here to get the Hack Pack

169 |
170 | 175 |
176 |

Click to Continue

177 | 181 |
182 |
183 |
184 |

© MMXXI — THE HACK FOUNDATION

185 |

NO RIGHTS RESERVED

186 |
187 |
188 |
189 | 190 |
191 | 192 | ); 193 | -------------------------------------------------------------------------------- /components/intro.js: -------------------------------------------------------------------------------- 1 | import ProgressButton from './progressButton' 2 | import packageJson from '../package.json' 3 | import FilmGrain from './filmGrain' 4 | 5 | const containerStyle = { 6 | width: '100%', 7 | height: '100vh', 8 | minHeight: '30em', 9 | overflow: 'auto', 10 | margin: 0, 11 | background: 'black', 12 | fontFamily: "'Bellefair', serif", 13 | display: 'flex', 14 | position: 'relative', 15 | alignItems: 'center', 16 | justifyContent: 'center', 17 | } 18 | 19 | const supertitleStyle = { 20 | fontFamily: "'Bellefair', serif", 21 | } 22 | 23 | const subtitleStyle = { 24 | fontSize: '2em', 25 | } 26 | 27 | const footerStyle = { 28 | fontSize: '0.5em', 29 | textShadow: ` 30 | 1px 1px 1px #ddd, 31 | 2px 2px 1px #ccc, 32 | 0 0 1em black`, 33 | } 34 | 35 | export default ({ index, progress, setProgress, github }) => ( 36 | <> 37 | 132 |
133 |
134 | 138 | 147 | 156 | 165 |

“HACK CLUB PRESENTS”

166 |

Orpheus the Dinosaur and {github} co-star in...

167 |

168 | “Draw a
169 | Dino” 170 |

171 |

172 | Or, An “Inter-Active” Primer to Submit Pull Requests 173 |

174 | 179 |
180 |

Click to Continue

181 | 185 |
186 |
187 |
188 |

189 | ©{' '} 190 | 191 | COPYTHIS FROM THE HACK FOUNDATION 192 | 193 |

194 |

NO RIGHTS RESERVED

195 |
196 |
197 | 198 |
199 | 200 | ) 201 | -------------------------------------------------------------------------------- /components/meta.js: -------------------------------------------------------------------------------- 1 | import Head from 'next/head' 2 | 3 | const fontImport = (family, weight, file) => ` 4 | @font-face { 5 | font-family: '${family}'; 6 | ${ 7 | weight && 8 | ` 9 | font-weight: ${weight}; 10 | ` 11 | } 12 | src: url('fonts/${file}.woff2') format('woff2'), 13 | url('fonts/${file}.woff') format('woff'), 14 | url('fonts/${file}.ttf') format('truetype'); 15 | } 16 | ` 17 | 18 | export default () => ( 19 | <> 20 | 21 | 22 | 23 | 7 | 8 | 9 | 10 | 11 | 12 |

Draw your dino. Hover over any tool for more info and example usage.

13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 |
23 | 24 | 25 | 31 | 32 | -------------------------------------------------------------------------------- /public/sketch.js: -------------------------------------------------------------------------------- 1 | async function sendMetric(type, key, value) { 2 | const response = await fetch("/api/metric", { 3 | method: "POST", 4 | headers: { 5 | "Content-Type": "application/json", 6 | }, 7 | body: JSON.stringify({ type, key, value }) 8 | }); 9 | if (!response.ok) { 10 | throw Error("Failed to send metric"); 11 | } 12 | } 13 | 14 | // Customization 15 | const scaling = 3 16 | const canvasWidth = 256 17 | const canvasHeight = 256 18 | const drawColor = 'black' 19 | const backgroundColor = 'white' 20 | const thinSize = 2 21 | const thickSize = 4 22 | 23 | var clicks = [] 24 | var templateVisibility = true 25 | var size = thinSize 26 | var color = drawColor 27 | var unsavedChanges = false 28 | var paint 29 | 30 | // Initialization 31 | const canvasDiv = document.querySelector('#canvasDiv') 32 | canvas = document.createElement('canvas') 33 | canvas.setAttribute('width', canvasWidth) 34 | canvas.setAttribute('height', canvasHeight) 35 | canvas.setAttribute('id', 'canvas') 36 | const pixelation = 'image-rendering: crisp-edges; image-rendering: pixelated;' 37 | const borders = 'border: 1px solid black;' 38 | canvas.setAttribute('style', `${pixelation} ${borders} width: ${canvasWidth * scaling}px; height: ${canvasHeight * scaling}px;`) 39 | canvasDiv.appendChild(canvas) 40 | if (typeof G_vmlCanvasManager != 'undefined') { 41 | canvas = G_vmlCanvasManager.initElement(canvas) 42 | } 43 | context = canvas.getContext('2d') 44 | const templateImage = new Image() 45 | templateImage.src = 'template.jpg' 46 | templateImage.addEventListener('load', e => { 47 | redraw() 48 | }) 49 | 50 | // Buttons & tools 51 | document.querySelector('#thickButton').addEventListener('click', e => { 52 | size = thickSize 53 | color = drawColor 54 | }) 55 | document.querySelector('#thinButton').addEventListener('click', e => { 56 | size = thinSize 57 | color = drawColor 58 | }) 59 | document.querySelector('#eraseButton').addEventListener('click', e => { 60 | color = backgroundColor 61 | }) 62 | document.querySelector('#templateButton').addEventListener('click', e => { 63 | templateVisibility = !templateVisibility 64 | redraw() 65 | }) 66 | function undo() { 67 | const doneClicks = clicks.filter(click => !click.undone) 68 | if (doneClicks.length > 0) { 69 | doneClicks[doneClicks.length - 1].undone = true 70 | redraw() 71 | } 72 | } 73 | document.querySelector('#undoButton').addEventListener('click', e => { 74 | undo() 75 | }) 76 | function redo() { 77 | const recentUndoneClick = clicks.find(click => click.undone) 78 | if (recentUndoneClick) { 79 | recentUndoneClick.undone = false 80 | redraw() 81 | } 82 | } 83 | document.querySelector('#redoButton').addEventListener('click', e => { 84 | redo() 85 | }) 86 | document.querySelector('#saveButton').addEventListener('click', e => { 87 | const filename = prompt("Name your dino drawing", "dino") 88 | 89 | const urlParams = {} 90 | window.location.search.replace('?', '').split('&').forEach(kvString => { 91 | const [key, value] = kvString.split('=') 92 | urlParams[key] = value 93 | }) 94 | const filePrefix = urlParams['filePrefix'] 95 | 96 | if (filename) { 97 | canvas.toBlob(blob => { 98 | let safeFileName = `${filePrefix}-${filename}`.replace(/[^\w+]/g, '_') 99 | 100 | try{ 101 | saveAs(blob, safeFileName + '.png') 102 | sendMetric("increment", "success.save_drawing", 1); 103 | unsavedChanges = false 104 | } catch (e) { 105 | console.log(e.message); 106 | sendMetric("increment", "errors.save_drawing", 1); 107 | } 108 | 109 | // If this is running as an embed, send the file off to the parent window 110 | if (window.parent) { 111 | window.parent.postMessage({filename: safeFileName + '.png', blob}, "*") 112 | } 113 | }) 114 | } 115 | }) 116 | 117 | document.addEventListener('keypress', e => { 118 | if ((e.ctrlKey || e.metaKey) && e.key === 'z') { 119 | e.preventDefault() 120 | 121 | undo() 122 | } 123 | if ((e.ctrlKey || e.metaKey) && e.key === 'y') { 124 | e.preventDefault() 125 | 126 | redo() 127 | } 128 | }) 129 | 130 | // double check with user before closing the page 131 | window.addEventListener('beforeunload', e => { 132 | if (unsavedChanges) { 133 | e.returnValue = 'You have unsaved changes that will be lost.'; 134 | } 135 | }); 136 | 137 | // sketching 138 | function addClick(x, y, dragging) { 139 | if (dragging) { 140 | // get the last click and add the coordinate 141 | const lastClick = clicks[clicks.length - 1] 142 | lastClick.points.push({x, y}) 143 | } else { 144 | // when we start clicking, we'll delete the "undone" history for good 145 | clicks = clicks.filter(click => !click.undone) 146 | // create a new click 147 | clicks.push({size, color, points: [ {x, y} ]}) 148 | } 149 | } 150 | 151 | function redraw() { 152 | context.fillStyle = backgroundColor 153 | context.fillRect(0, 0, context.canvas.width, context.canvas.height) 154 | 155 | if (templateVisibility) { 156 | context.drawImage(templateImage, context.canvas.width / 5, context.canvas.height / 5, context.canvas.width * 3 / 5, context.canvas.height * 3 / 5) 157 | } 158 | 159 | context.strokeStyle = drawColor 160 | 161 | clicks.filter(clicks => !clicks.undone).forEach(click => { 162 | context.beginPath() 163 | for (let i = 0; i < click.points.length; i++) { 164 | context.beginPath() 165 | let point = click.points[i] 166 | let prevPoint = click.points[i - 1] 167 | if (prevPoint) { 168 | context.moveTo(prevPoint.x, prevPoint.y) 169 | } else { 170 | context.moveTo(point.x - 1, point.y) 171 | } 172 | context.lineTo(point.x, point.y) 173 | context.closePath() 174 | context.strokeStyle = click.color 175 | context.lineWidth = click.size 176 | context.stroke() 177 | } 178 | }) 179 | } 180 | 181 | function clickStart(event) { 182 | event.preventDefault() 183 | unsavedChanges = true 184 | mouseX = (event.pageX - canvas.offsetLeft) / scaling 185 | mouseY = (event.pageY - canvas.offsetTop) / scaling 186 | addClick(mouseX, mouseY, false) 187 | paint = true 188 | redraw() 189 | } 190 | 191 | canvas.addEventListener('mousedown', e => { 192 | clickStart(e) 193 | }) 194 | canvas.addEventListener('touchstart', e => { 195 | clickStart(e) 196 | }) 197 | 198 | function clickDrag(event) { 199 | event.preventDefault() 200 | if (paint) { 201 | mouseX = (event.pageX - canvas.offsetLeft) / scaling 202 | mouseY = (event.pageY - canvas.offsetTop) / scaling 203 | addClick(mouseX, mouseY, true) 204 | redraw() 205 | } 206 | } 207 | canvas.addEventListener('mousemove', e => { 208 | clickDrag(e) 209 | }) 210 | canvas.addEventListener('touchmove', e => { 211 | clickDrag(e) 212 | }) 213 | 214 | function clickStop() { 215 | paint = false 216 | } 217 | canvas.addEventListener('mouseup', e => { 218 | clickStop() 219 | }) 220 | canvas.addEventListener('mouseleave', e => { 221 | clickStop() 222 | }) 223 | canvas.addEventListener('touchstop', e => { 224 | clickStop() 225 | }) 226 | canvas.addEventListener('touchcancel', e => { 227 | clickStop() 228 | }) 229 | 230 | // tooltips 231 | function genTooltip(id, image, description='') { 232 | tippy(`#${id}`, { 233 | content: `

${description}

`, 234 | delay: [500, 0], 235 | followCursor: 'horizontal', 236 | placement: 'bottom' 237 | }) 238 | } 239 | genTooltip('thinButton', 'thin-button.gif', 'Draw a thin black line') 240 | genTooltip('thickButton', 'thick-button.gif', 'Draw a thick black line') 241 | genTooltip('templateButton', 'template-button.gif', 'Show a dino outline you can use as a starting point. You can toggle it on and off anytime.') 242 | genTooltip('eraseButton', 'erase-button.gif', 'Draw with a white marker to erase mistakes or cut out black parts of an image. Also covers the dino template.') 243 | genTooltip('saveButton', 'save-button.gif', 'Saves the drawing to your computer. Automatically adds a file extension. This will not save your dino on this website.') 244 | -------------------------------------------------------------------------------- /public/slack.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/steps/create-pr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/create-pr.gif -------------------------------------------------------------------------------- /public/steps/create-pr.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/create-pr.mp4 -------------------------------------------------------------------------------- /public/steps/dino-wallpaper.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/dino-wallpaper.jpg -------------------------------------------------------------------------------- /public/steps/drawing-dino.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/drawing-dino.gif -------------------------------------------------------------------------------- /public/steps/drawing-dino.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/drawing-dino.png -------------------------------------------------------------------------------- /public/steps/edit-readme.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/edit-readme.gif -------------------------------------------------------------------------------- /public/steps/edit-readme.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/edit-readme.mp4 -------------------------------------------------------------------------------- /public/steps/motivational-dino.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/motivational-dino.png -------------------------------------------------------------------------------- /public/steps/new-branch.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/new-branch.gif -------------------------------------------------------------------------------- /public/steps/new-branch.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/new-branch.mp4 -------------------------------------------------------------------------------- /public/steps/star.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/star.gif -------------------------------------------------------------------------------- /public/steps/star.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/star.mp4 -------------------------------------------------------------------------------- /public/steps/start-editing-readme.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/start-editing-readme.gif -------------------------------------------------------------------------------- /public/steps/start-editing-readme.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/start-editing-readme.mp4 -------------------------------------------------------------------------------- /public/steps/upload.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/upload.gif -------------------------------------------------------------------------------- /public/steps/upload.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/steps/upload.mp4 -------------------------------------------------------------------------------- /public/template-button.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/template-button.gif -------------------------------------------------------------------------------- /public/template.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/template.jpg -------------------------------------------------------------------------------- /public/thick-button.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/thick-button.gif -------------------------------------------------------------------------------- /public/thin-button.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/public/thin-button.gif -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/draw-dino/bf6878eb9e2dce56410a3af6a3d6bd128a1eacd6/screenshot.png -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@next/env@14.1.1": 6 | version "14.1.1" 7 | resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.1.tgz#80150a8440eb0022a73ba353c6088d419b908bac" 8 | integrity sha512-7CnQyD5G8shHxQIIg3c7/pSeYFeMhsNbpU/bmvH7ZnDql7mNRgg8O2JZrhrc/soFnfBnKP4/xXNiiSIPn2w8gA== 9 | 10 | "@next/swc-darwin-arm64@14.1.1": 11 | version "14.1.1" 12 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.1.tgz#b74ba7c14af7d05fa2848bdeb8ee87716c939b64" 13 | integrity sha512-yDjSFKQKTIjyT7cFv+DqQfW5jsD+tVxXTckSe1KIouKk75t1qZmj/mV3wzdmFb0XHVGtyRjDMulfVG8uCKemOQ== 14 | 15 | "@next/swc-darwin-x64@14.1.1": 16 | version "14.1.1" 17 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.1.tgz#82c3e67775e40094c66e76845d1a36cc29c9e78b" 18 | integrity sha512-KCQmBL0CmFmN8D64FHIZVD9I4ugQsDBBEJKiblXGgwn7wBCSe8N4Dx47sdzl4JAg39IkSN5NNrr8AniXLMb3aw== 19 | 20 | "@next/swc-linux-arm64-gnu@14.1.1": 21 | version "14.1.1" 22 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.1.tgz#4f4134457b90adc5c3d167d07dfb713c632c0caa" 23 | integrity sha512-YDQfbWyW0JMKhJf/T4eyFr4b3tceTorQ5w2n7I0mNVTFOvu6CGEzfwT3RSAQGTi/FFMTFcuspPec/7dFHuP7Eg== 24 | 25 | "@next/swc-linux-arm64-musl@14.1.1": 26 | version "14.1.1" 27 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.1.tgz#594bedafaeba4a56db23a48ffed2cef7cd09c31a" 28 | integrity sha512-fiuN/OG6sNGRN/bRFxRvV5LyzLB8gaL8cbDH5o3mEiVwfcMzyE5T//ilMmaTrnA8HLMS6hoz4cHOu6Qcp9vxgQ== 29 | 30 | "@next/swc-linux-x64-gnu@14.1.1": 31 | version "14.1.1" 32 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.1.tgz#cb4e75f1ff2b9bcadf2a50684605928ddfc58528" 33 | integrity sha512-rv6AAdEXoezjbdfp3ouMuVqeLjE1Bin0AuE6qxE6V9g3Giz5/R3xpocHoAi7CufRR+lnkuUjRBn05SYJ83oKNQ== 34 | 35 | "@next/swc-linux-x64-musl@14.1.1": 36 | version "14.1.1" 37 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.1.tgz#15f26800df941b94d06327f674819ab64b272e25" 38 | integrity sha512-YAZLGsaNeChSrpz/G7MxO3TIBLaMN8QWMr3X8bt6rCvKovwU7GqQlDu99WdvF33kI8ZahvcdbFsy4jAFzFX7og== 39 | 40 | "@next/swc-win32-arm64-msvc@14.1.1": 41 | version "14.1.1" 42 | resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.1.tgz#060c134fa7fa843666e3e8574972b2b723773dd9" 43 | integrity sha512-1L4mUYPBMvVDMZg1inUYyPvFSduot0g73hgfD9CODgbr4xiTYe0VOMTZzaRqYJYBA9mana0x4eaAaypmWo1r5A== 44 | 45 | "@next/swc-win32-ia32-msvc@14.1.1": 46 | version "14.1.1" 47 | resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.1.tgz#5c06889352b1f77e3807834a0d0afd7e2d2d1da2" 48 | integrity sha512-jvIE9tsuj9vpbbXlR5YxrghRfMuG0Qm/nZ/1KDHc+y6FpnZ/apsgh+G6t15vefU0zp3WSpTMIdXRUsNl/7RSuw== 49 | 50 | "@next/swc-win32-x64-msvc@14.1.1": 51 | version "14.1.1" 52 | resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.1.tgz#d38c63a8f9b7f36c1470872797d3735b4a9c5c52" 53 | integrity sha512-S6K6EHDU5+1KrBDLko7/c1MNy/Ya73pIAmvKeFwsF4RmBFJSO7/7YeD4FnZ4iBdzE69PpQ4sOMU9ORKeNuxe8A== 54 | 55 | "@swc/helpers@0.5.2": 56 | version "0.5.2" 57 | resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" 58 | integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== 59 | dependencies: 60 | tslib "^2.4.0" 61 | 62 | busboy@1.6.0: 63 | version "1.6.0" 64 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" 65 | integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== 66 | dependencies: 67 | streamsearch "^1.1.0" 68 | 69 | caniuse-lite@^1.0.30001579: 70 | version "1.0.30001589" 71 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz#7ad6dba4c9bf6561aec8291976402339dc157dfb" 72 | integrity sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg== 73 | 74 | client-only@0.0.1: 75 | version "0.0.1" 76 | resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" 77 | integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== 78 | 79 | dotenv@^16.4.5: 80 | version "16.4.5" 81 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" 82 | integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== 83 | 84 | graceful-fs@^4.2.11: 85 | version "4.2.11" 86 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 87 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 88 | 89 | "js-tokens@^3.0.0 || ^4.0.0": 90 | version "4.0.0" 91 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 92 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 93 | 94 | lodash.throttle@^4.1.1: 95 | version "4.1.1" 96 | resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" 97 | integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= 98 | 99 | loose-envify@^1.1.0, loose-envify@^1.4.0: 100 | version "1.4.0" 101 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 102 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 103 | dependencies: 104 | js-tokens "^3.0.0 || ^4.0.0" 105 | 106 | nanoid@^3.3.6: 107 | version "3.3.7" 108 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" 109 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 110 | 111 | next@^14.1.1: 112 | version "14.1.1" 113 | resolved "https://registry.yarnpkg.com/next/-/next-14.1.1.tgz#92bd603996c050422a738e90362dff758459a171" 114 | integrity sha512-McrGJqlGSHeaz2yTRPkEucxQKe5Zq7uPwyeHNmJaZNY4wx9E9QdxmTp310agFRoMuIYgQrCrT3petg13fSVOww== 115 | dependencies: 116 | "@next/env" "14.1.1" 117 | "@swc/helpers" "0.5.2" 118 | busboy "1.6.0" 119 | caniuse-lite "^1.0.30001579" 120 | graceful-fs "^4.2.11" 121 | postcss "8.4.31" 122 | styled-jsx "5.1.1" 123 | optionalDependencies: 124 | "@next/swc-darwin-arm64" "14.1.1" 125 | "@next/swc-darwin-x64" "14.1.1" 126 | "@next/swc-linux-arm64-gnu" "14.1.1" 127 | "@next/swc-linux-arm64-musl" "14.1.1" 128 | "@next/swc-linux-x64-gnu" "14.1.1" 129 | "@next/swc-linux-x64-musl" "14.1.1" 130 | "@next/swc-win32-arm64-msvc" "14.1.1" 131 | "@next/swc-win32-ia32-msvc" "14.1.1" 132 | "@next/swc-win32-x64-msvc" "14.1.1" 133 | 134 | node-statsd@^0.1.1: 135 | version "0.1.1" 136 | resolved "https://registry.yarnpkg.com/node-statsd/-/node-statsd-0.1.1.tgz#27a59348763d0af7a037ac2a031fef3f051013d3" 137 | integrity sha512-QDf6R8VXF56QVe1boek8an/Rb3rSNaxoFWb7Elpsv2m1+Noua1yy0F1FpKpK5VluF8oymWM4w764A4KsYL4pDg== 138 | 139 | object-assign@^4.1.1: 140 | version "4.1.1" 141 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 142 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 143 | 144 | picocolors@^1.0.0: 145 | version "1.0.0" 146 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 147 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 148 | 149 | postcss@8.4.31: 150 | version "8.4.31" 151 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" 152 | integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== 153 | dependencies: 154 | nanoid "^3.3.6" 155 | picocolors "^1.0.0" 156 | source-map-js "^1.0.2" 157 | 158 | prop-types@^15.5.8, prop-types@^15.7.2: 159 | version "15.7.2" 160 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" 161 | integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== 162 | dependencies: 163 | loose-envify "^1.4.0" 164 | object-assign "^4.1.1" 165 | react-is "^16.8.1" 166 | 167 | react-dom@^18.2.0: 168 | version "18.2.0" 169 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" 170 | integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== 171 | dependencies: 172 | loose-envify "^1.1.0" 173 | scheduler "^0.23.0" 174 | 175 | react-input-autosize@^2.2.2: 176 | version "2.2.2" 177 | resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz#fcaa7020568ec206bc04be36f4eb68e647c4d8c2" 178 | integrity sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw== 179 | dependencies: 180 | prop-types "^15.5.8" 181 | 182 | react-is@^16.8.1: 183 | version "16.13.1" 184 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 185 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== 186 | 187 | react-scroll@^1.8.1: 188 | version "1.8.1" 189 | resolved "https://registry.yarnpkg.com/react-scroll/-/react-scroll-1.8.1.tgz#eb4052265f1606cf60855c981ebcfed1bc3beff3" 190 | integrity sha512-UAKmawFHn+c7x/DoXuHqOsQ5xwNk2Dxv7vP8Ft41K2hglPWkshcSos0tMTr8704UkFqImoUGzMTdN4vuZXoqbw== 191 | dependencies: 192 | lodash.throttle "^4.1.1" 193 | prop-types "^15.7.2" 194 | 195 | react@^18.2.0: 196 | version "18.2.0" 197 | resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" 198 | integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== 199 | dependencies: 200 | loose-envify "^1.1.0" 201 | 202 | scheduler@^0.23.0: 203 | version "0.23.0" 204 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" 205 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== 206 | dependencies: 207 | loose-envify "^1.1.0" 208 | 209 | source-map-js@^1.0.2: 210 | version "1.0.2" 211 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 212 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 213 | 214 | streamsearch@^1.1.0: 215 | version "1.1.0" 216 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" 217 | integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== 218 | 219 | styled-jsx@5.1.1: 220 | version "5.1.1" 221 | resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" 222 | integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== 223 | dependencies: 224 | client-only "0.0.1" 225 | 226 | tslib@^2.4.0: 227 | version "2.6.2" 228 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" 229 | integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== 230 | --------------------------------------------------------------------------------