@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.
Files changed (26) hide show
  1. package/lib/cjs/build.test.js +34 -0
  2. package/lib/cjs/build.test.js.map +1 -0
  3. package/lib/cjs/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.js +48 -219
  4. package/lib/cjs/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.js.map +1 -1
  5. package/lib/cjs/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.test.js +316 -0
  6. package/lib/cjs/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.test.js.map +1 -0
  7. package/lib/cjs/components/emoji-picker/emoji-picker-emojis/emoji/Emoji.js +1 -0
  8. package/lib/cjs/components/emoji-picker/emoji-picker-emojis/emoji/Emoji.js.map +1 -1
  9. package/lib/cjs/components/emoji-picker/emoji-picker-emojis/emoji-picker-emoji-list/EmojiPickerEmojiList.js +109 -0
  10. package/lib/cjs/components/emoji-picker/emoji-picker-emojis/emoji-picker-emoji-list/EmojiPickerEmojiList.js.map +1 -0
  11. package/lib/esm/build.test.js +32 -0
  12. package/lib/esm/build.test.js.map +1 -0
  13. package/lib/esm/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.js +47 -218
  14. package/lib/esm/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.js.map +1 -1
  15. package/lib/esm/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.test.js +312 -0
  16. package/lib/esm/components/emoji-picker/emoji-picker-emojis/EmojiPickerEmojis.test.js.map +1 -0
  17. package/lib/esm/components/emoji-picker/emoji-picker-emojis/emoji/Emoji.js +1 -0
  18. package/lib/esm/components/emoji-picker/emoji-picker-emojis/emoji/Emoji.js.map +1 -1
  19. package/lib/esm/components/emoji-picker/emoji-picker-emojis/emoji-picker-emoji-list/EmojiPickerEmojiList.js +101 -0
  20. package/lib/esm/components/emoji-picker/emoji-picker-emojis/emoji-picker-emoji-list/EmojiPickerEmojiList.js.map +1 -0
  21. package/lib/types/components/emoji-picker/emoji-picker-emojis/emoji-picker-emoji-list/EmojiPickerEmojiList.d.ts +15 -0
  22. package/package.json +3 -3
  23. package/lib/types/components/emoji-input/EmojiInput.test.d.ts +0 -1
  24. package/lib/types/utils/emoji.test.d.ts +0 -1
  25. package/lib/types/utils/selection.test.d.ts +0 -1
  26. 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":"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","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":[]}