diff options
-rw-r--r-- | hg.css | 664 | ||||
-rw-r--r-- | index.html | 123 | ||||
-rw-r--r-- | player.js | 204 |
3 files changed, 693 insertions, 298 deletions
@@ -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; } @@ -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> @@ -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.'); |