@nextcloud/vue 9.6.0 → 9.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 (193) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/assets/{NcAppNavigation-f2zUqaiQ.css → NcAppNavigation-BSo8jV19.css} +12 -12
  3. package/dist/assets/{NcAppNavigationSearch-Bpd_RlYz.css → NcAppNavigationSearch-DD7mo6OW.css} +8 -5
  4. package/dist/assets/{NcCheckboxRadioSwitch-BBLFj8M-.css → NcCheckboxRadioSwitch-DRqOiQON.css} +36 -36
  5. package/dist/assets/{NcModal-CUh8AdAE.css → NcModal-RDmyJqvC.css} +59 -59
  6. package/dist/assets/{NcPasswordField-ftYon3Xm.css → NcPasswordField-BN4HFgU5.css} +2 -2
  7. package/dist/assets/{NcRelatedResourcesPanel-D1efpH8E.css → NcRelatedResourcesPanel-Bx4CA8ph.css} +3 -3
  8. package/dist/assets/{NcRichContenteditable-Do20Rmk1.css → NcRichContenteditable-BXRR0rmI.css} +11 -11
  9. package/dist/assets/{NcRichText-ZpC0uhOy.css → NcRichText-9e40m1to.css} +93 -100
  10. package/dist/assets/autolink-C_iad4O_.css +25 -0
  11. package/dist/chunks/{NcActionButtonGroup-CrbcMWK-.mjs → NcActionButtonGroup-CgYSlRXJ.mjs} +2 -2
  12. package/dist/chunks/{NcActionButtonGroup-CrbcMWK-.mjs.map → NcActionButtonGroup-CgYSlRXJ.mjs.map} +1 -1
  13. package/dist/chunks/{NcActionInput-BrI5iKHo.mjs → NcActionInput-CKbFgbxQ.mjs} +5 -5
  14. package/dist/chunks/{NcActionInput-BrI5iKHo.mjs.map → NcActionInput-CKbFgbxQ.mjs.map} +1 -1
  15. package/dist/chunks/{NcActions-B_QR93qv.mjs → NcActions-CeP_c9MH.mjs} +2 -2
  16. package/dist/chunks/{NcActions-B_QR93qv.mjs.map → NcActions-CeP_c9MH.mjs.map} +1 -1
  17. package/dist/chunks/{NcAppContent-D27Kyq5N.mjs → NcAppContent-CdEdgX3o.mjs} +2 -2
  18. package/dist/chunks/{NcAppContent-D27Kyq5N.mjs.map → NcAppContent-CdEdgX3o.mjs.map} +1 -1
  19. package/dist/chunks/{NcAppNavigation-DQzgUarc.mjs → NcAppNavigation-C2njwnqV.mjs} +11 -4
  20. package/dist/chunks/NcAppNavigation-C2njwnqV.mjs.map +1 -0
  21. package/dist/chunks/{NcAppNavigationCaption-DsM6rzrK.mjs → NcAppNavigationCaption-C7cl2M2w.mjs} +2 -2
  22. package/dist/chunks/{NcAppNavigationCaption-DsM6rzrK.mjs.map → NcAppNavigationCaption-C7cl2M2w.mjs.map} +1 -1
  23. package/dist/chunks/{NcAppNavigationItem-XSXn3qhJ.mjs → NcAppNavigationItem-Csh8IBIf.mjs} +4 -4
  24. package/dist/chunks/{NcAppNavigationItem-XSXn3qhJ.mjs.map → NcAppNavigationItem-Csh8IBIf.mjs.map} +1 -1
  25. package/dist/chunks/{NcAppNavigationNewItem-CNb-I7xZ.mjs → NcAppNavigationNewItem-DsLct9Bj.mjs} +2 -2
  26. package/dist/chunks/{NcAppNavigationNewItem-CNb-I7xZ.mjs.map → NcAppNavigationNewItem-DsLct9Bj.mjs.map} +1 -1
  27. package/dist/chunks/{NcAppNavigationSearch-DpcjjmY5.mjs → NcAppNavigationSearch-C5XwT74Z.mjs} +6 -6
  28. package/dist/chunks/NcAppNavigationSearch-C5XwT74Z.mjs.map +1 -0
  29. package/dist/chunks/{NcAppNavigationSettings-CxjLIB1E.mjs → NcAppNavigationSettings-Drwi5qgh.mjs} +2 -2
  30. package/dist/chunks/{NcAppNavigationSettings-CxjLIB1E.mjs.map → NcAppNavigationSettings-Drwi5qgh.mjs.map} +1 -1
  31. package/dist/chunks/{NcAppSettingsDialog-Brgi3W2x.mjs → NcAppSettingsDialog-CjOvPWbc.mjs} +3 -3
  32. package/dist/chunks/{NcAppSettingsDialog-Brgi3W2x.mjs.map → NcAppSettingsDialog-CjOvPWbc.mjs.map} +1 -1
  33. package/dist/chunks/{NcAppSettingsShortcutsSection-HmIjAN0a.mjs → NcAppSettingsShortcutsSection-yDWzNzFB.mjs} +2 -2
  34. package/dist/chunks/{NcAppSettingsShortcutsSection-HmIjAN0a.mjs.map → NcAppSettingsShortcutsSection-yDWzNzFB.mjs.map} +1 -1
  35. package/dist/chunks/{NcAppSidebar-KwLsRcZO.mjs → NcAppSidebar-BvXH4I-d.mjs} +3 -3
  36. package/dist/chunks/{NcAppSidebar-KwLsRcZO.mjs.map → NcAppSidebar-BvXH4I-d.mjs.map} +1 -1
  37. package/dist/chunks/{NcAvatar-ruClKRzS.mjs → NcAvatar-D9yNUkjq.mjs} +6 -6
  38. package/dist/chunks/{NcAvatar-ruClKRzS.mjs.map → NcAvatar-D9yNUkjq.mjs.map} +1 -1
  39. package/dist/chunks/{NcBreadcrumb-D2NtMTnk.mjs → NcBreadcrumb-CfFsCTmn.mjs} +2 -2
  40. package/dist/chunks/{NcBreadcrumb-D2NtMTnk.mjs.map → NcBreadcrumb-CfFsCTmn.mjs.map} +1 -1
  41. package/dist/chunks/{NcBreadcrumbs-DDutZRtm.mjs → NcBreadcrumbs-bX1x_cye.mjs} +3 -3
  42. package/dist/chunks/{NcBreadcrumbs-DDutZRtm.mjs.map → NcBreadcrumbs-bX1x_cye.mjs.map} +1 -1
  43. package/dist/chunks/{NcCheckboxRadioSwitch-D0gFwEVl.mjs → NcCheckboxRadioSwitch-VV_Err2A.mjs} +9 -18
  44. package/dist/chunks/{NcCheckboxRadioSwitch-D0gFwEVl.mjs.map → NcCheckboxRadioSwitch-VV_Err2A.mjs.map} +1 -1
  45. package/dist/chunks/{NcChip-CrVOU2RM.mjs → NcChip-JjodlHFu.mjs} +3 -3
  46. package/dist/chunks/{NcChip-CrVOU2RM.mjs.map → NcChip-JjodlHFu.mjs.map} +1 -1
  47. package/dist/chunks/{NcCollectionList-pWG42SU1.mjs → NcCollectionList-DK050qCv.mjs} +6 -6
  48. package/dist/chunks/{NcCollectionList-pWG42SU1.mjs.map → NcCollectionList-DK050qCv.mjs.map} +1 -1
  49. package/dist/chunks/{NcColorPicker-D07Se8Xb.mjs → NcColorPicker-B1FEzC_4.mjs} +3 -3
  50. package/dist/chunks/{NcColorPicker-D07Se8Xb.mjs.map → NcColorPicker-B1FEzC_4.mjs.map} +1 -1
  51. package/dist/chunks/{NcContent-D69ktIEB.mjs → NcContent-bQ5c_Pwd.mjs} +2 -2
  52. package/dist/chunks/{NcContent-D69ktIEB.mjs.map → NcContent-bQ5c_Pwd.mjs.map} +1 -1
  53. package/dist/chunks/{NcDashboardWidget-CvpYMKur.mjs → NcDashboardWidget-CCeqnB6g.mjs} +4 -4
  54. package/dist/chunks/{NcDashboardWidget-CvpYMKur.mjs.map → NcDashboardWidget-CCeqnB6g.mjs.map} +1 -1
  55. package/dist/chunks/{NcDashboardWidgetItem-ZKImQn7Y.mjs → NcDashboardWidgetItem-i7xArH0I.mjs} +3 -3
  56. package/dist/chunks/{NcDashboardWidgetItem-ZKImQn7Y.mjs.map → NcDashboardWidgetItem-i7xArH0I.mjs.map} +1 -1
  57. package/dist/chunks/{NcDateTimePicker-DksKisgE.mjs → NcDateTimePicker-4-6ux1S_.mjs} +3 -3
  58. package/dist/chunks/{NcDateTimePicker-DksKisgE.mjs.map → NcDateTimePicker-4-6ux1S_.mjs.map} +1 -1
  59. package/dist/chunks/{NcDateTimePickerNative-BvtMQDIe.mjs → NcDateTimePickerNative-XO_O44n2.mjs} +2 -2
  60. package/dist/chunks/{NcDateTimePickerNative-BvtMQDIe.mjs.map → NcDateTimePickerNative-XO_O44n2.mjs.map} +1 -1
  61. package/dist/chunks/{NcDialog-nDc1gW50.mjs → NcDialog-DnJfLwGR.mjs} +3 -3
  62. package/dist/chunks/{NcDialog-nDc1gW50.mjs.map → NcDialog-DnJfLwGR.mjs.map} +1 -1
  63. package/dist/chunks/{NcDialogButton.vue_vue_type_script_setup_true_lang-Z_bOZAn_.mjs → NcDialogButton.vue_vue_type_script_setup_true_lang-DMoLf2ll.mjs} +2 -2
  64. package/dist/chunks/{NcDialogButton.vue_vue_type_script_setup_true_lang-Z_bOZAn_.mjs.map → NcDialogButton.vue_vue_type_script_setup_true_lang-DMoLf2ll.mjs.map} +1 -1
  65. package/dist/chunks/{NcEmojiPicker-DGgqTnHp.mjs → NcEmojiPicker-Cuy9A4DP.mjs} +6 -6
  66. package/dist/chunks/{NcEmojiPicker-DGgqTnHp.mjs.map → NcEmojiPicker-Cuy9A4DP.mjs.map} +1 -1
  67. package/dist/chunks/{NcFilePicker-DtOsHB4q.mjs → NcFilePicker-CrHd83Bv.mjs} +2 -2
  68. package/dist/chunks/{NcFilePicker-DtOsHB4q.mjs.map → NcFilePicker-CrHd83Bv.mjs.map} +1 -1
  69. package/dist/chunks/{NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang-CjJ09v8E.mjs → NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang-DhKiWUS8.mjs} +2 -2
  70. package/dist/chunks/{NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang-CjJ09v8E.mjs.map → NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang-DhKiWUS8.mjs.map} +1 -1
  71. package/dist/chunks/{NcHotkey-DYevuX3i.mjs → NcHotkey-B0qDRy1t.mjs} +2 -2
  72. package/dist/chunks/{NcHotkey-DYevuX3i.mjs.map → NcHotkey-B0qDRy1t.mjs.map} +1 -1
  73. package/dist/chunks/{NcHotkeyList-CHLWkWfY.mjs → NcHotkeyList-lslhX0EJ.mjs} +2 -2
  74. package/dist/chunks/{NcHotkeyList-CHLWkWfY.mjs.map → NcHotkeyList-lslhX0EJ.mjs.map} +1 -1
  75. package/dist/chunks/{NcInputConfirmCancel-Ch0byKa3.mjs → NcInputConfirmCancel-xoQuby4k.mjs} +2 -2
  76. package/dist/chunks/{NcInputConfirmCancel-Ch0byKa3.mjs.map → NcInputConfirmCancel-xoQuby4k.mjs.map} +1 -1
  77. package/dist/chunks/{NcKbd-DE1emmb_.mjs → NcKbd-Caeq706M.mjs} +2 -2
  78. package/dist/chunks/{NcKbd-DE1emmb_.mjs.map → NcKbd-Caeq706M.mjs.map} +1 -1
  79. package/dist/chunks/{NcListItem-DfFmqnmW.mjs → NcListItem-C0y1LfQx.mjs} +2 -2
  80. package/dist/chunks/{NcListItem-DfFmqnmW.mjs.map → NcListItem-C0y1LfQx.mjs.map} +1 -1
  81. package/dist/chunks/{NcListItemIcon-DJJR4RtI.mjs → NcListItemIcon-ByoiA9YZ.mjs} +3 -3
  82. package/dist/chunks/{NcListItemIcon-DJJR4RtI.mjs.map → NcListItemIcon-ByoiA9YZ.mjs.map} +1 -1
  83. package/dist/chunks/{NcMentionBubble.vue_vue_type_style_index_0_scoped_45238efd_lang-D6LzDiYf.mjs → NcMentionBubble.vue_vue_type_style_index_0_scoped_45238efd_lang-BX_KxRP-.mjs} +2 -2
  84. package/dist/chunks/{NcMentionBubble.vue_vue_type_style_index_0_scoped_45238efd_lang-D6LzDiYf.mjs.map → NcMentionBubble.vue_vue_type_style_index_0_scoped_45238efd_lang-BX_KxRP-.mjs.map} +1 -1
  85. package/dist/chunks/{NcModal-kyWZ3UFC.mjs → NcModal-CDj4hQx7.mjs} +9 -10
  86. package/dist/chunks/NcModal-CDj4hQx7.mjs.map +1 -0
  87. package/dist/chunks/{NcPasswordField-BOLzDHBJ.mjs → NcPasswordField-C7yuRADA.mjs} +11 -7
  88. package/dist/chunks/NcPasswordField-C7yuRADA.mjs.map +1 -0
  89. package/dist/chunks/{NcRelatedResourcesPanel-Cn27rj0H.mjs → NcRelatedResourcesPanel-B01Lid3d.mjs} +7 -7
  90. package/dist/chunks/{NcRelatedResourcesPanel-Cn27rj0H.mjs.map → NcRelatedResourcesPanel-B01Lid3d.mjs.map} +1 -1
  91. package/dist/chunks/{NcRichContenteditable-BREsny-v.mjs → NcRichContenteditable-DeN1H5pQ.mjs} +22 -19
  92. package/dist/chunks/NcRichContenteditable-DeN1H5pQ.mjs.map +1 -0
  93. package/dist/chunks/{NcRichText-D_ssz6sB.mjs → NcRichText-DGV7OHFb.mjs} +233 -308
  94. package/dist/chunks/NcRichText-DGV7OHFb.mjs.map +1 -0
  95. package/dist/chunks/{NcSelect-B1uITk_3.mjs → NcSelect-Ba-lsVsl.mjs} +3 -4
  96. package/dist/chunks/NcSelect-Ba-lsVsl.mjs.map +1 -0
  97. package/dist/chunks/{NcSelectTags-B3_tcJAf.mjs → NcSelectTags-cNBPJ5FM.mjs} +3 -3
  98. package/dist/chunks/{NcSelectTags-B3_tcJAf.mjs.map → NcSelectTags-cNBPJ5FM.mjs.map} +1 -1
  99. package/dist/chunks/{NcSelectUsers-B9ZFtd6B.mjs → NcSelectUsers-LqSEQ2A_.mjs} +3 -3
  100. package/dist/chunks/{NcSelectUsers-B9ZFtd6B.mjs.map → NcSelectUsers-LqSEQ2A_.mjs.map} +1 -1
  101. package/dist/chunks/{NcSettingsSection-DIcgD1vo.mjs → NcSettingsSection-DnzR8DRc.mjs} +2 -2
  102. package/dist/chunks/{NcSettingsSection-DIcgD1vo.mjs.map → NcSettingsSection-DnzR8DRc.mjs.map} +1 -1
  103. package/dist/chunks/{NcSettingsSelectGroup-CupkYUPJ.mjs → NcSettingsSelectGroup-C15v3EvD.mjs} +3 -3
  104. package/dist/chunks/{NcSettingsSelectGroup-CupkYUPJ.mjs.map → NcSettingsSelectGroup-C15v3EvD.mjs.map} +1 -1
  105. package/dist/chunks/{NcTextField.vue_vue_type_script_setup_true_lang-B-4HNjYH.mjs → NcTextField.vue_vue_type_script_setup_true_lang-1ABbHJ0f.mjs} +2 -2
  106. package/dist/chunks/{NcTextField.vue_vue_type_script_setup_true_lang-B-4HNjYH.mjs.map → NcTextField.vue_vue_type_script_setup_true_lang-1ABbHJ0f.mjs.map} +1 -1
  107. package/dist/chunks/{NcTimezonePicker.vue_vue_type_script_setup_true_lang-8CBGI3yi.mjs → NcTimezonePicker.vue_vue_type_script_setup_true_lang-lGMjb2u1.mjs} +3 -3
  108. package/dist/chunks/{NcTimezonePicker.vue_vue_type_script_setup_true_lang-8CBGI3yi.mjs.map → NcTimezonePicker.vue_vue_type_script_setup_true_lang-lGMjb2u1.mjs.map} +1 -1
  109. package/dist/chunks/{NcUserBubble-BE6yD-R0.mjs → NcUserBubble-D00m2qmd.mjs} +2 -2
  110. package/dist/chunks/{NcUserBubble-BE6yD-R0.mjs.map → NcUserBubble-D00m2qmd.mjs.map} +1 -1
  111. package/dist/chunks/{NcUserStatusIcon-JWiuiAXe.mjs → NcUserStatusIcon-CNh1vXUF.mjs} +2 -2
  112. package/dist/chunks/{NcUserStatusIcon-JWiuiAXe.mjs.map → NcUserStatusIcon-CNh1vXUF.mjs.map} +1 -1
  113. package/dist/chunks/{_l10n-BklkVPDO.mjs → _l10n-BCg4udFv.mjs} +44 -44
  114. package/dist/chunks/_l10n-BCg4udFv.mjs.map +1 -0
  115. package/dist/chunks/{autolink-U5pBzLgI.mjs → autolink-_k1FETYm.mjs} +58 -36
  116. package/dist/chunks/autolink-_k1FETYm.mjs.map +1 -0
  117. package/dist/chunks/{colors-BfjxNgsx.mjs → colors-CSua0q55.mjs} +2 -2
  118. package/dist/chunks/{colors-BfjxNgsx.mjs.map → colors-CSua0q55.mjs.map} +1 -1
  119. package/dist/chunks/{emoji-V9hqFgPs.mjs → emoji-C8k9NUlo.mjs} +2 -2
  120. package/dist/chunks/emoji-C8k9NUlo.mjs.map +1 -0
  121. package/dist/chunks/{referencePickerModal-D09ZVhqa.mjs → referencePickerModal-Bsq4XIcs.mjs} +7 -7
  122. package/dist/chunks/{referencePickerModal-D09ZVhqa.mjs.map → referencePickerModal-Bsq4XIcs.mjs.map} +1 -1
  123. package/dist/chunks/{useCopy-Dgw864OI.mjs → useCopy--plF8q1P.mjs} +2 -2
  124. package/dist/chunks/{useCopy-Dgw864OI.mjs.map → useCopy--plF8q1P.mjs.map} +1 -1
  125. package/dist/components/NcActionButtonGroup/index.mjs +1 -1
  126. package/dist/components/NcActionInput/index.mjs +1 -1
  127. package/dist/components/NcActions/index.mjs +1 -1
  128. package/dist/components/NcAppContent/index.mjs +1 -1
  129. package/dist/components/NcAppNavigation/index.mjs +1 -1
  130. package/dist/components/NcAppNavigationCaption/index.mjs +1 -1
  131. package/dist/components/NcAppNavigationItem/index.mjs +1 -1
  132. package/dist/components/NcAppNavigationNewItem/index.mjs +1 -1
  133. package/dist/components/NcAppNavigationSearch/index.mjs +1 -1
  134. package/dist/components/NcAppNavigationSettings/index.mjs +1 -1
  135. package/dist/components/NcAppSettingsDialog/index.mjs +1 -1
  136. package/dist/components/NcAppSettingsSectionShortcuts/index.mjs +1 -1
  137. package/dist/components/NcAppSettingsShortcutsSection/index.mjs +1 -1
  138. package/dist/components/NcAppSidebar/index.mjs +1 -1
  139. package/dist/components/NcAvatar/index.mjs +1 -1
  140. package/dist/components/NcBreadcrumb/index.mjs +1 -1
  141. package/dist/components/NcBreadcrumbs/index.mjs +1 -1
  142. package/dist/components/NcCheckboxRadioSwitch/index.mjs +1 -1
  143. package/dist/components/NcChip/index.mjs +1 -1
  144. package/dist/components/NcCollectionList/index.mjs +1 -1
  145. package/dist/components/NcColorPicker/index.mjs +1 -1
  146. package/dist/components/NcContent/index.mjs +1 -1
  147. package/dist/components/NcDashboardWidget/index.mjs +1 -1
  148. package/dist/components/NcDashboardWidgetItem/index.mjs +1 -1
  149. package/dist/components/NcDateTimePicker/index.mjs +1 -1
  150. package/dist/components/NcDateTimePickerNative/index.mjs +1 -1
  151. package/dist/components/NcDialog/index.mjs +1 -1
  152. package/dist/components/NcDialogButton/index.mjs +1 -1
  153. package/dist/components/NcEmojiPicker/index.mjs +1 -1
  154. package/dist/components/NcFilePicker/index.mjs +1 -1
  155. package/dist/components/NcFormBoxCopyButton/index.mjs +1 -1
  156. package/dist/components/NcHotkey/index.mjs +1 -1
  157. package/dist/components/NcHotkeyList/index.mjs +1 -1
  158. package/dist/components/NcKbd/index.mjs +1 -1
  159. package/dist/components/NcListItem/index.mjs +1 -1
  160. package/dist/components/NcListItemIcon/index.mjs +1 -1
  161. package/dist/components/NcModal/index.mjs +1 -1
  162. package/dist/components/NcPasswordField/index.mjs +1 -1
  163. package/dist/components/NcRelatedResourcesPanel/index.mjs +1 -1
  164. package/dist/components/NcRichContenteditable/NcRichContenteditable.vue.d.ts +11 -9
  165. package/dist/components/NcRichContenteditable/index.mjs +1 -1
  166. package/dist/components/NcRichText/NcRichTextExternalLink.vue.d.ts +23 -0
  167. package/dist/components/NcRichText/index.mjs +3 -3
  168. package/dist/components/NcSelect/index.mjs +1 -1
  169. package/dist/components/NcSelectTags/index.mjs +1 -1
  170. package/dist/components/NcSelectUsers/index.mjs +1 -1
  171. package/dist/components/NcSettingsSection/index.mjs +1 -1
  172. package/dist/components/NcSettingsSelectGroup/index.mjs +1 -1
  173. package/dist/components/NcTextField/index.mjs +1 -1
  174. package/dist/components/NcTimezonePicker/index.mjs +1 -1
  175. package/dist/components/NcUserBubble/index.mjs +1 -1
  176. package/dist/components/NcUserStatusIcon/index.mjs +1 -1
  177. package/dist/composables/useFormatDateTime/index.mjs +1 -1
  178. package/dist/functions/emoji/index.mjs +1 -1
  179. package/dist/functions/reference/index.mjs +1 -1
  180. package/dist/functions/usernameToColor/index.mjs +1 -1
  181. package/dist/index.mjs +53 -52
  182. package/dist/index.mjs.map +1 -1
  183. package/package.json +24 -25
  184. package/dist/chunks/NcAppNavigation-DQzgUarc.mjs.map +0 -1
  185. package/dist/chunks/NcAppNavigationSearch-DpcjjmY5.mjs.map +0 -1
  186. package/dist/chunks/NcModal-kyWZ3UFC.mjs.map +0 -1
  187. package/dist/chunks/NcPasswordField-BOLzDHBJ.mjs.map +0 -1
  188. package/dist/chunks/NcRichContenteditable-BREsny-v.mjs.map +0 -1
  189. package/dist/chunks/NcRichText-D_ssz6sB.mjs.map +0 -1
  190. package/dist/chunks/NcSelect-B1uITk_3.mjs.map +0 -1
  191. package/dist/chunks/_l10n-BklkVPDO.mjs.map +0 -1
  192. package/dist/chunks/autolink-U5pBzLgI.mjs.map +0 -1
  193. package/dist/chunks/emoji-V9hqFgPs.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"NcRelatedResourcesPanel-Cn27rj0H.mjs","sources":["../../src/components/NcRelatedResourcesPanel/NcResource.vue","../../node_modules/vue-material-design-icons/AccountGroup.vue","../../node_modules/vue-material-design-icons/OpenInNew.vue","../../src/components/NcRelatedResourcesPanel/NcTeamResources.vue","../../src/components/NcRelatedResourcesPanel/NcRelatedResourcesPanel.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<li class=\"resource\">\n\t\t<NcButton\n\t\t\tclass=\"resource__button\"\n\t\t\t:aria-label=\"labelTranslated\"\n\t\t\t:to=\"route\"\n\t\t\t:href=\"route ? null : url\"\n\t\t\tvariant=\"tertiary\">\n\t\t\t<template #icon>\n\t\t\t\t<div class=\"resource__icon\">\n\t\t\t\t\t<img :src=\"icon\">\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t{{ name }}\n\t\t</NcButton>\n\t</li>\n</template>\n\n<script>\nimport { t } from '../../l10n.ts'\nimport NcButton from '../NcButton/index.ts'\nimport { getRoute } from '../NcRichText/autolink.ts'\n\nexport default {\n\tname: 'NcResource',\n\n\tcomponents: {\n\t\tNcButton,\n\t},\n\n\t/* eslint vue/require-prop-comment: warn -- TODO: Add a proper doc block about what this props do */\n\tprops: {\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\turl: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tlabelTranslated: t('Open link to \"{resourceName}\"', { resourceName: this.name }),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\troute() {\n\t\t\treturn getRoute(this.$router, this.url)\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.resource {\n\tdisplay: flex;\n\talign-items: center;\n\theight: var(--default-clickable-area);\n\n\t// Override default NcButton styles\n\t&__button {\n\t\twidth: 100% !important;\n\t\tjustify-content: flex-start !important;\n\t\tpadding: 0 !important;\n\n\t\t& :deep(.button-vue__wrapper) {\n\t\t\tjustify-content: flex-start !important;\n\n\t\t\t.button-vue__text {\n\t\t\t\tfont-weight: normal !important;\n\t\t\t\tmargin-inline-start: 2px !important;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__icon {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tbackground-color: var(--color-text-maxcontrast);\n\t\tborder-radius: 50%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\timg {\n\t\t\twidth: 16px;\n\t\t\theight: 16px;\n\t\t\tfilter: var(--background-invert-if-dark);\n\t\t}\n\t}\n}\n</style>\n","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon account-group-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M12,5.5A3.5,3.5 0 0,1 15.5,9A3.5,3.5 0 0,1 12,12.5A3.5,3.5 0 0,1 8.5,9A3.5,3.5 0 0,1 12,5.5M5,8C5.56,8 6.08,8.15 6.53,8.42C6.38,9.85 6.8,11.27 7.66,12.38C7.16,13.34 6.16,14 5,14A3,3 0 0,1 2,11A3,3 0 0,1 5,8M19,8A3,3 0 0,1 22,11A3,3 0 0,1 19,14C17.84,14 16.84,13.34 16.34,12.38C17.2,11.27 17.62,9.85 17.47,8.42C17.92,8.15 18.44,8 19,8M5.5,18.25C5.5,16.18 8.41,14.5 12,14.5C15.59,14.5 18.5,16.18 18.5,18.25V20H5.5V18.25M0,20V18.5C0,17.11 1.89,15.94 4.45,15.6C3.86,16.28 3.5,17.22 3.5,18.25V20H0M24,20H20.5V18.25C20.5,17.22 20.14,16.28 19.55,15.6C22.11,15.94 24,17.11 24,18.5V20Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"AccountGroupIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon open-in-new-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M14,3V5H17.59L7.76,14.83L9.17,16.24L19,6.41V10H21V3M19,19H5V5H12V3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V12H19V19Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"OpenInNewIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","<!--\n - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n<template>\n\t<div v-if=\"appEnabled && isVisible\" class=\"team-resources\">\n\t\t<h5 class=\"team-resources__header\">\n\t\t\t{{ t('Related team resources') }}\n\t\t</h5>\n\t\t<details\n\t\t\tv-for=\"team in teamResources\"\n\t\t\t:key=\"team.teamId\"\n\t\t\tname=\"Team resources\"\n\t\t\tclass=\"related-team\"\n\t\t\t:open=\"open(team.teamId)\"\n\t\t\t@toggle=\"(event) => toggleOpen(team.teamId, event.target.open)\">\n\t\t\t<summary class=\"related-team__header\">\n\t\t\t\t<h5 class=\"related-team__name\">\n\t\t\t\t\t<AccountGroup :size=\"20\" />\n\t\t\t\t\t{{ team.displayName }}\n\t\t\t\t</h5>\n\t\t\t\t<NcButton\n\t\t\t\t\t:aria-label=\"t('View team')\"\n\t\t\t\t\t:href=\"team.link\"\n\t\t\t\t\t:title=\"t('View team')\"\n\t\t\t\t\tvariant=\"tertiary\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<OpenInNew :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcButton>\n\n\t\t\t\t<ChevronUp\n\t\t\t\t\tv-if=\"open(team.teamId)\"\n\t\t\t\t\t:size=\"20\" />\n\t\t\t\t<ChevronDown\n\t\t\t\t\tv-else\n\t\t\t\t\t:size=\"20\" />\n\t\t\t</summary>\n\n\t\t\t<div>\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"provider in teamProviders(team.teamId)\"\n\t\t\t\t\t:key=\"provider.id\"\n\t\t\t\t\tclass=\"related-team-provider\">\n\t\t\t\t\t<h6 v-if=\"provider.resources.length > 0\">\n\t\t\t\t\t\t{{ provider.name }}\n\t\t\t\t\t</h6>\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li v-for=\"resource in provider.resources\" :key=\"resource.url\" class=\"related-team-resource\">\n\t\t\t\t\t\t\t<a :href=\"resource.url\" class=\"related-team-resource__link\">\n\t\t\t\t\t\t\t\t<span v-if=\"resource.iconEmoji\" class=\"resource__icon\">\n\t\t\t\t\t\t\t\t\t{{ resource.iconEmoji }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<NcIconSvgWrapper\n\t\t\t\t\t\t\t\t\tv-else-if=\"resource.iconSvg\"\n\t\t\t\t\t\t\t\t\tclass=\"resource__icon\"\n\t\t\t\t\t\t\t\t\t:svg=\"resource.iconSvg\"\n\t\t\t\t\t\t\t\t\t:size=\"20\" />\n\t\t\t\t\t\t\t\t<span v-else-if=\"resource.iconURL\" class=\"resource__icon\">\n\t\t\t\t\t\t\t\t\t<img :src=\"resource.iconURL\" alt=\"\">\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span class=\"resource__name\">\n\t\t\t\t\t\t\t\t\t{{ resource.label }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</details>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { getCapabilities } from '@nextcloud/capabilities'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport AccountGroup from 'vue-material-design-icons/AccountGroup.vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport OpenInNew from 'vue-material-design-icons/OpenInNew.vue'\nimport NcButton from '../NcButton/NcButton.vue'\nimport NcIconSvgWrapper from '../NcIconSvgWrapper/NcIconSvgWrapper.vue'\nimport { t } from '../../l10n.ts'\nimport { logger } from '../../utils/logger.ts'\n\nconst teamResourceProviders = getCapabilities()?.circles?.teamResourceProviders ?? []\n\nexport default {\n\tname: 'NcTeamResources',\n\n\tcomponents: {\n\t\tAccountGroup,\n\t\tChevronDown,\n\t\tChevronUp,\n\t\tOpenInNew,\n\t\tNcButton,\n\t\tNcIconSvgWrapper,\n\t},\n\n\t/* eslint vue/require-prop-comment: warn -- TODO: Add a proper doc block about what this props do */\n\tprops: {\n\t\tproviderId: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\titemId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tappEnabled: OC?.appswebroots?.circles !== undefined && (OC.config.version.split('.')[0] ?? 0) >= 29,\n\t\t\tloading: false,\n\t\t\tteamResources: null,\n\t\t\tteamOpen: [],\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tisVisible() {\n\t\t\treturn !this.loading && this.teamResources?.length > 0\n\t\t},\n\n\t\tteamProviders() {\n\t\t\treturn (teamId) => {\n\t\t\t\tconst team = this.teamResources.find((t) => t.teamId === teamId)\n\t\t\t\treturn team.resources?.reduce((acc, resource) => {\n\t\t\t\t\tif (resource.provider.id === this.providerId && resource.id === String(this.itemId)) {\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!acc[resource.provider.id]) {\n\t\t\t\t\t\tacc[resource.provider.id] = resource.provider\n\t\t\t\t\t\tacc[resource.provider.id].resources = []\n\t\t\t\t\t}\n\n\t\t\t\t\tif (resource.provider.id === this.providerId && resource.id === String(this.itemId)) {\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}\n\n\t\t\t\t\tacc[resource.provider.id].resources.push(resource)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\t\t\t}\n\t\t},\n\n\t\topen() {\n\t\t\treturn (teamId) => {\n\t\t\t\treturn this.teamOpen.indexOf(teamId) !== -1\n\t\t\t}\n\t\t},\n\t},\n\n\twatch: {\n\t\tproviderId() {\n\t\t\tthis.fetchTeamResources()\n\t\t},\n\n\t\titemId() {\n\t\t\tthis.fetchTeamResources()\n\t\t},\n\t},\n\n\tcreated() {\n\t\tthis.fetchTeamResources()\n\t},\n\n\tmethods: {\n\t\tt,\n\t\tasync fetchTeamResources() {\n\t\t\tif (!teamResourceProviders.includes(this.providerId)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tthis.loading = true\n\t\t\t\tconst response = await axios.get(generateOcsUrl(`/teams/resources/${this.providerId}/${this.itemId}`))\n\t\t\t\tthis.teamResources = response.data.ocs.data.teams\n\t\t\t\tthis.teamOpen = [this.teamResources[0]?.teamId]\n\t\t\t} catch (error) {\n\t\t\t\tthis.teamResources = null\n\t\t\t\tlogger.error('[NcTeamResources] Failed to fetch resources', { error })\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\ttoggleOpen(teamId, open) {\n\t\t\tif (open) {\n\t\t\t\tthis.teamOpen.push(teamId)\n\t\t\t} else {\n\t\t\t\tthis.teamOpen.splice(this.teamOpen.indexOf(teamId), 1)\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.team-resources__header {\n\tfont-weight: bold;\n\tmargin-bottom: 6px;\n}\n\n.related-team {\n\tborder-radius: var(--border-radius-container);\n\tborder: 2px solid var(--color-border-dark);\n\tmargin-bottom: 6px;\n\n\t&__open {\n\t\tborder-color: var(--color-primary-element);\n\t}\n\n\t&__header {\n\t\tpadding: 6px;\n\t\tpadding-inline-end: 24px;\n\t\tdisplay: flex;\n\t\tgap: 12px;\n\t}\n\n\t&__name {\n\t\tdisplay: flex;\n\t\tflex-grow: 1;\n\t\talign-items: center;\n\t\tgap: 12px;\n\t\tpadding: 6px 12px;\n\t\tfont-weight: bold;\n\t\tmargin: 0;\n\t}\n\n\t.related-team-provider {\n\t\tpadding: 6px 12px;\n\n\t\t&__name {\n\t\t\tfont-weight: bold;\n\t\t\tmargin-bottom: 3px;\n\t\t}\n\n\t\t&__link {\n\t\t\tdisplay: flex;\n\t\t\tgap: 12px;\n\t\t\tpadding: 6px 12px;\n\t\t\tfont-weight: bold;\n\t\t}\n\t}\n\n\t.related-team-resource {\n\t\t&__link {\n\t\t\tdisplay: flex;\n\t\t\tgap: 12px;\n\t\t\theight: var(--default-clickable-area);\n\t\t\talign-items: center;\n\t\t\tborder-radius: var(--border-radius-element);\n\n\t\t\t&:hover {\n\t\t\t\tbackground-color: var(--color-background-hover);\n\t\t\t}\n\t\t\t&:focus {\n\t\t\t\tbackground-color: var(--color-background-hover);\n\t\t\t\toutline: 2px solid var(--color-primary-element);\n\t\t\t}\n\t\t}\n\t\t.resource__icon {\n\t\t\twidth: var(--default-clickable-area);\n\t\t\theight: var(--default-clickable-area);\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\ttext-align: center;\n\n\t\t\t& > img {\n\t\t\t\tborder-radius: var(--border-radius-pill);\n\t\t\t\toverflow: hidden;\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 32px;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<docs>\n### Usage\n\nUse this component to display the related resources of a given item.\n\n```\n<template>\n\t<NcRelatedResourcesPanel provider-id=\"talk\"\n\t\theader=\"Related resources for talk\"\n\t\t:item-id=\"conversationId\" />\n</template>\n\n<script>\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tconversationId: 1,\n\t\t}\n\t},\n}\n</script>\n```\n</docs>\n\n<template>\n\t<div>\n\t\t<NcTeamResources\n\t\t\t:providerId=\"providerId\"\n\t\t\t:itemId=\"itemId\" />\n\n\t\t<div v-if=\"appEnabled && isVisible\" class=\"related-resources\">\n\t\t\t<div class=\"related-resources__header\">\n\t\t\t\t<h5>{{ header }}</h5>\n\t\t\t\t<p>{{ subline }}</p>\n\t\t\t</div>\n\n\t\t\t<NcResource\n\t\t\t\tv-for=\"resource in resources\"\n\t\t\t\t:key=\"resource.itemId\"\n\t\t\t\tclass=\"related-resources__entry\"\n\t\t\t\t:icon=\"resource.icon\"\n\t\t\t\t:name=\"resource.title\"\n\t\t\t\t:url=\"resource.url\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport NcResource from './NcResource.vue'\nimport NcTeamResources from './NcTeamResources.vue'\nimport { t } from '../../l10n.ts'\nimport { logger } from '../../utils/logger.ts'\n\nexport default {\n\tname: 'NcRelatedResourcesPanel',\n\n\tcomponents: {\n\t\tNcResource,\n\t\tNcTeamResources,\n\t},\n\n\t/* eslint vue/require-prop-comment: warn -- TODO: Add a proper doc block about what this props do */\n\tprops: {\n\t\t/**\n\t\t * The provider id implemented with `\\OCA\\RelatedResources\\IRelatedResourceProvider::getProviderId()`\n\t\t */\n\t\tproviderId: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The item id which uniquely identities the e.g. Calendar event, Deck board, file, Talk room, etc.\n\t\t */\n\t\titemId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Limits to specific resource type. i.e. any provider id implemented with `\\OCA\\RelatedResources\\IRelatedResourceProvider::getProviderId()`\n\t\t */\n\t\tresourceType: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Set the maximum number of resources to load\n\t\t */\n\t\tlimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/**\n\t\t * Only used by the files sidebar\n\t\t *\n\t\t * File info is passed when registered with `OCA.Sharing.ShareTabSections.registerSection()`\n\t\t */\n\t\tfileInfo: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Make the header name dynamic\n\t\t */\n\t\theader: {\n\t\t\ttype: String,\n\t\t\tdefault: t('Related resources'),\n\t\t},\n\n\t\tdescription: {\n\t\t\ttype: String,\n\t\t\tdefault: t('Anything shared with the same group of people will show up here'),\n\t\t},\n\n\t\t/**\n\t\t * If this element is used on a primary element set to true for primary styling.\n\t\t */\n\t\tprimary: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\temits: [\n\t\t'hasError',\n\t\t'hasResources',\n\t],\n\n\tdata() {\n\t\treturn {\n\t\t\tappEnabled: OC?.appswebroots?.related_resources !== undefined,\n\t\t\tloading: false,\n\t\t\terror: null,\n\t\t\tresources: [],\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tisVisible() {\n\t\t\tif (this.loading) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.error ?? this.resources.length > 0\n\t\t},\n\n\t\tsubline() {\n\t\t\tif (this.error) {\n\t\t\t\treturn t('Error getting related resources. Please contact your system administrator if you have any questions.')\n\t\t\t}\n\t\t\treturn this.description\n\t\t},\n\n\t\thasResourceInfo() {\n\t\t\tif (this.providerId !== null && this.itemId !== null) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif (this.fileInfo !== null) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn false\n\t\t},\n\n\t\tisFiles() {\n\t\t\treturn this.fileInfo?.id !== undefined\n\t\t},\n\n\t\turl() {\n\t\t\tlet providerId = null\n\t\t\tlet itemId = null\n\n\t\t\tif (this.isFiles) {\n\t\t\t\tproviderId = 'files'\n\t\t\t\titemId = this.fileInfo.id\n\t\t\t} else {\n\t\t\t\tproviderId = this.providerId\n\t\t\t\titemId = this.itemId\n\t\t\t}\n\n\t\t\treturn generateOcsUrl('/apps/related_resources/related/{providerId}?itemId={itemId}&resourceType={resourceType}&limit={limit}&format=json', {\n\t\t\t\tproviderId,\n\t\t\t\titemId,\n\t\t\t\tresourceType: this.resourceType,\n\t\t\t\tlimit: this.limit,\n\t\t\t})\n\t\t},\n\t},\n\n\twatch: {\n\t\tproviderId() {\n\t\t\tthis.fetchRelatedResources()\n\t\t},\n\n\t\titemId() {\n\t\t\tthis.fetchRelatedResources()\n\t\t},\n\n\t\tfileInfo() {\n\t\t\tthis.fetchRelatedResources()\n\t\t},\n\n\t\terror(error) {\n\t\t\t/**\n\t\t\t * Emitted when the error value changes\n\t\t\t *\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tthis.$emit('hasError', Boolean(error))\n\t\t},\n\n\t\tresources(resources) {\n\t\t\t/**\n\t\t\t * Emitted when the resources value changes\n\t\t\t *\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tthis.$emit('hasResources', resources.length > 0)\n\t\t},\n\t},\n\n\tcreated() {\n\t\tthis.fetchRelatedResources()\n\t},\n\n\tmethods: {\n\t\tt,\n\t\tasync fetchRelatedResources() {\n\t\t\tif (!this.appEnabled || !this.hasResourceInfo) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.loading = true\n\t\t\tthis.error = null\n\t\t\tthis.resources = []\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(this.url)\n\t\t\t\tthis.resources = response.data.ocs?.data\n\t\t\t} catch (error) {\n\t\t\t\tthis.error = error\n\t\t\t\tlogger.error('[NcRelatedResourcesPanel] Failed to fetch resources', { error })\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.related-resources {\n\t&__header {\n\n\t\th5 {\n\t\t\tfont-weight: bold;\n\t\t\tmargin-bottom: 6px;\n\t\t}\n\n\t\tp {\n\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t}\n\t}\n}\n</style>\n"],"names":["_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_createVNode","_createElementVNode","_hoisted_3","_createTextVNode","_mergeProps","t","_toDisplayString","_Fragment","_renderList","_createBlock"],"mappings":"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","x_google_ignoreList":[1,2]}
1
+ {"version":3,"file":"NcRelatedResourcesPanel-B01Lid3d.mjs","sources":["../../src/components/NcRelatedResourcesPanel/NcResource.vue","../../node_modules/vue-material-design-icons/AccountGroup.vue","../../node_modules/vue-material-design-icons/OpenInNew.vue","../../src/components/NcRelatedResourcesPanel/NcTeamResources.vue","../../src/components/NcRelatedResourcesPanel/NcRelatedResourcesPanel.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<li class=\"resource\">\n\t\t<NcButton\n\t\t\tclass=\"resource__button\"\n\t\t\t:aria-label=\"labelTranslated\"\n\t\t\t:to=\"route\"\n\t\t\t:href=\"route ? null : url\"\n\t\t\tvariant=\"tertiary\">\n\t\t\t<template #icon>\n\t\t\t\t<div class=\"resource__icon\">\n\t\t\t\t\t<img :src=\"icon\">\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t{{ name }}\n\t\t</NcButton>\n\t</li>\n</template>\n\n<script>\nimport { t } from '../../l10n.ts'\nimport NcButton from '../NcButton/index.ts'\nimport { getRoute } from '../NcRichText/autolink.ts'\n\nexport default {\n\tname: 'NcResource',\n\n\tcomponents: {\n\t\tNcButton,\n\t},\n\n\t/* eslint vue/require-prop-comment: warn -- TODO: Add a proper doc block about what this props do */\n\tprops: {\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\turl: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tlabelTranslated: t('Open link to \"{resourceName}\"', { resourceName: this.name }),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\troute() {\n\t\t\treturn getRoute(this.$router, this.url)\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.resource {\n\tdisplay: flex;\n\talign-items: center;\n\theight: var(--default-clickable-area);\n\n\t// Override default NcButton styles\n\t&__button {\n\t\twidth: 100% !important;\n\t\tjustify-content: flex-start !important;\n\t\tpadding: 0 !important;\n\n\t\t& :deep(.button-vue__wrapper) {\n\t\t\tjustify-content: flex-start !important;\n\n\t\t\t.button-vue__text {\n\t\t\t\tfont-weight: normal !important;\n\t\t\t\tmargin-inline-start: 2px !important;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__icon {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tbackground-color: var(--color-text-maxcontrast);\n\t\tborder-radius: 50%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\timg {\n\t\t\twidth: 16px;\n\t\t\theight: 16px;\n\t\t\tfilter: var(--background-invert-if-dark);\n\t\t}\n\t}\n}\n</style>\n","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon account-group-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M12,5.5A3.5,3.5 0 0,1 15.5,9A3.5,3.5 0 0,1 12,12.5A3.5,3.5 0 0,1 8.5,9A3.5,3.5 0 0,1 12,5.5M5,8C5.56,8 6.08,8.15 6.53,8.42C6.38,9.85 6.8,11.27 7.66,12.38C7.16,13.34 6.16,14 5,14A3,3 0 0,1 2,11A3,3 0 0,1 5,8M19,8A3,3 0 0,1 22,11A3,3 0 0,1 19,14C17.84,14 16.84,13.34 16.34,12.38C17.2,11.27 17.62,9.85 17.47,8.42C17.92,8.15 18.44,8 19,8M5.5,18.25C5.5,16.18 8.41,14.5 12,14.5C15.59,14.5 18.5,16.18 18.5,18.25V20H5.5V18.25M0,20V18.5C0,17.11 1.89,15.94 4.45,15.6C3.86,16.28 3.5,17.22 3.5,18.25V20H0M24,20H20.5V18.25C20.5,17.22 20.14,16.28 19.55,15.6C22.11,15.94 24,17.11 24,18.5V20Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"AccountGroupIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon open-in-new-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M14,3V5H17.59L7.76,14.83L9.17,16.24L19,6.41V10H21V3M19,19H5V5H12V3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V12H19V19Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"OpenInNewIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","<!--\n - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n<template>\n\t<div v-if=\"appEnabled && isVisible\" class=\"team-resources\">\n\t\t<h5 class=\"team-resources__header\">\n\t\t\t{{ t('Related team resources') }}\n\t\t</h5>\n\t\t<details\n\t\t\tv-for=\"team in teamResources\"\n\t\t\t:key=\"team.teamId\"\n\t\t\tname=\"Team resources\"\n\t\t\tclass=\"related-team\"\n\t\t\t:open=\"open(team.teamId)\"\n\t\t\t@toggle=\"(event) => toggleOpen(team.teamId, event.target.open)\">\n\t\t\t<summary class=\"related-team__header\">\n\t\t\t\t<h5 class=\"related-team__name\">\n\t\t\t\t\t<AccountGroup :size=\"20\" />\n\t\t\t\t\t{{ team.displayName }}\n\t\t\t\t</h5>\n\t\t\t\t<NcButton\n\t\t\t\t\t:aria-label=\"t('View team')\"\n\t\t\t\t\t:href=\"team.link\"\n\t\t\t\t\t:title=\"t('View team')\"\n\t\t\t\t\tvariant=\"tertiary\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<OpenInNew :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcButton>\n\n\t\t\t\t<ChevronUp\n\t\t\t\t\tv-if=\"open(team.teamId)\"\n\t\t\t\t\t:size=\"20\" />\n\t\t\t\t<ChevronDown\n\t\t\t\t\tv-else\n\t\t\t\t\t:size=\"20\" />\n\t\t\t</summary>\n\n\t\t\t<div>\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"provider in teamProviders(team.teamId)\"\n\t\t\t\t\t:key=\"provider.id\"\n\t\t\t\t\tclass=\"related-team-provider\">\n\t\t\t\t\t<h6 v-if=\"provider.resources.length > 0\">\n\t\t\t\t\t\t{{ provider.name }}\n\t\t\t\t\t</h6>\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li v-for=\"resource in provider.resources\" :key=\"resource.url\" class=\"related-team-resource\">\n\t\t\t\t\t\t\t<a :href=\"resource.url\" class=\"related-team-resource__link\">\n\t\t\t\t\t\t\t\t<span v-if=\"resource.iconEmoji\" class=\"resource__icon\">\n\t\t\t\t\t\t\t\t\t{{ resource.iconEmoji }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<NcIconSvgWrapper\n\t\t\t\t\t\t\t\t\tv-else-if=\"resource.iconSvg\"\n\t\t\t\t\t\t\t\t\tclass=\"resource__icon\"\n\t\t\t\t\t\t\t\t\t:svg=\"resource.iconSvg\"\n\t\t\t\t\t\t\t\t\t:size=\"20\" />\n\t\t\t\t\t\t\t\t<span v-else-if=\"resource.iconURL\" class=\"resource__icon\">\n\t\t\t\t\t\t\t\t\t<img :src=\"resource.iconURL\" alt=\"\">\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span class=\"resource__name\">\n\t\t\t\t\t\t\t\t\t{{ resource.label }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</details>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { getCapabilities } from '@nextcloud/capabilities'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport AccountGroup from 'vue-material-design-icons/AccountGroup.vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport OpenInNew from 'vue-material-design-icons/OpenInNew.vue'\nimport NcButton from '../NcButton/NcButton.vue'\nimport NcIconSvgWrapper from '../NcIconSvgWrapper/NcIconSvgWrapper.vue'\nimport { t } from '../../l10n.ts'\nimport { logger } from '../../utils/logger.ts'\n\nconst teamResourceProviders = getCapabilities()?.circles?.teamResourceProviders ?? []\n\nexport default {\n\tname: 'NcTeamResources',\n\n\tcomponents: {\n\t\tAccountGroup,\n\t\tChevronDown,\n\t\tChevronUp,\n\t\tOpenInNew,\n\t\tNcButton,\n\t\tNcIconSvgWrapper,\n\t},\n\n\t/* eslint vue/require-prop-comment: warn -- TODO: Add a proper doc block about what this props do */\n\tprops: {\n\t\tproviderId: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\titemId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tappEnabled: OC?.appswebroots?.circles !== undefined && (OC.config.version.split('.')[0] ?? 0) >= 29,\n\t\t\tloading: false,\n\t\t\tteamResources: null,\n\t\t\tteamOpen: [],\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tisVisible() {\n\t\t\treturn !this.loading && this.teamResources?.length > 0\n\t\t},\n\n\t\tteamProviders() {\n\t\t\treturn (teamId) => {\n\t\t\t\tconst team = this.teamResources.find((t) => t.teamId === teamId)\n\t\t\t\treturn team.resources?.reduce((acc, resource) => {\n\t\t\t\t\tif (resource.provider.id === this.providerId && resource.id === String(this.itemId)) {\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!acc[resource.provider.id]) {\n\t\t\t\t\t\tacc[resource.provider.id] = resource.provider\n\t\t\t\t\t\tacc[resource.provider.id].resources = []\n\t\t\t\t\t}\n\n\t\t\t\t\tif (resource.provider.id === this.providerId && resource.id === String(this.itemId)) {\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}\n\n\t\t\t\t\tacc[resource.provider.id].resources.push(resource)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\t\t\t}\n\t\t},\n\n\t\topen() {\n\t\t\treturn (teamId) => {\n\t\t\t\treturn this.teamOpen.indexOf(teamId) !== -1\n\t\t\t}\n\t\t},\n\t},\n\n\twatch: {\n\t\tproviderId() {\n\t\t\tthis.fetchTeamResources()\n\t\t},\n\n\t\titemId() {\n\t\t\tthis.fetchTeamResources()\n\t\t},\n\t},\n\n\tcreated() {\n\t\tthis.fetchTeamResources()\n\t},\n\n\tmethods: {\n\t\tt,\n\t\tasync fetchTeamResources() {\n\t\t\tif (!teamResourceProviders.includes(this.providerId)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tthis.loading = true\n\t\t\t\tconst response = await axios.get(generateOcsUrl(`/teams/resources/${this.providerId}/${this.itemId}`))\n\t\t\t\tthis.teamResources = response.data.ocs.data.teams\n\t\t\t\tthis.teamOpen = [this.teamResources[0]?.teamId]\n\t\t\t} catch (error) {\n\t\t\t\tthis.teamResources = null\n\t\t\t\tlogger.error('[NcTeamResources] Failed to fetch resources', { error })\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\ttoggleOpen(teamId, open) {\n\t\t\tif (open) {\n\t\t\t\tthis.teamOpen.push(teamId)\n\t\t\t} else {\n\t\t\t\tthis.teamOpen.splice(this.teamOpen.indexOf(teamId), 1)\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.team-resources__header {\n\tfont-weight: bold;\n\tmargin-bottom: 6px;\n}\n\n.related-team {\n\tborder-radius: var(--border-radius-container);\n\tborder: 2px solid var(--color-border-dark);\n\tmargin-bottom: 6px;\n\n\t&__open {\n\t\tborder-color: var(--color-primary-element);\n\t}\n\n\t&__header {\n\t\tpadding: 6px;\n\t\tpadding-inline-end: 24px;\n\t\tdisplay: flex;\n\t\tgap: 12px;\n\t}\n\n\t&__name {\n\t\tdisplay: flex;\n\t\tflex-grow: 1;\n\t\talign-items: center;\n\t\tgap: 12px;\n\t\tpadding: 6px 12px;\n\t\tfont-weight: bold;\n\t\tmargin: 0;\n\t}\n\n\t.related-team-provider {\n\t\tpadding: 6px 12px;\n\n\t\t&__name {\n\t\t\tfont-weight: bold;\n\t\t\tmargin-bottom: 3px;\n\t\t}\n\n\t\t&__link {\n\t\t\tdisplay: flex;\n\t\t\tgap: 12px;\n\t\t\tpadding: 6px 12px;\n\t\t\tfont-weight: bold;\n\t\t}\n\t}\n\n\t.related-team-resource {\n\t\t&__link {\n\t\t\tdisplay: flex;\n\t\t\tgap: 12px;\n\t\t\theight: var(--default-clickable-area);\n\t\t\talign-items: center;\n\t\t\tborder-radius: var(--border-radius-element);\n\n\t\t\t&:hover {\n\t\t\t\tbackground-color: var(--color-background-hover);\n\t\t\t}\n\t\t\t&:focus {\n\t\t\t\tbackground-color: var(--color-background-hover);\n\t\t\t\toutline: 2px solid var(--color-primary-element);\n\t\t\t}\n\t\t}\n\t\t.resource__icon {\n\t\t\twidth: var(--default-clickable-area);\n\t\t\theight: var(--default-clickable-area);\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\ttext-align: center;\n\n\t\t\t& > img {\n\t\t\t\tborder-radius: var(--border-radius-pill);\n\t\t\t\toverflow: hidden;\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 32px;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<docs>\n### Usage\n\nUse this component to display the related resources of a given item.\n\n```\n<template>\n\t<NcRelatedResourcesPanel provider-id=\"talk\"\n\t\theader=\"Related resources for talk\"\n\t\t:item-id=\"conversationId\" />\n</template>\n\n<script>\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tconversationId: 1,\n\t\t}\n\t},\n}\n</script>\n```\n</docs>\n\n<template>\n\t<div>\n\t\t<NcTeamResources\n\t\t\t:providerId=\"providerId\"\n\t\t\t:itemId=\"itemId\" />\n\n\t\t<div v-if=\"appEnabled && isVisible\" class=\"related-resources\">\n\t\t\t<div class=\"related-resources__header\">\n\t\t\t\t<h5>{{ header }}</h5>\n\t\t\t\t<p>{{ subline }}</p>\n\t\t\t</div>\n\n\t\t\t<NcResource\n\t\t\t\tv-for=\"resource in resources\"\n\t\t\t\t:key=\"resource.itemId\"\n\t\t\t\tclass=\"related-resources__entry\"\n\t\t\t\t:icon=\"resource.icon\"\n\t\t\t\t:name=\"resource.title\"\n\t\t\t\t:url=\"resource.url\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport NcResource from './NcResource.vue'\nimport NcTeamResources from './NcTeamResources.vue'\nimport { t } from '../../l10n.ts'\nimport { logger } from '../../utils/logger.ts'\n\nexport default {\n\tname: 'NcRelatedResourcesPanel',\n\n\tcomponents: {\n\t\tNcResource,\n\t\tNcTeamResources,\n\t},\n\n\t/* eslint vue/require-prop-comment: warn -- TODO: Add a proper doc block about what this props do */\n\tprops: {\n\t\t/**\n\t\t * The provider id implemented with `\\OCA\\RelatedResources\\IRelatedResourceProvider::getProviderId()`\n\t\t */\n\t\tproviderId: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The item id which uniquely identities the e.g. Calendar event, Deck board, file, Talk room, etc.\n\t\t */\n\t\titemId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Limits to specific resource type. i.e. any provider id implemented with `\\OCA\\RelatedResources\\IRelatedResourceProvider::getProviderId()`\n\t\t */\n\t\tresourceType: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Set the maximum number of resources to load\n\t\t */\n\t\tlimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/**\n\t\t * Only used by the files sidebar\n\t\t *\n\t\t * File info is passed when registered with `OCA.Sharing.ShareTabSections.registerSection()`\n\t\t */\n\t\tfileInfo: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Make the header name dynamic\n\t\t */\n\t\theader: {\n\t\t\ttype: String,\n\t\t\tdefault: t('Related resources'),\n\t\t},\n\n\t\tdescription: {\n\t\t\ttype: String,\n\t\t\tdefault: t('Anything shared with the same group of people will show up here'),\n\t\t},\n\n\t\t/**\n\t\t * If this element is used on a primary element set to true for primary styling.\n\t\t */\n\t\tprimary: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\temits: [\n\t\t'hasError',\n\t\t'hasResources',\n\t],\n\n\tdata() {\n\t\treturn {\n\t\t\tappEnabled: OC?.appswebroots?.related_resources !== undefined,\n\t\t\tloading: false,\n\t\t\terror: null,\n\t\t\tresources: [],\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tisVisible() {\n\t\t\tif (this.loading) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.error ?? this.resources.length > 0\n\t\t},\n\n\t\tsubline() {\n\t\t\tif (this.error) {\n\t\t\t\treturn t('Error getting related resources. Please contact your system administrator if you have any questions.')\n\t\t\t}\n\t\t\treturn this.description\n\t\t},\n\n\t\thasResourceInfo() {\n\t\t\tif (this.providerId !== null && this.itemId !== null) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif (this.fileInfo !== null) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn false\n\t\t},\n\n\t\tisFiles() {\n\t\t\treturn this.fileInfo?.id !== undefined\n\t\t},\n\n\t\turl() {\n\t\t\tlet providerId\n\t\t\tlet itemId\n\n\t\t\tif (this.isFiles) {\n\t\t\t\tproviderId = 'files'\n\t\t\t\titemId = this.fileInfo.id\n\t\t\t} else {\n\t\t\t\tproviderId = this.providerId\n\t\t\t\titemId = this.itemId\n\t\t\t}\n\n\t\t\treturn generateOcsUrl('/apps/related_resources/related/{providerId}?itemId={itemId}&resourceType={resourceType}&limit={limit}&format=json', {\n\t\t\t\tproviderId,\n\t\t\t\titemId,\n\t\t\t\tresourceType: this.resourceType,\n\t\t\t\tlimit: this.limit,\n\t\t\t})\n\t\t},\n\t},\n\n\twatch: {\n\t\tproviderId() {\n\t\t\tthis.fetchRelatedResources()\n\t\t},\n\n\t\titemId() {\n\t\t\tthis.fetchRelatedResources()\n\t\t},\n\n\t\tfileInfo() {\n\t\t\tthis.fetchRelatedResources()\n\t\t},\n\n\t\terror(error) {\n\t\t\t/**\n\t\t\t * Emitted when the error value changes\n\t\t\t *\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tthis.$emit('hasError', Boolean(error))\n\t\t},\n\n\t\tresources(resources) {\n\t\t\t/**\n\t\t\t * Emitted when the resources value changes\n\t\t\t *\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tthis.$emit('hasResources', resources.length > 0)\n\t\t},\n\t},\n\n\tcreated() {\n\t\tthis.fetchRelatedResources()\n\t},\n\n\tmethods: {\n\t\tt,\n\t\tasync fetchRelatedResources() {\n\t\t\tif (!this.appEnabled || !this.hasResourceInfo) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.loading = true\n\t\t\tthis.error = null\n\t\t\tthis.resources = []\n\t\t\ttry {\n\t\t\t\tconst response = await axios.get(this.url)\n\t\t\t\tthis.resources = response.data.ocs?.data\n\t\t\t} catch (error) {\n\t\t\t\tthis.error = error\n\t\t\t\tlogger.error('[NcRelatedResourcesPanel] Failed to fetch resources', { error })\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.related-resources {\n\t&__header {\n\n\t\th5 {\n\t\t\tfont-weight: bold;\n\t\t\tmargin-bottom: 6px;\n\t\t}\n\n\t\tp {\n\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t}\n\t}\n}\n</style>\n"],"names":["_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_createVNode","_createElementVNode","_hoisted_3","_createTextVNode","_mergeProps","t","_toDisplayString","_Fragment","_renderList","_createBlock"],"mappings":"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","x_google_ignoreList":[1,2]}
@@ -1,13 +1,13 @@
1
- import '../assets/NcRichContenteditable-Do20Rmk1.css';
1
+ import '../assets/NcRichContenteditable-BXRR0rmI.css';
2
2
  import debounce from "debounce";
3
3
  import Tribute from "tributejs/dist/tribute.esm.js";
4
4
  import { useIsDarkTheme } from "../composables/useIsDarkTheme/index.mjs";
5
- import { g as getAvatarUrl } from "./NcMentionBubble.vue_vue_type_style_index_0_scoped_45238efd_lang-D6LzDiYf.mjs";
6
- import { N as NcUserStatusIcon } from "./NcUserStatusIcon-JWiuiAXe.mjs";
5
+ import { g as getAvatarUrl } from "./NcMentionBubble.vue_vue_type_style_index_0_scoped_45238efd_lang-BX_KxRP-.mjs";
6
+ import { N as NcUserStatusIcon } from "./NcUserStatusIcon-CNh1vXUF.mjs";
7
7
  import { openBlock, createElementBlock, normalizeClass, createElementVNode, normalizeStyle, toDisplayString, createApp, resolveComponent, createBlock, createCommentVNode, mergeProps, withModifiers, withKeys } from "vue";
8
8
  import { _ as _export_sfc } from "./_plugin-vue_export-helper-1tPrXgE0.mjs";
9
- import { a as emojiSearch, e as emojiAddRecent } from "./emoji-V9hqFgPs.mjs";
10
- import { r as register, s as t37, J as t34, a as t, K as n } from "./_l10n-BklkVPDO.mjs";
9
+ import { a as emojiSearch, e as emojiAddRecent } from "./emoji-C8k9NUlo.mjs";
10
+ import { r as register, s as t37, J as t34, a as t, K as n } from "./_l10n-BCg4udFv.mjs";
11
11
  import escapeHTML from "escape-html";
12
12
  import stripTags from "striptags";
13
13
  import { c as createElementId } from "./createElementId-DhjFt1I9.mjs";
@@ -20,26 +20,27 @@ import "@vueuse/core";
20
20
  import "vue-router";
21
21
  import "./legacy-DcjXBL_t.mjs";
22
22
  import "./NcButton-lQra4n2g.mjs";
23
- import { g as getLinkWithPicker, s as searchProvider } from "./referencePickerModal-D09ZVhqa.mjs";
23
+ import { g as getLinkWithPicker, s as searchProvider } from "./referencePickerModal-Bsq4XIcs.mjs";
24
24
  import "./customPickerElements-Cu7bLbap.mjs";
25
- import "./autolink-U5pBzLgI.mjs";
26
- import "./NcRichText-D_ssz6sB.mjs";
25
+ import "unist-builder";
26
+ import "unist-util-visit-parents";
27
+ import "./NcRichText-DGV7OHFb.mjs";
27
28
  import "./NcEmptyContent-CDgWCt_m.mjs";
28
29
  import "./NcHighlight.vue_vue_type_script_lang-DnWQDM_2.mjs";
29
- import "./NcSelect-B1uITk_3.mjs";
30
+ import "./NcSelect-Ba-lsVsl.mjs";
30
31
  import "./NcLoadingIcon-CInLzPtA.mjs";
31
- import "./NcTextField.vue_vue_type_script_setup_true_lang-B-4HNjYH.mjs";
32
+ import "./NcTextField.vue_vue_type_script_setup_true_lang-1ABbHJ0f.mjs";
32
33
  import "dompurify";
33
34
  import "./NcIconSvgWrapper-De-2-ukl.mjs";
34
35
  import "./NcInputField-CPL-a_MM.mjs";
35
36
  import "@nextcloud/event-bus";
36
37
  import "focus-trap";
37
- import "./NcActions-B_QR93qv.mjs";
38
+ import "./NcActions-CeP_c9MH.mjs";
38
39
  import "../composables/useFormatDateTime/index.mjs";
39
40
  import "../composables/useHotKey/index.mjs";
40
41
  import "../composables/useIsFullscreen/index.mjs";
41
42
  import "../composables/useIsMobile/index.mjs";
42
- import "./NcModal-kyWZ3UFC.mjs";
43
+ import "./NcModal-CDj4hQx7.mjs";
43
44
  import "./rtl-v0UOPAM7.mjs";
44
45
  const _sfc_main$2 = {
45
46
  name: "NcMentionBubble",
@@ -382,11 +383,12 @@ const _sfc_main = {
382
383
  default: () => []
383
384
  },
384
385
  /**
385
- * The containing element for the menu popover
386
+ * The containing element or selector for the tribute (menu popover)
387
+ * Defaults to `body` element
386
388
  */
387
389
  menuContainer: {
388
- type: Element,
389
- default: () => document.body
390
+ type: [String, Element, null],
391
+ default: null
390
392
  },
391
393
  /**
392
394
  * Make the contenteditable looks like a textarea or not.
@@ -556,7 +558,6 @@ const _sfc_main = {
556
558
  mounted() {
557
559
  this.initializeTribute();
558
560
  this.updateContent(this.modelValue);
559
- this.$refs.contenteditable.contentEditable = this.contenteditableAttributeValue;
560
561
  },
561
562
  beforeUnmount() {
562
563
  if (this.tribute) {
@@ -654,15 +655,17 @@ const _sfc_main = {
654
655
  itemClass: this.$style["tribute-container__item"]
655
656
  });
656
657
  }
658
+ const menuContainer = typeof this.menuContainer === "string" ? document.querySelector(this.menuContainer) : this.menuContainer;
657
659
  this.tribute = new Tribute({
658
660
  collection: tributesCollection,
659
661
  // FIXME: tributejs doesn't support allowSpaces as a collection option, only as a global one
660
662
  // Requires to fork a library to allow spaces only in the middle of mentions ('@' trigger)
661
663
  allowSpaces: false,
662
664
  // Where to inject the menu popup
663
- menuContainer: this.menuContainer
665
+ menuContainer
664
666
  });
665
667
  this.tribute.attach(this.$refs.contenteditable);
668
+ this.$refs.contenteditable.contentEditable = this.contenteditableAttributeValue;
666
669
  },
667
670
  getLink(item) {
668
671
  getLinkWithPicker(item.original.id).then((result) => {
@@ -961,10 +964,10 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
961
964
  const cssModules = {
962
965
  "$style": style1
963
966
  };
964
- const NcRichContenteditable = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__cssModules", cssModules], ["__scopeId", "data-v-426785d7"]]);
967
+ const NcRichContenteditable = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__cssModules", cssModules], ["__scopeId", "data-v-c6c6ceee"]]);
965
968
  export {
966
969
  NcAutoCompleteResult as N,
967
970
  NcMentionBubble as a,
968
971
  NcRichContenteditable as b
969
972
  };
970
- //# sourceMappingURL=NcRichContenteditable-BREsny-v.mjs.map
973
+ //# sourceMappingURL=NcRichContenteditable-DeN1H5pQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NcRichContenteditable-DeN1H5pQ.mjs","sources":["../../src/components/NcRichContenteditable/NcMentionBubble.vue","../../src/mixins/richEditor/index.js","../../src/components/NcRichContenteditable/NcAutoCompleteResult.vue","../../src/components/NcRichContenteditable/NcRichContenteditable.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<span\n\t\tclass=\"mention-bubble\"\n\t\t:class=\"{ 'mention-bubble--primary': primary }\"\n\t\tcontenteditable=\"false\">\n\t\t<span class=\"mention-bubble__wrapper\">\n\t\t\t<span class=\"mention-bubble__content\">\n\t\t\t\t<!-- Avatar or icon -->\n\t\t\t\t<span\n\t\t\t\t\t:class=\"[icon, `mention-bubble__icon--${avatarUrl ? 'with-avatar' : ''}`]\"\n\t\t\t\t\t:style=\"avatarUrl ? { backgroundImage: `url(${avatarUrl})` } : null\"\n\t\t\t\t\tclass=\"mention-bubble__icon\" />\n\n\t\t\t\t<!-- Title -->\n\t\t\t\t<span role=\"heading\" class=\"mention-bubble__title\" :title=\"label\" />\n\t\t\t</span>\n\n\t\t\t<!-- Selectable text for copy/paste -->\n\t\t\t<span role=\"none\" class=\"mention-bubble__select\">{{ mentionText }}</span>\n\t\t</span>\n\t</span>\n</template>\n\n<script>\nimport { useIsDarkTheme } from '../../composables/useIsDarkTheme/index.ts'\nimport { getAvatarUrl } from '../../utils/getAvatarUrl.ts'\n\nexport default {\n\tname: 'NcMentionBubble',\n\n\t/* eslint vue/require-prop-comment: warn -- TODO: Add a proper doc block about what this props do */\n\tprops: {\n\t\t/**\n\t\t * Id of the bubble\n\t\t */\n\t\tid: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * The main text\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\n\t\t/**\n\t\t * Icon to be applied\n\t\t */\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * URL of the icon\n\t\t */\n\t\ticonUrl: {\n\t\t\ttype: [String, null],\n\t\t\tdefault: null,\n\t\t},\n\n\t\tsource: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * Is the bubble shown as primary\n\t\t */\n\t\tprimary: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst isDarkTheme = useIsDarkTheme()\n\n\t\treturn {\n\t\t\tisDarkTheme,\n\t\t}\n\t},\n\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? getAvatarUrl(this.id, { isDarkTheme: this.isDarkTheme })\n\t\t\t\t: null\n\t\t},\n\n\t\tmentionText() {\n\t\t\treturn !this.id.includes(' ') && !this.id.includes('/')\n\t\t\t\t? `@${this.id}`\n\t\t\t\t: `@\"${this.id}\"`\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$bubble-height: 20px;\n$bubble-max-width: 150px;\n$bubble-padding: 2px;\n$bubble-avatar-size: $bubble-height - 2 * $bubble-padding;\n\n.mention-bubble {\n\t&--primary &__content {\n\t\tcolor: var(--color-primary-element-text);\n\t\tbackground-color: var(--color-primary-element);\n\t}\n\n\t&__wrapper {\n\t\tposition: relative;\n\t\tmax-width: $bubble-max-width;\n\t\t// Align with text\n\t\theight: $bubble-height - $bubble-padding;\n\t\tvertical-align: text-bottom;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t}\n\n\t&__content {\n\t\tdisplay: inline-flex;\n\t\toverflow: hidden;\n\t\talign-items: center;\n\t\tmax-width: 100%;\n\t\theight: $bubble-height;\n\t\t-webkit-user-select: none;\n\t\tuser-select: none;\n\t\tpadding-inline: $bubble-padding $bubble-padding * 3;\n\t\tborder-radius: math.div($bubble-height, 2);\n\t\tbackground-color: var(--color-background-dark);\n\t}\n\n\t&__icon {\n\t\tposition: relative;\n\t\twidth: $bubble-avatar-size;\n\t\theight: $bubble-avatar-size;\n\t\tborder-radius: math.div($bubble-avatar-size, 2);\n\t\tbackground-color: var(--color-background-darker);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t\tbackground-size: $bubble-avatar-size - 2 * $bubble-padding;\n\n\t\t&--with-avatar {\n\t\t\tcolor: inherit;\n\t\t\tbackground-size: cover;\n\t\t}\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\tmargin-inline-start: $bubble-padding;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\t// Put title in ::before so it is not selectable\n\t\t&::before {\n\t\t\tcontent: attr(title);\n\t\t}\n\t}\n\n\t// Hide the mention id so it is selectable\n\t&__select {\n\t\tposition: absolute;\n\t\tz-index: -1;\n\t\tinset-inline-start: -100vw;\n\t\twidth: 1px;\n\t\theight: 1px;\n\t\toverflow: hidden;\n\t}\n}\n\n</style>\n","/**\n * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport escapeHtml from 'escape-html'\nimport stripTags from 'striptags'\nimport { createApp } from 'vue'\nimport NcMentionBubble from '../../components/NcRichContenteditable/NcMentionBubble.vue'\n\n// Referenced from public function getMentions(): https://github.com/nextcloud/server/blob/master/lib/private/Comments/Comment.php\n// Beginning or whitespace. Uses positive lookahead (to work on MobileSafari <16.4)\nconst MENTION_START = /(?=[a-z0-9_\\-@.'])\\B/.source\n// Capturing groups like: @user-id, @\"guest/abc16def\", @\"federated_user/user-id\", @\"user-id with space\"\nconst MENTION_SIMPLE = /(@[a-z0-9_\\-@.']+)/.source\nconst MENTION_GUEST = /@&quot;(?:guest|email){1}\\/[a-f0-9]+&quot;/.source\nconst MENTION_PREFIXED = /@&quot;(?:federated_)?(?:group|team|user){1}\\/[a-z0-9_\\-@.' /:]+&quot;/.source\nconst MENTION_WITH_SPACE = /@&quot;[a-z0-9_\\-@.' ]+&quot;/.source\nconst MENTION_COMPLEX = `(${MENTION_GUEST}|${MENTION_PREFIXED}|${MENTION_WITH_SPACE})`\n// Concatenated regular expressions\nexport const USERID_REGEX = new RegExp(`${MENTION_START}${MENTION_SIMPLE}`, 'gi')\nexport const USERID_REGEX_WITH_SPACE = new RegExp(`${MENTION_START}${MENTION_COMPLEX}`, 'gi')\n\nexport default {\n\tprops: {\n\t\tuserData: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\tmethods: {\n\t\t/**\n\t\t * Convert the value string to html for the inner content\n\t\t *\n\t\t * @param {string} value the content without html\n\t\t * @return {string} rendered html\n\t\t */\n\t\trenderContent(value) {\n\t\t\t// Sanitize the value prop\n\t\t\tconst sanitizedValue = escapeHtml(value)\n\n\t\t\t// Extract all the userIds\n\t\t\tconst splitValue = sanitizedValue.split(USERID_REGEX)\n\t\t\t\t.map((part) => part.split(USERID_REGEX_WITH_SPACE)).flat()\n\n\t\t\t// Replace userIds by html\n\t\t\treturn splitValue\n\t\t\t\t.map((part) => {\n\t\t\t\t\t// When splitting, the string is always putting the userIds\n\t\t\t\t\t// on the uneven indexes. We only want to generate the mentions html\n\t\t\t\t\tif (!part.startsWith('@')) {\n\t\t\t\t\t\treturn part\n\t\t\t\t\t}\n\n\t\t\t\t\t// Extracting the id, nuking the leading @ and all \"\n\t\t\t\t\tconst id = part.slice(1).replace(/&quot;/gi, '')\n\t\t\t\t\t// Compiling template and prepend with the space we removed during the split\n\t\t\t\t\treturn this.genSelectTemplate(id)\n\t\t\t\t})\n\t\t\t\t.join('')\n\t\t\t\t.replace(/\\n/gmi, '<br>')\n\t\t\t\t.replace(/&amp;/gmi, '&')\n\t\t},\n\n\t\t/**\n\t\t * Convert the innerHtml content to a string with mentions as text\n\t\t *\n\t\t * @param {string} content the content without html\n\t\t * @return {string}\n\t\t */\n\t\tparseContent(content) {\n\t\t\tlet text = content\n\t\t\t// Replace break lines with new lines\n\t\t\ttext = text.replace(/<br>/gmi, '\\n')\n\t\t\t// Replace some html special characters\n\t\t\ttext = text.replace(/&nbsp;/gmi, ' ')\n\t\t\ttext = text.replace(/&amp;/gmi, '&')\n\n\t\t\t// Convert the mentions to text only\n\t\t\t// first we replace divs with new lines\n\t\t\ttext = text.replace(/<\\/div>/gmi, '\\n')\n\t\t\t// then we remove all leftover html\n\t\t\ttext = stripTags(text, '<div>')\n\t\t\ttext = stripTags(text)\n\n\t\t\treturn text\n\t\t},\n\n\t\t/**\n\t\t * Generate an autocompletion popup entry template\n\t\t *\n\t\t * @param {string} value the value to match against the userData\n\t\t * @return {string}\n\t\t */\n\t\tgenSelectTemplate(value) {\n\t\t\t// The value returned by this function will replace the trigger '@'\n\t\t\t// and the search text, so when there is no match we simply return\n\t\t\t// '@' and the text.\n\t\t\tif (typeof value === 'undefined') {\n\t\t\t\treturn `${this.autocompleteTribute.current.collection.trigger}${this.autocompleteTribute.current.mentionText}`\n\t\t\t}\n\n\t\t\tconst data = this.userData[value]\n\n\t\t\t// Fallback to @mention in case no data matches\n\t\t\tif (!data) {\n\t\t\t\t// return @value if matches MENTION_SIMPLE, @\"value\" otherwise\n\t\t\t\treturn [' ', '/', ':'].every((char) => !value.includes(char))\n\t\t\t\t\t? `@${value}`\n\t\t\t\t\t: `@\"${value}\"`\n\t\t\t}\n\n\t\t\t// Return template and make sure we strip off new lines, tabs and consecutive whitespaces\n\t\t\treturn this.renderComponentHtml(data, NcMentionBubble)\n\t\t\t\t.replace(/[\\n\\t]/gmi, '')\n\t\t\t\t.replace(/>\\s+</g, '><')\n\t\t},\n\n\t\t/**\n\t\t * Render a component and return its html content\n\t\t *\n\t\t * @param {object} props the props to pass to the component\n\t\t * @param {object} component the component to render\n\t\t * @return {string} the rendered html\n\t\t */\n\t\trenderComponentHtml(props, component) {\n\t\t\tconst Item = createApp(component, {\n\t\t\t\t...props,\n\t\t\t})\n\n\t\t\t// Prepare mountpoint\n\t\t\tconst mount = document.createElement('div')\n\t\t\tmount.style.display = 'none'\n\t\t\tdocument.body.appendChild(mount)\n\n\t\t\t// Mount and get raw html\n\t\t\tItem.mount(mount)\n\t\t\tconst renderedHtml = mount.innerHTML\n\n\t\t\t// Destroy\n\t\t\tItem.unmount()\n\t\t\tmount.remove()\n\n\t\t\treturn renderedHtml\n\t\t},\n\t},\n}\n","<!--\n - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"autocomplete-result\">\n\t\t<!-- Avatar or icon -->\n\t\t<div\n\t\t\t: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\n\t\t\t\tv-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\n\t\t\t\tv-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=\"label\">\n\t\t\t\t{{ label }}\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 { useIsDarkTheme } from '../../composables/useIsDarkTheme/index.ts'\nimport { getAvatarUrl } from '../../utils/getAvatarUrl.ts'\nimport NcUserStatusIcon from '../NcUserStatusIcon/index.js'\n\nexport default {\n\tname: 'NcAutoCompleteResult',\n\n\tcomponents: {\n\t\tNcUserStatusIcon,\n\t},\n\n\t/* eslint vue/require-prop-comment: warn -- TODO: Add a proper doc block about what this props do */\n\tprops: {\n\t\t/**\n\t\t * The label text\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\n\t\t/**\n\t\t * The secondary line of text if any\n\t\t */\n\t\tsubline: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Unique id\n\t\t */\n\t\tid: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The icon class\n\t\t */\n\t\ticon: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * Icon as external URL\n\t\t */\n\t\ticonUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\tsource: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\tstatus: {\n\t\t\ttype: [Object, Array],\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst isDarkTheme = useIsDarkTheme()\n\t\treturn {\n\t\t\tisDarkTheme,\n\t\t}\n\t},\n\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? getAvatarUrl(this.id, { isDarkTheme: this.isDarkTheme })\n\t\t\t\t: null\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.autocomplete-result {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--default-grid-baseline);\n\tline-height: 1.2;\n\t--auto-complete-result-avatar-size: var(--default-clickable-area);\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\t--auto-complete-result-status-icon-size: clamp(14px, var(--auto-complete-result-avatar-size) * 0.4, 18px);\n\t\t// Avatar Radius * (1 - 1 / sqrt(2)) - Status Icon Radius / 2\n\t\t--auto-complete-result-status-icon-position: calc(var(--auto-complete-result-avatar-size) / 2 * (1 - 1 / sqrt(2)) - var(--auto-complete-result-status-icon-size) / 2);\n\t\tbox-sizing: border-box;\n\t\tposition: absolute;\n\t\tinset-inline-end: var(--auto-complete-result-status-icon-position);\n\t\tbottom: var(--auto-complete-result-status-icon-position);\n\t\theight: var(--auto-complete-result-status-icon-size);\n\t\twidth: var(--auto-complete-result-status-icon-size);\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: calc(var(--auto-complete-result-status-icon-size) / 1.2);\n\t\tline-height: 1.2;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-size: var(--auto-complete-result-status-icon-size);\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}\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 - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\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\tv-model=\"message\"\n\t\t\t:disabled\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\tv-model=\"message\"\n\t\t\t:disabled=\"!disabled\"\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<NcCheckboxRadioSwitch v-model=\"disabled\" type=\"switch\">Toggle disabled state</NcCheckboxRadioSwitch>\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\tdisabled: false,\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;\n\t}\n\n\t.pre-line {\n\t\twhite-space: pre-line;\n\t}\n</style>\n```\n\n### Using public methods\n\n```vue\n<template>\n\t<div>\n\t\t<div class=\"buttons-wrapper\">\n\t\t\t<NcButton class=\"show-slash-button\" @click=\"showSlashCommands\">Slash commands</NcButton>\n\t\t\t<NcButton class=\"focus-button\" @click=\"focus\">Focus on input</NcButton>\n\t\t</div>\n\t\t<NcRichContenteditable\n\t\t\tref=\"contenteditable\"\n\t\t\tv-model=\"message\"\n\t\t\tlabel=\"Write a comment\"\n\t\t\t:maxlength=\"100\"/>\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}\n\t},\n\tmethods: {\n\t\tshowSlashCommands() {\n\t\t\tthis.$refs.contenteditable.showTribute('/')\n\t\t},\n\t\tfocus() {\n\t\t\tthis.$refs.contenteditable.focus()\n\t\t},\n\t},\n}\n</script>\n<style lang=\"scss\" scoped>\n\t.buttons-wrapper {\n\t\tdisplay: flex;\n\t\tgap: 10px;\n\t\tmargin-bottom: 20px;\n\t}\n</style>\n```\n\n</docs>\n\n<template>\n\t<div class=\"rich-contenteditable\" :class=\"$props.class\">\n\t\t<div\n\t\t\t:id=\"id\"\n\t\t\tref=\"contenteditable\"\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=\"contenteditableAttributeValue\"\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\t:title=\"tooltipString\"\n\t\t\tv-bind=\"$attrs\"\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.esc.capture=\"onKeyEsc\"\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\n\t\t\tv-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 debounce from 'debounce'\nimport Tribute from 'tributejs/dist/tribute.esm.js'\nimport NcAutoCompleteResult from './NcAutoCompleteResult.vue'\nimport { emojiAddRecent, emojiSearch } from '../../functions/emoji/index.ts'\nimport { n, t } from '../../l10n.ts'\nimport richEditor from '../../mixins/richEditor/index.js'\nimport { createElementId } from '../../utils/createElementId.ts'\nimport { logger } from '../../utils/logger.ts'\nimport { getLinkWithPicker, searchProvider } from '../NcRichText/index.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\nlet isPlaintextOnlySupported = null\n\nexport default {\n\tname: 'NcRichContenteditable',\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: () => createElementId(),\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\t/**\n\t\t * The text content\n\t\t */\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * Placeholder to be shown if empty\n\t\t */\n\t\tplaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: t('Write a message …'),\n\t\t},\n\n\t\t/**\n\t\t * Auto complete function\n\t\t */\n\t\tautoComplete: {\n\t\t\ttype: Function,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * The containing element or selector for the tribute (menu popover)\n\t\t * Defaults to `body` element\n\t\t */\n\t\tmenuContainer: {\n\t\t\ttype: [String, Element, null],\n\t\t\tdefault: null,\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\n\t\t/**\n\t\t * CSS class to apply to the root element.\n\t\t */\n\t\tclass: {\n\t\t\ttype: [String, Array, Object],\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\temits: [\n\t\t'paste',\n\t\t'update:modelValue',\n\t\t'smartPickerSubmit',\n\t\t'submit',\n\t],\n\n\tsetup() {\n\t\tconst segmenter = new Intl.Segmenter()\n\n\t\t// Test whether browser supports 'plaintext-only' attribute\n\t\tif (isPlaintextOnlySupported === null) {\n\t\t\ttry {\n\t\t\t\tdocument.createElement('div').contentEditable = 'plaintext-only'\n\t\t\t\tisPlaintextOnlySupported = true\n\t\t\t} catch (error) {\n\t\t\t\t// Keep fallback for unsupported browsers\n\t\t\t\tlogger.debug('[NcRichContenteditable] Unsupported attribute value:', { error })\n\t\t\t\tisPlaintextOnlySupported = false\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t// Constants\n\t\t\tlabelId: createElementId(),\n\t\t\ttributeId: createElementId(),\n\n\t\t\tsegmenter,\n\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.modelValue,\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 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\tconst length = [...this.segmenter.segment(this.localValue)].length\n\t\t\treturn length > 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('Message limit of %n character reached', 'Message limit of %n characters reached', this.maxlength)\n\t\t},\n\n\t\t/**\n\t\t * Edit is only allowed when contenteditable is:\n\t\t * 'true' (all browsers since 2015)\n\t\t * 'plaintext-only' (most browsers since 2015, Firefox since 136+)\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tcontenteditableAttributeValue() {\n\t\t\tif (this.contenteditable && !this.disabled) {\n\t\t\t\treturn isPlaintextOnlySupported ? 'plaintext-only' : 'true'\n\t\t\t}\n\t\t\treturn 'false'\n\t\t},\n\n\t\t/**\n\t\t * Compute debounce function for the autocomplete function\n\t\t */\n\t\tdebouncedAutoComplete() {\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\tmodelValue() {\n\t\t\tconst html = this.$refs.contenteditable.innerHTML\n\t\t\t// Compare trimmed versions to be safe\n\t\t\tif (this.modelValue.trim() !== this.parseContent(html).trim()) {\n\t\t\t\tthis.updateContent(this.modelValue)\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.modelValue)\n\t},\n\n\tbeforeUnmount() {\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=\"${createElementId()}\" class=\"${this.$style['tribute-item']}\" role=\"option\">${content}</div>`\n\n\t\t\tconst tributesCollection = []\n\t\t\ttributesCollection.push({\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\trequireLeadingSpace: true,\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\trequireLeadingSpace: true,\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\trequireLeadingSpace: true,\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\t// Resolve container for Tribute.js to be mounted to (default - `null`)\n\t\t\tconst menuContainer = (typeof this.menuContainer === 'string')\n\t\t\t\t? document.querySelector(this.menuContainer)\n\t\t\t\t: this.menuContainer\n\n\t\t\tthis.tribute = new Tribute({\n\t\t\t\tcollection: tributesCollection,\n\t\t\t\t// FIXME: tributejs doesn't support allowSpaces as a collection option, only as a global one\n\t\t\t\t// Requires to fork a library to allow spaces only in the middle of mentions ('@' trigger)\n\t\t\t\tallowSpaces: false,\n\t\t\t\t// Where to inject the menu popup\n\t\t\t\tmenuContainer,\n\t\t\t})\n\t\t\tthis.tribute.attach(this.$refs.contenteditable)\n\n\t\t\t// Tribute.js library v5.1.3 ensures that `el.contentEditable = true` when attaching to element.\n\t\t\t// This overwrites the template binding.\n\t\t\t// Set the contenteditable attribute to actual value afterward\n\t\t\t// TODO remove when Tribute.js library v5.1.4 is published on npm (or fork it)\n\t\t\tthis.$refs.contenteditable.contentEditable = this.contenteditableAttributeValue\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('smartPickerSubmit', 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\tlogger.debug('[NcRichContenteditable] 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\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\n\t\tmoveCursorToEnd() {\n\t\t\tif (!document.createRange) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (window.getSelection().rangeCount > 0\n\t\t\t\t&& this.$refs.contenteditable.contains(window.getSelection().getRangeAt(0).commonAncestorContainer)) {\n\t\t\t\treturn\n\t\t\t}\n\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\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.contenteditable || this.disabled) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (isPlaintextOnlySupported) {\n\t\t\t\tthis.$emit('paste', event)\n\t\t\t} else {\n\t\t\t\t/**\n\t\t\t\t * Fallback for unsupported browsers:\n\t\t\t\t * - patched 'paste' operation to insert only raw text\n\t\t\t\t * - issues with 'undo' and 'redo' operations\n\t\t\t\t */\n\t\t\t\tevent.preventDefault()\n\t\t\t\tconst clipboardData = event.clipboardData\n\n\t\t\t\t/** The original paste event */\n\t\t\t\tthis.$emit('paste', event)\n\n\t\t\t\t// If we have a file or if we don't have any text, ignore\n\t\t\t\tif (clipboardData.files.length !== 0\n\t\t\t\t\t|| !Object.values(clipboardData.items).find((item) => item?.type.startsWith('text'))) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst text = clipboardData.getData('text')\n\t\t\t\tconst selection = window.getSelection()\n\n\t\t\t\t// Generate text and insert\n\t\t\t\tconst range = selection.getRangeAt(0)\n\t\t\t\trange.deleteContents()\n\t\t\t\trange.insertNode(document.createTextNode(text))\n\n\t\t\t\t// Collapse the range to the end position\n\t\t\t\trange.collapse(false)\n\t\t\t}\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\t// Browsers keep <br> after erasing contenteditable\n\t\t\tconst text = this.parseContent(htmlOrText).replace(/^\\n$/, '')\n\t\t\tthis.localValue = text\n\t\t\tthis.$emit('update:modelValue', 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 * 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\tonKeyEsc(event) {\n\t\t\t// prevent event from bubbling when tribute is open\n\t\t\tif (this.tribute && this.isAutocompleteOpen) {\n\t\t\t\tevent.stopImmediatePropagation()\n\t\t\t\tthis.tribute.hideMenu()\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Get HTML element with Tribute.js container\n\t\t *\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 *\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 *\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\t// Remove the event handler if any\n\t\t\t\tdocument.removeEventListener('click', this.hideTribute, true)\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\n\t\t/**\n\t\t * Show tribute menu programmatically.\n\t\t *\n\t\t * @param {string} trigger - trigger character, can be '/', '@', or ':'\n\t\t *\n\t\t * @public\n\t\t */\n\t\tshowTribute(trigger) {\n\t\t\tthis.focus()\n\t\t\tconst index = this.tribute.collection.findIndex((collection) => collection.trigger === trigger)\n\t\t\tthis.tribute.showMenuForCollection(this.$refs.contenteditable, index)\n\t\t\tthis.updateValue(this.$refs.contenteditable.innerHTML)\n\t\t\tdocument.addEventListener('click', this.hideTribute, true)\n\t\t},\n\n\t\t/**\n\t\t * Hide tribute menu programmatically\n\t\t *\n\t\t */\n\t\thideTribute() {\n\t\t\tthis.tribute.hideMenu()\n\t\t\tdocument.removeEventListener('click', this.hideTribute, true)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n// Standalone styling, independent from server\n.rich-contenteditable {\n\t--contenteditable-block-offset: calc(2 * var(--default-grid-baseline));\n\t--contenteditable-inline-start-offset: calc(2 * var(--default-grid-baseline));\n\t--contenteditable-inline-end-offset: calc(2 * var(--default-grid-baseline));\n\tposition: relative;\n\twidth: auto;\n\n\t&__label {\n\t\tposition: absolute;\n\t\tmargin-inline: 14px;\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: 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-block: var(--contenteditable-block-offset);\n\t\tpadding-inline: var(--contenteditable-inline-start-offset) var(--contenteditable-inline-end-offset);\n\t\tcursor: text;\n\t\twhite-space: pre-wrap;\n\t\toverflow-wrap: 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-element);\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\ttab-size: 4;\n\t\tmin-height: var(--default-clickable-area);\n\t\tmax-height: calc(var(--default-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\twidth: calc(100% - var(--contenteditable-inline-start-offset) - var(--contenteditable-inline-end-offset));\n\t\t\theight: calc(100% - 2 * var(--contenteditable-block-offset));\n\t\t\toverflow: hidden;\n\t\t\twhite-space: nowrap;\n\t\t\ttext-overflow: ellipsis;\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: calc(var(--default-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-small);\n\t\t\tbackground-color: var(--color-background-dark);\n\t\t}\n\n\t\t&--overflow,\n\t\t&--overflow:hover {\n\t\t\t// we need important to override server styles\n\t\t\tborder-color: var(--color-border-error, var(--color-error)) !important;\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// Hide container root element while initializing\n\tposition: absolute;\n\t/* stylelint-disable-next-line csstools/use-logical */ /* upstream logic */\n\tleft: -100vw;\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-element);\n\tbackground: var(--color-main-background);\n\tbox-shadow: 0 1px 5px var(--color-box-shadow);\n\n\t&,\n\t& * {\n\t\tbox-sizing: border-box;\n\t}\n\n\tul {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--default-grid-baseline);\n\t}\n\n\t.tribute-container__item {\n\t\tcolor: var(--color-text-maxcontrast);\n\t\tborder-radius: var(--border-radius-small);\n\t\tpadding: var(--default-grid-baseline);\n\t\tcursor: pointer;\n\t\tmin-height: var(--clickable-area-small, auto);\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 inside autocomplete\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) + 3 * 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 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\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-inline-end: var(--default-grid-baseline);\n\t\t\tfilter: var(--background-invert-if-dark);\n\t\t}\n\t}\n}\n\n</style>\n"],"names":["_sfc_main","_hoisted_1","_hoisted_2","_createElementBlock","_normalizeClass","_createElementVNode","_normalizeStyle","_hoisted_4","_toDisplayString","escapeHtml","_openBlock","_createBlock","_mergeProps"],"mappings":"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"}