1
0

Merge branch 'main' into feat/totally-hide-strict-filters

This commit is contained in:
Ayo 2023-01-21 10:02:28 +01:00
commit 6e5ef04bb6
25 changed files with 111 additions and 161 deletions

5
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,5 @@
---
name: 🐞 Bug report
about: Report an issue
labels: ['s: pending triage', 'c: bug']
---

View File

@ -1,56 +0,0 @@
name: 🐞 Bug report
description: Report an issue
labels: ['s: pending triage', 'c: bug']
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
If you are unsure whether your problem is a bug or not, you can check the following:
- use our [Discord community](https://chat.elk.zone)
- open a new [discussion](https://github.com/elk-zone/elk/discussions) and ask your question there
- type: checkboxes
id: checkboxes
attributes:
label: Pre-Checks
description: Before submitting the issue, please make sure you do the following
options:
# - label: Follow our [Code of Conduct](https://github.com/elk-zone/elk/blob/main/CODE_OF_CONDUCT.md).
# required: true
# - label: Read the [Contributing Guidelines](https://github.com/elk-zone/elk/blob/main/CONTRIBUTING.md).
# required: true
- label: Check that there isn't [already an issue](https://github.com/elk-zone/elk/issues) that reports the same bug to avoid creating a duplicate.
required: true
- label: Check that this is a concrete bug. For Q&A open a [GitHub Discussion](https://github.com/elk-zone/elk/discussions) or join our [Discord Chat Server](https://chat.elk.zone).
required: true
- label: Providing a screenshot or video to reproduce the issue or show visually what was meant.
required: true
- label: I am willing to provide a PR.
- type: textarea
id: bug-description
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is.
placeholder: I am doing ... What I expect is ... What actually happening is ...
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Reproduction video or screenshot
description: |
A video or screenshot that visually shows the issue.
**Tip:** You can attach images or recordings files by clicking this area to highlight it and then dragging files in.
- type: textarea
id: additional-context
attributes:
label: Additional Context
description: |
Anything else relevant? Please tell us here, e.g. your used web browser and/or you are on desktop or mobile.
**Tip:** You can attach images or recordings files by clicking this area to highlight it and then dragging files in.

View File

@ -0,0 +1,5 @@
---
name: 🚀 New feature proposal
about: Propose a new feature
labels: 's: pending triage'
---

View File

@ -1,35 +0,0 @@
name: 🚀 New feature proposal
description: Propose a new feature
labels: ['s: pending triage'] # This will automatically assign the 's: pending triage' label
body:
- type: markdown
attributes:
value: Thanks for your interest in the project and taking the time to fill out this feature report!
- type: textarea
id: feature-description
attributes:
label: Clear and concise description of the problem
description: 'As a user I want [goal / wish] so that [benefit]. If you intend to submit a PR for this issue, tell us in the description. Thanks!'
validations:
required: true
- type: textarea
id: suggested-solution
attributes:
label: Suggested solution
description: 'In section [xy] we could provide following feature...'
validations:
required: true
- type: textarea
id: alternative
attributes:
label: Alternative
description: Clear and concise description of any alternative solutions or features you've considered.
- type: textarea
id: additional-context
attributes:
label: Additional context
description: Any other context about the feature request here.

View File

@ -1,5 +0,0 @@
---
name: Freestyle Report
about: Create a report to help us improve
labels: 'pending triage' # This will automatically assign the 'pending triage' label
---

View File

@ -1,26 +0,0 @@
<!-- Thank you for contributing! -->
### Description
<!-- Please insert your description here and provide especially info about the "what" this PR is solving -->
### Additional context
<!-- e.g. is there anything you'd like reviewers to focus on? -->
---
### What is the purpose of this pull request? <!-- (put an "X" next to an item) -->
- [ ] Bug fix
- [ ] New Feature
- [ ] Documentation update
- [ ] Translations update
- [ ] Other
### Before submitting the PR, please make sure you do the following
- [ ] Read the [Contributing Guidelines](https://github.com/elk-zone/elk/blob/main/CONTRIBUTING.md).
- [ ] Check that there isn't already a PR that solves the problem the same way to avoid creating a duplicate.
- [ ] Provide related snapshots or videos.
- [ ] Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`).

View File

@ -9,7 +9,7 @@ const serverName = $computed(() => getServerName(account))
</script> </script>
<template> <template>
<p line-clamp-1 whitespace-pre-wrap break-all text-secondary-light dir="ltr"> <p line-clamp-1 whitespace-pre-wrap break-all text-secondary-light leading-tight dir="ltr">
<!-- fix: #274 only line-clamp-1 can be used here, using text-ellipsis is not valid --> <!-- fix: #274 only line-clamp-1 can be used here, using text-ellipsis is not valid -->
<span text-secondary>{{ getShortHandle(account) }}</span> <span text-secondary>{{ getShortHandle(account) }}</span>
<span v-if="serverName" text-secondary-light>@{{ serverName }}</span> <span v-if="serverName" text-secondary-light>@{{ serverName }}</span>

View File

@ -19,10 +19,8 @@ defineProps<{
</NuxtLink> </NuxtLink>
<div flex-auto /> <div flex-auto />
<div flex items-center> <div flex items-center>
<NuxtLink :to="getAccountRoute(account.moved as any)"> <NuxtLink :to="getAccountRoute(account.moved as any)" btn-solid inline-block h-fit>
<button btn-solid h-fit> {{ $t('account.go_to_profile') }}
{{ $t('account.go_to_profile') }}
</button>
</NuxtLink> </NuxtLink>
</div> </div>
</div> </div>

View File

@ -0,0 +1,27 @@
<script setup lang="ts">
const build = useBuildInfo()
</script>
<template>
<div
m-2 p5 bg-rose:10 relative
rounded-lg of-hidden
flex="~ col gap-3"
>
<h2 font-bold text-rose>
{{ $t('help.build_preview.title') }}
</h2>
<p>
<i18n-t keypath="help.build_preview.desc1">
<NuxtLink :href="`https://github.com/elk-zone/elk/commit/${build.commit}`" target="_blank" text-rose hover:underline>
<code>{{ build.commit.slice(0, 7) }}</code>
</NuxtLink>
</i18n-t>
</p>
<p>{{ $t('help.build_preview.desc2') }}</p>
<p font-bold>
{{ $t('help.build_preview.desc3') }}
</p>
<div i-ri-git-pull-request-line absolute text-10em bottom--10 inset-ie--10 text-rose op10 class="-z-1" />
</div>
</template>

View File

@ -29,9 +29,9 @@
<style scoped> <style scoped>
svg path.wood { svg path.wood {
fill: var(--c-dark-primary-light); fill: var(--c-text-secondary);
} }
svg path.body { svg path.body {
fill: var(--c-primary); fill: var(--c-text-base);
} }
</style> </style>

View File

@ -53,7 +53,7 @@ const noUserVisual = computed(() => isHydrated.value && props.userOnly && !curre
:tabindex="noUserDisable ? -1 : null" :tabindex="noUserDisable ? -1 : null"
@click="$scrollToTop" @click="$scrollToTop"
> >
<CommonTooltip :disabled="!isMediumScreen" :content="text" placement="right"> <CommonTooltip :disabled="!isMediumOrLargeScreen" :content="text" placement="right">
<div <div
flex items-center gap4 flex items-center gap4
w-fit rounded-3 w-fit rounded-3

View File

@ -29,7 +29,7 @@ router.afterEach(() => {
</NuxtLink> </NuxtLink>
<div <div
hidden xl:flex items-center me-8 mt-2 hidden xl:flex items-center me-8 mt-2
:class="{ 'pointer-events-none op40': !back || back === '/', 'xl:flex': $route.name !== 'tag' }" :class="{ 'pointer-events-none op0': !back || back === '/', 'xl:flex': $route.name !== 'tag' }"
> >
<NuxtLink <NuxtLink
:aria-label="$t('nav.back')" :aria-label="$t('nav.back')"

View File

@ -1,22 +0,0 @@
<script setup>
const disabled = computed(() => !isHydrated.value || !currentUser.value)
const disabledVisual = computed(() => isHydrated.value && !currentUser.value)
</script>
<template>
<button
flex="~ gap2 center"
w-9 h-9 py2
xl="w-auto h-auto"
rounded-3
cursor-pointer disabled:pointer-events-none
text-primary
border-1 border-primary
:class="disabledVisual ? 'op25' : 'hover:bg-primary hover:text-inverted'"
:disabled="disabled"
@click="openPublishDialog()"
>
<div i-ri:quill-pen-line />
<span hidden xl:block>{{ $t('action.compose') }}</span>
</button>
</template>

View File

@ -19,7 +19,7 @@ async function openEmojiPicker() {
}) })
} }
else { else {
const promise = import('@emoji-mart/data').then(r => r.default) const promise = import('@emoji-mart/data/sets/14/twitter.json').then(r => r.default)
const { Picker } = await import('emoji-mart') const { Picker } = await import('emoji-mart')
picker = new Picker({ picker = new Picker({
data: () => promise, data: () => promise,
@ -28,6 +28,7 @@ async function openEmojiPicker() {
? emit('select', native) ? emit('select', native)
: emit('selectCustom', { src, alt, 'data-emoji-id': name }) : emit('selectCustom', { src, alt, 'data-emoji-id': name })
}, },
set: 'twitter',
theme: colorMode.value, theme: colorMode.value,
custom: customEmojisData.value, custom: customEmojisData.value,
}) })

View File

@ -65,9 +65,11 @@ const video = ref<HTMLVideoElement | undefined>()
const prefersReducedMotion = usePreferredReducedMotion() const prefersReducedMotion = usePreferredReducedMotion()
const isAudio = $computed(() => attachment.type === 'audio') const isAudio = $computed(() => attachment.type === 'audio')
const enableAutoplay = usePreferences('enableAutoplay')
useIntersectionObserver(video, (entries) => { useIntersectionObserver(video, (entries) => {
const ready = video.value?.dataset.ready === 'true' const ready = video.value?.dataset.ready === 'true'
if (prefersReducedMotion.value === 'reduce') { if (prefersReducedMotion.value === 'reduce' || !enableAutoplay.value) {
if (ready && !video.value?.paused) if (ready && !video.value?.paused)
video.value?.pause() video.value?.pause()

View File

@ -4,3 +4,4 @@ export const breakpoints = useBreakpoints(breakpointsTailwind)
export const isSmallScreen = breakpoints.smallerOrEqual('md') export const isSmallScreen = breakpoints.smallerOrEqual('md')
export const isMediumScreen = breakpoints.smallerOrEqual('lg') export const isMediumScreen = breakpoints.smallerOrEqual('lg')
export const isMediumOrLargeScreen = breakpoints.between('sm', 'xl')

View File

@ -8,6 +8,7 @@ export interface PreferencesSettings {
hideFavoriteCount: boolean hideFavoriteCount: boolean
hideFollowerCount: boolean hideFollowerCount: boolean
grayscaleMode: boolean grayscaleMode: boolean
enableAutoplay: boolean
experimentalVirtualScroller: boolean experimentalVirtualScroller: boolean
experimentalGitHubCards: boolean experimentalGitHubCards: boolean
experimentalUserPicker: boolean experimentalUserPicker: boolean
@ -58,6 +59,7 @@ export const DEFAULT__PREFERENCES_SETTINGS: PreferencesSettings = {
hideFavoriteCount: false, hideFavoriteCount: false,
hideFollowerCount: false, hideFollowerCount: false,
grayscaleMode: false, grayscaleMode: false,
enableAutoplay: true,
experimentalVirtualScroller: true, experimentalVirtualScroller: true,
experimentalGitHubCards: true, experimentalGitHubCards: true,
experimentalUserPicker: true, experimentalUserPicker: true,

View File

@ -2,7 +2,7 @@
import { usePreferences } from '~/composables/settings' import { usePreferences } from '~/composables/settings'
const route = useRoute() const route = useRoute()
const userSettings = useUserSettings() const info = useBuildInfo()
const wideLayout = computed(() => route.meta.wideLayout ?? false) const wideLayout = computed(() => route.meta.wideLayout ?? false)
@ -63,7 +63,9 @@ const isGrayscale = usePreferences('grayscaleMode')
<div sticky top-0 h-screen flex="~ col" gap-2 py3 ms-2> <div sticky top-0 h-screen flex="~ col" gap-2 py3 ms-2>
<slot name="right"> <slot name="right">
<div flex-auto /> <div flex-auto />
<PwaPrompt /> <PwaPrompt />
<LazyCommonPreviewPrompt v-if="info.env === 'preview'" />
<NavFooter /> <NavFooter />
</slot> </slot>
</div> </div>

View File

@ -330,6 +330,7 @@
}, },
"notifications_settings": "Benachrichtigungen", "notifications_settings": "Benachrichtigungen",
"preferences": { "preferences": {
"enable_autoplay": "Autoplay aktivieren",
"github_cards": "GitHub Cards", "github_cards": "GitHub Cards",
"hide_boost_count": "Boost-Zähler ausblenden", "hide_boost_count": "Boost-Zähler ausblenden",
"hide_favorite_count": "Favoritenzahl ausblenden", "hide_favorite_count": "Favoritenzahl ausblenden",

View File

@ -156,6 +156,12 @@
"unsupported_file_format": "Unsupported file format" "unsupported_file_format": "Unsupported file format"
}, },
"help": { "help": {
"build_preview": {
"desc1": "You are currently viewing a preview version of Elk from the community - {0}.",
"desc2": "It may contains unreviewed or even malicious changes.",
"desc3": "Don't log in with your real account.",
"title": "Preview deploy"
},
"desc_highlight": "Expect some bugs and missing features here and there.", "desc_highlight": "Expect some bugs and missing features here and there.",
"desc_para1": "Thanks for your interest in trying out Elk, our work-in-progress Mastodon web client!", "desc_para1": "Thanks for your interest in trying out Elk, our work-in-progress Mastodon web client!",
"desc_para2": "we are working hard on the development and improving it over time.", "desc_para2": "we are working hard on the development and improving it over time.",
@ -360,6 +366,7 @@
}, },
"notifications_settings": "Notifications", "notifications_settings": "Notifications",
"preferences": { "preferences": {
"enable_autoplay": "Enable Autoplay",
"github_cards": "GitHub Cards", "github_cards": "GitHub Cards",
"grayscale_mode": "Grayscale mode", "grayscale_mode": "Grayscale mode",
"hide_boost_count": "Hide boost count", "hide_boost_count": "Hide boost count",

View File

@ -130,7 +130,7 @@
}, },
"show_reblogs": { "show_reblogs": {
"cancel": "Annuler", "cancel": "Annuler",
"confirm": "Montrer", "confirm": "Afficher",
"title": "Voulez-vous vraiment afficher les partages de {0} ?" "title": "Voulez-vous vraiment afficher les partages de {0} ?"
}, },
"unfollow": { "unfollow": {
@ -158,6 +158,12 @@
"unsupported_file_format": "Format de fichier non supporté" "unsupported_file_format": "Format de fichier non supporté"
}, },
"help": { "help": {
"build_preview": {
"desc1": "Vous consultez actuellement une version d'aperçu d'Elk de la communauté - {0}.",
"desc2": "Elle peut contenir des modifications non révisées voire même malveillantes.",
"desc3": "Ne vous connectez pas avec votre compte réel.",
"title": "Aperçu du déploiement"
},
"desc_highlight": "Il est possible de rencontrer, par-ci par-là, quelques bugs et fonctionnalités manquantes.", "desc_highlight": "Il est possible de rencontrer, par-ci par-là, quelques bugs et fonctionnalités manquantes.",
"desc_para1": "Merci de l'intérêt pour Elk, notre client Mastodon en cours de développement !", "desc_para1": "Merci de l'intérêt pour Elk, notre client Mastodon en cours de développement !",
"desc_para2": "Nous travaillons dur sur le développement et l'améliorons au fur et à mesure. Nous allons open-sourcer l'application une fois qu'elle sera prête pour un usage public.", "desc_para2": "Nous travaillons dur sur le développement et l'améliorons au fur et à mesure. Nous allons open-sourcer l'application une fois qu'elle sera prête pour un usage public.",
@ -174,11 +180,15 @@
"block_account": "Bloquer {0}", "block_account": "Bloquer {0}",
"block_domain": "Bloquer le domaine {0}", "block_domain": "Bloquer le domaine {0}",
"copy_link_to_post": "Copier le lien du message", "copy_link_to_post": "Copier le lien du message",
"copy_original_link_to_post": "Copiez le lien d'origine vers ce message",
"delete": "Supprimer", "delete": "Supprimer",
"delete_and_redraft": "Supprimer et réécrire", "delete_and_redraft": "Supprimer et réécrire",
"delete_confirm": {
"cancel": ""
},
"direct_message_account": "Message direct à {0}", "direct_message_account": "Message direct à {0}",
"edit": "Éditer", "edit": "Éditer",
"hide_reblogs": "Cacher les boosts de {0}", "hide_reblogs": "Cacher les partages de {0}",
"mention_account": "Mentionner {0}", "mention_account": "Mentionner {0}",
"mute_account": "Mettre en sourdine {0}", "mute_account": "Mettre en sourdine {0}",
"mute_conversation": "Message muet", "mute_conversation": "Message muet",
@ -282,7 +292,8 @@
"sponsors": "Donateur·ice·s", "sponsors": "Donateur·ice·s",
"sponsors_body_1": "Elk existe grâce aux généreux soutien de :", "sponsors_body_1": "Elk existe grâce aux généreux soutien de :",
"sponsors_body_2": "Et toutes les personnes et sociétés soutenant l'équipe Elk et ses membres.", "sponsors_body_2": "Et toutes les personnes et sociétés soutenant l'équipe Elk et ses membres.",
"sponsors_body_3": "Si vous appréciez l'application, envisagez de nous soutenir :" "sponsors_body_3": "Si vous appréciez l'application, envisagez de nous soutenir :",
"version": "Version"
}, },
"account_settings": { "account_settings": {
"description": "Modifiez les paramètres de votre compte dans l'interface de Mastodon", "description": "Modifiez les paramètres de votre compte dans l'interface de Mastodon",
@ -360,6 +371,7 @@
}, },
"notifications_settings": "Notifications", "notifications_settings": "Notifications",
"preferences": { "preferences": {
"enable_autoplay": "Activer la lecture automatique",
"github_cards": "GitHub Cards", "github_cards": "GitHub Cards",
"grayscale_mode": "Mode niveaux de gris", "grayscale_mode": "Mode niveaux de gris",
"hide_boost_count": "Cacher les compteurs de partages", "hide_boost_count": "Cacher les compteurs de partages",

View File

@ -156,6 +156,12 @@
"unsupported_file_format": "Formato de ficheiro não suportado" "unsupported_file_format": "Formato de ficheiro não suportado"
}, },
"help": { "help": {
"build_preview": {
"desc1": "Está atualmente a visualizar uma versão prévia do Elk produzida pela comunidade - {0}.",
"desc2": "Pode conter alterações não revistas ou mesmo maliciosas.",
"desc3": "Não inicie sessão com a sua conta real.",
"title": "Produção de pré-visualização"
},
"desc_highlight": "Espere alguns problemas e funcionalidades em falta.", "desc_highlight": "Espere alguns problemas e funcionalidades em falta.",
"desc_para1": "Obrigado pelo seu interesse em experimentar o Elk, o nosso aplicativo web para o Mastodon, ainda em construção!", "desc_para1": "Obrigado pelo seu interesse em experimentar o Elk, o nosso aplicativo web para o Mastodon, ainda em construção!",
"desc_para2": "Estamos a trabalhar arduamente no seu desenvolvimento e melhoria ao longo do tempo.", "desc_para2": "Estamos a trabalhar arduamente no seu desenvolvimento e melhoria ao longo do tempo.",
@ -172,6 +178,7 @@
"block_account": "Bloquear {0}", "block_account": "Bloquear {0}",
"block_domain": "Bloquear domínio {0}", "block_domain": "Bloquear domínio {0}",
"copy_link_to_post": "Copiar ligação para esta publicação", "copy_link_to_post": "Copiar ligação para esta publicação",
"copy_original_link_to_post": "Copiar ligação original para esta publicação",
"delete": "Eliminar", "delete": "Eliminar",
"delete_and_redraft": "Eliminar & re-editar", "delete_and_redraft": "Eliminar & re-editar",
"direct_message_account": "Mensagem direta a {0}", "direct_message_account": "Mensagem direta a {0}",
@ -280,7 +287,8 @@
"sponsors": "Patrocinadores", "sponsors": "Patrocinadores",
"sponsors_body_1": "O Elk é possível graças ao genoroso patrocinio e ajuda de:", "sponsors_body_1": "O Elk é possível graças ao genoroso patrocinio e ajuda de:",
"sponsors_body_2": "E todas as empresas e pessoas que apoiam a Equipa do Elk e os seus membros.", "sponsors_body_2": "E todas as empresas e pessoas que apoiam a Equipa do Elk e os seus membros.",
"sponsors_body_3": "Se está a gostar de utilizar esta aplicação, considere apoiar-nos:" "sponsors_body_3": "Se está a gostar de utilizar esta aplicação, considere apoiar-nos:",
"version": "Versão"
}, },
"account_settings": { "account_settings": {
"description": "Editar as configurações da sua conta na aplicação web do Mastodon", "description": "Editar as configurações da sua conta na aplicação web do Mastodon",
@ -358,6 +366,7 @@
}, },
"notifications_settings": "Notificações", "notifications_settings": "Notificações",
"preferences": { "preferences": {
"enable_autoplay": "Habilitar Repodrução Automática",
"github_cards": "Cartões do GitHub", "github_cards": "Cartões do GitHub",
"grayscale_mode": "Modo tons de cinza", "grayscale_mode": "Modo tons de cinza",
"hide_boost_count": "Esconder contagem de partilhas", "hide_boost_count": "Esconder contagem de partilhas",

View File

@ -1,6 +1,6 @@
{ {
"type": "module", "type": "module",
"version": "0.6.0", "version": "0.6.1",
"private": true, "private": true,
"packageManager": "pnpm@7.9.0", "packageManager": "pnpm@7.9.0",
"license": "MIT", "license": "MIT",

View File

@ -39,6 +39,12 @@ const userSettings = useUserSettings()
> >
{{ $t('settings.preferences.grayscale_mode') }} {{ $t('settings.preferences.grayscale_mode') }}
</SettingsToggleItem> </SettingsToggleItem>
<SettingsToggleItem
:checked="getPreferences(userSettings, 'enableAutoplay')"
@click="togglePreferences('enableAutoplay')"
>
{{ $t('settings.preferences.enable_autoplay') }}
</SettingsToggleItem>
<h2 px6 py4 mt2 font-bold text-xl flex="~ gap-1" items-center> <h2 px6 py4 mt2 font-bold text-xl flex="~ gap-1" items-center>
<div i-ri-flask-line /> <div i-ri-flask-line />
{{ $t('settings.preferences.title') }} {{ $t('settings.preferences.title') }}

View File

@ -1,7 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { mastodon } from 'masto' import type { mastodon } from 'masto'
import { ofetch } from 'ofetch'
import { useForm } from 'slimeform' import { useForm } from 'slimeform'
import { parse } from 'ultrahtml' import { parse } from 'ultrahtml'
import type { Component } from 'vue'
definePageMeta({ definePageMeta({
middleware: 'auth', middleware: 'auth',
@ -15,6 +17,9 @@ useHeadFixed({
const { client } = $(useMasto()) const { client } = $(useMasto())
const avatarInput = ref<any>()
const headerInput = ref<any>()
const account = $computed(() => currentUser.value?.account) const account = $computed(() => currentUser.value?.account)
const onlineSrc = $computed(() => ({ const onlineSrc = $computed(() => ({
@ -81,6 +86,15 @@ const refreshInfo = async () => {
reset() reset()
} }
useDropZone(avatarInput, (files) => {
if (files?.[0])
form.avatar = files[0]
})
useDropZone(headerInput, (files) => {
if (files?.[0])
form.header = files[0]
})
onHydrated(refreshInfo) onHydrated(refreshInfo)
onReactivated(refreshInfo) onReactivated(refreshInfo)
</script> </script>
@ -98,6 +112,7 @@ onReactivated(refreshInfo)
<!-- banner --> <!-- banner -->
<div of-hidden bg="gray-500/20" aspect="3"> <div of-hidden bg="gray-500/20" aspect="3">
<CommonInputImage <CommonInputImage
ref="headerInput"
v-model="form.header" v-model="form.header"
:original="onlineSrc.header" :original="onlineSrc.header"
w-full h-full w-full h-full
@ -108,6 +123,7 @@ onReactivated(refreshInfo)
<!-- avatar --> <!-- avatar -->
<div px-4 flex="~ gap4"> <div px-4 flex="~ gap4">
<CommonInputImage <CommonInputImage
ref="avatarInput"
v-model="form.avatar" v-model="form.avatar"
:original="onlineSrc.avatar" :original="onlineSrc.avatar"
mt--10 mt--10