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