From c3e4b99d4ba6047b88aaeab82497123f10351c09 Mon Sep 17 00:00:00 2001 From: Vasyka Date: Thu, 17 Sep 2026 20:39:13 +0000 Subject: [PATCH] feat: complete cookie consent with categories & technical processing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Full 4-category consent modal: Necesare (locked) / Funcționale / Analitice / Marketing with toggle switches per category - Banner shows simple view first; "Personalizează" opens detailed panel - Consent stored as JSON in localStorage (cookie_consent_v2) - window.cookieConsent object set on load; dispatches cookie-consent-updated / cookie-analytics-granted / cookie-marketing-granted CustomEvents for deferred script loading - Floating 🍪 FAB button lets users re-open settings at any time - Policy page: "Personalizează" button resets consent, reopens modal - Full RO/RU translation for all categories and UI strings Co-Authored-By: Claude Sonnet 4.6 --- lang/ro/portal.php | 34 ++- lang/ru/portal.php | 34 ++- .../views/partials/cookie-banner.blade.php | 278 +++++++++++++----- .../views/public/cookie-policy.blade.php | 37 ++- resources/views/tracking/show.blade.php | 1 - 5 files changed, 284 insertions(+), 100 deletions(-) diff --git a/lang/ro/portal.php b/lang/ro/portal.php index ae18cf5..40e39c5 100644 --- a/lang/ro/portal.php +++ b/lang/ro/portal.php @@ -155,12 +155,32 @@ return [ ], 'cookie' => [ - 'policy_title' => 'Politica de utilizare a fișierelor cookie', - 'back' => 'Înapoi', - 'banner_title' => 'Utilizăm fișiere cookie', - 'banner_body' => 'Folosim module cookie pentru funcționarea site-ului și îmbunătățirea experienței. Cookies strict necesare sunt utilizate fără consimțământ (Legea nr. 195/2024).', - 'read_policy' => 'Politica cookie', - 'accept' => 'Acceptă toate', - 'reject' => 'Doar esențiale', + 'policy_title' => 'Politica de utilizare a fișierelor cookie', + 'back' => 'Înapoi', + 'manage_title' => 'Gestionează setările cookie', + + // Banner (simple view) + 'banner_title' => 'Utilizăm fișiere cookie', + 'banner_body' => 'Utilizăm cookie-uri pentru funcționarea site-ului și îmbunătățirea experienței dvs. Cookie-urile strict necesare nu necesită consimțământ (Legea nr. 195/2024).', + 'read_policy' => 'Politica cookie', + 'accept' => 'Acceptă toate', + 'reject' => 'Respinge opționale', + 'customize' => 'Personalizează', + + // Settings modal + 'settings_title' => 'Setări cookie', + 'settings_body' => 'Alegeți ce categorii de cookie-uri acceptați. Puteți modifica preferințele oricând.', + 'save_settings' => 'Salvează preferințele', + 'always_on' => 'Întotdeauna activ', + + // Categories + 'cat_necessary' => 'Cookie-uri strict necesare', + 'cat_necessary_desc' => 'Indispensabile pentru funcționarea corectă a site-ului: autentificare, sesiune, securitate, preferințe limbă. Nu pot fi dezactivate.', + 'cat_functional' => 'Cookie-uri funcționale', + 'cat_functional_desc'=> 'Permit site-ului să rețină alegerile dvs. (limbă, preferințe de afișare) pentru o experiență mai bună.', + 'cat_analytics' => 'Cookie-uri analitice', + 'cat_analytics_desc' => 'Ne ajută să înțelegem cum utilizați site-ul (pagini vizitate, surse de trafic) pentru a îmbunătăți serviciile. Date anonimizate.', + 'cat_marketing' => 'Cookie-uri de marketing', + 'cat_marketing_desc' => 'Utilizate pentru publicitate relevantă și evaluarea eficienței campaniilor. Pot fi setate de terți (Google Ads etc.).', ], ]; diff --git a/lang/ru/portal.php b/lang/ru/portal.php index 2f0655d..3eca16b 100644 --- a/lang/ru/portal.php +++ b/lang/ru/portal.php @@ -155,12 +155,32 @@ return [ ], 'cookie' => [ - 'policy_title' => 'Политика использования cookie-файлов', - 'back' => 'Назад', - 'banner_title' => 'Мы используем cookie', - 'banner_body' => 'Мы используем cookie-файлы для работы сайта и улучшения вашего опыта. Строго необходимые cookie используются без согласия (Закон № 195/2024).', - 'read_policy' => 'Политика cookie', - 'accept' => 'Принять все', - 'reject' => 'Только необходимые', + 'policy_title' => 'Политика использования cookie-файлов', + 'back' => 'Назад', + 'manage_title' => 'Управление настройками cookie', + + // Баннер (простой вид) + 'banner_title' => 'Мы используем cookie', + 'banner_body' => 'Мы используем cookie-файлы для работы сайта и улучшения вашего опыта. Строго необходимые cookie не требуют согласия (Закон № 195/2024).', + 'read_policy' => 'Политика cookie', + 'accept' => 'Принять все', + 'reject' => 'Отклонить необязательные', + 'customize' => 'Настроить', + + // Модальное окно настроек + 'settings_title' => 'Настройки cookie', + 'settings_body' => 'Выберите, какие категории cookie-файлов вы принимаете. Вы можете изменить настройки в любое время.', + 'save_settings' => 'Сохранить настройки', + 'always_on' => 'Всегда активно', + + // Категории + 'cat_necessary' => 'Строго необходимые cookie', + 'cat_necessary_desc' => 'Необходимы для корректной работы сайта: аутентификация, сессия, безопасность, языковые настройки. Не могут быть отключены.', + 'cat_functional' => 'Функциональные cookie', + 'cat_functional_desc'=> 'Позволяют сайту запоминать ваши предпочтения (язык, настройки отображения) для более удобного использования.', + 'cat_analytics' => 'Аналитические cookie', + 'cat_analytics_desc' => 'Помогают нам понять, как вы используете сайт (посещённые страницы, источники трафика), для улучшения сервиса. Данные анонимизированы.', + 'cat_marketing' => 'Маркетинговые cookie', + 'cat_marketing_desc' => 'Используются для релевантной рекламы и оценки эффективности кампаний. Могут устанавливаться третьими лицами (Google Ads и др.).', ], ]; diff --git a/resources/views/partials/cookie-banner.blade.php b/resources/views/partials/cookie-banner.blade.php index 7cd5024..51bc1b7 100644 --- a/resources/views/partials/cookie-banner.blade.php +++ b/resources/views/partials/cookie-banner.blade.php @@ -1,90 +1,210 @@ -{{-- Cookie consent banner — localStorage-based, shown once per browser --}} +{{-- Full cookie consent — GDPR/Legea 195/2024 compliant --}} @php $bannerEnabled = data_get($tenant->settings ?? [], 'cookie.banner_enabled', true); + $tc = $themeColor ?? '#3B82F6'; @endphp - @if ($bannerEnabled) + +
+ {{-- Backdrop + Modal --}} +
+
+
+ {{-- Simple banner view --}} +

🍪 {{ __('portal.cookie.banner_title') }}

+

+ {{ __('portal.cookie.banner_body') }} + {{ __('portal.cookie.read_policy') }} → +

+
+ + + +
+
+ +
+ {{-- Detailed categories view --}} +

{{ __('portal.cookie.settings_title') }}

+

{{ __('portal.cookie.settings_body') }}

+ + {{-- Necessary --}} +
+
+ + {{ __('portal.cookie.always_on') }} + +
+

{{ __('portal.cookie.cat_necessary_desc') }}

+
+ + {{-- Functional --}} +
+
+ + +
+

{{ __('portal.cookie.cat_functional_desc') }}

+
+ + {{-- Analytics --}} +
+
+ + +
+

{{ __('portal.cookie.cat_analytics_desc') }}

+
+ + {{-- Marketing --}} +
+
+ + +
+

{{ __('portal.cookie.cat_marketing_desc') }}

+
+ +
+ + +
+ + +
+
+
+ + {{-- Floating re-open button (shown after consent given) --}} + +
+ + @endif diff --git a/resources/views/public/cookie-policy.blade.php b/resources/views/public/cookie-policy.blade.php index af94467..97546b9 100644 --- a/resources/views/public/cookie-policy.blade.php +++ b/resources/views/public/cookie-policy.blade.php @@ -13,13 +13,16 @@ header { background: {{ $themeColor }}; color: #fff; padding: 28px 16px; text-align: center; } header img { max-height: 48px; margin-bottom: 10px; display: block; margin-inline: auto; } header h1 { font-size: 20px; font-weight: 700; } - .wrap { max-width: 760px; margin: 0 auto; padding: 24px 16px 64px; } + .wrap { max-width: 760px; margin: 0 auto; padding: 24px 16px 80px; } .card { background: #fff; border-radius: 12px; padding: 28px 24px; margin-top: 16px; box-shadow: 0 1px 3px rgba(0,0,0,.05); } - .card h2 { font-size: 15px; font-weight: 700; margin-bottom: 12px; color: {{ $themeColor }}; letter-spacing: .02em; } - .policy-text { font-size: 14px; white-space: pre-wrap; color: #374151; line-height: 1.7; } + .card-title { font-size: 16px; font-weight: 700; margin-bottom: 14px; color: {{ $themeColor }}; } + .policy-text { font-size: 13.5px; white-space: pre-wrap; color: #374151; line-height: 1.75; } .back-link { display: inline-flex; align-items: center; gap: 6px; color: {{ $themeColor }}; text-decoration: none; font-size: 14px; font-weight: 500; margin-bottom: 8px; } .back-link:hover { opacity: .8; } + .manage-btn { display: inline-flex; align-items: center; gap: 6px; background: {{ $themeColor }}; color: #fff; border: none; padding: 10px 20px; border-radius: 8px; font-size: 14px; font-weight: 600; cursor: pointer; text-decoration: none; } + .manage-btn:hover { opacity: .9; } footer { text-align: center; padding: 24px 16px; color: #9ca3af; font-size: 12px; } + [x-cloak] { display: none !important; } @media (prefers-color-scheme: dark) { body { background: #0f172a; color: #e5e7eb; } .card { background: #1e293b; box-shadow: none; } @@ -27,6 +30,7 @@ footer { color: #64748b; } } +
@@ -37,19 +41,40 @@
- + {{ __('portal.cookie.back') }} -
-

{{ __('portal.cookie.policy_title') }}

+
+

{{ __('portal.cookie.policy_title') }}

{{ $policyText }}

+
+
+

{{ __('portal.cookie.manage_title') }}

+

{{ __('portal.cookie.settings_body') }}

+
+ +
+
{{ __('portal.common.powered_by') }}
+ +@php $themeColor = $themeColor ?? '#3B82F6'; @endphp +@include('partials.cookie-banner') + + diff --git a/resources/views/tracking/show.blade.php b/resources/views/tracking/show.blade.php index ae7d185..e439d5c 100644 --- a/resources/views/tracking/show.blade.php +++ b/resources/views/tracking/show.blade.php @@ -231,7 +231,6 @@
-@php $themeColor = $tenant->settings['theme_color'] ?? '#3B82F6'; @endphp @include('partials.cookie-banner')