summaryrefslogtreecommitdiff
path: root/player-server/web/css/player.css
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-17 15:25:52 +0300
committerPaul Buetow <paul@buetow.org>2026-05-17 15:25:52 +0300
commit914bd7cd6aa14e839332a98d91c30b19865b0cf2 (patch)
tree02b11537237a204048589e14ed24938b805e42f7 /player-server/web/css/player.css
parent3b24f0e1be832584d6550e8cc3e5d24329f66f90 (diff)
Restructure repo: move Go server into player-server/
Diffstat (limited to 'player-server/web/css/player.css')
-rw-r--r--player-server/web/css/player.css302
1 files changed, 302 insertions, 0 deletions
diff --git a/player-server/web/css/player.css b/player-server/web/css/player.css
new file mode 100644
index 0000000..45d80bc
--- /dev/null
+++ b/player-server/web/css/player.css
@@ -0,0 +1,302 @@
+/* Player */
+.player {
+ position: fixed;
+ inset: auto auto 1rem 1rem;
+ width: var(--floating-w, 320px);
+ height: var(--floating-h, 240px);
+ background: var(--player-bg);
+ color: var(--text-primary);
+ border: 1px solid var(--border);
+ border-radius: 0.5rem;
+ box-shadow: 0 8px 32px rgba(0,0,0,0.4);
+ overflow: hidden;
+ z-index: 60;
+ display: none; /* hidden by default until something plays */
+ transition: inset var(--transition-base), width var(--transition-base), height var(--transition-base), box-shadow var(--transition-base);
+}
+.player.open {
+ display: flex;
+ flex-direction: column;
+}
+.player .stage {
+ flex: 1 1 auto;
+ position: relative;
+ height: auto;
+ background: var(--player-stage-bg);
+ overflow: hidden;
+}
+.player .big-play .play-icon {
+ width: 2rem;
+ height: 2rem;
+ font-size: 0.8rem;
+}
+.player.minimized {
+ inset: auto auto 1rem 1rem;
+ width: min(20rem, calc(100vw - 2rem));
+ border: 1px solid var(--border);
+ border-radius: var(--radius-sm);
+ box-shadow: 0 8px 32px rgba(0,0,0,0.4);
+ overflow: hidden;
+}
+.player.minimized .stage,
+.player.minimized .controls {
+ display: none;
+}
+.player .player-restore {
+ display: none;
+}
+.player.minimized .player-restore {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ min-height: 2.25rem;
+ padding: 0.45rem 0.65rem;
+ border: 0;
+ background: var(--player-bg);
+ color: var(--text-secondary);
+ cursor: pointer;
+ font: inherit;
+ font-size: 0.8rem;
+ text-align: left;
+}
+.player.minimized .player-restore:hover {
+ color: var(--text-primary);
+ background: var(--bg-surface-hover);
+}
+.player.minimized .player-restore span {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.player.is-fullscreen {
+ inset: 0;
+ width: auto;
+ height: auto;
+ border: 0;
+ border-radius: 0;
+ box-shadow: none;
+ background: var(--player-stage-bg);
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+}
+
+.detach-page {
+ margin: 0;
+ width: 100vw;
+ height: 100vh;
+ overflow: hidden;
+ background: var(--bg-body);
+}
+
+/* Detached popup: fill the whole popup window */
+.player.detached {
+ position: relative;
+ inset: 0;
+ width: 100%;
+ height: 100%;
+ border-radius: 0;
+ border: none;
+ box-shadow: none;
+ display: flex;
+ flex-direction: column;
+}
+.player.detached .stage {
+ flex: 1 1 auto;
+ height: auto !important;
+ overflow: hidden;
+}
+.player.detached .controls {
+ flex: 0 0 auto;
+}
+
+.player.is-fullscreen .stage {
+ flex: 1 1 auto;
+ height: auto;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.player video, .player audio {
+ width: 100%;
+ height: 100%;
+ display: block;
+ object-fit: contain;
+}
+.player.is-fullscreen video, .player.is-fullscreen audio {
+ max-height: 100%;
+}
+
+.player.crop-mode video {
+ object-fit: cover;
+ object-position: var(--crop-x, 50%) var(--crop-y, 50%);
+}
+
+.crop-indicator {
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ padding: 0 0.25rem;
+ user-select: none;
+}
+
+/* Cover art for audio playback */
+.player .cover-art {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ display: block;
+ background: var(--player-stage-bg);
+}
+
+/* Image viewer inside player */
+.player .media-image {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ display: block;
+ transition: transform 0.15s ease;
+ user-select: none;
+}
+.player .media-image.hidden {
+ display: none;
+}
+
+/* Show/hide controls per media type */
+.player.has-image .video-only {
+ display: none !important;
+}
+.player:not(.has-image) .image-only {
+ display: none !important;
+}
+
+/* Overlay controls */
+.player .controls {
+ flex: 0 0 auto;
+ display: flex;
+ align-items: center;
+ gap: 0.35rem;
+ padding: 0.35rem 0.5rem;
+ border-top: 1px solid var(--border);
+}
+.player .controls .spacer { flex: 1 1 auto; }
+
+.player .time {
+ font-family: var(--font-mono);
+ font-size: 0.78rem;
+ color: var(--text-secondary);
+ white-space: nowrap;
+}
+
+/* Progress bar */
+.progress-track {
+ position: relative;
+ flex: 1 1 auto;
+ height: 0.35rem;
+ background: var(--player-progress-bg);
+ border-radius: 999px;
+ cursor: pointer;
+ overflow: hidden;
+}
+.progress-track:hover { height: 0.5rem; }
+.progress-buffered {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ border-radius: 999px;
+ background: transparent;
+ pointer-events: none;
+ z-index: 1;
+}
+.progress-fill {
+ position: absolute;
+ inset: 0 auto 0 0;
+ width: 0%;
+ background: var(--player-progress-fill);
+ border-radius: 999px;
+ transition: width 120ms linear;
+ z-index: 2;
+}
+.progress-thumb {
+ position: absolute;
+ top: 50%;
+ width: 0.9rem;
+ height: 0.9rem;
+ background: var(--player-thumb);
+ border-radius: 50%;
+ transform: translate(-50%, -50%) scale(0);
+ transition: transform var(--transition-fast);
+ pointer-events: none;
+ z-index: 3;
+}
+.progress-track:hover .progress-thumb,
+.progress-track:focus-within .progress-thumb {
+ transform: translate(-50%, -50%) scale(1);
+}
+
+/* Touch-friendly progress bar */
+.progress-track {
+ touch-action: none;
+}
+
+@media (max-width: 520px) {
+ .player .controls {
+ gap: 0.35rem;
+ padding: 0.4rem 0.5rem;
+ }
+ .volume-slider {
+ width: 3.5rem;
+ }
+ .big-play .play-icon {
+ width: 2.8rem;
+ height: 2.8rem;
+ font-size: 1rem;
+ }
+}
+.volume-control {
+ display: flex;
+ align-items: center;
+ gap: 0.25rem;
+}
+.volume-slider {
+ width: 5rem;
+ height: 0.25rem;
+ cursor: pointer;
+ accent-color: var(--accent);
+}
+
+.detached-bar {
+ position: fixed;
+ inset: auto 0 0 0;
+ background: var(--player-bg);
+ color: var(--text-primary);
+ border-top: 1px solid var(--border);
+ z-index: 59;
+ padding: 0.5rem 0.75rem;
+ text-align: center;
+ font-size: 0.85rem;
+}
+.detached-bar.hidden {
+ display: none;
+}
+
+/* Big play button */
+.big-play {
+ position: absolute;
+ inset: 0;
+ display: grid;
+ place-items: center;
+ background: var(--overlay-dim);
+ cursor: pointer;
+ z-index: 5;
+}
+.big-play .play-icon {
+ width: 3.5rem;
+ height: 3.5rem;
+ border-radius: 50%;
+ background: var(--overlay-button-bg);
+ color: var(--overlay-button-color);
+ display: grid;
+ place-items: center;
+ font-size: 1.25rem;
+}