New Features

* Retrowave Styles (Partially AI generated)
This commit is contained in:
2025-06-30 20:42:31 +05:30
parent ac588b9dbc
commit 97cb66b577
3 changed files with 695 additions and 300 deletions

664
hg.css
View File

@@ -49,17 +49,20 @@ body {
left: 50%; left: 50%;
margin: -250px 0 0 -175px; margin: -250px 0 0 -175px;
overflow: hidden; overflow: hidden;
border-radius: 10px; border-radius: 12px;
box-shadow: 3px 3px 20px rgba(0, 0, 0, 0.5); border: 2px solid #ff2975;
box-shadow: 0 0 30px rgba(255, 41, 117, 0.6),
0 0 60px rgba(255, 41, 117, 0.3),
inset 0 0 20px rgba(255, 41, 117, 0.1);
text-align: center; text-align: center;
background: linear-gradient(135deg, #1a0033 0%, #0a0015 50%, #000008 100%);
background-position: 50% 50%; background-position: 50% 50%;
background-repeat: no-repeat; background-repeat: no-repeat;
z-index: 999; z-index: 999;
} }
.music-player .color-overlay { .music-player .color-overlay {
/* Rectangle 11: */ background: rgba(26, 0, 51, 0.6);
background: rgba(84, 104, 110, 0.4);
width: 350px; width: 350px;
height: 500px; height: 500px;
position: absolute; position: absolute;
@@ -70,22 +73,10 @@ body {
} }
.music-player .gradient-overlay { .music-player .gradient-overlay {
/* bg-gradient: */
background-image: -webkit-linear-gradient(
rgba(0, 0, 0, 0) 0%,
rgba(0, 0, 0, 0.6) 21%
);
background-image: -moz-linear-gradient(
rgba(0, 0, 0, 0) 0%,
rgba(0, 0, 0, 0.6) 21%
);
background-image: -o-linear-gradient(
rgba(0, 0, 0, 0) 0%,
rgba(0, 0, 0, 0.6) 21%
);
background-image: linear-gradient( background-image: linear-gradient(
rgba(0, 0, 0, 0) 0%, rgba(255, 41, 117, 0) 0%,
rgba(0, 0, 0, 0.6) 21% rgba(255, 41, 117, 0.1) 50%,
rgba(0, 255, 255, 0.1) 100%
); );
width: 350px; width: 350px;
height: 500px; height: 500px;
@@ -95,29 +86,8 @@ body {
z-index: 15; z-index: 15;
} }
.player-controls {
/* width: 100%;
position: absolute;
bottom: 100px;
left: 0;
margin: 0 auto;
padding: 0 50px;
color: #DCE3E7;
font-family: 'Droid Serif', serif;
font-style: 16px;
line-height: 24px;
z-index: 20;
opacity: 0;
transition: bottom 0.3s, opacity 0.3s cubic-bezier(0.33, 0.66, 0.66, 1); */
}
.music-player:hover .player-controls {
opacity: 1;
bottom: 120px;
}
.music-player:hover .color-overlay { .music-player:hover .color-overlay {
background: rgba(84, 104, 110, 0.8); background: rgba(26, 0, 51, 0.8);
} }
.title-content { .title-content {
@@ -131,29 +101,34 @@ body {
} }
h3#track-name { h3#track-name {
font-size: 26px; font-size: 24px;
font-weight: 500; font-weight: 500;
letter-spacing: 2px; letter-spacing: 2px;
color: #e91e63; color: #ff2975;
/* font-family: "StreamSter", sans-serif; */ text-shadow: 0 0 15px rgba(255, 41, 117, 0.8);
font-family: "VCR", sans-serif; font-family: "VCR", sans-serif;
margin-bottom: 0; margin-bottom: 0;
background: rgb(0 0 0 / 71%); background: rgba(0, 0, 0, 0.7);
padding: 10px; border: 1px solid rgba(255, 41, 117, 0.5);
border-radius: 6px;
padding: 12px;
backdrop-filter: blur(5px);
} }
hr { hr {
width: 50px; width: 60px;
height: 3px; height: 2px;
margin: 20px auto; margin: 20px auto;
border: 0; border: 0;
background: #d0bb57; background: linear-gradient(90deg, #ff2975 0%, #00ffff 100%);
box-shadow: 0 0 10px rgba(255, 41, 117, 0.6);
} }
.intro { .intro {
width: 170px; width: 170px;
margin: 0 auto; margin: 0 auto;
color: #dce3e7; color: #00ffff;
text-shadow: 0 0 8px rgba(0, 255, 255, 0.6);
font-family: "VCR", serif; font-family: "VCR", serif;
font-size: 13px; font-size: 13px;
font-style: italic; font-style: italic;
@@ -211,17 +186,55 @@ dialog::backdrop {
.modal-bg { .modal-bg {
position: absolute; position: absolute;
background: teal; background: rgba(0, 0, 0, 0.8);
background-image: url(./images/comp009.jpg); backdrop-filter: blur(2px);
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.modal-container { .modal-container {
border-radius: 10px; border-radius: 8px;
background: #fff; background: linear-gradient(135deg, #1a0033 0%, #0a0015 50%, #000008 100%);
border: 2px solid #ff2975;
box-shadow: 0 0 30px rgba(255, 41, 117, 0.5),
inset 0 0 20px rgba(255, 41, 117, 0.1);
position: relative; position: relative;
padding: 30px; padding: 30px;
color: #00ffff;
font-family: 'VCR', 'Consolas', 'Courier New', monospace;
}
.modal-container h3 {
color: #ff2975;
text-shadow: 0 0 12px rgba(255, 41, 117, 0.8);
font-family: 'VCR', 'Consolas', 'Courier New', monospace;
font-size: 1.1em;
margin-bottom: 1em;
padding-bottom: 0.4em;
border-bottom: 1px solid rgba(255, 41, 117, 0.4);
}
.modal-container h4 {
color: #00ffff;
text-shadow: 0 0 8px rgba(0, 255, 255, 0.6);
font-family: 'VCR', 'Consolas', 'Courier New', monospace;
font-size: 0.9em;
margin: 0.8em 0;
}
.modal-container p {
color: #00ffff;
text-shadow: 0 0 8px rgba(0, 255, 255, 0.6);
font-family: 'VCR', 'Consolas', 'Courier New', monospace;
font-size: 0.9em;
margin: 0.8em 0;
}
.modal-container .controls {
color: #ff2975;
text-shadow: 0 0 8px rgba(255, 41, 117, 0.8);
font-style: normal;
font-weight: bold;
} }
.modal-close { .modal-close {
@@ -230,11 +243,28 @@ dialog::backdrop {
top: 15px; top: 15px;
outline: none; outline: none;
appearance: none; appearance: none;
color: red; color: #ff2975;
background: none; background: none;
border: 0px; border: 0px;
font-weight: bold; font-weight: bold;
cursor: pointer; cursor: pointer;
font-family: 'VCR', 'Consolas', 'Courier New', monospace;
font-size: 20px;
text-shadow: 0 0 10px rgba(255, 41, 117, 0.8);
transition: color 0.3s, text-shadow 0.3s, transform 0.2s;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
}
.modal-close:hover {
color: #00ffff;
text-shadow: 0 0 15px rgba(0, 255, 255, 0.8);
transform: scale(1.1);
background: rgba(255, 41, 117, 0.1);
} }
.text-center { .text-center {
@@ -260,20 +290,31 @@ dialog::backdrop {
bottom: 0px; bottom: 0px;
width: 342px; width: 342px;
display: flex; display: flex;
color: #ffffff; color: #00ffff;
text-shadow: 0 0 6px rgba(0, 255, 255, 0.6);
z-index: 999; z-index: 999;
justify-content: center; justify-content: center;
height: 17px; height: 17px;
background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(3px);
border-top: 1px solid rgba(0, 255, 255, 0.3);
} }
.footer .footer-items { .footer .footer-items {
font-size: 13px; font-size: 12px;
font-family: "VCR", serif; font-family: "VCR", serif;
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
padding-left: 10px; padding-left: 10px;
color: #ffffff; color: #00ffff;
text-shadow: 0 0 6px rgba(0, 255, 255, 0.6);
justify-content: center; justify-content: center;
transition: all 0.3s ease;
}
.footer .footer-items:hover {
color: #ff2975;
text-shadow: 0 0 10px rgba(255, 41, 117, 0.8);
} }
.footer-items#history { .footer-items#history {
@@ -285,33 +326,82 @@ canvas {
top: 0; top: 0;
} }
.player-controls {
position: absolute;
top: 0;
left: 0;
right: 0;
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 12px;
z-index: 999;
}
.control-group {
display: flex;
align-items: center;
gap: 8px;
}
.buttons { .buttons {
z-index: 999; z-index: 999;
cursor: pointer; cursor: pointer;
position: relative; position: relative;
user-select: none; user-select: none;
color: #00ffff;
text-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
transition: all 0.2s ease;
padding: 6px 10px;
border: 1px solid #00ffff;
border-radius: 0;
background: linear-gradient(45deg, rgba(0, 0, 0, 0.8), rgba(0, 255, 255, 0.1));
font-size: 14px;
display: flex;
align-items: center;
justify-content: center;
min-width: 32px;
min-height: 32px;
font-family: "VCR", monospace;
box-shadow:
inset 0 1px 0 rgba(0, 255, 255, 0.3),
inset 0 -1px 0 rgba(0, 0, 0, 0.5),
0 2px 4px rgba(0, 0, 0, 0.3);
text-transform: uppercase;
letter-spacing: 1px;
}
.buttons:hover {
color: #ff2975;
text-shadow: 0 0 15px rgba(255, 41, 117, 1);
border-color: #ff2975;
background: linear-gradient(45deg, rgba(0, 0, 0, 0.8), rgba(255, 41, 117, 0.2));
box-shadow:
inset 0 1px 0 rgba(255, 41, 117, 0.3),
inset 0 -1px 0 rgba(0, 0, 0, 0.5),
0 0 20px rgba(255, 41, 117, 0.4),
0 2px 4px rgba(0, 0, 0, 0.3);
transform: translateY(-1px);
}
.buttons:active {
transform: translateY(1px);
box-shadow:
inset 0 2px 4px rgba(0, 0, 0, 0.5),
0 0 10px rgba(255, 41, 117, 0.3);
} }
.refresh { .refresh {
float: right; font-size: 16px;
} }
.fullscreen { .fullscreen {
float: left; color: #00ffff;
float: left; text-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
margin-left: 5px;
margin-top: 3px;
color: #565656;
} }
.fullscreen svg { .terminal-btn {
height: 10px; font-size: 14px;
width: 10px;
color: #ffffffff;
}
.fullscreen:hover * {
color: #ffffff;
} }
.hidden { .hidden {
@@ -349,15 +439,15 @@ canvas {
margin-top: 10px; margin-top: 10px;
} }
/* Terminal Overlay Styles - ORED Initial Console Emulator Style */ /* Terminal Overlay Styles - Retrowave/Synthwave Style */
.terminal-overlay { .terminal-overlay {
position: fixed; position: fixed;
top: 0; top: 0;
left: 0; left: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
background: rgba(192, 192, 192, 0.3); background: rgba(0, 0, 0, 0.8);
backdrop-filter: none; backdrop-filter: blur(2px);
z-index: 10001; z-index: 10001;
display: flex; display: flex;
justify-content: center; justify-content: center;
@@ -370,14 +460,40 @@ canvas {
height: 65%; height: 65%;
max-height: 450px; max-height: 450px;
min-height: 300px; min-height: 300px;
background: #c0c0c0; background: linear-gradient(45deg, rgba(0, 0, 0, 0.95), rgba(0, 255, 255, 0.08));
border: 4px outset #c0c0c0; border: 2px solid #00ffff;
border-radius: 0; border-radius: 0;
font-family: 'VCR', 'Monaco', 'Courier New', monospace; font-family: 'VCR', 'Consolas', 'Courier New', monospace;
box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.6); box-shadow:
inset 0 1px 0 rgba(0, 255, 255, 0.4),
inset 0 -1px 0 rgba(0, 0, 0, 0.6),
0 0 30px rgba(0, 255, 255, 0.5),
0 0 60px rgba(0, 255, 255, 0.2),
0 4px 8px rgba(0, 0, 0, 0.4);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
position: relative; position: relative;
overflow: hidden;
animation: terminalGlow 3s ease-in-out infinite alternate;
}
@keyframes terminalGlow {
0% {
box-shadow:
inset 0 1px 0 rgba(0, 255, 255, 0.4),
inset 0 -1px 0 rgba(0, 0, 0, 0.6),
0 0 30px rgba(0, 255, 255, 0.5),
0 0 60px rgba(0, 255, 255, 0.2),
0 4px 8px rgba(0, 0, 0, 0.4);
}
100% {
box-shadow:
inset 0 1px 0 rgba(0, 255, 255, 0.5),
inset 0 -1px 0 rgba(0, 0, 0, 0.6),
0 0 40px rgba(0, 255, 255, 0.6),
0 0 80px rgba(0, 255, 255, 0.3),
0 4px 8px rgba(0, 0, 0, 0.4);
}
} }
/* Mobile-specific terminal styling */ /* Mobile-specific terminal styling */
@@ -385,7 +501,7 @@ canvas {
.terminal-window { .terminal-window {
width: 100%; width: 100%;
height: 100vh; height: 100vh;
height: 100dvh; /* Dynamic viewport height for better mobile support */ height: 100dvh;
max-width: none; max-width: none;
max-height: none; max-height: none;
min-height: 100vh; min-height: 100vh;
@@ -400,7 +516,7 @@ canvas {
} }
.terminal-overlay { .terminal-overlay {
background: #c0c0c0; background: rgba(0, 0, 0, 0.9);
position: fixed; position: fixed;
top: 0; top: 0;
left: 0; left: 0;
@@ -410,7 +526,7 @@ canvas {
.terminal-content { .terminal-content {
padding: 4px; padding: 4px;
height: calc(100% - 24px); /* Account for header height */ height: calc(100% - 24px);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
} }
@@ -418,45 +534,45 @@ canvas {
#terminal-output { #terminal-output {
flex: 1; flex: 1;
margin-bottom: 8px; margin-bottom: 8px;
font-size: 14px; font-size: 13px;
padding: 8px; padding: 8px;
overflow-y: auto; overflow-y: auto;
min-height: 0; /* Allow flex shrinking */ min-height: 0;
} }
.terminal-line { .terminal-line {
font-size: 14px; font-size: 13px;
line-height: 1.3; line-height: 1.3;
margin-bottom: 2px; margin-bottom: 2px;
} }
.terminal-input-line { .terminal-input-line {
flex-shrink: 0; /* Prevent input line from shrinking */ flex-shrink: 0;
padding: 8px; padding: 8px 12px;
min-height: 44px; /* iOS minimum touch target */ min-height: 44px;
border: 2px inset #c0c0c0; border: 1px solid #ff2975;
background: #c0c0c0; background: rgba(0, 0, 0, 0.6);
position: relative; position: relative;
bottom: 0; bottom: 0;
} }
.terminal-prompt { .terminal-prompt {
font-size: 14px; font-size: 13px;
margin-right: 6px; margin-right: 8px;
line-height: 1.3; line-height: 1.4;
} }
.terminal-input { .terminal-input {
font-size: 16px; /* Prevent zoom on iOS */ font-size: 16px;
line-height: 1.3; line-height: 1.4;
min-height: 24px; min-height: 24px;
padding: 4px 0; padding: 4px 0;
} }
.terminal-header { .terminal-header {
flex-shrink: 0; flex-shrink: 0;
min-height: 24px; min-height: 28px;
padding: 4px 0; padding: 8px 12px;
} }
.terminal-title { .terminal-title {
@@ -464,184 +580,362 @@ canvas {
} }
.terminal-close { .terminal-close {
width: 24px; width: 28px;
height: 20px; height: 24px;
font-size: 14px; font-size: 16px;
line-height: 18px; line-height: 22px;
} }
} }
.terminal-header { .terminal-header {
background: #c0c0c0; background: linear-gradient(180deg, rgba(0, 0, 0, 0.9) 0%, rgba(0, 0, 0, 0.7) 100%);
color: #000000; color: #00ffff;
padding: 1px 0; text-shadow: 0 0 15px rgba(0, 255, 255, 1);
border-bottom: 2px inset #c0c0c0; padding: 10px 12px;
border-bottom: 2px solid #ff2975;
display: flex; display: flex;
justify-content: center; justify-content: space-between;
align-items: center; align-items: center;
font-size: 10px; font-size: 12px;
font-weight: bold; font-weight: bold;
font-family: 'VCR', 'Geneva', 'Helvetica', sans-serif; font-family: 'VCR', monospace;
min-height: 16px; min-height: 28px;
text-transform: uppercase;
letter-spacing: 1px;
position: relative; position: relative;
} }
.terminal-header::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, #00ffff, transparent);
box-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
}
.terminal-title { .terminal-title {
color: #000000; color: #00ffff;
font-size: 10px; font-size: 12px;
font-weight: bold; font-weight: bold;
text-align: center; text-align: left;
flex: 1;
text-shadow: 0 0 15px rgba(0, 255, 255, 1);
animation: titleGlow 2s ease-in-out infinite alternate;
}
@keyframes titleGlow {
0% { opacity: 0.9; }
100% { opacity: 1; }
} }
.terminal-close { .terminal-close {
cursor: pointer; cursor: pointer;
color: #000000; color: #00ffff;
font-size: 10px; text-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
font-size: 12px;
font-weight: bold; font-weight: bold;
width: 16px; font-family: 'VCR', monospace;
height: 14px; width: 28px;
border: 1px outset #c0c0c0; height: 24px;
background: #c0c0c0; border: 1px solid #00ffff;
background: linear-gradient(45deg, rgba(0, 0, 0, 0.8), rgba(0, 255, 255, 0.1));
text-align: center; text-align: center;
line-height: 12px; line-height: 22px;
border-radius: 0; border-radius: 0;
position: absolute; margin-left: 8px;
right: 2px; transition: all 0.2s ease;
top: 1px; box-shadow:
inset 0 1px 0 rgba(0, 255, 255, 0.3),
inset 0 -1px 0 rgba(0, 0, 0, 0.5),
0 2px 4px rgba(0, 0, 0, 0.3);
text-transform: uppercase;
letter-spacing: 1px;
} }
.terminal-close:hover { .terminal-close:hover {
background: #b0b0b0; color: #ff2975;
text-shadow: 0 0 15px rgba(255, 41, 117, 1);
border-color: #ff2975;
background: linear-gradient(45deg, rgba(0, 0, 0, 0.8), rgba(255, 41, 117, 0.2));
box-shadow:
inset 0 1px 0 rgba(255, 41, 117, 0.3),
inset 0 -1px 0 rgba(0, 0, 0, 0.5),
0 0 20px rgba(255, 41, 117, 0.4),
0 2px 4px rgba(0, 0, 0, 0.3);
transform: translateY(-1px);
} }
.terminal-close:active { .terminal-close:active {
border: 1px inset #c0c0c0; transform: translateY(1px);
background: #a0a0a0; box-shadow:
inset 0 2px 4px rgba(0, 0, 0, 0.5),
0 0 5px rgba(255, 41, 117, 0.3);
} }
.terminal-content { .terminal-content {
flex: 1; flex: 1;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 2px; padding: 8px;
overflow: hidden; overflow: hidden;
background: #c0c0c0; background: transparent;
} }
#terminal-output { #terminal-output {
flex: 1; flex: 1;
overflow-y: auto; overflow-y: auto;
margin-bottom: 4px; margin-bottom: 8px;
color: #000000; color: #00ffff;
font-size: 9px; font-size: 13px;
line-height: 1.1; line-height: 1.4;
font-family: 'VCR', 'Monaco', 'Courier New', monospace; font-family: 'VCR', 'Consolas', 'Courier New', monospace;
background: #c0c0c0; background: rgba(0, 0, 0, 0.6);
border: 2px inset #c0c0c0; border: 1px solid #00ffff;
padding: 2px 4px; border-radius: 4px;
padding: 12px;
white-space: pre-wrap; white-space: pre-wrap;
text-shadow: 0 0 5px rgba(0, 255, 255, 0.7);
box-shadow: inset 0 0 20px rgba(0, 255, 255, 0.1);
} }
.terminal-line { .terminal-line {
margin-bottom: 0; margin-bottom: 3px;
word-wrap: break-word; word-wrap: break-word;
color: #000000; color: #00ffff;
font-size: 9px; font-size: 13px;
line-height: 1.1; line-height: 1.4;
text-shadow: 0 0 5px rgba(0, 255, 255, 0.7);
} }
.terminal-input-line { .terminal-input-line {
display: flex; display: flex;
align-items: center; align-items: center;
color: #000000; color: #00ffff;
font-size: 9px; font-size: 13px;
background: #c0c0c0; background: rgba(0, 0, 0, 0.6);
border: 2px inset #c0c0c0; border: 1px solid #ff2975;
padding: 1px 4px; border-radius: 4px;
min-height: 14px; padding: 8px 12px;
min-height: 32px;
box-shadow: inset 0 0 10px rgba(255, 41, 117, 0.2);
} }
.terminal-prompt { .terminal-prompt {
color: #000000; color: #ff2975;
margin-right: 2px; margin-right: 8px;
font-weight: normal; font-weight: bold;
font-family: 'VCR', 'Monaco', 'Courier New', monospace; font-family: 'VCR', 'Consolas', 'Courier New', monospace;
font-size: 9px; font-size: 13px;
text-shadow: 0 0 5px rgba(255, 41, 117, 0.8);
} }
.terminal-input { .terminal-input {
flex: 1; flex: 1;
background: transparent; background: transparent;
border: none; border: none;
color: #000000; color: #00ffff;
font-family: 'VCR', 'Monaco', 'Courier New', monospace; font-family: 'VCR', 'Consolas', 'Courier New', monospace;
font-size: 9px; font-size: 13px;
outline: none; outline: none;
caret-color: #000000; caret-color: #00ffff;
line-height: 1.1; line-height: 1.4;
text-shadow: 0 0 5px rgba(0, 255, 255, 0.7);
} }
.terminal-input::selection { .terminal-input::selection {
background: #000080; background: rgba(0, 255, 255, 0.3);
color: #ffffff; color: #ffffff;
} }
.terminal-btn { .terminal-btn {
float: right; font-size: 18px;
margin-right: 10px;
font-size: 16px;
color: #565656;
}
.terminal-btn:hover {
color: #000000;
} }
.terminal-overlay.hidden { .terminal-overlay.hidden {
display: none; display: none;
} }
/* Custom scrollbar for terminal output - Classic style */ /* Custom scrollbar for terminal output - Synthwave style */
#terminal-output::-webkit-scrollbar { #terminal-output::-webkit-scrollbar {
width: 16px; width: 12px;
} }
#terminal-output::-webkit-scrollbar-track { #terminal-output::-webkit-scrollbar-track {
background: #c0c0c0; background: rgba(0, 0, 0, 0.3);
border: 1px inset #c0c0c0; border-radius: 6px;
} }
#terminal-output::-webkit-scrollbar-thumb { #terminal-output::-webkit-scrollbar-thumb {
background: linear-gradient(to bottom, #e0e0e0 0%, #c0c0c0 50%, #a0a0a0 100%); background: linear-gradient(180deg, #ff2975 0%, #8b1538 100%);
border: 1px outset #c0c0c0; border-radius: 6px;
border-radius: 0; box-shadow: 0 0 8px rgba(255, 41, 117, 0.5);
} }
#terminal-output::-webkit-scrollbar-thumb:hover { #terminal-output::-webkit-scrollbar-thumb:hover {
background: linear-gradient(to bottom, #d0d0d0 0%, #b0b0b0 50%, #909090 100%); background: linear-gradient(180deg, #ff4499 0%, #aa1a44 100%);
box-shadow: 0 0 12px rgba(255, 41, 117, 0.8);
} }
#terminal-output::-webkit-scrollbar-thumb:active { #terminal-output::-webkit-scrollbar-thumb:active {
border: 1px inset #c0c0c0; background: linear-gradient(180deg, #cc2060 0%, #661122 100%);
background: linear-gradient(to bottom, #a0a0a0 0%, #b0b0b0 50%, #d0d0d0 100%);
} }
#terminal-output::-webkit-scrollbar-corner { #terminal-output::-webkit-scrollbar-corner {
background: #c0c0c0; background: rgba(0, 0, 0, 0.3);
} }
#terminal-output::-webkit-scrollbar-button { .modal-container #warning {
width: 16px; color: #ff8800;
height: 16px; text-shadow: 0 0 8px rgba(255, 136, 0, 0.8);
background: linear-gradient(to bottom, #e0e0e0 0%, #c0c0c0 50%, #a0a0a0 100%); font-family: 'VCR', 'Consolas', 'Courier New', monospace;
border: 1px outset #c0c0c0; font-size: 0.7em;
margin: 0 0 1em 0;
padding: 8px;
border: 1px solid #ff8800;
border-radius: 4px;
background: rgba(255, 136, 0, 0.1);
text-align: center;
font-weight: bold;
} }
#terminal-output::-webkit-scrollbar-button:hover { /* Modal Compact Layout Styles */
background: linear-gradient(to bottom, #d0d0d0 0%, #b0b0b0 50%, #909090 100%); .compact-controls {
display: flex;
gap: 1em;
margin: 1em 0;
} }
#terminal-output::-webkit-scrollbar-button:active { .controls-section {
border: 1px inset #c0c0c0; flex: 1;
background: linear-gradient(to bottom, #a0a0a0 0%, #b0b0b0 50%, #d0d0d0 100%); }
.section-title {
color: #ff2975 !important;
text-shadow: 0 0 8px rgba(255, 41, 117, 0.8) !important;
font-size: 0.8em !important;
margin-bottom: 0.5em !important;
text-align: center;
font-weight: bold;
}
.control-grid {
display: flex;
flex-direction: column;
gap: 0.3em;
}
.touch-grid {
display: flex;
flex-direction: column;
gap: 0.3em;
}
.control-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 0.4em 0.2em;
border: 1px solid rgba(0, 255, 255, 0.3);
border-radius: 4px;
background: rgba(0, 255, 255, 0.05);
color: #00ffff;
text-shadow: 0 0 6px rgba(0, 255, 255, 0.6);
font-size: 0.7em;
font-weight: bold;
text-align: center;
}
.control-item small {
color: #ff2975;
text-shadow: 0 0 6px rgba(255, 41, 117, 0.6);
font-size: 0.8em;
margin-top: 0.1em;
}
.features-compact {
text-align: center;
margin: 0.8em 0;
}
.features-compact p {
color: #00ffff !important;
text-shadow: 0 0 6px rgba(0, 255, 255, 0.6) !important;
font-size: 0.7em !important;
margin: 0 !important;
line-height: 1.3;
}
.credit-compact {
text-align: center;
margin-top: 0.5em;
}
.credit-compact small {
color: rgba(0, 255, 255, 0.6);
text-shadow: 0 0 4px rgba(0, 255, 255, 0.3);
font-size: 0.6em;
font-style: italic;
}
/* Mobile responsive adjustments */
@media (max-width: 480px) {
.compact-controls {
flex-direction: column;
gap: 0.8em;
margin: 0.8em 0;
}
.control-grid, .touch-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.3em;
}
.control-item {
padding: 0.3em 0.1em;
font-size: 0.65em;
}
.modal-container {
padding: 15px;
max-height: 85vh;
max-width: 95vw;
}
.modal-container h3 {
font-size: 1.1em !important;
margin-bottom: 0.8em !important;
padding-bottom: 0.3em !important;
}
.features-compact p {
font-size: 0.65em !important;
}
}
/* Retro Icon Styling */
.retro-icon {
font-family: "VCR", monospace;
font-size: 16px;
font-weight: bold;
display: inline-block;
line-height: 1;
text-align: center;
}
.terminal-btn .retro-icon {
font-size: 12px;
letter-spacing: -1px;
}
.refresh .retro-icon {
font-size: 14px;
letter-spacing: 1px;
}
.fullscreen .retro-icon {
font-size: 18px;
} }

View File

@@ -16,72 +16,60 @@
<div class="modal" id="intro-modal"> <div class="modal" id="intro-modal">
<div class="modal-bg modal-exit"></div> <div class="modal-bg modal-exit"></div>
<div class="modal-container"> <div class="modal-container">
<h3 class="text-center">WELCOME TO RETROWAVE PLAYER</h3> <h3 class="text-center">RETROWAVE PLAYER</h3>
<p class="mt-5">HERE ARE THE CONTROLS:</p>
<h4 class="mt-5"> <div id="warning">⚠️ CONTAINS STROBING LIGHTS</div>
PLAY/PAUSE <span class="controls">SPACE OR CLICK OR TOUCH</span>
</h4> <div class="compact-controls">
<h4 class="mt-5"> <div class="controls-section">
VOLUME UP <span class="controls">W OR SWIPE UP</span> <h4 class="section-title">KEYBOARD</h4>
</h4> <div class="control-grid">
<h4 class="mt-5"> <span class="control-item">SPACE<small>Play</small></span>
VOLUME DOWN <span class="controls">S OR SWIPE DOWN</span> <span class="control-item">W/S<small>Volume</small></span>
</h4> <span class="control-item">N<small>Next</small></span>
<h4 class="mt-5"> <span class="control-item">H<small>Hide</small></span>
NEXT TRACK<span class="controls"> N OR PRESS THE REFRESH BUTTON</span> <span class="control-item">T<small>Terminal</small></span>
</h4> </div>
<h4 class="mt-5"> </div>
TOGGLE CONTROLS<span class="controls"> H</span>
</h4> <div class="controls-section">
<h4 class="mt-5"> <h4 class="section-title">TOUCH</h4>
OPEN TERMINAL<span class="controls"> T</span> <div class="touch-grid">
</h4> <span class="control-item">TAP<small>Play</small></span>
<p class="mt-5"> <span class="control-item">SWIPE<small>Volume</small></span>
(YOU CAN DOWNLOAD THE MUSIC HISTORY OF YOUR CURRENT BROWSER BY <span class="control-item">🔃<small>Next</small></span>
CLICKING THE HISTORY LINK ON THE PLAYER) </div>
</p> </div>
<p class="mt-5">ALL THE MUSIC IS FETCHED FROM RETROWAVE.RU</p> </div>
<div id="warning">⚠️ WARNING: THIS APPLICATION CONTAINS STROBING/FLASHING LIGHTS</div>
<button class="modal-close modal-exit" id="initButton">X</button> <div class="features-compact">
<p>• Download history • Terminal controls • Fullscreen mode</p>
</div>
<div class="credit-compact">
<small>Music from RETROWAVE.RU</small>
</div>
<button class="modal-close modal-exit" id="initButton"></button>
</div> </div>
</div> </div>
<div id="app"> <div id="app">
<div class="music-player"> <div class="music-player">
<div title="FULLSCREEN" class="no-pause buttons fullscreen toggleable"> <div class="player-controls toggleable">
<svg <div class="control-group">
class="no-pause" <div title="FULLSCREEN" class="no-pause buttons fullscreen">
width="800px" <span class="retro-icon"></span>
height="800px" </div>
fill="#000000" </div>
version="1.1" <div class="control-group">
viewBox="0 0 384.97 384.97" <div class="no-pause buttons terminal-btn" title="OPEN TERMINAL">
xml:space="preserve" <span class="retro-icon">&gt;_</span>
xmlns="http://www.w3.org/2000/svg" </div>
> <div class="no-pause buttons refresh" title="NEXT TRACK">
<g style="fill: #f9f9f9"> <span class="retro-icon">▶▶</span>
<g id="Fullscreen" style="fill: #f9f9f9"> </div>
<path </div>
d="m384.97 12.03c0-6.713-5.317-12.03-12.03-12.03h-108.09c-6.833 0-11.922 5.39-11.934 12.223 0 6.821 5.101 11.838 11.934 11.838h96.062l-0.193 96.519c0 6.833 5.197 12.03 12.03 12.03 6.833-0.012 12.03-5.197 12.03-12.03l0.193-108.37c0-0.036-0.012-0.06-0.012-0.084 1e-3 -0.037 0.013-0.061 0.013-0.097z"
style="fill: #f9f9f9"
/>
<path
d="M120.496,0H12.403c-0.036,0-0.06,0.012-0.096,0.012C12.283,0.012,12.247,0,12.223,0C5.51,0,0.192,5.317,0.192,12.03 L0,120.399c0,6.833,5.39,11.934,12.223,11.934c6.821,0,11.838-5.101,11.838-11.934l0.192-96.339h96.242 c6.833,0,12.03-5.197,12.03-12.03C132.514,5.197,127.317,0,120.496,0z"
style="fill: #f9f9f9"
/>
<path
d="m120.12 360.91h-96.062v-96.242c0-6.833-5.197-12.03-12.03-12.03s-12.031 5.196-12.031 12.03v108.09c0 0.036 0.012 0.06 0.012 0.084 0 0.036-0.012 0.06-0.012 0.096 0 6.713 5.317 12.03 12.03 12.03h108.09c6.833 0 11.922-5.39 11.934-12.223 1e-3 -6.82-5.1-11.837-11.933-11.837z"
style="fill: #f9f9f9"
/>
<path
d="m372.75 252.91c-6.833 0-11.85 5.101-11.838 11.934v96.062h-96.242c-6.833 0-12.03 5.197-12.03 12.03s5.197 12.03 12.03 12.03h108.09c0.036 0 0.06-0.012 0.084-0.012 0.036-0.012 0.06 0.012 0.096 0.012 6.713 0 12.03-5.317 12.03-12.03v-108.09c1e-3 -6.833-5.389-11.934-12.222-11.934z"
style="fill: #f9f9f9"
/>
</g>
</g>
</svg>
</div> </div>
<div class="no-pause buttons refresh toggleable" title="NEXT TRACK">🔃</div>
<div class="no-pause buttons terminal-btn toggleable" title="OPEN TERMINAL">⌨️</div>
<div class="title-content"> <div class="title-content">
<div class="intro">NOW PLAYING</div> <div class="intro">NOW PLAYING</div>
<hr /> <hr />
@@ -133,19 +121,6 @@
<div class="terminal-line">Welcome to Retrowave Terminal</div> <div class="terminal-line">Welcome to Retrowave Terminal</div>
<div class="terminal-line">Type 'help' for available commands</div> <div class="terminal-line">Type 'help' for available commands</div>
<div class="terminal-line"></div> <div class="terminal-line"></div>
<div class="terminal-line">Available commands:</div>
<div class="terminal-line"> help - Show this help message</div>
<div class="terminal-line"> play - Start/resume playback</div>
<div class="terminal-line"> pause - Pause playback</div>
<div class="terminal-line"> next - Skip to next track</div>
<div class="terminal-line"> volume [0-10] - Set volume (0-10)</div>
<div class="terminal-line"> status - Show current track info</div>
<div class="terminal-line"> history - Download playlist history</div>
<div class="terminal-line"> effect - Change visual effect</div>
<div class="terminal-line"> fullscreen - Toggle fullscreen mode</div>
<div class="terminal-line"> clear - Clear terminal</div>
<div class="terminal-line"> exit - Close terminal</div>
<div class="terminal-line"></div>
</div> </div>
<div class="terminal-input-line"> <div class="terminal-input-line">
<span class="terminal-prompt">indrajith@retrowave:$ </span> <span class="terminal-prompt">indrajith@retrowave:$ </span>

206
player.js
View File

@@ -207,7 +207,7 @@
showErrors( showErrors(
"Failed to fetch music. Please check your internet connection or try again later." "Failed to fetch music. Please check your internet connection or try again later."
); );
throw error; // rethrow the error to be caught in the catch block below throw error;
} }
} }
@@ -416,10 +416,34 @@ https://retrowave.ru/${musicData.streamUrl}
// } // }
const oscRotate = () => { const oscRotate = () => {
solid(0, 0).out();
setTimeout(() => { setTimeout(() => {
osc(10).rotate(0.5).diff(osc(200)).out(); osc(15, 0.02, 0.8)
}); .color(1.0, 0.16, 0.46) // Neon pink
.rotate(0.3)
.add(
osc(30, 0.01, 0.6)
.color(0.0, 1.0, 1.0) // Cyan
.rotate(-0.2)
.modulateRotate(osc(2), 0.5),
0.4
)
.diff(
osc(100, 0.005, 0.3)
.color(0.8, 0.2, 1.0) // Purple
.rotate(Math.PI / 3)
)
.modulateScale(osc(1, 0.1), 0.2)
.add(
shape(6, 0.8, 0.01)
.color(0.0, 1.0, 1.0) // Cyan grid
.rotate(() => time * 0.1)
.scale(0.3),
0.1
)
.contrast(1.8)
.brightness(0.1)
.out();
}, 100);
}; };
const rainbowWebcam = () => { const rainbowWebcam = () => {
@@ -433,49 +457,142 @@ https://retrowave.ru/${musicData.streamUrl}
}; };
const waveyzz = () => { const waveyzz = () => {
solid(0, 0).out();
setTimeout(() => { setTimeout(() => {
osc(60, -0.015, 0.3) osc(40, -0.01, 0.4)
.diff(osc(60, 0.08).rotate(Math.PI / 2)) .color(1.0, 0.16, 0.46) // Neon pink
.modulateScale( .diff(
noise(3.5, 0.25).modulateScale( osc(40, 0.05)
osc(15).rotate(() => Math.sin(time / 2)) .color(0.0, 1.0, 1.0) // Cyan
), .rotate(Math.PI / 2)
0.6
) )
.color(1, 0.5, 0.4) .modulateScale(
.contrast(1.4) noise(2.5, 0.3).modulateScale(
.add(src(o0).modulate(o0, 0.04), 0.6) osc(10).rotate(() => Math.sin(time / 3))
.invert() ),
.brightness(0.1) 0.4
.contrast(1.2) )
.modulateScale(osc(2), -0.2) .add(
osc(80, 0.02, 0.1)
.color(0.5, 0.0, 1.0) // Purple
.rotate(Math.PI / 4),
0.2
)
.contrast(2.0)
.add(src(o0).modulate(o0, 0.03), 0.7)
.modulateHue(osc(0.5, 0.1), 0.3)
.brightness(0.15)
.contrast(1.6)
.modulateScale(osc(1.5), -0.15)
.out(); .out();
}); }, 100);
}; };
const vernoi = () => { const vernoi = () => {
setTimeout(() => { setTimeout(() => {
solid(0, 0).out(); voronoi(25, 0.15)
voronoi(350, 0.15) .color(1.0, 0.16, 0.46) // Neon pink
.modulateScale(osc(8).rotate(Math.sin(time)), 0.5) .add(
.thresh(0.8) voronoi(15, 0.2)
.modulateRotate(osc(7), 0.4) .color(0.0, 1.0, 1.0) // Cyan
.thresh(0.7) .modulateScale(osc(4), 0.2),
.diff(src(o0).scale(1.8)) 0.6
.modulateScale(osc(2).modulateRotate(o0, 0.74))
.diff(
src(o0)
.rotate([-0.012, 0.01, -0.002, 0])
.scrollY(0, [-1 / 199800, 0].fast(0.7))
) )
.brightness([-0.02, -0.17].smooth().fast(0.5)) //.modulate(o0, () => a.fft[1] * .2) .add(
voronoi(35, 0.1)
.color(0.8, 0.2, 1.0) // Purple
.modulateRotate(osc(1), 0.3),
0.4
)
.modulateScale(osc(8), 0.3)
.contrast(1.8)
.brightness(0.15)
.out(); .out();
}); }, 100);
}; };
const hydraEffects = [vernoi, waveyzz, oscRotate]; const retroSun = () => {
setTimeout(() => {
shape(16, 0.6, 0.02)
.color(1.0, 0.5, 0.0) // Orange/yellow sun
.scale(0.8)
.add(
shape(8, 0.4, 0.05)
.color(1.0, 0.16, 0.46) // Pink inner glow
.scale(0.6),
0.6
)
.add(
osc(20, 0.01, 0.2)
.color(0.0, 1.0, 1.0) // Cyan horizontal lines
.rotate(Math.PI / 2),
0.3
)
.modulateScale(
osc(2, 0.1),
0.1
)
.add(
gradient(1.0)
.color(0.2, 0.0, 0.4) // Dark purple gradient
.rotate(Math.PI)
.scale(2.0),
0.4
)
.contrast(1.8)
.brightness(0.15)
.out();
}, 100);
};
const synthWave = () => {
setTimeout(() => {
// Animated synthwave with moving grid lines and pulsing elements
osc(30, 0, 1)
.thresh(0.9)
.color(0.0, 1.0, 1.0) // Cyan horizontal lines
.scrollY(() => time * 0.5) // Moving grid lines
.add(
gradient(0.5)
.color(1.0, 0.16, 0.46) // Pink to black gradient
.rotate(Math.PI)
.scale(1.5)
.modulateHue(osc(0.3, 0.1), 0.2), // Subtle hue shift
0.7
)
.add(
shape(3, 0.8, 0.1)
.color(1.0, 0.5, 0.0) // Orange triangle/sun shape
.scale(() => 0.3 + Math.sin(time * 2) * 0.05) // Pulsing size
.repeatY(3, 0.3)
.mult(
osc(5, 0.1, 0.8)
.color(0.8, 0.2, 1.0) // Purple modulation
.rotate(() => time * 0.1) // Slow rotation
),
0.4
)
.add(
osc(8, 0.01, 0.2)
.color(0.0, 1.0, 1.0) // More cyan lines
.thresh(0.8)
.scrollY(() => -time * 0.3) // Counter-moving lines
.mult(
gradient(1.0)
.color(0.2, 0.0, 0.4) // Dark purple fade
.scale(2.0)
.modulateScale(osc(1, 0.1), 0.1), // Breathing effect
),
0.3
)
.modulateHue(osc(0.1), 0.1) // Overall subtle color shift
.contrast(2.2)
.brightness(0.1)
.out();
}, 100);
};
const hydraEffects = [vernoi, waveyzz, oscRotate, retroSun, synthWave];
function rotateHydraEffect() { function rotateHydraEffect() {
try { try {
@@ -515,7 +632,7 @@ https://retrowave.ru/${musicData.streamUrl}
const line = document.createElement("div"); const line = document.createElement("div");
line.className = "terminal-line"; line.className = "terminal-line";
if (isCommand) { if (isCommand) {
line.innerHTML = `<span style="color: #000000; font-weight: normal;">indrajith@retrowave:$ ${text}</span>`; line.innerHTML = `<span style="color: #ff2975; font-weight: bold; text-shadow: 0 0 5px rgba(255, 41, 117, 0.8);">indrajith@retrowave:$ ${text}</span>`;
} else { } else {
line.textContent = text; line.textContent = text;
} }
@@ -534,6 +651,7 @@ https://retrowave.ru/${musicData.streamUrl}
switch (cmd) { switch (cmd) {
case 'help': case 'help':
addTerminalLine('Available commands:'); addTerminalLine('Available commands:');
addTerminalLine('');
addTerminalLine(' help - Show this help message'); addTerminalLine(' help - Show this help message');
addTerminalLine(' play - Start/resume playback'); addTerminalLine(' play - Start/resume playback');
addTerminalLine(' pause - Pause playback'); addTerminalLine(' pause - Pause playback');
@@ -542,7 +660,7 @@ https://retrowave.ru/${musicData.streamUrl}
addTerminalLine(' status - Show current track info'); addTerminalLine(' status - Show current track info');
addTerminalLine(' history - Download playlist history'); addTerminalLine(' history - Download playlist history');
addTerminalLine(' effect [list|name]- Change/list visual effects'); addTerminalLine(' effect [list|name]- Change/list visual effects');
addTerminalLine(' fullscreen - Toggle fullscreen mode'); addTerminalLine(' fullscreen - Toggle fullscreen (Desktop only)');
addTerminalLine(' clear - Clear terminal'); addTerminalLine(' clear - Clear terminal');
addTerminalLine(' exit - Close terminal'); addTerminalLine(' exit - Close terminal');
break; break;
@@ -611,9 +729,11 @@ https://retrowave.ru/${musicData.streamUrl}
if (args[1]) { if (args[1]) {
if (args[1] === 'list') { if (args[1] === 'list') {
addTerminalLine('Available effects:'); addTerminalLine('Available effects:');
addTerminalLine(' vernoi - Voronoi pattern effect'); addTerminalLine(' vernoi - Synthwave Voronoi patterns');
addTerminalLine(' waveyzz - Wave synthesis effect'); addTerminalLine(' waveyzz - Neon wave synthesis');
addTerminalLine(' oscrotate - Oscillating rotation effect'); addTerminalLine(' oscrotate - Oscillating neon shapes');
addTerminalLine(' retrosun - Retro sunset with grid');
addTerminalLine(' synthwave - Basic synthwave pattern');
addTerminalLine('Usage: effect <effect_name> or effect list'); addTerminalLine('Usage: effect <effect_name> or effect list');
} else { } else {
const effectName = args[1].toLowerCase(); const effectName = args[1].toLowerCase();
@@ -629,6 +749,12 @@ https://retrowave.ru/${musicData.streamUrl}
case 'oscrotate': case 'oscrotate':
effectIndex = 2; effectIndex = 2;
break; break;
case 'retrosun':
effectIndex = 3;
break;
case 'synthwave':
effectIndex = 4;
break;
default: default:
addTerminalLine(`Unknown effect: ${effectName}`); addTerminalLine(`Unknown effect: ${effectName}`);
addTerminalLine('Type "effect list" to see available effects.'); addTerminalLine('Type "effect list" to see available effects.');