Files
IdP/apps/frontend/lib/emoji-catalog.ts
2026-06-25 23:48:57 +03:00

168 lines
13 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export type EmojiCategoryId = 'smileys' | 'gestures' | 'hearts' | 'animals' | 'food' | 'travel' | 'objects' | 'symbols';
export interface EmojiDefinition {
id: string;
category: EmojiCategoryId;
keywords: string[];
label: string;
}
export const EMOJI_CATEGORIES: Array<{ id: EmojiCategoryId; label: string; icon: string }> = [
{ id: 'smileys', label: 'Смайлы', icon: 'e-grinning' },
{ id: 'gestures', label: 'Жесты', icon: 'e-thumbs-up' },
{ id: 'hearts', label: 'Сердца', icon: 'e-red-heart' },
{ id: 'animals', label: 'Животные', icon: 'e-dog' },
{ id: 'food', label: 'Еда', icon: 'e-pizza' },
{ id: 'travel', label: 'Путешествия', icon: 'e-car' },
{ id: 'objects', label: 'Предметы', icon: 'e-bulb' },
{ id: 'symbols', label: 'Символы', icon: 'e-check' }
];
export const EMOJI_DEFINITIONS: EmojiDefinition[] = [
{ id: 'e-grinning', category: 'smileys', label: 'Улыбка', keywords: ['радость', 'смех', 'улыбка'] },
{ id: 'e-smile', category: 'smileys', label: 'Улыбка глаза', keywords: ['улыбка', 'радость'] },
{ id: 'e-laugh', category: 'smileys', label: 'Смех', keywords: ['смех', 'lol', 'ха'] },
{ id: 'e-rofl', category: 'smileys', label: 'Катаюсь', keywords: ['ржу', 'смех'] },
{ id: 'e-wink', category: 'smileys', label: 'Подмигивание', keywords: ['подмигнуть'] },
{ id: 'e-blush', category: 'smileys', label: 'Смущение', keywords: ['румянец', 'мило'] },
{ id: 'e-innocent', category: 'smileys', label: 'Невинность', keywords: ['ангел', 'невинный'] },
{ id: 'e-slight-smile', category: 'smileys', label: 'Лёгкая улыбка', keywords: ['улыбка'] },
{ id: 'e-thinking', category: 'smileys', label: 'Думаю', keywords: ['думаю', 'хм'] },
{ id: 'e-neutral', category: 'smileys', label: 'Нейтрально', keywords: ['нейтрально'] },
{ id: 'e-expressionless', category: 'smileys', label: 'Без эмоций', keywords: ['пусто'] },
{ id: 'e-sleeping', category: 'smileys', label: 'Сплю', keywords: ['сон', 'спать', 'zzz'] },
{ id: 'e-tired', category: 'smileys', label: 'Устал', keywords: ['усталость'] },
{ id: 'e-cry', category: 'smileys', label: 'Плач', keywords: ['грусть', 'слёзы'] },
{ id: 'e-sob', category: 'smileys', label: 'Рыдаю', keywords: ['слёзы', 'грусть'] },
{ id: 'e-angry', category: 'smileys', label: 'Злость', keywords: ['злой', 'гнев'] },
{ id: 'e-rage', category: 'smileys', label: 'Ярость', keywords: ['злость'] },
{ id: 'e-shock', category: 'smileys', label: 'Шок', keywords: ['удивление', 'шок'] },
{ id: 'e-fear', category: 'smileys', label: 'Страх', keywords: ['страх', 'испуг'] },
{ id: 'e-cool', category: 'smileys', label: 'Круто', keywords: ['крутой', 'очки'] },
{ id: 'e-nerd', category: 'smileys', label: 'Ботан', keywords: ['очки', 'умный'] },
{ id: 'e-sick', category: 'smileys', label: 'Болею', keywords: ['больной', 'маска'] },
{ id: 'e-mask', category: 'smileys', label: 'Маска', keywords: ['маска', 'больной'] },
{ id: 'e-party', category: 'smileys', label: 'Праздник', keywords: ['вечеринка', 'шапка'] },
{ id: 'e-star-eyes', category: 'smileys', label: 'Звёзды', keywords: ['восторг', 'звёзды'] },
{ id: 'e-heart-eyes', category: 'smileys', label: 'Влюблён', keywords: ['любовь', 'сердце'] },
{ id: 'e-kiss', category: 'smileys', label: 'Поцелуй', keywords: ['поцелуй'] },
{ id: 'e-tongue', category: 'smileys', label: 'Язык', keywords: ['шутка', 'язык'] },
{ id: 'e-sweat', category: 'smileys', label: 'Пот', keywords: ['нервы', 'пот'] },
{ id: 'e-dizzy', category: 'smileys', label: 'Головокружение', keywords: ['dizzy'] },
{ id: 'e-thumbs-up', category: 'gestures', label: 'Лайк', keywords: ['лайк', 'ok', 'да'] },
{ id: 'e-thumbs-down', category: 'gestures', label: 'Дизлайк', keywords: ['нет', 'минус'] },
{ id: 'e-clap', category: 'gestures', label: 'Аплодисменты', keywords: ['хлопать', 'браво'] },
{ id: 'e-wave', category: 'gestures', label: 'Привет', keywords: ['привет', 'рука'] },
{ id: 'e-pray', category: 'gestures', label: 'Молитва', keywords: ['спасибо', 'please'] },
{ id: 'e-muscle', category: 'gestures', label: 'Сила', keywords: ['сила', 'качок'] },
{ id: 'e-ok-hand', category: 'gestures', label: 'Ок', keywords: ['ok', 'хорошо'] },
{ id: 'e-victory', category: 'gestures', label: 'Победа', keywords: ['peace', 'v'] },
{ id: 'e-crossed-fingers', category: 'gestures', label: 'Удачи', keywords: ['удача'] },
{ id: 'e-point-up', category: 'gestures', label: 'Указать', keywords: ['вверх'] },
{ id: 'e-point-down', category: 'gestures', label: 'Вниз', keywords: ['вниз'] },
{ id: 'e-raised-hand', category: 'gestures', label: 'Рука', keywords: ['стоп', 'рука'] },
{ id: 'e-fist', category: 'gestures', label: 'Кулак', keywords: ['кулак', 'сила'] },
{ id: 'e-handshake', category: 'gestures', label: 'Рукопожатие', keywords: ['deal', 'договор'] },
{ id: 'e-writing', category: 'gestures', label: 'Пишу', keywords: ['писать'] },
{ id: 'e-red-heart', category: 'hearts', label: 'Сердце', keywords: ['любовь', 'сердце'] },
{ id: 'e-orange-heart', category: 'hearts', label: 'Оранжевое', keywords: ['сердце'] },
{ id: 'e-yellow-heart', category: 'hearts', label: 'Жёлтое', keywords: ['сердце'] },
{ id: 'e-green-heart', category: 'hearts', label: 'Зелёное', keywords: ['сердце'] },
{ id: 'e-blue-heart', category: 'hearts', label: 'Синее', keywords: ['сердце'] },
{ id: 'e-purple-heart', category: 'hearts', label: 'Фиолетовое', keywords: ['сердце'] },
{ id: 'e-black-heart', category: 'hearts', label: 'Чёрное', keywords: ['сердце'] },
{ id: 'e-white-heart', category: 'hearts', label: 'Белое', keywords: ['сердце'] },
{ id: 'e-broken-heart', category: 'hearts', label: 'Разбитое', keywords: ['грусть'] },
{ id: 'e-sparkling-heart', category: 'hearts', label: 'Искры', keywords: ['любовь'] },
{ id: 'e-two-hearts', category: 'hearts', label: 'Два сердца', keywords: ['любовь'] },
{ id: 'e-revolving-hearts', category: 'hearts', label: 'Вращение', keywords: ['любовь'] },
{ id: 'e-dog', category: 'animals', label: 'Собака', keywords: ['собака', 'пёс'] },
{ id: 'e-cat', category: 'animals', label: 'Кошка', keywords: ['кошка', 'кот'] },
{ id: 'e-mouse', category: 'animals', label: 'Мышь', keywords: ['мышь'] },
{ id: 'e-rabbit', category: 'animals', label: 'Кролик', keywords: ['кролик'] },
{ id: 'e-bear', category: 'animals', label: 'Медведь', keywords: ['медведь'] },
{ id: 'e-panda', category: 'animals', label: 'Панда', keywords: ['панда'] },
{ id: 'e-lion', category: 'animals', label: 'Лев', keywords: ['лев'] },
{ id: 'e-tiger', category: 'animals', label: 'Тигр', keywords: ['тигр'] },
{ id: 'e-fox', category: 'animals', label: 'Лиса', keywords: ['лиса'] },
{ id: 'e-wolf', category: 'animals', label: 'Волк', keywords: ['волк'] },
{ id: 'e-monkey', category: 'animals', label: 'Обезьяна', keywords: ['обезьяна'] },
{ id: 'e-chicken', category: 'animals', label: 'Курица', keywords: ['курица'] },
{ id: 'e-penguin', category: 'animals', label: 'Пингвин', keywords: ['пингвин'] },
{ id: 'e-unicorn', category: 'animals', label: 'Единорог', keywords: ['единорог'] },
{ id: 'e-butterfly', category: 'animals', label: 'Бабочка', keywords: ['бабочка'] },
{ id: 'e-pizza', category: 'food', label: 'Пицца', keywords: ['пицца', 'еда'] },
{ id: 'e-burger', category: 'food', label: 'Бургер', keywords: ['бургер'] },
{ id: 'e-fries', category: 'food', label: 'Фри', keywords: ['картошка'] },
{ id: 'e-hotdog', category: 'food', label: 'Хот-дог', keywords: ['хотдог'] },
{ id: 'e-cake', category: 'food', label: 'Торт', keywords: ['торт', 'день рождения'] },
{ id: 'e-cookie', category: 'food', label: 'Печенье', keywords: ['печенье'] },
{ id: 'e-coffee', category: 'food', label: 'Кофе', keywords: ['кофе'] },
{ id: 'e-beer', category: 'food', label: 'Пиво', keywords: ['пиво'] },
{ id: 'e-wine', category: 'food', label: 'Вино', keywords: ['вино'] },
{ id: 'e-apple', category: 'food', label: 'Яблоко', keywords: ['яблоко', 'фрукт'] },
{ id: 'e-banana', category: 'food', label: 'Банан', keywords: ['банан'] },
{ id: 'e-grape', category: 'food', label: 'Виноград', keywords: ['виноград'] },
{ id: 'e-watermelon', category: 'food', label: 'Арбуз', keywords: ['арбуз'] },
{ id: 'e-egg', category: 'food', label: 'Яйцо', keywords: ['яйцо'] },
{ id: 'e-bread', category: 'food', label: 'Хлеб', keywords: ['хлеб'] },
{ id: 'e-car', category: 'travel', label: 'Авто', keywords: ['машина', 'авто'] },
{ id: 'e-bus', category: 'travel', label: 'Автобус', keywords: ['автобус'] },
{ id: 'e-train', category: 'travel', label: 'Поезд', keywords: ['поезд'] },
{ id: 'e-airplane', category: 'travel', label: 'Самолёт', keywords: ['самолёт'] },
{ id: 'e-rocket', category: 'travel', label: 'Ракета', keywords: ['космос', 'ракета'] },
{ id: 'e-ship', category: 'travel', label: 'Корабль', keywords: ['корабль'] },
{ id: 'e-bike', category: 'travel', label: 'Велосипед', keywords: ['велосипед'] },
{ id: 'e-house', category: 'travel', label: 'Дом', keywords: ['дом'] },
{ id: 'e-mountain', category: 'travel', label: 'Гора', keywords: ['гора'] },
{ id: 'e-beach', category: 'travel', label: 'Пляж', keywords: ['море', 'пляж'] },
{ id: 'e-bulb', category: 'objects', label: 'Лампочка', keywords: ['идея', 'лампа'] },
{ id: 'e-phone', category: 'objects', label: 'Телефон', keywords: ['телефон'] },
{ id: 'e-laptop', category: 'objects', label: 'Ноутбук', keywords: ['компьютер'] },
{ id: 'e-camera', category: 'objects', label: 'Камера', keywords: ['фото'] },
{ id: 'e-gift', category: 'objects', label: 'Подарок', keywords: ['подарок'] },
{ id: 'e-balloon', category: 'objects', label: 'Шарик', keywords: ['праздник'] },
{ id: 'e-book', category: 'objects', label: 'Книга', keywords: ['книга'] },
{ id: 'e-key', category: 'objects', label: 'Ключ', keywords: ['ключ'] },
{ id: 'e-lock', category: 'objects', label: 'Замок', keywords: ['замок', 'безопасность'] },
{ id: 'e-clock', category: 'objects', label: 'Часы', keywords: ['время'] },
{ id: 'e-music', category: 'objects', label: 'Музыка', keywords: ['нота', 'музыка'] },
{ id: 'e-game', category: 'objects', label: 'Игра', keywords: ['геймпад', 'игра'] },
{ id: 'e-check', category: 'symbols', label: 'Галочка', keywords: ['да', 'ok'] },
{ id: 'e-cross', category: 'symbols', label: 'Крест', keywords: ['нет', 'ошибка'] },
{ id: 'e-exclamation', category: 'symbols', label: 'Внимание', keywords: ['!', 'важно'] },
{ id: 'e-question', category: 'symbols', label: 'Вопрос', keywords: ['?', 'вопрос'] },
{ id: 'e-fire', category: 'symbols', label: 'Огонь', keywords: ['огонь', 'hot'] },
{ id: 'e-star', category: 'symbols', label: 'Звезда', keywords: ['звезда'] },
{ id: 'e-sparkles', category: 'symbols', label: 'Искры', keywords: ['блеск', 'новый'] },
{ id: 'e-100', category: 'symbols', label: '100', keywords: ['сто', 'идеально'] },
{ id: 'e-plus', category: 'symbols', label: 'Плюс', keywords: ['плюс'] },
{ id: 'e-minus', category: 'symbols', label: 'Минус', keywords: ['минус'] },
{ id: 'e-warning', category: 'symbols', label: 'Предупреждение', keywords: ['warning'] },
{ id: 'e-recycle', category: 'symbols', label: 'Recycle', keywords: ['эко'] }
];
export const EMOJI_BY_ID = new Map(EMOJI_DEFINITIONS.map((item) => [item.id, item]));
export function isEmojiId(value: string) {
return EMOJI_BY_ID.has(value);
}
export function searchEmojis(query: string) {
const normalized = query.trim().toLowerCase();
if (!normalized) return EMOJI_DEFINITIONS;
return EMOJI_DEFINITIONS.filter(
(item) =>
item.label.toLowerCase().includes(normalized) ||
item.id.includes(normalized) ||
item.keywords.some((keyword) => keyword.includes(normalized))
);
}