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%;
|
||||
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;
|
||||
color: #00ffff;
|
||||
text-shadow: 0 0 10px rgba(0, 255, 255, 0.8);
|
||||
}
|
||||
|
||||
.fullscreen svg {
|
||||
height: 10px;
|
||||
width: 10px;
|
||||
color: #ffffffff;
|
||||
}
|
||||
|
||||
.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);
|
||||
}
|
||||
|
||||
#terminal-output::-webkit-scrollbar-button {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background: linear-gradient(to bottom, #e0e0e0 0%, #c0c0c0 50%, #a0a0a0 100%);
|
||||
border: 1px outset #c0c0c0;
|
||||
.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;
|
||||
}
|
||||
|
||||
#terminal-output::-webkit-scrollbar-button:hover {
|
||||
background: linear-gradient(to bottom, #d0d0d0 0%, #b0b0b0 50%, #909090 100%);
|
||||
/* Modal Compact Layout Styles */
|
||||
.compact-controls {
|
||||
display: flex;
|
||||
gap: 1em;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
#terminal-output::-webkit-scrollbar-button:active {
|
||||
border: 1px inset #c0c0c0;
|
||||
background: linear-gradient(to bottom, #a0a0a0 0%, #b0b0b0 50%, #d0d0d0 100%);
|
||||
.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-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-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">>_</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>
|
||||
|
||||
208
player.js
208
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))
|
||||
.modulateScale(
|
||||
noise(3.5, 0.25).modulateScale(
|
||||
osc(15).rotate(() => Math.sin(time / 2))
|
||||
),
|
||||
0.6
|
||||
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)
|
||||
)
|
||||
.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)
|
||||
.modulateScale(
|
||||
noise(2.5, 0.3).modulateScale(
|
||||
osc(10).rotate(() => Math.sin(time / 3))
|
||||
),
|
||||
0.4
|
||||
)
|
||||
.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
|
||||
)
|
||||
.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();
|
||||
});
|
||||
}, 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.');
|
||||
|
||||
Reference in New Issue
Block a user