Merge privacy-footer-overlay into dev (PRIVACY footer button + centered overlay note)
Deploy DeepDrftAPI / Build, Publish & Bundle (push) Successful in 2m11s
Deploy DeepDrftManager / Build & Publish (push) Successful in 1m29s
Deploy DeepDrftPublic / Build & Publish (push) Successful in 3m56s
Deploy DeepDrftAPI / Deploy (push) Successful in 1m33s
Deploy DeepDrftManager / Deploy (push) Successful in 1m29s
Deploy DeepDrftPublic / Deploy (push) Successful in 1m29s

This commit is contained in:
daniel-c-harvey
2026-06-19 17:02:17 -04:00
3 changed files with 120 additions and 11 deletions
@@ -4,8 +4,34 @@
<ul class="deepdrft-footer-links"> <ul class="deepdrft-footer-links">
<li><a href="/about">About</a></li> <li><a href="/about">About</a></li>
<li><a href="#">Contact</a></li> <li><a href="#">Contact</a></li>
<li><button class="deepdrft-footer-privacy-btn" @onclick="@OpenPrivacy" type="button" aria-haspopup="dialog">Privacy</button></li>
</ul> </ul>
<div class="deepdrft-footer-copy">© 2026 Deep DRFT</div> <div class="deepdrft-footer-copy">© 2026 Deep DRFT</div>
</div> </div>
<p class="deepdrft-footer-privacy">We keep a random tag in your browser so we can count how many people a track reaches — not who they are. No account, no name, nothing personal, nothing shared with anyone else. Clear your browser data and the tag&#8217;s gone.</p>
</footer> </footer>
<MudOverlay Visible="@_privacyOpen"
DarkBackground="true"
Modal="true"
OnClick="@ClosePrivacy"
Class="deepdrft-privacy-overlay">
<div class="deepdrft-privacy-modal" @onclick:stopPropagation="true">
<div class="deepdrft-privacy-modal-header">
<span class="deepdrft-privacy-modal-title">Privacy</span>
<MudIconButton Icon="@Icons.Material.Filled.Close"
Size="Size.Small"
Color="Color.Default"
OnClick="@ClosePrivacy"
aria-label="Close privacy note"
Class="deepdrft-privacy-modal-close" />
</div>
<p class="deepdrft-privacy-modal-body">We keep a random tag in your browser so we can count how many people a track reaches — not who they are. No account, no name, nothing personal, nothing shared with anyone else. Clear your browser data and the tag&#8217;s gone.</p>
</div>
</MudOverlay>
@code {
private bool _privacyOpen;
private void OpenPrivacy() => _privacyOpen = true;
private void ClosePrivacy() => _privacyOpen = false;
}
@@ -38,7 +38,8 @@
padding: 0; padding: 0;
} }
.deepdrft-footer-links a { .deepdrft-footer-links a,
.deepdrft-footer-links button {
font-family: var(--deepdrft-font-mono); font-family: var(--deepdrft-font-mono);
font-size: 0.62rem; font-size: 0.62rem;
letter-spacing: 0.18em; letter-spacing: 0.18em;
@@ -48,7 +49,8 @@
transition: color 0.2s; transition: color 0.2s;
} }
.deepdrft-footer-links a:hover { color: var(--deepdrft-navy); } .deepdrft-footer-links a:hover,
.deepdrft-footer-links button:hover { color: var(--deepdrft-navy); }
.deepdrft-footer-copy { .deepdrft-footer-copy {
font-family: var(--deepdrft-font-mono); font-family: var(--deepdrft-font-mono);
@@ -57,14 +59,16 @@
color: var(--deepdrft-muted); color: var(--deepdrft-muted);
} }
.deepdrft-footer-privacy { /* PRIVACY trigger — reset button chrome so it reads as a link, not a button element.
font-family: var(--deepdrft-font-mono); Typography/colour shared with footer <a> links via the grouped selector above. */
font-size: 0.55rem; .deepdrft-footer-privacy-btn {
letter-spacing: 0.08em; background: none;
color: var(--deepdrft-muted); border: none;
opacity: 0.7; padding: 0;
margin: 0; margin: 0;
line-height: 1.6; cursor: pointer;
line-height: inherit;
font-family: inherit;
} }
@media (max-width: 440px) { @media (max-width: 440px) {
@@ -917,3 +917,82 @@ body:has(.deepdrft-queue-overlay) {
max-height: 184px; max-height: 184px;
overflow-y: auto; overflow-y: auto;
} }
/* =============================================================================
PRIVACY OVERLAY
Screen-centered modal following the same MudOverlay idiom as the visualizer
controls and queue overlays. MudOverlay portals to body — CSS isolation cannot
reach portaled content, so chrome lives here in the global sheet.
============================================================================= */
/* Raise above the sticky header (100), player dock (1200), and minimized FAB (1300). */
.deepdrft-privacy-overlay {
z-index: 1400 !important;
}
/* Mild tint: doubled selector (0,2,0) outranks MudBlazor's .mud-overlay-dark (0,1,0). */
.deepdrft-privacy-overlay .mud-overlay-scrim.mud-overlay-dark {
background-color: rgba(var(--deepdrft-scrim-rgb), var(--deepdrft-modal-scrim-alpha));
}
.deepdrft-privacy-overlay .mud-overlay-content {
max-height: 90vh;
overflow: visible;
}
/* Lock body scroll while the overlay is open. */
body:has(.deepdrft-privacy-overlay) {
overflow: hidden;
}
/* Panel: compact width, navy-panel ground, thin light border — matches queue/visualizer chrome. */
.deepdrft-privacy-modal {
display: flex;
flex-direction: column;
width: min(90vw, 480px);
background: var(--deepdrft-panel-ground);
border: 1px solid var(--deepdrft-border-light);
border-radius: 0;
backdrop-filter: blur(8px);
overflow: hidden;
}
.deepdrft-privacy-modal-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.85rem 0.85rem 0.85rem 1rem;
border-bottom: 1px solid var(--deepdrft-border-light);
}
/* Mono uppercase eyebrow — matches queue modal title. */
.deepdrft-privacy-modal-title {
font-family: var(--deepdrft-font-mono);
font-size: 0.72rem;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--deepdrft-white);
opacity: 0.85;
}
/* Tuck the close icon flush with the panel edge; keep it subtle. */
.deepdrft-privacy-modal-close {
opacity: 0.6;
color: var(--deepdrft-white) !important;
}
.deepdrft-privacy-modal-close:hover {
opacity: 1;
}
/* Privacy copy: same mono treatment as the former inline paragraph, but readable on dark ground. */
.deepdrft-privacy-modal-body {
font-family: var(--deepdrft-font-mono);
font-size: 0.72rem;
letter-spacing: 0.06em;
line-height: 1.7;
color: var(--deepdrft-white);
opacity: 0.8;
margin: 0;
padding: 1rem 1rem 1.25rem;
}