# @pdntechnology/cookie-consent [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![npm version](https://img.shields.io/npm/v/@pdntechnology/cookie-consent.svg)](https://www.npmjs.com/package/@pdntechnology/cookie-consent) React ve Next.js için hafif, açık kaynak bir **Çerez Yönetim Platformu (CMP)**. [Google Consent Mode v2](https://developers.google.com/tag-platform/security/guides/consent) akışını sertifikalı araçlarla aynı şekilde uygular. Ağır bağımlılık yok. Vendor lock-in yok. Google Tag Manager, GA4, Google Ads ve Meta Pixel ile uyumludur. > English documentation: [README.md](README.md) --- ## Neden var? Google sertifikalı CMP'ler (Cookiebot, OneTrust, CookieYes, …) aynı teknik akışı izler: 1. Google etiketlerinden **önce** varsayılanları **reddedilmiş** olarak ayarla 2. GTM / gtag.js yükle 3. Çerez banner'ını göster 4. Kullanıcı seçimi → `gtag('consent', 'update', …)` + dataLayer olayı 5. Reklamlar reddedildiğinde → `ads_data_redaction` ve `url_passthrough` etkinleştir Bu kütüphane bu akışı okunabilir, yaklaşık 15 KB JavaScript ile uygular. > **Not:** Sertifikalı CMP'ler ayrıca IAB TCF v2.2 sinyalleri sağlar ve Google'ın sertifikalı satıcı listesinde yer alır. Bu kütüphane **Consent Mode v2 teknik entegrasyonunu** kapsar. Gizlilik politikası metni ve yasal uyumluluk sizin sorumluluğunuzdadır. --- ## Özellikler - Google Consent Mode v2 (7 sinyalin tamamı) - Granüler kategoriler: Zorunlu / Analitik / Pazarlama - Özelleştirilebilir banner metni, tema renkleri ve çerez envanteri - Bootstrap ve güncellemede `ads_data_redaction` + `url_passthrough` - Bölgesel varsayılan onay (EEA vb.) - React banner + Next.js bootstrap bileşeni - İsteğe bağlı GTM ve Meta Pixel yükleyicileri (onay kapılı) - Framework'ten bağımsız çekirdek API (vanilla JS desteklenir) - Çekirdek API ve React bileşenleri için TypeScript tanımları - Onay kaydedilemediğinde hata callback'leri --- ## Kurulum ```bash npm install @pdntechnology/cookie-consent ``` ### Next.js ayarı `next.config.mjs` dosyasına ekleyin: ```js const nextConfig = { transpilePackages: ["@pdntechnology/cookie-consent"], }; ``` --- ## Hızlı başlangıç ### 1. Yapılandırma (isteğe bağlı) ```js // lib/consent-config.js import { configureConsent } from "@pdntechnology/cookie-consent"; configureConsent({ storageKey: "site_cerez_tercihi", waitForUpdateMs: 500, adsDataRedaction: true, urlPassthrough: true, debug: false, }); ``` Bu dosyayı root layout'ta `ConsentBootstrap`'ten **önce** import edin. ### 2. Consent varsayılanlarını bootstrap et (GTM'den önce) ```jsx // app/layout.jsx import "@pdntechnology/cookie-consent/styles.css"; import "@/lib/consent-config"; import { ConsentBootstrap } from "@pdntechnology/cookie-consent/react"; export default function RootLayout({ children }) { return ( {children} ); } ``` ### 3. Banner + etiketler ```jsx // app/providers.jsx import Link from "next/link"; import { CookieConsent, GoogleTagManager, } from "@pdntechnology/cookie-consent/react"; export function Providers({ children }) { return ( <> {children} ); } ``` ### 4. Tercihleri yeniden aç (footer linki) ```jsx import { openPreferences } from "@pdntechnology/cookie-consent"; ``` --- ## Özelleştirme ### Metin ve politika URL'si Görünen tüm metinler `labels` prop'u ile değiştirilebilir. Politika linki `policyHref` ile ayarlanır. | Label anahtarı | Varsayılan (EN) | |----------------|-----------------| | `title` | Cookie preferences | | `message` | We use cookies to improve your experience… | | `policyLink` | Privacy policy | | `accept` | Accept all | | `reject` | Reject all | | `manage` | Manage preferences | | `save` | Save preferences | | `necessaryTitle` | Necessary | | `necessaryDescription` | Required for core site functionality… | | `analyticsTitle` | Analytics | | `analyticsDescription` | Helps us understand how visitors use the site… | | `marketingTitle` | Marketing | | `marketingDescription` | Used for ads and remarketing… | | `alwaysOn` | Always on | | `cookiesHeading` | View cookies | | `cookieName` | Name | | `cookiePurpose` | Purpose | | `cookieDuration` | Duration | | `cookieProvider` | Provider | | `storageError` | Your preferences could not be saved… | ### Tema renkleri `theme` prop'u ile CSS değişkenlerini override edin: ```jsx ``` Desteklenen anahtarlar: `background`, `text`, `textMuted`, `link`, `primary`, `primaryText`, `secondaryBackground`, `border`, `accent`. ### Çerez envanteri tablosu Hangi çerezlerin kullanıldığını tercihler panelinde göstermek için `cookies` dizisi verin: ```jsx ``` `cookies` verilmezse banner mevcut üç kategori görünümünü korur. ### Hata yönetimi ```js const result = acceptAll(); if (!result.ok) { console.error(result.reason); // "invalid" | "storage" } ``` React'te callback kullanın: ```jsx console.log("kaydedildi", consent)} onConsentError={({ reason }) => console.warn("hata", reason)} /> ``` `configureConsent({ debug: true })` ile konsola uyarı yazılır. Global işlem için `onStorageError` kullanılabilir. --- ## Örnek uygulama [`examples/next-app`](examples/next-app) dizininde Türkçe metinler, özel tema ve çerez envanteri içeren çalışan bir Next.js demosu vardır. ```bash cd examples/next-app npm install npm run dev ``` --- ## Kategoriler → Google sinyalleri | Banner kategorisi | Kullanıcı seçimi | Google Consent Mode sinyalleri | |-------------------|------------------|--------------------------------| | **Zorunlu** | Her zaman açık | `security_storage: granted` | | **Analitik** | Opt-in | `analytics_storage` | | **Pazarlama** | Opt-in | `ad_storage`, `ad_user_data`, `ad_personalization`, `functionality_storage`, `personalization_storage` | Pazarlama **reddedildiğinde** kütüphane ayrıca şunları ayarlar: - `ads_data_redaction: true` - `url_passthrough: true` --- ## API referansı ### Yapılandırma | Fonksiyon | Açıklama | |-----------|----------| | `configureConsent(config)` | Depolama anahtarı, bekleme süresi, bölgesel varsayılanlar | | `getConsentConfig()` | Aktif yapılandırmayı oku | ### Kullanıcı onayı | Fonksiyon | Açıklama | |-----------|----------| | `getConsent()` | Kayıtlı tercihleri oku | | `setConsent({ analytics, marketing })` | Özel seçim kaydet; `{ ok, consent \| reason }` döner | | `acceptAll()` | Tüm kategorilere izin ver | | `rejectAll()` | Opsiyonel kategorileri reddet | | `hasAnalyticsConsent()` | Analitik onayını kontrol et | | `hasMarketingConsent()` | Pazarlama onayını kontrol et | | `openPreferences()` | Tercih panelini yeniden aç | | `syncConsentFromStorage()` | GTM yüklendikten sonra kayıtlı onayı uygula | ### `CookieConsent` prop'ları | Prop | Tip | Açıklama | |------|-----|----------| | `labels` | `object` | Banner metinlerini override et | | `theme` | `object` | Banner renklerini override et | | `cookies` | `CookieEntry[]` | Opsiyonel çerez envanteri tablosu | | `policyHref` | `string` | Gizlilik / çerez politikası URL'si | | `LinkComponent` | `component` | Özel link bileşeni (varsayılan: Next.js `Link`) | | `className` | `string` | Banner kök elemanına ek CSS sınıfı | | `onConsentSaved` | `(consent) => void` | Başarılı kayıttan sonra çağrılır | | `onConsentError` | `({ reason }) => void` | Kayıt başarısız olursa çağrılır | --- ## Sorun giderme | Sorun | Olası neden | Çözüm | |-------|-------------|-------| | Banner hiç görünmüyor | Onay zaten kayıtlı | `localStorage` anahtarını temizleyin veya `openPreferences()` çağırın | | GTM onaydan önce tetikleniyor | Bootstrap eksik veya geç yükleniyor | GTM'den önce `` ekleyin | | Onay kaydedilmiyor | Depolama engelli (gizli mod, Safari ITP) | `onConsentError` ile yakalayın; banner inline hata gösterir | | Reddetmeden sonra etiketler çalışıyor | GTM etiketleri Consent Mode kullanmıyor | GTM'de Consent Mode'u etkinleştirin | | `./react` TypeScript hatası | Eski sürüm | v1.1+ ile `@pdntechnology/cookie-consent/react` tipleri dahildir | --- ## Katkıda bulunma Bkz. [CONTRIBUTING.md](CONTRIBUTING.md). --- ## Lisans [MIT](LICENSE) © [PDN Technology](https://pdntechnology.com)