aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hg.css664
-rw-r--r--index.html123
-rw-r--r--player.js204
3 files changed, 693 insertions, 298 deletions
diff --git a/hg.css b/hg.css
index 6458610..440dd77 100644
--- a/hg.css
+++ b/hg.css
@@ -49,17 +49,20 @@ body {
left: 50%;
margin: -250px 0 0 -175px;
overflow: hidden;
- border-radius: 10px;
- box-shadow: 3px 3px 20px rgba(0, 0, 0, 0.5);
+ border-radius: 12px;
+ 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;
+ background: linear-gradient(135deg, #1a0033 0%, #0a0015 50%, #000008 100%);
background-position: 50% 50%;
background-repeat: no-repeat;
z-index: 999;
}
.music-player .color-overlay {
- /* Rectangle 11: */
- background: rgba(84, 104, 110, 0.4);
+ background: rgba(26, 0, 51, 0.6);
width: 350px;
height: 500px;
position: absolute;
@@ -70,22 +73,10 @@ body {
}
.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(
- rgba(0, 0, 0, 0) 0%,
- rgba(0, 0, 0, 0.6) 21%
+ rgba(255, 41, 117, 0) 0%,
+ rgba(255, 41, 117, 0.1) 50%,
+ rgba(0, 255, 255, 0.1) 100%
);
width: 350px;
height: 500px;
@@ -95,29 +86,8 @@ body {
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 {
- background: rgba(84, 104, 110, 0.8);
+ background: rgba(26, 0, 51, 0.8);
}
.title-content {
@@ -131,29 +101,34 @@ body {
}
h3#track-name {
- font-size: 26px;
+ font-size: 24px;
font-weight: 500;
letter-spacing: 2px;
- color: #e91e63;
- /* font-family: "StreamSter", sans-serif; */
+ color: #ff2975;
+ text-shadow: 0 0 15px rgba(255, 41, 117, 0.8);
font-family: "VCR", sans-serif;
margin-bottom: 0;
- background: rgb(0 0 0 / 71%);
- padding: 10px;
+ background: rgba(0, 0, 0, 0.7);
+ border: 1px solid rgba(255, 41, 117, 0.5);
+ border-radius: 6px;
+ padding: 12px;
+ backdrop-filter: blur(5px);
}
hr {
- width: 50px;
- height: 3px;
+ width: 60px;
+ height: 2px;
margin: 20px auto;
border: 0;
- background: #d0bb57;
+ background: linear-gradient(90deg, #ff2975 0%, #00ffff 100%);
+ box-shadow: 0 0 10px rgba(255, 41, 117, 0.6);
}
.intro {
width: 170px;
margin: 0 auto;
- color: #dce3e7;
+ color: #00ffff;
+ text-shadow: 0 0 8px rgba(0, 255, 255, 0.6);
font-family: "VCR", serif;
font-size: 13px;
font-style: italic;
@@ -211,17 +186,55 @@ dialog::backdrop {
.modal-bg {
position: absolute;
- background: teal;
- background-image: url(./images/comp009.jpg);
+ background: rgba(0, 0, 0, 0.8);
+ backdrop-filter: blur(2px);
width: 100%;
height: 100%;
}
.modal-container {
- border-radius: 10px;
- background: #fff;
+ border-radius: 8px;
+ 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;
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 {
@@ -230,11 +243,28 @@ dialog::backdrop {
top: 15px;
outline: none;
appearance: none;
- color: red;
+ color: #ff2975;
background: none;
border: 0px;
font-weight: bold;
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 {
@@ -260,20 +290,31 @@ dialog::backdrop {
bottom: 0px;
width: 342px;
display: flex;
- color: #ffffff;
+ color: #00ffff;
+ text-shadow: 0 0 6px rgba(0, 255, 255, 0.6);
z-index: 999;
justify-content: center;
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 {
- font-size: 13px;
+ font-size: 12px;
font-family: "VCR", serif;
text-decoration: none;
cursor: pointer;
padding-left: 10px;
- color: #ffffff;
+ color: #00ffff;
+ text-shadow: 0 0 6px rgba(0, 255, 255, 0.6);
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 {
@@ -285,33 +326,82 @@ canvas {
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 {
z-index: 999;
cursor: pointer;
position: relative;
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 {
- float: right;
+ font-size: 16px;
}
.fullscreen {
- float: left;
- float: left;
- margin-left: 5px;
- margin-top: 3px;
- color: #565656;
-}
-
-.fullscreen svg {
- height: 10px;
- width: 10px;
- color: #ffffffff;
+ color: #00ffff;
+ text-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
}
-.fullscreen:hover * {
- color: #ffffff;
+.terminal-btn {
+ font-size: 14px;
}
.hidden {
@@ -349,15 +439,15 @@ canvas {
margin-top: 10px;
}
-/* Terminal Overlay Styles - ORED Initial Console Emulator Style */
+/* Terminal Overlay Styles - Retrowave/Synthwave Style */
.terminal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
- background: rgba(192, 192, 192, 0.3);
- backdrop-filter: none;
+ background: rgba(0, 0, 0, 0.8);
+ backdrop-filter: blur(2px);
z-index: 10001;
display: flex;
justify-content: center;
@@ -370,14 +460,40 @@ canvas {
height: 65%;
max-height: 450px;
min-height: 300px;
- background: #c0c0c0;
- border: 4px outset #c0c0c0;
+ background: linear-gradient(45deg, rgba(0, 0, 0, 0.95), rgba(0, 255, 255, 0.08));
+ border: 2px solid #00ffff;
border-radius: 0;
- font-family: 'VCR', 'Monaco', 'Courier New', monospace;
- box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.6);
+ font-family: 'VCR', 'Consolas', 'Courier New', monospace;
+ 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;
flex-direction: column;
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 */
@@ -385,7 +501,7 @@ canvas {
.terminal-window {
width: 100%;
height: 100vh;
- height: 100dvh; /* Dynamic viewport height for better mobile support */
+ height: 100dvh;
max-width: none;
max-height: none;
min-height: 100vh;
@@ -400,7 +516,7 @@ canvas {
}
.terminal-overlay {
- background: #c0c0c0;
+ background: rgba(0, 0, 0, 0.9);
position: fixed;
top: 0;
left: 0;
@@ -410,7 +526,7 @@ canvas {
.terminal-content {
padding: 4px;
- height: calc(100% - 24px); /* Account for header height */
+ height: calc(100% - 24px);
display: flex;
flex-direction: column;
}
@@ -418,45 +534,45 @@ canvas {
#terminal-output {
flex: 1;
margin-bottom: 8px;
- font-size: 14px;
+ font-size: 13px;
padding: 8px;
overflow-y: auto;
- min-height: 0; /* Allow flex shrinking */
+ min-height: 0;
}
.terminal-line {
- font-size: 14px;
+ font-size: 13px;
line-height: 1.3;
margin-bottom: 2px;
}
.terminal-input-line {
- flex-shrink: 0; /* Prevent input line from shrinking */
- padding: 8px;
- min-height: 44px; /* iOS minimum touch target */
- border: 2px inset #c0c0c0;
- background: #c0c0c0;
+ flex-shrink: 0;
+ padding: 8px 12px;
+ min-height: 44px;
+ border: 1px solid #ff2975;
+ background: rgba(0, 0, 0, 0.6);
position: relative;
bottom: 0;
}
.terminal-prompt {
- font-size: 14px;
- margin-right: 6px;
- line-height: 1.3;
+ font-size: 13px;
+ margin-right: 8px;
+ line-height: 1.4;
}
.terminal-input {
- font-size: 16px; /* Prevent zoom on iOS */
- line-height: 1.3;
+ font-size: 16px;
+ line-height: 1.4;
min-height: 24px;
padding: 4px 0;
}
.terminal-header {
flex-shrink: 0;
- min-height: 24px;
- padding: 4px 0;
+ min-height: 28px;
+ padding: 8px 12px;
}
.terminal-title {
@@ -464,184 +580,362 @@ canvas {
}
.terminal-close {
- width: 24px;
- height: 20px;
- font-size: 14px;
- line-height: 18px;
+ width: 28px;
+ height: 24px;
+ font-size: 16px;
+ line-height: 22px;
}
}
.terminal-header {
- background: #c0c0c0;
- color: #000000;
- padding: 1px 0;
- border-bottom: 2px inset #c0c0c0;
+ background: linear-gradient(180deg, rgba(0, 0, 0, 0.9) 0%, rgba(0, 0, 0, 0.7) 100%);
+ color: #00ffff;
+ text-shadow: 0 0 15px rgba(0, 255, 255, 1);
+ padding: 10px 12px;
+ border-bottom: 2px solid #ff2975;
display: flex;
- justify-content: center;
+ justify-content: space-between;
align-items: center;
- font-size: 10px;
+ font-size: 12px;
font-weight: bold;
- font-family: 'VCR', 'Geneva', 'Helvetica', sans-serif;
- min-height: 16px;
+ font-family: 'VCR', monospace;
+ min-height: 28px;
+ text-transform: uppercase;
+ letter-spacing: 1px;
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 {
- color: #000000;
- font-size: 10px;
+ color: #00ffff;
+ font-size: 12px;
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 {
cursor: pointer;
- color: #000000;
- font-size: 10px;
+ color: #00ffff;
+ text-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
+ font-size: 12px;
font-weight: bold;
- width: 16px;
- height: 14px;
- border: 1px outset #c0c0c0;
- background: #c0c0c0;
+ font-family: 'VCR', monospace;
+ width: 28px;
+ height: 24px;
+ border: 1px solid #00ffff;
+ background: linear-gradient(45deg, rgba(0, 0, 0, 0.8), rgba(0, 255, 255, 0.1));
text-align: center;
- line-height: 12px;
+ line-height: 22px;
border-radius: 0;
- position: absolute;
- right: 2px;
- top: 1px;
+ margin-left: 8px;
+ transition: all 0.2s ease;
+ 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 {
- 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 {
- border: 1px inset #c0c0c0;
- background: #a0a0a0;
+ transform: translateY(1px);
+ box-shadow:
+ inset 0 2px 4px rgba(0, 0, 0, 0.5),
+ 0 0 5px rgba(255, 41, 117, 0.3);
}
.terminal-content {
flex: 1;
display: flex;
flex-direction: column;
- padding: 2px;
+ padding: 8px;
overflow: hidden;
- background: #c0c0c0;
+ background: transparent;
}
#terminal-output {
flex: 1;
overflow-y: auto;
- margin-bottom: 4px;
- color: #000000;
- font-size: 9px;
- line-height: 1.1;
- font-family: 'VCR', 'Monaco', 'Courier New', monospace;
- background: #c0c0c0;
- border: 2px inset #c0c0c0;
- padding: 2px 4px;
+ margin-bottom: 8px;
+ color: #00ffff;
+ font-size: 13px;
+ line-height: 1.4;
+ font-family: 'VCR', 'Consolas', 'Courier New', monospace;
+ background: rgba(0, 0, 0, 0.6);
+ border: 1px solid #00ffff;
+ border-radius: 4px;
+ padding: 12px;
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 {
- margin-bottom: 0;
+ margin-bottom: 3px;
word-wrap: break-word;
- color: #000000;
- font-size: 9px;
- line-height: 1.1;
+ color: #00ffff;
+ font-size: 13px;
+ line-height: 1.4;
+ text-shadow: 0 0 5px rgba(0, 255, 255, 0.7);
}
.terminal-input-line {
display: flex;
align-items: center;
- color: #000000;
- font-size: 9px;
- background: #c0c0c0;
- border: 2px inset #c0c0c0;
- padding: 1px 4px;
- min-height: 14px;
+ color: #00ffff;
+ font-size: 13px;
+ background: rgba(0, 0, 0, 0.6);
+ border: 1px solid #ff2975;
+ border-radius: 4px;
+ padding: 8px 12px;
+ min-height: 32px;
+ box-shadow: inset 0 0 10px rgba(255, 41, 117, 0.2);
}
.terminal-prompt {
- color: #000000;
- margin-right: 2px;
- font-weight: normal;
- font-family: 'VCR', 'Monaco', 'Courier New', monospace;
- font-size: 9px;
+ color: #ff2975;
+ margin-right: 8px;
+ font-weight: bold;
+ font-family: 'VCR', 'Consolas', 'Courier New', monospace;
+ font-size: 13px;
+ text-shadow: 0 0 5px rgba(255, 41, 117, 0.8);
}
.terminal-input {
flex: 1;
background: transparent;
border: none;
- color: #000000;
- font-family: 'VCR', 'Monaco', 'Courier New', monospace;
- font-size: 9px;
+ color: #00ffff;
+ font-family: 'VCR', 'Consolas', 'Courier New', monospace;
+ font-size: 13px;
outline: none;
- caret-color: #000000;
- line-height: 1.1;
+ caret-color: #00ffff;
+ line-height: 1.4;
+ text-shadow: 0 0 5px rgba(0, 255, 255, 0.7);
}
.terminal-input::selection {
- background: #000080;
+ background: rgba(0, 255, 255, 0.3);
color: #ffffff;
}
.terminal-btn {
- float: right;
- margin-right: 10px;
- font-size: 16px;
- color: #565656;
-}
-
-.terminal-btn:hover {
- color: #000000;
+ font-size: 18px;
}
.terminal-overlay.hidden {
display: none;
}
-/* Custom scrollbar for terminal output - Classic style */
+/* Custom scrollbar for terminal output - Synthwave style */
#terminal-output::-webkit-scrollbar {
- width: 16px;
+ width: 12px;
}
#terminal-output::-webkit-scrollbar-track {
- background: #c0c0c0;
- border: 1px inset #c0c0c0;
+ background: rgba(0, 0, 0, 0.3);
+ border-radius: 6px;
}
#terminal-output::-webkit-scrollbar-thumb {
- background: linear-gradient(to bottom, #e0e0e0 0%, #c0c0c0 50%, #a0a0a0 100%);
- border: 1px outset #c0c0c0;
- border-radius: 0;
+ background: linear-gradient(180deg, #ff2975 0%, #8b1538 100%);
+ border-radius: 6px;
+ box-shadow: 0 0 8px rgba(255, 41, 117, 0.5);
}
#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 {
- border: 1px inset #c0c0c0;
- background: linear-gradient(to bottom, #a0a0a0 0%, #b0b0b0 50%, #d0d0d0 100%);
+ background: linear-gradient(180deg, #cc2060 0%, #661122 100%);
}
#terminal-output::-webkit-scrollbar-corner {
- background: #c0c0c0;
+ background: rgba(0, 0, 0, 0.3);
+}
+
+.modal-container #warning {
+ color: #ff8800;
+ text-shadow: 0 0 8px rgba(255, 136, 0, 0.8);
+ font-family: 'VCR', 'Consolas', 'Courier New', monospace;
+ 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;
+}
+
+/* Modal Compact Layout Styles */
+.compact-controls {
+ display: flex;
+ gap: 1em;
+ margin: 1em 0;
+}
+
+.controls-section {
+ flex: 1;
+}
+
+.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-output::-webkit-scrollbar-button {
- width: 16px;
- height: 16px;
- background: linear-gradient(to bottom, #e0e0e0 0%, #c0c0c0 50%, #a0a0a0 100%);
- border: 1px outset #c0c0c0;
+.terminal-btn .retro-icon {
+ font-size: 12px;
+ letter-spacing: -1px;
}
-#terminal-output::-webkit-scrollbar-button:hover {
- background: linear-gradient(to bottom, #d0d0d0 0%, #b0b0b0 50%, #909090 100%);
+.refresh .retro-icon {
+ font-size: 14px;
+ letter-spacing: 1px;
}
-#terminal-output::-webkit-scrollbar-button:active {
- border: 1px inset #c0c0c0;
- background: linear-gradient(to bottom, #a0a0a0 0%, #b0b0b0 50%, #d0d0d0 100%);
+.fullscreen .retro-icon {
+ font-size: 18px;
}
diff --git a/index.html b/index.html
index 9828d48..33a800c 100644
--- a/index.html
+++ b/index.html
@@ -16,72 +16,60 @@
<div class="modal" id="intro-modal">
<div class="modal-bg modal-exit"></div>
<div class="modal-container">
- <h3 class="text-center">WELCOME TO RETROWAVE PLAYER</h3>
- <p class="mt-5">HERE ARE THE CONTROLS:</p>
- <h4 class="mt-5">
- PLAY/PAUSE <span class="controls">SPACE OR CLICK OR TOUCH</span>
- </h4>
- <h4 class="mt-5">
- VOLUME UP <span class="controls">W OR SWIPE UP</span>
- </h4>
- <h4 class="mt-5">
- VOLUME DOWN <span class="controls">S OR SWIPE DOWN</span>
- </h4>
- <h4 class="mt-5">
- NEXT TRACK<span class="controls"> N OR PRESS THE REFRESH BUTTON</span>
- </h4>
- <h4 class="mt-5">
- TOGGLE CONTROLS<span class="controls"> H</span>
- </h4>
- <h4 class="mt-5">
- OPEN TERMINAL<span class="controls"> T</span>
- </h4>
- <p class="mt-5">
- (YOU CAN DOWNLOAD THE MUSIC HISTORY OF YOUR CURRENT BROWSER BY
- CLICKING THE HISTORY LINK ON THE PLAYER)
- </p>
- <p class="mt-5">ALL THE MUSIC IS FETCHED FROM RETROWAVE.RU</p>
- <div id="warning">⚠️ WARNING: THIS APPLICATION CONTAINS STROBING/FLASHING LIGHTS</div>
- <button class="modal-close modal-exit" id="initButton">X</button>
+ <h3 class="text-center">RETROWAVE PLAYER</h3>
+
+ <div id="warning">⚠️ CONTAINS STROBING LIGHTS</div>
+
+ <div class="compact-controls">
+ <div class="controls-section">
+ <h4 class="section-title">KEYBOARD</h4>
+ <div class="control-grid">
+ <span class="control-item">SPACE<small>Play</small></span>
+ <span class="control-item">W/S<small>Volume</small></span>
+ <span class="control-item">N<small>Next</small></span>
+ <span class="control-item">H<small>Hide</small></span>
+ <span class="control-item">T<small>Terminal</small></span>
+ </div>
+ </div>
+
+ <div class="controls-section">
+ <h4 class="section-title">TOUCH</h4>
+ <div class="touch-grid">
+ <span class="control-item">TAP<small>Play</small></span>
+ <span class="control-item">SWIPE<small>Volume</small></span>
+ <span class="control-item">🔃<small>Next</small></span>
+ </div>
+ </div>
+ </div>
+
+ <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 id="app">
<div class="music-player">
- <div title="FULLSCREEN" class="no-pause buttons fullscreen toggleable">
- <svg
- class="no-pause"
- width="800px"
- height="800px"
- fill="#000000"
- version="1.1"
- viewBox="0 0 384.97 384.97"
- xml:space="preserve"
- xmlns="http://www.w3.org/2000/svg"
- >
- <g style="fill: #f9f9f9">
- <g id="Fullscreen" style="fill: #f9f9f9">
- <path
- 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 class="player-controls toggleable">
+ <div class="control-group">
+ <div title="FULLSCREEN" class="no-pause buttons fullscreen">
+ <span class="retro-icon">⛶</span>
+ </div>
+ </div>
+ <div class="control-group">
+ <div class="no-pause buttons terminal-btn" title="OPEN TERMINAL">
+ <span class="retro-icon">&gt;_</span>
+ </div>
+ <div class="no-pause buttons refresh" title="NEXT TRACK">
+ <span class="retro-icon">▶▶</span>
+ </div>
+ </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="intro">NOW PLAYING</div>
<hr />
@@ -133,19 +121,6 @@
<div class="terminal-line">Welcome to Retrowave Terminal</div>
<div class="terminal-line">Type 'help' for available commands</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 class="terminal-input-line">
<span class="terminal-prompt">indrajith@retrowave:$ </span>
diff --git a/player.js b/player.js
index 3f1bfe7..3dc463d 100644
--- a/player.js
+++ b/player.js
@@ -207,7 +207,7 @@
showErrors(
"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 = () => {
- solid(0, 0).out();
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 = () => {
@@ -433,49 +457,142 @@ https://retrowave.ru/${musicData.streamUrl}
};
const waveyzz = () => {
- solid(0, 0).out();
setTimeout(() => {
- osc(60, -0.015, 0.3)
- .diff(osc(60, 0.08).rotate(Math.PI / 2))
+ osc(40, -0.01, 0.4)
+ .color(1.0, 0.16, 0.46) // Neon pink
+ .diff(
+ osc(40, 0.05)
+ .color(0.0, 1.0, 1.0) // Cyan
+ .rotate(Math.PI / 2)
+ )
.modulateScale(
- noise(3.5, 0.25).modulateScale(
- osc(15).rotate(() => Math.sin(time / 2))
+ noise(2.5, 0.3).modulateScale(
+ osc(10).rotate(() => Math.sin(time / 3))
),
- 0.6
+ 0.4
)
- .color(1, 0.5, 0.4)
- .contrast(1.4)
- .add(src(o0).modulate(o0, 0.04), 0.6)
- .invert()
- .brightness(0.1)
- .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();
- });
+ }, 100);
};
const vernoi = () => {
setTimeout(() => {
- solid(0, 0).out();
- voronoi(350, 0.15)
- .modulateScale(osc(8).rotate(Math.sin(time)), 0.5)
- .thresh(0.8)
- .modulateRotate(osc(7), 0.4)
- .thresh(0.7)
- .diff(src(o0).scale(1.8))
- .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))
+ voronoi(25, 0.15)
+ .color(1.0, 0.16, 0.46) // Neon pink
+ .add(
+ voronoi(15, 0.2)
+ .color(0.0, 1.0, 1.0) // Cyan
+ .modulateScale(osc(4), 0.2),
+ 0.6
+ )
+ .add(
+ voronoi(35, 0.1)
+ .color(0.8, 0.2, 1.0) // Purple
+ .modulateRotate(osc(1), 0.3),
+ 0.4
)
- .brightness([-0.02, -0.17].smooth().fast(0.5)) //.modulate(o0, () => a.fft[1] * .2)
+ .modulateScale(osc(8), 0.3)
+ .contrast(1.8)
+ .brightness(0.15)
.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() {
try {
@@ -515,7 +632,7 @@ https://retrowave.ru/${musicData.streamUrl}
const line = document.createElement("div");
line.className = "terminal-line";
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 {
line.textContent = text;
}
@@ -534,6 +651,7 @@ https://retrowave.ru/${musicData.streamUrl}
switch (cmd) {
case 'help':
addTerminalLine('Available commands:');
+ addTerminalLine('');
addTerminalLine(' help - Show this help message');
addTerminalLine(' play - Start/resume playback');
addTerminalLine(' pause - Pause playback');
@@ -541,8 +659,8 @@ https://retrowave.ru/${musicData.streamUrl}
addTerminalLine(' volume [0-10] - Set volume (0-10)');
addTerminalLine(' status - Show current track info');
addTerminalLine(' history - Download playlist history');
- addTerminalLine(' effect [list|name] - Change/list visual effects');
- addTerminalLine(' fullscreen - Toggle fullscreen mode');
+ addTerminalLine(' effect [list|name]- Change/list visual effects');
+ addTerminalLine(' fullscreen - Toggle fullscreen (Desktop only)');
addTerminalLine(' clear - Clear terminal');
addTerminalLine(' exit - Close terminal');
break;
@@ -611,9 +729,11 @@ https://retrowave.ru/${musicData.streamUrl}
if (args[1]) {
if (args[1] === 'list') {
addTerminalLine('Available effects:');
- addTerminalLine(' vernoi - Voronoi pattern effect');
- addTerminalLine(' waveyzz - Wave synthesis effect');
- addTerminalLine(' oscrotate - Oscillating rotation effect');
+ addTerminalLine(' vernoi - Synthwave Voronoi patterns');
+ addTerminalLine(' waveyzz - Neon wave synthesis');
+ addTerminalLine(' oscrotate - Oscillating neon shapes');
+ addTerminalLine(' retrosun - Retro sunset with grid');
+ addTerminalLine(' synthwave - Basic synthwave pattern');
addTerminalLine('Usage: effect <effect_name> or effect list');
} else {
const effectName = args[1].toLowerCase();
@@ -629,6 +749,12 @@ https://retrowave.ru/${musicData.streamUrl}
case 'oscrotate':
effectIndex = 2;
break;
+ case 'retrosun':
+ effectIndex = 3;
+ break;
+ case 'synthwave':
+ effectIndex = 4;
+ break;
default:
addTerminalLine(`Unknown effect: ${effectName}`);
addTerminalLine('Type "effect list" to see available effects.');