/* 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 (600–900px): 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"; } }