├── .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 |
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 |
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 |
5 |
6 |
7 | -
8 |
9 |
10 | -
11 |
12 |
13 |
14 |
15 |
16 | -
17 |
20 |
21 |
22 | -
23 |
26 |
27 |
28 |
29 |
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 |
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]]}]
--------------------------------------------------------------------------------