mirror of
https://github.com/forkless/Piperless.git
synced 2026-08-16 16:57:25 +02:00
236 lines
4.5 KiB
CSS
236 lines
4.5 KiB
CSS
/**
|
|
* Piperless Player — Base Styles
|
|
*
|
|
* Structural layout shared by all themes.
|
|
* Theme-specific colors and decorations live in player-{theme}.css.
|
|
*/
|
|
|
|
.piperless-player {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
gap: 12px;
|
|
width: 100%;
|
|
margin: 0.5em 0;
|
|
box-sizing: border-box;
|
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
|
Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
|
|
}
|
|
|
|
/* Hidden native audio element */
|
|
.piperless-player__audio {
|
|
display: none;
|
|
}
|
|
|
|
/* Player title — inside the flex container, spans full width. */
|
|
.piperless-player__title {
|
|
flex: 0 0 100%;
|
|
font-size: 15px;
|
|
font-weight: 600;
|
|
margin: 0;
|
|
color: inherit;
|
|
}
|
|
|
|
/* Play / Pause button */
|
|
.piperless-player__play {
|
|
flex-shrink: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 42px;
|
|
height: 42px;
|
|
border: none;
|
|
cursor: pointer;
|
|
background: transparent;
|
|
padding: 0;
|
|
transition: transform 0.15s ease, opacity 0.15s ease;
|
|
}
|
|
|
|
.piperless-player__play:hover {
|
|
transform: scale(1.08);
|
|
}
|
|
|
|
.piperless-player__play:active {
|
|
transform: scale(0.96);
|
|
}
|
|
|
|
.piperless-player__play:focus-visible {
|
|
outline: 2px solid currentColor;
|
|
outline-offset: 2px;
|
|
}
|
|
|
|
/* Icons — show/hide based on state */
|
|
.piperless-player__play-icon,
|
|
.piperless-player__pause-icon {
|
|
width: 24px;
|
|
height: 24px;
|
|
fill: currentColor;
|
|
}
|
|
|
|
.piperless-player__pause-icon {
|
|
display: none;
|
|
}
|
|
|
|
.piperless-player--playing .piperless-player__play-icon {
|
|
display: none;
|
|
}
|
|
|
|
.piperless-player--playing .piperless-player__pause-icon {
|
|
display: block;
|
|
}
|
|
|
|
/* Progress bar wrapper */
|
|
.piperless-player__progress-wrapper {
|
|
flex: 1;
|
|
min-width: 0;
|
|
}
|
|
|
|
.piperless-player__progress {
|
|
position: relative;
|
|
width: 100%;
|
|
height: 6px;
|
|
border-radius: 3px;
|
|
cursor: pointer;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.piperless-player__progress-bar,
|
|
.piperless-player__progress-buffered {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
height: 100%;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.piperless-player__progress-buffered {
|
|
z-index: 1;
|
|
}
|
|
|
|
.piperless-player__progress-bar {
|
|
z-index: 2;
|
|
width: 0%;
|
|
will-change: width;
|
|
}
|
|
|
|
/* Time display */
|
|
.piperless-player__time {
|
|
flex-shrink: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 4px;
|
|
font-size: 13px;
|
|
font-variant-numeric: tabular-nums;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
/* Volume control */
|
|
.piperless-player__volume {
|
|
position: relative;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.piperless-player__volume-btn {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 30px;
|
|
height: 30px;
|
|
border: none;
|
|
background: transparent !important;
|
|
cursor: pointer;
|
|
color: inherit;
|
|
opacity: 0.6;
|
|
padding: 0;
|
|
transition: opacity 0.15s ease;
|
|
}
|
|
|
|
.piperless-player__volume-btn:hover,
|
|
.piperless-player__volume-btn:active,
|
|
.piperless-player__volume-btn:focus {
|
|
opacity: 1;
|
|
background: transparent !important;
|
|
outline: none;
|
|
}
|
|
|
|
.piperless-player__volume-slider {
|
|
display: none;
|
|
position: absolute;
|
|
left: 50%;
|
|
transform: translateX(-50%);
|
|
bottom: 100%;
|
|
margin-bottom: 8px;
|
|
background: #ffffff;
|
|
border: 1px solid #dee2e6;
|
|
border-radius: 6px;
|
|
padding: 10px 0;
|
|
box-shadow: 0 2px 12px rgba(0,0,0,0.1);
|
|
z-index: 10;
|
|
width: 30px;
|
|
text-align: center;
|
|
}
|
|
|
|
.piperless-player__volume-slider input[type="range"] {
|
|
-webkit-appearance: none;
|
|
appearance: none;
|
|
writing-mode: vertical-lr;
|
|
direction: rtl;
|
|
width: 6px;
|
|
height: 80px;
|
|
cursor: pointer;
|
|
margin: 0 auto;
|
|
display: block;
|
|
background: linear-gradient(to top, #2271b1 var(--vol-pct), #dee2e6 var(--vol-pct));
|
|
border-radius: 2px;
|
|
outline: none;
|
|
}
|
|
|
|
.piperless-player__volume-slider input[type="range"]::-webkit-slider-runnable-track {
|
|
background: transparent;
|
|
border-radius: 2px;
|
|
height: 100%;
|
|
}
|
|
|
|
.piperless-player__volume-slider input[type="range"]::-webkit-slider-thumb {
|
|
-webkit-appearance: none;
|
|
width: 12px;
|
|
height: 12px;
|
|
opacity: 0;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.piperless-player__volume-slider input[type="range"]::-moz-range-thumb {
|
|
width: 12px;
|
|
height: 12px;
|
|
opacity: 0;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.piperless-player__volume-slider input[type="range"]::-moz-range-track {
|
|
background: linear-gradient(to top, #2271b1 var(--vol-pct), #dee2e6 var(--vol-pct));
|
|
border-radius: 2px;
|
|
height: 6px;
|
|
}
|
|
|
|
.piperless-player--volume-open .piperless-player__volume-slider {
|
|
display: block;
|
|
}
|
|
|
|
/* Keep volume button bright when slider is open. */
|
|
.piperless-player--volume-open .piperless-player__volume-btn {
|
|
opacity: 1;
|
|
}
|
|
|
|
.piperless-player__separator {
|
|
opacity: 0.5;
|
|
}
|
|
|
|
/* Error state */
|
|
.piperless-player--error {
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.piperless-player--error .piperless-player__play {
|
|
pointer-events: none;
|
|
}
|