@underverse-ui/underverse 1.0.5 → 1.0.7
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.cjs +1376 -265
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1322 -210
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -19605,9 +19605,9 @@ function useSmartLocale() {
|
|
|
19605
19605
|
}
|
|
19606
19606
|
|
|
19607
19607
|
// ../../components/ui/UEditor/UEditor.tsx
|
|
19608
|
-
var
|
|
19608
|
+
var import_react50 = require("react");
|
|
19609
19609
|
var import_next_intl6 = require("next-intl");
|
|
19610
|
-
var
|
|
19610
|
+
var import_react51 = require("@tiptap/react");
|
|
19611
19611
|
|
|
19612
19612
|
// ../../components/ui/UEditor/extensions.ts
|
|
19613
19613
|
var import_extension_document = __toESM(require("@tiptap/extension-document"), 1);
|
|
@@ -19966,12 +19966,924 @@ var ClipboardImages = import_core2.Extension.create({
|
|
|
19966
19966
|
}
|
|
19967
19967
|
});
|
|
19968
19968
|
|
|
19969
|
-
// ../../components/ui/UEditor/
|
|
19970
|
-
var import_react41 = require("react");
|
|
19971
|
-
var import_extension_image = __toESM(require("@tiptap/extension-image"), 1);
|
|
19969
|
+
// ../../components/ui/UEditor/emoji-suggestion.tsx
|
|
19972
19970
|
var import_core3 = require("@tiptap/core");
|
|
19973
|
-
var
|
|
19971
|
+
var import_suggestion2 = __toESM(require("@tiptap/suggestion"), 1);
|
|
19972
|
+
var import_react41 = require("@tiptap/react");
|
|
19973
|
+
var import_state2 = require("@tiptap/pm/state");
|
|
19974
|
+
var import_react42 = require("react");
|
|
19975
|
+
var import_lucide_react39 = require("lucide-react");
|
|
19976
|
+
var import_tippy2 = __toESM(require("tippy.js"), 1);
|
|
19977
|
+
|
|
19978
|
+
// ../../components/ui/UEditor/emojis.ts
|
|
19979
|
+
var EMOJI_LIST = [
|
|
19980
|
+
{
|
|
19981
|
+
id: "smileys_people",
|
|
19982
|
+
name: "Smileys & People",
|
|
19983
|
+
emojis: [
|
|
19984
|
+
{ emoji: "\u{1F600}", name: "grinning_face" },
|
|
19985
|
+
{ emoji: "\u{1F603}", name: "big_eyes_grin" },
|
|
19986
|
+
{ emoji: "\u{1F604}", name: "smiling_eyes_grin" },
|
|
19987
|
+
{ emoji: "\u{1F601}", name: "beaming_smile" },
|
|
19988
|
+
{ emoji: "\u{1F606}", name: "squinting_laugh" },
|
|
19989
|
+
{ emoji: "\u{1F605}", name: "sweat_grin" },
|
|
19990
|
+
{ emoji: "\u{1F602}", name: "joy_tears" },
|
|
19991
|
+
{ emoji: "\u{1F923}", name: "rofl_laugh" },
|
|
19992
|
+
{ emoji: "\u{1F972}", name: "tear_smile" },
|
|
19993
|
+
{ emoji: "\u263A\uFE0F", name: "warm_smile" },
|
|
19994
|
+
{ emoji: "\u{1F60A}", name: "blush_smile" },
|
|
19995
|
+
{ emoji: "\u{1F607}", name: "halo_smile" },
|
|
19996
|
+
{ emoji: "\u{1F642}", name: "slight_smile" },
|
|
19997
|
+
{ emoji: "\u{1F643}", name: "upside_down" },
|
|
19998
|
+
{ emoji: "\u{1F609}", name: "wink_face" },
|
|
19999
|
+
{ emoji: "\u{1F60C}", name: "relieved_face" },
|
|
20000
|
+
{ emoji: "\u{1F60D}", name: "heart_eyes" },
|
|
20001
|
+
{ emoji: "\u{1F970}", name: "hearts_face" },
|
|
20002
|
+
{ emoji: "\u{1F618}", name: "blow_kiss" },
|
|
20003
|
+
{ emoji: "\u{1F617}", name: "kissing_face" },
|
|
20004
|
+
{ emoji: "\u{1F619}", name: "smiling_kiss" },
|
|
20005
|
+
{ emoji: "\u{1F61A}", name: "closed_eyes_kiss" },
|
|
20006
|
+
{ emoji: "\u{1F60B}", name: "yummy_face" },
|
|
20007
|
+
{ emoji: "\u{1F61B}", name: "tongue_out" },
|
|
20008
|
+
{ emoji: "\u{1F61D}", name: "squinting_tongue" },
|
|
20009
|
+
{ emoji: "\u{1F61C}", name: "wink_tongue" },
|
|
20010
|
+
{ emoji: "\u{1F92A}", name: "zany_face" },
|
|
20011
|
+
{ emoji: "\u{1F928}", name: "raised_eyebrow" },
|
|
20012
|
+
{ emoji: "\u{1F9D0}", name: "monocle_face" },
|
|
20013
|
+
{ emoji: "\u{1F913}", name: "nerd_face" },
|
|
20014
|
+
{ emoji: "\u{1F60E}", name: "sunglasses_face" },
|
|
20015
|
+
{ emoji: "\u{1F978}", name: "disguised_face" },
|
|
20016
|
+
{ emoji: "\u{1F929}", name: "star_struck" },
|
|
20017
|
+
{ emoji: "\u{1F973}", name: "partying_face" },
|
|
20018
|
+
{ emoji: "\u{1F60F}", name: "smirking_face" },
|
|
20019
|
+
{ emoji: "\u{1F612}", name: "unamused_face" },
|
|
20020
|
+
{ emoji: "\u{1F61E}", name: "disappointed_face" },
|
|
20021
|
+
{ emoji: "\u{1F614}", name: "pensive_face" },
|
|
20022
|
+
{ emoji: "\u{1F61F}", name: "worried_face" },
|
|
20023
|
+
{ emoji: "\u{1F615}", name: "confused_face" },
|
|
20024
|
+
{ emoji: "\u{1F641}", name: "slight_frown" },
|
|
20025
|
+
{ emoji: "\u2639\uFE0F", name: "frowning_face" },
|
|
20026
|
+
{ emoji: "\u{1F623}", name: "persevering_face" },
|
|
20027
|
+
{ emoji: "\u{1F616}", name: "confounded_face" },
|
|
20028
|
+
{ emoji: "\u{1F62B}", name: "tired_face" },
|
|
20029
|
+
{ emoji: "\u{1F629}", name: "weary_face" },
|
|
20030
|
+
{ emoji: "\u{1F97A}", name: "pleading_face" },
|
|
20031
|
+
{ emoji: "\u{1F622}", name: "crying_face" },
|
|
20032
|
+
{ emoji: "\u{1F62D}", name: "loudly_crying" },
|
|
20033
|
+
{ emoji: "\u{1F624}", name: "steam_nose" },
|
|
20034
|
+
{ emoji: "\u{1F621}", name: "pouting_face" },
|
|
20035
|
+
{ emoji: "\u{1F92C}", name: "cursing_face" },
|
|
20036
|
+
{ emoji: "\u{1F92F}", name: "exploding_head" },
|
|
20037
|
+
{ emoji: "\u{1F633}", name: "flushed_face" },
|
|
20038
|
+
{ emoji: "\u{1F975}", name: "hot_face" },
|
|
20039
|
+
{ emoji: "\u{1F976}", name: "cold_face" },
|
|
20040
|
+
{ emoji: "\u{1F631}", name: "screaming_fear" },
|
|
20041
|
+
{ emoji: "\u{1F628}", name: "fearful_face" },
|
|
20042
|
+
{ emoji: "\u{1F630}", name: "anxious_sweat" },
|
|
20043
|
+
{ emoji: "\u{1F625}", name: "relieved_sad" },
|
|
20044
|
+
{ emoji: "\u{1F613}", name: "downcast_sweat" },
|
|
20045
|
+
{ emoji: "\u{1F917}", name: "hugging_face" },
|
|
20046
|
+
{ emoji: "\u{1F914}", name: "thinking_face" },
|
|
20047
|
+
{ emoji: "\u{1F92D}", name: "hand_over_mouth" },
|
|
20048
|
+
{ emoji: "\u{1F92B}", name: "shushing_face" },
|
|
20049
|
+
{ emoji: "\u{1F925}", name: "lying_face" },
|
|
20050
|
+
{ emoji: "\u{1F636}", name: "no_mouth" },
|
|
20051
|
+
{ emoji: "\u{1F610}", name: "neutral_face" },
|
|
20052
|
+
{ emoji: "\u{1F611}", name: "expressionless_face" },
|
|
20053
|
+
{ emoji: "\u{1F62C}", name: "grimacing_face" },
|
|
20054
|
+
{ emoji: "\u{1F644}", name: "rolling_eyes" },
|
|
20055
|
+
{ emoji: "\u{1F62F}", name: "hushed_face" },
|
|
20056
|
+
{ emoji: "\u{1F626}", name: "frowning_open" },
|
|
20057
|
+
{ emoji: "\u{1F627}", name: "anguished_face" },
|
|
20058
|
+
{ emoji: "\u{1F62E}", name: "open_mouth" },
|
|
20059
|
+
{ emoji: "\u{1F632}", name: "astonished_face" },
|
|
20060
|
+
{ emoji: "\u{1F971}", name: "yawning_face" },
|
|
20061
|
+
{ emoji: "\u{1F634}", name: "sleeping_face" },
|
|
20062
|
+
{ emoji: "\u{1F924}", name: "drooling_face" },
|
|
20063
|
+
{ emoji: "\u{1F62A}", name: "sleepy_face" },
|
|
20064
|
+
{ emoji: "\u{1F635}", name: "dizzy_face" },
|
|
20065
|
+
{ emoji: "\u{1F910}", name: "zipper_mouth" },
|
|
20066
|
+
{ emoji: "\u{1F974}", name: "woozy_face" },
|
|
20067
|
+
{ emoji: "\u{1F922}", name: "nauseated_face" },
|
|
20068
|
+
{ emoji: "\u{1F92E}", name: "face_vomiting" },
|
|
20069
|
+
{ emoji: "\u{1F927}", name: "sneezing_face" },
|
|
20070
|
+
{ emoji: "\u{1F637}", name: "medical_mask" },
|
|
20071
|
+
{ emoji: "\u{1F912}", name: "thermometer_face" },
|
|
20072
|
+
{ emoji: "\u{1F915}", name: "bandage_head" },
|
|
20073
|
+
{ emoji: "\u{1F911}", name: "money_mouth" },
|
|
20074
|
+
{ emoji: "\u{1F920}", name: "cowboy_hat" },
|
|
20075
|
+
{ emoji: "\u{1F608}", name: "devil_smile" },
|
|
20076
|
+
{ emoji: "\u{1F47F}", name: "devil_angry" },
|
|
20077
|
+
{ emoji: "\u{1F479}", name: "ogre_mask" },
|
|
20078
|
+
{ emoji: "\u{1F47A}", name: "goblin_mask" },
|
|
20079
|
+
{ emoji: "\u{1F921}", name: "clown_face" },
|
|
20080
|
+
{ emoji: "\u{1F4A9}", name: "poop_pile" },
|
|
20081
|
+
{ emoji: "\u{1F47B}", name: "ghost_spooky" },
|
|
20082
|
+
{ emoji: "\u{1F480}", name: "skull_head" },
|
|
20083
|
+
{ emoji: "\u2620\uFE0F", name: "skull_crossbones" },
|
|
20084
|
+
{ emoji: "\u{1F47D}", name: "alien_face" },
|
|
20085
|
+
{ emoji: "\u{1F47E}", name: "alien_monster" },
|
|
20086
|
+
{ emoji: "\u{1F916}", name: "robot_face" },
|
|
20087
|
+
{ emoji: "\u{1F383}", name: "pumpkin_jack" },
|
|
20088
|
+
{ emoji: "\u{1F63A}", name: "cat_grin" },
|
|
20089
|
+
{ emoji: "\u{1F638}", name: "cat_smile" },
|
|
20090
|
+
{ emoji: "\u{1F639}", name: "cat_joy" },
|
|
20091
|
+
{ emoji: "\u{1F63B}", name: "cat_heart_eyes" },
|
|
20092
|
+
{ emoji: "\u{1F63C}", name: "cat_smirk" },
|
|
20093
|
+
{ emoji: "\u{1F63D}", name: "cat_kiss" },
|
|
20094
|
+
{ emoji: "\u{1F640}", name: "cat_weary" },
|
|
20095
|
+
{ emoji: "\u{1F63F}", name: "cat_crying" },
|
|
20096
|
+
{ emoji: "\u{1F63E}", name: "cat_pouting" },
|
|
20097
|
+
{ emoji: "\u{1F44B}", name: "waving_hand" },
|
|
20098
|
+
{ emoji: "\u{1F91A}", name: "raised_back_hand" },
|
|
20099
|
+
{ emoji: "\u{1F590}\uFE0F", name: "splayed_fingers" },
|
|
20100
|
+
{ emoji: "\u270B", name: "raised_hand" },
|
|
20101
|
+
{ emoji: "\u{1F596}", name: "vulcan_salute" },
|
|
20102
|
+
{ emoji: "\u{1F44C}", name: "ok_hand" },
|
|
20103
|
+
{ emoji: "\u{1F90C}", name: "pinched_fingers" },
|
|
20104
|
+
{ emoji: "\u{1F90F}", name: "pinching_hand" },
|
|
20105
|
+
{ emoji: "\u270C\uFE0F", name: "victory_hand" },
|
|
20106
|
+
{ emoji: "\u{1F91E}", name: "crossed_fingers" },
|
|
20107
|
+
{ emoji: "\u{1F91F}", name: "love_you" },
|
|
20108
|
+
{ emoji: "\u{1F918}", name: "rock_on" },
|
|
20109
|
+
{ emoji: "\u{1F919}", name: "call_me" },
|
|
20110
|
+
{ emoji: "\u{1F448}", name: "point_left" },
|
|
20111
|
+
{ emoji: "\u{1F449}", name: "point_right" },
|
|
20112
|
+
{ emoji: "\u{1F446}", name: "point_up" },
|
|
20113
|
+
{ emoji: "\u{1F595}", name: "middle_finger" },
|
|
20114
|
+
{ emoji: "\u{1F447}", name: "point_down" },
|
|
20115
|
+
{ emoji: "\u261D\uFE0F", name: "index_up" },
|
|
20116
|
+
{ emoji: "\u{1F44D}", name: "thumbs_up" },
|
|
20117
|
+
{ emoji: "\u{1F44E}", name: "thumbs_down" },
|
|
20118
|
+
{ emoji: "\u270A", name: "raised_fist" },
|
|
20119
|
+
{ emoji: "\u{1F44A}", name: "oncoming_fist" },
|
|
20120
|
+
{ emoji: "\u{1F91B}", name: "left_fist" },
|
|
20121
|
+
{ emoji: "\u{1F91C}", name: "right_fist" },
|
|
20122
|
+
{ emoji: "\u{1F44F}", name: "clapping_hands" },
|
|
20123
|
+
{ emoji: "\u{1F64C}", name: "raising_hands" },
|
|
20124
|
+
{ emoji: "\u{1F450}", name: "open_hands" },
|
|
20125
|
+
{ emoji: "\u{1F932}", name: "palms_up" },
|
|
20126
|
+
{ emoji: "\u{1F91D}", name: "handshake" },
|
|
20127
|
+
{ emoji: "\u{1F64F}", name: "folded_hands" },
|
|
20128
|
+
{ emoji: "\u270D\uFE0F", name: "writing_hand" },
|
|
20129
|
+
{ emoji: "\u{1F485}", name: "nail_polish" },
|
|
20130
|
+
{ emoji: "\u{1F933}", name: "selfie_hand" },
|
|
20131
|
+
{ emoji: "\u{1F4AA}", name: "flex_biceps" },
|
|
20132
|
+
{ emoji: "\u{1F9BE}", name: "robot_arm" },
|
|
20133
|
+
{ emoji: "\u{1F9BF}", name: "robot_leg" },
|
|
20134
|
+
{ emoji: "\u{1F9B5}", name: "leg_foot" },
|
|
20135
|
+
{ emoji: "\u{1F9B6}", name: "foot_leg" },
|
|
20136
|
+
{ emoji: "\u{1F442}", name: "ear_listen" },
|
|
20137
|
+
{ emoji: "\u{1F9BB}", name: "ear_hearing_aid" },
|
|
20138
|
+
{ emoji: "\u{1F443}", name: "nose_smell" },
|
|
20139
|
+
{ emoji: "\u{1F9E0}", name: "brain_mind" },
|
|
20140
|
+
{ emoji: "\u{1FAC0}", name: "anatomical_heart" },
|
|
20141
|
+
{ emoji: "\u{1FAC1}", name: "lungs_organ" },
|
|
20142
|
+
{ emoji: "\u{1F9B7}", name: "tooth_dentist" },
|
|
20143
|
+
{ emoji: "\u{1F9B4}", name: "bone_skeleton" },
|
|
20144
|
+
{ emoji: "\u{1F440}", name: "eyes_look" },
|
|
20145
|
+
{ emoji: "\u{1F441}\uFE0F", name: "eye_look" },
|
|
20146
|
+
{ emoji: "\u{1F445}", name: "tongue_lick" },
|
|
20147
|
+
{ emoji: "\u{1F444}", name: "mouth_lips" },
|
|
20148
|
+
{ emoji: "\u{1F48B}", name: "kiss_mark" },
|
|
20149
|
+
{ emoji: "\u{1FA78}", name: "blood_drop" },
|
|
20150
|
+
{ emoji: "\u{1F476}", name: "baby_face" },
|
|
20151
|
+
{ emoji: "\u{1F9D2}", name: "child_face" },
|
|
20152
|
+
{ emoji: "\u{1F466}", name: "boy_face" },
|
|
20153
|
+
{ emoji: "\u{1F467}", name: "girl_face" },
|
|
20154
|
+
{ emoji: "\u{1F9D1}", name: "person_face" },
|
|
20155
|
+
{ emoji: "\u{1F471}", name: "blond_person" },
|
|
20156
|
+
{ emoji: "\u{1F468}", name: "man_face" },
|
|
20157
|
+
{ emoji: "\u{1F9D4}", name: "beard_person" },
|
|
20158
|
+
{ emoji: "\u{1F469}", name: "woman_face" },
|
|
20159
|
+
{ emoji: "\u{1F9D3}", name: "older_person" },
|
|
20160
|
+
{ emoji: "\u{1F474}", name: "old_man" },
|
|
20161
|
+
{ emoji: "\u{1F475}", name: "old_woman" },
|
|
20162
|
+
{ emoji: "\u{1F472}", name: "skullcap_person" },
|
|
20163
|
+
{ emoji: "\u{1F473}", name: "turban_person" },
|
|
20164
|
+
{ emoji: "\u{1F9D5}", name: "headscarf_woman" },
|
|
20165
|
+
{ emoji: "\u{1F46E}", name: "police_officer" },
|
|
20166
|
+
{ emoji: "\u{1F477}", name: "construction_worker" },
|
|
20167
|
+
{ emoji: "\u{1F482}", name: "guard_person" },
|
|
20168
|
+
{ emoji: "\u{1F575}\uFE0F", name: "detective_spy" },
|
|
20169
|
+
{ emoji: "\u{1F469}\u200D\u2695\uFE0F", name: "woman_doctor" },
|
|
20170
|
+
{ emoji: "\u{1F468}\u200D\u2695\uFE0F", name: "man_doctor" },
|
|
20171
|
+
{ emoji: "\u{1F469}\u200D\u{1F33E}", name: "woman_farmer" },
|
|
20172
|
+
{ emoji: "\u{1F468}\u200D\u{1F33E}", name: "man_farmer" },
|
|
20173
|
+
{ emoji: "\u{1F469}\u200D\u{1F373}", name: "woman_cook" },
|
|
20174
|
+
{ emoji: "\u{1F468}\u200D\u{1F373}", name: "man_cook" },
|
|
20175
|
+
{ emoji: "\u{1F469}\u200D\u{1F393}", name: "woman_student" },
|
|
20176
|
+
{ emoji: "\u{1F468}\u200D\u{1F393}", name: "man_student" },
|
|
20177
|
+
{ emoji: "\u{1F469}\u200D\u{1F3A4}", name: "woman_singer" },
|
|
20178
|
+
{ emoji: "\u{1F468}\u200D\u{1F3A4}", name: "man_singer" },
|
|
20179
|
+
{ emoji: "\u{1F469}\u200D\u{1F3EB}", name: "woman_teacher" },
|
|
20180
|
+
{ emoji: "\u{1F468}\u200D\u{1F3EB}", name: "man_teacher" },
|
|
20181
|
+
{ emoji: "\u{1F469}\u200D", name: "woman_factory" },
|
|
20182
|
+
{ emoji: "\u{1F468}\u200D", name: "man_factory" },
|
|
20183
|
+
{ emoji: "\u{1F469}\u200D\u{1F4BB}", name: "woman_tech" },
|
|
20184
|
+
{ emoji: "\u{1F468}\u200D\u{1F4BB}", name: "man_tech" },
|
|
20185
|
+
{ emoji: "\u{1F469}\u200D\u{1F4BC}", name: "woman_office" },
|
|
20186
|
+
{ emoji: "\u{1F468}\u200D\u{1F4BC}", name: "man_office" },
|
|
20187
|
+
{ emoji: "\u{1F469}\u200D\u{1F527}", name: "woman_mechanic" },
|
|
20188
|
+
{ emoji: "\u{1F468}\u200D\u{1F527}", name: "man_mechanic" },
|
|
20189
|
+
{ emoji: "\u{1F469}\u200D\u{1F52C}", name: "woman_scientist" },
|
|
20190
|
+
{ emoji: "\u{1F468}\u200D\u{1F52C}", name: "man_scientist" },
|
|
20191
|
+
{ emoji: "\u{1F469}\u200D\u{1F3A8}", name: "woman_artist" },
|
|
20192
|
+
{ emoji: "\u{1F468}\u200D\u{1F3A8}", name: "man_artist" },
|
|
20193
|
+
{ emoji: "\u{1F469}\u200D\u{1F692}", name: "woman_firefighter" },
|
|
20194
|
+
{ emoji: "\u{1F468}\u200D\u{1F692}", name: "man_firefighter" },
|
|
20195
|
+
{ emoji: "\u{1F469}\u200D\u2708\uFE0F", name: "woman_pilot" },
|
|
20196
|
+
{ emoji: "\u{1F468}\u200D\u2708\uFE0F", name: "man_pilot" },
|
|
20197
|
+
{ emoji: "\u{1F469}\u200D\u{1F680}", name: "woman_astronaut" },
|
|
20198
|
+
{ emoji: "\u{1F468}\u200D\u{1F680}", name: "man_astronaut" },
|
|
20199
|
+
{ emoji: "\u{1F469}\u200D\u2696\uFE0F", name: "woman_judge" },
|
|
20200
|
+
{ emoji: "\u{1F468}\u200D\u2696\uFE0F", name: "man_judge" },
|
|
20201
|
+
{ emoji: "\u{1F470}", name: "bride_wedding" },
|
|
20202
|
+
{ emoji: "\u{1F935}", name: "groom_tuxedo" },
|
|
20203
|
+
{ emoji: "\u{1F478}", name: "princess_crown" },
|
|
20204
|
+
{ emoji: "\u{1F934}", name: "prince_crown" },
|
|
20205
|
+
{ emoji: "\u{1F9B8}", name: "superhero_person" },
|
|
20206
|
+
{ emoji: "\u{1F9B9}", name: "supervillain_person" },
|
|
20207
|
+
{ emoji: "\u{1F936}", name: "mrs_claus" },
|
|
20208
|
+
{ emoji: "\u{1F385}", name: "santa_claus" },
|
|
20209
|
+
{ emoji: "\u{1F9D9}", name: "mage_wizard" },
|
|
20210
|
+
{ emoji: "\u{1F9DD}", name: "elf_fantasy" },
|
|
20211
|
+
{ emoji: "\u{1F9DB}", name: "vampire_dracula" },
|
|
20212
|
+
{ emoji: "\u{1F9DF}", name: "zombie_undead" },
|
|
20213
|
+
{ emoji: "\u{1F9DE}", name: "genie_magic" },
|
|
20214
|
+
{ emoji: "\u{1F9DC}", name: "mermaid_person" },
|
|
20215
|
+
{ emoji: "\u{1F9DA}", name: "fairy_magic" },
|
|
20216
|
+
{ emoji: "\u{1F47C}", name: "angel_baby" },
|
|
20217
|
+
{ emoji: "\u{1F930}", name: "pregnant_woman" },
|
|
20218
|
+
{ emoji: "\u{1F931}", name: "breast_feeding" },
|
|
20219
|
+
{ emoji: "\u{1F647}", name: "bowing_person" },
|
|
20220
|
+
{ emoji: "\u{1F481}", name: "tipping_hand" },
|
|
20221
|
+
{ emoji: "\u{1F645}", name: "gesturing_no" },
|
|
20222
|
+
{ emoji: "\u{1F646}", name: "gesturing_ok" },
|
|
20223
|
+
{ emoji: "\u{1F64B}", name: "raising_hand" },
|
|
20224
|
+
{ emoji: "\u{1F9CF}", name: "deaf_person" },
|
|
20225
|
+
{ emoji: "\u{1F926}", name: "face_palm" },
|
|
20226
|
+
{ emoji: "\u{1F937}", name: "shrugging_person" },
|
|
20227
|
+
{ emoji: "\u{1F64E}", name: "pouting_person" },
|
|
20228
|
+
{ emoji: "\u{1F64D}", name: "frowning_person" },
|
|
20229
|
+
{ emoji: "\u{1F487}", name: "haircut_person" },
|
|
20230
|
+
{ emoji: "\u{1F486}", name: "massage_person" },
|
|
20231
|
+
{ emoji: "\u{1F9D6}", name: "sauna_person" },
|
|
20232
|
+
{ emoji: "\u{1F483}", name: "woman_dancing" },
|
|
20233
|
+
{ emoji: "\u{1F57A}", name: "man_dancing" },
|
|
20234
|
+
{ emoji: "\u{1F46F}", name: "bunny_friends" },
|
|
20235
|
+
{ emoji: "\u{1F574}\uFE0F", name: "levitating_suit" },
|
|
20236
|
+
{ emoji: "\u{1F6B6}", name: "walking_person" },
|
|
20237
|
+
{ emoji: "\u{1F3C3}", name: "running_person" },
|
|
20238
|
+
{ emoji: "\u{1F9CD}", name: "standing_person" },
|
|
20239
|
+
{ emoji: "\u{1F9CE}", name: "kneeling_person" },
|
|
20240
|
+
{ emoji: "\u{1F468}\u200D\u{1F9AF}", name: "blind_cane" },
|
|
20241
|
+
{ emoji: "\u{1F468}\u200D\u{1F9BC}", name: "motor_wheelchair" },
|
|
20242
|
+
{ emoji: "\u{1F468}\u200D\u{1F9BD}", name: "manual_wheelchair" },
|
|
20243
|
+
{ emoji: "\u{1F9D7}", name: "climbing_person" },
|
|
20244
|
+
{ emoji: "\u{1F93A}", name: "fencing_person" },
|
|
20245
|
+
{ emoji: "\u{1F3C7}", name: "horse_racing" },
|
|
20246
|
+
{ emoji: "\u26F7\uFE0F", name: "skier_snow" },
|
|
20247
|
+
{ emoji: "\u{1F3C2}", name: "snowboarder_snow" },
|
|
20248
|
+
{ emoji: "\u{1F3CC}\uFE0F", name: "golfing_person" },
|
|
20249
|
+
{ emoji: "\u{1F3C4}", name: "surfing_person" },
|
|
20250
|
+
{ emoji: "\u{1F6A3}", name: "rowing_person" },
|
|
20251
|
+
{ emoji: "\u{1F3CA}", name: "swimming_person" },
|
|
20252
|
+
{ emoji: "\u26F9\uFE0F", name: "basketball_person" },
|
|
20253
|
+
{ emoji: "\u{1F3CB}\uFE0F", name: "lifting_weights" },
|
|
20254
|
+
{ emoji: "\u{1F6B4}", name: "biking_person" },
|
|
20255
|
+
{ emoji: "\u{1F6B5}", name: "mountain_biking" },
|
|
20256
|
+
{ emoji: "\u{1F938}", name: "cartwheel_person" },
|
|
20257
|
+
{ emoji: "\u{1F93C}", name: "wrestling_people" },
|
|
20258
|
+
{ emoji: "\u{1F93D}", name: "water_polo" },
|
|
20259
|
+
{ emoji: "\u{1F93E}", name: "handball_person" },
|
|
20260
|
+
{ emoji: "\u{1F939}", name: "juggling_person" },
|
|
20261
|
+
{ emoji: "\u{1F9D8}", name: "yoga_lotus" },
|
|
20262
|
+
{ emoji: "\u{1F6C0}", name: "bath_person" },
|
|
20263
|
+
{ emoji: "\u{1F6CC}", name: "bed_person" }
|
|
20264
|
+
]
|
|
20265
|
+
},
|
|
20266
|
+
{
|
|
20267
|
+
id: "animals_nature",
|
|
20268
|
+
name: "Animals & Nature",
|
|
20269
|
+
emojis: [
|
|
20270
|
+
{ emoji: "\u{1F435}", name: "monkey_face" },
|
|
20271
|
+
{ emoji: "\u{1F436}", name: "dog_face" },
|
|
20272
|
+
{ emoji: "\u{1F43A}", name: "wolf_face" },
|
|
20273
|
+
{ emoji: "\u{1F431}", name: "cat_face" },
|
|
20274
|
+
{ emoji: "\u{1F981}", name: "lion_face" },
|
|
20275
|
+
{ emoji: "\u{1F42F}", name: "tiger_face" },
|
|
20276
|
+
{ emoji: "\u{1F434}", name: "horse_face" },
|
|
20277
|
+
{ emoji: "\u{1F984}", name: "unicorn_face" },
|
|
20278
|
+
{ emoji: "\u{1F42E}", name: "cow_face" },
|
|
20279
|
+
{ emoji: "\u{1F437}", name: "pig_face" },
|
|
20280
|
+
{ emoji: "\u{1F42D}", name: "mouse_face" },
|
|
20281
|
+
{ emoji: "\u{1F430}", name: "rabbit_face" },
|
|
20282
|
+
{ emoji: "\u{1F43B}", name: "bear_face" },
|
|
20283
|
+
{ emoji: "\u{1F428}", name: "koala_bear" },
|
|
20284
|
+
{ emoji: "\u{1F43C}", name: "panda_face" },
|
|
20285
|
+
{ emoji: "\u{1F414}", name: "chicken_bird" },
|
|
20286
|
+
{ emoji: "\u{1F427}", name: "penguin_bird" },
|
|
20287
|
+
{ emoji: "\u{1F426}", name: "bird_fly" },
|
|
20288
|
+
{ emoji: "\u{1F986}", name: "duck_bird" },
|
|
20289
|
+
{ emoji: "\u{1F985}", name: "eagle_bird" },
|
|
20290
|
+
{ emoji: "\u{1F989}", name: "owl_bird" },
|
|
20291
|
+
{ emoji: "\u{1F438}", name: "frog_face" },
|
|
20292
|
+
{ emoji: "\u{1F422}", name: "turtle_slow" },
|
|
20293
|
+
{ emoji: "\u{1F40D}", name: "snake_hiss" },
|
|
20294
|
+
{ emoji: "\u{1F433}", name: "whale_sprout" },
|
|
20295
|
+
{ emoji: "\u{1F42C}", name: "dolphin_jump" },
|
|
20296
|
+
{ emoji: "\u{1F41F}", name: "fish_swim" },
|
|
20297
|
+
{ emoji: "\u{1F419}", name: "octopus_legs" },
|
|
20298
|
+
{ emoji: "\u{1F98B}", name: "butterfly_fly" },
|
|
20299
|
+
{ emoji: "\u{1F490}", name: "flower_bouquet" },
|
|
20300
|
+
{ emoji: "\u{1F338}", name: "cherry_blossom" },
|
|
20301
|
+
{ emoji: "\u{1F339}", name: "rose_flower" },
|
|
20302
|
+
{ emoji: "\u{1F33B}", name: "sunflower_yellow" },
|
|
20303
|
+
{ emoji: "\u{1F332}", name: "evergreen_tree" },
|
|
20304
|
+
{ emoji: "\u{1F333}", name: "deciduous_tree" },
|
|
20305
|
+
{ emoji: "\u{1F334}", name: "palm_tree" },
|
|
20306
|
+
{ emoji: "\u{1F335}", name: "cactus_plant" },
|
|
20307
|
+
{ emoji: "\u{1F525}", name: "fire_flame" },
|
|
20308
|
+
{ emoji: "\u{1F4A7}", name: "water_drop" },
|
|
20309
|
+
{ emoji: "\u2B50", name: "star_shine" }
|
|
20310
|
+
]
|
|
20311
|
+
},
|
|
20312
|
+
{
|
|
20313
|
+
id: "food_drink",
|
|
20314
|
+
name: "Food & Drink",
|
|
20315
|
+
emojis: [
|
|
20316
|
+
{ emoji: "\u{1F347}", name: "grapes_fruit" },
|
|
20317
|
+
{ emoji: "\u{1F348}", name: "melon_fruit" },
|
|
20318
|
+
{ emoji: "\u{1F349}", name: "watermelon_slice" },
|
|
20319
|
+
{ emoji: "\u{1F34A}", name: "tangerine_orange" },
|
|
20320
|
+
{ emoji: "\u{1F34B}", name: "lemon_sour" },
|
|
20321
|
+
{ emoji: "\u{1F34C}", name: "banana_fruit" },
|
|
20322
|
+
{ emoji: "\u{1F34D}", name: "pineapple_fruit" },
|
|
20323
|
+
{ emoji: "\u{1F34E}", name: "red_apple" },
|
|
20324
|
+
{ emoji: "\u{1F34F}", name: "green_apple" },
|
|
20325
|
+
{ emoji: "\u{1F350}", name: "pear_fruit" },
|
|
20326
|
+
{ emoji: "\u{1F351}", name: "peach_fruit" },
|
|
20327
|
+
{ emoji: "\u{1F352}", name: "cherries_red" },
|
|
20328
|
+
{ emoji: "\u{1F353}", name: "strawberry_red" },
|
|
20329
|
+
{ emoji: "\u{1F95D}", name: "kiwi_fruit" },
|
|
20330
|
+
{ emoji: "\u{1F345}", name: "tomato_red" },
|
|
20331
|
+
{ emoji: "\u{1F951}", name: "avocado_green" },
|
|
20332
|
+
{ emoji: "\u{1F346}", name: "eggplant_purple" },
|
|
20333
|
+
{ emoji: "\u{1F954}", name: "potato_spud" },
|
|
20334
|
+
{ emoji: "\u{1F955}", name: "carrot_veg" },
|
|
20335
|
+
{ emoji: "\u{1F33D}", name: "corn_cob" },
|
|
20336
|
+
{ emoji: "\u{1F35E}", name: "bread_loaf" },
|
|
20337
|
+
{ emoji: "\u{1F9C0}", name: "cheese_wedge" },
|
|
20338
|
+
{ emoji: "\u{1F356}", name: "meat_bone" },
|
|
20339
|
+
{ emoji: "\u{1F357}", name: "poultry_leg" },
|
|
20340
|
+
{ emoji: "\u{1F969}", name: "meat_cut" },
|
|
20341
|
+
{ emoji: "\u{1F953}", name: "bacon_strips" },
|
|
20342
|
+
{ emoji: "\u{1F354}", name: "hamburger_fast" },
|
|
20343
|
+
{ emoji: "\u{1F35F}", name: "french_fries" },
|
|
20344
|
+
{ emoji: "\u{1F355}", name: "pizza_slice" },
|
|
20345
|
+
{ emoji: "\u{1F32D}", name: "hot_dog" },
|
|
20346
|
+
{ emoji: "\u{1F96A}", name: "sandwich_lunch" },
|
|
20347
|
+
{ emoji: "\u{1F32E}", name: "taco_mexican" },
|
|
20348
|
+
{ emoji: "\u{1F32F}", name: "burrito_wrap" },
|
|
20349
|
+
{ emoji: "\u{1F95A}", name: "egg_white" },
|
|
20350
|
+
{ emoji: "\u{1F373}", name: "cooking_egg" },
|
|
20351
|
+
{ emoji: "\u{1F37F}", name: "popcorn_box" },
|
|
20352
|
+
{ emoji: "\u{1F35A}", name: "rice_bowl" },
|
|
20353
|
+
{ emoji: "\u{1F35D}", name: "spaghetti_pasta" },
|
|
20354
|
+
{ emoji: "\u{1F363}", name: "sushi_roll" },
|
|
20355
|
+
{ emoji: "\u{1F364}", name: "fried_shrimp" },
|
|
20356
|
+
{ emoji: "\u{1F366}", name: "ice_cream" },
|
|
20357
|
+
{ emoji: "\u{1F369}", name: "doughnut_sweet" },
|
|
20358
|
+
{ emoji: "\u{1F36A}", name: "cookie_sweet" },
|
|
20359
|
+
{ emoji: "\u{1F382}", name: "birthday_cake" },
|
|
20360
|
+
{ emoji: "\u{1F370}", name: "shortcake_slice" },
|
|
20361
|
+
{ emoji: "\u{1F36B}", name: "chocolate_bar" },
|
|
20362
|
+
{ emoji: "\u{1F36C}", name: "candy_sweet" },
|
|
20363
|
+
{ emoji: "\u{1F36D}", name: "lollipop_candy" },
|
|
20364
|
+
{ emoji: "\u2615", name: "coffee_hot" },
|
|
20365
|
+
{ emoji: "\u{1F37A}", name: "beer_mug" },
|
|
20366
|
+
{ emoji: "\u{1F37B}", name: "beer_cheers" },
|
|
20367
|
+
{ emoji: "\u{1F942}", name: "champagne_cheers" },
|
|
20368
|
+
{ emoji: "\u{1F377}", name: "wine_glass" },
|
|
20369
|
+
{ emoji: "\u{1F943}", name: "whiskey_glass" },
|
|
20370
|
+
{ emoji: "\u{1F379}", name: "tropical_drink" }
|
|
20371
|
+
]
|
|
20372
|
+
},
|
|
20373
|
+
{
|
|
20374
|
+
id: "activity",
|
|
20375
|
+
name: "Activity",
|
|
20376
|
+
emojis: [
|
|
20377
|
+
{ emoji: "\u26BD", name: "soccer_ball" },
|
|
20378
|
+
{ emoji: "\u{1F3C0}", name: "basketball_hoop" },
|
|
20379
|
+
{ emoji: "\u{1F3C8}", name: "football_american" },
|
|
20380
|
+
{ emoji: "\u26BE", name: "baseball_game" },
|
|
20381
|
+
{ emoji: "\u{1F3BE}", name: "tennis_ball" },
|
|
20382
|
+
{ emoji: "\u{1F3D0}", name: "volleyball_game" },
|
|
20383
|
+
{ emoji: "\u{1F3B1}", name: "pool_8ball" },
|
|
20384
|
+
{ emoji: "\u{1F3D3}", name: "ping_pong" },
|
|
20385
|
+
{ emoji: "\u{1F3F8}", name: "badminton_game" },
|
|
20386
|
+
{ emoji: "\u{1F94A}", name: "boxing_glove" },
|
|
20387
|
+
{ emoji: "\u{1F945}", name: "goal_net" },
|
|
20388
|
+
{ emoji: "\u{1F3A3}", name: "fishing_pole" },
|
|
20389
|
+
{ emoji: "\u{1F3AE}", name: "video_game" },
|
|
20390
|
+
{ emoji: "\u{1F3B2}", name: "game_die" },
|
|
20391
|
+
{ emoji: "\u{1F3AD}", name: "theater_masks" },
|
|
20392
|
+
{ emoji: "\u{1F3A8}", name: "artist_palette" },
|
|
20393
|
+
{ emoji: "\u{1F3AC}", name: "clapper_board" },
|
|
20394
|
+
{ emoji: "\u{1F3A4}", name: "microphone_sing" },
|
|
20395
|
+
{ emoji: "\u{1F3A7}", name: "headphone_music" },
|
|
20396
|
+
{ emoji: "\u{1F3B7}", name: "saxophone_jazz" },
|
|
20397
|
+
{ emoji: "\u{1F3B8}", name: "guitar_rock" },
|
|
20398
|
+
{ emoji: "\u{1F3B9}", name: "piano_keys" },
|
|
20399
|
+
{ emoji: "\u{1F3BA}", name: "trumpet_horn" },
|
|
20400
|
+
{ emoji: "\u{1F3BB}", name: "violin_music" },
|
|
20401
|
+
{ emoji: "\u{1F941}", name: "drum_beat" }
|
|
20402
|
+
]
|
|
20403
|
+
},
|
|
20404
|
+
{
|
|
20405
|
+
id: "objects",
|
|
20406
|
+
name: "Objects",
|
|
20407
|
+
emojis: [
|
|
20408
|
+
{ emoji: "\u{1F4F1}", name: "mobile_phone" },
|
|
20409
|
+
{ emoji: "\u{1F4BB}", name: "laptop_computer" },
|
|
20410
|
+
{ emoji: "\u{1F5A5}\uFE0F", name: "desktop_computer" },
|
|
20411
|
+
{ emoji: "\u231A", name: "watch_wrist" },
|
|
20412
|
+
{ emoji: "\u{1F4F7}", name: "camera_photo" },
|
|
20413
|
+
{ emoji: "\u{1F4A1}", name: "light_bulb" },
|
|
20414
|
+
{ emoji: "\u{1F4DA}", name: "books_pile" },
|
|
20415
|
+
{ emoji: "\u{1F4B0}", name: "money_bag" },
|
|
20416
|
+
{ emoji: "\u{1F381}", name: "gift_box" },
|
|
20417
|
+
{ emoji: "\u{1F388}", name: "balloon_red" },
|
|
20418
|
+
{ emoji: "\u{1F389}", name: "party_popper" },
|
|
20419
|
+
{ emoji: "\u{1F38A}", name: "confetti_ball" },
|
|
20420
|
+
{ emoji: "\u2709\uFE0F", name: "envelope_mail" },
|
|
20421
|
+
{ emoji: "\u{1F4E6}", name: "package_box" },
|
|
20422
|
+
{ emoji: "\u270F\uFE0F", name: "pencil_write" },
|
|
20423
|
+
{ emoji: "\u{1F512}", name: "lock_closed" },
|
|
20424
|
+
{ emoji: "\u{1F511}", name: "key_gold" },
|
|
20425
|
+
{ emoji: "\u{1F528}", name: "hammer_tool" },
|
|
20426
|
+
{ emoji: "\u{1F4A3}", name: "bomb_explode" },
|
|
20427
|
+
{ emoji: "\u{1F52B}", name: "pistol_toy" },
|
|
20428
|
+
{ emoji: "\u{1F48A}", name: "pill_capsule" },
|
|
20429
|
+
{ emoji: "\u{1F6D2}", name: "shopping_cart" }
|
|
20430
|
+
]
|
|
20431
|
+
},
|
|
20432
|
+
{
|
|
20433
|
+
id: "symbols",
|
|
20434
|
+
name: "Symbols",
|
|
20435
|
+
emojis: [
|
|
20436
|
+
{ emoji: "\u2764\uFE0F", name: "red_heart" },
|
|
20437
|
+
{ emoji: "\u{1F9E1}", name: "orange_heart" },
|
|
20438
|
+
{ emoji: "\u{1F49B}", name: "yellow_heart" },
|
|
20439
|
+
{ emoji: "\u{1F49A}", name: "green_heart" },
|
|
20440
|
+
{ emoji: "\u{1F499}", name: "blue_heart" },
|
|
20441
|
+
{ emoji: "\u{1F49C}", name: "purple_heart" },
|
|
20442
|
+
{ emoji: "\u{1F5A4}", name: "black_heart" },
|
|
20443
|
+
{ emoji: "\u{1F90D}", name: "white_heart" },
|
|
20444
|
+
{ emoji: "\u{1F90E}", name: "brown_heart" },
|
|
20445
|
+
{ emoji: "\u{1F494}", name: "broken_heart" },
|
|
20446
|
+
{ emoji: "\u2763\uFE0F", name: "heart_exclamation" },
|
|
20447
|
+
{ emoji: "\u{1F495}", name: "two_hearts" },
|
|
20448
|
+
{ emoji: "\u{1F49E}", name: "revolving_hearts" },
|
|
20449
|
+
{ emoji: "\u{1F493}", name: "beating_heart" },
|
|
20450
|
+
{ emoji: "\u{1F497}", name: "growing_heart" },
|
|
20451
|
+
{ emoji: "\u{1F496}", name: "sparkling_heart" },
|
|
20452
|
+
{ emoji: "\u{1F498}", name: "cupid_heart" },
|
|
20453
|
+
{ emoji: "\u{1F49D}", name: "gift_heart" },
|
|
20454
|
+
{ emoji: "\u{1F4AF}", name: "hundred_points" },
|
|
20455
|
+
{ emoji: "\u{1F4A2}", name: "anger_symbol" },
|
|
20456
|
+
{ emoji: "\u{1F4A5}", name: "collision_boom" },
|
|
20457
|
+
{ emoji: "\u{1F4AB}", name: "dizzy_star" },
|
|
20458
|
+
{ emoji: "\u{1F4A6}", name: "sweat_drops" },
|
|
20459
|
+
{ emoji: "\u{1F4A8}", name: "dash_away" },
|
|
20460
|
+
{ emoji: "\u{1F4A4}", name: "sleeping_zzz" },
|
|
20461
|
+
{ emoji: "\u2705", name: "check_mark" },
|
|
20462
|
+
{ emoji: "\u274C", name: "cross_mark" },
|
|
20463
|
+
{ emoji: "\u26A0\uFE0F", name: "warning_sign" },
|
|
20464
|
+
{ emoji: "\u26D4", name: "no_entry" },
|
|
20465
|
+
{ emoji: "\u{1F6AB}", name: "prohibited_sign" },
|
|
20466
|
+
{ emoji: "\u2B06\uFE0F", name: "arrow_up" },
|
|
20467
|
+
{ emoji: "\u2B07\uFE0F", name: "arrow_down" },
|
|
20468
|
+
{ emoji: "\u2B05\uFE0F", name: "arrow_left" },
|
|
20469
|
+
{ emoji: "\u27A1\uFE0F", name: "arrow_right" },
|
|
20470
|
+
{ emoji: "\u267B\uFE0F", name: "recycling_symbol" }
|
|
20471
|
+
]
|
|
20472
|
+
},
|
|
20473
|
+
{
|
|
20474
|
+
id: "flags",
|
|
20475
|
+
name: "Flags",
|
|
20476
|
+
emojis: [
|
|
20477
|
+
{ emoji: "\u{1F3C1}", name: "checkered_flag" },
|
|
20478
|
+
{ emoji: "\u{1F3F3}\uFE0F", name: "white_flag" },
|
|
20479
|
+
{ emoji: "\u{1F3F3}\uFE0F\u200D\u{1F308}", name: "rainbow_flag" },
|
|
20480
|
+
{ emoji: "\u{1F3F3}\uFE0F\u200D\u26A7\uFE0F", name: "transgender_flag" },
|
|
20481
|
+
{ emoji: "\u{1F3F4}\u200D\u2620\uFE0F", name: "pirate_flag" },
|
|
20482
|
+
{ emoji: "\u{1F1E6}\u{1F1E8}", name: "flag_ascension" },
|
|
20483
|
+
{ emoji: "\u{1F1E6}\u{1F1E9}", name: "flag_andorra" },
|
|
20484
|
+
{ emoji: "\u{1F1E6}\u{1F1EA}", name: "flag_uae" },
|
|
20485
|
+
{ emoji: "\u{1F1E6}\u{1F1EB}", name: "flag_afghanistan" },
|
|
20486
|
+
{ emoji: "\u{1F1E6}\u{1F1EC}", name: "flag_antigua" },
|
|
20487
|
+
{ emoji: "\u{1F1E6}\u{1F1EE}", name: "flag_anguilla" },
|
|
20488
|
+
{ emoji: "\u{1F1E6}\u{1F1F1}", name: "flag_albania" },
|
|
20489
|
+
{ emoji: "\u{1F1E6}\u{1F1F2}", name: "flag_armenia" },
|
|
20490
|
+
{ emoji: "\u{1F1E6}\u{1F1F4}", name: "flag_angola" },
|
|
20491
|
+
{ emoji: "\u{1F1E6}\u{1F1F6}", name: "flag_antarctica" },
|
|
20492
|
+
{ emoji: "\u{1F1E6}\u{1F1F7}", name: "flag_argentina" },
|
|
20493
|
+
{ emoji: "\u{1F1E6}\u{1F1F8}", name: "flag_american_samoa" },
|
|
20494
|
+
{ emoji: "\u{1F1E6}\u{1F1F9}", name: "flag_austria" },
|
|
20495
|
+
{ emoji: "\u{1F1E6}\u{1F1FA}", name: "flag_australia" },
|
|
20496
|
+
{ emoji: "\u{1F1E6}\u{1F1FC}", name: "flag_aruba" },
|
|
20497
|
+
{ emoji: "\u{1F1E6}\u{1F1FD}", name: "flag_aland" },
|
|
20498
|
+
{ emoji: "\u{1F1E6}\u{1F1FF}", name: "flag_azerbaijan" },
|
|
20499
|
+
{ emoji: "\u{1F1E7}\u{1F1E6}", name: "flag_bosnia" },
|
|
20500
|
+
{ emoji: "\u{1F1E7}\u{1F1E7}", name: "flag_barbados" },
|
|
20501
|
+
{ emoji: "\u{1F1E7}\u{1F1E9}", name: "flag_bangladesh" },
|
|
20502
|
+
{ emoji: "\u{1F1E7}\u{1F1EA}", name: "flag_belgium" },
|
|
20503
|
+
{ emoji: "\u{1F1E7}\u{1F1EB}", name: "flag_burkina" },
|
|
20504
|
+
{ emoji: "\u{1F1E7}\u{1F1EC}", name: "flag_bulgaria" },
|
|
20505
|
+
{ emoji: "\u{1F1E7}\u{1F1ED}", name: "flag_bahrain" },
|
|
20506
|
+
{ emoji: "\u{1F1E7}\u{1F1EE}", name: "flag_burundi" },
|
|
20507
|
+
{ emoji: "\u{1F1E7}\u{1F1EF}", name: "flag_benin" },
|
|
20508
|
+
{ emoji: "\u{1F1E7}\u{1F1F1}", name: "flag_st_barthelemy" },
|
|
20509
|
+
{ emoji: "\u{1F1E7}\u{1F1F2}", name: "flag_bermuda" },
|
|
20510
|
+
{ emoji: "\u{1F1E7}\u{1F1F3}", name: "flag_brunei" },
|
|
20511
|
+
{ emoji: "\u{1F1E7}\u{1F1F4}", name: "flag_bolivia" },
|
|
20512
|
+
{ emoji: "\u{1F1E7}\u{1F1F6}", name: "flag_bonaire" },
|
|
20513
|
+
{ emoji: "\u{1F1E7}\u{1F1F7}", name: "flag_brazil" },
|
|
20514
|
+
{ emoji: "\u{1F1E7}\u{1F1F8}", name: "flag_bahamas" },
|
|
20515
|
+
{ emoji: "\u{1F1E7}\u{1F1F9}", name: "flag_bhutan" },
|
|
20516
|
+
{ emoji: "\u{1F1E7}\u{1F1FB}", name: "flag_bouvet" },
|
|
20517
|
+
{ emoji: "\u{1F1E7}\u{1F1FC}", name: "flag_botswana" },
|
|
20518
|
+
{ emoji: "\u{1F1E7}\u{1F1FE}", name: "flag_belarus" },
|
|
20519
|
+
{ emoji: "\u{1F1E7}\u{1F1FF}", name: "flag_belize" },
|
|
20520
|
+
{ emoji: "\u{1F1E8}\u{1F1E6}", name: "flag_canada" },
|
|
20521
|
+
{ emoji: "\u{1F1E8}\u{1F1E8}", name: "flag_cocos" },
|
|
20522
|
+
{ emoji: "\u{1F1E8}\u{1F1E9}", name: "flag_congo_dr" },
|
|
20523
|
+
{ emoji: "\u{1F1E8}\u{1F1EB}", name: "flag_central_africa" },
|
|
20524
|
+
{ emoji: "\u{1F1E8}\u{1F1EC}", name: "flag_congo" },
|
|
20525
|
+
{ emoji: "\u{1F1E8}\u{1F1ED}", name: "flag_switzerland" },
|
|
20526
|
+
{ emoji: "\u{1F1E8}\u{1F1EE}", name: "flag_cote_divoire" },
|
|
20527
|
+
{ emoji: "\u{1F1E8}\u{1F1F0}", name: "flag_cook_islands" },
|
|
20528
|
+
{ emoji: "\u{1F1E8}\u{1F1F1}", name: "flag_chile" },
|
|
20529
|
+
{ emoji: "\u{1F1E8}\u{1F1F2}", name: "flag_cameroon" },
|
|
20530
|
+
{ emoji: "\u{1F1E8}\u{1F1F3}", name: "flag_china" },
|
|
20531
|
+
{ emoji: "\u{1F1E8}\u{1F1F4}", name: "flag_colombia" },
|
|
20532
|
+
{ emoji: "\u{1F1E8}\u{1F1F5}", name: "flag_clipperton" },
|
|
20533
|
+
{ emoji: "\u{1F1E8}\u{1F1F7}", name: "flag_costa_rica" },
|
|
20534
|
+
{ emoji: "\u{1F1E8}\u{1F1FA}", name: "flag_cuba" },
|
|
20535
|
+
{ emoji: "\u{1F1E8}\u{1F1FB}", name: "flag_cape_verde" },
|
|
20536
|
+
{ emoji: "\u{1F1E8}\u{1F1FC}", name: "flag_curacao" },
|
|
20537
|
+
{ emoji: "\u{1F1E8}\u{1F1FD}", name: "flag_christmas_island" },
|
|
20538
|
+
{ emoji: "\u{1F1E8}\u{1F1FE}", name: "flag_cyprus" },
|
|
20539
|
+
{ emoji: "\u{1F1E8}\u{1F1FF}", name: "flag_czechia" },
|
|
20540
|
+
{ emoji: "\u{1F1E9}\u{1F1EA}", name: "flag_germany" },
|
|
20541
|
+
{ emoji: "\u{1F1E9}\u{1F1EC}", name: "flag_diego_garcia" },
|
|
20542
|
+
{ emoji: "\u{1F1E9}\u{1F1EF}", name: "flag_djibouti" },
|
|
20543
|
+
{ emoji: "\u{1F1E9}\u{1F1F0}", name: "flag_denmark" },
|
|
20544
|
+
{ emoji: "\u{1F1E9}\u{1F1F2}", name: "flag_dominica" },
|
|
20545
|
+
{ emoji: "\u{1F1E9}\u{1F1F4}", name: "flag_dominican_rep" },
|
|
20546
|
+
{ emoji: "\u{1F1E9}\u{1F1FF}", name: "flag_algeria" },
|
|
20547
|
+
{ emoji: "\u{1F1EA}\u{1F1E8}", name: "flag_ecuador" },
|
|
20548
|
+
{ emoji: "\u{1F1EA}\u{1F1EA}", name: "flag_estonia" },
|
|
20549
|
+
{ emoji: "\u{1F1EA}\u{1F1EC}", name: "flag_egypt" },
|
|
20550
|
+
{ emoji: "\u{1F1EA}\u{1F1ED}", name: "flag_western_sahara" },
|
|
20551
|
+
{ emoji: "\u{1F1EA}\u{1F1F7}", name: "flag_eritrea" },
|
|
20552
|
+
{ emoji: "\u{1F1EA}\u{1F1F8}", name: "flag_spain" },
|
|
20553
|
+
{ emoji: "\u{1F1EA}\u{1F1F9}", name: "flag_ethiopia" },
|
|
20554
|
+
{ emoji: "\u{1F1EA}\u{1F1FA}", name: "flag_eu" },
|
|
20555
|
+
{ emoji: "\u{1F1EB}\u{1F1EE}", name: "flag_finland" },
|
|
20556
|
+
{ emoji: "\u{1F1EB}\u{1F1EF}", name: "flag_fiji" },
|
|
20557
|
+
{ emoji: "\u{1F1EB}\u{1F1F0}", name: "flag_falkland" },
|
|
20558
|
+
{ emoji: "\u{1F1EB}\u{1F1F2}", name: "flag_micronesia" },
|
|
20559
|
+
{ emoji: "\u{1F1EB}\u{1F1F4}", name: "flag_faroe" },
|
|
20560
|
+
{ emoji: "\u{1F1EB}\u{1F1F7}", name: "flag_france" },
|
|
20561
|
+
{ emoji: "\u{1F1EC}\u{1F1E6}", name: "flag_gabon" },
|
|
20562
|
+
{ emoji: "\u{1F1EC}\u{1F1E7}", name: "flag_uk" },
|
|
20563
|
+
{ emoji: "\u{1F1EC}\u{1F1E9}", name: "flag_grenada" },
|
|
20564
|
+
{ emoji: "\u{1F1EC}\u{1F1EA}", name: "flag_georgia" },
|
|
20565
|
+
{ emoji: "\u{1F1EC}\u{1F1EB}", name: "flag_french_guiana" },
|
|
20566
|
+
{ emoji: "\u{1F1EC}\u{1F1EC}", name: "flag_guernsey" },
|
|
20567
|
+
{ emoji: "\u{1F1EC}\u{1F1ED}", name: "flag_ghana" },
|
|
20568
|
+
{ emoji: "\u{1F1EC}\u{1F1EE}", name: "flag_gibraltar" },
|
|
20569
|
+
{ emoji: "\u{1F1EC}\u{1F1F1}", name: "flag_greenland" },
|
|
20570
|
+
{ emoji: "\u{1F1EC}\u{1F1F2}", name: "flag_gambia" },
|
|
20571
|
+
{ emoji: "\u{1F1EC}\u{1F1F3}", name: "flag_guinea" },
|
|
20572
|
+
{ emoji: "\u{1F1EC}\u{1F1F5}", name: "flag_guadeloupe" },
|
|
20573
|
+
{ emoji: "\u{1F1EC}\u{1F1F6}", name: "flag_equatorial_guinea" },
|
|
20574
|
+
{ emoji: "\u{1F1EC}\u{1F1F7}", name: "flag_greece" },
|
|
20575
|
+
{ emoji: "\u{1F1EC}\u{1F1F8}", name: "flag_south_georgia" },
|
|
20576
|
+
{ emoji: "\u{1F1EC}\u{1F1F9}", name: "flag_guatemala" },
|
|
20577
|
+
{ emoji: "\u{1F1EC}\u{1F1FA}", name: "flag_guam" },
|
|
20578
|
+
{ emoji: "\u{1F1EC}\u{1F1FC}", name: "flag_guinea_bissau" },
|
|
20579
|
+
{ emoji: "\u{1F1EC}\u{1F1FE}", name: "flag_guyana" },
|
|
20580
|
+
{ emoji: "\u{1F1ED}\u{1F1F0}", name: "flag_hong_kong" },
|
|
20581
|
+
{ emoji: "\u{1F1ED}\u{1F1F2}", name: "flag_heard_island" },
|
|
20582
|
+
{ emoji: "\u{1F1ED}\u{1F1F3}", name: "flag_honduras" },
|
|
20583
|
+
{ emoji: "\u{1F1ED}\u{1F1F7}", name: "flag_croatia" },
|
|
20584
|
+
{ emoji: "\u{1F1ED}\u{1F1F9}", name: "flag_haiti" },
|
|
20585
|
+
{ emoji: "\u{1F1ED}\u{1F1FA}", name: "flag_hungary" },
|
|
20586
|
+
{ emoji: "\u{1F1EE}\u{1F1E8}", name: "flag_canary_islands" },
|
|
20587
|
+
{ emoji: "\u{1F1EE}\u{1F1E9}", name: "flag_indonesia" },
|
|
20588
|
+
{ emoji: "\u{1F1EE}\u{1F1EA}", name: "flag_ireland" },
|
|
20589
|
+
{ emoji: "\u{1F1EE}\u{1F1F1}", name: "flag_israel" },
|
|
20590
|
+
{ emoji: "\u{1F1EE}\u{1F1F2}", name: "flag_isle_of_man" },
|
|
20591
|
+
{ emoji: "\u{1F1EE}\u{1F1F3}", name: "flag_india" },
|
|
20592
|
+
{ emoji: "\u{1F1EE}\u{1F1F4}", name: "flag_british_indian_ocean" },
|
|
20593
|
+
{ emoji: "\u{1F1EE}\u{1F1F6}", name: "flag_iraq" },
|
|
20594
|
+
{ emoji: "\u{1F1EE}\u{1F1F7}", name: "flag_iran" },
|
|
20595
|
+
{ emoji: "\u{1F1EE}\u{1F1F8}", name: "flag_iceland" },
|
|
20596
|
+
{ emoji: "\u{1F1EE}\u{1F1F9}", name: "flag_italy" },
|
|
20597
|
+
{ emoji: "\u{1F1EF}\u{1F1EA}", name: "flag_jersey" },
|
|
20598
|
+
{ emoji: "\u{1F1EF}\u{1F1F2}", name: "flag_jamaica" },
|
|
20599
|
+
{ emoji: "\u{1F1EF}\u{1F1F4}", name: "flag_jordan" },
|
|
20600
|
+
{ emoji: "\u{1F1EF}\u{1F1F5}", name: "flag_japan" },
|
|
20601
|
+
{ emoji: "\u{1F1F0}\u{1F1EA}", name: "flag_kenya" },
|
|
20602
|
+
{ emoji: "\u{1F1F0}\u{1F1EC}", name: "flag_kyrgyzstan" },
|
|
20603
|
+
{ emoji: "\u{1F1F0}\u{1F1ED}", name: "flag_cambodia" },
|
|
20604
|
+
{ emoji: "\u{1F1F0}\u{1F1EE}", name: "flag_kiribati" },
|
|
20605
|
+
{ emoji: "\u{1F1F0}\u{1F1F2}", name: "flag_comoros" },
|
|
20606
|
+
{ emoji: "\u{1F1F0}\u{1F1F3}", name: "flag_st_kitts" },
|
|
20607
|
+
{ emoji: "\u{1F1F0}\u{1F1F5}", name: "flag_north_korea" },
|
|
20608
|
+
{ emoji: "\u{1F1F0}\u{1F1F7}", name: "flag_south_korea" },
|
|
20609
|
+
{ emoji: "\u{1F1F0}\u{1F1FC}", name: "flag_kuwait" },
|
|
20610
|
+
{ emoji: "\u{1F1F0}\u{1F1FE}", name: "flag_cayman" },
|
|
20611
|
+
{ emoji: "\u{1F1F0}\u{1F1FF}", name: "flag_kazakhstan" },
|
|
20612
|
+
{ emoji: "\u{1F1F1}\u{1F1E6}", name: "flag_laos" },
|
|
20613
|
+
{ emoji: "\u{1F1F1}\u{1F1E7}", name: "flag_lebanon" },
|
|
20614
|
+
{ emoji: "\u{1F1F1}\u{1F1E8}", name: "flag_st_lucia" },
|
|
20615
|
+
{ emoji: "\u{1F1F1}\u{1F1EE}", name: "flag_liechtenstein" },
|
|
20616
|
+
{ emoji: "\u{1F1F1}\u{1F1F0}", name: "flag_sri_lanka" },
|
|
20617
|
+
{ emoji: "\u{1F1F1}\u{1F1F7}", name: "flag_liberia" },
|
|
20618
|
+
{ emoji: "\u{1F1F1}\u{1F1F8}", name: "flag_lesotho" },
|
|
20619
|
+
{ emoji: "\u{1F1F1}\u{1F1F9}", name: "flag_lithuania" },
|
|
20620
|
+
{ emoji: "\u{1F1F1}\u{1F1FA}", name: "flag_luxembourg" },
|
|
20621
|
+
{ emoji: "\u{1F1F1}\u{1F1FB}", name: "flag_latvia" },
|
|
20622
|
+
{ emoji: "\u{1F1F1}\u{1F1FE}", name: "flag_libya" },
|
|
20623
|
+
{ emoji: "\u{1F1F2}\u{1F1E6}", name: "flag_morocco" },
|
|
20624
|
+
{ emoji: "\u{1F1F2}\u{1F1E8}", name: "flag_monaco" },
|
|
20625
|
+
{ emoji: "\u{1F1F2}\u{1F1E9}", name: "flag_moldova" },
|
|
20626
|
+
{ emoji: "\u{1F1F2}\u{1F1EA}", name: "flag_montenegro" },
|
|
20627
|
+
{ emoji: "\u{1F1F2}\u{1F1EB}", name: "flag_st_martin" },
|
|
20628
|
+
{ emoji: "\u{1F1F2}\u{1F1EC}", name: "flag_madagascar" },
|
|
20629
|
+
{ emoji: "\u{1F1F2}\u{1F1ED}", name: "flag_marshall_islands" },
|
|
20630
|
+
{ emoji: "\u{1F1F2}\u{1F1F0}", name: "flag_north_macedonia" },
|
|
20631
|
+
{ emoji: "\u{1F1F2}\u{1F1F1}", name: "flag_mali" },
|
|
20632
|
+
{ emoji: "\u{1F1F2}\u{1F1F2}", name: "flag_myanmar" },
|
|
20633
|
+
{ emoji: "\u{1F1F2}\u{1F1F3}", name: "flag_mongolia" },
|
|
20634
|
+
{ emoji: "\u{1F1F2}\u{1F1F4}", name: "flag_macau" },
|
|
20635
|
+
{ emoji: "\u{1F1F2}\u{1F1F5}", name: "flag_northern_mariana" },
|
|
20636
|
+
{ emoji: "\u{1F1F2}\u{1F1F6}", name: "flag_martinique" },
|
|
20637
|
+
{ emoji: "\u{1F1F2}\u{1F1F7}", name: "flag_mauritania" },
|
|
20638
|
+
{ emoji: "\u{1F1F2}\u{1F1F8}", name: "flag_montserrat" },
|
|
20639
|
+
{ emoji: "\u{1F1F2}\u{1F1F9}", name: "flag_malta" },
|
|
20640
|
+
{ emoji: "\u{1F1F2}\u{1F1FA}", name: "flag_mauritius" },
|
|
20641
|
+
{ emoji: "\u{1F1F2}\u{1F1FB}", name: "flag_maldives" },
|
|
20642
|
+
{ emoji: "\u{1F1F2}\u{1F1FC}", name: "flag_malawi" },
|
|
20643
|
+
{ emoji: "\u{1F1F2}\u{1F1FD}", name: "flag_mexico" },
|
|
20644
|
+
{ emoji: "\u{1F1F2}\u{1F1FE}", name: "flag_malaysia" },
|
|
20645
|
+
{ emoji: "\u{1F1F2}\u{1F1FF}", name: "flag_mozambique" },
|
|
20646
|
+
{ emoji: "\u{1F1F3}\u{1F1E6}", name: "flag_namibia" },
|
|
20647
|
+
{ emoji: "\u{1F1F3}\u{1F1E8}", name: "flag_new_caledonia" },
|
|
20648
|
+
{ emoji: "\u{1F1F3}\u{1F1EA}", name: "flag_niger" },
|
|
20649
|
+
{ emoji: "\u{1F1F3}\u{1F1EB}", name: "flag_norfolk" },
|
|
20650
|
+
{ emoji: "\u{1F1F3}\u{1F1EC}", name: "flag_nigeria" },
|
|
20651
|
+
{ emoji: "\u{1F1F3}\u{1F1EE}", name: "flag_nicaragua" },
|
|
20652
|
+
{ emoji: "\u{1F1F3}\u{1F1F1}", name: "flag_netherlands" },
|
|
20653
|
+
{ emoji: "\u{1F1F3}\u{1F1F4}", name: "flag_norway" },
|
|
20654
|
+
{ emoji: "\u{1F1F3}\u{1F1F5}", name: "flag_nepal" },
|
|
20655
|
+
{ emoji: "\u{1F1F3}\u{1F1F7}", name: "flag_nauru" },
|
|
20656
|
+
{ emoji: "\u{1F1F3}\u{1F1FA}", name: "flag_niue" },
|
|
20657
|
+
{ emoji: "\u{1F1F3}\u{1F1FF}", name: "flag_new_zealand" },
|
|
20658
|
+
{ emoji: "\u{1F1F4}\u{1F1F2}", name: "flag_oman" },
|
|
20659
|
+
{ emoji: "\u{1F1F5}\u{1F1E6}", name: "flag_panama" },
|
|
20660
|
+
{ emoji: "\u{1F1F5}\u{1F1EA}", name: "flag_peru" },
|
|
20661
|
+
{ emoji: "\u{1F1F5}\u{1F1EB}", name: "flag_french_polynesia" },
|
|
20662
|
+
{ emoji: "\u{1F1F5}\u{1F1EC}", name: "flag_papua_new_guinea" },
|
|
20663
|
+
{ emoji: "\u{1F1F5}\u{1F1ED}", name: "flag_philippines" },
|
|
20664
|
+
{ emoji: "\u{1F1F5}\u{1F1F0}", name: "flag_pakistan" },
|
|
20665
|
+
{ emoji: "\u{1F1F5}\u{1F1F1}", name: "flag_poland" },
|
|
20666
|
+
{ emoji: "\u{1F1F5}\u{1F1F2}", name: "flag_st_pierre" },
|
|
20667
|
+
{ emoji: "\u{1F1F5}\u{1F1F3}", name: "flag_pitcairn" },
|
|
20668
|
+
{ emoji: "\u{1F1F5}\u{1F1F7}", name: "flag_puerto_rico" },
|
|
20669
|
+
{ emoji: "\u{1F1F5}\u{1F1F8}", name: "flag_palestine" },
|
|
20670
|
+
{ emoji: "\u{1F1F5}\u{1F1F9}", name: "flag_portugal" },
|
|
20671
|
+
{ emoji: "\u{1F1F5}\u{1F1FC}", name: "flag_palau" },
|
|
20672
|
+
{ emoji: "\u{1F1F5}\u{1F1FE}", name: "flag_paraguay" },
|
|
20673
|
+
{ emoji: "\u{1F1F6}\u{1F1E6}", name: "flag_qatar" },
|
|
20674
|
+
{ emoji: "\u{1F1F7}\u{1F1EA}", name: "flag_reunion" },
|
|
20675
|
+
{ emoji: "\u{1F1F7}\u{1F1F4}", name: "flag_romania" },
|
|
20676
|
+
{ emoji: "\u{1F1F7}\u{1F1F8}", name: "flag_serbia" },
|
|
20677
|
+
{ emoji: "\u{1F1F7}\u{1F1FA}", name: "flag_russia" },
|
|
20678
|
+
{ emoji: "\u{1F1F7}\u{1F1FC}", name: "flag_rwanda" },
|
|
20679
|
+
{ emoji: "\u{1F1F8}\u{1F1E6}", name: "flag_saudi_arabia" },
|
|
20680
|
+
{ emoji: "\u{1F1F8}\u{1F1E7}", name: "flag_solomon_islands" },
|
|
20681
|
+
{ emoji: "\u{1F1F8}\u{1F1E8}", name: "flag_seychelles" },
|
|
20682
|
+
{ emoji: "\u{1F1F8}\u{1F1E9}", name: "flag_sudan" },
|
|
20683
|
+
{ emoji: "\u{1F1F8}\u{1F1EA}", name: "flag_sweden" },
|
|
20684
|
+
{ emoji: "\u{1F1F8}\u{1F1EC}", name: "flag_singapore" },
|
|
20685
|
+
{ emoji: "\u{1F1F8}\u{1F1ED}", name: "flag_st_helena" },
|
|
20686
|
+
{ emoji: "\u{1F1F8}\u{1F1EE}", name: "flag_slovenia" },
|
|
20687
|
+
{ emoji: "\u{1F1F8}\u{1F1EF}", name: "flag_svalbard" },
|
|
20688
|
+
{ emoji: "\u{1F1F8}\u{1F1F0}", name: "flag_slovakia" },
|
|
20689
|
+
{ emoji: "\u{1F1F8}\u{1F1F1}", name: "flag_sierra_leone" },
|
|
20690
|
+
{ emoji: "\u{1F1F8}\u{1F1F2}", name: "flag_san_marino" },
|
|
20691
|
+
{ emoji: "\u{1F1F8}\u{1F1F3}", name: "flag_senegal" },
|
|
20692
|
+
{ emoji: "\u{1F1F8}\u{1F1F4}", name: "flag_somalia" },
|
|
20693
|
+
{ emoji: "\u{1F1F8}\u{1F1F7}", name: "flag_suriname" },
|
|
20694
|
+
{ emoji: "\u{1F1F8}\u{1F1F8}", name: "flag_south_sudan" },
|
|
20695
|
+
{ emoji: "\u{1F1F8}\u{1F1F9}", name: "flag_sao_tome" },
|
|
20696
|
+
{ emoji: "\u{1F1F8}\u{1F1FB}", name: "flag_el_salvador" },
|
|
20697
|
+
{ emoji: "\u{1F1F8}\u{1F1FD}", name: "flag_sint_maarten" },
|
|
20698
|
+
{ emoji: "\u{1F1F8}\u{1F1FE}", name: "flag_syria" },
|
|
20699
|
+
{ emoji: "\u{1F1F8}\u{1F1FF}", name: "flag_eswatini" },
|
|
20700
|
+
{ emoji: "\u{1F1F9}\u{1F1E6}", name: "flag_tristan" },
|
|
20701
|
+
{ emoji: "\u{1F1F9}\u{1F1E8}", name: "flag_turks_caicos" },
|
|
20702
|
+
{ emoji: "\u{1F1F9}\u{1F1E9}", name: "flag_chad" },
|
|
20703
|
+
{ emoji: "\u{1F1F9}\u{1F1EB}", name: "flag_french_southern" },
|
|
20704
|
+
{ emoji: "\u{1F1F9}\u{1F1EC}", name: "flag_togo" },
|
|
20705
|
+
{ emoji: "\u{1F1F9}\u{1F1ED}", name: "flag_thailand" },
|
|
20706
|
+
{ emoji: "\u{1F1F9}\u{1F1EF}", name: "flag_tajikistan" },
|
|
20707
|
+
{ emoji: "\u{1F1F9}\u{1F1F0}", name: "flag_tokelau" },
|
|
20708
|
+
{ emoji: "\u{1F1F9}\u{1F1F1}", name: "flag_timor_leste" },
|
|
20709
|
+
{ emoji: "\u{1F1F9}\u{1F1F2}", name: "flag_turkmenistan" },
|
|
20710
|
+
{ emoji: "\u{1F1F9}\u{1F1F3}", name: "flag_tunisia" },
|
|
20711
|
+
{ emoji: "\u{1F1F9}\u{1F1F4}", name: "flag_tonga" },
|
|
20712
|
+
{ emoji: "\u{1F1F9}\u{1F1F7}", name: "flag_turkey" },
|
|
20713
|
+
{ emoji: "\u{1F1F9}\u{1F1F9}", name: "flag_trinidad" },
|
|
20714
|
+
{ emoji: "\u{1F1F9}\u{1F1FB}", name: "flag_tuvalu" },
|
|
20715
|
+
{ emoji: "\u{1F1F9}\u{1F1FC}", name: "flag_taiwan" },
|
|
20716
|
+
{ emoji: "\u{1F1F9}\u{1F1FF}", name: "flag_tanzania" },
|
|
20717
|
+
{ emoji: "\u{1F1FA}\u{1F1E6}", name: "flag_ukraine" },
|
|
20718
|
+
{ emoji: "\u{1F1FA}\u{1F1EC}", name: "flag_uganda" },
|
|
20719
|
+
{ emoji: "\u{1F1FA}\u{1F1F2}", name: "flag_us_outlying" },
|
|
20720
|
+
{ emoji: "\u{1F1FA}\u{1F1F3}", name: "flag_un" },
|
|
20721
|
+
{ emoji: "\u{1F1FA}\u{1F1F8}", name: "flag_usa" },
|
|
20722
|
+
{ emoji: "\u{1F1FA}\u{1F1FE}", name: "flag_uruguay" },
|
|
20723
|
+
{ emoji: "\u{1F1FA}\u{1F1FF}", name: "flag_uzbekistan" },
|
|
20724
|
+
{ emoji: "\u{1F1FB}\u{1F1E6}", name: "flag_vatican" },
|
|
20725
|
+
{ emoji: "\u{1F1FB}\u{1F1E8}", name: "flag_st_vincent" },
|
|
20726
|
+
{ emoji: "\u{1F1FB}\u{1F1EA}", name: "flag_venezuela" },
|
|
20727
|
+
{ emoji: "\u{1F1FB}\u{1F1EC}", name: "flag_bvi" },
|
|
20728
|
+
{ emoji: "\u{1F1FB}\u{1F1EE}", name: "flag_usvi" },
|
|
20729
|
+
{ emoji: "\u{1F1FB}\u{1F1F3}", name: "flag_vietnam" },
|
|
20730
|
+
{ emoji: "\u{1F1FB}\u{1F1FA}", name: "flag_vanuatu" },
|
|
20731
|
+
{ emoji: "\u{1F1FC}\u{1F1EB}", name: "flag_wallis" },
|
|
20732
|
+
{ emoji: "\u{1F1FC}\u{1F1F8}", name: "flag_samoa" },
|
|
20733
|
+
{ emoji: "\u{1F1FD}\u{1F1F0}", name: "flag_kosovo" },
|
|
20734
|
+
{ emoji: "\u{1F1FE}\u{1F1EA}", name: "flag_yemen" },
|
|
20735
|
+
{ emoji: "\u{1F1FE}\u{1F1F9}", name: "flag_mayotte" },
|
|
20736
|
+
{ emoji: "\u{1F1FF}\u{1F1E6}", name: "flag_south_africa" },
|
|
20737
|
+
{ emoji: "\u{1F1FF}\u{1F1F2}", name: "flag_zambia" },
|
|
20738
|
+
{ emoji: "\u{1F1FF}\u{1F1FC}", name: "flag_zimbabwe" }
|
|
20739
|
+
]
|
|
20740
|
+
}
|
|
20741
|
+
];
|
|
20742
|
+
|
|
20743
|
+
// ../../components/ui/UEditor/emoji-suggestion.tsx
|
|
19974
20744
|
var import_jsx_runtime76 = require("react/jsx-runtime");
|
|
20745
|
+
var EmojiList = (0, import_react42.forwardRef)((props, ref) => {
|
|
20746
|
+
const [selectedIndex, setSelectedIndex] = (0, import_react42.useState)(0);
|
|
20747
|
+
(0, import_react42.useEffect)(() => {
|
|
20748
|
+
setSelectedIndex(0);
|
|
20749
|
+
}, [props.items]);
|
|
20750
|
+
(0, import_react42.useImperativeHandle)(ref, () => ({
|
|
20751
|
+
onKeyDown: ({ event }) => {
|
|
20752
|
+
if (event.key === "ArrowUp") {
|
|
20753
|
+
setSelectedIndex((prev) => (prev + props.items.length - 1) % props.items.length);
|
|
20754
|
+
return true;
|
|
20755
|
+
}
|
|
20756
|
+
if (event.key === "ArrowDown") {
|
|
20757
|
+
setSelectedIndex((prev) => (prev + 1) % props.items.length);
|
|
20758
|
+
return true;
|
|
20759
|
+
}
|
|
20760
|
+
if (event.key === "ArrowLeft") {
|
|
20761
|
+
setSelectedIndex((prev) => Math.max(0, prev - 8));
|
|
20762
|
+
return true;
|
|
20763
|
+
}
|
|
20764
|
+
if (event.key === "ArrowRight") {
|
|
20765
|
+
setSelectedIndex((prev) => Math.min(props.items.length - 1, prev + 8));
|
|
20766
|
+
return true;
|
|
20767
|
+
}
|
|
20768
|
+
if (event.key === "Enter") {
|
|
20769
|
+
const item = props.items[selectedIndex];
|
|
20770
|
+
if (item) {
|
|
20771
|
+
props.command(item);
|
|
20772
|
+
}
|
|
20773
|
+
return true;
|
|
20774
|
+
}
|
|
20775
|
+
return false;
|
|
20776
|
+
}
|
|
20777
|
+
}));
|
|
20778
|
+
if (props.items.length === 0) {
|
|
20779
|
+
return /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("div", { className: "w-80 p-4 text-center text-sm text-muted-foreground bg-card border border-border rounded-2xl shadow-lg", children: "No emoji found" });
|
|
20780
|
+
}
|
|
20781
|
+
return /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "w-80 max-h-80 overflow-y-auto bg-card border border-border rounded-2xl shadow-lg", children: [
|
|
20782
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("div", { className: "px-3 py-2 border-b bg-muted/30", children: /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
20783
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)(import_lucide_react39.Smile, { className: "w-4 h-4 text-primary" }),
|
|
20784
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider", children: "Emoji" })
|
|
20785
|
+
] }) }),
|
|
20786
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "p-3", children: [
|
|
20787
|
+
/* @__PURE__ */ (0, import_jsx_runtime76.jsx)("div", { className: "grid grid-cols-8 gap-1", children: props.items.slice(0, 64).map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
|
|
20788
|
+
"button",
|
|
20789
|
+
{
|
|
20790
|
+
type: "button",
|
|
20791
|
+
onClick: () => props.command(item),
|
|
20792
|
+
className: cn(
|
|
20793
|
+
"w-9 h-9 flex items-center justify-center rounded-lg text-xl transition-colors",
|
|
20794
|
+
selectedIndex === index ? "bg-primary/10 ring-2 ring-primary/30" : "hover:bg-accent"
|
|
20795
|
+
),
|
|
20796
|
+
title: item.name.replace(/_/g, " "),
|
|
20797
|
+
children: item.emoji
|
|
20798
|
+
},
|
|
20799
|
+
item.name
|
|
20800
|
+
)) }),
|
|
20801
|
+
props.items.length > 64 && /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "mt-2 text-xs text-center text-muted-foreground", children: [
|
|
20802
|
+
"Showing first 64 of ",
|
|
20803
|
+
props.items.length,
|
|
20804
|
+
" emojis"
|
|
20805
|
+
] })
|
|
20806
|
+
] })
|
|
20807
|
+
] });
|
|
20808
|
+
});
|
|
20809
|
+
EmojiList.displayName = "EmojiList";
|
|
20810
|
+
var getEmojiSuggestionItems = ({ query }) => {
|
|
20811
|
+
const allEmojis = EMOJI_LIST.flatMap((category) => category.emojis);
|
|
20812
|
+
if (!query.trim()) {
|
|
20813
|
+
return allEmojis.slice(0, 64);
|
|
20814
|
+
}
|
|
20815
|
+
const searchQuery = query.toLowerCase();
|
|
20816
|
+
return allEmojis.filter(
|
|
20817
|
+
(emoji) => emoji.name.toLowerCase().includes(searchQuery) || emoji.emoji.includes(query)
|
|
20818
|
+
);
|
|
20819
|
+
};
|
|
20820
|
+
var EmojiSuggestion = import_core3.Extension.create({
|
|
20821
|
+
name: "emojiSuggestion",
|
|
20822
|
+
addProseMirrorPlugins() {
|
|
20823
|
+
return [
|
|
20824
|
+
(0, import_suggestion2.default)({
|
|
20825
|
+
editor: this.editor,
|
|
20826
|
+
char: ":",
|
|
20827
|
+
pluginKey: new import_state2.PluginKey("emojiSuggestion"),
|
|
20828
|
+
command: ({ editor, range, props }) => {
|
|
20829
|
+
editor.chain().focus().deleteRange(range).insertContent(props.emoji).run();
|
|
20830
|
+
},
|
|
20831
|
+
items: getEmojiSuggestionItems,
|
|
20832
|
+
render: () => {
|
|
20833
|
+
let component;
|
|
20834
|
+
let popup;
|
|
20835
|
+
return {
|
|
20836
|
+
onStart: (props) => {
|
|
20837
|
+
component = new import_react41.ReactRenderer(EmojiList, {
|
|
20838
|
+
props,
|
|
20839
|
+
editor: props.editor
|
|
20840
|
+
});
|
|
20841
|
+
if (!props.clientRect) {
|
|
20842
|
+
return;
|
|
20843
|
+
}
|
|
20844
|
+
popup = (0, import_tippy2.default)("body", {
|
|
20845
|
+
getReferenceClientRect: props.clientRect,
|
|
20846
|
+
appendTo: () => document.body,
|
|
20847
|
+
content: component.element,
|
|
20848
|
+
showOnCreate: true,
|
|
20849
|
+
interactive: true,
|
|
20850
|
+
trigger: "manual",
|
|
20851
|
+
placement: "bottom-start"
|
|
20852
|
+
});
|
|
20853
|
+
},
|
|
20854
|
+
onUpdate(props) {
|
|
20855
|
+
component?.updateProps(props);
|
|
20856
|
+
if (!props.clientRect) {
|
|
20857
|
+
return;
|
|
20858
|
+
}
|
|
20859
|
+
popup?.[0]?.setProps({
|
|
20860
|
+
getReferenceClientRect: props.clientRect
|
|
20861
|
+
});
|
|
20862
|
+
},
|
|
20863
|
+
onKeyDown(props) {
|
|
20864
|
+
if (props.event.key === "Escape") {
|
|
20865
|
+
popup?.[0]?.hide();
|
|
20866
|
+
return true;
|
|
20867
|
+
}
|
|
20868
|
+
return component?.ref?.onKeyDown(props) ?? false;
|
|
20869
|
+
},
|
|
20870
|
+
onExit() {
|
|
20871
|
+
popup?.[0]?.destroy();
|
|
20872
|
+
component?.destroy();
|
|
20873
|
+
}
|
|
20874
|
+
};
|
|
20875
|
+
}
|
|
20876
|
+
})
|
|
20877
|
+
];
|
|
20878
|
+
}
|
|
20879
|
+
});
|
|
20880
|
+
|
|
20881
|
+
// ../../components/ui/UEditor/resizable-image.tsx
|
|
20882
|
+
var import_react43 = require("react");
|
|
20883
|
+
var import_extension_image = __toESM(require("@tiptap/extension-image"), 1);
|
|
20884
|
+
var import_core4 = require("@tiptap/core");
|
|
20885
|
+
var import_react44 = require("@tiptap/react");
|
|
20886
|
+
var import_jsx_runtime77 = require("react/jsx-runtime");
|
|
19975
20887
|
var MIN_IMAGE_SIZE_PX = 40;
|
|
19976
20888
|
var AXIS_LOCK_THRESHOLD_PX = 4;
|
|
19977
20889
|
function toNullableNumber(value) {
|
|
@@ -19987,15 +20899,15 @@ function clamp7(value, min, max) {
|
|
|
19987
20899
|
}
|
|
19988
20900
|
function ResizableImageNodeView(props) {
|
|
19989
20901
|
const { node, selected, updateAttributes, editor, getPos } = props;
|
|
19990
|
-
const wrapperRef = (0,
|
|
19991
|
-
const imgRef = (0,
|
|
19992
|
-
const [isHovered, setIsHovered] = (0,
|
|
19993
|
-
const [isResizing, setIsResizing] = (0,
|
|
20902
|
+
const wrapperRef = (0, import_react43.useRef)(null);
|
|
20903
|
+
const imgRef = (0, import_react43.useRef)(null);
|
|
20904
|
+
const [isHovered, setIsHovered] = (0, import_react43.useState)(false);
|
|
20905
|
+
const [isResizing, setIsResizing] = (0, import_react43.useState)(false);
|
|
19994
20906
|
const widthAttr = toNullableNumber(node.attrs["width"]);
|
|
19995
20907
|
const heightAttr = toNullableNumber(node.attrs["height"]);
|
|
19996
20908
|
const textAlign = String(node.attrs["textAlign"] ?? "");
|
|
19997
|
-
const dragStateRef = (0,
|
|
19998
|
-
(0,
|
|
20909
|
+
const dragStateRef = (0, import_react43.useRef)(null);
|
|
20910
|
+
(0, import_react43.useEffect)(() => {
|
|
19999
20911
|
const img = imgRef.current;
|
|
20000
20912
|
if (!img) return;
|
|
20001
20913
|
img.style.width = widthAttr ? `${widthAttr}px` : "";
|
|
@@ -20089,8 +21001,8 @@ function ResizableImageNodeView(props) {
|
|
|
20089
21001
|
const showHandle = selected || isHovered || isResizing;
|
|
20090
21002
|
const wrapperAlignClass = textAlign === "center" ? "mx-auto" : textAlign === "right" ? "ml-auto" : textAlign === "justify" ? "mx-auto" : "";
|
|
20091
21003
|
const wrapperWidthClass = "w-fit";
|
|
20092
|
-
return /* @__PURE__ */ (0,
|
|
20093
|
-
|
|
21004
|
+
return /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)(
|
|
21005
|
+
import_react44.NodeViewWrapper,
|
|
20094
21006
|
{
|
|
20095
21007
|
as: "div",
|
|
20096
21008
|
ref: wrapperRef,
|
|
@@ -20103,7 +21015,7 @@ function ResizableImageNodeView(props) {
|
|
|
20103
21015
|
},
|
|
20104
21016
|
contentEditable: false,
|
|
20105
21017
|
children: [
|
|
20106
|
-
/* @__PURE__ */ (0,
|
|
21018
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
|
|
20107
21019
|
"img",
|
|
20108
21020
|
{
|
|
20109
21021
|
ref: imgRef,
|
|
@@ -20122,7 +21034,7 @@ function ResizableImageNodeView(props) {
|
|
|
20122
21034
|
}
|
|
20123
21035
|
}
|
|
20124
21036
|
),
|
|
20125
|
-
showHandle && /* @__PURE__ */ (0,
|
|
21037
|
+
showHandle && /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
|
|
20126
21038
|
"div",
|
|
20127
21039
|
{
|
|
20128
21040
|
"aria-hidden": "true",
|
|
@@ -20168,10 +21080,10 @@ var ResizableImage = import_extension_image.default.extend({
|
|
|
20168
21080
|
};
|
|
20169
21081
|
},
|
|
20170
21082
|
renderHTML({ HTMLAttributes: HTMLAttributes2 }) {
|
|
20171
|
-
return ["img", (0,
|
|
21083
|
+
return ["img", (0, import_core4.mergeAttributes)(this.options.HTMLAttributes, HTMLAttributes2)];
|
|
20172
21084
|
},
|
|
20173
21085
|
addNodeView() {
|
|
20174
|
-
return (0,
|
|
21086
|
+
return (0, import_react44.ReactNodeViewRenderer)(ResizableImageNodeView);
|
|
20175
21087
|
}
|
|
20176
21088
|
}).configure({
|
|
20177
21089
|
allowBase64: true,
|
|
@@ -20282,23 +21194,24 @@ function buildUEditorExtensions({
|
|
|
20282
21194
|
emptyEditorClass: "is-editor-empty",
|
|
20283
21195
|
emptyNodeClass: "is-empty"
|
|
20284
21196
|
}),
|
|
20285
|
-
SlashCommand
|
|
21197
|
+
SlashCommand,
|
|
21198
|
+
EmojiSuggestion
|
|
20286
21199
|
];
|
|
20287
21200
|
}
|
|
20288
21201
|
|
|
20289
21202
|
// ../../components/ui/UEditor/toolbar.tsx
|
|
20290
|
-
var
|
|
21203
|
+
var import_react48 = __toESM(require("react"), 1);
|
|
20291
21204
|
var import_next_intl3 = require("next-intl");
|
|
20292
|
-
var
|
|
21205
|
+
var import_lucide_react43 = require("lucide-react");
|
|
20293
21206
|
|
|
20294
21207
|
// ../../components/ui/UEditor/colors.tsx
|
|
20295
|
-
var
|
|
21208
|
+
var import_react45 = require("react");
|
|
20296
21209
|
var import_next_intl = require("next-intl");
|
|
20297
|
-
var
|
|
20298
|
-
var
|
|
21210
|
+
var import_lucide_react40 = require("lucide-react");
|
|
21211
|
+
var import_jsx_runtime78 = require("react/jsx-runtime");
|
|
20299
21212
|
var useEditorColors = () => {
|
|
20300
21213
|
const t = (0, import_next_intl.useTranslations)("UEditor");
|
|
20301
|
-
const textColors = (0,
|
|
21214
|
+
const textColors = (0, import_react45.useMemo)(
|
|
20302
21215
|
() => [
|
|
20303
21216
|
{ name: t("colors.default"), color: "inherit", cssClass: "text-foreground" },
|
|
20304
21217
|
{ name: t("colors.muted"), color: "var(--muted-foreground)", cssClass: "text-muted-foreground" },
|
|
@@ -20311,7 +21224,7 @@ var useEditorColors = () => {
|
|
|
20311
21224
|
],
|
|
20312
21225
|
[t]
|
|
20313
21226
|
);
|
|
20314
|
-
const highlightColors = (0,
|
|
21227
|
+
const highlightColors = (0, import_react45.useMemo)(
|
|
20315
21228
|
() => [
|
|
20316
21229
|
{ name: t("colors.default"), color: "", cssClass: "" },
|
|
20317
21230
|
{ name: t("colors.muted"), color: "var(--muted)", cssClass: "bg-muted" },
|
|
@@ -20332,9 +21245,9 @@ var EditorColorPalette = ({
|
|
|
20332
21245
|
currentColor,
|
|
20333
21246
|
onSelect,
|
|
20334
21247
|
label
|
|
20335
|
-
}) => /* @__PURE__ */ (0,
|
|
20336
|
-
/* @__PURE__ */ (0,
|
|
20337
|
-
/* @__PURE__ */ (0,
|
|
21248
|
+
}) => /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "p-2", children: [
|
|
21249
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wider px-2", children: label }),
|
|
21250
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "grid grid-cols-4 gap-1.5 mt-2", children: colors.map((c) => /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)(
|
|
20338
21251
|
"button",
|
|
20339
21252
|
{
|
|
20340
21253
|
type: "button",
|
|
@@ -20347,8 +21260,8 @@ var EditorColorPalette = ({
|
|
|
20347
21260
|
style: { backgroundColor: c.color || "transparent" },
|
|
20348
21261
|
title: c.name,
|
|
20349
21262
|
children: [
|
|
20350
|
-
c.color === "" && /* @__PURE__ */ (0,
|
|
20351
|
-
c.color === "inherit" && /* @__PURE__ */ (0,
|
|
21263
|
+
c.color === "" && /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(import_lucide_react40.X, { className: "w-4 h-4 text-muted-foreground" }),
|
|
21264
|
+
c.color === "inherit" && /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "text-xs font-medium", children: "A" })
|
|
20352
21265
|
]
|
|
20353
21266
|
},
|
|
20354
21267
|
c.name
|
|
@@ -20356,10 +21269,10 @@ var EditorColorPalette = ({
|
|
|
20356
21269
|
] });
|
|
20357
21270
|
|
|
20358
21271
|
// ../../components/ui/UEditor/inputs.tsx
|
|
20359
|
-
var
|
|
21272
|
+
var import_react46 = require("react");
|
|
20360
21273
|
var import_next_intl2 = require("next-intl");
|
|
20361
|
-
var
|
|
20362
|
-
var
|
|
21274
|
+
var import_lucide_react41 = require("lucide-react");
|
|
21275
|
+
var import_jsx_runtime79 = require("react/jsx-runtime");
|
|
20363
21276
|
function normalizeUrl(raw) {
|
|
20364
21277
|
const url = raw.trim();
|
|
20365
21278
|
if (!url) return "";
|
|
@@ -20373,9 +21286,9 @@ var LinkInput = ({
|
|
|
20373
21286
|
initialUrl = ""
|
|
20374
21287
|
}) => {
|
|
20375
21288
|
const t = (0, import_next_intl2.useTranslations)("UEditor");
|
|
20376
|
-
const [url, setUrl] = (0,
|
|
20377
|
-
const inputRef = (0,
|
|
20378
|
-
(0,
|
|
21289
|
+
const [url, setUrl] = (0, import_react46.useState)(initialUrl);
|
|
21290
|
+
const inputRef = (0, import_react46.useRef)(null);
|
|
21291
|
+
(0, import_react46.useEffect)(() => {
|
|
20379
21292
|
inputRef.current?.focus();
|
|
20380
21293
|
inputRef.current?.select();
|
|
20381
21294
|
}, []);
|
|
@@ -20384,8 +21297,8 @@ var LinkInput = ({
|
|
|
20384
21297
|
const normalized = normalizeUrl(url);
|
|
20385
21298
|
if (normalized) onSubmit(normalized);
|
|
20386
21299
|
};
|
|
20387
|
-
return /* @__PURE__ */ (0,
|
|
20388
|
-
/* @__PURE__ */ (0,
|
|
21300
|
+
return /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)("form", { onSubmit: handleSubmit, className: "flex items-center gap-2 p-2", children: [
|
|
21301
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
|
|
20389
21302
|
"input",
|
|
20390
21303
|
{
|
|
20391
21304
|
ref: inputRef,
|
|
@@ -20396,16 +21309,16 @@ var LinkInput = ({
|
|
|
20396
21309
|
className: "flex-1 px-3 py-2 text-sm bg-muted/50 border-0 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary/20"
|
|
20397
21310
|
}
|
|
20398
21311
|
),
|
|
20399
|
-
/* @__PURE__ */ (0,
|
|
20400
|
-
/* @__PURE__ */ (0,
|
|
21312
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)("button", { type: "submit", className: "p-2 rounded-lg bg-primary text-primary-foreground hover:bg-primary/90 transition-colors", children: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(import_lucide_react41.Check, { className: "w-4 h-4" }) }),
|
|
21313
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)("button", { type: "button", onClick: onCancel, className: "p-2 rounded-lg hover:bg-muted transition-colors text-muted-foreground", children: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(import_lucide_react41.X, { className: "w-4 h-4" }) })
|
|
20401
21314
|
] });
|
|
20402
21315
|
};
|
|
20403
21316
|
var ImageInput = ({ onSubmit, onCancel }) => {
|
|
20404
21317
|
const t = (0, import_next_intl2.useTranslations)("UEditor");
|
|
20405
|
-
const [url, setUrl] = (0,
|
|
20406
|
-
const [alt, setAlt] = (0,
|
|
20407
|
-
const inputRef = (0,
|
|
20408
|
-
(0,
|
|
21318
|
+
const [url, setUrl] = (0, import_react46.useState)("");
|
|
21319
|
+
const [alt, setAlt] = (0, import_react46.useState)("");
|
|
21320
|
+
const inputRef = (0, import_react46.useRef)(null);
|
|
21321
|
+
(0, import_react46.useEffect)(() => {
|
|
20409
21322
|
inputRef.current?.focus();
|
|
20410
21323
|
}, []);
|
|
20411
21324
|
const handleSubmit = (e) => {
|
|
@@ -20414,10 +21327,10 @@ var ImageInput = ({ onSubmit, onCancel }) => {
|
|
|
20414
21327
|
onSubmit(url, alt);
|
|
20415
21328
|
}
|
|
20416
21329
|
};
|
|
20417
|
-
return /* @__PURE__ */ (0,
|
|
20418
|
-
/* @__PURE__ */ (0,
|
|
20419
|
-
/* @__PURE__ */ (0,
|
|
20420
|
-
/* @__PURE__ */ (0,
|
|
21330
|
+
return /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)("form", { onSubmit: handleSubmit, className: "p-3 space-y-3", children: [
|
|
21331
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsxs)("div", { children: [
|
|
21332
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)("label", { className: "text-xs font-medium text-muted-foreground", children: t("imageInput.urlLabel") }),
|
|
21333
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
|
|
20421
21334
|
"input",
|
|
20422
21335
|
{
|
|
20423
21336
|
ref: inputRef,
|
|
@@ -20429,9 +21342,9 @@ var ImageInput = ({ onSubmit, onCancel }) => {
|
|
|
20429
21342
|
}
|
|
20430
21343
|
)
|
|
20431
21344
|
] }),
|
|
20432
|
-
/* @__PURE__ */ (0,
|
|
20433
|
-
/* @__PURE__ */ (0,
|
|
20434
|
-
/* @__PURE__ */ (0,
|
|
21345
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsxs)("div", { children: [
|
|
21346
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)("label", { className: "text-xs font-medium text-muted-foreground", children: t("imageInput.altLabel") }),
|
|
21347
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
|
|
20435
21348
|
"input",
|
|
20436
21349
|
{
|
|
20437
21350
|
type: "text",
|
|
@@ -20442,8 +21355,8 @@ var ImageInput = ({ onSubmit, onCancel }) => {
|
|
|
20442
21355
|
}
|
|
20443
21356
|
)
|
|
20444
21357
|
] }),
|
|
20445
|
-
/* @__PURE__ */ (0,
|
|
20446
|
-
/* @__PURE__ */ (0,
|
|
21358
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsxs)("div", { className: "flex gap-2", children: [
|
|
21359
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)(
|
|
20447
21360
|
"button",
|
|
20448
21361
|
{
|
|
20449
21362
|
type: "submit",
|
|
@@ -20452,13 +21365,195 @@ var ImageInput = ({ onSubmit, onCancel }) => {
|
|
|
20452
21365
|
children: t("imageInput.addBtn")
|
|
20453
21366
|
}
|
|
20454
21367
|
),
|
|
20455
|
-
/* @__PURE__ */ (0,
|
|
21368
|
+
/* @__PURE__ */ (0, import_jsx_runtime79.jsx)("button", { type: "button", onClick: onCancel, className: "px-4 py-2 rounded-lg hover:bg-muted transition-colors text-muted-foreground", children: t("imageInput.cancelBtn") })
|
|
20456
21369
|
] })
|
|
20457
21370
|
] });
|
|
20458
21371
|
};
|
|
20459
21372
|
|
|
21373
|
+
// ../../components/ui/UEditor/emoji-picker.tsx
|
|
21374
|
+
var import_react47 = require("react");
|
|
21375
|
+
var import_lucide_react42 = require("lucide-react");
|
|
21376
|
+
var import_jsx_runtime80 = require("react/jsx-runtime");
|
|
21377
|
+
var CATEGORY_ICONS = {
|
|
21378
|
+
"smileys_people": import_lucide_react42.Smile,
|
|
21379
|
+
"animals_nature": import_lucide_react42.Leaf,
|
|
21380
|
+
"food_drink": import_lucide_react42.Utensils,
|
|
21381
|
+
"activity": import_lucide_react42.Dumbbell,
|
|
21382
|
+
"objects": import_lucide_react42.Lightbulb,
|
|
21383
|
+
"symbols": import_lucide_react42.Hash,
|
|
21384
|
+
"flags": import_lucide_react42.Flag
|
|
21385
|
+
};
|
|
21386
|
+
var EmojiPicker = ({ onSelect, onClose }) => {
|
|
21387
|
+
const [search, setSearch] = (0, import_react47.useState)("");
|
|
21388
|
+
const [activeCategory, setActiveCategory] = (0, import_react47.useState)(EMOJI_LIST[0]?.id || "");
|
|
21389
|
+
const scrollContainerRef = (0, import_react47.useRef)(null);
|
|
21390
|
+
const categoryRefs = (0, import_react47.useRef)({});
|
|
21391
|
+
const isUserScrolling = (0, import_react47.useRef)(false);
|
|
21392
|
+
const filteredCategories = (0, import_react47.useMemo)(() => {
|
|
21393
|
+
if (!search.trim()) return EMOJI_LIST;
|
|
21394
|
+
const query = search.toLowerCase();
|
|
21395
|
+
return EMOJI_LIST.map((category) => ({
|
|
21396
|
+
...category,
|
|
21397
|
+
emojis: category.emojis.filter(
|
|
21398
|
+
(emoji) => emoji.name.toLowerCase().includes(query) || emoji.emoji.includes(search)
|
|
21399
|
+
)
|
|
21400
|
+
})).filter((category) => category.emojis.length > 0);
|
|
21401
|
+
}, [search]);
|
|
21402
|
+
const handleEmojiClick = (emoji) => {
|
|
21403
|
+
onSelect(emoji);
|
|
21404
|
+
setSearch("");
|
|
21405
|
+
};
|
|
21406
|
+
(0, import_react47.useEffect)(() => {
|
|
21407
|
+
if (search) return;
|
|
21408
|
+
const container = scrollContainerRef.current;
|
|
21409
|
+
if (!container) return;
|
|
21410
|
+
const handleScroll = () => {
|
|
21411
|
+
if (!isUserScrolling.current) return;
|
|
21412
|
+
const scrollTop = container.scrollTop;
|
|
21413
|
+
const containerHeight = container.clientHeight;
|
|
21414
|
+
let maxVisibility = 0;
|
|
21415
|
+
let mostVisibleCategory = EMOJI_LIST[0]?.id || "";
|
|
21416
|
+
EMOJI_LIST.forEach((category) => {
|
|
21417
|
+
const element = categoryRefs.current[category.id];
|
|
21418
|
+
if (!element) return;
|
|
21419
|
+
const rect = element.getBoundingClientRect();
|
|
21420
|
+
const containerRect = container.getBoundingClientRect();
|
|
21421
|
+
const visibleTop = Math.max(rect.top, containerRect.top);
|
|
21422
|
+
const visibleBottom = Math.min(rect.bottom, containerRect.bottom);
|
|
21423
|
+
const visibleHeight = Math.max(0, visibleBottom - visibleTop);
|
|
21424
|
+
if (visibleHeight > maxVisibility) {
|
|
21425
|
+
maxVisibility = visibleHeight;
|
|
21426
|
+
mostVisibleCategory = category.id;
|
|
21427
|
+
}
|
|
21428
|
+
});
|
|
21429
|
+
if (mostVisibleCategory !== activeCategory) {
|
|
21430
|
+
setActiveCategory(mostVisibleCategory);
|
|
21431
|
+
}
|
|
21432
|
+
};
|
|
21433
|
+
container.addEventListener("scroll", handleScroll);
|
|
21434
|
+
return () => container.removeEventListener("scroll", handleScroll);
|
|
21435
|
+
}, [search, activeCategory]);
|
|
21436
|
+
const handleCategoryClick = (categoryId) => {
|
|
21437
|
+
const element = categoryRefs.current[categoryId];
|
|
21438
|
+
if (!element || !scrollContainerRef.current) return;
|
|
21439
|
+
isUserScrolling.current = false;
|
|
21440
|
+
setActiveCategory(categoryId);
|
|
21441
|
+
element.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
21442
|
+
setTimeout(() => {
|
|
21443
|
+
isUserScrolling.current = true;
|
|
21444
|
+
}, 500);
|
|
21445
|
+
};
|
|
21446
|
+
(0, import_react47.useEffect)(() => {
|
|
21447
|
+
isUserScrolling.current = true;
|
|
21448
|
+
}, []);
|
|
21449
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)("div", { className: "w-96 bg-card border border-border rounded-2xl shadow-xl overflow-hidden flex flex-col max-h-128", children: [
|
|
21450
|
+
/* @__PURE__ */ (0, import_jsx_runtime80.jsx)("div", { className: "p-3 border-b bg-muted/30 shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)("div", { className: "relative", children: [
|
|
21451
|
+
/* @__PURE__ */ (0, import_jsx_runtime80.jsx)(import_lucide_react42.Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground" }),
|
|
21452
|
+
/* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
21453
|
+
"input",
|
|
21454
|
+
{
|
|
21455
|
+
type: "text",
|
|
21456
|
+
placeholder: "T\xECm ki\u1EBFm bi\u1EC3u t\u01B0\u1EE3ng c\u1EA3m x\xFAc",
|
|
21457
|
+
value: search,
|
|
21458
|
+
onChange: (e) => setSearch(e.target.value),
|
|
21459
|
+
className: cn(
|
|
21460
|
+
"w-full pl-9 pr-9 py-2 rounded-lg",
|
|
21461
|
+
"bg-background border border-border",
|
|
21462
|
+
"text-sm placeholder:text-muted-foreground",
|
|
21463
|
+
"focus:outline-none focus:ring-2 focus:ring-primary/20"
|
|
21464
|
+
)
|
|
21465
|
+
}
|
|
21466
|
+
),
|
|
21467
|
+
search && /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
21468
|
+
"button",
|
|
21469
|
+
{
|
|
21470
|
+
onClick: () => setSearch(""),
|
|
21471
|
+
className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground",
|
|
21472
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(import_lucide_react42.X, { className: "w-4 h-4" })
|
|
21473
|
+
}
|
|
21474
|
+
)
|
|
21475
|
+
] }) }),
|
|
21476
|
+
/* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
21477
|
+
"div",
|
|
21478
|
+
{
|
|
21479
|
+
ref: scrollContainerRef,
|
|
21480
|
+
className: "overflow-y-auto px-3 py-2 shrink",
|
|
21481
|
+
style: { height: "20rem" },
|
|
21482
|
+
children: search ? (
|
|
21483
|
+
// Search Results
|
|
21484
|
+
filteredCategories.length > 0 ? filteredCategories.map((category) => /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)("div", { className: "mb-4", children: [
|
|
21485
|
+
/* @__PURE__ */ (0, import_jsx_runtime80.jsx)("div", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2 sticky top-0 bg-card py-1", children: category.name }),
|
|
21486
|
+
/* @__PURE__ */ (0, import_jsx_runtime80.jsx)("div", { className: "grid grid-cols-9 gap-1", children: category.emojis.map((emoji) => /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
21487
|
+
"button",
|
|
21488
|
+
{
|
|
21489
|
+
onClick: () => handleEmojiClick(emoji.emoji),
|
|
21490
|
+
className: cn(
|
|
21491
|
+
"w-9 h-9 flex items-center justify-center rounded-lg",
|
|
21492
|
+
"text-2xl hover:bg-accent transition-colors",
|
|
21493
|
+
"focus:outline-none focus:ring-2 focus:ring-primary/20"
|
|
21494
|
+
),
|
|
21495
|
+
title: emoji.name.replace(/_/g, " "),
|
|
21496
|
+
children: emoji.emoji
|
|
21497
|
+
},
|
|
21498
|
+
emoji.name
|
|
21499
|
+
)) })
|
|
21500
|
+
] }, category.id)) : /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)("div", { className: "flex flex-col items-center justify-center h-full text-center", children: [
|
|
21501
|
+
/* @__PURE__ */ (0, import_jsx_runtime80.jsx)("div", { className: "text-4xl mb-2", children: "\u{1F50D}" }),
|
|
21502
|
+
/* @__PURE__ */ (0, import_jsx_runtime80.jsx)("div", { className: "text-sm font-medium text-muted-foreground", children: "Kh\xF4ng t\xECm th\u1EA5y emoji" }),
|
|
21503
|
+
/* @__PURE__ */ (0, import_jsx_runtime80.jsx)("div", { className: "text-xs text-muted-foreground mt-1", children: "Th\u1EED t\u1EEB kh\xF3a kh\xE1c" })
|
|
21504
|
+
] })
|
|
21505
|
+
) : (
|
|
21506
|
+
// All Categories - Messenger Style
|
|
21507
|
+
/* @__PURE__ */ (0, import_jsx_runtime80.jsx)("div", { className: "space-y-4", children: EMOJI_LIST.map((category) => /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(
|
|
21508
|
+
"div",
|
|
21509
|
+
{
|
|
21510
|
+
ref: (el) => {
|
|
21511
|
+
categoryRefs.current[category.id] = el;
|
|
21512
|
+
},
|
|
21513
|
+
children: [
|
|
21514
|
+
/* @__PURE__ */ (0, import_jsx_runtime80.jsx)("div", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2 sticky top-0 bg-card py-1 z-10", children: category.name }),
|
|
21515
|
+
/* @__PURE__ */ (0, import_jsx_runtime80.jsx)("div", { className: "grid grid-cols-9 gap-1", children: category.emojis.map((emoji) => /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
21516
|
+
"button",
|
|
21517
|
+
{
|
|
21518
|
+
onClick: () => handleEmojiClick(emoji.emoji),
|
|
21519
|
+
className: cn(
|
|
21520
|
+
"w-9 h-9 flex items-center justify-center rounded-lg",
|
|
21521
|
+
"text-2xl hover:bg-accent transition-colors",
|
|
21522
|
+
"focus:outline-none focus:ring-2 focus:ring-primary/20"
|
|
21523
|
+
),
|
|
21524
|
+
title: emoji.name.replace(/_/g, " "),
|
|
21525
|
+
children: emoji.emoji
|
|
21526
|
+
},
|
|
21527
|
+
emoji.name
|
|
21528
|
+
)) })
|
|
21529
|
+
]
|
|
21530
|
+
},
|
|
21531
|
+
category.id
|
|
21532
|
+
)) })
|
|
21533
|
+
)
|
|
21534
|
+
}
|
|
21535
|
+
),
|
|
21536
|
+
!search && /* @__PURE__ */ (0, import_jsx_runtime80.jsx)("div", { className: "flex items-center justify-around px-2 py-2 border-t bg-muted/30 shrink-0", children: EMOJI_LIST.map((category) => {
|
|
21537
|
+
const IconComponent = CATEGORY_ICONS[category.id] || import_lucide_react42.Smile;
|
|
21538
|
+
return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(
|
|
21539
|
+
"button",
|
|
21540
|
+
{
|
|
21541
|
+
onClick: () => handleCategoryClick(category.id),
|
|
21542
|
+
className: cn(
|
|
21543
|
+
"p-2 rounded-lg transition-colors",
|
|
21544
|
+
activeCategory === category.id ? "text-primary bg-primary/10" : "text-muted-foreground hover:text-foreground hover:bg-accent"
|
|
21545
|
+
),
|
|
21546
|
+
title: category.name,
|
|
21547
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(IconComponent, { className: "w-5 h-5" })
|
|
21548
|
+
},
|
|
21549
|
+
category.id
|
|
21550
|
+
);
|
|
21551
|
+
}) })
|
|
21552
|
+
] });
|
|
21553
|
+
};
|
|
21554
|
+
|
|
20460
21555
|
// ../../components/ui/UEditor/toolbar.tsx
|
|
20461
|
-
var
|
|
21556
|
+
var import_jsx_runtime81 = require("react/jsx-runtime");
|
|
20462
21557
|
function fileToDataUrl2(file) {
|
|
20463
21558
|
return new Promise((resolve, reject) => {
|
|
20464
21559
|
const reader = new FileReader();
|
|
@@ -20467,8 +21562,8 @@ function fileToDataUrl2(file) {
|
|
|
20467
21562
|
reader.readAsDataURL(file);
|
|
20468
21563
|
});
|
|
20469
21564
|
}
|
|
20470
|
-
var ToolbarButton =
|
|
20471
|
-
const button = /* @__PURE__ */ (0,
|
|
21565
|
+
var ToolbarButton = import_react48.default.forwardRef(({ onClick, onMouseDown, active, disabled, children, title, className }, ref) => {
|
|
21566
|
+
const button = /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20472
21567
|
"button",
|
|
20473
21568
|
{
|
|
20474
21569
|
ref,
|
|
@@ -20491,12 +21586,12 @@ var ToolbarButton = import_react45.default.forwardRef(({ onClick, onMouseDown, a
|
|
|
20491
21586
|
}
|
|
20492
21587
|
);
|
|
20493
21588
|
if (title) {
|
|
20494
|
-
return /* @__PURE__ */ (0,
|
|
21589
|
+
return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(Tooltip, { content: title, placement: "top", delay: { open: 200, close: 0 }, children: button });
|
|
20495
21590
|
}
|
|
20496
21591
|
return button;
|
|
20497
21592
|
});
|
|
20498
21593
|
ToolbarButton.displayName = "ToolbarButton";
|
|
20499
|
-
var ToolbarDivider = () => /* @__PURE__ */ (0,
|
|
21594
|
+
var ToolbarDivider = () => /* @__PURE__ */ (0, import_jsx_runtime81.jsx)("div", { className: "w-px h-6 bg-border/50 mx-1" });
|
|
20500
21595
|
var EditorToolbar = ({
|
|
20501
21596
|
editor,
|
|
20502
21597
|
variant,
|
|
@@ -20505,10 +21600,10 @@ var EditorToolbar = ({
|
|
|
20505
21600
|
}) => {
|
|
20506
21601
|
const t = (0, import_next_intl3.useTranslations)("UEditor");
|
|
20507
21602
|
const { textColors, highlightColors } = useEditorColors();
|
|
20508
|
-
const [showImageInput, setShowImageInput] = (0,
|
|
20509
|
-
const fileInputRef = (0,
|
|
20510
|
-
const [isUploadingImage, setIsUploadingImage] = (0,
|
|
20511
|
-
const [imageUploadError, setImageUploadError] = (0,
|
|
21603
|
+
const [showImageInput, setShowImageInput] = (0, import_react48.useState)(false);
|
|
21604
|
+
const fileInputRef = (0, import_react48.useRef)(null);
|
|
21605
|
+
const [isUploadingImage, setIsUploadingImage] = (0, import_react48.useState)(false);
|
|
21606
|
+
const [imageUploadError, setImageUploadError] = (0, import_react48.useState)(null);
|
|
20512
21607
|
const insertImageFiles = async (files) => {
|
|
20513
21608
|
if (files.length === 0) return;
|
|
20514
21609
|
setIsUploadingImage(true);
|
|
@@ -20527,63 +21622,63 @@ var EditorToolbar = ({
|
|
|
20527
21622
|
setIsUploadingImage(false);
|
|
20528
21623
|
};
|
|
20529
21624
|
if (variant === "minimal") {
|
|
20530
|
-
return /* @__PURE__ */ (0,
|
|
20531
|
-
/* @__PURE__ */ (0,
|
|
20532
|
-
/* @__PURE__ */ (0,
|
|
20533
|
-
/* @__PURE__ */ (0,
|
|
21625
|
+
return /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)("div", { className: "flex items-center gap-1 p-2 border-b bg-muted/30", children: [
|
|
21626
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleBold().run(), active: editor.isActive("bold"), title: t("toolbar.bold"), children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Bold, { className: "w-4 h-4" }) }),
|
|
21627
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive("italic"), title: t("toolbar.italic"), children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Italic, { className: "w-4 h-4" }) }),
|
|
21628
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20534
21629
|
ToolbarButton,
|
|
20535
21630
|
{
|
|
20536
21631
|
onClick: () => editor.chain().focus().toggleBulletList().run(),
|
|
20537
21632
|
active: editor.isActive("bulletList"),
|
|
20538
21633
|
title: t("toolbar.bulletList"),
|
|
20539
|
-
children: /* @__PURE__ */ (0,
|
|
21634
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.List, { className: "w-4 h-4" })
|
|
20540
21635
|
}
|
|
20541
21636
|
)
|
|
20542
21637
|
] });
|
|
20543
21638
|
}
|
|
20544
|
-
return /* @__PURE__ */ (0,
|
|
20545
|
-
/* @__PURE__ */ (0,
|
|
21639
|
+
return /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)("div", { className: "flex flex-wrap items-center gap-1 p-2 border-b bg-linear-to-r from-muted/30 to-transparent", children: [
|
|
21640
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(
|
|
20546
21641
|
DropdownMenu,
|
|
20547
21642
|
{
|
|
20548
|
-
trigger: /* @__PURE__ */ (0,
|
|
21643
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(ToolbarButton, { onClick: () => {
|
|
20549
21644
|
}, title: t("toolbar.textStyle"), className: "px-2 w-auto gap-1", children: [
|
|
20550
|
-
/* @__PURE__ */ (0,
|
|
20551
|
-
/* @__PURE__ */ (0,
|
|
21645
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Type, { className: "w-4 h-4" }),
|
|
21646
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.ChevronDown, { className: "w-3 h-3" })
|
|
20552
21647
|
] }),
|
|
20553
21648
|
children: [
|
|
20554
|
-
/* @__PURE__ */ (0,
|
|
21649
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20555
21650
|
DropdownMenuItem,
|
|
20556
21651
|
{
|
|
20557
|
-
icon:
|
|
21652
|
+
icon: import_lucide_react43.Type,
|
|
20558
21653
|
label: t("toolbar.normal"),
|
|
20559
21654
|
onClick: () => editor.chain().focus().setParagraph().run(),
|
|
20560
21655
|
active: editor.isActive("paragraph")
|
|
20561
21656
|
}
|
|
20562
21657
|
),
|
|
20563
|
-
/* @__PURE__ */ (0,
|
|
21658
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20564
21659
|
DropdownMenuItem,
|
|
20565
21660
|
{
|
|
20566
|
-
icon:
|
|
21661
|
+
icon: import_lucide_react43.Heading1,
|
|
20567
21662
|
label: t("toolbar.heading1"),
|
|
20568
21663
|
onClick: () => editor.chain().focus().toggleHeading({ level: 1 }).run(),
|
|
20569
21664
|
active: editor.isActive("heading", { level: 1 }),
|
|
20570
21665
|
shortcut: "Ctrl+Alt+1"
|
|
20571
21666
|
}
|
|
20572
21667
|
),
|
|
20573
|
-
/* @__PURE__ */ (0,
|
|
21668
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20574
21669
|
DropdownMenuItem,
|
|
20575
21670
|
{
|
|
20576
|
-
icon:
|
|
21671
|
+
icon: import_lucide_react43.Heading2,
|
|
20577
21672
|
label: t("toolbar.heading2"),
|
|
20578
21673
|
onClick: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),
|
|
20579
21674
|
active: editor.isActive("heading", { level: 2 }),
|
|
20580
21675
|
shortcut: "Ctrl+Alt+2"
|
|
20581
21676
|
}
|
|
20582
21677
|
),
|
|
20583
|
-
/* @__PURE__ */ (0,
|
|
21678
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20584
21679
|
DropdownMenuItem,
|
|
20585
21680
|
{
|
|
20586
|
-
icon:
|
|
21681
|
+
icon: import_lucide_react43.Heading3,
|
|
20587
21682
|
label: t("toolbar.heading3"),
|
|
20588
21683
|
onClick: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),
|
|
20589
21684
|
active: editor.isActive("heading", { level: 3 }),
|
|
@@ -20593,30 +21688,30 @@ var EditorToolbar = ({
|
|
|
20593
21688
|
]
|
|
20594
21689
|
}
|
|
20595
21690
|
),
|
|
20596
|
-
/* @__PURE__ */ (0,
|
|
20597
|
-
/* @__PURE__ */ (0,
|
|
20598
|
-
/* @__PURE__ */ (0,
|
|
20599
|
-
/* @__PURE__ */ (0,
|
|
21691
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarDivider, {}),
|
|
21692
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleBold().run(), active: editor.isActive("bold"), title: t("toolbar.bold"), children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Bold, { className: "w-4 h-4" }) }),
|
|
21693
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive("italic"), title: t("toolbar.italic"), children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Italic, { className: "w-4 h-4" }) }),
|
|
21694
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20600
21695
|
ToolbarButton,
|
|
20601
21696
|
{
|
|
20602
21697
|
onClick: () => editor.chain().focus().toggleUnderline().run(),
|
|
20603
21698
|
active: editor.isActive("underline"),
|
|
20604
21699
|
title: t("toolbar.underline"),
|
|
20605
|
-
children: /* @__PURE__ */ (0,
|
|
21700
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Underline, { className: "w-4 h-4" })
|
|
20606
21701
|
}
|
|
20607
21702
|
),
|
|
20608
|
-
/* @__PURE__ */ (0,
|
|
20609
|
-
/* @__PURE__ */ (0,
|
|
20610
|
-
/* @__PURE__ */ (0,
|
|
20611
|
-
/* @__PURE__ */ (0,
|
|
21703
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleStrike().run(), active: editor.isActive("strike"), title: t("toolbar.strike"), children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Strikethrough, { className: "w-4 h-4" }) }),
|
|
21704
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleCode().run(), active: editor.isActive("code"), title: t("toolbar.code"), children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Code, { className: "w-4 h-4" }) }),
|
|
21705
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarDivider, {}),
|
|
21706
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20612
21707
|
DropdownMenu,
|
|
20613
21708
|
{
|
|
20614
|
-
trigger: /* @__PURE__ */ (0,
|
|
21709
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(ToolbarButton, { onClick: () => {
|
|
20615
21710
|
}, title: t("colors.textColor"), children: [
|
|
20616
|
-
/* @__PURE__ */ (0,
|
|
20617
|
-
/* @__PURE__ */ (0,
|
|
21711
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Palette, { className: "w-4 h-4" }),
|
|
21712
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.ChevronDown, { className: "w-3 h-3" })
|
|
20618
21713
|
] }),
|
|
20619
|
-
children: /* @__PURE__ */ (0,
|
|
21714
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20620
21715
|
EditorColorPalette,
|
|
20621
21716
|
{
|
|
20622
21717
|
colors: textColors,
|
|
@@ -20633,15 +21728,15 @@ var EditorToolbar = ({
|
|
|
20633
21728
|
)
|
|
20634
21729
|
}
|
|
20635
21730
|
),
|
|
20636
|
-
/* @__PURE__ */ (0,
|
|
21731
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20637
21732
|
DropdownMenu,
|
|
20638
21733
|
{
|
|
20639
|
-
trigger: /* @__PURE__ */ (0,
|
|
21734
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(ToolbarButton, { onClick: () => {
|
|
20640
21735
|
}, active: editor.isActive("highlight"), title: t("colors.highlight"), children: [
|
|
20641
|
-
/* @__PURE__ */ (0,
|
|
20642
|
-
/* @__PURE__ */ (0,
|
|
21736
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Highlighter, { className: "w-4 h-4" }),
|
|
21737
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.ChevronDown, { className: "w-3 h-3" })
|
|
20643
21738
|
] }),
|
|
20644
|
-
children: /* @__PURE__ */ (0,
|
|
21739
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20645
21740
|
EditorColorPalette,
|
|
20646
21741
|
{
|
|
20647
21742
|
colors: highlightColors,
|
|
@@ -20658,47 +21753,63 @@ var EditorToolbar = ({
|
|
|
20658
21753
|
)
|
|
20659
21754
|
}
|
|
20660
21755
|
),
|
|
20661
|
-
/* @__PURE__ */ (0,
|
|
20662
|
-
/* @__PURE__ */ (0,
|
|
21756
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarDivider, {}),
|
|
21757
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20663
21758
|
DropdownMenu,
|
|
20664
21759
|
{
|
|
20665
|
-
trigger: /* @__PURE__ */ (0,
|
|
21760
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarButton, { onClick: () => {
|
|
21761
|
+
}, title: t("toolbar.emoji"), children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Smile, { className: "w-4 h-4" }) }),
|
|
21762
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
21763
|
+
EmojiPicker,
|
|
21764
|
+
{
|
|
21765
|
+
onSelect: (emoji) => {
|
|
21766
|
+
editor.chain().focus().insertContent(emoji).run();
|
|
21767
|
+
}
|
|
21768
|
+
}
|
|
21769
|
+
)
|
|
21770
|
+
}
|
|
21771
|
+
),
|
|
21772
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarDivider, {}),
|
|
21773
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(
|
|
21774
|
+
DropdownMenu,
|
|
21775
|
+
{
|
|
21776
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(ToolbarButton, { onClick: () => {
|
|
20666
21777
|
}, title: t("toolbar.alignment"), children: [
|
|
20667
|
-
/* @__PURE__ */ (0,
|
|
20668
|
-
/* @__PURE__ */ (0,
|
|
21778
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.AlignLeft, { className: "w-4 h-4" }),
|
|
21779
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.ChevronDown, { className: "w-3 h-3" })
|
|
20669
21780
|
] }),
|
|
20670
21781
|
children: [
|
|
20671
|
-
/* @__PURE__ */ (0,
|
|
21782
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20672
21783
|
DropdownMenuItem,
|
|
20673
21784
|
{
|
|
20674
|
-
icon:
|
|
21785
|
+
icon: import_lucide_react43.AlignLeft,
|
|
20675
21786
|
label: t("toolbar.alignLeft"),
|
|
20676
21787
|
onClick: () => editor.chain().focus().setTextAlign("left").run(),
|
|
20677
21788
|
active: editor.isActive({ textAlign: "left" })
|
|
20678
21789
|
}
|
|
20679
21790
|
),
|
|
20680
|
-
/* @__PURE__ */ (0,
|
|
21791
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20681
21792
|
DropdownMenuItem,
|
|
20682
21793
|
{
|
|
20683
|
-
icon:
|
|
21794
|
+
icon: import_lucide_react43.AlignCenter,
|
|
20684
21795
|
label: t("toolbar.alignCenter"),
|
|
20685
21796
|
onClick: () => editor.chain().focus().setTextAlign("center").run(),
|
|
20686
21797
|
active: editor.isActive({ textAlign: "center" })
|
|
20687
21798
|
}
|
|
20688
21799
|
),
|
|
20689
|
-
/* @__PURE__ */ (0,
|
|
21800
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20690
21801
|
DropdownMenuItem,
|
|
20691
21802
|
{
|
|
20692
|
-
icon:
|
|
21803
|
+
icon: import_lucide_react43.AlignRight,
|
|
20693
21804
|
label: t("toolbar.alignRight"),
|
|
20694
21805
|
onClick: () => editor.chain().focus().setTextAlign("right").run(),
|
|
20695
21806
|
active: editor.isActive({ textAlign: "right" })
|
|
20696
21807
|
}
|
|
20697
21808
|
),
|
|
20698
|
-
/* @__PURE__ */ (0,
|
|
21809
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20699
21810
|
DropdownMenuItem,
|
|
20700
21811
|
{
|
|
20701
|
-
icon:
|
|
21812
|
+
icon: import_lucide_react43.AlignJustify,
|
|
20702
21813
|
label: t("toolbar.justify"),
|
|
20703
21814
|
onClick: () => editor.chain().focus().setTextAlign("justify").run(),
|
|
20704
21815
|
active: editor.isActive({ textAlign: "justify" })
|
|
@@ -20707,40 +21818,40 @@ var EditorToolbar = ({
|
|
|
20707
21818
|
]
|
|
20708
21819
|
}
|
|
20709
21820
|
),
|
|
20710
|
-
/* @__PURE__ */ (0,
|
|
20711
|
-
/* @__PURE__ */ (0,
|
|
21821
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarDivider, {}),
|
|
21822
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(
|
|
20712
21823
|
DropdownMenu,
|
|
20713
21824
|
{
|
|
20714
|
-
trigger: /* @__PURE__ */ (0,
|
|
21825
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(ToolbarButton, { onClick: () => {
|
|
20715
21826
|
}, title: t("toolbar.bulletList"), children: [
|
|
20716
|
-
/* @__PURE__ */ (0,
|
|
20717
|
-
/* @__PURE__ */ (0,
|
|
21827
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.List, { className: "w-4 h-4" }),
|
|
21828
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.ChevronDown, { className: "w-3 h-3" })
|
|
20718
21829
|
] }),
|
|
20719
21830
|
children: [
|
|
20720
|
-
/* @__PURE__ */ (0,
|
|
21831
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20721
21832
|
DropdownMenuItem,
|
|
20722
21833
|
{
|
|
20723
|
-
icon:
|
|
21834
|
+
icon: import_lucide_react43.List,
|
|
20724
21835
|
label: t("toolbar.bulletList"),
|
|
20725
21836
|
onClick: () => editor.chain().focus().toggleBulletList().run(),
|
|
20726
21837
|
active: editor.isActive("bulletList"),
|
|
20727
21838
|
shortcut: "Ctrl+Shift+8"
|
|
20728
21839
|
}
|
|
20729
21840
|
),
|
|
20730
|
-
/* @__PURE__ */ (0,
|
|
21841
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20731
21842
|
DropdownMenuItem,
|
|
20732
21843
|
{
|
|
20733
|
-
icon:
|
|
21844
|
+
icon: import_lucide_react43.ListOrdered,
|
|
20734
21845
|
label: t("toolbar.orderedList"),
|
|
20735
21846
|
onClick: () => editor.chain().focus().toggleOrderedList().run(),
|
|
20736
21847
|
active: editor.isActive("orderedList"),
|
|
20737
21848
|
shortcut: "Ctrl+Shift+7"
|
|
20738
21849
|
}
|
|
20739
21850
|
),
|
|
20740
|
-
/* @__PURE__ */ (0,
|
|
21851
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20741
21852
|
DropdownMenuItem,
|
|
20742
21853
|
{
|
|
20743
|
-
icon:
|
|
21854
|
+
icon: import_lucide_react43.ListTodo,
|
|
20744
21855
|
label: t("toolbar.taskList"),
|
|
20745
21856
|
onClick: () => editor.chain().focus().toggleTaskList().run(),
|
|
20746
21857
|
active: editor.isActive("taskList"),
|
|
@@ -20750,29 +21861,29 @@ var EditorToolbar = ({
|
|
|
20750
21861
|
]
|
|
20751
21862
|
}
|
|
20752
21863
|
),
|
|
20753
|
-
/* @__PURE__ */ (0,
|
|
21864
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(
|
|
20754
21865
|
DropdownMenu,
|
|
20755
21866
|
{
|
|
20756
|
-
trigger: /* @__PURE__ */ (0,
|
|
21867
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(ToolbarButton, { onClick: () => {
|
|
20757
21868
|
}, title: t("toolbar.quote"), children: [
|
|
20758
|
-
/* @__PURE__ */ (0,
|
|
20759
|
-
/* @__PURE__ */ (0,
|
|
21869
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Quote, { className: "w-4 h-4" }),
|
|
21870
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.ChevronDown, { className: "w-3 h-3" })
|
|
20760
21871
|
] }),
|
|
20761
21872
|
children: [
|
|
20762
|
-
/* @__PURE__ */ (0,
|
|
21873
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20763
21874
|
DropdownMenuItem,
|
|
20764
21875
|
{
|
|
20765
|
-
icon:
|
|
21876
|
+
icon: import_lucide_react43.Quote,
|
|
20766
21877
|
label: t("toolbar.quote"),
|
|
20767
21878
|
onClick: () => editor.chain().focus().toggleBlockquote().run(),
|
|
20768
21879
|
active: editor.isActive("blockquote"),
|
|
20769
21880
|
shortcut: "Ctrl+Shift+B"
|
|
20770
21881
|
}
|
|
20771
21882
|
),
|
|
20772
|
-
/* @__PURE__ */ (0,
|
|
21883
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20773
21884
|
DropdownMenuItem,
|
|
20774
21885
|
{
|
|
20775
|
-
icon:
|
|
21886
|
+
icon: import_lucide_react43.FileCode,
|
|
20776
21887
|
label: t("toolbar.codeBlock"),
|
|
20777
21888
|
onClick: () => editor.chain().focus().toggleCodeBlock().run(),
|
|
20778
21889
|
active: editor.isActive("codeBlock"),
|
|
@@ -20782,15 +21893,15 @@ var EditorToolbar = ({
|
|
|
20782
21893
|
]
|
|
20783
21894
|
}
|
|
20784
21895
|
),
|
|
20785
|
-
/* @__PURE__ */ (0,
|
|
21896
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20786
21897
|
DropdownMenu,
|
|
20787
21898
|
{
|
|
20788
|
-
trigger: /* @__PURE__ */ (0,
|
|
21899
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(ToolbarButton, { onClick: () => {
|
|
20789
21900
|
}, title: t("toolbar.image"), children: [
|
|
20790
|
-
/* @__PURE__ */ (0,
|
|
20791
|
-
/* @__PURE__ */ (0,
|
|
21901
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Image, { className: "w-4 h-4" }),
|
|
21902
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.ChevronDown, { className: "w-3 h-3" })
|
|
20792
21903
|
] }),
|
|
20793
|
-
children: showImageInput ? /* @__PURE__ */ (0,
|
|
21904
|
+
children: showImageInput ? /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20794
21905
|
ImageInput,
|
|
20795
21906
|
{
|
|
20796
21907
|
onSubmit: (url, alt) => {
|
|
@@ -20799,19 +21910,19 @@ var EditorToolbar = ({
|
|
|
20799
21910
|
},
|
|
20800
21911
|
onCancel: () => setShowImageInput(false)
|
|
20801
21912
|
}
|
|
20802
|
-
) : /* @__PURE__ */ (0,
|
|
20803
|
-
/* @__PURE__ */ (0,
|
|
20804
|
-
/* @__PURE__ */ (0,
|
|
21913
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(import_jsx_runtime81.Fragment, { children: [
|
|
21914
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(DropdownMenuItem, { icon: import_lucide_react43.Link, label: t("imageInput.addFromUrl"), onClick: () => setShowImageInput(true) }),
|
|
21915
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20805
21916
|
DropdownMenuItem,
|
|
20806
21917
|
{
|
|
20807
|
-
icon:
|
|
21918
|
+
icon: import_lucide_react43.Upload,
|
|
20808
21919
|
label: isUploadingImage ? t("imageInput.uploading") : t("imageInput.uploadTab"),
|
|
20809
21920
|
disabled: isUploadingImage,
|
|
20810
21921
|
onClick: () => fileInputRef.current?.click()
|
|
20811
21922
|
}
|
|
20812
21923
|
),
|
|
20813
|
-
imageUploadError && /* @__PURE__ */ (0,
|
|
20814
|
-
/* @__PURE__ */ (0,
|
|
21924
|
+
imageUploadError && /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(DropdownMenuItem, { label: imageUploadError, disabled: true, destructive: true }),
|
|
21925
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20815
21926
|
"input",
|
|
20816
21927
|
{
|
|
20817
21928
|
ref: fileInputRef,
|
|
@@ -20829,83 +21940,83 @@ var EditorToolbar = ({
|
|
|
20829
21940
|
] })
|
|
20830
21941
|
}
|
|
20831
21942
|
),
|
|
20832
|
-
/* @__PURE__ */ (0,
|
|
21943
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(
|
|
20833
21944
|
DropdownMenu,
|
|
20834
21945
|
{
|
|
20835
|
-
trigger: /* @__PURE__ */ (0,
|
|
21946
|
+
trigger: /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(ToolbarButton, { onClick: () => {
|
|
20836
21947
|
}, title: t("toolbar.table"), children: [
|
|
20837
|
-
/* @__PURE__ */ (0,
|
|
20838
|
-
/* @__PURE__ */ (0,
|
|
21948
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Table, { className: "w-4 h-4" }),
|
|
21949
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.ChevronDown, { className: "w-3 h-3" })
|
|
20839
21950
|
] }),
|
|
20840
21951
|
children: [
|
|
20841
|
-
/* @__PURE__ */ (0,
|
|
21952
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20842
21953
|
DropdownMenuItem,
|
|
20843
21954
|
{
|
|
20844
|
-
icon:
|
|
21955
|
+
icon: import_lucide_react43.Table,
|
|
20845
21956
|
label: t("tableMenu.insert3x3"),
|
|
20846
21957
|
onClick: () => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run()
|
|
20847
21958
|
}
|
|
20848
21959
|
),
|
|
20849
|
-
/* @__PURE__ */ (0,
|
|
20850
|
-
/* @__PURE__ */ (0,
|
|
21960
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)("div", { className: "my-1 border-t" }),
|
|
21961
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20851
21962
|
DropdownMenuItem,
|
|
20852
21963
|
{
|
|
20853
|
-
icon:
|
|
21964
|
+
icon: import_lucide_react43.ArrowDown,
|
|
20854
21965
|
label: t("tableMenu.addColumnBefore"),
|
|
20855
21966
|
onClick: () => editor.chain().focus().addColumnBefore().run(),
|
|
20856
21967
|
disabled: !editor.can().addColumnBefore()
|
|
20857
21968
|
}
|
|
20858
21969
|
),
|
|
20859
|
-
/* @__PURE__ */ (0,
|
|
21970
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20860
21971
|
DropdownMenuItem,
|
|
20861
21972
|
{
|
|
20862
|
-
icon:
|
|
21973
|
+
icon: import_lucide_react43.ArrowDown,
|
|
20863
21974
|
label: t("tableMenu.addColumnAfter"),
|
|
20864
21975
|
onClick: () => editor.chain().focus().addColumnAfter().run(),
|
|
20865
21976
|
disabled: !editor.can().addColumnAfter()
|
|
20866
21977
|
}
|
|
20867
21978
|
),
|
|
20868
|
-
/* @__PURE__ */ (0,
|
|
21979
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20869
21980
|
DropdownMenuItem,
|
|
20870
21981
|
{
|
|
20871
|
-
icon:
|
|
21982
|
+
icon: import_lucide_react43.ArrowRight,
|
|
20872
21983
|
label: t("tableMenu.addRowBefore"),
|
|
20873
21984
|
onClick: () => editor.chain().focus().addRowBefore().run(),
|
|
20874
21985
|
disabled: !editor.can().addRowBefore()
|
|
20875
21986
|
}
|
|
20876
21987
|
),
|
|
20877
|
-
/* @__PURE__ */ (0,
|
|
21988
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20878
21989
|
DropdownMenuItem,
|
|
20879
21990
|
{
|
|
20880
|
-
icon:
|
|
21991
|
+
icon: import_lucide_react43.ArrowRight,
|
|
20881
21992
|
label: t("tableMenu.addRowAfter"),
|
|
20882
21993
|
onClick: () => editor.chain().focus().addRowAfter().run(),
|
|
20883
21994
|
disabled: !editor.can().addRowAfter()
|
|
20884
21995
|
}
|
|
20885
21996
|
),
|
|
20886
|
-
/* @__PURE__ */ (0,
|
|
20887
|
-
/* @__PURE__ */ (0,
|
|
21997
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)("div", { className: "my-1 border-t" }),
|
|
21998
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20888
21999
|
DropdownMenuItem,
|
|
20889
22000
|
{
|
|
20890
|
-
icon:
|
|
22001
|
+
icon: import_lucide_react43.Trash2,
|
|
20891
22002
|
label: t("tableMenu.deleteColumn"),
|
|
20892
22003
|
onClick: () => editor.chain().focus().deleteColumn().run(),
|
|
20893
22004
|
disabled: !editor.can().deleteColumn()
|
|
20894
22005
|
}
|
|
20895
22006
|
),
|
|
20896
|
-
/* @__PURE__ */ (0,
|
|
22007
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20897
22008
|
DropdownMenuItem,
|
|
20898
22009
|
{
|
|
20899
|
-
icon:
|
|
22010
|
+
icon: import_lucide_react43.Trash2,
|
|
20900
22011
|
label: t("tableMenu.deleteRow"),
|
|
20901
22012
|
onClick: () => editor.chain().focus().deleteRow().run(),
|
|
20902
22013
|
disabled: !editor.can().deleteRow()
|
|
20903
22014
|
}
|
|
20904
22015
|
),
|
|
20905
|
-
/* @__PURE__ */ (0,
|
|
22016
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20906
22017
|
DropdownMenuItem,
|
|
20907
22018
|
{
|
|
20908
|
-
icon:
|
|
22019
|
+
icon: import_lucide_react43.Trash2,
|
|
20909
22020
|
label: t("tableMenu.deleteTable"),
|
|
20910
22021
|
onClick: () => editor.chain().focus().deleteTable().run(),
|
|
20911
22022
|
disabled: !editor.can().deleteTable()
|
|
@@ -20914,105 +22025,105 @@ var EditorToolbar = ({
|
|
|
20914
22025
|
]
|
|
20915
22026
|
}
|
|
20916
22027
|
),
|
|
20917
|
-
/* @__PURE__ */ (0,
|
|
20918
|
-
/* @__PURE__ */ (0,
|
|
22028
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarDivider, {}),
|
|
22029
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20919
22030
|
ToolbarButton,
|
|
20920
22031
|
{
|
|
20921
22032
|
onClick: () => editor.chain().focus().toggleSubscript().run(),
|
|
20922
22033
|
active: editor.isActive("subscript"),
|
|
20923
22034
|
title: t("toolbar.subscript"),
|
|
20924
|
-
children: /* @__PURE__ */ (0,
|
|
22035
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Subscript, { className: "w-4 h-4" })
|
|
20925
22036
|
}
|
|
20926
22037
|
),
|
|
20927
|
-
/* @__PURE__ */ (0,
|
|
22038
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(
|
|
20928
22039
|
ToolbarButton,
|
|
20929
22040
|
{
|
|
20930
22041
|
onClick: () => editor.chain().focus().toggleSuperscript().run(),
|
|
20931
22042
|
active: editor.isActive("superscript"),
|
|
20932
22043
|
title: t("toolbar.superscript"),
|
|
20933
|
-
children: /* @__PURE__ */ (0,
|
|
22044
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Superscript, { className: "w-4 h-4" })
|
|
20934
22045
|
}
|
|
20935
22046
|
),
|
|
20936
|
-
/* @__PURE__ */ (0,
|
|
20937
|
-
/* @__PURE__ */ (0,
|
|
20938
|
-
/* @__PURE__ */ (0,
|
|
22047
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarDivider, {}),
|
|
22048
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().undo().run(), disabled: !editor.can().undo(), title: t("toolbar.undo"), children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Undo, { className: "w-4 h-4" }) }),
|
|
22049
|
+
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().redo().run(), disabled: !editor.can().redo(), title: t("toolbar.redo"), children: /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(import_lucide_react43.Redo, { className: "w-4 h-4" }) })
|
|
20939
22050
|
] });
|
|
20940
22051
|
};
|
|
20941
22052
|
|
|
20942
22053
|
// ../../components/ui/UEditor/menus.tsx
|
|
20943
|
-
var
|
|
22054
|
+
var import_react49 = require("react");
|
|
20944
22055
|
var import_react_dom9 = require("react-dom");
|
|
20945
22056
|
var import_next_intl4 = require("next-intl");
|
|
20946
|
-
var
|
|
20947
|
-
var
|
|
22057
|
+
var import_lucide_react44 = require("lucide-react");
|
|
22058
|
+
var import_jsx_runtime82 = require("react/jsx-runtime");
|
|
20948
22059
|
var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
|
|
20949
22060
|
const t = (0, import_next_intl4.useTranslations)("UEditor");
|
|
20950
|
-
const [selectedIndex, setSelectedIndex] = (0,
|
|
20951
|
-
const menuRef = (0,
|
|
20952
|
-
const allCommands = (0,
|
|
22061
|
+
const [selectedIndex, setSelectedIndex] = (0, import_react49.useState)(0);
|
|
22062
|
+
const menuRef = (0, import_react49.useRef)(null);
|
|
22063
|
+
const allCommands = (0, import_react49.useMemo)(
|
|
20953
22064
|
() => [
|
|
20954
22065
|
{
|
|
20955
|
-
icon:
|
|
22066
|
+
icon: import_lucide_react44.Type,
|
|
20956
22067
|
label: t("slashCommand.text"),
|
|
20957
22068
|
description: t("slashCommand.textDesc"),
|
|
20958
22069
|
action: () => editor.chain().focus().setParagraph().run()
|
|
20959
22070
|
},
|
|
20960
22071
|
{
|
|
20961
|
-
icon:
|
|
22072
|
+
icon: import_lucide_react44.Heading1,
|
|
20962
22073
|
label: t("slashCommand.heading1"),
|
|
20963
22074
|
description: t("slashCommand.heading1Desc"),
|
|
20964
22075
|
action: () => editor.chain().focus().toggleHeading({ level: 1 }).run()
|
|
20965
22076
|
},
|
|
20966
22077
|
{
|
|
20967
|
-
icon:
|
|
22078
|
+
icon: import_lucide_react44.Heading2,
|
|
20968
22079
|
label: t("slashCommand.heading2"),
|
|
20969
22080
|
description: t("slashCommand.heading2Desc"),
|
|
20970
22081
|
action: () => editor.chain().focus().toggleHeading({ level: 2 }).run()
|
|
20971
22082
|
},
|
|
20972
22083
|
{
|
|
20973
|
-
icon:
|
|
22084
|
+
icon: import_lucide_react44.Heading3,
|
|
20974
22085
|
label: t("slashCommand.heading3"),
|
|
20975
22086
|
description: t("slashCommand.heading3Desc"),
|
|
20976
22087
|
action: () => editor.chain().focus().toggleHeading({ level: 3 }).run()
|
|
20977
22088
|
},
|
|
20978
22089
|
{
|
|
20979
|
-
icon:
|
|
22090
|
+
icon: import_lucide_react44.List,
|
|
20980
22091
|
label: t("slashCommand.bulletList"),
|
|
20981
22092
|
description: t("slashCommand.bulletListDesc"),
|
|
20982
22093
|
action: () => editor.chain().focus().toggleBulletList().run()
|
|
20983
22094
|
},
|
|
20984
22095
|
{
|
|
20985
|
-
icon:
|
|
22096
|
+
icon: import_lucide_react44.ListOrdered,
|
|
20986
22097
|
label: t("slashCommand.orderedList"),
|
|
20987
22098
|
description: t("slashCommand.orderedListDesc"),
|
|
20988
22099
|
action: () => editor.chain().focus().toggleOrderedList().run()
|
|
20989
22100
|
},
|
|
20990
22101
|
{
|
|
20991
|
-
icon:
|
|
22102
|
+
icon: import_lucide_react44.ListTodo,
|
|
20992
22103
|
label: t("slashCommand.todoList"),
|
|
20993
22104
|
description: t("slashCommand.todoListDesc"),
|
|
20994
22105
|
action: () => editor.chain().focus().toggleTaskList().run()
|
|
20995
22106
|
},
|
|
20996
22107
|
{
|
|
20997
|
-
icon:
|
|
22108
|
+
icon: import_lucide_react44.Quote,
|
|
20998
22109
|
label: t("slashCommand.quote"),
|
|
20999
22110
|
description: t("slashCommand.quoteDesc"),
|
|
21000
22111
|
action: () => editor.chain().focus().toggleBlockquote().run()
|
|
21001
22112
|
},
|
|
21002
22113
|
{
|
|
21003
|
-
icon:
|
|
22114
|
+
icon: import_lucide_react44.FileCode,
|
|
21004
22115
|
label: t("slashCommand.codeBlock"),
|
|
21005
22116
|
description: t("slashCommand.codeBlockDesc"),
|
|
21006
22117
|
action: () => editor.chain().focus().toggleCodeBlock().run()
|
|
21007
22118
|
},
|
|
21008
22119
|
{
|
|
21009
|
-
icon:
|
|
22120
|
+
icon: import_lucide_react44.Minus,
|
|
21010
22121
|
label: t("slashCommand.divider"),
|
|
21011
22122
|
description: t("slashCommand.dividerDesc"),
|
|
21012
22123
|
action: () => editor.chain().focus().setHorizontalRule().run()
|
|
21013
22124
|
},
|
|
21014
22125
|
{
|
|
21015
|
-
icon:
|
|
22126
|
+
icon: import_lucide_react44.Table,
|
|
21016
22127
|
label: t("slashCommand.table"),
|
|
21017
22128
|
description: t("slashCommand.tableDesc"),
|
|
21018
22129
|
action: () => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run()
|
|
@@ -21020,19 +22131,19 @@ var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
|
|
|
21020
22131
|
],
|
|
21021
22132
|
[editor, t]
|
|
21022
22133
|
);
|
|
21023
|
-
const commands = (0,
|
|
22134
|
+
const commands = (0, import_react49.useMemo)(() => {
|
|
21024
22135
|
if (!filterText) return allCommands;
|
|
21025
22136
|
const lowerFilter = filterText.toLowerCase();
|
|
21026
22137
|
return allCommands.filter((cmd) => cmd.label.toLowerCase().includes(lowerFilter) || cmd.description.toLowerCase().includes(lowerFilter));
|
|
21027
22138
|
}, [allCommands, filterText]);
|
|
21028
|
-
(0,
|
|
22139
|
+
(0, import_react49.useEffect)(() => {
|
|
21029
22140
|
setSelectedIndex(0);
|
|
21030
22141
|
}, [filterText]);
|
|
21031
|
-
(0,
|
|
22142
|
+
(0, import_react49.useEffect)(() => {
|
|
21032
22143
|
const selectedElement = menuRef.current?.querySelector(`[data-index="${selectedIndex}"]`);
|
|
21033
22144
|
selectedElement?.scrollIntoView({ block: "nearest" });
|
|
21034
22145
|
}, [selectedIndex]);
|
|
21035
|
-
const selectCommand = (0,
|
|
22146
|
+
const selectCommand = (0, import_react49.useCallback)(
|
|
21036
22147
|
(index) => {
|
|
21037
22148
|
const command = commands[index];
|
|
21038
22149
|
if (command) {
|
|
@@ -21042,7 +22153,7 @@ var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
|
|
|
21042
22153
|
},
|
|
21043
22154
|
[commands, onClose]
|
|
21044
22155
|
);
|
|
21045
|
-
(0,
|
|
22156
|
+
(0, import_react49.useEffect)(() => {
|
|
21046
22157
|
const handleKeyDown = (e) => {
|
|
21047
22158
|
if (commands.length === 0) return;
|
|
21048
22159
|
if (e.key === "ArrowDown") {
|
|
@@ -21063,11 +22174,11 @@ var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
|
|
|
21063
22174
|
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
21064
22175
|
}, [commands, selectedIndex, selectCommand, onClose]);
|
|
21065
22176
|
if (commands.length === 0) {
|
|
21066
|
-
return /* @__PURE__ */ (0,
|
|
22177
|
+
return /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("div", { className: "w-72 p-4 text-center text-muted-foreground text-sm", children: t("slashCommand.noResults") });
|
|
21067
22178
|
}
|
|
21068
|
-
return /* @__PURE__ */ (0,
|
|
21069
|
-
/* @__PURE__ */ (0,
|
|
21070
|
-
/* @__PURE__ */ (0,
|
|
22179
|
+
return /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)("div", { ref: menuRef, className: "w-72 max-h-80 overflow-y-auto", children: [
|
|
22180
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)("div", { className: "px-3 py-2 border-b", children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider", children: t("slashCommand.basicBlocks") }) }),
|
|
22181
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)("div", { className: "p-1", children: commands.map((cmd, index) => /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)(
|
|
21071
22182
|
"button",
|
|
21072
22183
|
{
|
|
21073
22184
|
type: "button",
|
|
@@ -21080,19 +22191,19 @@ var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
|
|
|
21080
22191
|
selectedIndex === index ? "bg-accent" : "hover:bg-accent/50"
|
|
21081
22192
|
),
|
|
21082
22193
|
children: [
|
|
21083
|
-
/* @__PURE__ */ (0,
|
|
22194
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
|
|
21084
22195
|
"div",
|
|
21085
22196
|
{
|
|
21086
22197
|
className: cn(
|
|
21087
22198
|
"flex items-center justify-center w-10 h-10 rounded-lg mr-3 transition-colors",
|
|
21088
22199
|
selectedIndex === index ? "bg-primary/10" : "bg-muted/50 group-hover:bg-muted"
|
|
21089
22200
|
),
|
|
21090
|
-
children: /* @__PURE__ */ (0,
|
|
22201
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(cmd.icon, { className: cn("w-5 h-5", selectedIndex === index ? "text-primary" : "text-muted-foreground") })
|
|
21091
22202
|
}
|
|
21092
22203
|
),
|
|
21093
|
-
/* @__PURE__ */ (0,
|
|
21094
|
-
/* @__PURE__ */ (0,
|
|
21095
|
-
/* @__PURE__ */ (0,
|
|
22204
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsxs)("div", { className: "text-left", children: [
|
|
22205
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)("div", { className: cn("text-sm font-medium", selectedIndex === index && "text-primary"), children: cmd.label }),
|
|
22206
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)("div", { className: "text-xs text-muted-foreground", children: cmd.description })
|
|
21096
22207
|
] })
|
|
21097
22208
|
]
|
|
21098
22209
|
},
|
|
@@ -21102,19 +22213,19 @@ var SlashCommandMenu = ({ editor, onClose, filterText = "" }) => {
|
|
|
21102
22213
|
};
|
|
21103
22214
|
var FloatingMenuContent = ({ editor }) => {
|
|
21104
22215
|
const t = (0, import_next_intl4.useTranslations)("UEditor");
|
|
21105
|
-
const [showCommands, setShowCommands] = (0,
|
|
22216
|
+
const [showCommands, setShowCommands] = (0, import_react49.useState)(false);
|
|
21106
22217
|
if (showCommands) {
|
|
21107
|
-
return /* @__PURE__ */ (0,
|
|
22218
|
+
return /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(SlashCommandMenu, { editor, onClose: () => setShowCommands(false) });
|
|
21108
22219
|
}
|
|
21109
|
-
return /* @__PURE__ */ (0,
|
|
22220
|
+
return /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)(
|
|
21110
22221
|
"button",
|
|
21111
22222
|
{
|
|
21112
22223
|
type: "button",
|
|
21113
22224
|
onClick: () => setShowCommands(true),
|
|
21114
22225
|
className: "flex items-center gap-1 px-2 py-1.5 rounded-lg hover:bg-accent transition-all group",
|
|
21115
22226
|
children: [
|
|
21116
|
-
/* @__PURE__ */ (0,
|
|
21117
|
-
/* @__PURE__ */ (0,
|
|
22227
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react44.Plus, { className: "w-4 h-4 text-muted-foreground group-hover:text-foreground" }),
|
|
22228
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)("span", { className: "text-sm text-muted-foreground group-hover:text-foreground", children: t("floatingMenu.addBlock") })
|
|
21118
22229
|
]
|
|
21119
22230
|
}
|
|
21120
22231
|
);
|
|
@@ -21125,12 +22236,12 @@ var BubbleMenuContent = ({
|
|
|
21125
22236
|
}) => {
|
|
21126
22237
|
const t = (0, import_next_intl4.useTranslations)("UEditor");
|
|
21127
22238
|
const { textColors, highlightColors } = useEditorColors();
|
|
21128
|
-
const [showLinkInput, setShowLinkInput] = (0,
|
|
21129
|
-
const [showEditorColorPalette, setShowEditorColorPalette] = (0,
|
|
21130
|
-
(0,
|
|
22239
|
+
const [showLinkInput, setShowLinkInput] = (0, import_react49.useState)(false);
|
|
22240
|
+
const [showEditorColorPalette, setShowEditorColorPalette] = (0, import_react49.useState)(false);
|
|
22241
|
+
(0, import_react49.useEffect)(() => {
|
|
21131
22242
|
onKeepOpenChange?.(showLinkInput);
|
|
21132
22243
|
}, [onKeepOpenChange, showLinkInput]);
|
|
21133
|
-
(0,
|
|
22244
|
+
(0, import_react49.useEffect)(() => {
|
|
21134
22245
|
if (!showLinkInput) return;
|
|
21135
22246
|
const close = () => setShowLinkInput(false);
|
|
21136
22247
|
editor.on("selectionUpdate", close);
|
|
@@ -21141,7 +22252,7 @@ var BubbleMenuContent = ({
|
|
|
21141
22252
|
};
|
|
21142
22253
|
}, [editor, showLinkInput]);
|
|
21143
22254
|
if (showLinkInput) {
|
|
21144
|
-
return /* @__PURE__ */ (0,
|
|
22255
|
+
return /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
|
|
21145
22256
|
LinkInput,
|
|
21146
22257
|
{
|
|
21147
22258
|
initialUrl: editor.getAttributes("link").href || "",
|
|
@@ -21158,8 +22269,8 @@ var BubbleMenuContent = ({
|
|
|
21158
22269
|
);
|
|
21159
22270
|
}
|
|
21160
22271
|
if (showEditorColorPalette) {
|
|
21161
|
-
return /* @__PURE__ */ (0,
|
|
21162
|
-
/* @__PURE__ */ (0,
|
|
22272
|
+
return /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)("div", { className: "w-48", children: [
|
|
22273
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
|
|
21163
22274
|
EditorColorPalette,
|
|
21164
22275
|
{
|
|
21165
22276
|
colors: textColors,
|
|
@@ -21174,8 +22285,8 @@ var BubbleMenuContent = ({
|
|
|
21174
22285
|
label: t("colors.textColor")
|
|
21175
22286
|
}
|
|
21176
22287
|
),
|
|
21177
|
-
/* @__PURE__ */ (0,
|
|
21178
|
-
/* @__PURE__ */ (0,
|
|
22288
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)("div", { className: "border-t my-1" }),
|
|
22289
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
|
|
21179
22290
|
EditorColorPalette,
|
|
21180
22291
|
{
|
|
21181
22292
|
colors: highlightColors,
|
|
@@ -21190,7 +22301,7 @@ var BubbleMenuContent = ({
|
|
|
21190
22301
|
label: t("colors.highlight")
|
|
21191
22302
|
}
|
|
21192
22303
|
),
|
|
21193
|
-
/* @__PURE__ */ (0,
|
|
22304
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)("div", { className: "p-2 border-t", children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
|
|
21194
22305
|
"button",
|
|
21195
22306
|
{
|
|
21196
22307
|
type: "button",
|
|
@@ -21201,22 +22312,22 @@ var BubbleMenuContent = ({
|
|
|
21201
22312
|
) })
|
|
21202
22313
|
] });
|
|
21203
22314
|
}
|
|
21204
|
-
return /* @__PURE__ */ (0,
|
|
21205
|
-
/* @__PURE__ */ (0,
|
|
21206
|
-
/* @__PURE__ */ (0,
|
|
21207
|
-
/* @__PURE__ */ (0,
|
|
22315
|
+
return /* @__PURE__ */ (0, import_jsx_runtime82.jsxs)("div", { className: "flex items-center gap-0.5 p-1", children: [
|
|
22316
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleBold().run(), active: editor.isActive("bold"), title: t("toolbar.bold"), children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react44.Bold, { className: "w-4 h-4" }) }),
|
|
22317
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive("italic"), title: t("toolbar.italic"), children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react44.Italic, { className: "w-4 h-4" }) }),
|
|
22318
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
|
|
21208
22319
|
ToolbarButton,
|
|
21209
22320
|
{
|
|
21210
22321
|
onClick: () => editor.chain().focus().toggleUnderline().run(),
|
|
21211
22322
|
active: editor.isActive("underline"),
|
|
21212
22323
|
title: t("toolbar.underline"),
|
|
21213
|
-
children: /* @__PURE__ */ (0,
|
|
22324
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react44.Underline, { className: "w-4 h-4" })
|
|
21214
22325
|
}
|
|
21215
22326
|
),
|
|
21216
|
-
/* @__PURE__ */ (0,
|
|
21217
|
-
/* @__PURE__ */ (0,
|
|
21218
|
-
/* @__PURE__ */ (0,
|
|
21219
|
-
/* @__PURE__ */ (0,
|
|
22327
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleStrike().run(), active: editor.isActive("strike"), title: t("toolbar.strike"), children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react44.Strikethrough, { className: "w-4 h-4" }) }),
|
|
22328
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(ToolbarButton, { onClick: () => editor.chain().focus().toggleCode().run(), active: editor.isActive("code"), title: t("toolbar.code"), children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react44.Code, { className: "w-4 h-4" }) }),
|
|
22329
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)("div", { className: "w-px h-6 bg-border/50 mx-1" }),
|
|
22330
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
|
|
21220
22331
|
ToolbarButton,
|
|
21221
22332
|
{
|
|
21222
22333
|
onMouseDown: () => {
|
|
@@ -21227,41 +22338,41 @@ var BubbleMenuContent = ({
|
|
|
21227
22338
|
},
|
|
21228
22339
|
active: editor.isActive("link"),
|
|
21229
22340
|
title: t("toolbar.link"),
|
|
21230
|
-
children: /* @__PURE__ */ (0,
|
|
22341
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react44.Link, { className: "w-4 h-4" })
|
|
21231
22342
|
}
|
|
21232
22343
|
),
|
|
21233
|
-
/* @__PURE__ */ (0,
|
|
21234
|
-
/* @__PURE__ */ (0,
|
|
21235
|
-
/* @__PURE__ */ (0,
|
|
22344
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(ToolbarButton, { onClick: () => setShowEditorColorPalette(true), title: t("colors.textColor"), children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react44.Palette, { className: "w-4 h-4" }) }),
|
|
22345
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)("div", { className: "w-px h-6 bg-border/50 mx-1" }),
|
|
22346
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
|
|
21236
22347
|
ToolbarButton,
|
|
21237
22348
|
{
|
|
21238
22349
|
onClick: () => editor.chain().focus().toggleSubscript().run(),
|
|
21239
22350
|
active: editor.isActive("subscript"),
|
|
21240
22351
|
title: t("toolbar.subscript"),
|
|
21241
|
-
children: /* @__PURE__ */ (0,
|
|
22352
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react44.Subscript, { className: "w-4 h-4" })
|
|
21242
22353
|
}
|
|
21243
22354
|
),
|
|
21244
|
-
/* @__PURE__ */ (0,
|
|
22355
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
|
|
21245
22356
|
ToolbarButton,
|
|
21246
22357
|
{
|
|
21247
22358
|
onClick: () => editor.chain().focus().toggleSuperscript().run(),
|
|
21248
22359
|
active: editor.isActive("superscript"),
|
|
21249
22360
|
title: t("toolbar.superscript"),
|
|
21250
|
-
children: /* @__PURE__ */ (0,
|
|
22361
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(import_lucide_react44.Superscript, { className: "w-4 h-4" })
|
|
21251
22362
|
}
|
|
21252
22363
|
)
|
|
21253
22364
|
] });
|
|
21254
22365
|
};
|
|
21255
22366
|
var CustomBubbleMenu = ({ editor }) => {
|
|
21256
|
-
const [isVisible, setIsVisible] = (0,
|
|
21257
|
-
const [position, setPosition] = (0,
|
|
21258
|
-
const menuRef = (0,
|
|
21259
|
-
const keepOpenRef = (0,
|
|
21260
|
-
const setKeepOpen = (0,
|
|
22367
|
+
const [isVisible, setIsVisible] = (0, import_react49.useState)(false);
|
|
22368
|
+
const [position, setPosition] = (0, import_react49.useState)({ top: 0, left: 0 });
|
|
22369
|
+
const menuRef = (0, import_react49.useRef)(null);
|
|
22370
|
+
const keepOpenRef = (0, import_react49.useRef)(false);
|
|
22371
|
+
const setKeepOpen = (0, import_react49.useCallback)((next) => {
|
|
21261
22372
|
keepOpenRef.current = next;
|
|
21262
22373
|
if (next) setIsVisible(true);
|
|
21263
22374
|
}, []);
|
|
21264
|
-
(0,
|
|
22375
|
+
(0, import_react49.useEffect)(() => {
|
|
21265
22376
|
const updatePosition = () => {
|
|
21266
22377
|
const { state, view } = editor;
|
|
21267
22378
|
const { from, to, empty } = state.selection;
|
|
@@ -21290,7 +22401,7 @@ var CustomBubbleMenu = ({ editor }) => {
|
|
|
21290
22401
|
}, [editor]);
|
|
21291
22402
|
if (!isVisible) return null;
|
|
21292
22403
|
return (0, import_react_dom9.createPortal)(
|
|
21293
|
-
/* @__PURE__ */ (0,
|
|
22404
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
|
|
21294
22405
|
"div",
|
|
21295
22406
|
{
|
|
21296
22407
|
ref: menuRef,
|
|
@@ -21301,7 +22412,7 @@ var CustomBubbleMenu = ({ editor }) => {
|
|
|
21301
22412
|
transform: "translate(-50%, -100%)"
|
|
21302
22413
|
},
|
|
21303
22414
|
onMouseDown: (e) => e.preventDefault(),
|
|
21304
|
-
children: /* @__PURE__ */ (0,
|
|
22415
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
|
|
21305
22416
|
BubbleMenuContent,
|
|
21306
22417
|
{
|
|
21307
22418
|
editor,
|
|
@@ -21314,9 +22425,9 @@ var CustomBubbleMenu = ({ editor }) => {
|
|
|
21314
22425
|
);
|
|
21315
22426
|
};
|
|
21316
22427
|
var CustomFloatingMenu = ({ editor }) => {
|
|
21317
|
-
const [isVisible, setIsVisible] = (0,
|
|
21318
|
-
const [position, setPosition] = (0,
|
|
21319
|
-
(0,
|
|
22428
|
+
const [isVisible, setIsVisible] = (0, import_react49.useState)(false);
|
|
22429
|
+
const [position, setPosition] = (0, import_react49.useState)({ top: 0, left: 0 });
|
|
22430
|
+
(0, import_react49.useEffect)(() => {
|
|
21320
22431
|
const updatePosition = () => {
|
|
21321
22432
|
const { state, view } = editor;
|
|
21322
22433
|
const { $from, empty } = state.selection;
|
|
@@ -21343,7 +22454,7 @@ var CustomFloatingMenu = ({ editor }) => {
|
|
|
21343
22454
|
}, [editor]);
|
|
21344
22455
|
if (!isVisible) return null;
|
|
21345
22456
|
return (0, import_react_dom9.createPortal)(
|
|
21346
|
-
/* @__PURE__ */ (0,
|
|
22457
|
+
/* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
|
|
21347
22458
|
"div",
|
|
21348
22459
|
{
|
|
21349
22460
|
className: "fixed z-50 rounded-2xl border border-border bg-card text-card-foreground shadow-lg backdrop-blur-sm overflow-hidden animate-in fade-in-0 slide-in-from-bottom-2",
|
|
@@ -21353,7 +22464,7 @@ var CustomFloatingMenu = ({ editor }) => {
|
|
|
21353
22464
|
transform: "translate(-50%, -100%)"
|
|
21354
22465
|
},
|
|
21355
22466
|
onMouseDown: (e) => e.preventDefault(),
|
|
21356
|
-
children: /* @__PURE__ */ (0,
|
|
22467
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(FloatingMenuContent, { editor })
|
|
21357
22468
|
}
|
|
21358
22469
|
),
|
|
21359
22470
|
document.body
|
|
@@ -21362,25 +22473,25 @@ var CustomFloatingMenu = ({ editor }) => {
|
|
|
21362
22473
|
|
|
21363
22474
|
// ../../components/ui/UEditor/CharacterCount.tsx
|
|
21364
22475
|
var import_next_intl5 = require("next-intl");
|
|
21365
|
-
var
|
|
22476
|
+
var import_jsx_runtime83 = require("react/jsx-runtime");
|
|
21366
22477
|
var CharacterCountDisplay = ({ editor, maxCharacters }) => {
|
|
21367
22478
|
const t = (0, import_next_intl5.useTranslations)("UEditor");
|
|
21368
22479
|
const storage = editor.storage;
|
|
21369
22480
|
const characterCount = storage.characterCount?.characters?.() ?? 0;
|
|
21370
22481
|
const wordCount = storage.characterCount?.words?.() ?? 0;
|
|
21371
22482
|
const percentage = maxCharacters ? Math.round(characterCount / maxCharacters * 100) : 0;
|
|
21372
|
-
return /* @__PURE__ */ (0,
|
|
21373
|
-
/* @__PURE__ */ (0,
|
|
22483
|
+
return /* @__PURE__ */ (0, import_jsx_runtime83.jsxs)("div", { className: "flex items-center gap-3 px-3 py-2 text-xs text-muted-foreground border-t bg-muted/20", children: [
|
|
22484
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsxs)("span", { children: [
|
|
21374
22485
|
wordCount,
|
|
21375
22486
|
" ",
|
|
21376
22487
|
t("words")
|
|
21377
22488
|
] }),
|
|
21378
|
-
/* @__PURE__ */ (0,
|
|
22489
|
+
/* @__PURE__ */ (0, import_jsx_runtime83.jsxs)("span", { children: [
|
|
21379
22490
|
characterCount,
|
|
21380
22491
|
" ",
|
|
21381
22492
|
t("characters")
|
|
21382
22493
|
] }),
|
|
21383
|
-
maxCharacters && /* @__PURE__ */ (0,
|
|
22494
|
+
maxCharacters && /* @__PURE__ */ (0, import_jsx_runtime83.jsxs)("span", { className: cn(percentage > 90 && "text-destructive", percentage > 100 && "font-bold"), children: [
|
|
21384
22495
|
characterCount,
|
|
21385
22496
|
"/",
|
|
21386
22497
|
maxCharacters
|
|
@@ -21389,7 +22500,7 @@ var CharacterCountDisplay = ({ editor, maxCharacters }) => {
|
|
|
21389
22500
|
};
|
|
21390
22501
|
|
|
21391
22502
|
// ../../components/ui/UEditor/UEditor.tsx
|
|
21392
|
-
var
|
|
22503
|
+
var import_jsx_runtime84 = require("react/jsx-runtime");
|
|
21393
22504
|
var UEditor = ({
|
|
21394
22505
|
content = "",
|
|
21395
22506
|
onChange,
|
|
@@ -21412,11 +22523,11 @@ var UEditor = ({
|
|
|
21412
22523
|
}) => {
|
|
21413
22524
|
const t = (0, import_next_intl6.useTranslations)("UEditor");
|
|
21414
22525
|
const effectivePlaceholder = placeholder ?? t("placeholder");
|
|
21415
|
-
const extensions = (0,
|
|
22526
|
+
const extensions = (0, import_react50.useMemo)(
|
|
21416
22527
|
() => buildUEditorExtensions({ placeholder: effectivePlaceholder, maxCharacters, uploadImage, imageInsertMode, editable }),
|
|
21417
22528
|
[effectivePlaceholder, maxCharacters, uploadImage, imageInsertMode, editable]
|
|
21418
22529
|
);
|
|
21419
|
-
const editor = (0,
|
|
22530
|
+
const editor = (0, import_react51.useEditor)({
|
|
21420
22531
|
immediatelyRender: false,
|
|
21421
22532
|
extensions,
|
|
21422
22533
|
content,
|
|
@@ -21521,7 +22632,7 @@ var UEditor = ({
|
|
|
21521
22632
|
onJsonChange?.(editor2.getJSON());
|
|
21522
22633
|
}
|
|
21523
22634
|
});
|
|
21524
|
-
(0,
|
|
22635
|
+
(0, import_react50.useEffect)(() => {
|
|
21525
22636
|
if (editor && content !== editor.getHTML()) {
|
|
21526
22637
|
if (editor.isEmpty && content) {
|
|
21527
22638
|
editor.commands.setContent(content);
|
|
@@ -21529,7 +22640,7 @@ var UEditor = ({
|
|
|
21529
22640
|
}
|
|
21530
22641
|
}, [content, editor]);
|
|
21531
22642
|
if (!editor) {
|
|
21532
|
-
return /* @__PURE__ */ (0,
|
|
22643
|
+
return /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
|
|
21533
22644
|
"div",
|
|
21534
22645
|
{
|
|
21535
22646
|
className: cn("w-full rounded-lg border bg-background flex items-center justify-center text-muted-foreground", className),
|
|
@@ -21538,7 +22649,7 @@ var UEditor = ({
|
|
|
21538
22649
|
}
|
|
21539
22650
|
);
|
|
21540
22651
|
}
|
|
21541
|
-
return /* @__PURE__ */ (0,
|
|
22652
|
+
return /* @__PURE__ */ (0, import_jsx_runtime84.jsxs)(
|
|
21542
22653
|
"div",
|
|
21543
22654
|
{
|
|
21544
22655
|
className: cn(
|
|
@@ -21550,11 +22661,11 @@ var UEditor = ({
|
|
|
21550
22661
|
className
|
|
21551
22662
|
),
|
|
21552
22663
|
children: [
|
|
21553
|
-
editable && showToolbar && /* @__PURE__ */ (0,
|
|
21554
|
-
editable && showBubbleMenu && /* @__PURE__ */ (0,
|
|
21555
|
-
editable && showFloatingMenu && /* @__PURE__ */ (0,
|
|
21556
|
-
/* @__PURE__ */ (0,
|
|
21557
|
-
|
|
22664
|
+
editable && showToolbar && /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(EditorToolbar, { editor, variant, uploadImage, imageInsertMode }),
|
|
22665
|
+
editable && showBubbleMenu && /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(CustomBubbleMenu, { editor }),
|
|
22666
|
+
editable && showFloatingMenu && /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(CustomFloatingMenu, { editor }),
|
|
22667
|
+
/* @__PURE__ */ (0, import_jsx_runtime84.jsx)(
|
|
22668
|
+
import_react51.EditorContent,
|
|
21558
22669
|
{
|
|
21559
22670
|
editor,
|
|
21560
22671
|
className: "flex-1 overflow-y-auto",
|
|
@@ -21564,7 +22675,7 @@ var UEditor = ({
|
|
|
21564
22675
|
}
|
|
21565
22676
|
}
|
|
21566
22677
|
),
|
|
21567
|
-
showCharacterCount && /* @__PURE__ */ (0,
|
|
22678
|
+
showCharacterCount && /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(CharacterCountDisplay, { editor, maxCharacters })
|
|
21568
22679
|
]
|
|
21569
22680
|
}
|
|
21570
22681
|
);
|