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.'); | 
