@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.
Files changed (269) hide show
  1. package/dist/chunks/_plugin-vue2_normalizer-u6G_3nkj.js +33 -0
  2. package/dist/chunks/_plugin-vue2_normalizer-u6G_3nkj.js.map +1 -0
  3. package/dist/chunks/dropdown-SMWaTWyF.js +357 -0
  4. package/dist/chunks/dropdown-SMWaTWyF.js.map +1 -0
  5. package/dist/chunks/dropdown_constants-EUcDxBrX.js +9 -0
  6. package/dist/chunks/dropdown_constants-EUcDxBrX.js.map +1 -0
  7. package/dist/chunks/icon_constants-OpYAAKwF.js +16 -0
  8. package/dist/chunks/icon_constants-OpYAAKwF.js.map +1 -0
  9. package/dist/chunks/index-nIyl_PL6.js +372 -0
  10. package/dist/chunks/index-nIyl_PL6.js.map +1 -0
  11. package/dist/chunks/index-o4OMWMuv.js +244 -0
  12. package/dist/chunks/index-o4OMWMuv.js.map +1 -0
  13. package/dist/chunks/input-1tm09l_-.js +273 -0
  14. package/dist/chunks/input-1tm09l_-.js.map +1 -0
  15. package/dist/chunks/input_group-zcAq3DQl.js +141 -0
  16. package/dist/chunks/input_group-zcAq3DQl.js.map +1 -0
  17. package/dist/chunks/keyboard_list_navigation-F0O8nht0.js +197 -0
  18. package/dist/chunks/keyboard_list_navigation-F0O8nht0.js.map +1 -0
  19. package/dist/chunks/link_constants-vIUB92L4.js +16 -0
  20. package/dist/chunks/link_constants-vIUB92L4.js.map +1 -0
  21. package/dist/chunks/list_item_constants-LTUc74pD.js +13 -0
  22. package/dist/chunks/list_item_constants-LTUc74pD.js.map +1 -0
  23. package/dist/chunks/modal-VuMFkZFH.js +82 -0
  24. package/dist/chunks/modal-VuMFkZFH.js.map +1 -0
  25. package/dist/chunks/notice_action-9NmtQRai.js +182 -0
  26. package/dist/chunks/notice_action-9NmtQRai.js.map +1 -0
  27. package/dist/chunks/notice_constants-c--hBFQw.js +6 -0
  28. package/dist/chunks/notice_constants-c--hBFQw.js.map +1 -0
  29. package/dist/chunks/popover_constants-qjlEkroB.js +114 -0
  30. package/dist/chunks/popover_constants-qjlEkroB.js.map +1 -0
  31. package/dist/chunks/sr_only_close_button-JGole5Xi.js +86 -0
  32. package/dist/chunks/sr_only_close_button-JGole5Xi.js.map +1 -0
  33. package/dist/chunks/stack_constants-u7tNqGtc.js +13 -0
  34. package/dist/chunks/stack_constants-u7tNqGtc.js.map +1 -0
  35. package/dist/chunks/tab-Qm9LVkYj.js +346 -0
  36. package/dist/chunks/tab-Qm9LVkYj.js.map +1 -0
  37. package/dist/component-documentation.json +1 -1
  38. package/dist/dialtone-vue.js +356 -10364
  39. package/dist/dialtone-vue.js.map +1 -0
  40. package/dist/lib/attachment-carousel.js +250 -0
  41. package/dist/lib/attachment-carousel.js.map +1 -0
  42. package/dist/lib/avatar.js +369 -0
  43. package/dist/lib/avatar.js.map +1 -0
  44. package/dist/lib/badge.js +169 -0
  45. package/dist/lib/badge.js.map +1 -0
  46. package/dist/lib/banner.js +200 -0
  47. package/dist/lib/banner.js.map +1 -0
  48. package/dist/lib/breadcrumbs.js +138 -0
  49. package/dist/lib/breadcrumbs.js.map +1 -0
  50. package/dist/lib/button-group.js +45 -0
  51. package/dist/lib/button-group.js.map +1 -0
  52. package/dist/lib/button.js +328 -0
  53. package/dist/lib/button.js.map +1 -0
  54. package/dist/lib/callbar-button-with-popover.js +235 -0
  55. package/dist/lib/callbar-button-with-popover.js.map +1 -0
  56. package/dist/lib/callbar-button.js +175 -0
  57. package/dist/lib/callbar-button.js.map +1 -0
  58. package/dist/lib/callbox.js +142 -0
  59. package/dist/lib/callbox.js.map +1 -0
  60. package/dist/lib/card.js +72 -0
  61. package/dist/lib/card.js.map +1 -0
  62. package/dist/lib/checkbox-group.js +117 -0
  63. package/dist/lib/checkbox-group.js.map +1 -0
  64. package/dist/lib/checkbox.js +117 -0
  65. package/dist/lib/checkbox.js.map +1 -0
  66. package/dist/lib/chip.js +186 -0
  67. package/dist/lib/chip.js.map +1 -0
  68. package/dist/lib/codeblock.js +29 -0
  69. package/dist/lib/codeblock.js.map +1 -0
  70. package/dist/lib/collapsible.js +313 -0
  71. package/dist/lib/collapsible.js.map +1 -0
  72. package/dist/lib/combobox-multi-select.js +433 -0
  73. package/dist/lib/combobox-multi-select.js.map +1 -0
  74. package/dist/lib/combobox-with-popover.js +341 -0
  75. package/dist/lib/combobox-with-popover.js.map +1 -0
  76. package/dist/lib/combobox.js +19 -0
  77. package/dist/lib/combobox.js.map +1 -0
  78. package/dist/lib/constants.js +53 -0
  79. package/dist/lib/constants.js.map +1 -0
  80. package/dist/lib/contact-info.js +145 -0
  81. package/dist/lib/contact-info.js.map +1 -0
  82. package/dist/lib/contact-row.js +203 -0
  83. package/dist/lib/contact-row.js.map +1 -0
  84. package/dist/lib/datepicker.js +552 -0
  85. package/dist/lib/datepicker.js.map +1 -0
  86. package/dist/lib/dates.js +57 -0
  87. package/dist/lib/dates.js.map +1 -0
  88. package/dist/lib/description-list.js +83 -0
  89. package/dist/lib/description-list.js.map +1 -0
  90. package/dist/lib/dropdown.js +45 -0
  91. package/dist/lib/dropdown.js.map +1 -0
  92. package/dist/lib/editor.js +527 -0
  93. package/dist/lib/editor.js.map +1 -0
  94. package/dist/{emoji_picker-kiTOKaq8.js → lib/emoji-picker.js} +30 -11
  95. package/dist/lib/emoji-picker.js.map +1 -0
  96. package/dist/lib/emoji-row.js +83 -0
  97. package/dist/lib/emoji-row.js.map +1 -0
  98. package/dist/{emoji_text_wrapper-48ClwKvf.js → lib/emoji-text-wrapper.js} +19 -13
  99. package/dist/lib/emoji-text-wrapper.js.map +1 -0
  100. package/dist/lib/emoji.js +11 -0
  101. package/dist/lib/emoji.js.map +1 -0
  102. package/dist/lib/feed-item-row.js +207 -0
  103. package/dist/lib/feed-item-row.js.map +1 -0
  104. package/dist/lib/feed-pill.js +142 -0
  105. package/dist/lib/feed-pill.js.map +1 -0
  106. package/dist/lib/general-row.js +379 -0
  107. package/dist/lib/general-row.js.map +1 -0
  108. package/dist/lib/group-row.js +115 -0
  109. package/dist/lib/group-row.js.map +1 -0
  110. package/dist/lib/grouped-chip.js +45 -0
  111. package/dist/lib/grouped-chip.js.map +1 -0
  112. package/dist/lib/hovercard.js +194 -0
  113. package/dist/lib/hovercard.js.map +1 -0
  114. package/dist/lib/icon.js +82 -0
  115. package/dist/lib/icon.js.map +1 -0
  116. package/dist/lib/image-viewer.js +171 -0
  117. package/dist/lib/image-viewer.js.map +1 -0
  118. package/dist/lib/input-group.js +90 -0
  119. package/dist/lib/input-group.js.map +1 -0
  120. package/dist/lib/input.js +455 -0
  121. package/dist/lib/input.js.map +1 -0
  122. package/dist/lib/item-layout.js +39 -0
  123. package/dist/lib/item-layout.js.map +1 -0
  124. package/dist/lib/ivr-node.js +195 -0
  125. package/dist/lib/ivr-node.js.map +1 -0
  126. package/dist/lib/keyboard-shortcut.js +100 -0
  127. package/dist/lib/keyboard-shortcut.js.map +1 -0
  128. package/dist/lib/lazy-show.js +77 -0
  129. package/dist/lib/lazy-show.js.map +1 -0
  130. package/dist/lib/link.js +69 -0
  131. package/dist/lib/link.js.map +1 -0
  132. package/dist/lib/list-item-group.js +59 -0
  133. package/dist/lib/list-item-group.js.map +1 -0
  134. package/dist/lib/list-item.js +195 -0
  135. package/dist/lib/list-item.js.map +1 -0
  136. package/dist/{message_input.js → lib/message-input.js} +107 -55
  137. package/dist/lib/message-input.js.map +1 -0
  138. package/dist/lib/mixins.js +17 -0
  139. package/dist/lib/mixins.js.map +1 -0
  140. package/dist/lib/modal.js +324 -0
  141. package/dist/lib/modal.js.map +1 -0
  142. package/dist/lib/notice.js +158 -0
  143. package/dist/lib/notice.js.map +1 -0
  144. package/dist/lib/pagination.js +142 -0
  145. package/dist/lib/pagination.js.map +1 -0
  146. package/dist/lib/popover.js +779 -0
  147. package/dist/lib/popover.js.map +1 -0
  148. package/dist/lib/presence.js +60 -0
  149. package/dist/lib/presence.js.map +1 -0
  150. package/dist/lib/radio-group.js +97 -0
  151. package/dist/lib/radio-group.js.map +1 -0
  152. package/dist/lib/radio.js +111 -0
  153. package/dist/lib/radio.js.map +1 -0
  154. package/dist/lib/rich-text-editor.js +920 -0
  155. package/dist/lib/rich-text-editor.js.map +1 -0
  156. package/dist/lib/root-layout.js +127 -0
  157. package/dist/lib/root-layout.js.map +1 -0
  158. package/dist/lib/select-menu.js +243 -0
  159. package/dist/lib/select-menu.js.map +1 -0
  160. package/dist/lib/settings-menu-button.js +65 -0
  161. package/dist/lib/settings-menu-button.js.map +1 -0
  162. package/dist/lib/skeleton.js +574 -0
  163. package/dist/lib/skeleton.js.map +1 -0
  164. package/dist/lib/stack.js +118 -0
  165. package/dist/lib/stack.js.map +1 -0
  166. package/dist/lib/tabs.js +93 -0
  167. package/dist/lib/tabs.js.map +1 -0
  168. package/dist/lib/time-pill.js +43 -0
  169. package/dist/lib/time-pill.js.map +1 -0
  170. package/dist/lib/toast.js +226 -0
  171. package/dist/lib/toast.js.map +1 -0
  172. package/dist/lib/toggle.js +169 -0
  173. package/dist/lib/toggle.js.map +1 -0
  174. package/dist/{directives.js → lib/tooltip-directive.js} +24 -17
  175. package/dist/lib/tooltip-directive.js.map +1 -0
  176. package/dist/lib/tooltip.js +376 -0
  177. package/dist/lib/tooltip.js.map +1 -0
  178. package/dist/lib/top-banner-info.js +60 -0
  179. package/dist/lib/top-banner-info.js.map +1 -0
  180. package/dist/lib/unread-pill.js +61 -0
  181. package/dist/lib/unread-pill.js.map +1 -0
  182. package/dist/lib/utils.js +175 -0
  183. package/dist/lib/utils.js.map +1 -0
  184. package/dist/lib/validation-messages.js +83 -0
  185. package/dist/lib/validation-messages.js.map +1 -0
  186. package/dist/lib/validators.js +12 -0
  187. package/dist/lib/validators.js.map +1 -0
  188. package/dist/style.css +1 -1
  189. package/dist/types/common/{constants.d.ts → constants/index.d.ts} +1 -1
  190. package/dist/types/common/constants/index.d.ts.map +1 -0
  191. package/dist/types/common/{dates.d.ts → dates/index.d.ts} +1 -1
  192. package/dist/types/common/dates/index.d.ts.map +1 -0
  193. package/dist/types/common/{emoji.d.ts → emoji/index.d.ts} +1 -1
  194. package/dist/types/common/{emoji.d.ts.map → emoji/index.d.ts.map} +1 -1
  195. package/dist/types/common/{utils.d.ts → utils/index.d.ts} +1 -1
  196. package/dist/types/common/utils/index.d.ts.map +1 -0
  197. package/dist/types/common/{validators.d.ts → validators/index.d.ts} +1 -1
  198. package/dist/types/common/validators/index.d.ts.map +1 -0
  199. package/dist/types/components/avatar/avatar.vue.d.ts +1 -1
  200. package/dist/types/components/button/button.vue.d.ts +2 -2
  201. package/dist/types/components/card/card.vue.d.ts +1 -1
  202. package/dist/types/components/checkbox/checkbox.vue.d.ts +7 -7
  203. package/dist/types/components/checkbox/checkbox.vue.d.ts.map +1 -1
  204. package/dist/types/components/chip/chip.vue.d.ts +2 -2
  205. package/dist/types/components/collapsible/collapsible.vue.d.ts +3 -3
  206. package/dist/types/components/combobox/combobox.vue.d.ts +7 -8
  207. package/dist/types/components/combobox/combobox.vue.d.ts.map +1 -1
  208. package/dist/types/components/dropdown/dropdown.vue.d.ts +1 -1
  209. package/dist/types/components/emoji/emoji.vue.d.ts +1 -1
  210. package/dist/types/components/emoji_picker/modules/emoji_selector.vue.d.ts +1 -219
  211. package/dist/types/components/icon/icon.vue.d.ts +20 -16
  212. package/dist/types/components/icon/icon.vue.d.ts.map +1 -1
  213. package/dist/types/components/icon/icon_constants.d.ts +2 -0
  214. package/dist/types/components/icon/icon_constants.d.ts.map +1 -1
  215. package/dist/types/components/icon/index.d.ts +1 -1
  216. package/dist/types/components/input_group/input_group.vue.d.ts +15 -6
  217. package/dist/types/components/input_group/input_group.vue.d.ts.map +1 -1
  218. package/dist/types/components/list_item_group/list_item_group.vue.d.ts +1 -1
  219. package/dist/types/components/modal/modal.vue.d.ts +7 -2
  220. package/dist/types/components/modal/modal.vue.d.ts.map +1 -1
  221. package/dist/types/components/notice/notice_action.vue.d.ts +3 -1
  222. package/dist/types/components/notice/notice_action.vue.d.ts.map +1 -1
  223. package/dist/types/components/popover/popover_header_footer.vue.d.ts +1 -1
  224. package/dist/types/components/radio/radio.vue.d.ts +2 -12
  225. package/dist/types/components/radio/radio.vue.d.ts.map +1 -1
  226. package/dist/types/components/rich_text_editor/extensions/suggestion/SuggestionList.vue.d.ts +1 -1
  227. package/dist/types/components/skeleton/skeleton-list-item.vue.d.ts +1 -1
  228. package/dist/types/components/skeleton/skeleton-paragraph.vue.d.ts +3 -3
  229. package/dist/types/components/skeleton/skeleton-shape.vue.d.ts +2 -2
  230. package/dist/types/components/skeleton/skeleton-text.vue.d.ts +8 -3
  231. package/dist/types/components/skeleton/skeleton-text.vue.d.ts.map +1 -1
  232. package/dist/types/components/skeleton/skeleton.vue.d.ts +1 -1
  233. package/dist/types/components/toggle/toggle.vue.d.ts +1 -1
  234. package/dist/types/components/tooltip/tooltip.vue.d.ts +2 -2
  235. package/dist/types/index.d.ts +36 -29
  236. package/dist/types/recipes/buttons/callbar_button/callbar_button.vue.d.ts +1 -1
  237. package/dist/types/recipes/buttons/callbar_button_with_popover/callbar_button_with_popover.vue.d.ts +2 -2
  238. package/dist/types/recipes/comboboxes/combobox_multi_select/combobox_multi_select.vue.d.ts +1 -1
  239. package/dist/types/recipes/comboboxes/combobox_with_popover/combobox_with_popover.vue.d.ts +2 -2
  240. package/dist/types/recipes/conversation_view/editor/editor.vue.d.ts +9 -0
  241. package/dist/types/recipes/conversation_view/editor/editor.vue.d.ts.map +1 -1
  242. package/package.json +19 -59
  243. package/CHANGELOG.json +0 -1
  244. package/CHANGELOG.md +0 -2890
  245. package/dist/dialtone-vue.cjs +0 -5
  246. package/dist/directives.cjs +0 -1
  247. package/dist/emoji.cjs +0 -1
  248. package/dist/emoji.js +0 -35
  249. package/dist/emoji_picker-njWWAm6V.cjs +0 -1
  250. package/dist/emoji_text_wrapper-ZlynvHnd.cjs +0 -1
  251. package/dist/index-OF94C6nQ.js +0 -142833
  252. package/dist/index-Wx7Jagcr.cjs +0 -1
  253. package/dist/message_input.cjs +0 -1
  254. package/dist/rich_text_editor-9sMob7ck.js +0 -16478
  255. package/dist/rich_text_editor-Eh5kYokw.cjs +0 -97
  256. package/dist/tooltip-88U5vFMA.js +0 -2516
  257. package/dist/tooltip-i2wxFIIi.cjs +0 -21
  258. package/dist/types/common/constants.d.ts.map +0 -1
  259. package/dist/types/common/dates.d.ts.map +0 -1
  260. package/dist/types/common/utils.d.ts.map +0 -1
  261. package/dist/types/common/validators.d.ts.map +0 -1
  262. package/dist/types/components/emoji_picker/emojis/index.d.ts +0 -50
  263. package/dist/types/components/emoji_picker/emojis/index.d.ts.map +0 -1
  264. package/dist/types/directives.d.ts +0 -2
  265. package/dist/types/directives.d.ts.map +0 -1
  266. package/dist/types/emoji.d.ts +0 -5
  267. package/dist/types/emoji.d.ts.map +0 -1
  268. package/dist/types/message_input.d.ts +0 -3
  269. package/dist/types/message_input.d.ts.map +0 -1
@@ -1,6 +1,24 @@
1
- import { y as b, z as k, w as p, x as _, A as j } from "./index-OF94C6nQ.js";
2
- import { n as m, D as g } from "./tooltip-88U5vFMA.js";
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, D = {
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 I = function() {
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 x = Q.exports;
793
+ const ke = Q.exports;
776
794
  export {
777
- d as C,
778
- x as D,
779
- a as E,
780
- h as a,
781
- u as b
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":"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"}
@@ -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, I as i, p as a, r as l } from "./index-OF94C6nQ.js";
2
- import { n as c } from "./tooltip-88U5vFMA.js";
3
- const p = {
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(i).includes(e)
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((r) => e.includes(r) ? this.$createElement(o, {
41
- props: { code: r, size: this.size, ...this.$attrs }
42
- }) : this.$createElement("span", r));
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 = a(e), s = l(e), n = [...t, ...s];
65
- return n.length === 0 ? e : this.replaceDtEmojis(n, e);
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__ */ c(
78
- p,
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 E = h.exports;
92
+ const x = h.exports;
88
93
  export {
89
- E as D
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