Выбор эмодзи
Emoji picker — панель, где находят и вставляют эмодзи. Человек ищет или листает по категориям, выбирает оттенок кожи и нажимает на эмодзи; вставляете его вы.
<tk-emoji-picker></tk-emoji-picker>
Анатомия
| Часть | Что это |
|---|---|
tk-emoji-picker |
сама панель; приподнята, со скруглёнными углами |
part search |
поле поиска с кнопкой оттенка кожи в конце |
part nav |
строка вкладок категорий |
part grid |
прокручиваемая сетка эмодзи или результаты поиска |
part preview |
необязательная строка внизу с эмодзи в фокусе и его названием |
Сначала идут недавние эмодзи, затем категории: Smileys & emotion, People & body, Animals & nature, Food & drink, Travel & places, Activities, Objects, Symbols, Flags. У края сетка растворяется, если дальше есть что прокручивать.
Настройки
<tk-emoji-picker preview columns="6" label="Choose a reaction"></tk-emoji-picker>
preview: показывает эмодзи в фокусе или под курсором крупно, с названием.columns: сколько эмодзи в строке, по умолчанию 8.label: имя сетки, по умолчанию «Choose an emoji».flags: категория флагов, по умолчанию включена. В Windows флаги не отображаются; чтобы убрать их, задайте в скриптеpicker.flags = false. Атрибутом её не выключить.
Поиск и просмотр
- Ввод текста оставляет подходящие эмодзи. Если ничего не нашлось, панель пишет «No emoji
found. Try another word.»
Escили пустое поле возвращают к просмотру. - Вкладка категории прокручивает к ней; при прокрутке вкладки следуют за ней.
- При наведении поле поиска не меняется. В фокусе рамка окрашивается в цвет фокуса и утолщается внутрь.
Оттенок кожи
Кнопка в конце поля поиска открывает шесть оттенков, от Default до Dark. Оттенок
применяется ко всем эмодзи, у которых он есть. Это атрибут skin-tone, от 0 до 5;
смена оттенка человеком вызывает tk-skin-tone-change.
Вставка и недавние
Слушайте tk-emoji-select и вставляйте detail.emoji — в нём уже есть оттенок кожи.
Сама панель ничего не вставляет.
<tk-emoji-picker id="picker"></tk-emoji-picker>
<script type="module">
const picker = document.getElementById('picker');
picker.addEventListener('tk-emoji-select', (event) => {
document.getElementById('message').value += event.detail.emoji;
});
</script>Для строки недавних либо задайте persist-recents, и панель сама сохранит список и
оттенок в локальном хранилище, либо ведите список сами и передавайте его в recent:
<tk-emoji-picker id="reactions"></tk-emoji-picker>
<script type="module">
const picker = document.getElementById('reactions');
let recent = JSON.parse(localStorage.getItem('recent') ?? '[]');
picker.recent = recent;
picker.addEventListener('tk-emoji-select', (event) => {
recent = [event.detail.emoji, ...recent.filter((e) => e !== event.detail.emoji)].slice(0, 24);
localStorage.setItem('recent', JSON.stringify(recent));
picker.recent = recent;
});
</script>Без того и другого строка пишет «No recent emoji yet».
Во всплывающей панели
Чтобы открывать эмодзи по кнопке, положите панель в
<tk-popover label="Emoji" style="--tk-popover-padding: 0;"> <tk-icon-button slot="trigger" label="Add emoji"><span aria-hidden="true">😀</span></tk-icon-button> <tk-emoji-picker></tk-emoji-picker> </tk-popover>
tk-emoji-select доходит до вашего обработчика снаружи popover. Открывайте по клику,
не по наведению.
Системные эмодзи
Эмодзи рисует системный шрифт, поэтому они выглядят как на остальном устройстве и не требуют картинок.
- В Windows флаги показываются двумя буквами.
- Составные эмодзи вроде 👨👩👧 в старых системах могут распасться на отдельные, а совсем новые — показаться пустым квадратом.
- Цвет эмодзи токенами не меняется.
- Данные эмодзи загружаются при первом появлении панели, около 85 kB в gzip, и общие для всех панелей на странице. Пока они грузятся, сетка пишет «Loading emoji…».
Когда использовать
- Emoji picker — везде, где вставляют эмодзи: поле сообщения, «+» в строке реакций, иконка страницы или статуса.
- Для короткого списка вариантов из вашего приложения берите
Select илиCombobox . - Для действий —
Menu . - Это не поле формы, не выбор GIF или стикеров и не счётчик реакций. Плашки реакций под сообщением делайте сами.
Можно / нельзя
| ✅ Можно | ❌ Нельзя |
|---|---|
Вставлять detail.emoji по tk-emoji-select |
Считать панель полем формы |
| Открывать плавающую панель по клику, в popover | Открывать её по наведению |
Задать persist-recents или вести recent самим |
Ждать недавних без одного из двух |
| Скрывать флаги, если аудитория в основном на Windows | Рассчитывать, что флаги видны везде |
| Оставить эмодзи системному шрифту | Подменять их картинками |
Связанные
Popover : открывает панель по кнопке.Icon button : кнопка, которая её открывает.Combobox : поиск с фильтруемым списком.Menu : для действий, а не содержимого.
API
Атрибуты
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
skin-tone |
0–5 |
0 |
выбранный оттенок, от Default до Dark |
persist-recents |
boolean | false |
панель хранит недавние и оттенок в локальном хранилище |
flags |
boolean | true |
показывает категорию флагов; чтобы скрыть, задайте свойству false |
preview |
boolean | false |
показывает строку с превью |
columns |
число | 8 |
эмодзи в строке |
label |
строка | Choose an emoji |
доступное имя сетки |
Свойства
| Свойство | Тип | Что делает |
|---|---|---|
recent |
string[] |
ваши недавние эмодзи, идут первыми; при persist-recents не учитывается |
События
| Событие | Detail | Когда |
|---|---|---|
tk-emoji-select |
{ emoji, label, hexcode, group, skinTone } |
выбран эмодзи; вставляйте emoji |
tk-skin-tone-change |
{ skinTone } |
человек сменил оттенок |
У панели нет значения, change она не вызывает.
CSS
::part(search),::part(nav),::part(grid),::part(preview): части из разделаАнатомия .--tk-emoji-cell-size: размер ячейки эмодзи, по умолчанию2.25rem.--tk-emoji-size: размер эмодзи, по умолчанию1.375rem.--tk-emoji-picker-height: высота прокручиваемой сетки, по умолчанию18rem.
Токены
| Часть | Токены |
|---|---|
| панель | surface/raised + shadow-2, radius-16 |
| поле поиска | surface/default + border/subtle, radius-8; в фокусе border/accent/focus |
| иконка поиска | icon/secondary |
| вкладка категории | state/hover при наведении; у открытой подчёркивание border/selected |
| ячейка эмодзи | radius-4; подсвеченная state/hover, нажатая state/press |
| кольцо фокуса | border/accent/focus |
| заголовок раздела, пустой и загрузочный текст | text/secondary |
| разделители | border/subtle |
В высококонтрастной теме у панели вместо тени рамка 1px border/default. Значения для
каждой темы:
Доступность
Встроено:
- Просмотр устроен как сетка: одна остановка Tab, стрелки двигают по эмодзи, у каждого эмодзи есть имя, например «grinning face».
- Во время поиска результаты становятся списком, по которому ходят
UpиDown, а число результатов объявляется. - У вкладок категорий, оттенков и поля поиска есть имена.
- Появившись, панель не забирает фокус.
- Ничего не анимируется.
Ваша часть:
- Плавающую панель открывайте по клику, по рецепту с popover выше.
- Если панель фильтрует большой экран, объявляйте результаты этого экрана сами.
| Клавиша | В сетке | В поле поиска |
|---|---|---|
| стрелки | двигают по эмодзи, через категории; Up из верхней строки ведёт в поиск |
Down ведёт в сетку; во время поиска Down / Up двигают по результатам |
Home / End |
первый / последний эмодзи в строке | — |
Page Down / Page Up |
следующая / предыдущая категория | — |
Enter / Space |
выбирает эмодзи | Enter выбирает подсвеченный результат |
Esc |
— | очищает поиск; в пустом поле закрывает popover вокруг |
Tab |
уводит из сетки | переходит к следующему элементу |