From dcb664162c18e4c1407b72c6d4a178460e3ac006 Mon Sep 17 00:00:00 2001
From: ArneBo
Date: Tue, 8 Apr 2025 05:39:38 +0200
Subject: [PATCH] fix(front): consistent pixel perfect header with description
modal on all detail pages
---
.../components/audio/ArtistCreditLabel.vue | 1 +
.../src/components/audio/ChannelSerieCard.vue | 123 ++--
front/src/components/audio/PlayButton.vue | 7 +-
.../src/components/audio/track/MobileRow.vue | 4 +-
.../components/common/RenderedDescription.vue | 43 +-
front/src/components/library/AlbumBase.vue | 282 ++++----
.../src/components/library/AlbumDropdown.vue | 8 +-
front/src/components/library/ArtistBase.vue | 410 ++++++-----
front/src/components/library/TrackDetail.vue | 4 +-
.../components/playlists/PlaylistDropdown.vue | 6 +-
front/src/components/ui/Header.vue | 9 +-
front/src/components/ui/button/Options.vue | 4 +-
front/src/locales/en_GB.json | 78 +++
front/src/locales/en_US.json | 138 +++-
front/src/style/globals/_channels.scss | 4 +-
front/src/views/auth/ProfileBase.vue | 61 +-
front/src/views/channels/DetailBase.vue | 647 +++++++++---------
front/src/views/playlists/Detail.vue | 279 ++++----
18 files changed, 1223 insertions(+), 885 deletions(-)
diff --git a/front/src/components/audio/ArtistCreditLabel.vue b/front/src/components/audio/ArtistCreditLabel.vue
index 0043baf71..f33293054 100644
--- a/front/src/components/audio/ArtistCreditLabel.vue
+++ b/front/src/components/audio/ArtistCreditLabel.vue
@@ -66,5 +66,6 @@ const getRoute = (ac: ArtistCredit) => {
diff --git a/front/src/components/audio/ChannelSerieCard.vue b/front/src/components/audio/ChannelSerieCard.vue
index 3de332eeb..92b8083a0 100644
--- a/front/src/components/audio/ChannelSerieCard.vue
+++ b/front/src/components/audio/ChannelSerieCard.vue
@@ -1,79 +1,78 @@
-
-
-
-
-
- {{ serie.title }}
-
-
-
-
- {{ t('components.audio.ChannelSerieCard.meta.episodes', serie.tracks_count) }}
-
-
-
-
-
+
+
+
+
+ {{ momentFormat(new Date(serie?.release_date), 'Y') }}
+
+
+
+ {{ t('components.audio.album.Card.meta.tracks', serie?.tracks_count) }}
+
+
+
+
+
+
+
diff --git a/front/src/components/audio/PlayButton.vue b/front/src/components/audio/PlayButton.vue
index 64ae38f5c..936ba1215 100644
--- a/front/src/components/audio/PlayButton.vue
+++ b/front/src/components/audio/PlayButton.vue
@@ -25,6 +25,7 @@ interface Props extends PlayOptionsProps {
iconOnly?: boolean
playing?: boolean
paused?: boolean
+ lowHeight?: boolean
// TODO(wvffle): Remove after https://github.com/vuejs/core/pull/4512 is merged
isPlayable?: boolean
@@ -56,7 +57,8 @@ const props = withDefaults(defineProps(), {
iconOnly: () => false,
isPlayable: () => false,
playing: () => false,
- paused: () => false
+ paused: () => false,
+ lowHeight: () => false
})
// (1) Create a PlayButton
@@ -125,6 +127,8 @@ const isOpen = ref(false)
:class="[...buttonClasses, 'play-button']"
:isloading="isLoading"
:dropdown-only="dropdownOnly"
+ :low-height="lowHeight || undefined"
+ style="align-self: start;"
@click.stop.prevent="replacePlay()"
@split-click="isOpen = !isOpen"
>
@@ -238,6 +242,7 @@ const isOpen = ref(false)
:round="iconOnly"
:primary="iconOnly && !discrete"
:ghost="discrete"
+ :low-height="lowHeight || undefined"
@click.stop.prevent="replacePlay()"
>
diff --git a/front/src/components/audio/track/MobileRow.vue b/front/src/components/audio/track/MobileRow.vue
index 13915cdfb..39494a996 100644
--- a/front/src/components/audio/track/MobileRow.vue
+++ b/front/src/components/audio/track/MobileRow.vue
@@ -110,8 +110,8 @@ const actionsButtonLabel = computed(() => t('components.audio.track.MobileRow.bu
{{ generateTrackCreditString(track) }}
diff --git a/front/src/components/common/RenderedDescription.vue b/front/src/components/common/RenderedDescription.vue
index 9c0e121ae..50592d0f3 100644
--- a/front/src/components/common/RenderedDescription.vue
+++ b/front/src/components/common/RenderedDescription.vue
@@ -8,6 +8,7 @@ import { useI18n } from 'vue-i18n'
import axios from 'axios'
import clip from 'text-clipper'
+import Layout from '~/components/ui/Layout.vue'
import Button from '~/components/ui/Button.vue'
import Alert from '~/components/ui/Alert.vue'
@@ -23,6 +24,7 @@ interface Props {
fetchHtml?: boolean
permissive?: boolean
truncateLength?: number
+ moreLink?: boolean
}
const { t } = useI18n()
@@ -35,7 +37,8 @@ const props = withDefaults(defineProps(), {
canUpdate: true,
fetchHtml: false,
permissive: false,
- truncateLength: 200
+ truncateLength: 200,
+ moreLink: true
})
const preview = ref('')
@@ -89,34 +92,40 @@ const submit = async () => {
-
+
-
-
+
{{ t('components.common.RenderedDescription.button.more') }}
{{ t('components.common.RenderedDescription.button.less') }}
-
+
{{ t('components.common.RenderedDescription.empty.noDescription') }}
@@ -166,3 +175,19 @@ const submit = async () => {
+
+
diff --git a/front/src/components/library/AlbumBase.vue b/front/src/components/library/AlbumBase.vue
index cadaf4f91..33b0f6818 100644
--- a/front/src/components/library/AlbumBase.vue
+++ b/front/src/components/library/AlbumBase.vue
@@ -17,6 +17,7 @@ import TrackPlaylistIcon from '~/components/playlists/TrackPlaylistIcon.vue'
import PlayButton from '~/components/audio/PlayButton.vue'
import AlbumDropdown from './AlbumDropdown.vue'
import Layout from '~/components/ui/Layout.vue'
+import Header from '~/components/ui/Header.vue'
import Spacer from '~/components/ui/Spacer.vue'
import Loader from '~/components/ui/Loader.vue'
import Button from '~/components/ui/Button.vue'
@@ -147,147 +148,154 @@ const remove = async () => {
-
+
+
+
+
+
-
diff --git a/front/src/components/library/AlbumDropdown.vue b/front/src/components/library/AlbumDropdown.vue
index 9c4dc1392..f08c6cd0a 100644
--- a/front/src/components/library/AlbumDropdown.vue
+++ b/front/src/components/library/AlbumDropdown.vue
@@ -16,10 +16,6 @@ import Popover from '~/components/ui/Popover.vue'
import PopoverItem from '~/components/ui/popover/PopoverItem.vue'
import OptionsButton from '~/components/ui/button/Options.vue'
-interface Events {
- (e: 'remove'): void
-}
-
interface Props {
isLoading: boolean
artistCredit: ArtistCredit[]
@@ -28,10 +24,10 @@ interface Props {
isAlbum: boolean
isChannel: boolean
isSerie: boolean
+
}
const store = useStore()
-const emit = defineEmits()
const props = defineProps()
const { report, getReportableObjects } = useReport()
@@ -75,7 +71,7 @@ const open = ref(false)
diff --git a/front/src/components/library/ArtistBase.vue b/front/src/components/library/ArtistBase.vue
index 122431739..3a72a43c6 100644
--- a/front/src/components/library/ArtistBase.vue
+++ b/front/src/components/library/ArtistBase.vue
@@ -11,11 +11,14 @@ import { useStore } from '~/store'
import axios from 'axios'
import useReport from '~/composables/moderation/useReport'
import useLogger from '~/composables/useLogger'
+import { useModal } from '~/ui/composables/useModal.ts'
import HumanDuration from '~/components/common/HumanDuration.vue'
import EmbedWizard from '~/components/audio/EmbedWizard.vue'
import Loader from '~/components/ui/Loader.vue'
+import Header from '~/components/ui/Header.vue'
import Button from '~/components/ui/Button.vue'
+import Link from '~/components/ui/Link.vue'
import OptionsButton from '~/components/ui/button/Options.vue'
import PlayButton from '~/components/audio/PlayButton.vue'
import RadioButton from '~/components/radios/Button.vue'
@@ -24,6 +27,7 @@ import PopoverItem from '~/components/ui/popover/PopoverItem.vue'
import Layout from '~/components/ui/Layout.vue'
import Modal from '~/components/ui/Modal.vue'
import Spacer from '~/components/ui/Spacer.vue'
+import RenderedDescription from '../common/RenderedDescription.vue'
interface Props {
id: number | string
@@ -125,192 +129,246 @@ const fetchData = async () => {
const totalDuration = computed(() => sum((tracks.value ?? []).map(track => track.uploads[0]?.duration ?? 0)))
watch(() => props.id, fetchData, { immediate: true })
+
+const isOpen = useModal('artist-description').isOpen
-
+
+
+
-
diff --git a/front/src/components/library/TrackDetail.vue b/front/src/components/library/TrackDetail.vue
index 5d297c3c8..f254412ed 100644
--- a/front/src/components/library/TrackDetail.vue
+++ b/front/src/components/library/TrackDetail.vue
@@ -242,8 +242,8 @@ const trackDetails: {
diff --git a/front/src/views/playlists/Detail.vue b/front/src/views/playlists/Detail.vue
index 0151266eb..03f043fdb 100644
--- a/front/src/views/playlists/Detail.vue
+++ b/front/src/views/playlists/Detail.vue
@@ -8,7 +8,6 @@ import { useStore } from '~/store'
import axios from 'axios'
import defaultCover from '~/assets/audio/default-cover.png'
-import ActorLink from '~/components/common/ActorLink.vue'
import PlaylistEditor from '~/components/playlists/Editor.vue'
import EmbedWizard from '~/components/audio/EmbedWizard.vue'
import HumanDate from '~/components/common/HumanDate.vue'
@@ -134,160 +133,161 @@ const shuffle = () => {}
-
+
-
-
+
+
![]()
+
+
+
-
-
-
![]()
-
-
-
+
{{ playlist.tracks_count }}
{{ t('views.playlists.Detail.header.tracks') }}
-
+
{{ t('views.playlists.Detail.meta.attribution') }}
-
+ {{ playlist.actor.full_username }}
{{ t('views.playlists.Detail.meta.updated') }}
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
- {{ t('views.playlists.Detail.button.cancel') }}
-
-
-
+ {{ t('views.playlists.Detail.button.edit') }}
+
+
+
+
+
+
+
+ {{ t('views.playlists.Detail.button.cancel') }}
+
+
+