@dialpad/dialtone-vue 3.73.0 → 3.73.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,901 @@
1
+ import { ref as y, onMounted as te, openBlock as j, createElementBlock as S, createVNode as K, withKeys as q, withModifiers as oe, createSlots as be, withCtx as V, createElementVNode as R, computed as B, toRefs as he, watch as U, Fragment as M, renderList as O, unref as $, createBlock as pe, nextTick as J, onUnmounted as ge, toDisplayString as z, withDirectives as W, createCommentVNode as X, vShow as Y, normalizeClass as le, watchEffect as ye, createTextVNode as ne } from "vue";
2
+ import { _ as Q, o as ke, D as Z, y as _e, z as je, $ as A, p as Se } from "./index-6b22d90d.js";
3
+ const $e = { class: "d-emoji-picker__search d-emoji-picker__alignment" }, we = ["onKeydown"], Re = {
4
+ __name: "emoji_search",
5
+ props: {
6
+ searchPlaceholderLabel: {
7
+ type: String,
8
+ required: !0
9
+ },
10
+ modelValue: {
11
+ type: String,
12
+ default: ""
13
+ }
14
+ },
15
+ emits: ["update:modelValue", "focus-emoji-selector", "focus-tabset", "select-first-emoji"],
16
+ setup(i, { expose: v, emit: d }) {
17
+ const n = y(null);
18
+ function u() {
19
+ d("update:modelValue", ""), h();
20
+ }
21
+ function h() {
22
+ n.value.focus();
23
+ }
24
+ return te(() => {
25
+ h();
26
+ }), v({
27
+ focusSearchInput: h
28
+ }), (g, p) => (j(), S("div", $e, [
29
+ K(ke, {
30
+ id: "searchInput",
31
+ ref_key: "searchInput",
32
+ ref: n,
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
+ }, be({
42
+ leftIcon: V(() => [
43
+ K(Z, { name: "search" })
44
+ ]),
45
+ _: 2
46
+ }, [
47
+ i.modelValue.length > 0 ? {
48
+ name: "rightIcon",
49
+ fn: V(() => [
50
+ R("button", {
51
+ class: "d-emoji-picker__search-button",
52
+ onClick: u,
53
+ onKeydown: q(u, ["enter"])
54
+ }, [
55
+ K(Z, { name: "close" })
56
+ ], 40, we)
57
+ ]),
58
+ key: "0"
59
+ } : void 0
60
+ ]), 1032, ["placeholder", "model-value"])
61
+ ]));
62
+ }
63
+ }, Te = /* @__PURE__ */ Q(Re, [["__scopeId", "data-v-640002c1"]]);
64
+ const Le = { class: "d-emoji-picker__tabset" }, Fe = {
65
+ __name: "emoji_tabset",
66
+ props: {
67
+ /**
68
+ * Whether to show the recently used tab or not
69
+ * @type {Boolean}
70
+ * @default false
71
+ */
72
+ showRecentlyUsedTab: {
73
+ type: Boolean,
74
+ default: !1
75
+ },
76
+ scrollIntoTab: {
77
+ type: Number,
78
+ required: !0
79
+ },
80
+ isScrolling: {
81
+ type: Boolean,
82
+ default: !1
83
+ },
84
+ emojiFilter: {
85
+ type: String,
86
+ default: ""
87
+ },
88
+ /**
89
+ * The labels for the aria-label
90
+ * @type {Array}
91
+ * @required
92
+ */
93
+ tabsetLabels: {
94
+ type: Array,
95
+ required: !0
96
+ }
97
+ },
98
+ emits: [
99
+ /**
100
+ * Emitted when a tab is selected
101
+ * @event selected-tabset
102
+ * @param {String} tabId - The name of the tab that was selected
103
+ */
104
+ "selected-tabset",
105
+ "focus-search-input"
106
+ ],
107
+ setup(i, { expose: v, emit: d }) {
108
+ const n = i, u = [
109
+ { label: "Recently used", icon: "clock" },
110
+ { label: "Smiley’s and people", icon: "satisfied" },
111
+ { label: "Nature", icon: "living-thing" },
112
+ { label: "Food", icon: "food" },
113
+ { label: "Activity", icon: "object" },
114
+ { label: "Travel", icon: "transportation" },
115
+ { label: "Objects", icon: "lightbulb" },
116
+ { label: "Symbols", icon: "heart" },
117
+ { label: "Flags", icon: "flag" }
118
+ ], h = B(() => (n.showRecentlyUsedTab ? u : u.slice(1)).map((t, s) => ({
119
+ ...t,
120
+ label: n.tabsetLabels[s],
121
+ id: (s + 1).toString(),
122
+ panelId: (s + 1).toString()
123
+ }))), g = B(() => n.emojiFilter.length > 0), p = y("1"), { isScrolling: c } = he(n), C = y([]);
124
+ U(
125
+ () => n.scrollIntoTab,
126
+ () => {
127
+ !c.value && !g.value && (p.value = (n.scrollIntoTab + 1).toString());
128
+ }
129
+ ), U(
130
+ g,
131
+ () => {
132
+ g.value && (p.value = null);
133
+ }
134
+ );
135
+ function F(e) {
136
+ c.value || (p.value = e), d("selected-tabset", e);
137
+ }
138
+ function f(e) {
139
+ C.value.push(e.$el);
140
+ }
141
+ function I() {
142
+ C.value[0].focus();
143
+ }
144
+ function b(e, t) {
145
+ e.key === "Enter" && (F(t), C.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: I
149
+ }), (e, t) => (j(), S("div", Le, [
150
+ K(_e, {
151
+ "tab-list-class": "d-emoji-picker__tabset-list",
152
+ selected: p.value
153
+ }, {
154
+ tabs: V(() => [
155
+ (j(!0), S(M, null, O($(h), (s, w) => (j(), pe(je, {
156
+ id: s.id,
157
+ ref_for: !0,
158
+ ref: (k) => {
159
+ k && f(k);
160
+ },
161
+ key: s.id,
162
+ "panel-id": s.panelId,
163
+ label: s.label,
164
+ "aria-controls": "d-emoji-picker-list",
165
+ tabindex: w + 1,
166
+ onClickCapture: oe((k) => F(s.id), ["stop"]),
167
+ onKeydown: (k) => b(k, s.id)
168
+ }, {
169
+ default: V(() => [
170
+ K(Z, {
171
+ size: "400",
172
+ name: s.icon
173
+ }, null, 8, ["name"])
174
+ ]),
175
+ _: 2
176
+ }, 1032, ["id", "panel-id", "label", "tabindex", "onClickCapture", "onKeydown"]))), 128))
177
+ ]),
178
+ _: 1
179
+ }, 8, ["selected"])
180
+ ]));
181
+ }
182
+ }, P = "https://static.dialpadcdn.com/joypixels/png/unicode/32/", L = 9;
183
+ function Ie(i) {
184
+ const v = y([]), d = y([]), n = 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, s) {
189
+ v.value[t] || (v.value[t] = []), v.value[t][s] = e;
190
+ }
191
+ function p(e, t) {
192
+ d.value[t] = e;
193
+ }
194
+ function c(e, t) {
195
+ var w, k, N;
196
+ const s = n.value ? (w = d.value) == null ? void 0 : w[t] : (N = (k = v.value) == null ? void 0 : k[e]) == null ? void 0 : N[t];
197
+ return s ? (s.focus(), !0) : !1;
198
+ }
199
+ function C(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 F(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 I(e, t) {
209
+ c(0, t + 1) || c(0, 0);
210
+ }
211
+ function b(e, t, s) {
212
+ n.value ? e === "left" ? f(t, s) : e === "right" && I(t, s) : e === "left" ? C(t, s) : e === "right" && F(t, s);
213
+ }
214
+ return {
215
+ emojiRefs: v,
216
+ emojiFilteredRefs: d,
217
+ isFiltering: n,
218
+ hoverFirstEmoji: u,
219
+ setEmojiRef: g,
220
+ setFilteredRef: p,
221
+ hoverEmoji: h,
222
+ focusEmoji: c,
223
+ handleHorizontalNavigation: b
224
+ };
225
+ }
226
+ const Ee = { class: "d-emoji-picker__selector" }, Ae = {
227
+ key: 0,
228
+ class: "d-emoji-picker__search-label d-emoji-picker__alignment"
229
+ }, Ce = { key: 0 }, De = { class: "d-emoji-picker__tab" }, Ke = ["aria-label", "onClick", "onFocusin", "onMouseover", "onKeydown"], Ne = ["alt", "aria-label", "title", "src"], qe = {
230
+ key: 2,
231
+ class: "d-emoji-picker__alignment"
232
+ }, Ue = {
233
+ class: "d-emoji-picker__tab",
234
+ "data-qa": "filtered-emojis"
235
+ }, Be = ["aria-label", "onClick", "onFocusin", "onMouseover", "onKeydown"], Ve = ["alt", "aria-label", "title", "src"], Me = {
236
+ __name: "emoji_selector",
237
+ props: {
238
+ /**
239
+ * The filter to apply to the emoji list
240
+ * @type {String}
241
+ * @default ''
242
+ */
243
+ emojiFilter: {
244
+ type: String,
245
+ default: ""
246
+ },
247
+ /**
248
+ * The skin tone to apply to the emoji list
249
+ * @type {String}
250
+ * @required
251
+ */
252
+ skinTone: {
253
+ type: String,
254
+ required: !0
255
+ },
256
+ /**
257
+ * The labels for the tabset
258
+ * @type {Array}
259
+ * @required
260
+ */
261
+ tabsetLabels: {
262
+ type: Array,
263
+ required: !0
264
+ },
265
+ selectedTabset: {
266
+ type: Object,
267
+ required: !0
268
+ },
269
+ /**
270
+ * The label for the search results tab
271
+ * @type {String}
272
+ * @required
273
+ */
274
+ searchResultsLabel: {
275
+ type: String,
276
+ required: !0
277
+ },
278
+ searchNoResultsLabel: {
279
+ type: String,
280
+ required: !0
281
+ },
282
+ /**
283
+ * The list of recently used emojis
284
+ * @type {Array}
285
+ */
286
+ recentlyUsedEmojis: {
287
+ type: Array,
288
+ default: () => []
289
+ }
290
+ },
291
+ emits: [
292
+ /**
293
+ * Emitted when the user hover over an emoji
294
+ * @event highlighted-emoji
295
+ * @param {Object} emoji - The emoji data that was hovered
296
+ */
297
+ "highlighted-emoji",
298
+ /**
299
+ * Emitted when the user select an emoji
300
+ * @event selected-emoji
301
+ * @param {Object} emoji - The emoji data that was selected
302
+ */
303
+ "selected-emoji",
304
+ /**
305
+ * Emitted when the user scroll into an emoji tab
306
+ * @event scroll-into-tab
307
+ * @param {Number} tab-index - The tab that was scrolled into
308
+ */
309
+ "scroll-into-tab",
310
+ /**
311
+ * Emitted when the scrollTo function starts scrolling and stops scrolling
312
+ * @event is-scrolling
313
+ * @param {Boolean} is-scrolling - Whether the user is scrolling with the scroll-to
314
+ */
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"
326
+ ],
327
+ setup(i, { expose: v, emit: d }) {
328
+ const n = i, {
329
+ emojiRefs: u,
330
+ emojiFilteredRefs: h,
331
+ isFiltering: g,
332
+ hoverFirstEmoji: p,
333
+ setEmojiRef: c,
334
+ setFilteredRef: C,
335
+ hoverEmoji: F,
336
+ focusEmoji: f,
337
+ handleHorizontalNavigation: I
338
+ } = Ie(d), b = y(null), e = y(null), t = y(null), s = ["Recently used", "People", "Nature", "Food", "Activity", "Travel", "Objects", "Symbols", "Flags"], w = B(() => n.recentlyUsedEmojis.length ? n.tabsetLabels.map((o) => ({ label: o, ref: y(null) })) : n.tabsetLabels.slice(1).map((o) => ({ label: o, ref: y(null) }))), k = y(w.value[0].label), N = B(() => n.recentlyUsedEmojis.length ? s : s.slice(1)), H = y([]), x = B(() => [
339
+ ...A[`People${n.skinTone}`],
340
+ ...A.Nature,
341
+ ...A.Food,
342
+ ...A[`Activity${n.skinTone}`],
343
+ ...A.Travel,
344
+ ...A[`Objects${n.skinTone}`],
345
+ ...A.Symbols,
346
+ ...A.Flags
347
+ ]), se = ie(() => {
348
+ h.value = [], ee();
349
+ });
350
+ U(x, () => {
351
+ ee();
352
+ }, { immediate: !0 }), U(
353
+ () => n.recentlyUsedEmojis,
354
+ () => {
355
+ A["Recently used"] = n.recentlyUsedEmojis;
356
+ },
357
+ { immediate: !0 }
358
+ ), U(() => n.emojiFilter, () => {
359
+ ue(), n.emojiFilter ? g.value = !0 : (g.value = !1, d("highlighted-emoji", null)), se();
360
+ }), U(
361
+ () => n.selectedTabset,
362
+ (o) => {
363
+ G(o.tabId);
364
+ },
365
+ { deep: !0 }
366
+ );
367
+ function ee() {
368
+ const o = n.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
+ }), J(() => {
373
+ o && F(H.value[0], !0);
374
+ });
375
+ }
376
+ function ie(o, l = 300) {
377
+ let r;
378
+ return (...m) => {
379
+ clearTimeout(r), r = setTimeout(() => o(...m), l);
380
+ };
381
+ }
382
+ function ae(o) {
383
+ return `${P + o}.png`;
384
+ }
385
+ function re(o) {
386
+ o.target.parentNode.style.display = "none";
387
+ }
388
+ function G(o, l = !0) {
389
+ const m = w.value[o - 1].ref.value[0];
390
+ J(() => {
391
+ const a = e.value, T = o === "1" ? 0 : m.offsetTop - 20;
392
+ let _ = !0, D = a.scrollTop;
393
+ d("is-scrolling", !0), a.addEventListener("scroll", () => {
394
+ if (_) {
395
+ const E = a.scrollTop;
396
+ (D < E && E >= T || D > E && E <= T) && (_ = !1, d("is-scrolling", !1)), D = E;
397
+ }
398
+ }), a.scrollTop = T, l && f(o - 1, 0);
399
+ });
400
+ }
401
+ function ue() {
402
+ const o = e.value;
403
+ o.scrollTop = 0;
404
+ }
405
+ function ce() {
406
+ t.value = new IntersectionObserver((o) => {
407
+ o.forEach((l) => {
408
+ var a, T, _, D, E;
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) ?? ((T = w.value[0]) == null ? void 0 : T.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 = (E = w.value[0]) == null ? void 0 : E.label);
411
+ });
412
+ }), t.value.observe(b.value), Array.from(e.value.children).forEach((o, l) => {
413
+ t.value.observe(o), o.dataset.index = l;
414
+ });
415
+ }
416
+ const fe = (o, l, r) => {
417
+ var m;
418
+ if (o.preventDefault(), p.value = !1, o.key === "ArrowUp") {
419
+ const a = l % L;
420
+ if (!f(0, l - L)) {
421
+ const T = h.value.length - h.value.length % L + a;
422
+ f(0, T), f(0, T) || f(0, h.value.length - 1);
423
+ }
424
+ }
425
+ if (o.key === "ArrowDown" && !f(0, l + L)) {
426
+ const a = l % L;
427
+ (m = h.value) != null && m[l + (L - a)] ? f(0, h.value.length - 1) : f(0, a);
428
+ }
429
+ o.key === "ArrowLeft" && I("left", 0, l), o.key === "ArrowRight" && I("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, T;
432
+ if (o.preventDefault(), o.key === "ArrowUp") {
433
+ const _ = r % L;
434
+ if (l === 0) {
435
+ const D = L - u.value[u.value.length - 1].length % L, E = u.value[u.value.length - 1].length + D - (L - _);
436
+ f(u.value.length - 1, E) || f(u.value.length - 1, u.value[u.value.length - 1].length - 1);
437
+ return;
438
+ }
439
+ if (!f(l, r - L)) {
440
+ const D = l - 1 < 0 ? 0 : l - 1, E = u.value[D].length, ve = E - E % L + _;
441
+ f(D, ve) || f(l - 1, u.value[l - 1].length - 1);
442
+ }
443
+ }
444
+ if (o.key === "ArrowDown" && !f(l, r + L)) {
445
+ const _ = r % L;
446
+ (T = (a = u.value) == null ? void 0 : a[l]) != null && T[r + (L - _)] ? f(l, u.value[l].length - 1) : f(l + 1, _) || f(0, _) || f(0, u.value[0].length - 1);
447
+ }
448
+ o.key === "ArrowLeft" && I("left", l, r), o.key === "ArrowRight" && I("right", l, r), o.key === "Tab" && (f(l + 1, 0) ? G(l + 1 + 1, !1) : d("focus-skin-selector")), o.key === "Tab" && o.shiftKey && (f(l, 0) && l > 0 ? G(l, !0) : (G(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
+ }), ge(() => {
456
+ t.value.disconnect();
457
+ }), v({
458
+ focusEmojiSelector: me
459
+ }), (o, l) => (j(), S("div", Ee, [
460
+ R("div", {
461
+ id: "d-emoji-picker-list",
462
+ ref_key: "listRef",
463
+ ref: e,
464
+ class: "d-emoji-picker__list"
465
+ }, [
466
+ i.emojiFilter ? (j(), S("p", Ae, z(H.value.length > 0 ? i.searchResultsLabel : i.searchNoResultsLabel), 1)) : (j(), S("div", {
467
+ key: 1,
468
+ ref_key: "tabCategoryRef",
469
+ ref: b,
470
+ class: "d-emoji-picker__category d-emoji-picker__alignment"
471
+ }, [
472
+ R("p", null, z(k.value), 1)
473
+ ], 512)),
474
+ (j(!0), S(M, null, O($(w), (r, m) => W((j(), S("div", {
475
+ key: m,
476
+ ref_for: !0,
477
+ ref: r.ref,
478
+ class: "d-emoji-picker__alignment"
479
+ }, [
480
+ m ? (j(), S("p", Ce, z(r.label), 1)) : X("", !0),
481
+ R("div", De, [
482
+ (j(!0), S(M, null, O($(A)[$(N)[m] + i.skinTone] ? $(A)[$(N)[m] + i.skinTone] : $(A)[$(N)[m]], (a, T) => (j(), S("button", {
483
+ key: a.shortname,
484
+ ref_for: !0,
485
+ ref: (_) => {
486
+ _ && $(c)(_, m, T);
487
+ },
488
+ type: "button",
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, T, a)
496
+ }, [
497
+ R("img", {
498
+ class: "d-icon d-icon--size-500",
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, Ne)
505
+ ], 40, Ke))), 128))
506
+ ])
507
+ ])), [
508
+ [Y, !i.emojiFilter]
509
+ ])), 128)),
510
+ i.emojiFilter ? (j(), S("div", qe, [
511
+ R("div", Ue, [
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 && $(C)(a, m);
517
+ },
518
+ type: "button",
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) => $(F)(r),
527
+ onMouseleave: l[3] || (l[3] = (a) => $(F)(null)),
528
+ onKeydown: (a) => fe(a, m, r)
529
+ }, [
530
+ R("img", {
531
+ class: "d-icon d-icon--size-500",
532
+ alt: r.name,
533
+ "aria-label": r.name,
534
+ title: r.name,
535
+ src: `${$(P) + r.unicode_character}.png`
536
+ }, null, 8, Ve)
537
+ ], 42, Be))), 128))
538
+ ])
539
+ ])) : X("", !0)
540
+ ], 512)
541
+ ]));
542
+ }
543
+ }, Oe = /* @__PURE__ */ Q(Me, [["__scopeId", "data-v-067b0cfe"]]);
544
+ const ze = { "data-qa": "skin-selector" }, Pe = { class: "d-emoji-picker__skin-list" }, He = ["onKeydown", "onClick"], Ge = ["alt", "aria-label", "title", "src"], Je = { class: "d-emoji-picker__skin-selected" }, Qe = ["aria-label"], We = ["alt", "aria-label", "title", "src"], Xe = {
545
+ __name: "emoji_skin_selector",
546
+ props: {
547
+ /**
548
+ * The skin tone to apply to the emoji list
549
+ * @type {String}
550
+ * @required
551
+ */
552
+ skinTone: {
553
+ type: String,
554
+ required: !0
555
+ },
556
+ isHovering: {
557
+ type: Boolean,
558
+ default: !1
559
+ },
560
+ skinSelectorButtonTooltipLabel: {
561
+ type: String,
562
+ required: !0
563
+ }
564
+ },
565
+ emits: [
566
+ /**
567
+ * The skin tone that was selected
568
+ * @event skin-tone
569
+ * @type {Number}
570
+ */
571
+ "skin-tone",
572
+ "focus-tabset"
573
+ ],
574
+ setup(i, { expose: v, emit: d }) {
575
+ const n = i, u = [
576
+ {
577
+ name: ":wave_tone1:",
578
+ unicode_output: "1f44b-1f3fb",
579
+ skinTone: "Light",
580
+ skinCode: "_tone1"
581
+ },
582
+ {
583
+ name: ":wave_tone2:",
584
+ unicode_output: "1f44b-1f3fc",
585
+ skinTone: "MediumLight",
586
+ skinCode: "_tone2"
587
+ },
588
+ {
589
+ name: ":wave_tone3:",
590
+ unicode_output: "1f44b-1f3fd",
591
+ skinTone: "Medium",
592
+ skinCode: "_tone3"
593
+ },
594
+ {
595
+ name: ":wave_tone4:",
596
+ unicode_output: "1f44b-1f3fe",
597
+ skinTone: "MediumDark",
598
+ skinCode: "_tone4"
599
+ },
600
+ {
601
+ name: ":wave_tone5:",
602
+ unicode_output: "1f44b-1f3ff",
603
+ skinTone: "Dark",
604
+ skinCode: "_tone5"
605
+ },
606
+ {
607
+ name: ":wave:",
608
+ unicode_output: "1f44b",
609
+ skinTone: "Default",
610
+ skinCode: ""
611
+ }
612
+ ], h = y(u.find((e) => e.skinTone === n.skinTone)), g = y(!1), p = y(null), c = y([]);
613
+ ye(
614
+ () => n.isHovering && (g.value = !1)
615
+ );
616
+ function C(e) {
617
+ c.value.push(e);
618
+ }
619
+ function F() {
620
+ p.value.focus();
621
+ }
622
+ function f(e) {
623
+ h.value = e, g.value = !1, d("skin-tone", e.skinTone), J(() => F());
624
+ }
625
+ const I = (e, t, s) => {
626
+ var w, k, N;
627
+ e.preventDefault(), e.key === "ArrowLeft" && (s === 0 && ((w = c.value[c.value.length - 1]) == null || w.focus()), (k = c.value[s - 1]) == null || k.focus()), e.key === "ArrowRight" && ((N = c.value[s + 1]) == null || N.focus()), e.key === "Enter" && (t ? f(t) : b()), e.key === "Tab" && d("focus-tabset");
628
+ };
629
+ function b() {
630
+ g.value = !g.value, J(() => c.value[0].focus());
631
+ }
632
+ return v({
633
+ focusSkinSelector: F
634
+ }), (e, t) => (j(), S("div", ze, [
635
+ W(R("div", Pe, [
636
+ (j(), S(M, null, O(u, (s, w) => R("button", {
637
+ ref_for: !0,
638
+ ref: (k) => {
639
+ k && C(k);
640
+ },
641
+ key: s.name,
642
+ class: le({
643
+ selected: h.value.skinCode === s.skinCode
644
+ }),
645
+ onKeydown: (k) => I(k, s, w),
646
+ onClick: (k) => f(s)
647
+ }, [
648
+ R("img", {
649
+ class: "d-icon d-icon--size-500",
650
+ alt: s.name,
651
+ "aria-label": s.name,
652
+ title: s.name,
653
+ src: `${$(P) + s.unicode_output}.png`
654
+ }, null, 8, Ge)
655
+ ], 42, He)), 64))
656
+ ], 512), [
657
+ [Y, g.value]
658
+ ]),
659
+ W(R("div", Je, [
660
+ K(Se, { placement: "top-end" }, {
661
+ anchor: V(() => [
662
+ R("button", {
663
+ ref_key: "skinSelectorRef",
664
+ ref: p,
665
+ "aria-label": i.skinSelectorButtonTooltipLabel,
666
+ tabindex: "-1",
667
+ onClick: b,
668
+ onKeydown: t[0] || (t[0] = (s) => I(s))
669
+ }, [
670
+ R("img", {
671
+ class: "d-icon d-icon--size-500",
672
+ alt: h.value.name,
673
+ "aria-label": h.value.name,
674
+ title: h.value.name,
675
+ src: `${$(P) + h.value.unicode_output}.png`
676
+ }, null, 8, We)
677
+ ], 40, Qe)
678
+ ]),
679
+ default: V(() => [
680
+ ne(z(i.skinSelectorButtonTooltipLabel) + " ", 1)
681
+ ]),
682
+ _: 1
683
+ })
684
+ ], 512), [
685
+ [Y, !g.value]
686
+ ])
687
+ ]));
688
+ }
689
+ }, Ye = /* @__PURE__ */ Q(Xe, [["__scopeId", "data-v-3a6fb9c2"]]);
690
+ const Ze = { class: "d-emoji-picker__data" }, xe = ["alt", "aria-label", "title", "src"], et = {
691
+ __name: "emoji_description",
692
+ props: {
693
+ /**
694
+ * Emoji data
695
+ * @type {Object}
696
+ * @default null
697
+ */
698
+ emoji: {
699
+ type: Object,
700
+ default: null
701
+ }
702
+ },
703
+ setup(i) {
704
+ return (v, d) => {
705
+ var n;
706
+ return j(), S("div", Ze, [
707
+ i.emoji ? (j(), S("img", {
708
+ key: 0,
709
+ class: "d-icon d-icon--size-500",
710
+ alt: i.emoji.name,
711
+ "aria-label": i.emoji.name,
712
+ title: i.emoji.name,
713
+ src: `${$(P) + i.emoji.unicode_character}.png`
714
+ }, null, 8, xe)) : X("", !0),
715
+ ne(" " + z((n = i.emoji) == null ? void 0 : n.name), 1)
716
+ ]);
717
+ };
718
+ }
719
+ }, tt = /* @__PURE__ */ Q(et, [["__scopeId", "data-v-48c61881"]]);
720
+ const ot = { class: "d-emoji-picker" }, lt = { class: "d-emoji-picker--header" }, nt = { class: "d-emoji-picker--body" }, st = { class: "d-emoji-picker--footer" }, rt = {
721
+ __name: "emoji_picker",
722
+ props: {
723
+ /**
724
+ * The array with recently used emoji object
725
+ * This list is necessary to fill the recently used tab
726
+ * @type {Array}
727
+ * @default []
728
+ * @example
729
+ * <dt-emoji-picker :recentlyUsedEmojis="[emojiObject, emojiObject]" />
730
+ */
731
+ // TODO try to simplify this to achieve an array of unicode characters and not an entire emoji data object
732
+ recentlyUsedEmojis: {
733
+ type: Array,
734
+ default: () => []
735
+ },
736
+ /**
737
+ * The placeholder text for the search input
738
+ * @type {String}
739
+ * @required
740
+ * @example
741
+ * <dt-emoji-picker :searchPlaceholderLabel="'Search...'" />
742
+ */
743
+ searchPlaceholderLabel: {
744
+ type: String,
745
+ required: !0
746
+ },
747
+ /**
748
+ * The label for the search results tab
749
+ * @type {String}
750
+ * @required
751
+ * @example
752
+ * <dt-emoji-picker :searchResultsLabel="'Search results'" />
753
+ */
754
+ searchResultsLabel: {
755
+ type: String,
756
+ required: !0
757
+ },
758
+ /**
759
+ * The label for the search no results
760
+ * @type {String}
761
+ * @required
762
+ * @example
763
+ * <dt-emoji-picker :searchNoResultsLabel="'No results'" />
764
+ */
765
+ searchNoResultsLabel: {
766
+ type: String,
767
+ required: !0
768
+ },
769
+ /**
770
+ * The list of tabsets to show, it is necessary to be updated with the correct language
771
+ * It must respect the provided order.
772
+ * @type {Array}
773
+ * @required
774
+ * @example
775
+ * <dt-emoji-picker
776
+ * :tabSetLabels="['Most recently used', 'Smileys and people', 'Nature',
777
+ * 'Food', 'Activity', 'Travel', 'Objects', 'Symbols', 'Flags']" />
778
+ */
779
+ tabSetLabels: {
780
+ type: Array,
781
+ required: !0
782
+ },
783
+ /**
784
+ * The skin tone to show the emojis
785
+ * This prop gives the possibility to use the skin tone selected by the user previously
786
+ * @type {String}
787
+ * @default 'Default'
788
+ * @values 'Default', 'Light', 'MediumLight', 'Medium', 'MediumDark', 'Dark'
789
+ * @example
790
+ * <dt-emoji-picker :skinTone="'Default'" />
791
+ */
792
+ skinTone: {
793
+ type: String,
794
+ default: "Default"
795
+ },
796
+ /**
797
+ * Tooltip shown when skin selector button is hovered.
798
+ * @type {String}
799
+ * @required
800
+ * @example
801
+ * <dt-emoji-picker :skin-selector-button-tooltip-label="'Change default skin tone'" />
802
+ */
803
+ skinSelectorButtonTooltipLabel: {
804
+ type: String,
805
+ required: !0
806
+ }
807
+ },
808
+ emits: [
809
+ /**
810
+ * It will emit the selected emoji
811
+ * @event selected-emoji
812
+ * @param {Object} emoji - The selected emoji from the emoji selector
813
+ */
814
+ "selected-emoji",
815
+ /**
816
+ * It will emit the selected skin tone
817
+ * @event skin-tone
818
+ * @param {String} skin - The selected skin tone from the skin selector
819
+ */
820
+ "skin-tone",
821
+ /**
822
+ * Since the keyboard events are encapsulated, we emit this event to close the picker
823
+ * @event close
824
+ */
825
+ "close"
826
+ ],
827
+ setup(i, { emit: v }) {
828
+ const d = i, n = y(""), u = y(null), h = y({}), g = y(0), p = y(!1), c = B(() => d.recentlyUsedEmojis.length > 0);
829
+ function C(b) {
830
+ n.value = "", h.value = b, h.value = { ...h.value, tabId: b };
831
+ }
832
+ function F(b) {
833
+ g.value = b;
834
+ }
835
+ function f(b) {
836
+ p.value = b;
837
+ }
838
+ function I(b) {
839
+ u.value = b;
840
+ }
841
+ return (b, e) => (j(), S("div", ot, [
842
+ R("div", lt, [
843
+ K(Fe, {
844
+ ref: "tabsetRef",
845
+ "emoji-filter": n.value,
846
+ "show-recently-used-tab": $(c),
847
+ "scroll-into-tab": g.value,
848
+ "tabset-labels": i.tabSetLabels,
849
+ "is-scrolling": p.value,
850
+ onFocusSearchInput: e[0] || (e[0] = (t) => b.$refs.searchInputRef.focusSearchInput()),
851
+ onSelectedTabset: C,
852
+ onKeydown: e[1] || (e[1] = q((t) => v("close"), ["esc"]))
853
+ }, null, 8, ["emoji-filter", "show-recently-used-tab", "scroll-into-tab", "tabset-labels", "is-scrolling"])
854
+ ]),
855
+ R("div", nt, [
856
+ K(Te, {
857
+ ref: "searchInputRef",
858
+ modelValue: n.value,
859
+ "onUpdate:modelValue": e[2] || (e[2] = (t) => n.value = t),
860
+ "search-placeholder-label": i.searchPlaceholderLabel,
861
+ onSelectFirstEmoji: e[3] || (e[3] = (t) => v("selected-emoji", u.value)),
862
+ onFocusTabset: e[4] || (e[4] = (t) => b.$refs.tabsetRef.focusTabset()),
863
+ onFocusEmojiSelector: e[5] || (e[5] = (t) => b.$refs.emojiSelectorRef.focusEmojiSelector()),
864
+ onKeydown: e[6] || (e[6] = q((t) => v("close"), ["esc"]))
865
+ }, null, 8, ["modelValue", "search-placeholder-label"]),
866
+ K(Oe, {
867
+ ref: "emojiSelectorRef",
868
+ "emoji-filter": n.value,
869
+ "skin-tone": i.skinTone,
870
+ "tabset-labels": i.tabSetLabels,
871
+ "search-results-label": i.searchResultsLabel,
872
+ "search-no-results-label": i.searchNoResultsLabel,
873
+ "recently-used-emojis": i.recentlyUsedEmojis,
874
+ "selected-tabset": h.value,
875
+ onScrollIntoTab: F,
876
+ onIsScrolling: f,
877
+ onHighlightedEmoji: I,
878
+ onSelectedEmoji: e[7] || (e[7] = (t) => v("selected-emoji", t)),
879
+ onFocusSkinSelector: e[8] || (e[8] = (t) => b.$refs.skinSelectorRef.focusSkinSelector()),
880
+ onFocusSearchInput: e[9] || (e[9] = (t) => b.$refs.searchInputRef.focusSearchInput()),
881
+ onKeydown: e[10] || (e[10] = q((t) => v("close"), ["esc"]))
882
+ }, null, 8, ["emoji-filter", "skin-tone", "tabset-labels", "search-results-label", "search-no-results-label", "recently-used-emojis", "selected-tabset"])
883
+ ]),
884
+ R("div", st, [
885
+ K(tt, { emoji: u.value }, null, 8, ["emoji"]),
886
+ K(Ye, {
887
+ ref: "skinSelectorRef",
888
+ "is-hovering": !!u.value,
889
+ "skin-selector-button-tooltip-label": i.skinSelectorButtonTooltipLabel,
890
+ "skin-tone": i.skinTone,
891
+ onSkinTone: e[11] || (e[11] = (t) => v("skin-tone", t)),
892
+ onFocusTabset: e[12] || (e[12] = (t) => b.$refs.tabsetRef.focusTabset()),
893
+ onKeydown: e[13] || (e[13] = q((t) => v("close"), ["esc"]))
894
+ }, null, 8, ["is-hovering", "skin-selector-button-tooltip-label", "skin-tone"])
895
+ ])
896
+ ]));
897
+ }
898
+ };
899
+ export {
900
+ rt as _
901
+ };