@nextcloud/vue 9.9.0 → 9.11.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 (655) hide show
  1. package/CHANGELOG.md +88 -65
  2. package/dist/assets/{NcActionButton-DLer-aUY.css → NcActionButton.css} +1 -0
  3. package/dist/assets/{NcActionCheckbox-wD8m_a8-.css → NcActionCheckbox.css} +1 -0
  4. package/dist/assets/{NcActionInput-t9WvlgV0.css → NcActionInput.css} +70 -66
  5. package/dist/assets/{NcActionLink-b4Ph5q10.css → NcActionLink.css} +1 -0
  6. package/dist/assets/{NcActionRadio-D2rLM1ci.css → NcActionRadio.css} +1 -0
  7. package/dist/assets/{NcActionRouter-BWXfCfxM.css → NcActionRouter.css} +1 -0
  8. package/dist/assets/{NcActionText-Dzegj6AY.css → NcActionText.css} +1 -0
  9. package/dist/assets/{NcActionTextEditable-BlZeHZ7J.css → NcActionTextEditable.css} +67 -65
  10. package/dist/assets/{NcActions-y7ehwPSp.css → NcActions.css} +12 -12
  11. package/dist/assets/{NcAppNavigation-OHw55TTZ.css → NcAppNavigation.css} +17 -17
  12. package/dist/assets/{NcAppNavigationItem-BZ1xj6Xi.css → NcAppNavigationItem.css} +58 -48
  13. package/dist/assets/NcAppNavigationList.css +52 -0
  14. package/dist/assets/{NcAppNavigationNewItem-MaYQVcKF.css → NcAppNavigationNewItem.css} +13 -3
  15. package/dist/assets/{NcAppNavigationSettings-mWFhcXm0.css → NcAppNavigationSettings.css} +6 -6
  16. package/dist/assets/{NcAppSettingsDialog-Dh_scIK4.css → NcAppSettingsDialog.css} +3 -3
  17. package/dist/assets/{NcAppSettingsShortcutsSection-BHxkQTg2.css → NcAppSettingsShortcutsSection.css} +1 -1
  18. package/dist/assets/{NcAppSidebar-oJQ8kUb0.css → NcAppSidebar.css} +132 -78
  19. package/dist/assets/{NcAppSidebarTab-Xd3HTDbw.css → NcAppSidebarTab.css} +4 -4
  20. package/dist/assets/{NcAssistantButton-CT25wqIs.css → NcAssistantButton.css} +9 -9
  21. package/dist/assets/{NcAssistantContent-FV00e96S.css → NcAssistantContent.css} +3 -3
  22. package/dist/assets/{NcAssistantIcon-BMLpMaMJ.css → NcAssistantIcon.css} +4 -4
  23. package/dist/assets/{NcAvatar-Bs7qEhkA.css → NcAvatar.css} +39 -24
  24. package/dist/assets/{NcBlurHash-RgrahjEp.css → NcBlurHash.css} +2 -2
  25. package/dist/assets/{NcButton-DOrlC_y5.css → NcButton.css} +52 -50
  26. package/dist/assets/{NcCheckboxRadioSwitch-BlQSZVW0.css → NcCheckboxRadioSwitch.css} +36 -36
  27. package/dist/assets/{NcDateTimePicker-BQ_y9Ihj.css → NcDateTimePicker.css} +234 -234
  28. package/dist/assets/NcDateTimePickerNative.css +38 -0
  29. package/dist/assets/{NcEllipsisedOption-CPWbbgBy.css → NcEllipsisedOption.css} +10 -5
  30. package/dist/assets/{NcFilePicker-BdjtiV3h.css → NcFilePicker.css} +1 -1
  31. package/dist/assets/{NcFormBox-TRgICDO3.css → NcFormBox.css} +11 -11
  32. package/dist/assets/{NcFormBoxButton-ClkxmO-H.css → NcFormBoxButton.css} +2 -2
  33. package/dist/assets/{NcFormBoxItem-CABDVZLe.css → NcFormBoxItem.css} +19 -15
  34. package/dist/assets/{NcFormBoxSwitch-NCjook_Z.css → NcFormBoxSwitch.css} +2 -2
  35. package/dist/assets/{NcFormGroup-eh8-PBGB.css → NcFormGroup.css} +7 -7
  36. package/dist/assets/{NcHeaderMenu-Hy0UKyUu.css → NcHeaderMenu.css} +22 -24
  37. package/dist/assets/{NcHotkey-Dm-26TVC.css → NcHotkey.css} +8 -8
  38. package/dist/assets/{NcHotkeyList-BigfRqyr.css → NcHotkeyList.css} +2 -2
  39. package/dist/assets/{NcIconToggleSwitch-zUXkaJHv.css → NcIconToggleSwitch.css} +4 -4
  40. package/dist/assets/{NcInputField-DpyFJ1xw.css → NcInputField.css} +43 -43
  41. package/dist/assets/{NcKbd-DcC56WbC.css → NcKbd.css} +3 -3
  42. package/dist/assets/NcPopover.css +108 -0
  43. package/dist/assets/NcProfileHoverCard.css +340 -0
  44. package/dist/assets/{NcProgressBar-B6wveIA1.css → NcProgressBar.css} +14 -14
  45. package/dist/assets/{NcRadioGroup-CtXZ4Y8D.css → NcRadioGroup.css} +2 -2
  46. package/dist/assets/{NcRadioGroupButton-BuB-aWeJ.css → NcRadioGroupButton.css} +19 -14
  47. package/dist/assets/NcReferenceWidget.css +150 -0
  48. package/dist/assets/{NcRichContenteditable-BCUBhRqg.css → NcRichContenteditable.css} +17 -17
  49. package/dist/assets/NcSelect.css +397 -0
  50. package/dist/assets/NcSelectUsers.css +12 -0
  51. package/dist/assets/{autolink-XS-VDSVB.css → autolink.css} +3 -3
  52. package/dist/assets/{referencePickerModal-BNPfxyni.css → referencePickerModal.css} +0 -149
  53. package/dist/chunks/{ArrowRight-B1ncAhus.mjs → ArrowRight.mjs} +2 -2
  54. package/dist/chunks/ArrowRight.mjs.map +1 -0
  55. package/dist/chunks/{ChevronDown-C6gc637b.mjs → ChevronDown.mjs} +2 -2
  56. package/dist/chunks/ChevronDown.mjs.map +1 -0
  57. package/dist/chunks/{ChevronUp-ChH8oB7p.mjs → ChevronUp.mjs} +2 -2
  58. package/dist/chunks/ChevronUp.mjs.map +1 -0
  59. package/dist/chunks/{Close-CuhcJnX2.mjs → Close.mjs} +2 -2
  60. package/dist/chunks/Close.mjs.map +1 -0
  61. package/dist/chunks/{NcActionButton-BO5T5ePT.mjs → NcActionButton.mjs} +7 -7
  62. package/dist/chunks/NcActionButton.mjs.map +1 -0
  63. package/dist/chunks/{NcActionButtonGroup-Dd03Oluy.mjs → NcActionButtonGroup.mjs} +6 -6
  64. package/dist/chunks/NcActionButtonGroup.mjs.map +1 -0
  65. package/dist/chunks/{NcActionCaption-f7L9gBlT.mjs → NcActionCaption.mjs} +4 -4
  66. package/dist/chunks/NcActionCaption.mjs.map +1 -0
  67. package/dist/chunks/{NcActionCheckbox-DBqiK-AZ.mjs → NcActionCheckbox.mjs} +8 -8
  68. package/dist/chunks/NcActionCheckbox.mjs.map +1 -0
  69. package/dist/chunks/{NcActionInput-Dr8Yrafu.mjs → NcActionInput.mjs} +14 -13
  70. package/dist/chunks/NcActionInput.mjs.map +1 -0
  71. package/dist/chunks/{NcActionLink-BFiaYt9A.mjs → NcActionLink.mjs} +5 -5
  72. package/dist/chunks/NcActionLink.mjs.map +1 -0
  73. package/dist/chunks/{NcActionRadio-BA08CAtA.mjs → NcActionRadio.mjs} +8 -8
  74. package/dist/chunks/NcActionRadio.mjs.map +1 -0
  75. package/dist/chunks/{NcActionRouter-vYFtIOzD.mjs → NcActionRouter.mjs} +5 -5
  76. package/dist/chunks/NcActionRouter.mjs.map +1 -0
  77. package/dist/chunks/{NcActionSeparator-B9pNQaji.mjs → NcActionSeparator.mjs} +3 -3
  78. package/dist/chunks/NcActionSeparator.mjs.map +1 -0
  79. package/dist/chunks/{NcActionText-CQ9qwJ0p.mjs → NcActionText.mjs} +5 -5
  80. package/dist/chunks/NcActionText.mjs.map +1 -0
  81. package/dist/chunks/{NcActionTextEditable-B8y_GEre.mjs → NcActionTextEditable.mjs} +8 -8
  82. package/dist/chunks/NcActionTextEditable.mjs.map +1 -0
  83. package/dist/chunks/{NcActions-C-wDqSrv.mjs → NcActions.mjs} +12 -12
  84. package/dist/chunks/NcActions.mjs.map +1 -0
  85. package/dist/chunks/{NcAppContent-DavgjaFX.mjs → NcAppContent.mjs} +11 -11
  86. package/dist/chunks/NcAppContent.mjs.map +1 -0
  87. package/dist/chunks/{NcAppContentDetails.vue_vue_type_script_setup_true_lang-BWl5Pw5g.mjs → NcAppContentDetails.vue_vue_type_script_setup_true_lang.mjs} +1 -1
  88. package/dist/chunks/NcAppContentDetails.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
  89. package/dist/chunks/{NcAppContentList-Copx3Ver.mjs → NcAppContentList.mjs} +2 -2
  90. package/dist/chunks/NcAppContentList.mjs.map +1 -0
  91. package/dist/chunks/{NcAppNavigation-g57j16pB.mjs → NcAppNavigation.mjs} +17 -16
  92. package/dist/chunks/NcAppNavigation.mjs.map +1 -0
  93. package/dist/chunks/{NcAppNavigationCaption-VjSWJ8R4.mjs → NcAppNavigationCaption.mjs} +4 -4
  94. package/dist/chunks/NcAppNavigationCaption.mjs.map +1 -0
  95. package/dist/chunks/{NcAppNavigationIconBullet-BmU-dPcY.mjs → NcAppNavigationIconBullet.mjs} +3 -3
  96. package/dist/chunks/NcAppNavigationIconBullet.mjs.map +1 -0
  97. package/dist/chunks/{NcAppNavigationItem-CDeYtA3E.mjs → NcAppNavigationItem.mjs} +53 -24
  98. package/dist/chunks/NcAppNavigationItem.mjs.map +1 -0
  99. package/dist/chunks/NcAppNavigationList.mjs +147 -0
  100. package/dist/chunks/NcAppNavigationList.mjs.map +1 -0
  101. package/dist/chunks/{NcAppNavigationNew-CBNppM7Q.mjs → NcAppNavigationNew.mjs} +4 -4
  102. package/dist/chunks/NcAppNavigationNew.mjs.map +1 -0
  103. package/dist/chunks/{NcAppNavigationNewItem-B1RfQkvu.mjs → NcAppNavigationNewItem.mjs} +5 -5
  104. package/dist/chunks/NcAppNavigationNewItem.mjs.map +1 -0
  105. package/dist/chunks/{NcAppNavigationSearch-CQQWb1Eq.mjs → NcAppNavigationSearch.mjs} +7 -7
  106. package/dist/chunks/NcAppNavigationSearch.mjs.map +1 -0
  107. package/dist/chunks/{NcAppNavigationSettings-DoMjRExO.mjs → NcAppNavigationSettings.mjs} +16 -16
  108. package/dist/chunks/NcAppNavigationSettings.mjs.map +1 -0
  109. package/dist/chunks/{NcAppNavigationSpacer-CIRC4ZEj.mjs → NcAppNavigationSpacer.mjs} +3 -3
  110. package/dist/chunks/NcAppNavigationSpacer.mjs.map +1 -0
  111. package/dist/chunks/{NcAppSettingsDialog-BPcEYLjP.mjs → NcAppSettingsDialog.mjs} +13 -13
  112. package/dist/chunks/NcAppSettingsDialog.mjs.map +1 -0
  113. package/dist/chunks/{NcAppSettingsSection-BosSmisT.mjs → NcAppSettingsSection.mjs} +5 -5
  114. package/dist/chunks/NcAppSettingsSection.mjs.map +1 -0
  115. package/dist/chunks/{NcAppSettingsShortcutsSection-DLwubKV9.mjs → NcAppSettingsShortcutsSection.mjs} +7 -7
  116. package/dist/chunks/NcAppSettingsShortcutsSection.mjs.map +1 -0
  117. package/dist/chunks/{NcAppSidebar-C8YzAzrZ.mjs → NcAppSidebar.mjs} +180 -46
  118. package/dist/chunks/NcAppSidebar.mjs.map +1 -0
  119. package/dist/chunks/{NcAppSidebarHeader.vue_vue_type_script_setup_true_lang-C-QhdyiN.mjs → NcAppSidebarHeader.vue_vue_type_script_setup_true_lang.mjs} +1 -1
  120. package/dist/chunks/NcAppSidebarHeader.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
  121. package/dist/chunks/{NcAppSidebarTab-DOSDDbGA.mjs → NcAppSidebarTab.mjs} +15 -8
  122. package/dist/chunks/NcAppSidebarTab.mjs.map +1 -0
  123. package/dist/chunks/{NcAssistantButton-iK491d2v.mjs → NcAssistantButton.mjs} +14 -14
  124. package/dist/chunks/NcAssistantButton.mjs.map +1 -0
  125. package/dist/chunks/{NcAssistantContent-iHA4O4cC.mjs → NcAssistantContent.mjs} +6 -6
  126. package/dist/chunks/NcAssistantContent.mjs.map +1 -0
  127. package/dist/chunks/{NcAssistantIcon-C6s4Qm7-.mjs → NcAssistantIcon.mjs} +9 -9
  128. package/dist/chunks/NcAssistantIcon.mjs.map +1 -0
  129. package/dist/chunks/{NcAvatar-1KxMUN7V.mjs → NcAvatar.mjs} +214 -80
  130. package/dist/chunks/NcAvatar.mjs.map +1 -0
  131. package/dist/chunks/{NcBlurHash-B30Ol8KP.mjs → NcBlurHash.mjs} +6 -6
  132. package/dist/chunks/NcBlurHash.mjs.map +1 -0
  133. package/dist/chunks/{NcBreadcrumb-3Y5NWXnV.mjs → NcBreadcrumb.mjs} +6 -6
  134. package/dist/chunks/NcBreadcrumb.mjs.map +1 -0
  135. package/dist/chunks/{NcBreadcrumbs-BaTp3Sya.mjs → NcBreadcrumbs.mjs} +8 -8
  136. package/dist/chunks/NcBreadcrumbs.mjs.map +1 -0
  137. package/dist/chunks/{NcButton-jvoYS2my.mjs → NcButton.mjs} +6 -6
  138. package/dist/chunks/NcButton.mjs.map +1 -0
  139. package/dist/chunks/{NcCheckboxRadioSwitch-DVdt5Hkq.mjs → NcCheckboxRadioSwitch.mjs} +22 -12
  140. package/dist/chunks/NcCheckboxRadioSwitch.mjs.map +1 -0
  141. package/dist/chunks/{NcChip-DKRlV47q.mjs → NcChip.mjs} +9 -9
  142. package/dist/chunks/NcChip.mjs.map +1 -0
  143. package/dist/chunks/{NcCollectionList-B9qCtjJw.mjs → NcCollectionList.mjs} +12 -12
  144. package/dist/chunks/NcCollectionList.mjs.map +1 -0
  145. package/dist/chunks/{NcColorPicker-BCkasLwT.mjs → NcColorPicker.mjs} +12 -12
  146. package/dist/chunks/NcColorPicker.mjs.map +1 -0
  147. package/dist/chunks/{NcContent-BYh5hWDN.mjs → NcContent.mjs} +9 -9
  148. package/dist/chunks/NcContent.mjs.map +1 -0
  149. package/dist/chunks/{NcCounterBubble-CV0YMrXW.mjs → NcCounterBubble.mjs} +3 -3
  150. package/dist/chunks/NcCounterBubble.mjs.map +1 -0
  151. package/dist/chunks/{NcDashboardWidget-zmbDEGL-.mjs → NcDashboardWidget.mjs} +8 -8
  152. package/dist/chunks/NcDashboardWidget.mjs.map +1 -0
  153. package/dist/chunks/{NcDashboardWidgetItem-DwDndrm_.mjs → NcDashboardWidgetItem.mjs} +6 -6
  154. package/dist/chunks/NcDashboardWidgetItem.mjs.map +1 -0
  155. package/dist/chunks/{NcDateTime.vue_vue_type_script_setup_true_lang-BJuPH7S7.mjs → NcDateTime.vue_vue_type_script_setup_true_lang.mjs} +1 -1
  156. package/dist/chunks/NcDateTime.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
  157. package/dist/chunks/NcDateTimePicker.mjs +2979 -0
  158. package/dist/chunks/NcDateTimePicker.mjs.map +1 -0
  159. package/dist/chunks/{NcDateTimePickerNative-B8CMOUnH.mjs → NcDateTimePickerNative.mjs} +21 -26
  160. package/dist/chunks/NcDateTimePickerNative.mjs.map +1 -0
  161. package/dist/chunks/{NcDialog-D617YI0t.mjs → NcDialog.mjs} +6 -6
  162. package/dist/chunks/NcDialog.mjs.map +1 -0
  163. package/dist/chunks/{NcDialogButton.vue_vue_type_script_setup_true_lang-Bqfy678u.mjs → NcDialogButton.vue_vue_type_script_setup_true_lang.mjs} +6 -6
  164. package/dist/chunks/NcDialogButton.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
  165. package/dist/chunks/{NcEllipsisedOption-D6Amb91K.mjs → NcEllipsisedOption.mjs} +5 -5
  166. package/dist/chunks/NcEllipsisedOption.mjs.map +1 -0
  167. package/dist/chunks/{NcEmojiPicker-UTxgju3f.mjs → NcEmojiPicker.mjs} +12 -12
  168. package/dist/chunks/NcEmojiPicker.mjs.map +1 -0
  169. package/dist/chunks/{NcEmptyContent-CGAPqk4S.mjs → NcEmptyContent.mjs} +4 -4
  170. package/dist/chunks/NcEmptyContent.mjs.map +1 -0
  171. package/dist/chunks/{NcFilePicker-bD2toutn.mjs → NcFilePicker.mjs} +9 -9
  172. package/dist/chunks/NcFilePicker.mjs.map +1 -0
  173. package/dist/chunks/{NcFormBox-Bmqar8nn.mjs → NcFormBox.mjs} +9 -9
  174. package/dist/chunks/NcFormBox.mjs.map +1 -0
  175. package/dist/chunks/{NcFormBoxButton-G_PkUiQy.mjs → NcFormBoxButton.mjs} +8 -8
  176. package/dist/chunks/NcFormBoxButton.mjs.map +1 -0
  177. package/dist/chunks/{NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang-BA_gWnmz.mjs → NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang.mjs} +4 -4
  178. package/dist/chunks/NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
  179. package/dist/chunks/{NcFormBoxItem-Cm8aZaVJ.mjs → NcFormBoxItem.mjs} +14 -14
  180. package/dist/chunks/NcFormBoxItem.mjs.map +1 -0
  181. package/dist/chunks/{NcFormBoxSwitch-DSXiQcnq.mjs → NcFormBoxSwitch.mjs} +8 -8
  182. package/dist/chunks/NcFormBoxSwitch.mjs.map +1 -0
  183. package/dist/chunks/{NcFormGroup-N7qIFAwN.mjs → NcFormGroup.mjs} +11 -11
  184. package/dist/chunks/NcFormGroup.mjs.map +1 -0
  185. package/dist/chunks/{NcGuestContent-CvT6VGt1.mjs → NcGuestContent.mjs} +3 -3
  186. package/dist/chunks/NcGuestContent.mjs.map +1 -0
  187. package/dist/chunks/{NcHeaderButton-BnLwYCog.mjs → NcHeaderButton.mjs} +5 -5
  188. package/dist/chunks/NcHeaderButton.mjs.map +1 -0
  189. package/dist/chunks/{NcHeaderMenu-ktQJV2SW.mjs → NcHeaderMenu.mjs} +14 -20
  190. package/dist/chunks/NcHeaderMenu.mjs.map +1 -0
  191. package/dist/chunks/{NcHighlight.vue_vue_type_script_lang-DnWQDM_2.mjs → NcHighlight.vue_vue_type_script_lang.mjs} +1 -1
  192. package/dist/chunks/NcHighlight.vue_vue_type_script_lang.mjs.map +1 -0
  193. package/dist/chunks/{NcHotkey-BDGeF3eH.mjs → NcHotkey.mjs} +8 -8
  194. package/dist/chunks/NcHotkey.mjs.map +1 -0
  195. package/dist/chunks/{NcHotkeyList-B4WjTLAp.mjs → NcHotkeyList.mjs} +8 -8
  196. package/dist/chunks/NcHotkeyList.mjs.map +1 -0
  197. package/dist/chunks/{NcIconSvgWrapper-g8ubWhoz.mjs → NcIconSvgWrapper.mjs} +3 -3
  198. package/dist/chunks/NcIconSvgWrapper.mjs.map +1 -0
  199. package/dist/chunks/{NcIconToggleSwitch-CRvGt4su.mjs → NcIconToggleSwitch.mjs} +6 -6
  200. package/dist/chunks/NcIconToggleSwitch.mjs.map +1 -0
  201. package/dist/chunks/{NcInputConfirmCancel-CGTllrXj.mjs → NcInputConfirmCancel.mjs} +9 -9
  202. package/dist/chunks/NcInputConfirmCancel.mjs.map +1 -0
  203. package/dist/chunks/{NcInputField-5Sg6EUP6.mjs → NcInputField.mjs} +9 -9
  204. package/dist/chunks/NcInputField.mjs.map +1 -0
  205. package/dist/chunks/{NcKbd-Bh_Tk6Ar.mjs → NcKbd.mjs} +8 -8
  206. package/dist/chunks/NcKbd.mjs.map +1 -0
  207. package/dist/chunks/{NcListItem-BliLJpvU.mjs → NcListItem.mjs} +7 -7
  208. package/dist/chunks/NcListItem.mjs.map +1 -0
  209. package/dist/chunks/{NcListItemIcon-Dl_tfkk9.mjs → NcListItemIcon.mjs} +7 -7
  210. package/dist/chunks/NcListItemIcon.mjs.map +1 -0
  211. package/dist/chunks/{NcLoadingIcon-BOVpFVQz.mjs → NcLoadingIcon.mjs} +3 -3
  212. package/dist/chunks/NcLoadingIcon.mjs.map +1 -0
  213. package/dist/chunks/{NcMentionBubble.vue_vue_type_style_index_0_scoped_3c4a673d_lang-DyqakLm5.mjs → NcMentionBubble.vue_vue_type_style_index_0_scoped_3c4a673d_lang.mjs} +2 -2
  214. package/dist/chunks/NcMentionBubble.vue_vue_type_style_index_0_scoped_3c4a673d_lang.mjs.map +1 -0
  215. package/dist/chunks/{NcModal-DiDvgcU8.mjs → NcModal.mjs} +12 -12
  216. package/dist/chunks/NcModal.mjs.map +1 -0
  217. package/dist/chunks/{NcNoteCard-mI7qVZ9j.mjs → NcNoteCard.mjs} +6 -6
  218. package/dist/chunks/NcNoteCard.mjs.map +1 -0
  219. package/dist/chunks/{NcPasswordField-BFyzHTOO.mjs → NcPasswordField.mjs} +9 -9
  220. package/dist/chunks/NcPasswordField.mjs.map +1 -0
  221. package/dist/chunks/{NcPopover-B87bEPLq.mjs → NcPopover.mjs} +9 -10
  222. package/dist/chunks/NcPopover.mjs.map +1 -0
  223. package/dist/chunks/NcProfileHoverCard.mjs +777 -0
  224. package/dist/chunks/NcProfileHoverCard.mjs.map +1 -0
  225. package/dist/chunks/{NcProgressBar-C-ane-Ni.mjs → NcProgressBar.mjs} +20 -10
  226. package/dist/chunks/NcProgressBar.mjs.map +1 -0
  227. package/dist/chunks/{NcRadioGroup-B4qmS2UD.mjs → NcRadioGroup.mjs} +8 -8
  228. package/dist/chunks/NcRadioGroup.mjs.map +1 -0
  229. package/dist/chunks/{NcRadioGroupButton-CZykGwv3.mjs → NcRadioGroupButton.mjs} +12 -12
  230. package/dist/chunks/NcRadioGroupButton.mjs.map +1 -0
  231. package/dist/chunks/NcReferenceWidget.mjs +292 -0
  232. package/dist/chunks/NcReferenceWidget.mjs.map +1 -0
  233. package/dist/chunks/{NcRelatedResourcesPanel-D_Ttpg5_.mjs → NcRelatedResourcesPanel.mjs} +13 -13
  234. package/dist/chunks/NcRelatedResourcesPanel.mjs.map +1 -0
  235. package/dist/chunks/{NcRichContenteditable-Qw614bJ5.mjs → NcRichContenteditable.mjs} +37 -35
  236. package/dist/chunks/NcRichContenteditable.mjs.map +1 -0
  237. package/dist/chunks/{NcRichText-BO_4KtBA.mjs → NcRichText.mjs} +12 -12
  238. package/dist/chunks/NcRichText.mjs.map +1 -0
  239. package/dist/chunks/{NcSavingIndicatorIcon.vue_vue_type_script_setup_true_lang-DbQnMYZm.mjs → NcSavingIndicatorIcon.vue_vue_type_script_setup_true_lang.mjs} +1 -1
  240. package/dist/chunks/NcSavingIndicatorIcon.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
  241. package/dist/chunks/{NcSelect--kERLlBK.mjs → NcSelect.mjs} +124 -29
  242. package/dist/chunks/NcSelect.mjs.map +1 -0
  243. package/dist/chunks/{NcSelectTags-I2hJaNax.mjs → NcSelectTags.mjs} +6 -6
  244. package/dist/chunks/NcSelectTags.mjs.map +1 -0
  245. package/dist/chunks/{NcSelectUsers-K14Bepkq.mjs → NcSelectUsers.mjs} +6 -6
  246. package/dist/chunks/NcSelectUsers.mjs.map +1 -0
  247. package/dist/chunks/{NcSettingsSection-Caz1fuWt.mjs → NcSettingsSection.mjs} +5 -5
  248. package/dist/chunks/NcSettingsSection.mjs.map +1 -0
  249. package/dist/chunks/{NcSettingsSelectGroup-SYJ8-XlR.mjs → NcSettingsSelectGroup.mjs} +7 -7
  250. package/dist/chunks/NcSettingsSelectGroup.mjs.map +1 -0
  251. package/dist/chunks/{NcTextArea-Dxzj4zdb.mjs → NcTextArea.mjs} +8 -8
  252. package/dist/chunks/NcTextArea.mjs.map +1 -0
  253. package/dist/chunks/{NcTextField.vue_vue_type_script_setup_true_lang-Bx2esFU2.mjs → NcTextField.vue_vue_type_script_setup_true_lang.mjs} +7 -7
  254. package/dist/chunks/NcTextField.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
  255. package/dist/chunks/{NcThemeProvider.vue_vue_type_script_setup_true_lang-wie70gn4.mjs → NcThemeProvider.vue_vue_type_script_setup_true_lang.mjs} +2 -2
  256. package/dist/chunks/NcThemeProvider.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
  257. package/dist/chunks/{NcTimezonePicker.vue_vue_type_script_setup_true_lang-D7ZHgnwW.mjs → NcTimezonePicker.vue_vue_type_script_setup_true_lang.mjs} +5 -5
  258. package/dist/chunks/NcTimezonePicker.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
  259. package/dist/chunks/{NcUserBubble-BXR7vT0V.mjs → NcUserBubble.mjs} +5 -5
  260. package/dist/chunks/NcUserBubble.mjs.map +1 -0
  261. package/dist/chunks/{NcUserStatusIcon-BF5OEQFU.mjs → NcUserStatusIcon.mjs} +7 -7
  262. package/dist/chunks/NcUserStatusIcon.mjs.map +1 -0
  263. package/dist/chunks/{NcVNodes.vue_vue_type_script_lang-BqUHinRZ.mjs → NcVNodes.vue_vue_type_script_lang.mjs} +1 -1
  264. package/dist/chunks/NcVNodes.vue_vue_type_script_lang.mjs.map +1 -0
  265. package/dist/chunks/{_l10n-wdIzZwir.mjs → _l10n.mjs} +106 -104
  266. package/dist/chunks/_l10n.mjs.map +1 -0
  267. package/dist/chunks/{_plugin-vue_export-helper-1tPrXgE0.mjs → _plugin-vue_export-helper.mjs} +1 -1
  268. package/dist/chunks/_plugin-vue_export-helper.mjs.map +1 -0
  269. package/dist/chunks/{actionGlobal-BZFdtdJL.mjs → actionGlobal.mjs} +1 -1
  270. package/dist/chunks/actionGlobal.mjs.map +1 -0
  271. package/dist/chunks/{actionText-BXR0sWNu.mjs → actionText.mjs} +3 -3
  272. package/dist/chunks/actionText.mjs.map +1 -0
  273. package/dist/chunks/{appName-DyNMVZpX.mjs → appName.mjs} +2 -2
  274. package/dist/chunks/appName.mjs.map +1 -0
  275. package/dist/chunks/{autolink-DrIurosL.mjs → autolink.mjs} +7 -7
  276. package/dist/chunks/autolink.mjs.map +1 -0
  277. package/dist/chunks/{colors-Cv9F-jWS.mjs → colors.mjs} +3 -3
  278. package/dist/chunks/colors.mjs.map +1 -0
  279. package/dist/chunks/{constants-wIEKSp2G.mjs → constants.mjs} +1 -1
  280. package/dist/chunks/constants.mjs.map +1 -0
  281. package/dist/chunks/{constants-Ciwvl5xb.mjs → constants2.mjs} +1 -1
  282. package/dist/chunks/constants2.mjs.map +1 -0
  283. package/dist/chunks/{createElementId-DhjFt1I9.mjs → createElementId.mjs} +1 -1
  284. package/dist/chunks/createElementId.mjs.map +1 -0
  285. package/dist/chunks/customPickerElements.mjs +61 -0
  286. package/dist/chunks/customPickerElements.mjs.map +1 -0
  287. package/dist/chunks/{emoji-C8k9NUlo.mjs → emoji.mjs} +1 -1
  288. package/dist/chunks/emoji.mjs.map +1 -0
  289. package/dist/chunks/{focusTrap-HJQ4pqHV.mjs → focusTrap.mjs} +1 -1
  290. package/dist/chunks/focusTrap.mjs.map +1 -0
  291. package/dist/chunks/highlight.mjs +5 -0
  292. package/dist/chunks/highlight.mjs.map +1 -0
  293. package/dist/chunks/{legacy-BoqDmOCa.mjs → legacy.mjs} +4 -2
  294. package/dist/chunks/legacy.mjs.map +1 -0
  295. package/dist/chunks/{logger-D3RVzcfQ.mjs → logger.mjs} +1 -1
  296. package/dist/chunks/logger.mjs.map +1 -0
  297. package/dist/chunks/{mdi-CpchYUUV.mjs → mdi.mjs} +12 -14
  298. package/dist/chunks/mdi.mjs.map +1 -0
  299. package/dist/chunks/{platform-CC2ecGvV.mjs → platform.mjs} +1 -1
  300. package/dist/chunks/platform.mjs.map +1 -0
  301. package/dist/chunks/{referencePickerModal-CnKdEDwu.mjs → referencePickerModal.mjs} +60 -342
  302. package/dist/chunks/referencePickerModal.mjs.map +1 -0
  303. package/dist/chunks/{rtl-v0UOPAM7.mjs → rtl.mjs} +1 -1
  304. package/dist/chunks/rtl.mjs.map +1 -0
  305. package/dist/chunks/{useAppSettingsDialog-C73Wx6iQ.mjs → useAppSettingsDialog.mjs} +1 -1
  306. package/dist/chunks/useAppSettingsDialog.mjs.map +1 -0
  307. package/dist/chunks/{useCopy-6F-qWHq0.mjs → useCopy.mjs} +4 -4
  308. package/dist/chunks/useCopy.mjs.map +1 -0
  309. package/dist/chunks/{useNcActions-BzPO2c4h.mjs → useNcActions.mjs} +1 -1
  310. package/dist/chunks/useNcActions.mjs.map +1 -0
  311. package/dist/chunks/{useNcFormBox-Djlh582y.mjs → useNcFormBox.mjs} +1 -1
  312. package/dist/chunks/useNcFormBox.mjs.map +1 -0
  313. package/dist/chunks/{useNcRadioGroup-D6llQmAl.mjs → useNcRadioGroup.mjs} +1 -1
  314. package/dist/chunks/useNcRadioGroup.mjs.map +1 -0
  315. package/dist/chunks/{useTrapStackControl-B6cEicto.mjs → useTrapStackControl.mjs} +2 -2
  316. package/dist/chunks/useTrapStackControl.mjs.map +1 -0
  317. package/dist/chunks/widgets.mjs +66 -0
  318. package/dist/chunks/widgets.mjs.map +1 -0
  319. package/dist/components/NcActionButton/index.mjs +1 -1
  320. package/dist/components/NcActionButtonGroup/index.mjs +1 -1
  321. package/dist/components/NcActionCaption/index.mjs +1 -1
  322. package/dist/components/NcActionCheckbox/index.mjs +1 -1
  323. package/dist/components/NcActionInput/NcActionInput.vue.d.ts +302 -103
  324. package/dist/components/NcActionInput/index.mjs +1 -1
  325. package/dist/components/NcActionLink/index.mjs +1 -1
  326. package/dist/components/NcActionRadio/index.mjs +1 -1
  327. package/dist/components/NcActionRouter/index.mjs +1 -1
  328. package/dist/components/NcActionSeparator/index.mjs +1 -1
  329. package/dist/components/NcActionText/index.mjs +1 -1
  330. package/dist/components/NcActionTextEditable/index.mjs +1 -1
  331. package/dist/components/NcActions/NcActions.vue.d.ts +3 -3
  332. package/dist/components/NcActions/index.mjs +1 -1
  333. package/dist/components/NcAppContent/index.mjs +1 -1
  334. package/dist/components/NcAppContentDetails/index.mjs +1 -1
  335. package/dist/components/NcAppContentList/index.mjs +1 -1
  336. package/dist/components/NcAppNavigation/index.mjs +1 -1
  337. package/dist/components/NcAppNavigationCaption/NcAppNavigationCaption.vue.d.ts +3 -3
  338. package/dist/components/NcAppNavigationCaption/index.mjs +1 -1
  339. package/dist/components/NcAppNavigationIconBullet/index.mjs +1 -1
  340. package/dist/components/NcAppNavigationItem/NcAppNavigationItem.vue.d.ts +10 -6
  341. package/dist/components/NcAppNavigationItem/NcInputConfirmCancel.vue.d.ts +1 -1
  342. package/dist/components/NcAppNavigationItem/index.mjs +1 -1
  343. package/dist/components/NcAppNavigationList/NcAppNavigationList.vue.d.ts +57 -1
  344. package/dist/components/NcAppNavigationList/highlight.d.ts +12 -0
  345. package/dist/components/NcAppNavigationList/index.mjs +1 -1
  346. package/dist/components/NcAppNavigationNew/index.mjs +1 -1
  347. package/dist/components/NcAppNavigationNewItem/NcAppNavigationNewItem.vue.d.ts +1 -1
  348. package/dist/components/NcAppNavigationNewItem/index.mjs +1 -1
  349. package/dist/components/NcAppNavigationSearch/NcAppNavigationSearch.vue.d.ts +16 -16
  350. package/dist/components/NcAppNavigationSearch/index.mjs +1 -1
  351. package/dist/components/NcAppNavigationSettings/index.mjs +1 -1
  352. package/dist/components/NcAppNavigationSpacer/index.mjs +1 -1
  353. package/dist/components/NcAppSettingsDialog/index.mjs +1 -1
  354. package/dist/components/NcAppSettingsSection/index.mjs +1 -1
  355. package/dist/components/NcAppSettingsSectionShortcuts/index.mjs +1 -1
  356. package/dist/components/NcAppSettingsShortcutsSection/index.mjs +1 -1
  357. package/dist/components/NcAppSidebar/NcAppSidebar.vue.d.ts +23 -4
  358. package/dist/components/NcAppSidebar/NcAppSidebarTabs.vue.d.ts +43 -0
  359. package/dist/components/NcAppSidebar/NcAppSidebarTabsButton.vue.d.ts +5 -0
  360. package/dist/components/NcAppSidebar/index.mjs +1 -1
  361. package/dist/components/NcAppSidebarHeader/index.mjs +1 -1
  362. package/dist/components/NcAppSidebarTab/NcAppSidebarTab.vue.d.ts +14 -4
  363. package/dist/components/NcAppSidebarTab/index.mjs +1 -1
  364. package/dist/components/NcAssistantButton/index.mjs +1 -1
  365. package/dist/components/NcAssistantContent/index.mjs +1 -1
  366. package/dist/components/NcAssistantIcon/index.mjs +1 -1
  367. package/dist/components/NcAvatar/NcAvatar.vue.d.ts +53 -138
  368. package/dist/components/NcAvatar/index.mjs +1 -1
  369. package/dist/components/NcBlurHash/index.mjs +1 -1
  370. package/dist/components/NcBreadcrumb/NcBreadcrumb.vue.d.ts +4 -4
  371. package/dist/components/NcBreadcrumb/index.mjs +1 -1
  372. package/dist/components/NcBreadcrumbs/NcBreadcrumbs.vue.d.ts +7 -7
  373. package/dist/components/NcBreadcrumbs/index.mjs +1 -1
  374. package/dist/components/NcButton/index.mjs +1 -1
  375. package/dist/components/NcCheckboxRadioSwitch/index.mjs +1 -1
  376. package/dist/components/NcChip/index.mjs +1 -1
  377. package/dist/components/NcCollectionList/NcCollectionList.vue.d.ts +272 -280
  378. package/dist/components/NcCollectionList/NcCollectionListItem.vue.d.ts +38 -140
  379. package/dist/components/NcCollectionList/index.mjs +1 -1
  380. package/dist/components/NcColorPicker/index.mjs +1 -1
  381. package/dist/components/NcContent/index.mjs +1 -1
  382. package/dist/components/NcCounterBubble/index.mjs +1 -1
  383. package/dist/components/NcDashboardWidget/NcDashboardWidget.vue.d.ts +73 -277
  384. package/dist/components/NcDashboardWidget/index.mjs +1 -1
  385. package/dist/components/NcDashboardWidgetItem/NcDashboardWidgetItem.vue.d.ts +38 -140
  386. package/dist/components/NcDashboardWidgetItem/index.mjs +1 -1
  387. package/dist/components/NcDateTime/index.mjs +1 -1
  388. package/dist/components/NcDateTimePicker/NcDateTimePicker.vue.d.ts +82 -80
  389. package/dist/components/NcDateTimePicker/dateFnsLocaleLoader.d.ts +3 -0
  390. package/dist/components/NcDateTimePicker/format.d.ts +35 -0
  391. package/dist/components/NcDateTimePicker/index.mjs +1 -1
  392. package/dist/components/NcDateTimePicker/useDateFnsLocale.d.ts +16 -0
  393. package/dist/components/NcDateTimePickerNative/index.mjs +1 -1
  394. package/dist/components/NcDialog/index.mjs +1 -1
  395. package/dist/components/NcDialogButton/index.mjs +1 -1
  396. package/dist/components/NcEllipsisedOption/index.mjs +1 -1
  397. package/dist/components/NcEmojiPicker/NcEmojiPicker.vue.d.ts +14 -11
  398. package/dist/components/NcEmojiPicker/index.mjs +1 -1
  399. package/dist/components/NcEmptyContent/index.mjs +1 -1
  400. package/dist/components/NcFilePicker/index.mjs +1 -1
  401. package/dist/components/NcFormBox/index.mjs +1 -1
  402. package/dist/components/NcFormBoxButton/index.mjs +1 -1
  403. package/dist/components/NcFormBoxCopyButton/index.mjs +1 -1
  404. package/dist/components/NcFormBoxSwitch/index.mjs +1 -1
  405. package/dist/components/NcFormGroup/index.mjs +1 -1
  406. package/dist/components/NcGuestContent/index.mjs +1 -1
  407. package/dist/components/NcHeaderButton/index.mjs +1 -1
  408. package/dist/components/NcHeaderMenu/index.mjs +1 -1
  409. package/dist/components/NcHighlight/index.mjs +1 -1
  410. package/dist/components/NcHotkey/index.mjs +1 -1
  411. package/dist/components/NcHotkeyList/index.mjs +1 -1
  412. package/dist/components/NcIconSvgWrapper/index.mjs +1 -1
  413. package/dist/components/NcInputField/NcInputField.vue.d.ts +8 -5
  414. package/dist/components/NcInputField/index.mjs +1 -1
  415. package/dist/components/NcKbd/index.mjs +1 -1
  416. package/dist/components/NcListItem/NcListItem.vue.d.ts +3 -3
  417. package/dist/components/NcListItem/index.mjs +1 -1
  418. package/dist/components/NcListItemIcon/NcListItemIcon.vue.d.ts +36 -138
  419. package/dist/components/NcListItemIcon/index.mjs +1 -1
  420. package/dist/components/NcLoadingIcon/index.mjs +1 -1
  421. package/dist/components/NcModal/index.mjs +1 -1
  422. package/dist/components/NcNoteCard/index.mjs +1 -1
  423. package/dist/components/NcPasswordField/NcPasswordField.vue.d.ts +16 -16
  424. package/dist/components/NcPasswordField/index.mjs +1 -1
  425. package/dist/components/NcPopover/index.mjs +1 -1
  426. package/dist/components/NcProfileHoverCard/NcProfileHoverCard.vue.d.ts +80 -0
  427. package/dist/components/NcProfileHoverCard/index.d.ts +5 -0
  428. package/dist/components/NcProfileHoverCard/index.mjs +5 -0
  429. package/dist/components/NcProfileHoverCard/index.mjs.map +1 -0
  430. package/dist/components/NcProfileHoverCard/profileCache.d.ts +31 -0
  431. package/dist/components/NcProgressBar/NcProgressBar.vue.d.ts +27 -0
  432. package/dist/components/NcProgressBar/index.mjs +1 -1
  433. package/dist/components/NcRadioGroup/index.mjs +1 -1
  434. package/dist/components/NcRadioGroupButton/index.mjs +1 -1
  435. package/dist/components/NcRelatedResourcesPanel/NcRelatedResourcesPanel.vue.d.ts +1 -1
  436. package/dist/components/NcRelatedResourcesPanel/index.mjs +1 -1
  437. package/dist/components/NcRichContenteditable/NcRichContenteditable.vue.d.ts +1 -1
  438. package/dist/components/NcRichContenteditable/index.mjs +1 -1
  439. package/dist/components/NcRichText/NcReferencePicker/NcProviderList.vue.d.ts +199 -3
  440. package/dist/components/NcRichText/NcReferencePicker/NcRawLinkInput.vue.d.ts +14 -11
  441. package/dist/components/NcRichText/NcReferencePicker/NcReferencePicker.vue.d.ts +412 -17
  442. package/dist/components/NcRichText/NcReferencePicker/NcReferencePickerModal.vue.d.ts +412 -17
  443. package/dist/components/NcRichText/NcReferencePicker/NcSearch.vue.d.ts +199 -3
  444. package/dist/components/NcRichText/index.mjs +14 -12
  445. package/dist/components/NcRichText/index.mjs.map +1 -1
  446. package/dist/components/NcSavingIndicatorIcon/index.mjs +1 -1
  447. package/dist/components/NcSelect/NcSelect.vue.d.ts +208 -3
  448. package/dist/components/NcSelect/index.mjs +1 -1
  449. package/dist/components/NcSelectTags/NcSelectTags.vue.d.ts +201 -5
  450. package/dist/components/NcSelectTags/index.mjs +1 -1
  451. package/dist/components/NcSelectUsers/index.mjs +1 -1
  452. package/dist/components/NcSettingsSection/index.mjs +1 -1
  453. package/dist/components/NcSettingsSelectGroup/NcSettingsSelectGroup.vue.d.ts +199 -3
  454. package/dist/components/NcSettingsSelectGroup/index.mjs +1 -1
  455. package/dist/components/NcTextArea/index.mjs +1 -1
  456. package/dist/components/NcTextField/NcTextField.vue.d.ts +23 -17
  457. package/dist/components/NcTextField/index.mjs +1 -1
  458. package/dist/components/NcThemeProvider/index.mjs +1 -1
  459. package/dist/components/NcTimezonePicker/index.mjs +1 -1
  460. package/dist/components/NcUserBubble/index.mjs +1 -1
  461. package/dist/components/NcUserStatusIcon/index.mjs +1 -1
  462. package/dist/components/NcVNodes/index.mjs +1 -1
  463. package/dist/components/index.d.ts +1 -0
  464. package/dist/composables/useFormatDateTime/index.mjs +11 -5
  465. package/dist/composables/useFormatDateTime/index.mjs.map +1 -1
  466. package/dist/composables/useHotKey/index.mjs +1 -1
  467. package/dist/composables/useIsDarkTheme/index.mjs +1 -1
  468. package/dist/functions/contactsMenu/index.mjs +1 -1
  469. package/dist/functions/emoji/index.mjs +1 -1
  470. package/dist/functions/reference/index.mjs +13 -12
  471. package/dist/functions/reference/index.mjs.map +1 -1
  472. package/dist/functions/registerReference/index.mjs +10 -9
  473. package/dist/functions/registerReference/index.mjs.map +1 -1
  474. package/dist/functions/usernameToColor/index.mjs +1 -1
  475. package/dist/index.mjs +120 -116
  476. package/dist/index.mjs.map +1 -1
  477. package/dist/utils/legacy.d.ts +2 -0
  478. package/package.json +20 -19
  479. package/dist/assets/NcAppNavigationList--36j6Acm.css +0 -28
  480. package/dist/assets/NcDateTimePickerNative-BP6eg8aU.css +0 -60
  481. package/dist/assets/NcPopover-CAoHhjKa.css +0 -123
  482. package/dist/assets/NcSelect-CvDEQAjD.css +0 -245
  483. package/dist/assets/NcSelectUsers-YF5729PJ.css +0 -4
  484. package/dist/chunks/ArrowRight-B1ncAhus.mjs.map +0 -1
  485. package/dist/chunks/ChevronDown-C6gc637b.mjs.map +0 -1
  486. package/dist/chunks/ChevronUp-ChH8oB7p.mjs.map +0 -1
  487. package/dist/chunks/Close-CuhcJnX2.mjs.map +0 -1
  488. package/dist/chunks/NcActionButton-BO5T5ePT.mjs.map +0 -1
  489. package/dist/chunks/NcActionButtonGroup-Dd03Oluy.mjs.map +0 -1
  490. package/dist/chunks/NcActionCaption-f7L9gBlT.mjs.map +0 -1
  491. package/dist/chunks/NcActionCheckbox-DBqiK-AZ.mjs.map +0 -1
  492. package/dist/chunks/NcActionInput-Dr8Yrafu.mjs.map +0 -1
  493. package/dist/chunks/NcActionLink-BFiaYt9A.mjs.map +0 -1
  494. package/dist/chunks/NcActionRadio-BA08CAtA.mjs.map +0 -1
  495. package/dist/chunks/NcActionRouter-vYFtIOzD.mjs.map +0 -1
  496. package/dist/chunks/NcActionSeparator-B9pNQaji.mjs.map +0 -1
  497. package/dist/chunks/NcActionText-CQ9qwJ0p.mjs.map +0 -1
  498. package/dist/chunks/NcActionTextEditable-B8y_GEre.mjs.map +0 -1
  499. package/dist/chunks/NcActions-C-wDqSrv.mjs.map +0 -1
  500. package/dist/chunks/NcAppContent-DavgjaFX.mjs.map +0 -1
  501. package/dist/chunks/NcAppContentDetails.vue_vue_type_script_setup_true_lang-BWl5Pw5g.mjs.map +0 -1
  502. package/dist/chunks/NcAppContentList-Copx3Ver.mjs.map +0 -1
  503. package/dist/chunks/NcAppNavigation-g57j16pB.mjs.map +0 -1
  504. package/dist/chunks/NcAppNavigationCaption-VjSWJ8R4.mjs.map +0 -1
  505. package/dist/chunks/NcAppNavigationIconBullet-BmU-dPcY.mjs.map +0 -1
  506. package/dist/chunks/NcAppNavigationItem-CDeYtA3E.mjs.map +0 -1
  507. package/dist/chunks/NcAppNavigationList-CGSWabRB.mjs +0 -17
  508. package/dist/chunks/NcAppNavigationList-CGSWabRB.mjs.map +0 -1
  509. package/dist/chunks/NcAppNavigationNew-CBNppM7Q.mjs.map +0 -1
  510. package/dist/chunks/NcAppNavigationNewItem-B1RfQkvu.mjs.map +0 -1
  511. package/dist/chunks/NcAppNavigationSearch-CQQWb1Eq.mjs.map +0 -1
  512. package/dist/chunks/NcAppNavigationSettings-DoMjRExO.mjs.map +0 -1
  513. package/dist/chunks/NcAppNavigationSpacer-CIRC4ZEj.mjs.map +0 -1
  514. package/dist/chunks/NcAppSettingsDialog-BPcEYLjP.mjs.map +0 -1
  515. package/dist/chunks/NcAppSettingsSection-BosSmisT.mjs.map +0 -1
  516. package/dist/chunks/NcAppSettingsShortcutsSection-DLwubKV9.mjs.map +0 -1
  517. package/dist/chunks/NcAppSidebar-C8YzAzrZ.mjs.map +0 -1
  518. package/dist/chunks/NcAppSidebarHeader.vue_vue_type_script_setup_true_lang-C-QhdyiN.mjs.map +0 -1
  519. package/dist/chunks/NcAppSidebarTab-DOSDDbGA.mjs.map +0 -1
  520. package/dist/chunks/NcAssistantButton-iK491d2v.mjs.map +0 -1
  521. package/dist/chunks/NcAssistantContent-iHA4O4cC.mjs.map +0 -1
  522. package/dist/chunks/NcAssistantIcon-C6s4Qm7-.mjs.map +0 -1
  523. package/dist/chunks/NcAvatar-1KxMUN7V.mjs.map +0 -1
  524. package/dist/chunks/NcBlurHash-B30Ol8KP.mjs.map +0 -1
  525. package/dist/chunks/NcBreadcrumb-3Y5NWXnV.mjs.map +0 -1
  526. package/dist/chunks/NcBreadcrumbs-BaTp3Sya.mjs.map +0 -1
  527. package/dist/chunks/NcButton-jvoYS2my.mjs.map +0 -1
  528. package/dist/chunks/NcCheckboxRadioSwitch-DVdt5Hkq.mjs.map +0 -1
  529. package/dist/chunks/NcChip-DKRlV47q.mjs.map +0 -1
  530. package/dist/chunks/NcCollectionList-B9qCtjJw.mjs.map +0 -1
  531. package/dist/chunks/NcColorPicker-BCkasLwT.mjs.map +0 -1
  532. package/dist/chunks/NcContent-BYh5hWDN.mjs.map +0 -1
  533. package/dist/chunks/NcCounterBubble-CV0YMrXW.mjs.map +0 -1
  534. package/dist/chunks/NcDashboardWidget-zmbDEGL-.mjs.map +0 -1
  535. package/dist/chunks/NcDashboardWidgetItem-DwDndrm_.mjs.map +0 -1
  536. package/dist/chunks/NcDateTime.vue_vue_type_script_setup_true_lang-BJuPH7S7.mjs.map +0 -1
  537. package/dist/chunks/NcDateTimePicker-qaFC_wUt.mjs +0 -415
  538. package/dist/chunks/NcDateTimePicker-qaFC_wUt.mjs.map +0 -1
  539. package/dist/chunks/NcDateTimePickerNative-B8CMOUnH.mjs.map +0 -1
  540. package/dist/chunks/NcDialog-D617YI0t.mjs.map +0 -1
  541. package/dist/chunks/NcDialogButton.vue_vue_type_script_setup_true_lang-Bqfy678u.mjs.map +0 -1
  542. package/dist/chunks/NcEllipsisedOption-D6Amb91K.mjs.map +0 -1
  543. package/dist/chunks/NcEmojiPicker-UTxgju3f.mjs.map +0 -1
  544. package/dist/chunks/NcEmptyContent-CGAPqk4S.mjs.map +0 -1
  545. package/dist/chunks/NcFilePicker-bD2toutn.mjs.map +0 -1
  546. package/dist/chunks/NcFormBox-Bmqar8nn.mjs.map +0 -1
  547. package/dist/chunks/NcFormBoxButton-G_PkUiQy.mjs.map +0 -1
  548. package/dist/chunks/NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang-BA_gWnmz.mjs.map +0 -1
  549. package/dist/chunks/NcFormBoxItem-Cm8aZaVJ.mjs.map +0 -1
  550. package/dist/chunks/NcFormBoxSwitch-DSXiQcnq.mjs.map +0 -1
  551. package/dist/chunks/NcFormGroup-N7qIFAwN.mjs.map +0 -1
  552. package/dist/chunks/NcGuestContent-CvT6VGt1.mjs.map +0 -1
  553. package/dist/chunks/NcHeaderButton-BnLwYCog.mjs.map +0 -1
  554. package/dist/chunks/NcHeaderMenu-ktQJV2SW.mjs.map +0 -1
  555. package/dist/chunks/NcHighlight.vue_vue_type_script_lang-DnWQDM_2.mjs.map +0 -1
  556. package/dist/chunks/NcHotkey-BDGeF3eH.mjs.map +0 -1
  557. package/dist/chunks/NcHotkeyList-B4WjTLAp.mjs.map +0 -1
  558. package/dist/chunks/NcIconSvgWrapper-g8ubWhoz.mjs.map +0 -1
  559. package/dist/chunks/NcIconToggleSwitch-CRvGt4su.mjs.map +0 -1
  560. package/dist/chunks/NcInputConfirmCancel-CGTllrXj.mjs.map +0 -1
  561. package/dist/chunks/NcInputField-5Sg6EUP6.mjs.map +0 -1
  562. package/dist/chunks/NcKbd-Bh_Tk6Ar.mjs.map +0 -1
  563. package/dist/chunks/NcListItem-BliLJpvU.mjs.map +0 -1
  564. package/dist/chunks/NcListItemIcon-Dl_tfkk9.mjs.map +0 -1
  565. package/dist/chunks/NcLoadingIcon-BOVpFVQz.mjs.map +0 -1
  566. package/dist/chunks/NcMentionBubble.vue_vue_type_style_index_0_scoped_3c4a673d_lang-DyqakLm5.mjs.map +0 -1
  567. package/dist/chunks/NcModal-DiDvgcU8.mjs.map +0 -1
  568. package/dist/chunks/NcNoteCard-mI7qVZ9j.mjs.map +0 -1
  569. package/dist/chunks/NcPasswordField-BFyzHTOO.mjs.map +0 -1
  570. package/dist/chunks/NcPopover-B87bEPLq.mjs.map +0 -1
  571. package/dist/chunks/NcProgressBar-C-ane-Ni.mjs.map +0 -1
  572. package/dist/chunks/NcRadioGroup-B4qmS2UD.mjs.map +0 -1
  573. package/dist/chunks/NcRadioGroupButton-CZykGwv3.mjs.map +0 -1
  574. package/dist/chunks/NcRelatedResourcesPanel-D_Ttpg5_.mjs.map +0 -1
  575. package/dist/chunks/NcRichContenteditable-Qw614bJ5.mjs.map +0 -1
  576. package/dist/chunks/NcRichText-BO_4KtBA.mjs.map +0 -1
  577. package/dist/chunks/NcSavingIndicatorIcon.vue_vue_type_script_setup_true_lang-DbQnMYZm.mjs.map +0 -1
  578. package/dist/chunks/NcSelect--kERLlBK.mjs.map +0 -1
  579. package/dist/chunks/NcSelectTags-I2hJaNax.mjs.map +0 -1
  580. package/dist/chunks/NcSelectUsers-K14Bepkq.mjs.map +0 -1
  581. package/dist/chunks/NcSettingsSection-Caz1fuWt.mjs.map +0 -1
  582. package/dist/chunks/NcSettingsSelectGroup-SYJ8-XlR.mjs.map +0 -1
  583. package/dist/chunks/NcTextArea-Dxzj4zdb.mjs.map +0 -1
  584. package/dist/chunks/NcTextField.vue_vue_type_script_setup_true_lang-Bx2esFU2.mjs.map +0 -1
  585. package/dist/chunks/NcThemeProvider.vue_vue_type_script_setup_true_lang-wie70gn4.mjs.map +0 -1
  586. package/dist/chunks/NcTimezonePicker.vue_vue_type_script_setup_true_lang-D7ZHgnwW.mjs.map +0 -1
  587. package/dist/chunks/NcUserBubble-BXR7vT0V.mjs.map +0 -1
  588. package/dist/chunks/NcUserStatusIcon-BF5OEQFU.mjs.map +0 -1
  589. package/dist/chunks/NcVNodes.vue_vue_type_script_lang-BqUHinRZ.mjs.map +0 -1
  590. package/dist/chunks/_l10n-wdIzZwir.mjs.map +0 -1
  591. package/dist/chunks/_plugin-vue_export-helper-1tPrXgE0.mjs.map +0 -1
  592. package/dist/chunks/actionGlobal-BZFdtdJL.mjs.map +0 -1
  593. package/dist/chunks/actionText-BXR0sWNu.mjs.map +0 -1
  594. package/dist/chunks/appName-DyNMVZpX.mjs.map +0 -1
  595. package/dist/chunks/autolink-DrIurosL.mjs.map +0 -1
  596. package/dist/chunks/colors-Cv9F-jWS.mjs.map +0 -1
  597. package/dist/chunks/constants-Ciwvl5xb.mjs.map +0 -1
  598. package/dist/chunks/constants-wIEKSp2G.mjs.map +0 -1
  599. package/dist/chunks/createElementId-DhjFt1I9.mjs.map +0 -1
  600. package/dist/chunks/customPickerElements-BqbDcaEu.mjs +0 -123
  601. package/dist/chunks/customPickerElements-BqbDcaEu.mjs.map +0 -1
  602. package/dist/chunks/emoji-C8k9NUlo.mjs.map +0 -1
  603. package/dist/chunks/focusTrap-HJQ4pqHV.mjs.map +0 -1
  604. package/dist/chunks/legacy-BoqDmOCa.mjs.map +0 -1
  605. package/dist/chunks/logger-D3RVzcfQ.mjs.map +0 -1
  606. package/dist/chunks/mdi-CpchYUUV.mjs.map +0 -1
  607. package/dist/chunks/platform-CC2ecGvV.mjs.map +0 -1
  608. package/dist/chunks/referencePickerModal-CnKdEDwu.mjs.map +0 -1
  609. package/dist/chunks/rtl-v0UOPAM7.mjs.map +0 -1
  610. package/dist/chunks/useAppSettingsDialog-C73Wx6iQ.mjs.map +0 -1
  611. package/dist/chunks/useCopy-6F-qWHq0.mjs.map +0 -1
  612. package/dist/chunks/useNcActions-BzPO2c4h.mjs.map +0 -1
  613. package/dist/chunks/useNcFormBox-Djlh582y.mjs.map +0 -1
  614. package/dist/chunks/useNcRadioGroup-D6llQmAl.mjs.map +0 -1
  615. package/dist/chunks/useTrapStackControl-B6cEicto.mjs.map +0 -1
  616. /package/dist/assets/{NcActionButtonGroup-Bt8kRk79.css → NcActionButtonGroup.css} +0 -0
  617. /package/dist/assets/{NcActionCaption-DnG2OyWa.css → NcActionCaption.css} +0 -0
  618. /package/dist/assets/{NcActionSeparator-Ct2RnclR.css → NcActionSeparator.css} +0 -0
  619. /package/dist/assets/{NcAppContent-TgcZd4AI.css → NcAppContent.css} +0 -0
  620. /package/dist/assets/{NcAppNavigationCaption-ggcWspH2.css → NcAppNavigationCaption.css} +0 -0
  621. /package/dist/assets/{NcAppNavigationIconBullet-DLQJkObX.css → NcAppNavigationIconBullet.css} +0 -0
  622. /package/dist/assets/{NcAppNavigationNew-Bn8zj5lM.css → NcAppNavigationNew.css} +0 -0
  623. /package/dist/assets/{NcAppNavigationSearch-DD7mo6OW.css → NcAppNavigationSearch.css} +0 -0
  624. /package/dist/assets/{NcAppNavigationSpacer-LST5uYYS.css → NcAppNavigationSpacer.css} +0 -0
  625. /package/dist/assets/{NcAppSettingsSection-DIw8GLHR.css → NcAppSettingsSection.css} +0 -0
  626. /package/dist/assets/{NcBreadcrumb-BxhZKQlW.css → NcBreadcrumb.css} +0 -0
  627. /package/dist/assets/{NcBreadcrumbs-B4eyDS9i.css → NcBreadcrumbs.css} +0 -0
  628. /package/dist/assets/{NcChip-DbSI4mFP.css → NcChip.css} +0 -0
  629. /package/dist/assets/{NcCollectionList-e5JFvzqX.css → NcCollectionList.css} +0 -0
  630. /package/dist/assets/{NcColorPicker-DVYGs8R3.css → NcColorPicker.css} +0 -0
  631. /package/dist/assets/{NcContent-DX4Rs6Pc.css → NcContent.css} +0 -0
  632. /package/dist/assets/{NcCounterBubble-ZnteskDR.css → NcCounterBubble.css} +0 -0
  633. /package/dist/assets/{NcDashboardWidget-nZuIL1UN.css → NcDashboardWidget.css} +0 -0
  634. /package/dist/assets/{NcDashboardWidgetItem-DpVmEBwQ.css → NcDashboardWidgetItem.css} +0 -0
  635. /package/dist/assets/{NcDialog-BSV74Bru.css → NcDialog.css} +0 -0
  636. /package/dist/assets/{NcEmojiPicker-vNKR9S87.css → NcEmojiPicker.css} +0 -0
  637. /package/dist/assets/{NcEmptyContent-DJMDuGVz.css → NcEmptyContent.css} +0 -0
  638. /package/dist/assets/{NcGuestContent-CM0uWLr1.css → NcGuestContent.css} +0 -0
  639. /package/dist/assets/{NcHeaderButton-CVOQgRjm.css → NcHeaderButton.css} +0 -0
  640. /package/dist/assets/{NcIconSvgWrapper-N3OwSN9O.css → NcIconSvgWrapper.css} +0 -0
  641. /package/dist/assets/{NcInputConfirmCancel-DZEDRf0t.css → NcInputConfirmCancel.css} +0 -0
  642. /package/dist/assets/{NcListItem-BjeejGlB.css → NcListItem.css} +0 -0
  643. /package/dist/assets/{NcListItemIcon-DJRcmlo1.css → NcListItemIcon.css} +0 -0
  644. /package/dist/assets/{NcLoadingIcon-CWUlo4XY.css → NcLoadingIcon.css} +0 -0
  645. /package/dist/assets/{NcMentionBubble-BeGb2xGc.css → NcMentionBubble.css} +0 -0
  646. /package/dist/assets/{NcModal-D81luiuU.css → NcModal.css} +0 -0
  647. /package/dist/assets/{NcNoteCard-DfescGKl.css → NcNoteCard.css} +0 -0
  648. /package/dist/assets/{NcPasswordField-BN4HFgU5.css → NcPasswordField.css} +0 -0
  649. /package/dist/assets/{NcRelatedResourcesPanel-BZKjkugM.css → NcRelatedResourcesPanel.css} +0 -0
  650. /package/dist/assets/{NcRichText-D0Bu5bbu.css → NcRichText.css} +0 -0
  651. /package/dist/assets/{NcSettingsSection-f5rBJsKJ.css → NcSettingsSection.css} +0 -0
  652. /package/dist/assets/{NcSettingsSelectGroup-D_fSrafm.css → NcSettingsSelectGroup.css} +0 -0
  653. /package/dist/assets/{NcTextArea-BxGe3Lqn.css → NcTextArea.css} +0 -0
  654. /package/dist/assets/{NcUserBubble-DFUmBxeb.css → NcUserBubble.css} +0 -0
  655. /package/dist/assets/{NcUserStatusIcon-B3aHoBAd.css → NcUserStatusIcon.css} +0 -0
@@ -1,12 +1,14 @@
1
- import '../assets/NcAvatar-Bs7qEhkA.css';
1
+ import '../assets/NcAvatar.css';
2
2
  import { getCurrentUser } from "@nextcloud/auth";
3
3
  import axios from "@nextcloud/axios";
4
4
  import { getBuilder } from "@nextcloud/browser-storage";
5
5
  import { unsubscribe, subscribe } from "@nextcloud/event-bus";
6
6
  import { generateOcsUrl, generateUrl } from "@nextcloud/router";
7
7
  import { vOnClickOutside } from "@vueuse/components";
8
- import { N as NcActions, I as IconDotsHorizontal } from "./NcActions-C-wDqSrv.mjs";
9
- import { g as getRoute } from "./autolink-DrIurosL.mjs";
8
+ import debounce from "debounce";
9
+ import { defineAsyncComponent, resolveComponent, resolveDirective, withDirectives, openBlock, createElementBlock, normalizeStyle, normalizeClass, renderSlot, createCommentVNode, Fragment, createBlock, withCtx, createSlots, renderList, resolveDynamicComponent, mergeProps, createTextVNode, toDisplayString, createVNode, createElementVNode } from "vue";
10
+ import { N as NcActions, I as IconDotsHorizontal } from "./NcActions.mjs";
11
+ import { g as getRoute } from "./autolink.mjs";
10
12
  import "../composables/useFormatDateTime/index.mjs";
11
13
  import "../composables/useHotKey/index.mjs";
12
14
  import { useIsDarkTheme } from "../composables/useIsDarkTheme/index.mjs";
@@ -14,23 +16,24 @@ import "../composables/useIsFullscreen/index.mjs";
14
16
  import "../composables/useIsMobile/index.mjs";
15
17
  import { getEnabledContactsMenuActions } from "../functions/contactsMenu/index.mjs";
16
18
  import { usernameToColor } from "../functions/usernameToColor/index.mjs";
17
- import { r as register, m as t10, a as t } from "./_l10n-wdIzZwir.mjs";
19
+ import { r as register, n as t11, a as t } from "./_l10n.mjs";
18
20
  import "escape-html";
19
21
  import "striptags";
20
- import { resolveComponent, resolveDirective, withDirectives, openBlock, createElementBlock, normalizeStyle, normalizeClass, renderSlot, createCommentVNode, createBlock, withCtx, createSlots, Fragment, renderList, resolveDynamicComponent, mergeProps, createTextVNode, toDisplayString, createVNode, createElementVNode } from "vue";
21
- import { g as getAvatarUrl } from "./NcMentionBubble.vue_vue_type_style_index_0_scoped_3c4a673d_lang-DyqakLm5.mjs";
22
- import { _ as _export_sfc } from "./_plugin-vue_export-helper-1tPrXgE0.mjs";
22
+ import { g as getAvatarUrl } from "./NcMentionBubble.vue_vue_type_style_index_0_scoped_3c4a673d_lang.mjs";
23
+ import { _ as _export_sfc } from "./_plugin-vue_export-helper.mjs";
23
24
  import { getCapabilities } from "@nextcloud/capabilities";
24
- import { l as logger } from "./logger-D3RVzcfQ.mjs";
25
- import { N as NcUserStatusIcon, g as getUserStatusText } from "./NcUserStatusIcon-BF5OEQFU.mjs";
26
- import { N as NcActionButton } from "./NcActionButton-BO5T5ePT.mjs";
27
- import { N as NcActionLink } from "./NcActionLink-BFiaYt9A.mjs";
28
- import { N as NcActionRouter } from "./NcActionRouter-vYFtIOzD.mjs";
29
- import { N as NcActionText } from "./NcActionText-CQ9qwJ0p.mjs";
30
- import { N as NcButton } from "./NcButton-jvoYS2my.mjs";
31
- import { N as NcIconSvgWrapper } from "./NcIconSvgWrapper-g8ubWhoz.mjs";
32
- import { N as NcLoadingIcon } from "./NcLoadingIcon-BOVpFVQz.mjs";
33
- register(t10);
25
+ import { l as logger } from "./logger.mjs";
26
+ import { b as isLegacy35 } from "./legacy.mjs";
27
+ import { N as NcUserStatusIcon, g as getUserStatusText } from "./NcUserStatusIcon.mjs";
28
+ import { N as NcActionButton } from "./NcActionButton.mjs";
29
+ import { N as NcActionLink } from "./NcActionLink.mjs";
30
+ import { N as NcActionRouter } from "./NcActionRouter.mjs";
31
+ import { N as NcActionText } from "./NcActionText.mjs";
32
+ import { N as NcButton } from "./NcButton.mjs";
33
+ import { N as NcIconSvgWrapper } from "./NcIconSvgWrapper.mjs";
34
+ import { N as NcLoadingIcon } from "./NcLoadingIcon.mjs";
35
+ import { N as NcPopover } from "./NcPopover.mjs";
36
+ register(t11);
34
37
  const userStatus = {
35
38
  data() {
36
39
  return {
@@ -112,6 +115,8 @@ const _sfc_main = {
112
115
  NcButton,
113
116
  NcIconSvgWrapper,
114
117
  NcLoadingIcon,
118
+ NcPopover,
119
+ NcProfileHoverCard: defineAsyncComponent(() => import("./NcProfileHoverCard.mjs")),
115
120
  NcUserStatusIcon
116
121
  },
117
122
  mixins: [userStatus],
@@ -230,14 +235,15 @@ const _sfc_main = {
230
235
  * Selector for the popover menu container
231
236
  */
232
237
  menuContainer: {
233
- type: [Boolean, String, Object, Element],
238
+ type: [Boolean, String],
234
239
  default: "body"
235
240
  }
236
241
  },
237
242
  setup() {
238
243
  const isDarkTheme = useIsDarkTheme();
239
244
  return {
240
- isDarkTheme
245
+ isDarkTheme,
246
+ isLegacy35
241
247
  };
242
248
  },
243
249
  data() {
@@ -295,10 +301,13 @@ const _sfc_main = {
295
301
  if (this.disableMenu) {
296
302
  return false;
297
303
  }
298
- if (this.isMenuLoaded) {
299
- return this.menu.length > 0;
304
+ if (this.isLegacy35) {
305
+ if (this.isMenuLoaded) {
306
+ return this.menu.length > 0;
307
+ }
308
+ return !(this.user === getCurrentUser()?.uid || this.userDoesNotExist || this.url);
300
309
  }
301
- return !(this.user === getCurrentUser()?.uid || this.userDoesNotExist || this.url);
310
+ return Boolean(this.user) && !this.isNoUser && !this.url && !this.userDoesNotExist;
302
311
  },
303
312
  /**
304
313
  * True if initials should be shown as the user icon fallback
@@ -348,7 +357,7 @@ const _sfc_main = {
348
357
  if (!filteredChars) {
349
358
  return initials;
350
359
  }
351
- const filtered = filteredChars.join("");
360
+ const filtered = filteredChars.join("").trim();
352
361
  const idx = filtered.lastIndexOf(" ");
353
362
  initials = String.fromCodePoint(filtered.codePointAt(0));
354
363
  if (idx !== -1) {
@@ -357,7 +366,71 @@ const _sfc_main = {
357
366
  }
358
367
  return initials.toLocaleUpperCase();
359
368
  },
369
+ /**
370
+ * Contacts menu actions for the hover card.
371
+ * `null` until actions are loaded so the card can fall back to profile API actions.
372
+ *
373
+ * @return {Array|null}
374
+ */
375
+ hoverCardActions() {
376
+ if (this.isLegacy35 || !this.isMenuLoaded) {
377
+ return null;
378
+ }
379
+ return this.menu.length > 0 ? this.menu : null;
380
+ },
381
+ /**
382
+ * Status already known by this avatar so the hover card does not fetch it again.
383
+ * Omitted while status is still the empty default (fetch in progress).
384
+ *
385
+ * @return {object|undefined}
386
+ */
387
+ hoverCardPreloadedUserStatus() {
388
+ if (this.preloadedUserStatus) {
389
+ return this.userStatus;
390
+ }
391
+ if (this.userStatus.status || this.userStatus.icon || this.userStatus.message) {
392
+ return this.userStatus;
393
+ }
394
+ return void 0;
395
+ },
360
396
  menu() {
397
+ if (this.isLegacy35) {
398
+ return this.legacyMenu;
399
+ }
400
+ const actions = this.contactsMenuActions.map((item) => {
401
+ const route = getRoute(this.$router, item.hyperlink);
402
+ return {
403
+ id: item.id,
404
+ appId: item.appId,
405
+ text: item.title,
406
+ href: route ? void 0 : item.hyperlink,
407
+ to: route || void 0,
408
+ icon: item.icon
409
+ };
410
+ });
411
+ for (const action of getEnabledContactsMenuActions(this.contactsMenuData)) {
412
+ try {
413
+ actions.push({
414
+ id: action.id,
415
+ text: action.displayName(this.contactsMenuData),
416
+ iconSvg: action.iconSvg(this.contactsMenuData),
417
+ onClick: () => action.callback(this.contactsMenuData)
418
+ });
419
+ } catch (error) {
420
+ logger.error(`Failed to render ContactsMenu action ${action.id}`, {
421
+ error,
422
+ action
423
+ });
424
+ }
425
+ }
426
+ return actions;
427
+ },
428
+ /**
429
+ * Legacy NcActions menu entries for Nextcloud 32–34.
430
+ *
431
+ * @return {Array}
432
+ */
433
+ legacyMenu() {
361
434
  const actions = this.contactsMenuActions.map((item) => {
362
435
  const route = getRoute(this.$router, item.hyperlink);
363
436
  return {
@@ -418,8 +491,26 @@ const _sfc_main = {
418
491
  this.userDoesNotExist = false;
419
492
  this.isMenuLoaded = false;
420
493
  this.loadAvatarUrl();
494
+ },
495
+ preloadedUserStatus(status) {
496
+ if (status) {
497
+ this.setUserStatus(status);
498
+ }
499
+ },
500
+ contactsMenuOpenState(shown) {
501
+ if (this.isLegacy35) {
502
+ return;
503
+ }
504
+ if (shown) {
505
+ this.debouncedFetchContactsMenu();
506
+ } else {
507
+ this.debouncedFetchContactsMenu.clear();
508
+ }
421
509
  }
422
510
  },
511
+ created() {
512
+ this.debouncedFetchContactsMenu = debounce(this.fetchContactsMenu, 300);
513
+ },
423
514
  mounted() {
424
515
  this.loadAvatarUrl();
425
516
  subscribe("settings:avatar:updated", this.loadAvatarUrl);
@@ -436,6 +527,7 @@ const _sfc_main = {
436
527
  }
437
528
  },
438
529
  beforeUnmount() {
530
+ this.debouncedFetchContactsMenu.clear();
439
531
  unsubscribe("settings:avatar:updated", this.loadAvatarUrl);
440
532
  unsubscribe("settings:display-name:updated", this.loadAvatarUrl);
441
533
  unsubscribe("user_status:status.updated", this.handleUserStatusUpdated);
@@ -453,7 +545,7 @@ const _sfc_main = {
453
545
  }
454
546
  },
455
547
  /**
456
- * Toggle the popover menu on click or enter
548
+ * Toggle the legacy popover menu on click or enter
457
549
  *
458
550
  * @param {KeyboardEvent|MouseEvent} event the UI event
459
551
  */
@@ -467,6 +559,9 @@ const _sfc_main = {
467
559
  this.contactsMenuOpenState = !this.contactsMenuOpenState;
468
560
  },
469
561
  closeMenu() {
562
+ if (!this.isLegacy35) {
563
+ return;
564
+ }
470
565
  this.contactsMenuOpenState = false;
471
566
  },
472
567
  async fetchContactsMenu() {
@@ -477,7 +572,11 @@ const _sfc_main = {
477
572
  this.contactsMenuData = data;
478
573
  this.contactsMenuActions = data.topAction ? [data.topAction].concat(data.actions) : data.actions;
479
574
  } catch {
480
- this.contactsMenuOpenState = false;
575
+ this.contactsMenuData = {};
576
+ this.contactsMenuActions = [];
577
+ if (this.isLegacy35) {
578
+ this.contactsMenuOpenState = false;
579
+ }
481
580
  }
482
581
  this.contactsMenuLoading = false;
483
582
  this.isMenuLoaded = true;
@@ -571,7 +670,8 @@ const _sfc_main = {
571
670
  };
572
671
  const _hoisted_1 = ["title"];
573
672
  const _hoisted_2 = ["src", "srcset"];
574
- const _hoisted_3 = {
673
+ const _hoisted_3 = ["aria-label"];
674
+ const _hoisted_4 = {
575
675
  key: 2,
576
676
  class: "avatardiv__user-status avatardiv__user-status--icon"
577
677
  };
@@ -581,12 +681,15 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
581
681
  const _component_NcButton = resolveComponent("NcButton");
582
682
  const _component_NcIconSvgWrapper = resolveComponent("NcIconSvgWrapper");
583
683
  const _component_NcActions = resolveComponent("NcActions");
684
+ const _component_NcProfileHoverCard = resolveComponent("NcProfileHoverCard");
685
+ const _component_NcPopover = resolveComponent("NcPopover");
584
686
  const _component_NcUserStatusIcon = resolveComponent("NcUserStatusIcon");
585
687
  const _directive_click_outside = resolveDirective("click-outside");
586
688
  return withDirectives((openBlock(), createElementBlock("span", {
587
689
  class: normalizeClass(["avatardiv popovermenu-wrapper", {
588
690
  "avatardiv--unknown": $data.userDoesNotExist,
589
691
  "avatardiv--with-menu": $options.hasMenu,
692
+ "avatardiv--with-legacy-menu": $options.hasMenu && $setup.isLegacy35,
590
693
  "avatardiv--with-menu-loading": $data.contactsMenuLoading
591
694
  }]),
592
695
  style: normalizeStyle($options.avatarStyle),
@@ -603,62 +706,93 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
603
706
  alt: ""
604
707
  }, null, 8, _hoisted_2)) : createCommentVNode("", true)
605
708
  ], true),
606
- $options.hasMenu && $options.menu.length === 0 ? (openBlock(), createBlock(_component_NcButton, {
607
- key: 0,
608
- "aria-label": $options.avatarAriaLabel,
609
- class: "action-item action-item__menutoggle",
610
- variant: "tertiary-no-background",
611
- onClick: $options.toggleMenu
612
- }, {
613
- icon: withCtx(() => [
614
- $data.contactsMenuLoading ? (openBlock(), createBlock(_component_NcLoadingIcon, { key: 0 })) : (openBlock(), createBlock(_component_IconDotsHorizontal, {
615
- key: 1,
616
- size: 20
617
- }))
618
- ]),
619
- _: 1
620
- }, 8, ["aria-label", "onClick"])) : $options.hasMenu ? (openBlock(), createBlock(_component_NcActions, {
709
+ $setup.isLegacy35 && $options.hasMenu ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
710
+ $options.menu.length === 0 ? (openBlock(), createBlock(_component_NcButton, {
711
+ key: 0,
712
+ "aria-label": $options.avatarAriaLabel,
713
+ class: "action-item action-item__menutoggle",
714
+ variant: "tertiary-no-background",
715
+ onClick: $options.toggleMenu
716
+ }, {
717
+ icon: withCtx(() => [
718
+ $data.contactsMenuLoading ? (openBlock(), createBlock(_component_NcLoadingIcon, { key: 0 })) : (openBlock(), createBlock(_component_IconDotsHorizontal, {
719
+ key: 1,
720
+ size: 20
721
+ }))
722
+ ]),
723
+ _: 1
724
+ }, 8, ["aria-label", "onClick"])) : (openBlock(), createBlock(_component_NcActions, {
725
+ key: 1,
726
+ open: $data.contactsMenuOpenState,
727
+ "onUpdate:open": _cache[0] || (_cache[0] = ($event) => $data.contactsMenuOpenState = $event),
728
+ "aria-label": $options.avatarAriaLabel,
729
+ container: $props.menuContainer,
730
+ forceMenu: "",
731
+ manualOpen: "",
732
+ variant: "tertiary-no-background",
733
+ onClick: $options.toggleMenu
734
+ }, createSlots({
735
+ default: withCtx(() => [
736
+ (openBlock(true), createElementBlock(Fragment, null, renderList($options.menu, (item, key) => {
737
+ return openBlock(), createBlock(resolveDynamicComponent(item.ncActionComponent), mergeProps({ key }, { ref_for: true }, item.ncActionComponentProps), createSlots({
738
+ default: withCtx(() => [
739
+ createTextVNode(" " + toDisplayString(item.text), 1)
740
+ ]),
741
+ _: 2
742
+ }, [
743
+ item.iconSvg ? {
744
+ name: "icon",
745
+ fn: withCtx(() => [
746
+ createVNode(_component_NcIconSvgWrapper, {
747
+ svg: item.iconSvg
748
+ }, null, 8, ["svg"])
749
+ ]),
750
+ key: "0"
751
+ } : void 0
752
+ ]), 1040);
753
+ }), 128))
754
+ ]),
755
+ _: 2
756
+ }, [
757
+ $data.contactsMenuLoading ? {
758
+ name: "icon",
759
+ fn: withCtx(() => [
760
+ createVNode(_component_NcLoadingIcon)
761
+ ]),
762
+ key: "0"
763
+ } : void 0
764
+ ]), 1032, ["open", "aria-label", "container", "onClick"]))
765
+ ], 64)) : $options.hasMenu ? (openBlock(), createBlock(_component_NcPopover, {
621
766
  key: 1,
622
- open: $data.contactsMenuOpenState,
623
- "onUpdate:open": _cache[0] || (_cache[0] = ($event) => $data.contactsMenuOpenState = $event),
624
- "aria-label": $options.avatarAriaLabel,
767
+ shown: $data.contactsMenuOpenState,
768
+ "onUpdate:shown": _cache[1] || (_cache[1] = ($event) => $data.contactsMenuOpenState = $event),
769
+ class: "avatar-profile-popover",
625
770
  container: $props.menuContainer,
626
- forceMenu: "",
627
- manualOpen: "",
628
- variant: "tertiary-no-background",
629
- onClick: $options.toggleMenu
630
- }, createSlots({
771
+ delay: { show: 400, hide: 0 },
772
+ popoverTriggers: ["hover"],
773
+ triggers: ["hover", "focus", "click"],
774
+ noFocusTrap: "",
775
+ popupRole: "dialog"
776
+ }, {
777
+ trigger: withCtx(({ attrs }) => [
778
+ createElementVNode("span", mergeProps({ class: "avatar-profile-popover__trigger" }, attrs, {
779
+ role: "button",
780
+ tabindex: "0",
781
+ "aria-label": $options.avatarAriaLabel
782
+ }), null, 16, _hoisted_3)
783
+ ]),
631
784
  default: withCtx(() => [
632
- (openBlock(true), createElementBlock(Fragment, null, renderList($options.menu, (item, key) => {
633
- return openBlock(), createBlock(resolveDynamicComponent(item.ncActionComponent), mergeProps({ key }, { ref_for: true }, item.ncActionComponentProps), createSlots({
634
- default: withCtx(() => [
635
- createTextVNode(" " + toDisplayString(item.text), 1)
636
- ]),
637
- _: 2
638
- }, [
639
- item.iconSvg ? {
640
- name: "icon",
641
- fn: withCtx(() => [
642
- createVNode(_component_NcIconSvgWrapper, {
643
- svg: item.iconSvg
644
- }, null, 8, ["svg"])
645
- ]),
646
- key: "0"
647
- } : void 0
648
- ]), 1040);
649
- }), 128))
785
+ createVNode(_component_NcProfileHoverCard, {
786
+ user: $props.user,
787
+ open: $data.contactsMenuOpenState,
788
+ actions: $options.hoverCardActions,
789
+ actionsLoading: $data.contactsMenuLoading,
790
+ preloadedUserStatus: $options.hoverCardPreloadedUserStatus
791
+ }, null, 8, ["user", "open", "actions", "actionsLoading", "preloadedUserStatus"])
650
792
  ]),
651
- _: 2
652
- }, [
653
- $data.contactsMenuLoading ? {
654
- name: "icon",
655
- fn: withCtx(() => [
656
- createVNode(_component_NcLoadingIcon)
657
- ]),
658
- key: "0"
659
- } : void 0
660
- ]), 1032, ["open", "aria-label", "container", "onClick"])) : createCommentVNode("", true),
661
- $options.showUserStatusIconOnAvatar ? (openBlock(), createElementBlock("span", _hoisted_3, toDisplayString(_ctx.userStatus.icon), 1)) : $options.canDisplayUserStatus ? (openBlock(), createBlock(_component_NcUserStatusIcon, {
793
+ _: 1
794
+ }, 8, ["shown", "container"])) : createCommentVNode("", true),
795
+ $options.showUserStatusIconOnAvatar ? (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(_ctx.userStatus.icon), 1)) : $options.canDisplayUserStatus ? (openBlock(), createBlock(_component_NcUserStatusIcon, {
662
796
  key: 3,
663
797
  class: "avatardiv__user-status",
664
798
  status: _ctx.userStatus.status,
@@ -678,9 +812,9 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
678
812
  [_directive_click_outside, $options.closeMenu]
679
813
  ]);
680
814
  }
681
- const NcAvatar = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-e0ae1174"]]);
815
+ const NcAvatar = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-2b0ca47b"]]);
682
816
  export {
683
817
  NcAvatar as N,
684
818
  userStatus as u
685
819
  };
686
- //# sourceMappingURL=NcAvatar-1KxMUN7V.mjs.map
820
+ //# sourceMappingURL=NcAvatar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NcAvatar.mjs","sources":["../../src/mixins/userStatus.js","../../src/components/NcAvatar/NcAvatar.vue"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getCurrentUser } from '@nextcloud/auth'\nimport axios from '@nextcloud/axios'\nimport { getCapabilities } from '@nextcloud/capabilities'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { logger } from '../utils/logger.ts'\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\thasStatus: false,\n\t\t\tuserStatus: {\n\t\t\t\tstatus: null,\n\t\t\t\tmessage: null,\n\t\t\t\ticon: null,\n\t\t\t},\n\t\t}\n\t},\n\tmethods: {\n\t\t/**\n\t\t * Fetches the user-status from the server\n\t\t *\n\t\t * @param {string} userId UserId of the user to fetch the status for\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync fetchUserStatus(userId) {\n\t\t\tif (!userId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst capabilities = getCapabilities()\n\t\t\tif (!Object.hasOwn(capabilities, 'user_status') || !capabilities.user_status.enabled) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// User status endpoint is not available for guests.\n\t\t\tif (!getCurrentUser()) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst { data } = await axios.get(generateOcsUrl('apps/user_status/api/v1/statuses/{userId}', { userId }))\n\t\t\t\tthis.setUserStatus(data.ocs.data)\n\t\t\t} catch (e) {\n\t\t\t\tif (e.response.status === 404 && e.response.data.ocs?.data?.length === 0) {\n\t\t\t\t\t// User just has no status set, so don't log it\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tlogger.error('Failed to fetch user status', { error: e })\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Sets the user status\n\t\t *\n\t\t * @param {Record<string, string>} options - Options for setting the user status\n\t\t * @param {string} options.status user's status\n\t\t * @param {string} options.message user's message\n\t\t * @param {string} options.icon user's icon\n\t\t */\n\t\tsetUserStatus({ status, message, icon }) {\n\t\t\tthis.userStatus.status = status || ''\n\t\t\tthis.userStatus.message = message || ''\n\t\t\tthis.userStatus.icon = icon || ''\n\t\t\tthis.hasStatus = !!status\n\t\t},\n\t},\n}\n","<!--\n - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<docs>\n\n### Basic user avatar\n\n```vue\n\t<NcAvatar user=\"willywonka\" display-name=\"Willy Wonka\" />\n```\n\n### Avatar with image\n\n```vue\n\t<NcAvatar url=\"favicon-touch.png\" />\n```\n\n### Avatar with material design icon\n\n```\n<template>\n\t<NcAvatar>\n\t\t<template #icon>\n\t\t\t<IconAccountMultipleOutline :size=\"20\" />\n\t\t</template>\n\t</NcAvatar>\n</template>\n<script>\nimport IconAccountMultipleOutline from 'vue-material-design-icons/AccountMultipleOutline.vue'\n\nexport default {\n\tcomponents: {\n\t\tIconAccountMultipleOutline,\n\t},\n}\n</script>\n```\n\n### Avatar with preloaded status\n```\n<template>\n\t<div>\n\t\t<NcAvatar user=\"janedoe\"\n\t\t\tdisplay-name=\"Jane Doe\"\n\t\t\t:preloaded-user-status=\"status.online\">\n\t\t</NcAvatar>\n\t\t<NcAvatar user=\"janedoe\"\n\t\t\tdisplay-name=\"Jane Doe\"\n\t\t\t:preloaded-user-status=\"status.away\">\n\t\t</NcAvatar>\n\t\t<NcAvatar user=\"janedoe\"\n\t\t\tdisplay-name=\"Jane Doe\"\n\t\t\t:preloaded-user-status=\"status.dnd\">\n\t\t</NcAvatar>\n\t\t<NcAvatar user=\"janedoe\"\n\t\t\tdisplay-name=\"Jane Doe\"\n\t\t\t:preloaded-user-status=\"status.custom\">\n\t\t</NcAvatar>\n\t</div>\n</template>\n\n<script>\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tstatus: {\n\t\t\t\tonline: {\n\t\t\t\t\ticon: '',\n\t\t\t\t\tstatus: 'online',\n\t\t\t\t\tmessage: 'Available',\n\t\t\t\t},\n\t\t\t\taway: {\n\t\t\t\t\ticon: '',\n\t\t\t\t\tstatus: 'away',\n\t\t\t\t\tmessage: 'Away',\n\t\t\t\t},\n\t\t\t\tdnd: {\n\t\t\t\t\ticon: '',\n\t\t\t\t\tstatus: 'dnd',\n\t\t\t\t\tmessage: 'Busy',\n\t\t\t\t},\n\t\t\t\tcustom: {\n\t\t\t\t\ticon: '📆',\n\t\t\t\t\tstatus: 'online',\n\t\t\t\t\tmessage: 'In a meeting',\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t},\n}\n</script>\n```\n\n### Avatar for non-users\n\n```vue\n\t<NcAvatar display-name=\"Robbie Hyeon-Jeong\" :is-no-user=\"true\" />\n```\n\n### Avatar on complex background\n\n```\n<template>\n\t<div class=\"avatar-background\">\n\t\t<NcAvatar class=\"avatar\" :is-no-user=\"true\" display-name=\"Cecilia Rohese\" />\n\t</div>\n</template>\n<style scoped>\n.avatar-background {\n\twidth: 80px;\n\theight: 60px;\n\tbackground: linear-gradient(to bottom, #0057b8 0%, #0057b8 49.99%, #ffd700 50%, #ffd700 100%);\n}\n\n.avatar {\n\tmargin: 15px 25px;\n}\n</style>\n```\n\n### Avatar size\n\n```vue\n<template>\n\t<div>\n\t\t<div v-for=\"size in [15, 24, 34, 44, 180]\">\n\t\t\t<span>\n\t\t\t\t{{ size }}px\n\t\t\t</span>\n\t\t\t<NcAvatar user=\"alice-smith\"\n\t\t\t\tdisplay-name=\"Alice Smith\"\n\t\t\t\t:size=\"size\"\n\t\t\t\t:preloaded-user-status=\"status.online\" />\n\t\t\t<NcAvatar user=\"bob-doe\"\n\t\t\t\tdisplay-name=\"Bob Doe\"\n\t\t\t\t:size=\"size\"\n\t\t\t\t:preloaded-user-status=\"status.meeting\" />\n\t\t</div>\n\t\t<div>\n\t\t\t<div>\n\t\t\t\tCustom: {{ customSize }}px\n\t\t\t</div>\n\t\t\t<NcAvatar user=\"alice-smith\"\n\t\t\t\tdisplay-name=\"Alice Smith\"\n\t\t\t\t:size=\"customSize\"\n\t\t\t\t:preloaded-user-status=\"status.online\" />\n\t\t\t<NcAvatar user=\"bob-doe\"\n\t\t\t\tdisplay-name=\"Bob Doe\"\n\t\t\t\t:size=\"customSize\"\n\t\t\t\t:preloaded-user-status=\"status.meeting\" />\n\t\t</div>\n\t\t<div>\n\t\t\t<input type=\"range\" v-model=\"customSize\" :min=\"15\" :max=\"180\" step=\"1\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport AccountMultiple from 'vue-material-design-icons/AccountMultiple.vue'\n\nexport default {\n\tcomponents: {\n\t\tAccountMultiple,\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tcustomSize: 20,\n\t\t\tstatus: {\n\t\t\t\tonline: {\n\t\t\t\t\ticon: '',\n\t\t\t\t\tstatus: 'online',\n\t\t\t\t\tmessage: 'Available',\n\t\t\t\t},\n\t\t\t\tmeeting: {\n\t\t\t\t\ticon: '📆',\n\t\t\t\t\tstatus: 'online',\n\t\t\t\t\tmessage: 'In a meeting',\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t},\n}\n</script>\n```\n\n</docs>\n\n<template>\n\t<span\n\t\tv-click-outside=\"closeMenu\"\n\t\tclass=\"avatardiv popovermenu-wrapper\"\n\t\t:class=\"{\n\t\t\t'avatardiv--unknown': userDoesNotExist,\n\t\t\t'avatardiv--with-menu': hasMenu,\n\t\t\t'avatardiv--with-legacy-menu': hasMenu && isLegacy35,\n\t\t\t'avatardiv--with-menu-loading': contactsMenuLoading,\n\t\t}\"\n\t\t:style=\"avatarStyle\"\n\t\t:title=\"tooltip\">\n\t\t<!-- @slot Icon slot -->\n\t\t<slot name=\"icon\">\n\t\t\t<!-- Avatar icon or image -->\n\t\t\t<span v-if=\"iconClass\" :class=\"iconClass\" class=\"avatar-class-icon\" />\n\t\t\t<img\n\t\t\t\tv-else-if=\"isAvatarLoaded && !userDoesNotExist\"\n\t\t\t\t:src=\"avatarUrlLoaded\"\n\t\t\t\t:srcset=\"avatarSrcSetLoaded\"\n\t\t\t\talt=\"\">\n\t\t</slot>\n\n\t\t<!-- Legacy contacts menu (Nextcloud 32–34) -->\n\t\t<template v-if=\"isLegacy35 && hasMenu\">\n\t\t\t<!-- We show a button if the menu is not loaded yet. -->\n\t\t\t<NcButton\n\t\t\t\tv-if=\"menu.length === 0\"\n\t\t\t\t:aria-label=\"avatarAriaLabel\"\n\t\t\t\tclass=\"action-item action-item__menutoggle\"\n\t\t\t\tvariant=\"tertiary-no-background\"\n\t\t\t\t@click=\"toggleMenu\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcLoadingIcon v-if=\"contactsMenuLoading\" />\n\t\t\t\t\t<IconDotsHorizontal v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\t\t\t<NcActions\n\t\t\t\tv-else\n\t\t\t\tv-model:open=\"contactsMenuOpenState\"\n\t\t\t\t:aria-label=\"avatarAriaLabel\"\n\t\t\t\t:container=\"menuContainer\"\n\t\t\t\tforceMenu\n\t\t\t\tmanualOpen\n\t\t\t\tvariant=\"tertiary-no-background\"\n\t\t\t\t@click=\"toggleMenu\">\n\t\t\t\t<component\n\t\t\t\t\t:is=\"item.ncActionComponent\"\n\t\t\t\t\tv-for=\"(item, key) in menu\"\n\t\t\t\t\t:key=\"key\"\n\t\t\t\t\tv-bind=\"item.ncActionComponentProps\">\n\t\t\t\t\t<template v-if=\"item.iconSvg\" #icon>\n\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"item.iconSvg\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ item.text }}\n\t\t\t\t</component>\n\t\t\t\t<template v-if=\"contactsMenuLoading\" #icon>\n\t\t\t\t\t<NcLoadingIcon />\n\t\t\t\t</template>\n\t\t\t</NcActions>\n\t\t</template>\n\n\t\t<!-- Profile hover card (Nextcloud 35+) -->\n\t\t<NcPopover\n\t\t\tv-else-if=\"hasMenu\"\n\t\t\tv-model:shown=\"contactsMenuOpenState\"\n\t\t\tclass=\"avatar-profile-popover\"\n\t\t\t:container=\"menuContainer\"\n\t\t\t:delay=\"{ show: 400, hide: 0 }\"\n\t\t\t:popoverTriggers=\"['hover']\"\n\t\t\t:triggers=\"['hover', 'focus', 'click']\"\n\t\t\tnoFocusTrap\n\t\t\tpopupRole=\"dialog\">\n\t\t\t<template #trigger=\"{ attrs }\">\n\t\t\t\t<span\n\t\t\t\t\tclass=\"avatar-profile-popover__trigger\"\n\t\t\t\t\tv-bind=\"attrs\"\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t:aria-label=\"avatarAriaLabel\" />\n\t\t\t</template>\n\t\t\t<NcProfileHoverCard\n\t\t\t\t:user=\"user\"\n\t\t\t\t:open=\"contactsMenuOpenState\"\n\t\t\t\t:actions=\"hoverCardActions\"\n\t\t\t\t:actionsLoading=\"contactsMenuLoading\"\n\t\t\t\t:preloadedUserStatus=\"hoverCardPreloadedUserStatus\" />\n\t\t</NcPopover>\n\n\t\t<!-- Avatar status -->\n\t\t<span v-if=\"showUserStatusIconOnAvatar\" class=\"avatardiv__user-status avatardiv__user-status--icon\">\n\t\t\t{{ userStatus.icon }}\n\t\t</span>\n\t\t<NcUserStatusIcon\n\t\t\tv-else-if=\"canDisplayUserStatus\"\n\t\t\tclass=\"avatardiv__user-status\"\n\t\t\t:status=\"userStatus.status\"\n\t\t\t:aria-hidden=\"String(hasMenu)\" />\n\n\t\t<!-- Show the letter if no avatar nor icon class -->\n\t\t<span\n\t\t\tv-if=\"showInitials\"\n\t\t\t:style=\"initialsWrapperStyle\"\n\t\t\tclass=\"avatardiv__initials-wrapper\">\n\t\t\t<span :style=\"initialsStyle\" class=\"avatardiv__initials\">\n\t\t\t\t{{ initials }}\n\t\t\t</span>\n\t\t</span>\n\t</span>\n</template>\n\n<script>\nimport { getCurrentUser } from '@nextcloud/auth'\nimport axios from '@nextcloud/axios'\nimport { getBuilder } from '@nextcloud/browser-storage'\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { generateUrl } from '@nextcloud/router'\nimport { vOnClickOutside as ClickOutside } from '@vueuse/components'\nimport debounce from 'debounce'\nimport { defineAsyncComponent } from 'vue'\nimport IconDotsHorizontal from 'vue-material-design-icons/DotsHorizontal.vue'\nimport { getRoute } from '../../components/NcRichText/autolink.ts'\nimport { useIsDarkTheme } from '../../composables/index.ts'\nimport { getEnabledContactsMenuActions } from '../../functions/contactsMenu/index.ts'\nimport { usernameToColor } from '../../functions/usernameToColor/index.ts'\nimport { t } from '../../l10n.ts'\nimport { userStatus } from '../../mixins/index.js'\nimport { getAvatarUrl } from '../../utils/getAvatarUrl.ts'\nimport { isLegacy35 } from '../../utils/legacy.ts'\nimport { logger } from '../../utils/logger.ts'\nimport { getUserStatusText } from '../../utils/UserStatus.ts'\nimport NcActionButton from '../NcActionButton/index.js'\nimport NcActionLink from '../NcActionLink/index.js'\nimport NcActionRouter from '../NcActionRouter/index.js'\nimport NcActions from '../NcActions/index.js'\nimport NcActionText from '../NcActionText/index.js'\nimport NcButton from '../NcButton/index.ts'\nimport NcIconSvgWrapper from '../NcIconSvgWrapper/index.ts'\nimport NcLoadingIcon from '../NcLoadingIcon/index.ts'\nimport NcPopover from '../NcPopover/index.js'\nimport NcUserStatusIcon from '../NcUserStatusIcon/index.js'\n\nconst browserStorage = getBuilder('nextcloud').persist().build()\n\n/**\n * @param {string} userId The id of the user\n */\nfunction getUserHasAvatar(userId) {\n\tconst flag = browserStorage.getItem('user-has-avatar.' + userId)\n\tif (typeof flag === 'string') {\n\t\treturn Boolean(flag)\n\t}\n\treturn null\n}\n\n/**\n * @param {string} userId The id of the user\n * @param {boolean} flag Has the user an avatar\n */\nfunction setUserHasAvatar(userId, flag) {\n\tif (userId) {\n\t\tbrowserStorage.setItem('user-has-avatar.' + userId, flag)\n\t}\n}\n\nexport default {\n\tname: 'NcAvatar',\n\n\tdirectives: {\n\t\t/** @type {import('vue').ObjectDirective} */\n\t\tClickOutside,\n\t},\n\n\tcomponents: {\n\t\tIconDotsHorizontal,\n\t\tNcActions,\n\t\tNcButton,\n\t\tNcIconSvgWrapper,\n\t\tNcLoadingIcon,\n\t\tNcPopover,\n\t\tNcProfileHoverCard: defineAsyncComponent(() => import('../NcProfileHoverCard/NcProfileHoverCard.vue')),\n\t\tNcUserStatusIcon,\n\t},\n\n\tmixins: [userStatus],\n\tprops: {\n\t\t/**\n\t\t * Set a custom url to the avatar image\n\t\t * either the url, user or displayName property must be defined\n\t\t */\n\t\turl: {\n\t\t\ttype: String,\n\t\t\tdefault: undefined,\n\t\t},\n\n\t\t/**\n\t\t * Set a css icon-class for an icon to be used instead of the avatar.\n\t\t */\n\t\ticonClass: {\n\t\t\ttype: String,\n\t\t\tdefault: undefined,\n\t\t},\n\n\t\t/**\n\t\t * Set the user id to fetch the avatar\n\t\t * either the url, user or displayName property must be defined\n\t\t */\n\t\tuser: {\n\t\t\ttype: String,\n\t\t\tdefault: undefined,\n\t\t},\n\n\t\t/**\n\t\t * Do not show the user status on the avatar.\n\t\t */\n\t\thideStatus: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Show the verbose user status (e.g. \"online\" / \"away\") instead of just the status icon.\n\t\t */\n\t\tverboseStatus: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * When the user status was preloaded via another source it can be handed in with this property to save the request.\n\t\t * If this property is not set the status will be fetched automatically.\n\t\t * If a preloaded no-status is available provide this object with properties \"status\", \"icon\" and \"message\" set to null.\n\t\t */\n\t\tpreloadedUserStatus: {\n\t\t\ttype: Object,\n\t\t\tdefault: undefined,\n\t\t},\n\n\t\t/**\n\t\t * Is the user a guest user (then we have to user a different endpoint)\n\t\t */\n\t\tisGuest: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Set a display name that will be rendered as a tooltip\n\t\t * either the url, user or displayName property must be defined\n\t\t * specify just the displayname to generate a placeholder avatar without\n\t\t * trying to fetch the avatar based on the user id\n\t\t */\n\t\tdisplayName: {\n\t\t\ttype: String,\n\t\t\tdefault: undefined,\n\t\t},\n\n\t\t/**\n\t\t * Set a size in px for the rendered avatar\n\t\t */\n\t\tsize: {\n\t\t\ttype: Number,\n\t\t\tdefault: 32,\n\t\t},\n\n\t\t/**\n\t\t * Do not automatically generate a placeholder avatars if there is no real avatar is available.\n\t\t */\n\t\tnoPlaceholder: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Disable the tooltip\n\t\t */\n\t\tdisableTooltip: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Disable the menu\n\t\t */\n\t\tdisableMenu: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Declares a custom tooltip when not null\n\t\t * Fallback will be the displayName\n\t\t *\n\t\t * requires disableTooltip not to be set to true\n\t\t */\n\t\ttooltipMessage: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Declares username is not a user's name, when true.\n\t\t * Prevents loading user's avatar from server and forces generating colored initials,\n\t\t * i.e. if the user is a group\n\t\t */\n\t\tisNoUser: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Selector for the popover menu container\n\t\t */\n\t\tmenuContainer: {\n\t\t\ttype: [Boolean, String],\n\t\t\tdefault: 'body',\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst isDarkTheme = useIsDarkTheme()\n\n\t\treturn {\n\t\t\tisDarkTheme,\n\t\t\tisLegacy35,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tavatarUrlLoaded: null,\n\t\t\tavatarSrcSetLoaded: null,\n\t\t\tuserDoesNotExist: false,\n\t\t\tisAvatarLoaded: false,\n\t\t\tisMenuLoaded: false,\n\t\t\tcontactsMenuLoading: false,\n\t\t\tcontactsMenuData: {},\n\t\t\tcontactsMenuActions: [],\n\t\t\tcontactsMenuOpenState: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tavatarAriaLabel() {\n\t\t\t// aria-label is only allowed on interactive elements\n\t\t\tif (!this.hasMenu) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.canDisplayUserStatus || this.showUserStatusIconOnAvatar) {\n\t\t\t\treturn t('Avatar of {displayName}, {status}', { displayName: this.displayName ?? this.user, status: getUserStatusText(this.userStatus.status) })\n\t\t\t}\n\t\t\treturn t('Avatar of {displayName}', { displayName: this.displayName ?? this.user })\n\t\t},\n\n\t\tcanDisplayUserStatus() {\n\t\t\treturn !this.hideStatus\n\t\t\t\t&& this.hasStatus\n\t\t\t\t&& ['online', 'away', 'busy', 'dnd'].includes(this.userStatus.status)\n\t\t},\n\n\t\tshowUserStatusIconOnAvatar() {\n\t\t\treturn !this.hideStatus\n\t\t\t\t&& !this.verboseStatus\n\t\t\t\t&& this.hasStatus\n\t\t\t\t&& this.userStatus.status !== 'dnd'\n\t\t\t\t&& this.userStatus.icon\n\t\t},\n\n\t\t/**\n\t\t * The user identifier, either the display name if set or the user property\n\t\t * If both properties are not set an empty string is returned\n\t\t */\n\t\tuserIdentifier() {\n\t\t\tif (this.isDisplayNameDefined) {\n\t\t\t\treturn this.displayName\n\t\t\t}\n\t\t\tif (this.isUserDefined) {\n\t\t\t\treturn this.user\n\t\t\t}\n\t\t\treturn ''\n\t\t},\n\n\t\tisUserDefined() {\n\t\t\treturn typeof this.user !== 'undefined'\n\t\t},\n\n\t\tisDisplayNameDefined() {\n\t\t\treturn typeof this.displayName !== 'undefined'\n\t\t},\n\n\t\tisUrlDefined() {\n\t\t\treturn typeof this.url !== 'undefined'\n\t\t},\n\n\t\thasMenu() {\n\t\t\tif (this.disableMenu) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (this.isLegacy35) {\n\t\t\t\t// Legacy contacts menu: hide for current user / invalid avatars.\n\t\t\t\tif (this.isMenuLoaded) {\n\t\t\t\t\treturn this.menu.length > 0\n\t\t\t\t}\n\t\t\t\treturn !(this.user === getCurrentUser()?.uid || this.userDoesNotExist || this.url)\n\t\t\t}\n\t\t\t// Profile hover card for any real user avatar, including the current user.\n\t\t\treturn Boolean(this.user) && !this.isNoUser && !this.url && !this.userDoesNotExist\n\t\t},\n\n\t\t/**\n\t\t * True if initials should be shown as the user icon fallback\n\t\t */\n\t\tshowInitials() {\n\t\t\treturn !this.noPlaceholder && this.userDoesNotExist && !(this.iconClass || this.$slots.icon)\n\t\t},\n\n\t\tavatarStyle() {\n\t\t\treturn {\n\t\t\t\t'--avatar-size': this.size + 'px',\n\t\t\t\tlineHeight: this.showInitials ? (this.size + 'px') : 0,\n\t\t\t\tfontSize: Math.round(this.size * 0.45) + 'px',\n\t\t\t}\n\t\t},\n\n\t\tinitialsWrapperStyle() {\n\t\t\tconst { r, g, b } = usernameToColor(this.userIdentifier)\n\t\t\treturn {\n\t\t\t\tbackgroundColor: `rgba(${r}, ${g}, ${b}, 0.1)`,\n\t\t\t}\n\t\t},\n\n\t\tinitialsStyle() {\n\t\t\tconst { r, g, b } = usernameToColor(this.userIdentifier)\n\t\t\treturn {\n\t\t\t\tcolor: `rgb(${r}, ${g}, ${b})`,\n\t\t\t}\n\t\t},\n\n\t\ttooltip() {\n\t\t\tif (this.disableTooltip) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (this.tooltipMessage) {\n\t\t\t\treturn this.tooltipMessage\n\t\t\t}\n\n\t\t\treturn this.displayName\n\t\t},\n\n\t\t/**\n\t\t * Get the (max. two) initials of the user as uppcase string\n\t\t */\n\t\tinitials() {\n\t\t\tlet initials = '?'\n\t\t\tif (this.showInitials) {\n\t\t\t\tconst user = this.userIdentifier.trim()\n\t\t\t\tif (user === '') {\n\t\t\t\t\treturn initials\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Filtered user name, without special characters so only letters and numbers are allowed (prevent e.g. '(' as an initial)\n\t\t\t\t * \\p{L}: Letters of all languages\n\t\t\t\t * \\p{N}: Numbers of all languages\n\t\t\t\t * \\s: White space for breaking the string\n\t\t\t\t *\n\t\t\t\t * @type {string}\n\t\t\t\t */\n\t\t\t\tconst filteredChars = user.match(/[\\p{L}\\p{N}\\s]/gu)\n\t\t\t\tif (!filteredChars) {\n\t\t\t\t\treturn initials\n\t\t\t\t}\n\n\t\t\t\tconst filtered = filteredChars.join('').trim()\n\t\t\t\tconst idx = filtered.lastIndexOf(' ')\n\t\t\t\tinitials = String.fromCodePoint(filtered.codePointAt(0))\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\tinitials = initials.concat(String.fromCodePoint(filtered.codePointAt(idx + 1)))\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn initials.toLocaleUpperCase()\n\t\t},\n\n\t\t/**\n\t\t * Contacts menu actions for the hover card.\n\t\t * `null` until actions are loaded so the card can fall back to profile API actions.\n\t\t *\n\t\t * @return {Array|null}\n\t\t */\n\t\thoverCardActions() {\n\t\t\tif (this.isLegacy35 || !this.isMenuLoaded) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.menu.length > 0 ? this.menu : null\n\t\t},\n\n\t\t/**\n\t\t * Status already known by this avatar so the hover card does not fetch it again.\n\t\t * Omitted while status is still the empty default (fetch in progress).\n\t\t *\n\t\t * @return {object|undefined}\n\t\t */\n\t\thoverCardPreloadedUserStatus() {\n\t\t\tif (this.preloadedUserStatus) {\n\t\t\t\treturn this.userStatus\n\t\t\t}\n\t\t\tif (this.userStatus.status || this.userStatus.icon || this.userStatus.message) {\n\t\t\t\treturn this.userStatus\n\t\t\t}\n\t\t\treturn undefined\n\t\t},\n\n\t\tmenu() {\n\t\t\tif (this.isLegacy35) {\n\t\t\t\treturn this.legacyMenu\n\t\t\t}\n\n\t\t\tconst actions = this.contactsMenuActions.map((item) => {\n\t\t\t\tconst route = getRoute(this.$router, item.hyperlink)\n\t\t\t\treturn {\n\t\t\t\t\tid: item.id,\n\t\t\t\t\tappId: item.appId,\n\t\t\t\t\ttext: item.title,\n\t\t\t\t\thref: route ? undefined : item.hyperlink,\n\t\t\t\t\tto: route || undefined,\n\t\t\t\t\ticon: item.icon,\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tfor (const action of getEnabledContactsMenuActions(this.contactsMenuData)) {\n\t\t\t\ttry {\n\t\t\t\t\tactions.push({\n\t\t\t\t\t\tid: action.id,\n\t\t\t\t\t\ttext: action.displayName(this.contactsMenuData),\n\t\t\t\t\t\ticonSvg: action.iconSvg(this.contactsMenuData),\n\t\t\t\t\t\tonClick: () => action.callback(this.contactsMenuData),\n\t\t\t\t\t})\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error(`Failed to render ContactsMenu action ${action.id}`, {\n\t\t\t\t\t\terror,\n\t\t\t\t\t\taction,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn actions\n\t\t},\n\n\t\t/**\n\t\t * Legacy NcActions menu entries for Nextcloud 32–34.\n\t\t *\n\t\t * @return {Array}\n\t\t */\n\t\tlegacyMenu() {\n\t\t\tconst actions = this.contactsMenuActions.map((item) => {\n\t\t\t\tconst route = getRoute(this.$router, item.hyperlink)\n\t\t\t\treturn {\n\t\t\t\t\tncActionComponent: route ? NcActionRouter : NcActionLink,\n\t\t\t\t\tncActionComponentProps: route\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tto: route,\n\t\t\t\t\t\t\t\ticon: item.icon,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\thref: item.hyperlink,\n\t\t\t\t\t\t\t\ticon: item.icon,\n\t\t\t\t\t\t\t},\n\t\t\t\t\ttext: item.title,\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tfor (const action of getEnabledContactsMenuActions(this.contactsMenuData)) {\n\t\t\t\ttry {\n\t\t\t\t\tactions.push({\n\t\t\t\t\t\tncActionComponent: NcActionButton,\n\t\t\t\t\t\tncActionComponentProps: {\n\t\t\t\t\t\t\tonClick: () => action.callback(this.contactsMenuData),\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttext: action.displayName(this.contactsMenuData),\n\t\t\t\t\t\ticonSvg: action.iconSvg(this.contactsMenuData),\n\t\t\t\t\t})\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error(`Failed to render ContactsMenu action ${action.id}`, {\n\t\t\t\t\t\terror,\n\t\t\t\t\t\taction,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * @param {string} html The HTML to escape\n\t\t\t */\n\t\t\tfunction escape(html) {\n\t\t\t\tconst text = document.createTextNode(html)\n\t\t\t\tconst p = document.createElement('p')\n\t\t\t\tp.appendChild(text)\n\t\t\t\treturn p.innerHTML\n\t\t\t}\n\n\t\t\tif (!this.hideStatus && (this.userStatus.icon || this.userStatus.message)) {\n\t\t\t\t// NcAction's URL icons are inverted in dark mode, so we need to pass SVG image in the icon slot\n\t\t\t\tconst emojiIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\">\n\t\t\t\t\t<text x=\"50%\" y=\"50%\" text-anchor=\"middle\" style=\"dominant-baseline: central; font-size: 85%\">${escape(this.userStatus.icon)}</text>\n\t\t\t\t</svg>`\n\t\t\t\treturn [{\n\t\t\t\t\tncActionComponent: NcActionText,\n\t\t\t\t\tncActionComponentProps: {},\n\t\t\t\t\ticonSvg: this.userStatus.icon ? emojiIcon : undefined,\n\t\t\t\t\ttext: `${this.userStatus.message}`,\n\t\t\t\t}].concat(actions)\n\t\t\t}\n\n\t\t\treturn actions\n\t\t},\n\t},\n\n\twatch: {\n\t\turl() {\n\t\t\tthis.userDoesNotExist = false\n\t\t\tthis.loadAvatarUrl()\n\t\t},\n\n\t\tuser() {\n\t\t\tthis.userDoesNotExist = false\n\t\t\tthis.isMenuLoaded = false\n\t\t\tthis.loadAvatarUrl()\n\t\t},\n\n\t\tpreloadedUserStatus(status) {\n\t\t\tif (status) {\n\t\t\t\tthis.setUserStatus(status)\n\t\t\t}\n\t\t},\n\n\t\tcontactsMenuOpenState(shown) {\n\t\t\t// Hover card opens on hover/focus; debounce the contacts menu fetch.\n\t\t\t// Legacy NcActions loads on click via toggleMenu.\n\t\t\tif (this.isLegacy35) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (shown) {\n\t\t\t\tthis.debouncedFetchContactsMenu()\n\t\t\t} else {\n\t\t\t\tthis.debouncedFetchContactsMenu.clear()\n\t\t\t}\n\t\t},\n\t},\n\n\tcreated() {\n\t\tthis.debouncedFetchContactsMenu = debounce(this.fetchContactsMenu, 300)\n\t},\n\n\tmounted() {\n\t\tthis.loadAvatarUrl()\n\t\tsubscribe('settings:avatar:updated', this.loadAvatarUrl)\n\t\tsubscribe('settings:display-name:updated', this.loadAvatarUrl)\n\t\tif (!this.hideStatus && this.user && !this.isNoUser) {\n\t\t\tif (!this.preloadedUserStatus) {\n\t\t\t\tthis.fetchUserStatus(this.user)\n\t\t\t} else {\n\t\t\t\tthis.setUserStatus(this.preloadedUserStatus)\n\t\t\t}\n\t\t\tsubscribe('user_status:status.updated', this.handleUserStatusUpdated)\n\t\t} else if (!this.hideStatus && this.preloadedUserStatus) {\n\t\t\t// Always set preloaded status if provided\n\t\t\tthis.setUserStatus(this.preloadedUserStatus)\n\t\t}\n\t},\n\n\tbeforeUnmount() {\n\t\tthis.debouncedFetchContactsMenu.clear()\n\t\tunsubscribe('settings:avatar:updated', this.loadAvatarUrl)\n\t\tunsubscribe('settings:display-name:updated', this.loadAvatarUrl)\n\t\tunsubscribe('user_status:status.updated', this.handleUserStatusUpdated)\n\t},\n\n\tmethods: {\n\t\tt,\n\t\thandleUserStatusUpdated(state) {\n\t\t\tif (this.user === state.userId) {\n\t\t\t\tthis.userStatus = {\n\t\t\t\t\tstatus: state.status,\n\t\t\t\t\ticon: state.icon,\n\t\t\t\t\tmessage: state.message,\n\t\t\t\t}\n\t\t\t\tthis.hasStatus = state.status !== null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Toggle the legacy popover menu on click or enter\n\t\t *\n\t\t * @param {KeyboardEvent|MouseEvent} event the UI event\n\t\t */\n\t\tasync toggleMenu(event) {\n\t\t\tif (event.type === 'keydown' && event.key !== 'Enter') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!this.contactsMenuOpenState) {\n\t\t\t\tawait this.fetchContactsMenu()\n\t\t\t}\n\t\t\tthis.contactsMenuOpenState = !this.contactsMenuOpenState\n\t\t},\n\n\t\tcloseMenu() {\n\t\t\t// Only used by the legacy NcActions path (click-outside).\n\t\t\tif (!this.isLegacy35) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.contactsMenuOpenState = false\n\t\t},\n\n\t\tasync fetchContactsMenu() {\n\t\t\tthis.contactsMenuLoading = true\n\t\t\ttry {\n\t\t\t\tconst user = encodeURIComponent(this.user)\n\t\t\t\tconst { data } = await axios.post(generateUrl('contactsmenu/findOne'), `shareType=0&shareWith=${user}`)\n\t\t\t\tthis.contactsMenuData = data\n\t\t\t\tthis.contactsMenuActions = data.topAction ? [data.topAction].concat(data.actions) : data.actions\n\t\t\t} catch {\n\t\t\t\tthis.contactsMenuData = {}\n\t\t\t\tthis.contactsMenuActions = []\n\t\t\t\tif (this.isLegacy35) {\n\t\t\t\t\tthis.contactsMenuOpenState = false\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.contactsMenuLoading = false\n\t\t\tthis.isMenuLoaded = true\n\t\t},\n\n\t\t/**\n\t\t * Handle avatar loading if user or url defined\n\t\t */\n\t\tloadAvatarUrl() {\n\t\t\tthis.isAvatarLoaded = false\n\n\t\t\t/** Only run avatar image loading if either user or url property is defined */\n\t\t\tif (!this.isUrlDefined && (!this.isUserDefined || this.isNoUser || this.iconClass || this.$slots.icon)) {\n\t\t\t\tthis.isAvatarLoaded = true\n\t\t\t\tthis.userDoesNotExist = true\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Directly use the url if defined\n\t\t\tif (this.isUrlDefined) {\n\t\t\t\tthis.updateImageIfValid(this.url)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (this.size <= 64) {\n\t\t\t\tconst avatarUrl = this.avatarUrlGenerator(this.user, 64)\n\t\t\t\tconst srcset = [\n\t\t\t\t\tavatarUrl + ' 1x',\n\t\t\t\t\tthis.avatarUrlGenerator(this.user, 512) + ' 8x',\n\t\t\t\t].join(', ')\n\n\t\t\t\tthis.updateImageIfValid(avatarUrl, srcset)\n\t\t\t} else {\n\t\t\t\tconst avatarUrl = this.avatarUrlGenerator(this.user, 512)\n\t\t\t\tthis.updateImageIfValid(avatarUrl)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Generate an avatar url from the server's avatar endpoint\n\t\t *\n\t\t * @param {string} user the user id\n\t\t * @param {number} size the desired size\n\t\t * @return {string}\n\t\t */\n\t\tavatarUrlGenerator(user, size) {\n\t\t\tlet avatarUrl = getAvatarUrl(user, {\n\t\t\t\tsize,\n\t\t\t\tisDarkTheme: this.isDarkTheme,\n\t\t\t\tisGuest: this.isGuest,\n\t\t\t})\n\n\t\t\t// eslint-disable-next-line camelcase\n\t\t\tif (user === getCurrentUser()?.uid && typeof oc_userconfig !== 'undefined') {\n\t\t\t\tavatarUrl += '?v=' + window.oc_userconfig.avatar.version\n\t\t\t}\n\n\t\t\treturn avatarUrl\n\t\t},\n\n\t\t/**\n\t\t * Check if the provided url is valid and update Avatar if so\n\t\t *\n\t\t * @param {string} url the avatar url\n\t\t * @param {Array} srcset the avatar srcset\n\t\t */\n\t\tupdateImageIfValid(url, srcset = null) {\n\t\t\t// skip loading\n\t\t\tconst userHasAvatar = getUserHasAvatar(this.user)\n\t\t\tif (this.isUserDefined && typeof userHasAvatar === 'boolean') {\n\t\t\t\tthis.isAvatarLoaded = true\n\t\t\t\tthis.avatarUrlLoaded = url\n\t\t\t\tif (srcset) {\n\t\t\t\t\tthis.avatarSrcSetLoaded = srcset\n\t\t\t\t}\n\t\t\t\tif (userHasAvatar === false) {\n\t\t\t\t\tthis.userDoesNotExist = true\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst img = new Image()\n\t\t\timg.onload = () => {\n\t\t\t\tthis.avatarUrlLoaded = url\n\t\t\t\tif (srcset) {\n\t\t\t\t\tthis.avatarSrcSetLoaded = srcset\n\t\t\t\t}\n\t\t\t\tthis.isAvatarLoaded = true\n\t\t\t\t// re-get to avoid concurrent access\n\t\t\t\tsetUserHasAvatar(this.user, true)\n\t\t\t}\n\t\t\timg.onerror = (error) => {\n\t\t\t\tlogger.debug('[NcAvatar] Invalid avatar url', { error, url })\n\t\t\t\t// Avatar is invalid, reset\n\t\t\t\tthis.avatarUrlLoaded = null\n\t\t\t\tthis.avatarSrcSetLoaded = null\n\n\t\t\t\tthis.userDoesNotExist = true\n\t\t\t\tthis.isAvatarLoaded = false\n\t\t\t\tsetUserHasAvatar(this.user, false)\n\t\t\t}\n\n\t\t\tif (srcset) {\n\t\t\t\timg.srcset = srcset\n\t\t\t}\n\t\t\timg.src = url\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.avatardiv {\n\tposition: relative;\n\tdisplay: inline-block;\n\twidth: var(--avatar-size);\n\theight: var(--avatar-size);\n\n\t&--unknown {\n\t\tposition: relative;\n\t\tbackground-color: var(--color-main-background);\n\t\twhite-space: normal;\n\t}\n\n\t&:not(&--unknown) {\n\t\t// White/black background for avatars with transparency\n\t\tbackground-color: var(--color-main-background) !important;\n\t\tbox-shadow: 0 0 5px rgba(0, 0, 0, 0.05) inset;\n\t}\n\n\t&--with-menu {\n\t\tcursor: pointer;\n\t\tposition: relative;\n\t}\n\n\t&--with-legacy-menu {\n\t\t.action-item {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tinset-inline-start: 0;\n\t\t}\n\t\t:deep(.action-item__menutoggle) {\n\t\t\tcursor: pointer;\n\t\t\topacity: 0;\n\t\t}\n\t\t&:focus-within,\n\t\t&:hover,\n\t\t&.avatardiv--with-menu-loading {\n\t\t\t:deep(.action-item__menutoggle) {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t\timg {\n\t\t\t\topacity: 0.3;\n\t\t\t}\n\t\t}\n\t\t:deep(.action-item__menutoggle),\n\t\timg {\n\t\t\ttransition: opacity var(--animation-quick);\n\t\t}\n\t\t:deep() {\n\t\t\t.button-vue,\n\t\t\t.button-vue__icon {\n\t\t\t\theight: var(--avatar-size);\n\t\t\t\tmin-height: var(--avatar-size);\n\t\t\t\twidth: var(--avatar-size) !important;\n\t\t\t\tmin-width: var(--avatar-size);\n\t\t\t}\n\t\t}\n\t\t& > :deep(.button-vue),\n\t\t& > :deep(.action-item .button-vue) {\n\t\t\t--button-radius: calc(var(--avatar-size) / 2);\n\t\t}\n\t}\n\n\t.avatar-profile-popover {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tz-index: 1;\n\n\t\t&__trigger {\n\t\t\tdisplay: block;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tborder-radius: inherit;\n\t\t\toutline: none;\n\t\t}\n\t}\n\n\t.avatardiv__initials-wrapper {\n\t\tdisplay: block;\n\t\theight: var(--avatar-size);\n\t\twidth: var(--avatar-size);\n\t\tbackground-color: var(--color-main-background);\n\t\tborder-radius: calc(var(--avatar-size) / 2);\n\n\t\t.avatardiv__initials {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tinset-inline-start: 0;\n\t\t\tdisplay: block;\n\t\t\twidth: 100%;\n\t\t\ttext-align: center;\n\t\t\tfont-weight: var(--font-weight-default, normal);\n\t\t}\n\t}\n\n\timg {\n\t\t// Cover entire area\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\t// Keep ratio\n\t\tobject-fit: cover;\n\t}\n\n\t.material-design-icon {\n\t\twidth: var(--avatar-size);\n\t\theight: var(--avatar-size);\n\t}\n\n\t.avatardiv__user-status {\n\t\t// Size of the status icon to make it:\n\t\t// - 💫 Orbital: the status icon's center is positioned on the avatar circle\n\t\t// - ⏹️ Best-fit: the status icon is as large as possible without exceeding the avatar box\n\t\t// See PR for math explanation: PR #6004\n\t\t--avatar-status-size-orbital: calc(var(--avatar-size) * (1 - 1 / sqrt(2)));\n\t\t// Limit the status icon size to minimum font size to keep it readable\n\t\t// Ideally avatars with a smaller should not be used with the status icon at all\n\t\t--avatar-status-size-min: var(--font-size-small);\n\t\t--avatar-status-size: max(var(--avatar-status-size-orbital), var(--avatar-status-size-min));\n\t\tbox-sizing: border-box;\n\t\tposition: absolute;\n\t\tinset-inline-end: 0;\n\t\tinset-block-end: 0;\n\t\theight: var(--avatar-status-size);\n\t\twidth: var(--avatar-status-size);\n\t\tline-height: 1;\n\t\tfont-size: calc(var(--avatar-status-size) / 1.2);\n\t\tbackground-color: var(--color-main-background);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-size: var(--avatar-status-size);\n\t\tbackground-position: center;\n\t\tborder-radius: 50%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\t.acli:hover & {\n\t\t\tborder-color: var(--color-background-hover);\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t}\n\t\t.acli.active & {\n\t\t\tborder-color: var(--color-primary-element-light);\n\t\t\tbackground-color: var(--color-primary-element-light);\n\t\t}\n\n\t\t&--icon {\n\t\t\tborder: none;\n\t\t\tbackground-color: transparent;\n\t\t}\n\t}\n\n\t.popovermenu-wrapper {\n\t\tposition: relative;\n\t\tdisplay: inline-block;\n\t}\n}\n\n.avatar-class-icon {\n\tdisplay: block;\n\tborder-radius: calc(var(--avatar-size) / 2);\n\tbackground-color: var(--color-background-darker);\n\theight: 100%;\n}\n\n</style>\n"],"names":["ClickOutside","_createElementBlock","_renderSlot","_normalizeClass","_Fragment","_createBlock","_openBlock","_renderList","_resolveDynamicComponent","_mergeProps","_createSlots","_toDisplayString","_createVNode","_withCtx","_createElementVNode"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import '../assets/NcBlurHash-RgrahjEp.css';
1
+ import '../assets/NcBlurHash.css';
2
2
  import { defineComponent, ref, watch, nextTick, openBlock, createBlock, Transition, withCtx, createElementBlock } from "vue";
3
3
  import { decode } from "blurhash";
4
4
  import { preloadImage } from "../functions/preloadImage/index.mjs";
5
- import { l as logger } from "./logger-D3RVzcfQ.mjs";
6
- import { _ as _export_sfc } from "./_plugin-vue_export-helper-1tPrXgE0.mjs";
5
+ import { l as logger } from "./logger.mjs";
6
+ import { _ as _export_sfc } from "./_plugin-vue_export-helper.mjs";
7
7
  const _hoisted_1 = ["aria-hidden", "aria-label"];
8
8
  const _hoisted_2 = ["alt", "src"];
9
9
  const _sfc_main = /* @__PURE__ */ defineComponent({
@@ -83,8 +83,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
83
83
  };
84
84
  }
85
85
  });
86
- const fadeTransition = "_fadeTransition_d3xcu";
87
- const fadeTransitionActive = "_fadeTransitionActive_V2TrY";
86
+ const fadeTransition = "_fadeTransition_jQT-T";
87
+ const fadeTransitionActive = "_fadeTransitionActive_8RRlj";
88
88
  const style0 = {
89
89
  fadeTransition,
90
90
  fadeTransitionActive
@@ -96,4 +96,4 @@ const NcBlurHash = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssM
96
96
  export {
97
97
  NcBlurHash as N
98
98
  };
99
- //# sourceMappingURL=NcBlurHash-B30Ol8KP.mjs.map
99
+ //# sourceMappingURL=NcBlurHash.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NcBlurHash.mjs","sources":["../../src/components/NcBlurHash/NcBlurHash.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<docs>\n## BlurHash\n\nA [blur hash](https://blurha.sh/) is a very compact representation of an image,\nthat can be used as a placeholder until the image was fully loaded.\n\n### Image placeholder\n\nThe default use case is as a placeholder that is transferred in initial state,\nwhile the real image will be fetched from the network.\nIn this case the image source can be passed to the component.\nThe component will immediately start to preload it,\nas soon as it is loaded the blur hash will be swapped with the real image and this component will behave like an `<a>`-element.\n\n```vue\n\t<template>\n\t\t<div class=\"wrapper\">\n\t\t\t<NcBlurHash class=\"shown-image\"\n\t\t\t\t:hash=\"blurHash\"\n\t\t\t\t:src=\"imageSource\"\n\t\t\t\t@load=\"onLoaded\" />\n\n\t\t\t<NcButton @click=\"toggleImage\">\n\t\t\t\t{{\n\t\t\t\t\tloading\n\t\t\t\t\t\t? 'Loading...'\n\t\t\t\t\t\t: (loaded ? 'Unload image' : 'Load image')\n\t\t\t\t}}\n\t\t\t</NcButton>\n\t\t</div>\n\t</template>\n\t<script>\n\texport default {\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tloaded: false,\n\t\t\t\tloading: false,\n\t\t\t\tblurHash: 'M8CR]OkDD%kD9ZtRayofaykC00ay$_ay~T',\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// This is cheating but we can not emulate slow network connection\n\t\t\t// so imagine that this means the source becomes loaded\n\t\t\timageSource() {\n\t\t\t\treturn this.loaded\n\t\t\t\t\t? 'favicon-touch.png'\n\t\t\t\t\t: 'invalid-file-that-will-never-load.png'\n\t\t\t},\n\t\t},\n\t\tmethods: {\n\t\t\ttoggleImage() {\n\t\t\t\tif (this.loaded) {\n\t\t\t\t\tthis.loaded = false\n\t\t\t\t\tthis.loading = false\n\t\t\t\t} else {\n\t\t\t\t\t// emulate slow network\n\t\t\t\t\tthis.loading = true\n\t\t\t\t\twindow.setTimeout(() => {\n\t\t\t\t\t\tthis.loaded = !this.loaded\n\t\t\t\t\t\tthis.loading = false\n\t\t\t\t\t}, 3000)\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// you could use `success` here (boolean) to decide if the image is loaded or failed\n\t\t\tonLoaded(success) {\n\t\t\t\t// ...\n\t\t\t},\n\t\t},\n\t}\n\t</script>\n\t<style scoped>\n\t\t.wrapper {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\talign-items: center;\n\t\t\tgap: 12px;\n\t\t}\n\n\t\t.shown-image {\n\t\t\twidth: 150px;\n\t\t\theight: 150px;\n\t\t\tborder-radius: 24px;\n\t\t}\n\t</style>\n```\n\n### Manual usage as a placeholder\n\nUsing `v-if` is also possible, this can e.g. used if the image is not loaded from an URL.\n\n```vue\n\t<template>\n\t\t<div class=\"wrapper\">\n\t\t\t<img :class=\"loaded ? 'shown-image' : 'hidden-visually'\"\n\t\t\t\talt=\"\"\n\t\t\t\tsrc=\"favicon-touch.png\">\n\t\t\t<NcBlurHash v-if=\"!loaded\"\n\t\t\t\tclass=\"shown-image\"\n\t\t\t\t:hash=\"blurHash\" />\n\t\t\t<NcButton @click=\"loaded = !loaded\">Toggle blur hash</NcButton>\n\t\t</div>\n\t</template>\n\t<script>\n\texport default {\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tloaded: false,\n\t\t\t\tblurHash: 'M8CR]OkDD%kD9ZtRayofaykC00ay$_ay~T',\n\t\t\t}\n\t\t},\n\t}\n\t</script>\n\t<style scoped>\n\t\t.wrapper {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\talign-items: center;\n\t\t\tgap: 12px;\n\t\t}\n\n\t\t.shown-image {\n\t\t\twidth: 150px;\n\t\t\theight: 150px;\n\t\t\tborder-radius: 24px;\n\t\t}\n\t</style>\n```\n</docs>\n\n<script setup lang=\"ts\">\nimport { decode } from 'blurhash'\nimport { nextTick, ref, watch } from 'vue'\nimport { preloadImage } from '../../functions/preloadImage/index.ts'\nimport { logger } from '../../utils/logger.ts'\n\nconst props = defineProps<{\n\t/**\n\t * The blur hash value to use.\n\t */\n\thash: string\n\n\t/**\n\t * This is normally not needed, but if this blur hash is not only intended\n\t * for decorative purpose, descriptive text should be passed for accessibility.\n\t */\n\talt?: string\n\n\t/**\n\t * Optional an image source to load, during the load the blur hash is shown.\n\t * As soon as it is loaded the image will be shown instead.\n\t */\n\tsrc?: string\n}>()\nconst emit = defineEmits<{\n\t/**\n\t * Emitted when the image (`src`) has been loaded.\n\t */\n\tload: [boolean]\n}>()\n\nconst canvas = ref()\nconst imageLoaded = ref(false)\n\n// Redraw when hash has changed\nwatch(() => props.hash, drawBlurHash)\n// Redraw if image loaded again - also draw immediate on mount\nwatch(imageLoaded, () => {\n\tif (imageLoaded.value === false) {\n\t\t// We need to wait one tick to make sure the canvas is in the DOM\n\t\tnextTick(() => drawBlurHash())\n\t}\n}, { immediate: true })\n\n// Preload image on source change\nwatch(() => props.src, () => {\n\timageLoaded.value = false\n\tif (props.src) {\n\t\tpreloadImage(props.src)\n\t\t\t.then((success) => {\n\t\t\t\timageLoaded.value = success\n\t\t\t\temit('load', success)\n\t\t\t})\n\t}\n}, { immediate: true })\n\n/**\n * Render the BlurHash within the canvas\n */\nfunction drawBlurHash() {\n\tif (imageLoaded.value) {\n\t\t// skip\n\t\treturn\n\t}\n\n\tif (!props.hash) {\n\t\tlogger.error('Invalid BlurHash value')\n\t\treturn\n\t}\n\n\tif (canvas.value === undefined) {\n\t\t// Should never happen but better safe than sorry\n\t\tlogger.error('BlurHash canvas not available')\n\t\treturn\n\t}\n\n\tconst { height, width } = canvas.value\n\tconst pixels = decode(props.hash, width, height)\n\n\tconst ctx = canvas.value.getContext('2d')\n\tif (ctx === null) {\n\t\tlogger.error('Cannot create context for BlurHash canvas')\n\t\treturn\n\t}\n\n\tconst imageData = ctx.createImageData(width, height)\n\timageData.data.set(pixels)\n\tctx.putImageData(imageData, 0, 0)\n}\n</script>\n\n<template>\n\t<Transition\n\t\t:css=\"src ? undefined : false\"\n\t\t:enterActiveClass=\"$style.fadeTransition\"\n\t\t:leaveActiveClass=\"$style.fadeTransition\"\n\t\t:enterClass=\"$style.fadeTransitionActive\"\n\t\t:leaveToClass=\"$style.fadeTransitionActive\">\n\t\t<canvas\n\t\t\tv-if=\"!imageLoaded\"\n\t\t\tref=\"canvas\"\n\t\t\t:aria-hidden=\"alt ? undefined : 'true'\"\n\t\t\t:aria-label=\"alt\" />\n\t\t<img v-else :alt=\"alt\" :src=\"src\">\n\t</Transition>\n</template>\n\n<style module>\n.fadeTransition {\n\ttransition: all var(--animation-quick) ease;\n}\n\n.fadeTransitionActive {\n\topacity: 0;\n\tposition: absolute;\n}\n</style>\n"],"names":["_createBlock","_Transition","$style","_createElementBlock"],"mappings":";;;;;;;;;;;;;;;;AA6IA,UAAM,QAAQ;AAkBd,UAAM,OAAO;AAOb,UAAM,SAAS,IAAA;AACf,UAAM,cAAc,IAAI,KAAK;AAG7B,UAAM,MAAM,MAAM,MAAM,YAAY;AAEpC,UAAM,aAAa,MAAM;AACxB,UAAI,YAAY,UAAU,OAAO;AAEhC,iBAAS,MAAM,cAAc;AAAA,MAC9B;AAAA,IACD,GAAG,EAAE,WAAW,MAAM;AAGtB,UAAM,MAAM,MAAM,KAAK,MAAM;AAC5B,kBAAY,QAAQ;AACpB,UAAI,MAAM,KAAK;AACd,qBAAa,MAAM,GAAG,EACpB,KAAK,CAAC,YAAY;AAClB,sBAAY,QAAQ;AACpB,eAAK,QAAQ,OAAO;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACD,GAAG,EAAE,WAAW,MAAM;AAKtB,aAAS,eAAe;AACvB,UAAI,YAAY,OAAO;AAEtB;AAAA,MACD;AAEA,UAAI,CAAC,MAAM,MAAM;AAChB,eAAO,MAAM,wBAAwB;AACrC;AAAA,MACD;AAEA,UAAI,OAAO,UAAU,QAAW;AAE/B,eAAO,MAAM,+BAA+B;AAC5C;AAAA,MACD;AAEA,YAAM,EAAE,QAAQ,MAAA,IAAU,OAAO;AACjC,YAAM,SAAS,OAAO,MAAM,MAAM,OAAO,MAAM;AAE/C,YAAM,MAAM,OAAO,MAAM,WAAW,IAAI;AACxC,UAAI,QAAQ,MAAM;AACjB,eAAO,MAAM,2CAA2C;AACxD;AAAA,MACD;AAEA,YAAM,YAAY,IAAI,gBAAgB,OAAO,MAAM;AACnD,gBAAU,KAAK,IAAI,MAAM;AACzB,UAAI,aAAa,WAAW,GAAG,CAAC;AAAA,IACjC;;0BAICA,YAYaC,YAAA;AAAA,QAXX,KAAK,QAAA,MAAM,SAAS;AAAA,QACpB,kBAAkBC,KAAAA,OAAO;AAAA,QACzB,kBAAkBA,KAAAA,OAAO;AAAA,QACzB,YAAYA,KAAAA,OAAO;AAAA,QACnB,cAAcA,KAAAA,OAAO;AAAA,MAAA;yBACtB,MAIqB;AAAA,WAHb,YAAA,sBADRC,mBAIqB,UAAA;AAAA;qBAFhB;AAAA,YAAJ,KAAI;AAAA,YACH,eAAa,QAAA,MAAM,SAAS;AAAA,YAC5B,cAAY,QAAA;AAAA,UAAA,yCACdA,mBAAkC,OAAA;AAAA;YAArB,KAAK,QAAA;AAAA,YAAM,KAAK,QAAA;AAAA,UAAA;;;;;;;;;;;;;;;;;"}
@@ -1,9 +1,9 @@
1
- import '../assets/NcBreadcrumb-BxhZKQlW.css';
1
+ import '../assets/NcBreadcrumb.css';
2
2
  import { openBlock, createElementBlock, mergeProps, createElementVNode, toDisplayString, createCommentVNode, resolveComponent, withModifiers, normalizeClass, createBlock, createSlots, withCtx, renderSlot, createTextVNode, createVNode } from "vue";
3
- import { _ as _export_sfc } from "./_plugin-vue_export-helper-1tPrXgE0.mjs";
4
- import { N as NcButton } from "./NcButton-jvoYS2my.mjs";
5
- import { c as createElementId } from "./createElementId-DhjFt1I9.mjs";
6
- import { N as NcActions } from "./NcActions-C-wDqSrv.mjs";
3
+ import { _ as _export_sfc } from "./_plugin-vue_export-helper.mjs";
4
+ import { N as NcButton } from "./NcButton.mjs";
5
+ import { c as createElementId } from "./createElementId.mjs";
6
+ import { N as NcActions } from "./NcActions.mjs";
7
7
  const _sfc_main$1 = {
8
8
  name: "ChevronRightIcon",
9
9
  emits: ["click"],
@@ -290,4 +290,4 @@ const NcBreadcrumb = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_ren
290
290
  export {
291
291
  NcBreadcrumb as N
292
292
  };
293
- //# sourceMappingURL=NcBreadcrumb-3Y5NWXnV.mjs.map
293
+ //# sourceMappingURL=NcBreadcrumb.mjs.map