Files
daniel-c-harvey fa01b9c8e0 feat(public): add Theater Mode to release detail pages
Toggle left of the lava popover hides release content so the visualizer fills
the surface; player bar grows to carry the playing release's cover, title, and
share. State on WaveformVisualizerControlState; pages and bar observe it.
2026-06-20 21:51:30 -04:00

192 lines
5.8 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Geometry, positioning, and animation only.
Colour, surface, and elevation come from MudBlazor theme props. */
/* Fixed dock to the viewport bottom */
.player-dock {
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 1200;
padding: 0;
margin: 0;
}
.player-fixed {
position: relative;
top: 0;
left: 0;
right: 0;
z-index: 1200;
padding: 0;
margin: 0;
}
::deep .player-inner-container {
padding: 0 0.75rem 0.75rem 0.75rem;
}
/* The visible surface is a MudPaper; scoped CSS only sets geometry + a hairline accent */
::deep .player-surface {
position: relative;
border-radius: 16px;
border: 1px solid var(--mud-palette-primary);
overflow: hidden;
margin-bottom: 1rem;
}
/* Minimize / close cluster, pinned top-right of the surface */
::deep .player-surface .player-window-controls {
position: absolute;
top: 0.5rem;
right: 0.5rem;
}
/* PLAYER-BAR play-chip override (Phase 18, T3). PlayStateIcon's chip defaults to the solid
--deepdrft-play-chip (moss-green in dark) used on release heroes and Cut track rows. On the
player dock that solid green reads too hot, so here — and only here — swap to the
translucent --deepdrft-play-chip-soft (same green, much less opaque).
The glyph stays --mud-palette-primary (green on the soft translucent wash), giving the
preferred green-on-green look on the player bar in dark mode. */
::deep .player-surface .icon-container {
background-color: var(--deepdrft-play-chip-soft);
}
::deep .player-surface .icon-container .mud-icon-button {
color: var(--mud-palette-primary);
}
/* Theater Mode "now showing" band (Phase 20 §5/§7). Sits above the transport layout inside the
player surface and lets the bar grow taller to carry the hidden release's identity. The band only
renders when Theater is ON, so this geometry is gated by render-inclusion, not a CSS flag — when
Theater is OFF the player bar is byte-for-byte its non-Theater self.
Colour/surface come from the bar's themed --deepdrft-page-* aliases; no new token, no dark override. */
::deep .now-showing {
display: flex;
align-items: center;
gap: 0.75rem;
padding-bottom: 0.5rem;
margin-bottom: 0.5rem;
border-bottom: 1px solid var(--deepdrft-page-text-muted);
min-width: 0;
}
/* Fixed cover box — the reused .deepdrft-track-detail-cover-art / -placeholder idioms are height:100%,
so the band supplies the square frame they fill. */
::deep .now-showing-cover {
flex: 0 0 auto;
width: 44px;
height: 44px;
border-radius: 6px;
overflow: hidden;
}
::deep .now-showing-cover-art,
::deep .now-showing-cover-placeholder {
width: 100%;
}
::deep .now-showing-cover-placeholder .mud-icon-root {
font-size: 24px;
}
::deep .now-showing-title-link {
flex: 1 1 auto;
min-width: 0;
text-decoration: none;
}
::deep .now-showing-title {
color: var(--deepdrft-page-text);
}
::deep .now-showing-share {
flex: 0 0 auto;
}
/* Minimized floating dock — positioning + hover only; colour from MudFab */
.minimized-dock {
position: fixed;
bottom: 30px;
right: 30px;
z-index: 1300;
}
.minimized-dock:hover {
transform: scale(1.1);
}
@media (max-width: 768px) {
.minimized-dock {
bottom: 15px;
right: 15px;
}
::deep .player-surface {
margin-bottom: 0.5rem;
}
}
/* Unified responsive player layout — CSS Grid with named areas redefined per breakpoint.
The metadata (meta-zone) detaches from the waveform (seek-zone) in the mid band, which a
flex order-swap can't express, so each of the four zones is placed by grid-area and the three
shapes are pure template-area swaps — no runtime breakpoint subscription. min-width:0 on the
shrinkable centre zones lets the title truncate and the waveform shrink instead of overflowing. */
.player-layout {
display: grid;
align-items: center;
gap: 8px;
/*padding-right: 2.5rem; !* clear the abs-positioned PlayerWindowControls *!*/
}
::deep .transport-zone { grid-area: transport; }
::deep .meta-zone { grid-area: meta; min-width: 0; }
::deep .seek-zone { grid-area: waveform; min-width: 0; }
::deep .volume-zone { grid-area: volume; }
/* Wide (>= 900px): single row — transport and volume flank the centre column; the metadata
sits directly under the waveform (transport/volume span both rows, centred). */
@media (min-width: 900px) {
.player-layout {
grid-template-columns: auto minmax(360px, 1fr) auto;
grid-template-areas:
"transport waveform volume"
"transport meta .";
}
}
/* Mid (600900px): metadata rides the top row between transport and volume; the waveform gets
the whole bottom row to itself rather than being squeezed beside the metadata. */
@media (min-width: 600px) and (max-width: 899.98px) {
.player-layout {
grid-template-columns: auto minmax(0, 1fr) auto;
grid-template-areas:
"transport meta volume"
"waveform waveform waveform";
}
}
/* Narrow (< 600px): transport + volume share the top row; waveform then metadata stack full-width
below — the most compressed shape. */
@media (min-width: 420px) and (max-width: 599.98px) {
.player-layout {
grid-template-columns: auto 1fr auto;
grid-template-areas:
"transport . volume"
"waveform waveform waveform"
"meta meta meta";
}
}
/* Very Narrow (< 400px): transport + volume share the top row; waveform then metadata stack full-width
below — the most compressed shape. */
@media (max-width: 419.98px) {
.player-layout {
grid-template-columns: auto 1fr auto;
grid-template-areas:
"transport . volume"
"waveform waveform waveform"
"meta meta meta";
}
}