Compare commits
215 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf2d9537ff | ||
|
|
6f4a59f971 | ||
|
|
7b21853f97 | ||
|
|
663dbd2a7c | ||
|
|
c7a0b5ab7e | ||
|
|
ad8eeb7a2a | ||
|
|
e799c96872 | ||
|
|
234aed54d7 | ||
|
|
574d7fd5e7 | ||
|
|
4a1106d784 | ||
|
|
d9f7e5fb14 | ||
|
|
571c4a5264 | ||
|
|
e71bc7164c | ||
|
|
77f18ac640 | ||
|
|
78d57a64b9 | ||
|
|
ff502521e8 | ||
|
|
7caa70b9d6 | ||
|
|
cc3b372090 | ||
|
|
c297f75132 | ||
|
|
7c954ef805 | ||
|
|
9222e94b6c | ||
|
|
54c165b64a | ||
|
|
591509ebaf | ||
|
|
80a0bdbbf1 | ||
|
|
2e27da3f9f | ||
|
|
74bf8f5d78 | ||
|
|
bfdefc37fd | ||
|
|
44a877b9c9 | ||
|
|
db93fd554e | ||
|
|
40a7ad084c | ||
|
|
e44aa01d63 | ||
|
|
192e705890 | ||
|
|
50f92b65ab | ||
|
|
a5aea45cd6 | ||
|
|
56b1ab35d3 | ||
|
|
cc93fe7419 | ||
|
|
56d1c9da90 | ||
|
|
da611f5e8e | ||
|
|
b9e767b3c3 | ||
|
|
1eaf18ae75 | ||
|
|
e420dc3aac | ||
|
|
9b938194a6 | ||
|
|
54ab071803 | ||
|
|
b3484b08dd | ||
|
|
96178c462f | ||
|
|
2c4dad299b | ||
|
|
0fcbe03bab | ||
|
|
6775b7abaf | ||
|
|
275877a258 | ||
|
|
a2772b3945 | ||
|
|
ea48380699 | ||
|
|
818c37a6be | ||
|
|
a711007e66 | ||
|
|
4165e13aaa | ||
|
|
de353bf534 | ||
|
|
c2a3fe5725 | ||
|
|
32d06850e4 | ||
|
|
d9b14c0bf7 | ||
|
|
b18b411005 | ||
|
|
79ba8b0f6d | ||
|
|
67ca114f7c | ||
|
|
43c6638f40 | ||
|
|
0d0d519213 | ||
|
|
ab7075726d | ||
|
|
f4117a452f | ||
|
|
00f6181cbd | ||
|
|
ed847077ee | ||
|
|
72915c8367 | ||
|
|
866c67a154 | ||
|
|
387c60165c | ||
|
|
35aca59508 | ||
|
|
57bd7c151f | ||
|
|
5ff9b67b5e | ||
|
|
418f326366 | ||
|
|
c0c84504e0 | ||
|
|
e1e30565de | ||
|
|
3593e4ac8e | ||
|
|
e7276a3552 | ||
|
|
850d573f91 | ||
|
|
c78b24f088 | ||
|
|
10e48cb068 | ||
|
|
c6e5f9d740 | ||
|
|
76bcf51eab | ||
|
|
5bc21f98a8 | ||
|
|
4c03644389 | ||
|
|
21ffbc3842 | ||
|
|
0f42c48ca1 | ||
|
|
f966df7581 | ||
|
|
9f714eef75 | ||
|
|
1c054f17b9 | ||
|
|
c53c937cac | ||
|
|
90b72b5f1c | ||
|
|
d740ed43be | ||
|
|
9899f70657 | ||
|
|
606ee6cecd | ||
|
|
1aeb3dc1d1 | ||
|
|
bf471049e4 | ||
|
|
0a54aa2c70 | ||
|
|
212c76ed0d | ||
|
|
9533a0db19 | ||
|
|
e33800281b | ||
|
|
1aeddd95b5 | ||
|
|
5cef926675 | ||
|
|
767b35dd08 | ||
|
|
33541ea964 | ||
|
|
bc2152c45c | ||
|
|
227963556c | ||
|
|
ee578ae9de | ||
|
|
2ee13a8531 | ||
|
|
753d38be14 | ||
|
|
b20d39935b | ||
|
|
a11f64e4d2 | ||
|
|
01254f64f0 | ||
|
|
b14ff26932 | ||
|
|
9864a71bae | ||
|
|
ba3d9e63f8 | ||
|
|
0b1730e7bb | ||
|
|
746d783544 | ||
|
|
b7410c4b35 | ||
|
|
8014b2a1cb | ||
|
|
b3d4732cbb | ||
|
|
09bb5ae7b0 | ||
|
|
1ed4777bc0 | ||
|
|
8afac9af6c | ||
|
|
e954dbf713 | ||
|
|
8fcff3d958 | ||
|
|
f2567d2897 | ||
|
|
29b4f078eb | ||
|
|
64e1ba317c | ||
|
|
8b4605e3bf | ||
|
|
ef35c517af | ||
|
|
5bbcbfcbcd | ||
|
|
6211c8d6c0 | ||
|
|
fac86b68f5 | ||
|
|
0edd3bff43 | ||
|
|
483130b068 | ||
|
|
0706cedaab | ||
|
|
ca4cb3c4a3 | ||
|
|
e7850c39f9 | ||
|
|
313a2352cb | ||
|
|
b6a95b1669 | ||
|
|
1ec1d23cf3 | ||
|
|
c78866f516 | ||
|
|
6b9d223bc3 | ||
|
|
472e9f5114 | ||
|
|
51e1f39761 | ||
|
|
37ee4adb04 | ||
|
|
daab935193 | ||
|
|
edcf8b884c | ||
|
|
d7f97f4cd4 | ||
|
|
7e917e40a6 | ||
|
|
25d1684b1f | ||
|
|
a8c246c32b | ||
|
|
813bb1caac | ||
|
|
b7481a5de4 | ||
|
|
0a96ac7387 | ||
|
|
5f15855ac2 | ||
|
|
ac493b60d6 | ||
|
|
4eee813ad9 | ||
|
|
a442f57b7d | ||
|
|
15d9d7fec6 | ||
|
|
0943bc8015 | ||
|
|
8c86874ae5 | ||
|
|
a3fe3968ca | ||
|
|
d154a886d1 | ||
|
|
e0ec2f3c68 | ||
|
|
9207602a26 | ||
|
|
512307cfd2 | ||
|
|
7b8846da9c | ||
|
|
2ae24b73ca | ||
|
|
43c45b5893 | ||
|
|
3f47dd3d02 | ||
|
|
ab0c566c92 | ||
|
|
5e0de20485 | ||
|
|
e0654b182a | ||
|
|
06de7a26e1 | ||
|
|
176b38ffa5 | ||
|
|
12e7db7310 | ||
|
|
32ac77c426 | ||
|
|
bce03af941 | ||
|
|
f6921fedc9 | ||
|
|
3477397072 | ||
|
|
0bb7bf56d2 | ||
|
|
d2b0e28751 | ||
|
|
2d0146cfc3 | ||
|
|
cfcfd4d7d7 | ||
|
|
92c6e76ad5 | ||
|
|
5a4efb41bc | ||
|
|
211bab805a | ||
|
|
b7583ac889 | ||
|
|
a63717961b | ||
|
|
9a7596a6ba | ||
|
|
62c65873f5 | ||
|
|
821b0029dd | ||
|
|
336a9755b8 | ||
|
|
f9a522240e | ||
|
|
94af90e481 | ||
|
|
85dfb5700e | ||
|
|
45010fe4d1 | ||
|
|
3948deb165 | ||
|
|
e5f73d8495 | ||
|
|
18afef151c | ||
|
|
80dbd98beb | ||
|
|
a12d1a86e5 | ||
|
|
449e7b4bb7 | ||
|
|
5ee0b81ed9 | ||
|
|
3496fde28c | ||
|
|
58b2a02989 | ||
|
|
eb69d78a38 | ||
|
|
b7a9a35c4f | ||
|
|
8de2a701ea | ||
|
|
681ccaba8c | ||
|
|
6d3f64ffc7 | ||
|
|
aa780977f1 | ||
|
|
4cb77334fb |
2
.gitignore
vendored
@@ -24,7 +24,7 @@ pnpm-debug.log*
|
||||
*.sw?
|
||||
|
||||
# TODO
|
||||
TODO.md
|
||||
# TODO.md
|
||||
|
||||
__pycache__
|
||||
dev-dist/*
|
||||
9
.prettierrc
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"arrowParens": "avoid",
|
||||
"bracketSpacing": true,
|
||||
"semi": false,
|
||||
"singleQuote": true,
|
||||
"tabWidth": 4,
|
||||
"trailingComma": "es5",
|
||||
"printWidth": 120
|
||||
}
|
||||
41
TODO.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# TODO 📦
|
||||
- Track share page
|
||||
- Add right-click option to copy track url
|
||||
- Check out the mobile sidebar and navbar
|
||||
- Remove old settings page files
|
||||
- Fix: track loading indicator in bottom bar
|
||||
- Unfuck javascript controlled responsiveness
|
||||
|
||||
- Redesign the album page header for mobile
|
||||
- Merge all cards into one generic card or something! ... for better control and updates. ie. have a layout card to controls the sections and general style. Use slots, props and emits to create child components.
|
||||
- Merge sidenav dimmer and modal dimmer
|
||||
- Fix: Add to favorite button on headers icon alignment
|
||||
- Add trailing slash to folder url accessed from the breadcrumb
|
||||
- Clip the browseable items on the homepage
|
||||
- Fix: The responsiveness glitch between 900px - 964px 😅
|
||||
- Make All Albums/Artists view sort banner sticky
|
||||
|
||||
# DONE ✅
|
||||
- Remove welcome dialog
|
||||
- Reduce folder item height
|
||||
- Fix max album cards calculator
|
||||
- Replace the search input X with an SVG
|
||||
- Remove track item hover effect on mobile view
|
||||
- Add auth info to home page greetings. eg. Good afternoon cwilvx
|
||||
- Update folder page breadcrumb when response has skipped empty folders
|
||||
- Rewrite context menu to only fetch server side data when you need it:
|
||||
- WHY: To remove popup delays!
|
||||
- REVIEW: Is this really what we need?
|
||||
- HOW: eg. fetch playlists when you hover/click "Add to playlist"
|
||||
- IDEA: Maybe have a store for available playlists, and fetch new items when you read the store? Or something!
|
||||
- Add generic headers to favorite subpages
|
||||
- Fix: Edit playlist button hiding on playlist update
|
||||
- Merge "Save as playlist" with "Add to playlist > New Playlist"
|
||||
- Fix: Tracklist item index slightly shifts up and down on hover/unhover
|
||||
- Settings dialog responsiveness
|
||||
- Fix: Breadcrumb align center (shifts when the the position of the highlighted folder is auto-scrolled to)
|
||||
- Fix: Audio not being muted (when audio is muted by user) on queue repeat
|
||||
- hide "remove from playlist" option on system playlists
|
||||
- ADD QR CODE SOMEWHERE ON THE WEB
|
||||
- Add a "Rescan folders" item to the "Browse Library" section
|
||||
- Paginate playlist page
|
||||
@@ -3,15 +3,15 @@
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" />
|
||||
<title>Swing Music</title>
|
||||
<base href="./">
|
||||
<base href="./" />
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
<strong
|
||||
>We're sorry but this app doesn't work properly without JavaScript
|
||||
enabled. Please enable it to continue.</strong
|
||||
>We're sorry but this app doesn't work properly without JavaScript enabled. Please enable it to
|
||||
continue.</strong
|
||||
>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
|
||||
@@ -22,8 +22,10 @@
|
||||
"node-vibrant": "3.1.6",
|
||||
"pinia": "^2.0.17",
|
||||
"pinia-plugin-persistedstate": "^3.2.0",
|
||||
"qr-code-styling": "^1.6.0-rc.1",
|
||||
"v-wave": "^1.5.0",
|
||||
"vue": "^v3.2.45",
|
||||
"vue": "^v3.5.13",
|
||||
"vue-boring-avatars": "^1.4.0",
|
||||
"vue-debounce": "^3.0.2",
|
||||
"vue-router": "^4.1.3",
|
||||
"vue-template-compiler": "^2.0.0",
|
||||
@@ -43,6 +45,7 @@
|
||||
"typescript": "^5.0.4",
|
||||
"vite": "^3.0.4",
|
||||
"vite-plugin-compression": "^0.5.1",
|
||||
"vite-plugin-node-polyfills": "^0.22.0",
|
||||
"vite-plugin-pwa": "^0.16.4",
|
||||
"vite-plugin-singlefile": "^0.13.5",
|
||||
"vite-svg-loader": "^4.0.0",
|
||||
|
||||
3
public/icons/heart.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg fill="currentColor" viewBox="0 0 28 28" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5.09668 11.1846C5.09668 14.9375 8.25195 18.6465 13.1562 21.8105C13.4287 21.9863 13.7627 22.1621 13.9912 22.1621C14.2197 22.1621 14.5537 21.9863 14.8262 21.8105C19.7393 18.6465 22.8857 14.9375 22.8857 11.1846C22.8857 7.94141 20.6445 5.69141 17.7705 5.69141C16.0918 5.69141 14.7822 6.45605 13.9912 7.61621C13.2178 6.46484 11.8994 5.69141 10.2207 5.69141C7.33789 5.69141 5.09668 7.94141 5.09668 11.1846ZM6.90723 11.1758C6.90723 8.96094 8.36621 7.45801 10.3262 7.45801C11.9082 7.45801 12.7959 8.41602 13.3496 9.25098C13.5957 9.61133 13.7627 9.72559 13.9912 9.72559C14.2285 9.72559 14.3779 9.60254 14.6328 9.25098C15.2305 8.43359 16.083 7.45801 17.6562 7.45801C19.625 7.45801 21.084 8.96094 21.084 11.1758C21.084 14.2695 17.8672 17.6973 14.1582 20.1582C14.0791 20.2109 14.0264 20.2461 13.9912 20.2461C13.9561 20.2461 13.9033 20.2109 13.833 20.1582C10.124 17.6973 6.90723 14.2695 6.90723 11.1758Z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 993 B |
3
public/icons/playlist.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.16016 9.50586C6.85449 9.50586 7.4082 8.95215 7.4082 8.25781C7.4082 7.57227 6.85449 7.00977 6.16016 7.00977C5.47461 7.00977 4.91211 7.57227 4.91211 8.25781C4.91211 8.95215 5.47461 9.50586 6.16016 9.50586ZM10.291 9.10156H22.2266C22.7012 9.10156 23.0791 8.73242 23.0791 8.25781C23.0791 7.7832 22.71 7.41406 22.2266 7.41406H10.291C9.8252 7.41406 9.44727 7.7832 9.44727 8.25781C9.44727 8.73242 9.81641 9.10156 10.291 9.10156ZM6.16016 14.9111C6.85449 14.9111 7.4082 14.3574 7.4082 13.6631C7.4082 12.9775 6.85449 12.415 6.16016 12.415C5.47461 12.415 4.91211 12.9775 4.91211 13.6631C4.91211 14.3574 5.47461 14.9111 6.16016 14.9111ZM10.291 14.5068H22.2266C22.7012 14.5068 23.0791 14.1377 23.0791 13.6631C23.0791 13.1885 22.71 12.8193 22.2266 12.8193H10.291C9.8252 12.8193 9.44727 13.1885 9.44727 13.6631C9.44727 14.1377 9.81641 14.5068 10.291 14.5068ZM6.16016 20.3164C6.85449 20.3164 7.4082 19.7627 7.4082 19.0684C7.4082 18.3828 6.85449 17.8203 6.16016 17.8203C5.47461 17.8203 4.91211 18.3828 4.91211 19.0684C4.91211 19.7627 5.47461 20.3164 6.16016 20.3164ZM10.291 19.9121H22.2266C22.7012 19.9121 23.0791 19.543 23.0791 19.0684C23.0791 18.5938 22.71 18.2246 22.2266 18.2246H10.291C9.8252 18.2246 9.44727 18.5938 9.44727 19.0684C9.44727 19.543 9.81641 19.9121 10.291 19.9121Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
3
public/icons/settings.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.1035 23.208H14.8877C15.6172 23.208 16.1885 22.751 16.3643 22.0479L16.7158 20.5098L16.9443 20.4219L18.2891 21.2568C18.9043 21.6436 19.6338 21.5381 20.1523 21.0195L21.3828 19.7891C21.9102 19.2617 21.998 18.541 21.6113 17.9346L20.7764 16.5898L20.8643 16.3789L22.4023 16.0186C23.0967 15.8428 23.5537 15.2715 23.5537 14.542V12.8105C23.5537 12.0811 23.1055 11.5098 22.4023 11.334L20.873 10.9648L20.7852 10.7363L21.6201 9.40039C22.0068 8.79395 21.9189 8.07324 21.3916 7.53711L20.1611 6.30664C19.6514 5.78809 18.9219 5.69141 18.3066 6.06934L16.9619 6.89551L16.7158 6.80762L16.3643 5.26074C16.1885 4.55762 15.6172 4.10938 14.8877 4.10938H13.1035C12.3652 4.10938 11.7939 4.55762 11.627 5.26074L11.2754 6.80762L11.0293 6.89551L9.68457 6.06934C9.06055 5.69141 8.33984 5.78809 7.83008 6.30664L6.59082 7.53711C6.07227 8.07324 5.97559 8.79395 6.3623 9.40039L7.19727 10.7363L7.10938 10.9648L5.58887 11.334C4.88574 11.5098 4.4375 12.0811 4.4375 12.8105V14.542C4.4375 15.2715 4.89453 15.8428 5.58887 16.0186L7.12695 16.3789L7.20605 16.5898L6.37109 17.9346C5.98438 18.541 6.08105 19.2617 6.59961 19.7891L7.83887 21.0195C8.34863 21.5381 9.07812 21.6436 9.69336 21.2568L11.0381 20.4219L11.2754 20.5098L11.627 22.0479C11.7939 22.751 12.3652 23.208 13.1035 23.208ZM13.332 21.5908C13.1826 21.5908 13.1035 21.5293 13.0859 21.3975L12.5586 19.2354C12.0049 19.1035 11.4688 18.875 11.0381 18.6025L9.13965 19.7715C9.02539 19.8418 8.91992 19.833 8.81445 19.7275L7.8916 18.8047C7.78613 18.708 7.78613 18.6025 7.85645 18.4883L9.02539 16.5898C8.7793 16.168 8.55078 15.6406 8.41895 15.0869L6.24805 14.5684C6.11621 14.5508 6.0459 14.4717 6.0459 14.3223V13.0215C6.0459 12.8633 6.10742 12.8018 6.24805 12.7666L8.41016 12.2568C8.54199 11.668 8.79688 11.123 9.0166 10.7275L7.84766 8.84668C7.77734 8.72363 7.77734 8.61816 7.87402 8.5127L8.80566 7.59863C8.91113 7.50195 9.00781 7.48438 9.13965 7.56348L11.0205 8.71484C11.416 8.46875 12.0049 8.22266 12.5674 8.08203L13.0859 5.91992C13.1035 5.78809 13.1826 5.71777 13.332 5.71777H14.6592C14.8086 5.71777 14.8789 5.7793 14.9053 5.91992L15.4326 8.09082C16.0039 8.23145 16.5225 8.46875 16.9619 8.71484L18.8428 7.56348C18.9746 7.49316 19.0713 7.50195 19.1768 7.60742L20.1084 8.52148C20.2139 8.61816 20.2139 8.72363 20.1348 8.84668L18.9746 10.7275C19.1855 11.123 19.4492 11.668 19.5811 12.2568L21.7432 12.7666C21.8838 12.8018 21.9365 12.8633 21.9365 13.0215V14.3223C21.9365 14.4717 21.875 14.5508 21.7432 14.5684L19.5723 15.0869C19.4404 15.6406 19.2031 16.1768 18.957 16.5898L20.126 18.4795C20.1963 18.6025 20.1963 18.6992 20.0908 18.7959L19.168 19.7275C19.0625 19.833 18.957 19.8418 18.8428 19.7715L16.9531 18.6025C16.5137 18.875 16.0127 19.0947 15.4326 19.2354L14.9053 21.3975C14.8789 21.5293 14.8086 21.5908 14.6592 21.5908H13.332ZM14 16.9941C15.8281 16.9941 17.3311 15.4912 17.3311 13.6543C17.3311 11.835 15.8281 10.332 14 10.332C12.1631 10.332 10.6514 11.835 10.6514 13.6543C10.6514 15.4912 12.1631 16.9941 14 16.9941ZM14 15.4736C12.998 15.4736 12.1807 14.6562 12.1807 13.6543C12.1807 12.6699 13.0068 11.8525 14 11.8525C14.9756 11.8525 15.793 12.6699 15.793 13.6543C15.793 14.6475 14.9756 15.4736 14 15.4736Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
@@ -1,2 +1,2 @@
|
||||
User-agent: *
|
||||
Disallow:
|
||||
Disallow: /
|
||||
|
||||
@@ -2,7 +2,8 @@ onmessage = (e) => {
|
||||
const { trackhash, duration, source, timestamp } = e.data;
|
||||
|
||||
const is_dev = location.port === "5173";
|
||||
const base_url = is_dev ? "http://localhost:1980" : location.origin;
|
||||
const protocol = location.protocol.replace(':', '');
|
||||
const base_url = is_dev ? `${protocol}://${location.hostname}:1980` : location.origin;
|
||||
const url = base_url + "/logger/track/log";
|
||||
|
||||
fetch(url, {
|
||||
@@ -11,5 +12,6 @@ onmessage = (e) => {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({ trackhash, duration, source, timestamp }),
|
||||
credentials: "include"
|
||||
});
|
||||
};
|
||||
|
||||
@@ -10,7 +10,8 @@ onmessage = async (e) => {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({ end: ending_file, start: starting_file }),
|
||||
body: JSON.stringify({ ending_file, starting_file }),
|
||||
credentials: "include"
|
||||
});
|
||||
|
||||
const data = await res.json();
|
||||
|
||||
212
src/App.vue
@@ -1,38 +1,32 @@
|
||||
<template>
|
||||
<ContextMenu />
|
||||
<Modal />
|
||||
<Notification />
|
||||
<div id="drag-img" class="ellip2" style=""></div>
|
||||
<section
|
||||
id="app-grid"
|
||||
:class="{
|
||||
useSidebar: settings.use_sidebar && xl,
|
||||
NoSideBorders: settings.is_alt_layout || !xxl,
|
||||
extendWidth: settings.extend_width && settings.can_extend_width,
|
||||
is_alt_layout: settings.is_alt_layout,
|
||||
}"
|
||||
:style="{
|
||||
maxWidth: `${
|
||||
settings.is_default_layout
|
||||
? content_height > 1080
|
||||
? '2220px'
|
||||
: '1760px'
|
||||
: ''
|
||||
}`,
|
||||
}"
|
||||
>
|
||||
<LeftSidebar v-if="settings.is_default_layout && !isMobile" />
|
||||
<NavBar />
|
||||
<div id="acontent" v-element-size="updateContentElemSize">
|
||||
<div id="contentresizer" ref="appcontent"></div>
|
||||
<BalancerProvider>
|
||||
<RouterView />
|
||||
</BalancerProvider>
|
||||
</div>
|
||||
<RightSideBar v-if="settings.use_sidebar && xl" />
|
||||
<BottomBar />
|
||||
<!-- <BubbleManager /> -->
|
||||
</section>
|
||||
<ContextMenu />
|
||||
<Modal />
|
||||
<Notification />
|
||||
<div id="drag-img" class="ellip2" style=""></div>
|
||||
<section
|
||||
id="app-grid"
|
||||
:class="{
|
||||
useSidebar: settings.use_sidebar && xl,
|
||||
NoSideBorders: settings.is_alt_layout || !xxl,
|
||||
extendWidth: settings.extend_width && settings.can_extend_width,
|
||||
is_alt_layout: settings.is_alt_layout,
|
||||
}"
|
||||
:style="{
|
||||
maxWidth: `${settings.is_default_layout ? (content_height > 1080 ? '2220px' : '1760px') : ''}`,
|
||||
}"
|
||||
>
|
||||
<LeftSidebar v-if="settings.is_default_layout && !isMobile" />
|
||||
<NavBar />
|
||||
<div id="acontent" v-element-size="updateContentElemSize">
|
||||
<div id="contentresizer" ref="appcontent"></div>
|
||||
<BalancerProvider>
|
||||
<RouterView />
|
||||
</BalancerProvider>
|
||||
</div>
|
||||
<RightSideBar v-if="settings.use_sidebar && xl" />
|
||||
<BottomBar />
|
||||
<!-- <BubbleManager /> -->
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
@@ -44,12 +38,8 @@ import { useRouter } from "vue-router";
|
||||
import { BalancerProvider } from "vue-wrap-balancer";
|
||||
|
||||
// @stores
|
||||
import {
|
||||
content_height,
|
||||
content_width,
|
||||
isMobile,
|
||||
updateCardWidth,
|
||||
} from "@/stores/content-width";
|
||||
import useAuth from "@/stores/auth";
|
||||
import { content_height, content_width, isMobile, resizer_width, updateCardWidth } from "@/stores/content-width";
|
||||
import useLyrics from "@/stores/lyrics";
|
||||
import useModal from "@/stores/modal";
|
||||
import useQueue from "@/stores/queue";
|
||||
@@ -58,7 +48,6 @@ import useTracker from "@/stores/tracker";
|
||||
|
||||
// @utils
|
||||
import handleShortcuts from "@/helpers/useKeyboard";
|
||||
import { readLocalStorage, writeLocalStorage } from "@/utils";
|
||||
import { xl, xxl } from "./composables/useBreakpoints";
|
||||
|
||||
// @small-components
|
||||
@@ -71,12 +60,14 @@ import BottomBar from "@/components/BottomBar/BottomBar.vue";
|
||||
import LeftSidebar from "@/components/LeftSidebar/index.vue";
|
||||
import NavBar from "@/components/nav/NavBar.vue";
|
||||
import RightSideBar from "@/components/RightSideBar/Main.vue";
|
||||
import { getAllSettings } from "@/requests/settings";
|
||||
|
||||
import { getAllSettings } from "@/requests/settings";
|
||||
import { getRootDirs } from "@/requests/settings/rootdirs";
|
||||
import { getLoggedInUser } from "./requests/auth";
|
||||
// import BubbleManager from "./components/bubbles/BinManager.vue";
|
||||
|
||||
const appcontent: Ref<HTMLLegendElement | null> = ref(null);
|
||||
const auth = useAuth();
|
||||
const queue = useQueue();
|
||||
const modal = useModal();
|
||||
const lyrics = useLyrics();
|
||||
@@ -87,91 +78,102 @@ useTracker();
|
||||
handleShortcuts(useQueue, useModal);
|
||||
|
||||
router.afterEach(() => {
|
||||
(document.getElementById("acontent") as HTMLElement).scrollTo(0, 0);
|
||||
(document.getElementById("acontent") as HTMLElement).scrollTo(0, 0);
|
||||
});
|
||||
|
||||
onStartTyping(() => {
|
||||
const elem = document.getElementById("globalsearch") as HTMLInputElement;
|
||||
elem.focus();
|
||||
elem.value = "";
|
||||
const elem = document.getElementById("globalsearch") as HTMLInputElement;
|
||||
elem.focus();
|
||||
elem.value = "";
|
||||
});
|
||||
|
||||
function getContentSize() {
|
||||
const elem = document.getElementById("acontent") as HTMLElement;
|
||||
return {
|
||||
width: elem.offsetWidth,
|
||||
height: elem.offsetHeight,
|
||||
};
|
||||
const elem = document.getElementById("acontent") as HTMLElement;
|
||||
return {
|
||||
width: elem.offsetWidth,
|
||||
height: elem.offsetHeight,
|
||||
};
|
||||
}
|
||||
|
||||
function updateContentElemSize({
|
||||
width,
|
||||
height,
|
||||
}: {
|
||||
width: number;
|
||||
height: number;
|
||||
}) {
|
||||
// 1572 is the maxwidth of the #acontent. see app-grid.scss > $maxwidth
|
||||
const elem_width = appcontent.value?.offsetWidth || 0;
|
||||
|
||||
content_width.value = elem_width;
|
||||
content_height.value = height;
|
||||
updateCardWidth();
|
||||
}
|
||||
function updateContentElemSize({ width, height }: { width: number; height: number }) {
|
||||
// 1572 is the maxwidth of the #acontent. see app-grid.scss > $maxwidth
|
||||
const elem_width = appcontent.value?.offsetWidth || 0;
|
||||
|
||||
function handleWelcomeModal() {
|
||||
let welcomeShowCount = readLocalStorage("shown-welcome-message");
|
||||
content_width.value = elem_width;
|
||||
content_height.value = height;
|
||||
|
||||
if (!welcomeShowCount) {
|
||||
welcomeShowCount = 0;
|
||||
}
|
||||
|
||||
if (welcomeShowCount < 2) {
|
||||
modal.showWelcomeModal();
|
||||
writeLocalStorage("shown-welcome-message", welcomeShowCount + 1);
|
||||
}
|
||||
resizer_width.value = elem_width;
|
||||
updateCardWidth();
|
||||
}
|
||||
|
||||
function handleRootDirsPrompt() {
|
||||
getRootDirs().then((dirs) => {
|
||||
if (dirs.length === 0) {
|
||||
modal.showRootDirsPromptModal();
|
||||
} else {
|
||||
settings.setRootDirs(dirs);
|
||||
}
|
||||
});
|
||||
getRootDirs().then(dirs => {
|
||||
if (dirs.length === 0) {
|
||||
modal.showRootDirsPromptModal();
|
||||
} else {
|
||||
settings.setRootDirs(dirs);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
const { width, height } = getContentSize();
|
||||
updateContentElemSize({ width, height });
|
||||
onMounted(async () => {
|
||||
const { width, height } = getContentSize();
|
||||
updateContentElemSize({ width, height });
|
||||
|
||||
handleWelcomeModal();
|
||||
settings.initializeVolume();
|
||||
const res = await getLoggedInUser();
|
||||
|
||||
handleRootDirsPrompt();
|
||||
if (res.status == 200) {
|
||||
auth.setUser(res.data);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
getAllSettings()
|
||||
.then(({ settings: data }) => {
|
||||
settings.mapDbSettings(data);
|
||||
})
|
||||
.then(() => {
|
||||
if (queue.currenttrack && !settings.use_lyrics_plugin) {
|
||||
lyrics.checkExists(
|
||||
queue.currenttrack.filepath,
|
||||
queue.currenttrack.trackhash
|
||||
);
|
||||
}
|
||||
});
|
||||
settings.initializeVolume();
|
||||
|
||||
handleRootDirsPrompt();
|
||||
|
||||
getAllSettings()
|
||||
.then(({ settings: data }) => {
|
||||
settings.mapDbSettings(data);
|
||||
})
|
||||
.then(() => {
|
||||
if (queue.currenttrack && !settings.use_lyrics_plugin) {
|
||||
lyrics.checkExists(queue.currenttrack.filepath, queue.currenttrack.trackhash);
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
// Detect OS & browser agents and add class
|
||||
import { defineComponent } from "vue";
|
||||
import usePlayer from "./composables/usePlayer";
|
||||
export default defineComponent({
|
||||
name: "OsAndBrowserSpecificContent",
|
||||
mounted() {
|
||||
this.applyClassBasedOnAgent();
|
||||
},
|
||||
methods: {
|
||||
applyClassBasedOnAgent() {
|
||||
const userAgent = navigator.userAgent;
|
||||
const isWindows = /Win/.test(userAgent);
|
||||
const isLinux = /Linux/.test(userAgent) && !/Android/.test(userAgent);
|
||||
const isChrome = /Chrome/.test(userAgent) && /Google Inc/.test(navigator.vendor);
|
||||
if ((isWindows || isLinux) && isChrome) {
|
||||
document.documentElement.classList.add("designatedOS");
|
||||
} else {
|
||||
document.documentElement.classList.add("otherOS");
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import "./assets/scss/mixins.scss";
|
||||
|
||||
.r-sidebar {
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
.designatedOS .r-sidebar {
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
BIN
src/assets/fonts/SFCompactDisplay-Bold.woff2
Normal file
BIN
src/assets/fonts/SFCompactDisplay-Medium.woff2
Normal file
BIN
src/assets/fonts/SFCompactDisplay-Regular.woff2
Normal file
BIN
src/assets/fonts/SFCompactDisplay-Semibold.woff2
Normal file
BIN
src/assets/fonts/sf-mono-medium.woff2
Normal file
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5.83789 11.4512C5.83789 14.958 8.20215 17.3662 12.1836 17.3662H17.7383L19.7686 17.2783L18.2393 18.5703L16.0068 20.75C15.8311 20.9258 15.7168 21.1367 15.7168 21.4268C15.7168 21.9805 16.0947 22.3848 16.6748 22.3848C16.9209 22.3848 17.1934 22.2705 17.3779 22.0771L22.4229 17.1113C22.625 16.918 22.7305 16.6543 22.7305 16.3906C22.7305 16.1182 22.625 15.8545 22.4229 15.6611L17.3779 10.7041C17.1934 10.5107 16.9209 10.3965 16.6748 10.3965C16.0947 10.3965 15.7168 10.8008 15.7168 11.3457C15.7168 11.6357 15.8311 11.8555 16.0068 12.0312L18.2393 14.2021L19.7686 15.5029L17.7383 15.4062H12.1396C9.32715 15.4062 7.77148 13.8066 7.77148 11.5215C7.77148 9.24512 9.32715 7.5752 12.1396 7.5752H14.1963C14.7852 7.5752 15.1895 7.13574 15.1895 6.59082C15.1895 6.05469 14.7764 5.61523 14.1963 5.61523H12.0693C8.14941 5.61523 5.83789 7.93555 5.83789 11.4512Z" fill="#F2F2F2"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 971 B After Width: | Height: | Size: 948 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.9912 22.7422C18.9746 22.7422 23.0879 18.6289 23.0879 13.6543C23.0879 8.67969 18.9658 4.56641 13.9824 4.56641C9.00781 4.56641 4.90332 8.67969 4.90332 13.6543C4.90332 18.6289 9.0166 22.7422 13.9912 22.7422ZM13.9912 20.9316C9.95703 20.9316 6.73145 17.6885 6.73145 13.6543C6.73145 9.62012 9.95703 6.38574 13.9824 6.38574C18.0166 6.38574 21.2598 9.62012 21.2686 13.6543C21.2773 17.6885 18.0254 20.9316 13.9912 20.9316ZM14 17.0996C15.9072 17.0996 17.4453 15.5615 17.4453 13.6455C17.4453 11.7471 15.9072 10.2002 14 10.2002C12.084 10.2002 10.5459 11.7471 10.5459 13.6455C10.5459 15.5615 12.084 17.0996 14 17.0996Z" fill="#fff"/>
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.9912 22.7422C18.9746 22.7422 23.0879 18.6289 23.0879 13.6543C23.0879 8.67969 18.9658 4.56641 13.9824 4.56641C9.00781 4.56641 4.90332 8.67969 4.90332 13.6543C4.90332 18.6289 9.0166 22.7422 13.9912 22.7422ZM13.9912 20.9316C9.95703 20.9316 6.73145 17.6885 6.73145 13.6543C6.73145 9.62012 9.95703 6.38574 13.9824 6.38574C18.0166 6.38574 21.2598 9.62012 21.2686 13.6543C21.2773 17.6885 18.0254 20.9316 13.9912 20.9316ZM14 17.0996C15.9072 17.0996 17.4453 15.5615 17.4453 13.6455C17.4453 11.7471 15.9072 10.2002 14 10.2002C12.084 10.2002 10.5459 11.7471 10.5459 13.6455C10.5459 15.5615 12.084 17.0996 14 17.0996Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 737 B After Width: | Height: | Size: 722 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5.69434 13.6455C5.69434 13.9092 5.80859 14.1641 6.01074 14.3574L11.8027 20.1494C12.0137 20.3516 12.251 20.4482 12.4883 20.4482C13.042 20.4482 13.4375 20.0527 13.4375 19.5254C13.4375 19.2529 13.332 19.0156 13.1562 18.8486L11.1875 16.8535L8.58594 14.4805L10.6426 14.6035H21.3301C21.9014 14.6035 22.3057 14.208 22.3057 13.6455C22.3057 13.0742 21.9014 12.6875 21.3301 12.6875H10.6426L8.59473 12.8105L11.1875 10.4375L13.1562 8.44238C13.332 8.2666 13.4375 8.0293 13.4375 7.75684C13.4375 7.22949 13.042 6.84277 12.4883 6.84277C12.251 6.84277 12.0137 6.93066 11.7852 7.15039L6.01074 12.9336C5.80859 13.1182 5.69434 13.3818 5.69434 13.6455Z" fill="#F2F2F2"/>
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5.69434 13.6455C5.69434 13.9092 5.80859 14.1641 6.01074 14.3574L11.8027 20.1494C12.0137 20.3516 12.251 20.4482 12.4883 20.4482C13.042 20.4482 13.4375 20.0527 13.4375 19.5254C13.4375 19.2529 13.332 19.0156 13.1562 18.8486L11.1875 16.8535L8.58594 14.4805L10.6426 14.6035H21.3301C21.9014 14.6035 22.3057 14.208 22.3057 13.6455C22.3057 13.0742 21.9014 12.6875 21.3301 12.6875H10.6426L8.59473 12.8105L11.1875 10.4375L13.1562 8.44238C13.332 8.2666 13.4375 8.0293 13.4375 7.75684C13.4375 7.22949 13.042 6.84277 12.4883 6.84277C12.251 6.84277 12.0137 6.93066 11.7852 7.15039L6.01074 12.9336C5.80859 13.1182 5.69434 13.3818 5.69434 13.6455Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 763 B After Width: | Height: | Size: 745 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14 13.8477C16.127 13.8477 17.8496 11.9668 17.8496 9.66406C17.8496 7.39648 16.127 5.59473 14 5.59473C11.8818 5.59473 10.1416 7.42285 10.1504 9.68164C10.1592 11.9756 11.873 13.8477 14 13.8477ZM14 12.3096C12.7871 12.3096 11.7588 11.1582 11.7588 9.68164C11.75 8.24023 12.7783 7.13281 14 7.13281C15.2305 7.13281 16.2412 8.22266 16.2412 9.66406C16.2412 11.1406 15.2217 12.3096 14 12.3096ZM8.51562 22.0215H19.4756C20.9961 22.0215 21.7256 21.5381 21.7256 20.501C21.7256 18.084 18.7109 14.8672 14 14.8672C9.28906 14.8672 6.26562 18.084 6.26562 20.501C6.26562 21.5381 6.99512 22.0215 8.51562 22.0215ZM8.24316 20.4834C8.03223 20.4834 7.95312 20.4131 7.95312 20.2549C7.95312 18.9102 10.124 16.4053 14 16.4053C17.8672 16.4053 20.0381 18.9102 20.0381 20.2549C20.0381 20.4131 19.959 20.4834 19.748 20.4834H8.24316Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 936 B After Width: | Height: | Size: 913 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.10515 24.5753H21.6977C23.0148 24.5753 23.8007 23.9513 23.8007 22.9154C23.8007 19.9004 19.9776 15.7538 13.8955 15.7538C7.82523 15.7538 4 19.9004 4 22.9154C4 23.9513 4.78797 24.5753 6.10515 24.5753ZM13.9052 13.6731C16.4594 13.6731 18.6327 11.4019 18.6327 8.46591C18.6327 5.58403 16.453 3.39099 13.9052 3.39099C11.3573 3.39099 9.17547 5.62458 9.17969 8.48724C9.1818 11.4019 11.3434 13.6731 13.9052 13.6731Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 542 B After Width: | Height: | Size: 519 B |
3
src/assets/icons/bookmark.fill.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7.50374 26.7058C8.13702 26.7058 8.53803 26.3755 9.5421 25.3961L14.0693 20.9202C14.1258 20.8637 14.2249 20.8637 14.2718 20.9202L18.8011 25.3982C19.8073 26.3776 20.2019 26.7058 20.8373 26.7058C21.768 26.7058 22.3411 26.0783 22.3411 25.0272V4.58848C22.3411 2.26489 21.1308 1.03748 18.8285 1.03748H9.51257C7.2082 1.03748 6 2.26489 6 4.58848V25.0272C6 26.0783 6.57304 26.7058 7.50374 26.7058Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 501 B |
3
src/assets/icons/bookmark.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7.50374 26.7058C8.13702 26.7058 8.53803 26.3755 9.5421 25.3961L14.0693 20.9202C14.1258 20.8637 14.2249 20.8637 14.2718 20.9202L18.8011 25.3982C19.8073 26.3776 20.2019 26.7058 20.8373 26.7058C21.768 26.7058 22.3411 26.0783 22.3411 25.0272V4.58848C22.3411 2.26489 21.1308 1.03748 18.8285 1.03748H9.51257C7.2082 1.03748 6 2.26489 6 4.58848V25.0272C6 26.0783 6.57304 26.7058 7.50374 26.7058ZM8.61444 22.9047C8.45459 23.0645 8.27131 23.0134 8.27131 22.7875V4.71317C8.27131 3.77707 8.7417 3.30879 9.69491 3.30879H18.6558C19.5994 3.30879 20.0698 3.77707 20.0698 4.71317V22.7875C20.0698 23.0134 19.894 23.0645 19.7266 22.9047L14.9351 18.2591C14.4483 17.7904 13.8928 17.7904 13.406 18.2591L8.61444 22.9047Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 811 B |
3
src/assets/icons/calendar.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5.84421 24.8972H21.968C24.4974 24.8972 25.8026 23.5919 25.8026 21.0914V6.82921C25.8026 4.32656 24.4974 3.02344 21.968 3.02344H5.84421C3.31484 3.02344 2 4.31695 2 6.82921V21.0914C2 23.6016 3.31484 24.8972 5.84421 24.8972ZM5.81186 22.6013C4.82795 22.6013 4.29592 22.0969 4.29592 21.0661V10.2389C4.29592 9.21772 4.82795 8.70585 5.81186 8.70585H21.9812C22.9651 8.70585 23.5067 9.21772 23.5067 10.2389V21.0661C23.5067 22.0969 22.9651 22.6013 21.9812 22.6013H5.81186ZM11.6516 12.7673H12.343C12.7594 12.7673 12.8947 12.6438 12.8947 12.2273V11.5359C12.8947 11.1194 12.7594 10.9863 12.343 10.9863H11.6516C11.2351 10.9863 11.0902 11.1194 11.0902 11.5359V12.2273C11.0902 12.6438 11.2351 12.7673 11.6516 12.7673ZM15.481 12.7673H16.1724C16.5889 12.7673 16.7359 12.6438 16.7359 12.2273V11.5359C16.7359 11.1194 16.5889 10.9863 16.1724 10.9863H15.481C15.0645 10.9863 14.9197 11.1194 14.9197 11.5359V12.2273C14.9197 12.6438 15.0645 12.7673 15.481 12.7673ZM19.3126 12.7673H20.004C20.4205 12.7673 20.5653 12.6438 20.5653 12.2273V11.5359C20.5653 11.1194 20.4205 10.9863 20.004 10.9863H19.3126C18.8961 10.9863 18.7609 11.1194 18.7609 11.5359V12.2273C18.7609 12.6438 18.8961 12.7673 19.3126 12.7673ZM7.8221 16.5382H8.50178C8.92999 16.5382 9.06522 16.4147 9.06522 15.9982V15.3068C9.06522 14.8903 8.92999 14.7668 8.50178 14.7668H7.8221C7.39389 14.7668 7.25866 14.8903 7.25866 15.3068V15.9982C7.25866 16.4147 7.39389 16.5382 7.8221 16.5382ZM11.6516 16.5382H12.343C12.7594 16.5382 12.8947 16.4147 12.8947 15.9982V15.3068C12.8947 14.8903 12.7594 14.7668 12.343 14.7668H11.6516C11.2351 14.7668 11.0902 14.8903 11.0902 15.3068V15.9982C11.0902 16.4147 11.2351 16.5382 11.6516 16.5382ZM15.481 16.5382H16.1724C16.5889 16.5382 16.7359 16.4147 16.7359 15.9982V15.3068C16.7359 14.8903 16.5889 14.7668 16.1724 14.7668H15.481C15.0645 14.7668 14.9197 14.8903 14.9197 15.3068V15.9982C14.9197 16.4147 15.0645 16.5382 15.481 16.5382ZM19.3126 16.5382H20.004C20.4205 16.5382 20.5653 16.4147 20.5653 15.9982V15.3068C20.5653 14.8903 20.4205 14.7668 20.004 14.7668H19.3126C18.8961 14.7668 18.7609 14.8903 18.7609 15.3068V15.9982C18.7609 16.4147 18.8961 16.5382 19.3126 16.5382ZM7.8221 20.3187H8.50178C8.92999 20.3187 9.06522 20.1877 9.06522 19.7691V19.0798C9.06522 18.6612 8.92999 18.5398 8.50178 18.5398H7.8221C7.39389 18.5398 7.25866 18.6612 7.25866 19.0798V19.7691C7.25866 20.1877 7.39389 20.3187 7.8221 20.3187ZM11.6516 20.3187H12.343C12.7594 20.3187 12.8947 20.1877 12.8947 19.7691V19.0798C12.8947 18.6612 12.7594 18.5398 12.343 18.5398H11.6516C11.2351 18.5398 11.0902 18.6612 11.0902 19.0798V19.7691C11.0902 20.1877 11.2351 20.3187 11.6516 20.3187ZM15.481 20.3187H16.1724C16.5889 20.3187 16.7359 20.1877 16.7359 19.7691V19.0798C16.7359 18.6612 16.5889 18.5398 16.1724 18.5398H15.481C15.0645 18.5398 14.9197 18.6612 14.9197 19.0798V19.7691C14.9197 20.1877 15.0645 20.3187 15.481 20.3187Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
4
src/assets/icons/chart.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M3.10561 6.47363L1.47132 8.0962L6.75179 13.4597C7.3246 14.0367 7.84843 14.2774 8.43296 14.2774C9.0196 14.2774 9.57108 14.025 10.1162 13.4597L14.3022 9.13026C14.4034 9.0269 14.5206 8.97041 14.6101 8.97041C14.7093 8.97041 14.8265 9.0269 14.9277 9.12815L19.4795 13.766L17.6535 15.5962C17.1494 16.0983 17.4515 16.7766 18.1588 16.9605L25.0438 18.7181C25.6787 18.8883 26.2551 18.3354 26.0849 17.6887L24.321 10.792C24.1391 10.0868 23.447 9.78675 22.945 10.2888L21.1096 12.1359L16.2988 7.29745C15.7398 6.73636 15.2022 6.47972 14.608 6.47972C14.0214 6.47972 13.4603 6.73425 12.9248 7.29956L8.73882 11.6247C8.63757 11.7302 8.52999 11.7867 8.43085 11.7867C8.3296 11.7867 8.22413 11.7281 8.12288 11.6247L3.10561 6.47363Z" fill="currentColor"/>
|
||||
<path d="M1 24.2688C1 24.8714 1.40242 25.2642 2.00711 25.2642H25.476C26.1182 25.2642 26.6383 24.7781 26.6383 24.1221C26.6383 23.4757 26.1182 22.9779 25.476 22.9779H3.61983C3.38428 22.9779 3.29592 22.8895 3.29592 22.654V4.21946C3.29592 3.58688 2.80022 3.0647 2.15382 3.0647C1.49781 3.0647 1 3.58688 1 4.21946V24.2688Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -1,4 +1,4 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M9.96582 22.7686H18.043C19.3965 22.7686 20.2666 21.9512 20.3369 20.5977L20.9258 7.94141H21.8926C22.3408 7.94141 22.6836 7.58984 22.6836 7.15039C22.6836 6.71094 22.332 6.37695 21.8926 6.37695H17.9902V5.05859C17.9902 3.70508 17.1289 2.91406 15.6611 2.91406H12.3213C10.8535 2.91406 9.99219 3.70508 9.99219 5.05859V6.37695H6.10742C5.66797 6.37695 5.31641 6.71973 5.31641 7.15039C5.31641 7.59863 5.66797 7.94141 6.10742 7.94141H7.07422L7.66309 20.5977C7.7334 21.96 8.59473 22.7686 9.96582 22.7686ZM11.6357 5.1377C11.6357 4.68945 11.9521 4.39941 12.4355 4.39941H15.5469C16.0303 4.39941 16.3467 4.68945 16.3467 5.1377V6.37695H11.6357V5.1377ZM10.1416 21.1953C9.6582 21.1953 9.30664 20.835 9.28027 20.3164L8.69141 7.94141H19.2822L18.7109 20.3164C18.6934 20.8438 18.3506 21.1953 17.8496 21.1953H10.1416ZM11.4072 19.7803C11.7852 19.7803 12.0225 19.543 12.0137 19.1914L11.75 9.99805C11.7412 9.64648 11.4951 9.41797 11.1348 9.41797C10.7656 9.41797 10.5283 9.65527 10.5371 10.0068L10.8008 19.2002C10.8096 19.5518 11.0557 19.7803 11.4072 19.7803ZM14 19.7803C14.3691 19.7803 14.624 19.5518 14.624 19.2002V10.0068C14.624 9.65527 14.3691 9.41797 14 9.41797C13.6309 9.41797 13.3848 9.65527 13.3848 10.0068V19.2002C13.3848 19.5518 13.6309 19.7803 14 19.7803ZM16.5928 19.7891C16.9443 19.7891 17.1904 19.5518 17.1992 19.2002L17.4629 10.0068C17.4717 9.65527 17.2344 9.42676 16.8652 9.42676C16.5049 9.42676 16.2588 9.65527 16.25 10.0068L15.9863 19.2002C15.9775 19.543 16.2148 19.7891 16.5928 19.7891Z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
4
src/assets/icons/explicit.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M3.84421 21.8972H18.0295C20.5685 21.8972 21.8737 20.5919 21.8737 18.0914V3.82921C21.8737 1.32656 20.5685 0.0234375 18.0295 0.0234375H3.84421C1.31484 0.0234375 0 1.31695 0 3.82921V18.0914C0 20.6016 1.31484 21.8972 3.84421 21.8972Z" fill="#aeaeaf"/>
|
||||
<path d="M8.24921 16.3608C7.44976 16.3608 7.04688 15.8618 7.04688 15.0368V6.67026C7.04688 5.84948 7.45187 5.34839 8.24921 5.34839H13.795C14.3777 5.34839 14.7607 5.68026 14.7607 6.26643C14.7607 6.8376 14.3777 7.19619 13.795 7.19619H9.33695V9.92808H13.5377C14.0824 9.92808 14.4464 10.2356 14.4464 10.7923C14.4464 11.3222 14.0824 11.6255 13.5377 11.6255H9.33695V14.513H13.795C14.3777 14.513 14.7607 14.8545 14.7607 15.4406C14.7607 16.0118 14.3777 16.3608 13.795 16.3608H8.24921Z" fill="#111111"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 831 B |
4
src/assets/icons/eye.slash.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg viewBox="0 0 33 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M16.1039 24.2276C18.2667 24.2276 20.2462 23.8513 22.0458 23.2428L20.1795 21.3723C18.9009 21.7511 17.5488 21.9793 16.1039 21.9793C8.60694 21.9793 2.65404 15.7188 2.65404 14.0854C2.65404 13.2989 4.65326 10.7519 7.8614 8.78101L6.10032 7.02204C2.26547 9.45297 0 12.6801 0 14.0854C0 16.4824 6.62578 24.2276 16.1039 24.2276ZM16.1039 3.94751C14.0627 3.94751 12.2027 4.29696 10.4822 4.86696L12.3581 6.73539C13.5459 6.39296 14.771 6.19562 16.1039 6.19562C23.5913 6.19562 29.5463 12.7162 29.5463 14.0854C29.5463 15.0029 27.6516 17.3973 24.6312 19.2925L26.37 21.0376C30.0415 18.6163 32.2003 15.4619 32.2003 14.0854C32.2003 11.6831 25.7119 3.94751 16.1039 3.94751ZM16.1039 20.4032C17.0128 20.4032 17.8695 20.1833 18.6375 19.8247L10.3399 11.5272C9.9696 12.2931 9.76147 13.1593 9.76147 14.0875C9.77108 17.5246 12.5794 20.4032 16.1039 20.4032ZM21.9532 16.3501C22.2638 15.6536 22.4313 14.8801 22.4313 14.0833C22.4313 10.5609 19.6134 7.77179 16.106 7.77179C15.292 7.77179 14.5282 7.93937 13.8316 8.22859L21.9532 16.3501Z" fill="currentColor"/>
|
||||
<path d="M25.3391 24.4257C25.7033 24.7996 26.2869 24.8188 26.6586 24.4257C27.0496 24.0327 27.0207 23.48 26.6586 23.1062L6.81388 3.27316C6.44967 2.90895 5.85435 2.90895 5.48264 3.27316C5.13014 3.62566 5.13014 4.2423 5.48264 4.59269L25.3391 24.4257Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
3
src/assets/icons/eye.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 33 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M16.1039 24.3001C25.7119 24.3001 32.2003 16.555 32.2003 14.158C32.2003 11.7557 25.7023 4.02014 16.1039 4.02014C6.63539 4.02014 0 11.7557 0 14.158C0 16.555 6.62578 24.3001 16.1039 24.3001ZM16.1039 22.052C8.60694 22.052 2.65404 15.7914 2.65404 14.158C2.65404 12.7888 8.60694 6.26825 16.1039 6.26825C23.572 6.26825 29.5463 12.7888 29.5463 14.158C29.5463 15.7914 23.572 22.052 16.1039 22.052ZM16.106 20.4759C19.6177 20.4759 22.4313 17.5973 22.4313 14.158C22.4313 10.6335 19.6177 7.84654 16.106 7.84654C12.5794 7.84654 9.75186 10.6314 9.76147 14.158C9.78069 17.5973 12.5794 20.4759 16.106 20.4759ZM16.1018 16.2048C14.9632 16.2048 14.0442 15.2774 14.0442 14.158C14.0442 13.029 14.9632 12.1154 16.1018 12.1154C17.2371 12.1154 18.1582 13.029 18.1582 14.158C18.1582 15.2774 17.2371 16.2048 16.1018 16.2048Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 910 B |
3
src/assets/icons/file.fill.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7.80577 26.3655H20.2891C22.8013 26.3655 24.0948 25.0506 24.0948 22.5287V12.0379H15.3341C13.8679 12.0379 13.1552 11.3251 13.1552 9.85679V1H7.80577C5.30523 1 4 2.32445 4 4.84632V22.5287C4 25.0602 5.29562 26.3655 7.80577 26.3655ZM15.5423 10.3248H23.9669C23.905 9.80008 23.5166 9.29336 22.9077 8.67273L16.5098 2.17656C15.921 1.58031 15.4026 1.19406 14.8682 1.12047V9.66039C14.8682 10.1034 15.0897 10.3248 15.5423 10.3248Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 531 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7 5.6875C5.55231 5.6875 4.375 6.86481 4.375 8.3125V19.6875C4.375 21.1352 5.55231 22.3125 7 22.3125H21C22.4477 22.3125 23.625 21.1352 23.625 19.6875V10.0625C23.625 8.61481 22.4477 7.4375 21 7.4375H12.7328C12.3369 7.4375 11.9492 7.30146 11.6407 7.05383L10.8914 6.45483C10.2732 5.96046 9.49659 5.6875 8.70471 5.6875H7ZM7 7.4375H8.70471C9.10065 7.4375 9.48873 7.57354 9.79761 7.82117L10.5461 8.42017C11.1643 8.91454 11.9409 9.1875 12.7328 9.1875H21C21.4826 9.1875 21.875 9.57994 21.875 10.0625V10.5H6.125V8.3125C6.125 7.82994 6.51744 7.4375 7 7.4375ZM6.125 12.25H21.875V19.6875C21.875 20.1701 21.4826 20.5625 21 20.5625H7C6.51744 20.5625 6.125 20.1701 6.125 19.6875V12.25ZM15.8705 13.3634L13.8214 13.7787C13.6705 13.8093 13.5625 13.9347 13.5625 14.0795V17.1086C13.5625 17.2556 13.4371 17.3717 13.025 17.4513C12.3867 17.5751 11.8125 17.8221 11.8125 18.5903C11.8125 18.9701 12.1575 19.4551 13.025 19.4551C13.7806 19.4551 14.4375 18.8381 14.4375 17.9631V15.6073C14.4375 15.5106 14.509 15.4271 14.6101 15.4065L15.9286 15.1382C16.0795 15.1076 16.1875 14.9822 16.1875 14.8374V13.6035C16.1875 13.4469 16.0337 13.3302 15.8705 13.3634Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M21.1807 6.99219H13.0332C12.4004 6.99219 12.0225 6.85156 11.5303 6.44727L11.0381 6.04297C10.4141 5.5332 9.95703 5.36621 9.03418 5.36621H6.54688C4.89453 5.36621 3.91895 6.33301 3.91895 8.1875V10.6484H24.0723V9.85742C24.0723 7.97656 23.0791 6.99219 21.1807 6.99219ZM6.81055 21.7666H21.3916C23.0879 21.7666 24.0723 20.7822 24.0723 18.9014V11.9141H3.91895V18.9014C3.91895 20.791 4.91211 21.7666 6.81055 21.7666Z" fill="#F2F2F2"/>
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M21.1807 6.99219H13.0332C12.4004 6.99219 12.0225 6.85156 11.5303 6.44727L11.0381 6.04297C10.4141 5.5332 9.95703 5.36621 9.03418 5.36621H6.54688C4.89453 5.36621 3.91895 6.33301 3.91895 8.1875V10.6484H24.0723V9.85742C24.0723 7.97656 23.0791 6.99219 21.1807 6.99219ZM6.81055 21.7666H21.3916C23.0879 21.7666 24.0723 20.7822 24.0723 18.9014V11.9141H3.91895V18.9014C3.91895 20.791 4.91211 21.7666 6.81055 21.7666Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 538 B After Width: | Height: | Size: 520 B |
3
src/assets/icons/folder.nopad.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 27 23" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M3.84421 21.825H23.3062C25.541 21.825 26.8558 20.5198 26.8558 18.0192V5.96718C26.8558 3.46664 25.5314 2.16141 23.0116 2.16141H12.1076C11.2706 2.16141 10.7627 1.96758 10.1219 1.43625L9.44928 0.892499C8.62944 0.217265 8.02335 0 6.79569 0H3.47905C1.29539 0 0 1.27523 0 3.73405V18.0192C0 20.5294 1.31484 21.825 3.84421 21.825ZM3.97733 19.5291C2.88772 19.5291 2.29592 18.967 2.29592 17.8263V3.93233C2.29592 2.85655 2.88209 2.28631 3.93538 2.28631H6.195C7.01273 2.28631 7.50468 2.48764 8.15929 3.02108L8.82984 3.57444C9.64429 4.23256 10.2696 4.45944 11.4973 4.45944H22.8689C23.9489 4.45944 24.5599 5.03108 24.5599 6.16968V17.8359C24.5599 18.967 23.9489 19.5291 22.8689 19.5291H3.97733ZM1.43319 8.87716H25.432V6.85241H1.43319V8.87716Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 840 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.81055 21.7666H21.3916C23.0879 21.7666 24.0723 20.7822 24.0723 18.9014V9.85742C24.0723 7.97656 23.0791 6.99219 21.1807 6.99219H13.0332C12.4004 6.99219 12.0225 6.85156 11.5303 6.44727L11.0381 6.04297C10.4141 5.5332 9.95703 5.36621 9.03418 5.36621H6.54688C4.89453 5.36621 3.91895 6.33301 3.91895 8.1875V18.9014C3.91895 20.791 4.91211 21.7666 6.81055 21.7666ZM5.66797 8.33691C5.66797 7.53711 6.11621 7.11523 6.89844 7.11523H8.56836C9.19238 7.11523 9.56152 7.26465 10.0625 7.66895L10.5547 8.08203C11.1699 8.57422 11.6445 8.75 12.5674 8.75H21.0664C21.875 8.75 22.3232 9.17188 22.3232 10.0156V10.5342H5.66797V8.33691ZM6.9248 20.0176C6.11621 20.0176 5.66797 19.5957 5.66797 18.7432V12.0723H22.3232V18.752C22.3232 19.5957 21.875 20.0176 21.0664 20.0176H6.9248Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 898 B After Width: | Height: | Size: 875 B |
3
src/assets/icons/headphones.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M2 14.0029C2 17.5576 3.03008 21.4841 4.76539 24.5308C5.10476 25.1148 5.7589 25.285 6.36851 24.9477C6.94717 24.6318 7.11311 23.9755 6.76413 23.3425C5.20647 20.5042 4.336 17.132 4.336 14.0029C4.336 7.60233 8.2496 3.336 14.1259 3.336C19.9946 3.336 23.9157 7.60233 23.9157 14.0029C23.9157 17.132 23.0356 20.5042 21.478 23.3425C21.129 23.9755 21.2949 24.6318 21.8736 24.9477C22.4832 25.285 23.1469 25.1148 23.4767 24.5308C25.212 21.4841 26.2517 17.5576 26.2517 14.0029C26.2517 6.1907 21.4137 1 14.1259 1C6.82836 1 2 6.1907 2 14.0029ZM5.9485 24.2188C6.36686 25.6108 7.57225 26.2424 8.97803 25.8262C10.3721 25.4036 11.0155 24.1811 10.5854 22.787L8.90115 17.2223C8.4828 15.8399 7.27952 15.1966 5.87374 15.6128C4.47968 16.0429 3.83632 17.2579 4.2664 18.6637L5.9485 24.2188ZM22.2936 24.2188L23.9757 18.6637C24.4058 17.2483 23.772 16.0429 22.3684 15.6128C20.9626 15.1966 19.7689 15.8399 19.3409 17.2223L17.6567 22.787C17.2266 24.1907 17.87 25.4036 19.2641 25.8262C20.6795 26.2424 21.8752 25.6108 22.2936 24.2188Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" fill="currentColor" height="28" viewBox="0 0 28 28" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg fill="currentColor" viewBox="0 0 28 28" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5.09668 11.1846C5.09668 14.9375 8.25195 18.6465 13.1562 21.8105C13.4287 21.9863 13.7627 22.1621 13.9912 22.1621C14.2197 22.1621 14.5537 21.9863 14.8262 21.8105C19.7393 18.6465 22.8857 14.9375 22.8857 11.1846C22.8857 7.94141 20.6445 5.69141 17.7705 5.69141C16.0918 5.69141 14.7822 6.45605 13.9912 7.61621C13.2178 6.46484 11.8994 5.69141 10.2207 5.69141C7.33789 5.69141 5.09668 7.94141 5.09668 11.1846ZM6.90723 11.1758C6.90723 8.96094 8.36621 7.45801 10.3262 7.45801C11.9082 7.45801 12.7959 8.41602 13.3496 9.25098C13.5957 9.61133 13.7627 9.72559 13.9912 9.72559C14.2285 9.72559 14.3779 9.60254 14.6328 9.25098C15.2305 8.43359 16.083 7.45801 17.6562 7.45801C19.625 7.45801 21.084 8.96094 21.084 11.1758C21.084 14.2695 17.8672 17.6973 14.1582 20.1582C14.0791 20.2109 14.0264 20.2461 13.9912 20.2461C13.9561 20.2461 13.9033 20.2109 13.833 20.1582C10.124 17.6973 6.90723 14.2695 6.90723 11.1758Z" />
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1016 B After Width: | Height: | Size: 993 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.9912 22.1445C14.2197 22.1445 14.5449 21.9775 14.8086 21.8105C19.7217 18.6465 22.8682 14.9375 22.8682 11.1758C22.8682 7.9502 20.6445 5.7002 17.8408 5.7002C16.0918 5.7002 14.7822 6.66699 13.9912 8.11719C13.2178 6.67578 11.8994 5.7002 10.1504 5.7002C7.34668 5.7002 5.11426 7.9502 5.11426 11.1758C5.11426 14.9375 8.26074 18.6465 13.1738 21.8105C13.4463 21.9775 13.7715 22.1445 13.9912 22.1445Z"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 517 B After Width: | Height: | Size: 494 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" fill="currentColor" height="28" viewBox="0 0 28 28" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg fill="currentColor" viewBox="0 0 28 28" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5.09668 11.1846C5.09668 14.9375 8.25195 18.6465 13.1562 21.8105C13.4287 21.9863 13.7627 22.1621 13.9912 22.1621C14.2197 22.1621 14.5537 21.9863 14.8262 21.8105C19.7393 18.6465 22.8857 14.9375 22.8857 11.1846C22.8857 7.94141 20.6445 5.69141 17.7705 5.69141C16.0918 5.69141 14.7822 6.45605 13.9912 7.61621C13.2178 6.46484 11.8994 5.69141 10.2207 5.69141C7.33789 5.69141 5.09668 7.94141 5.09668 11.1846ZM6.90723 11.1758C6.90723 8.96094 8.36621 7.45801 10.3262 7.45801C11.9082 7.45801 12.7959 8.41602 13.3496 9.25098C13.5957 9.61133 13.7627 9.72559 13.9912 9.72559C14.2285 9.72559 14.3779 9.60254 14.6328 9.25098C15.2305 8.43359 16.083 7.45801 17.6562 7.45801C19.625 7.45801 21.084 8.96094 21.084 11.1758C21.084 14.2695 17.8672 17.6973 14.1582 20.1582C14.0791 20.2109 14.0264 20.2461 13.9912 20.2461C13.9561 20.2461 13.9033 20.2109 13.833 20.1582C10.124 17.6973 6.90723 14.2695 6.90723 11.1758Z" />
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1016 B After Width: | Height: | Size: 993 B |
3
src/assets/icons/hifi.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5 5.55171V23.1659C5 25.501 6.20703 26.7176 8.52288 26.7176H20.078C22.3939 26.7176 23.5892 25.501 23.5892 23.1659V5.55171C23.5892 3.21664 22.3939 2 20.078 2H8.52288C6.20703 2 5 3.21664 5 5.55171ZM7.29592 5.68483C7.29592 4.7703 7.75975 4.29592 8.69444 4.29592H19.9044C20.8391 4.29592 21.2933 4.7703 21.2933 5.68483V23.0328C21.2933 23.9377 20.8294 24.4217 19.9044 24.4217H8.69444C7.75975 24.4217 7.29592 23.9377 7.29592 23.0328V5.68483ZM14.3005 22.6447C16.9215 22.6447 19.0332 20.5447 19.0332 17.9141C19.0332 15.2771 16.9215 13.1909 14.3005 13.1813C11.6794 13.1675 9.56772 15.2771 9.56772 17.9141C9.56772 20.5447 11.6794 22.6447 14.3005 22.6447ZM14.3005 19.8043C13.261 19.8043 12.406 18.961 12.406 17.9141C12.406 16.8277 13.2301 16.0079 14.3005 16.0079C15.3591 16.0079 16.1928 16.8277 16.1928 17.9141C16.1928 18.961 15.3591 19.8043 14.3005 19.8043ZM14.2984 11.4596C15.7927 11.4596 17.0283 10.257 17.0049 8.75303C16.9932 7.24905 15.7927 6.0678 14.2984 6.05397C12.7944 6.04436 11.5939 7.23944 11.5939 8.75303C11.5939 10.257 12.7944 11.4596 14.2984 11.4596ZM14.3005 10.0069C13.5978 10.0069 13.0465 9.43436 13.0465 8.75303C13.0465 8.02694 13.5978 7.49701 14.3005 7.49701C14.9797 7.49701 15.5544 8.05787 15.5544 8.75303C15.5544 9.43436 14.9914 10.0069 14.3005 10.0069Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M3.25098 13.2146C3.25098 13.6716 3.60254 14.0671 4.16504 14.0671C4.4375 14.0671 4.68359 13.9177 4.90332 13.7419L5.90527 12.8982V21.072C5.90527 22.3728 6.6875 23.1462 8.03223 23.1462H19.9238C21.2598 23.1462 22.0508 22.3728 22.0508 21.072V12.8542L23.1055 13.7419C23.3164 13.9177 23.5625 14.0671 23.835 14.0671C24.3535 14.0671 24.749 13.7419 24.749 13.2322C24.749 12.9333 24.6348 12.696 24.4062 12.5027L22.0508 10.5164V6.77222C22.0508 6.37671 21.7959 6.13062 21.4004 6.13062H20.1875C19.8008 6.13062 19.5371 6.37671 19.5371 6.77222V8.40698L15.2568 4.81226C14.4922 4.17065 13.5254 4.17065 12.7607 4.81226L3.60254 12.5027C3.36523 12.696 3.25098 12.9597 3.25098 13.2146ZM16.5312 15.6404C16.5312 15.2273 16.2676 14.9636 15.8545 14.9636H12.1631C11.75 14.9636 11.4775 15.2273 11.4775 15.6404V21.3972H8.49805C7.95312 21.3972 7.6543 21.0896 7.6543 20.5359V11.4304L13.6221 6.42065C13.8682 6.20972 14.1494 6.20972 14.3955 6.42065L20.293 11.3777V20.5359C20.293 21.0896 19.9941 21.3972 19.4492 21.3972H16.5312V15.6404Z" fill="#F2F2F2"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M26.5355 20.4111L19.5935 13.8974C19.0683 13.4286 18.4589 13.1771 17.8324 13.1771C17.19 13.1771 16.6137 13.3977 16.0788 13.876L10.7862 18.6062L8.62453 16.6555C8.13234 16.2123 7.59117 15.9896 7.04249 15.9896C6.50039 15.9896 6.02507 16.2006 5.53288 16.6438L1.11023 20.6075C1.16788 22.7666 2.17217 23.8932 4.11232 23.8932H23.1117C25.4627 23.8932 26.6346 22.6801 26.5355 20.4111ZM9.0785 14.1538C10.6134 14.1538 11.8788 12.8883 11.8788 11.3396C11.8788 9.80465 10.6134 8.52754 9.0785 8.52754C7.52975 8.52754 6.26436 9.80465 6.26436 11.3396C6.26436 12.8883 7.52975 14.1538 9.0785 14.1538ZM3.84421 24.8781H23.9109C26.4499 24.8781 27.7552 23.5824 27.7552 21.0819V6.81004C27.7552 4.30739 26.4499 3.00427 23.9109 3.00427H3.84421C1.31484 3.00427 0 4.30739 0 6.81004V21.0819C0 23.5824 1.31484 24.8781 3.84421 24.8781ZM3.97733 22.5821C2.88772 22.5821 2.29592 22.018 2.29592 20.8794V7.01043C2.29592 5.87183 2.88772 5.30019 3.97733 5.30019H23.7778C24.8578 5.30019 25.4592 5.87183 25.4592 7.01043V20.8794C25.4592 22.018 24.8578 22.5821 23.7778 22.5821H3.97733Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
4
src/assets/icons/index1.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M12.105 24.21C18.7369 24.21 24.2121 18.7273 24.2121 12.105C24.2121 5.47312 18.7273 0 12.0954 0C5.47523 0 0 5.47312 0 12.105C0 18.7273 5.48484 24.21 12.105 24.21ZM12.105 21.8255C6.71085 21.8255 2.39412 17.4991 2.39412 12.105C2.39412 6.71085 6.70124 2.38452 12.0954 2.38452C17.4895 2.38452 21.8276 6.71085 21.8276 12.105C21.8276 17.4991 17.4991 21.8255 12.105 21.8255Z" fill="currentColor"/>
|
||||
<path d="M12.7392 17.4328C13.4478 17.4328 13.872 16.9985 13.872 16.2073V7.98889C13.872 7.21851 13.4032 6.76124 12.646 6.76124C12.1428 6.76124 11.7727 6.89741 11.2172 7.27312L9.18593 8.64163C8.87328 8.86077 8.73828 9.07663 8.73828 9.42444C8.73828 9.85733 9.06172 10.2373 9.5021 10.2373C9.71281 10.2373 9.84476 10.2117 10.1417 10.0073L11.5416 9.08295H11.6396V16.2073C11.6396 16.9985 12.0596 17.4328 12.7392 17.4328Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 916 B |
@@ -1,4 +1,4 @@
|
||||
<svg width="30" height="30" viewBox="0 0 30 30" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 30 30" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15 1.875C7.75195 1.875 1.875 7.75195 1.875 15C1.875 22.248 7.75195 28.125 15 28.125C22.248 28.125 28.125 22.248 28.125 15C28.125 7.75195 22.248 1.875 15 1.875ZM15 25.8984C8.98242 25.8984 4.10156 21.0176 4.10156 15C4.10156 8.98242 8.98242 4.10156 15 4.10156C21.0176 4.10156 25.8984 8.98242 25.8984 15C25.8984 21.0176 21.0176 25.8984 15 25.8984Z" fill="currentColor"/>
|
||||
<path d="M13.5938 9.84375C13.5938 10.2167 13.7419 10.5744 14.0056 10.8381C14.2694 11.1018 14.627 11.25 15 11.25C15.373 11.25 15.7306 11.1018 15.9944 10.8381C16.2581 10.5744 16.4062 10.2167 16.4062 9.84375C16.4062 9.47079 16.2581 9.1131 15.9944 8.84938C15.7306 8.58566 15.373 8.4375 15 8.4375C14.627 8.4375 14.2694 8.58566 14.0056 8.84938C13.7419 9.1131 13.5938 9.47079 13.5938 9.84375V9.84375ZM15.7031 13.125H14.2969C14.168 13.125 14.0625 13.2305 14.0625 13.3594V21.3281C14.0625 21.457 14.168 21.5625 14.2969 21.5625H15.7031C15.832 21.5625 15.9375 21.457 15.9375 21.3281V13.3594C15.9375 13.2305 15.832 13.125 15.7031 13.125Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
11
src/assets/icons/lastfm.svg
Normal file
@@ -0,0 +1,11 @@
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
|
||||
<svg fill="currentColor" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
|
||||
|
||||
<g id="SVGRepo_bgCarrier" stroke-width="0"/>
|
||||
|
||||
<g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
|
||||
<g id="SVGRepo_iconCarrier"> <path d="M14.131 22.948l-1.172-3.193c0 0-1.912 2.131-4.771 2.131-2.537 0-4.333-2.203-4.333-5.729 0-4.511 2.276-6.125 4.515-6.125 3.224 0 4.245 2.089 5.125 4.772l1.161 3.667c1.161 3.561 3.365 6.421 9.713 6.421 4.548 0 7.631-1.391 7.631-5.068 0-2.968-1.697-4.511-4.844-5.244l-2.344-0.511c-1.624-0.371-2.104-1.032-2.104-2.131 0-1.249 0.985-1.984 2.604-1.984 1.767 0 2.704 0.661 2.865 2.24l3.661-0.444c-0.297-3.301-2.584-4.656-6.323-4.656-3.308 0-6.532 1.251-6.532 5.245 0 2.5 1.204 4.077 4.245 4.807l2.484 0.589c1.865 0.443 2.484 1.224 2.484 2.287 0 1.359-1.323 1.921-3.828 1.921-3.703 0-5.244-1.943-6.124-4.625l-1.204-3.667c-1.541-4.765-4.005-6.531-8.891-6.531-5.287-0.016-8.151 3.385-8.151 9.192 0 5.573 2.864 8.595 8.005 8.595 4.14 0 6.125-1.943 6.125-1.943z"/> </g>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
4
src/assets/icons/logout.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M3.80577 26.3655H16.2891C18.8013 26.3655 20.0948 25.0602 20.0948 22.5287V17.2516H17.7989V22.386C17.7989 23.4777 17.2369 24.0695 16.0983 24.0695H3.99866C2.85795 24.0695 2.29592 23.4777 2.29592 22.386V4.98905C2.29592 3.89733 2.85795 3.29592 3.99866 3.29592H16.0983C17.2369 3.29592 17.7989 3.89733 17.7989 4.98905V10.1287H20.0948V4.84632C20.0948 2.32445 18.8013 1 16.2891 1H3.80577C1.29562 1 0 2.32445 0 4.84632V22.5287C0 25.0602 1.29562 26.3655 3.80577 26.3655Z" fill="currentColor"/>
|
||||
<path d="M11.3524 14.7604H23.1619L24.907 14.6732L24.0476 15.4047L22.3001 17.0455C22.0894 17.2328 21.9787 17.5042 21.9787 17.7669C21.9787 18.3055 22.3629 18.7384 22.9108 18.7384C23.1907 18.7384 23.4014 18.632 23.6058 18.4351L27.3965 14.5016C27.671 14.223 27.7603 13.9614 27.7603 13.6806C27.7603 13.3902 27.671 13.1362 27.3965 12.8596L23.6058 8.92399C23.4014 8.72712 23.1907 8.6132 22.9108 8.6132C22.3629 8.6132 21.9787 9.03438 21.9787 9.57298C21.9787 9.84532 22.0894 10.1188 22.3001 10.3061L24.0476 11.9566L24.907 12.688L23.1619 12.5913H11.3524C10.7801 12.5913 10.2961 13.086 10.2961 13.6806C10.2961 14.2752 10.7801 14.7604 11.3524 14.7604Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -1,4 +1,4 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.39687 27.1131C9.04913 27.1131 9.53405 26.7937 10.3459 26.0807L14.3572 22.5294H21.4504C24.9784 22.5294 26.9547 20.503 26.9547 17.0251V7.93679C26.9547 4.45891 24.9784 2.4325 21.4504 2.4325H6.50218C2.97625 2.4325 1 4.4493 1 7.93679V17.0251C1 20.5126 3.02476 22.5294 6.42836 22.5294H6.9107V25.4181C6.9107 26.4533 7.45422 27.1131 8.39687 27.1131ZM8.96593 24.532V21.1863C8.96593 20.4986 8.67132 20.2335 8.01319 20.2335H6.56757C4.35225 20.2335 3.29592 19.1066 3.29592 16.9523V8.00007C3.29592 5.84569 4.35225 4.72842 6.56757 4.72842H21.3871C23.5928 4.72842 24.6588 5.84569 24.6588 8.00007V16.9523C24.6588 19.1066 23.5928 20.2335 21.3871 20.2335H14.2321C13.521 20.2335 13.1823 20.3484 12.6864 20.8497L8.96593 24.532Z" fill="currentColor"/>
|
||||
<path d="M8.2771 11.2555C8.2771 12.6189 9.13022 13.6523 10.4502 13.6523C10.9762 13.6523 11.4768 13.547 11.7878 13.1582H11.9174C11.5281 14.0908 10.6426 14.7372 9.78389 14.9491C9.37561 15.0578 9.23194 15.2495 9.23194 15.5329C9.23194 15.8427 9.4928 16.0804 9.83147 16.0804C11.0784 16.0804 13.4024 14.5982 13.4024 11.7334C13.4024 10.0933 12.3606 8.83142 10.776 8.83142C9.34444 8.83142 8.2771 9.8315 8.2771 11.2555ZM14.6327 11.2555C14.6327 12.6189 15.4837 13.6523 16.8058 13.6523C17.3317 13.6523 17.8302 13.547 18.1412 13.1582H18.273C17.8837 14.0908 16.9982 14.7372 16.1394 14.9491C15.7387 15.0578 15.5875 15.2495 15.5875 15.5329C15.5875 15.8427 15.8462 16.0804 16.1849 16.0804C17.4318 16.0804 19.7559 14.5982 19.7559 11.7334C19.7559 10.0933 18.7141 8.83142 17.1316 8.83142C15.6979 8.83142 14.6327 9.8315 14.6327 11.2555Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
3
src/assets/icons/mic.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5 12.6082C5 17.4276 8.21234 20.7368 12.8291 21.1729V23.5828H8.52569C7.9196 23.5828 7.41359 24.074 7.41359 24.6822C7.41359 25.2841 7.9196 25.77 8.52569 25.77H19.2732C19.8814 25.77 20.3874 25.2841 20.3874 24.6822C20.3874 24.074 19.8814 23.5828 19.2732 23.5828H14.9719V21.1729C19.5982 20.7368 22.801 17.4276 22.801 12.6082V10.2862C22.801 9.68015 22.313 9.20906 21.7027 9.20906C21.0945 9.20906 20.5927 9.68015 20.5927 10.2862V12.5294C20.5927 16.5234 17.8983 19.1487 13.9053 19.1487C9.90263 19.1487 7.20826 16.5234 7.20826 12.5294V10.2862C7.20826 9.68015 6.71608 9.20906 6.09616 9.20906C5.48586 9.20906 5 9.68015 5 10.2862V12.6082ZM9.42241 12.0935C9.42241 14.9091 11.2665 16.8855 13.9053 16.8855C16.5324 16.8855 18.3786 14.9091 18.3786 12.0935V4.78991C18.3786 1.97109 16.5324 0 13.9053 0C11.2665 0 9.42241 1.97109 9.42241 4.78991V12.0935ZM11.6391 12.1315V4.75406C11.6391 3.19053 12.5234 2.12788 13.9053 2.12788C15.2872 2.12788 16.1598 3.18631 16.1598 4.75406V12.1315C16.1598 13.6971 15.2872 14.7555 13.9053 14.7555C12.5234 14.7555 11.6391 13.6971 11.6391 12.1315Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
3
src/assets/icons/paintbrush.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 28 29" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M2.53691 26.8314C4.56988 28.8665 6.94784 28.8899 8.94987 26.8921C10.3446 25.4974 11.8097 22.2588 12.8986 20.9125L15.3357 23.3613C16.3151 24.3524 17.5158 24.3567 18.4697 23.3985L20.0067 21.8498C20.9649 20.8799 20.9585 19.7165 19.9695 18.7275L10.6526 9.39675C9.66143 8.40348 8.48628 8.39387 7.51644 9.36371L5.98152 10.9082C5.02129 11.8685 5.01379 13.049 6.00918 14.0423L8.45371 16.4793C7.11918 17.5682 3.88058 19.0258 2.48793 20.4185C0.490115 22.4205 0.501833 24.8081 2.53691 26.8314ZM7.86565 12.179L8.7769 11.2849C9.04151 11.0224 9.32956 11.0106 9.59417 11.2753L18.0985 19.7699C18.3535 20.0346 18.3535 20.3247 18.0792 20.5989L17.1968 21.491C16.9301 21.7769 16.6249 21.7865 16.3561 21.5006L13.5427 18.6775C13.0648 18.1975 12.4306 18.2444 11.8878 18.7734C10.9737 19.6736 9.383 23.5038 7.51339 25.3596C6.44112 26.4414 5.14714 26.4393 4.03221 25.3361C2.93862 24.2308 2.92479 22.923 4.00666 21.8507C5.87627 19.9971 9.70432 18.4042 10.6067 17.4881C11.1239 16.9378 11.1804 16.3035 10.7004 15.8332L7.86565 13.0059C7.59893 12.7413 7.59893 12.4457 7.86565 12.179ZM5.74503 25.0429C6.51448 25.0429 7.13581 24.412 7.13581 23.6446C7.13581 22.8773 6.51448 22.256 5.74503 22.256C4.97768 22.256 4.34674 22.8773 4.34674 23.6446C4.34674 24.412 4.97768 25.0429 5.74503 25.0429ZM19.6507 20.1238L25.3142 14.4625C26.6719 13.1027 26.6442 11.466 25.2514 10.071L16.0395 0.845349C14.7078 -0.486366 12.4632 0.0552723 12.0043 2.07511C10.8722 6.96979 10.8612 7.36987 9.02605 9.93464L10.5741 11.4785C12.7514 8.67885 12.8764 7.35159 13.9971 3.22283C14.1305 2.70111 14.5594 2.56564 14.9114 2.90807L23.6128 11.5999C24.0992 12.0862 24.0971 12.6433 23.6501 13.0924L18.1357 18.6089L19.6507 20.1238ZM17.7654 13.2839C18.3844 13.9049 21.8084 12.0065 22.9899 10.5182L20.4139 7.95182C20.1912 10.026 19.1131 11.526 17.8006 12.8385C17.6482 12.9909 17.6599 13.1805 17.7654 13.2839Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
4
src/assets/icons/pencil.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M3.42607 18.5857L16.593 5.42412L14.344 3.16546L1.1674 16.3366L0.0267015 19.0816C-0.10197 19.4303 0.258496 19.8049 0.592479 19.6708L3.42607 18.5857ZM17.715 4.32139L18.9829 3.07476C19.6122 2.44546 19.6378 1.7482 19.0703 1.16906L18.6128 0.709452C18.0454 0.139922 17.3439 0.200625 16.7125 0.808593L15.4467 2.06273L17.715 4.32139Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 439 B |
4
src/assets/icons/phone.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.2959 22.2337V5.40713H19.6043V22.2337H8.2959ZM13.9666 25.3457C13.364 25.3457 12.8754 24.857 12.8754 24.2523C12.8754 23.6615 13.364 23.1749 13.9666 23.1749C14.5575 23.1749 15.0461 23.6615 15.0461 24.2523C15.0461 24.857 14.5575 25.3457 13.9666 25.3457ZM11.5743 3.27433C11.5743 2.97316 11.785 2.77417 12.0745 2.77417H15.8332C16.1247 2.77417 16.3354 2.97316 16.3354 3.27433C16.3354 3.57761 16.1247 3.76276 15.8332 3.76276H12.0745C11.785 3.76276 11.5743 3.57761 11.5743 3.27433Z" fill="transparent"/>
|
||||
<path d="M6 23.4104C6 25.3483 7.35117 26.6408 9.37101 26.6408H18.5798C20.5701 26.6408 21.9002 25.3483 21.9002 23.4083V4.23249C21.9002 2.29258 20.5701 1 18.5798 1H9.37101C7.35117 1 6 2.29258 6 4.23038V23.4104ZM8.29592 22.2337V5.40717H19.6043V22.2337H8.29592ZM13.9666 25.3457C13.364 25.3457 12.8754 24.857 12.8754 24.2523C12.8754 23.6615 13.364 23.1749 13.9666 23.1749C14.5575 23.1749 15.0462 23.6615 15.0462 24.2523C15.0462 24.857 14.5575 25.3457 13.9666 25.3457ZM11.5744 3.27437C11.5744 2.9732 11.7851 2.77421 12.0745 2.77421H15.8332C16.1247 2.77421 16.3354 2.9732 16.3354 3.27437C16.3354 3.57765 16.1247 3.7628 15.8332 3.7628H12.0745C11.7851 3.7628 11.5744 3.57765 11.5744 3.27437Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M9.3418 21.3711C9.71094 21.3711 10.0361 21.2393 10.4404 21.002L20.8203 14.999C21.5762 14.5596 21.8926 14.2168 21.8926 13.6631C21.8926 13.1094 21.5762 12.7754 20.8203 12.3271L10.4404 6.32422C10.0361 6.08691 9.71094 5.95508 9.3418 5.95508C8.62109 5.95508 8.11133 6.50879 8.11133 7.37891V19.9473C8.11133 20.8262 8.62109 21.3711 9.3418 21.3711Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 484 B After Width: | Height: | Size: 461 B |
@@ -1 +1 @@
|
||||
<svg fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="28px" height="28px" baseProfile="basic"><path d="M13,46h16.205c0.338,1.549,1.093,2.903,2.174,4H13c-1.104,0-2-0.895-2-2C11,46.895,11.896,46,13,46z"/><path d="M12.999,38l18.714,0c-1.142,0.918-2.077,2.195-2.486,4L13,42c-1.104,0-2-0.895-2-2C11,38.895,11.895,38,12.999,38z"/><path d="M13,30h28v4H13c-1.104,0-2-0.895-2-2C11,30.895,11.896,30,13,30z"/><path d="M13,22h28v4H13c-1.104,0-2-0.895-2-2C11,22.895,11.896,22,13,22z"/><path d="M13,14h28v4H13c-1.104,0-2-0.895-2-2C11,14.895,11.896,14,13,14z"/><path d="M54.026,9.158C54.997,8.834,56,9.557,56,10.581v7.484c0,0.829-0.511,1.572-1.286,1.868l-5.75,2.199 C48.384,22.353,48,22.911,48,23.532V39c0,8-4.083,11-8.561,11C35.026,50,32,47.754,32,44.079c0-3.39,2.07-4.633,6.224-5.553 c4.067-0.9,5.776-1.327,5.776-4.142V13.942c0-0.861,0.551-1.625,1.368-1.897L54.026,9.158z" /></svg>
|
||||
<svg fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" baseProfile="basic"><path d="M13,46h16.205c0.338,1.549,1.093,2.903,2.174,4H13c-1.104,0-2-0.895-2-2C11,46.895,11.896,46,13,46z"/><path d="M12.999,38l18.714,0c-1.142,0.918-2.077,2.195-2.486,4L13,42c-1.104,0-2-0.895-2-2C11,38.895,11.895,38,12.999,38z"/><path d="M13,30h28v4H13c-1.104,0-2-0.895-2-2C11,30.895,11.896,30,13,30z"/><path d="M13,22h28v4H13c-1.104,0-2-0.895-2-2C11,22.895,11.896,22,13,22z"/><path d="M13,14h28v4H13c-1.104,0-2-0.895-2-2C11,14.895,11.896,14,13,14z"/><path d="M54.026,9.158C54.997,8.834,56,9.557,56,10.581v7.484c0,0.829-0.511,1.572-1.286,1.868l-5.75,2.199 C48.384,22.353,48,22.911,48,23.532V39c0,8-4.083,11-8.561,11C35.026,50,32,47.754,32,44.079c0-3.39,2.07-4.633,6.224-5.553 c4.067-0.9,5.776-1.327,5.776-4.142V13.942c0-0.861,0.551-1.625,1.368-1.897L54.026,9.158z" /></svg>
|
||||
|
Before Width: | Height: | Size: 902 B After Width: | Height: | Size: 875 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.16016 9.50586C6.85449 9.50586 7.4082 8.95215 7.4082 8.25781C7.4082 7.57227 6.85449 7.00977 6.16016 7.00977C5.47461 7.00977 4.91211 7.57227 4.91211 8.25781C4.91211 8.95215 5.47461 9.50586 6.16016 9.50586ZM10.291 9.10156H22.2266C22.7012 9.10156 23.0791 8.73242 23.0791 8.25781C23.0791 7.7832 22.71 7.41406 22.2266 7.41406H10.291C9.8252 7.41406 9.44727 7.7832 9.44727 8.25781C9.44727 8.73242 9.81641 9.10156 10.291 9.10156ZM6.16016 14.9111C6.85449 14.9111 7.4082 14.3574 7.4082 13.6631C7.4082 12.9775 6.85449 12.415 6.16016 12.415C5.47461 12.415 4.91211 12.9775 4.91211 13.6631C4.91211 14.3574 5.47461 14.9111 6.16016 14.9111ZM10.291 14.5068H22.2266C22.7012 14.5068 23.0791 14.1377 23.0791 13.6631C23.0791 13.1885 22.71 12.8193 22.2266 12.8193H10.291C9.8252 12.8193 9.44727 13.1885 9.44727 13.6631C9.44727 14.1377 9.81641 14.5068 10.291 14.5068ZM6.16016 20.3164C6.85449 20.3164 7.4082 19.7627 7.4082 19.0684C7.4082 18.3828 6.85449 17.8203 6.16016 17.8203C5.47461 17.8203 4.91211 18.3828 4.91211 19.0684C4.91211 19.7627 5.47461 20.3164 6.16016 20.3164ZM10.291 19.9121H22.2266C22.7012 19.9121 23.0791 19.543 23.0791 19.0684C23.0791 18.5938 22.71 18.2246 22.2266 18.2246H10.291C9.8252 18.2246 9.44727 18.5938 9.44727 19.0684C9.44727 19.543 9.81641 19.9121 10.291 19.9121Z" fill="#F2F2F2"/>
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.16016 9.50586C6.85449 9.50586 7.4082 8.95215 7.4082 8.25781C7.4082 7.57227 6.85449 7.00977 6.16016 7.00977C5.47461 7.00977 4.91211 7.57227 4.91211 8.25781C4.91211 8.95215 5.47461 9.50586 6.16016 9.50586ZM10.291 9.10156H22.2266C22.7012 9.10156 23.0791 8.73242 23.0791 8.25781C23.0791 7.7832 22.71 7.41406 22.2266 7.41406H10.291C9.8252 7.41406 9.44727 7.7832 9.44727 8.25781C9.44727 8.73242 9.81641 9.10156 10.291 9.10156ZM6.16016 14.9111C6.85449 14.9111 7.4082 14.3574 7.4082 13.6631C7.4082 12.9775 6.85449 12.415 6.16016 12.415C5.47461 12.415 4.91211 12.9775 4.91211 13.6631C4.91211 14.3574 5.47461 14.9111 6.16016 14.9111ZM10.291 14.5068H22.2266C22.7012 14.5068 23.0791 14.1377 23.0791 13.6631C23.0791 13.1885 22.71 12.8193 22.2266 12.8193H10.291C9.8252 12.8193 9.44727 13.1885 9.44727 13.6631C9.44727 14.1377 9.81641 14.5068 10.291 14.5068ZM6.16016 20.3164C6.85449 20.3164 7.4082 19.7627 7.4082 19.0684C7.4082 18.3828 6.85449 17.8203 6.16016 17.8203C5.47461 17.8203 4.91211 18.3828 4.91211 19.0684C4.91211 19.7627 5.47461 20.3164 6.16016 20.3164ZM10.291 19.9121H22.2266C22.7012 19.9121 23.0791 19.543 23.0791 19.0684C23.0791 18.5938 22.71 18.2246 22.2266 18.2246H10.291C9.8252 18.2246 9.44727 18.5938 9.44727 19.0684C9.44727 19.543 9.81641 19.9121 10.291 19.9121Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.3 KiB |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7.63672 14.6562H12.998V20.0176C12.998 20.5625 13.4463 21.0195 14 21.0195C14.5537 21.0195 15.002 20.5625 15.002 20.0176V14.6562H20.3633C20.9082 14.6562 21.3652 14.208 21.3652 13.6543C21.3652 13.1006 20.9082 12.6523 20.3633 12.6523H15.002V7.29102C15.002 6.74609 14.5537 6.28906 14 6.28906C13.4463 6.28906 12.998 6.74609 12.998 7.29102V12.6523H7.63672C7.0918 12.6523 6.63477 13.1006 6.63477 13.6543C6.63477 14.208 7.0918 14.6562 7.63672 14.6562Z" fill="#F2F2F2"/>
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7.63672 14.6562H12.998V20.0176C12.998 20.5625 13.4463 21.0195 14 21.0195C14.5537 21.0195 15.002 20.5625 15.002 20.0176V14.6562H20.3633C20.9082 14.6562 21.3652 14.208 21.3652 13.6543C21.3652 13.1006 20.9082 12.6523 20.3633 12.6523H15.002V7.29102C15.002 6.74609 14.5537 6.28906 14 6.28906C13.4463 6.28906 12.998 6.74609 12.998 7.29102V12.6523H7.63672C7.0918 12.6523 6.63477 13.1006 6.63477 13.6543C6.63477 14.208 7.0918 14.6562 7.63672 14.6562Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 574 B After Width: | Height: | Size: 556 B |
@@ -1,4 +1,4 @@
|
||||
<svg fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="28px" height="28px"
|
||||
<svg fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"
|
||||
baseProfile="basic">
|
||||
<path d="M51,48H25c-1.104,0-2-0.896-2-2s0.896-2,2-2h26c1.104,0,2,0.896,2,2S52.104,48,51,48z" />
|
||||
<path
|
||||
|
||||
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
@@ -1,4 +1,4 @@
|
||||
<svg width="28" height="30" viewBox="0 0 28 30" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 30" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M21.367 13.6066C22.377 13.5853 23.1931 12.7884 23.1931 11.7944C23.1931 10.7887 22.3749 9.97054 21.367 9.95671C20.3613 9.945 19.5314 10.7866 19.5314 11.7944C19.5314 12.7905 20.3613 13.6205 21.367 13.6066ZM21.367 18.829C22.3727 18.829 23.1931 17.997 23.1931 16.9891C23.1931 15.9813 22.3749 15.1631 21.367 15.1631C20.3613 15.1631 19.5314 15.9855 19.5314 16.9891C19.5314 17.9948 20.3613 18.829 21.367 18.829ZM11.1511 11.3658C11.6283 11.3658 12.0117 10.9631 12.0117 10.4625C12.0117 9.98742 11.6262 9.59226 11.1511 9.59226C10.6739 9.59226 10.2787 9.98742 10.2787 10.4625C10.2787 10.9631 10.6739 11.3658 11.1511 11.3658ZM13.9634 12.1671C14.4598 12.1671 14.8357 11.7644 14.8357 11.2852C14.8357 10.7866 14.4619 10.4032 13.9634 10.4032C13.4841 10.4032 13.1145 10.7866 13.1145 11.2852C13.1145 11.7644 13.4862 12.1671 13.9634 12.1671ZM16.0873 14.2024C16.5687 14.2024 16.9734 13.819 16.9734 13.3418C16.9734 12.8412 16.5687 12.4364 16.0873 12.4364C15.6122 12.4364 15.2309 12.8412 15.2309 13.3418C15.2309 13.819 15.6122 14.2024 16.0873 14.2024ZM16.8087 16.9327C17.2859 16.9327 17.6693 16.5396 17.6693 16.0624C17.6693 15.5756 17.2859 15.1922 16.8087 15.1922C16.3219 15.1922 15.9384 15.5756 15.9384 16.0624C15.9384 16.5396 16.3219 16.9327 16.8087 16.9327ZM16.0873 19.6767C16.5666 19.6767 16.9734 19.272 16.9734 18.7831C16.9734 18.2963 16.5687 17.9128 16.0873 17.9128C15.6122 17.9128 15.2309 18.2963 15.2309 18.7831C15.2309 19.2741 15.6122 19.6767 16.0873 19.6767ZM13.9634 21.7697C14.4619 21.7697 14.8357 21.3766 14.8357 20.8877C14.8357 20.4084 14.4598 20.0037 13.9634 20.0037C13.4862 20.0037 13.1145 20.4084 13.1145 20.8877C13.1145 21.3766 13.4841 21.7697 13.9634 21.7697ZM11.1511 22.6287C11.6262 22.6287 12.0117 22.2335 12.0117 21.7584C12.0117 21.2578 11.6283 20.8531 11.1511 20.8531C10.6739 20.8531 10.2787 21.2578 10.2787 21.7584C10.2787 22.2335 10.6739 22.6287 11.1511 22.6287ZM8.3271 21.7697C8.80429 21.7697 9.17601 21.3766 9.17601 20.8877C9.17601 20.4084 8.80218 20.0037 8.3271 20.0037C7.82859 20.0037 7.45476 20.4084 7.45476 20.8877C7.45476 21.3766 7.82648 21.7697 8.3271 21.7697ZM6.21069 19.6767C6.68577 19.6767 7.0596 19.2741 7.0596 18.7831C7.0596 18.2963 6.68577 17.9128 6.21069 17.9128C5.7239 17.9128 5.31913 18.2963 5.31913 18.7831C5.31913 19.272 5.7239 19.6767 6.21069 19.6767ZM5.4914 16.9327C5.96858 16.9327 6.35202 16.5396 6.35202 16.0624C6.35202 15.5756 5.96858 15.1922 5.4914 15.1922C5.0121 15.1922 4.62116 15.5756 4.62116 16.0624C4.62116 16.5396 5.0121 16.9327 5.4914 16.9327ZM6.21069 14.2024C6.68577 14.2024 7.0596 13.819 7.0596 13.3418C7.0596 12.8412 6.68577 12.4364 6.21069 12.4364C5.7239 12.4364 5.31913 12.8412 5.31913 13.3418C5.31913 13.819 5.7239 14.2024 6.21069 14.2024ZM8.3271 12.1671C8.80218 12.1671 9.17601 11.7644 9.17601 11.2852C9.17601 10.7866 8.80429 10.4032 8.3271 10.4032C7.82648 10.4032 7.45476 10.7866 7.45476 11.2852C7.45476 11.7644 7.82859 12.1671 8.3271 12.1671ZM11.1511 14.2601C11.6283 14.2601 12.0117 13.867 12.0117 13.3898C12.0117 12.8988 11.6283 12.4941 11.1511 12.4941C10.6739 12.4941 10.2787 12.8988 10.2787 13.3898C10.2787 13.867 10.6739 14.2601 11.1511 14.2601ZM13.7728 15.4003C14.2596 15.4003 14.6334 14.9955 14.6334 14.528C14.6334 14.0508 14.2596 13.6556 13.7728 13.6556C13.2977 13.6556 12.8909 14.0529 12.8909 14.528C12.8909 14.9934 13.2977 15.4003 13.7728 15.4003ZM13.7728 18.5674C14.2617 18.5674 14.6334 18.1819 14.6334 17.7047C14.6334 17.2062 14.2617 16.8131 13.7728 16.8131C13.2956 16.8131 12.8909 17.2062 12.8909 17.7047C12.8909 18.1819 13.2956 18.5674 13.7728 18.5674ZM11.1511 19.7248C11.6262 19.7248 12.0117 19.3179 12.0117 18.8311C12.0117 18.3539 11.6283 17.9609 11.1511 17.9609C10.6739 17.9609 10.2787 18.3539 10.2787 18.8311C10.2787 19.3179 10.6739 19.7248 11.1511 19.7248ZM8.51554 18.5674C8.99273 18.5674 9.39749 18.1819 9.39749 17.7047C9.39749 17.2062 8.99273 16.8131 8.51554 16.8131C8.03835 16.8131 7.65492 17.2062 7.65492 17.7047C7.65492 18.1819 8.03835 18.5674 8.51554 18.5674ZM8.51554 15.4003C8.99062 15.4003 9.39749 14.9934 9.39749 14.528C9.39749 14.0529 8.99062 13.6556 8.51554 13.6556C8.04046 13.6556 7.65492 14.0508 7.65492 14.528C7.65492 14.9955 8.04046 15.4003 8.51554 15.4003ZM11.1511 16.9807C11.6283 16.9807 12.0117 16.5877 12.0117 16.1105C12.0117 15.6333 11.6283 15.2402 11.1511 15.2402C10.6739 15.2402 10.2787 15.6333 10.2787 16.1105C10.2787 16.5877 10.6739 16.9807 11.1511 16.9807ZM22.444 7.38796L23.0962 5.33649L6.82734 0.0527401C6.26344 -0.132415 5.64844 0.186802 5.47711 0.746487C5.28985 1.30406 5.60696 1.91906 6.16664 2.10632L22.444 7.38796ZM3.84421 27.0553H23.9109C26.4499 27.0553 27.7552 25.7597 27.7552 23.2591V8.98734C27.7552 6.48469 26.4499 5.18157 23.9109 5.18157H3.84421C1.31484 5.18157 0 6.48469 0 8.98734V23.2591C0 25.7597 1.31484 27.0553 3.84421 27.0553ZM3.97733 24.7594C2.88772 24.7594 2.29592 24.1952 2.29592 23.0566V9.18773C2.29592 8.04913 2.88772 7.47749 3.97733 7.47749H23.7778C24.8578 7.47749 25.4592 8.04913 25.4592 9.18773V23.0566C25.4592 24.1952 24.8578 24.7594 23.7778 24.7594H3.97733Z"
|
||||
fill="currentColor" />
|
||||
|
||||
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M4 15.007C4 20.8158 8.66992 25.4899 14.4712 25.4899C20.2703 25.4899 24.9306 20.8158 24.9306 15.007C24.9306 14.318 24.4478 13.8277 23.7597 13.8277C23.0929 13.8277 22.641 14.318 22.641 15.007C22.641 19.5471 19.0038 23.194 14.4712 23.194C9.93647 23.194 6.29592 19.5471 6.29592 15.007C6.29592 10.4428 9.90694 6.81608 14.4353 6.81608C15.2015 6.81608 15.9196 6.87584 16.5203 7.01038L13.3265 10.1691C13.1233 10.384 13.0042 10.6437 13.0042 10.9488C13.0042 11.5912 13.4913 12.0762 14.1241 12.0762C14.4592 12.0762 14.7262 11.9676 14.924 11.7581L19.7373 6.90866C19.9862 6.66936 20.0915 6.38858 20.0915 6.06421C20.0915 5.75578 19.967 5.44945 19.7373 5.22187L14.924 0.333982C14.7241 0.110624 14.4496 0 14.1241 0C13.4913 0 13.0042 0.508356 13.0042 1.15288C13.0042 1.45804 13.1233 1.71772 13.3169 1.93264L16.1514 4.72992C15.6327 4.63172 15.0426 4.56445 14.4353 4.56445C8.64039 4.56445 4 9.20367 4 15.007Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1010 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M12.5322 19.0332C13.9297 19.0332 15.2393 18.6113 16.3291 17.8906L20.1787 21.749C20.4336 21.9951 20.7588 22.1182 21.1104 22.1182C21.8398 22.1182 22.376 21.5469 22.376 20.8262C22.376 20.4922 22.2617 20.167 22.0156 19.9209L18.1924 16.0801C18.9834 14.9551 19.4492 13.5928 19.4492 12.1162C19.4492 8.31055 16.3379 5.19922 12.5322 5.19922C8.73535 5.19922 5.61523 8.31055 5.61523 12.1162C5.61523 15.9219 8.72656 19.0332 12.5322 19.0332ZM12.5322 17.1875C9.74609 17.1875 7.46094 14.9023 7.46094 12.1162C7.46094 9.33008 9.74609 7.04492 12.5322 7.04492C15.3184 7.04492 17.6035 9.33008 17.6035 12.1162C17.6035 14.9023 15.3184 17.1875 12.5322 17.1875Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 773 B After Width: | Height: | Size: 750 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.1035 23.208H14.8877C15.6172 23.208 16.1885 22.751 16.3643 22.0479L16.7158 20.5098L16.9443 20.4219L18.2891 21.2568C18.9043 21.6436 19.6338 21.5381 20.1523 21.0195L21.3828 19.7891C21.9102 19.2617 21.998 18.541 21.6113 17.9346L20.7764 16.5898L20.8643 16.3789L22.4023 16.0186C23.0967 15.8428 23.5537 15.2715 23.5537 14.542V12.8105C23.5537 12.0811 23.1055 11.5098 22.4023 11.334L20.873 10.9648L20.7852 10.7363L21.6201 9.40039C22.0068 8.79395 21.9189 8.07324 21.3916 7.53711L20.1611 6.30664C19.6514 5.78809 18.9219 5.69141 18.3066 6.06934L16.9619 6.89551L16.7158 6.80762L16.3643 5.26074C16.1885 4.55762 15.6172 4.10938 14.8877 4.10938H13.1035C12.3652 4.10938 11.7939 4.55762 11.627 5.26074L11.2754 6.80762L11.0293 6.89551L9.68457 6.06934C9.06055 5.69141 8.33984 5.78809 7.83008 6.30664L6.59082 7.53711C6.07227 8.07324 5.97559 8.79395 6.3623 9.40039L7.19727 10.7363L7.10938 10.9648L5.58887 11.334C4.88574 11.5098 4.4375 12.0811 4.4375 12.8105V14.542C4.4375 15.2715 4.89453 15.8428 5.58887 16.0186L7.12695 16.3789L7.20605 16.5898L6.37109 17.9346C5.98438 18.541 6.08105 19.2617 6.59961 19.7891L7.83887 21.0195C8.34863 21.5381 9.07812 21.6436 9.69336 21.2568L11.0381 20.4219L11.2754 20.5098L11.627 22.0479C11.7939 22.751 12.3652 23.208 13.1035 23.208ZM13.332 21.5908C13.1826 21.5908 13.1035 21.5293 13.0859 21.3975L12.5586 19.2354C12.0049 19.1035 11.4688 18.875 11.0381 18.6025L9.13965 19.7715C9.02539 19.8418 8.91992 19.833 8.81445 19.7275L7.8916 18.8047C7.78613 18.708 7.78613 18.6025 7.85645 18.4883L9.02539 16.5898C8.7793 16.168 8.55078 15.6406 8.41895 15.0869L6.24805 14.5684C6.11621 14.5508 6.0459 14.4717 6.0459 14.3223V13.0215C6.0459 12.8633 6.10742 12.8018 6.24805 12.7666L8.41016 12.2568C8.54199 11.668 8.79688 11.123 9.0166 10.7275L7.84766 8.84668C7.77734 8.72363 7.77734 8.61816 7.87402 8.5127L8.80566 7.59863C8.91113 7.50195 9.00781 7.48438 9.13965 7.56348L11.0205 8.71484C11.416 8.46875 12.0049 8.22266 12.5674 8.08203L13.0859 5.91992C13.1035 5.78809 13.1826 5.71777 13.332 5.71777H14.6592C14.8086 5.71777 14.8789 5.7793 14.9053 5.91992L15.4326 8.09082C16.0039 8.23145 16.5225 8.46875 16.9619 8.71484L18.8428 7.56348C18.9746 7.49316 19.0713 7.50195 19.1768 7.60742L20.1084 8.52148C20.2139 8.61816 20.2139 8.72363 20.1348 8.84668L18.9746 10.7275C19.1855 11.123 19.4492 11.668 19.5811 12.2568L21.7432 12.7666C21.8838 12.8018 21.9365 12.8633 21.9365 13.0215V14.3223C21.9365 14.4717 21.875 14.5508 21.7432 14.5684L19.5723 15.0869C19.4404 15.6406 19.2031 16.1768 18.957 16.5898L20.126 18.4795C20.1963 18.6025 20.1963 18.6992 20.0908 18.7959L19.168 19.7275C19.0625 19.833 18.957 19.8418 18.8428 19.7715L16.9531 18.6025C16.5137 18.875 16.0127 19.0947 15.4326 19.2354L14.9053 21.3975C14.8789 21.5293 14.8086 21.5908 14.6592 21.5908H13.332ZM14 16.9941C15.8281 16.9941 17.3311 15.4912 17.3311 13.6543C17.3311 11.835 15.8281 10.332 14 10.332C12.1631 10.332 10.6514 11.835 10.6514 13.6543C10.6514 15.4912 12.1631 16.9941 14 16.9941ZM14 15.4736C12.998 15.4736 12.1807 14.6562 12.1807 13.6543C12.1807 12.6699 13.0068 11.8525 14 11.8525C14.9756 11.8525 15.793 12.6699 15.793 13.6543C15.793 14.6475 14.9756 15.4736 14 15.4736Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
3
src/assets/icons/sparkles.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15.6785 26.9414C16.0401 26.9414 16.3113 26.6787 16.3762 26.3053C17.2167 19.9648 18.1085 19.0015 24.3609 18.3047C24.746 18.2632 25.0151 17.9782 25.0151 17.6048C25.0151 17.2453 24.7502 16.9624 24.363 16.9146C18.1127 16.1925 17.2462 15.2566 16.3762 8.90648C16.3071 8.53312 16.038 8.28 15.6785 8.28C15.319 8.28 15.0478 8.53312 14.9925 8.90648C14.1499 15.2566 13.2506 16.2199 7.00569 16.9146C6.61101 16.9561 6.34406 17.2411 6.34406 17.6048C6.34406 17.9761 6.6089 18.259 7.00359 18.3047C13.2368 19.1367 14.0819 19.9648 14.9925 26.3053C15.0499 26.6787 15.3211 26.9414 15.6785 26.9414ZM7.575 13.9509C7.81664 13.9509 7.99218 13.7817 8.01984 13.5476C8.43539 10.444 8.52609 10.4334 11.7584 9.82499C11.9808 9.78562 12.1479 9.62179 12.1479 9.38015C12.1479 9.14601 11.9787 8.97047 11.7541 8.94492C8.53242 8.49422 8.42578 8.39507 8.01984 5.23195C7.99218 4.98609 7.81875 4.81687 7.575 4.81687C7.33875 4.81687 7.16531 4.98609 7.13016 5.24578C6.75726 8.34515 6.60258 8.34398 3.39164 8.94492C3.16711 8.98429 3 9.14601 3 9.38015C3 9.63562 3.16711 9.78562 3.44273 9.82499C6.61758 10.328 6.75726 10.4163 7.13016 13.5241C7.16531 13.7817 7.33875 13.9509 7.575 13.9509ZM13.2574 5.76398C13.4203 5.76398 13.5171 5.65758 13.5427 5.5064C13.8794 3.6164 13.8485 3.54164 15.8791 3.17203C16.0324 3.13476 16.1367 3.04219 16.1367 2.87719C16.1367 2.7218 16.0303 2.6175 15.877 2.59195C13.8485 2.24344 13.8773 2.16445 13.5427 0.259686C13.5171 0.106406 13.4203 0 13.2574 0C13.0924 0 12.9977 0.106406 12.9722 0.263905C12.6417 2.14758 12.6684 2.22234 10.6357 2.59195C10.4707 2.61961 10.3781 2.7218 10.3781 2.87719C10.3781 3.04219 10.4707 3.13476 10.642 3.17203C12.6621 3.52898 12.6354 3.60797 12.9722 5.5043C12.9977 5.65758 13.0924 5.76398 13.2574 5.76398Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
4
src/assets/icons/timer.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M12.105 24.21C18.7622 24.21 24.2121 18.7483 24.2121 12.105C24.2121 5.45203 18.7718 0 12.1146 0C11.3986 0 10.999 0.425623 10.999 1.12359V5.44992C10.999 6.04781 11.4138 6.5032 11.9979 6.5032C12.5937 6.5032 13.0064 6.04781 13.0064 5.44992V1.07062L11.9899 2.3592C17.4581 2.30436 21.8159 6.66866 21.8159 12.105C21.8159 17.4907 17.5076 21.8255 12.105 21.8255C6.70452 21.8255 2.37491 17.4907 2.38452 12.105C2.39412 9.77155 3.21397 7.62608 4.58718 5.96459C5.021 5.36413 5.08452 4.7353 4.59022 4.23656C4.10437 3.74414 3.30586 3.79617 2.78368 4.45944C1.06149 6.54327 0 9.22288 0 12.105C0 18.7483 5.45953 24.21 12.105 24.21Z" fill="currentColor"/>
|
||||
<path d="M13.9884 13.8957C14.9564 12.883 14.7562 11.5084 13.605 10.7244L7.6315 6.60785C6.93588 6.13653 6.2569 6.83145 6.72611 7.51324L10.833 13.4868C11.6266 14.6401 13.0012 14.8499 13.9884 13.8957Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 947 B |
@@ -1,4 +1,4 @@
|
||||
<svg width="28" height="28" viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg viewBox="0 0 28 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M2.58773 19.4704H5.91726C6.01218 19.4704 6.09749 19.4992 6.17531 19.5695L11.3234 24.1773C11.9323 24.7213 12.4017 24.9747 13.0169 24.9747C13.8724 24.9747 14.5289 24.3395 14.5289 23.4744V5.57171C14.5289 4.70664 13.8724 4.01172 12.9977 4.01172C12.3909 4.01172 11.977 4.28008 11.3234 4.86883L6.17531 9.4361C6.09538 9.5043 6.01218 9.53524 5.91726 9.53524H2.58773C0.869528 9.53524 0 10.4366 0 12.2561V16.7612C0 18.5786 0.879137 19.4704 2.58773 19.4704ZM2.78366 17.4072C2.39647 17.4072 2.20991 17.2185 2.20991 16.8313V12.1839C2.20991 11.7892 2.39647 11.6005 2.78366 11.6005H6.44929C6.76663 11.6005 7.00733 11.5356 7.27686 11.2895L11.9695 7.01803C12.0239 6.96154 12.0825 6.9306 12.1624 6.9306C12.2466 6.9306 12.319 6.99131 12.319 7.09888V21.88C12.319 21.9876 12.2466 22.0621 12.1624 22.0621C12.1017 22.0621 12.0335 22.027 11.9695 21.9705L7.27686 17.7182C7.00733 17.4796 6.76663 17.4072 6.44929 17.4072H2.78366Z" fill="currentColor"/>
|
||||
<path d="M18.5131 19.6804C18.9969 20.0005 19.6489 19.8932 20.0075 19.3792C20.952 18.1218 21.5122 16.3335 21.5122 14.4815C21.5122 12.6295 20.952 10.8508 20.0075 9.57953C19.6489 9.06977 18.9969 8.95071 18.5131 9.28258C17.942 9.65711 17.84 10.3464 18.2877 11.0019C18.9357 11.9226 19.3013 13.1748 19.3013 14.4815C19.3013 15.7881 18.924 17.0287 18.2877 17.961C17.8496 18.6241 17.942 19.2962 18.5131 19.6804Z" fill="currentColor"/>
|
||||
<path d="M23.1864 22.8128C23.7128 23.1479 24.3615 23.0193 24.7264 22.4875C26.2517 20.3322 27.137 17.4477 27.137 14.4815C27.137 11.5152 26.2613 8.61156 24.7264 6.47336C24.3615 5.94368 23.7128 5.81501 23.1864 6.15016C22.6346 6.49797 22.5559 7.18375 22.9611 7.79077C24.2089 9.61023 24.9282 12.0065 24.9282 14.4815C24.9282 16.9565 24.1897 19.3314 22.9611 21.1701C22.5655 21.7771 22.6346 22.465 23.1864 22.8128Z" fill="currentColor"/>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.8 KiB |
@@ -6,7 +6,7 @@
|
||||
height: 100%;
|
||||
padding-right: $small;
|
||||
|
||||
@include largePhones {
|
||||
@include allPhones {
|
||||
grid-template-columns: 1fr 9.2rem;
|
||||
}
|
||||
|
||||
@@ -42,11 +42,5 @@
|
||||
align-items: center;
|
||||
gap: $small;
|
||||
}
|
||||
|
||||
.volume-group {
|
||||
@include tablet-portrait {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
|
||||
padding: 0 1rem;
|
||||
overflow: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
max-height: 100%;
|
||||
gap: 2rem 1rem;
|
||||
}
|
||||
|
||||
@@ -1,228 +1,278 @@
|
||||
$g-border: solid 1px $gray5;
|
||||
|
||||
#app-grid {
|
||||
display: grid;
|
||||
// grid-template-columns: min-content 1fr 29rem;
|
||||
grid-template-columns: min-content 1fr;
|
||||
grid-template-rows: $navheight 1fr $navheight;
|
||||
grid-template-areas:
|
||||
"l-sidebar nav"
|
||||
"l-sidebar content"
|
||||
"bottombar bottombar";
|
||||
height: 100%;
|
||||
border: $g-border;
|
||||
border-top: none;
|
||||
border-bottom: none;
|
||||
margin: 0 auto;
|
||||
|
||||
#contentresizer {
|
||||
margin: 0 $padright 0 $padleft;
|
||||
}
|
||||
|
||||
@include allPhones {
|
||||
grid-template-columns: 1fr;
|
||||
// grid-template-columns: 1fr;
|
||||
grid-template-rows: max-content 1fr 9.5rem;
|
||||
display: grid;
|
||||
// grid-template-columns: min-content 1fr 29rem;
|
||||
grid-template-columns: min-content 1fr;
|
||||
grid-template-rows: $navheight 1fr 5.125rem;
|
||||
grid-template-areas:
|
||||
"nav"
|
||||
"content"
|
||||
"bottombar";
|
||||
}
|
||||
'l-sidebar nav'
|
||||
'l-sidebar content'
|
||||
'bottombar bottombar';
|
||||
height: 100%;
|
||||
border: $g-border;
|
||||
border-top: none;
|
||||
border-bottom: none;
|
||||
margin: 0 auto;
|
||||
position: relative;
|
||||
|
||||
#contentresizer {
|
||||
margin: 0 $padright 0 $padleft;
|
||||
}
|
||||
|
||||
@include allPhones {
|
||||
grid-template-columns: 1fr;
|
||||
grid-template-areas:
|
||||
'nav'
|
||||
'content'
|
||||
'bottombar';
|
||||
grid-template-rows: auto 1fr auto;
|
||||
}
|
||||
}
|
||||
|
||||
#acontent {
|
||||
width: 100%;
|
||||
grid-area: content;
|
||||
overflow: hidden;
|
||||
margin-right: $margright;
|
||||
width: 100%;
|
||||
grid-area: content;
|
||||
overflow: hidden;
|
||||
margin-right: $margright;
|
||||
}
|
||||
|
||||
.topnav {
|
||||
grid-area: nav;
|
||||
height: $navheight;
|
||||
padding: 1rem $padleft;
|
||||
padding-right: $padright;
|
||||
grid-area: nav;
|
||||
height: $navheight;
|
||||
padding: 1rem $padleft;
|
||||
padding-right: $padright;
|
||||
|
||||
@include allPhones {
|
||||
display: flex;
|
||||
gap: $smaller;
|
||||
height: unset;
|
||||
padding: 6px 8px;
|
||||
margin: $medium 1rem;
|
||||
border-radius: 5rem;
|
||||
background-color: $gray;
|
||||
}
|
||||
}
|
||||
|
||||
.b-bar {
|
||||
grid-area: bottombar;
|
||||
border-top: $g-border;
|
||||
grid-area: bottombar;
|
||||
border-top: $g-border;
|
||||
// background-color: $bars;
|
||||
}
|
||||
|
||||
.content-page {
|
||||
scrollbar-gutter: stable;
|
||||
padding-left: $padleft;
|
||||
padding-right: $padright;
|
||||
padding-bottom: $padbottom;
|
||||
scrollbar-gutter: stable;
|
||||
padding-left: $padleft;
|
||||
padding-right: $padright;
|
||||
padding-bottom: $padbottom;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
|
||||
@include allPhones {
|
||||
padding-left: 1rem;
|
||||
padding-right: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
.vue-recycle-scroller__item-wrapper {
|
||||
overflow: visible !important;
|
||||
overflow: visible !important;
|
||||
}
|
||||
|
||||
.vue-recycle-scroller {
|
||||
scrollbar-gutter: stable;
|
||||
padding-left: $padleft;
|
||||
scrollbar-gutter: stable;
|
||||
padding-left: $padleft;
|
||||
}
|
||||
|
||||
.r-sidebar {
|
||||
grid-area: r-sidebar;
|
||||
border-left: $g-border;
|
||||
grid-area: r-sidebar;
|
||||
border-left: $g-border;
|
||||
|
||||
.vue-recycle-scroller {
|
||||
padding-left: 0;
|
||||
}
|
||||
.vue-recycle-scroller {
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
// ====== MODIFIERS =======
|
||||
|
||||
#app-grid.is_alt_layout {
|
||||
grid-template-columns: 1fr;
|
||||
grid-template-rows: max-content 1fr 5rem;
|
||||
grid-template-areas:
|
||||
"nav"
|
||||
"content"
|
||||
"bottombar";
|
||||
grid-template-columns: 1fr;
|
||||
grid-template-rows: max-content 1fr 5.125rem;
|
||||
grid-template-areas:
|
||||
'nav'
|
||||
'content'
|
||||
'bottombar';
|
||||
|
||||
.vue-recycle-scroller,
|
||||
.content-page,
|
||||
.topnav,
|
||||
#songlist-scroller {
|
||||
padding-left: $alt_layout_pad;
|
||||
padding-right: $alt_layout_pad;
|
||||
}
|
||||
|
||||
.b-bar,
|
||||
.search-page-top-results {
|
||||
padding: 0 $alt_layout_pad;
|
||||
}
|
||||
|
||||
#contentresizer {
|
||||
margin: 0 $alt_layout_pad;
|
||||
}
|
||||
|
||||
.topnav {
|
||||
background-color: $gray;
|
||||
}
|
||||
|
||||
.vue-recycle-scroller,
|
||||
.content-page {
|
||||
padding-top: 2rem;
|
||||
}
|
||||
|
||||
.search-page-top-results {
|
||||
padding-bottom: $padbottom;
|
||||
}
|
||||
|
||||
.search-view .buttons-area {
|
||||
padding-left: $alt_layout_pad;
|
||||
}
|
||||
|
||||
.lyricsview {
|
||||
padding-bottom: 2rem;
|
||||
}
|
||||
|
||||
#lyricscontent {
|
||||
padding-top: 0;
|
||||
padding-left: 2rem;
|
||||
padding-right: 2rem;
|
||||
}
|
||||
|
||||
.nolyrics {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
@media (min-width: 1980px) {
|
||||
// NOTE: Styles for 1680px and below
|
||||
$alt_layout_pad: max(2rem, calc((100% - 1680px) / 2));
|
||||
@include allPhones {
|
||||
grid-template-columns: 1fr !important;
|
||||
grid-template-rows: max-content 1fr 9.5rem !important;
|
||||
grid-template-areas:
|
||||
'nav'
|
||||
'content'
|
||||
'bottombar' !important;
|
||||
}
|
||||
|
||||
.vue-recycle-scroller,
|
||||
.content-page,
|
||||
.topnav,
|
||||
#songlist-scroller {
|
||||
padding-left: $alt_layout_pad;
|
||||
padding-right: $alt_layout_pad;
|
||||
}
|
||||
|
||||
#contentresizer {
|
||||
margin: 0 $alt_layout_pad;
|
||||
}
|
||||
|
||||
.search-view .buttons-area {
|
||||
padding-left: $alt_layout_pad;
|
||||
padding-left: $alt_layout_pad;
|
||||
padding-right: $alt_layout_pad;
|
||||
}
|
||||
|
||||
.b-bar,
|
||||
.search-page-top-results {
|
||||
padding: 0 $alt_layout_pad;
|
||||
padding: 0 $alt_layout_pad;
|
||||
}
|
||||
|
||||
#contentresizer {
|
||||
margin: 0 $alt_layout_pad;
|
||||
}
|
||||
|
||||
.topnav {
|
||||
// background-color: $bars;
|
||||
border-bottom: $g-border;
|
||||
}
|
||||
|
||||
.vue-recycle-scroller,
|
||||
.content-page {
|
||||
padding-top: 2rem;
|
||||
}
|
||||
|
||||
.search-page-top-results {
|
||||
padding-bottom: $padbottom;
|
||||
}
|
||||
|
||||
.search-view .buttons-area {
|
||||
padding-left: $alt_layout_pad;
|
||||
}
|
||||
|
||||
.lyricsview {
|
||||
padding-bottom: 2rem;
|
||||
}
|
||||
|
||||
#lyricscontent {
|
||||
padding-top: 0;
|
||||
padding-left: 2rem;
|
||||
padding-right: 2rem;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 1980px) {
|
||||
// NOTE: Styles for 1680px and below
|
||||
$alt_layout_pad: max(2rem, calc((100% - 1680px) / 2));
|
||||
|
||||
.vue-recycle-scroller,
|
||||
.content-page,
|
||||
.topnav,
|
||||
#songlist-scroller {
|
||||
padding-left: $alt_layout_pad;
|
||||
padding-right: $alt_layout_pad;
|
||||
}
|
||||
|
||||
#contentresizer {
|
||||
margin: 0 $alt_layout_pad;
|
||||
}
|
||||
|
||||
.search-view .buttons-area {
|
||||
padding-left: $alt_layout_pad;
|
||||
}
|
||||
|
||||
.b-bar,
|
||||
.search-page-top-results {
|
||||
padding: 0 $alt_layout_pad;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#app-grid.extendWidth {
|
||||
padding-right: 0;
|
||||
border-left: none;
|
||||
border-right: none;
|
||||
max-width: 100% !important;
|
||||
padding-right: 0;
|
||||
border-left: none;
|
||||
border-right: none;
|
||||
max-width: 100% !important;
|
||||
}
|
||||
|
||||
#app-grid.useSidebar {
|
||||
grid-template-columns: min-content 1fr 28rem;
|
||||
grid-template-areas:
|
||||
"l-sidebar nav r-sidebar"
|
||||
"l-sidebar content r-sidebar"
|
||||
"bottombar bottombar bottombar";
|
||||
grid-template-columns: min-content 1fr 28rem;
|
||||
grid-template-areas:
|
||||
'l-sidebar nav r-sidebar'
|
||||
'l-sidebar content r-sidebar'
|
||||
'bottombar bottombar bottombar';
|
||||
|
||||
@include for-desktop-down {
|
||||
grid-template-columns: min-content 1fr 24rem;
|
||||
}
|
||||
@include for-desktop-down {
|
||||
grid-template-columns: min-content 1fr 24rem;
|
||||
}
|
||||
|
||||
#acontent {
|
||||
// margin-right: 0 !important;
|
||||
// padding-right: $medium !important;
|
||||
}
|
||||
#acontent {
|
||||
// margin-right: 0 !important;
|
||||
// padding-right: $medium !important;
|
||||
}
|
||||
}
|
||||
|
||||
#app-grid.NoSideBorders {
|
||||
border-right: none !important;
|
||||
border-left: none !important;
|
||||
border-right: none !important;
|
||||
border-left: none !important;
|
||||
}
|
||||
|
||||
.v-scroll-page {
|
||||
.scroller {
|
||||
padding-right: $padright;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
padding-bottom: $content-padding-bottom;
|
||||
padding-bottom: $padbottom;
|
||||
}
|
||||
.scroller {
|
||||
padding-right: $padright;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
padding-bottom: $content-padding-bottom;
|
||||
padding-bottom: $padbottom;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
|
||||
@include allPhones {
|
||||
padding-left: 1rem;
|
||||
padding-right: 1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.song-title > .isSmallArtists {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.isSmall {
|
||||
.songlist-item {
|
||||
grid-template-columns: 2fr 5.5rem !important;
|
||||
}
|
||||
.album_disc_header {
|
||||
padding-left: $small;
|
||||
}
|
||||
|
||||
.song-artists,
|
||||
.song-album {
|
||||
display: none !important;
|
||||
}
|
||||
.songlist-item {
|
||||
grid-template-columns: 2fr 7.5rem !important;
|
||||
|
||||
.isSmallArtists {
|
||||
display: unset !important;
|
||||
font-size: small;
|
||||
color: $white;
|
||||
opacity: 0.67;
|
||||
}
|
||||
// disable hover on mobile
|
||||
// to prevent tap effect
|
||||
&:hover {
|
||||
background-color: unset;
|
||||
}
|
||||
|
||||
@include mediumPhones {
|
||||
grid-template-columns: 2fr 2.5rem !important;
|
||||
gap: $small !important;
|
||||
}
|
||||
}
|
||||
|
||||
.song-artists,
|
||||
.song-album {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.isSmallArtists {
|
||||
display: flex !important;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
font-size: small;
|
||||
color: $white;
|
||||
opacity: 0.67;
|
||||
}
|
||||
}
|
||||
|
||||
.isMedium {
|
||||
// hide album column
|
||||
.songlist-item {
|
||||
grid-template-columns: 1.75rem 1.5fr 1fr 5.5rem;
|
||||
}
|
||||
// hide album column
|
||||
.songlist-item {
|
||||
grid-template-columns: 1.75rem 1.5fr 1fr 7.5rem;
|
||||
}
|
||||
|
||||
.song-album {
|
||||
display: none !important;
|
||||
}
|
||||
.song-album {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ input[type="search"]::-webkit-search-cancel-button {
|
||||
|
||||
.heading {
|
||||
font-size: 1.5rem;
|
||||
font-weight: bold;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
a {
|
||||
@@ -72,18 +72,22 @@ a {
|
||||
|
||||
// BUTTONS
|
||||
button {
|
||||
border: none;
|
||||
font-family: "SF Compact Display", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif,
|
||||
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
font-size: 0.9rem !important;
|
||||
font-weight: 700;
|
||||
line-height: 1.2;
|
||||
color: inherit;
|
||||
border-radius: $small;
|
||||
border: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 2.25rem;
|
||||
padding: 0 $small;
|
||||
transition: background-color 0.2s ease-out, color 0.2s ease-out, border 0.2s ease-out;
|
||||
|
||||
background-color: $gray4;
|
||||
font-weight: 700;
|
||||
cursor: pointer;
|
||||
|
||||
svg {
|
||||
@@ -171,7 +175,7 @@ button {
|
||||
}
|
||||
|
||||
.spinner {
|
||||
border: solid 3px rgb(0, 0, 0);
|
||||
border: solid 3px rgb(221, 217, 217);
|
||||
border-top: solid 3px transparent;
|
||||
border-left: solid 3px transparent;
|
||||
border-radius: 50%;
|
||||
@@ -222,7 +226,7 @@ button {
|
||||
text-transform: uppercase;
|
||||
font-size: 11px;
|
||||
color: $purple;
|
||||
font-weight: bold;
|
||||
font-weight: 700;
|
||||
margin: $smaller 0;
|
||||
|
||||
&.album {
|
||||
@@ -240,4 +244,32 @@ button {
|
||||
&.playlist {
|
||||
color: $green;
|
||||
}
|
||||
|
||||
&.mix {
|
||||
color: $lightbrown;
|
||||
}
|
||||
}
|
||||
|
||||
// Badges used in settings
|
||||
.badge {
|
||||
margin-left: $small;
|
||||
opacity: 0.75;
|
||||
padding: 0 $smaller;
|
||||
border-radius: $smaller;
|
||||
font-size: 12px !important;
|
||||
}
|
||||
|
||||
.experimental {
|
||||
border: solid 1px $yellow;
|
||||
color: $yellow;
|
||||
}
|
||||
|
||||
.badge.new {
|
||||
background-color: $blue;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.explicit-icon {
|
||||
width: 0.9rem;
|
||||
margin-left: $smaller;
|
||||
}
|
||||
@@ -1,47 +1,90 @@
|
||||
@import "./app-grid.scss", "./controls.scss", "./inputs.scss",
|
||||
"./scrollbars.scss", "./state.scss", "./variants.scss", "./basic.scss",
|
||||
"./search-tabheaders.scss", "./album-grid.scss";
|
||||
@import "./app-grid.scss", "./controls.scss", "./inputs.scss", "./scrollbars.scss", "./state.scss", "./variants.scss",
|
||||
"./basic.scss", "./search-tabheaders.scss", "./album-grid.scss";
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#vue-recycle-scroller__item-wrapper {
|
||||
overflow: visible !important;
|
||||
overflow: visible !important;
|
||||
}
|
||||
|
||||
html {
|
||||
cursor: default !important;
|
||||
overflow: hidden;
|
||||
cursor: default !important;
|
||||
overflow: hidden;
|
||||
color: $white;
|
||||
background-color: $body;
|
||||
|
||||
& > * {
|
||||
overflow: visible !important;
|
||||
-webkit-tap-highlight-color: transparent; /* Webkit browsers like Safari */
|
||||
tap-highlight-color: transparent; /* Some Android browsers */
|
||||
outline: none;
|
||||
}
|
||||
& > * {
|
||||
overflow: visible !important;
|
||||
-webkit-tap-highlight-color: transparent; /* Webkit browsers like Safari */
|
||||
tap-highlight-color: transparent; /* Some Android browsers */
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
html.loading,
|
||||
html.loading * {
|
||||
cursor: progress !important;
|
||||
cursor: progress !important;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: $body;
|
||||
color: $white;
|
||||
font-family: "SFCompactDisplay", -apple-system, BlinkMacSystemFont, "Segoe UI",
|
||||
Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
|
||||
"Segoe UI Symbol";
|
||||
font-size: 1rem;
|
||||
image-rendering: -webkit-optimize-contrast;
|
||||
height: 100vh;
|
||||
width: 100vw;
|
||||
overflow: hidden;
|
||||
margin: 0;
|
||||
font-family: "SF Compact Display", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial,
|
||||
sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
font-size: 1rem;
|
||||
font-weight: 400;
|
||||
color: $white;
|
||||
image-rendering: -webkit-optimize-contrast;
|
||||
text-rendering: optimizeLegibility;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
height: 100vh;
|
||||
height: 100dvh;
|
||||
width: 100vw;
|
||||
width: 100dvw;
|
||||
overflow: hidden;
|
||||
margin: 0;
|
||||
background-color: $body;
|
||||
color-scheme: dark;
|
||||
|
||||
#app {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
#app {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.noSelect {
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.dimmer {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@include allPhones {
|
||||
.dimmer {
|
||||
display: block;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 1001;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: visible;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
background-color: rgb(0, 0, 0, 0.6);
|
||||
transition: opacity 300ms ease, visibility 300ms ease;
|
||||
}
|
||||
|
||||
.dimmer.active {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,20 @@
|
||||
input[type="number"] {
|
||||
width: 40px;
|
||||
padding: 4px 5px;
|
||||
border-radius: 3px;
|
||||
input {
|
||||
font-family: 'SF Compact Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial,
|
||||
sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
|
||||
font-weight: 500;
|
||||
|
||||
&::placeholder {
|
||||
color: #d1d1d1;
|
||||
opacity: 0.5;
|
||||
}
|
||||
}
|
||||
|
||||
input[type="search"] {
|
||||
height: 2.25rem !important;
|
||||
input[type='number'] {
|
||||
width: 40px;
|
||||
padding: 4px 5px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
input[type='search'] {
|
||||
height: 2.25rem !important;
|
||||
}
|
||||
|
||||
@@ -1,23 +1,84 @@
|
||||
::-webkit-scrollbar {
|
||||
width: 3px;
|
||||
/* Total width */
|
||||
.designatedOS ::-webkit-scrollbar {
|
||||
background-color: $body;
|
||||
width: 12px;
|
||||
}
|
||||
|
||||
/* Track */
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
border-radius: 1rem;
|
||||
/* Background of the scrollbar except button or resizer */
|
||||
.designatedOS ::-webkit-scrollbar-track {
|
||||
background-color: $body;
|
||||
}
|
||||
|
||||
/* Handle */
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: $gray1;
|
||||
border-radius: 1rem;
|
||||
/* Scrollbar itself */
|
||||
.designatedOS ::-webkit-scrollbar-thumb {
|
||||
background-color: $gray2;
|
||||
border-radius: 16px;
|
||||
border: 3px solid $body;
|
||||
}
|
||||
|
||||
/* Handle on hover */
|
||||
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background: $blue;
|
||||
.designatedOS ::-webkit-scrollbar-thumb:hover {
|
||||
background-color: $gray1;
|
||||
}
|
||||
|
||||
/* Custom scrollbar version for dropdowns etc */
|
||||
/* Context dropdown menus */
|
||||
.designatedOS .context-item .children > .wrapper::-webkit-scrollbar {
|
||||
width: 6px !important;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
.designatedOS .context-item .children > .wrapper::-webkit-scrollbar-track {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
.designatedOS .context-item .children > .wrapper::-webkit-scrollbar-thumb {
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
.designatedOS .context-item .children > .wrapper::-webkit-scrollbar-thumb:hover {
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
/* Scrollable divs */
|
||||
.designatedOS .scrollable::-webkit-scrollbar {
|
||||
width: 6px !important;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
.designatedOS .scrollable::-webkit-scrollbar-track {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
.designatedOS .scrollable::-webkit-scrollbar-thumb {
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
.designatedOS .scrollable::-webkit-scrollbar-thumb:hover {
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
/* Settings modal */
|
||||
.designatedOS .settingssidebar::-webkit-scrollbar-track {
|
||||
background-color: $gray;
|
||||
}
|
||||
|
||||
.designatedOS .settingssidebar::-webkit-scrollbar-thumb {
|
||||
border-color: $gray;
|
||||
}
|
||||
|
||||
.designatedOS .settingsmodalcontent::-webkit-scrollbar-track {
|
||||
background-color: $black;
|
||||
}
|
||||
|
||||
.designatedOS .settingsmodalcontent::-webkit-scrollbar-thumb {
|
||||
border-color: $black;
|
||||
}
|
||||
|
||||
/* Login modal */
|
||||
.designatedOS .loginmodal .alcontent::-webkit-scrollbar-track {
|
||||
background-color: $black;
|
||||
}
|
||||
|
||||
.designatedOS .loginmodal .alcontent::-webkit-scrollbar-thumb {
|
||||
border-color: $black;
|
||||
}
|
||||
|
||||
@@ -9,8 +9,10 @@
|
||||
background-color: $gray5;
|
||||
border: none;
|
||||
|
||||
transition: all 0.3s ease;
|
||||
transition: background-color 0.3s ease, color 0.3s ease;
|
||||
padding: 0 $medium;
|
||||
line-height: 1.2;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.activetab {
|
||||
|
||||
@@ -1,16 +1,61 @@
|
||||
|
||||
.now-playing-track-indicator {
|
||||
background-image: url(../../assets/icons/playing.gif);
|
||||
height: 2rem;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 2rem;
|
||||
height: 2rem;
|
||||
border-radius: 50%;
|
||||
background-color: $white;
|
||||
background-size: 1.5rem !important;
|
||||
transition: opacity 0.2s ease-out, visibility 0.2s ease-out;
|
||||
|
||||
&.active {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
#wave {
|
||||
fill: #000000;
|
||||
width: 28px;
|
||||
height: auto;
|
||||
|
||||
@for $i from 1 through 9 {
|
||||
#Line_#{$i} {
|
||||
animation: pulse 0.6s infinite;
|
||||
animation-delay: $i * 0.12s;
|
||||
transform: scaleY(0.8);
|
||||
transform-origin: center;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0% {
|
||||
transform: scaleY(0.8);
|
||||
transform-origin: 50% 50%;
|
||||
}
|
||||
|
||||
50% {
|
||||
transform: scaleY(0.6);
|
||||
transform-origin: 50% 50%;
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: scaleY(0.8);
|
||||
transform-origin: 50% 50%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.last_played {
|
||||
background-image: url(../../assets/icons/playing.webp);
|
||||
transition: all 0.3s ease-in-out;
|
||||
.now-playing-track-indicator.last_played {
|
||||
#wave {
|
||||
@for $i from 1 through 9 {
|
||||
#Line_#{$i} {
|
||||
animation-play-state: paused;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.hidden {
|
||||
|
||||
@@ -1,78 +1,78 @@
|
||||
input[type="range"] {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
margin-right: 15px;
|
||||
width: calc(100% - 2px);
|
||||
height: 0.3rem;
|
||||
border-radius: 5px;
|
||||
background: $gray4 linear-gradient(37deg, white, white) no-repeat;
|
||||
background-size: 100% 100%;
|
||||
cursor: pointer;
|
||||
|
||||
&::-webkit-slider-thumb {
|
||||
-webkit-appearance: none;
|
||||
|
||||
height: 0;
|
||||
width: 0.8rem;
|
||||
border-radius: 50%;
|
||||
background: white;
|
||||
}
|
||||
|
||||
&::-moz-range-thumb {
|
||||
input[type='range'] {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
margin-right: 15px;
|
||||
width: calc(100% - 2px);
|
||||
height: 0.3rem;
|
||||
border-radius: 5px;
|
||||
background: $gray4;
|
||||
background-size: 100% 100%;
|
||||
cursor: pointer;
|
||||
|
||||
height: 0;
|
||||
border-radius: 50%;
|
||||
background: white;
|
||||
border: none;
|
||||
}
|
||||
&::-webkit-slider-thumb {
|
||||
-webkit-appearance: none;
|
||||
|
||||
&::-ms-thumb {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
height: 0;
|
||||
width: 0.8rem;
|
||||
border-radius: 50%;
|
||||
background: white;
|
||||
}
|
||||
|
||||
height: 0;
|
||||
width: 0.8rem;
|
||||
border-radius: 50%;
|
||||
background: white;
|
||||
border: none;
|
||||
}
|
||||
&::-moz-range-thumb {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
|
||||
height: 0;
|
||||
border-radius: 50%;
|
||||
background: white;
|
||||
border: none;
|
||||
}
|
||||
|
||||
&::-ms-thumb {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
|
||||
height: 0;
|
||||
width: 0.8rem;
|
||||
border-radius: 50%;
|
||||
background: white;
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* Input Thumb */
|
||||
input[type="range"]::-webkit-slider-thumb:hover {
|
||||
background: $accent;
|
||||
input[type='range']::-webkit-slider-thumb:hover {
|
||||
background: $accent;
|
||||
}
|
||||
|
||||
input[type="range"]::-moz-range-thumb:hover {
|
||||
background: $accent;
|
||||
input[type='range']::-moz-range-thumb:hover {
|
||||
background: $accent;
|
||||
}
|
||||
|
||||
input[type="range"]::-ms-thumb:hover {
|
||||
background: $accent;
|
||||
input[type='range']::-ms-thumb:hover {
|
||||
background: $accent;
|
||||
}
|
||||
|
||||
/* Input Track */
|
||||
input[type="range"]::-webkit-slider-runnable-track {
|
||||
-webkit-appearance: none;
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
background: transparent;
|
||||
input[type='range']::-webkit-slider-runnable-track {
|
||||
-webkit-appearance: none;
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
input[type="range"]::-moz-range-track {
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
background: transparent;
|
||||
input[type='range']::-moz-range-track {
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
input[type="range"]::-ms-track {
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
background: transparent;
|
||||
input[type='range']::-ms-track {
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
@@ -5,51 +5,47 @@
|
||||
}
|
||||
|
||||
// media query mixins
|
||||
@mixin smallPhone {
|
||||
@media (max-width: 550px) {
|
||||
@mixin smallestPhones {
|
||||
@media only screen and (max-width: 320px) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin iphoneSE {
|
||||
@media (max-width: 386px) {
|
||||
@mixin smallerPhones {
|
||||
@media only screen and (max-width: 360px) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin allPhones {
|
||||
@media (max-width: 900px) {
|
||||
@mixin smallPhones {
|
||||
@media only screen and (max-width: 420px) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
/* This query is "synced" with content-width.ts values */
|
||||
@mixin mediumPhones {
|
||||
@media only screen and (max-width: 460px) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
/* This query is "synced" with content-width.ts values */
|
||||
@mixin largePhones {
|
||||
// 550px <= width < 900px
|
||||
@media (min-width: 550px) {
|
||||
@media only screen and (max-width: 660px) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin tablet-landscape {
|
||||
@media (max-width: 1080px) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin tablet-portrait {
|
||||
@media (max-width: 810px) {
|
||||
/* This query is "synced" with content-width.ts and index.ts values */
|
||||
@mixin allPhones {
|
||||
@media only screen and (max-width: 900px) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin for-desktop-down {
|
||||
@media (max-width: 1600px) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin for-desktop-up {
|
||||
@media (min-width: 1800px) {
|
||||
@media only screen and (max-width: 1600px) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ $theme: #464545fd;
|
||||
// sizes
|
||||
$small: 0.5rem;
|
||||
$smaller: 0.25rem;
|
||||
$smallest: 0.15rem;
|
||||
$medium: 0.75rem;
|
||||
$large: 1.5rem;
|
||||
$larger: 2rem;
|
||||
@@ -20,25 +21,27 @@ $content-padding-bottom: 2rem;
|
||||
$black: #181a1c;
|
||||
$white: #ffffffde;
|
||||
|
||||
$gray: #1c1c1e;
|
||||
$gray1: rgb(142, 142, 147);
|
||||
$gray2: rgb(99, 99, 102);
|
||||
$gray3: rgb(72, 72, 74);
|
||||
$gray4: rgb(58, 58, 60);
|
||||
$gray5: rgb(44, 44, 46);
|
||||
$body: #111111;
|
||||
$gray: #1a1919;
|
||||
$gray1: #8e8e93;
|
||||
$gray2: #636366;
|
||||
$gray3: #48484a;
|
||||
$gray4: #3a3a3c;
|
||||
$gray5: #2c2c2e;
|
||||
$body: #000;
|
||||
|
||||
$red: #ff453a;
|
||||
$red: #f7635c;
|
||||
$blue: #0a84ff;
|
||||
$darkblue: #055ee2;
|
||||
$green: rgb(94, 247, 132);
|
||||
$green: #5ef784;
|
||||
$yellow: rgb(255, 214, 10);
|
||||
$orange: #ff9f0a;
|
||||
$pink: rgb(255, 55, 95);
|
||||
$purple: #bf5af2;
|
||||
$brown: rgb(172, 142, 104);
|
||||
$brown: #ac8e68;
|
||||
$indigo: #5e5ce6;
|
||||
$teal: rgb(64, 200, 224);
|
||||
$lightbrown: #ebca89;
|
||||
$bars: #111111;
|
||||
|
||||
$primary: $gray4;
|
||||
$accent: $gray1;
|
||||
@@ -59,11 +62,10 @@ $separator: $gray4;
|
||||
$margright: 0;
|
||||
$padbottom: 4rem;
|
||||
$maxwidth: 1438px;
|
||||
$navheight: 5rem;
|
||||
$navheight: 4.5rem;
|
||||
$cardwidth: 10.75rem;
|
||||
$maxpadleft: 5rem;
|
||||
|
||||
|
||||
$alt_layout_pad: max(2rem, calc((100% - 1280px) / 2));
|
||||
|
||||
$maxpadright: calc(100% - $maxwidth);
|
||||
|
||||
@@ -1,15 +1,43 @@
|
||||
@import
|
||||
"./mixins.scss",
|
||||
"./variables",
|
||||
"./ProgressBar.scss",
|
||||
"./BottomBar/BottomBar.scss",
|
||||
"./Global"
|
||||
;
|
||||
|
||||
@import "./mixins.scss", "./variables", "./ProgressBar.scss", "./BottomBar/BottomBar.scss", "./Global";
|
||||
|
||||
/* San Francisco Compact Display font */
|
||||
@font-face {
|
||||
font-family: "SFCompactDisplay";
|
||||
src: url("../sf-compact.woff") format("woff");
|
||||
font-display: swap;
|
||||
font-family: "SF Compact Display";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("../fonts/SFCompactDisplay-Regular.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "SF Compact Display";
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("../fonts/SFCompactDisplay-Medium.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "SF Compact Display";
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
font-display: swap;
|
||||
src: url("../fonts/SFCompactDisplay-Semibold.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "SF Compact Display";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("../fonts/SFCompactDisplay-Bold.woff2") format("woff2");
|
||||
}
|
||||
|
||||
/* San Francisco Mono font */
|
||||
@font-face {
|
||||
font-family: "SF Mono";
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("../fonts/sf-mono-medium.woff2") format("woff2");
|
||||
}
|
||||
|
||||
@@ -1,32 +1,65 @@
|
||||
<template>
|
||||
<div
|
||||
v-if="album_disc.is_album_disc_number"
|
||||
class="album_disc_header no-select"
|
||||
>
|
||||
<div class="disc_number">Disc {{ album_disc.album_page_disc_number }}</div>
|
||||
<div></div>
|
||||
</div>
|
||||
<div v-if="album_disc.is_album_disc_number" class="album_disc_header no-select">
|
||||
<div class="disc_number">
|
||||
Disc {{ album_disc.album_page_disc_number }}
|
||||
<span @click="$emit('playDisc', album_disc.album_page_disc_number || 0)" class="play">
|
||||
<PlaySvg /> Play Disc {{ album_disc.album_page_disc_number }}</span
|
||||
>
|
||||
</div>
|
||||
<div class="play"></div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { AlbumDisc } from "@/interfaces";
|
||||
import PlaySvg from '@/assets/icons/play.svg'
|
||||
import { AlbumDisc } from '@/interfaces'
|
||||
|
||||
defineProps<{
|
||||
album_disc: AlbumDisc;
|
||||
}>();
|
||||
album_disc: AlbumDisc
|
||||
}>()
|
||||
|
||||
defineEmits<{
|
||||
(e: 'playDisc', disc_number: number): void
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.album_disc_header {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr max-content;
|
||||
align-items: center;
|
||||
padding-left: 1rem;
|
||||
height: $song-item-height;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr max-content;
|
||||
align-items: center;
|
||||
padding-left: 1rem;
|
||||
margin-top: $small;
|
||||
height: $song-item-height;
|
||||
|
||||
.disc_number {
|
||||
font-size: $medium;
|
||||
opacity: 0.75;
|
||||
}
|
||||
.disc_number {
|
||||
font-size: $medium;
|
||||
font-weight: 500;
|
||||
opacity: 0.75;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.play {
|
||||
margin-left: $small;
|
||||
opacity: 0;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
transition: opacity 0.2s ease-out;
|
||||
|
||||
svg {
|
||||
height: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 724px) {
|
||||
padding-left: 0.5rem !important;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.play {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -11,22 +11,22 @@
|
||||
</div>
|
||||
<div
|
||||
v-for="genre in genres"
|
||||
:key="genre"
|
||||
:key="genre.genrehash"
|
||||
class="genre-pill rounded pad-sm"
|
||||
:style="{
|
||||
backgroundColor: color,
|
||||
}"
|
||||
>
|
||||
{{ genre }}
|
||||
{{ genre.name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, onMounted } from "vue";
|
||||
import useAlbumStore from "@/stores/pages/album";
|
||||
import useArtistStore from "@/stores/pages/artist";
|
||||
import { computed, onMounted } from "vue";
|
||||
|
||||
import { getShift } from "@/utils/colortools/shift";
|
||||
|
||||
@@ -38,22 +38,22 @@ const props = defineProps<{
|
||||
}>();
|
||||
|
||||
const genres = computed(() => {
|
||||
return props.source === "album" ? album.info.genres : store.genres;
|
||||
return props.source === "album" ? album.info.genres : store.info.genres;
|
||||
});
|
||||
|
||||
const color = computed(() => {
|
||||
return props.source === "album" ? album.colors.btn : "";
|
||||
});
|
||||
|
||||
const hookAction = async () => {
|
||||
if (props.source === "album") {
|
||||
// fetch data to be used in the component below this one.
|
||||
await album.fetchArtistAlbums();
|
||||
return;
|
||||
}
|
||||
};
|
||||
// const hookAction = async () => {
|
||||
// if (props.source === "album") {
|
||||
// // fetch data to be used in the component below this one.
|
||||
// await album.fetchArtistAlbums();
|
||||
// return;
|
||||
// }
|
||||
// };
|
||||
|
||||
onMounted(hookAction);
|
||||
// onMounted(hookAction);
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@@ -74,6 +74,7 @@ onMounted(hookAction);
|
||||
gap: 1rem;
|
||||
padding-right: $medium;
|
||||
overflow-x: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
.genre-pill {
|
||||
@@ -82,6 +83,7 @@ onMounted(hookAction);
|
||||
text-align: center;
|
||||
padding: $small 1rem;
|
||||
font-weight: 700;
|
||||
transition: background-color 0.2s ease-out, color 0.2s ease-out;
|
||||
|
||||
&:first-child {
|
||||
background-color: white;
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
<template>
|
||||
<div v-if="!isSmallPhone" v-auto-animate class="albumtype">
|
||||
<span v-if="album.is_soundtrack">Soundtrack</span>
|
||||
<span v-else-if="album.is_live">Concert</span>
|
||||
<span v-else-if="album.is_compilation">Compilation</span>
|
||||
<span v-else-if="album.is_EP">EP</span>
|
||||
<span v-else-if="album.is_single">Single</span>
|
||||
<span v-else>Album</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Album } from "@/interfaces";
|
||||
import { isSmallPhone } from "@/stores/content-width";
|
||||
|
||||
defineProps<{
|
||||
album: Album;
|
||||
}>();
|
||||
</script>
|
||||
|
||||
<style lang="scss"></style>
|
||||
@@ -1,7 +1,8 @@
|
||||
<template>
|
||||
<div class="album-info" :style="{ color: textColor }">
|
||||
<div class="top">
|
||||
<AlbumType :album="album" />
|
||||
<!-- <AlbumType :album="album" /> -->
|
||||
<div class="albumtype">{{ album.type }}</div>
|
||||
<div id="albumheadertitle" class="title ellip2">
|
||||
<span v-for="t in titleSplits" :key="t">{{ t }}<br /></span>
|
||||
</div>
|
||||
@@ -72,6 +73,7 @@ onBeforeRouteUpdate(() => {
|
||||
.albumtype {
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
.title {
|
||||
|
||||
@@ -6,10 +6,11 @@
|
||||
:albumartists="''"
|
||||
:small="true"
|
||||
:append="!isSmallPhone ? statsText : ''"
|
||||
:prepend="isSmallPhone ? 'Album by ' : ''"
|
||||
/>
|
||||
</div>
|
||||
<div v-if="isSmallPhone" class="stats2">
|
||||
{{ album.date }} {{ !album.is_single ? `• ${album.count} Tracks` : "" }} •
|
||||
{{ new Date(album.date * 1000).getFullYear() }} {{ !album.is_single ? `• ${album.trackcount} Tracks` : "" }} •
|
||||
{{ formatSeconds(album.duration, true) }}
|
||||
</div>
|
||||
</div>
|
||||
@@ -19,8 +20,8 @@
|
||||
import { computed } from "vue";
|
||||
|
||||
import { Album } from "@/interfaces";
|
||||
import { formatSeconds } from "@/utils";
|
||||
import { isSmallPhone } from "@/stores/content-width";
|
||||
import { formatSeconds } from "@/utils";
|
||||
|
||||
import ArtistName from "@/components/shared/ArtistName.vue";
|
||||
|
||||
@@ -32,19 +33,15 @@ const statsText = computed(() => {
|
||||
const is_single = props.album.is_single;
|
||||
|
||||
// hide track count if it's a single, also add an s to track if it's plural
|
||||
return `• ${props.album.date} ${
|
||||
!is_single
|
||||
? `• ${props.album.count.toLocaleString()} Track${
|
||||
props.album.count > 1 ? "s" : ""
|
||||
}`
|
||||
: ""
|
||||
return `• ${new Date(props.album.date * 1000).getFullYear()} ${
|
||||
!is_single ? `• ${props.album.trackcount.toLocaleString()} Track${props.album.trackcount > 1 ? "s" : ""}` : ""
|
||||
} • ${formatSeconds(props.album.duration, true)}`;
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.album-stats {
|
||||
font-weight: bold;
|
||||
font-weight: 700;
|
||||
margin-bottom: 0.75rem;
|
||||
font-size: 14px;
|
||||
padding-left: $smaller;
|
||||
|
||||
@@ -1,153 +1,157 @@
|
||||
<template>
|
||||
<div
|
||||
class="album-header-ambient rounded-lg"
|
||||
style="height: 100%; width: 100%"
|
||||
:style="{
|
||||
boxShadow: colors.bg ? `0 .5rem 2rem ${colors.bg}` : '0 .5rem 2rem black',
|
||||
}"
|
||||
></div>
|
||||
<div
|
||||
ref="albumheaderthing"
|
||||
class="a-header rounded-lg"
|
||||
:style="{
|
||||
background: colors.bg ? colors.bg : '',
|
||||
}"
|
||||
>
|
||||
<div
|
||||
class="big-img no-scroll"
|
||||
:class="`${isHeaderSmall ? 'imgSmall' : ''} shadow-lg rounded-sm`"
|
||||
class="album-header-ambient rounded-lg"
|
||||
style="height: 100%; width: 100%"
|
||||
:style="{
|
||||
boxShadow:
|
||||
// hide shadow on small screen
|
||||
isSmallPhone ? '' : colors.bg ? `0 .5rem 2rem ${colors.bg}` : '0 .5rem 2rem black',
|
||||
}"
|
||||
></div>
|
||||
<div
|
||||
ref="albumheaderthing"
|
||||
class="a-header rounded-lg"
|
||||
:style="{
|
||||
// hide background on small screen
|
||||
background: isSmallPhone ? '' : colors.bg ? colors.bg : '',
|
||||
}"
|
||||
>
|
||||
<img :src="imguri.thumb.large + album.image" class="rounded-sm" />
|
||||
<div class="big-img no-scroll" :class="`${isHeaderSmall ? 'imgSmall' : ''} shadow-lg rounded-sm`">
|
||||
<img :src="imguri.thumb.large + album.image" class="rounded-sm" />
|
||||
</div>
|
||||
<Info />
|
||||
</div>
|
||||
<Info />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from "vue";
|
||||
import { storeToRefs } from "pinia";
|
||||
import { storeToRefs } from 'pinia'
|
||||
import { ref } from 'vue'
|
||||
|
||||
import { paths } from "@/config";
|
||||
import { isHeaderSmall } from "@/stores/content-width";
|
||||
import { paths } from '@/config'
|
||||
import { isHeaderSmall, isSmallPhone } from '@/stores/content-width'
|
||||
|
||||
import useNavStore from "@/stores/nav";
|
||||
import useAlbumStore from "@/stores/pages/album";
|
||||
import useNavStore from '@/stores/nav'
|
||||
import useAlbumStore from '@/stores/pages/album'
|
||||
|
||||
import Info from "@/components/AlbumView/Header/Info.vue";
|
||||
import useVisibility from "@/utils/useVisibility";
|
||||
import Info from '@/components/AlbumView/Header/Info.vue'
|
||||
import useVisibility from '@/utils/useVisibility'
|
||||
|
||||
const albumheaderthing = ref<any>(null);
|
||||
const imguri = paths.images;
|
||||
const albumheaderthing = ref<any>(null)
|
||||
const imguri = paths.images
|
||||
|
||||
const nav = useNavStore();
|
||||
const store = useAlbumStore();
|
||||
const nav = useNavStore()
|
||||
const store = useAlbumStore()
|
||||
|
||||
const { info: album, colors } = storeToRefs(store);
|
||||
const { info: album, colors } = storeToRefs(store)
|
||||
|
||||
defineEmits<{
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
(event: "playThis"): void;
|
||||
}>();
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
(event: 'playThis'): void
|
||||
}>()
|
||||
|
||||
function handleVisibilityState(state: boolean) {
|
||||
nav.toggleShowPlay(state);
|
||||
nav.toggleShowPlay(state)
|
||||
}
|
||||
|
||||
useVisibility(albumheaderthing, handleVisibilityState);
|
||||
useVisibility(albumheaderthing, handleVisibilityState)
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.balance-text-temp {
|
||||
visibility: hidden;
|
||||
position: absolute;
|
||||
top: -9999px;
|
||||
left: -9999px;
|
||||
visibility: hidden;
|
||||
position: absolute;
|
||||
top: -9999px;
|
||||
left: -9999px;
|
||||
}
|
||||
|
||||
.album-header-ambient {
|
||||
width: 20rem;
|
||||
position: absolute;
|
||||
z-index: -100 !important;
|
||||
opacity: 0.25;
|
||||
width: 20rem;
|
||||
position: absolute;
|
||||
z-index: -100 !important;
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
.a-header {
|
||||
display: grid;
|
||||
grid-template-columns: max-content 1fr;
|
||||
gap: 1rem;
|
||||
padding: 1rem;
|
||||
height: $banner-height;
|
||||
background-color: $black;
|
||||
align-items: flex-end;
|
||||
|
||||
.big-img {
|
||||
height: 16rem;
|
||||
display: flex;
|
||||
display: grid;
|
||||
grid-template-columns: max-content 1fr;
|
||||
gap: 1rem;
|
||||
padding: 1rem;
|
||||
height: $banner-height;
|
||||
// background-color: $black;
|
||||
align-items: flex-end;
|
||||
|
||||
img {
|
||||
height: 16rem;
|
||||
max-width: 16rem;
|
||||
object-fit: contain;
|
||||
}
|
||||
}
|
||||
|
||||
.big-img.imgSmall {
|
||||
width: 12rem;
|
||||
height: 12rem;
|
||||
|
||||
img {
|
||||
height: 12rem;
|
||||
}
|
||||
}
|
||||
|
||||
.nocontrast {
|
||||
color: $black;
|
||||
|
||||
.top {
|
||||
.albumtype {
|
||||
color: $pink;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@include smallPhone {
|
||||
grid-template-columns: 1fr;
|
||||
padding: 2rem 1rem;
|
||||
height: 25rem;
|
||||
|
||||
.big-img {
|
||||
width: 10rem !important;
|
||||
height: 10rem !important;
|
||||
aspect-ratio: 1;
|
||||
margin: 0 auto;
|
||||
height: 16rem;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
|
||||
img {
|
||||
height: 10rem !important;
|
||||
}
|
||||
img {
|
||||
height: 16rem;
|
||||
max-width: 16rem;
|
||||
object-fit: contain;
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 1.5rem !important;
|
||||
max-width: fit-content;
|
||||
margin: 0 auto;
|
||||
text-align: center;
|
||||
.big-img.imgSmall {
|
||||
width: 12rem;
|
||||
height: 12rem;
|
||||
|
||||
img {
|
||||
height: 12rem;
|
||||
}
|
||||
}
|
||||
|
||||
.album-buttons {
|
||||
justify-content: center;
|
||||
.nocontrast {
|
||||
color: $black;
|
||||
|
||||
.top {
|
||||
.albumtype {
|
||||
color: $pink;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.album-stats > div {
|
||||
border: none;
|
||||
margin: $small auto;
|
||||
}
|
||||
@include largePhones {
|
||||
grid-template-columns: 1fr;
|
||||
padding: 2rem 1rem;
|
||||
height: 25rem;
|
||||
|
||||
.versions {
|
||||
margin-bottom: 0 !important;
|
||||
margin-left: 0 !important;
|
||||
text-align: center;
|
||||
.big-img {
|
||||
width: 14rem !important;
|
||||
height: 14rem !important;
|
||||
aspect-ratio: 1;
|
||||
margin: 0 auto;
|
||||
|
||||
img {
|
||||
height: 14rem !important;
|
||||
}
|
||||
}
|
||||
|
||||
.albumtype {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 1.5rem !important;
|
||||
max-width: fit-content;
|
||||
margin: 0 auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.album-buttons {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.album-stats > div {
|
||||
border: none;
|
||||
margin: $small auto;
|
||||
}
|
||||
|
||||
.versions {
|
||||
margin-bottom: 0 !important;
|
||||
margin-left: 0 !important;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,198 +1,177 @@
|
||||
<template>
|
||||
<div
|
||||
v-if="!on_sidebar"
|
||||
class="artist-header-ambient rounded-lg"
|
||||
:class="{ isSmallPhone }"
|
||||
style="height: 100%; width: 100%"
|
||||
:style="{
|
||||
boxShadow: !useCircularImage
|
||||
? colors.bg.length
|
||||
? `0 .5rem 2rem ${colors.bg}`
|
||||
: undefined
|
||||
: undefined,
|
||||
}"
|
||||
></div>
|
||||
<div
|
||||
ref="artistheader"
|
||||
class="artist-page-header rounded-lg no-scroll"
|
||||
:class="{ isSmallPhone, useCircularImage }"
|
||||
:style="{
|
||||
height: `${isSmallPhone ? '25rem' : containerHeight}`,
|
||||
}"
|
||||
>
|
||||
<Info :artist="artist" :use-circular-image="useCircularImage" />
|
||||
<div
|
||||
class="artist-img no-select"
|
||||
:style="{
|
||||
height: containerHeight,
|
||||
}"
|
||||
>
|
||||
<img
|
||||
id="artist-avatar"
|
||||
:src="paths.images.artist.large + artist.image"
|
||||
@load="store.setBgColor"
|
||||
/>
|
||||
<div class="headparent">
|
||||
<div
|
||||
v-if="!on_sidebar"
|
||||
class="artist-header-ambient rounded-lg"
|
||||
:class="{ isSmallPhone }"
|
||||
:style="{
|
||||
boxShadow: !useCircularImage ? (colors.bg.length ? `0 .5rem 2rem ${colors.bg}` : undefined) : undefined,
|
||||
}"
|
||||
></div>
|
||||
<div
|
||||
ref="artistheader"
|
||||
class="artist-page-header rounded-lg no-scroll"
|
||||
:class="{ isSmallPhone, useCircularImage }"
|
||||
:style="{
|
||||
height: `${isSmallPhone ? '25rem' : containerHeight}`,
|
||||
}"
|
||||
>
|
||||
<Info :artist="artist" :use-circular-image="useCircularImage" />
|
||||
<div
|
||||
class="artist-img no-select"
|
||||
:style="{
|
||||
height: containerHeight,
|
||||
}"
|
||||
>
|
||||
<img id="artist-avatar" :src="paths.images.artist.large + artist.image" @load="store.setBgColor" />
|
||||
</div>
|
||||
<div
|
||||
v-if="!useCircularImage"
|
||||
class="gradient"
|
||||
:style="{
|
||||
backgroundImage: colors.bg
|
||||
? `linear-gradient(${gradientDirection}, transparent ${
|
||||
isSmall ? 60 : gradientTransparentWidth - (width < 700 ? 40 : width < 900 ? 20 : 10)
|
||||
}%,
|
||||
${colors.bg} ${gradientWidth}%,
|
||||
${colors.bg} 100%)`
|
||||
: '',
|
||||
}"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="!useCircularImage"
|
||||
class="gradient"
|
||||
:style="{
|
||||
backgroundImage: colors.bg
|
||||
? `linear-gradient(${gradientDirection}, transparent ${
|
||||
isSmall
|
||||
? 60
|
||||
: gradientTransparentWidth -
|
||||
(width < 700 ? 40 : width < 900 ? 20 : 10)
|
||||
}%,
|
||||
${colors.bg} ${gradientWidth}%,
|
||||
${colors.bg} 100%)`
|
||||
: '',
|
||||
}"
|
||||
></div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { storeToRefs } from "pinia";
|
||||
import { Ref, computed, onMounted, ref } from "vue";
|
||||
import { onBeforeRouteUpdate } from "vue-router";
|
||||
import { useElementSize } from "@vueuse/core";
|
||||
import useSettingsStore from "@/stores/settings";
|
||||
import useSettingsStore from '@/stores/settings'
|
||||
import { useElementSize } from '@vueuse/core'
|
||||
import { storeToRefs } from 'pinia'
|
||||
import { Ref, computed, onMounted, ref } from 'vue'
|
||||
import { onBeforeRouteUpdate } from 'vue-router'
|
||||
|
||||
import { paths } from "@/config";
|
||||
import updatePageTitle from "@/utils/updatePageTitle";
|
||||
import { paths } from '@/config'
|
||||
import updatePageTitle from '@/utils/updatePageTitle'
|
||||
|
||||
import Info from "./HeaderComponents/Info.vue";
|
||||
import useArtistStore from "@/stores/pages/artist";
|
||||
import { getShift } from "@/utils/colortools/shift";
|
||||
import { isSmall } from "@/stores/content-width";
|
||||
import { isSmall } from '@/stores/content-width'
|
||||
import useArtistStore from '@/stores/pages/artist'
|
||||
import Info from './HeaderComponents/Info.vue'
|
||||
|
||||
const image_width_px = 450;
|
||||
const store = useArtistStore();
|
||||
const settings = useSettingsStore();
|
||||
const image_width_px = 450
|
||||
const store = useArtistStore()
|
||||
const settings = useSettingsStore()
|
||||
|
||||
const props = defineProps<{
|
||||
on_sidebar?: boolean;
|
||||
}>();
|
||||
on_sidebar?: boolean
|
||||
}>()
|
||||
|
||||
const { info: artist, colors } = storeToRefs(store);
|
||||
const { info: artist, colors } = storeToRefs(store)
|
||||
|
||||
function updateTitle() {
|
||||
props.on_sidebar ? () => {} : updatePageTitle(artist.value.name);
|
||||
props.on_sidebar ? () => {} : updatePageTitle(artist.value.name)
|
||||
}
|
||||
|
||||
onMounted(() => updateTitle());
|
||||
onBeforeRouteUpdate(() => updateTitle());
|
||||
onMounted(() => updateTitle())
|
||||
onBeforeRouteUpdate(() => updateTitle())
|
||||
|
||||
const artistheader: Ref<HTMLElement | null> = ref(null);
|
||||
const { width } = useElementSize(artistheader);
|
||||
const artistheader: Ref<HTMLElement | null> = ref(null)
|
||||
const { width } = useElementSize(artistheader)
|
||||
|
||||
const gradientTransparentWidth = computed(() =>
|
||||
Math.floor((image_width_px / (width.value || 1)) * 100)
|
||||
);
|
||||
const gradientTransparentWidth = computed(() => Math.floor((image_width_px / (width.value || 1)) * 100))
|
||||
|
||||
const isSmallPhone = computed(() => width.value <= 550);
|
||||
const useCircularImage = computed(
|
||||
() => !isSmallPhone.value && settings.useCircularArtistImg
|
||||
);
|
||||
const isSmallPhone = computed(() => width.value <= 660)
|
||||
const useCircularImage = computed(() => !isSmallPhone.value && settings.useCircularArtistImg)
|
||||
|
||||
const gradientDirection = computed(() =>
|
||||
isSmallPhone.value ? "210deg" : "to left"
|
||||
);
|
||||
const gradientDirection = computed(() => (isSmallPhone.value ? '210deg' : 'to left'))
|
||||
|
||||
const gradientWidth = computed(() => {
|
||||
return isSmallPhone.value ? "80" : Math.min(gradientTransparentWidth.value, 50);
|
||||
});
|
||||
return isSmallPhone.value ? '80' : Math.min(gradientTransparentWidth.value, 50)
|
||||
})
|
||||
|
||||
const containerHeight = computed(() => {
|
||||
return useCircularImage.value ? "13rem" : "18rem";
|
||||
});
|
||||
return useCircularImage.value ? '13rem' : '18rem'
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.headparent {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.artist-header-ambient {
|
||||
height: 17rem;
|
||||
position: absolute;
|
||||
opacity: 0.25;
|
||||
margin-right: -1rem;
|
||||
height: 18rem;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
.artist-page-header {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 450px;
|
||||
position: relative;
|
||||
|
||||
.artist-img {
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
order: 1;
|
||||
|
||||
img {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
aspect-ratio: 1;
|
||||
object-fit: cover;
|
||||
object-position: 0% 20%;
|
||||
}
|
||||
}
|
||||
|
||||
&.useCircularImage {
|
||||
grid-template-columns: min-content 1fr;
|
||||
|
||||
.artist-img {
|
||||
padding: 1rem;
|
||||
order: -1;
|
||||
z-index: 10;
|
||||
|
||||
img {
|
||||
border-radius: 50%;
|
||||
height: calc(100% - 0rem);
|
||||
width: unset;
|
||||
aspect-ratio: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.gradient {
|
||||
position: absolute;
|
||||
background-image: linear-gradient(
|
||||
to left,
|
||||
transparent 10%,
|
||||
$gray 50%,
|
||||
$gray 100%
|
||||
);
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
|
||||
&.isSmallPhone {
|
||||
background-image: linear-gradient(
|
||||
210deg,
|
||||
transparent 20%,
|
||||
$gray 80%,
|
||||
$gray 100%
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
&.isSmallPhone {
|
||||
display: flex;
|
||||
flex-direction: column-reverse;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 450px;
|
||||
position: relative;
|
||||
|
||||
.artist-img {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
top: 0;
|
||||
height: 100% !important;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
order: 1;
|
||||
|
||||
img {
|
||||
img {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
aspect-ratio: 1;
|
||||
object-fit: cover;
|
||||
object-position: 0% 20%;
|
||||
}
|
||||
}
|
||||
|
||||
&.useCircularImage {
|
||||
grid-template-columns: min-content 1fr;
|
||||
|
||||
.artist-img {
|
||||
padding: 1rem;
|
||||
order: -1;
|
||||
z-index: 10;
|
||||
|
||||
img {
|
||||
border-radius: 50%;
|
||||
height: calc(100% - 0rem);
|
||||
width: unset;
|
||||
aspect-ratio: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.gradient {
|
||||
position: absolute;
|
||||
background-image: linear-gradient(to left, transparent 10%, $gray 50%, $gray 100%);
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
aspect-ratio: 1;
|
||||
object-fit: cover;
|
||||
object-position: 0% 20%;
|
||||
}
|
||||
|
||||
&.isSmallPhone {
|
||||
background-image: linear-gradient(210deg, transparent 20%, $gray 80%, $gray 100%);
|
||||
}
|
||||
}
|
||||
|
||||
&.isSmallPhone {
|
||||
display: flex;
|
||||
flex-direction: column-reverse;
|
||||
position: relative;
|
||||
|
||||
.artist-img {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
top: 0;
|
||||
height: 100% !important;
|
||||
|
||||
img {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
aspect-ratio: 1;
|
||||
object-fit: cover;
|
||||
object-position: 0% 20%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
:state="artist.info.is_favorite"
|
||||
:color="
|
||||
!useCircularImage
|
||||
? artist.info.colors[0]
|
||||
? artist.info.colors[0]
|
||||
? artist.info.color
|
||||
? artist.info.color
|
||||
: ''
|
||||
: ''
|
||||
"
|
||||
@@ -26,8 +26,8 @@
|
||||
import { ref } from "vue";
|
||||
|
||||
import { favType, playSources } from "@/enums";
|
||||
import favoriteHandler from "@/helpers/favoriteHandler";
|
||||
import { showArtistContextMenu } from "@/helpers/contextMenuHandler";
|
||||
import favoriteHandler from "@/helpers/favoriteHandler";
|
||||
import useArtistPageStore from "@/stores/pages/artist";
|
||||
|
||||
import MoreSvg from "@/assets/icons/more.svg";
|
||||
|
||||
@@ -1,89 +1,77 @@
|
||||
<template>
|
||||
<div
|
||||
class="artist-info"
|
||||
:style="{
|
||||
color: !useCircularImage
|
||||
? artist.colors[0]
|
||||
? getTextColor(artist.colors[0])
|
||||
: undefined
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
<section class="text">
|
||||
<div class="card-title">Artist</div>
|
||||
<div
|
||||
class="artist-name"
|
||||
:class="`${useCircularImage ? 'ellip' : 'ellip2'}`"
|
||||
:title="artist.name"
|
||||
>
|
||||
{{ artist.name }}
|
||||
</div>
|
||||
<div class="stats">
|
||||
<span v-if="artist.trackcount">
|
||||
{{ artist.trackcount.toLocaleString() }} Track{{
|
||||
`${artist.trackcount == 1 ? "" : "s"}`
|
||||
}}
|
||||
</span>
|
||||
{{ artist.albumcount && artist.trackcount.toLocaleString() ? "•" : "" }}
|
||||
<span v-if="artist.albumcount">
|
||||
{{ artist.albumcount.toLocaleString() }} Album{{
|
||||
`${artist.albumcount == 1 ? "" : "s"}`
|
||||
}}
|
||||
</span>
|
||||
<span v-if="artist.duration">
|
||||
{{ ` • ${formatSeconds(artist.duration, true)}` }}
|
||||
</span>
|
||||
</div>
|
||||
</section>
|
||||
<Buttons :use-circular-image="useCircularImage" />
|
||||
</div>
|
||||
<div
|
||||
class="artist-info"
|
||||
:style="{
|
||||
color: !useCircularImage ? (artist.color ? getTextColor(artist.color) : undefined) : undefined,
|
||||
}"
|
||||
>
|
||||
<section class="text">
|
||||
<div class="card-title">Artist</div>
|
||||
<div class="artist-name" :class="`${useCircularImage ? 'ellip' : 'ellip2'}`" :title="artist.name">
|
||||
{{ artist.name }}
|
||||
</div>
|
||||
<div class="stats">
|
||||
<span v-if="artist.trackcount">
|
||||
{{ artist.trackcount.toLocaleString() }} Track{{ `${artist.trackcount == 1 ? '' : 's'} • ` }}
|
||||
</span>
|
||||
<span v-if="artist.albumcount">
|
||||
{{ artist.albumcount.toLocaleString() }} Album{{ `${artist.albumcount == 1 ? '' : 's'} • ` }}
|
||||
</span>
|
||||
<span v-if="artist.duration">
|
||||
{{ `${formatSeconds(artist.duration, true)}` }}
|
||||
</span>
|
||||
</div>
|
||||
</section>
|
||||
<Buttons :use-circular-image="useCircularImage" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { getTextColor } from "@/utils/colortools/shift";
|
||||
import { getTextColor } from '@/utils/colortools/shift'
|
||||
|
||||
import formatSeconds from "@/utils/useFormatSeconds";
|
||||
import Buttons from "./Buttons.vue";
|
||||
import { Artist } from "@/interfaces";
|
||||
import { Artist } from '@/interfaces'
|
||||
import formatSeconds from '@/utils/useFormatSeconds'
|
||||
import Buttons from './Buttons.vue'
|
||||
|
||||
defineProps<{
|
||||
artist: Artist;
|
||||
useCircularImage?: boolean;
|
||||
}>();
|
||||
artist: Artist
|
||||
useCircularImage?: boolean
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.artist-info {
|
||||
z-index: 1;
|
||||
padding: 1rem;
|
||||
padding-right: 0;
|
||||
z-index: 1;
|
||||
padding: 1rem;
|
||||
padding-right: 0;
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-end;
|
||||
|
||||
gap: 1rem;
|
||||
|
||||
.text {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: $small;
|
||||
}
|
||||
justify-content: flex-end;
|
||||
|
||||
.card-title {
|
||||
font-size: small;
|
||||
font-weight: 700;
|
||||
}
|
||||
gap: 1rem;
|
||||
|
||||
.artist-name {
|
||||
font-size: 3.5rem;
|
||||
font-weight: bold;
|
||||
word-wrap: break-all;
|
||||
}
|
||||
.text {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: $small;
|
||||
}
|
||||
|
||||
.stats {
|
||||
font-size: small;
|
||||
font-weight: 700;
|
||||
}
|
||||
.card-title {
|
||||
font-size: small;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.artist-name {
|
||||
font-size: 3.5rem;
|
||||
font-weight: 700;
|
||||
word-wrap: break-all;
|
||||
margin-left: -1px;
|
||||
}
|
||||
|
||||
.stats {
|
||||
font-size: small;
|
||||
font-weight: 700;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,58 +1,67 @@
|
||||
<template>
|
||||
<div class="artist-top-tracks">
|
||||
<h3 class="section-title">
|
||||
{{ title }}
|
||||
<SeeAll :route="route" />
|
||||
</h3>
|
||||
<div class="tracks" :class="{ isSmall, isMedium }">
|
||||
<SongItem
|
||||
v-for="(song, index) in tracks"
|
||||
:key="index"
|
||||
:track="song"
|
||||
:index="total ? total - index : index + 1"
|
||||
:source="source"
|
||||
@playThis="playHandler(index)"
|
||||
/>
|
||||
<div class="artist-top-tracks">
|
||||
<h3 class="section-title" :class="{ isSmall, isMedium }">
|
||||
{{ title }}
|
||||
<SeeAll :route="route" />
|
||||
</h3>
|
||||
<div class="tracks" :class="{ isSmall, isMedium }">
|
||||
<SongItem
|
||||
v-for="(song, index) in tracks"
|
||||
:key="index"
|
||||
:track="song"
|
||||
:index="total ? total - index : index + 1"
|
||||
:source="source"
|
||||
@playThis="playHandler(index)"
|
||||
/>
|
||||
</div>
|
||||
<div v-if="!tracks.length" class="error">No tracks</div>
|
||||
</div>
|
||||
<div v-if="!tracks.length" class="error">No tracks</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { dropSources } from "@/enums";
|
||||
import { Track } from "@/interfaces";
|
||||
import { isMedium, isSmall } from "@/stores/content-width";
|
||||
import SeeAll from "../shared/SeeAll.vue";
|
||||
import SongItem from "../shared/SongItem.vue";
|
||||
import { dropSources } from '@/enums'
|
||||
import { Track } from '@/interfaces'
|
||||
import { isMedium, isSmall } from '@/stores/content-width'
|
||||
import SeeAll from '../shared/SeeAll.vue'
|
||||
import SongItem from '../shared/SongItem.vue'
|
||||
|
||||
defineProps<{
|
||||
tracks: Track[];
|
||||
route: string;
|
||||
title: string;
|
||||
playHandler: (index: number) => void;
|
||||
source: dropSources;
|
||||
total?: number;
|
||||
}>();
|
||||
tracks: Track[]
|
||||
route: string
|
||||
title: string
|
||||
playHandler: (index: number) => void
|
||||
source: dropSources
|
||||
total?: number
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.artist-top-tracks {
|
||||
padding-top: 1rem;
|
||||
padding-top: 1rem;
|
||||
|
||||
.section-title {
|
||||
margin-left: 0;
|
||||
align-items: baseline;
|
||||
}
|
||||
.section-title {
|
||||
margin-left: 0;
|
||||
align-items: baseline;
|
||||
}
|
||||
|
||||
.error {
|
||||
padding-left: 1rem;
|
||||
color: $red;
|
||||
}
|
||||
.section-title.isSmall {
|
||||
padding-left: 0.5rem !important;
|
||||
}
|
||||
|
||||
h3 {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding-left: 1rem !important; // applies to favorite page
|
||||
}
|
||||
.error {
|
||||
padding-left: 1rem;
|
||||
color: $red;
|
||||
}
|
||||
|
||||
h3 {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding-left: 1rem !important; // applies to favorite page
|
||||
padding-right: $small;
|
||||
|
||||
@media only screen and (max-width: 724px) {
|
||||
padding-left: $small !important; // applies to favorite page
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,172 +1,217 @@
|
||||
<template>
|
||||
<div
|
||||
class="b-bar"
|
||||
:style="{
|
||||
padding: `${settings.is_default_layout ? '0 1rem 0 1rem' : ''}`,
|
||||
}"
|
||||
>
|
||||
<LeftGroup @handleFav="handleFav" />
|
||||
<div class="center">
|
||||
<div v-if="!isMobile" class="with-time">
|
||||
<div class="time time-current">
|
||||
<span>
|
||||
{{ formatSeconds(queue.duration.current || 0) }}
|
||||
</span>
|
||||
</div>
|
||||
<div
|
||||
class="b-bar"
|
||||
:style="{
|
||||
paddingLeft: `${settings.is_default_layout ? '1rem' : ''}`,
|
||||
paddingRight: `${settings.is_default_layout ? '1rem' : ''}`,
|
||||
}"
|
||||
>
|
||||
<LeftGroup @handleFav="handleFav" />
|
||||
<div class="center">
|
||||
<div v-if="!isMobile" class="with-time">
|
||||
<div class="time time-current">
|
||||
<div class="numbers">
|
||||
{{ formatSeconds(queue.duration.current || 0) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="buttons rounded-sm border">
|
||||
<HotKeys />
|
||||
<div class="buttons rounded-sm border">
|
||||
<HotKeys />
|
||||
</div>
|
||||
<div class="time time-full">
|
||||
<div class="numbers">
|
||||
{{ formatSeconds(queue.duration.full) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Progress />
|
||||
</div>
|
||||
<div class="time time-full">
|
||||
<span>
|
||||
{{ formatSeconds(queue.duration.full) }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<Progress />
|
||||
<RightGroup v-if="!isMobile" @handleFav="handleFav" />
|
||||
<Navigation v-else />
|
||||
</div>
|
||||
<RightGroup v-if="!isMobile" @handleFav="handleFav" />
|
||||
<Navigation v-else />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { favType } from "@/enums";
|
||||
import favoriteHandler from "@/helpers/favoriteHandler";
|
||||
import { isMobile } from "@/stores/content-width";
|
||||
import { formatSeconds } from "@/utils";
|
||||
import { favType } from '@/enums'
|
||||
import favoriteHandler from '@/helpers/favoriteHandler'
|
||||
import { isMobile } from '@/stores/content-width'
|
||||
import { formatSeconds } from '@/utils'
|
||||
|
||||
import useQStore from "@/stores/queue";
|
||||
import useSettings from "@/stores/settings";
|
||||
import useQStore from '@/stores/queue'
|
||||
import useSettings from '@/stores/settings'
|
||||
|
||||
import HotKeys from "@/components/LeftSidebar/NP/HotKeys.vue";
|
||||
import Progress from "@/components/LeftSidebar/NP/Progress.vue";
|
||||
import Navigation from "@/components/LeftSidebar/NavButtons.vue";
|
||||
import HotKeys from '@/components/LeftSidebar/NP/HotKeys.vue'
|
||||
import Progress from '@/components/LeftSidebar/NP/Progress.vue'
|
||||
import Navigation from '@/components/LeftSidebar/NavButtons.vue'
|
||||
|
||||
import LeftGroup from "./Left.vue";
|
||||
import RightGroup from "./Right.vue";
|
||||
import LeftGroup from './Left.vue'
|
||||
import RightGroup from './Right.vue'
|
||||
|
||||
const queue = useQStore();
|
||||
const settings = useSettings();
|
||||
const queue = useQStore()
|
||||
const settings = useSettings()
|
||||
|
||||
function handleFav() {
|
||||
favoriteHandler(
|
||||
queue.currenttrack?.is_favorite,
|
||||
favType.track,
|
||||
queue.currenttrack?.trackhash || "",
|
||||
() => null,
|
||||
() => null
|
||||
);
|
||||
favoriteHandler(
|
||||
queue.currenttrack?.is_favorite,
|
||||
favType.track,
|
||||
queue.currenttrack?.trackhash || '',
|
||||
() => null,
|
||||
() => null
|
||||
)
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.b-bar {
|
||||
background-color: rgb(22, 22, 22);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr max-content 1fr;
|
||||
align-items: center;
|
||||
z-index: 1;
|
||||
|
||||
@include allPhones {
|
||||
grid-template-columns: 1fr;
|
||||
grid-template-rows: max-content 1.5rem max-content;
|
||||
padding: 0 1rem $medium 1rem;
|
||||
|
||||
.center > input {
|
||||
height: 2px !important;
|
||||
}
|
||||
}
|
||||
|
||||
button {
|
||||
background: transparent;
|
||||
border-radius: $small;
|
||||
width: 3rem;
|
||||
|
||||
&:hover {
|
||||
border: solid 1px $gray3 !important;
|
||||
background-color: $gray !important;
|
||||
}
|
||||
display: grid;
|
||||
grid-template-columns: 1fr max-content 1fr;
|
||||
align-items: center;
|
||||
z-index: 1;
|
||||
|
||||
@include allPhones {
|
||||
height: 3rem;
|
||||
}
|
||||
}
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: unset;
|
||||
gap: $small;
|
||||
padding: $medium 1rem;
|
||||
|
||||
&:hover {
|
||||
// INFO: Show the progress bar when hovering over the bottom bar
|
||||
#progress::-moz-range-thumb {
|
||||
height: 1rem;
|
||||
width: 1rem;
|
||||
}
|
||||
/* Hiding the dot/thumb/handle for readonly input */
|
||||
/* Webkit browsers, Firefox, IE etc */
|
||||
&:hover > .center > #progress::-webkit-slider-thumb {
|
||||
display: none;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
#progress::-webkit-slider-thumb {
|
||||
height: 1rem;
|
||||
width: 1rem;
|
||||
}
|
||||
&:hover > .center > #progress::-moz-range-thumb {
|
||||
display: none;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
#progress::-ms-thumb {
|
||||
height: 1rem;
|
||||
width: 1rem;
|
||||
&:hover > .center > #progress::-ms-thumb {
|
||||
display: none;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
// INFO: Also show the expand button
|
||||
.np-image .expandicon {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.with-time {
|
||||
display: grid;
|
||||
grid-template-columns: max-content 1fr max-content;
|
||||
align-items: flex-end;
|
||||
height: 2rem;
|
||||
|
||||
button {
|
||||
background: transparent;
|
||||
}
|
||||
}
|
||||
background: transparent;
|
||||
border-radius: $small;
|
||||
width: 3rem;
|
||||
transition: background-color 0.2s ease-out, border-color 0.2s ease-out;
|
||||
|
||||
.center {
|
||||
display: grid;
|
||||
align-items: center;
|
||||
gap: $small;
|
||||
margin-bottom: -$small;
|
||||
&:hover {
|
||||
border: solid 1px $gray3 !important;
|
||||
background-color: $gray !important;
|
||||
}
|
||||
|
||||
width: 30rem;
|
||||
@include allPhones {
|
||||
height: 3rem;
|
||||
}
|
||||
|
||||
@media (max-width: 1080px) {
|
||||
width: 20rem !important;
|
||||
@include largePhones {
|
||||
width: 2.5rem;
|
||||
height: 2.5rem;
|
||||
|
||||
&:nth-child(2) {
|
||||
width: 3.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
@include smallestPhones {
|
||||
&:first-child {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&:nth-child(2) {
|
||||
margin-left: $smaller;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@include allPhones {
|
||||
width: 100% !important;
|
||||
margin-bottom: $small;
|
||||
&:hover {
|
||||
// INFO: Show the progress bar when hovering over the bottom bar
|
||||
#progress::-moz-range-thumb {
|
||||
height: 1rem;
|
||||
width: 1rem;
|
||||
}
|
||||
|
||||
#progress::-webkit-slider-thumb {
|
||||
height: 1rem;
|
||||
width: 1rem;
|
||||
}
|
||||
|
||||
#progress::-ms-thumb {
|
||||
height: 1rem;
|
||||
width: 1rem;
|
||||
}
|
||||
|
||||
// INFO: Also show the expand button
|
||||
.np-image .expandicon {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.time {
|
||||
font-size: $medium;
|
||||
height: fit-content;
|
||||
width: 3rem;
|
||||
.with-time {
|
||||
display: grid;
|
||||
grid-template-columns: max-content 1fr max-content;
|
||||
align-items: flex-end;
|
||||
height: 2rem;
|
||||
|
||||
span {
|
||||
background-color: $gray3;
|
||||
border-radius: $smaller;
|
||||
padding: 0 $smaller;
|
||||
}
|
||||
button {
|
||||
background: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.time-full {
|
||||
text-align: end;
|
||||
}
|
||||
}
|
||||
.center {
|
||||
display: grid;
|
||||
align-items: center;
|
||||
gap: 0.625rem;
|
||||
|
||||
// hotkey
|
||||
.buttons {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
transform: scale(1.2);
|
||||
border: none;
|
||||
}
|
||||
width: 30rem;
|
||||
|
||||
@media only screen and (max-width: 1080px) {
|
||||
width: 20rem !important;
|
||||
}
|
||||
|
||||
@include allPhones {
|
||||
width: 100% !important;
|
||||
margin: 4px -16px;
|
||||
user-select: none;
|
||||
pointer-events: none;
|
||||
|
||||
> #progress {
|
||||
height: 1px !important;
|
||||
width: 100vw !important;
|
||||
margin: unset;
|
||||
}
|
||||
}
|
||||
|
||||
.time {
|
||||
font-weight: 500;
|
||||
font-size: $medium;
|
||||
|
||||
.numbers {
|
||||
background-color: $gray3;
|
||||
border-radius: $smaller;
|
||||
padding: 1px $smaller;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// hotkey
|
||||
.buttons {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
transform: scale(1.2);
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,159 +1,187 @@
|
||||
<template>
|
||||
<div v-auto-animate class="left-group">
|
||||
<HeartSvg
|
||||
v-if="settings.use_np_img && !isMobile"
|
||||
:state="queue.currenttrack?.is_favorite"
|
||||
@handleFav="$emit('handleFav')"
|
||||
/>
|
||||
<RouterLink
|
||||
v-else
|
||||
title="Go to Now Playing"
|
||||
:to="{
|
||||
name: Routes.nowPlaying,
|
||||
params: {
|
||||
tab: 'home',
|
||||
},
|
||||
replace: true,
|
||||
}"
|
||||
class="np-image rounded-sm no-scroll"
|
||||
>
|
||||
<img :src="paths.images.thumb.small + queue.currenttrack?.image" alt="" />
|
||||
<div class="expandicon">
|
||||
<ExpandSvg />
|
||||
</div>
|
||||
</RouterLink>
|
||||
<div
|
||||
class="track-info"
|
||||
:style="{
|
||||
color: getShift(colors.theme1, [0, -170]),
|
||||
}"
|
||||
>
|
||||
<div v-tooltip class="title">
|
||||
<span class="ellip">
|
||||
{{ queue.currenttrack?.title || "Hello there" }}
|
||||
</span>
|
||||
<MasterFlag :bitrate="queue.currenttrack?.bitrate || 0" />
|
||||
</div>
|
||||
<ArtistName
|
||||
:artists="queue.currenttrack?.artists || []"
|
||||
:albumartists="
|
||||
queue.currenttrack?.albumartists || 'Welcome to Swing Music'
|
||||
"
|
||||
class="artist"
|
||||
/>
|
||||
<div v-auto-animate class="left-group">
|
||||
<HeartSvg
|
||||
v-if="settings.use_np_img && !isMobile"
|
||||
:state="queue.currenttrack?.is_favorite"
|
||||
@handleFav="$emit('handleFav')"
|
||||
/>
|
||||
<RouterLink
|
||||
v-else
|
||||
title="Go to Now Playing"
|
||||
:to="{
|
||||
name: Routes.nowPlaying,
|
||||
params: {
|
||||
tab: 'home',
|
||||
},
|
||||
replace: true,
|
||||
}"
|
||||
class="np-image rounded-sm no-scroll"
|
||||
>
|
||||
<img :src="paths.images.thumb.small + queue.currenttrack?.image" alt="" />
|
||||
<div class="expandicon">
|
||||
<ExpandSvg />
|
||||
</div>
|
||||
</RouterLink>
|
||||
<div
|
||||
class="track-info"
|
||||
:style="{
|
||||
color: getShift(colors.theme1, [0, -170]),
|
||||
}"
|
||||
>
|
||||
<div v-tooltip class="title">
|
||||
<span class="ellip">
|
||||
{{ queue.currenttrack?.title || 'Hello there' }}
|
||||
</span>
|
||||
<ExplicitIcon class="explicit-icon" v-if="queue.currenttrack?.explicit" />
|
||||
<MasterFlag :bitrate="queue.currenttrack?.bitrate || 0" />
|
||||
</div>
|
||||
<ArtistName
|
||||
:artists="queue.currenttrack?.artists || []"
|
||||
:albumartists="queue.currenttrack?.albumartists || 'Welcome to Swing Music'"
|
||||
class="artist"
|
||||
/>
|
||||
</div>
|
||||
<Actions v-if="isLargerMobile" @handleFav="$emit('handleFav')" />
|
||||
<HotKeys v-if="isMobile" />
|
||||
</div>
|
||||
<Actions v-if="isLargerMobile" @handleFav="$emit('handleFav')" />
|
||||
<HotKeys v-if="isMobile" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { paths } from "@/config";
|
||||
import { Routes } from "@/router";
|
||||
import { getShift } from "@/utils/colortools/shift";
|
||||
import { paths } from '@/config'
|
||||
import { Routes } from '@/router'
|
||||
import { getShift } from '@/utils/colortools/shift'
|
||||
|
||||
import useQStore from "@/stores/queue";
|
||||
import useColorStore from "@/stores/colors";
|
||||
import useSettingsStore from "@/stores/settings";
|
||||
import { isLargerMobile, isMobile } from "@/stores/content-width";
|
||||
import useColorStore from '@/stores/colors'
|
||||
import { isLargerMobile, isMobile } from '@/stores/content-width'
|
||||
import useQStore from '@/stores/queue'
|
||||
import useSettingsStore from '@/stores/settings'
|
||||
|
||||
import Actions from "./Right.vue";
|
||||
import HeartSvg from "../shared/HeartSvg.vue";
|
||||
import MasterFlag from "../shared/MasterFlag.vue";
|
||||
import HotKeys from "../LeftSidebar/NP/HotKeys.vue";
|
||||
import ArtistName from "@/components/shared/ArtistName.vue";
|
||||
import ExpandSvg from "@/assets/icons/expand.svg";
|
||||
import ExpandSvg from '@/assets/icons/expand.svg'
|
||||
import ArtistName from '@/components/shared/ArtistName.vue'
|
||||
import HotKeys from '../LeftSidebar/NP/HotKeys.vue'
|
||||
import HeartSvg from '../shared/HeartSvg.vue'
|
||||
import MasterFlag from '../shared/MasterFlag.vue'
|
||||
import Actions from './Right.vue'
|
||||
import ExplicitIcon from '@/assets/icons/explicit.svg'
|
||||
|
||||
const queue = useQStore();
|
||||
const settings = useSettingsStore();
|
||||
const colors = useColorStore();
|
||||
const queue = useQStore()
|
||||
const settings = useSettingsStore()
|
||||
const colors = useColorStore()
|
||||
|
||||
defineEmits<{
|
||||
(e: "handleFav"): void;
|
||||
}>();
|
||||
(e: 'handleFav'): void
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.left-group {
|
||||
display: grid;
|
||||
grid-template-columns: max-content 1fr;
|
||||
gap: $small;
|
||||
align-items: center;
|
||||
font-size: small;
|
||||
|
||||
.np-image {
|
||||
position: relative;
|
||||
height: 3rem;
|
||||
|
||||
img {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.expandicon {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(51, 51, 51, 0.575);
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
opacity: 0;
|
||||
transition: all 0.2s;
|
||||
|
||||
svg {
|
||||
transform: rotate(-90deg);
|
||||
}
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.expandicon {
|
||||
transform: translateY(-$medium);
|
||||
height: 130%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
a {
|
||||
display: grid;
|
||||
grid-template-columns: max-content 1fr;
|
||||
gap: $medium;
|
||||
align-items: center;
|
||||
font-size: small;
|
||||
}
|
||||
font-weight: 700;
|
||||
line-height: 1.2;
|
||||
margin-right: $medium;
|
||||
|
||||
.heart-button {
|
||||
height: 3rem;
|
||||
width: 3rem;
|
||||
border: solid 1px $gray4;
|
||||
padding: 0;
|
||||
}
|
||||
.np-image {
|
||||
position: relative;
|
||||
height: 3rem;
|
||||
|
||||
.track-info {
|
||||
.artistname {
|
||||
font-size: 0.9rem;
|
||||
opacity: 0.75;
|
||||
font-weight: bold;
|
||||
margin-bottom: 2px;
|
||||
img {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.expandicon {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(51, 51, 51, 0.6);
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
opacity: 0;
|
||||
transition: opacity 0.2s ease-out, height 0.2s ease-out, transform 0.2s ease-out,
|
||||
background-color 0.2s ease-out;
|
||||
|
||||
svg {
|
||||
transform: rotate(-90deg) scale(0.92);
|
||||
}
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.expandicon {
|
||||
transform: translateY(-$medium);
|
||||
height: 130%;
|
||||
}
|
||||
}
|
||||
|
||||
&:active {
|
||||
.expandicon {
|
||||
background-color: rgba(51, 51, 51, 0.74);
|
||||
}
|
||||
}
|
||||
|
||||
@include largePhones {
|
||||
flex-shrink: 0;
|
||||
margin-right: $medium;
|
||||
}
|
||||
|
||||
@include smallerPhones {
|
||||
margin-right: $small;
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
color: $white;
|
||||
font-weight: bold;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
@include allPhones {
|
||||
height: 4rem;
|
||||
grid-template-columns: max-content 1fr max-content;
|
||||
|
||||
.heart-button {
|
||||
height: max-content;
|
||||
border: none !important;
|
||||
height: 3rem;
|
||||
width: 3rem;
|
||||
border: solid 1px $gray4;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 550px) {
|
||||
grid-template-columns: max-content 1fr max-content max-content;
|
||||
}
|
||||
.track-info {
|
||||
.title {
|
||||
color: $white;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.artistname {
|
||||
opacity: 0.75;
|
||||
|
||||
a {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
}
|
||||
|
||||
@include allPhones {
|
||||
width: calc(100% + 8px);
|
||||
}
|
||||
|
||||
@include largePhones {
|
||||
width: unset;
|
||||
flex-grow: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@include allPhones {
|
||||
grid-template-columns: max-content 1fr max-content max-content;
|
||||
margin-right: unset;
|
||||
|
||||
.heart-button {
|
||||
height: max-content;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
}
|
||||
|
||||
@include largePhones {
|
||||
display: flex;
|
||||
gap: 0;
|
||||
max-width: calc(100% - 8px);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,96 +1,95 @@
|
||||
<template>
|
||||
<div class="right-group">
|
||||
<LyricsButton />
|
||||
<Volume />
|
||||
<button
|
||||
class="repeat"
|
||||
:class="{ 'repeat-disabled': settings.no_repeat }"
|
||||
:title="
|
||||
settings.repeat_all
|
||||
? 'Repeat all'
|
||||
: settings.no_repeat
|
||||
? 'No repeat'
|
||||
: 'Repeat one'
|
||||
"
|
||||
@click="settings.toggleRepeatMode"
|
||||
>
|
||||
<RepeatOneSvg v-if="settings.repeat_one" />
|
||||
<RepeatAllSvg v-else />
|
||||
</button>
|
||||
<button title="Shuffle" @click="queue.shuffleQueue">
|
||||
<ShuffleSvg />
|
||||
</button>
|
||||
<HeartSvg
|
||||
v-if="!hideHeart"
|
||||
title="Favorite"
|
||||
:state="queue.currenttrack?.is_favorite"
|
||||
@handleFav="() => $emit('handleFav')"
|
||||
/>
|
||||
</div>
|
||||
<div class="right-group">
|
||||
<LyricsButton />
|
||||
<Volume />
|
||||
<button
|
||||
class="repeat"
|
||||
:class="{ 'repeat-disabled': settings.repeat == 'none' }"
|
||||
:title="settings.repeat == 'all' ? 'Repeat all' : settings.repeat == 'one' ? 'Repeat one' : 'No repeat'"
|
||||
@click="settings.toggleRepeatMode"
|
||||
>
|
||||
<RepeatOneSvg v-if="settings.repeat == 'one'" />
|
||||
<RepeatAllSvg v-else />
|
||||
</button>
|
||||
<button title="Shuffle" @click="queue.shuffleQueue">
|
||||
<ShuffleSvg />
|
||||
</button>
|
||||
<HeartSvg
|
||||
v-if="!hideHeart"
|
||||
title="Favorite"
|
||||
:state="queue.currenttrack?.is_favorite"
|
||||
@handleFav="() => $emit('handleFav')"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import useQueue from "@/stores/queue";
|
||||
import useSettings from "@/stores/settings";
|
||||
import useQueue from '@/stores/queue'
|
||||
import useSettings from '@/stores/settings'
|
||||
|
||||
import Volume from "./Volume.vue";
|
||||
import HeartSvg from "../shared/HeartSvg.vue";
|
||||
import LyricsButton from "../shared/LyricsButton.vue";
|
||||
import RepeatAllSvg from "@/assets/icons/repeat.svg";
|
||||
import RepeatOneSvg from "@/assets/icons/repeat-one.svg";
|
||||
import ShuffleSvg from "@/assets/icons/shuffle.svg";
|
||||
import RepeatOneSvg from '@/assets/icons/repeat-one.svg'
|
||||
import RepeatAllSvg from '@/assets/icons/repeat.svg'
|
||||
import ShuffleSvg from '@/assets/icons/shuffle.svg'
|
||||
import HeartSvg from '../shared/HeartSvg.vue'
|
||||
import LyricsButton from '../shared/LyricsButton.vue'
|
||||
import Volume from './Volume.vue'
|
||||
|
||||
const queue = useQueue();
|
||||
const settings = useSettings();
|
||||
const queue = useQueue()
|
||||
const settings = useSettings()
|
||||
|
||||
defineProps<{
|
||||
hideHeart?: boolean;
|
||||
}>();
|
||||
hideHeart?: boolean
|
||||
}>()
|
||||
|
||||
defineEmits<{
|
||||
(event: "handleFav"): void;
|
||||
}>();
|
||||
(event: 'handleFav'): void
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.right-group {
|
||||
display: grid;
|
||||
justify-content: flex-end;
|
||||
grid-template-columns: repeat(5, max-content);
|
||||
align-items: center;
|
||||
height: 4rem;
|
||||
display: grid;
|
||||
justify-content: flex-end;
|
||||
grid-template-columns: repeat(5, max-content);
|
||||
align-items: center;
|
||||
height: 4rem;
|
||||
|
||||
@include allPhones {
|
||||
width: max-content;
|
||||
}
|
||||
|
||||
button {
|
||||
height: 3rem !important;
|
||||
width: 3rem !important;
|
||||
background-color: transparent;
|
||||
border: solid 1px transparent;
|
||||
|
||||
&:hover {
|
||||
border: solid 1px $gray3 !important;
|
||||
background-color: $gray !important;
|
||||
@include allPhones {
|
||||
width: max-content;
|
||||
height: unset;
|
||||
}
|
||||
}
|
||||
|
||||
.lyrics,
|
||||
.repeat {
|
||||
svg {
|
||||
transform: scale(0.75);
|
||||
button {
|
||||
height: 3rem !important;
|
||||
width: 3rem !important;
|
||||
background-color: transparent;
|
||||
border: solid 1px transparent;
|
||||
|
||||
&:hover {
|
||||
border: solid 1px $gray3 !important;
|
||||
background-color: $gray !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
button.repeat.repeat-disabled {
|
||||
svg {
|
||||
opacity: 0.25;
|
||||
.lyrics,
|
||||
.repeat {
|
||||
svg {
|
||||
transform: scale(0.75);
|
||||
}
|
||||
|
||||
&:active > svg {
|
||||
transform: scale(0.6);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.heart-button {
|
||||
border: solid 1px $gray4 !important;
|
||||
}
|
||||
button.repeat.repeat-disabled {
|
||||
svg {
|
||||
opacity: 0.25;
|
||||
}
|
||||
}
|
||||
|
||||
.heart-button {
|
||||
border: solid 1px $gray4 !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,104 +1,135 @@
|
||||
<template>
|
||||
<button class="speaker" @wheel.passive="handleMouseWheel">
|
||||
<div class="icon" @click="settings.toggleMute">
|
||||
<VolumeMuteSvg v-if="settings.mute || settings.volume == 0.0" />
|
||||
<VolumeMidSvg v-else-if="settings.volume > 0.75" />
|
||||
<VolumeLowSvg v-else-if="settings.volume > 0" />
|
||||
</div>
|
||||
<div class="dialog rounded-sm pad-sm">
|
||||
<input
|
||||
id="volume"
|
||||
type="range"
|
||||
name="volume"
|
||||
max="1"
|
||||
min="0"
|
||||
step="0.01"
|
||||
:value="settings.volume"
|
||||
@input="changeVolume"
|
||||
/>
|
||||
</div>
|
||||
</button>
|
||||
<button class="speaker" @wheel.passive="handleMouseWheel">
|
||||
<div class="icon" @click="settings.toggleMute">
|
||||
<VolumeMuteSvg v-if="settings.mute || settings.volume == 0.0" />
|
||||
<VolumeMidSvg v-else-if="settings.volume > 0.75" />
|
||||
<VolumeLowSvg v-else-if="settings.volume > 0" />
|
||||
</div>
|
||||
<div class="dialog rounded-sm pad-sm">
|
||||
<input
|
||||
id="volume"
|
||||
type="range"
|
||||
name="volume"
|
||||
max="1"
|
||||
min="0"
|
||||
step="0.01"
|
||||
:value="settings.volume"
|
||||
@input="changeVolume"
|
||||
:style="{
|
||||
backgroundSize: `${(settings.volume / 1) * 100}% 100%`,
|
||||
}"
|
||||
/>
|
||||
<div className="volume_indicator">{{ ((settings.volume / 1) * 100).toFixed(0) }}</div>
|
||||
</div>
|
||||
</button>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import useSettingsStore from "@/stores/settings";
|
||||
import VolumeMuteSvg from "@/assets/icons/volume-mute.svg";
|
||||
import VolumeLowSvg from "@/assets/icons/volume-low.svg";
|
||||
import VolumeMidSvg from "@/assets/icons/volume-mid.svg";
|
||||
import VolumeLowSvg from '@/assets/icons/volume-low.svg'
|
||||
import VolumeMidSvg from '@/assets/icons/volume-mid.svg'
|
||||
import VolumeMuteSvg from '@/assets/icons/volume-mute.svg'
|
||||
import useSettingsStore from '@/stores/settings'
|
||||
|
||||
const settings = useSettingsStore();
|
||||
const settings = useSettingsStore()
|
||||
|
||||
const changeVolume = (event: Event) => {
|
||||
const target = event.target as HTMLInputElement;
|
||||
settings.setVolume(parseFloat(target.value));
|
||||
};
|
||||
const target = event.target as HTMLInputElement
|
||||
settings.setVolume(parseFloat(target.value))
|
||||
}
|
||||
|
||||
const handleMouseWheel = (event: WheelEvent) => {
|
||||
const delta = event.deltaY / 1000;
|
||||
let newVolume = settings.volume - delta / 3;
|
||||
const delta = event.deltaY / 1000
|
||||
let newVolume = settings.volume - delta / 3
|
||||
|
||||
if (newVolume > 1) {
|
||||
newVolume = 1;
|
||||
}
|
||||
if (newVolume > 1) {
|
||||
newVolume = 1
|
||||
}
|
||||
|
||||
if (newVolume < 0) {
|
||||
newVolume = 0;
|
||||
}
|
||||
if (newVolume < 0) {
|
||||
newVolume = 0
|
||||
}
|
||||
|
||||
settings.setVolume(newVolume);
|
||||
};
|
||||
settings.setVolume(newVolume)
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.b-bar .right-group button.speaker {
|
||||
border-top: 1px solid transparent !important;
|
||||
border-top-left-radius: 0 !important;
|
||||
border-top-right-radius: 0 !important;
|
||||
}
|
||||
|
||||
.speaker {
|
||||
position: relative;
|
||||
position: relative;
|
||||
|
||||
.icon {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
}
|
||||
|
||||
svg {
|
||||
transform: scale(0.75);
|
||||
}
|
||||
|
||||
.dialog {
|
||||
background-color: $gray4;
|
||||
position: absolute;
|
||||
bottom: 2.95rem;
|
||||
height: 2.5rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
visibility: hidden;
|
||||
transition: visibility 0.2s ease-in;
|
||||
transition-delay: 0.25s;
|
||||
cursor: default;
|
||||
|
||||
input {
|
||||
width: max-content;
|
||||
margin: 0;
|
||||
|
||||
&::-webkit-slider-thumb {
|
||||
height: 1rem;
|
||||
width: 1rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&::-moz-range-thumb {
|
||||
height: 1rem;
|
||||
width: 1rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
.icon {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
}
|
||||
|
||||
svg {
|
||||
transform: scale(0.75);
|
||||
}
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.dialog {
|
||||
transition-delay: 0.25s;
|
||||
visibility: visible;
|
||||
position: absolute;
|
||||
cursor: default;
|
||||
bottom: 56px;
|
||||
left: -1px;
|
||||
height: 48px;
|
||||
padding: 0 6px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
background-color: $gray;
|
||||
border-top: 1px solid $gray3;
|
||||
border-bottom: 1px solid $gray3;
|
||||
border-right: 1px solid $gray3;
|
||||
border-bottom-left-radius: 0;
|
||||
border-top-left-radius: 0;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
transform: rotate(270deg) translateX(-50%) perspective(1px);
|
||||
transform-origin: left top;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transition: opacity 0.2s ease-out, visibility 0.2s ease-out;
|
||||
|
||||
input {
|
||||
width: max-content;
|
||||
max-width: 87px;
|
||||
margin: 0;
|
||||
touch-action: pan-x;
|
||||
background: linear-gradient(to top, #ffffff, #ffffff) 0% 50% no-repeat, $gray4;
|
||||
|
||||
&::-webkit-slider-thumb {
|
||||
height: 1rem;
|
||||
width: 1rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&::-moz-range-thumb {
|
||||
height: 1rem;
|
||||
width: 1rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.dialog {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
|
||||
.volume_indicator {
|
||||
font-weight: 600;
|
||||
width: 24px;
|
||||
height: 18px;
|
||||
transform: rotate(90deg) translate3d(0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
136
src/components/CardListView/SortBanner.vue
Normal file
@@ -0,0 +1,136 @@
|
||||
<template>
|
||||
<div class="itemsortby">
|
||||
<div class="tt select circular">Sort By</div>
|
||||
<div class="left group">
|
||||
<SortKey
|
||||
:items="($route.name == Routes.AlbumList ? albumitems : artistitems).concat(items)"
|
||||
:sortby="store.sortby"
|
||||
:reverse="store.reverse"
|
||||
/>
|
||||
</div>
|
||||
<div class="right group">
|
||||
<div class="tt select circular"><ChartSvg /></div>
|
||||
<SortKey :items="statitems" :sortby="store.sortby" :reverse="store.reverse" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Routes } from '@/router'
|
||||
import { useRoute } from 'vue-router'
|
||||
|
||||
import { useAlbumList, useArtistList } from '@/stores/pages/itemlist'
|
||||
import SortKey from './SortKey.vue'
|
||||
import ChartSvg from '@/assets/icons/chart.svg'
|
||||
|
||||
const route = useRoute()
|
||||
const store = route.name === Routes.AlbumList ? useAlbumList() : useArtistList()
|
||||
|
||||
const items = [
|
||||
{ key: 'trackcount', displayName: 'No. of tracks' },
|
||||
{ key: 'duration', displayName: 'Duration' },
|
||||
{ key: 'created_date', displayName: 'Date added' },
|
||||
{ key: 'lastplayed', displayName: 'Last played' },
|
||||
]
|
||||
|
||||
const statitems = [
|
||||
{ key: 'playcount', displayName: 'Plays' },
|
||||
{ key: 'playduration', displayName: 'Play duration' },
|
||||
]
|
||||
|
||||
const albumitems = [
|
||||
{ key: 'title', displayName: 'Title' },
|
||||
{ key: 'albumartists', displayName: 'Artist' },
|
||||
{ key: 'date', displayName: 'Year released' },
|
||||
]
|
||||
|
||||
const artistitems = [
|
||||
{ key: 'name', displayName: 'Name' },
|
||||
{ key: 'albumcount', displayName: 'No. of albums' },
|
||||
]
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.itemsortby {
|
||||
z-index: 200;
|
||||
display: grid;
|
||||
grid-template-columns: max-content 1fr max-content;
|
||||
gap: 1rem;
|
||||
|
||||
@include allPhones {
|
||||
grid-template-columns: 1fr;
|
||||
|
||||
.tt {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
.group {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: flex-start;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
padding: 1rem $medium 2rem $medium;
|
||||
position: relative;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
text-transform: capitalize;
|
||||
user-select: none;
|
||||
|
||||
.select {
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border: solid 1px $gray5;
|
||||
padding: $small $medium;
|
||||
transition: background-color 0.2s ease-out, border-color 0.2s ease-out;
|
||||
}
|
||||
|
||||
.select.circular {
|
||||
user-select: none;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.reverse svg.direction {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
||||
.select:hover {
|
||||
background-color: $gray4;
|
||||
border-color: $gray4;
|
||||
}
|
||||
|
||||
.tt {
|
||||
background-color: #fff;
|
||||
color: #000;
|
||||
border: none;
|
||||
height: max-content;
|
||||
|
||||
display: flex;
|
||||
gap: $small;
|
||||
|
||||
svg {
|
||||
height: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
svg.direction {
|
||||
transform: rotate(-90deg);
|
||||
margin: -2px 0;
|
||||
margin-right: -6px;
|
||||
margin-left: 2px;
|
||||
transition: transform 0.1s linear;
|
||||
}
|
||||
|
||||
.active {
|
||||
background-color: $gray4;
|
||||
border-color: $gray4;
|
||||
}
|
||||
|
||||
button {
|
||||
padding-left: $medium;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
45
src/components/CardListView/SortKey.vue
Normal file
@@ -0,0 +1,45 @@
|
||||
<template>
|
||||
<RouterLink
|
||||
v-for="i in items"
|
||||
:key="i.key"
|
||||
:to="{
|
||||
name: $route.name as string,
|
||||
query: {
|
||||
sortby: i.key,
|
||||
reverse: i.key == sortby ? ($route.query.reverse == '0' ? '1' : '0') : '1',
|
||||
},
|
||||
replace: true,
|
||||
}"
|
||||
class="select rounded-sm"
|
||||
:class="{ reverse: reverse, active: i.key == sortby }"
|
||||
>
|
||||
{{ i.displayName }}
|
||||
<svg
|
||||
v-if="i.key == sortby"
|
||||
width="18"
|
||||
height="18"
|
||||
viewBox="0 0 28 28"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="direction"
|
||||
>
|
||||
<path
|
||||
d="M5.69434 13.6455C5.69434 13.9092 5.80859 14.1641 6.01074 14.3574L11.8027 20.1494C12.0137 20.3516 12.251 20.4482 12.4883 20.4482C13.042 20.4482 13.4375 20.0527 13.4375 19.5254C13.4375 19.2529 13.332 19.0156 13.1562 18.8486L11.1875 16.8535L8.58594 14.4805L10.6426 14.6035H21.3301C21.9014 14.6035 22.3057 14.208 22.3057 13.6455C22.3057 13.0742 21.9014 12.6875 21.3301 12.6875H10.6426L8.59473 12.8105L11.1875 10.4375L13.1562 8.44238C13.332 8.2666 13.4375 8.0293 13.4375 7.75684C13.4375 7.22949 13.042 6.84277 12.4883 6.84277C12.251 6.84277 12.0137 6.93066 11.7852 7.15039L6.01074 12.9336C5.80859 13.1182 5.69434 13.3818 5.69434 13.6455Z"
|
||||
fill="#F2F2F2"
|
||||
/>
|
||||
</svg>
|
||||
</RouterLink>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
defineProps<{
|
||||
sortby: string
|
||||
items: {
|
||||
key: string
|
||||
displayName: string
|
||||
}[]
|
||||
reverse: boolean
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
||||
@@ -5,6 +5,7 @@
|
||||
class="context-menu rounded shadow-lg no-select"
|
||||
:style="{
|
||||
visibility: context.visible ? 'visible' : 'hidden',
|
||||
opacity: context.visible ? '1' : '0',
|
||||
}"
|
||||
>
|
||||
<ContextItem
|
||||
@@ -20,8 +21,8 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from "vue";
|
||||
import { onClickOutside } from "@vueuse/core";
|
||||
import { ref } from "vue";
|
||||
|
||||
import useContextStore from "@/stores/context";
|
||||
import useSettingsStore from "@/stores/settings";
|
||||
@@ -65,15 +66,17 @@ context.$subscribe((mutation, state) => {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 12.5rem;
|
||||
z-index: 10000 !important;
|
||||
transform: scale(0);
|
||||
width: 13rem;
|
||||
z-index: 1000 !important;
|
||||
height: min-content;
|
||||
|
||||
padding: $small;
|
||||
background: $context;
|
||||
transform-origin: top left;
|
||||
font-size: 0.875rem;
|
||||
font-weight: 500;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transition: opacity 0.25s ease-out, visibility 0.25s ease-out;
|
||||
|
||||
.separator {
|
||||
height: 1px;
|
||||
@@ -85,6 +88,7 @@ context.$subscribe((mutation, state) => {
|
||||
|
||||
.critical {
|
||||
color: $red;
|
||||
transition: background-color 0.2s ease-out, color 0.2s ease-out;
|
||||
|
||||
&:hover {
|
||||
background-color: $red;
|
||||
|
||||
@@ -1,190 +1,269 @@
|
||||
<template>
|
||||
<div
|
||||
ref="parentRef"
|
||||
class="context-item"
|
||||
@mouseenter="
|
||||
option.children &&
|
||||
!isSmall &&
|
||||
childrenShowMode === contextChildrenShowMode.hover &&
|
||||
showChildren()
|
||||
"
|
||||
@mouseleave="
|
||||
option.children &&
|
||||
!isSmall &&
|
||||
childrenShowMode === contextChildrenShowMode.hover &&
|
||||
hideChildren()
|
||||
"
|
||||
@click="runAction"
|
||||
>
|
||||
<div class="icon image" v-html="option.icon"></div>
|
||||
<div class="label ellip">{{ option.label }}</div>
|
||||
<div v-if="option.children" class="more" v-html="ExpandIcon"></div>
|
||||
<!-- TODO: -->
|
||||
<div
|
||||
v-if="option.children"
|
||||
ref="childRef"
|
||||
class="children rounded shadow-sm"
|
||||
>
|
||||
<div
|
||||
v-for="child in option.children"
|
||||
:key="child.label"
|
||||
ref="parentRef"
|
||||
class="context-item"
|
||||
:class="[{ critical: child.critical }, child.type]"
|
||||
@click="child.action && runChildAction(child.action)"
|
||||
>
|
||||
<div class="label ellip">
|
||||
{{ child.label }}
|
||||
@mouseenter="handleMouseEnter"
|
||||
@mouseleave="handleMouseLeave"
|
||||
@click="runAction"
|
||||
>
|
||||
<div class="icon image" v-html="option.icon"></div>
|
||||
<div class="label ellip">{{ option.label }}</div>
|
||||
<div v-if="hasChildren && !option.singleChild" class="more" v-html="ExpandIcon"></div>
|
||||
<div v-if="children" ref="childRef" class="children rounded shadow-sm">
|
||||
<div className="wrapper">
|
||||
<div
|
||||
v-for="child in children"
|
||||
:key="child.label"
|
||||
class="context-item"
|
||||
:class="[{ critical: child.critical }, child.type]"
|
||||
@click="child.action && runChildAction(child.action)"
|
||||
>
|
||||
<div class="label ellip">
|
||||
{{ child.label }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { createPopper, Instance } from "@popperjs/core";
|
||||
import { ref } from "vue";
|
||||
import { createPopper, Instance, Modifier, Placement, Rect } from '@popperjs/core'
|
||||
import { computed, ref } from 'vue'
|
||||
|
||||
import { contextChildrenShowMode } from "@/enums";
|
||||
import { ExpandIcon } from "@/icons";
|
||||
import { Option } from "@/interfaces";
|
||||
import { isSmall } from "@/stores/content-width";
|
||||
import { contextChildrenShowMode } from '@/enums'
|
||||
import { ExpandIcon } from '@/icons'
|
||||
import { Option } from '@/interfaces'
|
||||
|
||||
const props = defineProps<{
|
||||
option: Option;
|
||||
childrenShowMode: contextChildrenShowMode;
|
||||
}>();
|
||||
option: Option
|
||||
childrenShowMode: contextChildrenShowMode
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
(event: "hideContextMenu"): void;
|
||||
}>();
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
(event: 'hideContextMenu'): void
|
||||
}>()
|
||||
|
||||
const parentRef = ref<HTMLElement>();
|
||||
const childRef = ref<HTMLElement>();
|
||||
const childrenShown = ref(false);
|
||||
const showChildrenDelay = 250
|
||||
const stillWaitingForChildren = ref(false)
|
||||
const children = ref<Option[] | false>(false)
|
||||
|
||||
let popperInstance: Instance | null = null;
|
||||
const childrenShown = ref(false)
|
||||
const childRef = ref<HTMLElement>()
|
||||
const parentRef = ref<HTMLElement>()
|
||||
|
||||
function showChildren() {
|
||||
if (childrenShown.value) {
|
||||
childrenShown.value = false;
|
||||
return;
|
||||
}
|
||||
const hasChildren = computed(() => {
|
||||
return props.option.children && props.childrenShowMode === contextChildrenShowMode.hover
|
||||
})
|
||||
|
||||
popperInstance = createPopper(
|
||||
parentRef.value as HTMLElement,
|
||||
childRef.value as HTMLElement,
|
||||
{
|
||||
placement: "right-start",
|
||||
modifiers: [
|
||||
{
|
||||
name: "flip",
|
||||
options: {
|
||||
fallbackPlacements: ["left-start", "auto"],
|
||||
},
|
||||
},
|
||||
],
|
||||
let popperInstance: Instance | null = null
|
||||
|
||||
async function handleMouseEnter() {
|
||||
if (!hasChildren.value) return
|
||||
|
||||
stillWaitingForChildren.value = true
|
||||
await new Promise(resolve => setTimeout(resolve, showChildrenDelay))
|
||||
|
||||
if (stillWaitingForChildren.value) {
|
||||
showChildren()
|
||||
}
|
||||
);
|
||||
childRef.value ? (childRef.value.style.visibility = "visible") : null;
|
||||
childrenShown.value = true;
|
||||
}
|
||||
|
||||
function handleMouseLeave() {
|
||||
if (!hasChildren.value) return
|
||||
stillWaitingForChildren.value = false
|
||||
hideChildren()
|
||||
}
|
||||
|
||||
async function getChildren() {
|
||||
if (!props.option.children) return
|
||||
const childs = await props.option.children()
|
||||
|
||||
if (childs) {
|
||||
children.value = childs
|
||||
}
|
||||
}
|
||||
|
||||
async function showChildren() {
|
||||
if (childrenShown.value) {
|
||||
childrenShown.value = false
|
||||
return
|
||||
}
|
||||
|
||||
if (props.option.children) {
|
||||
await getChildren()
|
||||
// return;
|
||||
}
|
||||
|
||||
const offsetModifier: Modifier<
|
||||
'offset',
|
||||
{
|
||||
offset:
|
||||
| [number, number]
|
||||
| ((args: { placement: Placement; reference: Rect; popper: Rect }) => [number, number])
|
||||
}
|
||||
> = {
|
||||
name: 'offset',
|
||||
options: {
|
||||
offset: ({ placement }) => {
|
||||
// Correct type for placement automatically inferred
|
||||
if (placement.includes('right') || placement.includes('left')) {
|
||||
return [-7, 0]
|
||||
}
|
||||
return [0, 0]
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
popperInstance = createPopper(parentRef.value as HTMLElement, childRef.value as HTMLElement, {
|
||||
placement: 'right-start',
|
||||
modifiers: [
|
||||
{
|
||||
name: 'preventOverflow',
|
||||
options: {
|
||||
altAxis: true,
|
||||
boundariesElement: 'viewport',
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'flip',
|
||||
options: {
|
||||
fallbackPlacements: ['left-start', 'auto'],
|
||||
boundariesElement: 'viewport',
|
||||
},
|
||||
},
|
||||
offsetModifier,
|
||||
],
|
||||
})
|
||||
childRef.value ? (childRef.value.style.visibility = 'visible') : null
|
||||
childRef.value ? (childRef.value.style.opacity = '1') : null
|
||||
childrenShown.value = true
|
||||
}
|
||||
|
||||
function hideChildren() {
|
||||
childRef.value ? (childRef.value.style.visibility = "hidden") : null;
|
||||
popperInstance?.destroy();
|
||||
childrenShown.value = false;
|
||||
childRef.value ? (childRef.value.style.visibility = 'hidden') : null
|
||||
childRef.value ? (childRef.value.style.opacity = '0') : null
|
||||
popperInstance?.destroy()
|
||||
childrenShown.value = false
|
||||
}
|
||||
|
||||
function hideContextMenu() {
|
||||
if (props.option.children) return;
|
||||
emit("hideContextMenu");
|
||||
emit('hideContextMenu')
|
||||
}
|
||||
|
||||
function runAction() {
|
||||
if (props.option.children) {
|
||||
if (childrenShown.value) {
|
||||
hideChildren();
|
||||
return;
|
||||
if (!props.option.singleChild && props.option.children) {
|
||||
if (childrenShown.value) {
|
||||
hideChildren()
|
||||
return
|
||||
}
|
||||
|
||||
showChildren()
|
||||
return
|
||||
}
|
||||
|
||||
showChildren();
|
||||
return;
|
||||
}
|
||||
|
||||
props.option.action && props.option.action();
|
||||
hideContextMenu();
|
||||
props.option.action && props.option.action()
|
||||
hideContextMenu()
|
||||
}
|
||||
|
||||
function runChildAction(action: () => void) {
|
||||
action();
|
||||
emit("hideContextMenu");
|
||||
action()
|
||||
emit('hideContextMenu')
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.context-item {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0.4rem;
|
||||
position: relative;
|
||||
border-radius: $small;
|
||||
cursor: pointer;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0.4rem;
|
||||
position: relative;
|
||||
border-radius: $small;
|
||||
transition: background-color 0.2s ease-out;
|
||||
|
||||
.more {
|
||||
height: 1.5rem;
|
||||
width: 1.5rem;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
transform: scale(0.65);
|
||||
}
|
||||
|
||||
.children {
|
||||
position: absolute;
|
||||
width: 12rem;
|
||||
z-index: 10;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
transform: scale(0);
|
||||
background-color: $context;
|
||||
transform: scale(0);
|
||||
padding: $small;
|
||||
border: solid 1px $gray3;
|
||||
|
||||
max-height: calc(100vh / 2);
|
||||
|
||||
.context-item {
|
||||
padding: $small 1rem;
|
||||
padding: 0.4rem;
|
||||
.more {
|
||||
height: 1.5rem;
|
||||
width: 1.5rem;
|
||||
position: absolute;
|
||||
right: 2px;
|
||||
bottom: 6px;
|
||||
transform: scale(0.65);
|
||||
}
|
||||
|
||||
.separator {
|
||||
padding: 0;
|
||||
.children {
|
||||
position: absolute;
|
||||
width: 12rem;
|
||||
z-index: 10;
|
||||
transform: scale(0);
|
||||
background-color: $context;
|
||||
padding: $small $smaller;
|
||||
border: solid 1px $gray3;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transition: opacity 0.25s ease-out, visibility 0.25s ease-out;
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
&:hover ::-webkit-scrollbar-thumb {
|
||||
background-color: $gray2;
|
||||
}
|
||||
|
||||
&:hover ::-webkit-scrollbar-thumb:hover {
|
||||
background-color: $gray1;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
padding: 0 $smaller;
|
||||
overflow: auto;
|
||||
overflow-x: hidden;
|
||||
max-height: calc(100vh / 2 - 2rem);
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
.context-item {
|
||||
line-height: 1.2;
|
||||
padding: $small 1rem;
|
||||
padding: 0.4rem 0.6rem;
|
||||
}
|
||||
|
||||
.separator {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: $darkestblue;
|
||||
}
|
||||
|
||||
.icon {
|
||||
height: 1.25rem;
|
||||
width: 1.25rem;
|
||||
margin-right: $small;
|
||||
|
||||
svg {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
transform: scale(1.15);
|
||||
&:hover {
|
||||
background: $darkestblue;
|
||||
}
|
||||
}
|
||||
|
||||
// add to queue icon
|
||||
&:nth-child(3) .icon > svg {
|
||||
transform: scale(0.9);
|
||||
}
|
||||
.icon {
|
||||
height: 1.25rem;
|
||||
width: 1.25rem;
|
||||
margin-right: $small;
|
||||
|
||||
.label {
|
||||
width: 9rem;
|
||||
}
|
||||
svg {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
// add to queue icon
|
||||
&:nth-child(2) .icon > svg {
|
||||
transform: scale(0.85);
|
||||
}
|
||||
|
||||
.label {
|
||||
width: 9rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* Removes the cursor pointer on the empty area within children dropdown of context-items */
|
||||
.context-item:has(.children) > .children {
|
||||
cursor: initial !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -4,27 +4,19 @@
|
||||
:class="fav.type"
|
||||
:to="{
|
||||
name: fav.type === 'album' ? Routes.album : Routes.artist,
|
||||
params:
|
||||
fav.type === 'album'
|
||||
? { albumhash: fav.item.albumhash }
|
||||
: { hash: fav.item.artisthash },
|
||||
params: fav.type === 'album' ? { albumhash: fav.item.albumhash } : { hash: fav.item.artisthash },
|
||||
}"
|
||||
>
|
||||
<div class="imagegroup">
|
||||
<img
|
||||
:src="
|
||||
fav.type === 'album'
|
||||
? paths.images.thumb.large + fav.item.image
|
||||
: paths.images.artist.large + fav.item.image
|
||||
fav.type === 'album' ? paths.images.thumb.large + fav.item.image : paths.images.artist.large + fav.item.image
|
||||
"
|
||||
alt=""
|
||||
class="rounded-sm"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
class="name ellip"
|
||||
:title="fav.type === 'artist' ? fav.item.name : fav.item.title"
|
||||
>
|
||||
<div class="name ellip" :title="fav.type === 'artist' ? fav.item.name : fav.item.title">
|
||||
{{ fav.type === "artist" ? fav.item.name : fav.item.title }}
|
||||
</div>
|
||||
<div class="label ellip" :class="{ on_artist: fav.type === 'artist' }">
|
||||
@@ -73,7 +65,7 @@ defineProps<{
|
||||
.label {
|
||||
font-size: 0.8rem;
|
||||
color: $gray1;
|
||||
font-weight: bold;
|
||||
font-weight: 700;
|
||||
border-radius: 1rem;
|
||||
text-transform: capitalize;
|
||||
margin-top: -$smaller;
|
||||
|
||||
@@ -1,87 +1,125 @@
|
||||
<template>
|
||||
<div class="breadcrumb-nav">
|
||||
<div
|
||||
v-for="path in subPaths"
|
||||
:key="path.path"
|
||||
class="path"
|
||||
:class="{ inthisfolder: path.active }"
|
||||
@click.prevent="$emit('navigate', path.path)"
|
||||
>
|
||||
<a class="text">{{ path.name }}</a>
|
||||
<!-- 👆 the a tag was misused to avoid rewriting css after moving this code to a component -->
|
||||
<div class="breadcrumb-nav">
|
||||
<div
|
||||
v-for="path in props.subPaths ? props.subPaths : subPaths"
|
||||
:key="path.path"
|
||||
class="path"
|
||||
:class="{ inthisfolder: path.active }"
|
||||
@click.prevent="$emit('navigate', path.path)"
|
||||
>
|
||||
<a class="text">{{ path.name }}</a>
|
||||
<!-- 👆 the a tag was misused to avoid rewriting css after moving this code to a component -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { onUpdated } from "vue";
|
||||
import { Ref, onMounted, onUpdated, ref, watch } from 'vue'
|
||||
|
||||
import { subPath } from "@/interfaces";
|
||||
import { focusElemByClass } from "@/utils";
|
||||
import { subPath } from '@/interfaces'
|
||||
import { createSubPaths, focusElemByClass } from '@/utils'
|
||||
|
||||
import useSettings from "@/stores/settings";
|
||||
import useSettings from '@/stores/settings'
|
||||
import useFolder from '@/stores/pages/folder'
|
||||
|
||||
const settings = useSettings();
|
||||
const props = defineProps<{
|
||||
subPaths?: subPath[]
|
||||
}>()
|
||||
|
||||
defineProps<{
|
||||
subPaths: subPath[];
|
||||
}>();
|
||||
const folder = useFolder()
|
||||
const settings = useSettings()
|
||||
|
||||
const subPaths: Ref<subPath[]> = ref([])
|
||||
|
||||
let oldpath = ''
|
||||
|
||||
const getSubPaths = (newPath: string) => {
|
||||
;[oldpath, subPaths.value] = createSubPaths(newPath, oldpath)
|
||||
}
|
||||
|
||||
// INFO: if there are no subPaths, watch the folder path
|
||||
if (!(props.subPaths && props.subPaths.length)) {
|
||||
watch(
|
||||
() => folder.path,
|
||||
newPath => {
|
||||
newPath = newPath as string
|
||||
if (newPath == undefined) return
|
||||
|
||||
getSubPaths(newPath)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
defineEmits<{
|
||||
(e: "navigate", path: string): void;
|
||||
}>();
|
||||
(e: 'navigate', path: string): void
|
||||
}>()
|
||||
|
||||
onUpdated(() => {
|
||||
if (settings.is_default_layout) {
|
||||
focusElemByClass("inthisfolder");
|
||||
}
|
||||
});
|
||||
if (settings.is_default_layout) {
|
||||
focusElemByClass('inthisfolder')
|
||||
}
|
||||
})
|
||||
|
||||
onMounted(() => {
|
||||
if (props.subPaths != undefined) {
|
||||
return
|
||||
}
|
||||
|
||||
getSubPaths(folder.path)
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.designatedOS .breadcrumb-nav {
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.breadcrumb-nav {
|
||||
display: flex;
|
||||
gap: $smaller;
|
||||
display: flex;
|
||||
gap: $smaller;
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
.path {
|
||||
white-space: nowrap;
|
||||
margin: auto 0;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.path {
|
||||
white-space: nowrap;
|
||||
margin: auto 0;
|
||||
cursor: pointer;
|
||||
.text {
|
||||
font-size: 1rem;
|
||||
font-weight: 500;
|
||||
padding: $smaller $small;
|
||||
border-radius: $smaller;
|
||||
transition: background-color 0.2s ease-out;
|
||||
}
|
||||
|
||||
.text {
|
||||
padding: $smaller;
|
||||
border-radius: $smaller;
|
||||
&::before {
|
||||
content: '∕';
|
||||
margin-right: $smaller;
|
||||
color: $gray2;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
// &:first-child {
|
||||
// display: none;
|
||||
// }
|
||||
|
||||
&:last-child {
|
||||
padding-right: $smaller;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.text {
|
||||
background-color: $gray;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&::before {
|
||||
content: "∕";
|
||||
margin-right: $smaller;
|
||||
color: $gray2;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
// &:first-child {
|
||||
// display: none;
|
||||
// }
|
||||
|
||||
&:last-child {
|
||||
padding-right: $smaller;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.text {
|
||||
.inthisfolder > .text {
|
||||
background-color: $gray;
|
||||
}
|
||||
transition: all 0.5s;
|
||||
}
|
||||
}
|
||||
|
||||
.inthisfolder > .text {
|
||||
background-color: $gray;
|
||||
transition: all 0.5s;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
<div
|
||||
v-auto-animate
|
||||
class="f-item"
|
||||
:style="{
|
||||
backgroundColor: is_checked ? '#234ece' : '',
|
||||
:class="{
|
||||
selected: is_checked,
|
||||
context_menu_showing: context_menu_showing,
|
||||
}"
|
||||
:class="{ context_menu_showing }"
|
||||
@click="(e) => (folder_page ? null : handleClick(e))"
|
||||
@mouseover="mouse_over = true"
|
||||
@mouseleave="mouse_over = false"
|
||||
@@ -16,8 +16,8 @@
|
||||
<FolderSvg v-else />
|
||||
<div class="info">
|
||||
<div class="f-item-text ellip">{{ folder.name }}</div>
|
||||
<div v-if="folder.count" class="f-count">
|
||||
{{ folder.count.toLocaleString() + ` File${folder.count == 1 ? "" : "s"}` }}
|
||||
<div class="f-count" v-if="folder.trackcount">
|
||||
{{ folder.trackcount.toLocaleString() + ` File${folder.trackcount == 1 ? "" : "s"}` }}
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="!folder_page" class="check">
|
||||
@@ -39,8 +39,8 @@ import SymLinkSvg from "@/assets/icons/symlink.svg";
|
||||
|
||||
import CheckFilledSvg from "@/assets/icons/check.filled.svg";
|
||||
import CheckSvg from "@/assets/icons/square.svg";
|
||||
import { showFolderContextMenu } from "@/helpers/contextMenuHandler";
|
||||
import { ContextSrc } from "@/enums";
|
||||
import { showFolderContextMenu } from "@/helpers/contextMenuHandler";
|
||||
|
||||
const props = defineProps<{
|
||||
folder: Folder;
|
||||
@@ -70,18 +70,13 @@ function handleClick(e: MouseEvent) {
|
||||
}
|
||||
|
||||
function showContextMenu(e: MouseEvent) {
|
||||
showFolderContextMenu(
|
||||
e,
|
||||
context_menu_showing,
|
||||
ContextSrc.FolderCard,
|
||||
props.folder.path
|
||||
);
|
||||
showFolderContextMenu(e, context_menu_showing, ContextSrc.FolderCard, props.folder.path);
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.f-item {
|
||||
height: 5rem;
|
||||
height: 4rem;
|
||||
display: grid;
|
||||
grid-template-columns: max-content 1fr;
|
||||
align-items: center;
|
||||
@@ -90,6 +85,7 @@ function showContextMenu(e: MouseEvent) {
|
||||
position: relative;
|
||||
padding: 0 0 0 1rem;
|
||||
gap: $small;
|
||||
transition: background-color 0.2s ease-out;
|
||||
|
||||
&.context_menu_showing {
|
||||
background-color: $gray4;
|
||||
@@ -97,6 +93,7 @@ function showContextMenu(e: MouseEvent) {
|
||||
|
||||
svg {
|
||||
color: $gray1;
|
||||
height: 1.75rem;
|
||||
}
|
||||
|
||||
.f-count {
|
||||
@@ -118,11 +115,8 @@ function showContextMenu(e: MouseEvent) {
|
||||
transform: scale(0.75);
|
||||
}
|
||||
|
||||
@include largePhones {
|
||||
height: 4rem;
|
||||
}
|
||||
|
||||
.f-item-text {
|
||||
font-weight: 600;
|
||||
margin-right: 1rem;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,27 +2,20 @@
|
||||
<div
|
||||
class="f-container rounded-sm"
|
||||
:class="{
|
||||
'list-mode': isIphoneSE ? true : settings.folder_list_mode,
|
||||
'list-mode': isSmallestPhone ? true : settings.folder_list_mode,
|
||||
}"
|
||||
>
|
||||
<div id="f-items" class="rounded">
|
||||
<FolderItem
|
||||
v-for="folder in folders"
|
||||
:key="folder.path"
|
||||
:folder="folder"
|
||||
:folder_page="true"
|
||||
/>
|
||||
<FolderItem v-for="folder in folders" :key="folder.path" :folder="folder" :folder_page="true" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { Folder } from "@/interfaces";
|
||||
import FolderItem from "./FolderItem.vue";
|
||||
import { isSmallestPhone } from "@/stores/content-width";
|
||||
import useSettingsStore from "@/stores/settings";
|
||||
import { isIphoneSE } from "@/stores/content-width";
|
||||
|
||||
import { ref } from "vue";
|
||||
import FolderItem from "./FolderItem.vue";
|
||||
|
||||
defineProps<{
|
||||
folders: Folder[];
|
||||
@@ -51,11 +44,13 @@ const settings = useSettingsStore();
|
||||
gap: 0;
|
||||
|
||||
.f-item {
|
||||
line-height: 1.2;
|
||||
transition: none;
|
||||
height: 3.25rem;
|
||||
border-radius: $small;
|
||||
background-color: transparent;
|
||||
padding-left: $small;
|
||||
transition: background-color 0.2s ease-out;
|
||||
|
||||
.options {
|
||||
display: block;
|
||||
@@ -66,7 +61,7 @@ const settings = useSettingsStore();
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding-right: $small;
|
||||
padding-right: $medium;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
|
||||
@@ -5,19 +5,35 @@
|
||||
<RouterLink
|
||||
v-for="i in browselist"
|
||||
:key="i.title"
|
||||
class="browseitem rounded-sm t-center"
|
||||
:to="{ name: i.route, params: i.params }"
|
||||
class="browseitem rounded-sm"
|
||||
:to="{ name: i.route || '', params: i.params }"
|
||||
:style="{ width: `${album_card_with - 24}px` }"
|
||||
@click="i.action && i.action()"
|
||||
:class="i.class"
|
||||
>
|
||||
{{ i.title }}
|
||||
<div class="icon" v-html="i.icon"></div>
|
||||
<div style="width: 100%">
|
||||
{{ i.title }}
|
||||
</div>
|
||||
</RouterLink>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
AlbumIcon,
|
||||
ArtistIcon,
|
||||
FolderIcon,
|
||||
HeartIcon,
|
||||
PlaylistIcon,
|
||||
SettingsIcon,
|
||||
ReloadIcon
|
||||
} from "@/icons";
|
||||
import { triggerScan } from "@/requests/settings/rootdirs";
|
||||
import { Routes } from "@/router";
|
||||
import { album_card_with } from "@/stores/content-width";
|
||||
import useDialog from "@/stores/modal";
|
||||
|
||||
const browselist = [
|
||||
{
|
||||
@@ -26,31 +42,61 @@ const browselist = [
|
||||
params: {
|
||||
path: "$home",
|
||||
},
|
||||
icon: FolderIcon,
|
||||
},
|
||||
{
|
||||
title: "Albums",
|
||||
route: Routes.AlbumList,
|
||||
icon: AlbumIcon,
|
||||
},
|
||||
{
|
||||
title: "Artists",
|
||||
route: Routes.ArtistList,
|
||||
icon: ArtistIcon,
|
||||
},
|
||||
{
|
||||
title: "Playlists",
|
||||
route: Routes.playlists,
|
||||
icon: PlaylistIcon,
|
||||
},
|
||||
{
|
||||
title: "Favorites",
|
||||
route: Routes.favorites,
|
||||
icon: HeartIcon,
|
||||
class: "favorite",
|
||||
},
|
||||
{
|
||||
title: "Favorite Tracks",
|
||||
title: "Fav. tracks",
|
||||
route: Routes.favoriteTracks,
|
||||
icon: HeartIcon,
|
||||
class: "favorite",
|
||||
},
|
||||
{
|
||||
title: "Favorite Artists",
|
||||
title: "Fav. artists",
|
||||
route: Routes.favoriteArtists,
|
||||
icon: ArtistIcon,
|
||||
class: "favorite",
|
||||
},
|
||||
{
|
||||
title: "Fav. albums",
|
||||
route: Routes.favoriteAlbums,
|
||||
icon: AlbumIcon,
|
||||
class: "favorite",
|
||||
},
|
||||
// {
|
||||
// title: "Settings",
|
||||
// route: null,
|
||||
// icon: SettingsIcon,
|
||||
// action: () => {
|
||||
// useDialog().showSettingsModal();
|
||||
// },
|
||||
// class: "settings",
|
||||
// },
|
||||
{
|
||||
title: "Stats",
|
||||
icon: AlbumIcon,
|
||||
route: Routes.Stats,
|
||||
}
|
||||
];
|
||||
</script>
|
||||
|
||||
@@ -62,6 +108,7 @@ const browselist = [
|
||||
.btitle {
|
||||
font-size: 1.15rem;
|
||||
margin-bottom: 1rem;
|
||||
padding-left: 0.25rem;
|
||||
}
|
||||
|
||||
.browselist {
|
||||
@@ -72,9 +119,34 @@ const browselist = [
|
||||
}
|
||||
|
||||
.browseitem {
|
||||
padding: 1.5rem 0;
|
||||
font-weight: 500;
|
||||
padding: 1.25rem 1rem;
|
||||
background-color: $gray;
|
||||
color: $white;
|
||||
transition: background-color 0.2s ease-out;
|
||||
|
||||
display: grid;
|
||||
grid-template-columns: max-content 1fr;
|
||||
place-items: center;
|
||||
gap: $small;
|
||||
|
||||
.icon {
|
||||
height: 1.75rem;
|
||||
}
|
||||
|
||||
svg {
|
||||
height: 1.75rem;
|
||||
color: $gray1;
|
||||
}
|
||||
}
|
||||
|
||||
.settings svg {
|
||||
color: $brown;
|
||||
}
|
||||
|
||||
.reload svg {
|
||||
// INFO: The icons is a bit larger than the others
|
||||
width: 1.25rem;
|
||||
}
|
||||
|
||||
.browseitem:hover {
|
||||
|
||||