@lofcz/platejs-emoji 52.0.15

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.
@@ -0,0 +1,526 @@
1
+ import { a as EmojiInlineLibrary, c as BaseEmojiPlugin, f as EmojiSettings, g as EmojiCategory, h as i18n, i as Grid, l as DEFAULT_EMOJI_LIBRARY, m as defaultCategories, o as insertEmoji, r as AGridSection, s as BaseEmojiInputPlugin, t as EmojiFloatingIndexSearch, u as DEFAULT_FREQUENTLY_USED_EMOJI } from "../EmojiFloatingIndexSearch-BNdEWk-b.js";
2
+ import { toPlatePlugin, useEditorRef, usePluginOption, useStableMemo } from "platejs/react";
3
+ import { c } from "react-compiler-runtime";
4
+ import React from "react";
5
+
6
+ //#region src/react/EmojiPlugin.tsx
7
+ const EmojiInputPlugin = toPlatePlugin(BaseEmojiInputPlugin);
8
+ const EmojiPlugin = toPlatePlugin(BaseEmojiPlugin, { plugins: [EmojiInputPlugin] });
9
+
10
+ //#endregion
11
+ //#region src/react/storage/LocalStorage.ts
12
+ var LocalStorage = class {
13
+ key;
14
+ defaultValue;
15
+ constructor(key, defaultValue) {
16
+ this.key = key;
17
+ this.defaultValue = defaultValue;
18
+ }
19
+ get() {
20
+ let value = this.defaultValue;
21
+ if (typeof window === "undefined") return value;
22
+ const valueInLocalStorage = window.localStorage.getItem(this.key);
23
+ if (valueInLocalStorage) try {
24
+ value = JSON.parse(valueInLocalStorage);
25
+ } catch {
26
+ window.localStorage.removeItem(this.key);
27
+ }
28
+ return value;
29
+ }
30
+ set(value) {
31
+ window.localStorage.setItem(this.key, JSON.stringify(value));
32
+ }
33
+ };
34
+
35
+ //#endregion
36
+ //#region src/react/storage/FrequentEmojiStorage.ts
37
+ var FrequentEmojiStorage = class {
38
+ key = EmojiCategory.Frequent;
39
+ limit = 8;
40
+ localStorage;
41
+ prefix = "emoji";
42
+ defaultValue = DEFAULT_FREQUENTLY_USED_EMOJI;
43
+ constructor(props, defaultValue = DEFAULT_FREQUENTLY_USED_EMOJI) {
44
+ this.defaultValue = defaultValue;
45
+ this.limit = props.limit ?? this.limit;
46
+ this.localStorage = new LocalStorage(`${props.prefix ?? this.prefix}:${props.key ?? this.key}`, defaultValue);
47
+ }
48
+ get() {
49
+ const data = this.localStorage.get();
50
+ return Object.fromEntries(Object.keys(data).sort((a, b) => data[b] - data[a]).map((key) => [key, data[key]]));
51
+ }
52
+ getList() {
53
+ return Object.keys(this.get()).splice(0, this.limit);
54
+ }
55
+ set(value) {
56
+ this.localStorage.set(value);
57
+ }
58
+ update(emojiId) {
59
+ const prevEmojis = this.localStorage.get();
60
+ const count = prevEmojis[emojiId] ? prevEmojis[emojiId] + 1 : 1;
61
+ const emojis = {
62
+ ...prevEmojis,
63
+ [emojiId]: count
64
+ };
65
+ this.localStorage.set(emojis);
66
+ return emojis;
67
+ }
68
+ };
69
+
70
+ //#endregion
71
+ //#region src/react/utils/EmojiObserver.ts
72
+ const setVisibleSections = (entries, visibleSections) => {
73
+ for (const entry of entries) {
74
+ const id = entry.target.dataset.id;
75
+ visibleSections.set(id, entry.isIntersecting);
76
+ }
77
+ };
78
+ const getSectionInFocus = (visibleSections) => {
79
+ for (const [id, ratio] of visibleSections) if (ratio) return id;
80
+ };
81
+ const observeCategories = ({ ancestorRef, emojiLibrary, setFocusedAndVisibleSections }) => {
82
+ const observerOptions = {
83
+ root: ancestorRef.current,
84
+ threshold: 0
85
+ };
86
+ const visibleSections = /* @__PURE__ */ new Map();
87
+ const observer = new IntersectionObserver((entries) => {
88
+ setVisibleSections(entries, visibleSections);
89
+ const focusedSectionId = getSectionInFocus(visibleSections);
90
+ if (focusedSectionId) setFocusedAndVisibleSections(visibleSections, focusedSectionId);
91
+ }, observerOptions);
92
+ for (const section of emojiLibrary.getGrid().sections()) if (section.root.current) observer.observe(section.root.current);
93
+ return observer;
94
+ };
95
+
96
+ //#endregion
97
+ //#region src/react/utils/EmojiLibrary/EmojiFloatingGrid.ts
98
+ var EmojiFloatingGrid = class extends Grid {
99
+ createRootRef() {
100
+ return React.createRef();
101
+ }
102
+ };
103
+ var EmojiGridSectionWithRoot = class extends AGridSection {
104
+ createRootRef() {
105
+ this._root = React.createRef();
106
+ }
107
+ };
108
+
109
+ //#endregion
110
+ //#region src/react/utils/EmojiLibrary/EmojiFloatingGridBuilder.ts
111
+ var EmojiFloatingGridBuilder = class {
112
+ grid = new EmojiFloatingGrid();
113
+ localStorage;
114
+ sections;
115
+ elements;
116
+ settings;
117
+ constructor(localStorage, sections, elements, settings) {
118
+ this.localStorage = localStorage;
119
+ this.sections = sections;
120
+ this.elements = elements;
121
+ this.settings = settings;
122
+ }
123
+ addFrequent() {
124
+ if (this.settings.showFrequent.value) {
125
+ const id = "frequent";
126
+ this.grid.addSection(id, new EmojiGridSectionWithRoot(id, this.settings.perLine.value), { [id]: this.localStorage.getList() });
127
+ }
128
+ }
129
+ build() {
130
+ if (this.elements.frequent) this.addFrequent();
131
+ this.sections.forEach((id) => {
132
+ if (this.elements[id]?.length) this.grid.addSection(id, new EmojiGridSectionWithRoot(id, this.settings.perLine.value), this.elements);
133
+ });
134
+ return this.grid;
135
+ }
136
+ };
137
+
138
+ //#endregion
139
+ //#region src/react/utils/EmojiLibrary/EmojiFloatingLibrary.ts
140
+ var EmojiFloatingLibrary = class EmojiFloatingLibrary extends EmojiInlineLibrary {
141
+ static instance;
142
+ categories = defaultCategories;
143
+ emojis = {};
144
+ grid;
145
+ settings;
146
+ localStorage;
147
+ library;
148
+ constructor(settings, localStorage, library = DEFAULT_EMOJI_LIBRARY) {
149
+ super(library);
150
+ this.settings = settings;
151
+ this.localStorage = localStorage;
152
+ this.library = library;
153
+ this.categories = settings.categories.value ?? this.categories;
154
+ this.initEmojis(library.categories);
155
+ this.grid = new EmojiFloatingGridBuilder(this.localStorage, this.categories, this.emojis, settings).build();
156
+ }
157
+ static getInstance(settings, localStorage, library = DEFAULT_EMOJI_LIBRARY) {
158
+ if (!EmojiFloatingLibrary.instance) EmojiFloatingLibrary.instance = new EmojiFloatingLibrary(settings, localStorage, library);
159
+ return EmojiFloatingLibrary.instance;
160
+ }
161
+ initEmojis(categoriesLibrary) {
162
+ for (const category of categoriesLibrary) this.emojis[category.id] = category.emojis;
163
+ }
164
+ getGrid() {
165
+ return this.grid;
166
+ }
167
+ indexOf(focusedCategory) {
168
+ const index = this.grid.indexOf(focusedCategory);
169
+ return index < 1 ? 0 : index;
170
+ }
171
+ updateFrequentCategory(emojiId) {
172
+ this.localStorage.update(emojiId);
173
+ this.grid.updateSection(EmojiCategory.Frequent, this.localStorage.getList());
174
+ }
175
+ };
176
+
177
+ //#endregion
178
+ //#region src/react/hooks/useEmojiPickerState.ts
179
+ const initialState = {
180
+ emoji: void 0,
181
+ focusedCategory: void 0,
182
+ frequentEmoji: void 0,
183
+ hasFound: false,
184
+ isOpen: false,
185
+ isSearching: false,
186
+ searchResult: [],
187
+ searchValue: "",
188
+ visibleCategories: /* @__PURE__ */ new Map()
189
+ };
190
+ const useEmojiPickerState = () => {
191
+ const $ = c(2);
192
+ const [cache, dispatch] = React.useReducer(_temp, initialState);
193
+ let t0;
194
+ if ($[0] !== cache) {
195
+ t0 = [cache, dispatch];
196
+ $[0] = cache;
197
+ $[1] = t0;
198
+ } else t0 = $[1];
199
+ return t0;
200
+ };
201
+ function _temp(state, action) {
202
+ const { payload, type } = action;
203
+ switch (type) {
204
+ case "CLEAR_SEARCH": return {
205
+ ...state,
206
+ focusedCategory: EmojiCategory.Frequent,
207
+ hasFound: false,
208
+ isSearching: false,
209
+ searchValue: ""
210
+ };
211
+ case "SET_CLOSE": return {
212
+ ...state,
213
+ emoji: void 0,
214
+ isOpen: false
215
+ };
216
+ case "SET_EMOJI":
217
+ case "SET_FOCUSED_AND_VISIBLE_CATEGORIES":
218
+ case "SET_SEARCH": return {
219
+ ...state,
220
+ ...payload
221
+ };
222
+ case "SET_FOCUSED_CATEGORY": return {
223
+ ...state,
224
+ ...payload,
225
+ hasFound: false,
226
+ isSearching: false,
227
+ searchValue: ""
228
+ };
229
+ case "SET_OPEN": return {
230
+ ...state,
231
+ isOpen: true
232
+ };
233
+ case "UPDATE_FREQUENT_EMOJIS": return {
234
+ ...state,
235
+ ...payload,
236
+ emoji: void 0
237
+ };
238
+ case "UPDATE_SEARCH_RESULT": return {
239
+ ...state,
240
+ ...payload,
241
+ focusedCategory: void 0,
242
+ isSearching: true
243
+ };
244
+ default: throw new Error(`Unhandled action type: ${type}`);
245
+ }
246
+ }
247
+
248
+ //#endregion
249
+ //#region src/react/hooks/useEmojiPicker.ts
250
+ const useEmojiPicker = (t0) => {
251
+ const $ = c(41);
252
+ const { closeOnSelect, emojiLibrary, indexSearch } = t0;
253
+ const editor = useEditorRef();
254
+ const [state, dispatch] = useEmojiPickerState();
255
+ let t1;
256
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
257
+ t1 = {
258
+ content: React.createRef(),
259
+ contentRoot: React.createRef()
260
+ };
261
+ $[0] = t1;
262
+ } else t1 = $[0];
263
+ const refs = React.useRef(t1);
264
+ let t2;
265
+ if ($[1] !== dispatch) {
266
+ t2 = (isOpen) => {
267
+ dispatch({ type: isOpen ? "SET_OPEN" : "SET_CLOSE" });
268
+ };
269
+ $[1] = dispatch;
270
+ $[2] = t2;
271
+ } else t2 = $[2];
272
+ const setIsOpen = t2;
273
+ let t3;
274
+ if ($[3] !== dispatch) {
275
+ t3 = (visibleSections, categoryId) => {
276
+ dispatch({
277
+ payload: {
278
+ focusedCategory: categoryId,
279
+ visibleCategories: visibleSections
280
+ },
281
+ type: "SET_FOCUSED_AND_VISIBLE_CATEGORIES"
282
+ });
283
+ };
284
+ $[3] = dispatch;
285
+ $[4] = t3;
286
+ } else t3 = $[4];
287
+ const setFocusedAndVisibleSections = t3;
288
+ let t4;
289
+ if ($[5] !== dispatch || $[6] !== indexSearch) {
290
+ t4 = (input) => {
291
+ const value = String(input).replaceAll(/\s/g, "");
292
+ if (!value && !input) {
293
+ dispatch({ type: "CLEAR_SEARCH" });
294
+ return;
295
+ }
296
+ dispatch({
297
+ payload: {
298
+ hasFound: indexSearch.search(value).hasFound(),
299
+ searchResult: indexSearch.get(),
300
+ searchValue: value
301
+ },
302
+ type: "UPDATE_SEARCH_RESULT"
303
+ });
304
+ };
305
+ $[5] = dispatch;
306
+ $[6] = indexSearch;
307
+ $[7] = t4;
308
+ } else t4 = $[7];
309
+ const handleSearchInput = t4;
310
+ let t5;
311
+ if ($[8] !== dispatch || $[9] !== handleSearchInput) {
312
+ t5 = (value_0) => {
313
+ if (value_0) handleSearchInput(value_0);
314
+ else dispatch({ type: "CLEAR_SEARCH" });
315
+ };
316
+ $[8] = dispatch;
317
+ $[9] = handleSearchInput;
318
+ $[10] = t5;
319
+ } else t5 = $[10];
320
+ const setSearch = t5;
321
+ let t6;
322
+ if ($[11] !== dispatch) {
323
+ t6 = () => {
324
+ dispatch({ type: "CLEAR_SEARCH" });
325
+ };
326
+ $[11] = dispatch;
327
+ $[12] = t6;
328
+ } else t6 = $[12];
329
+ const clearSearch = t6;
330
+ let t7;
331
+ if ($[13] !== dispatch) {
332
+ t7 = (emoji) => {
333
+ dispatch({
334
+ payload: { emoji },
335
+ type: "SET_EMOJI"
336
+ });
337
+ };
338
+ $[13] = dispatch;
339
+ $[14] = t7;
340
+ } else t7 = $[14];
341
+ const onMouseOver = t7;
342
+ let t8;
343
+ if ($[15] !== closeOnSelect || $[16] !== dispatch || $[17] !== emojiLibrary || $[18] !== state.isOpen) {
344
+ t8 = (emojiId) => {
345
+ emojiLibrary.updateFrequentCategory(emojiId);
346
+ dispatch({
347
+ payload: {
348
+ frequentEmoji: emojiId,
349
+ isOpen: closeOnSelect ? false : state.isOpen
350
+ },
351
+ type: "UPDATE_FREQUENT_EMOJIS"
352
+ });
353
+ };
354
+ $[15] = closeOnSelect;
355
+ $[16] = dispatch;
356
+ $[17] = emojiLibrary;
357
+ $[18] = state.isOpen;
358
+ $[19] = t8;
359
+ } else t8 = $[19];
360
+ const updateFrequentEmojis = t8;
361
+ let t9;
362
+ if ($[20] !== editor || $[21] !== updateFrequentEmojis) {
363
+ t9 = (emoji_0) => {
364
+ insertEmoji(editor, emoji_0);
365
+ updateFrequentEmojis(emoji_0.id);
366
+ };
367
+ $[20] = editor;
368
+ $[21] = updateFrequentEmojis;
369
+ $[22] = t9;
370
+ } else t9 = $[22];
371
+ const onSelectEmoji = t9;
372
+ let t10;
373
+ if ($[23] !== dispatch || $[24] !== emojiLibrary) {
374
+ t10 = (categoryId_0) => {
375
+ dispatch({
376
+ payload: { focusedCategory: categoryId_0 },
377
+ type: "SET_FOCUSED_CATEGORY"
378
+ });
379
+ const getSectionPositionToScrollIntoView = () => {
380
+ const section = emojiLibrary.getGrid().section(categoryId_0);
381
+ const contentRootScrollTop = refs.current.contentRoot.current?.scrollTop ?? 0;
382
+ const contentRootTopPosition = refs.current.contentRoot.current?.getBoundingClientRect().top ?? 0;
383
+ const sectionTopPosition = section?.root.current?.getBoundingClientRect().top ?? 0;
384
+ return 1 + contentRootScrollTop + sectionTopPosition - contentRootTopPosition;
385
+ };
386
+ if (refs.current.contentRoot.current) refs.current.contentRoot.current.scrollTop = getSectionPositionToScrollIntoView();
387
+ };
388
+ $[23] = dispatch;
389
+ $[24] = emojiLibrary;
390
+ $[25] = t10;
391
+ } else t10 = $[25];
392
+ const handleCategoryClick = t10;
393
+ let t11;
394
+ let t12;
395
+ if ($[26] !== emojiLibrary || $[27] !== setFocusedAndVisibleSections || $[28] !== state.isOpen || $[29] !== state.isSearching) {
396
+ t11 = () => {
397
+ if (state.isOpen && !state.isSearching) setTimeout(() => {
398
+ observeCategories({
399
+ ancestorRef: refs.current.contentRoot,
400
+ emojiLibrary,
401
+ setFocusedAndVisibleSections
402
+ });
403
+ }, 0);
404
+ };
405
+ t12 = [
406
+ emojiLibrary,
407
+ state.isOpen,
408
+ state.isSearching,
409
+ setFocusedAndVisibleSections
410
+ ];
411
+ $[26] = emojiLibrary;
412
+ $[27] = setFocusedAndVisibleSections;
413
+ $[28] = state.isOpen;
414
+ $[29] = state.isSearching;
415
+ $[30] = t11;
416
+ $[31] = t12;
417
+ } else {
418
+ t11 = $[30];
419
+ t12 = $[31];
420
+ }
421
+ React.useEffect(t11, t12);
422
+ let t13;
423
+ if ($[32] !== clearSearch || $[33] !== emojiLibrary || $[34] !== handleCategoryClick || $[35] !== onMouseOver || $[36] !== onSelectEmoji || $[37] !== setIsOpen || $[38] !== setSearch || $[39] !== state) {
424
+ t13 = {
425
+ clearSearch,
426
+ emoji: state.emoji,
427
+ emojiLibrary,
428
+ i18n,
429
+ refs,
430
+ setIsOpen,
431
+ setSearch,
432
+ handleCategoryClick,
433
+ onMouseOver,
434
+ onSelectEmoji,
435
+ ...state
436
+ };
437
+ $[32] = clearSearch;
438
+ $[33] = emojiLibrary;
439
+ $[34] = handleCategoryClick;
440
+ $[35] = onMouseOver;
441
+ $[36] = onSelectEmoji;
442
+ $[37] = setIsOpen;
443
+ $[38] = setSearch;
444
+ $[39] = state;
445
+ $[40] = t13;
446
+ } else t13 = $[40];
447
+ return t13;
448
+ };
449
+
450
+ //#endregion
451
+ //#region src/react/hooks/useEmojiDropdownMenuState.ts
452
+ function useEmojiDropdownMenuState(t0) {
453
+ const $ = c(19);
454
+ let t1;
455
+ if ($[0] !== t0) {
456
+ t1 = t0 === void 0 ? {} : t0;
457
+ $[0] = t0;
458
+ $[1] = t1;
459
+ } else t1 = $[1];
460
+ const { closeOnSelect: t2, settings: t3 } = t1;
461
+ const closeOnSelect = t2 === void 0 ? true : t2;
462
+ const settings = t3 === void 0 ? EmojiSettings : t3;
463
+ const data = usePluginOption(EmojiPlugin, "data");
464
+ let t4;
465
+ if ($[2] !== data || $[3] !== settings) {
466
+ t4 = () => {
467
+ const frequentEmojiStorage = new FrequentEmojiStorage({ limit: settings.showFrequent.limit });
468
+ const emojiLibrary = EmojiFloatingLibrary.getInstance(settings, frequentEmojiStorage, data);
469
+ return [emojiLibrary, EmojiFloatingIndexSearch.getInstance(emojiLibrary)];
470
+ };
471
+ $[2] = data;
472
+ $[3] = settings;
473
+ $[4] = t4;
474
+ } else t4 = $[4];
475
+ let t5;
476
+ if ($[5] !== settings) {
477
+ t5 = [settings];
478
+ $[5] = settings;
479
+ $[6] = t5;
480
+ } else t5 = $[6];
481
+ const [emojiLibrary_0, indexSearch_0] = useStableMemo(t4, t5);
482
+ let t6;
483
+ if ($[7] !== closeOnSelect || $[8] !== emojiLibrary_0 || $[9] !== indexSearch_0) {
484
+ t6 = {
485
+ closeOnSelect,
486
+ emojiLibrary: emojiLibrary_0,
487
+ indexSearch: indexSearch_0
488
+ };
489
+ $[7] = closeOnSelect;
490
+ $[8] = emojiLibrary_0;
491
+ $[9] = indexSearch_0;
492
+ $[10] = t6;
493
+ } else t6 = $[10];
494
+ const t7 = useEmojiPicker(t6);
495
+ let emojiPickerState;
496
+ let isOpen;
497
+ let setIsOpen;
498
+ if ($[11] !== t7) {
499
+ ({isOpen, setIsOpen, ...emojiPickerState} = t7);
500
+ $[11] = t7;
501
+ $[12] = emojiPickerState;
502
+ $[13] = isOpen;
503
+ $[14] = setIsOpen;
504
+ } else {
505
+ emojiPickerState = $[12];
506
+ isOpen = $[13];
507
+ setIsOpen = $[14];
508
+ }
509
+ let t8;
510
+ if ($[15] !== emojiPickerState || $[16] !== isOpen || $[17] !== setIsOpen) {
511
+ t8 = {
512
+ emojiPickerState,
513
+ isOpen,
514
+ setIsOpen
515
+ };
516
+ $[15] = emojiPickerState;
517
+ $[16] = isOpen;
518
+ $[17] = setIsOpen;
519
+ $[18] = t8;
520
+ } else t8 = $[18];
521
+ return t8;
522
+ }
523
+
524
+ //#endregion
525
+ export { EmojiFloatingGrid, EmojiFloatingGridBuilder, EmojiFloatingLibrary, EmojiGridSectionWithRoot, EmojiInputPlugin, EmojiPlugin, FrequentEmojiStorage, LocalStorage, observeCategories, useEmojiDropdownMenuState, useEmojiPicker, useEmojiPickerState };
526
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["toPlatePlugin","BaseEmojiInputPlugin","BaseEmojiPlugin","EmojiInputPlugin","EmojiPlugin","plugins","ILocalStorage","get","T","set","value","LocalStorage","key","defaultValue","constructor","window","valueInLocalStorage","localStorage","getItem","JSON","parse","removeItem","setItem","stringify","FrequentEmojiStorageProps","IFrequentEmojiStorage","DEFAULT_FREQUENTLY_USED_EMOJI","FrequentEmojis","EmojiCategory","LocalStorage","FrequentEmojiStorage","key","Frequent","limit","localStorage","prefix","defaultValue","constructor","props","get","data","Object","fromEntries","keys","sort","a","b","map","getList","splice","set","value","update","emojiId","prevEmojis","count","emojis","React","EmojiCategoryList","IEmojiFloatingLibrary","MapEmojiCategoryList","setVisibleSections","entries","IntersectionObserverEntry","visibleSections","entry","id","target","HTMLDivElement","dataset","set","isIntersecting","getSectionInFocus","ratio","ObserverCategoriesType","ancestorRef","MutableRefObject","emojiLibrary","setFocusedAndVisibleSections","SetFocusedAndVisibleSectionsType","categoryId","observeCategories","observerOptions","root","current","threshold","Map","observer","IntersectionObserver","focusedSectionId","section","getGrid","sections","observe","React","EmojiCategoryList","IGrid","AGridSection","Grid","EmojiFloatingGridType","RefObject","HTMLDivElement","EmojiFloatingGrid","createRootRef","createRef","EmojiGridSectionWithRoot","_root","EmojiCategoryList","EmojiSettingsType","GridElements","IFrequentEmojiStorage","EmojiFloatingGrid","EmojiGridSectionWithRoot","EmojiFloatingGridBuilder","grid","localStorage","sections","elements","settings","constructor","addFrequent","showFrequent","value","id","addSection","perLine","getList","build","frequent","forEach","length","EmojiFloatingGridType","IEmojiFloatingLibrary","IFrequentEmojiStorage","EmojiCategoryList","EmojiLibrary","EmojiSettingsType","DEFAULT_EMOJI_LIBRARY","defaultCategories","EmojiCategory","EmojiInlineLibrary","EmojiFloatingGridBuilder","EmojiFloatingLibrary","instance","categories","emojis","Partial","Record","grid","settings","localStorage","library","constructor","value","initEmojis","build","getInstance","categoriesLibrary","category","id","getGrid","indexOf","focusedCategory","index","updateFrequentCategory","emojiId","update","updateSection","Frequent","getList","React","Emoji","EmojiCategoryList","EmojiCategory","EmojiPickerStateDispatch","type","payload","Partial","EmojiPickerStateProps","hasFound","isOpen","isSearching","searchResult","searchValue","visibleCategories","MapEmojiCategoryList","emoji","focusedCategory","frequentEmoji","Map","initialState","undefined","useEmojiPickerState","$","_c","cache","dispatch","useReducer","_temp","t0","state","action","Frequent","Error","React","Emoji","useEditorRef","AIndexSearch","EmojiCategoryList","EmojiIconList","EmojiSettingsType","i18nProps","i18n","insertEmoji","IEmojiFloatingLibrary","SetFocusedAndVisibleSectionsType","observeCategories","useEmojiPickerState","MapEmojiCategoryList","MutableRefs","MutableRefObject","content","RefObject","HTMLDivElement","contentRoot","UseEmojiPickerProps","closeOnSelect","emojiLibrary","indexSearch","UseEmojiPickerType","ReactElement","hasFound","icons","T","isOpen","isSearching","refs","searchResult","searchValue","visibleCategories","clearSearch","setIsOpen","setSearch","value","handleCategoryClick","id","onMouseOver","emoji","onSelectEmoji","focusedCategory","settings","styles","useEmojiPicker","t0","$","_c","editor","state","dispatch","t1","Symbol","for","createRef","useRef","t2","type","t3","visibleSections","categoryId","payload","setFocusedAndVisibleSections","t4","input","String","replaceAll","search","get","handleSearchInput","t5","value_0","t6","t7","t8","emojiId","updateFrequentCategory","frequentEmoji","updateFrequentEmojis","t9","emoji_0","t10","categoryId_0","getSectionPositionToScrollIntoView","section","getGrid","contentRootScrollTop","current","scrollTop","contentRootTopPosition","getBoundingClientRect","top","sectionTopPosition","root","t11","t12","setTimeout","ancestorRef","useEffect","t13","usePluginOption","useStableMemo","EmojiSettingsType","EmojiFloatingIndexSearch","EmojiSettings","EmojiPlugin","FrequentEmojiStorage","EmojiFloatingLibrary","useEmojiPicker","EmojiDropdownMenuOptions","closeOnSelect","settings","useEmojiDropdownMenuState","t0","$","_c","t1","undefined","t2","t3","data","t4","frequentEmojiStorage","limit","showFrequent","emojiLibrary","getInstance","indexSearch","const","t5","emojiLibrary_0","indexSearch_0","t6","t7","emojiPickerState","isOpen","setIsOpen","t8"],"sources":["../../src/react/EmojiPlugin.tsx","../../src/react/storage/LocalStorage.ts","../../src/react/storage/FrequentEmojiStorage.ts","../../src/react/utils/EmojiObserver.ts","../../src/react/utils/EmojiLibrary/EmojiFloatingGrid.ts","../../src/react/utils/EmojiLibrary/EmojiFloatingGridBuilder.ts","../../src/react/utils/EmojiLibrary/EmojiFloatingLibrary.ts","../../src/react/hooks/useEmojiPickerState.ts","../../src/react/hooks/useEmojiPicker.ts","../../src/react/hooks/useEmojiDropdownMenuState.ts"],"sourcesContent":["import { toPlatePlugin } from 'platejs/react';\n\nimport { BaseEmojiInputPlugin, BaseEmojiPlugin } from '../lib';\n\nexport const EmojiInputPlugin = toPlatePlugin(BaseEmojiInputPlugin);\n\nexport const EmojiPlugin = toPlatePlugin(BaseEmojiPlugin, {\n plugins: [EmojiInputPlugin],\n});\n","export type ILocalStorage<T> = {\n get: () => T;\n set: (value: T) => void;\n};\n\nexport class LocalStorage<T> implements ILocalStorage<T> {\n protected key: string;\n protected defaultValue: T;\n\n constructor(key: string, defaultValue: T) {\n this.key = key;\n this.defaultValue = defaultValue;\n }\n\n get(): T {\n let value = this.defaultValue;\n\n if (typeof window === 'undefined') return value;\n\n const valueInLocalStorage = window.localStorage.getItem(this.key);\n\n if (valueInLocalStorage) {\n try {\n value = JSON.parse(valueInLocalStorage);\n } catch {\n window.localStorage.removeItem(this.key);\n }\n }\n\n return value;\n }\n\n set(value: any) {\n window.localStorage.setItem(this.key, JSON.stringify(value));\n }\n}\n","import type {\n FrequentEmojiStorageProps,\n IFrequentEmojiStorage,\n} from '../utils';\n\nimport { DEFAULT_FREQUENTLY_USED_EMOJI } from '../../lib/constants';\nimport { type FrequentEmojis, EmojiCategory } from '../../lib/types';\nimport { LocalStorage } from './LocalStorage';\n\nexport class FrequentEmojiStorage implements IFrequentEmojiStorage {\n protected key = EmojiCategory.Frequent;\n protected limit = 8;\n protected localStorage;\n protected prefix = 'emoji';\n protected defaultValue = DEFAULT_FREQUENTLY_USED_EMOJI;\n\n constructor(\n props: FrequentEmojiStorageProps,\n defaultValue = DEFAULT_FREQUENTLY_USED_EMOJI\n ) {\n this.defaultValue = defaultValue;\n this.limit = props.limit ?? this.limit;\n const key = `${props.prefix ?? this.prefix}:${props.key ?? this.key}`;\n this.localStorage = new LocalStorage(key, defaultValue);\n }\n\n get(): FrequentEmojis {\n const data = this.localStorage.get();\n\n return Object.fromEntries(\n Object.keys(data)\n .sort((a, b) => data[b] - data[a])\n .map((key) => [key, data[key]])\n );\n }\n\n getList(): string[] {\n return Object.keys(this.get()).splice(0, this.limit);\n }\n\n set(value: any) {\n this.localStorage.set(value);\n }\n\n update(emojiId: string) {\n const prevEmojis = this.localStorage.get();\n const count = prevEmojis![emojiId] ? prevEmojis[emojiId] + 1 : 1;\n\n const emojis: FrequentEmojis = {\n ...prevEmojis,\n [emojiId]: count,\n };\n\n this.localStorage.set(emojis);\n\n return emojis;\n }\n}\n","import type React from 'react';\n\nimport type { EmojiCategoryList } from '../../lib';\nimport type { IEmojiFloatingLibrary } from './EmojiLibrary';\nimport type { MapEmojiCategoryList } from '../hooks/useEmojiPickerState';\n\nconst setVisibleSections = (\n entries: IntersectionObserverEntry[],\n visibleSections: MapEmojiCategoryList\n) => {\n for (const entry of entries) {\n const id = (entry.target as HTMLDivElement).dataset.id as EmojiCategoryList;\n visibleSections.set(id, entry.isIntersecting);\n }\n};\n\nconst getSectionInFocus = (\n visibleSections: MapEmojiCategoryList\n): EmojiCategoryList | undefined => {\n for (const [id, ratio] of visibleSections) {\n if (ratio) {\n return id;\n }\n }\n};\n\nexport type ObserverCategoriesType = {\n ancestorRef: React.MutableRefObject<HTMLDivElement | null>;\n emojiLibrary: IEmojiFloatingLibrary;\n setFocusedAndVisibleSections: SetFocusedAndVisibleSectionsType;\n};\n\nexport type SetFocusedAndVisibleSectionsType = (\n visibleSections: MapEmojiCategoryList,\n categoryId?: EmojiCategoryList\n) => void;\n\nexport const observeCategories = ({\n ancestorRef,\n emojiLibrary,\n setFocusedAndVisibleSections,\n}: ObserverCategoriesType) => {\n const observerOptions = {\n root: ancestorRef.current,\n threshold: 0,\n };\n\n const visibleSections: MapEmojiCategoryList = new Map();\n\n const observer = new IntersectionObserver((entries) => {\n setVisibleSections(entries, visibleSections);\n const focusedSectionId = getSectionInFocus(visibleSections);\n\n if (focusedSectionId) {\n setFocusedAndVisibleSections(visibleSections, focusedSectionId);\n }\n }, observerOptions);\n\n for (const section of emojiLibrary.getGrid().sections()) {\n if (section.root.current) observer.observe(section.root.current);\n }\n\n return observer;\n};\n","import React from 'react';\n\nimport {\n type EmojiCategoryList,\n type IGrid,\n AGridSection,\n Grid,\n} from '../../../lib';\n\nexport type EmojiFloatingGridType = IGrid<\n React.RefObject<HTMLDivElement | null>,\n EmojiCategoryList\n>;\n\nexport class EmojiFloatingGrid extends Grid<\n React.RefObject<HTMLDivElement | null>,\n EmojiCategoryList\n> {\n createRootRef() {\n return React.createRef<HTMLDivElement>();\n }\n}\n\nexport class EmojiGridSectionWithRoot extends AGridSection<\n React.RefObject<HTMLDivElement | null>,\n EmojiCategoryList\n> {\n protected createRootRef() {\n this._root = React.createRef<HTMLDivElement>();\n }\n}\n","import type {\n EmojiCategoryList,\n EmojiSettingsType,\n GridElements,\n} from '../../../lib';\nimport type { IFrequentEmojiStorage } from './EmojiFloatingLibrary.types';\n\nimport {\n EmojiFloatingGrid,\n EmojiGridSectionWithRoot,\n} from './EmojiFloatingGrid';\n\nexport class EmojiFloatingGridBuilder {\n protected grid = new EmojiFloatingGrid();\n protected localStorage: IFrequentEmojiStorage;\n protected sections: EmojiCategoryList[];\n protected elements: GridElements;\n protected settings: EmojiSettingsType;\n\n constructor(\n localStorage: IFrequentEmojiStorage,\n sections: EmojiCategoryList[],\n elements: GridElements,\n settings: EmojiSettingsType\n ) {\n this.localStorage = localStorage;\n this.sections = sections;\n this.elements = elements;\n this.settings = settings;\n }\n\n private addFrequent() {\n if (this.settings.showFrequent.value) {\n const id = 'frequent';\n this.grid.addSection(\n id,\n new EmojiGridSectionWithRoot(id, this.settings.perLine.value),\n {\n [id]: this.localStorage.getList(),\n }\n );\n }\n }\n\n build() {\n if (this.elements.frequent) {\n this.addFrequent();\n }\n\n this.sections.forEach((id) => {\n if (this.elements[id]?.length) {\n this.grid.addSection(\n id,\n new EmojiGridSectionWithRoot(id, this.settings.perLine.value),\n this.elements\n );\n }\n });\n\n return this.grid;\n }\n}\n","import type { EmojiFloatingGridType } from './EmojiFloatingGrid';\nimport type {\n IEmojiFloatingLibrary,\n IFrequentEmojiStorage,\n} from './EmojiFloatingLibrary.types';\n\nimport {\n type EmojiCategoryList,\n type EmojiLibrary,\n type EmojiSettingsType,\n DEFAULT_EMOJI_LIBRARY,\n defaultCategories,\n EmojiCategory,\n EmojiInlineLibrary,\n} from '../../../lib';\nimport { EmojiFloatingGridBuilder } from './EmojiFloatingGridBuilder';\n\nexport class EmojiFloatingLibrary\n extends EmojiInlineLibrary\n implements IEmojiFloatingLibrary\n{\n private static instance?: EmojiFloatingLibrary;\n\n private readonly categories: EmojiCategoryList[] = defaultCategories;\n private readonly emojis: Partial<Record<EmojiCategoryList, string[]>> = {};\n private readonly grid: EmojiFloatingGridType;\n protected settings: EmojiSettingsType;\n protected localStorage: IFrequentEmojiStorage;\n protected library: EmojiLibrary;\n\n private constructor(\n settings: EmojiSettingsType,\n localStorage: IFrequentEmojiStorage,\n library: EmojiLibrary = DEFAULT_EMOJI_LIBRARY\n ) {\n super(library);\n\n this.settings = settings;\n this.localStorage = localStorage;\n this.library = library;\n\n this.categories = settings.categories.value ?? this.categories;\n\n this.initEmojis(library.categories);\n\n this.grid = new EmojiFloatingGridBuilder(\n this.localStorage,\n this.categories,\n this.emojis,\n settings\n ).build();\n }\n\n static getInstance(\n settings: EmojiSettingsType,\n localStorage: IFrequentEmojiStorage,\n library = DEFAULT_EMOJI_LIBRARY\n ) {\n if (!EmojiFloatingLibrary.instance) {\n EmojiFloatingLibrary.instance = new EmojiFloatingLibrary(\n settings,\n localStorage,\n library\n );\n }\n\n return EmojiFloatingLibrary.instance;\n }\n\n private initEmojis(categoriesLibrary: any) {\n for (const category of categoriesLibrary) {\n (this.emojis as any)[category.id] = category.emojis;\n }\n }\n\n getGrid() {\n return this.grid;\n }\n\n indexOf(focusedCategory: EmojiCategoryList) {\n const index = this.grid.indexOf(focusedCategory);\n\n return index < 1 ? 0 : index;\n }\n\n updateFrequentCategory(emojiId: string) {\n this.localStorage.update(emojiId);\n this.grid.updateSection(\n EmojiCategory.Frequent,\n this.localStorage.getList()\n );\n }\n}\n","import React from 'react';\n\nimport type { Emoji } from '@emoji-mart/data';\n\nimport { type EmojiCategoryList, EmojiCategory } from '../../lib';\n\nexport type EmojiPickerStateDispatch = {\n type: string;\n payload?: Partial<EmojiPickerStateProps>;\n};\n\nexport type EmojiPickerStateProps = {\n hasFound: boolean;\n isOpen: boolean;\n isSearching: boolean;\n searchResult: Emoji[];\n searchValue: string;\n visibleCategories: MapEmojiCategoryList;\n emoji?: Emoji;\n focusedCategory?: EmojiCategoryList;\n frequentEmoji?: string;\n};\n\nexport type MapEmojiCategoryList = Map<EmojiCategoryList, boolean>;\n\nconst initialState: EmojiPickerStateProps = {\n emoji: undefined,\n focusedCategory: undefined,\n frequentEmoji: undefined,\n hasFound: false,\n isOpen: false,\n isSearching: false,\n searchResult: [],\n searchValue: '',\n visibleCategories: new Map(),\n};\n\nexport const useEmojiPickerState = (): [\n EmojiPickerStateProps,\n React.Dispatch<EmojiPickerStateDispatch>,\n] => {\n const [cache, dispatch] = React.useReducer(\n (state: EmojiPickerStateProps, action: EmojiPickerStateDispatch) => {\n const { payload, type } = action;\n\n switch (type) {\n case 'CLEAR_SEARCH': {\n return {\n ...state,\n focusedCategory: EmojiCategory.Frequent,\n hasFound: false,\n isSearching: false,\n searchValue: '',\n };\n }\n case 'SET_CLOSE': {\n return {\n ...state,\n emoji: undefined,\n isOpen: false,\n };\n }\n case 'SET_EMOJI':\n case 'SET_FOCUSED_AND_VISIBLE_CATEGORIES':\n case 'SET_SEARCH': {\n return { ...state, ...payload };\n }\n case 'SET_FOCUSED_CATEGORY': {\n return {\n ...state,\n ...payload,\n hasFound: false,\n isSearching: false,\n searchValue: '',\n };\n }\n case 'SET_OPEN': {\n return {\n ...state,\n isOpen: true,\n };\n }\n case 'UPDATE_FREQUENT_EMOJIS': {\n return {\n ...state,\n ...payload,\n emoji: undefined,\n };\n }\n case 'UPDATE_SEARCH_RESULT': {\n return {\n ...state,\n ...payload,\n focusedCategory: undefined,\n isSearching: true,\n };\n }\n default: {\n throw new Error(`Unhandled action type: ${type}`);\n }\n }\n },\n initialState\n );\n\n return [cache, dispatch];\n};\n","import React from 'react';\n\nimport type { Emoji } from '@emoji-mart/data';\n\nimport { useEditorRef } from 'platejs/react';\n\nimport {\n type AIndexSearch,\n type EmojiCategoryList,\n type EmojiIconList,\n type EmojiSettingsType,\n type i18nProps,\n i18n,\n insertEmoji,\n} from '../../lib';\nimport {\n type IEmojiFloatingLibrary,\n type SetFocusedAndVisibleSectionsType,\n observeCategories,\n} from '../utils';\nimport {\n useEmojiPickerState,\n type MapEmojiCategoryList,\n} from './useEmojiPickerState';\n\nexport type MutableRefs = React.MutableRefObject<{\n content: React.RefObject<HTMLDivElement | null> | undefined;\n contentRoot: React.RefObject<HTMLDivElement | null> | undefined;\n}>;\n\nexport type UseEmojiPickerProps = {\n closeOnSelect: boolean;\n emojiLibrary: IEmojiFloatingLibrary;\n indexSearch: AIndexSearch;\n};\n\nexport type UseEmojiPickerType<\n T extends React.ReactElement<any> = React.ReactElement<any>,\n> = {\n emojiLibrary: IEmojiFloatingLibrary;\n hasFound: boolean;\n i18n: i18nProps;\n icons: EmojiIconList<T>;\n isOpen: boolean;\n isSearching: boolean;\n refs: MutableRefs;\n searchResult: Emoji[];\n searchValue: string;\n visibleCategories: MapEmojiCategoryList;\n clearSearch: () => void;\n setIsOpen: (isOpen: boolean) => void;\n setSearch: (value: string) => void;\n handleCategoryClick: (id: EmojiCategoryList) => void;\n onMouseOver: (emoji?: Emoji) => void;\n onSelectEmoji: (emoji: Emoji) => void;\n emoji?: Emoji;\n focusedCategory?: EmojiCategoryList;\n settings?: EmojiSettingsType;\n styles?: any;\n};\n\nexport const useEmojiPicker = ({\n closeOnSelect,\n emojiLibrary,\n indexSearch,\n}: UseEmojiPickerProps): Omit<UseEmojiPickerType, 'icons' | 'settings'> => {\n const editor = useEditorRef();\n\n const [state, dispatch] = useEmojiPickerState();\n const refs = React.useRef({\n content: React.createRef<HTMLDivElement>(),\n contentRoot: React.createRef<HTMLDivElement>(),\n });\n\n const setIsOpen = React.useCallback(\n (isOpen: boolean) => {\n dispatch({\n type: isOpen ? 'SET_OPEN' : 'SET_CLOSE',\n });\n },\n [dispatch]\n );\n\n const setFocusedAndVisibleSections =\n React.useCallback<SetFocusedAndVisibleSectionsType>(\n (visibleSections, categoryId) => {\n dispatch({\n payload: {\n focusedCategory: categoryId,\n visibleCategories: visibleSections,\n },\n type: 'SET_FOCUSED_AND_VISIBLE_CATEGORIES',\n });\n },\n [dispatch]\n );\n\n const handleSearchInput = React.useCallback(\n (input: string) => {\n const value = String(input).replaceAll(/\\s/g, '');\n\n if (!value && !input) {\n dispatch({ type: 'CLEAR_SEARCH' });\n\n return;\n }\n\n const hasFound = indexSearch.search(value).hasFound();\n\n dispatch({\n payload: {\n hasFound,\n searchResult: indexSearch.get(),\n searchValue: value,\n },\n type: 'UPDATE_SEARCH_RESULT',\n });\n },\n [dispatch, indexSearch]\n );\n\n const setSearch = React.useCallback(\n (value: string) => {\n if (value) {\n handleSearchInput(value);\n } else {\n dispatch({ type: 'CLEAR_SEARCH' });\n }\n },\n [dispatch, handleSearchInput]\n );\n\n const clearSearch = React.useCallback(() => {\n dispatch({ type: 'CLEAR_SEARCH' });\n }, [dispatch]);\n\n const onMouseOver = React.useCallback(\n (emoji?: Emoji) => {\n dispatch({ payload: { emoji }, type: 'SET_EMOJI' });\n },\n [dispatch]\n );\n\n const updateFrequentEmojis = React.useCallback(\n (emojiId: string) => {\n emojiLibrary.updateFrequentCategory(emojiId);\n\n dispatch({\n payload: {\n frequentEmoji: emojiId,\n isOpen: closeOnSelect ? false : state.isOpen,\n },\n type: 'UPDATE_FREQUENT_EMOJIS',\n });\n },\n [closeOnSelect, dispatch, emojiLibrary, state.isOpen]\n );\n\n const onSelectEmoji = React.useCallback(\n (emoji: Emoji) => {\n insertEmoji(editor, emoji);\n updateFrequentEmojis(emoji.id);\n },\n [editor, updateFrequentEmojis]\n );\n\n const handleCategoryClick = React.useCallback(\n (categoryId: EmojiCategoryList) => {\n dispatch({\n payload: { focusedCategory: categoryId },\n type: 'SET_FOCUSED_CATEGORY',\n });\n\n const getSectionPositionToScrollIntoView = () => {\n const trashHold = 1;\n const section = emojiLibrary.getGrid().section(categoryId);\n\n const contentRootScrollTop =\n refs.current.contentRoot.current?.scrollTop ?? 0;\n const contentRootTopPosition =\n refs.current.contentRoot.current?.getBoundingClientRect().top ?? 0;\n const sectionTopPosition =\n section?.root.current?.getBoundingClientRect().top ?? 0;\n\n return (\n trashHold +\n contentRootScrollTop +\n sectionTopPosition -\n contentRootTopPosition\n );\n };\n\n if (refs.current.contentRoot.current) {\n refs.current.contentRoot.current.scrollTop =\n getSectionPositionToScrollIntoView();\n }\n },\n [dispatch, emojiLibrary]\n );\n\n React.useEffect(() => {\n if (state.isOpen && !state.isSearching) {\n // Timeout to allow the category element refs to populate\n setTimeout(() => {\n observeCategories({\n ancestorRef: refs.current.contentRoot,\n emojiLibrary,\n setFocusedAndVisibleSections,\n });\n }, 0);\n }\n }, [\n emojiLibrary,\n state.isOpen,\n state.isSearching,\n setFocusedAndVisibleSections,\n ]);\n\n return {\n clearSearch,\n emoji: state.emoji,\n emojiLibrary,\n i18n,\n refs,\n setIsOpen,\n setSearch,\n handleCategoryClick,\n onMouseOver,\n onSelectEmoji,\n ...state,\n };\n};\n","import { usePluginOption, useStableMemo } from 'platejs/react';\n\nimport {\n type EmojiSettingsType,\n EmojiFloatingIndexSearch,\n EmojiSettings,\n} from '../../lib';\nimport { EmojiPlugin } from '../EmojiPlugin';\nimport { FrequentEmojiStorage } from '../storage';\nimport { EmojiFloatingLibrary } from '../utils';\nimport { useEmojiPicker } from './useEmojiPicker';\n\nexport type EmojiDropdownMenuOptions = {\n closeOnSelect?: boolean;\n settings?: EmojiSettingsType;\n};\n\nexport function useEmojiDropdownMenuState({\n closeOnSelect = true,\n settings = EmojiSettings,\n}: EmojiDropdownMenuOptions = {}) {\n const data = usePluginOption(EmojiPlugin, 'data')!;\n\n const [emojiLibrary, indexSearch] = useStableMemo(() => {\n const frequentEmojiStorage = new FrequentEmojiStorage({\n limit: settings.showFrequent.limit,\n });\n\n const emojiLibrary = EmojiFloatingLibrary.getInstance(\n settings,\n frequentEmojiStorage,\n data\n );\n\n const indexSearch = EmojiFloatingIndexSearch.getInstance(emojiLibrary);\n\n return [emojiLibrary, indexSearch] as const;\n }, [settings]);\n\n const { isOpen, setIsOpen, ...emojiPickerState } = useEmojiPicker({\n closeOnSelect,\n emojiLibrary,\n indexSearch,\n });\n\n return {\n emojiPickerState,\n isOpen,\n setIsOpen,\n };\n}\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@lofcz/platejs-emoji",
3
+ "version": "52.0.15",
4
+ "description": "Emoji plugin for Plate",
5
+ "keywords": [
6
+ "plate",
7
+ "plugin",
8
+ "slate"
9
+ ],
10
+ "homepage": "https://platejs.org",
11
+ "bugs": {
12
+ "url": "https://github.com/udecode/plate/issues"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/lofcz/plate.git",
17
+ "directory": "packages/emoji"
18
+ },
19
+ "license": "MIT",
20
+ "sideEffects": false,
21
+ "exports": {
22
+ ".": "./dist/index.js",
23
+ "./react": "./dist/react/index.js",
24
+ "./package.json": "./package.json"
25
+ },
26
+ "main": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "files": [
29
+ "dist/**/*"
30
+ ],
31
+ "dependencies": {
32
+ "react-compiler-runtime": "^1.0.0",
33
+ "@platejs/combobox": "npm:@lofcz/platejs-combobox@52.0.15"
34
+ },
35
+ "devDependencies": {
36
+ "@emoji-mart/data": "^1.2.1",
37
+ "@plate/scripts": "1.0.0"
38
+ },
39
+ "peerDependencies": {
40
+ "@emoji-mart/data": ">=1.2.0",
41
+ "platejs": ">=52.0.15",
42
+ "react": ">=18.0.0",
43
+ "react-dom": ">=18.0.0"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "type": "module",
49
+ "module": "./dist/index.js",
50
+ "scripts": {
51
+ "brl": "plate-pkg p:brl",
52
+ "build": "plate-pkg p:build",
53
+ "build:watch": "plate-pkg p:build:watch",
54
+ "clean": "plate-pkg p:clean",
55
+ "lint": "plate-pkg p:lint",
56
+ "lint:fix": "plate-pkg p:lint:fix",
57
+ "test": "plate-pkg p:test",
58
+ "test:watch": "plate-pkg p:test:watch",
59
+ "typecheck": "plate-pkg p:typecheck"
60
+ }
61
+ }