@chayns-components/emoji-input 5.6.6 β 5.6.9
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/lib/cjs/build.test.js +34 -0
- package/lib/cjs/build.test.js.map +1 -0
- package/lib/cjs/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.js +48 -219
- package/lib/cjs/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.js.map +1 -1
- package/lib/cjs/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.test.js +316 -0
- package/lib/cjs/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.test.js.map +1 -0
- package/lib/cjs/components/emoji-picker/emoji-picker-emojis/emoji/Emoji.js +1 -0
- package/lib/cjs/components/emoji-picker/emoji-picker-emojis/emoji/Emoji.js.map +1 -1
- package/lib/cjs/components/emoji-picker/emoji-picker-emojis/emoji-picker-emoji-list/EmojiPickerEmojiList.js +109 -0
- package/lib/cjs/components/emoji-picker/emoji-picker-emojis/emoji-picker-emoji-list/EmojiPickerEmojiList.js.map +1 -0
- package/lib/esm/build.test.js +32 -0
- package/lib/esm/build.test.js.map +1 -0
- package/lib/esm/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.js +47 -218
- package/lib/esm/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.js.map +1 -1
- package/lib/esm/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.test.js +312 -0
- package/lib/esm/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.test.js.map +1 -0
- package/lib/esm/components/emoji-picker/emoji-picker-emojis/emoji/Emoji.js +1 -0
- package/lib/esm/components/emoji-picker/emoji-picker-emojis/emoji/Emoji.js.map +1 -1
- package/lib/esm/components/emoji-picker/emoji-picker-emojis/emoji-picker-emoji-list/EmojiPickerEmojiList.js +101 -0
- package/lib/esm/components/emoji-picker/emoji-picker-emojis/emoji-picker-emoji-list/EmojiPickerEmojiList.js.map +1 -0
- package/lib/types/components/emoji-picker/emoji-picker-emojis/emoji-picker-emoji-list/EmojiPickerEmojiList.d.ts +15 -0
- package/package.json +3 -3
- package/lib/types/components/emoji-input/EmojiInput.test.d.ts +0 -1
- package/lib/types/utils/emoji.test.d.ts +0 -1
- package/lib/types/utils/selection.test.d.ts +0 -1
- package/lib/types/utils/text.test.d.ts +0 -1
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = require("@testing-library/react");
|
|
4
|
+
var _react2 = _interopRequireDefault(require("react"));
|
|
5
|
+
var _styledComponents = require("styled-components");
|
|
6
|
+
var _vitest = require("vitest");
|
|
7
|
+
var _EmojiPickerEmojis = _interopRequireDefault(require("./EmojiPickerEmojis"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
10
|
+
const fixtures = _vitest.vi.hoisted(() => ({
|
|
11
|
+
emojis: [{
|
|
12
|
+
emoji: 'π',
|
|
13
|
+
name: 'grinning face',
|
|
14
|
+
skin_tone_support: false
|
|
15
|
+
}, {
|
|
16
|
+
emoji: 'π',
|
|
17
|
+
name: 'smiling face',
|
|
18
|
+
skin_tone_support: false
|
|
19
|
+
}, {
|
|
20
|
+
emoji: 'π',
|
|
21
|
+
name: 'laughing face',
|
|
22
|
+
skin_tone_support: false
|
|
23
|
+
}, {
|
|
24
|
+
emoji: 'π',
|
|
25
|
+
name: 'cat',
|
|
26
|
+
skin_tone_support: false
|
|
27
|
+
}, {
|
|
28
|
+
emoji: 'π',
|
|
29
|
+
name: 'thumbs up',
|
|
30
|
+
skin_tone_support: true
|
|
31
|
+
}, {
|
|
32
|
+
emoji: 'π',
|
|
33
|
+
name: 'thumbs down',
|
|
34
|
+
skin_tone_support: true
|
|
35
|
+
}, {
|
|
36
|
+
emoji: 'π',
|
|
37
|
+
name: 'waving hand',
|
|
38
|
+
skin_tone_support: true
|
|
39
|
+
}, {
|
|
40
|
+
emoji: 'π€',
|
|
41
|
+
name: 'handshake',
|
|
42
|
+
skin_tone_support: true
|
|
43
|
+
}],
|
|
44
|
+
addHistory: _vitest.vi.fn(),
|
|
45
|
+
history: []
|
|
46
|
+
}));
|
|
47
|
+
_vitest.vi.mock('unicode-emoji-json/data-by-group.json', () => ({
|
|
48
|
+
default: [{
|
|
49
|
+
slug: 'smileys_emotion',
|
|
50
|
+
emojis: fixtures.emojis
|
|
51
|
+
}, {
|
|
52
|
+
slug: 'people_body',
|
|
53
|
+
emojis: fixtures.emojis.slice(4)
|
|
54
|
+
}]
|
|
55
|
+
}));
|
|
56
|
+
_vitest.vi.mock('unicode-emoji-json/data-by-emoji.json', () => ({
|
|
57
|
+
default: Object.fromEntries(fixtures.emojis.map(({
|
|
58
|
+
emoji,
|
|
59
|
+
...data
|
|
60
|
+
}) => [emoji, data]))
|
|
61
|
+
}));
|
|
62
|
+
_vitest.vi.mock('../../../hooks/emojiHistory', () => ({
|
|
63
|
+
useEmojiHistory: () => ({
|
|
64
|
+
addOrUpdateEmojiInHistory: fixtures.addHistory,
|
|
65
|
+
historyEmojis: fixtures.history.slice()
|
|
66
|
+
})
|
|
67
|
+
}));
|
|
68
|
+
_vitest.vi.mock('@chayns-components/core', async () => {
|
|
69
|
+
const {
|
|
70
|
+
useRef
|
|
71
|
+
} = await Promise.resolve().then(() => _interopRequireWildcard(require('react')));
|
|
72
|
+
return {
|
|
73
|
+
...(await Promise.resolve().then(() => _interopRequireWildcard(require('../../../../../core/src/hooks/ref')))),
|
|
74
|
+
useIsMeasuredClone: () => [false, useRef(null)]
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
const setup = async () => {
|
|
78
|
+
const onSelect = _vitest.vi.fn();
|
|
79
|
+
const renderPicker = (searchString = '', selectedCategory = 'smileys_emotion') => /*#__PURE__*/_react2.default.createElement(_styledComponents.ThemeProvider, {
|
|
80
|
+
theme: {
|
|
81
|
+
'secondary-102': 'rgb(255, 0, 0)'
|
|
82
|
+
}
|
|
83
|
+
}, /*#__PURE__*/_react2.default.createElement("input", {
|
|
84
|
+
"aria-label": "Search"
|
|
85
|
+
}), /*#__PURE__*/_react2.default.createElement(_EmojiPickerEmojis.default, {
|
|
86
|
+
onSelect: onSelect,
|
|
87
|
+
searchString: searchString,
|
|
88
|
+
selectedCategory: selectedCategory
|
|
89
|
+
}));
|
|
90
|
+
const view = (0, _react.render)(renderPicker());
|
|
91
|
+
await (0, _react.waitFor)(() => (0, _vitest.expect)(view.container.querySelectorAll('[data-emoji]')).toHaveLength(8));
|
|
92
|
+
return {
|
|
93
|
+
...view,
|
|
94
|
+
onSelect,
|
|
95
|
+
update: (search = '', category) => view.rerender(renderPicker(search, category))
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
const key = (key, ctrlKey = false) => _react.fireEvent.keyDown(document, {
|
|
99
|
+
key,
|
|
100
|
+
ctrlKey
|
|
101
|
+
});
|
|
102
|
+
const navigate = () => {
|
|
103
|
+
for (let index = 0; index < 7; index += 1) key('ArrowRight');
|
|
104
|
+
};
|
|
105
|
+
const selected = element => (0, _vitest.expect)(getComputedStyle(element).backgroundColor).toBe('rgb(255, 0, 0)');
|
|
106
|
+
(0, _vitest.beforeEach)(() => {
|
|
107
|
+
fixtures.addHistory.mockReset();
|
|
108
|
+
fixtures.history = [];
|
|
109
|
+
});
|
|
110
|
+
(0, _vitest.describe)('EmojiPickerEmojis changing results', () => {
|
|
111
|
+
(0, _vitest.it)('resets to the first result before Enter after narrowing the search', async () => {
|
|
112
|
+
const {
|
|
113
|
+
onSelect,
|
|
114
|
+
update
|
|
115
|
+
} = await setup();
|
|
116
|
+
navigate();
|
|
117
|
+
_react.screen.getByRole('textbox', {
|
|
118
|
+
name: 'Search'
|
|
119
|
+
}).focus();
|
|
120
|
+
update('thumbs');
|
|
121
|
+
key('Enter');
|
|
122
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledTimes(1);
|
|
123
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledWith('π', true);
|
|
124
|
+
(0, _vitest.expect)(document.activeElement).toBe(_react.screen.getByRole('textbox', {
|
|
125
|
+
name: 'Search'
|
|
126
|
+
}));
|
|
127
|
+
});
|
|
128
|
+
(0, _vitest.it)('does not select the hint or throw on Enter and Ctrl+Enter without results', async () => {
|
|
129
|
+
const {
|
|
130
|
+
onSelect,
|
|
131
|
+
update,
|
|
132
|
+
container
|
|
133
|
+
} = await setup();
|
|
134
|
+
navigate();
|
|
135
|
+
update('no-matching-emoji-9284');
|
|
136
|
+
key('Enter');
|
|
137
|
+
key('Enter', true);
|
|
138
|
+
(0, _vitest.expect)(onSelect).not.toHaveBeenCalled();
|
|
139
|
+
(0, _vitest.expect)(container.querySelector('[data-emoji]')).toBeNull();
|
|
140
|
+
(0, _vitest.expect)(container.querySelector('[tabindex="0"]')).toBeNull();
|
|
141
|
+
});
|
|
142
|
+
_vitest.it.each(['thumbs', 'no-matching-emoji-9284'])('handles every arrow after searching for %s', async search => {
|
|
143
|
+
const {
|
|
144
|
+
onSelect,
|
|
145
|
+
update,
|
|
146
|
+
container
|
|
147
|
+
} = await setup();
|
|
148
|
+
navigate();
|
|
149
|
+
update(search);
|
|
150
|
+
for (const direction of ['ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown']) key(direction);
|
|
151
|
+
key('Enter');
|
|
152
|
+
if (search === 'thumbs') {
|
|
153
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledTimes(1);
|
|
154
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledWith('π', true);
|
|
155
|
+
selected(container.querySelector('[data-emoji="π"]'));
|
|
156
|
+
} else (0, _vitest.expect)(onSelect).not.toHaveBeenCalled();
|
|
157
|
+
});
|
|
158
|
+
(0, _vitest.it)('recovers after clearing an empty search', async () => {
|
|
159
|
+
const {
|
|
160
|
+
onSelect,
|
|
161
|
+
update,
|
|
162
|
+
container
|
|
163
|
+
} = await setup();
|
|
164
|
+
navigate();
|
|
165
|
+
update('no-matching-emoji-9284');
|
|
166
|
+
key('ArrowRight');
|
|
167
|
+
update('');
|
|
168
|
+
key('ArrowRight');
|
|
169
|
+
key('Enter');
|
|
170
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledTimes(1);
|
|
171
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledWith('π', true);
|
|
172
|
+
selected(container.querySelector('[data-emoji="π"]'));
|
|
173
|
+
});
|
|
174
|
+
(0, _vitest.it)('resets on category changes and keeps an empty history unselectable', async () => {
|
|
175
|
+
const {
|
|
176
|
+
onSelect,
|
|
177
|
+
update
|
|
178
|
+
} = await setup();
|
|
179
|
+
navigate();
|
|
180
|
+
update('', 'people_body');
|
|
181
|
+
key('Enter');
|
|
182
|
+
(0, _vitest.expect)(onSelect).toHaveBeenLastCalledWith('π', true);
|
|
183
|
+
onSelect.mockClear();
|
|
184
|
+
update('', 'history');
|
|
185
|
+
key('ArrowRight');
|
|
186
|
+
key('ArrowDown');
|
|
187
|
+
key('Enter');
|
|
188
|
+
(0, _vitest.expect)(onSelect).not.toHaveBeenCalled();
|
|
189
|
+
});
|
|
190
|
+
(0, _vitest.it)('uses visible positions for highlight, keyboard selection, and mouse selection including index zero', async () => {
|
|
191
|
+
const {
|
|
192
|
+
onSelect,
|
|
193
|
+
update,
|
|
194
|
+
container
|
|
195
|
+
} = await setup();
|
|
196
|
+
update('thumbs');
|
|
197
|
+
selected(container.querySelector('[data-emoji="π"]'));
|
|
198
|
+
key('ArrowRight');
|
|
199
|
+
selected(container.querySelector('[data-emoji="π"]'));
|
|
200
|
+
key('Enter');
|
|
201
|
+
(0, _vitest.expect)(onSelect).toHaveBeenLastCalledWith('π', true);
|
|
202
|
+
_react.fireEvent.click(container.querySelector('[data-emoji="π"]'));
|
|
203
|
+
selected(container.querySelector('[data-emoji="π"]'));
|
|
204
|
+
(0, _vitest.expect)(onSelect).toHaveBeenLastCalledWith('π', false);
|
|
205
|
+
});
|
|
206
|
+
(0, _vitest.it)('opens the skin tone popup for the visible right-clicked emoji after filtering', async () => {
|
|
207
|
+
const {
|
|
208
|
+
update,
|
|
209
|
+
onSelect,
|
|
210
|
+
container
|
|
211
|
+
} = await setup();
|
|
212
|
+
update('thumbs');
|
|
213
|
+
_react.fireEvent.contextMenu(container.querySelector('[data-emoji="π"]'));
|
|
214
|
+
selected(container.querySelector('[data-emoji="π"]'));
|
|
215
|
+
key('ArrowRight');
|
|
216
|
+
key('Enter');
|
|
217
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledTimes(1);
|
|
218
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledWith('ππΌ', false);
|
|
219
|
+
});
|
|
220
|
+
(0, _vitest.it)('closes a stale popup on result changes and resumes grid controls', async () => {
|
|
221
|
+
const {
|
|
222
|
+
update,
|
|
223
|
+
onSelect,
|
|
224
|
+
container
|
|
225
|
+
} = await setup();
|
|
226
|
+
update('thumbs');
|
|
227
|
+
key('Enter', true);
|
|
228
|
+
(0, _vitest.expect)(container.querySelector('[data-skin-tone]')).not.toBeNull();
|
|
229
|
+
update('cat');
|
|
230
|
+
(0, _vitest.expect)(container.querySelector('[data-skin-tone]')).toBeNull();
|
|
231
|
+
key('ArrowRight');
|
|
232
|
+
key('Enter');
|
|
233
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledTimes(1);
|
|
234
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledWith('π', true);
|
|
235
|
+
});
|
|
236
|
+
(0, _vitest.it)('dismisses the old popup even when its emoji remains in a smaller result list', async () => {
|
|
237
|
+
const {
|
|
238
|
+
update,
|
|
239
|
+
onSelect,
|
|
240
|
+
container
|
|
241
|
+
} = await setup();
|
|
242
|
+
update('thumbs');
|
|
243
|
+
_react.fireEvent.contextMenu(container.querySelector('[data-emoji="π"]'));
|
|
244
|
+
(0, _vitest.expect)(container.querySelector('[data-skin-tone]')).not.toBeNull();
|
|
245
|
+
update('thumbs up');
|
|
246
|
+
(0, _vitest.expect)(container.querySelector('[data-skin-tone]')).toBeNull();
|
|
247
|
+
selected(container.querySelector('[data-emoji="π"]'));
|
|
248
|
+
key('Enter');
|
|
249
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledTimes(1);
|
|
250
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledWith('π', true);
|
|
251
|
+
});
|
|
252
|
+
(0, _vitest.it)('does not carry an unsupported Ctrl+Enter popup request to the next emoji', async () => {
|
|
253
|
+
const {
|
|
254
|
+
update,
|
|
255
|
+
onSelect,
|
|
256
|
+
container
|
|
257
|
+
} = await setup();
|
|
258
|
+
update('cat');
|
|
259
|
+
key('Enter', true);
|
|
260
|
+
update('thumbs');
|
|
261
|
+
(0, _vitest.expect)(container.querySelector('[data-skin-tone]')).toBeNull();
|
|
262
|
+
key('ArrowRight');
|
|
263
|
+
key('Enter');
|
|
264
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledTimes(1);
|
|
265
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledWith('π', true);
|
|
266
|
+
});
|
|
267
|
+
(0, _vitest.it)('keeps navigation stable when history is returned as a fresh array', async () => {
|
|
268
|
+
fixtures.history = fixtures.emojis.slice(0, 3);
|
|
269
|
+
const {
|
|
270
|
+
update,
|
|
271
|
+
onSelect,
|
|
272
|
+
container
|
|
273
|
+
} = await setup();
|
|
274
|
+
update('', 'history');
|
|
275
|
+
key('ArrowRight');
|
|
276
|
+
update('', 'history');
|
|
277
|
+
key('ArrowRight');
|
|
278
|
+
selected(container.querySelector('[data-emoji="π"]'));
|
|
279
|
+
(0, _vitest.expect)(container.querySelectorAll('[data-emoji][tabindex="0"]')).toHaveLength(1);
|
|
280
|
+
key('Enter');
|
|
281
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledTimes(1);
|
|
282
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledWith('π', true);
|
|
283
|
+
});
|
|
284
|
+
(0, _vitest.it)('clears a search popup when returning to history with the same visible emoji', async () => {
|
|
285
|
+
fixtures.history = [fixtures.emojis[4]];
|
|
286
|
+
const {
|
|
287
|
+
update,
|
|
288
|
+
container
|
|
289
|
+
} = await setup();
|
|
290
|
+
update('thumbs up', 'history');
|
|
291
|
+
key('Enter', true);
|
|
292
|
+
(0, _vitest.expect)(container.querySelector('[data-skin-tone]')).not.toBeNull();
|
|
293
|
+
update('', 'history');
|
|
294
|
+
(0, _vitest.expect)(container.querySelector('[data-skin-tone]')).toBeNull();
|
|
295
|
+
key('Enter', true);
|
|
296
|
+
(0, _vitest.expect)(container.querySelector('[data-skin-tone]')).toBeNull();
|
|
297
|
+
});
|
|
298
|
+
(0, _vitest.it)('keeps normal six-column keyboard navigation and history callbacks', async () => {
|
|
299
|
+
const {
|
|
300
|
+
onSelect,
|
|
301
|
+
container
|
|
302
|
+
} = await setup();
|
|
303
|
+
key('ArrowDown');
|
|
304
|
+
selected(container.querySelector('[data-emoji="π"]'));
|
|
305
|
+
key('Enter');
|
|
306
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledTimes(1);
|
|
307
|
+
(0, _vitest.expect)(onSelect).toHaveBeenCalledWith('π', true);
|
|
308
|
+
(0, _vitest.expect)(fixtures.addHistory).toHaveBeenCalledTimes(1);
|
|
309
|
+
(0, _vitest.expect)(fixtures.addHistory).toHaveBeenCalledWith({
|
|
310
|
+
emoji: 'π',
|
|
311
|
+
name: 'waving hand',
|
|
312
|
+
skin_tone_support: true
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
//# sourceMappingURL=EmojiPickerEmojis.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmojiPickerEmojis.test.js","names":["_react","require","_react2","_interopRequireDefault","_styledComponents","_vitest","_EmojiPickerEmojis","e","__esModule","default","_interopRequireWildcard","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","fixtures","vi","hoisted","emojis","emoji","name","skin_tone_support","addHistory","fn","history","mock","slug","slice","fromEntries","map","data","useEmojiHistory","addOrUpdateEmojiInHistory","historyEmojis","useRef","Promise","resolve","then","useIsMeasuredClone","setup","onSelect","renderPicker","searchString","selectedCategory","createElement","ThemeProvider","theme","view","render","waitFor","expect","container","querySelectorAll","toHaveLength","update","search","category","rerender","key","ctrlKey","fireEvent","keyDown","document","navigate","index","selected","element","getComputedStyle","backgroundColor","toBe","beforeEach","mockReset","describe","it","screen","getByRole","focus","toHaveBeenCalledTimes","toHaveBeenCalledWith","activeElement","not","toHaveBeenCalled","querySelector","toBeNull","each","direction","toHaveBeenLastCalledWith","mockClear","click","contextMenu"],"sources":["../../../../../src/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.test.tsx"],"sourcesContent":["import { fireEvent, render, screen, waitFor } from '@testing-library/react';\nimport React from 'react';\nimport { ThemeProvider } from 'styled-components';\nimport { beforeEach, describe, expect, it, vi } from 'vitest';\nimport EmojiPickerEmojis from './EmojiPickerEmojis';\nimport type { Category } from '../../../types/category';\n\nconst fixtures = vi.hoisted(() => ({\n emojis: [\n { emoji: 'π', name: 'grinning face', skin_tone_support: false },\n { emoji: 'π', name: 'smiling face', skin_tone_support: false },\n { emoji: 'π', name: 'laughing face', skin_tone_support: false },\n { emoji: 'π', name: 'cat', skin_tone_support: false },\n { emoji: 'π', name: 'thumbs up', skin_tone_support: true },\n { emoji: 'π', name: 'thumbs down', skin_tone_support: true },\n { emoji: 'π', name: 'waving hand', skin_tone_support: true },\n { emoji: 'π€', name: 'handshake', skin_tone_support: true },\n ],\n addHistory: vi.fn(),\n history: [] as { emoji: string; name: string; skin_tone_support: boolean }[],\n}));\n\nvi.mock('unicode-emoji-json/data-by-group.json', () => ({\n default: [\n { slug: 'smileys_emotion', emojis: fixtures.emojis },\n { slug: 'people_body', emojis: fixtures.emojis.slice(4) },\n ],\n}));\nvi.mock('unicode-emoji-json/data-by-emoji.json', () => ({\n default: Object.fromEntries(fixtures.emojis.map(({ emoji, ...data }) => [emoji, data])),\n}));\nvi.mock('../../../hooks/emojiHistory', () => ({\n useEmojiHistory: () => ({\n addOrUpdateEmojiInHistory: fixtures.addHistory,\n historyEmojis: fixtures.history.slice(),\n }),\n}));\nvi.mock('@chayns-components/core', async () => {\n const { useRef } = await import('react');\n return {\n ...(await import('../../../../../core/src/hooks/ref')),\n useIsMeasuredClone: () => [false, useRef<HTMLDivElement>(null)] as const,\n };\n});\n\nconst setup = async () => {\n const onSelect = vi.fn();\n const renderPicker = (searchString = '', selectedCategory: Category = 'smileys_emotion') => (\n <ThemeProvider theme={{ 'secondary-102': 'rgb(255, 0, 0)' }}>\n <input aria-label=\"Search\" />\n <EmojiPickerEmojis\n onSelect={onSelect}\n searchString={searchString}\n selectedCategory={selectedCategory}\n />\n </ThemeProvider>\n );\n const view = render(renderPicker());\n await waitFor(() => expect(view.container.querySelectorAll('[data-emoji]')).toHaveLength(8));\n return {\n ...view,\n onSelect,\n update: (search = '', category?: Category) => view.rerender(renderPicker(search, category)),\n };\n};\n\nconst key = (key: string, ctrlKey = false) => fireEvent.keyDown(document, { key, ctrlKey });\nconst navigate = () => {\n for (let index = 0; index < 7; index += 1) key('ArrowRight');\n};\nconst selected = (element: Element) =>\n expect(getComputedStyle(element).backgroundColor).toBe('rgb(255, 0, 0)');\n\nbeforeEach(() => {\n fixtures.addHistory.mockReset();\n fixtures.history = [];\n});\n\ndescribe('EmojiPickerEmojis changing results', () => {\n it('resets to the first result before Enter after narrowing the search', async () => {\n const { onSelect, update } = await setup();\n navigate();\n screen.getByRole('textbox', { name: 'Search' }).focus();\n update('thumbs');\n key('Enter');\n expect(onSelect).toHaveBeenCalledTimes(1);\n expect(onSelect).toHaveBeenCalledWith('π', true);\n expect(document.activeElement).toBe(screen.getByRole('textbox', { name: 'Search' }));\n });\n\n it('does not select the hint or throw on Enter and Ctrl+Enter without results', async () => {\n const { onSelect, update, container } = await setup();\n navigate();\n update('no-matching-emoji-9284');\n key('Enter');\n key('Enter', true);\n expect(onSelect).not.toHaveBeenCalled();\n expect(container.querySelector('[data-emoji]')).toBeNull();\n expect(container.querySelector('[tabindex=\"0\"]')).toBeNull();\n });\n\n it.each(['thumbs', 'no-matching-emoji-9284'])(\n 'handles every arrow after searching for %s',\n async (search) => {\n const { onSelect, update, container } = await setup();\n navigate();\n update(search);\n for (const direction of ['ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'])\n key(direction);\n key('Enter');\n if (search === 'thumbs') {\n expect(onSelect).toHaveBeenCalledTimes(1);\n expect(onSelect).toHaveBeenCalledWith('π', true);\n selected(container.querySelector('[data-emoji=\"π\"]')!);\n } else expect(onSelect).not.toHaveBeenCalled();\n },\n );\n\n it('recovers after clearing an empty search', async () => {\n const { onSelect, update, container } = await setup();\n navigate();\n update('no-matching-emoji-9284');\n key('ArrowRight');\n update('');\n key('ArrowRight');\n key('Enter');\n expect(onSelect).toHaveBeenCalledTimes(1);\n expect(onSelect).toHaveBeenCalledWith('π', true);\n selected(container.querySelector('[data-emoji=\"π\"]')!);\n });\n\n it('resets on category changes and keeps an empty history unselectable', async () => {\n const { onSelect, update } = await setup();\n navigate();\n update('', 'people_body');\n key('Enter');\n expect(onSelect).toHaveBeenLastCalledWith('π', true);\n onSelect.mockClear();\n update('', 'history');\n key('ArrowRight');\n key('ArrowDown');\n key('Enter');\n expect(onSelect).not.toHaveBeenCalled();\n });\n\n it('uses visible positions for highlight, keyboard selection, and mouse selection including index zero', async () => {\n const { onSelect, update, container } = await setup();\n update('thumbs');\n selected(container.querySelector('[data-emoji=\"π\"]')!);\n key('ArrowRight');\n selected(container.querySelector('[data-emoji=\"π\"]')!);\n key('Enter');\n expect(onSelect).toHaveBeenLastCalledWith('π', true);\n fireEvent.click(container.querySelector('[data-emoji=\"π\"]')!);\n selected(container.querySelector('[data-emoji=\"π\"]')!);\n expect(onSelect).toHaveBeenLastCalledWith('π', false);\n });\n\n it('opens the skin tone popup for the visible right-clicked emoji after filtering', async () => {\n const { update, onSelect, container } = await setup();\n update('thumbs');\n fireEvent.contextMenu(container.querySelector('[data-emoji=\"π\"]')!);\n selected(container.querySelector('[data-emoji=\"π\"]')!);\n key('ArrowRight');\n key('Enter');\n expect(onSelect).toHaveBeenCalledTimes(1);\n expect(onSelect).toHaveBeenCalledWith('ππΌ', false);\n });\n\n it('closes a stale popup on result changes and resumes grid controls', async () => {\n const { update, onSelect, container } = await setup();\n update('thumbs');\n key('Enter', true);\n expect(container.querySelector('[data-skin-tone]')).not.toBeNull();\n update('cat');\n expect(container.querySelector('[data-skin-tone]')).toBeNull();\n key('ArrowRight');\n key('Enter');\n expect(onSelect).toHaveBeenCalledTimes(1);\n expect(onSelect).toHaveBeenCalledWith('π', true);\n });\n\n it('dismisses the old popup even when its emoji remains in a smaller result list', async () => {\n const { update, onSelect, container } = await setup();\n update('thumbs');\n fireEvent.contextMenu(container.querySelector('[data-emoji=\"π\"]')!);\n expect(container.querySelector('[data-skin-tone]')).not.toBeNull();\n update('thumbs up');\n expect(container.querySelector('[data-skin-tone]')).toBeNull();\n selected(container.querySelector('[data-emoji=\"π\"]')!);\n key('Enter');\n expect(onSelect).toHaveBeenCalledTimes(1);\n expect(onSelect).toHaveBeenCalledWith('π', true);\n });\n\n it('does not carry an unsupported Ctrl+Enter popup request to the next emoji', async () => {\n const { update, onSelect, container } = await setup();\n update('cat');\n key('Enter', true);\n update('thumbs');\n expect(container.querySelector('[data-skin-tone]')).toBeNull();\n key('ArrowRight');\n key('Enter');\n expect(onSelect).toHaveBeenCalledTimes(1);\n expect(onSelect).toHaveBeenCalledWith('π', true);\n });\n\n it('keeps navigation stable when history is returned as a fresh array', async () => {\n fixtures.history = fixtures.emojis.slice(0, 3);\n const { update, onSelect, container } = await setup();\n update('', 'history');\n key('ArrowRight');\n update('', 'history');\n key('ArrowRight');\n selected(container.querySelector('[data-emoji=\"π\"]')!);\n expect(container.querySelectorAll('[data-emoji][tabindex=\"0\"]')).toHaveLength(1);\n key('Enter');\n expect(onSelect).toHaveBeenCalledTimes(1);\n expect(onSelect).toHaveBeenCalledWith('π', true);\n });\n\n it('clears a search popup when returning to history with the same visible emoji', async () => {\n fixtures.history = [fixtures.emojis[4]!];\n const { update, container } = await setup();\n update('thumbs up', 'history');\n key('Enter', true);\n expect(container.querySelector('[data-skin-tone]')).not.toBeNull();\n update('', 'history');\n expect(container.querySelector('[data-skin-tone]')).toBeNull();\n key('Enter', true);\n expect(container.querySelector('[data-skin-tone]')).toBeNull();\n });\n\n it('keeps normal six-column keyboard navigation and history callbacks', async () => {\n const { onSelect, container } = await setup();\n key('ArrowDown');\n selected(container.querySelector('[data-emoji=\"π\"]')!);\n key('Enter');\n expect(onSelect).toHaveBeenCalledTimes(1);\n expect(onSelect).toHaveBeenCalledWith('π', true);\n expect(fixtures.addHistory).toHaveBeenCalledTimes(1);\n expect(fixtures.addHistory).toHaveBeenCalledWith({\n emoji: 'π',\n name: 'waving hand',\n skin_tone_support: true,\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -120,6 +120,7 @@ const Emoji = ({
|
|
|
120
120
|
return /*#__PURE__*/_react2.default.createElement(_Emoji.StyledEmoji, {
|
|
121
121
|
ref: emojiRef,
|
|
122
122
|
$isSelected: isSelected,
|
|
123
|
+
tabIndex: isSelected ? 0 : -1,
|
|
123
124
|
"data-emoji": emoji,
|
|
124
125
|
"data-name": name,
|
|
125
126
|
"data-skin-tone-support": isSkinToneSupported,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Emoji.js","names":["_react","require","_react2","_interopRequireWildcard","_alignment","_Emoji","_SkinTonePopup","_interopRequireDefault","_SkinTonePopup2","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","Emoji","emoji","isSelected","name","isSkinToneSupported","onPopupVisibilityChange","onSelect","shouldShowSkinTonePopup","onRightClick","index","emojiList","shouldShowPopup","setShouldShowPopup","useState","skinTonePopupAnchorAlignment","setSkinTonePopupAnchorAlignment","AnchorAlignment","Top","skinTonePopupAnchorOffset","setSkinTonePopupAnchorOffset","skinTonePopupOverlayPosition","setSkinTonePopupOverlayPosition","top","skinTonePopupPosition","setSkinTonePopupPosition","left","emojiRef","useRef","handleClick","useCallback","calculatePopupPosition","current","element","parentElement","height","elementHeight","elementLeft","elementTop","width","elementWidth","getBoundingClientRect","parentHeight","parentLeft","parentTop","parentWidth","scrollTop","anchorAlignment","anchorOffset","skinTonePopupContentSize","maxLeft","minLeft","Bottom","handleContextMenu","event","preventDefault","stopPropagation","useEffect","handleHidePopup","createElement","StyledEmoji","ref","$isSelected","className","onClick","onContextMenu","AnimatePresence","initial","key","onHidePopup","overlayPosition","position","displayName","_default","exports"],"sources":["../../../../../../src/components/emoji-picker/emoji-picker-emojis/emoji/Emoji.tsx"],"sourcesContent":["import { AnimatePresence } from 'motion/react';\nimport React, { FC, MouseEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { AnchorAlignment } from '../../../../constants/alignment';\nimport { StyledEmoji } from './Emoji.styles';\nimport SkinTonePopup, { SkinTonePopupProps } from './skin-tone-popup/SkinTonePopup';\nimport { skinTonePopupContentSize } from './skin-tone-popup/SkinTonePopup.styles';\n\nexport type EmojiProps = {\n emoji: string;\n isSelected: boolean;\n name: string;\n index: number;\n isSkinToneSupported: boolean;\n onPopupVisibilityChange: (isVisible: boolean) => void;\n onSelect: (emoji: string) => void;\n onRightClick: (newIndex: number) => void;\n shouldShowSkinTonePopup: boolean;\n emojiList: { [x: string]: { skin_tone_support: any } };\n};\n\nconst Emoji: FC<EmojiProps> = ({\n emoji,\n isSelected,\n name,\n isSkinToneSupported,\n onPopupVisibilityChange,\n onSelect,\n shouldShowSkinTonePopup,\n onRightClick,\n index,\n emojiList,\n}) => {\n const [shouldShowPopup, setShouldShowPopup] = useState(false);\n const [skinTonePopupAnchorAlignment, setSkinTonePopupAnchorAlignment] = useState(\n AnchorAlignment.Top,\n );\n const [skinTonePopupAnchorOffset, setSkinTonePopupAnchorOffset] = useState(0);\n const [skinTonePopupOverlayPosition, setSkinTonePopupOverlayPosition] = useState<\n SkinTonePopupProps['overlayPosition']\n >({ top: 0 });\n const [skinTonePopupPosition, setSkinTonePopupPosition] = useState<\n SkinTonePopupProps['position']\n >({ left: 0, top: 0 });\n\n const emojiRef = useRef<HTMLDivElement>(null);\n\n const handleClick = useCallback(() => {\n onSelect(emoji);\n }, [emoji, onSelect]);\n\n const calculatePopupPosition = useCallback(() => {\n if (!emojiRef.current) {\n return;\n }\n\n const element = emojiRef.current;\n const { parentElement } = emojiRef.current;\n\n if (parentElement) {\n const {\n height: elementHeight,\n left: elementLeft,\n top: elementTop,\n width: elementWidth,\n } = element.getBoundingClientRect();\n\n const {\n height: parentHeight,\n left: parentLeft,\n top: parentTop,\n width: parentWidth,\n } = parentElement.getBoundingClientRect();\n\n const { scrollTop } = parentElement;\n\n let anchorAlignment = AnchorAlignment.Top;\n let anchorOffset = 0;\n\n let left =\n elementLeft - parentLeft - skinTonePopupContentSize.width / 2 + elementWidth / 2;\n\n let top = elementTop - parentTop + elementHeight + scrollTop;\n\n const maxLeft = parentWidth - skinTonePopupContentSize.width - 12;\n const minLeft = 12;\n\n if (left < minLeft) {\n anchorOffset = left - minLeft;\n left = minLeft;\n } else if (left > maxLeft) {\n anchorOffset = left - maxLeft;\n left = maxLeft;\n }\n\n if (top + skinTonePopupContentSize.height > parentHeight + scrollTop) {\n anchorAlignment = AnchorAlignment.Bottom;\n top -= elementHeight + skinTonePopupContentSize.height;\n }\n\n if (isSkinToneSupported) {\n setSkinTonePopupAnchorAlignment(anchorAlignment);\n setSkinTonePopupAnchorOffset(anchorOffset);\n setSkinTonePopupPosition({ left, top });\n setSkinTonePopupOverlayPosition({ top: scrollTop });\n setShouldShowPopup(true);\n }\n }\n }, [isSkinToneSupported]);\n\n const handleContextMenu = useCallback(\n (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (isSkinToneSupported) {\n onRightClick(index);\n calculatePopupPosition();\n }\n },\n [calculatePopupPosition, index, isSkinToneSupported, onRightClick],\n );\n\n useEffect(() => {\n if (\n emojiRef.current &&\n shouldShowSkinTonePopup &&\n skinTonePopupPosition.top === 0 &&\n skinTonePopupPosition.left === 0\n ) {\n calculatePopupPosition();\n }\n }, [\n calculatePopupPosition,\n index,\n isSkinToneSupported,\n shouldShowSkinTonePopup,\n skinTonePopupPosition,\n ]);\n\n useEffect(() => {\n if (shouldShowSkinTonePopup) {\n setShouldShowPopup(shouldShowSkinTonePopup);\n }\n }, [shouldShowSkinTonePopup]);\n\n const handleHidePopup = useCallback(() => {\n setShouldShowPopup(false);\n }, []);\n\n useEffect(() => {\n onPopupVisibilityChange(shouldShowPopup);\n }, [onPopupVisibilityChange, shouldShowPopup]);\n\n return (\n <StyledEmoji\n ref={emojiRef}\n $isSelected={isSelected}\n data-emoji={emoji}\n data-name={name}\n data-skin-tone-support={isSkinToneSupported}\n className=\"prevent-lose-focus\"\n onClick={handleClick}\n onContextMenu={handleContextMenu}\n >\n {emoji}\n <AnimatePresence initial={false}>\n {shouldShowPopup && (\n <SkinTonePopup\n anchorAlignment={skinTonePopupAnchorAlignment}\n anchorOffset={skinTonePopupAnchorOffset}\n emoji={emoji}\n key={emoji}\n onHidePopup={handleHidePopup}\n onSelect={onSelect}\n overlayPosition={skinTonePopupOverlayPosition}\n position={skinTonePopupPosition}\n emojiList={emojiList}\n />\n )}\n </AnimatePresence>\n </StyledEmoji>\n );\n};\n\nEmoji.displayName = 'Emoji';\n\nexport default Emoji;\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAC,uBAAA,CAAAF,OAAA;AACA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,MAAA,GAAAJ,OAAA;AACA,IAAAK,cAAA,GAAAC,sBAAA,CAAAN,OAAA;AACA,IAAAO,eAAA,GAAAP,OAAA;AAAkF,SAAAM,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAN,wBAAAM,CAAA,EAAAG,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAV,uBAAA,YAAAA,CAAAM,CAAA,EAAAG,CAAA,SAAAA,CAAA,IAAAH,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAO,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAR,OAAA,EAAAF,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAS,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAI,GAAA,CAAAX,CAAA,UAAAO,CAAA,CAAAK,GAAA,CAAAZ,CAAA,GAAAO,CAAA,CAAAM,GAAA,CAAAb,CAAA,EAAAS,CAAA,gBAAAN,CAAA,IAAAH,CAAA,gBAAAG,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAG,CAAA,OAAAK,CAAA,IAAAD,CAAA,GAAAS,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAG,CAAA,OAAAK,CAAA,CAAAI,GAAA,IAAAJ,CAAA,CAAAK,GAAA,IAAAN,CAAA,CAAAE,CAAA,EAAAN,CAAA,EAAAK,CAAA,IAAAC,CAAA,CAAAN,CAAA,IAAAH,CAAA,CAAAG,CAAA,WAAAM,CAAA,KAAAT,CAAA,EAAAG,CAAA;AAelF,MAAMgB,KAAqB,GAAGA,CAAC;EAC3BC,KAAK;EACLC,UAAU;EACVC,IAAI;EACJC,mBAAmB;EACnBC,uBAAuB;EACvBC,QAAQ;EACRC,uBAAuB;EACvBC,YAAY;EACZC,KAAK;EACLC;AACJ,CAAC,KAAK;EACF,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAG,IAAAC,gBAAQ,EAAC,KAAK,CAAC;EAC7D,MAAM,CAACC,4BAA4B,EAAEC,+BAA+B,CAAC,GAAG,IAAAF,gBAAQ,EAC5EG,0BAAe,CAACC,GACpB,CAAC;EACD,MAAM,CAACC,yBAAyB,EAAEC,4BAA4B,CAAC,GAAG,IAAAN,gBAAQ,EAAC,CAAC,CAAC;EAC7E,MAAM,CAACO,4BAA4B,EAAEC,+BAA+B,CAAC,GAAG,IAAAR,gBAAQ,EAE9E;IAAES,GAAG,EAAE;EAAE,CAAC,CAAC;EACb,MAAM,CAACC,qBAAqB,EAAEC,wBAAwB,CAAC,GAAG,IAAAX,gBAAQ,EAEhE;IAAEY,IAAI,EAAE,CAAC;IAAEH,GAAG,EAAE;EAAE,CAAC,CAAC;EAEtB,MAAMI,QAAQ,GAAG,IAAAC,cAAM,EAAiB,IAAI,CAAC;EAE7C,MAAMC,WAAW,GAAG,IAAAC,mBAAW,EAAC,MAAM;IAClCvB,QAAQ,CAACL,KAAK,CAAC;EACnB,CAAC,EAAE,CAACA,KAAK,EAAEK,QAAQ,CAAC,CAAC;EAErB,MAAMwB,sBAAsB,GAAG,IAAAD,mBAAW,EAAC,MAAM;IAC7C,IAAI,CAACH,QAAQ,CAACK,OAAO,EAAE;MACnB;IACJ;IAEA,MAAMC,OAAO,GAAGN,QAAQ,CAACK,OAAO;IAChC,MAAM;MAAEE;IAAc,CAAC,GAAGP,QAAQ,CAACK,OAAO;IAE1C,IAAIE,aAAa,EAAE;MACf,MAAM;QACFC,MAAM,EAAEC,aAAa;QACrBV,IAAI,EAAEW,WAAW;QACjBd,GAAG,EAAEe,UAAU;QACfC,KAAK,EAAEC;MACX,CAAC,GAAGP,OAAO,CAACQ,qBAAqB,CAAC,CAAC;MAEnC,MAAM;QACFN,MAAM,EAAEO,YAAY;QACpBhB,IAAI,EAAEiB,UAAU;QAChBpB,GAAG,EAAEqB,SAAS;QACdL,KAAK,EAAEM;MACX,CAAC,GAAGX,aAAa,CAACO,qBAAqB,CAAC,CAAC;MAEzC,MAAM;QAAEK;MAAU,CAAC,GAAGZ,aAAa;MAEnC,IAAIa,eAAe,GAAG9B,0BAAe,CAACC,GAAG;MACzC,IAAI8B,YAAY,GAAG,CAAC;MAEpB,IAAItB,IAAI,GACJW,WAAW,GAAGM,UAAU,GAAGM,wCAAwB,CAACV,KAAK,GAAG,CAAC,GAAGC,YAAY,GAAG,CAAC;MAEpF,IAAIjB,GAAG,GAAGe,UAAU,GAAGM,SAAS,GAAGR,aAAa,GAAGU,SAAS;MAE5D,MAAMI,OAAO,GAAGL,WAAW,GAAGI,wCAAwB,CAACV,KAAK,GAAG,EAAE;MACjE,MAAMY,OAAO,GAAG,EAAE;MAElB,IAAIzB,IAAI,GAAGyB,OAAO,EAAE;QAChBH,YAAY,GAAGtB,IAAI,GAAGyB,OAAO;QAC7BzB,IAAI,GAAGyB,OAAO;MAClB,CAAC,MAAM,IAAIzB,IAAI,GAAGwB,OAAO,EAAE;QACvBF,YAAY,GAAGtB,IAAI,GAAGwB,OAAO;QAC7BxB,IAAI,GAAGwB,OAAO;MAClB;MAEA,IAAI3B,GAAG,GAAG0B,wCAAwB,CAACd,MAAM,GAAGO,YAAY,GAAGI,SAAS,EAAE;QAClEC,eAAe,GAAG9B,0BAAe,CAACmC,MAAM;QACxC7B,GAAG,IAAIa,aAAa,GAAGa,wCAAwB,CAACd,MAAM;MAC1D;MAEA,IAAI9B,mBAAmB,EAAE;QACrBW,+BAA+B,CAAC+B,eAAe,CAAC;QAChD3B,4BAA4B,CAAC4B,YAAY,CAAC;QAC1CvB,wBAAwB,CAAC;UAAEC,IAAI;UAAEH;QAAI,CAAC,CAAC;QACvCD,+BAA+B,CAAC;UAAEC,GAAG,EAAEuB;QAAU,CAAC,CAAC;QACnDjC,kBAAkB,CAAC,IAAI,CAAC;MAC5B;IACJ;EACJ,CAAC,EAAE,CAACR,mBAAmB,CAAC,CAAC;EAEzB,MAAMgD,iBAAiB,GAAG,IAAAvB,mBAAW,EAChCwB,KAAiB,IAAK;IACnBA,KAAK,CAACC,cAAc,CAAC,CAAC;IACtBD,KAAK,CAACE,eAAe,CAAC,CAAC;IAEvB,IAAInD,mBAAmB,EAAE;MACrBI,YAAY,CAACC,KAAK,CAAC;MACnBqB,sBAAsB,CAAC,CAAC;IAC5B;EACJ,CAAC,EACD,CAACA,sBAAsB,EAAErB,KAAK,EAAEL,mBAAmB,EAAEI,YAAY,CACrE,CAAC;EAED,IAAAgD,iBAAS,EAAC,MAAM;IACZ,IACI9B,QAAQ,CAACK,OAAO,IAChBxB,uBAAuB,IACvBgB,qBAAqB,CAACD,GAAG,KAAK,CAAC,IAC/BC,qBAAqB,CAACE,IAAI,KAAK,CAAC,EAClC;MACEK,sBAAsB,CAAC,CAAC;IAC5B;EACJ,CAAC,EAAE,CACCA,sBAAsB,EACtBrB,KAAK,EACLL,mBAAmB,EACnBG,uBAAuB,EACvBgB,qBAAqB,CACxB,CAAC;EAEF,IAAAiC,iBAAS,EAAC,MAAM;IACZ,IAAIjD,uBAAuB,EAAE;MACzBK,kBAAkB,CAACL,uBAAuB,CAAC;IAC/C;EACJ,CAAC,EAAE,CAACA,uBAAuB,CAAC,CAAC;EAE7B,MAAMkD,eAAe,GAAG,IAAA5B,mBAAW,EAAC,MAAM;IACtCjB,kBAAkB,CAAC,KAAK,CAAC;EAC7B,CAAC,EAAE,EAAE,CAAC;EAEN,IAAA4C,iBAAS,EAAC,MAAM;IACZnD,uBAAuB,CAACM,eAAe,CAAC;EAC5C,CAAC,EAAE,CAACN,uBAAuB,EAAEM,eAAe,CAAC,CAAC;EAE9C,oBACIrC,OAAA,CAAAS,OAAA,CAAA2E,aAAA,CAACjF,MAAA,CAAAkF,WAAW;IACRC,GAAG,EAAElC,QAAS;IACdmC,WAAW,EAAE3D,UAAW;IACxB,cAAYD,KAAM;IAClB,aAAWE,IAAK;IAChB,0BAAwBC,mBAAoB;IAC5C0D,SAAS,EAAC,oBAAoB;IAC9BC,OAAO,EAAEnC,WAAY;IACrBoC,aAAa,EAAEZ;EAAkB,GAEhCnD,KAAK,eACN3B,OAAA,CAAAS,OAAA,CAAA2E,aAAA,CAACtF,MAAA,CAAA6F,eAAe;IAACC,OAAO,EAAE;EAAM,GAC3BvD,eAAe,iBACZrC,OAAA,CAAAS,OAAA,CAAA2E,aAAA,CAAChF,cAAA,CAAAK,OAAa;IACV+D,eAAe,EAAEhC,4BAA6B;IAC9CiC,YAAY,EAAE7B,yBAA0B;IACxCjB,KAAK,EAAEA,KAAM;IACbkE,GAAG,EAAElE,KAAM;IACXmE,WAAW,EAAEX,eAAgB;IAC7BnD,QAAQ,EAAEA,QAAS;IACnB+D,eAAe,EAAEjD,4BAA6B;IAC9CkD,QAAQ,EAAE/C,qBAAsB;IAChCb,SAAS,EAAEA;EAAU,CACxB,CAEQ,CACR,CAAC;AAEtB,CAAC;AAEDV,KAAK,CAACuE,WAAW,GAAG,OAAO;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAA1F,OAAA,GAEbiB,KAAK","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Emoji.js","names":["_react","require","_react2","_interopRequireWildcard","_alignment","_Emoji","_SkinTonePopup","_interopRequireDefault","_SkinTonePopup2","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","Emoji","emoji","isSelected","name","isSkinToneSupported","onPopupVisibilityChange","onSelect","shouldShowSkinTonePopup","onRightClick","index","emojiList","shouldShowPopup","setShouldShowPopup","useState","skinTonePopupAnchorAlignment","setSkinTonePopupAnchorAlignment","AnchorAlignment","Top","skinTonePopupAnchorOffset","setSkinTonePopupAnchorOffset","skinTonePopupOverlayPosition","setSkinTonePopupOverlayPosition","top","skinTonePopupPosition","setSkinTonePopupPosition","left","emojiRef","useRef","handleClick","useCallback","calculatePopupPosition","current","element","parentElement","height","elementHeight","elementLeft","elementTop","width","elementWidth","getBoundingClientRect","parentHeight","parentLeft","parentTop","parentWidth","scrollTop","anchorAlignment","anchorOffset","skinTonePopupContentSize","maxLeft","minLeft","Bottom","handleContextMenu","event","preventDefault","stopPropagation","useEffect","handleHidePopup","createElement","StyledEmoji","ref","$isSelected","tabIndex","className","onClick","onContextMenu","AnimatePresence","initial","key","onHidePopup","overlayPosition","position","displayName","_default","exports"],"sources":["../../../../../../src/components/emoji-picker/emoji-picker-emojis/emoji/Emoji.tsx"],"sourcesContent":["import { AnimatePresence } from 'motion/react';\nimport React, { FC, MouseEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { AnchorAlignment } from '../../../../constants/alignment';\nimport { StyledEmoji } from './Emoji.styles';\nimport SkinTonePopup, { SkinTonePopupProps } from './skin-tone-popup/SkinTonePopup';\nimport { skinTonePopupContentSize } from './skin-tone-popup/SkinTonePopup.styles';\n\nexport type EmojiProps = {\n emoji: string;\n isSelected: boolean;\n name: string;\n index: number;\n isSkinToneSupported: boolean;\n onPopupVisibilityChange: (isVisible: boolean) => void;\n onSelect: (emoji: string) => void;\n onRightClick: (newIndex: number) => void;\n shouldShowSkinTonePopup: boolean;\n emojiList: { [x: string]: { skin_tone_support: any } };\n};\n\nconst Emoji: FC<EmojiProps> = ({\n emoji,\n isSelected,\n name,\n isSkinToneSupported,\n onPopupVisibilityChange,\n onSelect,\n shouldShowSkinTonePopup,\n onRightClick,\n index,\n emojiList,\n}) => {\n const [shouldShowPopup, setShouldShowPopup] = useState(false);\n const [skinTonePopupAnchorAlignment, setSkinTonePopupAnchorAlignment] = useState(\n AnchorAlignment.Top,\n );\n const [skinTonePopupAnchorOffset, setSkinTonePopupAnchorOffset] = useState(0);\n const [skinTonePopupOverlayPosition, setSkinTonePopupOverlayPosition] = useState<\n SkinTonePopupProps['overlayPosition']\n >({ top: 0 });\n const [skinTonePopupPosition, setSkinTonePopupPosition] = useState<\n SkinTonePopupProps['position']\n >({ left: 0, top: 0 });\n\n const emojiRef = useRef<HTMLDivElement>(null);\n\n const handleClick = useCallback(() => {\n onSelect(emoji);\n }, [emoji, onSelect]);\n\n const calculatePopupPosition = useCallback(() => {\n if (!emojiRef.current) {\n return;\n }\n\n const element = emojiRef.current;\n const { parentElement } = emojiRef.current;\n\n if (parentElement) {\n const {\n height: elementHeight,\n left: elementLeft,\n top: elementTop,\n width: elementWidth,\n } = element.getBoundingClientRect();\n\n const {\n height: parentHeight,\n left: parentLeft,\n top: parentTop,\n width: parentWidth,\n } = parentElement.getBoundingClientRect();\n\n const { scrollTop } = parentElement;\n\n let anchorAlignment = AnchorAlignment.Top;\n let anchorOffset = 0;\n\n let left =\n elementLeft - parentLeft - skinTonePopupContentSize.width / 2 + elementWidth / 2;\n\n let top = elementTop - parentTop + elementHeight + scrollTop;\n\n const maxLeft = parentWidth - skinTonePopupContentSize.width - 12;\n const minLeft = 12;\n\n if (left < minLeft) {\n anchorOffset = left - minLeft;\n left = minLeft;\n } else if (left > maxLeft) {\n anchorOffset = left - maxLeft;\n left = maxLeft;\n }\n\n if (top + skinTonePopupContentSize.height > parentHeight + scrollTop) {\n anchorAlignment = AnchorAlignment.Bottom;\n top -= elementHeight + skinTonePopupContentSize.height;\n }\n\n if (isSkinToneSupported) {\n setSkinTonePopupAnchorAlignment(anchorAlignment);\n setSkinTonePopupAnchorOffset(anchorOffset);\n setSkinTonePopupPosition({ left, top });\n setSkinTonePopupOverlayPosition({ top: scrollTop });\n setShouldShowPopup(true);\n }\n }\n }, [isSkinToneSupported]);\n\n const handleContextMenu = useCallback(\n (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (isSkinToneSupported) {\n onRightClick(index);\n calculatePopupPosition();\n }\n },\n [calculatePopupPosition, index, isSkinToneSupported, onRightClick],\n );\n\n useEffect(() => {\n if (\n emojiRef.current &&\n shouldShowSkinTonePopup &&\n skinTonePopupPosition.top === 0 &&\n skinTonePopupPosition.left === 0\n ) {\n calculatePopupPosition();\n }\n }, [\n calculatePopupPosition,\n index,\n isSkinToneSupported,\n shouldShowSkinTonePopup,\n skinTonePopupPosition,\n ]);\n\n useEffect(() => {\n if (shouldShowSkinTonePopup) {\n setShouldShowPopup(shouldShowSkinTonePopup);\n }\n }, [shouldShowSkinTonePopup]);\n\n const handleHidePopup = useCallback(() => {\n setShouldShowPopup(false);\n }, []);\n\n useEffect(() => {\n onPopupVisibilityChange(shouldShowPopup);\n }, [onPopupVisibilityChange, shouldShowPopup]);\n\n return (\n <StyledEmoji\n ref={emojiRef}\n $isSelected={isSelected}\n tabIndex={isSelected ? 0 : -1}\n data-emoji={emoji}\n data-name={name}\n data-skin-tone-support={isSkinToneSupported}\n className=\"prevent-lose-focus\"\n onClick={handleClick}\n onContextMenu={handleContextMenu}\n >\n {emoji}\n <AnimatePresence initial={false}>\n {shouldShowPopup && (\n <SkinTonePopup\n anchorAlignment={skinTonePopupAnchorAlignment}\n anchorOffset={skinTonePopupAnchorOffset}\n emoji={emoji}\n key={emoji}\n onHidePopup={handleHidePopup}\n onSelect={onSelect}\n overlayPosition={skinTonePopupOverlayPosition}\n position={skinTonePopupPosition}\n emojiList={emojiList}\n />\n )}\n </AnimatePresence>\n </StyledEmoji>\n );\n};\n\nEmoji.displayName = 'Emoji';\n\nexport default Emoji;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _core = require("@chayns-components/core");
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _Emoji = _interopRequireDefault(require("../emoji/Emoji"));
|
|
10
|
+
var _EmojiPickerEmojis = require("../EmojiPickerEmojis.styles");
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
13
|
+
const EMOJIS_PER_ROW = 6;
|
|
14
|
+
const EmojiPickerEmojiList = ({
|
|
15
|
+
emojis,
|
|
16
|
+
emojiList,
|
|
17
|
+
isHistory,
|
|
18
|
+
onSelect
|
|
19
|
+
}) => {
|
|
20
|
+
const [shouldPreventListener, ref] = (0, _core.useIsMeasuredClone)();
|
|
21
|
+
const [focusedIndex, setFocusedIndex] = (0, _react.useState)(0);
|
|
22
|
+
const [shouldShowSkinTonePopup, setShouldShowSkinTonePopup] = (0, _react.useState)(false);
|
|
23
|
+
const emojiRef = (0, _react.useRef)(null);
|
|
24
|
+
const shouldPreventEmojiControlsRef = (0, _react.useRef)(false);
|
|
25
|
+
const combinedRef = (0, _core.useCombinedRefs)(emojiRef, ref);
|
|
26
|
+
const handlePopupVisibilityChange = (0, _react.useCallback)(isVisible => {
|
|
27
|
+
setShouldShowSkinTonePopup(isVisible);
|
|
28
|
+
shouldPreventEmojiControlsRef.current = isVisible;
|
|
29
|
+
}, []);
|
|
30
|
+
const handleSelect = (0, _react.useCallback)((emoji, index, shouldRestoreInputFocus = false) => {
|
|
31
|
+
setFocusedIndex(index);
|
|
32
|
+
onSelect(emoji, shouldRestoreInputFocus);
|
|
33
|
+
}, [onSelect]);
|
|
34
|
+
(0, _react.useEffect)(() => {
|
|
35
|
+
const handleKeyDown = event => {
|
|
36
|
+
if (shouldPreventListener || shouldPreventEmojiControlsRef.current) return;
|
|
37
|
+
const isArrowKey = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key);
|
|
38
|
+
if (!isArrowKey && event.key !== 'Enter') return;
|
|
39
|
+
const container = emojiRef.current;
|
|
40
|
+
const elements = container === null || container === void 0 ? void 0 : container.querySelectorAll(':scope > [data-emoji]');
|
|
41
|
+
const currentElement = elements === null || elements === void 0 ? void 0 : elements[focusedIndex];
|
|
42
|
+
if (event.key === 'Enter') {
|
|
43
|
+
if (!currentElement) return;
|
|
44
|
+
const {
|
|
45
|
+
emoji,
|
|
46
|
+
name,
|
|
47
|
+
skinToneSupport
|
|
48
|
+
} = currentElement.dataset;
|
|
49
|
+
if (!emoji || !name || !skinToneSupport) return;
|
|
50
|
+
if (event.ctrlKey) {
|
|
51
|
+
if (skinToneSupport === 'true') handlePopupVisibilityChange(true);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
handleSelect({
|
|
55
|
+
emoji,
|
|
56
|
+
name,
|
|
57
|
+
skin_tone_support: skinToneSupport === 'true'
|
|
58
|
+
}, focusedIndex, true);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
event.preventDefault();
|
|
62
|
+
if (event.ctrlKey || !container || !(elements !== null && elements !== void 0 && elements.length)) return;
|
|
63
|
+
let newIndex = currentElement ? focusedIndex : 0;
|
|
64
|
+
if (event.key === 'ArrowUp') newIndex = (newIndex - EMOJIS_PER_ROW) % elements.length;else if (event.key === 'ArrowDown') newIndex = (newIndex + EMOJIS_PER_ROW) % elements.length;else if (event.key === 'ArrowLeft') newIndex = (newIndex - 1) % elements.length;else newIndex = (newIndex + 1) % elements.length;
|
|
65
|
+
if (newIndex < 0) newIndex = elements.length - 1;
|
|
66
|
+
const newElement = elements[newIndex];
|
|
67
|
+
if (!newElement) return;
|
|
68
|
+
setFocusedIndex(newIndex);
|
|
69
|
+
const containerRect = container.getBoundingClientRect();
|
|
70
|
+
const elementRect = newElement.getBoundingClientRect();
|
|
71
|
+
if (elementRect.bottom > containerRect.bottom) {
|
|
72
|
+
container.scrollTop += elementRect.bottom - containerRect.bottom;
|
|
73
|
+
} else if (elementRect.top < containerRect.top) {
|
|
74
|
+
container.scrollTop -= containerRect.top - elementRect.top;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
78
|
+
return () => document.removeEventListener('keydown', handleKeyDown);
|
|
79
|
+
}, [focusedIndex, handlePopupVisibilityChange, handleSelect, shouldPreventListener]);
|
|
80
|
+
const shouldShowNoContentInfo = emojis.length === 0;
|
|
81
|
+
return /*#__PURE__*/_react.default.createElement(_EmojiPickerEmojis.StyledEmojiPickerEmojis, {
|
|
82
|
+
className: "chayns-scrollbar",
|
|
83
|
+
$shouldPreventScroll: shouldShowSkinTonePopup,
|
|
84
|
+
$shouldShowNoContentInfo: shouldShowNoContentInfo,
|
|
85
|
+
ref: combinedRef
|
|
86
|
+
}, emojis.map(({
|
|
87
|
+
emoji,
|
|
88
|
+
name,
|
|
89
|
+
skin_tone_support
|
|
90
|
+
}, index) => /*#__PURE__*/_react.default.createElement(_Emoji.default, {
|
|
91
|
+
key: emoji,
|
|
92
|
+
emoji: emoji,
|
|
93
|
+
name: name,
|
|
94
|
+
index: index,
|
|
95
|
+
isSelected: index === focusedIndex,
|
|
96
|
+
isSkinToneSupported: !isHistory && skin_tone_support,
|
|
97
|
+
shouldShowSkinTonePopup: index === focusedIndex && !isHistory && skin_tone_support && shouldShowSkinTonePopup,
|
|
98
|
+
onRightClick: setFocusedIndex,
|
|
99
|
+
onPopupVisibilityChange: handlePopupVisibilityChange,
|
|
100
|
+
onSelect: selectedEmoji => handleSelect({
|
|
101
|
+
emoji: selectedEmoji,
|
|
102
|
+
name,
|
|
103
|
+
skin_tone_support
|
|
104
|
+
}, index),
|
|
105
|
+
emojiList: emojiList
|
|
106
|
+
})), shouldShowNoContentInfo && /*#__PURE__*/_react.default.createElement(_EmojiPickerEmojis.StyledEmojiPickerEmojisNoContentInfo, null, "Hier werden die zuletzt verwendeten Emojis angezeigt, die \xFCber diese Auswahl gew\xE4hlt wurden."));
|
|
107
|
+
};
|
|
108
|
+
var _default = exports.default = EmojiPickerEmojiList;
|
|
109
|
+
//# sourceMappingURL=EmojiPickerEmojiList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmojiPickerEmojiList.js","names":["_core","require","_react","_interopRequireWildcard","_Emoji","_interopRequireDefault","_EmojiPickerEmojis","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","EMOJIS_PER_ROW","EmojiPickerEmojiList","emojis","emojiList","isHistory","onSelect","shouldPreventListener","ref","useIsMeasuredClone","focusedIndex","setFocusedIndex","useState","shouldShowSkinTonePopup","setShouldShowSkinTonePopup","emojiRef","useRef","shouldPreventEmojiControlsRef","combinedRef","useCombinedRefs","handlePopupVisibilityChange","useCallback","isVisible","current","handleSelect","emoji","index","shouldRestoreInputFocus","useEffect","handleKeyDown","event","isArrowKey","includes","key","container","elements","querySelectorAll","currentElement","name","skinToneSupport","dataset","ctrlKey","skin_tone_support","preventDefault","length","newIndex","newElement","containerRect","getBoundingClientRect","elementRect","bottom","scrollTop","top","document","addEventListener","removeEventListener","shouldShowNoContentInfo","createElement","StyledEmojiPickerEmojis","className","$shouldPreventScroll","$shouldShowNoContentInfo","map","isSelected","isSkinToneSupported","onRightClick","onPopupVisibilityChange","selectedEmoji","StyledEmojiPickerEmojisNoContentInfo","_default","exports"],"sources":["../../../../../../src/components/emoji-picker/emoji-picker-emojis/emoji-picker-emoji-list/EmojiPickerEmojiList.tsx"],"sourcesContent":["import { useCombinedRefs, useIsMeasuredClone } from '@chayns-components/core';\nimport React, { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport Emoji, { type EmojiProps } from '../emoji/Emoji';\nimport {\n StyledEmojiPickerEmojis,\n StyledEmojiPickerEmojisNoContentInfo,\n} from '../EmojiPickerEmojis.styles';\n\nexport interface PickerEmoji {\n emoji: string;\n name: string;\n skin_tone_support: boolean;\n}\n\ninterface EmojiPickerEmojiListProps {\n emojis: PickerEmoji[];\n emojiList: EmojiProps['emojiList'];\n isHistory: boolean;\n onSelect: (emoji: PickerEmoji, shouldRestoreInputFocus?: boolean) => void;\n}\n\nconst EMOJIS_PER_ROW = 6;\n\nconst EmojiPickerEmojiList: FC<EmojiPickerEmojiListProps> = ({\n emojis,\n emojiList,\n isHistory,\n onSelect,\n}) => {\n const [shouldPreventListener, ref] = useIsMeasuredClone<HTMLDivElement>();\n const [focusedIndex, setFocusedIndex] = useState(0);\n const [shouldShowSkinTonePopup, setShouldShowSkinTonePopup] = useState(false);\n const emojiRef = useRef<HTMLDivElement>(null);\n const shouldPreventEmojiControlsRef = useRef(false);\n const combinedRef = useCombinedRefs(emojiRef, ref);\n\n const handlePopupVisibilityChange = useCallback((isVisible: boolean) => {\n setShouldShowSkinTonePopup(isVisible);\n shouldPreventEmojiControlsRef.current = isVisible;\n }, []);\n\n const handleSelect = useCallback(\n (emoji: PickerEmoji, index: number, shouldRestoreInputFocus = false) => {\n setFocusedIndex(index);\n onSelect(emoji, shouldRestoreInputFocus);\n },\n [onSelect],\n );\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (shouldPreventListener || shouldPreventEmojiControlsRef.current) return;\n\n const isArrowKey = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(\n event.key,\n );\n if (!isArrowKey && event.key !== 'Enter') return;\n\n const container = emojiRef.current;\n const elements = container?.querySelectorAll<HTMLDivElement>(':scope > [data-emoji]');\n const currentElement = elements?.[focusedIndex];\n\n if (event.key === 'Enter') {\n if (!currentElement) return;\n\n const { emoji, name, skinToneSupport } = currentElement.dataset;\n if (!emoji || !name || !skinToneSupport) return;\n\n if (event.ctrlKey) {\n if (skinToneSupport === 'true') handlePopupVisibilityChange(true);\n return;\n }\n\n handleSelect(\n { emoji, name, skin_tone_support: skinToneSupport === 'true' },\n focusedIndex,\n true,\n );\n return;\n }\n\n event.preventDefault();\n if (event.ctrlKey || !container || !elements?.length) return;\n\n let newIndex = currentElement ? focusedIndex : 0;\n if (event.key === 'ArrowUp') newIndex = (newIndex - EMOJIS_PER_ROW) % elements.length;\n else if (event.key === 'ArrowDown')\n newIndex = (newIndex + EMOJIS_PER_ROW) % elements.length;\n else if (event.key === 'ArrowLeft') newIndex = (newIndex - 1) % elements.length;\n else newIndex = (newIndex + 1) % elements.length;\n\n if (newIndex < 0) newIndex = elements.length - 1;\n\n const newElement = elements[newIndex];\n if (!newElement) return;\n\n setFocusedIndex(newIndex);\n\n const containerRect = container.getBoundingClientRect();\n const elementRect = newElement.getBoundingClientRect();\n\n if (elementRect.bottom > containerRect.bottom) {\n container.scrollTop += elementRect.bottom - containerRect.bottom;\n } else if (elementRect.top < containerRect.top) {\n container.scrollTop -= containerRect.top - elementRect.top;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [focusedIndex, handlePopupVisibilityChange, handleSelect, shouldPreventListener]);\n\n const shouldShowNoContentInfo = emojis.length === 0;\n\n return (\n <StyledEmojiPickerEmojis\n className=\"chayns-scrollbar\"\n $shouldPreventScroll={shouldShowSkinTonePopup}\n $shouldShowNoContentInfo={shouldShowNoContentInfo}\n ref={combinedRef}\n >\n {emojis.map(({ emoji, name, skin_tone_support }, index) => (\n <Emoji\n key={emoji}\n emoji={emoji}\n name={name}\n index={index}\n isSelected={index === focusedIndex}\n isSkinToneSupported={!isHistory && skin_tone_support}\n shouldShowSkinTonePopup={\n index === focusedIndex &&\n !isHistory &&\n skin_tone_support &&\n shouldShowSkinTonePopup\n }\n onRightClick={setFocusedIndex}\n onPopupVisibilityChange={handlePopupVisibilityChange}\n onSelect={(selectedEmoji) =>\n handleSelect({ emoji: selectedEmoji, name, skin_tone_support }, index)\n }\n emojiList={emojiList}\n />\n ))}\n {shouldShowNoContentInfo && (\n <StyledEmojiPickerEmojisNoContentInfo>\n Hier werden die zuletzt verwendeten Emojis angezeigt, die ΓΌber diese Auswahl\n gewΓ€hlt wurden.\n </StyledEmojiPickerEmojisNoContentInfo>\n )}\n </StyledEmojiPickerEmojis>\n );\n};\n\nexport default EmojiPickerEmojiList;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, mkdtempSync, readFileSync, readdirSync, rmSync } from 'node:fs';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { dirname, join, relative } from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { expect, it } from 'vitest';
|
|
8
|
+
it('emits the public type entry at the declared package path without test declarations', () => {
|
|
9
|
+
const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '..');
|
|
10
|
+
const {
|
|
11
|
+
types
|
|
12
|
+
} = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'));
|
|
13
|
+
const outputDirectory = mkdtempSync(join(tmpdir(), 'emoji-input-types-'));
|
|
14
|
+
try {
|
|
15
|
+
execFileSync(process.execPath, [createRequire(import.meta.url).resolve('typescript/bin/tsc'), '--project', join(packageRoot, 'tsconfig.json'), '--outDir', outputDirectory], {
|
|
16
|
+
timeout: 25_000,
|
|
17
|
+
stdio: 'pipe'
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// A fresh output directory prevents old declarations from hiding a changed emit layout.
|
|
21
|
+
expect(existsSync(join(outputDirectory, relative('lib/types', types)))).toBe(true);
|
|
22
|
+
expect(readdirSync(outputDirectory, {
|
|
23
|
+
recursive: true
|
|
24
|
+
}).filter(file => file.toString().endsWith('.test.d.ts'))).toEqual([]);
|
|
25
|
+
} finally {
|
|
26
|
+
rmSync(outputDirectory, {
|
|
27
|
+
recursive: true,
|
|
28
|
+
force: true
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}, 30_000);
|
|
32
|
+
//# sourceMappingURL=build.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.test.js","names":["execFileSync","existsSync","mkdtempSync","readFileSync","readdirSync","rmSync","createRequire","tmpdir","dirname","join","relative","fileURLToPath","expect","it","packageRoot","import","meta","url","types","JSON","parse","outputDirectory","process","execPath","resolve","timeout","stdio","toBe","recursive","filter","file","toString","endsWith","toEqual","force"],"sources":["../../src/build.test.ts"],"sourcesContent":["import { execFileSync } from 'node:child_process';\nimport { existsSync, mkdtempSync, readFileSync, readdirSync, rmSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { tmpdir } from 'node:os';\nimport { dirname, join, relative } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { expect, it } from 'vitest';\n\nit('emits the public type entry at the declared package path without test declarations', () => {\n const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '..');\n const { types } = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8')) as {\n types: string;\n };\n const outputDirectory = mkdtempSync(join(tmpdir(), 'emoji-input-types-'));\n\n try {\n execFileSync(\n process.execPath,\n [\n createRequire(import.meta.url).resolve('typescript/bin/tsc'),\n '--project',\n join(packageRoot, 'tsconfig.json'),\n '--outDir',\n outputDirectory,\n ],\n { timeout: 25_000, stdio: 'pipe' },\n );\n\n // A fresh output directory prevents old declarations from hiding a changed emit layout.\n expect(existsSync(join(outputDirectory, relative('lib/types', types)))).toBe(true);\n expect(\n readdirSync(outputDirectory, { recursive: true }).filter((file) =>\n file.toString().endsWith('.test.d.ts'),\n ),\n ).toEqual([]);\n } finally {\n rmSync(outputDirectory, { recursive: true, force: true });\n }\n}, 30_000);\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,oBAAoB;AACjD,SAASC,UAAU,EAAEC,WAAW,EAAEC,YAAY,EAAEC,WAAW,EAAEC,MAAM,QAAQ,SAAS;AACpF,SAASC,aAAa,QAAQ,aAAa;AAC3C,SAASC,MAAM,QAAQ,SAAS;AAChC,SAASC,OAAO,EAAEC,IAAI,EAAEC,QAAQ,QAAQ,WAAW;AACnD,SAASC,aAAa,QAAQ,UAAU;AACxC,SAASC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAEnCA,EAAE,CAAC,oFAAoF,EAAE,MAAM;EAC3F,MAAMC,WAAW,GAAGL,IAAI,CAACD,OAAO,CAACG,aAAa,CAACI,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;EACvE,MAAM;IAAEC;EAAM,CAAC,GAAGC,IAAI,CAACC,KAAK,CAACjB,YAAY,CAACM,IAAI,CAACK,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAEnF;EACD,MAAMO,eAAe,GAAGnB,WAAW,CAACO,IAAI,CAACF,MAAM,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;EAEzE,IAAI;IACAP,YAAY,CACRsB,OAAO,CAACC,QAAQ,EAChB,CACIjB,aAAa,CAACS,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC,CAACO,OAAO,CAAC,oBAAoB,CAAC,EAC5D,WAAW,EACXf,IAAI,CAACK,WAAW,EAAE,eAAe,CAAC,EAClC,UAAU,EACVO,eAAe,CAClB,EACD;MAAEI,OAAO,EAAE,MAAM;MAAEC,KAAK,EAAE;IAAO,CACrC,CAAC;;IAED;IACAd,MAAM,CAACX,UAAU,CAACQ,IAAI,CAACY,eAAe,EAAEX,QAAQ,CAAC,WAAW,EAAEQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAACS,IAAI,CAAC,IAAI,CAAC;IAClFf,MAAM,CACFR,WAAW,CAACiB,eAAe,EAAE;MAAEO,SAAS,EAAE;IAAK,CAAC,CAAC,CAACC,MAAM,CAAEC,IAAI,IAC1DA,IAAI,CAACC,QAAQ,CAAC,CAAC,CAACC,QAAQ,CAAC,YAAY,CACzC,CACJ,CAAC,CAACC,OAAO,CAAC,EAAE,CAAC;EACjB,CAAC,SAAS;IACN5B,MAAM,CAACgB,eAAe,EAAE;MAAEO,SAAS,EAAE,IAAI;MAAEM,KAAK,EAAE;IAAK,CAAC,CAAC;EAC7D;AACJ,CAAC,EAAE,MAAM,CAAC","ignoreList":[]}
|