@nextcloud/vue 8.6.1 → 8.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/Components/NcActionButton.cjs +6 -6
  3. package/dist/Components/NcActionButton.cjs.map +1 -1
  4. package/dist/Components/NcActionButton.mjs +3 -3
  5. package/dist/Components/NcActionButton.mjs.map +1 -1
  6. package/dist/Components/NcActionInput.cjs +1 -1
  7. package/dist/Components/NcActionInput.mjs +1 -1
  8. package/dist/Components/NcActions.cjs +1 -1
  9. package/dist/Components/NcActions.mjs +1 -1
  10. package/dist/Components/NcAppNavigationCaption.cjs +1 -1
  11. package/dist/Components/NcAppNavigationCaption.mjs +1 -1
  12. package/dist/Components/NcAppNavigationItem.cjs +1 -1
  13. package/dist/Components/NcAppNavigationItem.mjs +1 -1
  14. package/dist/Components/NcAppNavigationSettings.cjs +1 -1
  15. package/dist/Components/NcAppNavigationSettings.mjs +1 -1
  16. package/dist/Components/NcAppSidebar.cjs +1 -1
  17. package/dist/Components/NcAppSidebar.mjs +1 -1
  18. package/dist/Components/NcAppSidebarTab.cjs +3 -3
  19. package/dist/Components/NcAppSidebarTab.cjs.map +1 -1
  20. package/dist/Components/NcAppSidebarTab.mjs +5 -5
  21. package/dist/Components/NcAppSidebarTab.mjs.map +1 -1
  22. package/dist/Components/NcAvatar.cjs +1 -1
  23. package/dist/Components/NcAvatar.mjs +1 -1
  24. package/dist/Components/NcBreadcrumb.cjs +1 -1
  25. package/dist/Components/NcBreadcrumb.mjs +1 -1
  26. package/dist/Components/NcBreadcrumbs.cjs +1 -1
  27. package/dist/Components/NcBreadcrumbs.mjs +1 -1
  28. package/dist/Components/NcDashboardWidget.cjs +1 -1
  29. package/dist/Components/NcDashboardWidget.mjs +1 -1
  30. package/dist/Components/NcDashboardWidgetItem.cjs +1 -1
  31. package/dist/Components/NcDashboardWidgetItem.mjs +1 -1
  32. package/dist/Components/NcDateTimePicker.cjs +3 -3
  33. package/dist/Components/NcDateTimePicker.cjs.map +1 -1
  34. package/dist/Components/NcDateTimePicker.mjs +8 -8
  35. package/dist/Components/NcDateTimePicker.mjs.map +1 -1
  36. package/dist/Components/NcDateTimePickerNative.cjs +1 -1
  37. package/dist/Components/NcDateTimePickerNative.mjs +1 -1
  38. package/dist/Components/NcHeaderMenu.cjs +1 -1
  39. package/dist/Components/NcHeaderMenu.mjs +1 -1
  40. package/dist/Components/NcListItem.cjs +1 -1
  41. package/dist/Components/NcListItem.mjs +1 -1
  42. package/dist/Components/NcListItemIcon.cjs +1 -1
  43. package/dist/Components/NcListItemIcon.mjs +1 -1
  44. package/dist/Components/NcModal.cjs +7 -7
  45. package/dist/Components/NcModal.cjs.map +1 -1
  46. package/dist/Components/NcModal.mjs +7 -7
  47. package/dist/Components/NcModal.mjs.map +1 -1
  48. package/dist/Components/NcRichContenteditable.cjs +1 -1
  49. package/dist/Components/NcRichContenteditable.mjs +2 -2
  50. package/dist/Components/NcRichText.cjs +11 -11
  51. package/dist/Components/NcRichText.cjs.map +1 -1
  52. package/dist/Components/NcRichText.mjs +22 -21
  53. package/dist/Components/NcRichText.mjs.map +1 -1
  54. package/dist/Components/NcSelect.cjs +1 -1
  55. package/dist/Components/NcSelect.mjs +1 -1
  56. package/dist/Components/NcSelectTags.cjs +1 -1
  57. package/dist/Components/NcSelectTags.mjs +1 -1
  58. package/dist/Components/NcSettingsSelectGroup.cjs +1 -1
  59. package/dist/Components/NcSettingsSelectGroup.mjs +1 -1
  60. package/dist/Components/NcTimezonePicker.cjs +1 -1
  61. package/dist/Components/NcTimezonePicker.mjs +1 -1
  62. package/dist/Components/NcUserBubble.cjs +1 -1
  63. package/dist/Components/NcUserBubble.mjs +1 -1
  64. package/dist/Functions/reference.cjs +16 -0
  65. package/dist/Functions/reference.cjs.map +1 -0
  66. package/dist/Functions/reference.mjs +17 -0
  67. package/dist/Functions/reference.mjs.map +1 -0
  68. package/dist/Functions/registerReference.cjs +71 -0
  69. package/dist/Functions/registerReference.cjs.map +1 -0
  70. package/dist/Functions/registerReference.mjs +71 -0
  71. package/dist/Functions/registerReference.mjs.map +1 -0
  72. package/dist/Mixins/richEditor.cjs +1 -1
  73. package/dist/Mixins/richEditor.mjs +1 -1
  74. package/dist/assets/{NcActionButton-1Z9lN7ar.css → NcActionButton-rOZFVQA8.css} +17 -17
  75. package/dist/assets/{NcActions-mSL9fcPO.css → NcActions-4Gq5bZLW.css} +12 -12
  76. package/dist/assets/{NcAppSidebar-iU8Zp4Qk.css → NcAppSidebar-YHd7DpMW.css} +44 -44
  77. package/dist/assets/{NcAppSidebarTab-Phau6edJ.css → NcAppSidebarTab-FywbKxqo.css} +4 -4
  78. package/dist/assets/{NcBreadcrumb-M3hqCbqS.css → NcBreadcrumb-HspaFygg.css} +16 -16
  79. package/dist/assets/{NcDateTimePicker-vivOLt2Q.css → NcDateTimePicker-w8SEtYvQ.css} +17 -17
  80. package/dist/assets/{NcHeaderMenu-06vdn4tC.css → NcHeaderMenu-Srn5iXdL.css} +14 -15
  81. package/dist/assets/NcListItem-L8LeGwpe.css +165 -0
  82. package/dist/assets/{NcMentionBubble-2OXF_uEJ.css → NcMentionBubble-YYl1ib_F.css} +9 -9
  83. package/dist/assets/{NcModal-UZh031V1.css → NcModal-sIK5sUoC.css} +63 -63
  84. package/dist/assets/{NcRichContenteditable-j9edXOEH.css → NcRichContenteditable-N1TxeACO.css} +76 -84
  85. package/dist/assets/NcRichText-kDp48Nji.css +215 -0
  86. package/dist/assets/referencePickerModal-A0PlFUEI.css +316 -0
  87. package/dist/chunks/{NcActionInput-jQFZLsoe.mjs → NcActionInput-XHMzOL_h.mjs} +1 -1
  88. package/dist/chunks/{NcActionInput-jQFZLsoe.mjs.map → NcActionInput-XHMzOL_h.mjs.map} +1 -1
  89. package/dist/chunks/{NcActionInput--MiyWKmE.cjs → NcActionInput-f1Oq2O71.cjs} +1 -1
  90. package/dist/chunks/{NcActionInput--MiyWKmE.cjs.map → NcActionInput-f1Oq2O71.cjs.map} +1 -1
  91. package/dist/chunks/{NcActions-qCVw08zV.mjs → NcActions-5_igU-CH.mjs} +21 -21
  92. package/dist/chunks/{NcActions-qCVw08zV.mjs.map → NcActions-5_igU-CH.mjs.map} +1 -1
  93. package/dist/chunks/{NcActions-SlBohqiI.cjs → NcActions-JXnhQhum.cjs} +7 -7
  94. package/dist/chunks/{NcActions-SlBohqiI.cjs.map → NcActions-JXnhQhum.cjs.map} +1 -1
  95. package/dist/chunks/{NcAppNavigationCaption-0lGP-5CR.mjs → NcAppNavigationCaption-2rUO5Mns.mjs} +1 -1
  96. package/dist/chunks/{NcAppNavigationCaption-0lGP-5CR.mjs.map → NcAppNavigationCaption-2rUO5Mns.mjs.map} +1 -1
  97. package/dist/chunks/{NcAppNavigationCaption-nEKQXQYr.cjs → NcAppNavigationCaption-JQWbmgdy.cjs} +1 -1
  98. package/dist/chunks/{NcAppNavigationCaption-nEKQXQYr.cjs.map → NcAppNavigationCaption-JQWbmgdy.cjs.map} +1 -1
  99. package/dist/chunks/{NcAppNavigationItem-g_XncGxL.mjs → NcAppNavigationItem-A1yAdDNN.mjs} +1 -1
  100. package/dist/chunks/{NcAppNavigationItem-g_XncGxL.mjs.map → NcAppNavigationItem-A1yAdDNN.mjs.map} +1 -1
  101. package/dist/chunks/{NcAppNavigationItem-AdLvgSbV.cjs → NcAppNavigationItem-Wb8gX-Ln.cjs} +1 -1
  102. package/dist/chunks/{NcAppNavigationItem-AdLvgSbV.cjs.map → NcAppNavigationItem-Wb8gX-Ln.cjs.map} +1 -1
  103. package/dist/chunks/{NcAppNavigationSettings-UKQnGAEz.cjs → NcAppNavigationSettings-VLa79G7w.cjs} +1 -1
  104. package/dist/chunks/{NcAppNavigationSettings-UKQnGAEz.cjs.map → NcAppNavigationSettings-VLa79G7w.cjs.map} +1 -1
  105. package/dist/chunks/{NcAppNavigationSettings-DQHPDc4X.mjs → NcAppNavigationSettings-gwL_FqLN.mjs} +1 -1
  106. package/dist/chunks/{NcAppNavigationSettings-DQHPDc4X.mjs.map → NcAppNavigationSettings-gwL_FqLN.mjs.map} +1 -1
  107. package/dist/chunks/{NcAppSidebar-WyDtlgwP.cjs → NcAppSidebar-rRNJnN-k.cjs} +59 -31
  108. package/dist/chunks/NcAppSidebar-rRNJnN-k.cjs.map +1 -0
  109. package/dist/chunks/{NcAppSidebar-Wo8-p3nm.mjs → NcAppSidebar-tnHBPGbL.mjs} +138 -109
  110. package/dist/chunks/NcAppSidebar-tnHBPGbL.mjs.map +1 -0
  111. package/dist/chunks/{NcAvatar-c9ryo-7h.mjs → NcAvatar-xT3kz6mU.mjs} +2 -2
  112. package/dist/chunks/{NcAvatar-c9ryo-7h.mjs.map → NcAvatar-xT3kz6mU.mjs.map} +1 -1
  113. package/dist/chunks/{NcAvatar-khVnYpF2.cjs → NcAvatar-zTS9P1lK.cjs} +2 -2
  114. package/dist/chunks/{NcAvatar-khVnYpF2.cjs.map → NcAvatar-zTS9P1lK.cjs.map} +1 -1
  115. package/dist/chunks/{NcBreadcrumb-SEyo99to.cjs → NcBreadcrumb-DEWk7wO9.cjs} +27 -20
  116. package/dist/chunks/NcBreadcrumb-DEWk7wO9.cjs.map +1 -0
  117. package/dist/chunks/{NcBreadcrumb-Ac0G-oky.mjs → NcBreadcrumb-w1UX2NR-.mjs} +14 -7
  118. package/dist/chunks/NcBreadcrumb-w1UX2NR-.mjs.map +1 -0
  119. package/dist/chunks/{NcBreadcrumbs-DXpOwLNx.cjs → NcBreadcrumbs-VuaG3ex5.cjs} +1 -1
  120. package/dist/chunks/{NcBreadcrumbs-DXpOwLNx.cjs.map → NcBreadcrumbs-VuaG3ex5.cjs.map} +1 -1
  121. package/dist/chunks/{NcBreadcrumbs-YOANgGCY.mjs → NcBreadcrumbs-tRR9CjKD.mjs} +2 -2
  122. package/dist/chunks/{NcBreadcrumbs-YOANgGCY.mjs.map → NcBreadcrumbs-tRR9CjKD.mjs.map} +1 -1
  123. package/dist/chunks/{NcDashboardWidget-zBrcpL_E.cjs → NcDashboardWidget-QciRRvL4.cjs} +1 -1
  124. package/dist/chunks/{NcDashboardWidget-zBrcpL_E.cjs.map → NcDashboardWidget-QciRRvL4.cjs.map} +1 -1
  125. package/dist/chunks/{NcDashboardWidget-bEnoXtKm.mjs → NcDashboardWidget-ogqyHahY.mjs} +2 -2
  126. package/dist/chunks/{NcDashboardWidget-bEnoXtKm.mjs.map → NcDashboardWidget-ogqyHahY.mjs.map} +1 -1
  127. package/dist/chunks/{NcDashboardWidgetItem-LcxIx2-S.cjs → NcDashboardWidgetItem-mIPkPR7r.cjs} +1 -1
  128. package/dist/chunks/{NcDashboardWidgetItem-LcxIx2-S.cjs.map → NcDashboardWidgetItem-mIPkPR7r.cjs.map} +1 -1
  129. package/dist/chunks/{NcDashboardWidgetItem-p7yyFX-b.mjs → NcDashboardWidgetItem-wuUHTeLl.mjs} +2 -2
  130. package/dist/chunks/{NcDashboardWidgetItem-p7yyFX-b.mjs.map → NcDashboardWidgetItem-wuUHTeLl.mjs.map} +1 -1
  131. package/dist/chunks/{NcHeaderMenu-BSi8E43v.cjs → NcHeaderMenu-0d6eqre6.cjs} +6 -6
  132. package/dist/chunks/{NcHeaderMenu-Vytc8Eqg.mjs.map → NcHeaderMenu-0d6eqre6.cjs.map} +1 -1
  133. package/dist/chunks/{NcHeaderMenu-Vytc8Eqg.mjs → NcHeaderMenu-91qMsRIw.mjs} +3 -3
  134. package/dist/chunks/{NcHeaderMenu-BSi8E43v.cjs.map → NcHeaderMenu-91qMsRIw.mjs.map} +1 -1
  135. package/dist/chunks/{NcListItem-lqYZQhuZ.cjs → NcListItem--_PCqetA.cjs} +30 -47
  136. package/dist/chunks/NcListItem--_PCqetA.cjs.map +1 -0
  137. package/dist/chunks/{NcListItem-90hXqC4C.mjs → NcListItem-AMcc69jK.mjs} +33 -50
  138. package/dist/chunks/NcListItem-AMcc69jK.mjs.map +1 -0
  139. package/dist/chunks/{NcListItemIcon-ccke4gpg.cjs → NcListItemIcon-BnoIbVbD.cjs} +2 -2
  140. package/dist/chunks/{NcListItemIcon-ccke4gpg.cjs.map → NcListItemIcon-BnoIbVbD.cjs.map} +1 -1
  141. package/dist/chunks/{NcListItemIcon-hTbMo3-O.mjs → NcListItemIcon-rqgXledP.mjs} +2 -2
  142. package/dist/chunks/{NcListItemIcon-hTbMo3-O.mjs.map → NcListItemIcon-rqgXledP.mjs.map} +1 -1
  143. package/dist/chunks/NcRichContenteditable-eG8Fyo-M.mjs +638 -0
  144. package/dist/chunks/NcRichContenteditable-eG8Fyo-M.mjs.map +1 -0
  145. package/dist/chunks/{NcRichContenteditable-WxSgSNot.cjs → NcRichContenteditable-jReu2l-M.cjs} +235 -111
  146. package/dist/chunks/NcRichContenteditable-jReu2l-M.cjs.map +1 -0
  147. package/dist/chunks/NcRichText-Yo5pFnd0.cjs +310 -0
  148. package/dist/chunks/NcRichText-Yo5pFnd0.cjs.map +1 -0
  149. package/dist/chunks/NcRichText-qID66jAy.mjs +325 -0
  150. package/dist/chunks/NcRichText-qID66jAy.mjs.map +1 -0
  151. package/dist/chunks/{NcSelect-rMSul72R.cjs → NcSelect-U9LJcdIo.cjs} +55 -45
  152. package/dist/chunks/NcSelect-U9LJcdIo.cjs.map +1 -0
  153. package/dist/chunks/{NcSelect-vSPKKiyt.mjs → NcSelect-b2H-YQsK.mjs} +40 -30
  154. package/dist/chunks/NcSelect-b2H-YQsK.mjs.map +1 -0
  155. package/dist/chunks/{NcSelectTags-MwCs_QbM.mjs → NcSelectTags-MlILya2b.mjs} +1 -1
  156. package/dist/chunks/{NcSelectTags-MwCs_QbM.mjs.map → NcSelectTags-MlILya2b.mjs.map} +1 -1
  157. package/dist/chunks/{NcSelectTags-beMN3ZsT.cjs → NcSelectTags-rO88Pk-1.cjs} +1 -1
  158. package/dist/chunks/{NcSelectTags-beMN3ZsT.cjs.map → NcSelectTags-rO88Pk-1.cjs.map} +1 -1
  159. package/dist/chunks/{NcSettingsSelectGroup-msn3aYsn.cjs → NcSettingsSelectGroup-rfeDPLCg.cjs} +1 -1
  160. package/dist/chunks/{NcSettingsSelectGroup-msn3aYsn.cjs.map → NcSettingsSelectGroup-rfeDPLCg.cjs.map} +1 -1
  161. package/dist/chunks/{NcSettingsSelectGroup-HkS2QpZS.mjs → NcSettingsSelectGroup-xhnDBg8a.mjs} +1 -1
  162. package/dist/chunks/{NcSettingsSelectGroup-HkS2QpZS.mjs.map → NcSettingsSelectGroup-xhnDBg8a.mjs.map} +1 -1
  163. package/dist/chunks/{NcTimezonePicker-Cp479kFL.cjs → NcTimezonePicker-KG0dvgUv.cjs} +1 -1
  164. package/dist/chunks/{NcTimezonePicker-Cp479kFL.cjs.map → NcTimezonePicker-KG0dvgUv.cjs.map} +1 -1
  165. package/dist/chunks/{NcTimezonePicker-I6wF2jeF.mjs → NcTimezonePicker-jJeiI-Ff.mjs} +1 -1
  166. package/dist/chunks/{NcTimezonePicker-I6wF2jeF.mjs.map → NcTimezonePicker-jJeiI-Ff.mjs.map} +1 -1
  167. package/dist/chunks/{NcUserBubble-6AbwSr2B.cjs → NcUserBubble-027_C0cM.cjs} +1 -1
  168. package/dist/chunks/{NcUserBubble-6AbwSr2B.cjs.map → NcUserBubble-027_C0cM.cjs.map} +1 -1
  169. package/dist/chunks/{NcUserBubble-imSUw-aP.mjs → NcUserBubble-9StjszDh.mjs} +1 -1
  170. package/dist/chunks/{NcUserBubble-imSUw-aP.mjs.map → NcUserBubble-9StjszDh.mjs.map} +1 -1
  171. package/dist/chunks/{ScopeComponent-CjAOgGnx.mjs → ScopeComponent-9fOoDGYa.mjs} +1 -1
  172. package/dist/chunks/{ScopeComponent-CjAOgGnx.mjs.map → ScopeComponent-9fOoDGYa.mjs.map} +1 -1
  173. package/dist/chunks/{ScopeComponent-V9SPec9g.cjs → ScopeComponent-R0tAsT2f.cjs} +1 -1
  174. package/dist/chunks/{ScopeComponent-V9SPec9g.cjs.map → ScopeComponent-R0tAsT2f.cjs.map} +1 -1
  175. package/dist/chunks/{index-U21dQVa7.cjs → index-5TyVc_TT.cjs} +29 -16
  176. package/dist/chunks/index-5TyVc_TT.cjs.map +1 -0
  177. package/dist/chunks/{index-n2q3iT69.mjs → index-xnq0-IMW.mjs} +26 -13
  178. package/dist/chunks/index-xnq0-IMW.mjs.map +1 -0
  179. package/dist/chunks/referencePickerModal-cPBjsn4r.cjs +2393 -0
  180. package/dist/chunks/referencePickerModal-cPBjsn4r.cjs.map +1 -0
  181. package/dist/chunks/referencePickerModal-gDBkGfNV.mjs +2414 -0
  182. package/dist/chunks/referencePickerModal-gDBkGfNV.mjs.map +1 -0
  183. package/dist/index.cjs +189 -170
  184. package/dist/index.cjs.map +1 -1
  185. package/dist/index.mjs +184 -165
  186. package/dist/index.mjs.map +1 -1
  187. package/dist/vendor.LICENSE.txt +4 -0
  188. package/package.json +4 -4
  189. package/dist/assets/NcListItem-6sL-frKJ.css +0 -165
  190. package/dist/assets/referencePickerModal-iy5QSWj6.css +0 -509
  191. package/dist/chunks/NcAppSidebar-Wo8-p3nm.mjs.map +0 -1
  192. package/dist/chunks/NcAppSidebar-WyDtlgwP.cjs.map +0 -1
  193. package/dist/chunks/NcBreadcrumb-Ac0G-oky.mjs.map +0 -1
  194. package/dist/chunks/NcBreadcrumb-SEyo99to.cjs.map +0 -1
  195. package/dist/chunks/NcListItem-90hXqC4C.mjs.map +0 -1
  196. package/dist/chunks/NcListItem-lqYZQhuZ.cjs.map +0 -1
  197. package/dist/chunks/NcRichContenteditable-WxSgSNot.cjs.map +0 -1
  198. package/dist/chunks/NcRichContenteditable-gQh2HFSV.mjs +0 -515
  199. package/dist/chunks/NcRichContenteditable-gQh2HFSV.mjs.map +0 -1
  200. package/dist/chunks/NcRichText-RSAcESV2.mjs +0 -353
  201. package/dist/chunks/NcRichText-RSAcESV2.mjs.map +0 -1
  202. package/dist/chunks/NcRichText-fHn-j5sa.cjs +0 -337
  203. package/dist/chunks/NcRichText-fHn-j5sa.cjs.map +0 -1
  204. package/dist/chunks/NcSelect-rMSul72R.cjs.map +0 -1
  205. package/dist/chunks/NcSelect-vSPKKiyt.mjs.map +0 -1
  206. package/dist/chunks/index-U21dQVa7.cjs.map +0 -1
  207. package/dist/chunks/index-n2q3iT69.mjs.map +0 -1
  208. package/dist/chunks/referencePickerModal-FeA-PRqB.mjs +0 -897
  209. package/dist/chunks/referencePickerModal-FeA-PRqB.mjs.map +0 -1
  210. package/dist/chunks/referencePickerModal-GXRJ351Q.cjs +0 -880
  211. package/dist/chunks/referencePickerModal-GXRJ351Q.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NcRichContenteditable-eG8Fyo-M.mjs","sources":["../../src/components/NcRichContenteditable/NcAutoCompleteResult.vue","../../src/components/NcRichContenteditable/NcRichContenteditable.vue"],"sourcesContent":["<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n-->\n\n<template>\n\t<div class=\"autocomplete-result\">\n\t\t<!-- Avatar or icon -->\n\t\t<div :class=\"[icon, `autocomplete-result__icon--${avatarUrl ? 'with-avatar' : ''}`]\"\n\t\t\t:style=\"avatarUrl ? { backgroundImage: `url(${avatarUrl})` } : null \"\n\t\t\tclass=\"autocomplete-result__icon\">\n\t\t\t<span v-if=\"status.icon\"\n\t\t\t\tclass=\"autocomplete-result__status autocomplete-result__status--icon\">\n\t\t\t\t{{ status && status.icon || '' }}\n\t\t\t</span>\n\t\t\t<NcUserStatusIcon v-else-if=\"status.status && status.status !== 'offline'\"\n\t\t\t\tclass=\"autocomplete-result__status\"\n\t\t\t\t:status=\"status.status\" />\n\t\t</div>\n\n\t\t<!-- Label and subline -->\n\t\t<span class=\"autocomplete-result__content\">\n\t\t\t<span class=\"autocomplete-result__title\" :title=\"labelWithFallback\">\n\t\t\t\t{{ labelWithFallback }}\n\t\t\t</span>\n\t\t\t<span v-if=\"subline\" class=\"autocomplete-result__subline\">\n\t\t\t\t{{ subline }}\n\t\t\t</span>\n\t\t</span>\n\t</div>\n</template>\n\n<script>\nimport { generateUrl } from '@nextcloud/router'\n\nimport NcUserStatusIcon from '../NcUserStatusIcon/index.js'\n\nexport default {\n\tname: 'NcAutoCompleteResult',\n\n\tcomponents: {\n\t\tNcUserStatusIcon,\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * @deprecated Use `label` instead\n\t\t */\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\trequired: false,\n\t\t\tdefault: null,\n\t\t},\n\t\tlabel: {\n\t\t\ttype: String,\n\t\t\trequired: false,\n\t\t\tdefault: null,\n\t\t},\n\t\tsubline: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\tid: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\ticonUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t\tsource: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tstatus: {\n\t\t\ttype: [Object, Array],\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\tcomputed: {\n\t\tavatarUrl() {\n\t\t\tif (this.iconUrl) {\n\t\t\t\treturn this.iconUrl\n\t\t\t}\n\n\t\t\treturn this.id && this.source === 'users'\n\t\t\t\t? this.getAvatarUrl(this.id, 44)\n\t\t\t\t: null\n\t\t},\n\t\t// For backwards compatibility\n\t\tlabelWithFallback() {\n\t\t\treturn this.label || this.title\n\t\t},\n\t},\n\n\tmethods: {\n\t\tgetAvatarUrl(user, size) {\n\t\t\treturn generateUrl('/avatar/{user}/{size}', {\n\t\t\t\tuser,\n\t\t\t\tsize,\n\t\t\t})\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.autocomplete-result {\n\tdisplay: flex;\n\theight: var(--default-clickable-area);\n\tpadding: var(--default-grid-baseline) 0;\n\n\t&__icon {\n\t\tposition: relative;\n\t\tflex: 0 0 var(--default-clickable-area);\n\t\twidth: var(--default-clickable-area);\n\t\tmin-width: var(--default-clickable-area);\n\t\theight: var(--default-clickable-area);\n\t\tborder-radius: var(--default-clickable-area);\n\t\tbackground-color: var(--color-background-darker);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t\tbackground-size: contain;\n\t\t&--with-avatar {\n\t\t\tcolor: inherit;\n\t\t\tbackground-size: cover;\n\t\t}\n\t}\n\n\t&__status {\n\t\tbox-sizing: border-box;\n\t\tposition: absolute;\n\t\tright: -4px;\n\t\tbottom: -4px;\n\t\tmin-width: 18px;\n\t\tmin-height: 18px;\n\t\twidth: 18px;\n\t\theight: 18px;\n\t\tborder: 2px solid var(--color-main-background);\n\t\tborder-radius: 50%;\n\t\tbackground-color: var(--color-main-background);\n\t\tfont-size: var(--default-font-size);\n\t\tline-height: 15px;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-size: 16px;\n\t\tbackground-position: center;\n\n\t\t&--icon {\n\t\t\tborder: none;\n\t\t\tbackground-color: transparent;\n\t\t}\n\t}\n\n\t&__content {\n\t\tdisplay: flex;\n\t\tflex: 1 1 100%;\n\t\tflex-direction: column;\n\t\tjustify-content: center;\n\t\tmin-width: 0;\n\t\tpadding-left: calc(var(--default-grid-baseline) * 2);\n\t}\n\n\t&__title,\n\t&__subline {\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t&__subline {\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n}\n\n</style>\n","<!--\n - @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @author John Molakvoæ <skjnldsv@protonmail.com>\n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see <http://www.gnu.org/licenses/>.\n-->\n\n<docs>\n\n### General description\n\nThis component displays contenteditable div with automated `@` [at] autocompletion and `:` [colon] emoji autocompletion.\n\n### Examples\n\nTry mentioning user @Test01 or inserting emoji :smile\n\n```vue\n<template>\n\t<div>\n\t\t<NcRichContenteditable\n\t\t\tlabel=\"Write a comment\"\n\t\t\t:value.sync=\"message\"\n\t\t\t:auto-complete=\"autoComplete\"\n\t\t\t:maxlength=\"100\"\n\t\t\t:user-data=\"userData\"\n\t\t\t@submit=\"onSubmit\" />\n\t\t<br>\n\n\t\t<NcRichContenteditable\n\t\t\t:value.sync=\"message\"\n\t\t\t:auto-complete=\"autoComplete\"\n\t\t\t:maxlength=\"400\"\n\t\t\t:multiline=\"true\"\n\t\t\t:user-data=\"userData\"\n\t\t\t@submit=\"onSubmit\" />\n\n\t\t<h5>Output - raw</h5>\n\t\t{{ JSON.stringify(message) }}\n\n\t\t<h5>Output - preformatted</h5>\n\t\t<p class=\"pre-line\">{{ message }}</p>\n\n\t\t<h5>Output - in NcRichText with markdown support</h5>\n\t\t<NcRichText :text=\"text\" :arguments=\"userMentions\" autolink use-markdown />\n\t</div>\n</template>\n<script>\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tmessage: '**Lorem ipsum** dolor sit amet.',\n\t\t\t// You need to provide this for the inline mention to understand what to display or not.\n\t\t\t// Key should be a string with leading '@', like @Test02 or @\"Test Offline\"\n\t\t\tuserData: {\n\t\t\t\tTest01: {\n\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\tid: 'Test01',\n\t\t\t\t\tlabel: 'Test01',\n\t\t\t\t\tsource: 'users',\n\t\t\t\t\tprimary: true,\n\t\t\t\t},\n\t\t\t\tTest02: {\n\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\tid: 'Test02',\n\t\t\t\t\tlabel: 'Test02',\n\t\t\t\t\tsource: 'users',\n\t\t\t\t\tstatus: {\n\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\ticon: '🎡',\n\t\t\t\t\t\tmessage: 'Visiting London',\n\t\t\t\t\t\tstatus: 'away',\n\t\t\t\t\t},\n\t\t\t\t\tsubline: 'Visiting London',\n\t\t\t\t},\n\t\t\t\t'Test@User': {\n\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\tid: 'Test@User',\n\t\t\t\t\tlabel: 'Test 03',\n\t\t\t\t\tsource: 'users',\n\t\t\t\t\tstatus: {\n\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\ticon: '🎡',\n\t\t\t\t\t\tmessage: 'Having space in my name',\n\t\t\t\t\t\tstatus: 'online',\n\t\t\t\t\t},\n\t\t\t\t\tsubline: 'Visiting London',\n\t\t\t\t},\n\t\t\t\t'Test Offline': {\n\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\tid: 'Test Offline',\n\t\t\t\t\tlabel: 'Test Offline',\n\t\t\t\t\tsource: 'users',\n\t\t\t\t\tstatus: {\n\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\ticon: null,\n\t\t\t\t\t\tmessage: null,\n\t\t\t\t\t\tstatus: 'offline',\n\t\t\t\t\t},\n\t\t\t\t\tsubline: null,\n\t\t\t\t},\n\t\t\t\t'Test DND': {\n\t\t\t\t\ticon: 'icon-user',\n\t\t\t\t\tid: 'Test DND',\n\t\t\t\t\tlabel: 'Test DND',\n\t\t\t\t\tsource: 'users',\n\t\t\t\t\tstatus: {\n\t\t\t\t\t\tclearAt: null,\n\t\t\t\t\t\ticon: null,\n\t\t\t\t\t\tmessage: 'Out sick',\n\t\t\t\t\t\tstatus: 'dnd',\n\t\t\t\t\t},\n\t\t\t\t\tsubline: 'Out sick',\n\t\t\t\t},\n\t\t\t},\n\t\t\t// To display user bubbles in NcRichText, special format of data should be provided:\n\t\t\t// Key should be in curly brackets without '@' and ' ' symbols, like {user-2}\n\t\t\tuserMentions: {\n\t\t\t\t'user-1': {\n\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tdisplayName: 'Test01',\n\t\t\t\t\t\tuser: 'Test01',\n\t\t\t\t\t\tprimary: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'user-2': {\n\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tdisplayName: 'Test02',\n\t\t\t\t\t\tuser: 'Test02',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'user-3': {\n\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tdisplayName: 'Test 03',\n\t\t\t\t\t\tuser: 'Test@User',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'user-4': {\n\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tdisplayName: 'Test Offline',\n\t\t\t\t\t\tuser: 'Test Offline',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t'user-5': {\n\t\t\t\t\tcomponent: 'NcUserBubble',\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tdisplayName: 'Test DND',\n\t\t\t\t\t\tuser: 'Test DND',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t},\n\tcomputed: {\n\t\ttext() {\n\t\t\treturn this.message\n\t\t\t\t\t.replace('@Test01', '{user-1}')\n\t\t\t\t\t.replace('@Test02', '{user-2}')\n\t\t\t\t\t.replace('@Test@User', '{user-3}')\n\t\t\t\t\t.replace('@\"Test Offline\"', '{user-4}')\n\t\t\t\t\t.replace('@\"Test DND\"', '{user-5}')\n\t\t},\n\t},\n\tmethods: {\n\t\t/**\n\t\t* Do your own query to the autocompletion api.\n\t\t* The returned data bellow is a fake data example.\n\t\t* The callback expects the same format returned by the core/autocomplete/get ocs api endpoint!\n\t\t* @see userData example above\n\t\t*\n\t\t* @param {string} search the query\n\t\t* @param {Function} callback the callback to process the results with\n\t\t*/\n\t\tautoComplete(search, callback) {\n\t\t\tcallback(Object.values(this.userData))\n\t\t},\n\t\tonSubmit() {\n\t\t\talert(this.message)\n\t\t}\n\t}\n}\n</script>\n<style lang=\"scss\" scoped>\n\th5 {\n\t\tfont-weight: bold;\n\t\tmargin: 40px 0 20px 0;\n\t}\n\n\t.pre-line {\n\t\twhite-space: pre-line;\n\t}\n</style>\n```\n\n</docs>\n\n<template>\n\t<div class=\"rich-contenteditable\">\n\t\t<div :id=\"id\"\n\t\t\tref=\"contenteditable\"\n\t\t\tv-tooltip=\"tooltipString\"\n\t\t\t:class=\"{\n\t\t\t\t'rich-contenteditable__input--empty': isEmptyValue,\n\t\t\t\t'rich-contenteditable__input--multiline': multiline,\n\t\t\t\t'rich-contenteditable__input--has-label': label,\n\t\t\t\t'rich-contenteditable__input--overflow': isOverMaxlength,\n\t\t\t\t'rich-contenteditable__input--disabled': disabled,\n\t\t\t}\"\n\t\t\t:contenteditable=\"canEdit\"\n\t\t\t:aria-labelledby=\"label ? labelId : undefined\"\n\t\t\t:aria-placeholder=\"placeholder\"\n\t\t\taria-multiline=\"true\"\n\t\t\tclass=\"rich-contenteditable__input\"\n\t\t\trole=\"textbox\"\n\t\t\taria-haspopup=\"listbox\"\n\t\t\taria-autocomplete=\"inline\"\n\t\t\t:aria-controls=\"tributeId\"\n\t\t\t:aria-expanded=\"isAutocompleteOpen ? 'true' : 'false'\"\n\t\t\t:aria-activedescendant=\"autocompleteActiveId\"\n\t\t\tv-bind=\"$attrs\"\n\t\t\tv-on=\"listeners\"\n\t\t\t@focus=\"moveCursorToEnd\"\n\t\t\t@input=\"onInput\"\n\t\t\t@compositionstart=\"isComposing = true\"\n\t\t\t@compositionend=\"isComposing = false\"\n\t\t\t@keydown.delete=\"onDelete\"\n\t\t\t@keydown.enter.exact=\"onEnter\"\n\t\t\t@keydown.ctrl.enter.exact.stop.prevent=\"onCtrlEnter\"\n\t\t\t@paste=\"onPaste\"\n\t\t\t@keyup.stop.prevent.capture=\"onKeyUp\"\n\t\t\t@keydown.up.exact.stop=\"onTributeArrowKeyDown\"\n\t\t\t@keydown.down.exact.stop=\"onTributeArrowKeyDown\"\n\t\t\t@tribute-active-true=\"onTributeActive(true)\"\n\t\t\t@tribute-active-false=\"onTributeActive(false)\" />\n\t\t<div v-if=\"label\"\n\t\t\t:id=\"labelId\"\n\t\t\tclass=\"rich-contenteditable__label\">\n\t\t\t{{ label }}\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { t } from '../../l10n.js'\nimport NcAutoCompleteResult from './NcAutoCompleteResult.vue'\nimport richEditor from '../../mixins/richEditor/index.js'\nimport Tooltip from '../../directives/Tooltip/index.js'\nimport { emojiSearch, emojiAddRecent } from '../../functions/emoji/index.ts'\nimport { searchProvider, getLinkWithPicker } from '../NcRichText/index.js'\n\nimport Tribute from 'tributejs/dist/tribute.esm.js'\nimport debounce from 'debounce'\nimport stringLength from 'string-length'\nimport GenRandomId from '../../utils/GenRandomId.js'\n\n/**\n * Populate the list of text smiles we want to offer via Tribute.\n * We add the colon `:)` and colon-dash `:-)` version for each of them.\n */\nconst smilesCharacters = ['d', 'D', 'p', 'P', 's', 'S', 'x', 'X', ')', '(', '|', '/']\nconst textSmiles = []\nsmilesCharacters.forEach((char) => {\n\ttextSmiles.push(':' + char)\n\ttextSmiles.push(':-' + char)\n})\n\nexport default {\n\tname: 'NcRichContenteditable',\n\n\tdirectives: {\n\t\ttooltip: Tooltip,\n\t},\n\n\tmixins: [richEditor],\n\n\tinheritAttrs: false,\n\n\tprops: {\n\t\t/**\n\t\t * The ID attribute of the content editable\n\t\t */\n\t\tid: {\n\t\t\ttype: String,\n\t\t\tdefault: () => GenRandomId(7),\n\t\t},\n\n\t\t/**\n\t\t * Visual label of the contenteditable\n\t\t */\n\t\tlabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\tvalue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t\trequired: true,\n\t\t},\n\n\t\tplaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: t('Write a message …'),\n\t\t},\n\n\t\tautoComplete: {\n\t\t\ttype: Function,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\tmenuContainer: {\n\t\t\ttype: Element,\n\t\t\tdefault: () => document.body,\n\t\t},\n\n\t\t/**\n\t\t * Make the contenteditable looks like a textarea or not.\n\t\t * Default looks like a single-line input.\n\t\t * This also handle the default enter/shift+enter behaviour.\n\t\t * if multiline, enter = newline; otherwise enter = submit\n\t\t * shift+enter always add a new line. ctrl+enter always submits\n\t\t */\n\t\tmultiline: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Is the content editable ?\n\t\t */\n\t\tcontenteditable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Disable the editing and show specific disabled design\n\t\t */\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Max allowed length\n\t\t */\n\t\tmaxlength: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Enable or disable emoji autocompletion\n\t\t */\n\t\temojiAutocomplete: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Enable or disable link autocompletion\n\t\t */\n\t\tlinkAutocomplete: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\n\temits: [\n\t\t'submit',\n\t\t'paste',\n\t\t'update:value',\n\t\t'smart-picker-submit',\n\t],\n\n\tsetup() {\n\t\tconst uid = GenRandomId(5)\n\t\treturn {\n\t\t\t// Constants\n\t\t\tlabelId: `nc-rich-contenteditable-${uid}-label`,\n\t\t\ttributeId: `nc-rich-contenteditable-${uid}-tribute`,\n\t\t\t/**\n\t\t\t * Non-reactive property to store Tribute instance\n\t\t\t *\n\t\t\t * @type {import('tributejs').default | null}\n\t\t\t */\n\t\t\ttribute: null,\n\t\t\ttributeStyleMutationObserver: null,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\t// Represent the raw untrimmed text of the contenteditable\n\t\t\t// serves no other purpose than to check whether the\n\t\t\t// content is empty or not\n\t\t\tlocalValue: this.value,\n\n\t\t\t// Is in text composition session in IME\n\t\t\tisComposing: false,\n\n\t\t\t// Tribute autocomplete\n\t\t\tisAutocompleteOpen: false,\n\t\t\tautocompleteActiveId: undefined,\n\t\t\tisTributeIntegrationDone: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Is the current trimmed value empty?\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisEmptyValue() {\n\t\t\treturn !this.localValue || this.localValue.trim() === ''\n\t\t},\n\n\t\t/**\n\t\t * Is this Firefox? 🙄\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisFF() {\n\t\t\treturn !!navigator.userAgent.match(/firefox/i)\n\t\t},\n\n\t\t/**\n\t\t * Is the current value over maxlength?\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisOverMaxlength() {\n\t\t\tif (this.isEmptyValue || !this.maxlength) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn stringLength(this.localValue) > this.maxlength\n\t\t},\n\n\t\t/**\n\t\t * Tooltip to show if characters count is over limit\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\ttooltipString() {\n\t\t\tif (!this.isOverMaxlength) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: t('Message limit of {count} characters reached', { count: this.maxlength }),\n\t\t\t\tshown: true,\n\t\t\t\ttrigger: 'manual',\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Edit is only allowed when contenteditableis true and disabled is false\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tcanEdit() {\n\t\t\treturn this.contenteditable && !this.disabled\n\t\t},\n\n\t\t/**\n\t\t * Proxied native event handlers without custom event handlers\n\t\t *\n\t\t * @return {Record<string, Function>}\n\t\t */\n\t\tlisteners() {\n\t\t\t/**\n\t\t\t * All component's event handlers are set as native event handlers with by v-on directive.\n\t\t\t * The component also raised custom events manually by $emit for corresponding events.\n\t\t\t * As a result, it triggers handlers twice.\n\t\t\t * The v-on=\"listeners\" directive should only set proxied native events handler without custom events\n\t\t\t */\n\t\t\tconst listeners = { ...this.$listeners }\n\t\t\tdelete listeners.paste\n\t\t\treturn listeners\n\t\t},\n\n\t\t/**\n\t\t * Compute debounce function for the autocomplete function\n\t\t */\n\t\t debouncedAutoComplete() {\n\t\t\treturn debounce(async (search, callback) => {\n\t\t\t\tthis.autoComplete(search, callback)\n\t\t\t}, 100)\n\t\t},\n\t},\n\n\twatch: {\n\t\t/**\n\t\t * If the parent value change, we compare the plain text rendering\n\t\t * If it's different, we render everything and update the main content\n\t\t */\n\t\tvalue() {\n\t\t\tconst html = this.$refs.contenteditable.innerHTML\n\t\t\t// Compare trimmed versions to be safe\n\t\t\tif (this.value.trim() !== this.parseContent(html).trim()) {\n\t\t\t\tthis.updateContent(this.value)\n\t\t\t}\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.initializeTribute()\n\n\t\t// Update default value\n\t\tthis.updateContent(this.value)\n\n\t\t// Removes the contenteditable attribute at first load if the prop is\n\t\t// set to false.\n\t\tthis.$refs.contenteditable.contentEditable = this.canEdit\n\t},\n\n\tbeforeDestroy() {\n\t\tif (this.tribute) {\n\t\t\tthis.tribute.detach(this.$refs.contenteditable)\n\t\t}\n\n\t\tif (this.tributeStyleMutationObserver) {\n\t\t\tthis.tributeStyleMutationObserver.disconnect()\n\t\t}\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Focus the richContenteditable\n\t\t *\n\t\t * @public\n\t\t */\n\t\tfocus() {\n\t\t\tthis.$refs.contenteditable.focus()\n\t\t},\n\n\t\tinitializeTribute() {\n\t\t\tconst renderMenuItem = (content) => `<div id=\"nc-rich-contenteditable-tribute-item-${GenRandomId(5)}\" class=\"${this.$style['tribute-item']}\" role=\"option\">${content}</div>`\n\n\t\t\tconst tributesCollection = []\n\t\t\ttributesCollection.push({\n\t\t\t\t// Allow spaces in the middle of mentions\n\t\t\t\tallowSpaces: true,\n\t\t\t\tfillAttr: 'id',\n\t\t\t\t// Search against id and label (display name) (fallback to title for v8.0.0..8.6.1 compatibility)\n\t\t\t\tlookup: result => `${result.id} ${result.label ?? result.title}`,\n\t\t\t\t// Where to inject the menu popup\n\t\t\t\tmenuContainer: this.menuContainer,\n\t\t\t\t// Popup mention autocompletion templates\n\t\t\t\tmenuItemTemplate: item => renderMenuItem(this.renderComponentHtml(item.original, NcAutoCompleteResult)),\n\t\t\t\t// Hide if no results\n\t\t\t\tnoMatchTemplate: () => '<span class=\"hidden\"></span>',\n\t\t\t\t// Inner display of mentions\n\t\t\t\tselectTemplate: item => this.genSelectTemplate(item?.original?.id),\n\t\t\t\t// Autocompletion results\n\t\t\t\tvalues: this.debouncedAutoComplete,\n\t\t\t\t// Class added to the menu container\n\t\t\t\tcontainerClass: `${this.$style['tribute-container']} ${this.$style['tribute-container-autocomplete']}`,\n\t\t\t\t// Class added to each list item\n\t\t\t\titemClass: this.$style['tribute-container__item'],\n\n\t\t\t})\n\n\t\t\tif (this.emojiAutocomplete) {\n\t\t\t\ttributesCollection.push({\n\t\t\t\t\ttrigger: ':',\n\t\t\t\t\t// Don't use the tribute search function at all\n\t\t\t\t\t// We pass search results as values (see below)\n\t\t\t\t\tlookup: (result, query) => query,\n\t\t\t\t\t// Where to inject the menu popup\n\t\t\t\t\tmenuContainer: this.menuContainer,\n\t\t\t\t\t// Popup mention autocompletion templates\n\t\t\t\t\tmenuItemTemplate: item => {\n\t\t\t\t\t\tif (textSmiles.includes(item.original)) {\n\t\t\t\t\t\t\t// Display the raw text string for :), :-D, … for non emoji results,\n\t\t\t\t\t\t\t// instead of trying to show an image and their name.\n\t\t\t\t\t\t\treturn item.original\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn renderMenuItem(`<span class=\"${this.$style['tribute-item__emoji']}\">${item.original.native}</span> :${item.original.short_name}`)\n\t\t\t\t\t},\n\t\t\t\t\t// Hide if no results\n\t\t\t\t\tnoMatchTemplate: () => t('No emoji found'),\n\t\t\t\t\t// Display raw emoji along with its name\n\t\t\t\t\tselectTemplate: (item) => {\n\t\t\t\t\t\tif (textSmiles.includes(item.original)) {\n\t\t\t\t\t\t\t// Replace the selection with the raw text string for :), :-D, … for non emoji results\n\t\t\t\t\t\t\treturn item.original\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\temojiAddRecent(item.original)\n\t\t\t\t\t\treturn item.original.native\n\t\t\t\t\t},\n\t\t\t\t\t// Pass the search results as values\n\t\t\t\t\tvalues: (text, cb) => {\n\t\t\t\t\t\tconst emojiResults = emojiSearch(text)\n\t\t\t\t\t\tif (textSmiles.includes(':' + text)) {\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * Prepend text smiles to the search results so that Tribute\n\t\t\t\t\t\t\t * is not interfering with normal writing, aka. \"Cocos Island Meme\".\n\t\t\t\t\t\t\t * E.g. `:)` and `:-)` got replaced by the flag of Cocos Island,\n\t\t\t\t\t\t\t * when submitting the input with Enter after writing them\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\temojiResults.unshift(':' + text)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcb(emojiResults)\n\t\t\t\t\t},\n\t\t\t\t\t// Class added to the menu container\n\t\t\t\t\tcontainerClass: `${this.$style['tribute-container']} ${this.$style['tribute-container-emoji']}`,\n\t\t\t\t\t// Class added to each list item\n\t\t\t\t\titemClass: this.$style['tribute-container__item'],\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (this.linkAutocomplete) {\n\t\t\t\ttributesCollection.push({\n\t\t\t\t\ttrigger: '/',\n\t\t\t\t\t// Don't use the tribute search function at all\n\t\t\t\t\t// We pass search results as values (see below)\n\t\t\t\t\tlookup: (result, query) => query,\n\t\t\t\t\t// Where to inject the menu popup\n\t\t\t\t\tmenuContainer: this.menuContainer,\n\t\t\t\t\t// Popup mention autocompletion templates\n\t\t\t\t\tmenuItemTemplate: item => renderMenuItem(`<img class=\"${this.$style['tribute-item__icon']}\" src=\"${item.original.icon_url}\"> <span class=\"${this.$style['tribute-item__title']}\">${item.original.title}</span>`),\n\t\t\t\t\t// Hide if no results\n\t\t\t\t\tnoMatchTemplate: () => t('No link provider found'),\n\t\t\t\t\tselectTemplate: this.getLink,\n\t\t\t\t\t// Pass the search results as values\n\t\t\t\t\tvalues: (text, cb) => cb(searchProvider(text)),\n\t\t\t\t\t// Class added to the menu container\n\t\t\t\t\tcontainerClass: `${this.$style['tribute-container']} ${this.$style['tribute-container-link']}`,\n\t\t\t\t\t// Class added to each list item\n\t\t\t\t\titemClass: this.$style['tribute-container__item'],\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tthis.tribute = new Tribute({ collection: tributesCollection })\n\t\t\tthis.tribute.attach(this.$refs.contenteditable)\n\t\t},\n\n\t\tgetLink(item) {\n\t\t\t// there is no way to get a tribute result asynchronously\n\t\t\t// so we immediately insert a node and replace it when the result comes\n\t\t\tgetLinkWithPicker(item.original.id)\n\t\t\t\t.then(result => {\n\t\t\t\t\t// replace dummy temp element by a text node which contains the picker result\n\t\t\t\t\tconst tmpElem = document.getElementById('tmp-smart-picker-result-node')\n\t\t\t\t\tconst eventData = {\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\tinsertText: true,\n\t\t\t\t\t}\n\t\t\t\t\tthis.$emit('smart-picker-submit', eventData)\n\t\t\t\t\tif (eventData.insertText) {\n\t\t\t\t\t\tconst newElem = document.createTextNode(result)\n\t\t\t\t\t\ttmpElem.replaceWith(newElem)\n\t\t\t\t\t\tthis.setCursorAfter(newElem)\n\t\t\t\t\t\tthis.updateValue(this.$refs.contenteditable.innerHTML)\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttmpElem.remove()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.debug('Smart picker promise rejected:', error)\n\t\t\t\t\tconst tmpElem = document.getElementById('tmp-smart-picker-result-node')\n\t\t\t\t\tthis.setCursorAfter(tmpElem)\n\t\t\t\t\ttmpElem.remove()\n\t\t\t\t})\n\t\t\treturn '<span id=\"tmp-smart-picker-result-node\"></span>'\n\t\t},\n\t\tsetCursorAfter(element) {\n\t\t\tconst range = document.createRange()\n\t\t\trange.setEndAfter(element)\n\t\t\trange.collapse()\n\t\t\tconst selection = window.getSelection()\n\t\t\tselection.removeAllRanges()\n\t\t\tselection.addRange(range)\n\t\t},\n\t\tmoveCursorToEnd() {\n\t\t\tif (!document.createRange) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst range = document.createRange()\n\t\t\trange.selectNodeContents(this.$refs.contenteditable)\n\t\t\trange.collapse(false)\n\t\t\tconst selection = window.getSelection()\n\t\t\tselection.removeAllRanges()\n\t\t\tselection.addRange(range)\n\t\t},\n\t\t/**\n\t\t * Re-emit the input event to the parent\n\t\t *\n\t\t * @param {Event} event the input event\n\t\t */\n\t\tonInput(event) {\n\t\t\tthis.updateValue(event.target.innerHTML)\n\t\t},\n\n\t\t/**\n\t\t * When pasting, sanitize the content, extract text\n\t\t * and render it again\n\t\t *\n\t\t * @param {Event} event the paste event\n\t\t * @fires Event paste the original paste event\n\t\t */\n\t\tonPaste(event) {\n\t\t\t// Either disabled or edit deactivated\n\t\t\tif (!this.canEdit) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tevent.preventDefault()\n\t\t\tconst clipboardData = event.clipboardData\n\n\t\t\t/** The original paste event */\n\t\t\tthis.$emit('paste', event)\n\n\t\t\t// If we have a file or if we don't have any text, ignore\n\t\t\tif (clipboardData.files.length !== 0\n\t\t\t\t|| !Object.values(clipboardData.items).find(item => item?.type.startsWith('text'))) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst text = clipboardData.getData('text')\n\t\t\tconst selection = window.getSelection()\n\n\t\t\t// If no selection, replace the whole data\n\t\t\tif (!selection.rangeCount) {\n\t\t\t\tthis.updateValue(text)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Generate text and insert\n\t\t\tconst range = selection.getRangeAt(0)\n\t\t\tselection.deleteFromDocument()\n\t\t\trange.insertNode(document.createTextNode(text))\n\n\t\t\t// Put cursor at the end of the selection\n\t\t\tconst newRange = document.createRange()\n\t\t\tnewRange.setStart(event.target, range.endOffset)\n\t\t\tnewRange.collapse(true)\n\t\t\tselection.removeAllRanges()\n\t\t\tselection.addRange(newRange)\n\n\t\t\t// Propagate data\n\t\t\tthis.updateValue(this.$refs.contenteditable.innerHTML)\n\t\t},\n\n\t\t/**\n\t\t * Update the value text from the provided html\n\t\t *\n\t\t * @param {string} htmlOrText the html content (or raw text with @mentions)\n\t\t */\n\t\tupdateValue(htmlOrText) {\n\t\t\tconst text = this.parseContent(htmlOrText)\n\t\t\tthis.localValue = text\n\t\t\tthis.$emit('update:value', text)\n\t\t},\n\n\t\t/**\n\t\t * Update content and local value\n\t\t *\n\t\t * @param {string} value the message value\n\t\t */\n\t\tupdateContent(value) {\n\t\t\tconst renderedContent = this.renderContent(value)\n\t\t\tthis.$refs.contenteditable.innerHTML = renderedContent\n\t\t\tthis.localValue = value\n\t\t},\n\n\t\t/**\n\t\t * Because FF have a decade old bug preventing contenteditable=false\n\t\t * to properly be deleted on backspace, we have to hack 👀\n\t\t * https://stackoverflow.com/a/59383394/3885878\n\t\t * https://stackoverflow.com/a/30574622\n\t\t *\n\t\t * @param {Event} event the delete keydown event\n\t\t */\n\t\tonDelete(event) {\n\t\t\tif (!this.isFF || !window.getSelection) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Either disabled or edit deactivated\n\t\t\tif (!this.canEdit) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// fix backspace bug in FF\n\t\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=685445\n\t\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=1665167\n\t\t\tconst selection = window.getSelection()\n\t\t\tconst node = event.target\n\t\t\tif (!selection.isCollapsed || !selection.rangeCount) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst curRange = selection.getRangeAt(selection.rangeCount - 1)\n\t\t\tif (curRange.commonAncestorContainer.nodeType === 3 && curRange.startOffset > 0) {\n\t\t\t\t// we are in child selection. The characters of the text node is being deleted\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst range = document.createRange()\n\t\t\tif (selection.anchorNode !== node) {\n\t\t\t\t// selection is in character mode. expand it to the whole editable field\n\t\t\t\trange.selectNodeContents(node)\n\t\t\t\trange.setEndBefore(selection.anchorNode)\n\t\t\t} else if (selection.anchorOffset > 0) {\n\t\t\t\trange.setEnd(node, selection.anchorOffset)\n\t\t\t} else {\n\t\t\t\t// reached the beginning of editable field\n\t\t\t\treturn\n\t\t\t}\n\t\t\trange.setStart(node, range.endOffset - 1)\n\n\t\t\tconst previousNode = range.cloneContents().lastChild\n\t\t\tif (previousNode && previousNode.contentEditable === 'false') {\n\t\t\t\t// this is some rich content, e.g. smile. We should help the user to delete it\n\t\t\t\trange.deleteContents()\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Enter key pressed. Submits if not multiline\n\t\t *\n\t\t * @param {Event} event the keydown event\n\t\t */\n\t\tonEnter(event) {\n\t\t\t// Prevent submitting if multiline\n\t\t\t// or length is over maxlength\n\t\t\t// or autocompletion menu is opened\n\t\t\t// or in a text composition session with IME\n\t\t\tif (this.multiline\n\t\t\t\t|| this.isOverMaxlength\n\t\t\t\t|| this.tribute.isActive\n\t\t\t\t|| this.isComposing) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tevent.preventDefault()\n\t\t\tevent.stopPropagation()\n\t\t\tthis.$emit('submit', event)\n\t\t},\n\n\t\t/**\n\t\t * Ctrl + Enter key pressed is used to submit\n\t\t *\n\t\t * @param {Event} event the keydown event\n\t\t */\n\t\tonCtrlEnter(event) {\n\t\t\tif (this.isOverMaxlength) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.$emit('submit', event)\n\t\t},\n\n\t\tonKeyUp(event) {\n\t\t\t// prevent tribute from opening on keyup\n\t\t\tevent.stopImmediatePropagation()\n\t\t},\n\n\t\t/**\n\t\t * Get HTML element with Tribute.js container\n\t\t * @return {HTMLElement}\n\t\t */\n\t\tgetTributeContainer() {\n\t\t\treturn this.tribute.menu\n\t\t},\n\n\t\t/**\n\t\t * Get the currently selected item element id in Tribute.js container\n\t\t * @return {HTMLElement}\n\t\t */\n\t\tgetTributeSelectedItem() {\n\t\t\t// Tribute does not provide a way to get the active item, only the data index\n\t\t\t// So we have to find it manually by select class\n\t\t\treturn this.getTributeContainer().querySelector('.highlight [id^=\"nc-rich-contenteditable-tribute-item-\"]')\n\t\t},\n\n\t\t/**\n\t\t * Handle Tribute activation\n\t\t * @param {boolean} isActive - is active\n\t\t */\n\t\tonTributeActive(isActive) {\n\t\t\tthis.isAutocompleteOpen = isActive\n\n\t\t\tif (isActive) {\n\t\t\t\t// Tribute.js doesn't support containerClass update when new collection is open\n\t\t\t\t// The first opened collection's containerClass stays forever\n\t\t\t\t// https://github.com/zurb/tribute/issues/595\n\t\t\t\t// https://github.com/zurb/tribute/issues/627\n\t\t\t\t// So we have to manually update the class\n\t\t\t\t// The default class is \"tribute-container\"\n\t\t\t\tthis.getTributeContainer().setAttribute('class', this.tribute.current.collection.containerClass || this.$style['tribute-container'])\n\n\t\t\t\tthis.setupTributeIntegration()\n\t\t\t} else {\n\t\t\t\t// Cancel loading data for autocomplete\n\t\t\t\t// Otherwise it could be received when another autocomplete is already opened\n\t\t\t\tthis.debouncedAutoComplete.clear()\n\n\t\t\t\t// Reset active item\n\t\t\t\tthis.autocompleteActiveId = undefined\n\n\t\t\t\tthis.setTributeFocusVisible(false)\n\t\t\t}\n\t\t},\n\n\t\tonTributeArrowKeyDown() {\n\t\t\tif (!this.isAutocompleteOpen) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.setTributeFocusVisible(true)\n\t\t\tthis.onTributeSelectedItemWillChange()\n\t\t},\n\n\t\tonTributeSelectedItemWillChange() {\n\t\t\t// Wait until tribute has updated the selected item\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tthis.autocompleteActiveId = this.getTributeSelectedItem()?.id\n\t\t\t})\n\t\t},\n\n\t\tsetupTributeIntegration() {\n\t\t\t// Setup integration only once on the first open\n\t\t\tif (this.isTributeIntegrationDone) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.isTributeIntegrationDone = true\n\n\t\t\tconst tributeContainer = this.getTributeContainer()\n\n\t\t\t// For aria-controls\n\t\t\ttributeContainer.id = this.tributeId\n\n\t\t\t// Container with options must be a listbox\n\t\t\ttributeContainer.setAttribute('role', 'listbox')\n\t\t\t// Reset list+listitem role from ul+li\n\t\t\tconst ul = tributeContainer.children[0]\n\t\t\tul.setAttribute('role', 'presentation')\n\n\t\t\t// Tribute.js does not provide a way to react on show/hide\n\t\t\t// tribute-active-true/false events are fired on initial activation, which is too early with async autoComplete function\n\t\t\tthis.tributeStyleMutationObserver = new MutationObserver(([{ target }]) => {\n\t\t\t\tif (target.style.display !== 'none') {\n\t\t\t\t\t// Tribute is visible - there will be selected item\n\t\t\t\t\tthis.onTributeSelectedItemWillChange()\n\t\t\t\t}\n\t\t\t}).observe(tributeContainer, {\n\t\t\t\tattributes: true,\n\t\t\t\tattributeFilter: ['style'],\n\t\t\t})\n\n\t\t\t// Handle selecting new item on mouse selection\n\t\t\ttributeContainer.addEventListener('mousemove', () => {\n\t\t\t\tthis.setTributeFocusVisible(false)\n\t\t\t\tthis.onTributeSelectedItemWillChange()\n\t\t\t}, { passive: true })\n\t\t},\n\n\t\t/**\n\t\t * Set tribute-container--focus-visible class on the Tribute container when the user navigates the listbox via keyboard.\n\t\t *\n\t\t * Because the real focus is kept on the textbox, we cannot use the :focus-visible pseudo-class\n\t\t * to style selected options in the autocomplete listbox.\n\t\t *\n\t\t * @param {boolean} withFocusVisible - should the focus-visible class be added\n\t\t */\n\t\tsetTributeFocusVisible(withFocusVisible) {\n\t\t\tif (withFocusVisible) {\n\t\t\t\tthis.getTributeContainer().classList.add(this.$style['tribute-container--focus-visible'])\n\t\t\t} else {\n\t\t\t\tthis.getTributeContainer().classList.remove(this.$style['tribute-container--focus-visible'])\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n// Standalone styling, independent from server\n.rich-contenteditable {\n\tposition: relative;\n\twidth: auto;\n\n\t&__label {\n\t\tposition: absolute;\n\t\tmargin-inline: 14px 0;\n\t\tmax-width: fit-content;\n\t\tinset-block-start: 11px;\n\t\tinset-inline: 0;\n\t\t// Fix color so that users do not think the input already has content\n\t\tcolor: var(--color-text-maxcontrast);\n\t\t// only one line labels are allowed\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\t// forward events to input\n\t\tpointer-events: none;\n\t\t// Position transition\n\t\ttransition: height var(--animation-quick), inset-block-start var(--animation-quick), font-size var(--animation-quick), color var(--animation-quick), background-color var(--animation-quick) var(--animation-slow);\n\t}\n\n\t&__input:focus + &__label,\n\t&__input:not(&__input--empty) + &__label {\n\t\tinset-block-start: -10px;\n\t\tline-height: 1.5; // minimum allowed line height for accessibility\n\t\tfont-size: 13px; // minimum allowed font size for accessibility\n\t\tfont-weight: 500;\n\t\tborder-radius: var(--default-grid-baseline) var(--default-grid-baseline) 0 0;\n\t\tbackground-color: var(--color-main-background);\n\t\tpadding-inline: 5px;\n\t\tmargin-inline-start: 9px;\n\n\t\ttransition: height var(--animation-quick), inset-block-start var(--animation-quick), font-size var(--animation-quick), color var(--animation-quick);\n\t}\n\n\t&__input {\n\t\toverflow-y: auto;\n\t\twidth: auto;\n\t\tmargin: 0;\n\t\tpadding: 8px;\n\t\tcursor: text;\n\t\twhite-space: pre-wrap;\n\t\tword-break: break-word;\n\t\tcolor: var(--color-main-text);\n\t\tborder: 2px solid var(--color-border-maxcontrast);\n\t\tborder-radius: var(--border-radius-large);\n\t\toutline: none;\n\t\tbackground-color: var(--color-main-background);\n\t\tfont-family: var(--font-face);\n\t\tfont-size: inherit;\n\t\tmin-height: $clickable-area;\n\t\tmax-height: $clickable-area * 5.5;\n\n\t\t&--has-label {\n\t\t\tmargin-top: 10px;\n\t\t}\n\n\t\t// Cannot use :empty because of firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=1513303\n\t\t&--empty:focus:before,\n\t\t&--empty:not(&--has-label):before {\n\t\t\tcontent: attr(aria-placeholder);\n\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t\tposition: absolute;\n\t\t}\n\n\t\t&[contenteditable='false']:not(&--disabled) {\n\t\t\tcursor: default;\n\t\t\tbackground-color: transparent;\n\t\t\tcolor: var(--color-main-text);\n\t\t\tborder-color: transparent;\n\t\t\topacity: 1;\n\t\t\tborder-radius: 0;\n\t\t}\n\n\t\t&--multiline {\n\t\t\tmin-height: $clickable-area * 3;\n\t\t\t// No max for mutiline\n\t\t\tmax-height: none;\n\t\t}\n\n\t\t&--disabled {\n\t\t\topacity: $opacity_disabled;\n\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t\tborder: 2px solid var(--color-background-darker);\n\t\t\tborder-radius: var(--border-radius);\n\t\t\tbackground-color: var(--color-background-dark);\n\t\t}\n\t}\n}\n\n</style>\n\n<style lang=\"scss\" module>\n.tribute-container {\n\tz-index: 9000;\n\toverflow: auto;\n\t// Space it out a bit from the text\n\tmargin: var(--default-grid-baseline) 0;\n\tpadding: var(--default-grid-baseline);\n\tcolor: var(--color-text-maxcontrast);\n\tborder-radius: var(--border-radius);\n\tbackground: var(--color-main-background);\n\tbox-shadow: 0 1px 5px var(--color-box-shadow);\n\n\t.tribute-container__item {\n\t\tcolor: var(--color-text-maxcontrast);\n\t\tborder-radius: var(--border-radius);\n\t\tpadding: var(--default-grid-baseline) calc(2 * var(--default-grid-baseline));\n\t\tmargin-bottom: var(--default-grid-baseline);\n\t\tcursor: pointer;\n\n\t\t&:last-child {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\n\t\t&:global(.highlight) {\n\t\t\tcolor: var(--color-main-text);\n\t\t\tbackground: var(--color-background-hover);\n\n\t\t\t&, * {\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t}\n\t}\n\n\t&.tribute-container--focus-visible {\n\t\t:global(.highlight).tribute-container__item {\n\t\t\toutline: 2px solid var(--color-main-text) !important;\n\t\t}\n\t}\n}\n\n.tribute-container-autocomplete {\n\tmin-width: 250px;\n\tmax-width: 300px;\n\t// Show maximum 4 entries and a half to show scroll\n\t// Autocomplete height\n\t// + 2 paddings around autocomplete\n\t// + 2 paddings arouind tribute item\n\t// + 1 padding gap\n\t// And 1.5 paddings - container's padding without the last gap\n\tmax-height: calc((var(--default-clickable-area) + 5 * var(--default-grid-baseline)) * 4.5 - 1.5 * var(--default-grid-baseline));\n}\n\n.tribute-container-emoji,\n.tribute-container-link {\n\tmin-width: 200px;\n\tmax-width: 200px;\n\t// Show maximum 5 entries and a half to show scroll\n\t// Item height\n\t// + 2 paddings around autocomplete\n\t// + 2 paddings arouind tribute item\n\t// + 1 padding gap\n\t// And 1.5 paddings - container's padding without the last gap\n\tmax-height: calc((24px + 3 * var(--default-grid-baseline)) * 5.5 - 1.5 * var(--default-grid-baseline));\n\n\t.tribute-item {\n\t\t// Take care of long names\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\n\t\t&__emoji {\n\t\t\tpadding-right: calc(var(--default-grid-baseline) * 2);\n\t\t}\n\t}\n}\n\n.tribute-container-link {\n\tmin-width: 200px;\n\tmax-width: 300px;\n\t.tribute-item {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\t&__title {\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\t\t&__icon {\n\t\t\tmargin: auto 0;\n\t\t\twidth: 20px;\n\t\t\theight: 20px;\n\t\t\tobject-fit: contain;\n\t\t\tpadding-right: calc(var(--default-grid-baseline) * 2);\n\t\t\tfilter: var(--background-invert-if-dark);\n\t\t}\n\t}\n}\n\n</style>\n"],"names":["_sfc_main","NcUserStatusIcon","user","size","generateUrl","smilesCharacters","textSmiles","char","Tooltip","richEditor","GenRandomId","t","uid","stringLength","listeners","debounce","search","callback","html","renderMenuItem","content","tributesCollection","result","item","NcAutoCompleteResult","query","emojiAddRecent","text","cb","emojiResults","emojiSearch","searchProvider","Tribute","getLinkWithPicker","tmpElem","eventData","newElem","error","element","range","selection","event","clipboardData","newRange","htmlOrText","value","renderedContent","node","curRange","previousNode","isActive","tributeContainer","target","withFocusVisible"],"mappings":"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"}
@@ -1,14 +1,19 @@
1
- require('../assets/NcRichContenteditable-j9edXOEH.css');
1
+ require('../assets/NcRichText-kDp48Nji.css');
2
+ require('../assets/NcRichContenteditable-N1TxeACO.css');
2
3
  "use strict";
3
- const s = require("./_l10n-Od-4xzJA.cjs"), f = require("@nextcloud/router"), g = require("./NcUserStatusIcon-79RsINrv.cjs"), p = require("./_plugin-vue2_normalizer-DCfUPqga.cjs"), _ = require("./index-U21dQVa7.cjs");
4
+ const s = require("./_l10n-Od-4xzJA.cjs"), f = require("@nextcloud/router"), _ = require("./NcUserStatusIcon-79RsINrv.cjs"), p = require("./_plugin-vue2_normalizer-DCfUPqga.cjs"), g = require("./index-5TyVc_TT.cjs");
4
5
  require("../Directives/Tooltip.cjs");
5
- const u = require("./emoji-mJIuLpNR.cjs"), c = require("./referencePickerModal-GXRJ351Q.cjs");
6
+ const c = require("./emoji-mJIuLpNR.cjs");
7
+ require("unist-util-visit");
8
+ require("unist-builder");
9
+ require("../Functions/registerReference.cjs");
10
+ require("@vueuse/core");
11
+ const d = require("./referencePickerModal-cPBjsn4r.cjs");
6
12
  require("@nextcloud/axios");
13
+ ;/* empty css */
7
14
  require("../Components/NcLoadingIcon.cjs");
8
15
  require("./NcCheckboxRadioSwitch.vue_vue_type_style_index_0_scoped_2603be83_lang-kOW4T17e.cjs");
9
- const d = require("./GenRandomId-ULxaMkkr.cjs");
10
- require("unist-util-visit");
11
- require("unist-builder");
16
+ const l = require("./GenRandomId-ULxaMkkr.cjs");
12
17
  require("unified");
13
18
  require("remark-parse");
14
19
  require("remark-gfm");
@@ -17,20 +22,29 @@ require("remark-rehype");
17
22
  require("rehype-react");
18
23
  require("rehype-external-links");
19
24
  require("../Components/NcEmptyContent.cjs");
20
- require("./NcSelect-rMSul72R.cjs");
25
+ require("./NcSelect-U9LJcdIo.cjs");
21
26
  require("./NcTextField-eclRKl_B.cjs");
22
27
  require("../Components/NcButton.cjs");
23
28
  require("../Components/NcModal.cjs");
24
29
  require("@nextcloud/event-bus");
25
- const b = require("tributejs/dist/tribute.esm.js"), C = require("debounce"), y = require("string-length"), v = require("floating-vue"), o = (t) => t && t.__esModule ? t : { default: t }, l = /* @__PURE__ */ o(b), k = /* @__PURE__ */ o(C), T = /* @__PURE__ */ o(y), S = {
30
+ const y = require("tributejs/dist/tribute.esm.js"), C = require("debounce"), v = require("string-length"), T = require("floating-vue"), u = (t) => t && t.__esModule ? t : { default: t }, A = /* @__PURE__ */ u(y), k = /* @__PURE__ */ u(C), w = /* @__PURE__ */ u(v), S = {
26
31
  name: "NcAutoCompleteResult",
27
32
  components: {
28
- NcUserStatusIcon: g.NcUserStatusIcon
33
+ NcUserStatusIcon: _.NcUserStatusIcon
29
34
  },
30
35
  props: {
36
+ /**
37
+ * @deprecated Use `label` instead
38
+ */
31
39
  title: {
32
40
  type: String,
33
- required: !0
41
+ required: !1,
42
+ default: null
43
+ },
44
+ label: {
45
+ type: String,
46
+ required: !1,
47
+ default: null
34
48
  },
35
49
  subline: {
36
50
  type: String,
@@ -60,6 +74,10 @@ const b = require("tributejs/dist/tribute.esm.js"), C = require("debounce"), y =
60
74
  computed: {
61
75
  avatarUrl() {
62
76
  return this.iconUrl ? this.iconUrl : this.id && this.source === "users" ? this.getAvatarUrl(this.id, 44) : null;
77
+ },
78
+ // For backwards compatibility
79
+ labelWithFallback() {
80
+ return this.label || this.title;
63
81
  }
64
82
  },
65
83
  methods: {
@@ -73,25 +91,41 @@ const b = require("tributejs/dist/tribute.esm.js"), C = require("debounce"), y =
73
91
  };
74
92
  var q = function() {
75
93
  var e = this, n = e._self._c;
76
- return n("div", { staticClass: "autocomplete-result" }, [n("div", { staticClass: "autocomplete-result__icon", class: [e.icon, `autocomplete-result__icon--${e.avatarUrl ? "with-avatar" : ""}`], style: e.avatarUrl ? { backgroundImage: `url(${e.avatarUrl})` } : null }, [e.status.icon ? n("span", { staticClass: "autocomplete-result__status autocomplete-result__status--icon" }, [e._v(" " + e._s(e.status && e.status.icon || "") + " ")]) : e.status.status && e.status.status !== "offline" ? n("NcUserStatusIcon", { staticClass: "autocomplete-result__status", attrs: { status: e.status.status } }) : e._e()], 1), n("span", { staticClass: "autocomplete-result__content" }, [n("span", { staticClass: "autocomplete-result__title", attrs: { title: e.title } }, [e._v(" " + e._s(e.title) + " ")]), e.subline ? n("span", { staticClass: "autocomplete-result__subline" }, [e._v(" " + e._s(e.subline) + " ")]) : e._e()])]);
77
- }, x = [], E = /* @__PURE__ */ p.normalizeComponent(
94
+ return n("div", { staticClass: "autocomplete-result" }, [n("div", { staticClass: "autocomplete-result__icon", class: [e.icon, `autocomplete-result__icon--${e.avatarUrl ? "with-avatar" : ""}`], style: e.avatarUrl ? { backgroundImage: `url(${e.avatarUrl})` } : null }, [e.status.icon ? n("span", { staticClass: "autocomplete-result__status autocomplete-result__status--icon" }, [e._v(" " + e._s(e.status && e.status.icon || "") + " ")]) : e.status.status && e.status.status !== "offline" ? n("NcUserStatusIcon", { staticClass: "autocomplete-result__status", attrs: { status: e.status.status } }) : e._e()], 1), n("span", { staticClass: "autocomplete-result__content" }, [n("span", { staticClass: "autocomplete-result__title", attrs: { title: e.labelWithFallback } }, [e._v(" " + e._s(e.labelWithFallback) + " ")]), e.subline ? n("span", { staticClass: "autocomplete-result__subline" }, [e._v(" " + e._s(e.subline) + " ")]) : e._e()])]);
95
+ }, I = [], x = /* @__PURE__ */ p.normalizeComponent(
78
96
  S,
79
97
  q,
80
- x,
98
+ I,
81
99
  !1,
82
100
  null,
83
- "b6d7cce6",
101
+ "9cff39ed",
84
102
  null,
85
103
  null
86
104
  );
87
- const m = E.exports;
105
+ const h = x.exports;
88
106
  s.register(s.t27, s.t30);
89
- const A = {
107
+ const $ = {
108
+ "material-design-icon": "_material-design-icon_6omw8_26",
109
+ "tribute-container": "_tribute-container_6omw8_34",
110
+ "tribute-container__item": "_tribute-container__item_6omw8_44",
111
+ "tribute-container--focus-visible": "_tribute-container--focus-visible_6omw8_61",
112
+ "tribute-container-autocomplete": "_tribute-container-autocomplete_6omw8_65",
113
+ "tribute-container-emoji": "_tribute-container-emoji_6omw8_71",
114
+ "tribute-container-link": "_tribute-container-link_6omw8_72",
115
+ "tribute-item": "_tribute-item_6omw8_77",
116
+ "tribute-item__emoji": "_tribute-item__emoji_6omw8_83",
117
+ "tribute-item__title": "_tribute-item__title_6omw8_96",
118
+ "tribute-item__icon": "_tribute-item__icon_6omw8_101"
119
+ }, E = ["d", "D", "p", "P", "s", "S", "x", "X", ")", "(", "|", "/"], a = [];
120
+ E.forEach((t) => {
121
+ a.push(":" + t), a.push(":-" + t);
122
+ });
123
+ const R = {
90
124
  name: "NcRichContenteditable",
91
125
  directives: {
92
- tooltip: v.VTooltip
126
+ tooltip: T.VTooltip
93
127
  },
94
- mixins: [_.richEditor],
128
+ mixins: [g.richEditor],
95
129
  inheritAttrs: !1,
96
130
  props: {
97
131
  /**
@@ -99,7 +133,7 @@ const A = {
99
133
  */
100
134
  id: {
101
135
  type: String,
102
- default: () => d.GenRandomId(7)
136
+ default: () => l.GenRandomId(7)
103
137
  },
104
138
  /**
105
139
  * Visual label of the contenteditable
@@ -178,76 +212,33 @@ const A = {
178
212
  "update:value",
179
213
  "smart-picker-submit"
180
214
  ],
181
- data() {
215
+ setup() {
216
+ const t = l.GenRandomId(5);
182
217
  return {
183
- labelId: `rich-label-${d.GenRandomId(5)}`,
184
- textSmiles: [],
218
+ // Constants
219
+ labelId: `nc-rich-contenteditable-${t}-label`,
220
+ tributeId: `nc-rich-contenteditable-${t}-tribute`,
221
+ /**
222
+ * Non-reactive property to store Tribute instance
223
+ *
224
+ * @type {import('tributejs').default | null}
225
+ */
185
226
  tribute: null,
186
- autocompleteOptions: {
187
- // Allow spaces in the middle of mentions
188
- allowSpaces: !0,
189
- fillAttr: "id",
190
- // Search against id and title (display name)
191
- lookup: (t) => `${t.id} ${t.title}`,
192
- // Where to inject the menu popup
193
- menuContainer: this.menuContainer,
194
- // Popup mention autocompletion templates
195
- menuItemTemplate: (t) => this.renderComponentHtml(t.original, m),
196
- // Hide if no results
197
- noMatchTemplate: () => '<span class="hidden"></span>',
198
- // Inner display of mentions
199
- selectTemplate: (t) => this.genSelectTemplate(t?.original?.id),
200
- // Autocompletion results
201
- values: this.debouncedAutoComplete
202
- },
203
- emojiOptions: {
204
- trigger: ":",
205
- // Don't use the tribute search function at all
206
- // We pass search results as values (see below)
207
- lookup: (t, e) => e,
208
- // Where to inject the menu popup
209
- menuContainer: this.menuContainer,
210
- // Popup mention autocompletion templates
211
- menuItemTemplate: (t) => this.textSmiles.includes(t.original) ? t.original : `<span class="tribute-container-emoji__item__emoji">${t.original.native}</span> :${t.original.short_name}`,
212
- // Hide if no results
213
- noMatchTemplate: () => s.t("No emoji found"),
214
- // Display raw emoji along with its name
215
- selectTemplate: (t) => this.textSmiles.includes(t.original) ? t.original : (u.emojiAddRecent(t.original), t.original.native),
216
- // Pass the search results as values
217
- values: (t, e) => {
218
- const n = u.emojiSearch(t);
219
- this.textSmiles.includes(":" + t) && n.unshift(":" + t), e(n);
220
- },
221
- // Class added to the menu container
222
- containerClass: "tribute-container-emoji",
223
- // Class added to each list item
224
- itemClass: "tribute-container-emoji__item"
225
- },
226
- linkOptions: {
227
- trigger: "/",
228
- // Don't use the tribute search function at all
229
- // We pass search results as values (see below)
230
- lookup: (t, e) => e,
231
- // Where to inject the menu popup
232
- menuContainer: this.menuContainer,
233
- // Popup mention autocompletion templates
234
- menuItemTemplate: (t) => `<img class="tribute-container-link__item__icon" src="${t.original.icon_url}"> <span class="tribute-container-link__item__title">${t.original.title}</span>`,
235
- // Hide if no results
236
- noMatchTemplate: () => s.t("No link provider found"),
237
- selectTemplate: this.getLink,
238
- // Pass the search results as values
239
- values: (t, e) => e(c.searchProvider(t)),
240
- // Class added to the menu container
241
- containerClass: "tribute-container-link",
242
- // Class added to each list item
243
- itemClass: "tribute-container-link__item"
244
- },
227
+ tributeStyleMutationObserver: null
228
+ };
229
+ },
230
+ data() {
231
+ return {
245
232
  // Represent the raw untrimmed text of the contenteditable
246
233
  // serves no other purpose than to check whether the
247
234
  // content is empty or not
248
235
  localValue: this.value,
249
236
  // Is in text composition session in IME
250
- isComposing: !1
237
+ isComposing: !1,
238
+ // Tribute autocomplete
239
+ isAutocompleteOpen: !1,
240
+ autocompleteActiveId: void 0,
241
+ isTributeIntegrationDone: !1
251
242
  };
252
243
  },
253
244
  computed: {
@@ -273,7 +264,7 @@ const A = {
273
264
  * @return {boolean}
274
265
  */
275
266
  isOverMaxlength() {
276
- return this.isEmptyValue || !this.maxlength ? !1 : T.default(this.localValue) > this.maxlength;
267
+ return this.isEmptyValue || !this.maxlength ? !1 : w.default(this.localValue) > this.maxlength;
277
268
  },
278
269
  /**
279
270
  * Tooltip to show if characters count is over limit
@@ -303,6 +294,14 @@ const A = {
303
294
  listeners() {
304
295
  const t = { ...this.$listeners };
305
296
  return delete t.paste, t;
297
+ },
298
+ /**
299
+ * Compute debounce function for the autocomplete function
300
+ */
301
+ debouncedAutoComplete() {
302
+ return k.default(async (t, e) => {
303
+ this.autoComplete(t, e);
304
+ }, 100);
306
305
  }
307
306
  },
308
307
  watch: {
@@ -316,13 +315,10 @@ const A = {
316
315
  }
317
316
  },
318
317
  mounted() {
319
- const t = ["d", "D", "p", "P", "s", "S", "x", "X", ")", "(", "|", "/"];
320
- this.textSmiles = [], t.forEach((e) => {
321
- this.textSmiles.push(":" + e), this.textSmiles.push(":-" + e);
322
- }), this.autocompleteTribute = new l.default(this.autocompleteOptions), this.autocompleteTribute.attach(this.$refs.contenteditable), this.emojiAutocomplete && (this.emojiTribute = new l.default(this.emojiOptions), this.emojiTribute.attach(this.$refs.contenteditable)), this.linkAutocomplete && (this.linkTribute = new l.default(this.linkOptions), this.linkTribute.attach(this.$refs.contenteditable)), this.updateContent(this.value), this.$refs.contenteditable.contentEditable = this.canEdit;
318
+ this.initializeTribute(), this.updateContent(this.value), this.$refs.contenteditable.contentEditable = this.canEdit;
323
319
  },
324
320
  beforeDestroy() {
325
- this.autocompleteTribute && this.autocompleteTribute.detach(this.$refs.contenteditable), this.emojiTribute && this.emojiTribute.detach(this.$refs.contenteditable), this.linkTribute && this.linkTribute.detach(this.$refs.contenteditable);
321
+ this.tribute && this.tribute.detach(this.$refs.contenteditable), this.tributeStyleMutationObserver && this.tributeStyleMutationObserver.disconnect();
326
322
  },
327
323
  methods: {
328
324
  /**
@@ -333,8 +329,72 @@ const A = {
333
329
  focus() {
334
330
  this.$refs.contenteditable.focus();
335
331
  },
332
+ initializeTribute() {
333
+ const t = (n) => `<div id="nc-rich-contenteditable-tribute-item-${l.GenRandomId(5)}" class="${this.$style["tribute-item"]}" role="option">${n}</div>`, e = [];
334
+ e.push({
335
+ // Allow spaces in the middle of mentions
336
+ allowSpaces: !0,
337
+ fillAttr: "id",
338
+ // Search against id and label (display name) (fallback to title for v8.0.0..8.6.1 compatibility)
339
+ lookup: (n) => `${n.id} ${n.label ?? n.title}`,
340
+ // Where to inject the menu popup
341
+ menuContainer: this.menuContainer,
342
+ // Popup mention autocompletion templates
343
+ menuItemTemplate: (n) => t(this.renderComponentHtml(n.original, h)),
344
+ // Hide if no results
345
+ noMatchTemplate: () => '<span class="hidden"></span>',
346
+ // Inner display of mentions
347
+ selectTemplate: (n) => this.genSelectTemplate(n?.original?.id),
348
+ // Autocompletion results
349
+ values: this.debouncedAutoComplete,
350
+ // Class added to the menu container
351
+ containerClass: `${this.$style["tribute-container"]} ${this.$style["tribute-container-autocomplete"]}`,
352
+ // Class added to each list item
353
+ itemClass: this.$style["tribute-container__item"]
354
+ }), this.emojiAutocomplete && e.push({
355
+ trigger: ":",
356
+ // Don't use the tribute search function at all
357
+ // We pass search results as values (see below)
358
+ lookup: (n, i) => i,
359
+ // Where to inject the menu popup
360
+ menuContainer: this.menuContainer,
361
+ // Popup mention autocompletion templates
362
+ menuItemTemplate: (n) => a.includes(n.original) ? n.original : t(`<span class="${this.$style["tribute-item__emoji"]}">${n.original.native}</span> :${n.original.short_name}`),
363
+ // Hide if no results
364
+ noMatchTemplate: () => s.t("No emoji found"),
365
+ // Display raw emoji along with its name
366
+ selectTemplate: (n) => a.includes(n.original) ? n.original : (c.emojiAddRecent(n.original), n.original.native),
367
+ // Pass the search results as values
368
+ values: (n, i) => {
369
+ const r = c.emojiSearch(n);
370
+ a.includes(":" + n) && r.unshift(":" + n), i(r);
371
+ },
372
+ // Class added to the menu container
373
+ containerClass: `${this.$style["tribute-container"]} ${this.$style["tribute-container-emoji"]}`,
374
+ // Class added to each list item
375
+ itemClass: this.$style["tribute-container__item"]
376
+ }), this.linkAutocomplete && e.push({
377
+ trigger: "/",
378
+ // Don't use the tribute search function at all
379
+ // We pass search results as values (see below)
380
+ lookup: (n, i) => i,
381
+ // Where to inject the menu popup
382
+ menuContainer: this.menuContainer,
383
+ // Popup mention autocompletion templates
384
+ menuItemTemplate: (n) => t(`<img class="${this.$style["tribute-item__icon"]}" src="${n.original.icon_url}"> <span class="${this.$style["tribute-item__title"]}">${n.original.title}</span>`),
385
+ // Hide if no results
386
+ noMatchTemplate: () => s.t("No link provider found"),
387
+ selectTemplate: this.getLink,
388
+ // Pass the search results as values
389
+ values: (n, i) => i(d.searchProvider(n)),
390
+ // Class added to the menu container
391
+ containerClass: `${this.$style["tribute-container"]} ${this.$style["tribute-container-link"]}`,
392
+ // Class added to each list item
393
+ itemClass: this.$style["tribute-container__item"]
394
+ }), this.tribute = new A.default({ collection: e }), this.tribute.attach(this.$refs.contenteditable);
395
+ },
336
396
  getLink(t) {
337
- return c.getLinkWithPicker(t.original.id).then((e) => {
397
+ return d.getLinkWithPicker(t.original.id).then((e) => {
338
398
  const n = document.getElementById("tmp-smart-picker-result-node"), i = {
339
399
  result: e,
340
400
  insertText: !0
@@ -384,7 +444,7 @@ const A = {
384
444
  return;
385
445
  t.preventDefault();
386
446
  const e = t.clipboardData;
387
- if (this.$emit("paste", t), e.files.length !== 0 || !Object.values(e.items).find((h) => h?.type.startsWith("text")))
447
+ if (this.$emit("paste", t), e.files.length !== 0 || !Object.values(e.items).find((b) => b?.type.startsWith("text")))
388
448
  return;
389
449
  const n = e.getData("text"), i = window.getSelection();
390
450
  if (!i.rangeCount) {
@@ -393,8 +453,8 @@ const A = {
393
453
  }
394
454
  const r = i.getRangeAt(0);
395
455
  i.deleteFromDocument(), r.insertNode(document.createTextNode(n));
396
- const a = document.createRange();
397
- a.setStart(t.target, r.endOffset), a.collapse(!0), i.removeAllRanges(), i.addRange(a), this.updateValue(this.$refs.contenteditable.innerHTML);
456
+ const o = document.createRange();
457
+ o.setStart(t.target, r.endOffset), o.collapse(!0), i.removeAllRanges(), i.addRange(o), this.updateValue(this.$refs.contenteditable.innerHTML);
398
458
  },
399
459
  /**
400
460
  * Update the value text from the provided html
@@ -439,8 +499,8 @@ const A = {
439
499
  else
440
500
  return;
441
501
  r.setStart(n, r.endOffset - 1);
442
- const a = r.cloneContents().lastChild;
443
- a && a.contentEditable === "false" && (r.deleteContents(), t.preventDefault());
502
+ const o = r.cloneContents().lastChild;
503
+ o && o.contentEditable === "false" && (r.deleteContents(), t.preventDefault());
444
504
  },
445
505
  /**
446
506
  * Enter key pressed. Submits if not multiline
@@ -448,7 +508,7 @@ const A = {
448
508
  * @param {Event} event the keydown event
449
509
  */
450
510
  onEnter(t) {
451
- this.multiline || this.isOverMaxlength || this.autocompleteTribute.isActive || this.emojiTribute.isActive || this.linkTribute.isActive || this.isComposing || (t.preventDefault(), t.stopPropagation(), this.$emit("submit", t));
511
+ this.multiline || this.isOverMaxlength || this.tribute.isActive || this.isComposing || (t.preventDefault(), t.stopPropagation(), this.$emit("submit", t));
452
512
  },
453
513
  /**
454
514
  * Ctrl + Enter key pressed is used to submit
@@ -458,18 +518,66 @@ const A = {
458
518
  onCtrlEnter(t) {
459
519
  this.isOverMaxlength || this.$emit("submit", t);
460
520
  },
461
- /**
462
- * Debounce the autocomplete function
463
- */
464
- debouncedAutoComplete: k.default(async function(t, e) {
465
- this.autoComplete(t, e);
466
- }, 100),
467
521
  onKeyUp(t) {
468
522
  t.stopImmediatePropagation();
523
+ },
524
+ /**
525
+ * Get HTML element with Tribute.js container
526
+ * @return {HTMLElement}
527
+ */
528
+ getTributeContainer() {
529
+ return this.tribute.menu;
530
+ },
531
+ /**
532
+ * Get the currently selected item element id in Tribute.js container
533
+ * @return {HTMLElement}
534
+ */
535
+ getTributeSelectedItem() {
536
+ return this.getTributeContainer().querySelector('.highlight [id^="nc-rich-contenteditable-tribute-item-"]');
537
+ },
538
+ /**
539
+ * Handle Tribute activation
540
+ * @param {boolean} isActive - is active
541
+ */
542
+ onTributeActive(t) {
543
+ this.isAutocompleteOpen = t, t ? (this.getTributeContainer().setAttribute("class", this.tribute.current.collection.containerClass || this.$style["tribute-container"]), this.setupTributeIntegration()) : (this.debouncedAutoComplete.clear(), this.autocompleteActiveId = void 0, this.setTributeFocusVisible(!1));
544
+ },
545
+ onTributeArrowKeyDown() {
546
+ this.isAutocompleteOpen && (this.setTributeFocusVisible(!0), this.onTributeSelectedItemWillChange());
547
+ },
548
+ onTributeSelectedItemWillChange() {
549
+ requestAnimationFrame(() => {
550
+ this.autocompleteActiveId = this.getTributeSelectedItem()?.id;
551
+ });
552
+ },
553
+ setupTributeIntegration() {
554
+ if (this.isTributeIntegrationDone)
555
+ return;
556
+ this.isTributeIntegrationDone = !0;
557
+ const t = this.getTributeContainer();
558
+ t.id = this.tributeId, t.setAttribute("role", "listbox"), t.children[0].setAttribute("role", "presentation"), this.tributeStyleMutationObserver = new MutationObserver(([{ target: n }]) => {
559
+ n.style.display !== "none" && this.onTributeSelectedItemWillChange();
560
+ }).observe(t, {
561
+ attributes: !0,
562
+ attributeFilter: ["style"]
563
+ }), t.addEventListener("mousemove", () => {
564
+ this.setTributeFocusVisible(!1), this.onTributeSelectedItemWillChange();
565
+ }, { passive: !0 });
566
+ },
567
+ /**
568
+ * Set tribute-container--focus-visible class on the Tribute container when the user navigates the listbox via keyboard.
569
+ *
570
+ * Because the real focus is kept on the textbox, we cannot use the :focus-visible pseudo-class
571
+ * to style selected options in the autocomplete listbox.
572
+ *
573
+ * @param {boolean} withFocusVisible - should the focus-visible class be added
574
+ */
575
+ setTributeFocusVisible(t) {
576
+ t ? this.getTributeContainer().classList.add(this.$style["tribute-container--focus-visible"]) : this.getTributeContainer().classList.remove(this.$style["tribute-container--focus-visible"]);
469
577
  }
470
578
  }
471
579
  };
472
- var R = function() {
580
+ var O = function() {
473
581
  var e = this, n = e._self._c;
474
582
  return n("div", { staticClass: "rich-contenteditable" }, [n("div", e._g(e._b({ directives: [{ name: "tooltip", rawName: "v-tooltip", value: e.tooltipString, expression: "tooltipString" }], ref: "contenteditable", staticClass: "rich-contenteditable__input", class: {
475
583
  "rich-contenteditable__input--empty": e.isEmptyValue,
@@ -477,7 +585,7 @@ var R = function() {
477
585
  "rich-contenteditable__input--has-label": e.label,
478
586
  "rich-contenteditable__input--overflow": e.isOverMaxlength,
479
587
  "rich-contenteditable__input--disabled": e.disabled
480
- }, attrs: { id: e.id, contenteditable: e.canEdit, "aria-labelledby": e.label ? e.labelId : void 0, "aria-placeholder": e.placeholder, "aria-multiline": "true", role: "textbox" }, on: { focus: e.moveCursorToEnd, input: e.onInput, compositionstart: function(i) {
588
+ }, attrs: { id: e.id, contenteditable: e.canEdit, "aria-labelledby": e.label ? e.labelId : void 0, "aria-placeholder": e.placeholder, "aria-multiline": "true", role: "textbox", "aria-haspopup": "listbox", "aria-autocomplete": "inline", "aria-controls": e.tributeId, "aria-expanded": e.isAutocompleteOpen ? "true" : "false", "aria-activedescendant": e.autocompleteActiveId }, on: { focus: e.moveCursorToEnd, input: e.onInput, compositionstart: function(i) {
481
589
  e.isComposing = !0;
482
590
  }, compositionend: function(i) {
483
591
  e.isComposing = !1;
@@ -487,19 +595,35 @@ var R = function() {
487
595
  return !i.type.indexOf("key") && e._k(i.keyCode, "enter", 13, i.key, "Enter") || i.ctrlKey || i.shiftKey || i.altKey || i.metaKey ? null : e.onEnter.apply(null, arguments);
488
596
  }, function(i) {
489
597
  return !i.type.indexOf("key") && e._k(i.keyCode, "enter", 13, i.key, "Enter") || !i.ctrlKey || i.shiftKey || i.altKey || i.metaKey ? null : (i.stopPropagation(), i.preventDefault(), e.onCtrlEnter.apply(null, arguments));
598
+ }, function(i) {
599
+ return !i.type.indexOf("key") && e._k(i.keyCode, "up", 38, i.key, ["Up", "ArrowUp"]) || i.ctrlKey || i.shiftKey || i.altKey || i.metaKey ? null : (i.stopPropagation(), e.onTributeArrowKeyDown.apply(null, arguments));
600
+ }, function(i) {
601
+ return !i.type.indexOf("key") && e._k(i.keyCode, "down", 40, i.key, ["Down", "ArrowDown"]) || i.ctrlKey || i.shiftKey || i.altKey || i.metaKey ? null : (i.stopPropagation(), e.onTributeArrowKeyDown.apply(null, arguments));
490
602
  }], paste: e.onPaste, "!keyup": function(i) {
491
603
  return i.stopPropagation(), i.preventDefault(), e.onKeyUp.apply(null, arguments);
604
+ }, "tribute-active-true": function(i) {
605
+ return e.onTributeActive(!0);
606
+ }, "tribute-active-false": function(i) {
607
+ return e.onTributeActive(!1);
492
608
  } } }, "div", e.$attrs, !1), e.listeners)), e.label ? n("div", { staticClass: "rich-contenteditable__label", attrs: { id: e.labelId } }, [e._v(" " + e._s(e.label) + " ")]) : e._e()]);
493
- }, w = [], N = /* @__PURE__ */ p.normalizeComponent(
494
- A,
609
+ }, D = [];
610
+ const m = {
611
+ $style: $
612
+ };
613
+ function M(t) {
614
+ for (var e in m)
615
+ this[e] = m[e];
616
+ }
617
+ var N = /* @__PURE__ */ p.normalizeComponent(
495
618
  R,
496
- w,
619
+ O,
620
+ D,
497
621
  !1,
498
- null,
499
- "eb9c34f9",
622
+ M,
623
+ "0c65f921",
500
624
  null,
501
625
  null
502
626
  );
503
- const j = N.exports;
504
- exports.NcAutoCompleteResult = m;
505
- exports.NcRichContenteditable = j;
627
+ const K = N.exports;
628
+ exports.NcAutoCompleteResult = h;
629
+ exports.NcRichContenteditable = K;