@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.
- package/CHANGELOG.md +88 -65
- package/dist/assets/{NcActionButton-DLer-aUY.css → NcActionButton.css} +1 -0
- package/dist/assets/{NcActionCheckbox-wD8m_a8-.css → NcActionCheckbox.css} +1 -0
- package/dist/assets/{NcActionInput-t9WvlgV0.css → NcActionInput.css} +70 -66
- package/dist/assets/{NcActionLink-b4Ph5q10.css → NcActionLink.css} +1 -0
- package/dist/assets/{NcActionRadio-D2rLM1ci.css → NcActionRadio.css} +1 -0
- package/dist/assets/{NcActionRouter-BWXfCfxM.css → NcActionRouter.css} +1 -0
- package/dist/assets/{NcActionText-Dzegj6AY.css → NcActionText.css} +1 -0
- package/dist/assets/{NcActionTextEditable-BlZeHZ7J.css → NcActionTextEditable.css} +67 -65
- package/dist/assets/{NcActions-y7ehwPSp.css → NcActions.css} +12 -12
- package/dist/assets/{NcAppNavigation-OHw55TTZ.css → NcAppNavigation.css} +17 -17
- package/dist/assets/{NcAppNavigationItem-BZ1xj6Xi.css → NcAppNavigationItem.css} +58 -48
- package/dist/assets/NcAppNavigationList.css +52 -0
- package/dist/assets/{NcAppNavigationNewItem-MaYQVcKF.css → NcAppNavigationNewItem.css} +13 -3
- package/dist/assets/{NcAppNavigationSettings-mWFhcXm0.css → NcAppNavigationSettings.css} +6 -6
- package/dist/assets/{NcAppSettingsDialog-Dh_scIK4.css → NcAppSettingsDialog.css} +3 -3
- package/dist/assets/{NcAppSettingsShortcutsSection-BHxkQTg2.css → NcAppSettingsShortcutsSection.css} +1 -1
- package/dist/assets/{NcAppSidebar-oJQ8kUb0.css → NcAppSidebar.css} +132 -78
- package/dist/assets/{NcAppSidebarTab-Xd3HTDbw.css → NcAppSidebarTab.css} +4 -4
- package/dist/assets/{NcAssistantButton-CT25wqIs.css → NcAssistantButton.css} +9 -9
- package/dist/assets/{NcAssistantContent-FV00e96S.css → NcAssistantContent.css} +3 -3
- package/dist/assets/{NcAssistantIcon-BMLpMaMJ.css → NcAssistantIcon.css} +4 -4
- package/dist/assets/{NcAvatar-Bs7qEhkA.css → NcAvatar.css} +39 -24
- package/dist/assets/{NcBlurHash-RgrahjEp.css → NcBlurHash.css} +2 -2
- package/dist/assets/{NcButton-DOrlC_y5.css → NcButton.css} +52 -50
- package/dist/assets/{NcCheckboxRadioSwitch-BlQSZVW0.css → NcCheckboxRadioSwitch.css} +36 -36
- package/dist/assets/{NcDateTimePicker-BQ_y9Ihj.css → NcDateTimePicker.css} +234 -234
- package/dist/assets/NcDateTimePickerNative.css +38 -0
- package/dist/assets/{NcEllipsisedOption-CPWbbgBy.css → NcEllipsisedOption.css} +10 -5
- package/dist/assets/{NcFilePicker-BdjtiV3h.css → NcFilePicker.css} +1 -1
- package/dist/assets/{NcFormBox-TRgICDO3.css → NcFormBox.css} +11 -11
- package/dist/assets/{NcFormBoxButton-ClkxmO-H.css → NcFormBoxButton.css} +2 -2
- package/dist/assets/{NcFormBoxItem-CABDVZLe.css → NcFormBoxItem.css} +19 -15
- package/dist/assets/{NcFormBoxSwitch-NCjook_Z.css → NcFormBoxSwitch.css} +2 -2
- package/dist/assets/{NcFormGroup-eh8-PBGB.css → NcFormGroup.css} +7 -7
- package/dist/assets/{NcHeaderMenu-Hy0UKyUu.css → NcHeaderMenu.css} +22 -24
- package/dist/assets/{NcHotkey-Dm-26TVC.css → NcHotkey.css} +8 -8
- package/dist/assets/{NcHotkeyList-BigfRqyr.css → NcHotkeyList.css} +2 -2
- package/dist/assets/{NcIconToggleSwitch-zUXkaJHv.css → NcIconToggleSwitch.css} +4 -4
- package/dist/assets/{NcInputField-DpyFJ1xw.css → NcInputField.css} +43 -43
- package/dist/assets/{NcKbd-DcC56WbC.css → NcKbd.css} +3 -3
- package/dist/assets/NcPopover.css +108 -0
- package/dist/assets/NcProfileHoverCard.css +340 -0
- package/dist/assets/{NcProgressBar-B6wveIA1.css → NcProgressBar.css} +14 -14
- package/dist/assets/{NcRadioGroup-CtXZ4Y8D.css → NcRadioGroup.css} +2 -2
- package/dist/assets/{NcRadioGroupButton-BuB-aWeJ.css → NcRadioGroupButton.css} +19 -14
- package/dist/assets/NcReferenceWidget.css +150 -0
- package/dist/assets/{NcRichContenteditable-BCUBhRqg.css → NcRichContenteditable.css} +17 -17
- package/dist/assets/NcSelect.css +397 -0
- package/dist/assets/NcSelectUsers.css +12 -0
- package/dist/assets/{autolink-XS-VDSVB.css → autolink.css} +3 -3
- package/dist/assets/{referencePickerModal-BNPfxyni.css → referencePickerModal.css} +0 -149
- package/dist/chunks/{ArrowRight-B1ncAhus.mjs → ArrowRight.mjs} +2 -2
- package/dist/chunks/ArrowRight.mjs.map +1 -0
- package/dist/chunks/{ChevronDown-C6gc637b.mjs → ChevronDown.mjs} +2 -2
- package/dist/chunks/ChevronDown.mjs.map +1 -0
- package/dist/chunks/{ChevronUp-ChH8oB7p.mjs → ChevronUp.mjs} +2 -2
- package/dist/chunks/ChevronUp.mjs.map +1 -0
- package/dist/chunks/{Close-CuhcJnX2.mjs → Close.mjs} +2 -2
- package/dist/chunks/Close.mjs.map +1 -0
- package/dist/chunks/{NcActionButton-BO5T5ePT.mjs → NcActionButton.mjs} +7 -7
- package/dist/chunks/NcActionButton.mjs.map +1 -0
- package/dist/chunks/{NcActionButtonGroup-Dd03Oluy.mjs → NcActionButtonGroup.mjs} +6 -6
- package/dist/chunks/NcActionButtonGroup.mjs.map +1 -0
- package/dist/chunks/{NcActionCaption-f7L9gBlT.mjs → NcActionCaption.mjs} +4 -4
- package/dist/chunks/NcActionCaption.mjs.map +1 -0
- package/dist/chunks/{NcActionCheckbox-DBqiK-AZ.mjs → NcActionCheckbox.mjs} +8 -8
- package/dist/chunks/NcActionCheckbox.mjs.map +1 -0
- package/dist/chunks/{NcActionInput-Dr8Yrafu.mjs → NcActionInput.mjs} +14 -13
- package/dist/chunks/NcActionInput.mjs.map +1 -0
- package/dist/chunks/{NcActionLink-BFiaYt9A.mjs → NcActionLink.mjs} +5 -5
- package/dist/chunks/NcActionLink.mjs.map +1 -0
- package/dist/chunks/{NcActionRadio-BA08CAtA.mjs → NcActionRadio.mjs} +8 -8
- package/dist/chunks/NcActionRadio.mjs.map +1 -0
- package/dist/chunks/{NcActionRouter-vYFtIOzD.mjs → NcActionRouter.mjs} +5 -5
- package/dist/chunks/NcActionRouter.mjs.map +1 -0
- package/dist/chunks/{NcActionSeparator-B9pNQaji.mjs → NcActionSeparator.mjs} +3 -3
- package/dist/chunks/NcActionSeparator.mjs.map +1 -0
- package/dist/chunks/{NcActionText-CQ9qwJ0p.mjs → NcActionText.mjs} +5 -5
- package/dist/chunks/NcActionText.mjs.map +1 -0
- package/dist/chunks/{NcActionTextEditable-B8y_GEre.mjs → NcActionTextEditable.mjs} +8 -8
- package/dist/chunks/NcActionTextEditable.mjs.map +1 -0
- package/dist/chunks/{NcActions-C-wDqSrv.mjs → NcActions.mjs} +12 -12
- package/dist/chunks/NcActions.mjs.map +1 -0
- package/dist/chunks/{NcAppContent-DavgjaFX.mjs → NcAppContent.mjs} +11 -11
- package/dist/chunks/NcAppContent.mjs.map +1 -0
- package/dist/chunks/{NcAppContentDetails.vue_vue_type_script_setup_true_lang-BWl5Pw5g.mjs → NcAppContentDetails.vue_vue_type_script_setup_true_lang.mjs} +1 -1
- package/dist/chunks/NcAppContentDetails.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
- package/dist/chunks/{NcAppContentList-Copx3Ver.mjs → NcAppContentList.mjs} +2 -2
- package/dist/chunks/NcAppContentList.mjs.map +1 -0
- package/dist/chunks/{NcAppNavigation-g57j16pB.mjs → NcAppNavigation.mjs} +17 -16
- package/dist/chunks/NcAppNavigation.mjs.map +1 -0
- package/dist/chunks/{NcAppNavigationCaption-VjSWJ8R4.mjs → NcAppNavigationCaption.mjs} +4 -4
- package/dist/chunks/NcAppNavigationCaption.mjs.map +1 -0
- package/dist/chunks/{NcAppNavigationIconBullet-BmU-dPcY.mjs → NcAppNavigationIconBullet.mjs} +3 -3
- package/dist/chunks/NcAppNavigationIconBullet.mjs.map +1 -0
- package/dist/chunks/{NcAppNavigationItem-CDeYtA3E.mjs → NcAppNavigationItem.mjs} +53 -24
- package/dist/chunks/NcAppNavigationItem.mjs.map +1 -0
- package/dist/chunks/NcAppNavigationList.mjs +147 -0
- package/dist/chunks/NcAppNavigationList.mjs.map +1 -0
- package/dist/chunks/{NcAppNavigationNew-CBNppM7Q.mjs → NcAppNavigationNew.mjs} +4 -4
- package/dist/chunks/NcAppNavigationNew.mjs.map +1 -0
- package/dist/chunks/{NcAppNavigationNewItem-B1RfQkvu.mjs → NcAppNavigationNewItem.mjs} +5 -5
- package/dist/chunks/NcAppNavigationNewItem.mjs.map +1 -0
- package/dist/chunks/{NcAppNavigationSearch-CQQWb1Eq.mjs → NcAppNavigationSearch.mjs} +7 -7
- package/dist/chunks/NcAppNavigationSearch.mjs.map +1 -0
- package/dist/chunks/{NcAppNavigationSettings-DoMjRExO.mjs → NcAppNavigationSettings.mjs} +16 -16
- package/dist/chunks/NcAppNavigationSettings.mjs.map +1 -0
- package/dist/chunks/{NcAppNavigationSpacer-CIRC4ZEj.mjs → NcAppNavigationSpacer.mjs} +3 -3
- package/dist/chunks/NcAppNavigationSpacer.mjs.map +1 -0
- package/dist/chunks/{NcAppSettingsDialog-BPcEYLjP.mjs → NcAppSettingsDialog.mjs} +13 -13
- package/dist/chunks/NcAppSettingsDialog.mjs.map +1 -0
- package/dist/chunks/{NcAppSettingsSection-BosSmisT.mjs → NcAppSettingsSection.mjs} +5 -5
- package/dist/chunks/NcAppSettingsSection.mjs.map +1 -0
- package/dist/chunks/{NcAppSettingsShortcutsSection-DLwubKV9.mjs → NcAppSettingsShortcutsSection.mjs} +7 -7
- package/dist/chunks/NcAppSettingsShortcutsSection.mjs.map +1 -0
- package/dist/chunks/{NcAppSidebar-C8YzAzrZ.mjs → NcAppSidebar.mjs} +180 -46
- package/dist/chunks/NcAppSidebar.mjs.map +1 -0
- 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
- package/dist/chunks/NcAppSidebarHeader.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
- package/dist/chunks/{NcAppSidebarTab-DOSDDbGA.mjs → NcAppSidebarTab.mjs} +15 -8
- package/dist/chunks/NcAppSidebarTab.mjs.map +1 -0
- package/dist/chunks/{NcAssistantButton-iK491d2v.mjs → NcAssistantButton.mjs} +14 -14
- package/dist/chunks/NcAssistantButton.mjs.map +1 -0
- package/dist/chunks/{NcAssistantContent-iHA4O4cC.mjs → NcAssistantContent.mjs} +6 -6
- package/dist/chunks/NcAssistantContent.mjs.map +1 -0
- package/dist/chunks/{NcAssistantIcon-C6s4Qm7-.mjs → NcAssistantIcon.mjs} +9 -9
- package/dist/chunks/NcAssistantIcon.mjs.map +1 -0
- package/dist/chunks/{NcAvatar-1KxMUN7V.mjs → NcAvatar.mjs} +214 -80
- package/dist/chunks/NcAvatar.mjs.map +1 -0
- package/dist/chunks/{NcBlurHash-B30Ol8KP.mjs → NcBlurHash.mjs} +6 -6
- package/dist/chunks/NcBlurHash.mjs.map +1 -0
- package/dist/chunks/{NcBreadcrumb-3Y5NWXnV.mjs → NcBreadcrumb.mjs} +6 -6
- package/dist/chunks/NcBreadcrumb.mjs.map +1 -0
- package/dist/chunks/{NcBreadcrumbs-BaTp3Sya.mjs → NcBreadcrumbs.mjs} +8 -8
- package/dist/chunks/NcBreadcrumbs.mjs.map +1 -0
- package/dist/chunks/{NcButton-jvoYS2my.mjs → NcButton.mjs} +6 -6
- package/dist/chunks/NcButton.mjs.map +1 -0
- package/dist/chunks/{NcCheckboxRadioSwitch-DVdt5Hkq.mjs → NcCheckboxRadioSwitch.mjs} +22 -12
- package/dist/chunks/NcCheckboxRadioSwitch.mjs.map +1 -0
- package/dist/chunks/{NcChip-DKRlV47q.mjs → NcChip.mjs} +9 -9
- package/dist/chunks/NcChip.mjs.map +1 -0
- package/dist/chunks/{NcCollectionList-B9qCtjJw.mjs → NcCollectionList.mjs} +12 -12
- package/dist/chunks/NcCollectionList.mjs.map +1 -0
- package/dist/chunks/{NcColorPicker-BCkasLwT.mjs → NcColorPicker.mjs} +12 -12
- package/dist/chunks/NcColorPicker.mjs.map +1 -0
- package/dist/chunks/{NcContent-BYh5hWDN.mjs → NcContent.mjs} +9 -9
- package/dist/chunks/NcContent.mjs.map +1 -0
- package/dist/chunks/{NcCounterBubble-CV0YMrXW.mjs → NcCounterBubble.mjs} +3 -3
- package/dist/chunks/NcCounterBubble.mjs.map +1 -0
- package/dist/chunks/{NcDashboardWidget-zmbDEGL-.mjs → NcDashboardWidget.mjs} +8 -8
- package/dist/chunks/NcDashboardWidget.mjs.map +1 -0
- package/dist/chunks/{NcDashboardWidgetItem-DwDndrm_.mjs → NcDashboardWidgetItem.mjs} +6 -6
- package/dist/chunks/NcDashboardWidgetItem.mjs.map +1 -0
- package/dist/chunks/{NcDateTime.vue_vue_type_script_setup_true_lang-BJuPH7S7.mjs → NcDateTime.vue_vue_type_script_setup_true_lang.mjs} +1 -1
- package/dist/chunks/NcDateTime.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
- package/dist/chunks/NcDateTimePicker.mjs +2979 -0
- package/dist/chunks/NcDateTimePicker.mjs.map +1 -0
- package/dist/chunks/{NcDateTimePickerNative-B8CMOUnH.mjs → NcDateTimePickerNative.mjs} +21 -26
- package/dist/chunks/NcDateTimePickerNative.mjs.map +1 -0
- package/dist/chunks/{NcDialog-D617YI0t.mjs → NcDialog.mjs} +6 -6
- package/dist/chunks/NcDialog.mjs.map +1 -0
- package/dist/chunks/{NcDialogButton.vue_vue_type_script_setup_true_lang-Bqfy678u.mjs → NcDialogButton.vue_vue_type_script_setup_true_lang.mjs} +6 -6
- package/dist/chunks/NcDialogButton.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
- package/dist/chunks/{NcEllipsisedOption-D6Amb91K.mjs → NcEllipsisedOption.mjs} +5 -5
- package/dist/chunks/NcEllipsisedOption.mjs.map +1 -0
- package/dist/chunks/{NcEmojiPicker-UTxgju3f.mjs → NcEmojiPicker.mjs} +12 -12
- package/dist/chunks/NcEmojiPicker.mjs.map +1 -0
- package/dist/chunks/{NcEmptyContent-CGAPqk4S.mjs → NcEmptyContent.mjs} +4 -4
- package/dist/chunks/NcEmptyContent.mjs.map +1 -0
- package/dist/chunks/{NcFilePicker-bD2toutn.mjs → NcFilePicker.mjs} +9 -9
- package/dist/chunks/NcFilePicker.mjs.map +1 -0
- package/dist/chunks/{NcFormBox-Bmqar8nn.mjs → NcFormBox.mjs} +9 -9
- package/dist/chunks/NcFormBox.mjs.map +1 -0
- package/dist/chunks/{NcFormBoxButton-G_PkUiQy.mjs → NcFormBoxButton.mjs} +8 -8
- package/dist/chunks/NcFormBoxButton.mjs.map +1 -0
- 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
- package/dist/chunks/NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
- package/dist/chunks/{NcFormBoxItem-Cm8aZaVJ.mjs → NcFormBoxItem.mjs} +14 -14
- package/dist/chunks/NcFormBoxItem.mjs.map +1 -0
- package/dist/chunks/{NcFormBoxSwitch-DSXiQcnq.mjs → NcFormBoxSwitch.mjs} +8 -8
- package/dist/chunks/NcFormBoxSwitch.mjs.map +1 -0
- package/dist/chunks/{NcFormGroup-N7qIFAwN.mjs → NcFormGroup.mjs} +11 -11
- package/dist/chunks/NcFormGroup.mjs.map +1 -0
- package/dist/chunks/{NcGuestContent-CvT6VGt1.mjs → NcGuestContent.mjs} +3 -3
- package/dist/chunks/NcGuestContent.mjs.map +1 -0
- package/dist/chunks/{NcHeaderButton-BnLwYCog.mjs → NcHeaderButton.mjs} +5 -5
- package/dist/chunks/NcHeaderButton.mjs.map +1 -0
- package/dist/chunks/{NcHeaderMenu-ktQJV2SW.mjs → NcHeaderMenu.mjs} +14 -20
- package/dist/chunks/NcHeaderMenu.mjs.map +1 -0
- package/dist/chunks/{NcHighlight.vue_vue_type_script_lang-DnWQDM_2.mjs → NcHighlight.vue_vue_type_script_lang.mjs} +1 -1
- package/dist/chunks/NcHighlight.vue_vue_type_script_lang.mjs.map +1 -0
- package/dist/chunks/{NcHotkey-BDGeF3eH.mjs → NcHotkey.mjs} +8 -8
- package/dist/chunks/NcHotkey.mjs.map +1 -0
- package/dist/chunks/{NcHotkeyList-B4WjTLAp.mjs → NcHotkeyList.mjs} +8 -8
- package/dist/chunks/NcHotkeyList.mjs.map +1 -0
- package/dist/chunks/{NcIconSvgWrapper-g8ubWhoz.mjs → NcIconSvgWrapper.mjs} +3 -3
- package/dist/chunks/NcIconSvgWrapper.mjs.map +1 -0
- package/dist/chunks/{NcIconToggleSwitch-CRvGt4su.mjs → NcIconToggleSwitch.mjs} +6 -6
- package/dist/chunks/NcIconToggleSwitch.mjs.map +1 -0
- package/dist/chunks/{NcInputConfirmCancel-CGTllrXj.mjs → NcInputConfirmCancel.mjs} +9 -9
- package/dist/chunks/NcInputConfirmCancel.mjs.map +1 -0
- package/dist/chunks/{NcInputField-5Sg6EUP6.mjs → NcInputField.mjs} +9 -9
- package/dist/chunks/NcInputField.mjs.map +1 -0
- package/dist/chunks/{NcKbd-Bh_Tk6Ar.mjs → NcKbd.mjs} +8 -8
- package/dist/chunks/NcKbd.mjs.map +1 -0
- package/dist/chunks/{NcListItem-BliLJpvU.mjs → NcListItem.mjs} +7 -7
- package/dist/chunks/NcListItem.mjs.map +1 -0
- package/dist/chunks/{NcListItemIcon-Dl_tfkk9.mjs → NcListItemIcon.mjs} +7 -7
- package/dist/chunks/NcListItemIcon.mjs.map +1 -0
- package/dist/chunks/{NcLoadingIcon-BOVpFVQz.mjs → NcLoadingIcon.mjs} +3 -3
- package/dist/chunks/NcLoadingIcon.mjs.map +1 -0
- 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
- package/dist/chunks/NcMentionBubble.vue_vue_type_style_index_0_scoped_3c4a673d_lang.mjs.map +1 -0
- package/dist/chunks/{NcModal-DiDvgcU8.mjs → NcModal.mjs} +12 -12
- package/dist/chunks/NcModal.mjs.map +1 -0
- package/dist/chunks/{NcNoteCard-mI7qVZ9j.mjs → NcNoteCard.mjs} +6 -6
- package/dist/chunks/NcNoteCard.mjs.map +1 -0
- package/dist/chunks/{NcPasswordField-BFyzHTOO.mjs → NcPasswordField.mjs} +9 -9
- package/dist/chunks/NcPasswordField.mjs.map +1 -0
- package/dist/chunks/{NcPopover-B87bEPLq.mjs → NcPopover.mjs} +9 -10
- package/dist/chunks/NcPopover.mjs.map +1 -0
- package/dist/chunks/NcProfileHoverCard.mjs +777 -0
- package/dist/chunks/NcProfileHoverCard.mjs.map +1 -0
- package/dist/chunks/{NcProgressBar-C-ane-Ni.mjs → NcProgressBar.mjs} +20 -10
- package/dist/chunks/NcProgressBar.mjs.map +1 -0
- package/dist/chunks/{NcRadioGroup-B4qmS2UD.mjs → NcRadioGroup.mjs} +8 -8
- package/dist/chunks/NcRadioGroup.mjs.map +1 -0
- package/dist/chunks/{NcRadioGroupButton-CZykGwv3.mjs → NcRadioGroupButton.mjs} +12 -12
- package/dist/chunks/NcRadioGroupButton.mjs.map +1 -0
- package/dist/chunks/NcReferenceWidget.mjs +292 -0
- package/dist/chunks/NcReferenceWidget.mjs.map +1 -0
- package/dist/chunks/{NcRelatedResourcesPanel-D_Ttpg5_.mjs → NcRelatedResourcesPanel.mjs} +13 -13
- package/dist/chunks/NcRelatedResourcesPanel.mjs.map +1 -0
- package/dist/chunks/{NcRichContenteditable-Qw614bJ5.mjs → NcRichContenteditable.mjs} +37 -35
- package/dist/chunks/NcRichContenteditable.mjs.map +1 -0
- package/dist/chunks/{NcRichText-BO_4KtBA.mjs → NcRichText.mjs} +12 -12
- package/dist/chunks/NcRichText.mjs.map +1 -0
- package/dist/chunks/{NcSavingIndicatorIcon.vue_vue_type_script_setup_true_lang-DbQnMYZm.mjs → NcSavingIndicatorIcon.vue_vue_type_script_setup_true_lang.mjs} +1 -1
- package/dist/chunks/NcSavingIndicatorIcon.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
- package/dist/chunks/{NcSelect--kERLlBK.mjs → NcSelect.mjs} +124 -29
- package/dist/chunks/NcSelect.mjs.map +1 -0
- package/dist/chunks/{NcSelectTags-I2hJaNax.mjs → NcSelectTags.mjs} +6 -6
- package/dist/chunks/NcSelectTags.mjs.map +1 -0
- package/dist/chunks/{NcSelectUsers-K14Bepkq.mjs → NcSelectUsers.mjs} +6 -6
- package/dist/chunks/NcSelectUsers.mjs.map +1 -0
- package/dist/chunks/{NcSettingsSection-Caz1fuWt.mjs → NcSettingsSection.mjs} +5 -5
- package/dist/chunks/NcSettingsSection.mjs.map +1 -0
- package/dist/chunks/{NcSettingsSelectGroup-SYJ8-XlR.mjs → NcSettingsSelectGroup.mjs} +7 -7
- package/dist/chunks/NcSettingsSelectGroup.mjs.map +1 -0
- package/dist/chunks/{NcTextArea-Dxzj4zdb.mjs → NcTextArea.mjs} +8 -8
- package/dist/chunks/NcTextArea.mjs.map +1 -0
- package/dist/chunks/{NcTextField.vue_vue_type_script_setup_true_lang-Bx2esFU2.mjs → NcTextField.vue_vue_type_script_setup_true_lang.mjs} +7 -7
- package/dist/chunks/NcTextField.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
- package/dist/chunks/{NcThemeProvider.vue_vue_type_script_setup_true_lang-wie70gn4.mjs → NcThemeProvider.vue_vue_type_script_setup_true_lang.mjs} +2 -2
- package/dist/chunks/NcThemeProvider.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
- package/dist/chunks/{NcTimezonePicker.vue_vue_type_script_setup_true_lang-D7ZHgnwW.mjs → NcTimezonePicker.vue_vue_type_script_setup_true_lang.mjs} +5 -5
- package/dist/chunks/NcTimezonePicker.vue_vue_type_script_setup_true_lang.mjs.map +1 -0
- package/dist/chunks/{NcUserBubble-BXR7vT0V.mjs → NcUserBubble.mjs} +5 -5
- package/dist/chunks/NcUserBubble.mjs.map +1 -0
- package/dist/chunks/{NcUserStatusIcon-BF5OEQFU.mjs → NcUserStatusIcon.mjs} +7 -7
- package/dist/chunks/NcUserStatusIcon.mjs.map +1 -0
- package/dist/chunks/{NcVNodes.vue_vue_type_script_lang-BqUHinRZ.mjs → NcVNodes.vue_vue_type_script_lang.mjs} +1 -1
- package/dist/chunks/NcVNodes.vue_vue_type_script_lang.mjs.map +1 -0
- package/dist/chunks/{_l10n-wdIzZwir.mjs → _l10n.mjs} +106 -104
- package/dist/chunks/_l10n.mjs.map +1 -0
- package/dist/chunks/{_plugin-vue_export-helper-1tPrXgE0.mjs → _plugin-vue_export-helper.mjs} +1 -1
- package/dist/chunks/_plugin-vue_export-helper.mjs.map +1 -0
- package/dist/chunks/{actionGlobal-BZFdtdJL.mjs → actionGlobal.mjs} +1 -1
- package/dist/chunks/actionGlobal.mjs.map +1 -0
- package/dist/chunks/{actionText-BXR0sWNu.mjs → actionText.mjs} +3 -3
- package/dist/chunks/actionText.mjs.map +1 -0
- package/dist/chunks/{appName-DyNMVZpX.mjs → appName.mjs} +2 -2
- package/dist/chunks/appName.mjs.map +1 -0
- package/dist/chunks/{autolink-DrIurosL.mjs → autolink.mjs} +7 -7
- package/dist/chunks/autolink.mjs.map +1 -0
- package/dist/chunks/{colors-Cv9F-jWS.mjs → colors.mjs} +3 -3
- package/dist/chunks/colors.mjs.map +1 -0
- package/dist/chunks/{constants-wIEKSp2G.mjs → constants.mjs} +1 -1
- package/dist/chunks/constants.mjs.map +1 -0
- package/dist/chunks/{constants-Ciwvl5xb.mjs → constants2.mjs} +1 -1
- package/dist/chunks/constants2.mjs.map +1 -0
- package/dist/chunks/{createElementId-DhjFt1I9.mjs → createElementId.mjs} +1 -1
- package/dist/chunks/createElementId.mjs.map +1 -0
- package/dist/chunks/customPickerElements.mjs +61 -0
- package/dist/chunks/customPickerElements.mjs.map +1 -0
- package/dist/chunks/{emoji-C8k9NUlo.mjs → emoji.mjs} +1 -1
- package/dist/chunks/emoji.mjs.map +1 -0
- package/dist/chunks/{focusTrap-HJQ4pqHV.mjs → focusTrap.mjs} +1 -1
- package/dist/chunks/focusTrap.mjs.map +1 -0
- package/dist/chunks/highlight.mjs +5 -0
- package/dist/chunks/highlight.mjs.map +1 -0
- package/dist/chunks/{legacy-BoqDmOCa.mjs → legacy.mjs} +4 -2
- package/dist/chunks/legacy.mjs.map +1 -0
- package/dist/chunks/{logger-D3RVzcfQ.mjs → logger.mjs} +1 -1
- package/dist/chunks/logger.mjs.map +1 -0
- package/dist/chunks/{mdi-CpchYUUV.mjs → mdi.mjs} +12 -14
- package/dist/chunks/mdi.mjs.map +1 -0
- package/dist/chunks/{platform-CC2ecGvV.mjs → platform.mjs} +1 -1
- package/dist/chunks/platform.mjs.map +1 -0
- package/dist/chunks/{referencePickerModal-CnKdEDwu.mjs → referencePickerModal.mjs} +60 -342
- package/dist/chunks/referencePickerModal.mjs.map +1 -0
- package/dist/chunks/{rtl-v0UOPAM7.mjs → rtl.mjs} +1 -1
- package/dist/chunks/rtl.mjs.map +1 -0
- package/dist/chunks/{useAppSettingsDialog-C73Wx6iQ.mjs → useAppSettingsDialog.mjs} +1 -1
- package/dist/chunks/useAppSettingsDialog.mjs.map +1 -0
- package/dist/chunks/{useCopy-6F-qWHq0.mjs → useCopy.mjs} +4 -4
- package/dist/chunks/useCopy.mjs.map +1 -0
- package/dist/chunks/{useNcActions-BzPO2c4h.mjs → useNcActions.mjs} +1 -1
- package/dist/chunks/useNcActions.mjs.map +1 -0
- package/dist/chunks/{useNcFormBox-Djlh582y.mjs → useNcFormBox.mjs} +1 -1
- package/dist/chunks/useNcFormBox.mjs.map +1 -0
- package/dist/chunks/{useNcRadioGroup-D6llQmAl.mjs → useNcRadioGroup.mjs} +1 -1
- package/dist/chunks/useNcRadioGroup.mjs.map +1 -0
- package/dist/chunks/{useTrapStackControl-B6cEicto.mjs → useTrapStackControl.mjs} +2 -2
- package/dist/chunks/useTrapStackControl.mjs.map +1 -0
- package/dist/chunks/widgets.mjs +66 -0
- package/dist/chunks/widgets.mjs.map +1 -0
- package/dist/components/NcActionButton/index.mjs +1 -1
- package/dist/components/NcActionButtonGroup/index.mjs +1 -1
- package/dist/components/NcActionCaption/index.mjs +1 -1
- package/dist/components/NcActionCheckbox/index.mjs +1 -1
- package/dist/components/NcActionInput/NcActionInput.vue.d.ts +302 -103
- package/dist/components/NcActionInput/index.mjs +1 -1
- package/dist/components/NcActionLink/index.mjs +1 -1
- package/dist/components/NcActionRadio/index.mjs +1 -1
- package/dist/components/NcActionRouter/index.mjs +1 -1
- package/dist/components/NcActionSeparator/index.mjs +1 -1
- package/dist/components/NcActionText/index.mjs +1 -1
- package/dist/components/NcActionTextEditable/index.mjs +1 -1
- package/dist/components/NcActions/NcActions.vue.d.ts +3 -3
- package/dist/components/NcActions/index.mjs +1 -1
- package/dist/components/NcAppContent/index.mjs +1 -1
- package/dist/components/NcAppContentDetails/index.mjs +1 -1
- package/dist/components/NcAppContentList/index.mjs +1 -1
- package/dist/components/NcAppNavigation/index.mjs +1 -1
- package/dist/components/NcAppNavigationCaption/NcAppNavigationCaption.vue.d.ts +3 -3
- package/dist/components/NcAppNavigationCaption/index.mjs +1 -1
- package/dist/components/NcAppNavigationIconBullet/index.mjs +1 -1
- package/dist/components/NcAppNavigationItem/NcAppNavigationItem.vue.d.ts +10 -6
- package/dist/components/NcAppNavigationItem/NcInputConfirmCancel.vue.d.ts +1 -1
- package/dist/components/NcAppNavigationItem/index.mjs +1 -1
- package/dist/components/NcAppNavigationList/NcAppNavigationList.vue.d.ts +57 -1
- package/dist/components/NcAppNavigationList/highlight.d.ts +12 -0
- package/dist/components/NcAppNavigationList/index.mjs +1 -1
- package/dist/components/NcAppNavigationNew/index.mjs +1 -1
- package/dist/components/NcAppNavigationNewItem/NcAppNavigationNewItem.vue.d.ts +1 -1
- package/dist/components/NcAppNavigationNewItem/index.mjs +1 -1
- package/dist/components/NcAppNavigationSearch/NcAppNavigationSearch.vue.d.ts +16 -16
- package/dist/components/NcAppNavigationSearch/index.mjs +1 -1
- package/dist/components/NcAppNavigationSettings/index.mjs +1 -1
- package/dist/components/NcAppNavigationSpacer/index.mjs +1 -1
- package/dist/components/NcAppSettingsDialog/index.mjs +1 -1
- package/dist/components/NcAppSettingsSection/index.mjs +1 -1
- package/dist/components/NcAppSettingsSectionShortcuts/index.mjs +1 -1
- package/dist/components/NcAppSettingsShortcutsSection/index.mjs +1 -1
- package/dist/components/NcAppSidebar/NcAppSidebar.vue.d.ts +23 -4
- package/dist/components/NcAppSidebar/NcAppSidebarTabs.vue.d.ts +43 -0
- package/dist/components/NcAppSidebar/NcAppSidebarTabsButton.vue.d.ts +5 -0
- package/dist/components/NcAppSidebar/index.mjs +1 -1
- package/dist/components/NcAppSidebarHeader/index.mjs +1 -1
- package/dist/components/NcAppSidebarTab/NcAppSidebarTab.vue.d.ts +14 -4
- package/dist/components/NcAppSidebarTab/index.mjs +1 -1
- package/dist/components/NcAssistantButton/index.mjs +1 -1
- package/dist/components/NcAssistantContent/index.mjs +1 -1
- package/dist/components/NcAssistantIcon/index.mjs +1 -1
- package/dist/components/NcAvatar/NcAvatar.vue.d.ts +53 -138
- package/dist/components/NcAvatar/index.mjs +1 -1
- package/dist/components/NcBlurHash/index.mjs +1 -1
- package/dist/components/NcBreadcrumb/NcBreadcrumb.vue.d.ts +4 -4
- package/dist/components/NcBreadcrumb/index.mjs +1 -1
- package/dist/components/NcBreadcrumbs/NcBreadcrumbs.vue.d.ts +7 -7
- package/dist/components/NcBreadcrumbs/index.mjs +1 -1
- package/dist/components/NcButton/index.mjs +1 -1
- package/dist/components/NcCheckboxRadioSwitch/index.mjs +1 -1
- package/dist/components/NcChip/index.mjs +1 -1
- package/dist/components/NcCollectionList/NcCollectionList.vue.d.ts +272 -280
- package/dist/components/NcCollectionList/NcCollectionListItem.vue.d.ts +38 -140
- package/dist/components/NcCollectionList/index.mjs +1 -1
- package/dist/components/NcColorPicker/index.mjs +1 -1
- package/dist/components/NcContent/index.mjs +1 -1
- package/dist/components/NcCounterBubble/index.mjs +1 -1
- package/dist/components/NcDashboardWidget/NcDashboardWidget.vue.d.ts +73 -277
- package/dist/components/NcDashboardWidget/index.mjs +1 -1
- package/dist/components/NcDashboardWidgetItem/NcDashboardWidgetItem.vue.d.ts +38 -140
- package/dist/components/NcDashboardWidgetItem/index.mjs +1 -1
- package/dist/components/NcDateTime/index.mjs +1 -1
- package/dist/components/NcDateTimePicker/NcDateTimePicker.vue.d.ts +82 -80
- package/dist/components/NcDateTimePicker/dateFnsLocaleLoader.d.ts +3 -0
- package/dist/components/NcDateTimePicker/format.d.ts +35 -0
- package/dist/components/NcDateTimePicker/index.mjs +1 -1
- package/dist/components/NcDateTimePicker/useDateFnsLocale.d.ts +16 -0
- package/dist/components/NcDateTimePickerNative/index.mjs +1 -1
- package/dist/components/NcDialog/index.mjs +1 -1
- package/dist/components/NcDialogButton/index.mjs +1 -1
- package/dist/components/NcEllipsisedOption/index.mjs +1 -1
- package/dist/components/NcEmojiPicker/NcEmojiPicker.vue.d.ts +14 -11
- package/dist/components/NcEmojiPicker/index.mjs +1 -1
- package/dist/components/NcEmptyContent/index.mjs +1 -1
- package/dist/components/NcFilePicker/index.mjs +1 -1
- package/dist/components/NcFormBox/index.mjs +1 -1
- package/dist/components/NcFormBoxButton/index.mjs +1 -1
- package/dist/components/NcFormBoxCopyButton/index.mjs +1 -1
- package/dist/components/NcFormBoxSwitch/index.mjs +1 -1
- package/dist/components/NcFormGroup/index.mjs +1 -1
- package/dist/components/NcGuestContent/index.mjs +1 -1
- package/dist/components/NcHeaderButton/index.mjs +1 -1
- package/dist/components/NcHeaderMenu/index.mjs +1 -1
- package/dist/components/NcHighlight/index.mjs +1 -1
- package/dist/components/NcHotkey/index.mjs +1 -1
- package/dist/components/NcHotkeyList/index.mjs +1 -1
- package/dist/components/NcIconSvgWrapper/index.mjs +1 -1
- package/dist/components/NcInputField/NcInputField.vue.d.ts +8 -5
- package/dist/components/NcInputField/index.mjs +1 -1
- package/dist/components/NcKbd/index.mjs +1 -1
- package/dist/components/NcListItem/NcListItem.vue.d.ts +3 -3
- package/dist/components/NcListItem/index.mjs +1 -1
- package/dist/components/NcListItemIcon/NcListItemIcon.vue.d.ts +36 -138
- package/dist/components/NcListItemIcon/index.mjs +1 -1
- package/dist/components/NcLoadingIcon/index.mjs +1 -1
- package/dist/components/NcModal/index.mjs +1 -1
- package/dist/components/NcNoteCard/index.mjs +1 -1
- package/dist/components/NcPasswordField/NcPasswordField.vue.d.ts +16 -16
- package/dist/components/NcPasswordField/index.mjs +1 -1
- package/dist/components/NcPopover/index.mjs +1 -1
- package/dist/components/NcProfileHoverCard/NcProfileHoverCard.vue.d.ts +80 -0
- package/dist/components/NcProfileHoverCard/index.d.ts +5 -0
- package/dist/components/NcProfileHoverCard/index.mjs +5 -0
- package/dist/components/NcProfileHoverCard/index.mjs.map +1 -0
- package/dist/components/NcProfileHoverCard/profileCache.d.ts +31 -0
- package/dist/components/NcProgressBar/NcProgressBar.vue.d.ts +27 -0
- package/dist/components/NcProgressBar/index.mjs +1 -1
- package/dist/components/NcRadioGroup/index.mjs +1 -1
- package/dist/components/NcRadioGroupButton/index.mjs +1 -1
- package/dist/components/NcRelatedResourcesPanel/NcRelatedResourcesPanel.vue.d.ts +1 -1
- package/dist/components/NcRelatedResourcesPanel/index.mjs +1 -1
- package/dist/components/NcRichContenteditable/NcRichContenteditable.vue.d.ts +1 -1
- package/dist/components/NcRichContenteditable/index.mjs +1 -1
- package/dist/components/NcRichText/NcReferencePicker/NcProviderList.vue.d.ts +199 -3
- package/dist/components/NcRichText/NcReferencePicker/NcRawLinkInput.vue.d.ts +14 -11
- package/dist/components/NcRichText/NcReferencePicker/NcReferencePicker.vue.d.ts +412 -17
- package/dist/components/NcRichText/NcReferencePicker/NcReferencePickerModal.vue.d.ts +412 -17
- package/dist/components/NcRichText/NcReferencePicker/NcSearch.vue.d.ts +199 -3
- package/dist/components/NcRichText/index.mjs +14 -12
- package/dist/components/NcRichText/index.mjs.map +1 -1
- package/dist/components/NcSavingIndicatorIcon/index.mjs +1 -1
- package/dist/components/NcSelect/NcSelect.vue.d.ts +208 -3
- package/dist/components/NcSelect/index.mjs +1 -1
- package/dist/components/NcSelectTags/NcSelectTags.vue.d.ts +201 -5
- package/dist/components/NcSelectTags/index.mjs +1 -1
- package/dist/components/NcSelectUsers/index.mjs +1 -1
- package/dist/components/NcSettingsSection/index.mjs +1 -1
- package/dist/components/NcSettingsSelectGroup/NcSettingsSelectGroup.vue.d.ts +199 -3
- package/dist/components/NcSettingsSelectGroup/index.mjs +1 -1
- package/dist/components/NcTextArea/index.mjs +1 -1
- package/dist/components/NcTextField/NcTextField.vue.d.ts +23 -17
- package/dist/components/NcTextField/index.mjs +1 -1
- package/dist/components/NcThemeProvider/index.mjs +1 -1
- package/dist/components/NcTimezonePicker/index.mjs +1 -1
- package/dist/components/NcUserBubble/index.mjs +1 -1
- package/dist/components/NcUserStatusIcon/index.mjs +1 -1
- package/dist/components/NcVNodes/index.mjs +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/composables/useFormatDateTime/index.mjs +11 -5
- package/dist/composables/useFormatDateTime/index.mjs.map +1 -1
- package/dist/composables/useHotKey/index.mjs +1 -1
- package/dist/composables/useIsDarkTheme/index.mjs +1 -1
- package/dist/functions/contactsMenu/index.mjs +1 -1
- package/dist/functions/emoji/index.mjs +1 -1
- package/dist/functions/reference/index.mjs +13 -12
- package/dist/functions/reference/index.mjs.map +1 -1
- package/dist/functions/registerReference/index.mjs +10 -9
- package/dist/functions/registerReference/index.mjs.map +1 -1
- package/dist/functions/usernameToColor/index.mjs +1 -1
- package/dist/index.mjs +120 -116
- package/dist/index.mjs.map +1 -1
- package/dist/utils/legacy.d.ts +2 -0
- package/package.json +20 -19
- package/dist/assets/NcAppNavigationList--36j6Acm.css +0 -28
- package/dist/assets/NcDateTimePickerNative-BP6eg8aU.css +0 -60
- package/dist/assets/NcPopover-CAoHhjKa.css +0 -123
- package/dist/assets/NcSelect-CvDEQAjD.css +0 -245
- package/dist/assets/NcSelectUsers-YF5729PJ.css +0 -4
- package/dist/chunks/ArrowRight-B1ncAhus.mjs.map +0 -1
- package/dist/chunks/ChevronDown-C6gc637b.mjs.map +0 -1
- package/dist/chunks/ChevronUp-ChH8oB7p.mjs.map +0 -1
- package/dist/chunks/Close-CuhcJnX2.mjs.map +0 -1
- package/dist/chunks/NcActionButton-BO5T5ePT.mjs.map +0 -1
- package/dist/chunks/NcActionButtonGroup-Dd03Oluy.mjs.map +0 -1
- package/dist/chunks/NcActionCaption-f7L9gBlT.mjs.map +0 -1
- package/dist/chunks/NcActionCheckbox-DBqiK-AZ.mjs.map +0 -1
- package/dist/chunks/NcActionInput-Dr8Yrafu.mjs.map +0 -1
- package/dist/chunks/NcActionLink-BFiaYt9A.mjs.map +0 -1
- package/dist/chunks/NcActionRadio-BA08CAtA.mjs.map +0 -1
- package/dist/chunks/NcActionRouter-vYFtIOzD.mjs.map +0 -1
- package/dist/chunks/NcActionSeparator-B9pNQaji.mjs.map +0 -1
- package/dist/chunks/NcActionText-CQ9qwJ0p.mjs.map +0 -1
- package/dist/chunks/NcActionTextEditable-B8y_GEre.mjs.map +0 -1
- package/dist/chunks/NcActions-C-wDqSrv.mjs.map +0 -1
- package/dist/chunks/NcAppContent-DavgjaFX.mjs.map +0 -1
- package/dist/chunks/NcAppContentDetails.vue_vue_type_script_setup_true_lang-BWl5Pw5g.mjs.map +0 -1
- package/dist/chunks/NcAppContentList-Copx3Ver.mjs.map +0 -1
- package/dist/chunks/NcAppNavigation-g57j16pB.mjs.map +0 -1
- package/dist/chunks/NcAppNavigationCaption-VjSWJ8R4.mjs.map +0 -1
- package/dist/chunks/NcAppNavigationIconBullet-BmU-dPcY.mjs.map +0 -1
- package/dist/chunks/NcAppNavigationItem-CDeYtA3E.mjs.map +0 -1
- package/dist/chunks/NcAppNavigationList-CGSWabRB.mjs +0 -17
- package/dist/chunks/NcAppNavigationList-CGSWabRB.mjs.map +0 -1
- package/dist/chunks/NcAppNavigationNew-CBNppM7Q.mjs.map +0 -1
- package/dist/chunks/NcAppNavigationNewItem-B1RfQkvu.mjs.map +0 -1
- package/dist/chunks/NcAppNavigationSearch-CQQWb1Eq.mjs.map +0 -1
- package/dist/chunks/NcAppNavigationSettings-DoMjRExO.mjs.map +0 -1
- package/dist/chunks/NcAppNavigationSpacer-CIRC4ZEj.mjs.map +0 -1
- package/dist/chunks/NcAppSettingsDialog-BPcEYLjP.mjs.map +0 -1
- package/dist/chunks/NcAppSettingsSection-BosSmisT.mjs.map +0 -1
- package/dist/chunks/NcAppSettingsShortcutsSection-DLwubKV9.mjs.map +0 -1
- package/dist/chunks/NcAppSidebar-C8YzAzrZ.mjs.map +0 -1
- package/dist/chunks/NcAppSidebarHeader.vue_vue_type_script_setup_true_lang-C-QhdyiN.mjs.map +0 -1
- package/dist/chunks/NcAppSidebarTab-DOSDDbGA.mjs.map +0 -1
- package/dist/chunks/NcAssistantButton-iK491d2v.mjs.map +0 -1
- package/dist/chunks/NcAssistantContent-iHA4O4cC.mjs.map +0 -1
- package/dist/chunks/NcAssistantIcon-C6s4Qm7-.mjs.map +0 -1
- package/dist/chunks/NcAvatar-1KxMUN7V.mjs.map +0 -1
- package/dist/chunks/NcBlurHash-B30Ol8KP.mjs.map +0 -1
- package/dist/chunks/NcBreadcrumb-3Y5NWXnV.mjs.map +0 -1
- package/dist/chunks/NcBreadcrumbs-BaTp3Sya.mjs.map +0 -1
- package/dist/chunks/NcButton-jvoYS2my.mjs.map +0 -1
- package/dist/chunks/NcCheckboxRadioSwitch-DVdt5Hkq.mjs.map +0 -1
- package/dist/chunks/NcChip-DKRlV47q.mjs.map +0 -1
- package/dist/chunks/NcCollectionList-B9qCtjJw.mjs.map +0 -1
- package/dist/chunks/NcColorPicker-BCkasLwT.mjs.map +0 -1
- package/dist/chunks/NcContent-BYh5hWDN.mjs.map +0 -1
- package/dist/chunks/NcCounterBubble-CV0YMrXW.mjs.map +0 -1
- package/dist/chunks/NcDashboardWidget-zmbDEGL-.mjs.map +0 -1
- package/dist/chunks/NcDashboardWidgetItem-DwDndrm_.mjs.map +0 -1
- package/dist/chunks/NcDateTime.vue_vue_type_script_setup_true_lang-BJuPH7S7.mjs.map +0 -1
- package/dist/chunks/NcDateTimePicker-qaFC_wUt.mjs +0 -415
- package/dist/chunks/NcDateTimePicker-qaFC_wUt.mjs.map +0 -1
- package/dist/chunks/NcDateTimePickerNative-B8CMOUnH.mjs.map +0 -1
- package/dist/chunks/NcDialog-D617YI0t.mjs.map +0 -1
- package/dist/chunks/NcDialogButton.vue_vue_type_script_setup_true_lang-Bqfy678u.mjs.map +0 -1
- package/dist/chunks/NcEllipsisedOption-D6Amb91K.mjs.map +0 -1
- package/dist/chunks/NcEmojiPicker-UTxgju3f.mjs.map +0 -1
- package/dist/chunks/NcEmptyContent-CGAPqk4S.mjs.map +0 -1
- package/dist/chunks/NcFilePicker-bD2toutn.mjs.map +0 -1
- package/dist/chunks/NcFormBox-Bmqar8nn.mjs.map +0 -1
- package/dist/chunks/NcFormBoxButton-G_PkUiQy.mjs.map +0 -1
- package/dist/chunks/NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang-BA_gWnmz.mjs.map +0 -1
- package/dist/chunks/NcFormBoxItem-Cm8aZaVJ.mjs.map +0 -1
- package/dist/chunks/NcFormBoxSwitch-DSXiQcnq.mjs.map +0 -1
- package/dist/chunks/NcFormGroup-N7qIFAwN.mjs.map +0 -1
- package/dist/chunks/NcGuestContent-CvT6VGt1.mjs.map +0 -1
- package/dist/chunks/NcHeaderButton-BnLwYCog.mjs.map +0 -1
- package/dist/chunks/NcHeaderMenu-ktQJV2SW.mjs.map +0 -1
- package/dist/chunks/NcHighlight.vue_vue_type_script_lang-DnWQDM_2.mjs.map +0 -1
- package/dist/chunks/NcHotkey-BDGeF3eH.mjs.map +0 -1
- package/dist/chunks/NcHotkeyList-B4WjTLAp.mjs.map +0 -1
- package/dist/chunks/NcIconSvgWrapper-g8ubWhoz.mjs.map +0 -1
- package/dist/chunks/NcIconToggleSwitch-CRvGt4su.mjs.map +0 -1
- package/dist/chunks/NcInputConfirmCancel-CGTllrXj.mjs.map +0 -1
- package/dist/chunks/NcInputField-5Sg6EUP6.mjs.map +0 -1
- package/dist/chunks/NcKbd-Bh_Tk6Ar.mjs.map +0 -1
- package/dist/chunks/NcListItem-BliLJpvU.mjs.map +0 -1
- package/dist/chunks/NcListItemIcon-Dl_tfkk9.mjs.map +0 -1
- package/dist/chunks/NcLoadingIcon-BOVpFVQz.mjs.map +0 -1
- package/dist/chunks/NcMentionBubble.vue_vue_type_style_index_0_scoped_3c4a673d_lang-DyqakLm5.mjs.map +0 -1
- package/dist/chunks/NcModal-DiDvgcU8.mjs.map +0 -1
- package/dist/chunks/NcNoteCard-mI7qVZ9j.mjs.map +0 -1
- package/dist/chunks/NcPasswordField-BFyzHTOO.mjs.map +0 -1
- package/dist/chunks/NcPopover-B87bEPLq.mjs.map +0 -1
- package/dist/chunks/NcProgressBar-C-ane-Ni.mjs.map +0 -1
- package/dist/chunks/NcRadioGroup-B4qmS2UD.mjs.map +0 -1
- package/dist/chunks/NcRadioGroupButton-CZykGwv3.mjs.map +0 -1
- package/dist/chunks/NcRelatedResourcesPanel-D_Ttpg5_.mjs.map +0 -1
- package/dist/chunks/NcRichContenteditable-Qw614bJ5.mjs.map +0 -1
- package/dist/chunks/NcRichText-BO_4KtBA.mjs.map +0 -1
- package/dist/chunks/NcSavingIndicatorIcon.vue_vue_type_script_setup_true_lang-DbQnMYZm.mjs.map +0 -1
- package/dist/chunks/NcSelect--kERLlBK.mjs.map +0 -1
- package/dist/chunks/NcSelectTags-I2hJaNax.mjs.map +0 -1
- package/dist/chunks/NcSelectUsers-K14Bepkq.mjs.map +0 -1
- package/dist/chunks/NcSettingsSection-Caz1fuWt.mjs.map +0 -1
- package/dist/chunks/NcSettingsSelectGroup-SYJ8-XlR.mjs.map +0 -1
- package/dist/chunks/NcTextArea-Dxzj4zdb.mjs.map +0 -1
- package/dist/chunks/NcTextField.vue_vue_type_script_setup_true_lang-Bx2esFU2.mjs.map +0 -1
- package/dist/chunks/NcThemeProvider.vue_vue_type_script_setup_true_lang-wie70gn4.mjs.map +0 -1
- package/dist/chunks/NcTimezonePicker.vue_vue_type_script_setup_true_lang-D7ZHgnwW.mjs.map +0 -1
- package/dist/chunks/NcUserBubble-BXR7vT0V.mjs.map +0 -1
- package/dist/chunks/NcUserStatusIcon-BF5OEQFU.mjs.map +0 -1
- package/dist/chunks/NcVNodes.vue_vue_type_script_lang-BqUHinRZ.mjs.map +0 -1
- package/dist/chunks/_l10n-wdIzZwir.mjs.map +0 -1
- package/dist/chunks/_plugin-vue_export-helper-1tPrXgE0.mjs.map +0 -1
- package/dist/chunks/actionGlobal-BZFdtdJL.mjs.map +0 -1
- package/dist/chunks/actionText-BXR0sWNu.mjs.map +0 -1
- package/dist/chunks/appName-DyNMVZpX.mjs.map +0 -1
- package/dist/chunks/autolink-DrIurosL.mjs.map +0 -1
- package/dist/chunks/colors-Cv9F-jWS.mjs.map +0 -1
- package/dist/chunks/constants-Ciwvl5xb.mjs.map +0 -1
- package/dist/chunks/constants-wIEKSp2G.mjs.map +0 -1
- package/dist/chunks/createElementId-DhjFt1I9.mjs.map +0 -1
- package/dist/chunks/customPickerElements-BqbDcaEu.mjs +0 -123
- package/dist/chunks/customPickerElements-BqbDcaEu.mjs.map +0 -1
- package/dist/chunks/emoji-C8k9NUlo.mjs.map +0 -1
- package/dist/chunks/focusTrap-HJQ4pqHV.mjs.map +0 -1
- package/dist/chunks/legacy-BoqDmOCa.mjs.map +0 -1
- package/dist/chunks/logger-D3RVzcfQ.mjs.map +0 -1
- package/dist/chunks/mdi-CpchYUUV.mjs.map +0 -1
- package/dist/chunks/platform-CC2ecGvV.mjs.map +0 -1
- package/dist/chunks/referencePickerModal-CnKdEDwu.mjs.map +0 -1
- package/dist/chunks/rtl-v0UOPAM7.mjs.map +0 -1
- package/dist/chunks/useAppSettingsDialog-C73Wx6iQ.mjs.map +0 -1
- package/dist/chunks/useCopy-6F-qWHq0.mjs.map +0 -1
- package/dist/chunks/useNcActions-BzPO2c4h.mjs.map +0 -1
- package/dist/chunks/useNcFormBox-Djlh582y.mjs.map +0 -1
- package/dist/chunks/useNcRadioGroup-D6llQmAl.mjs.map +0 -1
- package/dist/chunks/useTrapStackControl-B6cEicto.mjs.map +0 -1
- /package/dist/assets/{NcActionButtonGroup-Bt8kRk79.css → NcActionButtonGroup.css} +0 -0
- /package/dist/assets/{NcActionCaption-DnG2OyWa.css → NcActionCaption.css} +0 -0
- /package/dist/assets/{NcActionSeparator-Ct2RnclR.css → NcActionSeparator.css} +0 -0
- /package/dist/assets/{NcAppContent-TgcZd4AI.css → NcAppContent.css} +0 -0
- /package/dist/assets/{NcAppNavigationCaption-ggcWspH2.css → NcAppNavigationCaption.css} +0 -0
- /package/dist/assets/{NcAppNavigationIconBullet-DLQJkObX.css → NcAppNavigationIconBullet.css} +0 -0
- /package/dist/assets/{NcAppNavigationNew-Bn8zj5lM.css → NcAppNavigationNew.css} +0 -0
- /package/dist/assets/{NcAppNavigationSearch-DD7mo6OW.css → NcAppNavigationSearch.css} +0 -0
- /package/dist/assets/{NcAppNavigationSpacer-LST5uYYS.css → NcAppNavigationSpacer.css} +0 -0
- /package/dist/assets/{NcAppSettingsSection-DIw8GLHR.css → NcAppSettingsSection.css} +0 -0
- /package/dist/assets/{NcBreadcrumb-BxhZKQlW.css → NcBreadcrumb.css} +0 -0
- /package/dist/assets/{NcBreadcrumbs-B4eyDS9i.css → NcBreadcrumbs.css} +0 -0
- /package/dist/assets/{NcChip-DbSI4mFP.css → NcChip.css} +0 -0
- /package/dist/assets/{NcCollectionList-e5JFvzqX.css → NcCollectionList.css} +0 -0
- /package/dist/assets/{NcColorPicker-DVYGs8R3.css → NcColorPicker.css} +0 -0
- /package/dist/assets/{NcContent-DX4Rs6Pc.css → NcContent.css} +0 -0
- /package/dist/assets/{NcCounterBubble-ZnteskDR.css → NcCounterBubble.css} +0 -0
- /package/dist/assets/{NcDashboardWidget-nZuIL1UN.css → NcDashboardWidget.css} +0 -0
- /package/dist/assets/{NcDashboardWidgetItem-DpVmEBwQ.css → NcDashboardWidgetItem.css} +0 -0
- /package/dist/assets/{NcDialog-BSV74Bru.css → NcDialog.css} +0 -0
- /package/dist/assets/{NcEmojiPicker-vNKR9S87.css → NcEmojiPicker.css} +0 -0
- /package/dist/assets/{NcEmptyContent-DJMDuGVz.css → NcEmptyContent.css} +0 -0
- /package/dist/assets/{NcGuestContent-CM0uWLr1.css → NcGuestContent.css} +0 -0
- /package/dist/assets/{NcHeaderButton-CVOQgRjm.css → NcHeaderButton.css} +0 -0
- /package/dist/assets/{NcIconSvgWrapper-N3OwSN9O.css → NcIconSvgWrapper.css} +0 -0
- /package/dist/assets/{NcInputConfirmCancel-DZEDRf0t.css → NcInputConfirmCancel.css} +0 -0
- /package/dist/assets/{NcListItem-BjeejGlB.css → NcListItem.css} +0 -0
- /package/dist/assets/{NcListItemIcon-DJRcmlo1.css → NcListItemIcon.css} +0 -0
- /package/dist/assets/{NcLoadingIcon-CWUlo4XY.css → NcLoadingIcon.css} +0 -0
- /package/dist/assets/{NcMentionBubble-BeGb2xGc.css → NcMentionBubble.css} +0 -0
- /package/dist/assets/{NcModal-D81luiuU.css → NcModal.css} +0 -0
- /package/dist/assets/{NcNoteCard-DfescGKl.css → NcNoteCard.css} +0 -0
- /package/dist/assets/{NcPasswordField-BN4HFgU5.css → NcPasswordField.css} +0 -0
- /package/dist/assets/{NcRelatedResourcesPanel-BZKjkugM.css → NcRelatedResourcesPanel.css} +0 -0
- /package/dist/assets/{NcRichText-D0Bu5bbu.css → NcRichText.css} +0 -0
- /package/dist/assets/{NcSettingsSection-f5rBJsKJ.css → NcSettingsSection.css} +0 -0
- /package/dist/assets/{NcSettingsSelectGroup-D_fSrafm.css → NcSettingsSelectGroup.css} +0 -0
- /package/dist/assets/{NcTextArea-BxGe3Lqn.css → NcTextArea.css} +0 -0
- /package/dist/assets/{NcUserBubble-DFUmBxeb.css → NcUserBubble.css} +0 -0
- /package/dist/assets/{NcUserStatusIcon-B3aHoBAd.css → NcUserStatusIcon.css} +0 -0
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import '../assets/NcAvatar
|
|
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
|
|
9
|
-
import {
|
|
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,
|
|
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 {
|
|
21
|
-
import {
|
|
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
|
|
25
|
-
import {
|
|
26
|
-
import { N as
|
|
27
|
-
import { N as
|
|
28
|
-
import { N as
|
|
29
|
-
import { N as
|
|
30
|
-
import { N as
|
|
31
|
-
import { N as
|
|
32
|
-
import { N as
|
|
33
|
-
|
|
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
|
|
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.
|
|
299
|
-
|
|
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
|
|
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.
|
|
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
|
-
$
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
key:
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
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
|
-
|
|
623
|
-
"onUpdate:
|
|
624
|
-
"
|
|
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
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
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
|
-
(
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
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
|
-
_:
|
|
652
|
-
}, [
|
|
653
|
-
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
6
|
-
import { _ as _export_sfc } from "./_plugin-vue_export-helper
|
|
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 = "
|
|
87
|
-
const fadeTransitionActive = "
|
|
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
|
|
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
|
|
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
|
|
4
|
-
import { N as NcButton } from "./NcButton
|
|
5
|
-
import { c as createElementId } from "./createElementId
|
|
6
|
-
import { N as NcActions } from "./NcActions
|
|
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
|
|
293
|
+
//# sourceMappingURL=NcBreadcrumb.mjs.map
|