mirror of
https://github.com/Dvorinka/swingmusic-extended.git
synced 2026-06-05 04:53:01 +00:00
refactor interfaces and references
This commit is contained in:
committed by
Mungai Njoroge
parent
4a49d48011
commit
6d8a9f880b
@@ -9,7 +9,7 @@ $g-border: solid 1px $gray5;
|
|||||||
"l-sidebar content r-sidebar"
|
"l-sidebar content r-sidebar"
|
||||||
"bottombar bottombar bottombar";
|
"bottombar bottombar bottombar";
|
||||||
|
|
||||||
gap: 0 1.5rem;
|
// gap: 0 1.5rem;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
border: $g-border;
|
border: $g-border;
|
||||||
border-top: none;
|
border-top: none;
|
||||||
@@ -24,6 +24,15 @@ $g-border: solid 1px $gray5;
|
|||||||
padding-right: calc($medium);
|
padding-right: calc($medium);
|
||||||
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
margin-right: $smaller !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vue-recycle-scroller__item-wrapper {
|
||||||
|
overflow: visible !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vue-recycle-scroller {
|
||||||
|
padding-left: 1.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.r-sidebar {
|
.r-sidebar {
|
||||||
@@ -50,8 +59,8 @@ $g-border: solid 1px $gray5;
|
|||||||
}
|
}
|
||||||
|
|
||||||
.content-page {
|
.content-page {
|
||||||
|
margin-left: 1.25rem;
|
||||||
margin-right: -$medium;
|
margin-right: -$medium;
|
||||||
padding-right: calc(1rem - $small + 2px);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ====== MODIFIERS =======
|
// ====== MODIFIERS =======
|
||||||
|
|||||||
@@ -11,8 +11,16 @@
|
|||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#vue-recycle-scroller__item-wrapper {
|
||||||
|
overflow: visible !important;
|
||||||
|
}
|
||||||
|
|
||||||
html {
|
html {
|
||||||
cursor: default !important;
|
cursor: default !important;
|
||||||
|
|
||||||
|
& > * {
|
||||||
|
overflow: visible !important;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
html.loading,
|
html.loading,
|
||||||
@@ -36,7 +44,6 @@ body {
|
|||||||
#app {
|
#app {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
// applies to playlist list page
|
// applies to playlist list page
|
||||||
.content-page {
|
.content-page {
|
||||||
margin-right: calc(0rem - ($medium + 4px));
|
margin-right: calc(0rem - ($medium + 4px));
|
||||||
padding-right: calc(1rem - 3px) !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// virtual scroller pages: folder, playlist, album
|
// virtual scroller pages: folder, playlist, album
|
||||||
|
|||||||
@@ -13,9 +13,6 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import AlbumCard from "../shared/AlbumCard.vue";
|
import AlbumCard from "../shared/AlbumCard.vue";
|
||||||
|
|
||||||
import useAlbumStore from "@/stores/pages/album";
|
|
||||||
import { content_width } from "@/stores/content-width";
|
|
||||||
import { computed, onBeforeMount } from "vue";
|
|
||||||
import { AlbumInfo } from "@/interfaces";
|
import { AlbumInfo } from "@/interfaces";
|
||||||
|
|
||||||
defineProps<{
|
defineProps<{
|
||||||
@@ -29,7 +26,7 @@ defineProps<{
|
|||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.albums-from-artist {
|
.albums-from-artist {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding-top: 1rem;
|
padding-top: 2rem;
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
display: grid;
|
display: grid;
|
||||||
@@ -45,7 +42,7 @@ defineProps<{
|
|||||||
.cards {
|
.cards {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));
|
grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));
|
||||||
gap: 2rem 0
|
gap: 2rem 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="genres-banner">
|
<div class="genres-banner">
|
||||||
<div v-for="genre in genres" class="rounded pad-sm">{{ genre }}</div>
|
<div class="rounded pad-sm">
|
||||||
|
{{ album.info.genres.length ? "Genres" : "No genres" }}
|
||||||
|
</div>
|
||||||
|
<div v-for="genre in album.info.genres" class="rounded pad-sm">
|
||||||
|
{{ genre }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -8,7 +13,7 @@
|
|||||||
import { onMounted } from "vue";
|
import { onMounted } from "vue";
|
||||||
import useAlbumStore from "@/stores/pages/album";
|
import useAlbumStore from "@/stores/pages/album";
|
||||||
|
|
||||||
const genres = ["Genres", "RNB", "Alternative", "Genres", "RNB", "Alternative"];
|
const album = useAlbumStore();
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// onMounted, fetch data to be used in the component below this one.
|
// onMounted, fetch data to be used in the component below this one.
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<div
|
||||||
|
class="album-header-ambient rounded"
|
||||||
|
style="height: 100%; width: 100%"
|
||||||
|
:style="{ boxShadow: album.colors ? `0 .5rem 2rem ${album.colors[0]}` : '' }"
|
||||||
|
></div>
|
||||||
<div
|
<div
|
||||||
class="a-header rounded"
|
class="a-header rounded"
|
||||||
ref="albumheaderthing"
|
ref="albumheaderthing"
|
||||||
@@ -32,7 +37,12 @@
|
|||||||
<div class="bottom">
|
<div class="bottom">
|
||||||
<div class="stats ellip">
|
<div class="stats ellip">
|
||||||
<div class="border rounded-sm pad-sm">
|
<div class="border rounded-sm pad-sm">
|
||||||
{{ album.albumartist }} • {{ album.date }} • {{ album.count }}
|
<ArtistName
|
||||||
|
:artists="album.albumartists.map((a) => a.name)"
|
||||||
|
:albumartists="''"
|
||||||
|
:small="true"
|
||||||
|
/>
|
||||||
|
• {{ album.date }} • {{ album.count }}
|
||||||
{{ album.count === 1 ? "Track" : "Tracks" }} •
|
{{ album.count === 1 ? "Track" : "Tracks" }} •
|
||||||
{{ formatSeconds(album.duration, true) }}
|
{{ formatSeconds(album.duration, true) }}
|
||||||
</div>
|
</div>
|
||||||
@@ -49,7 +59,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
@@ -63,6 +72,7 @@ import { formatSeconds, useVisibility } from "@/utils";
|
|||||||
import { isLight } from "../../composables/colors/album";
|
import { isLight } from "../../composables/colors/album";
|
||||||
import { playSources } from "../../composables/enums";
|
import { playSources } from "../../composables/enums";
|
||||||
import { AlbumInfo } from "../../interfaces";
|
import { AlbumInfo } from "../../interfaces";
|
||||||
|
import ArtistName from "@/components/shared/ArtistName.vue";
|
||||||
|
|
||||||
import PlayBtnRect from "../shared/PlayBtnRect.vue";
|
import PlayBtnRect from "../shared/PlayBtnRect.vue";
|
||||||
|
|
||||||
@@ -74,6 +84,9 @@ const albumheaderthing = ref<any>(null);
|
|||||||
const imguri = paths.images;
|
const imguri = paths.images;
|
||||||
const nav = useNavStore();
|
const nav = useNavStore();
|
||||||
|
|
||||||
|
defineEmits<{
|
||||||
|
(event: "playThis"): void;
|
||||||
|
}>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calls the `toggleShowPlay` method which toggles the play button in the nav.
|
* Calls the `toggleShowPlay` method which toggles the play button in the nav.
|
||||||
@@ -89,7 +102,12 @@ useVisibility(albumheaderthing, handleVisibilityState);
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
.album-header-ambient {
|
||||||
|
width: 20rem;
|
||||||
|
position: absolute;
|
||||||
|
z-index: -100 !important;
|
||||||
|
opacity: 0.25;
|
||||||
|
}
|
||||||
|
|
||||||
.a-header {
|
.a-header {
|
||||||
display: grid;
|
display: grid;
|
||||||
@@ -98,7 +116,6 @@ useVisibility(albumheaderthing, handleVisibilityState);
|
|||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
height: $banner-height;
|
height: $banner-height;
|
||||||
background-color: $black;
|
background-color: $black;
|
||||||
overflow: hidden;
|
|
||||||
align-items: flex-end;
|
align-items: flex-end;
|
||||||
|
|
||||||
.big-img {
|
.big-img {
|
||||||
@@ -168,10 +185,12 @@ useVisibility(albumheaderthing, handleVisibilityState);
|
|||||||
|
|
||||||
.stats {
|
.stats {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 0.8rem;
|
|
||||||
margin-bottom: 0.75rem;
|
margin-bottom: 0.75rem;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
|
||||||
div {
|
div {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
display: flex;
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
cursor: text;
|
cursor: text;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<div class="play"></div>
|
<div class="play"></div>
|
||||||
<div class="album-art image rounded"></div>
|
<div class="album-art image rounded"></div>
|
||||||
<div class="name ellip">{{ album.title }}</div>
|
<div class="name ellip">{{ album.title }}</div>
|
||||||
<div class="artist ellip">{{ album.albumartist }}</div>
|
<div class="artist ellip">{{ album.albumartists }}</div>
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<div class="image rounded"></div>
|
<div class="image rounded"></div>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<div class="name ellip">{{ album.title }}</div>
|
<div class="name ellip">{{ album.title }}</div>
|
||||||
<div class="artist ellip">{{ album.albumartist }}</div>
|
<div class="artist ellip">{{ album.albumartists }}</div>
|
||||||
<div class="separator"></div>
|
<div class="separator"></div>
|
||||||
<div class="top">
|
<div class="top">
|
||||||
<div class="play-icon"></div>
|
<div class="play-icon"></div>
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<ArtistName
|
<ArtistName
|
||||||
:artists="queue.currenttrack?.artist || []"
|
:artists="queue.currenttrack?.artist || []"
|
||||||
:albumartist="
|
:albumartists="
|
||||||
queue.currenttrack?.albumartist || 'Welcome to alice'
|
queue.currenttrack?.albumartist || 'Welcome to alice'
|
||||||
"
|
"
|
||||||
class="artist"
|
class="artist"
|
||||||
@@ -63,14 +63,14 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { Routes } from "@/composables/enums";
|
||||||
import { paths } from "@/config";
|
import { paths } from "@/config";
|
||||||
import { formatSeconds } from "@/utils";
|
import { formatSeconds } from "@/utils";
|
||||||
import { Routes } from "@/composables/enums";
|
|
||||||
|
|
||||||
import useQStore from "@/stores/queue";
|
|
||||||
import ArtistName from "@/components/shared/ArtistName.vue";
|
|
||||||
import HotKeys from "@/components/LeftSidebar/NP/HotKeys.vue";
|
import HotKeys from "@/components/LeftSidebar/NP/HotKeys.vue";
|
||||||
import Progress from "@/components/LeftSidebar/NP/Progress.vue";
|
import Progress from "@/components/LeftSidebar/NP/Progress.vue";
|
||||||
|
import ArtistName from "@/components/shared/ArtistName.vue";
|
||||||
|
import useQStore from "@/stores/queue";
|
||||||
|
|
||||||
import HeartSvg from "@/assets/icons/heart.svg";
|
import HeartSvg from "@/assets/icons/heart.svg";
|
||||||
// import PlusSvg from "@/assets/icons/plus.svg";
|
// import PlusSvg from "@/assets/icons/plus.svg";
|
||||||
|
|||||||
@@ -30,38 +30,9 @@ const context = useContextStore();
|
|||||||
const settings = useSettingsStore();
|
const settings = useSettingsStore();
|
||||||
const contextMenuRef = ref<HTMLElement>();
|
const contextMenuRef = ref<HTMLElement>();
|
||||||
|
|
||||||
// let clickCount = 0;
|
|
||||||
|
|
||||||
// onClickOutside(
|
|
||||||
// contextMenuRef,
|
|
||||||
// (e) => {
|
|
||||||
// console.log(clickCount);
|
|
||||||
|
|
||||||
// if (!context.visible) {
|
|
||||||
// // clickCount = 0;
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// clickCount++;
|
|
||||||
|
|
||||||
// if (context.visible && clickCount === 1) {
|
|
||||||
// context.hideContextMenu();
|
|
||||||
// e.stopImmediatePropagation();
|
|
||||||
// clickCount = 0;
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// capture: false,
|
|
||||||
// }
|
|
||||||
// );
|
|
||||||
|
|
||||||
let watcher: any = null;
|
let watcher: any = null;
|
||||||
|
|
||||||
context.$subscribe((mutation, state) => {
|
context.$subscribe((mutation, state) => {
|
||||||
// let watchers = [];
|
|
||||||
// console.log("watchers count: " + watchers.length)
|
|
||||||
// let wat: any = () => {};
|
|
||||||
|
|
||||||
if (state.visible) {
|
if (state.visible) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (watcher !== null) {
|
if (watcher !== null) {
|
||||||
@@ -71,7 +42,6 @@ context.$subscribe((mutation, state) => {
|
|||||||
contextMenuRef,
|
contextMenuRef,
|
||||||
(e) => {
|
(e) => {
|
||||||
e.stopImmediatePropagation();
|
e.stopImmediatePropagation();
|
||||||
console.log("clicked outside ref");
|
|
||||||
context.hideContextMenu();
|
context.hideContextMenu();
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -38,11 +38,11 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from "vue";
|
|
||||||
import { createPopper, Instance } from "@popperjs/core";
|
import { createPopper, Instance } from "@popperjs/core";
|
||||||
|
import { ref } from "vue";
|
||||||
|
|
||||||
import { Option } from "@/interfaces";
|
|
||||||
import { contextChildrenShowMode } from "@/composables/enums";
|
import { contextChildrenShowMode } from "@/composables/enums";
|
||||||
|
import { Option } from "@/interfaces";
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
option: Option;
|
option: Option;
|
||||||
@@ -155,7 +155,7 @@ function runChildAction(action: () => void) {
|
|||||||
|
|
||||||
.children {
|
.children {
|
||||||
transform: scale(0);
|
transform: scale(0);
|
||||||
overflow: auto;
|
overflow: hidden;
|
||||||
max-height: calc(100vh - 10rem);
|
max-height: calc(100vh - 10rem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
<template>
|
<template>
|
||||||
<router-link :to="{ name: Routes.folder, params: { path: folder.path } }">
|
<router-link :to="{ name: Routes.folder, params: { path: folder.path } }">
|
||||||
<div class="f-item">
|
<div class="f-item">
|
||||||
<div class="icon">
|
<!-- <div class="icon"> -->
|
||||||
<FolderSvg v-if="!folder.is_sym" />
|
<FolderSvg v-if="!folder.is_sym" />
|
||||||
<SymLinkSvg v-if="folder.is_sym" />
|
<SymLinkSvg v-if="folder.is_sym" />
|
||||||
</div>
|
<!-- </div> -->
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<div class="f-item-text ellip">{{ folder.name }}</div>
|
<div class="f-item-text ellip">{{ folder.name }}</div>
|
||||||
<div class="separator no-border"></div>
|
<!-- <div class="separator no-border"></div> -->
|
||||||
<div class="f-item-count">{{ folder.trackcount }} tracks</div>
|
<!-- <div class="f-item-count">{{ folder.has_tracks }} tracks</div> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</router-link>
|
</router-link>
|
||||||
@@ -31,9 +31,8 @@ defineProps<{
|
|||||||
height: 5rem;
|
height: 5rem;
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: max-content 1fr;
|
grid-template-columns: max-content 1fr;
|
||||||
padding-right: 1rem;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background-color: $gray5;
|
background-color: $gray;
|
||||||
transition: all 0.2s ease;
|
transition: all 0.2s ease;
|
||||||
border-radius: 0.75rem;
|
border-radius: 0.75rem;
|
||||||
|
|
||||||
@@ -41,24 +40,17 @@ defineProps<{
|
|||||||
height: 4rem;
|
height: 4rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.icon {
|
svg {
|
||||||
margin: 0 0.75rem;
|
margin: 0 $small 0 1rem;
|
||||||
}
|
|
||||||
|
|
||||||
.info {
|
|
||||||
.f-item-count {
|
|
||||||
font-size: 0.8rem;
|
|
||||||
color: rgb(219, 217, 217);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.f-item-text {
|
.f-item-text {
|
||||||
text-align: left;
|
margin-right: 1rem;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background: #0575e6;
|
background: $gray3;
|
||||||
background: linear-gradient(to top right, #021b79, #0575e6);
|
// background: linear-gradient(to top right, #021b79, #0575e6);
|
||||||
background-size: 105% 105%;
|
background-size: 105% 105%;
|
||||||
background-position-x: -$small;
|
background-position-x: -$small;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="f-container rounded">
|
<div class="f-container rounded">
|
||||||
<div id="f-items" class="rounded">
|
<div id="f-items" class="rounded lislt-mode">
|
||||||
<FolderItem
|
<FolderItem
|
||||||
v-for="folder in folders"
|
v-for="folder in folders"
|
||||||
:key="JSON.stringify(folder)"
|
:key="JSON.stringify(folder)"
|
||||||
@@ -22,8 +22,24 @@ defineProps<{
|
|||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
#f-items {
|
#f-items {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fill, minmax(13rem, 1fr));
|
grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));
|
||||||
gap: 1.5rem;
|
gap: 1.5rem;
|
||||||
margin-bottom: 1.75rem;
|
margin-bottom: 1.75rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#f-items.list-mode {
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(100%, 1fr));
|
||||||
|
gap: 0;
|
||||||
|
|
||||||
|
.f-item {
|
||||||
|
// background-color: $red;
|
||||||
|
height: 4rem;
|
||||||
|
border-radius: $small;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.f-item:hover {
|
||||||
|
background-color: $gray !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
"
|
"
|
||||||
@playThis="updateQueue(track.index !== undefined ? track.index : index)"
|
@playThis="updateQueue(track.index !== undefined ? track.index : index)"
|
||||||
:isCurrentPlaying="queue.playing"
|
:isCurrentPlaying="queue.playing"
|
||||||
:isCurrent="queue.currentid == track.id"
|
:isCurrent="queue.currenttrackhash == track.trackhash"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="copyright" v-if="copyright && copyright">
|
<div class="copyright" v-if="copyright && copyright">
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import { paths } from "@/config";
|
|||||||
import { Track } from "@/interfaces";
|
import { Track } from "@/interfaces";
|
||||||
|
|
||||||
defineProps<{
|
defineProps<{
|
||||||
track: Track | null;
|
track: Track | undefined;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
const imguri = paths.images.thumb.large;
|
const imguri = paths.images.thumb.large;
|
||||||
|
|||||||
@@ -44,8 +44,8 @@ import { playSources } from "@/composables/enums";
|
|||||||
import { formatSeconds, useVisibility } from "@/utils";
|
import { formatSeconds, useVisibility } from "@/utils";
|
||||||
import { paths } from "../../config";
|
import { paths } from "../../config";
|
||||||
|
|
||||||
import PlayBtnRect from "../shared/PlayBtnRect.vue";
|
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
|
import PlayBtnRect from "../shared/PlayBtnRect.vue";
|
||||||
|
|
||||||
const modal = useModalStore();
|
const modal = useModalStore();
|
||||||
const nav = useNavStore();
|
const nav = useNavStore();
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
<RecycleScroller
|
<RecycleScroller
|
||||||
class="scroller"
|
class="scroller"
|
||||||
id="queue-scrollable"
|
id="queue-scrollable"
|
||||||
|
style="height: 100%"
|
||||||
:items="scrollerItems"
|
:items="scrollerItems"
|
||||||
:item-size="itemHeight"
|
:item-size="itemHeight"
|
||||||
key-field="id"
|
key-field="id"
|
||||||
@@ -72,8 +73,8 @@ onBeforeUnmount(() => {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
.scroller {
|
.vue-recycle-scroller {
|
||||||
height: 100%;
|
padding: 0 !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -15,11 +15,8 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { paths } from "@/config";
|
import { paths } from "@/config";
|
||||||
import { Track } from "@/interfaces";
|
|
||||||
import { putCommas } from "@/utils";
|
|
||||||
import useQueueStore from "@/stores/queue";
|
import useQueueStore from "@/stores/queue";
|
||||||
|
|
||||||
import { showTrackContextMenu as showContext } from "@/composables/context";
|
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
|
|
||||||
const context_on = ref(false);
|
const context_on = ref(false);
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
|
|
||||||
|
import useSearchStore from "@/stores/search";
|
||||||
import Tab from "./Tab.vue";
|
import Tab from "./Tab.vue";
|
||||||
import TabsWrapper from "./TabsWrapper.vue";
|
import TabsWrapper from "./TabsWrapper.vue";
|
||||||
import useSearchStore from "@/stores/search";
|
|
||||||
|
|
||||||
const search = useSearchStore();
|
const search = useSearchStore();
|
||||||
defineProps<{
|
defineProps<{
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<div class="grid">
|
<div class="grid">
|
||||||
<PCard
|
<PCard
|
||||||
v-for="album in search.albums.value"
|
v-for="album in search.albums.value"
|
||||||
:key="`${album.albumartist}-${album.title}`"
|
:key="`${album.albumartists}-${album.title}`"
|
||||||
:album="album"
|
:album="album"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -13,8 +13,6 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import useSearchStore from "../../../stores/search";
|
import useSearchStore from "../../../stores/search";
|
||||||
import PCard from "../../playlists/PlaylistCard.vue";
|
|
||||||
import LoadMore from "./LoadMore.vue";
|
|
||||||
|
|
||||||
const search = useSearchStore();
|
const search = useSearchStore();
|
||||||
|
|
||||||
|
|||||||
@@ -4,9 +4,11 @@
|
|||||||
<TrackComponent
|
<TrackComponent
|
||||||
v-for="(track, index) in search.tracks.value"
|
v-for="(track, index) in search.tracks.value"
|
||||||
:key="track.id"
|
:key="track.id"
|
||||||
:isCurrent="queue.currentid === track.id"
|
:isCurrent="queue.currenttrackhash === track.trackhash"
|
||||||
:isHighlighted="false"
|
:isHighlighted="false"
|
||||||
:isCurrentPlaying="queue.currentid === track.id && queue.playing"
|
:isCurrentPlaying="
|
||||||
|
queue.currenttrackhash === track.trackhash && queue.playing
|
||||||
|
"
|
||||||
:track="track"
|
:track="track"
|
||||||
@playThis="updateQueue(index)"
|
@playThis="updateQueue(index)"
|
||||||
:index="index + 1"
|
:index="index + 1"
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ watch(
|
|||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr min-content;
|
grid-template-columns: 1fr min-content;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
padding: 0 1.25rem;
|
||||||
|
|
||||||
.left {
|
.left {
|
||||||
display: grid;
|
display: grid;
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ onUpdated(() => {
|
|||||||
|
|
||||||
.fname-wrapper {
|
.fname-wrapper {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
overflow: auto;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.fname {
|
.fname {
|
||||||
@@ -82,7 +82,7 @@ onUpdated(() => {
|
|||||||
.paths {
|
.paths {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: $smaller;
|
gap: $smaller;
|
||||||
overflow: auto;
|
overflow: hidden;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
scrollbar-width: none;
|
scrollbar-width: none;
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<img class="rounded" :src="imguri + album.image" alt="" />
|
<img class="rounded" :src="imguri + album.image" alt="" />
|
||||||
<div>
|
<div>
|
||||||
<h4 class="title ellip" v-tooltip>{{ album.title }}</h4>
|
<h4 class="title ellip" v-tooltip>{{ album.title }}</h4>
|
||||||
<div class="artist ellip">{{ album.albumartist }}</div>
|
<div class="artist ellip">{{ album.albumartists[0].name }}</div>
|
||||||
</div>
|
</div>
|
||||||
</router-link>
|
</router-link>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<div v-if="artists === null || artists.length === 0">
|
<div v-if="artists === null || artists.length === 0">
|
||||||
<span>{{ albumartist }}</span>
|
<span>{{ albumartists }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<span v-for="artist in putCommas(artists)" :key="artist">{{
|
<span v-for="artist in putCommas(artists)" :key="artist">{{
|
||||||
@@ -23,7 +23,7 @@ import { putCommas } from "@/utils";
|
|||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
artists: string[] | null;
|
artists: string[] | null;
|
||||||
albumartist: string | undefined;
|
albumartists: string | null;
|
||||||
small?: boolean;
|
small?: boolean;
|
||||||
smaller?: boolean;
|
smaller?: boolean;
|
||||||
}>();
|
}>();
|
||||||
|
|||||||
@@ -27,13 +27,13 @@
|
|||||||
<div class="isSmallArtists" style="display: none">
|
<div class="isSmallArtists" style="display: none">
|
||||||
<ArtistName
|
<ArtistName
|
||||||
:artists="track.artist"
|
:artists="track.artist"
|
||||||
:albumartist="track.albumartist"
|
:albumartists="track.albumartist"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="song-artists">
|
<div class="song-artists">
|
||||||
<ArtistName :artists="track.artist" :albumartist="track.albumartist" />
|
<ArtistName :artists="track.artist" :albumartists="track.albumartist" />
|
||||||
</div>
|
</div>
|
||||||
<router-link
|
<router-link
|
||||||
v-if="!hide_album"
|
v-if="!hide_album"
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
<div class="artist">
|
<div class="artist">
|
||||||
<ArtistName
|
<ArtistName
|
||||||
:artists="track.artist"
|
:artists="track.artist"
|
||||||
:albumartist="track.albumartist"
|
:albumartists="track.albumartist"
|
||||||
:smaller="true"
|
:smaller="true"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -64,7 +64,7 @@ const props = defineProps<{
|
|||||||
const queue = useQueueStore();
|
const queue = useQueueStore();
|
||||||
const context_on = ref(false);
|
const context_on = ref(false);
|
||||||
|
|
||||||
function showMenu(e: Event) {
|
function showMenu(e: MouseEvent) {
|
||||||
showContext(e, props.track, context_on);
|
showContext(e, props.track, context_on);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ export const FuseTrackOptions = {
|
|||||||
{ name: "title", weight: 1 },
|
{ name: "title", weight: 1 },
|
||||||
{ name: "album", weight: 0.7 },
|
{ name: "album", weight: 0.7 },
|
||||||
{ name: "artists", weight: 0.5 },
|
{ name: "artists", weight: 0.5 },
|
||||||
{ name: "albumartist", weight: 0.25 },
|
{ name: "albumartists", weight: 0.25 },
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -67,14 +67,15 @@ const getAlbumBio = async (hash: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const getAlbumsFromArtist = async (
|
const getAlbumsFromArtist = async (
|
||||||
albumartist: string,
|
albumartists: string,
|
||||||
limit: number = 2,
|
limit: number = 2,
|
||||||
exclude: string
|
exclude: string
|
||||||
) => {
|
) => {
|
||||||
|
console.log(albumartists)
|
||||||
const { data } = await useAxios({
|
const { data } = await useAxios({
|
||||||
url: albumsByArtistUrl,
|
url: albumsByArtistUrl,
|
||||||
props: {
|
props: {
|
||||||
albumartist: albumartist,
|
albumartists: albumartists,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
exclude: exclude,
|
exclude: exclude,
|
||||||
},
|
},
|
||||||
@@ -93,3 +94,4 @@ export {
|
|||||||
getAlbumBio,
|
getAlbumBio,
|
||||||
getAlbumsFromArtist,
|
getAlbumsFromArtist,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ export default function play(
|
|||||||
|
|
||||||
useQueue.playFromAlbum(
|
useQueue.playFromAlbum(
|
||||||
a_store.info.title,
|
a_store.info.title,
|
||||||
a_store.info.albumartist,
|
|
||||||
a_store.info.albumhash,
|
a_store.info.albumhash,
|
||||||
a_store.allTracks
|
a_store.allTracks
|
||||||
);
|
);
|
||||||
|
|||||||
+8
-4
@@ -10,7 +10,7 @@ export interface Track extends AlbumDisc {
|
|||||||
title: string;
|
title: string;
|
||||||
album?: string;
|
album?: string;
|
||||||
artist: string[];
|
artist: string[];
|
||||||
albumartist?: string;
|
albumartist: string;
|
||||||
albumhash?: string;
|
albumhash?: string;
|
||||||
folder?: string;
|
folder?: string;
|
||||||
filepath?: string;
|
filepath?: string;
|
||||||
@@ -29,7 +29,7 @@ export interface Track extends AlbumDisc {
|
|||||||
export interface Folder {
|
export interface Folder {
|
||||||
name: string;
|
name: string;
|
||||||
path: string;
|
path: string;
|
||||||
trackcount: number;
|
has_tracks: number;
|
||||||
subdircount: number;
|
subdircount: number;
|
||||||
is_sym: boolean;
|
is_sym: boolean;
|
||||||
}
|
}
|
||||||
@@ -37,7 +37,11 @@ export interface Folder {
|
|||||||
export interface AlbumInfo {
|
export interface AlbumInfo {
|
||||||
albumid: string;
|
albumid: string;
|
||||||
title: string;
|
title: string;
|
||||||
albumartist: string;
|
albumartists: {
|
||||||
|
name: string;
|
||||||
|
hash: string;
|
||||||
|
image: string;
|
||||||
|
}[];
|
||||||
count: number;
|
count: number;
|
||||||
duration: number;
|
duration: number;
|
||||||
date: string;
|
date: string;
|
||||||
@@ -51,6 +55,7 @@ export interface AlbumInfo {
|
|||||||
is_soundtrack: boolean;
|
is_soundtrack: boolean;
|
||||||
is_single: boolean;
|
is_single: boolean;
|
||||||
is_EP: boolean;
|
is_EP: boolean;
|
||||||
|
genres: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Artist {
|
export interface Artist {
|
||||||
@@ -92,7 +97,6 @@ export interface fromAlbum {
|
|||||||
type: FromOptions.album;
|
type: FromOptions.album;
|
||||||
name: string;
|
name: string;
|
||||||
albumhash: string;
|
albumhash: string;
|
||||||
albumartist: string;
|
|
||||||
}
|
}
|
||||||
export interface fromPlaylist {
|
export interface fromPlaylist {
|
||||||
type: FromOptions.playlist;
|
type: FromOptions.playlist;
|
||||||
|
|||||||
@@ -50,9 +50,9 @@
|
|||||||
? t.data.index + 1
|
? t.data.index + 1
|
||||||
: t.index + 1
|
: t.index + 1
|
||||||
"
|
"
|
||||||
:isCurrent="queue.currentid === t.data.id"
|
:isCurrent="queue.currenttrackhash === t.data.trackhash"
|
||||||
:isCurrentPlaying="
|
:isCurrentPlaying="
|
||||||
queue.currentid === t.data.id && queue.playing
|
queue.currenttrackhash === t.data.trackhash && queue.playing
|
||||||
"
|
"
|
||||||
@playThis="
|
@playThis="
|
||||||
updateQueue(
|
updateQueue(
|
||||||
|
|||||||
@@ -68,12 +68,13 @@ export default defineStore("album", {
|
|||||||
this.info = album.info;
|
this.info = album.info;
|
||||||
},
|
},
|
||||||
async fetchArtistAlbums() {
|
async fetchArtistAlbums() {
|
||||||
const albumartist = this.info.albumartist;
|
const albumartists = this.info.albumartists;
|
||||||
const cardWidth = 8 * 16;
|
const cardWidth = 10 * 16;
|
||||||
const visible_cards = Math.floor(content_width.value / cardWidth);
|
const visible_cards = Math.floor(content_width.value / cardWidth);
|
||||||
|
const albumartisthashes = albumartists.map((artist) => artist.hash);
|
||||||
|
|
||||||
this.albumArtists = await getAlbumsFromArtist(
|
this.albumArtists = await getAlbumsFromArtist(
|
||||||
albumartist,
|
albumartisthashes.join(),
|
||||||
visible_cards,
|
visible_cards,
|
||||||
this.info.albumhash
|
this.info.albumhash
|
||||||
);
|
);
|
||||||
|
|||||||
+6
-10
@@ -11,7 +11,7 @@ import {
|
|||||||
fromFolder,
|
fromFolder,
|
||||||
fromPlaylist,
|
fromPlaylist,
|
||||||
fromSearch,
|
fromSearch,
|
||||||
Track
|
Track,
|
||||||
} from "../interfaces";
|
} from "../interfaces";
|
||||||
|
|
||||||
function shuffle(tracks: Track[]) {
|
function shuffle(tracks: Track[]) {
|
||||||
@@ -45,6 +45,7 @@ export default defineStore("Queue", {
|
|||||||
play(index: number = 0) {
|
play(index: number = 0) {
|
||||||
if (this.tracklist.length === 0) return;
|
if (this.tracklist.length === 0) return;
|
||||||
this.currentindex = index;
|
this.currentindex = index;
|
||||||
|
console.log(this.tracklist.length);
|
||||||
|
|
||||||
if (!this.mousover) {
|
if (!this.mousover) {
|
||||||
this.queueScrollFunction(this.currentindex - 1);
|
this.queueScrollFunction(this.currentindex - 1);
|
||||||
@@ -145,6 +146,7 @@ export default defineStore("Queue", {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
playFromFolder(fpath: string, tracks: Track[]) {
|
playFromFolder(fpath: string, tracks: Track[]) {
|
||||||
|
console.log("play from folder");
|
||||||
this.from = <fromFolder>{
|
this.from = <fromFolder>{
|
||||||
type: FromOptions.folder,
|
type: FromOptions.folder,
|
||||||
path: fpath,
|
path: fpath,
|
||||||
@@ -152,17 +154,11 @@ export default defineStore("Queue", {
|
|||||||
};
|
};
|
||||||
this.setNewQueue(tracks);
|
this.setNewQueue(tracks);
|
||||||
},
|
},
|
||||||
playFromAlbum(
|
playFromAlbum(aname: string, albumhash: string, tracks: Track[]) {
|
||||||
aname: string,
|
|
||||||
albumartist: string,
|
|
||||||
albumhash: string,
|
|
||||||
tracks: Track[]
|
|
||||||
) {
|
|
||||||
this.from = <fromAlbum>{
|
this.from = <fromAlbum>{
|
||||||
type: FromOptions.album,
|
type: FromOptions.album,
|
||||||
name: aname,
|
name: aname,
|
||||||
albumhash: albumhash,
|
albumhash: albumhash,
|
||||||
albumartist: albumartist,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
this.setNewQueue(tracks);
|
this.setNewQueue(tracks);
|
||||||
@@ -292,8 +288,8 @@ export default defineStore("Queue", {
|
|||||||
currenttrack(): Track | undefined {
|
currenttrack(): Track | undefined {
|
||||||
return this.tracklist[this.currentindex];
|
return this.tracklist[this.currentindex];
|
||||||
},
|
},
|
||||||
currentid(): string {
|
currenttrackhash(): string {
|
||||||
return this.currenttrack?.id || "";
|
return this.currenttrack?.trackhash || "";
|
||||||
},
|
},
|
||||||
previndex(): number {
|
previndex(): number {
|
||||||
return this.currentindex === 0
|
return this.currentindex === 0
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ export default function createTrackProps(track: Track) {
|
|||||||
return {
|
return {
|
||||||
track,
|
track,
|
||||||
index: track.index + 1,
|
index: track.index + 1,
|
||||||
isCurrent: queue().currentid === track.id,
|
isCurrent: queue().currenttrackhash === track.trackhash,
|
||||||
isCurrentPlaying:
|
isCurrentPlaying:
|
||||||
queue().currentid === track.id && queue().playing,
|
queue().currenttrackhash === track.trackhash && queue().playing,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,14 +7,15 @@
|
|||||||
key-field="id"
|
key-field="id"
|
||||||
v-slot="{ item }"
|
v-slot="{ item }"
|
||||||
>
|
>
|
||||||
|
<div :style="{ maxHeight: `${item.size}px` }">
|
||||||
<component
|
<component
|
||||||
:is="item.component"
|
:is="item.component"
|
||||||
v-bind="item.props"
|
v-bind="item.props"
|
||||||
:style="{ maxHeight: `${item.size}px` }"
|
|
||||||
@playThis="
|
@playThis="
|
||||||
playFromAlbum(item.props.track.index - item.props.track.disc)
|
playFromAlbum(item.props.track.index - item.props.track.disc)
|
||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
</RecycleScroller>
|
</RecycleScroller>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -112,8 +113,9 @@ const scrollerItems = computed(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
function playFromAlbum(index: number) {
|
function playFromAlbum(index: number) {
|
||||||
const { title, albumartist, albumhash } = album.info;
|
|
||||||
queue.playFromAlbum(title, albumartist, albumhash, album.allTracks);
|
const { title, albumartists, albumhash } = album.info;
|
||||||
|
queue.playFromAlbum(title, albumhash, album.allTracks);
|
||||||
queue.play(index);
|
queue.play(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,6 +130,7 @@ onBeforeRouteUpdate(async (to: RouteLocationNormalized) => {
|
|||||||
onBeforeRouteLeave(() => {
|
onBeforeRouteLeave(() => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
album.resetQuery();
|
album.resetQuery();
|
||||||
|
album.resetAlbumArtists();
|
||||||
}, 500);
|
}, 500);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@@ -135,7 +138,7 @@ onBeforeRouteLeave(() => {
|
|||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.album-virtual-scroller {
|
.album-virtual-scroller {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
overflow: visible;
|
||||||
.songlist-item {
|
.songlist-item {
|
||||||
grid-template-columns: 1.5rem 1.5fr 1fr 2.5rem 2.5rem;
|
grid-template-columns: 1.5rem 1.5fr 1fr 2.5rem 2.5rem;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,9 +62,9 @@ class songItem {
|
|||||||
this.props = {
|
this.props = {
|
||||||
track,
|
track,
|
||||||
index: track.index + 1,
|
index: track.index + 1,
|
||||||
isCurrent: queue.currentid === track.id,
|
isCurrent: queue.currenttrackhash === track.trackhash,
|
||||||
isCurrentPlaying:
|
isCurrentPlaying:
|
||||||
queue.currentid === track.id && queue.playing,
|
queue.currenttrackhash === track.trackhash && queue.playing,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -111,3 +111,11 @@ onBeforeRouteLeave(() => {
|
|||||||
setTimeout(() => folder.resetQuery(), 500);
|
setTimeout(() => folder.resetQuery(), 500);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
// .folder-view {
|
||||||
|
// background-color: $red;
|
||||||
|
// padding-left: 0 !important;
|
||||||
|
// }
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -58,8 +58,8 @@ const scrollerItems = computed(() => {
|
|||||||
props: {
|
props: {
|
||||||
track: track,
|
track: track,
|
||||||
index: track.index + 1,
|
index: track.index + 1,
|
||||||
isCurrent: queue.currentid === track.id,
|
isCurrent: queue.currenttrackhash === track.trackhash,
|
||||||
isCurrentPlaying: queue.currentid === track.id && queue.playing,
|
isCurrentPlaying: queue.currenttrackhash === track.trackhash && queue.playing,
|
||||||
},
|
},
|
||||||
size: 64,
|
size: 64,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<SongItem
|
<SongItem
|
||||||
:track="item.track"
|
:track="item.track"
|
||||||
:index="index + 1"
|
:index="index + 1"
|
||||||
:isCurrent="queue.currentid === item.track.id"
|
:isCurrent="queue.currenttrackhash === item.track.trackhash"
|
||||||
:isCurrentPlaying="
|
:isCurrentPlaying="
|
||||||
queue.currentid === item.track.id && queue.playing
|
queue.currenttrackhash === item.track.trackhash && queue.playing
|
||||||
"
|
"
|
||||||
@playThis="playFromQueue(index)"
|
@playThis="playFromQueue(index)"
|
||||||
/>
|
/>
|
||||||
@@ -29,10 +29,10 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onMounted } from "vue";
|
import { computed, onMounted } from "vue";
|
||||||
|
|
||||||
|
import SongItem from "@/components/shared/SongItem.vue";
|
||||||
|
import { isMedium, isSmall } from "@/stores/content-width";
|
||||||
import useQStore from "@/stores/queue";
|
import useQStore from "@/stores/queue";
|
||||||
import { createTrackProps } from "@/utils";
|
import { createTrackProps } from "@/utils";
|
||||||
import SongItem from "@/components/shared/SongItem.vue";
|
|
||||||
import { isSmall, isMedium } from "@/stores/content-width";
|
|
||||||
|
|
||||||
const itemHeight = 64;
|
const itemHeight = 64;
|
||||||
const queue = useQStore();
|
const queue = useQStore();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="search-view">
|
<div class="search-view content-page">
|
||||||
<div class="scrollable">
|
<div class="scrollable">
|
||||||
<Main :isOnSearchPage="true" />
|
<Main :isOnSearchPage="true" />
|
||||||
</div>
|
</div>
|
||||||
@@ -15,10 +15,11 @@ import Main from "@/components/RightSideBar/Search/Main.vue";
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
margin-right: -1rem;
|
margin-right: -1rem;
|
||||||
|
background-color: red !important;
|
||||||
|
|
||||||
.scrollable {
|
.scrollable {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
overflow: auto;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.artists-results {
|
.artists-results {
|
||||||
|
|||||||
@@ -16,15 +16,15 @@ const search = useSearchStore();
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
// .search-albums-view.grid-page {
|
.search-albums-view.grid-page {
|
||||||
// max-height: 100%;
|
// max-height: 100%;
|
||||||
// display: grid;
|
// display: grid;
|
||||||
// grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
|
// grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
|
||||||
// gap: 1.75rem 0;
|
// gap: 1.75rem 0;
|
||||||
|
|
||||||
// padding-bottom: 4rem;
|
// padding-bottom: 4rem;
|
||||||
// padding-right: $medium;
|
padding-right: $small;
|
||||||
|
|
||||||
// overflow: auto;
|
overflow: auto;
|
||||||
// }
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="search-view">
|
<div class="search-view content-page">
|
||||||
<div class="tabs">
|
<div class="tabs">
|
||||||
<button
|
<button
|
||||||
v-for="page in pages"
|
v-for="page in pages"
|
||||||
@@ -180,9 +180,6 @@ onMounted(() => {
|
|||||||
gap: 1.75rem 0;
|
gap: 1.75rem 0;
|
||||||
|
|
||||||
padding-bottom: 4rem;
|
padding-bottom: 4rem;
|
||||||
padding-right: 1rem;
|
|
||||||
|
|
||||||
overflow: auto;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
button.load-more {
|
button.load-more {
|
||||||
|
|||||||
@@ -12,8 +12,8 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import Layout from "@/layouts/HeaderAndVList.vue";
|
import Layout from "@/layouts/HeaderAndVList.vue";
|
||||||
import useSearchStore from "@/stores/search";
|
|
||||||
import useQueueStore from "@/stores/queue";
|
import useQueueStore from "@/stores/queue";
|
||||||
|
import useSearchStore from "@/stores/search";
|
||||||
|
|
||||||
const search = useSearchStore();
|
const search = useSearchStore();
|
||||||
const queue = useQueueStore();
|
const queue = useQueueStore();
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="settingspage">
|
<div class="settingspage content-page">
|
||||||
<Content :current="0" />
|
<Content :current="0" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import Content from "../components/SettingsView/Content.vue";
|
import Content from "../components/SettingsView/Content.vue";
|
||||||
</script>
|
</script>z
|
||||||
Reference in New Issue
Block a user