diff --git a/PlaylistShared.Pwa/Components/ShareButton.razor b/PlaylistShared.Pwa/Components/ShareButton.razor
new file mode 100644
index 0000000..755b3c7
--- /dev/null
+++ b/PlaylistShared.Pwa/Components/ShareButton.razor
@@ -0,0 +1,84 @@
+@inject IJSRuntime JS
+@inject ISnackbar Snackbar
+
+
+
+
+
+ Ссылка для приглашения:
+
+
+
+ Копировать
+
+
+
+
+
+@code {
+ private MudIconButton? _buttonRef;
+ private bool _popoverOpen;
+ private string _shareUrl = "";
+
+ ///
+ /// Ссылка для копирования. Если не указана, используется текущий URL страницы.
+ ///
+ [Parameter] public string ShareUrl { get; set; } = string.Empty;
+
+ protected override void OnInitialized()
+ {
+ if (string.IsNullOrEmpty(ShareUrl))
+ ShareUrl = Navigation.Uri;
+ }
+
+ protected override void OnParametersSet()
+ {
+ if (!string.IsNullOrEmpty(ShareUrl))
+ _shareUrl = ShareUrl;
+ }
+
+ private async Task OpenPopover()
+ {
+ if (string.IsNullOrEmpty(ShareUrl))
+ {
+ Snackbar.Add("Ссылка недоступна", Severity.Warning);
+ return;
+ }
+ _shareUrl = ShareUrl;
+ _popoverOpen = true;
+ }
+
+ private async Task CopyLink()
+ {
+ try
+ {
+ await JS.InvokeVoidAsync("navigator.clipboard.writeText", _shareUrl);
+ Snackbar.Add("Ссылка скопирована в буфер обмена", Severity.Success);
+ _popoverOpen = false;
+ }
+ catch (Exception ex)
+ {
+ Snackbar.Add($"Не удалось скопировать ссылку: {ex.Message}", Severity.Error);
+ }
+ }
+}
\ No newline at end of file
diff --git a/PlaylistShared.Pwa/Pages/SharedPlaylistView.razor b/PlaylistShared.Pwa/Pages/SharedPlaylistView.razor
index 5e4d04a..a63abe8 100644
--- a/PlaylistShared.Pwa/Pages/SharedPlaylistView.razor
+++ b/PlaylistShared.Pwa/Pages/SharedPlaylistView.razor
@@ -36,6 +36,8 @@
+
+