Files
RadioPlayer-22/css/style.css
Joey 😎 c951dc70e0 Update cover image and switch lyrics API integration
Replaced cover.png with cover.jpeg and updated CSS references. Changed radio name, streaming URL, and API endpoint in script.js. Removed Vagalume lyrics API integration in favor of using lyrics from RadioAPI.me, simplifying the lyrics fetching logic.
2025-08-19 00:14:40 +00:00

839 líneas
14 KiB
CSS

@charset "utf-8";
@import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,300;0,400;0,600;0,700;1,300;1,800&display=swap");
@import url("bootstrap.min.css");
* {
box-sizing: border-box;
}
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
body {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background-color: #000;
color: #fff;
font-family: "Poppins", sans-serif;
overflow-x: hidden;
}
/* Loading Screen */
.loading-screen {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(135deg, #000 0%, #111 100%);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
transition: opacity 0.5s ease, visibility 0.5s ease;
}
.loading-screen.fade-out {
opacity: 0;
visibility: hidden;
}
.loading-content {
text-align: center;
animation: fadeInUp 0.8s ease;
}
.loading-artwork {
width: 120px;
height: 120px;
margin: 0 auto 30px;
position: relative;
border-radius: 15px;
overflow: hidden;
}
.loading-artwork-placeholder {
width: 100%;
height: 100%;
background: linear-gradient(45deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%);
border-radius: 15px;
}
.loading-pulse {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.1) 50%, transparent 70%);
animation: shimmer 2s infinite;
}
.loading-title {
font-size: 28px;
font-weight: 700;
margin-bottom: 10px;
text-transform: uppercase;
letter-spacing: 2px;
}
.loading-subtitle {
font-size: 16px;
color: #ccc;
margin-bottom: 30px;
}
.loading-bar {
width: 200px;
height: 4px;
background: rgba(255, 255, 255, 0.1);
border-radius: 2px;
margin: 0 auto;
overflow: hidden;
}
.loading-progress {
height: 100%;
background: linear-gradient(90deg, #fff 0%, #ccc 100%);
border-radius: 2px;
animation: loadingProgress 2s ease-in-out infinite;
}
/* Skeleton Loading Animations */
.song-skeleton,
.artist-skeleton,
.history-song-skeleton,
.history-artist-skeleton {
background: linear-gradient(
90deg,
rgba(255, 255, 255, 0.1) 25%,
rgba(255, 255, 255, 0.2) 50%,
rgba(255, 255, 255, 0.1) 75%
);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
border-radius: 4px;
display: inline-block;
width: 100%;
height: 1em;
}
.artist-skeleton {
width: 70%;
}
.history-song-skeleton {
width: 80%;
}
.history-artist-skeleton {
width: 60%;
}
/* Artwork Loading */
.loading-artwork-main {
position: relative;
}
.artwork-loading-spinner {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 40px;
height: 40px;
border: 3px solid rgba(255, 255, 255, 0.1);
border-top: 3px solid #fff;
border-radius: 50%;
animation: spin 1s linear infinite;
opacity: 0;
transition: opacity 0.3s ease;
}
.loading-artwork-main.loading .artwork-loading-spinner {
opacity: 1;
}
/* Button Loading */
.btn-play {
position: relative;
overflow: hidden;
}
.btn-loading-spinner {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 20px;
height: 20px;
border: 2px solid rgba(0, 0, 0, 0.1);
border-top: 2px solid #000;
border-radius: 50%;
animation: spin 1s linear infinite;
opacity: 0;
transition: opacity 0.3s ease;
}
.btn-play.loading .btn-loading-spinner {
opacity: 1;
}
.btn-play.loading i,
.btn-play.loading span {
opacity: 0;
}
/* Lyrics Loading */
.lyrics-loading-dot {
position: absolute;
top: 8px;
right: 8px;
width: 6px;
height: 6px;
background: #fff;
border-radius: 50%;
animation: pulse 1.5s infinite;
opacity: 0;
}
.lyrics.loading .lyrics-loading-dot {
opacity: 1;
}
.lyrics-loading {
padding: 20px 0;
}
.lyrics-skeleton-line {
height: 16px;
background: linear-gradient(
90deg,
rgba(255, 255, 255, 0.1) 25%,
rgba(255, 255, 255, 0.2) 50%,
rgba(255, 255, 255, 0.1) 75%
);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
border-radius: 4px;
margin-bottom: 12px;
}
.lyrics-skeleton-line.short {
width: 60%;
}
/* History Cover Loading */
.cover-historic {
position: relative;
}
.cover-loading-spinner {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 24px;
height: 24px;
border: 2px solid rgba(255, 255, 255, 0.1);
border-top: 2px solid #fff;
border-radius: 50%;
animation: spin 1s linear infinite;
opacity: 0;
transition: opacity 0.3s ease;
}
.cover-historic.loading .cover-loading-spinner {
opacity: 1;
}
.cover-site {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #000;
z-index: 1;
}
#bgCover {
height: 100%;
width: 100%;
position: absolute;
background-repeat: no-repeat;
background-size: cover;
background-position: center;
filter: blur(30px) brightness(0.3);
-webkit-filter: blur(30px) brightness(0.3);
transition: all 0.5s ease;
transform: scale(1.1);
z-index: 1;
}
.bg-mask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.9) 100%);
z-index: 2;
}
main {
position: relative;
z-index: 3;
width: 100%;
max-width: 1100px;
padding: 30px;
opacity: 0;
animation: fadeInUp 0.8s ease 0.5s forwards;
}
.container {
width: 100%;
}
/* Spotify-style Player Interface */
.player-interface {
display: flex;
align-items: center;
gap: 60px;
width: 100%;
}
/* Left Side: Artwork */
.player-left {
flex-shrink: 0;
}
.main-artwork {
width: 450px;
height: 450px;
position: relative;
border-radius: 20px;
overflow: hidden;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.6);
transition: transform 0.3s ease;
border: 1px solid rgba(255, 255, 255, 0.3);
}
.main-artwork:hover {
transform: scale(1.02);
}
#currentCoverArt {
width: 100%;
height: 100%;
background: url("../img/cover.jpeg") no-repeat center;
background-size: cover;
transition: background-image 1s ease;
}
/* Right Side: Song Info and Controls */
.player-right {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
min-width: 0;
}
/* Song Information */
.song-info {
margin-bottom: 40px;
text-align: left;
}
.current-song {
font-size: 48px;
font-weight: 700;
text-transform: uppercase;
margin: 0 0 15px 0;
letter-spacing: 1px;
line-height: 1.2;
/* Line clamp for 2 lines */
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
.current-artist {
font-size: 24px;
font-weight: 400;
color: #ccc;
margin: 0;
text-transform: capitalize;
line-height: 1.2;
/* Line clamp for 1 line */
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
/* Player Controls */
.player-controls {
display: flex;
flex-direction: column;
gap: 30px;
align-items: flex-start;
}
.btn-play {
background: linear-gradient(135deg, #fff 0%, #f0f0f0 100%);
border: none;
color: #000;
padding: 18px 45px;
font-size: 20px;
font-weight: 700;
cursor: pointer;
border-radius: 50px;
transition: all 0.3s ease;
box-shadow: 0 8px 25px rgba(255, 255, 255, 0.2);
display: flex;
align-items: center;
gap: 12px;
min-width: 160px;
justify-content: center;
height: 60px;
}
.btn-play:hover {
transform: translateY(-2px);
box-shadow: 0 12px 35px rgba(255, 255, 255, 0.3);
}
.btn-play:active {
transform: translateY(0);
}
/* Volume Control */
.volume-control {
display: flex;
align-items: center;
gap: 18px;
width: 100%;
max-width: 400px;
}
.volume-icon {
font-size: 22px;
color: #ccc;
}
.volume-slide {
flex: 1;
}
.volume-indicator {
font-size: 16px;
color: #ccc;
min-width: 55px;
text-align: right;
}
/* Action Buttons */
.action-buttons {
display: flex;
gap: 18px;
flex-wrap: wrap;
}
.btn-secondary {
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
color: #fff;
padding: 14px 24px;
font-size: 15px;
font-weight: 600;
cursor: pointer;
border-radius: 25px;
transition: all 0.3s ease;
text-decoration: none;
display: flex;
align-items: center;
gap: 10px;
position: relative;
}
.btn-secondary:hover {
background: rgba(255, 255, 255, 0.2);
border-color: rgba(255, 255, 255, 0.4);
color: #fff;
text-decoration: none;
transform: translateY(-1px);
}
/* Range Input Styling */
input[type="range"] {
-webkit-appearance: none;
background: transparent;
width: 100%;
height: 7px;
}
input[type="range"]:focus {
outline: none;
}
input[type="range"]::-webkit-slider-runnable-track {
width: 100%;
height: 7px;
cursor: pointer;
background: rgba(255, 255, 255, 0.3);
border-radius: 4px;
}
input[type="range"]::-webkit-slider-thumb {
height: 20px;
width: 20px;
border-radius: 50%;
background: #fff;
cursor: pointer;
-webkit-appearance: none;
margin-top: -6px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
}
input[type="range"]::-moz-range-track {
width: 100%;
height: 7px;
cursor: pointer;
background: rgba(255, 255, 255, 0.3);
border-radius: 4px;
border: none;
}
input[type="range"]::-moz-range-thumb {
border: none;
height: 20px;
width: 20px;
border-radius: 50%;
background: #fff;
cursor: pointer;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
}
/* Modal Styling */
.modal-content {
background-color: rgba(0, 0, 0, 0.95);
color: #fff;
border-radius: 15px;
border: 1px solid rgba(255, 255, 255, 0.2);
}
.modal-header {
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
}
.modal-footer {
border-top: 1px solid rgba(255, 255, 255, 0.2);
}
.modal-content .btn-primary {
background: linear-gradient(135deg, #fff 0%, #f0f0f0 100%);
color: #000;
border: none;
border-radius: 25px;
font-weight: 600;
}
.close {
color: #fff;
opacity: 0.8;
}
.close:hover {
color: #fff;
opacity: 1;
}
/* History Modal Styles */
.modal-lg {
max-width: 600px;
}
.history-list {
display: flex;
flex-direction: column;
gap: 15px;
}
.history-item {
display: flex;
align-items: center;
gap: 15px;
padding: 15px;
background: rgba(255, 255, 255, 0.05);
border-radius: 10px;
transition: all 0.3s ease;
}
.history-item:hover {
background: rgba(255, 255, 255, 0.1);
}
.cover-historic {
width: 80px;
height: 80px;
background: url("../img/cover.jpeg") no-repeat center;
background-size: cover;
border-radius: 10px;
flex-shrink: 0;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.music-info {
flex: 1;
text-align: left;
min-width: 0;
}
.music-info .song {
font-size: 18px;
font-weight: 600;
margin-bottom: 8px;
text-transform: uppercase;
color: #fff;
line-height: 1.2;
/* Line clamp for 2 lines in history */
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
.music-info .artist {
font-size: 16px;
color: #ccc;
text-transform: capitalize;
line-height: 1.2;
/* Line clamp for 1 line in history */
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
/* Modal backdrop for better contrast */
.modal-backdrop {
background-color: rgba(0, 0, 0, 0.8);
}
/* Responsive Design */
@media (max-width: 768px) {
main {
max-width: 100%;
padding: 15px;
}
.player-interface {
flex-direction: column;
gap: 30px;
text-align: center;
}
.player-right {
align-items: center;
}
.song-info {
text-align: center;
margin-bottom: 30px;
}
.player-controls {
align-items: center;
width: 100%;
}
.main-artwork {
width: 280px;
height: 280px;
}
.current-song {
font-size: 28px;
}
.current-artist {
font-size: 18px;
}
.action-buttons {
justify-content: center;
width: 100%;
}
.btn-secondary {
flex: 1;
justify-content: center;
max-width: 150px;
}
}
@media (max-width: 480px) {
.main-artwork {
width: 250px;
height: 250px;
}
.current-song {
font-size: 24px;
}
.current-artist {
font-size: 16px;
}
.action-buttons {
flex-direction: column;
gap: 12px;
}
.btn-secondary {
max-width: none;
}
}
/* Loading Animations */
@keyframes shimmer {
0% {
background-position: -200% 0;
}
100% {
background-position: 200% 0;
}
}
@keyframes spin {
0% {
transform: translate(-50%, -50%) rotate(0deg);
}
100% {
transform: translate(-50%, -50%) rotate(360deg);
}
}
@keyframes pulse {
0%,
100% {
opacity: 0.4;
}
50% {
opacity: 1;
}
}
@keyframes loadingProgress {
0% {
width: 0%;
}
50% {
width: 70%;
}
100% {
width: 100%;
}
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Animation Classes */
.animated {
animation-duration: 1s;
animation-fill-mode: both;
}
.flipInY {
animation-name: flipInY;
}
.bounceInLeft {
animation-name: bounceInLeft;
}
.slideInRight {
animation-name: slideInRight;
}
@keyframes flipInY {
from {
transform: perspective(400px) rotateY(90deg);
opacity: 0;
}
40% {
transform: perspective(400px) rotateY(-20deg);
}
60% {
transform: perspective(400px) rotateY(10deg);
}
80% {
transform: perspective(400px) rotateY(-5deg);
}
to {
transform: perspective(400px);
opacity: 1;
}
}
@keyframes bounceInLeft {
from,
60%,
75%,
90%,
to {
animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1.0);
}
0% {
opacity: 0;
transform: translate3d(-3000px, 0, 0);
}
60% {
opacity: 1;
transform: translate3d(25px, 0, 0);
}
75% {
transform: translate3d(-10px, 0, 0);
}
90% {
transform: translate3d(5px, 0, 0);
}
to {
transform: none;
}
}
@keyframes slideInRight {
from {
transform: translate3d(100%, 0, 0);
visibility: visible;
}
to {
transform: translate3d(0, 0, 0);
}
}