├── .babelrc ├── .gitignore ├── CNAME ├── CODE_OF_CONDUCT.md ├── README.md ├── deploy.sh ├── gulpfile.js ├── package.json └── src ├── app.css ├── app.js ├── background-overlay.js ├── brush-picker-pane.js ├── brush-preview.js ├── draw-canvas.js ├── emoji-map.js ├── footer-menu.js ├── images ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── browserconfig.xml ├── emoji │ ├── apple │ │ ├── black │ │ │ ├── 1f393.png │ │ │ ├── 1f3a5.png │ │ │ ├── 1f3a9.png │ │ │ ├── 1f3b1.png │ │ │ ├── 1f403.png │ │ │ ├── 1f41c.png │ │ │ ├── 1f4de.png │ │ │ └── 1f50c.png │ │ ├── blue-light │ │ │ ├── 1f3bd.png │ │ │ ├── 1f433.png │ │ │ ├── 1f455.png │ │ │ ├── 1f4a7.png │ │ │ └── 2744.png │ │ ├── blue │ │ │ ├── 1f4d8.png │ │ │ ├── 1f5fe.png │ │ │ ├── 1f698.png │ │ │ ├── 1f6e2.png │ │ │ └── 2693.png │ │ ├── brown-dark │ │ │ ├── 1f330.png │ │ │ ├── 1f357.png │ │ │ ├── 1f369.png │ │ │ ├── 1f3c8.png │ │ │ ├── 1f45c.png │ │ │ ├── 1f45e.png │ │ │ ├── 1f4a9.png │ │ │ └── 1f982.png │ │ ├── brown-light │ │ │ ├── 1f36a.png │ │ │ ├── 1f3c6.png │ │ │ ├── 1f3c9.png │ │ │ ├── 1f42a.png │ │ │ ├── 1f43b.png │ │ │ ├── 1f4e6.png │ │ │ └── 1f6aa.png │ │ ├── green-dark │ │ │ ├── 1f335.png │ │ │ ├── 1f409.png │ │ │ ├── 1f40a.png │ │ │ ├── 1f40d.png │ │ │ ├── 1f422.png │ │ │ └── 1f432.png │ │ ├── green-light │ │ │ ├── 1f340.png │ │ │ ├── 1f343.png │ │ │ ├── 1f34f.png │ │ │ ├── 1f438.png │ │ │ ├── 1f4d7.png │ │ │ ├── 2618.png │ │ │ └── 267b.png │ │ ├── grey-dark │ │ │ ├── 1f311.png │ │ │ ├── 1f399.png │ │ │ ├── 1f3ae.png │ │ │ ├── 1f529.png │ │ │ ├── 1f58a.png │ │ │ └── 1f68a.png │ │ ├── grey-light │ │ │ ├── 1f368.png │ │ │ ├── 1f3d0.png │ │ │ ├── 1f40f.png │ │ │ ├── 1f516.png │ │ │ ├── 1f527.png │ │ │ ├── 1f56f.png │ │ │ ├── 1f5d1.png │ │ │ └── 1f5dc.png │ │ ├── grey-medium │ │ │ ├── 1f400.png │ │ │ ├── 1f480.png │ │ │ ├── 1f517.png │ │ │ ├── 1f58b.png │ │ │ ├── 2620.png │ │ │ ├── 2694.png │ │ │ └── 26d3.png │ │ ├── indigo │ │ │ ├── 1f346.png │ │ │ ├── 1f456.png │ │ │ ├── 1f699.png │ │ │ ├── 1f6cb.png │ │ │ ├── 2602.png │ │ │ └── 2614.png │ │ ├── orange │ │ │ ├── 1f34a.png │ │ │ ├── 1f383.png │ │ │ ├── 1f3c0.png │ │ │ └── 1f458.png │ │ ├── pink │ │ │ ├── 1f338.png │ │ │ ├── 1f33a.png │ │ │ ├── 1f380.png │ │ │ ├── 1f39f.png │ │ │ ├── 1f437.png │ │ │ ├── 1f43d.png │ │ │ ├── 1f444.png │ │ │ ├── 1f459.png │ │ │ └── 1f45b.png │ │ ├── red │ │ │ ├── 1f336.png │ │ │ ├── 1f34e.png │ │ │ ├── 1f353.png │ │ │ ├── 1f392.png │ │ │ ├── 1f47a.png │ │ │ ├── 1f58d.png │ │ │ ├── 1f980.png │ │ │ └── 260e.png │ │ ├── white │ │ │ ├── 1f35a.png │ │ │ ├── 1f3f3.png │ │ │ ├── 1f401.png │ │ │ ├── 1f407.png │ │ │ ├── 1f410.png │ │ │ ├── 1f4ad.png │ │ │ ├── 1f984.png │ │ │ └── 2601.png │ │ └── yellow │ │ │ ├── 1f315.png │ │ │ ├── 1f319.png │ │ │ ├── 1f31d.png │ │ │ ├── 1f34b.png │ │ │ ├── 1f424.png │ │ │ └── 1f431.png │ └── google │ │ ├── black │ │ ├── 1f3a5.png │ │ ├── 1f3a9.png │ │ ├── 1f3b1.png │ │ ├── 1f4a3.png │ │ ├── 1f576.png │ │ └── 1f5dd.png │ │ ├── blue-light │ │ ├── 1f4a7.png │ │ ├── 1f516.png │ │ ├── 2668.png │ │ ├── 2693.png │ │ └── 2744.png │ │ ├── blue │ │ ├── 1f41f.png │ │ ├── 1f5f3.png │ │ ├── 1f68e.png │ │ ├── 1f6e1.png │ │ └── 2708.png │ │ ├── brown-dark │ │ ├── 1f3c8.png │ │ ├── 1f40e.png │ │ ├── 1f43b.png │ │ ├── 1f45e.png │ │ ├── 1f4a9.png │ │ └── 1f4ff.png │ │ ├── brown-light │ │ ├── 1f36a.png │ │ ├── 1f375.png │ │ ├── 1f3da.png │ │ ├── 1f43f.png │ │ ├── 1f58a.png │ │ └── 26b0.png │ │ ├── green-dark │ │ ├── 1f33f.png │ │ ├── 1f40a.png │ │ ├── 1f432.png │ │ ├── 1f458.png │ │ └── 2618.png │ │ ├── green-light │ │ ├── 1f348.png │ │ ├── 1f350.png │ │ ├── 1f40d.png │ │ ├── 1f438.png │ │ └── 1f4b8.png │ │ ├── grey-dark │ │ ├── 1f39e.png │ │ ├── 1f4f0.png │ │ ├── 1f577.png │ │ └── 1f578.png │ │ ├── grey-light │ │ ├── 1f3d0.png │ │ ├── 1f3db.png │ │ ├── 1f54a.png │ │ ├── 1f56f.png │ │ └── 1f5d2.png │ │ ├── grey-medium │ │ ├── 1f399.png │ │ ├── 1f400.png │ │ ├── 1f403.png │ │ ├── 1f480.png │ │ └── 1f6e2.png │ │ ├── indigo │ │ ├── 1f302.png │ │ ├── 1f40b.png │ │ ├── 1f418.png │ │ ├── 1f42c.png │ │ ├── 1f456.png │ │ ├── 1f6b0.png │ │ └── 260e.png │ │ ├── orange │ │ ├── 1f342.png │ │ ├── 1f3c9.png │ │ ├── 1f420.png │ │ ├── 1f431.png │ │ ├── 1f434.png │ │ └── 2638.png │ │ ├── pink │ │ ├── 1f338.png │ │ ├── 1f33c.png │ │ ├── 1f346.png │ │ ├── 1f347.png │ │ ├── 1f351.png │ │ ├── 1f429.png │ │ ├── 1f457.png │ │ ├── 1f460.png │ │ └── 1f47e.png │ │ ├── red │ │ ├── 1f336.png │ │ ├── 1f337.png │ │ ├── 1f339.png │ │ ├── 1f39f.png │ │ ├── 1f58d.png │ │ ├── 1f608.png │ │ └── 1f980.png │ │ ├── white │ │ ├── 1f401.png │ │ ├── 1f407.png │ │ ├── 1f410.png │ │ ├── 1f6c1.png │ │ └── 1f984.png │ │ └── yellow │ │ ├── 1f34b.png │ │ ├── 1f397.png │ │ ├── 1f3f7.png │ │ ├── 1f41d.png │ │ ├── 1f424.png │ │ ├── 1f425.png │ │ └── 1f4a1.png ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── manifest.json ├── maskable_icon_x192.png ├── maskable_icon_x512.png ├── mstile-150x150.png └── safari-pinned-tab.svg ├── index.html ├── manifest.json ├── page-menu.js ├── size-picker.js ├── sw.js └── welcome.json /.babelrc: -------------------------------------------------------------------------------- 1 | { "presets": ["es2015"] } 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | npm-debug.log 5 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | www.mojibrush.co 2 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at sam@samx.it. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ 75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #### View Live 2 | 3 | https://www.mojibrush.co 4 | 5 | 6 | #### Dev (Chrome) 7 | 8 | * `cd src/` 9 | * `python3 -m http.server` 10 | * `open localhost:8000` 11 | 12 | > When deving make sure to command+shift+r to reload to bypass service worker. 13 | 14 | 15 | #### Testing in Safari/Firefox/Edge/IE 16 | 17 | * `npm run build` to build an ES5, CSS3, Web Component-polyfilled version 18 | * `cd dist/` 19 | * `python3 -m http.server` 20 | * `open localhost:8000` 21 | 22 | #### Deploying 23 | 24 | * `npm run deploy` 25 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | npm run build 5 | cd dist 6 | git init --initial-branch=master 7 | git remote add origin git@github.com:samccone/moji-brush.git 8 | git fetch 9 | git add . 10 | git commit -m "🎄 Deploy $(date)" 11 | git checkout gh-pages 12 | git cherry-pick master --keep-redundant-commits --strategy-option theirs 13 | git push --set-upstream origin gh-pages 14 | cd .. 15 | rm -rf dist 16 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'); 2 | var postcss = require('gulp-postcss'); 3 | var cssnano = require('cssnano'); 4 | var autoprefixer = require('autoprefixer'); 5 | var replace = require('gulp-replace'); 6 | 7 | gulp.task('babelify', function () { 8 | return gulp.src(['src/**/*.js', '!src/sw.js']) 9 | .pipe(gulp.dest('dist')); 10 | }); 11 | 12 | gulp.task('css', function () { 13 | var processors = [ 14 | autoprefixer({browsers: ['last 2 versions']}), 15 | cssnano(), 16 | ]; 17 | return gulp.src('src/app.css') 18 | .pipe(postcss(processors)) 19 | .pipe(gulp.dest('dist')); 20 | }); 21 | 22 | gulp.task('images', function () { 23 | return gulp.src(['src/images/**', '!**/.DS_Store']) 24 | .pipe(gulp.dest('dist/images/')); 25 | }); 26 | 27 | gulp.task('html', function () { 28 | return gulp.src('src/index.html') 29 | .pipe(gulp.dest('dist')); 30 | }); 31 | 32 | gulp.task('assets', function () { 33 | return gulp.src(['src/*.json', 'src/sw.js']) 34 | .pipe(gulp.dest('dist/')); 35 | }); 36 | 37 | 38 | gulp.task('github', function () { 39 | return gulp.src('CNAME') 40 | .pipe(gulp.dest('dist')); 41 | }); 42 | 43 | 44 | gulp.task('default', [ 45 | 'babelify', 46 | 'css', 47 | 'images', 48 | 'html', 49 | 'assets', 50 | 'github'], function() { 51 | console.log('Build Done'); 52 | }); 53 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "moji-brush", 3 | "version": "1.0.0", 4 | "description": "Paint with emoji progressive web app", 5 | "main": "gulpfile.js", 6 | "dependencies": { 7 | }, 8 | "devDependencies": { 9 | "autoprefixer": "^6.0.0", 10 | "gulp": "^3.9.1", 11 | "gulp-concat": "^2.6.0", 12 | "gulp-cssnano": "^2.1.2", 13 | "gulp-postcss": "^6.1.1", 14 | "gulp-replace": "^0.5.4" 15 | }, 16 | "resolutions": { 17 | "graceful-fs": "^4.2.11" 18 | }, 19 | "scripts": { 20 | "build": "gulp", 21 | "deploy": "./deploy.sh" 22 | }, 23 | "repository": { 24 | "type": "git", 25 | "url": "git+https://github.com/samccone/moji-brush.git" 26 | }, 27 | "keywords": [ 28 | "Moji", 29 | "Paint", 30 | "Emoji", 31 | "Painting", 32 | "Progressive", 33 | "Web", 34 | "App" 35 | ], 36 | "author": "samccone", 37 | "license": "ISC", 38 | "bugs": { 39 | "url": "https://github.com/samccone/moji-brush/issues" 40 | }, 41 | "homepage": "https://github.com/samccone/moji-brush#readme" 42 | } 43 | -------------------------------------------------------------------------------- /src/app.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | } 5 | 6 | body { 7 | overflow: hidden; 8 | /* multi-platform system font stack */ 9 | font-family: -apple-system, BlinkMacSystemFont, 10 | "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", 11 | "Fira Sans", "Droid Sans", "Helvetica Neue", 12 | sans-serif; 13 | } 14 | 15 | :root { 16 | --active-button-fill: #c6ff00; 17 | } 18 | 19 | #reload-prompt { 20 | position: absolute; 21 | background: #111111b3; 22 | color: #fff; 23 | padding: 20px; 24 | border-radius: 8px; 25 | left: 50%; 26 | margin-left: -131px; 27 | margin-top: 30px; 28 | box-shadow: 0 3px 4px #e2e2e2; 29 | cursor: pointer; 30 | visibility: hidden; 31 | } 32 | 33 | .overlay { 34 | position: fixed; 35 | width: 100%; 36 | height: 100%; 37 | bottom: 0; 38 | z-index: -1; 39 | background-color: rgba(0, 0, 0, 0); 40 | transition: all 150ms cubic-bezier(0.39, 0.58, 0.72, 1); 41 | cursor: none; 42 | pointer-events: none; 43 | } 44 | 45 | .menu-open .overlay { 46 | background-color: rgba(0, 0, 0, 0.25); 47 | z-index: 0; 48 | cursor: pointer; 49 | pointer-events: auto; 50 | } 51 | 52 | draw-canvas { 53 | -webkit-tap-highlight-color: rgba(0,0,0,0); 54 | } 55 | 56 | .menu-open draw-canvas { 57 | pointer-events: none; 58 | } 59 | 60 | canvas { 61 | display: block; 62 | cursor: crosshair; 63 | background-color: #FFF; 64 | } 65 | 66 | footer-menu { 67 | position: relative; 68 | box-sizing: border-box; 69 | background: linear-gradient(to bottom, #333333 0%,#1c1c1c 100%); 70 | border-top: 1px solid #424242; 71 | border-bottom: 1px solid #252525; 72 | display: flex; 73 | justify-content: center; 74 | align-items: center; 75 | height: 60px; 76 | width: 100%; 77 | } 78 | 79 | .menusys { 80 | position: fixed; 81 | bottom: 0; 82 | width: 100%; 83 | will-change: transform; 84 | transform: translateY(240px); 85 | } 86 | 87 | .menu-items li { 88 | justify-content: center; 89 | display: flex; 90 | width: 20%; 91 | } 92 | 93 | .pane-slider-container { 94 | overflow: hidden; 95 | } 96 | 97 | #pane-slider { 98 | display: flex; 99 | flex-direction: row; 100 | } 101 | 102 | #pane-slider > * { 103 | min-width: 100%; 104 | overflow: hidden; 105 | } 106 | 107 | .menu-open .menusys{ 108 | transform: translateY(0); 109 | } 110 | 111 | @media (min-width: 600px) { 112 | .menusys { 113 | position: fixed; 114 | max-width: 600px; 115 | left: calc(50% - (600px / 2)); 116 | } 117 | footer-menu { 118 | border-top-left-radius: 4px; 119 | border-top-right-radius: 4px; 120 | } 121 | } 122 | 123 | footer-menu ul { 124 | list-style: none; 125 | display: flex; 126 | justify-content: space-around; 127 | width: 100%; 128 | } 129 | 130 | page-menu svg, .menu-items svg { 131 | width: 28px; 132 | height: 28px; 133 | fill: #e6e6e6; 134 | cursor: pointer; 135 | } 136 | 137 | .brush-selection { 138 | font-size: 40px; 139 | background: #F5F5F5; 140 | text-align: center; 141 | border-radius: 4px; 142 | display: flex; 143 | } 144 | 145 | emoji-print { 146 | display: inline-block; 147 | } 148 | 149 | .brushes { 150 | display: flex; 151 | justify-content: space-around; 152 | } 153 | 154 | .brush-size { 155 | width: 100%; 156 | } 157 | 158 | brush-picker { 159 | display: block; 160 | height: 100%; 161 | width: 100%; 162 | background: rgb(132, 132, 132); 163 | } 164 | 165 | brush-picker div { 166 | display: flex; 167 | justify-content: space-around; 168 | flex-wrap: wrap; 169 | height: 100%; 170 | overflow: auto; 171 | font-size: 50px; 172 | } 173 | 174 | .dashboard-open .dashboard svg { 175 | fill: var(--active-button-fill);; 176 | } 177 | 178 | page-menu { 179 | box-sizing: border-box; 180 | background: #4d4d4d; 181 | background: linear-gradient(to bottom, #424242 0%,#212121 100%); 182 | border-top: 1px solid #424242; 183 | border-bottom: 1px solid #252525; 184 | padding-left: 24px; 185 | padding-right: 24px; 186 | height: 240px; 187 | width: 100%; 188 | } 189 | 190 | page-menu ul { 191 | display: flex; 192 | justify-content: space-around; 193 | align-items: center; 194 | height: 100%; 195 | width: 100%; 196 | list-style: none; 197 | font-size: 12px; 198 | line-height: 1.4; 199 | font-weight: 300; 200 | color: #e6e6e6; 201 | } 202 | 203 | page-menu li { 204 | display: block; 205 | cursor: pointer; 206 | } 207 | 208 | page-menu li svg { 209 | display: block; 210 | margin-left: auto; 211 | margin-right: auto; 212 | } 213 | 214 | page-menu .menu-item-title { 215 | margin-top: 4px; 216 | text-align: center; 217 | } 218 | 219 | .disabled { 220 | color: #909090; 221 | cursor: default; 222 | } 223 | 224 | .disabled svg { 225 | fill: #909090; 226 | cursor: default; 227 | } 228 | 229 | .toggle-box { 230 | display: flex; 231 | justify-content: space-around; 232 | align-items: center; 233 | height: 36px; 234 | min-width: 120px; 235 | border-radius: 4px; 236 | background-color: rgba(255, 255, 255, 0.15); 237 | } 238 | 239 | page-menu li .button svg { 240 | height: 36px; 241 | width: 36px; 242 | } 243 | 244 | page-menu li .toggle-box svg { 245 | margin-top: -3px; 246 | width: 24px; 247 | height: 24px; 248 | } 249 | 250 | .active svg { 251 | fill: var(--active-button-fill);; 252 | } 253 | 254 | .brush-picker-open .brush svg { 255 | fill: var(--active-button-fill); 256 | } 257 | 258 | brush-picker-pane { 259 | width: 100%; 260 | height: 240px; 261 | -webkit-tap-highlight-color: rgba(0,0,0,0); 262 | } 263 | 264 | .brush-picker-open brush-picker-pane { 265 | cursor: pointer; 266 | } 267 | 268 | brush-picker-pane .tabs { 269 | display: flex; 270 | justify-content: space-around; 271 | list-style: none; 272 | color: #e6e6e6; 273 | background: linear-gradient(to bottom, #424242 0%,#212121 100%); 274 | border-top: 1px solid #424242; 275 | border-bottom: 1px solid #252525; 276 | height: 60px; 277 | z-index: 1; 278 | box-shadow: 0 3px 10px rgba(0, 0, 0, 0.37); 279 | } 280 | 281 | 282 | brush-picker-pane .tabs li { 283 | width: 33%; 284 | text-align: center; 285 | padding: 16px; 286 | font-size: 18px; 287 | cursor: pointer; 288 | margin: 0 16px; 289 | } 290 | 291 | brush-picker-pane .tabs li.active { 292 | border-bottom: solid 3px #cbcbcb; 293 | } 294 | 295 | .pane-content { 296 | height: 240px; 297 | 298 | background: #f5f5f5; 299 | box-shadow: inset 0 3px 10px #737373; 300 | } 301 | 302 | size-picker { 303 | box-sizing: border-box; 304 | background: linear-gradient(to bottom, #424242 0%,#212121 100%); 305 | border-top: 1px solid #424242; 306 | border-bottom: 1px solid #252525; 307 | height: 240px; 308 | width: 100%; 309 | } 310 | 311 | .size-picker-open .size svg { 312 | fill: var(--active-button-fill);; 313 | } 314 | 315 | size-picker .range-holder { 316 | position: relative; 317 | height: 100%; 318 | width: 100%; 319 | } 320 | 321 | size-picker .horizontal-range { 322 | position: absolute; 323 | width: calc(100% - 30px); 324 | top: calc(50% - (8px / 2)); 325 | margin: 0 15px; 326 | height: 8px; 327 | cursor: pointer; 328 | box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.7), 0px 0px 1px rgba(13, 13, 13, 0.7); 329 | background: #1a1a1a; 330 | border-radius: 2px; 331 | } 332 | 333 | size-picker .thumb { 334 | box-sizing: border-box; 335 | position: absolute; 336 | display: block; 337 | top: calc(50% - 15px); 338 | box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.55), 0px 0px 1px rgba(13, 13, 13, 0.7); 339 | border: 3px solid #707070; 340 | height: 30px; 341 | width: 30px; 342 | border-radius: 50%; 343 | background: linear-gradient(to bottom, #424242 0%,#212121 100%); 344 | cursor: pointer; 345 | /* desktop only: using 'none' fixes clicking on the thumb causing the value to jump to zero, but 'grabbing' the thumb with pointer-events set to either none or auto still doesn't happen */ 346 | pointer-events: none; 347 | will-change: transform; 348 | } 349 | 350 | #preview-content { 351 | will-change: transform; 352 | } 353 | 354 | #preview { 355 | position: fixed; 356 | display:flex; 357 | justify-content:center; 358 | align-items:center; 359 | line-height: 240px; 360 | z-index: -1; 361 | top: calc(50% - (255px / 2) - ((240px + 60px) / 2)); 362 | left: calc(50% - (255px / 2)); 363 | width: 255px; 364 | height: 255px; 365 | background-color: rgba(255, 255, 255, 0.8); 366 | border-radius: 8px; 367 | opacity: 0; 368 | /*pointer-events: none;*/ 369 | transition: all 0.23s cubic-bezier(0,0,0.3,1); 370 | } 371 | 372 | .visible #preview { 373 | z-index: 100; 374 | background-color: rgba(255, 255, 255, 0.9); 375 | opacity: 1; 376 | } 377 | -------------------------------------------------------------------------------- /src/app.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | if ('serviceWorker' in navigator) { 5 | navigator.serviceWorker.register('sw.js') 6 | .then(_ => { console.log('service worker is all cool 🐳'); }) 7 | .catch(e => { 8 | console.error('service worker is not so cool 🔥', e); 9 | throw e; 10 | }); 11 | 12 | if (navigator.serviceWorker.controller) { 13 | // Correctly prompt the user to reload during SW phase change. 14 | navigator.serviceWorker.controller.onstatechange = e => { 15 | if (e.target.state === 'redundant') { 16 | document.querySelector('#reload-prompt').style.visibility = 'visible'; 17 | } 18 | } 19 | } 20 | } 21 | 22 | function platformDetect() { 23 | let agent = navigator.userAgent.toLowerCase(); 24 | let isAndroid = agent.indexOf("android") > -1; 25 | if (isAndroid) { 26 | return 'google'; 27 | } 28 | return 'apple'; 29 | } 30 | 31 | window.app = { 32 | baseImgPath : './images/emoji', 33 | brush : { 34 | platform : platformDetect(), 35 | color : 'green-dark', 36 | name : emojiMap[platformDetect()]['green-dark'][0] 37 | }, 38 | brushSize : { 39 | min : 5, 40 | max : 200, 41 | }, 42 | brushRotation : 0, 43 | getBrushSizePercent : function(val = window.app.brushSize.val) { 44 | return (val / (this.brushSize.max - this.brushSize.min)); 45 | }, 46 | undos : [], 47 | redos : [], 48 | }; 49 | 50 | // Init the starting brush val to be 50%. 51 | window.app.brushSize.val = 52 | (window.app.brushSize.max - window.app.brushSize.min) / 2 53 | 54 | const drawCanvas = document.querySelector('draw-canvas'); 55 | const brushPreview = document.querySelector('brush-preview'); 56 | const brushPicker = document.querySelector('brush-picker-pane'); 57 | const sizePicker = document.querySelector('size-picker'); 58 | 59 | let brushChangeTimeoutId; 60 | 61 | document.body.addEventListener('menu-action', handlePageAction); 62 | document.body.addEventListener('brush-change', handleBrushChange); 63 | 64 | function handlePageAction(e) { 65 | switch (e.detail) { 66 | case 'apple-emoji': 67 | changePlatform('apple'); 68 | break; 69 | case 'google-emoji': 70 | changePlatform('google'); 71 | break; 72 | case 'dashboard-menu': 73 | onFooterMenuClick('dashboard-open', 0); 74 | break; 75 | case 'brush-pick': 76 | onFooterMenuClick('brush-picker-open', 2); 77 | showBrushPreviewIfMenuOpen(); 78 | break; 79 | case 'size': 80 | onFooterMenuClick('size-picker-open', 1); 81 | showBrushPreviewIfMenuOpen(); 82 | break; 83 | case 'save': 84 | drawCanvas.download(); 85 | closeAllMenus(); 86 | break; 87 | case 'reset': 88 | if (!window.confirm('All progress will be lost, are you sure?')) { 89 | return; 90 | } 91 | 92 | window.app.undos = []; 93 | window.app.redos = []; 94 | drawCanvas.clearCanvas(); 95 | closeAllMenus(); 96 | break; 97 | case 'overlay-close': 98 | closeAllMenus(); 99 | break; 100 | case 'undo': 101 | drawCanvas.undo(); 102 | break; 103 | case 'redo': 104 | drawCanvas.redo(); 105 | break; 106 | default: 107 | console.warn(`unhanded detail, ${e.detail}`); 108 | } 109 | }; 110 | 111 | function changePlatform(platform) { 112 | window.app.brush.platform = platform; 113 | document.getElementById('apple').classList.toggle('active', 114 | platform == 'apple'); 115 | document.getElementById('google').classList.toggle('active', 116 | platform == 'google'); 117 | window.app.brush.name = emojiMap[platform][window.app.brush.color][0]; 118 | brushPicker.renderColorGrid(); 119 | } 120 | 121 | function getBrushSrcPath() { 122 | return window.app.baseImgPath + '/' + window.app.brush.platform + '/' + 123 | window.app.brush.color + '/' + window.app.brush.name; 124 | } 125 | 126 | function handleBrushChange(e) { 127 | if (e.detail.brush) { 128 | window.app.brush = e.detail.brush; 129 | } 130 | 131 | if (e.detail.brushRotation !== undefined) { 132 | window.app.brushRotation = e.detail.brushRotation; 133 | } 134 | if (e.detail.brushSize !== undefined) { 135 | window.app.brushSize.val = e.detail.brushSize; 136 | if (e.detail.fromMultiTouch) { 137 | sizePicker.setThumbFromPreview(e.detail.brushSize); 138 | } 139 | } 140 | 141 | if (!e.detail.fromMultiTouch) { 142 | brushPreview.updatePreviewState(window.app.getBrushSizePercent(), 143 | window.app.brushRotation, 144 | getBrushSrcPath()); 145 | } 146 | } 147 | 148 | function closeAllMenus() { 149 | ['brush-picker-open', 'size-picker-open', 'dashboard-open', 'menu-open', ] 150 | .forEach(v => { document.body.classList.remove(v); }); 151 | 152 | brushPreview.hide(); 153 | } 154 | 155 | function showBrushPreviewIfMenuOpen() { 156 | if (document.body.classList.contains('menu-open')) { 157 | brushPreview.updatePreviewState(window.app.getBrushSizePercent(), 158 | window.app.brushRotation, 159 | getBrushSrcPath()); 160 | brushPreview.show(); 161 | } 162 | } 163 | 164 | function onFooterMenuClick(klass, index) { 165 | let paneAlreadyOpen = document.body.classList.contains(klass); 166 | let x = index * -100; 167 | if (document.body.classList.contains('menu-open')) { 168 | closeAllMenus(); 169 | } 170 | 171 | if (!paneAlreadyOpen) { 172 | document.body.classList.add('menu-open'); 173 | document.body.classList.add(klass); 174 | document.getElementById('pane-slider').style.transform = 175 | `translateX(${x}%)`; 176 | } 177 | } 178 | })(); 179 | -------------------------------------------------------------------------------- /src/background-overlay.js: -------------------------------------------------------------------------------- 1 | class BackgroundOverlay extends HTMLElement { 2 | constructor() { 3 | super() 4 | } 5 | 6 | template() { return `
`; }; 7 | 8 | connectedCallback() { 9 | let eventName = 'ontouchstart' in window ? 'touchstart' : 'click'; 10 | this.innerHTML = this.template(); 11 | 12 | this.addEventListener(eventName, this.onOverlayClick); 13 | }; 14 | 15 | onOverlayClick(e) { 16 | // prevent mousedown from firing 17 | e.preventDefault(); 18 | var node = e.target; 19 | 20 | this.dispatchEvent(new CustomEvent( 21 | 'menu-action', { bubbles: true, detail: node.getAttribute('action') })); 22 | 23 | node = node.parentNode; 24 | }; 25 | } 26 | 27 | 28 | customElements.define('background-overlay', BackgroundOverlay); 29 | -------------------------------------------------------------------------------- /src/brush-picker-pane.js: -------------------------------------------------------------------------------- 1 | 2 | class BrushPickerPane extends HTMLElement { 3 | choices = { 4 | "#F5F5F5" : "white", 5 | "#ffff02" : "yellow", 6 | "#ff6600" : "orange", 7 | "#dd0000" : "red", 8 | "#ff0199" : "pink", 9 | "#330099" : "indigo", 10 | "#0002cc" : "blue", 11 | "#0099ff" : "blue-light", 12 | "#00aa00" : "green-light", 13 | "#006600" : "green-dark", 14 | "#663300" : "brown-dark", 15 | "#996633" : "brown-light", 16 | "#bbbbbb" : "grey-light", 17 | "#888888" : "grey-medium", 18 | "#444444" : "grey-dark", 19 | "#000000" : "black", 20 | } 21 | 22 | template() { 23 | return ` 24 |
25 |
26 |
27 |
28 | `; 29 | } 30 | 31 | setEvents() { 32 | this.addEventListener('click', this.onClick.bind(this)); 33 | } 34 | 35 | onClick(e) { 36 | let node = e.target; 37 | 38 | while (node.tagName !== 'BRUSH-PICKER-PANE') { 39 | if (node.classList.contains('color-picker')) { 40 | this.onColorClick(e); 41 | break; 42 | } 43 | 44 | node = node.parentNode; 45 | } 46 | } 47 | 48 | onColorClick(e) { 49 | // have to change from layerX to clientX or pageX or offsetX in the panel 50 | // slide layout 51 | // MDN suggests caution w/ layerX: 52 | // https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/layerX 53 | this.getColorByXY(e.offsetX, e.offsetY); 54 | } 55 | 56 | getColorByXY(x, y) { 57 | let colorPicker = this.querySelector('.color-picker'); 58 | let columns = 4; 59 | let rows = 4; 60 | let pixelR = window.devicePixelRatio; 61 | 62 | let gridX = Math.floor(x / (colorPicker.width / pixelR) / (1 / columns)); 63 | let gridY = Math.floor(y / (colorPicker.height / pixelR) / (1 / rows)); 64 | 65 | this.dispatchEvent(new CustomEvent('brush-change', { 66 | bubbles : true, 67 | detail : { 68 | brush : { 69 | platform : window.app.brush.platform, 70 | color : 71 | this.choices[Object.keys(this.choices)[gridX + (gridY * columns)]], 72 | name : emojiMap[window.app.brush.platform][this.choices[Object.keys( 73 | this.choices)[gridX + (gridY * columns)]]][0] 74 | }, 75 | brushRotation : 0, 76 | } 77 | })); 78 | } 79 | 80 | connectedCallback() { 81 | this.innerHTML = this.template(); 82 | this.renderColorGrid(); 83 | this.setEvents(); 84 | } 85 | 86 | // credit to http://jsfiddle.net/subodhghulaxe/t568u/ 87 | hex2Rgba(hex, opacity) { 88 | hex = hex.replace('#', ''); 89 | let r = parseInt(hex.substring(0, 2), 16); 90 | let g = parseInt(hex.substring(2, 4), 16); 91 | let b = parseInt(hex.substring(4, 6), 16); 92 | let result = `rgba(${r},${g},${b},${opacity})`; 93 | return result; 94 | } 95 | 96 | renderColorGrid() { 97 | let canvas = document.createElement('canvas'); 98 | canvas.classList.add('color-picker'); 99 | let paneContent = this.querySelector('.pane-content'); 100 | let innerHeight = Math.floor(paneContent.getBoundingClientRect().height); 101 | let innerWidth = Math.floor(paneContent.getBoundingClientRect().width); 102 | let pixelR = window.devicePixelRatio; 103 | // TODO: update innerWidth on window resize (also need to update 104 | // draw-canvas) 105 | canvas.setAttribute('width', (innerWidth * pixelR) + 'px'); 106 | canvas.setAttribute('height', (innerHeight * pixelR) + 'px'); 107 | canvas.style.width = innerWidth + 'px'; 108 | canvas.style.height = innerHeight + 'px'; 109 | 110 | let ctx = canvas.getContext('2d'); 111 | 112 | paneContent.innerHTML = ''; 113 | paneContent.appendChild(canvas); 114 | let colorWidth = (innerWidth * pixelR) / Object.keys(this.choices).length; 115 | 116 | Object.keys(this.choices).forEach((v, i, arr) => { 117 | const columns = 4; 118 | const rows = 4; 119 | const padding = 20; 120 | const backGroundOpacity = 0.4; 121 | const currRow = Math.floor(i / rows); 122 | ctx.fillStyle = this.hex2Rgba(v, backGroundOpacity); 123 | const y = (innerHeight * pixelR / rows) * currRow; 124 | const x = (columns * colorWidth) * (i % (arr.length / columns)); 125 | const width = colorWidth * columns; 126 | const height = Math.ceil((innerHeight * pixelR) / rows); 127 | ctx.fillRect(x, y, width, height); 128 | 129 | const platform = window.app.brush.platform; 130 | const color = this.choices[v]; 131 | const name = emojiMap[window.app.brush.platform][color][0]; 132 | 133 | const emojiImage = new Image(); 134 | const brushPath = 135 | window.app.baseImgPath + '/' + platform + '/' + color + '/'; 136 | emojiImage.src = brushPath + name; 137 | 138 | emojiImage.onload = function() { 139 | ctx.drawImage(emojiImage, x + (width / 2 - (height - padding) / 2), 140 | y + padding / 2, height - padding, height - padding); 141 | } 142 | 143 | }); 144 | }; 145 | } 146 | 147 | customElements.define('brush-picker-pane', BrushPickerPane); 148 | -------------------------------------------------------------------------------- /src/brush-preview.js: -------------------------------------------------------------------------------- 1 | const TOUCH_ANGLE_MULTIPLIER = 1.7; 2 | 3 | class BrushPreview extends HTMLElement { 4 | 5 | constructor() { 6 | super(); 7 | this.prevTouches = []; 8 | } 9 | 10 | template() { 11 | return `
12 | 13 |
` 14 | }; 15 | 16 | render() { 17 | this.innerHTML = this.template(); 18 | }; 19 | 20 | connectedCallback() { 21 | this.render(); 22 | this._currentRotation = 0; 23 | const preview = this.querySelector('#preview'); 24 | preview.addEventListener('touchstart', this.onTouchStart.bind(this)); 25 | preview.addEventListener('touchmove', this.onTouch.bind(this)); 26 | preview.addEventListener('touchend', this.onTouchEnd.bind(this)); 27 | }; 28 | 29 | _updateBrushGeometry(percent, rad) { 30 | this.querySelector('#preview-content').style.transform = 31 | `scale(${percent}) rotate(${rad}rad)`; 32 | }; 33 | 34 | updateValue(percent, rad) { 35 | let newSize = 36 | (window.app.brushSize.max - window.app.brushSize.min) * percent + 37 | window.app.brushSize.min; 38 | 39 | this.dispatchEvent(new CustomEvent('brush-change', { 40 | bubbles: true, 41 | detail: { 42 | fromMultiTouch: true, 43 | brushSize: newSize, 44 | brushRotation: rad, 45 | } 46 | })); 47 | }; 48 | 49 | _updateBrushImage(imgPath) { 50 | this.querySelector('#preview-content').src = imgPath; 51 | }; 52 | 53 | updatePreviewState( 54 | size, rad = 0, imgPath = this._imgPath) { 55 | this._size = size; 56 | this._rad = rad; 57 | this._imgPath = imgPath; 58 | this.throttledRender(); 59 | }; 60 | 61 | throttledRender() { 62 | if (this._throttleId !== undefined) { 63 | return; 64 | } 65 | 66 | this._throttleId = setTimeout(_ => { 67 | this._updateBrushImage(this._imgPath); 68 | this._updateBrushGeometry(this._size, this._rad); 69 | this._throttleId = undefined; 70 | 71 | }, 16.66); 72 | 73 | }; 74 | 75 | show() { 76 | this.classList.add('visible'); 77 | this.style.visibility = 'visible'; 78 | }; 79 | 80 | hide() { 81 | this.classList.remove('visible'); 82 | this.style.visibility = 'hidden' 83 | }; 84 | 85 | onTouchStart(e) { 86 | if (e.touches.length === 2) { 87 | this.gesture = true; 88 | let dX = e.touches[1].clientX - e.touches[0].clientX; 89 | let dY = e.touches[1].clientY - e.touches[0].clientY; 90 | this.gestureStartDistance = Math.sqrt(dX * dX + dY * dY); 91 | this.gestureStartAngle = Math.atan2(dY, dX) * TOUCH_ANGLE_MULTIPLIER; 92 | } 93 | }; 94 | 95 | onTouch(e) { 96 | e.preventDefault(); 97 | // if it's a two-element (finger) event 98 | if (this.gesture && e.touches.length === 2) { 99 | let dX = e.touches[1].clientX - e.touches[0].clientX; 100 | let dY = e.touches[1].clientY - e.touches[0].clientY; 101 | let gestureAngle = Math.atan2(dY, dX) * TOUCH_ANGLE_MULTIPLIER; 102 | let angleChange = gestureAngle - this.gestureStartAngle; 103 | this._rad = this._currentRotation + angleChange; 104 | 105 | this.updatePreviewState(this._size, this._rad); 106 | this.updateValue(this._size, this._rad); 107 | } 108 | }; 109 | 110 | onTouchEnd(e) { 111 | this.gesture = false; 112 | this._currentRotation = this._rad; 113 | }; 114 | } 115 | 116 | customElements.define('brush-preview', BrushPreview); 117 | -------------------------------------------------------------------------------- /src/draw-canvas.js: -------------------------------------------------------------------------------- 1 | 2 | const DEVICE_PIXEL_RATIO = window.devicePixelRatio; 3 | 4 | const _IMAGE_CACHE = new Map(); 5 | 6 | function getImage(path) { 7 | if (_IMAGE_CACHE.has(path)) { 8 | return Promise.resolve(_IMAGE_CACHE.get(path)); 9 | } 10 | 11 | return new Promise((res, rej) => { 12 | const img = new Image(); 13 | img.src = path; 14 | 15 | img.onload = function () { 16 | _IMAGE_CACHE.set(path, { img, width: img.width, height: img.height }); 17 | 18 | res(_IMAGE_CACHE.get(path)); 19 | } 20 | }); 21 | } 22 | 23 | class DrawCanvas extends HTMLElement { 24 | loadWelcome() { 25 | // (this is a rough, but working, implementation) 26 | let dc = this; 27 | 28 | // Only play intro once. 29 | if (localStorage.getItem('moji-intro-played') === 'true') { 30 | return; 31 | } 32 | 33 | localStorage.setItem('moji-intro-played', true); 34 | 35 | fetch('welcome.json') 36 | .then(function (response) { 37 | return response.json(); 38 | }) 39 | .then(function (welcome) { 40 | // get dimensions so we can center it 41 | let maxX = 0; 42 | let maxY = 0; 43 | let minX = 10000; 44 | let minY = 10000; 45 | for (let i = 0; i < welcome.length; i++) { 46 | for (let j = 0; j < welcome[i].xy.length; j++) { 47 | if (welcome[i].xy[j][0] > maxX) { 48 | maxX = welcome[i].xy[j][0]; 49 | } 50 | if (welcome[i].xy[j][0] < minX) { 51 | minX = welcome[i].xy[j][0]; 52 | } 53 | if (welcome[i].xy[j][1] > maxY) { 54 | maxY = welcome[i].xy[j][1]; 55 | } 56 | if (welcome[i].xy[j][1] < minY) { 57 | minY = welcome[i].xy[j][1]; 58 | } 59 | } 60 | } 61 | let leftStartPoint = (window.innerWidth - maxX - minX) / 2; 62 | let topStartPoint = (window.innerHeight - maxY - minY - 60) / 2; 63 | // animate the welcome 64 | for (let i = 0; i < welcome.length; i++) { 65 | (function animateStroke(j) { 66 | setTimeout(function () { 67 | dc.paintAtPoint( 68 | // add left and top start points to center the message 69 | welcome[i].xy[j][0] + leftStartPoint, 70 | welcome[i].xy[j][1] + topStartPoint, welcome[i].size, 71 | // TODO: randomize the brush 72 | { 73 | platform: window.app.brush.platform, 74 | color: 'white', 75 | name: '1f410.png' 76 | }); 77 | if (j < welcome[i].xy.length - 1) { 78 | j++; 79 | animateStroke(j); 80 | } 81 | }, 16.67); 82 | })(0); 83 | } 84 | }); 85 | // clear the welcome message 86 | setTimeout(function () { 87 | dc.clearCanvas(); 88 | }, 5000); 89 | }; 90 | 91 | connectedCallback() { 92 | const canvas = document.createElement('canvas'); 93 | 94 | canvas.setAttribute( 95 | 'width', (window.innerWidth * DEVICE_PIXEL_RATIO) + 'px'); 96 | canvas.setAttribute( 97 | 'height', (window.innerHeight * DEVICE_PIXEL_RATIO) + 'px'); 98 | 99 | canvas.style.width = window.innerWidth + 'px'; 100 | canvas.style.height = window.innerHeight + 'px'; 101 | 102 | this.ctx = canvas.getContext('2d'); 103 | 104 | canvas.addEventListener('touchstart', this.onTouchStart.bind(this)); 105 | canvas.addEventListener('touchmove', this.onTouch.bind(this)); 106 | canvas.addEventListener('touchend', this.onTouchEnd.bind(this)); 107 | canvas.addEventListener('mousedown', this.onMouseDown.bind(this)); 108 | canvas.addEventListener('mousemove', this.onMouseMove.bind(this)); 109 | canvas.addEventListener('mouseup', this.onMouseUp.bind(this)); 110 | 111 | this.appendChild(canvas); 112 | this.loadWelcome(); 113 | }; 114 | 115 | // revised brush stroke history model: 116 | // [ 117 | // {"brush": { 118 | // platform: 'google', 119 | // color: 'blue-light', 120 | // name: '1f4a7.png' 121 | // }, 122 | // "size": 61.8625, 123 | // "rotation": 0, 124 | // "xy": [[49,48],[50,50],[51,51]] 125 | // }, 126 | // { 127 | // 128 | // }, 129 | // ] 130 | newBrush() { 131 | window.app.undos.push({ 132 | 'brush': { 133 | platform: window.app.brush.platform, 134 | color: window.app.brush.color, 135 | name: window.app.brush.name 136 | }, 137 | 'size': window.app.brushSize.val, 138 | 'rotation': window.app.brushRotation, 139 | 'xy': [] 140 | }); 141 | }; 142 | 143 | onMouseDown(e) { 144 | window.app.mouseDown = true; 145 | // paint stroke happening, so establish a new object to capture it 146 | this.newBrush(); 147 | let touch = e; 148 | this.paintAtPoint(touch.clientX, touch.clientY); 149 | this.recordHistory(touch.clientX, touch.clientY); 150 | }; 151 | 152 | onMouseUp() { 153 | window.app.mouseDown = false; 154 | }; 155 | 156 | onMouseMove(e) { 157 | if (app.mouseDown === true) { 158 | this.paintAtPoint(e.clientX, e.clientY); 159 | this.recordHistory(e.clientX, e.clientY); 160 | } 161 | }; 162 | 163 | clearCanvas() { 164 | this.ctx.fillStyle = '#fff'; 165 | this.ctx.fillRect( 166 | 0, 0, (window.innerWidth * DEVICE_PIXEL_RATIO), 167 | (window.innerHeight * DEVICE_PIXEL_RATIO)); 168 | this.updateUndoRedoButtonState(); 169 | }; 170 | 171 | paintAtPoint( 172 | x, y, size = window.app.brushSize.val, 173 | rotation = window.app.brushRotation, brush = { 174 | platform: window.app.brush.platform, 175 | color: window.app.brush.color, 176 | name: window.app.brush.name 177 | }) { 178 | 179 | let brushPath = 180 | window.app.baseImgPath + '/' + brush.platform + '/' + brush.color + '/'; 181 | getImage(brushPath + brush.name).then(emojiImage => { 182 | /* 183 | * Get the image emoji height and width then convert them to the brush 184 | * size 185 | * percent 186 | * and then multiply that by the device pixel amount so that we get a 1:1 187 | * size. 188 | * 189 | * For instance... a 200px wide image painted at 50% size on a 2x screen 190 | * would be displayed on screen as (200 * .5 * 2) which would be 200px :). 191 | */ 192 | const emojiPaintWidth = emojiImage.width * 193 | window.app.getBrushSizePercent(size) * DEVICE_PIXEL_RATIO; 194 | const emojiPaintHeight = emojiImage.height * 195 | window.app.getBrushSizePercent(size) * DEVICE_PIXEL_RATIO; 196 | 197 | // save the current coordinate system 198 | this.ctx.save(); 199 | 200 | this.ctx.translate(x * DEVICE_PIXEL_RATIO, y * DEVICE_PIXEL_RATIO); 201 | this.ctx.rotate(rotation); 202 | this.ctx.drawImage( 203 | emojiImage.img, -emojiPaintWidth / 2, -emojiPaintHeight / 2, 204 | emojiPaintWidth, emojiPaintHeight); 205 | 206 | this.ctx.restore(); 207 | }); 208 | } 209 | 210 | onTouchStart(e) { 211 | // prevent mousedown from firing 212 | e.preventDefault(); 213 | const canvas = document.querySelector('canvas'); 214 | canvas.removeEventListener('mousedown', this.onMouseDown.bind(this)); 215 | let touch = e.touches[0]; 216 | window.app.touchStart = true; 217 | // paint stroke happening, so establish a new object to capture it 218 | this.newBrush(); 219 | this.paintAtPoint(touch.clientX, touch.clientY); 220 | this.recordHistory(touch.clientX, touch.clientY); 221 | }; 222 | 223 | onTouchEnd() { 224 | window.app.touchStart = false; 225 | }; 226 | 227 | onTouch(e) { 228 | if (app.touchStart === true) { 229 | for (let i = 0; i < e.touches.length; ++i) { 230 | let touch = e.touches[i]; 231 | 232 | this.paintAtPoint(touch.clientX, touch.clientY); 233 | this.recordHistory(touch.clientX, touch.clientY); 234 | } 235 | } 236 | e.preventDefault(); 237 | 238 | }; 239 | 240 | recordHistory(x, y) { 241 | // record the paint stroke into the newest array 242 | window.app.undos[window.app.undos.length - 1].xy.push([x, y]); 243 | // clear the redo history 244 | window.app.redos = []; 245 | this.updateUndoRedoButtonState(); 246 | }; 247 | 248 | repaintHistory() { 249 | // iterate through all paint stroke history 250 | for (let i = 0; i < window.app.undos.length; i++) { 251 | // iterate within individual paint strokes 252 | for (let j = 0; j < window.app.undos[i].xy.length; j++) { 253 | // repaint beautiful dabs of emoji 254 | this.paintAtPoint( 255 | window.app.undos[i].xy[j][0], window.app.undos[i].xy[j][1], 256 | window.app.undos[i].size, window.app.undos[i].rotation, 257 | window.app.undos[i].brush); 258 | } 259 | } 260 | }; 261 | 262 | download() { 263 | const anchor = document.createElement('a'); 264 | const dataURI = this.querySelector('canvas').toDataURL(); 265 | 266 | // http://caniuse.com/#feat=download 267 | if (!('download' in anchor)) { 268 | return window.open(dataURI); 269 | } 270 | 271 | anchor.setAttribute('download', `moji-brush-${Date.now()}.png`); 272 | anchor.setAttribute('href', dataURI); 273 | anchor.click(); 274 | }; 275 | 276 | redo() { 277 | if (window.app.redos.length) { 278 | // move the last undone paint stroke back to the undo array 279 | window.app.undos.push(window.app.redos.pop()); 280 | this.clearCanvas(); 281 | this.repaintHistory(); 282 | } 283 | this.updateUndoRedoButtonState(); 284 | }; 285 | 286 | undo() { 287 | if (window.app.undos.length) { 288 | // move the last paint stroke to the redo array 289 | window.app.redos.push(window.app.undos.pop()); 290 | this.clearCanvas(); 291 | this.repaintHistory(); 292 | } 293 | this.updateUndoRedoButtonState(); 294 | }; 295 | 296 | updateUndoRedoButtonState() { 297 | document.querySelector('.undo').classList.toggle( 298 | 'disabled', !window.app.undos.length); 299 | 300 | document.querySelector('.redo').classList.toggle( 301 | 'disabled', !window.app.redos.length); 302 | } 303 | } 304 | 305 | customElements.define('draw-canvas', DrawCanvas); 306 | -------------------------------------------------------------------------------- /src/emoji-map.js: -------------------------------------------------------------------------------- 1 | const emojiMap = { 2 | "apple" : { 3 | "black" : [ 4 | "1f3a5.png", "1f393.png", "1f3a9.png", "1f3b1.png", "1f403.png", 5 | "1f41c.png", "1f4de.png", "1f50c.png" 6 | ], 7 | 8 | "blue" : [ "1f6e2.png", "1f4d8.png", "1f698.png", "2693.png" ], 9 | 10 | "brown-dark" : [ 11 | "1f4a9.png", "1f330.png", "1f357.png", "1f369.png", "1f3c8.png", 12 | "1f45c.png", "1f45e.png", "1f982.png" 13 | ], 14 | 15 | "blue-light" : 16 | [ "1f4a7.png", "1f3bd.png", "1f433.png", "1f455.png", "2744.png" ], 17 | 18 | "brown-light" : [ 19 | "1f36a.png", "1f3c6.png", "1f3c9.png", "1f42a.png", "1f43b.png", 20 | "1f4e6.png", "1f6aa.png" 21 | ], 22 | 23 | "green-dark" : [ 24 | "1f422.png", "1f335.png", "1f409.png", "1f40a.png", "1f40d.png", 25 | "1f432.png" 26 | ], 27 | 28 | "green-light" : [ 29 | "1f340.png", "1f343.png", "1f34f.png", "1f438.png", "1f4d7.png", 30 | "2618.png", "267b.png" 31 | ], 32 | 33 | "grey-dark" : [ 34 | "1f3ae.png", "1f311.png", "1f399.png", "1f529.png", "1f58a.png", 35 | "1f68a.png" 36 | ], 37 | 38 | "grey-light" : [ 39 | "1f527.png", "1f368.png", "1f3d0.png", "1f40f.png", "1f516.png", 40 | "1f56f.png", "1f5d1.png", "1f5dc.png" 41 | ], 42 | 43 | "grey-medium" : [ 44 | "1f480.png", "1f400.png", "1f517.png", "1f58b.png", "2620.png", 45 | "2694.png", "26d3.png" 46 | ], 47 | 48 | "indigo" : [ 49 | "1f456.png", "1f346.png", "1f699.png", "1f6cb.png", "2602.png", "2614.png" 50 | ], 51 | 52 | "orange" : [ "1f34a.png", "1f383.png", "1f3c0.png", "1f458.png" ], 53 | 54 | "pink" : [ 55 | "1f45b.png", "1f338.png", "1f33a.png", "1f380.png", "1f39f.png", 56 | "1f437.png", "1f43d.png", "1f444.png", "1f459.png" 57 | ], 58 | 59 | "red" : [ 60 | "1f34e.png", "1f336.png", "1f353.png", "1f392.png", "1f47a.png", 61 | "1f58d.png", "1f980.png", "260e.png" 62 | ], 63 | 64 | "white" : [ 65 | "1f35a.png", "1f3f3.png", "1f401.png", "1f407.png", "1f410.png", 66 | "1f4ad.png", "1f984.png", "2601.png" 67 | ], 68 | 69 | "yellow" : [ 70 | "1f34b.png", "1f315.png", "1f319.png", "1f31d.png", "1f424.png", 71 | "1f431.png" 72 | ] 73 | }, 74 | 75 | "google" : { 76 | "black" : [ 77 | "1f3a5.png", "1f3a9.png", "1f3b1.png", "1f4a3.png", "1f576.png", 78 | "1f5dd.png" 79 | ], 80 | 81 | "blue" : [ "1f41f.png", "1f5f3.png", "1f68e.png", "1f6e1.png", "2708.png" ], 82 | 83 | "blue-light" : 84 | [ "1f4a7.png", "1f516.png", "2668.png", "2693.png", "2744.png" ], 85 | 86 | "brown-dark" : [ 87 | "1f3c8.png", "1f40e.png", "1f43b.png", "1f45e.png", "1f4a9.png", 88 | "1f4ff.png" 89 | ], 90 | 91 | "brown-light" : [ 92 | "1f36a.png", "1f375.png", "1f3da.png", "1f43f.png", "1f58a.png", 93 | "26b0.png" 94 | ], 95 | 96 | "green-dark" : 97 | [ "1f33f.png", "1f40a.png", "1f432.png", "1f458.png", "2618.png" ], 98 | 99 | "green-light" : 100 | [ "1f348.png", "1f350.png", "1f40d.png", "1f438.png", "1f4b8.png" ], 101 | 102 | "grey-dark" : [ "1f39e.png", "1f4f0.png", "1f577.png", "1f578.png" ], 103 | 104 | "grey-light" : 105 | [ "1f3d0.png", "1f3db.png", "1f54a.png", "1f56f.png", "1f5d2.png" ], 106 | 107 | "grey-medium" : 108 | [ "1f399.png", "1f400.png", "1f403.png", "1f480.png", "1f6e2.png" ], 109 | 110 | "indigo" : [ 111 | "1f302.png", "1f40b.png", "1f418.png", "1f42c.png", "1f456.png", 112 | "1f6b0.png", "260e.png" 113 | ], 114 | 115 | "orange" : [ 116 | "1f342.png", "1f3c9.png", "1f420.png", "1f431.png", "1f434.png", 117 | "2638.png" 118 | ], 119 | 120 | "red" : [ 121 | "1f336.png", "1f337.png", "1f339.png", "1f39f.png", "1f58d.png", 122 | "1f608.png", "1f980.png" 123 | ], 124 | 125 | "pink" : [ 126 | "1f338.png", "1f33c.png", "1f346.png", "1f347.png", "1f351.png", 127 | "1f429.png", "1f457.png", "1f460.png", "1f47e.png" 128 | ], 129 | 130 | "white" : 131 | [ "1f401.png", "1f407.png", "1f410.png", "1f6c1.png", "1f984.png" ], 132 | 133 | "yellow" : [ 134 | "1f34b.png", "1f397.png", "1f3f7.png", "1f41d.png", "1f424.png", 135 | "1f425.png", "1f4a1.png" 136 | ] 137 | } 138 | 139 | }; 140 | -------------------------------------------------------------------------------- /src/footer-menu.js: -------------------------------------------------------------------------------- 1 | 2 | class FooterMenu extends HTMLElement { 3 | template() { 4 | return ``; 27 | } 28 | 29 | connectedCallback() { 30 | let eventName = 'ontouchstart' in window ? 'touchstart' : 'click'; 31 | this.innerHTML = this.template(); 32 | 33 | this.addEventListener(eventName, this.onMenuClick); 34 | }; 35 | 36 | onMenuClick(e) { 37 | e.preventDefault(); 38 | var node = e.target; 39 | 40 | while (node !== undefined && node.tagName !== 'FOOTER-MENU') { 41 | if (node.tagName === 'LI') { 42 | this.dispatchEvent(new CustomEvent( 43 | 'menu-action', 44 | {bubbles : true, detail : node.getAttribute('action')})); 45 | break; 46 | } 47 | 48 | node = node.parentNode; 49 | } 50 | } 51 | } 52 | 53 | customElements.define('footer-menu', FooterMenu); 54 | -------------------------------------------------------------------------------- /src/images/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/android-chrome-192x192.png -------------------------------------------------------------------------------- /src/images/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/android-chrome-512x512.png -------------------------------------------------------------------------------- /src/images/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/apple-touch-icon.png -------------------------------------------------------------------------------- /src/images/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #da532c 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/images/emoji/apple/black/1f393.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/black/1f393.png -------------------------------------------------------------------------------- /src/images/emoji/apple/black/1f3a5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/black/1f3a5.png -------------------------------------------------------------------------------- /src/images/emoji/apple/black/1f3a9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/black/1f3a9.png -------------------------------------------------------------------------------- /src/images/emoji/apple/black/1f3b1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/black/1f3b1.png -------------------------------------------------------------------------------- /src/images/emoji/apple/black/1f403.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/black/1f403.png -------------------------------------------------------------------------------- /src/images/emoji/apple/black/1f41c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/black/1f41c.png -------------------------------------------------------------------------------- /src/images/emoji/apple/black/1f4de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/black/1f4de.png -------------------------------------------------------------------------------- /src/images/emoji/apple/black/1f50c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/black/1f50c.png -------------------------------------------------------------------------------- /src/images/emoji/apple/blue-light/1f3bd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/blue-light/1f3bd.png -------------------------------------------------------------------------------- /src/images/emoji/apple/blue-light/1f433.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/blue-light/1f433.png -------------------------------------------------------------------------------- /src/images/emoji/apple/blue-light/1f455.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/blue-light/1f455.png -------------------------------------------------------------------------------- /src/images/emoji/apple/blue-light/1f4a7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/blue-light/1f4a7.png -------------------------------------------------------------------------------- /src/images/emoji/apple/blue-light/2744.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/blue-light/2744.png -------------------------------------------------------------------------------- /src/images/emoji/apple/blue/1f4d8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/blue/1f4d8.png -------------------------------------------------------------------------------- /src/images/emoji/apple/blue/1f5fe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/blue/1f5fe.png -------------------------------------------------------------------------------- /src/images/emoji/apple/blue/1f698.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/blue/1f698.png -------------------------------------------------------------------------------- /src/images/emoji/apple/blue/1f6e2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/blue/1f6e2.png -------------------------------------------------------------------------------- /src/images/emoji/apple/blue/2693.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/blue/2693.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-dark/1f330.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-dark/1f330.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-dark/1f357.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-dark/1f357.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-dark/1f369.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-dark/1f369.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-dark/1f3c8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-dark/1f3c8.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-dark/1f45c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-dark/1f45c.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-dark/1f45e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-dark/1f45e.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-dark/1f4a9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-dark/1f4a9.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-dark/1f982.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-dark/1f982.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-light/1f36a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-light/1f36a.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-light/1f3c6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-light/1f3c6.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-light/1f3c9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-light/1f3c9.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-light/1f42a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-light/1f42a.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-light/1f43b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-light/1f43b.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-light/1f4e6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-light/1f4e6.png -------------------------------------------------------------------------------- /src/images/emoji/apple/brown-light/1f6aa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/brown-light/1f6aa.png -------------------------------------------------------------------------------- /src/images/emoji/apple/green-dark/1f335.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/green-dark/1f335.png -------------------------------------------------------------------------------- /src/images/emoji/apple/green-dark/1f409.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/green-dark/1f409.png -------------------------------------------------------------------------------- /src/images/emoji/apple/green-dark/1f40a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/green-dark/1f40a.png -------------------------------------------------------------------------------- /src/images/emoji/apple/green-dark/1f40d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/green-dark/1f40d.png -------------------------------------------------------------------------------- /src/images/emoji/apple/green-dark/1f422.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/green-dark/1f422.png -------------------------------------------------------------------------------- /src/images/emoji/apple/green-dark/1f432.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/green-dark/1f432.png -------------------------------------------------------------------------------- /src/images/emoji/apple/green-light/1f340.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/green-light/1f340.png -------------------------------------------------------------------------------- /src/images/emoji/apple/green-light/1f343.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/green-light/1f343.png -------------------------------------------------------------------------------- /src/images/emoji/apple/green-light/1f34f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/green-light/1f34f.png -------------------------------------------------------------------------------- /src/images/emoji/apple/green-light/1f438.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/green-light/1f438.png -------------------------------------------------------------------------------- /src/images/emoji/apple/green-light/1f4d7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/green-light/1f4d7.png -------------------------------------------------------------------------------- /src/images/emoji/apple/green-light/2618.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/green-light/2618.png -------------------------------------------------------------------------------- /src/images/emoji/apple/green-light/267b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/green-light/267b.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-dark/1f311.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-dark/1f311.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-dark/1f399.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-dark/1f399.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-dark/1f3ae.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-dark/1f3ae.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-dark/1f529.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-dark/1f529.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-dark/1f58a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-dark/1f58a.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-dark/1f68a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-dark/1f68a.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-light/1f368.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-light/1f368.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-light/1f3d0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-light/1f3d0.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-light/1f40f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-light/1f40f.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-light/1f516.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-light/1f516.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-light/1f527.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-light/1f527.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-light/1f56f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-light/1f56f.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-light/1f5d1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-light/1f5d1.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-light/1f5dc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-light/1f5dc.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-medium/1f400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-medium/1f400.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-medium/1f480.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-medium/1f480.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-medium/1f517.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-medium/1f517.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-medium/1f58b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-medium/1f58b.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-medium/2620.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-medium/2620.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-medium/2694.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-medium/2694.png -------------------------------------------------------------------------------- /src/images/emoji/apple/grey-medium/26d3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/grey-medium/26d3.png -------------------------------------------------------------------------------- /src/images/emoji/apple/indigo/1f346.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/indigo/1f346.png -------------------------------------------------------------------------------- /src/images/emoji/apple/indigo/1f456.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/indigo/1f456.png -------------------------------------------------------------------------------- /src/images/emoji/apple/indigo/1f699.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/indigo/1f699.png -------------------------------------------------------------------------------- /src/images/emoji/apple/indigo/1f6cb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/indigo/1f6cb.png -------------------------------------------------------------------------------- /src/images/emoji/apple/indigo/2602.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/indigo/2602.png -------------------------------------------------------------------------------- /src/images/emoji/apple/indigo/2614.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/indigo/2614.png -------------------------------------------------------------------------------- /src/images/emoji/apple/orange/1f34a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/orange/1f34a.png -------------------------------------------------------------------------------- /src/images/emoji/apple/orange/1f383.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/orange/1f383.png -------------------------------------------------------------------------------- /src/images/emoji/apple/orange/1f3c0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/orange/1f3c0.png -------------------------------------------------------------------------------- /src/images/emoji/apple/orange/1f458.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/orange/1f458.png -------------------------------------------------------------------------------- /src/images/emoji/apple/pink/1f338.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/pink/1f338.png -------------------------------------------------------------------------------- /src/images/emoji/apple/pink/1f33a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/pink/1f33a.png -------------------------------------------------------------------------------- /src/images/emoji/apple/pink/1f380.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/pink/1f380.png -------------------------------------------------------------------------------- /src/images/emoji/apple/pink/1f39f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/pink/1f39f.png -------------------------------------------------------------------------------- /src/images/emoji/apple/pink/1f437.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/pink/1f437.png -------------------------------------------------------------------------------- /src/images/emoji/apple/pink/1f43d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/pink/1f43d.png -------------------------------------------------------------------------------- /src/images/emoji/apple/pink/1f444.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/pink/1f444.png -------------------------------------------------------------------------------- /src/images/emoji/apple/pink/1f459.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/pink/1f459.png -------------------------------------------------------------------------------- /src/images/emoji/apple/pink/1f45b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/pink/1f45b.png -------------------------------------------------------------------------------- /src/images/emoji/apple/red/1f336.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/red/1f336.png -------------------------------------------------------------------------------- /src/images/emoji/apple/red/1f34e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/red/1f34e.png -------------------------------------------------------------------------------- /src/images/emoji/apple/red/1f353.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/red/1f353.png -------------------------------------------------------------------------------- /src/images/emoji/apple/red/1f392.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/red/1f392.png -------------------------------------------------------------------------------- /src/images/emoji/apple/red/1f47a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/red/1f47a.png -------------------------------------------------------------------------------- /src/images/emoji/apple/red/1f58d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/red/1f58d.png -------------------------------------------------------------------------------- /src/images/emoji/apple/red/1f980.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/red/1f980.png -------------------------------------------------------------------------------- /src/images/emoji/apple/red/260e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/red/260e.png -------------------------------------------------------------------------------- /src/images/emoji/apple/white/1f35a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/white/1f35a.png -------------------------------------------------------------------------------- /src/images/emoji/apple/white/1f3f3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/white/1f3f3.png -------------------------------------------------------------------------------- /src/images/emoji/apple/white/1f401.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/white/1f401.png -------------------------------------------------------------------------------- /src/images/emoji/apple/white/1f407.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/white/1f407.png -------------------------------------------------------------------------------- /src/images/emoji/apple/white/1f410.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/white/1f410.png -------------------------------------------------------------------------------- /src/images/emoji/apple/white/1f4ad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/white/1f4ad.png -------------------------------------------------------------------------------- /src/images/emoji/apple/white/1f984.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/white/1f984.png -------------------------------------------------------------------------------- /src/images/emoji/apple/white/2601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/white/2601.png -------------------------------------------------------------------------------- /src/images/emoji/apple/yellow/1f315.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/yellow/1f315.png -------------------------------------------------------------------------------- /src/images/emoji/apple/yellow/1f319.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/yellow/1f319.png -------------------------------------------------------------------------------- /src/images/emoji/apple/yellow/1f31d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/yellow/1f31d.png -------------------------------------------------------------------------------- /src/images/emoji/apple/yellow/1f34b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/yellow/1f34b.png -------------------------------------------------------------------------------- /src/images/emoji/apple/yellow/1f424.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/yellow/1f424.png -------------------------------------------------------------------------------- /src/images/emoji/apple/yellow/1f431.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/apple/yellow/1f431.png -------------------------------------------------------------------------------- /src/images/emoji/google/black/1f3a5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/black/1f3a5.png -------------------------------------------------------------------------------- /src/images/emoji/google/black/1f3a9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/black/1f3a9.png -------------------------------------------------------------------------------- /src/images/emoji/google/black/1f3b1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/black/1f3b1.png -------------------------------------------------------------------------------- /src/images/emoji/google/black/1f4a3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/black/1f4a3.png -------------------------------------------------------------------------------- /src/images/emoji/google/black/1f576.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/black/1f576.png -------------------------------------------------------------------------------- /src/images/emoji/google/black/1f5dd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/black/1f5dd.png -------------------------------------------------------------------------------- /src/images/emoji/google/blue-light/1f4a7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/blue-light/1f4a7.png -------------------------------------------------------------------------------- /src/images/emoji/google/blue-light/1f516.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/blue-light/1f516.png -------------------------------------------------------------------------------- /src/images/emoji/google/blue-light/2668.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/blue-light/2668.png -------------------------------------------------------------------------------- /src/images/emoji/google/blue-light/2693.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/blue-light/2693.png -------------------------------------------------------------------------------- /src/images/emoji/google/blue-light/2744.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/blue-light/2744.png -------------------------------------------------------------------------------- /src/images/emoji/google/blue/1f41f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/blue/1f41f.png -------------------------------------------------------------------------------- /src/images/emoji/google/blue/1f5f3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/blue/1f5f3.png -------------------------------------------------------------------------------- /src/images/emoji/google/blue/1f68e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/blue/1f68e.png -------------------------------------------------------------------------------- /src/images/emoji/google/blue/1f6e1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/blue/1f6e1.png -------------------------------------------------------------------------------- /src/images/emoji/google/blue/2708.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/blue/2708.png -------------------------------------------------------------------------------- /src/images/emoji/google/brown-dark/1f3c8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/brown-dark/1f3c8.png -------------------------------------------------------------------------------- /src/images/emoji/google/brown-dark/1f40e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/brown-dark/1f40e.png -------------------------------------------------------------------------------- /src/images/emoji/google/brown-dark/1f43b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/brown-dark/1f43b.png -------------------------------------------------------------------------------- /src/images/emoji/google/brown-dark/1f45e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/brown-dark/1f45e.png -------------------------------------------------------------------------------- /src/images/emoji/google/brown-dark/1f4a9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/brown-dark/1f4a9.png -------------------------------------------------------------------------------- /src/images/emoji/google/brown-dark/1f4ff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/brown-dark/1f4ff.png -------------------------------------------------------------------------------- /src/images/emoji/google/brown-light/1f36a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/brown-light/1f36a.png -------------------------------------------------------------------------------- /src/images/emoji/google/brown-light/1f375.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/brown-light/1f375.png -------------------------------------------------------------------------------- /src/images/emoji/google/brown-light/1f3da.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/brown-light/1f3da.png -------------------------------------------------------------------------------- /src/images/emoji/google/brown-light/1f43f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/brown-light/1f43f.png -------------------------------------------------------------------------------- /src/images/emoji/google/brown-light/1f58a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/brown-light/1f58a.png -------------------------------------------------------------------------------- /src/images/emoji/google/brown-light/26b0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/brown-light/26b0.png -------------------------------------------------------------------------------- /src/images/emoji/google/green-dark/1f33f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/green-dark/1f33f.png -------------------------------------------------------------------------------- /src/images/emoji/google/green-dark/1f40a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/green-dark/1f40a.png -------------------------------------------------------------------------------- /src/images/emoji/google/green-dark/1f432.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/green-dark/1f432.png -------------------------------------------------------------------------------- /src/images/emoji/google/green-dark/1f458.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/green-dark/1f458.png -------------------------------------------------------------------------------- /src/images/emoji/google/green-dark/2618.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/green-dark/2618.png -------------------------------------------------------------------------------- /src/images/emoji/google/green-light/1f348.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/green-light/1f348.png -------------------------------------------------------------------------------- /src/images/emoji/google/green-light/1f350.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/green-light/1f350.png -------------------------------------------------------------------------------- /src/images/emoji/google/green-light/1f40d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/green-light/1f40d.png -------------------------------------------------------------------------------- /src/images/emoji/google/green-light/1f438.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/green-light/1f438.png -------------------------------------------------------------------------------- /src/images/emoji/google/green-light/1f4b8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/green-light/1f4b8.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-dark/1f39e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-dark/1f39e.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-dark/1f4f0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-dark/1f4f0.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-dark/1f577.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-dark/1f577.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-dark/1f578.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-dark/1f578.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-light/1f3d0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-light/1f3d0.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-light/1f3db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-light/1f3db.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-light/1f54a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-light/1f54a.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-light/1f56f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-light/1f56f.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-light/1f5d2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-light/1f5d2.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-medium/1f399.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-medium/1f399.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-medium/1f400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-medium/1f400.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-medium/1f403.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-medium/1f403.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-medium/1f480.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-medium/1f480.png -------------------------------------------------------------------------------- /src/images/emoji/google/grey-medium/1f6e2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/grey-medium/1f6e2.png -------------------------------------------------------------------------------- /src/images/emoji/google/indigo/1f302.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/indigo/1f302.png -------------------------------------------------------------------------------- /src/images/emoji/google/indigo/1f40b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/indigo/1f40b.png -------------------------------------------------------------------------------- /src/images/emoji/google/indigo/1f418.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/indigo/1f418.png -------------------------------------------------------------------------------- /src/images/emoji/google/indigo/1f42c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/indigo/1f42c.png -------------------------------------------------------------------------------- /src/images/emoji/google/indigo/1f456.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/indigo/1f456.png -------------------------------------------------------------------------------- /src/images/emoji/google/indigo/1f6b0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/indigo/1f6b0.png -------------------------------------------------------------------------------- /src/images/emoji/google/indigo/260e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/indigo/260e.png -------------------------------------------------------------------------------- /src/images/emoji/google/orange/1f342.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/orange/1f342.png -------------------------------------------------------------------------------- /src/images/emoji/google/orange/1f3c9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/orange/1f3c9.png -------------------------------------------------------------------------------- /src/images/emoji/google/orange/1f420.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/orange/1f420.png -------------------------------------------------------------------------------- /src/images/emoji/google/orange/1f431.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/orange/1f431.png -------------------------------------------------------------------------------- /src/images/emoji/google/orange/1f434.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/orange/1f434.png -------------------------------------------------------------------------------- /src/images/emoji/google/orange/2638.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/orange/2638.png -------------------------------------------------------------------------------- /src/images/emoji/google/pink/1f338.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/pink/1f338.png -------------------------------------------------------------------------------- /src/images/emoji/google/pink/1f33c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/pink/1f33c.png -------------------------------------------------------------------------------- /src/images/emoji/google/pink/1f346.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/pink/1f346.png -------------------------------------------------------------------------------- /src/images/emoji/google/pink/1f347.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/pink/1f347.png -------------------------------------------------------------------------------- /src/images/emoji/google/pink/1f351.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/pink/1f351.png -------------------------------------------------------------------------------- /src/images/emoji/google/pink/1f429.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/pink/1f429.png -------------------------------------------------------------------------------- /src/images/emoji/google/pink/1f457.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/pink/1f457.png -------------------------------------------------------------------------------- /src/images/emoji/google/pink/1f460.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/pink/1f460.png -------------------------------------------------------------------------------- /src/images/emoji/google/pink/1f47e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/pink/1f47e.png -------------------------------------------------------------------------------- /src/images/emoji/google/red/1f336.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/red/1f336.png -------------------------------------------------------------------------------- /src/images/emoji/google/red/1f337.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/red/1f337.png -------------------------------------------------------------------------------- /src/images/emoji/google/red/1f339.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/red/1f339.png -------------------------------------------------------------------------------- /src/images/emoji/google/red/1f39f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/red/1f39f.png -------------------------------------------------------------------------------- /src/images/emoji/google/red/1f58d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/red/1f58d.png -------------------------------------------------------------------------------- /src/images/emoji/google/red/1f608.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/red/1f608.png -------------------------------------------------------------------------------- /src/images/emoji/google/red/1f980.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/red/1f980.png -------------------------------------------------------------------------------- /src/images/emoji/google/white/1f401.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/white/1f401.png -------------------------------------------------------------------------------- /src/images/emoji/google/white/1f407.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/white/1f407.png -------------------------------------------------------------------------------- /src/images/emoji/google/white/1f410.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/white/1f410.png -------------------------------------------------------------------------------- /src/images/emoji/google/white/1f6c1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/white/1f6c1.png -------------------------------------------------------------------------------- /src/images/emoji/google/white/1f984.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/white/1f984.png -------------------------------------------------------------------------------- /src/images/emoji/google/yellow/1f34b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/yellow/1f34b.png -------------------------------------------------------------------------------- /src/images/emoji/google/yellow/1f397.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/yellow/1f397.png -------------------------------------------------------------------------------- /src/images/emoji/google/yellow/1f3f7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/yellow/1f3f7.png -------------------------------------------------------------------------------- /src/images/emoji/google/yellow/1f41d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/yellow/1f41d.png -------------------------------------------------------------------------------- /src/images/emoji/google/yellow/1f424.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/yellow/1f424.png -------------------------------------------------------------------------------- /src/images/emoji/google/yellow/1f425.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/yellow/1f425.png -------------------------------------------------------------------------------- /src/images/emoji/google/yellow/1f4a1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/emoji/google/yellow/1f4a1.png -------------------------------------------------------------------------------- /src/images/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/favicon-16x16.png -------------------------------------------------------------------------------- /src/images/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/favicon-32x32.png -------------------------------------------------------------------------------- /src/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/favicon.ico -------------------------------------------------------------------------------- /src/images/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "icons": [ 4 | { 5 | "src": "/android-chrome-192x192.png", 6 | "sizes": "192x192", 7 | "type": "image/png" 8 | }, 9 | { 10 | "src": "/android-chrome-512x512.png", 11 | "sizes": "512x512", 12 | "type": "image/png" 13 | } 14 | ], 15 | "theme_color": "#ffffff", 16 | "background_color": "#ffffff", 17 | "display": "standalone" 18 | } -------------------------------------------------------------------------------- /src/images/maskable_icon_x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/maskable_icon_x192.png -------------------------------------------------------------------------------- /src/images/maskable_icon_x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/maskable_icon_x512.png -------------------------------------------------------------------------------- /src/images/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/moji-brush/33e7fce6b5dda3a5d908e98ed8094a347e4cbfe2/src/images/mstile-150x150.png -------------------------------------------------------------------------------- /src/images/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Moji Brush 🎨 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
Updates Ready, Tap to Reload
17 | 18 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Moji Brush", 3 | "short_name": "Moji Brush", 4 | "icons": [ 5 | { 6 | "src": "/images/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png", 9 | "purpose": "any" 10 | }, 11 | { 12 | "src": "/images/android-chrome-512x512.png", 13 | "sizes": "512x512", 14 | "type": "image/png", 15 | "purpose": "any" 16 | }, 17 | { 18 | "src": "/images/maskable_icon_x192.png", 19 | "sizes": "192x192", 20 | "type": "image/png", 21 | "purpose": "maskable" 22 | }, 23 | { 24 | "src": "/images/maskable_icon_x512.png", 25 | "sizes": "512x512", 26 | "type": "image/png", 27 | "purpose": "maskable" 28 | } 29 | ], 30 | "display": "fullscreen", 31 | "orientation": "any", 32 | "background_color": "#ffffff", 33 | "theme_color": "#ffffff", 34 | "start_url": "index.html" 35 | } 36 | -------------------------------------------------------------------------------- /src/page-menu.js: -------------------------------------------------------------------------------- 1 | class PageMenu extends HTMLElement { 2 | template() { 3 | return ` 4 | 30 | `; 31 | } 32 | 33 | connectedCallback() { 34 | let eventName = 'ontouchstart' in window ? 'touchstart' : 'click'; 35 | this.innerHTML = this.template(); 36 | 37 | if (window.app.brush.platform == 'apple') { 38 | document.getElementById('apple').classList.add('active'); 39 | } else { 40 | document.getElementById('google').classList.add('active'); 41 | } 42 | 43 | this.addEventListener(eventName, this.onMenuClick); 44 | } 45 | 46 | onMenuClick(e) { 47 | var node = e.target; 48 | 49 | while (node !== undefined && node.tagName !== 'PAGE-MENU') { 50 | if (node.tagName === 'LI') { 51 | this.dispatchEvent(new CustomEvent( 52 | 'menu-action', 53 | {bubbles : true, detail : node.getAttribute('action')})); 54 | break; 55 | } 56 | 57 | node = node.parentNode; 58 | } 59 | } 60 | } 61 | 62 | customElements.define('page-menu', PageMenu); 63 | -------------------------------------------------------------------------------- /src/size-picker.js: -------------------------------------------------------------------------------- 1 | class SizePicker extends HTMLElement { 2 | template() { 3 | return ` 4 |
5 |
6 |
7 |
8 |
9 | `; 10 | }; 11 | 12 | render() { this.innerHTML = this.template(); }; 13 | 14 | _setThumbPosition(x) { 15 | // Recenter the slider knob. 16 | this.querySelector('.thumb').style.transform = `translateX(${x - 15}px)`; 17 | } 18 | 19 | setThumbFromPreview(size) { 20 | // update the slider knob when emoji is scaled with pinch/unpinch 21 | let percent = (size - window.app.brushSize.min) / 22 | (window.app.brushSize.max - window.app.brushSize.min); 23 | percent = (percent + 0.1) * percent - 0.1; 24 | let x = (percent * this.rangeWidth); 25 | let sliderX = Math.min(Math.max(x, 0), this.rangeWidth); 26 | this._setThumbPosition(sliderX); 27 | } 28 | 29 | onTap(e) { 30 | // have to change from layerX to clientX or pageX or offsetX in the panel 31 | // slide layout 32 | // MDN suggests caution w/ layerX: 33 | // https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/layerX 34 | let touchX = e.touches ? e.touches[0].pageX : e.offsetX; 35 | 36 | // Prevent the slider from going off the left or right of the screen. 37 | let sliderX = Math.min(Math.max(touchX, 0), this.rangeWidth); 38 | 39 | this._setThumbPosition(sliderX); 40 | 41 | // Finally set the value by passing a value between 0 and 1. 42 | this.updateValue(touchX / this.innerWidth); 43 | } 44 | 45 | updateValue(percent) { 46 | // Clamp btw 1 and 0.1 47 | percent = Math.min(1, Math.max(0.1, percent)); 48 | 49 | let newSize = 50 | (window.app.brushSize.max - window.app.brushSize.min) * percent + 51 | window.app.brushSize.min; 52 | 53 | this.dispatchEvent(new CustomEvent('brush-change', { 54 | bubbles : true, 55 | detail : { 56 | brushSize : newSize, 57 | } 58 | })); 59 | }; 60 | 61 | connectedCallback() { 62 | this.render(); 63 | 64 | // Cache the range width so we do not need to requery the val. 65 | this.rangeWidth = 66 | this.querySelector('.horizontal-range').getBoundingClientRect().width; 67 | 68 | this.innerWidth = this.getBoundingClientRect().width; 69 | 70 | // When attached set the correct position of the thumb. 71 | this._setThumbPosition(window.app.getBrushSizePercent() * this.rangeWidth); 72 | 73 | // Sniff if this is a touch device. 74 | let eventName = 'ontouchstart' in window ? 'touchstart' : 'click'; 75 | 76 | this.addEventListener(eventName, this.onTap.bind(this)); 77 | this.addEventListener('touchmove', this.onTap.bind(this)); 78 | } 79 | } 80 | 81 | customElements.define('size-picker', SizePicker); 82 | -------------------------------------------------------------------------------- /src/sw.js: -------------------------------------------------------------------------------- 1 | var VERSION = '0.0.27'; 2 | 3 | // generated via 4 | // https://gist.github.com/samccone/f9ab817944a7b69d2b8716e37d887ce9 5 | var emojiList = 6 | [ 7 | "/images/emoji/google/black/1f3a5.png", 8 | "/images/emoji/google/black/1f3a9.png", 9 | "/images/emoji/google/black/1f3b1.png", 10 | "/images/emoji/google/black/1f4a3.png", 11 | "/images/emoji/google/black/1f576.png", 12 | "/images/emoji/google/black/1f5dd.png", 13 | "/images/emoji/google/blue/1f41f.png", 14 | "/images/emoji/google/blue/1f5f3.png", 15 | "/images/emoji/google/blue/1f68e.png", 16 | "/images/emoji/google/blue/1f6e1.png", 17 | "/images/emoji/google/blue/2708.png", 18 | "/images/emoji/google/blue-light/1f4a7.png", 19 | "/images/emoji/google/blue-light/1f516.png", 20 | "/images/emoji/google/blue-light/2668.png", 21 | "/images/emoji/google/blue-light/2693.png", 22 | "/images/emoji/google/blue-light/2744.png", 23 | "/images/emoji/google/brown-dark/1f3c8.png", 24 | "/images/emoji/google/brown-dark/1f40e.png", 25 | "/images/emoji/google/brown-dark/1f43b.png", 26 | "/images/emoji/google/brown-dark/1f45e.png", 27 | "/images/emoji/google/brown-dark/1f4a9.png", 28 | "/images/emoji/google/brown-dark/1f4ff.png", 29 | "/images/emoji/google/brown-light/1f36a.png", 30 | "/images/emoji/google/brown-light/1f375.png", 31 | "/images/emoji/google/brown-light/1f3da.png", 32 | "/images/emoji/google/brown-light/1f43f.png", 33 | "/images/emoji/google/brown-light/1f58a.png", 34 | "/images/emoji/google/brown-light/26b0.png", 35 | "/images/emoji/google/green-dark/1f33f.png", 36 | "/images/emoji/google/green-dark/1f40a.png", 37 | "/images/emoji/google/green-dark/1f432.png", 38 | "/images/emoji/google/green-dark/1f458.png", 39 | "/images/emoji/google/green-dark/2618.png", 40 | "/images/emoji/google/green-light/1f348.png", 41 | "/images/emoji/google/green-light/1f350.png", 42 | "/images/emoji/google/green-light/1f40d.png", 43 | "/images/emoji/google/green-light/1f438.png", 44 | "/images/emoji/google/green-light/1f4b8.png", 45 | "/images/emoji/google/grey-dark/1f39e.png", 46 | "/images/emoji/google/grey-dark/1f4f0.png", 47 | "/images/emoji/google/grey-dark/1f577.png", 48 | "/images/emoji/google/grey-dark/1f578.png", 49 | "/images/emoji/google/grey-light/1f3d0.png", 50 | "/images/emoji/google/grey-light/1f3db.png", 51 | "/images/emoji/google/grey-light/1f54a.png", 52 | "/images/emoji/google/grey-light/1f56f.png", 53 | "/images/emoji/google/grey-light/1f5d2.png", 54 | "/images/emoji/google/grey-medium/1f399.png", 55 | "/images/emoji/google/grey-medium/1f400.png", 56 | "/images/emoji/google/grey-medium/1f403.png", 57 | "/images/emoji/google/grey-medium/1f480.png", 58 | "/images/emoji/google/grey-medium/1f6e2.png", 59 | "/images/emoji/google/indigo/1f302.png", 60 | "/images/emoji/google/indigo/1f40b.png", 61 | "/images/emoji/google/indigo/1f418.png", 62 | "/images/emoji/google/indigo/1f42c.png", 63 | "/images/emoji/google/indigo/1f456.png", 64 | "/images/emoji/google/indigo/1f6b0.png", 65 | "/images/emoji/google/indigo/260e.png", 66 | "/images/emoji/google/orange/1f342.png", 67 | "/images/emoji/google/orange/1f3c9.png", 68 | "/images/emoji/google/orange/1f420.png", 69 | "/images/emoji/google/orange/1f431.png", 70 | "/images/emoji/google/orange/1f434.png", 71 | "/images/emoji/google/orange/2638.png", 72 | "/images/emoji/google/red/1f336.png", 73 | "/images/emoji/google/red/1f337.png", 74 | "/images/emoji/google/red/1f339.png", 75 | "/images/emoji/google/red/1f39f.png", 76 | "/images/emoji/google/red/1f58d.png", 77 | "/images/emoji/google/red/1f608.png", 78 | "/images/emoji/google/red/1f980.png", 79 | "/images/emoji/google/pink/1f338.png", 80 | "/images/emoji/google/pink/1f33c.png", 81 | "/images/emoji/google/pink/1f346.png", 82 | "/images/emoji/google/pink/1f347.png", 83 | "/images/emoji/google/pink/1f351.png", 84 | "/images/emoji/google/pink/1f429.png", 85 | "/images/emoji/google/pink/1f457.png", 86 | "/images/emoji/google/pink/1f460.png", 87 | "/images/emoji/google/pink/1f47e.png", 88 | "/images/emoji/google/white/1f401.png", 89 | "/images/emoji/google/white/1f407.png", 90 | "/images/emoji/google/white/1f410.png", 91 | "/images/emoji/google/white/1f6c1.png", 92 | "/images/emoji/google/white/1f984.png", 93 | "/images/emoji/google/yellow/1f34b.png", 94 | "/images/emoji/google/yellow/1f397.png", 95 | "/images/emoji/google/yellow/1f3f7.png", 96 | "/images/emoji/google/yellow/1f41d.png", 97 | "/images/emoji/google/yellow/1f424.png", 98 | "/images/emoji/google/yellow/1f425.png", 99 | "/images/emoji/google/yellow/1f4a1.png" 100 | ] 101 | 102 | this.addEventListener('install', function(e) { 103 | e.waitUntil(caches.open(VERSION).then(cache => { 104 | return cache 105 | .addAll([ 106 | '/', 107 | '/index.html', 108 | '/app.css', 109 | '/app.js', 110 | '/footer-menu.js', 111 | '/page-menu.js', 112 | '/draw-canvas.js', 113 | '/brush-preview.js', 114 | '/brush-picker-pane.js', 115 | '/emoji-map.js', 116 | '/size-picker.js', 117 | '/background-overlay.js', 118 | '/welcome.json', 119 | '/manifest.json', 120 | ].concat(...emojiList)) 121 | .then(_ => this.skipWaiting()); 122 | })) 123 | }); 124 | 125 | this.addEventListener('fetch', function(e) { 126 | e.respondWith(caches.match(e.request).then((res) => { 127 | // If there is no match in the cache, we get undefined back, 128 | // in that case go to the network! 129 | return res ? res : handleNoCacheMatch(e); 130 | })); 131 | }); 132 | 133 | this.addEventListener('activate', function(e) { 134 | e.waitUntil(caches.keys().then((keys) => { 135 | return Promise 136 | .all(keys.map(k => { 137 | if (k !== VERSION) { 138 | return caches.delete(k); 139 | } 140 | })) 141 | .then(_ => {return this.clients.claim()}); 142 | })) 143 | }); 144 | 145 | // fetch from network 146 | // and put into our cache 147 | function handleNoCacheMatch(e) { 148 | return fetch(e.request).then(res => { 149 | return caches.open(VERSION).then(cache => { 150 | cache.put(e.request, res.clone()); 151 | 152 | return res; 153 | }); 154 | }); 155 | } 156 | -------------------------------------------------------------------------------- /src/welcome.json: -------------------------------------------------------------------------------- 1 | [{"brush":"0x1F428","size":61.8625,"xy":[[49,48],[49,53],[49,58],[49,62],[49,69],[49,73],[49,77],[49,79],[49,80],[49,84],[49,86],[49,89],[51,91],[51,93],[51,94],[51,94],[51,93],[51,91],[52,88],[52,85],[53,81],[53,78],[53,75],[54,73],[55,69],[55,65],[56,61],[57,57],[58,54],[59,52],[60,52],[60,51],[61,50],[63,50],[64,50],[67,50],[69,51],[72,54],[74,58],[77,61],[78,63],[79,65],[80,66],[81,68],[81,70],[82,75],[83,78],[84,83],[85,87],[86,90],[86,92],[87,93],[87,94],[87,93],[87,92],[87,91],[87,90],[87,88],[87,86],[87,83],[87,80],[87,77],[87,75],[87,73],[87,71],[87,70],[89,69],[89,68],[89,68],[90,67],[90,66],[91,65],[93,64],[95,62],[97,61],[98,60],[100,58],[101,57],[102,57],[103,56],[104,56],[105,56],[106,56],[107,56],[108,56],[109,56],[111,56],[113,57],[116,59],[117,60],[119,62],[120,64],[121,65],[121,66],[122,68],[123,70],[124,72],[124,75],[125,78],[126,81],[126,83],[126,84],[126,84],[126,85],[126,86],[126,86],[126,87],[126,88],[126,89],[126,89],[126,90],[126,91],[126,92],[128,93],[128,94],[128,94]]},{"brush":"0x1F428","size":61.8625,"xy":[[179,56],[177,57],[176,58],[174,60],[173,62],[171,64],[171,65],[170,66],[170,67],[170,68],[170,69],[169,69],[169,70],[169,71],[169,73],[169,74],[169,76],[169,77],[169,80],[169,81],[169,82],[170,84],[171,86],[174,88],[175,90],[177,92],[180,94],[182,95],[184,95],[186,97],[188,97],[190,98],[192,98],[194,98],[195,98],[198,98],[200,97],[202,95],[204,94],[205,93],[205,92],[206,91],[206,90],[206,89],[206,87],[206,84],[206,81],[206,77],[206,74],[206,72],[205,70],[204,69],[203,67],[201,66],[200,64],[198,62],[197,61],[194,60],[193,59],[191,58],[189,57],[187,56],[186,55],[185,54],[184,54],[183,54]]},{"brush":"0x1F428","size":61.8625,"xy":[[238,59],[238,61],[240,64],[242,66],[244,68],[245,70],[246,71],[247,72],[247,74],[247,75],[248,79],[248,81],[249,84],[250,86],[250,89],[250,92],[250,95],[250,98],[250,101],[250,104],[250,107],[250,110],[249,114],[248,117],[247,119],[246,121],[245,123],[245,125],[244,125],[242,126],[240,127],[238,127],[236,127],[233,127],[232,127],[231,127],[231,127],[231,126],[231,125],[230,125]]},{"brush":"0x1F428","size":61.8625,"xy":[[239,23],[238,24],[236,25],[235,26],[234,26],[233,26]]},{"brush":"0x1F428","size":61.8625,"xy":[[288,53],[289,53],[290,53],[290,53],[290,54],[291,56],[291,56],[292,56],[294,57],[294,58],[295,58],[295,59],[296,60],[296,62],[296,63],[296,65],[296,66],[296,67],[297,69],[297,71],[297,72],[297,73],[297,74],[298,76],[298,77],[298,79],[298,80],[298,82],[298,83],[298,84],[298,84],[298,85],[298,86],[298,87],[298,88],[298,89],[298,90],[298,91],[298,92],[298,92],[298,93],[298,94],[298,95],[299,95],[299,96]]},{"brush":"0x1F428","size":61.8625,"xy":[[284,19],[284,20],[283,20],[283,21],[282,21]]},{"brush":"0x1F428","size":61.8625,"xy":[[339,74],[341,74],[343,74],[346,74],[348,74],[349,74],[350,74],[352,74],[352,74],[353,74],[354,74],[355,74]]},{"brush":"0x1F428","size":61.8625,"xy":[[22,174],[22,181],[22,187],[22,192],[22,197],[22,203],[22,207],[22,212],[22,216],[22,220],[22,225],[22,229],[23,233],[23,236],[23,239],[23,241],[24,242],[24,243],[24,244],[24,244],[24,245],[24,246]]},{"brush":"0x1F428","size":61.8625,"xy":[[23,215],[23,214],[25,213],[26,211],[27,210],[28,209],[30,207],[31,206],[33,206],[35,204],[37,203],[40,202],[42,201],[44,199],[46,199],[48,199],[49,199],[49,199],[50,199],[51,199],[54,200],[57,201],[58,201],[60,202],[61,203],[62,204],[63,205],[65,207],[66,208],[67,209],[68,211],[69,212],[70,213],[71,214],[71,217],[72,219],[72,220],[72,222],[72,223],[72,225],[72,226],[72,228],[72,230],[72,231],[71,232],[69,234],[68,235],[67,237],[65,237],[64,238],[62,239],[61,240],[60,240],[59,241],[57,241],[54,241],[51,241],[50,241],[48,241],[46,241],[45,241],[44,241],[44,240],[44,239],[44,238],[44,238],[43,238]]},{"brush":"0x1F428","size":61.8625,"xy":[[94,199],[95,201],[97,203],[98,206],[99,207],[100,208],[100,210],[101,211],[102,212],[103,214],[103,216],[104,218],[105,222],[106,225],[106,226],[107,228],[108,230],[108,232],[109,233],[109,234],[109,236],[110,237],[110,238],[110,239],[110,240],[110,239],[110,238],[110,237],[110,236],[110,235],[110,233],[110,231],[110,227],[110,224],[110,220],[110,217],[110,215],[110,213],[110,210],[111,208],[111,207],[112,206],[112,205],[113,204],[114,203],[116,201],[117,200],[119,199],[120,199],[122,198],[124,198],[125,198],[126,198],[127,198],[128,198],[130,198],[131,198],[132,198],[133,198],[134,199],[135,199],[135,200],[136,200],[136,201],[136,202],[137,202],[137,203],[137,203],[138,203],[138,204]]},{"brush":"0x1F428","size":61.8625,"xy":[[168,202],[168,204],[168,206],[168,210],[168,213],[168,216],[168,219],[167,223],[167,227],[167,230],[167,234],[167,237],[167,240],[167,242],[167,244],[167,247],[167,249],[167,251],[167,253],[168,255],[169,256],[170,257],[171,258],[172,258],[173,259],[175,259],[177,259],[181,259],[185,257],[188,255],[192,251],[195,248],[197,245],[199,243],[201,241],[202,240],[203,238],[203,236],[204,234],[204,232],[205,230],[205,227],[205,223],[205,220],[205,217],[205,213],[205,210],[205,208],[205,207],[205,206],[205,205],[205,206],[205,207],[205,208],[205,209],[205,210],[205,211],[205,213],[205,214],[206,216],[207,218],[207,220],[208,222],[209,226],[210,227],[211,230],[212,232],[214,234],[214,235],[215,237],[216,238],[216,239],[217,239],[217,240],[217,241],[217,242],[217,243],[217,243],[217,244],[217,245],[218,245]]},{"brush":"0x1F428","size":61.8625,"xy":[[280,200],[279,199],[278,199],[277,198],[275,198],[274,198],[272,198],[271,197],[270,196],[268,196],[265,196],[263,195],[260,195],[258,195],[257,195],[255,195],[254,195],[253,195],[252,195],[251,195],[251,196],[250,197],[250,198],[249,199],[249,201],[249,201],[249,202],[249,203],[249,203],[249,204],[249,205],[249,206],[249,207],[249,209],[250,210],[250,211],[250,212],[251,213],[251,214],[254,215],[255,216],[256,217],[257,218],[258,219],[260,220],[261,220],[263,221],[265,221],[268,222],[270,223],[272,223],[273,224],[275,225],[276,225],[277,225],[279,226],[282,227],[284,228],[286,229],[288,229],[291,230],[292,230],[293,230],[293,230],[294,231],[295,231],[295,232],[295,233],[295,234],[295,234],[295,235],[295,236],[295,237],[295,238],[295,239],[295,240],[294,241],[293,242],[292,243],[292,244],[290,244],[289,245],[288,246],[287,247],[286,247],[285,248],[283,249],[281,250],[278,250],[275,250],[272,250],[269,250],[267,250],[266,250],[264,250],[262,250],[260,250],[258,249],[256,249],[254,248],[253,248],[253,247],[252,247],[252,247],[251,247],[251,246],[250,246],[250,245]]},{"brush":"0x1F428","size":61.8625,"xy":[[315,153],[315,161],[315,165],[315,171],[316,175],[316,179],[317,181],[318,186],[318,189],[319,192],[319,195],[321,198],[321,201],[321,204],[322,205],[322,207],[322,208],[323,210],[323,214],[324,217],[325,220],[325,223],[326,226],[326,228],[327,230],[327,231],[327,233],[328,235],[328,237],[328,239],[329,240],[329,242],[329,243],[329,243],[329,244],[329,243],[329,242],[329,241],[329,238],[329,235],[329,232],[329,229],[329,226],[329,225],[329,223],[329,222],[329,220],[329,218],[329,216],[329,214],[330,211],[331,209],[332,207],[334,205],[336,204],[338,203],[340,202],[341,201],[343,201],[346,200],[348,200],[350,199],[352,199],[354,199],[355,199],[356,199],[358,200],[359,201],[360,201],[361,202],[361,207],[363,210],[364,214],[366,218],[367,222],[368,224],[368,226],[368,228],[368,229],[368,230],[368,231],[368,232],[369,232],[369,233],[369,233],[369,234],[369,235],[369,235],[369,236],[369,237],[369,238],[369,239],[369,239],[369,240],[369,241],[369,241],[369,242]]}] --------------------------------------------------------------------------------