New Features
* Retrowave Styles (Partially AI generated)
This commit is contained in:
664
hg.css
664
hg.css
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
123
index.html
123
index.html
@@ -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">>_</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>
|
||||||
|
|||||||
208
player.js
208
player.js
@@ -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');
|
||||||
@@ -541,8 +659,8 @@ https://retrowave.ru/${musicData.streamUrl}
|
|||||||
addTerminalLine(' volume [0-10] - Set volume (0-10)');
|
addTerminalLine(' volume [0-10] - Set volume (0-10)');
|
||||||
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.');
|
||||||
|
|||||||
Reference in New Issue
Block a user