@devchitchat/chat 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/README.md +313 -0
  2. package/index.js +148 -0
  3. package/migrate/001-drop-channel-invites.js +3 -0
  4. package/migrate/002-invite-initial-roles.js +5 -0
  5. package/migrate/003-dm-channels.js +35 -0
  6. package/migrate/004-notifications.js +15 -0
  7. package/migrate/005-uploads.js +21 -0
  8. package/migrate/006-mention-priority.js +3 -0
  9. package/migrate/007-push-subscriptions.js +14 -0
  10. package/migrate/008-messages-channel-seq-index.js +3 -0
  11. package/migrate/009-message-reactions.js +15 -0
  12. package/migrate/010-edit-messages.js +7 -0
  13. package/package.json +51 -0
  14. package/pages/_error.html +12 -0
  15. package/pages/_layout.html +31 -0
  16. package/pages/_layout.js +13 -0
  17. package/pages/admin/_layout.html +52 -0
  18. package/pages/admin/_layout.js +8 -0
  19. package/pages/admin/bots/[userId].js +88 -0
  20. package/pages/admin/bots/[userId].phtml +89 -0
  21. package/pages/admin/bots/index.js +41 -0
  22. package/pages/admin/bots/index.phtml +58 -0
  23. package/pages/admin/index.js +8 -0
  24. package/pages/admin/invites/index.js +72 -0
  25. package/pages/admin/invites/index.phtml +88 -0
  26. package/pages/admin/users/[userId].js +60 -0
  27. package/pages/admin/users/[userId].phtml +57 -0
  28. package/pages/admin/users/index.js +20 -0
  29. package/pages/admin/users/index.phtml +37 -0
  30. package/pages/api/uploads/index.js +66 -0
  31. package/pages/api/user/settings.js +26 -0
  32. package/pages/auth/signout.js +14 -0
  33. package/pages/channels/[channelId].js +99 -0
  34. package/pages/channels/[channelId].phtml +173 -0
  35. package/pages/index.js +33 -0
  36. package/pages/invite/[token].js +10 -0
  37. package/pages/login/index.js +57 -0
  38. package/pages/login/index.phtml +29 -0
  39. package/pages/public/client/action-sheet.js +77 -0
  40. package/pages/public/client/app.js +38 -0
  41. package/pages/public/client/auth-tabs.js +13 -0
  42. package/pages/public/client/emoji-data.js +197 -0
  43. package/pages/public/client/islands/call.js +1770 -0
  44. package/pages/public/client/islands/sidebar.js +1197 -0
  45. package/pages/public/client/long-press.js +59 -0
  46. package/pages/public/client/modal.js +50 -0
  47. package/pages/public/client/router.js +87 -0
  48. package/pages/public/client/rtc-peer-manager.js +344 -0
  49. package/pages/public/client/settings-sync.js +76 -0
  50. package/pages/public/client/shared/messages.js +147 -0
  51. package/pages/public/client/swipe-nav.js +98 -0
  52. package/pages/public/client/theme.js +27 -0
  53. package/pages/public/client/ws.js +71 -0
  54. package/pages/public/favicon.ico +0 -0
  55. package/pages/public/favicon.png +0 -0
  56. package/pages/public/icon.png +0 -0
  57. package/pages/public/manifest.json +11 -0
  58. package/pages/public/sw.js +38 -0
  59. package/pages/public/themes/base.css +1786 -0
  60. package/pages/public/themes/dark.css +22 -0
  61. package/pages/public/themes/forest.css +22 -0
  62. package/pages/public/themes/light.css +23 -0
  63. package/pages/public/themes/ocean.css +22 -0
  64. package/pages/public/themes/rose.css +22 -0
  65. package/pages/registration/index.js +35 -0
  66. package/pages/registration/index.phtml +38 -0
  67. package/pages/uploads/[uploadId]/[filename].js +45 -0
  68. package/src/adapters/InMemoryAuthRepository.js +74 -0
  69. package/src/adapters/InMemoryChannelRepository.js +138 -0
  70. package/src/adapters/InMemoryDeliveryRepository.js +52 -0
  71. package/src/adapters/InMemoryFileStore.js +53 -0
  72. package/src/adapters/InMemoryHubRepository.js +85 -0
  73. package/src/adapters/InMemoryMessageRepository.js +35 -0
  74. package/src/adapters/InMemoryReactionRepository.js +45 -0
  75. package/src/adapters/InMemorySearchRepository.js +37 -0
  76. package/src/adapters/InMemorySignalingRepository.js +35 -0
  77. package/src/adapters/InMemoryUploadRepository.js +36 -0
  78. package/src/adapters/InMemoryUserSettingsRepository.js +15 -0
  79. package/src/adapters/LocalFileStore.js +40 -0
  80. package/src/adapters/SqliteAuthRepository.js +184 -0
  81. package/src/adapters/SqliteChannelRepository.js +149 -0
  82. package/src/adapters/SqliteDeliveryRepository.js +53 -0
  83. package/src/adapters/SqliteHubRepository.js +99 -0
  84. package/src/adapters/SqliteMessageRepository.js +90 -0
  85. package/src/adapters/SqlitePushRepository.js +39 -0
  86. package/src/adapters/SqliteReactionRepository.js +50 -0
  87. package/src/adapters/SqliteSearchRepository.js +42 -0
  88. package/src/adapters/SqliteSignalingRepository.js +50 -0
  89. package/src/adapters/SqliteUploadRepository.js +34 -0
  90. package/src/adapters/SqliteUserSettingsRepository.js +23 -0
  91. package/src/adminAuth.js +25 -0
  92. package/src/config.js +11 -0
  93. package/src/context.js +77 -0
  94. package/src/core/dm.js +10 -0
  95. package/src/core/mentions.js +27 -0
  96. package/src/core/messages.js +21 -0
  97. package/src/core/reactions.js +6 -0
  98. package/src/core/roles.js +5 -0
  99. package/src/core/uploads.js +107 -0
  100. package/src/db/initDb.js +225 -0
  101. package/src/db/openDb.js +18 -0
  102. package/src/db/runMigrations.js +45 -0
  103. package/src/db/transaction.js +11 -0
  104. package/src/ports/IFileStore.js +34 -0
  105. package/src/services/AuthService.js +208 -0
  106. package/src/services/BotService.js +148 -0
  107. package/src/services/ChannelService.js +176 -0
  108. package/src/services/DeliveryService.js +28 -0
  109. package/src/services/HubService.js +133 -0
  110. package/src/services/MessageService.js +122 -0
  111. package/src/services/NotificationService.js +45 -0
  112. package/src/services/PresenceService.js +55 -0
  113. package/src/services/ReactionService.js +57 -0
  114. package/src/services/SearchService.js +21 -0
  115. package/src/services/SignalingService.js +177 -0
  116. package/src/services/UploadService.js +111 -0
  117. package/src/services/UserSettingsService.js +30 -0
  118. package/src/services/WebPushService.js +217 -0
  119. package/src/util/crypto.js +21 -0
  120. package/src/util/errors.js +14 -0
  121. package/src/util/ids.js +3 -0
  122. package/src/util/logger.js +21 -0
  123. package/src/ws/ChatServer.js +478 -0
  124. package/src/ws/handlers/authHandlers.js +152 -0
  125. package/src/ws/handlers/channelHandlers.js +166 -0
  126. package/src/ws/handlers/hubHandlers.js +82 -0
  127. package/src/ws/handlers/messageHandlers.js +88 -0
  128. package/src/ws/handlers/pushHandlers.js +25 -0
  129. package/src/ws/handlers/reactionHandlers.js +27 -0
  130. package/src/ws/handlers/rtcHandlers.js +126 -0
  131. package/styles.css +22 -0
@@ -0,0 +1,77 @@
1
+ /**
2
+ * action-sheet.js โ€” singleton bottom sheet for mobile + iPad.
3
+ *
4
+ * Only one sheet can be open at a time. Dismisses on backdrop tap or swipe-down.
5
+ */
6
+
7
+ let backdropEl = null
8
+ let sheetEl = null
9
+
10
+ function ensureDOM() {
11
+ if (backdropEl) return
12
+
13
+ backdropEl = document.createElement('div')
14
+ backdropEl.className = 'action-sheet-backdrop'
15
+ backdropEl.innerHTML = `
16
+ <div class="action-sheet" role="dialog" aria-modal="true">
17
+ <div class="action-sheet-handle"></div>
18
+ <div class="action-sheet-label"></div>
19
+ <div class="action-sheet-items"></div>
20
+ </div>
21
+ `
22
+ document.body.appendChild(backdropEl)
23
+ sheetEl = backdropEl.querySelector('.action-sheet')
24
+
25
+ // Tap backdrop (outside sheet) to dismiss
26
+ backdropEl.addEventListener('click', e => {
27
+ if (e.target === backdropEl) dismiss()
28
+ })
29
+
30
+ // Swipe down to dismiss
31
+ let startY = 0
32
+ sheetEl.addEventListener('touchstart', e => {
33
+ startY = e.touches[0].clientY
34
+ }, { passive: true })
35
+ sheetEl.addEventListener('touchend', e => {
36
+ if (e.changedTouches[0].clientY - startY > 60) dismiss()
37
+ }, { passive: true })
38
+ }
39
+
40
+ /**
41
+ * @param {{ label?: string, items: Array<{ label: string, action?: () => void, danger?: boolean, disabled?: boolean }> }} opts
42
+ */
43
+ export function showActionSheet({ label, items }) {
44
+ ensureDOM()
45
+
46
+ backdropEl.querySelector('.action-sheet-label').textContent = label ?? ''
47
+ const container = backdropEl.querySelector('.action-sheet-items')
48
+ container.innerHTML = ''
49
+
50
+ for (const item of items) {
51
+ const btn = document.createElement('button')
52
+ btn.className = 'action-sheet-item' + (item.danger ? ' danger' : '')
53
+ btn.textContent = item.label
54
+ btn.disabled = !!item.disabled
55
+ btn.addEventListener('click', () => {
56
+ dismiss()
57
+ item.action?.()
58
+ })
59
+ container.appendChild(btn)
60
+ }
61
+
62
+ requestAnimationFrame(() => {
63
+ backdropEl.classList.add('open')
64
+ sheetEl.classList.add('open')
65
+ })
66
+ }
67
+
68
+ export function dismiss() {
69
+ backdropEl?.classList.remove('open')
70
+ sheetEl?.classList.remove('open')
71
+ }
72
+
73
+ /** Returns the .action-sheet-items container, for callers that build forms inline. */
74
+ export function getItemsContainer() {
75
+ ensureDOM()
76
+ return backdropEl.querySelector('.action-sheet-items')
77
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * app.js โ€” boots rdbljs islands and page-level setup.
3
+ *
4
+ * Loaded as <script type="module" src="{{base}}/client/app.js"> from _layout.html.
5
+ * init(window) from rdbljs discovers all [island] elements, imports each
6
+ * module, calls the default export factory with (root, window), and wires
7
+ * up bind(root, scope) so all directives (model=, onclick=, each=, etc.) work.
8
+ */
9
+ import { init } from '@devchitchat/rdbljs'
10
+ import { getSettings, syncFromServer, patchSettings } from './settings-sync.js'
11
+ import { initSwipeNav } from './swipe-nav.js'
12
+ import { initRouter } from './router.js'
13
+
14
+ const BASE_PATH = window.__BASE_PATH__ ?? ''
15
+
16
+ // On a channel page the intent is always to view the channel โ€” persist the
17
+ // current channel and ensure mobile shows the chat panel, not the hub panel.
18
+ if (location.pathname.startsWith(`${BASE_PATH}/channels/`)) {
19
+ const channelId = location.pathname.split('/').pop()
20
+ if (channelId) patchSettings({ last_channel_id: channelId, mobile_chat_open: true })
21
+ }
22
+
23
+ // Apply settings before islands mount (prevent layout flash)
24
+ const settings = getSettings()
25
+ if (window.matchMedia('(max-width: 1024px)').matches && settings.mobile_chat_open === false) {
26
+ document.body.classList.add('sidebar-open')
27
+ }
28
+
29
+ await init(window)
30
+
31
+ initRouter()
32
+ initSwipeNav()
33
+
34
+ // Reconcile with server in background after islands mount
35
+ syncFromServer().then(remoteSettings => {
36
+ if (!remoteSettings || !window.matchMedia('(max-width: 1024px)').matches) return
37
+ document.body.classList.toggle('sidebar-open', remoteSettings.mobile_chat_open === false)
38
+ })
@@ -0,0 +1,13 @@
1
+ /**
2
+ * auth-tabs.js โ€” tab switching on the login page (no framework needed).
3
+ */
4
+ const tabs = document.querySelectorAll('[role="tab"]')
5
+ const panels = document.querySelectorAll('[role="tabpanel"]')
6
+
7
+ tabs.forEach(tab => {
8
+ tab.addEventListener('click', () => {
9
+ const target = tab.dataset.tab
10
+ tabs.forEach(t => t.setAttribute('aria-selected', t.dataset.tab === target ? 'true' : 'false'))
11
+ panels.forEach(p => { p.hidden = p.id !== `panel-${target}` })
12
+ })
13
+ })
@@ -0,0 +1,197 @@
1
+ /**
2
+ * emoji-data.js โ€” static emoji dataset (~500 emoji across 9 categories).
3
+ * "Recent" category starts empty and is populated from localStorage at runtime.
4
+ */
5
+
6
+ export const CATEGORIES = [
7
+ {
8
+ id: 'recent',
9
+ label: '๐Ÿ•',
10
+ emoji: [], // populated from localStorage at runtime
11
+ },
12
+ {
13
+ id: 'smileys',
14
+ label: '๐Ÿ˜€',
15
+ emoji: [
16
+ '๐Ÿ˜€','๐Ÿ˜ƒ','๐Ÿ˜„','๐Ÿ˜','๐Ÿ˜†','๐Ÿ˜…','๐Ÿ˜‚','๐Ÿคฃ','โ˜บ๏ธ','๐Ÿ˜Š','๐Ÿ˜‡','๐Ÿ™‚','๐Ÿ™ƒ','๐Ÿ˜‰','๐Ÿ˜Œ',
17
+ '๐Ÿ˜','๐Ÿฅฐ','๐Ÿ˜˜','๐Ÿ˜—','๐Ÿ˜™','๐Ÿ˜š','๐Ÿ˜‹','๐Ÿ˜›','๐Ÿ˜','๐Ÿ˜œ','๐Ÿคช','๐Ÿคจ','๐Ÿง','๐Ÿค“','๐Ÿ˜Ž',
18
+ '๐Ÿคฉ','๐Ÿฅณ','๐Ÿ˜','๐Ÿ˜’','๐Ÿ˜ž','๐Ÿ˜”','๐Ÿ˜Ÿ','๐Ÿ˜•','๐Ÿ™','โ˜น๏ธ','๐Ÿ˜ฃ','๐Ÿ˜–','๐Ÿ˜ซ','๐Ÿ˜ฉ','๐Ÿฅบ',
19
+ '๐Ÿ˜ข','๐Ÿ˜ญ','๐Ÿ˜ค','๐Ÿ˜ ','๐Ÿ˜ก','๐Ÿคฌ','๐Ÿ˜ˆ','๐Ÿ‘ฟ','๐Ÿ’€','โ˜ ๏ธ','๐Ÿ’ฉ','๐Ÿคก','๐Ÿ‘น','๐Ÿ‘บ','๐Ÿ‘ป',
20
+ '๐Ÿ‘ฝ','๐Ÿ‘พ','๐Ÿค–','๐Ÿ˜บ','๐Ÿ˜ธ','๐Ÿ˜น','๐Ÿ˜ป','๐Ÿ˜ผ','๐Ÿ˜ฝ','๐Ÿ™€','๐Ÿ˜ฟ','๐Ÿ˜พ','๐Ÿค—','๐Ÿค”','๐Ÿคญ',
21
+ '๐Ÿคซ','๐Ÿคฅ','๐Ÿ˜ถ','๐Ÿ˜','๐Ÿ˜‘','๐Ÿ˜ฌ','๐Ÿ™„','๐Ÿ˜ฏ','๐Ÿ˜ฆ','๐Ÿ˜ง','๐Ÿ˜ฎ','๐Ÿ˜ฒ','๐Ÿฅฑ','๐Ÿ˜ด','๐Ÿคค',
22
+ '๐Ÿ˜ช','๐Ÿ˜ต','๐Ÿค','๐Ÿฅด','๐Ÿคข','๐Ÿคฎ','๐Ÿคง','๐Ÿฅต','๐Ÿฅถ','๐Ÿฅด','๐Ÿ˜ท','๐Ÿค’','๐Ÿค•','๐Ÿค‘','๐Ÿค ',
23
+ ],
24
+ },
25
+ {
26
+ id: 'people',
27
+ label: '๐Ÿ‘‹',
28
+ emoji: [
29
+ '๐Ÿ‘','๐Ÿ‘Ž','๐Ÿ‘Œ','โœŒ๏ธ','๐Ÿคž','๐ŸคŸ','๐Ÿค˜','๐Ÿค™','๐Ÿ‘ˆ','๐Ÿ‘‰','๐Ÿ‘†','๐Ÿ–•','๐Ÿ‘‡','โ˜๏ธ','๐Ÿ‘',
30
+ 'โœ‹','๐Ÿคš','๐Ÿ–๏ธ','๐Ÿ––','๐Ÿ‘‹','๐Ÿค™','๐Ÿ’ช','๐Ÿฆพ','๐Ÿ–•','โœ๏ธ','๐Ÿค','๐Ÿ™Œ','๐Ÿ‘','๐Ÿคฒ','๐Ÿ™',
31
+ '๐Ÿคœ','๐Ÿค›','โœŠ','๐Ÿ‘Š','๐Ÿค','๐ŸคŒ','๐Ÿ‘','๐Ÿ’…','๐Ÿคณ','๐Ÿ’ƒ','๐Ÿ•บ','๐Ÿ‘ซ','๐Ÿ‘ฌ','๐Ÿ‘ญ','๐Ÿ’',
32
+ '๐Ÿ’‘','๐Ÿ‘ช','๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ','๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง','๐Ÿ‘ฉโ€๐Ÿ‘ฆ','๐Ÿ‘ฉโ€๐Ÿ‘ง','๐Ÿ‘จโ€๐Ÿ‘ฆ','๐Ÿ‘จโ€๐Ÿ‘ง','๐Ÿ‘ถ','๐Ÿง’','๐Ÿ‘ฆ','๐Ÿ‘ง','๐Ÿง‘','๐Ÿ‘ฑ','๐Ÿ‘จ',
33
+ '๐Ÿง”','๐Ÿ‘ฉ','๐Ÿง“','๐Ÿ‘ด','๐Ÿ‘ต','๐Ÿ™','๐Ÿ™Ž','๐Ÿ™…','๐Ÿ™†','๐Ÿ’','๐Ÿ™‹','๐Ÿง','๐Ÿ™‡','๐Ÿคฆ','๐Ÿคท',
34
+ '๐Ÿ‘ฎ','๐Ÿ•ต๏ธ','๐Ÿ’‚','๐Ÿฅท','๐Ÿ‘ท','๐Ÿคด','๐Ÿ‘ธ','๐Ÿ‘ณ','๐Ÿ‘ฒ','๐Ÿง•','๐Ÿคต','๐Ÿ‘ฐ','๐Ÿคฐ','๏ฟฝ๏ฟฝ','๐Ÿ‘ผ',
35
+ '๐ŸŽ…','๐Ÿคถ','๐Ÿฆธ','๐Ÿฆน','๐Ÿง™','๐Ÿงš','๐Ÿง›','๐Ÿงœ','๐Ÿง','๐Ÿงž','๐ŸงŸ','๐ŸงŒ','๐Ÿ’†','๐Ÿ’‡','๐Ÿšถ',
36
+ ],
37
+ },
38
+ {
39
+ id: 'animals',
40
+ label: '๐Ÿพ',
41
+ emoji: [
42
+ '๐Ÿถ','๐Ÿฑ','๐Ÿญ','๐Ÿน','๐Ÿฐ','๐ŸฆŠ','๐Ÿป','๐Ÿผ','๐Ÿจ','๐Ÿฏ','๐Ÿฆ','๐Ÿฎ','๐Ÿท','๐Ÿธ','๐Ÿต',
43
+ '๐Ÿ™ˆ','๐Ÿ™‰','๐Ÿ™Š','๐Ÿ”','๐Ÿง','๐Ÿฆ','๐Ÿค','๐Ÿฆ†','๐Ÿฆ…','๐Ÿฆ‰','๐Ÿฆ‡','๐Ÿบ','๐Ÿ—','๐Ÿด','๐Ÿฆ„',
44
+ '๐Ÿ','๐Ÿ›','๐Ÿฆ‹','๐ŸŒ','๐Ÿž','๐Ÿœ','๐ŸฆŸ','๐Ÿฆ—','๐Ÿฆ‚','๐Ÿข','๐Ÿ','๐ŸฆŽ','๐Ÿฆ–','๐Ÿฆ•','๐Ÿ™',
45
+ '๐Ÿฆ‘','๐Ÿฆ','๐Ÿฆž','๐Ÿฆ€','๐Ÿก','๐Ÿ ','๐ŸŸ','๐Ÿฌ','๐Ÿณ','๐Ÿ‹','๐Ÿฆˆ','๐ŸŠ','๐Ÿ…','๐Ÿ†','๐Ÿฆ“',
46
+ '๐Ÿฆ','๐Ÿฆง','๐Ÿฆฃ','๐Ÿ˜','๐Ÿฆ›','๐Ÿฆ','๐Ÿช','๐Ÿซ','๐Ÿฆ’','๐Ÿฆ˜','๐Ÿฆฌ','๐Ÿƒ','๐Ÿ‚','๐Ÿ„','๐ŸŽ',
47
+ '๐Ÿ–','๐Ÿ','๐Ÿ‘','๐Ÿฆ™','๐Ÿ','๐ŸฆŒ','๐Ÿ•','๐Ÿฉ','๐Ÿฆฎ','๐Ÿˆ','๐Ÿ“','๐Ÿฆƒ','๐Ÿฆค','๐Ÿฆš','๐Ÿฆœ',
48
+ '๐Ÿฆข','๐Ÿฆฉ','๐Ÿ•Š๏ธ','๐Ÿ‡','๐Ÿฆ','๐Ÿฆจ','๐Ÿฆก','๐Ÿฆซ','๐Ÿฆฆ','๐Ÿฆฅ','๐Ÿ','๐Ÿ€','๐Ÿฟ๏ธ','๐Ÿฆ”','๐Ÿพ',
49
+ ],
50
+ },
51
+ {
52
+ id: 'food',
53
+ label: '๐Ÿ•',
54
+ emoji: [
55
+ '๐Ÿ•','๐Ÿ”','๐ŸŒฎ','๐ŸŒฏ','๐Ÿฅ™','๐Ÿง†','๐Ÿฅš','๐Ÿณ','๐Ÿฅ˜','๐Ÿฒ','๐Ÿฅ—','๐Ÿฅซ','๐Ÿงˆ','๐Ÿž','๐Ÿฅ',
56
+ '๐Ÿฅ–','๐Ÿฅจ','๐Ÿง€','๐Ÿฅช','๐ŸŒญ','๐Ÿฅ“','๐Ÿ–','๐Ÿ—','๐Ÿฅฉ','๐Ÿฑ','๐Ÿ˜','๐Ÿ™','๐Ÿš','๐Ÿ›','๐Ÿœ',
57
+ '๐Ÿ','๐Ÿ ','๐Ÿข','๐Ÿฃ','๐Ÿค','๐Ÿฅ','๐Ÿฅฎ','๐Ÿก','๐ŸฅŸ','๐Ÿฅ ','๐Ÿฅก','๐Ÿฆช','๐Ÿฆ','๐Ÿง','๐Ÿจ',
58
+ '๐Ÿฉ','๐Ÿช','๐ŸŽ‚','๐Ÿฐ','๐Ÿง','๐Ÿฅง','๐Ÿซ','๐Ÿฌ','๐Ÿญ','๐Ÿฎ','๐Ÿฏ','๐ŸŽ','๐Ÿ','๐ŸŠ','๐Ÿ‹',
59
+ '๐ŸŒ','๐Ÿ‰','๐Ÿ‡','๐Ÿ“','๐Ÿซ','๐Ÿˆ','๐Ÿ‘','๐Ÿ’','๐Ÿ','๐Ÿฅญ','๐Ÿฅฅ','๐Ÿฅ','๐Ÿ…','๐Ÿซ’','๐Ÿง„',
60
+ '๐Ÿง…','๐Ÿฅ”','๐ŸŒฝ','๐ŸŒถ๏ธ','๐Ÿฅ’','๐Ÿฅฌ','๐Ÿฅฆ','๐Ÿง‡','๐Ÿฅž','๐Ÿง‡','๐Ÿฅฏ','๐Ÿฅ‘','๐Ÿ†','๐Ÿฅ‘','๐Ÿซ‘',
61
+ 'โ˜•','๐Ÿต','๐Ÿงƒ','๐Ÿฅค','๐Ÿบ','๐Ÿป','๐Ÿฅ‚','๐Ÿท','๐Ÿฅƒ','๐Ÿธ','๐Ÿน','๐Ÿง‰','๐Ÿพ','๐ŸงŠ','๐Ÿถ',
62
+ ],
63
+ },
64
+ {
65
+ id: 'activity',
66
+ label: 'โšฝ',
67
+ emoji: [
68
+ 'โšฝ','๐Ÿ€','๐Ÿˆ','โšพ','๐ŸฅŽ','๐ŸŽพ','๐Ÿ','๐Ÿ‰','๐Ÿฅ','๐ŸŽฑ','๐Ÿ“','๐Ÿธ','๐Ÿ’','๐Ÿ‘','๐Ÿฅ',
69
+ '๐Ÿ','๐Ÿชƒ','๐Ÿฅ…','โ›ณ','๐Ÿช','๐Ÿน','๐ŸŽฃ','๐Ÿคฟ','๐ŸฅŠ','๐Ÿฅ‹','๐ŸŽฝ','๐Ÿ›น','๐Ÿ›ผ','๐Ÿ›ท','โ›ธ๏ธ',
70
+ '๐ŸฅŒ','๐ŸŽฟ','โ›ท๏ธ','๐Ÿ‚','๐Ÿ‹๏ธ','๐Ÿคธ','๐Ÿคบ','๐Ÿคผ','๐Ÿคพ','๐ŸŒ๏ธ','๐Ÿ‡','๐Ÿง˜','๐Ÿ„','๐ŸŠ','๐Ÿคฝ',
71
+ '๐Ÿšฃ','๐Ÿง—','๐Ÿšต','๐Ÿšด','๐Ÿ†','๐Ÿฅ‡','๐Ÿฅˆ','๐Ÿฅ‰','๐Ÿ…','๐ŸŽ–๏ธ','๐Ÿต๏ธ','๐ŸŽ—๏ธ','๐ŸŽซ','๐ŸŽŸ๏ธ','๐ŸŽช',
72
+ '๐ŸŽญ','๐ŸŽจ','๐ŸŽฌ','๐ŸŽค','๐ŸŽง','๐ŸŽผ','๐ŸŽน','๐Ÿฅ','๐Ÿช˜','๐ŸŽท','๐ŸŽบ','๐ŸŽธ','๐Ÿช•','๐ŸŽป','๐ŸŽฒ',
73
+ 'โ™Ÿ๏ธ','๐ŸŽฏ','๐ŸŽณ','๐ŸŽฎ','๐Ÿ•น๏ธ','๐ŸŽฐ','๐Ÿงฉ','๐Ÿช…','๐Ÿช†','๐Ÿช‡','๐ŸŽƒ','๐ŸŽ„','๐ŸŽ†','๐ŸŽ‡','๐Ÿงจ',
74
+ 'โœจ','๐ŸŽ‰','๐ŸŽŠ','๐ŸŽˆ','๐ŸŽ‹','๐ŸŽ','๐ŸŽŽ','๐ŸŽ','๐ŸŽ','๐Ÿงง','๐ŸŽ','๐ŸŽ€','๐ŸŽ‘','๐ŸŽ ','๐ŸŽก',
75
+ ],
76
+ },
77
+ {
78
+ id: 'travel',
79
+ label: '๐ŸŒ',
80
+ emoji: [
81
+ '๐Ÿš€','โœˆ๏ธ','๐Ÿ›ธ','๐Ÿš','๐Ÿ›ฉ๏ธ','๐Ÿช‚','๐Ÿš‚','๐Ÿšƒ','๐Ÿš„','๐Ÿš…','๐Ÿš†','๐Ÿš‡','๐Ÿšˆ','๐Ÿš‰','๐ŸšŠ',
82
+ '๐Ÿš','๐Ÿšž','๐Ÿš‹','๐ŸšŒ','๐Ÿš','๐ŸšŽ','๐ŸŽ๏ธ','๐Ÿš','๐Ÿš‘','๐Ÿš’','๐Ÿš“','๐Ÿš”','๐Ÿš–','๐Ÿš—','๐Ÿš˜',
83
+ '๐Ÿš™','๐Ÿ›ป','๐Ÿšš','๐Ÿš›','๐Ÿšœ','๐Ÿ๏ธ','๐Ÿ›ต','๐Ÿ›บ','๐Ÿšฒ','๐Ÿ›ด','๐Ÿ›น','๐Ÿš','๐Ÿ›ฃ๏ธ','๐Ÿ›ค๏ธ','๐Ÿ›ณ๏ธ',
84
+ '๐Ÿšข','โ›ด๏ธ','๐Ÿ›ฅ๏ธ','โ›ต','๐Ÿšค','๐Ÿ›ถ','๐Ÿšฃ','โ›ฝ','๐Ÿšฆ','๐Ÿšฅ','๐Ÿšง','โš“','๐Ÿช','โ›ต','๐Ÿ—บ๏ธ',
85
+ '๐Ÿงญ','๐ŸŒ','๐ŸŒŽ','๐ŸŒ','๐ŸŒ','๐Ÿ”๏ธ','โ›ฐ๏ธ','๐ŸŒ‹','๐Ÿ—ป','๐Ÿ•๏ธ','๐Ÿ–๏ธ','๐Ÿœ๏ธ','๐Ÿ๏ธ','๐Ÿž๏ธ','๐ŸŸ๏ธ',
86
+ '๐Ÿ›๏ธ','๐Ÿ—๏ธ','๐Ÿ˜๏ธ','๐Ÿš๏ธ','๐Ÿ ','๐Ÿก','๐Ÿข','๐Ÿฃ','๐Ÿค','๐Ÿฅ','๐Ÿฆ','๐Ÿจ','๐Ÿฉ','๐Ÿช','๐Ÿซ',
87
+ '๐Ÿฌ','๐Ÿญ','๐Ÿฏ','๐Ÿฐ','๐Ÿ’’','๐Ÿ—ผ','๐Ÿ—ฝ','โ›ช','๐Ÿ•Œ','๐Ÿ›•','๐Ÿ•','โ›ฉ๏ธ','๐Ÿ•‹','โ›ฒ','โ›บ',
88
+ ],
89
+ },
90
+ {
91
+ id: 'objects',
92
+ label: '๐Ÿ’ก',
93
+ emoji: [
94
+ '๐Ÿ”ฅ','โœ…','โŒ','โš ๏ธ','๐Ÿ”‘','๐Ÿ—๏ธ','๐Ÿ”','๐Ÿ”','๐Ÿ”’','๐Ÿ”“','๐Ÿ”จ','๐Ÿช“','โ›๏ธ','โš’๏ธ','๐Ÿ› ๏ธ',
95
+ '๐Ÿ—ก๏ธ','โš”๏ธ','๐Ÿ”ซ','๐Ÿชƒ','๐Ÿน','๐Ÿ›ก๏ธ','๐Ÿชš','๐Ÿ”ง','๐Ÿช›','๐Ÿ”ฉ','โš™๏ธ','๐Ÿ—œ๏ธ','โš–๏ธ','๐Ÿฆฏ','๐Ÿ”—',
96
+ 'โ›“๏ธ','๐Ÿช','๐Ÿงฒ','๐Ÿ”‹','๐Ÿชซ','๐Ÿ”Œ','๐Ÿ’ก','๐Ÿ”ฆ','๐Ÿ•ฏ๏ธ','๐Ÿช”','๐Ÿงฏ','๐Ÿ›ข๏ธ','๐Ÿ’ฐ','๐Ÿ’ด','๐Ÿ’ต',
97
+ '๐Ÿ’ถ','๐Ÿ’ท','๐Ÿ’ธ','๐Ÿ’ณ','๐Ÿช™','๐Ÿ’น','๐Ÿ“ˆ','๐Ÿ“‰','๐Ÿ“Š','๐Ÿ“‹','๐Ÿ“Œ','๐Ÿ“','โœ‚๏ธ','๐Ÿ—ƒ๏ธ','๐Ÿ—‚๏ธ',
98
+ '๐Ÿ“','๐Ÿ“‚','๐Ÿ—’๏ธ','๐Ÿ—“๏ธ','๐Ÿ“†','๐Ÿ“…','๐Ÿ—‘๏ธ','๐Ÿ“‡','๐Ÿ“”','๐Ÿ“’','๐Ÿ““','๐Ÿ“•','๐Ÿ“—','๐Ÿ“˜','๐Ÿ“™',
99
+ '๐Ÿ“š','๐Ÿ“–','๐Ÿ”–','๐Ÿท๏ธ','๐Ÿ’ฌ','๐Ÿ—จ๏ธ','๐Ÿ’ญ','๐Ÿ—ฏ๏ธ','๐Ÿ“ข','๐Ÿ“ฃ','๐Ÿ””','๐Ÿ”•','๐Ÿ“ฑ','โ˜Ž๏ธ','๐Ÿ“ž',
100
+ '๐Ÿ“Ÿ','๐Ÿ“ ','๐Ÿ“บ','๐Ÿ“ป','๐ŸŽ™๏ธ','๐Ÿ“ก','๐Ÿ”ญ','๐Ÿ”ฌ','๐Ÿงฌ','๐Ÿงซ','๐Ÿงช','๐ŸŒก๏ธ','๐Ÿงฒ','๐Ÿ’Š','๐Ÿ’‰',
101
+ ],
102
+ },
103
+ {
104
+ id: 'symbols',
105
+ label: '๐Ÿ”ฃ',
106
+ emoji: [
107
+ 'โค๏ธ','๐Ÿงก','๐Ÿ’›','๐Ÿ’š','๐Ÿ’™','๐Ÿ’œ','๐Ÿ–ค','๐Ÿค','๐ŸคŽ','๐Ÿ’”','โค๏ธโ€๐Ÿ”ฅ','โค๏ธโ€๐Ÿฉน','โฃ๏ธ','๐Ÿ’•',
108
+ '๐Ÿ’ž','๐Ÿ’“','๐Ÿ’—','๐Ÿ’–','๐Ÿ’˜','๐Ÿ’','๐Ÿ’Ÿ','โ˜ฎ๏ธ','โœ๏ธ','โ˜ช๏ธ','๐Ÿ•‰๏ธ','โ˜ธ๏ธ','โœก๏ธ','๐Ÿ”ฏ','๐Ÿ•Ž',
109
+ 'โ˜ฏ๏ธ','โ˜ฆ๏ธ','๐Ÿ›','โ›Ž','โ™ˆ','โ™‰','โ™Š','โ™‹','โ™Œ','โ™','โ™Ž','โ™','โ™','โ™‘','โ™’','โ™“',
110
+ '๐Ÿ†”','โš›๏ธ','๐Ÿ‰‘','โ˜ข๏ธ','โ˜ฃ๏ธ','๐Ÿ“ด','๐Ÿ“ณ','๐Ÿˆถ','๐Ÿˆš','๐Ÿˆธ','๐Ÿˆบ','๐Ÿˆท๏ธ','โœด๏ธ','๐Ÿ†š','๐Ÿ’ฎ',
111
+ '๐Ÿ‰','ใŠ™๏ธ','ใŠ—๏ธ','๐Ÿˆด','๐Ÿˆต','๐Ÿˆน','๐Ÿˆฒ','๐Ÿ…ฐ๏ธ','๐Ÿ…ฑ๏ธ','๐Ÿ†Ž','๐Ÿ†‘','๐Ÿ…พ๏ธ','๐Ÿ†˜','โ“','โ”',
112
+ 'โ•','โ—','๐Ÿ”…','๐Ÿ”†','ใ€ฝ๏ธ','โšœ๏ธ','๐Ÿ”ฑ','๐Ÿ“›','๐Ÿ”ฐ','โ™ป๏ธ','โœ…','๐Ÿˆฏ','๐Ÿ’น','โ‡๏ธ','โœณ๏ธ',
113
+ 'โŽ','๐ŸŒ','๐Ÿ’ฏ','๐Ÿ’ ','โ“‚๏ธ','๐ŸŒ€','โžฟ','๐Ÿ”š','๐Ÿ”™','๐Ÿ”›','๐Ÿ”','๐Ÿ”œ','โธ๏ธ','โน๏ธ','โบ๏ธ',
114
+ ],
115
+ },
116
+ ]
117
+
118
+ export const EMOJI_NAMES = {
119
+ '๐Ÿ˜€': 'grinning face', '๐Ÿ˜ƒ': 'grinning face with big eyes', '๐Ÿ˜„': 'grinning face with smiling eyes',
120
+ '๐Ÿ˜': 'beaming face with smiling eyes', '๐Ÿ˜†': 'grinning squinting face', '๐Ÿ˜…': 'grinning face with sweat',
121
+ '๐Ÿ˜‚': 'face with tears of joy', '๐Ÿคฃ': 'rolling on the floor laughing', 'โ˜บ๏ธ': 'smiling face',
122
+ '๐Ÿ˜Š': 'smiling face with smiling eyes', '๐Ÿ˜‡': 'smiling face with halo', '๐Ÿ™‚': 'slightly smiling face',
123
+ '๐Ÿ™ƒ': 'upside-down face', '๐Ÿ˜‰': 'winking face', '๐Ÿ˜Œ': 'relieved face', '๐Ÿ˜': 'smiling face with heart-eyes',
124
+ '๐Ÿฅฐ': 'smiling face with hearts', '๐Ÿ˜˜': 'face blowing a kiss', '๐Ÿ˜—': 'kissing face',
125
+ '๐Ÿ˜™': 'kissing face with smiling eyes', '๐Ÿ˜š': 'kissing face with closed eyes', '๐Ÿ˜‹': 'face savoring food',
126
+ '๐Ÿ˜›': 'face with tongue', '๐Ÿ˜': 'squinting face with tongue', '๐Ÿ˜œ': 'winking face with tongue',
127
+ '๐Ÿคช': 'zany face', '๐Ÿคจ': 'face with raised eyebrow', '๐Ÿง': 'face with monocle', '๐Ÿค“': 'nerd face',
128
+ '๐Ÿ˜Ž': 'smiling face with sunglasses', '๐Ÿคฉ': 'star-struck', '๐Ÿฅณ': 'partying face', '๐Ÿ˜': 'smirking face',
129
+ '๐Ÿ˜’': 'unamused face', '๐Ÿ˜ž': 'disappointed face', '๐Ÿ˜”': 'pensive face', '๐Ÿ˜Ÿ': 'worried face',
130
+ '๐Ÿ˜•': 'confused face', '๐Ÿ™': 'slightly frowning face', 'โ˜น๏ธ': 'frowning face', '๐Ÿ˜ฃ': 'persevering face',
131
+ '๐Ÿ˜–': 'confounded face', '๐Ÿ˜ซ': 'tired face', '๐Ÿ˜ฉ': 'weary face', '๐Ÿฅบ': 'pleading face',
132
+ '๐Ÿ˜ข': 'crying face', '๐Ÿ˜ญ': 'loudly crying face', '๐Ÿ˜ค': 'face with steam from nose',
133
+ '๐Ÿ˜ ': 'angry face', '๐Ÿ˜ก': 'pouting face', '๐Ÿคฌ': 'face with symbols on mouth', '๐Ÿ˜ˆ': 'smiling face with horns',
134
+ '๐Ÿ‘ฟ': 'angry face with horns', '๐Ÿ’€': 'skull', 'โ˜ ๏ธ': 'skull and crossbones', '๐Ÿ’ฉ': 'pile of poo',
135
+ '๐Ÿคก': 'clown face', '๐Ÿ‘น': 'ogre', '๐Ÿ‘บ': 'goblin', '๐Ÿ‘ป': 'ghost', '๐Ÿ‘ฝ': 'alien', '๐Ÿ‘พ': 'alien monster',
136
+ '๐Ÿค–': 'robot', '๐Ÿ˜บ': 'grinning cat', '๐Ÿ˜ธ': 'grinning cat with smiling eyes',
137
+ '๐Ÿ˜น': 'cat with tears of joy', '๐Ÿ˜ป': 'smiling cat with heart-eyes', '๐Ÿ˜ผ': 'cat with wry smile',
138
+ '๐Ÿ˜ฝ': 'kissing cat', '๐Ÿ™€': 'weary cat', '๐Ÿ˜ฟ': 'crying cat', '๐Ÿ˜พ': 'pouting cat',
139
+ '๐Ÿค—': 'hugging face', '๐Ÿค”': 'thinking face', '๐Ÿคญ': 'face with hand over mouth',
140
+ '๐Ÿคซ': 'shushing face', '๐Ÿคฅ': 'lying face', '๐Ÿ˜ถ': 'face without mouth', '๐Ÿ˜': 'neutral face',
141
+ '๐Ÿ˜‘': 'expressionless face', '๐Ÿ˜ฌ': 'grimacing face', '๐Ÿ™„': 'face with rolling eyes',
142
+ '๐Ÿ˜ฏ': 'hushed face', '๐Ÿ˜ฆ': 'frowning face with open mouth', '๐Ÿ˜ง': 'anguished face',
143
+ '๐Ÿ˜ฎ': 'face with open mouth', '๐Ÿ˜ฒ': 'astonished face', '๐Ÿฅฑ': 'yawning face', '๐Ÿ˜ด': 'sleeping face',
144
+ '๐Ÿคค': 'drooling face', '๐Ÿ˜ช': 'sleepy face', '๐Ÿ˜ต': 'dizzy face', '๐Ÿค': 'zipper-mouth face',
145
+ '๐Ÿฅด': 'woozy face', '๐Ÿคข': 'nauseated face', '๐Ÿคฎ': 'face vomiting', '๐Ÿคง': 'sneezing face',
146
+ '๐Ÿฅต': 'hot face', '๐Ÿฅถ': 'cold face', '๐Ÿ˜ท': 'face with medical mask', '๐Ÿค’': 'face with thermometer',
147
+ '๐Ÿค•': 'face with head-bandage', '๐Ÿค‘': 'money-mouth face', '๐Ÿค ': 'cowboy hat face',
148
+ '๐Ÿ‘': 'thumbs up', '๐Ÿ‘Ž': 'thumbs down', '๐Ÿ‘Œ': 'ok hand', 'โœŒ๏ธ': 'victory hand',
149
+ '๐Ÿคž': 'crossed fingers', '๐ŸคŸ': 'love-you gesture', '๐Ÿค˜': 'sign of the horns',
150
+ '๐Ÿค™': 'call me hand', '๐Ÿ‘ˆ': 'backhand index pointing left', '๐Ÿ‘‰': 'backhand index pointing right',
151
+ '๐Ÿ‘†': 'backhand index pointing up', '๐Ÿ‘‡': 'backhand index pointing down',
152
+ 'โ˜๏ธ': 'index pointing up', 'โœ‹': 'raised hand', '๐Ÿคš': 'raised back of hand',
153
+ '๐Ÿ–๏ธ': 'hand with fingers splayed', '๐Ÿ––': 'vulcan salute', '๐Ÿ‘‹': 'waving hand',
154
+ '๐Ÿค™': 'call me hand', '๐Ÿ’ช': 'flexed biceps', '๐Ÿฆพ': 'mechanical arm', 'โœ๏ธ': 'writing hand',
155
+ '๐Ÿค': 'handshake', '๐Ÿ™Œ': 'raising hands', '๐Ÿ‘': 'clapping hands', '๐Ÿคฒ': 'palms up together',
156
+ '๐Ÿ™': 'folded hands', '๐Ÿคœ': 'right-facing fist', '๐Ÿค›': 'left-facing fist', 'โœŠ': 'oncoming fist',
157
+ '๐Ÿ‘Š': 'oncoming fist', '๐Ÿ’…': 'nail polish', '๐Ÿคณ': 'selfie', '๐Ÿ’ƒ': 'woman dancing',
158
+ '๐Ÿ•บ': 'man dancing', '๐Ÿ†': 'trophy', '๐Ÿฅ‡': 'first place medal', '๐Ÿฅˆ': 'second place medal',
159
+ '๐Ÿฅ‰': 'third place medal', '๐Ÿ…': 'sports medal', '๐ŸŽฏ': 'direct hit', '๐ŸŽ‰': 'party popper',
160
+ '๐ŸŽŠ': 'confetti ball', '๐ŸŽˆ': 'balloon', '๐ŸŽ': 'wrapped gift', '๐Ÿš€': 'rocket',
161
+ 'โœˆ๏ธ': 'airplane', '๐ŸŒ': 'globe showing europe-africa', '๐ŸŒŽ': 'globe showing americas',
162
+ '๐ŸŒ': 'globe showing asia-australia', '๐Ÿ ': 'house', '๐Ÿ”ฅ': 'fire', 'โœ…': 'check mark button',
163
+ 'โŒ': 'cross mark', 'โš ๏ธ': 'warning', '๐Ÿ”‘': 'key', '๐Ÿ’ก': 'light bulb', '๐Ÿ“ฑ': 'mobile phone',
164
+ '๐Ÿ’ป': 'laptop', '๐Ÿ–ฅ๏ธ': 'desktop computer', '๐Ÿ–จ๏ธ': 'printer', 'โŒจ๏ธ': 'keyboard', '๐Ÿ–ฑ๏ธ': 'computer mouse',
165
+ '๐Ÿ“ท': 'camera', '๐Ÿ“ธ': 'camera with flash', '๐Ÿ“น': 'video camera', '๐ŸŽฅ': 'movie camera',
166
+ '๐Ÿ“ž': 'telephone receiver', 'โ˜Ž๏ธ': 'telephone', '๐Ÿ“Ÿ': 'pager', '๐Ÿ“ ': 'fax machine',
167
+ '๐Ÿ“บ': 'television', '๐Ÿ“ป': 'radio', '๐Ÿ”ญ': 'telescope', '๐Ÿ”ฌ': 'microscope',
168
+ 'โค๏ธ': 'red heart', '๐Ÿงก': 'orange heart', '๐Ÿ’›': 'yellow heart', '๐Ÿ’š': 'green heart',
169
+ '๐Ÿ’™': 'blue heart', '๐Ÿ’œ': 'purple heart', '๐Ÿ–ค': 'black heart', '๐Ÿค': 'white heart',
170
+ '๐ŸคŽ': 'brown heart', '๐Ÿ’”': 'broken heart', '๐Ÿ’ฏ': 'hundred points', 'โœจ': 'sparkles',
171
+ 'โญ': 'star', '๐ŸŒŸ': 'glowing star', '๐Ÿ’ซ': 'dizzy', '๐ŸŒ™': 'crescent moon', 'โ˜€๏ธ': 'sun',
172
+ 'โšก': 'high voltage', '๐ŸŒˆ': 'rainbow', '๐ŸŒŠ': 'water wave', '๐Ÿ’ฅ': 'collision', '๐ŸŽถ': 'musical notes',
173
+ '๐ŸŽต': 'musical note', '๐Ÿ”‡': 'muted speaker', '๐Ÿ””': 'bell', '๐Ÿ”•': 'bell with slash',
174
+ '๐Ÿ‘€': 'eyes', '๐Ÿ’ฌ': 'speech balloon', '๐Ÿ’ญ': 'thought balloon', '๐Ÿ—ฏ๏ธ': 'anger symbol',
175
+ 'โ—': 'exclamation mark', 'โ“': 'question mark', 'โ€ผ๏ธ': 'double exclamation mark',
176
+ '๐Ÿ†•': 'new button', '๐Ÿ†’': 'cool button', '๐Ÿ†™': 'up button', '๐Ÿ”›': 'on arrow',
177
+ '๐ŸŽธ': 'guitar', '๐ŸŽน': 'musical keyboard', '๐Ÿฅ': 'drum', '๐ŸŽบ': 'trumpet', '๐ŸŽท': 'saxophone',
178
+ '๐Ÿ–๏ธ': 'beach with umbrella', '๐Ÿ”๏ธ': 'snow-capped mountain', '๐ŸŒ‹': 'volcano',
179
+ '๐Ÿถ': 'dog face', '๐Ÿฑ': 'cat face', '๐Ÿญ': 'mouse face', '๐Ÿฐ': 'rabbit face',
180
+ '๐ŸฆŠ': 'fox', '๐Ÿป': 'bear', '๐Ÿผ': 'panda', '๐Ÿจ': 'koala', '๐Ÿฏ': 'tiger face',
181
+ '๐Ÿฆ': 'lion', '๐Ÿฎ': 'cow face', '๐Ÿท': 'pig face', '๐Ÿธ': 'frog', '๐Ÿต': 'monkey face',
182
+ '๐Ÿ™ˆ': 'see-no-evil monkey', '๐Ÿ™‰': 'hear-no-evil monkey', '๐Ÿ™Š': 'speak-no-evil monkey',
183
+ '๐Ÿ”': 'chicken', '๐Ÿง': 'penguin', '๐Ÿฆ': 'bird', '๐Ÿฆ†': 'duck', '๐Ÿฆ…': 'eagle',
184
+ '๐Ÿฆ‰': 'owl', '๐Ÿฆ‡': 'bat', '๐Ÿบ': 'wolf', '๐Ÿด': 'horse face', '๐Ÿฆ„': 'unicorn',
185
+ '๐Ÿ•': 'pizza', '๐Ÿ”': 'hamburger', '๐ŸŒฎ': 'taco', '๐ŸŒฏ': 'burrito', '๐Ÿฅ™': 'stuffed flatbread',
186
+ '๐ŸŸ': 'french fries', '๐ŸŒญ': 'hot dog', '๐Ÿฟ': 'popcorn', '๐Ÿง‚': 'salt', '๐Ÿฅ“': 'bacon',
187
+ '๐Ÿณ': 'cooking', '๐Ÿฅš': 'egg', '๐Ÿง€': 'cheese wedge', '๐Ÿฅž': 'pancakes', '๐Ÿง‡': 'waffle',
188
+ '๐Ÿž': 'bread', '๐Ÿฅ': 'croissant', '๐Ÿฅ–': 'baguette bread', '๐Ÿฅจ': 'pretzel',
189
+ '๐ŸŽ': 'red apple', '๐ŸŠ': 'tangerine', '๐Ÿ‹': 'lemon', '๐ŸŒ': 'banana', '๐Ÿ‰': 'watermelon',
190
+ '๐Ÿ‡': 'grapes', '๐Ÿ“': 'strawberry', '๐Ÿ’': 'cherries', '๐Ÿ‘': 'peach', '๐Ÿ': 'pineapple',
191
+ 'โ˜•': 'hot beverage', '๐Ÿต': 'teacup without handle', '๐Ÿงƒ': 'beverage box', '๐Ÿฅค': 'cup with straw',
192
+ '๐Ÿบ': 'beer mug', '๐Ÿป': 'clinking beer mugs', '๐Ÿฅ‚': 'clinking glasses',
193
+ '๐Ÿท': 'wine glass', '๐Ÿธ': 'cocktail glass', '๐Ÿน': 'tropical drink',
194
+ 'โšฝ': 'soccer ball', '๐Ÿ€': 'basketball', '๐Ÿˆ': 'american football', 'โšพ': 'baseball',
195
+ '๐ŸŽพ': 'tennis', '๐Ÿ': 'volleyball', '๐Ÿ‰': 'rugby football', '๐ŸŽฑ': 'pool 8 ball',
196
+ '๐Ÿ“': 'ping pong', '๐Ÿธ': 'badminton', '๐ŸฅŠ': 'boxing glove', '๐Ÿฅ‹': 'martial arts uniform',
197
+ }