diff --git a/.env.local b/.env.local new file mode 100644 index 0000000..d0e2f0f --- /dev/null +++ b/.env.local @@ -0,0 +1,71 @@ +# Django настройки для локальной разработки +DJANGO_SECRET_KEY=lskjflSDJHFdSFYU7TYOREIFLUDJKFBNKLJSDHFP9Q234856QT80OUAEIYDWSF9PQ28345701784QRTEOYAGWDFLSBAPWO9I485Y +DJANGO_DEBUG=True +DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1,web +DJANGO_CSRF_TRUSTED_ORIGINS=http://localhost:3000,http://127.0.0.1:3000,http://localhost:8000,http://127.0.0.1:8000 + +# CORS настройки для локальной разработки +CORS_ALLOWED_ORIGINS=http://127.0.0.1:3000,http://localhost:3000 +CORS_ALLOW_ALL_ORIGINS=True +CORS_ALLOW_CREDENTIALS=True +CORS_ALLOW_HEADERS=accept,accept-encoding,authorization,content-type,dnt,origin,user-agent,x-csrftoken,x-requested-with + +# Локализация +DJANGO_LANGUAGE_CODE=ru-ru +DJANGO_TIME_ZONE=UTC +DJANGO_USE_I18N=True +DJANGO_USE_TZ=True + +# Статические файлы +DJANGO_STATIC_URL=/static/ +DJANGO_MEDIA_URL=/storage/ + +# API настройки +DJANGO_APPEND_SLASH=False + +# JWT настройки +JWT_ACCESS_TOKEN_LIFETIME_MINUTES=60 +JWT_REFRESH_TOKEN_LIFETIME_DAYS=1 + +# База данных PostgreSQL +DATABASE_ENGINE=django.db.backends.postgresql +DATABASE_NAME=links_db +DATABASE_USER=links_user +DATABASE_PASSWORD=links_OASDUIFH90324*ftye(guBJ;O234789SDgfu{ +DATABASE_HOST=db +DATABASE_PORT=5432 + +# PostgreSQL настройки для контейнера +POSTGRES_DB=links_db +POSTGRES_USER=links_user +POSTGRES_PASSWORD=links_OASDUIFH90324*ftye(guBJ;O234789SDgfu{ + +# Frontend настройки (для локальной разработки) +NEXT_PUBLIC_API_URL=http://localhost:8000 + +# URL настройки для Django backend (локальные) +DJANGO_BACKEND_URL=http://localhost:8000 +DJANGO_BACKEND_PROTOCOL=http +DJANGO_BACKEND_DOMAIN=localhost:8000 +DJANGO_MEDIA_BASE_URL=http://localhost:8000 + +# Безопасность (отключено для локальной разработки) +DJANGO_SECURE_SSL_REDIRECT=False +DJANGO_SECURE_HSTS_SECONDS=0 +DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS=False +DJANGO_SECURE_HSTS_PRELOAD=False +DJANGO_SECURE_CONTENT_TYPE_NOSNIFF=True +DJANGO_SECURE_BROWSER_XSS_FILTER=True +DJANGO_X_FRAME_OPTIONS=SAMEORIGIN + +# Email настройки (консоль для локальной разработки) +DJANGO_EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend +DJANGO_EMAIL_HOST= +DJANGO_EMAIL_PORT=587 +DJANGO_EMAIL_HOST_USER= +DJANGO_EMAIL_HOST_PASSWORD= +DJANGO_EMAIL_USE_TLS=False +DJANGO_EMAIL_USE_SSL=False +DJANGO_EMAIL_TIMEOUT=30 +DJANGO_DEFAULT_FROM_EMAIL= +DJANGO_SERVER_EMAIL= \ No newline at end of file diff --git a/frontend/linktree-frontend/src/app/components/CustomizationPanel.tsx b/frontend/linktree-frontend/src/app/components/CustomizationPanel.tsx index 7a03003..4042034 100644 --- a/frontend/linktree-frontend/src/app/components/CustomizationPanel.tsx +++ b/frontend/linktree-frontend/src/app/components/CustomizationPanel.tsx @@ -445,7 +445,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
- Совет: Попробуйте разные макеты, чтобы найти наиболее подходящий для вашего контента. + {t('customization.layout.tip')} {t('customization.layout.tipText')} Каждый стиль имеет свои преимущества в зависимости от количества ссылок и их типа.
@@ -515,7 +515,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
Текущий фон @@ -654,13 +654,13 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr onChange={(e) => handleChange('show_groups_title', e.target.checked)} />
- +
-
Цветовое перекрытие групп
+
{t('customization.colors.groupOverlay')}
@@ -708,7 +708,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr className="form-control form-control-color" value={settings.group_overlay_color || '#000000'} onChange={(e) => handleChange('group_overlay_color', e.target.value)} - title="Выберите цвет перекрытия" + title={t('customization.colors.chooseOverlayColor')} /> handleChange('group_overlay_color', e.target.value)} placeholder="#000000" - title="Hex код цвета" + title={t('customization.colors.hexColorCode')} />
@@ -767,7 +767,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
- Настройки отдельных групп
+ {t('customization.advanced.individualGroupSettings')}
Чтобы настроить конкретную группу (публичность, избранное, разворачивание), используйте кнопку редактирования рядом с названием группы в основном списке.
@@ -776,7 +776,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr
-
Цветовое перекрытие кнопок ссылок
+
{t('customization.colors.linkOverlay')}
handleChange('font_family', e.target.value)} > - - + + @@ -906,7 +906,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr value={settings.heading_font_family || settings.font_family} onChange={(e) => handleChange('heading_font_family', e.target.value)} > - + @@ -935,7 +935,7 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate, user, gr value={settings.body_font_family || settings.font_family} onChange={(e) => handleChange('body_font_family', e.target.value)} > - + diff --git a/frontend/linktree-frontend/src/app/components/ThemeToggle.css b/frontend/linktree-frontend/src/app/components/ThemeToggle.css index 2440099..909e700 100644 --- a/frontend/linktree-frontend/src/app/components/ThemeToggle.css +++ b/frontend/linktree-frontend/src/app/components/ThemeToggle.css @@ -6,13 +6,14 @@ border: 2px solid var(--bs-border-color); border-radius: 20px; cursor: pointer; - transition: all 0.3s ease; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); overflow: hidden; } .theme-toggle.dark { - background-color: var(--bs-dark); - border-color: var(--bs-secondary); + background: linear-gradient(135deg, #7c3aed, #9333ea); + border: 2px solid #8b5cf6; + box-shadow: 0 4px 15px rgba(124, 58, 237, 0.25); } .theme-toggle-slider { @@ -27,12 +28,13 @@ display: flex; align-items: center; justify-content: center; - box-shadow: 0 2px 4px rgba(0,0,0,0.2); + box-shadow: 0 2px 8px rgba(0,0,0,0.2); } .theme-toggle.dark .theme-toggle-slider { transform: translateX(30px); - background: linear-gradient(45deg, #4a5568, #718096); + background: linear-gradient(45deg, #f8fafc, #e2e8f0); + box-shadow: 0 3px 12px rgba(124, 58, 237, 0.3); } .theme-toggle-icon { @@ -66,6 +68,11 @@ transform: scale(1.05); } +.theme-toggle.dark:hover { + box-shadow: 0 6px 25px rgba(124, 58, 237, 0.35); + transform: scale(1.05); +} + .theme-toggle:active { transform: scale(0.95); } @@ -104,20 +111,23 @@ /* Темная тема - звездочки */ .theme-toggle.dark::after { - content: '✨'; + content: '🌙'; position: absolute; top: 50%; right: 8px; transform: translateY(-50%); - font-size: 8px; - animation: twinkle 1.5s ease-in-out infinite alternate; + font-size: 10px; + animation: moonGlow 2s ease-in-out infinite alternate; + filter: drop-shadow(0 0 4px rgba(139, 92, 246, 0.6)); } -@keyframes twinkle { +@keyframes moonGlow { 0% { - opacity: 0.3; + opacity: 0.6; + filter: drop-shadow(0 0 4px rgba(139, 92, 246, 0.6)); } 100% { opacity: 1; + filter: drop-shadow(0 0 8px rgba(139, 92, 246, 0.9)); } } \ No newline at end of file diff --git a/frontend/linktree-frontend/src/app/layout.tsx b/frontend/linktree-frontend/src/app/layout.tsx index f84ecac..c6a3473 100644 --- a/frontend/linktree-frontend/src/app/layout.tsx +++ b/frontend/linktree-frontend/src/app/layout.tsx @@ -3,6 +3,7 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; import "./styles/themes.css"; +import "./styles/comfort.css"; import { ReactNode } from "react"; import { LayoutWrapper } from "./components/LayoutWrapper"; import Providers from "./components/Providers"; @@ -70,7 +71,7 @@ export default function RootLayout({ /> - +