diff --git a/media_server/static/css/styles.css b/media_server/static/css/styles.css index f48d40c..a2c5d5e 100644 --- a/media_server/static/css/styles.css +++ b/media_server/static/css/styles.css @@ -854,6 +854,199 @@ background: var(--error); } + /* Mini Player (Sticky) */ + .mini-player { + position: fixed; + top: 0; + left: 0; + right: 0; + background: var(--bg-secondary); + border-bottom: 1px solid var(--border); + padding: 0.75rem 1rem; + display: flex; + align-items: center; + gap: 1.5rem; + z-index: 1000; + transform: translateY(0); + transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); + } + + .mini-player.hidden { + transform: translateY(-100%); + opacity: 0; + pointer-events: none; + } + + .mini-player-info { + display: flex; + align-items: center; + gap: 0.75rem; + min-width: 200px; + flex-shrink: 0; + } + + .mini-album-art { + width: 40px; + height: 40px; + border-radius: 4px; + object-fit: cover; + flex-shrink: 0; + } + + .mini-track-details { + display: flex; + flex-direction: column; + min-width: 0; + } + + .mini-track-title { + font-size: 0.875rem; + font-weight: 600; + color: var(--text-primary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .mini-artist { + font-size: 0.75rem; + color: var(--text-secondary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .mini-progress-container { + flex: 1; + display: flex; + align-items: center; + gap: 1rem; + min-width: 0; + } + + .mini-time-display { + display: flex; + gap: 0.5rem; + font-size: 0.75rem; + color: var(--text-secondary); + flex-shrink: 0; + } + + .mini-progress-bar { + flex: 1; + height: 4px; + background: var(--bg-tertiary); + border-radius: 2px; + cursor: pointer; + position: relative; + min-width: 100px; + } + + .mini-progress-bar:hover { + height: 6px; + } + + .mini-progress-fill { + height: 100%; + background: var(--accent); + border-radius: 2px; + width: 0%; + transition: width 0.1s linear; + } + + .mini-controls { + display: flex; + align-items: center; + gap: 0.5rem; + flex-shrink: 0; + } + + .mini-control-btn { + background: var(--bg-tertiary); + border: 1px solid var(--border); + border-radius: 50%; + width: 36px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.2s; + padding: 0; + } + + .mini-control-btn:hover { + background: var(--accent); + border-color: var(--accent); + transform: scale(1.05); + } + + .mini-control-btn:disabled { + opacity: 0.5; + cursor: not-allowed; + } + + .mini-control-btn svg { + width: 20px; + height: 20px; + fill: currentColor; + } + + .mini-volume-container { + display: flex; + align-items: center; + gap: 0.75rem; + flex-shrink: 0; + min-width: 180px; + } + + .mini-volume-slider { + flex: 1; + height: 4px; + -webkit-appearance: none; + appearance: none; + background: var(--bg-tertiary); + border-radius: 2px; + outline: none; + cursor: pointer; + min-width: 80px; + } + + .mini-volume-slider::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + width: 12px; + height: 12px; + background: var(--accent); + border-radius: 50%; + cursor: pointer; + } + + .mini-volume-slider::-moz-range-thumb { + width: 12px; + height: 12px; + background: var(--accent); + border-radius: 50%; + cursor: pointer; + border: none; + } + + .mini-volume-slider:hover::-webkit-slider-thumb { + transform: scale(1.2); + } + + .mini-volume-slider:hover::-moz-range-thumb { + transform: scale(1.2); + } + + .mini-volume-display { + font-size: 0.75rem; + color: var(--text-secondary); + min-width: 36px; + text-align: right; + } + /* SVG Icons */ svg { width: 24px; diff --git a/media_server/static/index.html b/media_server/static/index.html index da4c816..b961941 100644 --- a/media_server/static/index.html +++ b/media_server/static/index.html @@ -11,6 +11,42 @@ + + +