mirror of
https://github.com/tcsenpai/swingmusic.git
synced 2025-06-10 21:17:33 +00:00
add a blank settings view
- use for loop to render l-sidebar content - add current track image on l-sidebar - other minor changes
This commit is contained in:
parent
e7741937a3
commit
15d5e1476a
22
src/App.vue
22
src/App.vue
@ -9,7 +9,10 @@
|
|||||||
></router-link>
|
></router-link>
|
||||||
</div>
|
</div>
|
||||||
<Navigation :collapsed="collapsed" />
|
<Navigation :collapsed="collapsed" />
|
||||||
<PinnedStuff :collapsed="collapsed" />
|
<!-- <PinnedStuff :collapsed="collapsed" /> -->
|
||||||
|
<div class="l-album-art">
|
||||||
|
<AlbumArt />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="search-box"></div>
|
<div class="search-box"></div>
|
||||||
@ -31,6 +34,7 @@ import BottomBar from "@/components/BottomBar/BottomBar.vue";
|
|||||||
|
|
||||||
import perks from "@/composables/perks.js";
|
import perks from "@/composables/perks.js";
|
||||||
import Main from "./components/RightSideBar/Main.vue";
|
import Main from "./components/RightSideBar/Main.vue";
|
||||||
|
import AlbumArt from "./components/LeftSidebar/AlbumArt.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
@ -38,10 +42,11 @@ export default {
|
|||||||
PinnedStuff,
|
PinnedStuff,
|
||||||
BottomBar,
|
BottomBar,
|
||||||
RightSideBar: Main,
|
RightSideBar: Main,
|
||||||
|
AlbumArt,
|
||||||
},
|
},
|
||||||
|
|
||||||
setup() {
|
setup() {
|
||||||
const collapsed = ref(true);
|
const collapsed = ref(false);
|
||||||
|
|
||||||
perks.readQueue();
|
perks.readQueue();
|
||||||
|
|
||||||
@ -58,6 +63,15 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
.l-sidebar {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.l-album-art {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#logo-container {
|
#logo-container {
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 3.6rem;
|
height: 3.6rem;
|
||||||
@ -69,8 +83,8 @@ export default {
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
width: 3rem;
|
width: 3rem;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background-size: 2rem;
|
|
||||||
background: url(./assets/icons/menu.svg) no-repeat center;
|
background: url(./assets/icons/menu.svg) no-repeat center;
|
||||||
|
background-size: 2rem;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -78,8 +92,8 @@ export default {
|
|||||||
height: 2rem;
|
height: 2rem;
|
||||||
width: 9rem;
|
width: 9rem;
|
||||||
margin-left: 3rem;
|
margin-left: 3rem;
|
||||||
background-size: contain;
|
|
||||||
background: url(./assets/logo.svg) no-repeat center;
|
background: url(./assets/logo.svg) no-repeat center;
|
||||||
|
background-size: contain;
|
||||||
}
|
}
|
||||||
|
|
||||||
.r-sidebar {
|
.r-sidebar {
|
||||||
|
@ -7,9 +7,9 @@
|
|||||||
<HotKeys />
|
<HotKeys />
|
||||||
</div>
|
</div>
|
||||||
<div class="progress progress-bottom">
|
<div class="progress progress-bottom">
|
||||||
<span class="durationx">0:45</span>
|
<span class="durationx">{{formatSeconds(current_pos)}}</span>
|
||||||
<Progress />
|
<Progress />
|
||||||
<span class="durationx">{{ state.current.value.length }}</span>
|
<span class="durationx">{{ formatSeconds(state.current.value.length) }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="r-group">
|
<div class="r-group">
|
||||||
<div class="heart image"></div>
|
<div class="heart image"></div>
|
||||||
@ -24,9 +24,15 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import { ref } from 'vue';
|
||||||
import "../../assets/css/BottomBar/BottomBar.scss";
|
import "../../assets/css/BottomBar/BottomBar.scss";
|
||||||
import SongCard from "./SongCard.vue";
|
import SongCard from "./SongCard.vue";
|
||||||
import Progress from "../shared/Progress.vue";
|
import Progress from "../shared/Progress.vue";
|
||||||
import HotKeys from "../shared/HotKeys.vue";
|
import HotKeys from "../shared/HotKeys.vue";
|
||||||
import state from "../../composables/state";
|
import state from "../../composables/state";
|
||||||
|
import perks from "../../composables/perks";
|
||||||
|
import playAudio from "../../composables/playAudio";
|
||||||
|
|
||||||
|
const current_pos = ref(playAudio.current_time);
|
||||||
|
const formatSeconds = perks.formatSeconds;
|
||||||
</script>
|
</script>
|
||||||
|
27
src/components/LeftSidebar/AlbumArt.vue
Normal file
27
src/components/LeftSidebar/AlbumArt.vue
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<template>
|
||||||
|
<div class="l_">
|
||||||
|
<div
|
||||||
|
class="l-image image border rounded"
|
||||||
|
:style="{
|
||||||
|
backgroundImage: `url("${current.image}")`,
|
||||||
|
}"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref } from "vue";
|
||||||
|
import state from "../../composables/state";
|
||||||
|
|
||||||
|
const current = ref(state.current);
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.l_ {
|
||||||
|
padding: $small;
|
||||||
|
|
||||||
|
.l-image {
|
||||||
|
height: 14rem;
|
||||||
|
width: 14rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -1,75 +1,48 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="side-nav-container" :class="{ collapsed: collapsed }">
|
<div class="side-nav-container" :class="{ collapsed: collapsed }">
|
||||||
<router-link :to="{ name: 'Home' }">
|
<router-link v-for="menu in menus" :key="menu.name" :to="{ name: menu.route_name, params: {path: 'home'} }" >
|
||||||
<div class="nav-button" id="home-button">
|
<div class="nav-button" id="home-button">
|
||||||
<div class="in">
|
<div class="in">
|
||||||
<div class="nav-icon image" id="home-icon"></div>
|
<div class="nav-icon image" :id="`${menu.name}-icon`"></div>
|
||||||
<span>Home</span>
|
<span>{{ menu.name }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</router-link>
|
</router-link>
|
||||||
<hr />
|
<hr />
|
||||||
<router-link :to="{ name: 'AlbumsExplorer' }">
|
|
||||||
<div class="nav-button" id="album-button">
|
|
||||||
<div class="in">
|
|
||||||
<div class="nav-icon image" id="album-icon"></div>
|
|
||||||
<span>Albums</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</router-link>
|
|
||||||
<hr />
|
|
||||||
<router-link :to="{ name: 'ArtistsExplorer' }">
|
|
||||||
<div class="nav-button" id="artists-button">
|
|
||||||
<div class="in">
|
|
||||||
<div class="nav-icon image" id="artists-icon"></div>
|
|
||||||
<span>Artists</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</router-link>
|
|
||||||
<hr />
|
|
||||||
<router-link :to="{ name: 'PlaylistView' }">
|
|
||||||
<div class="nav-button" id="playlists-button">
|
|
||||||
<div class="in">
|
|
||||||
<div class="nav-icon image" id="playlists-icon"></div>
|
|
||||||
<span>Playlist</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</router-link>
|
|
||||||
<hr />
|
|
||||||
<router-link :to="{ name: 'Home' }">
|
|
||||||
<div class="nav-button" id="mixes-button">
|
|
||||||
<div class="in">
|
|
||||||
<div class="nav-icon image" id="mixes-icon"></div>
|
|
||||||
<span>Mixes</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</router-link>
|
|
||||||
<hr />
|
|
||||||
<router-link :to="{ name: 'FolderView', params: { path: 'home' } }">
|
|
||||||
<div class="nav-button" id="folders-button">
|
|
||||||
<div class="in">
|
|
||||||
<div class="nav-icon image" id="folders-icon"></div>
|
|
||||||
<span>Folders</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</router-link>
|
|
||||||
<hr />
|
|
||||||
<router-link :to="{ name: 'FolderView', params: { path: 'home' } }">
|
|
||||||
<div class="nav-button" id="folders-button">
|
|
||||||
<div class="in">
|
|
||||||
<div class="nav-icon image" id="settings-icon"></div>
|
|
||||||
<span>Settings</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</router-link>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script setup>
|
||||||
export default {
|
import { ref } from "vue";
|
||||||
props: ["collapsed"],
|
|
||||||
setup() {},
|
const menus = [
|
||||||
};
|
{
|
||||||
|
name: "home",
|
||||||
|
route_name: "Home",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "albums",
|
||||||
|
route_name: "AlbumsView",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "artists",
|
||||||
|
route_name: "ArtistsView",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "playlists",
|
||||||
|
route_name: "PlaylistView",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "folders",
|
||||||
|
route_name: "FolderView",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "settings",
|
||||||
|
route_name: "SettingsView",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const collapsed = ref(false);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
@ -94,6 +67,7 @@ export default {
|
|||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
padding-top: 10px;
|
padding-top: 10px;
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
|
text-transform: capitalize;
|
||||||
|
|
||||||
.nav-button {
|
.nav-button {
|
||||||
border-radius: $small;
|
border-radius: $small;
|
||||||
@ -108,7 +82,7 @@ export default {
|
|||||||
background-color: rgba(145, 58, 58, 0.555);
|
background-color: rgba(145, 58, 58, 0.555);
|
||||||
}
|
}
|
||||||
|
|
||||||
#album-icon {
|
#albums-icon {
|
||||||
background-color: rgba(113, 58, 145, 0.555);
|
background-color: rgba(113, 58, 145, 0.555);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,7 +121,7 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#home-icon,
|
#home-icon,
|
||||||
#album-icon,
|
#albums-icon,
|
||||||
#artists-icon,
|
#artists-icon,
|
||||||
#playlists-icon,
|
#playlists-icon,
|
||||||
#mixes-icon,
|
#mixes-icon,
|
||||||
@ -160,7 +134,7 @@ export default {
|
|||||||
background-image: url(../../assets/icons/home.svg);
|
background-image: url(../../assets/icons/home.svg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#album-icon {
|
#albums-icon {
|
||||||
background-image: url(../../assets/icons/album.svg);
|
background-image: url(../../assets/icons/album.svg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="side-nav-container rounded"
|
class="side-nav-container rounded hidden"
|
||||||
:class="{ hidden: collapsed }"
|
:class="{ hidden: collapsed }"
|
||||||
id="pinned-container"
|
id="pinned-container"
|
||||||
>
|
>
|
||||||
|
@ -53,9 +53,9 @@ function changeTab(tab) {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
// @include tablet-landscape {
|
@include tablet-landscape {
|
||||||
// width: 3rem;
|
width: 3rem;
|
||||||
// }
|
}
|
||||||
|
|
||||||
.grid {
|
.grid {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@ -66,9 +66,9 @@ function changeTab(tab) {
|
|||||||
grid-area: content;
|
grid-area: content;
|
||||||
width: 31rem;
|
width: 31rem;
|
||||||
|
|
||||||
// @include tablet-landscape {
|
@include tablet-landscape {
|
||||||
// display: none;
|
display: none;
|
||||||
// }
|
}
|
||||||
|
|
||||||
.r-search {
|
.r-search {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
@ -59,7 +59,6 @@ export default {
|
|||||||
setup() {
|
setup() {
|
||||||
const current = ref(perks.current);
|
const current = ref(perks.current);
|
||||||
const putCommas = perks.putCommas;
|
const putCommas = perks.putCommas;
|
||||||
const pos = playAudio.pos;
|
|
||||||
|
|
||||||
const {playNext} = playAudio;
|
const {playNext} = playAudio;
|
||||||
const {playPrev} = playAudio;
|
const {playPrev} = playAudio;
|
||||||
@ -76,7 +75,6 @@ export default {
|
|||||||
playNext,
|
playNext,
|
||||||
playPrev,
|
playPrev,
|
||||||
playPause,
|
playPause,
|
||||||
pos,
|
|
||||||
seek,
|
seek,
|
||||||
isPlaying,
|
isPlaying,
|
||||||
formatSeconds: perks.formatSeconds,
|
formatSeconds: perks.formatSeconds,
|
||||||
|
3
src/components/SettingsView/Main.vue
Normal file
3
src/components/SettingsView/Main.vue
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<template>
|
||||||
|
<div class="settings">Hello, settings here 😁</div>
|
||||||
|
</template>
|
@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<input
|
<input
|
||||||
|
class="progress-bar"
|
||||||
id="progress"
|
id="progress"
|
||||||
type="range"
|
type="range"
|
||||||
:value="pos"
|
:value="pos"
|
||||||
|
@ -5,13 +5,18 @@ import media from "./mediaNotification.js";
|
|||||||
import state from "./state.js";
|
import state from "./state.js";
|
||||||
|
|
||||||
const audio = ref(new Audio()).value;
|
const audio = ref(new Audio()).value;
|
||||||
|
|
||||||
const pos = ref(0);
|
const pos = ref(0);
|
||||||
|
const current_time = ref(0);
|
||||||
|
|
||||||
const playing = ref(state.is_playing);
|
const playing = ref(state.is_playing);
|
||||||
|
|
||||||
const url = "http://0.0.0.0:8901/";
|
const url = "http://0.0.0.0:8901/";
|
||||||
|
|
||||||
const playAudio = (path) => {
|
const playAudio = (path) => {
|
||||||
const elem = document.getElementById('progress')
|
const elem = document.getElementsByClassName('progress-bar')[0];
|
||||||
|
const bottom_elem = document.getElementsByClassName('progress-bar')[1];
|
||||||
|
|
||||||
const full_path = url + encodeURIComponent(path);
|
const full_path = url + encodeURIComponent(path);
|
||||||
|
|
||||||
new Promise((resolve, reject) => {
|
new Promise((resolve, reject) => {
|
||||||
@ -26,9 +31,12 @@ const playAudio = (path) => {
|
|||||||
state.is_playing.value = true;
|
state.is_playing.value = true;
|
||||||
|
|
||||||
audio.ontimeupdate = () => {
|
audio.ontimeupdate = () => {
|
||||||
|
current_time.value = audio.currentTime;
|
||||||
pos.value = (audio.currentTime / audio.duration) * 1000;
|
pos.value = (audio.currentTime / audio.duration) * 1000;
|
||||||
let bg_size = ((audio.currentTime / audio.duration)*100)
|
let bg_size = ((audio.currentTime / audio.duration)*100)
|
||||||
|
|
||||||
elem.style.backgroundSize = `${bg_size}% 100%`;
|
elem.style.backgroundSize = `${bg_size}% 100%`;
|
||||||
|
bottom_elem.style.backgroundSize = `${bg_size}% 100%`;
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
.catch((err) => console.log(err));
|
.catch((err) => console.log(err));
|
||||||
@ -45,8 +53,8 @@ function playPrev() {
|
|||||||
perks.current.value = perks.prev.value;
|
perks.current.value = perks.prev.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
function seek(pos) {
|
function seek(position) {
|
||||||
audio.currentTime = (pos / 1000) * audio.duration;
|
audio.currentTime = (position / 1000) * audio.duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
function playPause() {
|
function playPause() {
|
||||||
@ -73,7 +81,7 @@ audio.addEventListener("ended", () => {
|
|||||||
playNext();
|
playNext();
|
||||||
});
|
});
|
||||||
|
|
||||||
export default { playAudio, playNext, playPrev, playPause, seek, pos, playing };
|
export default { playAudio, playNext, playPrev, playPause, seek, pos, playing, current_time };
|
||||||
|
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
|
@ -7,6 +7,7 @@ import AlbumsExplorer from "../views/AlbumsExplorer.vue";
|
|||||||
import AlbumView from "../views/AlbumView.vue";
|
import AlbumView from "../views/AlbumView.vue";
|
||||||
|
|
||||||
import ArtistsExplorer from "../views/ArtistsExplorer.vue";
|
import ArtistsExplorer from "../views/ArtistsExplorer.vue";
|
||||||
|
import SettingsView from "../views/SettingsView.vue";
|
||||||
|
|
||||||
const routes = [
|
const routes = [
|
||||||
{
|
{
|
||||||
@ -30,7 +31,7 @@ const routes = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/albums",
|
path: "/albums",
|
||||||
name: "AlbumsExplorer",
|
name: "AlbumsView",
|
||||||
component: AlbumsExplorer,
|
component: AlbumsExplorer,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -40,9 +41,14 @@ const routes = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/artists",
|
path: "/artists",
|
||||||
name: "ArtistsExplorer",
|
name: "ArtistsView",
|
||||||
component: ArtistsExplorer,
|
component: ArtistsExplorer,
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
path: "/settings",
|
||||||
|
name: "SettingsView",
|
||||||
|
component: SettingsView,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
|
3
src/views/SettingsView.vue
Normal file
3
src/views/SettingsView.vue
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<template>
|
||||||
|
<div class="settings">Hello, settings here 😁</div>
|
||||||
|
</template>
|
Loading…
x
Reference in New Issue
Block a user