{"version":3,"file":"profile-main.mjs","sources":["../node_modules/vue-material-design-icons/BriefcaseOutline.vue","../build/frontend/apps/profile/src/components/ProfileSection.vue","../build/frontend/apps/profile/src/components/SharedResourcesSection.vue","../build/frontend/apps/profile/src/services/sharedResources.ts","../build/frontend/apps/profile/src/views/ProfileApp.vue","../build/frontend/apps/profile/src/services/ProfileSections.ts","../build/frontend/apps/profile/src/main.ts"],"sourcesContent":["<template>\n  <span v-bind=\"$attrs\"\n        :aria-hidden=\"title ? null : 'true'\"\n        :aria-label=\"title\"\n        class=\"material-design-icon briefcase-outline-icon\"\n        role=\"img\"\n        @click=\"$emit('click', $event)\">\n    <svg :fill=\"fillColor\"\n         class=\"material-design-icon__svg\"\n         :width=\"size\"\n         :height=\"size\"\n         viewBox=\"0 0 24 24\">\n      <path d=\"M20,6C20.58,6 21.05,6.2 21.42,6.59C21.8,7 22,7.45 22,8V19C22,19.55 21.8,20 21.42,20.41C21.05,20.8 20.58,21 20,21H4C3.42,21 2.95,20.8 2.58,20.41C2.2,20 2,19.55 2,19V8C2,7.45 2.2,7 2.58,6.59C2.95,6.2 3.42,6 4,6H8V4C8,3.42 8.2,2.95 8.58,2.58C8.95,2.2 9.42,2 10,2H14C14.58,2 15.05,2.2 15.42,2.58C15.8,2.95 16,3.42 16,4V6H20M4,8V19H20V8H4M14,6V4H10V6H14Z\">\n        <title v-if=\"title\">{{ title }}</title>\n      </path>\n    </svg>\n  </span>\n</template>\n\n<script>\nexport default {\n  name: \"BriefcaseOutlineIcon\",\n  emits: ['click'],\n  props: {\n    title: {\n      type: String,\n    },\n    fillColor: {\n      type: String,\n      default: \"currentColor\"\n    },\n    size: {\n      type: Number,\n      default: 24\n    }\n  }\n}\n</script>","<!--\n  - SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { IProfileSection } from '../services/ProfileSections.ts'\n\ndefineProps<{\n\tsection: IProfileSection\n\tuserId: string | undefined\n}>()\n</script>\n\n<template>\n\t<div :class=\"$style.profileSection\">\n\t\t<component\n\t\t\t:is=\"section.tagName\"\n\t\t\tv-bind.prop=\"section.params\"\n\t\t\t:user.prop=\"userId\" />\n\t</div>\n</template>\n\n<style module>\n.profileSection {\n\tmargin-top: 2rem;\n}\n</style>\n","<!--\n  - SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { SharedResource } from '../services/sharedResources.ts'\n\nimport { translate as t } from '@nextcloud/l10n'\nimport { computed } from 'vue'\nimport NcListItem from '@nextcloud/vue/components/NcListItem'\n\nconst props = defineProps<{\n\tdisplayName: string\n\tresources: SharedResource[]\n}>()\n\nconst title = computed(() => t('profile', 'You & {user}', { user: props.displayName }))\n</script>\n\n<template>\n\t<section class=\"shared-resources\" :aria-label=\"title\">\n\t\t<h3 class=\"shared-resources__title\">\n\t\t\t{{ title }}\n\t\t</h3>\n\t\t<ul>\n\t\t\t<NcListItem\n\t\t\t\tv-for=\"resource in resources\"\n\t\t\t\t:key=\"`${resource.href}-${resource.label}`\"\n\t\t\t\tclass=\"shared-resources__item\"\n\t\t\t\tcompact\n\t\t\t\t:name=\"resource.label\"\n\t\t\t\t:href=\"resource.href\"\n\t\t\t\ttarget=\"_self\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<img\n\t\t\t\t\t\tclass=\"shared-resources__icon\"\n\t\t\t\t\t\t:class=\"{ 'shared-resources__icon--themed': resource.themedIcon }\"\n\t\t\t\t\t\t:src=\"resource.img\"\n\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\tdecoding=\"async\"\n\t\t\t\t\t\tloading=\"lazy\">\n\t\t\t\t</template>\n\t\t\t\t<template #subname>\n\t\t\t\t\t<span>{{ resource.text }}</span>\n\t\t\t\t</template>\n\t\t\t</NcListItem>\n\t\t</ul>\n\t</section>\n</template>\n\n<style scoped lang=\"scss\">\n.shared-resources {\n\tmargin-top: 24px;\n\twidth: 100%;\n\tmax-width: 300px;\n\n\t&__title {\n\t\tfont-size: var(--default-font-size);\n\t\tfont-weight: bold;\n\t\tmargin: 0 0 8px;\n\t\toverflow-wrap: anywhere;\n\t}\n\n\t&__list {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tlist-style: none;\n\t}\n\n\t&__icon {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tobject-fit: contain;\n\t\tborder-radius: var(--border-radius);\n\n\t\t&--themed {\n\t\t\tfilter: var(--background-invert-if-dark);\n\t\t}\n\t}\n}\n\n@media only screen and (max-width: 1024px) {\n\t.shared-resources {\n\t\tmax-width: none;\n\t}\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { AxiosResponse } from '@nextcloud/axios'\n\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\nexport interface SharedResource {\n\tlabel: string\n\ttext: string\n\thref: string\n\timg: string\n\t/** Monochrome app icon that should follow the text color via CSS filter. */\n\tthemedIcon?: boolean\n}\n\ninterface OcsResponse<T> {\n\tocs: {\n\t\tdata: T\n\t}\n}\n\n/**\n * Fetch resources shared between the current user and the given user.\n *\n * @param userId - The user ID of the profile being viewed\n */\nexport async function getSharedResources(userId: string): Promise<SharedResource[]> {\n\tconst url = generateOcsUrl('/apps/profile/api/v1/resources/{userId}', { userId })\n\tconst response = await axios.get(url) as AxiosResponse<OcsResponse<SharedResource[]>>\n\treturn response.data.ocs.data\n}\n","<!--\n  - SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { IProfileSection } from '../services/ProfileSections.ts'\nimport type { SharedResource } from '../services/sharedResources.ts'\n\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { showError } from '@nextcloud/dialogs'\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { loadState } from '@nextcloud/initial-state'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { useIsMobile } from '@nextcloud/vue/composables/useIsMobile'\nimport { computed, onBeforeMount, onBeforeUnmount, onMounted, ref } from 'vue'\nimport NcActionLink from '@nextcloud/vue/components/NcActionLink'\nimport NcActions from '@nextcloud/vue/components/NcActions'\nimport NcAppContent from '@nextcloud/vue/components/NcAppContent'\nimport NcAvatar from '@nextcloud/vue/components/NcAvatar'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcContent from '@nextcloud/vue/components/NcContent'\nimport NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'\nimport NcRichText from '@nextcloud/vue/components/NcRichText'\nimport AccountIcon from 'vue-material-design-icons/AccountOutline.vue'\nimport BriefcaseIcon from 'vue-material-design-icons/BriefcaseOutline.vue'\nimport MapMarkerIcon from 'vue-material-design-icons/MapMarkerOutline.vue'\nimport PencilIcon from 'vue-material-design-icons/PencilOutline.vue'\nimport ProfileSection from '../components/ProfileSection.vue'\nimport SharedResourcesSection from '../components/SharedResourcesSection.vue'\nimport { logger } from '../services/logger.ts'\nimport { getSharedResources } from '../services/sharedResources.ts'\n\ninterface IProfileAction {\n\ttarget: string\n\ticon: string\n\tid: string\n\ttitle: string\n}\n\ninterface IStatus {\n\ticon: string\n\tmessage: string\n\tuserId: string\n}\n\nconst profileParameters = loadState('profile', 'profileParameters', {\n\tuserId: undefined as string | undefined,\n\tdisplayname: undefined as string | undefined,\n\taddress: undefined as string | undefined,\n\torganisation: undefined as string | undefined,\n\trole: undefined as string | undefined,\n\theadline: undefined as string | undefined,\n\tbiography: undefined as string | undefined,\n\tactions: [] as IProfileAction[],\n\tisUserAvatarVisible: false,\n\tpronouns: undefined as string | undefined,\n})\n\nconst userStatus = ref(loadState<Partial<IStatus>>('profile', 'status', {}))\nconst sections = ref<IProfileSection[]>([])\nconst sortedSections = computed(() => [...sections.value].sort((a, b) => b.order - a.order))\nonBeforeMount(() => {\n\tsections.value = window.OCA.Profile.ProfileSections.getSections()\n})\n\nconst isCurrentUser = getCurrentUser()?.uid === profileParameters.userId\nconst isMobile = useIsMobile()\nconst profileDisplayName = profileParameters.displayname || profileParameters.userId || ''\nconst showSharedResources = Boolean(!isCurrentUser && profileParameters.userId)\nconst sharedResources = ref<SharedResource[] | null>(null)\n\nconst primaryAction = profileParameters.actions[0]\nconst showEditAsPrimaryAction = computed(() => isMobile.value && isCurrentUser)\nconst otherActions = computed(() => showEditAsPrimaryAction.value\n\t? profileParameters.actions\n\t: profileParameters.actions.slice(1))\n\nconst settingsUrl = generateUrl('/settings/user')\nconst emptyProfileMessage = isCurrentUser\n\t? t('profile', 'You have not added any info yet')\n\t: t('profile', '{user} has not added any info yet', { user: profileDisplayName })\n\nonMounted(() => {\n\t// Set the user's displayname or userId in the page title and preserve the default title of \"Nextcloud\" at the end\n\tdocument.title = `${profileParameters.displayname || profileParameters.userId} - ${document.title}`\n\tsubscribe('user_status:status.updated', handleStatusUpdate)\n\tif (showSharedResources) {\n\t\tloadSharedResources()\n\t}\n})\n\nonBeforeUnmount(() => {\n\tunsubscribe('user_status:status.updated', handleStatusUpdate)\n})\n\n/**\n * Update the user status\n *\n * @param status - The new status\n */\nfunction handleStatusUpdate(status: IStatus) {\n\tif (isCurrentUser && status.userId === profileParameters.userId) {\n\t\tuserStatus.value = status\n\t}\n}\n\n/**\n * Load resources shared between the current user and the profile owner\n */\nasync function loadSharedResources() {\n\ttry {\n\t\tsharedResources.value = await getSharedResources(profileParameters.userId!)\n\t} catch (error) {\n\t\tlogger.error('Failed to load shared resources for profile', { error })\n\t\tsharedResources.value = []\n\t}\n}\n\n/**\n * Open the user status modal by simulating a click on the hidden status menu item in the avatar menu\n */\nfunction openStatusModal() {\n\t// Changing the user status is only enabled if you are the current user\n\tif (!isCurrentUser) {\n\t\treturn\n\t}\n\n\tconst statusMenuItem = document.querySelector<HTMLButtonElement>('.user-status-menu-item')\n\tif (statusMenuItem) {\n\t\tstatusMenuItem.click()\n\t} else {\n\t\tshowError(t('profile', 'Error opening the user status modal, try hard refreshing the page'))\n\t}\n}\n</script>\n\n<template>\n\t<NcContent appName=\"profile\">\n\t\t<NcAppContent>\n\t\t\t<div class=\"profile__header\">\n\t\t\t\t<div class=\"profile__header__container\">\n\t\t\t\t\t<NcAvatar\n\t\t\t\t\t\tv-if=\"isMobile\"\n\t\t\t\t\t\tclass=\"avatar profile__header__container__avatar\"\n\t\t\t\t\t\t:class=\"{ interactive: isCurrentUser }\"\n\t\t\t\t\t\t:user=\"profileParameters.userId\"\n\t\t\t\t\t\t:size=\"120\"\n\t\t\t\t\t\tdisableMenu\n\t\t\t\t\t\tdisableTooltip\n\t\t\t\t\t\t:isNoUser=\"!profileParameters.isUserAvatarVisible\"\n\t\t\t\t\t\t@click.prevent.stop=\"openStatusModal\" />\n\t\t\t\t\t<div class=\"profile__header__container__placeholder\" />\n\t\t\t\t\t<div class=\"profile__header__container__displayname\">\n\t\t\t\t\t\t<h2>{{ profileParameters.displayname || profileParameters.userId }}</h2>\n\t\t\t\t\t\t<span v-if=\"profileParameters.pronouns\" class=\"profile__header__container__pronoun-separator\">·</span>\n\t\t\t\t\t\t<span v-if=\"profileParameters.pronouns\" class=\"profile__header__container__pronouns\">{{ profileParameters.pronouns }}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"profile__header__container__controls\">\n\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\tv-if=\"userStatus.icon || userStatus.message\"\n\t\t\t\t\t\t\tclass=\"profile__header__container__status\"\n\t\t\t\t\t\t\t:disabled=\"!isCurrentUser\"\n\t\t\t\t\t\t\t:variant=\"isCurrentUser ? 'tertiary' : 'tertiary-no-background'\"\n\t\t\t\t\t\t\t@click=\"openStatusModal\">\n\t\t\t\t\t\t\t<span class=\"profile__header__container__status-content\">\n\t\t\t\t\t\t\t\t<span>{{ userStatus.icon }} {{ userStatus.message }}</span>\n\t\t\t\t\t\t\t\t<PencilIcon v-if=\"isCurrentUser\" :size=\"20\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\tv-if=\"isCurrentUser && !isMobile\"\n\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\t:href=\"settingsUrl\">\n\t\t\t\t\t\t\t{{ t('profile', 'Edit profile') }}\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"profile__wrapper\">\n\t\t\t\t<div class=\"profile__content\">\n\t\t\t\t\t<div class=\"profile__sidebar\">\n\t\t\t\t\t\t<NcAvatar\n\t\t\t\t\t\t\tv-if=\"!isMobile\"\n\t\t\t\t\t\t\tclass=\"avatar\"\n\t\t\t\t\t\t\t:class=\"{ interactive: isCurrentUser }\"\n\t\t\t\t\t\t\t:user=\"profileParameters.userId\"\n\t\t\t\t\t\t\t:size=\"180\"\n\t\t\t\t\t\t\tdisableMenu\n\t\t\t\t\t\t\tdisableTooltip\n\t\t\t\t\t\t\t:isNoUser=\"!profileParameters.isUserAvatarVisible\"\n\t\t\t\t\t\t\t@click.prevent.stop=\"openStatusModal\" />\n\n\t\t\t\t\t\t<div class=\"user-actions\">\n\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\tv-if=\"showEditAsPrimaryAction\"\n\t\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\t\tclass=\"user-actions__primary\"\n\t\t\t\t\t\t\t\t:href=\"settingsUrl\">\n\t\t\t\t\t\t\t\t{{ t('profile', 'Edit profile') }}\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t<!-- When a tel: URL is opened with target=\"_blank\", a blank new tab is opened which is inconsistent with the handling of other URLs so we set target=\"_self\" for the phone action -->\n\t\t\t\t\t\t\t<NcButton\n\t\t\t\t\t\t\t\tv-if=\"primaryAction && !showEditAsPrimaryAction\"\n\t\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\t\tclass=\"user-actions__primary\"\n\t\t\t\t\t\t\t\t:href=\"primaryAction.target\"\n\t\t\t\t\t\t\t\t:icon=\"primaryAction.icon\"\n\t\t\t\t\t\t\t\t:target=\"primaryAction.id === 'phone' ? '_self' : '_blank'\"\n\t\t\t\t\t\t\t\t:rel=\"primaryAction.id === 'fediverse' ? 'me' : undefined\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<!-- Fix for https://github.com/nextcloud-libraries/nextcloud-vue/issues/2315 -->\n\t\t\t\t\t\t\t\t\t<img :src=\"primaryAction.icon\" alt=\"\" class=\"user-actions__primary__icon\">\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ primaryAction.title }}\n\t\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t\t\t<NcActions\n\t\t\t\t\t\t\t\tv-if=\"otherActions.length > 0\"\n\t\t\t\t\t\t\t\tclass=\"user-actions__other\"\n\t\t\t\t\t\t\t\t:inline=\"isMobile ? 5 : 4\">\n\t\t\t\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\t\t\t\tv-for=\"action in otherActions\"\n\t\t\t\t\t\t\t\t\t:key=\"action.id\"\n\t\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\t\t:href=\"action.target\"\n\t\t\t\t\t\t\t\t\t:target=\"action.id === 'phone' ? '_self' : '_blank'\"\n\t\t\t\t\t\t\t\t\t:rel=\"primaryAction.id === 'fediverse' ? 'me' : undefined\">\n\t\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t\t<!-- Fix for https://github.com/nextcloud-libraries/nextcloud-vue/issues/2315 -->\n\t\t\t\t\t\t\t\t\t\t<img :src=\"action.icon\" alt=\"\" class=\"user-actions__other__icon\">\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t{{ action.title }}\n\t\t\t\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t\t\t</NcActions>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Desktop: show shared resources under the actions in the sidebar -->\n\t\t\t\t\t\t<SharedResourcesSection\n\t\t\t\t\t\t\tv-if=\"!isMobile && showSharedResources && sharedResources?.length\"\n\t\t\t\t\t\t\t:displayName=\"profileDisplayName\"\n\t\t\t\t\t\t\t:resources=\"sharedResources\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"profile__blocks\">\n\t\t\t\t\t\t<div v-if=\"profileParameters.organisation || profileParameters.role || profileParameters.address\" class=\"profile__blocks-details\">\n\t\t\t\t\t\t\t<div v-if=\"profileParameters.organisation || profileParameters.role\" class=\"detail\">\n\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t<BriefcaseIcon\n\t\t\t\t\t\t\t\t\t\tclass=\"detail-icon\"\n\t\t\t\t\t\t\t\t\t\t:size=\"16\" />\n\t\t\t\t\t\t\t\t\t{{ profileParameters.organisation }} <span v-if=\"profileParameters.organisation && profileParameters.role\">•</span> {{ profileParameters.role }}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div v-if=\"profileParameters.address\" class=\"detail\">\n\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t<MapMarkerIcon\n\t\t\t\t\t\t\t\t\t\tclass=\"detail-icon\"\n\t\t\t\t\t\t\t\t\t\t:size=\"16\" />\n\t\t\t\t\t\t\t\t\t{{ profileParameters.address }}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<template v-if=\"profileParameters.headline || profileParameters.biography || sections.length > 0\">\n\t\t\t\t\t\t\t<h3 v-if=\"profileParameters.headline\" class=\"profile__blocks-headline\">\n\t\t\t\t\t\t\t\t{{ profileParameters.headline }}\n\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t<NcRichText v-if=\"profileParameters.biography\" :text=\"profileParameters.biography\" useExtendedMarkdown />\n\n\t\t\t\t\t\t\t<!-- additional entries, use it with cautious -->\n\t\t\t\t\t\t\t<ProfileSection\n\t\t\t\t\t\t\t\tv-for=\"section in sortedSections\"\n\t\t\t\t\t\t\t\t:key=\"section.id\"\n\t\t\t\t\t\t\t\t:section=\"section\"\n\t\t\t\t\t\t\t\t:userId=\"profileParameters.userId\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<NcEmptyContent\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\tclass=\"profile__blocks-empty-info\"\n\t\t\t\t\t\t\t:name=\"emptyProfileMessage\"\n\t\t\t\t\t\t\t:description=\"t('profile', 'The headline and about sections will show up here')\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<AccountIcon :size=\"60\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</NcEmptyContent>\n\n\t\t\t\t\t\t<!-- Mobile: show shared resources under the description -->\n\t\t\t\t\t\t<SharedResourcesSection\n\t\t\t\t\t\t\tv-if=\"isMobile && showSharedResources && sharedResources?.length\"\n\t\t\t\t\t\t\t:displayName=\"profileDisplayName\"\n\t\t\t\t\t\t\t:resources=\"sharedResources\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</NcAppContent>\n\t</NcContent>\n</template>\n\n<style lang=\"scss\" scoped>\n$profile-max-width: 1024px;\n$content-max-width: 640px;\n\n:deep(#app-content-vue) {\n\tbackground-color: unset;\n\tmin-width: 320px;\n}\n\n.profile {\n\twidth: 100%;\n\toverflow-y: auto;\n\n\t&__header {\n\t\tdisplay: flex;\n\t\tposition: sticky;\n\t\theight: 190px;\n\t\ttop: -40px;\n\t\tbackground-color: var(--color-main-background-blur);\n\t\tbackdrop-filter: var(--filter-background-blur);\n\t\t-webkit-backdrop-filter: var(--filter-background-blur);\n\n\t\t&__container {\n\t\t\talign-self: flex-end;\n\t\t\twidth: 100%;\n\t\t\tmax-width: $profile-max-width;\n\t\t\tmargin: 8px auto;\n\t\t\trow-gap: 8px;\n\t\t\tdisplay: grid;\n\t\t\tgrid-template-rows: max-content max-content;\n\t\t\tgrid-template-columns: 240px 1fr;\n\t\t\tjustify-content: center;\n\n\t\t\t&__placeholder {\n\t\t\t\tgrid-row: 1 / 3;\n\t\t\t}\n\n\t\t\t&__displayname {\n\t\t\t\tpadding-inline: 16px; // same as the status text button, see NcButton\n\t\t\t\twidth: $content-max-width;\n\t\t\t\theight: 45px;\n\t\t\t\tmargin-block: 125px 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 18px;\n\n\t\t\t\th2 {\n\t\t\t\t\tfont-size: 30px;\n\t\t\t\t\tmargin: 0;\n\t\t\t\t}\n\n\t\t\t\tspan {\n\t\t\t\t\tfont-size: 20px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&__controls {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t&__status-content {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__sidebar {\n\t\tposition: sticky;\n\t\ttop: 0;\n\t\talign-self: flex-start;\n\t\tpadding-top: 20px;\n\t\tmin-width: 220px;\n\t\tmargin-block: -150px 0;\n\t\tmargin-inline: 0 20px;\n\t}\n\n\t&__header,\n\t&__sidebar {\n\t\t// Specificity hack is needed to override Avatar component styles\n\t\t:deep(.avatar.avatardiv) {\n\t\t\ttext-align: center;\n\t\t\tmargin: auto;\n\t\t\tdisplay: block;\n\t\t\tpadding: 8px;\n\n\t\t\t&.interactive {\n\t\t\t\t.avatardiv__user-status {\n\t\t\t\t\t// Show that the status is interactive\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.avatardiv__user-status {\n\t\t\t\tinset-inline-end: 14px;\n\t\t\t\tbottom: 14px;\n\t\t\t\twidth: 34px;\n\t\t\t\theight: 34px;\n\t\t\t\tbackground-size: 28px;\n\t\t\t\tborder: none;\n\t\t\t\t// Styles when custom status icon and status text are set\n\t\t\t\tbackground-color: var(--color-main-background);\n\t\t\t\tline-height: 34px;\n\t\t\t\tfont-size: 20px;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__wrapper {\n\t\tbackground-color: var(--color-main-background);\n\t\tmin-height: 100%;\n\t}\n\n\t&__content {\n\t\tmax-width: $profile-max-width;\n\t\tmargin: 0 auto;\n\t\tdisplay: flex;\n\t\twidth: 100%;\n\t}\n\n\t&__blocks {\n\t\tmargin: 18px 0 80px 16px;\n\t\tdisplay: grid;\n\t\talign-content: start;\n\t\tgap: 16px 0;\n\t\twidth: $content-max-width;\n\n\t\tp, h3 {\n\t\t\tcursor: text;\n\t\t\toverflow-wrap: anywhere;\n\t\t}\n\n\t\t&-details {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 2px 0;\n\n\t\t\t.detail {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tcolor: var(--color-text-maxcontrast);\n\n\t\t\t\tp .detail-icon {\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t\tvertical-align: middle;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&-headline {\n\t\t\tmargin-inline: 0;\n\t\t\tmargin-block: 10px 0;\n\t\t\tfont-weight: bold;\n\t\t\tfont-size: 20px;\n\t\t}\n\t}\n}\n\n.user-actions {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px 0;\n\tmargin-top: 20px;\n\tmax-width: 300px;\n\n\t&__primary {\n\t\tmargin: 0 auto;\n\t\twidth: 180px !important;\n\n\t\t&__icon {\n\t\t\tfilter: var(--primary-invert-if-dark);\n\t\t}\n\t}\n\n\t&__other {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\tgap: 0 4px;\n\n\t\t&__icon {\n\t\t\theight: 20px;\n\t\t\twidth: 20px;\n\t\t\tobject-fit: contain;\n\t\t\tfilter: var(--background-invert-if-dark);\n\t\t\talign-self: center;\n\t\t\tmargin: 12px; // so we get 44px x 44px\n\t\t}\n\t}\n}\n\n@media only screen and (max-width: 1024px) {\n\t.profile {\n\t\t&__header {\n\t\t\theight: 190px;\n\t\t\tposition: unset;\n\n\t\t\t&__container {\n\t\t\t\talign-self: center;\n\t\t\t\tgrid-template-columns: 136px minmax(0, 1fr);\n\t\t\t\tgrid-template-rows: max-content max-content;\n\t\t\t\tmax-width: 600px;\n\t\t\t\tmargin: 0 auto;\n\t\t\t\tpadding-inline: 16px;\n\t\t\t\trow-gap: 0;\n\n\t\t\t\t&__avatar {\n\t\t\t\t\tgrid-column: 1;\n\t\t\t\t\tgrid-row: 1 / 3;\n\t\t\t\t\tjustify-self: center;\n\t\t\t\t}\n\n\t\t\t\t&__placeholder {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\n\t\t\t\t&__displayname {\n\t\t\t\t\tgrid-column: 2;\n\t\t\t\t\tgrid-row: 1;\n\t\t\t\t\tmargin: 0;\n\t\t\t\t\twidth: unset;\n\t\t\t\t\theight: unset;\n\t\t\t\t\tflex-direction: column;\n\t\t\t\t\talign-items: flex-start;\n\t\t\t\t\tgap: 2px;\n\n\t\t\t\t\th2 {\n\t\t\t\t\t\tfont-size: 24px;\n\t\t\t\t\t\toverflow-wrap: anywhere;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&__pronoun-separator {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\n\t\t\t\t&__status {\n\t\t\t\t\tgrid-column: 2;\n\t\t\t\t\tgrid-row: 2;\n\t\t\t\t\tjustify-self: start;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&__content {\n\t\t\tdisplay: block;\n\t\t}\n\n\t\t&__blocks {\n\t\t\twidth: unset;\n\t\t\tmax-width: 600px;\n\t\t\tmargin: 0 auto;\n\t\t\tpadding: 20px 50px 50px 50px;\n\t\t}\n\n\t\t&__sidebar {\n\t\t\tmargin: unset;\n\t\t\tposition: unset;\n\t\t}\n\n\t\t&__header,\n\t\t&__sidebar {\n\t\t\t:deep(.avatar.avatardiv) {\n\t\t\t\t.avatardiv__user-status {\n\t\t\t\t\tinset-inline-end: 0;\n\t\t\t\t\tbottom: 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t.user-actions {\n\t\twidth: unset;\n\t\tmax-width: 600px;\n\t\tmargin: 0 auto;\n\t\tpadding: 20px 50px 0px 50px;\n\n\t\t&__primary {\n\t\t\twidth: 220px !important;\n\t\t}\n\t}\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { logger } from './logger.ts'\n\nexport interface IProfileSection {\n\t/**\n\t * Unique identifier for the section\n\t */\n\tid: string\n\t/**\n\t * The order in which the section should appear\n\t */\n\torder: number\n\t/**\n\t * The custom element tag name to be used for this section\n\t *\n\t * The custom element must have been registered beforehand,\n\t * and must have the a `user` property of type `string | undefined`.\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_components\n\t */\n\ttagName: string\n\t/**\n\t * Static parameters to be passed to the custom web component\n\t */\n\tparams?: Record<string, unknown>\n}\n\nexport default class ProfileSections {\n\t#sections: Map<string, IProfileSection>\n\n\tconstructor() {\n\t\tthis.#sections = new Map()\n\t}\n\n\t/**\n\t * @param section To be called to mount the section to the profile page\n\t */\n\tregisterSection(section: IProfileSection) {\n\t\tif (this.#sections.has(section.id)) {\n\t\t\tlogger.warn(`Profile section with id '${section.id}' is already registered.`)\n\t\t}\n\t\tthis.#sections.set(section.id, section)\n\t}\n\n\tgetSections() {\n\t\treturn [...this.#sections.values()]\n\t}\n}\n","/*\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { createApp } from 'vue'\nimport ProfileApp from './views/ProfileApp.vue'\nimport ProfileSections from './services/ProfileSections.js'\n\nimport 'vite/modulepreload-polyfill'\n\nwindow.OCA.Profile ??= {}\nwindow.OCA.Profile.ProfileSections = new ProfileSections()\n\nconst app = createApp(ProfileApp)\napp.mount('#content')\n"],"names":["_sfc_main","_hoisted_3","_createElementBlock","_mergeProps","_ctx","$props","_cache","$event","_createElementVNode","_openBlock","_normalizeClass","$style","_createBlock","_resolveDynamicComponent","__props","props","title","computed","t","_hoisted_2","_toDisplayString","_Fragment","_renderList","resource","_unref","NcListItem","getSharedResources","userId","url","generateOcsUrl","axios","profileParameters","loadState","userStatus","ref","sections","sortedSections","a","b","onBeforeMount","isCurrentUser","getCurrentUser","isMobile","useIsMobile","profileDisplayName","showSharedResources","sharedResources","primaryAction","showEditAsPrimaryAction","otherActions","settingsUrl","generateUrl","emptyProfileMessage","onMounted","subscribe","handleStatusUpdate","loadSharedResources","onBeforeUnmount","unsubscribe","status","error","logger","openStatusModal","statusMenuItem","showError","NcContent","_createVNode","NcAppContent","_hoisted_1","NcAvatar","_hoisted_4","_hoisted_5","_hoisted_6","NcButton","_hoisted_7","PencilIcon","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","NcActions","action","NcActionLink","SharedResourcesSection","_hoisted_14","_hoisted_15","_hoisted_16","BriefcaseIcon","_createTextVNode","_hoisted_18","MapMarkerIcon","_hoisted_19","NcRichText","section","ProfileSection","NcEmptyContent","AccountIcon","ProfileSections","#sections","app","createApp","ProfileApp"],"mappings":"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","x_google_ignoreList":[0]}