@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.
- package/custom-elements.json +589 -27
- package/dist/cjs/co-accordion.cjs.entry.js +2 -2
- package/dist/cjs/co-action-bar.cjs.entry.js +2 -2
- package/dist/cjs/co-app-shell.cjs.entry.js +2 -2
- package/dist/cjs/co-audio-player.cjs.entry.js +3 -3
- package/dist/cjs/co-autocomplete.cjs.entry.js +1 -1
- package/dist/cjs/co-avatar_2.cjs.entry.js +2 -2
- package/dist/cjs/co-badge.cjs.entry.js +1 -1
- package/dist/cjs/co-bottom-sheet.cjs.entry.js +10 -11
- package/dist/cjs/co-breadcrumb-item.cjs.entry.js +2 -2
- package/dist/cjs/co-breadcrumb.cjs.entry.js +1 -1
- package/dist/cjs/co-button-group.cjs.entry.js +2 -2
- package/dist/cjs/co-button.cjs.entry.js +2 -2
- package/dist/cjs/co-calendar-month_2.cjs.entry.js +3 -3
- package/dist/cjs/co-calendar_3.cjs.entry.js +42 -7
- package/dist/cjs/co-card.cjs.entry.js +2 -2
- package/dist/cjs/co-carousel-item.cjs.entry.js +1 -1
- package/dist/cjs/co-carousel.cjs.entry.js +2 -2
- package/dist/cjs/co-checkbox.cjs.entry.js +3 -3
- package/dist/cjs/co-chip_2.cjs.entry.js +11 -11
- package/dist/cjs/co-color-picker.cjs.entry.js +2 -2
- package/dist/cjs/co-column-picker.cjs.entry.js +2 -2
- package/dist/cjs/co-combobox.cjs.entry.js +1 -1
- package/dist/cjs/co-data-table-pagination.cjs.entry.js +4 -4
- package/dist/cjs/co-data-table.cjs.entry.js +127 -8
- package/dist/cjs/co-date-range.cjs.entry.js +1 -1
- package/dist/cjs/co-date-time-picker.cjs.entry.js +2 -2
- package/dist/cjs/co-drive-card.cjs.entry.js +1 -1
- package/dist/cjs/co-drop-zone.cjs.entry.js +1 -1
- package/dist/cjs/co-emoji-picker.cjs.entry.js +2808 -0
- package/dist/cjs/co-empty-state.cjs.entry.js +2 -2
- package/dist/cjs/co-event-calendar.cjs.entry.js +2 -2
- package/dist/cjs/co-event-popover.cjs.entry.js +1 -1
- package/dist/cjs/co-fab.cjs.entry.js +3 -3
- package/dist/cjs/co-file-field.cjs.entry.js +5 -5
- package/dist/cjs/co-file-type-tile.cjs.entry.js +2 -2
- package/dist/cjs/co-helper-text.cjs.entry.js +2 -2
- package/dist/cjs/co-icon-button.cjs.entry.js +2 -2
- package/dist/cjs/co-icon.cjs.entry.js +2 -2
- package/dist/cjs/co-json-field.cjs.entry.js +3 -3
- package/dist/cjs/co-lightbox.cjs.entry.js +4 -4
- package/dist/cjs/co-list-footer.cjs.entry.js +1 -1
- package/dist/cjs/co-list-item.cjs.entry.js +4 -4
- package/dist/cjs/co-media-thumb.cjs.entry.js +2 -2
- package/dist/cjs/co-menu-divider.cjs.entry.js +1 -1
- package/dist/cjs/co-menu.cjs.entry.js +1 -1
- package/dist/cjs/co-modal.cjs.entry.js +9 -3
- package/dist/cjs/co-navbar.cjs.entry.js +2 -2
- package/dist/cjs/co-number-field.cjs.entry.js +2 -2
- package/dist/cjs/co-overlay.cjs.entry.js +1 -1
- package/dist/cjs/co-page-header.cjs.entry.js +1 -1
- package/dist/cjs/co-phone-field.cjs.entry.js +1 -1
- package/dist/cjs/co-popover.cjs.entry.js +49 -3
- package/dist/cjs/co-progress-bar.cjs.entry.js +2 -2
- package/dist/cjs/co-progress-circle.cjs.entry.js +2 -2
- package/dist/cjs/co-provider-logo_2.cjs.entry.js +1 -1
- package/dist/cjs/co-radio.cjs.entry.js +3 -3
- package/dist/cjs/co-rating.cjs.entry.js +3 -3
- package/dist/cjs/co-ref-field.cjs.entry.js +13 -4
- package/dist/cjs/co-rich-text-editor.cjs.entry.js +3 -3
- package/dist/cjs/co-row.cjs.entry.js +2 -2
- package/dist/cjs/co-select.cjs.entry.js +13 -4
- package/dist/cjs/co-separator.cjs.entry.js +1 -1
- package/dist/cjs/co-sidebar-nav.cjs.entry.js +2 -2
- package/dist/cjs/co-sidebar.cjs.entry.js +2 -2
- package/dist/cjs/co-slider.cjs.entry.js +2 -2
- package/dist/cjs/co-switch.cjs.entry.js +3 -3
- package/dist/cjs/co-tab-group.cjs.entry.js +2 -2
- package/dist/cjs/co-tab.cjs.entry.js +2 -2
- package/dist/cjs/co-tags-field.cjs.entry.js +5 -5
- package/dist/cjs/co-textarea.cjs.entry.js +4 -4
- package/dist/cjs/co-toast.cjs.entry.js +2 -2
- package/dist/cjs/co-toggle-button-group.cjs.entry.js +2 -2
- package/dist/cjs/co-toggle-button.cjs.entry.js +2 -2
- package/dist/cjs/co-transfer-list.cjs.entry.js +2 -2
- package/dist/cjs/co-video.cjs.entry.js +2 -2
- package/dist/cjs/cobalt.cjs.js +1 -1
- package/dist/cjs/emojiNames.es-BjpSEJ0c.js +1925 -0
- package/dist/cjs/emojiNames.pt-DWupaZMJ.js +1925 -0
- package/dist/cjs/index-DK-2Lzmf.js +16 -12
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/slotContent-Bm9RcM_Q.js +34 -0
- package/dist/cobalt/cobalt.esm.js +1 -1
- package/dist/cobalt/{p-142506d9.entry.js → p-02ac492f.entry.js} +1 -1
- package/dist/cobalt/p-07904986.entry.js +1 -0
- package/dist/cobalt/{p-24e93fcb.entry.js → p-07d570a6.entry.js} +1 -1
- package/dist/cobalt/p-09799193.entry.js +1 -0
- package/dist/cobalt/{p-e5b5ae89.entry.js → p-0ccb672b.entry.js} +1 -1
- package/dist/cobalt/{p-49bde154.entry.js → p-0e91e5c4.entry.js} +1 -1
- package/dist/cobalt/{p-724b9b54.entry.js → p-17ae943c.entry.js} +1 -1
- package/dist/cobalt/{p-fa5c25d6.entry.js → p-18af9e44.entry.js} +1 -1
- package/dist/cobalt/{p-b9ac1f25.entry.js → p-18d34b01.entry.js} +1 -1
- package/dist/cobalt/{p-d7b00e5f.entry.js → p-1c68bc41.entry.js} +1 -1
- package/dist/cobalt/{p-2a9ba4c8.entry.js → p-2114c036.entry.js} +1 -1
- package/dist/cobalt/{p-37541725.entry.js → p-23a103a0.entry.js} +1 -1
- package/dist/cobalt/{p-7255ab63.entry.js → p-23b3ff3f.entry.js} +1 -1
- package/dist/cobalt/{p-baeb5d55.entry.js → p-2d329ac8.entry.js} +1 -1
- package/dist/cobalt/{p-417ce874.entry.js → p-2d81b292.entry.js} +1 -1
- package/dist/cobalt/{p-b64b0a07.entry.js → p-316c62c0.entry.js} +1 -1
- package/dist/cobalt/{p-c3c2087e.entry.js → p-33ea4a90.entry.js} +1 -1
- package/dist/cobalt/{p-8a93beb0.entry.js → p-342e1da4.entry.js} +1 -1
- package/dist/cobalt/p-3495fda1.entry.js +1 -0
- package/dist/cobalt/{p-5f1b273b.entry.js → p-36197363.entry.js} +1 -1
- package/dist/cobalt/{p-2d0354cc.entry.js → p-3f0eed59.entry.js} +1 -1
- package/dist/cobalt/{p-6d532475.entry.js → p-43bd298d.entry.js} +1 -1
- package/dist/cobalt/{p-81866f71.entry.js → p-4a503187.entry.js} +1 -1
- package/dist/cobalt/{p-c7a809c7.entry.js → p-4b083da4.entry.js} +1 -1
- package/dist/cobalt/{p-f1284fcd.entry.js → p-4c7e3984.entry.js} +1 -1
- package/dist/cobalt/p-4f754c9a.entry.js +1 -0
- package/dist/cobalt/p-54ae807d.entry.js +1 -0
- package/dist/cobalt/{p-d21da71a.entry.js → p-55566b37.entry.js} +1 -1
- package/dist/cobalt/p-682b3313.entry.js +1 -0
- package/dist/cobalt/{p-a5d84c7a.entry.js → p-7457aa89.entry.js} +1 -1
- package/dist/cobalt/{p-8b7a4f6c.entry.js → p-77719335.entry.js} +1 -1
- package/dist/cobalt/{p-94a8a119.entry.js → p-7c5e846a.entry.js} +1 -1
- package/dist/cobalt/{p-9c2ce487.entry.js → p-7c88163e.entry.js} +1 -1
- package/dist/cobalt/{p-12a0ae24.entry.js → p-7cf4b4ae.entry.js} +1 -1
- package/dist/cobalt/{p-3ac316e0.entry.js → p-7e53e9c8.entry.js} +1 -1
- package/dist/cobalt/{p-e99832a9.entry.js → p-8183f56f.entry.js} +1 -1
- package/dist/cobalt/p-8345b25f.entry.js +1 -0
- package/dist/cobalt/{p-b004c3bb.entry.js → p-88a0659f.entry.js} +1 -1
- package/dist/cobalt/{p-87fc5aed.entry.js → p-89e38c5e.entry.js} +1 -1
- package/dist/cobalt/{p-a074f2ba.entry.js → p-8eb485c8.entry.js} +1 -1
- package/dist/cobalt/{p-c31f5c1b.entry.js → p-8f38e24d.entry.js} +1 -1
- package/dist/cobalt/{p-f52f61d4.entry.js → p-8f600512.entry.js} +1 -1
- package/dist/cobalt/{p-09fe6ece.entry.js → p-95efe661.entry.js} +1 -1
- package/dist/cobalt/{p-c42c505c.entry.js → p-983af614.entry.js} +1 -1
- package/dist/cobalt/p-B6oiFdUY.js +1 -0
- package/dist/cobalt/p-CBX_oabB.js +1 -0
- package/dist/cobalt/p-a02db338.entry.js +1 -0
- package/dist/cobalt/{p-19f5d480.entry.js → p-a51d8775.entry.js} +1 -1
- package/dist/cobalt/{p-d3c765e3.entry.js → p-a6357340.entry.js} +1 -1
- package/dist/cobalt/p-a6b5cadd.entry.js +1 -0
- package/dist/cobalt/{p-5d7c26f2.entry.js → p-a8c64cc3.entry.js} +1 -1
- package/dist/cobalt/{p-19706923.entry.js → p-a9096b5c.entry.js} +1 -1
- package/dist/cobalt/{p-b800e107.entry.js → p-a9b29cc2.entry.js} +1 -1
- package/dist/cobalt/p-aafb9d11.entry.js +1 -0
- package/dist/cobalt/{p-cc72557d.entry.js → p-ab45d9bd.entry.js} +1 -1
- package/dist/cobalt/{p-43b1f8fb.entry.js → p-ac466658.entry.js} +1 -1
- package/dist/cobalt/{p-3ecc29fa.entry.js → p-ac91259e.entry.js} +1 -1
- package/dist/cobalt/{p-a45e2c00.entry.js → p-b0319a2d.entry.js} +1 -1
- package/dist/cobalt/{p-8206c7c0.entry.js → p-b8581787.entry.js} +1 -1
- package/dist/cobalt/{p-debe0d79.entry.js → p-bfc2a849.entry.js} +1 -1
- package/dist/cobalt/{p-4e2379e4.entry.js → p-c1e7fb32.entry.js} +1 -1
- package/dist/cobalt/{p-21832273.entry.js → p-c5684c79.entry.js} +1 -1
- package/dist/cobalt/p-c6b9b9d6.entry.js +1 -0
- package/dist/cobalt/{p-ed2ca588.entry.js → p-ce35c898.entry.js} +1 -1
- package/dist/cobalt/{p-e5296961.entry.js → p-d15d3a97.entry.js} +1 -1
- package/dist/cobalt/p-d40a465f.entry.js +1 -0
- package/dist/cobalt/{p-d85a751d.entry.js → p-d4debd6f.entry.js} +1 -1
- package/dist/cobalt/{p-7ec85887.entry.js → p-d629fb4e.entry.js} +1 -1
- package/dist/cobalt/p-da18b5f4.entry.js +1 -0
- package/dist/cobalt/{p-360714ae.entry.js → p-dca4cd5f.entry.js} +1 -1
- package/dist/cobalt/{p-a530bec2.entry.js → p-dea43204.entry.js} +1 -1
- package/dist/cobalt/{p-f4cebc1f.entry.js → p-dfcf667d.entry.js} +1 -1
- package/dist/cobalt/{p-9fe9e2fe.entry.js → p-e5495539.entry.js} +1 -1
- package/dist/cobalt/{p-39bce45f.entry.js → p-e8878cf9.entry.js} +1 -1
- package/dist/cobalt/{p-39007b6c.entry.js → p-ef5e1167.entry.js} +1 -1
- package/dist/cobalt/{p-b1ef5107.entry.js → p-fabe5fb2.entry.js} +1 -1
- package/dist/cobalt/{p-76dff399.entry.js → p-fb3a095b.entry.js} +1 -1
- package/dist/cobalt/p-reaWaY4g.js +1 -0
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/co-accordion/co-accordion.js +2 -2
- package/dist/collection/components/co-action-bar/co-action-bar.js +2 -2
- package/dist/collection/components/co-app-shell/co-app-shell.js +2 -2
- package/dist/collection/components/co-audio-player/co-audio-player.js +3 -3
- package/dist/collection/components/co-autocomplete/co-autocomplete.css +1 -1
- package/dist/collection/components/co-autocomplete/co-autocomplete.js +1 -1
- package/dist/collection/components/co-avatar-group/co-avatar-group.js +1 -1
- package/dist/collection/components/co-badge/co-badge.js +1 -1
- package/dist/collection/components/co-bottom-sheet/co-bottom-sheet.js +10 -11
- package/dist/collection/components/co-breadcrumb/co-breadcrumb.js +1 -1
- package/dist/collection/components/co-breadcrumb-item/co-breadcrumb-item.js +2 -2
- package/dist/collection/components/co-button/co-button.js +2 -2
- package/dist/collection/components/co-button-group/co-button-group.js +2 -2
- package/dist/collection/components/co-calendar/co-calendar.js +1 -1
- package/dist/collection/components/co-calendar-month/co-calendar-month.js +1 -1
- package/dist/collection/components/co-calendar-timegrid/co-calendar-timegrid.js +2 -2
- package/dist/collection/components/co-card/co-card.js +2 -2
- package/dist/collection/components/co-carousel/co-carousel.js +2 -2
- package/dist/collection/components/co-carousel-item/co-carousel-item.js +1 -1
- package/dist/collection/components/co-checkbox/co-checkbox.js +3 -3
- package/dist/collection/components/co-checkbox-group/co-checkbox-group.js +1 -1
- package/dist/collection/components/co-chip/co-chip.js +2 -2
- package/dist/collection/components/co-color-picker/co-color-picker.js +2 -2
- package/dist/collection/components/co-column-picker/co-column-picker.js +2 -2
- package/dist/collection/components/co-combobox/co-combobox.css +3 -1
- package/dist/collection/components/co-combobox/co-combobox.js +1 -1
- package/dist/collection/components/co-command-search/co-command-search.js +1 -1
- package/dist/collection/components/co-data-table/co-data-table.css +33 -0
- package/dist/collection/components/co-data-table/co-data-table.js +90 -8
- package/dist/collection/components/co-data-table-pagination/co-data-table-pagination.js +4 -4
- package/dist/collection/components/co-date-field/co-date-field.js +4 -4
- package/dist/collection/components/co-date-range/co-date-range.js +1 -1
- package/dist/collection/components/co-date-range-picker/co-date-range-picker.js +2 -2
- package/dist/collection/components/co-date-time-picker/co-date-time-picker.js +2 -2
- package/dist/collection/components/co-drawer/co-drawer.css +5 -2
- package/dist/collection/components/co-drawer/co-drawer.js +43 -1
- package/dist/collection/components/co-drive-card/co-drive-card.js +1 -1
- package/dist/collection/components/co-drop-zone/co-drop-zone.js +1 -1
- package/dist/collection/components/co-emoji-picker/co-emoji-picker.css +290 -0
- package/dist/collection/components/co-emoji-picker/co-emoji-picker.js +682 -0
- package/dist/collection/components/co-emoji-picker/emojiData.js +1953 -0
- package/dist/collection/components/co-emoji-picker/emojiNames.es.js +1922 -0
- package/dist/collection/components/co-emoji-picker/emojiNames.pt.js +1922 -0
- package/dist/collection/components/co-emoji-picker/emojiPickerLogic.js +375 -0
- package/dist/collection/components/co-empty-state/co-empty-state.js +2 -2
- package/dist/collection/components/co-event-calendar/co-event-calendar.js +2 -2
- package/dist/collection/components/co-event-popover/co-event-popover.js +1 -1
- package/dist/collection/components/co-fab/co-fab.css +8 -5
- package/dist/collection/components/co-fab/co-fab.js +2 -2
- package/dist/collection/components/co-file-field/co-file-field.js +5 -5
- package/dist/collection/components/co-file-type-tile/co-file-type-tile.js +2 -2
- package/dist/collection/components/co-helper-text/co-helper-text.js +2 -2
- package/dist/collection/components/co-icon/co-icon.js +2 -2
- package/dist/collection/components/co-icon-button/co-icon-button.css +25 -0
- package/dist/collection/components/co-icon-button/co-icon-button.js +1 -1
- package/dist/collection/components/co-json-field/co-json-field.js +3 -3
- package/dist/collection/components/co-lightbox/co-lightbox.js +4 -4
- package/dist/collection/components/co-list-footer/co-list-footer.js +1 -1
- package/dist/collection/components/co-list-item/co-list-item.js +4 -4
- package/dist/collection/components/co-media-thumb/co-media-thumb.js +2 -2
- package/dist/collection/components/co-menu/co-menu.js +1 -1
- package/dist/collection/components/co-menu-divider/co-menu-divider.js +1 -1
- package/dist/collection/components/co-modal/co-modal.css +3 -1
- package/dist/collection/components/co-modal/co-modal.js +13 -2
- package/dist/collection/components/co-navbar/co-navbar.js +2 -2
- package/dist/collection/components/co-number-field/co-number-field.js +2 -2
- package/dist/collection/components/co-option-list/co-option-list.css +11 -9
- package/dist/collection/components/co-option-list/co-option-list.js +8 -8
- package/dist/collection/components/co-overlay/co-overlay.js +1 -1
- package/dist/collection/components/co-page-header/co-page-header.js +1 -1
- package/dist/collection/components/co-phone-field/co-phone-field.js +1 -1
- package/dist/collection/components/co-popover/co-popover.js +27 -5
- package/dist/collection/components/co-progress-bar/co-progress-bar.js +2 -2
- package/dist/collection/components/co-progress-circle/co-progress-circle.js +2 -2
- package/dist/collection/components/co-radio/co-radio.js +3 -3
- package/dist/collection/components/co-radio-group/co-radio-group.js +1 -1
- package/dist/collection/components/co-rating/co-rating.js +3 -3
- package/dist/collection/components/co-ref-field/co-ref-field.css +15 -0
- package/dist/collection/components/co-ref-field/co-ref-field.js +72 -4
- package/dist/collection/components/co-rich-text-editor/co-rich-text-editor.js +3 -3
- package/dist/collection/components/co-row/co-row.js +2 -2
- package/dist/collection/components/co-segmented-bar/co-segmented-bar.js +1 -1
- package/dist/collection/components/co-select/co-select.js +68 -5
- package/dist/collection/components/co-separator/co-separator.js +1 -1
- package/dist/collection/components/co-sidebar/co-sidebar.js +2 -2
- package/dist/collection/components/co-sidebar-nav/co-sidebar-nav.js +3 -3
- package/dist/collection/components/co-skeleton/co-skeleton.js +1 -1
- package/dist/collection/components/co-slider/co-slider.js +2 -2
- package/dist/collection/components/co-switch/co-switch.js +3 -3
- package/dist/collection/components/co-tab/co-tab.js +2 -2
- package/dist/collection/components/co-tab-group/co-tab-group.js +2 -2
- package/dist/collection/components/co-tags-field/co-tags-field.js +5 -5
- package/dist/collection/components/co-textarea/co-textarea.js +4 -4
- package/dist/collection/components/co-toast/co-toast.js +4 -4
- package/dist/collection/components/co-toggle-button/co-toggle-button.js +2 -2
- package/dist/collection/components/co-toggle-button-group/co-toggle-button-group.js +2 -2
- package/dist/collection/components/co-tooltip/co-tooltip.js +2 -2
- package/dist/collection/components/co-transfer-list/co-transfer-list.js +3 -3
- package/dist/collection/components/co-video/co-video.js +2 -2
- package/dist/collection/utils/columnResize.js +37 -0
- package/dist/collection/utils/emojiI18n.js +92 -0
- package/dist/collection/utils/popover-stack.js +28 -0
- package/dist/collection/utils/slotContent.js +30 -0
- package/dist/components/co-accordion.js +1 -1
- package/dist/components/co-action-bar.js +1 -1
- package/dist/components/co-app-shell.js +1 -1
- package/dist/components/co-audio-player.js +1 -1
- package/dist/components/co-autocomplete.js +1 -1
- package/dist/components/co-avatar-group.js +1 -1
- package/dist/components/co-avatar.js +1 -1
- package/dist/components/co-badge.js +1 -1
- package/dist/components/co-bottom-sheet.js +1 -1
- package/dist/components/co-breadcrumb-item.js +1 -1
- package/dist/components/co-breadcrumb.js +1 -1
- package/dist/components/co-button-group.js +1 -1
- package/dist/components/co-button.js +1 -1
- package/dist/components/co-calendar-month.js +1 -1
- package/dist/components/co-calendar-timegrid.js +1 -1
- package/dist/components/co-calendar.js +1 -1
- package/dist/components/co-card.js +1 -1
- package/dist/components/co-carousel-item.js +1 -1
- package/dist/components/co-carousel.js +1 -1
- package/dist/components/co-checkbox-group.js +1 -1
- package/dist/components/co-checkbox.js +1 -1
- package/dist/components/co-chip.js +1 -1
- package/dist/components/co-color-picker.js +1 -1
- package/dist/components/co-column-picker.js +1 -1
- package/dist/components/co-combobox.js +1 -1
- package/dist/components/co-command-search.js +1 -1
- package/dist/components/co-data-table-pagination.js +1 -1
- package/dist/components/co-data-table.js +1 -1
- package/dist/components/co-date-field.js +1 -1
- package/dist/components/co-date-picker.js +1 -1
- package/dist/components/co-date-range-picker.js +1 -1
- package/dist/components/co-date-range.js +1 -1
- package/dist/components/co-date-time-picker.js +1 -1
- package/dist/components/co-drawer.js +1 -1
- package/dist/components/co-drive-card.js +1 -1
- package/dist/components/co-drop-zone.js +1 -1
- package/dist/components/co-emoji-picker.d.ts +11 -0
- package/dist/components/co-emoji-picker.js +1 -0
- package/dist/components/co-empty-state.js +1 -1
- package/dist/components/co-event-calendar.js +1 -1
- package/dist/components/co-event-popover.js +1 -1
- package/dist/components/co-fab.js +1 -1
- package/dist/components/co-file-field.js +1 -1
- package/dist/components/co-file-type-tile.js +1 -1
- package/dist/components/co-helper-text.js +1 -1
- package/dist/components/co-icon-button.js +1 -1
- package/dist/components/co-icon.js +1 -1
- package/dist/components/co-input.js +1 -1
- package/dist/components/co-json-field.js +1 -1
- package/dist/components/co-lightbox.js +1 -1
- package/dist/components/co-list-footer.js +1 -1
- package/dist/components/co-list-item.js +1 -1
- package/dist/components/co-media-thumb.js +1 -1
- package/dist/components/co-menu-divider.js +1 -1
- package/dist/components/co-menu-item.js +1 -1
- package/dist/components/co-menu.js +1 -1
- package/dist/components/co-modal.js +1 -1
- package/dist/components/co-navbar.js +1 -1
- package/dist/components/co-number-field.js +1 -1
- package/dist/components/co-option-list.js +1 -1
- package/dist/components/co-overlay.js +1 -1
- package/dist/components/co-page-header.js +1 -1
- package/dist/components/co-phone-field.js +1 -1
- package/dist/components/co-popover.js +1 -1
- package/dist/components/co-progress-bar.js +1 -1
- package/dist/components/co-progress-circle.js +1 -1
- package/dist/components/co-radio-group.js +1 -1
- package/dist/components/co-radio.js +1 -1
- package/dist/components/co-rating.js +1 -1
- package/dist/components/co-ref-field.js +1 -1
- package/dist/components/co-rich-text-editor.js +1 -1
- package/dist/components/co-rich-text-toolbar.js +1 -1
- package/dist/components/co-row.js +1 -1
- package/dist/components/co-select.js +1 -1
- package/dist/components/co-separator.js +1 -1
- package/dist/components/co-sidebar-nav.js +1 -1
- package/dist/components/co-sidebar.js +1 -1
- package/dist/components/co-skeleton.js +1 -1
- package/dist/components/co-slider.js +1 -1
- package/dist/components/co-switch.js +1 -1
- package/dist/components/co-tab-group.js +1 -1
- package/dist/components/co-tab.js +1 -1
- package/dist/components/co-tags-field.js +1 -1
- package/dist/components/co-textarea.js +1 -1
- package/dist/components/co-toast.js +1 -1
- package/dist/components/co-toggle-button-group.js +1 -1
- package/dist/components/co-toggle-button.js +1 -1
- package/dist/components/co-tooltip.js +1 -1
- package/dist/components/co-transfer-list.js +1 -1
- package/dist/components/co-video.js +1 -1
- package/dist/components/p-AvSaw4Ua.js +1 -0
- package/dist/components/p-B3TkpLNh.js +1 -0
- package/dist/components/p-B6oiFdUY.js +1 -0
- package/dist/components/{p-CmxZEGYq.js → p-B7hvddnu.js} +1 -1
- package/dist/components/{p-Ce0ZJcks.js → p-BGD3oQ73.js} +1 -1
- package/dist/components/{p-CJNo2JDc.js → p-BT5tSgZa.js} +1 -1
- package/dist/components/{p-CYv2ig6I.js → p-BsQQ7Mki.js} +1 -1
- package/dist/components/p-CBX_oabB.js +1 -0
- package/dist/components/{p-Cv5yuGLz.js → p-CXLX8DpD.js} +1 -1
- package/dist/components/{p-DFT1qsVu.js → p-CklsvHeL.js} +1 -1
- package/dist/components/{p-CKKBJaNB.js → p-CyMaOb1j.js} +1 -1
- package/dist/components/{p-xvWmYN3W.js → p-D5QJpmqf.js} +1 -1
- package/dist/components/{p-BlvsTlsS.js → p-D6OUW6oW.js} +1 -1
- package/dist/components/p-DP0bbhfN.js +1 -0
- package/dist/components/{p-BUE9mBqk.js → p-DTvb412h.js} +1 -1
- package/dist/components/{p-Bsll5Ofy.js → p-DkmKOF60.js} +1 -1
- package/dist/components/{p-re2gJwnQ.js → p-DolCkNsL.js} +1 -1
- package/dist/components/{p-CkQqqKRp.js → p-KWTokD0C.js} +1 -1
- package/dist/components/{p-BCnjq3jN.js → p-Q6caHt79.js} +1 -1
- package/dist/components/{p-2zy1K6zg.js → p-WWlZiln1.js} +1 -1
- package/dist/components/{p-DAaKsGqj.js → p-_131DL6m.js} +1 -1
- package/dist/components/{p-ushHimOL.js → p-gI62K3Be.js} +1 -1
- package/dist/components/{p-_YYd42XM.js → p-mom5kiBa.js} +1 -1
- package/dist/components/p-nwy6X1QT.js +1 -0
- package/dist/components/p-reaWaY4g.js +1 -0
- package/dist/esm/co-accordion.entry.js +2 -2
- package/dist/esm/co-action-bar.entry.js +2 -2
- package/dist/esm/co-app-shell.entry.js +2 -2
- package/dist/esm/co-audio-player.entry.js +3 -3
- package/dist/esm/co-autocomplete.entry.js +1 -1
- package/dist/esm/co-avatar_2.entry.js +2 -2
- package/dist/esm/co-badge.entry.js +1 -1
- package/dist/esm/co-bottom-sheet.entry.js +10 -11
- package/dist/esm/co-breadcrumb-item.entry.js +2 -2
- package/dist/esm/co-breadcrumb.entry.js +1 -1
- package/dist/esm/co-button-group.entry.js +2 -2
- package/dist/esm/co-button.entry.js +2 -2
- package/dist/esm/co-calendar-month_2.entry.js +3 -3
- package/dist/esm/co-calendar_3.entry.js +42 -7
- package/dist/esm/co-card.entry.js +2 -2
- package/dist/esm/co-carousel-item.entry.js +1 -1
- package/dist/esm/co-carousel.entry.js +2 -2
- package/dist/esm/co-checkbox.entry.js +3 -3
- package/dist/esm/co-chip_2.entry.js +11 -11
- package/dist/esm/co-color-picker.entry.js +2 -2
- package/dist/esm/co-column-picker.entry.js +2 -2
- package/dist/esm/co-combobox.entry.js +1 -1
- package/dist/esm/co-data-table-pagination.entry.js +4 -4
- package/dist/esm/co-data-table.entry.js +127 -8
- package/dist/esm/co-date-range.entry.js +1 -1
- package/dist/esm/co-date-time-picker.entry.js +2 -2
- package/dist/esm/co-drive-card.entry.js +1 -1
- package/dist/esm/co-drop-zone.entry.js +1 -1
- package/dist/esm/co-emoji-picker.entry.js +2806 -0
- package/dist/esm/co-empty-state.entry.js +2 -2
- package/dist/esm/co-event-calendar.entry.js +2 -2
- package/dist/esm/co-event-popover.entry.js +1 -1
- package/dist/esm/co-fab.entry.js +3 -3
- package/dist/esm/co-file-field.entry.js +5 -5
- package/dist/esm/co-file-type-tile.entry.js +2 -2
- package/dist/esm/co-helper-text.entry.js +2 -2
- package/dist/esm/co-icon-button.entry.js +2 -2
- package/dist/esm/co-icon.entry.js +2 -2
- package/dist/esm/co-json-field.entry.js +3 -3
- package/dist/esm/co-lightbox.entry.js +4 -4
- package/dist/esm/co-list-footer.entry.js +1 -1
- package/dist/esm/co-list-item.entry.js +4 -4
- package/dist/esm/co-media-thumb.entry.js +2 -2
- package/dist/esm/co-menu-divider.entry.js +1 -1
- package/dist/esm/co-menu.entry.js +1 -1
- package/dist/esm/co-modal.entry.js +9 -3
- package/dist/esm/co-navbar.entry.js +2 -2
- package/dist/esm/co-number-field.entry.js +2 -2
- package/dist/esm/co-overlay.entry.js +1 -1
- package/dist/esm/co-page-header.entry.js +1 -1
- package/dist/esm/co-phone-field.entry.js +1 -1
- package/dist/esm/co-popover.entry.js +49 -3
- package/dist/esm/co-progress-bar.entry.js +2 -2
- package/dist/esm/co-progress-circle.entry.js +2 -2
- package/dist/esm/co-provider-logo_2.entry.js +1 -1
- package/dist/esm/co-radio.entry.js +3 -3
- package/dist/esm/co-rating.entry.js +3 -3
- package/dist/esm/co-ref-field.entry.js +13 -4
- package/dist/esm/co-rich-text-editor.entry.js +3 -3
- package/dist/esm/co-row.entry.js +2 -2
- package/dist/esm/co-select.entry.js +13 -4
- package/dist/esm/co-separator.entry.js +1 -1
- package/dist/esm/co-sidebar-nav.entry.js +2 -2
- package/dist/esm/co-sidebar.entry.js +2 -2
- package/dist/esm/co-slider.entry.js +2 -2
- package/dist/esm/co-switch.entry.js +3 -3
- package/dist/esm/co-tab-group.entry.js +2 -2
- package/dist/esm/co-tab.entry.js +2 -2
- package/dist/esm/co-tags-field.entry.js +5 -5
- package/dist/esm/co-textarea.entry.js +4 -4
- package/dist/esm/co-toast.entry.js +2 -2
- package/dist/esm/co-toggle-button-group.entry.js +2 -2
- package/dist/esm/co-toggle-button.entry.js +2 -2
- package/dist/esm/co-transfer-list.entry.js +2 -2
- package/dist/esm/co-video.entry.js +2 -2
- package/dist/esm/cobalt.js +1 -1
- package/dist/esm/emojiNames.es-reaWaY4g.js +1923 -0
- package/dist/esm/emojiNames.pt-B6oiFdUY.js +1923 -0
- package/dist/esm/index-CrtiywTB.js +16 -12
- package/dist/esm/loader.js +1 -1
- package/dist/esm/slotContent-CBX_oabB.js +32 -0
- package/dist/types/components/co-bottom-sheet/co-bottom-sheet.d.ts +0 -1
- package/dist/types/components/co-data-table/co-data-table.d.ts +5 -0
- package/dist/types/components/co-drawer/co-drawer.d.ts +23 -0
- package/dist/types/components/co-emoji-picker/co-emoji-picker.d.ts +145 -0
- package/dist/types/components/co-emoji-picker/emojiData.d.ts +24 -0
- package/dist/types/components/co-emoji-picker/emojiNames.es.d.ts +12 -0
- package/dist/types/components/co-emoji-picker/emojiNames.pt.d.ts +12 -0
- package/dist/types/components/co-emoji-picker/emojiPickerLogic.d.ts +149 -0
- package/dist/types/components/co-modal/co-modal.d.ts +2 -0
- package/dist/types/components/co-popover/co-popover.d.ts +8 -1
- package/dist/types/components/co-ref-field/co-ref-field.d.ts +17 -0
- package/dist/types/components/co-select/co-select.d.ts +7 -0
- package/dist/types/components.d.ts +255 -2
- package/dist/types/utils/columnResize.d.ts +42 -0
- package/dist/types/utils/emojiI18n.d.ts +22 -0
- package/dist/types/utils/popover-stack.d.ts +5 -0
- package/dist/types/utils/slotContent.d.ts +19 -0
- package/package.json +4 -4
- package/dist/cobalt/p-212ed2ba.entry.js +0 -1
- package/dist/cobalt/p-2aeb1471.entry.js +0 -1
- package/dist/cobalt/p-30ec230e.entry.js +0 -1
- package/dist/cobalt/p-5ddebd10.entry.js +0 -1
- package/dist/cobalt/p-5f0f5d4b.entry.js +0 -1
- package/dist/cobalt/p-7521ec0c.entry.js +0 -1
- package/dist/cobalt/p-77593319.entry.js +0 -1
- package/dist/cobalt/p-7a2dab23.entry.js +0 -1
- package/dist/cobalt/p-e054cb52.entry.js +0 -1
- package/dist/cobalt/p-e612b43c.entry.js +0 -1
- package/dist/cobalt/p-e7e34852.entry.js +0 -1
- package/dist/cobalt/p-f1731fe9.entry.js +0 -1
- package/dist/components/p-Bh2__nEw.js +0 -1
- package/dist/components/p-BiefJDu3.js +0 -1
- package/dist/components/p-CL4dicvk.js +0 -1
- 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 };
|