);
diff --git a/src/components/broadcasts/BroadcastPreview.tsx b/src/components/broadcasts/BroadcastPreview.tsx
index 91e3fbe..8cd0d55 100644
--- a/src/components/broadcasts/BroadcastPreview.tsx
+++ b/src/components/broadcasts/BroadcastPreview.tsx
@@ -1,6 +1,7 @@
import { useMemo, type ReactNode } from 'react';
import { createPortal } from 'react-dom';
import { useTranslation } from 'react-i18next';
+import { useFocusTrap } from '../../hooks/useFocusTrap';
interface PreviewButton {
text: string;
@@ -105,13 +106,13 @@ function wrap(frame: Frame, key: number): ReactNode {
return
+
{frame.children}
);
case 'pre':
return (
-
+
{frame.children}
);
@@ -185,13 +186,19 @@ export function TelegramPreview({
}: TelegramPreviewProps) {
const { t } = useTranslation();
const rendered = useMemo(() => tokensToReact(tokenize(text)), [text]);
+ const dialogRef = useFocusTrap(open, { onEscape: onClose });
if (!open) return null;
return createPortal(
e.stopPropagation()}
>
@@ -199,14 +206,23 @@ export function TelegramPreview({
{t('admin.broadcasts.preview', 'Предпросмотр Telegram')}
-
{mediaUrl && mediaType === 'photo' && (
-

+

)}
{mediaUrl && mediaType === 'video' && (
@@ -247,14 +263,20 @@ export function TelegramPreview({
export function EmailPreview({ open, onClose, subject, htmlContent }: EmailPreviewProps) {
const { t } = useTranslation();
+ const dialogRef = useFocusTrap
(open, { onEscape: onClose });
if (!open) return null;
const emptyHtml = `${t('admin.broadcasts.previewEmpty', '— пусто —')}
`;
return createPortal(
e.stopPropagation()}
>
@@ -269,7 +291,8 @@ export function EmailPreview({ open, onClose, subject, htmlContent }: EmailPrevi
✕
diff --git a/src/components/common/PageLoader.tsx b/src/components/common/PageLoader.tsx
index 125f3a9..6ce3394 100644
--- a/src/components/common/PageLoader.tsx
+++ b/src/components/common/PageLoader.tsx
@@ -3,10 +3,10 @@ interface PageLoaderProps {
}
export default function PageLoader({ variant = 'dark' }: PageLoaderProps) {
- const spinnerColor = variant === 'dark' ? 'border-accent-500' : 'border-blue-500';
+ const spinnerColor = variant === 'dark' ? 'border-accent-500' : 'border-accent-500';
return (
-
+
diff --git a/src/components/connection/InstallationGuide.tsx b/src/components/connection/InstallationGuide.tsx
index 0b6b7cc..055b761 100644
--- a/src/components/connection/InstallationGuide.tsx
+++ b/src/components/connection/InstallationGuide.tsx
@@ -197,6 +197,7 @@ export default function InstallationGuide({
{!isTelegramWebApp && (
@@ -208,6 +209,7 @@ export default function InstallationGuide({
{appConfig.subscriptionUrl && onOpenQR && (
onOpenQR()}
+ aria-label={t('subscription.connection.openQr', 'Open QR code')}
className="flex h-10 w-10 items-center justify-center rounded-xl border border-dark-700 bg-dark-800 text-dark-200 transition-colors hover:border-dark-600"
>