@dialpad/dialtone-vue 3.69.3 → 3.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/emoji.js CHANGED
@@ -1,7 +1,7 @@
1
- import { _ as N, s as Q, D as B, H as W, J as X, a6 as k, t as Y } from "./emoji_text_wrapper-a6cf0407.js";
2
- import { x as Je, w as Ge, ao as Ke, a9 as Qe, a8 as We, ad as Xe, ab as Ye, ac as Ze, aa as et, ae as tt, a7 as lt, aq as ot, ar as st, ap as nt, af as at, aj as it, ai as rt, ah as ct, ag as ut, al as dt, an as mt, am as bt, ak as _t } from "./emoji_text_wrapper-a6cf0407.js";
3
- import { openBlock as i, createElementBlock as d, createVNode as T, createSlots as Z, withCtx as F, createElementVNode as v, computed as D, ref as f, toRefs as ee, watch as w, Fragment as U, renderList as R, unref as h, createBlock as te, withModifiers as le, nextTick as oe, onMounted as se, onUnmounted as ne, toDisplayString as A, withDirectives as M, createCommentVNode as O, vShow as x, watchEffect as ae, normalizeClass as ie, createTextVNode as P } from "vue";
4
- const re = { class: "d-emoji-picker__search d-emoji-picker__alignment" }, ce = { class: "d-emoji-picker__search-button" }, ue = {
1
+ import { _ as W, s as be, D as Q, J as he, K as pe, a7 as I, t as ge } from "./emoji_text_wrapper-2d0e6363.js";
2
+ import { y as ft, w as dt, ap as mt, aa as vt, a9 as bt, ae as ht, ac as pt, ad as gt, ab as yt, af as kt, a8 as _t, ar as jt, as as St, aq as $t, ag as wt, ak as Tt, aj as Rt, ai as Et, ah as Lt, am as Ft, ao as Ct, an as It, al as At } from "./emoji_text_wrapper-2d0e6363.js";
3
+ import { ref as y, onMounted as te, openBlock as j, createElementBlock as S, createVNode as K, withKeys as q, withModifiers as oe, createSlots as ye, withCtx as B, createElementVNode as T, computed as V, toRefs as ke, watch as N, Fragment as M, renderList as O, unref as $, createBlock as _e, nextTick as G, onUnmounted as je, toDisplayString as P, withDirectives as X, createCommentVNode as Y, vShow as Z, normalizeClass as le, watchEffect as Se, createTextVNode as se } from "vue";
4
+ const $e = { class: "d-emoji-picker__search d-emoji-picker__alignment" }, we = ["onKeydown"], Te = {
5
5
  __name: "emoji_search",
6
6
  props: {
7
7
  searchPlaceholderLabel: {
@@ -13,36 +13,55 @@ const re = { class: "d-emoji-picker__search d-emoji-picker__alignment" }, ce = {
13
13
  default: ""
14
14
  }
15
15
  },
16
- emits: ["update:modelValue"],
17
- setup(e) {
18
- return (_, l) => (i(), d("div", re, [
19
- T(Q, {
20
- placeholder: e.searchPlaceholderLabel,
21
- "model-value": e.modelValue,
22
- "onUpdate:modelValue": l[1] || (l[1] = (s) => _.$emit("update:modelValue", s))
23
- }, Z({
24
- leftIcon: F(() => [
25
- T(B, { name: "search" })
16
+ emits: ["update:modelValue", "focus-emoji-selector", "focus-tabset", "select-first-emoji"],
17
+ setup(i, { expose: v, emit: d }) {
18
+ const s = y(null);
19
+ function u() {
20
+ d("update:modelValue", ""), h();
21
+ }
22
+ function h() {
23
+ s.value.focus();
24
+ }
25
+ return te(() => {
26
+ h();
27
+ }), v({
28
+ focusSearchInput: h
29
+ }), (g, p) => (j(), S("div", $e, [
30
+ K(be, {
31
+ ref_key: "searchInput",
32
+ ref: s,
33
+ placeholder: i.searchPlaceholderLabel,
34
+ "model-value": i.modelValue,
35
+ "onUpdate:modelValue": p[0] || (p[0] = (c) => g.$emit("update:modelValue", c)),
36
+ onKeydown: [
37
+ p[1] || (p[1] = q((c) => g.$emit("focus-tabset"), ["up"])),
38
+ p[2] || (p[2] = q(oe((c) => g.$emit("focus-emoji-selector"), ["prevent"]), ["down"])),
39
+ p[3] || (p[3] = q((c) => g.$emit("select-first-emoji"), ["enter"]))
40
+ ]
41
+ }, ye({
42
+ leftIcon: B(() => [
43
+ K(Q, { name: "search" })
26
44
  ]),
27
45
  _: 2
28
46
  }, [
29
- e.modelValue.length > 0 ? {
47
+ i.modelValue.length > 0 ? {
30
48
  name: "rightIcon",
31
- fn: F(() => [
32
- v("button", ce, [
33
- T(B, {
34
- name: "close",
35
- onClick: l[0] || (l[0] = (s) => _.$emit("update:modelValue", ""))
36
- })
37
- ])
49
+ fn: B(() => [
50
+ T("button", {
51
+ class: "d-emoji-picker__search-button",
52
+ onClick: u,
53
+ onKeydown: q(u, ["enter"])
54
+ }, [
55
+ K(Q, { name: "close" })
56
+ ], 40, we)
38
57
  ]),
39
58
  key: "0"
40
59
  } : void 0
41
60
  ]), 1032, ["placeholder", "model-value"])
42
61
  ]));
43
62
  }
44
- }, de = /* @__PURE__ */ N(ue, [["__scopeId", "data-v-20dd73b1"]]);
45
- const me = { class: "d-emoji-picker__tabset" }, be = {
63
+ }, Re = /* @__PURE__ */ W(Te, [["__scopeId", "data-v-2576719b"]]);
64
+ const Ee = { class: "d-emoji-picker__tabset" }, Le = {
46
65
  __name: "emoji_tabset",
47
66
  props: {
48
67
  /**
@@ -82,10 +101,11 @@ const me = { class: "d-emoji-picker__tabset" }, be = {
82
101
  * @event selected-tabset
83
102
  * @param {String} tabId - The name of the tab that was selected
84
103
  */
85
- "selected-tabset"
104
+ "selected-tabset",
105
+ "focus-search-input"
86
106
  ],
87
- setup(e, { emit: _ }) {
88
- const l = e, s = [
107
+ setup(i, { expose: v, emit: d }) {
108
+ const s = i, u = [
89
109
  { label: "Recently used", icon: "clock" },
90
110
  { label: "Smiley’s and people", icon: "satisfied" },
91
111
  { label: "Nature", icon: "living-thing" },
@@ -95,61 +115,124 @@ const me = { class: "d-emoji-picker__tabset" }, be = {
95
115
  { label: "Objects", icon: "lightbulb" },
96
116
  { label: "Symbols", icon: "heart" },
97
117
  { label: "Flags", icon: "flag" }
98
- ], b = D(() => (l.showRecentlyUsedTab ? s : s.slice(1)).map(($, p) => ({
99
- ...$,
100
- label: l.tabsetLabels[p],
101
- id: (p + 1).toString(),
102
- panelId: (p + 1).toString()
103
- }))), r = D(() => l.emojiFilter.length > 0), g = f("1"), { isScrolling: c } = ee(l);
104
- w(
105
- () => l.scrollIntoTab,
118
+ ], h = V(() => (s.showRecentlyUsedTab ? u : u.slice(1)).map((t, n) => ({
119
+ ...t,
120
+ label: s.tabsetLabels[n],
121
+ id: (n + 1).toString(),
122
+ panelId: (n + 1).toString()
123
+ }))), g = V(() => s.emojiFilter.length > 0), p = y("1"), { isScrolling: c } = ke(s), A = y([]);
124
+ N(
125
+ () => s.scrollIntoTab,
106
126
  () => {
107
- !c.value && !r.value && (g.value = (l.scrollIntoTab + 1).toString());
127
+ !c.value && !g.value && (p.value = (s.scrollIntoTab + 1).toString());
108
128
  }
109
- ), w(
110
- r,
129
+ ), N(
130
+ g,
111
131
  () => {
112
- r.value && (g.value = null);
132
+ g.value && (p.value = null);
113
133
  }
114
134
  );
115
- function y(u) {
116
- c.value || (g.value = u), _("selected-tabset", u);
135
+ function L(e) {
136
+ c.value || (p.value = e), d("selected-tabset", e);
137
+ }
138
+ function f(e) {
139
+ A.value.push(e.$el);
117
140
  }
118
- return (u, $) => (i(), d("div", me, [
119
- T(W, {
141
+ function F() {
142
+ A.value[0].focus();
143
+ }
144
+ function b(e, t) {
145
+ e.key === "Enter" && (L(t), A.value[t - 1].blur()), e.key === "Tab" && (e.preventDefault(), d("focus-search-input")), e.key === "ArrowDown" && d("focus-search-input");
146
+ }
147
+ return v({
148
+ focusTabset: F
149
+ }), (e, t) => (j(), S("div", Ee, [
150
+ K(he, {
120
151
  "tab-list-class": "d-emoji-picker__tabset-list",
121
- selected: g.value
152
+ selected: p.value
122
153
  }, {
123
- tabs: F(() => [
124
- (i(!0), d(U, null, R(h(b), (p) => (i(), te(X, {
125
- id: p.id,
126
- key: p.id,
127
- "panel-id": p.panelId,
128
- label: p.label,
154
+ tabs: B(() => [
155
+ (j(!0), S(M, null, O($(h), (n, w) => (j(), _e(pe, {
156
+ id: n.id,
157
+ ref_for: !0,
158
+ ref: (k) => {
159
+ k && f(k);
160
+ },
161
+ key: n.id,
162
+ "panel-id": n.panelId,
163
+ label: n.label,
129
164
  "aria-controls": "d-emoji-picker-list",
130
- onClickCapture: le((V) => y(p.id), ["stop"])
165
+ tabindex: w + 1,
166
+ onClickCapture: oe((k) => L(n.id), ["stop"]),
167
+ onKeydown: (k) => b(k, n.id)
131
168
  }, {
132
- default: F(() => [
133
- T(B, {
169
+ default: B(() => [
170
+ K(Q, {
134
171
  size: "400",
135
- name: p.icon
172
+ name: n.icon
136
173
  }, null, 8, ["name"])
137
174
  ]),
138
175
  _: 2
139
- }, 1032, ["id", "panel-id", "label", "onClickCapture"]))), 128))
176
+ }, 1032, ["id", "panel-id", "label", "tabindex", "onClickCapture", "onKeydown"]))), 128))
140
177
  ]),
141
178
  _: 1
142
179
  }, 8, ["selected"])
143
180
  ]));
144
181
  }
145
- }, q = "https://static.dialpadcdn.com/joypixels/png/unicode/32/";
146
- const _e = { class: "d-emoji-picker__selector" }, ve = {
182
+ }, z = "https://static.dialpadcdn.com/joypixels/png/unicode/32/", E = 9;
183
+ function Fe(i) {
184
+ const v = y([]), d = y([]), s = y(!1), u = y(!0);
185
+ function h(e, t = !1) {
186
+ u.value = t, i("highlighted-emoji", e);
187
+ }
188
+ function g(e, t, n) {
189
+ v.value[t] || (v.value[t] = []), v.value[t][n] = e;
190
+ }
191
+ function p(e, t) {
192
+ d.value[t] = e;
193
+ }
194
+ function c(e, t) {
195
+ var w, k, U;
196
+ const n = s.value ? (w = d.value) == null ? void 0 : w[t] : (U = (k = v.value) == null ? void 0 : k[e]) == null ? void 0 : U[t];
197
+ return n ? (n.focus(), !0) : !1;
198
+ }
199
+ function A(e, t) {
200
+ c(e, t - 1) || (v.value[e - 1] ? c(e - 1, v.value[e - 1].length - 1) : c(v.value.length - 1, v.value[v.value.length - 1].length - 1));
201
+ }
202
+ function L(e, t) {
203
+ c(e, t + 1) || c(e + 1, 0) || c(0, 0);
204
+ }
205
+ function f(e, t) {
206
+ c(0, t - 1) || c(0, d.value.length - 1);
207
+ }
208
+ function F(e, t) {
209
+ c(0, t + 1) || c(0, 0);
210
+ }
211
+ function b(e, t, n) {
212
+ s.value ? e === "left" ? f(t, n) : e === "right" && F(t, n) : e === "left" ? A(t, n) : e === "right" && L(t, n);
213
+ }
214
+ return {
215
+ emojiRefs: v,
216
+ emojiFilteredRefs: d,
217
+ isFiltering: s,
218
+ hoverFirstEmoji: u,
219
+ setEmojiRef: g,
220
+ setFilteredRef: p,
221
+ hoverEmoji: h,
222
+ focusEmoji: c,
223
+ handleHorizontalNavigation: b
224
+ };
225
+ }
226
+ const Ce = { class: "d-emoji-picker__selector" }, Ie = {
147
227
  key: 0,
148
228
  class: "d-emoji-picker__search-label d-emoji-picker__alignment"
149
- }, pe = { key: 0 }, fe = { class: "d-emoji-picker__tab" }, he = ["aria-label", "onClick", "onFocusin", "onMouseover"], ge = ["alt", "aria-label", "title", "src"], je = {
229
+ }, Ae = { key: 0 }, De = { class: "d-emoji-picker__tab" }, Ke = ["aria-label", "onClick", "onFocusin", "onMouseover", "onKeydown"], Ue = ["alt", "aria-label", "title", "src"], qe = {
150
230
  key: 2,
151
231
  class: "d-emoji-picker__alignment"
152
- }, ke = { class: "d-emoji-picker__tab" }, ye = ["aria-label", "onClick", "onFocusin", "onMouseover"], Te = ["alt", "aria-label", "title", "src"], Se = {
232
+ }, Ne = {
233
+ class: "d-emoji-picker__tab",
234
+ "data-qa": "filtered-emojis"
235
+ }, Ve = ["aria-label", "onClick", "onFocusin", "onMouseover", "onKeydown"], Be = ["alt", "aria-label", "title", "src"], Me = {
153
236
  __name: "emoji_selector",
154
237
  props: {
155
238
  /**
@@ -229,162 +312,236 @@ const _e = { class: "d-emoji-picker__selector" }, ve = {
229
312
  * @event is-scrolling
230
313
  * @param {Boolean} is-scrolling - Whether the user is scrolling with the scroll-to
231
314
  */
232
- "is-scrolling"
315
+ "is-scrolling",
316
+ /**
317
+ * Emitted when the user reach the end of the emoji list
318
+ * @event focus-skin-selector
319
+ */
320
+ "focus-skin-selector",
321
+ /**
322
+ * Emitted when the user shift tab in first tab of emoji selector
323
+ * @event focus-search-input
324
+ */
325
+ "focus-search-input"
233
326
  ],
234
- setup(e, { emit: _ }) {
235
- const l = e, s = f(null), b = f(null), r = f(null), g = ["Recently used", "People", "Nature", "Food", "Activity", "Travel", "Objects", "Symbols", "Flags"], c = D(() => l.recentlyUsedEmojis.length ? l.tabsetLabels.map((t) => ({ label: t, ref: f(null) })) : l.tabsetLabels.slice(1).map((t) => ({ label: t, ref: f(null) }))), y = f(c.value[0].label), u = D(() => l.recentlyUsedEmojis.length ? g : g.slice(1)), $ = f([]), p = D(() => [
236
- ...k[`People${l.skinTone}`],
237
- ...k.Nature,
238
- ...k.Food,
239
- ...k[`Activity${l.skinTone}`],
240
- ...k.Travel,
241
- ...k[`Objects${l.skinTone}`],
242
- ...k.Symbols,
243
- ...k.Flags
244
- ]), V = E(() => {
245
- j();
327
+ setup(i, { expose: v, emit: d }) {
328
+ const s = i, {
329
+ emojiRefs: u,
330
+ emojiFilteredRefs: h,
331
+ isFiltering: g,
332
+ hoverFirstEmoji: p,
333
+ setEmojiRef: c,
334
+ setFilteredRef: A,
335
+ hoverEmoji: L,
336
+ focusEmoji: f,
337
+ handleHorizontalNavigation: F
338
+ } = Fe(d), b = y(null), e = y(null), t = y(null), n = ["Recently used", "People", "Nature", "Food", "Activity", "Travel", "Objects", "Symbols", "Flags"], w = V(() => s.recentlyUsedEmojis.length ? s.tabsetLabels.map((o) => ({ label: o, ref: y(null) })) : s.tabsetLabels.slice(1).map((o) => ({ label: o, ref: y(null) }))), k = y(w.value[0].label), U = V(() => s.recentlyUsedEmojis.length ? n : n.slice(1)), H = y([]), x = V(() => [
339
+ ...I[`People${s.skinTone}`],
340
+ ...I.Nature,
341
+ ...I.Food,
342
+ ...I[`Activity${s.skinTone}`],
343
+ ...I.Travel,
344
+ ...I[`Objects${s.skinTone}`],
345
+ ...I.Symbols,
346
+ ...I.Flags
347
+ ]), ne = ie(() => {
348
+ h.value = [], ee();
246
349
  });
247
- w(p, () => {
248
- j();
249
- }, { immediate: !0 }), w(
250
- () => l.recentlyUsedEmojis,
350
+ N(x, () => {
351
+ ee();
352
+ }, { immediate: !0 }), N(
353
+ () => s.recentlyUsedEmojis,
251
354
  () => {
252
- k["Recently used"] = l.recentlyUsedEmojis;
355
+ I["Recently used"] = s.recentlyUsedEmojis;
253
356
  },
254
357
  { immediate: !0 }
255
- ), w(() => l.emojiFilter, () => {
256
- G(), V();
257
- }), w(
258
- () => l.selectedTabset,
259
- (t) => {
260
- J(t.tabId);
358
+ ), N(() => s.emojiFilter, () => {
359
+ ue(), s.emojiFilter ? g.value = !0 : (g.value = !1, d("highlighted-emoji", null)), ne();
360
+ }), N(
361
+ () => s.selectedTabset,
362
+ (o) => {
363
+ J(o.tabId);
261
364
  },
262
365
  { deep: !0 }
263
366
  );
264
- function j() {
265
- const t = l.emojiFilter.toLowerCase();
266
- $.value = p.value.filter((a) => {
267
- const n = a.name.toLowerCase().includes(t), o = a.keywords.some((m) => m.toLowerCase().includes(t));
268
- return n || o;
367
+ function ee() {
368
+ const o = s.emojiFilter.toLowerCase();
369
+ H.value = x.value.filter((l) => {
370
+ const r = l.name.toLowerCase().includes(o), m = l.keywords.some((a) => a.toLowerCase().includes(o));
371
+ return r || m;
372
+ }), G(() => {
373
+ o && L(H.value[0], !0);
269
374
  });
270
375
  }
271
- function E(t, a = 300) {
272
- let n;
273
- return (...o) => {
274
- clearTimeout(n), n = setTimeout(() => t(...o), a);
376
+ function ie(o, l = 300) {
377
+ let r;
378
+ return (...m) => {
379
+ clearTimeout(r), r = setTimeout(() => o(...m), l);
275
380
  };
276
381
  }
277
- function C(t) {
278
- return `${q + t}.png`;
382
+ function ae(o) {
383
+ return `${z + o}.png`;
279
384
  }
280
- function H(t) {
281
- t.target.parentNode.style.display = "none";
385
+ function re(o) {
386
+ o.target.parentNode.style.display = "none";
282
387
  }
283
- function J(t) {
284
- const n = c.value[t - 1].ref.value[0];
285
- oe(() => {
286
- const o = b.value, m = t === "1" ? 0 : n.offsetTop - 20;
287
- let S = !0, I = o.scrollTop;
288
- _("is-scrolling", !0), o.addEventListener("scroll", () => {
289
- if (S) {
290
- const L = o.scrollTop;
291
- (I < L && L >= m || I > L && L <= m) && (S = !1, _("is-scrolling", !1)), I = L;
388
+ function J(o, l = !0) {
389
+ const m = w.value[o - 1].ref.value[0];
390
+ G(() => {
391
+ const a = e.value, R = o === "1" ? 0 : m.offsetTop - 20;
392
+ let _ = !0, D = a.scrollTop;
393
+ d("is-scrolling", !0), a.addEventListener("scroll", () => {
394
+ if (_) {
395
+ const C = a.scrollTop;
396
+ (D < C && C >= R || D > C && C <= R) && (_ = !1, d("is-scrolling", !1)), D = C;
292
397
  }
293
- }), o.scrollTop = m;
398
+ }), a.scrollTop = R, l && f(o - 1, 0);
294
399
  });
295
400
  }
296
- function G() {
297
- const t = b.value;
298
- t.scrollTop = 0;
401
+ function ue() {
402
+ const o = e.value;
403
+ o.scrollTop = 0;
299
404
  }
300
- function K() {
301
- r.value = new IntersectionObserver((t) => {
302
- t.forEach((a) => {
303
- var m, S, I, L, z;
304
- const { target: n } = a, o = parseInt(n.dataset.index);
305
- a.isIntersecting && n.offsetTop <= s.value.offsetTop + 50 ? (y.value = ((m = c.value[o - 1]) == null ? void 0 : m.label) ?? ((S = c.value[0]) == null ? void 0 : S.label), _("scroll-into-tab", o - 1)) : a.boundingClientRect.bottom <= ((I = s.value) == null ? void 0 : I.getBoundingClientRect().bottom) ? (_("scroll-into-tab", o), y.value = (L = c.value[o]) == null ? void 0 : L.label) : o === 1 && (_("scroll-into-tab", o), y.value = (z = c.value[0]) == null ? void 0 : z.label);
405
+ function ce() {
406
+ t.value = new IntersectionObserver((o) => {
407
+ o.forEach((l) => {
408
+ var a, R, _, D, C;
409
+ const { target: r } = l, m = parseInt(r.dataset.index);
410
+ l.isIntersecting && r.offsetTop <= b.value.offsetTop + 50 ? (k.value = ((a = w.value[m - 1]) == null ? void 0 : a.label) ?? ((R = w.value[0]) == null ? void 0 : R.label), d("scroll-into-tab", m - 1)) : l.boundingClientRect.bottom <= ((_ = b.value) == null ? void 0 : _.getBoundingClientRect().bottom) ? (d("scroll-into-tab", m), k.value = (D = w.value[m]) == null ? void 0 : D.label) : m === 1 && (d("scroll-into-tab", m), k.value = (C = w.value[0]) == null ? void 0 : C.label);
306
411
  });
307
- }), r.value.observe(s.value), Array.from(b.value.children).forEach((t, a) => {
308
- r.value.observe(t), t.dataset.index = a;
412
+ }), t.value.observe(b.value), Array.from(e.value.children).forEach((o, l) => {
413
+ t.value.observe(o), o.dataset.index = l;
309
414
  });
310
415
  }
311
- return se(() => {
312
- K();
313
- }), ne(() => {
314
- r.value.disconnect();
315
- }), (t, a) => (i(), d("div", _e, [
316
- v("div", {
416
+ const fe = (o, l, r) => {
417
+ var m;
418
+ if (o.preventDefault(), p.value = !1, o.key === "ArrowUp") {
419
+ const a = l % E;
420
+ if (!f(0, l - E)) {
421
+ const R = h.value.length - h.value.length % E + a;
422
+ f(0, R), f(0, R) || f(0, h.value.length - 1);
423
+ }
424
+ }
425
+ if (o.key === "ArrowDown" && !f(0, l + E)) {
426
+ const a = l % E;
427
+ (m = h.value) != null && m[l + (E - a)] ? f(0, h.value.length - 1) : f(0, a);
428
+ }
429
+ o.key === "ArrowLeft" && F("left", 0, l), o.key === "ArrowRight" && F("right", 0, l), o.key === "Tab" && d("focus-skin-selector"), o.key === "Enter" && d("selected-emoji", r);
430
+ }, de = (o, l, r, m) => {
431
+ var a, R;
432
+ if (o.preventDefault(), o.key === "ArrowUp") {
433
+ const _ = r % E;
434
+ if (l === 0) {
435
+ const D = E - u.value[u.value.length - 1].length % E, C = u.value[u.value.length - 1].length + D - (E - _);
436
+ f(u.value.length - 1, C) || f(u.value.length - 1, u.value[u.value.length - 1].length - 1);
437
+ return;
438
+ }
439
+ if (!f(l, r - E)) {
440
+ const D = l - 1 < 0 ? 0 : l - 1, C = u.value[D].length, ve = C - C % E + _;
441
+ f(D, ve) || f(l - 1, u.value[l - 1].length - 1);
442
+ }
443
+ }
444
+ if (o.key === "ArrowDown" && !f(l, r + E)) {
445
+ const _ = r % E;
446
+ (R = (a = u.value) == null ? void 0 : a[l]) != null && R[r + (E - _)] ? f(l, u.value[l].length - 1) : f(l + 1, _) || f(0, _) || f(0, u.value[0].length - 1);
447
+ }
448
+ o.key === "ArrowLeft" && F("left", l, r), o.key === "ArrowRight" && F("right", l, r), o.key === "Tab" && (f(l + 1, 0) ? J(l + 1 + 1, !1) : d("focus-skin-selector")), o.key === "Tab" && o.shiftKey && (f(l, 0) && l > 0 ? J(l, !0) : (J(1, !1), d("focus-search-input"))), o.key === "Enter" && d("selected-emoji", m);
449
+ };
450
+ function me() {
451
+ f(0, 0);
452
+ }
453
+ return te(() => {
454
+ ce();
455
+ }), je(() => {
456
+ t.value.disconnect();
457
+ }), v({
458
+ focusEmojiSelector: me
459
+ }), (o, l) => (j(), S("div", Ce, [
460
+ T("div", {
317
461
  id: "d-emoji-picker-list",
318
462
  ref_key: "listRef",
319
- ref: b,
463
+ ref: e,
320
464
  class: "d-emoji-picker__list"
321
465
  }, [
322
- e.emojiFilter ? (i(), d("p", ve, A($.value.length > 0 ? e.searchResultsLabel : e.searchNoResultsLabel), 1)) : (i(), d("div", {
466
+ i.emojiFilter ? (j(), S("p", Ie, P(H.value.length > 0 ? i.searchResultsLabel : i.searchNoResultsLabel), 1)) : (j(), S("div", {
323
467
  key: 1,
324
468
  ref_key: "tabCategoryRef",
325
- ref: s,
469
+ ref: b,
326
470
  class: "d-emoji-picker__category d-emoji-picker__alignment"
327
471
  }, [
328
- v("p", null, A(y.value), 1)
472
+ T("p", null, P(k.value), 1)
329
473
  ], 512)),
330
- (i(!0), d(U, null, R(h(c), (n, o) => M((i(), d("div", {
331
- key: o,
474
+ (j(!0), S(M, null, O($(w), (r, m) => X((j(), S("div", {
475
+ key: m,
332
476
  ref_for: !0,
333
- ref: n.ref,
477
+ ref: r.ref,
334
478
  class: "d-emoji-picker__alignment"
335
479
  }, [
336
- o ? (i(), d("p", pe, A(n.label), 1)) : O("", !0),
337
- v("div", fe, [
338
- (i(!0), d(U, null, R(h(k)[h(u)[o] + e.skinTone] ? h(k)[h(u)[o] + e.skinTone] : h(k)[h(u)[o]], (m) => (i(), d("button", {
339
- key: m.shortname,
480
+ m ? (j(), S("p", Ae, P(r.label), 1)) : Y("", !0),
481
+ T("div", De, [
482
+ (j(!0), S(M, null, O($(I)[$(U)[m] + i.skinTone] ? $(I)[$(U)[m] + i.skinTone] : $(I)[$(U)[m]], (a, R) => (j(), S("button", {
483
+ key: a.shortname,
484
+ ref_for: !0,
485
+ ref: (_) => {
486
+ _ && $(c)(_, m, R);
487
+ },
340
488
  type: "button",
341
- "aria-label": m.name,
342
- onClick: (S) => t.$emit("selected-emoji", m),
343
- onFocusin: (S) => t.$emit("highlighted-emoji", m),
344
- onFocusout: a[0] || (a[0] = (S) => t.$emit("highlighted-emoji", null)),
345
- onMouseover: (S) => t.$emit("highlighted-emoji", m),
346
- onMouseleave: a[1] || (a[1] = (S) => t.$emit("highlighted-emoji", null))
489
+ "aria-label": a.name,
490
+ onClick: (_) => o.$emit("selected-emoji", a),
491
+ onFocusin: (_) => o.$emit("highlighted-emoji", a),
492
+ onFocusout: l[0] || (l[0] = (_) => o.$emit("highlighted-emoji", null)),
493
+ onMouseover: (_) => o.$emit("highlighted-emoji", a),
494
+ onMouseleave: l[1] || (l[1] = (_) => o.$emit("highlighted-emoji", null)),
495
+ onKeydown: (_) => de(_, m, R, a)
347
496
  }, [
348
- v("img", {
497
+ T("img", {
349
498
  class: "d-icon d-icon--size-500",
350
- alt: m.name,
351
- "aria-label": m.name,
352
- title: m.name,
353
- src: C(m.unicode_character),
354
- onError: H
355
- }, null, 40, ge)
356
- ], 40, he))), 128))
499
+ alt: a.name,
500
+ "aria-label": a.name,
501
+ title: a.name,
502
+ src: ae(a.unicode_character),
503
+ onError: re
504
+ }, null, 40, Ue)
505
+ ], 40, Ke))), 128))
357
506
  ])
358
507
  ])), [
359
- [x, !e.emojiFilter]
508
+ [Z, !i.emojiFilter]
360
509
  ])), 128)),
361
- e.emojiFilter ? (i(), d("div", je, [
362
- v("div", ke, [
363
- (i(!0), d(U, null, R($.value, (n) => (i(), d("button", {
364
- key: n.shortname,
510
+ i.emojiFilter ? (j(), S("div", qe, [
511
+ T("div", Ne, [
512
+ (j(!0), S(M, null, O(H.value, (r, m) => (j(), S("button", {
513
+ key: r.shortname,
514
+ ref_for: !0,
515
+ ref: (a) => {
516
+ a && $(A)(a, m);
517
+ },
365
518
  type: "button",
366
- "aria-label": n.name,
367
- onClick: (o) => t.$emit("selected-emoji", n),
368
- onFocusin: (o) => t.$emit("highlighted-emoji", n),
369
- onFocusout: a[2] || (a[2] = (o) => t.$emit("highlighted-emoji", null)),
370
- onMouseover: (o) => t.$emit("highlighted-emoji", n),
371
- onMouseleave: a[3] || (a[3] = (o) => t.$emit("highlighted-emoji", null))
519
+ "aria-label": r.name,
520
+ class: le({
521
+ "hover-emoji": m === 0 && $(p)
522
+ }),
523
+ onClick: (a) => o.$emit("selected-emoji", r),
524
+ onFocusin: (a) => o.$emit("highlighted-emoji", r),
525
+ onFocusout: l[2] || (l[2] = (a) => o.$emit("highlighted-emoji", null)),
526
+ onMouseover: (a) => $(L)(r),
527
+ onMouseleave: l[3] || (l[3] = (a) => $(L)(null)),
528
+ onKeydown: (a) => fe(a, m, r)
372
529
  }, [
373
- v("img", {
530
+ T("img", {
374
531
  class: "d-icon d-icon--size-500",
375
- alt: n.name,
376
- "aria-label": n.name,
377
- title: n.name,
378
- src: `${h(q) + n.unicode_character}.png`
379
- }, null, 8, Te)
380
- ], 40, ye))), 128))
532
+ alt: r.name,
533
+ "aria-label": r.name,
534
+ title: r.name,
535
+ src: `${$(z) + r.unicode_character}.png`
536
+ }, null, 8, Be)
537
+ ], 42, Ve))), 128))
381
538
  ])
382
- ])) : O("", !0)
539
+ ])) : Y("", !0)
383
540
  ], 512)
384
541
  ]));
385
542
  }
386
- }, $e = /* @__PURE__ */ N(Se, [["__scopeId", "data-v-183240d8"]]);
387
- const Ee = { class: "d-emoji-picker__skin-list" }, Le = ["onClick"], Ce = ["alt", "aria-label", "title", "src"], Ie = { class: "d-emoji-picker__skin-selected" }, we = ["alt", "aria-label", "title", "src"], De = {
543
+ }, Oe = /* @__PURE__ */ W(Me, [["__scopeId", "data-v-b604e646"]]);
544
+ const Pe = { "data-qa": "skin-selector" }, ze = { class: "d-emoji-picker__skin-list" }, He = ["onKeydown", "onClick"], Je = ["alt", "aria-label", "title", "src"], Ge = { class: "d-emoji-picker__skin-selected" }, We = ["aria-label"], Qe = ["alt", "aria-label", "title", "src"], Xe = {
388
545
  __name: "emoji_skin_selector",
389
546
  props: {
390
547
  /**
@@ -411,10 +568,11 @@ const Ee = { class: "d-emoji-picker__skin-list" }, Le = ["onClick"], Ce = ["alt"
411
568
  * @event skin-tone
412
569
  * @type {Number}
413
570
  */
414
- "skin-tone"
571
+ "skin-tone",
572
+ "focus-tabset"
415
573
  ],
416
- setup(e, { emit: _ }) {
417
- const l = e, s = [
574
+ setup(i, { expose: v, emit: d }) {
575
+ const s = i, u = [
418
576
  {
419
577
  name: ":wave_tone1:",
420
578
  unicode_output: "1f44b-1f3fb",
@@ -451,60 +609,84 @@ const Ee = { class: "d-emoji-picker__skin-list" }, Le = ["onClick"], Ce = ["alt"
451
609
  skinTone: "Default",
452
610
  skinCode: ""
453
611
  }
454
- ], b = f(s.find((c) => c.skinTone === l.skinTone)), r = f(!1);
455
- ae(
456
- () => l.isHovering && (r.value = !1)
612
+ ], h = y(u.find((e) => e.skinTone === s.skinTone)), g = y(!1), p = y(null), c = y([]);
613
+ Se(
614
+ () => s.isHovering && (g.value = !1)
457
615
  );
458
- function g(c) {
459
- b.value = c, r.value = !1, _("skin-tone", c.skinTone);
616
+ function A(e) {
617
+ c.value.push(e);
618
+ }
619
+ function L() {
620
+ p.value.focus();
621
+ }
622
+ function f(e) {
623
+ h.value = e, g.value = !1, d("skin-tone", e.skinTone), G(() => L());
624
+ }
625
+ const F = (e, t, n) => {
626
+ var w, k, U;
627
+ e.preventDefault(), e.key === "ArrowLeft" && (n === 0 && ((w = c.value[c.value.length - 1]) == null || w.focus()), (k = c.value[n - 1]) == null || k.focus()), e.key === "ArrowRight" && ((U = c.value[n + 1]) == null || U.focus()), e.key === "Enter" && (t ? f(t) : b()), e.key === "Tab" && d("focus-tabset");
628
+ };
629
+ function b() {
630
+ g.value = !g.value, G(() => c.value[0].focus());
460
631
  }
461
- return (c, y) => (i(), d("div", null, [
462
- M(v("div", Ee, [
463
- (i(), d(U, null, R(s, (u) => v("button", {
464
- key: u.name,
465
- class: ie({
466
- selected: b.value.skinCode === u.skinCode
632
+ return v({
633
+ focusSkinSelector: L
634
+ }), (e, t) => (j(), S("div", Pe, [
635
+ X(T("div", ze, [
636
+ (j(), S(M, null, O(u, (n, w) => T("button", {
637
+ ref_for: !0,
638
+ ref: (k) => {
639
+ k && A(k);
640
+ },
641
+ key: n.name,
642
+ class: le({
643
+ selected: h.value.skinCode === n.skinCode
467
644
  }),
468
- onClick: ($) => g(u)
645
+ onKeydown: (k) => F(k, n, w),
646
+ onClick: (k) => f(n)
469
647
  }, [
470
- v("img", {
648
+ T("img", {
471
649
  class: "d-icon d-icon--size-500",
472
- alt: u.name,
473
- "aria-label": u.name,
474
- title: u.name,
475
- src: `${h(q) + u.unicode_output}.png`
476
- }, null, 8, Ce)
477
- ], 10, Le)), 64))
650
+ alt: n.name,
651
+ "aria-label": n.name,
652
+ title: n.name,
653
+ src: `${$(z) + n.unicode_output}.png`
654
+ }, null, 8, Je)
655
+ ], 42, He)), 64))
478
656
  ], 512), [
479
- [x, r.value]
657
+ [Z, g.value]
480
658
  ]),
481
- M(v("div", Ie, [
482
- T(Y, { placement: "top-end" }, {
483
- anchor: F(() => [
484
- v("button", {
485
- onClick: y[0] || (y[0] = (u) => r.value = !0)
659
+ X(T("div", Ge, [
660
+ K(ge, { placement: "top-end" }, {
661
+ anchor: B(() => [
662
+ T("button", {
663
+ ref_key: "skinSelectorRef",
664
+ ref: p,
665
+ "aria-label": i.skinSelectorButtonTooltipLabel,
666
+ onClick: b,
667
+ onKeydown: t[0] || (t[0] = (n) => F(n))
486
668
  }, [
487
- v("img", {
669
+ T("img", {
488
670
  class: "d-icon d-icon--size-500",
489
- alt: b.value.name,
490
- "aria-label": b.value.name,
491
- title: b.value.name,
492
- src: `${h(q) + b.value.unicode_output}.png`
493
- }, null, 8, we)
494
- ])
671
+ alt: h.value.name,
672
+ "aria-label": h.value.name,
673
+ title: h.value.name,
674
+ src: `${$(z) + h.value.unicode_output}.png`
675
+ }, null, 8, Qe)
676
+ ], 40, We)
495
677
  ]),
496
- default: F(() => [
497
- P(A(e.skinSelectorButtonTooltipLabel) + " ", 1)
678
+ default: B(() => [
679
+ se(P(i.skinSelectorButtonTooltipLabel) + " ", 1)
498
680
  ]),
499
681
  _: 1
500
682
  })
501
683
  ], 512), [
502
- [x, !r.value]
684
+ [Z, !g.value]
503
685
  ])
504
686
  ]));
505
687
  }
506
- }, Fe = /* @__PURE__ */ N(De, [["__scopeId", "data-v-5c3fd4f6"]]);
507
- const Ue = { class: "d-emoji-picker__data" }, Re = ["alt", "aria-label", "title", "src"], Ae = {
688
+ }, Ye = /* @__PURE__ */ W(Xe, [["__scopeId", "data-v-58a153f4"]]);
689
+ const Ze = { class: "d-emoji-picker__data" }, xe = ["alt", "aria-label", "title", "src"], et = {
508
690
  __name: "emoji_description",
509
691
  props: {
510
692
  /**
@@ -517,24 +699,24 @@ const Ue = { class: "d-emoji-picker__data" }, Re = ["alt", "aria-label", "title"
517
699
  default: null
518
700
  }
519
701
  },
520
- setup(e) {
521
- return (_, l) => {
702
+ setup(i) {
703
+ return (v, d) => {
522
704
  var s;
523
- return i(), d("div", Ue, [
524
- e.emoji ? (i(), d("img", {
705
+ return j(), S("div", Ze, [
706
+ i.emoji ? (j(), S("img", {
525
707
  key: 0,
526
708
  class: "d-icon d-icon--size-500",
527
- alt: e.emoji.name,
528
- "aria-label": e.emoji.name,
529
- title: e.emoji.name,
530
- src: `${h(q) + e.emoji.unicode_character}.png`
531
- }, null, 8, Re)) : O("", !0),
532
- P(" " + A((s = e.emoji) == null ? void 0 : s.name), 1)
709
+ alt: i.emoji.name,
710
+ "aria-label": i.emoji.name,
711
+ title: i.emoji.name,
712
+ src: `${$(z) + i.emoji.unicode_character}.png`
713
+ }, null, 8, xe)) : Y("", !0),
714
+ se(" " + P((s = i.emoji) == null ? void 0 : s.name), 1)
533
715
  ]);
534
716
  };
535
717
  }
536
- }, qe = /* @__PURE__ */ N(Ae, [["__scopeId", "data-v-48c61881"]]);
537
- const Ve = { class: "d-emoji-picker" }, Ne = { class: "d-emoji-picker--header" }, Be = { class: "d-emoji-picker--body" }, Me = { class: "d-emoji-picker--footer" }, ze = {
718
+ }, tt = /* @__PURE__ */ W(et, [["__scopeId", "data-v-48c61881"]]);
719
+ const ot = { class: "d-emoji-picker" }, lt = { class: "d-emoji-picker--header" }, st = { class: "d-emoji-picker--body" }, nt = { class: "d-emoji-picker--footer" }, rt = {
538
720
  __name: "emoji_picker",
539
721
  props: {
540
722
  /**
@@ -634,88 +816,108 @@ const Ve = { class: "d-emoji-picker" }, Ne = { class: "d-emoji-picker--header" }
634
816
  * @event skin-tone
635
817
  * @param {String} skin - The selected skin tone from the skin selector
636
818
  */
637
- "skin-tone"
819
+ "skin-tone",
820
+ /**
821
+ * Since the keyboard events are encapsulated, we emit this event to close the picker
822
+ * @event close
823
+ */
824
+ "close"
638
825
  ],
639
- setup(e, { emit: _ }) {
640
- const l = e, s = f(""), b = f(null), r = f({}), g = f(0), c = f(!1), y = D(() => l.recentlyUsedEmojis.length > 0);
641
- function u(j) {
642
- s.value = "", r.value = j, r.value = { ...r.value, tabId: j };
826
+ setup(i, { emit: v }) {
827
+ const d = i, s = y(""), u = y(null), h = y({}), g = y(0), p = y(!1), c = V(() => d.recentlyUsedEmojis.length > 0);
828
+ function A(b) {
829
+ s.value = "", h.value = b, h.value = { ...h.value, tabId: b };
643
830
  }
644
- function $(j) {
645
- g.value = j;
831
+ function L(b) {
832
+ g.value = b;
646
833
  }
647
- function p(j) {
648
- c.value = j;
834
+ function f(b) {
835
+ p.value = b;
649
836
  }
650
- function V(j) {
651
- b.value = j;
837
+ function F(b) {
838
+ u.value = b;
652
839
  }
653
- return (j, E) => (i(), d("div", Ve, [
654
- v("div", Ne, [
655
- T(be, {
840
+ return (b, e) => (j(), S("div", ot, [
841
+ T("div", lt, [
842
+ K(Le, {
843
+ ref: "tabsetRef",
656
844
  "emoji-filter": s.value,
657
- "show-recently-used-tab": h(y),
845
+ "show-recently-used-tab": $(c),
658
846
  "scroll-into-tab": g.value,
659
- "tabset-labels": e.tabSetLabels,
660
- "is-scrolling": c.value,
661
- onSelectedTabset: u
847
+ "tabset-labels": i.tabSetLabels,
848
+ "is-scrolling": p.value,
849
+ onFocusSearchInput: e[0] || (e[0] = (t) => b.$refs.searchInputRef.focusSearchInput()),
850
+ onSelectedTabset: A,
851
+ onKeydown: e[1] || (e[1] = q((t) => v("close"), ["esc"]))
662
852
  }, null, 8, ["emoji-filter", "show-recently-used-tab", "scroll-into-tab", "tabset-labels", "is-scrolling"])
663
853
  ]),
664
- v("div", Be, [
665
- T(de, {
854
+ T("div", st, [
855
+ K(Re, {
856
+ ref: "searchInputRef",
666
857
  modelValue: s.value,
667
- "onUpdate:modelValue": E[0] || (E[0] = (C) => s.value = C),
668
- "search-placeholder-label": e.searchPlaceholderLabel
858
+ "onUpdate:modelValue": e[2] || (e[2] = (t) => s.value = t),
859
+ "search-placeholder-label": i.searchPlaceholderLabel,
860
+ onSelectFirstEmoji: e[3] || (e[3] = (t) => v("selected-emoji", u.value)),
861
+ onFocusTabset: e[4] || (e[4] = (t) => b.$refs.tabsetRef.focusTabset()),
862
+ onFocusEmojiSelector: e[5] || (e[5] = (t) => b.$refs.emojiSelectorRef.focusEmojiSelector()),
863
+ onKeydown: e[6] || (e[6] = q((t) => v("close"), ["esc"]))
669
864
  }, null, 8, ["modelValue", "search-placeholder-label"]),
670
- T($e, {
865
+ K(Oe, {
866
+ ref: "emojiSelectorRef",
671
867
  "emoji-filter": s.value,
672
- "skin-tone": e.skinTone,
673
- "tabset-labels": e.tabSetLabels,
674
- "search-results-label": e.searchResultsLabel,
675
- "search-no-results-label": e.searchNoResultsLabel,
676
- "recently-used-emojis": e.recentlyUsedEmojis,
677
- "selected-tabset": r.value,
678
- onScrollIntoTab: $,
679
- onIsScrolling: p,
680
- onHighlightedEmoji: V,
681
- onSelectedEmoji: E[1] || (E[1] = (C) => _("selected-emoji", C))
868
+ "skin-tone": i.skinTone,
869
+ "tabset-labels": i.tabSetLabels,
870
+ "search-results-label": i.searchResultsLabel,
871
+ "search-no-results-label": i.searchNoResultsLabel,
872
+ "recently-used-emojis": i.recentlyUsedEmojis,
873
+ "selected-tabset": h.value,
874
+ onScrollIntoTab: L,
875
+ onIsScrolling: f,
876
+ onHighlightedEmoji: F,
877
+ onSelectedEmoji: e[7] || (e[7] = (t) => v("selected-emoji", t)),
878
+ onFocusSkinSelector: e[8] || (e[8] = (t) => b.$refs.skinSelectorRef.focusSkinSelector()),
879
+ onFocusSearchInput: e[9] || (e[9] = (t) => b.$refs.searchInputRef.focusSearchInput()),
880
+ onKeydown: e[10] || (e[10] = q((t) => v("close"), ["esc"]))
682
881
  }, null, 8, ["emoji-filter", "skin-tone", "tabset-labels", "search-results-label", "search-no-results-label", "recently-used-emojis", "selected-tabset"])
683
882
  ]),
684
- v("div", Me, [
685
- T(qe, { emoji: b.value }, null, 8, ["emoji"]),
686
- T(Fe, {
687
- "is-hovering": !!b.value,
688
- "skin-selector-button-tooltip-label": e.skinSelectorButtonTooltipLabel,
689
- "skin-tone": e.skinTone,
690
- onSkinTone: E[2] || (E[2] = (C) => _("skin-tone", C))
883
+ T("div", nt, [
884
+ K(tt, { emoji: u.value }, null, 8, ["emoji"]),
885
+ K(Ye, {
886
+ ref: "skinSelectorRef",
887
+ "is-hovering": !!u.value,
888
+ "skin-selector-button-tooltip-label": i.skinSelectorButtonTooltipLabel,
889
+ "skin-tone": i.skinTone,
890
+ onSkinTone: e[11] || (e[11] = (t) => v("skin-tone", t)),
891
+ onFocusTabset: e[12] || (e[12] = (t) => b.$refs.tabsetRef.focusTabset()),
892
+ onKeydown: e[13] || (e[13] = q((t) => v("close"), ["esc"]))
691
893
  }, null, 8, ["is-hovering", "skin-selector-button-tooltip-label", "skin-tone"])
692
894
  ])
693
895
  ]));
694
896
  }
695
897
  };
696
898
  export {
697
- Je as DtEmoji,
698
- ze as DtEmojiPicker,
699
- Ge as DtEmojiTextWrapper,
700
- Ke as codeToEmojiData,
701
- Qe as customEmojiAssetUrl,
702
- We as defaultEmojiAssetUrl,
703
- Xe as emojiFileExtensionLarge,
704
- Ye as emojiFileExtensionSmall,
705
- Ze as emojiImageUrlLarge,
706
- et as emojiImageUrlSmall,
707
- tt as emojiJson,
708
- lt as emojiVersion,
709
- ot as filterValidShortCodes,
710
- st as findEmojis,
711
- nt as findShortCodes,
712
- at as getEmojiData,
713
- it as setCustomEmojiJson,
714
- rt as setCustomEmojiUrl,
715
- ct as setEmojiAssetUrlLarge,
716
- ut as setEmojiAssetUrlSmall,
717
- dt as shortcodeToEmojiData,
718
- mt as stringToUnicode,
719
- bt as unicodeToString,
720
- _t as validateCustomEmojiJson
899
+ ft as DtEmoji,
900
+ rt as DtEmojiPicker,
901
+ dt as DtEmojiTextWrapper,
902
+ mt as codeToEmojiData,
903
+ vt as customEmojiAssetUrl,
904
+ bt as defaultEmojiAssetUrl,
905
+ ht as emojiFileExtensionLarge,
906
+ pt as emojiFileExtensionSmall,
907
+ gt as emojiImageUrlLarge,
908
+ yt as emojiImageUrlSmall,
909
+ kt as emojiJson,
910
+ _t as emojiVersion,
911
+ jt as filterValidShortCodes,
912
+ St as findEmojis,
913
+ $t as findShortCodes,
914
+ wt as getEmojiData,
915
+ Tt as setCustomEmojiJson,
916
+ Rt as setCustomEmojiUrl,
917
+ Et as setEmojiAssetUrlLarge,
918
+ Lt as setEmojiAssetUrlSmall,
919
+ Ft as shortcodeToEmojiData,
920
+ Ct as stringToUnicode,
921
+ It as unicodeToString,
922
+ At as validateCustomEmojiJson
721
923
  };