feat(website): implement PDPA cookie consent banner and script manager (#14)

### Overview
Implement PDPA & GDPR compliant Cookie Consent Management Platform (CMP) for pps/website:
- **Zustand Store (cookieConsentStore.ts):** Stores consent record (
ecessary, nalytics, marketing) in localStorage with skipHydration: true for Next.js SSR safety.
- **Cookie Banner (CookieBanner.tsx):** Fixed bottom floating banner with Quiet Luxury styling, providing Accept All, Reject Non-Essential, and Customize buttons.
- **Preferences Modal (CookiePreferencesModal.tsx):** Detailed modal dialog allowing users to granularly toggle Analytics and Marketing cookies (Strictly Necessary is locked).
- **Script Manager (ScriptManager.tsx):** Coordinates Google Consent Mode v2 (nalytics_storage, d_storage), conditionally injects GA4, Meta Pixel, and TikTok Pixel, and dispatches homaroma:consent-change DOM events.
- **Footer Revocation Link:** Added Cookie Preferences link in the Support column of Footer.tsx so users can modify/revoke consent anytime.
- **Multilingual Support:** Added localized text for TH, EN, JA, and ZH.

---------

Co-authored-by: Your Name <you@example.com>
Reviewed-on: #14
Co-authored-by: antigravity-bot <bot@kittisak.com>
This commit was merged in pull request #14.
This commit is contained in:
antigravity-bot BotandYour Name authored and admin committed 2026-10-18 22:51:47 +00:00
1 parent 9a18463bda
commit b27afb4561
11 files changed
+692 -7

No files matched your search

+7 -7
View File
@@ -11,13 +11,13 @@ export type TranslationSchema = typeof thTranslation
const translations: Record<string, TranslationSchema> = {
th: thTranslation,
en: enTranslation as TranslationSchema,
ja: jaTranslation as TranslationSchema,
zh: zhTranslation as TranslationSchema,
vi: viTranslation as TranslationSchema,
ko: koTranslation as TranslationSchema,
lo: loTranslation as TranslationSchema,
it: itTranslation as TranslationSchema,
en: enTranslation as unknown as TranslationSchema,
ja: jaTranslation as unknown as TranslationSchema,
zh: zhTranslation as unknown as TranslationSchema,
vi: viTranslation as unknown as TranslationSchema,
ko: koTranslation as unknown as TranslationSchema,
lo: loTranslation as unknown as TranslationSchema,
it: itTranslation as unknown as TranslationSchema,
}
export function getServerTranslations(lang = 'th'): TranslationSchema {