add filters to search

- move global to center
This commit is contained in:
geoffrey45
2021-12-28 15:07:26 +03:00
parent 741e34c5ee
commit 2b6bb2c0cb
8 changed files with 334 additions and 121 deletions
+5 -4
View File
@@ -12,15 +12,16 @@
<PinnedStuff :collapsed="collapsed" /> <PinnedStuff :collapsed="collapsed" />
</div> </div>
<div class="content"> <div class="content">
<router-view />
</div>
<div class="r-sidebar">
<div class="m-np">
<Search <Search
v-model:search="search" v-model:search="search"
@expandSearch="expandSearch" @expandSearch="expandSearch"
@collapseSearch="collapseSearch" @collapseSearch="collapseSearch"
/> />
<div class="separator" style="border: none"></div>
<router-view />
</div>
<div class="r-sidebar">
<div class="m-np">
<NowPlaying /> <NowPlaying />
</div> </div>
<UpNext v-model:up_next="up_next" @expandQueue="expandQueue" /> <UpNext v-model:up_next="up_next" @expandQueue="expandQueue" />
+4
View File
@@ -44,6 +44,10 @@ a {
margin: $small 0 $small 0; margin: $small 0 $small 0;
} }
.no-border {
border: none;
}
.hidden { .hidden {
display: none; display: none;
} }
+1
View File
@@ -0,0 +1 @@
<svg fill="#ffffff" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><path d="M 39.486328 6.9785156 A 1.50015 1.50015 0 0 0 38.439453 7.4394531 L 24 21.878906 L 9.5605469 7.4394531 A 1.50015 1.50015 0 0 0 8.484375 6.984375 A 1.50015 1.50015 0 0 0 7.4394531 9.5605469 L 21.878906 24 L 7.4394531 38.439453 A 1.50015 1.50015 0 1 0 9.5605469 40.560547 L 24 26.121094 L 38.439453 40.560547 A 1.50015 1.50015 0 1 0 40.560547 38.439453 L 26.121094 24 L 40.560547 9.5605469 A 1.50015 1.50015 0 0 0 39.486328 6.9785156 z"></path></svg>

After

Width:  |  Height:  |  Size: 533 B

+3
View File
@@ -0,0 +1,3 @@
<svg viewBox="1.533 3.788 500.308 492.43" width="500.308" height="492.43">
<path d="M 479.264 3.794 C 473.442 3.93 467.912 6.326 463.879 10.46 L 251.687 219.318 L 39.492 10.46 C 35.341 6.254 29.636 3.879 23.678 3.879 C 6.707 3.883 -3.894 21.968 4.593 36.431 C 5.611 38.163 6.864 39.748 8.323 41.141 L 220.515 249.998 L 8.323 458.855 C -3.92 470.424 1.153 490.698 17.453 495.348 C 25.327 497.594 33.816 495.355 39.492 489.535 L 251.687 280.678 L 463.879 489.535 C 475.633 501.584 496.231 496.592 500.955 480.547 C 503.238 472.799 500.962 464.443 495.05 458.855 L 282.856 249.998 L 495.05 41.141 C 507.293 29.574 502.225 9.3 485.925 4.647 C 483.762 4.03 481.514 3.741 479.264 3.794 Z" style="fill: rgb(255, 255, 255);"></path>
</svg>

After

Width:  |  Height:  |  Size: 734 B

+1
View File
@@ -0,0 +1 @@
<svg fill="#ffffff" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><path d="M 20.5 6 C 12.509634 6 6 12.50964 6 20.5 C 6 28.49036 12.509634 35 20.5 35 C 23.956359 35 27.133709 33.779044 29.628906 31.75 L 39.439453 41.560547 A 1.50015 1.50015 0 1 0 41.560547 39.439453 L 31.75 29.628906 C 33.779044 27.133709 35 23.956357 35 20.5 C 35 12.50964 28.490366 6 20.5 6 z M 20.5 9 C 26.869047 9 32 14.130957 32 20.5 C 32 23.602612 30.776198 26.405717 28.791016 28.470703 A 1.50015 1.50015 0 0 0 28.470703 28.791016 C 26.405717 30.776199 23.602614 32 20.5 32 C 14.130953 32 9 26.869043 9 20.5 C 9 14.130957 14.130953 9 20.5 9 z"/></svg>

After

Width:  |  Height:  |  Size: 663 B

+275 -81
View File
@@ -1,14 +1,55 @@
<template> <template>
<div class="right-search"> <div
class="right-search"
@mouseenter="magic_flag = true"
@mouseleave="toggleMagicFlag"
>
<div class="input">
<div class="search-icon image"></div>
<div class="filter">
<div
class="item"
v-for="filter in filters"
:key="filter"
@click="removeFilter(filter)"
>
{{ filter }}<span class="cancel image"></span>
</div>
</div>
<input <input
type="search" type="search"
id="search" id="search"
placeholder="find your music" placeholder="find your music"
v-model="query" v-model="query"
/> />
<div
class="suggestions"
:class="{
v00: !filters.length && !query,
v11: filters.length || query,
}"
>
<div class="item">Kenny Rogers</div>
<div class="item">Jim Reeves</div>
<div class="item">Juice Wrld</div>
<div class="item">Dolly Parton</div>
</div>
</div>
<div class="separator no-border"></div>
<div class="options" v-if="magic_flag || query || filters.length">
<div class="item info">I'm looking for:</div>
<div
class="item"
v-for="option in options"
:key="option"
@click="addFilter(option.icon)"
>
{{ option.title }}
</div>
</div>
<div class="scrollable" :class="{ v0: !is_hidden, v1: is_hidden }"> <div class="scrollable" :class="{ v0: !is_hidden, v1: is_hidden }">
<div class="tracks-results"> <div class="tracks-results">
<h3 class="heading">TRACKS<span class="more">SEE ALL</span></h3> <div class="heading">TRACKS<span class="more">SEE ALL</span></div>
<div class="result-item" v-for="song in songs" :key="song"> <div class="result-item" v-for="song in songs" :key="song">
<div class="album-art image"></div> <div class="album-art image"></div>
<div class="tags"> <div class="tags">
@@ -20,31 +61,22 @@
</div> </div>
<!-- --> <!-- -->
<div class="albums-results"> <div class="albums-results">
<h3 class="heading">ALBUMS <span class="more">SEE ALL</span></h3> <div class="heading">ALBUMS <span class="more">SEE ALL</span></div>
<div class="grid"> <div class="grid">
<div <div class="result-item" v-for="album in albums" :key="album">
class="result-item result-item3"
v-for="album in albums"
:key="album"
>
<div class="album-art image"></div> <div class="album-art image"></div>
<div class="title ellipsis">{{ album }}</div> <div class="title ellip">{{ album }}</div>
</div> </div>
</div> </div>
</div> </div>
<div class="separator no-border"></div>
<!-- --> <!-- -->
<div class="artists-results" v-if="artists"> <div class="artists-results" v-if="artists">
<h3 class="heading"> <div class="heading">ARTISTS <span class="more">SEE ALL</span></div>
ARTISTS <span class="more" v-if="artists.length > 3">SEE ALL</span>
</h3>
<div class="grid"> <div class="grid">
<div <div class="result-item" v-for="artist in artists" :key="artist">
class="result-item result-item3"
v-for="artist in artists"
:key="artist"
>
<div class="image"></div> <div class="image"></div>
<div class="name ellipsis">{{ artist }}</div> <div class="title ellip">{{ artist }}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -69,19 +101,59 @@ export default {
artist: "Michael jackson", artist: "Michael jackson",
}, },
]; ];
const options = [
{
title: "🎵 Track",
icon: "🎵",
},
{
title: "💿 Album",
icon: "💿",
},
{
title: "🙄 Artist",
icon: "🙄",
},
{
title: "😍 Playlist",
icon: "😍",
},
{
title: "📁 Folder",
icon: "📁",
},
{
title: "🈁 this page",
icon: "🈁",
},
];
const filters = ref([]);
const albums = [ const albums = [
"Smooth Criminal like wtf ... and im serious", "Smooth Criminal like wtf ... and im serious",
"Xscape", "Xscape",
"USA for Africa", "USA for Africa",
]; ];
const artists = ["Michael Jackson waihenya", "Jackson 5"];
const artists = ["Michael Jackson", "Jackson 5"];
const query = ref(null); const query = ref(null);
const magic_flag = ref(false);
const is_hidden = toRefs(props).search; const is_hidden = toRefs(props).search;
function addFilter(filter) {
if (!filters.value.includes(filter)) {
filters.value.push(filter);
}
}
function removeFilter(filter) {
filters.value = filters.value.filter((f) => f !== filter);
}
function toggleMagicFlag() {
setTimeout(() => {
magic_flag.value = false;
}, 1000);
}
watch(query, (new_query) => { watch(query, (new_query) => {
if (new_query.length > 0) { if (new_query.length > 0) {
emit("expandSearch"); emit("expandSearch");
@@ -90,15 +162,24 @@ export default {
} }
}); });
return { songs, albums, artists, query, is_hidden }; return {
addFilter,
toggleMagicFlag,
removeFilter,
songs,
albums,
artists,
query,
is_hidden,
magic_flag,
options,
filters,
};
}, },
}; };
</script> </script>
<style> <style lang="scss">
.right-search {
z-index: 10;
}
.right-search .v0 { .right-search .v0 {
max-height: 0em; max-height: 0em;
transition: max-height 0.5s ease; transition: max-height 0.5s ease;
@@ -113,19 +194,111 @@ export default {
position: relative; position: relative;
border-radius: 1rem; border-radius: 1rem;
margin: 0.5rem 0 0 0; margin: 0.5rem 0 0 0;
padding: 0.75rem; padding: $small $small 0 0;
background-color: #131313b2; background-color: #131313b2;
overflow: hidden; overflow: hidden;
.input {
display: flex;
align-items: center;
position: relative;
.filter {
display: flex;
margin-left: 3rem;
.item {
position: relative;
background-color: rgb(39, 37, 37);
padding: 0.5rem;
border-radius: 0.5rem;
cursor: pointer;
margin: 0 $small 0 0;
display: flex;
align-items: center;
&:hover {
background-color: rgb(170, 50, 50);
width: 4rem;
.cancel {
position: absolute;
right: 0.5rem;
width: 1.5rem;
height: 1.5rem;
background-image: url(../../assets/icons/a.svg);
background-size: 70%;
}
}
}
}
}
.search-icon {
position: absolute;
height: 2.5rem;
width: 2.5rem;
background-image: url(../../assets/icons/search.svg);
background-size: 70%;
}
.v11 {
opacity: 0;
transform: translateY(-3rem);
transition: all 0.2s ease-in;
}
.v00 {
opacity: 1;
max-height: 3rem;
transition: all 0.2s ease-in;
}
.suggestions {
display: flex;
gap: 0.5rem;
margin-left: 1rem;
position: absolute;
right: 0;
.item {
cursor: pointer;
background-color: rgb(75, 70, 70);
padding: $small;
border-radius: $small;
&:hover {
background-color: rgb(170, 50, 50);
}
}
.item::before {
content: "#";
color: grey;
}
}
} }
.right-search .options {
display: flex;
.item {
background-color: rgb(39, 37, 37);
padding: 0.5rem;
border-radius: 0.5rem;
cursor: pointer;
margin: $small;
&:hover {
background-color: rgb(170, 50, 50);
}
}
}
.right-search .scrollable { .right-search .scrollable {
height: 26rem; height: 26rem;
overflow-y: scroll; overflow-y: scroll;
scroll-behavior: smooth; scroll-behavior: smooth;
} padding: 0 $small 0 0;
.right-search .scrollable::-webkit-scrollbar {
display: none;
} }
.right-search .heading { .right-search .heading {
@@ -144,16 +317,16 @@ export default {
} }
.right-search .heading .more:hover { .right-search .heading .more:hover {
background: rgb(62, 69, 77); background: $blue;
border-radius: 0.5rem; border-radius: 0.5rem;
cursor: pointer; cursor: pointer;
} }
.right-search input { .right-search input {
width: 100%; width: 100%;
height: 2.5rem;
border: none; border: none;
border-radius: 0.5rem; border-radius: 0.5rem;
padding-left: 1rem; background-color: transparent;
background-color: #4645456c;
color: rgba(255, 255, 255, 0.479); color: rgba(255, 255, 255, 0.479);
font-size: 1rem; font-size: 1rem;
line-height: 3rem; line-height: 3rem;
@@ -163,43 +336,50 @@ export default {
.right-search input:focus { .right-search input:focus {
transition: all 0.5s ease; transition: all 0.5s ease;
color: rgb(255, 255, 255); color: rgb(255, 255, 255);
outline: 0.1rem solid #fafafa52; outline: none;
}
.right-search input::-webkit-search-cancel-button { &::placeholder {
position: relative; display: none;
right: 1rem; }
cursor: pointer;
} }
/* */ /* */
.right-search .tracks-results { .right-search .tracks-results {
border-radius: 0.5rem; border-radius: 0.5rem;
overflow: hidden; background-color: rgba(8, 3, 1, 0.274);
} padding: $small;
.right-search .tracks-results .heading { .result-item {
padding: 0.5rem;
}
.right-search .tracks-results .result-item {
display: flex; display: flex;
align-items: center; align-items: center;
height: 4.5rem; height: 4.5rem;
background-color: rgba(20, 20, 20, 0.733); width: 100%;
} background-color: rgba(20, 20, 20, 0.479);
.right-search .tracks-results .result-item:nth-child(odd) { .album-art {
background-color: rgba(27, 26, 27, 0.589); width: 3.5rem;
} height: 3.5rem;
.right-search .tracks-results .result-item .album-art {
width: 4rem;
height: 4rem;
background-color: rgb(27, 150, 74); background-color: rgb(27, 150, 74);
border-radius: 0.5rem; border-radius: 0.5rem;
margin: 0 0.5rem 0 0.25rem; margin: 0 $small 0 $small;
background-image: url(../../assets/images/thriller.jpg); background-image: url(../../assets/images/thriller.jpg);
}
.tags .artist {
font-size: small;
color: rgba(255, 255, 255, 0.63);
}
&:nth-child(odd) {
background-color: transparent;
}
&:hover {
background-color: $blue;
border-radius: $small;
}
}
} }
.right-search hr { .right-search hr {
@@ -207,42 +387,45 @@ export default {
border: none; border: none;
} }
.right-search .tracks-results .result-item .tags .artist {
font-size: small;
color: rgba(255, 255, 255, 0.63);
}
/* */ /* */
.right-search .albums-results { .right-search .albums-results {
border-radius: 0.5rem; border-radius: 0.5rem;
background-color: rgba(8, 3, 1, 0.274); background-color: rgba(8, 3, 1, 0.274);
margin-top: 1rem; margin-top: 1rem;
}
.right-search .albums-results .grid { .grid {
display: grid; display: flex;
grid-template-columns: repeat(3, 1fr); flex-wrap: wrap;
} padding: 0 0 0 $small;
gap: $small;
.right-search .result-item3 { .result-item {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
} padding: $small;
border-radius: $small;
background-color: rgb(24, 23, 23);
margin-bottom: 1rem;
.right-search .albums-results .result-item .album-art { .album-art {
height: 7rem; height: 7rem;
width: 7rem; width: 7rem;
background-color: rgba(26, 26, 26, 0.452); background-color: rgba(26, 26, 26, 0.452);
border-radius: 0.5rem; border-radius: 0.5rem;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
background-image: url(../../assets/images/thriller.jpg); background-image: url(../../assets/images/thriller.jpg);
} }
.right-search .albums-results .result-item .title { .title {
width: 7rem; width: 7rem;
text-align: center; text-align: center;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
font-size: 0.9rem;
}
}
}
} }
/* */ /* */
@@ -250,28 +433,39 @@ export default {
.right-search .artists-results { .right-search .artists-results {
border-radius: 0.5rem; border-radius: 0.5rem;
background-color: rgba(8, 3, 1, 0.274); background-color: rgba(8, 3, 1, 0.274);
}
.right-search .artists-results .grid { .grid {
display: grid; padding: 0 0 0 $small;
grid-template-columns: repeat(3, 1fr); display: flex;
} gap: 1rem;
.right-search .artists-results .result-item .image { .result-item {
display: flex;
flex-direction: column;
align-items: center;
padding: $small;
border-radius: $small;
background-color: rgb(24, 23, 23);
margin-bottom: 1rem;
.image {
height: 7rem; height: 7rem;
width: 7rem; width: 7rem;
border-radius: 50%; border-radius: 50%;
background-color: rgba(16, 65, 14, 0.356); background-color: rgba(16, 65, 14, 0.356);
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
background-image: url(../../assets/icons/logo-small.svg);
background-size: 50%; background-size: 50%;
background-image: url(../../assets/images/thriller.jpg); background-image: url(../../assets/images/thriller.jpg);
background-size: cover; background-size: cover;
} }
.right-search .artists-results .result-item .name { .title {
width: 7rem; width: 7rem;
text-align: center; text-align: center;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
font-size: 0.9rem;
}
}
}
} }
</style> </style>
+10 -1
View File
@@ -120,4 +120,13 @@ watch(current, (new_current, old_current) => {
localStorage.setItem("prev", JSON.stringify(prev.value)); localStorage.setItem("prev", JSON.stringify(prev.value));
}); });
export default { putCommas, doThat, readQueue, focusCurrent, current, queue, next, prev }; export default {
putCommas,
doThat,
readQueue,
focusCurrent,
current,
queue,
next,
prev,
};