@domternal/extension-emoji 0.2.0

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/dist/index.js ADDED
@@ -0,0 +1,1112 @@
1
+ import { Node, positionFloatingOnce } from '@domternal/core';
2
+ import { InputRule } from '@domternal/pm/inputrules';
3
+ import { PluginKey, Plugin } from '@domternal/pm/state';
4
+
5
+ // src/Emoji.ts
6
+
7
+ // src/emojis.ts
8
+ var emojis = [
9
+ // === Smileys & Emotion ===
10
+ { emoji: "\u{1F600}", name: "grinning_face", shortcodes: ["grinning"], tags: ["happy", "smile"], group: "Smileys & Emotion" },
11
+ { emoji: "\u{1F603}", name: "grinning_face_with_big_eyes", shortcodes: ["smiley"], tags: ["happy", "joy"], group: "Smileys & Emotion" },
12
+ { emoji: "\u{1F604}", name: "grinning_face_with_smiling_eyes", shortcodes: ["smile"], tags: ["happy", "joy"], group: "Smileys & Emotion" },
13
+ { emoji: "\u{1F601}", name: "beaming_face_with_smiling_eyes", shortcodes: ["grin"], tags: ["happy", "smile"], group: "Smileys & Emotion" },
14
+ { emoji: "\u{1F606}", name: "grinning_squinting_face", shortcodes: ["laughing", "satisfied"], tags: ["happy", "laugh"], group: "Smileys & Emotion" },
15
+ { emoji: "\u{1F605}", name: "grinning_face_with_sweat", shortcodes: ["sweat_smile"], tags: ["hot", "relief"], group: "Smileys & Emotion" },
16
+ { emoji: "\u{1F923}", name: "rolling_on_the_floor_laughing", shortcodes: ["rofl"], tags: ["lol", "laugh"], group: "Smileys & Emotion" },
17
+ { emoji: "\u{1F602}", name: "face_with_tears_of_joy", shortcodes: ["joy"], tags: ["laugh", "cry"], group: "Smileys & Emotion" },
18
+ { emoji: "\u{1F642}", name: "slightly_smiling_face", shortcodes: ["slightly_smiling_face"], tags: ["smile"], group: "Smileys & Emotion" },
19
+ { emoji: "\u{1F609}", name: "winking_face", shortcodes: ["wink"], tags: ["flirt"], group: "Smileys & Emotion" },
20
+ { emoji: "\u{1F60A}", name: "smiling_face_with_smiling_eyes", shortcodes: ["blush"], tags: ["proud", "shy"], group: "Smileys & Emotion" },
21
+ { emoji: "\u{1F607}", name: "smiling_face_with_halo", shortcodes: ["innocent"], tags: ["angel"], group: "Smileys & Emotion" },
22
+ { emoji: "\u{1F970}", name: "smiling_face_with_hearts", shortcodes: ["smiling_face_with_three_hearts"], tags: ["love", "adore"], group: "Smileys & Emotion" },
23
+ { emoji: "\u{1F60D}", name: "smiling_face_with_heart_eyes", shortcodes: ["heart_eyes"], tags: ["love", "crush"], group: "Smileys & Emotion" },
24
+ { emoji: "\u{1F929}", name: "star_struck", shortcodes: ["star_struck"], tags: ["eyes", "amazing"], group: "Smileys & Emotion" },
25
+ { emoji: "\u{1F618}", name: "face_blowing_a_kiss", shortcodes: ["kissing_heart"], tags: ["love", "kiss"], group: "Smileys & Emotion" },
26
+ { emoji: "\u{1F617}", name: "kissing_face", shortcodes: ["kissing"], tags: ["kiss"], group: "Smileys & Emotion" },
27
+ { emoji: "\u{1F61A}", name: "kissing_face_with_closed_eyes", shortcodes: ["kissing_closed_eyes"], tags: ["kiss"], group: "Smileys & Emotion" },
28
+ { emoji: "\u{1F60B}", name: "face_savoring_food", shortcodes: ["yum"], tags: ["delicious", "tongue"], group: "Smileys & Emotion" },
29
+ { emoji: "\u{1F61B}", name: "face_with_tongue", shortcodes: ["stuck_out_tongue"], tags: ["playful"], group: "Smileys & Emotion" },
30
+ { emoji: "\u{1F61C}", name: "winking_face_with_tongue", shortcodes: ["stuck_out_tongue_winking_eye"], tags: ["playful", "kidding"], group: "Smileys & Emotion" },
31
+ { emoji: "\u{1F92A}", name: "zany_face", shortcodes: ["zany_face"], tags: ["crazy", "wild"], group: "Smileys & Emotion" },
32
+ { emoji: "\u{1F61D}", name: "squinting_face_with_tongue", shortcodes: ["stuck_out_tongue_closed_eyes"], tags: ["playful"], group: "Smileys & Emotion" },
33
+ { emoji: "\u{1F911}", name: "money_mouth_face", shortcodes: ["money_mouth_face"], tags: ["rich", "dollar"], group: "Smileys & Emotion" },
34
+ { emoji: "\u{1F917}", name: "smiling_face_with_open_hands", shortcodes: ["hugs"], tags: ["hug"], group: "Smileys & Emotion" },
35
+ { emoji: "\u{1F92D}", name: "face_with_hand_over_mouth", shortcodes: ["hand_over_mouth"], tags: ["oops", "giggle"], group: "Smileys & Emotion" },
36
+ { emoji: "\u{1F92B}", name: "shushing_face", shortcodes: ["shushing_face"], tags: ["quiet", "secret"], group: "Smileys & Emotion" },
37
+ { emoji: "\u{1F914}", name: "thinking_face", shortcodes: ["thinking"], tags: ["hmm", "wonder"], group: "Smileys & Emotion" },
38
+ { emoji: "\u{1F610}", name: "neutral_face", shortcodes: ["neutral_face"], tags: ["meh", "blank"], group: "Smileys & Emotion" },
39
+ { emoji: "\u{1F611}", name: "expressionless_face", shortcodes: ["expressionless"], tags: ["blank", "unimpressed"], group: "Smileys & Emotion" },
40
+ { emoji: "\u{1F636}", name: "face_without_mouth", shortcodes: ["no_mouth"], tags: ["silent", "mute"], group: "Smileys & Emotion" },
41
+ { emoji: "\u{1F60F}", name: "smirking_face", shortcodes: ["smirk"], tags: ["smug"], group: "Smileys & Emotion" },
42
+ { emoji: "\u{1F612}", name: "unamused_face", shortcodes: ["unamused"], tags: ["meh", "unimpressed"], group: "Smileys & Emotion" },
43
+ { emoji: "\u{1F644}", name: "face_with_rolling_eyes", shortcodes: ["roll_eyes"], tags: ["annoyed"], group: "Smileys & Emotion" },
44
+ { emoji: "\u{1F62C}", name: "grimacing_face", shortcodes: ["grimacing"], tags: ["awkward", "nervous"], group: "Smileys & Emotion" },
45
+ { emoji: "\u{1F62E}\u200D\u{1F4A8}", name: "face_exhaling", shortcodes: ["face_exhaling"], tags: ["sigh", "relief"], group: "Smileys & Emotion" },
46
+ { emoji: "\u{1F925}", name: "lying_face", shortcodes: ["lying_face"], tags: ["lie", "pinocchio"], group: "Smileys & Emotion" },
47
+ { emoji: "\u{1F60C}", name: "relieved_face", shortcodes: ["relieved"], tags: ["relaxed", "calm"], group: "Smileys & Emotion" },
48
+ { emoji: "\u{1F614}", name: "pensive_face", shortcodes: ["pensive"], tags: ["sad", "thoughtful"], group: "Smileys & Emotion" },
49
+ { emoji: "\u{1F62A}", name: "sleepy_face", shortcodes: ["sleepy"], tags: ["tired"], group: "Smileys & Emotion" },
50
+ { emoji: "\u{1F924}", name: "drooling_face", shortcodes: ["drooling_face"], tags: ["drool"], group: "Smileys & Emotion" },
51
+ { emoji: "\u{1F634}", name: "sleeping_face", shortcodes: ["sleeping"], tags: ["zzz", "tired"], group: "Smileys & Emotion" },
52
+ { emoji: "\u{1F637}", name: "face_with_medical_mask", shortcodes: ["mask"], tags: ["sick", "covid"], group: "Smileys & Emotion" },
53
+ { emoji: "\u{1F912}", name: "face_with_thermometer", shortcodes: ["face_with_thermometer"], tags: ["sick", "fever"], group: "Smileys & Emotion" },
54
+ { emoji: "\u{1F915}", name: "face_with_head_bandage", shortcodes: ["face_with_head_bandage"], tags: ["hurt", "injured"], group: "Smileys & Emotion" },
55
+ { emoji: "\u{1F922}", name: "nauseated_face", shortcodes: ["nauseated_face"], tags: ["sick", "vomit"], group: "Smileys & Emotion" },
56
+ { emoji: "\u{1F92E}", name: "face_vomiting", shortcodes: ["vomiting_face"], tags: ["sick", "vomit"], group: "Smileys & Emotion" },
57
+ { emoji: "\u{1F635}", name: "face_with_crossed_out_eyes", shortcodes: ["dizzy_face"], tags: ["dizzy", "dead"], group: "Smileys & Emotion" },
58
+ { emoji: "\u{1F974}", name: "woozy_face", shortcodes: ["woozy_face"], tags: ["drunk", "dizzy"], group: "Smileys & Emotion" },
59
+ { emoji: "\u{1F60E}", name: "smiling_face_with_sunglasses", shortcodes: ["sunglasses"], tags: ["cool"], group: "Smileys & Emotion" },
60
+ { emoji: "\u{1F913}", name: "nerd_face", shortcodes: ["nerd_face"], tags: ["nerd", "geek"], group: "Smileys & Emotion" },
61
+ { emoji: "\u{1F615}", name: "confused_face", shortcodes: ["confused"], tags: ["puzzled"], group: "Smileys & Emotion" },
62
+ { emoji: "\u{1F61F}", name: "worried_face", shortcodes: ["worried"], tags: ["nervous", "concern"], group: "Smileys & Emotion" },
63
+ { emoji: "\u{1F641}", name: "slightly_frowning_face", shortcodes: ["slightly_frowning_face"], tags: ["sad", "disappointed"], group: "Smileys & Emotion" },
64
+ { emoji: "\u{1F62E}", name: "face_with_open_mouth", shortcodes: ["open_mouth"], tags: ["surprised", "wow"], group: "Smileys & Emotion" },
65
+ { emoji: "\u{1F62F}", name: "hushed_face", shortcodes: ["hushed"], tags: ["surprised", "shocked"], group: "Smileys & Emotion" },
66
+ { emoji: "\u{1F632}", name: "astonished_face", shortcodes: ["astonished"], tags: ["amazed", "shocked"], group: "Smileys & Emotion" },
67
+ { emoji: "\u{1F633}", name: "flushed_face", shortcodes: ["flushed"], tags: ["embarrassed", "shy"], group: "Smileys & Emotion" },
68
+ { emoji: "\u{1F97A}", name: "pleading_face", shortcodes: ["pleading_face"], tags: ["puppy", "please"], group: "Smileys & Emotion" },
69
+ { emoji: "\u{1F622}", name: "crying_face", shortcodes: ["cry"], tags: ["sad", "tear"], group: "Smileys & Emotion" },
70
+ { emoji: "\u{1F62D}", name: "loudly_crying_face", shortcodes: ["sob"], tags: ["sad", "cry"], group: "Smileys & Emotion" },
71
+ { emoji: "\u{1F624}", name: "face_with_steam_from_nose", shortcodes: ["triumph"], tags: ["angry", "frustrated"], group: "Smileys & Emotion" },
72
+ { emoji: "\u{1F620}", name: "angry_face", shortcodes: ["angry"], tags: ["mad", "annoyed"], group: "Smileys & Emotion" },
73
+ { emoji: "\u{1F621}", name: "pouting_face", shortcodes: ["rage", "pout"], tags: ["angry", "furious"], group: "Smileys & Emotion" },
74
+ { emoji: "\u{1F92C}", name: "face_with_symbols_on_mouth", shortcodes: ["cursing_face"], tags: ["swearing", "angry"], group: "Smileys & Emotion" },
75
+ { emoji: "\u{1F608}", name: "smiling_face_with_horns", shortcodes: ["smiling_imp"], tags: ["devil", "evil"], group: "Smileys & Emotion" },
76
+ { emoji: "\u{1F47F}", name: "angry_face_with_horns", shortcodes: ["imp"], tags: ["devil", "angry"], group: "Smileys & Emotion" },
77
+ { emoji: "\u{1F480}", name: "skull", shortcodes: ["skull"], tags: ["dead", "death"], group: "Smileys & Emotion" },
78
+ { emoji: "\u{1F47B}", name: "ghost", shortcodes: ["ghost"], tags: ["halloween", "spooky"], group: "Smileys & Emotion" },
79
+ { emoji: "\u{1F921}", name: "clown_face", shortcodes: ["clown_face"], tags: ["clown", "joker"], group: "Smileys & Emotion" },
80
+ { emoji: "\u{1F4A9}", name: "pile_of_poo", shortcodes: ["poop", "shit"], tags: ["poo"], group: "Smileys & Emotion" },
81
+ { emoji: "\u{1F973}", name: "partying_face", shortcodes: ["partying_face"], tags: ["party", "celebrate"], group: "Smileys & Emotion" },
82
+ { emoji: "\u{1F972}", name: "smiling_face_with_tear", shortcodes: ["smiling_face_with_tear"], tags: ["sad", "happy"], group: "Smileys & Emotion" },
83
+ { emoji: "\u{1FAE0}", name: "melting_face", shortcodes: ["melting_face"], tags: ["melt", "hot"], group: "Smileys & Emotion" },
84
+ { emoji: "\u{1FAE1}", name: "saluting_face", shortcodes: ["saluting_face"], tags: ["salute", "respect"], group: "Smileys & Emotion" },
85
+ { emoji: "\u{1FAE2}", name: "face_with_open_eyes_and_hand_over_mouth", shortcodes: ["face_with_open_eyes_and_hand_over_mouth"], tags: ["shocked", "oops"], group: "Smileys & Emotion" },
86
+ { emoji: "\u{1FAE3}", name: "face_with_peeking_eye", shortcodes: ["face_with_peeking_eye"], tags: ["peek", "scared"], group: "Smileys & Emotion" },
87
+ { emoji: "\u{1FAE5}", name: "dotted_line_face", shortcodes: ["dotted_line_face"], tags: ["invisible", "hidden"], group: "Smileys & Emotion" },
88
+ { emoji: "\u{1FAE4}", name: "face_with_diagonal_mouth", shortcodes: ["face_with_diagonal_mouth"], tags: ["meh", "skeptical"], group: "Smileys & Emotion" },
89
+ // === Gestures & People ===
90
+ { emoji: "\u{1F44B}", name: "waving_hand", shortcodes: ["wave"], tags: ["hello", "bye"], group: "People & Body" },
91
+ { emoji: "\u{1F91A}", name: "raised_back_of_hand", shortcodes: ["raised_back_of_hand"], tags: ["stop"], group: "People & Body" },
92
+ { emoji: "\u270B", name: "raised_hand", shortcodes: ["hand", "raised_hand"], tags: ["stop", "high five"], group: "People & Body" },
93
+ { emoji: "\u{1F596}", name: "vulcan_salute", shortcodes: ["vulcan_salute"], tags: ["spock", "star trek"], group: "People & Body" },
94
+ { emoji: "\u{1F44C}", name: "ok_hand", shortcodes: ["ok_hand"], tags: ["ok", "perfect"], group: "People & Body" },
95
+ { emoji: "\u{1F90C}", name: "pinched_fingers", shortcodes: ["pinched_fingers"], tags: ["italian", "what"], group: "People & Body" },
96
+ { emoji: "\u270C\uFE0F", name: "victory_hand", shortcodes: ["v"], tags: ["peace", "victory"], group: "People & Body" },
97
+ { emoji: "\u{1F91E}", name: "crossed_fingers", shortcodes: ["crossed_fingers"], tags: ["luck", "hope"], group: "People & Body" },
98
+ { emoji: "\u{1F91F}", name: "love_you_gesture", shortcodes: ["love_you_gesture"], tags: ["love", "rock"], group: "People & Body" },
99
+ { emoji: "\u{1F918}", name: "sign_of_the_horns", shortcodes: ["metal"], tags: ["rock", "metal"], group: "People & Body" },
100
+ { emoji: "\u{1F919}", name: "call_me_hand", shortcodes: ["call_me_hand"], tags: ["call", "shaka"], group: "People & Body" },
101
+ { emoji: "\u{1F448}", name: "backhand_index_pointing_left", shortcodes: ["point_left"], tags: ["left", "direction"], group: "People & Body" },
102
+ { emoji: "\u{1F449}", name: "backhand_index_pointing_right", shortcodes: ["point_right"], tags: ["right", "direction"], group: "People & Body" },
103
+ { emoji: "\u{1F446}", name: "backhand_index_pointing_up", shortcodes: ["point_up_2"], tags: ["up", "direction"], group: "People & Body" },
104
+ { emoji: "\u{1F447}", name: "backhand_index_pointing_down", shortcodes: ["point_down"], tags: ["down", "direction"], group: "People & Body" },
105
+ { emoji: "\u261D\uFE0F", name: "index_pointing_up", shortcodes: ["point_up"], tags: ["up"], group: "People & Body" },
106
+ { emoji: "\u{1F44D}", name: "thumbs_up", shortcodes: ["thumbsup", "+1", "thumbs_up"], tags: ["approve", "ok", "like"], group: "People & Body" },
107
+ { emoji: "\u{1F44E}", name: "thumbs_down", shortcodes: ["thumbsdown", "-1", "thumbs_down"], tags: ["disapprove", "dislike"], group: "People & Body" },
108
+ { emoji: "\u270A", name: "raised_fist", shortcodes: ["fist"], tags: ["power", "punch"], group: "People & Body" },
109
+ { emoji: "\u{1F44A}", name: "oncoming_fist", shortcodes: ["fist_oncoming", "punch"], tags: ["punch"], group: "People & Body" },
110
+ { emoji: "\u{1F91B}", name: "left_facing_fist", shortcodes: ["fist_left"], tags: ["fist bump"], group: "People & Body" },
111
+ { emoji: "\u{1F91C}", name: "right_facing_fist", shortcodes: ["fist_right"], tags: ["fist bump"], group: "People & Body" },
112
+ { emoji: "\u{1F44F}", name: "clapping_hands", shortcodes: ["clap"], tags: ["applause", "bravo"], group: "People & Body" },
113
+ { emoji: "\u{1F64C}", name: "raising_hands", shortcodes: ["raised_hands"], tags: ["celebrate", "hooray"], group: "People & Body" },
114
+ { emoji: "\u{1F450}", name: "open_hands", shortcodes: ["open_hands"], tags: ["jazz hands"], group: "People & Body" },
115
+ { emoji: "\u{1F91D}", name: "handshake", shortcodes: ["handshake"], tags: ["deal", "agreement"], group: "People & Body" },
116
+ { emoji: "\u{1F64F}", name: "folded_hands", shortcodes: ["pray"], tags: ["please", "thank you", "namaste"], group: "People & Body" },
117
+ { emoji: "\u{1F4AA}", name: "flexed_biceps", shortcodes: ["muscle"], tags: ["strong", "flex"], group: "People & Body" },
118
+ { emoji: "\u{1FAF6}", name: "heart_hands", shortcodes: ["heart_hands"], tags: ["love", "heart"], group: "People & Body" },
119
+ // === Hearts & Symbols ===
120
+ { emoji: "\u2764\uFE0F", name: "red_heart", shortcodes: ["heart", "red_heart"], tags: ["love"], group: "Smileys & Emotion" },
121
+ { emoji: "\u{1F9E1}", name: "orange_heart", shortcodes: ["orange_heart"], tags: ["love"], group: "Smileys & Emotion" },
122
+ { emoji: "\u{1F49B}", name: "yellow_heart", shortcodes: ["yellow_heart"], tags: ["love"], group: "Smileys & Emotion" },
123
+ { emoji: "\u{1F49A}", name: "green_heart", shortcodes: ["green_heart"], tags: ["love"], group: "Smileys & Emotion" },
124
+ { emoji: "\u{1F499}", name: "blue_heart", shortcodes: ["blue_heart"], tags: ["love"], group: "Smileys & Emotion" },
125
+ { emoji: "\u{1F49C}", name: "purple_heart", shortcodes: ["purple_heart"], tags: ["love"], group: "Smileys & Emotion" },
126
+ { emoji: "\u{1F5A4}", name: "black_heart", shortcodes: ["black_heart"], tags: ["love", "dark"], group: "Smileys & Emotion" },
127
+ { emoji: "\u{1F90D}", name: "white_heart", shortcodes: ["white_heart"], tags: ["love", "pure"], group: "Smileys & Emotion" },
128
+ { emoji: "\u{1F494}", name: "broken_heart", shortcodes: ["broken_heart"], tags: ["sad", "breakup"], group: "Smileys & Emotion" },
129
+ { emoji: "\u{1F495}", name: "two_hearts", shortcodes: ["two_hearts"], tags: ["love"], group: "Smileys & Emotion" },
130
+ { emoji: "\u{1F496}", name: "sparkling_heart", shortcodes: ["sparkling_heart"], tags: ["love"], group: "Smileys & Emotion" },
131
+ { emoji: "\u{1F497}", name: "growing_heart", shortcodes: ["heartpulse"], tags: ["love"], group: "Smileys & Emotion" },
132
+ { emoji: "\u{1F498}", name: "heart_with_arrow", shortcodes: ["cupid"], tags: ["love", "valentine"], group: "Smileys & Emotion" },
133
+ { emoji: "\u{1F4AF}", name: "hundred_points", shortcodes: ["100"], tags: ["perfect", "score"], group: "Smileys & Emotion" },
134
+ { emoji: "\u{1F4A2}", name: "anger_symbol", shortcodes: ["anger"], tags: ["angry"], group: "Smileys & Emotion" },
135
+ { emoji: "\u{1F4A5}", name: "collision", shortcodes: ["boom", "collision"], tags: ["explode", "bang"], group: "Smileys & Emotion" },
136
+ { emoji: "\u{1F4AB}", name: "dizzy", shortcodes: ["dizzy"], tags: ["star", "sparkle"], group: "Smileys & Emotion" },
137
+ { emoji: "\u{1F4A6}", name: "sweat_droplets", shortcodes: ["sweat_drops"], tags: ["water", "sweat"], group: "Smileys & Emotion" },
138
+ { emoji: "\u{1F4A8}", name: "dashing_away", shortcodes: ["dash"], tags: ["wind", "fast"], group: "Smileys & Emotion" },
139
+ { emoji: "\u{1F573}\uFE0F", name: "hole", shortcodes: ["hole"], tags: ["hole"], group: "Smileys & Emotion" },
140
+ { emoji: "\u{1F4AC}", name: "speech_balloon", shortcodes: ["speech_balloon"], tags: ["chat", "talk"], group: "Smileys & Emotion" },
141
+ { emoji: "\u{1F4AD}", name: "thought_balloon", shortcodes: ["thought_balloon"], tags: ["think", "bubble"], group: "Smileys & Emotion" },
142
+ { emoji: "\u{1F525}", name: "fire", shortcodes: ["fire"], tags: ["hot", "lit"], group: "Travel & Places" },
143
+ { emoji: "\u2728", name: "sparkles", shortcodes: ["sparkles"], tags: ["shine", "magic", "new"], group: "Travel & Places" },
144
+ { emoji: "\u{1F31F}", name: "glowing_star", shortcodes: ["star2"], tags: ["star", "shine"], group: "Travel & Places" },
145
+ { emoji: "\u2B50", name: "star", shortcodes: ["star"], tags: ["favorite", "gold"], group: "Travel & Places" },
146
+ // === Animals & Nature ===
147
+ { emoji: "\u{1F436}", name: "dog_face", shortcodes: ["dog"], tags: ["pet", "puppy"], group: "Animals & Nature" },
148
+ { emoji: "\u{1F431}", name: "cat_face", shortcodes: ["cat"], tags: ["pet", "kitten"], group: "Animals & Nature" },
149
+ { emoji: "\u{1F42D}", name: "mouse_face", shortcodes: ["mouse"], tags: ["animal"], group: "Animals & Nature" },
150
+ { emoji: "\u{1F430}", name: "rabbit_face", shortcodes: ["rabbit"], tags: ["bunny", "easter"], group: "Animals & Nature" },
151
+ { emoji: "\u{1F98A}", name: "fox", shortcodes: ["fox_face"], tags: ["animal"], group: "Animals & Nature" },
152
+ { emoji: "\u{1F43B}", name: "bear", shortcodes: ["bear"], tags: ["animal", "teddy"], group: "Animals & Nature" },
153
+ { emoji: "\u{1F43C}", name: "panda", shortcodes: ["panda_face"], tags: ["animal", "cute"], group: "Animals & Nature" },
154
+ { emoji: "\u{1F438}", name: "frog", shortcodes: ["frog"], tags: ["animal"], group: "Animals & Nature" },
155
+ { emoji: "\u{1F435}", name: "monkey_face", shortcodes: ["monkey_face"], tags: ["animal"], group: "Animals & Nature" },
156
+ { emoji: "\u{1F648}", name: "see_no_evil_monkey", shortcodes: ["see_no_evil"], tags: ["monkey", "shy"], group: "Animals & Nature" },
157
+ { emoji: "\u{1F649}", name: "hear_no_evil_monkey", shortcodes: ["hear_no_evil"], tags: ["monkey"], group: "Animals & Nature" },
158
+ { emoji: "\u{1F64A}", name: "speak_no_evil_monkey", shortcodes: ["speak_no_evil"], tags: ["monkey", "oops"], group: "Animals & Nature" },
159
+ { emoji: "\u{1F414}", name: "chicken", shortcodes: ["chicken"], tags: ["animal", "bird"], group: "Animals & Nature" },
160
+ { emoji: "\u{1F984}", name: "unicorn", shortcodes: ["unicorn"], tags: ["magic", "fantasy"], group: "Animals & Nature" },
161
+ { emoji: "\u{1F41D}", name: "honeybee", shortcodes: ["bee", "honeybee"], tags: ["insect", "honey"], group: "Animals & Nature" },
162
+ { emoji: "\u{1F98B}", name: "butterfly", shortcodes: ["butterfly"], tags: ["insect", "nature"], group: "Animals & Nature" },
163
+ { emoji: "\u{1F422}", name: "turtle", shortcodes: ["turtle"], tags: ["slow", "animal"], group: "Animals & Nature" },
164
+ { emoji: "\u{1F40D}", name: "snake", shortcodes: ["snake"], tags: ["animal"], group: "Animals & Nature" },
165
+ { emoji: "\u{1F338}", name: "cherry_blossom", shortcodes: ["cherry_blossom"], tags: ["flower", "spring"], group: "Animals & Nature" },
166
+ { emoji: "\u{1F339}", name: "rose", shortcodes: ["rose"], tags: ["flower", "love"], group: "Animals & Nature" },
167
+ { emoji: "\u{1F33B}", name: "sunflower", shortcodes: ["sunflower"], tags: ["flower", "nature"], group: "Animals & Nature" },
168
+ { emoji: "\u{1F308}", name: "rainbow", shortcodes: ["rainbow"], tags: ["nature", "pride"], group: "Travel & Places" },
169
+ { emoji: "\u{1F30D}", name: "globe_showing_europe_africa", shortcodes: ["earth_africa"], tags: ["world", "globe"], group: "Travel & Places" },
170
+ // === Food & Drink ===
171
+ { emoji: "\u{1F34E}", name: "red_apple", shortcodes: ["apple"], tags: ["fruit"], group: "Food & Drink" },
172
+ { emoji: "\u{1F355}", name: "pizza", shortcodes: ["pizza"], tags: ["food", "italian"], group: "Food & Drink" },
173
+ { emoji: "\u{1F354}", name: "hamburger", shortcodes: ["hamburger"], tags: ["food", "burger"], group: "Food & Drink" },
174
+ { emoji: "\u{1F35F}", name: "french_fries", shortcodes: ["fries"], tags: ["food"], group: "Food & Drink" },
175
+ { emoji: "\u{1F32E}", name: "taco", shortcodes: ["taco"], tags: ["food", "mexican"], group: "Food & Drink" },
176
+ { emoji: "\u{1F366}", name: "soft_ice_cream", shortcodes: ["icecream"], tags: ["dessert", "sweet"], group: "Food & Drink" },
177
+ { emoji: "\u{1F370}", name: "shortcake", shortcodes: ["cake"], tags: ["dessert", "birthday"], group: "Food & Drink" },
178
+ { emoji: "\u{1F382}", name: "birthday_cake", shortcodes: ["birthday"], tags: ["party", "cake"], group: "Food & Drink" },
179
+ { emoji: "\u{1F369}", name: "doughnut", shortcodes: ["doughnut"], tags: ["donut", "sweet"], group: "Food & Drink" },
180
+ { emoji: "\u{1F36A}", name: "cookie", shortcodes: ["cookie"], tags: ["sweet", "snack"], group: "Food & Drink" },
181
+ { emoji: "\u2615", name: "hot_beverage", shortcodes: ["coffee"], tags: ["drink", "tea", "coffee"], group: "Food & Drink" },
182
+ { emoji: "\u{1F37A}", name: "beer_mug", shortcodes: ["beer"], tags: ["drink", "alcohol"], group: "Food & Drink" },
183
+ { emoji: "\u{1F377}", name: "wine_glass", shortcodes: ["wine_glass"], tags: ["drink", "alcohol"], group: "Food & Drink" },
184
+ { emoji: "\u{1F942}", name: "clinking_glasses", shortcodes: ["clinking_glasses"], tags: ["cheers", "toast"], group: "Food & Drink" },
185
+ { emoji: "\u{1F37B}", name: "clinking_beer_mugs", shortcodes: ["beers"], tags: ["cheers", "drink"], group: "Food & Drink" },
186
+ // === Objects & Activities ===
187
+ { emoji: "\u26BD", name: "soccer_ball", shortcodes: ["soccer"], tags: ["sport", "football"], group: "Activities" },
188
+ { emoji: "\u{1F3C0}", name: "basketball", shortcodes: ["basketball"], tags: ["sport"], group: "Activities" },
189
+ { emoji: "\u{1F3AE}", name: "video_game", shortcodes: ["video_game"], tags: ["game", "controller"], group: "Activities" },
190
+ { emoji: "\u{1F3AF}", name: "bullseye", shortcodes: ["dart"], tags: ["target", "goal"], group: "Activities" },
191
+ { emoji: "\u{1F3C6}", name: "trophy", shortcodes: ["trophy"], tags: ["win", "award"], group: "Activities" },
192
+ { emoji: "\u{1F947}", name: "first_place_medal", shortcodes: ["1st_place_medal", "gold_medal"], tags: ["gold", "winner"], group: "Activities" },
193
+ { emoji: "\u{1F389}", name: "party_popper", shortcodes: ["tada"], tags: ["party", "celebrate"], group: "Activities" },
194
+ { emoji: "\u{1F38A}", name: "confetti_ball", shortcodes: ["confetti_ball"], tags: ["party", "celebrate"], group: "Activities" },
195
+ { emoji: "\u{1F388}", name: "balloon", shortcodes: ["balloon"], tags: ["party", "birthday"], group: "Activities" },
196
+ { emoji: "\u{1F381}", name: "wrapped_gift", shortcodes: ["gift"], tags: ["present", "birthday"], group: "Activities" },
197
+ { emoji: "\u{1F3B5}", name: "musical_note", shortcodes: ["musical_note"], tags: ["music", "song"], group: "Objects" },
198
+ { emoji: "\u{1F3B6}", name: "musical_notes", shortcodes: ["notes"], tags: ["music", "singing"], group: "Objects" },
199
+ { emoji: "\u{1F3B8}", name: "guitar", shortcodes: ["guitar"], tags: ["music", "rock"], group: "Objects" },
200
+ { emoji: "\u{1F4F1}", name: "mobile_phone", shortcodes: ["iphone"], tags: ["phone", "cell"], group: "Objects" },
201
+ { emoji: "\u{1F4BB}", name: "laptop", shortcodes: ["computer"], tags: ["laptop", "tech"], group: "Objects" },
202
+ { emoji: "\u{1F4F7}", name: "camera", shortcodes: ["camera"], tags: ["photo"], group: "Objects" },
203
+ { emoji: "\u{1F4DA}", name: "books", shortcodes: ["books"], tags: ["read", "study"], group: "Objects" },
204
+ { emoji: "\u{1F4DD}", name: "memo", shortcodes: ["memo", "pencil"], tags: ["write", "note"], group: "Objects" },
205
+ { emoji: "\u{1F4CC}", name: "pushpin", shortcodes: ["pushpin"], tags: ["pin", "location"], group: "Objects" },
206
+ { emoji: "\u{1F4CE}", name: "paperclip", shortcodes: ["paperclip"], tags: ["attach"], group: "Objects" },
207
+ { emoji: "\u{1F511}", name: "key", shortcodes: ["key"], tags: ["lock", "password"], group: "Objects" },
208
+ { emoji: "\u{1F512}", name: "locked", shortcodes: ["lock"], tags: ["security", "private"], group: "Objects" },
209
+ { emoji: "\u{1F4A1}", name: "light_bulb", shortcodes: ["bulb"], tags: ["idea", "light"], group: "Objects" },
210
+ { emoji: "\u{1F4B0}", name: "money_bag", shortcodes: ["moneybag"], tags: ["money", "dollar", "rich"], group: "Objects" },
211
+ { emoji: "\u23F0", name: "alarm_clock", shortcodes: ["alarm_clock"], tags: ["time", "wake"], group: "Objects" },
212
+ { emoji: "\u{1F514}", name: "bell", shortcodes: ["bell"], tags: ["notification", "alert"], group: "Objects" },
213
+ // === Symbols ===
214
+ { emoji: "\u2705", name: "check_mark_button", shortcodes: ["white_check_mark"], tags: ["done", "yes", "complete"], group: "Symbols" },
215
+ { emoji: "\u274C", name: "cross_mark", shortcodes: ["x"], tags: ["no", "wrong", "delete"], group: "Symbols" },
216
+ { emoji: "\u2753", name: "red_question_mark", shortcodes: ["question"], tags: ["what", "confused"], group: "Symbols" },
217
+ { emoji: "\u2757", name: "red_exclamation_mark", shortcodes: ["exclamation", "heavy_exclamation_mark"], tags: ["important", "alert"], group: "Symbols" },
218
+ { emoji: "\u26A0\uFE0F", name: "warning", shortcodes: ["warning"], tags: ["caution", "alert"], group: "Symbols" },
219
+ { emoji: "\u{1F6AB}", name: "prohibited", shortcodes: ["no_entry_sign"], tags: ["forbidden", "stop"], group: "Symbols" },
220
+ { emoji: "\u267B\uFE0F", name: "recycling_symbol", shortcodes: ["recycle"], tags: ["environment", "green"], group: "Symbols" },
221
+ { emoji: "\u27A1\uFE0F", name: "right_arrow", shortcodes: ["arrow_right"], tags: ["direction", "next"], group: "Symbols" },
222
+ { emoji: "\u2B05\uFE0F", name: "left_arrow", shortcodes: ["arrow_left"], tags: ["direction", "back"], group: "Symbols" },
223
+ { emoji: "\u2B06\uFE0F", name: "up_arrow", shortcodes: ["arrow_up"], tags: ["direction", "up"], group: "Symbols" },
224
+ { emoji: "\u2B07\uFE0F", name: "down_arrow", shortcodes: ["arrow_down"], tags: ["direction", "down"], group: "Symbols" },
225
+ { emoji: "\u{1F534}", name: "red_circle", shortcodes: ["red_circle"], tags: ["red", "dot"], group: "Symbols" },
226
+ { emoji: "\u{1F7E2}", name: "green_circle", shortcodes: ["green_circle"], tags: ["green", "dot"], group: "Symbols" },
227
+ { emoji: "\u{1F535}", name: "blue_circle", shortcodes: ["blue_circle"], tags: ["blue", "dot"], group: "Symbols" },
228
+ { emoji: "\u{1F7E1}", name: "yellow_circle", shortcodes: ["yellow_circle"], tags: ["yellow", "dot"], group: "Symbols" },
229
+ // === Flags (popular) ===
230
+ { emoji: "\u{1F3F3}\uFE0F", name: "white_flag", shortcodes: ["white_flag"], tags: ["surrender", "peace"], group: "Flags" },
231
+ { emoji: "\u{1F3F4}", name: "black_flag", shortcodes: ["black_flag"], tags: ["pirate"], group: "Flags" },
232
+ { emoji: "\u{1F3C1}", name: "chequered_flag", shortcodes: ["checkered_flag"], tags: ["race", "finish"], group: "Flags" },
233
+ { emoji: "\u{1F6A9}", name: "triangular_flag", shortcodes: ["triangular_flag_on_post"], tags: ["flag", "red flag"], group: "Flags" },
234
+ { emoji: "\u{1F3F3}\uFE0F\u200D\u{1F308}", name: "rainbow_flag", shortcodes: ["rainbow_flag"], tags: ["pride", "lgbtq"], group: "Flags" }
235
+ ];
236
+ var allEmojis = [
237
+ ...emojis,
238
+ // === Additional Smileys & Emotion ===
239
+ { emoji: "\u{1F910}", name: "zipper_mouth_face", shortcodes: ["zipper_mouth_face"], tags: ["secret", "sealed"], group: "Smileys & Emotion" },
240
+ { emoji: "\u{1F928}", name: "face_with_raised_eyebrow", shortcodes: ["raised_eyebrow"], tags: ["suspicious", "skeptical"], group: "Smileys & Emotion" },
241
+ { emoji: "\u{1F9D0}", name: "face_with_monocle", shortcodes: ["monocle_face"], tags: ["classy", "hmm"], group: "Smileys & Emotion" },
242
+ { emoji: "\u{1F92F}", name: "exploding_head", shortcodes: ["exploding_head"], tags: ["mindblown", "shocked"], group: "Smileys & Emotion" },
243
+ { emoji: "\u{1F636}\u200D\u{1F32B}\uFE0F", name: "face_in_clouds", shortcodes: ["face_in_clouds"], tags: ["foggy", "absent"], group: "Smileys & Emotion" },
244
+ { emoji: "\u{1F975}", name: "hot_face", shortcodes: ["hot_face"], tags: ["hot", "sweating"], group: "Smileys & Emotion" },
245
+ { emoji: "\u{1F976}", name: "cold_face", shortcodes: ["cold_face"], tags: ["cold", "freezing"], group: "Smileys & Emotion" },
246
+ { emoji: "\u{1F631}", name: "face_screaming_in_fear", shortcodes: ["scream"], tags: ["scared", "horror"], group: "Smileys & Emotion" },
247
+ { emoji: "\u{1F628}", name: "fearful_face", shortcodes: ["fearful"], tags: ["scared", "afraid"], group: "Smileys & Emotion" },
248
+ { emoji: "\u{1F630}", name: "anxious_face_with_sweat", shortcodes: ["cold_sweat"], tags: ["nervous", "anxious"], group: "Smileys & Emotion" },
249
+ { emoji: "\u{1F625}", name: "sad_but_relieved_face", shortcodes: ["disappointed_relieved"], tags: ["sad", "phew"], group: "Smileys & Emotion" },
250
+ { emoji: "\u{1F920}", name: "cowboy_hat_face", shortcodes: ["cowboy_hat_face"], tags: ["cowboy", "western"], group: "Smileys & Emotion" },
251
+ { emoji: "\u{1F978}", name: "disguised_face", shortcodes: ["disguised_face"], tags: ["disguise", "incognito"], group: "Smileys & Emotion" },
252
+ { emoji: "\u{1F635}\u200D\u{1F4AB}", name: "face_with_spiral_eyes", shortcodes: ["face_with_spiral_eyes"], tags: ["dizzy", "hypnotized"], group: "Smileys & Emotion" },
253
+ { emoji: "\u{1FAE8}", name: "shaking_face", shortcodes: ["shaking_face"], tags: ["shake", "vibrate"], group: "Smileys & Emotion" },
254
+ { emoji: "\u{1F619}", name: "kissing_face_with_smiling_eyes", shortcodes: ["kissing_smiling_eyes"], tags: ["kiss"], group: "Smileys & Emotion" },
255
+ { emoji: "\u{1FAF0}", name: "hand_with_index_finger_and_thumb_crossed", shortcodes: ["hand_with_index_finger_and_thumb_crossed"], tags: ["money", "snap"], group: "People & Body" },
256
+ // === Additional Hearts ===
257
+ { emoji: "\u{1FA77}", name: "pink_heart", shortcodes: ["pink_heart"], tags: ["love", "pink"], group: "Smileys & Emotion" },
258
+ { emoji: "\u{1FA75}", name: "light_blue_heart", shortcodes: ["light_blue_heart"], tags: ["love", "blue"], group: "Smileys & Emotion" },
259
+ { emoji: "\u{1FA76}", name: "grey_heart", shortcodes: ["grey_heart"], tags: ["love", "grey"], group: "Smileys & Emotion" },
260
+ { emoji: "\u{1F90E}", name: "brown_heart", shortcodes: ["brown_heart"], tags: ["love", "brown"], group: "Smileys & Emotion" },
261
+ { emoji: "\u2764\uFE0F\u200D\u{1F525}", name: "heart_on_fire", shortcodes: ["heart_on_fire"], tags: ["love", "passion"], group: "Smileys & Emotion" },
262
+ { emoji: "\u2764\uFE0F\u200D\u{1FA79}", name: "mending_heart", shortcodes: ["mending_heart"], tags: ["healing", "recovery"], group: "Smileys & Emotion" },
263
+ { emoji: "\u{1F49D}", name: "heart_with_ribbon", shortcodes: ["gift_heart"], tags: ["love", "valentine"], group: "Smileys & Emotion" },
264
+ { emoji: "\u{1F49E}", name: "revolving_hearts", shortcodes: ["revolving_hearts"], tags: ["love"], group: "Smileys & Emotion" },
265
+ { emoji: "\u{1F49F}", name: "heart_decoration", shortcodes: ["heart_decoration"], tags: ["love"], group: "Smileys & Emotion" },
266
+ // === Additional Gestures ===
267
+ { emoji: "\u{1FAF1}", name: "rightwards_hand", shortcodes: ["rightwards_hand"], tags: ["hand", "right"], group: "People & Body" },
268
+ { emoji: "\u{1FAF2}", name: "leftwards_hand", shortcodes: ["leftwards_hand"], tags: ["hand", "left"], group: "People & Body" },
269
+ { emoji: "\u{1FAF3}", name: "palm_down_hand", shortcodes: ["palm_down_hand"], tags: ["hand", "dismiss"], group: "People & Body" },
270
+ { emoji: "\u{1FAF4}", name: "palm_up_hand", shortcodes: ["palm_up_hand"], tags: ["hand", "offer"], group: "People & Body" },
271
+ { emoji: "\u{1FAF5}", name: "index_pointing_at_the_viewer", shortcodes: ["index_pointing_at_the_viewer"], tags: ["you", "point"], group: "People & Body" },
272
+ { emoji: "\u{1F90F}", name: "pinching_hand", shortcodes: ["pinching_hand"], tags: ["small", "tiny"], group: "People & Body" },
273
+ { emoji: "\u{1F590}\uFE0F", name: "hand_with_fingers_splayed", shortcodes: ["raised_hand_with_fingers_splayed"], tags: ["hand", "five"], group: "People & Body" },
274
+ { emoji: "\u{1F595}", name: "middle_finger", shortcodes: ["middle_finger", "fu"], tags: ["rude"], group: "People & Body" },
275
+ { emoji: "\u{1F932}", name: "palms_up_together", shortcodes: ["palms_up_together"], tags: ["pray", "cupped hands"], group: "People & Body" },
276
+ { emoji: "\u270D\uFE0F", name: "writing_hand", shortcodes: ["writing_hand"], tags: ["write", "sign"], group: "People & Body" },
277
+ { emoji: "\u{1F485}", name: "nail_polish", shortcodes: ["nail_care"], tags: ["beauty", "manicure"], group: "People & Body" },
278
+ { emoji: "\u{1F933}", name: "selfie", shortcodes: ["selfie"], tags: ["camera", "phone"], group: "People & Body" },
279
+ // === Additional Animals ===
280
+ { emoji: "\u{1F412}", name: "monkey", shortcodes: ["monkey"], tags: ["animal", "ape"], group: "Animals & Nature" },
281
+ { emoji: "\u{1F98D}", name: "gorilla", shortcodes: ["gorilla"], tags: ["animal", "ape"], group: "Animals & Nature" },
282
+ { emoji: "\u{1F415}", name: "dog", shortcodes: ["dog2"], tags: ["animal", "pet"], group: "Animals & Nature" },
283
+ { emoji: "\u{1F429}", name: "poodle", shortcodes: ["poodle"], tags: ["dog", "fancy"], group: "Animals & Nature" },
284
+ { emoji: "\u{1F43A}", name: "wolf", shortcodes: ["wolf"], tags: ["animal", "howl"], group: "Animals & Nature" },
285
+ { emoji: "\u{1F981}", name: "lion", shortcodes: ["lion"], tags: ["animal", "king"], group: "Animals & Nature" },
286
+ { emoji: "\u{1F42F}", name: "tiger_face", shortcodes: ["tiger"], tags: ["animal", "cat"], group: "Animals & Nature" },
287
+ { emoji: "\u{1F42E}", name: "cow_face", shortcodes: ["cow"], tags: ["animal", "moo"], group: "Animals & Nature" },
288
+ { emoji: "\u{1F437}", name: "pig_face", shortcodes: ["pig"], tags: ["animal", "oink"], group: "Animals & Nature" },
289
+ { emoji: "\u{1F434}", name: "horse_face", shortcodes: ["horse"], tags: ["animal"], group: "Animals & Nature" },
290
+ { emoji: "\u{1F432}", name: "dragon_face", shortcodes: ["dragon_face"], tags: ["fantasy", "myth"], group: "Animals & Nature" },
291
+ { emoji: "\u{1F409}", name: "dragon", shortcodes: ["dragon"], tags: ["fantasy", "myth"], group: "Animals & Nature" },
292
+ { emoji: "\u{1F995}", name: "sauropod", shortcodes: ["sauropod"], tags: ["dinosaur", "brontosaurus"], group: "Animals & Nature" },
293
+ { emoji: "\u{1F996}", name: "t_rex", shortcodes: ["t_rex"], tags: ["dinosaur"], group: "Animals & Nature" },
294
+ { emoji: "\u{1F433}", name: "spouting_whale", shortcodes: ["whale"], tags: ["ocean", "sea"], group: "Animals & Nature" },
295
+ { emoji: "\u{1F42C}", name: "dolphin", shortcodes: ["dolphin", "flipper"], tags: ["ocean", "sea"], group: "Animals & Nature" },
296
+ { emoji: "\u{1F988}", name: "shark", shortcodes: ["shark"], tags: ["ocean", "fish"], group: "Animals & Nature" },
297
+ { emoji: "\u{1F419}", name: "octopus", shortcodes: ["octopus"], tags: ["ocean", "tentacles"], group: "Animals & Nature" },
298
+ { emoji: "\u{1F40C}", name: "snail", shortcodes: ["snail"], tags: ["slow"], group: "Animals & Nature" },
299
+ { emoji: "\u{1F41B}", name: "bug", shortcodes: ["bug"], tags: ["insect"], group: "Animals & Nature" },
300
+ { emoji: "\u{1F41C}", name: "ant", shortcodes: ["ant"], tags: ["insect"], group: "Animals & Nature" },
301
+ { emoji: "\u{1F577}\uFE0F", name: "spider", shortcodes: ["spider"], tags: ["insect", "web"], group: "Animals & Nature" },
302
+ { emoji: "\u{1F982}", name: "scorpion", shortcodes: ["scorpion"], tags: ["insect", "zodiac"], group: "Animals & Nature" },
303
+ { emoji: "\u{1F41E}", name: "lady_beetle", shortcodes: ["lady_beetle", "ladybug"], tags: ["insect", "luck"], group: "Animals & Nature" },
304
+ // === Additional Plants & Nature ===
305
+ { emoji: "\u{1F490}", name: "bouquet", shortcodes: ["bouquet"], tags: ["flowers", "gift"], group: "Animals & Nature" },
306
+ { emoji: "\u{1F337}", name: "tulip", shortcodes: ["tulip"], tags: ["flower", "spring"], group: "Animals & Nature" },
307
+ { emoji: "\u{1F33A}", name: "hibiscus", shortcodes: ["hibiscus"], tags: ["flower", "tropical"], group: "Animals & Nature" },
308
+ { emoji: "\u{1F332}", name: "evergreen_tree", shortcodes: ["evergreen_tree"], tags: ["tree", "pine"], group: "Animals & Nature" },
309
+ { emoji: "\u{1F333}", name: "deciduous_tree", shortcodes: ["deciduous_tree"], tags: ["tree", "nature"], group: "Animals & Nature" },
310
+ { emoji: "\u{1F334}", name: "palm_tree", shortcodes: ["palm_tree"], tags: ["tropical", "beach"], group: "Animals & Nature" },
311
+ { emoji: "\u{1F340}", name: "four_leaf_clover", shortcodes: ["four_leaf_clover"], tags: ["luck", "irish"], group: "Animals & Nature" },
312
+ { emoji: "\u{1F341}", name: "maple_leaf", shortcodes: ["maple_leaf"], tags: ["canada", "autumn"], group: "Animals & Nature" },
313
+ { emoji: "\u{1F342}", name: "fallen_leaf", shortcodes: ["fallen_leaf"], tags: ["autumn", "fall"], group: "Animals & Nature" },
314
+ { emoji: "\u{1F343}", name: "leaf_fluttering_in_wind", shortcodes: ["leaves"], tags: ["nature", "wind"], group: "Animals & Nature" },
315
+ { emoji: "\u{1F335}", name: "cactus", shortcodes: ["cactus"], tags: ["desert", "plant"], group: "Animals & Nature" },
316
+ { emoji: "\u{1F344}", name: "mushroom", shortcodes: ["mushroom"], tags: ["nature", "fungus"], group: "Animals & Nature" },
317
+ // === Additional Food & Drink ===
318
+ { emoji: "\u{1F34C}", name: "banana", shortcodes: ["banana"], tags: ["fruit"], group: "Food & Drink" },
319
+ { emoji: "\u{1F347}", name: "grapes", shortcodes: ["grapes"], tags: ["fruit", "wine"], group: "Food & Drink" },
320
+ { emoji: "\u{1F349}", name: "watermelon", shortcodes: ["watermelon"], tags: ["fruit", "summer"], group: "Food & Drink" },
321
+ { emoji: "\u{1F34A}", name: "tangerine", shortcodes: ["tangerine", "orange"], tags: ["fruit", "citrus"], group: "Food & Drink" },
322
+ { emoji: "\u{1F34B}", name: "lemon", shortcodes: ["lemon"], tags: ["fruit", "citrus"], group: "Food & Drink" },
323
+ { emoji: "\u{1F353}", name: "strawberry", shortcodes: ["strawberry"], tags: ["fruit", "berry"], group: "Food & Drink" },
324
+ { emoji: "\u{1FAD0}", name: "blueberries", shortcodes: ["blueberries"], tags: ["fruit", "berry"], group: "Food & Drink" },
325
+ { emoji: "\u{1F351}", name: "peach", shortcodes: ["peach"], tags: ["fruit"], group: "Food & Drink" },
326
+ { emoji: "\u{1F951}", name: "avocado", shortcodes: ["avocado"], tags: ["fruit", "guacamole"], group: "Food & Drink" },
327
+ { emoji: "\u{1F345}", name: "tomato", shortcodes: ["tomato"], tags: ["vegetable", "fruit"], group: "Food & Drink" },
328
+ { emoji: "\u{1F955}", name: "carrot", shortcodes: ["carrot"], tags: ["vegetable", "orange"], group: "Food & Drink" },
329
+ { emoji: "\u{1F33D}", name: "ear_of_corn", shortcodes: ["corn"], tags: ["vegetable", "maize"], group: "Food & Drink" },
330
+ { emoji: "\u{1F966}", name: "broccoli", shortcodes: ["broccoli"], tags: ["vegetable", "green"], group: "Food & Drink" },
331
+ { emoji: "\u{1F9C4}", name: "garlic", shortcodes: ["garlic"], tags: ["spice", "cooking"], group: "Food & Drink" },
332
+ { emoji: "\u{1F95A}", name: "egg", shortcodes: ["egg"], tags: ["breakfast", "food"], group: "Food & Drink" },
333
+ { emoji: "\u{1F373}", name: "cooking", shortcodes: ["fried_egg"], tags: ["breakfast", "egg"], group: "Food & Drink" },
334
+ { emoji: "\u{1F95E}", name: "pancakes", shortcodes: ["pancakes"], tags: ["breakfast", "food"], group: "Food & Drink" },
335
+ { emoji: "\u{1F9C7}", name: "waffle", shortcodes: ["waffle"], tags: ["breakfast", "food"], group: "Food & Drink" },
336
+ { emoji: "\u{1F953}", name: "bacon", shortcodes: ["bacon"], tags: ["breakfast", "meat"], group: "Food & Drink" },
337
+ { emoji: "\u{1F356}", name: "meat_on_bone", shortcodes: ["meat_on_bone"], tags: ["food", "bbq"], group: "Food & Drink" },
338
+ { emoji: "\u{1F357}", name: "poultry_leg", shortcodes: ["poultry_leg"], tags: ["food", "chicken"], group: "Food & Drink" },
339
+ { emoji: "\u{1F32D}", name: "hot_dog", shortcodes: ["hot_dog"], tags: ["food", "sausage"], group: "Food & Drink" },
340
+ { emoji: "\u{1F96A}", name: "sandwich", shortcodes: ["sandwich"], tags: ["food", "lunch"], group: "Food & Drink" },
341
+ { emoji: "\u{1F363}", name: "sushi", shortcodes: ["sushi"], tags: ["food", "japanese"], group: "Food & Drink" },
342
+ { emoji: "\u{1F371}", name: "bento_box", shortcodes: ["bento"], tags: ["food", "japanese"], group: "Food & Drink" },
343
+ { emoji: "\u{1F35C}", name: "steaming_bowl", shortcodes: ["ramen"], tags: ["food", "noodles", "soup"], group: "Food & Drink" },
344
+ { emoji: "\u{1F35D}", name: "spaghetti", shortcodes: ["spaghetti"], tags: ["food", "pasta", "italian"], group: "Food & Drink" },
345
+ { emoji: "\u{1F9C1}", name: "cupcake", shortcodes: ["cupcake"], tags: ["dessert", "sweet"], group: "Food & Drink" },
346
+ { emoji: "\u{1F36B}", name: "chocolate_bar", shortcodes: ["chocolate_bar"], tags: ["sweet", "candy"], group: "Food & Drink" },
347
+ { emoji: "\u{1F36D}", name: "lollipop", shortcodes: ["lollipop"], tags: ["sweet", "candy"], group: "Food & Drink" },
348
+ { emoji: "\u{1F37F}", name: "popcorn", shortcodes: ["popcorn"], tags: ["movie", "snack"], group: "Food & Drink" },
349
+ { emoji: "\u{1F9C3}", name: "beverage_box", shortcodes: ["beverage_box"], tags: ["juice", "drink"], group: "Food & Drink" },
350
+ { emoji: "\u{1F964}", name: "cup_with_straw", shortcodes: ["cup_with_straw"], tags: ["drink", "soda"], group: "Food & Drink" },
351
+ { emoji: "\u{1F9CA}", name: "ice", shortcodes: ["ice_cube"], tags: ["cold", "frozen"], group: "Food & Drink" },
352
+ { emoji: "\u{1F943}", name: "tumbler_glass", shortcodes: ["tumbler_glass"], tags: ["whiskey", "drink"], group: "Food & Drink" },
353
+ { emoji: "\u{1F378}", name: "cocktail_glass", shortcodes: ["cocktail"], tags: ["drink", "martini"], group: "Food & Drink" },
354
+ { emoji: "\u{1F379}", name: "tropical_drink", shortcodes: ["tropical_drink"], tags: ["drink", "cocktail"], group: "Food & Drink" },
355
+ { emoji: "\u{1FAD6}", name: "teapot", shortcodes: ["teapot"], tags: ["tea", "drink"], group: "Food & Drink" },
356
+ // === Travel & Places ===
357
+ { emoji: "\u{1F30E}", name: "globe_showing_americas", shortcodes: ["earth_americas"], tags: ["world", "globe"], group: "Travel & Places" },
358
+ { emoji: "\u{1F30F}", name: "globe_showing_asia_australia", shortcodes: ["earth_asia"], tags: ["world", "globe"], group: "Travel & Places" },
359
+ { emoji: "\u{1F319}", name: "crescent_moon", shortcodes: ["crescent_moon"], tags: ["night", "moon"], group: "Travel & Places" },
360
+ { emoji: "\u{1F31E}", name: "sun_with_face", shortcodes: ["sun_with_face"], tags: ["sun", "bright"], group: "Travel & Places" },
361
+ { emoji: "\u2600\uFE0F", name: "sun", shortcodes: ["sunny"], tags: ["weather", "bright"], group: "Travel & Places" },
362
+ { emoji: "\u26C5", name: "sun_behind_cloud", shortcodes: ["partly_sunny"], tags: ["weather", "cloud"], group: "Travel & Places" },
363
+ { emoji: "\u2601\uFE0F", name: "cloud", shortcodes: ["cloud"], tags: ["weather"], group: "Travel & Places" },
364
+ { emoji: "\u{1F327}\uFE0F", name: "cloud_with_rain", shortcodes: ["cloud_with_rain"], tags: ["weather", "rainy"], group: "Travel & Places" },
365
+ { emoji: "\u26C8\uFE0F", name: "cloud_with_lightning_and_rain", shortcodes: ["cloud_with_lightning_and_rain"], tags: ["weather", "storm"], group: "Travel & Places" },
366
+ { emoji: "\u{1F329}\uFE0F", name: "cloud_with_lightning", shortcodes: ["cloud_with_lightning"], tags: ["weather", "thunder"], group: "Travel & Places" },
367
+ { emoji: "\u2744\uFE0F", name: "snowflake", shortcodes: ["snowflake"], tags: ["winter", "cold"], group: "Travel & Places" },
368
+ { emoji: "\u26C4", name: "snowman_without_snow", shortcodes: ["snowman_without_snow"], tags: ["winter", "cold"], group: "Travel & Places" },
369
+ { emoji: "\u{1F30A}", name: "water_wave", shortcodes: ["ocean"], tags: ["wave", "sea"], group: "Travel & Places" },
370
+ { emoji: "\u{1F30B}", name: "volcano", shortcodes: ["volcano"], tags: ["eruption", "mountain"], group: "Travel & Places" },
371
+ { emoji: "\u{1F3D4}\uFE0F", name: "snow_capped_mountain", shortcodes: ["mountain_snow"], tags: ["mountain", "snow"], group: "Travel & Places" },
372
+ { emoji: "\u26F0\uFE0F", name: "mountain", shortcodes: ["mountain"], tags: ["nature", "hiking"], group: "Travel & Places" },
373
+ { emoji: "\u{1F3D6}\uFE0F", name: "beach_with_umbrella", shortcodes: ["beach_umbrella"], tags: ["beach", "summer"], group: "Travel & Places" },
374
+ { emoji: "\u{1F3D5}\uFE0F", name: "camping", shortcodes: ["camping"], tags: ["tent", "nature"], group: "Travel & Places" },
375
+ { emoji: "\u{1F3E0}", name: "house", shortcodes: ["house"], tags: ["home", "building"], group: "Travel & Places" },
376
+ { emoji: "\u{1F3E2}", name: "office_building", shortcodes: ["office"], tags: ["work", "building"], group: "Travel & Places" },
377
+ { emoji: "\u{1F3E5}", name: "hospital", shortcodes: ["hospital"], tags: ["health", "medical"], group: "Travel & Places" },
378
+ { emoji: "\u{1F3EB}", name: "school", shortcodes: ["school"], tags: ["education", "building"], group: "Travel & Places" },
379
+ { emoji: "\u2708\uFE0F", name: "airplane", shortcodes: ["airplane"], tags: ["travel", "fly"], group: "Travel & Places" },
380
+ { emoji: "\u{1F680}", name: "rocket", shortcodes: ["rocket"], tags: ["space", "launch", "fast"], group: "Travel & Places" },
381
+ { emoji: "\u{1F6F8}", name: "flying_saucer", shortcodes: ["flying_saucer"], tags: ["ufo", "alien"], group: "Travel & Places" },
382
+ { emoji: "\u{1F697}", name: "automobile", shortcodes: ["car", "red_car"], tags: ["vehicle", "drive"], group: "Travel & Places" },
383
+ { emoji: "\u{1F695}", name: "taxi", shortcodes: ["taxi"], tags: ["vehicle", "cab"], group: "Travel & Places" },
384
+ { emoji: "\u{1F68C}", name: "bus", shortcodes: ["bus"], tags: ["vehicle", "transit"], group: "Travel & Places" },
385
+ { emoji: "\u{1F6B2}", name: "bicycle", shortcodes: ["bike"], tags: ["vehicle", "cycling"], group: "Travel & Places" },
386
+ { emoji: "\u{1F6F5}", name: "motor_scooter", shortcodes: ["motor_scooter"], tags: ["vehicle", "vespa"], group: "Travel & Places" },
387
+ { emoji: "\u{1F6A2}", name: "ship", shortcodes: ["ship"], tags: ["boat", "cruise"], group: "Travel & Places" },
388
+ { emoji: "\u26F5", name: "sailboat", shortcodes: ["sailboat"], tags: ["boat", "sail"], group: "Travel & Places" },
389
+ // === Additional Objects ===
390
+ { emoji: "\u231A", name: "watch", shortcodes: ["watch"], tags: ["time", "clock"], group: "Objects" },
391
+ { emoji: "\u{1F5A5}\uFE0F", name: "desktop_computer", shortcodes: ["desktop_computer"], tags: ["computer", "pc"], group: "Objects" },
392
+ { emoji: "\u2328\uFE0F", name: "keyboard", shortcodes: ["keyboard"], tags: ["type", "computer"], group: "Objects" },
393
+ { emoji: "\u{1F5B1}\uFE0F", name: "computer_mouse", shortcodes: ["computer_mouse"], tags: ["click", "computer"], group: "Objects" },
394
+ { emoji: "\u{1F3A5}", name: "movie_camera", shortcodes: ["movie_camera"], tags: ["film", "cinema"], group: "Objects" },
395
+ { emoji: "\u{1F4FA}", name: "television", shortcodes: ["tv"], tags: ["screen", "watch"], group: "Objects" },
396
+ { emoji: "\u{1F4FB}", name: "radio", shortcodes: ["radio"], tags: ["music", "broadcast"], group: "Objects" },
397
+ { emoji: "\u{1F399}\uFE0F", name: "studio_microphone", shortcodes: ["studio_microphone"], tags: ["podcast", "recording"], group: "Objects" },
398
+ { emoji: "\u{1F3A4}", name: "microphone", shortcodes: ["microphone"], tags: ["singing", "karaoke"], group: "Objects" },
399
+ { emoji: "\u{1F3A7}", name: "headphone", shortcodes: ["headphones"], tags: ["music", "audio"], group: "Objects" },
400
+ { emoji: "\u{1F3B9}", name: "musical_keyboard", shortcodes: ["musical_keyboard"], tags: ["piano", "music"], group: "Objects" },
401
+ { emoji: "\u{1F941}", name: "drum", shortcodes: ["drum"], tags: ["music", "beat"], group: "Objects" },
402
+ { emoji: "\u{1F3BA}", name: "trumpet", shortcodes: ["trumpet"], tags: ["music", "brass"], group: "Objects" },
403
+ { emoji: "\u{1F3BB}", name: "violin", shortcodes: ["violin"], tags: ["music", "string"], group: "Objects" },
404
+ { emoji: "\u{1F527}", name: "wrench", shortcodes: ["wrench"], tags: ["tool", "fix"], group: "Objects" },
405
+ { emoji: "\u{1F528}", name: "hammer", shortcodes: ["hammer"], tags: ["tool", "build"], group: "Objects" },
406
+ { emoji: "\u2699\uFE0F", name: "gear", shortcodes: ["gear"], tags: ["settings", "cog"], group: "Objects" },
407
+ { emoji: "\u{1F517}", name: "link", shortcodes: ["link"], tags: ["url", "chain"], group: "Objects" },
408
+ { emoji: "\u{1F587}\uFE0F", name: "linked_paperclips", shortcodes: ["paperclips"], tags: ["attach"], group: "Objects" },
409
+ { emoji: "\u{1F4CF}", name: "straight_ruler", shortcodes: ["straight_ruler"], tags: ["measure", "school"], group: "Objects" },
410
+ { emoji: "\u{1F4D0}", name: "triangular_ruler", shortcodes: ["triangular_ruler"], tags: ["math", "school"], group: "Objects" },
411
+ { emoji: "\u2702\uFE0F", name: "scissors", shortcodes: ["scissors"], tags: ["cut"], group: "Objects" },
412
+ { emoji: "\u{1F4E6}", name: "package", shortcodes: ["package"], tags: ["box", "delivery"], group: "Objects" },
413
+ { emoji: "\u{1F4EB}", name: "closed_mailbox_with_raised_flag", shortcodes: ["mailbox"], tags: ["mail", "letter"], group: "Objects" },
414
+ { emoji: "\u{1F4E7}", name: "email", shortcodes: ["email", "e-mail"], tags: ["mail", "letter"], group: "Objects" },
415
+ { emoji: "\u{1F4F0}", name: "newspaper", shortcodes: ["newspaper"], tags: ["news", "media"], group: "Objects" },
416
+ { emoji: "\u{1F5DE}\uFE0F", name: "rolled_up_newspaper", shortcodes: ["newspaper_roll"], tags: ["news"], group: "Objects" },
417
+ { emoji: "\u{1F4D6}", name: "open_book", shortcodes: ["book", "open_book"], tags: ["read", "study"], group: "Objects" },
418
+ { emoji: "\u{1F516}", name: "bookmark", shortcodes: ["bookmark"], tags: ["save", "mark"], group: "Objects" },
419
+ { emoji: "\u{1F3F7}\uFE0F", name: "label", shortcodes: ["label"], tags: ["tag", "price"], group: "Objects" },
420
+ { emoji: "\u{1F48A}", name: "pill", shortcodes: ["pill"], tags: ["medicine", "health"], group: "Objects" },
421
+ { emoji: "\u{1FA79}", name: "adhesive_bandage", shortcodes: ["adhesive_bandage"], tags: ["bandaid", "heal"], group: "Objects" },
422
+ { emoji: "\u{1F9F2}", name: "magnet", shortcodes: ["magnet"], tags: ["attract", "magnetic"], group: "Objects" },
423
+ { emoji: "\u{1F9EA}", name: "test_tube", shortcodes: ["test_tube"], tags: ["science", "chemistry"], group: "Objects" },
424
+ { emoji: "\u{1F9EC}", name: "dna", shortcodes: ["dna"], tags: ["science", "genetics"], group: "Objects" },
425
+ { emoji: "\u{1F52C}", name: "microscope", shortcodes: ["microscope"], tags: ["science", "lab"], group: "Objects" },
426
+ { emoji: "\u{1F52D}", name: "telescope", shortcodes: ["telescope"], tags: ["space", "astronomy"], group: "Objects" },
427
+ { emoji: "\u{1F48E}", name: "gem_stone", shortcodes: ["gem"], tags: ["diamond", "jewel"], group: "Objects" },
428
+ { emoji: "\u{1FA99}", name: "coin", shortcodes: ["coin"], tags: ["money", "currency"], group: "Objects" },
429
+ { emoji: "\u{1F4B5}", name: "dollar_banknote", shortcodes: ["dollar"], tags: ["money", "cash"], group: "Objects" },
430
+ { emoji: "\u{1F4B3}", name: "credit_card", shortcodes: ["credit_card"], tags: ["money", "payment"], group: "Objects" },
431
+ // === Additional Activities ===
432
+ { emoji: "\u{1F3C8}", name: "american_football", shortcodes: ["football"], tags: ["sport", "nfl"], group: "Activities" },
433
+ { emoji: "\u26BE", name: "baseball", shortcodes: ["baseball"], tags: ["sport"], group: "Activities" },
434
+ { emoji: "\u{1F3BE}", name: "tennis", shortcodes: ["tennis"], tags: ["sport", "racket"], group: "Activities" },
435
+ { emoji: "\u{1F3D0}", name: "volleyball", shortcodes: ["volleyball"], tags: ["sport"], group: "Activities" },
436
+ { emoji: "\u{1F3D3}", name: "ping_pong", shortcodes: ["ping_pong"], tags: ["sport", "table tennis"], group: "Activities" },
437
+ { emoji: "\u{1F94A}", name: "boxing_glove", shortcodes: ["boxing_glove"], tags: ["sport", "fight"], group: "Activities" },
438
+ { emoji: "\u{1F3CB}\uFE0F", name: "person_lifting_weights", shortcodes: ["weight_lifting"], tags: ["gym", "exercise"], group: "Activities" },
439
+ { emoji: "\u{1F6B4}", name: "person_biking", shortcodes: ["biking"], tags: ["cycling", "sport"], group: "Activities" },
440
+ { emoji: "\u{1F3CA}", name: "person_swimming", shortcodes: ["swimming"], tags: ["sport", "pool"], group: "Activities" },
441
+ { emoji: "\u{1F9D8}", name: "person_in_lotus_position", shortcodes: ["lotus_position"], tags: ["yoga", "meditation"], group: "Activities" },
442
+ { emoji: "\u{1F3B2}", name: "game_die", shortcodes: ["game_die"], tags: ["dice", "game"], group: "Activities" },
443
+ { emoji: "\u{1F9E9}", name: "puzzle_piece", shortcodes: ["jigsaw"], tags: ["puzzle", "game"], group: "Activities" },
444
+ { emoji: "\u{1F3AD}", name: "performing_arts", shortcodes: ["performing_arts"], tags: ["theater", "drama"], group: "Activities" },
445
+ { emoji: "\u{1F3A8}", name: "artist_palette", shortcodes: ["art"], tags: ["paint", "creative"], group: "Activities" },
446
+ { emoji: "\u{1F3AC}", name: "clapper_board", shortcodes: ["clapper"], tags: ["movie", "film"], group: "Activities" },
447
+ { emoji: "\u{1F3AA}", name: "circus_tent", shortcodes: ["circus_tent"], tags: ["circus", "show"], group: "Activities" },
448
+ { emoji: "\u{1F948}", name: "second_place_medal", shortcodes: ["silver_medal"], tags: ["second", "silver"], group: "Activities" },
449
+ { emoji: "\u{1F949}", name: "third_place_medal", shortcodes: ["bronze_medal"], tags: ["third", "bronze"], group: "Activities" },
450
+ { emoji: "\u{1F397}\uFE0F", name: "reminder_ribbon", shortcodes: ["reminder_ribbon"], tags: ["awareness"], group: "Activities" },
451
+ { emoji: "\u{1F39F}\uFE0F", name: "admission_tickets", shortcodes: ["tickets"], tags: ["event", "entry"], group: "Activities" },
452
+ { emoji: "\u{1F384}", name: "christmas_tree", shortcodes: ["christmas_tree"], tags: ["holiday", "xmas"], group: "Activities" },
453
+ { emoji: "\u{1F383}", name: "jack_o_lantern", shortcodes: ["jack_o_lantern"], tags: ["halloween", "pumpkin"], group: "Activities" },
454
+ { emoji: "\u{1F386}", name: "fireworks", shortcodes: ["fireworks"], tags: ["celebration", "new year"], group: "Activities" },
455
+ { emoji: "\u{1F387}", name: "sparkler", shortcodes: ["sparkler"], tags: ["celebration", "firework"], group: "Activities" },
456
+ // === Additional Symbols ===
457
+ { emoji: "\u262E\uFE0F", name: "peace_symbol", shortcodes: ["peace_symbol"], tags: ["peace"], group: "Symbols" },
458
+ { emoji: "\u271D\uFE0F", name: "latin_cross", shortcodes: ["latin_cross"], tags: ["religion", "christian"], group: "Symbols" },
459
+ { emoji: "\u262A\uFE0F", name: "star_and_crescent", shortcodes: ["star_and_crescent"], tags: ["religion", "islam"], group: "Symbols" },
460
+ { emoji: "\u2721\uFE0F", name: "star_of_david", shortcodes: ["star_of_david"], tags: ["religion", "jewish"], group: "Symbols" },
461
+ { emoji: "\u262F\uFE0F", name: "yin_yang", shortcodes: ["yin_yang"], tags: ["balance"], group: "Symbols" },
462
+ { emoji: "\u267E\uFE0F", name: "infinity", shortcodes: ["infinity"], tags: ["forever", "endless"], group: "Symbols" },
463
+ { emoji: "\u{1F500}", name: "shuffle_tracks_button", shortcodes: ["twisted_rightwards_arrows"], tags: ["random", "shuffle"], group: "Symbols" },
464
+ { emoji: "\u{1F501}", name: "repeat_button", shortcodes: ["repeat"], tags: ["loop", "replay"], group: "Symbols" },
465
+ { emoji: "\u25B6\uFE0F", name: "play_button", shortcodes: ["arrow_forward"], tags: ["play", "start"], group: "Symbols" },
466
+ { emoji: "\u23F8\uFE0F", name: "pause_button", shortcodes: ["pause_button"], tags: ["pause", "stop"], group: "Symbols" },
467
+ { emoji: "\u23F9\uFE0F", name: "stop_button", shortcodes: ["stop_button"], tags: ["stop", "end"], group: "Symbols" },
468
+ { emoji: "\u23E9", name: "fast_forward_button", shortcodes: ["fast_forward"], tags: ["speed", "skip"], group: "Symbols" },
469
+ { emoji: "\u23EA", name: "fast_reverse_button", shortcodes: ["rewind"], tags: ["back", "reverse"], group: "Symbols" },
470
+ { emoji: "\u{1F50A}", name: "speaker_high_volume", shortcodes: ["loud_sound"], tags: ["volume", "audio"], group: "Symbols" },
471
+ { emoji: "\u{1F507}", name: "muted_speaker", shortcodes: ["mute"], tags: ["volume", "silent"], group: "Symbols" },
472
+ { emoji: "\u{1F4F3}", name: "vibration_mode", shortcodes: ["vibration_mode"], tags: ["phone", "silent"], group: "Symbols" },
473
+ { emoji: "\u{1F505}", name: "dim_button", shortcodes: ["low_brightness"], tags: ["brightness", "dim"], group: "Symbols" },
474
+ { emoji: "\u{1F506}", name: "bright_button", shortcodes: ["high_brightness"], tags: ["brightness", "light"], group: "Symbols" },
475
+ { emoji: "\u2640\uFE0F", name: "female_sign", shortcodes: ["female_sign"], tags: ["woman", "gender"], group: "Symbols" },
476
+ { emoji: "\u2642\uFE0F", name: "male_sign", shortcodes: ["male_sign"], tags: ["man", "gender"], group: "Symbols" },
477
+ { emoji: "\u26A7\uFE0F", name: "transgender_symbol", shortcodes: ["transgender_symbol"], tags: ["gender", "trans"], group: "Symbols" },
478
+ { emoji: "\u2795", name: "plus", shortcodes: ["heavy_plus_sign"], tags: ["add", "math"], group: "Symbols" },
479
+ { emoji: "\u2796", name: "minus", shortcodes: ["heavy_minus_sign"], tags: ["subtract", "math"], group: "Symbols" },
480
+ { emoji: "\u2797", name: "divide", shortcodes: ["heavy_division_sign"], tags: ["divide", "math"], group: "Symbols" },
481
+ { emoji: "\u2716\uFE0F", name: "multiply", shortcodes: ["heavy_multiplication_x"], tags: ["multiply", "math"], group: "Symbols" },
482
+ { emoji: "\u{1F7E0}", name: "orange_circle", shortcodes: ["orange_circle"], tags: ["orange", "dot"], group: "Symbols" },
483
+ { emoji: "\u{1F7E3}", name: "purple_circle", shortcodes: ["purple_circle"], tags: ["purple", "dot"], group: "Symbols" },
484
+ { emoji: "\u{1F7E4}", name: "brown_circle", shortcodes: ["brown_circle"], tags: ["brown", "dot"], group: "Symbols" },
485
+ { emoji: "\u26AB", name: "black_circle", shortcodes: ["black_circle"], tags: ["black", "dot"], group: "Symbols" },
486
+ { emoji: "\u26AA", name: "white_circle", shortcodes: ["white_circle"], tags: ["white", "dot"], group: "Symbols" },
487
+ { emoji: "\u{1F7E5}", name: "red_square", shortcodes: ["red_square"], tags: ["red", "square"], group: "Symbols" },
488
+ { emoji: "\u{1F7E7}", name: "orange_square", shortcodes: ["orange_square"], tags: ["orange", "square"], group: "Symbols" },
489
+ { emoji: "\u{1F7E8}", name: "yellow_square", shortcodes: ["yellow_square"], tags: ["yellow", "square"], group: "Symbols" },
490
+ { emoji: "\u{1F7E9}", name: "green_square", shortcodes: ["green_square"], tags: ["green", "square"], group: "Symbols" },
491
+ { emoji: "\u{1F7E6}", name: "blue_square", shortcodes: ["blue_square"], tags: ["blue", "square"], group: "Symbols" },
492
+ { emoji: "\u{1F7EA}", name: "purple_square", shortcodes: ["purple_square"], tags: ["purple", "square"], group: "Symbols" },
493
+ { emoji: "\u{1F536}", name: "large_orange_diamond", shortcodes: ["large_orange_diamond"], tags: ["shape"], group: "Symbols" },
494
+ { emoji: "\u{1F537}", name: "large_blue_diamond", shortcodes: ["large_blue_diamond"], tags: ["shape"], group: "Symbols" },
495
+ { emoji: "\u{1F538}", name: "small_orange_diamond", shortcodes: ["small_orange_diamond"], tags: ["shape"], group: "Symbols" },
496
+ { emoji: "\u{1F539}", name: "small_blue_diamond", shortcodes: ["small_blue_diamond"], tags: ["shape"], group: "Symbols" },
497
+ { emoji: "\u{1F4A0}", name: "diamond_with_a_dot", shortcodes: ["diamond_shape_with_a_dot_inside"], tags: ["shape"], group: "Symbols" },
498
+ // === Additional Flags ===
499
+ { emoji: "\u{1F1FA}\u{1F1F8}", name: "flag_us", shortcodes: ["us", "flag_us"], tags: ["usa", "america"], group: "Flags" },
500
+ { emoji: "\u{1F1EC}\u{1F1E7}", name: "flag_gb", shortcodes: ["gb", "uk", "flag_gb"], tags: ["britain", "england"], group: "Flags" },
501
+ { emoji: "\u{1F1E9}\u{1F1EA}", name: "flag_de", shortcodes: ["de", "flag_de"], tags: ["germany"], group: "Flags" },
502
+ { emoji: "\u{1F1EB}\u{1F1F7}", name: "flag_fr", shortcodes: ["fr", "flag_fr"], tags: ["france"], group: "Flags" },
503
+ { emoji: "\u{1F1EA}\u{1F1F8}", name: "flag_es", shortcodes: ["es", "flag_es"], tags: ["spain"], group: "Flags" },
504
+ { emoji: "\u{1F1EE}\u{1F1F9}", name: "flag_it", shortcodes: ["it", "flag_it"], tags: ["italy"], group: "Flags" },
505
+ { emoji: "\u{1F1EF}\u{1F1F5}", name: "flag_jp", shortcodes: ["jp", "flag_jp"], tags: ["japan"], group: "Flags" },
506
+ { emoji: "\u{1F1F0}\u{1F1F7}", name: "flag_kr", shortcodes: ["kr", "flag_kr"], tags: ["korea", "south korea"], group: "Flags" },
507
+ { emoji: "\u{1F1E8}\u{1F1F3}", name: "flag_cn", shortcodes: ["cn", "flag_cn"], tags: ["china"], group: "Flags" },
508
+ { emoji: "\u{1F1F7}\u{1F1FA}", name: "flag_ru", shortcodes: ["ru", "flag_ru"], tags: ["russia"], group: "Flags" },
509
+ { emoji: "\u{1F1E7}\u{1F1F7}", name: "flag_br", shortcodes: ["br", "flag_br"], tags: ["brazil"], group: "Flags" },
510
+ { emoji: "\u{1F1EE}\u{1F1F3}", name: "flag_in", shortcodes: ["flag_in"], tags: ["india"], group: "Flags" },
511
+ { emoji: "\u{1F1E6}\u{1F1FA}", name: "flag_au", shortcodes: ["flag_au"], tags: ["australia"], group: "Flags" },
512
+ { emoji: "\u{1F1E8}\u{1F1E6}", name: "flag_ca", shortcodes: ["flag_ca"], tags: ["canada"], group: "Flags" },
513
+ { emoji: "\u{1F1F2}\u{1F1FD}", name: "flag_mx", shortcodes: ["flag_mx"], tags: ["mexico"], group: "Flags" },
514
+ { emoji: "\u{1F1ED}\u{1F1F7}", name: "flag_hr", shortcodes: ["hr", "flag_hr"], tags: ["croatia"], group: "Flags" },
515
+ { emoji: "\u{1F1F5}\u{1F1F1}", name: "flag_pl", shortcodes: ["flag_pl"], tags: ["poland"], group: "Flags" },
516
+ { emoji: "\u{1F1F3}\u{1F1F1}", name: "flag_nl", shortcodes: ["flag_nl"], tags: ["netherlands"], group: "Flags" },
517
+ { emoji: "\u{1F1F8}\u{1F1EA}", name: "flag_se", shortcodes: ["flag_se"], tags: ["sweden"], group: "Flags" },
518
+ { emoji: "\u{1F1F3}\u{1F1F4}", name: "flag_no", shortcodes: ["flag_no"], tags: ["norway"], group: "Flags" },
519
+ { emoji: "\u{1F1F9}\u{1F1F7}", name: "flag_tr", shortcodes: ["flag_tr"], tags: ["turkey"], group: "Flags" },
520
+ { emoji: "\u{1F1FA}\u{1F1E6}", name: "flag_ua", shortcodes: ["flag_ua"], tags: ["ukraine"], group: "Flags" },
521
+ { emoji: "\u{1F1F5}\u{1F1F9}", name: "flag_pt", shortcodes: ["flag_pt"], tags: ["portugal"], group: "Flags" },
522
+ { emoji: "\u{1F1E8}\u{1F1ED}", name: "flag_ch", shortcodes: ["flag_ch"], tags: ["switzerland"], group: "Flags" },
523
+ { emoji: "\u{1F1E6}\u{1F1F9}", name: "flag_at", shortcodes: ["flag_at"], tags: ["austria"], group: "Flags" },
524
+ { emoji: "\u{1F1E7}\u{1F1EA}", name: "flag_be", shortcodes: ["flag_be"], tags: ["belgium"], group: "Flags" },
525
+ { emoji: "\u{1F1EC}\u{1F1F7}", name: "flag_gr", shortcodes: ["flag_gr"], tags: ["greece"], group: "Flags" },
526
+ { emoji: "\u{1F1EE}\u{1F1EA}", name: "flag_ie", shortcodes: ["flag_ie"], tags: ["ireland"], group: "Flags" },
527
+ { emoji: "\u{1F1E6}\u{1F1F7}", name: "flag_ar", shortcodes: ["flag_ar"], tags: ["argentina"], group: "Flags" },
528
+ { emoji: "\u{1F1FF}\u{1F1E6}", name: "flag_za", shortcodes: ["flag_za"], tags: ["south africa"], group: "Flags" },
529
+ { emoji: "\u{1F1EA}\u{1F1EC}", name: "flag_eg", shortcodes: ["flag_eg"], tags: ["egypt"], group: "Flags" },
530
+ { emoji: "\u{1F1EE}\u{1F1F1}", name: "flag_il", shortcodes: ["flag_il"], tags: ["israel"], group: "Flags" },
531
+ { emoji: "\u{1F1F8}\u{1F1E6}", name: "flag_sa", shortcodes: ["flag_sa"], tags: ["saudi arabia"], group: "Flags" },
532
+ { emoji: "\u{1F1F9}\u{1F1ED}", name: "flag_th", shortcodes: ["flag_th"], tags: ["thailand"], group: "Flags" },
533
+ { emoji: "\u{1F1FB}\u{1F1F3}", name: "flag_vn", shortcodes: ["flag_vn"], tags: ["vietnam"], group: "Flags" },
534
+ { emoji: "\u{1F1EE}\u{1F1E9}", name: "flag_id", shortcodes: ["flag_id"], tags: ["indonesia"], group: "Flags" },
535
+ { emoji: "\u{1F1F5}\u{1F1ED}", name: "flag_ph", shortcodes: ["flag_ph"], tags: ["philippines"], group: "Flags" },
536
+ { emoji: "\u{1F1F3}\u{1F1EC}", name: "flag_ng", shortcodes: ["flag_ng"], tags: ["nigeria"], group: "Flags" },
537
+ { emoji: "\u{1F1F0}\u{1F1EA}", name: "flag_ke", shortcodes: ["flag_ke"], tags: ["kenya"], group: "Flags" },
538
+ { emoji: "\u{1F1E8}\u{1F1F4}", name: "flag_co", shortcodes: ["flag_co"], tags: ["colombia"], group: "Flags" },
539
+ { emoji: "\u{1F1F5}\u{1F1EA}", name: "flag_pe", shortcodes: ["flag_pe"], tags: ["peru"], group: "Flags" },
540
+ { emoji: "\u{1F1E8}\u{1F1F1}", name: "flag_cl", shortcodes: ["flag_cl"], tags: ["chile"], group: "Flags" },
541
+ { emoji: "\u{1F1F3}\u{1F1FF}", name: "flag_nz", shortcodes: ["flag_nz"], tags: ["new zealand"], group: "Flags" },
542
+ { emoji: "\u{1F1F8}\u{1F1EC}", name: "flag_sg", shortcodes: ["flag_sg"], tags: ["singapore"], group: "Flags" },
543
+ { emoji: "\u{1F1F2}\u{1F1FE}", name: "flag_my", shortcodes: ["flag_my"], tags: ["malaysia"], group: "Flags" },
544
+ { emoji: "\u{1F1F7}\u{1F1F8}", name: "flag_rs", shortcodes: ["flag_rs"], tags: ["serbia"], group: "Flags" },
545
+ { emoji: "\u{1F1E7}\u{1F1E6}", name: "flag_ba", shortcodes: ["flag_ba"], tags: ["bosnia"], group: "Flags" },
546
+ { emoji: "\u{1F1F8}\u{1F1EE}", name: "flag_si", shortcodes: ["flag_si"], tags: ["slovenia"], group: "Flags" }
547
+ ];
548
+
549
+ // src/emoticons.ts
550
+ var emoticons = {
551
+ // Smileys
552
+ ":)": "slightly_smiling_face",
553
+ ":-)": "slightly_smiling_face",
554
+ "(:": "slightly_smiling_face",
555
+ ":D": "grinning_face_with_big_eyes",
556
+ ":-D": "grinning_face_with_big_eyes",
557
+ ";)": "winking_face",
558
+ ";-)": "winking_face",
559
+ ":(": "slightly_frowning_face",
560
+ ":-(": "slightly_frowning_face",
561
+ ":'(": "crying_face",
562
+ ":P": "face_with_tongue",
563
+ ":-P": "face_with_tongue",
564
+ ":p": "face_with_tongue",
565
+ ":O": "face_with_open_mouth",
566
+ ":-O": "face_with_open_mouth",
567
+ ":o": "face_with_open_mouth",
568
+ ":/": "confused_face",
569
+ ":-/": "confused_face",
570
+ ":\\": "confused_face",
571
+ "B)": "smiling_face_with_sunglasses",
572
+ "8)": "smiling_face_with_sunglasses",
573
+ ":*": "kissing_face",
574
+ ":-*": "kissing_face",
575
+ ">:(": "angry_face",
576
+ ">:-(": "angry_face",
577
+ "XD": "face_with_tears_of_joy",
578
+ "xD": "face_with_tears_of_joy",
579
+ ":$": "flushed_face",
580
+ "O:)": "smiling_face_with_halo",
581
+ ">:)": "smiling_face_with_horns",
582
+ ":|": "neutral_face",
583
+ ":-|": "neutral_face",
584
+ // Symbols
585
+ "<3": "red_heart",
586
+ "</3": "broken_heart"
587
+ };
588
+ var emojiSuggestionPluginKey = new PluginKey(
589
+ "emojiSuggestion"
590
+ );
591
+ var INITIAL_STATE = {
592
+ active: false,
593
+ query: "",
594
+ range: null
595
+ };
596
+ function findSuggestionQuery(state, triggerChar, allowSpaces) {
597
+ const { selection } = state;
598
+ if (!selection.empty) return null;
599
+ const { $from } = selection;
600
+ if ($from.parent.type.spec.code) return null;
601
+ const activeMarks = state.storedMarks ?? $from.marks();
602
+ if (activeMarks.some((m) => m.type.name === "code")) return null;
603
+ const textBefore = $from.parent.textBetween(
604
+ 0,
605
+ $from.parentOffset,
606
+ void 0,
607
+ "\uFFFC"
608
+ );
609
+ const triggerIndex = textBefore.lastIndexOf(triggerChar);
610
+ if (triggerIndex === -1) return null;
611
+ if (triggerIndex > 0 && textBefore[triggerIndex - 1] !== " ") return null;
612
+ const queryText = textBefore.slice(triggerIndex + triggerChar.length);
613
+ if (!allowSpaces && queryText.includes(" ")) return null;
614
+ if (!/^[a-zA-Z0-9_+\- ]*$/.test(queryText)) return null;
615
+ const from = $from.start() + triggerIndex;
616
+ const to = $from.pos;
617
+ return { query: queryText, range: { from, to } };
618
+ }
619
+ function createSuggestionPlugin(options) {
620
+ const triggerChar = options.char ?? ":";
621
+ const minQueryLength = options.minQueryLength ?? 0;
622
+ const allowSpaces = options.allowSpaces ?? false;
623
+ const getItems = options.items;
624
+ const getRender = options.render;
625
+ const { nodeType, storage, plainText } = options;
626
+ let renderer = null;
627
+ return new Plugin({
628
+ key: emojiSuggestionPluginKey,
629
+ state: {
630
+ init() {
631
+ return { ...INITIAL_STATE };
632
+ },
633
+ apply(tr, prev, _oldState, newState) {
634
+ if (tr.getMeta(emojiSuggestionPluginKey) === "dismiss") {
635
+ return { ...INITIAL_STATE };
636
+ }
637
+ const isUserInput = tr.docChanged || tr.selectionSet;
638
+ if (!isUserInput) return prev;
639
+ const result = findSuggestionQuery(newState, triggerChar, allowSpaces);
640
+ if (result && result.query.length >= minQueryLength) {
641
+ return {
642
+ active: true,
643
+ query: result.query,
644
+ range: result.range
645
+ };
646
+ }
647
+ if (prev.active) {
648
+ return { ...INITIAL_STATE };
649
+ }
650
+ return prev;
651
+ }
652
+ },
653
+ view() {
654
+ return {
655
+ update(view) {
656
+ const state = emojiSuggestionPluginKey.getState(view.state);
657
+ if (!state) return;
658
+ if (state.active && state.range) {
659
+ const items = getItems ? getItems({ query: state.query }) : storage.searchEmoji(state.query);
660
+ const command = (item) => {
661
+ if (!state.range) return;
662
+ const { tr } = view.state;
663
+ if (plainText) {
664
+ tr.replaceWith(
665
+ state.range.from,
666
+ state.range.to,
667
+ view.state.schema.text(item.emoji)
668
+ );
669
+ } else if (nodeType) {
670
+ const node = nodeType.create({ name: item.name });
671
+ tr.replaceWith(state.range.from, state.range.to, node);
672
+ }
673
+ tr.insertText(" ");
674
+ view.dispatch(tr);
675
+ storage.addFrequentlyUsed(item.name);
676
+ };
677
+ const clientRect = () => {
678
+ if (!state.range) return null;
679
+ try {
680
+ const coords = view.coordsAtPos(state.range.from);
681
+ return new DOMRect(coords.left, coords.top, 0, coords.bottom - coords.top);
682
+ } catch {
683
+ return null;
684
+ }
685
+ };
686
+ const props = {
687
+ query: state.query,
688
+ range: state.range,
689
+ items,
690
+ command,
691
+ clientRect,
692
+ element: view.dom
693
+ };
694
+ if (!renderer && getRender) {
695
+ renderer = getRender();
696
+ renderer.onStart(props);
697
+ } else if (renderer) {
698
+ renderer.onUpdate(props);
699
+ }
700
+ } else if (renderer) {
701
+ renderer.onExit();
702
+ renderer = null;
703
+ }
704
+ },
705
+ destroy() {
706
+ if (renderer) {
707
+ renderer.onExit();
708
+ renderer = null;
709
+ }
710
+ }
711
+ };
712
+ },
713
+ props: {
714
+ // Use handleDOMEvents.keydown instead of handleKeyDown so that
715
+ // suggestion key handling fires BEFORE keymap plugins (which use
716
+ // handleKeyDown and would otherwise intercept Enter/ArrowUp/ArrowDown).
717
+ handleDOMEvents: {
718
+ keydown(view, event) {
719
+ const state = emojiSuggestionPluginKey.getState(view.state);
720
+ if (!state?.active) return false;
721
+ if (event.key === "Escape") {
722
+ event.preventDefault();
723
+ const { tr } = view.state;
724
+ tr.setMeta(emojiSuggestionPluginKey, "dismiss");
725
+ view.dispatch(tr);
726
+ return true;
727
+ }
728
+ if (renderer) {
729
+ const handled = renderer.onKeyDown(event);
730
+ if (handled) {
731
+ event.preventDefault();
732
+ }
733
+ return handled;
734
+ }
735
+ return false;
736
+ }
737
+ }
738
+ }
739
+ });
740
+ }
741
+
742
+ // src/Emoji.ts
743
+ function buildShortcodeMap(items) {
744
+ const map = /* @__PURE__ */ new Map();
745
+ for (const item of items) {
746
+ for (const code of item.shortcodes) {
747
+ map.set(code, item);
748
+ }
749
+ }
750
+ return map;
751
+ }
752
+ function buildNameMap(items) {
753
+ const map = /* @__PURE__ */ new Map();
754
+ for (const item of items) {
755
+ map.set(item.name, item);
756
+ }
757
+ return map;
758
+ }
759
+ function escapeRegex(str) {
760
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
761
+ }
762
+ var Emoji = Node.create({
763
+ name: "emoji",
764
+ group: "inline",
765
+ inline: true,
766
+ atom: true,
767
+ selectable: true,
768
+ draggable: false,
769
+ addOptions() {
770
+ return {
771
+ emojis,
772
+ enableEmoticons: false,
773
+ plainText: false,
774
+ HTMLAttributes: {},
775
+ suggestion: null
776
+ };
777
+ },
778
+ addStorage() {
779
+ return {
780
+ getFrequentlyUsed: () => [],
781
+ addFrequentlyUsed: () => void 0,
782
+ findEmoji: () => void 0,
783
+ searchEmoji: () => []
784
+ };
785
+ },
786
+ onCreate() {
787
+ const { emojis: emojiData } = this.options;
788
+ const nameMap = this.storage._nameMap ?? buildNameMap(emojiData);
789
+ const shortcodeMap = this.storage._shortcodeMap ?? buildShortcodeMap(emojiData);
790
+ const frequencyMap = /* @__PURE__ */ new Map();
791
+ this.storage.findEmoji = (name) => nameMap.get(name);
792
+ this.storage.searchEmoji = (query) => {
793
+ const q = query.toLowerCase();
794
+ return emojiData.filter(
795
+ (item) => item.name.includes(q) || item.shortcodes.some((sc) => sc.includes(q)) || item.tags.some((t) => t.includes(q))
796
+ );
797
+ };
798
+ this.storage.addFrequentlyUsed = (name) => {
799
+ frequencyMap.set(name, (frequencyMap.get(name) ?? 0) + 1);
800
+ };
801
+ this.storage.getFrequentlyUsed = () => [...frequencyMap.entries()].sort((a, b) => b[1] - a[1]).map(([name]) => name);
802
+ this.storage._shortcodeMap = shortcodeMap;
803
+ this.storage._nameMap = nameMap;
804
+ },
805
+ addAttributes() {
806
+ return {
807
+ name: {
808
+ default: null,
809
+ parseHTML: (element) => element.getAttribute("data-name") ?? element.getAttribute("data-emoji-name"),
810
+ renderHTML: (attributes) => {
811
+ if (!attributes["name"]) return {};
812
+ return { "data-name": attributes["name"] };
813
+ }
814
+ }
815
+ };
816
+ },
817
+ parseHTML() {
818
+ return [
819
+ {
820
+ tag: 'span[data-type="emoji"]'
821
+ },
822
+ {
823
+ tag: "span[data-emoji-name]"
824
+ }
825
+ ];
826
+ },
827
+ renderHTML({ node, HTMLAttributes }) {
828
+ const name = node.attrs["name"];
829
+ const nameMap = this.storage._nameMap;
830
+ const item = name ? nameMap?.get(name) : void 0;
831
+ const emoji = item?.emoji ?? "";
832
+ return [
833
+ "span",
834
+ {
835
+ ...this.options.HTMLAttributes,
836
+ ...HTMLAttributes,
837
+ "data-type": "emoji",
838
+ "data-name": name ?? "",
839
+ class: [
840
+ this.options.HTMLAttributes["class"],
841
+ HTMLAttributes["class"],
842
+ "emoji"
843
+ ].filter(Boolean).join(" ")
844
+ },
845
+ emoji
846
+ ];
847
+ },
848
+ // leafText: emoji char for getText() and clipboard
849
+ leafText(node) {
850
+ const name = node.attrs["name"];
851
+ const nameMap = this.storage._nameMap;
852
+ const item = name ? nameMap?.get(name) : void 0;
853
+ return item?.emoji ?? "";
854
+ },
855
+ addToolbarItems() {
856
+ return [
857
+ {
858
+ type: "button",
859
+ name: "emoji",
860
+ command: "insertEmoji",
861
+ commandArgs: ["smile"],
862
+ icon: "smiley",
863
+ label: "Insert Emoji",
864
+ group: "insert",
865
+ priority: 50,
866
+ emitEvent: "insertEmoji"
867
+ }
868
+ ];
869
+ },
870
+ addCommands() {
871
+ return {
872
+ insertEmoji: (name) => ({ tr, dispatch }) => {
873
+ if (tr.selection.$from.parent.type.spec.code) return false;
874
+ if (!this.options.plainText && !this.nodeType) return false;
875
+ const item = this.storage._nameMap?.get(name);
876
+ if (dispatch) {
877
+ if (!item) return false;
878
+ if (this.options.plainText) {
879
+ tr.insertText(item.emoji);
880
+ } else {
881
+ const nt = this.nodeType;
882
+ if (!nt) return false;
883
+ const node = nt.create({ name });
884
+ tr.replaceSelectionWith(node);
885
+ }
886
+ dispatch(tr);
887
+ this.storage.addFrequentlyUsed(name);
888
+ } else if (!item) {
889
+ return true;
890
+ }
891
+ return true;
892
+ },
893
+ suggestEmoji: () => ({ tr, dispatch }) => {
894
+ const suggestion = this.options.suggestion;
895
+ if (!suggestion) return false;
896
+ const char = suggestion.char ?? ":";
897
+ if (dispatch) {
898
+ tr.insertText(char);
899
+ dispatch(tr);
900
+ }
901
+ return true;
902
+ }
903
+ };
904
+ },
905
+ addInputRules() {
906
+ const rules = [];
907
+ const { emojis: emojiData, plainText, enableEmoticons } = this.options;
908
+ this.storage._shortcodeMap ??= buildShortcodeMap(emojiData);
909
+ this.storage._nameMap ??= buildNameMap(emojiData);
910
+ const nodeType = this.nodeType;
911
+ const storage = this.storage;
912
+ rules.push(
913
+ new InputRule(
914
+ /:([a-zA-Z0-9_+-]+):$/,
915
+ (state, match, start, end) => {
916
+ const { $from } = state.selection;
917
+ if ($from.parent.type.spec.code) return null;
918
+ const activeMarks = state.storedMarks ?? $from.marks();
919
+ if (activeMarks.some((m) => m.type.name === "code")) return null;
920
+ const shortcode = match[1];
921
+ if (!shortcode) return null;
922
+ const item = storage._shortcodeMap?.get(shortcode);
923
+ if (!item) return null;
924
+ const { tr } = state;
925
+ if (plainText) {
926
+ tr.replaceWith(start, end, state.schema.text(item.emoji));
927
+ } else if (nodeType) {
928
+ const node = nodeType.create({ name: item.name });
929
+ tr.replaceWith(start, end, node);
930
+ } else {
931
+ return null;
932
+ }
933
+ storage.addFrequentlyUsed(item.name);
934
+ return tr;
935
+ }
936
+ )
937
+ );
938
+ if (enableEmoticons) {
939
+ const emoticonEntries = Object.entries(emoticons);
940
+ const nameMap = this.storage._nameMap;
941
+ emoticonEntries.sort((a, b) => b[0].length - a[0].length);
942
+ for (const [emoticon, emojiName] of emoticonEntries) {
943
+ const item = nameMap.get(emojiName);
944
+ if (!item) continue;
945
+ const pattern = new RegExp(`(?:^|\\s)(${escapeRegex(emoticon)})\\s$`);
946
+ rules.push(
947
+ new InputRule(
948
+ pattern,
949
+ (state, match, start) => {
950
+ const { $from } = state.selection;
951
+ if ($from.parent.type.spec.code) return null;
952
+ const activeMarks = state.storedMarks ?? $from.marks();
953
+ if (activeMarks.some((m) => m.type.name === "code")) return null;
954
+ const { tr } = state;
955
+ const fullMatch = match[0];
956
+ const emoticonText = match[1];
957
+ if (!emoticonText) return null;
958
+ const emoticonStart = start + fullMatch.indexOf(emoticonText);
959
+ const emoticonEnd = emoticonStart + emoticonText.length;
960
+ if (plainText) {
961
+ tr.replaceWith(emoticonStart, emoticonEnd, state.schema.text(item.emoji));
962
+ } else if (nodeType) {
963
+ const node = nodeType.create({ name: item.name });
964
+ tr.replaceWith(emoticonStart, emoticonEnd, node);
965
+ } else {
966
+ return null;
967
+ }
968
+ storage.addFrequentlyUsed(item.name);
969
+ return tr;
970
+ }
971
+ )
972
+ );
973
+ }
974
+ }
975
+ return rules;
976
+ },
977
+ addProseMirrorPlugins() {
978
+ const { suggestion } = this.options;
979
+ if (!suggestion) return [];
980
+ return [
981
+ createSuggestionPlugin({
982
+ ...suggestion,
983
+ editor: this.editor,
984
+ nodeType: this.nodeType,
985
+ storage: this.storage,
986
+ plainText: this.options.plainText
987
+ })
988
+ ];
989
+ }
990
+ });
991
+ var MAX_ITEMS = 10;
992
+ function createEmojiSuggestionRenderer() {
993
+ return () => {
994
+ let container = null;
995
+ let currentProps = null;
996
+ let selectedIndex = 0;
997
+ let cleanupFloating = null;
998
+ function render() {
999
+ if (!container || !currentProps) return;
1000
+ const { items, command } = currentProps;
1001
+ const visible = items.slice(0, MAX_ITEMS);
1002
+ container.innerHTML = "";
1003
+ if (visible.length === 0) {
1004
+ const empty = document.createElement("div");
1005
+ empty.className = "dm-emoji-suggestion-empty";
1006
+ empty.textContent = "No emoji found";
1007
+ container.appendChild(empty);
1008
+ return;
1009
+ }
1010
+ visible.forEach((item, i) => {
1011
+ const btn = document.createElement("button");
1012
+ btn.type = "button";
1013
+ btn.className = "dm-emoji-suggestion-item" + (i === selectedIndex ? " dm-emoji-suggestion-item--selected" : "");
1014
+ btn.setAttribute("role", "option");
1015
+ btn.setAttribute("aria-selected", String(i === selectedIndex));
1016
+ const emojiSpan = document.createElement("span");
1017
+ emojiSpan.className = "dm-emoji-suggestion-emoji";
1018
+ emojiSpan.textContent = item.emoji;
1019
+ const nameSpan = document.createElement("span");
1020
+ nameSpan.className = "dm-emoji-suggestion-name";
1021
+ nameSpan.textContent = item.name.replace(/_/g, " ");
1022
+ btn.appendChild(emojiSpan);
1023
+ btn.appendChild(nameSpan);
1024
+ btn.addEventListener("mousedown", (e) => {
1025
+ e.preventDefault();
1026
+ e.stopPropagation();
1027
+ });
1028
+ btn.addEventListener("click", () => {
1029
+ command(item);
1030
+ });
1031
+ btn.addEventListener("mouseenter", () => {
1032
+ if (selectedIndex === i) return;
1033
+ const prev = container?.querySelector(".dm-emoji-suggestion-item--selected");
1034
+ if (prev) {
1035
+ prev.classList.remove("dm-emoji-suggestion-item--selected");
1036
+ prev.setAttribute("aria-selected", "false");
1037
+ }
1038
+ selectedIndex = i;
1039
+ btn.classList.add("dm-emoji-suggestion-item--selected");
1040
+ btn.setAttribute("aria-selected", "true");
1041
+ });
1042
+ container?.appendChild(btn);
1043
+ });
1044
+ }
1045
+ function updatePosition() {
1046
+ if (!container || !currentProps?.clientRect) return;
1047
+ cleanupFloating?.();
1048
+ const virtualEl = {
1049
+ getBoundingClientRect: () => {
1050
+ const rect = currentProps?.clientRect?.();
1051
+ return rect ?? new DOMRect(0, 0, 0, 0);
1052
+ }
1053
+ };
1054
+ cleanupFloating = positionFloatingOnce(virtualEl, container, {
1055
+ placement: "bottom-start",
1056
+ offsetValue: 4
1057
+ });
1058
+ }
1059
+ return {
1060
+ onStart(props) {
1061
+ currentProps = props;
1062
+ selectedIndex = 0;
1063
+ container = document.createElement("div");
1064
+ container.className = "dm-emoji-suggestion";
1065
+ container.setAttribute("role", "listbox");
1066
+ const editorEl = props.element.closest(".dm-editor");
1067
+ const appendTarget = editorEl ?? document.body;
1068
+ appendTarget.appendChild(container);
1069
+ render();
1070
+ updatePosition();
1071
+ },
1072
+ onUpdate(props) {
1073
+ currentProps = props;
1074
+ selectedIndex = 0;
1075
+ render();
1076
+ updatePosition();
1077
+ },
1078
+ onExit() {
1079
+ cleanupFloating?.();
1080
+ cleanupFloating = null;
1081
+ container?.remove();
1082
+ container = null;
1083
+ currentProps = null;
1084
+ selectedIndex = 0;
1085
+ },
1086
+ onKeyDown(event) {
1087
+ if (!currentProps) return false;
1088
+ const maxIndex = Math.min(currentProps.items.length, MAX_ITEMS) - 1;
1089
+ if (event.key === "ArrowDown") {
1090
+ selectedIndex = Math.min(selectedIndex + 1, maxIndex);
1091
+ render();
1092
+ return true;
1093
+ }
1094
+ if (event.key === "ArrowUp") {
1095
+ selectedIndex = Math.max(selectedIndex - 1, 0);
1096
+ render();
1097
+ return true;
1098
+ }
1099
+ if (event.key === "Enter") {
1100
+ const item = currentProps.items[selectedIndex];
1101
+ if (item) currentProps.command(item);
1102
+ return true;
1103
+ }
1104
+ return false;
1105
+ }
1106
+ };
1107
+ };
1108
+ }
1109
+
1110
+ export { Emoji, allEmojis, createEmojiSuggestionRenderer, createSuggestionPlugin, Emoji as default, emojiSuggestionPluginKey, emojis, emoticons };
1111
+ //# sourceMappingURL=index.js.map
1112
+ //# sourceMappingURL=index.js.map