CopyToClipboard(string text)
+ {
+ try
+ {
+ await JS.InvokeVoidAsync("navigator.clipboard.writeText", text);
+ return true;
+ }
+ catch (Exception)
+ {
+ return false;
+ }
+ }
+
+ private async Task ResetAfterDelay(Action reset)
+ {
+ try
+ {
+ await Task.Delay(1500, _cts.Token);
+ }
+ catch (TaskCanceledException)
+ {
+ return;
+ }
+
+ reset();
+ StateHasChanged();
+ }
+
+ public void Dispose() => _cts.Cancel();
+}
diff --git a/DeepDrftPublic.Client/Pages/TrackDetail.razor b/DeepDrftPublic.Client/Pages/TrackDetail.razor
index c997b6f..73884e8 100644
--- a/DeepDrftPublic.Client/Pages/TrackDetail.razor
+++ b/DeepDrftPublic.Client/Pages/TrackDetail.razor
@@ -57,9 +57,10 @@ else if (ViewModel.Track is not null)
@track.Artist
-
+
@@ -67,8 +68,6 @@ else if (ViewModel.Track is not null)
-
-
@if (hasMeta)
{
diff --git a/DeepDrftPublic/wwwroot/styles/deepdrft-styles.css b/DeepDrftPublic/wwwroot/styles/deepdrft-styles.css
index aeb5efe..ce30251 100644
--- a/DeepDrftPublic/wwwroot/styles/deepdrft-styles.css
+++ b/DeepDrftPublic/wwwroot/styles/deepdrft-styles.css
@@ -339,6 +339,23 @@ h2, h3, h4, h5, h6,
font-family: var(--deepdrft-font-mono) !important;
}
+.deepdrft-share-popover-body {
+ padding: 0.75rem 1rem;
+ min-width: 280px;
+ max-width: 360px;
+}
+
+/* Monospace snippet so the iframe markup stays legible inside the readonly field. */
+.deepdrft-share-embed-field {
+ flex: 1 1 auto;
+}
+
+.deepdrft-share-embed-field .mud-input-slot {
+ font-family: var(--deepdrft-font-mono) !important;
+ font-size: 0.75rem;
+ word-break: break-all;
+}
+
/* display:contents so the anchor wraps the card's cover and title without
introducing its own box — the container's positioning context and the
content column's flex layout are both preserved. */