├── .eslintrc.json ├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── git-commit-template.txt ├── manifest.json ├── package-lock.json ├── package.json ├── src ├── assets │ ├── css │ │ ├── fonts.css │ │ └── index.css │ ├── emojis │ │ ├── activity.js │ │ ├── flags.js │ │ ├── foodAndDrink.js │ │ ├── index.js │ │ ├── nature.js │ │ ├── objects.js │ │ ├── people.js │ │ ├── places.js │ │ ├── skintone.js │ │ └── symbols.js │ ├── fonts │ │ ├── fa-brands-400.eot │ │ ├── fa-brands-400.ttf │ │ ├── fa-brands-400.woff │ │ ├── fa-brands-400.woff2 │ │ ├── fa-regular-400.eot │ │ ├── fa-regular-400.ttf │ │ ├── fa-regular-400.woff │ │ ├── fa-regular-400.woff2 │ │ ├── fa-solid-900.eot │ │ ├── fa-solid-900.ttf │ │ ├── fa-solid-900.woff │ │ └── fa-solid-900.woff2 │ └── images │ │ ├── icon.png │ │ └── reset.png ├── index.html ├── js │ ├── components │ │ ├── index.js │ │ ├── nav.js │ │ ├── recent │ │ │ ├── removeDuplicate.js │ │ │ ├── renderRecent.js │ │ │ └── updateRecent.js │ │ └── skintoneButtons.js │ ├── dist │ │ └── twemoji.min.js │ ├── events │ │ ├── buttonEvent │ │ │ ├── copy.js │ │ │ ├── copySetting.js │ │ │ ├── github.js │ │ │ ├── goback.js │ │ │ ├── index.js │ │ │ ├── panel.js │ │ │ ├── recentSetting.js │ │ │ ├── reset.js │ │ │ ├── setting.js │ │ │ ├── sizeSetting.js │ │ │ └── skintone.js │ │ ├── emojiEvent │ │ │ ├── autoCopyOff.js │ │ │ ├── autoCopyOn.js │ │ │ └── index.js │ │ └── inputEvent │ │ │ └── search.js │ ├── pages │ │ ├── main │ │ │ ├── event │ │ │ │ ├── copy.js │ │ │ │ └── getEmoji.js │ │ │ └── view │ │ │ │ └── emojiContainers.js │ │ └── settings │ │ │ └── view │ │ │ └── init.js │ └── utils │ │ ├── const.js │ │ └── doc.js ├── main.js └── worker.js └── webpack.config.js /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "airbnb-base", 4 | "prettier", 5 | "plugin:import/errors", 6 | "plugin:import/warnings", 7 | "eslint:recommended" 8 | ], 9 | "parser": "babel-eslint", 10 | "plugins": ["prettier", "import"], 11 | "rules": { 12 | "indent": ["error", 2, { "SwitchCase": 1 }], 13 | "semi": ["error", "always"], 14 | "quotes": ["error", "single"], 15 | "no-console": ["error", { "allow": ["warn", "error"] }], 16 | "default-case": 0, 17 | "no-array-constructor": 0, 18 | "import/extensions": ["error", "always"], 19 | "keyword-spacing": ["error", { "before": true }], 20 | "eqeqeq": ["error", "always"], 21 | "comma-spacing": ["error", { "before": false, "after": true }], 22 | "block-spacing": ["error", "always"] 23 | }, 24 | "env": { 25 | "browser": true, 26 | "es6": true 27 | }, 28 | "globals": { 29 | "Atomics": "readonly", 30 | "SharedArrayBuffer": "readonly" 31 | }, 32 | "parserOptions": { 33 | "ecmaVersion": 2018, 34 | "sourceType": "module" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.ai 2 | *.zip 3 | 4 | # JPEG 5 | *.jpg 6 | *.jpeg 7 | *.jpe 8 | *.jif 9 | *.jfif 10 | *.jfi 11 | 12 | # JPEG 2000 13 | *.jp2 14 | *.j2k 15 | *.jpf 16 | *.jpx 17 | *.jpm 18 | *.mj2 19 | 20 | # JPEG XR 21 | *.jxr 22 | *.hdp 23 | *.wdp 24 | 25 | # Graphics Interchange Format 26 | *.gif 27 | 28 | # RAW 29 | *.raw 30 | 31 | # Web P 32 | *.webp 33 | 34 | # Animated Portable Network Graphics 35 | *.apng 36 | 37 | # Multiple-image Network Graphics 38 | *.mng 39 | 40 | # Tagged Image File Format 41 | *.tiff 42 | *.tif 43 | 44 | # Scalable Vector Graphics 45 | *.svg 46 | *.svgz 47 | 48 | # Portable Document Format 49 | *.pdf 50 | 51 | # X BitMap 52 | *.xbm 53 | 54 | # BMP 55 | *.bmp 56 | *.dib 57 | 58 | # ICO 59 | *.ico 60 | 61 | # 3D Images 62 | *.3dm 63 | *.max 64 | 65 | #node_modules 66 | node_modules 67 | 68 | .vscode/ 69 | 70 | .quokka 71 | 72 | build/ -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 2, 4 | "singleQuote": true, 5 | "bracketSpacing": true, 6 | "jsxBracketSameLine": false, 7 | "arrowParens": "always" 8 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 soyoungjeong 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 모지모지 이모지(MojiMoji Emoji) 2 | 3 | ![](https://img.shields.io/badge/language-javascript-red.svg) ![](https://img.shields.io/badge/version-1.0.2-orange) ![](https://img.shields.io/badge/license-MIT-green) 4 | 5 |
6 |

7 | 8 | Extension application for whale browser. 9 | 클릭 한 번으로 간편하게 이모티콘을 복사+붙여넣기 할 수 있는 확장앱입니다. 10 | 11 | 웨일 스토어에서 다운로드📥 12 | 13 |
14 | 15 |   16 |   17 | 18 | ## 🆕Update 19 | 20 |   21 | 22 | ### v1.0.2 Update 23 | 24 | - 프로젝트 구조 변경 25 | - jquery, clipboard 라이브러리 제거 26 | - copy, recent 동작 개선 27 | 28 | 29 | ### v1.0.1 Update 30 | 31 | - 누락된 이모티콘 추가 (표정, 동물-어류, 도구) 32 | - 오타 수정 33 | 34 |   35 |   36 | 37 | ## 👾Getting Started 38 | 39 | ### Prerequisites 40 | 41 | Whale Browser [설치](https://whale.naver.com/ko/download)가 필요합니다. 42 | 43 | ### Installing 44 | 45 | ``` 46 | npm install 47 | ``` 48 | 49 |   50 |   51 | 52 | ## 🔌Running the tests 53 | 54 | 로컬에 프로젝트 저장 후, 웨일 브라우저 [개발자 모드](whale://extensions/)에서 프로젝트를 설치하면 테스트 가능합니다. 55 | 56 |   57 |   58 | 59 | ## 🔨Built With 60 | 61 | - [Whale developers](https://developers.whale.naver.com/) 62 | - [Font Awesome](https://fontawesome.com/) 63 | - [Twemoji](https://twemoji.twitter.com) 64 | - [Clipboard.js](https://github.com/zenorocha/clipboard.js) 65 | 66 |   67 |   68 | 69 | ## 📁File Structure 70 | 71 | ``` 72 | /app 73 | index.html 👉 project html 구조 74 | /css 75 | index.css 76 | /js 77 | /utils 78 | doc.js 👉 document methods 79 | const.js 👉 const bundle 80 | /pages 81 | /main 82 | emojiContainers.js 👉 emoji 불러올 html 구조 생성 83 | copy.js 👉 copy button click 후 기능 84 | /settings 85 | init.js 👉 setting page 초기 값 설정 86 | /components 87 | index.js 88 | nav.js 👉 nav bar에 버튼 추가 89 | skintoneButtons.js 👉 피부색 버튼 추가 90 | /recent 91 | renderRecent.js 👉 recent 요소 render 92 | updateRecent.js 👉 update recent data 93 | removeDuplicate.js 👉 중복 요소 제거 94 | /events 95 | /buttonEvent(button click 관련 event listener 등록) 96 | /emojiEvent(emoji button click 관련 event listener 등록) 97 | /inputEvent(input 관련 event listener 등록) 98 | ``` 99 | 100 | js 관련 폴더는 크게 utils / pages / components / events 로 나뉩니다. 101 | events 폴더 내의 파일은 단순 eventlistener 등록 관련 파일입니다. 102 | 103 |   104 |   105 | 106 | ## 👥Contributing 107 | 108 | 언제든 참여해주세요! 건의나 제안사항은 issue에 남겨주시면 답변드리겠습니다. 109 | 110 | Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. 111 | Please make sure to update tests as appropriate. 112 | 113 | ## 📢Versioning 114 | 115 | We use [SemVer](http://semver.org/) for versioning. 116 | 117 | ## 😎Authors 118 | 119 | See the list of [contributors](https://github.com/soyoungjeong/EmojiByEternal/graphs/contributors) who participated in this project. 120 | 121 | ## 📄License 122 | 123 | This project is licensed under the MIT License - see the [LICENSE.md](https://github.com/soyoungjeong/EmojiByEternal/blob/master/LICENSE) file for details 124 | -------------------------------------------------------------------------------- /git-commit-template.txt: -------------------------------------------------------------------------------- 1 | [Prefix] #issue_number 커밋메세지 2 | 3 | # 제목의 길이는 최대 40글자까지 한글로 간단 명료하게 작성 4 | # 제목을 작성하고 반드시 빈 줄 한 줄을 만들어야 함 5 | # 제목에 .(마침표) 금지 6 | # [Prefix] 리스트 7 | # Feat : 새로운 기능 8 | # Fix : 버그 수정 9 | # Refact : 리팩토링 10 | # Docs : 문서 (문서 추가, 수정, 삭제) 11 | # Add : 이미지 등 리소스, 셋팅 파일 추가, 수정 12 | # Chore : 기타 변경사항 13 | # 내용의 길이는 한 줄당 60글자 내외에서 줄 바꿈. 한글로 간단 명료하게 작성 14 | # 어떻게 보다는 무엇을, 왜 변경했는지를 작성할 것 (필수) 15 | # 연관된 이슈 첨부, 여러 개 추가 가능 16 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | "name": "모지모지 이모지", 4 | "version": "1.0.4", 5 | 6 | "description": "모지모지 이모지로 컴퓨터에서도 쉽게 이모티콘을 입력해보세요!", 7 | 8 | "browser_action": { 9 | "default_popup": "./src/index.html", 10 | "default_icon": { 11 | "16": "./src/assets/images/icon.png", 12 | "32": "./src/assets/images/icon.png" 13 | } 14 | }, 15 | "permissions": ["tabs"] 16 | } 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "emojibyeternal", 3 | "version": "1.0.4", 4 | "description": "Emoji keyboard extension for Whale", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "build": "webpack --mode=production" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/soyoungjeong/EmojiByEternal.git" 13 | }, 14 | "author": "", 15 | "license": "MIT", 16 | "bugs": { 17 | "url": "https://github.com/soyoungjeong/EmojiByEternal/issues" 18 | }, 19 | "homepage": "https://github.com/soyoungjeong/EmojiByEternal#readme", 20 | "dependencies": { 21 | "twemoji": "^12.1.2" 22 | }, 23 | "devDependencies": { 24 | "babel-eslint": "^10.1.0", 25 | "copy-webpack-plugin": "^9.0.1", 26 | "css-loader": "^6.2.0", 27 | "eslint": "^6.8.0", 28 | "eslint-config-airbnb-base": "^14.0.0", 29 | "eslint-config-prettier": "^6.11.0", 30 | "eslint-plugin-import": "^2.21.1", 31 | "eslint-plugin-prettier": "^3.1.3", 32 | "html-webpack-plugin": "^5.3.2", 33 | "prettier": "^2.0.5", 34 | "webpack": "^5.50.0", 35 | "webpack-cli": "^4.8.0" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/assets/css/index.css: -------------------------------------------------------------------------------- 1 | body, 2 | p { 3 | margin: 0px; 4 | } 5 | 6 | .container { 7 | width: 400px; 8 | height: 500px; 9 | display: flex; 10 | flex-direction: column; 11 | } 12 | 13 | .container .header { 14 | background-color: #f1c40f; 15 | height: 45px; 16 | margin: 0px; 17 | display: grid; 18 | grid-template-columns: 300px 1fr 1fr; 19 | justify-content: center; 20 | align-items: center; 21 | color: white; 22 | } 23 | 24 | .grid-logo { 25 | font-size: 20px; 26 | font-weight: 600; 27 | padding-left: 20px; 28 | } 29 | 30 | .grid-panel, 31 | .grid-setting { 32 | padding-left: 10px; 33 | } 34 | 35 | .panel { 36 | cursor: pointer; 37 | } 38 | 39 | .container .emoji-container { 40 | height: 455px; 41 | overflow: hidden; 42 | } 43 | 44 | .emoji-nav { 45 | background-color: #bdc3c7; 46 | height: 45px; 47 | display: grid; 48 | grid-template-columns: repeat(9, 1fr); 49 | justify-items: center; 50 | align-items: center; 51 | } 52 | 53 | .emoji-nav a:link, 54 | .emoji-nav a:visited { 55 | color: #8b8e91; 56 | } 57 | 58 | .emoji-search { 59 | height: 45px; 60 | display: grid; 61 | grid-template-columns: 1fr 1fr; 62 | align-items: center; 63 | } 64 | .search-container { 65 | width: 25px; 66 | white-space: nowrap; 67 | position: relative; 68 | } 69 | .search-container input#searchInput { 70 | width: 210px; 71 | height: 30px; 72 | border: #8b8e91 solid 1px; 73 | font-size: 11pt; 74 | float: left; 75 | color: #8b8e91; 76 | margin-left: 8px; 77 | padding-left: 30px; 78 | -webkit-border-radius: 5px; 79 | -moz-border-radius: 5px; 80 | border-radius: 5px; 81 | } 82 | .search-container input#searchInput::-webkit-input-placeholder, 83 | .search-container input#searchInput:-moz-placeholder, 84 | .search-container input#searchInput::-moz-placeholder, 85 | .search-container input#searchInput:-ms-input-placeholder { 86 | color: #8b8e91; 87 | } 88 | 89 | .search-container .icon { 90 | position: absolute; 91 | top: -10px; 92 | left: 0px; 93 | margin-left: 17px; 94 | margin-top: 17px; 95 | z-index: 1; 96 | color: #8b8e91; 97 | } 98 | 99 | .color { 100 | width: 150px; 101 | margin-left: 40px; 102 | display: grid; 103 | grid-template-columns: repeat(5, 1fr); 104 | } 105 | 106 | .color span, 107 | .color span img { 108 | width: 25px; 109 | height: 25px; 110 | align-items: center; 111 | justify-content: center; 112 | } 113 | 114 | .color span img { 115 | cursor: pointer; 116 | } 117 | 118 | .emoji-list { 119 | height: 310px; 120 | overflow: scroll; 121 | display: flex; 122 | flex-direction: column; 123 | } 124 | 125 | .emoji-span-container { 126 | width: 100%; 127 | display: flex; 128 | flex-wrap: wrap; 129 | cursor: pointer; 130 | } 131 | 132 | .group-title { 133 | font-size: 16px; 134 | font-weight: 600; 135 | color: #bdc3c7; 136 | padding-left: 10px; 137 | margin-bottom: 15px; 138 | } 139 | .group-title i { 140 | margin-left: 5px; 141 | font-size: 14px; 142 | } 143 | 144 | .container .footer { 145 | background-color: #bdc3c7; 146 | height: 55px; 147 | display: grid; 148 | } 149 | 150 | #copy_group { 151 | width: 230px; 152 | height: 40px; 153 | padding-left: 10px; 154 | margin-left: 10px; 155 | margin-top: 5px; 156 | border: none; 157 | border-radius: 5px 0px 0px 5px; 158 | font-size: 16px; 159 | background-color: white; 160 | outline: none; 161 | } 162 | 163 | #reset_btn { 164 | position: absolute; 165 | margin-left: -8px; 166 | margin-top: 5px; 167 | background-color: white; 168 | width: 35px; 169 | height: 42px; 170 | border: none; 171 | border-radius: 0px 5px 5px 0px; 172 | outline: none; 173 | cursor: pointer; 174 | } 175 | 176 | #reset_img { 177 | width: 20px; 178 | height: 20px; 179 | margin-left: -5px; 180 | border-radius: 0px 5px 5px 0px; 181 | } 182 | 183 | #copy_btn { 184 | background-color: #f1c40f; 185 | color: white; 186 | display: inline; 187 | border: none; 188 | margin-left: 35px; 189 | border-radius: 5px; 190 | height: 40px; 191 | width: 90px; 192 | font-size: 15px; 193 | font-weight: 600; 194 | cursor: pointer; 195 | opacity: 1; 196 | } 197 | 198 | .setting { 199 | cursor: pointer; 200 | } 201 | .setting-container { 202 | display: none; 203 | width: 100%; 204 | padding: 20px; 205 | font-size: 15px; 206 | font-weight: 600; 207 | } 208 | 209 | .goback { 210 | cursor: pointer; 211 | } 212 | 213 | .settingBtns { 214 | margin-top: 30px; 215 | padding-left: 20px; 216 | font-size: 17px; 217 | } 218 | .settingBtns span { 219 | margin-left: -8px; 220 | cursor: default; 221 | } 222 | 223 | .btn-container { 224 | margin-top: 15px; 225 | margin-bottom: 40px; 226 | } 227 | 228 | .btn-container button { 229 | background-color: white; 230 | color: #bdc3c7; 231 | font-weight: 600; 232 | border: 1px solid #bdc3c7; 233 | border-radius: 2px; 234 | width: 80px; 235 | height: 40px; 236 | margin-left: -6px; 237 | cursor: pointer; 238 | } 239 | 240 | .btn-container .active { 241 | background-color: #f1c40f; 242 | color: black; 243 | font-weight: 600; 244 | border: 1px solid #f1c40f; 245 | } 246 | 247 | .settingBtn:focus { 248 | outline: 0; 249 | } 250 | .settingBtn:hover { 251 | background-color: #f1c40fab; 252 | color: black; 253 | border: 1px solid #f1c40f; 254 | -webkit-transition: width 0.5s; 255 | } 256 | 257 | .github hr { 258 | width: 360px; 259 | margin-bottom: 20px; 260 | margin-left: 0px; 261 | } 262 | 263 | .github i { 264 | cursor: pointer; 265 | margin-left: 30px; 266 | margin-right: 20px; 267 | vertical-align: middle; 268 | } 269 | 270 | .github span { 271 | font-size: 15px; 272 | font-weight: 500; 273 | } 274 | 275 | .big { 276 | height: 60px; 277 | padding: 10px; 278 | } 279 | 280 | .big img { 281 | height: 60px; 282 | } 283 | 284 | .normal { 285 | height: 30px; 286 | padding: 5px; 287 | } 288 | 289 | .normal img { 290 | height: 30px; 291 | } 292 | 293 | .small { 294 | height: 15px; 295 | padding: 5px; 296 | } 297 | 298 | .small img { 299 | height: 15px; 300 | } 301 | -------------------------------------------------------------------------------- /src/assets/emojis/activity.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | codes: '1F383', 4 | char: '🎃', 5 | name: 'jack-o-lantern', 6 | category: 'activity', 7 | }, 8 | { 9 | codes: '1F384', 10 | char: '🎄', 11 | name: 'Christmas tree', 12 | category: 'activity', 13 | }, 14 | { 15 | codes: '1F386', 16 | char: '🎆', 17 | name: 'fireworks', 18 | category: 'activity', 19 | }, 20 | { 21 | codes: '1F387', 22 | char: '🎇', 23 | name: 'sparkler', 24 | category: 'activity', 25 | }, 26 | { codes: '2728', char: '✨', name: 'sparkles', category: 'activity' }, 27 | { codes: '1F388', char: '🎈', name: 'balloon', category: 'activity' }, 28 | { 29 | codes: '1F389', 30 | char: '🎉', 31 | name: 'party popper', 32 | category: 'activity', 33 | }, 34 | { 35 | codes: '1F38A', 36 | char: '🎊', 37 | name: 'confetti ball', 38 | category: 'activity', 39 | }, 40 | { 41 | codes: '1F38B', 42 | char: '🎋', 43 | name: 'tanabata tree', 44 | category: 'activity', 45 | }, 46 | { 47 | codes: '1F38D', 48 | char: '🎍', 49 | name: 'pine decoration', 50 | category: 'activity', 51 | }, 52 | { 53 | codes: '1F38E', 54 | char: '🎎', 55 | name: 'Japanese dolls', 56 | category: 'activity', 57 | }, 58 | { 59 | codes: '1F38F', 60 | char: '🎏', 61 | name: 'carp streamer', 62 | category: 'activity', 63 | }, 64 | { codes: '1F380', char: '🎀', name: 'ribbon', category: 'activity' }, 65 | { 66 | codes: '1F381', 67 | char: '🎁', 68 | name: 'wrapped gift', 69 | category: 'activity', 70 | }, 71 | { codes: '1F3C6', char: '🏆', name: 'trophy', category: 'activity' }, 72 | { 73 | codes: '26BD', 74 | char: '⚽', 75 | name: 'soccer ball', 76 | category: 'activity', 77 | }, 78 | { codes: '26BE', char: '⚾', name: 'baseball', category: 'activity' }, 79 | { 80 | codes: '1F3C0', 81 | char: '🏀', 82 | name: 'basketball', 83 | category: 'activity', 84 | }, 85 | { 86 | codes: '1F3C8', 87 | char: '🏈', 88 | name: 'american football', 89 | category: 'activity', 90 | }, 91 | { 92 | codes: '1F3C9', 93 | char: '🏉', 94 | name: 'rugby football', 95 | category: 'activity', 96 | }, 97 | { codes: '1F3BE', char: '🎾', name: 'tennis', category: 'activity' }, 98 | { codes: '1F3B3', char: '🎳', name: 'bowling', category: 'activity' }, 99 | { 100 | codes: '26F3', 101 | char: '⛳', 102 | name: 'flag in hole', 103 | category: 'activity', 104 | }, 105 | { 106 | codes: '1F3A3', 107 | char: '🎣', 108 | name: 'fishing pole', 109 | category: 'activity', 110 | }, 111 | { 112 | codes: '1F3BD', 113 | char: '🎽', 114 | name: 'running shirt', 115 | category: 'activity', 116 | }, 117 | { codes: '1F3BF', char: '🎿', name: 'skis', category: 'activity' }, 118 | 119 | { 120 | codes: '1F3AF', 121 | char: '🎯', 122 | name: 'direct hit', 123 | category: 'activity', 124 | }, 125 | 126 | { 127 | codes: '1F3B1', 128 | char: '🎱', 129 | name: 'pool 8 ball', 130 | category: 'activity', 131 | }, 132 | { 133 | codes: '1F52E', 134 | char: '🔮', 135 | name: 'crystal ball', 136 | category: 'activity', 137 | }, 138 | { 139 | codes: '1F3AE', 140 | char: '🎮', 141 | name: 'video game', 142 | category: 'activity', 143 | }, 144 | { 145 | codes: '1F3B0', 146 | char: '🎰', 147 | name: 'slot machine', 148 | category: 'activity', 149 | }, 150 | { 151 | codes: '1F3B2', 152 | char: '🎲', 153 | name: 'game die', 154 | category: 'activity', 155 | }, 156 | { 157 | codes: '2666 FE0F', 158 | char: '♦️', 159 | name: 'diamond suit', 160 | category: 'activity', 161 | }, 162 | { 163 | codes: '2663 FE0F', 164 | char: '♣️', 165 | name: 'club suit', 166 | category: 'activity', 167 | }, 168 | { 169 | codes: '265F FE0F', 170 | char: '♟️', 171 | name: 'chess pawn', 172 | category: 'activity', 173 | }, 174 | { 175 | codes: '1F5BC FE0F', 176 | char: '🖼️', 177 | name: 'framed picture', 178 | category: 'activity', 179 | }, 180 | { 181 | codes: '1F9F5', 182 | char: '🧵', 183 | name: 'thread', 184 | category: 'activity', 185 | }, 186 | { 187 | codes: '1F9F6', 188 | char: '🧶', 189 | name: 'yarn', 190 | category: 'activity', 191 | }, 192 | 193 | { 194 | codes: '1F004', 195 | char: '🀄', 196 | name: 'mahjong red dragon', 197 | category: 'activity', 198 | }, 199 | { 200 | codes: '1F3B4', 201 | char: '🎴', 202 | name: 'flower playing cards', 203 | category: 'activity', 204 | }, 205 | { 206 | codes: '1F3AD', 207 | char: '🎭', 208 | name: 'performing arts', 209 | category: 'activity', 210 | }, 211 | { 212 | codes: '1F3A8', 213 | char: '🎨', 214 | name: 'artist palette', 215 | category: 'activity', 216 | }, 217 | ]; 218 | -------------------------------------------------------------------------------- /src/assets/emojis/flags.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | codes: '1F3C1', 4 | char: '🏁', 5 | name: 'chequered flag', 6 | category: 'flags', 7 | }, 8 | { 9 | codes: '1F6A9', 10 | char: '🚩', 11 | name: 'triangular flag', 12 | category: 'flags', 13 | }, 14 | { 15 | codes: '1F38C', 16 | char: '🎌', 17 | name: 'crossed flags', 18 | category: 'flags', 19 | }, 20 | { 21 | codes: '1F1E6 1F1E8', 22 | char: '🇦🇨', 23 | name: 'flag: Ascension Island', 24 | category: 'flags', 25 | }, 26 | { 27 | codes: '1F1E6 1F1E9', 28 | char: '🇦🇩', 29 | name: 'flag: Andorra', 30 | category: 'flags', 31 | }, 32 | { 33 | codes: '1F1E6 1F1EA', 34 | char: '🇦🇪', 35 | name: 'flag: United Arab Emirates', 36 | category: 'flags', 37 | }, 38 | { 39 | codes: '1F1E6 1F1EB', 40 | char: '🇦🇫', 41 | name: 'flag: Afghanistan', 42 | category: 'flags', 43 | }, 44 | { 45 | codes: '1F1E6 1F1EC', 46 | char: '🇦🇬', 47 | name: 'flag: Antigua & Barbuda', 48 | category: 'flags', 49 | }, 50 | { 51 | codes: '1F1E6 1F1EE', 52 | char: '🇦🇮', 53 | name: 'flag: Anguilla', 54 | category: 'flags', 55 | }, 56 | { 57 | codes: '1F1E6 1F1F1', 58 | char: '🇦🇱', 59 | name: 'flag: Albania', 60 | category: 'flags', 61 | }, 62 | { 63 | codes: '1F1E6 1F1F2', 64 | char: '🇦🇲', 65 | name: 'flag: Armenia', 66 | category: 'flags', 67 | }, 68 | { 69 | codes: '1F1E6 1F1F4', 70 | char: '🇦🇴', 71 | name: 'flag: Angola', 72 | category: 'flags', 73 | }, 74 | { 75 | codes: '1F1E6 1F1F6', 76 | char: '🇦🇶', 77 | name: 'flag: Antarctica', 78 | category: 'flags', 79 | }, 80 | { 81 | codes: '1F1E6 1F1F7', 82 | char: '🇦🇷', 83 | name: 'flag: Argentina', 84 | category: 'flags', 85 | }, 86 | { 87 | codes: '1F1E6 1F1F8', 88 | char: '🇦🇸', 89 | name: 'flag: American Samoa', 90 | category: 'flags', 91 | }, 92 | { 93 | codes: '1F1E6 1F1F9', 94 | char: '🇦🇹', 95 | name: 'flag: Austria', 96 | category: 'flags', 97 | }, 98 | { 99 | codes: '1F1E6 1F1FA', 100 | char: '🇦🇺', 101 | name: 'flag: Australia', 102 | category: 'flags', 103 | }, 104 | { 105 | codes: '1F1E6 1F1FC', 106 | char: '🇦🇼', 107 | name: 'flag: Aruba', 108 | category: 'flags', 109 | }, 110 | { 111 | codes: '1F1E6 1F1FD', 112 | char: '🇦🇽', 113 | name: 'flag: Åland Islands', 114 | category: 'flags', 115 | }, 116 | { 117 | codes: '1F1E6 1F1FF', 118 | char: '🇦🇿', 119 | name: 'flag: Azerbaijan', 120 | category: 'flags', 121 | }, 122 | { 123 | codes: '1F1E7 1F1E6', 124 | char: '🇧🇦', 125 | name: 'flag: Bosnia & Herzegovina', 126 | category: 'flags', 127 | }, 128 | { 129 | codes: '1F1E7 1F1E7', 130 | char: '🇧🇧', 131 | name: 'flag: Barbados', 132 | category: 'flags', 133 | }, 134 | { 135 | codes: '1F1E7 1F1E9', 136 | char: '🇧🇩', 137 | name: 'flag: Bangladesh', 138 | category: 'flags', 139 | }, 140 | { 141 | codes: '1F1E7 1F1EA', 142 | char: '🇧🇪', 143 | name: 'flag: Belgium', 144 | category: 'flags', 145 | }, 146 | { 147 | codes: '1F1E7 1F1EB', 148 | char: '🇧🇫', 149 | name: 'flag: Burkina Faso', 150 | category: 'flags', 151 | }, 152 | { 153 | codes: '1F1E7 1F1EC', 154 | char: '🇧🇬', 155 | name: 'flag: Bulgaria', 156 | category: 'flags', 157 | }, 158 | { 159 | codes: '1F1E7 1F1ED', 160 | char: '🇧🇭', 161 | name: 'flag: Bahrain', 162 | category: 'flags', 163 | }, 164 | { 165 | codes: '1F1E7 1F1EE', 166 | char: '🇧🇮', 167 | name: 'flag: Burundi', 168 | category: 'flags', 169 | }, 170 | { 171 | codes: '1F1E7 1F1EF', 172 | char: '🇧🇯', 173 | name: 'flag: Benin', 174 | category: 'flags', 175 | }, 176 | { 177 | codes: '1F1E7 1F1F1', 178 | char: '🇧🇱', 179 | name: 'flag: St. Barthélemy', 180 | category: 'flags', 181 | }, 182 | { 183 | codes: '1F1E7 1F1F2', 184 | char: '🇧🇲', 185 | name: 'flag: Bermuda', 186 | category: 'flags', 187 | }, 188 | { 189 | codes: '1F1E7 1F1F3', 190 | char: '🇧🇳', 191 | name: 'flag: Brunei', 192 | category: 'flags', 193 | }, 194 | { 195 | codes: '1F1E7 1F1F4', 196 | char: '🇧🇴', 197 | name: 'flag: Bolivia', 198 | category: 'flags', 199 | }, 200 | { 201 | codes: '1F1E7 1F1F6', 202 | char: '🇧🇶', 203 | name: 'flag: Caribbean Netherlands', 204 | category: 'flags', 205 | }, 206 | { 207 | codes: '1F1E7 1F1F7', 208 | char: '🇧🇷', 209 | name: 'flag: Brazil', 210 | category: 'flags', 211 | }, 212 | { 213 | codes: '1F1E7 1F1F8', 214 | char: '🇧🇸', 215 | name: 'flag: Bahamas', 216 | category: 'flags', 217 | }, 218 | { 219 | codes: '1F1E7 1F1F9', 220 | char: '🇧🇹', 221 | name: 'flag: Bhutan', 222 | category: 'flags', 223 | }, 224 | { 225 | codes: '1F1E7 1F1FB', 226 | char: '🇧🇻', 227 | name: 'flag: Bouvet Island', 228 | category: 'flags', 229 | }, 230 | { 231 | codes: '1F1E7 1F1FC', 232 | char: '🇧🇼', 233 | name: 'flag: Botswana', 234 | category: 'flags', 235 | }, 236 | { 237 | codes: '1F1E7 1F1FE', 238 | char: '🇧🇾', 239 | name: 'flag: Belarus', 240 | category: 'flags', 241 | }, 242 | { 243 | codes: '1F1E7 1F1FF', 244 | char: '🇧🇿', 245 | name: 'flag: Belize', 246 | category: 'flags', 247 | }, 248 | { 249 | codes: '1F1E8 1F1E6', 250 | char: '🇨🇦', 251 | name: 'flag: Canada', 252 | category: 'flags', 253 | }, 254 | { 255 | codes: '1F1E8 1F1E8', 256 | char: '🇨🇨', 257 | name: 'flag: Cocos (Keeling) Islands', 258 | category: 'flags', 259 | }, 260 | { 261 | codes: '1F1E8 1F1E9', 262 | char: '🇨🇩', 263 | name: 'flag: Congo - Kinshasa', 264 | category: 'flags', 265 | }, 266 | { 267 | codes: '1F1E8 1F1EB', 268 | char: '🇨🇫', 269 | name: 'flag: Central African Republic', 270 | category: 'flags', 271 | }, 272 | { 273 | codes: '1F1E8 1F1EC', 274 | char: '🇨🇬', 275 | name: 'flag: Congo - Brazzaville', 276 | category: 'flags', 277 | }, 278 | { 279 | codes: '1F1E8 1F1ED', 280 | char: '🇨🇭', 281 | name: 'flag: Switzerland', 282 | category: 'flags', 283 | }, 284 | { 285 | codes: '1F1E8 1F1EE', 286 | char: '🇨🇮', 287 | name: 'flag: Côte d’Ivoire', 288 | category: 'flags', 289 | }, 290 | { 291 | codes: '1F1E8 1F1F0', 292 | char: '🇨🇰', 293 | name: 'flag: Cook Islands', 294 | category: 'flags', 295 | }, 296 | { 297 | codes: '1F1E8 1F1F1', 298 | char: '🇨🇱', 299 | name: 'flag: Chile', 300 | category: 'flags', 301 | }, 302 | { 303 | codes: '1F1E8 1F1F2', 304 | char: '🇨🇲', 305 | name: 'flag: Cameroon', 306 | category: 'flags', 307 | }, 308 | { 309 | codes: '1F1E8 1F1F3', 310 | char: '🇨🇳', 311 | name: 'flag: China', 312 | category: 'flags', 313 | }, 314 | { 315 | codes: '1F1E8 1F1F4', 316 | char: '🇨🇴', 317 | name: 'flag: Colombia', 318 | category: 'flags', 319 | }, 320 | { 321 | codes: '1F1E8 1F1F5', 322 | char: '🇨🇵', 323 | name: 'flag: Clipperton Island', 324 | category: 'flags', 325 | }, 326 | { 327 | codes: '1F1E8 1F1F7', 328 | char: '🇨🇷', 329 | name: 'flag: Costa Rica', 330 | category: 'flags', 331 | }, 332 | { 333 | codes: '1F1E8 1F1FA', 334 | char: '🇨🇺', 335 | name: 'flag: Cuba', 336 | category: 'flags', 337 | }, 338 | { 339 | codes: '1F1E8 1F1FB', 340 | char: '🇨🇻', 341 | name: 'flag: Cape Verde', 342 | category: 'flags', 343 | }, 344 | { 345 | codes: '1F1E8 1F1FC', 346 | char: '🇨🇼', 347 | name: 'flag: Curaçao', 348 | category: 'flags', 349 | }, 350 | { 351 | codes: '1F1E8 1F1FD', 352 | char: '🇨🇽', 353 | name: 'flag: Christmas Island', 354 | category: 'flags', 355 | }, 356 | { 357 | codes: '1F1E8 1F1FE', 358 | char: '🇨🇾', 359 | name: 'flag: Cyprus', 360 | category: 'flags', 361 | }, 362 | { 363 | codes: '1F1E8 1F1FF', 364 | char: '🇨🇿', 365 | name: 'flag: Czechia', 366 | category: 'flags', 367 | }, 368 | { 369 | codes: '1F1E9 1F1EA', 370 | char: '🇩🇪', 371 | name: 'flag: Germany', 372 | category: 'flags', 373 | }, 374 | { 375 | codes: '1F1E9 1F1EC', 376 | char: '🇩🇬', 377 | name: 'flag: Diego Garcia', 378 | category: 'flags', 379 | }, 380 | { 381 | codes: '1F1E9 1F1EF', 382 | char: '🇩🇯', 383 | name: 'flag: Djibouti', 384 | category: 'flags', 385 | }, 386 | { 387 | codes: '1F1E9 1F1F0', 388 | char: '🇩🇰', 389 | name: 'flag: Denmark', 390 | category: 'flags', 391 | }, 392 | { 393 | codes: '1F1E9 1F1F2', 394 | char: '🇩🇲', 395 | name: 'flag: Dominica', 396 | category: 'flags', 397 | }, 398 | { 399 | codes: '1F1E9 1F1F4', 400 | char: '🇩🇴', 401 | name: 'flag: Dominican Republic', 402 | category: 'flags', 403 | }, 404 | { 405 | codes: '1F1E9 1F1FF', 406 | char: '🇩🇿', 407 | name: 'flag: Algeria', 408 | category: 'flags', 409 | }, 410 | { 411 | codes: '1F1EA 1F1E6', 412 | char: '🇪🇦', 413 | name: 'flag: Ceuta & Melilla', 414 | category: 'flags', 415 | }, 416 | { 417 | codes: '1F1EA 1F1E8', 418 | char: '🇪🇨', 419 | name: 'flag: Ecuador', 420 | category: 'flags', 421 | }, 422 | { 423 | codes: '1F1EA 1F1EA', 424 | char: '🇪🇪', 425 | name: 'flag: Estonia', 426 | category: 'flags', 427 | }, 428 | { 429 | codes: '1F1EA 1F1EC', 430 | char: '🇪🇬', 431 | name: 'flag: Egypt', 432 | category: 'flags', 433 | }, 434 | { 435 | codes: '1F1EA 1F1ED', 436 | char: '🇪🇭', 437 | name: 'flag: Western Sahara', 438 | category: 'flags', 439 | }, 440 | { 441 | codes: '1F1EA 1F1F7', 442 | char: '🇪🇷', 443 | name: 'flag: Eritrea', 444 | category: 'flags', 445 | }, 446 | { 447 | codes: '1F1EA 1F1F8', 448 | char: '🇪🇸', 449 | name: 'flag: Spain', 450 | category: 'flags', 451 | }, 452 | { 453 | codes: '1F1EA 1F1F9', 454 | char: '🇪🇹', 455 | name: 'flag: Ethiopia', 456 | category: 'flags', 457 | }, 458 | { 459 | codes: '1F1EA 1F1FA', 460 | char: '🇪🇺', 461 | name: 'flag: European Union', 462 | category: 'flags', 463 | }, 464 | { 465 | codes: '1F1EB 1F1EE', 466 | char: '🇫🇮', 467 | name: 'flag: Finland', 468 | category: 'flags', 469 | }, 470 | { 471 | codes: '1F1EB 1F1EF', 472 | char: '🇫🇯', 473 | name: 'flag: Fiji', 474 | category: 'flags', 475 | }, 476 | { 477 | codes: '1F1EB 1F1F0', 478 | char: '🇫🇰', 479 | name: 'flag: Falkland Islands', 480 | category: 'flags', 481 | }, 482 | { 483 | codes: '1F1EB 1F1F2', 484 | char: '🇫🇲', 485 | name: 'flag: Micronesia', 486 | category: 'flags', 487 | }, 488 | { 489 | codes: '1F1EB 1F1F4', 490 | char: '🇫🇴', 491 | name: 'flag: Faroe Islands', 492 | category: 'flags', 493 | }, 494 | { 495 | codes: '1F1EB 1F1F7', 496 | char: '🇫🇷', 497 | name: 'flag: France', 498 | category: 'flags', 499 | }, 500 | { 501 | codes: '1F1EC 1F1E6', 502 | char: '🇬🇦', 503 | name: 'flag: Gabon', 504 | category: 'flags', 505 | }, 506 | { 507 | codes: '1F1EC 1F1E7', 508 | char: '🇬🇧', 509 | name: 'flag: United Kingdom', 510 | category: 'flags', 511 | }, 512 | { 513 | codes: '1F1EC 1F1E9', 514 | char: '🇬🇩', 515 | name: 'flag: Grenada', 516 | category: 'flags', 517 | }, 518 | { 519 | codes: '1F1EC 1F1EA', 520 | char: '🇬🇪', 521 | name: 'flag: Georgia', 522 | category: 'flags', 523 | }, 524 | { 525 | codes: '1F1EC 1F1EB', 526 | char: '🇬🇫', 527 | name: 'flag: French Guiana', 528 | category: 'flags', 529 | }, 530 | { 531 | codes: '1F1EC 1F1EC', 532 | char: '🇬🇬', 533 | name: 'flag: Guernsey', 534 | category: 'flags', 535 | }, 536 | { 537 | codes: '1F1EC 1F1ED', 538 | char: '🇬🇭', 539 | name: 'flag: Ghana', 540 | category: 'flags', 541 | }, 542 | { 543 | codes: '1F1EC 1F1EE', 544 | char: '🇬🇮', 545 | name: 'flag: Gibraltar', 546 | category: 'flags', 547 | }, 548 | { 549 | codes: '1F1EC 1F1F1', 550 | char: '🇬🇱', 551 | name: 'flag: Greenland', 552 | category: 'flags', 553 | }, 554 | { 555 | codes: '1F1EC 1F1F2', 556 | char: '🇬🇲', 557 | name: 'flag: Gambia', 558 | category: 'flags', 559 | }, 560 | { 561 | codes: '1F1EC 1F1F3', 562 | char: '🇬🇳', 563 | name: 'flag: Guinea', 564 | category: 'flags', 565 | }, 566 | { 567 | codes: '1F1EC 1F1F5', 568 | char: '🇬🇵', 569 | name: 'flag: Guadeloupe', 570 | category: 'flags', 571 | }, 572 | { 573 | codes: '1F1EC 1F1F6', 574 | char: '🇬🇶', 575 | name: 'flag: Equatorial Guinea', 576 | category: 'flags', 577 | }, 578 | { 579 | codes: '1F1EC 1F1F7', 580 | char: '🇬🇷', 581 | name: 'flag: Greece', 582 | category: 'flags', 583 | }, 584 | { 585 | codes: '1F1EC 1F1F8', 586 | char: '🇬🇸', 587 | name: 'flag: South Georgia & South Sandwich Islands', 588 | category: 'flags', 589 | }, 590 | { 591 | codes: '1F1EC 1F1F9', 592 | char: '🇬🇹', 593 | name: 'flag: Guatemala', 594 | category: 'flags', 595 | }, 596 | { 597 | codes: '1F1EC 1F1FA', 598 | char: '🇬🇺', 599 | name: 'flag: Guam', 600 | category: 'flags', 601 | }, 602 | { 603 | codes: '1F1EC 1F1FC', 604 | char: '🇬🇼', 605 | name: 'flag: Guinea-Bissau', 606 | category: 'flags', 607 | }, 608 | { 609 | codes: '1F1EC 1F1FE', 610 | char: '🇬🇾', 611 | name: 'flag: Guyana', 612 | category: 'flags', 613 | }, 614 | { 615 | codes: '1F1ED 1F1F0', 616 | char: '🇭🇰', 617 | name: 'flag: Hong Kong SAR China', 618 | category: 'flags', 619 | }, 620 | { 621 | codes: '1F1ED 1F1F2', 622 | char: '🇭🇲', 623 | name: 'flag: Heard & McDonald Islands', 624 | category: 'flags', 625 | }, 626 | { 627 | codes: '1F1ED 1F1F3', 628 | char: '🇭🇳', 629 | name: 'flag: Honduras', 630 | category: 'flags', 631 | }, 632 | { 633 | codes: '1F1ED 1F1F7', 634 | char: '🇭🇷', 635 | name: 'flag: Croatia', 636 | category: 'flags', 637 | }, 638 | { 639 | codes: '1F1ED 1F1F9', 640 | char: '🇭🇹', 641 | name: 'flag: Haiti', 642 | category: 'flags', 643 | }, 644 | { 645 | codes: '1F1ED 1F1FA', 646 | char: '🇭🇺', 647 | name: 'flag: Hungary', 648 | category: 'flags', 649 | }, 650 | { 651 | codes: '1F1EE 1F1E8', 652 | char: '🇮🇨', 653 | name: 'flag: Canary Islands', 654 | category: 'flags', 655 | }, 656 | { 657 | codes: '1F1EE 1F1E9', 658 | char: '🇮🇩', 659 | name: 'flag: Indonesia', 660 | category: 'flags', 661 | }, 662 | { 663 | codes: '1F1EE 1F1EA', 664 | char: '🇮🇪', 665 | name: 'flag: Ireland', 666 | category: 'flags', 667 | }, 668 | { 669 | codes: '1F1EE 1F1F1', 670 | char: '🇮🇱', 671 | name: 'flag: Israel', 672 | category: 'flags', 673 | }, 674 | { 675 | codes: '1F1EE 1F1F2', 676 | char: '🇮🇲', 677 | name: 'flag: Isle of Man', 678 | category: 'flags', 679 | }, 680 | { 681 | codes: '1F1EE 1F1F3', 682 | char: '🇮🇳', 683 | name: 'flag: India', 684 | category: 'flags', 685 | }, 686 | { 687 | codes: '1F1EE 1F1F4', 688 | char: '🇮🇴', 689 | name: 'flag: British Indian Ocean Territory', 690 | category: 'flags', 691 | }, 692 | { 693 | codes: '1F1EE 1F1F6', 694 | char: '🇮🇶', 695 | name: 'flag: Iraq', 696 | category: 'flags', 697 | }, 698 | { 699 | codes: '1F1EE 1F1F7', 700 | char: '🇮🇷', 701 | name: 'flag: Iran', 702 | category: 'flags', 703 | }, 704 | { 705 | codes: '1F1EE 1F1F8', 706 | char: '🇮🇸', 707 | name: 'flag: Iceland', 708 | category: 'flags', 709 | }, 710 | { 711 | codes: '1F1EE 1F1F9', 712 | char: '🇮🇹', 713 | name: 'flag: Italy', 714 | category: 'flags', 715 | }, 716 | { 717 | codes: '1F1EF 1F1EA', 718 | char: '🇯🇪', 719 | name: 'flag: Jersey', 720 | category: 'flags', 721 | }, 722 | { 723 | codes: '1F1EF 1F1F2', 724 | char: '🇯🇲', 725 | name: 'flag: Jamaica', 726 | category: 'flags', 727 | }, 728 | { 729 | codes: '1F1EF 1F1F4', 730 | char: '🇯🇴', 731 | name: 'flag: Jordan', 732 | category: 'flags', 733 | }, 734 | { 735 | codes: '1F1EF 1F1F5', 736 | char: '🇯🇵', 737 | name: 'flag: Japan', 738 | category: 'flags', 739 | }, 740 | { 741 | codes: '1F1F0 1F1EA', 742 | char: '🇰🇪', 743 | name: 'flag: Kenya', 744 | category: 'flags', 745 | }, 746 | { 747 | codes: '1F1F0 1F1EC', 748 | char: '🇰🇬', 749 | name: 'flag: Kyrgyzstan', 750 | category: 'flags', 751 | }, 752 | { 753 | codes: '1F1F0 1F1ED', 754 | char: '🇰🇭', 755 | name: 'flag: Cambodia', 756 | category: 'flags', 757 | }, 758 | { 759 | codes: '1F1F0 1F1EE', 760 | char: '🇰🇮', 761 | name: 'flag: Kiribati', 762 | category: 'flags', 763 | }, 764 | { 765 | codes: '1F1F0 1F1F2', 766 | char: '🇰🇲', 767 | name: 'flag: Comoros', 768 | category: 'flags', 769 | }, 770 | { 771 | codes: '1F1F0 1F1F3', 772 | char: '🇰🇳', 773 | name: 'flag: St. Kitts & Nevis', 774 | category: 'flags', 775 | }, 776 | { 777 | codes: '1F1F0 1F1F5', 778 | char: '🇰🇵', 779 | name: 'flag: North Korea', 780 | category: 'flags', 781 | }, 782 | { 783 | codes: '1F1F0 1F1F7', 784 | char: '🇰🇷', 785 | name: 'flag: South Korea', 786 | category: 'flags', 787 | }, 788 | { 789 | codes: '1F1F0 1F1FC', 790 | char: '🇰🇼', 791 | name: 'flag: Kuwait', 792 | category: 'flags', 793 | }, 794 | { 795 | codes: '1F1F0 1F1FE', 796 | char: '🇰🇾', 797 | name: 'flag: Cayman Islands', 798 | category: 'flags', 799 | }, 800 | { 801 | codes: '1F1F0 1F1FF', 802 | char: '🇰🇿', 803 | name: 'flag: Kazakhstan', 804 | category: 'flags', 805 | }, 806 | { 807 | codes: '1F1F1 1F1E6', 808 | char: '🇱🇦', 809 | name: 'flag: Laos', 810 | category: 'flags', 811 | }, 812 | { 813 | codes: '1F1F1 1F1E7', 814 | char: '🇱🇧', 815 | name: 'flag: Lebanon', 816 | category: 'flags', 817 | }, 818 | { 819 | codes: '1F1F1 1F1E8', 820 | char: '🇱🇨', 821 | name: 'flag: St. Lucia', 822 | category: 'flags', 823 | }, 824 | { 825 | codes: '1F1F1 1F1EE', 826 | char: '🇱🇮', 827 | name: 'flag: Liechtenstein', 828 | category: 'flags', 829 | }, 830 | { 831 | codes: '1F1F1 1F1F0', 832 | char: '🇱🇰', 833 | name: 'flag: Sri Lanka', 834 | category: 'flags', 835 | }, 836 | { 837 | codes: '1F1F1 1F1F7', 838 | char: '🇱🇷', 839 | name: 'flag: Liberia', 840 | category: 'flags', 841 | }, 842 | { 843 | codes: '1F1F1 1F1F8', 844 | char: '🇱🇸', 845 | name: 'flag: Lesotho', 846 | category: 'flags', 847 | }, 848 | { 849 | codes: '1F1F1 1F1F9', 850 | char: '🇱🇹', 851 | name: 'flag: Lithuania', 852 | category: 'flags', 853 | }, 854 | { 855 | codes: '1F1F1 1F1FA', 856 | char: '🇱🇺', 857 | name: 'flag: Luxembourg', 858 | category: 'flags', 859 | }, 860 | { 861 | codes: '1F1F1 1F1FB', 862 | char: '🇱🇻', 863 | name: 'flag: Latvia', 864 | category: 'flags', 865 | }, 866 | { 867 | codes: '1F1F1 1F1FE', 868 | char: '🇱🇾', 869 | name: 'flag: Libya', 870 | category: 'flags', 871 | }, 872 | { 873 | codes: '1F1F2 1F1E6', 874 | char: '🇲🇦', 875 | name: 'flag: Morocco', 876 | category: 'flags', 877 | }, 878 | { 879 | codes: '1F1F2 1F1E8', 880 | char: '🇲🇨', 881 | name: 'flag: Monaco', 882 | category: 'flags', 883 | }, 884 | { 885 | codes: '1F1F2 1F1E9', 886 | char: '🇲🇩', 887 | name: 'flag: Moldova', 888 | category: 'flags', 889 | }, 890 | { 891 | codes: '1F1F2 1F1EA', 892 | char: '🇲🇪', 893 | name: 'flag: Montenegro', 894 | category: 'flags', 895 | }, 896 | { 897 | codes: '1F1F2 1F1EB', 898 | char: '🇲🇫', 899 | name: 'flag: St. Martin', 900 | category: 'flags', 901 | }, 902 | { 903 | codes: '1F1F2 1F1EC', 904 | char: '🇲🇬', 905 | name: 'flag: Madagascar', 906 | category: 'flags', 907 | }, 908 | { 909 | codes: '1F1F2 1F1ED', 910 | char: '🇲🇭', 911 | name: 'flag: Marshall Islands', 912 | category: 'flags', 913 | }, 914 | { 915 | codes: '1F1F2 1F1F0', 916 | char: '🇲🇰', 917 | name: 'flag: Macedonia', 918 | category: 'flags', 919 | }, 920 | { 921 | codes: '1F1F2 1F1F1', 922 | char: '🇲🇱', 923 | name: 'flag: Mali', 924 | category: 'flags', 925 | }, 926 | { 927 | codes: '1F1F2 1F1F2', 928 | char: '🇲🇲', 929 | name: 'flag: Myanmar (Burma)', 930 | category: 'flags', 931 | }, 932 | { 933 | codes: '1F1F2 1F1F3', 934 | char: '🇲🇳', 935 | name: 'flag: Mongolia', 936 | category: 'flags', 937 | }, 938 | { 939 | codes: '1F1F2 1F1F4', 940 | char: '🇲🇴', 941 | name: 'flag: Macao SAR China', 942 | category: 'flags', 943 | }, 944 | { 945 | codes: '1F1F2 1F1F5', 946 | char: '🇲🇵', 947 | name: 'flag: Northern Mariana Islands', 948 | category: 'flags', 949 | }, 950 | { 951 | codes: '1F1F2 1F1F6', 952 | char: '🇲🇶', 953 | name: 'flag: Martinique', 954 | category: 'flags', 955 | }, 956 | { 957 | codes: '1F1F2 1F1F7', 958 | char: '🇲🇷', 959 | name: 'flag: Mauritania', 960 | category: 'flags', 961 | }, 962 | { 963 | codes: '1F1F2 1F1F8', 964 | char: '🇲🇸', 965 | name: 'flag: Montserrat', 966 | category: 'flags', 967 | }, 968 | { 969 | codes: '1F1F2 1F1F9', 970 | char: '🇲🇹', 971 | name: 'flag: Malta', 972 | category: 'flags', 973 | }, 974 | { 975 | codes: '1F1F2 1F1FA', 976 | char: '🇲🇺', 977 | name: 'flag: Mauritius', 978 | category: 'flags', 979 | }, 980 | { 981 | codes: '1F1F2 1F1FB', 982 | char: '🇲🇻', 983 | name: 'flag: Maldives', 984 | category: 'flags', 985 | }, 986 | { 987 | codes: '1F1F2 1F1FC', 988 | char: '🇲🇼', 989 | name: 'flag: Malawi', 990 | category: 'flags', 991 | }, 992 | { 993 | codes: '1F1F2 1F1FD', 994 | char: '🇲🇽', 995 | name: 'flag: Mexico', 996 | category: 'flags', 997 | }, 998 | { 999 | codes: '1F1F2 1F1FE', 1000 | char: '🇲🇾', 1001 | name: 'flag: Malaysia', 1002 | category: 'flags', 1003 | }, 1004 | { 1005 | codes: '1F1F2 1F1FF', 1006 | char: '🇲🇿', 1007 | name: 'flag: Mozambique', 1008 | category: 'flags', 1009 | }, 1010 | { 1011 | codes: '1F1F3 1F1E6', 1012 | char: '🇳🇦', 1013 | name: 'flag: Namibia', 1014 | category: 'flags', 1015 | }, 1016 | { 1017 | codes: '1F1F3 1F1E8', 1018 | char: '🇳🇨', 1019 | name: 'flag: New Caledonia', 1020 | category: 'flags', 1021 | }, 1022 | { 1023 | codes: '1F1F3 1F1EA', 1024 | char: '🇳🇪', 1025 | name: 'flag: Niger', 1026 | category: 'flags', 1027 | }, 1028 | { 1029 | codes: '1F1F3 1F1EB', 1030 | char: '🇳🇫', 1031 | name: 'flag: Norfolk Island', 1032 | category: 'flags', 1033 | }, 1034 | { 1035 | codes: '1F1F3 1F1EC', 1036 | char: '🇳🇬', 1037 | name: 'flag: Nigeria', 1038 | category: 'flags', 1039 | }, 1040 | { 1041 | codes: '1F1F3 1F1EE', 1042 | char: '🇳🇮', 1043 | name: 'flag: Nicaragua', 1044 | category: 'flags', 1045 | }, 1046 | { 1047 | codes: '1F1F3 1F1F1', 1048 | char: '🇳🇱', 1049 | name: 'flag: Netherlands', 1050 | category: 'flags', 1051 | }, 1052 | { 1053 | codes: '1F1F3 1F1F4', 1054 | char: '🇳🇴', 1055 | name: 'flag: Norway', 1056 | category: 'flags', 1057 | }, 1058 | { 1059 | codes: '1F1F3 1F1F5', 1060 | char: '🇳🇵', 1061 | name: 'flag: Nepal', 1062 | category: 'flags', 1063 | }, 1064 | { 1065 | codes: '1F1F3 1F1F7', 1066 | char: '🇳🇷', 1067 | name: 'flag: Nauru', 1068 | category: 'flags', 1069 | }, 1070 | { 1071 | codes: '1F1F3 1F1FA', 1072 | char: '🇳🇺', 1073 | name: 'flag: Niue', 1074 | category: 'flags', 1075 | }, 1076 | { 1077 | codes: '1F1F3 1F1FF', 1078 | char: '🇳🇿', 1079 | name: 'flag: New Zealand', 1080 | category: 'flags', 1081 | }, 1082 | { 1083 | codes: '1F1F4 1F1F2', 1084 | char: '🇴🇲', 1085 | name: 'flag: Oman', 1086 | category: 'flags', 1087 | }, 1088 | { 1089 | codes: '1F1F5 1F1E6', 1090 | char: '🇵🇦', 1091 | name: 'flag: Panama', 1092 | category: 'flags', 1093 | }, 1094 | { 1095 | codes: '1F1F5 1F1EA', 1096 | char: '🇵🇪', 1097 | name: 'flag: Peru', 1098 | category: 'flags', 1099 | }, 1100 | { 1101 | codes: '1F1F5 1F1EB', 1102 | char: '🇵🇫', 1103 | name: 'flag: French Polynesia', 1104 | category: 'flags', 1105 | }, 1106 | { 1107 | codes: '1F1F5 1F1EC', 1108 | char: '🇵🇬', 1109 | name: 'flag: Papua New Guinea', 1110 | category: 'flags', 1111 | }, 1112 | { 1113 | codes: '1F1F5 1F1ED', 1114 | char: '🇵🇭', 1115 | name: 'flag: Philippines', 1116 | category: 'flags', 1117 | }, 1118 | { 1119 | codes: '1F1F5 1F1F0', 1120 | char: '🇵🇰', 1121 | name: 'flag: Pakistan', 1122 | category: 'flags', 1123 | }, 1124 | { 1125 | codes: '1F1F5 1F1F1', 1126 | char: '🇵🇱', 1127 | name: 'flag: Poland', 1128 | category: 'flags', 1129 | }, 1130 | { 1131 | codes: '1F1F5 1F1F2', 1132 | char: '🇵🇲', 1133 | name: 'flag: St. Pierre & Miquelon', 1134 | category: 'flags', 1135 | }, 1136 | { 1137 | codes: '1F1F5 1F1F3', 1138 | char: '🇵🇳', 1139 | name: 'flag: Pitcairn Islands', 1140 | category: 'flags', 1141 | }, 1142 | { 1143 | codes: '1F1F5 1F1F7', 1144 | char: '🇵🇷', 1145 | name: 'flag: Puerto Rico', 1146 | category: 'flags', 1147 | }, 1148 | { 1149 | codes: '1F1F5 1F1F8', 1150 | char: '🇵🇸', 1151 | name: 'flag: Palestinian Territories', 1152 | category: 'flags', 1153 | }, 1154 | { 1155 | codes: '1F1F5 1F1F9', 1156 | char: '🇵🇹', 1157 | name: 'flag: Portugal', 1158 | category: 'flags', 1159 | }, 1160 | { 1161 | codes: '1F1F5 1F1FC', 1162 | char: '🇵🇼', 1163 | name: 'flag: Palau', 1164 | category: 'flags', 1165 | }, 1166 | { 1167 | codes: '1F1F5 1F1FE', 1168 | char: '🇵🇾', 1169 | name: 'flag: Paraguay', 1170 | category: 'flags', 1171 | }, 1172 | { 1173 | codes: '1F1F6 1F1E6', 1174 | char: '🇶🇦', 1175 | name: 'flag: Qatar', 1176 | category: 'flags', 1177 | }, 1178 | { 1179 | codes: '1F1F7 1F1EA', 1180 | char: '🇷🇪', 1181 | name: 'flag: Réunion', 1182 | category: 'flags', 1183 | }, 1184 | { 1185 | codes: '1F1F7 1F1F4', 1186 | char: '🇷🇴', 1187 | name: 'flag: Romania', 1188 | category: 'flags', 1189 | }, 1190 | { 1191 | codes: '1F1F7 1F1F8', 1192 | char: '🇷🇸', 1193 | name: 'flag: Serbia', 1194 | category: 'flags', 1195 | }, 1196 | { 1197 | codes: '1F1F7 1F1FA', 1198 | char: '🇷🇺', 1199 | name: 'flag: Russia', 1200 | category: 'flags', 1201 | }, 1202 | { 1203 | codes: '1F1F7 1F1FC', 1204 | char: '🇷🇼', 1205 | name: 'flag: Rwanda', 1206 | category: 'flags', 1207 | }, 1208 | { 1209 | codes: '1F1F8 1F1E6', 1210 | char: '🇸🇦', 1211 | name: 'flag: Saudi Arabia', 1212 | category: 'flags', 1213 | }, 1214 | { 1215 | codes: '1F1F8 1F1E7', 1216 | char: '🇸🇧', 1217 | name: 'flag: Solomon Islands', 1218 | category: 'flags', 1219 | }, 1220 | { 1221 | codes: '1F1F8 1F1E8', 1222 | char: '🇸🇨', 1223 | name: 'flag: Seychelles', 1224 | category: 'flags', 1225 | }, 1226 | { 1227 | codes: '1F1F8 1F1E9', 1228 | char: '🇸🇩', 1229 | name: 'flag: Sudan', 1230 | category: 'flags', 1231 | }, 1232 | { 1233 | codes: '1F1F8 1F1EA', 1234 | char: '🇸🇪', 1235 | name: 'flag: Sweden', 1236 | category: 'flags', 1237 | }, 1238 | { 1239 | codes: '1F1F8 1F1EC', 1240 | char: '🇸🇬', 1241 | name: 'flag: Singapore', 1242 | category: 'flags', 1243 | }, 1244 | { 1245 | codes: '1F1F8 1F1ED', 1246 | char: '🇸🇭', 1247 | name: 'flag: St. Helena', 1248 | category: 'flags', 1249 | }, 1250 | { 1251 | codes: '1F1F8 1F1EE', 1252 | char: '🇸🇮', 1253 | name: 'flag: Slovenia', 1254 | category: 'flags', 1255 | }, 1256 | { 1257 | codes: '1F1F8 1F1EF', 1258 | char: '🇸🇯', 1259 | name: 'flag: Svalbard & Jan Mayen', 1260 | category: 'flags', 1261 | }, 1262 | { 1263 | codes: '1F1F8 1F1F0', 1264 | char: '🇸🇰', 1265 | name: 'flag: Slovakia', 1266 | category: 'flags', 1267 | }, 1268 | { 1269 | codes: '1F1F8 1F1F1', 1270 | char: '🇸🇱', 1271 | name: 'flag: Sierra Leone', 1272 | category: 'flags', 1273 | }, 1274 | { 1275 | codes: '1F1F8 1F1F2', 1276 | char: '🇸🇲', 1277 | name: 'flag: San Marino', 1278 | category: 'flags', 1279 | }, 1280 | { 1281 | codes: '1F1F8 1F1F3', 1282 | char: '🇸🇳', 1283 | name: 'flag: Senegal', 1284 | category: 'flags', 1285 | }, 1286 | { 1287 | codes: '1F1F8 1F1F4', 1288 | char: '🇸🇴', 1289 | name: 'flag: Somalia', 1290 | category: 'flags', 1291 | }, 1292 | { 1293 | codes: '1F1F8 1F1F7', 1294 | char: '🇸🇷', 1295 | name: 'flag: Suriname', 1296 | category: 'flags', 1297 | }, 1298 | { 1299 | codes: '1F1F8 1F1F8', 1300 | char: '🇸🇸', 1301 | name: 'flag: South Sudan', 1302 | category: 'flags', 1303 | }, 1304 | { 1305 | codes: '1F1F8 1F1F9', 1306 | char: '🇸🇹', 1307 | name: 'flag: São Tomé & Príncipe', 1308 | category: 'flags', 1309 | }, 1310 | { 1311 | codes: '1F1F8 1F1FB', 1312 | char: '🇸🇻', 1313 | name: 'flag: El Salvador', 1314 | category: 'flags', 1315 | }, 1316 | { 1317 | codes: '1F1F8 1F1FD', 1318 | char: '🇸🇽', 1319 | name: 'flag: Sint Maarten', 1320 | category: 'flags', 1321 | }, 1322 | { 1323 | codes: '1F1F8 1F1FE', 1324 | char: '🇸🇾', 1325 | name: 'flag: Syria', 1326 | category: 'flags', 1327 | }, 1328 | { 1329 | codes: '1F1F8 1F1FF', 1330 | char: '🇸🇿', 1331 | name: 'flag: Eswatini', 1332 | category: 'flags', 1333 | }, 1334 | { 1335 | codes: '1F1F9 1F1E6', 1336 | char: '🇹🇦', 1337 | name: 'flag: Tristan da Cunha', 1338 | category: 'flags', 1339 | }, 1340 | { 1341 | codes: '1F1F9 1F1E8', 1342 | char: '🇹🇨', 1343 | name: 'flag: Turks & Caicos Islands', 1344 | category: 'flags', 1345 | }, 1346 | { 1347 | codes: '1F1F9 1F1E9', 1348 | char: '🇹🇩', 1349 | name: 'flag: Chad', 1350 | category: 'flags', 1351 | }, 1352 | { 1353 | codes: '1F1F9 1F1EB', 1354 | char: '🇹🇫', 1355 | name: 'flag: French Southern Territories', 1356 | category: 'flags', 1357 | }, 1358 | { 1359 | codes: '1F1F9 1F1EC', 1360 | char: '🇹🇬', 1361 | name: 'flag: Togo', 1362 | category: 'flags', 1363 | }, 1364 | { 1365 | codes: '1F1F9 1F1ED', 1366 | char: '🇹🇭', 1367 | name: 'flag: Thailand', 1368 | category: 'flags', 1369 | }, 1370 | { 1371 | codes: '1F1F9 1F1EF', 1372 | char: '🇹🇯', 1373 | name: 'flag: Tajikistan', 1374 | category: 'flags', 1375 | }, 1376 | { 1377 | codes: '1F1F9 1F1F0', 1378 | char: '🇹🇰', 1379 | name: 'flag: Tokelau', 1380 | category: 'flags', 1381 | }, 1382 | { 1383 | codes: '1F1F9 1F1F1', 1384 | char: '🇹🇱', 1385 | name: 'flag: Timor-Leste', 1386 | category: 'flags', 1387 | }, 1388 | { 1389 | codes: '1F1F9 1F1F2', 1390 | char: '🇹🇲', 1391 | name: 'flag: Turkmenistan', 1392 | category: 'flags', 1393 | }, 1394 | { 1395 | codes: '1F1F9 1F1F3', 1396 | char: '🇹🇳', 1397 | name: 'flag: Tunisia', 1398 | category: 'flags', 1399 | }, 1400 | { 1401 | codes: '1F1F9 1F1F4', 1402 | char: '🇹🇴', 1403 | name: 'flag: Tonga', 1404 | category: 'flags', 1405 | }, 1406 | { 1407 | codes: '1F1F9 1F1F7', 1408 | char: '🇹🇷', 1409 | name: 'flag: Turkey', 1410 | category: 'flags', 1411 | }, 1412 | { 1413 | codes: '1F1F9 1F1F9', 1414 | char: '🇹🇹', 1415 | name: 'flag: Trinidad & Tobago', 1416 | category: 'flags', 1417 | }, 1418 | { 1419 | codes: '1F1F9 1F1FB', 1420 | char: '🇹🇻', 1421 | name: 'flag: Tuvalu', 1422 | category: 'flags', 1423 | }, 1424 | { 1425 | codes: '1F1F9 1F1FC', 1426 | char: '🇹🇼', 1427 | name: 'flag: Taiwan', 1428 | category: 'flags', 1429 | }, 1430 | { 1431 | codes: '1F1F9 1F1FF', 1432 | char: '🇹🇿', 1433 | name: 'flag: Tanzania', 1434 | category: 'flags', 1435 | }, 1436 | { 1437 | codes: '1F1FA 1F1E6', 1438 | char: '🇺🇦', 1439 | name: 'flag: Ukraine', 1440 | category: 'flags', 1441 | }, 1442 | { 1443 | codes: '1F1FA 1F1EC', 1444 | char: '🇺🇬', 1445 | name: 'flag: Uganda', 1446 | category: 'flags', 1447 | }, 1448 | { 1449 | codes: '1F1FA 1F1F2', 1450 | char: '🇺🇲', 1451 | name: 'flag: U.S. Outlying Islands', 1452 | category: 'flags', 1453 | }, 1454 | { 1455 | codes: '1F1FA 1F1F3', 1456 | char: '🇺🇳', 1457 | name: 'flag: United Nations', 1458 | category: 'flags', 1459 | }, 1460 | { 1461 | codes: '1F1FA 1F1F8', 1462 | char: '🇺🇸', 1463 | name: 'flag: United States', 1464 | category: 'flags', 1465 | }, 1466 | { 1467 | codes: '1F1FA 1F1FE', 1468 | char: '🇺🇾', 1469 | name: 'flag: Uruguay', 1470 | category: 'flags', 1471 | }, 1472 | { 1473 | codes: '1F1FA 1F1FF', 1474 | char: '🇺🇿', 1475 | name: 'flag: Uzbekistan', 1476 | category: 'flags', 1477 | }, 1478 | { 1479 | codes: '1F1FB 1F1E6', 1480 | char: '🇻🇦', 1481 | name: 'flag: Vatican City', 1482 | category: 'flags', 1483 | }, 1484 | { 1485 | codes: '1F1FB 1F1E8', 1486 | char: '🇻🇨', 1487 | name: 'flag: St. Vincent & Grenadines', 1488 | category: 'flags', 1489 | }, 1490 | { 1491 | codes: '1F1FB 1F1EA', 1492 | char: '🇻🇪', 1493 | name: 'flag: Venezuela', 1494 | category: 'flags', 1495 | }, 1496 | { 1497 | codes: '1F1FB 1F1EC', 1498 | char: '🇻🇬', 1499 | name: 'flag: British Virgin Islands', 1500 | category: 'flags', 1501 | }, 1502 | { 1503 | codes: '1F1FB 1F1EE', 1504 | char: '🇻🇮', 1505 | name: 'flag: U.S. Virgin Islands', 1506 | category: 'flags', 1507 | }, 1508 | { 1509 | codes: '1F1FB 1F1F3', 1510 | char: '🇻🇳', 1511 | name: 'flag: Vietnam', 1512 | category: 'flags', 1513 | }, 1514 | { 1515 | codes: '1F1FB 1F1FA', 1516 | char: '🇻🇺', 1517 | name: 'flag: Vanuatu', 1518 | category: 'flags', 1519 | }, 1520 | { 1521 | codes: '1F1FC 1F1EB', 1522 | char: '🇼🇫', 1523 | name: 'flag: Wallis & Futuna', 1524 | category: 'flags', 1525 | }, 1526 | { 1527 | codes: '1F1FC 1F1F8', 1528 | char: '🇼🇸', 1529 | name: 'flag: Samoa', 1530 | category: 'flags', 1531 | }, 1532 | { 1533 | codes: '1F1FD 1F1F0', 1534 | char: '🇽🇰', 1535 | name: 'flag: Kosovo', 1536 | category: 'flags', 1537 | }, 1538 | { 1539 | codes: '1F1FE 1F1EA', 1540 | char: '🇾🇪', 1541 | name: 'flag: Yemen', 1542 | category: 'flags', 1543 | }, 1544 | { 1545 | codes: '1F1FE 1F1F9', 1546 | char: '🇾🇹', 1547 | name: 'flag: Mayotte', 1548 | category: 'flags', 1549 | }, 1550 | { 1551 | codes: '1F1FF 1F1E6', 1552 | char: '🇿🇦', 1553 | name: 'flag: South Africa', 1554 | category: 'flags', 1555 | }, 1556 | { 1557 | codes: '1F1FF 1F1F2', 1558 | char: '🇿🇲', 1559 | name: 'flag: Zambia', 1560 | category: 'flags', 1561 | }, 1562 | { 1563 | codes: '1F1FF 1F1FC', 1564 | char: '🇿🇼', 1565 | name: 'flag: Zimbabwe', 1566 | category: 'flags', 1567 | }, 1568 | ]; 1569 | -------------------------------------------------------------------------------- /src/assets/emojis/foodAndDrink.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | codes: '1F347', 4 | char: '🍇', 5 | name: 'grapes', 6 | category: 'foodAndDrink', 7 | }, 8 | { 9 | codes: '1F348', 10 | char: '🍈', 11 | name: 'melon', 12 | category: 'foodAndDrink', 13 | }, 14 | { 15 | codes: '1F349', 16 | char: '🍉', 17 | name: 'watermelon', 18 | category: 'foodAndDrink', 19 | }, 20 | { 21 | codes: '1F34A', 22 | char: '🍊', 23 | name: 'tangerine', 24 | category: 'foodAndDrink', 25 | }, 26 | { 27 | codes: '1F34B', 28 | char: '🍋', 29 | name: 'lemon', 30 | category: 'foodAndDrink', 31 | }, 32 | { 33 | codes: '1F34C', 34 | char: '🍌', 35 | name: 'banana', 36 | category: 'foodAndDrink', 37 | }, 38 | { 39 | codes: '1F34D', 40 | char: '🍍', 41 | name: 'pineapple', 42 | category: 'foodAndDrink', 43 | }, 44 | { 45 | codes: '1F34E', 46 | char: '🍎', 47 | name: 'red apple', 48 | category: 'foodAndDrink', 49 | }, 50 | { 51 | codes: '1F34F', 52 | char: '🍏', 53 | name: 'green apple', 54 | category: 'foodAndDrink', 55 | }, 56 | { 57 | codes: '1F350', 58 | char: '🍐', 59 | name: 'pear', 60 | category: 'foodAndDrink', 61 | }, 62 | { 63 | codes: '1F351', 64 | char: '🍑', 65 | name: 'peach', 66 | category: 'foodAndDrink', 67 | }, 68 | { 69 | codes: '1F352', 70 | char: '🍒', 71 | name: 'cherries', 72 | category: 'foodAndDrink', 73 | }, 74 | { 75 | codes: '1F353', 76 | char: '🍓', 77 | name: 'strawberry', 78 | category: 'foodAndDrink', 79 | }, 80 | { 81 | codes: '1F345', 82 | char: '🍅', 83 | name: 'tomato', 84 | category: 'foodAndDrink', 85 | }, 86 | { 87 | codes: '1F346', 88 | char: '🍆', 89 | name: 'eggplant', 90 | category: 'foodAndDrink', 91 | }, 92 | { 93 | codes: '1F33D', 94 | char: '🌽', 95 | name: 'ear of corn', 96 | category: 'foodAndDrink', 97 | }, 98 | { 99 | codes: '1F965', 100 | char: '🥥', 101 | name: 'coconut', 102 | category: 'foodAndDrink', 103 | }, 104 | { 105 | codes: '1F951', 106 | char: '🥑', 107 | name: 'avocado', 108 | category: 'foodAndDrink', 109 | }, 110 | { 111 | codes: '1F954', 112 | char: '🥔', 113 | name: 'potato', 114 | category: 'foodAndDrink', 115 | }, 116 | { 117 | codes: '1F955', 118 | char: '🥕', 119 | name: 'carrot', 120 | category: 'foodAndDrink', 121 | }, 122 | { 123 | codes: '1F336 FE0F', 124 | char: '🌶️', 125 | name: 'hot pepper', 126 | category: 'foodAndDrink', 127 | }, 128 | { 129 | codes: '1F952', 130 | char: '🥒', 131 | name: 'cucumber', 132 | category: 'foodAndDrink', 133 | }, 134 | { 135 | codes: '1F96C', 136 | char: '🥬', 137 | name: 'leafy green', 138 | category: 'foodAndDrink', 139 | }, 140 | { 141 | codes: '1F966', 142 | char: '🥦', 143 | name: 'broccoli', 144 | category: 'foodAndDrink', 145 | }, 146 | { 147 | codes: '1F9C4', 148 | char: '🧄', 149 | name: 'garlic', 150 | category: 'foodAndDrink', 151 | }, 152 | { 153 | codes: '1F9C5', 154 | char: '🧅', 155 | name: 'onion', 156 | category: 'foodAndDrink', 157 | }, 158 | { 159 | codes: '1F344', 160 | char: '🍄', 161 | name: 'mushroom', 162 | category: 'foodAndDrink', 163 | }, 164 | { 165 | codes: '1F330', 166 | char: '🌰', 167 | name: 'chestnut', 168 | category: 'foodAndDrink', 169 | }, 170 | { 171 | codes: '1F35E', 172 | char: '🍞', 173 | name: 'bread', 174 | category: 'foodAndDrink', 175 | }, 176 | { 177 | codes: '1F356', 178 | char: '🍖', 179 | name: 'meat on bone', 180 | category: 'foodAndDrink', 181 | }, 182 | { 183 | codes: '1F357', 184 | char: '🍗', 185 | name: 'poultry leg', 186 | category: 'foodAndDrink', 187 | }, 188 | { 189 | codes: '1F354', 190 | char: '🍔', 191 | name: 'hamburger', 192 | category: 'foodAndDrink', 193 | }, 194 | { 195 | codes: '1F35F', 196 | char: '🍟', 197 | name: 'french fries', 198 | category: 'foodAndDrink', 199 | }, 200 | { 201 | codes: '1F355', 202 | char: '🍕', 203 | name: 'pizza', 204 | category: 'foodAndDrink', 205 | }, 206 | { 207 | codes: '1F373', 208 | char: '🍳', 209 | name: 'cooking', 210 | category: 'foodAndDrink', 211 | }, 212 | { 213 | codes: '1F958', 214 | char: '🥘', 215 | name: 'shallow pan of food', 216 | category: 'foodAndDrink', 217 | }, 218 | { 219 | codes: '1F372', 220 | char: '🍲', 221 | name: 'pot of food', 222 | category: 'foodAndDrink', 223 | }, 224 | { 225 | codes: '1F371', 226 | char: '🍱', 227 | name: 'bento box', 228 | category: 'foodAndDrink', 229 | }, 230 | { 231 | codes: '1F358', 232 | char: '🍘', 233 | name: 'rice cracker', 234 | category: 'foodAndDrink', 235 | }, 236 | { 237 | codes: '1F359', 238 | char: '🍙', 239 | name: 'rice ball', 240 | category: 'foodAndDrink', 241 | }, 242 | { 243 | codes: '1F35A', 244 | char: '🍚', 245 | name: 'cooked rice', 246 | category: 'foodAndDrink', 247 | }, 248 | { 249 | codes: '1F35B', 250 | char: '🍛', 251 | name: 'curry rice', 252 | category: 'foodAndDrink', 253 | }, 254 | { 255 | codes: '1F35C', 256 | char: '🍜', 257 | name: 'steaming bowl', 258 | category: 'foodAndDrink', 259 | }, 260 | { 261 | codes: '1F35D', 262 | char: '🍝', 263 | name: 'spaghetti', 264 | category: 'foodAndDrink', 265 | }, 266 | { 267 | codes: '1F360', 268 | char: '🍠', 269 | name: 'roasted sweet potato', 270 | category: 'foodAndDrink', 271 | }, 272 | { 273 | codes: '1F362', 274 | char: '🍢', 275 | name: 'oden', 276 | category: 'foodAndDrink', 277 | }, 278 | { 279 | codes: '1F363', 280 | char: '🍣', 281 | name: 'sushi', 282 | category: 'foodAndDrink', 283 | }, 284 | { 285 | codes: '1F364', 286 | char: '🍤', 287 | name: 'fried shrimp', 288 | category: 'foodAndDrink', 289 | }, 290 | { 291 | codes: '1F365', 292 | char: '🍥', 293 | name: 'fish cake with swirl', 294 | category: 'foodAndDrink', 295 | }, 296 | { 297 | codes: '1F980', 298 | char: '🦀', 299 | name: 'crab', 300 | category: 'foodAndDrink', 301 | }, 302 | { 303 | codes: '1F99E', 304 | char: '🦞', 305 | name: 'lobster', 306 | category: 'foodAndDrink', 307 | }, 308 | { 309 | codes: '1F990', 310 | char: '🦐', 311 | name: 'shrimp', 312 | category: 'foodAndDrink', 313 | }, 314 | { 315 | codes: '1F991', 316 | char: '🦑', 317 | name: 'squid', 318 | category: 'foodAndDrink', 319 | }, 320 | { 321 | codes: '1F9AA', 322 | char: '🦪', 323 | name: 'oyster', 324 | category: 'foodAndDrink', 325 | }, 326 | { 327 | codes: '1F361', 328 | char: '🍡', 329 | name: 'dango', 330 | category: 'foodAndDrink', 331 | }, 332 | { 333 | codes: '1F366', 334 | char: '🍦', 335 | name: 'soft ice cream', 336 | category: 'foodAndDrink', 337 | }, 338 | { 339 | codes: '1F367', 340 | char: '🍧', 341 | name: 'shaved ice', 342 | category: 'foodAndDrink', 343 | }, 344 | { 345 | codes: '1F368', 346 | char: '🍨', 347 | name: 'ice cream', 348 | category: 'foodAndDrink', 349 | }, 350 | { 351 | codes: '1F9C1', 352 | char: '🧁', 353 | name: 'cupcake', 354 | category: 'foodAndDrink', 355 | }, 356 | { codes: '1F967', char: '🥧', name: 'pie', category: 'foodAndDrink' }, 357 | { 358 | codes: '1F369', 359 | char: '🍩', 360 | name: 'doughnut', 361 | category: 'foodAndDrink', 362 | }, 363 | { 364 | codes: '1F36A', 365 | char: '🍪', 366 | name: 'cookie', 367 | category: 'foodAndDrink', 368 | }, 369 | { 370 | codes: '1F382', 371 | char: '🎂', 372 | name: 'birthday cake', 373 | category: 'foodAndDrink', 374 | }, 375 | { 376 | codes: '1F370', 377 | char: '🍰', 378 | name: 'shortcake', 379 | category: 'foodAndDrink', 380 | }, 381 | { 382 | codes: '1F36B', 383 | char: '🍫', 384 | name: 'chocolate bar', 385 | category: 'foodAndDrink', 386 | }, 387 | { 388 | codes: '1F36C', 389 | char: '🍬', 390 | name: 'candy', 391 | category: 'foodAndDrink', 392 | }, 393 | { 394 | codes: '1F36D', 395 | char: '🍭', 396 | name: 'lollipop', 397 | category: 'foodAndDrink', 398 | }, 399 | { 400 | codes: '1F36E', 401 | char: '🍮', 402 | name: 'custard', 403 | category: 'foodAndDrink', 404 | }, 405 | { 406 | codes: '1F36F', 407 | char: '🍯', 408 | name: 'honey pot', 409 | category: 'foodAndDrink', 410 | }, 411 | { 412 | codes: '1F37C', 413 | char: '🍼', 414 | name: 'baby bottle', 415 | category: 'foodAndDrink', 416 | }, 417 | { 418 | codes: '2615', 419 | char: '☕', 420 | name: 'hot beverage', 421 | category: 'foodAndDrink', 422 | }, 423 | { 424 | codes: '1F375', 425 | char: '🍵', 426 | name: 'teacup without handle', 427 | category: 'foodAndDrink', 428 | }, 429 | { 430 | codes: '1F376', 431 | char: '🍶', 432 | name: 'sake', 433 | category: 'foodAndDrink', 434 | }, 435 | { 436 | codes: '1F377', 437 | char: '🍷', 438 | name: 'wine glass', 439 | category: 'foodAndDrink', 440 | }, 441 | { 442 | codes: '1F378', 443 | char: '🍸', 444 | name: 'cocktail glass', 445 | category: 'foodAndDrink', 446 | }, 447 | { 448 | codes: '1F379', 449 | char: '🍹', 450 | name: 'tropical drink', 451 | category: 'foodAndDrink', 452 | }, 453 | { 454 | codes: '1F37A', 455 | char: '🍺', 456 | name: 'beer mug', 457 | category: 'foodAndDrink', 458 | }, 459 | { 460 | codes: '1F37B', 461 | char: '🍻', 462 | name: 'clinking beer mugs', 463 | category: 'foodAndDrink', 464 | }, 465 | { 466 | codes: '1F95B', 467 | char: '🥛', 468 | name: 'glass of milk', 469 | category: 'foodAndDrink', 470 | }, 471 | { 472 | codes: '1F37E', 473 | char: '🍾', 474 | name: 'bottle with popping cork', 475 | category: 'foodAndDrink', 476 | }, 477 | { 478 | codes: '1F942', 479 | char: '🥂', 480 | name: 'clinking glasses', 481 | category: 'foodAndDrink', 482 | }, 483 | { 484 | codes: '1F943', 485 | char: '🥃', 486 | name: 'tumbler glass', 487 | category: 'foodAndDrink', 488 | }, 489 | { 490 | codes: '1F964', 491 | char: '🥤', 492 | name: 'cup with straw', 493 | category: 'foodAndDrink', 494 | }, 495 | { 496 | codes: '1F9C3', 497 | char: '🧃', 498 | name: 'beverage box', 499 | category: 'foodAndDrink', 500 | }, 501 | { 502 | codes: '1F9C9', 503 | char: '🧉', 504 | name: 'mate', 505 | category: 'foodAndDrink', 506 | }, 507 | { 508 | codes: '1F9CA', 509 | char: '🧊', 510 | name: 'ice cube', 511 | category: 'foodAndDrink', 512 | }, 513 | { 514 | codes: '1F962', 515 | char: '🥢', 516 | name: 'chopsticks', 517 | category: 'foodAndDrink', 518 | }, 519 | { 520 | codes: '1F37D FE0F', 521 | char: '🍽️', 522 | name: 'fork and knife with plate', 523 | category: 'foodAndDrink', 524 | }, 525 | { 526 | codes: '1F944', 527 | char: '🥄', 528 | name: 'spoon', 529 | category: 'foodAndDrink', 530 | }, 531 | { 532 | codes: '1F374', 533 | char: '🍴', 534 | name: 'fork and knife', 535 | category: 'foodAndDrink', 536 | }, 537 | { 538 | codes: '1F52A', 539 | char: '🔪', 540 | name: 'kitchen knife', 541 | category: 'foodAndDrink', 542 | }, 543 | ]; 544 | -------------------------------------------------------------------------------- /src/assets/emojis/index.js: -------------------------------------------------------------------------------- 1 | import skintone from './skintone.js'; 2 | import people from './people.js'; 3 | import nature from './nature.js'; 4 | import foodAndDrink from './foodAndDrink.js'; 5 | import activity from './activity.js'; 6 | import places from './places.js'; 7 | import objects from './objects.js'; 8 | import symbols from './symbols.js'; 9 | import flags from './flags.js'; 10 | 11 | const emojis = [ 12 | skintone, 13 | people, 14 | nature, 15 | foodAndDrink, 16 | activity, 17 | places, 18 | objects, 19 | symbols, 20 | flags, 21 | ]; 22 | 23 | export default emojis; 24 | -------------------------------------------------------------------------------- /src/assets/emojis/nature.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | codes: '1F435', 4 | char: '🐵', 5 | name: 'monkey face', 6 | category: 'nature', 7 | }, 8 | { codes: '1F412', char: '🐒', name: 'monkey', category: 'nature' }, 9 | { codes: '1F436', char: '🐶', name: 'dog face', category: 'nature' }, 10 | { codes: '1F415', char: '🐕', name: 'dog', category: 'nature' }, 11 | { codes: '1F429', char: '🐩', name: 'poodle', category: 'nature' }, 12 | { codes: '1F43A', char: '🐺', name: 'wolf', category: 'nature' }, 13 | { codes: '1F431', char: '🐱', name: 'cat face', category: 'nature' }, 14 | { codes: '1F408', char: '🐈', name: 'cat', category: 'nature' }, 15 | { 16 | codes: '1F42F', 17 | char: '🐯', 18 | name: 'tiger face', 19 | category: 'nature', 20 | }, 21 | { codes: '1F405', char: '🐅', name: 'tiger', category: 'nature' }, 22 | { codes: '1F406', char: '🐆', name: 'leopard', category: 'nature' }, 23 | { 24 | codes: '1F434', 25 | char: '🐴', 26 | name: 'horse face', 27 | category: 'nature', 28 | }, 29 | { codes: '1F40E', char: '🐎', name: 'horse', category: 'nature' }, 30 | { codes: '1F42E', char: '🐮', name: 'cow face', category: 'nature' }, 31 | { codes: '1F402', char: '🐂', name: 'ox', category: 'nature' }, 32 | { 33 | codes: '1F403', 34 | char: '🐃', 35 | name: 'water buffalo', 36 | category: 'nature', 37 | }, 38 | { codes: '1F404', char: '🐄', name: 'cow', category: 'nature' }, 39 | { codes: '1F437', char: '🐷', name: 'pig face', category: 'nature' }, 40 | { codes: '1F416', char: '🐖', name: 'pig', category: 'nature' }, 41 | { codes: '1F417', char: '🐗', name: 'boar', category: 'nature' }, 42 | { codes: '1F43D', char: '🐽', name: 'pig nose', category: 'nature' }, 43 | { codes: '1F40F', char: '🐏', name: 'ram', category: 'nature' }, 44 | { codes: '1F411', char: '🐑', name: 'ewe', category: 'nature' }, 45 | { codes: '1F410', char: '🐐', name: 'goat', category: 'nature' }, 46 | { codes: '1F42A', char: '🐪', name: 'camel', category: 'nature' }, 47 | { codes: '1F418', char: '🐘', name: 'elephant', category: 'nature' }, 48 | { 49 | codes: '1F42D', 50 | char: '🐭', 51 | name: 'mouse face', 52 | category: 'nature', 53 | }, 54 | { codes: '1F401', char: '🐁', name: 'mouse', category: 'nature' }, 55 | { codes: '1F439', char: '🐹', name: 'hamster', category: 'nature' }, 56 | { 57 | codes: '1F430', 58 | char: '🐰', 59 | name: 'rabbit face', 60 | category: 'nature', 61 | }, 62 | { codes: '1F407', char: '🐇', name: 'rabbit', category: 'nature' }, 63 | { codes: '1F43B', char: '🐻', name: 'bear', category: 'nature' }, 64 | { codes: '1F428', char: '🐨', name: 'koala', category: 'nature' }, 65 | { codes: '1F43C', char: '🐼', name: 'panda', category: 'nature' }, 66 | { 67 | codes: '1F43E', 68 | char: '🐾', 69 | name: 'paw prints', 70 | category: 'nature', 71 | }, 72 | { codes: '1F414', char: '🐔', name: 'chicken', category: 'nature' }, 73 | { codes: '1F413', char: '🐓', name: 'rooster', category: 'nature' }, 74 | { 75 | codes: '1F423', 76 | char: '🐣', 77 | name: 'hatching chick', 78 | category: 'nature', 79 | }, 80 | { 81 | codes: '1F424', 82 | char: '🐤', 83 | name: 'baby chick', 84 | category: 'nature', 85 | }, 86 | { 87 | codes: '1F425', 88 | char: '🐥', 89 | name: 'front-facing baby chick', 90 | category: 'nature', 91 | }, 92 | { codes: '1F426', char: '🐦', name: 'bird', category: 'nature' }, 93 | { codes: '1F427', char: '🐧', name: 'penguin', category: 'nature' }, 94 | { codes: '1F438', char: '🐸', name: 'frog', category: 'nature' }, 95 | { codes: '1F40A', char: '🐊', name: 'crocodile', category: 'nature' }, 96 | { codes: '1F422', char: '🐢', name: 'turtle', category: 'nature' }, 97 | { codes: '1F40D', char: '🐍', name: 'snake', category: 'nature' }, 98 | { 99 | codes: '1F432', 100 | char: '🐲', 101 | name: 'dragon face', 102 | category: 'nature', 103 | }, 104 | { codes: '1F409', char: '🐉', name: 'dragon', category: 'nature' }, 105 | { 106 | codes: '1F433', 107 | char: '🐳', 108 | name: 'spouting whale', 109 | category: 'nature', 110 | }, 111 | { codes: '1F40B', char: '🐋', name: 'whale', category: 'nature' }, 112 | { codes: '1F42C', char: '🐬', name: 'dolphin', category: 'nature' }, 113 | { codes: '1F41F', char: '🐟', name: 'fish', category: 'nature' }, 114 | { 115 | codes: '1F420', 116 | char: '🐠', 117 | name: 'tropical fish', 118 | category: 'nature', 119 | }, 120 | { codes: '1F421', char: '🐡', name: 'blowfish', category: 'nature' }, 121 | { codes: '1F988', char: '🦈', name: 'shark', category: 'nature' }, 122 | { codes: '1F419', char: '🐙', name: 'octopus', category: 'nature' }, 123 | { codes: '1F40C', char: '🐌', name: 'snail', category: 'nature' }, 124 | { codes: '1F98B', char: '🦋', name: 'butterfly', category: 'nature' }, 125 | { codes: '1F41B', char: '🐛', name: 'bug', category: 'nature' }, 126 | { codes: '1F41C', char: '🐜', name: 'ant', category: 'nature' }, 127 | { codes: '1F41D', char: '🐝', name: 'honeybee', category: 'nature' }, 128 | { 129 | codes: '1F41E', 130 | char: '🐞', 131 | name: 'lady beetle', 132 | category: 'nature', 133 | }, 134 | 135 | { codes: '1F490', char: '💐', name: 'bouquet', category: 'nature' }, 136 | { 137 | codes: '1F338', 138 | char: '🌸', 139 | name: 'cherry blossom', 140 | category: 'nature', 141 | }, 142 | { 143 | codes: '1F4AE', 144 | char: '💮', 145 | name: 'white flower', 146 | category: 'nature', 147 | }, 148 | { codes: '1F339', char: '🌹', name: 'rose', category: 'nature' }, 149 | { codes: '1F33A', char: '🌺', name: 'hibiscus', category: 'nature' }, 150 | { codes: '1F33B', char: '🌻', name: 'sunflower', category: 'nature' }, 151 | { codes: '1F33C', char: '🌼', name: 'blossom', category: 'nature' }, 152 | { codes: '1F337', char: '🌷', name: 'tulip', category: 'nature' }, 153 | { codes: '1F331', char: '🌱', name: 'seedling', category: 'nature' }, 154 | { 155 | codes: '1F332', 156 | char: '🌲', 157 | name: 'evergreen tree', 158 | category: 'nature', 159 | }, 160 | { 161 | codes: '1F333', 162 | char: '🌳', 163 | name: 'deciduous tree', 164 | category: 'nature', 165 | }, 166 | { codes: '1F334', char: '🌴', name: 'palm tree', category: 'nature' }, 167 | { codes: '1F335', char: '🌵', name: 'cactus', category: 'nature' }, 168 | { 169 | codes: '1F33E', 170 | char: '🌾', 171 | name: 'sheaf of rice', 172 | category: 'nature', 173 | }, 174 | { codes: '1F33F', char: '🌿', name: 'herb', category: 'nature' }, 175 | { 176 | codes: '2618 FE0F', 177 | char: '☘️', 178 | name: 'shamrock', 179 | category: 'nature', 180 | }, 181 | { 182 | codes: '1F340', 183 | char: '🍀', 184 | name: 'four leaf clover', 185 | category: 'nature', 186 | }, 187 | { 188 | codes: '1F341', 189 | char: '🍁', 190 | name: 'maple leaf', 191 | category: 'nature', 192 | }, 193 | { 194 | codes: '1F342', 195 | char: '🍂', 196 | name: 'fallen leaf', 197 | category: 'nature', 198 | }, 199 | { 200 | codes: '1F343', 201 | char: '🍃', 202 | name: 'leaf fluttering in wind', 203 | category: 'nature', 204 | }, 205 | { codes: '1F311', char: '🌑', name: 'new moon', category: 'nature' }, 206 | { 207 | codes: '1F312', 208 | char: '🌒', 209 | name: 'waxing crescent moon', 210 | category: 'nature', 211 | }, 212 | { 213 | codes: '1F313', 214 | char: '🌓', 215 | name: 'first quarter moon', 216 | category: 'nature', 217 | }, 218 | { 219 | codes: '1F314', 220 | char: '🌔', 221 | name: 'waxing gibbous moon', 222 | category: 'nature', 223 | }, 224 | { codes: '1F315', char: '🌕', name: 'full moon', category: 'nature' }, 225 | { 226 | codes: '1F316', 227 | char: '🌖', 228 | name: 'waning gibbous moon', 229 | category: 'nature', 230 | }, 231 | { 232 | codes: '1F317', 233 | char: '🌗', 234 | name: 'last quarter moon', 235 | category: 'nature', 236 | }, 237 | { 238 | codes: '1F318', 239 | char: '🌘', 240 | name: 'waning crescent moon', 241 | category: 'nature', 242 | }, 243 | { 244 | codes: '1F319', 245 | char: '🌙', 246 | name: 'crescent moon', 247 | category: 'nature', 248 | }, 249 | { 250 | codes: '1F31A', 251 | char: '🌚', 252 | name: 'new moon face', 253 | category: 'nature', 254 | }, 255 | { 256 | codes: '1F31B', 257 | char: '🌛', 258 | name: 'first quarter moon face', 259 | category: 'nature', 260 | }, 261 | { 262 | codes: '1F31C', 263 | char: '🌜', 264 | name: 'last quarter moon face', 265 | category: 'nature', 266 | }, 267 | { 268 | codes: '1F31D', 269 | char: '🌝', 270 | name: 'full moon face', 271 | category: 'nature', 272 | }, 273 | { 274 | codes: '1F31E', 275 | char: '🌞', 276 | name: 'sun with face', 277 | category: 'nature', 278 | }, 279 | { codes: '2600 FE0F', char: '☀️', name: 'sun', category: 'nature' }, 280 | { codes: '2B50', char: '⭐', name: 'star', category: 'nature' }, 281 | { 282 | codes: '1F31F', 283 | char: '🌟', 284 | name: 'glowing star', 285 | category: 'nature', 286 | }, 287 | { 288 | codes: '1F320', 289 | char: '🌠', 290 | name: 'shooting star', 291 | category: 'nature', 292 | }, 293 | { codes: '1F30C', char: '🌌', name: 'milky way', category: 'nature' }, 294 | { codes: '2601 FE0F', char: '☁️', name: 'cloud', category: 'nature' }, 295 | { 296 | codes: '26C5', 297 | char: '⛅', 298 | name: 'sun behind cloud', 299 | category: 'nature', 300 | }, 301 | { codes: '1F300', char: '🌀', name: 'cyclone', category: 'nature' }, 302 | { codes: '1F308', char: '🌈', name: 'rainbow', category: 'nature' }, 303 | { 304 | codes: '1F302', 305 | char: '🌂', 306 | name: 'closed umbrella', 307 | category: 'nature', 308 | }, 309 | { 310 | codes: '2614', 311 | char: '☔', 312 | name: 'umbrella with rain drops', 313 | category: 'nature', 314 | }, 315 | { 316 | codes: '26A1', 317 | char: '⚡', 318 | name: 'high voltage', 319 | category: 'nature', 320 | }, 321 | { 322 | codes: '2744 FE0F', 323 | char: '❄️', 324 | name: 'snowflake', 325 | category: 'nature', 326 | }, 327 | { 328 | codes: '26C4', 329 | char: '⛄', 330 | name: 'snowman without snow', 331 | category: 'nature', 332 | }, 333 | { codes: '1F525', char: '🔥', name: 'fire', category: 'nature' }, 334 | { codes: '1F4A7', char: '💧', name: 'droplet', category: 'nature' }, 335 | { 336 | codes: '1F30A', 337 | char: '🌊', 338 | name: 'water wave', 339 | category: 'nature', 340 | }, 341 | ]; 342 | -------------------------------------------------------------------------------- /src/assets/emojis/objects.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { codes: '1F453', char: '👓', name: 'glasses', category: 'objects' }, 3 | { codes: '1F454', char: '👔', name: 'necktie', category: 'objects' }, 4 | { codes: '1F455', char: '👕', name: 't-shirt', category: 'objects' }, 5 | { codes: '1F456', char: '👖', name: 'jeans', category: 'objects' }, 6 | { codes: '1F457', char: '👗', name: 'dress', category: 'objects' }, 7 | { codes: '1F459', char: '👙', name: 'bikini', category: 'objects' }, 8 | { 9 | codes: '1F45A', 10 | char: '👚', 11 | name: 'woman’s clothes', 12 | category: 'objects', 13 | }, 14 | { codes: '1F45B', char: '👛', name: 'purse', category: 'objects' }, 15 | { codes: '1F45C', char: '👜', name: 'handbag', category: 'objects' }, 16 | { 17 | codes: '1F45D', 18 | char: '👝', 19 | name: 'clutch bag', 20 | category: 'objects', 21 | }, 22 | { codes: '1F392', char: '🎒', name: 'backpack', category: 'objects' }, 23 | { 24 | codes: '1F45E', 25 | char: '👞', 26 | name: 'man’s shoe', 27 | category: 'objects', 28 | }, 29 | { 30 | codes: '1F45F', 31 | char: '👟', 32 | name: 'running shoe', 33 | category: 'objects', 34 | }, 35 | { 36 | codes: '1F460', 37 | char: '👠', 38 | name: 'high-heeled shoe', 39 | category: 'objects', 40 | }, 41 | { 42 | codes: '1F461', 43 | char: '👡', 44 | name: 'woman’s sandal', 45 | category: 'objects', 46 | }, 47 | { 48 | codes: '1F462', 49 | char: '👢', 50 | name: 'woman’s boot', 51 | category: 'objects', 52 | }, 53 | { codes: '1F451', char: '👑', name: 'crown', category: 'objects' }, 54 | { 55 | codes: '1F452', 56 | char: '👒', 57 | name: 'woman’s hat', 58 | category: 'objects', 59 | }, 60 | { codes: '1F3A9', char: '🎩', name: 'top hat', category: 'objects' }, 61 | { 62 | codes: '1F393', 63 | char: '🎓', 64 | name: 'graduation cap', 65 | category: 'objects', 66 | }, 67 | { codes: '1F484', char: '💄', name: 'lipstick', category: 'objects' }, 68 | { codes: '1F48D', char: '💍', name: 'ring', category: 'objects' }, 69 | { 70 | codes: '1F48E', 71 | char: '💎', 72 | name: 'gem stone', 73 | category: 'objects', 74 | }, 75 | { 76 | codes: '1F507', 77 | char: '🔇', 78 | name: 'muted speaker', 79 | category: 'objects', 80 | }, 81 | { 82 | codes: '1F508', 83 | char: '🔈', 84 | name: 'speaker low volume', 85 | category: 'objects', 86 | }, 87 | { 88 | codes: '1F509', 89 | char: '🔉', 90 | name: 'speaker medium volume', 91 | category: 'objects', 92 | }, 93 | { 94 | codes: '1F50A', 95 | char: '🔊', 96 | name: 'speaker high volume', 97 | category: 'objects', 98 | }, 99 | { 100 | codes: '1F4E2', 101 | char: '📢', 102 | name: 'loudspeaker', 103 | category: 'objects', 104 | }, 105 | { 106 | codes: '1F4E3', 107 | char: '📣', 108 | name: 'megaphone', 109 | category: 'objects', 110 | }, 111 | { 112 | codes: '1F4EF', 113 | char: '📯', 114 | name: 'postal horn', 115 | category: 'objects', 116 | }, 117 | { codes: '1F514', char: '🔔', name: 'bell', category: 'objects' }, 118 | { 119 | codes: '1F515', 120 | char: '🔕', 121 | name: 'bell with slash', 122 | category: 'objects', 123 | }, 124 | { 125 | codes: '1F3BC', 126 | char: '🎼', 127 | name: 'musical score', 128 | category: 'objects', 129 | }, 130 | { 131 | codes: '1F3B5', 132 | char: '🎵', 133 | name: 'musical note', 134 | category: 'objects', 135 | }, 136 | { 137 | codes: '1F3B6', 138 | char: '🎶', 139 | name: 'musical notes', 140 | category: 'objects', 141 | }, 142 | { 143 | codes: '1F3A4', 144 | char: '🎤', 145 | name: 'microphone', 146 | category: 'objects', 147 | }, 148 | { 149 | codes: '1F3A7', 150 | char: '🎧', 151 | name: 'headphone', 152 | category: 'objects', 153 | }, 154 | { codes: '1F4FB', char: '📻', name: 'radio', category: 'objects' }, 155 | { 156 | codes: '1F3B7', 157 | char: '🎷', 158 | name: 'saxophone', 159 | category: 'objects', 160 | }, 161 | { codes: '1F3B8', char: '🎸', name: 'guitar', category: 'objects' }, 162 | { 163 | codes: '1F3B9', 164 | char: '🎹', 165 | name: 'musical keyboard', 166 | category: 'objects', 167 | }, 168 | { codes: '1F3BA', char: '🎺', name: 'trumpet', category: 'objects' }, 169 | { codes: '1F3BB', char: '🎻', name: 'violin', category: 'objects' }, 170 | { 171 | codes: '1F4F1', 172 | char: '📱', 173 | name: 'mobile phone', 174 | category: 'objects', 175 | }, 176 | { 177 | codes: '1F4F2', 178 | char: '📲', 179 | name: 'mobile phone with arrow', 180 | category: 'objects', 181 | }, 182 | { 183 | codes: '260E FE0F', 184 | char: '☎️', 185 | name: 'telephone', 186 | category: 'objects', 187 | }, 188 | { 189 | codes: '1F4DE', 190 | char: '📞', 191 | name: 'telephone receiver', 192 | category: 'objects', 193 | }, 194 | { codes: '1F4DF', char: '📟', name: 'pager', category: 'objects' }, 195 | { 196 | codes: '1F4E0', 197 | char: '📠', 198 | name: 'fax machine', 199 | category: 'objects', 200 | }, 201 | { codes: '1F50B', char: '🔋', name: 'battery', category: 'objects' }, 202 | { 203 | codes: '1F50C', 204 | char: '🔌', 205 | name: 'electric plug', 206 | category: 'objects', 207 | }, 208 | { 209 | codes: '1F4BB', 210 | char: '💻', 211 | name: 'laptop computer', 212 | category: 'objects', 213 | }, 214 | { 215 | codes: '1F4BD', 216 | char: '💽', 217 | name: 'computer disk', 218 | category: 'objects', 219 | }, 220 | { 221 | codes: '1F4BE', 222 | char: '💾', 223 | name: 'floppy disk', 224 | category: 'objects', 225 | }, 226 | { 227 | codes: '1F4BF', 228 | char: '💿', 229 | name: 'optical disk', 230 | category: 'objects', 231 | }, 232 | { codes: '1F4C0', char: '📀', name: 'dvd', category: 'objects' }, 233 | { codes: '1F9EE', char: '🧮', name: 'abacus', category: 'objects' }, 234 | { 235 | codes: '1F3A5', 236 | char: '🎥', 237 | name: 'movie camera', 238 | category: 'objects', 239 | }, 240 | { 241 | codes: '1F39E FE0F', 242 | char: '🎞️', 243 | name: 'film frames', 244 | category: 'objects', 245 | }, 246 | { 247 | codes: '1F4FD FE0F', 248 | char: '📽️', 249 | name: 'film projector', 250 | category: 'objects', 251 | }, 252 | { 253 | codes: '1F3AC', 254 | char: '🎬', 255 | name: 'clapper board', 256 | category: 'objects', 257 | }, 258 | { 259 | codes: '1F4FA', 260 | char: '📺', 261 | name: 'television', 262 | category: 'objects', 263 | }, 264 | { codes: '1F4F7', char: '📷', name: 'camera', category: 'objects' }, 265 | { 266 | codes: '1F4F9', 267 | char: '📹', 268 | name: 'video camera', 269 | category: 'objects', 270 | }, 271 | { 272 | codes: '1F4FC', 273 | char: '📼', 274 | name: 'videocassette', 275 | category: 'objects', 276 | }, 277 | { 278 | codes: '1F50D', 279 | char: '🔍', 280 | name: 'magnifying glass tilted left', 281 | category: 'objects', 282 | }, 283 | { 284 | codes: '1F50E', 285 | char: '🔎', 286 | name: 'magnifying glass tilted right', 287 | category: 'objects', 288 | }, 289 | { 290 | codes: '1F4A1', 291 | char: '💡', 292 | name: 'light bulb', 293 | category: 'objects', 294 | }, 295 | { 296 | codes: '1F526', 297 | char: '🔦', 298 | name: 'flashlight', 299 | category: 'objects', 300 | }, 301 | { 302 | codes: '1F3EE', 303 | char: '🏮', 304 | name: 'red paper lantern', 305 | category: 'objects', 306 | }, 307 | { 308 | codes: '1F4D4', 309 | char: '📔', 310 | name: 'notebook with decorative cover', 311 | category: 'objects', 312 | }, 313 | { 314 | codes: '1F4D5', 315 | char: '📕', 316 | name: 'closed book', 317 | category: 'objects', 318 | }, 319 | { 320 | codes: '1F4D6', 321 | char: '📖', 322 | name: 'open book', 323 | category: 'objects', 324 | }, 325 | { 326 | codes: '1F4D7', 327 | char: '📗', 328 | name: 'green book', 329 | category: 'objects', 330 | }, 331 | { 332 | codes: '1F4D8', 333 | char: '📘', 334 | name: 'blue book', 335 | category: 'objects', 336 | }, 337 | { 338 | codes: '1F4D9', 339 | char: '📙', 340 | name: 'orange book', 341 | category: 'objects', 342 | }, 343 | { codes: '1F4DA', char: '📚', name: 'books', category: 'objects' }, 344 | { codes: '1F4D3', char: '📓', name: 'notebook', category: 'objects' }, 345 | { codes: '1F4D2', char: '📒', name: 'ledger', category: 'objects' }, 346 | { 347 | codes: '1F4C3', 348 | char: '📃', 349 | name: 'page with curl', 350 | category: 'objects', 351 | }, 352 | { codes: '1F4DC', char: '📜', name: 'scroll', category: 'objects' }, 353 | { 354 | codes: '1F4C4', 355 | char: '📄', 356 | name: 'page facing up', 357 | category: 'objects', 358 | }, 359 | { 360 | codes: '1F4F0', 361 | char: '📰', 362 | name: 'newspaper', 363 | category: 'objects', 364 | }, 365 | { 366 | codes: '1F4D1', 367 | char: '📑', 368 | name: 'bookmark tabs', 369 | category: 'objects', 370 | }, 371 | { codes: '1F516', char: '🔖', name: 'bookmark', category: 'objects' }, 372 | { 373 | codes: '1F4B0', 374 | char: '💰', 375 | name: 'money bag', 376 | category: 'objects', 377 | }, 378 | { 379 | codes: '1F4B4', 380 | char: '💴', 381 | name: 'yen banknote', 382 | category: 'objects', 383 | }, 384 | { 385 | codes: '1F4B5', 386 | char: '💵', 387 | name: 'dollar banknote', 388 | category: 'objects', 389 | }, 390 | { 391 | codes: '1F4B6', 392 | char: '💶', 393 | name: 'euro banknote', 394 | category: 'objects', 395 | }, 396 | { 397 | codes: '1F4B7', 398 | char: '💷', 399 | name: 'pound banknote', 400 | category: 'objects', 401 | }, 402 | { 403 | codes: '1F4B8', 404 | char: '💸', 405 | name: 'money with wings', 406 | category: 'objects', 407 | }, 408 | { 409 | codes: '1F4B3', 410 | char: '💳', 411 | name: 'credit card', 412 | category: 'objects', 413 | }, 414 | { 415 | codes: '1F4B9', 416 | char: '💹', 417 | name: 'chart increasing with yen', 418 | category: 'objects', 419 | }, 420 | { 421 | codes: '1F4B1', 422 | char: '💱', 423 | name: 'currency exchange', 424 | category: 'objects', 425 | }, 426 | { 427 | codes: '1F4B2', 428 | char: '💲', 429 | name: 'heavy dollar sign', 430 | category: 'objects', 431 | }, 432 | { 433 | codes: '2709 FE0F', 434 | char: '✉️', 435 | name: 'envelope', 436 | category: 'objects', 437 | }, 438 | { codes: '1F4E7', char: '📧', name: 'e-mail', category: 'objects' }, 439 | { 440 | codes: '1F4E8', 441 | char: '📨', 442 | name: 'incoming envelope', 443 | category: 'objects', 444 | }, 445 | { 446 | codes: '1F4E9', 447 | char: '📩', 448 | name: 'envelope with arrow', 449 | category: 'objects', 450 | }, 451 | { 452 | codes: '1F4E4', 453 | char: '📤', 454 | name: 'outbox tray', 455 | category: 'objects', 456 | }, 457 | { 458 | codes: '1F4E5', 459 | char: '📥', 460 | name: 'inbox tray', 461 | category: 'objects', 462 | }, 463 | { codes: '1F4E6', char: '📦', name: 'package', category: 'objects' }, 464 | { 465 | codes: '1F4EB', 466 | char: '📫', 467 | name: 'closed mailbox with raised flag', 468 | category: 'objects', 469 | }, 470 | { 471 | codes: '1F4EA', 472 | char: '📪', 473 | name: 'closed mailbox with lowered flag', 474 | category: 'objects', 475 | }, 476 | { 477 | codes: '1F4EC', 478 | char: '📬', 479 | name: 'open mailbox with raised flag', 480 | category: 'objects', 481 | }, 482 | { 483 | codes: '1F4ED', 484 | char: '📭', 485 | name: 'open mailbox with lowered flag', 486 | category: 'objects', 487 | }, 488 | { codes: '1F4EE', char: '📮', name: 'postbox', category: 'objects' }, 489 | { 490 | codes: '270F FE0F', 491 | char: '✏️', 492 | name: 'pencil', 493 | category: 'objects', 494 | }, 495 | { 496 | codes: '2712 FE0F', 497 | char: '✒️', 498 | name: 'black nib', 499 | category: 'objects', 500 | }, 501 | { codes: '1F4DD', char: '📝', name: 'memo', category: 'objects' }, 502 | { 503 | codes: '1F4BC', 504 | char: '💼', 505 | name: 'briefcase', 506 | category: 'objects', 507 | }, 508 | { 509 | codes: '1F4C1', 510 | char: '📁', 511 | name: 'file folder', 512 | category: 'objects', 513 | }, 514 | { 515 | codes: '1F4C2', 516 | char: '📂', 517 | name: 'open file folder', 518 | category: 'objects', 519 | }, 520 | { codes: '1F4C5', char: '📅', name: 'calendar', category: 'objects' }, 521 | { 522 | codes: '1F4C7', 523 | char: '📇', 524 | name: 'card index', 525 | category: 'objects', 526 | }, 527 | { 528 | codes: '1F4C8', 529 | char: '📈', 530 | name: 'chart increasing', 531 | category: 'objects', 532 | }, 533 | { 534 | codes: '1F4C9', 535 | char: '📉', 536 | name: 'chart decreasing', 537 | category: 'objects', 538 | }, 539 | { 540 | codes: '1F4CA', 541 | char: '📊', 542 | name: 'bar chart', 543 | category: 'objects', 544 | }, 545 | { 546 | codes: '1F4CB', 547 | char: '📋', 548 | name: 'clipboard', 549 | category: 'objects', 550 | }, 551 | { codes: '1F4CC', char: '📌', name: 'pushpin', category: 'objects' }, 552 | { 553 | codes: '1F4CD', 554 | char: '📍', 555 | name: 'round pushpin', 556 | category: 'objects', 557 | }, 558 | { 559 | codes: '1F4CE', 560 | char: '📎', 561 | name: 'paperclip', 562 | category: 'objects', 563 | }, 564 | { 565 | codes: '1F4CF', 566 | char: '📏', 567 | name: 'straight ruler', 568 | category: 'objects', 569 | }, 570 | { 571 | codes: '1F4D0', 572 | char: '📐', 573 | name: 'triangular ruler', 574 | category: 'objects', 575 | }, 576 | { 577 | codes: '2702 FE0F', 578 | char: '✂️', 579 | name: 'scissors', 580 | category: 'objects', 581 | }, 582 | { codes: '1F512', char: '🔒', name: 'locked', category: 'objects' }, 583 | { codes: '1F513', char: '🔓', name: 'unlocked', category: 'objects' }, 584 | { 585 | codes: '1F50F', 586 | char: '🔏', 587 | name: 'locked with pen', 588 | category: 'objects', 589 | }, 590 | { 591 | codes: '1F510', 592 | char: '🔐', 593 | name: 'locked with key', 594 | category: 'objects', 595 | }, 596 | { codes: '1F511', char: '🔑', name: 'key', category: 'objects' }, 597 | { codes: '1F528', char: '🔨', name: 'hammer', category: 'objects' }, 598 | { codes: '1F52B', char: '🔫', name: 'pistol', category: 'objects' }, 599 | { codes: '1F517', char: '🔗', name: 'link', category: 'objects' }, 600 | { 601 | codes: '1F52C', 602 | char: '🔬', 603 | name: 'microscope', 604 | category: 'objects', 605 | }, 606 | { 607 | codes: '1F52D', 608 | char: '🔭', 609 | name: 'telescope', 610 | category: 'objects', 611 | }, 612 | { 613 | codes: '1F4E1', 614 | char: '📡', 615 | name: 'satellite antenna', 616 | category: 'objects', 617 | }, 618 | { codes: '1F489', char: '💉', name: 'syringe', category: 'objects' }, 619 | { codes: '1F48A', char: '💊', name: 'pill', category: 'objects' }, 620 | { codes: '1F6AA', char: '🚪', name: 'door', category: 'objects' }, 621 | { codes: '1F6BD', char: '🚽', name: 'toilet', category: 'objects' }, 622 | { codes: '1F6BF', char: '🚿', name: 'shower', category: 'objects' }, 623 | { codes: '1F6C1', char: '🛁', name: 'bathtub', category: 'objects' }, 624 | { 625 | codes: '1F6AC', 626 | char: '🚬', 627 | name: 'cigarette', 628 | category: 'objects', 629 | }, 630 | { codes: '1F5FF', char: '🗿', name: 'moai', category: 'objects' }, 631 | ]; 632 | -------------------------------------------------------------------------------- /src/assets/emojis/places.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | codes: '1F30F', 4 | char: '🌏', 5 | name: 'globe showing Asia-Australia', 6 | category: 'places', 7 | }, 8 | { 9 | codes: '1F310', 10 | char: '🌐', 11 | name: 'globe with meridians', 12 | category: 'places', 13 | }, 14 | { codes: '1F30B', char: '🌋', name: 'volcano', category: 'places' }, 15 | { 16 | codes: '1F5FB', 17 | char: '🗻', 18 | name: 'mount fuji', 19 | category: 'places', 20 | }, 21 | { codes: '1F3E0', char: '🏠', name: 'house', category: 'places' }, 22 | { 23 | codes: '1F3E1', 24 | char: '🏡', 25 | name: 'house with garden', 26 | category: 'places', 27 | }, 28 | { 29 | codes: '1F3E2', 30 | char: '🏢', 31 | name: 'office building', 32 | category: 'places', 33 | }, 34 | { 35 | codes: '1F3E3', 36 | char: '🏣', 37 | name: 'Japanese post office', 38 | category: 'places', 39 | }, 40 | { 41 | codes: '1F3E4', 42 | char: '🏤', 43 | name: 'post office', 44 | category: 'places', 45 | }, 46 | { codes: '1F3E5', char: '🏥', name: 'hospital', category: 'places' }, 47 | { codes: '1F3E6', char: '🏦', name: 'bank', category: 'places' }, 48 | { codes: '1F3E8', char: '🏨', name: 'hotel', category: 'places' }, 49 | { 50 | codes: '1F3E9', 51 | char: '🏩', 52 | name: 'love hotel', 53 | category: 'places', 54 | }, 55 | { 56 | codes: '1F3EA', 57 | char: '🏪', 58 | name: 'convenience store', 59 | category: 'places', 60 | }, 61 | { codes: '1F3EB', char: '🏫', name: 'school', category: 'places' }, 62 | { 63 | codes: '1F3EC', 64 | char: '🏬', 65 | name: 'department store', 66 | category: 'places', 67 | }, 68 | { codes: '1F3ED', char: '🏭', name: 'factory', category: 'places' }, 69 | { 70 | codes: '1F3EF', 71 | char: '🏯', 72 | name: 'Japanese castle', 73 | category: 'places', 74 | }, 75 | { codes: '1F3F0', char: '🏰', name: 'castle', category: 'places' }, 76 | { codes: '1F492', char: '💒', name: 'wedding', category: 'places' }, 77 | { 78 | codes: '1F5FD', 79 | char: '🗽', 80 | name: 'Statue of Liberty', 81 | category: 'places', 82 | }, 83 | { codes: '26EA', char: '⛪', name: 'church', category: 'places' }, 84 | { codes: '26F2', char: '⛲', name: 'fountain', category: 'places' }, 85 | { codes: '26FA', char: '⛺', name: 'tent', category: 'places' }, 86 | { codes: '1F301', char: '🌁', name: 'foggy', category: 'places' }, 87 | { 88 | codes: '1F303', 89 | char: '🌃', 90 | name: 'night with stars', 91 | category: 'places', 92 | }, 93 | { 94 | codes: '1F304', 95 | char: '🌄', 96 | name: 'sunrise over mountains', 97 | category: 'places', 98 | }, 99 | { codes: '1F305', char: '🌅', name: 'sunrise', category: 'places' }, 100 | { 101 | codes: '1F306', 102 | char: '🌆', 103 | name: 'cityscape at dusk', 104 | category: 'places', 105 | }, 106 | { codes: '1F307', char: '🌇', name: 'sunset', category: 'places' }, 107 | { 108 | codes: '1F309', 109 | char: '🌉', 110 | name: 'bridge at night', 111 | category: 'places', 112 | }, 113 | { 114 | codes: '2668 FE0F', 115 | char: '♨️', 116 | name: 'hot springs', 117 | category: 'places', 118 | }, 119 | { 120 | codes: '1F3A0', 121 | char: '🎠', 122 | name: 'carousel horse', 123 | category: 'places', 124 | }, 125 | { 126 | codes: '1F3A1', 127 | char: '🎡', 128 | name: 'ferris wheel', 129 | category: 'places', 130 | }, 131 | { 132 | codes: '1F3A2', 133 | char: '🎢', 134 | name: 'roller coaster', 135 | category: 'places', 136 | }, 137 | { 138 | codes: '1F488', 139 | char: '💈', 140 | name: 'barber pole', 141 | category: 'places', 142 | }, 143 | { 144 | codes: '1F3AA', 145 | char: '🎪', 146 | name: 'circus tent', 147 | category: 'places', 148 | }, 149 | { 150 | codes: '1F682', 151 | char: '🚂', 152 | name: 'locomotive', 153 | category: 'places', 154 | }, 155 | { 156 | codes: '1F683', 157 | char: '🚃', 158 | name: 'railway car', 159 | category: 'places', 160 | }, 161 | { 162 | codes: '1F684', 163 | char: '🚄', 164 | name: 'high-speed train', 165 | category: 'places', 166 | }, 167 | { 168 | codes: '1F685', 169 | char: '🚅', 170 | name: 'bullet train', 171 | category: 'places', 172 | }, 173 | { codes: '1F686', char: '🚆', name: 'train', category: 'places' }, 174 | { codes: '1F687', char: '🚇', name: 'metro', category: 'places' }, 175 | { 176 | codes: '1F688', 177 | char: '🚈', 178 | name: 'light rail', 179 | category: 'places', 180 | }, 181 | { codes: '1F689', char: '🚉', name: 'station', category: 'places' }, 182 | { codes: '1F68A', char: '🚊', name: 'tram', category: 'places' }, 183 | { codes: '1F69D', char: '🚝', name: 'monorail', category: 'places' }, 184 | { 185 | codes: '1F69E', 186 | char: '🚞', 187 | name: 'mountain railway', 188 | category: 'places', 189 | }, 190 | { codes: '1F68B', char: '🚋', name: 'tram car', category: 'places' }, 191 | { codes: '1F68C', char: '🚌', name: 'bus', category: 'places' }, 192 | { 193 | codes: '1F68D', 194 | char: '🚍', 195 | name: 'oncoming bus', 196 | category: 'places', 197 | }, 198 | { 199 | codes: '1F68E', 200 | char: '🚎', 201 | name: 'trolleybus', 202 | category: 'places', 203 | }, 204 | { codes: '1F690', char: '🚐', name: 'minibus', category: 'places' }, 205 | { codes: '1F691', char: '🚑', name: 'ambulance', category: 'places' }, 206 | { 207 | codes: '1F692', 208 | char: '🚒', 209 | name: 'fire engine', 210 | category: 'places', 211 | }, 212 | { 213 | codes: '1F693', 214 | char: '🚓', 215 | name: 'police car', 216 | category: 'places', 217 | }, 218 | { codes: '1F695', char: '🚕', name: 'taxi', category: 'places' }, 219 | { 220 | codes: '1F697', 221 | char: '🚗', 222 | name: 'automobile', 223 | category: 'places', 224 | }, 225 | { 226 | codes: '1F698', 227 | char: '🚘', 228 | name: 'oncoming automobile', 229 | category: 'places', 230 | }, 231 | { 232 | codes: '1F699', 233 | char: '🚙', 234 | name: 'sport utility vehicle', 235 | category: 'places', 236 | }, 237 | { 238 | codes: '1F69A', 239 | char: '🚚', 240 | name: 'delivery truck', 241 | category: 'places', 242 | }, 243 | { 244 | codes: '1F69B', 245 | char: '🚛', 246 | name: 'articulated lorry', 247 | category: 'places', 248 | }, 249 | { codes: '1F6B2', char: '🚲', name: 'bicycle', category: 'places' }, 250 | { codes: '26FD', char: '⛽', name: 'fuel pump', category: 'places' }, 251 | { 252 | codes: '1F6A8', 253 | char: '🚨', 254 | name: 'police car light', 255 | category: 'places', 256 | }, 257 | { 258 | codes: '1F6A5', 259 | char: '🚥', 260 | name: 'horizontal traffic light', 261 | category: 'places', 262 | }, 263 | { 264 | codes: '1F6A6', 265 | char: '🚦', 266 | name: 'vertical traffic light', 267 | category: 'places', 268 | }, 269 | { 270 | codes: '1F6A7', 271 | char: '🚧', 272 | name: 'construction', 273 | category: 'places', 274 | }, 275 | { codes: '2693', char: '⚓', name: 'anchor', category: 'places' }, 276 | { codes: '26F5', char: '⛵', name: 'sailboat', category: 'places' }, 277 | { codes: '1F6A4', char: '🚤', name: 'speedboat', category: 'places' }, 278 | { codes: '1F6A2', char: '🚢', name: 'ship', category: 'places' }, 279 | { 280 | codes: '2708 FE0F', 281 | char: '✈️', 282 | name: 'airplane', 283 | category: 'places', 284 | }, 285 | { 286 | codes: '1F681', 287 | char: '🚁', 288 | name: 'helicopter', 289 | category: 'places', 290 | }, 291 | { 292 | codes: '1F69F', 293 | char: '🚟', 294 | name: 'suspension railway', 295 | category: 'places', 296 | }, 297 | { 298 | codes: '1F6A0', 299 | char: '🚠', 300 | name: 'mountain cableway', 301 | category: 'places', 302 | }, 303 | { 304 | codes: '1F6A1', 305 | char: '🚡', 306 | name: 'aerial tramway', 307 | category: 'places', 308 | }, 309 | { 310 | codes: '1F6F0 FE0F', 311 | char: '🛰️', 312 | name: 'satellite', 313 | category: 'places', 314 | }, 315 | { codes: '1F680', char: '🚀', name: 'rocket', category: 'places' }, 316 | { 317 | codes: '231B', 318 | char: '⌛', 319 | name: 'hourglass done', 320 | category: 'places', 321 | }, 322 | { 323 | codes: '23F3', 324 | char: '⏳', 325 | name: 'hourglass not done', 326 | category: 'places', 327 | }, 328 | { codes: '231A', char: '⌚', name: 'watch', category: 'places' }, 329 | { 330 | codes: '23F0', 331 | char: '⏰', 332 | name: 'alarm clock', 333 | category: 'places', 334 | }, 335 | { 336 | codes: '1F55B', 337 | char: '🕛', 338 | name: 'twelve o’clock', 339 | category: 'places', 340 | }, 341 | { 342 | codes: '1F567', 343 | char: '🕧', 344 | name: 'twelve-thirty', 345 | category: 'places', 346 | }, 347 | { 348 | codes: '1F550', 349 | char: '🕐', 350 | name: 'one o’clock', 351 | category: 'places', 352 | }, 353 | { 354 | codes: '1F55C', 355 | char: '🕜', 356 | name: 'one-thirty', 357 | category: 'places', 358 | }, 359 | { 360 | codes: '1F551', 361 | char: '🕑', 362 | name: 'two o’clock', 363 | category: 'places', 364 | }, 365 | { 366 | codes: '1F55D', 367 | char: '🕝', 368 | name: 'two-thirty', 369 | category: 'places', 370 | }, 371 | { 372 | codes: '1F552', 373 | char: '🕒', 374 | name: 'three o’clock', 375 | category: 'places', 376 | }, 377 | { 378 | codes: '1F55E', 379 | char: '🕞', 380 | name: 'three-thirty', 381 | category: 'places', 382 | }, 383 | { 384 | codes: '1F553', 385 | char: '🕓', 386 | name: 'four o’clock', 387 | category: 'places', 388 | }, 389 | { 390 | codes: '1F55F', 391 | char: '🕟', 392 | name: 'four-thirty', 393 | category: 'places', 394 | }, 395 | { 396 | codes: '1F554', 397 | char: '🕔', 398 | name: 'five o’clock', 399 | category: 'places', 400 | }, 401 | { 402 | codes: '1F560', 403 | char: '🕠', 404 | name: 'five-thirty', 405 | category: 'places', 406 | }, 407 | { 408 | codes: '1F555', 409 | char: '🕕', 410 | name: 'six o’clock', 411 | category: 'places', 412 | }, 413 | { 414 | codes: '1F561', 415 | char: '🕡', 416 | name: 'six-thirty', 417 | category: 'places', 418 | }, 419 | { 420 | codes: '1F556', 421 | char: '🕖', 422 | name: 'seven o’clock', 423 | category: 'places', 424 | }, 425 | { 426 | codes: '1F562', 427 | char: '🕢', 428 | name: 'seven-thirty', 429 | category: 'places', 430 | }, 431 | { 432 | codes: '1F557', 433 | char: '🕗', 434 | name: 'eight o’clock', 435 | category: 'places', 436 | }, 437 | { 438 | codes: '1F563', 439 | char: '🕣', 440 | name: 'eight-thirty', 441 | category: 'places', 442 | }, 443 | { 444 | codes: '1F558', 445 | char: '🕘', 446 | name: 'nine o’clock', 447 | category: 'places', 448 | }, 449 | { 450 | codes: '1F564', 451 | char: '🕤', 452 | name: 'nine-thirty', 453 | category: 'places', 454 | }, 455 | { 456 | codes: '1F559', 457 | char: '🕙', 458 | name: 'ten o’clock', 459 | category: 'places', 460 | }, 461 | { 462 | codes: '1F565', 463 | char: '🕥', 464 | name: 'ten-thirty', 465 | category: 'places', 466 | }, 467 | { 468 | codes: '1F55A', 469 | char: '🕚', 470 | name: 'eleven o’clock', 471 | category: 'places', 472 | }, 473 | { 474 | codes: '1F566', 475 | char: '🕦', 476 | name: 'eleven-thirty', 477 | category: 'places', 478 | }, 479 | ]; 480 | -------------------------------------------------------------------------------- /src/assets/emojis/skintone.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | codes: '1F3FB', 4 | char: '🏻', 5 | name: 'light-skin-tone', 6 | category: 'skin-tone', 7 | }, 8 | { 9 | codes: '1F3FC', 10 | char: '🏼', 11 | name: 'medium-light-skin-tone', 12 | category: 'skin-tone', 13 | }, 14 | { 15 | codes: '1F3FD', 16 | char: '🏽', 17 | name: 'medium-skin-tone', 18 | category: 'skin-tone', 19 | }, 20 | { 21 | codes: '1F3FE', 22 | char: '🏾', 23 | name: 'medium-dark-skin-tone', 24 | category: 'skin-tone', 25 | }, 26 | { 27 | codes: '1F3FF', 28 | char: '🏿', 29 | name: 'dark-skin-tone', 30 | category: 'skin-tone', 31 | } 32 | ]; 33 | -------------------------------------------------------------------------------- /src/assets/emojis/symbols.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | codes: '2764 FE0F', 4 | char: '❤️', 5 | name: 'red heart', 6 | category: 'symbols', 7 | }, 8 | { 9 | codes: '1F49B', 10 | char: '💛', 11 | name: 'yellow heart', 12 | category: 'symbols', 13 | }, 14 | { 15 | codes: '1F49A', 16 | char: '💚', 17 | name: 'green heart', 18 | category: 'symbols', 19 | }, 20 | { 21 | codes: '1F499', 22 | char: '💙', 23 | name: 'blue heart', 24 | category: 'symbols', 25 | }, 26 | { 27 | codes: '1F49C', 28 | char: '💜', 29 | name: 'purple heart', 30 | category: 'symbols', 31 | }, 32 | { 33 | codes: '1F48B', 34 | char: '💋', 35 | name: 'kiss mark', 36 | category: 'symbols', 37 | }, 38 | { 39 | codes: '1F48C', 40 | char: '💌', 41 | name: 'love letter', 42 | category: 'symbols', 43 | }, 44 | { 45 | codes: '1F498', 46 | char: '💘', 47 | name: 'heart with arrow', 48 | category: 'symbols', 49 | }, 50 | { 51 | codes: '1F49D', 52 | char: '💝', 53 | name: 'heart with ribbon', 54 | category: 'symbols', 55 | }, 56 | { 57 | codes: '1F496', 58 | char: '💖', 59 | name: 'sparkling heart', 60 | category: 'symbols', 61 | }, 62 | { 63 | codes: '1F497', 64 | char: '💗', 65 | name: 'growing heart', 66 | category: 'symbols', 67 | }, 68 | { 69 | codes: '1F493', 70 | char: '💓', 71 | name: 'beating heart', 72 | category: 'symbols', 73 | }, 74 | { 75 | codes: '1F49E', 76 | char: '💞', 77 | name: 'revolving hearts', 78 | category: 'symbols', 79 | }, 80 | { 81 | codes: '1F495', 82 | char: '💕', 83 | name: 'two hearts', 84 | category: 'symbols', 85 | }, 86 | { 87 | codes: '1F49F', 88 | char: '💟', 89 | name: 'heart decoration', 90 | category: 'symbols', 91 | }, 92 | { 93 | codes: '1F494', 94 | char: '💔', 95 | name: 'broken heart', 96 | category: 'symbols', 97 | }, 98 | { 99 | codes: '1F4AF', 100 | char: '💯', 101 | name: 'hundred points', 102 | category: 'symbols', 103 | }, 104 | { 105 | codes: '1F4A2', 106 | char: '💢', 107 | name: 'anger symbol', 108 | category: 'symbols', 109 | }, 110 | { 111 | codes: '1F4A5', 112 | char: '💥', 113 | name: 'collision', 114 | category: 'symbols', 115 | }, 116 | { codes: '1F4AB', char: '💫', name: 'dizzy', category: 'symbols' }, 117 | { 118 | codes: '1F4A6', 119 | char: '💦', 120 | name: 'sweat droplets', 121 | category: 'symbols', 122 | }, 123 | { 124 | codes: '1F4A8', 125 | char: '💨', 126 | name: 'dashing away', 127 | category: 'symbols', 128 | }, 129 | { codes: '1F4A3', char: '💣', name: 'bomb', category: 'symbols' }, 130 | { 131 | codes: '1F4AC', 132 | char: '💬', 133 | name: 'speech balloon', 134 | category: 'symbols', 135 | }, 136 | { 137 | codes: '1F4AD', 138 | char: '💭', 139 | name: 'thought balloon', 140 | category: 'symbols', 141 | }, 142 | { codes: '1F4A4', char: '💤', name: 'zzz', category: 'symbols' }, 143 | { 144 | codes: '1F6AE', 145 | char: '🚮', 146 | name: 'litter in bin sign', 147 | category: 'symbols', 148 | }, 149 | { 150 | codes: '1F6B0', 151 | char: '🚰', 152 | name: 'potable water', 153 | category: 'symbols', 154 | }, 155 | { 156 | codes: '267F', 157 | char: '♿', 158 | name: 'wheelchair symbol', 159 | category: 'symbols', 160 | }, 161 | { 162 | codes: '1F6B9', 163 | char: '🚹', 164 | name: 'men’s room', 165 | category: 'symbols', 166 | }, 167 | { 168 | codes: '1F6BA', 169 | char: '🚺', 170 | name: 'women’s room', 171 | category: 'symbols', 172 | }, 173 | { codes: '1F6BB', char: '🚻', name: 'restroom', category: 'symbols' }, 174 | { 175 | codes: '1F6BC', 176 | char: '🚼', 177 | name: 'baby symbol', 178 | category: 'symbols', 179 | }, 180 | { 181 | codes: '1F6BE', 182 | char: '🚾', 183 | name: 'water closet', 184 | category: 'symbols', 185 | }, 186 | { 187 | codes: '1F6C2', 188 | char: '🛂', 189 | name: 'passport control', 190 | category: 'symbols', 191 | }, 192 | { codes: '1F6C3', char: '🛃', name: 'customs', category: 'symbols' }, 193 | { 194 | codes: '1F6C4', 195 | char: '🛄', 196 | name: 'baggage claim', 197 | category: 'symbols', 198 | }, 199 | { 200 | codes: '1F6C5', 201 | char: '🛅', 202 | name: 'left luggage', 203 | category: 'symbols', 204 | }, 205 | { 206 | codes: '26A0 FE0F', 207 | char: '⚠️', 208 | name: 'warning', 209 | category: 'symbols', 210 | }, 211 | { 212 | codes: '1F6B8', 213 | char: '🚸', 214 | name: 'children crossing', 215 | category: 'symbols', 216 | }, 217 | { codes: '26D4', char: '⛔', name: 'no entry', category: 'symbols' }, 218 | { 219 | codes: '1F6AB', 220 | char: '🚫', 221 | name: 'prohibited', 222 | category: 'symbols', 223 | }, 224 | { 225 | codes: '1F6B3', 226 | char: '🚳', 227 | name: 'no bicycles', 228 | category: 'symbols', 229 | }, 230 | { 231 | codes: '1F6AD', 232 | char: '🚭', 233 | name: 'no smoking', 234 | category: 'symbols', 235 | }, 236 | { 237 | codes: '1F6AF', 238 | char: '🚯', 239 | name: 'no littering', 240 | category: 'symbols', 241 | }, 242 | { 243 | codes: '1F6B1', 244 | char: '🚱', 245 | name: 'non-potable water', 246 | category: 'symbols', 247 | }, 248 | { 249 | codes: '1F6B7', 250 | char: '🚷', 251 | name: 'no pedestrians', 252 | category: 'symbols', 253 | }, 254 | { 255 | codes: '1F4F5', 256 | char: '📵', 257 | name: 'no mobile phones', 258 | category: 'symbols', 259 | }, 260 | { 261 | codes: '1F51E', 262 | char: '🔞', 263 | name: 'no one under eighteen', 264 | category: 'symbols', 265 | }, 266 | { 267 | codes: '2622 FE0F', 268 | char: '☢️', 269 | name: 'radioactive', 270 | category: 'symbols', 271 | }, 272 | { 273 | codes: '2623 FE0F', 274 | char: '☣️', 275 | name: 'biohazard', 276 | category: 'symbols', 277 | }, 278 | { 279 | codes: '2B06 FE0F', 280 | char: '⬆️', 281 | name: 'up arrow', 282 | category: 'symbols', 283 | }, 284 | { 285 | codes: '27A1 FE0F', 286 | char: '➡️', 287 | name: 'right arrow', 288 | category: 'symbols', 289 | }, 290 | { 291 | codes: '2B07 FE0F', 292 | char: '⬇️', 293 | name: 'down arrow', 294 | category: 'symbols', 295 | }, 296 | { 297 | codes: '2B05 FE0F', 298 | char: '⬅️', 299 | name: 'left arrow', 300 | category: 'symbols', 301 | }, 302 | { 303 | codes: '21A9 FE0F', 304 | char: '↩️', 305 | name: 'right arrow curving left', 306 | category: 'symbols', 307 | }, 308 | { 309 | codes: '21AA FE0F', 310 | char: '↪️', 311 | name: 'left arrow curving right', 312 | category: 'symbols', 313 | }, 314 | { 315 | codes: '2934 FE0F', 316 | char: '⤴️', 317 | name: 'right arrow curving up', 318 | category: 'symbols', 319 | }, 320 | { 321 | codes: '2935 FE0F', 322 | char: '⤵️', 323 | name: 'right arrow curving down', 324 | category: 'symbols', 325 | }, 326 | { 327 | codes: '1F503', 328 | char: '🔃', 329 | name: 'clockwise vertical arrows', 330 | category: 'symbols', 331 | }, 332 | { 333 | codes: '1F504', 334 | char: '🔄', 335 | name: 'counterclockwise arrows button', 336 | category: 'symbols', 337 | }, 338 | { 339 | codes: '1F519', 340 | char: '🔙', 341 | name: 'BACK arrow', 342 | category: 'symbols', 343 | }, 344 | { 345 | codes: '1F51A', 346 | char: '🔚', 347 | name: 'END arrow', 348 | category: 'symbols', 349 | }, 350 | { 351 | codes: '1F51B', 352 | char: '🔛', 353 | name: 'ON! arrow', 354 | category: 'symbols', 355 | }, 356 | { 357 | codes: '1F51C', 358 | char: '🔜', 359 | name: 'SOON arrow', 360 | category: 'symbols', 361 | }, 362 | { 363 | codes: '1F51D', 364 | char: '🔝', 365 | name: 'TOP arrow', 366 | category: 'symbols', 367 | }, 368 | { codes: '2648', char: '♈', name: 'Aries', category: 'symbols' }, 369 | { codes: '2649', char: '♉', name: 'Taurus', category: 'symbols' }, 370 | { codes: '264A', char: '♊', name: 'Gemini', category: 'symbols' }, 371 | { codes: '264B', char: '♋', name: 'Cancer', category: 'symbols' }, 372 | { codes: '264C', char: '♌', name: 'Leo', category: 'symbols' }, 373 | { codes: '264D', char: '♍', name: 'Virgo', category: 'symbols' }, 374 | { codes: '264E', char: '♎', name: 'Libra', category: 'symbols' }, 375 | { codes: '264F', char: '♏', name: 'Scorpio', category: 'symbols' }, 376 | { 377 | codes: '2650', 378 | char: '♐', 379 | name: 'Sagittarius', 380 | category: 'symbols', 381 | }, 382 | { codes: '2651', char: '♑', name: 'Capricorn', category: 'symbols' }, 383 | { codes: '2652', char: '♒', name: 'Aquarius', category: 'symbols' }, 384 | { codes: '2653', char: '♓', name: 'Pisces', category: 'symbols' }, 385 | { codes: '26CE', char: '⛎', name: 'Ophiuchus', category: 'symbols' }, 386 | { 387 | codes: '1F500', 388 | char: '🔀', 389 | name: 'shuffle tracks button', 390 | category: 'symbols', 391 | }, 392 | { 393 | codes: '1F501', 394 | char: '🔁', 395 | name: 'repeat button', 396 | category: 'symbols', 397 | }, 398 | { 399 | codes: '1F502', 400 | char: '🔂', 401 | name: 'repeat single button', 402 | category: 'symbols', 403 | }, 404 | { 405 | codes: '23E9', 406 | char: '⏩', 407 | name: 'fast-forward button', 408 | category: 'symbols', 409 | }, 410 | { 411 | codes: '23EA', 412 | char: '⏪', 413 | name: 'fast reverse button', 414 | category: 'symbols', 415 | }, 416 | { 417 | codes: '1F53C', 418 | char: '🔼', 419 | name: 'upwards button', 420 | category: 'symbols', 421 | }, 422 | { 423 | codes: '23EB', 424 | char: '⏫', 425 | name: 'fast up button', 426 | category: 'symbols', 427 | }, 428 | { 429 | codes: '1F53D', 430 | char: '🔽', 431 | name: 'downwards button', 432 | category: 'symbols', 433 | }, 434 | { 435 | codes: '23EC', 436 | char: '⏬', 437 | name: 'fast down button', 438 | category: 'symbols', 439 | }, 440 | { codes: '1F3A6', char: '🎦', name: 'cinema', category: 'symbols' }, 441 | { 442 | codes: '1F505', 443 | char: '🔅', 444 | name: 'dim button', 445 | category: 'symbols', 446 | }, 447 | { 448 | codes: '1F506', 449 | char: '🔆', 450 | name: 'bright button', 451 | category: 'symbols', 452 | }, 453 | { 454 | codes: '1F4F6', 455 | char: '📶', 456 | name: 'antenna bars', 457 | category: 'symbols', 458 | }, 459 | { 460 | codes: '1F4F3', 461 | char: '📳', 462 | name: 'vibration mode', 463 | category: 'symbols', 464 | }, 465 | { 466 | codes: '1F4F4', 467 | char: '📴', 468 | name: 'mobile phone off', 469 | category: 'symbols', 470 | }, 471 | { 472 | codes: '267B FE0F', 473 | char: '♻️', 474 | name: 'recycling symbol', 475 | category: 'symbols', 476 | }, 477 | { 478 | codes: '1F531', 479 | char: '🔱', 480 | name: 'trident emblem', 481 | category: 'symbols', 482 | }, 483 | { 484 | codes: '1F4DB', 485 | char: '📛', 486 | name: 'name badge', 487 | category: 'symbols', 488 | }, 489 | { 490 | codes: '1F530', 491 | char: '🔰', 492 | name: 'Japanese symbol for beginner', 493 | category: 'symbols', 494 | }, 495 | { 496 | codes: '2B55', 497 | char: '⭕', 498 | name: 'hollow red circle', 499 | category: 'symbols', 500 | }, 501 | { 502 | codes: '2705', 503 | char: '✅', 504 | name: 'check mark button', 505 | category: 'symbols', 506 | }, 507 | { 508 | codes: '2611 FE0F', 509 | char: '☑️', 510 | name: 'check box with check', 511 | category: 'symbols', 512 | }, 513 | { 514 | codes: '2714 FE0F', 515 | char: '✔️', 516 | name: 'check mark', 517 | category: 'symbols', 518 | }, 519 | { 520 | codes: '274C', 521 | char: '❌', 522 | name: 'cross mark', 523 | category: 'symbols', 524 | }, 525 | { 526 | codes: '274E', 527 | char: '❎', 528 | name: 'cross mark button', 529 | category: 'symbols', 530 | }, 531 | { 532 | codes: '27B0', 533 | char: '➰', 534 | name: 'curly loop', 535 | category: 'symbols', 536 | }, 537 | { 538 | codes: '27BF', 539 | char: '➿', 540 | name: 'double curly loop', 541 | category: 'symbols', 542 | }, 543 | { 544 | codes: '303D FE0F', 545 | char: '〽️', 546 | name: 'part alternation mark', 547 | category: 'symbols', 548 | }, 549 | { 550 | codes: '303D', 551 | char: '〽', 552 | name: 'part alternation mark', 553 | category: 'symbols', 554 | }, 555 | { 556 | codes: '2733 FE0F', 557 | char: '✳️', 558 | name: 'eight-spoked asterisk', 559 | category: 'symbols', 560 | }, 561 | { 562 | codes: '2734 FE0F', 563 | char: '✴️', 564 | name: 'eight-pointed star', 565 | category: 'symbols', 566 | }, 567 | { 568 | codes: '2747 FE0F', 569 | char: '❇️', 570 | name: 'sparkle', 571 | category: 'symbols', 572 | }, 573 | { 574 | codes: '2753', 575 | char: '❓', 576 | name: 'question mark', 577 | category: 'symbols', 578 | }, 579 | { 580 | codes: '2757', 581 | char: '❗', 582 | name: 'exclamation mark', 583 | category: 'symbols', 584 | }, 585 | { 586 | codes: '1F534', 587 | char: '🔴', 588 | name: 'red circle', 589 | category: 'symbols', 590 | }, 591 | { 592 | codes: '1F535', 593 | char: '🔵', 594 | name: 'blue circle', 595 | category: 'symbols', 596 | }, 597 | { 598 | codes: '26AB', 599 | char: '⚫', 600 | name: 'black circle', 601 | category: 'symbols', 602 | }, 603 | { 604 | codes: '26AA', 605 | char: '⚪', 606 | name: 'white circle', 607 | category: 'symbols', 608 | }, 609 | { 610 | codes: '2B1B', 611 | char: '⬛', 612 | name: 'black large square', 613 | category: 'symbols', 614 | }, 615 | { 616 | codes: '2B1C', 617 | char: '⬜', 618 | name: 'white large square', 619 | category: 'symbols', 620 | }, 621 | { 622 | codes: '25FC FE0F', 623 | char: '◼️', 624 | name: 'black medium square', 625 | category: 'symbols', 626 | }, 627 | { 628 | codes: '25FB FE0F', 629 | char: '◻️', 630 | name: 'white medium square', 631 | category: 'symbols', 632 | }, 633 | { 634 | codes: '25FE', 635 | char: '◾', 636 | name: 'black medium-small square', 637 | category: 'symbols', 638 | }, 639 | { 640 | codes: '25FD', 641 | char: '◽', 642 | name: 'white medium-small square', 643 | category: 'symbols', 644 | }, 645 | { 646 | codes: '1F536', 647 | char: '🔶', 648 | name: 'large orange diamond', 649 | category: 'symbols', 650 | }, 651 | { 652 | codes: '1F537', 653 | char: '🔷', 654 | name: 'large blue diamond', 655 | category: 'symbols', 656 | }, 657 | { 658 | codes: '1F538', 659 | char: '🔸', 660 | name: 'small orange diamond', 661 | category: 'symbols', 662 | }, 663 | { 664 | codes: '1F539', 665 | char: '🔹', 666 | name: 'small blue diamond', 667 | category: 'symbols', 668 | }, 669 | { 670 | codes: '1F53A', 671 | char: '🔺', 672 | name: 'red triangle pointed up', 673 | category: 'symbols', 674 | }, 675 | { 676 | codes: '1F53B', 677 | char: '🔻', 678 | name: 'red triangle pointed down', 679 | category: 'symbols', 680 | }, 681 | { 682 | codes: '1F4A0', 683 | char: '💠', 684 | name: 'diamond with a dot', 685 | category: 'symbols', 686 | }, 687 | { 688 | codes: '1F518', 689 | char: '🔘', 690 | name: 'radio button', 691 | category: 'symbols', 692 | }, 693 | { 694 | codes: '1F533', 695 | char: '🔳', 696 | name: 'white square button', 697 | category: 'symbols', 698 | }, 699 | { 700 | codes: '1F532', 701 | char: '🔲', 702 | name: 'black square button', 703 | category: 'symbols', 704 | }, 705 | ]; 706 | -------------------------------------------------------------------------------- /src/assets/fonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/fonts/fa-brands-400.eot -------------------------------------------------------------------------------- /src/assets/fonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/fonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /src/assets/fonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/fonts/fa-brands-400.woff -------------------------------------------------------------------------------- /src/assets/fonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/fonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/fonts/fa-regular-400.eot -------------------------------------------------------------------------------- /src/assets/fonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/fonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /src/assets/fonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/fonts/fa-regular-400.woff -------------------------------------------------------------------------------- /src/assets/fonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/fonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/fonts/fa-solid-900.eot -------------------------------------------------------------------------------- /src/assets/fonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/fonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /src/assets/fonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/fonts/fa-solid-900.woff -------------------------------------------------------------------------------- /src/assets/fonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/fonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /src/assets/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/images/icon.png -------------------------------------------------------------------------------- /src/assets/images/reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mojimojicorp/MojimojiEmoji/f3cc57108b1bd7d89df7a09b4d013bf33275af85/src/assets/images/reset.png -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MojiMoji Emoji 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 |
14 | 17 |
18 | 19 |
20 |
21 | 22 |
23 |
24 | 25 |
26 |
27 | 28 | 40 | 41 | 42 |
43 |
44 |
45 |
46 | 47 | 48 |
49 | 50 |
51 | 52 | 55 | 56 | 57 |
58 |
59 | 60 | 61 |
62 |
63 | 64 | go back 65 |
66 | 67 |
68 |
69 | Auto copy 70 |
71 | 72 | 73 |
74 |
75 | 76 |
77 | Panel emoji size 78 |
79 | 80 | 81 | 82 |
83 |
84 | 85 |
86 | Recent 87 |
88 | 89 | 90 | 91 | 92 |
93 |
94 |
95 | 96 |
97 |
98 | 99 | MojiMoji Emoji by Eternal 100 |
101 |
102 |
103 | 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /src/js/components/index.js: -------------------------------------------------------------------------------- 1 | import makeNav from './nav.js'; 2 | import makeSkintoneButtons from './skintoneButtons.js'; 3 | 4 | const makeInitialView = () => { 5 | makeNav(); 6 | makeSkintoneButtons(); 7 | }; 8 | 9 | export default makeInitialView; 10 | -------------------------------------------------------------------------------- /src/js/components/nav.js: -------------------------------------------------------------------------------- 1 | import Doc from '../utils/doc.js'; 2 | import Cons from '../utils/const.js'; 3 | 4 | export default function makeNav() { 5 | const nav = Doc.find('.emoji-nav'); 6 | const navDivs = document.createDocumentFragment(); 7 | 8 | Cons.NAV_NAME_LIST.forEach((name, index) => { 9 | const navDiv = Doc.create('div'); 10 | 11 | navDiv.className = index === 0 ? 'nav-recent' : `nav${index}`; 12 | 13 | const btnOfLink = Doc.create('a'); 14 | btnOfLink.className = 'btn'; 15 | btnOfLink.href = `#${name}`; 16 | 17 | const icon = Doc.create('i'); 18 | icon.className = `fas ${Cons.NAV_ICON_LIST[index]} fa-2x`; 19 | btnOfLink.appendChild(icon); 20 | 21 | navDiv.appendChild(btnOfLink); 22 | navDivs.appendChild(navDiv); 23 | }); 24 | 25 | nav.appendChild(navDivs); 26 | } 27 | -------------------------------------------------------------------------------- /src/js/components/recent/removeDuplicate.js: -------------------------------------------------------------------------------- 1 | export default function removeDuplicate(array) { 2 | return array.reduce((acc, current) => { 3 | const isDuplicated = acc.find((item) => item.name === current.name); 4 | if (!isDuplicated) { 5 | return acc.concat([current]); 6 | } 7 | return acc; 8 | }, []); 9 | } 10 | -------------------------------------------------------------------------------- /src/js/components/recent/renderRecent.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | import Doc from '../../utils/doc.js'; 3 | 4 | function renderRecent() { 5 | const recentGroup = Doc.find('.recent-group .emoji-span-container'); 6 | const recent = JSON.parse(localStorage.getItem('recent')); 7 | const recentNum = localStorage.getItem('recentNum'); 8 | const sizeSetting = localStorage.getItem('emojiSize'); 9 | 10 | recentGroup.textContent = ''; 11 | 12 | if (!recent) return; 13 | 14 | // recentNum보다 길이가 길면 잘라서 localstorage에 저장 15 | if (recent.length > recentNum) { 16 | recent.splice(recentNum); 17 | localStorage.setItem('recent', JSON.stringify(recent)); 18 | } 19 | 20 | // localstorage에 있는 recent를 html에 붙여주기 21 | recent.forEach((data) => { 22 | const span = Doc.create('span'); 23 | span.setAttribute('class', `emoji-span ${sizeSetting}`); 24 | span.setAttribute('title', data.name); 25 | span.textContent = data.char; 26 | twemoji.parse(span); 27 | recentGroup.appendChild(span); 28 | }); 29 | 30 | } 31 | 32 | export default renderRecent; 33 | -------------------------------------------------------------------------------- /src/js/components/recent/updateRecent.js: -------------------------------------------------------------------------------- 1 | import removeDuplicate from './removeDuplicate.js'; 2 | import renderRecent from './renderRecent.js'; 3 | 4 | function updateRecent(name, char) { 5 | const recentStorage = localStorage.getItem('recent'); 6 | 7 | if (!recentStorage) { 8 | localStorage.setItem('recent', JSON.stringify([{ name, char }])); 9 | } else { 10 | let charArr = []; 11 | const parsedStorage = JSON.parse(recentStorage); 12 | parsedStorage.forEach((data) => { 13 | charArr.push(data); 14 | }); 15 | 16 | charArr.unshift({ name, char }); 17 | charArr = removeDuplicate(charArr); 18 | localStorage.setItem('recent', JSON.stringify(charArr)); 19 | } 20 | 21 | renderRecent(); 22 | } 23 | 24 | export default updateRecent; 25 | -------------------------------------------------------------------------------- /src/js/components/skintoneButtons.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | import Doc from '../utils/doc.js'; 3 | 4 | const skintones = [ 5 | { code: '1F3FB', name: 'light-skin-tone' }, 6 | { code: '1F3FC', name: 'medium-light-skin-tone' }, 7 | { code: '1F3FD', name: 'medium-skin-tone' }, 8 | { code: '1F3FE', name: 'medium-dark-skin-tone' }, 9 | { code: '1F3FF', name: 'dark-skin-tone' }, 10 | ]; 11 | 12 | export default function makeSkintoneButtons() { 13 | const skintoneButtonsContainer = Doc.find('.color'); 14 | 15 | skintones.forEach((skintone) => { 16 | const emojiCode = twemoji.convert.fromCodePoint(skintone.code); 17 | const span = Doc.create('span'); 18 | 19 | span.setAttribute('class', `skin-tone ${skintone.name}`); 20 | span.innerHTML = twemoji.parse(emojiCode); 21 | 22 | const img = span.querySelector('img'); 23 | img.className = 'emoji-color'; 24 | 25 | skintoneButtonsContainer.appendChild(span); 26 | }); 27 | } 28 | -------------------------------------------------------------------------------- /src/js/dist/twemoji.min.js: -------------------------------------------------------------------------------- 1 | /*! Copyright Twitter Inc. and other contributors. Licensed under MIT */ 2 | var twemoji=function(){"use strict";var twemoji={base:"https://twemoji.maxcdn.com/v/12.1.2/",ext:".png",size:"72x72",className:"emoji",convert:{fromCodePoint:fromCodePoint,toCodePoint:toCodePoint},onerror:function onerror(){if(this.parentNode){this.parentNode.replaceChild(createText(this.alt,false),this)}},parse:parse,replace:replace,test:test},escaper={"&":"&","<":"<",">":">","'":"'",'"':"""},re=/(?:\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffb|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffb|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffb|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb\udffc]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udffd]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d])|(?:\ud83d[\udc68\udc69])(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a-\udc6d\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5\udeeb\udeec\udef4-\udefa\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd71\udd73-\udd76\udd7a-\udda2\udda5-\uddaa\uddae-\uddb4\uddb7\uddba\uddbc-\uddca\uddd0\uddde-\uddff\ude70-\ude73\ude78-\ude7a\ude80-\ude82\ude90-\ude95]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g,UFE0Fg=/\uFE0F/g,U200D=String.fromCharCode(8205),rescaper=/[&<>'"]/g,shouldntBeParsed=/^(?:iframe|noframes|noscript|script|select|style|textarea)$/,fromCharCode=String.fromCharCode;return twemoji;function createText(text,clean){return document.createTextNode(clean?text.replace(UFE0Fg,""):text)}function escapeHTML(s){return s.replace(rescaper,replacer)}function defaultImageSrcGenerator(icon,options){return"".concat(options.base,options.size,"/",icon,options.ext)}function grabAllTextNodes(node,allText){var childNodes=node.childNodes,length=childNodes.length,subnode,nodeType;while(length--){subnode=childNodes[length];nodeType=subnode.nodeType;if(nodeType===3){allText.push(subnode)}else if(nodeType===1&&!("ownerSVGElement"in subnode)&&!shouldntBeParsed.test(subnode.nodeName.toLowerCase())){grabAllTextNodes(subnode,allText)}}return allText}function grabTheRightIcon(rawText){return toCodePoint(rawText.indexOf(U200D)<0?rawText.replace(UFE0Fg,""):rawText)}function parseNode(node,options){var allText=grabAllTextNodes(node,[]),length=allText.length,attrib,attrname,modified,fragment,subnode,text,match,i,index,img,rawText,iconId,src;while(length--){modified=false;fragment=document.createDocumentFragment();subnode=allText[length];text=subnode.nodeValue;i=0;while(match=re.exec(text)){index=match.index;if(index!==i){fragment.appendChild(createText(text.slice(i,index),true))}rawText=match[0];iconId=grabTheRightIcon(rawText);i=index+rawText.length;src=options.callback(iconId,options);if(iconId&&src){img=new Image;img.onerror=options.onerror;img.setAttribute("draggable","false");attrib=options.attributes(rawText,iconId);for(attrname in attrib){if(attrib.hasOwnProperty(attrname)&&attrname.indexOf("on")!==0&&!img.hasAttribute(attrname)){img.setAttribute(attrname,attrib[attrname])}}img.className=options.className;img.alt=rawText;img.src=src;modified=true;fragment.appendChild(img)}if(!img)fragment.appendChild(createText(rawText,false));img=null}if(modified){if(i")}return ret})}function replacer(m){return escaper[m]}function returnNull(){return null}function toSizeSquaredAsset(value){return typeof value==="number"?value+"x"+value:value}function fromCodePoint(codepoint){var code=typeof codepoint==="string"?parseInt(codepoint,16):codepoint;if(code<65536){return fromCharCode(code)}code-=65536;return fromCharCode(55296+(code>>10),56320+(code&1023))}function parse(what,how){if(!how||typeof how==="function"){how={callback:how}}return(typeof what==="string"?parseString:parseNode)(what,{callback:how.callback||defaultImageSrcGenerator,attributes:typeof how.attributes==="function"?how.attributes:returnNull,base:typeof how.base==="string"?how.base:twemoji.base,ext:how.ext||twemoji.ext,size:how.folder||toSizeSquaredAsset(how.size||twemoji.size),className:how.className||twemoji.className,onerror:how.onerror||twemoji.onerror})}function replace(text,callback){return String(text).replace(re,callback)}function test(text){re.lastIndex=0;var result=re.test(text);re.lastIndex=0;return result}function toCodePoint(unicodeSurrogates,sep){var r=[],c=0,p=0,i=0;while(i { 20 | localStorage.setItem('copy', 'auto'); 21 | 22 | copybtn[0].classList.add('active'); 23 | copybtn[1].classList.remove('active'); 24 | btnReset(); 25 | removeAutoCopyOffEvent(); 26 | addAutoCopyOnEvent(); 27 | }); 28 | 29 | copybtn[1].addEventListener('click', () => { 30 | localStorage.setItem('copy', 'manual'); 31 | 32 | copybtn[0].classList.remove('active'); 33 | copybtn[1].classList.add('active'); 34 | btnReset(); 35 | removeAutoCopyOnEvent(); 36 | addAutoCopyOffEvent(); 37 | }); 38 | } 39 | 40 | export default addCopySettingButtonEvent; 41 | -------------------------------------------------------------------------------- /src/js/events/buttonEvent/github.js: -------------------------------------------------------------------------------- 1 | export default function addGithubBtnEvent() { 2 | const githubIcon = document.querySelector('.fa-github'); 3 | githubIcon.addEventListener('click', () => { 4 | // eslint-disable-next-line no-undef 5 | whale.tabs.create({ 6 | url: 'https://github.com/mojimojicorp/EmojiByEternal', 7 | }); 8 | }); 9 | } 10 | -------------------------------------------------------------------------------- /src/js/events/buttonEvent/goback.js: -------------------------------------------------------------------------------- 1 | export default function addGobackBtnEvent() { 2 | const goback = document.querySelector('.goback'); 3 | goback.addEventListener('click', () => { 4 | const emojiContainer = document.querySelector('.emoji-container'); 5 | const footer = document.querySelector('.footer'); 6 | emojiContainer.setAttribute('style', 'display: block;'); 7 | footer.setAttribute('style', 'display: block;'); 8 | 9 | const div = document.querySelector('.setting-container'); 10 | div.setAttribute('style', 'display: none;'); 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /src/js/events/buttonEvent/index.js: -------------------------------------------------------------------------------- 1 | import addResetBtnEvent from './reset.js'; 2 | import addCopyBtnEvent from './copy.js'; 3 | import addGoSettingBtnEvent from './setting.js'; 4 | import addGithubBtnEvent from './github.js'; 5 | import addGobackBtnEvent from './goback.js'; 6 | import addCopySettingButtonEvent from './copySetting.js'; 7 | import addRecentSettingButtonEvent from './recentSetting.js'; 8 | import addSizeSettingButtonEvent from './sizeSetting.js'; 9 | import addPanelButtonEvent from './panel.js'; 10 | 11 | const addButtonEvents = () => { 12 | addResetBtnEvent(); 13 | addCopyBtnEvent(); 14 | addGoSettingBtnEvent(); 15 | addGithubBtnEvent(); 16 | addGobackBtnEvent(); 17 | addCopySettingButtonEvent(); 18 | addRecentSettingButtonEvent(); 19 | addSizeSettingButtonEvent(); 20 | addPanelButtonEvent(); 21 | }; 22 | 23 | export default addButtonEvents; 24 | -------------------------------------------------------------------------------- /src/js/events/buttonEvent/panel.js: -------------------------------------------------------------------------------- 1 | import Doc from '../../utils/doc.js'; 2 | 3 | const panelBtn = Doc.findAll('.panel'); 4 | 5 | function toPanel() { 6 | whale.windows.create({ 7 | url: 'app/index.html', 8 | width: 405, 9 | height: 545, 10 | top: 150, 11 | left: 1250, 12 | type: 'panel', 13 | }); 14 | 15 | window.close(); 16 | } 17 | 18 | export default function addPanelButtonEvent() { 19 | const windowState = localStorage.getItem('windowState'); 20 | 21 | panelBtn[0].addEventListener('click', () => { 22 | if (windowState === 'popup') { 23 | localStorage.setItem('windowState', 'panel'); 24 | toPanel(); 25 | } else { 26 | localStorage.setItem('windowState', 'popup'); 27 | window.close(); 28 | } 29 | }); 30 | } -------------------------------------------------------------------------------- /src/js/events/buttonEvent/recentSetting.js: -------------------------------------------------------------------------------- 1 | import Doc from '../../utils/doc.js'; 2 | import renderRecent from '../../components/recent/renderRecent.js'; 3 | 4 | const recentBtns = Doc.findAll('.recentBtn'); 5 | 6 | function addRecentSettingButtonEvent() { 7 | recentBtns[0].addEventListener('click', () => { 8 | localStorage.setItem('recentNum', 0); 9 | 10 | recentBtns[0].classList.add('active'); 11 | recentBtns[1].classList.remove('active'); 12 | recentBtns[2].classList.remove('active'); 13 | recentBtns[3].classList.remove('active'); 14 | 15 | localStorage.removeItem('recent'); 16 | renderRecent(); 17 | }); 18 | 19 | recentBtns[1].addEventListener('click', () => { 20 | localStorage.setItem('recentNum', 10); 21 | 22 | recentBtns[0].classList.remove('active'); 23 | recentBtns[1].classList.add('active'); 24 | recentBtns[2].classList.remove('active'); 25 | recentBtns[3].classList.remove('active'); 26 | 27 | renderRecent(); 28 | }); 29 | 30 | recentBtns[2].addEventListener('click', () => { 31 | localStorage.setItem('recentNum', 20); 32 | 33 | recentBtns[0].classList.remove('active'); 34 | recentBtns[1].classList.remove('active'); 35 | recentBtns[2].classList.add('active'); 36 | recentBtns[3].classList.remove('active'); 37 | 38 | renderRecent(); 39 | }); 40 | 41 | recentBtns[3].addEventListener('click', () => { 42 | localStorage.setItem('recentNum', 30); 43 | 44 | recentBtns[0].classList.remove('active'); 45 | recentBtns[1].classList.remove('active'); 46 | recentBtns[2].classList.remove('active'); 47 | recentBtns[3].classList.add('active'); 48 | 49 | renderRecent(); 50 | }); 51 | } 52 | 53 | export default addRecentSettingButtonEvent; 54 | -------------------------------------------------------------------------------- /src/js/events/buttonEvent/reset.js: -------------------------------------------------------------------------------- 1 | import Doc from '../../utils/doc.js'; 2 | 3 | const group = Doc.find('#copy_group'); 4 | const resetBtn = Doc.find('#reset_btn'); 5 | 6 | export default function addResetBtnEvent() { 7 | resetBtn.addEventListener( 8 | 'click', 9 | () => { 10 | group.value = ''; 11 | }, 12 | false 13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /src/js/events/buttonEvent/setting.js: -------------------------------------------------------------------------------- 1 | import Doc from '../../utils/doc.js'; 2 | 3 | export default function addGoSettingButtonEvent() { 4 | const settingButton = Doc.find('.setting'); 5 | settingButton.addEventListener('click', () => { 6 | const emojiContainer = Doc.find('.emoji-container'); 7 | emojiContainer.setAttribute('style', 'display: none;'); 8 | 9 | const footer = Doc.find('.footer'); 10 | footer.setAttribute('style', 'display: none;'); 11 | 12 | const settingContainer = Doc.find('.setting-container'); 13 | settingContainer.setAttribute('style', 'display: block;'); 14 | }); 15 | } 16 | -------------------------------------------------------------------------------- /src/js/events/buttonEvent/sizeSetting.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-param-reassign */ 2 | import Doc from '../../utils/doc.js'; 3 | 4 | const sizeBtns = Doc.findAll('.sizeBtn'); 5 | 6 | function setEmojiSize(newSize, emojiSpans) { 7 | emojiSpans.forEach((emoji) => { 8 | const size = emoji.classList.item(1); 9 | if (size !== null) { 10 | emoji.classList.remove(size); 11 | emoji.classList.add(newSize); 12 | } 13 | }); 14 | } 15 | 16 | function addSizeSettingButtonEvent() { 17 | const emojiSpans = Doc.findAll('.emoji-span'); 18 | 19 | sizeBtns[0].addEventListener('click', () => { 20 | localStorage.setItem('emojiSize', 'small'); 21 | 22 | // 버튼 css 변경 23 | sizeBtns[0].classList.add('active'); 24 | sizeBtns[1].classList.remove('active'); 25 | sizeBtns[2].classList.remove('active'); 26 | 27 | // emoji size 조정 28 | setEmojiSize('small', emojiSpans); 29 | }); 30 | 31 | sizeBtns[1].addEventListener('click', () => { 32 | localStorage.setItem('emojiSize', 'normal'); 33 | 34 | // 버튼 css 변경 35 | sizeBtns[0].classList.remove('active'); 36 | sizeBtns[1].classList.add('active'); 37 | sizeBtns[2].classList.remove('active'); 38 | 39 | // emoji size 조정 40 | setEmojiSize('normal', emojiSpans); 41 | }); 42 | 43 | sizeBtns[2].addEventListener('click', () => { 44 | localStorage.setItem('emojiSize', 'big'); 45 | 46 | // 버튼 css 변경 47 | sizeBtns[0].classList.remove('active'); 48 | sizeBtns[1].classList.remove('active'); 49 | sizeBtns[2].classList.add('active'); 50 | 51 | // emoji size 조정 52 | setEmojiSize('big', emojiSpans); 53 | }); 54 | } 55 | 56 | export default addSizeSettingButtonEvent; 57 | -------------------------------------------------------------------------------- /src/js/events/buttonEvent/skintone.js: -------------------------------------------------------------------------------- 1 | import Doc from '../../utils/doc.js'; 2 | 3 | export default function addSkintoneButtonEvent() { 4 | const skintoneButtonsContainer = Doc.find('.color'); 5 | 6 | skintoneButtonsContainer.addEventListener('click', (e) => { 7 | const emojiSpans = Doc.findAll('.emoji-span'); 8 | 9 | if (e.target.tagName !== 'IMG') return; 10 | 11 | const color = e.target.parentNode.classList[1]; 12 | 13 | emojiSpans.forEach((emoji) => { 14 | const separator = emoji.title.indexOf(':'); 15 | if (separator === -1) return; 16 | 17 | if (emoji.title.slice(separator) === `: ${color}`) { 18 | emoji.style.display = ''; 19 | } else emoji.style.display = 'none'; 20 | }); 21 | }); 22 | } 23 | -------------------------------------------------------------------------------- /src/js/events/emojiEvent/autoCopyOff.js: -------------------------------------------------------------------------------- 1 | import Doc from '../../utils/doc.js'; 2 | import updateRecent from '../../components/recent/updateRecent.js'; 3 | 4 | const groups = Doc.find('.groups'); 5 | 6 | function autoCopyOff(e) { 7 | if (e.target.tagName !== 'IMG') return; 8 | const copyGroup = Doc.find('#copy_group'); 9 | const content = copyGroup.value; 10 | 11 | copyGroup.value = content.concat(e.target.alt); 12 | updateRecent(e.target.parentElement.title, e.target.alt); 13 | } 14 | 15 | function addAutoCopyOffEvent() { 16 | groups.addEventListener('click', autoCopyOff); 17 | } 18 | 19 | function removeAutoCopyOffEvent() { 20 | groups.removeEventListener('click', autoCopyOff); 21 | } 22 | 23 | export { addAutoCopyOffEvent, removeAutoCopyOffEvent }; 24 | -------------------------------------------------------------------------------- /src/js/events/emojiEvent/autoCopyOn.js: -------------------------------------------------------------------------------- 1 | import Doc from '../../utils/doc.js'; 2 | import copy from '../../pages/main/event/copy.js'; 3 | import updateRecent from '../../components/recent/updateRecent.js'; 4 | 5 | const groups = Doc.find('.groups'); 6 | 7 | function autoCopyOn(e) { 8 | if (e.target.tagName !== 'IMG') return; 9 | const copyGroup = Doc.find('#copy_group'); 10 | const content = copyGroup.value; 11 | 12 | copyGroup.value = content.concat(e.target.alt); 13 | copy(); 14 | updateRecent(e.target.parentElement.title, e.target.alt); 15 | } 16 | 17 | function addAutoCopyOnEvent() { 18 | groups.addEventListener('click', autoCopyOn); 19 | } 20 | 21 | function removeAutoCopyOnEvent() { 22 | groups.removeEventListener('click', autoCopyOn); 23 | } 24 | 25 | export { addAutoCopyOnEvent, removeAutoCopyOnEvent }; 26 | -------------------------------------------------------------------------------- /src/js/events/emojiEvent/index.js: -------------------------------------------------------------------------------- 1 | import { addAutoCopyOnEvent } from './autoCopyOn.js'; 2 | import { addAutoCopyOffEvent } from './autoCopyOff.js'; 3 | 4 | const emojiEvent = { 5 | addAutoCopyOnEvent, 6 | addAutoCopyOffEvent, 7 | }; 8 | 9 | export default emojiEvent; 10 | -------------------------------------------------------------------------------- /src/js/events/inputEvent/search.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-param-reassign */ 2 | import Doc from '../../utils/doc.js'; 3 | 4 | export default function addSearchInputEvent() { 5 | 6 | Doc.find('#searchInput').addEventListener('change', (e) => { 7 | const searchInput = e.target.value.toUpperCase(); 8 | 9 | const emojiElements = Doc.findAll('.emoji-span'); 10 | emojiElements.forEach((emoji) => { 11 | const title = emoji.getAttribute('title'); 12 | if (title.toUpperCase().includes(searchInput)) { 13 | emoji.style.display = ''; 14 | } else { 15 | emoji.style.display = 'none'; 16 | } 17 | }); 18 | }); 19 | } 20 | -------------------------------------------------------------------------------- /src/js/pages/main/event/copy.js: -------------------------------------------------------------------------------- 1 | import Doc from '../../../utils/doc.js'; 2 | 3 | const group = Doc.find('#copy_group'); 4 | const copyBtn = Doc.find('#copy_btn'); 5 | 6 | const setCopyBtnComplete = () => { 7 | copyBtn.style.opacity = '0.5'; 8 | 9 | setTimeout(() => { 10 | copyBtn.style.opacity = '1.0'; 11 | copyBtn.value = 'copied!'; 12 | }, 200); 13 | }; 14 | 15 | const copy = () => { 16 | navigator.clipboard 17 | .writeText(group.value) 18 | .then(() => { 19 | setCopyBtnComplete(); 20 | }) 21 | .catch(() => {}); 22 | }; 23 | 24 | export default copy; 25 | -------------------------------------------------------------------------------- /src/js/pages/main/event/getEmoji.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | import Doc from '../../../utils/doc.js'; 3 | import renderRecent from '../../../components/recent/renderRecent.js'; 4 | import emojis from '../../../../assets/emojis/index.js'; 5 | 6 | const attachEmoji = () => { 7 | const containers = Doc.findAll('.emoji-span-container'); 8 | const size = localStorage.getItem('emojiSize'); 9 | emojis.forEach((emoji) => { 10 | if (window.Worker) { 11 | const worker = new Worker(new URL('../../../../worker.js', import.meta.url)); 12 | 13 | worker.postMessage(emoji); 14 | 15 | worker.onmessage = (e) => { 16 | 17 | let category = 0; 18 | switch (e.data[0].category){ 19 | case 'skin-tone' : 20 | category = 0; break; 21 | case 'people': 22 | category = 1; break; 23 | case 'nature' : 24 | category = 2; break; 25 | case 'activity' : 26 | category = 3; break; 27 | case 'foodAndDrink' : 28 | category = 4; break; 29 | case 'places' : 30 | category = 5; break; 31 | case 'objects' : 32 | category = 6; break; 33 | case 'symbols' : 34 | category = 7; break; 35 | case 'flags' : 36 | category = 8; break; 37 | } 38 | 39 | e.data.forEach((data) => { 40 | const span = Doc.create('span'); 41 | span.setAttribute('class', `emoji-span ${size}`); 42 | span.setAttribute('title', data.name); 43 | span.innerHTML = data.char; 44 | 45 | if (category === 0){ 46 | span.setAttribute('style', 'display:none;'); 47 | } 48 | 49 | if (category === 1 && data.name.includes('skin-tone')){ 50 | span.setAttribute('style', 'display:none;'); 51 | } 52 | containers[category].appendChild(span); 53 | }); 54 | }; 55 | } else { 56 | // console.log('Your browser doesn\'t support web workers.'); 57 | } 58 | }); 59 | }; 60 | 61 | export default function getEmoji() { 62 | return new Promise((resolve) => { 63 | 64 | 65 | attachEmoji(); 66 | renderRecent(); 67 | 68 | resolve(); 69 | }); 70 | } 71 | -------------------------------------------------------------------------------- /src/js/pages/main/view/emojiContainers.js: -------------------------------------------------------------------------------- 1 | import Doc from '../../../utils/doc.js'; 2 | import Cons from '../../../utils/const.js'; 3 | 4 | export default function makeEmojiContainers() { 5 | const emojiGroup = Doc.find('.emoji-list .groups'); 6 | const groupDivs = document.createDocumentFragment(); 7 | 8 | Cons.NAV_ICON_LIST.forEach((icon, index) => { 9 | const groupDiv = Doc.create('div'); 10 | groupDiv.className = index === 0 ? 'recent-group' : 'group'; 11 | 12 | const groupTitle = Doc.create('div'); 13 | groupTitle.className = 'group-title'; 14 | groupDiv.appendChild(groupTitle); 15 | 16 | const a = Doc.create('a'); 17 | a.name = Cons.NAV_NAME_LIST[index]; 18 | a.innerHTML = Cons.NAV_TEXT_LIST[index]; 19 | groupTitle.appendChild(a); 20 | 21 | const i = Doc.create('i'); 22 | i.className = `fas ${icon}`; 23 | a.appendChild(i); 24 | 25 | const emojiContainer = Doc.create('div'); 26 | emojiContainer.className = 'emoji-span-container'; 27 | if (index !== 1) { 28 | emojiContainer.style.display = 'flex'; 29 | emojiContainer.style.width = '100%'; 30 | emojiContainer.style.cursor = 'pointer'; 31 | } 32 | groupDiv.appendChild(emojiContainer); 33 | 34 | if (index === 1) { 35 | const expression = Doc.create('div'); 36 | expression.className = 'expression'; 37 | emojiContainer.appendChild(expression); 38 | 39 | const skintone = Doc.create('div'); 40 | skintone.className = 'skintone'; 41 | emojiContainer.appendChild(skintone); 42 | } 43 | 44 | groupDivs.appendChild(groupDiv); 45 | }); 46 | 47 | emojiGroup.appendChild(groupDivs); 48 | } 49 | -------------------------------------------------------------------------------- /src/js/pages/settings/view/init.js: -------------------------------------------------------------------------------- 1 | import Doc from '../../../utils/doc.js'; 2 | 3 | function setSettingButtonsCss() { 4 | const copybtns = Doc.findAll('.autocopyBtn'); 5 | const recentBtns = Doc.findAll('.recentBtn'); 6 | const sizeBtns = Doc.findAll('.sizeBtn'); 7 | 8 | const copySetting = localStorage.getItem('copy'); 9 | const recentSetting = localStorage.getItem('recentNum'); 10 | const sizeSetting = localStorage.getItem('emojiSize'); 11 | 12 | switch (copySetting) { 13 | case 'auto': 14 | copybtns[0].classList.add('active'); 15 | break; 16 | case 'manual': 17 | copybtns[1].classList.add('active'); 18 | break; 19 | } 20 | 21 | switch (recentSetting) { 22 | case '0': 23 | recentBtns[0].classList.add('active'); 24 | break; 25 | case '10': 26 | recentBtns[1].classList.add('active'); 27 | break; 28 | case '20': 29 | recentBtns[2].classList.add('active'); 30 | break; 31 | case '30': 32 | recentBtns[3].classList.add('active'); 33 | break; 34 | } 35 | 36 | switch (sizeSetting) { 37 | case 'small': 38 | sizeBtns[0].classList.add('active'); 39 | break; 40 | case 'normal': 41 | sizeBtns[1].classList.add('active'); 42 | break; 43 | case 'big': 44 | sizeBtns[2].classList.add('active'); 45 | break; 46 | } 47 | } 48 | 49 | export default function initialSetting() { 50 | return new Promise((resolve) => { 51 | // 프로그램 첫 로드 시 Localstorage setting 52 | if (!localStorage.getItem('hasInitialSetting')) { 53 | localStorage.setItem('hasInitialSetting', true); 54 | localStorage.setItem('copy', 'auto'); 55 | localStorage.setItem('emojiSize', 'normal'); 56 | localStorage.setItem('recentNum', 20); 57 | localStorage.setItem('windowState', 'popup'); 58 | } 59 | setSettingButtonsCss(); 60 | 61 | resolve(); 62 | }); 63 | } 64 | -------------------------------------------------------------------------------- /src/js/utils/const.js: -------------------------------------------------------------------------------- 1 | const Cons = { 2 | NAV_NAME_LIST: [ 3 | 'recents', 4 | 'people', 5 | 'nature', 6 | 'foodAndDrink', 7 | 'activity', 8 | 'places', 9 | 'objects', 10 | 'symbols', 11 | 'flags', 12 | ], 13 | NAV_ICON_LIST: [ 14 | 'fa-history', 15 | 'fa-smile', 16 | 'fa-paw', 17 | 'fa-utensils', 18 | 'fa-basketball-ball', 19 | 'fa-car', 20 | 'fa-lightbulb', 21 | 'fa-icons', 22 | 'fa-flag', 23 | ], 24 | 25 | NAV_TEXT_LIST: [ 26 | 'Recents', 27 | 'People', 28 | 'Nature', 29 | 'Food & Drink', 30 | 'Activity', 31 | 'Places', 32 | 'Objects', 33 | 'Symbols', 34 | 'Flags', 35 | ], 36 | }; 37 | 38 | export default Cons; 39 | -------------------------------------------------------------------------------- /src/js/utils/doc.js: -------------------------------------------------------------------------------- 1 | const Doc = { 2 | find: (selector) => document.querySelector(selector), 3 | findAll: (selector) => document.querySelectorAll(selector), 4 | create: (type) => document.createElement(type), 5 | }; 6 | 7 | export default Doc; 8 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import initialSetting from './js/pages/settings/view/init.js'; 2 | import makeEmojiContainers from './js/pages/main/view/emojiContainers.js'; 3 | import getEmoji from './js/pages/main/event/getEmoji.js'; 4 | import makeInitialView from './js/components/index.js'; 5 | import addButtonEvents from './js/events/buttonEvent/index.js'; 6 | import addSkintoneButtonEvent from './js/events/buttonEvent/skintone.js'; 7 | import emojiEvent from './js/events/emojiEvent/index.js'; 8 | import addSearchInputEvents from './js/events/inputEvent/search.js'; 9 | 10 | function setInit() { 11 | makeInitialView(); 12 | initialSetting(); 13 | } 14 | 15 | function addEventsRelatedEmoji() { 16 | addSkintoneButtonEvent(); 17 | addSearchInputEvents(); 18 | 19 | const copySetting = localStorage.getItem('copy'); 20 | if (copySetting === 'auto') { 21 | emojiEvent.addAutoCopyOnEvent(); 22 | } else if (copySetting === 'manual') { 23 | emojiEvent.addAutoCopyOffEvent(); 24 | } 25 | } 26 | 27 | async function setEmoji() { 28 | makeEmojiContainers(); 29 | await getEmoji(); 30 | addEventsRelatedEmoji(); 31 | } 32 | 33 | async function main() { 34 | await setInit(); 35 | await setEmoji(); 36 | addButtonEvents(); 37 | } 38 | 39 | main(); 40 | -------------------------------------------------------------------------------- /src/worker.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-undef 2 | importScripts('./js/dist/twemoji.min.js'); 3 | 4 | onmessage = (e) => { 5 | e.data.forEach((emoji) => { 6 | emoji.char = twemoji.parse(emoji.char); 7 | }); 8 | 9 | postMessage(e.data); 10 | }; 11 | 12 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 3 | const CopyPlugin = require('copy-webpack-plugin'); 4 | 5 | module.exports = { 6 | entry: { 7 | main: './src/main.js', 8 | }, 9 | output: { 10 | filename: './src/[name].js', 11 | path: path.resolve(__dirname, 'build'), 12 | clean: true, 13 | }, 14 | module: { 15 | rules: [ 16 | { 17 | test: /\.css$/i, 18 | use: ['css-loader'], 19 | }, 20 | { 21 | test: /\.(png|svg|jpg|jpeg|gif)$/i, 22 | type: 'asset/resource', 23 | }, 24 | { 25 | test: /\.(woff|woff2|eot|ttf|otf)$/i, 26 | type: 'asset/resource', 27 | }, 28 | ], 29 | }, 30 | plugins: [ 31 | new HtmlWebpackPlugin({ template: './src/index.html', filename: 'src/index.html' }), 32 | new CopyPlugin({ 33 | patterns: [ 34 | { from: './manifest.json' }, 35 | { from: './src/js/dist/twemoji.min.js', to: './src/js/dist/twemoji.min.js' }, 36 | { from: './src/assets', to: './src/assets' }, 37 | ], 38 | }), 39 | ], 40 | }; --------------------------------------------------------------------------------