@prolibu-suite/cobalt-core 0.9.0 → 0.9.2

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 (495) hide show
  1. package/custom-elements.json +589 -27
  2. package/dist/cjs/co-accordion.cjs.entry.js +2 -2
  3. package/dist/cjs/co-action-bar.cjs.entry.js +2 -2
  4. package/dist/cjs/co-app-shell.cjs.entry.js +2 -2
  5. package/dist/cjs/co-audio-player.cjs.entry.js +3 -3
  6. package/dist/cjs/co-autocomplete.cjs.entry.js +1 -1
  7. package/dist/cjs/co-avatar_2.cjs.entry.js +2 -2
  8. package/dist/cjs/co-badge.cjs.entry.js +1 -1
  9. package/dist/cjs/co-bottom-sheet.cjs.entry.js +10 -11
  10. package/dist/cjs/co-breadcrumb-item.cjs.entry.js +2 -2
  11. package/dist/cjs/co-breadcrumb.cjs.entry.js +1 -1
  12. package/dist/cjs/co-button-group.cjs.entry.js +2 -2
  13. package/dist/cjs/co-button.cjs.entry.js +2 -2
  14. package/dist/cjs/co-calendar-month_2.cjs.entry.js +3 -3
  15. package/dist/cjs/co-calendar_3.cjs.entry.js +42 -7
  16. package/dist/cjs/co-card.cjs.entry.js +2 -2
  17. package/dist/cjs/co-carousel-item.cjs.entry.js +1 -1
  18. package/dist/cjs/co-carousel.cjs.entry.js +2 -2
  19. package/dist/cjs/co-checkbox.cjs.entry.js +3 -3
  20. package/dist/cjs/co-chip_2.cjs.entry.js +11 -11
  21. package/dist/cjs/co-color-picker.cjs.entry.js +2 -2
  22. package/dist/cjs/co-column-picker.cjs.entry.js +2 -2
  23. package/dist/cjs/co-combobox.cjs.entry.js +1 -1
  24. package/dist/cjs/co-data-table-pagination.cjs.entry.js +4 -4
  25. package/dist/cjs/co-data-table.cjs.entry.js +127 -8
  26. package/dist/cjs/co-date-range.cjs.entry.js +1 -1
  27. package/dist/cjs/co-date-time-picker.cjs.entry.js +2 -2
  28. package/dist/cjs/co-drive-card.cjs.entry.js +1 -1
  29. package/dist/cjs/co-drop-zone.cjs.entry.js +1 -1
  30. package/dist/cjs/co-emoji-picker.cjs.entry.js +2808 -0
  31. package/dist/cjs/co-empty-state.cjs.entry.js +2 -2
  32. package/dist/cjs/co-event-calendar.cjs.entry.js +2 -2
  33. package/dist/cjs/co-event-popover.cjs.entry.js +1 -1
  34. package/dist/cjs/co-fab.cjs.entry.js +3 -3
  35. package/dist/cjs/co-file-field.cjs.entry.js +5 -5
  36. package/dist/cjs/co-file-type-tile.cjs.entry.js +2 -2
  37. package/dist/cjs/co-helper-text.cjs.entry.js +2 -2
  38. package/dist/cjs/co-icon-button.cjs.entry.js +2 -2
  39. package/dist/cjs/co-icon.cjs.entry.js +2 -2
  40. package/dist/cjs/co-json-field.cjs.entry.js +3 -3
  41. package/dist/cjs/co-lightbox.cjs.entry.js +4 -4
  42. package/dist/cjs/co-list-footer.cjs.entry.js +1 -1
  43. package/dist/cjs/co-list-item.cjs.entry.js +4 -4
  44. package/dist/cjs/co-media-thumb.cjs.entry.js +2 -2
  45. package/dist/cjs/co-menu-divider.cjs.entry.js +1 -1
  46. package/dist/cjs/co-menu.cjs.entry.js +1 -1
  47. package/dist/cjs/co-modal.cjs.entry.js +9 -3
  48. package/dist/cjs/co-navbar.cjs.entry.js +2 -2
  49. package/dist/cjs/co-number-field.cjs.entry.js +2 -2
  50. package/dist/cjs/co-overlay.cjs.entry.js +1 -1
  51. package/dist/cjs/co-page-header.cjs.entry.js +1 -1
  52. package/dist/cjs/co-phone-field.cjs.entry.js +1 -1
  53. package/dist/cjs/co-popover.cjs.entry.js +49 -3
  54. package/dist/cjs/co-progress-bar.cjs.entry.js +2 -2
  55. package/dist/cjs/co-progress-circle.cjs.entry.js +2 -2
  56. package/dist/cjs/co-provider-logo_2.cjs.entry.js +1 -1
  57. package/dist/cjs/co-radio.cjs.entry.js +3 -3
  58. package/dist/cjs/co-rating.cjs.entry.js +3 -3
  59. package/dist/cjs/co-ref-field.cjs.entry.js +13 -4
  60. package/dist/cjs/co-rich-text-editor.cjs.entry.js +3 -3
  61. package/dist/cjs/co-row.cjs.entry.js +2 -2
  62. package/dist/cjs/co-select.cjs.entry.js +13 -4
  63. package/dist/cjs/co-separator.cjs.entry.js +1 -1
  64. package/dist/cjs/co-sidebar-nav.cjs.entry.js +2 -2
  65. package/dist/cjs/co-sidebar.cjs.entry.js +2 -2
  66. package/dist/cjs/co-slider.cjs.entry.js +2 -2
  67. package/dist/cjs/co-switch.cjs.entry.js +3 -3
  68. package/dist/cjs/co-tab-group.cjs.entry.js +2 -2
  69. package/dist/cjs/co-tab.cjs.entry.js +2 -2
  70. package/dist/cjs/co-tags-field.cjs.entry.js +5 -5
  71. package/dist/cjs/co-textarea.cjs.entry.js +4 -4
  72. package/dist/cjs/co-toast.cjs.entry.js +2 -2
  73. package/dist/cjs/co-toggle-button-group.cjs.entry.js +2 -2
  74. package/dist/cjs/co-toggle-button.cjs.entry.js +2 -2
  75. package/dist/cjs/co-transfer-list.cjs.entry.js +2 -2
  76. package/dist/cjs/co-video.cjs.entry.js +2 -2
  77. package/dist/cjs/cobalt.cjs.js +1 -1
  78. package/dist/cjs/emojiNames.es-BjpSEJ0c.js +1925 -0
  79. package/dist/cjs/emojiNames.pt-DWupaZMJ.js +1925 -0
  80. package/dist/cjs/index-DK-2Lzmf.js +16 -12
  81. package/dist/cjs/loader.cjs.js +1 -1
  82. package/dist/cjs/slotContent-Bm9RcM_Q.js +34 -0
  83. package/dist/cobalt/cobalt.esm.js +1 -1
  84. package/dist/cobalt/{p-142506d9.entry.js → p-02ac492f.entry.js} +1 -1
  85. package/dist/cobalt/p-07904986.entry.js +1 -0
  86. package/dist/cobalt/{p-24e93fcb.entry.js → p-07d570a6.entry.js} +1 -1
  87. package/dist/cobalt/p-09799193.entry.js +1 -0
  88. package/dist/cobalt/{p-e5b5ae89.entry.js → p-0ccb672b.entry.js} +1 -1
  89. package/dist/cobalt/{p-49bde154.entry.js → p-0e91e5c4.entry.js} +1 -1
  90. package/dist/cobalt/{p-724b9b54.entry.js → p-17ae943c.entry.js} +1 -1
  91. package/dist/cobalt/{p-fa5c25d6.entry.js → p-18af9e44.entry.js} +1 -1
  92. package/dist/cobalt/{p-b9ac1f25.entry.js → p-18d34b01.entry.js} +1 -1
  93. package/dist/cobalt/{p-d7b00e5f.entry.js → p-1c68bc41.entry.js} +1 -1
  94. package/dist/cobalt/{p-2a9ba4c8.entry.js → p-2114c036.entry.js} +1 -1
  95. package/dist/cobalt/{p-37541725.entry.js → p-23a103a0.entry.js} +1 -1
  96. package/dist/cobalt/{p-7255ab63.entry.js → p-23b3ff3f.entry.js} +1 -1
  97. package/dist/cobalt/{p-baeb5d55.entry.js → p-2d329ac8.entry.js} +1 -1
  98. package/dist/cobalt/{p-417ce874.entry.js → p-2d81b292.entry.js} +1 -1
  99. package/dist/cobalt/{p-b64b0a07.entry.js → p-316c62c0.entry.js} +1 -1
  100. package/dist/cobalt/{p-c3c2087e.entry.js → p-33ea4a90.entry.js} +1 -1
  101. package/dist/cobalt/{p-8a93beb0.entry.js → p-342e1da4.entry.js} +1 -1
  102. package/dist/cobalt/p-3495fda1.entry.js +1 -0
  103. package/dist/cobalt/{p-5f1b273b.entry.js → p-36197363.entry.js} +1 -1
  104. package/dist/cobalt/{p-2d0354cc.entry.js → p-3f0eed59.entry.js} +1 -1
  105. package/dist/cobalt/{p-6d532475.entry.js → p-43bd298d.entry.js} +1 -1
  106. package/dist/cobalt/{p-81866f71.entry.js → p-4a503187.entry.js} +1 -1
  107. package/dist/cobalt/{p-c7a809c7.entry.js → p-4b083da4.entry.js} +1 -1
  108. package/dist/cobalt/{p-f1284fcd.entry.js → p-4c7e3984.entry.js} +1 -1
  109. package/dist/cobalt/p-4f754c9a.entry.js +1 -0
  110. package/dist/cobalt/p-54ae807d.entry.js +1 -0
  111. package/dist/cobalt/{p-d21da71a.entry.js → p-55566b37.entry.js} +1 -1
  112. package/dist/cobalt/p-682b3313.entry.js +1 -0
  113. package/dist/cobalt/{p-a5d84c7a.entry.js → p-7457aa89.entry.js} +1 -1
  114. package/dist/cobalt/{p-8b7a4f6c.entry.js → p-77719335.entry.js} +1 -1
  115. package/dist/cobalt/{p-94a8a119.entry.js → p-7c5e846a.entry.js} +1 -1
  116. package/dist/cobalt/{p-9c2ce487.entry.js → p-7c88163e.entry.js} +1 -1
  117. package/dist/cobalt/{p-12a0ae24.entry.js → p-7cf4b4ae.entry.js} +1 -1
  118. package/dist/cobalt/{p-3ac316e0.entry.js → p-7e53e9c8.entry.js} +1 -1
  119. package/dist/cobalt/{p-e99832a9.entry.js → p-8183f56f.entry.js} +1 -1
  120. package/dist/cobalt/p-8345b25f.entry.js +1 -0
  121. package/dist/cobalt/{p-b004c3bb.entry.js → p-88a0659f.entry.js} +1 -1
  122. package/dist/cobalt/{p-87fc5aed.entry.js → p-89e38c5e.entry.js} +1 -1
  123. package/dist/cobalt/{p-a074f2ba.entry.js → p-8eb485c8.entry.js} +1 -1
  124. package/dist/cobalt/{p-c31f5c1b.entry.js → p-8f38e24d.entry.js} +1 -1
  125. package/dist/cobalt/{p-f52f61d4.entry.js → p-8f600512.entry.js} +1 -1
  126. package/dist/cobalt/{p-09fe6ece.entry.js → p-95efe661.entry.js} +1 -1
  127. package/dist/cobalt/{p-c42c505c.entry.js → p-983af614.entry.js} +1 -1
  128. package/dist/cobalt/p-B6oiFdUY.js +1 -0
  129. package/dist/cobalt/p-CBX_oabB.js +1 -0
  130. package/dist/cobalt/p-a02db338.entry.js +1 -0
  131. package/dist/cobalt/{p-19f5d480.entry.js → p-a51d8775.entry.js} +1 -1
  132. package/dist/cobalt/{p-d3c765e3.entry.js → p-a6357340.entry.js} +1 -1
  133. package/dist/cobalt/p-a6b5cadd.entry.js +1 -0
  134. package/dist/cobalt/{p-5d7c26f2.entry.js → p-a8c64cc3.entry.js} +1 -1
  135. package/dist/cobalt/{p-19706923.entry.js → p-a9096b5c.entry.js} +1 -1
  136. package/dist/cobalt/{p-b800e107.entry.js → p-a9b29cc2.entry.js} +1 -1
  137. package/dist/cobalt/p-aafb9d11.entry.js +1 -0
  138. package/dist/cobalt/{p-cc72557d.entry.js → p-ab45d9bd.entry.js} +1 -1
  139. package/dist/cobalt/{p-43b1f8fb.entry.js → p-ac466658.entry.js} +1 -1
  140. package/dist/cobalt/{p-3ecc29fa.entry.js → p-ac91259e.entry.js} +1 -1
  141. package/dist/cobalt/{p-a45e2c00.entry.js → p-b0319a2d.entry.js} +1 -1
  142. package/dist/cobalt/{p-8206c7c0.entry.js → p-b8581787.entry.js} +1 -1
  143. package/dist/cobalt/{p-debe0d79.entry.js → p-bfc2a849.entry.js} +1 -1
  144. package/dist/cobalt/{p-4e2379e4.entry.js → p-c1e7fb32.entry.js} +1 -1
  145. package/dist/cobalt/{p-21832273.entry.js → p-c5684c79.entry.js} +1 -1
  146. package/dist/cobalt/p-c6b9b9d6.entry.js +1 -0
  147. package/dist/cobalt/{p-ed2ca588.entry.js → p-ce35c898.entry.js} +1 -1
  148. package/dist/cobalt/{p-e5296961.entry.js → p-d15d3a97.entry.js} +1 -1
  149. package/dist/cobalt/p-d40a465f.entry.js +1 -0
  150. package/dist/cobalt/{p-d85a751d.entry.js → p-d4debd6f.entry.js} +1 -1
  151. package/dist/cobalt/{p-7ec85887.entry.js → p-d629fb4e.entry.js} +1 -1
  152. package/dist/cobalt/p-da18b5f4.entry.js +1 -0
  153. package/dist/cobalt/{p-360714ae.entry.js → p-dca4cd5f.entry.js} +1 -1
  154. package/dist/cobalt/{p-a530bec2.entry.js → p-dea43204.entry.js} +1 -1
  155. package/dist/cobalt/{p-f4cebc1f.entry.js → p-dfcf667d.entry.js} +1 -1
  156. package/dist/cobalt/{p-9fe9e2fe.entry.js → p-e5495539.entry.js} +1 -1
  157. package/dist/cobalt/{p-39bce45f.entry.js → p-e8878cf9.entry.js} +1 -1
  158. package/dist/cobalt/{p-39007b6c.entry.js → p-ef5e1167.entry.js} +1 -1
  159. package/dist/cobalt/{p-b1ef5107.entry.js → p-fabe5fb2.entry.js} +1 -1
  160. package/dist/cobalt/{p-76dff399.entry.js → p-fb3a095b.entry.js} +1 -1
  161. package/dist/cobalt/p-reaWaY4g.js +1 -0
  162. package/dist/collection/collection-manifest.json +1 -0
  163. package/dist/collection/components/co-accordion/co-accordion.js +2 -2
  164. package/dist/collection/components/co-action-bar/co-action-bar.js +2 -2
  165. package/dist/collection/components/co-app-shell/co-app-shell.js +2 -2
  166. package/dist/collection/components/co-audio-player/co-audio-player.js +3 -3
  167. package/dist/collection/components/co-autocomplete/co-autocomplete.css +1 -1
  168. package/dist/collection/components/co-autocomplete/co-autocomplete.js +1 -1
  169. package/dist/collection/components/co-avatar-group/co-avatar-group.js +1 -1
  170. package/dist/collection/components/co-badge/co-badge.js +1 -1
  171. package/dist/collection/components/co-bottom-sheet/co-bottom-sheet.js +10 -11
  172. package/dist/collection/components/co-breadcrumb/co-breadcrumb.js +1 -1
  173. package/dist/collection/components/co-breadcrumb-item/co-breadcrumb-item.js +2 -2
  174. package/dist/collection/components/co-button/co-button.js +2 -2
  175. package/dist/collection/components/co-button-group/co-button-group.js +2 -2
  176. package/dist/collection/components/co-calendar/co-calendar.js +1 -1
  177. package/dist/collection/components/co-calendar-month/co-calendar-month.js +1 -1
  178. package/dist/collection/components/co-calendar-timegrid/co-calendar-timegrid.js +2 -2
  179. package/dist/collection/components/co-card/co-card.js +2 -2
  180. package/dist/collection/components/co-carousel/co-carousel.js +2 -2
  181. package/dist/collection/components/co-carousel-item/co-carousel-item.js +1 -1
  182. package/dist/collection/components/co-checkbox/co-checkbox.js +3 -3
  183. package/dist/collection/components/co-checkbox-group/co-checkbox-group.js +1 -1
  184. package/dist/collection/components/co-chip/co-chip.js +2 -2
  185. package/dist/collection/components/co-color-picker/co-color-picker.js +2 -2
  186. package/dist/collection/components/co-column-picker/co-column-picker.js +2 -2
  187. package/dist/collection/components/co-combobox/co-combobox.css +3 -1
  188. package/dist/collection/components/co-combobox/co-combobox.js +1 -1
  189. package/dist/collection/components/co-command-search/co-command-search.js +1 -1
  190. package/dist/collection/components/co-data-table/co-data-table.css +33 -0
  191. package/dist/collection/components/co-data-table/co-data-table.js +90 -8
  192. package/dist/collection/components/co-data-table-pagination/co-data-table-pagination.js +4 -4
  193. package/dist/collection/components/co-date-field/co-date-field.js +4 -4
  194. package/dist/collection/components/co-date-range/co-date-range.js +1 -1
  195. package/dist/collection/components/co-date-range-picker/co-date-range-picker.js +2 -2
  196. package/dist/collection/components/co-date-time-picker/co-date-time-picker.js +2 -2
  197. package/dist/collection/components/co-drawer/co-drawer.css +5 -2
  198. package/dist/collection/components/co-drawer/co-drawer.js +43 -1
  199. package/dist/collection/components/co-drive-card/co-drive-card.js +1 -1
  200. package/dist/collection/components/co-drop-zone/co-drop-zone.js +1 -1
  201. package/dist/collection/components/co-emoji-picker/co-emoji-picker.css +290 -0
  202. package/dist/collection/components/co-emoji-picker/co-emoji-picker.js +682 -0
  203. package/dist/collection/components/co-emoji-picker/emojiData.js +1953 -0
  204. package/dist/collection/components/co-emoji-picker/emojiNames.es.js +1922 -0
  205. package/dist/collection/components/co-emoji-picker/emojiNames.pt.js +1922 -0
  206. package/dist/collection/components/co-emoji-picker/emojiPickerLogic.js +375 -0
  207. package/dist/collection/components/co-empty-state/co-empty-state.js +2 -2
  208. package/dist/collection/components/co-event-calendar/co-event-calendar.js +2 -2
  209. package/dist/collection/components/co-event-popover/co-event-popover.js +1 -1
  210. package/dist/collection/components/co-fab/co-fab.css +8 -5
  211. package/dist/collection/components/co-fab/co-fab.js +2 -2
  212. package/dist/collection/components/co-file-field/co-file-field.js +5 -5
  213. package/dist/collection/components/co-file-type-tile/co-file-type-tile.js +2 -2
  214. package/dist/collection/components/co-helper-text/co-helper-text.js +2 -2
  215. package/dist/collection/components/co-icon/co-icon.js +2 -2
  216. package/dist/collection/components/co-icon-button/co-icon-button.css +25 -0
  217. package/dist/collection/components/co-icon-button/co-icon-button.js +1 -1
  218. package/dist/collection/components/co-json-field/co-json-field.js +3 -3
  219. package/dist/collection/components/co-lightbox/co-lightbox.js +4 -4
  220. package/dist/collection/components/co-list-footer/co-list-footer.js +1 -1
  221. package/dist/collection/components/co-list-item/co-list-item.js +4 -4
  222. package/dist/collection/components/co-media-thumb/co-media-thumb.js +2 -2
  223. package/dist/collection/components/co-menu/co-menu.js +1 -1
  224. package/dist/collection/components/co-menu-divider/co-menu-divider.js +1 -1
  225. package/dist/collection/components/co-modal/co-modal.css +3 -1
  226. package/dist/collection/components/co-modal/co-modal.js +13 -2
  227. package/dist/collection/components/co-navbar/co-navbar.js +2 -2
  228. package/dist/collection/components/co-number-field/co-number-field.js +2 -2
  229. package/dist/collection/components/co-option-list/co-option-list.css +11 -9
  230. package/dist/collection/components/co-option-list/co-option-list.js +8 -8
  231. package/dist/collection/components/co-overlay/co-overlay.js +1 -1
  232. package/dist/collection/components/co-page-header/co-page-header.js +1 -1
  233. package/dist/collection/components/co-phone-field/co-phone-field.js +1 -1
  234. package/dist/collection/components/co-popover/co-popover.js +27 -5
  235. package/dist/collection/components/co-progress-bar/co-progress-bar.js +2 -2
  236. package/dist/collection/components/co-progress-circle/co-progress-circle.js +2 -2
  237. package/dist/collection/components/co-radio/co-radio.js +3 -3
  238. package/dist/collection/components/co-radio-group/co-radio-group.js +1 -1
  239. package/dist/collection/components/co-rating/co-rating.js +3 -3
  240. package/dist/collection/components/co-ref-field/co-ref-field.css +15 -0
  241. package/dist/collection/components/co-ref-field/co-ref-field.js +72 -4
  242. package/dist/collection/components/co-rich-text-editor/co-rich-text-editor.js +3 -3
  243. package/dist/collection/components/co-row/co-row.js +2 -2
  244. package/dist/collection/components/co-segmented-bar/co-segmented-bar.js +1 -1
  245. package/dist/collection/components/co-select/co-select.js +68 -5
  246. package/dist/collection/components/co-separator/co-separator.js +1 -1
  247. package/dist/collection/components/co-sidebar/co-sidebar.js +2 -2
  248. package/dist/collection/components/co-sidebar-nav/co-sidebar-nav.js +3 -3
  249. package/dist/collection/components/co-skeleton/co-skeleton.js +1 -1
  250. package/dist/collection/components/co-slider/co-slider.js +2 -2
  251. package/dist/collection/components/co-switch/co-switch.js +3 -3
  252. package/dist/collection/components/co-tab/co-tab.js +2 -2
  253. package/dist/collection/components/co-tab-group/co-tab-group.js +2 -2
  254. package/dist/collection/components/co-tags-field/co-tags-field.js +5 -5
  255. package/dist/collection/components/co-textarea/co-textarea.js +4 -4
  256. package/dist/collection/components/co-toast/co-toast.js +4 -4
  257. package/dist/collection/components/co-toggle-button/co-toggle-button.js +2 -2
  258. package/dist/collection/components/co-toggle-button-group/co-toggle-button-group.js +2 -2
  259. package/dist/collection/components/co-tooltip/co-tooltip.js +2 -2
  260. package/dist/collection/components/co-transfer-list/co-transfer-list.js +3 -3
  261. package/dist/collection/components/co-video/co-video.js +2 -2
  262. package/dist/collection/utils/columnResize.js +37 -0
  263. package/dist/collection/utils/emojiI18n.js +92 -0
  264. package/dist/collection/utils/popover-stack.js +28 -0
  265. package/dist/collection/utils/slotContent.js +30 -0
  266. package/dist/components/co-accordion.js +1 -1
  267. package/dist/components/co-action-bar.js +1 -1
  268. package/dist/components/co-app-shell.js +1 -1
  269. package/dist/components/co-audio-player.js +1 -1
  270. package/dist/components/co-autocomplete.js +1 -1
  271. package/dist/components/co-avatar-group.js +1 -1
  272. package/dist/components/co-avatar.js +1 -1
  273. package/dist/components/co-badge.js +1 -1
  274. package/dist/components/co-bottom-sheet.js +1 -1
  275. package/dist/components/co-breadcrumb-item.js +1 -1
  276. package/dist/components/co-breadcrumb.js +1 -1
  277. package/dist/components/co-button-group.js +1 -1
  278. package/dist/components/co-button.js +1 -1
  279. package/dist/components/co-calendar-month.js +1 -1
  280. package/dist/components/co-calendar-timegrid.js +1 -1
  281. package/dist/components/co-calendar.js +1 -1
  282. package/dist/components/co-card.js +1 -1
  283. package/dist/components/co-carousel-item.js +1 -1
  284. package/dist/components/co-carousel.js +1 -1
  285. package/dist/components/co-checkbox-group.js +1 -1
  286. package/dist/components/co-checkbox.js +1 -1
  287. package/dist/components/co-chip.js +1 -1
  288. package/dist/components/co-color-picker.js +1 -1
  289. package/dist/components/co-column-picker.js +1 -1
  290. package/dist/components/co-combobox.js +1 -1
  291. package/dist/components/co-command-search.js +1 -1
  292. package/dist/components/co-data-table-pagination.js +1 -1
  293. package/dist/components/co-data-table.js +1 -1
  294. package/dist/components/co-date-field.js +1 -1
  295. package/dist/components/co-date-picker.js +1 -1
  296. package/dist/components/co-date-range-picker.js +1 -1
  297. package/dist/components/co-date-range.js +1 -1
  298. package/dist/components/co-date-time-picker.js +1 -1
  299. package/dist/components/co-drawer.js +1 -1
  300. package/dist/components/co-drive-card.js +1 -1
  301. package/dist/components/co-drop-zone.js +1 -1
  302. package/dist/components/co-emoji-picker.d.ts +11 -0
  303. package/dist/components/co-emoji-picker.js +1 -0
  304. package/dist/components/co-empty-state.js +1 -1
  305. package/dist/components/co-event-calendar.js +1 -1
  306. package/dist/components/co-event-popover.js +1 -1
  307. package/dist/components/co-fab.js +1 -1
  308. package/dist/components/co-file-field.js +1 -1
  309. package/dist/components/co-file-type-tile.js +1 -1
  310. package/dist/components/co-helper-text.js +1 -1
  311. package/dist/components/co-icon-button.js +1 -1
  312. package/dist/components/co-icon.js +1 -1
  313. package/dist/components/co-input.js +1 -1
  314. package/dist/components/co-json-field.js +1 -1
  315. package/dist/components/co-lightbox.js +1 -1
  316. package/dist/components/co-list-footer.js +1 -1
  317. package/dist/components/co-list-item.js +1 -1
  318. package/dist/components/co-media-thumb.js +1 -1
  319. package/dist/components/co-menu-divider.js +1 -1
  320. package/dist/components/co-menu-item.js +1 -1
  321. package/dist/components/co-menu.js +1 -1
  322. package/dist/components/co-modal.js +1 -1
  323. package/dist/components/co-navbar.js +1 -1
  324. package/dist/components/co-number-field.js +1 -1
  325. package/dist/components/co-option-list.js +1 -1
  326. package/dist/components/co-overlay.js +1 -1
  327. package/dist/components/co-page-header.js +1 -1
  328. package/dist/components/co-phone-field.js +1 -1
  329. package/dist/components/co-popover.js +1 -1
  330. package/dist/components/co-progress-bar.js +1 -1
  331. package/dist/components/co-progress-circle.js +1 -1
  332. package/dist/components/co-radio-group.js +1 -1
  333. package/dist/components/co-radio.js +1 -1
  334. package/dist/components/co-rating.js +1 -1
  335. package/dist/components/co-ref-field.js +1 -1
  336. package/dist/components/co-rich-text-editor.js +1 -1
  337. package/dist/components/co-rich-text-toolbar.js +1 -1
  338. package/dist/components/co-row.js +1 -1
  339. package/dist/components/co-select.js +1 -1
  340. package/dist/components/co-separator.js +1 -1
  341. package/dist/components/co-sidebar-nav.js +1 -1
  342. package/dist/components/co-sidebar.js +1 -1
  343. package/dist/components/co-skeleton.js +1 -1
  344. package/dist/components/co-slider.js +1 -1
  345. package/dist/components/co-switch.js +1 -1
  346. package/dist/components/co-tab-group.js +1 -1
  347. package/dist/components/co-tab.js +1 -1
  348. package/dist/components/co-tags-field.js +1 -1
  349. package/dist/components/co-textarea.js +1 -1
  350. package/dist/components/co-toast.js +1 -1
  351. package/dist/components/co-toggle-button-group.js +1 -1
  352. package/dist/components/co-toggle-button.js +1 -1
  353. package/dist/components/co-tooltip.js +1 -1
  354. package/dist/components/co-transfer-list.js +1 -1
  355. package/dist/components/co-video.js +1 -1
  356. package/dist/components/p-AvSaw4Ua.js +1 -0
  357. package/dist/components/p-B3TkpLNh.js +1 -0
  358. package/dist/components/p-B6oiFdUY.js +1 -0
  359. package/dist/components/{p-CmxZEGYq.js → p-B7hvddnu.js} +1 -1
  360. package/dist/components/{p-Ce0ZJcks.js → p-BGD3oQ73.js} +1 -1
  361. package/dist/components/{p-CJNo2JDc.js → p-BT5tSgZa.js} +1 -1
  362. package/dist/components/{p-CYv2ig6I.js → p-BsQQ7Mki.js} +1 -1
  363. package/dist/components/p-CBX_oabB.js +1 -0
  364. package/dist/components/{p-Cv5yuGLz.js → p-CXLX8DpD.js} +1 -1
  365. package/dist/components/{p-DFT1qsVu.js → p-CklsvHeL.js} +1 -1
  366. package/dist/components/{p-CKKBJaNB.js → p-CyMaOb1j.js} +1 -1
  367. package/dist/components/{p-xvWmYN3W.js → p-D5QJpmqf.js} +1 -1
  368. package/dist/components/{p-BlvsTlsS.js → p-D6OUW6oW.js} +1 -1
  369. package/dist/components/p-DP0bbhfN.js +1 -0
  370. package/dist/components/{p-BUE9mBqk.js → p-DTvb412h.js} +1 -1
  371. package/dist/components/{p-Bsll5Ofy.js → p-DkmKOF60.js} +1 -1
  372. package/dist/components/{p-re2gJwnQ.js → p-DolCkNsL.js} +1 -1
  373. package/dist/components/{p-CkQqqKRp.js → p-KWTokD0C.js} +1 -1
  374. package/dist/components/{p-BCnjq3jN.js → p-Q6caHt79.js} +1 -1
  375. package/dist/components/{p-2zy1K6zg.js → p-WWlZiln1.js} +1 -1
  376. package/dist/components/{p-DAaKsGqj.js → p-_131DL6m.js} +1 -1
  377. package/dist/components/{p-ushHimOL.js → p-gI62K3Be.js} +1 -1
  378. package/dist/components/{p-_YYd42XM.js → p-mom5kiBa.js} +1 -1
  379. package/dist/components/p-nwy6X1QT.js +1 -0
  380. package/dist/components/p-reaWaY4g.js +1 -0
  381. package/dist/esm/co-accordion.entry.js +2 -2
  382. package/dist/esm/co-action-bar.entry.js +2 -2
  383. package/dist/esm/co-app-shell.entry.js +2 -2
  384. package/dist/esm/co-audio-player.entry.js +3 -3
  385. package/dist/esm/co-autocomplete.entry.js +1 -1
  386. package/dist/esm/co-avatar_2.entry.js +2 -2
  387. package/dist/esm/co-badge.entry.js +1 -1
  388. package/dist/esm/co-bottom-sheet.entry.js +10 -11
  389. package/dist/esm/co-breadcrumb-item.entry.js +2 -2
  390. package/dist/esm/co-breadcrumb.entry.js +1 -1
  391. package/dist/esm/co-button-group.entry.js +2 -2
  392. package/dist/esm/co-button.entry.js +2 -2
  393. package/dist/esm/co-calendar-month_2.entry.js +3 -3
  394. package/dist/esm/co-calendar_3.entry.js +42 -7
  395. package/dist/esm/co-card.entry.js +2 -2
  396. package/dist/esm/co-carousel-item.entry.js +1 -1
  397. package/dist/esm/co-carousel.entry.js +2 -2
  398. package/dist/esm/co-checkbox.entry.js +3 -3
  399. package/dist/esm/co-chip_2.entry.js +11 -11
  400. package/dist/esm/co-color-picker.entry.js +2 -2
  401. package/dist/esm/co-column-picker.entry.js +2 -2
  402. package/dist/esm/co-combobox.entry.js +1 -1
  403. package/dist/esm/co-data-table-pagination.entry.js +4 -4
  404. package/dist/esm/co-data-table.entry.js +127 -8
  405. package/dist/esm/co-date-range.entry.js +1 -1
  406. package/dist/esm/co-date-time-picker.entry.js +2 -2
  407. package/dist/esm/co-drive-card.entry.js +1 -1
  408. package/dist/esm/co-drop-zone.entry.js +1 -1
  409. package/dist/esm/co-emoji-picker.entry.js +2806 -0
  410. package/dist/esm/co-empty-state.entry.js +2 -2
  411. package/dist/esm/co-event-calendar.entry.js +2 -2
  412. package/dist/esm/co-event-popover.entry.js +1 -1
  413. package/dist/esm/co-fab.entry.js +3 -3
  414. package/dist/esm/co-file-field.entry.js +5 -5
  415. package/dist/esm/co-file-type-tile.entry.js +2 -2
  416. package/dist/esm/co-helper-text.entry.js +2 -2
  417. package/dist/esm/co-icon-button.entry.js +2 -2
  418. package/dist/esm/co-icon.entry.js +2 -2
  419. package/dist/esm/co-json-field.entry.js +3 -3
  420. package/dist/esm/co-lightbox.entry.js +4 -4
  421. package/dist/esm/co-list-footer.entry.js +1 -1
  422. package/dist/esm/co-list-item.entry.js +4 -4
  423. package/dist/esm/co-media-thumb.entry.js +2 -2
  424. package/dist/esm/co-menu-divider.entry.js +1 -1
  425. package/dist/esm/co-menu.entry.js +1 -1
  426. package/dist/esm/co-modal.entry.js +9 -3
  427. package/dist/esm/co-navbar.entry.js +2 -2
  428. package/dist/esm/co-number-field.entry.js +2 -2
  429. package/dist/esm/co-overlay.entry.js +1 -1
  430. package/dist/esm/co-page-header.entry.js +1 -1
  431. package/dist/esm/co-phone-field.entry.js +1 -1
  432. package/dist/esm/co-popover.entry.js +49 -3
  433. package/dist/esm/co-progress-bar.entry.js +2 -2
  434. package/dist/esm/co-progress-circle.entry.js +2 -2
  435. package/dist/esm/co-provider-logo_2.entry.js +1 -1
  436. package/dist/esm/co-radio.entry.js +3 -3
  437. package/dist/esm/co-rating.entry.js +3 -3
  438. package/dist/esm/co-ref-field.entry.js +13 -4
  439. package/dist/esm/co-rich-text-editor.entry.js +3 -3
  440. package/dist/esm/co-row.entry.js +2 -2
  441. package/dist/esm/co-select.entry.js +13 -4
  442. package/dist/esm/co-separator.entry.js +1 -1
  443. package/dist/esm/co-sidebar-nav.entry.js +2 -2
  444. package/dist/esm/co-sidebar.entry.js +2 -2
  445. package/dist/esm/co-slider.entry.js +2 -2
  446. package/dist/esm/co-switch.entry.js +3 -3
  447. package/dist/esm/co-tab-group.entry.js +2 -2
  448. package/dist/esm/co-tab.entry.js +2 -2
  449. package/dist/esm/co-tags-field.entry.js +5 -5
  450. package/dist/esm/co-textarea.entry.js +4 -4
  451. package/dist/esm/co-toast.entry.js +2 -2
  452. package/dist/esm/co-toggle-button-group.entry.js +2 -2
  453. package/dist/esm/co-toggle-button.entry.js +2 -2
  454. package/dist/esm/co-transfer-list.entry.js +2 -2
  455. package/dist/esm/co-video.entry.js +2 -2
  456. package/dist/esm/cobalt.js +1 -1
  457. package/dist/esm/emojiNames.es-reaWaY4g.js +1923 -0
  458. package/dist/esm/emojiNames.pt-B6oiFdUY.js +1923 -0
  459. package/dist/esm/index-CrtiywTB.js +16 -12
  460. package/dist/esm/loader.js +1 -1
  461. package/dist/esm/slotContent-CBX_oabB.js +32 -0
  462. package/dist/types/components/co-bottom-sheet/co-bottom-sheet.d.ts +0 -1
  463. package/dist/types/components/co-data-table/co-data-table.d.ts +5 -0
  464. package/dist/types/components/co-drawer/co-drawer.d.ts +23 -0
  465. package/dist/types/components/co-emoji-picker/co-emoji-picker.d.ts +145 -0
  466. package/dist/types/components/co-emoji-picker/emojiData.d.ts +24 -0
  467. package/dist/types/components/co-emoji-picker/emojiNames.es.d.ts +12 -0
  468. package/dist/types/components/co-emoji-picker/emojiNames.pt.d.ts +12 -0
  469. package/dist/types/components/co-emoji-picker/emojiPickerLogic.d.ts +149 -0
  470. package/dist/types/components/co-modal/co-modal.d.ts +2 -0
  471. package/dist/types/components/co-popover/co-popover.d.ts +8 -1
  472. package/dist/types/components/co-ref-field/co-ref-field.d.ts +17 -0
  473. package/dist/types/components/co-select/co-select.d.ts +7 -0
  474. package/dist/types/components.d.ts +255 -2
  475. package/dist/types/utils/columnResize.d.ts +42 -0
  476. package/dist/types/utils/emojiI18n.d.ts +22 -0
  477. package/dist/types/utils/popover-stack.d.ts +5 -0
  478. package/dist/types/utils/slotContent.d.ts +19 -0
  479. package/package.json +4 -4
  480. package/dist/cobalt/p-212ed2ba.entry.js +0 -1
  481. package/dist/cobalt/p-2aeb1471.entry.js +0 -1
  482. package/dist/cobalt/p-30ec230e.entry.js +0 -1
  483. package/dist/cobalt/p-5ddebd10.entry.js +0 -1
  484. package/dist/cobalt/p-5f0f5d4b.entry.js +0 -1
  485. package/dist/cobalt/p-7521ec0c.entry.js +0 -1
  486. package/dist/cobalt/p-77593319.entry.js +0 -1
  487. package/dist/cobalt/p-7a2dab23.entry.js +0 -1
  488. package/dist/cobalt/p-e054cb52.entry.js +0 -1
  489. package/dist/cobalt/p-e612b43c.entry.js +0 -1
  490. package/dist/cobalt/p-e7e34852.entry.js +0 -1
  491. package/dist/cobalt/p-f1731fe9.entry.js +0 -1
  492. package/dist/components/p-Bh2__nEw.js +0 -1
  493. package/dist/components/p-BiefJDu3.js +0 -1
  494. package/dist/components/p-CL4dicvk.js +0 -1
  495. package/dist/components/p-DTJsO_Eg.js +0 -1
@@ -0,0 +1,2808 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-DK-2Lzmf.js');
4
+ var dateI18n = require('./dateI18n-wblvKRq_.js');
5
+ var normalizeText = require('./normalizeText-B-v-XPKf.js');
6
+
7
+ /**
8
+ * Built-in UI string dictionary for co-emoji-picker (chrome + aria labels +
9
+ * category names). Same strategy as dateI18n/lightboxI18n/carouselI18n: ships
10
+ * es/en/pt keyed by the `locale` prop, with per-string prop overrides
11
+ * (`search-placeholder`, `empty-message`) for full host control.
12
+ *
13
+ * Los NOMBRES de los emoji no están acá: viven en los packs generados
14
+ * (`emojiNames.<locale>.ts`), que se cargan bajo demanda.
15
+ */
16
+ const DICT = {
17
+ es: {
18
+ searchPlaceholder: 'Buscar emoji…',
19
+ emptyMessage: 'Sin resultados',
20
+ pickerLabel: 'Selector de emoji',
21
+ gridLabel: 'Emojis',
22
+ categoriesLabel: 'Categorías',
23
+ categories: {
24
+ smileys: 'Caras y emociones',
25
+ people: 'Personas y cuerpo',
26
+ animals: 'Animales y naturaleza',
27
+ food: 'Comida y bebida',
28
+ travel: 'Viajes y lugares',
29
+ activities: 'Actividades',
30
+ objects: 'Objetos',
31
+ symbols: 'Símbolos',
32
+ flags: 'Banderas',
33
+ recent: 'Recientes',
34
+ },
35
+ skinToneLabel: 'Tono de piel',
36
+ skinTones: ['Por defecto', 'Claro', 'Claro medio', 'Medio', 'Oscuro medio', 'Oscuro'],
37
+ },
38
+ en: {
39
+ searchPlaceholder: 'Search emoji…',
40
+ emptyMessage: 'No results found',
41
+ pickerLabel: 'Emoji picker',
42
+ gridLabel: 'Emojis',
43
+ categoriesLabel: 'Categories',
44
+ categories: {
45
+ smileys: 'Smileys & emotion',
46
+ people: 'People & body',
47
+ animals: 'Animals & nature',
48
+ food: 'Food & drink',
49
+ travel: 'Travel & places',
50
+ activities: 'Activities',
51
+ objects: 'Objects',
52
+ symbols: 'Symbols',
53
+ flags: 'Flags',
54
+ recent: 'Recently used',
55
+ },
56
+ skinToneLabel: 'Skin tone',
57
+ skinTones: ['Default', 'Light', 'Medium-light', 'Medium', 'Medium-dark', 'Dark'],
58
+ },
59
+ pt: {
60
+ searchPlaceholder: 'Buscar emoji…',
61
+ emptyMessage: 'Nenhum resultado',
62
+ pickerLabel: 'Seletor de emoji',
63
+ gridLabel: 'Emojis',
64
+ categoriesLabel: 'Categorias',
65
+ categories: {
66
+ smileys: 'Rostos e emoções',
67
+ people: 'Pessoas e corpo',
68
+ animals: 'Animais e natureza',
69
+ food: 'Comida e bebida',
70
+ travel: 'Viagens e lugares',
71
+ activities: 'Atividades',
72
+ objects: 'Objetos',
73
+ symbols: 'Símbolos',
74
+ flags: 'Bandeiras',
75
+ recent: 'Recentes',
76
+ },
77
+ skinToneLabel: 'Tom de pele',
78
+ skinTones: ['Padrão', 'Claro', 'Claro médio', 'Médio', 'Escuro médio', 'Escuro'],
79
+ },
80
+ };
81
+ /** Ícono Phosphor de cada categoría, para el strip de navegación. */
82
+ const EMOJI_CATEGORY_ICONS = {
83
+ smileys: 'smiley',
84
+ people: 'hand-waving',
85
+ animals: 'dog',
86
+ food: 'hamburger',
87
+ travel: 'airplane-tilt',
88
+ activities: 'basketball',
89
+ objects: 'lightbulb',
90
+ symbols: 'heart',
91
+ flags: 'flag',
92
+ recent: 'clock-counter-clockwise',
93
+ };
94
+ /** Resolve the built-in UI strings for a locale. */
95
+ function getEmojiStrings(locale) {
96
+ return DICT[dateI18n.langFromLocale(locale)];
97
+ }
98
+
99
+ // ⚠️ ARCHIVO GENERADO — no editar a mano.
100
+ // Regenerar con: node scripts/generate-emoji-data.mjs
101
+ // Fuentes: unicode-emoji-json@0.8.0 · cldr-annotations-modern@45.0.0
102
+ /** Slugs de categoría, en orden de presentación (orden Unicode). */
103
+ const EMOJI_CATEGORIES = [
104
+ 'smileys',
105
+ 'people',
106
+ 'animals',
107
+ 'food',
108
+ 'travel',
109
+ 'activities',
110
+ 'objects',
111
+ 'symbols',
112
+ 'flags',
113
+ ];
114
+ /**
115
+ * Un string empaquetado por categoría, alineado por índice con
116
+ * EMOJI_CATEGORIES. Cada línea es `<emoji> <nombre en inglés>`: el carácter
117
+ * llega hasta el primer espacio, el resto es el nombre.
118
+ *
119
+ * Formato de texto y no un array de objetos a propósito: el mismo dato como
120
+ * JSON de objetos pesa ~2.6× crudo y comprime peor (los delimitadores se
121
+ * repiten 1906 veces). Se parsea una sola vez, on-demand, en emojiPickerLogic.
122
+ */
123
+ const EMOJI_PACKED = [
124
+ `😀 grinning face
125
+ 😃 grinning face with big eyes
126
+ 😄 grinning face with smiling eyes
127
+ 😁 beaming face with smiling eyes
128
+ 😆 grinning squinting face
129
+ 😅 grinning face with sweat
130
+ 🤣 rolling on the floor laughing
131
+ 😂 face with tears of joy
132
+ 🙂 slightly smiling face
133
+ 🙃 upside-down face
134
+ 🫠 melting face
135
+ 😉 winking face
136
+ 😊 smiling face with smiling eyes
137
+ 😇 smiling face with halo
138
+ 🥰 smiling face with hearts
139
+ 😍 smiling face with heart-eyes
140
+ 🤩 star-struck
141
+ 😘 face blowing a kiss
142
+ 😗 kissing face
143
+ ☺️ smiling face
144
+ 😚 kissing face with closed eyes
145
+ 😙 kissing face with smiling eyes
146
+ 🥲 smiling face with tear
147
+ 😋 face savoring food
148
+ 😛 face with tongue
149
+ 😜 winking face with tongue
150
+ 🤪 zany face
151
+ 😝 squinting face with tongue
152
+ 🤑 money-mouth face
153
+ 🤗 smiling face with open hands
154
+ 🤭 face with hand over mouth
155
+ 🫢 face with open eyes and hand over mouth
156
+ 🫣 face with peeking eye
157
+ 🤫 shushing face
158
+ 🤔 thinking face
159
+ 🫡 saluting face
160
+ 🤐 zipper-mouth face
161
+ 🤨 face with raised eyebrow
162
+ 😐 neutral face
163
+ 😑 expressionless face
164
+ 😶 face without mouth
165
+ 🫥 dotted line face
166
+ 😶‍🌫️ face in clouds
167
+ 😏 smirking face
168
+ 😒 unamused face
169
+ 🙄 face with rolling eyes
170
+ 😬 grimacing face
171
+ 😮‍💨 face exhaling
172
+ 🤥 lying face
173
+ 🫨 shaking face
174
+ 🙂‍↔️ head shaking horizontally
175
+ 🙂‍↕️ head shaking vertically
176
+ 😌 relieved face
177
+ 😔 pensive face
178
+ 😪 sleepy face
179
+ 🤤 drooling face
180
+ 😴 sleeping face
181
+ 🫩 face with bags under eyes
182
+ 😷 face with medical mask
183
+ 🤒 face with thermometer
184
+ 🤕 face with head-bandage
185
+ 🤢 nauseated face
186
+ 🤮 face vomiting
187
+ 🤧 sneezing face
188
+ 🥵 hot face
189
+ 🥶 cold face
190
+ 🥴 woozy face
191
+ 😵 face with crossed-out eyes
192
+ 😵‍💫 face with spiral eyes
193
+ 🤯 exploding head
194
+ 🤠 cowboy hat face
195
+ 🥳 partying face
196
+ 🥸 disguised face
197
+ 😎 smiling face with sunglasses
198
+ 🤓 nerd face
199
+ 🧐 face with monocle
200
+ 😕 confused face
201
+ 🫤 face with diagonal mouth
202
+ 😟 worried face
203
+ 🙁 slightly frowning face
204
+ ☹️ frowning face
205
+ 😮 face with open mouth
206
+ 😯 hushed face
207
+ 😲 astonished face
208
+ 😳 flushed face
209
+ 🥺 pleading face
210
+ 🥹 face holding back tears
211
+ 😦 frowning face with open mouth
212
+ 😧 anguished face
213
+ 😨 fearful face
214
+ 😰 anxious face with sweat
215
+ 😥 sad but relieved face
216
+ 😢 crying face
217
+ 😭 loudly crying face
218
+ 😱 face screaming in fear
219
+ 😖 confounded face
220
+ 😣 persevering face
221
+ 😞 disappointed face
222
+ 😓 downcast face with sweat
223
+ 😩 weary face
224
+ 😫 tired face
225
+ 🥱 yawning face
226
+ 😤 face with steam from nose
227
+ 😡 enraged face
228
+ 😠 angry face
229
+ 🤬 face with symbols on mouth
230
+ 😈 smiling face with horns
231
+ 👿 angry face with horns
232
+ 💀 skull
233
+ ☠️ skull and crossbones
234
+ 💩 pile of poo
235
+ 🤡 clown face
236
+ 👹 ogre
237
+ 👺 goblin
238
+ 👻 ghost
239
+ 👽 alien
240
+ 👾 alien monster
241
+ 🤖 robot
242
+ 😺 grinning cat
243
+ 😸 grinning cat with smiling eyes
244
+ 😹 cat with tears of joy
245
+ 😻 smiling cat with heart-eyes
246
+ 😼 cat with wry smile
247
+ 😽 kissing cat
248
+ 🙀 weary cat
249
+ 😿 crying cat
250
+ 😾 pouting cat
251
+ 🙈 see-no-evil monkey
252
+ 🙉 hear-no-evil monkey
253
+ 🙊 speak-no-evil monkey
254
+ 💌 love letter
255
+ 💘 heart with arrow
256
+ 💝 heart with ribbon
257
+ 💖 sparkling heart
258
+ 💗 growing heart
259
+ 💓 beating heart
260
+ 💞 revolving hearts
261
+ 💕 two hearts
262
+ 💟 heart decoration
263
+ ❣️ heart exclamation
264
+ 💔 broken heart
265
+ ❤️‍🔥 heart on fire
266
+ ❤️‍🩹 mending heart
267
+ ❤️ red heart
268
+ 🩷 pink heart
269
+ 🧡 orange heart
270
+ 💛 yellow heart
271
+ 💚 green heart
272
+ 💙 blue heart
273
+ 🩵 light blue heart
274
+ 💜 purple heart
275
+ 🤎 brown heart
276
+ 🖤 black heart
277
+ 🩶 grey heart
278
+ 🤍 white heart
279
+ 💋 kiss mark
280
+ 💯 hundred points
281
+ 💢 anger symbol
282
+ 💥 collision
283
+ 💫 dizzy
284
+ 💦 sweat droplets
285
+ 💨 dashing away
286
+ 🕳️ hole
287
+ 💬 speech balloon
288
+ 👁️‍🗨️ eye in speech bubble
289
+ 🗨️ left speech bubble
290
+ 🗯️ right anger bubble
291
+ 💭 thought balloon
292
+ 💤 ZZZ`,
293
+ `👋 waving hand
294
+ 🤚 raised back of hand
295
+ 🖐️ hand with fingers splayed
296
+ ✋ raised hand
297
+ 🖖 vulcan salute
298
+ 🫱 rightwards hand
299
+ 🫲 leftwards hand
300
+ 🫳 palm down hand
301
+ 🫴 palm up hand
302
+ 🫷 leftwards pushing hand
303
+ 🫸 rightwards pushing hand
304
+ 👌 OK hand
305
+ 🤌 pinched fingers
306
+ 🤏 pinching hand
307
+ ✌️ victory hand
308
+ 🤞 crossed fingers
309
+ 🫰 hand with index finger and thumb crossed
310
+ 🤟 love-you gesture
311
+ 🤘 sign of the horns
312
+ 🤙 call me hand
313
+ 👈 backhand index pointing left
314
+ 👉 backhand index pointing right
315
+ 👆 backhand index pointing up
316
+ 🖕 middle finger
317
+ 👇 backhand index pointing down
318
+ ☝️ index pointing up
319
+ 🫵 index pointing at the viewer
320
+ 👍 thumbs up
321
+ 👎 thumbs down
322
+ ✊ raised fist
323
+ 👊 oncoming fist
324
+ 🤛 left-facing fist
325
+ 🤜 right-facing fist
326
+ 👏 clapping hands
327
+ 🙌 raising hands
328
+ 🫶 heart hands
329
+ 👐 open hands
330
+ 🤲 palms up together
331
+ 🤝 handshake
332
+ 🙏 folded hands
333
+ ✍️ writing hand
334
+ 💅 nail polish
335
+ 🤳 selfie
336
+ 💪 flexed biceps
337
+ 🦾 mechanical arm
338
+ 🦿 mechanical leg
339
+ 🦵 leg
340
+ 🦶 foot
341
+ 👂 ear
342
+ 🦻 ear with hearing aid
343
+ 👃 nose
344
+ 🧠 brain
345
+ 🫀 anatomical heart
346
+ 🫁 lungs
347
+ 🦷 tooth
348
+ 🦴 bone
349
+ 👀 eyes
350
+ 👁️ eye
351
+ 👅 tongue
352
+ 👄 mouth
353
+ 🫦 biting lip
354
+ 👶 baby
355
+ 🧒 child
356
+ 👦 boy
357
+ 👧 girl
358
+ 🧑 person
359
+ 👱 person blond hair
360
+ 👨 man
361
+ 🧔 person beard
362
+ 🧔‍♂️ man beard
363
+ 🧔‍♀️ woman beard
364
+ 👨‍🦰 man red hair
365
+ 👨‍🦱 man curly hair
366
+ 👨‍🦳 man white hair
367
+ 👨‍🦲 man bald
368
+ 👩 woman
369
+ 👩‍🦰 woman red hair
370
+ 🧑‍🦰 person red hair
371
+ 👩‍🦱 woman curly hair
372
+ 🧑‍🦱 person curly hair
373
+ 👩‍🦳 woman white hair
374
+ 🧑‍🦳 person white hair
375
+ 👩‍🦲 woman bald
376
+ 🧑‍🦲 person bald
377
+ 👱‍♀️ woman blond hair
378
+ 👱‍♂️ man blond hair
379
+ 🧓 older person
380
+ 👴 old man
381
+ 👵 old woman
382
+ 🙍 person frowning
383
+ 🙍‍♂️ man frowning
384
+ 🙍‍♀️ woman frowning
385
+ 🙎 person pouting
386
+ 🙎‍♂️ man pouting
387
+ 🙎‍♀️ woman pouting
388
+ 🙅 person gesturing NO
389
+ 🙅‍♂️ man gesturing NO
390
+ 🙅‍♀️ woman gesturing NO
391
+ 🙆 person gesturing OK
392
+ 🙆‍♂️ man gesturing OK
393
+ 🙆‍♀️ woman gesturing OK
394
+ 💁 person tipping hand
395
+ 💁‍♂️ man tipping hand
396
+ 💁‍♀️ woman tipping hand
397
+ 🙋 person raising hand
398
+ 🙋‍♂️ man raising hand
399
+ 🙋‍♀️ woman raising hand
400
+ 🧏 deaf person
401
+ 🧏‍♂️ deaf man
402
+ 🧏‍♀️ deaf woman
403
+ 🙇 person bowing
404
+ 🙇‍♂️ man bowing
405
+ 🙇‍♀️ woman bowing
406
+ 🤦 person facepalming
407
+ 🤦‍♂️ man facepalming
408
+ 🤦‍♀️ woman facepalming
409
+ 🤷 person shrugging
410
+ 🤷‍♂️ man shrugging
411
+ 🤷‍♀️ woman shrugging
412
+ 🧑‍⚕️ health worker
413
+ 👨‍⚕️ man health worker
414
+ 👩‍⚕️ woman health worker
415
+ 🧑‍🎓 student
416
+ 👨‍🎓 man student
417
+ 👩‍🎓 woman student
418
+ 🧑‍🏫 teacher
419
+ 👨‍🏫 man teacher
420
+ 👩‍🏫 woman teacher
421
+ 🧑‍⚖️ judge
422
+ 👨‍⚖️ man judge
423
+ 👩‍⚖️ woman judge
424
+ 🧑‍🌾 farmer
425
+ 👨‍🌾 man farmer
426
+ 👩‍🌾 woman farmer
427
+ 🧑‍🍳 cook
428
+ 👨‍🍳 man cook
429
+ 👩‍🍳 woman cook
430
+ 🧑‍🔧 mechanic
431
+ 👨‍🔧 man mechanic
432
+ 👩‍🔧 woman mechanic
433
+ 🧑‍🏭 factory worker
434
+ 👨‍🏭 man factory worker
435
+ 👩‍🏭 woman factory worker
436
+ 🧑‍💼 office worker
437
+ 👨‍💼 man office worker
438
+ 👩‍💼 woman office worker
439
+ 🧑‍🔬 scientist
440
+ 👨‍🔬 man scientist
441
+ 👩‍🔬 woman scientist
442
+ 🧑‍💻 technologist
443
+ 👨‍💻 man technologist
444
+ 👩‍💻 woman technologist
445
+ 🧑‍🎤 singer
446
+ 👨‍🎤 man singer
447
+ 👩‍🎤 woman singer
448
+ 🧑‍🎨 artist
449
+ 👨‍🎨 man artist
450
+ 👩‍🎨 woman artist
451
+ 🧑‍✈️ pilot
452
+ 👨‍✈️ man pilot
453
+ 👩‍✈️ woman pilot
454
+ 🧑‍🚀 astronaut
455
+ 👨‍🚀 man astronaut
456
+ 👩‍🚀 woman astronaut
457
+ 🧑‍🚒 firefighter
458
+ 👨‍🚒 man firefighter
459
+ 👩‍🚒 woman firefighter
460
+ 👮 police officer
461
+ 👮‍♂️ man police officer
462
+ 👮‍♀️ woman police officer
463
+ 🕵️ detective
464
+ 🕵️‍♂️ man detective
465
+ 🕵️‍♀️ woman detective
466
+ 💂 guard
467
+ 💂‍♂️ man guard
468
+ 💂‍♀️ woman guard
469
+ 🥷 ninja
470
+ 👷 construction worker
471
+ 👷‍♂️ man construction worker
472
+ 👷‍♀️ woman construction worker
473
+ 🫅 person with crown
474
+ 🤴 prince
475
+ 👸 princess
476
+ 👳 person wearing turban
477
+ 👳‍♂️ man wearing turban
478
+ 👳‍♀️ woman wearing turban
479
+ 👲 person with skullcap
480
+ 🧕 woman with headscarf
481
+ 🤵 person in tuxedo
482
+ 🤵‍♂️ man in tuxedo
483
+ 🤵‍♀️ woman in tuxedo
484
+ 👰 person with veil
485
+ 👰‍♂️ man with veil
486
+ 👰‍♀️ woman with veil
487
+ 🤰 pregnant woman
488
+ 🫃 pregnant man
489
+ 🫄 pregnant person
490
+ 🤱 breast-feeding
491
+ 👩‍🍼 woman feeding baby
492
+ 👨‍🍼 man feeding baby
493
+ 🧑‍🍼 person feeding baby
494
+ 👼 baby angel
495
+ 🎅 Santa Claus
496
+ 🤶 Mrs. Claus
497
+ 🧑‍🎄 Mx Claus
498
+ 🦸 superhero
499
+ 🦸‍♂️ man superhero
500
+ 🦸‍♀️ woman superhero
501
+ 🦹 supervillain
502
+ 🦹‍♂️ man supervillain
503
+ 🦹‍♀️ woman supervillain
504
+ 🧙 mage
505
+ 🧙‍♂️ man mage
506
+ 🧙‍♀️ woman mage
507
+ 🧚 fairy
508
+ 🧚‍♂️ man fairy
509
+ 🧚‍♀️ woman fairy
510
+ 🧛 vampire
511
+ 🧛‍♂️ man vampire
512
+ 🧛‍♀️ woman vampire
513
+ 🧜 merperson
514
+ 🧜‍♂️ merman
515
+ 🧜‍♀️ mermaid
516
+ 🧝 elf
517
+ 🧝‍♂️ man elf
518
+ 🧝‍♀️ woman elf
519
+ 🧞 genie
520
+ 🧞‍♂️ man genie
521
+ 🧞‍♀️ woman genie
522
+ 🧟 zombie
523
+ 🧟‍♂️ man zombie
524
+ 🧟‍♀️ woman zombie
525
+ 🧌 troll
526
+ 💆 person getting massage
527
+ 💆‍♂️ man getting massage
528
+ 💆‍♀️ woman getting massage
529
+ 💇 person getting haircut
530
+ 💇‍♂️ man getting haircut
531
+ 💇‍♀️ woman getting haircut
532
+ 🚶 person walking
533
+ 🚶‍♂️ man walking
534
+ 🚶‍♀️ woman walking
535
+ 🚶‍➡️ person walking facing right
536
+ 🚶‍♀️‍➡️ woman walking facing right
537
+ 🚶‍♂️‍➡️ man walking facing right
538
+ 🧍 person standing
539
+ 🧍‍♂️ man standing
540
+ 🧍‍♀️ woman standing
541
+ 🧎 person kneeling
542
+ 🧎‍♂️ man kneeling
543
+ 🧎‍♀️ woman kneeling
544
+ 🧎‍➡️ person kneeling facing right
545
+ 🧎‍♀️‍➡️ woman kneeling facing right
546
+ 🧎‍♂️‍➡️ man kneeling facing right
547
+ 🧑‍🦯 person with white cane
548
+ 🧑‍🦯‍➡️ person with white cane facing right
549
+ 👨‍🦯 man with white cane
550
+ 👨‍🦯‍➡️ man with white cane facing right
551
+ 👩‍🦯 woman with white cane
552
+ 👩‍🦯‍➡️ woman with white cane facing right
553
+ 🧑‍🦼 person in motorized wheelchair
554
+ 🧑‍🦼‍➡️ person in motorized wheelchair facing right
555
+ 👨‍🦼 man in motorized wheelchair
556
+ 👨‍🦼‍➡️ man in motorized wheelchair facing right
557
+ 👩‍🦼 woman in motorized wheelchair
558
+ 👩‍🦼‍➡️ woman in motorized wheelchair facing right
559
+ 🧑‍🦽 person in manual wheelchair
560
+ 🧑‍🦽‍➡️ person in manual wheelchair facing right
561
+ 👨‍🦽 man in manual wheelchair
562
+ 👨‍🦽‍➡️ man in manual wheelchair facing right
563
+ 👩‍🦽 woman in manual wheelchair
564
+ 👩‍🦽‍➡️ woman in manual wheelchair facing right
565
+ 🏃 person running
566
+ 🏃‍♂️ man running
567
+ 🏃‍♀️ woman running
568
+ 🏃‍➡️ person running facing right
569
+ 🏃‍♀️‍➡️ woman running facing right
570
+ 🏃‍♂️‍➡️ man running facing right
571
+ 💃 woman dancing
572
+ 🕺 man dancing
573
+ 🕴️ person in suit levitating
574
+ 👯 people with bunny ears
575
+ 👯‍♂️ men with bunny ears
576
+ 👯‍♀️ women with bunny ears
577
+ 🧖 person in steamy room
578
+ 🧖‍♂️ man in steamy room
579
+ 🧖‍♀️ woman in steamy room
580
+ 🧗 person climbing
581
+ 🧗‍♂️ man climbing
582
+ 🧗‍♀️ woman climbing
583
+ 🤺 person fencing
584
+ 🏇 horse racing
585
+ ⛷️ skier
586
+ 🏂 snowboarder
587
+ 🏌️ person golfing
588
+ 🏌️‍♂️ man golfing
589
+ 🏌️‍♀️ woman golfing
590
+ 🏄 person surfing
591
+ 🏄‍♂️ man surfing
592
+ 🏄‍♀️ woman surfing
593
+ 🚣 person rowing boat
594
+ 🚣‍♂️ man rowing boat
595
+ 🚣‍♀️ woman rowing boat
596
+ 🏊 person swimming
597
+ 🏊‍♂️ man swimming
598
+ 🏊‍♀️ woman swimming
599
+ ⛹️ person bouncing ball
600
+ ⛹️‍♂️ man bouncing ball
601
+ ⛹️‍♀️ woman bouncing ball
602
+ 🏋️ person lifting weights
603
+ 🏋️‍♂️ man lifting weights
604
+ 🏋️‍♀️ woman lifting weights
605
+ 🚴 person biking
606
+ 🚴‍♂️ man biking
607
+ 🚴‍♀️ woman biking
608
+ 🚵 person mountain biking
609
+ 🚵‍♂️ man mountain biking
610
+ 🚵‍♀️ woman mountain biking
611
+ 🤸 person cartwheeling
612
+ 🤸‍♂️ man cartwheeling
613
+ 🤸‍♀️ woman cartwheeling
614
+ 🤼 people wrestling
615
+ 🤼‍♂️ men wrestling
616
+ 🤼‍♀️ women wrestling
617
+ 🤽 person playing water polo
618
+ 🤽‍♂️ man playing water polo
619
+ 🤽‍♀️ woman playing water polo
620
+ 🤾 person playing handball
621
+ 🤾‍♂️ man playing handball
622
+ 🤾‍♀️ woman playing handball
623
+ 🤹 person juggling
624
+ 🤹‍♂️ man juggling
625
+ 🤹‍♀️ woman juggling
626
+ 🧘 person in lotus position
627
+ 🧘‍♂️ man in lotus position
628
+ 🧘‍♀️ woman in lotus position
629
+ 🛀 person taking bath
630
+ 🛌 person in bed
631
+ 🧑‍🤝‍🧑 people holding hands
632
+ 👭 women holding hands
633
+ 👫 woman and man holding hands
634
+ 👬 men holding hands
635
+ 💏 kiss
636
+ 👩‍❤️‍💋‍👨 kiss woman, man
637
+ 👨‍❤️‍💋‍👨 kiss man, man
638
+ 👩‍❤️‍💋‍👩 kiss woman, woman
639
+ 💑 couple with heart
640
+ 👩‍❤️‍👨 couple with heart woman, man
641
+ 👨‍❤️‍👨 couple with heart man, man
642
+ 👩‍❤️‍👩 couple with heart woman, woman
643
+ 👨‍👩‍👦 family man, woman, boy
644
+ 👨‍👩‍👧 family man, woman, girl
645
+ 👨‍👩‍👧‍👦 family man, woman, girl, boy
646
+ 👨‍👩‍👦‍👦 family man, woman, boy, boy
647
+ 👨‍👩‍👧‍👧 family man, woman, girl, girl
648
+ 👨‍👨‍👦 family man, man, boy
649
+ 👨‍👨‍👧 family man, man, girl
650
+ 👨‍👨‍👧‍👦 family man, man, girl, boy
651
+ 👨‍👨‍👦‍👦 family man, man, boy, boy
652
+ 👨‍👨‍👧‍👧 family man, man, girl, girl
653
+ 👩‍👩‍👦 family woman, woman, boy
654
+ 👩‍👩‍👧 family woman, woman, girl
655
+ 👩‍👩‍👧‍👦 family woman, woman, girl, boy
656
+ 👩‍👩‍👦‍👦 family woman, woman, boy, boy
657
+ 👩‍👩‍👧‍👧 family woman, woman, girl, girl
658
+ 👨‍👦 family man, boy
659
+ 👨‍👦‍👦 family man, boy, boy
660
+ 👨‍👧 family man, girl
661
+ 👨‍👧‍👦 family man, girl, boy
662
+ 👨‍👧‍👧 family man, girl, girl
663
+ 👩‍👦 family woman, boy
664
+ 👩‍👦‍👦 family woman, boy, boy
665
+ 👩‍👧 family woman, girl
666
+ 👩‍👧‍👦 family woman, girl, boy
667
+ 👩‍👧‍👧 family woman, girl, girl
668
+ 🗣️ speaking head
669
+ 👤 bust in silhouette
670
+ 👥 busts in silhouette
671
+ 🫂 people hugging
672
+ 👪 family
673
+ 🧑‍🧑‍🧒 family adult, adult, child
674
+ 🧑‍🧑‍🧒‍🧒 family adult, adult, child, child
675
+ 🧑‍🧒 family adult, child
676
+ 🧑‍🧒‍🧒 family adult, child, child
677
+ 👣 footprints
678
+ 🫆 fingerprint`,
679
+ `🐵 monkey face
680
+ 🐒 monkey
681
+ 🦍 gorilla
682
+ 🦧 orangutan
683
+ 🐶 dog face
684
+ 🐕 dog
685
+ 🦮 guide dog
686
+ 🐕‍🦺 service dog
687
+ 🐩 poodle
688
+ 🐺 wolf
689
+ 🦊 fox
690
+ 🦝 raccoon
691
+ 🐱 cat face
692
+ 🐈 cat
693
+ 🐈‍⬛ black cat
694
+ 🦁 lion
695
+ 🐯 tiger face
696
+ 🐅 tiger
697
+ 🐆 leopard
698
+ 🐴 horse face
699
+ 🫎 moose
700
+ 🫏 donkey
701
+ 🐎 horse
702
+ 🦄 unicorn
703
+ 🦓 zebra
704
+ 🦌 deer
705
+ 🦬 bison
706
+ 🐮 cow face
707
+ 🐂 ox
708
+ 🐃 water buffalo
709
+ 🐄 cow
710
+ 🐷 pig face
711
+ 🐖 pig
712
+ 🐗 boar
713
+ 🐽 pig nose
714
+ 🐏 ram
715
+ 🐑 ewe
716
+ 🐐 goat
717
+ 🐪 camel
718
+ 🐫 two-hump camel
719
+ 🦙 llama
720
+ 🦒 giraffe
721
+ 🐘 elephant
722
+ 🦣 mammoth
723
+ 🦏 rhinoceros
724
+ 🦛 hippopotamus
725
+ 🐭 mouse face
726
+ 🐁 mouse
727
+ 🐀 rat
728
+ 🐹 hamster
729
+ 🐰 rabbit face
730
+ 🐇 rabbit
731
+ 🐿️ chipmunk
732
+ 🦫 beaver
733
+ 🦔 hedgehog
734
+ 🦇 bat
735
+ 🐻 bear
736
+ 🐻‍❄️ polar bear
737
+ 🐨 koala
738
+ 🐼 panda
739
+ 🦥 sloth
740
+ 🦦 otter
741
+ 🦨 skunk
742
+ 🦘 kangaroo
743
+ 🦡 badger
744
+ 🐾 paw prints
745
+ 🦃 turkey
746
+ 🐔 chicken
747
+ 🐓 rooster
748
+ 🐣 hatching chick
749
+ 🐤 baby chick
750
+ 🐥 front-facing baby chick
751
+ 🐦 bird
752
+ 🐧 penguin
753
+ 🕊️ dove
754
+ 🦅 eagle
755
+ 🦆 duck
756
+ 🦢 swan
757
+ 🦉 owl
758
+ 🦤 dodo
759
+ 🪶 feather
760
+ 🦩 flamingo
761
+ 🦚 peacock
762
+ 🦜 parrot
763
+ 🪽 wing
764
+ 🐦‍⬛ black bird
765
+ 🪿 goose
766
+ 🐦‍🔥 phoenix
767
+ 🐸 frog
768
+ 🐊 crocodile
769
+ 🐢 turtle
770
+ 🦎 lizard
771
+ 🐍 snake
772
+ 🐲 dragon face
773
+ 🐉 dragon
774
+ 🦕 sauropod
775
+ 🦖 T-Rex
776
+ 🐳 spouting whale
777
+ 🐋 whale
778
+ 🐬 dolphin
779
+ 🦭 seal
780
+ 🐟 fish
781
+ 🐠 tropical fish
782
+ 🐡 blowfish
783
+ 🦈 shark
784
+ 🐙 octopus
785
+ 🐚 spiral shell
786
+ 🪸 coral
787
+ 🪼 jellyfish
788
+ 🦀 crab
789
+ 🦞 lobster
790
+ 🦐 shrimp
791
+ 🦑 squid
792
+ 🦪 oyster
793
+ 🐌 snail
794
+ 🦋 butterfly
795
+ 🐛 bug
796
+ 🐜 ant
797
+ 🐝 honeybee
798
+ 🪲 beetle
799
+ 🐞 lady beetle
800
+ 🦗 cricket
801
+ 🪳 cockroach
802
+ 🕷️ spider
803
+ 🕸️ spider web
804
+ 🦂 scorpion
805
+ 🦟 mosquito
806
+ 🪰 fly
807
+ 🪱 worm
808
+ 🦠 microbe
809
+ 💐 bouquet
810
+ 🌸 cherry blossom
811
+ 💮 white flower
812
+ 🪷 lotus
813
+ 🏵️ rosette
814
+ 🌹 rose
815
+ 🥀 wilted flower
816
+ 🌺 hibiscus
817
+ 🌻 sunflower
818
+ 🌼 blossom
819
+ 🌷 tulip
820
+ 🪻 hyacinth
821
+ 🌱 seedling
822
+ 🪴 potted plant
823
+ 🌲 evergreen tree
824
+ 🌳 deciduous tree
825
+ 🌴 palm tree
826
+ 🌵 cactus
827
+ 🌾 sheaf of rice
828
+ 🌿 herb
829
+ ☘️ shamrock
830
+ 🍀 four leaf clover
831
+ 🍁 maple leaf
832
+ 🍂 fallen leaf
833
+ 🍃 leaf fluttering in wind
834
+ 🪹 empty nest
835
+ 🪺 nest with eggs
836
+ 🍄 mushroom
837
+ 🪾 leafless tree`,
838
+ `🍇 grapes
839
+ 🍈 melon
840
+ 🍉 watermelon
841
+ 🍊 tangerine
842
+ 🍋 lemon
843
+ 🍋‍🟩 lime
844
+ 🍌 banana
845
+ 🍍 pineapple
846
+ 🥭 mango
847
+ 🍎 red apple
848
+ 🍏 green apple
849
+ 🍐 pear
850
+ 🍑 peach
851
+ 🍒 cherries
852
+ 🍓 strawberry
853
+ 🫐 blueberries
854
+ 🥝 kiwi fruit
855
+ 🍅 tomato
856
+ 🫒 olive
857
+ 🥥 coconut
858
+ 🥑 avocado
859
+ 🍆 eggplant
860
+ 🥔 potato
861
+ 🥕 carrot
862
+ 🌽 ear of corn
863
+ 🌶️ hot pepper
864
+ 🫑 bell pepper
865
+ 🥒 cucumber
866
+ 🥬 leafy green
867
+ 🥦 broccoli
868
+ 🧄 garlic
869
+ 🧅 onion
870
+ 🥜 peanuts
871
+ 🫘 beans
872
+ 🌰 chestnut
873
+ 🫚 ginger root
874
+ 🫛 pea pod
875
+ 🍄‍🟫 brown mushroom
876
+ 🫜 root vegetable
877
+ 🍞 bread
878
+ 🥐 croissant
879
+ 🥖 baguette bread
880
+ 🫓 flatbread
881
+ 🥨 pretzel
882
+ 🥯 bagel
883
+ 🥞 pancakes
884
+ 🧇 waffle
885
+ 🧀 cheese wedge
886
+ 🍖 meat on bone
887
+ 🍗 poultry leg
888
+ 🥩 cut of meat
889
+ 🥓 bacon
890
+ 🍔 hamburger
891
+ 🍟 french fries
892
+ 🍕 pizza
893
+ 🌭 hot dog
894
+ 🥪 sandwich
895
+ 🌮 taco
896
+ 🌯 burrito
897
+ 🫔 tamale
898
+ 🥙 stuffed flatbread
899
+ 🧆 falafel
900
+ 🥚 egg
901
+ 🍳 cooking
902
+ 🥘 shallow pan of food
903
+ 🍲 pot of food
904
+ 🫕 fondue
905
+ 🥣 bowl with spoon
906
+ 🥗 green salad
907
+ 🍿 popcorn
908
+ 🧈 butter
909
+ 🧂 salt
910
+ 🥫 canned food
911
+ 🍱 bento box
912
+ 🍘 rice cracker
913
+ 🍙 rice ball
914
+ 🍚 cooked rice
915
+ 🍛 curry rice
916
+ 🍜 steaming bowl
917
+ 🍝 spaghetti
918
+ 🍠 roasted sweet potato
919
+ 🍢 oden
920
+ 🍣 sushi
921
+ 🍤 fried shrimp
922
+ 🍥 fish cake with swirl
923
+ 🥮 moon cake
924
+ 🍡 dango
925
+ 🥟 dumpling
926
+ 🥠 fortune cookie
927
+ 🥡 takeout box
928
+ 🍦 soft ice cream
929
+ 🍧 shaved ice
930
+ 🍨 ice cream
931
+ 🍩 doughnut
932
+ 🍪 cookie
933
+ 🎂 birthday cake
934
+ 🍰 shortcake
935
+ 🧁 cupcake
936
+ 🥧 pie
937
+ 🍫 chocolate bar
938
+ 🍬 candy
939
+ 🍭 lollipop
940
+ 🍮 custard
941
+ 🍯 honey pot
942
+ 🍼 baby bottle
943
+ 🥛 glass of milk
944
+ ☕ hot beverage
945
+ 🫖 teapot
946
+ 🍵 teacup without handle
947
+ 🍶 sake
948
+ 🍾 bottle with popping cork
949
+ 🍷 wine glass
950
+ 🍸 cocktail glass
951
+ 🍹 tropical drink
952
+ 🍺 beer mug
953
+ 🍻 clinking beer mugs
954
+ 🥂 clinking glasses
955
+ 🥃 tumbler glass
956
+ 🫗 pouring liquid
957
+ 🥤 cup with straw
958
+ 🧋 bubble tea
959
+ 🧃 beverage box
960
+ 🧉 mate
961
+ 🧊 ice
962
+ 🥢 chopsticks
963
+ 🍽️ fork and knife with plate
964
+ 🍴 fork and knife
965
+ 🥄 spoon
966
+ 🔪 kitchen knife
967
+ 🫙 jar
968
+ 🏺 amphora`,
969
+ `🌍 globe showing Europe-Africa
970
+ 🌎 globe showing Americas
971
+ 🌏 globe showing Asia-Australia
972
+ 🌐 globe with meridians
973
+ 🗺️ world map
974
+ 🗾 map of Japan
975
+ 🧭 compass
976
+ 🏔️ snow-capped mountain
977
+ ⛰️ mountain
978
+ 🌋 volcano
979
+ 🗻 mount fuji
980
+ 🏕️ camping
981
+ 🏖️ beach with umbrella
982
+ 🏜️ desert
983
+ 🏝️ desert island
984
+ 🏞️ national park
985
+ 🏟️ stadium
986
+ 🏛️ classical building
987
+ 🏗️ building construction
988
+ 🧱 brick
989
+ 🪨 rock
990
+ 🪵 wood
991
+ 🛖 hut
992
+ 🏘️ houses
993
+ 🏚️ derelict house
994
+ 🏠 house
995
+ 🏡 house with garden
996
+ 🏢 office building
997
+ 🏣 Japanese post office
998
+ 🏤 post office
999
+ 🏥 hospital
1000
+ 🏦 bank
1001
+ 🏨 hotel
1002
+ 🏩 love hotel
1003
+ 🏪 convenience store
1004
+ 🏫 school
1005
+ 🏬 department store
1006
+ 🏭 factory
1007
+ 🏯 Japanese castle
1008
+ 🏰 castle
1009
+ 💒 wedding
1010
+ 🗼 Tokyo tower
1011
+ 🗽 Statue of Liberty
1012
+ ⛪ church
1013
+ 🕌 mosque
1014
+ 🛕 hindu temple
1015
+ 🕍 synagogue
1016
+ ⛩️ shinto shrine
1017
+ 🕋 kaaba
1018
+ ⛲ fountain
1019
+ ⛺ tent
1020
+ 🌁 foggy
1021
+ 🌃 night with stars
1022
+ 🏙️ cityscape
1023
+ 🌄 sunrise over mountains
1024
+ 🌅 sunrise
1025
+ 🌆 cityscape at dusk
1026
+ 🌇 sunset
1027
+ 🌉 bridge at night
1028
+ ♨️ hot springs
1029
+ 🎠 carousel horse
1030
+ 🛝 playground slide
1031
+ 🎡 ferris wheel
1032
+ 🎢 roller coaster
1033
+ 💈 barber pole
1034
+ 🎪 circus tent
1035
+ 🚂 locomotive
1036
+ 🚃 railway car
1037
+ 🚄 high-speed train
1038
+ 🚅 bullet train
1039
+ 🚆 train
1040
+ 🚇 metro
1041
+ 🚈 light rail
1042
+ 🚉 station
1043
+ 🚊 tram
1044
+ 🚝 monorail
1045
+ 🚞 mountain railway
1046
+ 🚋 tram car
1047
+ 🚌 bus
1048
+ 🚍 oncoming bus
1049
+ 🚎 trolleybus
1050
+ 🚐 minibus
1051
+ 🚑 ambulance
1052
+ 🚒 fire engine
1053
+ 🚓 police car
1054
+ 🚔 oncoming police car
1055
+ 🚕 taxi
1056
+ 🚖 oncoming taxi
1057
+ 🚗 automobile
1058
+ 🚘 oncoming automobile
1059
+ 🚙 sport utility vehicle
1060
+ 🛻 pickup truck
1061
+ 🚚 delivery truck
1062
+ 🚛 articulated lorry
1063
+ 🚜 tractor
1064
+ 🏎️ racing car
1065
+ 🏍️ motorcycle
1066
+ 🛵 motor scooter
1067
+ 🦽 manual wheelchair
1068
+ 🦼 motorized wheelchair
1069
+ 🛺 auto rickshaw
1070
+ 🚲 bicycle
1071
+ 🛴 kick scooter
1072
+ 🛹 skateboard
1073
+ 🛼 roller skate
1074
+ 🚏 bus stop
1075
+ 🛣️ motorway
1076
+ 🛤️ railway track
1077
+ 🛢️ oil drum
1078
+ ⛽ fuel pump
1079
+ 🛞 wheel
1080
+ 🚨 police car light
1081
+ 🚥 horizontal traffic light
1082
+ 🚦 vertical traffic light
1083
+ 🛑 stop sign
1084
+ 🚧 construction
1085
+ ⚓ anchor
1086
+ 🛟 ring buoy
1087
+ ⛵ sailboat
1088
+ 🛶 canoe
1089
+ 🚤 speedboat
1090
+ 🛳️ passenger ship
1091
+ ⛴️ ferry
1092
+ 🛥️ motor boat
1093
+ 🚢 ship
1094
+ ✈️ airplane
1095
+ 🛩️ small airplane
1096
+ 🛫 airplane departure
1097
+ 🛬 airplane arrival
1098
+ 🪂 parachute
1099
+ 💺 seat
1100
+ 🚁 helicopter
1101
+ 🚟 suspension railway
1102
+ 🚠 mountain cableway
1103
+ 🚡 aerial tramway
1104
+ 🛰️ satellite
1105
+ 🚀 rocket
1106
+ 🛸 flying saucer
1107
+ 🛎️ bellhop bell
1108
+ 🧳 luggage
1109
+ ⌛ hourglass done
1110
+ ⏳ hourglass not done
1111
+ ⌚ watch
1112
+ ⏰ alarm clock
1113
+ ⏱️ stopwatch
1114
+ ⏲️ timer clock
1115
+ 🕰️ mantelpiece clock
1116
+ 🕛 twelve o’clock
1117
+ 🕧 twelve-thirty
1118
+ 🕐 one o’clock
1119
+ 🕜 one-thirty
1120
+ 🕑 two o’clock
1121
+ 🕝 two-thirty
1122
+ 🕒 three o’clock
1123
+ 🕞 three-thirty
1124
+ 🕓 four o’clock
1125
+ 🕟 four-thirty
1126
+ 🕔 five o’clock
1127
+ 🕠 five-thirty
1128
+ 🕕 six o’clock
1129
+ 🕡 six-thirty
1130
+ 🕖 seven o’clock
1131
+ 🕢 seven-thirty
1132
+ 🕗 eight o’clock
1133
+ 🕣 eight-thirty
1134
+ 🕘 nine o’clock
1135
+ 🕤 nine-thirty
1136
+ 🕙 ten o’clock
1137
+ 🕥 ten-thirty
1138
+ 🕚 eleven o’clock
1139
+ 🕦 eleven-thirty
1140
+ 🌑 new moon
1141
+ 🌒 waxing crescent moon
1142
+ 🌓 first quarter moon
1143
+ 🌔 waxing gibbous moon
1144
+ 🌕 full moon
1145
+ 🌖 waning gibbous moon
1146
+ 🌗 last quarter moon
1147
+ 🌘 waning crescent moon
1148
+ 🌙 crescent moon
1149
+ 🌚 new moon face
1150
+ 🌛 first quarter moon face
1151
+ 🌜 last quarter moon face
1152
+ 🌡️ thermometer
1153
+ ☀️ sun
1154
+ 🌝 full moon face
1155
+ 🌞 sun with face
1156
+ 🪐 ringed planet
1157
+ ⭐ star
1158
+ 🌟 glowing star
1159
+ 🌠 shooting star
1160
+ 🌌 milky way
1161
+ ☁️ cloud
1162
+ ⛅ sun behind cloud
1163
+ ⛈️ cloud with lightning and rain
1164
+ 🌤️ sun behind small cloud
1165
+ 🌥️ sun behind large cloud
1166
+ 🌦️ sun behind rain cloud
1167
+ 🌧️ cloud with rain
1168
+ 🌨️ cloud with snow
1169
+ 🌩️ cloud with lightning
1170
+ 🌪️ tornado
1171
+ 🌫️ fog
1172
+ 🌬️ wind face
1173
+ 🌀 cyclone
1174
+ 🌈 rainbow
1175
+ 🌂 closed umbrella
1176
+ ☂️ umbrella
1177
+ ☔ umbrella with rain drops
1178
+ ⛱️ umbrella on ground
1179
+ ⚡ high voltage
1180
+ ❄️ snowflake
1181
+ ☃️ snowman
1182
+ ⛄ snowman without snow
1183
+ ☄️ comet
1184
+ 🔥 fire
1185
+ 💧 droplet
1186
+ 🌊 water wave`,
1187
+ `🎃 jack-o-lantern
1188
+ 🎄 Christmas tree
1189
+ 🎆 fireworks
1190
+ 🎇 sparkler
1191
+ 🧨 firecracker
1192
+ ✨ sparkles
1193
+ 🎈 balloon
1194
+ 🎉 party popper
1195
+ 🎊 confetti ball
1196
+ 🎋 tanabata tree
1197
+ 🎍 pine decoration
1198
+ 🎎 Japanese dolls
1199
+ 🎏 carp streamer
1200
+ 🎐 wind chime
1201
+ 🎑 moon viewing ceremony
1202
+ 🧧 red envelope
1203
+ 🎀 ribbon
1204
+ 🎁 wrapped gift
1205
+ 🎗️ reminder ribbon
1206
+ 🎟️ admission tickets
1207
+ 🎫 ticket
1208
+ 🎖️ military medal
1209
+ 🏆 trophy
1210
+ 🏅 sports medal
1211
+ 🥇 1st place medal
1212
+ 🥈 2nd place medal
1213
+ 🥉 3rd place medal
1214
+ ⚽ soccer ball
1215
+ ⚾ baseball
1216
+ 🥎 softball
1217
+ 🏀 basketball
1218
+ 🏐 volleyball
1219
+ 🏈 american football
1220
+ 🏉 rugby football
1221
+ 🎾 tennis
1222
+ 🥏 flying disc
1223
+ 🎳 bowling
1224
+ 🏏 cricket game
1225
+ 🏑 field hockey
1226
+ 🏒 ice hockey
1227
+ 🥍 lacrosse
1228
+ 🏓 ping pong
1229
+ 🏸 badminton
1230
+ 🥊 boxing glove
1231
+ 🥋 martial arts uniform
1232
+ 🥅 goal net
1233
+ ⛳ flag in hole
1234
+ ⛸️ ice skate
1235
+ 🎣 fishing pole
1236
+ 🤿 diving mask
1237
+ 🎽 running shirt
1238
+ 🎿 skis
1239
+ 🛷 sled
1240
+ 🥌 curling stone
1241
+ 🎯 bullseye
1242
+ 🪀 yo-yo
1243
+ 🪁 kite
1244
+ 🔫 water pistol
1245
+ 🎱 pool 8 ball
1246
+ 🔮 crystal ball
1247
+ 🪄 magic wand
1248
+ 🎮 video game
1249
+ 🕹️ joystick
1250
+ 🎰 slot machine
1251
+ 🎲 game die
1252
+ 🧩 puzzle piece
1253
+ 🧸 teddy bear
1254
+ 🪅 piñata
1255
+ 🪩 mirror ball
1256
+ 🪆 nesting dolls
1257
+ ♠️ spade suit
1258
+ ♥️ heart suit
1259
+ ♦️ diamond suit
1260
+ ♣️ club suit
1261
+ ♟️ chess pawn
1262
+ 🃏 joker
1263
+ 🀄 mahjong red dragon
1264
+ 🎴 flower playing cards
1265
+ 🎭 performing arts
1266
+ 🖼️ framed picture
1267
+ 🎨 artist palette
1268
+ 🧵 thread
1269
+ 🪡 sewing needle
1270
+ 🧶 yarn
1271
+ 🪢 knot`,
1272
+ `👓 glasses
1273
+ 🕶️ sunglasses
1274
+ 🥽 goggles
1275
+ 🥼 lab coat
1276
+ 🦺 safety vest
1277
+ 👔 necktie
1278
+ 👕 t-shirt
1279
+ 👖 jeans
1280
+ 🧣 scarf
1281
+ 🧤 gloves
1282
+ 🧥 coat
1283
+ 🧦 socks
1284
+ 👗 dress
1285
+ 👘 kimono
1286
+ 🥻 sari
1287
+ 🩱 one-piece swimsuit
1288
+ 🩲 briefs
1289
+ 🩳 shorts
1290
+ 👙 bikini
1291
+ 👚 woman’s clothes
1292
+ 🪭 folding hand fan
1293
+ 👛 purse
1294
+ 👜 handbag
1295
+ 👝 clutch bag
1296
+ 🛍️ shopping bags
1297
+ 🎒 backpack
1298
+ 🩴 thong sandal
1299
+ 👞 man’s shoe
1300
+ 👟 running shoe
1301
+ 🥾 hiking boot
1302
+ 🥿 flat shoe
1303
+ 👠 high-heeled shoe
1304
+ 👡 woman’s sandal
1305
+ 🩰 ballet shoes
1306
+ 👢 woman’s boot
1307
+ 🪮 hair pick
1308
+ 👑 crown
1309
+ 👒 woman’s hat
1310
+ 🎩 top hat
1311
+ 🎓 graduation cap
1312
+ 🧢 billed cap
1313
+ 🪖 military helmet
1314
+ ⛑️ rescue worker’s helmet
1315
+ 📿 prayer beads
1316
+ 💄 lipstick
1317
+ 💍 ring
1318
+ 💎 gem stone
1319
+ 🔇 muted speaker
1320
+ 🔈 speaker low volume
1321
+ 🔉 speaker medium volume
1322
+ 🔊 speaker high volume
1323
+ 📢 loudspeaker
1324
+ 📣 megaphone
1325
+ 📯 postal horn
1326
+ 🔔 bell
1327
+ 🔕 bell with slash
1328
+ 🎼 musical score
1329
+ 🎵 musical note
1330
+ 🎶 musical notes
1331
+ 🎙️ studio microphone
1332
+ 🎚️ level slider
1333
+ 🎛️ control knobs
1334
+ 🎤 microphone
1335
+ 🎧 headphone
1336
+ 📻 radio
1337
+ 🎷 saxophone
1338
+ 🪗 accordion
1339
+ 🎸 guitar
1340
+ 🎹 musical keyboard
1341
+ 🎺 trumpet
1342
+ 🎻 violin
1343
+ 🪕 banjo
1344
+ 🥁 drum
1345
+ 🪘 long drum
1346
+ 🪇 maracas
1347
+ 🪈 flute
1348
+ 🪉 harp
1349
+ 📱 mobile phone
1350
+ 📲 mobile phone with arrow
1351
+ ☎️ telephone
1352
+ 📞 telephone receiver
1353
+ 📟 pager
1354
+ 📠 fax machine
1355
+ 🔋 battery
1356
+ 🪫 low battery
1357
+ 🔌 electric plug
1358
+ 💻 laptop
1359
+ 🖥️ desktop computer
1360
+ 🖨️ printer
1361
+ ⌨️ keyboard
1362
+ 🖱️ computer mouse
1363
+ 🖲️ trackball
1364
+ 💽 computer disk
1365
+ 💾 floppy disk
1366
+ 💿 optical disk
1367
+ 📀 dvd
1368
+ 🧮 abacus
1369
+ 🎥 movie camera
1370
+ 🎞️ film frames
1371
+ 📽️ film projector
1372
+ 🎬 clapper board
1373
+ 📺 television
1374
+ 📷 camera
1375
+ 📸 camera with flash
1376
+ 📹 video camera
1377
+ 📼 videocassette
1378
+ 🔍 magnifying glass tilted left
1379
+ 🔎 magnifying glass tilted right
1380
+ 🕯️ candle
1381
+ 💡 light bulb
1382
+ 🔦 flashlight
1383
+ 🏮 red paper lantern
1384
+ 🪔 diya lamp
1385
+ 📔 notebook with decorative cover
1386
+ 📕 closed book
1387
+ 📖 open book
1388
+ 📗 green book
1389
+ 📘 blue book
1390
+ 📙 orange book
1391
+ 📚 books
1392
+ 📓 notebook
1393
+ 📒 ledger
1394
+ 📃 page with curl
1395
+ 📜 scroll
1396
+ 📄 page facing up
1397
+ 📰 newspaper
1398
+ 🗞️ rolled-up newspaper
1399
+ 📑 bookmark tabs
1400
+ 🔖 bookmark
1401
+ 🏷️ label
1402
+ 💰 money bag
1403
+ 🪙 coin
1404
+ 💴 yen banknote
1405
+ 💵 dollar banknote
1406
+ 💶 euro banknote
1407
+ 💷 pound banknote
1408
+ 💸 money with wings
1409
+ 💳 credit card
1410
+ 🧾 receipt
1411
+ 💹 chart increasing with yen
1412
+ ✉️ envelope
1413
+ 📧 e-mail
1414
+ 📨 incoming envelope
1415
+ 📩 envelope with arrow
1416
+ 📤 outbox tray
1417
+ 📥 inbox tray
1418
+ 📦 package
1419
+ 📫 closed mailbox with raised flag
1420
+ 📪 closed mailbox with lowered flag
1421
+ 📬 open mailbox with raised flag
1422
+ 📭 open mailbox with lowered flag
1423
+ 📮 postbox
1424
+ 🗳️ ballot box with ballot
1425
+ ✏️ pencil
1426
+ ✒️ black nib
1427
+ 🖋️ fountain pen
1428
+ 🖊️ pen
1429
+ 🖌️ paintbrush
1430
+ 🖍️ crayon
1431
+ 📝 memo
1432
+ 💼 briefcase
1433
+ 📁 file folder
1434
+ 📂 open file folder
1435
+ 🗂️ card index dividers
1436
+ 📅 calendar
1437
+ 📆 tear-off calendar
1438
+ 🗒️ spiral notepad
1439
+ 🗓️ spiral calendar
1440
+ 📇 card index
1441
+ 📈 chart increasing
1442
+ 📉 chart decreasing
1443
+ 📊 bar chart
1444
+ 📋 clipboard
1445
+ 📌 pushpin
1446
+ 📍 round pushpin
1447
+ 📎 paperclip
1448
+ 🖇️ linked paperclips
1449
+ 📏 straight ruler
1450
+ 📐 triangular ruler
1451
+ ✂️ scissors
1452
+ 🗃️ card file box
1453
+ 🗄️ file cabinet
1454
+ 🗑️ wastebasket
1455
+ 🔒 locked
1456
+ 🔓 unlocked
1457
+ 🔏 locked with pen
1458
+ 🔐 locked with key
1459
+ 🔑 key
1460
+ 🗝️ old key
1461
+ 🔨 hammer
1462
+ 🪓 axe
1463
+ ⛏️ pick
1464
+ ⚒️ hammer and pick
1465
+ 🛠️ hammer and wrench
1466
+ 🗡️ dagger
1467
+ ⚔️ crossed swords
1468
+ 💣 bomb
1469
+ 🪃 boomerang
1470
+ 🏹 bow and arrow
1471
+ 🛡️ shield
1472
+ 🪚 carpentry saw
1473
+ 🔧 wrench
1474
+ 🪛 screwdriver
1475
+ 🔩 nut and bolt
1476
+ ⚙️ gear
1477
+ 🗜️ clamp
1478
+ ⚖️ balance scale
1479
+ 🦯 white cane
1480
+ 🔗 link
1481
+ ⛓️‍💥 broken chain
1482
+ ⛓️ chains
1483
+ 🪝 hook
1484
+ 🧰 toolbox
1485
+ 🧲 magnet
1486
+ 🪜 ladder
1487
+ 🪏 shovel
1488
+ ⚗️ alembic
1489
+ 🧪 test tube
1490
+ 🧫 petri dish
1491
+ 🧬 dna
1492
+ 🔬 microscope
1493
+ 🔭 telescope
1494
+ 📡 satellite antenna
1495
+ 💉 syringe
1496
+ 🩸 drop of blood
1497
+ 💊 pill
1498
+ 🩹 adhesive bandage
1499
+ 🩼 crutch
1500
+ 🩺 stethoscope
1501
+ 🩻 x-ray
1502
+ 🚪 door
1503
+ 🛗 elevator
1504
+ 🪞 mirror
1505
+ 🪟 window
1506
+ 🛏️ bed
1507
+ 🛋️ couch and lamp
1508
+ 🪑 chair
1509
+ 🚽 toilet
1510
+ 🪠 plunger
1511
+ 🚿 shower
1512
+ 🛁 bathtub
1513
+ 🪤 mouse trap
1514
+ 🪒 razor
1515
+ 🧴 lotion bottle
1516
+ 🧷 safety pin
1517
+ 🧹 broom
1518
+ 🧺 basket
1519
+ 🧻 roll of paper
1520
+ 🪣 bucket
1521
+ 🧼 soap
1522
+ 🫧 bubbles
1523
+ 🪥 toothbrush
1524
+ 🧽 sponge
1525
+ 🧯 fire extinguisher
1526
+ 🛒 shopping cart
1527
+ 🚬 cigarette
1528
+ ⚰️ coffin
1529
+ 🪦 headstone
1530
+ ⚱️ funeral urn
1531
+ 🧿 nazar amulet
1532
+ 🪬 hamsa
1533
+ 🗿 moai
1534
+ 🪧 placard
1535
+ 🪪 identification card`,
1536
+ `🏧 ATM sign
1537
+ 🚮 litter in bin sign
1538
+ 🚰 potable water
1539
+ ♿ wheelchair symbol
1540
+ 🚹 men’s room
1541
+ 🚺 women’s room
1542
+ 🚻 restroom
1543
+ 🚼 baby symbol
1544
+ 🚾 water closet
1545
+ 🛂 passport control
1546
+ 🛃 customs
1547
+ 🛄 baggage claim
1548
+ 🛅 left luggage
1549
+ ⚠️ warning
1550
+ 🚸 children crossing
1551
+ ⛔ no entry
1552
+ 🚫 prohibited
1553
+ 🚳 no bicycles
1554
+ 🚭 no smoking
1555
+ 🚯 no littering
1556
+ 🚱 non-potable water
1557
+ 🚷 no pedestrians
1558
+ 📵 no mobile phones
1559
+ 🔞 no one under eighteen
1560
+ ☢️ radioactive
1561
+ ☣️ biohazard
1562
+ ⬆️ up arrow
1563
+ ↗️ up-right arrow
1564
+ ➡️ right arrow
1565
+ ↘️ down-right arrow
1566
+ ⬇️ down arrow
1567
+ ↙️ down-left arrow
1568
+ ⬅️ left arrow
1569
+ ↖️ up-left arrow
1570
+ ↕️ up-down arrow
1571
+ ↔️ left-right arrow
1572
+ ↩️ right arrow curving left
1573
+ ↪️ left arrow curving right
1574
+ ⤴️ right arrow curving up
1575
+ ⤵️ right arrow curving down
1576
+ 🔃 clockwise vertical arrows
1577
+ 🔄 counterclockwise arrows button
1578
+ 🔙 BACK arrow
1579
+ 🔚 END arrow
1580
+ 🔛 ON! arrow
1581
+ 🔜 SOON arrow
1582
+ 🔝 TOP arrow
1583
+ 🛐 place of worship
1584
+ ⚛️ atom symbol
1585
+ 🕉️ om
1586
+ ✡️ star of David
1587
+ ☸️ wheel of dharma
1588
+ ☯️ yin yang
1589
+ ✝️ latin cross
1590
+ ☦️ orthodox cross
1591
+ ☪️ star and crescent
1592
+ ☮️ peace symbol
1593
+ 🕎 menorah
1594
+ 🔯 dotted six-pointed star
1595
+ 🪯 khanda
1596
+ ♈ Aries
1597
+ ♉ Taurus
1598
+ ♊ Gemini
1599
+ ♋ Cancer
1600
+ ♌ Leo
1601
+ ♍ Virgo
1602
+ ♎ Libra
1603
+ ♏ Scorpio
1604
+ ♐ Sagittarius
1605
+ ♑ Capricorn
1606
+ ♒ Aquarius
1607
+ ♓ Pisces
1608
+ ⛎ Ophiuchus
1609
+ 🔀 shuffle tracks button
1610
+ 🔁 repeat button
1611
+ 🔂 repeat single button
1612
+ ▶️ play button
1613
+ ⏩ fast-forward button
1614
+ ⏭️ next track button
1615
+ ⏯️ play or pause button
1616
+ ◀️ reverse button
1617
+ ⏪ fast reverse button
1618
+ ⏮️ last track button
1619
+ 🔼 upwards button
1620
+ ⏫ fast up button
1621
+ 🔽 downwards button
1622
+ ⏬ fast down button
1623
+ ⏸️ pause button
1624
+ ⏹️ stop button
1625
+ ⏺️ record button
1626
+ ⏏️ eject button
1627
+ 🎦 cinema
1628
+ 🔅 dim button
1629
+ 🔆 bright button
1630
+ 📶 antenna bars
1631
+ 🛜 wireless
1632
+ 📳 vibration mode
1633
+ 📴 mobile phone off
1634
+ ♀️ female sign
1635
+ ♂️ male sign
1636
+ ⚧️ transgender symbol
1637
+ ✖️ multiply
1638
+ ➕ plus
1639
+ ➖ minus
1640
+ ➗ divide
1641
+ 🟰 heavy equals sign
1642
+ ♾️ infinity
1643
+ ‼️ double exclamation mark
1644
+ ⁉️ exclamation question mark
1645
+ ❓ red question mark
1646
+ ❔ white question mark
1647
+ ❕ white exclamation mark
1648
+ ❗ red exclamation mark
1649
+ 〰️ wavy dash
1650
+ 💱 currency exchange
1651
+ 💲 heavy dollar sign
1652
+ ⚕️ medical symbol
1653
+ ♻️ recycling symbol
1654
+ ⚜️ fleur-de-lis
1655
+ 🔱 trident emblem
1656
+ 📛 name badge
1657
+ 🔰 Japanese symbol for beginner
1658
+ ⭕ hollow red circle
1659
+ ✅ check mark button
1660
+ ☑️ check box with check
1661
+ ✔️ check mark
1662
+ ❌ cross mark
1663
+ ❎ cross mark button
1664
+ ➰ curly loop
1665
+ ➿ double curly loop
1666
+ 〽️ part alternation mark
1667
+ ✳️ eight-spoked asterisk
1668
+ ✴️ eight-pointed star
1669
+ ❇️ sparkle
1670
+ ©️ copyright
1671
+ ®️ registered
1672
+ ™️ trade mark
1673
+ 🫟 splatter
1674
+ #️⃣ keycap #
1675
+ *️⃣ keycap *
1676
+ 0️⃣ keycap 0
1677
+ 1️⃣ keycap 1
1678
+ 2️⃣ keycap 2
1679
+ 3️⃣ keycap 3
1680
+ 4️⃣ keycap 4
1681
+ 5️⃣ keycap 5
1682
+ 6️⃣ keycap 6
1683
+ 7️⃣ keycap 7
1684
+ 8️⃣ keycap 8
1685
+ 9️⃣ keycap 9
1686
+ 🔟 keycap 10
1687
+ 🔠 input latin uppercase
1688
+ 🔡 input latin lowercase
1689
+ 🔢 input numbers
1690
+ 🔣 input symbols
1691
+ 🔤 input latin letters
1692
+ 🅰️ A button (blood type)
1693
+ 🆎 AB button (blood type)
1694
+ 🅱️ B button (blood type)
1695
+ 🆑 CL button
1696
+ 🆒 COOL button
1697
+ 🆓 FREE button
1698
+ ℹ️ information
1699
+ 🆔 ID button
1700
+ Ⓜ️ circled M
1701
+ 🆕 NEW button
1702
+ 🆖 NG button
1703
+ 🅾️ O button (blood type)
1704
+ 🆗 OK button
1705
+ 🅿️ P button
1706
+ 🆘 SOS button
1707
+ 🆙 UP! button
1708
+ 🆚 VS button
1709
+ 🈁 Japanese “here” button
1710
+ 🈂️ Japanese “service charge” button
1711
+ 🈷️ Japanese “monthly amount” button
1712
+ 🈶 Japanese “not free of charge” button
1713
+ 🈯 Japanese “reserved” button
1714
+ 🉐 Japanese “bargain” button
1715
+ 🈹 Japanese “discount” button
1716
+ 🈚 Japanese “free of charge” button
1717
+ 🈲 Japanese “prohibited” button
1718
+ 🉑 Japanese “acceptable” button
1719
+ 🈸 Japanese “application” button
1720
+ 🈴 Japanese “passing grade” button
1721
+ 🈳 Japanese “vacancy” button
1722
+ ㊗️ Japanese “congratulations” button
1723
+ ㊙️ Japanese “secret” button
1724
+ 🈺 Japanese “open for business” button
1725
+ 🈵 Japanese “no vacancy” button
1726
+ 🔴 red circle
1727
+ 🟠 orange circle
1728
+ 🟡 yellow circle
1729
+ 🟢 green circle
1730
+ 🔵 blue circle
1731
+ 🟣 purple circle
1732
+ 🟤 brown circle
1733
+ ⚫ black circle
1734
+ ⚪ white circle
1735
+ 🟥 red square
1736
+ 🟧 orange square
1737
+ 🟨 yellow square
1738
+ 🟩 green square
1739
+ 🟦 blue square
1740
+ 🟪 purple square
1741
+ 🟫 brown square
1742
+ ⬛ black large square
1743
+ ⬜ white large square
1744
+ ◼️ black medium square
1745
+ ◻️ white medium square
1746
+ ◾ black medium-small square
1747
+ ◽ white medium-small square
1748
+ ▪️ black small square
1749
+ ▫️ white small square
1750
+ 🔶 large orange diamond
1751
+ 🔷 large blue diamond
1752
+ 🔸 small orange diamond
1753
+ 🔹 small blue diamond
1754
+ 🔺 red triangle pointed up
1755
+ 🔻 red triangle pointed down
1756
+ 💠 diamond with a dot
1757
+ 🔘 radio button
1758
+ 🔳 white square button
1759
+ 🔲 black square button`,
1760
+ `🏁 chequered flag
1761
+ 🚩 triangular flag
1762
+ 🎌 crossed flags
1763
+ 🏴 black flag
1764
+ 🏳️ white flag
1765
+ 🏳️‍🌈 rainbow flag
1766
+ 🏳️‍⚧️ transgender flag
1767
+ 🏴‍☠️ pirate flag
1768
+ 🇦🇨 flag Ascension Island
1769
+ 🇦🇩 flag Andorra
1770
+ 🇦🇪 flag United Arab Emirates
1771
+ 🇦🇫 flag Afghanistan
1772
+ 🇦🇬 flag Antigua & Barbuda
1773
+ 🇦🇮 flag Anguilla
1774
+ 🇦🇱 flag Albania
1775
+ 🇦🇲 flag Armenia
1776
+ 🇦🇴 flag Angola
1777
+ 🇦🇶 flag Antarctica
1778
+ 🇦🇷 flag Argentina
1779
+ 🇦🇸 flag American Samoa
1780
+ 🇦🇹 flag Austria
1781
+ 🇦🇺 flag Australia
1782
+ 🇦🇼 flag Aruba
1783
+ 🇦🇽 flag Åland Islands
1784
+ 🇦🇿 flag Azerbaijan
1785
+ 🇧🇦 flag Bosnia & Herzegovina
1786
+ 🇧🇧 flag Barbados
1787
+ 🇧🇩 flag Bangladesh
1788
+ 🇧🇪 flag Belgium
1789
+ 🇧🇫 flag Burkina Faso
1790
+ 🇧🇬 flag Bulgaria
1791
+ 🇧🇭 flag Bahrain
1792
+ 🇧🇮 flag Burundi
1793
+ 🇧🇯 flag Benin
1794
+ 🇧🇱 flag St. Barthélemy
1795
+ 🇧🇲 flag Bermuda
1796
+ 🇧🇳 flag Brunei
1797
+ 🇧🇴 flag Bolivia
1798
+ 🇧🇶 flag Caribbean Netherlands
1799
+ 🇧🇷 flag Brazil
1800
+ 🇧🇸 flag Bahamas
1801
+ 🇧🇹 flag Bhutan
1802
+ 🇧🇻 flag Bouvet Island
1803
+ 🇧🇼 flag Botswana
1804
+ 🇧🇾 flag Belarus
1805
+ 🇧🇿 flag Belize
1806
+ 🇨🇦 flag Canada
1807
+ 🇨🇨 flag Cocos (Keeling) Islands
1808
+ 🇨🇩 flag Congo - Kinshasa
1809
+ 🇨🇫 flag Central African Republic
1810
+ 🇨🇬 flag Congo - Brazzaville
1811
+ 🇨🇭 flag Switzerland
1812
+ 🇨🇮 flag Côte d’Ivoire
1813
+ 🇨🇰 flag Cook Islands
1814
+ 🇨🇱 flag Chile
1815
+ 🇨🇲 flag Cameroon
1816
+ 🇨🇳 flag China
1817
+ 🇨🇴 flag Colombia
1818
+ 🇨🇵 flag Clipperton Island
1819
+ 🇨🇶 flag Sark
1820
+ 🇨🇷 flag Costa Rica
1821
+ 🇨🇺 flag Cuba
1822
+ 🇨🇻 flag Cape Verde
1823
+ 🇨🇼 flag Curaçao
1824
+ 🇨🇽 flag Christmas Island
1825
+ 🇨🇾 flag Cyprus
1826
+ 🇨🇿 flag Czechia
1827
+ 🇩🇪 flag Germany
1828
+ 🇩🇬 flag Diego Garcia
1829
+ 🇩🇯 flag Djibouti
1830
+ 🇩🇰 flag Denmark
1831
+ 🇩🇲 flag Dominica
1832
+ 🇩🇴 flag Dominican Republic
1833
+ 🇩🇿 flag Algeria
1834
+ 🇪🇦 flag Ceuta & Melilla
1835
+ 🇪🇨 flag Ecuador
1836
+ 🇪🇪 flag Estonia
1837
+ 🇪🇬 flag Egypt
1838
+ 🇪🇭 flag Western Sahara
1839
+ 🇪🇷 flag Eritrea
1840
+ 🇪🇸 flag Spain
1841
+ 🇪🇹 flag Ethiopia
1842
+ 🇪🇺 flag European Union
1843
+ 🇫🇮 flag Finland
1844
+ 🇫🇯 flag Fiji
1845
+ 🇫🇰 flag Falkland Islands
1846
+ 🇫🇲 flag Micronesia
1847
+ 🇫🇴 flag Faroe Islands
1848
+ 🇫🇷 flag France
1849
+ 🇬🇦 flag Gabon
1850
+ 🇬🇧 flag United Kingdom
1851
+ 🇬🇩 flag Grenada
1852
+ 🇬🇪 flag Georgia
1853
+ 🇬🇫 flag French Guiana
1854
+ 🇬🇬 flag Guernsey
1855
+ 🇬🇭 flag Ghana
1856
+ 🇬🇮 flag Gibraltar
1857
+ 🇬🇱 flag Greenland
1858
+ 🇬🇲 flag Gambia
1859
+ 🇬🇳 flag Guinea
1860
+ 🇬🇵 flag Guadeloupe
1861
+ 🇬🇶 flag Equatorial Guinea
1862
+ 🇬🇷 flag Greece
1863
+ 🇬🇸 flag South Georgia & South Sandwich Islands
1864
+ 🇬🇹 flag Guatemala
1865
+ 🇬🇺 flag Guam
1866
+ 🇬🇼 flag Guinea-Bissau
1867
+ 🇬🇾 flag Guyana
1868
+ 🇭🇰 flag Hong Kong SAR China
1869
+ 🇭🇲 flag Heard & McDonald Islands
1870
+ 🇭🇳 flag Honduras
1871
+ 🇭🇷 flag Croatia
1872
+ 🇭🇹 flag Haiti
1873
+ 🇭🇺 flag Hungary
1874
+ 🇮🇨 flag Canary Islands
1875
+ 🇮🇩 flag Indonesia
1876
+ 🇮🇪 flag Ireland
1877
+ 🇮🇱 flag Israel
1878
+ 🇮🇲 flag Isle of Man
1879
+ 🇮🇳 flag India
1880
+ 🇮🇴 flag British Indian Ocean Territory
1881
+ 🇮🇶 flag Iraq
1882
+ 🇮🇷 flag Iran
1883
+ 🇮🇸 flag Iceland
1884
+ 🇮🇹 flag Italy
1885
+ 🇯🇪 flag Jersey
1886
+ 🇯🇲 flag Jamaica
1887
+ 🇯🇴 flag Jordan
1888
+ 🇯🇵 flag Japan
1889
+ 🇰🇪 flag Kenya
1890
+ 🇰🇬 flag Kyrgyzstan
1891
+ 🇰🇭 flag Cambodia
1892
+ 🇰🇮 flag Kiribati
1893
+ 🇰🇲 flag Comoros
1894
+ 🇰🇳 flag St. Kitts & Nevis
1895
+ 🇰🇵 flag North Korea
1896
+ 🇰🇷 flag South Korea
1897
+ 🇰🇼 flag Kuwait
1898
+ 🇰🇾 flag Cayman Islands
1899
+ 🇰🇿 flag Kazakhstan
1900
+ 🇱🇦 flag Laos
1901
+ 🇱🇧 flag Lebanon
1902
+ 🇱🇨 flag St. Lucia
1903
+ 🇱🇮 flag Liechtenstein
1904
+ 🇱🇰 flag Sri Lanka
1905
+ 🇱🇷 flag Liberia
1906
+ 🇱🇸 flag Lesotho
1907
+ 🇱🇹 flag Lithuania
1908
+ 🇱🇺 flag Luxembourg
1909
+ 🇱🇻 flag Latvia
1910
+ 🇱🇾 flag Libya
1911
+ 🇲🇦 flag Morocco
1912
+ 🇲🇨 flag Monaco
1913
+ 🇲🇩 flag Moldova
1914
+ 🇲🇪 flag Montenegro
1915
+ 🇲🇫 flag St. Martin
1916
+ 🇲🇬 flag Madagascar
1917
+ 🇲🇭 flag Marshall Islands
1918
+ 🇲🇰 flag North Macedonia
1919
+ 🇲🇱 flag Mali
1920
+ 🇲🇲 flag Myanmar (Burma)
1921
+ 🇲🇳 flag Mongolia
1922
+ 🇲🇴 flag Macao SAR China
1923
+ 🇲🇵 flag Northern Mariana Islands
1924
+ 🇲🇶 flag Martinique
1925
+ 🇲🇷 flag Mauritania
1926
+ 🇲🇸 flag Montserrat
1927
+ 🇲🇹 flag Malta
1928
+ 🇲🇺 flag Mauritius
1929
+ 🇲🇻 flag Maldives
1930
+ 🇲🇼 flag Malawi
1931
+ 🇲🇽 flag Mexico
1932
+ 🇲🇾 flag Malaysia
1933
+ 🇲🇿 flag Mozambique
1934
+ 🇳🇦 flag Namibia
1935
+ 🇳🇨 flag New Caledonia
1936
+ 🇳🇪 flag Niger
1937
+ 🇳🇫 flag Norfolk Island
1938
+ 🇳🇬 flag Nigeria
1939
+ 🇳🇮 flag Nicaragua
1940
+ 🇳🇱 flag Netherlands
1941
+ 🇳🇴 flag Norway
1942
+ 🇳🇵 flag Nepal
1943
+ 🇳🇷 flag Nauru
1944
+ 🇳🇺 flag Niue
1945
+ 🇳🇿 flag New Zealand
1946
+ 🇴🇲 flag Oman
1947
+ 🇵🇦 flag Panama
1948
+ 🇵🇪 flag Peru
1949
+ 🇵🇫 flag French Polynesia
1950
+ 🇵🇬 flag Papua New Guinea
1951
+ 🇵🇭 flag Philippines
1952
+ 🇵🇰 flag Pakistan
1953
+ 🇵🇱 flag Poland
1954
+ 🇵🇲 flag St. Pierre & Miquelon
1955
+ 🇵🇳 flag Pitcairn Islands
1956
+ 🇵🇷 flag Puerto Rico
1957
+ 🇵🇸 flag Palestinian Territories
1958
+ 🇵🇹 flag Portugal
1959
+ 🇵🇼 flag Palau
1960
+ 🇵🇾 flag Paraguay
1961
+ 🇶🇦 flag Qatar
1962
+ 🇷🇪 flag Réunion
1963
+ 🇷🇴 flag Romania
1964
+ 🇷🇸 flag Serbia
1965
+ 🇷🇺 flag Russia
1966
+ 🇷🇼 flag Rwanda
1967
+ 🇸🇦 flag Saudi Arabia
1968
+ 🇸🇧 flag Solomon Islands
1969
+ 🇸🇨 flag Seychelles
1970
+ 🇸🇩 flag Sudan
1971
+ 🇸🇪 flag Sweden
1972
+ 🇸🇬 flag Singapore
1973
+ 🇸🇭 flag St. Helena
1974
+ 🇸🇮 flag Slovenia
1975
+ 🇸🇯 flag Svalbard & Jan Mayen
1976
+ 🇸🇰 flag Slovakia
1977
+ 🇸🇱 flag Sierra Leone
1978
+ 🇸🇲 flag San Marino
1979
+ 🇸🇳 flag Senegal
1980
+ 🇸🇴 flag Somalia
1981
+ 🇸🇷 flag Suriname
1982
+ 🇸🇸 flag South Sudan
1983
+ 🇸🇹 flag São Tomé & Príncipe
1984
+ 🇸🇻 flag El Salvador
1985
+ 🇸🇽 flag Sint Maarten
1986
+ 🇸🇾 flag Syria
1987
+ 🇸🇿 flag Eswatini
1988
+ 🇹🇦 flag Tristan da Cunha
1989
+ 🇹🇨 flag Turks & Caicos Islands
1990
+ 🇹🇩 flag Chad
1991
+ 🇹🇫 flag French Southern Territories
1992
+ 🇹🇬 flag Togo
1993
+ 🇹🇭 flag Thailand
1994
+ 🇹🇯 flag Tajikistan
1995
+ 🇹🇰 flag Tokelau
1996
+ 🇹🇱 flag Timor-Leste
1997
+ 🇹🇲 flag Turkmenistan
1998
+ 🇹🇳 flag Tunisia
1999
+ 🇹🇴 flag Tonga
2000
+ 🇹🇷 flag Türkiye
2001
+ 🇹🇹 flag Trinidad & Tobago
2002
+ 🇹🇻 flag Tuvalu
2003
+ 🇹🇼 flag Taiwan
2004
+ 🇹🇿 flag Tanzania
2005
+ 🇺🇦 flag Ukraine
2006
+ 🇺🇬 flag Uganda
2007
+ 🇺🇲 flag U.S. Outlying Islands
2008
+ 🇺🇳 flag United Nations
2009
+ 🇺🇸 flag United States
2010
+ 🇺🇾 flag Uruguay
2011
+ 🇺🇿 flag Uzbekistan
2012
+ 🇻🇦 flag Vatican City
2013
+ 🇻🇨 flag St. Vincent & Grenadines
2014
+ 🇻🇪 flag Venezuela
2015
+ 🇻🇬 flag British Virgin Islands
2016
+ 🇻🇮 flag U.S. Virgin Islands
2017
+ 🇻🇳 flag Vietnam
2018
+ 🇻🇺 flag Vanuatu
2019
+ 🇼🇫 flag Wallis & Futuna
2020
+ 🇼🇸 flag Samoa
2021
+ 🇽🇰 flag Kosovo
2022
+ 🇾🇪 flag Yemen
2023
+ 🇾🇹 flag Mayotte
2024
+ 🇿🇦 flag South Africa
2025
+ 🇿🇲 flag Zambia
2026
+ 🇿🇼 flag Zimbabwe
2027
+ 🏴󠁧󠁢󠁥󠁮󠁧󠁿 flag England
2028
+ 🏴󠁧󠁢󠁳󠁣󠁴󠁿 flag Scotland
2029
+ 🏴󠁧󠁢󠁷󠁬󠁳󠁿 flag Wales`,
2030
+ ];
2031
+ /**
2032
+ * Soporte de tono de piel, alineado carácter a carácter con las líneas de
2033
+ * EMOJI_PACKED: '0' sin soporte · '1' modificador tras el primer codepoint ·
2034
+ * '2' tras cada codepoint de persona (secuencias multi-persona).
2035
+ *
2036
+ * Un carácter por emoji en vez de un array de booleanos: 8 de las 9 categorías
2037
+ * son un run de ceros puro, así que el gzip lo deja en nada.
2038
+ */
2039
+ const EMOJI_TONE_FLAGS = [
2040
+ `0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`,
2041
+ `11111111111111111111111111111111111111111111001111100000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110000000111111111111111111111111111111111111111111111111000111111010111111111111111111111111111100011111111111111211112221222000000000000000000000000000000000000`,
2042
+ `000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`,
2043
+ `00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`,
2044
+ `00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`,
2045
+ `0000000000000000000000000000000000000000000000000000000000000000000000000000000000000`,
2046
+ `000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`,
2047
+ `00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`,
2048
+ `000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`,
2049
+ ];
2050
+
2051
+ // emojiPickerLogic.ts — lógica pura de co-emoji-picker (patrón optionListLogic /
2052
+ // commandSearchLogic: todo lo testeable sin DOM vive acá).
2053
+ /** Categoría sintética de recientes: va primera y solo existe si hay historial. */
2054
+ const RECENT_CATEGORY = 'recent';
2055
+ /** Alto uniforme de fila (header y grilla) en px. Uniforme a propósito: la
2056
+ * virtualización se reduce a `top = row * ROW_HEIGHT`, sin prefix-sums. */
2057
+ const ROW_HEIGHT = 36;
2058
+ /** Filas de más renderizadas arriba y abajo del viewport. */
2059
+ const OVERSCAN = 2;
2060
+ /** Columnas por defecto (espejo del default de la prop `columns`). */
2061
+ const DEFAULT_COLUMNS = 8;
2062
+ /** Offset del espacio de índices de los recientes (ver `EmojiEntry.index`). */
2063
+ const RECENT_INDEX_BASE = 1000000;
2064
+ // ── Dataset ─────────────────────────────────────────────────────────────────
2065
+ let cachedEntries = null;
2066
+ /**
2067
+ * Desempaqueta EMOJI_PACKED a entradas. Memoizado a nivel de módulo: se paga
2068
+ * UNA vez por documento aunque se monten varios pickers.
2069
+ */
2070
+ function getEmojiEntries() {
2071
+ if (cachedEntries)
2072
+ return cachedEntries;
2073
+ const out = [];
2074
+ let index = 0;
2075
+ EMOJI_PACKED.forEach((packed, catIdx) => {
2076
+ var _a;
2077
+ const category = EMOJI_CATEGORIES[catIdx];
2078
+ const flags = (_a = EMOJI_TONE_FLAGS[catIdx]) !== null && _a !== void 0 ? _a : '';
2079
+ let inCat = 0;
2080
+ for (const line of packed.split('\n')) {
2081
+ const sep = line.indexOf(' ');
2082
+ if (sep < 0)
2083
+ continue;
2084
+ out.push({
2085
+ char: line.slice(0, sep),
2086
+ name: line.slice(sep + 1),
2087
+ category,
2088
+ index,
2089
+ nameIndex: index,
2090
+ tone: flags[inCat] || '0',
2091
+ });
2092
+ index++;
2093
+ inCat++;
2094
+ }
2095
+ });
2096
+ cachedEntries = out;
2097
+ return out;
2098
+ }
2099
+ /** Cargadores estáticos (specifier literal) — sin ellos el bundler no puede
2100
+ * partir el chunk y los packs volverían al bundle principal. */
2101
+ const LOCALE_LOADERS = {
2102
+ es: () => Promise.resolve().then(function () { return require('./emojiNames.es-BjpSEJ0c.js'); }),
2103
+ pt: () => Promise.resolve().then(function () { return require('./emojiNames.pt-DWupaZMJ.js'); }),
2104
+ };
2105
+ /** Locales con pack de nombres propio. El resto usa los nombres en inglés. */
2106
+ function hasLocalePack(lang) {
2107
+ return lang in LOCALE_LOADERS;
2108
+ }
2109
+ /**
2110
+ * Nombres localizados, alineados por índice global con `getEmojiEntries()`.
2111
+ * Devuelve null si el locale no tiene pack o si la carga falla — el llamador
2112
+ * cae a los nombres en inglés (degradación, nunca excepción).
2113
+ */
2114
+ async function loadLocaleNames(lang) {
2115
+ const loader = LOCALE_LOADERS[lang];
2116
+ if (!loader)
2117
+ return null;
2118
+ try {
2119
+ const mod = await loader();
2120
+ return mod.default.flatMap((packed) => packed.split('\n'));
2121
+ }
2122
+ catch (_a) {
2123
+ return null;
2124
+ }
2125
+ }
2126
+ // ── Tono de piel ────────────────────────────────────────────────────────────
2127
+ /** Los 5 modificadores Fitzpatrick, en orden claro → oscuro (U+1F3FB..U+1F3FF). */
2128
+ const SKIN_TONES = ['\u{1F3FB}', '\u{1F3FC}', '\u{1F3FD}', '\u{1F3FE}', '\u{1F3FF}'];
2129
+ /** Claves estables de la API pública: '' = por defecto (amarillo). */
2130
+ const SKIN_TONE_KEYS = ['', 'light', 'medium-light', 'medium', 'medium-dark', 'dark'];
2131
+ /** Codepoints de persona que pueden repetirse en una secuencia (flag '2'). */
2132
+ const PERSON_CPS = new Set(['\u{1F468}', '\u{1F469}', '\u{1F9D1}']);
2133
+ const VS16 = '️';
2134
+ /** Modificador correspondiente a una clave pública, o '' si no aplica. */
2135
+ function toneFromKey(key) {
2136
+ const i = SKIN_TONE_KEYS.indexOf(key);
2137
+ return i > 0 ? SKIN_TONES[i - 1] : '';
2138
+ }
2139
+ /**
2140
+ * Aplica un modificador de tono a un emoji según su flag.
2141
+ *
2142
+ * Reglas (las dos que exige Unicode, no una aproximación):
2143
+ * - El modificador REEMPLAZA al selector de variación U+FE0F que siga a la
2144
+ * base: ✌️ (270C FE0F) + medio = 270C 1F3FD, no 270C FE0F 1F3FD. Solo al de
2145
+ * la base — el FE0F de un componente posterior (♀️ en 🕵️‍♀️) se conserva.
2146
+ * - Las secuencias multi-persona (flag '2') llevan el modificador en CADA
2147
+ * persona: 👩‍❤️‍👨 tonado es 1F469 tono 200D 2764 FE0F 200D 1F468 tono. Con uno
2148
+ * solo la secuencia deja de ser RGI y el navegador la parte en dos glifos.
2149
+ */
2150
+ function applySkinTone(char, flag, tone) {
2151
+ if (!tone || flag === '0')
2152
+ return char;
2153
+ const cps = Array.from(char);
2154
+ if (flag === '2') {
2155
+ let out = '';
2156
+ for (const cp of cps) {
2157
+ out += cp;
2158
+ if (PERSON_CPS.has(cp))
2159
+ out += tone;
2160
+ }
2161
+ return out;
2162
+ }
2163
+ const rest = cps.slice(1);
2164
+ if (rest[0] === VS16)
2165
+ rest.shift();
2166
+ return cps[0] + tone + rest.join('');
2167
+ }
2168
+ // ── Recientes ───────────────────────────────────────────────────────────────
2169
+ let cachedByChar = null;
2170
+ let cachedByKey = null;
2171
+ /**
2172
+ * Clave de búsqueda tolerante: sin modificadores de tono y sin selectores de
2173
+ * variación.
2174
+ *
2175
+ * Hace falta porque el modificador de tono SE COME el U+FE0F de la base, y ese
2176
+ * FE0F puede estar en medio de la secuencia: 🕵️‍♂️ es `1F575 FE0F 200D 2642 FE0F`
2177
+ * y tonado queda `1F575 1F3FD 200D 2642 FE0F`. Destonar no lo devuelve, y
2178
+ * re-anexar un FE0F al final tampoco — habría que reinsertarlo en la posición
2179
+ * correcta. Normalizar ambos lados es más simple y no depende de adivinar dónde
2180
+ * iba.
2181
+ */
2182
+ function normalizeKey(char) {
2183
+ const tones = [...SKIN_TONES];
2184
+ return Array.from(char)
2185
+ .filter((cp) => cp !== VS16 && !tones.includes(cp))
2186
+ .join('');
2187
+ }
2188
+ /** Índices char → entrada del dataset. Memoizados igual que `getEmojiEntries`. */
2189
+ function entriesByChar() {
2190
+ if (!cachedByChar || !cachedByKey) {
2191
+ const exact = new Map();
2192
+ const normalized = new Map();
2193
+ for (const e of getEmojiEntries()) {
2194
+ exact.set(e.char, e);
2195
+ // Primero gana: si dos formas normalizan igual, la de menor índice manda.
2196
+ const key = normalizeKey(e.char);
2197
+ if (!normalized.has(key))
2198
+ normalized.set(key, e);
2199
+ }
2200
+ cachedByChar = exact;
2201
+ cachedByKey = normalized;
2202
+ }
2203
+ return { exact: cachedByChar, normalized: cachedByKey };
2204
+ }
2205
+ /**
2206
+ * Resuelve un carácter (posiblemente tonado) a su entrada del dataset. Prueba la
2207
+ * forma exacta —el caso común, sin costo— y cae a la clave normalizada.
2208
+ */
2209
+ function resolveEmoji(char) {
2210
+ var _a;
2211
+ if (typeof char !== 'string' || !char)
2212
+ return undefined;
2213
+ const { exact, normalized } = entriesByChar();
2214
+ return (_a = exact.get(char)) !== null && _a !== void 0 ? _a : normalized.get(normalizeKey(char));
2215
+ }
2216
+ /**
2217
+ * Entradas para la fila de recientes. Los caracteres los da el consumidor (es
2218
+ * el dueño del historial), así que acá se sanea: se descarta lo que no resuelve
2219
+ * contra el dataset, se deduplica conservando el orden, y se recorta a `max`.
2220
+ *
2221
+ * El carácter se conserva TAL CUAL vino —con su tono— y por eso la entrada sale
2222
+ * con `tone: '0'`: ya está resuelto, no hay que volver a tonarlo.
2223
+ */
2224
+ function buildRecentEntries(recent, max) {
2225
+ if (!Array.isArray(recent) || recent.length === 0)
2226
+ return [];
2227
+ const out = [];
2228
+ const seen = new Set();
2229
+ for (const char of recent) {
2230
+ if (typeof char !== 'string' || !char || seen.has(char))
2231
+ continue;
2232
+ const base = resolveEmoji(char);
2233
+ if (!base)
2234
+ continue;
2235
+ seen.add(char);
2236
+ out.push({
2237
+ char,
2238
+ name: base.name,
2239
+ category: RECENT_CATEGORY,
2240
+ index: RECENT_INDEX_BASE + out.length,
2241
+ nameIndex: base.nameIndex,
2242
+ tone: '0',
2243
+ });
2244
+ if (out.length >= max)
2245
+ break;
2246
+ }
2247
+ return out;
2248
+ }
2249
+ // ── Búsqueda ────────────────────────────────────────────────────────────────
2250
+ /**
2251
+ * Filtra por nombre, rankeando por relevancia (`rankByMatch`: exacto > prefijo >
2252
+ * prefijo de palabra > substring), insensible a acentos y mayúsculas.
2253
+ *
2254
+ * Cuando hay pack de locale busca contra el nombre localizado Y el inglés: los
2255
+ * emoji sin traducción CLDR (la mayoría de las banderas) siguen siendo
2256
+ * encontrables, y quien tipea en inglés sobre una UI en español también acierta.
2257
+ */
2258
+ function searchEmojis(entries, query, localeNames) {
2259
+ // Tolera undefined: es un punto de entrada público y el valor viene de una
2260
+ // @State/@Prop que un consumidor puede dejar sin setear.
2261
+ if (!String(query !== null && query !== void 0 ? query : '').trim())
2262
+ return entries;
2263
+ return normalizeText.rankByMatch(entries, query, (e) => {
2264
+ const localized = localeNames === null || localeNames === void 0 ? void 0 : localeNames[e.nameIndex];
2265
+ return localized && localized !== e.name ? [localized, e.name] : e.name;
2266
+ });
2267
+ }
2268
+ /** Nombre a mostrar (tooltip / aria-label) para una entrada. */
2269
+ function displayName(entry, localeNames) {
2270
+ var _a;
2271
+ return (_a = localeNames === null || localeNames === void 0 ? void 0 : localeNames[entry.nameIndex]) !== null && _a !== void 0 ? _a : entry.name;
2272
+ }
2273
+ // ── Layout de grilla ────────────────────────────────────────────────────────
2274
+ /**
2275
+ * Aplana a filas de render. `grouped` inserta un header por categoría (modo
2276
+ * idle); en modo búsqueda los resultados van en una grilla continua, porque
2277
+ * vienen ordenados por relevancia y no por categoría.
2278
+ */
2279
+ function layoutRows(entries, columns, grouped) {
2280
+ // `Math.max(1, undefined)` es NaN y partiría la grilla en silencio.
2281
+ const cols = Number.isFinite(columns) ? Math.max(1, Math.floor(columns)) : DEFAULT_COLUMNS;
2282
+ const rows = [];
2283
+ const pushGrid = (list) => {
2284
+ for (let i = 0; i < list.length; i += cols)
2285
+ rows.push({ kind: 'emoji', entries: list.slice(i, i + cols) });
2286
+ };
2287
+ if (!grouped) {
2288
+ pushGrid(entries);
2289
+ return rows;
2290
+ }
2291
+ let current = null;
2292
+ let bucket = [];
2293
+ for (const entry of entries) {
2294
+ if (entry.category !== current) {
2295
+ if (bucket.length)
2296
+ pushGrid(bucket);
2297
+ bucket = [];
2298
+ current = entry.category;
2299
+ rows.push({ kind: 'header', category: current });
2300
+ }
2301
+ bucket.push(entry);
2302
+ }
2303
+ if (bucket.length)
2304
+ pushGrid(bucket);
2305
+ return rows;
2306
+ }
2307
+ /** Posición (fila, columna) de cada índice global dentro de un layout. */
2308
+ function buildPositionMap(rows) {
2309
+ const map = new Map();
2310
+ rows.forEach((row, r) => {
2311
+ if (row.kind !== 'emoji')
2312
+ return;
2313
+ row.entries.forEach((entry, c) => map.set(entry.index, { row: r, col: c }));
2314
+ });
2315
+ return map;
2316
+ }
2317
+ /** Índice de fila donde arranca cada categoría (para el salto del strip). */
2318
+ function categoryRowStarts(rows) {
2319
+ const map = new Map();
2320
+ rows.forEach((row, r) => {
2321
+ if (row.kind === 'header' && !map.has(row.category))
2322
+ map.set(row.category, r);
2323
+ });
2324
+ return map;
2325
+ }
2326
+ /** Categoría visible al tope del scroll — resalta el botón del strip. */
2327
+ function categoryAtRow(rows, rowIdx) {
2328
+ var _a;
2329
+ for (let r = Math.min(rowIdx, rows.length - 1); r >= 0; r--) {
2330
+ const row = rows[r];
2331
+ if ((row === null || row === void 0 ? void 0 : row.kind) === 'header')
2332
+ return row.category;
2333
+ if ((row === null || row === void 0 ? void 0 : row.kind) === 'emoji') {
2334
+ const cat = (_a = row.entries[0]) === null || _a === void 0 ? void 0 : _a.category;
2335
+ if (cat)
2336
+ return cat;
2337
+ }
2338
+ }
2339
+ return null;
2340
+ }
2341
+ // ── Virtualización ──────────────────────────────────────────────────────────
2342
+ /**
2343
+ * Ventana de filas a renderizar. 1906 emoji son ~240 filas: sin esto el panel
2344
+ * monta ~1900 botones por apertura. Con la ventana quedan ~13 filas (~104
2345
+ * botones) sin importar el tamaño del dataset.
2346
+ */
2347
+ function virtualSlice(scrollTop, viewportHeight, rowCount) {
2348
+ const visible = Math.max(1, Math.ceil(viewportHeight / ROW_HEIGHT));
2349
+ const start = Math.max(0, Math.floor(scrollTop / ROW_HEIGHT) - OVERSCAN);
2350
+ const end = Math.min(rowCount, start + visible + OVERSCAN * 2);
2351
+ return { totalHeight: rowCount * ROW_HEIGHT, start, end, offsetY: start * ROW_HEIGHT };
2352
+ }
2353
+ /** Filas de salto de PageUp/PageDown. */
2354
+ const PAGE_ROWS = 5;
2355
+ /**
2356
+ * Siguiente índice global activo tras una tecla de navegación, o el actual si
2357
+ * el movimiento no lleva a ninguna celda.
2358
+ *
2359
+ * Trabaja sobre el layout (no sobre el array plano) para que las filas
2360
+ * parciales del final de cada categoría y los headers intercalados se comporten
2361
+ * como los ve el usuario: bajar desde una fila corta cae en la última celda de
2362
+ * la fila de abajo, y los headers se saltan solos.
2363
+ */
2364
+ function moveActive(rows, positions, activeIndex, key) {
2365
+ const flat = [];
2366
+ for (const row of rows)
2367
+ if (row.kind === 'emoji')
2368
+ for (const e of row.entries)
2369
+ flat.push(e.index);
2370
+ if (flat.length === 0)
2371
+ return -1;
2372
+ if (activeIndex < 0 || !positions.has(activeIndex)) {
2373
+ return key === 'ArrowUp' || key === 'End' || key === 'PageUp' ? flat[flat.length - 1] : flat[0];
2374
+ }
2375
+ const at = positions.get(activeIndex);
2376
+ if (key === 'ArrowRight' || key === 'ArrowLeft') {
2377
+ const linear = flat.indexOf(activeIndex);
2378
+ const next = linear + (key === 'ArrowRight' ? 1 : -1);
2379
+ return next < 0 || next >= flat.length ? activeIndex : flat[next];
2380
+ }
2381
+ if (key === 'Home')
2382
+ return flat[0];
2383
+ if (key === 'End')
2384
+ return flat[flat.length - 1];
2385
+ const step = key === 'ArrowDown' ? 1 : key === 'ArrowUp' ? -1 : key === 'PageDown' ? PAGE_ROWS : -PAGE_ROWS;
2386
+ return seekRow(rows, at, step, activeIndex);
2387
+ }
2388
+ /** Busca la celda más cercana a `col` avanzando de a `step` filas, saltando
2389
+ * headers. Devuelve `fallback` si no hay ninguna fila de grilla en esa
2390
+ * dirección (ya estás en el borde). */
2391
+ function seekRow(rows, at, step, fallback) {
2392
+ const dir = step > 0 ? 1 : -1;
2393
+ let remaining = Math.abs(step);
2394
+ let r = at.row;
2395
+ let last = fallback;
2396
+ while (remaining > 0) {
2397
+ r += dir;
2398
+ while (r >= 0 && r < rows.length && rows[r].kind !== 'emoji')
2399
+ r += dir;
2400
+ if (r < 0 || r >= rows.length)
2401
+ break;
2402
+ const row = rows[r];
2403
+ last = row.entries[Math.min(at.col, row.entries.length - 1)].index;
2404
+ remaining--;
2405
+ }
2406
+ return last;
2407
+ }
2408
+
2409
+ const coEmojiPickerCss = () => `:host{display:block;font-family:var(--co-font-family-primary);font-size:var(--co-font-size-14);letter-spacing:var(--co-font-letter-spacing-body)}.co-emoji-picker{--co-emoji-picker-cell:36px;--co-emoji-picker-columns:8;display:flex;flex-direction:column;width:calc(var(--co-emoji-picker-columns) * var(--co-emoji-picker-cell) + 2 * var(--co-spacing-sm2));box-sizing:border-box;background:var(--co-semantic-surface-page);color:var(--co-semantic-text-default)}.co-emoji-picker__search{display:flex;align-items:center;gap:var(--co-spacing-sm);margin:var(--co-spacing-sm2) var(--co-spacing-sm2) 0;padding:var(--co-spacing-xs) var(--co-spacing-sm);background:var(--co-semantic-surface-page);border:1px solid var(--co-semantic-border-field);border-radius:var(--co-border-radius-xs);box-sizing:border-box;color:var(--co-semantic-text-muted);transition:border-color var(--co-motion-duration-fast) var(--co-motion-ease-out), box-shadow var(--co-motion-duration-fast) var(--co-motion-ease-out)}.co-emoji-picker__search:focus-within{border-color:var(--co-semantic-border-focus);box-shadow:0 0 0 2px var(--co-semantic-border-focus-ring)}.co-emoji-picker__input{flex:1;min-width:0;border:none;outline:none;background:transparent;font-family:inherit;font-size:var(--co-font-size-14);color:var(--co-semantic-text-default);padding:var(--co-spacing-xxs) 0}.co-emoji-picker__input::placeholder{color:var(--co-semantic-text-muted)}.co-emoji-picker__tones{position:relative;display:flex;align-items:center;flex-shrink:0}.co-emoji-picker__tone-toggle,.co-emoji-picker__tone{display:flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;background:transparent;border-radius:var(--co-border-radius-xxs);font-size:var(--co-font-size-14);line-height:1;cursor:pointer;transition:background var(--co-motion-duration-fast) var(--co-motion-ease-out)}.co-emoji-picker__tone-toggle:hover,.co-emoji-picker__tone:hover{background:var(--co-semantic-surface-hover)}.co-emoji-picker__tone-toggle:focus-visible,.co-emoji-picker__tone:focus-visible{outline:none;box-shadow:0 0 0 2px var(--co-semantic-border-focus-ring)}.co-emoji-picker__tone--selected{background:var(--co-semantic-surface-secondary)}.co-emoji-picker__tone-row{position:absolute;top:calc(100% + var(--co-spacing-xs));right:0;z-index:1;display:flex;align-items:center;gap:var(--co-spacing-xxs);padding:var(--co-spacing-xxs);background:var(--co-semantic-surface-page);border:1px solid var(--co-semantic-border-default);border-radius:var(--co-border-radius-xs);box-shadow:var(--co-shadow-lg)}.co-emoji-picker__categories{display:flex;align-items:center;justify-content:space-between;gap:var(--co-spacing-xxs);padding:var(--co-spacing-sm2) var(--co-spacing-sm2) var(--co-spacing-xs)}.co-emoji-picker__category{display:flex;align-items:center;justify-content:center;flex:1;min-width:0;height:28px;padding:0;border:none;background:transparent;border-radius:var(--co-border-radius-xxs);color:var(--co-semantic-text-muted);cursor:pointer;transition:color var(--co-motion-duration-fast) var(--co-motion-ease-out), background var(--co-motion-duration-fast) var(--co-motion-ease-out)}.co-emoji-picker__category:hover{color:var(--co-semantic-text-default);background:var(--co-semantic-surface-hover)}.co-emoji-picker__category--active{color:var(--co-semantic-text-default);background:var(--co-semantic-surface-secondary)}.co-emoji-picker__category:focus-visible{outline:none;color:var(--co-semantic-text-default);box-shadow:0 0 0 2px var(--co-semantic-border-focus-ring)}.co-emoji-picker__scroll{position:relative;height:var(--co-emoji-picker-height, calc(8 * var(--co-emoji-picker-cell)));overflow-y:auto;overflow-x:hidden;padding:0 var(--co-spacing-sm2);box-sizing:border-box;scrollbar-width:thin;scrollbar-color:var(--co-semantic-border-default) transparent;outline:none}.co-emoji-picker__scroll::-webkit-scrollbar{width:8px}.co-emoji-picker__scroll::-webkit-scrollbar-thumb{background:var(--co-semantic-border-default);border-radius:var(--co-border-radius-full)}.co-emoji-picker__scroll::-webkit-scrollbar-track{background:transparent}.co-emoji-picker__sizer{position:relative;width:100%}.co-emoji-picker__window{position:absolute;top:0;left:0;width:100%;will-change:transform}.co-emoji-picker__section{display:flex;align-items:flex-end;height:var(--co-emoji-picker-cell);padding-bottom:var(--co-spacing-xs);box-sizing:border-box;font-size:var(--co-font-size-11);font-weight:500;text-transform:uppercase;letter-spacing:var(--co-font-letter-spacing-caption, normal);color:var(--co-semantic-text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.co-emoji-picker__row{display:flex;height:var(--co-emoji-picker-cell)}.co-emoji-picker__cell{display:flex;align-items:center;justify-content:center;width:var(--co-emoji-picker-cell);height:var(--co-emoji-picker-cell);flex:0 0 var(--co-emoji-picker-cell);padding:0;border:none;background:transparent;border-radius:var(--co-border-radius-xxs);cursor:pointer;transition:background var(--co-motion-duration-instant) var(--co-motion-ease-out), transform var(--co-motion-duration-instant) var(--co-motion-ease-out)}.co-emoji-picker__cell:hover,.co-emoji-picker__cell--active{background:var(--co-semantic-surface-hover)}.co-emoji-picker__cell:focus-visible{outline:none;background:var(--co-semantic-surface-hover);box-shadow:0 0 0 2px var(--co-semantic-border-focus-ring)}.co-emoji-picker__cell:active{transform:scale(0.92)}.co-emoji-picker__glyph{font-family:var( --co-font-family-emoji, 'Apple Color Emoji', 'Segoe UI Emoji', 'Noto Color Emoji', 'Segoe UI Symbol', sans-serif );font-size:var(--co-font-size-22);line-height:1;display:block}.co-emoji-picker__empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--co-spacing-sm);height:100%;color:var(--co-semantic-text-muted);font-size:var(--co-font-size-13);text-align:center}`;
2410
+
2411
+ const NAV_KEYS = [
2412
+ 'ArrowRight', 'ArrowLeft', 'ArrowDown', 'ArrowUp', 'Home', 'End', 'PageDown', 'PageUp',
2413
+ ];
2414
+ const CoEmojiPicker = class {
2415
+ constructor(hostRef) {
2416
+ index.registerInstance(this, hostRef);
2417
+ this.coSelect = index.createEvent(this, "coSelect", 1);
2418
+ this.coSkinToneChange = index.createEvent(this, "coSkinToneChange", 1);
2419
+ this.coClose = index.createEvent(this, "coClose", 1);
2420
+ /** Placeholder del buscador. Vacío = el del `locale`. */
2421
+ this.searchPlaceholder = '';
2422
+ /** Mensaje de "sin resultados". Vacío = el del `locale`. */
2423
+ this.emptyMessage = '';
2424
+ /** aria-label del panel. Vacío = el del `locale`. */
2425
+ this.label = '';
2426
+ /** Muestra el buscador. */
2427
+ this.searchable = true;
2428
+ /** Muestra el strip de categorías. */
2429
+ this.showCategories = true;
2430
+ /** Columnas de la grilla. */
2431
+ this.columns = 8;
2432
+ /**
2433
+ * Tono de piel aplicado a toda la grilla: `''` (por defecto) | `'light'` |
2434
+ * `'medium-light'` | `'medium'` | `'medium-dark'` | `'dark'`.
2435
+ *
2436
+ * Es `mutable`: el componente la actualiza al elegir un tono para que funcione
2437
+ * suelto, y emite `coSkinToneChange`. La PERSISTENCIA es del consumidor —
2438
+ * Cobalt no escribe storage (ver el comentario de `recent`).
2439
+ */
2440
+ this.skinTone = '';
2441
+ /**
2442
+ * Emoji usados recientemente, del más nuevo al más viejo. Se pintan como una
2443
+ * categoría propia al tope de la grilla; con la lista vacía la categoría no
2444
+ * existe (ni fila, ni header, ni botón en el strip).
2445
+ *
2446
+ * El historial lo posee el CONSUMIDOR, igual que el tono. Ningún componente de
2447
+ * Cobalt escribe `localStorage`: el design system no conoce el scope de la
2448
+ * preferencia (¿por usuario? ¿por workspace? ¿sincronizada al backend?) y
2449
+ * escribir por su cuenta le impondría esa decisión a toda la suite. El
2450
+ * consumidor recibe `coSelect` y actualiza esta prop; `pushRecent()` de
2451
+ * `emojiPickerLogic` implementa la política MRU si no la quiere reescribir.
2452
+ *
2453
+ * Es RECIENTES (orden temporal), no "frecuentes" (por conteo): lo último que
2454
+ * usaste queda primero, sin contadores que se calcifiquen arriba con el uso.
2455
+ */
2456
+ this.recent = [];
2457
+ /** Tope de emoji recientes mostrados. */
2458
+ this.recentLimit = 16;
2459
+ this.term = '';
2460
+ this.activeIndex = -1;
2461
+ this.scrollTop = 0;
2462
+ this.viewportHeight = ROW_HEIGHT * 8;
2463
+ /** Nombres localizados, o null mientras carga / si el locale no tiene pack. */
2464
+ this.localeNames = null;
2465
+ /** Fila de tonos desplegada. */
2466
+ this.toneOpen = false;
2467
+ /** Descarta un pack que llegó tarde tras cambiar de locale. */
2468
+ this.localeToken = 0;
2469
+ /** Evita que el foco vuelva al toggle si el cierre vino de un click afuera. */
2470
+ this.restoreToneFocus = false;
2471
+ /** Memo del layout — ver el getter `view`. */
2472
+ this.viewCache = null;
2473
+ /** Manda el foco al tono activo en el render que sigue a abrir la fila. */
2474
+ this.pendingToneFocus = false;
2475
+ // ── Interacción ───────────────────────────────────────────
2476
+ this.handleInput = (e) => {
2477
+ this.term = e.target.value;
2478
+ // La grilla cambia por completo: el activo viejo ya no existe.
2479
+ this.activeIndex = -1;
2480
+ this.scrollTop = 0;
2481
+ if (this.scrollEl)
2482
+ this.scrollEl.scrollTop = 0;
2483
+ };
2484
+ this.handleKeyDown = (e) => {
2485
+ if (e.key === 'Escape') {
2486
+ e.preventDefault();
2487
+ // Escape acota: la fila de tonos abierta se cierra primero, después la
2488
+ // búsqueda, y recién con todo limpio se le avisa al host.
2489
+ if (this.toneOpen) {
2490
+ this.restoreToneFocus = true;
2491
+ this.toneOpen = false;
2492
+ }
2493
+ else if (this.term) {
2494
+ this.term = '';
2495
+ this.activeIndex = -1;
2496
+ }
2497
+ else {
2498
+ this.coClose.emit();
2499
+ }
2500
+ return;
2501
+ }
2502
+ if (e.key === 'Enter' || e.key === ' ') {
2503
+ const entry = this.view.entries.find((x) => x.index === this.activeIndex);
2504
+ // Space sin celda activa es un espacio legítimo dentro del buscador.
2505
+ if (!entry)
2506
+ return;
2507
+ e.preventDefault();
2508
+ this.select(entry);
2509
+ return;
2510
+ }
2511
+ if (!NAV_KEYS.includes(e.key))
2512
+ return;
2513
+ const rows = this.rows;
2514
+ const next = moveActive(rows, buildPositionMap(rows), this.activeIndex, e.key);
2515
+ if (next < 0)
2516
+ return;
2517
+ e.preventDefault();
2518
+ this.activeIndex = next;
2519
+ this.scrollActiveIntoView(rows, next);
2520
+ };
2521
+ this.handleScroll = () => {
2522
+ if (this.scrollEl)
2523
+ this.scrollTop = this.scrollEl.scrollTop;
2524
+ };
2525
+ // ── Tono de piel ──────────────────────────────────────────
2526
+ this.toggleTones = () => {
2527
+ this.toneOpen = !this.toneOpen;
2528
+ if (this.toneOpen)
2529
+ this.pendingToneFocus = true;
2530
+ };
2531
+ /** Teclado de la fila de tonos: flechas entre opciones, Escape vuelve al
2532
+ * toggle. Corta la propagación porque el panel entero escucha keydown para
2533
+ * navegar la grilla — sin esto, una flecha acá también movería la selección. */
2534
+ this.handleToneKeyDown = (e, i) => {
2535
+ var _a;
2536
+ const keys = ['ArrowRight', 'ArrowLeft', 'ArrowDown', 'ArrowUp', 'Home', 'End', 'Escape'];
2537
+ if (!keys.includes(e.key))
2538
+ return;
2539
+ e.preventDefault();
2540
+ e.stopPropagation();
2541
+ if (e.key === 'Escape') {
2542
+ this.restoreToneFocus = true;
2543
+ this.toneOpen = false;
2544
+ return;
2545
+ }
2546
+ const last = SKIN_TONE_KEYS.length - 1;
2547
+ const next = e.key === 'Home' ? 0
2548
+ : e.key === 'End' ? last
2549
+ : e.key === 'ArrowRight' || e.key === 'ArrowDown' ? Math.min(last, i + 1)
2550
+ : Math.max(0, i - 1);
2551
+ const el = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(`[data-tone-index="${next}"]`);
2552
+ el === null || el === void 0 ? void 0 : el.focus();
2553
+ };
2554
+ this.jumpToCategory = (category) => {
2555
+ var _a;
2556
+ // El strip navega el dataset completo; con una búsqueda activa hay que
2557
+ // volver a idle o la categoría podría no estar en los resultados.
2558
+ if (this.term) {
2559
+ this.term = '';
2560
+ this.activeIndex = -1;
2561
+ }
2562
+ // Las filas se recalculan con el término ya limpio.
2563
+ const row = categoryRowStarts(this.rows).get(category);
2564
+ if (row === undefined || !this.scrollEl)
2565
+ return;
2566
+ this.scrollEl.scrollTop = row * ROW_HEIGHT;
2567
+ this.scrollTop = row * ROW_HEIGHT;
2568
+ (_a = this.inputEl) === null || _a === void 0 ? void 0 : _a.focus();
2569
+ };
2570
+ }
2571
+ // ── Ciclo de vida ─────────────────────────────────────────
2572
+ componentWillLoad() {
2573
+ var _a, _b, _c, _d, _e, _f, _g;
2574
+ // Semilla explícita del estado (mismo patrón que co-option-list, que
2575
+ // asigna `this.term` acá en vez de confiar en el inicializador de campo).
2576
+ // El entorno de spec de @stencil/vitest NO aplica los inicializadores de
2577
+ // los miembros decorados —ni de @State ni de los defaults de @Prop—, así
2578
+ // que sin esto el primer render ve `undefined`. En el build real es una
2579
+ // reasignación inocua.
2580
+ (_a = this.term) !== null && _a !== void 0 ? _a : (this.term = '');
2581
+ (_b = this.activeIndex) !== null && _b !== void 0 ? _b : (this.activeIndex = -1);
2582
+ (_c = this.scrollTop) !== null && _c !== void 0 ? _c : (this.scrollTop = 0);
2583
+ (_d = this.viewportHeight) !== null && _d !== void 0 ? _d : (this.viewportHeight = ROW_HEIGHT * 8);
2584
+ (_e = this.toneOpen) !== null && _e !== void 0 ? _e : (this.toneOpen = false);
2585
+ (_f = this.skinTone) !== null && _f !== void 0 ? _f : (this.skinTone = '');
2586
+ (_g = this.recentLimit) !== null && _g !== void 0 ? _g : (this.recentLimit = 16);
2587
+ this.syncLocaleNames();
2588
+ }
2589
+ componentDidLoad() {
2590
+ this.measureViewport();
2591
+ if (typeof ResizeObserver !== 'undefined' && this.scrollEl) {
2592
+ this.resizeObserver = new ResizeObserver(() => this.measureViewport());
2593
+ this.resizeObserver.observe(this.scrollEl);
2594
+ }
2595
+ }
2596
+ componentDidRender() {
2597
+ var _a, _b, _c;
2598
+ // El foco sigue a la fila de tonos: al abrir va al tono activo, al cerrar
2599
+ // vuelve al toggle. Sin esto, cerrar con Escape deja el foco en un botón
2600
+ // que ya no está en el DOM y el navegador lo manda al <body>.
2601
+ if (this.toneOpen && this.pendingToneFocus) {
2602
+ this.pendingToneFocus = false;
2603
+ const i = Math.max(0, SKIN_TONE_KEYS.indexOf(this.skinTone));
2604
+ (_b = (_a = this.el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(`[data-tone-index="${i}"]`)) === null || _b === void 0 ? void 0 : _b.focus();
2605
+ }
2606
+ else if (!this.toneOpen && this.restoreToneFocus) {
2607
+ this.restoreToneFocus = false;
2608
+ (_c = this.toneToggleEl) === null || _c === void 0 ? void 0 : _c.focus();
2609
+ }
2610
+ }
2611
+ disconnectedCallback() {
2612
+ var _a;
2613
+ (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
2614
+ this.resizeObserver = undefined;
2615
+ }
2616
+ onLocaleChange() {
2617
+ this.syncLocaleNames();
2618
+ }
2619
+ /** Carga (o descarta) el pack de nombres del locale activo. */
2620
+ syncLocaleNames() {
2621
+ const lang = dateI18n.langFromLocale(this.locale);
2622
+ const token = ++this.localeToken;
2623
+ // Hasta que el pack llegue (o si no hay), los nombres son los ingleses.
2624
+ this.localeNames = null;
2625
+ if (!hasLocalePack(lang))
2626
+ return;
2627
+ loadLocaleNames(lang).then((names) => {
2628
+ // Otro cambio de locale ganó la carrera → el pack viejo se descarta.
2629
+ if (token === this.localeToken)
2630
+ this.localeNames = names;
2631
+ });
2632
+ }
2633
+ measureViewport() {
2634
+ var _a;
2635
+ const h = (_a = this.scrollEl) === null || _a === void 0 ? void 0 : _a.clientHeight;
2636
+ if (h && h !== this.viewportHeight)
2637
+ this.viewportHeight = h;
2638
+ }
2639
+ // ── Derivados ─────────────────────────────────────────────
2640
+ get strings() {
2641
+ return getEmojiStrings(this.locale);
2642
+ }
2643
+ get grouped() {
2644
+ return !this.term.trim();
2645
+ }
2646
+ /** Modificador Unicode del tono activo ('' = por defecto). */
2647
+ get tone() {
2648
+ return toneFromKey(this.skinTone);
2649
+ }
2650
+ /**
2651
+ * Entradas + layout de la vista actual, memoizados.
2652
+ *
2653
+ * `render()` corre en CADA tick de scroll (handleScroll escribe scrollTop), y
2654
+ * rearmar el layout ahí significaba recorrer los 1906 emoji y construir ~240
2655
+ * objetos de fila por frame. La clave cubre todo lo que cambia el layout; el
2656
+ * tono NO entra: solo afecta el glifo que pinta la celda, no su posición.
2657
+ */
2658
+ get view() {
2659
+ var _a;
2660
+ const grouped = this.grouped;
2661
+ const recentEntries = grouped ? buildRecentEntries(this.recent, this.recentLimit) : [];
2662
+ const key = [
2663
+ this.term,
2664
+ this.columns,
2665
+ this.localeToken,
2666
+ this.localeNames ? 1 : 0,
2667
+ recentEntries.map((e) => e.char).join(''),
2668
+ ].join('\u0000');
2669
+ if (((_a = this.viewCache) === null || _a === void 0 ? void 0 : _a.key) === key)
2670
+ return this.viewCache;
2671
+ const entries = grouped
2672
+ ? [...recentEntries, ...getEmojiEntries()]
2673
+ : searchEmojis(getEmojiEntries(), this.term, this.localeNames);
2674
+ const rows = layoutRows(entries, this.columns, grouped);
2675
+ this.viewCache = { key, entries, rows };
2676
+ return this.viewCache;
2677
+ }
2678
+ get rows() {
2679
+ return this.view.rows;
2680
+ }
2681
+ /** Mantiene la celda activa dentro del viewport virtualizado. Se hace con
2682
+ * matemática de filas y no con `scrollIntoView`: la celda puede no estar
2683
+ * montada todavía (está fuera de la ventana virtual). */
2684
+ scrollActiveIntoView(rows, index) {
2685
+ const pos = buildPositionMap(rows).get(index);
2686
+ if (!pos || !this.scrollEl)
2687
+ return;
2688
+ const top = pos.row * ROW_HEIGHT;
2689
+ const bottom = top + ROW_HEIGHT;
2690
+ const view = this.scrollEl.scrollTop;
2691
+ if (top < view)
2692
+ this.scrollEl.scrollTop = top;
2693
+ else if (bottom > view + this.viewportHeight)
2694
+ this.scrollEl.scrollTop = bottom - this.viewportHeight;
2695
+ }
2696
+ select(entry) {
2697
+ this.coSelect.emit({
2698
+ emoji: this.charOf(entry),
2699
+ name: displayName(entry, this.localeNames),
2700
+ });
2701
+ }
2702
+ /** Glifo final de una entrada: el tono activo aplicado si lo soporta. Las
2703
+ * entradas de recientes ya vienen resueltas (tone '0') y salen tal cual. */
2704
+ charOf(entry) {
2705
+ return applySkinTone(entry.char, entry.tone, this.tone);
2706
+ }
2707
+ chooseTone(key) {
2708
+ if (key !== this.skinTone) {
2709
+ this.skinTone = key;
2710
+ this.coSkinToneChange.emit({ skinTone: key });
2711
+ }
2712
+ this.restoreToneFocus = true;
2713
+ this.toneOpen = false;
2714
+ }
2715
+ // ── Render ────────────────────────────────────────────────
2716
+ renderCell(entry, fallbackTabIndex) {
2717
+ const active = entry.index === this.activeIndex;
2718
+ const name = displayName(entry, this.localeNames);
2719
+ // Roving tabindex: UNA sola celda tabbable. Con activo, esa; sin activo, la
2720
+ // primera de la grilla (`fallbackTabIndex`) — no todas las montadas, o la
2721
+ // grilla metería ~100 paradas de tab en el recorrido de la página.
2722
+ const tabbable = this.searchable
2723
+ ? false
2724
+ : active || (this.activeIndex < 0 && entry.index === fallbackTabIndex);
2725
+ return (index.h("button", { type: "button", key: entry.index, id: CoEmojiPicker.cellId(entry.index), class: { 'co-emoji-picker__cell': true, 'co-emoji-picker__cell--active': active }, role: "option", "aria-selected": active ? 'true' : 'false', "aria-label": name, title: name,
2726
+ // El foco vive en el buscador (patrón combobox + aria-activedescendant);
2727
+ // sin buscador la grilla toma roving tabindex para seguir siendo operable.
2728
+ tabIndex: tabbable ? 0 : -1, onFocus: () => {
2729
+ if (!this.searchable)
2730
+ this.activeIndex = entry.index;
2731
+ },
2732
+ // El hover se resalta SOLO por CSS (:hover). Escribirlo a @State
2733
+ // re-renderizaba la ventana entera (~100 botones) en cada mousemove, y
2734
+ // además ensuciaba aria-activedescendant, que debe seguir al teclado.
2735
+ onClick: () => this.select(entry) }, index.h("span", { class: "co-emoji-picker__glyph", "aria-hidden": "true" }, this.charOf(entry))));
2736
+ }
2737
+ /** Botón de tono + fila desplegable. La fila es un `radiogroup` con roving
2738
+ * tabindex: una sola parada de tab, flechas para moverse. */
2739
+ renderTones() {
2740
+ var _a;
2741
+ const s = this.strings;
2742
+ const current = Math.max(0, SKIN_TONE_KEYS.indexOf(this.skinTone));
2743
+ const currentName = (_a = s.skinTones[current]) !== null && _a !== void 0 ? _a : '';
2744
+ return (index.h("div", { class: "co-emoji-picker__tones", part: "tones" }, index.h("button", { type: "button", class: "co-emoji-picker__tone-toggle", "aria-label": `${s.skinToneLabel}: ${currentName}`, "aria-expanded": this.toneOpen ? 'true' : 'false', "aria-haspopup": "true", title: s.skinToneLabel, ref: (el) => (this.toneToggleEl = el), onClick: this.toggleTones }, index.h("span", { "aria-hidden": "true" }, applySkinTone('\u{270B}', '1', this.tone))), this.toneOpen && (index.h("div", { class: "co-emoji-picker__tone-row", role: "radiogroup", "aria-label": s.skinToneLabel }, SKIN_TONE_KEYS.map((key, i) => {
2745
+ var _a, _b;
2746
+ const selected = key === this.skinTone;
2747
+ return (index.h("button", { type: "button", key: key || 'default', "data-tone-index": i, class: {
2748
+ 'co-emoji-picker__tone': true,
2749
+ 'co-emoji-picker__tone--selected': selected,
2750
+ }, role: "radio", "aria-checked": selected ? 'true' : 'false', "aria-label": (_a = s.skinTones[i]) !== null && _a !== void 0 ? _a : key, title: (_b = s.skinTones[i]) !== null && _b !== void 0 ? _b : key, tabIndex: selected ? 0 : -1, onKeyDown: (e) => this.handleToneKeyDown(e, i), onClick: () => this.chooseTone(key) }, index.h("span", { "aria-hidden": "true" }, applySkinTone('\u{270B}', '1', toneFromKey(key)))));
2751
+ })))));
2752
+ }
2753
+ renderRows(rows) {
2754
+ const { totalHeight, start, end, offsetY } = virtualSlice(this.scrollTop, this.viewportHeight, rows.length);
2755
+ const { categories } = this.strings;
2756
+ // Primera celda del layout COMPLETO (no de la ventana): es la que sostiene
2757
+ // el tab-stop mientras no haya celda activa.
2758
+ const firstRow = rows.find((r) => r.kind === 'emoji');
2759
+ const firstIndex = (firstRow === null || firstRow === void 0 ? void 0 : firstRow.kind) === 'emoji' ? firstRow.entries[0].index : -1;
2760
+ return (index.h("div", { class: "co-emoji-picker__sizer", style: { height: `${totalHeight}px` } }, index.h("div", { class: "co-emoji-picker__window", style: { transform: `translateY(${offsetY}px)` } }, rows.slice(start, end).map((row, i) => {
2761
+ var _a;
2762
+ return row.kind === 'header' ? (index.h("div", { class: "co-emoji-picker__section", key: `h-${start + i}`, role: "presentation" }, (_a = categories[row.category]) !== null && _a !== void 0 ? _a : row.category)) : (index.h("div", { class: "co-emoji-picker__row", key: `r-${start + i}`, role: "presentation" }, row.entries.map((entry) => this.renderCell(entry, firstIndex))));
2763
+ }))));
2764
+ }
2765
+ render() {
2766
+ const s = this.strings;
2767
+ const rows = this.rows;
2768
+ const isEmpty = rows.length === 0;
2769
+ const activeCategory = this.grouped
2770
+ ? categoryAtRow(rows, Math.floor(this.scrollTop / ROW_HEIGHT))
2771
+ : null;
2772
+ const activeCellId = this.activeIndex >= 0 ? CoEmojiPicker.cellId(this.activeIndex) : undefined;
2773
+ // La categoría de recientes solo existe si hay historial que mostrar: con la
2774
+ // lista vacía no hay botón fantasma en el strip ni hueco en la grilla. Se
2775
+ // decide sobre la prop cruda y no sobre la vista, así el strip no cambia de
2776
+ // ancho al empezar a buscar (saltar a una categoría ya limpia la búsqueda).
2777
+ const hasRecent = buildRecentEntries(this.recent, this.recentLimit).length > 0;
2778
+ const stripCategories = hasRecent
2779
+ ? [RECENT_CATEGORY, ...EMOJI_CATEGORIES]
2780
+ : [...EMOJI_CATEGORIES];
2781
+ return (index.h("div", { key: '7f3da124283afb57ac05c388746d07a7f63a0eca', class: "co-emoji-picker", part: "panel", role: "group", "aria-label": this.label || s.pickerLabel, style: { '--co-emoji-picker-columns': String(Math.max(1, this.columns)) }, onKeyDown: this.handleKeyDown }, this.searchable && (index.h("div", { key: 'eb4efeeed738dc094f155bc7bdc907e3075c2dad', class: "co-emoji-picker__search", part: "search" }, index.h("co-icon", { key: '042c32db076e3628e9459304f12304c7c3d85ae9', name: "magnifying-glass", size: 16 }), index.h("input", { key: '21c74e3a55e9b332061e73812cff512807afaabc', class: "co-emoji-picker__input", part: "input", type: "text", value: this.term, placeholder: this.searchPlaceholder || s.searchPlaceholder, onInput: this.handleInput, ref: (el) => (this.inputEl = el), role: "combobox", "aria-expanded": "true", "aria-autocomplete": "list", "aria-controls": CoEmojiPicker.GRID_ID, "aria-activedescendant": activeCellId }), this.renderTones())), this.showCategories && (index.h("div", { key: '7b08cac53699f975e7f331e91700f6182d208cab', class: "co-emoji-picker__categories", part: "categories", "aria-label": s.categoriesLabel }, !this.searchable && this.renderTones(), stripCategories.map((category) => {
2782
+ var _a, _b;
2783
+ const name = (_a = s.categories[category]) !== null && _a !== void 0 ? _a : category;
2784
+ return (index.h("button", { type: "button", key: category, class: {
2785
+ 'co-emoji-picker__category': true,
2786
+ 'co-emoji-picker__category--active': category === activeCategory,
2787
+ }, "aria-label": name, "aria-current": category === activeCategory ? 'true' : undefined, title: name, onClick: () => this.jumpToCategory(category) }, index.h("co-icon", { name: (_b = EMOJI_CATEGORY_ICONS[category]) !== null && _b !== void 0 ? _b : 'circle', size: 16 })));
2788
+ }))), index.h("div", { key: '349078ee46f1833797620c5c97da23807b7db384', class: "co-emoji-picker__scroll", part: "grid", id: CoEmojiPicker.GRID_ID, role: "listbox", "aria-label": s.gridLabel, ref: (el) => (this.scrollEl = el), onScroll: this.handleScroll }, isEmpty ? (index.h("div", { class: "co-emoji-picker__empty" }, index.h("co-icon", { name: "magnifying-glass", size: 20 }), index.h("span", null, this.emptyMessage || s.emptyMessage))) : (this.renderRows(rows)))));
2789
+ }
2790
+ get el() { return index.getElement(this); }
2791
+ static get watchers() { return {
2792
+ "locale": [{
2793
+ "onLocaleChange": 0
2794
+ }]
2795
+ }; }
2796
+ };
2797
+ /**
2798
+ * Ids del shadow root de ESTA instancia (constantes, no aleatorios: los
2799
+ * shadow roots no comparten espacio de ids). El input los referencia con
2800
+ * aria-controls/aria-activedescendant, ambos dentro del mismo root — que es
2801
+ * la razón por la que este patrón SÍ funciona acá y no en co-command-search,
2802
+ * donde la lista vive en otro shadow root.
2803
+ */
2804
+ CoEmojiPicker.GRID_ID = 'co-emoji-grid';
2805
+ CoEmojiPicker.cellId = (index) => `co-emoji-cell-${index}`;
2806
+ CoEmojiPicker.style = coEmojiPickerCss();
2807
+
2808
+ exports.co_emoji_picker = CoEmojiPicker;