@dialpad/dialtone-vue 2.124.0 → 2.125.1-alpha.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.
- package/dist/chunks/_plugin-vue2_normalizer-u6G_3nkj.js +33 -0
- package/dist/chunks/_plugin-vue2_normalizer-u6G_3nkj.js.map +1 -0
- package/dist/chunks/dropdown-SMWaTWyF.js +357 -0
- package/dist/chunks/dropdown-SMWaTWyF.js.map +1 -0
- package/dist/chunks/dropdown_constants-EUcDxBrX.js +9 -0
- package/dist/chunks/dropdown_constants-EUcDxBrX.js.map +1 -0
- package/dist/chunks/icon_constants-OpYAAKwF.js +16 -0
- package/dist/chunks/icon_constants-OpYAAKwF.js.map +1 -0
- package/dist/chunks/index-nIyl_PL6.js +372 -0
- package/dist/chunks/index-nIyl_PL6.js.map +1 -0
- package/dist/chunks/index-o4OMWMuv.js +244 -0
- package/dist/chunks/index-o4OMWMuv.js.map +1 -0
- package/dist/chunks/input-1tm09l_-.js +273 -0
- package/dist/chunks/input-1tm09l_-.js.map +1 -0
- package/dist/chunks/input_group-zcAq3DQl.js +141 -0
- package/dist/chunks/input_group-zcAq3DQl.js.map +1 -0
- package/dist/chunks/keyboard_list_navigation-F0O8nht0.js +197 -0
- package/dist/chunks/keyboard_list_navigation-F0O8nht0.js.map +1 -0
- package/dist/chunks/link_constants-vIUB92L4.js +16 -0
- package/dist/chunks/link_constants-vIUB92L4.js.map +1 -0
- package/dist/chunks/list_item_constants-LTUc74pD.js +13 -0
- package/dist/chunks/list_item_constants-LTUc74pD.js.map +1 -0
- package/dist/chunks/modal-VuMFkZFH.js +82 -0
- package/dist/chunks/modal-VuMFkZFH.js.map +1 -0
- package/dist/chunks/notice_action-9NmtQRai.js +182 -0
- package/dist/chunks/notice_action-9NmtQRai.js.map +1 -0
- package/dist/chunks/notice_constants-c--hBFQw.js +6 -0
- package/dist/chunks/notice_constants-c--hBFQw.js.map +1 -0
- package/dist/chunks/popover_constants-qjlEkroB.js +114 -0
- package/dist/chunks/popover_constants-qjlEkroB.js.map +1 -0
- package/dist/chunks/sr_only_close_button-JGole5Xi.js +86 -0
- package/dist/chunks/sr_only_close_button-JGole5Xi.js.map +1 -0
- package/dist/chunks/stack_constants-u7tNqGtc.js +13 -0
- package/dist/chunks/stack_constants-u7tNqGtc.js.map +1 -0
- package/dist/chunks/tab-Qm9LVkYj.js +346 -0
- package/dist/chunks/tab-Qm9LVkYj.js.map +1 -0
- package/dist/component-documentation.json +1 -1
- package/dist/dialtone-vue.js +356 -10364
- package/dist/dialtone-vue.js.map +1 -0
- package/dist/lib/attachment-carousel.js +250 -0
- package/dist/lib/attachment-carousel.js.map +1 -0
- package/dist/lib/avatar.js +369 -0
- package/dist/lib/avatar.js.map +1 -0
- package/dist/lib/badge.js +169 -0
- package/dist/lib/badge.js.map +1 -0
- package/dist/lib/banner.js +200 -0
- package/dist/lib/banner.js.map +1 -0
- package/dist/lib/breadcrumbs.js +138 -0
- package/dist/lib/breadcrumbs.js.map +1 -0
- package/dist/lib/button-group.js +45 -0
- package/dist/lib/button-group.js.map +1 -0
- package/dist/lib/button.js +328 -0
- package/dist/lib/button.js.map +1 -0
- package/dist/lib/callbar-button-with-popover.js +235 -0
- package/dist/lib/callbar-button-with-popover.js.map +1 -0
- package/dist/lib/callbar-button.js +175 -0
- package/dist/lib/callbar-button.js.map +1 -0
- package/dist/lib/callbox.js +142 -0
- package/dist/lib/callbox.js.map +1 -0
- package/dist/lib/card.js +72 -0
- package/dist/lib/card.js.map +1 -0
- package/dist/lib/checkbox-group.js +117 -0
- package/dist/lib/checkbox-group.js.map +1 -0
- package/dist/lib/checkbox.js +117 -0
- package/dist/lib/checkbox.js.map +1 -0
- package/dist/lib/chip.js +186 -0
- package/dist/lib/chip.js.map +1 -0
- package/dist/lib/codeblock.js +29 -0
- package/dist/lib/codeblock.js.map +1 -0
- package/dist/lib/collapsible.js +313 -0
- package/dist/lib/collapsible.js.map +1 -0
- package/dist/lib/combobox-multi-select.js +433 -0
- package/dist/lib/combobox-multi-select.js.map +1 -0
- package/dist/lib/combobox-with-popover.js +341 -0
- package/dist/lib/combobox-with-popover.js.map +1 -0
- package/dist/lib/combobox.js +19 -0
- package/dist/lib/combobox.js.map +1 -0
- package/dist/lib/constants.js +53 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/contact-info.js +145 -0
- package/dist/lib/contact-info.js.map +1 -0
- package/dist/lib/contact-row.js +203 -0
- package/dist/lib/contact-row.js.map +1 -0
- package/dist/lib/datepicker.js +552 -0
- package/dist/lib/datepicker.js.map +1 -0
- package/dist/lib/dates.js +57 -0
- package/dist/lib/dates.js.map +1 -0
- package/dist/lib/description-list.js +83 -0
- package/dist/lib/description-list.js.map +1 -0
- package/dist/lib/dropdown.js +45 -0
- package/dist/lib/dropdown.js.map +1 -0
- package/dist/lib/editor.js +527 -0
- package/dist/lib/editor.js.map +1 -0
- package/dist/{emoji_picker-kiTOKaq8.js → lib/emoji-picker.js} +30 -11
- package/dist/lib/emoji-picker.js.map +1 -0
- package/dist/lib/emoji-row.js +83 -0
- package/dist/lib/emoji-row.js.map +1 -0
- package/dist/{emoji_text_wrapper-48ClwKvf.js → lib/emoji-text-wrapper.js} +19 -13
- package/dist/lib/emoji-text-wrapper.js.map +1 -0
- package/dist/lib/emoji.js +11 -0
- package/dist/lib/emoji.js.map +1 -0
- package/dist/lib/feed-item-row.js +207 -0
- package/dist/lib/feed-item-row.js.map +1 -0
- package/dist/lib/feed-pill.js +142 -0
- package/dist/lib/feed-pill.js.map +1 -0
- package/dist/lib/general-row.js +379 -0
- package/dist/lib/general-row.js.map +1 -0
- package/dist/lib/group-row.js +115 -0
- package/dist/lib/group-row.js.map +1 -0
- package/dist/lib/grouped-chip.js +45 -0
- package/dist/lib/grouped-chip.js.map +1 -0
- package/dist/lib/hovercard.js +194 -0
- package/dist/lib/hovercard.js.map +1 -0
- package/dist/lib/icon.js +82 -0
- package/dist/lib/icon.js.map +1 -0
- package/dist/lib/image-viewer.js +171 -0
- package/dist/lib/image-viewer.js.map +1 -0
- package/dist/lib/input-group.js +90 -0
- package/dist/lib/input-group.js.map +1 -0
- package/dist/lib/input.js +455 -0
- package/dist/lib/input.js.map +1 -0
- package/dist/lib/item-layout.js +39 -0
- package/dist/lib/item-layout.js.map +1 -0
- package/dist/lib/ivr-node.js +195 -0
- package/dist/lib/ivr-node.js.map +1 -0
- package/dist/lib/keyboard-shortcut.js +100 -0
- package/dist/lib/keyboard-shortcut.js.map +1 -0
- package/dist/lib/lazy-show.js +77 -0
- package/dist/lib/lazy-show.js.map +1 -0
- package/dist/lib/link.js +69 -0
- package/dist/lib/link.js.map +1 -0
- package/dist/lib/list-item-group.js +59 -0
- package/dist/lib/list-item-group.js.map +1 -0
- package/dist/lib/list-item.js +195 -0
- package/dist/lib/list-item.js.map +1 -0
- package/dist/{message_input.js → lib/message-input.js} +107 -55
- package/dist/lib/message-input.js.map +1 -0
- package/dist/lib/mixins.js +17 -0
- package/dist/lib/mixins.js.map +1 -0
- package/dist/lib/modal.js +324 -0
- package/dist/lib/modal.js.map +1 -0
- package/dist/lib/notice.js +158 -0
- package/dist/lib/notice.js.map +1 -0
- package/dist/lib/pagination.js +142 -0
- package/dist/lib/pagination.js.map +1 -0
- package/dist/lib/popover.js +779 -0
- package/dist/lib/popover.js.map +1 -0
- package/dist/lib/presence.js +60 -0
- package/dist/lib/presence.js.map +1 -0
- package/dist/lib/radio-group.js +97 -0
- package/dist/lib/radio-group.js.map +1 -0
- package/dist/lib/radio.js +111 -0
- package/dist/lib/radio.js.map +1 -0
- package/dist/lib/rich-text-editor.js +920 -0
- package/dist/lib/rich-text-editor.js.map +1 -0
- package/dist/lib/root-layout.js +127 -0
- package/dist/lib/root-layout.js.map +1 -0
- package/dist/lib/select-menu.js +243 -0
- package/dist/lib/select-menu.js.map +1 -0
- package/dist/lib/settings-menu-button.js +65 -0
- package/dist/lib/settings-menu-button.js.map +1 -0
- package/dist/lib/skeleton.js +574 -0
- package/dist/lib/skeleton.js.map +1 -0
- package/dist/lib/stack.js +118 -0
- package/dist/lib/stack.js.map +1 -0
- package/dist/lib/tabs.js +93 -0
- package/dist/lib/tabs.js.map +1 -0
- package/dist/lib/time-pill.js +43 -0
- package/dist/lib/time-pill.js.map +1 -0
- package/dist/lib/toast.js +226 -0
- package/dist/lib/toast.js.map +1 -0
- package/dist/lib/toggle.js +169 -0
- package/dist/lib/toggle.js.map +1 -0
- package/dist/{directives.js → lib/tooltip-directive.js} +24 -17
- package/dist/lib/tooltip-directive.js.map +1 -0
- package/dist/lib/tooltip.js +376 -0
- package/dist/lib/tooltip.js.map +1 -0
- package/dist/lib/top-banner-info.js +60 -0
- package/dist/lib/top-banner-info.js.map +1 -0
- package/dist/lib/unread-pill.js +61 -0
- package/dist/lib/unread-pill.js.map +1 -0
- package/dist/lib/utils.js +175 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/validation-messages.js +83 -0
- package/dist/lib/validation-messages.js.map +1 -0
- package/dist/lib/validators.js +12 -0
- package/dist/lib/validators.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/types/common/{constants.d.ts → constants/index.d.ts} +1 -1
- package/dist/types/common/constants/index.d.ts.map +1 -0
- package/dist/types/common/{dates.d.ts → dates/index.d.ts} +1 -1
- package/dist/types/common/dates/index.d.ts.map +1 -0
- package/dist/types/common/{emoji.d.ts → emoji/index.d.ts} +1 -1
- package/dist/types/common/{emoji.d.ts.map → emoji/index.d.ts.map} +1 -1
- package/dist/types/common/{utils.d.ts → utils/index.d.ts} +1 -1
- package/dist/types/common/utils/index.d.ts.map +1 -0
- package/dist/types/common/{validators.d.ts → validators/index.d.ts} +1 -1
- package/dist/types/common/validators/index.d.ts.map +1 -0
- package/dist/types/components/avatar/avatar.vue.d.ts +1 -1
- package/dist/types/components/button/button.vue.d.ts +2 -2
- package/dist/types/components/card/card.vue.d.ts +1 -1
- package/dist/types/components/checkbox/checkbox.vue.d.ts +7 -7
- package/dist/types/components/checkbox/checkbox.vue.d.ts.map +1 -1
- package/dist/types/components/chip/chip.vue.d.ts +2 -2
- package/dist/types/components/collapsible/collapsible.vue.d.ts +3 -3
- package/dist/types/components/combobox/combobox.vue.d.ts +7 -8
- package/dist/types/components/combobox/combobox.vue.d.ts.map +1 -1
- package/dist/types/components/dropdown/dropdown.vue.d.ts +1 -1
- package/dist/types/components/emoji/emoji.vue.d.ts +1 -1
- package/dist/types/components/emoji_picker/modules/emoji_selector.vue.d.ts +1 -219
- package/dist/types/components/icon/icon.vue.d.ts +20 -16
- package/dist/types/components/icon/icon.vue.d.ts.map +1 -1
- package/dist/types/components/icon/icon_constants.d.ts +2 -0
- package/dist/types/components/icon/icon_constants.d.ts.map +1 -1
- package/dist/types/components/icon/index.d.ts +1 -1
- package/dist/types/components/input_group/input_group.vue.d.ts +15 -6
- package/dist/types/components/input_group/input_group.vue.d.ts.map +1 -1
- package/dist/types/components/list_item_group/list_item_group.vue.d.ts +1 -1
- package/dist/types/components/modal/modal.vue.d.ts +7 -2
- package/dist/types/components/modal/modal.vue.d.ts.map +1 -1
- package/dist/types/components/notice/notice_action.vue.d.ts +3 -1
- package/dist/types/components/notice/notice_action.vue.d.ts.map +1 -1
- package/dist/types/components/popover/popover_header_footer.vue.d.ts +1 -1
- package/dist/types/components/radio/radio.vue.d.ts +2 -12
- package/dist/types/components/radio/radio.vue.d.ts.map +1 -1
- package/dist/types/components/rich_text_editor/extensions/suggestion/SuggestionList.vue.d.ts +1 -1
- package/dist/types/components/skeleton/skeleton-list-item.vue.d.ts +1 -1
- package/dist/types/components/skeleton/skeleton-paragraph.vue.d.ts +3 -3
- package/dist/types/components/skeleton/skeleton-shape.vue.d.ts +2 -2
- package/dist/types/components/skeleton/skeleton-text.vue.d.ts +8 -3
- package/dist/types/components/skeleton/skeleton-text.vue.d.ts.map +1 -1
- package/dist/types/components/skeleton/skeleton.vue.d.ts +1 -1
- package/dist/types/components/toggle/toggle.vue.d.ts +1 -1
- package/dist/types/components/tooltip/tooltip.vue.d.ts +2 -2
- package/dist/types/index.d.ts +36 -29
- package/dist/types/recipes/buttons/callbar_button/callbar_button.vue.d.ts +1 -1
- package/dist/types/recipes/buttons/callbar_button_with_popover/callbar_button_with_popover.vue.d.ts +2 -2
- package/dist/types/recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue.d.ts +1 -1
- package/dist/types/recipes/comboboxes/combobox_with_popover/combobox_with_popover.vue.d.ts +2 -2
- package/dist/types/recipes/conversation_view/editor/editor.vue.d.ts +9 -0
- package/dist/types/recipes/conversation_view/editor/editor.vue.d.ts.map +1 -1
- package/package.json +19 -59
- package/CHANGELOG.json +0 -1
- package/CHANGELOG.md +0 -2890
- package/dist/dialtone-vue.cjs +0 -5
- package/dist/directives.cjs +0 -1
- package/dist/emoji.cjs +0 -1
- package/dist/emoji.js +0 -35
- package/dist/emoji_picker-njWWAm6V.cjs +0 -1
- package/dist/emoji_text_wrapper-ZlynvHnd.cjs +0 -1
- package/dist/index-OF94C6nQ.js +0 -142833
- package/dist/index-Wx7Jagcr.cjs +0 -1
- package/dist/message_input.cjs +0 -1
- package/dist/rich_text_editor-9sMob7ck.js +0 -16478
- package/dist/rich_text_editor-Eh5kYokw.cjs +0 -97
- package/dist/tooltip-88U5vFMA.js +0 -2516
- package/dist/tooltip-i2wxFIIi.cjs +0 -21
- package/dist/types/common/constants.d.ts.map +0 -1
- package/dist/types/common/dates.d.ts.map +0 -1
- package/dist/types/common/utils.d.ts.map +0 -1
- package/dist/types/common/validators.d.ts.map +0 -1
- package/dist/types/components/emoji_picker/emojis/index.d.ts +0 -50
- package/dist/types/components/emoji_picker/emojis/index.d.ts.map +0 -1
- package/dist/types/directives.d.ts +0 -2
- package/dist/types/directives.d.ts.map +0 -1
- package/dist/types/emoji.d.ts +0 -5
- package/dist/types/emoji.d.ts.map +0 -1
- package/dist/types/message_input.d.ts +0 -3
- package/dist/types/message_input.d.ts.map +0 -1
|
@@ -1,6 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { D as b, a as k } from "../chunks/tab-Qm9LVkYj.js";
|
|
2
|
+
import { DtIcon as p } from "./icon.js";
|
|
3
|
+
import { n as m } from "../chunks/_plugin-vue2_normalizer-u6G_3nkj.js";
|
|
4
|
+
import { DtInput as _ } from "./input.js";
|
|
5
|
+
import { emojisGrouped as j } from "@dialpad/dialtone-emojis";
|
|
6
|
+
import { DtTooltip as g } from "./tooltip.js";
|
|
7
|
+
import "./button.js";
|
|
3
8
|
import "vue";
|
|
9
|
+
import "../chunks/link_constants-vIUB92L4.js";
|
|
10
|
+
import "@dialpad/dialtone-icons/vue2";
|
|
11
|
+
import "../chunks/icon_constants-OpYAAKwF.js";
|
|
12
|
+
import "@dialpad/dialtone-icons/icons.json";
|
|
13
|
+
import "./skeleton.js";
|
|
14
|
+
import "./constants.js";
|
|
15
|
+
import "./utils.js";
|
|
16
|
+
import "../chunks/input-1tm09l_-.js";
|
|
17
|
+
import "./validators.js";
|
|
18
|
+
import "./validation-messages.js";
|
|
19
|
+
import "../chunks/popover_constants-qjlEkroB.js";
|
|
20
|
+
import "tippy.js";
|
|
21
|
+
import "./lazy-show.js";
|
|
4
22
|
const y = {
|
|
5
23
|
name: "EmojiTabset",
|
|
6
24
|
components: {
|
|
@@ -177,7 +195,7 @@ var v = function() {
|
|
|
177
195
|
null,
|
|
178
196
|
null
|
|
179
197
|
);
|
|
180
|
-
const A = w.exports,
|
|
198
|
+
const A = w.exports, I = {
|
|
181
199
|
name: "EmojiSelector",
|
|
182
200
|
props: {
|
|
183
201
|
emojiFilter: {
|
|
@@ -437,7 +455,7 @@ const A = w.exports, D = {
|
|
|
437
455
|
}
|
|
438
456
|
}
|
|
439
457
|
};
|
|
440
|
-
var
|
|
458
|
+
var D = function() {
|
|
441
459
|
var e = this, i = e._self._c;
|
|
442
460
|
return i("div", { staticClass: "d-emoji-picker__selector" }, [i("div", { ref: "listRef", staticClass: "d-emoji-picker__list", attrs: { id: "d-emoji-picker-list" } }, [e.emojiFilter ? i("p", { staticClass: "d-emoji-picker__search-label d-emoji-picker__alignment" }, [e._v(" " + e._s(e.filteredEmojis.length > 0 ? e.searchResultsLabel : e.searchNoResultsLabel) + " ")]) : i("div", { ref: "tabCategoryRef", staticClass: "d-emoji-picker__category d-emoji-picker__alignment" }, [i("p", [e._v(" " + e._s(e.fixedLabel) + " ")])]), e._l(e.tabLabels, function(s, r) {
|
|
443
461
|
return i("div", { directives: [{ name: "show", rawName: "v-show", value: !e.emojiFilter, expression: "!emojiFilter" }], key: r, ref: `tabLabelRef-${r}`, refInFor: !0, staticClass: "d-emoji-picker__alignment" }, [r ? i("p", [e._v(" " + e._s(s.label) + " ")]) : e._e(), i("div", { staticClass: "d-emoji-picker__tab" }, e._l(e.emojis[e.tabs[r] + e.skinTone] ? e.emojis[e.tabs[r] + e.skinTone] : e.emojis[e.tabs[r]], function(o, n) {
|
|
@@ -469,8 +487,8 @@ var I = function() {
|
|
|
469
487
|
}, keydown: (o) => e.handleKeyDownFilteredEmojis(o, r, s) } }, [i("img", { staticClass: "d-icon d-icon--size-500", attrs: { alt: s.name, "aria-label": s.name, title: s.name, src: `${e.CDN_URL + s.unicode_character}.png` } })]);
|
|
470
488
|
}), 0)]) : e._e()], 2)]);
|
|
471
489
|
}, C = [], F = /* @__PURE__ */ m(
|
|
472
|
-
D,
|
|
473
490
|
I,
|
|
491
|
+
D,
|
|
474
492
|
C,
|
|
475
493
|
!1,
|
|
476
494
|
null,
|
|
@@ -772,11 +790,12 @@ var Y = function() {
|
|
|
772
790
|
null,
|
|
773
791
|
null
|
|
774
792
|
);
|
|
775
|
-
const
|
|
793
|
+
const ke = Q.exports;
|
|
776
794
|
export {
|
|
777
|
-
d as
|
|
778
|
-
|
|
779
|
-
a as
|
|
780
|
-
|
|
781
|
-
|
|
795
|
+
d as CDN_URL,
|
|
796
|
+
ke as DtEmojiPicker,
|
|
797
|
+
a as EMOJIS_PER_ROW,
|
|
798
|
+
u as EMOJI_PICKER_CATEGORIES,
|
|
799
|
+
h as EMOJI_PICKER_SKIN_TONE_MODIFIERS
|
|
782
800
|
};
|
|
801
|
+
//# sourceMappingURL=emoji-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emoji-picker.js","sources":["../../components/emoji_picker/modules/emoji_tabset.vue","../../components/emoji_picker/modules/emoji_search.vue","../../components/emoji_picker/modules/emoji_selector.vue","../../components/emoji_picker/emoji_picker_constants.js","../../components/emoji_picker/modules/emoji_description.vue","../../components/emoji_picker/modules/emoji_skin_selector.vue","../../components/emoji_picker/emoji_picker.vue"],"sourcesContent":["<template>\n <div class=\"d-emoji-picker__tabset\">\n <dt-tab-group\n tab-list-class=\"d-emoji-picker__tabset-list\"\n :selected=\"selectedTab\"\n >\n <template #tabs>\n <dt-tab\n v-for=\"(tab, index) in tabs\"\n :id=\"tab.id\"\n :ref=\"`tabsetRef-${index}`\"\n :key=\"tab.id\"\n :panel-id=\"tab.panelId\"\n :label=\"tab.label\"\n aria-controls=\"d-emoji-picker-list\"\n :tabindex=\"index + 1\"\n @click.capture.stop=\"selectTabset(tab.id)\"\n @keydown=\"handleKeyDown($event, tab.id)\"\n >\n <dt-icon\n size=\"400\"\n :name=\"tab.icon\"\n />\n </dt-tab>\n </template>\n </dt-tab-group>\n </div>\n</template>\n\n<script>\nimport DtTabGroup from '@/components/tabs/tab_group.vue';\nimport DtTab from '@/components/tabs/tab.vue';\nimport DtIcon from '@/components/icon/icon.vue';\nimport { EMOJI_PICKER_CATEGORIES } from '@/components/emoji_picker';\n\nexport default {\n name: 'EmojiTabset',\n\n components: {\n DtTabGroup,\n DtTab,\n DtIcon,\n },\n\n props: {\n showRecentlyUsedTab: {\n type: Boolean,\n default: false,\n },\n\n scrollIntoTab: {\n type: Number,\n required: true,\n },\n\n isScrolling: {\n type: Boolean,\n default: false,\n },\n\n emojiFilter: {\n type: String,\n default: '',\n },\n\n tabSetLabels: {\n type: Array,\n required: true,\n },\n },\n\n data () {\n return {\n selectedTab: '1',\n tabsetRef: [],\n TABS_DATA: [\n { label: EMOJI_PICKER_CATEGORIES.MOST_RECENTLY_USED, icon: 'clock' },\n { label: EMOJI_PICKER_CATEGORIES.SMILEYS_AND_PEOPLE, icon: 'satisfied' },\n { label: EMOJI_PICKER_CATEGORIES.NATURE, icon: 'living-thing' },\n { label: EMOJI_PICKER_CATEGORIES.FOOD, icon: 'food' },\n { label: EMOJI_PICKER_CATEGORIES.ACTIVITY, icon: 'object' },\n { label: EMOJI_PICKER_CATEGORIES.TRAVEL, icon: 'transportation' },\n { label: EMOJI_PICKER_CATEGORIES.OBJECTS, icon: 'lightbulb' },\n { label: EMOJI_PICKER_CATEGORIES.SYMBOLS, icon: 'heart' },\n { label: EMOJI_PICKER_CATEGORIES.FLAGS, icon: 'flag' },\n ],\n };\n },\n\n computed: {\n tabs () {\n const tabsData = this.showRecentlyUsedTab ? this.TABS_DATA : this.TABS_DATA.slice(1);\n return tabsData.map((tab, index) => ({\n ...tab,\n label: this.tabSetLabels[index],\n id: (index + 1).toString(),\n panelId: (index + 1).toString(),\n }));\n },\n\n isSearching () {\n return this.emojiFilter.length > 0;\n },\n },\n\n watch: {\n scrollIntoTab: function (newVal) {\n if (!this.isScrolling && !this.isSearching) {\n this.selectedTab = (newVal + 1).toString();\n }\n },\n\n isSearching: function (newVal) {\n if (newVal) {\n this.selectedTab = null;\n }\n },\n },\n\n mounted () {\n this.$nextTick(() => {\n this.setTabsetRef();\n });\n },\n\n methods: {\n selectTabset (id) {\n if (!this.isScrolling) {\n this.selectedTab = id;\n }\n this.$emit('selected-tabset', id);\n },\n\n setTabsetRef () {\n this.tabs.forEach((skin, index) => {\n const refKey = `tabsetRef-${index}`;\n if (this.$refs[refKey]) {\n this.$set(this.tabsetRef, index, this.$refs[refKey][0].$el);\n }\n });\n },\n\n focusTabset () {\n if (this.tabsetRef[0]) {\n this.tabsetRef[0].focus();\n }\n },\n\n handleKeyDown (event, tabId) {\n if (event.key === 'Enter') {\n this.selectTabset(tabId);\n if (this.tabsetRef[tabId - 1]) {\n this.tabsetRef[tabId - 1].blur();\n }\n }\n\n if (event.key === 'Tab') {\n event.preventDefault();\n if (event.shiftKey) {\n this.$emit('focus-skin-selector');\n } else {\n this.$emit('focus-search-input');\n }\n }\n\n if (event.key === 'ArrowDown') {\n this.$emit('focus-search-input');\n }\n },\n },\n};\n</script>\n","<template>\n <div class=\"d-emoji-picker__search d-emoji-picker__alignment\">\n <dt-input\n id=\"searchInput\"\n ref=\"searchInputRef\"\n :placeholder=\"searchPlaceholderLabel\"\n :value=\"modelValue\"\n @input=\"updateModelValue\"\n @keydown.up=\"focusTabset\"\n @keydown.down.prevent=\"focusEmojiSelector\"\n @keydown.enter=\"selectFirstEmoji\"\n >\n <template #leftIcon>\n <dt-icon\n name=\"search\"\n size=\"200\"\n />\n </template>\n <template\n v-if=\"modelValue.length > 0\"\n #rightIcon\n >\n <button\n class=\"d-emoji-picker__search-button\"\n @click=\"clearSearch\"\n @keydown.enter=\"clearSearch\"\n >\n <dt-icon name=\"close\" />\n </button>\n </template>\n </dt-input>\n </div>\n</template>\n\n<script>\nimport { DtInput } from '@/components/input';\nimport { DtIcon } from '@/components/icon';\n\nexport default {\n name: 'EmojiSearch',\n\n components: {\n DtInput,\n DtIcon,\n },\n\n props: {\n searchPlaceholderLabel: {\n type: String,\n required: true,\n },\n\n modelValue: {\n type: String,\n default: '',\n },\n },\n\n mounted () {\n this.focusSearchInput();\n },\n\n methods: {\n updateModelValue (value) {\n this.$emit('update:model-value', value);\n },\n\n focusEmojiSelector () {\n this.$emit('focus-emoji-selector');\n },\n\n focusTabset () {\n this.$emit('focus-tabset');\n },\n\n selectFirstEmoji () {\n this.$emit('select-first-emoji');\n },\n\n clearSearch () {\n this.$emit('update:model-value', '');\n this.focusSearchInput();\n },\n\n focusSearchInput () {\n this.$refs.searchInputRef.focus();\n },\n },\n};\n</script>\n","<template>\n <div\n class=\"d-emoji-picker__selector\"\n >\n <div\n id=\"d-emoji-picker-list\"\n ref=\"listRef\"\n class=\"d-emoji-picker__list\"\n >\n <p\n v-if=\"emojiFilter\"\n class=\"d-emoji-picker__search-label d-emoji-picker__alignment\"\n >\n {{ filteredEmojis.length > 0 ? searchResultsLabel : searchNoResultsLabel }}\n </p>\n <div\n v-else\n ref=\"tabCategoryRef\"\n class=\"d-emoji-picker__category d-emoji-picker__alignment\"\n >\n <p>\n {{ fixedLabel }}\n </p>\n </div>\n <div\n v-for=\"(tabLabel, indexTab) in tabLabels\"\n v-show=\"!emojiFilter\"\n :key=\"indexTab\"\n :ref=\"`tabLabelRef-${indexTab}`\"\n class=\"d-emoji-picker__alignment\"\n >\n <p\n v-if=\"indexTab\"\n >\n {{ tabLabel.label }}\n </p>\n <div\n class=\"d-emoji-picker__tab\"\n >\n <button\n v-for=\"(emoji, indexEmoji) in\n (emojis[tabs[indexTab] + skinTone] ? emojis[tabs[indexTab] + skinTone] : emojis[tabs[indexTab]])\"\n :key=\"emoji.shortname\"\n :ref=\"`emojiRef-${indexTab}`\"\n type=\"button\"\n :aria-label=\"emoji.name\"\n @click=\"$emit('selected-emoji', emoji)\"\n @focusin=\"$emit('highlighted-emoji', emoji)\"\n @focusout=\"$emit('highlighted-emoji', null)\"\n @mouseover=\"$emit('highlighted-emoji', emoji)\"\n @mouseleave=\"$emit('highlighted-emoji', null)\"\n @keydown=\"event => handleKeyDown(event, indexTab, indexEmoji, emoji)\"\n >\n <img\n class=\"d-icon d-icon--size-500\"\n :alt=\"emoji.name\"\n :aria-label=\"emoji.name\"\n :title=\"emoji.name\"\n :src=\"getImgSrc(emoji.unicode_character)\"\n @error=\"handleImageError\"\n >\n </button>\n </div>\n </div>\n <div\n v-if=\"emojiFilter\"\n class=\"d-emoji-picker__alignment\"\n >\n <div\n class=\"d-emoji-picker__tab \"\n data-qa=\"filtered-emojis\"\n >\n <button\n v-for=\"(emoji, index) in filteredEmojis\"\n :key=\"emoji.shortname\"\n :ref=\"`filteredEmoji-${index}`\"\n type=\"button\"\n :aria-label=\"emoji.name\"\n :class=\"{\n 'hover-emoji': (index === 0 && hoverFirstEmoji),\n }\"\n @click=\"$emit('selected-emoji', emoji)\"\n @focusin=\"$emit('highlighted-emoji', emoji)\"\n @focusout=\"$emit('highlighted-emoji', null)\"\n @mouseover=\"hoverEmoji(emoji)\"\n @mouseleave=\"hoverEmoji(null)\"\n @keydown=\"event => handleKeyDownFilteredEmojis(event, index, emoji)\"\n >\n <img\n class=\"d-icon d-icon--size-500\"\n :alt=\"emoji.name\"\n :aria-label=\"emoji.name\"\n :title=\"emoji.name\"\n :src=\"`${CDN_URL + emoji.unicode_character}.png`\"\n >\n </button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport { emojisGrouped as emojisImported } from '@dialpad/dialtone-emojis';\nimport { CDN_URL, EMOJIS_PER_ROW } from '@/components/emoji_picker';\n\nexport default {\n name: 'EmojiSelector',\n\n props: {\n emojiFilter: {\n type: String,\n default: '',\n },\n\n skinTone: {\n type: String,\n required: true,\n },\n\n tabSetLabels: {\n type: Array,\n required: true,\n },\n\n selectedTabset: {\n type: Object,\n required: true,\n },\n\n searchResultsLabel: {\n type: String,\n required: true,\n },\n\n searchNoResultsLabel: {\n type: String,\n required: true,\n },\n\n recentlyUsedEmojis: {\n type: Array,\n default: () => [],\n },\n },\n\n data () {\n return {\n emojiRefs: [],\n emojiFilteredRefs: [],\n isFiltering: false,\n hoverFirstEmoji: true,\n fixedLabel: '',\n filteredEmojis: [],\n TABS_DATA: ['Recently used', 'People', 'Nature', 'Food', 'Activity', 'Travel', 'Objects', 'Symbols', 'Flags'],\n tabLabelObserver: null,\n };\n },\n\n computed: {\n currentEmojis () {\n return [\n ...this.emojis[`People${this.skinTone}`] || [],\n ...this.emojis.Nature || [],\n ...this.emojis.Food || [],\n ...this.emojis[`Activity${this.skinTone}`] || [],\n ...this.emojis.Travel || [],\n ...this.emojis[`Objects${this.skinTone}`] || [],\n ...this.emojis.Symbols || [],\n ...this.emojis.Flags || [],\n ];\n },\n\n emojis () {\n return emojisImported;\n },\n\n CDN_URL () {\n return CDN_URL;\n },\n\n tabLabels () {\n return this.recentlyUsedEmojis.length\n ? this.tabSetLabels.map((label, index) => ({ label, ref: this.$refs[`tabLabelRef-${index}`] }))\n : this.tabSetLabels.slice(1).map((label, index) => ({ label, ref: this.$refs[`tabLabelRef-${index}`] }));\n },\n\n tabs () {\n return this.recentlyUsedEmojis.length ? this.TABS_DATA : this.TABS_DATA.slice(1);\n },\n },\n\n watch: {\n currentEmojis: {\n handler () {\n this.searchByNameAndKeywords();\n },\n\n immediate: true,\n },\n\n recentlyUsedEmojis: {\n handler (newValue) {\n this.emojis['Recently used'] = newValue;\n },\n\n immediate: true,\n },\n\n emojiFilter: {\n handler (newFilter) {\n this.resetScroll();\n if (newFilter) {\n this.isFiltering = true;\n } else {\n this.isFiltering = false;\n this.$emit('highlighted-emoji', null);\n }\n\n this.debouncedSearch();\n },\n },\n\n selectedTabset: {\n handler (newValue) {\n this.scrollToTab(newValue.tabId);\n },\n\n deep: true,\n },\n },\n\n created () {\n this.debouncedSearch = this.debounce(this.searchByNameAndKeywords, 300);\n },\n\n mounted () {\n this.$nextTick(() => {\n this.setupEmojiRefs();\n this.setupFilteredRefs();\n this.setupTabLabelRefs();\n this.setTabLabelObserver();\n });\n },\n\n beforeDestroy () {\n if (this.tabLabelObserver) {\n this.tabLabelObserver.disconnect();\n }\n },\n\n methods: {\n setupTabLabelRefs () {\n this.tabSetLabels?.forEach((label, index) => {\n const refKey = `tabLabelRef-${index}`;\n if (this.$refs[refKey]) {\n this.$set(this.tabLabels, index, { label, ref: this.$refs[refKey] });\n }\n });\n },\n\n setupFilteredRefs () {\n // it is necessary to clean the array before setting the new refs\n this.emojiFilteredRefs = [];\n\n this.filteredEmojis.forEach((emoji, index) => {\n const refKey = `filteredEmoji-${index}`;\n if (this.$refs[refKey]) {\n this.setFilteredRef(this.$refs[refKey], index);\n }\n });\n },\n\n setupEmojiRefs () {\n for (let i = 0; i < this.tabs.length; i++) {\n const refKey = `emojiRef-${i}`;\n if (this.$refs[refKey]) {\n this.$refs[refKey].forEach((el, indexEmoji) => {\n if (el) {\n this.setEmojiRef(el, i, indexEmoji);\n }\n });\n }\n }\n },\n\n searchByNameAndKeywords () {\n const searchStr = this.emojiFilter.toLowerCase();\n this.filteredEmojis = this.currentEmojis.filter(function (obj) {\n const nameIncludesSearchStr = obj.name.toLowerCase().includes(searchStr);\n const keywordsIncludeSearchStr = obj.keywords.some(function (keyword) {\n return keyword.toLowerCase().includes(searchStr);\n });\n return nameIncludesSearchStr || keywordsIncludeSearchStr;\n });\n this.$nextTick(function () {\n if (searchStr) {\n this.hoverEmoji(this.filteredEmojis[0], true);\n this.setupFilteredRefs();\n }\n });\n },\n\n debounce: function (fn, delay) {\n if (delay === undefined) { delay = 300; }\n let timeout;\n return function () {\n const args = []; let len = arguments.length;\n while (len--) args[len] = arguments[len];\n\n clearTimeout(timeout);\n timeout = setTimeout(function () {\n fn.apply(undefined, args);\n }, delay);\n };\n },\n\n getImgSrc: function (emoji) {\n return this.CDN_URL + emoji + '.png';\n },\n\n handleImageError: function (event) {\n event.target.parentNode.style.display = 'none';\n },\n\n scrollToTab: function (tabIndex, focusFirstEmoji) {\n const vm = this;\n if (focusFirstEmoji === undefined) { focusFirstEmoji = true; }\n const tabLabel = vm.tabLabels[tabIndex - 1];\n const tabElement = tabLabel.ref[0];\n\n vm.$nextTick(function () {\n const container = vm.$refs.listRef;\n const offsetTop = tabIndex === '1' ? 0 : tabElement.offsetTop - 20;\n\n let isScrolling = true;\n let prevScrollTop = container.scrollTop;\n vm.$emit('is-scrolling', true);\n\n container.addEventListener('scroll', function () {\n if (isScrolling) {\n const scrollTop = container.scrollTop;\n if (\n (prevScrollTop < scrollTop && scrollTop >= offsetTop) ||\n (prevScrollTop > scrollTop && scrollTop <= offsetTop)\n ) {\n isScrolling = false;\n vm.$emit('is-scrolling', false);\n }\n prevScrollTop = scrollTop;\n }\n });\n\n container.scrollTop = offsetTop;\n\n if (focusFirstEmoji) {\n vm.focusEmoji(tabIndex - 1, 0);\n }\n });\n },\n\n resetScroll: function () {\n const container = this.$refs.listRef;\n container.scrollTop = 0;\n },\n\n focusEmojiSelector: function () {\n this.focusEmoji(0, 0);\n },\n\n hoverEmoji (emoji, isFirst) {\n if (isFirst === undefined) { isFirst = false; }\n this.hoverFirstEmoji = isFirst;\n this.$emit('highlighted-emoji', emoji);\n },\n\n setEmojiRef: function (el, indexTab, indexEmoji) {\n if (!this.emojiRefs[indexTab]) {\n this.$set(this.emojiRefs, indexTab, []);\n }\n this.$set(this.emojiRefs[indexTab], indexEmoji, el);\n },\n\n setFilteredRef: function (el, index) {\n this.$set(this.emojiFilteredRefs, index, el);\n },\n\n focusEmoji: function (indexTab, indexEmoji) {\n // eslint-disable-next-line max-len\n const emojiRef = this.isFiltering ? this.emojiFilteredRefs[indexEmoji]?.[0] : this.emojiRefs[indexTab] && this.emojiRefs[indexTab][indexEmoji];\n if (emojiRef) {\n emojiRef.focus();\n return true;\n }\n\n return false;\n },\n\n handleKeyDown: function (event, indexTab, indexEmoji, emoji) {\n event.preventDefault();\n\n if (event.key === 'ArrowUp') {\n const position = indexEmoji % EMOJIS_PER_ROW;\n\n if (indexTab === 0) {\n // we are on the first emoji tab, then we should jump to the last row of the last emoji tab\n const numberOfMissingEmojis =\n EMOJIS_PER_ROW - (this.emojiRefs[this.emojiRefs.length - 1].length % EMOJIS_PER_ROW);\n\n const emojiToJump =\n this.emojiRefs[this.emojiRefs.length - 1].length + numberOfMissingEmojis - (EMOJIS_PER_ROW - position);\n\n if (!this.focusEmoji(this.emojiRefs.length - 1, emojiToJump)) {\n // if there is no emoji in this position, jump to the last emoji of the row\n this.focusEmoji(this.emojiRefs.length - 1, this.emojiRefs[this.emojiRefs.length - 1].length - 1);\n }\n return;\n }\n\n // if we are not on the first tab, we should jump to the previous row of the current tab\n if (!this.focusEmoji(indexTab, indexEmoji - EMOJIS_PER_ROW)) {\n // if there is no previous row, we should jump to emoji in the sampe position of the previous tab\n const previousTab = indexTab - 1 < 0 ? 0 : indexTab - 1;\n const emojisInPreviousTab = this.emojiRefs[previousTab].length;\n const lastEmojiPosition = emojisInPreviousTab - (emojisInPreviousTab % EMOJIS_PER_ROW) + position;\n\n if (!this.focusEmoji(previousTab, lastEmojiPosition)) {\n // if there is no emoji in this position, jump to the last emoji of the row\n this.focusEmoji(indexTab - 1, this.emojiRefs[indexTab - 1].length - 1);\n }\n }\n }\n\n if (event.key === 'ArrowDown') {\n if (!this.focusEmoji(indexTab, indexEmoji + EMOJIS_PER_ROW)) {\n // if cannot go down\n\n // Calculate position from cell 0 to cell 8\n const position = indexEmoji % EMOJIS_PER_ROW;\n\n // check if it exists a next row in the current tab\n if (this.emojiRefs?.[indexTab]?.[indexEmoji + (EMOJIS_PER_ROW - position)]) {\n // if it exists, we should focus the last emoji of the next row in the current tab\n this.focusEmoji(indexTab, this.emojiRefs[indexTab].length - 1);\n // if we are at the end of the list it will do nothing\n } else {\n // We don't have next row, we are in the last of the tab, then jump\n // to the next tab but in the equal emoji position in row 0.\n\n if (!this.focusEmoji(indexTab + 1, position)) {\n // We are on the bottom!, should jump to the same position emoji in the first row of the first tabset\n // if it doesn't has, jump to the last\n if (!this.focusEmoji(0, position)) {\n this.focusEmoji(0, this.emojiRefs[0].length - 1);\n }\n }\n }\n }\n }\n\n if (event.key === 'ArrowLeft') {\n this.handleHorizontalNavigation('left', indexTab, indexEmoji);\n }\n\n if (event.key === 'ArrowRight') {\n this.handleHorizontalNavigation('right', indexTab, indexEmoji);\n }\n\n if (event.key === 'Tab') {\n if (this.focusEmoji(indexTab + 1, 0)) {\n this.scrollToTab((indexTab + 1) + 1, false);\n } else {\n // We are on the last emoji tabset, jump to the skin selector\n this.$emit('focus-skin-selector');\n }\n }\n\n if (event.key === 'Tab' && event.shiftKey) {\n if (this.focusEmoji(indexTab, 0) && indexTab > 0) {\n this.scrollToTab(indexTab, true);\n } else {\n this.scrollToTab(1, false);\n this.$emit('focus-search-input');\n }\n }\n\n if (event.key === 'Enter') {\n this.$emit('selected-emoji', emoji);\n }\n },\n\n handleHorizontalNavigation: function (direction, indexTab, indexEmoji) {\n if (this.isFiltering) {\n if (direction === 'left') {\n this.handleArrowLeftFiltered(indexTab, indexEmoji);\n } else if (direction === 'right') {\n this.handleArrowRightFiltered(indexTab, indexEmoji);\n }\n } else {\n if (direction === 'left') {\n this.handleArrowLeft(indexTab, indexEmoji);\n } else if (direction === 'right') {\n this.handleArrowRight(indexTab, indexEmoji);\n }\n }\n },\n\n handleArrowLeftFiltered: function (indexTab, indexEmoji) {\n if (!this.focusEmoji(0, indexEmoji - 1)) {\n this.focusEmoji(0, this.emojiFilteredRefs.length - 1);\n }\n },\n\n handleArrowRightFiltered: function (indexTab, indexEmoji) {\n if (!this.focusEmoji(0, indexEmoji + 1)) {\n this.focusEmoji(0, 0);\n }\n },\n\n handleArrowLeft: function (indexTab, indexEmoji) {\n if (!this.focusEmoji(indexTab, indexEmoji - 1)) {\n if (this.emojiRefs[indexTab - 1]) {\n this.focusEmoji(indexTab - 1, this.emojiRefs[indexTab - 1].length - 1);\n } else {\n this.focusEmoji(this.emojiRefs.length - 1, this.emojiRefs[this.emojiRefs.length - 1].length - 1);\n }\n }\n },\n\n handleArrowRight: function (indexTab, indexEmoji) {\n if (!this.focusEmoji(indexTab, indexEmoji + 1)) {\n if (!this.focusEmoji(indexTab + 1, 0)) {\n this.focusEmoji(0, 0);\n }\n }\n },\n\n handleKeyDownFilteredEmojis (event, indexEmoji, emoji) {\n event.preventDefault();\n this.hoverFirstEmoji = false;\n\n if (event.key === 'ArrowUp') {\n const position = indexEmoji % EMOJIS_PER_ROW;\n if (!this.focusEmoji(0, indexEmoji - EMOJIS_PER_ROW)) {\n const lastEmojiPosition =\n this.emojiFilteredRefs.length - (this.emojiFilteredRefs.length % EMOJIS_PER_ROW) + position;\n\n this.focusEmoji(0, lastEmojiPosition);\n\n if (!this.focusEmoji(0, lastEmojiPosition)) {\n this.focusEmoji(0, this.emojiFilteredRefs.length - 1);\n }\n }\n }\n\n if (event.key === 'ArrowDown') {\n if (!this.focusEmoji(0, indexEmoji + EMOJIS_PER_ROW)) {\n const position = indexEmoji % EMOJIS_PER_ROW;\n\n if (this.emojiFilteredRefs?.[indexEmoji + (EMOJIS_PER_ROW - position)]) {\n this.focusEmoji(0, this.emojiFilteredRefs.length - 1);\n } else {\n this.focusEmoji(0, position);\n }\n }\n }\n\n if (event.key === 'ArrowLeft') {\n this.handleHorizontalNavigation('left', 0, indexEmoji);\n }\n\n if (event.key === 'ArrowRight') {\n this.handleHorizontalNavigation('right', 0, indexEmoji);\n }\n\n if (event.key === 'Tab') {\n this.$emit('focus-skin-selector');\n }\n\n if (event.key === 'Enter') {\n this.$emit('selected-emoji', emoji);\n }\n },\n\n setTabLabelObserver () {\n this.tabLabelObserver = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n const { target } = entry;\n const index = parseInt(target.dataset.index);\n\n if (entry.isIntersecting && target.offsetTop <= this.$refs.tabCategoryRef?.offsetTop + 50) {\n this.fixedLabel = this.tabLabels[index - 1]?.label ?? this.tabLabels[0]?.label;\n this.$emit('scroll-into-tab', index - 1);\n } else if (entry.boundingClientRect.bottom <= this.$refs.tabCategoryRef?.getBoundingClientRect().bottom) {\n this.$emit('scroll-into-tab', index);\n this.fixedLabel = this.tabLabels[index]?.label;\n } else if (index === 1) {\n this.$emit('scroll-into-tab', index);\n this.fixedLabel = this.tabLabels[0]?.label;\n }\n });\n });\n\n this.tabLabelObserver.observe(this.$refs.tabCategoryRef);\n\n Array.from(this.$refs.listRef.children).forEach((child, index) => {\n this.tabLabelObserver.observe(child);\n child.dataset.index = index;\n });\n },\n\n focusLastEmoji () {\n this.focusEmoji(this.tabs.length - 1, 0);\n },\n\n },\n\n};\n</script>\n","export const CDN_URL = 'https://static.dialpadcdn.com/joypixels/png/unicode/32/';\nexport const EMOJIS_PER_ROW = 9;\nexport const EMOJI_PICKER_SKIN_TONE_MODIFIERS = {\n DEFAULT: 'Default',\n LIGHT: 'Light',\n MEDIUM_LIGHT: 'MediumLight',\n MEDIUM: 'Medium',\n MEDIUM_DARK: 'MediumDark',\n DARK: 'Dark',\n};\n\nexport const EMOJI_PICKER_CATEGORIES = {\n MOST_RECENTLY_USED: 'Most recently used',\n SMILEYS_AND_PEOPLE: 'Smileys and people',\n NATURE: 'Nature',\n FOOD: 'Food',\n ACTIVITY: 'Activity',\n TRAVEL: 'Travel',\n OBJECTS: 'Objects',\n SYMBOLS: 'Symbols',\n FLAGS: 'Flags',\n};\n\nexport default {\n EMOJI_PICKER_SKIN_TONE_MODIFIERS,\n EMOJI_PICKER_CATEGORIES,\n};\n","<template>\n <div class=\"d-emoji-picker__data\">\n <img\n v-if=\"emoji\"\n class=\"d-icon d-icon--size-500\"\n :alt=\"emoji.name\"\n :aria-label=\"emoji.name\"\n :title=\"emoji.name\"\n :src=\"`${CDN_URL + emoji.unicode_character}.png`\"\n >\n {{ emoji?.name }}\n </div>\n</template>\n\n<script>\nimport { CDN_URL } from '@/components/emoji_picker/emoji_picker_constants';\n\nexport default {\n name: 'EmojiDescription',\n\n props: {\n /**\n * Emoji data\n * @type {Object}\n * @default null\n */\n emoji: {\n type: Object,\n default: () => null,\n },\n },\n\n data () {\n return {\n CDN_URL,\n };\n },\n};\n</script>\n","<template>\n <div data-qa=\"skin-selector\">\n <div\n v-show=\"isOpen\"\n class=\"d-emoji-picker__skin-list\"\n >\n <button\n v-for=\"(skin, index) in skinList\"\n :key=\"skin.name\"\n :ref=\"`skinRef-${index}`\"\n :class=\"{\n 'selected': skinSelected?.skinCode === skin.skinCode,\n }\"\n @click=\"selectSkin(skin)\"\n @keydown=\"event => handleKeyDown(event, skin, index)\"\n >\n <img\n class=\"d-icon d-icon--size-500\"\n :alt=\"skin.name\"\n :aria-label=\"skin.name\"\n :title=\"skin.name\"\n :src=\"`${cdnUrl + skin.unicode_output}.png`\"\n >\n </button>\n </div>\n <div\n v-show=\"!isOpen\"\n class=\"d-emoji-picker__skin-selected\"\n >\n <dt-tooltip placement=\"top-end\">\n {{ skinSelectorButtonTooltipLabel }}\n <template #anchor>\n <button\n ref=\"skinSelectorRef\"\n :aria-label=\"skinSelectorButtonTooltipLabel\"\n tabindex=\"-1\"\n @click=\"toggleSkinList\"\n @keydown=\"event => handleKeyDown(event)\"\n >\n <img\n class=\"d-icon d-icon--size-500\"\n :alt=\"skinSelected?.name\"\n :aria-label=\"skinSelected?.name\"\n :title=\"skinSelected?.name\"\n :src=\"`${cdnUrl + skinSelected?.unicode_output}.png`\"\n >\n </button>\n </template>\n </dt-tooltip>\n </div>\n </div>\n</template>\n\n<script>\nimport DtTooltip from '@/components/tooltip/tooltip.vue';\nimport { CDN_URL, EMOJI_PICKER_SKIN_TONE_MODIFIERS } from '@/components/emoji_picker/emoji_picker_constants';\n\nexport default {\n name: 'EmojiSkinSelector',\n\n components: {\n DtTooltip,\n },\n\n props: {\n skinTone: {\n type: String,\n required: true,\n },\n\n isHovering: {\n type: Boolean,\n default: false,\n },\n\n skinSelectorButtonTooltipLabel: {\n type: String,\n required: true,\n },\n },\n\n data () {\n return {\n isOpen: false,\n skinSelected: null,\n skinsRef: [],\n cdnUrl: CDN_URL,\n };\n },\n\n computed: {\n skinPassedIn () {\n return this.skinList.find(skin => skin.skinTone === this.skinTone);\n },\n\n skinList () {\n return [\n {\n name: ':wave_tone1:',\n unicode_output: '1f44b-1f3fb',\n skinTone: EMOJI_PICKER_SKIN_TONE_MODIFIERS.LIGHT,\n skinCode: '_tone1',\n },\n {\n name: ':wave_tone2:',\n unicode_output: '1f44b-1f3fc',\n skinTone: EMOJI_PICKER_SKIN_TONE_MODIFIERS.MEDIUM_LIGHT,\n skinCode: '_tone2',\n },\n {\n name: ':wave_tone3:',\n unicode_output: '1f44b-1f3fd',\n skinTone: EMOJI_PICKER_SKIN_TONE_MODIFIERS.MEDIUM,\n skinCode: '_tone3',\n },\n {\n name: ':wave_tone4:',\n unicode_output: '1f44b-1f3fe',\n skinTone: EMOJI_PICKER_SKIN_TONE_MODIFIERS.MEDIUM_DARK,\n skinCode: '_tone4',\n },\n {\n name: ':wave_tone5:',\n unicode_output: '1f44b-1f3ff',\n skinTone: EMOJI_PICKER_SKIN_TONE_MODIFIERS.DARK,\n skinCode: '_tone5',\n },\n {\n name: ':wave:',\n unicode_output: '1f44b',\n skinTone: EMOJI_PICKER_SKIN_TONE_MODIFIERS.DEFAULT,\n skinCode: '',\n },\n ];\n },\n },\n\n watch: {\n isHovering (newVal) {\n if (newVal) {\n this.isOpen = false;\n }\n },\n\n skinTone (newVal, oldVal) {\n if (newVal !== oldVal) {\n this.skinSelected = this.skinPassedIn;\n }\n },\n },\n\n mounted () {\n this.skinSelected = this.skinPassedIn;\n this.$nextTick(() => {\n this.setupSkinRefs();\n });\n },\n\n methods: {\n setupSkinRefs () {\n this.skinList.forEach((skin, index) => {\n const refKey = `skinRef-${index}`;\n if (this.$refs[refKey]) {\n this.$set(this.skinsRef, index, this.$refs[refKey][0]);\n }\n });\n },\n\n focusSkinSelector () {\n if (this.$refs.skinSelectorRef) {\n this.$refs.skinSelectorRef.focus();\n }\n },\n\n selectSkin (skin) {\n this.skinSelected = skin;\n this.isOpen = false;\n this.$emit('skin-tone', skin.skinTone);\n this.$nextTick(() => {\n this.focusSkinSelector();\n });\n },\n\n handleKeyDown (event, skin, index) {\n event.preventDefault();\n\n if (event.key === 'ArrowLeft') {\n if (index === 0) this.skinsRef[this.skinsRef.length - 1]?.focus();\n this.skinsRef[index - 1]?.focus();\n }\n\n if (event.key === 'ArrowRight') {\n if (this.skinsRef.length) this.skinsRef[0]?.focus();\n this.skinsRef[index + 1]?.focus();\n }\n\n if (event.key === 'Enter') {\n if (skin) { this.selectSkin(skin); } else {\n this.toggleSkinList();\n }\n }\n\n if (event.key === 'Tab') {\n if (event.shiftKey) {\n this.$emit('focus-last-emoji');\n } else {\n this.$emit('focus-tabset');\n }\n }\n },\n\n toggleSkinList () {\n this.isOpen = !this.isOpen;\n this.$nextTick(() => {\n if (this.skinsRef[0]) {\n this.skinsRef[0].focus();\n }\n });\n },\n },\n};\n</script>\n","<template>\n <div\n class=\"d-emoji-picker\"\n >\n <div class=\"d-emoji-picker--header\">\n <emoji-tabset\n ref=\"tabsetRef\"\n :emoji-filter=\"searchQuery\"\n :show-recently-used-tab=\"showRecentlyUsedTab\"\n :scroll-into-tab=\"scrollIntoTab\"\n :tab-set-labels=\"tabSetLabels\"\n :is-scrolling=\"isScrolling\"\n @focus-search-input=\"$refs.searchInputRef.focusSearchInput()\"\n @focus-skin-selector=\"$refs.skinSelectorRef.focusSkinSelector()\"\n @selected-tabset=\"scrollToSelectedTabset\"\n @keydown.esc.native=\"$emit('close')\"\n />\n </div>\n <div class=\"d-emoji-picker--body\">\n <emoji-search\n ref=\"searchInputRef\"\n :model-value=\"searchQuery\"\n :search-placeholder-label=\"searchPlaceholderLabel\"\n @update:model-value=\"newValue => searchQuery = newValue\"\n @select-first-emoji=\"$emit('selected-emoji', highlightedEmoji)\"\n @focus-tabset=\"$refs.tabsetRef.focusTabset()\"\n @focus-emoji-selector=\"$refs.emojiSelectorRef.focusEmojiSelector()\"\n @keydown.esc.native=\"$emit('close')\"\n />\n <emoji-selector\n ref=\"emojiSelectorRef\"\n :emoji-filter=\"searchQuery\"\n :skin-tone=\"skinTone\"\n :tab-set-labels=\"tabSetLabels\"\n :search-results-label=\"searchResultsLabel\"\n :search-no-results-label=\"searchNoResultsLabel\"\n :recently-used-emojis=\"recentlyUsedEmojis\"\n :selected-tabset=\"selectedTabset\"\n @scroll-into-tab=\"updateScrollIntoTab\"\n @is-scrolling=\"updateIsScrolling\"\n @highlighted-emoji=\"updateHighlightedEmoji\"\n @selected-emoji=\"$emit('selected-emoji', $event)\"\n @focus-skin-selector=\"$refs.skinSelectorRef.focusSkinSelector()\"\n @focus-search-input=\"$refs.searchInputRef.focusSearchInput()\"\n @keydown.esc.native=\"$emit('close')\"\n />\n </div>\n <div class=\"d-emoji-picker--footer\">\n <emoji-description :emoji=\"highlightedEmoji\" />\n <emoji-skin-selector\n ref=\"skinSelectorRef\"\n :is-hovering=\"!!highlightedEmoji\"\n :skin-selector-button-tooltip-label=\"skinSelectorButtonTooltipLabel\"\n :skin-tone=\"skinTone\"\n @skin-tone=\"$emit('skin-tone', $event)\"\n @focus-tabset=\"$refs.tabsetRef.focusTabset()\"\n @focus-last-emoji=\"$refs.emojiSelectorRef.focusLastEmoji()\"\n @keydown.esc.native=\"$emit('close')\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport EmojiTabset from './modules/emoji_tabset.vue';\nimport EmojiSearch from './modules/emoji_search.vue';\nimport EmojiSelector from './modules/emoji_selector.vue';\nimport EmojiDescription from './modules/emoji_description.vue';\nimport EmojiSkinSelector from './modules/emoji_skin_selector.vue';\n\nexport default {\n name: 'DtEmojiPicker',\n\n components: {\n EmojiTabset,\n EmojiSearch,\n EmojiSelector,\n EmojiDescription,\n EmojiSkinSelector,\n },\n\n props: {\n recentlyUsedEmojis: {\n type: Array,\n },\n\n searchPlaceholderLabel: {\n type: String,\n required: true,\n },\n\n searchResultsLabel: {\n type: String,\n required: true,\n },\n\n searchNoResultsLabel: {\n type: String,\n required: true,\n },\n\n tabSetLabels: {\n type: Array,\n required: true,\n },\n\n skinTone: {\n type: String,\n },\n\n skinSelectorButtonTooltipLabel: {\n type: String,\n required: true,\n },\n },\n\n data () {\n return {\n searchQuery: '',\n highlightedEmoji: null,\n selectedTabset: {},\n scrollIntoTab: 0,\n isScrolling: false,\n };\n },\n\n computed: {\n showRecentlyUsedTab () {\n return this.recentlyUsedEmojis?.length > 0;\n },\n },\n\n methods: {\n scrollToSelectedTabset (tabId) {\n this.searchQuery = '';\n this.selectedTabset = { ...this.selectedTabset, tabId };\n },\n\n updateScrollIntoTab (value) {\n this.scrollIntoTab = value;\n },\n\n updateIsScrolling (value) {\n this.isScrolling = value;\n },\n\n updateHighlightedEmoji (emoji) {\n this.highlightedEmoji = emoji;\n },\n },\n};\n</script>\n"],"names":["_sfc_main","DtTabGroup","DtTab","DtIcon","EMOJI_PICKER_CATEGORIES","tab","index","newVal","id","skin","refKey","event","tabId","DtInput","value","emojisImported","CDN_URL","label","newValue","newFilter","_a","emoji","i","el","indexEmoji","searchStr","obj","nameIncludesSearchStr","keywordsIncludeSearchStr","keyword","fn","delay","timeout","args","len","tabIndex","focusFirstEmoji","vm","tabElement","container","offsetTop","isScrolling","prevScrollTop","scrollTop","isFirst","indexTab","emojiRef","position","EMOJIS_PER_ROW","numberOfMissingEmojis","emojiToJump","previousTab","emojisInPreviousTab","lastEmojiPosition","_b","direction","entries","entry","target","_c","_d","_e","_f","child","EMOJI_PICKER_SKIN_TONE_MODIFIERS","DtTooltip","oldVal","EmojiTabset","EmojiSearch","EmojiSelector","EmojiDescription","EmojiSkinSelector"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAmCA,MAAAA,IAAA;AAAA,EACA,MAAA;AAAA,EAEA,YAAA;AAAA,IACA,YAAAC;AAAA,IACA,OAAAC;AAAA,IACA,QAAAC;AAAA,EACA;AAAA,EAEA,OAAA;AAAA,IACA,qBAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,IACA;AAAA,IAEA,eAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,IAEA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,IACA;AAAA,IAEA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,IACA;AAAA,IAEA,cAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,OAAA;AACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA,CAAA;AAAA,MACA,WAAA;AAAA,QACA,EAAA,OAAAC,EAAA,oBAAA,MAAA,QAAA;AAAA,QACA,EAAA,OAAAA,EAAA,oBAAA,MAAA,YAAA;AAAA,QACA,EAAA,OAAAA,EAAA,QAAA,MAAA,eAAA;AAAA,QACA,EAAA,OAAAA,EAAA,MAAA,MAAA,OAAA;AAAA,QACA,EAAA,OAAAA,EAAA,UAAA,MAAA,SAAA;AAAA,QACA,EAAA,OAAAA,EAAA,QAAA,MAAA,iBAAA;AAAA,QACA,EAAA,OAAAA,EAAA,SAAA,MAAA,YAAA;AAAA,QACA,EAAA,OAAAA,EAAA,SAAA,MAAA,QAAA;AAAA,QACA,EAAA,OAAAA,EAAA,OAAA,MAAA,OAAA;AAAA,MACA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,UAAA;AAAA,IACA,OAAA;AAEA,cADA,KAAA,sBAAA,KAAA,YAAA,KAAA,UAAA,MAAA,CAAA,GACA,IAAA,CAAAC,GAAAC,OAAA;AAAA,QACA,GAAAD;AAAA,QACA,OAAA,KAAA,aAAAC,CAAA;AAAA,QACA,KAAAA,IAAA,GAAA,SAAA;AAAA,QACA,UAAAA,IAAA,GAAA,SAAA;AAAA,MACA,EAAA;AAAA,IACA;AAAA,IAEA,cAAA;AACA,aAAA,KAAA,YAAA,SAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,OAAA;AAAA,IACA,eAAA,SAAAC,GAAA;AACA,MAAA,CAAA,KAAA,eAAA,CAAA,KAAA,gBACA,KAAA,eAAAA,IAAA,GAAA,SAAA;AAAA,IAEA;AAAA,IAEA,aAAA,SAAAA,GAAA;AACA,MAAAA,MACA,KAAA,cAAA;AAAA,IAEA;AAAA,EACA;AAAA,EAEA,UAAA;AACA,SAAA,UAAA,MAAA;AACA,WAAA,aAAA;AAAA,IACA,CAAA;AAAA,EACA;AAAA,EAEA,SAAA;AAAA,IACA,aAAAC,GAAA;AACA,MAAA,KAAA,gBACA,KAAA,cAAAA,IAEA,KAAA,MAAA,mBAAAA,CAAA;AAAA,IACA;AAAA,IAEA,eAAA;AACA,WAAA,KAAA,QAAA,CAAAC,GAAAH,MAAA;AACA,cAAAI,IAAA,aAAAJ,CAAA;AACA,QAAA,KAAA,MAAAI,CAAA,KACA,KAAA,KAAA,KAAA,WAAAJ,GAAA,KAAA,MAAAI,CAAA,EAAA,CAAA,EAAA,GAAA;AAAA,MAEA,CAAA;AAAA,IACA;AAAA,IAEA,cAAA;AACA,MAAA,KAAA,UAAA,CAAA,KACA,KAAA,UAAA,CAAA,EAAA,MAAA;AAAA,IAEA;AAAA,IAEA,cAAAC,GAAAC,GAAA;AACA,MAAAD,EAAA,QAAA,YACA,KAAA,aAAAC,CAAA,GACA,KAAA,UAAAA,IAAA,CAAA,KACA,KAAA,UAAAA,IAAA,CAAA,EAAA,KAAA,IAIAD,EAAA,QAAA,UACAA,EAAA,eAAA,GACAA,EAAA,WACA,KAAA,MAAA,qBAAA,IAEA,KAAA,MAAA,oBAAA,IAIAA,EAAA,QAAA,eACA,KAAA,MAAA,oBAAA;AAAA,IAEA;AAAA,EACA;AACA;;;;;;;;;;;;;;;;;;;;;;qBCpIAX,IAAA;AAAA,EACA,MAAA;AAAA,EAEA,YAAA;AAAA,IACA,SAAAa;AAAA,IACA,QAAAV;AAAA,EACA;AAAA,EAEA,OAAA;AAAA,IACA,wBAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,IAEA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,UAAA;AACA,SAAA,iBAAA;AAAA,EACA;AAAA,EAEA,SAAA;AAAA,IACA,iBAAAW,GAAA;AACA,WAAA,MAAA,sBAAAA,CAAA;AAAA,IACA;AAAA,IAEA,qBAAA;AACA,WAAA,MAAA,sBAAA;AAAA,IACA;AAAA,IAEA,cAAA;AACA,WAAA,MAAA,cAAA;AAAA,IACA;AAAA,IAEA,mBAAA;AACA,WAAA,MAAA,oBAAA;AAAA,IACA;AAAA,IAEA,cAAA;AACA,WAAA,MAAA,sBAAA,EAAA,GACA,KAAA,iBAAA;AAAA,IACA;AAAA,IAEA,mBAAA;AACA,WAAA,MAAA,eAAA;IACA;AAAA,EACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;qBCkBAd,IAAA;AAAA,EACA,MAAA;AAAA,EAEA,OAAA;AAAA,IACA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,IACA;AAAA,IAEA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,IAEA,cAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,IAEA,gBAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,IAEA,oBAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,IAEA,sBAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,IAEA,oBAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,MAAA,CAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,OAAA;AACA,WAAA;AAAA,MACA,WAAA,CAAA;AAAA,MACA,mBAAA,CAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,gBAAA,CAAA;AAAA,MACA,WAAA,CAAA,iBAAA,UAAA,UAAA,QAAA,YAAA,UAAA,WAAA,WAAA,OAAA;AAAA,MACA,kBAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,UAAA;AAAA,IACA,gBAAA;AACA,aAAA;AAAA,QACA,GAAA,KAAA,OAAA,SAAA,KAAA,QAAA,EAAA,KAAA,CAAA;AAAA,QACA,GAAA,KAAA,OAAA,UAAA,CAAA;AAAA,QACA,GAAA,KAAA,OAAA,QAAA,CAAA;AAAA,QACA,GAAA,KAAA,OAAA,WAAA,KAAA,QAAA,EAAA,KAAA,CAAA;AAAA,QACA,GAAA,KAAA,OAAA,UAAA,CAAA;AAAA,QACA,GAAA,KAAA,OAAA,UAAA,KAAA,QAAA,EAAA,KAAA,CAAA;AAAA,QACA,GAAA,KAAA,OAAA,WAAA,CAAA;AAAA,QACA,GAAA,KAAA,OAAA,SAAA,CAAA;AAAA,MACA;AAAA,IACA;AAAA,IAEA,SAAA;AACA,aAAAe;AAAAA,IACA;AAAA,IAEA,UAAA;AACA,aAAAC;AAAA,IACA;AAAA,IAEA,YAAA;AACA,aAAA,KAAA,mBAAA,SACA,KAAA,aAAA,IAAA,CAAAC,GAAAX,OAAA,EAAA,OAAAW,GAAA,KAAA,KAAA,MAAA,eAAAX,CAAA,EAAA,EAAA,EAAA,IACA,KAAA,aAAA,MAAA,CAAA,EAAA,IAAA,CAAAW,GAAAX,OAAA,EAAA,OAAAW,GAAA,KAAA,KAAA,MAAA,eAAAX,CAAA,EAAA,EAAA,EAAA;AAAA,IACA;AAAA,IAEA,OAAA;AACA,aAAA,KAAA,mBAAA,SAAA,KAAA,YAAA,KAAA,UAAA,MAAA,CAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,OAAA;AAAA,IACA,eAAA;AAAA,MACA,UAAA;AACA,aAAA,wBAAA;AAAA,MACA;AAAA,MAEA,WAAA;AAAA,IACA;AAAA,IAEA,oBAAA;AAAA,MACA,QAAAY,GAAA;AACA,aAAA,OAAA,eAAA,IAAAA;AAAA,MACA;AAAA,MAEA,WAAA;AAAA,IACA;AAAA,IAEA,aAAA;AAAA,MACA,QAAAC,GAAA;AACA,aAAA,YAAA,GACAA,IACA,KAAA,cAAA,MAEA,KAAA,cAAA,IACA,KAAA,MAAA,qBAAA,IAAA,IAGA,KAAA,gBAAA;AAAA,MACA;AAAA,IACA;AAAA,IAEA,gBAAA;AAAA,MACA,QAAAD,GAAA;AACA,aAAA,YAAAA,EAAA,KAAA;AAAA,MACA;AAAA,MAEA,MAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,UAAA;AACA,SAAA,kBAAA,KAAA,SAAA,KAAA,yBAAA,GAAA;AAAA,EACA;AAAA,EAEA,UAAA;AACA,SAAA,UAAA,MAAA;AACA,WAAA,eAAA,GACA,KAAA,kBAAA,GACA,KAAA,kBAAA,GACA,KAAA,oBAAA;AAAA,IACA,CAAA;AAAA,EACA;AAAA,EAEA,gBAAA;AACA,IAAA,KAAA,oBACA,KAAA,iBAAA;EAEA;AAAA,EAEA,SAAA;AAAA,IACA,oBAAA;;AACA,OAAAE,IAAA,KAAA,iBAAA,QAAAA,EAAA,QAAA,CAAAH,GAAAX,MAAA;AACA,cAAAI,IAAA,eAAAJ,CAAA;AACA,QAAA,KAAA,MAAAI,CAAA,KACA,KAAA,KAAA,KAAA,WAAAJ,GAAA,EAAA,OAAAW,GAAA,KAAA,KAAA,MAAAP,CAAA,EAAA,CAAA;AAAA,MAEA;AAAA,IACA;AAAA,IAEA,oBAAA;AAEA,WAAA,oBAAA,IAEA,KAAA,eAAA,QAAA,CAAAW,GAAAf,MAAA;AACA,cAAAI,IAAA,iBAAAJ,CAAA;AACA,QAAA,KAAA,MAAAI,CAAA,KACA,KAAA,eAAA,KAAA,MAAAA,CAAA,GAAAJ,CAAA;AAAA,MAEA,CAAA;AAAA,IACA;AAAA,IAEA,iBAAA;AACA,eAAAgB,IAAA,GAAAA,IAAA,KAAA,KAAA,QAAAA,KAAA;AACA,cAAAZ,IAAA,YAAAY,CAAA;AACA,QAAA,KAAA,MAAAZ,CAAA,KACA,KAAA,MAAAA,CAAA,EAAA,QAAA,CAAAa,GAAAC,MAAA;AACA,UAAAD,KACA,KAAA,YAAAA,GAAAD,GAAAE,CAAA;AAAA,QAEA,CAAA;AAAA,MAEA;AAAA,IACA;AAAA,IAEA,0BAAA;AACA,YAAAC,IAAA,KAAA,YAAA,YAAA;AACA,WAAA,iBAAA,KAAA,cAAA,OAAA,SAAAC,GAAA;AACA,cAAAC,IAAAD,EAAA,KAAA,YAAA,EAAA,SAAAD,CAAA,GACAG,IAAAF,EAAA,SAAA,KAAA,SAAAG,GAAA;AACA,iBAAAA,EAAA,YAAA,EAAA,SAAAJ,CAAA;AAAA,QACA,CAAA;AACA,eAAAE,KAAAC;AAAA,MACA,CAAA,GACA,KAAA,UAAA,WAAA;AACA,QAAAH,MACA,KAAA,WAAA,KAAA,eAAA,CAAA,GAAA,EAAA,GACA,KAAA,kBAAA;AAAA,MAEA,CAAA;AAAA,IACA;AAAA,IAEA,UAAA,SAAAK,GAAAC,GAAA;AACA,MAAAA,MAAA,WAAAA,IAAA;AACA,UAAAC;AACA,aAAA,WAAA;AACA,cAAAC,IAAA,CAAA;AAAA,YAAAC,IAAA,UAAA;AACA,eAAAA;AAAA,UAAAD,EAAAC,CAAA,IAAA,UAAAA,CAAA;AAEA,qBAAAF,CAAA,GACAA,IAAA,WAAA,WAAA;AACA,UAAAF,EAAA,MAAA,QAAAG,CAAA;AAAA,QACA,GAAAF,CAAA;AAAA,MACA;AAAA,IACA;AAAA,IAEA,WAAA,SAAAV,GAAA;AACA,aAAA,KAAA,UAAAA,IAAA;AAAA,IACA;AAAA,IAEA,kBAAA,SAAAV,GAAA;AACA,MAAAA,EAAA,OAAA,WAAA,MAAA,UAAA;AAAA,IACA;AAAA,IAEA,aAAA,SAAAwB,GAAAC,GAAA;AACA,YAAAC,IAAA;AACA,MAAAD,MAAA,WAAAA,IAAA;AAEA,YAAAE,IADAD,EAAA,UAAAF,IAAA,CAAA,EACA,IAAA,CAAA;AAEA,MAAAE,EAAA,UAAA,WAAA;AACA,cAAAE,IAAAF,EAAA,MAAA,SACAG,IAAAL,MAAA,MAAA,IAAAG,EAAA,YAAA;AAEA,YAAAG,IAAA,IACAC,IAAAH,EAAA;AACA,QAAAF,EAAA,MAAA,gBAAA,EAAA,GAEAE,EAAA,iBAAA,UAAA,WAAA;AACA,cAAAE,GAAA;AACA,kBAAAE,IAAAJ,EAAA;AACA,aACAG,IAAAC,KAAAA,KAAAH,KACAE,IAAAC,KAAAA,KAAAH,OAEAC,IAAA,IACAJ,EAAA,MAAA,gBAAA,EAAA,IAEAK,IAAAC;AAAA,UACA;AAAA,QACA,CAAA,GAEAJ,EAAA,YAAAC,GAEAJ,KACAC,EAAA,WAAAF,IAAA,GAAA,CAAA;AAAA,MAEA,CAAA;AAAA,IACA;AAAA,IAEA,aAAA,WAAA;AACA,YAAAI,IAAA,KAAA,MAAA;AACA,MAAAA,EAAA,YAAA;AAAA,IACA;AAAA,IAEA,oBAAA,WAAA;AACA,WAAA,WAAA,GAAA,CAAA;AAAA,IACA;AAAA,IAEA,WAAAlB,GAAAuB,GAAA;AACA,MAAAA,MAAA,WAAAA,IAAA,KACA,KAAA,kBAAAA,GACA,KAAA,MAAA,qBAAAvB,CAAA;AAAA,IACA;AAAA,IAEA,aAAA,SAAAE,GAAAsB,GAAArB,GAAA;AACA,MAAA,KAAA,UAAAqB,CAAA,KACA,KAAA,KAAA,KAAA,WAAAA,GAAA,CAAA,CAAA,GAEA,KAAA,KAAA,KAAA,UAAAA,CAAA,GAAArB,GAAAD,CAAA;AAAA,IACA;AAAA,IAEA,gBAAA,SAAAA,GAAAjB,GAAA;AACA,WAAA,KAAA,KAAA,mBAAAA,GAAAiB,CAAA;AAAA,IACA;AAAA,IAEA,YAAA,SAAAsB,GAAArB,GAAA;;AAEA,YAAAsB,IAAA,KAAA,eAAA1B,IAAA,KAAA,kBAAAI,CAAA,MAAA,gBAAAJ,EAAA,KAAA,KAAA,UAAAyB,CAAA,KAAA,KAAA,UAAAA,CAAA,EAAArB,CAAA;AACA,aAAAsB,KACAA,EAAA,MAAA,GACA,MAGA;AAAA,IACA;AAAA,IAEA,eAAA,SAAAnC,GAAAkC,GAAArB,GAAAH,GAAA;;AAGA,UAFAV,EAAA,eAAA,GAEAA,EAAA,QAAA,WAAA;AACA,cAAAoC,IAAAvB,IAAAwB;AAEA,YAAAH,MAAA,GAAA;AAEA,gBAAAI,IACAD,IAAA,KAAA,UAAA,KAAA,UAAA,SAAA,CAAA,EAAA,SAAAA,GAEAE,IACA,KAAA,UAAA,KAAA,UAAA,SAAA,CAAA,EAAA,SAAAD,KAAAD,IAAAD;AAEA,UAAA,KAAA,WAAA,KAAA,UAAA,SAAA,GAAAG,CAAA,KAEA,KAAA,WAAA,KAAA,UAAA,SAAA,GAAA,KAAA,UAAA,KAAA,UAAA,SAAA,CAAA,EAAA,SAAA,CAAA;AAEA;AAAA,QACA;AAGA,YAAA,CAAA,KAAA,WAAAL,GAAArB,IAAAwB,CAAA,GAAA;AAEA,gBAAAG,IAAAN,IAAA,IAAA,IAAA,IAAAA,IAAA,GACAO,IAAA,KAAA,UAAAD,CAAA,EAAA,QACAE,IAAAD,IAAAA,IAAAJ,IAAAD;AAEA,UAAA,KAAA,WAAAI,GAAAE,CAAA,KAEA,KAAA,WAAAR,IAAA,GAAA,KAAA,UAAAA,IAAA,CAAA,EAAA,SAAA,CAAA;AAAA,QAEA;AAAA,MACA;AAEA,UAAAlC,EAAA,QAAA,eACA,CAAA,KAAA,WAAAkC,GAAArB,IAAAwB,CAAA,GAAA;AAIA,cAAAD,IAAAvB,IAAAwB;AAGA,SAAAM,KAAAlC,IAAA,KAAA,cAAA,gBAAAA,EAAAyB,OAAA,QAAAS,EAAA9B,KAAAwB,IAAAD,MAEA,KAAA,WAAAF,GAAA,KAAA,UAAAA,CAAA,EAAA,SAAA,CAAA,IAMA,KAAA,WAAAA,IAAA,GAAAE,CAAA,KAGA,KAAA,WAAA,GAAAA,CAAA,KACA,KAAA,WAAA,GAAA,KAAA,UAAA,CAAA,EAAA,SAAA,CAAA;AAAA,MAIA;AAGA,MAAApC,EAAA,QAAA,eACA,KAAA,2BAAA,QAAAkC,GAAArB,CAAA,GAGAb,EAAA,QAAA,gBACA,KAAA,2BAAA,SAAAkC,GAAArB,CAAA,GAGAb,EAAA,QAAA,UACA,KAAA,WAAAkC,IAAA,GAAA,CAAA,IACA,KAAA,YAAAA,IAAA,IAAA,GAAA,EAAA,IAGA,KAAA,MAAA,qBAAA,IAIAlC,EAAA,QAAA,SAAAA,EAAA,aACA,KAAA,WAAAkC,GAAA,CAAA,KAAAA,IAAA,IACA,KAAA,YAAAA,GAAA,EAAA,KAEA,KAAA,YAAA,GAAA,EAAA,GACA,KAAA,MAAA,oBAAA,KAIAlC,EAAA,QAAA,WACA,KAAA,MAAA,kBAAAU,CAAA;AAAA,IAEA;AAAA,IAEA,4BAAA,SAAAkC,GAAAV,GAAArB,GAAA;AACA,MAAA,KAAA,cACA+B,MAAA,SACA,KAAA,wBAAAV,GAAArB,CAAA,IACA+B,MAAA,WACA,KAAA,yBAAAV,GAAArB,CAAA,IAGA+B,MAAA,SACA,KAAA,gBAAAV,GAAArB,CAAA,IACA+B,MAAA,WACA,KAAA,iBAAAV,GAAArB,CAAA;AAAA,IAGA;AAAA,IAEA,yBAAA,SAAAqB,GAAArB,GAAA;AACA,MAAA,KAAA,WAAA,GAAAA,IAAA,CAAA,KACA,KAAA,WAAA,GAAA,KAAA,kBAAA,SAAA,CAAA;AAAA,IAEA;AAAA,IAEA,0BAAA,SAAAqB,GAAArB,GAAA;AACA,MAAA,KAAA,WAAA,GAAAA,IAAA,CAAA,KACA,KAAA,WAAA,GAAA,CAAA;AAAA,IAEA;AAAA,IAEA,iBAAA,SAAAqB,GAAArB,GAAA;AACA,MAAA,KAAA,WAAAqB,GAAArB,IAAA,CAAA,MACA,KAAA,UAAAqB,IAAA,CAAA,IACA,KAAA,WAAAA,IAAA,GAAA,KAAA,UAAAA,IAAA,CAAA,EAAA,SAAA,CAAA,IAEA,KAAA,WAAA,KAAA,UAAA,SAAA,GAAA,KAAA,UAAA,KAAA,UAAA,SAAA,CAAA,EAAA,SAAA,CAAA;AAAA,IAGA;AAAA,IAEA,kBAAA,SAAAA,GAAArB,GAAA;AACA,MAAA,KAAA,WAAAqB,GAAArB,IAAA,CAAA,KACA,KAAA,WAAAqB,IAAA,GAAA,CAAA,KACA,KAAA,WAAA,GAAA,CAAA;AAAA,IAGA;AAAA,IAEA,4BAAAlC,GAAAa,GAAAH,GAAA;;AAIA,UAHAV,EAAA,eAAA,GACA,KAAA,kBAAA,IAEAA,EAAA,QAAA,WAAA;AACA,cAAAoC,IAAAvB,IAAAwB;AACA,YAAA,CAAA,KAAA,WAAA,GAAAxB,IAAAwB,CAAA,GAAA;AACA,gBAAAK,IACA,KAAA,kBAAA,SAAA,KAAA,kBAAA,SAAAL,IAAAD;AAEA,eAAA,WAAA,GAAAM,CAAA,GAEA,KAAA,WAAA,GAAAA,CAAA,KACA,KAAA,WAAA,GAAA,KAAA,kBAAA,SAAA,CAAA;AAAA,QAEA;AAAA,MACA;AAEA,UAAA1C,EAAA,QAAA,eACA,CAAA,KAAA,WAAA,GAAAa,IAAAwB,CAAA,GAAA;AACA,cAAAD,IAAAvB,IAAAwB;AAEA,SAAA5B,IAAA,KAAA,sBAAA,QAAAA,EAAAI,KAAAwB,IAAAD,MACA,KAAA,WAAA,GAAA,KAAA,kBAAA,SAAA,CAAA,IAEA,KAAA,WAAA,GAAAA,CAAA;AAAA,MAEA;AAGA,MAAApC,EAAA,QAAA,eACA,KAAA,2BAAA,QAAA,GAAAa,CAAA,GAGAb,EAAA,QAAA,gBACA,KAAA,2BAAA,SAAA,GAAAa,CAAA,GAGAb,EAAA,QAAA,SACA,KAAA,MAAA,qBAAA,GAGAA,EAAA,QAAA,WACA,KAAA,MAAA,kBAAAU,CAAA;AAAA,IAEA;AAAA,IAEA,sBAAA;AACA,WAAA,mBAAA,IAAA,qBAAA,CAAAmC,MAAA;AACA,QAAAA,EAAA,QAAA,CAAAC,MAAA;;AACA,gBAAA,EAAA,QAAAC,EAAA,IAAAD,GACAnD,IAAA,SAAAoD,EAAA,QAAA,KAAA;AAEA,UAAAD,EAAA,kBAAAC,EAAA,eAAAtC,IAAA,KAAA,MAAA,mBAAA,gBAAAA,EAAA,aAAA,MACA,KAAA,eAAAkC,IAAA,KAAA,UAAAhD,IAAA,CAAA,MAAA,gBAAAgD,EAAA,YAAAK,IAAA,KAAA,UAAA,CAAA,MAAA,gBAAAA,EAAA,QACA,KAAA,MAAA,mBAAArD,IAAA,CAAA,KACAmD,EAAA,mBAAA,YAAAG,IAAA,KAAA,MAAA,mBAAA,gBAAAA,EAAA,wBAAA,WACA,KAAA,MAAA,mBAAAtD,CAAA,GACA,KAAA,cAAAuD,IAAA,KAAA,UAAAvD,CAAA,MAAA,gBAAAuD,EAAA,SACAvD,MAAA,MACA,KAAA,MAAA,mBAAAA,CAAA,GACA,KAAA,cAAAwD,IAAA,KAAA,UAAA,CAAA,MAAA,gBAAAA,EAAA;AAAA,QAEA,CAAA;AAAA,MACA,CAAA,GAEA,KAAA,iBAAA,QAAA,KAAA,MAAA,cAAA,GAEA,MAAA,KAAA,KAAA,MAAA,QAAA,QAAA,EAAA,QAAA,CAAAC,GAAAzD,MAAA;AACA,aAAA,iBAAA,QAAAyD,CAAA,GACAA,EAAA,QAAA,QAAAzD;AAAA,MACA,CAAA;AAAA,IACA;AAAA,IAEA,iBAAA;AACA,WAAA,WAAA,KAAA,KAAA,SAAA,GAAA,CAAA;AAAA,IACA;AAAA,EAEA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBCzmBaU,IAAU,2DACVgC,IAAiB,GACjBgB,IAAmC;AAAA,EAC9C,SAAS;AAAA,EACT,OAAO;AAAA,EACP,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,MAAM;AACR,GAEa5D,IAA0B;AAAA,EACrC,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACT,GCJAJ,IAAA;AAAA,EACA,MAAA;AAAA,EAEA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,MAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,OAAA;AACA,WAAA;AAAA,MACA,SAAAgB;AAAA,IACA;AAAA,EACA;AACA;;;;;;;;;;;;;;;qBCoBAhB,IAAA;AAAA,EACA,MAAA;AAAA,EAEA,YAAA;AAAA,IACA,WAAAiE;AAAA,EACA;AAAA,EAEA,OAAA;AAAA,IACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,IAEA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,IACA;AAAA,IAEA,gCAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,OAAA;AACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA,CAAA;AAAA,MACA,QAAAjD;AAAA,IACA;AAAA,EACA;AAAA,EAEA,UAAA;AAAA,IACA,eAAA;AACA,aAAA,KAAA,SAAA,KAAA,CAAAP,MAAAA,EAAA,aAAA,KAAA,QAAA;AAAA,IACA;AAAA,IAEA,WAAA;AACA,aAAA;AAAA,QACA;AAAA,UACA,MAAA;AAAA,UACA,gBAAA;AAAA,UACA,UAAAuD,EAAA;AAAA,UACA,UAAA;AAAA,QACA;AAAA,QACA;AAAA,UACA,MAAA;AAAA,UACA,gBAAA;AAAA,UACA,UAAAA,EAAA;AAAA,UACA,UAAA;AAAA,QACA;AAAA,QACA;AAAA,UACA,MAAA;AAAA,UACA,gBAAA;AAAA,UACA,UAAAA,EAAA;AAAA,UACA,UAAA;AAAA,QACA;AAAA,QACA;AAAA,UACA,MAAA;AAAA,UACA,gBAAA;AAAA,UACA,UAAAA,EAAA;AAAA,UACA,UAAA;AAAA,QACA;AAAA,QACA;AAAA,UACA,MAAA;AAAA,UACA,gBAAA;AAAA,UACA,UAAAA,EAAA;AAAA,UACA,UAAA;AAAA,QACA;AAAA,QACA;AAAA,UACA,MAAA;AAAA,UACA,gBAAA;AAAA,UACA,UAAAA,EAAA;AAAA,UACA,UAAA;AAAA,QACA;AAAA,MACA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,OAAA;AAAA,IACA,WAAAzD,GAAA;AACA,MAAAA,MACA,KAAA,SAAA;AAAA,IAEA;AAAA,IAEA,SAAAA,GAAA2D,GAAA;AACA,MAAA3D,MAAA2D,MACA,KAAA,eAAA,KAAA;AAAA,IAEA;AAAA,EACA;AAAA,EAEA,UAAA;AACA,SAAA,eAAA,KAAA,cACA,KAAA,UAAA,MAAA;AACA,WAAA,cAAA;AAAA,IACA,CAAA;AAAA,EACA;AAAA,EAEA,SAAA;AAAA,IACA,gBAAA;AACA,WAAA,SAAA,QAAA,CAAAzD,GAAAH,MAAA;AACA,cAAAI,IAAA,WAAAJ,CAAA;AACA,QAAA,KAAA,MAAAI,CAAA,KACA,KAAA,KAAA,KAAA,UAAAJ,GAAA,KAAA,MAAAI,CAAA,EAAA,CAAA,CAAA;AAAA,MAEA,CAAA;AAAA,IACA;AAAA,IAEA,oBAAA;AACA,MAAA,KAAA,MAAA,mBACA,KAAA,MAAA,gBAAA;IAEA;AAAA,IAEA,WAAAD,GAAA;AACA,WAAA,eAAAA,GACA,KAAA,SAAA,IACA,KAAA,MAAA,aAAAA,EAAA,QAAA,GACA,KAAA,UAAA,MAAA;AACA,aAAA,kBAAA;AAAA,MACA,CAAA;AAAA,IACA;AAAA,IAEA,cAAAE,GAAAF,GAAAH,GAAA;;AACA,MAAAK,EAAA,eAAA,GAEAA,EAAA,QAAA,gBACAL,MAAA,OAAAc,IAAA,KAAA,SAAA,KAAA,SAAA,SAAA,CAAA,MAAA,QAAAA,EAAA,WACAkC,IAAA,KAAA,SAAAhD,IAAA,CAAA,MAAA,QAAAgD,EAAA,UAGA3C,EAAA,QAAA,iBACA,KAAA,SAAA,YAAAgD,IAAA,KAAA,SAAA,CAAA,MAAA,QAAAA,EAAA,WACAC,IAAA,KAAA,SAAAtD,IAAA,CAAA,MAAA,QAAAsD,EAAA,UAGAjD,EAAA,QAAA,YACAF,IAAA,KAAA,WAAAA,CAAA,IACA,KAAA,eAAA,IAIAE,EAAA,QAAA,UACAA,EAAA,WACA,KAAA,MAAA,kBAAA,IAEA,KAAA,MAAA,cAAA;AAAA,IAGA;AAAA,IAEA,iBAAA;AACA,WAAA,SAAA,CAAA,KAAA,QACA,KAAA,UAAA,MAAA;AACA,QAAA,KAAA,SAAA,CAAA,KACA,KAAA,SAAA,CAAA,EAAA,MAAA;AAAA,MAEA,CAAA;AAAA,IACA;AAAA,EACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;qBCtJAX,IAAA;AAAA,EACA,MAAA;AAAA,EAEA,YAAA;AAAA,IACA,aAAAmE;AAAA,IACA,aAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,mBAAAC;AAAA,EACA;AAAA,EAEA,OAAA;AAAA,IACA,oBAAA;AAAA,MACA,MAAA;AAAA,IACA;AAAA,IAEA,wBAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,IAEA,oBAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,IAEA,sBAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,IAEA,cAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,IAEA,UAAA;AAAA,MACA,MAAA;AAAA,IACA;AAAA,IAEA,gCAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,OAAA;AACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,kBAAA;AAAA,MACA,gBAAA,CAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,UAAA;AAAA,IACA,sBAAA;;AACA,eAAAnD,IAAA,KAAA,uBAAA,gBAAAA,EAAA,UAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,SAAA;AAAA,IACA,uBAAAR,GAAA;AACA,WAAA,cAAA,IACA,KAAA,iBAAA,EAAA,GAAA,KAAA,gBAAA,OAAAA,EAAA;AAAA,IACA;AAAA,IAEA,oBAAAE,GAAA;AACA,WAAA,gBAAAA;AAAA,IACA;AAAA,IAEA,kBAAAA,GAAA;AACA,WAAA,cAAAA;AAAA,IACA;AAAA,IAEA,uBAAAO,GAAA;AACA,WAAA,mBAAAA;AAAA,IACA;AAAA,EACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { n } from "../chunks/_plugin-vue2_normalizer-u6G_3nkj.js";
|
|
2
|
+
import { DtTooltip as m } from "./tooltip.js";
|
|
3
|
+
import { DtButton as s } from "./button.js";
|
|
4
|
+
import { D as a } from "../chunks/index-o4OMWMuv.js";
|
|
5
|
+
import { DtEmojiTextWrapper as c } from "./emoji-text-wrapper.js";
|
|
6
|
+
import "../chunks/popover_constants-qjlEkroB.js";
|
|
7
|
+
import "tippy.js";
|
|
8
|
+
import "./utils.js";
|
|
9
|
+
import "./constants.js";
|
|
10
|
+
import "vue";
|
|
11
|
+
import "./lazy-show.js";
|
|
12
|
+
import "../chunks/link_constants-vIUB92L4.js";
|
|
13
|
+
import "emoji-regex";
|
|
14
|
+
import "emoji-toolkit/emoji_strategy.json";
|
|
15
|
+
import "./skeleton.js";
|
|
16
|
+
import "../chunks/icon_constants-OpYAAKwF.js";
|
|
17
|
+
import "@dialpad/dialtone-icons/icons.json";
|
|
18
|
+
const p = [
|
|
19
|
+
"emojiUnicodeOrShortname",
|
|
20
|
+
"isSelected",
|
|
21
|
+
"ariaLabel",
|
|
22
|
+
"tooltip",
|
|
23
|
+
"num"
|
|
24
|
+
], l = {
|
|
25
|
+
name: "DtRecipeEmojiRow",
|
|
26
|
+
components: { DtTooltip: m, DtButton: s, DtEmoji: a, DtEmojiTextWrapper: c },
|
|
27
|
+
mixins: [],
|
|
28
|
+
props: {
|
|
29
|
+
/**
|
|
30
|
+
* Provide an array of reaction objects to be shown.
|
|
31
|
+
*/
|
|
32
|
+
reactions: {
|
|
33
|
+
type: Array,
|
|
34
|
+
default: () => [],
|
|
35
|
+
validator: (i) => {
|
|
36
|
+
for (const t of i)
|
|
37
|
+
if (!p.every((e) => t[e] !== void 0))
|
|
38
|
+
return !1;
|
|
39
|
+
return !0;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
emits: [
|
|
44
|
+
"emoji-clicked",
|
|
45
|
+
"emoji-hovered"
|
|
46
|
+
],
|
|
47
|
+
methods: {
|
|
48
|
+
emojiClicked(i) {
|
|
49
|
+
this.$emit("emoji-clicked", i.emojiUnicodeOrShortname);
|
|
50
|
+
},
|
|
51
|
+
emojiHovered(i, t) {
|
|
52
|
+
this.$emit("emoji-hovered", {
|
|
53
|
+
reaction: i.emojiUnicodeOrShortname,
|
|
54
|
+
state: t
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
var d = function() {
|
|
60
|
+
var t = this, o = t._self._c;
|
|
61
|
+
return o("span", { staticClass: "dt-emoji-row" }, [t._l(t.reactions, function(e) {
|
|
62
|
+
return o("span", { key: e.unicodeOutput, attrs: { reaction: e } }, [o("dt-tooltip", { staticClass: "dt-emoji-row__tooltip", attrs: { "content-class": "d-wmx464", sticky: "popper" }, on: { shown: (r) => t.emojiHovered(e, r) }, scopedSlots: t._u([{ key: "anchor", fn: function({ attrs: r }) {
|
|
63
|
+
return [o("dt-button", { class: ["dt-emoji-row__reaction", e.isSelected ? "dt-emoji-row__reaction--selected" : ""], attrs: { importance: "clear", size: "sm", "data-qa": "feed-item-reaction-button", "aria-label": e.ariaLabel, attrs: r }, on: { click: function(j) {
|
|
64
|
+
return t.emojiClicked(e);
|
|
65
|
+
} } }, [o("span", { staticClass: "dt-emoji-row__emoji" }, [o("dt-emoji", { attrs: { size: "200", code: e.emojiUnicodeOrShortname } })], 1), o("span", { staticClass: "dt-emoji-row__reaction-number" }, [t._v(" " + t._s(e.num) + " ")])])];
|
|
66
|
+
} }], null, !0) }, [o("span", { attrs: { "aria-hidden": "true" } }, [o("dt-emoji-text-wrapper", { attrs: { size: "200" } }, [t._v(" " + t._s(e.tooltip) + " ")])], 1)])], 1);
|
|
67
|
+
}), t._t("picker")], 2);
|
|
68
|
+
}, _ = [], u = /* @__PURE__ */ n(
|
|
69
|
+
l,
|
|
70
|
+
d,
|
|
71
|
+
_,
|
|
72
|
+
!1,
|
|
73
|
+
null,
|
|
74
|
+
null,
|
|
75
|
+
null,
|
|
76
|
+
null
|
|
77
|
+
);
|
|
78
|
+
const I = u.exports;
|
|
79
|
+
export {
|
|
80
|
+
I as DtRecipeEmojiRow,
|
|
81
|
+
p as REACTIONS_ATTRIBUTES
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=emoji-row.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emoji-row.js","sources":["../../recipes/conversation_view/emoji_row/emoji_row_constants.js","../../recipes/conversation_view/emoji_row/emoji_row.vue"],"sourcesContent":["export const REACTIONS_ATTRIBUTES = [\n 'emojiUnicodeOrShortname',\n 'isSelected',\n 'ariaLabel',\n 'tooltip',\n 'num',\n];\n\nexport default {\n REACTIONS_ATTRIBUTES,\n};\n","<template>\n <span class=\"dt-emoji-row\">\n <span\n v-for=\"reaction in reactions\"\n :key=\"reaction.unicodeOutput\"\n :reaction=\"reaction\"\n >\n <dt-tooltip\n class=\"dt-emoji-row__tooltip\"\n content-class=\"d-wmx464\"\n sticky=\"popper\"\n @shown=\"(shown) => emojiHovered(reaction, shown)\"\n >\n <span aria-hidden=\"true\">\n <dt-emoji-text-wrapper size=\"200\">\n {{ reaction.tooltip }}\n </dt-emoji-text-wrapper>\n </span>\n <template #anchor=\"{ attrs }\">\n <dt-button\n importance=\"clear\"\n size=\"sm\"\n data-qa=\"feed-item-reaction-button\"\n :class=\"['dt-emoji-row__reaction', reaction.isSelected ? 'dt-emoji-row__reaction--selected' : '']\"\n :aria-label=\"reaction.ariaLabel\"\n :attrs=\"attrs\"\n @click=\"emojiClicked(reaction)\"\n >\n <span class=\"dt-emoji-row__emoji\">\n <dt-emoji\n size=\"200\"\n :code=\"reaction.emojiUnicodeOrShortname\"\n />\n </span>\n <span class=\"dt-emoji-row__reaction-number\">\n {{ reaction.num }}\n </span>\n </dt-button>\n </template>\n </dt-tooltip>\n </span>\n <!-- @slot Slot for emoji picker component, including the anchor. -->\n <slot name=\"picker\" />\n </span>\n</template>\n\n<script>\nimport { REACTIONS_ATTRIBUTES } from './emoji_row_constants.js';\nimport { DtButton } from '../../../components/button';\nimport { DtTooltip } from '../../../components/tooltip';\nimport { DtEmoji } from '../../../components/emoji';\nimport { DtEmojiTextWrapper } from '../../../components/emoji_text_wrapper';\n\nexport default {\n name: 'DtRecipeEmojiRow',\n\n components: { DtTooltip, DtButton, DtEmoji, DtEmojiTextWrapper },\n\n mixins: [],\n\n props: {\n /**\n * Provide an array of reaction objects to be shown.\n */\n reactions: {\n type: Array,\n default: () => [],\n validator: (reactions) => {\n for (const reaction of reactions) {\n const validInput = REACTIONS_ATTRIBUTES.every((attribute) => reaction[attribute] !== undefined ?? false);\n if (!validInput) return false;\n }\n return true;\n },\n },\n },\n\n emits: [\n 'emoji-clicked',\n 'emoji-hovered',\n ],\n\n methods: {\n emojiClicked (reaction) {\n this.$emit('emoji-clicked', reaction.emojiUnicodeOrShortname);\n },\n\n emojiHovered (reaction, state) {\n this.$emit('emoji-hovered', {\n reaction: reaction.emojiUnicodeOrShortname,\n state,\n });\n },\n },\n};\n</script>\n\n<style lang=\"less\">\n.dt-emoji-row {\n display: flex;\n flex-wrap: wrap;\n gap: var(--dt-space-300);\n\n &__tooltip {\n display: inline-block;\n }\n\n &__reaction {\n --emoji-item-color-inset-shadow: transparent;\n --emoji-item-color-foreground: var(--dt-action-color-foreground-muted-default);\n --emoji-item-color-background: var(--dt-action-color-background-muted-hover);\n\n padding: var(--dt-space-300) var(--dt-space-400);\n border-radius: var(--dt-size-radius-pill);\n border: 0;\n color: var(--emoji-item-color-foreground);\n background-color: var(--emoji-item-color-background);\n box-shadow: inset 0 0 0 var(--dt-size-border-150) var(--emoji-item-color-inset-shadow);\n height: var(--dt-size-550);\n\n &.dt-emoji-row__picker {\n padding: var(--dt-space-200) var(--dt-space-350);\n }\n\n &:hover {\n --emoji-item-color-inset-shadow: var(--dt-color-border-subtle);\n --emoji-item-color-foreground: var(--dt-action-color-foreground-muted-hover);\n }\n\n &:active {\n --emoji-item-color-background: var(--dt-action-color-background-muted-active);\n --emoji-item-color-foreground: var(--dt-action-color-foreground-muted-active);\n\n transform: scale(.98);\n }\n\n &--selected {\n --emoji-item-color-inset-shadow: var(--dt-color-border-brand);\n --emoji-item-color-foreground: var(--dt-color-link-primary);\n --emoji-item-color-background: var(--dt-action-color-background-base-hover);\n\n .dt-emoji-row__reaction-number {\n font-weight: var(--dt-font-weight-bold);\n }\n\n &:hover {\n --emoji-item-color-inset-shadow: var(--dt-color-border-brand-strong);\n --emoji-item-color-foreground: var(--dt-color-link-primary-hover);\n }\n\n &:active {\n --emoji-item-color-background: var(--dt-action-color-background-base-active);\n }\n }\n }\n\n &__emoji {\n margin-right: var(--dt-space-300);\n display: inline-flex;\n }\n\n &__reaction-number {\n font: var(--dt-typography-body-sm);\n font-variant: tabular-nums;\n }\n}\n</style>\n"],"names":["REACTIONS_ATTRIBUTES","_sfc_main","DtTooltip","DtButton","DtEmoji","DtEmojiTextWrapper","reactions","reaction","attribute","state"],"mappings":";;;;;;;;;;;;;;;;;AAAY,MAACA,IAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GC+CAC,IAAA;AAAA,EACA,MAAA;AAAA,EAEA,YAAA,EAAA,WAAAC,GAAA,UAAAC,GAAA,SAAAC,GAAA,oBAAAC,EAAA;AAAA,EAEA,QAAA,CAAA;AAAA,EAEA,OAAA;AAAA;AAAA;AAAA;AAAA,IAIA,WAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,MAAA,CAAA;AAAA,MACA,WAAA,CAAAC,MAAA;AACA,mBAAAC,KAAAD;AAEA,cAAA,CADAN,EAAA,MAAA,CAAAQ,MAAAD,EAAAC,CAAA,MAAA,MAAA;AACA,mBAAA;AAEA,eAAA;AAAA,MACA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,OAAA;AAAA,IACA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,SAAA;AAAA,IACA,aAAAD,GAAA;AACA,WAAA,MAAA,iBAAAA,EAAA,uBAAA;AAAA,IACA;AAAA,IAEA,aAAAA,GAAAE,GAAA;AACA,WAAA,MAAA,iBAAA;AAAA,QACA,UAAAF,EAAA;AAAA,QACA,OAAAE;AAAA,MACA,CAAA;AAAA,IACA;AAAA,EACA;AACA;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import { D as o,
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import { D as o, p as i, r as a } from "../chunks/index-o4OMWMuv.js";
|
|
2
|
+
import { I as l } from "../chunks/icon_constants-OpYAAKwF.js";
|
|
3
|
+
import { n as p } from "../chunks/_plugin-vue2_normalizer-u6G_3nkj.js";
|
|
4
|
+
import "emoji-regex";
|
|
5
|
+
import "emoji-toolkit/emoji_strategy.json";
|
|
6
|
+
import "./skeleton.js";
|
|
7
|
+
import "@dialpad/dialtone-icons/icons.json";
|
|
8
|
+
const c = {
|
|
4
9
|
name: "DtEmojiTextWrapper",
|
|
5
10
|
components: {
|
|
6
11
|
DtEmoji: o
|
|
@@ -19,7 +24,7 @@ const p = {
|
|
|
19
24
|
size: {
|
|
20
25
|
type: String,
|
|
21
26
|
default: "500",
|
|
22
|
-
validator: (e) => Object.keys(
|
|
27
|
+
validator: (e) => Object.keys(l).includes(e)
|
|
23
28
|
}
|
|
24
29
|
},
|
|
25
30
|
data() {
|
|
@@ -37,9 +42,9 @@ const p = {
|
|
|
37
42
|
*/
|
|
38
43
|
replaceDtEmojis(e, t) {
|
|
39
44
|
const s = new RegExp(`(${e.join("|")})`, "g");
|
|
40
|
-
return t.split(s).map((
|
|
41
|
-
props: { code:
|
|
42
|
-
}) : this.$createElement("span",
|
|
45
|
+
return t.split(s).map((n) => e.includes(n) ? this.$createElement(o, {
|
|
46
|
+
props: { code: n, size: this.size, ...this.$attrs }
|
|
47
|
+
}) : this.$createElement("span", n));
|
|
43
48
|
},
|
|
44
49
|
/**
|
|
45
50
|
* Recursively search the Vue virtual DOM to find text
|
|
@@ -61,8 +66,8 @@ const p = {
|
|
|
61
66
|
* @returns {Array<VNode|string>|string}
|
|
62
67
|
*/
|
|
63
68
|
searchCodes(e) {
|
|
64
|
-
const t =
|
|
65
|
-
return
|
|
69
|
+
const t = i(e), s = a(e), r = [...t, ...s];
|
|
70
|
+
return r.length === 0 ? e : this.replaceDtEmojis(r, e);
|
|
66
71
|
}
|
|
67
72
|
},
|
|
68
73
|
render(e) {
|
|
@@ -74,8 +79,8 @@ const p = {
|
|
|
74
79
|
);
|
|
75
80
|
}
|
|
76
81
|
}, m = null, d = null;
|
|
77
|
-
var h = /* @__PURE__ */
|
|
78
|
-
|
|
82
|
+
var h = /* @__PURE__ */ p(
|
|
83
|
+
c,
|
|
79
84
|
m,
|
|
80
85
|
d,
|
|
81
86
|
!1,
|
|
@@ -84,7 +89,8 @@ var h = /* @__PURE__ */ c(
|
|
|
84
89
|
null,
|
|
85
90
|
null
|
|
86
91
|
);
|
|
87
|
-
const
|
|
92
|
+
const x = h.exports;
|
|
88
93
|
export {
|
|
89
|
-
|
|
94
|
+
x as DtEmojiTextWrapper
|
|
90
95
|
};
|
|
96
|
+
//# sourceMappingURL=emoji-text-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emoji-text-wrapper.js","sources":["../../components/emoji_text_wrapper/emoji_text_wrapper.vue"],"sourcesContent":["<script>\nimport { DtEmoji } from '../emoji';\nimport { findEmojis, findShortCodes } from '@/common/emoji';\nimport { ICON_SIZE_MODIFIERS } from '@/components/icon/icon_constants';\n\n/**\n * Wrapper to find and replace shortcodes like :smile: or unicode chars such as 😄 with our custom Emojis implementation.\n * @see https://dialtone.dialpad.com/components/emoji_text_wrapper.html\n */\nexport default {\n name: 'DtEmojiTextWrapper',\n\n components: {\n DtEmoji,\n },\n\n props: {\n /**\n * Element type (tag name) to use for the wrapper.\n */\n elementType: {\n type: String,\n default: 'div',\n },\n\n /**\n * The icon size to render the emojis at: 100 to 800\n */\n size: {\n type: String,\n default: '500',\n validator: (t) => Object.keys(ICON_SIZE_MODIFIERS).includes(t),\n },\n },\n\n data () {\n return {\n loadingEmojiJson: true,\n };\n },\n\n async created () {\n this.loadingEmojiJson = false;\n },\n\n methods: {\n /**\n * Replaces the valid codes from the text content with a DtEmoji component.\n * @returns {Array<VNode|string>}\n */\n replaceDtEmojis (replaceList, textContent) {\n const regexp = new RegExp(`(${replaceList.join('|')})`, 'g');\n const split = textContent.split(regexp);\n return split.map((item) => {\n if (replaceList.includes(item)) {\n return this.$createElement(DtEmoji, {\n props: { code: item, size: this.size, ...this.$attrs },\n });\n }\n return this.$createElement('span', item);\n });\n },\n\n /**\n * Recursively search the Vue virtual DOM to find text\n * @param VNode\n * @returns {VNode|*}\n */\n searchVNodes (VNode) {\n // If VNode has no tag, it is a text node\n if (!VNode.tag && VNode.text) {\n return this.searchCodes(VNode.text);\n }\n\n const children = VNode.children ? VNode.children.map(VNodeChild => this.searchVNodes(VNodeChild)) : [];\n return this.$createElement(VNode.tag, VNode.data, children);\n },\n\n // TODO: Find a way to crawl vue components\n replaceVueComponentVNodeContent (VNode) {\n //\n },\n\n /**\n * Find codes in text.\n * @param textContent string\n * @returns {Array<VNode|string>|string}\n */\n searchCodes (textContent) {\n const shortcodes = findShortCodes(textContent);\n const emojis = findEmojis(textContent);\n\n const replaceList = [...shortcodes, ...emojis];\n if (replaceList.length === 0) return textContent;\n return this.replaceDtEmojis(replaceList, textContent);\n },\n },\n\n render (h) {\n const defaultSlotContent = this.$slots.default || [];\n return h(\n this.elementType,\n { class: 'd-emoji-text-wrapper' },\n this.loadingEmojiJson\n ? defaultSlotContent\n : defaultSlotContent.map(VNode => this.searchVNodes(VNode)),\n );\n },\n};\n</script>\n"],"names":["_sfc_main","DtEmoji","t","ICON_SIZE_MODIFIERS","replaceList","textContent","regexp","item","VNode","children","VNodeChild","shortcodes","findShortCodes","emojis","findEmojis","h","defaultSlotContent"],"mappings":";;;;;;;AASA,MAAAA,IAAA;AAAA,EACA,MAAA;AAAA,EAEA,YAAA;AAAA,IACA,SAAAC;AAAA,EACA;AAAA,EAEA,OAAA;AAAA;AAAA;AAAA;AAAA,IAIA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA,CAAAC,MAAA,OAAA,KAAAC,CAAA,EAAA,SAAAD,CAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,OAAA;AACA,WAAA;AAAA,MACA,kBAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,MAAA,UAAA;AACA,SAAA,mBAAA;AAAA,EACA;AAAA,EAEA,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,gBAAAE,GAAAC,GAAA;AACA,YAAAC,IAAA,IAAA,OAAA,IAAAF,EAAA,KAAA,GAAA,CAAA,KAAA,GAAA;AAEA,aADAC,EAAA,MAAAC,CAAA,EACA,IAAA,CAAAC,MACAH,EAAA,SAAAG,CAAA,IACA,KAAA,eAAAN,GAAA;AAAA,QACA,OAAA,EAAA,MAAAM,GAAA,MAAA,KAAA,MAAA,GAAA,KAAA,OAAA;AAAA,MACA,CAAA,IAEA,KAAA,eAAA,QAAAA,CAAA,CACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,aAAAC,GAAA;AAEA,UAAA,CAAAA,EAAA,OAAAA,EAAA;AACA,eAAA,KAAA,YAAAA,EAAA,IAAA;AAGA,YAAAC,IAAAD,EAAA,WAAAA,EAAA,SAAA,IAAA,CAAAE,MAAA,KAAA,aAAAA,CAAA,CAAA,IAAA,CAAA;AACA,aAAA,KAAA,eAAAF,EAAA,KAAAA,EAAA,MAAAC,CAAA;AAAA,IACA;AAAA;AAAA,IAGA,gCAAAD,GAAA;AAAA,IAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,YAAAH,GAAA;AACA,YAAAM,IAAAC,EAAAP,CAAA,GACAQ,IAAAC,EAAAT,CAAA,GAEAD,IAAA,CAAA,GAAAO,GAAA,GAAAE,CAAA;AACA,aAAAT,EAAA,WAAA,IAAAC,IACA,KAAA,gBAAAD,GAAAC,CAAA;AAAA,IACA;AAAA,EACA;AAAA,EAEA,OAAAU,GAAA;AACA,UAAAC,IAAA,KAAA,OAAA,WAAA,CAAA;AACA,WAAAD;AAAA,MACA,KAAA;AAAA,MACA,EAAA,OAAA,uBAAA;AAAA,MACA,KAAA,mBACAC,IACAA,EAAA,IAAA,CAAAR,MAAA,KAAA,aAAAA,CAAA,CAAA;AAAA,IACA;AAAA,EACA;AACA;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { D as e } from "../chunks/index-o4OMWMuv.js";
|
|
2
|
+
import "emoji-regex";
|
|
3
|
+
import "emoji-toolkit/emoji_strategy.json";
|
|
4
|
+
import "../chunks/_plugin-vue2_normalizer-u6G_3nkj.js";
|
|
5
|
+
import "./skeleton.js";
|
|
6
|
+
import "../chunks/icon_constants-OpYAAKwF.js";
|
|
7
|
+
import "@dialpad/dialtone-icons/icons.json";
|
|
8
|
+
export {
|
|
9
|
+
e as DtEmoji
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=emoji.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emoji.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { M as r } from "../chunks/modal-VuMFkZFH.js";
|
|
2
|
+
import { n as o } from "../chunks/_plugin-vue2_normalizer-u6G_3nkj.js";
|
|
3
|
+
import { DtAvatar as d } from "./avatar.js";
|
|
4
|
+
import { DtLazyShow as n } from "./lazy-show.js";
|
|
5
|
+
import { DtListItem as m } from "./list-item.js";
|
|
6
|
+
import { DtBadge as l } from "./badge.js";
|
|
7
|
+
import "./utils.js";
|
|
8
|
+
import "./constants.js";
|
|
9
|
+
import "vue";
|
|
10
|
+
import "@dialpad/dialtone-icons/icons.json";
|
|
11
|
+
import "../chunks/icon_constants-OpYAAKwF.js";
|
|
12
|
+
import "./presence.js";
|
|
13
|
+
import "./icon.js";
|
|
14
|
+
import "@dialpad/dialtone-icons/vue2";
|
|
15
|
+
import "./skeleton.js";
|
|
16
|
+
import "../chunks/list_item_constants-LTUc74pD.js";
|
|
17
|
+
import "./item-layout.js";
|
|
18
|
+
const i = {
|
|
19
|
+
NORMAL: "",
|
|
20
|
+
SEARCHED: "dt-feed-item-row--state-searched",
|
|
21
|
+
ERROR: "dt-feed-item-row--state-error"
|
|
22
|
+
}, s = "NORMAL", f = {
|
|
23
|
+
name: "DtRecipeFeedItemRow",
|
|
24
|
+
components: {
|
|
25
|
+
DtAvatar: d,
|
|
26
|
+
DtLazyShow: n,
|
|
27
|
+
DtListItem: m,
|
|
28
|
+
DtBadge: l
|
|
29
|
+
},
|
|
30
|
+
mixins: [r],
|
|
31
|
+
inheritAttrs: !1,
|
|
32
|
+
props: {
|
|
33
|
+
/**
|
|
34
|
+
* Avatar seed, set this to the user's ID to get the same avatar background gradient each time it is displayed.
|
|
35
|
+
*/
|
|
36
|
+
avatarSeed: {
|
|
37
|
+
type: String,
|
|
38
|
+
default: null
|
|
39
|
+
},
|
|
40
|
+
/**
|
|
41
|
+
* Show avatar, show header text or dont show left time and vice versa
|
|
42
|
+
*/
|
|
43
|
+
showHeader: {
|
|
44
|
+
type: Boolean,
|
|
45
|
+
default: !1
|
|
46
|
+
},
|
|
47
|
+
/**
|
|
48
|
+
* Optional avatar image url.
|
|
49
|
+
* If not provided it will use extracted initials from displayName.
|
|
50
|
+
*/
|
|
51
|
+
avatarImageUrl: {
|
|
52
|
+
type: String,
|
|
53
|
+
default: ""
|
|
54
|
+
},
|
|
55
|
+
/**
|
|
56
|
+
* The display name of the sender
|
|
57
|
+
*/
|
|
58
|
+
displayName: {
|
|
59
|
+
type: String,
|
|
60
|
+
default: ""
|
|
61
|
+
},
|
|
62
|
+
/**
|
|
63
|
+
* time string displayed as is.
|
|
64
|
+
* Shown on the header when showHeader is true
|
|
65
|
+
*/
|
|
66
|
+
time: {
|
|
67
|
+
type: String,
|
|
68
|
+
default: ""
|
|
69
|
+
},
|
|
70
|
+
/**
|
|
71
|
+
* short time string without AM/PM displayed as is.
|
|
72
|
+
* Shown on the left of feed item when showHeader is false and isActive is true
|
|
73
|
+
*/
|
|
74
|
+
shortTime: {
|
|
75
|
+
type: String,
|
|
76
|
+
default: ""
|
|
77
|
+
},
|
|
78
|
+
/**
|
|
79
|
+
* A label displayed next to the displayName. Will not show if empty.
|
|
80
|
+
*/
|
|
81
|
+
labelText: {
|
|
82
|
+
type: String,
|
|
83
|
+
default: ""
|
|
84
|
+
},
|
|
85
|
+
/**
|
|
86
|
+
* displays a darkened background on the row.
|
|
87
|
+
*/
|
|
88
|
+
isActive: {
|
|
89
|
+
type: Boolean,
|
|
90
|
+
default: !1
|
|
91
|
+
},
|
|
92
|
+
/**
|
|
93
|
+
* state for the feed item row. Can be normal, searched & error
|
|
94
|
+
*/
|
|
95
|
+
state: {
|
|
96
|
+
type: String,
|
|
97
|
+
default: s,
|
|
98
|
+
validator: (a) => Object.keys(i).includes(a)
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
emits: [
|
|
102
|
+
/**
|
|
103
|
+
* Fires when hovered over feed row
|
|
104
|
+
*
|
|
105
|
+
* @event hover
|
|
106
|
+
* @type {Boolean}
|
|
107
|
+
*/
|
|
108
|
+
"hover",
|
|
109
|
+
/**
|
|
110
|
+
* Fires when focused over feed row
|
|
111
|
+
*
|
|
112
|
+
* @event focus
|
|
113
|
+
* @type {Boolean}
|
|
114
|
+
*/
|
|
115
|
+
"focus",
|
|
116
|
+
/**
|
|
117
|
+
* Key down event
|
|
118
|
+
*
|
|
119
|
+
* @event keydown
|
|
120
|
+
* @type {KeyboardEvent}
|
|
121
|
+
*/
|
|
122
|
+
"keydown"
|
|
123
|
+
],
|
|
124
|
+
data() {
|
|
125
|
+
return {
|
|
126
|
+
transitionActive: !1
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
computed: {
|
|
130
|
+
feedListeners() {
|
|
131
|
+
return {
|
|
132
|
+
...this.$listeners,
|
|
133
|
+
mouseenter: () => this.setHover(!0),
|
|
134
|
+
mouseleave: () => this.setHover(!1),
|
|
135
|
+
focusin: () => this.setFocus(!0),
|
|
136
|
+
focusout: () => this.setFocus(!1),
|
|
137
|
+
transitionend: () => this.transitionComplete(),
|
|
138
|
+
keydown: (a) => {
|
|
139
|
+
switch (a.code) {
|
|
140
|
+
case "Tab":
|
|
141
|
+
this.trapFocus(a);
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
this.$emit("keydown", a);
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
},
|
|
148
|
+
listItemClasses() {
|
|
149
|
+
return [
|
|
150
|
+
"dt-feed-item-row",
|
|
151
|
+
{ "dt-feed-item-row--active": this.isActive && this.state === s },
|
|
152
|
+
{ "dt-feed-item-row--state-transition": this.transitionActive },
|
|
153
|
+
i[this.state]
|
|
154
|
+
];
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
watch: {
|
|
158
|
+
state: {
|
|
159
|
+
immediate: !0,
|
|
160
|
+
handler: function(a, t) {
|
|
161
|
+
a !== s && (this.transitionActive = !0);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
methods: {
|
|
166
|
+
transitionComplete() {
|
|
167
|
+
this.state === s && (this.transitionActive = !1);
|
|
168
|
+
},
|
|
169
|
+
trapFocus(a) {
|
|
170
|
+
this.focusTrappedTabPress(a);
|
|
171
|
+
},
|
|
172
|
+
setFocus(a) {
|
|
173
|
+
this.$emit("focus", a);
|
|
174
|
+
},
|
|
175
|
+
setHover(a) {
|
|
176
|
+
this.$emit("hover", a);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
var c = function() {
|
|
181
|
+
var t = this, e = t._self._c;
|
|
182
|
+
return e("dt-list-item", t._g(t._b({ ref: "FeedItemRef", class: ["dt-feed-item-row", t.listItemClasses], attrs: { "navigation-type": "none", "data-qa": "dt-feed-item-row" }, scopedSlots: t._u([{ key: "left", fn: function() {
|
|
183
|
+
return [t.showHeader ? e("div", { staticClass: "dt-feed-item-row__avatar-container" }, [t._t("avatar", function() {
|
|
184
|
+
return [e("dt-avatar", { attrs: { "full-name": t.displayName, "image-src": t.avatarImageUrl, "image-alt": "", seed: t.avatarSeed } })];
|
|
185
|
+
})], 2) : t._e(), t.showHeader ? t._e() : e("span", { directives: [{ name: "show", rawName: "v-show", value: t.isActive, expression: "isActive" }], staticClass: "dt-feed-item-row__left-time", attrs: { "data-qa": "dt-feed-item-row--left-time" } }, [t._v(" " + t._s(t.shortTime) + " ")])];
|
|
186
|
+
}, proxy: !0 }, { key: "bottom", fn: function() {
|
|
187
|
+
return [t.$slots.reactions ? e("div", { staticClass: "dt-feed-item-row__reactions", attrs: { "data-qa": "dt-feed-item-row--reactions" } }, [t._t("reactions")], 2) : t._e(), t.$slots.threading ? e("div", { staticClass: "dt-feed-item-row__threading" }, [t._t("threading")], 2) : t._e()];
|
|
188
|
+
}, proxy: !0 }, { key: "right", fn: function() {
|
|
189
|
+
return [e("div", { directives: [{ name: "show", rawName: "v-show", value: t.isActive, expression: "isActive" }], staticClass: "dt-feed-item-row__menu", attrs: { "data-qa": "dt-feed-item-row--menu" } }, [e("dt-lazy-show", { attrs: { appear: !0, transition: "fade", show: t.isActive } }, [t._t("menu")], 2)], 1)];
|
|
190
|
+
}, proxy: !0 }], null, !0) }, "dt-list-item", t.$attrs, !1), t.feedListeners), [e("article", { staticClass: "dt-feed-item-row__content" }, [t.showHeader ? e("div", { staticClass: "dt-feed-item-row__header", attrs: { "data-qa": "dt-feed-item-row--header" } }, [e("p", { staticClass: "dt-feed-item-row__header__name" }, [t._v(" " + t._s(t.displayName) + " ")]), e("time", { staticClass: "dt-feed-item-row__header__time" }, [t._v(" " + t._s(t.time) + " ")]), t.labelText ? e("dt-badge", { attrs: { text: t.labelText } }) : t._e()], 1) : t._e(), e("span", { attrs: { "data-qa": "dt-feed-item-row--content" } }, [t._t("default")], 2), t.$slots.attachment ? e("div", { staticClass: "dt-feed-item-row__attachment", attrs: { "data-qa": "dt-feed-item-row--attachment" } }, [t._t("attachment")], 2) : t._e()])]);
|
|
191
|
+
}, _ = [], u = /* @__PURE__ */ o(
|
|
192
|
+
f,
|
|
193
|
+
c,
|
|
194
|
+
_,
|
|
195
|
+
!1,
|
|
196
|
+
null,
|
|
197
|
+
"5d0ac8f1",
|
|
198
|
+
null,
|
|
199
|
+
null
|
|
200
|
+
);
|
|
201
|
+
const k = u.exports;
|
|
202
|
+
export {
|
|
203
|
+
s as DEFAULT_FEED_ROW_STATE,
|
|
204
|
+
k as DtRecipeFeedItemRow,
|
|
205
|
+
i as FEED_ROW_STATE_BACKGROUND_COLOR
|
|
206
|
+
};
|
|
207
|
+
//# sourceMappingURL=feed-item-row.js.map
|